Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9yZXZlcnNlX3JlcGxhY2UgfDE0MAoKcmV2ZXJzZV9yZXBsYWNlCj09PT09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBTZXF1ZW5jZQogICAgICAgICwgdHlwZW5hbWUgT2xkVHlwZQogICAgICAgICwgdHlwZW5hbWUgTmV3VHlwZQogICAgICAgICwgdHlwZW5hbWUgSW4gPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgPgogICAgc3RydWN0IHJldmVyc2VfcmVwbGFjZQogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgYSByZXZlcnNlZCBjb3B5IG9mIHRoZSBvcmlnaW5hbCBzZXF1ZW5jZSB3aGVyZSBldmVyeSB0eXBlIGlkZW50aWNhbCB0byBgYE9sZFR5cGVgYCAKaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBgYE5ld1R5cGVgYC4gCgp8dHJhbnNmb3JtYXRpb24gYWxnb3JpdGhtIGRpc2NsYWltZXJ8CgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvcmVwbGFjZS5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxSZXZlcnNpYmxlIEFsZ29yaXRobXwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBTZXF1ZW5jZWBgICB8IHxGb3J3YXJkIFNlcXVlbmNlfCAgICAgICAgICAgICAgICB8IEEgb3JpZ2luYWwgc2VxdWVuY2UuICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgT2xkVHlwZWBgICAgfCBBbnkgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBIHR5cGUgdG8gYmUgcmVwbGFjZWQuICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYE5ld1R5cGVgYCAgIHwgQW55IHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQSB0eXBlIHRvIHJlcGxhY2Ugd2l0aC4gICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBJbmBgICAgICAgICB8IHxJbnNlcnRlcnwgICAgICAgICAgICAgICAgICAgICAgICB8IEFuIGluc2VydGVyLiAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgp8U2VtYW50aWNzIGRpc2NsYWltZXIuLi58IHxSZXZlcnNpYmxlIEFsZ29yaXRobXwuCgpGb3IgYW55IHxGb3J3YXJkIFNlcXVlbmNlfCBgYHNgYCwgYW4gfEluc2VydGVyfCBgYGluYGAsIGFuZCBhcmJpdHJhcnkgdHlwZXMgYGB4YGAgYW5kIGBgeWBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHJldmVyc2VfcmVwbGFjZTxzLHgseSxpbj46OnR5cGUgcjsgCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCiAKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgdHlwZWRlZiByZXZlcnNlX3JlcGxhY2VfaWY8IHMseSxpc19zYW1lPF8seD4saW4gPjo6dHlwZSByOyAKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkxpbmVhci4gUGVyZm9ybXMgZXhhY3RseSBgYHNpemU8cz46OnZhbHVlYGAgY29tcGFyaXNvbnMgZm9yIAppZGVudGl0eSAvIGluc2VydGlvbnMuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHR5cGVkZWYgdmVjdG9yPGludCxmbG9hdCxjaGFyLGZsb2F0LGZsb2F0LGRvdWJsZT4gdHlwZXM7CiAgICB0eXBlZGVmIHZlY3Rvcjxkb3VibGUsZG91YmxlLGRvdWJsZSxjaGFyLGRvdWJsZSxpbnQ+IGV4cGVjdGVkOwogICAgdHlwZWRlZiByZXZlcnNlX3JlcGxhY2U8IHR5cGVzLGZsb2F0LGRvdWJsZSA+Ojp0eXBlIHJlc3VsdDsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGVxdWFsPCByZXN1bHQsZXhwZWN0ZWQgPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfFRyYW5zZm9ybWF0aW9uIEFsZ29yaXRobXN8LCB8UmV2ZXJzaWJsZSBBbGdvcml0aG18LCB8cmVwbGFjZXwsIHxyZXZlcnNlX3JlcGxhY2VfaWZ8LCB8cmVtb3ZlfCwgfHJldmVyc2VfdHJhbnNmb3JtfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK