LyoKICogQ29weXJpZ2h0IDIwMDMgVmluY2VudCBC6XJvbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2luY2x1ZGUgImR1bXByZXMuaCIKCiNkZWZpbmUgTUFTVEVSX0xBTkdVQUdFIExBTkdfRU5HTElTSAojZGVmaW5lIE5CX0xBTkcgMHg5NAoKZW51bSBsYW5nX3R5cGVfZSB7CglsYW5nX3R5cGVfbWFzdGVyID0gMCwKCWxhbmdfdHlwZV9uZXV0cmFsLAoJbGFuZ190eXBlX25vcm1hbAp9OwoKc3RhdGljIGludCBwcmVzZW50X3Jlc291cmNlc1tyZXNfdXNyKzFdOwpzdGF0aWMgY2hhciAqcmVzX25hbWVzW3Jlc191c3IrMV07CnN0YXRpYyBpbnQgbmJfcmVzb3VyY2VzW3Jlc191c3IrMV1bbGFuZ190eXBlX25vcm1hbCsxXTsKc3RhdGljIHJlc291cmNlX3QgKipsaXN0X3Jlc291cmNlc1tyZXNfdXNyKzFdW2xhbmdfdHlwZV9ub3JtYWwrMV07CgpzdGF0aWMgaW50IGdldF9sYW5ndWFnZV9pZChyZXNvdXJjZV90ICpyZXNvdXJjZSkgewoJc3dpdGNoKHJlc291cmNlLT50eXBlKSB7CgkJY2FzZSByZXNfYWNjOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5hY2MtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfYm1wOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5ibXAtPmRhdGEtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfY3VyOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5jdXItPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfY3VyZzoKCQkJcmV0dXJuIHJlc291cmNlLT5yZXMuY3VyZy0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19kbGc6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmRsZy0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19kbGdleDoKCQkJcmV0dXJuIHJlc291cmNlLT5yZXMuZGxnZXgtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfZm50OgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5mbnQtPmRhdGEtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfZm50ZGlyOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5mbmQtPmRhdGEtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfaWNvOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5pY28tPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfaWNvZzoKCQkJcmV0dXJuIHJlc291cmNlLT5yZXMuaWNvZy0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19tZW46CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLm1lbi0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19tZW5leDoKCQkJcmV0dXJuIHJlc291cmNlLT5yZXMubWVuZXgtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfcmR0OgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5yZHQtPmRhdGEtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfc3R0OgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5zdHQtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfdXNyOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy51c3ItPmRhdGEtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfbXNnOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5tc2ctPmRhdGEtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfdmVyOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy52ZXItPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfZGxnaW5pdDoKCQkJcmV0dXJuIHJlc291cmNlLT5yZXMuZGxnaS0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc190b29sYmFyOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy50YnQtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJY2FzZSByZXNfYW5pY3VyOgoJCWNhc2UgcmVzX2FuaWljbzoKCQkJcmV0dXJuIHJlc291cmNlLT5yZXMuYW5pLT5kYXRhLT5sdmMubGFuZ3VhZ2UtPmlkOwoJCWRlZmF1bHQ6CgkJCS8qIE5vdCBzdXBwb3NlZCB0byByZWFjaCBoZXJlICovCgkJCWZwcmludGYoc3RkZXJyLCAiTm90IHN1cHBvc2VkIHRvIHJlYWNoIGhlcmUgKGdldF9sYW5ndWFnZV9pZCgpKVxuIik7CgkJCWFib3J0KCk7CgkJCXJldHVybiAtMTsKCX0KfQoKc3RhdGljIHZvaWQgYWRkX3Jlc291cmNlKHJlc291cmNlX3QgKnJlc291cmNlKSB7CgllbnVtIGxhbmdfdHlwZV9lIGxhbmdfdHlwZTsKCWVudW0gcmVzX2UgcmVzX3R5cGUgPSByZXNvdXJjZS0+dHlwZTsKCWludCBsaWQgPSBnZXRfbGFuZ3VhZ2VfaWQocmVzb3VyY2UpOwoKCWlmKGxpZCA9PSBNQVNURVJfTEFOR1VBR0UpIHsKCQlsYW5nX3R5cGUgPSBsYW5nX3R5cGVfbWFzdGVyOwoJfSBlbHNlIGlmKGxpZCA9PSBMQU5HX05FVVRSQUwpIHsKCQlsYW5nX3R5cGUgPSBsYW5nX3R5cGVfbmV1dHJhbDsKCX0gZWxzZSB7CgkJbGFuZ190eXBlID0gbGFuZ190eXBlX25vcm1hbDsKCX0KCW5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlXSsrOwoJbGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV0gPSByZWFsbG9jKGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVdLCBuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV0qc2l6ZW9mKHJlc291cmNlX3QgKikpOwoJbGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV1bbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVdLTFdID0gcmVzb3VyY2U7Cn0KCiNpZiAwCgojZGVmaW5lIFBSRVRUWVBSSU5UTEFORyhsYW5naWQpIFwKCWlmKExBTkdfIyNsYW5naWQgPT0gbGlkKSB7IFwKCQlyZXR1cm4gI2xhbmdpZDsgXAoJfQoKc3RhdGljIGNvbnN0IGNoYXIgKmdldF9sYW5ndWFnZV9uYW1lKGludCBsaWQpIHsKCVBSRVRUWVBSSU5UTEFORyhORVVUUkFMKQoJUFJFVFRZUFJJTlRMQU5HKEFGUklLQUFOUykKCVBSRVRUWVBSSU5UTEFORyhBTEJBTklBTikKCVBSRVRUWVBSSU5UTEFORyhBUkFCSUMpCglQUkVUVFlQUklOVExBTkcoQVJNRU5JQU4pCglQUkVUVFlQUklOVExBTkcoQVNTQU1FU0UpCglQUkVUVFlQUklOVExBTkcoQVpFUkkpCglQUkVUVFlQUklOVExBTkcoQkFTUVVFKQoJUFJFVFRZUFJJTlRMQU5HKEJFTEFSVVNJQU4pCglQUkVUVFlQUklOVExBTkcoQkVOR0FMSSkKCVBSRVRUWVBSSU5UTEFORyhCVUxHQVJJQU4pCglQUkVUVFlQUklOVExBTkcoQ0FUQUxBTikKCVBSRVRUWVBSSU5UTEFORyhDSElORVNFKQoJUFJFVFRZUFJJTlRMQU5HKENST0FUSUFOKQoJUFJFVFRZUFJJTlRMQU5HKENaRUNIKQoJUFJFVFRZUFJJTlRMQU5HKERBTklTSCkKCVBSRVRUWVBSSU5UTEFORyhESVZFSEkpCglQUkVUVFlQUklOVExBTkcoRFVUQ0gpCglQUkVUVFlQUklOVExBTkcoRU5HTElTSCkKCVBSRVRUWVBSSU5UTEFORyhFU1RPTklBTikKCVBSRVRUWVBSSU5UTEFORyhGQUVST0VTRSkKCVBSRVRUWVBSSU5UTEFORyhGQVJTSSkKCVBSRVRUWVBSSU5UTEFORyhGSU5OSVNIKQoJUFJFVFRZUFJJTlRMQU5HKEZSRU5DSCkKCVBSRVRUWVBSSU5UTEFORyhHQUxJQ0lBTikKCVBSRVRUWVBSSU5UTEFORyhHRU9SR0lBTikKCVBSRVRUWVBSSU5UTEFORyhHRVJNQU4pCglQUkVUVFlQUklOVExBTkcoR1JFRUspCglQUkVUVFlQUklOVExBTkcoR1VKQVJBVEkpCglQUkVUVFlQUklOVExBTkcoSEVCUkVXKQoJUFJFVFRZUFJJTlRMQU5HKEhJTkRJKQoJUFJFVFRZUFJJTlRMQU5HKEhVTkdBUklBTikKCVBSRVRUWVBSSU5UTEFORyhJQ0VMQU5ESUMpCglQUkVUVFlQUklOVExBTkcoSU5ET05FU0lBTikKCVBSRVRUWVBSSU5UTEFORyhJVEFMSUFOKQoJUFJFVFRZUFJJTlRMQU5HKEpBUEFORVNFKQoJUFJFVFRZUFJJTlRMQU5HKEtBTk5BREEpCglQUkVUVFlQUklOVExBTkcoS0FTSE1JUkkpCglQUkVUVFlQUklOVExBTkcoS0FaQUspCglQUkVUVFlQUklOVExBTkcoS09OS0FOSSkKCVBSRVRUWVBSSU5UTEFORyhLT1JFQU4pCglQUkVUVFlQUklOVExBTkcoS1lSR1laKQoJUFJFVFRZUFJJTlRMQU5HKExBVFZJQU4pCglQUkVUVFlQUklOVExBTkcoTElUSFVBTklBTikKCVBSRVRUWVBSSU5UTEFORyhNQUNFRE9OSUFOKQoJUFJFVFRZUFJJTlRMQU5HKE1BTEFZKQoJUFJFVFRZUFJJTlRMQU5HKE1BTEFZQUxBTSkKCVBSRVRUWVBSSU5UTEFORyhNQU5JUFVSSSkKCVBSRVRUWVBSSU5UTEFORyhNQVJBVEhJKQoJUFJFVFRZUFJJTlRMQU5HKE1PTkdPTElBTikKCVBSRVRUWVBSSU5UTEFORyhORVBBTEkpCglQUkVUVFlQUklOVExBTkcoTk9SV0VHSUFOKQoJUFJFVFRZUFJJTlRMQU5HKE9SSVlBKQoJUFJFVFRZUFJJTlRMQU5HKFBPTElTSCkKCVBSRVRUWVBSSU5UTEFORyhQT1JUVUdVRVNFKQoJUFJFVFRZUFJJTlRMQU5HKFBVTkpBQkkpCglQUkVUVFlQUklOVExBTkcoUk9NQU5JQU4pCglQUkVUVFlQUklOVExBTkcoUlVTU0lBTikKCVBSRVRUWVBSSU5UTEFORyhTQU5TS1JJVCkKCVBSRVRUWVBSSU5UTEFORyhTRVJCSUFOKQoJUFJFVFRZUFJJTlRMQU5HKFNJTkRISSkKCVBSRVRUWVBSSU5UTEFORyhTTE9WQUspCglQUkVUVFlQUklOVExBTkcoU0xPVkVOSUFOKQoJUFJFVFRZUFJJTlRMQU5HKFNQQU5JU0gpCglQUkVUVFlQUklOVExBTkcoU1dBSElMSSkKCVBSRVRUWVBSSU5UTEFORyhTV0VESVNIKQoJUFJFVFRZUFJJTlRMQU5HKFNZUklBQykKCVBSRVRUWVBSSU5UTEFORyhUQU1JTCkKCVBSRVRUWVBSSU5UTEFORyhUQVRBUikKCVBSRVRUWVBSSU5UTEFORyhURUxVR1UpCglQUkVUVFlQUklOVExBTkcoVEhBSSkKCVBSRVRUWVBSSU5UTEFORyhUVVJLSVNIKQoJUFJFVFRZUFJJTlRMQU5HKFVLUkFJTklBTikKCVBSRVRUWVBSSU5UTEFORyhVUkRVKQoJUFJFVFRZUFJJTlRMQU5HKFVaQkVLKQoJUFJFVFRZUFJJTlRMQU5HKFZJRVROQU1FU0UpCglQUkVUVFlQUklOVExBTkcoR0FFTElDKQoJUFJFVFRZUFJJTlRMQU5HKE1BTFRFU0UpCglQUkVUVFlQUklOVExBTkcoTUFPUkkpCglQUkVUVFlQUklOVExBTkcoUkhBRVRPX1JPTUFOQ0UpCglQUkVUVFlQUklOVExBTkcoU0FBTUkpCglQUkVUVFlQUklOVExBTkcoU09SQklBTikKCVBSRVRUWVBSSU5UTEFORyhTVVRVKQoJUFJFVFRZUFJJTlRMQU5HKFRTT05HQSkKCVBSRVRUWVBSSU5UTEFORyhUU1dBTkEpCglQUkVUVFlQUklOVExBTkcoVkVOREEpCglQUkVUVFlQUklOVExBTkcoWEhPU0EpCglQUkVUVFlQUklOVExBTkcoWlVMVSkKCVBSRVRUWVBSSU5UTEFORyhFU1BFUkFOVE8pCglQUkVUVFlQUklOVExBTkcoV0FMT04pCglQUkVUVFlQUklOVExBTkcoQ09STklTSCkKCVBSRVRUWVBSSU5UTEFORyhXRUxTSCkKCVBSRVRUWVBSSU5UTEFORyhCUkVUT04pCglyZXR1cm4gIlVua293biBsYW5ndWFnZSI7Cn0KI2VuZGlmCgpzdGF0aWMgaW50IGNvbXBhcmVfYWNjZWxlcmF0b3IoYWNjZWxlcmF0b3JfdCAqYWNjZWxlcmF0b3IxLCBhY2NlbGVyYXRvcl90ICphY2NlbGVyYXRvcjIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJZXZlbnRfdCAqZXYxID0gTlVMTCwgKmV2MiA9IE5VTEw7CglpZighZGlmZmVyZW50ICYmCgkgICAoKGFjY2VsZXJhdG9yMS0+bWVtb3B0ICE9IGFjY2VsZXJhdG9yMi0+bWVtb3B0KSB8fAoJICAgKGFjY2VsZXJhdG9yMS0+bHZjLnZlcnNpb24gIT0gYWNjZWxlcmF0b3IyLT5sdmMudmVyc2lvbikgfHwKCSAgIChhY2NlbGVyYXRvcjEtPmx2Yy5jaGFyYWN0cyAhPSBhY2NlbGVyYXRvcjItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglldjEgPSBhY2NlbGVyYXRvcjEtPmV2ZW50czsKCWV2MiA9IGFjY2VsZXJhdG9yMi0+ZXZlbnRzOwoJd2hpbGUoIWRpZmZlcmVudCAmJiBldjEgJiYgZXYyKSB7CgkJaWYoIWRpZmZlcmVudCAmJgoJCSAgICgoZXYxLT5pZCAhPSBldjItPmlkKSB8fAoJCSAgIChldjEtPmZsYWdzICE9IGV2Mi0+ZmxhZ3MpKSkKCQkJZGlmZmVyZW50ID0gMTsKCQlldjEgPSBldjEtPm5leHQ7CgkJZXYyID0gZXYyLT5uZXh0OwoJfQoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChldjEgJiYgIWV2MikgfHwgKCFldjEgJiYgZXYyKSkpCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9iaXRtYXAoYml0bWFwX3QgKmJpdG1hcDEsIGJpdG1hcF90ICpiaXRtYXAyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoYml0bWFwMS0+bWVtb3B0ICE9IGJpdG1hcDItPm1lbW9wdCkgfHwKCSAgIChiaXRtYXAxLT5kYXRhLT5sdmMudmVyc2lvbiAhPSBiaXRtYXAyLT5kYXRhLT5sdmMudmVyc2lvbikgfHwKCSAgIChiaXRtYXAxLT5kYXRhLT5sdmMuY2hhcmFjdHMgIT0gYml0bWFwMi0+ZGF0YS0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9jdXJzb3IoY3Vyc29yX3QgKmN1cnNvcjEsIGN1cnNvcl90ICpjdXJzb3IyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoY3Vyc29yMS0+aWQgIT0gY3Vyc29yMi0+aWQpIHx8CgkgICAoY3Vyc29yMS0+d2lkdGggIT0gY3Vyc29yMi0+d2lkdGgpIHx8CgkgICAoY3Vyc29yMS0+aGVpZ2h0ICE9IGN1cnNvcjItPmhlaWdodCkgfHwKCSAgIChjdXJzb3IxLT54aG90ICE9IGN1cnNvcjItPnhob3QpIHx8CgkgICAoY3Vyc29yMS0+eWhvdCAhPSBjdXJzb3IyLT55aG90KSkpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoY3Vyc29yMS0+bHZjLnZlcnNpb24gIT0gY3Vyc29yMi0+bHZjLnZlcnNpb24pIHx8CgkgICAoY3Vyc29yMS0+bHZjLmNoYXJhY3RzICE9IGN1cnNvcjItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfY3Vyc29yX2dyb3VwKGN1cnNvcl9ncm91cF90ICpjdXJzb3JfZ3JvdXAxLCBjdXJzb3JfZ3JvdXBfdCAqY3Vyc29yX2dyb3VwMikgewoJaW50IGRpZmZlcmVudCA9IDA7CgljdXJzb3JfdCAqY3Vyc29yMSA9IE5VTEwsICpjdXJzb3IyID0gTlVMTDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoY3Vyc29yX2dyb3VwMS0+bWVtb3B0ICE9IGN1cnNvcl9ncm91cDItPm1lbW9wdCkgfHwKCSAgIChjdXJzb3JfZ3JvdXAxLT5sdmMudmVyc2lvbiAhPSBjdXJzb3JfZ3JvdXAyLT5sdmMudmVyc2lvbikgfHwKCSAgIChjdXJzb3JfZ3JvdXAxLT5sdmMuY2hhcmFjdHMgIT0gY3Vyc29yX2dyb3VwMi0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgIChjdXJzb3JfZ3JvdXAxLT5uY3Vyc29yICE9IGN1cnNvcl9ncm91cDItPm5jdXJzb3IpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50KSB7CgkJY3Vyc29yMSA9IGN1cnNvcl9ncm91cDEtPmN1cnNvcmxpc3Q7CgkJY3Vyc29yMiA9IGN1cnNvcl9ncm91cDItPmN1cnNvcmxpc3Q7CgkJd2hpbGUoIWRpZmZlcmVudCAmJiBjdXJzb3IxICYmIGN1cnNvcjIpIHsKCQkJZGlmZmVyZW50ID0gY29tcGFyZV9jdXJzb3IoY3Vyc29yMSwgY3Vyc29yMik7CgkJCWN1cnNvcjEgPSBjdXJzb3IxLT5uZXh0OwoJCQljdXJzb3IyID0gY3Vyc29yMi0+bmV4dDsKCQl9CgkJaWYoIWRpZmZlcmVudCAmJgoJCSAgICgoY3Vyc29yMSAmJiAhY3Vyc29yMikgfHwKCQkgICAoIWN1cnNvcjEgJiYgY3Vyc29yMikpKQoJCQlkaWZmZXJlbnQgPSAxOwoJfQoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX2NvbnRyb2woY29udHJvbF90ICpjb250cm9sMSwgY29udHJvbF90ICpjb250cm9sMikgewoJaW50IGRpZmZlcmVudCA9IDA7CgljaGFyICpuYW1laWQgPSBOVUxMOwoJaWYoIWRpZmZlcmVudCAmJgoJCSgoY29udHJvbDEgJiYgIWNvbnRyb2wyKSB8fAoJCSghY29udHJvbDEgJiYgY29udHJvbDIpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKGRpZmZlcmVudCB8fCAhY29udHJvbDEgfHwgIWNvbnRyb2wyKQoJCXJldHVybiBkaWZmZXJlbnQ7CgluYW1laWQgPSBzdHJkdXAoZ2V0X25hbWVpZF9zdHIoY29udHJvbDEtPmN0bGNsYXNzKSk7CglpZighZGlmZmVyZW50ICYmIHN0cmNtcChuYW1laWQsIGdldF9uYW1laWRfc3RyKGNvbnRyb2wyLT5jdGxjbGFzcykpKQoJCWRpZmZlcmVudCA9IDE7CglmcmVlKG5hbWVpZCk7CglpZighZGlmZmVyZW50ICYmIAoJICAgKGNvbnRyb2wxLT5pZCAhPSBjb250cm9sMi0+aWQpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIGNvbnRyb2wxLT5nb3RzdHlsZSAmJiBjb250cm9sMi0+Z290c3R5bGUpIHsKCQlpZigoIWNvbnRyb2wxLT5zdHlsZSB8fCAhY29udHJvbDItPnN0eWxlKSB8fAoJCSAgIChjb250cm9sMS0+c3R5bGUtPmFuZF9tYXNrIHx8IGNvbnRyb2wyLT5zdHlsZS0+YW5kX21hc2spIHx8CgkJICAgKGNvbnRyb2wxLT5zdHlsZS0+b3JfbWFzayAhPSBjb250cm9sMi0+c3R5bGUtPm9yX21hc2spKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgoY29udHJvbDEtPmdvdHN0eWxlICYmICFjb250cm9sMi0+Z290c3R5bGUpIHx8CgkJICAoIWNvbnRyb2wxLT5nb3RzdHlsZSAmJiBjb250cm9sMi0+Z290c3R5bGUpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgY29udHJvbDEtPmdvdGV4c3R5bGUgJiYgY29udHJvbDItPmdvdGV4c3R5bGUpIHsKCQlpZigoIWNvbnRyb2wxLT5leHN0eWxlIHx8ICFjb250cm9sMi0+ZXhzdHlsZSkgfHwKCQkgICAoY29udHJvbDEtPmV4c3R5bGUtPmFuZF9tYXNrIHx8IGNvbnRyb2wyLT5leHN0eWxlLT5hbmRfbWFzaykgfHwKCQkgICAoY29udHJvbDEtPmV4c3R5bGUtPm9yX21hc2sgIT0gY29udHJvbDItPmV4c3R5bGUtPm9yX21hc2spKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgoY29udHJvbDEtPmdvdGV4c3R5bGUgJiYgIWNvbnRyb2wyLT5nb3RleHN0eWxlKSB8fAoJCSAgKCFjb250cm9sMS0+Z290ZXhzdHlsZSAmJiBjb250cm9sMi0+Z290ZXhzdHlsZSkpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiBjb250cm9sMS0+Z290aGVscGlkICYmIGNvbnRyb2wyLT5nb3RoZWxwaWQpIHsKCQlpZihjb250cm9sMS0+aGVscGlkICE9IGNvbnRyb2wyLT5oZWxwaWQpCgkJCWRpZmZlcmVudCA9IDE7Cgl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCSAgKChjb250cm9sMS0+Z290aGVscGlkICYmICFjb250cm9sMi0+Z290aGVscGlkKSB8fAoJCSAgKCFjb250cm9sMS0+Z290aGVscGlkICYmIGNvbnRyb2wyLT5nb3RoZWxwaWQpKSkKCQkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9kaWFsb2coZGlhbG9nX3QgKmRpYWxvZzEsIGRpYWxvZ190ICpkaWFsb2cyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWNoYXIgKm5hbWVpZCA9IE5VTEw7CglpZighZGlmZmVyZW50ICYmCgkgICAoKGRpYWxvZzEtPm1lbW9wdCAhPSBkaWFsb2cyLT5tZW1vcHQpIHx8CgkgICAoZGlhbG9nMS0+bHZjLnZlcnNpb24gIT0gZGlhbG9nMi0+bHZjLnZlcnNpb24pIHx8CgkgICAoZGlhbG9nMS0+bHZjLmNoYXJhY3RzICE9IGRpYWxvZzItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIGRpYWxvZzEtPmdvdHN0eWxlICYmIGRpYWxvZzItPmdvdHN0eWxlKSB7CgkJaWYoKCFkaWFsb2cxLT5zdHlsZSB8fCAhZGlhbG9nMi0+c3R5bGUpIHx8CgkJICAgKGRpYWxvZzEtPnN0eWxlLT5hbmRfbWFzayB8fCBkaWFsb2cyLT5zdHlsZS0+YW5kX21hc2spIHx8CgkJICAgKGRpYWxvZzEtPnN0eWxlLT5vcl9tYXNrICE9IGRpYWxvZzItPnN0eWxlLT5vcl9tYXNrKSkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKGRpYWxvZzEtPmdvdHN0eWxlICYmICFkaWFsb2cyLT5nb3RzdHlsZSkgfHwKCQkgICghZGlhbG9nMS0+Z290c3R5bGUgJiYgZGlhbG9nMi0+Z290c3R5bGUpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgZGlhbG9nMS0+Z290ZXhzdHlsZSAmJiBkaWFsb2cyLT5nb3RleHN0eWxlKSB7CgkJaWYoKCFkaWFsb2cxLT5leHN0eWxlIHx8ICFkaWFsb2cyLT5leHN0eWxlKSB8fAoJCSAgIChkaWFsb2cxLT5leHN0eWxlLT5hbmRfbWFzayB8fCBkaWFsb2cyLT5leHN0eWxlLT5hbmRfbWFzaykgfHwKCQkgICAoZGlhbG9nMS0+ZXhzdHlsZS0+b3JfbWFzayAhPSBkaWFsb2cyLT5leHN0eWxlLT5vcl9tYXNrKSkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKGRpYWxvZzEtPmdvdGV4c3R5bGUgJiYgIWRpYWxvZzItPmdvdGV4c3R5bGUpIHx8CgkJICAoIWRpYWxvZzEtPmdvdGV4c3R5bGUgJiYgZGlhbG9nMi0+Z290ZXhzdHlsZSkpKQoJCQlkaWZmZXJlbnQgPSAxOwoJbmFtZWlkID0gc3RyZHVwKGdldF9uYW1laWRfc3RyKGRpYWxvZzEtPm1lbnUpKTsKCWlmKCFkaWZmZXJlbnQgJiYgc3RyY21wKG5hbWVpZCwgZ2V0X25hbWVpZF9zdHIoZGlhbG9nMi0+bWVudSkpKQoJCWRpZmZlcmVudCA9IDE7CglmcmVlKG5hbWVpZCk7CgluYW1laWQgPSBzdHJkdXAoZ2V0X25hbWVpZF9zdHIoZGlhbG9nMS0+ZGxnY2xhc3MpKTsKCWlmKCFkaWZmZXJlbnQgJiYgc3RyY21wKG5hbWVpZCwgZ2V0X25hbWVpZF9zdHIoZGlhbG9nMi0+ZGxnY2xhc3MpKSkKCQlkaWZmZXJlbnQgPSAxOwoJZnJlZShuYW1laWQpOwoJaWYoIWRpZmZlcmVudCkKCQlkaWZmZXJlbnQgPSBjb21wYXJlX2NvbnRyb2woZGlhbG9nMS0+Y29udHJvbHMsIGRpYWxvZzItPmNvbnRyb2xzKTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9kaWFsb2dleChkaWFsb2dleF90ICpkaWFsb2dleDEsIGRpYWxvZ2V4X3QgKmRpYWxvZ2V4MikgewoJaW50IGRpZmZlcmVudCA9IDA7CgljaGFyICpuYW1laWQgPSBOVUxMOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChkaWFsb2dleDEtPm1lbW9wdCAhPSBkaWFsb2dleDItPm1lbW9wdCkgfHwKCSAgIChkaWFsb2dleDEtPmx2Yy52ZXJzaW9uICE9IGRpYWxvZ2V4Mi0+bHZjLnZlcnNpb24pIHx8CgkgICAoZGlhbG9nZXgxLT5sdmMuY2hhcmFjdHMgIT0gZGlhbG9nZXgyLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiBkaWFsb2dleDEtPmdvdHN0eWxlICYmIGRpYWxvZ2V4Mi0+Z290c3R5bGUpIHsKCQlpZigoIWRpYWxvZ2V4MS0+c3R5bGUgfHwgIWRpYWxvZ2V4Mi0+c3R5bGUpIHx8CgkJICAgKGRpYWxvZ2V4MS0+c3R5bGUtPmFuZF9tYXNrIHx8IGRpYWxvZ2V4Mi0+c3R5bGUtPmFuZF9tYXNrKSB8fAoJCSAgIChkaWFsb2dleDEtPnN0eWxlLT5vcl9tYXNrICE9IGRpYWxvZ2V4Mi0+c3R5bGUtPm9yX21hc2spKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgoZGlhbG9nZXgxLT5nb3RzdHlsZSAmJiAhZGlhbG9nZXgyLT5nb3RzdHlsZSkgfHwKCQkgICghZGlhbG9nZXgxLT5nb3RzdHlsZSAmJiBkaWFsb2dleDItPmdvdHN0eWxlKSkpCgkJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIGRpYWxvZ2V4MS0+Z290ZXhzdHlsZSAmJiBkaWFsb2dleDItPmdvdGV4c3R5bGUpIHsKCQlpZigoIWRpYWxvZ2V4MS0+ZXhzdHlsZSB8fCAhZGlhbG9nZXgyLT5leHN0eWxlKSB8fAoJCSAgIChkaWFsb2dleDEtPmV4c3R5bGUtPmFuZF9tYXNrIHx8IGRpYWxvZ2V4Mi0+ZXhzdHlsZS0+YW5kX21hc2spIHx8CgkJICAgKGRpYWxvZ2V4MS0+ZXhzdHlsZS0+b3JfbWFzayAhPSBkaWFsb2dleDItPmV4c3R5bGUtPm9yX21hc2spKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgoZGlhbG9nZXgxLT5nb3RleHN0eWxlICYmICFkaWFsb2dleDItPmdvdGV4c3R5bGUpIHx8CgkJICAoIWRpYWxvZ2V4MS0+Z290ZXhzdHlsZSAmJiBkaWFsb2dleDItPmdvdGV4c3R5bGUpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgZGlhbG9nZXgxLT5nb3RoZWxwaWQgJiYgZGlhbG9nZXgyLT5nb3RoZWxwaWQpIHsKCQlpZihkaWFsb2dleDEtPmhlbHBpZCAhPSBkaWFsb2dleDItPmhlbHBpZCkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKGRpYWxvZ2V4MS0+Z290aGVscGlkICYmICFkaWFsb2dleDItPmdvdGhlbHBpZCkgfHwKCQkgICghZGlhbG9nZXgxLT5nb3RoZWxwaWQgJiYgZGlhbG9nZXgyLT5nb3RoZWxwaWQpKSkKCQkJZGlmZmVyZW50ID0gMTsKCW5hbWVpZCA9IHN0cmR1cChnZXRfbmFtZWlkX3N0cihkaWFsb2dleDEtPm1lbnUpKTsKCWlmKCFkaWZmZXJlbnQgJiYgc3RyY21wKG5hbWVpZCwgZ2V0X25hbWVpZF9zdHIoZGlhbG9nZXgyLT5tZW51KSkpCgkJZGlmZmVyZW50ID0gMTsKCWZyZWUobmFtZWlkKTsKCW5hbWVpZCA9IHN0cmR1cChnZXRfbmFtZWlkX3N0cihkaWFsb2dleDEtPmRsZ2NsYXNzKSk7CglpZighZGlmZmVyZW50ICYmIHN0cmNtcChuYW1laWQsIGdldF9uYW1laWRfc3RyKGRpYWxvZ2V4Mi0+ZGxnY2xhc3MpKSkKCQlkaWZmZXJlbnQgPSAxOwoJZnJlZShuYW1laWQpOwoJaWYoIWRpZmZlcmVudCkKCQlkaWZmZXJlbnQgPSBjb21wYXJlX2NvbnRyb2woZGlhbG9nZXgxLT5jb250cm9scywgZGlhbG9nZXgyLT5jb250cm9scyk7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfZm9udChmb250X3QgKmZvbnQxLCBmb250X3QgKmZvbnQyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoZm9udDEtPm1lbW9wdCAhPSBmb250Mi0+bWVtb3B0KSB8fAoJICAgKGZvbnQxLT5kYXRhLT5sdmMudmVyc2lvbiAhPSBmb250Mi0+ZGF0YS0+bHZjLnZlcnNpb24pIHx8CgkgICAoZm9udDEtPmRhdGEtPmx2Yy5jaGFyYWN0cyAhPSBmb250Mi0+ZGF0YS0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9mb250ZGlyKGZvbnRkaXJfdCAqZm9udGRpcjEsIGZvbnRkaXJfdCAqZm9udGRpcjIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChmb250ZGlyMS0+bWVtb3B0ICE9IGZvbnRkaXIyLT5tZW1vcHQpIHx8CgkgICAoZm9udGRpcjEtPmRhdGEtPmx2Yy52ZXJzaW9uICE9IGZvbnRkaXIyLT5kYXRhLT5sdmMudmVyc2lvbikgfHwKCSAgIChmb250ZGlyMS0+ZGF0YS0+bHZjLmNoYXJhY3RzICE9IGZvbnRkaXIyLT5kYXRhLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX2ljb24oaWNvbl90ICppY29uMSwgaWNvbl90ICppY29uMikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKGljb24xLT5pZCAhPSBpY29uMi0+aWQpIHx8CgkgICAoaWNvbjEtPndpZHRoICE9IGljb24yLT53aWR0aCkgfHwKCSAgIChpY29uMS0+aGVpZ2h0ICE9IGljb24yLT5oZWlnaHQpKSkKCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChpY29uMS0+bHZjLnZlcnNpb24gIT0gaWNvbjItPmx2Yy52ZXJzaW9uKSB8fAoJICAgKGljb24xLT5sdmMuY2hhcmFjdHMgIT0gaWNvbjItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfaWNvbl9ncm91cChpY29uX2dyb3VwX3QgKmljb25fZ3JvdXAxLCBpY29uX2dyb3VwX3QgKmljb25fZ3JvdXAyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWljb25fdCAqaWNvbjEgPSBOVUxMLCAqaWNvbjIgPSBOVUxMOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChpY29uX2dyb3VwMS0+bWVtb3B0ICE9IGljb25fZ3JvdXAyLT5tZW1vcHQpIHx8CgkgICAoaWNvbl9ncm91cDEtPmx2Yy52ZXJzaW9uICE9IGljb25fZ3JvdXAyLT5sdmMudmVyc2lvbikgfHwKCSAgIChpY29uX2dyb3VwMS0+bHZjLmNoYXJhY3RzICE9IGljb25fZ3JvdXAyLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKGljb25fZ3JvdXAxLT5uaWNvbiAhPSBpY29uX2dyb3VwMi0+bmljb24pKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50KSB7CgkJaWNvbjEgPSBpY29uX2dyb3VwMS0+aWNvbmxpc3Q7CgkJaWNvbjIgPSBpY29uX2dyb3VwMi0+aWNvbmxpc3Q7CgkJd2hpbGUoIWRpZmZlcmVudCAmJiBpY29uMSAmJiBpY29uMikgewoJCQlkaWZmZXJlbnQgPSBjb21wYXJlX2ljb24oaWNvbjEsIGljb24yKTsKCQkJaWNvbjEgPSBpY29uMS0+bmV4dDsKCQkJaWNvbjIgPSBpY29uMi0+bmV4dDsKCQl9CgkJaWYoIWRpZmZlcmVudCAmJgoJCSAgICgoaWNvbjEgJiYgIWljb24yKSB8fAoJCSAgICghaWNvbjEgJiYgaWNvbjIpKSkKCQkJZGlmZmVyZW50ID0gMTsKCX0KCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9tZW51X2l0ZW0obWVudV9pdGVtX3QgKm1lbnVfaXRlbTEsIG1lbnVfaXRlbV90ICptZW51X2l0ZW0yKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCXdoaWxlKCFkaWZmZXJlbnQgJiYgbWVudV9pdGVtMSAmJiBtZW51X2l0ZW0yKSB7CgkJaWYobWVudV9pdGVtMS0+cG9wdXAgJiYgbWVudV9pdGVtMi0+cG9wdXApCgkJCWRpZmZlcmVudCA9IGNvbXBhcmVfbWVudV9pdGVtKG1lbnVfaXRlbTEtPnBvcHVwLCBtZW51X2l0ZW0yLT5wb3B1cCk7CgkJZWxzZSBpZighbWVudV9pdGVtMS0+cG9wdXAgJiYgIW1lbnVfaXRlbTItPnBvcHVwKSB7CgkJCWlmKG1lbnVfaXRlbTEtPm5hbWUgJiYgbWVudV9pdGVtMi0+bmFtZSkgewoJCQkJaWYoKG1lbnVfaXRlbTEtPmlkICE9IG1lbnVfaXRlbTItPmlkKSB8fAoJCQkJICAgKG1lbnVfaXRlbTEtPnN0YXRlICE9IG1lbnVfaXRlbTItPnN0YXRlKSkKCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQl9IGVsc2UgaWYoKG1lbnVfaXRlbTEtPm5hbWUgJiYgIW1lbnVfaXRlbTItPm5hbWUpIHx8CgkJCQkgICghbWVudV9pdGVtMS0+bmFtZSAmJiBtZW51X2l0ZW0yLT5uYW1lKSkKCQkJCQlkaWZmZXJlbnQgPSAxOwoJCX0gZWxzZQoJCQlkaWZmZXJlbnQgPSAxOwoJCW1lbnVfaXRlbTEgPSBtZW51X2l0ZW0xLT5uZXh0OwoJCW1lbnVfaXRlbTIgPSBtZW51X2l0ZW0yLT5uZXh0OwoJfQoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChtZW51X2l0ZW0xICYmICFtZW51X2l0ZW0yKSB8fAoJICAgKCFtZW51X2l0ZW0xICYmIG1lbnVfaXRlbTIpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX21lbnUobWVudV90ICptZW51MSwgbWVudV90ICptZW51MikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKG1lbnUxLT5tZW1vcHQgIT0gbWVudTItPm1lbW9wdCkgfHwKCSAgIChtZW51MS0+bHZjLnZlcnNpb24gIT0gbWVudTItPmx2Yy52ZXJzaW9uKSB8fAoJICAgKG1lbnUxLT5sdmMuY2hhcmFjdHMgIT0gbWVudTItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50KQoJCWRpZmZlcmVudCA9IGNvbXBhcmVfbWVudV9pdGVtKG1lbnUxLT5pdGVtcywgbWVudTItPml0ZW1zKTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9tZW51ZXhfaXRlbShtZW51ZXhfaXRlbV90ICptZW51ZXhfaXRlbTEsIG1lbnVleF9pdGVtX3QgKm1lbnVleF9pdGVtMikgewoJaW50IGRpZmZlcmVudCA9IDA7Cgl3aGlsZSghZGlmZmVyZW50ICYmIG1lbnVleF9pdGVtMSAmJiBtZW51ZXhfaXRlbTIpIHsKCQlpZihtZW51ZXhfaXRlbTEtPnBvcHVwICYmIG1lbnVleF9pdGVtMi0+cG9wdXApIHsKCQkJaWYoIWRpZmZlcmVudCAmJiBtZW51ZXhfaXRlbTEtPmdvdGlkICYmIG1lbnVleF9pdGVtMi0+Z290aWQpIHsKCQkJCWlmKG1lbnVleF9pdGVtMS0+aWQgIT0gbWVudWV4X2l0ZW0yLT5pZCkKCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCQkJICAoKG1lbnVleF9pdGVtMS0+Z290aWQgJiYgIW1lbnVleF9pdGVtMi0+Z290aWQpIHx8CgkJCQkgICghbWVudWV4X2l0ZW0yLT5nb3RpZCAmJiBtZW51ZXhfaXRlbTItPmdvdGlkKSkpCgkJCQkJZGlmZmVyZW50ID0gMTsKCQkJaWYoIWRpZmZlcmVudCAmJiBtZW51ZXhfaXRlbTEtPmdvdHR5cGUgJiYgbWVudWV4X2l0ZW0yLT5nb3R0eXBlKSB7CgkJCQlpZihtZW51ZXhfaXRlbTEtPnR5cGUgIT0gbWVudWV4X2l0ZW0yLT50eXBlKQoJCQkJCWRpZmZlcmVudCA9IDE7CgkJCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJCQkgICgobWVudWV4X2l0ZW0xLT5nb3R0eXBlICYmICFtZW51ZXhfaXRlbTItPmdvdHR5cGUpIHx8CgkJCQkgICghbWVudWV4X2l0ZW0yLT5nb3R0eXBlICYmIG1lbnVleF9pdGVtMi0+Z290dHlwZSkpKQoJCQkJCWRpZmZlcmVudCA9IDE7CgkJCWlmKCFkaWZmZXJlbnQgJiYgbWVudWV4X2l0ZW0xLT5nb3RzdGF0ZSAmJiBtZW51ZXhfaXRlbTItPmdvdHN0YXRlKSB7CgkJCQlpZihtZW51ZXhfaXRlbTEtPnN0YXRlICE9IG1lbnVleF9pdGVtMi0+c3RhdGUpCgkJCQkJZGlmZmVyZW50ID0gMTsKCQkJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCSAgKChtZW51ZXhfaXRlbTEtPmdvdHN0YXRlICYmICFtZW51ZXhfaXRlbTItPmdvdHN0YXRlKSB8fAoJCQkJICAoIW1lbnVleF9pdGVtMi0+Z290c3RhdGUgJiYgbWVudWV4X2l0ZW0yLT5nb3RzdGF0ZSkpKQoJCQkJCWRpZmZlcmVudCA9IDE7CgkJCWlmKCFkaWZmZXJlbnQgJiYgbWVudWV4X2l0ZW0xLT5nb3RoZWxwaWQgJiYgbWVudWV4X2l0ZW0yLT5nb3RoZWxwaWQpIHsKCQkJCWlmKG1lbnVleF9pdGVtMS0+aGVscGlkICE9IG1lbnVleF9pdGVtMi0+aGVscGlkKQoJCQkJCWRpZmZlcmVudCA9IDE7CgkJCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJCQkgICgobWVudWV4X2l0ZW0xLT5nb3RoZWxwaWQgJiYgIW1lbnVleF9pdGVtMi0+Z290aGVscGlkKSB8fAoJCQkJICAoIW1lbnVleF9pdGVtMi0+Z290aGVscGlkICYmIG1lbnVleF9pdGVtMi0+Z290aGVscGlkKSkpCgkJCQkJZGlmZmVyZW50ID0gMTsKCQkJaWYoIWRpZmZlcmVudCkKCQkJCWRpZmZlcmVudCA9IGNvbXBhcmVfbWVudWV4X2l0ZW0obWVudWV4X2l0ZW0xLT5wb3B1cCwgbWVudWV4X2l0ZW0yLT5wb3B1cCk7CgkJfSBlbHNlIGlmKCFtZW51ZXhfaXRlbTEtPnBvcHVwICYmICFtZW51ZXhfaXRlbTItPnBvcHVwKSB7CgkJCWlmKG1lbnVleF9pdGVtMS0+bmFtZSAmJiBtZW51ZXhfaXRlbTItPm5hbWUpIHsKCQkJCWlmKCFkaWZmZXJlbnQgJiYgbWVudWV4X2l0ZW0xLT5nb3RpZCAmJiBtZW51ZXhfaXRlbTItPmdvdGlkKSB7CgkJCQkJaWYobWVudWV4X2l0ZW0xLT5pZCAhPSBtZW51ZXhfaXRlbTItPmlkKQoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCQkgICgobWVudWV4X2l0ZW0xLT5nb3RpZCAmJiAhbWVudWV4X2l0ZW0yLT5nb3RpZCkgfHwKCQkJCQkgICghbWVudWV4X2l0ZW0yLT5nb3RpZCAmJiBtZW51ZXhfaXRlbTItPmdvdGlkKSkpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQlpZighZGlmZmVyZW50ICYmIG1lbnVleF9pdGVtMS0+Z290dHlwZSAmJiBtZW51ZXhfaXRlbTItPmdvdHR5cGUpIHsKCQkJCQlpZihtZW51ZXhfaXRlbTEtPnR5cGUgIT0gbWVudWV4X2l0ZW0yLT50eXBlKQoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCQkgICgobWVudWV4X2l0ZW0xLT5nb3R0eXBlICYmICFtZW51ZXhfaXRlbTItPmdvdHR5cGUpIHx8CgkJCQkJICAoIW1lbnVleF9pdGVtMi0+Z290dHlwZSAmJiBtZW51ZXhfaXRlbTItPmdvdHR5cGUpKSkKCQkJCQkJZGlmZmVyZW50ID0gMTsKCQkJCWlmKCFkaWZmZXJlbnQgJiYgbWVudWV4X2l0ZW0xLT5nb3RzdGF0ZSAmJiBtZW51ZXhfaXRlbTItPmdvdHN0YXRlKSB7CgkJCQkJaWYobWVudWV4X2l0ZW0xLT5zdGF0ZSAhPSBtZW51ZXhfaXRlbTItPnN0YXRlKQoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCQkgICgobWVudWV4X2l0ZW0xLT5nb3RzdGF0ZSAmJiAhbWVudWV4X2l0ZW0yLT5nb3RzdGF0ZSkgfHwKCQkJCQkgICghbWVudWV4X2l0ZW0yLT5nb3RzdGF0ZSAmJiBtZW51ZXhfaXRlbTItPmdvdHN0YXRlKSkpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQlpZighZGlmZmVyZW50ICYmIG1lbnVleF9pdGVtMS0+Z290aGVscGlkICYmIG1lbnVleF9pdGVtMi0+Z290aGVscGlkKSB7CgkJCQkJaWYobWVudWV4X2l0ZW0xLT5oZWxwaWQgIT0gbWVudWV4X2l0ZW0yLT5oZWxwaWQpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCQkJCSAgKChtZW51ZXhfaXRlbTEtPmdvdGhlbHBpZCAmJiAhbWVudWV4X2l0ZW0yLT5nb3RoZWxwaWQpIHx8CgkJCQkJICAoIW1lbnVleF9pdGVtMi0+Z290aGVscGlkICYmIG1lbnVleF9pdGVtMi0+Z290aGVscGlkKSkpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCX0gZWxzZSBpZigobWVudWV4X2l0ZW0xLT5uYW1lICYmICFtZW51ZXhfaXRlbTItPm5hbWUpIHx8CgkJCQkgICghbWVudWV4X2l0ZW0xLT5uYW1lICYmIG1lbnVleF9pdGVtMi0+bmFtZSkpCgkJCQkJZGlmZmVyZW50ID0gMTsKCQl9IGVsc2UKCQkJZGlmZmVyZW50ID0gMTsKCQltZW51ZXhfaXRlbTEgPSBtZW51ZXhfaXRlbTEtPm5leHQ7CgkJbWVudWV4X2l0ZW0yID0gbWVudWV4X2l0ZW0yLT5uZXh0OwoJfQoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChtZW51ZXhfaXRlbTEgJiYgIW1lbnVleF9pdGVtMikgfHwKCSAgICghbWVudWV4X2l0ZW0xICYmIG1lbnVleF9pdGVtMikpKQoJCWRpZmZlcmVudCA9IDE7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfbWVudWV4KG1lbnVleF90ICptZW51ZXgxLCBtZW51ZXhfdCAqbWVudWV4MikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKG1lbnVleDEtPm1lbW9wdCAhPSBtZW51ZXgyLT5tZW1vcHQpIHx8CgkgICAobWVudWV4MS0+bHZjLnZlcnNpb24gIT0gbWVudWV4Mi0+bHZjLnZlcnNpb24pIHx8CgkgICAobWVudWV4MS0+bHZjLmNoYXJhY3RzICE9IG1lbnVleDItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50KQoJCWRpZmZlcmVudCA9IGNvbXBhcmVfbWVudWV4X2l0ZW0obWVudWV4MS0+aXRlbXMsIG1lbnVleDItPml0ZW1zKTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9yY2RhdGEocmNkYXRhX3QgKnJjZGF0YTEsIHJjZGF0YV90ICpyY2RhdGEyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgocmNkYXRhMS0+bWVtb3B0ICE9IHJjZGF0YTItPm1lbW9wdCkgfHwKCSAgIChyY2RhdGExLT5kYXRhLT5sdmMudmVyc2lvbiAhPSByY2RhdGEyLT5kYXRhLT5sdmMudmVyc2lvbikgfHwKCSAgIChyY2RhdGExLT5kYXRhLT5sdmMuY2hhcmFjdHMgIT0gcmNkYXRhMi0+ZGF0YS0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9zdHJpbmd0YWJsZShzdHJpbmd0YWJsZV90ICpzdHJpbmd0YWJsZTEsIHN0cmluZ3RhYmxlX3QgKnN0cmluZ3RhYmxlMikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpbnQgaTsKCXdoaWxlKCFkaWZmZXJlbnQgJiYgc3RyaW5ndGFibGUxICYmIHN0cmluZ3RhYmxlMikgewoJCWlmKChzdHJpbmd0YWJsZTEtPm1lbW9wdCAhPSBzdHJpbmd0YWJsZTItPm1lbW9wdCkgfHwKCQkgICAoc3RyaW5ndGFibGUxLT5sdmMudmVyc2lvbiAhPSBzdHJpbmd0YWJsZTItPmx2Yy52ZXJzaW9uKSB8fAoJCSAgIChzdHJpbmd0YWJsZTEtPmx2Yy5jaGFyYWN0cyAhPSBzdHJpbmd0YWJsZTItPmx2Yy5jaGFyYWN0cykpCgkJCWRpZmZlcmVudCA9IDE7CgkJaWYoIWRpZmZlcmVudCkgewoJCQlpZigoc3RyaW5ndGFibGUxLT5uZW50cmllcyAhPSBzdHJpbmd0YWJsZTItPm5lbnRyaWVzKSB8fAoJCQkgICAoc3RyaW5ndGFibGUxLT5pZGJhc2UgIT0gc3RyaW5ndGFibGUyLT5pZGJhc2UpKQoJCQkJZGlmZmVyZW50ID0gMTsKCQkJZWxzZQoJCQkJZm9yKGkgPSAwIDsgaSA8IHN0cmluZ3RhYmxlMS0+bmVudHJpZXM7IGkrKykKCQkJCQlpZigoc3RyaW5ndGFibGUxLT5lbnRyaWVzW2ldLmlkICE9IHN0cmluZ3RhYmxlMi0+ZW50cmllc1tpXS5pZCkgfHwKCQkJCQkgICAoc3RyaW5ndGFibGUxLT5lbnRyaWVzW2ldLm1lbW9wdCAhPSBzdHJpbmd0YWJsZTItPmVudHJpZXNbaV0ubWVtb3B0KSB8fAoJCQkJCSAgIChzdHJpbmd0YWJsZTEtPmVudHJpZXNbaV0uc3RyICYmICFzdHJpbmd0YWJsZTItPmVudHJpZXNbaV0uc3RyKSB8fAoJCQkJCSAgICghc3RyaW5ndGFibGUxLT5lbnRyaWVzW2ldLnN0ciAmJiBzdHJpbmd0YWJsZTItPmVudHJpZXNbaV0uc3RyKSkgewoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJfQoJCXN0cmluZ3RhYmxlMSA9IHN0cmluZ3RhYmxlMS0+bmV4dDsKCQlzdHJpbmd0YWJsZTIgPSBzdHJpbmd0YWJsZTItPm5leHQ7Cgl9CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfdXNlcih1c2VyX3QgKnVzZXIxLCB1c2VyX3QgKnVzZXIyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWNoYXIgKm5hbWVpZCA9IE5VTEw7CglpZighZGlmZmVyZW50ICYmCgkgICAoKHVzZXIxLT5tZW1vcHQgIT0gdXNlcjItPm1lbW9wdCkgfHwKCSAgICh1c2VyMS0+ZGF0YS0+bHZjLnZlcnNpb24gIT0gdXNlcjItPmRhdGEtPmx2Yy52ZXJzaW9uKSB8fAoJICAgKHVzZXIxLT5kYXRhLT5sdmMuY2hhcmFjdHMgIT0gdXNlcjItPmRhdGEtPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CgluYW1laWQgPSBzdHJkdXAoZ2V0X25hbWVpZF9zdHIodXNlcjEtPnR5cGUpKTsKCWlmKCFkaWZmZXJlbnQgJiYgc3RyY21wKG5hbWVpZCwgZ2V0X25hbWVpZF9zdHIodXNlcjItPnR5cGUpKSkKCQlkaWZmZXJlbnQgPSAxOwoJZnJlZShuYW1laWQpOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX21lc3NhZ2V0YWJsZShtZXNzYWdldGFibGVfdCAqbWVzc2FnZXRhYmxlMSwgbWVzc2FnZXRhYmxlX3QgKm1lc3NhZ2V0YWJsZTIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChtZXNzYWdldGFibGUxLT5tZW1vcHQgIT0gbWVzc2FnZXRhYmxlMi0+bWVtb3B0KSB8fAoJICAgKG1lc3NhZ2V0YWJsZTEtPmRhdGEtPmx2Yy52ZXJzaW9uICE9IG1lc3NhZ2V0YWJsZTItPmRhdGEtPmx2Yy52ZXJzaW9uKSB8fAoJICAgKG1lc3NhZ2V0YWJsZTEtPmRhdGEtPmx2Yy5jaGFyYWN0cyAhPSBtZXNzYWdldGFibGUyLT5kYXRhLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX3N0cmluZyhzdHJpbmdfdCAqc3RyaW5nMSwgc3RyaW5nX3QgKnN0cmluZzIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChzdHJpbmcxLT5zaXplICE9IHN0cmluZzItPnNpemUpIHx8CgkgICAoc3RyaW5nMS0+dHlwZSAhPSBzdHJpbmcyLT50eXBlKSkpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQpIHsKCQlpZihzdHJpbmcxLT50eXBlID09IHN0cl9jaGFyKQoJCQlkaWZmZXJlbnQgPSBtZW1jbXAoc3RyaW5nMS0+c3RyLmNzdHIsIHN0cmluZzItPnN0ci5jc3RyLCBzdHJpbmcxLT5zaXplKTsKCQllbHNlIGlmKHN0cmluZzEtPnR5cGUgPT0gc3RyX3VuaWNvZGUpCgkJCWRpZmZlcmVudCA9IG1lbWNtcChzdHJpbmcxLT5zdHIud3N0ciwgc3RyaW5nMi0+c3RyLndzdHIsIHN0cmluZzEtPnNpemUqc2l6ZW9mKFdDSEFSKSk7CgkJZWxzZQoJCQlkaWZmZXJlbnQgPSAxOwoJfQoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX3Zlcl9ibG9jayh2ZXJfYmxvY2tfdCAqdmVyX2Jsb2NrMSwgdmVyX2Jsb2NrX3QgKnZlcl9ibG9jazIpOwoKc3RhdGljIGludCBjb21wYXJlX3Zlcl92YWx1ZSh2ZXJfdmFsdWVfdCAqdmVyX3ZhbHVlMSwgdmVyX3ZhbHVlX3QgKnZlcl92YWx1ZTIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaW50IGkgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKHZlcl92YWx1ZTEtPnR5cGUgPT0gdmVyX3ZhbHVlMi0+dHlwZSkpIHsKCQlzd2l0Y2godmVyX3ZhbHVlMS0+dHlwZSkgewoJCQljYXNlIHZhbF9zdHI6CgkJCQlpZighZGlmZmVyZW50ICYmIHZlcl92YWx1ZTEtPmtleSAmJiB2ZXJfdmFsdWUyLT5rZXkpCgkJCQkJZGlmZmVyZW50ID0gY29tcGFyZV9zdHJpbmcodmVyX3ZhbHVlMS0+a2V5LCB2ZXJfdmFsdWUyLT5rZXkpOwoJCQkJZWxzZSBpZighZGlmZmVyZW50ICYmCgkJCQkJKCh2ZXJfdmFsdWUxLT5rZXkgJiYgIXZlcl92YWx1ZTItPmtleSkgfHwKCQkJCQkoIXZlcl92YWx1ZTEtPmtleSAmJiB2ZXJfdmFsdWUyLT5rZXkpKSkKCQkJCQkJZGlmZmVyZW50ID0gMTsKCQkJCWJyZWFrOwoJCQljYXNlIHZhbF93b3JkczoKCQkJCWlmKCFkaWZmZXJlbnQgJiYgdmVyX3ZhbHVlMS0+a2V5ICYmIHZlcl92YWx1ZTItPmtleSkKCQkJCQlkaWZmZXJlbnQgPSBjb21wYXJlX3N0cmluZyh2ZXJfdmFsdWUxLT5rZXksIHZlcl92YWx1ZTItPmtleSk7CgkJCQllbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCQkoKHZlcl92YWx1ZTEtPmtleSAmJiAhdmVyX3ZhbHVlMi0+a2V5KSB8fAoJCQkJCSghdmVyX3ZhbHVlMS0+a2V5ICYmIHZlcl92YWx1ZTItPmtleSkpKQoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJaWYoIWRpZmZlcmVudCAmJiB2ZXJfdmFsdWUxLT52YWx1ZS53b3JkcyAmJiB2ZXJfdmFsdWUyLT52YWx1ZS53b3JkcykgewoJCQkJCWlmKCFkaWZmZXJlbnQgJiYKCQkJCQkgICAodmVyX3ZhbHVlMS0+dmFsdWUud29yZHMtPm53b3JkcyAhPSB2ZXJfdmFsdWUyLT52YWx1ZS53b3Jkcy0+bndvcmRzKSkKCQkJCQkJZGlmZmVyZW50ID0gMTsKCQkJCQlpZighZGlmZmVyZW50KQoJCQkJCQlmb3IoaSA9IDA7IGkgPCB2ZXJfdmFsdWUxLT52YWx1ZS53b3Jkcy0+bndvcmRzOyBpKyspIHsKCQkJCQkJCWlmKHZlcl92YWx1ZTEtPnZhbHVlLndvcmRzLT53b3Jkc1tpXSAhPSB2ZXJfdmFsdWUyLT52YWx1ZS53b3Jkcy0+d29yZHNbaV0pIHsKCQkJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCQkJCSAgKCh2ZXJfdmFsdWUxLT52YWx1ZS53b3JkcyAmJiAhdmVyX3ZhbHVlMi0+dmFsdWUud29yZHMpIHx8CgkJCQkJICAoIXZlcl92YWx1ZTEtPnZhbHVlLndvcmRzICYmIHZlcl92YWx1ZTItPnZhbHVlLndvcmRzKSkpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQlicmVhazsKCQkJY2FzZSB2YWxfYmxvY2s6CgkJCQlpZighZGlmZmVyZW50ICYmIHZlcl92YWx1ZTEtPnZhbHVlLmJsb2NrICYmIHZlcl92YWx1ZTItPnZhbHVlLmJsb2NrKQoJCQkJCWRpZmZlcmVudCA9IGNvbXBhcmVfdmVyX2Jsb2NrKHZlcl92YWx1ZTEtPnZhbHVlLmJsb2NrLCB2ZXJfdmFsdWUyLT52YWx1ZS5ibG9jayk7CgkJCQllbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCQkoKHZlcl92YWx1ZTEtPnZhbHVlLmJsb2NrICYmICF2ZXJfdmFsdWUyLT52YWx1ZS5ibG9jaykgfHwKCQkJCQkoIXZlcl92YWx1ZTEtPnZhbHVlLmJsb2NrICYmIHZlcl92YWx1ZTItPnZhbHVlLmJsb2NrKSkpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWRpZmZlcmVudCA9IDE7CgkJfQoJfSBlbHNlCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV92ZXJfYmxvY2sodmVyX2Jsb2NrX3QgKnZlcl9ibG9jazEsIHZlcl9ibG9ja190ICp2ZXJfYmxvY2syKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCXZlcl92YWx1ZV90ICp2ZXJfdmFsdWUxID0gTlVMTCwgKnZlcl92YWx1ZTIgPSBOVUxMOwoJaWYoIWRpZmZlcmVudCkgewoJCXZlcl92YWx1ZTEgPSB2ZXJfYmxvY2sxLT52YWx1ZXM7CgkJdmVyX3ZhbHVlMiA9IHZlcl9ibG9jazItPnZhbHVlczsKCQl3aGlsZSghZGlmZmVyZW50ICYmIHZlcl92YWx1ZTEgJiYgdmVyX3ZhbHVlMikgewoJCQlkaWZmZXJlbnQgPSBjb21wYXJlX3Zlcl92YWx1ZSh2ZXJfdmFsdWUxLCB2ZXJfdmFsdWUyKTsKCQkJdmVyX3ZhbHVlMSA9IHZlcl92YWx1ZTEtPm5leHQ7CgkJCXZlcl92YWx1ZTIgPSB2ZXJfdmFsdWUyLT5uZXh0OwoJCX0KCQlpZighZGlmZmVyZW50ICYmCgkJICAgKCh2ZXJfdmFsdWUxICYmICF2ZXJfdmFsdWUyKSB8fAoJCSAgICghdmVyX3ZhbHVlMSAmJiB2ZXJfdmFsdWUyKSkpCgkJCWRpZmZlcmVudCA9IDE7Cgl9CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfdmVyc2lvbmluZm8odmVyc2lvbmluZm9fdCAqdmVyc2lvbmluZm8xLCB2ZXJzaW9uaW5mb190ICp2ZXJzaW9uaW5mbzIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJdmVyX2Jsb2NrX3QgKnZlcl9ibG9jazEgPSBOVUxMLCAqdmVyX2Jsb2NrMiA9IE5VTEw7CglpZighZGlmZmVyZW50ICYmCgkgICAoKHZlcnNpb25pbmZvMS0+bWVtb3B0ICE9IHZlcnNpb25pbmZvMi0+bWVtb3B0KSB8fAoJICAgKHZlcnNpb25pbmZvMS0+bHZjLnZlcnNpb24gIT0gdmVyc2lvbmluZm8yLT5sdmMudmVyc2lvbikgfHwKCSAgICh2ZXJzaW9uaW5mbzEtPmx2Yy5jaGFyYWN0cyAhPSB2ZXJzaW9uaW5mbzItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIHZlcnNpb25pbmZvMS0+Z290aXQuZnYgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mdikgewoJCWlmKCh2ZXJzaW9uaW5mbzEtPmZpbGV2ZXJfbWFqMSAhPSB2ZXJzaW9uaW5mbzItPmZpbGV2ZXJfbWFqMSkgfHwKCQkgICAodmVyc2lvbmluZm8xLT5maWxldmVyX21hajIgIT0gdmVyc2lvbmluZm8yLT5maWxldmVyX21hajIpIHx8CgkJICAgKHZlcnNpb25pbmZvMS0+ZmlsZXZlcl9taW4xICE9IHZlcnNpb25pbmZvMi0+ZmlsZXZlcl9taW4xKSB8fAoJCSAgICh2ZXJzaW9uaW5mbzEtPmZpbGV2ZXJfbWluMiAhPSB2ZXJzaW9uaW5mbzItPmZpbGV2ZXJfbWluMikpCgkJCWRpZmZlcmVudCA9IDE7Cgl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCSAgKCh2ZXJzaW9uaW5mbzEtPmdvdGl0LmZ2ICYmICF2ZXJzaW9uaW5mbzItPmdvdGl0LmZ2KSB8fAoJCSAgKCF2ZXJzaW9uaW5mbzEtPmdvdGl0LmZ2ICYmIHZlcnNpb25pbmZvMi0+Z290aXQuZnYpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgdmVyc2lvbmluZm8xLT5nb3RpdC5wdiAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LnB2KSB7CgkJaWYoKHZlcnNpb25pbmZvMS0+cHJvZHZlcl9tYWoxICE9IHZlcnNpb25pbmZvMi0+cHJvZHZlcl9tYWoxKSB8fAoJCSAgICh2ZXJzaW9uaW5mbzEtPnByb2R2ZXJfbWFqMiAhPSB2ZXJzaW9uaW5mbzItPnByb2R2ZXJfbWFqMikgfHwKCQkgICAodmVyc2lvbmluZm8xLT5wcm9kdmVyX21pbjEgIT0gdmVyc2lvbmluZm8yLT5wcm9kdmVyX21pbjEpIHx8CgkJICAgKHZlcnNpb25pbmZvMS0+cHJvZHZlcl9taW4yICE9IHZlcnNpb25pbmZvMi0+cHJvZHZlcl9taW4yKSkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKHZlcnNpb25pbmZvMS0+Z290aXQucHYgJiYgIXZlcnNpb25pbmZvMi0+Z290aXQucHYpIHx8CgkJICAoIXZlcnNpb25pbmZvMS0+Z290aXQucHYgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5wdikpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiB2ZXJzaW9uaW5mbzEtPmdvdGl0LmZvICYmIHZlcnNpb25pbmZvMi0+Z290aXQuZm8pIHsKCQlpZih2ZXJzaW9uaW5mbzEtPmZpbGVvcyAhPSB2ZXJzaW9uaW5mbzItPmZpbGVvcykKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKHZlcnNpb25pbmZvMS0+Z290aXQuZm8gJiYgIXZlcnNpb25pbmZvMi0+Z290aXQuZm8pIHx8CgkJICAoIXZlcnNpb25pbmZvMS0+Z290aXQuZm8gJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mbykpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiB2ZXJzaW9uaW5mbzEtPmdvdGl0LmZmICYmIHZlcnNpb25pbmZvMi0+Z290aXQuZmYpIHsKCQlpZih2ZXJzaW9uaW5mbzEtPmZpbGVmbGFncyAhPSB2ZXJzaW9uaW5mbzItPmZpbGVmbGFncykKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKHZlcnNpb25pbmZvMS0+Z290aXQuZmYgJiYgIXZlcnNpb25pbmZvMi0+Z290aXQuZmYpIHx8CgkJICAoIXZlcnNpb25pbmZvMS0+Z290aXQuZmYgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mZikpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiB2ZXJzaW9uaW5mbzEtPmdvdGl0LmZmbSAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LmZmbSkgewoJCWlmKHZlcnNpb25pbmZvMS0+ZmlsZWZsYWdzbWFzayAhPSB2ZXJzaW9uaW5mbzItPmZpbGVmbGFnc21hc2spCgkJCWRpZmZlcmVudCA9IDE7Cgl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCSAgKCh2ZXJzaW9uaW5mbzEtPmdvdGl0LmZmbSAmJiAhdmVyc2lvbmluZm8yLT5nb3RpdC5mZm0pIHx8CgkJICAoIXZlcnNpb25pbmZvMS0+Z290aXQuZmZtICYmIHZlcnNpb25pbmZvMi0+Z290aXQuZmZtKSkpCgkJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIHZlcnNpb25pbmZvMS0+Z290aXQuZnQgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mdCkgewoJCWlmKHZlcnNpb25pbmZvMS0+ZmlsZXR5cGUgIT0gdmVyc2lvbmluZm8yLT5maWxldHlwZSkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKHZlcnNpb25pbmZvMS0+Z290aXQuZnQgJiYgIXZlcnNpb25pbmZvMi0+Z290aXQuZnQpIHx8CgkJICAoIXZlcnNpb25pbmZvMS0+Z290aXQuZnQgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mdCkpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiB2ZXJzaW9uaW5mbzEtPmdvdGl0LmZzdCAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LmZzdCkgewoJCWlmKHZlcnNpb25pbmZvMS0+ZmlsZXN1YnR5cGUgIT0gdmVyc2lvbmluZm8yLT5maWxlc3VidHlwZSkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKHZlcnNpb25pbmZvMS0+Z290aXQuZnN0ICYmICF2ZXJzaW9uaW5mbzItPmdvdGl0LmZzdCkgfHwKCQkgICghdmVyc2lvbmluZm8xLT5nb3RpdC5mc3QgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mc3QpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQpIHsKCQl2ZXJfYmxvY2sxID0gdmVyc2lvbmluZm8xLT5ibG9ja3M7CgkJdmVyX2Jsb2NrMiA9IHZlcnNpb25pbmZvMi0+YmxvY2tzOwoJCXdoaWxlKCFkaWZmZXJlbnQgJiYgdmVyX2Jsb2NrMSAmJiB2ZXJfYmxvY2syKSB7CgkJCWRpZmZlcmVudCA9IGNvbXBhcmVfdmVyX2Jsb2NrKHZlcl9ibG9jazEsIHZlcl9ibG9jazIpOwoJCQl2ZXJfYmxvY2sxID0gdmVyX2Jsb2NrMS0+bmV4dDsKCQkJdmVyX2Jsb2NrMiA9IHZlcl9ibG9jazItPm5leHQ7CgkJfQoJCWlmKCFkaWZmZXJlbnQgJiYKCQkgICAoKHZlcl9ibG9jazEgJiYgIXZlcl9ibG9jazIpIHx8CgkJICAgKHZlcl9ibG9jazEgJiYgIXZlcl9ibG9jazIpKSkKCQkJZGlmZmVyZW50ID0gMTsKCX0KCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9kbGdpbml0KGRsZ2luaXRfdCAqZGxnaW5pdDEsIGRsZ2luaXRfdCAqZGxnaW5pdDIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChkbGdpbml0MS0+bWVtb3B0ICE9IGRsZ2luaXQyLT5tZW1vcHQpIHx8CgkgICAoZGxnaW5pdDEtPmRhdGEtPmx2Yy52ZXJzaW9uICE9IGRsZ2luaXQyLT5kYXRhLT5sdmMudmVyc2lvbikgfHwKCSAgIChkbGdpbml0MS0+ZGF0YS0+bHZjLmNoYXJhY3RzICE9IGRsZ2luaXQyLT5kYXRhLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX3Rvb2xiYXJfaXRlbSh0b29sYmFyX2l0ZW1fdCAqdG9vbGJhcl9pdGVtMSwgdG9vbGJhcl9pdGVtX3QgKnRvb2xiYXJfaXRlbTIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJd2hpbGUoIWRpZmZlcmVudCAmJiB0b29sYmFyX2l0ZW0xICYmIHRvb2xiYXJfaXRlbTIpIHsKCQlpZigodG9vbGJhcl9pdGVtMS0+aWQgJiYgIXRvb2xiYXJfaXRlbTItPmlkKSB8fAoJCSAgICghdG9vbGJhcl9pdGVtMS0+aWQgJiYgdG9vbGJhcl9pdGVtMi0+aWQpKQoJCQlkaWZmZXJlbnQgPSAxOwoJCXRvb2xiYXJfaXRlbTEgPSB0b29sYmFyX2l0ZW0xLT5uZXh0OwoJCXRvb2xiYXJfaXRlbTIgPSB0b29sYmFyX2l0ZW0yLT5uZXh0OwoJfQoJaWYoIWRpZmZlcmVudCAmJgoJICAgKCh0b29sYmFyX2l0ZW0xICYmICF0b29sYmFyX2l0ZW0yKSB8fAoJICAgKCF0b29sYmFyX2l0ZW0xICYmIHRvb2xiYXJfaXRlbTIpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX3Rvb2xiYXIodG9vbGJhcl90ICp0b29sYmFyMSwgdG9vbGJhcl90ICp0b29sYmFyMikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKHRvb2xiYXIxLT5tZW1vcHQgIT0gdG9vbGJhcjItPm1lbW9wdCkgfHwKCSAgICh0b29sYmFyMS0+bHZjLnZlcnNpb24gIT0gdG9vbGJhcjItPmx2Yy52ZXJzaW9uKSB8fAoJICAgKHRvb2xiYXIxLT5sdmMuY2hhcmFjdHMgIT0gdG9vbGJhcjItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50KQoJCWRpZmZlcmVudCA9IGNvbXBhcmVfdG9vbGJhcl9pdGVtKHRvb2xiYXIxLT5pdGVtcywgdG9vbGJhcjItPml0ZW1zKTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9hbmlfY3VyaWNvKGFuaV9jdXJpY29fdCAqYW5pX2N1cmljbzEsIGFuaV9jdXJpY29fdCAqYW5pX2N1cmljbzIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChhbmlfY3VyaWNvMS0+bWVtb3B0ICE9IGFuaV9jdXJpY28yLT5tZW1vcHQpIHx8CgkgICAoYW5pX2N1cmljbzEtPmRhdGEtPmx2Yy52ZXJzaW9uICE9IGFuaV9jdXJpY28yLT5kYXRhLT5sdmMudmVyc2lvbikgfHwKCSAgIChhbmlfY3VyaWNvMS0+ZGF0YS0+bHZjLmNoYXJhY3RzICE9IGFuaV9jdXJpY28yLT5kYXRhLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlKHJlc291cmNlX3QgKnJlc291cmNlMSwgcmVzb3VyY2VfdCAqcmVzb3VyY2UyKSB7Cglzd2l0Y2gocmVzb3VyY2UxLT50eXBlKSB7CgkJY2FzZSByZXNfYWNjOgoJCQlyZXR1cm4gY29tcGFyZV9hY2NlbGVyYXRvcihyZXNvdXJjZTEtPnJlcy5hY2MsIHJlc291cmNlMi0+cmVzLmFjYyk7CgkJY2FzZSByZXNfYm1wOgoJCQlyZXR1cm4gY29tcGFyZV9iaXRtYXAocmVzb3VyY2UxLT5yZXMuYm1wLCByZXNvdXJjZTItPnJlcy5ibXApOwoJCWNhc2UgcmVzX2N1cjoKCQkJcmV0dXJuIGNvbXBhcmVfY3Vyc29yKHJlc291cmNlMS0+cmVzLmN1ciwgcmVzb3VyY2UyLT5yZXMuY3VyKTsKCQljYXNlIHJlc19jdXJnOgoJCQlyZXR1cm4gY29tcGFyZV9jdXJzb3JfZ3JvdXAocmVzb3VyY2UxLT5yZXMuY3VyZywgcmVzb3VyY2UyLT5yZXMuY3VyZyk7CgkJY2FzZSByZXNfZGxnOgoJCQlyZXR1cm4gY29tcGFyZV9kaWFsb2cocmVzb3VyY2UxLT5yZXMuZGxnLCByZXNvdXJjZTItPnJlcy5kbGcpOwoJCWNhc2UgcmVzX2RsZ2V4OgoJCQlyZXR1cm4gY29tcGFyZV9kaWFsb2dleChyZXNvdXJjZTEtPnJlcy5kbGdleCwgcmVzb3VyY2UyLT5yZXMuZGxnZXgpOwoJCWNhc2UgcmVzX2ZudDoKCQkJcmV0dXJuIGNvbXBhcmVfZm9udChyZXNvdXJjZTEtPnJlcy5mbnQsIHJlc291cmNlMi0+cmVzLmZudCk7CgkJY2FzZSByZXNfZm50ZGlyOgoJCQlyZXR1cm4gY29tcGFyZV9mb250ZGlyKHJlc291cmNlMS0+cmVzLmZuZCwgcmVzb3VyY2UyLT5yZXMuZm5kKTsKCQljYXNlIHJlc19pY286CgkJCXJldHVybiBjb21wYXJlX2ljb24ocmVzb3VyY2UxLT5yZXMuaWNvLCByZXNvdXJjZTItPnJlcy5pY28pOwoJCWNhc2UgcmVzX2ljb2c6CgkJCXJldHVybiBjb21wYXJlX2ljb25fZ3JvdXAocmVzb3VyY2UxLT5yZXMuaWNvZywgcmVzb3VyY2UyLT5yZXMuaWNvZyk7CgkJY2FzZSByZXNfbWVuOgoJCQlyZXR1cm4gY29tcGFyZV9tZW51KHJlc291cmNlMS0+cmVzLm1lbiwgcmVzb3VyY2UyLT5yZXMubWVuKTsKCQljYXNlIHJlc19tZW5leDoKCQkJcmV0dXJuIGNvbXBhcmVfbWVudWV4KHJlc291cmNlMS0+cmVzLm1lbmV4LCByZXNvdXJjZTItPnJlcy5tZW5leCk7CgkJY2FzZSByZXNfcmR0OgoJCQlyZXR1cm4gY29tcGFyZV9yY2RhdGEocmVzb3VyY2UxLT5yZXMucmR0LCByZXNvdXJjZTItPnJlcy5yZHQpOwoJCWNhc2UgcmVzX3N0dDoKCQkJcmV0dXJuIGNvbXBhcmVfc3RyaW5ndGFibGUocmVzb3VyY2UxLT5yZXMuc3R0LCByZXNvdXJjZTItPnJlcy5zdHQpOwoJCWNhc2UgcmVzX3VzcjoKCQkJcmV0dXJuIGNvbXBhcmVfdXNlcihyZXNvdXJjZTEtPnJlcy51c3IsIHJlc291cmNlMi0+cmVzLnVzcik7CgkJY2FzZSByZXNfbXNnOgoJCQlyZXR1cm4gY29tcGFyZV9tZXNzYWdldGFibGUocmVzb3VyY2UxLT5yZXMubXNnLCByZXNvdXJjZTItPnJlcy5tc2cpOwoJCWNhc2UgcmVzX3ZlcjoKCQkJcmV0dXJuIGNvbXBhcmVfdmVyc2lvbmluZm8ocmVzb3VyY2UxLT5yZXMudmVyLCByZXNvdXJjZTItPnJlcy52ZXIpOwoJCWNhc2UgcmVzX2RsZ2luaXQ6CgkJCXJldHVybiBjb21wYXJlX2RsZ2luaXQocmVzb3VyY2UxLT5yZXMuZGxnaSwgcmVzb3VyY2UyLT5yZXMuZGxnaSk7CgkJY2FzZSByZXNfdG9vbGJhcjoKCQkJcmV0dXJuIGNvbXBhcmVfdG9vbGJhcihyZXNvdXJjZTEtPnJlcy50YnQsIHJlc291cmNlMi0+cmVzLnRidCk7CgkJY2FzZSByZXNfYW5pY3VyOgoJCWNhc2UgcmVzX2FuaWljbzoKCQkJcmV0dXJuIGNvbXBhcmVfYW5pX2N1cmljbyhyZXNvdXJjZTEtPnJlcy5hbmksIHJlc291cmNlMi0+cmVzLmFuaSk7CgkJZGVmYXVsdDoKCQkJLyogTm90IHN1cHBvc2VkIHRvIHJlYWNoIGhlcmUgKi8KCQkJZnByaW50ZihzdGRlcnIsICJOb3Qgc3VwcG9zZWQgdG8gcmVhY2ggaGVyZSAoY29tcGFyZSgpKVxuIik7CgkJCWFib3J0KCk7CgkJCXJldHVybiAtMTsKCX0KfQoKdm9pZCB2ZXJpZnlfdHJhbnNsYXRpb25zKHJlc291cmNlX3QgKnRvcCkgewoJZW51bSBsYW5nX3R5cGVfZSBsYW5nX3R5cGU7CgllbnVtIHJlc19lIHJlc190eXBlOwoJaW50ICoqcHJlc2VuY2U7CglpbnQgaSwgajsKCWNoYXIgKm5hbWVpZDsKCWNoYXIgKipwcm9ibGVtczsKCWludCBuYl9wcm9ibGVtcywgbGFzdF9wcm9ibGVtOwoJaW50IGNvbXBsZXRlLCBuZWVkc193b3JrLCBwYXJ0aWFsOwoJcmVzb3VyY2VfdCAqbmV4dCA9IHRvcDsKCglmb3IocmVzX3R5cGUgPSByZXNfMDsgcmVzX3R5cGUgPD0gcmVzX3VzcjsgcmVzX3R5cGUrKykgewoJCXByZXNlbnRfcmVzb3VyY2VzW3Jlc190eXBlXSA9IDA7CgkJZm9yKGxhbmdfdHlwZSA9IGxhbmdfdHlwZV9tYXN0ZXI7IGxhbmdfdHlwZSA8PSBsYW5nX3R5cGVfbm9ybWFsOyBsYW5nX3R5cGUrKykgewoJCQluYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV0gPSAwOwoJCQlsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlXSA9IE5VTEw7CgkJfQoJfQoKCXdoaWxlKG5leHQpIHsKCQlzd2l0Y2gobmV4dC0+dHlwZSkgewoJCQljYXNlIHJlc19hY2M6CgkJCWNhc2UgcmVzX2JtcDoKCQkJY2FzZSByZXNfY3VyOgoJCQljYXNlIHJlc19jdXJnOgoJCQljYXNlIHJlc19kbGc6CgkJCWNhc2UgcmVzX2RsZ2V4OgoJCQljYXNlIHJlc19mbnQ6CgkJCWNhc2UgcmVzX2ZudGRpcjoKCQkJY2FzZSByZXNfaWNvOgoJCQljYXNlIHJlc19pY29nOgoJCQljYXNlIHJlc19tZW46CgkJCWNhc2UgcmVzX21lbmV4OgoJCQljYXNlIHJlc19yZHQ6CgkJCWNhc2UgcmVzX3N0dDoKCQkJY2FzZSByZXNfdXNyOgoJCQljYXNlIHJlc19tc2c6CgkJCWNhc2UgcmVzX3ZlcjoKCQkJY2FzZSByZXNfZGxnaW5pdDoKCQkJY2FzZSByZXNfdG9vbGJhcjoKCQkJY2FzZSByZXNfYW5pY3VyOgoJCQljYXNlIHJlc19hbmlpY286CgkJCQlhZGRfcmVzb3VyY2UobmV4dCk7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWZwcmludGYoc3RkZXJyLCAiUmVwb3J0IHRoaXM6IHVua293biByZXNvdXJjZSB0eXBlIHBhcnNlZCAlMDh4XG4iLCBuZXh0LT50eXBlKTsKCQl9CgkJbmV4dCA9IG5leHQtPm5leHQ7Cgl9CglwcmVzZW50X3Jlc291cmNlc1tyZXNfYWNjXSA9IDE7CglyZXNfbmFtZXNbcmVzX2FjY10gPSBzdHJkdXAoImFjY2VsZXJhdG9yIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfYm1wXSA9IDE7CglyZXNfbmFtZXNbcmVzX2JtcF0gPSBzdHJkdXAoImJpdG1hcCIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2N1cl0gPSAxOwoJcmVzX25hbWVzW3Jlc19jdXJdID0gc3RyZHVwKCJjdXJzb3IiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19jdXJnXSA9IDE7CglyZXNfbmFtZXNbcmVzX2N1cmddID0gc3RyZHVwKCJjdXJzb3JfZ3JvdXAiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19kbGddID0gMTsKCXJlc19uYW1lc1tyZXNfZGxnXSA9IHN0cmR1cCgiZGlhbG9nIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfZGxnZXhdID0gMTsKCXJlc19uYW1lc1tyZXNfZGxnZXhdID0gc3RyZHVwKCJkaWFsb2dleCIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2ZudF0gPSAxOwoJcmVzX25hbWVzW3Jlc19mbnRdID0gc3RyZHVwKCJmb250Iik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfZm50ZGlyXSA9IDE7CglyZXNfbmFtZXNbcmVzX2ZudGRpcl0gPSBzdHJkdXAoImZvbnRkaXIiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19pY29dID0gMTsKCXJlc19uYW1lc1tyZXNfaWNvXSA9IHN0cmR1cCgiaWNvbiIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2ljb2ddID0gMTsKCXJlc19uYW1lc1tyZXNfaWNvZ10gPSBzdHJkdXAoImljb25fZ3JvdXAiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19tZW5dID0gMTsKCXJlc19uYW1lc1tyZXNfbWVuXSA9IHN0cmR1cCgibWVudSIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX21lbmV4XSA9IDE7CglyZXNfbmFtZXNbcmVzX21lbmV4XSA9IHN0cmR1cCgibWVudWV4Iik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfcmR0XSA9IDE7CglyZXNfbmFtZXNbcmVzX3JkdF0gPSBzdHJkdXAoInJjZGF0YSIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX3N0dF0gPSAxOwoJcmVzX25hbWVzW3Jlc19zdHRdID0gc3RyZHVwKCJzdHJpbmd0YWJsZSIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX3Vzcl0gPSAxOwoJcmVzX25hbWVzW3Jlc191c3JdID0gc3RyZHVwKCJ1c2VyIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfbXNnXSA9IDE7CglyZXNfbmFtZXNbcmVzX21zZ10gPSBzdHJkdXAoIm1lc3NhZ2V0YWJsZSIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX3Zlcl0gPSAxOwoJcmVzX25hbWVzW3Jlc192ZXJdID0gc3RyZHVwKCJ2ZXJzaW9uaW5mbyIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2RsZ2luaXRdID0gMTsKCXJlc19uYW1lc1tyZXNfZGxnaW5pdF0gPSBzdHJkdXAoImRsZ2luaXQiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc190b29sYmFyXSA9IDE7CglyZXNfbmFtZXNbcmVzX3Rvb2xiYXJdID0gc3RyZHVwKCJ0b29sYmFyIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfYW5pY3VyXSA9IDE7CglyZXNfbmFtZXNbcmVzX2FuaWN1cl0gPSBzdHJkdXAoImFuaV9jdXJzb3IiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19hbmlpY29dID0gMTsKCXJlc19uYW1lc1tyZXNfYW5paWNvXSA9IHN0cmR1cCgiYW5pX2ljb24iKTsKCglmb3IocmVzX3R5cGUgPSByZXNfMDsgcmVzX3R5cGUgPD0gcmVzX3VzcjsgcmVzX3R5cGUrKykgewoJCWlmKCFwcmVzZW50X3Jlc291cmNlc1tyZXNfdHlwZV0pIHsKCQkJY29udGludWU7CgkJfQoJCWlmKG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25vcm1hbF0gPiAwKSB7CgkJCWlmKG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl0gJiYgbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbmV1dHJhbF0pIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiVHlwZSAlczpcbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0pOwoJCQkJZnByaW50ZihzdGRlcnIsICJUaGVyZSBhcmUgYm90aCBhIE5FVVRSQUwgYW5kIGEgTUFTVEVSIHZlcnNpb24gZm9yICVzLCBhbG9uZyB3aXRoIGFkZGl0aW9uYWwgbG9jYWxpemVkIHZlcnNpb25zLiBUaGUgTkVVVFJBTCB2ZXJzaW9ucyB3aWxsIG5vdCBiZSBjaGVja2VkIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuXG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsKCQkJfSBlbHNlIGlmKG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25ldXRyYWxdKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlR5cGUgJXM6XG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsKCQkJCWZwcmludGYoc3RkZXJyLCAiVGhlcmUgYXJlIG5vIE1BU1RFUiB2ZXJzaW9uLCBidXQgdGhlcmUgYXJlIHNvbWUgTkVVVFJBTCB2ZXJzaW9ucyBmb3IgJXMsIHNvIHdpbGwgdXNlIHRob3NlIGluc3RlYWQgb2YgTUFTVEVSIGZvciBjb21wYXJpc29uLlxuIiwgcmVzX25hbWVzW3Jlc190eXBlXSk7CgkJCQlsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl0gPSBsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25ldXRyYWxdOwoJCQkJbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXSA9IG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25ldXRyYWxdOwoJCQl9IGVsc2UgaWYoIW5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl0pIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiVHlwZSAlczpcbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0pOwoJCQkJZnByaW50ZihzdGRlcnIsICJUaGVyZSBhcmUgbm8gTkVVVFJBTCBub3IgTUFTVEVSIHZlcnNpb25zIGZvciAlcywgYnV0IHRoZXJlIGFyZSBzb21lIG90aGVyIGxvY2FsaXplZCB2ZXJzaW9ucy4gTm8gY29tcGFyaXNvbiB3aWxsIGJlIGRvbmUgYXQgYWxsLlxuIiwgcmVzX25hbWVzW3Jlc190eXBlXSk7CgkJCX0KCQl9IGVsc2UgewoJCQlpZihuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdICYmIG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25ldXRyYWxdKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlR5cGUgJXM6XG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsKCQkJCWZwcmludGYoc3RkZXJyLCAiVGhlcmUgYXJlIGJvdGggYSBORVVUUkFMIGFuZCBhIE1BU1RFUiB2ZXJzaW9ucyBmb3IgJXMsIGJ1dCBubyBvdGhlciBsb2NhbGl6ZWQgdmVyc2lvbi4gTm8gY29tcGFyaXNvbiB3aWxsIGJlIGRvbmUgYXQgYWxsLlxuIiwgcmVzX25hbWVzW3Jlc190eXBlXSk7CgkJCX0gZWxzZSBpZihuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlR5cGUgJXM6XG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsKCQkJCWZwcmludGYoc3RkZXJyLCAiVGhlcmUgYXJlIG9ubHkgTUFTVEVSIHZlcnNpb25zIGZvciAlcy4gTm8gY29tcGFyaXNvbiB3aWxsIGJlIGRvbmUgYXQgYWxsLlxuIiwgcmVzX25hbWVzW3Jlc190eXBlXSk7CgkJCX0gZWxzZSBpZihuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9uZXV0cmFsXSkgewoJCQkJLyogZnByaW50ZihzdGRlcnIsICJUaGVyZSBhcmUgb25seSBORVVUUkFMIHZlcnNpb25zIGZvciAlcy4gTm8gY29tcGFyaXNvbiB3aWxsIGJlIGRvbmUgYXQgYWxsLlxuIiwgcmVzX25hbWVzW3Jlc190eXBlXSk7ICovCgkJCX0gZWxzZSB7CgkJCQkvKiBmcHJpbnRmKHN0ZGVyciwgIlRoZXJlIGFyZSBubyB2ZXJzaW9ucyBhdCBhbGwgZm9yICVzLiBObyBjb21wYXJpc29uIHdpbGwgYmUgZG9uZSBhdCBhbGwuXG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsgKi8KCQkJfQoJCX0KCgkJcHJlc2VuY2UgPSBtYWxsb2MobmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXSpzaXplb2YoaW50ICopKTsKCQlmb3IoaSA9IDA7IGkgPCBuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdOyBpKyspIHsKCQkJcHJlc2VuY2VbaV0gPSBjYWxsb2MoTkJfTEFORywgc2l6ZW9mKGludCkpOwoJCQlwcmVzZW5jZVtpXVtNQVNURVJfTEFOR1VBR0VdID0gLTE7CgkJfQoKCQlmb3IoaSA9IDA7IGkgPCBuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9ub3JtYWxdOyBpKyspIHsKCQkJZm9yKGogPSAwOyBqIDwgbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXTsgaisrKSB7CgkJCQluYW1laWQgPSBzdHJkdXAoZ2V0X25hbWVpZF9zdHIobGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9ub3JtYWxdW2ldLT5uYW1lKSk7CgkJCQlpZighc3RyY21wKG5hbWVpZCwgZ2V0X25hbWVpZF9zdHIobGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdW2pdLT5uYW1lKSkpIHsKCQkJCQlpZihjb21wYXJlKGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbm9ybWFsXVtpXSwgbGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdW2pdKSkgewoJCQkJCQlwcmVzZW5jZVtqXVtnZXRfbGFuZ3VhZ2VfaWQobGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9ub3JtYWxdW2ldKV0gPSAyOwoJCQkJCQkvKiBmcHJpbnRmKHN0ZGVyciwgIkRpZmZlcmVuY2VzIGluIHR5cGUgJXMsIElEICVzLCBmb3IgbGFuZ3VhZ2UgJXNcbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0sIG5hbWVpZCwgZ2V0X2xhbmd1YWdlX25hbWUoZ2V0X2xhbmd1YWdlX2lkKGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbm9ybWFsXVtpXSkpKTsgKi8KCQkJCQl9IGVsc2UgewoJCQkJCQlwcmVzZW5jZVtqXVtnZXRfbGFuZ3VhZ2VfaWQobGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9ub3JtYWxdW2ldKV0gPSAxOwoJCQkJCX0KCQkJCX0KCQkJCWZyZWUobmFtZWlkKTsKCQkJfQoJCX0KCgkJcHJvYmxlbXMgPSBtYWxsb2Moc2l6ZW9mKGNoYXIgKikpOwoJCXByb2JsZW1zWzBdID0gc3RyZHVwKCIiKTsKCQluYl9wcm9ibGVtcyA9IDA7CgkJbGFzdF9wcm9ibGVtID0gLTE7CgkJZm9yKGkgPSAwOyBpIDwgTkJfTEFORzsgaSsrKSB7CgkJCWNvbXBsZXRlID0gMTsKCQkJbmVlZHNfd29yayA9IDA7CgkJCXBhcnRpYWwgPSAwOwoJCQlmb3IoaiA9IDA7IGogPCBuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdOyBqKyspIHsKCQkJCWlmKHByZXNlbmNlW2pdW2ldKSB7CgkJCQkJcGFydGlhbCA9IDE7CgkJCQkJaWYocHJlc2VuY2Vbal1baV0gPT0gMikgewoJCQkJCQluZWVkc193b3JrID0gMTsKCQkJCQkJcHJvYmxlbXMgPSByZWFsbG9jKHByb2JsZW1zLCAoKytuYl9wcm9ibGVtcysxKSpzaXplb2YoY2hhciAqKSk7CgkJCQkJCXByb2JsZW1zW25iX3Byb2JsZW1zXSA9IG1hbGxvYyhzdHJsZW4oZ2V0X25hbWVpZF9zdHIobGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdW2pdLT5uYW1lKSkgKyA5KTsKCQkJCQkJc3ByaW50Zihwcm9ibGVtc1tuYl9wcm9ibGVtc10sICJESUZGICVzICUwMngiLCBnZXRfbmFtZWlkX3N0cihsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl1bal0tPm5hbWUpLCBpKTsKCQkJCQkJaWYobGFzdF9wcm9ibGVtID09IGkpIHsKCQkJCQkJCXByb2JsZW1zW25iX3Byb2JsZW1zLTFdID0gcmVhbGxvYyhwcm9ibGVtc1tuYl9wcm9ibGVtcy0xXSwgc3RybGVuKHByb2JsZW1zW25iX3Byb2JsZW1zLTFdKSArIDMpOwoJCQkJCQkJc3RyY2F0KHByb2JsZW1zW25iX3Byb2JsZW1zLTFdLCAiIFxcIik7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlsYXN0X3Byb2JsZW0gPSBpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQljb21wbGV0ZSA9IDA7CgkJCQkJcHJvYmxlbXMgPSByZWFsbG9jKHByb2JsZW1zLCAoKytuYl9wcm9ibGVtcysxKSpzaXplb2YoY2hhciAqKSk7CgkJCQkJcHJvYmxlbXNbbmJfcHJvYmxlbXNdID0gbWFsbG9jKHN0cmxlbihnZXRfbmFtZWlkX3N0cihsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl1bal0tPm5hbWUpKSArIDgpOwoJCQkJCXNwcmludGYocHJvYmxlbXNbbmJfcHJvYmxlbXNdLCAiQUJTICVzICUwMngiLCBnZXRfbmFtZWlkX3N0cihsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl1bal0tPm5hbWUpLCBpKTsKCQkJCQlpZihsYXN0X3Byb2JsZW0gPT0gaSkgewoJCQkJCQlwcm9ibGVtc1tuYl9wcm9ibGVtcy0xXSA9IHJlYWxsb2MocHJvYmxlbXNbbmJfcHJvYmxlbXMtMV0sIHN0cmxlbihwcm9ibGVtc1tuYl9wcm9ibGVtcy0xXSkgKyAzKTsKCQkJCQkJc3RyY2F0KHByb2JsZW1zW25iX3Byb2JsZW1zLTFdLCAiIFxcIik7CgkJCQkJfSBlbHNlIHsKCQkJCQkJbGFzdF9wcm9ibGVtID0gaTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYoY29tcGxldGUgJiYgcGFydGlhbCAmJiAhbmVlZHNfd29yaykgewoJCQkJLyogU3VwcG9ydCBpcyBjb21wbGV0ZSwgbm8gbmVlZCB0byBkbyBhbnl0aGluZyAqLwoJCQkJLyogZnByaW50ZihzdGRlcnIsICJTdXBwb3J0IGZvciBsYW5ndWFnZSAlcyBpcyBjb21wbGV0ZSBmb3IgJXMuXG4iLCBnZXRfbGFuZ3VhZ2VfbmFtZShpKSwgcmVzX25hbWVzW3Jlc190eXBlXSk7ICovCgkJCQlwcmludGYoIi4iKTsKCQkJfSBlbHNlIGlmKGNvbXBsZXRlICYmIHBhcnRpYWwgJiYgbmVlZHNfd29yaykgewoJCQkJLyogU3VwcG9ydCBpcyBpbmNvbXBsZXRlIChkaWZmZXJpbmcgcmVzb3VyY2VzKSwgbmVlZHMgd29yayAqLwoJCQkJLyogZnByaW50ZihzdGRlcnIsICJTdXBwb3J0IGZvciBsYW5ndWFnZSAlcyBpcyBpbmNvbXBsZXRlIChkaWZmZXJpbmcgcmVzb3VyY2VzKSBmb3IgJXMuXG4iLCBnZXRfbGFuZ3VhZ2VfbmFtZShpKSwgcmVzX25hbWVzW3Jlc190eXBlXSk7ICovCgkJCQlwcmludGYoIngiKTsKCQkJfSBlbHNlIGlmKCFjb21wbGV0ZSAmJiBwYXJ0aWFsICYmICFuZWVkc193b3JrKSB7CgkJCQkvKiBTdXBwb3J0IGlzIGluY29tcGxldGUgKG1pc3NpbmcgcmVzb3VyY2VzKSwgbmVlZHMgd29yayAqLwoJCQkJLyogZnByaW50ZihzdGRlcnIsICJTdXBwb3J0IGZvciBsYW5ndWFnZSAlcyBpcyBpbmNvbXBsZXRlIChtaXNzaW5nIHJlc291cmNlcykgZm9yICVzLlxuIiwgZ2V0X2xhbmd1YWdlX25hbWUoaSksIHJlc19uYW1lc1tyZXNfdHlwZV0pOyAqLwoJCQkJcHJpbnRmKCItIik7CgkJCX0gZWxzZSBpZighY29tcGxldGUgJiYgcGFydGlhbCAmJiBuZWVkc193b3JrKSB7CgkJCQkvKiBTdXBwb3J0IGlzIGluY29tcGxldGUgKG1pc3NpbmcgYW5kIGRpZmZlcmluZyByZXNvdXJjZXMpLCBuZWVkcyB3b3JrICovCgkJCQkvKiBmcHJpbnRmKHN0ZGVyciwgIlN1cHBvcnQgZm9yIGxhbmd1YWdlICVzIGlzIGluY29tcGxldGUgKG1pc3NpbmcgYW5kIGRpZmZlcmluZyByZXNvdXJjZXMpIGZvciAlcy5cbiIsIGdldF9sYW5ndWFnZV9uYW1lKGkpLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsgKi8KCQkJCXByaW50ZigiKyIpOwoJCQl9IGVsc2UgaWYoIWNvbXBsZXRlICYmICFwYXJ0aWFsKSB7CgkJCQkvKiBTdXBwb3J0IGlzIHRvdGFsbHkgYWJzZW50LCBtaWdodCBiZSBpbnRlcmVzdGluZyB0byBkbyAqLwoJCQkJLyogZnByaW50ZihzdGRlcnIsICJTdXBwb3J0IGZvciBsYW5ndWFnZSAlcyBpcyBhYnNlbnQgZm9yICVzLlxuIiwgZ2V0X2xhbmd1YWdlX25hbWUoaSksIHJlc19uYW1lc1tyZXNfdHlwZV0pOyAqLwoJCQkJcHJpbnRmKCIgIik7CgkJCX0gZWxzZSB7CgkJCQkvKiBTdXBwb3J0IGlzIG5vdCByZWxldmFudCwgbm8gbmVlZCB0byBkbyBhbnl0aGluZyAqLwoJCQkJLyogZnByaW50ZihzdGRlcnIsICJTdXBwb3J0IGZvciBsYW5ndWFnZSAlcyBpcyBub3QgcmVsZXZhbnQgZm9yICVzLlxuIiwgZ2V0X2xhbmd1YWdlX25hbWUoaSksIHJlc19uYW1lc1tyZXNfdHlwZV0pOyAqLwoJCQkJcHJpbnRmKCJuIik7CgkJCX0KCQl9CgkJcHJpbnRmKCJcbiIpOwoJCWZvcihpID0gMTsgaSA8PSBuYl9wcm9ibGVtczsgaSsrKSB7CgkJCXByaW50ZigiJXNcbiIsIHByb2JsZW1zW2ldKTsKCQkJZnJlZShwcm9ibGVtc1tpXSk7CgkJfQoJCWZyZWUocHJvYmxlbXNbMF0pOwoJCWZyZWUocHJvYmxlbXMpOwoJCWZvcihpID0gMDsgaSA8IG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl07IGkrKykKCQkJZnJlZShwcmVzZW5jZVtpXSk7CgkJZnJlZShwcmVzZW5jZSk7Cgl9Cn0K