Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9yZXZlcnNlX3JlcGxhY2VfaWYgfDE1MAoKcmV2ZXJzZV9yZXBsYWNlX2lmCj09PT09PT09PT09PT09PT09PQoKClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPAogICAgICAgICAgdHlwZW5hbWUgU2VxdWVuY2UKICAgICAgICAsIHR5cGVuYW1lIFByZWQKICAgICAgICAsIHR5cGVuYW1lIEluID0gfHVuc3BlY2lmaWVkfAogICAgICAgID4KICAgIHN0cnVjdCByZXZlcnNlX3JlcGxhY2VfaWYKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIGEgcmV2ZXJzZWQgY29weSBvZiB0aGUgb3JpZ2luYWwgc2VxdWVuY2Ugd2hlcmUgZXZlcnkgdHlwZSB0aGF0IHNhdGlzZmllcyAKdGhlIHByZWRpY2F0ZSBgYFByZWRgYCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGBgTmV3VHlwZWBgLiAKCnx0cmFuc2Zvcm1hdGlvbiBhbGdvcml0aG0gZGlzY2xhaW1lcnwKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9yZXBsYWNlX2lmLmhwcD4KCgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxSZXZlcnNpYmxlIEFsZ29yaXRobXwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBTZXF1ZW5jZWBgICB8IHxGb3J3YXJkIFNlcXVlbmNlfCAgICAgICAgICAgICAgICB8IEFuIG9yaWdpbmFsIHNlcXVlbmNlLiAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgUHJlZGBgICAgICAgfCBVbmFyeSB8TGFtYmRhIEV4cHJlc3Npb258ICAgICAgICAgfCBBIHJlcGxhY2VtZW50IGNvbmRpdGlvbi4gICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYE5ld1R5cGVgYCAgIHwgQW55IHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQSB0eXBlIHRvIHJlcGxhY2Ugd2l0aC4gICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBJbmBgICAgICAgICB8IHxJbnNlcnRlcnwgICAgICAgICAgICAgICAgICAgICAgICB8IEFuIGluc2VydGVyLiAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgp8U2VtYW50aWNzIGRpc2NsYWltZXIuLi58IHxSZXZlcnNpYmxlIEFsZ29yaXRobXwuCgpGb3IgYW55IHxGb3J3YXJkIFNlcXVlbmNlfCBgYHNgYCwgYW4gdW5hcnkgfExhbWJkYSBFeHByZXNzaW9ufCBgYHByZWRgYCwKYW4gfEluc2VydGVyfCBgYGluYGAsIGFuZCBhcmJpdHJhcnkgdHlwZSBgYHhgYDoKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiByZXZlcnNlX3JlcGxhY2VfaWY8cyxwcmVkLHgsaW4+Ojp0eXBlIHI7IAoKOlJldHVybiB0eXBlOgogICAgQSB0eXBlLgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgICAgIAogICAgICAgIHR5cGVkZWYgbGFtYmRhPHByZWQ+Ojp0eXBlIHA7CiAgICAgICAgdHlwZWRlZiByZXZlcnNlX3RyYW5zZm9ybTwgcywgaWZfPCBhcHBseV93cmFwMTxwLF8xPix4LF8xPiwgaW4gPjo6dHlwZSByOyAKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkxpbmVhci4gUGVyZm9ybXMgZXhhY3RseSBgYHNpemU8cz46OnZhbHVlYGAgYXBwbGljYXRpb25zIG9mIGBgcHJlZGBgLCBhbmQgYXQgbW9zdCAKYGBzaXplPHM+Ojp2YWx1ZWBgIGluc2VydGlvbnMuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHR5cGVkZWYgdmVjdG9yX2M8aW50LDEsNCw1LDIsNyw1LDMsNT4gbnVtYmVyczsKICAgIHR5cGVkZWYgdmVjdG9yX2M8aW50LDEsNCwwLDIsMCwwLDMsMD4gZXhwZWN0ZWQ7CiAgICB0eXBlZGVmIHJldmVyc2VfcmVwbGFjZV9pZjwgCiAgICAgICAgICBudW1iZXJzCiAgICAgICAgLCBncmVhdGVyPCBfLCBpbnRfPDQ+ID4KICAgICAgICAsIGludF88MD4KICAgICAgICAsIGZyb250X2luc2VydGVyPCB2ZWN0b3I8PiA+CiAgICAgICAgPjo6dHlwZSByZXN1bHQ7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBlcXVhbDwgcmVzdWx0LGV4cGVjdGVkLCBlcXVhbF90bzxfLF8+ID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxUcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zfCwgfFJldmVyc2libGUgQWxnb3JpdGhtfCwgfHJlcGxhY2VfaWZ8LCB8cmV2ZXJzZV9yZXBsYWNlfCwgfHJlbW92ZV9pZnwsIHx0cmFuc2Zvcm18CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=