Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9yZXZlcnNlX2NvcHlfaWYgfDEyMAoKcmV2ZXJzZV9jb3B5X2lmCj09PT09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBTZXF1ZW5jZQogICAgICAgICwgdHlwZW5hbWUgUHJlZAogICAgICAgICwgdHlwZW5hbWUgSW4gPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgPgogICAgc3RydWN0IHJldmVyc2VfY29weV9pZgogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgYSByZXZlcnNlZCwgZmlsdGVyZWQgY29weSBvZiB0aGUgb3JpZ2luYWwgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgCmVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGUgcHJlZGljYXRlIGBgUHJlZGBgLgoKfHRyYW5zZm9ybWF0aW9uIGFsZ29yaXRobSBkaXNjbGFpbWVyfAoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL2NvcHlfaWYuaHBwPgoKCk1vZGVsIG9mCi0tLS0tLS0tCgp8UmV2ZXJzaWJsZSBBbGdvcml0aG18CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgICAgICAgICAgfCBBIHNlcXVlbmNlIHRvIGNvcHkuICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYFByZWRgYCAgICAgIHwgVW5hcnkgfExhbWJkYSBFeHByZXNzaW9ufCAgICAgICAgIHwgQSBjb3B5aW5nIGNvbmRpdGlvbi4gICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBJbmBgICAgICAgICB8IHxJbnNlcnRlcnwgICAgICAgICAgICAgICAgICAgICAgICB8IEFuIGluc2VydGVyLiAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgp8U2VtYW50aWNzIGRpc2NsYWltZXIuLi58IHxSZXZlcnNpYmxlIEFsZ29yaXRobXwuCgpGb3IgYW55IHxGb3J3YXJkIFNlcXVlbmNlfCBgYHNgYCwgYW4gdW5hcnkgfExhbWJkYSBFeHByZXNzaW9ufCBgYHByZWRgYCwgYW5kIAphbiB8SW5zZXJ0ZXJ8IGBgaW5gYDoKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiByZXZlcnNlX2NvcHlfaWY8cyxwcmVkLGluPjo6dHlwZSByOyAKCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUgCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0byAKICAgICAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgICAgICAKICAgICAgICB0eXBlZGVmIGxhbWJkYTxwcmVkPjo6dHlwZSBwOwogICAgICAgIHR5cGVkZWYgbGFtYmRhPGluOjpvcGVyYXRpb24+Ojp0eXBlIG9wOwogICAgICAgIAogICAgICAgIHR5cGVkZWYgcmV2ZXJzZV9mb2xkPAogICAgICAgICAgICAgIHMKICAgICAgICAgICAgLCBpbjo6c3RhdGUKICAgICAgICAgICAgLCBldmFsX2lmPAogICAgICAgICAgICAgICAgICBhcHBseV93cmFwXCBgYDFgYFw8cCxfMj4KICAgICAgICAgICAgICAgICwgYXBwbHlfd3JhcFwgYGAyYGBcPG9wLF8xLF8yPgogICAgICAgICAgICAgICAgLCBpZGVudGl0eTxfMT4KICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgPjo6dHlwZSByOwoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKTGluZWFyLiBFeGFjdGx5IGBgc2l6ZTxzPjo6dmFsdWVgYCBhcHBsaWNhdGlvbnMgb2YgYGBwcmVkYGAsIGFuZCBhdCAKbW9zdCBgYHNpemU8cz46OnZhbHVlYGAgYXBwbGljYXRpb25zIG9mIGBgaW46Om9wZXJhdGlvbmBgLiAKCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiByZXZlcnNlX2NvcHlfaWY8CiAgICAgICAgICByYW5nZV9jPGludCwwLDEwPgogICAgICAgICwgbGVzczwgXzEsIGludF88NT4gPgogICAgICAgICwgZnJvbnRfaW5zZXJ0ZXI8IHZlY3Rvcjw+ID4KICAgICAgICA+Ojp0eXBlIHJlc3VsdDsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggc2l6ZTxyZXN1bHQ+Ojp2YWx1ZSwgPT0sIDUgKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBlcXVhbDxyZXN1bHQscmFuZ2VfYzxpbnQsMCw1PiA+ICkpOwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8VHJhbnNmb3JtYXRpb24gQWxnb3JpdGhtc3wsIHxSZXZlcnNpYmxlIEFsZ29yaXRobXwsIHxjb3B5X2lmfCwgfHJldmVyc2VfY29weXwsIHxyZW1vdmVfaWZ8LCB8cmVwbGFjZV9pZnwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==