LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKgoqKiAgIElUVS1UIEcuNzIyLjEgKDIwMDUtMDUpIC0gRml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gZm9yIG1haW4gYm9keSBhbmQgQW5uZXggQwoqKiAgID4gU29mdHdhcmUgUmVsZWFzZSAyLjEgKDIwMDgtMDYpCioqICAgICAoU2ltcGxlIHJlcGFja2FnaW5nOyBubyBjaGFuZ2UgZnJvbSAyMDA1LTA1IFJlbGVhc2UgMi4wIGNvZGUpCioqCioqICAgqSAyMDA0IFBvbHljb20sIEluYy4KKioKKiogICBBbGwgcmlnaHRzIHJlc2VydmVkLgoqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRmlsZW5hbWU6ICAgIGRlY29kZXIuYyAgICAKCiAgUHVycG9zZTogICAgIENvbnRhaW5zIGZpbGVzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBHLjcyMi4xIEFubmV4IEMgZGVjb2RlcgoJCQogIERlc2lnbiBOb3RlczoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlICJkZWZzLmgiCiNpbmNsdWRlICJ0YWJsZXMuaCIKI2luY2x1ZGUgImh1ZmZfZGVmLmgiCiNpbmNsdWRlICJjb3VudC5oIgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiAgICBkZWNvZGVyCgogU3ludGF4OiAgICAgIHZvaWQgZGVjb2RlcihCaXRfT2JqICpiaXRvYmosICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5kX09iaiAqcmFuZG9iaiwgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpkZWNvZGVyX21sdF9jb2VmcywgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBfbWFnX3NoaWZ0LCAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcF9vbGRfbWFnX3NoaWZ0LCAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpvbGRfZGVjb2Rlcl9tbHRfY29lZnMsICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgZnJhbWVfZXJyb3JfZmxhZykgICAgICAKICAgICAgICAgICAgICAKICAgICAgICAgICAgICBpbnB1dHM6ICAgIEJpdF9PYmogKmJpdG9iagogICAgICAgICAgICAgICAgICAgICAgICAgUmFuZF9PYmogKnJhbmRvYmoKICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwX29sZF9tYWdfc2hpZnQKICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqb2xkX2RlY29kZXJfbWx0X2NvZWZzCiAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgZnJhbWVfZXJyb3JfZmxhZwogICAgICAgICAgICAgIAogICAgICAgICAgICAgIG91dHB1dHM6ICAgV29yZDE2ICpkZWNvZGVyX21sdF9jb2VmcywgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBfbWFnX3NoaWZ0LCAgICAgICAgICAKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIAoKIERlc2NyaXB0aW9uOiBEZWNvZGVzIHRoZSBvdXRfd29yZHMgaW50byBtbHQgY29lZnMgdXNpbmcgRy43MjIuMSBBbm5leCBDCgogRGVzaWduIE5vdGVzOgogCiBXTU9QUzogICAgIDdrSHogfCAgIDI0a2JpdCAgICB8ICAgIDMya2JpdAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQVZHICB8ICAgIDAuODQgICAgIHwgICAgMC45NAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAogICAgICAgICAgICBNQVggIHwgICAgMC45MCAgICAgfCAgICAxLjAwCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKCQkJCQogICAgICAgICAgIDE0a0h6IHwgICAyNGtiaXQgICAgfCAgICAzMmtiaXQgICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQVZHICB8ICAgIDEuMzEgICAgIHwgICAgMS41NiAgICAgICAgfCAgICAgMS44OCAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBNQVggIHwgICAgMS41OSAgICAgfCAgICAxLjgwICAgICAgICB8ICAgICAxLjk4ICAgCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCgkJCQkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIGRlY29kZXIoQml0X09iaiAqYml0b2JqLAogICAgICAgICAgICAgUmFuZF9PYmogKnJhbmRvYmosCiAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCgkgICAgICAgICBXb3JkMTYgKmRlY29kZXJfbWx0X2NvZWZzLAoJICAgICAgICAgV29yZDE2ICpwX21hZ19zaGlmdCwKICAgICAgICAgICAgIFdvcmQxNiAqcF9vbGRfbWFnX3NoaWZ0LAogICAgICAgICAgICAgV29yZDE2ICpvbGRfZGVjb2Rlcl9tbHRfY29lZnMsCiAgICAgICAgICAgICBXb3JkMTYgZnJhbWVfZXJyb3JfZmxhZykKewoKCiAgICBXb3JkMTYgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtNQVhfTlVNQkVSX09GX1JFR0lPTlNdOwogICAgV29yZDE2ICBkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXNbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsKICAgIFdvcmQxNiAgZGVjb2Rlcl9jYXRlZ29yeV9iYWxhbmNlc1tNQVhfTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfUE9TU0lCSUxJVElFUy0xXTsKICAgIFVXb3JkMTYgY2F0ZWdvcml6YXRpb25fY29udHJvbDsKICAgIFdvcmQxNiAgZGVjb2Rlcl9yZWdpb25fc3RhbmRhcmRfZGV2aWF0aW9uW01BWF9OVU1CRVJfT0ZfUkVHSU9OU107CiAgICBXb3JkMTYgIGk7CgogICAgV29yZDE2ICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9iaXRzOwogICAgV29yZDE2ICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzOwogICAgV29yZDE2ICBudW1iZXJfb2ZfY29lZnM7CiAgICBXb3JkMTYgIG51bWJlcl9vZl92YWxpZF9jb2VmczsKICAgIAogICAgCiAgICB0ZXN0KCk7CiAgICBpZiAobnVtYmVyX29mX3JlZ2lvbnM9PU5VTUJFUl9PRl9SRUdJT05TKQogICAgewogICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX2JpdHMgPSBOVU1fQ0FURUdPUklaQVRJT05fQ09OVFJPTF9CSVRTOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMgPSBOVU1fQ0FURUdPUklaQVRJT05fQ09OVFJPTF9QT1NTSUJJTElUSUVTOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIG51bWJlcl9vZl9jb2VmcyA9IERDVF9MRU5HVEg7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgbnVtYmVyX29mX3ZhbGlkX2NvZWZzID0gTlVNQkVSX09GX1ZBTElEX0NPRUZTOwogICAgICAgIG1vdmUxNigpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX2JpdHMgPSBNQVhfTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfQklUUzsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzID0gTUFYX05VTV9DQVRFR09SSVpBVElPTl9DT05UUk9MX1BPU1NJQklMSVRJRVM7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgbnVtYmVyX29mX2NvZWZzID0gTUFYX0RDVF9MRU5HVEg7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgbnVtYmVyX29mX3ZhbGlkX2NvZWZzID0gTUFYX05VTUJFUl9PRl9WQUxJRF9DT0VGUzsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KCiAgICB0ZXN0KCk7CiAgICBpZiAoZnJhbWVfZXJyb3JfZmxhZyA9PSAwKSAKICAgIHsKCiAgICAgICAgLyogY29udmVydCB0aGUgYml0cyB0byBhYnNvbHV0ZSByZWdpb24gcG93ZXIgaW5kZXggYW5kIGRlY29kZXJfcmVnaW9uX3N0YW5kYXJkX2RldmlhdGlvbiAqLwogICAgICAgIAogICAgICAgIGRlY29kZV9lbnZlbG9wZShiaXRvYmosCiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9yZWdpb25zLAogICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX3JlZ2lvbl9zdGFuZGFyZF9kZXZpYXRpb24sCgkJICAgICAgICAgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCwKCQkgICAgICAgICAgICAgICAgcF9tYWdfc2hpZnQpOwoKICAgICAgICAvKiBmaWxsIHRoZSBjYXRlZ29yaXphdGlvbl9jb250cm9sIHdpdGggTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfQklUUyAqLwogICAgICAgIGNhdGVnb3JpemF0aW9uX2NvbnRyb2wgPSAwOwogICAgICAgIGZvciAoaT0wOyBpPG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX2JpdHM7IGkrKykgCiAgICAgICAgewogICAgICAgIAlnZXRfbmV4dF9iaXQoYml0b2JqKTsKICAgICAgICAJY2F0ZWdvcml6YXRpb25fY29udHJvbCA9IHNobF9ub2NoZWNrKGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsMSk7CiAgICAgICAgCWNhdGVnb3JpemF0aW9uX2NvbnRyb2wgPSBhZGQoY2F0ZWdvcml6YXRpb25fY29udHJvbCxiaXRvYmotPm5leHRfYml0KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYml0b2JqLT5udW1iZXJfb2ZfYml0c19sZWZ0ID0gc3ViKGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdCxudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9iaXRzKTsKCiAgICAgICAgLyogb2J0YWluIGRlY29kZXIgcG93ZXIgY2F0ZWdvcmllcyBhbmQgY2F0ZWdvcnkgYmFsYW5jZXMgKi8KICAgICAgICAvKiBiYXNlZCBvbiB0aGUgYWJzb2x1dGUgcmVnaW9uIHBvd2VyIGluZGV4ICAgICAgICAgICAgICAqLwogICAgICAgIGNhdGVnb3JpemUoYml0b2JqLT5udW1iZXJfb2ZfYml0c19sZWZ0LAoJICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMsCgkgICAgICAgICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAoJICAgICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LAoJICAgICAgICAgICAgICAgZGVjb2Rlcl9wb3dlcl9jYXRlZ29yaWVzLAoJICAgICAgICAgICAgICAgZGVjb2Rlcl9jYXRlZ29yeV9iYWxhbmNlcyk7CgogICAgICAgIC8qIHBlcmZvcm0gYWRqdXN0bWFlbnRzIHRvIHRoZSBwb3dlciBjYXRlZ29yaWVzIGFuZCBjYXRlZ29yeSBiYWxhbmNlcyBiYXNlZCBvbiB0aGUgY2F0IGNvbnRyb2wgKi8KICAgICAgICByYXRlX2FkanVzdF9jYXRlZ29yaWVzKGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsCgkJCSAgICAgICAgICAgICAgICAgICBkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXMsCgkJCSAgICAgICAgICAgICAgICAgICBkZWNvZGVyX2NhdGVnb3J5X2JhbGFuY2VzKTsKCiAgICAgICAgLyogZGVjb2RlIHRoZSBxdWFudGl6ZWQgYml0cyBpbnRvIG1sdCBjb2VmcyAqLwogICAgICAgIGRlY29kZV92ZWN0b3JfcXVhbnRpemVkX21sdF9pbmRpY2VzKGJpdG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9yZWdpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJfcmVnaW9uX3N0YW5kYXJkX2RldmlhdGlvbiwKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXMsCgkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlcl9tbHRfY29lZnMpOwoKICAgICAgICAvKiB0ZXN0IGZvciBmcmFtZSBlcnJvcnMgKi8KICAgICAgICB0ZXN0XzRfZnJhbWVfZXJyb3JzKGJpdG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9yZWdpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZV9lcnJvcl9mbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcml6YXRpb25fY29udHJvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCk7CiAgICB9CgogICAgLyogcGVyZm9ybSBlcnJvciBoYW5kbGluZyBvcGVyYXRpb25zICovCiAgICBlcnJvcl9oYW5kbGluZyhudW1iZXJfb2ZfY29lZnMsCiAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfdmFsaWRfY29lZnMsCiAgICAgICAgICAgICAgICAgICAmZnJhbWVfZXJyb3JfZmxhZywKICAgICAgICAgICAgICAgICAgIGRlY29kZXJfbWx0X2NvZWZzLAogICAgICAgICAgICAgICAgICAgb2xkX2RlY29kZXJfbWx0X2NvZWZzLAogICAgICAgICAgICAgICAgICAgcF9tYWdfc2hpZnQsCiAgICAgICAgICAgICAgICAgICBwX29sZF9tYWdfc2hpZnQpOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb246ICAgIGRlY29kZV9lbnZlbG9wZQoKIFN5bnRheDogICAgICB2b2lkIGRlY29kZV9lbnZlbG9wZShCaXRfT2JqICpiaXRvYmosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICpkZWNvZGVyX3JlZ2lvbl9zdGFuZGFyZF9kZXZpYXRpb24sICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LCAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKnBfbWFnX3NoaWZ0KSAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAKICAgICAgICAgICAgICBpbnB1dHM6ICAgQml0X09iaiAqYml0b2JqCiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtYmVyX29mX3JlZ2lvbnMKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIG91dHB1dHM6ICBXb3JkMTYgICpkZWNvZGVyX3JlZ2lvbl9zdGFuZGFyZF9kZXZpYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4CiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKnBfbWFnX3NoaWZ0CiAgICAgICAgICAgICAgCiAKIERlc2NyaXB0aW9uOiBSZWNvdmVyIGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfaW5kZXggZnJvbSBjb2RlIGJpdHMKCiBEZXNpZ24gTm90ZXM6CiAKIFdNT1BTOiAgICAgN2tIeiB8ICAgIDI0a2JpdCAgICB8ICAgIDMya2JpdAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAgMC4wNCAgICAgfCAgICAwLjA0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAogICAgICAgICAgICBNQVggIHwgICAgIDAuMDUgICAgIHwgICAgMC4wNQogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAoJCQkJCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQgICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAgMC4wOCAgICAgfCAgICAwLjA4ICAgICAgICB8ICAgICAwLjA4ICAgCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBNQVggIHwgICAgIDAuMTAgICAgIHwgICAgMC4xMCAgICAgICAgfCAgICAgMC4xMCAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KCQkJCQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgZGVjb2RlX2VudmVsb3BlKEJpdF9PYmogKmJpdG9iaiwKICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9ucywKICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqZGVjb2Rlcl9yZWdpb25fc3RhbmRhcmRfZGV2aWF0aW9uLAoJCSAgICAgICAgICAgICBXb3JkMTYgICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsCgkJICAgICAgICAgICAgIFdvcmQxNiAgKnBfbWFnX3NoaWZ0KQogICAgIAp7CiAgICBXb3JkMTYgcmVnaW9uOwogICAgV29yZDE2IGk7CiAgICBXb3JkMTYgaW5kZXg7CiAgICBXb3JkMTYgZGlmZmVyZW50aWFsX3JlZ2lvbl9wb3dlcl9pbmRleFtNQVhfTlVNQkVSX09GX1JFR0lPTlNdOwogICAgV29yZDE2IG1heF9pbmRleDsKICAgIAogICAgV29yZDE2IHRlbXA7CiAgICBXb3JkMTYgdGVtcDE7CiAgICBXb3JkMTYgdGVtcDI7CiAgICBXb3JkMzIgYWNjYTsKCiAgICBpbmRleCA9IDA7CiAgICBtb3ZlMTYoKTsKCiAgICAvKiBnZXQgNSBiaXRzIGZyb20gdGhlIGN1cnJlbnQgY29kZSB3b3JkICovCiAgICBmb3IgKGk9MDsgaTw1OyBpKyspIAogICAgewogICAgICAgIGdldF9uZXh0X2JpdChiaXRvYmopOwogICAgICAgIGluZGV4ID0gc2hsX25vY2hlY2soaW5kZXgsMSk7CiAgICAgICAgaW5kZXggPSBhZGQoaW5kZXgsYml0b2JqLT5uZXh0X2JpdCk7CiAgICB9CiAgICBiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQgPSBzdWIoYml0b2JqLT5udW1iZXJfb2ZfYml0c19sZWZ0LDUpOwoKICAgIC8qIEVTRl9BREpVU1RNRU5UX1RPX1JNU19JTkRFWCBjb21wZW5zYXRlcyBmb3IgdGhlIGN1cnJlbnQgKDkvMzAvOTYpCiAgICAgICAgSU1MVCBiZWluZyBzY2FsZWQgdG8gaGlnaCBieSB0aGUgbmludGggcG93ZXIgb2Ygc3FydCgyKS4gKi8KICAgIGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfaW5kZXhbMF0gPSBzdWIoaW5kZXgsRVNGX0FESlVTVE1FTlRfVE9fUk1TX0lOREVYKTsKICAgIG1vdmUxNigpOwoKICAgIC8qIG9idGFpbiBkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2luZGV4ICovCiAgICBmb3IgKHJlZ2lvbj0xOyByZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKSAKICAgIHsKICAgICAgICBpbmRleCA9IDA7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgZG8gCiAgICAgICAgewogICAgICAgICAgICBnZXRfbmV4dF9iaXQoYml0b2JqKTsKICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICBpZiAoYml0b2JqLT5uZXh0X2JpdCA9PSAwKQogICAgICAgICAgICB7CgkgICAgICAgICAgICBpbmRleCA9IGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfZGVjb2Rlcl90cmVlW3JlZ2lvbl1baW5kZXhdWzBdOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CgkgICAgICAgICAgICBpbmRleCA9IGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfZGVjb2Rlcl90cmVlW3JlZ2lvbl1baW5kZXhdWzFdOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYml0b2JqLT5udW1iZXJfb2ZfYml0c19sZWZ0ID0gc3ViKGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdCwxKTsKICAgICAgICAgICAgdGVzdCgpOwogICAgICAgIH0gd2hpbGUgKGluZGV4ID4gMCk7CiAgICAgICAgCiAgICAgICAgZGlmZmVyZW50aWFsX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dID0gbmVnYXRlKGluZGV4KTsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KCiAgICAvKiBSZWNvbnN0cnVjdCBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbXSBmcm9tIGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfaW5kZXhbXS4gKi8KICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFswXSA9IGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfaW5kZXhbMF07CiAgICBtb3ZlMTYoKTsKICAgIGZvciAocmVnaW9uPTE7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspIAogICAgewogICAgICAgIGFjY2EgPSBMX2FkZChhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uLTFdLGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSk7CiAgICAgICAgYWNjYSA9IExfYWRkKGFjY2EsRFJQX0RJRkZfTUlOKTsKICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSA9IGV4dHJhY3RfbChhY2NhKTsgICAgICAgIAogICAgfQoKICAgIC8qIFJlY29uc3RydWN0IGRlY29kZXJfcmVnaW9uX3N0YW5kYXJkX2RldmlhdGlvbltdIGZyb20gYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W10uICovCiAgICAvKiBERUJVRyEhISEgLSBUaGlzIGludGVnZXIgbWV0aG9kIGpvaW50bHkgY29tcHV0ZXMgdGhlIG1hZ19zaGlmdAogICAgICAgYW5kIHRoZSBzdGFuZGFyZCBkZXZpYXRpb25zIGFscmVhZHkgbWFnX3NoaWZ0IGNvbXBlbnNhdGVkLiBJdAogICAgICAgcmVsaWVzIG9uIFJFR0lPTl9QT1dFUl9TVEVQU0laRV9EQiBiZWluZyBleGFjdGx5IDMuMDEwMjk5OTU3IGRiCiAgICAgICBvciBhIHNxdWFyZSByb290IG9mIDIgY2huYWdlIGluIHN0YW5kYXJkIGRldmlhdGlvbi4gSWYKICAgICAgIFJFR0lPTl9QT1dFUl9TVEVQU0laRV9EQiBjaGFuZ2VzLCB0aGlzIHNvZnR3YXJlIG11c3QgYmUKICAgICAgIHJld29ya2VkLiAqLwoKICAgIHRlbXAgPSAwOwogICAgbW92ZTE2KCk7CiAgICBtYXhfaW5kZXggPSAwOwogICAgbW92ZTE2KCk7CiAgICBmb3IgKHJlZ2lvbj0wOyByZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKSAKICAgIHsKICAgICAgICBhY2NhID0gTF9hZGQoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sUkVHSU9OX1BPV0VSX1RBQkxFX05VTV9ORUdBVElWRVMpOwogICAgICAgIGkgPSBleHRyYWN0X2woYWNjYSk7CiAgICAgICAgCiAgICAgICAgdGVtcDEgPSBzdWIoaSxtYXhfaW5kZXgpOwogICAgICAgIHRlc3QoKTsKICAgICAgICBpZiAodGVtcDEgPiAwKSAKICAgICAgICB7CiAgICAgICAgICAgIG1heF9pbmRleCA9IGk7CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgIH0KICAgICAgICB0ZW1wID0gYWRkKHRlbXAsaW50X3JlZ2lvbl9zdGFuZGFyZF9kZXZpYXRpb25fdGFibGVbaV0pOwogICAgfQogICAgaSA9IDk7CiAgICBtb3ZlMTYoKTsKCiAgICB0ZW1wMSA9IHN1Yih0ZW1wLDgpOwogICAgdGVtcDIgPSBzdWIobWF4X2luZGV4LDI4KTsKICAgIHRlc3QoKTsKICAgIHRlc3QoKTsKICAgIGxvZ2ljMTYoKTsKICAgIHRlc3QoKTsKICAgIGxvZ2ljMTYoKTsKICAgIHdoaWxlICgoaSA+PSAwKSAmJiAoKHRlbXAxID49IDApIHx8ICh0ZW1wMiA+IDApKSkgCiAgICB7CiAgICAgICAgaSA9IHN1YihpLDEpOwogICAgICAgIHRlbXAgPSBzaHJfbm9jaGVjayh0ZW1wLDEpOwogICAgICAgIG1heF9pbmRleCA9IHN1YihtYXhfaW5kZXgsMik7CiAgICAgICAgdGVtcDEgPSBzdWIodGVtcCw4KTsKICAgICAgICB0ZW1wMiA9IHN1YihtYXhfaW5kZXgsMjgpOwogICAgICAgIHRlc3QoKTsKICAgICAgICB0ZXN0KCk7CiAgICAgICAgbG9naWMxNigpOwogICAgICAgIHRlc3QoKTsKICAgICAgICBsb2dpYzE2KCk7CiAgICB9CiAgICAKICAgICpwX21hZ19zaGlmdCA9IGk7CiAgICBtb3ZlMTYoKTsKICAgIAogICAgLyogcG9pbnRlciBhcml0aG1ldGljICovCiAgICB0ZW1wID0gKFdvcmQxNiApKFJFR0lPTl9QT1dFUl9UQUJMRV9OVU1fTkVHQVRJVkVTICsgKCpwX21hZ19zaGlmdCAqIDIpKTsKICAgIAogICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykgCiAgICB7CiAgICAgICAgYWNjYSA9IExfYWRkKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dLHRlbXApOwogICAgICAgIGkgPSBleHRyYWN0X2woYWNjYSk7CiAgICAgICAgZGVjb2Rlcl9yZWdpb25fc3RhbmRhcmRfZGV2aWF0aW9uW3JlZ2lvbl0gPSBpbnRfcmVnaW9uX3N0YW5kYXJkX2RldmlhdGlvbl90YWJsZVtpXTsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiAgICAgcmF0ZV9hZGp1c3RfY2F0ZWdvcmllcwoKIFN5bnRheDogICAgICAgdm9pZCByYXRlX2FkanVzdF9jYXRlZ29yaWVzKFdvcmQxNiBjYXRlZ29yaXphdGlvbl9jb250cm9sLCAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXMsICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmRlY29kZXJfY2F0ZWdvcnlfYmFsYW5jZXMpICAgICAgICAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIGlucHV0czogICAgV29yZDE2IGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpkZWNvZGVyX2NhdGVnb3J5X2JhbGFuY2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIG91dHB1dHM6ICAgV29yZDE2IGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXMsCiAKIERlc2NyaXB0aW9uOiAgQWRqdXN0IHRoZSBwb3dlciBjYXRlZ29yaWVzIGJhc2VkIG9uIHRoZSBjYXRlZ29yaXphdGlvbiBjb250cm9sCgogRGVzaWduIE5vdGVzOgogCiBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMC4wMCAgICAgIHwgICAgMC4wMAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKICAgICAgICAgICAgTUFYICB8ICAgIDAuMDAgICAgICB8ICAgIDAuMDAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKCQkJCQogICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0ICAgICAgfCAgICAgNDhrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMC4wMCAgICAgIHwgICAgMC4wMCAgICAgICAgfCAgICAgMC4wMCAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgTUFYICB8ICAgIDAuMDEgICAgICB8ICAgIDAuMDEgICAgICAgIHwgICAgIDAuMDEgICAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCgkJCQkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHJhdGVfYWRqdXN0X2NhdGVnb3JpZXMoV29yZDE2IGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsCgkJCSAgICAgICAgICAgICAgICBXb3JkMTYgKmRlY29kZXJfcG93ZXJfY2F0ZWdvcmllcywKCQkJICAgICAgICAgICAgICAgIFdvcmQxNiAqZGVjb2Rlcl9jYXRlZ29yeV9iYWxhbmNlcykKewogICAgV29yZDE2IGk7CiAgICBXb3JkMTYgcmVnaW9uOwogICAgCiAgICBpID0gMDsKICAgIG1vdmUxNigpOwoKICAgIHRlc3QoKTsKICAgIHdoaWxlIChjYXRlZ29yaXphdGlvbl9jb250cm9sID4gMCkgCiAgICB7CiAgICAgICAgcmVnaW9uID0gZGVjb2Rlcl9jYXRlZ29yeV9iYWxhbmNlc1tpKytdOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIGRlY29kZXJfcG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dID0gYWRkKGRlY29kZXJfcG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dLDEpOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIGNhdGVnb3JpemF0aW9uX2NvbnRyb2wgPSBzdWIoY2F0ZWdvcml6YXRpb25fY29udHJvbCwxKTsKICAgIH0KCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiAgICBkZWNvZGVfdmVjdG9yX3F1YW50aXplZF9tbHRfaW5kaWNlcwoKIFN5bnRheDogICAgICB2b2lkIGRlY29kZV92ZWN0b3JfcXVhbnRpemVkX21sdF9pbmRpY2VzKEJpdF9PYmogICpiaXRvYmosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmRfT2JqICpyYW5kb2JqLCAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgbnVtYmVyX29mX3JlZ2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAqZGVjb2Rlcl9yZWdpb25fc3RhbmRhcmRfZGV2aWF0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICpkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXMsICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgKmRlY29kZXJfbWx0X2NvZWZzKSAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgaW5wdXRzOiAgICBCaXRfT2JqICAqYml0b2JqICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBSYW5kX09iaiAqcmFuZG9iagogICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgbnVtYmVyX29mX3JlZ2lvbnMKICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICpkZWNvZGVyX3JlZ2lvbl9zdGFuZGFyZF9kZXZpYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICpkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXMKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAgIG91dHB1dHM6ICAgV29yZDE2ICAgKmRlY29kZXJfbWx0X2NvZWZzCiAgICAgICAgICAgICAKCiBEZXNjcmlwdGlvbjogRGVjb2RlIE1MVCBjb2VmZmljaWVudHMKCiBEZXNpZ24gTm90ZXM6CiAKIFdNT1BTOiAgICAgN2tIeiB8ICAgIDI0a2JpdCAgICB8ICAgIDMya2JpdAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAwLjYwICAgICAgfCAgICAwLjcyCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAogICAgICAgICAgICBNQVggIHwgICAgMC42NyAgICAgIHwgICAgMC43NgogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAoJCQkJCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQgICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAwLjc3ICAgICAgfCAgICAwLjk4ICAgICAgICB8ICAgICAxLjI4ICAgCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBNQVggIHwgICAgMS4wNSAgICAgIHwgICAgMS4xOCAgICAgICAgfCAgICAgMS4zNiAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KCQkJCQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgZGVjb2RlX3ZlY3Rvcl9xdWFudGl6ZWRfbWx0X2luZGljZXMoQml0X09iaiAgKmJpdG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5kX09iaiAqcmFuZG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICBudW1iZXJfb2ZfcmVnaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAqZGVjb2Rlcl9yZWdpb25fc3RhbmRhcmRfZGV2aWF0aW9uLAoJCQkJCSAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICpkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXMsCgkJCQkJICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgKmRlY29kZXJfbWx0X2NvZWZzKQp7CiAgICBXb3JkMTYgc3RhbmRhcmRfZGV2aWF0aW9uOwogICAgV29yZDE2ICpkZWNvZGVyX21sdF9wdHI7CiAgICBXb3JkMTYgZGVjb2Rlcl9tbHRfdmFsdWU7CiAgICBXb3JkMTYgbm9pZmlsbHBvczsKICAgIFdvcmQxNiBub2lmaWxsbmVnOwogICAgV29yZDE2IG5vaXNlX2ZpbGxfZmFjdG9yWzNdID0gezU3OTMsODE5MiwyMzE3MH07CiAgICBXb3JkMTYgcmVnaW9uOwogICAgV29yZDE2IGNhdGVnb3J5OwogICAgV29yZDE2IGosbjsKICAgIFdvcmQxNiBrW01BWF9WRUNUT1JfRElNRU5TSU9OXTsKICAgIFdvcmQxNiB2ZWNfZGltOwogICAgV29yZDE2IG51bV92ZWNzOwogICAgV29yZDE2IGluZGV4OwogICAgV29yZDE2IGJpdD0wOwogICAgV29yZDE2IHNpZ25zX2luZGV4PTA7CiAgICBXb3JkMTYgbnVtX3NpZ25fYml0czsKICAgIFdvcmQxNiByYW5fb3V0X29mX2JpdHNfZmxhZzsKICAgIFdvcmQxNiAqZGVjb2Rlcl90YWJsZV9wdHI7CiAgICBXb3JkMTYgcmFuZG9tX3dvcmQ7CiAgICAKICAgIFdvcmQxNiB0ZW1wMTsKICAgIFdvcmQxNiB0ZW1wOwogICAgV29yZDMyIGFjY2E7CgogICAgcmFuX291dF9vZl9iaXRzX2ZsYWcgPSAwOwogICAgbW92ZTE2KCk7CgogICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykgCiAgICB7CiAgICAgICAgY2F0ZWdvcnkgPSAoV29yZDE2KWRlY29kZXJfcG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIGFjY2EgPSBMX211bHQwKHJlZ2lvbixSRUdJT05fU0laRSk7CiAgICAgICAgaW5kZXggPSBleHRyYWN0X2woYWNjYSk7CiAgICAgICAgZGVjb2Rlcl9tbHRfcHRyID0gJmRlY29kZXJfbWx0X2NvZWZzW2luZGV4XTsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICBzdGFuZGFyZF9kZXZpYXRpb24gPSBkZWNvZGVyX3JlZ2lvbl9zdGFuZGFyZF9kZXZpYXRpb25bcmVnaW9uXTsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAKICAgICAgICB0ZW1wID0gc3ViKGNhdGVnb3J5LDcpOwogICAgICAgIHRlc3QoKTsKICAgICAgICBpZiAodGVtcCA8IDApCiAgICAgICAgewogICAgICAgICAgICAvKiBHZXQgdGhlIHByb3BlciB0YWJsZSBvZiBkZWNvZGVyIHRhYmxlcywgdmVjX2RpbSwgYW5kIG51bV92ZWNzIGZvciB0aGUgY2F0ICovCiAgICAgICAgICAgIGRlY29kZXJfdGFibGVfcHRyID0gKFdvcmQxNiAqKSB0YWJsZV9vZl9kZWNvZGVyX3RhYmxlc1tjYXRlZ29yeV07CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICB2ZWNfZGltID0gdmVjdG9yX2RpbWVuc2lvbltjYXRlZ29yeV07CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICBudW1fdmVjcyA9IG51bWJlcl9vZl92ZWN0b3JzW2NhdGVnb3J5XTsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKG49MDsgbjxudW1fdmVjczsgbisrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW5kZXggPSAwOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8qIGdldCBpbmRleCAqLwogICAgICAgICAgICAgICAgZG8gCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQgPD0gMCkgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByYW5fb3V0X29mX2JpdHNfZmxhZyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgCSAgICAgICAgICAgICAgICBicmVhazsKICAgIAkgICAgICAgICAgICB9CiAgICAKICAgIAkgICAgICAgICAgICBnZXRfbmV4dF9iaXQoYml0b2JqKTsKCSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpdG9iai0+bmV4dF9iaXQgPT0gMCkKCSAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBzaGxfbm9jaGVjayhpbmRleCwxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAoV29yZDE2KSooZGVjb2Rlcl90YWJsZV9wdHIgKyB0ZW1wKTsKICAgICAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIGVsc2UKCSAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBzaGxfbm9jaGVjayhpbmRleCwxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAoV29yZDE2KSooZGVjb2Rlcl90YWJsZV9wdHIgKyB0ZW1wICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQgPSBzdWIoYml0b2JqLT5udW1iZXJfb2ZfYml0c19sZWZ0LDEpOwogICAgICAgICAgICAgICAgICAgIHRlc3QoKTsKCSAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfSB3aGlsZSAoaW5kZXggPiAwKTsKCSAgCiAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICBpZiAocmFuX291dF9vZl9iaXRzX2ZsYWcgIT0gMCkKCSAgICAgICAgICAgICAgICBicmVhazsKCSAgCiAgICAgICAgICAgICAgICBpbmRleCA9IG5lZ2F0ZShpbmRleCk7CgkgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgaW5kZXggaW50byBhcnJheSB1c2VkIHRvIGFjY2VzcyB0aGUgY2VudHJvaWQgdGFibGUgKi8KICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgbnVtYmVyIG9mIHNpZ24gYml0cyBpbiB0aGUgaW5kZXggKi8KICAgICAgICAgICAgICAgIG51bV9zaWduX2JpdHMgPSBpbmRleF90b19hcnJheShpbmRleCxrLGNhdGVnb3J5KTsKCgkgICAgICAgICAgICB0ZW1wID0gc3ViKGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdCxudW1fc2lnbl9iaXRzKTsKICAgICAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wID49IDApIAogICAgICAgICAgICAgICAgewoKCSAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bV9zaWduX2JpdHMgIT0gMCkgCiAgICAgICAgICAgICAgICAgICAgewoJICAgICAgICAgICAgICAgICAgICBzaWduc19pbmRleCA9IDA7CgkgICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajxudW1fc2lnbl9iaXRzOyBqKyspIAogICAgICAgICAgICAgICAgICAgICAgICB7CgkJICAgICAgICAgICAgICAgICAgICBnZXRfbmV4dF9iaXQoYml0b2JqKTsKICAgICAgIAkJICAgICAgICAgICAgICAgIHNpZ25zX2luZGV4ID0gc2hsX25vY2hlY2soc2lnbnNfaW5kZXgsMSk7CgkJICAgICAgICAgICAgICAgICAgICBzaWduc19pbmRleCA9IGFkZChzaWduc19pbmRleCxiaXRvYmotPm5leHRfYml0KTsKCQkgICAgICAgICAgICAgICAgICAgIGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdCA9IHN1YihiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQsMSk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHN1YihudW1fc2lnbl9iaXRzLDEpOwogICAgICAgICAgICAgICAgICAgICAgICBiaXQgPSBzaGxfbm9jaGVjaygxLCh0ZW1wKSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPHZlY19kaW07IGorKykgCiAgICAgICAgICAgICAgICAgICAgewoJICAgICAgICAgICAgICAgICAgICBhY2NhID0gTF9tdWx0MChzdGFuZGFyZF9kZXZpYXRpb24sbWx0X3F1YW50X2NlbnRyb2lkW2NhdGVnb3J5XVtrW2pdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2EgPSBMX3Nocl9ub2NoZWNrKGFjY2EsMTIpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX21sdF92YWx1ZSA9IGV4dHJhY3RfbChhY2NhKTsKCSAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJfbWx0X3ZhbHVlICE9IDApIAogICAgICAgICAgICAgICAgICAgICAgICB7CgkJICAgICAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNpZ25zX2luZGV4ICYgYml0KSA9PSAwKQoJCSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJfbWx0X3ZhbHVlID0gbmVnYXRlKGRlY29kZXJfbWx0X3ZhbHVlKTsKCQkgICAgICAgICAgICAgICAgICAgIGJpdCA9IHNocl9ub2NoZWNrKGJpdCwxKTsKCSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAqZGVjb2Rlcl9tbHRfcHRyKysgPSBkZWNvZGVyX21sdF92YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgIHsKCSAgICAgICAgICAgICAgICByYW5fb3V0X29mX2JpdHNfZmxhZyA9IDE7CiAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CgkgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KICAgICAgICAgICAgLyogSWYgcmFuIG91dCBvZiBiaXRzIGR1cmluZyBkZWNvZGluZyBkbyBub2lzZSBmaWxsIGZvciByZW1haW5pbmcgcmVnaW9ucy4gKi8KICAgICAgICAgICAgLyogREVCVUchISAtIEZvciBub3cgYWxzbyByZWRvIGFsbCBvZiBsYXN0IHJlZ2lvbiB3aXRoIGFsbCBub2lzZSBmaWxsLiAqLwogICAgICAgIAl0ZXN0KCk7CiAgICAgICAgICAgIGlmIChyYW5fb3V0X29mX2JpdHNfZmxhZyAhPSAwKSAKICAgICAgICAgICAgewogICAgICAgIAkgICAgdGVtcCA9IGFkZChyZWdpb24sMSk7CiAgICAgICAgICAgICAgICBmb3IgKGo9dGVtcDsgajxudW1iZXJfb2ZfcmVnaW9uczsgaisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlY29kZXJfcG93ZXJfY2F0ZWdvcmllc1tqXSA9IDc7CiAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgCSAgICBjYXRlZ29yeSA9IDc7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAJICAgIGRlY29kZXJfbWx0X3B0ciA9ICZkZWNvZGVyX21sdF9jb2Vmc1tyZWdpb24qUkVHSU9OX1NJWkVdOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgCX0KICAgICAgICB9CgogICAgICAgIHRlbXAgPSBzdWIoY2F0ZWdvcnksNSk7CiAgICAgICAgdGVtcDEgPSBzdWIoY2F0ZWdvcnksNik7CiAgICAgICAgdGVzdCgpOwogICAgICAgIHRlc3QoKTsKICAgICAgICBsb2dpYzE2KCk7CiAgICAgICAgaWYgKCh0ZW1wID09IDApIHx8ICh0ZW1wMSA9PSAwKSkKICAgICAgICB7CiAKCSAgICAgICAgZGVjb2Rlcl9tbHRfcHRyID0gJmRlY29kZXJfbWx0X2NvZWZzW3JlZ2lvbipSRUdJT05fU0laRV07CgkgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICBub2lmaWxscG9zID0gbXVsdChzdGFuZGFyZF9kZXZpYXRpb24sbm9pc2VfZmlsbF9mYWN0b3JbY2F0ZWdvcnkgLSA1XSk7CiAgICAgICAgICAgIG5vaWZpbGxuZWcgPSBuZWdhdGUobm9pZmlsbHBvcyk7CgoJICAgICAgICByYW5kb21fd29yZCA9IGdldF9yYW5kKHJhbmRvYmopOwoKCSAgICAgICAgZm9yIChqPTA7IGo8MTA7IGorKykgCiAgICAgICAgICAgIHsKCSAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgICAgIGlmICgqZGVjb2Rlcl9tbHRfcHRyID09IDApIAogICAgICAgICAgICAgICAgewoJICAgICAgICAgICAgICAgIGxvZ2ljMTYoKTsKICAgICAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKChyYW5kb21fd29yZCAmIDEpID09IDApIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBub2lmaWxsbmVnOwogICAgICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBub2lmaWxscG9zOwogICAgICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgKmRlY29kZXJfbWx0X3B0ciA9IHRlbXAxOwogICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOwoJICAgICAgICAgICAgICAgIHJhbmRvbV93b3JkID0gc2hyX25vY2hlY2socmFuZG9tX3dvcmQsMSk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICAvKiBwb2ludGVyIGFyaXRobWV0aWMgKi8KICAgICAgICAgICAgICAgIGRlY29kZXJfbWx0X3B0cisrOwoJICAgICAgICB9CgkgICAgICAgIHJhbmRvbV93b3JkID0gZ2V0X3JhbmQocmFuZG9iaik7CgkgICAgICAgIGZvciAoaj0wOyBqPDEwOyBqKyspIAogICAgICAgICAgICB7CgkgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICBpZiAoKmRlY29kZXJfbWx0X3B0ciA9PSAwKSAKICAgICAgICAgICAgICAgIHsKCSAgICAgICAgICAgICAgICBsb2dpYzE2KCk7CiAgICAgICAgICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICAgICAgICAgIGlmICgocmFuZG9tX3dvcmQgJiAxKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gbm9pZmlsbG5lZzsKICAgICAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gbm9pZmlsbHBvczsKICAgICAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICpkZWNvZGVyX21sdF9wdHIgPSB0ZW1wMTsKICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKCSAgICAgICAgICAgICAgICByYW5kb21fd29yZCAgPSBzaHJfbm9jaGVjayhyYW5kb21fd29yZCwxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIC8qIHBvaW50ZXIgYXJpdGhtZXRpYyAqLwogICAgICAgICAgICAgICAgZGVjb2Rlcl9tbHRfcHRyKys7CgkgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIGlmIChjYXRlZ29yeSA9PSA3KSAqLwogICAgICAgIHRlbXAxID0gc3ViKGNhdGVnb3J5LDcpOwogICAgICAgIHRlc3QoKTsKICAgICAgICBpZiAodGVtcDEgPT0gMCkKICAgICAgICB7CgkgICAgICAgIGluZGV4ID0gc3ViKGNhdGVnb3J5LDUpOwogICAgICAgICAgICBub2lmaWxscG9zID0gbXVsdChzdGFuZGFyZF9kZXZpYXRpb24sbm9pc2VfZmlsbF9mYWN0b3JbaW5kZXhdKTsKCSAgICAgICAgbm9pZmlsbG5lZyA9IG5lZ2F0ZShub2lmaWxscG9zKTsKCiAgICAgICAgICAgIHJhbmRvbV93b3JkID0gZ2V0X3JhbmQocmFuZG9iaik7CiAgICAgICAgICAgIGZvciAoaj0wOyBqPDEwOyBqKyspIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsb2dpYzE2KCk7CiAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICBpZiAoKHJhbmRvbV93b3JkICYgMSkgPT0gMCkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBub2lmaWxsbmVnOwogICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRlbXAxID0gbm9pZmlsbHBvczsKICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICpkZWNvZGVyX21sdF9wdHIrKyA9IHRlbXAxOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICByYW5kb21fd29yZCA9IHNocl9ub2NoZWNrKHJhbmRvbV93b3JkLDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJhbmRvbV93b3JkID0gZ2V0X3JhbmQocmFuZG9iaik7CiAgICAgICAgICAgIGZvciAoaj0wOyBqPDEwOyBqKyspIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsb2dpYzE2KCk7CiAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICBpZiAoKHJhbmRvbV93b3JkICYgMSkgPT0gMCkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBub2lmaWxsbmVnOwogICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRlbXAxID0gbm9pZmlsbHBvczsKICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgKmRlY29kZXJfbWx0X3B0cisrID0gdGVtcDE7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIHJhbmRvbV93b3JkID0gc2hyX25vY2hlY2socmFuZG9tX3dvcmQsMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgdGVzdCgpOwogICAgaWYgKHJhbl9vdXRfb2ZfYml0c19mbGFnKQogICAgICAgIGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdCA9IHN1YihiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQsMSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiAgICBpbmRleF90b19hcnJheSAKCiBTeW50YXg6ICAgICAgbnVtYmVyX29mX25vbl96ZXJvID0gaW5kZXhfdG9fYXJyYXkoV29yZDE2IGluZGV4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYXJyYXlbTUFYX1ZFQ1RPUl9ESU1FTlNJT05dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjYXRlZ29yeSkKCiAgICAgICAgICAgICAgICBpbnB1dHM6ICBXb3JkMTYgaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgb3V0cHV0czogV29yZDE2IGFycmF5W01BWF9WRUNUT1JfRElNRU5TSU9OXSAtIHVzZWQgaW4gZGVjb2RlciB0byBhY2Nlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sdF9xdWFudF9jZW50cm9pZCB0YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2Zfbm9uX3plcm8gICAgICAgICAgLSBudW1iZXIgb2Ygbm9uIHplcm8gZWxlbWVudHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBhcnJheQogCiBEZXNjcmlwdGlvbjogQ29tcHV0ZXMgYW4gYXJyYXkgb2Ygc2lnbiBiaXRzIHdpdGggdGhlIGxlbmd0aCBvZiB0aGUgY2F0ZWdvcnkgdmVjdG9yCiAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNpZ24gYml0cyBhbmQgdGhlIGFycmF5CgogV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQVZHICB8ICAgICAwLjAwICAgICB8ICAgICAwLjAwCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAogICAgICAgICAgICBNQVggIHwgICAgIDAuMDAgICAgIHwgICAgIDAuMDAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQgICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAgMC4wMCAgICAgfCAgICAgMC4wMCAgICAgICB8ICAgICAgMC4wMCAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgTUFYICB8ICAgICAwLjAwICAgICB8ICAgICAwLjAwICAgICAgIHwgICAgICAwLjAwICAgCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KV29yZDE2IGluZGV4X3RvX2FycmF5KFdvcmQxNiBpbmRleCxXb3JkMTYgKmFycmF5LFdvcmQxNiBjYXRlZ29yeSkKewogICAgV29yZDE2IGoscSxwOwogICAgV29yZDE2IG51bWJlcl9vZl9ub25femVybzsKICAgIFdvcmQxNiBtYXhfYmluX3BsdXNfb25lOwogICAgV29yZDE2IGludmVyc2Vfb2ZfbWF4X2Jpbl9wbHVzX29uZTsKICAgIFdvcmQxNiB0ZW1wOwoKICAgIG51bWJlcl9vZl9ub25femVybyA9IDA7CiAgICBtb3ZlMTYoKTsKCiAgICBwID0gaW5kZXg7CiAgICBtb3ZlMTYoKTsKCiAgICBtYXhfYmluX3BsdXNfb25lID0gYWRkKG1heF9iaW5bY2F0ZWdvcnldLDEpOwogICAgaW52ZXJzZV9vZl9tYXhfYmluX3BsdXNfb25lID0gbWF4X2Jpbl9wbHVzX29uZV9pbnZlcnNlW2NhdGVnb3J5XTsKICAgIG1vdmUxNigpOwoKICAgIHRlbXAgPSBzdWIodmVjdG9yX2RpbWVuc2lvbltjYXRlZ29yeV0sMSk7CiAgICBmb3IgKGo9dGVtcDsgaj49MDsgai0tKSAKICAgIHsKICAgICAgICBxID0gbXVsdChwLGludmVyc2Vfb2ZfbWF4X2Jpbl9wbHVzX29uZSk7CgkJdGVtcCA9IGV4dHJhY3RfbChMX211bHQwKHEsbWF4X2Jpbl9wbHVzX29uZSkpOwogICAgICAgIGFycmF5W2pdID0gc3ViKHAsdGVtcCk7CiAgICAgICAgbW92ZTE2KCk7CgogICAgICAgIHAgPSBxOwogICAgICAgIG1vdmUxNigpOwoKICAgICAgICB0ZW1wID0gYXJyYXlbal07CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmICh0ZW1wICE9IDApIAogICAgICAgICAgICBudW1iZXJfb2Zfbm9uX3plcm8gPSBhZGQobnVtYmVyX29mX25vbl96ZXJvLDEpOwogICAgfQogICAgcmV0dXJuKG51bWJlcl9vZl9ub25femVybyk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb246ICAgICB0ZXN0XzRfZnJhbWVfZXJyb3JzCgogU3ludGF4OiAgICAgICB2b2lkIHRlc3RfNF9mcmFtZV9lcnJvcnMoQml0X09iaiAqYml0b2JqLCAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9yZWdpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmZyYW1lX2Vycm9yX2ZsYWcsICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgpICAgIAogICAgICAgIAogICAgICAgICAgICAgICBpbnB1dHM6ICAgYml0X29iagogICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMKICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2Vycm9yX2ZsYWcKICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3JpemF0aW9uX2NvbnRyb2wKICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleAogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIG91dHB1dHM6ICBmcmFtZV9lcnJvcl9mbGFnCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgCiAgICAgICAgCiBEZXNjcmlwdGlvbjogIFRlc3RzIGZvciBlcnJvciBjb25kaXRpb25zIGFuZCBzZXRzIHRoZSBmcmFtZV9lcnJvcl9mbGFnIGFjY29yZGluZ2x5IAoKIERlc2lnbiBOb3RlczoKIAogV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQVZHICB8ICAgIDAuMDEgICAgICB8ICAgICAwLjAxCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAogICAgICAgICAgICBNQVggIHwgICAgMC4wNCAgICAgIHwgICAgIDAuMDgKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKCQkJCQogICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0ICAgICAgfCAgICAgNDhrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMC4wMSAgICAgIHwgICAgIDAuMDEgICAgICAgfCAgICAgIDAuMDEgICAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIE1BWCAgfCAgICAwLjAyICAgICAgfCAgICAgMC4wNiAgICAgICB8ICAgICAgMC4wOCAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KCQkJCQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgdGVzdF80X2ZyYW1lX2Vycm9ycyhCaXRfT2JqICpiaXRvYmosCiAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqZnJhbWVfZXJyb3JfZmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjYXRlZ29yaXphdGlvbl9jb250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgpCnsKICAgIFdvcmQxNiByZWdpb247CiAgICBXb3JkMTYgaTsKICAgIFdvcmQxNiB0ZW1wOwogICAgV29yZDMyIGFjY2E7CiAgICBXb3JkMzIgYWNjYjsKICAgIAogICAgLyogVGVzdCBmb3IgYml0IHN0cmVhbSBlcnJvcnMuICovCgogICAgdGVzdCgpOwogICAgaWYgKGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdCA+IDApIAogICAgewogICAgICAgIGZvciAoaT0wOyBpPGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdDsgaSsrKSAKICAgICAgICB7CiAgICAgICAgICAgIGdldF9uZXh0X2JpdChiaXRvYmopOwogICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgIGlmIChiaXRvYmotPm5leHRfYml0ID09IDApIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAqZnJhbWVfZXJyb3JfZmxhZyA9IDE7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgfQogICAgICAgIH0JCiAgICB9CiAgICBlbHNlIAogICAgewogICAgICAgIHRlbXAgPSBzdWIoY2F0ZWdvcml6YXRpb25fY29udHJvbCxzdWIobnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywxKSk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmICh0ZW1wIDwgMCkgCiAgICAgICAgewogICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgIGlmIChiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQgPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAqZnJhbWVfZXJyb3JfZmxhZyB8PSAyOwogICAgICAgICAgICAgICAgbG9naWMxNigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIGNoZWNrcyB0byBlbnN1cmUgdGhhdCBhYnNfcmVnaW9uX3Bvd2VyX2luZGV4IGlzIHdpdGhpbiByYW5nZSAqLwogICAgLyogdGhlIGVycm9yIGZsYWcgaXMgc2V0IGlmIGl0IGlzIG91dCBvZiByYW5nZSAqLwogICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykgCiAgICB7CiAgICAgICAgLyogIHRoZSBuZXh0IHR3byBsaW5lcyBvZiBjb21tZW50cyB3ZXJlIG1vZGlmaWVkIGluIHJlbGVhc2UgMS4yCgkgICAqICB0byBjb3JyZWN0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmFuZ2Ugb2YgCgkgICAqICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbXSB0byBiZSB0ZXN0ZWQgaW4gdGhlIG5leHQKCSAgICogIDkgbGluZXMgb2YgY29kZS4KCSAgICovCgkgIC8qICBpZiAoKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dID4gMzEpIHx8CiAgICAgICAgICAgIChhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSA8IC04KSAqLwoKICAgICAgICBhY2NhID0gTF9hZGQoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sRVNGX0FESlVTVE1FTlRfVE9fUk1TX0lOREVYKTsKICAgICAgICBhY2NiID0gTF9zdWIoYWNjYSwzMSk7CiAgICAgICAgYWNjYSA9IExfYWRkKGFjY2EsOCk7CiAgICAgICAgdGVzdCgpOwoKICAgICAgICAvKiB0aGUgbmV4dCBsaW5lIHdhcyBtb2RpZmVkIGluIHJlbGVhc2UgMS4yIHRvCgkgICAqIGNvcnJlY3QgbWlzcyB0eXBlZCBjb2RlIGFuZCBlcnJvciBjaGVja2luZy4KCSAgICovCiAgICAgICAgaWYgKChhY2NiID4gMCkgfHwgKGFjY2EgPCAwKSkKICAgICAgICB7CiAgICAgICAgICAgICpmcmFtZV9lcnJvcl9mbGFnIHw9IDQ7CiAgICAgICAgICAgIGxvZ2ljMTYoKTsKICAgICAgICB9CiAgICB9Cgp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiAgICBlcnJvcl9oYW5kbGluZwoKIFN5bnRheDogICAgICB2b2lkIGVycm9yX2hhbmRsaW5nKFdvcmQxNiBudW1iZXJfb2ZfY29lZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3ZhbGlkX2NvZWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpmcmFtZV9lcnJvcl9mbGFnLCAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmRlY29kZXJfbWx0X2NvZWZzLCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqb2xkX2RlY29kZXJfbWx0X2NvZWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwX21hZ19zaGlmdCwgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBfb2xkX21hZ19zaGlmdCkgICAgICAKICAgICAgICAgICAgICAKICAgICAgICAgICAgICBpbnB1dHM6ICBudW1iZXJfb2ZfY29lZnMKICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfdmFsaWRfY29lZnMKICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9lcnJvcl9mbGFnCiAgICAgICAgICAgICAgICAgICAgICAgb2xkX2RlY29kZXJfbWx0X2NvZWZzCiAgICAgICAgICAgICAgICAgICAgICAgcF9vbGRfbWFnX3NoaWZ0CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgb3V0cHV0czogZGVjb2Rlcl9tbHRfY29lZnMKICAgICAgICAgICAgICAgICAgICAgICBvbGRfZGVjb2Rlcl9tbHRfY29lZnMKICAgICAgICAgICAgICAgICAgICAgICBwX21hZ19zaGlmdAogICAgICAgICAgICAgICAgICAgICAgIHBfb2xkX21hZ19zaGlmdAogCiAgICAgICAKCiBEZXNjcmlwdGlvbjogSWYgYm90aCB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgZnJhbWVzIGFyZSBlcnJvcmVkLCAgICAgICAgICAgICAKICAgICAgICAgICAgICBzZXQgdGhlIG1sdCBjb2VmZmljaWVudHMgdG8gMC4gSWYgb25seSB0aGUgY3VycmVudCBmcmFtZSAgICAgICAgIAogICAgICAgICAgICAgIGlzIGVycm9yZWQsIHRoZW4gcmVwZWF0IHRoZSBwcmV2aW91cyBmcmFtZSdzIG1sdCBjb2VmZmljaWVudHMuICAgCiAgICAKIERlc2lnbiBOb3RlczoKIAogV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQVZHICB8ICAgIDAuMDIgICAgICB8ICAgICAwLjAyCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAogICAgICAgICAgICBNQVggIHwgICAgMC4wMyAgICAgIHwgICAgIDAuMDMKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKCQkJCQogICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0ICAgICAgfCAgICAgNDhrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMC4wMyAgICAgIHwgICAgIDAuMDMgICAgICAgfCAgICAgMC4wMyAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgTUFYICB8ICAgIDAuMDMgICAgICB8ICAgICAwLjAzICAgICAgIHwgICAgIDAuMDYgICAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCgkJCQkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIGVycm9yX2hhbmRsaW5nKFdvcmQxNiBudW1iZXJfb2ZfY29lZnMsCiAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl92YWxpZF9jb2VmcywKICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmZyYW1lX2Vycm9yX2ZsYWcsCiAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpkZWNvZGVyX21sdF9jb2VmcywKICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm9sZF9kZWNvZGVyX21sdF9jb2VmcywKICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBfbWFnX3NoaWZ0LAogICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcF9vbGRfbWFnX3NoaWZ0KQp7CiAgICBXb3JkMTYgaTsKCiAgICB0ZXN0KCk7CiAgICBpZiAoKmZyYW1lX2Vycm9yX2ZsYWcgIT0gMCkgCiAgICB7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2ZfdmFsaWRfY29lZnM7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGRlY29kZXJfbWx0X2NvZWZzW2ldID0gb2xkX2RlY29kZXJfbWx0X2NvZWZzW2ldOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2ZfdmFsaWRfY29lZnM7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIG9sZF9kZWNvZGVyX21sdF9jb2Vmc1tpXSA9IDA7CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAqcF9tYWdfc2hpZnQgPSAqcF9vbGRfbWFnX3NoaWZ0OwogICAgICAgIG1vdmUxNigpOwoKICAgICAgICAqcF9vbGRfbWFnX3NoaWZ0ID0gMDsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgICAgLyogU3RvcmUgaW4gY2FzZSBuZXh0IGZyYW1lIGlzIGVycm9yZWQuICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl92YWxpZF9jb2VmczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgb2xkX2RlY29kZXJfbWx0X2NvZWZzW2ldID0gZGVjb2Rlcl9tbHRfY29lZnNbaV07CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgIH0KICAKICAgICAgICAqcF9vbGRfbWFnX3NoaWZ0ID0gKnBfbWFnX3NoaWZ0OwogICAgICAgIG1vdmUxNigpOwogICAgfQoKCiAgICAvKiBaZXJvIG91dCB0aGUgdXBwZXIgMS84IG9mIHRoZSBzcGVjdHJ1bS4gKi8KICAgIGZvciAoaSA9IG51bWJlcl9vZl92YWxpZF9jb2VmczsgaSA8IG51bWJlcl9vZl9jb2VmczsgaSsrKQogICAgewogICAgICAgIGRlY29kZXJfbWx0X2NvZWZzW2ldID0gMDsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KCn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiAgICBnZXRfbmV4dF9iaXQKCiBTeW50YXg6ICAgICAgdm9pZCBnZXRfbmV4dF9iaXQoQml0X09iaiAqYml0b2JqKQogCiBEZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgbmV4dCBiaXQgaW4gdGhlIGN1cnJlbnQgd29yZCBpbnNpZGUgdGhlIGJpdCBvYmplY3QKIAogV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQVZHICB8ICAgIDAuMDAgICAgICB8ICAgIDAuMDAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgICAgICAgIE1BWCAgfCAgICAwLjAwICAgICAgfCAgICAwLjAwCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCgogICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0ICAgICAgfCAgICAgNDhrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMC4wMCAgICAgIHwgICAgMC4wMCAgICAgICAgfCAgICAgMC4wMCAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgTUFYICB8ICAgIDAuMDAgICAgICB8ICAgIDAuMDAgICAgICAgIHwgICAgIDAuMDAgICAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIGdldF9uZXh0X2JpdChCaXRfT2JqICpiaXRvYmopCnsKICAgIFdvcmQxNiB0ZW1wOwoKICAgIHRlc3QoKTsKICAgIGlmIChiaXRvYmotPmNvZGVfYml0X2NvdW50ID09IDApCiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgYml0b2JqLT5jdXJyZW50X3dvcmQgPSAqYml0b2JqLT5jb2RlX3dvcmRfcHRyKys7IAogICAgICAgIG1vdmUxNigpOwogICAgICAgIGJpdG9iai0+Y29kZV9iaXRfY291bnQgPSAxNjsgICAgICAgICAgIAogICAgICAgIG1vdmUxNigpOwogICAgfQogICAgYml0b2JqLT5jb2RlX2JpdF9jb3VudCA9IHN1YihiaXRvYmotPmNvZGVfYml0X2NvdW50LDEpOwogICAgdGVtcCA9IHNocl9ub2NoZWNrKGJpdG9iai0+Y3VycmVudF93b3JkLGJpdG9iai0+Y29kZV9iaXRfY291bnQpOwogICAgbG9naWMxNigpOwogICAgYml0b2JqLT5uZXh0X2JpdCA9IChXb3JkMTYgKSh0ZW1wICYgMSk7Cgp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbjogICAgZ2V0X3JhbmQKCiBTeW50YXg6ICAgICAgV29yZDE2IGdldF9yYW5kKFJhbmRfT2JqICpyYW5kb2JqKQogCiBEZXNjcmlwdGlvbjogUmV0dXJucyBhIHJhbmRvbSBXb3JkMTYgYmFzZWQgb24gdGhlIHNlZWRzIGluc2lkZSB0aGUgcmFuZCBvYmplY3QgIAogCiBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMC4wMCAgICAgIHwgICAgMC4wMAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKICAgICAgICAgICAgTUFYICB8ICAgIDAuMDAgICAgICB8ICAgIDAuMDAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQgICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAwLjAwICAgICAgfCAgICAwLjAwICAgICAgICB8ICAgICAwLjAwICAgCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBNQVggIHwgICAgMC4wMCAgICAgIHwgICAgMC4wMCAgICAgICAgfCAgICAgMC4wMCAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCldvcmQxNiBnZXRfcmFuZChSYW5kX09iaiAqcmFuZG9iaikKewogICAgV29yZDE2IHJhbmRvbV93b3JkOwogICAgV29yZDMyIGFjY2E7CgogICAgYWNjYSA9IExfYWRkKHJhbmRvYmotPnNlZWQwLHJhbmRvYmotPnNlZWQzKTsgCiAgICByYW5kb21fd29yZCA9IGV4dHJhY3RfbChhY2NhKTsKICAgIAogICAgbG9naWMxNigpOwogICAgdGVzdCgpOwoJaWYgKChyYW5kb21fd29yZCAmIDMyNzY4TCkgIT0gMCkKICAgICAgICByYW5kb21fd29yZCA9IGFkZChyYW5kb21fd29yZCwxKTsKICAgIAogICAgcmFuZG9iai0+c2VlZDMgPSByYW5kb2JqLT5zZWVkMjsKICAgIG1vdmUxNigpOwogICAgcmFuZG9iai0+c2VlZDIgPSByYW5kb2JqLT5zZWVkMTsKICAgIG1vdmUxNigpOwogICAgcmFuZG9iai0+c2VlZDEgPSByYW5kb2JqLT5zZWVkMDsKICAgIG1vdmUxNigpOwogICAgcmFuZG9iai0+c2VlZDAgPSByYW5kb21fd29yZDsKICAgIG1vdmUxNigpOwoKICAgIHJldHVybihyYW5kb21fd29yZCk7Cn0K