LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVFguLCBVU0EsCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKICogb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBBdXRob3JzOiBUaG9tYXMgSGVsbHN0cvZtIDx0aG9tYXMtYXQtdHVuZ3N0ZW5ncmFwaGljcy1kb3QtY29tPgogKi8KCiNpbmNsdWRlICJkcm1QLmgiCiNpbmNsdWRlICJ2aWFfZHJtLmgiCiNpbmNsdWRlICJ2aWFfZHJ2LmgiCgpzdHJ1Y3QgZHJtX3R0bV9iYWNrZW5kICp2aWFfY3JlYXRlX3R0bV9iYWNrZW5kX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQp7CglyZXR1cm4gZHJtX2FncF9pbml0X3R0bShkZXYpOwp9CgppbnQgdmlhX2ZlbmNlX3R5cGVzKHN0cnVjdCBkcm1fYnVmZmVyX29iamVjdCAqYm8sIHVpbnQzMl90ICogdHlwZSkKewoJKnR5cGUgPSAzOwoJcmV0dXJuIDA7Cn0KCmludCB2aWFfaW52YWxpZGF0ZV9jYWNoZXMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVpbnQ2NF90IGZsYWdzKQp7CgkvKgoJICogRklYTUU6IEludmFsaWRhdGUgdGV4dHVyZSBjYWNoZXMgaGVyZS4KCSAqLwoKCXJldHVybiAwOwp9CgoKc3RhdGljIGludCB2aWFfdnJhbV9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCgkJCSB1bnNpZ25lZCBsb25nICpvZmZzZXQsCgkJCSB1bnNpZ25lZCBsb25nICpzaXplKQp7CglzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJaW50IHJldCA9IC1FSU5WQUw7CglpbnQgaTsKCWZvciAoaT0wOyBpPDY7ICsraSkgewoJCWZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpOwoJCWlmICgoZmxhZ3MgJiAoSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX1BSRUZFVENIKSkgPT0KCQkgICAgKElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9QUkVGRVRDSCkpIHsKCQkJcmV0ID0gMDsKCQkJYnJlYWs7CgkJfQoJfQoKCWlmIChyZXQpIHsKCQlEUk1fRVJST1IoIkNvdWxkIG5vdCBmaW5kIFZSQU0gUENJIHJlc291cmNlXG4iKTsKCQlyZXR1cm4gcmV0OwoJfQoKCSpvZmZzZXQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSk7Cgkqc2l6ZSA9IHBjaV9yZXNvdXJjZV9lbmQocGRldiwgaSkgLSAqb2Zmc2V0ICsgMTsKCXJldHVybiAwOwp9CgppbnQgdmlhX2luaXRfbWVtX3R5cGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVpbnQzMl90IHR5cGUsCgkJICAgICAgIHN0cnVjdCBkcm1fbWVtX3R5cGVfbWFuYWdlciAqIG1hbikKewoJc3dpdGNoICh0eXBlKSB7CgljYXNlIERSTV9CT19NRU1fTE9DQUw6CgkJLyogU3lzdGVtIG1lbW9yeSAqLwoKCQltYW4tPmZsYWdzID0gX0RSTV9GTEFHX01FTVRZUEVfTUFQUEFCTEUgfAoJCQlfRFJNX0ZMQUdfTUVNVFlQRV9DQUNIRUQ7CgkJbWFuLT5kcm1fYnVzX21hcHR5cGUgPSAwOwoJCWJyZWFrOwoKCWNhc2UgRFJNX0JPX01FTV9UVDogCgkJLyogRHluYW1pYyBhZ3BnYXJ0IG1lbW9yeSAqLwoJCQoJCWlmICghKGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJiBkZXYtPmFncCkpIHsKCQkJRFJNX0VSUk9SKCJBR1AgaXMgbm90IGVuYWJsZWQgZm9yIG1lbW9yeSB0eXBlICV1XG4iLAoJCQkJICAodW5zaWduZWQpdHlwZSk7CgkJCXJldHVybiAtRUlOVkFMOwoJCX0KCQltYW4tPmlvX29mZnNldCA9IGRldi0+YWdwLT5hZ3BfaW5mby5hcGVyX2Jhc2U7CgkJbWFuLT5pb19zaXplID0gZGV2LT5hZ3AtPmFncF9pbmZvLmFwZXJfc2l6ZSAqIDEwMjQgKiAxMDI0OwoJCW1hbi0+aW9fYWRkciA9IE5VTEw7CgkJbWFuLT5mbGFncyA9IF9EUk1fRkxBR19NRU1UWVBFX01BUFBBQkxFIHwgX0RSTV9GTEFHX05FRURTX0lPUkVNQVA7CgoJCS8qIE9ubHkgdG8gZ2V0IHB0ZSBwcm90ZWN0aW9uIHJpZ2h0LiAqLwoKCQltYW4tPmRybV9idXNfbWFwdHlwZSA9IF9EUk1fQUdQOyAKCQlicmVhazsKCgljYXNlIERSTV9CT19NRU1fVlJBTTogCgkJLyogIk9uLWNhcmQiIHZpZGVvIHJhbSAqLwoJCQoJCW1hbi0+ZmxhZ3MgPSBfRFJNX0ZMQUdfTUVNVFlQRV9NQVBQQUJMRSB8IF9EUk1fRkxBR19ORUVEU19JT1JFTUFQOwoJCW1hbi0+ZHJtX2J1c19tYXB0eXBlID0gX0RSTV9GUkFNRV9CVUZGRVI7CgkJbWFuLT5pb19hZGRyID0gTlVMTDsKCQlyZXR1cm4gdmlhX3ZyYW1faW5mbyhkZXYsICZtYW4tPmlvX29mZnNldCwgJm1hbi0+aW9fc2l6ZSk7CgkJYnJlYWs7CgoJY2FzZSBEUk1fQk9fTUVNX1BSSVYwOiAKCQkvKiBQcmUtYm91bmQgYWdwZ2FydCBtZW1vcnkgKi8KCQkKCQlpZiAoIShkcm1fY29yZV9oYXNfQUdQKGRldikgJiYgZGV2LT5hZ3ApKSB7CgkJCURSTV9FUlJPUigiQUdQIGlzIG5vdCBlbmFibGVkIGZvciBtZW1vcnkgdHlwZSAldVxuIiwKCQkJCSAgKHVuc2lnbmVkKXR5cGUpOwoJCQlyZXR1cm4gLUVJTlZBTDsKCQl9CgkJbWFuLT5pb19vZmZzZXQgPSBkZXYtPmFncC0+YWdwX2luZm8uYXBlcl9iYXNlOwoJCW1hbi0+aW9fc2l6ZSA9IGRldi0+YWdwLT5hZ3BfaW5mby5hcGVyX3NpemUgKiAxMDI0ICogMTAyNDsKCQltYW4tPmlvX2FkZHIgPSBOVUxMOwoJCW1hbi0+ZmxhZ3MgPSAgX0RSTV9GTEFHX01FTVRZUEVfTUFQUEFCTEUgfAoJCSAgICBfRFJNX0ZMQUdfTUVNVFlQRV9GSVhFRCB8IF9EUk1fRkxBR19ORUVEU19JT1JFTUFQOwoJCW1hbi0+ZHJtX2J1c19tYXB0eXBlID0gX0RSTV9BR1A7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlEUk1fRVJST1IoIlVuc3VwcG9ydGVkIG1lbW9yeSB0eXBlICV1XG4iLCAodW5zaWduZWQpdHlwZSk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CglyZXR1cm4gMDsKfQoKdWludDMyX3QgdmlhX2V2aWN0X21hc2soc3RydWN0IGRybV9idWZmZXJfb2JqZWN0ICpibykKewoJc3dpdGNoIChiby0+bWVtLm1lbV90eXBlKSB7CgljYXNlIERSTV9CT19NRU1fTE9DQUw6CgljYXNlIERSTV9CT19NRU1fVFQ6CgkJcmV0dXJuIERSTV9CT19GTEFHX01FTV9MT0NBTDsgLyogRXZpY3QgVFQgdG8gbG9jYWwgKi8KCWNhc2UgRFJNX0JPX01FTV9QUklWMDogLyogRXZpY3QgcHJlLWJvdW5kIEFHUCB0byBUVCAqLwoJCXJldHVybiBEUk1fQk9fTUVNX1RUOwoJY2FzZSBEUk1fQk9fTUVNX1ZSQU06CgkJaWYgKGJvLT5tZW0ubnVtX3BhZ2VzID4gMTI4KQoJCQlyZXR1cm4gRFJNX0JPX01FTV9UVDsKCQllbHNlCgkJCXJldHVybiBEUk1fQk9fTUVNX0xPQ0FMOwoJZGVmYXVsdDoKCQlyZXR1cm4gRFJNX0JPX01FTV9MT0NBTDsKCX0KfQo=