Li4gQWxnb3JpdGhtcy9JdGVyYXRpb24gQWxnb3JpdGhtcy8vZm9sZAoKZm9sZAo9PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlCiAgICAgICAgLCB0eXBlbmFtZSBTdGF0ZQogICAgICAgICwgdHlwZW5hbWUgRm9yd2FyZE9wCiAgICAgICAgPgogICAgc3RydWN0IGZvbGQKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHN1Y2Nlc3NpdmUgYXBwbGljYXRpb24gb2YgYmluYXJ5IGBgRm9yd2FyZE9wYGAgdG8gdGhlIApyZXN1bHQgb2YgdGhlIHByZXZpb3VzIGBgRm9yd2FyZE9wYGAgaW52b2NhdGlvbiAoYGBTdGF0ZWBgIGlmIGl0J3MgdGhlIGZpcnN0IGNhbGwpIAphbmQgZXZlcnkgZWxlbWVudCBvZiB0aGUgc2VxdWVuY2UgaW4gdGhlIHJhbmdlIHxiZWdpbi9lbmQ8U2VxdWVuY2U+fCBpbiBvcmRlci4KCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvZm9sZC5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgICAgICB8IEEgc2VxdWVuY2UgdG8gaXRlcmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgU3RhdGVgYCAgICAgfCBBbnkgdHlwZSAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBpbml0aWFsIHN0YXRlIGZvciB0aGUgZmlyc3QgYGBGb3J3YXJkT3BgYCAgICAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFwcGxpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgRm9yd2FyZE9wYGAgfCBCaW5hcnkgfExhbWJkYSBFeHByZXNzaW9ufCAgICB8IFRoZSBvcGVyYXRpb24gdG8gYmUgZXhlY3V0ZWQgb24gZm9yd2FyZCAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYXZlcnNhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IHxGb3J3YXJkIFNlcXVlbmNlfCBgYHNgYCwgYmluYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgYGBvcGBgLCBhbmQgYXJiaXRyYXJ5IHR5cGUgYGBzdGF0ZWBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGZvbGQ8cyxzdGF0ZSxvcD46OnR5cGUgdDsgCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0bwogICAgICAgIAogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgdHlwZWRlZiBpdGVyX2ZvbGQ8CiAgICAgICAgICAgICAgcwogICAgICAgICAgICAsIHN0YXRlCiAgICAgICAgICAgICwgYXBwbHlfd3JhcDI8IGxhbWJkYTxvcD46OnR5cGUsIF8xLCBkZXJlZjxfMj4gPgogICAgICAgICAgICA+Ojp0eXBlIHQ7IAoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKTGluZWFyLiBFeGFjdGx5IGBgc2l6ZTxzPjo6dmFsdWVgYCBhcHBsaWNhdGlvbnMgb2YgYGBvcGBgLiAKCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiB2ZWN0b3I8bG9uZyxmbG9hdCxzaG9ydCxkb3VibGUsZmxvYXQsbG9uZyxsb25nIGRvdWJsZT4gdHlwZXM7CiAgICB0eXBlZGVmIGZvbGQ8CiAgICAgICAgICB0eXBlcwogICAgICAgICwgaW50XzwwPgogICAgICAgICwgaWZfPCBpc19mbG9hdDxfMj4sbmV4dDxfMT4sXzEgPgogICAgICAgID46OnR5cGUgbnVtYmVyX29mX2Zsb2F0czsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggbnVtYmVyX29mX2Zsb2F0czo6dmFsdWUsID09LCA0ICk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxBbGdvcml0aG1zfCwgfGFjY3VtdWxhdGV8LCB8cmV2ZXJzZV9mb2xkfCwgfGl0ZXJfZm9sZHwsIHxyZXZlcnNlX2l0ZXJfZm9sZHwsIHxjb3B5fCwgfGNvcHlfaWZ8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=