TmFtZQoKICAgIEVYVF90ZXh0dXJlX2FycmF5CgpOYW1lIFN0cmluZ3MKCiAgICBHTF9FWFRfdGV4dHVyZV9hcnJheQoKQ29udGFjdAoKICAgIFBhdCBCcm93biwgTlZJRElBIENvcnBvcmF0aW9uIChwYnJvd24gJ2F0JyBudmlkaWEuY29tKQoKQ29udHJpYnV0b3JzCgogICAgSm9uIExlZWNoLCBLaHJvbm9zCiAgICBNYXJrIEtpbGdhcmQsIE5WSURJQQoKU3RhdHVzCgogICAgU2hpcHBpbmcgZm9yIEdlRm9yY2UgOCBTZXJpZXMgKE5vdmVtYmVyIDIwMDYsIFJlbGVhc2UgOTUpCgpWZXJzaW9uCgogICAgTGFzdCBNb2RpZmllZCBEYXRlOiAgICAgICAgIDkvMTYvMjAwOAogICAgQXV0aG9yIHJldmlzaW9uOiAgICAgICAgICAgIDgKCk51bWJlcgoKICAgIDMyOQoKRGVwZW5kZW5jaWVzCgogICAgVGhpcyBleHRlbnNpb24gaXMgd3JpdHRlbiBhZ2FpbnN0IHRoZSBPcGVuR0wgMi4wIHNwZWNpZmljYXRpb24gYW5kIHZlcnNpb24KICAgIDEuMTAuNTkgb2YgdGhlIE9wZW5HTCBTaGFkaW5nIExhbmd1YWdlIHNwZWNpZmljYXRpb24uCgogICAgVGhpcyBleHRlbnNpb24gaXMgaW50ZXJhY3RzIHdpdGggRVhUX2ZyYW1lYnVmZmVyX29iamVjdC4KCiAgICBUaGlzIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBOVl9nZW9tZXRyeV9wcm9ncmFtNC4KCiAgICBUaGlzIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBOVl9ncHVfcHJvZ3JhbTQgb3IgdGhlIE9wZW5HTCBTaGFkaW5nCiAgICBMYW5ndWFnZSwgd2hpY2ggcHJvdmlkZSB0aGUgbWVjaGFuaXNtcyBuZWNlc3NhcnkgdG8gYWNjZXNzIGFycmF5IHRleHR1cmVzLgoKICAgIFRoaXMgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIEVYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3MzdGMgYW5kCiAgICBOVl90ZXh0dXJlX2NvbXByZXNzaW9uX3Z0Yy4KCk92ZXJ2aWV3CgogICAgVGhpcyBleHRlbnNpb24gaW50cm9kdWNlcyB0aGUgbm90aW9uIG9mIG9uZS0gYW5kIHR3by1kaW1lbnNpb25hbCBhcnJheQogICAgdGV4dHVyZXMuICBBbiBhcnJheSB0ZXh0dXJlIGlzIGEgY29sbGVjdGlvbiBvZiBvbmUtIGFuZCB0d28tZGltZW5zaW9uYWwKICAgIGltYWdlcyBvZiBpZGVudGljYWwgc2l6ZSBhbmQgZm9ybWF0LCBhcnJhbmdlZCBpbiBsYXllcnMuICBBCiAgICBvbmUtZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZSBpcyBzcGVjaWZpZWQgdXNpbmcgVGV4SW1hZ2UyRDsgYQogICAgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmUgaXMgc3BlY2lmaWVkIHVzaW5nIFRleEltYWdlM0QuICBUaGUgaGVpZ2h0CiAgICAoMUQgYXJyYXkpIG9yIGRlcHRoICgyRCBhcnJheSkgc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGxheWVycyBpbiB0aGUgaW1hZ2UuCgogICAgQW4gYXJyYXkgdGV4dHVyZSBpcyBhY2Nlc3NlZCBhcyBhIHNpbmdsZSB1bml0IGluIGEgcHJvZ3JhbW1hYmxlIHNoYWRlciwKICAgIHVzaW5nIGEgc2luZ2xlIGNvb3JkaW5hdGUgdmVjdG9yLiAgQSBzaW5nbGUgbGF5ZXIgaXMgc2VsZWN0ZWQsIGFuZCB0aGF0CiAgICBsYXllciBpcyB0aGVuIGFjY2Vzc2VkIGFzIHRob3VnaCBpdCB3ZXJlIGEgb25lLSBvciB0d28tZGltZW5zaW9uYWwKICAgIHRleHR1cmUuICBUaGUgbGF5ZXIgdXNlZCBpcyBzcGVjaWZpZWQgdXNpbmcgdGhlICJ0IiBvciAiciIgdGV4dHVyZQogICAgY29vcmRpbmF0ZSBmb3IgMUQgYW5kIDJEIGFycmF5IHRleHR1cmVzLCByZXNwZWN0aXZlbHkuICBUaGUgbGF5ZXIKICAgIGNvb3JkaW5hdGUgaXMgcHJvdmlkZWQgYXMgYW4gdW5ub3JtYWxpemVkIGZsb2F0aW5nLXBvaW50IHZhbHVlIGluIHRoZQogICAgcmFuZ2UgWzAsPG4+LTFdLCB3aGVyZSA8bj4gaXMgdGhlIG51bWJlciBvZiBsYXllcnMgaW4gdGhlIGFycmF5IHRleHR1cmUuCiAgICBUZXh0dXJlIGxvb2t1cHMgZG8gbm90IGZpbHRlciBiZXR3ZWVuIGxheWVycywgdGhvdWdoIHN1Y2ggZmlsdGVyaW5nIGNhbiBiZQogICAgYWNoaWV2ZWQgdXNpbmcgcHJvZ3JhbW1hYmxlIHNoYWRlcnMuICBXaGVuIG1pcG1hcHBpbmcgaXMgdXNlZCwgZWFjaCBsZXZlbAogICAgb2YgYW4gYXJyYXkgdGV4dHVyZSBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIGxheWVycyBhcyB0aGUgYmFzZSBsZXZlbDsgdGhlCiAgICBudW1iZXIgb2YgbGF5ZXJzIGlzIG5vdCByZWR1Y2VkIGFzIHRoZSBpbWFnZSBzaXplIGRlY3JlYXNlcy4KCiAgICBBcnJheSB0ZXh0dXJlcyBjYW4gYmUgcmVuZGVyZWQgdG8gYnkgYmluZGluZyB0aGVtIHRvIGEgZnJhbWVidWZmZXIgb2JqZWN0CiAgICAoRVhUX2ZyYW1lYnVmZmVyX29iamVjdCkuICBBIHNpbmdsZSBsYXllciBvZiBhbiBhcnJheSB0ZXh0dXJlIGNhbiBiZSBib3VuZAogICAgdXNpbmcgbm9ybWFsIGZyYW1lYnVmZmVyIG9iamVjdCBtZWNoYW5pc21zLCBvciBhbiBlbnRpcmUgYXJyYXkgdGV4dHVyZSBjYW4KICAgIGJlIGJvdW5kIGFuZCByZW5kZXJlZCB0byB1c2luZyB0aGUgbGF5ZXJlZCByZW5kZXJpbmcgbWVjaGFuaXNtcyBwcm92aWRlZAogICAgYnkgTlZfZ2VvbWV0cnlfcHJvZ3JhbTQuCgogICAgVGhpcyBleHRlbnNpb24gZG9lcyBub3QgcHJvdmlkZSBmb3IgdGhlIHVzZSBvZiBhcnJheSB0ZXh0dXJlcyB3aXRoCiAgICBmaXhlZC1mdW5jdGlvbiBmcmFnbWVudCBwcm9jZXNzaW5nLiAgU3VjaCBzdXBwb3J0IGNvdWxkIGJlIGFkZGVkIGJ5CiAgICBwcm92aWRpbmcgYW4gYWRkaXRpb25hbCBleHRlbnNpb24gYWxsb3dpbmcgYXBwbGljYXRpb25zIHRvIHBhc3MgdGhlIG5ldwogICAgdGFyZ2V0IGVudW1lcmFudHMgKFRFWFRVUkVfMURfQVJSQVlfRVhUIGFuZCBURVhUVVJFXzJEX0FSUkFZX0VYVCkgdG8KICAgIEVuYWJsZSBhbmQgRGlzYWJsZS4KCk5ldyBQcm9jZWR1cmVzIGFuZCBGdW5jdGlvbnMKCiAgICB2b2lkIEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyRVhUKGVudW0gdGFyZ2V0LCBlbnVtIGF0dGFjaG1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgdGV4dHVyZSwgaW50IGxldmVsLCBpbnQgbGF5ZXIpOwoKTmV3IFRva2VucwoKICAgIEFjY2VwdGVkIGJ5IHRoZSA8dGFyZ2V0PiBwYXJhbWV0ZXIgb2YgVGV4UGFyYW1ldGVyaSwgVGV4UGFyYW1ldGVyaXYsCiAgICBUZXhQYXJhbWV0ZXJmLCBUZXhQYXJhbWV0ZXJmdiwgR2VuZXJhdGVNaXBtYXBFWFQsIGFuZCBCaW5kVGV4dHVyZToKCiAgICAgICAgVEVYVFVSRV8xRF9BUlJBWV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzE4CiAgICAgICAgVEVYVFVSRV8yRF9BUlJBWV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzFBCgogICAgQWNjZXB0ZWQgYnkgdGhlIDx0YXJnZXQ+IHBhcmFtZXRlciBvZiBUZXhJbWFnZTNELCBUZXhTdWJJbWFnZTNELAogICAgQ29weVRleFN1YkltYWdlM0QsIENvbXByZXNzZWRUZXhJbWFnZTNELCBhbmQgQ29tcHJlc3NlZFRleFN1YkltYWdlM0Q6CgogICAgICAgIFRFWFRVUkVfMkRfQVJSQVlfRVhUCiAgICAgICAgUFJPWFlfVEVYVFVSRV8yRF9BUlJBWV9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4QzFCCgogICAgQWNjZXB0ZWQgYnkgdGhlIDx0YXJnZXQ+IHBhcmFtZXRlciBvZiBUZXhJbWFnZTJELCBUZXhTdWJJbWFnZTJELAogICAgQ29weVRleEltYWdlMkQsIENvcHlUZXhTdWJJbWFnZTJELCBDb21wcmVzc2VkVGV4SW1hZ2UyRCwgYW5kCiAgICBDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRDoKCiAgICAgICAgVEVYVFVSRV8xRF9BUlJBWV9FWFQKICAgICAgICBQUk9YWV9URVhUVVJFXzFEX0FSUkFZX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDhDMTkKCiAgICBBY2NlcHRlZCBieSB0aGUgPHBuYW1lPiBwYXJhbWV0ZXIgb2YgR2V0Qm9vbGVhbnYsIEdldERvdWJsZXYsIEdldEludGVnZXJ2CiAgICBhbmQgR2V0RmxvYXR2OgoKICAgICAgICBURVhUVVJFX0JJTkRJTkdfMURfQVJSQVlfRVhUICAgICAgICAgICAgICAgICAgICAweDhDMUMKICAgICAgICBURVhUVVJFX0JJTkRJTkdfMkRfQVJSQVlfRVhUICAgICAgICAgICAgICAgICAgICAweDhDMUQKICAgICAgICBNQVhfQVJSQVlfVEVYVFVSRV9MQVlFUlNfRVhUICAgICAgICAgICAgICAgICAgICAweDg4RkYKCiAgICBBY2NlcHRlZCBieSB0aGUgPHBhcmFtPiBwYXJhbWV0ZXIgb2YgVGV4UGFyYW1ldGVyZiwgVGV4UGFyYW1ldGVyaSwKICAgIFRleFBhcmFtZXRlcmZ2LCBhbmQgVGV4UGFyYW1ldGVyaXYgd2hlbiB0aGUgPHBuYW1lPiBwYXJhbWV0ZXIgaXMKICAgIFRFWFRVUkVfQ09NUEFSRV9NT0RFX0FSQjoKCiAgICAgICAgQ09NUEFSRV9SRUZfREVQVEhfVE9fVEVYVFVSRV9FWFQgICAgICAgICAgICAgICAgMHg4ODRFCgogICAgKE5vdGU6ICBDT01QQVJFX1JFRl9ERVBUSF9UT19URVhUVVJFX0VYVCBpcyBzaW1wbHkgYW4gYWxpYXMgZm9yIHRoZQogICAgZXhpc3RpbmcgQ09NUEFSRV9SX1RPX1RFWFRVUkUgdG9rZW4gaW4gT3BlbkdMIDIuMDsgdGhlIGFsdGVybmF0ZSBuYW1lCiAgICByZWZsZWN0cyB0aGUgZmFjdCB0aGF0IHRoZSBSIGNvb3JkaW5hdGUgaXMgbm90IGFsd2F5cyB1c2VkLikKCiAgICBBY2NlcHRlZCBieSB0aGUgPGludGVybmFsZm9ybWF0PiBwYXJhbWV0ZXIgb2YgVGV4SW1hZ2UzRCBhbmQKICAgIENvbXByZXNzZWRUZXhJbWFnZTNELCBhbmQgYnkgdGhlIDxmb3JtYXQ+IHBhcmFtZXRlciBvZgogICAgQ29tcHJlc3NlZFRleFN1YkltYWdlM0Q6CgogICAgICAgIENPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQKICAgICAgICBDT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVAogICAgICAgIENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUCiAgICAgICAgQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQKCiAgICBBY2NlcHRlZCBieSB0aGUgPHBuYW1lPiBwYXJhbWV0ZXIgb2YKICAgIEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhUOgoKICAgICAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVJfRVhUICAgICAgICAgIDB4OENENAoKICAgIChOb3RlOiAgRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSIGlzIHNpbXBseSBhbiBhbGlhcyBmb3IgdGhlCiAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfM0RfWk9GRlNFVF9FWFQgdG9rZW4gcHJvdmlkZWQgaW4KICAgIEVYVF9mcmFtZWJ1ZmZlcl9vYmplY3QuICBUaGlzIGV4dGVuc2lvbiBnZW5lcmFsaXplcyB0aGUgbm90aW9uIG9mCiAgICAiPHpvZmZzZXQ+IiB0byBpbmNsdWRlIGxheWVycyBvZiBhbiBhcnJheSB0ZXh0dXJlLikKCiAgICBSZXR1cm5lZCBieSB0aGUgPHR5cGU+IHBhcmFtZXRlciBvZiBHZXRBY3RpdmVVbmlmb3JtOgoKICAgICAgICBTQU1QTEVSXzFEX0FSUkFZX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4REMwCiAgICAgICAgU0FNUExFUl8yRF9BUlJBWV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OERDMQogICAgICAgIFNBTVBMRVJfMURfQVJSQVlfU0hBRE9XX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDhEQzMKICAgICAgICBTQU1QTEVSXzJEX0FSUkFZX1NIQURPV19FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4REM0CgpBZGRpdGlvbnMgdG8gQ2hhcHRlciAyIG9mIHRoZSBPcGVuR0wgMi4wIFNwZWNpZmljYXRpb24gKE9wZW5HTCBPcGVyYXRpb24pCgogICAgTW9kaWZ5IHNlY3Rpb24gMi4xNS4zLCAiU2hhZGVyIFZhcmlhYmxlcyIsIHBhZ2UgNzUKCiAgICBBZGQgdGhlIGZvbGxvd2luZyBuZXcgcmV0dXJuIHR5cGVzIHRvIHRoZSBkZXNjcmlwdGlvbiBvZiBHZXRBY3RpdmVVbmlmb3JtCiAgICBvbiBwLiA4MS4KCiAgICAgIFNBTVBMRVJfMURfQVJSQVlfRVhULAogICAgICBTQU1QTEVSXzJEX0FSUkFZX0VYVCwKICAgICAgU0FNUExFUl8xRF9BUlJBWV9TSEFET1dfRVhULAogICAgICBTQU1QTEVSXzJEX0FSUkFZX1NIQURPV19FWFQKCiAgICBNb2RpZnkgU2VjdGlvbiAyLjE1LjQsIFNoYWRlciBFeGVjdXRpb24gKHAuIDg0KQoKICAgIChtb2RpZnkgZmlyc3QgcGFyYWdyYXBoLCBwLiA4NiAtLSB0d28gc2ltcGxlIGVkaXRzOgoKICAgICAgKDEpIENoYW5nZSByZWZlcmVuY2UgdG8gdGhlICJyIiBjb29yZGluYXRlIHRvIHNpbXBseSBpbmRpY2F0ZSB0aGF0IHRoZQogICAgICAgICAgcmVmZXJlbmNlIHZhbHVlIGZvciBzaGFkb3cgbWFwcGluZyBpcyBwcm92aWRlZCBpbiB0aGUgbG9va3VwCiAgICAgICAgICBmdW5jdGlvbi4gIEl0J3Mgc3RpbGwgdXN1YWxseSBpbiB0aGUgInIiIGNvb3JkaW5hdGUsIGV4Y2VwdCBmb3IKICAgICAgICAgIHR3by1kaW1lbnNpb25hbCBhcnJheSB0ZXh0dXJlcywgd2hlcmUgaXQncyBpbiAicSIuICAKICAgICAgKDIpIEFkZCBuZXcgRVhUX2dwdV9zaGFkZXI0IHNhbXBsZXIgdHlwZXMgdXNlZCBmb3IgYXJyYXkgdGV4dHVyZXMuICkKCiAgICBUZXh0dXJlIGxvb2t1cHMgaW52b2x2aW5nIHRleHR1cmVzIHdpdGggZGVwdGggY29tcG9uZW50IGRhdGEgY2FuIGVpdGhlcgogICAgcmV0dXJuIHRoZSBkZXB0aCBkYXRhIGRpcmVjdGx5IG9yIHJldHVybiB0aGUgcmVzdWx0cyBvZiBhIGNvbXBhcmlzb24gd2l0aAogICAgYSByZWZlcmVuY2UgZGVwdGggdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBjb29yZGluYXRlcyBwYXNzZWQgdG8gdGhlIHRleHR1cmUKICAgIGxvb2t1cCBmdW5jdGlvbiwgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gMy44LjE0LiAgVGhlIGNvbXBhcmlzb24gb3BlcmF0aW9uCiAgICBpcyByZXF1ZXN0ZWQgaW4gdGhlIHNoYWRlciBieSB1c2luZyB0aGUgc2hhZG93IHNhbXBsZXIgdHlwZXMKICAgIChzYW1wbGVyMURTaGFkb3csIHNhbXBsZXIyRFNoYWRvdywgc2FtcGxlcjFEQXJyYXlTaGFkb3csIG9yCiAgICBzYW1wbGVyMkRBcnJheVNoYWRvdykgYW5kIGluIHRoZSB0ZXh0dXJlIHVzaW5nIHRoZSBURVhUVVJFX0NPTVBBUkVfTU9ERQogICAgcGFyYW1ldGVyLiAuLi4KCkFkZGl0aW9ucyB0byBDaGFwdGVyIDMgb2YgdGhlIE9wZW5HTCAyLjAgU3BlY2lmaWNhdGlvbiAoUmFzdGVyaXphdGlvbikKCiAgICBNb2RpZnkgU2VjdGlvbiAzLjgsIFRleHR1cmluZyAocC4gMTQ5KS4KCiAgICAoYWRkIG5ldyBwYXJhZ3JhcGggYXQgdGhlIHRvcCBvZiBwLiAxNTApIFNpeCB0eXBlcyBvZiB0ZXh0dXJlIGFyZQogICAgc3VwcG9ydGVkOyBlYWNoIGlzIGEgY29sbGVjdGlvbiBvZiBpbWFnZXMgYnVpbHQgZnJvbSBvbmUtLCB0d28tLCBvcgogICAgdGhyZWUtZGltZW5zaW9uYWwgYXJyYXkgb2YgaW1hZ2UgZWxlbWVudHMgcmVmZXJyZWQgdG8gYXMgdGV4ZWxzLiAgT25lLSwKICAgIHR3by0sIGFuZCB0aHJlZS1kaW1lbnNpb25hbCB0ZXh0dXJlcyBjb25zaXN0IG9mIGEgb25lLSwgdHdvLSwgb3IKICAgIHRocmVlLWRpbWVuc2lvbmFsIHRleGVsIGFycmF5cy4gIE9uZS0gYW5kIHR3by1kaW1lbnNpb25hbCBhcnJheSB0ZXh0dXJlcwogICAgYXJlIGFycmF5cyBvZiBvbmUtIG9yIHR3by1kaW1lbnNpb25hbCBpbWFnZXMsIGNvbnNpc3Rpbmcgb2Ygb25lIG9yIG1vcmUKICAgIGxheWVycy4gIEZpbmFsbHksIGEgY3ViZSBtYXAgaXMgYSBzcGVjaWFsIHR3by1kaW1lbnNpb25hbCBhcnJheSB0ZXh0dXJlCiAgICB3aXRoIHNpeCBsYXllcnMgdGhhdCByZXByZXNlbnQgdGhlIGZhY2VzIG9mIGEgY3ViZS4gIFdoZW4gYWNjZXNzaW5nIGEgY3ViZQogICAgbWFwLCB0aGUgdGV4dHVyZSBjb29yZGluYXRlcyBhcmUgcHJvamVjdGVkIG9udG8gb25lIG9mIHRoZSBzaXggZmFjZXMuCgogICAgTW9kaWZ5IFNlY3Rpb24gMy44LjEsIFRleHR1cmUgSW1hZ2UgU3BlY2lmaWNhdGlvbiAocC4gMTUwKS4KCiAgICAobW9kaWZ5IGZpcnN0IHBhcmFncmFwaCBvZiBzZWN0aW9uLCBwLiAxNTApIFRoZSBjb21tYW5kCgogICAgICB2b2lkIFRleEltYWdlM0QoIGVudW0gdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCBpbnRlcm5hbGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplaSB3aWR0aCwgc2l6ZWkgaGVpZ2h0LCBzaXplaSBkZXB0aCwgaW50IGJvcmRlciwKICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGZvcm1hdCwgZW51bSB0eXBlLCB2b2lkICpkYXRhICk7CgogICAgaXMgdXNlZCB0byBzcGVjaWZ5IGEgdGhyZWUtZGltZW5zaW9uYWwgdGV4dHVyZSBpbWFnZS4gdGFyZ2V0IG11c3QgYmUgb25lCiAgICBvZiBURVhUVVJFXzNEIGZvciBhIHRocmVlLWRpbWVuc2lvbmFsIHRleHR1cmUgb3IgVEVYVFVSRV8yRF9BUlJBWV9FWFQgZm9yCiAgICBhbiB0d28tZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZS4gIEFkZGl0aW9uYWxseSwgdGFyZ2V0IG1heSBiZSBlaXRoZXIKICAgIFBST1hZX1RFWFRVUkVfM0QgZm9yIGEgdGhyZWUtZGltZW5zaW9uYWwgcHJveHkgdGV4dHVyZSwgb3IKICAgIFBST1hZX1RFWFRVUkVfMkRfQVJSQVlfRVhUIGZvciBhIHR3by1kaW1lbnNpb25hbCBwcm94eSBhcnJheSB0ZXh0dXJlLiAuLi4KCiAgICAobW9kaWZ5IHRoZSBmb3VydGggcGFyYWdyYXBoIG9uIHAuIDE1MSkgVGV4dHVyZXMgd2l0aCBhIGJhc2UgaW50ZXJuYWwKICAgIGZvcm1hdCBvZiBERVBUSF9DT01QT05FTlQgYXJlIHN1cHBvcnRlZCBieSB0ZXh0dXJlIGltYWdlIHNwZWNpZmljYXRpb24KICAgIGNvbW1hbmRzIG9ubHkgaWYgdGFyZ2V0IGlzIFRFWFRVUkVfMUQsIFRFWFRVUkVfMkQsIFRFWFRVUkVfMURfQVJSQVlfRVhULAogICAgVEVYVFVSRV8yRF9BUlJBWV9FWFQsIFBST1hZX1RFWFRVUkVfMUQsIFBST1hZX1RFWFRVUkVfMkQsCiAgICBQUk9YWV9URVhUVVJFXzFEX0FSUkFZX0VYVCwgb3IgUFJPWFlfVEVYVFVSRV8yRF9BUlJBWV9FWFQuIFVzaW5nIHRoaXMKICAgIGZvcm1hdCBpbiBjb25qdW5jdGlvbiB3aXRoIGFueSBvdGhlciB0YXJnZXQgd2lsbCByZXN1bHQgaW4gYW4gSU5WQUxJRAogICAgT1BFUkFUSU9OIGVycm9yLgoKICAgIChtb2RpZnkgdGhlIGZpcnN0IHBhcmFncmFwaCBvbiBwLiAxNTMgLS0gSW4gcGFydGljdWxhciwgYWRkIG5ldyB0ZXJtcyB3X2IsCiAgICBoX2IsIGFuZCBkX2IgdG8gcmVwcmVzZW50IGJvcmRlciB3aWR0aCwgaGVpZ2h0LCBvciBkZXB0aCwgaW5zdGVhZCBvZiBhCiAgICBzaW5nbGUgYm9yZGVyIHNpemUgdGVybSBiX3MuICBTdWJzZXF1ZW50IGVxdWF0aW9ucyByZWZlcnJpbmcgdG8gYl9zIHNob3VsZAogICAgYmUgbW9kaWZpZWQgdG8gcmVmZXIgdG8gd19iLCBoX2IsIGFuZCBkX2IsIGFzIGFwcHJvcHJpYXRlLikKCiAgICAuLi4gQ291bnRpbmcgZnJvbSB6ZXJvLCBlYWNoIHJlc3VsdGluZyBOdGggdGV4ZWwgaXMgYXNzaWduZWQgaW50ZXJuYWwKICAgIGludGVnZXIgY29vcmRpbmF0ZXMgKGksIGosIGspLCB3aGVyZQoKICAgICAgaSA9IChOIG1vZCB3aWR0aCkgLSB3X2IKICAgICAgaiA9IChmbG9vcihOL3dpZHRoKSBtb2QgaGVpZ2h0KSAtIGhfYgogICAgICBrID0gKGZsb29yKE4vKHdpZHRoKmhlaWdodCkpIG1vZCBkZXB0aCkgLSBkX2IKCiAgICBhbmQgd19iLCBoX2IsIGFuZCBkX2IgYXJlIHRoZSBzcGVjaWZpZWQgYm9yZGVyIHdpZHRoLCBoZWlnaHQsIGFuZCBkZXB0aC4KICAgIHdfYiBhbmQgaF9iIGFyZSB0aGUgc3BlY2lmaWVkIDxib3JkZXI+IHZhbHVlOyBkX2IgaXMgdGhlIHNwZWNpZmllZAogICAgPGJvcmRlcj4gdmFsdWUgaWYgPHRhcmdldD4gaXMgVEVYVFVSRV8zRCBvciB6ZXJvIGlmIDx0YXJnZXQ+IGlzCiAgICBURVhUVVJFXzJEX0FSUkFZX0VYVC4gLi4uCgogICAgKG1vZGlmeSBlcXVhdGlvbnMgMy4xNS0zLjE3IGFuZCB0aGlyZCBwYXJhZ3JhcGggb2YgcC4gMTU1KQoKICAgICAgd19zID0gd190ICsgMiAqIHdfYiAgICAgICAgICAgICAgICAgICAgICgzLjE1KQogICAgICBoX3MgPSBoX3QgKyAyICogaF9iICAgICAgICAgICAgICAgICAgICAgKDMuMTYpCiAgICAgIGRfcyA9IGRfdCArIDIgKiBkX2IgICAgICAgICAgICAgICAgICAgICAoMy4xNykKCiAgICAuLi4gSWYgPGJvcmRlcj4gaXMgbGVzcyB0aGFuIHplcm8sIG9yIGdyZWF0ZXIgdGhhbiBiX3QsIHRoZW4gdGhlIGVycm9yCiAgICBJTlZBTElEX1ZBTFVFIGlzIGdlbmVyYXRlZC4KCiAgICAobW9kaWZ5IHRoZSBsYXN0IHBhcmFncmFwaCBvbiBwLiAxNTUgb24gdG8gcC4gMTU2KQoKICAgIFRoZSBtYXhpbXVtIGFsbG93YWJsZSB3aWR0aCwgaGVpZ2h0LCBvciBkZXB0aCBvZiBhIHRleGVsIGFycmF5IGZvciBhCiAgICB0aHJlZS1kaW1lbnNpb25hbCB0ZXh0dXJlIGlzIGFuIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBmdW5jdGlvbiBvZiB0aGUKICAgIGxldmVsLW9mLWRldGFpbCBhbmQgaW50ZXJuYWwgZm9ybWF0IG9mIHRoZSByZXN1bHRpbmcgaW1hZ2UgYXJyYXkuICBJdCBtdXN0CiAgICBiZSBhdCBsZWFzdCAyXihrLWxvZCkgKyAyICogYl90IGZvciBpbWFnZSBhcnJheXMgb2YgbGV2ZWwtb2YtZGV0YWlsIDAKICAgIHRocm91Z2ggaywgd2hlcmUgayBpcyB0aGUgbG9nIGJhc2UgMiBvZiBNQVhfM0RfVEVYVFVSRV9TSVpFLCBsb2QgaXMgdGhlCiAgICBsZXZlbC1vZi1kZXRhaWwgb2YgdGhlIGltYWdlIGFycmF5LCBhbmQgYl90IGlzIHRoZSBtYXhpbXVtIGJvcmRlciB3aWR0aC4KICAgIEl0IG1heSBiZSB6ZXJvIGZvciBpbWFnZSBhcnJheXMgb2YgYW55IGxldmVsLW9mLWRldGFpbCBncmVhdGVyIHRoYW4gay4gVGhlCiAgICBlcnJvciBJTlZBTElEIFZBTFVFIGlzIGdlbmVyYXRlZCBpZiB0aGUgc3BlY2lmaWVkIGltYWdlIGlzIHRvbyBsYXJnZSB0byBiZQogICAgc3RvcmVkIHVuZGVyIGFueSBjb25kaXRpb25zLgoKICAgIEluIGEgc2ltaWxhciBmYXNoaW9uLCB0aGUgbWF4aW11bSBhbGxvd2FibGUgd2lkdGggb2YgYSB0ZXhlbCBhcnJheSBmb3IgYQogICAgb25lLSBvciB0d28tZGltZW5zaW9uYWwsIG9yIG9uZS0gb3IgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmUsIGFuZCB0aGUKICAgIG1heGltdW0gYWxsb3dhYmxlIGhlaWdodCBvZiBhIHR3by1kaW1lbnNpb25hbCBvciB0d28tZGltZW5zaW9uYWwgYXJyYXkKICAgIHRleHR1cmUsIG11c3QgYmUgYXQgbGVhc3QgMl4oay1sb2QpICsgMiAqIGJfdCBmb3IgaW1hZ2UgYXJyYXlzIG9mIGxldmVsIDAKICAgIHRocm91Z2ggaywgd2hlcmUgayBpcyB0aGUgbG9nIGJhc2UgMiBvZiBNQVhfVEVYVFVSRV9TSVpFLiBUaGUgbWF4aW11bQogICAgYWxsb3dhYmxlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYSBjdWJlIG1hcCB0ZXh0dXJlIG11c3QgYmUgdGhlIHNhbWUsIGFuZAogICAgbXVzdCBiZSBhdCBsZWFzdCAyXihrLWxvZCkgKyAyICogYl90IGZvciBpbWFnZSBhcnJheXMgbGV2ZWwgMCB0aHJvdWdoIGssCiAgICB3aGVyZSBrIGlzIHRoZSBsb2cgYmFzZSAyIG9mIE1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUuICBUaGUgbWF4aW11bQogICAgbnVtYmVyIG9mIGxheWVycyBmb3Igb25lLSBhbmQgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmVzIChoZWlnaHQgb3IKICAgIGRlcHRoLCByZXNwZWN0aXZlbHkpIG11c3QgYmUgYXQgbGVhc3QgTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTX0VYVCBmb3IgYWxsCiAgICBsZXZlbHMuCgogICAgKG1vZGlmeSB0aGUgZm91cnRoIHBhcmFncmFwaCBvbiBwLiAxNTYpIFRoZSBjb21tYW5kCgogICAgICB2b2lkIFRleEltYWdlMkQoIGVudW0gdGFyZ2V0LCBpbnQgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGludGVybmFsZm9ybWF0LCBzaXplaSB3aWR0aCwgc2l6ZWkgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgIGludCBib3JkZXIsIGVudW0gZm9ybWF0LCBlbnVtIHR5cGUsIHZvaWQgKmRhdGEgKTsKCiAgICBpcyB1c2VkIHRvIHNwZWNpZnkgYSB0d28tZGltZW5zaW9uYWwgdGV4dHVyZSBpbWFnZS4gdGFyZ2V0IG11c3QgYmUgb25lIG9mCiAgICBURVhUVVJFXzJEIGZvciBhIHR3by1kaW1lbnNpb25hbCB0ZXh0dXJlLCBURVhUVVJFXzFEX0FSUkFZX0VYVCBmb3IgYQogICAgb25lLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmUsIG9yIG9uZSBvZiBURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gsCiAgICBURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1gsIFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSwKICAgIFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSwgVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aLCBvcgogICAgVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aIGZvciBhIGN1YmUgbWFwIHRleHR1cmUuIEFkZGl0aW9uYWxseSwgdGFyZ2V0CiAgICBtYXkgYmUgZWl0aGVyIFBST1hZX1RFWFRVUkVfMkQgZm9yIGEgdHdvLWRpbWVuc2lvbmFsIHByb3h5IHRleHR1cmUsCiAgICBQUk9YWV9URVhUVVJFXzFEX0FSUkFZX0VYVCBmb3IgYSBvbmUtZGltZW5zaW9uYWwgcHJveHkgYXJyYXkgdGV4dHVyZSwgb3IKICAgIFBST1hZIFRFWFRVUkVfQ1VCRV9NQVAgZm9yIGEgY3ViZSBtYXAgcHJveHkgdGV4dHVyZSBpbiB0aGUgc3BlY2lhbCBjYXNlCiAgICBkaXNjdXNzZWQgaW4gc2VjdGlvbiAzLjguMTEuICBUaGUgb3RoZXIgcGFyYW1ldGVycyBtYXRjaCB0aGUgY29ycmVzcG9uZGluZwogICAgcGFyYW1ldGVycyBvZiBUZXhJbWFnZTNELgoKICAgIEZvciB0aGUgcHVycG9zZXMgb2YgZGVjb2RpbmcgdGhlIHRleHR1cmUgaW1hZ2UsIFRleEltYWdlMkQgaXMgZXF1aXZhbGVudAogICAgdG8gY2FsbGluZyBUZXhJbWFnZTNEIHdpdGggY29ycmVzcG9uZGluZyBhcmd1bWVudHMgYW5kIGRlcHRoIG9mIDEsIGV4Y2VwdAogICAgdGhhdAoKICAgICAgKiBUaGUgYm9yZGVyIGRlcHRoLCBkX2IsIGlzIHplcm8sIGFuZCB0aGUgZGVwdGggb2YgdGhlIGltYWdlIGlzIGFsd2F5cyAxCiAgICAgICAgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgYm9yZGVyLiAKCiAgICAgICogVGhlIGJvcmRlciBoZWlnaHQsIGhfYiwgaXMgemVybyBpZiA8dGFyZ2V0PiBpcyBURVhUVVJFXzFEX0FSUkFZX0VYVCwKICAgICAgICBhbmQgPGJvcmRlcj4gb3RoZXJ3aXNlLgoKICAgICAgKiBDb252b2x1dGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBvbiB0aGUgaW1hZ2UgKHBvc3NpYmx5IGNoYW5naW5nIGl0cyB3aWR0aAogICAgICAgIGFuZCBoZWlnaHQpIGlmIFNFUEFSQUJMRSAyRCBvciBDT05WT0xVVElPTiAyRCBpcyBlbmFibGVkLgoKICAgICAgKiBVTlBBQ0sgU0tJUCBJTUFHRVMgaXMgaWdub3JlZC4KCiAgICAobW9kaWZ5IHRoZSBmb3VydGggcGFyYWdyYXBoIG9uIHAuIDE1NykgRm9yIHRoZSBwdXJwb3NlcyBvZiBkZWNvZGluZyB0aGUKICAgIHRleHR1cmUgaW1hZ2UsIFRleEltYWdlMUQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIFRleEltYWdlMkQgd2l0aAogICAgY29ycmVzcG9uZGluZyBhcmd1bWVudHMgYW5kIGhlaWdodCBvZiAxLCBleGNlcHQgdGhhdCAKCiAgICAgICogVGhlIGJvcmRlciBoZWlnaHQgYW5kIGRlcHRoIChoX2IgYW5kIGRfYikgYXJlIGFsd2F5cyB6ZXJvLCByZWdhcmRsZXNzCiAgICAgICAgb2YgdGhlIHZhbHVlIG9mIDxib3JkZXI+LgoKICAgICAgKiBDb252b2x1dGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBvbiB0aGUgaW1hZ2UgKHBvc3NpYmx5IGNoYW5naW5nIGl0cwogICAgICAgIHdpZHRoKSBvbmx5IGlmIENPTlZPTFVUSU9OIDFEIGlzIGVuYWJsZWQuCgogICAgKG1vZGlmeSB0aGUgbGFzdCBwYXJhZ3JhcGggb24gcC4gMTU3IGFuZCB0aGUgZmlyc3QgcGFyYWdyYXBoIG9mIHAuIDE1OCAtLQogICAgY2hhbmdpbmcgdGhlIHBocmFzZSAidGV4dHVyZSBhcnJheSIgdG8gInRleGVsIGFycmF5IiB0byBhdm9pZCBjb25mdXNpb24KICAgIHdpdGggYXJyYXkgdGV4dHVyZXMuICBBbGwgc3Vic2VxdWVudCByZWZlcmVuY2VzIHRvICJ0ZXh0dXJlIGFycmF5IiBpbiB0aGUKICAgIHNwZWNpZmljYXRpb24gc2hvdWxkIGFsc28gYmUgY2hhbmdlZCB0byAidGV4ZWwgYXJyYXkiLikKCiAgICBXZSBzaGFsbCByZWZlciB0byB0aGUgKHBvc3NpYmx5IGJvcmRlciBhdWdtZW50ZWQpIGRlY29kZWQgaW1hZ2UgYXMgdGhlCiAgICB0ZXhlbCBhcnJheS4gIEEgdGhyZWUtZGltZW5zaW9uYWwgdGV4ZWwgYXJyYXkgaGFzIHdpZHRoLCBoZWlnaHQsIGFuZCBkZXB0aAogICAgd3MsIGhzLCBhbmQgZHMgYXMgZGVmaW5lZCByZXNwZWN0aXZlbHkgaW4gZXF1YXRpb25zIDMuMTUsIDMuMTYsIGFuZAogICAgMy4xNy4gQSB0d28tZGltZW5zaW9uYWwgdGV4ZWwgYXJyYXkgaGFzIGRlcHRoIGRzID0gMSwgd2l0aCBoZWlnaHQgaHMgYW5kCiAgICB3aWR0aCB3cyBhcyBhYm92ZSwgYW5kIGEgb25lLWRpbWVuc2lvbmFsIHRleGVsIGFycmF5IGhhcyBkZXB0aCBkcyA9IDEsCiAgICBoZWlnaHQgaHMgPSAxLCBhbmQgd2lkdGggd3MgYXMgYWJvdmUuCgogICAgQW4gZWxlbWVudCAoaSxqLGspIG9mIHRoZSB0ZXhlbCBhcnJheSBpcyBjYWxsZWQgYSB0ZXhlbCAoZm9yIGEKICAgIHR3by1kaW1lbnNpb25hbCB0ZXh0dXJlIG9yIG9uZS1kaW1lbnNpb25hbCBhcnJheSB0ZXh0dXJlLCBrIGlzIGlycmVsZXZhbnQ7CiAgICBmb3IgYSBvbmUtZGltZW5zaW9uYWwgdGV4dHVyZSwgaiBhbmQgayBhcmUgYm90aCBpcnJlbGV2YW50KS4gIFRoZSB0ZXh0dXJlCiAgICB2YWx1ZSB1c2VkIGluIHRleHR1cmluZyBhIGZyYWdtZW50IGlzIGRldGVybWluZWQgYnkgdGhhdCBmcmFnbWVudCdzCiAgICBhc3NvY2lhdGVkIChzLHQscikgY29vcmRpbmF0ZXMsIGJ1dCBtYXkgbm90IGNvcnJlc3BvbmQgdG8gYW55IGFjdHVhbAogICAgdGV4ZWwuIFNlZSBmaWd1cmUgMy4xMC4KCiAgICBNb2RpZnkgU2VjdGlvbiAzLjguMiwgQWx0ZXJuYXRlIFRleHR1cmUgSW1hZ2UgU3BlY2lmaWNhdGlvbiBDb21tYW5kcwogICAgKHAuIDE1OSkKCiAgICAobW9kaWZ5IHNlY29uZCBwYXJhZ3JhcGgsIHAuIDE1OSAtLSBhbGxvdyAxRCBhcnJheSB0ZXh0dXJlcykgVGhlIGNvbW1hbmQKCiAgICAgIHZvaWQgQ29weVRleEltYWdlMkQoIGVudW0gdGFyZ2V0LCBpbnQgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZXJuYWxmb3JtYXQsIGludCB4LCBpbnQgeSwgc2l6ZWkgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVpIGhlaWdodCwgaW50IGJvcmRlciApOwoKICAgIGRlZmluZXMgYSB0d28tZGltZW5zaW9uYWwgdGV4dHVyZSBpbWFnZSBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YKICAgIFRleEltYWdlMkQsIGV4Y2VwdCB0aGF0IHRoZSBpbWFnZSBkYXRhIGFyZSB0YWtlbiBmcm9tIHRoZSBmcmFtZWJ1ZmZlcgogICAgcmF0aGVyIHRoYW4gZnJvbSBjbGllbnQgbWVtb3J5LiBDdXJyZW50bHksIHRhcmdldCBtdXN0IGJlIG9uZSBvZgogICAgVEVYVFVSRV8yRCwgVEVYVFVSRV8xRF9BUlJBWV9FWFQsIFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwKICAgIFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCwgVEVYVFVSRV9DVUJFIE1BUF9QT1NJVElWRV9ZLAogICAgVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZLCBURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1osIG9yCiAgICBURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ouCgogICAgKG1vZGlmeSBsYXN0IHBhcmFncmFwaCwgcC4gMTYwKSAuLi4gQ3VycmVudGx5IHRoZSB0YXJnZXQgYXJndW1lbnRzIG9mCiAgICBUZXhTdWJJbWFnZTFEIGFuZCBDb3B5VGV4U3ViSW1hZ2UxRCBtdXN0IGJlIFRFWFRVUkVfMUQsIHRoZSB0YXJnZXQKICAgIGFyZ3VtZW50cyBvZiBUZXhTdWJJbWFnZTJEIGFuZCBDb3B5VGV4U3ViSW1hZ2UyRCBtdXN0IGJlIG9uZSBvZgogICAgVEVYVFVSRV8yRCwgVEVYVFVSRV8xRF9BUlJBWV9FWFQsIFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwKICAgIFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCwgVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZLAogICAgVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZLCBURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1osIG9yCiAgICBURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1osIGFuZCB0aGUgdGFyZ2V0IGFyZ3VtZW50cyBvZiBUZXhTdWJJbWFnZTNEIGFuZAogICAgQ29weVRleFN1YkltYWdlM0QgbXVzdCBiZSBURVhUVVJFXzNEIG9yIFRFWFRVUkVfMkRfQVJSQVlfRVhULiAuLi4KCiAgICAobW9kaWZ5IGxhc3QgcGFyYWdyYXBoLCBwLiAxNjEgYW5kIHN1YnNlcXVlbnQgaW5lcXVhbGl0aWVzKQoKICAgIE5lZ2F0aXZlIHZhbHVlcyBvZiB4b2Zmc2V0LCB5b2Zmc2V0LCBhbmQgem9mZnNldCBjb3JyZXNwb25kIHRvIHRoZQogICAgY29vcmRpbmF0ZXMgb2YgYm9yZGVyIHRleGVscywgYWRkcmVzc2VkIGFzIGluIGZpZ3VyZSAzLjEwLiBUYWtpbmcgd19zLAogICAgaF9zLCBkX3MsIHdfYiwgaF9iLCBhbmQgZF9iIHRvIGJlIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGFuZAogICAgYm9yZGVyIHdpZHRoLCBoZWlnaHQsIGFuZCBkZXB0aCBvZiB0aGUgdGV4dHVyZSBhcnJheSwgYW5kIHRha2luZyB4LCB5LCB6LAogICAgdywgaCwgYW5kIGQgdG8gYmUgdGhlIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGFuZCBkZXB0aAogICAgYXJndW1lbnQgdmFsdWVzLCBhbnkgb2YgdGhlIGZvbGxvd2luZyByZWxhdGlvbnNoaXBzIGdlbmVyYXRlcyB0aGUgZXJyb3IKICAgIElOVkFMSUQgVkFMVUU6ICAKCiAgICAgICAgeCA8IC13X2IKICAgICAgICB4ICsgdyA+IHdfcyAtIHdfYgogICAgICAgIHkgPCAtaF9iCiAgICAgICAgeSArIGggPiBoX3MgLSBoX2IKICAgICAgICB6IDwgLWRfYgogICAgICAgIHogKyBkID4gZF9zIC0gZF9iCgogICAgTW9kaWZ5IFNlY3Rpb24gMy44LjQsIFRleHR1cmUgUGFyYW1ldGVycyAocC4gMTY2KQoKICAgIChtb2RpZnkgZmlyc3QgcGFyYWdyYXBoIG9mIHNlY3Rpb24sIHAuIDE2NikgVmFyaW91cyBwYXJhbWV0ZXJzIGNvbnRyb2wgaG93CiAgICB0aGUgdGV4ZWwgYXJyYXkgaXMgdHJlYXRlZCB3aGVuIHNwZWNpZmllZCBvciBjaGFuZ2VkLCBhbmQgd2hlbiBhcHBsaWVkIHRvCiAgICBhIGZyYWdtZW50LiBFYWNoIHBhcmFtZXRlciBpcyBzZXQgYnkgY2FsbGluZwoKICAgICAgdm9pZCBUZXhQYXJhbWV0ZXJ7aWZ9KCBlbnVtIHRhcmdldCwgZW51bSBwbmFtZSwgVCBwYXJhbSApOyAKICAgICAgdm9pZCBUZXhQYXJhbWV0ZXJ7aWZ9diggZW51bSB0YXJnZXQsIGVudW0gcG5hbWUsIFQgcGFyYW1zICk7IAoKICAgIHRhcmdldCBpcyB0aGUgdGFyZ2V0LCBlaXRoZXIgVEVYVFVSRV8xRCwgVEVYVFVSRV8yRCwgVEVYVFVSRV8zRCwKICAgIFRFWFRVUkVfQ1VCRV9NQVAsIFRFWFRVUkVfMURfQVJSQVlfRVhULCBvciBURVhUVVJFXzJEX0FSUkFZX0VYVC4KCiAgICBNb2RpZnkgU2VjdGlvbiAzLjguOCwgVGV4dHVyZSBNaW5pZmljYXRpb24gKHAuIDE3MCkKCiAgICAobW9kaWZ5IGZpcnN0IHBhcmFncmFwaCwgcC4gMTcyKSAuLi4gRm9yIGEgb25lLWRpbWVuc2lvbmFsIG9yCiAgICBvbmUtZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZSwgZGVmaW5lIHYoeCwgeSkgPT0gMCBhbmQgdyh4LCB5KSA9PSAwOyBmb3IgYQogICAgdHdvLWRpbWVuc2lvbmFsLCB0d28tZGltZW5zaW9uYWwgYXJyYXksIG9yIGN1YmUgbWFwIHRleHR1cmUsIGRlZmluZSB3KHgsCiAgICB5KSA9PSAwLiAuLi4KCiAgICAobW9kaWZ5IHNlY29uZCBwYXJhZ3JhcGgsIHAuIDE3MykgRm9yIG9uZS1kaW1lbnNpb25hbCBvciBvbmUtZGltZW5zaW9uYWwKICAgIGFycmF5IHRleHR1cmVzLCBqIGFuZCBrIGFyZSBpcnJlbGV2YW50OyB0aGUgdGV4ZWwgYXQgbG9jYXRpb24gaSBiZWNvbWVzCiAgICB0aGUgdGV4dHVyZSB2YWx1ZS4gRm9yIHR3by1kaW1lbnNpb25hbCwgdHdvLWRpbWVuc2lvbmFsIGFycmF5LCBvciBjdWJlIG1hcAogICAgdGV4dHVyZXMsIGsgaXMgaXJyZWxldmFudDsgdGhlIHRleGVsIGF0IGxvY2F0aW9uIChpLCBqKSBiZWNvbWVzIHRoZQogICAgdGV4dHVyZSB2YWx1ZS4gIEZvciBvbmUtIGFuZCB0d28tZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZXMsIHRoZSB0ZXhlbCBpcwogICAgb2J0YWluZWQgZnJvbSBpbWFnZSBsYXllciBsLCB3aGVyZQoKICAgICAgbCA9IGNsYW1wKGZsb29yKHQgKyAwLjUpLCAwLCBoX3QtMSksIGZvciBvbmUtZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZXMsCiAgICAgICAgICBjbGFtcChmbG9vcihyICsgMC41KSwgMCwgZF90LTEpLCBmb3IgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmVzLiAgICAgIAoKICAgIChtb2RpZnkgdGhpcmQgcGFyYWdyYXBoLCBwLiAxNzQpICBGb3IgYSB0d28tZGltZW5zaW9uYWwsIHR3by1kaW1lbnNpb25hbAogICAgYXJyYXksIG9yIGN1YmUgbWFwIHRleHR1cmUsCiAKICAgICAgdGF1ID0gLi4uCgogICAgd2hlcmUgdGF1X2lqIGlzIHRoZSB0ZXhlbCBhdCBsb2NhdGlvbiAoaSwgaikgaW4gdGhlIHR3by1kaW1lbnNpb25hbAogICAgdGV4dHVyZSBpbWFnZS4gIEZvciB0d28tZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZXMsIGFsbCB0ZXhlbHMgYXJlCiAgICBvYnRhaW5lZCBmcm9tIGxheWVyIGwsIHdoZXJlCgogICAgICBsID0gY2xhbXAoZmxvb3IociArIDAuNSksIDAsIGRfdC0xKS4KCiAgICBBbmQgZm9yIGEgb25lLWRpbWVuc2lvbmFsIG9yIG9uZS1kaW1lbnNpb25hbCBhcnJheSB0ZXh0dXJlLAoKICAgICAgdGF1ID0gLi4uCgogICAgd2hlcmUgdGF1X2kgaXMgdGhlIHRleGVsIGF0IGxvY2F0aW9uIGkgaW4gdGhlIG9uZS1kaW1lbnNpb25hbCB0ZXh0dXJlLgogICAgRm9yIG9uZS1kaW1lbnNpb25hbCBhcnJheSB0ZXh0dXJlcywgYm90aCB0ZXhlbHMgYXJlIG9idGFpbmVkIGZyb20gbGF5ZXIgbCwKICAgIHdoZXJlCgogICAgICBsID0gY2xhbXAoZmxvb3IodCArIDAuNSksIDAsIGhfdC0xKS4KCiAgICAobW9kaWZ5IGZpcnN0IHR3byBwYXJhZ3JhcGhzIG9mICJNaXBtYXBwaW5nIiwgcC4gMTc1KSBURVhUVVJFX01JTl9GSUxURVIKICAgIHZhbHVlcyBORUFSRVNUX01JUE1BUF9ORUFSRVNULCBORUFSRVNUX01JUE1BUF9MSU5FQVIsCiAgICBMSU5FQVJfTUlQTUFQX05FQVJFU1QsIGFuZCBMSU5FQVJfTUlQTUFQX0xJTkVBUiBlYWNoIHJlcXVpcmUgdGhlIHVzZSBvZiBhCiAgICBtaXBtYXAuIEEgbWlwbWFwIGlzIGFuIG9yZGVyZWQgc2V0IG9mIGFycmF5cyByZXByZXNlbnRpbmcgdGhlIHNhbWUgaW1hZ2U7CiAgICBlYWNoIGFycmF5IGhhcyBhIHJlc29sdXRpb24gbG93ZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lLgoKICAgIElmIHRoZSBpbWFnZSBhcnJheSBvZiBsZXZlbCBsZXZlbF9iYXNlLCBleGNsdWRpbmcgaXRzIGJvcmRlciwgaGFzCiAgICBkaW1lbnNpb25zLCB3X3Qg1yBoX3Qg1yBkX3QsIHRoZW4gdGhlcmUgYXJlIGZsb29yKGxvZzIobWF4c2l6ZSkpICsgMQogICAgbGV2ZWxzIGluIHRoZSBtaXBtYXAsIHdoZXJlCgogICAgICBtYXhzaXplID0gd190LCAgICAgICAgICAgICAgICAgIGZvciBvbmUtZGltZW5zaW9uYWwgYW5kIG9uZS1kaW1lbnNpb25hbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IHRleHR1cmVzLAogICAgICAgICAgICAgICAgbWF4KHdfdCwgaF90KSwgICAgICAgIGZvciB0d28tZGltZW5zaW9uYWwsIHR3by1kaW1lbnNpb25hbCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSwgYW5kIGN1YmUgbWFwIHRleHR1cmVzCiAgICAgICAgICAgICAgICBtYXgod190LCBoX3QsIGRfdCksICAgZm9yIHRocmVlIGRpbWVuc2lvbmFsIHRleHR1cmVzLgoKICAgTnVtYmVyaW5nIHRoZSBsZXZlbHMgc3VjaCB0aGF0IGxldmVsIGxldmVsX2Jhc2UgaXMgdGhlIDB0aCBsZXZlbCwgdGhlIGl0aAogICBhcnJheSBoYXMgZGltZW5zaW9ucwoKICAgICBtYXgoMSwgZmxvb3Iod190L3dfZCkpIHggbWF4KDEsIGZsb29yKGhfdC9oX2QpKSB4IG1heCgxLCBmbG9vcihkX3QvZF9kKSkKCiAgIHdoZXJlCgogICAgIHdfZCA9IDIgXiBpOwogICAgIGhfZCA9IDEsIGZvciBvbmUtZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZXMgYW5kCiAgICAgICAgICAgMiBeIGksIG90aGVyd2lzZTsgYW5kCiAgICAgZF9kID0gMSwgZm9yIHR3by1kaW1lbnNpb25hbCBhcnJheSB0ZXh0dXJlcyBhbmQgCiAgICAgICAgICAgMiBeIGksIG90aGVyd2lzZSwKCiAgICB1bnRpbCB0aGUgbGFzdCBhcnJheSBpcyByZWFjaGVkIHdpdGggZGltZW5zaW9uIDEg1yAxINcgMS4KCiAgICBFYWNoIGFycmF5IGluIGEgbWlwbWFwIGlzIGRlZmluZWQgdXNpbmcgVGV4SW1hZ2UzRCwgVGV4SW1hZ2UyRCwKICAgIENvcHlUZXhJbWFnZTJELCBUZXhJbWFnZTFELCBvciBDb3B5VGV4SW1hZ2UxRDsgdGhlIGFycmF5IGJlaW5nIHNldCBpcwogICAgaW5kaWNhdGVkIHdpdGggdGhlIGxldmVsLW9mLWRldGFpbCBhcmd1bWVudCBsZXZlbC4gTGV2ZWwtb2YtZGV0YWlsIG51bWJlcnMKICAgIHByb2NlZWQgZnJvbSBsZXZlbF9iYXNlIGZvciB0aGUgb3JpZ2luYWwgdGV4dHVyZSBhcnJheSB0aHJvdWdoIHAgPQogICAgZmxvb3IobG9nMihtYXhzaXplKSkgKyBsZXZlbF9iYXNlIHdpdGggZWFjaCB1bml0IGluY3JlYXNlIGluZGljYXRpbmcgYW4KICAgIGFycmF5IG9mIGhhbGYgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHByZXZpb3VzIG9uZSAocm91bmRlZCBkb3duIHRvIHRoZSBuZXh0CiAgICBpbnRlZ2VyIGlmIGZyYWN0aW9uYWwpIGFzIGFscmVhZHkgZGVzY3JpYmVkLiAgQWxsIGFycmF5cyBmcm9tIGxldmVsX2Jhc2UKICAgIHRocm91Z2ggcSA9IG1pbntwLCBsZXZlbF9tYXh9IG11c3QgYmUgZGVmaW5lZCwgYXMgZGlzY3Vzc2VkIGluIHNlY3Rpb24KICAgIDMuOC4xMC4KCiAgICAobW9kaWZ5IHRoaXJkIHBhcmFncmFwaCBpbiB0aGUgIk1pcG1hcCBHZW5lcmF0aW9uIiBzZWN0aW9uLCBwLiAxNzYpCgogICAgVGhlIGNvbnRlbnRzIG9mIHRoZSBkZXJpdmVkIGFycmF5cyBhcmUgY29tcHV0ZWQgYnkgcmVwZWF0ZWQsIGZpbHRlcmVkCiAgICByZWR1Y3Rpb24gb2YgdGhlIGxldmVsX2Jhc2UgYXJyYXkuICBGb3Igb25lLSBhbmQgdHdvLWRpbWVuc2lvbmFsIGFycmF5CiAgICB0ZXh0dXJlcywgZWFjaCBsYXllciBpcyBmaWx0ZXJlZCBpbmRlcGVuZGVudGx5LiAgLi4uCgogICAgTW9kaWZ5IFNlY3Rpb24gMy44LjEwLCBUZXh0dXJlIENvbXBsZXRlbmVzcyAocC4gMTc3KQoKICAgIChtb2RpZnkgc2Vjb25kIHBhcmFnYXBoIG9mIHNlY3Rpb24sIHAuIDE3NykgRm9yIG9uZS0sIHR3by0sIG9yCiAgICB0aHJlZS1kaW1lbnNpb25hbCB0ZXh0dXJlcyBhbmQgb25lLSBvciB0d28tZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZXMsIGEKICAgIHRleHR1cmUgaXMgY29tcGxldGUgaWYgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFsbCBob2xkIHRydWU6IC4uLgoKICAgIE1vZGlmeSBTZWN0aW9uIDMuOC4xMSwgVGV4dHVyZSBTdGF0ZSBhbmQgUHJveHkgU3RhdGUgKHAuIDE3OCkKCiAgICAobW9kaWZ5IHNlY29uZCBhbmQgdGhpcmQgcGFyYWdyYXBocywgcC4gMTc5LCBhZGRpbmcgYXJyYXkgdGV4dHVyZXMgYW5kCiAgICBtYWtpbmcgbWlub3Igd29yZGluZyBjaGFuZ2VzKQoKICAgIEluIGFkZGl0aW9uIHRvIGltYWdlIGFycmF5cyBmb3Igb25lLSwgdHdvLSwgYW5kIHRocmVlLWRpbWVuc2lvbmFsCiAgICB0ZXh0dXJlcywgb25lLSBhbmQgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmVzLCBhbmQgdGhlIHNpeCBpbWFnZQogICAgYXJyYXlzIGZvciB0aGUgY3ViZSBtYXAgdGV4dHVyZSwgcGFydGlhbGx5IGluc3RhbnRpYXRlZCBpbWFnZSBhcnJheXMgYXJlCiAgICBtYWludGFpbmVkIGZvciBvbmUtLCB0d28tLCBhbmQgdGhyZWUtZGltZW5zaW9uYWwgdGV4dHVyZXMgYW5kIG9uZS0gYW5kCiAgICB0d28tZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZXMuICBBZGRpdGlvbmFsbHksIGEgc2luZ2xlIHByb3h5IGltYWdlIGFycmF5CiAgICBpcyBtYWludGFpbmVkIGZvciB0aGUgY3ViZSBtYXAgdGV4dHVyZS4gIEVhY2ggcHJveHkgaW1hZ2UgYXJyYXkgaW5jbHVkZXMKICAgIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBib3JkZXIgd2lkdGgsIGFuZCBpbnRlcm5hbCBmb3JtYXQgc3RhdGUgdmFsdWVzLCBhcwogICAgd2VsbCBhcyBzdGF0ZSBmb3IgdGhlIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhLCBsdW1pbmFuY2UsIGFuZCBpbnRlbnNpdHkKICAgIGNvbXBvbmVudCByZXNvbHV0aW9ucy4gUHJveHkgaW1hZ2UgYXJyYXlzIGRvIG5vdCBpbmNsdWRlIGltYWdlIGRhdGEsIG5vcgogICAgZG8gdGhleSBpbmNsdWRlIHRleHR1cmUgcHJvcGVydGllcy4gV2hlbiBUZXhJbWFnZTNEIGlzIGV4ZWN1dGVkIHdpdGgKICAgIHRhcmdldCBzcGVjaWZpZWQgYXMgUFJPWFlfVEVYVFVSRV8zRCwgdGhlIHRocmVlLWRpbWVuc2lvbmFsIHByb3h5IHN0YXRlCiAgICB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBsZXZlbC1vZi1kZXRhaWwgYXJlIHJlY29tcHV0ZWQgYW5kIHVwZGF0ZWQuIElmIHRoZQogICAgaW1hZ2UgYXJyYXkgd291bGQgbm90IGJlIHN1cHBvcnRlZCBieSBUZXhJbWFnZTNEIGNhbGxlZCB3aXRoIHRhcmdldCBzZXQgdG8KICAgIFRFWFRVUkUgM0QsIG5vIGVycm9yIGlzIGdlbmVyYXRlZCwgYnV0IHRoZSBwcm94eSB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwKICAgIGJvcmRlciB3aWR0aCwgYW5kIGNvbXBvbmVudCByZXNvbHV0aW9ucyBhcmUgc2V0IHRvIHplcm8uIElmIHRoZSBpbWFnZQogICAgYXJyYXkgd291bGQgYmUgc3VwcG9ydGVkIGJ5IHN1Y2ggYSBjYWxsIHRvIFRleEltYWdlM0QsIHRoZSBwcm94eSBzdGF0ZQogICAgdmFsdWVzIGFyZSBzZXQgZXhhY3RseSBhcyB0aG91Z2ggdGhlIGFjdHVhbCBpbWFnZSBhcnJheSB3ZXJlIGJlaW5nCiAgICBzcGVjaWZpZWQuIE5vIHBpeGVsIGRhdGEgYXJlIHRyYW5zZmVycmVkIG9yIHByb2Nlc3NlZCBpbiBlaXRoZXIgY2FzZS4KCiAgICBQcm94eSBhcnJheXMgZm9yIG9uZS0gYW5kIHR3by1kaW1lbnNpb25hbCB0ZXh0dXJlcyBhbmQgb25lLSBhbmQKICAgIHR3by1kaW1lbnNpb25hbCBhcnJheSB0ZXh0dXJlcyBhcmUgb3BlcmF0ZWQgb24gaW4gdGhlIHNhbWUgd2F5IHdoZW4KICAgIFRleEltYWdlMUQgaXMgZXhlY3V0ZWQgd2l0aCB0YXJnZXQgc3BlY2lmaWVkIGFzIFBST1hZX1RFWFRVUkVfMUQsCiAgICBUZXhJbWFnZTJEIGlzIGV4ZWN1dGVkIHdpdGggdGFyZ2V0IHNwZWNpZmllZCBhcyBQUk9YWV9URVhUVVJFXzJEIG9yCiAgICBQUk9YWV9URVhUVVJFXzFEX0FSUkFZX0VYVCwgb3IgVGV4SW1hZ2UzRCBpcyBleGVjdXRlZCB3aXRoIHRhcmdldAogICAgc3BlY2lmaWVkIGFzIFBST1hZX1RFVFhVUkVfMkRfQVJSQVlfRVhULgoKICAgIE1vZGlmeSBTZWN0aW9uIDMuOC4xMiwgVGV4dHVyZSBPYmplY3RzIChwLiAxODApCgogICAgKHVwZGF0ZSBtb3N0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gdG8gYWxsb3cgYXJyYXkgdGV4dHVyZXMpCgogICAgSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgdGV4dHVyZXMgVEVYVFVSRV8xRCwgVEVYVFVSRV8yRCwgVEVYVFVSRV8zRCwKICAgIFRFWFRVUkVfQ1VCRV9NQVAsIFRFWFRVUkVfMURfQVJSQVlfRVhULCBhbmQgVEVYVFVSRV8yRF9FWFQsIG5hbWVkIG9uZS0sCiAgICB0d28tLCBhbmQgdGhyZWUtZGltZW5zaW9uYWwsIGN1YmUgbWFwLCBhbmQgb25lLSBhbmQgdHdvLWRpbWVuc2lvbmFsIGFycmF5CiAgICB0ZXh0dXJlIG9iamVjdHMgY2FuIGJlIGNyZWF0ZWQgYW5kIG9wZXJhdGVkIHVwb24uIFRoZSBuYW1lIHNwYWNlIGZvcgogICAgdGV4dHVyZSBvYmplY3RzIGlzIHRoZSB1bnNpZ25lZCBpbnRlZ2Vycywgd2l0aCB6ZXJvIHJlc2VydmVkIGJ5IHRoZSBHTC4KCiAgICBBIHRleHR1cmUgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgYmluZGluZyBhbiB1bnVzZWQgbmFtZSB0byBURVhUVVJFXzFELAogICAgVEVYVFVSRV8yRCwgVEVYVFVSRV8zRCwgVEVYVFVSRV9DVUJFX01BUCwgVEVYVFVSRV8xRF9BUlJBWV9FWFQsIG9yCiAgICBURVhUVVJFXzJEX0FSUkFZX0VYVC4gVGhlIGJpbmRpbmcgaXMgZWZmZWN0ZWQgYnkgY2FsbGluZwoKICAgICAgdm9pZCBCaW5kVGV4dHVyZSggZW51bSB0YXJnZXQsIHVpbnQgdGV4dHVyZSApOwoKICAgIHdpdGggPHRhcmdldD4gc2V0IHRvIHRoZSBkZXNpcmVkIHRleHR1cmUgdGFyZ2V0IGFuZCA8dGV4dHVyZT4gc2V0IHRvIHRoZQogICAgdW51c2VkIG5hbWUuICBUaGUgcmVzdWx0aW5nIHRleHR1cmUgb2JqZWN0IGlzIGEgbmV3IHN0YXRlIHZlY3RvciwKICAgIGNvbXByaXNpbmcgYWxsIHRoZSBzdGF0ZSB2YWx1ZXMgbGlzdGVkIGluIHNlY3Rpb24gMy44LjExLCBzZXQgdG8gdGhlIHNhbWUKICAgIGluaXRpYWwgdmFsdWVzLiBJZiB0aGUgbmV3IHRleHR1cmUgb2JqZWN0IGlzIGJvdW5kIHRvIFRFWFRVUkVfMUQsCiAgICBURVhUVVJFXzJELCBURVhUVVJFXzNELCBURVhUVVJFX0NVQkVfTUFQLCBURVhUVVJFXzFEX0FSUkFZX0VYVCwgb3IKICAgIFRFWFRVUkVfMkRfQVJSQVlfRVhULCBpdCBpcyBhbmQgcmVtYWlucyBhIG9uZS0sIHR3by0sIHRocmVlLWRpbWVuc2lvbmFsLAogICAgY3ViZSBtYXAsIG9uZS0gb3IgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmUgcmVzcGVjdGl2ZWx5IHVudGlsIGl0IGlzCiAgICBkZWxldGVkLgoKICAgIEJpbmRUZXh0dXJlIG1heSBhbHNvIGJlIHVzZWQgdG8gYmluZCBhbiBleGlzdGluZyB0ZXh0dXJlIG9iamVjdCB0byBlaXRoZXIKICAgIFRFWFRVUkVfMUQsIFRFWFRVUkVfMkQsIFRFWFRVUkVfM0QsIFRFWFRVUkVfQ1VCRV9NQVAsCiAgICBURVhUVVJFXzFEX0FSUkFZX0VYVCwgb3IgVEVYVFVSRV8yRF9BUlJBWV9FWFQuIFRoZSBlcnJvciBJTlZBTElEX09QRVJBVElPTgogICAgaXMgZ2VuZXJhdGVkIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBiaW5kIGEgdGV4dHVyZSBvYmplY3Qgb2YgZGlmZmVyZW50CiAgICBkaW1lbnNpb25hbGl0eSB0aGFuIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LiBJZiB0aGUgYmluZCBpcyBzdWNjZXNzZnVsIG5vCiAgICBjaGFuZ2UgaXMgbWFkZSB0byB0aGUgc3RhdGUgb2YgdGhlIGJvdW5kIHRleHR1cmUgb2JqZWN0LCBhbmQgYW55IHByZXZpb3VzCiAgICBiaW5kaW5nIHRvIHRhcmdldCBpcyBicm9rZW4uCgogICAgV2hpbGUgYSB0ZXh0dXJlIG9iamVjdCBpcyBib3VuZCwgR0wgb3BlcmF0aW9ucyBvbiB0aGUgdGFyZ2V0IHRvIHdoaWNoIGl0CiAgICBpcyBib3VuZCBhZmZlY3QgdGhlIGJvdW5kIG9iamVjdCwgYW5kIHF1ZXJpZXMgb2YgdGhlIHRhcmdldCB0byB3aGljaCBpdCBpcwogICAgYm91bmQgcmV0dXJuIHN0YXRlIGZyb20gdGhlIGJvdW5kIG9iamVjdC4gSWYgdGV4dHVyZSBtYXBwaW5nIG9mIHRoZQogICAgZGltZW5zaW9uYWxpdHkgb2YgdGhlIHRhcmdldCB0byB3aGljaCBhIHRleHR1cmUgb2JqZWN0IGlzIGJvdW5kIGlzCiAgICBlbmFibGVkLCB0aGUgc3RhdGUgb2YgdGhlIGJvdW5kIHRleHR1cmUgb2JqZWN0IGRpcmVjdHMgdGhlIHRleHR1cmluZwogICAgb3BlcmF0aW9uLgoKICAgIEluIHRoZSBpbml0aWFsIHN0YXRlLCBURVhUVVJFXzFELCBURVhUVVJFXzJELCBURVhUVVJFXzNELAogICAgVEVYVFVSRV9DVUJFX01BUCwgVEVYVFVSRV8xRF9BUlJBWV9FWFQsIGFuZCBURVhUVVJFXzJEX0FSUkFZX0VYVCBoYXZlCiAgICBvbmUtLCB0d28tLCB0aHJlZS1kaW1lbnNpb25hbCwgY3ViZSBtYXAsIGFuZCBvbmUtIGFuZCB0d28tZGltZW5zaW9uYWwKICAgIGFycmF5IHRleHR1cmUgc3RhdGUgdmVjdG9ycyByZXNwZWN0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIHRoZW0uIEluIG9yZGVyCiAgICB0aGF0IGFjY2VzcyB0byB0aGVzZSBpbml0aWFsIHRleHR1cmVzIG5vdCBiZSBsb3N0LCB0aGV5IGFyZSB0cmVhdGVkIGFzCiAgICB0ZXh0dXJlIG9iamVjdHMgYWxsIG9mIHdob3NlIG5hbWVzIGFyZSAwLiBUaGUgaW5pdGlhbCBvbmUtLCB0d28tLAogICAgdGhyZWUtZGltZW5zaW9uYWwsIGN1YmUgbWFwLCBvbmUtIGFuZCB0d28tZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZXMgYXJlCiAgICB0aGVyZWZvcmUgb3BlcmF0ZWQgdXBvbiwgcXVlcmllZCwgYW5kIGFwcGxpZWQgYXMgVEVYVFVSRV8xRCwgVEVYVFVSRV8yRCwKICAgIFRFWFRVUkVfM0QsIFRFWFRVUkVfQ1VCRV9NQVAsIFRFWFRVUkVfMURfQVJSQVlfRVhULCBhbmQKICAgIFRFWFRVUkVfMkRfQVJSQVlfRVhUIHJlc3BlY3RpdmVseSB3aGlsZSAwIGlzIGJvdW5kIHRvIHRoZSBjb3JyZXNwb25kaW5nCiAgICB0YXJnZXRzLgoKICAgIChtb2RpZnkgc2Vjb25kIHBhcmFncmFwaCwgcC4gMTgxKSAuLi4gIElmIGEgdGV4dHVyZSB0aGF0IGlzIGN1cnJlbnRseQogICAgYm91bmQgdG8gb25lIG9mIHRoZSB0YXJnZXRzIFRFWFRVUkVfMUQsIFRFWFRVUkVfMkQsIFRFWFRVUkVfM0QsCiAgICBURVhUVVJFX0NVQkVfTUFQLCBURVhUVVJFXzFEX0FSUkFZX0VYVCwgb3IgVEVYVFVSRV8yRF9BUlJBWV9FWFQgaXMKICAgIGRlbGV0ZWQsIGl0IGlzIGFzIHRob3VnaCBCaW5kVGV4dHVyZSBoYWQgYmVlbiBleGVjdXRlZCB3aXRoIHRoZSBzYW1lCiAgICB0YXJnZXQgYW5kIHRleHR1cmUgemVyby4gLi4uCgogICAgKG1vZGlmeSBzZWNvbmQgcGFyYWdyYXBoLCBwLiAxODIpIFRoZSB0ZXh0dXJlIG9iamVjdCBuYW1lIHNwYWNlLCBpbmNsdWRpbmcKICAgIHRoZSBpbml0aWFsIG9uZS0sIHR3by0sIGFuZCB0aHJlZSBkaW1lbnNpb25hbCwgY3ViZSBtYXAsIGFuZCBvbmUtIGFuZAogICAgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmUgb2JqZWN0cywgaXMgc2hhcmVkIGFtb25nIGFsbCB0ZXh0dXJlCiAgICB1bml0cy4gLi4uCiAgICAKICAgIE1vZGlmeSBTZWN0aW9uIDMuOC4xNCwgVGV4dHVyZSBDb21wYXJpc29uIE1vZGVzIChwLiAxODUpCgogICAgKG1vZGlmeSBzZWNvbmQgdGhyb3VnaCBmb3VydGggcGFyYWdyYXBocywgcC4gMTg4LCByZWZsZWN0aW5nIHRoYXQgdGhlCiAgICB0ZXh0dXJlIGNvb3JkaW5hdGUgdXNlZCBmb3IgZGVwdGggY29tcGFyaXNvbnMgdmFyaWVzLCBpbmNsdWRpbmcgYSBuZXcgZW51bQogICAgbmFtZSkKCiAgICBMZXQgRF90IGJlIHRoZSBkZXB0aCB0ZXh0dXJlIHZhbHVlLCBpbiB0aGUgcmFuZ2UgWzAsIDFdLiAgRm9yCiAgICBmaXhlZC1mdW5jdGlvbiB0ZXh0dXJlIGxvb2t1cHMsIGxldCBSIGJlIHRoZSBpbnRlcnBvbGF0ZWQgPHI+IHRleHR1cmUKICAgIGNvb3JkaW5hdGUsIGNsYW1wZWQgdG8gdGhlIHJhbmdlIFswLCAxXS4gIEZvciB0ZXh0dXJlIGxvb2t1cHMgZ2VuZXJhdGVkIGJ5CiAgICBhIHByb2dyYW0gaW5zdHJ1Y3Rpb24sIGxldCBSIGJlIHRoZSByZWZlcmVuY2UgdmFsdWUgZm9yIGRlcHRoIGNvbXBhcmlzb25zCiAgICBwcm92aWRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24sIGFsc28gY2xhbXBlZCB0byBbMCwgMV0uICBUaGVuIHRoZSBlZmZlY3RpdmUKICAgIHRleHR1cmUgdmFsdWUgTF90LCBJX3QsIG9yIEFfdCBpcyBjb21wdXRlZCBhcyBmb2xsb3dzOiAuLi4KCiAgICBJZiB0aGUgdmFsdWUgb2YgVEVYVFVSRV9DT01QQVJFX01PREUgaXMgTk9ORSwgdGhlbgoKICAgICAgciA9IER0CgogICAgSWYgdGhlIHZhbHVlIG9mIFRFWFRVUkVfQ09NUEFSRV9NT0RFIGlzIENPTVBBUkVfUkVGX0RFUFRIX1RPX1RFWFRVUkVfRVhUKSwKICAgIHRoZW4gciBkZXBlbmRzIG9uIHRoZSB0ZXh0dXJlIGNvbXBhcmlzb24gZnVuY3Rpb24gYXMgc2hvd24gaW4gdGFibGUgMy4yNy4KCiAgICBNb2RpZnkgU2VjdGlvbiAzLjExLjIsIFNoYWRlciBFeGVjdXRpb24gKHAuIDE5NCkKCiAgICAobW9kaWZ5IHNlY29uZCBwYXJhZ3JhcGgsIHAuIDE5NSAtLSB0d28gc2ltcGxlIGVkaXRzOgoKICAgICAgKDEpIENoYW5nZSByZWZlcmVuY2UgdG8gdGhlICJyIiBjb29yZGluYXRlIHRvIHNpbXBseSBpbmRpY2F0ZSB0aGF0IHRoZQogICAgICAgICAgcmVmZXJlbmNlIHZhbHVlIGZvciBzaGFkb3cgbWFwcGluZyBpcyBwcm92aWRlZCBpbiB0aGUgbG9va3VwCiAgICAgICAgICBmdW5jdGlvbi4gIEl0J3Mgc3RpbGwgdXN1YWxseSBpbiB0aGUgInIiIGNvb3JkaW5hdGUsIGV4Y2VwdCBmb3IKICAgICAgICAgIHR3by1kaW1lbnNpb25hbCBhcnJheSB0ZXh0dXJlcywgd2hlcmUgaXQncyBpbiAicSIuCiAgICAgICgyKSBBZGQgbmV3IEVYVF9ncHVfc2hhZGVyNCBzYW1wbGVyIHR5cGVzIHVzZWQgZm9yIGFycmF5IHRleHR1cmVzLiApCgogICAgVGV4dHVyZSBsb29rdXBzIGludm9sdmluZyB0ZXh0dXJlcyB3aXRoIGRlcHRoIGNvbXBvbmVudCBkYXRhIGNhbiBlaXRoZXIKICAgIHJldHVybiB0aGUgZGVwdGggZGF0YSBkaXJlY3RseSBvciByZXR1cm4gdGhlIHJlc3VsdHMgb2YgYSBjb21wYXJpc29uIHdpdGgKICAgIGEgcmVmZXJlbmNlIGRlcHRoIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgY29vcmRpbmF0ZXMgcGFzc2VkIHRvIHRoZSB0ZXh0dXJlCiAgICBsb29rdXAgZnVuY3Rpb24uICBUaGUgY29tcGFyaXNvbiBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIGluIHRoZSBzaGFkZXIgYnkKICAgIHVzaW5nIHRoZSBzaGFkb3cgc2FtcGxlciB0eXBlcyAoc2FtcGxlcjFEU2hhZG93LCBzYW1wbGVyMkRTaGFkb3csCiAgICBzYW1wbGVyMURBcnJheVNoYWRvdywgYW5kIHNhbXBsZXIyREFycmF5U2hhZG93KSBhbmQgaW4gdGhlIHRleHR1cmUgdXNpbmcKICAgIHRoZSBURVhUVVJFIENPTVBBUkUgTU9ERSBwYXJhbWV0ZXIuIC4uLgoKQWRkaXRpb25zIHRvIENoYXB0ZXIgNCBvZiB0aGUgT3BlbkdMIDIuMCBTcGVjaWZpY2F0aW9uIChQZXItRnJhZ21lbnQKT3BlcmF0aW9ucyBhbmQgdGhlIEZyYW1lIEJ1ZmZlcikKCiAgICBOb25lLgoKQWRkaXRpb25zIHRvIENoYXB0ZXIgNSBvZiB0aGUgT3BlbkdMIDIuMCBTcGVjaWZpY2F0aW9uIChTcGVjaWFsIEZ1bmN0aW9ucykKCiAgICBNb2RpZnkgU2VjdGlvbiA1LjQsIERpc3BsYXkgTGlzdHMgKHAuIDIzNykKCiAgICAobW9kaWZ5IGZpcnN0IHBhcmFncmFwaCwgcC4gMjQyKSBUZXhJbWFnZTNELCBUZXhJbWFnZTJELCBUZXhJbWFnZTFELAogICAgSGlzdG9ncmFtLCBhbmQgQ29sb3JUYWJsZSBhcmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgd2hlbiBjYWxsZWQgd2l0aCB0aGUKICAgIGNvcnJlc3BvbmRpbmcgcHJveHkgYXJndW1lbnRzIFBST1hZX1RFWFRVUkVfM0Qgb3IKICAgIFBST1hZX1RFWFRVUkVfMkRfQVJSQVlfRVhUOyBQUk9YWV9URVhUVVJFXzJELCBQUk9YWV9URVhUVVJFX0NVQkVfTUFQLCBvcgogICAgUFJPWFlfVEVYVFVSRV8xRF9BUlJBWV9FWFQ7IFBST1hZX1RFWFRVUkVfMUQ7IFBST1hZX0hJU1RPR1JBTTsgYW5kCiAgICBQUk9YWV9DT0xPUl9UQUJMRSwgUFJPWFlfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRSwgb3IKICAgIFBST1hZX1BPU1RfQ09MT1JfTUFUUklYX0NPTE9SX1RBQkxFLgoKQWRkaXRpb25zIHRvIENoYXB0ZXIgNiBvZiB0aGUgT3BlbkdMIDIuMCBTcGVjaWZpY2F0aW9uIChTdGF0ZSBhbmQKU3RhdGUgUmVxdWVzdHMpCgogICAgTW9kaWZ5IFNlY3Rpb24gNi4xLjMsIEVudW1lcmF0ZWQgUXVlcmllcyAocC4gMjQ2KQoKICAgIChtb2RpZnkgc2Vjb25kIHBhcmFncmFwaCwgcC4gMjQ3KQoKICAgIEdldFRleFBhcmFtZXRlciBwYXJhbWV0ZXIgPHRhcmdldD4gbWF5IGJlIG9uZSBvZiBURVhUVVJFXzFELCBURVhUVVJFXzJELAogICAgVEVYVFVSRV8zRCwgVEVYVFVSRV9DVUJFX01BUCwgVEVYVFVSRV8xRF9BUlJBWV9FWFQsIG9yCiAgICBURVhUVVJFXzJEX0FSUkFZX0VYVCwgaW5kaWNhdGluZyB0aGUgY3VycmVudGx5IGJvdW5kIG9uZS0sIHR3by0sCiAgICB0aHJlZS1kaW1lbnNpb25hbCwgY3ViZSBtYXAsIG9yIG9uZS0gb3IgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmUuCiAgICBHZXRUZXhMZXZlbFBhcmFtZXRlciBwYXJhbWV0ZXIgdGFyZ2V0IG1heSBiZSBvbmUgb2YgVEVYVFVSRV8xRCwKICAgIFRFWFRVUkVfMkQsIFRFWFRVUkVfM0QsIFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwKICAgIFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCwgVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZLAogICAgVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZLCBURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1osCiAgICBURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1osIFRFWFRVUkVfMURfQVJSQVlfRVhULCBURVhUVVJFXzJEX0FSUkFZX0VYVCwKICAgIFBST1hZX1RFWFRVUkVfMUQsIFBST1hZX1RFWFRVUkVfMkQsIFBST1hZX1RFWFRVUkVfM0QsCiAgICBQUk9YWV9URVhUVVJFX0NVQkVfTUFQLCBQUk9YWV9URVhUVVJFXzFEX0FSUkFZLCBvciBQUk9YWV9URVhUVVJFXzJEX0FSUkFZLAogICAgaW5kaWNhdGluZyB0aGUgb25lLSwgdHdvLSwgb3IgdGhyZWUtZGltZW5zaW9uYWwgdGV4dHVyZSwgb25lIG9mIHRoZSBzaXgKICAgIGRpc3RpbmN0IDJEIGltYWdlcyBtYWtpbmcgdXAgdGhlIGN1YmUgbWFwIHRleHR1cmUsIHRoZSBvbmUtIG9yCiAgICB0d28tZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZSwgb3IgdGhlIG9uZS0sIHR3by0sIHRocmVlLWRpbWVuc2lvbmFsLCBjdWJlCiAgICBtYXAsIG9yIG9uZS0gb3IgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHByb3h5IHN0YXRlIHZlY3Rvci4gLi4uCgogICAgTW9kaWZ5IFNlY3Rpb24gNi4xLjQsIFRleHR1cmUgUXVlcmllcyAocC4gMjQ4KQoKICAgIChtb2RpZnkgZmlyc3QgdGhyZWUgcGFyYWdyYXBocyBvZiBzZWN0aW9uLCBwLiAyNDgpIFRoZSBjb21tYW5kCgogICAgICB2b2lkIEdldFRleEltYWdlKCBlbnVtIHRleCwgaW50IGxvZCwgZW51bSBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gdHlwZSwgdm9pZCAqaW1nICk7CgogICAgaXMgdXNlZCB0byBvYnRhaW4gdGV4dHVyZSBpbWFnZXMuIEl0IGlzIHNvbWV3aGF0IGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlcgogICAgZ2V0IGNvbW1hbmRzOyB0ZXggaXMgYSBzeW1ib2xpYyB2YWx1ZSBpbmRpY2F0aW5nIHdoaWNoIHRleHR1cmUgKG9yIHRleHR1cmUKICAgIGZhY2UgaW4gdGhlIGNhc2Ugb2YgYSBjdWJlIG1hcCB0ZXh0dXJlIHRhcmdldCBuYW1lKSBpcyB0byBiZSBvYnRhaW5lZC4KICAgIFRFWFRVUkVfMUQsIFRFWFRVUkVfMkQsIFRFWFRVUkVfM0QsIFRFWFRVUkVfMURfQVJSQVlfRVhULCBhbmQKICAgIFRFWFRVUkVfMkRfQVJSQVlfRVhUIGluZGljYXRlIGEgb25lLSwgdHdvLSwgb3IgdGhyZWUtZGltZW5zaW9uYWwgdGV4dHVyZSwKICAgIG9yIG9uZS0gb3IgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmUsIHJlc3BlY3RpdmVseS4KICAgIFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwgLi4uCgogICAgR2V0VGV4SW1hZ2Ugb2J0YWlucy4uLiBmcm9tIHRoZSBmaXJzdCBpbWFnZSB0byB0aGUgbGFzdCBmb3IKICAgIHRocmVlLWRpbWVuc2lvbmFsIHRleHR1cmVzLiAgT25lLSBhbmQgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmVzIGFyZQogICAgdHJlYXRlZCBhcyB0d28tIGFuZCB0aHJlZS1kaW1lbnNpb25hbCBpbWFnZXMsIHJlc3BlY3RpdmVseSwgd2hlcmUgdGhlCiAgICBsYXllcnMgYXJlIHRyZWF0ZWQgYXMgcm93cyBvciBpbWFnZXMuICBUaGVzZSBncm91cHMgYXJlIHRoZW4uLi4KCiAgICBGb3IgdGhyZWUtZGltZW5zaW9uYWwgYW5kIHR3by1kaW1lbnNpb25hbCBhcnJheSB0ZXh0dXJlcywgcGl4ZWwgc3RvcmFnZQogICAgb3BlcmF0aW9ucyBhcmUgYXBwbGllZCBhcyBpZiB0aGUgaW1hZ2Ugd2VyZSB0d28tZGltZW5zaW9uYWwsIGV4Y2VwdCB0aGF0CiAgICB0aGUgYWRkaXRpb25hbCBwaXhlbCBzdG9yYWdlIHN0YXRlIHZhbHVlcyBQQUNLX0lNQUdFX0hFSUdIVCBhbmQKICAgIFBBQ0tfU0tJUF9JTUFHRVMgYXJlIGFwcGxpZWQuIC4uLgoKQWRkaXRpb25zIHRvIEFwcGVuZGl4IEEgb2YgdGhlIE9wZW5HTCAyLjAgU3BlY2lmaWNhdGlvbiAoSW52YXJpYW5jZSkKCiAgICBOb25lLgoKQWRkaXRpb25zIHRvIHRoZSBBR0wvR0xYL1dHTCBTcGVjaWZpY2F0aW9ucwoKICAgIE5vbmUuCgpHTFggUHJvdG9jb2wKCiAgICBOb25lLgoKRGVwZW5kZW5jaWVzIG9uIEVYVF9mcmFtZWJ1ZmZlcl9vYmplY3QKCiAgICBJZiBFWFRfZnJhbWVidWZmZXJfb2JqZWN0IGlzIHN1cHBvcnRlZCwgYSBzaW5nbGUgbGF5ZXIgb2YgYW4gYXJyYXkgdGV4dHVyZQogICAgY2FuIGJlIGJvdW5kIHRvIGEgZnJhbWVidWZmZXIgYXR0YWNobWVudCBwb2ludCwgYW5kIG1hbnVhbCBtaXBtYXAKICAgIGdlbmVyYXRpb24gc3VwcG9ydCBpcyBleHRlbmRlZCB0byBpbmNsdWRlIGFycmF5IHRleHR1cmVzLgoKICAgIFNldmVyYWwgbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSB0byB0aGUgRVhUX2ZyYW1lYnVmZmVyX29iamVjdAogICAgc3BlY2lmaWNhdGlvbi4gIEZpcnN0LCB0aGUgdG9rZW4gaWRlbnRpZnlpbmcgdGhlIGF0dGFjaGVkIGxheWVyIG9mIGEgM0QKICAgIHRleHR1cmUsIEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV8zRF9aT0ZGU0VUX0VYVCwgaXMgcmVuYW1lZCB0bwogICAgRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSX0VYVC4gIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHRoaXMKICAgIGV4dGVuc2lvbiBnZW5lcmFsaXplcyB0aGUgInogb2Zmc2V0IiBjb25jZXB0IHRvIGJlY29tZSBub3Rpb24gb2YgYXR0YWNoaW5nCiAgICBhIGxheWVyIG9mIGEgbXVsdGktbGF5ZXIgdGV4dHVyZSwgd2hpY2ggaXMgYXBwbGljYWJsZSBmb3IgYm90aAogICAgdGhyZWUtZGltZW5zaW9uYWwgYW5kIGFycmF5IHRleHR1cmVzLiAgQWxsIHJlZmVyZW5jZXMgdG8gdGhpcyB0b2tlbiBpbgogICAgRVhUX2ZyYW1lYnVmZmVyX29iamVjdCBzaG91bGQgYmUgY2hhbmdlZCB0byB0aGUgbmV3IHRva2VuLCBhbmQgcmVmZXJlbmNlcwogICAgdG8gInogb2Zmc2V0IiBpbiB0aGUgc3BlY2lmaWNhdGlvbiB0ZXh0IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoICJsYXllciIgYXMKICAgIGFwcHJvcHJpYXRlLiAgQWRkaXRpb25hbCBlZGl0cyBmb2xsb3cuCgogICAgKG1vZGlmeSAiTWFudWFsIE1pcG1hcCBHZW5lcmF0aW9uIiBpbiBlZGl0cyB0byBTZWN0aW9uIDMuOC44KQoKICAgIE1pcG1hcHMgY2FuIGJlIGdlbmVyYXRlZCBtYW51YWxseSB3aXRoIHRoZSBjb21tYW5kCgogICAgICB2b2lkIEdlbmVyYXRlTWlwbWFwRVhUKGVudW0gdGFyZ2V0KTsKCiAgICB3aGVyZSA8dGFyZ2V0PiBpcyBvbmUgb2YgVEVYVFVSRV8xRCwgVEVYVFVSRV8yRCwgVEVYVFVSRV9DVUJFX01BUCwKICAgIFRFWFRVUkVfM0QsIFRFWFRVUkVfMURfQVJSQVksIG9yIFRFWFRVUkVfMkRfQVJSQVkuICBNaXBtYXAgZ2VuZXJhdGlvbgogICAgYWZmZWN0cyB0aGUgdGV4dHVyZSBpbWFnZSBhdHRhY2hlZCB0byA8dGFyZ2V0Pi4gIC4uLgoKICAgIChtb2RpZnkgU2VjdGlvbiA0LjQuMi4zLCBBdHRhY2hpbmcgVGV4dHVyZSBJbWFnZXMgdG8gYSBGcmFtZWJ1ZmZlciAtLSBhZGQKICAgIHRvIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24pCgogICAgVGhlIGNvbW1hbmQKCiAgICAgIHZvaWQgRnJhbWVidWZmZXJUZXh0dXJlTGF5ZXJFWFQoZW51bSB0YXJnZXQsIGVudW0gYXR0YWNobWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50IHRleHR1cmUsIGludCBsZXZlbCwgaW50IGxheWVyKTsKCiAgICBvcGVyYXRlcyBpZGVudGljYWxseSB0byBGcmFtZWJ1ZmZlclRleHR1cmUzREVYVCwgZXhjZXB0IHRoYXQgaXQgYXR0YWNoZXMgYQogICAgc2luZ2xlIGxheWVyIG9mIGEgdGhyZWUtZGltZW5zaW9uYWwgdGV4dHVyZSBvciBhIG9uZS0gb3IgdHdvLWRpbWVuc2lvbmFsCiAgICBhcnJheSB0ZXh0dXJlLiAgPGxheWVyPiBpcyBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIGxheWVyIG51bWJlciwgYW5kIGlzCiAgICB0cmVhdGVkIGlkZW50aWNhbGx5IHRvIHRoZSA8em9mZnNldD4gcGFyYW1ldGVyIGluIEZyYW1lYnVmZmVyVGV4dHVyZTNERVhULgogICAgVGhlIGVycm9yIElOVkFMSURfVkFMVUUgaXMgZ2VuZXJhdGVkIGlmIDxsYXllcj4gaXMgbmVnYXRpdmUuICBUaGUgZXJyb3IKICAgIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBpZiA8dGV4dHVyZT4gaXMgbm9uLXplcm8gYW5kIGlzIG5vdCB0aGUKICAgIG5hbWUgb2YgYSB0aHJlZSBkaW1lbnNpb25hbCB0ZXh0dXJlIG9yIG9uZS0gb3IgdHdvLWRpbWVuc2lvbmFsIGFycmF5CiAgICB0ZXh0dXJlLiAgVW5saWtlIEZyYW1lYnVmZmVyVGV4dHVyZTNELCBubyA8dGV4dGFyZ2V0PiBwYXJhbWV0ZXIgaXMKICAgIGFjY2VwdGVkLgoKICAgIElmIDx0ZXh0dXJlPiBpcyBub24temVybyBhbmQgdGhlIGNvbW1hbmQgZG9lcyBub3QgcmVzdWx0IGluIGFuIGVycm9yLCB0aGUKICAgIGZyYW1lYnVmZmVyIGF0dGFjaG1lbnQgc3RhdGUgY29ycmVzcG9uZGluZyB0byA8YXR0YWNobWVudD4gaXMgdXBkYXRlZCBhcwogICAgaW4gdGhlIG90aGVyIEZyYW1lYnVmZmVyVGV4dHVyZSBjb21tYW5kcywgZXhjZXB0IHRoYXQKICAgIEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MQVlFUl9FWFQgaXMgc2V0IHRvIDxsYXllcj4uCgogICAgKG1vZGlmeSBTZWN0aW9uIDQuNC40LjEsIEZyYW1lYnVmZmVyIEF0dGFjaG1lbnQgQ29tcGxldGVuZXNzKQoKICAgIFRoZSBmcmFtZWJ1ZmZlciBhdHRhY2htZW50IHBvaW50IDxhdHRhY2htZW50PiBpcyBzYWlkIHRvIGJlICJmcmFtZWJ1ZmZlcgogICAgYXR0YWNobWVudCBjb21wbGV0ZSIgaWYgLi4uOgoKICAgICAgLi4uCgogICAgICAqIElmIEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfRVhUIGlzIFRFWFRVUkUgYW5kCiAgICAgICAgRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9FWFQgbmFtZXMgYSBvbmUtIG9yIHR3by1kaW1lbnNpb25hbAogICAgICAgIGFycmF5IHRleHR1cmUsIHRoZW4gRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSX0VYVCBtdXN0IGJlCiAgICAgICAgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgbGF5ZXJzIGluIHRoZSB0ZXh0dXJlLgoKICAgIAogICAgKG1vZGlmeSBTZWN0aW9uIDYuMS4zLCBFbnVtZXJhdGVkIFF1ZXJpZXMpCgogICAgLi4uCgogICAgICAgIElmIDxwbmFtZT4gaXMgRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSX0VYVCBhbmQgdGhlIHRleHR1cmUKICAgICAgICBvYmplY3QgbmFtZWQgRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9FWFQgaXMgYQogICAgICAgIHRocmVlLWRpbWVuc2lvbmFsIHRleHR1cmUgb3IgYSBvbmUtIG9yIHR3by1kaW1lbnNpb25hbCBhcnJheSB0ZXh0dXJlLAogICAgICAgIHRoZW4gPHBhcmFtcz4gd2lsbCBjb250YWluIHRoZSBudW1iZXIgb2YgdGV4dHVyZSBsYXllciBhdHRhY2hlZCB0byB0aGUKICAgICAgICBhdHRhY2htZW50IHBvaW50LiAgT3RoZXJ3aXNlLCA8cGFyYW1zPiB3aWxsIGNvbnRhaW4gdGhlIHZhbHVlIHplcm8uCgpEZXBlbmRlbmNpZXMgb24gTlZfZ2VvbWV0cnlfcHJvZ3JhbTQKCiAgICBOVl9nZW9tZXRyeV9wcm9ncmFtNCBwcm92aWRlcyBhZGRpdGlvbmFsIG1vZGlmaWNhdGlvbnMgdG8KICAgIEVYVF9mcmFtZWJ1ZmZlcl9vYmplY3QgdG8gc3VwcG9ydCBsYXllcmVkIHJlbmRlcmluZywgd2hpY2ggYWxsb3dzCiAgICBhcHBsaWNhdGlvbnMgdG8gYmluZCBlbnRpcmUgdGhyZWUtZGltZW5zaW9uYWwsIGN1YmUgbWFwLCBvciBhcnJheSB0ZXh0dXJlcwogICAgdG8gYSBzaW5nbGUgYXR0YWNobWVudCBwb2ludCwgYW5kIHNlbGVjdCBhIGxheWVyIHRvIHJlbmRlciB0byBhY2NvcmRpbmcgdG8KICAgIGEgbGF5ZXIgbnVtYmVyIHdyaXR0ZW4gYnkgdGhlIGdlb21ldHJ5IHByb2dyYW0uICAKCiAgICBUaGUgZnJhbWVidWZmZXIgb2JqZWN0IG1vZGlmaWNhdGlvbnMgcHJvdmlkZWQgaW4gTlZfZ2VvbWV0cnlfcHJvZ3JhbTQgYXJlCiAgICBtb3JlIGV4dGVuc2l2ZSB0aGFuIHRoZSBtb3JlIGxpbWl0ZWQgc3VwcG9ydCBwcm92aWRlZCBmb3IgYXJyYXkgdGV4dHVyZXMuCiAgICBUaGUgZWRpdHMgaW4gdGhpcyBzcGVjIGFyZSBhIGZ1bmN0aW9uYWwgc3Vic2V0IG9mIHRoZSBlZGl0cyBpbgogICAgTlZfZ2VvbWV0cnlfcHJvZ3JhbTQuICBBbGwgb2YgdGhlIG1vZGlmaWNhdGlvbnMgdGhhdCB0aGlzIGV4dGVuc2lvbiBtYWtlcwogICAgdG8gRVhUX2ZyYW1lYnVmZmVyX29iamVjdCBhcmUgc3VwZXJzZWRlZCBieSBOVl9nZW9tZXRyeV9wcm9ncmFtNCwgZXhjZXB0CiAgICBmb3IgdGhlIG1pbm9yIGxhbmd1YWdlIGNoYW5nZXMgbWFkZSB0byBHZW5lcmF0ZU1pcG1hcHNFWFQoKS4KCkRlcGVuZGVuY2llcyBvbiBOVl9ncHVfcHJvZ3JhbTQgYW5kIHRoZSBPcGVuR0wgU2hhZGluZyBMYW5ndWFnZSAoR0xTTCkKCiAgICBJZiBOVl9ncHVfcHJvZ3JhbTQsIEVYVF9ncHVfc2hhZGVyNCwgYW5kIHRoZSBPcGVuR0wgU2hhZGluZyBMYW5ndWFnZQogICAgKEdMU0wpIGFyZSBub3Qgc3VwcG9ydGVkLCBhbmQgbm8gb3RoZXIgbWVjaGFuaXNtIGlzIHByb3ZpZGVkIHRvIHBlcmZvcm0KICAgIHRleHR1cmUgbG9va3VwcyBpbnRvIGFycmF5IHRleHR1cmVzLCB0aGlzIGV4dGVuc2lvbiBpcyBwb2ludGxlc3MsIGdpdmVuCiAgICB0aGF0IGl0IHByb3ZpZGVzIG5vIGZpeGVkLWZ1bmN0aW9uIG1lY2hhbmlzbSB0byBhY2Nlc3MgdGV4dHVyZSBhcnJheXMuCgogICAgSWYgR0xTTCBpcyBzdXBwb3J0ZWQsIHRoZSBsYW5ndWFnZSBiZWxvdyBkZXNjcmliZXMgdGhlIG1vZGlmaWNhdGlvbnMgdG8KICAgIHRoZSBzaGFkaW5nIGxhbmd1YWdlIHRvIHN1cHBvcnQgYXJyYXkgdGV4dHVyZXMuICBUaGUgZXh0ZW5zaW9uCiAgICBFWFRfZ3B1X3NoYWRlcjQgcHJvdmlkZXMgYSBicm9hZGVyIHNldCBvZiBzaGFkaW5nIGxhbmd1YWdlIG1vZGlmaWNhdGlvbnMKICAgIHRoYXQgaW5jbHVkZSBhcnJheSB0ZXh0dXJlIGxvb2t1cCBmdW5jdGlvbnMgZGVzY3JpYmVkIGhlcmUsIHBsdXMgYSBudW1iZXIKICAgIG9mIGFkZGl0aW9uYWwgZnVuY3Rpb25zLgoKICAgIElmIEdMU0wgaXMgbm90IHN1cHBvcnRlZCwgdGhlIHNoYWRpbmcgbGFuZ3VhZ2UgYmVsb3cgYW5kIHJlZmVyZW5jZXMgdG8gdGhlCiAgICBTQU1QTEVSX3sxRCwyRH1fQVJSQVlfRVhUIGFuZCBTQU1QTEVSX3sxRCwyRH1fQVJSQVlfU0hBRE9XX0VYVCB0b2tlbnMKICAgIHNob3VsZCBiZSByZW1vdmVkLgoKRGVwZW5kZW5jaWVzIG9uIEVYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3MzdGMgYW5kIE5WX3RleHR1cmVfY29tcHJlc3Npb25fdnRjCgogICAgUzNUQyB0ZXh0dXJlIGNvbXByZXNzaW9uIGlzIHN1cHBvcnRlZCBmb3IgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmVzLgogICAgV2hlbiA8dGFyZ2V0PiBpcyBURVhUVVJFXzJEX0FSUkFZX0VYVCwgZWFjaCBsYXllciBpcyBzdG9yZWQgaW5kZXBlbmRlbnRseQogICAgYXMgYSBjb21wcmVzc2VkIHR3by1kaW1lbnNpb25hbCB0ZXh0dXJlcy4gIFdoZW4gc3BlY2lmeWluZyBvciBxdWVyeWluZwogICAgY29tcHJlc3NlZCBpbWFnZXMgdXNpbmcgb25lIG9mIHRoZSBTM1RDIGZvcm1hdHMsIHRoZSBpbWFnZXMgYXJlIHByb3ZpZGVkCiAgICBhbmQvb3IgcmV0dXJuZWQgYXMgYSBzZXJpZXMgb2YgdHdvLWRpbWVuc2lvbmFsIHRleHR1cmVzIHN0b3JlZAogICAgY29uc2VjdXRpdmVseSBpbiBtZW1vcnksIHdpdGggdGhlIGxheWVyIGNsb3Nlc3QgdG8gemVybyBzcGVjaWZpZWQgZmlyc3QuCiAgICBGb3IgYXJyYXkgdGV4dHVyZXMsIGltYWdlcyBhcmUgbm90IGFycmFuZ2VkIGluIDR4NHg0IG9yIDR4NHgyIGJsb2NrcyBhcyBpbgogICAgdGhlIHRocmVlLWRpbWVuc2lvbmFsIGNvbXByZXNzaW9uIGZvcm1hdCBwcm92aWRlZCBpbiB0aGUKICAgIEVYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3Z0YyBleHRlbnNpb24uICBQaXhlbCBzdG9yZSBwYXJhbWV0ZXJzLCBpbmNsdWRpbmcKICAgIHRob3NlIHNwZWNpZmljIHRvIHRocmVlLWRpbWVuc2lvbmFsIGltYWdlcywgYXJlIGlnbm9yZWQgd2hlbiBjb21wcmVzc2VkCiAgICBpbWFnZSBkYXRhIGFyZSBwcm92aWRlZCBvciByZXR1cm5lZCwgYXMgaW4gdGhlCiAgICBFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjIGV4dGVuc2lvbi4KCiAgICBTM1RDIGNvbXByZXNzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG9uZS1kaW1lbnNpb25hbCB0ZXh0dXJlIHRhcmdldHMgaW4KICAgIEVYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3MzdGMsIGFuZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBvbmUtZGltZW5zaW9uYWwKICAgIGFycmF5IHRleHR1cmVzIGluIHRoaXMgZXh0ZW5zaW9uLiAgSWYgY29tcHJlc3NlZCBvbmUtZGltZW5zaW9uYWwgYXJyYXlzCiAgICBhcmUgbmVlZGVkLCB1c2UgYSB0d28tZGltZW5zaW9uYWwgdGV4dHVyZSB3aXRoIGEgaGVpZ2h0IG9mIG9uZS4KCiAgICBBcyB3aXRoIE5WX3RleHR1cmVfY29tcHJlc3Npb25fdnRjLCB0aGlzIGV4dGVuc2lvbiBhbGxvd3MgdGhlIHVzZSBvZiB0aGUKICAgIGZvdXIgUzNUQyBpbnRlcm5hbCBmb3JtYXQgdHlwZXMgaW4gVGV4SW1hZ2UzRCwgQ29tcHJlc3NlZFRleEltYWdlM0QsIGFuZAogICAgQ29tcHJlc3NlZFRleFN1YkltYWdlM0QgY2FsbHMuICBVbmxpa2UgTlZfdGV4dHVyZV9jb21wcmVzc2lvbl92dGMgKGZvciAzRAogICAgdGV4dHVyZXMpLCBjb21wcmVzc2VkIHN1Yi1pbWFnZSB1cGRhdGVzIGFyZSBhbGxvd2VkIGF0IGFyYml0cmFyeSBsb2NhdGlvbnMKICAgIGFsb25nIHRoZSBaIGF4aXMuICBUaGUgbGFuZ3VhZ2UgZGVzY3JpYmluZyBDb21wcmVzc2VkVGV4U3ViSW1hZ2UqIEFQSXMsCiAgICBlZGl0ZWQgYnkgRVhUX3RleHR1cmVfY29tcHJlc3Npb25fczN0YyAoYWxsb3dpbmcgdXBkYXRlcyBhdCA0eDQgYm91bmRhcmllcwogICAgZm9yIDJEIHRleHR1cmVzKSBhbmQgTlZfdGV4dHVyZV9jb21wcmVzc2lvbl92dGMgKGFsbG93aW5nIHVwZGF0ZXMgYXQgNHg0eDQKICAgIGJvdW5kYXJpZXMgZm9yIDNEIHRleHR1cmVzKSBpcyB1cGRhdGVkIGFzIGZvbGxvd3M6CgogICAgICAiSWYgdGhlIGludGVybmFsIGZvcm1hdCBvZiB0aGUgdGV4dHVyZSBpbWFnZSBiZWluZyBtb2RpZmllZCBpcwogICAgICBDT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhULCBDT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVCwKICAgICAgQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQsIG9yIENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhULCB0aGUKICAgICAgdGV4dHVyZSBpcyBzdG9yZWQgdXNpbmcgb25lIG9mIHNldmVyYWwgUzNUQyBvciBWVEMgY29tcHJlc3NlZCB0ZXh0dXJlCiAgICAgIGltYWdlIGZvcm1hdHMuICBTaW5jZSB0aGVzZSBhbGdvcml0aG1zIHN1cHBvcnQgb25seSAyRCBhbmQgM0QgaW1hZ2VzLAogICAgICBDb21wcmVzc2VkVGV4U3ViSW1hZ2UxREFSQiBwcm9kdWNlcyBhbiBJTlZBTElEX0VOVU0gZXJyb3IgaWYgPGZvcm1hdD4gaXMKICAgICAgYW4gUzNUQy9WVEMgZm9ybWF0LiAgU2luY2UgUzNUQy9WVEMgaW1hZ2VzIGFyZSBlYXNpbHkgZWRpdGVkIGFsb25nIDR4NCwKICAgICAgNHg0eDEsIG9yIDR4NHg0IHRleGVsIGJvdW5kYXJpZXMsIHRoZSBsaW1pdGF0aW9ucyBvbgogICAgICBDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCBhbmQgQ29tcHJlc3NlZFRleFN1YkltYWdlM0QgYXJlIHJlbGF4ZWQuCiAgICAgIENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIGFuZCBDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRCB3aWxsIHJlc3VsdCBpbiBhbgogICAgICBJTlZBTElEX09QRVJBVElPTiBlcnJvciBvbmx5IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgb2NjdXJzOgoKICAgICAgICAqIDx3aWR0aD4gaXMgbm90IGEgbXVsdGlwbGUgb2YgZm91ciBvciBlcXVhbCB0byBURVhUVVJFX1dJRFRILgogICAgICAgICogPGhlaWdodD4gaXMgbm90IGEgbXVsdGlwbGUgb2YgZm91ciBvciBlcXVhbCB0byBURVhUVVJFX0hFSUdIVC4KICAgICAgICAqIDx4b2Zmc2V0PiBvciA8eW9mZnNldD4gaXMgbm90IGEgbXVsdGlwbGUgb2YgZm91ci4KICAgICAgICAqIDxkZXB0aD4gaXMgbm90IGEgbXVsdGlwbGUgb2YgZm91ciBvciBlcXVhbCB0byBURVhUVVJFX0RFUFRILCBhbmQKICAgICAgICAgIDx0YXJnZXQ+IGlzIFRFWFRVUkVfM0QuCiAgICAgICAgKiA8em9mZnNldD4gaXMgbm90IGEgbXVsdGlwbGUgb2YgZm91ciBhbmQgPHRhcmdldD4gaXMgVEVYVFVSRV8zRC4iCgogICAoTm90ZTogIFRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBpbmNvcnJlY3RseSBmYWlsZWQgdG8KICAgIGFsbG93IGNvbXByZXNzZWQgc3ViaW1hZ2UgdXBkYXRlcyBvZiBhcnJheSB0ZXh0dXJlcyB2aWEKICAgIENvbXByZXNzZWRUZXhTdWJJbWFnZTNELCBleGNlcHQgYXQgNHg0eDQgYm91bmRhcmllcy9zaXplcy4gIFRoaXMKICAgIHVuZGVzaXJhYmxlIGJlaGF2aW9yIHdhcyBhbHNvIGltcGxlbWVudGVkIGJ5IGFsbCBOVklESUEgT3BlbkdMIGRyaXZlcnMKICAgIHB1Ymxpc2hlZCBwcmlvciB0byBGZWJydWFyeSAyMDA4LikKCkVycm9ycwoKICAgIE5vbmUuICBTb21lIGVycm9yIGNvbmRpdGlvbnMgYXJlIHJlbW92ZWQsIGR1ZSB0byB0aGUgYWJpbGl0eSB0byB1c2UgdGhlCiAgICBuZXcgVEVYVFVSRV8xRF9BUlJBWV9FWFQgYW5kIFRFWFRVUkVfMkRfQVJSQVlfRVhUIGVudW1zLgoKTmV3IFN0YXRlCgogICAgKGFkZCB0byB0YWJsZSA2LjE1LCBwLiAyNzYpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRpYWwKICAgIEdldCBWYWx1ZSAgICAgICAgICAgICAgICAgICAgIFR5cGUgICBHZXQgQ29tbWFuZCAgVmFsdWUgRGVzY3JpcHRpb24gICAgICAgICAgIFNlYy4gICAgQXR0cmlidXRlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLSAgLS0tLS0tLS0tLS0gIC0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0gIC0tLS0tLS0tLQogICAgVEVYVFVSRV9CSU5ESU5HXzFEX0FSUkFZX0VYVCAgMip4WisgIEdldEludGVnZXJ2ICAgIDAgICB0ZXh0dXJlIG9iamVjdCBib3VuZCAgMy44LjEyICB0ZXh0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRFWFRVUkVfMURfQVJSQVkKICAgIFRFWFRVUkVfQklORElOR18yRF9BUlJBWV9FWFQgIDIqeForICBHZXRJbnRlZ2VydiAgICAwICAgdGV4dHVyZSBvYmplY3QgYm91bmQgIDMuOC4xMiAgdGV4dHVyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBURVhUVVJFXzJEX0FSUkFZCk5ldyBJbXBsZW1lbnRhdGlvbiBEZXBlbmRlbnQgU3RhdGUKCiAgICAoYWRkIHRvIFRhYmxlIDYuMzIsIHAuIDI5MykKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5pbXVtCiAgICBHZXQgVmFsdWUgICAgICAgICAgICAgICAgICAgICBUeXBlICBHZXQgQ29tbWFuZCAgVmFsdWUgIERlc2NyaXB0aW9uICAgICAgICAgU2VjLiAgQXR0cmlidXRlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tICAtLS0tLS0tLS0tLSAtLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0gLS0tLS0tLS0tCiAgICBNQVhfQVJSQVlfVEVYVFVSRV9MQVlFUlNfRVhUICAgWisgICBHZXRJbnRlZ2VydiAgIDY0ICAgIG1heGltdW0gbnVtYmVyIG9mICAgMy44LjEgICAgIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzIGZvciB0ZXh0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5cwoKTW9kaWZpY2F0aW9ucyB0byBUaGUgT3BlbkdMIFNoYWRpbmcgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgVmVyc2lvbiAxLjEwLjU5CgogICAgKFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgYWRkaXRpb25zIHRvIEdMU0wgdG8gYWxsb3cgc2hhZGVycyB0byBhY2Nlc3MgYXJyYXkKICAgICB0ZXh0dXJlcy4gIFRoaXMgaXMgYSBzdWJzZXQgb2YgdGhlIG5ldyBzaGFkaW5nIGxhbmd1YWdlIHByb3ZpZGVkIGJ5IHRoZQogICAgIEVYVF9ncHVfc2hhZGVyNCBleHRlbnNpb24sIGxpbWl0ZWQgdG8gYXJyYXkgdGV4dHVyZSBzdXBwb3J0LiAgSXQgaXMKICAgICBwcm92aWRlZCBoZXJlIGluIGNhc2UgaW1wbGVtZW50YXRpb25zIGNob29zZSB0byBzdXBwb3J0IEVYVF90ZXh0dXJlX2FycmF5CiAgICAgd2l0aG91dCBzdXBwb3J0aW5nIEVYVF9ncHVfc2hhZGVyNCBvciBlcXVpdmFsZW50IGZ1bmN0aW9uYWxpdHkuCgogICAgIE5vdGUgdGhhdCBpZiB0aGUgRVhUX2dwdV9zaGFkZXI0IGV4dGVuc2lvbiBpcyBlbmFibGVkIGluIGEgc2hhZGVyIHZpYSBhbgogICAgICIjZXh0ZW5zaW9uIiBsaW5lLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNlcGFyYXRlbHkgZW5hYmxlCiAgICAgRVhUX3RleHR1cmVfYXJyYXkuKQoKICAgIEluY2x1ZGluZyB0aGUgZm9sbG93aW5nIGxpbmUgaW4gYSBzaGFkZXIgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUKICAgIGxhbmd1YWdlIGZlYXR1cmVzIGRlc2NyaWJlZCBpbiB0aGlzIGV4dGVuc2lvbjoKCiAgICAgICNleHRlbnNpb24gR0xfRVhUX3RleHR1cmVfYXJyYXkgOiA8YmVoYXZpb3I+CgogICAgd2hlcmUgPGJlaGF2aW9yPiBpcyBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiAzLjMuCgogICAgQSBuZXcgcHJlcHJvY2Vzc29yICNkZWZpbmUgaXMgYWRkZWQgdG8gdGhlIE9wZW5HTCBTaGFkaW5nIExhbmd1YWdlOgoKICAgICAgI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9hcnJheSAxCgogICAgQWRkIHRvIHNlY3Rpb24gMy42ICJLZXl3b3JkcyIKCiAgICBUaGUgZm9sbG93aW5nIG5ldyBzYW1wbGVyIHR5cGVzIGFyZSBhZGRlZDoKCiAgICAgIHNhbXBsZXIxREFycmF5LCBzYW1wbGVyMkRBcnJheSwgc2FtcGxlcjFEQXJyYXlTaGFkb3csCiAgICAgIHNhbXBsZXIyREFycmF5U2hhZG93CgogICAgQWRkIHRvIHNlY3Rpb24gNC4xICJCYXNpYyBUeXBlcyIKCiAgICBBZGQgdGhlIGZvbGxvd2luZyBlbnRyaWVzIHRvIHRoZSB0eXBlIHRhYmxlOgoKICAgICAgc2FtcGxlcjFEQXJyYXkgICAgICAgICBoYW5kbGUgZm9yIGFjY2Vzc2luZyBhIDFEIGFycmF5IHRleHR1cmUKICAgICAgc2FtcGxlcjJEQXJyYXkgICAgICAgICBoYW5kbGUgZm9yIGFjY2Vzc2luZyBhIDJEIGFycmF5IHRleHR1cmUKICAgICAgc2FtcGxlcjFEQXJyYXlTaGFkb3cgICBoYW5kbGUgZm9yIGFjY2Vzc2luZyBhIDFEIGFycmF5IGRlcHRoIHRleHR1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGNvbXBhcmlzb24KICAgICAgc2FtcGxlcjJEQXJyYXlTaGFkb3cgICBoYW5kbGUgZm9yIGFjY2Vzc2luZyBhIDJEIGFycmF5IGRlcHRoIHRleHR1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGNvbXBhcmlzb24KCiAgICBBZGQgdG8gc2VjdGlvbiA4LjcgIlRleHR1cmUgTG9va3VwIEZ1bmN0aW9ucyIKCiAgICBBZGQgbmV3IGZ1bmN0aW9ucyB0byB0aGUgc2V0IG9mIGFsbG93ZWQgdGV4dHVyZSBsb29rdXAgZnVuY3Rpb25zOgoKICAgIFN5bnRheDoKCiAgICAgIHZlYzQgdGV4dHVyZTFEQXJyYXkoc2FtcGxlcjFEQXJyYXkgc2FtcGxlciwgdmVjMiBjb29yZAogICAgICAgICAgICAgICAgICAgICAgICAgIFssIGZsb2F0IGJpYXNdKQogICAgICB2ZWM0IHRleHR1cmUxREFycmF5TG9kKHNhbXBsZXIxREFycmF5IHNhbXBsZXIsIHZlYzIgY29vcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbG9kKQoKICAgIERlc2NyaXB0aW9uOgoKICAgIFVzZSB0aGUgZmlyc3QgZWxlbWVudCAoY29vcmQucykgb2YgdGV4dHVyZSBjb29yZGluYXRlIGNvb3JkIHRvIGRvIGEKICAgIHRleHR1cmUgbG9va3VwIGluIHRoZSBsYXllciBpbmRpY2F0ZWQgYnkgdGhlIHNlY29uZCBjb29yZGluYXRlIGNvb3JkLnQgb2YKICAgIHRoZSAxRCB0ZXh0dXJlIGFycmF5IGN1cnJlbnRseSBib3VuZCB0byBzYW1wbGVyLiBUaGUgbGF5ZXIgdG8gYWNjZXNzIGlzCiAgICBjb21wdXRlZCBieSBsYXllciA9IG1heCAoMCwgbWluKGQgLSAxLCBmbG9vciAoY29vcmQudCArIDAuNSkpIHdoZXJlICdkJyBpcwogICAgdGhlIGRlcHRoIG9mIHRoZSB0ZXh0dXJlIGFycmF5LgoKICAgIFN5bnRheDoKCiAgICAgIHZlYzQgdGV4dHVyZTJEQXJyYXkoc2FtcGxlcjJEQXJyYXkgc2FtcGxlciwgdmVjMyBjb29yZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWywgZmxvYXQgYmlhc10pCiAgICAgIHZlYzQgdGV4dHVyZTJEQXJyYXlMb2Qoc2FtcGxlcjJEQXJyYXkgc2FtcGxlciwgdmVjMyBjb29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxvZCkKICAgIERlc2NyaXB0aW9uOgoKICAgIFVzZSB0aGUgZmlyc3QgdHdvIGVsZW1lbnRzIChjb29yZC5zLCBjb29yZC50KSBvZiB0ZXh0dXJlIGNvb3JkaW5hdGUgY29vcmQKICAgIHRvIGRvIGEgdGV4dHVyZSBsb29rdXAgaW4gdGhlIGxheWVyIGluZGljYXRlZCBieSB0aGUgdGhpcmQgY29vcmRpbmF0ZQogICAgY29vcmQucCBvZiB0aGUgMkQgdGV4dHVyZSBhcnJheSBjdXJyZW50bHkgYm91bmQgdG8gc2FtcGxlci4gVGhlIGxheWVyIHRvCiAgICBhY2Nlc3MgaXMgY29tcHV0ZWQgYnkgbGF5ZXIgPSBtYXggKDAsIG1pbihkIC0gMSwgZmxvb3IgKGNvb3JkLnAgKyAwLjUpKQogICAgd2hlcmUgJ2QnIGlzIHRoZSBkZXB0aCBvZiB0aGUgdGV4dHVyZSBhcnJheS4KCiAgICBTeW50YXg6CgogICAgICB2ZWM0IHNoYWRvdzFEQXJyYXkoc2FtcGxlcjFEQXJyYXlTaGFkb3cgc2FtcGxlciwgdmVjMyBjb29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgIFtmbG9hdCBiaWFzXSkKICAgICAgdmVjNCBzaGFkb3cxREFycmF5TG9kKHNhbXBsZXIxREFycmF5U2hhZG93IHNhbXBsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMzIGNvb3JkLCBmbG9hdCBsb2QpCiAgICBEZXNjcmlwdGlvbjoKCiAgICBVc2UgdGV4dHVyZSBjb29yZGluYXRlIGNvb3JkLnMgdG8gZG8gYSBkZXB0aCBjb21wYXJpc29uIGxvb2t1cCBvbiBhbiBhcnJheQogICAgbGF5ZXIgb2YgdGhlIGRlcHRoIHRleHR1cmUgYm91bmQgdG8gc2FtcGxlciwgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24KICAgIDMuOC4xNCBvZiB2ZXJzaW9uIDIuMCBvZiB0aGUgT3BlbkdMIHNwZWNpZmljYXRpb24uIFRoZSBsYXllciB0byBhY2Nlc3MgaXMKICAgIGluZGljYXRlZCBieSB0aGUgc2Vjb25kIGNvb3JkaW5hdGUgY29vcmQudCBhbmQgaXMgY29tcHV0ZWQgYnkgbGF5ZXIgPSBtYXgKICAgICgwLCBtaW4oZCAtIDEsIGZsb29yIChjb29yZC50ICsgMC41KSkgd2hlcmUgJ2QnIGlzIHRoZSBkZXB0aCBvZiB0aGUKICAgIHRleHR1cmUgYXJyYXkuIFRoZSB0aGlyZCBjb21wb25lbnQgb2YgY29vcmQgKGNvb3JkLnApIGlzIHVzZWQgYXMgdGhlIFIKICAgIHZhbHVlLiBUaGUgdGV4dHVyZSBib3VuZCB0byBzYW1wbGVyIG11c3QgYmUgYSBkZXB0aCB0ZXh0dXJlLCBvciByZXN1bHRzCiAgICBhcmUgdW5kZWZpbmVkLgoKICAgIFN5bnRheDoKCiAgICAgIHZlYzQgc2hhZG93MkRBcnJheShzYW1wbGVyMkRBcnJheVNoYWRvdyBzYW1wbGVyLCB2ZWM0IGNvb3JkKQoKICAgIERlc2NyaXB0aW9uOgoKICAgIFVzZSB0ZXh0dXJlIGNvb3JkaW5hdGUgKGNvb3JkLnMsIGNvb3JkLnQpIHRvIGRvIGEgZGVwdGggY29tcGFyaXNvbiBsb29rdXAKICAgIG9uIGFuIGFycmF5IGxheWVyIG9mIHRoZSBkZXB0aCB0ZXh0dXJlIGJvdW5kIHRvIHNhbXBsZXIsIGFzIGRlc2NyaWJlZCBpbgogICAgc2VjdGlvbiAzLjguMTQgb2YgdmVyc2lvbiAyLjAgb2YgdGhlIE9wZW5HTCBzcGVjaWZpY2F0aW9uLiBUaGUgbGF5ZXIgdG8KICAgIGFjY2VzcyBpcyBpbmRpY2F0ZWQgYnkgdGhlIHRoaXJkIGNvb3JkaW5hdGUgY29vcmQucCBhbmQgaXMgY29tcHV0ZWQgYnkKICAgIGxheWVyID0gbWF4ICgwLCBtaW4oZCAtIDEsIGZsb29yIChjb29yZC5wICsgMC41KSkgd2hlcmUgJ2QnIGlzIHRoZSBkZXB0aAogICAgb2YgdGhlIHRleHR1cmUgYXJyYXkuIFRoZSBmb3VydGggY29tcG9uZW50IG9mIGNvb3JkIChjb29yZC5xKSBpcyB1c2VkIGFzCiAgICB0aGUgUiB2YWx1ZS4gVGhlIHRleHR1cmUgYm91bmQgdG8gc2FtcGxlciBtdXN0IGJlIGEgZGVwdGggdGV4dHVyZSwgb3IKICAgIHJlc3VsdHMgYXJlIHVuZGVmaW5lZC4KCklzc3VlcwoKICAgICgxKSBTaG91bGQgdGhpcyBleHRlbnNpb24gZ2VuZXJhbGl6ZSB0aGUgbm90aW9uIG9mIDFEIGFuZCAyRCB0ZXh0dXJlcyB0bwogICAgICAgIGJlIGFycmF5cyBvZiAxRCBvciAyRCBpbWFnZXMsIG9yIHNpbXBseSBpbnRyb2R1Y2UgbmV3IHRhcmdldHM/CgogICAgICBSRVNPTFZFRDogIEludHJvZHVjZSBuZXcgdGFyZ2V0cy4gIAoKICAgICAgSXQgd291bGQgaGF2ZSBiZWVuIHBvc3NpYmxlIHRvIHNpbXBseSBleHRlbmQgdGhlIG5vdGlvbiBvZiAxRCBhbmQgMkQKICAgICAgdGV4dHVyZXMsIGFuZCBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gcGFzcyBURVhUVVJFXzFEIHRvIFRleEltYWdlMkQgKDFECiAgICAgIGFycmF5cykgb3IgVEVYVFVSRV8yRCB0byBUZXhJbWFnZTNEICgyRCBhcnJheXMpLiAgVGhpcyB3b3VsZCBoYXZlCiAgICAgIGF2b2lkZWQgaW50cm9kdWNpbmcgYSBuZXcgc2V0IG9mIHRleHR1cmUgdGFyZ2V0cyAoYW5kIHByb3h5IHRhcmdldHMpLAogICAgICBhbmQgYSAiZGVmYXVsdCB0ZXh0dXJlIiAob2JqZWN0IHplcm8pIGZvciBlYWNoIG5ldyB0YXJnZXQuCgogICAgICBJdCBpcyBkZXNpcmFibGUgdG8gaGF2ZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gYXJyYXkgYW5kIG5vbi1hcnJheQogICAgICB0ZXh0dXJlcyBpbiBwcm9ncmFtbWFibGUgc2hhZGVycywgc28gY29tcGlsZXJzIGNhbiBnZW5lcmF0ZSBjb2RlCiAgICAgIGFwcHJvcHJpYXRlIHRvIHRoZSB0ZXh0dXJlIHR5cGUuICBGb3IgIm5vcm1hbCIgdGV4dHVyZXMsIGEgMkQgdGV4dHVyZQogICAgICByZXF1aXJlcyB0d28gY29tcG9uZW50IHRleHR1cmUgY29vcmRpbmF0ZXMsIHdoaWxlIGEgMkQgYXJyYXkgdGV4dHVyZQogICAgICByZXF1aXJlcyB0aHJlZS4gIFdpdGhvdXQgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGFycmF5IGFuZCBub24tYXJyYXkKICAgICAgdGV4dHVyZXMsIGltcGxlbWVudGF0aW9ucyBtdXN0IGNob29zZSBiZXR3ZWVuIGNvbXBpbGluZyBzaGFkZXJzIHRvIHRoZQogICAgICBtb3N0IGdlbmVyYWwgZm9ybSAoMkQgYXJyYXlzKSBvciByZWNvbXBpbGluZyBzaGFkZXJzIGJhc2VkIG9uIHRleHR1cmUKICAgICAgdXNhZ2UuICBUZXh0dXJlIGxvb2t1cHMgd2l0aCBzaGFkb3cgbWFwcGluZywgTE9EIGJpYXMsIG9yIHBlci1waXhlbCBMT0QKICAgICAgaGF2ZSBhZGRpdGlvbmFsIGNvbXBsZXhpdHksIGFuZCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgYSBjb29yZGluYXRlCiAgICAgIHZlY3RvciBtYXkgbmVlZCB0byBkZXBlbmQgb24gd2hldGhlciB0aGUgdGV4dHVyZSB3YXMgYW4gYXJyYXkgb3IKICAgICAgbm9uLWFycmF5IHRleHR1cmUuCgogICAgICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBsaW1pdCB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhcnJheSBhbmQKICAgICAgbm9uLWFycmF5IHRleHR1cmVzIHRvIHRoZSBzaGFkZXJzLCBidXQgaXQgY291bGQgdGhlbiBiZWNvbWUgdGhlCiAgICAgIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgdG8gZW5zdXJlIHRoYXQgYSB0ZXh0dXJlCiAgICAgIHdpdGggbXVsdGlwbGUgbGF5ZXJzIGlzIHVzZWQgd2hlbiBhbiAiYXJyYXkgbG9va3VwIiBpcyBwZXJmb3JtZWQsIGFuZAogICAgICB0aGF0IGEgc2luZ2xlLWxheWVyIHRleHR1cmUgaXMgdXNlZCB3aGVuIGEgIm5vbi1hcnJheSBsb29rdXAiIGlzCiAgICAgIHBlcmZvcm1lZC4gIFRoYXQgYmVncyB0aGUgcXVlc3Rpb24gb2Ygd2hhdCB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhbgogICAgICAiYXJyYXkgdGV4dHVyZSIgYW5kIGEgIm5vbi1hcnJheSB0ZXh0dXJlIiBpcy4gIEF0IGxlYXN0IHR3byBwb3NzaWJsZQogICAgICBkaXN0aW5jdGlvbnMgaGF2ZSBiZWVuIGlkZW50aWZpZWQ6ICBvbmUgdnMuIG11bHRpcGxlIGxheWVycywgb3IgdGhlIEFQSQogICAgICBjYWxsIHVzZWQgdG8gc3BlY2lmeSB0aGUgdGV4dHVyZSAoVGV4SW1hZ2UzRCB3aXRoIFRFWFRVUkVfMkQgPT0gYXJyYXkKICAgICAgdGV4dHVyZSwgVGV4SW1hZ2UyRCA9PSBub24tYXJyYXkgdGV4dHVyZSkuICBUaGUgZm9ybWVyIGRvZXMgbm90IGFsbG93CiAgICAgIGZvciB0aGUgcG9zc2liaWxpdHkgb2Ygc2luZ2xlLWxheWVyIGFycmF5IHRleHR1cmVzOyBpdCBtYXkgYmUgdGhlIGNhc2UKICAgICAgdGhhdCBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzIHdhbnQgdG8gdXNlIGEgZ2VuZXJhbCBzaGFkZXIgc3VwcG9ydGluZwogICAgICBhcnJheSB0ZXh0dXJlcywgYnV0IHRoZXJlIG1heSBiZSBjYXNlcyB3aGVyZSBvbmx5IGEgc2luZ2xlIGxheWVyIG1pZ2h0CiAgICAgIGJlIHByb3ZpZGVkLiAgVGhlIGxhdHRlciBhcHByb2FjaCBhbGxvd3MgZm9yIHNpbmdsZS1sYXllciBhcnJheQogICAgICB0ZXh0dXJlcywgYnV0IHRoZSBkaXN0aW5jdGlvbiBpcyBub3cgYmFzZWQgb24gdGhlIEFQSSBjYWxsLgoKICAgICAgQWRkaW5nIHNlcGFyYXRlIHRhcmdldHMgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3Igc3VjaCBhIGRpc3RpbmN0aW9uLgogICAgICAiQXJyYXkgbG9va3VwcyIgcmVmZXIgdG8gdGhlIFRFWFRVUkVfMURfQVJSQVlfRVhUIG9yCiAgICAgIFRFWFRVUkVfMkRfQVJSQVlfRVhUIHRhcmdldHM7ICJub24tYXJyYXkgbG9va3VwcyIgcmVmZXIgdG8gVEVYVFVSRV8xRCBvcgogICAgICBURVhUVVJFXzJELiAgVGhlcmUgaXMgbmV2ZXIgYSBjYXNlIHdoZXJlIHRoZSB3cm9uZyBraW5kIG9mIHRleHR1cmUgY2FuCiAgICAgIGJlIHVzZWQsIGFzIFRFWFRVUkVfMURfQVJSQVlfRVhUIGFuZCBURVhUVVJFXzJEX0FSUkFZX0VYVCB0ZXh0dXJlcyBhcmUKICAgICAgYWx3YXlzIGFycmF5cyBieSBkZWZpbml0aW9uLgoKICAgICAgVGhpcyBkaXN0aW5jdGlvbiBzaG91bGQgYWxzbyBiZSBoZWxwZnVsIGlmIGFuZCB3aGVuIGZpeGVkLWZ1bmN0aW9uCiAgICAgIGZyYWdtZW50IHByb2Nlc3NpbmcgaXMgc3VwcG9ydGVkOyB0aGUgZW5hYmxlZCB0ZXh0dXJlIHRhcmdldCBpcyB1c2VkIHRvCiAgICAgIGdlbmVyYXRlIGFuIGludGVybmFsIGZyYWdtZW50IHNoYWRlciB1c2luZyB0aGUgcHJvcGVyICJhcnJheSBsb29rdXAiLgogICAgICBUaGVyZSB3b3VsZCBiZSBubyBuZWVkIHRvIHJlY29tcGlsZSBzaGFkZXJzIGRlcGVuZGluZyBvbiB3aGV0aGVyIGFuCiAgICAgIGVuYWJsZWQgdGV4dHVyZSBpcyBhbiAiYXJyYXkgdGV4dHVyZSIgb3Igbm90LgoKICAgICgyKSBTaG91bGQgdGV4dHVyZSBhcnJheXMgYmUgc3VwcG9ydGVkIGZvciBmaXhlZC1mdW5jdGlvbiBmcmFnbWVudAogICAgICAgIHByb2Nlc3Npbmc/CgogICAgICBSRVNPTFZFRDogIE5vOyBpdCdzIG5vdCBiZWxpZXZlZCB0byBiZSB3b3J0aCB0aGUgZWZmb3J0LiAgRml4ZWQtZnVuY3Rpb24KICAgICAgZnJhZ21lbnQgcHJvY2Vzc2luZyBjb3VsZCBiZSBlYXNpbHkgc3VwcG9ydGVkIGJ5IGFsbG93aW5nIGFwcGxpY2F0aW9ucwogICAgICB0byBlbmFibGUgb3IgZGlzYWJsZSBURVhUVVJFXzFEX0FSUkFZX0VYVCBvciBURVhUVVJFXzJEX0FSUkFZX0VYVC4gIAoKICAgICAgTm90ZSB0aGF0IGZvciBmaXhlZC1mdW5jdGlvbiBmcmFnbWVudCBwcm9jZXNzaW5nLCB0aGVyZSB3b3VsZCBiZSBpc3N1ZXMKICAgICAgd2l0aCB0ZXh0dXJlIGxvb2t1cHMgb2YgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmVzIHdpdGggc2hhZG93CiAgICAgIG1hcHBpbmcuICBHaXZlbiB0aGF0IGFsbCB0ZXh0dXJlIGxvb2t1cHMgYXJlIHByb2plY3RpdmUsIGEgdG90YWwgb2YgZml2ZQogICAgICBjb29yZGluYXRlIGNvbXBvbmVudHMgd291bGQgYmUgcmVxdWlyZWQgKHMsIHQsIGxheWVyLCBkZXB0aCwgcSkuCgogICAgKDMpIElmIGZpeGVkLWZ1bmN0aW9uIHdlcmUgc3VwcG9ydGVkLCBzaG91bGQgdGhlIGxheWVyIG51bWJlciAoVCBvciBSKSBiZQogICAgICAgIGRpdmlkZWQgYnkgUSBpbiBwcm9qZWN0aXZlIHRleHR1cmUgbG9va3Vwcz8KCiAgICAgIFJFU09MVkVEOiAgSXQgZG9lc24ndCBuZWVkIHRvIGJlIHJlc29sdmVkIGluIHRoaXMgZXh0ZW5zaW9uLCBidXQgaXQKICAgICAgd291bGQgYmUgYSBwcm9ibGVtLiAgVGhlcmUgYXJlIHByb2JhYmx5IGNhc2VzIHdoZXJlIGFuIGFwcGxpY2F0aW9uIHdvdWxkCiAgICAgIHdhbnQgdGhlIGRpdmlkZSAoaGFuZGxlIFIgbW9yZS1vci1sZXNzIGxpa2UgUy9UKTsgdGhlcmUgYXJlIHByb2JhYmx5CiAgICAgIG90aGVyIGNhc2VzIHdoZXJlIHRoZSBkaXZpZGUgd291bGQgbm90IGJlIHdhbnRlZC4gIE1hbnkgZGV2ZWxvcGVycyB3b24ndAogICAgICBjYXJlLCBhbmQgbWF5IG5vdCBldmVuIGtub3cgd2hhdCB0aGUgUSBjb29yZGluYXRlIGlzIHVzZWQgZm9yISAgVGhlCiAgICAgIGRlZmF1bHQgb2YgMS4wIGFsbG93cyBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCBjYXJlIGFib3V0IHByb2plY3RpdmUKICAgICAgbG9va3VwcyB0byBzaW1wbHkgaWdub3JlIHRoYXQgZmFjdC4KCiAgICAgIEZvciBwcm9ncmFtbWFibGUgZnJhZ21lbnQgc2hhZGluZywgYW4gYXBwbGljYXRpb24gY2FuIGNvZGUgaXQgZWl0aGVyIHdheQogICAgICBhbmQgdXNlIG5vbi1wcm9qZWN0aXZlIGxvb2t1cHMuICBUbyB0aGUgZXh0ZW50IHRoYXQgdGhlIGRpdmlkZSBieSBRIGZvcgogICAgICBwcm9qZWN0aXZlIGxvb2t1cHMgaXMgImZyZWUiIG9yICJjaGVhcCIgb24gT3BlbkdMIGhhcmR3YXJlLCBjb21waWxlcnMKICAgICAgbWF5IGJlIGFibGUgdG8gcmVjb2duaXplIGEgcHJvamVjdGl2ZSBwYXR0ZXJuIGluIHRoZSBjb21wdXRlZAogICAgICBjb29yZGluYXRlcyBhbmQgZ2VuZXJhdGUgY29kZSBhcHByb3ByaWF0ZWx5LgoKICAgICg0KSBTaG91bGQgREVQVEhfQ09NUE9ORU5UIHRleHR1cmVzIGJlIHN1cHBvcnRlZCBmb3IgdGV4dHVyZSBhcnJheXM/CgogICAgICBSRVNPTFZFRDogIFllczsgbXVsdGktbGF5ZXIgc2hhZG93IG1hcHMgYXJlIHVzZWZ1bC4KCiAgICAoNSkgSG93IHNob3VsZCBzaGFkb3cgbWFwcGluZyBpbiB0ZXh0dXJlIGFycmF5cyB3b3JrIHdpdGggcHJvZ3JhbW1hYmxlCiAgICAgICAgc2hhZGVycywgYW5kIGZpeGVkLWZ1bmN0aW9uIHNoYWRlcnMgKGlmIGV2ZXIgc3VwcG9ydGVkKT8KCiAgICAgIFJFU09MVkVEOiAgVGhlIGxheWVyIG51bWJlciBpcyBpbiB0aGUgIm5leHQiIGNvb3JkaW5hdGUgZm9sbG93aW5nIHRoZQogICAgICBub3JtYWwgMUQgb3IgMkQgY29vcmRpbmF0ZS4gIFRoYXQncyB0aGUgInQiIGNvb3JkaW5hdGUgZm9yIDFEIGFycmF5cyBhbmQKICAgICAgdGhlICJyIiBjb29yZGluYXRlIGZvciAyRCBhcnJheXMuICBGb3Igc2hhZG93IG1hcHMsIHRoaXMgaXMgYSBwcm9ibGVtLAogICAgICBhcyB0aGUgInIiIGNvb3JkaW5hdGUgaXMgZ2VuZXJhbGx5IHVzZWQgYXMgdGhlIGRlcHRoIHJlZmVyZW5jZSB2YWx1ZS4KICAgICAgVGhpcyBpcyByZXNvbHZlZCBieSBpbnN0ZWFkIHRha2luZyB0aGUgZGVwdGggcmVmZXJlbmNlIHZhbHVlIGZyb20gdGhlCiAgICAgICJxIiBjb29yZGluYXRlLgoKICAgICAgRm9yIHNvbWUgcHJvZ3JhbW1hYmxlIHRleHR1cmUgbG9va3VwcyAoZXhwbGljaXQgTE9ELCBMT0QgYmlhcywKICAgICAgcHJvamVjdGl2ZSksICJ0b28gbWFueSIgY29vcmRpbmF0ZXMgYXJlIHJlcXVpcmVkLiAgU3VjaCBsb29rdXBzIGFyZSBub3QKICAgICAgcG9zc2libGUgd2l0aCBmb3VyLWNvbXBvbmVudCB2ZWN0b3JzOyBpdCB3b3VsZCByZXF1aXJlIGF0IGxlYXN0IHR3bwogICAgICBwYXJhbWV0ZXJzIHRvIHBlcmZvcm0gc3VjaCBvcGVyYXRpb25zLgoKICAgICAgRm9yIGZpeGVkLWZ1bmN0aW9uIHNoYWRpbmcsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgc2hhZG93IG1hcHBpbmcKICAgICAgbG9va3VwcyBpbiB0d28tZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZXMgYmUgdHJlYXRlZCBhcyBub24tcHJvamVjdGl2ZSwKICAgICAgZXZlbiB0aG91Z2ggYWxsIG90aGVyIGxvb2t1cHMgd291bGQgYmUgcHJvamVjdGl2ZS4gIEFkZGl0aW9uYWxseSwgdGhlCiAgICAgICJxIiBjb29yZGluYXRlIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgZGVwdGggcmVmZXJlbmNlIHZhbHVlIGluIHRoaXMKICAgICAgY2FzZS4KCiAgICAoNikgSG93IGRvIHRleHR1cmUgYm9yZGVycyBpbnRlcmFjdCB3aXRoIGFycmF5IHRleHR1cmVzPwoKICAgICAgUkVTT0xWRUQ6ICBFYWNoIGluZGl2aWR1YWwgbGF5ZXIgb2YgYW4gYXJyYXkgdGV4dHVyZSBjYW4gaGF2ZSBhIGJvcmRlciwKICAgICAgYXMgdGhvdWdoIGl0IHdlcmUgYSBub3JtYWwgb25lLSBvciB0d28tZGltZW5zaW9uYWwgdGV4dHVyZS4gIEhvd2V2ZXIsCiAgICAgIHRoZXJlIGFyZSBubyAiYm9yZGVyIGxheWVycyIuCgogICAgKDcpIEhvdyBkb2VzIG1pcG1hcHBpbmcgd29yayB3aXRoIGFycmF5IHRleHR1cmVzPwoKICAgICAgUkVTT0xWRUQ6ICBMZXZlbCA8TisxPiBpcyBoYWxmIHRoZSBzaXplIG9mIGxldmVsIDxOPiBpbiB3aWR0aCBhbmQvb3IKICAgICAgaGVpZ2h0LCBidXQgdGhlIG51bWJlciBvZiBsYXllcnMgaXMgYWx3YXlzIHRoZSBzYW1lIGZvciBlYWNoIGxldmVsIC0tCiAgICAgIGxheWVyIDxNPiBvZiBsZXZlbCA8TisxPiBpcyBleHBlY3RlZCB0byBiZSBhIGZpbHRlcmVkIHZlcnNpb24gb2YgbGF5ZXIKICAgICAgPE0+IG9mIHRoZSBoaWdoZXIgbWlwbWFwIGxldmVscy4gIFRoaXMgYmVoYXZpb3IgaW1wYWN0cyB0aGUgdGV4dHVyZQogICAgICBjb25zaXN0ZW5jeSBydWxlcyBmb3IgYXJyYXkgdGV4dHVyZXMuCgogICAgKDgpIEFyZSBjb21wcmVzc2VkIHRleHR1cmVzIHN1cHBvcnRlZCBmb3IgYXJyYXkgdGV4dHVyZXM/CgogICAgICBSRVNPTFZFRDogIFllczsgdGhleSBtYXkgYmUgbG9hZGVkIHZpYSBub3JtYWwgVGV4SW1hZ2UgQVBJcywgYXMgd2VsbCBhcwogICAgICBDb21wcmVzc2VkVGV4SW1hZ2UyRCBhbmQgQ29tcHJlc3NlZFRleEltYWdlM0QuICBDb21wcmVzc2VkIGFycmF5CiAgICAgIHRleHR1cmVzIGFyZSB0cmVhdGVkIGFzIGFycmF5cyBvZiBjb21wcmVzc2VkIDFEIG9yIDJEIGltYWdlcy4KCiAgICAoOSkgU2hvdWxkIHRoZXNlIHRoaW5ncyBiZSBjYWxsZWQgImFycmF5IHRleHR1cmVzIiBvciAidGV4dHVyZSBhcnJheXMiPwoKICAgICAgUkVTT0xWRUQ6ICAiQXJyYXkgdGV4dHVyZXMiLCBtb3N0bHkgYmVjYXVzZSBpdCB3YXMgZWFzaWVyIHNwZWMgd29yZGluZy4KICAgICAgQ2FsbGluZyB0aGVtICJhcnJheSB0ZXh0dXJlcyIgYWxzbyBzZWVtcyBsaWtlIGJldHRlciBkaXNhbWJpZ3VhdGlvbjsKICAgICAgdGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50IHRoaW5ncyB0aGF0IGNhbiBiZSB0aG91Z2h0IG9mIGFzICJ0ZXh0dXJlCiAgICAgIGFycmF5cyI6CgogICAgICAgICogdGhlIGFycmF5IG9mIHRleHR1cmUgbGV2ZWxzIChtaXBtYXBwaW5nKQogICAgICAgICogdGhlIGFycmF5IG9mIHRleHR1cmUgbGF5ZXJzIChhcnJheSB0ZXh0dXJlcykKICAgICAgICAqIHRoZSBhcnJheSBvZiB0ZXhlbHMgaW4gZWFjaCBpbWFnZQoKICAgICAgVGhpcyBzcGVjIGNoYW5nZXMgdGhlIHVzZSBvZiAidGV4dHVyZSBhcnJheSIgaW4gdGhlIGNvcmUgc3BlY2lmaWNhdGlvbgogICAgICAod2hpY2ggbWVhbnMgdGhlIGFycmF5IG9mIHRleGVscykgdG8gaW5zdGVhZCByZWZlciB0byAidGV4ZWwgYXJyYXkiLgoKICAgICgxMCkgSWYgdGhleSdyZSBjYWxsZWQgImFycmF5IHRleHR1cmVzIiwgd2h5IGRvZXMgdGhlIGV4dGVuc2lvbiBuYW1lCiAgICAgICAgIGluY2x1ZGUgInRleHR1cmVfYXJyYXkiPwoKICAgICAgUkVTT0xWRUQ6ICBCZWNhdXNlIHRoaXMgaXMgcHJpbWFyaWx5IGEgdGV4dHVyZSBleHRlbnNpb24sIGFuZCBhbGwgc3VjaAogICAgICBleHRlbnNpb25zIHN0YXJ0IHdpdGggInRleHR1cmUiLgoKICAgICgxMSkgU2hvdWxkIG5ldyBmdW5jdGlvbnMgYmUgcHJvdmlkZWQgZm9yIGxvYWRpbmcgb3IgbW9kaWZ5aW5nIGFycmF5CiAgICAgICAgIHRleHR1cmVzPwoKICAgICAgUkVTT0xWRUQ6ICBOby4gIEV4aXN0aW5nIFRleEltYWdlMkQgKDFEIGFycmF5cykgYW5kIFRleEltYWdlM0QgKDJECiAgICAgIGFycmF5cyksIHBsdXMgY29ycmVzcG9uZGluZyBUZXhTdWJJbWFnZSwgQ29weVRleEltYWdlLCBhbmQKICAgICAgQ29weVRleFN1YkltYWdlIGNhbGxzIGFyZSBzdWZmaWNpZW50LgoKICAgICgxMikgU2hvdWxkIEFSQl9pbWFnaW5nIGZ1bmN0aW9uYWxpdHkgdG8gYmUgZXh0ZW5kZWQgdG8gc3VwcG9ydAogICAgICAgICB0d28tZGltZW5zaW9uYWwgYXJyYXkgdGV4dHVyZXM/CgogICAgICBSRVNPTFZFRDogIE5vLiAgQ29udm9sdXRpb24gaXMgcmFyZWx5IHVzZWQgd2hlbiB0ZXh0dXJlIGltYWdlcyBhcmUKICAgICAgZGVmaW5lZCwgYW5kIGlzIGV2ZW4gbGVzcyBsaWtlbHkgZm9yIGFycmF5IHRldHVyZSBpbWFnZXMuICBUaGlzIGNvdWxkIGJlCiAgICAgIGFkZHJlc3NlZCB2aWEgYSBzZXBhcmF0ZSBleHRlbnNpb24gaWYgdGhlIG5lZWQgd2VyZSBpZGVudGlmaWVkLCBhbmQgc3VjaAogICAgICBvcGVyYXRpb25zIGNvdWxkIGJlIGRlZmluZWQgZm9yIDNEIHRleHR1cmVzIGFzIHdlbGwgYXQgdGhhdCB0aW1lLgoKICAgICAgTm90ZSB0aGF0IHdpdGggdGhlIEFQSSBjaG9zZW4sIG9uZS1kaW1lbnNpb25hbCBhcnJheSB0ZXh0dXJlcyBkbyBoYXZlCiAgICAgIGNvbnZvbHV0aW9uIGFwcGxpZWQgKGlmIGVuYWJsZWQpLCBiZWNhdXNlIGltYWdlIGRhdGEgaXMgdHJlYXRlZCBhcyBhCiAgICAgIG5vcm1hbCB0d28tZGltZW5zaW9uYWwgaW1hZ2UuCgogICAgKDEzKSBXaGF0IGlmIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHBvcHVsYXRlIGFuIGFycmF5IHRleHR1cmUgdXNpbmcKICAgICAgICAgc2VwYXJhdGUgbWlwbWFwIGNoYWlucyBhIGxheWVyIGF0IGEgdGltZSByYXRoZXIgdGhhbiBzcGVjaWZ5aW5nIGFsbAogICAgICAgICBsYXllcnMgb2YgYSBnaXZlbiBtaXBtYXAgbGV2ZWwgYXQgb25jZT8KCiAgICAgIFJFU09MVkVEOiAgRm9yIDJEIGFycmF5IHRleHR1cmVzLCBjYWxsIFRleEltYWdlM0Qgb25jZSB3aXRoIGEgTlVMTCBpbWFnZQogICAgICBwb2ludGVyIGZvciBlYWNoIGxldmVsIHRvIGVzdGFibGlzaCB0aGUgdGV4ZWwgYXJyYXkgc2l6ZXMuICBUaGVuLCBjYWxsCiAgICAgIFRleFN1YkltYWdlM0QgZm9yIGVhY2ggbGF5ZXIvbWlwbWFwIGxldmVsIHRvIGRlZmluZSBpbmRpdmlkdWFsIGltYWdlcy4KCiAgICAoMTQpIFNob3VsZCB3ZSBwcm92aWRlIGEgd2F5IHRvIHF1ZXJ5IGEgc2luZ2xlIGxheWVyIG9mIGFuIGFycmF5IHRleHR1cmU/CgogICAgICBSRVNPTFZFRDogIE5vOyB3ZSBkb24ndCBleHBlY3QgdGhpcyB0byBiZSBhbiBpc3N1ZSBpbiBwcmFjdGljZS4KICAgICAgR2V0VGV4SW1hZ2UoKSB3aWxsIHJldHVybiBhIHR3by0gb3IgdGhyZWUtZGltZW5zaW9uYWwgaW1hZ2UgZm9yIG9uZS0gYW5kCiAgICAgIHR3by1kaW1lbnNpb25hbCBhcnJheXMsIGluY2x1ZGluZyBhbGwgbGV2ZWxzLiAgSWYgdGhpcyB3ZXJlIGlkZW50aWZpZWQKICAgICAgYXMgYW4gaW1wb3J0YW50IG5lZWQsIGEgZm9sbG93LW9uIGV4dGVuc2lvbiBjb3VsZCBiZSBhZGRlZCBpbiB0aGUKICAgICAgZnV0dXJlLgoKICAgICgxNSkgSG93IGlzIHRoZSBMT0QgKGxhbWJkYSkgY29tcHV0ZWQgZm9yIGFycmF5IHRleHR1cmVzPwoKICAgICAgUkVTT0xWRUQ6ICBMT0QgaXMgY29tcHV0ZWQgaW4gdGhlIHNhbWUgbWFubmVyIGZvciAxRCBhbmQgMkQgYXJyYXkKICAgICAgdGV4dHVyZXMgYXMgaXQgaXMgZm9yIG5vcm1hbCAxRCBhbmQgMkQgdGV4dHVyZXMuICBUaGUgbGF5ZXIgY29vcmRpbmF0ZQogICAgICBoYXMgbm8gZWZmZWN0IG9uIExPRCBjb21wdXRhdGlvbnMuCgogICAgKDE2KSBXaGF0J3MgdGhlIGRlYWwgd2l0aCB0aGlzIG5ldyAiQ09NUEFSRV9SRUZfREVQVEhfVE9fVEVYVFVSRV9FWFQiPwoKICAgICAgUkVTT0xWRUQ6ICBJdCdzIGEgbmV3IG5hbWUgZm9yIHRoZSBleGlzdGluZyBlbnVtZXJhbnQKICAgICAgIkNPTVBBUkVfUl9UT19URVhUVVJFIi4gIFRoaXMgYWx0ZXJuYXRlIG5hbWUgaXMgcHJvdmlkZWQgdG8gcmVmbGVjdCB0aGUKICAgICAgZmFjdCB0aGF0IGl0J3Mgbm90IGFsd2F5cyB0aGUgUiBjb29yZGluYXRlIHRoYXQgaXMgdXNlZCBmb3IgZGVwdGgKICAgICAgY29tcGFyaXNvbnMuCgogICAgKDE3KSBIb3cgZG8gYXJyYXkgdGV4dHVyZXMgd29yayB3aXRoIGZyYW1lYnVmZmVyIG9iamVjdHMKICAgICAgICAgKEVYVF9mcmFtZWJ1ZmZlcl9vYmplY3QgZXh0ZW5zaW9uLCBhbHNvIGtub3duIGFzICJGQk8iKT8KCiAgICAgIFJFU09MVkVEOiAgQSBuZXcgZnVuY3Rpb24sIEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyRVhUKCksIGlzIHByb3ZpZGVkIHRvCiAgICAgIGF0dGFjaCBhIHNpbmdsZSBsYXllciBvZiBhIG9uZS0gb3IgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmUgdG8gYW4KICAgICAgZnJhbWVidWZmZXIgYXR0YWNobWVudCBwb2ludC4gIFRoYXQgbmV3IGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHVzZWQgdG8KICAgICAgYXR0YWNoIGEgbGF5ZXIgb2YgYSB0aHJlZS1kaW1lbnNpb25hbCB0ZXh0dXJlLgoKICAgICAgSW4gYWRkaXRpb24gdG8gc3VwcG9ydGluZyBGQk8gYXR0YWNobWVudHMsIHRoZSBtYW51YWwgbWlwbWFwIGdlbmVyYXRpb24KICAgICAgc3VwcG9ydCBwcm92aWRlZCBieSBnbEdlbmVyYXRlTWlwbWFwRVhUIGlzIGV4dGVuZGVkIHRvIGFycmF5IHRleHR1cmVzLgogICAgICBNaXBtYXAgZ2VuZXJhdGlvbiBhcHBsaWVzIHRvIGVhY2ggbGF5ZXIgb2YgdGhlIGFycmF5IHRleHR1cmUKICAgICAgaW5kZXBlbmRlbnRseSwgYXMgaXMgdGhlIGNhc2Ugd2l0aCB0aGUgR0VORVJBVEVfTUlQTUFQUyB0ZXh0dXJlCiAgICAgIHBhcmFtZXRlci4KCiAgICAgIFRoaXMgc3VwcG9ydCBwcm92aWRlZCBoZXJlIGEgbGltaXRlZCBzdWJzZXQgb2YgdGhlIEZCTyBzdXBwb3J0IGFkZGVkIGJ5CiAgICAgIE5WX2dlb21ldHJ5X3Byb2dyYW00LCB3aGljaCBhZGRpdGlvbmFsbHkgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gYXR0YWNoCiAgICAgIGFuIGVudGlyZSBsZXZlbCBvZiBhIHRocmVlLWRpbWVuc2lvbmFsLCBjdWJlIG1hcCwgb3IgYXJyYXkgdGV4dHVyZS4KICAgICAgV2hlbiBzdWNoIGF0dGFjaG1lbnRzIGFyZSBwZXJmb3JtZWQsIGEgZ2VvbWV0cnkgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0bwogICAgICBzZWxlY3QgYSBsYXllciB0byByZW5kZXIgZWFjaCBlbWl0dGVkIHByaW1pdGl2ZSB0by4KCiAgICAoMTgpIFNob3VsZCBhcnJheSB0ZXh0dXJlIHRhcmdldHMgYmUgc3VwcG9ydGVkIGZvciBjcmVhdGlvbiBvZiAicmVuZGVyCiAgICAgICAgIGJ1ZmZlcnMiPwoKICAgICAgUkVTT0xWRUQ6ICBOby4gIFRoZXNlIGFyZSBpbmhlcmVudGx5IHR3by1kaW1lbnNpb25hbCBpbWFnZXMuCgogICAgKDE5KSBTaG91bGQgd2UgcHJvdmlkZSBhIG1pcG1hcCBnZW5lcmF0aW9uIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIG1pcG1hcHMKICAgICAgICAgZm9yIG9ubHkgYSBzaW5nbGUgbGF5ZXIgb2YgYW4gYXJyYXkgdGV4dHVyZT8KCiAgICAgIFJFU09MVkVEOiAgTm90IGluIHRoaXMgZXh0ZW5zaW9uLiAgV2UgY29uc2lkZXJlZCBhZGRpbmcgdGhpcyB0b3dhcmQgdGhlCiAgICAgIGVuZCBvZiB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBleHRlbnNpb24sIGJ1dCBkZWNpZGVkIG5vdCB0byBhZGQgaXQKICAgICAgYmVjYXVzZSB0aGlzIG1pcG1hcCBnZW5lcmF0aW9uIGZ1bmN0aW9uIHdvdWxkIGhhdmUgdmVyeSBkaWZmZXJlbnQKICAgICAgcmVxdWlyZW1lbnRzIGZyb20gdGhlIEdlbmVyYXRlTWlwbWFwRVhUIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5CiAgICAgIEVYVF9mcmFtZWJ1ZmZlcl9vYmplY3QuCgogICAgICBUaGUgZXhpc3RpbmcgR2VuZXJhdGVNaXBtYXBFWFQgZnVuY3Rpb24gcmVwbGFjZXMgYWxsIGxldmVscyBvZiBkZXRhaWwKICAgICAgYmVsb3cgdGhlIGJhc2UgbGV2ZWwgd2l0aCBnZW5lcmF0ZWQgbWlwbWFwcy4gIElmIHRob3NlIG1pcG1hcCBsZXZlbHMgYXJlCiAgICAgIHVucG9wdWxhdGVkIG9yIGluY29uc2lzdGVudCB3aXRoIHRoZSBiYXNlIGxldmVsLCB0aGV5IGFyZSBjb21wbGV0ZWx5CiAgICAgIG92ZXJ3cml0dGVuIHdpdGggYSBnZW5lcmF0ZWQgaW1hZ2UgdGhhdCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGJhc2UKICAgICAgbGV2ZWwuICBJZiB3ZSB3ZXJlIHRvIHByb3ZpZGUgYSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBtaXBtYXBzIGZvciBvbmx5IGEKICAgICAgc2luZ2xlIGxheWVyLCBhbGwgb3RoZXIgbGF5ZXJzIG9mIG5vbi1iYXNlIGxldmVscyB3b3VsZCBuZWVkIHRvIGJlCiAgICAgIHByZXNlcnZlZC4gIEhvd2V2ZXIsIHNpbmNlIHRoZXJlIGFyZSBub3Qgc2VwYXJhdGUgZm9ybWF0cyBvciBzaXplcyBwZXIKICAgICAgbGV2ZWwsIHRoaXMgZm9ybSBvZiBtaXBtYXAgZ2VuZXJhdGlvbiB3b3VsZCByZXF1aXJlIHRoYXQgYWxsIG5vbi1iYXNlCiAgICAgIGxldmVscyBiZSBwcmVzZW50IGFuZCBjb25zaXN0ZW50IHdpdGggdGhlIGJhc2UgbGV2ZWwsIG9yIG1pcG1hcAogICAgICBnZW5lcmF0aW9uIHdvdWxkbid0IHdvcmsuCgogICAgICBXZSBleHBlY3QgdGhhdCBmdXR1cmUgcmV2aXNpb25zIG9mIHRoZSBHTCB3aWxsIGNoYW5nZSB0aGUgc3BlY2lmaWNhdGlvbgogICAgICBvZiBtaXBtYXBwZWQgdGV4dHVyZXMgaW4gCgogICAgKDIwKSBUaGlzIGV4dGVuc2lvbiBhbGxvd3MgdGhlIHVzZSBvZiBTM1RDIHRleHR1cmUgaW50ZXJuYWwgZm9ybWF0cyBpbgogICAgICAgICBUZXhJbWFnZTNEIGFuZCBDb21wcmVzc2VkVGV4SW1hZ2UzRC4gIERvZXMgdGhpcyBtZWFuIHRoYXQgdGhleSBhcmUKICAgICAgICAgbm93IHN1cHBvcnRlZCBmb3IgM0QgdGV4dHVyZXM/CgogICAgICBSRVNPTFZFRDogIE5vLiAgV2l0aCB0aGlzIGV4dGVuc2lvbiBhbG9uZSwgVGV4SW1hZ2UzRCBhbmQKICAgICAgQ29tcHJlc3NlZFRleEltYWdlM0Qgb25seSBzdXBwb3J0IFMzVEMgY29tcHJlc3NlZCBmb3JtYXRzIHdpdGggYSB0YXJnZXQKICAgICAgb2YgVEVYVFVSRV8yRF9BUlJBWV9FWFQuICBUaGUgUzNUQyB0b2tlbnMgd2VyZSBhZGRlZCB0byB0aGUgbGlzdCBvZgogICAgICBpbnRlcm5hbCBmb3JtYXRzIHN1cHBvcnRlZCBieSBUZXhJbWFnZTNEIGFuZCBmcmllbmRzIGJlY2F1c2UKICAgICAgdHdvLWRpbWVuc2lvbmFsIGFycmF5IHRleHR1cmVzIGFyZSBzcGVjaWZpZWQgdXNpbmcgdGhlIHRocmVlLWRpbWVuc2lvbmFsCiAgICAgIFRleEltYWdlIGZ1bmN0aW9ucy4KCiAgICAgIFRoZSBleGlzdGluZyBleHRlbnNpb24gTlZfdGV4dHVyZV9jb21wcmVzc2lvbl92dGMgZG9lcyBwcm92aWRlcyBzdXBwb3J0CiAgICAgIGZvciBTM1RDLXN0eWxlIGNvbXByZXNzZWQgM0QgdGV4dHVyZXMuCgpSZXZpc2lvbiBIaXN0b3J5CgogICAgUmV2LiAgICBEYXRlICAgIEF1dGhvciAgICBDaGFuZ2VzCiAgICAtLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIDggICAwOS8xNi8wOCAgbWprICAgICAgIERvY3VtZW50IEdlbmVyYXRlTWlwbWFwRVhUIGFsbG93cyBhcnJheSB0YXJnZXRzCiAgICAgIDcgICAwOC8wNy8wOCAgamxlZWNoICAgIENvcnJlY3RlZCB0b2tlbiBNQVhfVEVYVFVSRV9BUlJBWV9MQVlFUlNfRVhUIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIHRhYmxlIHRvIE1BWF9BUlJBWV9URVhUVVJFX0xBWUVSU19FWFQuCgogICAgICA2ICAgMDIvMDQvMDggIHBicm93biAgICBBZGRlZCBhIG1pc3NpbmcgaW50ZXJhY3Rpb24gd2l0aCB0aGUgVlRDIHRleHR1cmUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uIHNwZWMgYWxsb3dpbmcgdXBkYXRlcyBvZiBjb21wcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJEIGFycmF5IHRleHR1cmVzIGFsb25nIDR4NHgxIGJvdW5kYXJpZXMgKHdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgaW5oZXJpdGVkIHRoZSBWVEMgcmVzdHJpY3Rpb24gb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNHg0eDQpLgoKICAgICAgNSAgIDEyLzE1LzA2ICBwYnJvd24gICAgRG9jdW1lbnRlZCB0aGF0IHRoZSAnI2V4dGVuc2lvbicgdG9rZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZXh0ZW5zaW9uIHNob3VsZCBiZWdpbiB3aXRoICJHTF8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhcHBhcmVudGx5IGNhbGxlZCBmb3IgcGVyIGNvbnZlbnRpb24uCgogICAgICA0ICAgICAgLS0gICAgICAgICAgICAgICBQcmUtcmVsZWFzZSByZXZpc2lvbnMuCg==