Li4gTWV0YWZ1bmN0aW9ucy9UeXBlIFNlbGVjdGlvbi8vZXZhbF9pZl9jIHw0MAoKZXZhbF9pZl9jCj09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8IAogICAgICAgICAgYm9vbCBjCiAgICAgICAgLCB0eXBlbmFtZSBGMQogICAgICAgICwgdHlwZW5hbWUgRjIKICAgICAgICA+CiAgICBzdHJ1Y3QgZXZhbF9pZl9jCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKRXZhbHVhdGVzIG9uZSBvZiBpdHMgdHdvIHxudWxsYXJ5IG1ldGFmdW5jdGlvbnwgYXJndW1lbnRzLCBgYEYxYGAgb3IgYGBGMmBgLCBkZXBlbmRpbmcgCm9uIHRoZSB2YWx1ZSBvZiBpbnRlZ3JhbCBjb25zdGFudCBgYGNgYC4gYGBldmFsX2lmX2M8YyxmMSxmMj46OnR5cGVgYCBpcyBhIHNob3JjdXQgCm5vdGF0aW9uIGZvciBgYGV2YWxfaWY8IGJvb2xfPGM+LGYxLGYyID46OnR5cGVgYC4KCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvZXZhbF9pZi5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgY2BgICAgICAgICAgfCBBbiBpbnRlZ3JhbCBjb25zdGFudCAgICAgICAgICAgICAgfCBBbiBldmFsdWF0aW9uIGNvbmRpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgRjFgYCwgYGBGMmBgfCBOdWxsYXJ5IHxNZXRhZnVuY3Rpb258ICAgICAgICAgICAgfCBNZXRhZnVuY3Rpb25zIHRvIHNlbGVjdCBmb3IgZXZhbHVhdGlvbiBmcm9tLiAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IGludGVncmFsIGNvbnN0YW50IGBgY2BgIGFuZCBudWxsYXJ5IHxNZXRhZnVuY3Rpb258XCBzIGBgZjFgYCwgYGBmMmBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGV2YWxfaWZfYzxjLGYxLGYyPjo6dHlwZSB0OwoKOlJldHVybiB0eXBlOgogICAgQW55IHR5cGUuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0byBgYHR5cGVkZWYgZXZhbF9pZjwgYm9vbF88Yz4sZjEsZjIgPjo6dHlwZSB0O2BgIAoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0eXBlZGVmIGV2YWxfaWZfYzwgdHJ1ZSwgaWRlbnRpdHk8Y2hhcj4sIGlkZW50aXR5PGxvbmc+ID46OnR5cGUgdDE7CiAgICB0eXBlZGVmIGV2YWxfaWZfYzwgZmFsc2UsIGlkZW50aXR5PGNoYXI+LCBpZGVudGl0eTxsb25nPiA+Ojp0eXBlIHQyOwoKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPHQxLGNoYXI+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGlzX3NhbWU8dDIsbG9uZz4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxNZXRhZnVuY3Rpb25zfCwgfEludGVncmFsIENvbnN0YW50fCwgfGV2YWxfaWZ8LCB8aWZffCwgfGJvb2xffAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK