Li4gTWV0YWZ1bmN0aW9ucy9Mb2dpY2FsIE9wZXJhdGlvbnMvL29yXyB8MjAKCm9yXF8KPT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8IAogICAgICAgICAgdHlwZW5hbWUgRjEKICAgICAgICAsIHR5cGVuYW1lIEYyCiAgICAgICAgfC4uLnwKICAgICAgICAsIHR5cGVuYW1lIEZcICpuKiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3Qgb3JcXwogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgdGhlIHJlc3VsdCBvZiBzaG9ydC1jaXJjdWl0ICpsb2dpY2FsIG9yKiAoYGB8fGBgKSBvcGVyYXRpb24gb24gaXRzIGFyZ3VtZW50cy4KCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvb3IuaHBwPgogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9sb2dpY2FsLmhwcD4KCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgfEYxLi4uRm58ICAgICB8IE51bGxhcnkgfE1ldGFmdW5jdGlvbnwgICAgfCBPcGVyYXRpb24ncyBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFyYml0cmFyeSBudWxsYXJ5IHxNZXRhZnVuY3Rpb258XCBzIHxmMS4uLmZufDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIG9yXzxmMSxmMixcIHwuLi58XCAsZlwgKm4qXD46OnR5cGUgcjsKCjpSZXR1cm4gdHlwZToKICAgIHxJbnRlZ3JhbCBDb25zdGFudHwuCgo6U2VtYW50aWNzOgogICAgYGByYGAgaXMgYGB0cnVlX2BgIGlmIGVpdGhlciBvZiBgYGYxOjp0eXBlOjp2YWx1ZWBgLCBgYGYyOjp0eXBlOjp2YWx1ZWBgLC4uLiAKICAgIGBgZm46OnR5cGU6OnZhbHVlYGAgZXhwcmVzc2lvbnMgZXZhbHVhdGVzIHRvIGBgdHJ1ZWBgLCBhbmQgYGBmYWxzZV9gYCBvdGhlcndpc2U7IAogICAgZ3VhcmFudGVlcyBsZWZ0LXRvLXJpZ2h0IGV2YWx1YXRpb247IHRoZSBvcGVyYW5kcyBzdWJzZXF1ZW50IHRvIHRoZSBmaXJzdCAKICAgIGBgZmBgXCAqaSogbWV0YWZ1bmN0aW9uIHRoYXQgZXZhbHVhdGVzIHRvIGBgdHJ1ZWBgIGFyZSBub3QgZXZhbHVhdGVkLiAKCi4uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBvcl88ZjEsZjIsXCB8Li4ufFwgLGZcICpuKlw+IHI7Cgo6UmV0dXJuIHR5cGU6CiAgICB8SW50ZWdyYWwgQ29uc3RhbnR8LgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgc3RydWN0IHIgOiBvcl88ZjEsZjIsXCB8Li4ufFwgLGZcICpuKlw+Ojp0eXBlIHt9OwoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICBzdHJ1Y3QgdW5rbm93bjsKCiAgICBCT09TVF9NUExfQVNTRVJUKCggb3JfPCB0cnVlXF8sdHJ1ZVxfID4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggb3JfPCBmYWxzZVxfLHRydWVcXyA+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIG9yXzwgdHJ1ZVxfLGZhbHNlXF8gPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfTk9UKCggb3JfPCBmYWxzZVxfLGZhbHNlXF8gPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBvcl88IHRydWVcXyx1bmtub3duID4gKSk7IC8vIE9LCiAgICBCT09TVF9NUExfQVNTRVJUKCggb3JfPCB0cnVlXF8sdW5rbm93bix1bmtub3duID4gKSk7IC8vIE9LIHRvbwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8TWV0YWZ1bmN0aW9uc3wsIHxMb2dpY2FsIE9wZXJhdGlvbnN8LCB8YW5kX3wsIHxub3RffAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK