I2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bWVkaWEvc2FhNzE0Nl92di5oPgoKc3RhdGljIHZvaWQgY2FsY3VsYXRlX291dHB1dF9mb3JtYXRfcmVnaXN0ZXIoc3RydWN0IHNhYTcxNDZfZGV2KiBzYWEsIHUzMiBwYWxldHRlLCB1MzIqIGNsaXBfZm9ybWF0KQp7CgkvKiBjbGVhciBvdXQgdGhlIG5lY2Vzc2FyeSBiaXRzICovCgkqY2xpcF9mb3JtYXQgJj0gMHgwMDAwZmZmZjsKCS8qIHNldCB0aGVzZSBiaXRzIG5ldyAqLwoJKmNsaXBfZm9ybWF0IHw9ICAoKCAoKHBhbGV0dGUmMHhmMDApPj44KSA8PCAzMCkgfCAoKHBhbGV0dGUmMHgwMGYpIDw8IDI0KSB8ICgoKHBhbGV0dGUmMHgwZjApPj40KSA8PCAxNikpOwp9CgpzdGF0aWMgdm9pZCBjYWxjdWxhdGVfaHBzX3NvdXJjZV9hbmRfc3luYyhzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgaW50IHNvdXJjZSwgaW50IHN5bmMsIHUzMiogaHBzX2N0cmwpCnsKCSpocHNfY3RybCAmPSB+KE1BU0tfMzAgfCBNQVNLXzMxIHwgTUFTS18yOCk7CgkqaHBzX2N0cmwgfD0gKHNvdXJjZSA8PCAzMCkgfCAoc3luYyA8PCAyOCk7Cn0KCnN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9oeG9fYW5kX2h5byhzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYsIHUzMiogaHBzX2hfc2NhbGUsIHUzMiogaHBzX2N0cmwpCnsKCWludCBoeW8gPSAwLCBoeG8gPSAwOwoKCWh5byA9IHZ2LT5zdGFuZGFyZC0+dl9vZmZzZXQ7CgloeG8gPSB2di0+c3RhbmRhcmQtPmhfb2Zmc2V0OwoKCSpocHNfaF9zY2FsZQkmPSB+KE1BU0tfQjAgfCAweGYwMCk7CgkqaHBzX2hfc2NhbGUJfD0gKGh4byA8PCAgMCk7CgoJKmhwc19jdHJsCSY9IH4oTUFTS19XMCB8IE1BU0tfQjIpOwoJKmhwc19jdHJsCXw9IChoeW8gPDwgMTIpOwp9CgovKiBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGhvcml6b250YWwtIGFuZCB2ZXJ0aWNhbAogICBzY2FsaW5nIHJlZ2lzdGVycywgY2xpcC1mb3JtYXQtcmVnaXN0ZXIgZXRjIC4uLgogICB0aGVzZSBmdW5jdGlvbnMgdGFrZSBwb2ludGVycyB0byB0aGUgKG1vc3QtbGlrZWx5IHJlYWQtb3V0CiAgIG9yaWdpbmFsLXZhbHVlcykgYW5kIG1hbmlwdWxhdGUgdGhlbSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZAogICBjaGFuZ2VzLgoqLwoKLyogaHBzX2NvZWZmIHVzZWQgZm9yIENYWSBhbmQgQ1hVVjsgc2NhbGUgMS8xIC0+IHNjYWxlIDEvNjQgKi8Kc3RhdGljIHN0cnVjdCB7Cgl1MTYgaHBzX2NvZWZmOwoJdTE2IHdlaWdodF9zdW07Cn0gaHBzX2hfY29lZmZfdGFiIFtdID0gewoJezB4MDAsICAgMn0sIHsweDAyLCAgIDR9LCB7MHgwMCwgICA0fSwgezB4MDYsICAgOH0sIHsweDAyLCAgIDh9LAoJezB4MDgsICAgOH0sIHsweDAwLCAgIDh9LCB7MHgxRSwgIDE2fSwgezB4MEUsICAgOH0sIHsweDI2LCAgIDh9LAoJezB4MDYsICAgOH0sIHsweDQyLCAgIDh9LCB7MHgwMiwgICA4fSwgezB4ODAsICAgOH0sIHsweDAwLCAgIDh9LAoJezB4RkUsICAxNn0sIHsweEZFLCAgIDh9LCB7MHg3RSwgICA4fSwgezB4N0UsICAgOH0sIHsweDNFLCAgIDh9LAoJezB4M0UsICAgOH0sIHsweDFFLCAgIDh9LCB7MHgxRSwgICA4fSwgezB4MEUsICAgOH0sIHsweDBFLCAgIDh9LAoJezB4MDYsICAgOH0sIHsweDA2LCAgIDh9LCB7MHgwMiwgICA4fSwgezB4MDIsICAgOH0sIHsweDAwLCAgIDh9LAoJezB4MDAsICAgOH0sIHsweEZFLCAgMTZ9LCB7MHhGRSwgICA4fSwgezB4RkUsICAgOH0sIHsweEZFLCAgIDh9LAoJezB4RkUsICAgOH0sIHsweEZFLCAgIDh9LCB7MHhGRSwgICA4fSwgezB4RkUsICAgOH0sIHsweEZFLCAgIDh9LAoJezB4RkUsICAgOH0sIHsweEZFLCAgIDh9LCB7MHhGRSwgICA4fSwgezB4RkUsICAgOH0sIHsweEZFLCAgIDh9LAoJezB4RkUsICAgOH0sIHsweEZFLCAgIDh9LCB7MHhGRSwgICA4fSwgezB4RkUsICAgOH0sIHsweDdFLCAgIDh9LAoJezB4N0UsICAgOH0sIHsweDNFLCAgIDh9LCB7MHgzRSwgICA4fSwgezB4MUUsICAgOH0sIHsweDFFLCAgIDh9LAoJezB4MEUsICAgOH0sIHsweDBFLCAgIDh9LCB7MHgwNiwgICA4fSwgezB4MDYsICAgOH0sIHsweDAyLCAgIDh9LAoJezB4MDIsICAgOH0sIHsweDAwLCAgIDh9LCB7MHgwMCwgICA4fSwgezB4RkUsICAxNn0KfTsKCi8qIHRhYmxlIG9mIGF0dGVudWF0aW9uIHZhbHVlcyBmb3IgaG9yaXpvbnRhbCBzY2FsaW5nICovCnN0YXRpYyB1OCBoX2F0dGVudWF0aW9uW10gPSB7IDEsIDIsIDQsIDgsIDIsIDQsIDgsIDE2LCAwfTsKCi8qIGNhbGN1bGF0ZSBob3Jpem9udGFsIHNjYWxlIHJlZ2lzdGVycyAqLwpzdGF0aWMgaW50IGNhbGN1bGF0ZV9oX3NjYWxlX3JlZ2lzdGVycyhzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwKCWludCBpbl94LCBpbnQgb3V0X3gsIGludCBmbGlwX2xyLAoJdTMyKiBocHNfY3RybCwgdTMyKiBocHNfdl9nYWluLCB1MzIqIGhwc19oX3ByZXNjYWxlLCB1MzIqIGhwc19oX3NjYWxlKQp7CgkvKiBob3Jpem9udGFsIHByZXNjYWxlciAqLwoJdTMyIGRjZ3ggPSAwLCB4cHNjID0gMCwgeGFjbSA9IDAsIGN4eSA9IDAsIGN4dXYgPSAwOwoJLyogaG9yaXpvbnRhbCBzY2FsZXIgKi8KCXUzMiB4aW0gPSAwLCB4cCA9IDAsIHhzY2kgPTA7CgkvKiB2ZXJ0aWNhbCBzY2FsZSAmIGdhaW4gKi8KCXUzMiBwZnV2ID0gMDsKCgkvKiBoZWxwZXIgdmFyaWFibGVzICovCgl1MzIgaF9hdHRlbiA9IDAsIGkgPSAwOwoKCWlmICggMCA9PSBvdXRfeCApIHsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvKiBtYXNrIG91dCB2YW5pdHktYml0ICovCgkqaHBzX2N0cmwgJj0gfk1BU0tfMjk7CgoJLyogY2FsY3VsYXRlIHByZXNjYWxlLSh4c3BjKS12YWx1ZToJW24gICAuLiAxLzIpIDogMQoJCQkJCQlbMS8yIC4uIDEvMykgOiAyCgkJCQkJCVsxLzMgLi4gMS80KSA6IDMKCQkJCQkJLi4uCQkqLwoJaWYgKGluX3ggPiBvdXRfeCkgewoJCXhwc2MgPSBpbl94IC8gb3V0X3g7Cgl9CgllbHNlIHsKCQkvKiB6b29taW5nICovCgkJeHBzYyA9IDE7Cgl9CgoJLyogaWYgZmxpcF9sci1iaXQgaXMgc2V0LCBudW1iZXIgb2YgcGl4ZWxzIGFmdGVyCgkgICBob3Jpem9udGFsIHByZXNjYWxpbmcgbXVzdCBiZSA8IDM4NCAqLwoJaWYgKCAwICE9IGZsaXBfbHIgKSB7CgoJCS8qIHNldCB2YW5pdHkgYml0ICovCgkJKmhwc19jdHJsIHw9IE1BU0tfMjk7CgoJCXdoaWxlIChpbl94IC8geHBzYyA+PSAzODQgKQoJCQl4cHNjKys7Cgl9CgkvKiBpZiB6b29taW5nIGlzIHdhbnRlZCwgbnVtYmVyIG9mIHBpeGVscyBhZnRlcgoJICAgaG9yaXpvbnRhbCBwcmVzY2FsaW5nIG11c3QgYmUgPCA3NjggKi8KCWVsc2UgewoJCXdoaWxlICggaW5feCAvIHhwc2MgPj0gNzY4ICkKCQkJeHBzYysrOwoJfQoKCS8qIG1heGltdW0gcHJlc2NhbGUgaXMgNjQgKHAuNjkpICovCglpZiAoIHhwc2MgPiA2NCApCgkJeHBzYyA9IDY0OwoKCS8qIGtlZXAgeGFjbSBjbGVhciovCgl4YWNtID0gMDsKCgkvKiBzZXQgaG9yaXpvbnRhbCBmaWx0ZXIgcGFyYW1ldGVycyAoQ1hZID0gQ1hVVikgKi8KCWN4eSA9IGhwc19oX2NvZWZmX3RhYlsoICh4cHNjIC0gMSkgPCA2MyA/ICh4cHNjIC0gMSkgOiA2MyApXS5ocHNfY29lZmY7CgljeHV2ID0gY3h5OwoKCS8qIGNhbGN1bGF0ZSBhbmQgc2V0IGhvcml6b250YWwgZmluZSBzY2FsZSAoeHNjaSkgKi8KCgkvKiBieXBhc3MgdGhlIGhvcml6b250YWwgc2NhbGVyID8gKi8KCWlmICggKGluX3ggPT0gb3V0X3gpICYmICggMSA9PSB4cHNjICkgKQoJCXhzY2kgPSAweDQwMDsKCWVsc2UKCQl4c2NpID0gKCAoMTAyNCAqIGluX3gpIC8gKG91dF94ICogeHBzYykgKSArIHhwc2M7CgoJLyogc2V0IHN0YXJ0IHBoYXNlIGZvciBob3Jpem9udGFsIGZpbmUgc2NhbGUgKHhwKSB0byAwICovCgl4cCA9IDA7CgoJLyogc2V0IHhpbSwgaWYgd2UgYnlwYXNzIHRoZSBob3Jpem9udGFsIHNjYWxlciAqLwoJaWYgKCAweDQwMCA9PSB4c2NpICkKCQl4aW0gPSAxOwoJZWxzZQoJCXhpbSA9IDA7CgoJLyogaWYgdGhlIHByZXNjYWxlciBpcyBieXBhc3NlZCwgZW5hYmxlIGhvcml6b250YWwKCSAgIGFjY3VtdWxhdGlvbiBtb2RlICh4YWNtKSBhbmQgY2xlYXIgZGNneCAqLwoJaWYoIDEgPT0geHBzYyApIHsKCQl4YWNtID0gMTsKCQlkY2d4ID0gMDsKCX0gZWxzZSB7CgkJeGFjbSA9IDA7CgkJLyogZ2V0IGJlc3QgbWF0Y2ggaW4gdGhlIHRhYmxlIG9mIGF0dGVudWF0aW9ucwoJCSAgIGZvciBob3Jpem9udGFsIHNjYWxpbmcgKi8KCQloX2F0dGVuID0gaHBzX2hfY29lZmZfdGFiWyggKHhwc2MgLSAxKSA8IDYzID8gKHhwc2MgLSAxKSA6IDYzICldLndlaWdodF9zdW07CgoJCWZvciAoaSA9IDA7IGhfYXR0ZW51YXRpb25baV0gIT0gMDsgaSsrKSB7CgkJCWlmIChoX2F0dGVudWF0aW9uW2ldID49IGhfYXR0ZW4pCgkJCQlicmVhazsKCQl9CgoJCWRjZ3ggPSBpOwoJfQoKCS8qIHRoZSBob3Jpem9udGFsIHNjYWxpbmcgaW5jcmVtZW50IGNvbnRyb2xzIHRoZSBVViBmaWx0ZXIKCSAgIHRvIHJlZHVjZSB0aGUgYmFuZHdpZHRoIHRvIGltcHJvdmUgdGhlIGRpc3BsYXkgcXVhbGl0eSwKCSAgIHNvIHNldCBpdCAuLi4gKi8KCWlmICggeHNjaSA9PSAweDQwMCkKCQlwZnV2ID0gMHgwMDsKCWVsc2UgaWYgKCB4c2NpIDwgMHg2MDApCgkJcGZ1diA9IDB4MDE7CgllbHNlIGlmICggeHNjaSA8IDB4NjgwKQoJCXBmdXYgPSAweDExOwoJZWxzZSBpZiAoIHhzY2kgPCAweDcwMCkKCQlwZnV2ID0gMHgyMjsKCWVsc2UKCQlwZnV2ID0gMHgzMzsKCgoJKmhwc192X2dhaW4gICY9IE1BU0tfVzB8TUFTS19CMjsKCSpocHNfdl9nYWluICB8PSAocGZ1diA8PCAyNCk7CgoJKmhwc19oX3NjYWxlCSY9IH4oTUFTS19XMSB8IDB4ZjAwMCk7CgkqaHBzX2hfc2NhbGUJfD0gKHhpbSA8PCAzMSkgfCAoeHAgPDwgMjQpIHwgKHhzY2kgPDwgMTIpOwoKCSpocHNfaF9wcmVzY2FsZQl8PSAoZGNneCA8PCAyNykgfCAoKHhwc2MtMSkgPDwgMTgpIHwgKHhhY20gPDwgMTcpIHwgKGN4eSA8PCA4KSB8IChjeHV2IDw8IDApOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHsKCXUxNiBocHNfY29lZmY7Cgl1MTYgd2VpZ2h0X3N1bTsKfSBocHNfdl9jb2VmZl90YWIgW10gPSB7CiB7MHgwMTAwLCAgIDJ9LCAgezB4MDEwMiwgICA0fSwgIHsweDAzMDAsICAgNH0sICB7MHgwMTA2LCAgIDh9LCAgezB4MDUwMiwgICA4fSwKIHsweDA3MDgsICAgOH0sICB7MHgwRjAwLCAgIDh9LCAgezB4MDExRSwgIDE2fSwgIHsweDExMEUsICAxNn0sICB7MHgxOTI2LCAgMTZ9LAogezB4MzkwNiwgIDE2fSwgIHsweDNENDIsICAxNn0sICB7MHg3RDAyLCAgMTZ9LCAgezB4N0Y4MCwgIDE2fSwgIHsweEZGMDAsICAxNn0sCiB7MHgwMUZFLCAgMzJ9LCAgezB4MDFGRSwgIDMyfSwgIHsweDgxN0UsICAzMn0sICB7MHg4MTdFLCAgMzJ9LCAgezB4QzEzRSwgIDMyfSwKIHsweEMxM0UsICAzMn0sICB7MHhFMTFFLCAgMzJ9LCAgezB4RTExRSwgIDMyfSwgIHsweEYxMEUsICAzMn0sICB7MHhGMTBFLCAgMzJ9LAogezB4RjkwNiwgIDMyfSwgIHsweEY5MDYsICAzMn0sICB7MHhGRDAyLCAgMzJ9LCAgezB4RkQwMiwgIDMyfSwgIHsweEZGMDAsICAzMn0sCiB7MHhGRjAwLCAgMzJ9LCAgezB4MDFGRSwgIDY0fSwgIHsweDAxRkUsICA2NH0sICB7MHgwMUZFLCAgNjR9LCAgezB4MDFGRSwgIDY0fSwKIHsweDAxRkUsICA2NH0sICB7MHgwMUZFLCAgNjR9LCAgezB4MDFGRSwgIDY0fSwgIHsweDAxRkUsICA2NH0sICB7MHgwMUZFLCAgNjR9LAogezB4MDFGRSwgIDY0fSwgIHsweDAxRkUsICA2NH0sICB7MHgwMUZFLCAgNjR9LCAgezB4MDFGRSwgIDY0fSwgIHsweDAxRkUsICA2NH0sCiB7MHgwMUZFLCAgNjR9LCAgezB4MDFGRSwgIDY0fSwgIHsweDAxRkUsICA2NH0sICB7MHgwMUZFLCAgNjR9LCAgezB4ODE3RSwgIDY0fSwKIHsweDgxN0UsICA2NH0sICB7MHhDMTNFLCAgNjR9LCAgezB4QzEzRSwgIDY0fSwgIHsweEUxMUUsICA2NH0sICB7MHhFMTFFLCAgNjR9LAogezB4RjEwRSwgIDY0fSwgIHsweEYxMEUsICA2NH0sICB7MHhGOTA2LCAgNjR9LCAgezB4RjkwNiwgIDY0fSwgIHsweEZEMDIsICA2NH0sCiB7MHhGRDAyLCAgNjR9LCAgezB4RkYwMCwgIDY0fSwgIHsweEZGMDAsICA2NH0sICB7MHgwMUZFLCAxMjh9Cn07CgovKiB0YWJsZSBvZiBhdHRlbnVhdGlvbiB2YWx1ZXMgZm9yIHZlcnRpY2FsIHNjYWxpbmcgKi8Kc3RhdGljIHUxNiB2X2F0dGVudWF0aW9uW10gPSB7IDIsIDQsIDgsIDE2LCAzMiwgNjQsIDEyOCwgMjU2LCAwfTsKCi8qIGNhbGN1bGF0ZSB2ZXJ0aWNhbCBzY2FsZSByZWdpc3RlcnMgKi8Kc3RhdGljIGludCBjYWxjdWxhdGVfdl9zY2FsZV9yZWdpc3RlcnMoc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIGVudW0gdjRsMl9maWVsZCBmaWVsZCwKCWludCBpbl95LCBpbnQgb3V0X3ksIHUzMiogaHBzX3Zfc2NhbGUsIHUzMiogaHBzX3ZfZ2FpbikKewoJaW50IGxwaSA9IDA7CgoJLyogdmVydGljYWwgc2NhbGluZyAqLwoJdTMyIHlhY20gPSAwLCB5c2NpID0gMCwgeWFjbCA9IDAsIHlwbyA9IDAsIHlwZSA9IDA7CgkvKiB2ZXJ0aWNhbCBzY2FsZSAmIGdhaW4gKi8KCXUzMiBkY2d5ID0gMCwgY3lhX2N5YiA9IDA7CgoJLyogaGVscGVyIHZhcmlhYmxlcyAqLwoJdTMyIHZfYXR0ZW4gPSAwLCBpID0gMDsKCgkvKiBlcnJvciwgaWYgdmVydGljYWwgem9vbWluZyAqLwoJaWYgKCBpbl95IDwgb3V0X3kgKSB7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLyogbGluZWFyIHBoYXNlIGludGVycG9sYXRpb24gbWF5IGJlIHVzZWQKCSAgIGlmIHNjYWxpbmcgaXMgYmV0d2VlbiAxIGFuZCAxLzIgKGJvdGggZmllbGRzIHVzZWQpCgkgICBvciBzY2FsaW5nIGlzIGJldHdlZW4gMS8yIGFuZCAxLzQgKGlmIG9ubHkgb25lIGZpZWxkIGlzIHVzZWQpICovCgoJaWYgKFY0TDJfRklFTERfSEFTX0JPVEgoZmllbGQpKSB7CgkJaWYoIDIqb3V0X3kgPj0gaW5feSkgewoJCQlscGkgPSAxOwoJCX0KCX0gZWxzZSBpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9UT1AKCQl8fCBmaWVsZCA9PSBWNEwyX0ZJRUxEX0FMVEVSTkFURQoJCXx8IGZpZWxkID09IFY0TDJfRklFTERfQk9UVE9NKSB7CgkJaWYoIDQqb3V0X3kgPj0gaW5feSApIHsKCQkJbHBpID0gMTsKCQl9CgkJb3V0X3kgKj0gMjsKCX0KCWlmKCAwICE9IGxwaSApIHsKCgkJeWFjbSA9IDA7CgkJeWFjbCA9IDA7CgkJY3lhX2N5YiA9IDB4MDBmZjsKCgkJLyogY2FsY3VsYXRlIHNjYWxpbmcgaW5jcmVtZW50ICovCgkJaWYgKCBpbl95ID4gb3V0X3kgKQoJCQl5c2NpID0gKCgxMDI0ICogaW5feSkgLyAob3V0X3kgKyAxKSkgLSAxMDI0OwoJCWVsc2UKCQkJeXNjaSA9IDA7CgoJCWRjZ3kgPSAwOwoKCQkvKiBjYWxjdWxhdGUgeXBlIGFuZCB5cG8gKi8KCQl5cGUgPSB5c2NpIC8gMTY7CgkJeXBvID0geXBlICsgKHlzY2kgLyA2NCk7CgoJfSBlbHNlIHsKCQl5YWNtID0gMTsKCgkJLyogY2FsY3VsYXRlIHNjYWxpbmcgaW5jcmVtZW50ICovCgkJeXNjaSA9ICgoKDEwICogMTAyNCAqIChpbl95IC0gb3V0X3kgLSAxKSkgLyBpbl95KSArIDkpIC8gMTA7CgoJCS8qIGNhbGN1bGF0ZSB5cGUgYW5kIHlwbyAqLwoJCXlwbyA9IHlwZSA9ICgoeXNjaSArIDE1KSAvIDE2KTsKCgkJLyogdGhlIHNlcXVlbmNlIGxlbmd0aCBpbnRlcnZhbCAoeWFjbCkgaGFzIHRvIGJlIHNldCBhY2NvcmRpbmcKCQkgICB0byB0aGUgcHJlc2NhbGUgdmFsdWUsIGUuZy4JW24gICAuLiAxLzIpIDogMAoJCQkJCQlbMS8yIC4uIDEvMykgOiAxCgkJCQkJCVsxLzMgLi4gMS80KSA6IDIKCQkJCQkJLi4uICovCgkJaWYgKCB5c2NpIDwgNTEyKSB7CgkJCXlhY2wgPSAwOwoJCX0gZWxzZSB7CgkJCXlhY2wgPSAoIHlzY2kgLyAoMTAyNCAtIHlzY2kpICk7CgkJfQoKCQkvKiBnZXQgZmlsdGVyIGNvZWZmaWNpZW50cyBmb3IgY3lhLCBjeWIgZnJvbSB0YWJsZSBocHNfdl9jb2VmZl90YWIgKi8KCQljeWFfY3liID0gaHBzX3ZfY29lZmZfdGFiWyAoeWFjbCA8IDYzID8geWFjbCA6IDYzICkgXS5ocHNfY29lZmY7CgoJCS8qIGdldCBiZXN0IG1hdGNoIGluIHRoZSB0YWJsZSBvZiBhdHRlbnVhdGlvbnMgZm9yIHZlcnRpY2FsIHNjYWxpbmcgKi8KCQl2X2F0dGVuID0gaHBzX3ZfY29lZmZfdGFiWyAoeWFjbCA8IDYzID8geWFjbCA6IDYzICkgXS53ZWlnaHRfc3VtOwoKCQlmb3IgKGkgPSAwOyB2X2F0dGVudWF0aW9uW2ldICE9IDA7IGkrKykgewoJCQlpZiAodl9hdHRlbnVhdGlvbltpXSA+PSB2X2F0dGVuKQoJCQkJYnJlYWs7CgkJfQoKCQlkY2d5ID0gaTsKCX0KCgkvKiB5cG8gYW5kIHlwZSBzd2FwcGVkIGluIHNwZWMgPyAqLwoJKmhwc192X3NjYWxlCXw9ICh5YWNtIDw8IDMxKSB8ICh5c2NpIDw8IDIxKSB8ICh5YWNsIDw8IDE1KSB8ICh5cG8gPDwgOCApIHwgKHlwZSA8PCAxKTsKCgkqaHBzX3ZfZ2FpbgkmPSB+KE1BU0tfVzB8TUFTS19CMik7CgkqaHBzX3ZfZ2Fpbgl8PSAoZGNneSA8PCAxNikgfCAoY3lhX2N5YiA8PCAwKTsKCglyZXR1cm4gMDsKfQoKLyogc2ltcGxlIGJ1YmJsZS1zb3J0IGFsZ29yaXRobSB3aXRoIGR1cGxpY2F0ZSBlbGltaW5hdGlvbiAqLwpzdGF0aWMgaW50IHNvcnRfYW5kX2VsaW1pbmF0ZSh1MzIqIHZhbHVlcywgaW50KiBjb3VudCkKewoJaW50IGxvdyA9IDAsIGhpZ2ggPSAwLCB0b3AgPSAwLCB0ZW1wID0gMDsKCWludCBjdXIgPSAwLCBuZXh0ID0gMDsKCgkvKiBzYW5pdHkgY2hlY2tzICovCglpZiggKDAgPiAqY291bnQpIHx8IChOVUxMID09IHZhbHVlcykgKSB7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLyogYnViYmxlIHNvcnQgdGhlIGZpcnN0ILRjb3VudLQgaXRlbXMgb2YgdGhlIGFycmF5ILR2YWx1ZXO0ICovCglmb3IoIHRvcCA9ICpjb3VudDsgdG9wID4gMDsgdG9wLS0pIHsKCQlmb3IoIGxvdyA9IDAsIGhpZ2ggPSAxOyBoaWdoIDwgdG9wOyBsb3crKywgaGlnaCsrKSB7CgkJCWlmKCB2YWx1ZXNbbG93XSA+IHZhbHVlc1toaWdoXSApIHsKCQkJCXRlbXAgPSB2YWx1ZXNbbG93XTsKCQkJCXZhbHVlc1tsb3ddID0gdmFsdWVzW2hpZ2hdOwoJCQkJdmFsdWVzW2hpZ2hdID0gdGVtcDsKCQkJfQoJCX0KCX0KCgkvKiByZW1vdmUgZHVwbGljYXRlIGl0ZW1zICovCglmb3IoIGN1ciA9IDAsIG5leHQgPSAxOyBuZXh0IDwgKmNvdW50OyBuZXh0KyspIHsKCQlpZiggdmFsdWVzW2N1cl0gIT0gdmFsdWVzW25leHRdKQoJCQl2YWx1ZXNbKytjdXJdID0gdmFsdWVzW25leHRdOwoJfQoKCSpjb3VudCA9IGN1ciArIDE7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9jbGlwcGluZ19yZWdpc3RlcnNfcmVjdChzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgc3RydWN0IHNhYTcxNDZfZmggKmZoLAoJc3RydWN0IHNhYTcxNDZfdmlkZW9fZG1hICp2ZG1hMiwgdTMyKiBjbGlwX2Zvcm1hdCwgdTMyKiBhcmJ0cl9jdHJsLCBlbnVtIHY0bDJfZmllbGQgZmllbGQpCnsKCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKCXUzMiAqY2xpcHBpbmcgPSB2di0+ZF9jbGlwcGluZy5jcHVfYWRkcjsKCglpbnQgd2lkdGggPSBmaC0+b3Yud2luLncud2lkdGg7CglpbnQgaGVpZ2h0ID0gIGZoLT5vdi53aW4udy5oZWlnaHQ7CglpbnQgY2xpcGNvdW50ID0gZmgtPm92Lm5jbGlwczsKCgl1MzIgbGluZV9saXN0WzMyXTsKCXUzMiBwaXhlbF9saXN0WzMyXTsKCWludCBudW1kd29yZHMgPSAwOwoKCWludCBpID0gMCwgaiA9IDA7CglpbnQgY250X2xpbmUgPSAwLCBjbnRfcGl4ZWwgPSAwOwoKCWludCB4WzMyXSwgeVszMl0sIHdbMzJdLCBoWzMyXTsKCgkvKiBjbGVhciBvdXQgbWVtb3J5ICovCgltZW1zZXQoJmxpbmVfbGlzdFswXSwgIDB4MDAsIHNpemVvZih1MzIpKjMyKTsKCW1lbXNldCgmcGl4ZWxfbGlzdFswXSwgMHgwMCwgc2l6ZW9mKHUzMikqMzIpOwoJbWVtc2V0KGNsaXBwaW5nLCAgMHgwMCwgU0FBNzE0Nl9DTElQUElOR19NRU0pOwoKCS8qIGZpbGwgdGhlIGxpbmUgYW5kIHBpeGVsLWxpc3RzICovCglmb3IoaSA9IDA7IGkgPCBjbGlwY291bnQ7IGkrKykgewoJCWludCBsID0gMCwgciA9IDAsIHQgPSAwLCBiID0gMDsKCgkJeFtpXSA9IGZoLT5vdi5jbGlwc1tpXS5jLmxlZnQ7CgkJeVtpXSA9IGZoLT5vdi5jbGlwc1tpXS5jLnRvcDsKCQl3W2ldID0gZmgtPm92LmNsaXBzW2ldLmMud2lkdGg7CgkJaFtpXSA9IGZoLT5vdi5jbGlwc1tpXS5jLmhlaWdodDsKCgkJaWYoIHdbaV0gPCAwKSB7CgkJCXhbaV0gKz0gd1tpXTsgd1tpXSA9IC13W2ldOwoJCX0KCQlpZiggaFtpXSA8IDApIHsKCQkJeVtpXSArPSBoW2ldOyBoW2ldID0gLWhbaV07CgkJfQoJCWlmKCB4W2ldIDwgMCkgewoJCQl3W2ldICs9IHhbaV07IHhbaV0gPSAwOwoJCX0KCQlpZiggeVtpXSA8IDApIHsKCQkJaFtpXSArPSB5W2ldOyB5W2ldID0gMDsKCQl9CgkJaWYoIDAgIT0gdnYtPnZmbGlwICkgewoJCQl5W2ldID0gaGVpZ2h0IC0geVtpXSAtIGhbaV07CgkJfQoKCQlsID0geFtpXTsKCQlyID0geFtpXSt3W2ldOwoJCXQgPSB5W2ldOwoJCWIgPSB5W2ldK2hbaV07CgoJCS8qIGluc2VydCBsZWZ0L3JpZ2h0IGNvb3JkaW5hdGVzICovCgkJcGl4ZWxfbGlzdFsgMippICAgXSA9IG1pbl90KGludCwgbCwgd2lkdGgpOwoJCXBpeGVsX2xpc3RbKDIqaSkrMV0gPSBtaW5fdChpbnQsIHIsIHdpZHRoKTsKCQkvKiBpbnNlcnQgdG9wL2JvdHRvbSBjb29yZGluYXRlcyAqLwoJCWxpbmVfbGlzdFsgMippICAgXSA9IG1pbl90KGludCwgdCwgaGVpZ2h0KTsKCQlsaW5lX2xpc3RbKDIqaSkrMV0gPSBtaW5fdChpbnQsIGIsIGhlaWdodCk7Cgl9CgoJLyogc29ydCBhbmQgZWxpbWluYXRlIGxpc3RzICovCgljbnRfbGluZSA9IGNudF9waXhlbCA9IDIqY2xpcGNvdW50OwoJc29ydF9hbmRfZWxpbWluYXRlKCAmcGl4ZWxfbGlzdFswXSwgJmNudF9waXhlbCApOwoJc29ydF9hbmRfZWxpbWluYXRlKCAmbGluZV9saXN0WzBdLCAmY250X2xpbmUgKTsKCgkvKiBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB1c2VkIHUzMnMgKi8KCW51bWR3b3JkcyA9IG1heF90KGludCwgKGNudF9saW5lKzEpLCAoY250X3BpeGVsKzEpKSoyOwoJbnVtZHdvcmRzID0gbWF4X3QoaW50LCA0LCBudW1kd29yZHMpOwoJbnVtZHdvcmRzID0gbWluX3QoaW50LCA2NCwgbnVtZHdvcmRzKTsKCgkvKiBmaWxsIHVwIGNsaXB0YWJsZSAqLwoJZm9yKGkgPSAwOyBpIDwgY250X3BpeGVsOyBpKyspIHsKCQljbGlwcGluZ1syKmldIHw9IGNwdV90b19sZTMyKHBpeGVsX2xpc3RbaV0gPDwgMTYpOwoJfQoJZm9yKGkgPSAwOyBpIDwgY250X2xpbmU7IGkrKykgewoJCWNsaXBwaW5nWygyKmkpKzFdIHw9IGNwdV90b19sZTMyKGxpbmVfbGlzdFtpXSA8PCAxNik7Cgl9CgoJLyogZmlsbCB1cCBjbGlwdGFibGUgd2l0aCB0aGUgZGlzcGxheSBpbmZvcyAqLwoJZm9yKGogPSAwOyBqIDwgY2xpcGNvdW50OyBqKyspIHsKCgkJZm9yKGkgPSAwOyBpIDwgY250X3BpeGVsOyBpKyspIHsKCgkJCWlmKCB4W2pdIDwgMCkKCQkJCXhbal0gPSAwOwoKCQkJaWYoIHBpeGVsX2xpc3RbaV0gPCAoeFtqXSArIHdbal0pKSB7CgoJCQkJaWYgKCBwaXhlbF9saXN0W2ldID49IHhbal0gKSB7CgkJCQkJY2xpcHBpbmdbMippXSB8PSBjcHVfdG9fbGUzMigxIDw8IGopOwoJCQkJfQoJCQl9CgkJfQoJCWZvcihpID0gMDsgaSA8IGNudF9saW5lOyBpKyspIHsKCgkJCWlmKCB5W2pdIDwgMCkKCQkJCXlbal0gPSAwOwoKCQkJaWYoIGxpbmVfbGlzdFtpXSA8ICh5W2pdICsgaFtqXSkgKSB7CgoJCQkJaWYoIGxpbmVfbGlzdFtpXSA+PSB5W2pdICkgewoJCQkJCWNsaXBwaW5nWygyKmkpKzFdIHw9IGNwdV90b19sZTMyKDEgPDwgaik7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLyogYWRqdXN0IGFyYml0cmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KCSphcmJ0cl9jdHJsICY9IDB4ZmZmZjAwZmY7CgkqYXJidHJfY3RybCB8PSAweDAwMDAxYzAwOwoKCXZkbWEyLT5iYXNlX2V2ZW4JPSB2di0+ZF9jbGlwcGluZy5kbWFfaGFuZGxlOwoJdmRtYTItPmJhc2Vfb2RkCQk9IHZ2LT5kX2NsaXBwaW5nLmRtYV9oYW5kbGU7Cgl2ZG1hMi0+cHJvdF9hZGRyCT0gdnYtPmRfY2xpcHBpbmcuZG1hX2hhbmRsZSsoKHNpemVvZih1MzIpKSoobnVtZHdvcmRzKSk7Cgl2ZG1hMi0+YmFzZV9wYWdlCT0gMHgwNDsKCXZkbWEyLT5waXRjaAkJPSAweDAwOwoJdmRtYTItPm51bV9saW5lX2J5dGUJPSAoMCA8PCAxNiB8IChzaXplb2YodTMyKSkqKG51bWR3b3Jkcy0xKSApOwoKCS8qIHNldCBjbGlwcGluZy1tb2RlLiB0aGlzIGRlcGVuZHMgb24gdGhlIGZpZWxkKHMpIHVzZWQgKi8KCSpjbGlwX2Zvcm1hdCAmPSAweGZmZmZmZmY3OwoJaWYgKFY0TDJfRklFTERfSEFTX0JPVEgoZmllbGQpKSB7CgkJKmNsaXBfZm9ybWF0IHw9IDB4MDAwMDAwMDg7Cgl9IGVsc2UgewoJCSpjbGlwX2Zvcm1hdCB8PSAweDAwMDAwMDAwOwoJfQp9CgovKiBkaXNhYmxlIGNsaXBwaW5nICovCnN0YXRpYyB2b2lkIHNhYTcxNDZfZGlzYWJsZV9jbGlwcGluZyhzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldikKewoJdTMyIGNsaXBfZm9ybWF0CT0gc2FhNzE0Nl9yZWFkKGRldiwgQ0xJUF9GT1JNQVRfQ1RSTCk7CgoJLyogbWFzayBvdXQgcmVsZXZhbnQgYml0cyAoPWxvd2VyIHdvcmQpKi8KCWNsaXBfZm9ybWF0ICY9IE1BU0tfVzE7CgoJLyogdXBsb2FkIGNsaXBwaW5nLXJlZ2lzdGVycyovCglzYWE3MTQ2X3dyaXRlKGRldiwgQ0xJUF9GT1JNQVRfQ1RSTCxjbGlwX2Zvcm1hdCk7CglzYWE3MTQ2X3dyaXRlKGRldiwgTUMyLCAoTUFTS18wNSB8IE1BU0tfMjEpKTsKCgkvKiBkaXNhYmxlIHZpZGVvIGRtYTIgKi8KCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzEsIE1BU0tfMjEpOwp9CgpzdGF0aWMgdm9pZCBzYWE3MTQ2X3NldF9jbGlwcGluZ19yZWN0KHN0cnVjdCBzYWE3MTQ2X2ZoICpmaCkKewoJc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYgPSBmaC0+ZGV2OwoJZW51bSB2NGwyX2ZpZWxkIGZpZWxkID0gZmgtPm92Lndpbi5maWVsZDsKCXN0cnVjdAlzYWE3MTQ2X3ZpZGVvX2RtYSB2ZG1hMjsKCXUzMiBjbGlwX2Zvcm1hdDsKCXUzMiBhcmJ0cl9jdHJsOwoKCS8qIGNoZWNrIGNsaXBjb3VudCwgZGlzYWJsZSBjbGlwcGluZyBpZiBjbGlwY291bnQgPT0gMCovCglpZiggZmgtPm92Lm5jbGlwcyA9PSAwICkgewoJCXNhYTcxNDZfZGlzYWJsZV9jbGlwcGluZyhkZXYpOwoJCXJldHVybjsKCX0KCgljbGlwX2Zvcm1hdCA9IHNhYTcxNDZfcmVhZChkZXYsIENMSVBfRk9STUFUX0NUUkwpOwoJYXJidHJfY3RybCA9IHNhYTcxNDZfcmVhZChkZXYsIFBDSV9CVF9WMSk7CgoJY2FsY3VsYXRlX2NsaXBwaW5nX3JlZ2lzdGVyc19yZWN0KGRldiwgZmgsICZ2ZG1hMiwgJmNsaXBfZm9ybWF0LCAmYXJidHJfY3RybCwgZmllbGQpOwoKCS8qIHNldCBjbGlwcGluZyBmb3JtYXQgKi8KCWNsaXBfZm9ybWF0ICY9IDB4ZmZmZjAwMDg7CgljbGlwX2Zvcm1hdCB8PSAoU0FBNzE0Nl9DTElQUElOR19SRUNUIDw8IDQpOwoKCS8qIHByZXBhcmUgdmlkZW8gZG1hMiAqLwoJc2FhNzE0Nl93cml0ZShkZXYsIEJBU0VfRVZFTjIsCQl2ZG1hMi5iYXNlX2V2ZW4pOwoJc2FhNzE0Nl93cml0ZShkZXYsIEJBU0VfT0REMiwJCXZkbWEyLmJhc2Vfb2RkKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBQUk9UX0FERFIyLAkJdmRtYTIucHJvdF9hZGRyKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBCQVNFX1BBR0UyLAkJdmRtYTIuYmFzZV9wYWdlKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBQSVRDSDIsCQl2ZG1hMi5waXRjaCk7CglzYWE3MTQ2X3dyaXRlKGRldiwgTlVNX0xJTkVfQllURTIsCXZkbWEyLm51bV9saW5lX2J5dGUpOwoKCS8qIHByZXBhcmUgdGhlIHJlc3QgKi8KCXNhYTcxNDZfd3JpdGUoZGV2LCBDTElQX0ZPUk1BVF9DVFJMLGNsaXBfZm9ybWF0KTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBQQ0lfQlRfVjEsIGFyYnRyX2N0cmwpOwoKCS8qIHVwbG9hZCBjbGlwX2NvbnRyb2wtcmVnaXN0ZXIsIGNsaXBwaW5nLXJlZ2lzdGVycywgZW5hYmxlIHZpZGVvIGRtYTIgKi8KCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzIsIChNQVNLXzA1IHwgTUFTS18yMSB8IE1BU0tfMDMgfCBNQVNLXzE5KSk7CglzYWE3MTQ2X3dyaXRlKGRldiwgTUMxLCAoTUFTS18wNSB8IE1BU0tfMjEpKTsKfQoKc3RhdGljIHZvaWQgc2FhNzE0Nl9zZXRfd2luZG93KHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKewoJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwoKCWludCBzb3VyY2UgPSB2di0+Y3VycmVudF9ocHNfc291cmNlOwoJaW50IHN5bmMgPSB2di0+Y3VycmVudF9ocHNfc3luYzsKCgl1MzIgaHBzX3Zfc2NhbGUgPSAwLCBocHNfdl9nYWluICA9IDAsIGhwc19jdHJsID0gMCwgaHBzX2hfcHJlc2NhbGUgPSAwLCBocHNfaF9zY2FsZSA9IDA7CgoJLyogc2V0IHZlcnRpY2FsIHNjYWxlICovCglocHNfdl9zY2FsZSA9IDA7IC8qIGFsbCBiaXRzIGdldCBzZXQgYnkgdGhlIGZ1bmN0aW9uLWNhbGwgKi8KCWhwc192X2dhaW4gID0gMDsgLyogZml4bWU6IHNhYTcxNDZfcmVhZChkZXYsIEhQU19WX0dBSU4pOyovCgljYWxjdWxhdGVfdl9zY2FsZV9yZWdpc3RlcnMoZGV2LCBmaWVsZCwgdnYtPnN0YW5kYXJkLT52X2ZpZWxkKjIsIGhlaWdodCwgJmhwc192X3NjYWxlLCAmaHBzX3ZfZ2Fpbik7CgoJLyogc2V0IGhvcml6b250YWwgc2NhbGUgKi8KCWhwc19jdHJsCT0gMDsKCWhwc19oX3ByZXNjYWxlCT0gMDsgLyogYWxsIGJpdHMgZ2V0IHNldCBpbiB0aGUgZnVuY3Rpb24gKi8KCWhwc19oX3NjYWxlCT0gMDsKCWNhbGN1bGF0ZV9oX3NjYWxlX3JlZ2lzdGVycyhkZXYsIHZ2LT5zdGFuZGFyZC0+aF9waXhlbHMsIHdpZHRoLCB2di0+aGZsaXAsICZocHNfY3RybCwgJmhwc192X2dhaW4sICZocHNfaF9wcmVzY2FsZSwgJmhwc19oX3NjYWxlKTsKCgkvKiBzZXQgaHlvIGFuZCBoeG8gKi8KCWNhbGN1bGF0ZV9oeG9fYW5kX2h5byh2diwgJmhwc19oX3NjYWxlLCAmaHBzX2N0cmwpOwoJY2FsY3VsYXRlX2hwc19zb3VyY2VfYW5kX3N5bmMoZGV2LCBzb3VyY2UsIHN5bmMsICZocHNfY3RybCk7CgoJLyogd3JpdGUgb3V0IG5ldyByZWdpc3RlciBjb250ZW50cyAqLwoJc2FhNzE0Nl93cml0ZShkZXYsIEhQU19WX1NDQUxFLAlocHNfdl9zY2FsZSk7CglzYWE3MTQ2X3dyaXRlKGRldiwgSFBTX1ZfR0FJTiwJaHBzX3ZfZ2Fpbik7CglzYWE3MTQ2X3dyaXRlKGRldiwgSFBTX0NUUkwsCWhwc19jdHJsKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBIUFNfSF9QUkVTQ0FMRSxocHNfaF9wcmVzY2FsZSk7CglzYWE3MTQ2X3dyaXRlKGRldiwgSFBTX0hfU0NBTEUsCWhwc19oX3NjYWxlKTsKCgkvKiB1cGxvYWQgc2hhZG93LXJhbSByZWdpc3RlcnMgKi8KCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzIsIChNQVNLXzA1IHwgTUFTS18wNiB8IE1BU0tfMjEgfCBNQVNLXzIyKSApOwp9CgovKiBjYWxjdWxhdGUgdGhlIG5ldyBtZW1vcnkgb2Zmc2V0cyBmb3IgYSBkZXNpcmVkIHBvc2l0aW9uICovCnN0YXRpYyB2b2lkIHNhYTcxNDZfc2V0X3Bvc2l0aW9uKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCBpbnQgd194LCBpbnQgd195LCBpbnQgd19oZWlnaHQsIGVudW0gdjRsMl9maWVsZCBmaWVsZCwgdTMyIHBpeGVsZm9ybWF0KQp7CglzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CglzdHJ1Y3Qgc2FhNzE0Nl9mb3JtYXQgKnNmbXQgPSBmb3JtYXRfYnlfZm91cmNjKGRldiwgcGl4ZWxmb3JtYXQpOwoKCWludCBiX2RlcHRoID0gdnYtPm92X2ZtdC0+ZGVwdGg7CglpbnQgYl9icGwgPSB2di0+b3ZfZmIuZm10LmJ5dGVzcGVybGluZTsKCS8qIFRoZSB1bnNpZ25lZCBsb25nIGNhc3QgaXMgdG8gcmVtb3ZlIGEgNjQtYml0IGNvbXBpbGUgd2FybmluZyBzaW5jZQoJICAgaXQgbG9va3MgbGlrZSBhIDY0LWJpdCBhZGRyZXNzIGlzIGNhc3QgdG8gYSAzMi1iaXQgdmFsdWUsIGV2ZW4KCSAgIHRob3VnaCB0aGUgYmFzZSBwb2ludGVyIGlzIHJlYWxseSBhIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIHRoYXQKCSAgIGdvZXMgaW50byBhIDMyLWJpdCBETUEgcmVnaXN0ZXIuCgkgICBGSVhNRTogbWlnaHQgbm90IHdvcmsgb24gc29tZSA2NC1iaXQgcGxhdGZvcm1zLCBidXQgc2VlIHRoZSBGSVhNRQoJICAgaW4gc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKHZpZGVvZGV2Mi5oKSBmb3IgdGhhdC4KCSAqLwoJdTMyIGJhc2UgPSAodTMyKSh1bnNpZ25lZCBsb25nKXZ2LT5vdl9mYi5iYXNlOwoKCXN0cnVjdAlzYWE3MTQ2X3ZpZGVvX2RtYSB2ZG1hMTsKCgkvKiBjYWxjdWxhdGUgbWVtb3J5IG9mZnNldHMgZm9yIHBpY3R1cmUsIGxvb2sgaWYgd2Ugc2hhbGwgdG9wLWRvd24tZmxpcCAqLwoJdmRtYTEucGl0Y2gJPSAyKmJfYnBsOwoJaWYgKCAwID09IHZ2LT52ZmxpcCApIHsKCQl2ZG1hMS5iYXNlX2V2ZW4gPSBiYXNlICsgKHdfeSAqICh2ZG1hMS5waXRjaC8yKSkgKyAod194ICogKGJfZGVwdGggLyA4KSk7CgkJdmRtYTEuYmFzZV9vZGQgID0gdmRtYTEuYmFzZV9ldmVuICsgKHZkbWExLnBpdGNoIC8gMik7CgkJdmRtYTEucHJvdF9hZGRyID0gdmRtYTEuYmFzZV9ldmVuICsgKHdfaGVpZ2h0ICogKHZkbWExLnBpdGNoIC8gMikpOwoJfQoJZWxzZSB7CgkJdmRtYTEuYmFzZV9ldmVuID0gYmFzZSArICgod195K3dfaGVpZ2h0KSAqICh2ZG1hMS5waXRjaC8yKSkgKyAod194ICogKGJfZGVwdGggLyA4KSk7CgkJdmRtYTEuYmFzZV9vZGQgID0gdmRtYTEuYmFzZV9ldmVuIC0gKHZkbWExLnBpdGNoIC8gMik7CgkJdmRtYTEucHJvdF9hZGRyID0gdmRtYTEuYmFzZV9vZGQgLSAod19oZWlnaHQgKiAodmRtYTEucGl0Y2ggLyAyKSk7Cgl9CgoJaWYgKFY0TDJfRklFTERfSEFTX0JPVEgoZmllbGQpKSB7Cgl9IGVsc2UgaWYgKGZpZWxkID09IFY0TDJfRklFTERfQUxURVJOQVRFKSB7CgkJLyogZml4bWUgKi8KCQl2ZG1hMS5iYXNlX29kZCA9IHZkbWExLnByb3RfYWRkcjsKCQl2ZG1hMS5waXRjaCAvPSAyOwoJfSBlbHNlIGlmIChmaWVsZCA9PSBWNEwyX0ZJRUxEX1RPUCkgewoJCXZkbWExLmJhc2Vfb2RkID0gdmRtYTEucHJvdF9hZGRyOwoJCXZkbWExLnBpdGNoIC89IDI7Cgl9IGVsc2UgaWYgKGZpZWxkID09IFY0TDJfRklFTERfQk9UVE9NKSB7CgkJdmRtYTEuYmFzZV9vZGQgPSB2ZG1hMS5iYXNlX2V2ZW47CgkJdmRtYTEuYmFzZV9ldmVuID0gdmRtYTEucHJvdF9hZGRyOwoJCXZkbWExLnBpdGNoIC89IDI7Cgl9CgoJaWYgKCAwICE9IHZ2LT52ZmxpcCApIHsKCQl2ZG1hMS5waXRjaCAqPSAtMTsKCX0KCgl2ZG1hMS5iYXNlX3BhZ2UgPSBzZm10LT5zd2FwOwoJdmRtYTEubnVtX2xpbmVfYnl0ZSA9ICh2di0+c3RhbmRhcmQtPnZfZmllbGQ8PDE2KSt2di0+c3RhbmRhcmQtPmhfcGl4ZWxzOwoKCXNhYTcxNDZfd3JpdGVfb3V0X2RtYShkZXYsIDEsICZ2ZG1hMSk7Cn0KCnN0YXRpYyB2b2lkIHNhYTcxNDZfc2V0X291dHB1dF9mb3JtYXQoc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgcGFsZXR0ZSkKewoJdTMyIGNsaXBfZm9ybWF0ID0gc2FhNzE0Nl9yZWFkKGRldiwgQ0xJUF9GT1JNQVRfQ1RSTCk7CgoJLyogY2FsbCBoZWxwZXIgZnVuY3Rpb24gKi8KCWNhbGN1bGF0ZV9vdXRwdXRfZm9ybWF0X3JlZ2lzdGVyKGRldixwYWxldHRlLCZjbGlwX2Zvcm1hdCk7CgoJLyogdXBkYXRlIHRoZSBocHMgcmVnaXN0ZXJzICovCglzYWE3MTQ2X3dyaXRlKGRldiwgQ0xJUF9GT1JNQVRfQ1RSTCwgY2xpcF9mb3JtYXQpOwoJc2FhNzE0Nl93cml0ZShkZXYsIE1DMiwgKE1BU0tfMDUgfCBNQVNLXzIxKSk7Cn0KCi8qIHNlbGVjdCBpbnB1dC1zb3VyY2UgKi8Kdm9pZCBzYWE3MTQ2X3NldF9ocHNfc291cmNlX2FuZF9zeW5jKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCBpbnQgc291cmNlLCBpbnQgc3luYykKewoJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwoJdTMyIGhwc19jdHJsID0gMDsKCgkvKiByZWFkIG9sZCBzdGF0ZSAqLwoJaHBzX2N0cmwgPSBzYWE3MTQ2X3JlYWQoZGV2LCBIUFNfQ1RSTCk7CgoJaHBzX2N0cmwgJj0gfiggTUFTS18zMSB8IE1BU0tfMzAgfCBNQVNLXzI4ICk7CglocHNfY3RybCB8PSAoc291cmNlIDw8IDMwKSB8IChzeW5jIDw8IDI4KTsKCgkvKiB3cml0ZSBiYWNrICYgdXBsb2FkIHJlZ2lzdGVyICovCglzYWE3MTQ2X3dyaXRlKGRldiwgSFBTX0NUUkwsIGhwc19jdHJsKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzIsIChNQVNLXzA1IHwgTUFTS18yMSkpOwoKCXZ2LT5jdXJyZW50X2hwc19zb3VyY2UgPSBzb3VyY2U7Cgl2di0+Y3VycmVudF9ocHNfc3luYyA9IHN5bmM7Cn0KRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzE0Nl9zZXRfaHBzX3NvdXJjZV9hbmRfc3luYyk7CgppbnQgc2FhNzE0Nl9lbmFibGVfb3ZlcmxheShzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmgpCnsKCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gZmgtPmRldjsKCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKCglzYWE3MTQ2X3NldF93aW5kb3coZGV2LCBmaC0+b3Yud2luLncud2lkdGgsIGZoLT5vdi53aW4udy5oZWlnaHQsIGZoLT5vdi53aW4uZmllbGQpOwoJc2FhNzE0Nl9zZXRfcG9zaXRpb24oZGV2LCBmaC0+b3Yud2luLncubGVmdCwgZmgtPm92Lndpbi53LnRvcCwgZmgtPm92Lndpbi53LmhlaWdodCwgZmgtPm92Lndpbi5maWVsZCwgdnYtPm92X2ZtdC0+cGl4ZWxmb3JtYXQpOwoJc2FhNzE0Nl9zZXRfb3V0cHV0X2Zvcm1hdChkZXYsIHZ2LT5vdl9mbXQtPnRyYW5zKTsKCXNhYTcxNDZfc2V0X2NsaXBwaW5nX3JlY3QoZmgpOwoKCS8qIGVuYWJsZSB2aWRlbyBkbWExICovCglzYWE3MTQ2X3dyaXRlKGRldiwgTUMxLCAoTUFTS18wNiB8IE1BU0tfMjIpKTsKCXJldHVybiAwOwp9Cgp2b2lkIHNhYTcxNDZfZGlzYWJsZV9vdmVybGF5KHN0cnVjdCBzYWE3MTQ2X2ZoICpmaCkKewoJc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYgPSBmaC0+ZGV2OwoKCS8qIGRpc2FibGUgY2xpcHBpbmcgKyB2aWRlbyBkbWExICovCglzYWE3MTQ2X2Rpc2FibGVfY2xpcHBpbmcoZGV2KTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzEsIE1BU0tfMjIpOwp9Cgp2b2lkIHNhYTcxNDZfd3JpdGVfb3V0X2RtYShzdHJ1Y3Qgc2FhNzE0Nl9kZXYqIGRldiwgaW50IHdoaWNoLCBzdHJ1Y3Qgc2FhNzE0Nl92aWRlb19kbWEqIHZkbWEpCnsKCWludCB3aGVyZSA9IDA7CgoJaWYoIHdoaWNoIDwgMSB8fCB3aGljaCA+IDMpIHsKCQlyZXR1cm47Cgl9CgoJLyogY2FsY3VsYXRlIHN0YXJ0aW5nIGFkZHJlc3MgKi8KCXdoZXJlICA9ICh3aGljaC0xKSoweDE4OwoKCXNhYTcxNDZfd3JpdGUoZGV2LCB3aGVyZSwJdmRtYS0+YmFzZV9vZGQpOwoJc2FhNzE0Nl93cml0ZShkZXYsIHdoZXJlKzB4MDQsCXZkbWEtPmJhc2VfZXZlbik7CglzYWE3MTQ2X3dyaXRlKGRldiwgd2hlcmUrMHgwOCwJdmRtYS0+cHJvdF9hZGRyKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCB3aGVyZSsweDBjLAl2ZG1hLT5waXRjaCk7CglzYWE3MTQ2X3dyaXRlKGRldiwgd2hlcmUrMHgxMCwJdmRtYS0+YmFzZV9wYWdlKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCB3aGVyZSsweDE0LAl2ZG1hLT5udW1fbGluZV9ieXRlKTsKCgkvKiB1cGxvYWQgKi8KCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzIsIChNQVNLXzAyPDwod2hpY2gtMSkpfChNQVNLXzE4PDwod2hpY2gtMSkpKTsKLyoKCXByaW50aygidmRtYSVkLmJhc2VfZXZlbjogICAgIDB4JTA4eFxuIiwgd2hpY2gsdmRtYS0+YmFzZV9ldmVuKTsKCXByaW50aygidmRtYSVkLmJhc2Vfb2RkOiAgICAgIDB4JTA4eFxuIiwgd2hpY2gsdmRtYS0+YmFzZV9vZGQpOwoJcHJpbnRrKCJ2ZG1hJWQucHJvdF9hZGRyOiAgICAgMHglMDh4XG4iLCB3aGljaCx2ZG1hLT5wcm90X2FkZHIpOwoJcHJpbnRrKCJ2ZG1hJWQuYmFzZV9wYWdlOiAgICAgMHglMDh4XG4iLCB3aGljaCx2ZG1hLT5iYXNlX3BhZ2UpOwoJcHJpbnRrKCJ2ZG1hJWQucGl0Y2g6ICAgICAgICAgMHglMDh4XG4iLCB3aGljaCx2ZG1hLT5waXRjaCk7CglwcmludGsoInZkbWElZC5udW1fbGluZV9ieXRlOiAweCUwOHhcbiIsIHdoaWNoLHZkbWEtPm51bV9saW5lX2J5dGUpOwoqLwp9CgpzdGF0aWMgaW50IGNhbGN1bGF0ZV92aWRlb19kbWFfZ3JhYl9wYWNrZWQoc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYsIHN0cnVjdCBzYWE3MTQ2X2J1ZiAqYnVmKQp7CglzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CglzdHJ1Y3Qgc2FhNzE0Nl92aWRlb19kbWEgdmRtYTE7CgoJc3RydWN0IHNhYTcxNDZfZm9ybWF0ICpzZm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhkZXYsYnVmLT5mbXQtPnBpeGVsZm9ybWF0KTsKCglpbnQgd2lkdGggPSBidWYtPmZtdC0+d2lkdGg7CglpbnQgaGVpZ2h0ID0gYnVmLT5mbXQtPmhlaWdodDsKCWludCBieXRlc3BlcmxpbmUgPSBidWYtPmZtdC0+Ynl0ZXNwZXJsaW5lOwoJZW51bSB2NGwyX2ZpZWxkIGZpZWxkID0gYnVmLT5mbXQtPmZpZWxkOwoKCWludCBkZXB0aCA9IHNmbXQtPmRlcHRoOwoKCURFQl9DQVAoKCJbc2l6ZT0lZHglZCxmaWVsZHM9JXNdXG4iLAoJCXdpZHRoLGhlaWdodCx2NGwyX2ZpZWxkX25hbWVzW2ZpZWxkXSkpOwoKCWlmKCBieXRlc3BlcmxpbmUgIT0gMCkgewoJCXZkbWExLnBpdGNoID0gYnl0ZXNwZXJsaW5lKjI7Cgl9IGVsc2UgewoJCXZkbWExLnBpdGNoID0gKHdpZHRoKmRlcHRoKjIpLzg7Cgl9Cgl2ZG1hMS5udW1fbGluZV9ieXRlCT0gKCh2di0+c3RhbmRhcmQtPnZfZmllbGQ8PDE2KSArIHZ2LT5zdGFuZGFyZC0+aF9waXhlbHMpOwoJdmRtYTEuYmFzZV9wYWdlCQk9IGJ1Zi0+cHRbMF0uZG1hIHwgTUUxIHwgc2ZtdC0+c3dhcDsKCglpZiggMCAhPSB2di0+dmZsaXAgKSB7CgkJdmRtYTEucHJvdF9hZGRyCT0gYnVmLT5wdFswXS5vZmZzZXQ7CgkJdmRtYTEuYmFzZV9ldmVuCT0gYnVmLT5wdFswXS5vZmZzZXQrKHZkbWExLnBpdGNoLzIpKmhlaWdodDsKCQl2ZG1hMS5iYXNlX29kZAk9IHZkbWExLmJhc2VfZXZlbiAtICh2ZG1hMS5waXRjaC8yKTsKCX0gZWxzZSB7CgkJdmRtYTEuYmFzZV9ldmVuCT0gYnVmLT5wdFswXS5vZmZzZXQ7CgkJdmRtYTEuYmFzZV9vZGQJPSB2ZG1hMS5iYXNlX2V2ZW4gKyAodmRtYTEucGl0Y2gvMik7CgkJdmRtYTEucHJvdF9hZGRyCT0gYnVmLT5wdFswXS5vZmZzZXQrKHZkbWExLnBpdGNoLzIpKmhlaWdodDsKCX0KCglpZiAoVjRMMl9GSUVMRF9IQVNfQk9USChmaWVsZCkpIHsKCX0gZWxzZSBpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9BTFRFUk5BVEUpIHsKCQkvKiBmaXhtZSAqLwoJCWlmICggdnYtPmxhc3RfZmllbGQgPT0gVjRMMl9GSUVMRF9UT1AgKSB7CgkJCXZkbWExLmJhc2Vfb2RkCT0gdmRtYTEucHJvdF9hZGRyOwoJCQl2ZG1hMS5waXRjaCAvPSAyOwoJCX0gZWxzZSBpZiAoIHZ2LT5sYXN0X2ZpZWxkID09IFY0TDJfRklFTERfQk9UVE9NICkgewoJCQl2ZG1hMS5iYXNlX29kZAk9IHZkbWExLmJhc2VfZXZlbjsKCQkJdmRtYTEuYmFzZV9ldmVuID0gdmRtYTEucHJvdF9hZGRyOwoJCQl2ZG1hMS5waXRjaCAvPSAyOwoJCX0KCX0gZWxzZSBpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9UT1ApIHsKCQl2ZG1hMS5iYXNlX29kZAk9IHZkbWExLnByb3RfYWRkcjsKCQl2ZG1hMS5waXRjaCAvPSAyOwoJfSBlbHNlIGlmIChmaWVsZCA9PSBWNEwyX0ZJRUxEX0JPVFRPTSkgewoJCXZkbWExLmJhc2Vfb2RkCT0gdmRtYTEuYmFzZV9ldmVuOwoJCXZkbWExLmJhc2VfZXZlbiA9IHZkbWExLnByb3RfYWRkcjsKCQl2ZG1hMS5waXRjaCAvPSAyOwoJfQoKCWlmKCAwICE9IHZ2LT52ZmxpcCApIHsKCQl2ZG1hMS5waXRjaCAqPSAtMTsKCX0KCglzYWE3MTQ2X3dyaXRlX291dF9kbWEoZGV2LCAxLCAmdmRtYTEpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgY2FsY19wbGFuYXJfNDIyKHN0cnVjdCBzYWE3MTQ2X3Z2ICp2diwgc3RydWN0IHNhYTcxNDZfYnVmICpidWYsIHN0cnVjdCBzYWE3MTQ2X3ZpZGVvX2RtYSAqdmRtYTIsIHN0cnVjdCBzYWE3MTQ2X3ZpZGVvX2RtYSAqdmRtYTMpCnsKCWludCBoZWlnaHQgPSBidWYtPmZtdC0+aGVpZ2h0OwoJaW50IHdpZHRoID0gYnVmLT5mbXQtPndpZHRoOwoKCXZkbWEyLT5waXRjaAk9IHdpZHRoOwoJdmRtYTMtPnBpdGNoCT0gd2lkdGg7CgoJLyogZml4bWU6IGxvb2sgYXQgYnl0ZXNwZXJsaW5lISAqLwoKCWlmKCAwICE9IHZ2LT52ZmxpcCApIHsKCQl2ZG1hMi0+cHJvdF9hZGRyCT0gYnVmLT5wdFsxXS5vZmZzZXQ7CgkJdmRtYTItPmJhc2VfZXZlbgk9ICgodmRtYTItPnBpdGNoLzIpKmhlaWdodCkrYnVmLT5wdFsxXS5vZmZzZXQ7CgkJdmRtYTItPmJhc2Vfb2RkCQk9IHZkbWEyLT5iYXNlX2V2ZW4gLSAodmRtYTItPnBpdGNoLzIpOwoKCQl2ZG1hMy0+cHJvdF9hZGRyCT0gYnVmLT5wdFsyXS5vZmZzZXQ7CgkJdmRtYTMtPmJhc2VfZXZlbgk9ICgodmRtYTMtPnBpdGNoLzIpKmhlaWdodCkrYnVmLT5wdFsyXS5vZmZzZXQ7CgkJdmRtYTMtPmJhc2Vfb2RkCQk9IHZkbWEzLT5iYXNlX2V2ZW4gLSAodmRtYTMtPnBpdGNoLzIpOwoJfSBlbHNlIHsKCQl2ZG1hMy0+YmFzZV9ldmVuCT0gYnVmLT5wdFsyXS5vZmZzZXQ7CgkJdmRtYTMtPmJhc2Vfb2RkCQk9IHZkbWEzLT5iYXNlX2V2ZW4gKyAodmRtYTMtPnBpdGNoLzIpOwoJCXZkbWEzLT5wcm90X2FkZHIJPSAodmRtYTMtPnBpdGNoLzIpKmhlaWdodCtidWYtPnB0WzJdLm9mZnNldDsKCgkJdmRtYTItPmJhc2VfZXZlbgk9IGJ1Zi0+cHRbMV0ub2Zmc2V0OwoJCXZkbWEyLT5iYXNlX29kZAkJPSB2ZG1hMi0+YmFzZV9ldmVuICsgKHZkbWEyLT5waXRjaC8yKTsKCQl2ZG1hMi0+cHJvdF9hZGRyCT0gKHZkbWEyLT5waXRjaC8yKSpoZWlnaHQrYnVmLT5wdFsxXS5vZmZzZXQ7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgY2FsY19wbGFuYXJfNDIwKHN0cnVjdCBzYWE3MTQ2X3Z2ICp2diwgc3RydWN0IHNhYTcxNDZfYnVmICpidWYsIHN0cnVjdCBzYWE3MTQ2X3ZpZGVvX2RtYSAqdmRtYTIsIHN0cnVjdCBzYWE3MTQ2X3ZpZGVvX2RtYSAqdmRtYTMpCnsKCWludCBoZWlnaHQgPSBidWYtPmZtdC0+aGVpZ2h0OwoJaW50IHdpZHRoID0gYnVmLT5mbXQtPndpZHRoOwoKCXZkbWEyLT5waXRjaAk9IHdpZHRoLzI7Cgl2ZG1hMy0+cGl0Y2gJPSB3aWR0aC8yOwoKCWlmKCAwICE9IHZ2LT52ZmxpcCApIHsKCQl2ZG1hMi0+cHJvdF9hZGRyCT0gYnVmLT5wdFsyXS5vZmZzZXQ7CgkJdmRtYTItPmJhc2VfZXZlbgk9ICgodmRtYTItPnBpdGNoLzIpKmhlaWdodCkrYnVmLT5wdFsyXS5vZmZzZXQ7CgkJdmRtYTItPmJhc2Vfb2RkCQk9IHZkbWEyLT5iYXNlX2V2ZW4gLSAodmRtYTItPnBpdGNoLzIpOwoKCQl2ZG1hMy0+cHJvdF9hZGRyCT0gYnVmLT5wdFsxXS5vZmZzZXQ7CgkJdmRtYTMtPmJhc2VfZXZlbgk9ICgodmRtYTMtPnBpdGNoLzIpKmhlaWdodCkrYnVmLT5wdFsxXS5vZmZzZXQ7CgkJdmRtYTMtPmJhc2Vfb2RkCQk9IHZkbWEzLT5iYXNlX2V2ZW4gLSAodmRtYTMtPnBpdGNoLzIpOwoKCX0gZWxzZSB7CgkJdmRtYTMtPmJhc2VfZXZlbgk9IGJ1Zi0+cHRbMl0ub2Zmc2V0OwoJCXZkbWEzLT5iYXNlX29kZAkJPSB2ZG1hMy0+YmFzZV9ldmVuICsgKHZkbWEzLT5waXRjaCk7CgkJdmRtYTMtPnByb3RfYWRkcgk9ICh2ZG1hMy0+cGl0Y2gvMikqaGVpZ2h0K2J1Zi0+cHRbMl0ub2Zmc2V0OwoKCQl2ZG1hMi0+YmFzZV9ldmVuCT0gYnVmLT5wdFsxXS5vZmZzZXQ7CgkJdmRtYTItPmJhc2Vfb2RkCQk9IHZkbWEyLT5iYXNlX2V2ZW4gKyAodmRtYTItPnBpdGNoKTsKCQl2ZG1hMi0+cHJvdF9hZGRyCT0gKHZkbWEyLT5waXRjaC8yKSpoZWlnaHQrYnVmLT5wdFsxXS5vZmZzZXQ7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBjYWxjdWxhdGVfdmlkZW9fZG1hX2dyYWJfcGxhbmFyKHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2LCBzdHJ1Y3Qgc2FhNzE0Nl9idWYgKmJ1ZikKewoJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwoJc3RydWN0IHNhYTcxNDZfdmlkZW9fZG1hIHZkbWExOwoJc3RydWN0IHNhYTcxNDZfdmlkZW9fZG1hIHZkbWEyOwoJc3RydWN0IHNhYTcxNDZfdmlkZW9fZG1hIHZkbWEzOwoKCXN0cnVjdCBzYWE3MTQ2X2Zvcm1hdCAqc2ZtdCA9IGZvcm1hdF9ieV9mb3VyY2MoZGV2LGJ1Zi0+Zm10LT5waXhlbGZvcm1hdCk7CgoJaW50IHdpZHRoID0gYnVmLT5mbXQtPndpZHRoOwoJaW50IGhlaWdodCA9IGJ1Zi0+Zm10LT5oZWlnaHQ7CgllbnVtIHY0bDJfZmllbGQgZmllbGQgPSBidWYtPmZtdC0+ZmllbGQ7CgoJQlVHX09OKDAgPT0gYnVmLT5wdFswXS5kbWEpOwoJQlVHX09OKDAgPT0gYnVmLT5wdFsxXS5kbWEpOwoJQlVHX09OKDAgPT0gYnVmLT5wdFsyXS5kbWEpOwoKCURFQl9DQVAoKCJbc2l6ZT0lZHglZCxmaWVsZHM9JXNdXG4iLAoJCXdpZHRoLGhlaWdodCx2NGwyX2ZpZWxkX25hbWVzW2ZpZWxkXSkpOwoKCS8qIGZpeG1lOiBsb29rIGF0IGJ5dGVzcGVybGluZSEgKi8KCgkvKiBmaXhtZTogd2hhdCBoYXBwZW5zIGZvciB1c2VyIHNwYWNlIGJ1ZmZlcnMgaGVyZT8uIFRoZSBvZmZzZXRzIGFyZQoJICAgbW9zdCBsaWtlbHkgd3JvbmcsIHRoaXMgdmVyc2lvbiBoZXJlIG9ubHkgd29ya3MgZm9yIHBhZ2UtYWxpZ25lZAoJICAgYnVmZmVycywgbW9kaWZpY2F0aW9ucyB0byB0aGUgcGFnZXRhYmxlLWZ1bmN0aW9ucyBhcmUgbmVjZXNzYXJ5Li4uKi8KCgl2ZG1hMS5waXRjaAkJPSB3aWR0aCoyOwoJdmRtYTEubnVtX2xpbmVfYnl0ZQk9ICgodnYtPnN0YW5kYXJkLT52X2ZpZWxkPDwxNikgKyB2di0+c3RhbmRhcmQtPmhfcGl4ZWxzKTsKCXZkbWExLmJhc2VfcGFnZQkJPSBidWYtPnB0WzBdLmRtYSB8IE1FMTsKCglpZiggMCAhPSB2di0+dmZsaXAgKSB7CgkJdmRtYTEucHJvdF9hZGRyCT0gYnVmLT5wdFswXS5vZmZzZXQ7CgkJdmRtYTEuYmFzZV9ldmVuCT0gKCh2ZG1hMS5waXRjaC8yKSpoZWlnaHQpK2J1Zi0+cHRbMF0ub2Zmc2V0OwoJCXZkbWExLmJhc2Vfb2RkCT0gdmRtYTEuYmFzZV9ldmVuIC0gKHZkbWExLnBpdGNoLzIpOwoJfSBlbHNlIHsKCQl2ZG1hMS5iYXNlX2V2ZW4JPSBidWYtPnB0WzBdLm9mZnNldDsKCQl2ZG1hMS5iYXNlX29kZAk9IHZkbWExLmJhc2VfZXZlbiArICh2ZG1hMS5waXRjaC8yKTsKCQl2ZG1hMS5wcm90X2FkZHIJPSAodmRtYTEucGl0Y2gvMikqaGVpZ2h0K2J1Zi0+cHRbMF0ub2Zmc2V0OwoJfQoKCXZkbWEyLm51bV9saW5lX2J5dGUJPSAwOyAvKiB1bnVzZWQgKi8KCXZkbWEyLmJhc2VfcGFnZQkJPSBidWYtPnB0WzFdLmRtYSB8IE1FMTsKCgl2ZG1hMy5udW1fbGluZV9ieXRlCT0gMDsgLyogdW51c2VkICovCgl2ZG1hMy5iYXNlX3BhZ2UJCT0gYnVmLT5wdFsyXS5kbWEgfCBNRTE7CgoJc3dpdGNoKCBzZm10LT5kZXB0aCApIHsKCQljYXNlIDEyOiB7CgkJCWNhbGNfcGxhbmFyXzQyMCh2dixidWYsJnZkbWEyLCZ2ZG1hMyk7CgkJCWJyZWFrOwoJCX0KCQljYXNlIDE2OiB7CgkJCWNhbGNfcGxhbmFyXzQyMih2dixidWYsJnZkbWEyLCZ2ZG1hMyk7CgkJCWJyZWFrOwoJCX0KCQlkZWZhdWx0OiB7CgkJCXJldHVybiAtMTsKCQl9Cgl9CgoJaWYgKFY0TDJfRklFTERfSEFTX0JPVEgoZmllbGQpKSB7Cgl9IGVsc2UgaWYgKGZpZWxkID09IFY0TDJfRklFTERfQUxURVJOQVRFKSB7CgkJLyogZml4bWUgKi8KCQl2ZG1hMS5iYXNlX29kZAk9IHZkbWExLnByb3RfYWRkcjsKCQl2ZG1hMS5waXRjaCAvPSAyOwoJCXZkbWEyLmJhc2Vfb2RkCT0gdmRtYTIucHJvdF9hZGRyOwoJCXZkbWEyLnBpdGNoIC89IDI7CgkJdmRtYTMuYmFzZV9vZGQJPSB2ZG1hMy5wcm90X2FkZHI7CgkJdmRtYTMucGl0Y2ggLz0gMjsKCX0gZWxzZSBpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9UT1ApIHsKCQl2ZG1hMS5iYXNlX29kZAk9IHZkbWExLnByb3RfYWRkcjsKCQl2ZG1hMS5waXRjaCAvPSAyOwoJCXZkbWEyLmJhc2Vfb2RkCT0gdmRtYTIucHJvdF9hZGRyOwoJCXZkbWEyLnBpdGNoIC89IDI7CgkJdmRtYTMuYmFzZV9vZGQJPSB2ZG1hMy5wcm90X2FkZHI7CgkJdmRtYTMucGl0Y2ggLz0gMjsKCX0gZWxzZSBpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9CT1RUT00pIHsKCQl2ZG1hMS5iYXNlX29kZAk9IHZkbWExLmJhc2VfZXZlbjsKCQl2ZG1hMS5iYXNlX2V2ZW4gPSB2ZG1hMS5wcm90X2FkZHI7CgkJdmRtYTEucGl0Y2ggLz0gMjsKCQl2ZG1hMi5iYXNlX29kZAk9IHZkbWEyLmJhc2VfZXZlbjsKCQl2ZG1hMi5iYXNlX2V2ZW4gPSB2ZG1hMi5wcm90X2FkZHI7CgkJdmRtYTIucGl0Y2ggLz0gMjsKCQl2ZG1hMy5iYXNlX29kZAk9IHZkbWEzLmJhc2VfZXZlbjsKCQl2ZG1hMy5iYXNlX2V2ZW4gPSB2ZG1hMy5wcm90X2FkZHI7CgkJdmRtYTMucGl0Y2ggLz0gMjsKCX0KCglpZiggMCAhPSB2di0+dmZsaXAgKSB7CgkJdmRtYTEucGl0Y2ggKj0gLTE7CgkJdmRtYTIucGl0Y2ggKj0gLTE7CgkJdmRtYTMucGl0Y2ggKj0gLTE7Cgl9CgoJc2FhNzE0Nl93cml0ZV9vdXRfZG1hKGRldiwgMSwgJnZkbWExKTsKCWlmKCAoc2ZtdC0+ZmxhZ3MgJiBGT1JNQVRfQllURV9TV0FQKSAhPSAwICkgewoJCXNhYTcxNDZfd3JpdGVfb3V0X2RtYShkZXYsIDMsICZ2ZG1hMik7CgkJc2FhNzE0Nl93cml0ZV9vdXRfZG1hKGRldiwgMiwgJnZkbWEzKTsKCX0gZWxzZSB7CgkJc2FhNzE0Nl93cml0ZV9vdXRfZG1hKGRldiwgMiwgJnZkbWEyKTsKCQlzYWE3MTQ2X3dyaXRlX291dF9kbWEoZGV2LCAzLCAmdmRtYTMpOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIHByb2dyYW1fY2FwdHVyZV9lbmdpbmUoc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIGludCBwbGFuYXIpCnsKCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKCWludCBjb3VudCA9IDA7CgoJdW5zaWduZWQgbG9uZyBlX3dhaXQgPSB2di0+Y3VycmVudF9ocHNfc3luYyA9PSBTQUE3MTQ2X0hQU19TWU5DX1BPUlRfQSA/IENNRF9FX0ZJRF9BIDogQ01EX0VfRklEX0I7Cgl1bnNpZ25lZCBsb25nIG9fd2FpdCA9IHZ2LT5jdXJyZW50X2hwc19zeW5jID09IFNBQTcxNDZfSFBTX1NZTkNfUE9SVF9BID8gQ01EX09fRklEX0EgOiBDTURfT19GSURfQjsKCgkvKiB3YWl0IGZvciBvX2ZpZF9hL2IgLyBlX2ZpZF9hL2IgdG9nZ2xlIG9ubHkgaWYgcnBzIHJlZ2lzdGVyIDAgaXMgbm90IHNldCovCglXUklURV9SUFMwKENNRF9QQVVTRSB8IENNRF9PQU4gfCBDTURfU0lHMCB8IG9fd2FpdCk7CglXUklURV9SUFMwKENNRF9QQVVTRSB8IENNRF9PQU4gfCBDTURfU0lHMCB8IGVfd2FpdCk7CgoJLyogc2V0IHJwcyByZWdpc3RlciAwICovCglXUklURV9SUFMwKENNRF9XUl9SRUcgfCAoMSA8PCA4KSB8IChNQzIvNCkpOwoJV1JJVEVfUlBTMChNQVNLXzI3IHwgTUFTS18xMSk7CgoJLyogdHVybiBvbiB2aWRlby1kbWExICovCglXUklURV9SUFMwKENNRF9XUl9SRUdfTUFTSyB8IChNQzEvNCkpOwoJV1JJVEVfUlBTMChNQVNLXzA2IHwgTUFTS18yMik7CQkJLyogPT4gbWFzayAqLwoJV1JJVEVfUlBTMChNQVNLXzA2IHwgTUFTS18yMik7CQkJLyogPT4gdmFsdWVzICovCglpZiggMCAhPSBwbGFuYXIgKSB7CgkJLyogdHVybiBvbiB2aWRlby1kbWEyICovCgkJV1JJVEVfUlBTMChDTURfV1JfUkVHX01BU0sgfCAoTUMxLzQpKTsKCQlXUklURV9SUFMwKE1BU0tfMDUgfCBNQVNLXzIxKTsJCQkvKiA9PiBtYXNrICovCgkJV1JJVEVfUlBTMChNQVNLXzA1IHwgTUFTS18yMSk7CQkJLyogPT4gdmFsdWVzICovCgoJCS8qIHR1cm4gb24gdmlkZW8tZG1hMyAqLwoJCVdSSVRFX1JQUzAoQ01EX1dSX1JFR19NQVNLIHwgKE1DMS80KSk7CgkJV1JJVEVfUlBTMChNQVNLXzA0IHwgTUFTS18yMCk7CQkJLyogPT4gbWFzayAqLwoJCVdSSVRFX1JQUzAoTUFTS18wNCB8IE1BU0tfMjApOwkJCS8qID0+IHZhbHVlcyAqLwoJfQoKCS8qIHdhaXQgZm9yIG9fZmlkX2EvYiAvIGVfZmlkX2EvYiB0b2dnbGUgKi8KCWlmICggdnYtPmxhc3RfZmllbGQgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEICkgewoJCVdSSVRFX1JQUzAoQ01EX1BBVVNFIHwgb193YWl0KTsKCQlXUklURV9SUFMwKENNRF9QQVVTRSB8IGVfd2FpdCk7Cgl9IGVsc2UgaWYgKCB2di0+bGFzdF9maWVsZCA9PSBWNEwyX0ZJRUxEX1RPUCApIHsKCQlXUklURV9SUFMwKENNRF9QQVVTRSB8ICh2di0+Y3VycmVudF9ocHNfc3luYyA9PSBTQUE3MTQ2X0hQU19TWU5DX1BPUlRfQSA/IE1BU0tfMTAgOiBNQVNLXzA5KSk7CgkJV1JJVEVfUlBTMChDTURfUEFVU0UgfCBvX3dhaXQpOwoJfSBlbHNlIGlmICggdnYtPmxhc3RfZmllbGQgPT0gVjRMMl9GSUVMRF9CT1RUT00gKSB7CgkJV1JJVEVfUlBTMChDTURfUEFVU0UgfCAodnYtPmN1cnJlbnRfaHBzX3N5bmMgPT0gU0FBNzE0Nl9IUFNfU1lOQ19QT1JUX0EgPyBNQVNLXzEwIDogTUFTS18wOSkpOwoJCVdSSVRFX1JQUzAoQ01EX1BBVVNFIHwgZV93YWl0KTsKCX0KCgkvKiB0dXJuIG9mZiB2aWRlby1kbWExICovCglXUklURV9SUFMwKENNRF9XUl9SRUdfTUFTSyB8IChNQzEvNCkpOwoJV1JJVEVfUlBTMChNQVNLXzIyIHwgTUFTS18wNik7CQkJLyogPT4gbWFzayAqLwoJV1JJVEVfUlBTMChNQVNLXzIyKTsJCQkJLyogPT4gdmFsdWVzICovCglpZiggMCAhPSBwbGFuYXIgKSB7CgkJLyogdHVybiBvZmYgdmlkZW8tZG1hMiAqLwoJCVdSSVRFX1JQUzAoQ01EX1dSX1JFR19NQVNLIHwgKE1DMS80KSk7CgkJV1JJVEVfUlBTMChNQVNLXzA1IHwgTUFTS18yMSk7CQkJLyogPT4gbWFzayAqLwoJCVdSSVRFX1JQUzAoTUFTS18yMSk7CQkJCS8qID0+IHZhbHVlcyAqLwoKCQkvKiB0dXJuIG9mZiB2aWRlby1kbWEzICovCgkJV1JJVEVfUlBTMChDTURfV1JfUkVHX01BU0sgfCAoTUMxLzQpKTsKCQlXUklURV9SUFMwKE1BU0tfMDQgfCBNQVNLXzIwKTsJCQkvKiA9PiBtYXNrICovCgkJV1JJVEVfUlBTMChNQVNLXzIwKTsJCQkJLyogPT4gdmFsdWVzICovCgl9CgoJLyogZ2VuZXJhdGUgaW50ZXJydXB0ICovCglXUklURV9SUFMwKENNRF9JTlRFUlJVUFQpOwoKCS8qIHN0b3AgKi8KCVdSSVRFX1JQUzAoQ01EX1NUT1ApOwp9Cgp2b2lkIHNhYTcxNDZfc2V0X2NhcHR1cmUoc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIHN0cnVjdCBzYWE3MTQ2X2J1ZiAqYnVmLCBzdHJ1Y3Qgc2FhNzE0Nl9idWYgKm5leHQpCnsKCXN0cnVjdCBzYWE3MTQ2X2Zvcm1hdCAqc2ZtdCA9IGZvcm1hdF9ieV9mb3VyY2MoZGV2LGJ1Zi0+Zm10LT5waXhlbGZvcm1hdCk7CglzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7Cgl1MzIgdmRtYTFfcHJvdF9hZGRyOwoKCURFQl9DQVAoKCJidWY6JXAsIG5leHQ6JXBcbiIsYnVmLG5leHQpKTsKCgl2ZG1hMV9wcm90X2FkZHIgPSBzYWE3MTQ2X3JlYWQoZGV2LCBQUk9UX0FERFIxKTsKCWlmKCAwID09IHZkbWExX3Byb3RfYWRkciApIHsKCQkvKiBjbGVhciBvdXQgYmVnaW5uaW5nIG9mIHN0cmVhbWluZyBiaXQgKHJwcyByZWdpc3RlciAwKSovCgkJREVCX0NBUCgoImZvcmNpbmcgc3luYyB0byBuZXcgZnJhbWVcbiIpKTsKCQlzYWE3MTQ2X3dyaXRlKGRldiwgTUMyLCBNQVNLXzI3ICk7Cgl9CgoJc2FhNzE0Nl9zZXRfd2luZG93KGRldiwgYnVmLT5mbXQtPndpZHRoLCBidWYtPmZtdC0+aGVpZ2h0LCBidWYtPmZtdC0+ZmllbGQpOwoJc2FhNzE0Nl9zZXRfb3V0cHV0X2Zvcm1hdChkZXYsIHNmbXQtPnRyYW5zKTsKCXNhYTcxNDZfZGlzYWJsZV9jbGlwcGluZyhkZXYpOwoKCWlmICggdnYtPmxhc3RfZmllbGQgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEICkgewoJfSBlbHNlIGlmICggdnYtPmxhc3RfZmllbGQgPT0gVjRMMl9GSUVMRF9UT1AgKSB7CgkJdnYtPmxhc3RfZmllbGQgPSBWNEwyX0ZJRUxEX0JPVFRPTTsKCX0gZWxzZSBpZiAoIHZ2LT5sYXN0X2ZpZWxkID09IFY0TDJfRklFTERfQk9UVE9NICkgewoJCXZ2LT5sYXN0X2ZpZWxkID0gVjRMMl9GSUVMRF9UT1A7Cgl9CgoJaWYoIDAgIT0gSVNfUExBTkFSKHNmbXQtPnRyYW5zKSkgewoJCWNhbGN1bGF0ZV92aWRlb19kbWFfZ3JhYl9wbGFuYXIoZGV2LCBidWYpOwoJCXByb2dyYW1fY2FwdHVyZV9lbmdpbmUoZGV2LDEpOwoJfSBlbHNlIHsKCQljYWxjdWxhdGVfdmlkZW9fZG1hX2dyYWJfcGFja2VkKGRldiwgYnVmKTsKCQlwcm9ncmFtX2NhcHR1cmVfZW5naW5lKGRldiwwKTsKCX0KCi8qCglwcmludGsoInZkbWElZC5iYXNlX2V2ZW46ICAgICAweCUwOHhcbiIsIDEsc2FhNzE0Nl9yZWFkKGRldixCQVNFX0VWRU4xKSk7CglwcmludGsoInZkbWElZC5iYXNlX29kZDogICAgICAweCUwOHhcbiIsIDEsc2FhNzE0Nl9yZWFkKGRldixCQVNFX09ERDEpKTsKCXByaW50aygidmRtYSVkLnByb3RfYWRkcjogICAgIDB4JTA4eFxuIiwgMSxzYWE3MTQ2X3JlYWQoZGV2LFBST1RfQUREUjEpKTsKCXByaW50aygidmRtYSVkLmJhc2VfcGFnZTogICAgIDB4JTA4eFxuIiwgMSxzYWE3MTQ2X3JlYWQoZGV2LEJBU0VfUEFHRTEpKTsKCXByaW50aygidmRtYSVkLnBpdGNoOiAgICAgICAgIDB4JTA4eFxuIiwgMSxzYWE3MTQ2X3JlYWQoZGV2LFBJVENIMSkpOwoJcHJpbnRrKCJ2ZG1hJWQubnVtX2xpbmVfYnl0ZTogMHglMDh4XG4iLCAxLHNhYTcxNDZfcmVhZChkZXYsTlVNX0xJTkVfQllURTEpKTsKCXByaW50aygidmRtYSVkID0+IHZwdHIgICAgICA6IDB4JTA4eFxuIiwgMSxzYWE3MTQ2X3JlYWQoZGV2LFBDSV9WRFAxKSk7CiovCgoJLyogd3JpdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIHJwcy1wcm9ncmFtICovCglzYWE3MTQ2X3dyaXRlKGRldiwgUlBTX0FERFIwLCBkZXYtPmRfcnBzMC5kbWFfaGFuZGxlKTsKCgkvKiB0dXJuIG9uIHJwcyAqLwoJc2FhNzE0Nl93cml0ZShkZXYsIE1DMSwgKE1BU0tfMTIgfCBNQVNLXzI4KSk7Cn0K