Li4gTWFjcm9zL0ludHJvc3BlY3Rpb24vL0JPT1NUX01QTF9IQVNfWFhYX1RSQUlUX0RFRgoKQk9PU1RfTVBMX0hBU19YWFhfVFJBSVRfREVGCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAjZGVmaW5lIEJPT1NUX01QTF9IQVNfWFhYX1RSQUlUX0RFRihuYW1lKSBcXAogICAgICAgIHx1bnNwZWNpZmllZC10b2tlbi1zZXF8IFxcCiAgICAvXCpcKi8KCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKRXhwYW5kcyBpbnRvIGEgZGVmaW5pdGlvbiBvZiBhIGJvb2xlYW4gdW5hcnkgfE1ldGFmdW5jdGlvbnwgYGBoYXNfbmFtZWBgIApzdWNoIHRoYXQgZm9yIGFueSB0eXBlIGBgeGBgIGBgaGFzX25hbWU8eD46OnZhbHVlID09IHRydWVgYCBpZiBhbmQgb25seQppZiBgYHhgYCBpcyBhIGNsYXNzIHR5cGUgYW5kIGhhcyBhIG5lc3RlZCB0eXBlIG1lbWViZXIgYGB4OjpuYW1lYGAuCgpPbiB0aGUgZGVmaWNpZW50IGNvbXBpbGVycyBub3QgY2FwYWJhbGUgb2YgcGVyZm9ybWluZyB0aGUgZGV0ZWN0aW9uLCAKYGBoYXNfbmFtZTx4Pjo6dmFsdWVgYCBhbHdheXMgcmV0dXJucyBgYGZhbHNlYGAuIEEgYm9vbGVhbiBjb25maWd1cmFpb24gCm1hY3JvLCB8Qk9PU1RfTVBMX0NGR19OT19IQVNfWFhYfCwgaXMgcHJvdmlkZWQgdG8gc2lnbmFsIG9yIG92ZXJyaWRlIAp0aGUgImRlZmljaWVudCIgc3RhdHVzIG9mIGEgcGFydGljdWxhciBjb21waWxlci4KCnxOb3RlOnwgfEJPT1NUX01QTF9IQVNfWFhYX1RSQUlUX0RFRnwgaXMgYSBzaW1wbGlmaWVkIGZyb250IGVuZCB0bwp0aGUgfEJPT1NUX01QTF9IQVNfWFhYX1RSQUlUX05BTUVEX0RFRnwgaW50cm9zcGVjdGlvbiBtYWNybyB8LS0gZW5kIG5vdGV8CgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL2hhc194eHguaHBwPgoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBuYW1lYGAgICAgICB8IEEgbGVnYWwgaWRlbnRpZmllciB0b2tlbiAgICAgIHwgQSBuYW1lIG9mIHRoZSBtZW1iZXIgYmVpbmcgZGV0ZWN0ZWQuICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhbnkgbGVnYWwgQysrIGlkZW50aWZpZXIgYGBuYW1lYGA6CgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgQk9PU1RfTVBMX0hBU19YWFhfVFJBSVRfREVGKG5hbWUpCgo6UHJlY29uZGl0aW9uOgogICAgQXBwZWFycyBhdCBuYW1lc3BhY2Ugc2NvcGUuCgo6UmV0dXJuIHR5cGU6CiAgICBOb25lLgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8KCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIEJPT1NUX01QTF9IQVNfWFhYX1RSQUlUX05BTUVEX0RFRigKICAgICAgICAgICAgICBCT09TVF9QUF9DQVQoaGFzXF8sbmFtZSksIG5hbWUsIGZhbHNlCiAgICAgICAgICAgICkKCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgQk9PU1RfTVBMX0hBU19YWFhfVFJBSVRfREVGKHh4eCkKCiAgICBzdHJ1Y3QgdGVzdDEge307CiAgICBzdHJ1Y3QgdGVzdDIgeyB2b2lkIHh4eCgpOyB9OwogICAgc3RydWN0IHRlc3QzIHsgaW50IHh4eDsgfTsKICAgIHN0cnVjdCB0ZXN0NCB7IHN0YXRpYyBpbnQgeHh4KCk7IH07CiAgICBzdHJ1Y3QgdGVzdDUgeyB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+IHN0cnVjdCB4eHgge307IH07CiAgICBzdHJ1Y3QgdGVzdDYgeyB0eXBlZGVmIGludCB4eHg7IH07CiAgICBzdHJ1Y3QgdGVzdDcgeyBzdHJ1Y3QgeHh4OyB9OwogICAgc3RydWN0IHRlc3Q4IHsgdHlwZWRlZiB2b2lkIChcKnh4eCkoKTsgfTsKICAgIHN0cnVjdCB0ZXN0OSB7IHR5cGVkZWYgdm9pZCAoeHh4KSgpOyB9OwoKICAgIEJPT1NUX01QTF9BU1NFUlRfTk9UKCggaGFzX3h4eDx0ZXN0MT4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUX05PVCgoIGhhc194eHg8dGVzdDI+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVF9OT1QoKCBoYXNfeHh4PHRlc3QzPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfTk9UKCggaGFzX3h4eDx0ZXN0ND4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUX05PVCgoIGhhc194eHg8dGVzdDU+ICkpOwoKICAgICNpZiAhZGVmaW5lZChCT09TVF9NUExfQ0ZHX05PX0hBU19YWFgpCiAgICBCT09TVF9NUExfQVNTRVJUKCggaGFzX3h4eDx0ZXN0Nj4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaGFzX3h4eDx0ZXN0Nz4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaGFzX3h4eDx0ZXN0OD4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaGFzX3h4eDx0ZXN0OT4gKSk7CiAgICAjZW5kaWYKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGhhc194eHg8dGVzdDYsdHJ1ZVxfPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBoYXNfeHh4PHRlc3Q3LHRydWVcXz4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaGFzX3h4eDx0ZXN0OCx0cnVlXF8+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGhhc194eHg8dGVzdDksdHJ1ZVxfPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfE1hY3Jvc3wsIHxCT09TVF9NUExfSEFTX1hYWF9UUkFJVF9OQU1FRF9ERUZ8LCB8Qk9PU1RfTVBMX0NGR19OT19IQVNfWFhYfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK