I2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bWVkaWEvc2FhNzE0Nl92di5oPgoKc3RhdGljIHZvaWQgY2FsY3VsYXRlX291dHB1dF9mb3JtYXRfcmVnaXN0ZXIoc3RydWN0IHNhYTcxNDZfZGV2KiBzYWEsIHUzMiBwYWxldHRlLCB1MzIqIGNsaXBfZm9ybWF0KQp7CgkvKiBjbGVhciBvdXQgdGhlIG5lY2Vzc2FyeSBiaXRzICovCgkqY2xpcF9mb3JtYXQgJj0gMHgwMDAwZmZmZjsKCS8qIHNldCB0aGVzZSBiaXRzIG5ldyAqLwoJKmNsaXBfZm9ybWF0IHw9ICAoKCAoKHBhbGV0dGUmMHhmMDApPj44KSA8PCAzMCkgfCAoKHBhbGV0dGUmMHgwMGYpIDw8IDI0KSB8ICgoKHBhbGV0dGUmMHgwZjApPj40KSA8PCAxNikpOwp9CgpzdGF0aWMgdm9pZCBjYWxjdWxhdGVfaHBzX3NvdXJjZV9hbmRfc3luYyhzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgaW50IHNvdXJjZSwgaW50IHN5bmMsIHUzMiogaHBzX2N0cmwpCnsKCSpocHNfY3RybCAmPSB+KE1BU0tfMzAgfCBNQVNLXzMxIHwgTUFTS18yOCk7CgkqaHBzX2N0cmwgfD0gKHNvdXJjZSA8PCAzMCkgfCAoc3luYyA8PCAyOCk7Cn0KCnN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9oeG9fYW5kX2h5byhzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYsIHUzMiogaHBzX2hfc2NhbGUsIHUzMiogaHBzX2N0cmwpCnsKCWludCBoeW8gPSAwLCBoeG8gPSAwOwoKCWh5byA9IHZ2LT5zdGFuZGFyZC0+dl9vZmZzZXQ7CgloeG8gPSB2di0+c3RhbmRhcmQtPmhfb2Zmc2V0OwoKCSpocHNfaF9zY2FsZQkmPSB+KE1BU0tfQjAgfCAweGYwMCk7CgkqaHBzX2hfc2NhbGUJfD0gKGh4byA8PCAgMCk7CgoJKmhwc19jdHJsCSY9IH4oTUFTS19XMCB8IE1BU0tfQjIpOwoJKmhwc19jdHJsCXw9IChoeW8gPDwgMTIpOwp9CgovKiBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGhvcml6b250YWwtIGFuZCB2ZXJ0aWNhbAogICBzY2FsaW5nIHJlZ2lzdGVycywgY2xpcC1mb3JtYXQtcmVnaXN0ZXIgZXRjIC4uLgogICB0aGVzZSBmdW5jdGlvbnMgdGFrZSBwb2ludGVycyB0byB0aGUgKG1vc3QtbGlrZWx5IHJlYWQtb3V0CiAgIG9yaWdpbmFsLXZhbHVlcykgYW5kIG1hbmlwdWxhdGUgdGhlbSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZAogICBjaGFuZ2VzLgoqLwoKLyogaHBzX2NvZWZmIHVzZWQgZm9yIENYWSBhbmQgQ1hVVjsgc2NhbGUgMS8xIC0+IHNjYWxlIDEvNjQgKi8Kc3RhdGljIHN0cnVjdCB7Cgl1MTYgaHBzX2NvZWZmOwoJdTE2IHdlaWdodF9zdW07Cn0gaHBzX2hfY29lZmZfdGFiIFtdID0gewoJezB4MDAsICAgMn0sIHsweDAyLCAgIDR9LCB7MHgwMCwgICA0fSwgezB4MDYsICAgOH0sIHsweDAyLCAgIDh9LAoJezB4MDgsICAgOH0sIHsweDAwLCAgIDh9LCB7MHgxRSwgIDE2fSwgezB4MEUsICAgOH0sIHsweDI2LCAgIDh9LAoJezB4MDYsICAgOH0sIHsweDQyLCAgIDh9LCB7MHgwMiwgICA4fSwgezB4ODAsICAgOH0sIHsweDAwLCAgIDh9LAoJezB4RkUsICAxNn0sIHsweEZFLCAgIDh9LCB7MHg3RSwgICA4fSwgezB4N0UsICAgOH0sIHsweDNFLCAgIDh9LAoJezB4M0UsICAgOH0sIHsweDFFLCAgIDh9LCB7MHgxRSwgICA4fSwgezB4MEUsICAgOH0sIHsweDBFLCAgIDh9LAoJezB4MDYsICAgOH0sIHsweDA2LCAgIDh9LCB7MHgwMiwgICA4fSwgezB4MDIsICAgOH0sIHsweDAwLCAgIDh9LAoJezB4MDAsICAgOH0sIHsweEZFLCAgMTZ9LCB7MHhGRSwgICA4fSwgezB4RkUsICAgOH0sIHsweEZFLCAgIDh9LAoJezB4RkUsICAgOH0sIHsweEZFLCAgIDh9LCB7MHhGRSwgICA4fSwgezB4RkUsICAgOH0sIHsweEZFLCAgIDh9LAoJezB4RkUsICAgOH0sIHsweEZFLCAgIDh9LCB7MHhGRSwgICA4fSwgezB4RkUsICAgOH0sIHsweEZFLCAgIDh9LAoJezB4RkUsICAgOH0sIHsweEZFLCAgIDh9LCB7MHhGRSwgICA4fSwgezB4RkUsICAgOH0sIHsweDdFLCAgIDh9LAoJezB4N0UsICAgOH0sIHsweDNFLCAgIDh9LCB7MHgzRSwgICA4fSwgezB4MUUsICAgOH0sIHsweDFFLCAgIDh9LAoJezB4MEUsICAgOH0sIHsweDBFLCAgIDh9LCB7MHgwNiwgICA4fSwgezB4MDYsICAgOH0sIHsweDAyLCAgIDh9LAoJezB4MDIsICAgOH0sIHsweDAwLCAgIDh9LCB7MHgwMCwgICA4fSwgezB4RkUsICAxNn0KfTsKCi8qIHRhYmxlIG9mIGF0dGVudWF0aW9uIHZhbHVlcyBmb3IgaG9yaXpvbnRhbCBzY2FsaW5nICovCnN0YXRpYyB1OCBoX2F0dGVudWF0aW9uW10gPSB7IDEsIDIsIDQsIDgsIDIsIDQsIDgsIDE2LCAwfTsKCi8qIGNhbGN1bGF0ZSBob3Jpem9udGFsIHNjYWxlIHJlZ2lzdGVycyAqLwpzdGF0aWMgaW50IGNhbGN1bGF0ZV9oX3NjYWxlX3JlZ2lzdGVycyhzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwKCWludCBpbl94LCBpbnQgb3V0X3gsIGludCBmbGlwX2xyLAoJdTMyKiBocHNfY3RybCwgdTMyKiBocHNfdl9nYWluLCB1MzIqIGhwc19oX3ByZXNjYWxlLCB1MzIqIGhwc19oX3NjYWxlKQp7CgkvKiBob3Jpem9udGFsIHByZXNjYWxlciAqLwoJdTMyIGRjZ3ggPSAwLCB4cHNjID0gMCwgeGFjbSA9IDAsIGN4eSA9IDAsIGN4dXYgPSAwOwoJLyogaG9yaXpvbnRhbCBzY2FsZXIgKi8KCXUzMiB4aW0gPSAwLCB4cCA9IDAsIHhzY2kgPTA7CgkvKiB2ZXJ0aWNhbCBzY2FsZSAmIGdhaW4gKi8KCXUzMiBwZnV2ID0gMDsKCgkvKiBoZWxwZXIgdmFyaWFibGVzICovCgl1MzIgaF9hdHRlbiA9IDAsIGkgPSAwOwoKCWlmICggMCA9PSBvdXRfeCApIHsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvKiBtYXNrIG91dCB2YW5pdHktYml0ICovCgkqaHBzX2N0cmwgJj0gfk1BU0tfMjk7CgoJLyogY2FsY3VsYXRlIHByZXNjYWxlLSh4c3BjKS12YWx1ZToJW24gICAuLiAxLzIpIDogMQoJCQkJCQlbMS8yIC4uIDEvMykgOiAyCgkJCQkJCVsxLzMgLi4gMS80KSA6IDMKCQkJCQkJLi4uCQkqLwoJaWYgKGluX3ggPiBvdXRfeCkgewoJCXhwc2MgPSBpbl94IC8gb3V0X3g7Cgl9CgllbHNlIHsKCQkvKiB6b29taW5nICovCgkJeHBzYyA9IDE7Cgl9CgoJLyogaWYgZmxpcF9sci1iaXQgaXMgc2V0LCBudW1iZXIgb2YgcGl4ZWxzIGFmdGVyCgkgICBob3Jpem9udGFsIHByZXNjYWxpbmcgbXVzdCBiZSA8IDM4NCAqLwoJaWYgKCAwICE9IGZsaXBfbHIgKSB7CgoJCS8qIHNldCB2YW5pdHkgYml0ICovCgkJKmhwc19jdHJsIHw9IE1BU0tfMjk7CgoJCXdoaWxlIChpbl94IC8geHBzYyA+PSAzODQgKQoJCQl4cHNjKys7Cgl9CgkvKiBpZiB6b29taW5nIGlzIHdhbnRlZCwgbnVtYmVyIG9mIHBpeGVscyBhZnRlcgoJICAgaG9yaXpvbnRhbCBwcmVzY2FsaW5nIG11c3QgYmUgPCA3NjggKi8KCWVsc2UgewoJCXdoaWxlICggaW5feCAvIHhwc2MgPj0gNzY4ICkKCQkJeHBzYysrOwoJfQoKCS8qIG1heGltdW0gcHJlc2NhbGUgaXMgNjQgKHAuNjkpICovCglpZiAoIHhwc2MgPiA2NCApCgkJeHBzYyA9IDY0OwoKCS8qIGtlZXAgeGFjbSBjbGVhciovCgl4YWNtID0gMDsKCgkvKiBzZXQgaG9yaXpvbnRhbCBmaWx0ZXIgcGFyYW1ldGVycyAoQ1hZID0gQ1hVVikgKi8KCWN4eSA9IGhwc19oX2NvZWZmX3RhYlsoICh4cHNjIC0gMSkgPCA2MyA/ICh4cHNjIC0gMSkgOiA2MyApXS5ocHNfY29lZmY7CgljeHV2ID0gY3h5OwoKCS8qIGNhbGN1bGF0ZSBhbmQgc2V0IGhvcml6b250YWwgZmluZSBzY2FsZSAoeHNjaSkgKi8KCgkvKiBieXBhc3MgdGhlIGhvcml6b250YWwgc2NhbGVyID8gKi8KCWlmICggKGluX3ggPT0gb3V0X3gpICYmICggMSA9PSB4cHNjICkgKQoJCXhzY2kgPSAweDQwMDsKCWVsc2UKCQl4c2NpID0gKCAoMTAyNCAqIGluX3gpIC8gKG91dF94ICogeHBzYykgKSArIHhwc2M7CgoJLyogc2V0IHN0YXJ0IHBoYXNlIGZvciBob3Jpem9udGFsIGZpbmUgc2NhbGUgKHhwKSB0byAwICovCgl4cCA9IDA7CgoJLyogc2V0IHhpbSwgaWYgd2UgYnlwYXNzIHRoZSBob3Jpem9udGFsIHNjYWxlciAqLwoJaWYgKCAweDQwMCA9PSB4c2NpICkKCQl4aW0gPSAxOwoJZWxzZQoJCXhpbSA9IDA7CgoJLyogaWYgdGhlIHByZXNjYWxlciBpcyBieXBhc3NlZCwgZW5hYmxlIGhvcml6b250YWwKCSAgIGFjY3VtdWxhdGlvbiBtb2RlICh4YWNtKSBhbmQgY2xlYXIgZGNneCAqLwoJaWYoIDEgPT0geHBzYyApIHsKCQl4YWNtID0gMTsKCQlkY2d4ID0gMDsKCX0gZWxzZSB7CgkJeGFjbSA9IDA7CgkJLyogZ2V0IGJlc3QgbWF0Y2ggaW4gdGhlIHRhYmxlIG9mIGF0dGVudWF0aW9ucwoJCSAgIGZvciBob3Jpem9udGFsIHNjYWxpbmcgKi8KCQloX2F0dGVuID0gaHBzX2hfY29lZmZfdGFiWyggKHhwc2MgLSAxKSA8IDYzID8gKHhwc2MgLSAxKSA6IDYzICldLndlaWdodF9zdW07CgoJCWZvciAoaSA9IDA7IGhfYXR0ZW51YXRpb25baV0gIT0gMDsgaSsrKSB7CgkJCWlmIChoX2F0dGVudWF0aW9uW2ldID49IGhfYXR0ZW4pCgkJCQlicmVhazsKCQl9CgoJCWRjZ3ggPSBpOwoJfQoKCS8qIHRoZSBob3Jpem9udGFsIHNjYWxpbmcgaW5jcmVtZW50IGNvbnRyb2xzIHRoZSBVViBmaWx0ZXIKCSAgIHRvIHJlZHVjZSB0aGUgYmFuZHdpdGggdG8gaW1wcm92ZSB0aGUgZGlzcGxheSBxdWFsaXR5LAoJICAgc28gc2V0IGl0IC4uLiAqLwoJaWYgKCB4c2NpID09IDB4NDAwKQoJCXBmdXYgPSAweDAwOwoJZWxzZSBpZiAoIHhzY2kgPCAweDYwMCkKCQlwZnV2ID0gMHgwMTsKCWVsc2UgaWYgKCB4c2NpIDwgMHg2ODApCgkJcGZ1diA9IDB4MTE7CgllbHNlIGlmICggeHNjaSA8IDB4NzAwKQoJCXBmdXYgPSAweDIyOwoJZWxzZQoJCXBmdXYgPSAweDMzOwoKCgkqaHBzX3ZfZ2FpbiAgJj0gTUFTS19XMHxNQVNLX0IyOwoJKmhwc192X2dhaW4gIHw9IChwZnV2IDw8IDI0KTsKCgkqaHBzX2hfc2NhbGUJJj0gfihNQVNLX1cxIHwgMHhmMDAwKTsKCSpocHNfaF9zY2FsZQl8PSAoeGltIDw8IDMxKSB8ICh4cCA8PCAyNCkgfCAoeHNjaSA8PCAxMik7CgoJKmhwc19oX3ByZXNjYWxlCXw9IChkY2d4IDw8IDI3KSB8ICgoeHBzYy0xKSA8PCAxOCkgfCAoeGFjbSA8PCAxNykgfCAoY3h5IDw8IDgpIHwgKGN4dXYgPDwgMCk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgewoJdTE2IGhwc19jb2VmZjsKCXUxNiB3ZWlnaHRfc3VtOwp9IGhwc192X2NvZWZmX3RhYiBbXSA9IHsKIHsweDAxMDAsICAgMn0sICB7MHgwMTAyLCAgIDR9LCAgezB4MDMwMCwgICA0fSwgIHsweDAxMDYsICAgOH0sICB7MHgwNTAyLCAgIDh9LAogezB4MDcwOCwgICA4fSwgIHsweDBGMDAsICAgOH0sICB7MHgwMTFFLCAgMTZ9LCAgezB4MTEwRSwgIDE2fSwgIHsweDE5MjYsICAxNn0sCiB7MHgzOTA2LCAgMTZ9LCAgezB4M0Q0MiwgIDE2fSwgIHsweDdEMDIsICAxNn0sICB7MHg3RjgwLCAgMTZ9LCAgezB4RkYwMCwgIDE2fSwKIHsweDAxRkUsICAzMn0sICB7MHgwMUZFLCAgMzJ9LCAgezB4ODE3RSwgIDMyfSwgIHsweDgxN0UsICAzMn0sICB7MHhDMTNFLCAgMzJ9LAogezB4QzEzRSwgIDMyfSwgIHsweEUxMUUsICAzMn0sICB7MHhFMTFFLCAgMzJ9LCAgezB4RjEwRSwgIDMyfSwgIHsweEYxMEUsICAzMn0sCiB7MHhGOTA2LCAgMzJ9LCAgezB4RjkwNiwgIDMyfSwgIHsweEZEMDIsICAzMn0sICB7MHhGRDAyLCAgMzJ9LCAgezB4RkYwMCwgIDMyfSwKIHsweEZGMDAsICAzMn0sICB7MHgwMUZFLCAgNjR9LCAgezB4MDFGRSwgIDY0fSwgIHsweDAxRkUsICA2NH0sICB7MHgwMUZFLCAgNjR9LAogezB4MDFGRSwgIDY0fSwgIHsweDAxRkUsICA2NH0sICB7MHgwMUZFLCAgNjR9LCAgezB4MDFGRSwgIDY0fSwgIHsweDAxRkUsICA2NH0sCiB7MHgwMUZFLCAgNjR9LCAgezB4MDFGRSwgIDY0fSwgIHsweDAxRkUsICA2NH0sICB7MHgwMUZFLCAgNjR9LCAgezB4MDFGRSwgIDY0fSwKIHsweDAxRkUsICA2NH0sICB7MHgwMUZFLCAgNjR9LCAgezB4MDFGRSwgIDY0fSwgIHsweDAxRkUsICA2NH0sICB7MHg4MTdFLCAgNjR9LAogezB4ODE3RSwgIDY0fSwgIHsweEMxM0UsICA2NH0sICB7MHhDMTNFLCAgNjR9LCAgezB4RTExRSwgIDY0fSwgIHsweEUxMUUsICA2NH0sCiB7MHhGMTBFLCAgNjR9LCAgezB4RjEwRSwgIDY0fSwgIHsweEY5MDYsICA2NH0sICB7MHhGOTA2LCAgNjR9LCAgezB4RkQwMiwgIDY0fSwKIHsweEZEMDIsICA2NH0sICB7MHhGRjAwLCAgNjR9LCAgezB4RkYwMCwgIDY0fSwgIHsweDAxRkUsIDEyOH0KfTsKCi8qIHRhYmxlIG9mIGF0dGVudWF0aW9uIHZhbHVlcyBmb3IgdmVydGljYWwgc2NhbGluZyAqLwpzdGF0aWMgdTE2IHZfYXR0ZW51YXRpb25bXSA9IHsgMiwgNCwgOCwgMTYsIDMyLCA2NCwgMTI4LCAyNTYsIDB9OwoKLyogY2FsY3VsYXRlIHZlcnRpY2FsIHNjYWxlIHJlZ2lzdGVycyAqLwpzdGF0aWMgaW50IGNhbGN1bGF0ZV92X3NjYWxlX3JlZ2lzdGVycyhzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgZW51bSB2NGwyX2ZpZWxkIGZpZWxkLAoJaW50IGluX3ksIGludCBvdXRfeSwgdTMyKiBocHNfdl9zY2FsZSwgdTMyKiBocHNfdl9nYWluKQp7CglpbnQgbHBpID0gMDsKCgkvKiB2ZXJ0aWNhbCBzY2FsaW5nICovCgl1MzIgeWFjbSA9IDAsIHlzY2kgPSAwLCB5YWNsID0gMCwgeXBvID0gMCwgeXBlID0gMDsKCS8qIHZlcnRpY2FsIHNjYWxlICYgZ2FpbiAqLwoJdTMyIGRjZ3kgPSAwLCBjeWFfY3liID0gMDsKCgkvKiBoZWxwZXIgdmFyaWFibGVzICovCgl1MzIgdl9hdHRlbiA9IDAsIGkgPSAwOwoKCS8qIGVycm9yLCBpZiB2ZXJ0aWNhbCB6b29taW5nICovCglpZiAoIGluX3kgPCBvdXRfeSApIHsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvKiBsaW5lYXIgcGhhc2UgaW50ZXJwb2xhdGlvbiBtYXkgYmUgdXNlZAoJICAgaWYgc2NhbGluZyBpcyBiZXR3ZWVuIDEgYW5kIDEvMiAoYm90aCBmaWVsZHMgdXNlZCkKCSAgIG9yIHNjYWxpbmcgaXMgYmV0d2VlbiAxLzIgYW5kIDEvNCAoaWYgb25seSBvbmUgZmllbGQgaXMgdXNlZCkgKi8KCglpZiAoVjRMMl9GSUVMRF9IQVNfQk9USChmaWVsZCkpIHsKCQlpZiggMipvdXRfeSA+PSBpbl95KSB7CgkJCWxwaSA9IDE7CgkJfQoJfSBlbHNlIGlmIChmaWVsZCA9PSBWNEwyX0ZJRUxEX1RPUAoJCXx8IGZpZWxkID09IFY0TDJfRklFTERfQUxURVJOQVRFCgkJfHwgZmllbGQgPT0gVjRMMl9GSUVMRF9CT1RUT00pIHsKCQlpZiggNCpvdXRfeSA+PSBpbl95ICkgewoJCQlscGkgPSAxOwoJCX0KCQlvdXRfeSAqPSAyOwoJfQoJaWYoIDAgIT0gbHBpICkgewoKCQl5YWNtID0gMDsKCQl5YWNsID0gMDsKCQljeWFfY3liID0gMHgwMGZmOwoKCQkvKiBjYWxjdWxhdGUgc2NhbGluZyBpbmNyZW1lbnQgKi8KCQlpZiAoIGluX3kgPiBvdXRfeSApCgkJCXlzY2kgPSAoKDEwMjQgKiBpbl95KSAvIChvdXRfeSArIDEpKSAtIDEwMjQ7CgkJZWxzZQoJCQl5c2NpID0gMDsKCgkJZGNneSA9IDA7CgoJCS8qIGNhbGN1bGF0ZSB5cGUgYW5kIHlwbyAqLwoJCXlwZSA9IHlzY2kgLyAxNjsKCQl5cG8gPSB5cGUgKyAoeXNjaSAvIDY0KTsKCgl9IGVsc2UgewoJCXlhY20gPSAxOwoKCQkvKiBjYWxjdWxhdGUgc2NhbGluZyBpbmNyZW1lbnQgKi8KCQl5c2NpID0gKCgoMTAgKiAxMDI0ICogKGluX3kgLSBvdXRfeSAtIDEpKSAvIGluX3kpICsgOSkgLyAxMDsKCgkJLyogY2FsY3VsYXRlIHlwZSBhbmQgeXBvICovCgkJeXBvID0geXBlID0gKCh5c2NpICsgMTUpIC8gMTYpOwoKCQkvKiB0aGUgc2VxdWVuY2UgbGVuZ3RoIGludGVydmFsICh5YWNsKSBoYXMgdG8gYmUgc2V0IGFjY29yZGluZwoJCSAgIHRvIHRoZSBwcmVzY2FsZSB2YWx1ZSwgZS5nLglbbiAgIC4uIDEvMikgOiAwCgkJCQkJCVsxLzIgLi4gMS8zKSA6IDEKCQkJCQkJWzEvMyAuLiAxLzQpIDogMgoJCQkJCQkuLi4gKi8KCQlpZiAoIHlzY2kgPCA1MTIpIHsKCQkJeWFjbCA9IDA7CgkJfSBlbHNlIHsKCQkJeWFjbCA9ICggeXNjaSAvICgxMDI0IC0geXNjaSkgKTsKCQl9CgoJCS8qIGdldCBmaWx0ZXIgY29lZmZpY2llbnRzIGZvciBjeWEsIGN5YiBmcm9tIHRhYmxlIGhwc192X2NvZWZmX3RhYiAqLwoJCWN5YV9jeWIgPSBocHNfdl9jb2VmZl90YWJbICh5YWNsIDwgNjMgPyB5YWNsIDogNjMgKSBdLmhwc19jb2VmZjsKCgkJLyogZ2V0IGJlc3QgbWF0Y2ggaW4gdGhlIHRhYmxlIG9mIGF0dGVudWF0aW9ucyBmb3IgdmVydGljYWwgc2NhbGluZyAqLwoJCXZfYXR0ZW4gPSBocHNfdl9jb2VmZl90YWJbICh5YWNsIDwgNjMgPyB5YWNsIDogNjMgKSBdLndlaWdodF9zdW07CgoJCWZvciAoaSA9IDA7IHZfYXR0ZW51YXRpb25baV0gIT0gMDsgaSsrKSB7CgkJCWlmICh2X2F0dGVudWF0aW9uW2ldID49IHZfYXR0ZW4pCgkJCQlicmVhazsKCQl9CgoJCWRjZ3kgPSBpOwoJfQoKCS8qIHlwbyBhbmQgeXBlIHN3YXBwZWQgaW4gc3BlYyA/ICovCgkqaHBzX3Zfc2NhbGUJfD0gKHlhY20gPDwgMzEpIHwgKHlzY2kgPDwgMjEpIHwgKHlhY2wgPDwgMTUpIHwgKHlwbyA8PCA4ICkgfCAoeXBlIDw8IDEpOwoKCSpocHNfdl9nYWluCSY9IH4oTUFTS19XMHxNQVNLX0IyKTsKCSpocHNfdl9nYWluCXw9IChkY2d5IDw8IDE2KSB8IChjeWFfY3liIDw8IDApOwoKCXJldHVybiAwOwp9CgovKiBzaW1wbGUgYnViYmxlLXNvcnQgYWxnb3JpdGhtIHdpdGggZHVwbGljYXRlIGVsaW1pbmF0aW9uICovCnN0YXRpYyBpbnQgc29ydF9hbmRfZWxpbWluYXRlKHUzMiogdmFsdWVzLCBpbnQqIGNvdW50KQp7CglpbnQgbG93ID0gMCwgaGlnaCA9IDAsIHRvcCA9IDAsIHRlbXAgPSAwOwoJaW50IGN1ciA9IDAsIG5leHQgPSAwOwoKCS8qIHNhbml0eSBjaGVja3MgKi8KCWlmKCAoMCA+ICpjb3VudCkgfHwgKE5VTEwgPT0gdmFsdWVzKSApIHsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvKiBidWJibGUgc29ydCB0aGUgZmlyc3QgtGNvdW50tCBpdGVtcyBvZiB0aGUgYXJyYXkgtHZhbHVlc7QgKi8KCWZvciggdG9wID0gKmNvdW50OyB0b3AgPiAwOyB0b3AtLSkgewoJCWZvciggbG93ID0gMCwgaGlnaCA9IDE7IGhpZ2ggPCB0b3A7IGxvdysrLCBoaWdoKyspIHsKCQkJaWYoIHZhbHVlc1tsb3ddID4gdmFsdWVzW2hpZ2hdICkgewoJCQkJdGVtcCA9IHZhbHVlc1tsb3ddOwoJCQkJdmFsdWVzW2xvd10gPSB2YWx1ZXNbaGlnaF07CgkJCQl2YWx1ZXNbaGlnaF0gPSB0ZW1wOwoJCQl9CgkJfQoJfQoKCS8qIHJlbW92ZSBkdXBsaWNhdGUgaXRlbXMgKi8KCWZvciggY3VyID0gMCwgbmV4dCA9IDE7IG5leHQgPCAqY291bnQ7IG5leHQrKykgewoJCWlmKCB2YWx1ZXNbY3VyXSAhPSB2YWx1ZXNbbmV4dF0pCgkJCXZhbHVlc1srK2N1cl0gPSB2YWx1ZXNbbmV4dF07Cgl9CgoJKmNvdW50ID0gY3VyICsgMTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgY2FsY3VsYXRlX2NsaXBwaW5nX3JlZ2lzdGVyc19yZWN0KHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmgsCglzdHJ1Y3Qgc2FhNzE0Nl92aWRlb19kbWEgKnZkbWEyLCB1MzIqIGNsaXBfZm9ybWF0LCB1MzIqIGFyYnRyX2N0cmwsIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKewoJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwoJdTMyICpjbGlwcGluZyA9IHZ2LT5kX2NsaXBwaW5nLmNwdV9hZGRyOwoKCWludCB3aWR0aCA9IGZoLT5vdi53aW4udy53aWR0aDsKCWludCBoZWlnaHQgPSAgZmgtPm92Lndpbi53LmhlaWdodDsKCWludCBjbGlwY291bnQgPSBmaC0+b3YubmNsaXBzOwoKCXUzMiBsaW5lX2xpc3RbMzJdOwoJdTMyIHBpeGVsX2xpc3RbMzJdOwoJaW50IG51bWR3b3JkcyA9IDA7CgoJaW50IGkgPSAwLCBqID0gMDsKCWludCBjbnRfbGluZSA9IDAsIGNudF9waXhlbCA9IDA7CgoJaW50IHhbMzJdLCB5WzMyXSwgd1szMl0sIGhbMzJdOwoKCS8qIGNsZWFyIG91dCBtZW1vcnkgKi8KCW1lbXNldCgmbGluZV9saXN0WzBdLCAgMHgwMCwgc2l6ZW9mKHUzMikqMzIpOwoJbWVtc2V0KCZwaXhlbF9saXN0WzBdLCAweDAwLCBzaXplb2YodTMyKSozMik7CgltZW1zZXQoY2xpcHBpbmcsICAweDAwLCBTQUE3MTQ2X0NMSVBQSU5HX01FTSk7CgoJLyogZmlsbCB0aGUgbGluZSBhbmQgcGl4ZWwtbGlzdHMgKi8KCWZvcihpID0gMDsgaSA8IGNsaXBjb3VudDsgaSsrKSB7CgkJaW50IGwgPSAwLCByID0gMCwgdCA9IDAsIGIgPSAwOwoKCQl4W2ldID0gZmgtPm92LmNsaXBzW2ldLmMubGVmdDsKCQl5W2ldID0gZmgtPm92LmNsaXBzW2ldLmMudG9wOwoJCXdbaV0gPSBmaC0+b3YuY2xpcHNbaV0uYy53aWR0aDsKCQloW2ldID0gZmgtPm92LmNsaXBzW2ldLmMuaGVpZ2h0OwoKCQlpZiggd1tpXSA8IDApIHsKCQkJeFtpXSArPSB3W2ldOyB3W2ldID0gLXdbaV07CgkJfQoJCWlmKCBoW2ldIDwgMCkgewoJCQl5W2ldICs9IGhbaV07IGhbaV0gPSAtaFtpXTsKCQl9CgkJaWYoIHhbaV0gPCAwKSB7CgkJCXdbaV0gKz0geFtpXTsgeFtpXSA9IDA7CgkJfQoJCWlmKCB5W2ldIDwgMCkgewoJCQloW2ldICs9IHlbaV07IHlbaV0gPSAwOwoJCX0KCQlpZiggMCAhPSB2di0+dmZsaXAgKSB7CgkJCXlbaV0gPSBoZWlnaHQgLSB5W2ldIC0gaFtpXTsKCQl9CgoJCWwgPSB4W2ldOwoJCXIgPSB4W2ldK3dbaV07CgkJdCA9IHlbaV07CgkJYiA9IHlbaV0raFtpXTsKCgkJLyogaW5zZXJ0IGxlZnQvcmlnaHQgY29vcmRpbmF0ZXMgKi8KCQlwaXhlbF9saXN0WyAyKmkgICBdID0gbWluX3QoaW50LCBsLCB3aWR0aCk7CgkJcGl4ZWxfbGlzdFsoMippKSsxXSA9IG1pbl90KGludCwgciwgd2lkdGgpOwoJCS8qIGluc2VydCB0b3AvYm90dG9tIGNvb3JkaW5hdGVzICovCgkJbGluZV9saXN0WyAyKmkgICBdID0gbWluX3QoaW50LCB0LCBoZWlnaHQpOwoJCWxpbmVfbGlzdFsoMippKSsxXSA9IG1pbl90KGludCwgYiwgaGVpZ2h0KTsKCX0KCgkvKiBzb3J0IGFuZCBlbGltaW5hdGUgbGlzdHMgKi8KCWNudF9saW5lID0gY250X3BpeGVsID0gMipjbGlwY291bnQ7Cglzb3J0X2FuZF9lbGltaW5hdGUoICZwaXhlbF9saXN0WzBdLCAmY250X3BpeGVsICk7Cglzb3J0X2FuZF9lbGltaW5hdGUoICZsaW5lX2xpc3RbMF0sICZjbnRfbGluZSApOwoKCS8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHVzZWQgdTMycyAqLwoJbnVtZHdvcmRzID0gbWF4X3QoaW50LCAoY250X2xpbmUrMSksIChjbnRfcGl4ZWwrMSkpKjI7CgludW1kd29yZHMgPSBtYXhfdChpbnQsIDQsIG51bWR3b3Jkcyk7CgludW1kd29yZHMgPSBtaW5fdChpbnQsIDY0LCBudW1kd29yZHMpOwoKCS8qIGZpbGwgdXAgY2xpcHRhYmxlICovCglmb3IoaSA9IDA7IGkgPCBjbnRfcGl4ZWw7IGkrKykgewoJCWNsaXBwaW5nWzIqaV0gfD0gY3B1X3RvX2xlMzIocGl4ZWxfbGlzdFtpXSA8PCAxNik7Cgl9Cglmb3IoaSA9IDA7IGkgPCBjbnRfbGluZTsgaSsrKSB7CgkJY2xpcHBpbmdbKDIqaSkrMV0gfD0gY3B1X3RvX2xlMzIobGluZV9saXN0W2ldIDw8IDE2KTsKCX0KCgkvKiBmaWxsIHVwIGNsaXB0YWJsZSB3aXRoIHRoZSBkaXNwbGF5IGluZm9zICovCglmb3IoaiA9IDA7IGogPCBjbGlwY291bnQ7IGorKykgewoKCQlmb3IoaSA9IDA7IGkgPCBjbnRfcGl4ZWw7IGkrKykgewoKCQkJaWYoIHhbal0gPCAwKQoJCQkJeFtqXSA9IDA7CgoJCQlpZiggcGl4ZWxfbGlzdFtpXSA8ICh4W2pdICsgd1tqXSkpIHsKCgkJCQlpZiAoIHBpeGVsX2xpc3RbaV0gPj0geFtqXSApIHsKCQkJCQljbGlwcGluZ1syKmldIHw9IGNwdV90b19sZTMyKDEgPDwgaik7CgkJCQl9CgkJCX0KCQl9CgkJZm9yKGkgPSAwOyBpIDwgY250X2xpbmU7IGkrKykgewoKCQkJaWYoIHlbal0gPCAwKQoJCQkJeVtqXSA9IDA7CgoJCQlpZiggbGluZV9saXN0W2ldIDwgKHlbal0gKyBoW2pdKSApIHsKCgkJCQlpZiggbGluZV9saXN0W2ldID49IHlbal0gKSB7CgkJCQkJY2xpcHBpbmdbKDIqaSkrMV0gfD0gY3B1X3RvX2xlMzIoMSA8PCBqKTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvKiBhZGp1c3QgYXJiaXRyYXRpb24gY29udHJvbCByZWdpc3RlciAqLwoJKmFyYnRyX2N0cmwgJj0gMHhmZmZmMDBmZjsKCSphcmJ0cl9jdHJsIHw9IDB4MDAwMDFjMDA7CgoJdmRtYTItPmJhc2VfZXZlbgk9IHZ2LT5kX2NsaXBwaW5nLmRtYV9oYW5kbGU7Cgl2ZG1hMi0+YmFzZV9vZGQJCT0gdnYtPmRfY2xpcHBpbmcuZG1hX2hhbmRsZTsKCXZkbWEyLT5wcm90X2FkZHIJPSB2di0+ZF9jbGlwcGluZy5kbWFfaGFuZGxlKygoc2l6ZW9mKHUzMikpKihudW1kd29yZHMpKTsKCXZkbWEyLT5iYXNlX3BhZ2UJPSAweDA0OwoJdmRtYTItPnBpdGNoCQk9IDB4MDA7Cgl2ZG1hMi0+bnVtX2xpbmVfYnl0ZQk9ICgwIDw8IDE2IHwgKHNpemVvZih1MzIpKSoobnVtZHdvcmRzLTEpICk7CgoJLyogc2V0IGNsaXBwaW5nLW1vZGUuIHRoaXMgZGVwZW5kcyBvbiB0aGUgZmllbGQocykgdXNlZCAqLwoJKmNsaXBfZm9ybWF0ICY9IDB4ZmZmZmZmZjc7CglpZiAoVjRMMl9GSUVMRF9IQVNfQk9USChmaWVsZCkpIHsKCQkqY2xpcF9mb3JtYXQgfD0gMHgwMDAwMDAwODsKCX0gZWxzZSB7CgkJKmNsaXBfZm9ybWF0IHw9IDB4MDAwMDAwMDA7Cgl9Cn0KCi8qIGRpc2FibGUgY2xpcHBpbmcgKi8Kc3RhdGljIHZvaWQgc2FhNzE0Nl9kaXNhYmxlX2NsaXBwaW5nKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2KQp7Cgl1MzIgY2xpcF9mb3JtYXQJPSBzYWE3MTQ2X3JlYWQoZGV2LCBDTElQX0ZPUk1BVF9DVFJMKTsKCgkvKiBtYXNrIG91dCByZWxldmFudCBiaXRzICg9bG93ZXIgd29yZCkqLwoJY2xpcF9mb3JtYXQgJj0gTUFTS19XMTsKCgkvKiB1cGxvYWQgY2xpcHBpbmctcmVnaXN0ZXJzKi8KCXNhYTcxNDZfd3JpdGUoZGV2LCBDTElQX0ZPUk1BVF9DVFJMLGNsaXBfZm9ybWF0KTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzIsIChNQVNLXzA1IHwgTUFTS18yMSkpOwoKCS8qIGRpc2FibGUgdmlkZW8gZG1hMiAqLwoJc2FhNzE0Nl93cml0ZShkZXYsIE1DMSwgTUFTS18yMSk7Cn0KCnN0YXRpYyB2b2lkIHNhYTcxNDZfc2V0X2NsaXBwaW5nX3JlY3Qoc3RydWN0IHNhYTcxNDZfZmggKmZoKQp7CglzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9IGZoLT5kZXY7CgllbnVtIHY0bDJfZmllbGQgZmllbGQgPSBmaC0+b3Yud2luLmZpZWxkOwoJc3RydWN0CXNhYTcxNDZfdmlkZW9fZG1hIHZkbWEyOwoJdTMyIGNsaXBfZm9ybWF0OwoJdTMyIGFyYnRyX2N0cmw7CgoJLyogY2hlY2sgY2xpcGNvdW50LCBkaXNhYmxlIGNsaXBwaW5nIGlmIGNsaXBjb3VudCA9PSAwKi8KCWlmKCBmaC0+b3YubmNsaXBzID09IDAgKSB7CgkJc2FhNzE0Nl9kaXNhYmxlX2NsaXBwaW5nKGRldik7CgkJcmV0dXJuOwoJfQoKCWNsaXBfZm9ybWF0ID0gc2FhNzE0Nl9yZWFkKGRldiwgQ0xJUF9GT1JNQVRfQ1RSTCk7CglhcmJ0cl9jdHJsID0gc2FhNzE0Nl9yZWFkKGRldiwgUENJX0JUX1YxKTsKCgljYWxjdWxhdGVfY2xpcHBpbmdfcmVnaXN0ZXJzX3JlY3QoZGV2LCBmaCwgJnZkbWEyLCAmY2xpcF9mb3JtYXQsICZhcmJ0cl9jdHJsLCBmaWVsZCk7CgoJLyogc2V0IGNsaXBwaW5nIGZvcm1hdCAqLwoJY2xpcF9mb3JtYXQgJj0gMHhmZmZmMDAwODsKCWNsaXBfZm9ybWF0IHw9IChTQUE3MTQ2X0NMSVBQSU5HX1JFQ1QgPDwgNCk7CgoJLyogcHJlcGFyZSB2aWRlbyBkbWEyICovCglzYWE3MTQ2X3dyaXRlKGRldiwgQkFTRV9FVkVOMiwJCXZkbWEyLmJhc2VfZXZlbik7CglzYWE3MTQ2X3dyaXRlKGRldiwgQkFTRV9PREQyLAkJdmRtYTIuYmFzZV9vZGQpOwoJc2FhNzE0Nl93cml0ZShkZXYsIFBST1RfQUREUjIsCQl2ZG1hMi5wcm90X2FkZHIpOwoJc2FhNzE0Nl93cml0ZShkZXYsIEJBU0VfUEFHRTIsCQl2ZG1hMi5iYXNlX3BhZ2UpOwoJc2FhNzE0Nl93cml0ZShkZXYsIFBJVENIMiwJCXZkbWEyLnBpdGNoKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBOVU1fTElORV9CWVRFMiwJdmRtYTIubnVtX2xpbmVfYnl0ZSk7CgoJLyogcHJlcGFyZSB0aGUgcmVzdCAqLwoJc2FhNzE0Nl93cml0ZShkZXYsIENMSVBfRk9STUFUX0NUUkwsY2xpcF9mb3JtYXQpOwoJc2FhNzE0Nl93cml0ZShkZXYsIFBDSV9CVF9WMSwgYXJidHJfY3RybCk7CgoJLyogdXBsb2FkIGNsaXBfY29udHJvbC1yZWdpc3RlciwgY2xpcHBpbmctcmVnaXN0ZXJzLCBlbmFibGUgdmlkZW8gZG1hMiAqLwoJc2FhNzE0Nl93cml0ZShkZXYsIE1DMiwgKE1BU0tfMDUgfCBNQVNLXzIxIHwgTUFTS18wMyB8IE1BU0tfMTkpKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzEsIChNQVNLXzA1IHwgTUFTS18yMSkpOwp9CgpzdGF0aWMgdm9pZCBzYWE3MTQ2X3NldF93aW5kb3coc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQp7CglzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CgoJaW50IHNvdXJjZSA9IHZ2LT5jdXJyZW50X2hwc19zb3VyY2U7CglpbnQgc3luYyA9IHZ2LT5jdXJyZW50X2hwc19zeW5jOwoKCXUzMiBocHNfdl9zY2FsZSA9IDAsIGhwc192X2dhaW4gID0gMCwgaHBzX2N0cmwgPSAwLCBocHNfaF9wcmVzY2FsZSA9IDAsIGhwc19oX3NjYWxlID0gMDsKCgkvKiBzZXQgdmVydGljYWwgc2NhbGUgKi8KCWhwc192X3NjYWxlID0gMDsgLyogYWxsIGJpdHMgZ2V0IHNldCBieSB0aGUgZnVuY3Rpb24tY2FsbCAqLwoJaHBzX3ZfZ2FpbiAgPSAwOyAvKiBmaXhtZTogc2FhNzE0Nl9yZWFkKGRldiwgSFBTX1ZfR0FJTik7Ki8KCWNhbGN1bGF0ZV92X3NjYWxlX3JlZ2lzdGVycyhkZXYsIGZpZWxkLCB2di0+c3RhbmRhcmQtPnZfZmllbGQqMiwgaGVpZ2h0LCAmaHBzX3Zfc2NhbGUsICZocHNfdl9nYWluKTsKCgkvKiBzZXQgaG9yaXpvbnRhbCBzY2FsZSAqLwoJaHBzX2N0cmwJPSAwOwoJaHBzX2hfcHJlc2NhbGUJPSAwOyAvKiBhbGwgYml0cyBnZXQgc2V0IGluIHRoZSBmdW5jdGlvbiAqLwoJaHBzX2hfc2NhbGUJPSAwOwoJY2FsY3VsYXRlX2hfc2NhbGVfcmVnaXN0ZXJzKGRldiwgdnYtPnN0YW5kYXJkLT5oX3BpeGVscywgd2lkdGgsIHZ2LT5oZmxpcCwgJmhwc19jdHJsLCAmaHBzX3ZfZ2FpbiwgJmhwc19oX3ByZXNjYWxlLCAmaHBzX2hfc2NhbGUpOwoKCS8qIHNldCBoeW8gYW5kIGh4byAqLwoJY2FsY3VsYXRlX2h4b19hbmRfaHlvKHZ2LCAmaHBzX2hfc2NhbGUsICZocHNfY3RybCk7CgljYWxjdWxhdGVfaHBzX3NvdXJjZV9hbmRfc3luYyhkZXYsIHNvdXJjZSwgc3luYywgJmhwc19jdHJsKTsKCgkvKiB3cml0ZSBvdXQgbmV3IHJlZ2lzdGVyIGNvbnRlbnRzICovCglzYWE3MTQ2X3dyaXRlKGRldiwgSFBTX1ZfU0NBTEUsCWhwc192X3NjYWxlKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBIUFNfVl9HQUlOLAlocHNfdl9nYWluKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBIUFNfQ1RSTCwJaHBzX2N0cmwpOwoJc2FhNzE0Nl93cml0ZShkZXYsIEhQU19IX1BSRVNDQUxFLGhwc19oX3ByZXNjYWxlKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCBIUFNfSF9TQ0FMRSwJaHBzX2hfc2NhbGUpOwoKCS8qIHVwbG9hZCBzaGFkb3ctcmFtIHJlZ2lzdGVycyAqLwoJc2FhNzE0Nl93cml0ZShkZXYsIE1DMiwgKE1BU0tfMDUgfCBNQVNLXzA2IHwgTUFTS18yMSB8IE1BU0tfMjIpICk7Cn0KCi8qIGNhbGN1bGF0ZSB0aGUgbmV3IG1lbW9yeSBvZmZzZXRzIGZvciBhIGRlc2lyZWQgcG9zaXRpb24gKi8Kc3RhdGljIHZvaWQgc2FhNzE0Nl9zZXRfcG9zaXRpb24oc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIGludCB3X3gsIGludCB3X3ksIGludCB3X2hlaWdodCwgZW51bSB2NGwyX2ZpZWxkIGZpZWxkLCB1MzIgcGl4ZWxmb3JtYXQpCnsKCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKCXN0cnVjdCBzYWE3MTQ2X2Zvcm1hdCAqc2ZtdCA9IGZvcm1hdF9ieV9mb3VyY2MoZGV2LCBwaXhlbGZvcm1hdCk7CgoJaW50IGJfZGVwdGggPSB2di0+b3ZfZm10LT5kZXB0aDsKCWludCBiX2JwbCA9IHZ2LT5vdl9mYi5mbXQuYnl0ZXNwZXJsaW5lOwoJLyogVGhlIHVuc2lnbmVkIGxvbmcgY2FzdCBpcyB0byByZW1vdmUgYSA2NC1iaXQgY29tcGlsZSB3YXJuaW5nIHNpbmNlCgkgICBpdCBsb29rcyBsaWtlIGEgNjQtYml0IGFkZHJlc3MgaXMgY2FzdCB0byBhIDMyLWJpdCB2YWx1ZSwgZXZlbgoJICAgdGhvdWdoIHRoZSBiYXNlIHBvaW50ZXIgaXMgcmVhbGx5IGEgMzItYml0IHBoeXNpY2FsIGFkZHJlc3MgdGhhdAoJICAgZ29lcyBpbnRvIGEgMzItYml0IERNQSByZWdpc3Rlci4KCSAgIEZJWE1FOiBtaWdodCBub3Qgd29yayBvbiBzb21lIDY0LWJpdCBwbGF0Zm9ybXMsIGJ1dCBzZWUgdGhlIEZJWE1FCgkgICBpbiBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAodmlkZW9kZXYyLmgpIGZvciB0aGF0LgoJICovCgl1MzIgYmFzZSA9ICh1MzIpKHVuc2lnbmVkIGxvbmcpdnYtPm92X2ZiLmJhc2U7CgoJc3RydWN0CXNhYTcxNDZfdmlkZW9fZG1hIHZkbWExOwoKCS8qIGNhbGN1bGF0ZSBtZW1vcnkgb2Zmc2V0cyBmb3IgcGljdHVyZSwgbG9vayBpZiB3ZSBzaGFsbCB0b3AtZG93bi1mbGlwICovCgl2ZG1hMS5waXRjaAk9IDIqYl9icGw7CglpZiAoIDAgPT0gdnYtPnZmbGlwICkgewoJCXZkbWExLmJhc2VfZXZlbiA9IGJhc2UgKyAod195ICogKHZkbWExLnBpdGNoLzIpKSArICh3X3ggKiAoYl9kZXB0aCAvIDgpKTsKCQl2ZG1hMS5iYXNlX29kZCAgPSB2ZG1hMS5iYXNlX2V2ZW4gKyAodmRtYTEucGl0Y2ggLyAyKTsKCQl2ZG1hMS5wcm90X2FkZHIgPSB2ZG1hMS5iYXNlX2V2ZW4gKyAod19oZWlnaHQgKiAodmRtYTEucGl0Y2ggLyAyKSk7Cgl9CgllbHNlIHsKCQl2ZG1hMS5iYXNlX2V2ZW4gPSBiYXNlICsgKCh3X3krd19oZWlnaHQpICogKHZkbWExLnBpdGNoLzIpKSArICh3X3ggKiAoYl9kZXB0aCAvIDgpKTsKCQl2ZG1hMS5iYXNlX29kZCAgPSB2ZG1hMS5iYXNlX2V2ZW4gLSAodmRtYTEucGl0Y2ggLyAyKTsKCQl2ZG1hMS5wcm90X2FkZHIgPSB2ZG1hMS5iYXNlX29kZCAtICh3X2hlaWdodCAqICh2ZG1hMS5waXRjaCAvIDIpKTsKCX0KCglpZiAoVjRMMl9GSUVMRF9IQVNfQk9USChmaWVsZCkpIHsKCX0gZWxzZSBpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9BTFRFUk5BVEUpIHsKCQkvKiBmaXhtZSAqLwoJCXZkbWExLmJhc2Vfb2RkID0gdmRtYTEucHJvdF9hZGRyOwoJCXZkbWExLnBpdGNoIC89IDI7Cgl9IGVsc2UgaWYgKGZpZWxkID09IFY0TDJfRklFTERfVE9QKSB7CgkJdmRtYTEuYmFzZV9vZGQgPSB2ZG1hMS5wcm90X2FkZHI7CgkJdmRtYTEucGl0Y2ggLz0gMjsKCX0gZWxzZSBpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9CT1RUT00pIHsKCQl2ZG1hMS5iYXNlX29kZCA9IHZkbWExLmJhc2VfZXZlbjsKCQl2ZG1hMS5iYXNlX2V2ZW4gPSB2ZG1hMS5wcm90X2FkZHI7CgkJdmRtYTEucGl0Y2ggLz0gMjsKCX0KCglpZiAoIDAgIT0gdnYtPnZmbGlwICkgewoJCXZkbWExLnBpdGNoICo9IC0xOwoJfQoKCXZkbWExLmJhc2VfcGFnZSA9IHNmbXQtPnN3YXA7Cgl2ZG1hMS5udW1fbGluZV9ieXRlID0gKHZ2LT5zdGFuZGFyZC0+dl9maWVsZDw8MTYpK3Z2LT5zdGFuZGFyZC0+aF9waXhlbHM7CgoJc2FhNzE0Nl93cml0ZV9vdXRfZG1hKGRldiwgMSwgJnZkbWExKTsKfQoKc3RhdGljIHZvaWQgc2FhNzE0Nl9zZXRfb3V0cHV0X2Zvcm1hdChzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBwYWxldHRlKQp7Cgl1MzIgY2xpcF9mb3JtYXQgPSBzYWE3MTQ2X3JlYWQoZGV2LCBDTElQX0ZPUk1BVF9DVFJMKTsKCgkvKiBjYWxsIGhlbHBlciBmdW5jdGlvbiAqLwoJY2FsY3VsYXRlX291dHB1dF9mb3JtYXRfcmVnaXN0ZXIoZGV2LHBhbGV0dGUsJmNsaXBfZm9ybWF0KTsKCgkvKiB1cGRhdGUgdGhlIGhwcyByZWdpc3RlcnMgKi8KCXNhYTcxNDZfd3JpdGUoZGV2LCBDTElQX0ZPUk1BVF9DVFJMLCBjbGlwX2Zvcm1hdCk7CglzYWE3MTQ2X3dyaXRlKGRldiwgTUMyLCAoTUFTS18wNSB8IE1BU0tfMjEpKTsKfQoKLyogc2VsZWN0IGlucHV0LXNvdXJjZSAqLwp2b2lkIHNhYTcxNDZfc2V0X2hwc19zb3VyY2VfYW5kX3N5bmMoc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIGludCBzb3VyY2UsIGludCBzeW5jKQp7CglzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7Cgl1MzIgaHBzX2N0cmwgPSAwOwoKCS8qIHJlYWQgb2xkIHN0YXRlICovCglocHNfY3RybCA9IHNhYTcxNDZfcmVhZChkZXYsIEhQU19DVFJMKTsKCglocHNfY3RybCAmPSB+KCBNQVNLXzMxIHwgTUFTS18zMCB8IE1BU0tfMjggKTsKCWhwc19jdHJsIHw9IChzb3VyY2UgPDwgMzApIHwgKHN5bmMgPDwgMjgpOwoKCS8qIHdyaXRlIGJhY2sgJiB1cGxvYWQgcmVnaXN0ZXIgKi8KCXNhYTcxNDZfd3JpdGUoZGV2LCBIUFNfQ1RSTCwgaHBzX2N0cmwpOwoJc2FhNzE0Nl93cml0ZShkZXYsIE1DMiwgKE1BU0tfMDUgfCBNQVNLXzIxKSk7CgoJdnYtPmN1cnJlbnRfaHBzX3NvdXJjZSA9IHNvdXJjZTsKCXZ2LT5jdXJyZW50X2hwc19zeW5jID0gc3luYzsKfQpFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3NldF9ocHNfc291cmNlX2FuZF9zeW5jKTsKCmludCBzYWE3MTQ2X2VuYWJsZV9vdmVybGF5KHN0cnVjdCBzYWE3MTQ2X2ZoICpmaCkKewoJc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYgPSBmaC0+ZGV2OwoJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwoKCXNhYTcxNDZfc2V0X3dpbmRvdyhkZXYsIGZoLT5vdi53aW4udy53aWR0aCwgZmgtPm92Lndpbi53LmhlaWdodCwgZmgtPm92Lndpbi5maWVsZCk7CglzYWE3MTQ2X3NldF9wb3NpdGlvbihkZXYsIGZoLT5vdi53aW4udy5sZWZ0LCBmaC0+b3Yud2luLncudG9wLCBmaC0+b3Yud2luLncuaGVpZ2h0LCBmaC0+b3Yud2luLmZpZWxkLCB2di0+b3ZfZm10LT5waXhlbGZvcm1hdCk7CglzYWE3MTQ2X3NldF9vdXRwdXRfZm9ybWF0KGRldiwgdnYtPm92X2ZtdC0+dHJhbnMpOwoJc2FhNzE0Nl9zZXRfY2xpcHBpbmdfcmVjdChmaCk7CgoJLyogZW5hYmxlIHZpZGVvIGRtYTEgKi8KCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzEsIChNQVNLXzA2IHwgTUFTS18yMikpOwoJcmV0dXJuIDA7Cn0KCnZvaWQgc2FhNzE0Nl9kaXNhYmxlX292ZXJsYXkoc3RydWN0IHNhYTcxNDZfZmggKmZoKQp7CglzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9IGZoLT5kZXY7CgoJLyogZGlzYWJsZSBjbGlwcGluZyArIHZpZGVvIGRtYTEgKi8KCXNhYTcxNDZfZGlzYWJsZV9jbGlwcGluZyhkZXYpOwoJc2FhNzE0Nl93cml0ZShkZXYsIE1DMSwgTUFTS18yMik7Cn0KCnZvaWQgc2FhNzE0Nl93cml0ZV9vdXRfZG1hKHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2LCBpbnQgd2hpY2gsIHN0cnVjdCBzYWE3MTQ2X3ZpZGVvX2RtYSogdmRtYSkKewoJaW50IHdoZXJlID0gMDsKCglpZiggd2hpY2ggPCAxIHx8IHdoaWNoID4gMykgewoJCXJldHVybjsKCX0KCgkvKiBjYWxjdWxhdGUgc3RhcnRpbmcgYWRkcmVzcyAqLwoJd2hlcmUgID0gKHdoaWNoLTEpKjB4MTg7CgoJc2FhNzE0Nl93cml0ZShkZXYsIHdoZXJlLAl2ZG1hLT5iYXNlX29kZCk7CglzYWE3MTQ2X3dyaXRlKGRldiwgd2hlcmUrMHgwNCwJdmRtYS0+YmFzZV9ldmVuKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCB3aGVyZSsweDA4LAl2ZG1hLT5wcm90X2FkZHIpOwoJc2FhNzE0Nl93cml0ZShkZXYsIHdoZXJlKzB4MGMsCXZkbWEtPnBpdGNoKTsKCXNhYTcxNDZfd3JpdGUoZGV2LCB3aGVyZSsweDEwLAl2ZG1hLT5iYXNlX3BhZ2UpOwoJc2FhNzE0Nl93cml0ZShkZXYsIHdoZXJlKzB4MTQsCXZkbWEtPm51bV9saW5lX2J5dGUpOwoKCS8qIHVwbG9hZCAqLwoJc2FhNzE0Nl93cml0ZShkZXYsIE1DMiwgKE1BU0tfMDI8PCh3aGljaC0xKSl8KE1BU0tfMTg8PCh3aGljaC0xKSkpOwovKgoJcHJpbnRrKCJ2ZG1hJWQuYmFzZV9ldmVuOiAgICAgMHglMDh4XG4iLCB3aGljaCx2ZG1hLT5iYXNlX2V2ZW4pOwoJcHJpbnRrKCJ2ZG1hJWQuYmFzZV9vZGQ6ICAgICAgMHglMDh4XG4iLCB3aGljaCx2ZG1hLT5iYXNlX29kZCk7CglwcmludGsoInZkbWElZC5wcm90X2FkZHI6ICAgICAweCUwOHhcbiIsIHdoaWNoLHZkbWEtPnByb3RfYWRkcik7CglwcmludGsoInZkbWElZC5iYXNlX3BhZ2U6ICAgICAweCUwOHhcbiIsIHdoaWNoLHZkbWEtPmJhc2VfcGFnZSk7CglwcmludGsoInZkbWElZC5waXRjaDogICAgICAgICAweCUwOHhcbiIsIHdoaWNoLHZkbWEtPnBpdGNoKTsKCXByaW50aygidmRtYSVkLm51bV9saW5lX2J5dGU6IDB4JTA4eFxuIiwgd2hpY2gsdmRtYS0+bnVtX2xpbmVfYnl0ZSk7CiovCn0KCnN0YXRpYyBpbnQgY2FsY3VsYXRlX3ZpZGVvX2RtYV9ncmFiX3BhY2tlZChzdHJ1Y3Qgc2FhNzE0Nl9kZXYqIGRldiwgc3RydWN0IHNhYTcxNDZfYnVmICpidWYpCnsKCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKCXN0cnVjdCBzYWE3MTQ2X3ZpZGVvX2RtYSB2ZG1hMTsKCglzdHJ1Y3Qgc2FhNzE0Nl9mb3JtYXQgKnNmbXQgPSBmb3JtYXRfYnlfZm91cmNjKGRldixidWYtPmZtdC0+cGl4ZWxmb3JtYXQpOwoKCWludCB3aWR0aCA9IGJ1Zi0+Zm10LT53aWR0aDsKCWludCBoZWlnaHQgPSBidWYtPmZtdC0+aGVpZ2h0OwoJaW50IGJ5dGVzcGVybGluZSA9IGJ1Zi0+Zm10LT5ieXRlc3BlcmxpbmU7CgllbnVtIHY0bDJfZmllbGQgZmllbGQgPSBidWYtPmZtdC0+ZmllbGQ7CgoJaW50IGRlcHRoID0gc2ZtdC0+ZGVwdGg7CgoJREVCX0NBUCgoIltzaXplPSVkeCVkLGZpZWxkcz0lc11cbiIsCgkJd2lkdGgsaGVpZ2h0LHY0bDJfZmllbGRfbmFtZXNbZmllbGRdKSk7CgoJaWYoIGJ5dGVzcGVybGluZSAhPSAwKSB7CgkJdmRtYTEucGl0Y2ggPSBieXRlc3BlcmxpbmUqMjsKCX0gZWxzZSB7CgkJdmRtYTEucGl0Y2ggPSAod2lkdGgqZGVwdGgqMikvODsKCX0KCXZkbWExLm51bV9saW5lX2J5dGUJPSAoKHZ2LT5zdGFuZGFyZC0+dl9maWVsZDw8MTYpICsgdnYtPnN0YW5kYXJkLT5oX3BpeGVscyk7Cgl2ZG1hMS5iYXNlX3BhZ2UJCT0gYnVmLT5wdFswXS5kbWEgfCBNRTEgfCBzZm10LT5zd2FwOwoKCWlmKCAwICE9IHZ2LT52ZmxpcCApIHsKCQl2ZG1hMS5wcm90X2FkZHIJPSBidWYtPnB0WzBdLm9mZnNldDsKCQl2ZG1hMS5iYXNlX2V2ZW4JPSBidWYtPnB0WzBdLm9mZnNldCsodmRtYTEucGl0Y2gvMikqaGVpZ2h0OwoJCXZkbWExLmJhc2Vfb2RkCT0gdmRtYTEuYmFzZV9ldmVuIC0gKHZkbWExLnBpdGNoLzIpOwoJfSBlbHNlIHsKCQl2ZG1hMS5iYXNlX2V2ZW4JPSBidWYtPnB0WzBdLm9mZnNldDsKCQl2ZG1hMS5iYXNlX29kZAk9IHZkbWExLmJhc2VfZXZlbiArICh2ZG1hMS5waXRjaC8yKTsKCQl2ZG1hMS5wcm90X2FkZHIJPSBidWYtPnB0WzBdLm9mZnNldCsodmRtYTEucGl0Y2gvMikqaGVpZ2h0OwoJfQoKCWlmIChWNEwyX0ZJRUxEX0hBU19CT1RIKGZpZWxkKSkgewoJfSBlbHNlIGlmIChmaWVsZCA9PSBWNEwyX0ZJRUxEX0FMVEVSTkFURSkgewoJCS8qIGZpeG1lICovCgkJaWYgKCB2di0+bGFzdF9maWVsZCA9PSBWNEwyX0ZJRUxEX1RPUCApIHsKCQkJdmRtYTEuYmFzZV9vZGQJPSB2ZG1hMS5wcm90X2FkZHI7CgkJCXZkbWExLnBpdGNoIC89IDI7CgkJfSBlbHNlIGlmICggdnYtPmxhc3RfZmllbGQgPT0gVjRMMl9GSUVMRF9CT1RUT00gKSB7CgkJCXZkbWExLmJhc2Vfb2RkCT0gdmRtYTEuYmFzZV9ldmVuOwoJCQl2ZG1hMS5iYXNlX2V2ZW4gPSB2ZG1hMS5wcm90X2FkZHI7CgkJCXZkbWExLnBpdGNoIC89IDI7CgkJfQoJfSBlbHNlIGlmIChmaWVsZCA9PSBWNEwyX0ZJRUxEX1RPUCkgewoJCXZkbWExLmJhc2Vfb2RkCT0gdmRtYTEucHJvdF9hZGRyOwoJCXZkbWExLnBpdGNoIC89IDI7Cgl9IGVsc2UgaWYgKGZpZWxkID09IFY0TDJfRklFTERfQk9UVE9NKSB7CgkJdmRtYTEuYmFzZV9vZGQJPSB2ZG1hMS5iYXNlX2V2ZW47CgkJdmRtYTEuYmFzZV9ldmVuID0gdmRtYTEucHJvdF9hZGRyOwoJCXZkbWExLnBpdGNoIC89IDI7Cgl9CgoJaWYoIDAgIT0gdnYtPnZmbGlwICkgewoJCXZkbWExLnBpdGNoICo9IC0xOwoJfQoKCXNhYTcxNDZfd3JpdGVfb3V0X2RtYShkZXYsIDEsICZ2ZG1hMSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBjYWxjX3BsYW5hcl80MjIoc3RydWN0IHNhYTcxNDZfdnYgKnZ2LCBzdHJ1Y3Qgc2FhNzE0Nl9idWYgKmJ1Ziwgc3RydWN0IHNhYTcxNDZfdmlkZW9fZG1hICp2ZG1hMiwgc3RydWN0IHNhYTcxNDZfdmlkZW9fZG1hICp2ZG1hMykKewoJaW50IGhlaWdodCA9IGJ1Zi0+Zm10LT5oZWlnaHQ7CglpbnQgd2lkdGggPSBidWYtPmZtdC0+d2lkdGg7CgoJdmRtYTItPnBpdGNoCT0gd2lkdGg7Cgl2ZG1hMy0+cGl0Y2gJPSB3aWR0aDsKCgkvKiBmaXhtZTogbG9vayBhdCBieXRlc3BlcmxpbmUhICovCgoJaWYoIDAgIT0gdnYtPnZmbGlwICkgewoJCXZkbWEyLT5wcm90X2FkZHIJPSBidWYtPnB0WzFdLm9mZnNldDsKCQl2ZG1hMi0+YmFzZV9ldmVuCT0gKCh2ZG1hMi0+cGl0Y2gvMikqaGVpZ2h0KStidWYtPnB0WzFdLm9mZnNldDsKCQl2ZG1hMi0+YmFzZV9vZGQJCT0gdmRtYTItPmJhc2VfZXZlbiAtICh2ZG1hMi0+cGl0Y2gvMik7CgoJCXZkbWEzLT5wcm90X2FkZHIJPSBidWYtPnB0WzJdLm9mZnNldDsKCQl2ZG1hMy0+YmFzZV9ldmVuCT0gKCh2ZG1hMy0+cGl0Y2gvMikqaGVpZ2h0KStidWYtPnB0WzJdLm9mZnNldDsKCQl2ZG1hMy0+YmFzZV9vZGQJCT0gdmRtYTMtPmJhc2VfZXZlbiAtICh2ZG1hMy0+cGl0Y2gvMik7Cgl9IGVsc2UgewoJCXZkbWEzLT5iYXNlX2V2ZW4JPSBidWYtPnB0WzJdLm9mZnNldDsKCQl2ZG1hMy0+YmFzZV9vZGQJCT0gdmRtYTMtPmJhc2VfZXZlbiArICh2ZG1hMy0+cGl0Y2gvMik7CgkJdmRtYTMtPnByb3RfYWRkcgk9ICh2ZG1hMy0+cGl0Y2gvMikqaGVpZ2h0K2J1Zi0+cHRbMl0ub2Zmc2V0OwoKCQl2ZG1hMi0+YmFzZV9ldmVuCT0gYnVmLT5wdFsxXS5vZmZzZXQ7CgkJdmRtYTItPmJhc2Vfb2RkCQk9IHZkbWEyLT5iYXNlX2V2ZW4gKyAodmRtYTItPnBpdGNoLzIpOwoJCXZkbWEyLT5wcm90X2FkZHIJPSAodmRtYTItPnBpdGNoLzIpKmhlaWdodCtidWYtPnB0WzFdLm9mZnNldDsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBjYWxjX3BsYW5hcl80MjAoc3RydWN0IHNhYTcxNDZfdnYgKnZ2LCBzdHJ1Y3Qgc2FhNzE0Nl9idWYgKmJ1Ziwgc3RydWN0IHNhYTcxNDZfdmlkZW9fZG1hICp2ZG1hMiwgc3RydWN0IHNhYTcxNDZfdmlkZW9fZG1hICp2ZG1hMykKewoJaW50IGhlaWdodCA9IGJ1Zi0+Zm10LT5oZWlnaHQ7CglpbnQgd2lkdGggPSBidWYtPmZtdC0+d2lkdGg7CgoJdmRtYTItPnBpdGNoCT0gd2lkdGgvMjsKCXZkbWEzLT5waXRjaAk9IHdpZHRoLzI7CgoJaWYoIDAgIT0gdnYtPnZmbGlwICkgewoJCXZkbWEyLT5wcm90X2FkZHIJPSBidWYtPnB0WzJdLm9mZnNldDsKCQl2ZG1hMi0+YmFzZV9ldmVuCT0gKCh2ZG1hMi0+cGl0Y2gvMikqaGVpZ2h0KStidWYtPnB0WzJdLm9mZnNldDsKCQl2ZG1hMi0+YmFzZV9vZGQJCT0gdmRtYTItPmJhc2VfZXZlbiAtICh2ZG1hMi0+cGl0Y2gvMik7CgoJCXZkbWEzLT5wcm90X2FkZHIJPSBidWYtPnB0WzFdLm9mZnNldDsKCQl2ZG1hMy0+YmFzZV9ldmVuCT0gKCh2ZG1hMy0+cGl0Y2gvMikqaGVpZ2h0KStidWYtPnB0WzFdLm9mZnNldDsKCQl2ZG1hMy0+YmFzZV9vZGQJCT0gdmRtYTMtPmJhc2VfZXZlbiAtICh2ZG1hMy0+cGl0Y2gvMik7CgoJfSBlbHNlIHsKCQl2ZG1hMy0+YmFzZV9ldmVuCT0gYnVmLT5wdFsyXS5vZmZzZXQ7CgkJdmRtYTMtPmJhc2Vfb2RkCQk9IHZkbWEzLT5iYXNlX2V2ZW4gKyAodmRtYTMtPnBpdGNoKTsKCQl2ZG1hMy0+cHJvdF9hZGRyCT0gKHZkbWEzLT5waXRjaC8yKSpoZWlnaHQrYnVmLT5wdFsyXS5vZmZzZXQ7CgoJCXZkbWEyLT5iYXNlX2V2ZW4JPSBidWYtPnB0WzFdLm9mZnNldDsKCQl2ZG1hMi0+YmFzZV9vZGQJCT0gdmRtYTItPmJhc2VfZXZlbiArICh2ZG1hMi0+cGl0Y2gpOwoJCXZkbWEyLT5wcm90X2FkZHIJPSAodmRtYTItPnBpdGNoLzIpKmhlaWdodCtidWYtPnB0WzFdLm9mZnNldDsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNhbGN1bGF0ZV92aWRlb19kbWFfZ3JhYl9wbGFuYXIoc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYsIHN0cnVjdCBzYWE3MTQ2X2J1ZiAqYnVmKQp7CglzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CglzdHJ1Y3Qgc2FhNzE0Nl92aWRlb19kbWEgdmRtYTE7CglzdHJ1Y3Qgc2FhNzE0Nl92aWRlb19kbWEgdmRtYTI7CglzdHJ1Y3Qgc2FhNzE0Nl92aWRlb19kbWEgdmRtYTM7CgoJc3RydWN0IHNhYTcxNDZfZm9ybWF0ICpzZm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhkZXYsYnVmLT5mbXQtPnBpeGVsZm9ybWF0KTsKCglpbnQgd2lkdGggPSBidWYtPmZtdC0+d2lkdGg7CglpbnQgaGVpZ2h0ID0gYnVmLT5mbXQtPmhlaWdodDsKCWVudW0gdjRsMl9maWVsZCBmaWVsZCA9IGJ1Zi0+Zm10LT5maWVsZDsKCglCVUdfT04oMCA9PSBidWYtPnB0WzBdLmRtYSk7CglCVUdfT04oMCA9PSBidWYtPnB0WzFdLmRtYSk7CglCVUdfT04oMCA9PSBidWYtPnB0WzJdLmRtYSk7CgoJREVCX0NBUCgoIltzaXplPSVkeCVkLGZpZWxkcz0lc11cbiIsCgkJd2lkdGgsaGVpZ2h0LHY0bDJfZmllbGRfbmFtZXNbZmllbGRdKSk7CgoJLyogZml4bWU6IGxvb2sgYXQgYnl0ZXNwZXJsaW5lISAqLwoKCS8qIGZpeG1lOiB3aGF0IGhhcHBlbnMgZm9yIHVzZXIgc3BhY2UgYnVmZmVycyBoZXJlPy4gVGhlIG9mZnNldHMgYXJlCgkgICBtb3N0IGxpa2VseSB3cm9uZywgdGhpcyB2ZXJzaW9uIGhlcmUgb25seSB3b3JrcyBmb3IgcGFnZS1hbGlnbmVkCgkgICBidWZmZXJzLCBtb2RpZmljYXRpb25zIHRvIHRoZSBwYWdldGFibGUtZnVuY3Rpb25zIGFyZSBuZWNlc3NhcnkuLi4qLwoKCXZkbWExLnBpdGNoCQk9IHdpZHRoKjI7Cgl2ZG1hMS5udW1fbGluZV9ieXRlCT0gKCh2di0+c3RhbmRhcmQtPnZfZmllbGQ8PDE2KSArIHZ2LT5zdGFuZGFyZC0+aF9waXhlbHMpOwoJdmRtYTEuYmFzZV9wYWdlCQk9IGJ1Zi0+cHRbMF0uZG1hIHwgTUUxOwoKCWlmKCAwICE9IHZ2LT52ZmxpcCApIHsKCQl2ZG1hMS5wcm90X2FkZHIJPSBidWYtPnB0WzBdLm9mZnNldDsKCQl2ZG1hMS5iYXNlX2V2ZW4JPSAoKHZkbWExLnBpdGNoLzIpKmhlaWdodCkrYnVmLT5wdFswXS5vZmZzZXQ7CgkJdmRtYTEuYmFzZV9vZGQJPSB2ZG1hMS5iYXNlX2V2ZW4gLSAodmRtYTEucGl0Y2gvMik7Cgl9IGVsc2UgewoJCXZkbWExLmJhc2VfZXZlbgk9IGJ1Zi0+cHRbMF0ub2Zmc2V0OwoJCXZkbWExLmJhc2Vfb2RkCT0gdmRtYTEuYmFzZV9ldmVuICsgKHZkbWExLnBpdGNoLzIpOwoJCXZkbWExLnByb3RfYWRkcgk9ICh2ZG1hMS5waXRjaC8yKSpoZWlnaHQrYnVmLT5wdFswXS5vZmZzZXQ7Cgl9CgoJdmRtYTIubnVtX2xpbmVfYnl0ZQk9IDA7IC8qIHVudXNlZCAqLwoJdmRtYTIuYmFzZV9wYWdlCQk9IGJ1Zi0+cHRbMV0uZG1hIHwgTUUxOwoKCXZkbWEzLm51bV9saW5lX2J5dGUJPSAwOyAvKiB1bnVzZWQgKi8KCXZkbWEzLmJhc2VfcGFnZQkJPSBidWYtPnB0WzJdLmRtYSB8IE1FMTsKCglzd2l0Y2goIHNmbXQtPmRlcHRoICkgewoJCWNhc2UgMTI6IHsKCQkJY2FsY19wbGFuYXJfNDIwKHZ2LGJ1ZiwmdmRtYTIsJnZkbWEzKTsKCQkJYnJlYWs7CgkJfQoJCWNhc2UgMTY6IHsKCQkJY2FsY19wbGFuYXJfNDIyKHZ2LGJ1ZiwmdmRtYTIsJnZkbWEzKTsKCQkJYnJlYWs7CgkJfQoJCWRlZmF1bHQ6IHsKCQkJcmV0dXJuIC0xOwoJCX0KCX0KCglpZiAoVjRMMl9GSUVMRF9IQVNfQk9USChmaWVsZCkpIHsKCX0gZWxzZSBpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9BTFRFUk5BVEUpIHsKCQkvKiBmaXhtZSAqLwoJCXZkbWExLmJhc2Vfb2RkCT0gdmRtYTEucHJvdF9hZGRyOwoJCXZkbWExLnBpdGNoIC89IDI7CgkJdmRtYTIuYmFzZV9vZGQJPSB2ZG1hMi5wcm90X2FkZHI7CgkJdmRtYTIucGl0Y2ggLz0gMjsKCQl2ZG1hMy5iYXNlX29kZAk9IHZkbWEzLnByb3RfYWRkcjsKCQl2ZG1hMy5waXRjaCAvPSAyOwoJfSBlbHNlIGlmIChmaWVsZCA9PSBWNEwyX0ZJRUxEX1RPUCkgewoJCXZkbWExLmJhc2Vfb2RkCT0gdmRtYTEucHJvdF9hZGRyOwoJCXZkbWExLnBpdGNoIC89IDI7CgkJdmRtYTIuYmFzZV9vZGQJPSB2ZG1hMi5wcm90X2FkZHI7CgkJdmRtYTIucGl0Y2ggLz0gMjsKCQl2ZG1hMy5iYXNlX29kZAk9IHZkbWEzLnByb3RfYWRkcjsKCQl2ZG1hMy5waXRjaCAvPSAyOwoJfSBlbHNlIGlmIChmaWVsZCA9PSBWNEwyX0ZJRUxEX0JPVFRPTSkgewoJCXZkbWExLmJhc2Vfb2RkCT0gdmRtYTEuYmFzZV9ldmVuOwoJCXZkbWExLmJhc2VfZXZlbiA9IHZkbWExLnByb3RfYWRkcjsKCQl2ZG1hMS5waXRjaCAvPSAyOwoJCXZkbWEyLmJhc2Vfb2RkCT0gdmRtYTIuYmFzZV9ldmVuOwoJCXZkbWEyLmJhc2VfZXZlbiA9IHZkbWEyLnByb3RfYWRkcjsKCQl2ZG1hMi5waXRjaCAvPSAyOwoJCXZkbWEzLmJhc2Vfb2RkCT0gdmRtYTMuYmFzZV9ldmVuOwoJCXZkbWEzLmJhc2VfZXZlbiA9IHZkbWEzLnByb3RfYWRkcjsKCQl2ZG1hMy5waXRjaCAvPSAyOwoJfQoKCWlmKCAwICE9IHZ2LT52ZmxpcCApIHsKCQl2ZG1hMS5waXRjaCAqPSAtMTsKCQl2ZG1hMi5waXRjaCAqPSAtMTsKCQl2ZG1hMy5waXRjaCAqPSAtMTsKCX0KCglzYWE3MTQ2X3dyaXRlX291dF9kbWEoZGV2LCAxLCAmdmRtYTEpOwoJaWYoIChzZm10LT5mbGFncyAmIEZPUk1BVF9CWVRFX1NXQVApICE9IDAgKSB7CgkJc2FhNzE0Nl93cml0ZV9vdXRfZG1hKGRldiwgMywgJnZkbWEyKTsKCQlzYWE3MTQ2X3dyaXRlX291dF9kbWEoZGV2LCAyLCAmdmRtYTMpOwoJfSBlbHNlIHsKCQlzYWE3MTQ2X3dyaXRlX291dF9kbWEoZGV2LCAyLCAmdmRtYTIpOwoJCXNhYTcxNDZfd3JpdGVfb3V0X2RtYShkZXYsIDMsICZ2ZG1hMyk7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgcHJvZ3JhbV9jYXB0dXJlX2VuZ2luZShzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgaW50IHBsYW5hcikKewoJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwoJaW50IGNvdW50ID0gMDsKCgl1bnNpZ25lZCBsb25nIGVfd2FpdCA9IHZ2LT5jdXJyZW50X2hwc19zeW5jID09IFNBQTcxNDZfSFBTX1NZTkNfUE9SVF9BID8gQ01EX0VfRklEX0EgOiBDTURfRV9GSURfQjsKCXVuc2lnbmVkIGxvbmcgb193YWl0ID0gdnYtPmN1cnJlbnRfaHBzX3N5bmMgPT0gU0FBNzE0Nl9IUFNfU1lOQ19QT1JUX0EgPyBDTURfT19GSURfQSA6IENNRF9PX0ZJRF9COwoKCS8qIHdhaXQgZm9yIG9fZmlkX2EvYiAvIGVfZmlkX2EvYiB0b2dnbGUgb25seSBpZiBycHMgcmVnaXN0ZXIgMCBpcyBub3Qgc2V0Ki8KCVdSSVRFX1JQUzAoQ01EX1BBVVNFIHwgQ01EX09BTiB8IENNRF9TSUcwIHwgb193YWl0KTsKCVdSSVRFX1JQUzAoQ01EX1BBVVNFIHwgQ01EX09BTiB8IENNRF9TSUcwIHwgZV93YWl0KTsKCgkvKiBzZXQgcnBzIHJlZ2lzdGVyIDAgKi8KCVdSSVRFX1JQUzAoQ01EX1dSX1JFRyB8ICgxIDw8IDgpIHwgKE1DMi80KSk7CglXUklURV9SUFMwKE1BU0tfMjcgfCBNQVNLXzExKTsKCgkvKiB0dXJuIG9uIHZpZGVvLWRtYTEgKi8KCVdSSVRFX1JQUzAoQ01EX1dSX1JFR19NQVNLIHwgKE1DMS80KSk7CglXUklURV9SUFMwKE1BU0tfMDYgfCBNQVNLXzIyKTsJCQkvKiA9PiBtYXNrICovCglXUklURV9SUFMwKE1BU0tfMDYgfCBNQVNLXzIyKTsJCQkvKiA9PiB2YWx1ZXMgKi8KCWlmKCAwICE9IHBsYW5hciApIHsKCQkvKiB0dXJuIG9uIHZpZGVvLWRtYTIgKi8KCQlXUklURV9SUFMwKENNRF9XUl9SRUdfTUFTSyB8IChNQzEvNCkpOwoJCVdSSVRFX1JQUzAoTUFTS18wNSB8IE1BU0tfMjEpOwkJCS8qID0+IG1hc2sgKi8KCQlXUklURV9SUFMwKE1BU0tfMDUgfCBNQVNLXzIxKTsJCQkvKiA9PiB2YWx1ZXMgKi8KCgkJLyogdHVybiBvbiB2aWRlby1kbWEzICovCgkJV1JJVEVfUlBTMChDTURfV1JfUkVHX01BU0sgfCAoTUMxLzQpKTsKCQlXUklURV9SUFMwKE1BU0tfMDQgfCBNQVNLXzIwKTsJCQkvKiA9PiBtYXNrICovCgkJV1JJVEVfUlBTMChNQVNLXzA0IHwgTUFTS18yMCk7CQkJLyogPT4gdmFsdWVzICovCgl9CgoJLyogd2FpdCBmb3Igb19maWRfYS9iIC8gZV9maWRfYS9iIHRvZ2dsZSAqLwoJaWYgKCB2di0+bGFzdF9maWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgKSB7CgkJV1JJVEVfUlBTMChDTURfUEFVU0UgfCBvX3dhaXQpOwoJCVdSSVRFX1JQUzAoQ01EX1BBVVNFIHwgZV93YWl0KTsKCX0gZWxzZSBpZiAoIHZ2LT5sYXN0X2ZpZWxkID09IFY0TDJfRklFTERfVE9QICkgewoJCVdSSVRFX1JQUzAoQ01EX1BBVVNFIHwgKHZ2LT5jdXJyZW50X2hwc19zeW5jID09IFNBQTcxNDZfSFBTX1NZTkNfUE9SVF9BID8gTUFTS18xMCA6IE1BU0tfMDkpKTsKCQlXUklURV9SUFMwKENNRF9QQVVTRSB8IG9fd2FpdCk7Cgl9IGVsc2UgaWYgKCB2di0+bGFzdF9maWVsZCA9PSBWNEwyX0ZJRUxEX0JPVFRPTSApIHsKCQlXUklURV9SUFMwKENNRF9QQVVTRSB8ICh2di0+Y3VycmVudF9ocHNfc3luYyA9PSBTQUE3MTQ2X0hQU19TWU5DX1BPUlRfQSA/IE1BU0tfMTAgOiBNQVNLXzA5KSk7CgkJV1JJVEVfUlBTMChDTURfUEFVU0UgfCBlX3dhaXQpOwoJfQoKCS8qIHR1cm4gb2ZmIHZpZGVvLWRtYTEgKi8KCVdSSVRFX1JQUzAoQ01EX1dSX1JFR19NQVNLIHwgKE1DMS80KSk7CglXUklURV9SUFMwKE1BU0tfMjIgfCBNQVNLXzA2KTsJCQkvKiA9PiBtYXNrICovCglXUklURV9SUFMwKE1BU0tfMjIpOwkJCQkvKiA9PiB2YWx1ZXMgKi8KCWlmKCAwICE9IHBsYW5hciApIHsKCQkvKiB0dXJuIG9mZiB2aWRlby1kbWEyICovCgkJV1JJVEVfUlBTMChDTURfV1JfUkVHX01BU0sgfCAoTUMxLzQpKTsKCQlXUklURV9SUFMwKE1BU0tfMDUgfCBNQVNLXzIxKTsJCQkvKiA9PiBtYXNrICovCgkJV1JJVEVfUlBTMChNQVNLXzIxKTsJCQkJLyogPT4gdmFsdWVzICovCgoJCS8qIHR1cm4gb2ZmIHZpZGVvLWRtYTMgKi8KCQlXUklURV9SUFMwKENNRF9XUl9SRUdfTUFTSyB8IChNQzEvNCkpOwoJCVdSSVRFX1JQUzAoTUFTS18wNCB8IE1BU0tfMjApOwkJCS8qID0+IG1hc2sgKi8KCQlXUklURV9SUFMwKE1BU0tfMjApOwkJCQkvKiA9PiB2YWx1ZXMgKi8KCX0KCgkvKiBnZW5lcmF0ZSBpbnRlcnJ1cHQgKi8KCVdSSVRFX1JQUzAoQ01EX0lOVEVSUlVQVCk7CgoJLyogc3RvcCAqLwoJV1JJVEVfUlBTMChDTURfU1RPUCk7Cn0KCnZvaWQgc2FhNzE0Nl9zZXRfY2FwdHVyZShzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgc3RydWN0IHNhYTcxNDZfYnVmICpidWYsIHN0cnVjdCBzYWE3MTQ2X2J1ZiAqbmV4dCkKewoJc3RydWN0IHNhYTcxNDZfZm9ybWF0ICpzZm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhkZXYsYnVmLT5mbXQtPnBpeGVsZm9ybWF0KTsKCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKCXUzMiB2ZG1hMV9wcm90X2FkZHI7CgoJREVCX0NBUCgoImJ1ZjolcCwgbmV4dDolcFxuIixidWYsbmV4dCkpOwoKCXZkbWExX3Byb3RfYWRkciA9IHNhYTcxNDZfcmVhZChkZXYsIFBST1RfQUREUjEpOwoJaWYoIDAgPT0gdmRtYTFfcHJvdF9hZGRyICkgewoJCS8qIGNsZWFyIG91dCBiZWdpbm5pbmcgb2Ygc3RyZWFtaW5nIGJpdCAocnBzIHJlZ2lzdGVyIDApKi8KCQlERUJfQ0FQKCgiZm9yY2luZyBzeW5jIHRvIG5ldyBmcmFtZVxuIikpOwoJCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzIsIE1BU0tfMjcgKTsKCX0KCglzYWE3MTQ2X3NldF93aW5kb3coZGV2LCBidWYtPmZtdC0+d2lkdGgsIGJ1Zi0+Zm10LT5oZWlnaHQsIGJ1Zi0+Zm10LT5maWVsZCk7CglzYWE3MTQ2X3NldF9vdXRwdXRfZm9ybWF0KGRldiwgc2ZtdC0+dHJhbnMpOwoJc2FhNzE0Nl9kaXNhYmxlX2NsaXBwaW5nKGRldik7CgoJaWYgKCB2di0+bGFzdF9maWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgKSB7Cgl9IGVsc2UgaWYgKCB2di0+bGFzdF9maWVsZCA9PSBWNEwyX0ZJRUxEX1RPUCApIHsKCQl2di0+bGFzdF9maWVsZCA9IFY0TDJfRklFTERfQk9UVE9NOwoJfSBlbHNlIGlmICggdnYtPmxhc3RfZmllbGQgPT0gVjRMMl9GSUVMRF9CT1RUT00gKSB7CgkJdnYtPmxhc3RfZmllbGQgPSBWNEwyX0ZJRUxEX1RPUDsKCX0KCglpZiggMCAhPSBJU19QTEFOQVIoc2ZtdC0+dHJhbnMpKSB7CgkJY2FsY3VsYXRlX3ZpZGVvX2RtYV9ncmFiX3BsYW5hcihkZXYsIGJ1Zik7CgkJcHJvZ3JhbV9jYXB0dXJlX2VuZ2luZShkZXYsMSk7Cgl9IGVsc2UgewoJCWNhbGN1bGF0ZV92aWRlb19kbWFfZ3JhYl9wYWNrZWQoZGV2LCBidWYpOwoJCXByb2dyYW1fY2FwdHVyZV9lbmdpbmUoZGV2LDApOwoJfQoKLyoKCXByaW50aygidmRtYSVkLmJhc2VfZXZlbjogICAgIDB4JTA4eFxuIiwgMSxzYWE3MTQ2X3JlYWQoZGV2LEJBU0VfRVZFTjEpKTsKCXByaW50aygidmRtYSVkLmJhc2Vfb2RkOiAgICAgIDB4JTA4eFxuIiwgMSxzYWE3MTQ2X3JlYWQoZGV2LEJBU0VfT0REMSkpOwoJcHJpbnRrKCJ2ZG1hJWQucHJvdF9hZGRyOiAgICAgMHglMDh4XG4iLCAxLHNhYTcxNDZfcmVhZChkZXYsUFJPVF9BRERSMSkpOwoJcHJpbnRrKCJ2ZG1hJWQuYmFzZV9wYWdlOiAgICAgMHglMDh4XG4iLCAxLHNhYTcxNDZfcmVhZChkZXYsQkFTRV9QQUdFMSkpOwoJcHJpbnRrKCJ2ZG1hJWQucGl0Y2g6ICAgICAgICAgMHglMDh4XG4iLCAxLHNhYTcxNDZfcmVhZChkZXYsUElUQ0gxKSk7CglwcmludGsoInZkbWElZC5udW1fbGluZV9ieXRlOiAweCUwOHhcbiIsIDEsc2FhNzE0Nl9yZWFkKGRldixOVU1fTElORV9CWVRFMSkpOwoJcHJpbnRrKCJ2ZG1hJWQgPT4gdnB0ciAgICAgIDogMHglMDh4XG4iLCAxLHNhYTcxNDZfcmVhZChkZXYsUENJX1ZEUDEpKTsKKi8KCgkvKiB3cml0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgcnBzLXByb2dyYW0gKi8KCXNhYTcxNDZfd3JpdGUoZGV2LCBSUFNfQUREUjAsIGRldi0+ZF9ycHMwLmRtYV9oYW5kbGUpOwoKCS8qIHR1cm4gb24gcnBzICovCglzYWE3MTQ2X3dyaXRlKGRldiwgTUMxLCAoTUFTS18xMiB8IE1BU0tfMjgpKTsKfQo=