Li4gTWV0YWZ1bmN0aW9ucy9Db21wYXJpc29ucy8vbm90X2VxdWFsX3RvIHw2MAoKbm90X2VxdWFsX3RvCj09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBUMQogICAgICAgICwgdHlwZW5hbWUgVDIKICAgICAgICA+CiAgICBzdHJ1Y3Qgbm90X2VxdWFsX3RvCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKUmV0dXJucyBhIHRydWUtdmFsdWVkIHxJbnRlZ3JhbCBDb25zdGFudHwgaWYgYGBUMWBgIGFuZCBgYFQyYGAgYXJlIG5vdCBlcXVhbC4KCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvbm90X2VxdWFsX3RvLmhwcD4KICAgICNpbmNsdWRlIDxib29zdC9tcGwvY29tcGFyaXNvbi5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxOdW1lcmljIE1ldGFmdW5jdGlvbnwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBUMWBgLCBgYFQyYGB8IHxJbnRlZ3JhbCBDb25zdGFudHwgICAgICAgfCBPcGVyYXRpb24ncyBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCnxOb3RlOnwgfG51bWVyaWMgbWV0YWZ1bmN0aW9uIG5vdGV8IHwtLSBlbmQgbm90ZXwKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKCkZvciBhbnkgfEludGVncmFsIENvbnN0YW50fFwgcyBgYGMxYGAgYW5kIGBgYzJgYDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIG5vdF9lcXVhbF90bzxjMSxjMj46OnR5cGUgcjsgCgo6UmV0dXJuIHR5cGU6CiAgICB8SW50ZWdyYWwgQ29uc3RhbnR8LgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgdHlwZWRlZiBib29sXzwgKGMxOjp2YWx1ZSAhPSBjMjo6dmFsdWUpID4gcjsKCgouLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgbm90X2VxdWFsX3RvPGMxLGMyPiByOyAKCjpSZXR1cm4gdHlwZToKICAgIHxJbnRlZ3JhbCBDb25zdGFudHwuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0byAKCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICAgICBzdHJ1Y3QgciA6IG5vdF9lcXVhbF90bzxjMSxjMj46OnR5cGUge307CgoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKQW1vcnRpemVkIGNvbnN0YW50IHRpbWUuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBub3RfZXF1YWxfdG88IGludF88MD4sIGludF88MTA+ID4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggbm90X2VxdWFsX3RvPCBsb25nXzwxMD4sIGludF88MD4gPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfTk9UKCggbm90X2VxdWFsX3RvPCBsb25nXzwxMD4sIGludF88MTA+ID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxDb21wYXJpc29uc3wsIHxOdW1lcmljIE1ldGFmdW5jdGlvbnwsIHxudW1lcmljX2Nhc3R8LCB8ZXF1YWxfdG98LCB8bGVzc3wKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==