Li4gSXRlcmF0b3JzL0l0ZXJhdG9yIE1ldGFmdW5jdGlvbnMvL2Rpc3RhbmNlIHwyMAoKZGlzdGFuY2UKPT09PT09PT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPAogICAgICAgICAgdHlwZW5hbWUgRmlyc3QKICAgICAgICAsIHR5cGVuYW1lIExhc3QKICAgICAgICA+CiAgICBzdHJ1Y3QgZGlzdGFuY2UKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGBgRmlyc3RgYCBhbmQgYGBMYXN0YGAgaXRlcmF0b3JzLCB0aGF0IGlzLCBhbiAKfEludGVncmFsIENvbnN0YW50fCBgYG5gYCBzdWNoIHRoYXQgYGBhZHZhbmNlPEZpcnN0LG4+Ojp0eXBlYGAgaXMgCmlkZW50aWNhbCB0byBgYExhc3RgYC4KCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvZGlzdGFuY2UuaHBwPgoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYEZpcnN0YGAsICAgIHwgfEZvcndhcmQgSXRlcmF0b3J8ICAgICAgICB8IEl0ZXJhdG9ycyB0byBjb21wdXRlIGEgICAgICAgICAgICB8CnwgYGBMYXN0YGAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkaXN0YW5jZSBiZXR3ZWVuLiAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCk1vZGVsIE9mCi0tLS0tLS0tCgp8VGFnIERpc3BhdGNoZWQgTWV0YWZ1bmN0aW9ufAoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IHxGb3J3YXJkIEl0ZXJhdG9yfFwgcyBgYGZpcnN0YGAgYW5kIGBgbGFzdGBgOgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgZGlzdGFuY2U8Zmlyc3QsbGFzdD46OnR5cGUgbjsgCgo6UmV0dXJuIHR5cGU6CiAgICB8SW50ZWdyYWwgQ29uc3RhbnR8LgoKOlByZWNvbmRpdGlvbjoKICAgIFtgYGZpcnN0YGAsIGBgbGFzdGBgKSBpcyBhIHZhbGlkIHJhbmdlLgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8KICAgIAogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgdHlwZWRlZiBpdGVyX2ZvbGQ8CiAgICAgICAgICAgICAgaXRlcmF0b3JfcmFuZ2U8Zmlyc3QsbGFzdD4KICAgICAgICAgICAgLCBsb25nXzwwPgogICAgICAgICAgICAsIG5leHQ8XzE+CiAgICAgICAgICAgID46OnR5cGUgbjsKICAgICAgICAKCjpQb3N0Y29uZGl0aW9uOgogICAgYGBpc19zYW1lPCBhZHZhbmNlPGZpcnN0LG4+Ojp0eXBlLCBsYXN0ID46OnZhbHVlID09IHRydWVgYC4KCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkFtb3J0aXplZCBjb25zdGFudCB0aW1lIGlmIGBgZmlyc3RgYCBhbmQgYGBsYXN0YGAgYXJlIHxSYW5kb20gQWNjZXNzIEl0ZXJhdG9yfFwgcywKb3RoZXJ3aXNlIGxpbmVhciB0aW1lLgoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0eXBlZGVmIHJhbmdlX2M8aW50LDAsMTA+Ojp0eXBlIHJhbmdlOwogICAgdHlwZWRlZiBiZWdpbjxyYW5nZT46OnR5cGUgZmlyc3Q7CiAgICB0eXBlZGVmIGVuZDxyYW5nZT46OnR5cGUgbGFzdDsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggKGRpc3RhbmNlPGZpcnN0LGxhc3Q+Ojp2YWx1ZSksID09LCAxMCk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxJdGVyYXRvcnN8LCB8VGFnIERpc3BhdGNoZWQgTWV0YWZ1bmN0aW9ufCwgfGFkdmFuY2V8LCB8bmV4dHwsIHxwcmlvcnwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==