LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKgoqKiAgIElUVS1UIEcuNzIyLjEgKDIwMDUtMDUpIC0gRml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gZm9yIG1haW4gYm9keSBhbmQgQW5uZXggQwoqKiAgID4gU29mdHdhcmUgUmVsZWFzZSAyLjEgKDIwMDgtMDYpCioqICAgICAoU2ltcGxlIHJlcGFja2FnaW5nOyBubyBjaGFuZ2UgZnJvbSAyMDA1LTA1IFJlbGVhc2UgMi4wIGNvZGUpCioqCioqICAgqSAyMDA0IFBvbHljb20sIEluYy4KKioKKioJIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBGaWxlbmFtZTogc2FtcGxlc190b19ybWx0X2NvZWZzLmMKKgoqIFB1cnBvc2U6ICBDb252ZXJ0IFNhbXBsZXMgdG8gUmV2ZXJzZWQgTUxUIChNb2R1bGF0ZWQgTGFwcGVkIFRyYW5zZm9ybSkgCiogICAgICAgICAgIENvZWZmaWNpZW50cwoqCiogICAgIFRoZSAiUmV2ZXJzZWQgTUxUIiBpcyBhbiBvdmVybGFwcGVkIGJsb2NrIHRyYW5zZm9ybSB3aGljaCB1c2VzCiogICAgIGV2ZW4gc3ltbWV0cnkgKiBvbiB0aGUgbGVmdCwgb2RkIHN5bW1ldHJ5IG9uIHRoZSByaWdodCBhbmQgYQoqICAgICBUeXBlIElWIERDVCBhcyB0aGUgYmxvY2sgdHJhbnNmb3JtLiAgKiBJdCBpcyB0aHVzIHNpbWlsYXIgdG8gYQoqICAgICBNTFQgd2hpY2ggdXNlcyBvZGQgc3ltbWV0cnkgb24gdGhlIGxlZnQsIGV2ZW4gc3ltbWV0cnkgKiBvbiB0aGUKKiAgICAgcmlnaHQgYW5kIGEgVHlwZSBJViBEU1QgYXMgdGhlIGJsb2NrIHRyYW5zZm9ybS4gIEluIGZhY3QsIGl0IGlzCiogICAgIGVxdWl2YWxlbnQgKiB0byByZXZlcnNpbmcgdGhlIG9yZGVyIG9mIHRoZSBzYW1wbGVzLCBwZXJmb3JtaW5nCiogICAgIGFuIE1MVCBhbmQgdGhlbiBuZWdhdGluZyBhbGwgKiB0aGUgZXZlbi1udW1iZXJlZCBjb2VmZmljaWVudHMuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2luY2x1ZGUgImRlZnMuaCIKI2luY2x1ZGUgInRhYmxlcy5oIgojaW5jbHVkZSAiY291bnQuaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiAgICBzYW1wbGVzX3RvX3JtbHRfY29lZnMgCgogU3ludGF4OiAgICAgIFdvcmQxNiBzYW1wbGVzX3RvX3JtbHRfY29lZnMobmV3X3NhbXBsZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3NhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjdF9sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpuZXdfc2FtcGxlczsgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqb2xkX3NhbXBsZXM7ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmNvZWZzOyAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgV29yZDE2IGRjdF9sZW5ndGg7CgogRGVzY3JpcHRpb246IENvbnZlcnQgc2FtcGxlcyB0byBNTFQgY29lZmZpY2llbnRzCgogRGVzaWduIE5vdGVzOgoKIFdNT1BTOiAgICAgN2tIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMS40MCAgICAgIHwgICAgIDEuNDAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgICAgICAgIE1BWCAgfCAgICAxLjQwICAgICAgfCAgICAgMS40MAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAoJCQkJCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0ICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAzLjA3ICAgICAgfCAgICAgMy4wNyAgICAgICB8ICAgICAzLjA3CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBNQVggIHwgICAgMy4xMCAgICAgIHwgICAgIDMuMTAgICAgICAgfCAgICAgMy4xMAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KCQkJCQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpXb3JkMTYgc2FtcGxlc190b19ybWx0X2NvZWZzKGNvbnN0IFdvcmQxNiAqbmV3X3NhbXBsZXMsV29yZDE2ICpvbGRfc2FtcGxlcyxXb3JkMTYgKmNvZWZzLFdvcmQxNiBkY3RfbGVuZ3RoKQp7CgogICAgV29yZDE2CWluZGV4LCB2YWxzX2xlZnQsbWFnX3NoaWZ0LG47CiAgICBXb3JkMTYJd2luZG93ZWRfZGF0YVtNQVhfRENUX0xFTkdUSF07CiAgICBXb3JkMTYJKm9sZF9wdHI7CiAgICBjb25zdCBXb3JkMTYgKm5ld19wdHIsICpzYW1fbG93LCAqc2FtX2hpZ2g7CiAgICBXb3JkMTYJKndpbl9sb3csICp3aW5faGlnaDsKICAgIFdvcmQxNgkqZHN0X3B0cjsKICAgIFdvcmQxNiAgbmVnX3dpbl9sb3c7CiAgICBXb3JkMTYgIHNhbXBfaGlnaDsKICAgIFdvcmQxNiAgaGFsZl9kY3Rfc2l6ZTsKICAgIAogICAgV29yZDMyCWFjY2E7CiAgICBXb3JkMzIJYWNjYjsKICAgIFdvcmQxNgl0ZW1wOwogICAgV29yZDE2CXRlbXAxOwogICAgV29yZDE2CXRlbXAyOwogICAgV29yZDE2CXRlbXA1OwogICAKICAgIGhhbGZfZGN0X3NpemUgPSBzaHJfbm9jaGVjayhkY3RfbGVuZ3RoLDEpOwogICAKICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgLyogR2V0IHRoZSBmaXJzdCBoYWxmIG9mIHRoZSB3aW5kb3dlZCBzYW1wbGVzICovCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIAogICAgZHN0X3B0ciAgPSB3aW5kb3dlZF9kYXRhOwogICAgbW92ZTE2KCk7CiAgICAKICAgIC8qIGFkZHJlc3MgYXJpdGhtZXRpYyAqLwogICAgdGVzdCgpOwogICAgaWYgKGRjdF9sZW5ndGg9PURDVF9MRU5HVEgpCiAgICB7CiAgICAgICAgd2luX2hpZ2ggPSBzYW1wbGVzX3RvX3JtbHRfd2luZG93ICsgaGFsZl9kY3Rfc2l6ZTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB3aW5faGlnaCA9IG1heF9zYW1wbGVzX3RvX3JtbHRfd2luZG93ICsgaGFsZl9kY3Rfc2l6ZTsKICAgIH0KICAgIAogICAgd2luX2xvdyAgPSB3aW5faGlnaDsKICAgIG1vdmUxNigpOwogICAgCiAgICAvKiBhZGRyZXNzIGFyaXRobWV0aWMgKi8KICAgIHNhbV9oaWdoID0gb2xkX3NhbXBsZXMgKyBoYWxmX2RjdF9zaXplOwogICAgCiAgICBzYW1fbG93ICA9IHNhbV9oaWdoOwogICAgbW92ZTE2KCk7CiAgICAKICAgIGZvciAodmFsc19sZWZ0ID0gaGFsZl9kY3Rfc2l6ZTt2YWxzX2xlZnQgPiAwO3ZhbHNfbGVmdC0tKQogICAgewogICAgICAgIGFjY2EgPSAwTDsKICAgICAgICBtb3ZlMzIoKTsKICAgICAgICAKICAgICAgICBhY2NhID0gTF9tYWMoYWNjYSwqLS13aW5fbG93LCAqLS1zYW1fbG93KTsKICAgICAgICBhY2NhID0gTF9tYWMoYWNjYSwqd2luX2hpZ2grKywgKnNhbV9oaWdoKyspOwogICAgICAgIHRlbXAgPSBpdHVfcm91bmQoYWNjYSk7IAogICAgICAgIAogICAgICAgICpkc3RfcHRyKysgPSB0ZW1wOwogICAgICAgIG1vdmUxNigpOwogICAgfSAgICAgICAgICAgCiAgICAKICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIC8qIEdldCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvd2VkIHNhbXBsZXMgKi8KICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIAogICAgc2FtX2xvdyAgPSBuZXdfc2FtcGxlczsKICAgIG1vdmUxNigpOwoKICAgIC8qIGFkZHJlc3MgYXJpdGhtZXRpYyAqLwogICAgc2FtX2hpZ2ggPSBuZXdfc2FtcGxlcyArIGRjdF9sZW5ndGg7CiAgICAKICAgIGZvciAodmFsc19sZWZ0ID0gaGFsZl9kY3Rfc2l6ZTsgICAgdmFsc19sZWZ0ID4gMDsgICAgdmFsc19sZWZ0LS0pCiAgICB7CiAgICAgICAgYWNjYSA9IDBMOwogICAgICAgIG1vdmUzMigpOwoKICAgICAgICBhY2NhID0gTF9tYWMoYWNjYSwqLS13aW5faGlnaCwgKnNhbV9sb3crKyk7CiAgICAgICAgbmVnX3dpbl9sb3cgPSBuZWdhdGUoKndpbl9sb3crKyk7CiAgICAgICAgc2FtcF9oaWdoID0gKi0tc2FtX2hpZ2g7CiAgICAgICAgYWNjYSA9IExfbWFjKGFjY2EsIG5lZ193aW5fbG93LCBzYW1wX2hpZ2gpOwogICAgICAgIHRlbXAgPSBpdHVfcm91bmQoYWNjYSk7IAogICAgICAgIAogICAgICAgICpkc3RfcHRyKys9dGVtcDsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KICAgICAgIAogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCiAgICAvKiBTYXZlIHRoZSBuZXcgc2FtcGxlcyBmb3IgbmV4dCB0aW1lLCB3aGVuIHRoZXkgd2lsbCBiZSB0aGUgb2xkIHNhbXBsZXMgKi8KICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgCiAgICBuZXdfcHRyID0gbmV3X3NhbXBsZXM7CiAgICBtb3ZlMTYoKTsKCiAgICBvbGRfcHRyID0gb2xkX3NhbXBsZXM7CiAgICBtb3ZlMTYoKTsKCiAgICBmb3IgKHZhbHNfbGVmdCA9IGRjdF9sZW5ndGg7dmFsc19sZWZ0ID4gMDt2YWxzX2xlZnQtLSkKICAgIHsKICAgICAgICAqb2xkX3B0cisrID0gKm5ld19wdHIrKzsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KICAgIAogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCiAgICAvKiBDYWxjdWxhdGUgaG93IG1hbnkgYml0cyB0byBzaGlmdCB1cCB0aGUgaW5wdXQgdG8gdGhlIERDVC4gICAgICAgICAgICAgKi8KICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgCiAgICB0ZW1wMT0wOwogICAgbW92ZTE2KCk7CgogICAgZm9yKGluZGV4PTA7aW5kZXg8ZGN0X2xlbmd0aDtpbmRleCsrKQogICAgewogICAgICAgIHRlbXAyID0gYWJzX3Mod2luZG93ZWRfZGF0YVtpbmRleF0pOwogICAgICAgIHRlbXAgPSBzdWIodGVtcDIsdGVtcDEpOwogICAgICAgIHRlc3QoKTsKICAgICAgICBpZih0ZW1wID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICB0ZW1wMSA9IHRlbXAyOwogICAgICAgIH0KICAgIH0KICAgIAogICAgbWFnX3NoaWZ0PTA7CiAgICBtb3ZlMTYoKTsKCiAgICB0ZW1wID0gc3ViKHRlbXAxLDE0MDAwKTsKICAgIHRlc3QoKTsKICAgIGlmICh0ZW1wID49IDApCiAgICB7CiAgICAgICAgbWFnX3NoaWZ0ID0gMDsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB0ZW1wID0gc3ViKHRlbXAxLDQzOCk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmKHRlbXAgPCAwKQogICAgICAgICAgICB0ZW1wID0gYWRkKHRlbXAxLDEpOwogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICB0ZW1wID0gdGVtcDE7CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgIH0KICAgICAgICBhY2NiID0gTF9tdWx0KHRlbXAsOTU4Nyk7CiAgICAgICAgYWNjYSA9IExfc2hyX25vY2hlY2soYWNjYiwyMCk7CiAgICAgICAgdGVtcDUgPSBleHRyYWN0X2woYWNjYSk7CiAgICAgICAgdGVtcCA9IG5vcm1fcyh0ZW1wNSk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmICh0ZW1wID09IDApCiAgICAgICAgewogICAgICAgICAgICBtYWdfc2hpZnQgPSA5OwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBtYWdfc2hpZnQgPSBzdWIodGVtcCw2KTsKICAgICAgICAKICAgIH0KCiAgICBhY2NhID0gMEw7CiAgICBtb3ZlMzIoKTsKICAgIGZvcihpbmRleD0wOyBpbmRleDxkY3RfbGVuZ3RoOyBpbmRleCsrKQogICAgewogICAgICAgIHRlbXAgPSBhYnNfcyggd2luZG93ZWRfZGF0YVtpbmRleF0pOwogICAgICAgIGFjY2EgPSBMX2FkZChhY2NhLHRlbXApOwogICAgfQogICAgCiAgICBhY2NhID0gTF9zaHJfbm9jaGVjayhhY2NhLDcpOwogICAgCiAgICB0ZXN0KCk7CiAgICBpZiAodGVtcDEgPCBhY2NhKQogICAgewogICAgICAgIG1hZ19zaGlmdCA9IHN1YihtYWdfc2hpZnQsMSk7CiAgICB9CgogICAgdGVzdCgpOwogICAgaWYgKG1hZ19zaGlmdCA+IDApIAogICAgewogICAgICAgIGZvcihpbmRleD0wO2luZGV4PGRjdF9sZW5ndGg7aW5kZXgrKykKICAgICAgICB7CiAgICAgICAgICAgIHdpbmRvd2VkX2RhdGFbaW5kZXhdID0gc2hsX25vY2hlY2sod2luZG93ZWRfZGF0YVtpbmRleF0sbWFnX3NoaWZ0KTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIAogICAgewogICAgICAgIHRlc3QoKTsKICAgICAgICBpZiAobWFnX3NoaWZ0IDwgMCkgCiAgICAgICAgewogICAgICAgICAgICBuID0gbmVnYXRlKG1hZ19zaGlmdCk7CiAgICAgICAgICAgIGZvcihpbmRleD0wO2luZGV4PGRjdF9sZW5ndGg7aW5kZXgrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd2luZG93ZWRfZGF0YVtpbmRleF0gPSBzaHJfbm9jaGVjayh3aW5kb3dlZF9kYXRhW2luZGV4XSxuKTsKICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgLyogUGVyZm9ybSBhIFR5cGUgSVYgRENUIG9uIHRoZSB3aW5kb3dlZCBkYXRhIHRvIGdldCB0aGUgY29lZmZpY2llbnRzICovCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KCiAgICBkY3RfdHlwZV9pdl9hKHdpbmRvd2VkX2RhdGEsIGNvZWZzLCBkY3RfbGVuZ3RoKTsKCiAgICByZXR1cm4obWFnX3NoaWZ0KTsKfQo=