Li4gU2VxdWVuY2VzL0NsYXNzZXMvL3NldF9jIHw5MAoKc2V0X2MKPT09PT0KCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpgYHNldF9jYGAgaXMgYW4gfEludGVncmFsIFNlcXVlbmNlIFdyYXBwZXJ8IGZvciB8c2V0fC4gQXMgc3VjaCwgaXQgc2hhcmVzCmFsbCB8c2V0fCBjaGFyYWN0ZXJpc3RpY3MgYW5kIHJlcXVpcmVtZW50cywgYW5kIGRpZmZlcnMgb25seSBpbiB0aGUgd2F5IHRoZSAKb3JpZ2luYWwgc2VxdWVuY2UgY29udGVudCBpcyBzcGVjaWZpZWQuCgpIZWFkZXIKLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFNlcXVlbmNlIGZvcm0gICAgIHwgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IFZhcmlhZGljICAgICAgICAgIHwgYGAjaW5jbHVkZSA8Ym9vc3QvbXBsL3NldF9jLmhwcD5gYCAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IE51bWJlcmVkICAgICAgICAgIHwgYGAjaW5jbHVkZSA8Ym9vc3QvbXBsL3NldC9zZXRgYFwgKm4qXCBgYF9jLmhwcD5gYCAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCk1vZGVsIG9mCi0tLS0tLS0tCgoqIHxWYXJpYWRpYyBTZXF1ZW5jZXwKKiB8QXNzb2NpYXRpdmUgU2VxdWVuY2V8CiogfEV4dGVuc2libGUgQXNzb2NpYXRpdmUgU2VxdWVuY2V8CgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnxTZW1hbnRpY3MgZGlzY2xhaW1lci4uLnwgfHNldHwuCgouLiB3b3JrYXJvdW5kIHN1YnN0aXR1dGlvbiBidWcgKHNob3VsZCBiZSByZXBsYWNlOjogc2V0XCAqbipcIF9jPFQsXCB8YzEuLi5jbnw+KQouLiB8c2V0bl9jPFQsLi4uPnwgcmVwbGFjZTo6IHNldFwgKm4qXCBfYzxULFwgKmMqXCA6c3ViOmAxYCxcICpjKlwgOnN1YjpgMmAsLi4uIFwgKmMqXCA6c3ViOmBuYFwgPgoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBFeHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2VtYW50aWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCAuLiBwYXJzZWQtbGl0ZXJhbDo6ICAgICAgICAgICAgICAgICAgIHwgQSB8c2V0fCBvZiBpbnRlZ3JhbCBjb25zdGFudCB3cmFwcGVycyAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBpbnRlZ3JhbF9jPFQsYGBcIHxjMXxcIGBgPmBgLCAgICAgICAgICAgICAgIHwKfCAgICBzZXRfYzxULFwgfGMxLi4uY258PiAgICAgICAgICAgICAgIHwgYGBpbnRlZ3JhbF9jPFQsYGBcIHxjMnxcIGBgPmBgLCAuLi4gICAgICAgICAgIHwKfCAgICB8c2V0bl9jPFQsLi4uPnwgICAgICAgICAgICAgICAgICAgIHwgYGBpbnRlZ3JhbF9jPFQsYGBcIHxjbnxcIGBgPmBgOyAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VlIHxJbnRlZ3JhbCBTZXF1ZW5jZSBXcmFwcGVyfC4gICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAuLiBwYXJzZWQtbGl0ZXJhbDo6ICAgICAgICAgICAgICAgICAgIHwgSWRlbnRpY2FsIHRvIGBgc2V0YGBcICpuKlwgYGA8YGAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBpbnRlZ3JhbF9jPFQsYGBcIHxjMXxcIGBgPmBgLCAgICAgICAgICAgICAgIHwKfCAgICBzZXRfYzxULFwgfGMxLi4uY258Pjo6dHlwZSAgICAgICAgIHwgYGBpbnRlZ3JhbF9jPFQsYGBcIHxjMnxcIGBgPmBgLCAuLi4gICAgICAgICAgIHwKfCAgICB8c2V0bl9jPFQsLi4uPnw6OnR5cGUgICAgICAgICAgICAgIHwgYGBpbnRlZ3JhbF9jPFQsYGBcIHxjbnxcIGBgPmBgIGBgPmBgOyAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VlIHxJbnRlZ3JhbCBTZXF1ZW5jZSBXcmFwcGVyfC4gICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAuLiBwYXJzZWQtbGl0ZXJhbDo6ICAgICAgICAgICAgICAgICAgIHwgSWRlbnRpY2FsIHRvIGBgVGBgOyBzZWUgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfEludGVncmFsIFNlcXVlbmNlIFdyYXBwZXJ8LiAgICAgICAgICAgICAgICAgIHwKfCAgIHNldF9jPFQsXCB8YzEuLi5jbnw+Ojp2YWx1ZV90eXBlICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgIHxzZXRuX2M8VCwuLi4+fDo6dmFsdWVfdHlwZSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHNldF9jPCBpbnQsMSwzLDUsNyw5ID4gb2RkczsKCiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCBzaXplPG9kZHM+Ojp2YWx1ZSwgPT0sIDUgKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfTk9UKCggZW1wdHk8b2Rkcz4gKSk7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBoYXNfa2V5PCBvZGRzLCBpbnRlZ3JhbF9jPGludCw1PiA+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVF9OT1QoKCBoYXNfa2V5PCBvZGRzLCBpbnRlZ3JhbF9jPGludCw0PiA+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVF9OT1QoKCBoYXNfa2V5PCBvZGRzLCBpbnRlZ3JhbF9jPGludCwxNT4gPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfFNlcXVlbmNlc3wsIHxJbnRlZ3JhbCBTZXF1ZW5jZSBXcmFwcGVyfCwgfHNldHwsIHxpbnRlZ3JhbF9jfCwgfHZlY3Rvcl9jfCwgfGxpc3RfY3wsIHxyYW5nZV9jfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK