LyoKICoKICogQ29weXJpZ2h0IChDKSAyMDAwICBSb2JlcnQgT2xzc29uLgogKiBTd2VkaXNoIFVuaXZlcnNpdHkgb2YgQWdyaWN1bHR1cmFsIFNjaWVuY2VzCiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KICoKICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKICogbGF0ZXIgdmVyc2lvbi4KICoKICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKICogMDIxMTEtMTMwNywgVVNBLiAgCiAqLwoKLyogCiAqIFRoaXMgd29yayBpbmNsdWRlcyB3b3JrIHdpdGggdGhlIGZvbGxvd2luZyBjb3B5d3JpdGU6CiAqCiAqIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCBLdW5paGlybyBJc2hpZ3VybwogKgogKi8KCi8qIAogKiBUaGFua3MgdG8gSmVucyBM5eVzIGF0IFN3ZWRpc2ggVW5pdmVyc2l0eSBvZiBBZ3JpY3VsdHVyYWwgU2NpZW5jZXMKICogZm9yIHJldmlld2luZyBhbmQgdGVzdHMuCiAqLwoKCiNpbmNsdWRlIDx6ZWJyYS5oPgoKCiNpZmRlZiBIQVZFX0lSRFAKCiNpbmNsdWRlICJpZi5oIgojaW5jbHVkZSAidnR5LmgiCiNpbmNsdWRlICJzb2NrdW5pb24uaCIKI2luY2x1ZGUgInByZWZpeC5oIgojaW5jbHVkZSAiY29tbWFuZC5oIgojaW5jbHVkZSAibWVtb3J5LmgiCiNpbmNsdWRlICJzdHJlYW0uaCIKI2luY2x1ZGUgImlvY3RsLmgiCiNpbmNsdWRlICJjb25uZWN0ZWQuaCIKI2luY2x1ZGUgImxvZy5oIgojaW5jbHVkZSAiemNsaWVudC5oIgojaW5jbHVkZSAidGhyZWFkLmgiCiNpbmNsdWRlICJ6ZWJyYS9pbnRlcmZhY2UuaCIKI2luY2x1ZGUgInplYnJhL3J0YWR2LmgiCiNpbmNsdWRlICJ6ZWJyYS9yaWIuaCIKI2luY2x1ZGUgInplYnJhL3pzZXJ2LmgiCiNpbmNsdWRlICJ6ZWJyYS9yZWRpc3RyaWJ1dGUuaCIKI2luY2x1ZGUgInplYnJhL2lyZHAuaCIKI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPgojaW5jbHVkZSAiaWYuaCIKI2luY2x1ZGUgInNvY2t1bmlvbi5oIgojaW5jbHVkZSAibG9nLmgiCiNpbmNsdWRlICJzb2Nrb3B0LmgiCgoKLyogR0xPQkFMIFZBUlMgKi8KCmludCBpcmRwX3NvY2s7CmNoYXIgYjFbMTZdLCBiMlsxNl0sIGIzWzE2XSwgYjRbMTZdOyAgLyogRm9yIGluZXRfMmEgKi8KCmV4dGVybiBzdHJ1Y3QgemVicmFfdCB6ZWJyYWQ7CmV4dGVybiBzdHJ1Y3QgdGhyZWFkICp0X2lyZHBfcmF3OwpleHRlcm4gc3RydWN0IGludGVyZmFjZSAqZ2V0X2lmbGlzdF9pZnAoaW50IGlkeCk7CmludCBpbl9ja3N1bSAodm9pZCAqcHRyLCBpbnQgbmJ5dGVzKTsKdm9pZCBwcm9jZXNzX3NvbGljaXQgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCk7Cgp2b2lkIHBhcnNlX2lyZHBfcGFja2V0KGNoYXIgKnAsIAoJCSAgaW50IGxlbiwgCgkJICBzdHJ1Y3QgaW50ZXJmYWNlICppZnApCnsKICBzdHJ1Y3QgaXAgKmlwID0gKHN0cnVjdCBpcCAqKXAgOwogIHN0cnVjdCBpY21waGRyICppY21wOwogIHN0cnVjdCBpbl9hZGRyIHNyYzsKICBpbnQgaXBfaGxlbiwgaXBfbGVuOwogIHN0cnVjdCB6ZWJyYV9pZiAqemk7CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOwoKICB6aSA9IGlmcC0+aW5mbzsKICBpZighemkpIHJldHVybjsKCiAgaXJkcCA9ICZ6aS0+aXJkcDsKICBpZighaXJkcCkgcmV0dXJuOwoKICBpcF9obGVuID0gaXAtPmlwX2hsKjQ7IAogIGlwX2xlbiA9IG50b2hzKGlwLT5pcF9sZW4pOwogIGxlbiA9IGxlbiAtIGlwX2hsZW47CiAgc3JjID0gaXAtPmlwX3NyYzsKCiAgaWYoaXBfbGVuIDwgSUNNUF9NSU5MRU4pIHsKICAgIHpsb2dfZXJyICgiSVJEUDogUlggSUNNUCBwYWNrZXQgdG9vIHNob3J0IGZyb20gJXNcbiIsCgkgICAgICBpbmV0X250b2EgKHNyYykpOwogICAgcmV0dXJuOwogIH0KCiAgLyogQ2hlY2sgc28gd2UgZG9uJ3QgY2hlY2tzdW0gcGFja2V0cyBsb25nZXIgdGhhbiBvdXJlIFJYX0JVRiAtIChldGhsZW4gKwogICBsZW4gb2YgSVAtaGVhZGVyKSAxNCsyMCAqLwoKICBpZihpcF9sZW4gPiBJUkRQX1JYX0JVRi0zNCkgewogICAgemxvZ19lcnIgKCJJUkRQOiBSWCBJQ01QIHBhY2tldCB0b28gbG9uZyBmcm9tICVzXG4iLAoJICAgICAgaW5ldF9udG9hIChzcmMpKTsKICAgIHJldHVybjsKICB9CgoKICBpZiAoaW5fY2tzdW0gKGlwLCBpcF9sZW4pKSB7CiAgICB6bG9nX3dhcm4gKCJJUkRQOiBSWCBJQ01QIHBhY2tldCBmcm9tICVzLiBCYWQgY2hlY2tzdW0sIHNpbGVudGx5IGlnbm9yZWQiLAoJICAgICAgIGluZXRfbnRvYSAoc3JjKSk7CiAgICByZXR1cm47CiAgfQoKICBpY21wID0gKHN0cnVjdCBpY21waGRyICopIChwK2lwX2hsZW4pOwoKCiAgLyogSGFuZGxlIGp1c3Qgb25seSBJUkRQICovCgogIGlmKCBpY21wLT50eXBlID09IElDTVBfUk9VVEVSQURWRVJUKTsKICBlbHNlIGlmKCBpY21wLT50eXBlID09IElDTVBfUk9VVEVSU09MSUNJVCk7CiAgZWxzZSByZXR1cm47CgogCiAgaWYgKGljbXAtPmNvZGUgIT0gMCkgewogICAgemxvZ193YXJuICgiSVJEUDogUlggcGFja2V0IHR5cGUgJWQgZnJvbSAlcy4gQmFkIElDTVAgdHlwZSBjb2RlLCBzaWxlbnRseSBpZ25vcmVkIiwKCSAgICAgICBpY21wLT50eXBlLAoJICAgICAgIGluZXRfbnRvYSAoc3JjKSk7CiAgICByZXR1cm47CiAgfQoKICBpZihpcC0+aXBfZHN0LnNfYWRkciA9PSBJTkFERFJfQlJPQURDQVNUICYmIAogICAgIGlyZHAtPmZsYWdzICYgSUZfQlJPQURDQVNUKTsKCiAgZWxzZSBpZiAoIG50b2hsKGlwLT5pcF9kc3Quc19hZGRyKSA9PSBJTkFERFJfQUxMUlRSU19HUk9VUCAmJiAKCSAgICAhIChpcmRwLT5mbGFncyAmICBJRl9CUk9BRENBU1QpKTsKCiAgZWxzZSB7IC8qIEVSUk9SICovCgogICAgemxvZ193YXJuICgiSVJEUDogUlggaWxsZWdhbCBmcm9tICVzIHRvICVzIHdoaWxlICVzIG9wZXJhdGVzIGluICVzXG4iLAoJICAgICAgIGluZXRfbnRvYSAoc3JjKSwgCgkgICAgICAgbnRvaGwoaXAtPmlwX2RzdC5zX2FkZHIpID09IElOQUREUl9BTExSVFJTX0dST1VQPyAKCSAgICAgICAibXVsdGljYXN0IiA6IGluZXRfbnRvYShpcC0+aXBfZHN0KSwKCSAgICAgICBpZnAtPm5hbWUsCgkgICAgICAgaXJkcC0+ZmxhZ3MgJiAgSUZfQlJPQURDQVNUPyAKCSAgICAgICAiYnJvYWRjYXN0IiA6ICJtdWx0aWNhc3QiKTsKCiAgICB6bG9nX3dhcm4gKCJJUkRQOiBQbGVhc2UgY29ycmVjdCBzZXR0aW5nc1xuIik7CiAgICByZXR1cm47CiAgfQoKICBzd2l0Y2ggKGljbXAtPnR5cGUpIAogICAgewogICAgY2FzZSBJQ01QX1JPVVRFUkFEVkVSVDoKICAgICAgYnJlYWs7CgogICAgY2FzZSBJQ01QX1JPVVRFUlNPTElDSVQ6CgogICAgICBpZihpcmRwLT5mbGFncyAmIElGX0RFQlVHX01FU1NBR0VTKSAKCXpsb2dfd2FybiAoIklSRFA6IFJYIFNvbGljaXQgb24gJXMgZnJvbSAlc1xuIiwKCQkgICBpZnAtPm5hbWUsCgkJICAgaW5ldF9udG9hIChzcmMpKTsKCiAgICAgIHByb2Nlc3Nfc29saWNpdChpZnApOwogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICB6bG9nX3dhcm4gKCJJUkRQOiBSWCB0eXBlICVkIGZyb20gJXMuIEJhZCBJQ01QIHR5cGUsIHNpbGVudGx5IGlnbm9yZWQiLAoJCSBpY21wLT50eXBlLAoJCSBpbmV0X250b2EgKHNyYykpOwogICAgfQp9CgwKaW50IGlyZHBfcmVjdm1zZyAoaW50IHNvY2ssIAoJICAgICAgdV9jaGFyICpidWYsIAoJICAgICAgaW50IHNpemUsIAoJICAgICAgaW50ICppZmluZGV4KQp7CiAgc3RydWN0IG1zZ2hkciBtc2c7CiAgc3RydWN0IGlvdmVjIGlvdjsKICBzdHJ1Y3QgY21zZ2hkciAqcHRyOwogIGNoYXIgYWRhdGFbQ01TR19TUEFDRSggU09QVF9TSVpFX0NNU0dfUEtUSU5GT19JUFY0KCkgKV07CiAgaW50IHJldDsKCiAgbXNnLm1zZ19uYW1lID0gKHZvaWQgKikwOwogIG1zZy5tc2dfbmFtZWxlbiA9IDA7CiAgbXNnLm1zZ19pb3YgPSAmaW92OwogIG1zZy5tc2dfaW92bGVuID0gMTsKICBtc2cubXNnX2NvbnRyb2wgPSAodm9pZCAqKSBhZGF0YTsKICBtc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YgYWRhdGE7CgogIGlvdi5pb3ZfYmFzZSA9IGJ1ZjsKICBpb3YuaW92X2xlbiA9IHNpemU7CgogIHJldCA9IHJlY3Ztc2cgKHNvY2ssICZtc2csIDApOwogIGlmIChyZXQgPCAwKSB7CiAgICB6bG9nX3dhcm4oIklSRFA6IHJlY3Ztc2c6IHJlYWQgZXJyb3IgJXMiLCBzdHJlcnJvcihlcnJubykpOwogICAgcmV0dXJuIHJldDsKICB9CgogIGlmIChtc2cubXNnX2ZsYWdzICYgTVNHX1RSVU5DKSB7CiAgICB6bG9nX3dhcm4oIklSRFA6IHJlY3Ztc2c6IHRydW5jYXRlZCBtZXNzYWdlIik7CiAgICByZXR1cm4gcmV0OwogIH0KICBpZiAobXNnLm1zZ19mbGFncyAmIE1TR19DVFJVTkMpIHsKICAgIHpsb2dfd2FybigiSVJEUDogcmVjdm1zZzogdHJ1bmNhdGVkIGNvbnRyb2wgbWVzc2FnZSIpOwogICAgcmV0dXJuIHJldDsKICB9CgogIGlmaW5kZXggPSBnZXRzb2Nrb3B0X2lmaW5kZXggKEFGX0lORVQsICZtc2cpOwoKICByZXR1cm4gcmV0Owp9CgwKaW50IGlyZHBfcmVhZF9yYXcoc3RydWN0IHRocmVhZCAqcikKewogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKICBjaGFyIGJ1ZltJUkRQX1JYX0JVRl07CiAgaW50IHJldCwgaWZpbmRleDsKICAKICBpbnQgaXJkcF9zb2NrID0gVEhSRUFEX0ZEIChyKTsKICB0X2lyZHBfcmF3ID0gdGhyZWFkX2FkZF9yZWFkICh6ZWJyYWQubWFzdGVyLCBpcmRwX3JlYWRfcmF3LCBOVUxMLCBpcmRwX3NvY2spOwogIAogIHJldCA9IGlyZHBfcmVjdm1zZyAoaXJkcF9zb2NrLCBidWYsIElSRFBfUlhfQlVGLCAgJmlmaW5kZXgpOwogCiAgaWYgKHJldCA8IDApIHpsb2dfd2FybiAoIklSRFA6IFJYIEVycm9yIGxlbmd0aCA9ICVkIiwgcmV0KTsKCiAgaWZwID0gZ2V0X2lmbGlzdF9pZnAoaWZpbmRleCk7CiAgaWYoISBpZnAgKSByZXR1cm4gcmV0OwoKICB6aT0gaWZwLT5pbmZvOwogIGlmKCEgemkgKSByZXR1cm4gcmV0OwoKICBpcmRwID0gJnppLT5pcmRwOwogIGlmKCEgaXJkcCApIHJldHVybiByZXQ7CgogIGlmKCEgKGlyZHAtPmZsYWdzICYgSUZfQUNUSVZFKSkgewoKICAgIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfTUlTQykgCiAgICAgIHpsb2dfd2FybigiSVJEUDogUlggSUNNUCBmb3IgZGlzYWJsZWQgaW50ZXJmYWNlICVzXG4iLAoJCWlmcC0+bmFtZSk7CiAgICByZXR1cm4gMDsKICB9CgogIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfUEFDS0VUKSB7CiAgICBpbnQgaTsKICAgIHpsb2dfd2FybigiSVJEUDogUlggKGlkeCAlZCkgIiwgaWZpbmRleCk7CiAgICBmb3IoaT0wOyBpIDwgcmV0OyBpKyspIHpsb2dfd2FybiggIklSRFA6IFJYICV4ICIsIGJ1ZltpXSYweEZGKTsKICB9CgogIHBhcnNlX2lyZHBfcGFja2V0KGJ1ZiwgcmV0LCBpZnApOwogIHJldHVybiByZXQ7Cn0KDAp2b2lkIHNlbmRfcGFja2V0KHN0cnVjdCBpbnRlcmZhY2UgKmlmcCwgCgkgICAgc3RydWN0IHN0cmVhbSAqcywKCSAgICB1X2ludDMyX3QgZHN0LAoJICAgIHN0cnVjdCBwcmVmaXggKnAsCgkgICAgdV9pbnQzMl90IHR0bCkKewogIHN0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja2RzdCA9IHtBRl9JTkVUfTsKICBzdHJ1Y3QgaXAgKmlwOwogIHN0cnVjdCBpY21waGRyICppY21wOwogIHN0cnVjdCBtc2doZHIgKm1zZzsKICBzdHJ1Y3QgY21zZ2hkciAqY21zZzsKICBzdHJ1Y3QgaW92ZWMgaW92ZWN0b3I7CiAgY2hhciBtc2didWZbMjU2XTsKICBjaGFyIGJ1ZlsyNTZdOwogIHN0cnVjdCBpbl9wa3RpbmZvICpwa3RpbmZvOwogIHVfbG9uZyBzcmM7CiAgaW50IG9uOwogCiAgaWYgKCEgKGlmcC0+ZmxhZ3MgJiBJRkZfVVApKSByZXR1cm47CgogIGlmKCFwKSBzcmMgPSBudG9obChwLT51LnByZWZpeDQuc19hZGRyKTsKICBlbHNlIHNyYyA9IDA7IC8qIElzIGZpbGxlZCBpbiAqLwogIAogIGlwID0gKHN0cnVjdCBpcCAqKSBidWY7CiAgaXAtPmlwX2hsID0gc2l6ZW9mKHN0cnVjdCBpcCkgPj4gMjsKICBpcC0+aXBfdiA9IElQVkVSU0lPTjsKICBpcC0+aXBfdG9zID0gMHhDMDsKICBpcC0+aXBfb2ZmID0gMEw7CiAgaXAtPmlwX3AgPSAxOyAgICAgICAvKiBJUF9JQ01QICovCiAgaXAtPmlwX3R0bCA9IHR0bDsKICBpcC0+aXBfc3JjLnNfYWRkciA9IHNyYzsKICBpcC0+aXBfZHN0LnNfYWRkciA9IGRzdDsKICBpY21wID0gKHN0cnVjdCBpY21waGRyICopIChidWYgKyAyMCk7CgogIC8qIE1lcmdlIElQIGhlYWRlciB3aXRoIGljbXAgcGFja2V0ICovCgogIHN0cmVhbV9nZXQoaWNtcCwgcywgcy0+cHV0cCk7CgogIC8qIGljbXAtPmNoZWNrc3VtIGlzIGFscmVhZHkgY2FsY3VsYXRlZCAqLwogIGlwLT5pcF9sZW4gID0gc2l6ZW9mKHN0cnVjdCBpcCkgKyBzLT5wdXRwOwogIHN0cmVhbV9mcmVlKHMpOyAKCiAgb24gPSAxOwogIGlmIChzZXRzb2Nrb3B0KGlyZHBfc29jaywgSVBQUk9UT19JUCwgSVBfSERSSU5DTCwKCQkgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKSA8IDApCiAgICB6bG9nX3dhcm4oInNlbmR0byAlcyIsIHN0cmVycm9yIChlcnJubykpOwoKCiAgaWYoZHN0ID09IElOQUREUl9CUk9BRENBU1QgKSB7CiAgICBvbiA9IDE7CiAgICBpZiAoc2V0c29ja29wdChpcmRwX3NvY2ssIFNPTF9TT0NLRVQsIFNPX0JST0FEQ0FTVCwKCQkgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpIDwgMCkKICAgICAgemxvZ193YXJuKCJzZW5kdG8gJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKICB9CgogIGlmKGRzdCAhPSAgSU5BRERSX0JST0FEQ0FTVCkgewogICAgICBvbiA9IDA7IAogICAgICBpZiggc2V0c29ja29wdChpcmRwX3NvY2ssSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX0xPT1AsIAoJCSAgICAgKGNoYXIgKikmb24sc2l6ZW9mKG9uKSkgPCAwKQoJemxvZ193YXJuKCJzZW5kdG8gJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKICB9CgogIGJ6ZXJvKCZzb2NrZHN0LHNpemVvZihzb2NrZHN0KSk7CiAgc29ja2RzdC5zaW5fZmFtaWx5PUFGX0lORVQ7CiAgc29ja2RzdC5zaW5fYWRkci5zX2FkZHIgPSBkc3Q7CgogIGNtc2cgPSAoc3RydWN0IGNtc2doZHIgKikgKG1zZ2J1ZiArIHNpemVvZihzdHJ1Y3QgbXNnaGRyKSk7CiAgY21zZy0+Y21zZ19sZW4gPSBzaXplb2Yoc3RydWN0IGNtc2doZHIpICsgc2l6ZW9mKHN0cnVjdCBpbl9wa3RpbmZvKTsKICBjbXNnLT5jbXNnX2xldmVsID0gU09MX0lQOwogIGNtc2ctPmNtc2dfdHlwZSA9IElQX1BLVElORk87CiAgcGt0aW5mbyA9IChzdHJ1Y3QgaW5fcGt0aW5mbyAqKSBDTVNHX0RBVEEoY21zZyk7CiAgcGt0aW5mby0+aXBpX2lmaW5kZXggPSBpZnAtPmlmaW5kZXg7CiAgcGt0aW5mby0+aXBpX3NwZWNfZHN0LnNfYWRkciA9IHNyYzsKICBwa3RpbmZvLT5pcGlfYWRkci5zX2FkZHIgPSBzcmM7CiAKICBpb3ZlY3Rvci5pb3ZfYmFzZSA9ICh2b2lkICopIGJ1ZjsKICBpb3ZlY3Rvci5pb3ZfbGVuID0gaXAtPmlwX2xlbjsgCiAgbXNnID0gKHN0cnVjdCBtc2doZHIgKikgbXNnYnVmOwogIG1zZy0+bXNnX25hbWUgPSAmc29ja2RzdDsKICBtc2ctPm1zZ19uYW1lbGVuID0gc2l6ZW9mKHNvY2tkc3QpOwogIG1zZy0+bXNnX2lvdiA9ICZpb3ZlY3RvcjsKICBtc2ctPm1zZ19pb3ZsZW4gPSAxOwogIG1zZy0+bXNnX2NvbnRyb2wgPSBjbXNnOwogIG1zZy0+bXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKIAogIGlmIChzZW5kbXNnKGlyZHBfc29jaywgbXNnLCAwKSA8IDApIHsKICAgIHpsb2dfd2Fybigic2VuZHRvICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7CiAgfQogIC8qICAgcHJpbnRmKCJUWCBvbiAlcyBpZHggJWRcbiIsIGlmcC0+bmFtZSwgaWZwLT5pZmluZGV4KTsgKi8KfQoKCiNlbmRpZiAvKiBIQVZFX0lSRFAgKi8KCgoK