Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLyBAQEAgU1RBUlQgQ09QWVJJR0hUIEBAQAovLwovLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQovLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgovLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQovLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi8vCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQovLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi8vIHVuZGVyIHRoZSBMaWNlbnNlLgovLwovLyBAQEAgRU5EIENPUFlSSUdIVCBAQEAKLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgojaW5jbHVkZSAiQ29tcGlsYXRpb25TdGF0cy5oIgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gTWV0aG9kcyBmb3IgY2xhc3MgQ29tcGlsYXRpb25TdGF0cwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmNvbnN0cnVjdG9yIENvbXBpbGF0aW9uU3RhdHMKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQ29tcGlsYXRpb25TdGF0czo6Q29tcGlsYXRpb25TdGF0cygpCiAgOiAgY29tcGlsZVN0YXJ0VGltZV8oMCksCiAgICAgY29tcGlsZUVuZFRpbWVfKDApLAogICAgIG1kQ2FjaGVIaXRzQmVnaW5fKDApLAogICAgIG1kQ2FjaGVMb29rdXBzQmVnaW5fKDApLAogICAgIGhDYWNoZUhpdHNCZWdpbl8oMCksCiAgICAgaENhY2hlTG9va3Vwc0JlZ2luXygwKSwKICAgICBvcHRDb250ZXh0c18oMCksCiAgICAgaXNSZWNvbXBpbGVfKEZBTFNFKQp7ICAgICAgCiAgbWVtc2V0KCZxQ2FjaGVTdGF0c0JlZ2luXywgMCwgc2l6ZW9mKHFDYWNoZVN0YXRzQmVnaW5fKSk7CiAgY29tcGlsZUluZm9fWzBdID0gJ1wwJzsKfQoKdm9pZCBDb21waWxhdGlvblN0YXRzOjp0YWtlU25hcHNob3RPZkNvdW50ZXJzKCkKeyAgICAgIAogIC8vIG1ldGFkYXRhIGNhY2hlIGNvdW50ZXJzIHN0YXJ0IHBvaW50CiAgbWRDYWNoZUhpdHNCZWdpbl8gICAgPSBBY3RpdmVTY2hlbWFEQigpLT5nZXROQVRhYmxlREIoKS0+aGl0cygpOyAKICBtZENhY2hlTG9va3Vwc0JlZ2luXyA9IEFjdGl2ZVNjaGVtYURCKCktPmdldE5BVGFibGVEQigpLT5sb29rdXBzKCk7CgogIC8vIGhpc3RvZ3JhbSBjYWNoZSBjb3VudGVycyBzdGFydCBwb2ludAogIGlmIChDVVJSQ09OVEVYVF9ISVNUQ0FDSEUpCiAgewogICAgaENhY2hlSGl0c0JlZ2luXyAgICA9IENVUlJDT05URVhUX0hJU1RDQUNIRS0+aGl0cygpOwogICAgaENhY2hlTG9va3Vwc0JlZ2luXyA9IENVUlJDT05URVhUX0hJU1RDQUNIRS0+bG9va3VwcygpOwogIH0KICAgIAogIC8vIGdldCBhIHNuYXBzaG90IG9mIHRoZSBRdWVyeUNhY2hlU3RhdHMgcHJpb3IgdG8gdGhlIGNvbXBpbGF0aW9uCiAgLy8gdGhpcyB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBxQ2FjaGVTdGF0dXNfIGF0IHRoZSBlbmQgIAogIENVUlJFTlRRQ0FDSEUtPmdldENvbXBpbGF0aW9uQ2FjaGVTdGF0cyhxQ2FjaGVTdGF0c0JlZ2luXyk7CgogIGNvbXBpbGVJbmZvX1swXSA9ICdcMCc7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKbWV0aG9kIENvbXBpbGF0aW9uU3RhdHM6OmdldENvbXBpbGVySWQKCiBwYXNzIGluIGEgYnVmZmVyIGFuZCBnZXQgdGhlIGNvbXBpbGVyIGlkIGJhY2sKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZApDb21waWxhdGlvblN0YXRzOjpnZXRDb21waWxlcklkKGNoYXIgKmNtcElkLCBpbnQgbGVuKQp7CiAgQ21wUHJvY2VzcyBwOwogIHAuZ2V0Q29tcGlsZXJJZChjbXBJZCwgbGVuKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCm1ldGhvZCBDb21waWxhdGlvblN0YXRzOjplbnRlckNtcFBoYXNlCgogbWFyayB0aGUgYmVnaW5pbmcgb2YgYSBjb21waWxhdGlvbiBwaGFzZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIApDb21waWxhdGlvblN0YXRzOjplbnRlckNtcFBoYXNlKENvbXBpbGF0aW9uUGhhc2UgcGhhc2UpCnsKICBpZiAoIWlzVmFsaWRQaGFzZShwaGFzZSkpIHJldHVybjsKCiAgLy8gYWx3YXlzIGluaXRpYWxpemUgaXQgdG8gemVybwogIGNwdU1vbml0b3JfW3BoYXNlXS5pbml0KDApOwogIGNwdU1vbml0b3JfW3BoYXNlXS5lbnRlcigpOwogIC8vCiAgLy8gbWFyayB0aGUgc3RhcnQgb2YgdGhlIGNvbXBpbGF0aW9uCiAgaWYoIENNUF9QSEFTRV9BTEwgPT0gcGhhc2UgKQogIHsKICAgIGNvbXBpbGVTdGFydFRpbWVfID0gZ2V0Q3VycmVudFRpbWVzdGFtcCgpOwogIH0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCm1ldGhvZCBDb21waWxhdGlvblN0YXRzOjpleGl0Q21wUGhhc2UKCiBtYXJrIHRoZSBlbmQgb2YgYSBjb21waWxhdGlvbiBwaGFzZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIApDb21waWxhdGlvblN0YXRzOjpleGl0Q21wUGhhc2UoQ29tcGlsYXRpb25QaGFzZSBwaGFzZSkKewogIGlmICghKGlzVmFsaWRQaGFzZShwaGFzZSkpKSByZXR1cm47CgogIGNwdU1vbml0b3JfW3BoYXNlXS5leGl0KCk7CiAgLy8KICAvLyBtYXJrIHRoZSBlbmQgb2YgdGhlIGNvbXBpbGF0aW9uCiAgaWYoIENNUF9QSEFTRV9BTEwgPT0gcGhhc2UgKQogIHsKICAgIGNvbXBpbGVFbmRUaW1lXyA9IGdldEN1cnJlbnRUaW1lc3RhbXAoKTsKICB9Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgptZXRob2QgQ29tcGlsYXRpb25TdGF0czo6Y21wUGhhc2VMZW5ndGgKCiBnZXQgdGhlIGNwdSBwYXRoIGxlbmd0aCBmb3IgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHBoYXNlCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkxuZzMyIApDb21waWxhdGlvblN0YXRzOjpjbXBQaGFzZUxlbmd0aChDb21waWxhdGlvblBoYXNlIHBoYXNlKQp7CiAgaWYgKCFpc1ZhbGlkUGhhc2UocGhhc2UpKSByZXR1cm4gMDsKCiAgLy8gZm9yIG5vdywgY29tYmluZSB0aGUgc2VtYW50aWMgcXVlcnkgb3B0aW1pemF0aW9uIHBoYXNlIGNvdW50ZXIKICAvLyBpbnRvIHRoZSBub3JtYWxpemVyIGNvdW50ZXIKICBpZiggQ01QX1BIQVNFX05PUk1BTElaRVIgPT0gcGhhc2UgKQogIHsKICAgIHJldHVybiAKICAgICAgY3B1TW9uaXRvcl9bQ01QX1BIQVNFX1NFTUFOVElDX1FVRVJZX09QVElNSVpBVElPTl0udGltZXIoKSArIAogICAgICBjcHVNb25pdG9yX1tDTVBfUEhBU0VfTk9STUFMSVpFUl0udGltZXIoKTsKICB9CiAgZWxzZQogIHsKICAgIHJldHVybiBjcHVNb25pdG9yX1twaGFzZV0udGltZXIoKTsKICB9Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgptZXRob2QgQ29tcGlsYXRpb25TdGF0czo6bWV0YWRhdGFDYWNoZUhpdHMKClRoZSBjdXJyZW50IG1ldGFkYXRhIGNhY2hlIGhpdCBjb3VudGVyIGlzIGNhbGN1bGF0ZWQgYnkKIHN1YnRyYWN0aW5nIHRoZSB0b3RhbCBmcm9tIHRoZSBwbGFjZSB3aGVyZSBpdCB3YXMgZmlyc3QgbWFya2VkIGF0CiB0aGUgc3RhcnQgb2YgdGhlIHF1ZXJ5CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovClVMbmczMiAKQ29tcGlsYXRpb25TdGF0czo6bWV0YWRhdGFDYWNoZUhpdHMoKQp7IAogIHJldHVybiBBY3RpdmVTY2hlbWFEQigpLT5nZXROQVRhYmxlREIoKS0+aGl0cygpIC0gbWRDYWNoZUhpdHNCZWdpbl87IAp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKbWV0aG9kIENvbXBpbGF0aW9uU3RhdHM6Om1ldGFkYXRhQ2FjaGVMb29rdXBzCgpUaGUgY3VycmVudCBtZXRhZGF0YSBjYWNoZSBsb29rdXAgY291bnRlciBpcyBjYWxjdWxhdGVkIGJ5CiBzdWJ0cmFjdGluZyB0aGUgdG90YWwgZnJvbSB0aGUgcGxhY2Ugd2hlcmUgaXQgd2FzIGZpcnN0IG1hcmtlZCBhdAogdGhlIHN0YXJ0IG9mIHRoZSBxdWVyeQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpVTG5nMzIgCkNvbXBpbGF0aW9uU3RhdHM6Om1ldGFkYXRhQ2FjaGVMb29rdXBzKCkKeyAKICByZXR1cm4gQWN0aXZlU2NoZW1hREIoKS0+Z2V0TkFUYWJsZURCKCktPmxvb2t1cHMoKSAtIAogICAgbWRDYWNoZUxvb2t1cHNCZWdpbl87IAp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKbWV0aG9kIENvbXBpbGF0aW9uU3RhdHM6OlF1ZXJ5Q2FjaGVTdGF0ZQoKIGdldCB0aGUgUXVlcnlDYWNoZVN0YXRlIGZvciB0aGlzIGNvbXBpbGF0aW9uCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkludDMyCkNvbXBpbGF0aW9uU3RhdHM6OmdldFF1ZXJ5Q2FjaGVTdGF0ZSgpCnsKICAvLyBzbyB3ZSBjYW4gYXNzZXJ0IGxhdGVyIHRoYXQgaXQgZm91bmQgYSB2YWxpZCBzdGF0dXMgIAogIFFDYWNoZVN0YXRlIHN0YXRlID0gUUNTVEFURV9VTktOT1dOOyAKCiAgUUNhY2hlU3RhdHMgcUNhY2hlU3RhdHNFbmQ7CiAgQ1VSUkVOVFFDQUNIRS0+Z2V0Q29tcGlsYXRpb25DYWNoZVN0YXRzKHFDYWNoZVN0YXRzRW5kKTsKICAvLwogIC8vIGNoZWNrIGlmIGl0knMgY2FjaGVhYmxlIG9yIG5vdAogIGlmIChxQ2FjaGVTdGF0c0VuZC5uQ2FjaGVhYmxlUCtxQ2FjaGVTdGF0c0VuZC5uQ2FjaGVhYmxlQiA+IAogICAgICBxQ2FjaGVTdGF0c0JlZ2luXy5uQ2FjaGVhYmxlUCsKICAgICAgcUNhY2hlU3RhdHNCZWdpbl8ubkNhY2hlYWJsZUIpCiAgeyAgIAogICAgLy8gaXSScyBjYWNoZWFibGUKCiAgICAvLyBjaGVjayBpZiBpdJJzIHRlbXBsYXRlIG9yIHRleHQgY2FjaGUgaGl0IG9yIG1pc3MKICAgIGlmIChxQ2FjaGVTdGF0c0VuZC5uQ2FjaGVIaXRzUFAgPiBxQ2FjaGVTdGF0c0JlZ2luXy5uQ2FjaGVIaXRzUFApCiAgICB7CiAgICAgIC8vIGl0knMgYSB0ZXh0IGNhY2hlIGhpdAogICAgICBzdGF0ZSA9IFFDU1RBVEVfVEVYVDsKICAgIH0KICAgIGVsc2UgCiAgICB7IAogICAgICAvLyBpdJJzIGEgdGV4dCBjYWNoZSBtaXNzCiAgICAgIGlmICggcUNhY2hlU3RhdHNFbmQubkNhY2hlSGl0c1ArcUNhY2hlU3RhdHNFbmQubkNhY2hlSGl0c0IgPiAKICAgICAgICAgICBxQ2FjaGVTdGF0c0JlZ2luXy5uQ2FjaGVIaXRzUCsKICAgICAgICAgICBxQ2FjaGVTdGF0c0JlZ2luXy5uQ2FjaGVIaXRzQiApCiAgICAgIHsKICAgICAgICAvLwogICAgICAgIC8vIGl0knMgYSB0ZW1wbGF0ZSBjYWNoZSBoaXQKICAgICAgICBzdGF0ZSA9IFFDU1RBVEVfVEVNUExBVEU7CiAgICAgIH0KICAgICAgZWxzZSAKICAgICAgeyAKICAgICAgICAvLyBpdJJzIGEgdGVtcGxhdGUgY2FjaGUgbWlzcwogICAgICAgIHN0YXRlID0gUUNTVEFURV9NSVNTX0NBQ0hFQUJMRTsKICAgICAgfQogICAgfQogIH0KICBlbHNlIAogIHsgCiAgICAvLwogICAgLy8gaXSScyBub3QgY2FjaGVhYmxlCiAgICBzdGF0ZSA9IFFDU1RBVEVfTUlTU19OT05DQUNIRUFCTEU7CiAgfQoKICAvLyBzaG91bGQgaGF2ZSBhIHZhbGlkIHFjYWNoZSBzdGF0ZSBub3cKICBpZiAoIWlzVmFsaWRRQ2FjaGVTdGF0ZShzdGF0ZSkpIHJldHVybiBRQ1NUQVRFX1VOS05PV047IAoKICByZXR1cm4gc3RhdGU7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgptZXRob2QgQ29tcGlsYXRpb25TdGF0czo6aGlzdG9ncmFtQ2FjaGVIaXRzCgpUaGUgY3VycmVudCBoaXN0b2dyYW0gY2FjaGUgaGl0IGNvdW50ZXIgaXMgY2FsY3VsYXRlZCBieQogc3VidHJhY3RpbmcgdGhlIHRvdGFsIGZyb20gdGhlIHBsYWNlIHdoZXJlIGl0IHdhcyBmaXJzdCBtYXJrZWQgYXQKIHRoZSBzdGFydCBvZiB0aGUgcXVlcnkKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KVUxuZzMyIApDb21waWxhdGlvblN0YXRzOjpoaXN0b2dyYW1DYWNoZUhpdHMoKQp7IAogIGlmIChDVVJSQ09OVEVYVF9ISVNUQ0FDSEUpCiAgICByZXR1cm4gQ1VSUkNPTlRFWFRfSElTVENBQ0hFLT5oaXRzKCkgLSBoQ2FjaGVIaXRzQmVnaW5fOyAKICBlbHNlCiAgICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCm1ldGhvZCBDb21waWxhdGlvblN0YXRzOjpoaXN0b2dyYW1DYWNoZUxvb2t1cHMKClRoZSBjdXJyZW50IGhpc3RvZ3JhbSBjYWNoZSBsb29rdXAgY291bnRlciBpcyBjYWxjdWxhdGVkIGJ5CiBzdWJ0cmFjdGluZyB0aGUgdG90YWwgZnJvbSB0aGUgcGxhY2Ugd2hlcmUgaXQgd2FzIGZpcnN0IG1hcmtlZCBhdAogdGhlIHN0YXJ0IG9mIHRoZSBxdWVyeQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpVTG5nMzIgCkNvbXBpbGF0aW9uU3RhdHM6Omhpc3RvZ3JhbUNhY2hlTG9va3VwcygpCnsgCiAgaWYgKENVUlJDT05URVhUX0hJU1RDQUNIRSkKICAgIHJldHVybiBDVVJSQ09OVEVYVF9ISVNUQ0FDSEUtPmxvb2t1cHMoKSAtIGhDYWNoZUxvb2t1cHNCZWdpbl87IAogIGVsc2UKICAgIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKbWV0aG9kIENvbXBpbGF0aW9uU3RhdHM6OmdldENvbXBpbGVJbmZvCgogcGFzcyBpbiBhIGJ1ZmZlciBhbmQgZ2V0IHRoZSBjb21waWxlIGluZm8gYmFjawoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCkNvbXBpbGF0aW9uU3RhdHM6OmdldENvbXBpbGVJbmZvKGNoYXIgKmNtcEluZm8pCnsKICBjbXBJbmZvWzBdID0gJ1wwJzsgLy9UQkQKfQoKSW50MzIgQ29tcGlsYXRpb25TdGF0czo6Z2V0Q29tcGlsZUluZm9MZW4oKSAKeyByZXR1cm4gc3RyX2xlbihjb21waWxlSW5mb18pOyB9Cgp2b2lkIENvbXBpbGF0aW9uU3RhdHM6OmluY3JPcHRDb250ZXh0cygpCnsgb3B0Q29udGV4dHNfKys7IH0KClVMbmczMiBDb21waWxhdGlvblN0YXRzOjpvcHRpbWl6YXRpb25Db250ZXh0cygpCnsgcmV0dXJuIG9wdENvbnRleHRzXzsgfSAKCnZvaWQgQ29tcGlsYXRpb25TdGF0czo6c2V0SXNSZWNvbXBpbGUoKQp7IGlzUmVjb21waWxlXyA9IFRSVUU7IH0KCk5BQm9vbGVhbiBDb21waWxhdGlvblN0YXRzOjppc1JlY29tcGlsZSgpIAp7IHJldHVybiBpc1JlY29tcGlsZV87IH0gIAoKSW50NjQgQ29tcGlsYXRpb25TdGF0czo6Y29tcGlsZVN0YXJ0VGltZSgpIAp7IHJldHVybiBjb21waWxlU3RhcnRUaW1lXzsgfQoKSW50NjQgQ29tcGlsYXRpb25TdGF0czo6Y29tcGlsZUVuZFRpbWUoKSAKeyByZXR1cm4gY29tcGlsZUVuZFRpbWVfOyB9Cgp2b2lkIENvbXBpbGF0aW9uU3RhdHM6OmR1bXBUb0ZpbGUoKQp7CiAgRklMRSAqbXlmID0gZm9wZW4gKCJDbXBTdGF0c0R1bXAiLCAiYWMiKTsKICBmcHJpbnRmKG15ZiwgIi0tLT09PT09PT09PSBCRUdJTiBORVcgU1RNVCBTVEFUUyA9PT09PT09PT0tLS1cbiIpOwoKICBjaGFyIGJlZ2luVGltZVsxMDBdOwogIGNoYXIgZW5kVGltZVsxMDBdOwogIGdldFRpbWVzdGFtcEFzQnVmZmVyKGNvbXBpbGVTdGFydFRpbWVfLCBiZWdpblRpbWUpOwogIGdldFRpbWVzdGFtcEFzQnVmZmVyKGNvbXBpbGVFbmRUaW1lXywgZW5kVGltZSk7CgogIGZwcmludGYobXlmLCAiICBDb21waWxhdGlvbiBTdGFydCBUaW1lOiAlc1xuIiwgYmVnaW5UaW1lKTsKICBmcHJpbnRmKG15ZiwgIiAgQ29tcGlsYXRpb24gRW5kIFRpbWU6ICVzXG4iLCBlbmRUaW1lKTsgCgogIGNoYXIgY21wSWRbQ09NUElMRVJfSURfTEVOXTsKICBnZXRDb21waWxlcklkKGNtcElkLCBDT01QSUxFUl9JRF9MRU4pOwogIGZwcmludGYobXlmLCAiICBDb21waWxlciBJZDogJXNcbiIsIGNtcElkKTsKICBmcHJpbnRmKG15ZiwgIiAgQWxsIENtcCBQaGFzZXMgRXhlY3V0aW9uIGxlbmd0aDogXG4iKTsKICBmcHJpbnRmKG15ZiwgIiAgICBCaW5kZXI6ICVkXG4iLCBjbXBQaGFzZUxlbmd0aChDb21waWxhdGlvblN0YXRzOjpDTVBfUEhBU0VfQklOREVSKSk7CiAgZnByaW50ZihteWYsICIgICAgbm9ybWFsaXplcjogJWRcbiIsIGNtcFBoYXNlTGVuZ3RoKENvbXBpbGF0aW9uU3RhdHM6OkNNUF9QSEFTRV9OT1JNQUxJWkVSKSk7CiAgZnByaW50ZihteWYsICIgICAgQW5hbHl6ZXI6ICVkXG4iLCBjbXBQaGFzZUxlbmd0aChDb21waWxhdGlvblN0YXRzOjpDTVBfUEhBU0VfQU5BTFlaRVIpKTsKICBmcHJpbnRmKG15ZiwgIiAgICBPcHRpbWl6ZXI6ICVkXG4iLCBjbXBQaGFzZUxlbmd0aChDb21waWxhdGlvblN0YXRzOjpDTVBfUEhBU0VfT1BUSU1JWkVSKSk7CiAgZnByaW50ZihteWYsICIgICAgR2VuZXJhdG9yOiAlZFxuIiwgY21wUGhhc2VMZW5ndGgoQ29tcGlsYXRpb25TdGF0czo6Q01QX1BIQVNFX0dFTkVSQVRPUikpOwogIGZwcmludGYobXlmLCAiICAgIEFsbCBDbXAgTGVuZ3RoOiAlZFxuIiwgY21wUGhhc2VMZW5ndGgoQ29tcGlsYXRpb25TdGF0czo6Q01QX1BIQVNFX0FMTCkpOwogIGZwcmludGYobXlmLCAiICBNZXRhZGF0YSBDYWNoZSBIaXRzOiAlZFxuIiwgbWV0YWRhdGFDYWNoZUhpdHMoKSk7CiAgZnByaW50ZihteWYsICIgIE1ldGFkYXRhIExvb2sgVXBzOiAlZFxuIiwgbWV0YWRhdGFDYWNoZUxvb2t1cHMoKSk7CiAgZnByaW50ZihteWYsICIgIFF1ZXJ5IENhY2hlIEhpdHM6ICVkXG4iLCBnZXRRdWVyeUNhY2hlU3RhdGUoKSk7CiAgZnByaW50ZihteWYsICIgIEhpc3RvZ3JhbSBDYWNoZSBIaXRzOiAlZFxuIiwgaGlzdG9ncmFtQ2FjaGVIaXRzKCkpOwogIGZwcmludGYobXlmLCAiICBIaXN0b2dyYW0gQ2FjaGUgTG9va3VwczogJWRcbiIsIGhpc3RvZ3JhbUNhY2hlTG9va3VwcygpKTsKICBmcHJpbnRmKG15ZiwgIiAgU3RtdCBIZWFwIGN1cnJlbnQgU2l6ZTogJWxkXG4iLCAoSW50NjQpIHN0bXRIZWFwQ3VycmVudFNpemUoKSk7CiAgZnByaW50ZihteWYsICIgIENvbnRleHQgSGVhcCBjdXJyZW50IHNpemU6ICVsZFxuIiwgKEludDY0KSBjeHRIZWFwQ3VycmVudFNpemUoKSk7CiAgZnByaW50ZihteWYsICIgIENvbXBpbGVyIE9wdGltaXphdGlvbiBUYXNrczogJWRcbiIsIG9wdGltaXphdGlvblRhc2tzKCkpOwogIGZwcmludGYobXlmLCAiICBDb21waWxlciBPcHRpbWl6YXRpb24gQ29udGV4dHM6ICVkXG4iLCBvcHRpbWl6YXRpb25Db250ZXh0cygpKTsKCiAgZnByaW50ZihteWYsICIgIGlzUmVjb21waWxlOiAiKTsKICBpZiAoaXNSZWNvbXBpbGUoKSkKICAgICAgZnByaW50ZihteWYsICJZZXNcbiIpOwogIGVsc2UKICAgICAgZnByaW50ZihteWYsICJOb1xuIik7CgogIGZwcmludGYobXlmLCAiLS0tPT09PT09PT09IEVORCBORVcgU1RNVCBTVEFUUyA9PT09PT09PT0tLS1cbiIpOwogIGZjbG9zZSAobXlmKTsKfQo=