Li4gU2VxdWVuY2VzL0ludHJpbnNpYyBNZXRhZnVuY3Rpb25zLy9iZWdpbgoKYmVnaW4KPT09PT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPAogICAgICAgICAgdHlwZW5hbWUgWAogICAgICAgID4KICAgIHN0cnVjdCBiZWdpbgogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHNlcXVlbmNlLiBJZgp0aGUgYXJndW1lbnQgaXMgbm90IGEgfEZvcndhcmQgU2VxdWVuY2V8LCByZXR1cm5zIHx2b2lkX3wuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL2JlZ2luX2VuZC5ocHA+CgoKCk1vZGVsIG9mCi0tLS0tLS0tCgp8VGFnIERpc3BhdGNoZWQgTWV0YWZ1bmN0aW9ufAoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYFhgYCAgICAgICAgIHwgQW55IHR5cGUgICAgICAgICAgfCBBIHR5cGUgd2hvc2UgYmVnaW4gaXRlcmF0b3IsIGlmIGFueSwgd2lsbCBiZSAgICAgIHwKfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCByZXR1cm5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFueSBhcmJpdHJhcnkgdHlwZSBgYHhgYDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGJlZ2luPHg+Ojp0eXBlIGZpcnN0OwoKOlJldHVybiB0eXBlOgogICAgfEZvcndhcmQgSXRlcmF0b3J8IG9yIHx2b2lkX3wuCgo6U2VtYW50aWNzOgogICAgSWYgYGB4YGAgaXMgYSB8Rm9yd2FyZCBTZXF1ZW5jZXwsIGBgZmlyc3RgYCBpcyBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgCiAgICBmaXJzdCBlbGVtZW50IG9mIGBgc2BgOyBvdGhlcndpc2UgYGBmaXJzdGBgIGlzIHx2b2lkX3wuCiAgICAKOlBvc3Rjb25kaXRpb246CiAgICBJZiBgYGZpcnN0YGAgaXMgYW4gaXRlcmF0b3IsIGl0IGlzIGVpdGhlciBkZXJlZmVyZW5jZWFibGUgb3IgcGFzdC10aGUtZW5kOyBpdCAKICAgIGlzIHBhc3QtdGhlLWVuZCBpZiBhbmQgb25seSBpZiBgYHNpemU8eD46OnZhbHVlID09IDBgYC4gCgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpBbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiB2ZWN0b3I8IHVuc2lnbmVkIGNoYXIsdW5zaWduZWQgc2hvcnQsCiAgICAgICAgdW5zaWduZWQgaW50LHVuc2lnbmVkIGxvbmcgPiB1bnNpZ25lZF90eXBlczsKICAgIAogICAgdHlwZWRlZiBiZWdpbjx1bnNpZ25lZF90eXBlcz46OnR5cGUgaXRlcjsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPCBkZXJlZjxpdGVyPjo6dHlwZSwgdW5zaWduZWQgY2hhciA+ICkpOwogCiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgYmVnaW48aW50Pjo6dHlwZSwgdm9pZFxfID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxJdGVyYXRvcnN8LCB8Rm9yd2FyZCBTZXF1ZW5jZXwsIHxlbmR8LCB8c2l6ZXwsIHxlbXB0eXwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==