LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKioKKiogICBJVFUtVCBHLjcyMi4xICgyMDA1LTA1KSAtIEZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uIGZvciBtYWluIGJvZHkgYW5kIEFubmV4IEMKKiogICA+IFNvZnR3YXJlIFJlbGVhc2UgMi4xICgyMDA4LTA2KQoqKiAgICAgKFNpbXBsZSByZXBhY2thZ2luZzsgbm8gY2hhbmdlIGZyb20gMjAwNS0wNSBSZWxlYXNlIDIuMCBjb2RlKQoqKgoqKiAgIKkgMjAwNCBQb2x5Y29tLCBJbmMuCioqCioqCSBBbGwgcmlnaHRzIHJlc2VydmVkLgoqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGaWxlbmFtZTogICAgY29tbW9uLmMgICAgCgogIFB1cnBvc2U6ICAgICBDb250YWlucyB0aGUgZnVuY3Rpb25zIHVzZWQgZm9yIGJvdGggRy43MjIuMSBBbm5leCBDIGVuY29kZXIgYW5kIGRlY29kZXIKCQkKICBEZXNpZ24gTm90ZXM6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlICJkZWZzLmgiCiNpbmNsdWRlICJodWZmX2RlZi5oIgojaW5jbHVkZSAiaHVmZl90YWIuaCIKI2luY2x1ZGUgInRhYmxlcy5oIgojaW5jbHVkZSAiY291bnQuaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbjogICAgY2F0ZWdvcml6ZQoKIFN5bnRheDogICAgICB2b2lkIGNhdGVnb3JpemUoV29yZDE2IG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9yZWdpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHJtc19pbmRleCwgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHBvd2VyX2NhdGVnb3JpZXMsICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNhdGVnb3J5X2JhbGFuY2VzKSAgICAgICAgICAKCiAgICAgICAgICAgICAgICAgIGlucHV0czogICBudW1iZXJfb2ZfcmVnaW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBybXNfaW5kZXhbTUFYX05VTUJFUl9PRl9SRUdJT05TXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgb3V0cHV0czogIHBvd2VyX2NhdGVnb3JpZXNbTUFYX05VTUJFUl9PRl9SRUdJT05TXSAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9iYWxhbmNlc1tNQVhfTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfUE9TU0lCSUxJVElFUy0xXQoKIERlc2NyaXB0aW9uOiBDb21wdXRlcyBhIHNlcmllcyBvZiBjYXRlZ29yaXphdGlvbnMgCgogV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAwLjE0ICAgICAgfCAgICAgMC4xNAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKICAgICAgICAgICAgTUFYICB8ICAgIDAuMTUgICAgICB8ICAgICAwLjE1CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCiAgIAkJCQogICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMC40MiAgICAgIHwgICAgIDAuNDUgICAgICAgfCAgICAgMC40OCAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgTUFYICB8ICAgIDAuNDcgICAgICB8ICAgICAwLjUyICAgICAgIHwgICAgIDAuNTIgICAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIGNhdGVnb3JpemUoV29yZDE2IG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywKCQkgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucywKCQkgICAgICAgIFdvcmQxNiBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAoJCSAgICAgICAgV29yZDE2ICpybXNfaW5kZXgsCgkJICAgICAgICBXb3JkMTYgKnBvd2VyX2NhdGVnb3JpZXMsCgkJICAgICAgICBXb3JkMTYgKmNhdGVnb3J5X2JhbGFuY2VzKQp7CiAgICAKICAgIFdvcmQxNiBvZmZzZXQ7CiAgICBXb3JkMTYgdGVtcDsKICAgIFdvcmQxNiBmcmFtZV9zaXplOwoKICAgIC8qIEF0IGhpZ2hlciBiaXQgcmF0ZXMsIHRoZXJlIGlzIGFuIGluY3JlYXNlIGZvciBtb3N0IGNhdGVnb3JpZXMgaW4gYXZlcmFnZSBiaXQKICAgICAgIGNvbnN1bXB0aW9uIHBlciByZWdpb24uIFdlIGNvbXBlbnNhdGUgZm9yIHRoaXMgYnkgcHJldGVuZGluZyB3ZSBoYXZlIGZld2VyCiAgICAgICBhdmFpbGFibGUgYml0cy4gKi8KICAgIHRlc3QoKTsKICAgIGlmIChudW1iZXJfb2ZfcmVnaW9ucyA9PSBOVU1CRVJfT0ZfUkVHSU9OUykKICAgIHsKICAgICAgICBmcmFtZV9zaXplID0gRENUX0xFTkdUSDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBmcmFtZV9zaXplID0gTUFYX0RDVF9MRU5HVEg7CiAgICB9CgogICAgdGVtcCA9IHN1YihudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsZnJhbWVfc2l6ZSk7CiAgICAKICAgIHRlc3QoKTsKICAgIGlmICh0ZW1wID4gMCkKICAgIHsKICAgICAgICBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMgPSBzdWIobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLGZyYW1lX3NpemUpOwogICAgICAgIG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyA9IGV4dHJhY3RfbChMX211bHQwKG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyw1KSk7CiAgICAgICAgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzID0gc2hyX25vY2hlY2sobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLDMpOwogICAgICAgIG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyA9IGFkZChudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsZnJhbWVfc2l6ZSk7CiAgICB9CgogICAgLyogY2FsY3VsYXRlIHRoZSBvZmZzZXQgdXNpbmcgdGhlIG9yaWdpbmFsIGNhdGVnb3J5IGFzc2lnbm1lbnRzICovCiAgICBvZmZzZXQgPSBjYWxjX29mZnNldChybXNfaW5kZXgsbnVtYmVyX29mX3JlZ2lvbnMsbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzKTsKCgoKICAgIC8qIGNvbXB1dGUgdGhlIHBvd2VyIGNhdGVnb3JpZXMgYmFzZWQgb24gdGhlIHVuaWZvcm0gb2Zmc2V0ICovCiAgICBjb21wdXRlX3Jhd19wb3dfY2F0ZWdvcmllcyhwb3dlcl9jYXRlZ29yaWVzLHJtc19pbmRleCxudW1iZXJfb2ZfcmVnaW9ucyxvZmZzZXQpOwogICAgCiAgICAKICAgIC8qIGFkanVzdCB0aGUgY2F0ZWdvcnkgYXNzaWdubWVudHMgKi8KICAgIC8qIGNvbXB1dGUgdGhlIG5ldyBwb3dlciBjYXRlZ29yaWVzIGFuZCBjYXRlZ29yeSBiYWxhbmNlcyAqLwogICAgY29tcF9wb3dlcmNhdF9hbmRfY2F0YmFsYW5jZShwb3dlcl9jYXRlZ29yaWVzLGNhdGVnb3J5X2JhbGFuY2VzLHJtc19pbmRleCxudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsbnVtYmVyX29mX3JlZ2lvbnMsbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcyxvZmZzZXQpOwoKfQogICAgCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiAgICBjb21wX3Bvd2VyY2F0X2FuZF9jYXRiYWxhbmNlCgogU3ludGF4OiAgICAgIHZvaWQgY29tcF9wb3dlcmNhdF9hbmRfY2F0YmFsYW5jZShXb3JkMTYgKnBvd2VyX2NhdGVnb3JpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqY2F0ZWdvcnlfYmFsYW5jZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcm1zX2luZGV4LCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgb2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlucHV0czogICAqcm1zX2luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBvdXRwdXRzOiAgKnBvd2VyX2NhdGVnb3JpZXMgIAogICAgICAgICAgICAgICAgICAgICAgICAgICpjYXRlZ29yeV9iYWxhbmNlcyAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiBEZXNjcmlwdGlvbjogQ29tcHV0ZXMgdGhlIHBvd2VyX2NhdGVnb3JpZXMgYW5kIHRoZSBjYXRlZ29yeSBiYWxhbmNlcwoKIFdNT1BTOiAgICAgN2tIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMC4xMCAgICAgIHwgICAgIDAuMTAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgICAgICAgIE1BWCAgfCAgICAwLjExICAgICAgfCAgICAgMC4xMQogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAoJCQkJCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0ICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAwLjMyICAgICAgfCAgICAgMC4zNSAgICAgICB8ICAgICAwLjM4ICAgCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBNQVggIHwgICAgMC4zOCAgICAgIHwgICAgIDAuNDIgICAgICAgfCAgICAgMC40MyAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBjb21wX3Bvd2VyY2F0X2FuZF9jYXRiYWxhbmNlKFdvcmQxNiAqcG93ZXJfY2F0ZWdvcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqY2F0ZWdvcnlfYmFsYW5jZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnJtc19pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKCQkJCQkJCQkgIFdvcmQxNiBvZmZzZXQpCnsKICAgIAogICAgV29yZDE2IGV4cGVjdGVkX251bWJlcl9vZl9jb2RlX2JpdHM7CiAgICBXb3JkMTYgcmVnaW9uOwogICAgV29yZDE2IG1heF9yZWdpb247CiAgICBXb3JkMTYgajsKICAgIFdvcmQxNiBtYXhfcmF0ZV9jYXRlZ29yaWVzW01BWF9OVU1CRVJfT0ZfUkVHSU9OU107CiAgICBXb3JkMTYgbWluX3JhdGVfY2F0ZWdvcmllc1tNQVhfTlVNQkVSX09GX1JFR0lPTlNdOwogICAgV29yZDE2IHRlbXBfY2F0ZWdvcnlfYmFsYW5jZXNbMipNQVhfTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfUE9TU0lCSUxJVElFU107CiAgICBXb3JkMTYgcmF3X21heCwgcmF3X21pbjsKICAgIFdvcmQxNiByYXdfbWF4X2luZGV4PTAsIHJhd19taW5faW5kZXg9MDsKICAgIFdvcmQxNiBtYXhfcmF0ZV9wb2ludGVyLCBtaW5fcmF0ZV9wb2ludGVyOwogICAgV29yZDE2IG1heCwgbWluOwogICAgV29yZDE2IGl0ZW1wMDsKICAgIFdvcmQxNiBpdGVtcDE7CiAgICBXb3JkMTYgbWluX3BsdXNfbWF4OwogICAgV29yZDE2IHR3b194X251bWJlcl9vZl9hdmFpbGFibGVfYml0czsKCiAgICBXb3JkMTYgdGVtcDsKCiAgICBleHBlY3RlZF9udW1iZXJfb2ZfY29kZV9iaXRzID0gMDsKICAgIG1vdmUxNigpOwoKICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCiAgICAgICAgZXhwZWN0ZWRfbnVtYmVyX29mX2NvZGVfYml0cyA9IGFkZChleHBlY3RlZF9udW1iZXJfb2ZfY29kZV9iaXRzLGV4cGVjdGVkX2JpdHNfdGFibGVbcG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dXSk7CgoKICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspIAogICAgewogICAgICAgIG1heF9yYXRlX2NhdGVnb3JpZXNbcmVnaW9uXSA9IHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXTsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAKICAgICAgICBtaW5fcmF0ZV9jYXRlZ29yaWVzW3JlZ2lvbl0gPSBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl07CiAgICAgICAgbW92ZTE2KCk7CiAgICB9CiAgICAKICAgIG1heCA9IGV4cGVjdGVkX251bWJlcl9vZl9jb2RlX2JpdHM7CiAgICBtb3ZlMTYoKTsKICAgIG1pbiA9IGV4cGVjdGVkX251bWJlcl9vZl9jb2RlX2JpdHM7CiAgICBtb3ZlMTYoKTsKICAgIG1heF9yYXRlX3BvaW50ZXIgPSBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzOwogICAgbW92ZTE2KCk7CiAgICBtaW5fcmF0ZV9wb2ludGVyID0gbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllczsKICAgIG1vdmUxNigpOwogICAgCiAgICBmb3IgKGo9MDsgajxudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLTE7IGorKykgCiAgICB7CiAgICAgICAgbWluX3BsdXNfbWF4ID0gYWRkKG1heCxtaW4pOwogICAgICAgIHR3b194X251bWJlcl9vZl9hdmFpbGFibGVfYml0cyA9IHNobF9ub2NoZWNrKG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywxKTsKICAgICAgICAKICAgICAgICB0ZW1wID0gc3ViKG1pbl9wbHVzX21heCx0d29feF9udW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMpOwogICAgICAgIHRlc3QoKTsKICAgICAgICBpZiAodGVtcCA8PSAwKSAKICAgICAgICB7CiAgICAgICAgICAgIHJhd19taW4gPSA5OTsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgIC8qIFNlYXJjaCBmcm9tIGxvd2VzdCBmcmVxIHJlZ2lvbnMgdG8gaGlnaGVzdCBmb3IgYmVzdCAqLwogICAgICAgICAgICAvKiByZWdpb24gdG8gcmVhc3NpZ24gdG8gYSBoaWdoZXIgYml0IHJhdGUgY2F0ZWdvcnkuICAgKi8KICAgICAgICAgICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgICAgIGlmIChtYXhfcmF0ZV9jYXRlZ29yaWVzW3JlZ2lvbl0gPiAwKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtcDAgPSBzaGxfbm9jaGVjayhtYXhfcmF0ZV9jYXRlZ29yaWVzW3JlZ2lvbl0sMSk7CiAgICAgICAgICAgICAgICAgICAgaXRlbXAxID0gc3ViKG9mZnNldCxybXNfaW5kZXhbcmVnaW9uXSk7CiAgICAgICAgICAgICAgICAgICAgaXRlbXAwID0gc3ViKGl0ZW1wMSxpdGVtcDApOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHRlbXAgPSBzdWIoaXRlbXAwLHJhd19taW4pOwogICAgICAgICAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCA8IDApIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmF3X21pbiA9IGl0ZW1wMDsKICAgICAgICAgICAgICAgICAgICAgICAgcmF3X21pbl9pbmRleCA9IHJlZ2lvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWF4X3JhdGVfcG9pbnRlciA9IHN1YihtYXhfcmF0ZV9wb2ludGVyLDEpOwogICAgICAgICAgICB0ZW1wX2NhdGVnb3J5X2JhbGFuY2VzW21heF9yYXRlX3BvaW50ZXJdID0gcmF3X21pbl9pbmRleDsKICAgICAgICAgICAgbW92ZTE2KCk7CgogICAgICAgIAltYXggPSBzdWIobWF4LGV4cGVjdGVkX2JpdHNfdGFibGVbbWF4X3JhdGVfY2F0ZWdvcmllc1tyYXdfbWluX2luZGV4XV0pOwogICAgICAgIAltYXhfcmF0ZV9jYXRlZ29yaWVzW3Jhd19taW5faW5kZXhdID0gc3ViKG1heF9yYXRlX2NhdGVnb3JpZXNbcmF3X21pbl9pbmRleF0sMSk7CiAgICAgICAgCW1vdmUxNigpOwoKICAgICAgICAgICAgbWF4ID0gYWRkKG1heCxleHBlY3RlZF9iaXRzX3RhYmxlW21heF9yYXRlX2NhdGVnb3JpZXNbcmF3X21pbl9pbmRleF1dKTsKICAgICAgICB9CiAgICAgICAgZWxzZSAKICAgICAgICB7CiAgICAgICAgICAgIHJhd19tYXggPSAtOTk7CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAvKiBTZWFyY2ggZnJvbSBoaWdoZXN0IGZyZXEgcmVnaW9ucyB0byBsb3dlc3QgZm9yIGJlc3QgcmVnaW9uIHRvIHJlYXNzaWduIHRvCiAgICAgICAgICAgIGEgbG93ZXIgYml0IHJhdGUgY2F0ZWdvcnkuICovCiAgICAgICAgICAgIG1heF9yZWdpb24gPSBzdWIobnVtYmVyX29mX3JlZ2lvbnMsMSk7CiAgICAgICAgICAgIGZvciAocmVnaW9uPSBtYXhfcmVnaW9uOyByZWdpb24gPj0gMDsgcmVnaW9uLS0pIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZW1wID0gc3ViKG1pbl9yYXRlX2NhdGVnb3JpZXNbcmVnaW9uXSwoTlVNX0NBVEVHT1JJRVMtMSkpOwogICAgICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAgPCAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1wMCA9IHNobF9ub2NoZWNrKG1pbl9yYXRlX2NhdGVnb3JpZXNbcmVnaW9uXSwxKTsKICAgICAgICAgICAgICAgICAgICBpdGVtcDEgPSBzdWIob2Zmc2V0LHJtc19pbmRleFtyZWdpb25dKTsKICAgICAgICAgICAgICAgICAgICBpdGVtcDAgPSBzdWIoaXRlbXAxLGl0ZW1wMCk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHN1YihpdGVtcDAscmF3X21heCk7CiAgICAgICAgICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wID4gMCkgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByYXdfbWF4ID0gaXRlbXAwOwogICAgICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmF3X21heF9pbmRleCA9IHJlZ2lvbjsKICAgICAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRlbXBfY2F0ZWdvcnlfYmFsYW5jZXNbbWluX3JhdGVfcG9pbnRlcl0gPSByYXdfbWF4X2luZGV4OwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIG1pbl9yYXRlX3BvaW50ZXIgPSBhZGQobWluX3JhdGVfcG9pbnRlciwxKTsKICAgICAgICAgICAgbWluID0gc3ViKG1pbixleHBlY3RlZF9iaXRzX3RhYmxlW21pbl9yYXRlX2NhdGVnb3JpZXNbcmF3X21heF9pbmRleF1dKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIG1pbl9yYXRlX2NhdGVnb3JpZXNbcmF3X21heF9pbmRleF0gPSBhZGQobWluX3JhdGVfY2F0ZWdvcmllc1tyYXdfbWF4X2luZGV4XSwxKTsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBtaW4gPSBhZGQobWluLGV4cGVjdGVkX2JpdHNfdGFibGVbbWluX3JhdGVfY2F0ZWdvcmllc1tyYXdfbWF4X2luZGV4XV0pOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykKICAgIHsKICAgICAgICBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl0gPSBtYXhfcmF0ZV9jYXRlZ29yaWVzW3JlZ2lvbl07CiAgICAgICAgbW92ZTE2KCk7CiAgICB9CiAgICAKICAgIGZvciAoaj0wOyBqPG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMtMTsgaisrKQogICAgewogICAgICAgIGNhdGVnb3J5X2JhbGFuY2VzW2pdID0gdGVtcF9jYXRlZ29yeV9iYWxhbmNlc1ttYXhfcmF0ZV9wb2ludGVyKytdOwogICAgICAgIG1vdmUxNigpOwogICAgfQoKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbjogICAgY2FsY19vZmZzZXQKCiBTeW50YXg6ICAgICAgb2Zmc2V0PWNhbGNfb2Zmc2V0KFdvcmQxNiAqcm1zX2luZGV4LFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucyxXb3JkMTYgYXZhaWxhYmxlX2JpdHMpICAKCiAgICAgICAgICAgICAgICBpbnB1dDogIFdvcmQxNiAqcm1zX2luZGV4CiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucwogICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYXZhaWxhYmxlX2JpdHMKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBvdXRwdXQ6IFdvcmQxNiBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAKCiBEZXNjcmlwdGlvbjogQ2FsY3VsYXRlcyB0aGUgdGhlIGNhdGVnb3J5IG9mZnNldC4gIFRoaXMgaXMgdGhlIHNoaWZ0IHJlcXVpcmVkCiAgICAgICAgICAgICAgVG8gZ2V0IHRoZSBtb3N0IG91dCBvZiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBiaXRzLiAgQSBiaW5hcnkgCiAgICAgICAgICAgICAgdHlwZSBzZWFyY2ggaXMgdXNlZCB0byBmaW5kIHRoZSBvZmZzZXQuCgogV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAwLjA0ICAgICAgfCAgICAgMC4wNAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKICAgICAgICAgICAgTUFYICB8ICAgIDAuMDQgICAgICB8ICAgICAwLjA0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCgogICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMC4wOCAgICAgIHwgICAgIDAuMDggICAgICAgfCAgICAgMC4wOCAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgTUFYICB8ICAgIDAuMDkgICAgICB8ICAgICAwLjA5ICAgICAgIHwgICAgIDAuMDkgICAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCldvcmQxNiBjYWxjX29mZnNldChXb3JkMTYgKnJtc19pbmRleCxXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsV29yZDE2IGF2YWlsYWJsZV9iaXRzKSAgICAKewoKICAgIFdvcmQxNiBhbnN3ZXI7CiAgICBXb3JkMTYgZGVsdGE7CiAgICBXb3JkMTYgdGVzdF9vZmZzZXQ7CiAgICBXb3JkMTYgcmVnaW9uLGo7CiAgICBXb3JkMTYgcG93ZXJfY2F0c1tNQVhfTlVNQkVSX09GX1JFR0lPTlNdOwogICAgV29yZDE2IGJpdHM7CiAgICBXb3JkMTYgb2Zmc2V0OwogICAgV29yZDE2IHRlbXA7CgogICAgLyogaW5pdGlhbGl6ZSB2YXJzICovCiAgICBhbnN3ZXIgPSAtMzI7CiAgICBtb3ZlMTYoKTsKICAgIGRlbHRhID0gMzI7CiAgICBtb3ZlMTYoKTsKICAgIAogICAgZG8gCiAgICB7CiAgICAgICAgdGVzdF9vZmZzZXQgPSBhZGQoYW5zd2VyLGRlbHRhKTsKICAgICAgICAKICAgICAgICAvKiBvYnRhaW4gYSBjYXRlZ29yeSBmb3IgZWFjaCByZWdpb24gKi8KICAgICAgICAvKiB1c2luZyB0aGUgdGVzdCBvZmZzZXQgICAgICAgICAgICAgKi8KICAgICAgICBmb3IgKHJlZ2lvbj0wOyByZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKSAKICAgICAgICB7CiAgICAgICAgICAgIGogPSBzdWIodGVzdF9vZmZzZXQscm1zX2luZGV4W3JlZ2lvbl0pOwogICAgICAgICAgICBqID0gc2hyX25vY2hlY2soaiwxKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8qIEVuc3VyZSBqIGlzIGJldHdlZW4gMCBhbmQgTlVNX0NBVC0xICovCiAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgaWYgKGogPCAwKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0ZW1wID0gc3ViKGosTlVNX0NBVEVHT1JJRVMtMSk7CiAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgaWYgKHRlbXAgPiAwKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaiA9IHN1YihOVU1fQ0FURUdPUklFUywxKTsKICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBvd2VyX2NhdHNbcmVnaW9uXSA9IGo7CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgIH0KICAgICAgICBiaXRzID0gMDsKICAgICAgICBtb3ZlMTYoKTsKCiAgICAgICAgLyogY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgdGhhdCB3aWxsIGJlIHVzZWQgZ2l2ZW4gdGhlIGNhdCBhc3NpZ25tZW50cyAqLwogICAgICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCiAgICAgICAgICAgIGJpdHMgPSBhZGQoYml0cyxleHBlY3RlZF9iaXRzX3RhYmxlW3Bvd2VyX2NhdHNbcmVnaW9uXV0pOwoKICAgICAgICAvKiBpZiAoYml0cyA+IGF2YWlsYWJsZV9iaXRzIC0gMzIpIHRoZW4gZGl2aWRlIHRoZSBvZmZzZXQgcmVnaW9uIGZvciB0aGUgYmluIHNlYXJjaCAqLwogICAgICAgIG9mZnNldCA9IHN1YihhdmFpbGFibGVfYml0cywzMik7CiAgICAgICAgdGVtcCA9IHN1YihiaXRzLG9mZnNldCk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmICh0ZW1wID49IDApCiAgICAgICAgewogICAgICAgICAgICBhbnN3ZXIgPSB0ZXN0X29mZnNldDsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgfQogICAgICAgIGRlbHRhID0gc2hyX25vY2hlY2soZGVsdGEsMSk7CiAgICAgICAgdGVzdCgpOyAvKiBmb3IgdGhlIHdoaWxlIGxvb3AgKi8KICAgIH0gd2hpbGUgKGRlbHRhID4gMCk7CgogICAgcmV0dXJuKGFuc3dlcik7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb246ICAgIGNvbXB1dGVfcmF3X3Bvd19jYXRlZ29yaWVzCgogU3ludGF4OiAgICAgIHZvaWQgY29tcHV0ZV9yYXdfcG93X2NhdGVnb3JpZXMoV29yZDE2ICpwb3dlcl9jYXRlZ29yaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpybXNfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgb2Zmc2V0KQogICAgICAgICAgICAgIGlucHV0czogICpybXNfaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucwogICAgICAgICAgICAgICAgICAgICAgIG9mZnNldAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIG91dHB1dHM6ICpwb3dlcl9jYXRlZ29yaWVzICAgICAgICAgICAgICAgICAgICAKCgoKIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwb3dlciBjYXRlZ29yaWVzIGdpdmVuIHRoZSBvZmZzZXQKICAgICAgICAgICAgICBUaGlzIGlzIGtpbmQgb2YgcmVkdW5kYW50IHNpbmNlIHRoZXkgd2VyZSBhbHJlYWR5IGNvbXB1dGVkCiAgICAgICAgICAgICAgaW4gY2FsY19vZmZzZXQgdG8gZGV0ZXJtaW5lIHRoZSBvZmZzZXQuCgogV01PUFM6ICAgICAgICAgIHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAwLjAxICAgICAgfCAgICAgMC4wMQogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKICAgICAgICAgICAgTUFYICB8ICAgIDAuMDEgICAgICB8ICAgICAwLjAxCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCgogICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMC4wMSAgICAgIHwgICAgIDAuMDEgICAgICAgfCAgICAgMC4wMSAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgTUFYICB8ICAgIDAuMDEgICAgICB8ICAgICAwLjAxICAgICAgIHwgICAgIDAuMDEgICAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgY29tcHV0ZV9yYXdfcG93X2NhdGVnb3JpZXMoV29yZDE2ICpwb3dlcl9jYXRlZ29yaWVzLFdvcmQxNiAqcm1zX2luZGV4LFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucyxXb3JkMTYgb2Zmc2V0KQp7CiAgICBXb3JkMTYgcmVnaW9uOwogICAgV29yZDE2IGo7CiAgICBXb3JkMTYgdGVtcDsKCiAgICBmb3IgKHJlZ2lvbj0wOyByZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKSAKICAgIHsKICAgICAgICBqID0gc3ViKG9mZnNldCxybXNfaW5kZXhbcmVnaW9uXSk7CiAgICAgICAgaiA9IHNocl9ub2NoZWNrKGosMSk7CiAgICAgICAgCiAgICAgICAgLyogbWFrZSBzdXJlIGogaXMgYmV0d2VlbiAwIGFuZCBOVU1fQ0FULTEgKi8KICAgICAgICB0ZXN0KCk7CiAgICAgICAgaWYgKGogPCAwKSAKICAgICAgICB7CiAgICAgICAgICAgIGogPSAwOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CiAgICAgICAgdGVtcCA9IHN1YihqLChOVU1fQ0FURUdPUklFUy0xKSk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmICh0ZW1wID4gMCkgCiAgICAgICAgICAgIGogPSBzdWIoTlVNX0NBVEVHT1JJRVMsMSk7CiAgICAgICAgCiAgICAgICAgcG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dID0gajsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KfQoK