Li4gTWFjcm9zL0ludHJvc3BlY3Rpb24vL0JPT1NUX01QTF9IQVNfWFhYX1RSQUlUX05BTUVEX0RFRgoKQk9PU1RfTVBMX0hBU19YWFhfVFJBSVRfTkFNRURfREVGCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAjZGVmaW5lIEJPT1NUX01QTF9IQVNfWFhYX1RSQUlUX05BTUVEX0RFRih0cmFpdCwgbmFtZSwgZGVmYXVsdFxfKSBcXAogICAgICAgIHx1bnNwZWNpZmllZC10b2tlbi1zZXF8IFxcCiAgICAvXCpcKi8KCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKRXhwYW5kcyBpbnRvIGEgZGVmaW5pdGlvbiBvZiBhIGJvb2xlYW4gdW5hcnkgfE1ldGFmdW5jdGlvbnwgYGB0cmFpdGBgIApzdWNoIHRoYXQgZm9yIGFueSB0eXBlIGBgeGBgIGBgdHJhaXQ8eD46OnZhbHVlID09IHRydWVgYCBpZiBhbmQgb25seQppZiBgYHhgYCBpcyBhIGNsYXNzIHR5cGUgYW5kIGhhcyBhIG5lc3RlZCB0eXBlIG1lbWViZXIgYGB4OjpuYW1lYGAuCgpPbiB0aGUgZGVmaWNpZW50IGNvbXBpbGVycyBub3QgY2FwYWJhbGUgb2YgcGVyZm9ybWluZyB0aGUgZGV0ZWN0aW9uLCAKYGB0cmFpdDx4Pjo6dmFsdWVgYCBhbHdheXMgcmV0dXJucyBhIGZhbGxiYWNrIHZhbHVlIGBgZGVmYXVsdF9gYC4gCkEgYm9vbGVhbiBjb25maWd1cmFpb24gbWFjcm8sIHxCT09TVF9NUExfQ0ZHX05PX0hBU19YWFh8LCBpcyBwcm92aWRlZCAKdG8gc2lnbmFsIG9yIG92ZXJyaWRlIHRoZSAiZGVmaWNpZW50IiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyIGNvbXBpbGVyLgp8Tm90ZTp8IFRoZSBmYWxsYmFjayB2YWx1ZSBjYW4gYWxzbyBiZSBwcm92aWRlZCBhdCB0aGUgcG9pbnQgb2YgdGhlIAptZXRhZnVuY3Rpb24gaW52b2NhdGlvbjsgc2VlIHRoZSBgRXhwcmVzc2lvbiBzZW1hbnRpY3NgIHNlY3Rpb24gZm9yIApkZXRhaWxzIHwtLSBlbmQgbm90ZXwKCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvaGFzX3h4eC5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgdHJhaXRgYCAgICAgfCBBIGxlZ2FsIGlkZW50aWZpZXIgdG9rZW4gICAgICB8IEEgbmFtZSBvZiB0aGUgbWV0YWZ1bmN0aW9uIHRvIGJlIGdlbmVyYXRlZC4gICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgbmFtZWBgICAgICAgfCBBIGxlZ2FsIGlkZW50aWZpZXIgdG9rZW4gICAgICB8IEEgbmFtZSBvZiB0aGUgbWVtYmVyIGJlaW5nIGRldGVjdGVkLiAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgZGVmYXVsdF9gYCAgfCBBbiBib29sZWFuIGNvbnN0YW50ICAgICAgICAgICB8IEEgZmFsbGJhY2sgdmFsdWUgZm9yIHRoZSBkZWZpY2llbnQgY29tcGlsZXJzLiAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IGxlZ2FsIEMrKyBpZGVudGlmaWVycyBgYHRyYWl0YGAgYW5kIGBgbmFtZWBgLCBib29sZWFuIGNvbnN0YW50IGV4cHJlc3Npb24gYGBjMWBgLCAKYm9vbGVhbiB8SW50ZWdyYWwgQ29uc3RhbnR8IGBgYzJgYCwgYW5kIGFyYml0cmFyeSB0eXBlIGBgeGBgOgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIEJPT1NUX01QTF9IQVNfWFhYX1RSQUlUX05BTUVEX0RFRih0cmFpdCwgbmFtZSwgYzEpCgo6UHJlY29uZGl0aW9uOgogICAgQXBwZWFycyBhdCBuYW1lc3BhY2Ugc2NvcGUuCgo6UmV0dXJuIHR5cGU6CiAgICBOb25lLgoKOlNlbWFudGljczoKICAgIEV4cGFuZHMgaW50byBhbiBlcXVpdmFsZW50IG9mIHRoZSBmb2xsb3dpbmcgY2xhc3MgdGVtcGxhdGUgZGVmaW5pdGlvbgoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgdGVtcGxhdGU8IHR5cGVuYW1lIFgsIHR5cGVuYW1lIGZhbGxiYWNrID0gYm9vc3Q6Om1wbDo6Ym9vbF88YzE+ID4KICAgICAgICBzdHJ1Y3QgdHJhaXQKICAgICAgICB7CiAgICAgICAgICAgIC8vIHx1bnNwZWNpZmllZHwKICAgICAgICAgICAgLy8gLi4uCiAgICAgICAgfTsKICAgICAgICAKICAgIHdoZXJlIGBgdHJhaXRgYCBpcyBhIGJvb2xlYW4gfE1ldGFmdW5jdGlvbnwgd2l0aCB0aGUgZm9sbG93aW5nIHNlbWFudGljczoKICAgIAogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgICAgICB0eXBlZGVmIHRyYWl0PHg+Ojp0eXBlIHI7CgogICAgOlJldHVybiB0eXBlOgogICAgICAgIHxJbnRlZ3JhbCBDb25zdGFudHwuCgogICAgOlNlbWFudGljczoKICAgICAgICBJZiB8Qk9PU1RfTVBMX0NGR19OT19IQVNfWFhYfCBpcyBkZWZpbmVkLCBgYHI6OnZhbHVlID09IGMxYGA7CiAgICAgICAgb3RoZXJ3aXNlLCBgYHI6OnZhbHVlID09IHRydWVgYCBpZiBhbmQgb25seSBpZiBgYHhgYCBpcyBhIGNsYXNzIHR5cGUgCiAgICAgICAgdGhhdCBoYXMgYSBuZXN0ZWQgdHlwZSBtZW1lYmVyIGBgeDo6bmFtZWBgLgogICAgCiAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgdHlwZWRlZiB0cmFpdDwgeCxjMiA+Ojp0eXBlIHI7CgogICAgOlJldHVybiB0eXBlOgogICAgICAgIHxJbnRlZ3JhbCBDb25zdGFudHwuCgogICAgOlNlbWFudGljczoKICAgICAgICBJZiB8Qk9PU1RfTVBMX0NGR19OT19IQVNfWFhYfCBpcyBkZWZpbmVkLCBgYHI6OnZhbHVlID09IGMyOjp2YWx1ZWBgOwogICAgICAgIG90aGVyd2lzZSwgZXF1aXZhbGVudCB0bwoKICAgICAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgICAgICB0eXBlZGVmIHRyYWl0PHg+Ojp0eXBlIHI7CiAgICAgICAgCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgQk9PU1RfTVBMX0hBU19YWFhfVFJBSVRfTkFNRURfREVGKGhhc194eHgsIHh4eCwgZmFsc2UpCgogICAgc3RydWN0IHRlc3QxIHt9OwogICAgc3RydWN0IHRlc3QyIHsgdm9pZCB4eHgoKTsgfTsKICAgIHN0cnVjdCB0ZXN0MyB7IGludCB4eHg7IH07CiAgICBzdHJ1Y3QgdGVzdDQgeyBzdGF0aWMgaW50IHh4eCgpOyB9OwogICAgc3RydWN0IHRlc3Q1IHsgdGVtcGxhdGU8IHR5cGVuYW1lIFQgPiBzdHJ1Y3QgeHh4IHt9OyB9OwogICAgc3RydWN0IHRlc3Q2IHsgdHlwZWRlZiBpbnQgeHh4OyB9OwogICAgc3RydWN0IHRlc3Q3IHsgc3RydWN0IHh4eDsgfTsKICAgIHN0cnVjdCB0ZXN0OCB7IHR5cGVkZWYgdm9pZCAoXCp4eHgpKCk7IH07CiAgICBzdHJ1Y3QgdGVzdDkgeyB0eXBlZGVmIHZvaWQgKHh4eCkoKTsgfTsKCiAgICBCT09TVF9NUExfQVNTRVJUX05PVCgoIGhhc194eHg8dGVzdDE+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVF9OT1QoKCBoYXNfeHh4PHRlc3QyPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfTk9UKCggaGFzX3h4eDx0ZXN0Mz4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUX05PVCgoIGhhc194eHg8dGVzdDQ+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVF9OT1QoKCBoYXNfeHh4PHRlc3Q1PiApKTsKCiAgICAjaWYgIWRlZmluZWQoQk9PU1RfTVBMX0NGR19OT19IQVNfWFhYKQogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGhhc194eHg8dGVzdDY+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGhhc194eHg8dGVzdDc+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGhhc194eHg8dGVzdDg+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGhhc194eHg8dGVzdDk+ICkpOwogICAgI2VuZGlmCiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBoYXNfeHh4PHRlc3Q2LHRydWVcXz4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaGFzX3h4eDx0ZXN0Nyx0cnVlXF8+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGhhc194eHg8dGVzdDgsdHJ1ZVxfPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBoYXNfeHh4PHRlc3Q5LHRydWVcXz4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxNYWNyb3N8LCB8Qk9PU1RfTVBMX0hBU19YWFhfVFJBSVRfREVGfCwgfEJPT1NUX01QTF9DRkdfTk9fSEFTX1hYWHwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==