ZGlmZiAtLWdpdCBhL2RvYy9hcGkucnN0IGIvZG9jL2FwaS5yc3QKaW5kZXggYmNlYmQ0My4uNTVhMzNlYyAxMDA2NDQKLS0tIGEvZG9jL2FwaS5yc3QKKysrIGIvZG9jL2FwaS5yc3QKQEAgLTEsNyArMSwxNCBAQAotQVBJCi09PT0KKy4uIHB5Om1vZHVsZTo6IE9wZW5TU0wKIAotLi4gYXV0b21vZHVsZTo6IE9wZW5TU0wKKworLi4gX2FwaS1vcGVuc3NsOgorCisKK09wZW5TU0wgLS0gUHl0aG9uIGludGVyZmFjZSB0byBPcGVuU1NMCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBoaWdoLWxldmVsIGludGVyZmFjZSB0byB0aGUgZnVuY3Rpb25zIGluIHRoZQorT3BlblNTTCBsaWJyYXJ5LiBUaGUgZm9sbG93aW5nIG1vZHVsZXMgYXJlIGRlZmluZWQ6CiAKIAogLi4gdG9jdHJlZTo6CkBAIC05LDQgKzE2LDQgQEAKIAogICAgYXBpL2NyeXB0bwogICAgYXBpL3JhbmQKLSAgIGFwaS9TU0wKKyAgIGFwaS9zc2wKZGlmZiAtLWdpdCBhL2RvYy9hcGkvU1NMLnJzdCBiL2RvYy9hcGkvU1NMLnJzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4YmM2My4uMDAwMDAwMAotLS0gYS9kb2MvYXBpL1NTTC5yc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0uLiBfb3BlbnNzbC1zc2w6Ci0KLU9wZW5TU0wuU1NMIG1vZHVsZQotPT09PT09PT09PT09PT09PT09Ci0KLS4uIGF1dG9tb2R1bGU6OiBPcGVuU1NMLlNTTAotICAgOm1lbWJlcnM6Ci0KLS4uIGF1dG9jbGFzczo6IE9wZW5TU0wuU1NMLkNvbnRleHQKLSAgIDptZW1iZXJzOgotCi0uLiBhdXRvY2xhc3M6OiBPcGVuU1NMLlNTTC5Db25uZWN0aW9uCi0gICA6bWVtYmVyczoKZGlmZiAtLWdpdCBhL2RvYy9hcGkvY3J5cHRvLnJzdCBiL2RvYy9hcGkvY3J5cHRvLnJzdAppbmRleCAyMjI0MzFkLi45MDdiZGY1IDEwMDY0NAotLS0gYS9kb2MvYXBpL2NyeXB0by5yc3QKKysrIGIvZG9jL2FwaS9jcnlwdG8ucnN0CkBAIC0xLDM4ICsxLDc1MyBAQAotT3BlblNTTC5jcnlwdG8gbW9kdWxlCi09PT09PT09PT09PT09PT09PT09PT0KKy4uIHB5Om1vZHVsZTo6IE9wZW5TU0wuY3J5cHRvCisKKy4uIF9hcGktb3BlbnNzbC1jcnlwdG86CisKK2BgY3J5cHRvYGAgLS0gR2VuZXJpYyBjcnlwdG9ncmFwaGljIG1vZHVsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIAotLi4gYXV0b21vZHVsZTo6IE9wZW5TU0wuY3J5cHRvCi0gICA6bWVtYmVyczoKKy4uIHB5OmRhdGE6OiBYNTA5VHlwZQogCi0uLiBhdXRvY2xhc3M6OiBPcGVuU1NMLmNyeXB0by5YNTA5Ci0gICA6bWVtYmVyczoKLQotLi4gYXV0b2NsYXNzOjogT3BlblNTTC5jcnlwdG8uWDUwOU5hbWUKLSAgIDptZW1iZXJzOgotCi0uLiBhdXRvY2xhc3M6OiBPcGVuU1NMLmNyeXB0by5YNTA5UmVxCi0gICA6bWVtYmVyczoKLQotLi4gYXV0b2NsYXNzOjogT3BlblNTTC5jcnlwdG8uWDUwOVN0b3JlVHlwZQotICAgOm1lbWJlcnM6Ci0KLS4uIGF1dG9jbGFzczo6IE9wZW5TU0wuY3J5cHRvLlBLZXkKLSAgIDptZW1iZXJzOgotCi0uLiBhdXRvY2xhc3M6OiBPcGVuU1NMLmNyeXB0by5QS0NTN1R5cGUKLSAgIDptZW1iZXJzOgotCi0uLiBhdXRvY2xhc3M6OiBPcGVuU1NMLmNyeXB0by5QS0NTMTIKLSAgIDptZW1iZXJzOgotCi0uLiBhdXRvY2xhc3M6OiBPcGVuU1NMLmNyeXB0by5OZXRzY2FwZVNQS0kKLSAgIDptZW1iZXJzOgotCi0uLiBhdXRvY2xhc3M6OiBPcGVuU1NMLmNyeXB0by5DUkwKLSAgIDptZW1iZXJzOgotCi0uLiBhdXRvY2xhc3M6OiBPcGVuU1NMLmNyeXB0by5SZXZva2VkCi0gICA6bWVtYmVyczoKKyAgICBTZWUgOnB5OmNsYXNzOmBYNTA5YC4KIAogCisuLiBweTpjbGFzczo6IFg1MDkoKQorCisgICAgQSBjbGFzcyByZXByZXNlbnRpbmcgWC41MDkgY2VydGlmaWNhdGVzLgorCisKKy4uIHB5OmRhdGE6OiBYNTA5TmFtZVR5cGUKKworICAgIFNlZSA6cHk6Y2xhc3M6YFg1MDlOYW1lYC4KKworCisuLiBweTpjbGFzczo6IFg1MDlOYW1lKHg1MDluYW1lKQorCisgICAgQSBjbGFzcyByZXByZXNlbnRpbmcgWC41MDkgRGlzdGluZ3Vpc2hlZCBOYW1lcy4KKworICAgIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIGNvcHkgb2YgKng1MDluYW1lKiB3aGljaCBzaG91bGQgYmUgYW4KKyAgICBpbnN0YW5jZSBvZiA6cHk6Y2xhc3M6YFg1MDlOYW1lYC4KKworCisuLiBweTpkYXRhOjogWDUwOVJlcVR5cGUKKworICAgIFNlZSA6cHk6Y2xhc3M6YFg1MDlSZXFgLgorCisKKy4uIHB5OmNsYXNzOjogWDUwOVJlcSgpCisKKyAgICBBIGNsYXNzIHJlcHJlc2VudGluZyBYLjUwOSBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4KKworCisuLiBweTpkYXRhOjogWDUwOVN0b3JlVHlwZQorCisgICAgQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBYNTA5U3RvcmUgb2JqZWN0IHR5cGUuCisKKworLi4gcHk6ZGF0YTo6IFBLZXlUeXBlCisKKyAgICBTZWUgOnB5OmNsYXNzOmBQS2V5YC4KKworCisuLiBweTpjbGFzczo6IFBLZXkoKQorCisgICAgQSBjbGFzcyByZXByZXNlbnRpbmcgRFNBIG9yIFJTQSBrZXlzLgorCisKKy4uIHB5OmRhdGE6OiBQS0NTN1R5cGUKKworICAgIEEgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgUEtDUzcgb2JqZWN0IHR5cGUuCisKKworLi4gcHk6ZGF0YTo6IFBLQ1MxMlR5cGUKKworICAgIEEgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgUEtDUzEyIG9iamVjdCB0eXBlLgorCisKKy4uIHB5OmRhdGE6OiBYNTA5RXh0ZW5zaW9uVHlwZQorCisgICAgU2VlIDpweTpjbGFzczpgWDUwOUV4dGVuc2lvbmAuCisKKworLi4gcHk6Y2xhc3M6OiBYNTA5RXh0ZW5zaW9uKHR5cGVuYW1lLCBjcml0aWNhbCwgdmFsdWVbLCBzdWJqZWN0XVssIGlzc3Vlcl0pCisKKyAgICBBIGNsYXNzIHJlcHJlc2VudGluZyBhbiBYLjUwOSB2MyBjZXJ0aWZpY2F0ZSBleHRlbnNpb25zLiAgU2VlCisgICAgaHR0cDovL29wZW5zc2wub3JnL2RvY3MvYXBwcy94NTA5djNfY29uZmlnLmh0bWwjU1RBTkRBUkRfRVhURU5TSU9OUyBmb3IKKyAgICAqdHlwZW5hbWUqIHN0cmluZ3MgYW5kIHRoZWlyIG9wdGlvbnMuICBPcHRpb25hbCBwYXJhbWV0ZXJzICpzdWJqZWN0KiBhbmQKKyAgICAqaXNzdWVyKiBtdXN0IGJlIFg1MDkgb2JqZWN0cy4KKworCisuLiBweTpkYXRhOjogTmV0c2NhcGVTUEtJVHlwZQorCisgICAgU2VlIDpweTpjbGFzczpgTmV0c2NhcGVTUEtJYC4KKworCisuLiBweTpjbGFzczo6IE5ldHNjYXBlU1BLSShbZW5jXSkKKworICAgIEEgY2xhc3MgcmVwcmVzZW50aW5nIE5ldHNjYXBlIFNQS0kgb2JqZWN0cy4KKworICAgIElmIHRoZSAqZW5jKiBhcmd1bWVudCBpcyBwcmVzZW50LCBpdCBzaG91bGQgYmUgYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcKKyAgICByZXByZXNlbnRpbmcgYSBOZXRzY2FwZVNQS0kgb2JqZWN0LCBhcyByZXR1cm5lZCBieSB0aGUgOnB5Om1ldGg6YGI2NF9lbmNvZGVgCisgICAgbWV0aG9kLgorCisKKy4uIHB5OmNsYXNzOjogQ1JMKCkKKworICAgIEEgY2xhc3MgcmVwcmVzZW50aW5nIENlcnRpZmNhdGUgUmV2b2NhdGlvbiBMaXN0IG9iamVjdHMuCisKKworLi4gcHk6Y2xhc3M6OiBSZXZva2VkKCkKKworICAgIEEgY2xhc3MgcmVwcmVzZW50aW5nIFJldm9jYXRpb24gb2JqZWN0cyBvZiBDUkwuCisKKworLi4gcHk6ZGF0YTo6IEZJTEVUWVBFX1BFTQorLi4gcHk6ZGF0YTo6IEZJTEVUWVBFX0FTTjEKKworICAgIEZpbGUgdHlwZSBjb25zdGFudHMuCisKKworLi4gcHk6ZGF0YTo6IFRZUEVfUlNBCisuLiBweTpkYXRhOjogVFlQRV9EU0EKKworICAgIEtleSB0eXBlIGNvbnN0YW50cy4KKworCisuLiBweTpleGNlcHRpb246OiBFcnJvcgorCisgICAgR2VuZXJpYyBleGNlcHRpb24gdXNlZCBpbiB0aGUgOnB5Om1vZDpgLmNyeXB0b2AgbW9kdWxlLgorCisKKy4uIHB5OmZ1bmN0aW9uOjogZHVtcF9jZXJ0aWZpY2F0ZSh0eXBlLCBjZXJ0KQorCisgICAgRHVtcCB0aGUgY2VydGlmaWNhdGUgKmNlcnQqIGludG8gYSBidWZmZXIgc3RyaW5nIGVuY29kZWQgd2l0aCB0aGUgdHlwZQorICAgICp0eXBlKi4KKworCisuLiBweTpmdW5jdGlvbjo6IGR1bXBfY2VydGlmaWNhdGVfcmVxdWVzdCh0eXBlLCByZXEpCisKKyAgICBEdW1wIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0ICpyZXEqIGludG8gYSBidWZmZXIgc3RyaW5nIGVuY29kZWQgd2l0aCB0aGUKKyAgICB0eXBlICp0eXBlKi4KKworCisuLiBweTpmdW5jdGlvbjo6IGR1bXBfcHJpdmF0ZWtleSh0eXBlLCBwa2V5WywgY2lwaGVyLCBwYXNzcGhyYXNlXSkKKworICAgIER1bXAgdGhlIHByaXZhdGUga2V5ICpwa2V5KiBpbnRvIGEgYnVmZmVyIHN0cmluZyBlbmNvZGVkIHdpdGggdGhlIHR5cGUKKyAgICAqdHlwZSosIG9wdGlvbmFsbHkgKGlmICp0eXBlKiBpcyA6cHk6Y29uc3Q6YEZJTEVUWVBFX1BFTWApIGVuY3J5cHRpbmcgaXQKKyAgICB1c2luZyAqY2lwaGVyKiBhbmQgKnBhc3NwaHJhc2UqLgorCisgICAgKnBhc3NwaHJhc2UqIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEgY2FsbGJhY2sgZm9yIHByb3ZpZGluZyB0aGUKKyAgICBwYXNzIHBocmFzZS4KKworCisuLiBweTpmdW5jdGlvbjo6IGxvYWRfY2VydGlmaWNhdGUodHlwZSwgYnVmZmVyKQorCisgICAgTG9hZCBhIGNlcnRpZmljYXRlIChYNTA5KSBmcm9tIHRoZSBzdHJpbmcgKmJ1ZmZlciogZW5jb2RlZCB3aXRoIHRoZQorICAgIHR5cGUgKnR5cGUqLgorCisKKy4uIHB5OmZ1bmN0aW9uOjogbG9hZF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KHR5cGUsIGJ1ZmZlcikKKworICAgIExvYWQgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IChYNTA5UmVxKSBmcm9tIHRoZSBzdHJpbmcgKmJ1ZmZlciogZW5jb2RlZCB3aXRoCisgICAgdGhlIHR5cGUgKnR5cGUqLgorCisKKy4uIHB5OmZ1bmN0aW9uOjogbG9hZF9wcml2YXRla2V5KHR5cGUsIGJ1ZmZlclssIHBhc3NwaHJhc2VdKQorCisgICAgTG9hZCBhIHByaXZhdGUga2V5IChQS2V5KSBmcm9tIHRoZSBzdHJpbmcgKmJ1ZmZlciogZW5jb2RlZCB3aXRoIHRoZSB0eXBlCisgICAgKnR5cGUqIChtdXN0IGJlIG9uZSBvZiA6cHk6Y29uc3Q6YEZJTEVUWVBFX1BFTWAgYW5kCisgICAgOnB5OmNvbnN0OmBGSUxFVFlQRV9BU04xYCkuCisKKyAgICAqcGFzc3BocmFzZSogbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBjYWxsYmFjayBmb3IgcHJvdmlkaW5nIHRoZSBwYXNzCisgICAgcGhyYXNlLgorCisKKy4uIHB5OmZ1bmN0aW9uOjogbG9hZF9jcmwodHlwZSwgYnVmZmVyKQorCisgICAgTG9hZCBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3QgKENSTCkgZGF0YSBmcm9tIGEgc3RyaW5nICpidWZmZXIqLgorICAgICpidWZmZXIqIGVuY29kZWQgd2l0aCB0aGUgdHlwZSAqdHlwZSouICBUaGUgdHlwZSAqdHlwZSogbXVzdCBlaXRoZXIKKyAgICA6cHk6Y29uc3Q6YEZJTEVUWVBFX1BFTWAgb3IgOnB5OmNvbnN0OmBGSUxFVFlQRV9BU04xYCkuCisKKworLi4gcHk6ZnVuY3Rpb246OiBsb2FkX3BrY3M3X2RhdGEodHlwZSwgYnVmZmVyKQorCisgICAgTG9hZCBwa2NzNyBkYXRhIGZyb20gdGhlIHN0cmluZyAqYnVmZmVyKiBlbmNvZGVkIHdpdGggdGhlIHR5cGUgKnR5cGUqLgorCisKKy4uIHB5OmZ1bmN0aW9uOjogbG9hZF9wa2NzMTIoYnVmZmVyWywgcGFzc3BocmFzZV0pCisKKyAgICBMb2FkIHBrY3MxMiBkYXRhIGZyb20gdGhlIHN0cmluZyAqYnVmZmVyKi4gSWYgdGhlIHBrY3MxMiBzdHJ1Y3R1cmUgaXMKKyAgICBlbmNyeXB0ZWQsIGEgKnBhc3NwaHJhc2UqIG11c3QgYmUgaW5jbHVkZWQuICBUaGUgTUFDIGlzIGFsd2F5cworICAgIGNoZWNrZWQgYW5kIHRodXMgcmVxdWlyZWQuCisKKyAgICBTZWUgYWxzbyB0aGUgbWFuIHBhZ2UgZm9yIHRoZSBDIGZ1bmN0aW9uIDpweTpmdW5jOmBQS0NTMTJfcGFyc2VgLgorCisKKy4uIHB5OmZ1bmN0aW9uOjogc2lnbihrZXksIGRhdGEsIGRpZ2VzdCkKKworICAgIFNpZ24gYSBkYXRhIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4ga2V5IGFuZCBtZXNzYWdlIGRpZ2VzdC4KKworICAgICprZXkqIGlzIGEgOnB5OmNsYXNzOmBQS2V5YCBpbnN0YW5jZS4gICpkYXRhKiBpcyBhIGBgc3RyYGAgaW5zdGFuY2UuCisgICAgKmRpZ2VzdCogaXMgYSBgYHN0cmBgIG5hbWluZyBhIHN1cHBvcnRlZCBtZXNzYWdlIGRpZ2VzdCB0eXBlLCBmb3IgZXhhbXBsZQorICAgIDpweTpjb25zdDpgc2hhMWAuCisKKyAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAwLjExCisKKworLi4gcHk6ZnVuY3Rpb246OiB2ZXJpZnkoY2VydGlmaWNhdGUsIHNpZ25hdHVyZSwgZGF0YSwgZGlnZXN0KQorCisgICAgVmVyaWZ5IHRoZSBzaWduYXR1cmUgZm9yIGEgZGF0YSBzdHJpbmcuCisKKyAgICAqY2VydGlmaWNhdGUqIGlzIGEgOnB5OmNsYXNzOmBYNTA5YCBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcml2YXRlCisgICAga2V5IHdoaWNoIGdlbmVyYXRlZCB0aGUgc2lnbmF0dXJlLiAgKnNpZ25hdHVyZSogaXMgYSAqc3RyKiBpbnN0YW5jZSBnaXZpbmcKKyAgICB0aGUgc2lnbmF0dXJlIGl0c2VsZi4gICpkYXRhKiBpcyBhICpzdHIqIGluc3RhbmNlIGdpdmluZyB0aGUgZGF0YSB0byB3aGljaAorICAgIHRoZSBzaWduYXR1cmUgYXBwbGllcy4gICpkaWdlc3QqIGlzIGEgKnN0ciogaW5zdGFuY2UgbmFtaW5nIHRoZSBtZXNzYWdlCisgICAgZGlnZXN0IHR5cGUgb2YgdGhlIHNpZ25hdHVyZSwgZm9yIGV4YW1wbGUgOnB5OmNvbnN0OmBzaGExYC4KKworICAgIC4uIHZlcnNpb25hZGRlZDo6IDAuMTEKKworCisuLiBfb3BlbnNzbC14NTA5OgorCitYNTA5IG9iamVjdHMKKy0tLS0tLS0tLS0tLQorCitYNTA5IG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKKy4uIHB5Om1ldGhvZDo6IFg1MDkuZ2V0X2lzc3VlcigpCisKKyAgICBSZXR1cm4gYW4gWDUwOU5hbWUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgaXNzdWVyIG9mIHRoZSBjZXJ0aWZpY2F0ZS4KKworCisuLiBweTptZXRob2Q6OiBYNTA5LmdldF9wdWJrZXkoKQorCisgICAgUmV0dXJuIGEgOnB5OmNsYXNzOmBQS2V5YCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZS4KKworCisuLiBweTptZXRob2Q6OiBYNTA5LmdldF9zZXJpYWxfbnVtYmVyKCkKKworICAgIFJldHVybiB0aGUgY2VydGlmaWNhdGUgc2VyaWFsIG51bWJlci4KKworCisuLiBweTptZXRob2Q6OiBYNTA5LmdldF9zaWduYXR1cmVfYWxnb3JpdGhtKCkKKworICAgIFJldHVybiB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSB1c2VkIGluIHRoZSBjZXJ0aWZpY2F0ZS4gIElmIHRoZSBhbGdvcml0aG0gaXMKKyAgICB1bmRlZmluZWQsIHJhaXNlIDpweTpkYXRhOmBWYWx1ZUVycm9yYC4KKworCisuLiBweTptZXRob2Q6OiBYNTA5LmdldF9zdWJqZWN0KCkKKworICAgIFJldHVybiBhbiA6cHk6Y2xhc3M6YFg1MDlOYW1lYCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdWJqZWN0IG9mIHRoZSBjZXJ0aWZpY2F0ZS4KKworCisuLiBweTptZXRob2Q6OiBYNTA5LmdldF92ZXJzaW9uKCkKKworICAgIFJldHVybiB0aGUgY2VydGlmaWNhdGUgdmVyc2lvbi4KKworCisuLiBweTptZXRob2Q6OiBYNTA5LmdldF9ub3RCZWZvcmUoKQorCisgICAgUmV0dXJuIGEgc3RyaW5nIGdpdmluZyB0aGUgdGltZSBiZWZvcmUgd2hpY2ggdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB2YWxpZC4gIFRoZQorICAgIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgYW4gQVNOMSBHRU5FUkFMSVpFRFRJTUU6OgorCisgICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzWgorICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zcytoaG1tCisgICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzLWhobW0KKworICAgIElmIG5vIHZhbHVlIGV4aXN0cyBmb3IgdGhpcyBmaWVsZCwgOnB5OmRhdGE6YE5vbmVgIGlzIHJldHVybmVkLgorCisKKy4uIHB5Om1ldGhvZDo6IFg1MDkuZ2V0X25vdEFmdGVyKCkKKworICAgIFJldHVybiBhIHN0cmluZyBnaXZpbmcgdGhlIHRpbWUgYWZ0ZXIgd2hpY2ggdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB2YWxpZC4gIFRoZQorICAgIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgYW4gQVNOMSBHRU5FUkFMSVpFRFRJTUU6OgorCisgICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzWgorICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zcytoaG1tCisgICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzLWhobW0KKworICAgIElmIG5vIHZhbHVlIGV4aXN0cyBmb3IgdGhpcyBmaWVsZCwgOnB5OmRhdGE6YE5vbmVgIGlzIHJldHVybmVkLgorCisKKy4uIHB5Om1ldGhvZDo6IFg1MDkuc2V0X25vdEJlZm9yZSh3aGVuKQorCisgICAgQ2hhbmdlIHRoZSB0aW1lIGJlZm9yZSB3aGljaCB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHZhbGlkLiAgKndoZW4qIGlzIGEKKyAgICBzdHJpbmcgZm9ybWF0dGVkIGFzIGFuIEFTTjEgR0VORVJBTElaRURUSU1FOjoKKworICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zc1oKKyAgICAgICAgICAgICAgICAgWVlZWU1NRERoaG1tc3MraGhtbQorICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zcy1oaG1tCisKKworLi4gcHk6bWV0aG9kOjogWDUwOS5zZXRfbm90QWZ0ZXIod2hlbikKKworICAgIENoYW5nZSB0aGUgdGltZSBhZnRlciB3aGljaCB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHZhbGlkLiAgKndoZW4qIGlzIGEKKyAgICBzdHJpbmcgZm9ybWF0dGVkIGFzIGFuIEFTTjEgR0VORVJBTElaRURUSU1FOjoKKworICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zc1oKKyAgICAgICAgICAgICAgICAgWVlZWU1NRERoaG1tc3MraGhtbQorICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zcy1oaG1tCisKKworCisuLiBweTptZXRob2Q6OiBYNTA5LmdtdGltZV9hZGpfbm90QmVmb3JlKHRpbWUpCisKKyAgICBBZGp1c3QgdGhlIHRpbWVzdGFtcCAoaW4gR01UKSB3aGVuIHRoZSBjZXJ0aWZpY2F0ZSBzdGFydHMgYmVpbmcgdmFsaWQuCisKKworLi4gcHk6bWV0aG9kOjogWDUwOS5nbXRpbWVfYWRqX25vdEFmdGVyKHRpbWUpCisKKyAgICBBZGp1c3QgdGhlIHRpbWVzdGFtcCAoaW4gR01UKSB3aGVuIHRoZSBjZXJ0aWZpY2F0ZSBzdG9wcyBiZWluZyB2YWxpZC4KKworCisuLiBweTptZXRob2Q6OiBYNTA5Lmhhc19leHBpcmVkKCkKKworICAgIENoZWNrcyB0aGUgY2VydGlmaWNhdGUncyB0aW1lIHN0YW1wIGFnYWluc3QgY3VycmVudCB0aW1lLiBSZXR1cm5zIHRydWUgaWYgdGhlCisgICAgY2VydGlmaWNhdGUgaGFzIGV4cGlyZWQgYW5kIGZhbHNlIG90aGVyd2lzZS4KKworCisuLiBweTptZXRob2Q6OiBYNTA5LnNldF9pc3N1ZXIoaXNzdWVyKQorCisgICAgU2V0IHRoZSBpc3N1ZXIgb2YgdGhlIGNlcnRpZmljYXRlIHRvICppc3N1ZXIqLgorCisKKy4uIHB5Om1ldGhvZDo6IFg1MDkuc2V0X3B1YmtleShwa2V5KQorCisgICAgU2V0IHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byAqcGtleSouCisKKworLi4gcHk6bWV0aG9kOjogWDUwOS5zZXRfc2VyaWFsX251bWJlcihzZXJpYWxubykKKworICAgIFNldCB0aGUgc2VyaWFsIG51bWJlciBvZiB0aGUgY2VydGlmaWNhdGUgdG8gKnNlcmlhbG5vKi4KKworCisuLiBweTptZXRob2Q6OiBYNTA5LnNldF9zdWJqZWN0KHN1YmplY3QpCisKKyAgICBTZXQgdGhlIHN1YmplY3Qgb2YgdGhlIGNlcnRpZmljYXRlIHRvICpzdWJqZWN0Ki4KKworCisuLiBweTptZXRob2Q6OiBYNTA5LnNldF92ZXJzaW9uKHZlcnNpb24pCisKKyAgICBTZXQgdGhlIGNlcnRpZmljYXRlIHZlcnNpb24gdG8gKnZlcnNpb24qLgorCisKKy4uIHB5Om1ldGhvZDo6IFg1MDkuc2lnbihwa2V5LCBkaWdlc3QpCisKKyAgICBTaWduIHRoZSBjZXJ0aWZpY2F0ZSwgdXNpbmcgdGhlIGtleSAqcGtleSogYW5kIHRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0KKyAgICBpZGVudGlmaWVkIGJ5IHRoZSBzdHJpbmcgKmRpZ2VzdCouCisKKworLi4gcHk6bWV0aG9kOjogWDUwOS5zdWJqZWN0X25hbWVfaGFzaCgpCisKKyAgICBSZXR1cm4gdGhlIGhhc2ggb2YgdGhlIGNlcnRpZmljYXRlIHN1YmplY3QuCisKKy4uIHB5Om1ldGhvZDo6IFg1MDkuZGlnZXN0KGRpZ2VzdF9uYW1lKQorCisgICAgUmV0dXJuIGEgZGlnZXN0IG9mIHRoZSBjZXJ0aWZpY2F0ZSwgdXNpbmcgdGhlICpkaWdlc3RfbmFtZSogbWV0aG9kLgorICAgICpkaWdlc3RfbmFtZSogbXVzdCBiZSBhIHN0cmluZyBkZXNjcmliaW5nIGEgZGlnZXN0IGFsZ29yaXRobSBzdXBwb3J0ZWQKKyAgICBieSBPcGVuU1NMIChieSBFVlBfZ2V0X2RpZ2VzdGJ5bmFtZSwgc3BlY2lmaWNhbGx5KS4gIEZvciBleGFtcGxlLAorICAgIDpweTpjb25zdDpgIm1kNSJgIG9yIDpweTpjb25zdDpgInNoYTEiYC4KKworCisuLiBweTptZXRob2Q6OiBYNTA5LmFkZF9leHRlbnNpb25zKGV4dGVuc2lvbnMpCisKKyAgICBBZGQgdGhlIGV4dGVuc2lvbnMgaW4gdGhlIHNlcXVlbmNlICpleHRlbnNpb25zKiB0byB0aGUgY2VydGlmaWNhdGUuCisKKworLi4gcHk6bWV0aG9kOjogWDUwOS5nZXRfZXh0ZW5zaW9uX2NvdW50KCkKKworICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGV4dGVuc2lvbnMgb24gdGhpcyBjZXJ0aWZpY2F0ZS4KKworICAgIC4uIHZlcnNpb25hZGRlZDo6IDAuMTIKKworCisuLiBweTptZXRob2Q6OiBYNTA5LmdldF9leHRlbnNpb24oaW5kZXgpCisKKyAgICBSZXRyaWV2ZSB0aGUgZXh0ZW5zaW9uIG9uIHRoaXMgY2VydGlmaWNhdGUgYXQgdGhlIGdpdmVuIGluZGV4LgorCisgICAgRXh0ZW5zaW9ucyBvbiBhIGNlcnRpZmljYXRlIGFyZSBrZXB0IGluIG9yZGVyLiAgVGhlIGluZGV4IHBhcmFtZXRlciBzZWxlY3RzCisgICAgd2hpY2ggZXh0ZW5zaW9uIHdpbGwgYmUgcmV0dXJuZWQuICBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgYW4KKyAgICA6cHk6Y2xhc3M6YFg1MDlFeHRlbnNpb25gIGluc3RhbmNlLgorCisgICAgLi4gdmVyc2lvbmFkZGVkOjogMC4xMgorCisKKy4uIF9vcGVuc3NsLXg1MDluYW1lOgorCitYNTA5TmFtZSBvYmplY3RzCistLS0tLS0tLS0tLS0tLS0tCisKK1g1MDlOYW1lIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKKy4uIHB5Om1ldGhvZDo6IFg1MDlOYW1lLmhhc2goKQorCisgICAgUmV0dXJuIGFuIGludGVnZXIgZ2l2aW5nIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBNRDUgZGlnZXN0IG9mIHRoZSBERVIKKyAgICByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmFtZS4KKworCisuLiBweTptZXRob2Q6OiBYNTA5TmFtZS5kZXIoKQorCisgICAgUmV0dXJuIGEgc3RyaW5nIGdpdmluZyB0aGUgREVSIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBuYW1lLgorCisKKy4uIHB5Om1ldGhvZDo6IFg1MDlOYW1lLmdldF9jb21wb25lbnRzKCkKKworICAgIFJldHVybiBhIGxpc3Qgb2YgdHdvLXR1cGxlcyBvZiBzdHJpbmdzIGdpdmluZyB0aGUgY29tcG9uZW50cyBvZiB0aGUgbmFtZS4KKworCitYNTA5TmFtZSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZW1iZXJzOgorCisuLiBweTphdHRyaWJ1dGU6OiBYNTA5TmFtZS5jb3VudHJ5TmFtZQorCisgICAgVGhlIGNvdW50cnkgb2YgdGhlIGVudGl0eS4gOnB5OmF0dHI6YENgIG1heSBiZSB1c2VkIGFzIGFuIGFsaWFzIGZvcgorICAgIDpweTphdHRyOmBjb3VudHJ5TmFtZWAuCisKKworLi4gcHk6YXR0cmlidXRlOjogWDUwOU5hbWUuc3RhdGVPclByb3ZpbmNlTmFtZQorCisgICAgVGhlIHN0YXRlIG9yIHByb3ZpbmNlIG9mIHRoZSBlbnRpdHkuIDpweTphdHRyOmBTVGAgbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yCisgICAgOnB5OmF0dHI6YHN0YXRlT3JQcm92aW5jZU5hbWVgIMK3CisKKy4uIFd1dD8gU3BoaW54IGlzIG5vdCBoYXBweSBpZiB0aGVyZSBpcyBubyBzcGFjZSBiZXR3ZWVuIHRoZSBgIGFuZCB0aGUgLiBqdXN0CisgICAgYWJvdmUuLi4KKworCisuLiBweTphdHRyaWJ1dGU6OiBYNTA5TmFtZS5sb2NhbGl0eU5hbWUKKworICAgIFRoZSBsb2NhbGl0eSBvZiB0aGUgZW50aXR5LiA6cHk6YXR0cjpgTGAgbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yCisgICAgOnB5OmF0dHI6YGxvY2FsaXR5TmFtZWAuCisKKworLi4gcHk6YXR0cmlidXRlOjogWDUwOU5hbWUub3JnYW5pemF0aW9uTmFtZQorCisgICAgVGhlIG9yZ2FuaXphdGlvbiBuYW1lIG9mIHRoZSBlbnRpdHkuIDpweTphdHRyOmBPYCBtYXkgYmUgdXNlZCBhcyBhbiBhbGlhcyBmb3IKKyAgICA6cHk6YXR0cjpgb3JnYW5pemF0aW9uTmFtZWAuCisKKworLi4gcHk6YXR0cmlidXRlOjogWDUwOU5hbWUub3JnYW5pemF0aW9uYWxVbml0TmFtZQorCisgICAgVGhlIG9yZ2FuaXphdGlvbmFsIHVuaXQgb2YgdGhlIGVudGl0eS4gOnB5OmF0dHI6YE9VYCBtYXkgYmUgdXNlZCBhcyBhbiBhbGlhcyBmb3IKKyAgICA6cHk6YXR0cjpgb3JnYW5pemF0aW9uYWxVbml0TmFtZWAuCisKKworLi4gcHk6YXR0cmlidXRlOjogWDUwOU5hbWUuY29tbW9uTmFtZQorCisgICAgVGhlIGNvbW1vbiBuYW1lIG9mIHRoZSBlbnRpdHkuIDpweTphdHRyOmBDTmAgbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yCisgICAgOnB5OmF0dHI6YGNvbW1vbk5hbWVgLgorCisKKy4uIHB5OmF0dHJpYnV0ZTo6IFg1MDlOYW1lLmVtYWlsQWRkcmVzcworCisgICAgVGhlIGUtbWFpbCBhZGRyZXNzIG9mIHRoZSBlbnRpdHkuCisKKworLi4gX29wZW5zc2wteDUwOXJlcToKKworWDUwOVJlcSBvYmplY3RzCistLS0tLS0tLS0tLS0tLS0KKworWDUwOVJlcSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCisuLiBweTptZXRob2Q6OiBYNTA5UmVxLmdldF9wdWJrZXkoKQorCisgICAgUmV0dXJuIGEgOnB5OmNsYXNzOmBQS2V5YCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0LgorCisKKy4uIHB5Om1ldGhvZDo6IFg1MDlSZXEuZ2V0X3N1YmplY3QoKQorCisgICAgUmV0dXJuIGFuIDpweTpjbGFzczpgWDUwOU5hbWVgIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN1YmplY3Qgb2YgdGhlIGNlcnRpZmljYXRlLgorCisKKy4uIHB5Om1ldGhvZDo6IFg1MDlSZXEuc2V0X3B1YmtleShwa2V5KQorCisgICAgU2V0IHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHRvICpwa2V5Ki4KKworCisuLiBweTptZXRob2Q6OiBYNTA5UmVxLnNpZ24ocGtleSwgZGlnZXN0KQorCisgICAgU2lnbiB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCwgdXNpbmcgdGhlIGtleSAqcGtleSogYW5kIHRoZSBtZXNzYWdlIGRpZ2VzdAorICAgIGFsZ29yaXRobSBpZGVudGlmaWVkIGJ5IHRoZSBzdHJpbmcgKmRpZ2VzdCouCisKKworLi4gcHk6bWV0aG9kOjogWDUwOVJlcS52ZXJpZnkocGtleSkKKworICAgIFZlcmlmeSBhIGNlcnRpZmljYXRlIHJlcXVlc3QgdXNpbmcgdGhlIHB1YmxpYyBrZXkgKnBrZXkqLgorCisKKy4uIHB5Om1ldGhvZDo6IFg1MDlSZXEuc2V0X3ZlcnNpb24odmVyc2lvbikKKworICAgIFNldCB0aGUgdmVyc2lvbiAoUkZDIDI0NTksIDQuMS4yLjEpIG9mIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHRvCisgICAgKnZlcnNpb24qLgorCisKKy4uIHB5Om1ldGhvZDo6IFg1MDlSZXEuZ2V0X3ZlcnNpb24oKQorCisgICAgR2V0IHRoZSB2ZXJzaW9uIChSRkMgMjQ1OSwgNC4xLjIuMSkgb2YgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QuCisKKworLi4gX29wZW5zc2wteDUwOXN0b3JlOgorCitYNTA5U3RvcmUgb2JqZWN0cworLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIFg1MDlTdG9yZSBvYmplY3QgaGFzIGN1cnJlbnRseSBqdXN0IG9uZSBtZXRob2Q6CisKKy4uIHB5Om1ldGhvZDo6IFg1MDlTdG9yZS5hZGRfY2VydChjZXJ0KQorCisgICAgQWRkIHRoZSBjZXJ0aWZpY2F0ZSAqY2VydCogdG8gdGhlIGNlcnRpZmljYXRlIHN0b3JlLgorCisKKy4uIF9vcGVuc3NsLXBrZXk6CisKK1BLZXkgb2JqZWN0cworLS0tLS0tLS0tLS0tCisKK1RoZSBQS2V5IG9iamVjdCBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCisuLiBweTptZXRob2Q6OiBQa2V5LmJpdHMoKQorCisgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBvZiB0aGUga2V5LgorCisKKy4uIHB5Om1ldGhvZDo6IFBrZXkuZ2VuZXJhdGVfa2V5KHR5cGUsIGJpdHMpCisKKyAgICBHZW5lcmF0ZSBhIHB1YmxpYy9wcml2YXRlIGtleSBwYWlyIG9mIHRoZSB0eXBlICp0eXBlKiAob25lIG9mCisgICAgOnB5OmNvbnN0OmBUWVBFX1JTQWAgYW5kIDpweTpjb25zdDpgVFlQRV9EU0FgKSB3aXRoIHRoZSBzaXplICpiaXRzKi4KKworCisuLiBweTptZXRob2Q6OiBQa2V5LnR5cGUoKQorCisgICAgUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBrZXkuCisKKworLi4gcHk6bWV0aG9kOjogUGtleS5jaGVjaygpCisKKyAgICBDaGVjayB0aGUgY29uc2lzdGVuY3kgb2YgdGhpcyBrZXksIHJldHVybmluZyBUcnVlIGlmIGl0IGlzIGNvbnNpc3RlbnQgYW5kCisgICAgcmFpc2luZyBhbiBleGNlcHRpb24gb3RoZXJ3aXNlLiAgVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBSU0Ega2V5cy4gIFNlZSB0aGUKKyAgICBPcGVuU1NMIFJTQV9jaGVja19rZXkgbWFuIHBhZ2UgZm9yIGZ1cnRoZXIgbGltaXRhdGlvbnMuCisKKworLi4gX29wZW5zc2wtcGtjczc6CisKK1BLQ1M3IG9iamVjdHMKKy0tLS0tLS0tLS0tLS0KKworUEtDUzcgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworLi4gcHk6bWV0aG9kOjogUGtleS50eXBlX2lzX3NpZ25lZCgpCisKKyAgICBGSVhNRQorCisKKy4uIHB5Om1ldGhvZDo6IFBrZXkudHlwZV9pc19lbnZlbG9wZWQoKQorCisgICAgRklYTUUKKworCisuLiBweTptZXRob2Q6OiBQa2V5LnR5cGVfaXNfc2lnbmVkQW5kRW52ZWxvcGVkKCkKKworICAgIEZJWE1FCisKKworLi4gcHk6bWV0aG9kOjogUGtleS50eXBlX2lzX2RhdGEoKQorCisgICAgRklYTUUKKworCisuLiBweTptZXRob2Q6OiBQa2V5LmdldF90eXBlX25hbWUoKQorCisgICAgR2V0IHRoZSB0eXBlIG5hbWUgb2YgdGhlIFBLQ1M3LgorCisKKy4uIF9vcGVuc3NsLXBrY3MxMjoKKworUEtDUzEyIG9iamVjdHMKKy0tLS0tLS0tLS0tLS0tCisKK1BLQ1MxMiBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCisuLiBweTptZXRob2Q6OiBQS0NTMTIuZXhwb3J0KFtwYXNzcGhyYXNlPU5vbmVbLCBpdGVyPTIwNDhdWywgbWFjaXRlcj0xXSkKKworICAgIFJldHVybnMgYSBQS0NTMTIgb2JqZWN0IGFzIGEgc3RyaW5nLgorCisgICAgVGhlIG9wdGlvbmFsICpwYXNzcGhyYXNlKiBtdXN0IGJlIGEgc3RyaW5nIG5vdCBhIGNhbGxiYWNrLgorCisgICAgU2VlIGFsc28gdGhlIG1hbiBwYWdlIGZvciB0aGUgQyBmdW5jdGlvbiA6cHk6ZnVuYzpgUEtDUzEyX2NyZWF0ZWAuCisKKworLi4gcHk6bWV0aG9kOjogUEtDUzEyLmdldF9jYV9jZXJ0aWZpY2F0ZXMoKQorCisgICAgUmV0dXJuIENBIGNlcnRpZmljYXRlcyB3aXRoaW4gdGhlIFBLQ1MxMiBvYmplY3QgYXMgYSB0dXBsZS4gUmV0dXJucworICAgIDpweTpjb25zdDpgTm9uZWAgaWYgbm8gQ0EgY2VydGlmaWNhdGVzIGFyZSBwcmVzZW50LgorCisKKy4uIHB5Om1ldGhvZDo6IFBLQ1MxMi5nZXRfY2VydGlmaWNhdGUoKQorCisgICAgUmV0dXJuIGNlcnRpZmljYXRlIHBvcnRpb24gb2YgdGhlIFBLQ1MxMiBzdHJ1Y3R1cmUuCisKKworLi4gcHk6bWV0aG9kOjogUEtDUzEyLmdldF9mcmllbmRseW5hbWUoKQorCisgICAgUmV0dXJuIGZyaWVuZGx5TmFtZSBwb3J0aW9uIG9mIHRoZSBQS0NTMTIgc3RydWN0dXJlLgorCisKKy4uIHB5Om1ldGhvZDo6IFBLQ1MxMi5nZXRfcHJpdmF0ZWtleSgpCisKKyAgICBSZXR1cm4gcHJpdmF0ZSBrZXkgcG9ydGlvbiBvZiB0aGUgUEtDUzEyIHN0cnVjdHVyZQorCisKKy4uIHB5Om1ldGhvZDo6IFBLQ1MxMi5zZXRfY2FfY2VydGlmaWNhdGVzKGNhY2VydHMpCisKKyAgICBSZXBsYWNlIG9yIHNldCB0aGUgQ0EgY2VydGlmaWNhdGVzIHdpdGhpbiB0aGUgUEtDUzEyIG9iamVjdCB3aXRoIHRoZSBzZXF1ZW5jZSAqY2FjZXJ0cyouCisKKyAgICBTZXQgKmNhY2VydHMqIHRvIDpweTpjb25zdDpgTm9uZWAgdG8gcmVtb3ZlIGFsbCBDQSBjZXJ0aWZpY2F0ZXMuCisKKworLi4gcHk6bWV0aG9kOjogUEtDUzEyLnNldF9jZXJ0aWZpY2F0ZShjZXJ0KQorCisgICAgUmVwbGFjZSBvciBzZXQgdGhlIGNlcnRpZmljYXRlIHBvcnRpb24gb2YgdGhlIFBLQ1MxMiBzdHJ1Y3R1cmUuCisKKworLi4gcHk6bWV0aG9kOjogUEtDUzEyLnNldF9mcmllbmRseW5hbWUobmFtZSkKKworICAgIFJlcGxhY2Ugb3Igc2V0IHRoZSBmcmllbmRseU5hbWUgcG9ydGlvbiBvZiB0aGUgUEtDUzEyIHN0cnVjdHVyZS4KKworCisuLiBweTptZXRob2Q6OiBQS0NTMTIuc2V0X3ByaXZhdGVrZXkocGtleSkKKworICAgIFJlcGxhY2Ugb3Igc2V0IHByaXZhdGUga2V5IHBvcnRpb24gb2YgdGhlIFBLQ1MxMiBzdHJ1Y3R1cmUKKworCisuLiBfb3BlbnNzbC01MDlleHQ6CisKK1g1MDlFeHRlbnNpb24gb2JqZWN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1g1MDlFeHRlbnNpb24gb2JqZWN0cyBoYXZlIHNldmVyYWwgbWV0aG9kczoKKworLi4gcHk6bWV0aG9kOjogWDUwOUV4dGVuc2lvbi5nZXRfY3JpdGljYWwoKQorCisgICAgUmV0dXJuIHRoZSBjcml0aWNhbCBmaWVsZCBvZiB0aGUgZXh0ZW5zaW9uIG9iamVjdC4KKworCisuLiBweTptZXRob2Q6OiBYNTA5RXh0ZW5zaW9uLmdldF9zaG9ydF9uYW1lKCkKKworICAgIFJldHJpZXZlIHRoZSBzaG9ydCBkZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGlzIGV4dGVuc2lvbi4KKworICAgIFRoZSByZXN1bHQgaXMgYSBieXRlIHN0cmluZyBsaWtlIDpweTpjb25zdDpgYmFzaWNDb25zdHJhaW50c2AuCisKKyAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAwLjEyCisKKworLi4gcHk6bWV0aG9kOjogWDUwOUV4dGVuc2lvbi5nZXRfZGF0YSgpCisKKyAgICBSZXRyaWV2ZSB0aGUgZGF0YSBmb3IgdGhpcyBleHRlbnNpb24uCisKKyAgICBUaGUgcmVzdWx0IGlzIHRoZSBBU04uMSBlbmNvZGVkIGZvcm0gb2YgdGhlIGV4dGVuc2lvbiBkYXRhIGFzIGEgYnl0ZSBzdHJpbmcuCisKKyAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAwLjEyCisKKworLi4gX29wZW5zc2wtbmV0c2NhcGUtc3BraToKKworTmV0c2NhcGVTUEtJIG9iamVjdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05ldHNjYXBlU1BLSSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCisuLiBweTptZXRob2Q6OiBOZXRzY2FwZVNQS0kuYjY0X2VuY29kZSgpCisKKyAgICBSZXR1cm4gYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4KKworCisuLiBweTptZXRob2Q6OiBOZXRzY2FwZVNQS0kuZ2V0X3B1YmtleSgpCisKKyAgICBSZXR1cm4gdGhlIHB1YmxpYyBrZXkgb2Ygb2JqZWN0LgorCisKKy4uIHB5Om1ldGhvZDo6IE5ldHNjYXBlU1BLSS5zZXRfcHVia2V5KGtleSkKKworICAgIFNldCB0aGUgcHVibGljIGtleSBvZiB0aGUgb2JqZWN0IHRvICprZXkqLgorCisKKy4uIHB5Om1ldGhvZDo6IE5ldHNjYXBlU1BLSS5zaWduKGtleSwgZGlnZXN0X25hbWUpCisKKyAgICBTaWduIHRoZSBOZXRzY2FwZVNQS0kgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiAqa2V5KiBhbmQgKmRpZ2VzdF9uYW1lKi4KKyAgICAqZGlnZXN0X25hbWUqIG11c3QgYmUgYSBzdHJpbmcgZGVzY3JpYmluZyBhIGRpZ2VzdCBhbGdvcml0aG0gc3VwcG9ydGVkIGJ5CisgICAgT3BlblNTTCAoYnkgRVZQX2dldF9kaWdlc3RieW5hbWUsIHNwZWNpZmljYWxseSkuICBGb3IgZXhhbXBsZSwKKyAgICA6cHk6Y29uc3Q6YCJtZDUiYCBvciA6cHk6Y29uc3Q6YCJzaGExImAuCisKKworLi4gcHk6bWV0aG9kOjogTmV0c2NhcGVTUEtJLnZlcmlmeShrZXkpCisKKyAgICBWZXJpZnkgdGhlIE5ldHNjYXBlU1BLSSBvYmplY3QgdXNpbmcgdGhlIGdpdmVuICprZXkqLgorCisKKy4uIF9jcmw6CisKK0NSTCBvYmplY3RzCistLS0tLS0tLS0tLQorCitDUkwgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworLi4gcHk6bWV0aG9kOjogQ1JMLmFkZF9yZXZva2VkKHJldm9rZWQpCisKKyAgICBBZGQgYSBSZXZva2VkIG9iamVjdCB0byB0aGUgQ1JMLCBieSB2YWx1ZSBub3QgcmVmZXJlbmNlLgorCisKKy4uIHB5Om1ldGhvZDo6IENSTC5leHBvcnQoY2VydCwga2V5WywgdHlwZT1GSUxFVFlQRV9QRU1dWywgZGF5cz0xMDBdKQorCisgICAgVXNlICpjZXJ0KiBhbmQgKmtleSogdG8gc2lnbiB0aGUgQ1JMIGFuZCByZXR1cm4gdGhlIENSTCBhcyBhIHN0cmluZy4KKyAgICAqZGF5cyogaXMgdGhlIG51bWJlciBvZiBkYXlzIGJlZm9yZSB0aGUgbmV4dCBDUkwgaXMgZHVlLgorCisKKy4uIHB5Om1ldGhvZDo6IENSTC5nZXRfcmV2b2tlZCgpCisKKyAgICBSZXR1cm4gYSB0dXBsZSBvZiBSZXZva2VkIG9iamVjdHMsIGJ5IHZhbHVlIG5vdCByZWZlcmVuY2UuCisKKworLi4gX3Jldm9rZWQ6CisKK1Jldm9rZWQgb2JqZWN0cworLS0tLS0tLS0tLS0tLS0tCisKK1Jldm9rZWQgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworLi4gcHk6bWV0aG9kOjogUmV2b2tlZC5hbGxfcmVhc29ucygpCisKKyAgICBSZXR1cm4gYSBsaXN0IG9mIGFsbCBzdXBwb3J0ZWQgcmVhc29ucy4KKworCisuLiBweTptZXRob2Q6OiBSZXZva2VkLmdldF9yZWFzb24oKQorCisgICAgUmV0dXJuIHRoZSByZXZvY2F0aW9uIHJlYXNvbiBhcyBhIHN0ci4gIENhbiBiZQorICAgIE5vbmUsIHdoaWNoIGRpZmZlcnMgZnJvbSAiVW5zcGVjaWZpZWQiLgorCisKKy4uIHB5Om1ldGhvZDo6IFJldm9rZWQuZ2V0X3Jldl9kYXRlKCkKKworICAgIFJldHVybiB0aGUgcmV2b2NhdGlvbiBkYXRlIGFzIGEgc3RyLgorICAgIFRoZSBzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIGFuIEFTTjEgR0VORVJBTElaRURUSU1FLgorCisKKy4uIHB5Om1ldGhvZDo6IFJldm9rZWQuZ2V0X3NlcmlhbCgpCisKKyAgICBSZXR1cm4gYSBzdHIgY29udGFpbmluZyBhIGhleCBudW1iZXIgb2YgdGhlIHNlcmlhbCBvZiB0aGUgcmV2b2tlZCBjZXJ0aWZpY2F0ZS4KKworCisuLiBweTptZXRob2Q6OiBSZXZva2VkLnNldF9yZWFzb24ocmVhc29uKQorCisgICAgU2V0IHRoZSByZXZvY2F0aW9uIHJlYXNvbi4gICpyZWFzb24qIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZywgYnV0IHRoZQorICAgIHZhbHVlcyBhcmUgbGltaXRlZC4gIFNwYWNlcyBhbmQgY2FzZSBhcmUgaWdub3JlZC4gIFNlZQorICAgIDpweTptZXRoOmBhbGxfcmVhc29uc2AuCisKKworLi4gcHk6bWV0aG9kOjogUmV2b2tlZC5zZXRfcmV2X2RhdGUoZGF0ZSkKKworICAgIFNldCB0aGUgcmV2b2NhdGlvbiBkYXRlLgorICAgIFRoZSBzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIGFuIEFTTjEgR0VORVJBTElaRURUSU1FLgorCisKKy4uIHB5Om1ldGhvZDo6IFJldm9rZWQuc2V0X3NlcmlhbChzZXJpYWwpCisKKyAgICAqc2VyaWFsKiBpcyBhIHN0cmluZyBjb250YWluaW5nIGEgaGV4IG51bWJlciBvZiB0aGUgc2VyaWFsIG9mIHRoZSByZXZva2VkIGNlcnRpZmljYXRlLgpkaWZmIC0tZ2l0IGEvZG9jL2FwaS9yYW5kLnJzdCBiL2RvYy9hcGkvcmFuZC5yc3QKaW5kZXggNjQwY2Y4NS4uYjUzMTI1NCAxMDA2NDQKLS0tIGEvZG9jL2FwaS9yYW5kLnJzdAorKysgYi9kb2MvYXBpL3JhbmQucnN0CkBAIC0xLDYgKzEsODAgQEAKLU9wZW5TU0wucmFuZCBtb2R1bGUKLT09PT09PT09PT09PT09PT09PT0KKy4uIHB5Om1vZHVsZTo6IE9wZW5TU0wucmFuZAorCisuLiBfYXBpLW9wZW5zc2wtcmFuZDoKKworYGByYW5kYGAgLS0gQW4gaW50ZXJmYWNlIHRvIHRoZSBPcGVuU1NMIHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIG1vZHVsZSBoYW5kbGVzIHRoZSBPcGVuU1NMIHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAoUFJORykgYW5kCitkZWNsYXJlcyB0aGUgZm9sbG93aW5nOgorCisuLiBweTpmdW5jdGlvbjo6IGFkZChzdHJpbmcsIGVudHJvcHkpCisKKyAgICBNaXggYnl0ZXMgZnJvbSAqc3RyaW5nKiBpbnRvIHRoZSBQUk5HIHN0YXRlLiBUaGUgKmVudHJvcHkqIGFyZ3VtZW50IGlzCisgICAgKHRoZSBsb3dlciBib3VuZCBvZikgYW4gZXN0aW1hdGUgb2YgaG93IG11Y2ggcmFuZG9tbmVzcyBpcyBjb250YWluZWQgaW4KKyAgICAqc3RyaW5nKiwgbWVhc3VyZWQgaW4gYnl0ZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgZS5nLiA6cmZjOmAxNzUwYC4KIAogCi0uLiBhdXRvbW9kdWxlOjogT3BlblNTTC5yYW5kCi0gICA6bWVtYmVyczoKKy4uIHB5OmZ1bmN0aW9uOjogYnl0ZXMobnVtX2J5dGVzKQorCisgICAgR2V0IHNvbWUgcmFuZG9tIGJ5dGVzIGZyb20gdGhlIFBSTkcgYXMgYSBzdHJpbmcuCisKKyAgICBUaGlzIGlzIGEgd3JhcHBlciBmb3IgdGhlIEMgZnVuY3Rpb24gOnB5OmZ1bmM6YFJBTkRfYnl0ZXNgLgorCisKKy4uIHB5OmZ1bmN0aW9uOjogY2xlYW51cCgpCisKKyAgICBFcmFzZSB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIFBSTkcuCisKKyAgICBUaGlzIGlzIGEgd3JhcHBlciBmb3IgdGhlIEMgZnVuY3Rpb24gOnB5OmZ1bmM6YFJBTkRfY2xlYW51cGAuCisKKworLi4gcHk6ZnVuY3Rpb246OiBlZ2QocGF0aFssIGJ5dGVzXSkKKworICAgIFF1ZXJ5IHRoZSBFbnRyb3B5IEdhdGhlcmluZyBEYWVtb24gWyNlbnRyb3B5LWdhdGhlcmluZy1kYWVtb25dXyBvbiBzb2NrZXQKKyAgICAqcGF0aCogZm9yICpieXRlcyogYnl0ZXMgb2YgcmFuZG9tIGRhdGEgYW5kIHVzZXMgOnB5OmZ1bmM6YGFkZGAgdG8gc2VlZAorICAgIHRoZSBQUk5HLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiAqYnl0ZXMqIGlzIDI1NS4KKworCisuLiBweTpmdW5jdGlvbjo6IGxvYWRfZmlsZShwYXRoWywgYnl0ZXNdKQorCisgICAgUmVhZCAqYnl0ZXMqIGJ5dGVzIChvciBhbGwgb2YgaXQsIGlmICpieXRlcyogaXMgbmVnYXRpdmUpIG9mIGRhdGEgZnJvbSB0aGUKKyAgICBmaWxlICpwYXRoKiB0byBzZWVkIHRoZSBQUk5HLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiAqYnl0ZXMqIGlzIC0xLgorCisKKy4uIHB5OmZ1bmN0aW9uOjogc2NyZWVuKCkKKworICAgIEFkZCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgc2NyZWVuIHRvIHRoZSBQUk5HIHN0YXRlLgorCisgICAgQXZhaWxhYmlsaXR5OiBXaW5kb3dzLgorCisKKy4uIHB5OmZ1bmN0aW9uOjogc2VlZChzdHJpbmcpCisKKyAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyA6cHk6ZnVuYzpgYWRkYCB3aXRoICplbnRyb3B5KiBhcyB0aGUgbGVuZ3RoCisgICAgb2YgdGhlIHN0cmluZy4KKworCisuLiBweTpmdW5jdGlvbjo6IHN0YXR1cygpCisKKyAgICBSZXR1cm5zIHRydWUgaWYgdGhlIFBSTkcgaGFzIGJlZW4gc2VlZGVkIHdpdGggZW5vdWdoIGRhdGEsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisKKworLi4gcHk6ZnVuY3Rpb246OiB3cml0ZV9maWxlKHBhdGgpCisKKyAgICBXcml0ZSBhIG51bWJlciBvZiByYW5kb20gYnl0ZXMgKGN1cnJlbnRseSAxMDI0KSB0byB0aGUgZmlsZSAqcGF0aCouIFRoaXMKKyAgICBmaWxlIGNhbiB0aGVuIGJlIHVzZWQgd2l0aCA6cHk6ZnVuYzpgbG9hZF9maWxlYCB0byBzZWVkIHRoZSBQUk5HIGFnYWluLgorCisKKy4uIHB5OmV4Y2VwdGlvbjo6IEVycm9yCisKKyAgICBJZiB0aGUgY3VycmVudCBSQU5EIG1ldGhvZCBzdXBwb3J0cyBhbnkgZXJyb3JzLCB0aGlzIGlzIHJhaXNlZCB3aGVuIG5lZWRlZC4KKyAgICBUaGUgZGVmYXVsdCBtZXRob2QgZG9lcyBub3QgcmFpc2UgdGhpcyB3aGVuIHRoZSBlbnRyb3B5IHBvb2wgaXMgZGVwbGV0ZWQuCisKKyAgICBXaGVuZXZlciB0aGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgZGlyZWN0bHksIGl0IGhhcyBhIGxpc3Qgb2YgZXJyb3IgbWVzc2FnZXMKKyAgICBmcm9tIHRoZSBPcGVuU1NMIGVycm9yIHF1ZXVlLCB3aGVyZSBlYWNoIGl0ZW0gaXMgYSB0dXBsZSAqKGxpYiwgZnVuY3Rpb24sCisgICAgcmVhc29uKSouIEhlcmUgKmxpYiosICpmdW5jdGlvbiogYW5kICpyZWFzb24qIGFyZSBhbGwgc3RyaW5ncywgZGVzY3JpYmluZworICAgIHdoZXJlIGFuZCB3aGF0IHRoZSBwcm9ibGVtIGlzLiBTZWUgOm1hbnBhZ2U6YGVycigzKWAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKworLi4gWyNlbnRyb3B5LWdhdGhlcmluZy1kYWVtb25dIFNlZSBodHRwOi8vd3d3LmxvdGhhci5jb20vdGVjaC9jcnlwdG8vLgpkaWZmIC0tZ2l0IGEvZG9jL2FwaS9zc2wucnN0IGIvZG9jL2FwaS9zc2wucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YmI5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBpL3NzbC5yc3QKQEAgLTAsMCArMSw2NTggQEAKKy4uIHB5Om1vZHVsZTo6IE9wZW5TU0wuU1NMCisKKy4uIF9hcGktb3BlbnNzbC1zc2w6CisKK2BgU1NMYGAgLS0gQW4gaW50ZXJmYWNlIHRvIHRoZSBTU0wtc3BlY2lmaWMgcGFydHMgb2YgT3BlblNTTAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgbW9kdWxlIGhhbmRsZXMgdGhpbmdzIHNwZWNpZmljIHRvIFNTTC4gVGhlcmUgYXJlIHR3byBvYmplY3RzIGRlZmluZWQ6CitDb250ZXh0LCBDb25uZWN0aW9uLgorCisuLiBweTpkYXRhOjogU1NMdjJfTUVUSE9ECisuLiBweTpkYXRhOjogU1NMdjNfTUVUSE9ECisuLiBweTpkYXRhOjogU1NMdjIzX01FVEhPRAorLi4gcHk6ZGF0YTo6IFRMU3YxX01FVEhPRAorCisgICAgVGhlc2UgY29uc3RhbnRzIHJlcHJlc2VudCB0aGUgZGlmZmVyZW50IFNTTCBtZXRob2RzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEKKyAgICBjb250ZXh0IG9iamVjdC4KKworCisuLiBweTpkYXRhOjogVkVSSUZZX05PTkUKKy4uIHB5OmRhdGE6OiBWRVJJRllfUEVFUgorLi4gcHk6ZGF0YTo6IFZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVAorCisgICAgVGhlc2UgY29uc3RhbnRzIHJlcHJlc2VudCB0aGUgdmVyaWZpY2F0aW9uIG1vZGUgdXNlZCBieSB0aGUgQ29udGV4dAorICAgIG9iamVjdCdzIDpweTptZXRoOmBzZXRfdmVyaWZ5YCBtZXRob2QuCisKKworLi4gcHk6ZGF0YTo6IEZJTEVUWVBFX1BFTQorLi4gcHk6ZGF0YTo6IEZJTEVUWVBFX0FTTjEKKworICAgIEZpbGUgdHlwZSBjb25zdGFudHMgdXNlZCB3aXRoIHRoZSA6cHk6bWV0aDpgdXNlX2NlcnRpZmljYXRlX2ZpbGVgIGFuZAorICAgIDpweTptZXRoOmB1c2VfcHJpdmF0ZWtleV9maWxlYCBtZXRob2RzIG9mIENvbnRleHQgb2JqZWN0cy4KKworCisuLiBweTpkYXRhOjogT1BfU0lOR0xFX0RIX1VTRQorLi4gcHk6ZGF0YTo6IE9QX0VQSEVNRVJBTF9SU0EKKy4uIHB5OmRhdGE6OiBPUF9OT19TU0x2MgorLi4gcHk6ZGF0YTo6IE9QX05PX1NTTHYzCisuLiBweTpkYXRhOjogT1BfTk9fVExTdjEKKworICAgIENvbnN0YW50cyB1c2VkIHdpdGggOnB5Om1ldGg6YHNldF9vcHRpb25zYCBvZiBDb250ZXh0IG9iamVjdHMuCisKKyAgICA6cHk6Y29uc3Q6YE9QX1NJTkdMRV9ESF9VU0VgIG1lYW5zIHRvIGFsd2F5cyBjcmVhdGUgYSBuZXcga2V5IHdoZW4gdXNpbmcKKyAgICBlcGhlbWVyYWwgRGlmZmllLUhlbGxtYW4uIDpweTpjb25zdDpgT1BfRVBIRU1FUkFMX1JTQWAgbWVhbnMgdG8gYWx3YXlzIHVzZQorICAgIGVwaGVtZXJhbCBSU0Ega2V5cyB3aGVuIGRvaW5nIFJTQSBvcGVyYXRpb25zLiA6cHk6Y29uc3Q6YE9QX05PX1NTTHYyYCwKKyAgICA6cHk6Y29uc3Q6YE9QX05PX1NTTHYzYCBhbmQgOnB5OmNvbnN0OmBPUF9OT19UTFN2MWAgbWVhbnMgdG8gZGlzYWJsZSB0aG9zZQorICAgIHNwZWNpZmljIHByb3RvY29scy4gVGhpcyBpcyBpbnRlcmVzdGluZyBpZiB5b3UncmUgdXNpbmcgZS5nLgorICAgIDpweTpjb25zdDpgU1NMdjIzX01FVEhPRGAgdG8gZ2V0IGFuIFNTTHYyLWNvbXBhdGlibGUgaGFuZHNoYWtlLCBidXQgZG9uJ3Qgd2FudAorICAgIHRvIHVzZSBTU0x2Mi4KKworCisuLiBweTpkYXRhOjogU1NMRUFZX1ZFUlNJT04KKy4uIHB5OmRhdGE6OiBTU0xFQVlfQ0ZMQUdTCisuLiBweTpkYXRhOjogU1NMRUFZX0JVSUxUX09OCisuLiBweTpkYXRhOjogU1NMRUFZX1BMQVRGT1JNCisuLiBweTpkYXRhOjogU1NMRUFZX0RJUgorCisgICAgQ29uc3RhbnRzIHVzZWQgd2l0aCA6cHk6bWV0aDpgU1NMZWF5X3ZlcnNpb25gIHRvIHNwZWNpZnkgd2hhdCBPcGVuU1NMIHZlcnNpb24KKyAgICBpbmZvcm1hdGlvbiB0byByZXRyaWV2ZS4gIFNlZSB0aGUgbWFuIHBhZ2UgZm9yIHRoZSA6cHk6ZnVuYzpgU1NMZWF5X3ZlcnNpb25gIEMKKyAgICBBUEkgZm9yIGRldGFpbHMuCisKKworLi4gcHk6ZGF0YTo6IE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIKKworICAgIEFuIGludGVnZXIgZ2l2aW5nIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgT3BlblNTTCBsaWJyYXJ5IHVzZWQgdG8gYnVpbGQgdGhpcworICAgIHZlcnNpb24gb2YgcHlPcGVuU1NMLiAgU2VlIHRoZSBtYW4gcGFnZSBmb3IgdGhlIDpweTpmdW5jOmBTU0xlYXlfdmVyc2lvbmAgQyBBUEkKKyAgICBmb3IgZGV0YWlscy4KKworCisuLiBweTpmdW5jdGlvbjo6IFNTTGVheV92ZXJzaW9uKHR5cGUpCisKKyAgICBSZXRyaWV2ZSBhIHN0cmluZyBkZXNjcmliaW5nIHNvbWUgYXNwZWN0IG9mIHRoZSB1bmRlcmx5aW5nIE9wZW5TU0wgdmVyc2lvbi4gIFRoZQorICAgIHR5cGUgcGFzc2VkIGluIHNob3VsZCBiZSBvbmUgb2YgdGhlIDpweTpjb25zdDpgU1NMRUFZXypgIGNvbnN0YW50cyBkZWZpbmVkIGluCisgICAgdGhpcyBtb2R1bGUuCisKKworLi4gcHk6ZGF0YTo6IENvbnRleHRUeXBlCisKKyAgICBTZWUgOnB5OmNsYXNzOmBDb250ZXh0YC4KKworCisuLiBweTpjbGFzczo6IENvbnRleHQobWV0aG9kKQorCisgICAgQSBjbGFzcyByZXByZXNlbnRpbmcgU1NMIGNvbnRleHRzLiAgQ29udGV4dHMgZGVmaW5lIHRoZSBwYXJhbWV0ZXJzIG9mIG9uZSBvcgorICAgIG1vcmUgU1NMIGNvbm5lY3Rpb25zLgorCisgICAgKm1ldGhvZCogc2hvdWxkIGJlIDpweTpjb25zdDpgU1NMdjJfTUVUSE9EYCwgOnB5OmNvbnN0OmBTU0x2M19NRVRIT0RgLAorICAgIDpweTpjb25zdDpgU1NMdjIzX01FVEhPRGAgb3IgOnB5OmNvbnN0OmBUTFN2MV9NRVRIT0RgLgorCisKKy4uIHB5OmRhdGE6OiBDb25uZWN0aW9uVHlwZQorCisgICAgU2VlIDpweTpjbGFzczpgQ29ubmVjdGlvbmAuCisKKworLi4gcHk6Y2xhc3M6OiBDb25uZWN0aW9uKGNvbnRleHQsIHNvY2tldCkKKworICAgIEEgY2xhc3MgcmVwcmVzZW50aW5nIFNTTCBjb25uZWN0aW9ucy4KKworICAgICpjb250ZXh0KiBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgOnB5OmNsYXNzOmBDb250ZXh0YCBhbmQgKnNvY2tldCoKKyAgICBzaG91bGQgYmUgYSBzb2NrZXQgWyNjb25uZWN0aW9uLWNvbnRleHQtc29ja2V0XV8gIG9iamVjdC4gICpzb2NrZXQqIG1heSBiZQorICAgICpOb25lKjsgaW4gdGhpcyBjYXNlLCB0aGUgQ29ubmVjdGlvbiBpcyBjcmVhdGVkIHdpdGggYSBtZW1vcnkgQklPOiBzZWUKKyAgICB0aGUgOnB5Om1ldGg6YGJpb19yZWFkYCwgOnB5Om1ldGg6YGJpb193cml0ZWAsIGFuZCA6cHk6bWV0aDpgYmlvX3NodXRkb3duYAorICAgIG1ldGhvZHMuCisKKy4uIHB5OmV4Y2VwdGlvbjo6IEVycm9yCisKKyAgICBUaGlzIGV4Y2VwdGlvbiBpcyB1c2VkIGFzIGEgYmFzZSBjbGFzcyBmb3IgdGhlIG90aGVyIFNTTC1yZWxhdGVkCisgICAgZXhjZXB0aW9ucywgYnV0IG1heSBhbHNvIGJlIHJhaXNlZCBkaXJlY3RseS4KKworICAgIFdoZW5ldmVyIHRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCBkaXJlY3RseSwgaXQgaGFzIGEgbGlzdCBvZiBlcnJvciBtZXNzYWdlcworICAgIGZyb20gdGhlIE9wZW5TU0wgZXJyb3IgcXVldWUsIHdoZXJlIGVhY2ggaXRlbSBpcyBhIHR1cGxlICoobGliLCBmdW5jdGlvbiwKKyAgICByZWFzb24pKi4gSGVyZSAqbGliKiwgKmZ1bmN0aW9uKiBhbmQgKnJlYXNvbiogYXJlIGFsbCBzdHJpbmdzLCBkZXNjcmliaW5nCisgICAgd2hlcmUgYW5kIHdoYXQgdGhlIHByb2JsZW0gaXMuIFNlZSA6bWFucGFnZTpgZXJyKDMpYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCisuLiBweTpleGNlcHRpb246OiBaZXJvUmV0dXJuRXJyb3IKKworICAgIFRoaXMgZXhjZXB0aW9uIG1hdGNoZXMgdGhlIGVycm9yIHJldHVybiBjb2RlCisgICAgOnB5OmRhdGE6YFNTTF9FUlJPUl9aRVJPX1JFVFVSTmAsIGFuZCBpcyByYWlzZWQgd2hlbiB0aGUgU1NMIENvbm5lY3Rpb24gaGFzCisgICAgYmVlbiBjbG9zZWQuIEluIFNTTCAzLjAgYW5kIFRMUyAxLjAsIHRoaXMgb25seSBvY2N1cnMgaWYgYSBjbG9zdXJlIGFsZXJ0IGhhcworICAgIG9jY3VycmVkIGluIHRoZSBwcm90b2NvbCwgaS5lLiAgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkIGNsZWFubHkuIE5vdGUKKyAgICB0aGF0IHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IHRoZSB0cmFuc3BvcnQgbGF5ZXIgKGUuZy4gYSBzb2NrZXQpCisgICAgaGFzIGJlZW4gY2xvc2VkLgorCisgICAgSXQgbWF5IHNlZW0gYSBsaXR0bGUgc3RyYW5nZSB0aGF0IHRoaXMgaXMgYW4gZXhjZXB0aW9uLCBidXQgaXQgZG9lcyBtYXRjaCBhbgorICAgIDpweTpkYXRhOmBTU0xfRVJST1JgIGNvZGUsIGFuZCBpcyB2ZXJ5IGNvbnZlbmllbnQuCisKKworLi4gcHk6ZXhjZXB0aW9uOjogV2FudFJlYWRFcnJvcgorCisgICAgVGhlIG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlOyB0aGUgc2FtZSBJL08gbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4KKyAgICBsYXRlciwgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMuIEFueSBJL08gbWV0aG9kIGNhbiBsZWFkIHRvIHRoaXMgc2luY2UgbmV3CisgICAgaGFuZHNoYWtlcyBjYW4gb2NjdXIgYXQgYW55IHRpbWUuCisKKyAgICBUaGUgd2FudGVkIHJlYWQgaXMgZm9yICoqZGlydHkqKiBkYXRhIHNlbnQgb3ZlciB0aGUgbmV0d29yaywgbm90IHRoZQorICAgICoqY2xlYW4qKiBkYXRhIGluc2lkZSB0aGUgdHVubmVsLiAgRm9yIGEgc29ja2V0IGJhc2VkIFNTTCBjb25uZWN0aW9uLAorICAgICoqcmVhZCoqIG1lYW5zIGRhdGEgY29taW5nIGF0IHVzIG92ZXIgdGhlIG5ldHdvcmsuICBVbnRpbCB0aGF0IHJlYWQKKyAgICBzdWNjZWVkcywgdGhlIGF0dGVtcHRlZCA6cHk6bWV0aDpgT3BlblNTTC5TU0wuQ29ubmVjdGlvbi5yZWN2YCwKKyAgICA6cHk6bWV0aDpgT3BlblNTTC5TU0wuQ29ubmVjdGlvbi5zZW5kYCwgb3IKKyAgICA6cHk6bWV0aDpgT3BlblNTTC5TU0wuQ29ubmVjdGlvbi5kb19oYW5kc2hha2VgIGlzIHByZXZlbnRlZCBvciBpbmNvbXBsZXRlLiBZb3UKKyAgICBwcm9iYWJseSB3YW50IHRvIDpweTptZXRoOmBzZWxlY3QoKWAgb24gdGhlIHNvY2tldCBiZWZvcmUgdHJ5aW5nIGFnYWluLgorCisKKy4uIHB5OmV4Y2VwdGlvbjo6IFdhbnRXcml0ZUVycm9yCisKKyAgICBTZWUgOnB5OmV4YzpgV2FudFJlYWRFcnJvcmAuICBUaGUgc29ja2V0IHNlbmQgYnVmZmVyIG1heSBiZSB0b28gZnVsbCB0bworICAgIHdyaXRlIG1vcmUgZGF0YS4KKworCisuLiBweTpleGNlcHRpb246OiBXYW50WDUwOUxvb2t1cEVycm9yCisKKyAgICBUaGUgb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBhbiBhcHBsaWNhdGlvbiBjYWxsYmFjayBoYXMgYXNrZWQgdG8gYmUKKyAgICBjYWxsZWQgYWdhaW4uIFRoZSBJL08gbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gbGF0ZXIsIHdpdGggdGhlIHNhbWUKKyAgICBhcmd1bWVudHMuCisKKyAgICAuLiBub3RlOjogVGhpcyB3b24ndCBvY2N1ciBpbiB0aGlzIHZlcnNpb24sIGFzIHRoZXJlIGFyZSBubyBzdWNoCisgICAgICAgIGNhbGxiYWNrcyBpbiB0aGlzIHZlcnNpb24uCisKKworLi4gcHk6ZXhjZXB0aW9uOjogU3lzQ2FsbEVycm9yCisKKyAgICBUaGUgOnB5OmV4YzpgU3lzQ2FsbEVycm9yYCBvY2N1cnMgd2hlbiB0aGVyZSdzIGFuIEkvTyBlcnJvciBhbmQgT3BlblNTTCdzCisgICAgZXJyb3IgcXVldWUgZG9lcyBub3QgY29udGFpbiBhbnkgaW5mb3JtYXRpb24uIFRoaXMgY2FuIG1lYW4gdHdvIHRoaW5nczogQW4KKyAgICBlcnJvciBpbiB0aGUgdHJhbnNwb3J0IHByb3RvY29sLCBvciBhbiBlbmQgb2YgZmlsZSB0aGF0IHZpb2xhdGVzIHRoZSBwcm90b2NvbC4KKyAgICBUaGUgcGFyYW1ldGVyIHRvIHRoZSBleGNlcHRpb24gaXMgYWx3YXlzIGEgcGFpciAqKGVycm51bSwKKyAgICBlcnJzdHIpKi4KKworCisKKy4uIF9vcGVuc3NsLWNvbnRleHQ6CisKK0NvbnRleHQgb2JqZWN0cworLS0tLS0tLS0tLS0tLS0tCisKK0NvbnRleHQgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworLi4gOnB5OmNsYXNzOjogT3BlblNTTC5TU0wuQ29udGV4dAorCisuLiBweTptZXRob2Q6OiBDb250ZXh0LmNoZWNrX3ByaXZhdGVrZXkoKQorCisgICAgQ2hlY2sgaWYgdGhlIHByaXZhdGUga2V5IChsb2FkZWQgd2l0aCA6cHk6bWV0aDpgdXNlX3ByaXZhdGVrZXlgKSBtYXRjaGVzIHRoZQorICAgIGNlcnRpZmljYXRlIChsb2FkZWQgd2l0aCA6cHk6bWV0aDpgdXNlX2NlcnRpZmljYXRlYCkuICBSZXR1cm5zCisgICAgOnB5OmRhdGE6YE5vbmVgIGlmIHRoZXkgbWF0Y2gsIHJhaXNlcyA6cHk6ZXhjOmBFcnJvcmAgb3RoZXJ3aXNlLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbnRleHQuZ2V0X2FwcF9kYXRhKCkKKworICAgIFJldHJpZXZlIGFwcGxpY2F0aW9uIGRhdGEgYXMgc2V0IGJ5IDpweTptZXRoOmBzZXRfYXBwX2RhdGFgLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbnRleHQuZ2V0X2NlcnRfc3RvcmUoKQorCisgICAgUmV0cmlldmUgdGhlIGNlcnRpZmljYXRlIHN0b3JlIChhIFg1MDlTdG9yZSBvYmplY3QpIHRoYXQgdGhlIGNvbnRleHQgdXNlcy4KKyAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCAidHJ1c3RlZCIgY2VydGlmaWNhdGVzIHdpdGhvdXQgdXNpbmcgdGhlLgorICAgIDpweTptZXRoOmBsb2FkX3ZlcmlmeV9sb2NhdGlvbnNgIG1ldGhvZC4KKworCisuLiBweTptZXRob2Q6OiBDb250ZXh0LmdldF90aW1lb3V0KCkKKworICAgIFJldHJpZXZlIHNlc3Npb24gdGltZW91dCwgYXMgc2V0IGJ5IDpweTptZXRoOmBzZXRfdGltZW91dGAuIFRoZSBkZWZhdWx0IGlzIDMwMAorICAgIHNlY29uZHMuCisKKworLi4gcHk6bWV0aG9kOjogQ29udGV4dC5nZXRfdmVyaWZ5X2RlcHRoKCkKKworICAgIFJldHJpZXZlIHRoZSBDb250ZXh0IG9iamVjdCdzIHZlcmlmeSBkZXB0aCwgYXMgc2V0IGJ5CisgICAgOnB5Om1ldGg6YHNldF92ZXJpZnlfZGVwdGhgLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbnRleHQuZ2V0X3ZlcmlmeV9tb2RlKCkKKworICAgIFJldHJpZXZlIHRoZSBDb250ZXh0IG9iamVjdCdzIHZlcmlmeSBtb2RlLCBhcyBzZXQgYnkgOnB5Om1ldGg6YHNldF92ZXJpZnlgLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbnRleHQubG9hZF9jbGllbnRfY2EocGVtZmlsZSkKKworICAgIFJlYWQgYSBmaWxlIHdpdGggUEVNLWZvcm1hdHRlZCBjZXJ0aWZpY2F0ZXMgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudAorICAgIHdoZW4gcmVxdWVzdGluZyBhIGNsaWVudCBjZXJ0aWZpY2F0ZS4KKworCisuLiBweTptZXRob2Q6OiBDb250ZXh0LnNldF9jbGllbnRfY2FfbGlzdChjZXJ0aWZpY2F0ZV9hdXRob3JpdGllcykKKworICAgIFJlcGxhY2UgdGhlIGN1cnJlbnQgbGlzdCBvZiBwcmVmZXJyZWQgY2VydGlmaWNhdGUgc2lnbmVycyB0aGF0IHdvdWxkIGJlCisgICAgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gcmVxdWVzdGluZyBhIGNsaWVudCBjZXJ0aWZpY2F0ZSB3aXRoIHRoZQorICAgICpjZXJ0aWZpY2F0ZV9hdXRob3JpdGllcyogc2VxdWVuY2Ugb2YgOnB5OmNsYXNzOmBPcGVuU1NMLmNyeXB0by5YNTA5TmFtZWAncy4KKworICAgIC4uIHZlcnNpb25hZGRlZDo6IDAuMTAKKworCisuLiBweTptZXRob2Q6OiBDb250ZXh0LmFkZF9jbGllbnRfY2EoY2VydGlmaWNhdGVfYXV0aG9yaXR5KQorCisgICAgRXh0cmFjdCBhIDpweTpjbGFzczpgT3BlblNTTC5jcnlwdG8uWDUwOU5hbWVgIGZyb20gdGhlICpjZXJ0aWZpY2F0ZV9hdXRob3JpdHkqCisgICAgOnB5OmNsYXNzOmBPcGVuU1NMLmNyeXB0by5YNTA5YCBjZXJ0aWZpY2F0ZSBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHByZWZlcnJlZAorICAgIGNlcnRpZmljYXRlIHNpZ25lcnMgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gcmVxdWVzdGluZyBhIGNsaWVudCBjZXJ0aWZpY2F0ZS4KKworICAgIC4uIHZlcnNpb25hZGRlZDo6IDAuMTAKKworCisuLiBweTptZXRob2Q6OiBDb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhwZW1maWxlLCBjYXBhdGgpCisKKyAgICBTcGVjaWZ5IHdoZXJlIENBIGNlcnRpZmljYXRlcyBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzIGFyZSBsb2NhdGVkLiBUaGVzZQorICAgIGFyZSB0cnVzdGVkIGNlcnRpZmljYXRlcy4gTm90ZSB0aGF0IHRoZSBjZXJ0aWZpY2F0ZXMgaGF2ZSB0byBiZSBpbiBQRU0KKyAgICBmb3JtYXQuICBJZiBjYXBhdGggaXMgcGFzc2VkLCBpdCBtdXN0IGJlIGEgZGlyZWN0b3J5IHByZXBhcmVkIHVzaW5nIHRoZQorICAgIGBgX3JlaGFzaGBgIHRvb2wgaW5jbHVkZWQgd2l0aCBPcGVuU1NMLiAgRWl0aGVyLCBidXQgbm90IGJvdGgsIG9mCisgICAgKnBlbWZpbGUqIG9yICpjYXBhdGgqIG1heSBiZSA6cHk6ZGF0YTpgTm9uZWAuCisKKworLi4gcHk6bWV0aG9kOjogQ29udGV4dC5zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoKQorCisgICAgU3BlY2lmeSB0aGF0IHRoZSBwbGF0Zm9ybSBwcm92aWRlZCBDQSBjZXJ0aWZpY2F0ZXMgYXJlIHRvIGJlIHVzZWQgZm9yCisgICAgdmVyaWZpY2F0aW9uIHB1cnBvc2VzLiAgVGhpcyBtZXRob2QgbWF5IG5vdCB3b3JrIHByb3Blcmx5IG9uIE9TIFguCisKKworLi4gcHk6bWV0aG9kOjogQ29udGV4dC5sb2FkX3RtcF9kaChkaGZpbGUpCisKKyAgICBMb2FkIHBhcmFtZXRlcnMgZm9yIEVwaGVtZXJhbCBEaWZmaWUtSGVsbG1hbiBmcm9tICpkaGZpbGUqLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbnRleHQuc2V0X2FwcF9kYXRhKGRhdGEpCisKKyAgICBBc3NvY2lhdGUgKmRhdGEqIHdpdGggdGhpcyBDb250ZXh0IG9iamVjdC4gKmRhdGEqIGNhbiBiZSByZXRyaWV2ZWQKKyAgICBsYXRlciB1c2luZyB0aGUgOnB5Om1ldGg6YGdldF9hcHBfZGF0YWAgbWV0aG9kLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbnRleHQuc2V0X2NpcGhlcl9saXN0KGNpcGhlcnMpCisKKyAgICBTZXQgdGhlIGxpc3Qgb2YgY2lwaGVycyB0byBiZSB1c2VkIGluIHRoaXMgY29udGV4dC4gU2VlIHRoZSBPcGVuU1NMIG1hbnVhbCBmb3IKKyAgICBtb3JlIGluZm9ybWF0aW9uIChlLmcuIDptYW5wYWdlOmBjaXBoZXJzKDEpYCkKKworCisuLiBweTptZXRob2Q6OiBDb250ZXh0LnNldF9pbmZvX2NhbGxiYWNrKGNhbGxiYWNrKQorCisgICAgU2V0IHRoZSBpbmZvcm1hdGlvbiBjYWxsYmFjayB0byAqY2FsbGJhY2sqLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisgICAgZnJvbSB0aW1lIHRvIHRpbWUgZHVyaW5nIFNTTCBoYW5kc2hha2VzLgorCisgICAgKmNhbGxiYWNrKiBzaG91bGQgdGFrZSB0aHJlZSBhcmd1bWVudHM6IGEgQ29ubmVjdGlvbiBvYmplY3QgYW5kIHR3bworICAgIGludGVnZXJzLiBUaGUgZmlyc3QgaW50ZWdlciBzcGVjaWZpZXMgd2hlcmUgaW4gdGhlIFNTTCBoYW5kc2hha2UgdGhlIGZ1bmN0aW9uCisgICAgd2FzIGNhbGxlZCwgYW5kIHRoZSBvdGhlciB0aGUgcmV0dXJuIGNvZGUgZnJvbSBhIChwb3NzaWJseSBmYWlsZWQpIGludGVybmFsCisgICAgZnVuY3Rpb24gY2FsbC4KKworCisuLiBweTptZXRob2Q6OiBDb250ZXh0LnNldF9vcHRpb25zKG9wdGlvbnMpCisKKyAgICBBZGQgU1NMIG9wdGlvbnMuIE9wdGlvbnMgeW91IGhhdmUgc2V0IGJlZm9yZSBhcmUgbm90IGNsZWFyZWQhCisgICAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGUgOnB5OmNvbnN0OmBPUF8qYCBjb25zdGFudHMuCisKKworLi4gcHk6bWV0aG9kOjogQ29udGV4dC5zZXRfcGFzc3dkX2NiKGNhbGxiYWNrWywgdXNlcmRhdGFdKQorCisgICAgU2V0IHRoZSBwYXNzcGhyYXNlIGNhbGxiYWNrIHRvICpjYWxsYmFjayouIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKyAgICB3aGVuIGEgcHJpdmF0ZSBrZXkgd2l0aCBhIHBhc3NwaHJhc2UgaXMgbG9hZGVkLiAqY2FsbGJhY2sqIG11c3QgYWNjZXB0CisgICAgdGhyZWUgcG9zaXRpb25hbCBhcmd1bWVudHMuICBGaXJzdCwgYW4gaW50ZWdlciBnaXZpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mCisgICAgdGhlIHBhc3NwaHJhc2UgaXQgbWF5IHJldHVybi4gIElmIHRoZSByZXR1cm5lZCBwYXNzcGhyYXNlIGlzIGxvbmdlciB0aGFuCisgICAgdGhpcywgaXQgd2lsbCBiZSB0cnVuY2F0ZWQuICBTZWNvbmQsIGEgYm9vbGVhbiB2YWx1ZSB3aGljaCB3aWxsIGJlIHRydWUgaWYKKyAgICB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgZm9yIHRoZSBwYXNzcGhyYXNlIHR3aWNlIGFuZCB0aGUgY2FsbGJhY2sgc2hvdWxkCisgICAgdmVyaWZ5IHRoYXQgdGhlIHR3byB2YWx1ZXMgc3VwcGxpZWQgYXJlIGVxdWFsLiBUaGlyZCwgdGhlIHZhbHVlIGdpdmVuIGFzIHRoZQorICAgICp1c2VyZGF0YSogcGFyYW1ldGVyIHRvIDpweTptZXRoOmBzZXRfcGFzc3dkX2NiYC4gIElmIGFuIGVycm9yIG9jY3VycywKKyAgICAqY2FsbGJhY2sqIHNob3VsZCByZXR1cm4gYSBmYWxzZSB2YWx1ZSAoZS5nLiBhbiBlbXB0eSBzdHJpbmcpLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbnRleHQuc2V0X3Nlc3Npb25faWQobmFtZSkKKworICAgIFNldCB0aGUgY29udGV4dCAqbmFtZSogd2l0aGluIHdoaWNoIGEgc2Vzc2lvbiBjYW4gYmUgcmV1c2VkIGZvciB0aGlzCisgICAgQ29udGV4dCBvYmplY3QuIFRoaXMgaXMgbmVlZGVkIHdoZW4gZG9pbmcgc2Vzc2lvbiByZXN1bXB0aW9uLCBiZWNhdXNlIHRoZXJlIGlzCisgICAgbm8gd2F5IGZvciBhIHN0b3JlZCBzZXNzaW9uIHRvIGtub3cgd2hpY2ggQ29udGV4dCBvYmplY3QgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgICpuYW1lKiBtYXkgYmUgYW55IGJpbmFyeSBkYXRhLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbnRleHQuc2V0X3RpbWVvdXQodGltZW91dCkKKworICAgIFNldCB0aGUgdGltZW91dCBmb3IgbmV3bHkgY3JlYXRlZCBzZXNzaW9ucyBmb3IgdGhpcyBDb250ZXh0IG9iamVjdCB0bworICAgICp0aW1lb3V0Ki4gKnRpbWVvdXQqIG11c3QgYmUgZ2l2ZW4gaW4gKHdob2xlKSBzZWNvbmRzLiBUaGUgZGVmYXVsdAorICAgIHZhbHVlIGlzIDMwMCBzZWNvbmRzLiBTZWUgdGhlIE9wZW5TU0wgbWFudWFsIGZvciBtb3JlIGluZm9ybWF0aW9uIChlLmcuCisgICAgOm1hbnBhZ2U6YFNTTF9DVFhfc2V0X3RpbWVvdXQoMylgKS4KKworCisuLiBweTptZXRob2Q6OiBDb250ZXh0LnNldF92ZXJpZnkobW9kZSwgY2FsbGJhY2spCisKKyAgICBTZXQgdGhlIHZlcmlmaWNhdGlvbiBmbGFncyBmb3IgdGhpcyBDb250ZXh0IG9iamVjdCB0byAqbW9kZSogYW5kIHNwZWNpZnkKKyAgICB0aGF0ICpjYWxsYmFjayogc2hvdWxkIGJlIHVzZWQgZm9yIHZlcmlmaWNhdGlvbiBjYWxsYmFja3MuICptb2RlKiBzaG91bGQgYmUKKyAgICBvbmUgb2YgOnB5OmNvbnN0OmBWRVJJRllfTk9ORWAgYW5kIDpweTpjb25zdDpgVkVSSUZZX1BFRVJgLiBJZgorICAgIDpweTpjb25zdDpgVkVSSUZZX1BFRVJgIGlzIHVzZWQsICptb2RlKiBjYW4gYmUgT1I6ZWQgd2l0aAorICAgIDpweTpjb25zdDpgVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUYCBhbmQgOnB5OmNvbnN0OmBWRVJJRllfQ0xJRU5UX09OQ0VgCisgICAgdG8gZnVydGhlciBjb250cm9sIHRoZSBiZWhhdmlvdXIuCisKKyAgICAqY2FsbGJhY2sqIHNob3VsZCB0YWtlIGZpdmUgYXJndW1lbnRzOiBBIENvbm5lY3Rpb24gb2JqZWN0LCBhbiBYNTA5IG9iamVjdCwKKyAgICBhbmQgdGhyZWUgaW50ZWdlciB2YXJpYWJsZXMsIHdoaWNoIGFyZSBpbiB0dXJuIHBvdGVudGlhbCBlcnJvciBudW1iZXIsIGVycm9yCisgICAgZGVwdGggYW5kIHJldHVybiBjb2RlLiAqY2FsbGJhY2sqIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB2ZXJpZmljYXRpb24gcGFzc2VzCisgICAgYW5kIGZhbHNlIG90aGVyd2lzZS4KKworCisuLiBweTptZXRob2Q6OiBDb250ZXh0LnNldF92ZXJpZnlfZGVwdGgoZGVwdGgpCisKKyAgICBTZXQgdGhlIG1heGltdW0gZGVwdGggZm9yIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB2ZXJpZmljYXRpb24gdGhhdCBzaGFsbCBiZQorICAgIGFsbG93ZWQgZm9yIHRoaXMgQ29udGV4dCBvYmplY3QuCisKKworLi4gcHk6bWV0aG9kOjogQ29udGV4dC51c2VfY2VydGlmaWNhdGUoY2VydCkKKworICAgIFVzZSB0aGUgY2VydGlmaWNhdGUgKmNlcnQqIHdoaWNoIGhhcyB0byBiZSBhIFg1MDkgb2JqZWN0LgorCisKKy4uIHB5Om1ldGhvZDo6IENvbnRleHQuYWRkX2V4dHJhX2NoYWluX2NlcnQoY2VydCkKKworICAgIEFkZHMgdGhlIGNlcnRpZmljYXRlICpjZXJ0Kiwgd2hpY2ggaGFzIHRvIGJlIGEgWDUwOSBvYmplY3QsIHRvIHRoZQorICAgIGNlcnRpZmljYXRlIGNoYWluIHByZXNlbnRlZCB0b2dldGhlciB3aXRoIHRoZSBjZXJ0aWZpY2F0ZS4KKworCisuLiBweTptZXRob2Q6OiBDb250ZXh0LnVzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKGZpbGUpCisKKyAgICBMb2FkIGEgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSAqZmlsZSogd2hpY2ggbXVzdCBiZSBQRU0gZW5jb2RlZC4KKworCisuLiBweTptZXRob2Q6OiBDb250ZXh0LnVzZV9wcml2YXRla2V5KHBrZXkpCisKKyAgICBVc2UgdGhlIHByaXZhdGUga2V5ICpwa2V5KiB3aGljaCBoYXMgdG8gYmUgYSBQS2V5IG9iamVjdC4KKworCisuLiBweTptZXRob2Q6OiBDb250ZXh0LnVzZV9jZXJ0aWZpY2F0ZV9maWxlKGZpbGVbLCBmb3JtYXRdKQorCisgICAgTG9hZCB0aGUgZmlyc3QgY2VydGlmaWNhdGUgZm91bmQgaW4gKmZpbGUqLiBUaGUgY2VydGlmaWNhdGUgbXVzdCBiZSBpbiB0aGUKKyAgICBmb3JtYXQgc3BlY2lmaWVkIGJ5ICpmb3JtYXQqLCB3aGljaCBpcyBlaXRoZXIgOnB5OmNvbnN0OmBGSUxFVFlQRV9QRU1gIG9yCisgICAgOnB5OmNvbnN0OmBGSUxFVFlQRV9BU04xYC4gVGhlIGRlZmF1bHQgaXMgOnB5OmNvbnN0OmBGSUxFVFlQRV9QRU1gLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbnRleHQudXNlX3ByaXZhdGVrZXlfZmlsZShmaWxlWywgZm9ybWF0XSkKKworICAgIExvYWQgdGhlIGZpcnN0IHByaXZhdGUga2V5IGZvdW5kIGluICpmaWxlKi4gVGhlIHByaXZhdGUga2V5IG11c3QgYmUgaW4gdGhlCisgICAgZm9ybWF0IHNwZWNpZmllZCBieSAqZm9ybWF0Kiwgd2hpY2ggaXMgZWl0aGVyIDpweTpjb25zdDpgRklMRVRZUEVfUEVNYCBvcgorICAgIDpweTpjb25zdDpgRklMRVRZUEVfQVNOMWAuIFRoZSBkZWZhdWx0IGlzIDpweTpjb25zdDpgRklMRVRZUEVfUEVNYC4KKworCisuLiBweTptZXRob2Q6OiBDb250ZXh0LnNldF90bHNleHRfc2VydmVybmFtZV9jYWxsYmFjayhjYWxsYmFjaykKKworICAgIFNwZWNpZnkgYSBvbmUtYXJndW1lbnQgY2FsbGFibGUgdG8gdXNlIGFzIHRoZSBUTFMgZXh0ZW5zaW9uIHNlcnZlciBuYW1lCisgICAgY2FsbGJhY2suICBXaGVuIGEgY29ubmVjdGlvbiB1c2luZyB0aGUgc2VydmVyIG5hbWUgZXh0ZW5zaW9uIGlzIG1hZGUgdXNpbmcgdGhpcworICAgIGNvbnRleHQsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgXGNvZGV7Q29ubmVjdGlvbn0gaW5zdGFuY2UuCisKKyAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAwLjEzCisKKworLi4gX29wZW5zc2wtY29ubmVjdGlvbjoKKworQ29ubmVjdGlvbiBvYmplY3RzCistLS0tLS0tLS0tLS0tLS0tLS0KKworQ29ubmVjdGlvbiBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLmFjY2VwdCgpCisKKyAgICBDYWxsIHRoZSA6cHk6bWV0aDpgYWNjZXB0YCBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0IGFuZCBzZXQgdXAgU1NMIG9uIHRoZQorICAgIHJldHVybmVkIHNvY2tldCwgdXNpbmcgdGhlIENvbnRleHQgb2JqZWN0IHN1cHBsaWVkIHRvIHRoaXMgQ29ubmVjdGlvbiBvYmplY3QgYXQKKyAgICBjcmVhdGlvbi4gUmV0dXJucyBhIHBhaXIgKihjb25uLCBhZGRyZXNzKSouIHdoZXJlICpjb25uKiBpcyB0aGUgbmV3CisgICAgQ29ubmVjdGlvbiBvYmplY3QgY3JlYXRlZCwgYW5kICphZGRyZXNzKiBpcyBhcyByZXR1cm5lZCBieSB0aGUgc29ja2V0J3MKKyAgICA6cHk6bWV0aDpgYWNjZXB0YC4KKworCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLmJpbmQoYWRkcmVzcykKKworICAgIENhbGwgdGhlIDpweTptZXRoOmBiaW5kYCBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uY2xvc2UoKQorCisgICAgQ2FsbCB0aGUgOnB5Om1ldGg6YGNsb3NlYCBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LiBOb3RlOiBJZiB5b3Ugd2FudAorICAgIGNvcnJlY3QgU1NMIGNsb3N1cmUsIHlvdSBuZWVkIHRvIGNhbGwgdGhlIDpweTptZXRoOmBzaHV0ZG93bmAgbWV0aG9kIGZpcnN0LgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uY29ubmVjdChhZGRyZXNzKQorCisgICAgQ2FsbCB0aGUgOnB5Om1ldGg6YGNvbm5lY3RgIG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQgYW5kIHNldCB1cCBTU0wgb24gdGhlCisgICAgc29ja2V0LCB1c2luZyB0aGUgQ29udGV4dCBvYmplY3Qgc3VwcGxpZWQgdG8gdGhpcyBDb25uZWN0aW9uIG9iamVjdCBhdAorICAgIGNyZWF0aW9uLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uY29ubmVjdF9leChhZGRyZXNzKQorCisgICAgQ2FsbCB0aGUgOnB5Om1ldGg6YGNvbm5lY3RfZXhgIG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQgYW5kIHNldCB1cCBTU0wgb24KKyAgICB0aGUgc29ja2V0LCB1c2luZyB0aGUgQ29udGV4dCBvYmplY3Qgc3VwcGxpZWQgdG8gdGhpcyBDb25uZWN0aW9uIG9iamVjdCBhdAorICAgIGNyZWF0aW9uLiBOb3RlIHRoYXQgaWYgdGhlIDpweTptZXRoOmBjb25uZWN0X2V4YCBtZXRob2Qgb2YgdGhlIHNvY2tldCBkb2Vzbid0CisgICAgcmV0dXJuIDAsIFNTTCB3b24ndCBiZSBpbml0aWFsaXplZC4KKworCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLmRvX2hhbmRzaGFrZSgpCisKKyAgICBQZXJmb3JtIGFuIFNTTCBoYW5kc2hha2UgKHVzdWFsbHkgY2FsbGVkIGFmdGVyIDpweTptZXRoOmByZW5lZ290aWF0ZWAgb3Igb25lIG9mCisgICAgOnB5Om1ldGg6YHNldF9hY2NlcHRfc3RhdGVgIG9yIDpweTptZXRoOmBzZXRfYWNjZXB0X3N0YXRlYCkuIFRoaXMgY2FuIHJhaXNlIHRoZQorICAgIHNhbWUgZXhjZXB0aW9ucyBhcyA6cHk6bWV0aDpgc2VuZGAgYW5kIDpweTptZXRoOmByZWN2YC4KKworCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLmZpbGVubygpCisKKyAgICBSZXRyaWV2ZSB0aGUgZmlsZSBkZXNjcmlwdG9yIG51bWJlciBmb3IgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24ubGlzdGVuKGJhY2tsb2cpCisKKyAgICBDYWxsIHRoZSA6cHk6bWV0aDpgbGlzdGVuYCBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uZ2V0X2FwcF9kYXRhKCkKKworICAgIFJldHJpZXZlIGFwcGxpY2F0aW9uIGRhdGEgYXMgc2V0IGJ5IDpweTptZXRoOmBzZXRfYXBwX2RhdGFgLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uZ2V0X2NpcGhlcl9saXN0KCkKKworICAgIFJldHJpZXZlIHRoZSBsaXN0IG9mIGNpcGhlcnMgdXNlZCBieSB0aGUgQ29ubmVjdGlvbiBvYmplY3QuIFdBUk5JTkc6IFRoaXMgQVBJCisgICAgaGFzIGNoYW5nZWQuIEl0IHVzZWQgdG8gdGFrZSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgYW5kIGp1c3QgcmV0dXJuIGEgc3RyaW5nLAorICAgIGJ1dCBub3QgaXQgcmV0dXJucyB0aGUgZW50aXJlIGxpc3QgaW4gb25lIGdvLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uZ2V0X2NsaWVudF9jYV9saXN0KCkKKworICAgIFJldHJpZXZlIHRoZSBsaXN0IG9mIHByZWZlcnJlZCBjbGllbnQgY2VydGlmaWNhdGUgaXNzdWVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIKKyAgICBhcyA6cHk6Y2xhc3M6YE9wZW5TU0wuY3J5cHRvLlg1MDlOYW1lYCBvYmplY3RzLgorCisgICAgSWYgdGhpcyBpcyBhIGNsaWVudCA6cHk6Y2xhc3M6YENvbm5lY3Rpb25gLCB0aGUgbGlzdCB3aWxsIGJlIGVtcHR5IHVudGlsIHRoZQorICAgIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmVyIGlzIGVzdGFibGlzaGVkLgorCisgICAgSWYgdGhpcyBpcyBhIHNlcnZlciA6cHk6Y2xhc3M6YENvbm5lY3Rpb25gLCByZXR1cm4gdGhlIGxpc3Qgb2YgY2VydGlmaWNhdGUKKyAgICBhdXRob3JpdGllcyB0aGF0IHdpbGwgYmUgc2VudCBvciBoYXMgYmVlbiBzZW50IHRvIHRoZSBjbGllbnQsIGFzIGNvbnRyb2xsZWQKKyAgICBieSB0aGlzIDpweTpjbGFzczpgQ29ubmVjdGlvbmAncyA6cHk6Y2xhc3M6YENvbnRleHRgLgorCisgICAgLi4gdmVyc2lvbmFkZGVkOjogMC4xMAorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uZ2V0X2NvbnRleHQoKQorCisgICAgUmV0cmlldmUgdGhlIENvbnRleHQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbm5lY3Rpb24uCisKKworLi4gcHk6bWV0aG9kOjogQ29ubmVjdGlvbi5zZXRfY29udGV4dChjb250ZXh0KQorCisgICAgU3BlY2lmeSBhIHJlcGxhY2VtZW50IENvbnRleHQgb2JqZWN0IGZvciB0aGlzIENvbm5lY3Rpb24uCisKKworLi4gcHk6bWV0aG9kOjogQ29ubmVjdGlvbi5nZXRfcGVlcl9jZXJ0aWZpY2F0ZSgpCisKKyAgICBSZXRyaWV2ZSB0aGUgb3RoZXIgc2lkZSdzIGNlcnRpZmljYXRlIChpZiBhbnkpCisKKworLi4gcHk6bWV0aG9kOjogQ29ubmVjdGlvbi5nZXRfcGVlcl9jZXJ0X2NoYWluKCkKKworICAgIFJldHJpZXZlIHRoZSB0dXBsZSBvZiB0aGUgb3RoZXIgc2lkZSdzIGNlcnRpZmljYXRlIGNoYWluIChpZiBhbnkpCisKKworLi4gcHk6bWV0aG9kOjogQ29ubmVjdGlvbi5nZXRwZWVybmFtZSgpCisKKyAgICBDYWxsIHRoZSA6cHk6bWV0aDpgZ2V0cGVlcm5hbWVgIG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisKKworLi4gcHk6bWV0aG9kOjogQ29ubmVjdGlvbi5nZXRzb2NrbmFtZSgpCisKKyAgICBDYWxsIHRoZSA6cHk6bWV0aDpgZ2V0c29ja25hbWVgIG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisKKworLi4gcHk6bWV0aG9kOjogQ29ubmVjdGlvbi5nZXRzb2Nrb3B0KGxldmVsLCBvcHRuYW1lWywgYnVmbGVuXSkKKworICAgIENhbGwgdGhlIDpweTptZXRoOmBnZXRzb2Nrb3B0YCBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24ucGVuZGluZygpCisKKyAgICBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHNhZmVseSByZWFkIGZyb20gdGhlIFNTTCBidWZmZXIKKyAgICAoKipub3QqKiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgYnVmZmVyKS4KKworCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLnJlY3YoYnVmc2l6ZSkKKworICAgIFJlY2VpdmUgZGF0YSBmcm9tIHRoZSBDb25uZWN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUKKyAgICBkYXRhIHJlY2VpdmVkLiBUaGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZCBhdCBvbmNlLCBpcyBzcGVjaWZpZWQKKyAgICBieSAqYnVmc2l6ZSouCisKKworLi4gcHk6bWV0aG9kOjogQ29ubmVjdGlvbi5iaW9fd3JpdGUoYnl0ZXMpCisKKyAgICBJZiB0aGUgQ29ubmVjdGlvbiB3YXMgY3JlYXRlZCB3aXRoIGEgbWVtb3J5IEJJTywgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gYWRkCisgICAgYnl0ZXMgdG8gdGhlIHJlYWQgZW5kIG9mIHRoYXQgbWVtb3J5IEJJTy4gIFRoZSBDb25uZWN0aW9uIGNhbiB0aGVuIHJlYWQgdGhlCisgICAgYnl0ZXMgKGZvciBleGFtcGxlLCBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gOnB5Om1ldGg6YHJlY3ZgKS4KKworCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLnJlbmVnb3RpYXRlKCkKKworICAgIFJlbmVnb3RpYXRlIHRoZSBTU0wgc2Vzc2lvbi4gQ2FsbCB0aGlzIGlmIHlvdSB3aXNoIHRvIGNoYW5nZSBjaXBoZXIgc3VpdGVzIG9yCisgICAgYW55dGhpbmcgbGlrZSB0aGF0LgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uc2VuZChzdHJpbmcpCisKKyAgICBTZW5kIHRoZSAqc3RyaW5nKiBkYXRhIHRvIHRoZSBDb25uZWN0aW9uLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uYmlvX3JlYWQoYnVmc2l6ZSkKKworICAgIElmIHRoZSBDb25uZWN0aW9uIHdhcyBjcmVhdGVkIHdpdGggYSBtZW1vcnkgQklPLCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0bworICAgIHJlYWQgYnl0ZXMgZnJvbSB0aGUgd3JpdGUgZW5kIG9mIHRoYXQgbWVtb3J5IEJJTy4gIE1hbnkgQ29ubmVjdGlvbiBtZXRob2RzIHdpbGwKKyAgICBhZGQgYnl0ZXMgd2hpY2ggbXVzdCBiZSByZWFkIGluIHRoaXMgbWFubmVyIG9yIHRoZSBidWZmZXIgd2lsbCBldmVudHVhbGx5IGZpbGwKKyAgICB1cCBhbmQgdGhlIENvbm5lY3Rpb24gd2lsbCBiZSBhYmxlIHRvIHRha2Ugbm8gZnVydGhlciBhY3Rpb25zLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uc2VuZGFsbChzdHJpbmcpCisKKyAgICBTZW5kIGFsbCBvZiB0aGUgKnN0cmluZyogZGF0YSB0byB0aGUgQ29ubmVjdGlvbi4gVGhpcyBjYWxscyA6cHk6bWV0aDpgc2VuZGAKKyAgICByZXBlYXRlZGx5IHVudGlsIGFsbCBkYXRhIGlzIHNlbnQuIElmIGFuIGVycm9yIG9jY3VycywgaXQncyBpbXBvc3NpYmxlIHRvIHRlbGwKKyAgICBob3cgbXVjaCBkYXRhIGhhcyBiZWVuIHNlbnQuCisKKworLi4gcHk6bWV0aG9kOjogQ29ubmVjdGlvbi5zZXRfYWNjZXB0X3N0YXRlKCkKKworICAgIFNldCB0aGUgY29ubmVjdGlvbiB0byB3b3JrIGluIHNlcnZlciBtb2RlLiBUaGUgaGFuZHNoYWtlIHdpbGwgYmUgaGFuZGxlZAorICAgIGF1dG9tYXRpY2FsbHkgYnkgcmVhZC93cml0ZS4KKworCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLnNldF9hcHBfZGF0YShkYXRhKQorCisgICAgQXNzb2NpYXRlICpkYXRhKiB3aXRoIHRoaXMgQ29ubmVjdGlvbiBvYmplY3QuICpkYXRhKiBjYW4gYmUgcmV0cmlldmVkCisgICAgbGF0ZXIgdXNpbmcgdGhlIDpweTptZXRoOmBnZXRfYXBwX2RhdGFgIG1ldGhvZC4KKworCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLnNldF9jb25uZWN0X3N0YXRlKCkKKworICAgIFNldCB0aGUgY29ubmVjdGlvbiB0byB3b3JrIGluIGNsaWVudCBtb2RlLiBUaGUgaGFuZHNoYWtlIHdpbGwgYmUgaGFuZGxlZAorICAgIGF1dG9tYXRpY2FsbHkgYnkgcmVhZC93cml0ZS4KKworCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLnNldGJsb2NraW5nKGZsYWcpCisKKyAgICBDYWxsIHRoZSA6cHk6bWV0aDpgc2V0YmxvY2tpbmdgIG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisKKworLi4gcHk6bWV0aG9kOjogQ29ubmVjdGlvbi5zZXRzb2Nrb3B0KGxldmVsLCBvcHRuYW1lLCB2YWx1ZSkKKworICAgIENhbGwgdGhlIDpweTptZXRoOmBzZXRzb2Nrb3B0YCBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uc2h1dGRvd24oKQorCisgICAgU2VuZCB0aGUgc2h1dGRvd24gbWVzc2FnZSB0byB0aGUgQ29ubmVjdGlvbi4gUmV0dXJucyB0cnVlIGlmIHRoZSBzaHV0ZG93bgorICAgIG1lc3NhZ2UgZXhjaGFuZ2UgaXMgY29tcGxldGVkIGFuZCBmYWxzZSBvdGhlcndpc2UgKGluIHdoaWNoIGNhc2UgeW91IGNhbGwKKyAgICA6cHk6bWV0aDpgcmVjdmAgb3IgOnB5Om1ldGg6YHNlbmRgIHdoZW4gdGhlIGNvbm5lY3Rpb24gYmVjb21lcworICAgIHJlYWRhYmxlL3dyaXRlYWJsZS4KKworCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLmdldF9zaHV0ZG93bigpCisKKyAgICBHZXQgdGhlIHNodXRkb3duIHN0YXRlIG9mIHRoZSBDb25uZWN0aW9uLiAgUmV0dXJucyBhIGJpdHZlY3RvciBvZiBlaXRoZXIgb3IKKyAgICBib3RoIG9mICpTRU5UX1NIVVRET1dOKiBhbmQgKlJFQ0VJVkVEX1NIVVRET1dOKi4KKworCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLnNldF9zaHV0ZG93bihzdGF0ZSkKKworICAgIFNldCB0aGUgc2h1dGRvd24gc3RhdGUgb2YgdGhlIENvbm5lY3Rpb24uICAqc3RhdGUqIGlzIGEgYml0dmVjdG9yIG9mCisgICAgZWl0aGVyIG9yIGJvdGggb2YgKlNFTlRfU0hVVERPV04qIGFuZCAqUkVDRUlWRURfU0hVVERPV04qLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uc29ja19zaHV0ZG93bihob3cpCisKKyAgICBDYWxsIHRoZSA6cHk6bWV0aDpgc2h1dGRvd25gIG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisKKworLi4gcHk6bWV0aG9kOjogQ29ubmVjdGlvbi5iaW9fc2h1dGRvd24oKQorCisgICAgSWYgdGhlIENvbm5lY3Rpb24gd2FzIGNyZWF0ZWQgd2l0aCBhIG1lbW9yeSBCSU8sIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvCisgICAgaW5kaWNhdGUgdGhhdCAqZW5kIG9mIGZpbGUqIGhhcyBiZWVuIHJlYWNoZWQgb24gdGhlIHJlYWQgZW5kIG9mIHRoYXQgbWVtb3J5CisgICAgQklPLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uc3RhdGVfc3RyaW5nKCkKKworICAgIFJldHJpZXZlIGEgdmVyYm9zZSBzdHJpbmcgZGV0YWlsaW5nIHRoZSBzdGF0ZSBvZiB0aGUgQ29ubmVjdGlvbi4KKworCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLmNsaWVudF9yYW5kb20oKQorCisgICAgUmV0cmlldmUgdGhlIHJhbmRvbSB2YWx1ZSB1c2VkIHdpdGggdGhlIGNsaWVudCBoZWxsbyBtZXNzYWdlLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uc2VydmVyX3JhbmRvbSgpCisKKyAgICBSZXRyaWV2ZSB0aGUgcmFuZG9tIHZhbHVlIHVzZWQgd2l0aCB0aGUgc2VydmVyIGhlbGxvIG1lc3NhZ2UuCisKKworLi4gcHk6bWV0aG9kOjogQ29ubmVjdGlvbi5tYXN0ZXJfa2V5KCkKKworICAgIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgbWFzdGVyIGtleSBmb3IgdGhpcyBzZXNzaW9uLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24ud2FudF9yZWFkKCkKKworICAgIENoZWNrcyBpZiBtb3JlIGRhdGEgaGFzIHRvIGJlIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyIHRvIGNvbXBsZXRlIGFuCisgICAgb3BlcmF0aW9uLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24ud2FudF93cml0ZSgpCisKKyAgICBDaGVja3MgaWYgdGhlcmUgaXMgZGF0YSB0byB3cml0ZSB0byB0aGUgdHJhbnNwb3J0IGxheWVyIHRvIGNvbXBsZXRlIGFuCisgICAgb3BlcmF0aW9uLgorCisKKy4uIHB5Om1ldGhvZDo6IENvbm5lY3Rpb24uc2V0X3Rsc2V4dF9ob3N0X25hbWUobmFtZSkKKworICAgIFNwZWNpZnkgdGhlIGJ5dGUgc3RyaW5nIHRvIHNlbmQgYXMgdGhlIHNlcnZlciBuYW1lIGluIHRoZSBjbGllbnQgaGVsbG8gbWVzc2FnZS4KKworICAgIC4uIHZlcnNpb25hZGRlZDo6IDAuMTMKKworCisuLiBweTptZXRob2Q6OiBDb25uZWN0aW9uLmdldF9zZXJ2ZXJuYW1lKCkKKworICAgIEdldCB0aGUgdmFsdWUgb2YgdGhlIHNlcnZlciBuYW1lIHJlY2VpdmVkIGluIHRoZSBjbGllbnQgaGVsbG8gbWVzc2FnZS4KKworICAgIC4uIHZlcnNpb25hZGRlZDo6IDAuMTMKKworCisuLiBbI2Nvbm5lY3Rpb24tY29udGV4dC1zb2NrZXRdIEFjdHVhbGx5LCBhbGwgdGhhdCBpcyByZXF1aXJlZCBpcyBhbiBvYmplY3QgdGhhdAorICAgICoqYmVoYXZlcyoqIGxpa2UgYSBzb2NrZXQsIHlvdSBjb3VsZCBldmVuIHVzZSBmaWxlcywgZXZlbiB0aG91Z2ggaXQnZCBiZQorICAgIHRyaWNreSB0byBnZXQgdGhlIGhhbmRzaGFrZXMgcmlnaHQhCmRpZmYgLS1naXQgYS9kb2MvaW5kZXgucnN0IGIvZG9jL2luZGV4LnJzdAppbmRleCBiOWM4MGNmLi44ZjFkMzM2IDEwMDY0NAotLS0gYS9kb2MvaW5kZXgucnN0CisrKyBiL2RvYy9pbmRleC5yc3QKQEAgLTEzLDcgKzEzLDcgQEAKIENvbnRlbnRzOgogCiAuLiB0b2N0cmVlOjoKLSAgIDptYXhkZXB0aDogMgorICAgOm1heGRlcHRoOiAzCiAKICAgIGludHJvZHVjdGlvbgogICAgaW5zdGFsbApkaWZmIC0tZ2l0IGEvb2xkLWRvYy9weU9wZW5TU0wudGV4IGIvb2xkLWRvYy9weU9wZW5TU0wudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzRjYjcwLi4wMDAwMDAwCi0tLSBhL29sZC1kb2MvcHlPcGVuU1NMLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDEyNTYgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtPcGVuU1NMfSAtLS0gUHl0aG9uIGludGVyZmFjZSB0byBPcGVuU1NMIFxsYWJlbHtvcGVuc3NsfX0KLQotXGRlY2xhcmVtb2R1bGV7ZXh0ZW5zaW9ufXtPcGVuU1NMfQotXG1vZHVsZXN5bm9wc2lze1B5dGhvbiBpbnRlcmZhY2UgdG8gT3BlblNTTH0KLQotVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgaGlnaC1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIGZ1bmN0aW9ucyBpbiB0aGUKLU9wZW5TU0wgbGlicmFyeS4gVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBkZWZpbmVkOgotCi1cYmVnaW57ZGF0YWRlc2N9e2NyeXB0b30KLUdlbmVyaWMgY3J5cHRvZ3JhcGhpYyBtb2R1bGUuIE5vdGUgdGhhdCBpZiBhbnl0aGluZyBpcyBpbmNvbXBsZXRlLCB0aGlzIG1vZHVsZSBpcyEKLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317cmFuZH0KLUFuIGludGVyZmFjZSB0byB0aGUgT3BlblNTTCBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1NTTH0KLUFuIGludGVyZmFjZSB0byB0aGUgU1NMLXNwZWNpZmljIHBhcnRzIG9mIE9wZW5TU0wuCi1cZW5ke2RhdGFkZXNjfQotCi0KLSUgJSAlIGNyeXB0byBtb2R1bGVPcGVuU1NMCi0KLVxzdWJzZWN0aW9ue1xtb2R1bGV7Y3J5cHRvfSAtLS0gR2VuZXJpYyBjcnlwdG9ncmFwaGljIG1vZHVsZSBcbGFiZWx7b3BlbnNzbC1jcnlwdG99fQotCi1cZGVjbGFyZW1vZHVsZXtleHRlbnNpb259e2NyeXB0b30KLVxtb2R1bGVzeW5vcHNpc3tHZW5lcmljIGNyeXB0b2dyYXBoaWMgbW9kdWxlfQotCi1cYmVnaW57ZGF0YWRlc2N9e1g1MDlUeXBlfQotU2VlIFxjbGFzc3tYNTA5fS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1g1MDl9e30KLUEgY2xhc3MgcmVwcmVzZW50aW5nIFguNTA5IGNlcnRpZmljYXRlcy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1g1MDlOYW1lVHlwZX0KLVNlZSBcY2xhc3N7WDUwOU5hbWV9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317WDUwOU5hbWV9e3g1MDluYW1lfQotQSBjbGFzcyByZXByZXNlbnRpbmcgWC41MDkgRGlzdGluZ3Vpc2hlZCBOYW1lcy4KLQotVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgY29weSBvZiBcdmFye3g1MDluYW1lfSB3aGljaCBzaG91bGQgYmUgYW4KLWluc3RhbmNlIG9mIFxjbGFzc3tYNTA5TmFtZX0uCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtYNTA5UmVxVHlwZX0KLVNlZSBcY2xhc3N7WDUwOVJlcX0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtYNTA5UmVxfXt9Ci1BIGNsYXNzIHJlcHJlc2VudGluZyBYLjUwOSBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1g1MDlTdG9yZVR5cGV9Ci1BIFB5dGhvbiB0eXBlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFg1MDlTdG9yZSBvYmplY3QgdHlwZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UEtleVR5cGV9Ci1TZWUgXGNsYXNze1BLZXl9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317UEtleX17fQotQSBjbGFzcyByZXByZXNlbnRpbmcgRFNBIG9yIFJTQSBrZXlzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UEtDUzdUeXBlfQotQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBQS0NTNyBvYmplY3QgdHlwZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UEtDUzEyVHlwZX0KLUEgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgUEtDUzEyIG9iamVjdCB0eXBlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtYNTA5RXh0ZW5zaW9uVHlwZX0KLVNlZSBcY2xhc3N7WDUwOUV4dGVuc2lvbn0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtYNTA5RXh0ZW5zaW9ufXt0eXBlbmFtZSwgY3JpdGljYWwsIHZhbHVlXG9wdGlvbmFseywgc3ViamVjdH1cb3B0aW9uYWx7LCBpc3N1ZXJ9fQotQSBjbGFzcyByZXByZXNlbnRpbmcgYW4gWC41MDkgdjMgY2VydGlmaWNhdGUgZXh0ZW5zaW9ucy4KLVNlZSBcdXJse2h0dHA6Ly9vcGVuc3NsLm9yZy9kb2NzL2FwcHMveDUwOXYzX2NvbmZpZy5odG1sXCNTVEFOREFSRF9FWFRFTlNJT05TfQotZm9yIFx2YXJ7dHlwZW5hbWV9IHN0cmluZ3MgYW5kIHRoZWlyIG9wdGlvbnMuCi1PcHRpb25hbCBwYXJhbWV0ZXJzIFx2YXJ7c3ViamVjdH0gYW5kIFx2YXJ7aXNzdWVyfSBtdXN0IGJlIFg1MDkgb2JqZWN0cy4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e05ldHNjYXBlU1BLSVR5cGV9Ci1TZWUgXGNsYXNze05ldHNjYXBlU1BLSX0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtOZXRzY2FwZVNQS0l9e1xvcHRpb25hbHtlbmN9fQotQSBjbGFzcyByZXByZXNlbnRpbmcgTmV0c2NhcGUgU1BLSSBvYmplY3RzLgotCi1JZiB0aGUgXHZhcntlbmN9IGFyZ3VtZW50IGlzIHByZXNlbnQsIGl0IHNob3VsZCBiZSBhIGJhc2U2NC1lbmNvZGVkIHN0cmluZwotcmVwcmVzZW50aW5nIGEgTmV0c2NhcGVTUEtJIG9iamVjdCwgYXMgcmV0dXJuZWQgYnkgdGhlIFxtZXRob2R7YjY0X2VuY29kZX0KLW1ldGhvZC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtDUkx9e30KLUEgY2xhc3MgcmVwcmVzZW50aW5nIENlcnRpZmNhdGUgUmV2b2NhdGlvbiBMaXN0IG9iamVjdHMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317UmV2b2tlZH17fQotQSBjbGFzcyByZXByZXNlbnRpbmcgUmV2b2NhdGlvbiBvYmplY3RzIG9mIENSTC4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0ZJTEVUWVBFX1BFTX0KLVxkYXRhbGluZXtGSUxFVFlQRV9BU04xfQotRmlsZSB0eXBlIGNvbnN0YW50cy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317VFlQRV9SU0F9Ci1cZGF0YWxpbmV7VFlQRV9EU0F9Ci1LZXkgdHlwZSBjb25zdGFudHMuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317RXJyb3J9Ci1HZW5lcmljIGV4Y2VwdGlvbiB1c2VkIGluIHRoZSBcbW9kdWxle2NyeXB0b30gbW9kdWxlLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2R1bXBfY2VydGlmaWNhdGV9e3R5cGUsIGNlcnR9Ci1EdW1wIHRoZSBjZXJ0aWZpY2F0ZSBcdmFye2NlcnR9IGludG8gYSBidWZmZXIgc3RyaW5nIGVuY29kZWQgd2l0aCB0aGUgdHlwZQotXHZhcnt0eXBlfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317ZHVtcF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0fXt0eXBlLCByZXF9Ci1EdW1wIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IFx2YXJ7cmVxfSBpbnRvIGEgYnVmZmVyIHN0cmluZyBlbmNvZGVkIHdpdGggdGhlCi10eXBlIFx2YXJ7dHlwZX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2R1bXBfcHJpdmF0ZWtleX17dHlwZSwgcGtleVxvcHRpb25hbHssIGNpcGhlciwgcGFzc3BocmFzZX19Ci1EdW1wIHRoZSBwcml2YXRlIGtleSBcdmFye3BrZXl9IGludG8gYSBidWZmZXIgc3RyaW5nIGVuY29kZWQgd2l0aCB0aGUgdHlwZQotXHZhcnt0eXBlfSwgb3B0aW9uYWxseSAoaWYgXHZhcnt0eXBlfSBpcyBcY29uc3RhbnR7RklMRVRZUEVfUEVNfSkgZW5jcnlwdGluZyBpdAotdXNpbmcgXHZhcntjaXBoZXJ9IGFuZCBcdmFye3Bhc3NwaHJhc2V9LgotCi1cdmFye3Bhc3NwaHJhc2V9IG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEgY2FsbGJhY2sgZm9yIHByb3ZpZGluZyB0aGUKLXBhc3MgcGhyYXNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsb2FkX2NlcnRpZmljYXRlfXt0eXBlLCBidWZmZXJ9Ci1Mb2FkIGEgY2VydGlmaWNhdGUgKFg1MDkpIGZyb20gdGhlIHN0cmluZyBcdmFye2J1ZmZlcn0gZW5jb2RlZCB3aXRoIHRoZQotdHlwZSBcdmFye3R5cGV9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsb2FkX2NlcnRpZmljYXRlX3JlcXVlc3R9e3R5cGUsIGJ1ZmZlcn0KLUxvYWQgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IChYNTA5UmVxKSBmcm9tIHRoZSBzdHJpbmcgXHZhcntidWZmZXJ9IGVuY29kZWQgd2l0aAotdGhlIHR5cGUgXHZhcnt0eXBlfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bG9hZF9wcml2YXRla2V5fXt0eXBlLCBidWZmZXJcb3B0aW9uYWx7LCBwYXNzcGhyYXNlfX0KLUxvYWQgYSBwcml2YXRlIGtleSAoUEtleSkgZnJvbSB0aGUgc3RyaW5nIFx2YXJ7YnVmZmVyfSBlbmNvZGVkIHdpdGgKLXRoZSB0eXBlIFx2YXJ7dHlwZX0gKG11c3QgYmUgb25lIG9mIFxjb25zdGFudHtGSUxFVFlQRV9QRU19IGFuZAotXGNvbnN0YW50e0ZJTEVUWVBFX0FTTjF9KS4KLQotXHZhcntwYXNzcGhyYXNlfSBtdXN0IGJlIGVpdGhlciBhIHN0cmluZyBvciBhIGNhbGxiYWNrIGZvciBwcm92aWRpbmcgdGhlCi1wYXNzIHBocmFzZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bG9hZF9jcmx9e3R5cGUsIGJ1ZmZlcn0KLUxvYWQgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0IChDUkwpIGRhdGEgZnJvbSBhIHN0cmluZyBcdmFye2J1ZmZlcn0uCi1cdmFye2J1ZmZlcn0gZW5jb2RlZCB3aXRoIHRoZSB0eXBlIFx2YXJ7dHlwZX0uICBUaGUgdHlwZSBcdmFye3R5cGV9Ci1tdXN0IGVpdGhlciBcY29uc3RhbnR7RklMRVRZUEVfUEVNfSBvciBcY29uc3RhbnR7RklMRVRZUEVfQVNOMX0pLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsb2FkX3BrY3M3X2RhdGF9e3R5cGUsIGJ1ZmZlcn0KLUxvYWQgcGtjczcgZGF0YSBmcm9tIHRoZSBzdHJpbmcgXHZhcntidWZmZXJ9IGVuY29kZWQgd2l0aCB0aGUgdHlwZSBcdmFye3R5cGV9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtsb2FkX3BrY3MxMn17YnVmZmVyXG9wdGlvbmFseywgcGFzc3BocmFzZX19Ci1Mb2FkIHBrY3MxMiBkYXRhIGZyb20gdGhlIHN0cmluZyBcdmFye2J1ZmZlcn0uIElmIHRoZSBwa2NzMTIgc3RydWN0dXJlIGlzCi1lbmNyeXB0ZWQsIGEgXHZhcntwYXNzcGhyYXNlfSBtdXN0IGJlIGluY2x1ZGVkLiAgVGhlIE1BQyBpcyBhbHdheXMKLWNoZWNrZWQgYW5kIHRodXMgcmVxdWlyZWQuCi0KLVNlZSBhbHNvIHRoZSBtYW4gcGFnZSBmb3IgdGhlIEMgZnVuY3Rpb24gXGZ1bmN0aW9ue1BLQ1MxMl9wYXJzZX0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NpZ259e2tleSwgZGF0YSwgZGlnZXN0fQotU2lnbiBhIGRhdGEgc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBrZXkgYW5kIG1lc3NhZ2UgZGlnZXN0LgotCi1cdmFye2tleX0gaXMgYSBcY29kZXtQS2V5fSBpbnN0YW5jZS4gIFx2YXJ7ZGF0YX0gaXMgYSBcY29kZXtzdHJ9IGluc3RhbmNlLgotXHZhcntkaWdlc3R9IGlzIGEgXGNvZGV7c3RyfSBuYW1pbmcgYSBzdXBwb3J0ZWQgbWVzc2FnZSBkaWdlc3QgdHlwZSwgZm9yIGV4YW1wbGUKLVxjb2Rle2Bgc2hhMScnfS4KLVx2ZXJzaW9uYWRkZWR7MC4xMX0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317dmVyaWZ5fXtjZXJ0aWZpY2F0ZSwgc2lnbmF0dXJlLCBkYXRhLCBkaWdlc3R9Ci1WZXJpZnkgdGhlIHNpZ25hdHVyZSBmb3IgYSBkYXRhIHN0cmluZy4KLQotXHZhcntjZXJ0aWZpY2F0ZX0gaXMgYSBcY29kZXtYNTA5fSBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcml2YXRlIGtleQotd2hpY2ggZ2VuZXJhdGVkIHRoZSBzaWduYXR1cmUuICBcdmFye3NpZ25hdHVyZX0gaXMgYSBcdmFye3N0cn0gaW5zdGFuY2UgZ2l2aW5nCi10aGUgc2lnbmF0dXJlIGl0c2VsZi4gIFx2YXJ7ZGF0YX0gaXMgYSBcdmFye3N0cn0gaW5zdGFuY2UgZ2l2aW5nIHRoZSBkYXRhIHRvCi13aGljaCB0aGUgc2lnbmF0dXJlIGFwcGxpZXMuICBcdmFye2RpZ2VzdH0gaXMgYSBcdmFye3N0cn0gaW5zdGFuY2UgbmFtaW5nIHRoZQotbWVzc2FnZSBkaWdlc3QgdHlwZSBvZiB0aGUgc2lnbmF0dXJlLCBmb3IgZXhhbXBsZSBcY29kZXtgYHNoYTEnJ30uCi1cdmVyc2lvbmFkZGVkezAuMTF9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntYNTA5IG9iamVjdHMgXGxhYmVse29wZW5zc2wteDUwOX19Ci0KLVg1MDkgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2dldF9pc3N1ZXJ9e30KLVJldHVybiBhbiBYNTA5TmFtZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBpc3N1ZXIgb2YgdGhlIGNlcnRpZmljYXRlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWDUwOV17Z2V0X3B1YmtleX17fQotUmV0dXJuIGEgUEtleSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2dldF9zZXJpYWxfbnVtYmVyfXt9Ci1SZXR1cm4gdGhlIGNlcnRpZmljYXRlIHNlcmlhbCBudW1iZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtnZXRfc2lnbmF0dXJlX2FsZ29yaXRobX17fQotUmV0dXJuIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtIHVzZWQgaW4gdGhlIGNlcnRpZmljYXRlLiAgSWYgdGhlIGFsZ29yaXRobSBpcwotdW5kZWZpbmVkLCByYWlzZSBcY29kZXtWYWx1ZUVycm9yfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2dldF9zdWJqZWN0fXt9Ci1SZXR1cm4gYW4gWDUwOU5hbWUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3ViamVjdCBvZiB0aGUgY2VydGlmaWNhdGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtnZXRfdmVyc2lvbn17fQotUmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJzaW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWDUwOV17Z2V0X25vdEJlZm9yZX17fQotUmV0dXJuIGEgc3RyaW5nIGdpdmluZyB0aGUgdGltZSBiZWZvcmUgd2hpY2ggdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB2YWxpZC4gIFRoZQotc3RyaW5nIGlzIGZvcm1hdHRlZCBhcyBhbiBBU04xIEdFTkVSQUxJWkVEVElNRToKLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICAgICAgICAgICAgICAgWVlZWU1NRERoaG1tc3NaCi0gICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzK2hobW0KLSAgICAgICAgICAgICAgICAgWVlZWU1NRERoaG1tc3MtaGhtbQotXGVuZHt2ZXJiYXRpbX0KLUlmIG5vIHZhbHVlIGV4aXN0cyBmb3IgdGhpcyBmaWVsZCwgXGNvZGV7Tm9uZX0gaXMgcmV0dXJuZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtnZXRfbm90QWZ0ZXJ9e30KLVJldHVybiBhIHN0cmluZyBnaXZpbmcgdGhlIHRpbWUgYWZ0ZXIgd2hpY2ggdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB2YWxpZC4gIFRoZQotc3RyaW5nIGlzIGZvcm1hdHRlZCBhcyBhbiBBU04xIEdFTkVSQUxJWkVEVElNRToKLVxiZWdpbnt2ZXJiYXRpbX0KLSAgICAgICAgICAgICAgICAgWVlZWU1NRERoaG1tc3NaCi0gICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzK2hobW0KLSAgICAgICAgICAgICAgICAgWVlZWU1NRERoaG1tc3MtaGhtbQotXGVuZHt2ZXJiYXRpbX0KLUlmIG5vIHZhbHVlIGV4aXN0cyBmb3IgdGhpcyBmaWVsZCwgXGNvZGV7Tm9uZX0gaXMgcmV0dXJuZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtzZXRfbm90QmVmb3JlfXt3aGVufQotQ2hhbmdlIHRoZSB0aW1lIGJlZm9yZSB3aGljaCB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHZhbGlkLiAgXHZhcnt3aGVufSBpcyBhCi1zdHJpbmcgZm9ybWF0dGVkIGFzIGFuIEFTTjEgR0VORVJBTElaRURUSU1FOgotXGJlZ2lue3ZlcmJhdGltfQotICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zc1oKLSAgICAgICAgICAgICAgICAgWVlZWU1NRERoaG1tc3MraGhtbQotICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zcy1oaG1tCi1cZW5ke3ZlcmJhdGltfQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWDUwOV17c2V0X25vdEFmdGVyfXt3aGVufQotQ2hhbmdlIHRoZSB0aW1lIGFmdGVyIHdoaWNoIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdmFsaWQuICBcdmFye3doZW59IGlzIGEKLXN0cmluZyBmb3JtYXR0ZWQgYXMgYW4gQVNOMSBHRU5FUkFMSVpFRFRJTUU6Ci1cYmVnaW57dmVyYmF0aW19Ci0gICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzWgotICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zcytoaG1tCi0gICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzLWhobW0KLVxlbmR7dmVyYmF0aW19Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtnbXRpbWVfYWRqX25vdEJlZm9yZX17dGltZX0KLUFkanVzdCB0aGUgdGltZXN0YW1wIChpbiBHTVQpIHdoZW4gdGhlIGNlcnRpZmljYXRlIHN0YXJ0cyBiZWluZyB2YWxpZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2dtdGltZV9hZGpfbm90QWZ0ZXJ9e3RpbWV9Ci1BZGp1c3QgdGhlIHRpbWVzdGFtcCAoaW4gR01UKSB3aGVuIHRoZSBjZXJ0aWZpY2F0ZSBzdG9wcyBiZWluZyB2YWxpZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2hhc19leHBpcmVkfXt9Ci1DaGVja3MgdGhlIGNlcnRpZmljYXRlJ3MgdGltZSBzdGFtcCBhZ2FpbnN0IGN1cnJlbnQgdGltZS4gUmV0dXJucyB0cnVlIGlmIHRoZQotY2VydGlmaWNhdGUgaGFzIGV4cGlyZWQgYW5kIGZhbHNlIG90aGVyd2lzZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde3NldF9pc3N1ZXJ9e2lzc3Vlcn0KLVNldCB0aGUgaXNzdWVyIG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byBcdmFye2lzc3Vlcn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtzZXRfcHVia2V5fXtwa2V5fQotU2V0IHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byBcdmFye3BrZXl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWDUwOV17c2V0X3NlcmlhbF9udW1iZXJ9e3NlcmlhbG5vfQotU2V0IHRoZSBzZXJpYWwgbnVtYmVyIG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byBcdmFye3NlcmlhbG5vfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde3NldF9zdWJqZWN0fXtzdWJqZWN0fQotU2V0IHRoZSBzdWJqZWN0IG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byBcdmFye3N1YmplY3R9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWDUwOV17c2V0X3ZlcnNpb259e3ZlcnNpb259Ci1TZXQgdGhlIGNlcnRpZmljYXRlIHZlcnNpb24gdG8gXHZhcnt2ZXJzaW9ufS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde3NpZ259e3BrZXksIGRpZ2VzdH0KLVNpZ24gdGhlIGNlcnRpZmljYXRlLCB1c2luZyB0aGUga2V5IFx2YXJ7cGtleX0gYW5kIHRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0KLWlkZW50aWZpZWQgYnkgdGhlIHN0cmluZyBcdmFye2RpZ2VzdH0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtzdWJqZWN0X25hbWVfaGFzaH17fQotUmV0dXJuIHRoZSBoYXNoIG9mIHRoZSBjZXJ0aWZpY2F0ZSBzdWJqZWN0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWDUwOV17ZGlnZXN0fXtkaWdlc3RfbmFtZX0KLVJldHVybiBhIGRpZ2VzdCBvZiB0aGUgY2VydGlmaWNhdGUsIHVzaW5nIHRoZSBcdmFye2RpZ2VzdF9uYW1lfSBtZXRob2QuCi1cdmFye2RpZ2VzdF9uYW1lfSBtdXN0IGJlIGEgc3RyaW5nIGRlc2NyaWJpbmcgYSBkaWdlc3QgYWxnb3JpdGhtIHN1cHBvcnRlZAotYnkgT3BlblNTTCAoYnkgRVZQX2dldF9kaWdlc3RieW5hbWUsIHNwZWNpZmljYWxseSkuICBGb3IgZXhhbXBsZSwKLVxjb25zdGFudHsibWQ1In0gb3IgXGNvbnN0YW50eyJzaGExIn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXthZGRfZXh0ZW5zaW9uc317ZXh0ZW5zaW9uc30KLUFkZCB0aGUgZXh0ZW5zaW9ucyBpbiB0aGUgc2VxdWVuY2UgXHZhcntleHRlbnNpb25zfSB0byB0aGUgY2VydGlmaWNhdGUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtnZXRfZXh0ZW5zaW9uX2NvdW50fXt9Ci1SZXR1cm4gdGhlIG51bWJlciBvZiBleHRlbnNpb25zIG9uIHRoaXMgY2VydGlmaWNhdGUuCi1cdmVyc2lvbmFkZGVkezAuMTJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtnZXRfZXh0ZW5zaW9ufXtpbmRleH0KLVJldHJpZXZlIHRoZSBleHRlbnNpb24gb24gdGhpcyBjZXJ0aWZpY2F0ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0KLUV4dGVuc2lvbnMgb24gYSBjZXJ0aWZpY2F0ZSBhcmUga2VwdCBpbiBvcmRlci4gIFRoZSBpbmRleCBwYXJhbWV0ZXIgc2VsZWN0cwotd2hpY2ggZXh0ZW5zaW9uIHdpbGwgYmUgcmV0dXJuZWQuICBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgYW4gWDUwOUV4dGVuc2lvbgotaW5zdGFuY2UuCi1cdmVyc2lvbmFkZGVkezAuMTJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue1g1MDlOYW1lIG9iamVjdHMgXGxhYmVse29wZW5zc2wteDUwOW5hbWV9fQotCi1YNTA5TmFtZSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bWDUwOU5hbWVde2hhc2h9e30KLVJldHVybiBhbiBpbnRlZ2VyIGdpdmluZyB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgTUQ1IGRpZ2VzdCBvZiB0aGUgREVSCi1yZXByZXNlbnRhdGlvbiBvZiB0aGUgbmFtZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlOYW1lXXtkZXJ9e30KLVJldHVybiBhIHN0cmluZyBnaXZpbmcgdGhlIERFUiByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmFtZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlOYW1lXXtnZXRfY29tcG9uZW50c317fQotUmV0dXJuIGEgbGlzdCBvZiB0d28tdHVwbGVzIG9mIHN0cmluZ3MgZ2l2aW5nIHRoZSBjb21wb25lbnRzIG9mIHRoZSBuYW1lLgotXGVuZHttZXRob2RkZXNjfQotCi1YNTA5TmFtZSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZW1iZXJzOgotCi1cYmVnaW57bWVtYmVyZGVzY31bWDUwOU5hbWVde2NvdW50cnlOYW1lfQotVGhlIGNvdW50cnkgb2YgdGhlIGVudGl0eS4gXGNvZGV7Q30gbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yCi1cY29kZXtjb3VudHJ5TmFtZX0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtYNTA5TmFtZV17c3RhdGVPclByb3ZpbmNlTmFtZX0KLVRoZSBzdGF0ZSBvciBwcm92aW5jZSBvZiB0aGUgZW50aXR5LiBcY29kZXtTVH0gbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yCi1cY29kZXtzdGF0ZU9yUHJvdmluY2VOYW1lfbcKLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1g1MDlOYW1lXXtsb2NhbGl0eU5hbWV9Ci1UaGUgbG9jYWxpdHkgb2YgdGhlIGVudGl0eS4gXGNvZGV7TH0gbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yCi1cY29kZXtsb2NhbGl0eU5hbWV9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY31bWDUwOU5hbWVde29yZ2FuaXphdGlvbk5hbWV9Ci1UaGUgb3JnYW5pemF0aW9uIG5hbWUgb2YgdGhlIGVudGl0eS4gXGNvZGV7T30gbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yCi1cY29kZXtvcmdhbml6YXRpb25OYW1lfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1g1MDlOYW1lXXtvcmdhbml6YXRpb25hbFVuaXROYW1lfQotVGhlIG9yZ2FuaXphdGlvbmFsIHVuaXQgb2YgdGhlIGVudGl0eS4gXGNvZGV7T1V9IG1heSBiZSB1c2VkIGFzIGFuIGFsaWFzIGZvcgotXGNvZGV7b3JnYW5pemF0aW9uYWxVbml0TmFtZX0uCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfVtYNTA5TmFtZV17Y29tbW9uTmFtZX0KLVRoZSBjb21tb24gbmFtZSBvZiB0aGUgZW50aXR5LiBcY29kZXtDTn0gbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yCi1cY29kZXtjb21tb25OYW1lfS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXGJlZ2lue21lbWJlcmRlc2N9W1g1MDlOYW1lXXtlbWFpbEFkZHJlc3N9Ci1UaGUgZS1tYWlsIGFkZHJlc3Mgb2YgdGhlIGVudGl0eS4KLVxlbmR7bWVtYmVyZGVzY30KLQotXHN1YnN1YnNlY3Rpb257WDUwOVJlcSBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLXg1MDlyZXF9fQotCi1YNTA5UmVxIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5UmVxXXtnZXRfcHVia2V5fXt9Ci1SZXR1cm4gYSBQS2V5IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHB1YmxpYyBrZXkgb2YgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5UmVxXXtnZXRfc3ViamVjdH17fQotUmV0dXJuIGFuIFg1MDlOYW1lIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN1YmplY3Qgb2YgdGhlIGNlcnRpZmljYXRlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWDUwOVJlcV17c2V0X3B1YmtleX17cGtleX0KLVNldCB0aGUgcHVibGljIGtleSBvZiB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCB0byBcdmFye3BrZXl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWDUwOVJlcV17c2lnbn17cGtleSwgZGlnZXN0fQotU2lnbiB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCwgdXNpbmcgdGhlIGtleSBcdmFye3BrZXl9IGFuZCB0aGUgbWVzc2FnZSBkaWdlc3QKLWFsZ29yaXRobSBpZGVudGlmaWVkIGJ5IHRoZSBzdHJpbmcgXHZhcntkaWdlc3R9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWDUwOVJlcV17dmVyaWZ5fXtwa2V5fQotVmVyaWZ5IGEgY2VydGlmaWNhdGUgcmVxdWVzdCB1c2luZyB0aGUgcHVibGljIGtleSBcdmFye3BrZXl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bWDUwOVJlcV17c2V0X3ZlcnNpb259e3ZlcnNpb259Ci1TZXQgdGhlIHZlcnNpb24gKFJGQyAyNDU5LCA0LjEuMi4xKSBvZiB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCB0bwotXHZhcnt2ZXJzaW9ufS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlSZXFde2dldF92ZXJzaW9ufXt9Ci1HZXQgdGhlIHZlcnNpb24gKFJGQyAyNDU5LCA0LjEuMi4xKSBvZiB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXHN1YnN1YnNlY3Rpb257WDUwOVN0b3JlIG9iamVjdHMgXGxhYmVse29wZW5zc2wteDUwOXN0b3JlfX0KLQotVGhlIFg1MDlTdG9yZSBvYmplY3QgaGFzIGN1cnJlbnRseSBqdXN0IG9uZSBtZXRob2Q6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5U3RvcmVde2FkZF9jZXJ0fXtjZXJ0fQotQWRkIHRoZSBjZXJ0aWZpY2F0ZSBcdmFye2NlcnR9IHRvIHRoZSBjZXJ0aWZpY2F0ZSBzdG9yZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXHN1YnN1YnNlY3Rpb257UEtleSBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLXBrZXl9fQotCi1UaGUgUEtleSBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1BLZXlde2JpdHN9e30KLVJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIGtleS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BLZXlde2dlbmVyYXRlX2tleX17dHlwZSwgYml0c30KLUdlbmVyYXRlIGEgcHVibGljL3ByaXZhdGUga2V5IHBhaXIgb2YgdGhlIHR5cGUgXHZhcnt0eXBlfSAob25lIG9mCi1cY29uc3RhbnR7VFlQRV9SU0F9IGFuZCBcY29uc3RhbnR7VFlQRV9EU0F9KSB3aXRoIHRoZSBzaXplIFx2YXJ7Yml0c30uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQS2V5XXt0eXBlfXt9Ci1SZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGtleS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BLZXlde2NoZWNrfXt9Ci1DaGVjayB0aGUgY29uc2lzdGVuY3kgb2YgdGhpcyBrZXksIHJldHVybmluZyBUcnVlIGlmIGl0IGlzIGNvbnNpc3RlbnQgYW5kCi1yYWlzaW5nIGFuIGV4Y2VwdGlvbiBvdGhlcndpc2UuICBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIFJTQSBrZXlzLiAgU2VlIHRoZQotT3BlblNTTCBSU0FfY2hlY2tfa2V5IG1hbiBwYWdlIGZvciBmdXJ0aGVyIGxpbWl0YXRpb25zLgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntQS0NTNyBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLXBrY3M3fX0KLQotUEtDUzcgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1BLQ1M3XXt0eXBlX2lzX3NpZ25lZH17fQotRklYTUUKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BLQ1M3XXt0eXBlX2lzX2VudmVsb3BlZH17fQotRklYTUUKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BLQ1M3XXt0eXBlX2lzX3NpZ25lZEFuZEVudmVsb3BlZH17fQotRklYTUUKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BLQ1M3XXt0eXBlX2lzX2RhdGF9e30KLUZJWE1FCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQS0NTN117Z2V0X3R5cGVfbmFtZX17fQotR2V0IHRoZSB0eXBlIG5hbWUgb2YgdGhlIFBLQ1M3LgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntQS0NTMTIgb2JqZWN0cyBcbGFiZWx7b3BlbnNzbC1wa2NzMTJ9fQotCi1QS0NTMTIgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W1BLQ1MxMl17ZXhwb3J0fXtcb3B0aW9uYWx7cGFzc3BocmFzZT1Ob25lfVxvcHRpb25hbHssIGl0ZXI9MjA0OH1cb3B0aW9uYWx7LCBtYWNpdGVyPTF9fQotUmV0dXJucyBhIFBLQ1MxMiBvYmplY3QgYXMgYSBzdHJpbmcuCi0KLVRoZSBvcHRpb25hbCBcdmFye3Bhc3NwaHJhc2V9IG11c3QgYmUgYSBzdHJpbmcgbm90IGEgY2FsbGJhY2suCi0KLVNlZSBhbHNvIHRoZSBtYW4gcGFnZSBmb3IgdGhlIEMgZnVuY3Rpb24gXGZ1bmN0aW9ue1BLQ1MxMl9jcmVhdGV9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUEtDUzEyXXtnZXRfY2FfY2VydGlmaWNhdGVzfXt9Ci1SZXR1cm4gQ0EgY2VydGlmaWNhdGVzIHdpdGhpbiB0aGUgUEtDUzEyIG9iamVjdCBhcyBhIHR1cGxlLiBSZXR1cm5zCi1cY29uc3RhbnR7Tm9uZX0gaWYgbm8gQ0EgY2VydGlmaWNhdGVzIGFyZSBwcmVzZW50LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUEtDUzEyXXtnZXRfY2VydGlmaWNhdGV9e30KLVJldHVybiBjZXJ0aWZpY2F0ZSBwb3J0aW9uIG9mIHRoZSBQS0NTMTIgc3RydWN0dXJlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUEtDUzEyXXtnZXRfZnJpZW5kbHluYW1lfXt9Ci1SZXR1cm4gZnJpZW5kbHlOYW1lIHBvcnRpb24gb2YgdGhlIFBLQ1MxMiBzdHJ1Y3R1cmUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtQS0NTMTJde2dldF9wcml2YXRla2V5fXt9Ci1SZXR1cm4gcHJpdmF0ZSBrZXkgcG9ydGlvbiBvZiB0aGUgUEtDUzEyIHN0cnVjdHVyZQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUEtDUzEyXXtzZXRfY2FfY2VydGlmaWNhdGVzfXtjYWNlcnRzfQotUmVwbGFjZSBvciBzZXQgdGhlIENBIGNlcnRpZmljYXRlcyB3aXRoaW4gdGhlIFBLQ1MxMiBvYmplY3Qgd2l0aCB0aGUgc2VxdWVuY2UgXHZhcntjYWNlcnRzfS4KLQotU2V0IFx2YXJ7Y2FjZXJ0c30gdG8gXGNvbnN0YW50e05vbmV9IHRvIHJlbW92ZSBhbGwgQ0EgY2VydGlmaWNhdGVzLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUEtDUzEyXXtzZXRfY2VydGlmaWNhdGV9e2NlcnR9Ci1SZXBsYWNlIG9yIHNldCB0aGUgY2VydGlmaWNhdGUgcG9ydGlvbiBvZiB0aGUgUEtDUzEyIHN0cnVjdHVyZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BLQ1MxMl17c2V0X2ZyaWVuZGx5bmFtZX17bmFtZX0KLVJlcGxhY2Ugb3Igc2V0IHRoZSBmcmllbmRseU5hbWUgcG9ydGlvbiBvZiB0aGUgUEtDUzEyIHN0cnVjdHVyZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1BLQ1MxMl17c2V0X3ByaXZhdGVrZXl9e3BrZXl9Ci1SZXBsYWNlIG9yIHNldCBwcml2YXRlIGtleSBwb3J0aW9uIG9mIHRoZSBQS0NTMTIgc3RydWN0dXJlCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue1g1MDlFeHRlbnNpb24gb2JqZWN0cyBcbGFiZWx7b3BlbnNzbC01MDlleHR9fQotCi1YNTA5RXh0ZW5zaW9uIG9iamVjdHMgaGF2ZSBzZXZlcmFsIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5RXh0ZW5zaW9uXXtnZXRfY3JpdGljYWx9e30KLVJldHVybiB0aGUgY3JpdGljYWwgZmllbGQgb2YgdGhlIGV4dGVuc2lvbiBvYmplY3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5RXh0ZW5zaW9uXXtnZXRfc2hvcnRfbmFtZX17fQotUmV0cmlldmUgdGhlIHNob3J0IGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoaXMgZXh0ZW5zaW9uLgotCi1UaGUgcmVzdWx0IGlzIGEgYnl0ZSBzdHJpbmcgbGlrZSBcY29kZXtgYGJhc2ljQ29uc3RyYWludHMnJ30uCi1cdmVyc2lvbmFkZGVkezAuMTJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtYNTA5RXh0ZW5zaW9uXXtnZXRfZGF0YX17fQotUmV0cmlldmUgdGhlIGRhdGEgZm9yIHRoaXMgZXh0ZW5zaW9uLgotCi1UaGUgcmVzdWx0IGlzIHRoZSBBU04uMSBlbmNvZGVkIGZvcm0gb2YgdGhlIGV4dGVuc2lvbiBkYXRhIGFzIGEgYnl0ZSBzdHJpbmcuCi1cdmVyc2lvbmFkZGVkezAuMTJ9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxzdWJzdWJzZWN0aW9ue05ldHNjYXBlU1BLSSBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLW5ldHNjYXBlLXNwa2l9fQotCi1OZXRzY2FwZVNQS0kgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W05ldHNjYXBlU1BLSV17YjY0X2VuY29kZX17fQotUmV0dXJuIGEgYmFzZTY0LWVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOZXRzY2FwZVNQS0lde2dldF9wdWJrZXl9e30KLVJldHVybiB0aGUgcHVibGljIGtleSBvZiBvYmplY3QuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtOZXRzY2FwZVNQS0lde3NldF9wdWJrZXl9e2tleX0KLVNldCB0aGUgcHVibGljIGtleSBvZiB0aGUgb2JqZWN0IHRvIFx2YXJ7a2V5fS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W05ldHNjYXBlU1BLSV17c2lnbn17a2V5LCBkaWdlc3RfbmFtZX0KLVNpZ24gdGhlIE5ldHNjYXBlU1BLSSBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIFx2YXJ7a2V5fSBhbmQKLVx2YXJ7ZGlnZXN0X25hbWV9LiAgXHZhcntkaWdlc3RfbmFtZX0gbXVzdCBiZSBhIHN0cmluZyBkZXNjcmliaW5nIGEgZGlnZXN0Ci1hbGdvcml0aG0gc3VwcG9ydGVkIGJ5IE9wZW5TU0wgKGJ5IEVWUF9nZXRfZGlnZXN0YnluYW1lLCBzcGVjaWZpY2FsbHkpLiAgRm9yCi1leGFtcGxlLCBcY29uc3RhbnR7Im1kNSJ9IG9yIFxjb25zdGFudHsic2hhMSJ9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTmV0c2NhcGVTUEtJXXt2ZXJpZnl9e2tleX0KLVZlcmlmeSB0aGUgTmV0c2NhcGVTUEtJIG9iamVjdCB1c2luZyB0aGUgZ2l2ZW4gXHZhcntrZXl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntDUkwgb2JqZWN0cyBcbGFiZWx7Y3JsfX0KLQotQ1JMIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDUkxde2FkZF9yZXZva2VkfXtyZXZva2VkfQotQWRkIGEgUmV2b2tlZCBvYmplY3QgdG8gdGhlIENSTCwgYnkgdmFsdWUgbm90IHJlZmVyZW5jZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NSTF17ZXhwb3J0fXtjZXJ0LCBrZXlcb3B0aW9uYWx7LCB0eXBlPUZJTEVUWVBFX1BFTX1cb3B0aW9uYWx7LCBkYXlzPTEwMH19Ci1Vc2UgXHZhcntjZXJ0fSBhbmQgXHZhcntrZXl9IHRvIHNpZ24gdGhlIENSTCBhbmQgcmV0dXJuIHRoZSBDUkwgYXMgYSBzdHJpbmcuCi1cdmFye2RheXN9IGlzIHRoZSBudW1iZXIgb2YgZGF5cyBiZWZvcmUgdGhlIG5leHQgQ1JMIGlzIGR1ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NSTF17Z2V0X3Jldm9rZWR9e30KLVJldHVybiBhIHR1cGxlIG9mIFJldm9rZWQgb2JqZWN0cywgYnkgdmFsdWUgbm90IHJlZmVyZW5jZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXHN1YnN1YnNlY3Rpb257UmV2b2tlZCBvYmplY3RzIFxsYWJlbHtyZXZva2VkfX0KLQotUmV2b2tlZCBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bUmV2b2tlZF17YWxsX3JlYXNvbnN9e30KLVJldHVybiBhIGxpc3Qgb2YgYWxsIHN1cHBvcnRlZCByZWFzb25zLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bUmV2b2tlZF17Z2V0X3JlYXNvbn17fQotUmV0dXJuIHRoZSByZXZvY2F0aW9uIHJlYXNvbiBhcyBhIHN0ci4gIENhbiBiZQotTm9uZSwgd2hpY2ggZGlmZmVycyBmcm9tICJVbnNwZWNpZmllZCIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSZXZva2VkXXtnZXRfcmV2X2RhdGV9e30KLVJldHVybiB0aGUgcmV2b2NhdGlvbiBkYXRlIGFzIGEgc3RyLgotVGhlIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgYW4gQVNOMSBHRU5FUkFMSVpFRFRJTUUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSZXZva2VkXXtnZXRfc2VyaWFsfXt9Ci1SZXR1cm4gYSBzdHIgY29udGFpbmluZyBhIGhleCBudW1iZXIgb2YgdGhlIHNlcmlhbCBvZiB0aGUgcmV2b2tlZCBjZXJ0aWZpY2F0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Jldm9rZWRde3NldF9yZWFzb259e3JlYXNvbn0KLVNldCB0aGUgcmV2b2NhdGlvbiByZWFzb24uICBcdmFye3JlYXNvbn0gbXVzdAotYmUgTm9uZSBvciBhIHN0cmluZywgYnV0IHRoZSB2YWx1ZXMgYXJlIGxpbWl0ZWQuICAKLVNwYWNlcyBhbmQgY2FzZSBhcmUgaWdub3JlZC4gIFNlZSBcbWV0aG9ke2FsbF9yZWFzb25zfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W1Jldm9rZWRde3NldF9yZXZfZGF0ZX17ZGF0ZX0KLVNldCB0aGUgcmV2b2NhdGlvbiBkYXRlLgotVGhlIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgYW4gQVNOMSBHRU5FUkFMSVpFRFRJTUUuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtSZXZva2VkXXtzZXRfc2VyaWFsfXtzZXJpYWx9Ci1cdmFye3NlcmlhbH0gaXMgYSBzdHJpbmcgY29udGFpbmluZyBhIGhleCBudW1iZXIgb2YgdGhlIHNlcmlhbCBvZiB0aGUgcmV2b2tlZCBjZXJ0aWZpY2F0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotCi0lICUgJSByYW5kIG1vZHVsZQotCi1cc3Vic2VjdGlvbntcbW9kdWxle3JhbmR9IC0tLSBBbiBpbnRlcmZhY2UgdG8gdGhlIE9wZW5TU0wgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIFxsYWJlbHtvcGVuc3NsLXJhbmR9fQotCi1cZGVjbGFyZW1vZHVsZXtleHRlbnNpb259e3JhbmR9Ci1cbW9kdWxlc3lub3BzaXN7QW4gaW50ZXJmYWNlIHRvIHRoZSBPcGVuU1NMIHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvcn0KLQotVGhpcyBtb2R1bGUgaGFuZGxlcyB0aGUgT3BlblNTTCBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKFBSTkcpIGFuZAotZGVjbGFyZXMgdGhlIGZvbGxvd2luZzoKLQotXGJlZ2lue2Z1bmNkZXNjfXthZGR9e3N0cmluZywgZW50cm9weX0KLU1peCBieXRlcyBmcm9tIFx2YXJ7c3RyaW5nfSBpbnRvIHRoZSBQUk5HIHN0YXRlLiBUaGUgXHZhcntlbnRyb3B5fSBhcmd1bWVudCBpcwotKHRoZSBsb3dlciBib3VuZCBvZikgYW4gZXN0aW1hdGUgb2YgaG93IG11Y2ggcmFuZG9tbmVzcyBpcyBjb250YWluZWQgaW4KLVx2YXJ7c3RyaW5nfSwgbWVhc3VyZWQgaW4gYnl0ZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgZS5nLiBccmZjezE3NTB9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtieXRlc317bnVtX2J5dGVzfQotR2V0IHNvbWUgcmFuZG9tIGJ5dGVzIGZyb20gdGhlIFBSTkcgYXMgYSBzdHJpbmcuCi0KLVRoaXMgaXMgYSB3cmFwcGVyIGZvciB0aGUgQyBmdW5jdGlvbiBcZnVuY3Rpb257UkFORF9ieXRlc30uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NsZWFudXB9e30KLUVyYXNlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgUFJORy4KLQotVGhpcyBpcyBhIHdyYXBwZXIgZm9yIHRoZSBDIGZ1bmN0aW9uIFxmdW5jdGlvbntSQU5EX2NsZWFudXB9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtlZ2R9e3BhdGhcb3B0aW9uYWx7LCBieXRlc319Ci1RdWVyeSB0aGUgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uXGZvb3Rub3Rle1NlZQotXHVybHtodHRwOi8vd3d3LmxvdGhhci5jb20vdGVjaC9jcnlwdG8vfX0gb24gc29ja2V0IFx2YXJ7cGF0aH0gZm9yIFx2YXJ7Ynl0ZXN9Ci1ieXRlcyBvZiByYW5kb20gZGF0YSBhbmQgYW5kIHVzZXMgXGZ1bmN0aW9ue2FkZH0gdG8gc2VlZCB0aGUgUFJORy4gVGhlIGRlZmF1bHQKLXZhbHVlIG9mIFx2YXJ7Ynl0ZXN9IGlzIDI1NS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317bG9hZF9maWxlfXtwYXRoXG9wdGlvbmFseywgYnl0ZXN9fQotUmVhZCBcdmFye2J5dGVzfSBieXRlcyAob3IgYWxsIG9mIGl0LCBpZiBcdmFye2J5dGVzfSBpcyBuZWdhdGl2ZSkgb2YgZGF0YSBmcm9tCi10aGUgZmlsZSBcdmFye3BhdGh9IHRvIHNlZWQgdGhlIFBSTkcuIFRoZSBkZWZhdWx0IHZhbHVlIG9mIFx2YXJ7Ynl0ZXN9IGlzIC0xLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzY3JlZW59e30KLUFkZCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgc2NyZWVuIHRvIHRoZSBQUk5HIHN0YXRlLgotQXZhaWxhYmlsaXR5OiBXaW5kb3dzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZWVkfXtzdHJpbmd9Ci1UaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBcZnVuY3Rpb257YWRkfSB3aXRoIFx2YXJ7ZW50cm9weX0gYXMgdGhlIGxlbmd0aAotb2YgdGhlIHN0cmluZy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3RhdHVzfXt9Ci1SZXR1cm5zIHRydWUgaWYgdGhlIFBSTkcgaGFzIGJlZW4gc2VlZGVkIHdpdGggZW5vdWdoIGRhdGEsIGFuZCBmYWxzZSBvdGhlcndpc2UuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3dyaXRlX2ZpbGV9e3BhdGh9Ci1Xcml0ZSBhIG51bWJlciBvZiByYW5kb20gYnl0ZXMgKGN1cnJlbnRseSAxMDI0KSB0byB0aGUgZmlsZSBcdmFye3BhdGh9LiBUaGlzCi1maWxlIGNhbiB0aGVuIGJlIHVzZWQgd2l0aCBcZnVuY3Rpb257bG9hZF9maWxlfSB0byBzZWVkIHRoZSBQUk5HIGFnYWluLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0Vycm9yfQotSWYgdGhlIGN1cnJlbnQgUkFORCBtZXRob2Qgc3VwcG9ydHMgYW55IGVycm9ycywgdGhpcyBpcyByYWlzZWQgd2hlbiBuZWVkZWQuCi1UaGUgZGVmYXVsdCBtZXRob2QgZG9lcyBub3QgcmFpc2UgdGhpcyB3aGVuIHRoZSBlbnRyb3B5IHBvb2wgaXMgZGVwbGV0ZWQuCi0KLVdoZW5ldmVyIHRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCBkaXJlY3RseSwgaXQgaGFzIGEgbGlzdCBvZiBlcnJvciBtZXNzYWdlcwotZnJvbSB0aGUgT3BlblNTTCBlcnJvciBxdWV1ZSwgd2hlcmUgZWFjaCBpdGVtIGlzIGEgdHVwbGUgXGNvZGV7KFx2YXJ7bGlifSwKLVx2YXJ7ZnVuY3Rpb259LCBcdmFye3JlYXNvbn0pfS4gSGVyZSBcdmFye2xpYn0sIFx2YXJ7ZnVuY3Rpb259IGFuZCBcdmFye3JlYXNvbn0KLWFyZSBhbGwgc3RyaW5ncywgZGVzY3JpYmluZyB3aGVyZSBhbmQgd2hhdCB0aGUgcHJvYmxlbSBpcy4gU2VlIFxtYW5wYWdle2Vycn17M30KLWZvciBtb3JlIGluZm9ybWF0aW9uLgotXGVuZHtleGNkZXNjfQotCi0KLSUgJSAlIFNTTCBtb2R1bGUKLQotXHN1YnNlY3Rpb257XG1vZHVsZXtTU0x9IC0tLSBBbiBpbnRlcmZhY2UgdG8gdGhlIFNTTC1zcGVjaWZpYyBwYXJ0cyBvZiBPcGVuU1NMIFxsYWJlbHtvcGVuc3NsLXNzbH19Ci0KLVxkZWNsYXJlbW9kdWxle2V4dGVuc2lvbn17U1NMfQotXG1vZHVsZXN5bm9wc2lze0FuIGludGVyZmFjZSB0byB0aGUgU1NMLXNwZWNpZmljIHBhcnRzIG9mIE9wZW5TU0x9Ci0KLVRoaXMgbW9kdWxlIGhhbmRsZXMgdGhpbmdzIHNwZWNpZmljIHRvIFNTTC4gVGhlcmUgYXJlIHR3byBvYmplY3RzIGRlZmluZWQ6Ci1Db250ZXh0LCBDb25uZWN0aW9uLgotCi1cYmVnaW57ZGF0YWRlc2N9e1NTTHYyX01FVEhPRH0KLVxkYXRhbGluZXtTU0x2M19NRVRIT0R9Ci1cZGF0YWxpbmV7U1NMdjIzX01FVEhPRH0KLVxkYXRhbGluZXtUTFN2MV9NRVRIT0R9Ci1UaGVzZSBjb25zdGFudHMgcmVwcmVzZW50IHRoZSBkaWZmZXJlbnQgU1NMIG1ldGhvZHMgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYQotY29udGV4dCBvYmplY3QuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1ZFUklGWV9OT05FfQotXGRhdGFsaW5le1ZFUklGWV9QRUVSfQotXGRhdGFsaW5le1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVH0KLVRoZXNlIGNvbnN0YW50cyByZXByZXNlbnQgdGhlIHZlcmlmaWNhdGlvbiBtb2RlIHVzZWQgYnkgdGhlIENvbnRleHQKLW9iamVjdCdzIFxtZXRob2R7c2V0X3ZlcmlmeX0gbWV0aG9kLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtGSUxFVFlQRV9QRU19Ci1cZGF0YWxpbmV7RklMRVRZUEVfQVNOMX0KLUZpbGUgdHlwZSBjb25zdGFudHMgdXNlZCB3aXRoIHRoZSBcbWV0aG9ke3VzZV9jZXJ0aWZpY2F0ZV9maWxlfSBhbmQKLVxtZXRob2R7dXNlX3ByaXZhdGVrZXlfZmlsZX0gbWV0aG9kcyBvZiBDb250ZXh0IG9iamVjdHMuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e09QX1NJTkdMRV9ESF9VU0V9Ci1cZGF0YWxpbmV7T1BfRVBIRU1FUkFMX1JTQX0KLVxkYXRhbGluZXtPUF9OT19TU0x2Mn0KLVxkYXRhbGluZXtPUF9OT19TU0x2M30KLVxkYXRhbGluZXtPUF9OT19UTFN2MX0KLUNvbnN0YW50cyB1c2VkIHdpdGggXG1ldGhvZHtzZXRfb3B0aW9uc30gb2YgQ29udGV4dCBvYmplY3RzLgotXGNvbnN0YW50e09QX1NJTkdMRV9ESF9VU0V9IG1lYW5zIHRvIGFsd2F5cyBjcmVhdGUgYSBuZXcga2V5IHdoZW4gdXNpbmcgZXBoZW1lcmFsCi1EaWZmaWUtSGVsbG1hbi4gXGNvbnN0YW50e09QX0VQSEVNRVJBTF9SU0F9IG1lYW5zIHRvIGFsd2F5cyB1c2UgZXBoZW1lcmFsIFJTQSBrZXlzCi13aGVuIGRvaW5nIFJTQSBvcGVyYXRpb25zLiBcY29uc3RhbnR7T1BfTk9fU1NMdjJ9LCBcY29uc3RhbnR7T1BfTk9fU1NMdjN9IGFuZAotXGNvbnN0YW50e09QX05PX1RMU3YxfSBtZWFucyB0byBkaXNhYmxlIHRob3NlIHNwZWNpZmljIHByb3RvY29scy4gVGhpcyBpcwotaW50ZXJlc3RpbmcgaWYgeW91J3JlIHVzaW5nIGUuZy4gXGNvbnN0YW50e1NTTHYyM19NRVRIT0R9IHRvIGdldCBhbiBTU0x2Mi1jb21wYXRpYmxlCi1oYW5kc2hha2UsIGJ1dCBkb24ndCB3YW50IHRvIHVzZSBTU0x2Mi4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317U1NMRUFZX1ZFUlNJT059Ci1cZGF0YWxpbmV7U1NMRUFZX0NGTEFHU30KLVxkYXRhbGluZXtTU0xFQVlfQlVJTFRfT059Ci1cZGF0YWxpbmV7U1NMRUFZX1BMQVRGT1JNfQotXGRhdGFsaW5le1NTTEVBWV9ESVJ9Ci1Db25zdGFudHMgdXNlZCB3aXRoIFxtZXRob2R7U1NMZWF5X3ZlcnNpb259IHRvIHNwZWNpZnkgd2hhdCBPcGVuU1NMIHZlcnNpb24KLWluZm9ybWF0aW9uIHRvIHJldHJpZXZlLiAgU2VlIHRoZSBtYW4gcGFnZSBmb3IgdGhlIFxmdW5jdGlvbntTU0xlYXlfdmVyc2lvbn0gQwotQVBJIGZvciBkZXRhaWxzLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtPUEVOU1NMX1ZFUlNJT05fTlVNQkVSfQotQW4gaW50ZWdlciBnaXZpbmcgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBPcGVuU1NMIGxpYnJhcnkgdXNlZCB0byBidWlsZCB0aGlzCi12ZXJzaW9uIG9mIHB5T3BlblNTTC4gIFNlZSB0aGUgbWFuIHBhZ2UgZm9yIHRoZSBcZnVuY3Rpb257U1NMZWF5X3ZlcnNpb259IEMgQVBJCi1mb3IgZGV0YWlscy4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317U1NMZWF5X3ZlcnNpb259e3R5cGV9Ci1SZXRyaWV2ZSBhIHN0cmluZyBkZXNjcmliaW5nIHNvbWUgYXNwZWN0IG9mIHRoZSB1bmRlcmx5aW5nIE9wZW5TU0wgdmVyc2lvbi4gIFRoZQotdHlwZSBwYXNzZWQgaW4gc2hvdWxkIGJlIG9uZSBvZiB0aGUgXGNvbnN0YW50e1NTTEVBWV8qfSBjb25zdGFudHMgZGVmaW5lZCBpbgotdGhpcyBtb2R1bGUuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0NvbnRleHRUeXBlfQotU2VlIFxjbGFzc3tDb250ZXh0fS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0NvbnRleHR9e21ldGhvZH0KLUEgY2xhc3MgcmVwcmVzZW50aW5nIFNTTCBjb250ZXh0cy4gIENvbnRleHRzIGRlZmluZSB0aGUgcGFyYW1ldGVycyBvZiBvbmUgb3IKLW1vcmUgU1NMIGNvbm5lY3Rpb25zLgotCi1cdmFye21ldGhvZH0gc2hvdWxkIGJlIFxjb25zdGFudHtTU0x2Ml9NRVRIT0R9LCBcY29uc3RhbnR7U1NMdjNfTUVUSE9EfSwKLVxjb25zdGFudHtTU0x2MjNfTUVUSE9EfSBvciBcY29uc3RhbnR7VExTdjFfTUVUSE9EfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e0Nvbm5lY3Rpb25UeXBlfQotU2VlIFxjbGFzc3tDb25uZWN0aW9ufS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0Nvbm5lY3Rpb259e2NvbnRleHQsIHNvY2tldH0KLUEgY2xhc3MgcmVwcmVzZW50aW5nIFNTTCBjb25uZWN0aW9ucy4KLQotXHZhcntjb250ZXh0fSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgXGNsYXNze0NvbnRleHR9IGFuZCBcdmFye3NvY2tldH0KLXNob3VsZCBiZSBhIHNvY2tldCBcZm9vdG5vdGV7QWN0dWFsbHksIGFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIGFuIG9iamVjdAotdGhhdCBcZW1waHtiZWhhdmVzfSBsaWtlIGEgc29ja2V0LCB5b3UgY291bGQgZXZlbiB1c2UgZmlsZXMsIGV2ZW4gdGhvdWdoCi1pdCdkIGJlIHRyaWNreSB0byBnZXQgdGhlIGhhbmRzaGFrZXMgcmlnaHQhfSBvYmplY3QuICBcdmFye3NvY2tldH0gbWF5IGJlCi1cdmFye05vbmV9OyBpbiB0aGlzIGNhc2UsIHRoZSBDb25uZWN0aW9uIGlzIGNyZWF0ZWQgd2l0aCBhIG1lbW9yeSBCSU86IHNlZQotdGhlIFxtZXRob2R7YmlvX3JlYWR9LCBcbWV0aG9ke2Jpb193cml0ZX0sIGFuZCBcbWV0aG9ke2Jpb19zaHV0ZG93bn0KLW1ldGhvZHMuCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e0Vycm9yfQotVGhpcyBleGNlcHRpb24gaXMgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIHRoZSBvdGhlciBTU0wtcmVsYXRlZAotZXhjZXB0aW9ucywgYnV0IG1heSBhbHNvIGJlIHJhaXNlZCBkaXJlY3RseS4KLQotV2hlbmV2ZXIgdGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIGRpcmVjdGx5LCBpdCBoYXMgYSBsaXN0IG9mIGVycm9yIG1lc3NhZ2VzCi1mcm9tIHRoZSBPcGVuU1NMIGVycm9yIHF1ZXVlLCB3aGVyZSBlYWNoIGl0ZW0gaXMgYSB0dXBsZSBcY29kZXsoXHZhcntsaWJ9LAotXHZhcntmdW5jdGlvbn0sIFx2YXJ7cmVhc29ufSl9LiBIZXJlIFx2YXJ7bGlifSwgXHZhcntmdW5jdGlvbn0gYW5kIFx2YXJ7cmVhc29ufQotYXJlIGFsbCBzdHJpbmdzLCBkZXNjcmliaW5nIHdoZXJlIGFuZCB3aGF0IHRoZSBwcm9ibGVtIGlzLiBTZWUgXG1hbnBhZ2V7ZXJyfXszfQotZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtaZXJvUmV0dXJuRXJyb3J9Ci1UaGlzIGV4Y2VwdGlvbiBtYXRjaGVzIHRoZSBlcnJvciByZXR1cm4gY29kZSBcY29kZXtTU0xfRVJST1JfWkVST19SRVRVUk59LCBhbmQKLWlzIHJhaXNlZCB3aGVuIHRoZSBTU0wgQ29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuIEluIFNTTCAzLjAgYW5kIFRMUyAxLjAsIHRoaXMKLW9ubHkgb2NjdXJzIGlmIGEgY2xvc3VyZSBhbGVydCBoYXMgb2NjdXJyZWQgaW4gdGhlIHByb3RvY29sLCBpLmUuIHRoZQotY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQgY2xlYW5seS4gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkKLW1lYW4gdGhhdCB0aGUgdHJhbnNwb3J0IGxheWVyIChlLmcuIGEgc29ja2V0KSBoYXMgYmVlbiBjbG9zZWQuCi0KLUl0IG1heSBzZWVtIGEgbGl0dGxlIHN0cmFuZ2UgdGhhdCB0aGlzIGlzIGFuIGV4Y2VwdGlvbiwgYnV0IGl0IGRvZXMgbWF0Y2ggYW4KLVxjb2Rle1NTTF9FUlJPUn0gY29kZSwgYW5kIGlzIHZlcnkgY29udmVuaWVudC4KLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e1dhbnRSZWFkRXJyb3J9Ci1UaGUgb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGU7IHRoZSBzYW1lIEkvTyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZ2FpbgotbGF0ZXIsIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzLiBBbnkgSS9PIG1ldGhvZCBjYW4gbGVhZCB0byB0aGlzIHNpbmNlIG5ldwotaGFuZHNoYWtlcyBjYW4gb2NjdXIgYXQgYW55IHRpbWUuCi0KLVRoZSB3YW50ZWQgcmVhZCBpcyBmb3IgXGVtcGh7ZGlydHl9IGRhdGEgc2VudCBvdmVyIHRoZSBuZXR3b3JrLCBub3QgdGhlCi1cZW1waHtjbGVhbn0gZGF0YSBpbnNpZGUgdGhlIHR1bm5lbC4gIEZvciBhIHNvY2tldCBiYXNlZCBTU0wgY29ubmVjdGlvbiwKLVxlbXBoe3JlYWR9IG1lYW5zIGRhdGEgY29taW5nIGF0IHVzIG92ZXIgdGhlIG5ldHdvcmsuICBVbnRpbCB0aGF0IHJlYWQKLXN1Y2NlZWRzLCB0aGUgYXR0ZW1wdGVkIFxtZXRob2R7T3BlblNTTC5TU0wuQ29ubmVjdGlvbi5yZWN2fSwKLVxtZXRob2R7T3BlblNTTC5TU0wuQ29ubmVjdGlvbi5zZW5kfSwgb3IKLVxtZXRob2R7T3BlblNTTC5TU0wuQ29ubmVjdGlvbi5kb19oYW5kc2hha2V9IGlzIHByZXZlbnRlZCBvciBpbmNvbXBsZXRlLiBZb3UKLXByb2JhYmx5IHdhbnQgdG8gXG1ldGhvZHtzZWxlY3QoKX0gb24gdGhlIHNvY2tldCBiZWZvcmUgdHJ5aW5nIGFnYWluLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317V2FudFdyaXRlRXJyb3J9Ci1TZWUgXGV4Y2VwdGlvbntXYW50UmVhZEVycm9yfS4gIFRoZSBzb2NrZXQgc2VuZCBidWZmZXIgbWF5IGJlIHRvbyBmdWxsIHRvCi13cml0ZSBtb3JlIGRhdGEuCi1cZW5ke2V4Y2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtXYW50WDUwOUxvb2t1cEVycm9yfQotVGhlIG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gY2FsbGJhY2sgaGFzIGFza2VkIHRvIGJlCi1jYWxsZWQgYWdhaW4uIFRoZSBJL08gbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gbGF0ZXIsIHdpdGggdGhlIHNhbWUKLWFyZ3VtZW50cy4gTm90ZTogVGhpcyB3b24ndCBvY2N1ciBpbiB0aGlzIHZlcnNpb24sIGFzIHRoZXJlIGFyZSBubyBzdWNoCi1jYWxsYmFja3MgaW4gdGhpcyB2ZXJzaW9uLgotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZXhjZGVzY317U3lzQ2FsbEVycm9yfQotVGhlIFxleGNlcHRpb257U3lzQ2FsbEVycm9yfSBvY2N1cnMgd2hlbiB0aGVyZSdzIGFuIEkvTyBlcnJvciBhbmQgT3BlblNTTCdzCi1lcnJvciBxdWV1ZSBkb2VzIG5vdCBjb250YWluIGFueSBpbmZvcm1hdGlvbi4gVGhpcyBjYW4gbWVhbiB0d28gdGhpbmdzOiBBbgotZXJyb3IgaW4gdGhlIHRyYW5zcG9ydCBwcm90b2NvbCwgb3IgYW4gZW5kIG9mIGZpbGUgdGhhdCB2aW9sYXRlcyB0aGUgcHJvdG9jb2wuCi1UaGUgcGFyYW1ldGVyIHRvIHRoZSBleGNlcHRpb24gaXMgYWx3YXlzIGEgcGFpciBcY29kZXsoXHZhcntlcnJudW19LAotXHZhcntlcnJzdHJ9KX0uCi1cZW5ke2V4Y2Rlc2N9Ci0KLQotXHN1YnN1YnNlY3Rpb257Q29udGV4dCBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLWNvbnRleHR9fQotCi1Db250ZXh0IG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtjaGVja19wcml2YXRla2V5fXt9Ci1DaGVjayBpZiB0aGUgcHJpdmF0ZSBrZXkgKGxvYWRlZCB3aXRoIFxtZXRob2R7dXNlX3ByaXZhdGVrZXlcb3B0aW9uYWx7X2ZpbGV9fSkKLW1hdGNoZXMgdGhlIGNlcnRpZmljYXRlIChsb2FkZWQgd2l0aCBcbWV0aG9ke3VzZV9jZXJ0aWZpY2F0ZVxvcHRpb25hbHtfZmlsZX19KS4KLVJldHVybnMgXGNvZGV7Tm9uZX0gaWYgdGhleSBtYXRjaCwgcmFpc2VzIFxleGNlcHRpb257RXJyb3J9IG90aGVyd2lzZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde2dldF9hcHBfZGF0YX17fQotUmV0cmlldmUgYXBwbGljYXRpb24gZGF0YSBhcyBzZXQgYnkgXG1ldGhvZHtzZXRfYXBwX2RhdGF9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17Z2V0X2NlcnRfc3RvcmV9e30KLVJldHJpZXZlIHRoZSBjZXJ0aWZpY2F0ZSBzdG9yZSAoYSBYNTA5U3RvcmUgb2JqZWN0KSB0aGF0IHRoZSBjb250ZXh0IHVzZXMuCi1UaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCAidHJ1c3RlZCIgY2VydGlmaWNhdGVzIHdpdGhvdXQgdXNpbmcgdGhlLgotXG1ldGhvZHtsb2FkX3ZlcmlmeV9sb2NhdGlvbnMoKX0gbWV0aG9kLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17Z2V0X3RpbWVvdXR9e30KLVJldHJpZXZlIHNlc3Npb24gdGltZW91dCwgYXMgc2V0IGJ5IFxtZXRob2R7c2V0X3RpbWVvdXR9LiBUaGUgZGVmYXVsdCBpcyAzMDAKLXNlY29uZHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtnZXRfdmVyaWZ5X2RlcHRofXt9Ci1SZXRyaWV2ZSB0aGUgQ29udGV4dCBvYmplY3QncyB2ZXJpZnkgZGVwdGgsIGFzIHNldCBieQotXG1ldGhvZHtzZXRfdmVyaWZ5X2RlcHRofS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde2dldF92ZXJpZnlfbW9kZX17fQotUmV0cmlldmUgdGhlIENvbnRleHQgb2JqZWN0J3MgdmVyaWZ5IG1vZGUsIGFzIHNldCBieSBcbWV0aG9ke3NldF92ZXJpZnl9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17bG9hZF9jbGllbnRfY2F9e3BlbWZpbGV9Ci1SZWFkIGEgZmlsZSB3aXRoIFBFTS1mb3JtYXR0ZWQgY2VydGlmaWNhdGVzIHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQKLXdoZW4gcmVxdWVzdGluZyBhIGNsaWVudCBjZXJ0aWZpY2F0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3NldF9jbGllbnRfY2FfbGlzdH17Y2VydGlmaWNhdGVfYXV0aG9yaXRpZXN9Ci1SZXBsYWNlIHRoZSBjdXJyZW50IGxpc3Qgb2YgcHJlZmVycmVkIGNlcnRpZmljYXRlIHNpZ25lcnMgdGhhdCB3b3VsZCBiZQotc2VudCB0byB0aGUgY2xpZW50IHdoZW4gcmVxdWVzdGluZyBhIGNsaWVudCBjZXJ0aWZpY2F0ZSB3aXRoIHRoZQotXHZhcntjZXJ0aWZpY2F0ZV9hdXRob3JpdGllc30gc2VxdWVuY2Ugb2YgXGNsYXNze09wZW5TU0wuY3J5cHRvLlg1MDlOYW1lfXMuCi0KLVx2ZXJzaW9uYWRkZWR7MC4xMH0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde2FkZF9jbGllbnRfY2F9e2NlcnRpZmljYXRlX2F1dGhvcml0eX0KLUV4dHJhY3QgYSBcY2xhc3N7T3BlblNTTC5jcnlwdG8uWDUwOU5hbWV9IGZyb20gdGhlIFx2YXJ7Y2VydGlmaWNhdGVfYXV0aG9yaXR5fQotXGNsYXNze09wZW5TU0wuY3J5cHRvLlg1MDl9IGNlcnRpZmljYXRlIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcHJlZmVycmVkCi1jZXJ0aWZpY2F0ZSBzaWduZXJzIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIHJlcXVlc3RpbmcgYSBjbGllbnQgY2VydGlmaWNhdGUuCi0KLVx2ZXJzaW9uYWRkZWR7MC4xMH0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde2xvYWRfdmVyaWZ5X2xvY2F0aW9uc317cGVtZmlsZSwgY2FwYXRofQotU3BlY2lmeSB3aGVyZSBDQSBjZXJ0aWZpY2F0ZXMgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3NlcyBhcmUgbG9jYXRlZC4gVGhlc2UKLWFyZSB0cnVzdGVkIGNlcnRpZmljYXRlcy4gTm90ZSB0aGF0IHRoZSBjZXJ0aWZpY2F0ZXMgaGF2ZSB0byBiZSBpbiBQRU0KLWZvcm1hdC4gIElmIGNhcGF0aCBpcyBwYXNzZWQsIGl0IG11c3QgYmUgYSBkaXJlY3RvcnkgcHJlcGFyZWQgdXNpbmcgdGhlCi1cY29kZXtjX3JlaGFzaH0gdG9vbCBpbmNsdWRlZCB3aXRoIE9wZW5TU0wuICBFaXRoZXIsIGJ1dCBub3QgYm90aCwgb2YKLVx2YXJ7cGVtZmlsZX0gb3IgXHZhcntjYXBhdGh9IG1heSBiZSBcY29kZXtOb25lfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRoc317fQotU3BlY2lmeSB0aGF0IHRoZSBwbGF0Zm9ybSBwcm92aWRlZCBDQSBjZXJ0aWZpY2F0ZXMgYXJlIHRvIGJlIHVzZWQgZm9yCi12ZXJpZmljYXRpb24gcHVycG9zZXMuICBUaGlzIG1ldGhvZCBtYXkgbm90IHdvcmsgcHJvcGVybHkgb24gT1MgWC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde2xvYWRfdG1wX2RofXtkaGZpbGV9Ci1Mb2FkIHBhcmFtZXRlcnMgZm9yIEVwaGVtZXJhbCBEaWZmaWUtSGVsbG1hbiBmcm9tIFx2YXJ7ZGhmaWxlfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3NldF9hcHBfZGF0YX17ZGF0YX0KLUFzc29jaWF0ZSBcdmFye2RhdGF9IHdpdGggdGhpcyBDb250ZXh0IG9iamVjdC4gXHZhcntkYXRhfSBjYW4gYmUgcmV0cmlldmVkCi1sYXRlciB1c2luZyB0aGUgXG1ldGhvZHtnZXRfYXBwX2RhdGF9IG1ldGhvZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3NldF9jaXBoZXJfbGlzdH17Y2lwaGVyc30KLVNldCB0aGUgbGlzdCBvZiBjaXBoZXJzIHRvIGJlIHVzZWQgaW4gdGhpcyBjb250ZXh0LiBTZWUgdGhlIE9wZW5TU0wgbWFudWFsIGZvcgotbW9yZSBpbmZvcm1hdGlvbiAoZS5nLiBjaXBoZXJzKDEpKQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17c2V0X2luZm9fY2FsbGJhY2t9e2NhbGxiYWNrfQotU2V0IHRoZSBpbmZvcm1hdGlvbiBjYWxsYmFjayB0byBcdmFye2NhbGxiYWNrfS4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAotZnJvbSB0aW1lIHRvIHRpbWUgZHVyaW5nIFNTTCBoYW5kc2hha2VzLgotXHZhcntjYWxsYmFja30gc2hvdWxkIHRha2UgdGhyZWUgYXJndW1lbnRzOiBhIENvbm5lY3Rpb24gb2JqZWN0IGFuZCB0d28KLWludGVnZXJzLiBUaGUgZmlyc3QgaW50ZWdlciBzcGVjaWZpZXMgd2hlcmUgaW4gdGhlIFNTTCBoYW5kc2hha2UgdGhlIGZ1bmN0aW9uCi13YXMgY2FsbGVkLCBhbmQgdGhlIG90aGVyIHRoZSByZXR1cm4gY29kZSBmcm9tIGEgKHBvc3NpYmx5IGZhaWxlZCkgaW50ZXJuYWwKLWZ1bmN0aW9uIGNhbGwuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtzZXRfb3B0aW9uc317b3B0aW9uc30KLUFkZCBTU0wgb3B0aW9ucy4gT3B0aW9ucyB5b3UgaGF2ZSBzZXQgYmVmb3JlIGFyZSBub3QgY2xlYXJlZCEKLVRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIFxjb25zdGFudHtPUF8qfSBjb25zdGFudHMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtzZXRfcGFzc3dkX2NifXtjYWxsYmFja1xvcHRpb25hbHssIHVzZXJkYXRhfX0KLVNldCB0aGUgcGFzc3BocmFzZSBjYWxsYmFjayB0byBcdmFye2NhbGxiYWNrfS4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAotd2hlbiBhIHByaXZhdGUga2V5IHdpdGggYSBwYXNzcGhyYXNlIGlzIGxvYWRlZC4gXHZhcntjYWxsYmFja30gbXVzdCBhY2NlcHQKLXRocmVlIHBvc2l0aW9uYWwgYXJndW1lbnRzLiAgRmlyc3QsIGFuIGludGVnZXIgZ2l2aW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZgotdGhlIHBhc3NwaHJhc2UgaXQgbWF5IHJldHVybi4gIElmIHRoZSByZXR1cm5lZCBwYXNzcGhyYXNlIGlzIGxvbmdlciB0aGFuCi10aGlzLCBpdCB3aWxsIGJlIHRydW5jYXRlZC4gIFNlY29uZCwgYSBib29sZWFuIHZhbHVlIHdoaWNoIHdpbGwgYmUgdHJ1ZSBpZgotdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIGZvciB0aGUgcGFzc3BocmFzZSB0d2ljZSBhbmQgdGhlIGNhbGxiYWNrIHNob3VsZAotdmVyaWZ5IHRoYXQgdGhlIHR3byB2YWx1ZXMgc3VwcGxpZWQgYXJlIGVxdWFsLiBUaGlyZCwgdGhlIHZhbHVlIGdpdmVuIGFzIHRoZQotXHZhcnt1c2VyZGF0YX0gcGFyYW1ldGVyIHRvIFxtZXRob2R7c2V0X3Bhc3N3ZF9jYn0uICBJZiBhbiBlcnJvciBvY2N1cnMsCi1cdmFye2NhbGxiYWNrfSBzaG91bGQgcmV0dXJuIGEgZmFsc2UgdmFsdWUgKGUuZy4gYW4gZW1wdHkgc3RyaW5nKS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3NldF9zZXNzaW9uX2lkfXtuYW1lfQotU2V0IHRoZSBjb250ZXh0IFx2YXJ7bmFtZX0gd2l0aGluIHdoaWNoIGEgc2Vzc2lvbiBjYW4gYmUgcmV1c2VkIGZvciB0aGlzCi1Db250ZXh0IG9iamVjdC4gVGhpcyBpcyBuZWVkZWQgd2hlbiBkb2luZyBzZXNzaW9uIHJlc3VtcHRpb24sIGJlY2F1c2UgdGhlcmUgaXMKLW5vIHdheSBmb3IgYSBzdG9yZWQgc2Vzc2lvbiB0byBrbm93IHdoaWNoIENvbnRleHQgb2JqZWN0IGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLVx2YXJ7bmFtZX0gbWF5IGJlIGFueSBiaW5hcnkgZGF0YS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3NldF90aW1lb3V0fXt0aW1lb3V0fQotU2V0IHRoZSB0aW1lb3V0IGZvciBuZXdseSBjcmVhdGVkIHNlc3Npb25zIGZvciB0aGlzIENvbnRleHQgb2JqZWN0IHRvCi1cdmFye3RpbWVvdXR9LiBcdmFye3RpbWVvdXR9IG11c3QgYmUgZ2l2ZW4gaW4gKHdob2xlKSBzZWNvbmRzLiBUaGUgZGVmYXVsdAotdmFsdWUgaXMgMzAwIHNlY29uZHMuIFNlZSB0aGUgT3BlblNTTCBtYW51YWwgZm9yIG1vcmUgaW5mb3JtYXRpb24gKGUuZy4KLVNTTF9DVFhfc2V0X3RpbWVvdXQoMykpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17c2V0X3ZlcmlmeX17bW9kZSwgY2FsbGJhY2t9Ci1TZXQgdGhlIHZlcmlmaWNhdGlvbiBmbGFncyBmb3IgdGhpcyBDb250ZXh0IG9iamVjdCB0byBcdmFye21vZGV9IGFuZCBzcGVjaWZ5Ci10aGF0IFx2YXJ7Y2FsbGJhY2t9IHNob3VsZCBiZSB1c2VkIGZvciB2ZXJpZmljYXRpb24gY2FsbGJhY2tzLiBcdmFye21vZGV9Ci1zaG91bGQgYmUgb25lIG9mIFxjb25zdGFudHtWRVJJRllfTk9ORX0gYW5kIFxjb25zdGFudHtWRVJJRllfUEVFUn0uIElmCi1cY29uc3RhbnR7VkVSSUZZX1BFRVJ9IGlzIHVzZWQsIFx2YXJ7bW9kZX0gY2FuIGJlIE9SOmVkIHdpdGgKLVxjb25zdGFudHtWRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlR9IGFuZCBcY29uc3RhbnR7VkVSSUZZX0NMSUVOVF9PTkNFfSB0bwotZnVydGhlciBjb250cm9sIHRoZSBiZWhhdmlvdXIuCi1cdmFye2NhbGxiYWNrfSBzaG91bGQgdGFrZSBmaXZlIGFyZ3VtZW50czogQSBDb25uZWN0aW9uIG9iamVjdCwgYW4gWDUwOSBvYmplY3QsCi1hbmQgdGhyZWUgaW50ZWdlciB2YXJpYWJsZXMsIHdoaWNoIGFyZSBpbiB0dXJuIHBvdGVudGlhbCBlcnJvciBudW1iZXIsIGVycm9yCi1kZXB0aCBhbmQgcmV0dXJuIGNvZGUuIFx2YXJ7Y2FsbGJhY2t9IHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB2ZXJpZmljYXRpb24gcGFzc2VzCi1hbmQgZmFsc2Ugb3RoZXJ3aXNlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17c2V0X3ZlcmlmeV9kZXB0aH17ZGVwdGh9Ci1TZXQgdGhlIG1heGltdW0gZGVwdGggZm9yIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB2ZXJpZmljYXRpb24gdGhhdCBzaGFsbCBiZQotYWxsb3dlZCBmb3IgdGhpcyBDb250ZXh0IG9iamVjdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3VzZV9jZXJ0aWZpY2F0ZX17Y2VydH0KLVVzZSB0aGUgY2VydGlmaWNhdGUgXHZhcntjZXJ0fSB3aGljaCBoYXMgdG8gYmUgYSBYNTA5IG9iamVjdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde2FkZF9leHRyYV9jaGFpbl9jZXJ0fXtjZXJ0fQotQWRkcyB0aGUgY2VydGlmaWNhdGUgXHZhcntjZXJ0fSwgd2hpY2ggaGFzIHRvIGJlIGEgWDUwOSBvYmplY3QsIHRvIHRoZQotY2VydGlmaWNhdGUgY2hhaW4gcHJlc2VudGVkIHRvZ2V0aGVyIHdpdGggdGhlIGNlcnRpZmljYXRlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17dXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGV9e2ZpbGV9Ci1Mb2FkIGEgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSBcdmFye2ZpbGV9IHdoaWNoIG11c3QgYmUgUEVNIGVuY29kZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXt1c2VfcHJpdmF0ZWtleX17cGtleX0KLVVzZSB0aGUgcHJpdmF0ZSBrZXkgXHZhcntwa2V5fSB3aGljaCBoYXMgdG8gYmUgYSBQS2V5IG9iamVjdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3VzZV9jZXJ0aWZpY2F0ZV9maWxlfXtmaWxlXG9wdGlvbmFseywgZm9ybWF0fX0KLUxvYWQgdGhlIGZpcnN0IGNlcnRpZmljYXRlIGZvdW5kIGluIFx2YXJ7ZmlsZX0uIFRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGJlIGluIHRoZQotZm9ybWF0IHNwZWNpZmllZCBieSBcdmFye2Zvcm1hdH0sIHdoaWNoIGlzIGVpdGhlciBcY29uc3RhbnR7RklMRVRZUEVfUEVNfSBvcgotXGNvbnN0YW50e0ZJTEVUWVBFX0FTTjF9LiBUaGUgZGVmYXVsdCBpcyBcY29uc3RhbnR7RklMRVRZUEVfUEVNfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3VzZV9wcml2YXRla2V5X2ZpbGV9e2ZpbGVcb3B0aW9uYWx7LCBmb3JtYXR9fQotTG9hZCB0aGUgZmlyc3QgcHJpdmF0ZSBrZXkgZm91bmQgaW4gXHZhcntmaWxlfS4gVGhlIHByaXZhdGUga2V5IG11c3QgYmUgaW4gdGhlCi1mb3JtYXQgc3BlY2lmaWVkIGJ5IFx2YXJ7Zm9ybWF0fSwgd2hpY2ggaXMgZWl0aGVyIFxjb25zdGFudHtGSUxFVFlQRV9QRU19IG9yCi1cY29uc3RhbnR7RklMRVRZUEVfQVNOMX0uIFRoZSBkZWZhdWx0IGlzIFxjb25zdGFudHtGSUxFVFlQRV9QRU19LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17c2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrfXtjYWxsYmFja30KLVNwZWNpZnkgYSBvbmUtYXJndW1lbnQgY2FsbGFibGUgdG8gdXNlIGFzIHRoZSBUTFMgZXh0ZW5zaW9uIHNlcnZlciBuYW1lCi1jYWxsYmFjay4gIFdoZW4gYSBjb25uZWN0aW9uIHVzaW5nIHRoZSBzZXJ2ZXIgbmFtZSBleHRlbnNpb24gaXMgbWFkZSB1c2luZyB0aGlzCi1jb250ZXh0LCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIFxjb2Rle0Nvbm5lY3Rpb259IGluc3RhbmNlLgotXHZlcnNpb25hZGRlZHswLjEzfQotXGVuZHttZXRob2RkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntDb25uZWN0aW9uIG9iamVjdHMgXGxhYmVse29wZW5zc2wtY29ubmVjdGlvbn19Ci0KLUNvbm5lY3Rpb24gb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2FjY2VwdH17fQotQ2FsbCB0aGUgXG1ldGhvZHthY2NlcHR9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQgYW5kIHNldCB1cCBTU0wgb24gdGhlCi1yZXR1cm5lZCBzb2NrZXQsIHVzaW5nIHRoZSBDb250ZXh0IG9iamVjdCBzdXBwbGllZCB0byB0aGlzIENvbm5lY3Rpb24gb2JqZWN0IGF0Ci1jcmVhdGlvbi4gUmV0dXJucyBhIHBhaXIgXGNvZGV7KFx2YXJ7Y29ubn0sIFx2YXJ7YWRkcmVzc30pfS4gd2hlcmUgXHZhcntjb25ufQotaXMgdGhlIG5ldyBDb25uZWN0aW9uIG9iamVjdCBjcmVhdGVkLCBhbmQgXHZhcnthZGRyZXNzfSBpcyBhcyByZXR1cm5lZCBieSB0aGUKLXNvY2tldCdzIFxtZXRob2R7YWNjZXB0fS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2JpbmR9e2FkZHJlc3N9Ci1DYWxsIHRoZSBcbWV0aG9ke2JpbmR9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtjbG9zZX17fQotQ2FsbCB0aGUgXG1ldGhvZHtjbG9zZX0gbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gTm90ZTogSWYgeW91IHdhbnQKLWNvcnJlY3QgU1NMIGNsb3N1cmUsIHlvdSBuZWVkIHRvIGNhbGwgdGhlIFxtZXRob2R7c2h1dGRvd259IG1ldGhvZCBmaXJzdC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2Nvbm5lY3R9e2FkZHJlc3N9Ci1DYWxsIHRoZSBcbWV0aG9ke2Nvbm5lY3R9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQgYW5kIHNldCB1cCBTU0wgb24gdGhlCi1zb2NrZXQsIHVzaW5nIHRoZSBDb250ZXh0IG9iamVjdCBzdXBwbGllZCB0byB0aGlzIENvbm5lY3Rpb24gb2JqZWN0IGF0Ci1jcmVhdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2Nvbm5lY3RfZXh9e2FkZHJlc3N9Ci1DYWxsIHRoZSBcbWV0aG9ke2Nvbm5lY3RfZXh9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQgYW5kIHNldCB1cCBTU0wgb24KLXRoZSBzb2NrZXQsIHVzaW5nIHRoZSBDb250ZXh0IG9iamVjdCBzdXBwbGllZCB0byB0aGlzIENvbm5lY3Rpb24gb2JqZWN0IGF0Ci1jcmVhdGlvbi4gTm90ZSB0aGF0IGlmIHRoZSBcbWV0aG9ke2Nvbm5lY3RfZXh9IG1ldGhvZCBvZiB0aGUgc29ja2V0IGRvZXNuJ3QKLXJldHVybiAwLCBTU0wgd29uJ3QgYmUgaW5pdGlhbGl6ZWQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtkb19oYW5kc2hha2V9e30KLVBlcmZvcm0gYW4gU1NMIGhhbmRzaGFrZSAodXN1YWxseSBjYWxsZWQgYWZ0ZXIgXG1ldGhvZHtyZW5lZ290aWF0ZX0gb3Igb25lIG9mCi1cbWV0aG9ke3NldF9hY2NlcHRfc3RhdGV9IG9yIFxtZXRob2R7c2V0X2FjY2VwdF9zdGF0ZX0pLiBUaGlzIGNhbiByYWlzZSB0aGUKLXNhbWUgZXhjZXB0aW9ucyBhcyBcbWV0aG9ke3NlbmR9IGFuZCBcbWV0aG9ke3JlY3Z9LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17ZmlsZW5vfXt9Ci1SZXRyaWV2ZSB0aGUgZmlsZSBkZXNjcmlwdG9yIG51bWJlciBmb3IgdGhlIHVuZGVybHlpbmcgc29ja2V0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17bGlzdGVufXtiYWNrbG9nfQotQ2FsbCB0aGUgXG1ldGhvZHtsaXN0ZW59IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtnZXRfYXBwX2RhdGF9e30KLVJldHJpZXZlIGFwcGxpY2F0aW9uIGRhdGEgYXMgc2V0IGJ5IFxtZXRob2R7c2V0X2FwcF9kYXRhfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2dldF9jaXBoZXJfbGlzdH17fQotUmV0cmlldmUgdGhlIGxpc3Qgb2YgY2lwaGVycyB1c2VkIGJ5IHRoZSBDb25uZWN0aW9uIG9iamVjdC4gV0FSTklORzogVGhpcyBBUEkKLWhhcyBjaGFuZ2VkLiBJdCB1c2VkIHRvIHRha2UgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCBqdXN0IHJldHVybiBhIHN0cmluZywKLWJ1dCBub3QgaXQgcmV0dXJucyB0aGUgZW50aXJlIGxpc3QgaW4gb25lIGdvLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Z2V0X2NsaWVudF9jYV9saXN0fXt9Ci1SZXRyaWV2ZSB0aGUgbGlzdCBvZiBwcmVmZXJyZWQgY2xpZW50IGNlcnRpZmljYXRlIGlzc3VlcnMgc2VudCBieSB0aGUgc2VydmVyCi1hcyBcY2xhc3N7T3BlblNTTC5jcnlwdG8uWDUwOU5hbWV9IG9iamVjdHMuCi0KLUlmIHRoaXMgaXMgYSBjbGllbnQgXGNsYXNze0Nvbm5lY3Rpb259LCB0aGUgbGlzdCB3aWxsIGJlIGVtcHR5IHVudGlsIHRoZQotY29ubmVjdGlvbiB3aXRoIHRoZSBzZXJ2ZXIgaXMgZXN0YWJsaXNoZWQuCi0KLUlmIHRoaXMgaXMgYSBzZXJ2ZXIgXGNsYXNze0Nvbm5lY3Rpb259LCByZXR1cm4gdGhlIGxpc3Qgb2YgY2VydGlmaWNhdGUKLWF1dGhvcml0aWVzIHRoYXQgd2lsbCBiZSBzZW50IG9yIGhhcyBiZWVuIHNlbnQgdG8gdGhlIGNsaWVudCwgYXMgY29udHJvbGxlZAotYnkgdGhpcyBcY2xhc3N7Q29ubmVjdGlvbn0ncyBcY2xhc3N7Q29udGV4dH0uCi0KLVx2ZXJzaW9uYWRkZWR7MC4xMH0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2dldF9jb250ZXh0fXt9Ci1SZXRyaWV2ZSB0aGUgQ29udGV4dCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29ubmVjdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NldF9jb250ZXh0fXtjb250ZXh0fQotU3BlY2lmeSBhIHJlcGxhY2VtZW50IENvbnRleHQgb2JqZWN0IGZvciB0aGlzIENvbm5lY3Rpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtnZXRfcGVlcl9jZXJ0aWZpY2F0ZX17fQotUmV0cmlldmUgdGhlIG90aGVyIHNpZGUncyBjZXJ0aWZpY2F0ZSAoaWYgYW55KQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Z2V0X3BlZXJfY2VydF9jaGFpbn17fQotUmV0cmlldmUgdGhlIHR1cGxlIG9mIHRoZSBvdGhlciBzaWRlJ3MgY2VydGlmaWNhdGUgY2hhaW4gKGlmIGFueSkKLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2dldHBlZXJuYW1lfXt9Ci1DYWxsIHRoZSBcbWV0aG9ke2dldHBlZXJuYW1lfSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Z2V0c29ja25hbWV9e30KLUNhbGwgdGhlIFxtZXRob2R7Z2V0c29ja25hbWV9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtnZXRzb2Nrb3B0fXtsZXZlbCwgb3B0bmFtZVxvcHRpb25hbHssIGJ1Zmxlbn19Ci1DYWxsIHRoZSBcbWV0aG9ke2dldHNvY2tvcHR9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtwZW5kaW5nfXt9Ci1SZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHNhZmVseSByZWFkIGZyb20gdGhlIFNTTCBidWZmZXIKLShcZW1waHtub3R9IHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBidWZmZXIpLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17cmVjdn17YnVmc2l6ZX0KLVJlY2VpdmUgZGF0YSBmcm9tIHRoZSBDb25uZWN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUKLWRhdGEgcmVjZWl2ZWQuIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkIGF0IG9uY2UsIGlzIHNwZWNpZmllZAotYnkgXHZhcntidWZzaXplfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2Jpb193cml0ZX17Ynl0ZXN9Ci1JZiB0aGUgQ29ubmVjdGlvbiB3YXMgY3JlYXRlZCB3aXRoIGEgbWVtb3J5IEJJTywgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gYWRkCi1ieXRlcyB0byB0aGUgcmVhZCBlbmQgb2YgdGhhdCBtZW1vcnkgQklPLiAgVGhlIENvbm5lY3Rpb24gY2FuIHRoZW4gcmVhZCB0aGUKLWJ5dGVzIChmb3IgZXhhbXBsZSwgaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIFxtZXRob2R7cmVjdn0pLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17cmVuZWdvdGlhdGV9e30KLVJlbmVnb3RpYXRlIHRoZSBTU0wgc2Vzc2lvbi4gQ2FsbCB0aGlzIGlmIHlvdSB3aXNoIHRvIGNoYW5nZSBjaXBoZXIgc3VpdGVzIG9yCi1hbnl0aGluZyBsaWtlIHRoYXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzZW5kfXtzdHJpbmd9Ci1TZW5kIHRoZSBcdmFye3N0cmluZ30gZGF0YSB0byB0aGUgQ29ubmVjdGlvbi4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2Jpb19yZWFkfXtidWZzaXplfQotSWYgdGhlIENvbm5lY3Rpb24gd2FzIGNyZWF0ZWQgd2l0aCBhIG1lbW9yeSBCSU8sIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvCi1yZWFkIGJ5dGVzIGZyb20gdGhlIHdyaXRlIGVuZCBvZiB0aGF0IG1lbW9yeSBCSU8uICBNYW55IENvbm5lY3Rpb24gbWV0aG9kcyB3aWxsCi1hZGQgYnl0ZXMgd2hpY2ggbXVzdCBiZSByZWFkIGluIHRoaXMgbWFubmVyIG9yIHRoZSBidWZmZXIgd2lsbCBldmVudHVhbGx5IGZpbGwKLXVwIGFuZCB0aGUgQ29ubmVjdGlvbiB3aWxsIGJlIGFibGUgdG8gdGFrZSBubyBmdXJ0aGVyIGFjdGlvbnMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzZW5kYWxsfXtzdHJpbmd9Ci1TZW5kIGFsbCBvZiB0aGUgXHZhcntzdHJpbmd9IGRhdGEgdG8gdGhlIENvbm5lY3Rpb24uIFRoaXMgY2FsbHMgXG1ldGhvZHtzZW5kfQotcmVwZWF0ZWRseSB1bnRpbCBhbGwgZGF0YSBpcyBzZW50LiBJZiBhbiBlcnJvciBvY2N1cnMsIGl0J3MgaW1wb3NzaWJsZSB0byB0ZWxsCi1ob3cgbXVjaCBkYXRhIGhhcyBiZWVuIHNlbnQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzZXRfYWNjZXB0X3N0YXRlfXt9Ci1TZXQgdGhlIGNvbm5lY3Rpb24gdG8gd29yayBpbiBzZXJ2ZXIgbW9kZS4gVGhlIGhhbmRzaGFrZSB3aWxsIGJlIGhhbmRsZWQKLWF1dG9tYXRpY2FsbHkgYnkgcmVhZC93cml0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NldF9hcHBfZGF0YX17ZGF0YX0KLUFzc29jaWF0ZSBcdmFye2RhdGF9IHdpdGggdGhpcyBDb25uZWN0aW9uIG9iamVjdC4gXHZhcntkYXRhfSBjYW4gYmUgcmV0cmlldmVkCi1sYXRlciB1c2luZyB0aGUgXG1ldGhvZHtnZXRfYXBwX2RhdGF9IG1ldGhvZC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NldF9jb25uZWN0X3N0YXRlfXt9Ci1TZXQgdGhlIGNvbm5lY3Rpb24gdG8gd29yayBpbiBjbGllbnQgbW9kZS4gVGhlIGhhbmRzaGFrZSB3aWxsIGJlIGhhbmRsZWQKLWF1dG9tYXRpY2FsbHkgYnkgcmVhZC93cml0ZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NldGJsb2NraW5nfXtmbGFnfQotQ2FsbCB0aGUgXG1ldGhvZHtzZXRibG9ja2luZ30gbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NldHNvY2tvcHR9e2xldmVsLCBvcHRuYW1lLCB2YWx1ZX0KLUNhbGwgdGhlIFxtZXRob2R7c2V0c29ja29wdH0gbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NodXRkb3dufXt9Ci1TZW5kIHRoZSBzaHV0ZG93biBtZXNzYWdlIHRvIHRoZSBDb25uZWN0aW9uLiBSZXR1cm5zIHRydWUgaWYgdGhlIHNodXRkb3duCi1tZXNzYWdlIGV4Y2hhbmdlIGlzIGNvbXBsZXRlZCBhbmQgZmFsc2Ugb3RoZXJ3aXNlIChpbiB3aGljaCBjYXNlIHlvdSBjYWxsCi1cbWV0aG9ke3JlY3YoKX0gb3IgXG1ldGhvZHtzZW5kKCl9IHdoZW4gdGhlIGNvbm5lY3Rpb24gYmVjb21lcwotcmVhZGFibGUvd3JpdGVhYmxlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Z2V0X3NodXRkb3dufXt9Ci1HZXQgdGhlIHNodXRkb3duIHN0YXRlIG9mIHRoZSBDb25uZWN0aW9uLiAgUmV0dXJucyBhIGJpdHZlY3RvciBvZiBlaXRoZXIgb3IKLWJvdGggb2YgXHZhcntTRU5UX1NIVVRET1dOfSBhbmQgXHZhcntSRUNFSVZFRF9TSFVURE9XTn0uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzZXRfc2h1dGRvd259e3N0YXRlfQotU2V0IHRoZSBzaHV0ZG93biBzdGF0ZSBvZiB0aGUgQ29ubmVjdGlvbi4gIFx2YXJ7c3RhdGV9IGlzIGEgYml0dmVjdG9yIG9mCi1laXRoZXIgb3IgYm90aCBvZiBcdmFye1NFTlRfU0hVVERPV059IGFuZCBcdmFye1JFQ0VJVkVEX1NIVVRET1dOfS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NvY2tfc2h1dGRvd259e2hvd30KLUNhbGwgdGhlIFxtZXRob2R7c2h1dGRvd259IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtiaW9fc2h1dGRvd259e30KLUlmIHRoZSBDb25uZWN0aW9uIHdhcyBjcmVhdGVkIHdpdGggYSBtZW1vcnkgQklPLCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0bwotaW5kaWNhdGUgdGhhdCBgYGVuZCBvZiBmaWxlJycgaGFzIGJlZW4gcmVhY2hlZCBvbiB0aGUgcmVhZCBlbmQgb2YgdGhhdCBtZW1vcnkKLUJJTy4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3N0YXRlX3N0cmluZ317fQotUmV0cmlldmUgYSB2ZXJib3NlIHN0cmluZyBkZXRhaWxpbmcgdGhlIHN0YXRlIG9mIHRoZSBDb25uZWN0aW9uLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Y2xpZW50X3JhbmRvbX17fQotUmV0cmlldmUgdGhlIHJhbmRvbSB2YWx1ZSB1c2VkIHdpdGggdGhlIGNsaWVudCBoZWxsbyBtZXNzYWdlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17c2VydmVyX3JhbmRvbX17fQotUmV0cmlldmUgdGhlIHJhbmRvbSB2YWx1ZSB1c2VkIHdpdGggdGhlIHNlcnZlciBoZWxsbyBtZXNzYWdlLgotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17bWFzdGVyX2tleX17fQotUmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSBtYXN0ZXIga2V5IGZvciB0aGlzIHNlc3Npb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXt3YW50X3JlYWR9e30KLUNoZWNrcyBpZiBtb3JlIGRhdGEgaGFzIHRvIGJlIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyIHRvIGNvbXBsZXRlIGFuCi1vcGVyYXRpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXt3YW50X3dyaXRlfXt9Ci1DaGVja3MgaWYgdGhlcmUgaXMgZGF0YSB0byB3cml0ZSB0byB0aGUgdHJhbnNwb3J0IGxheWVyIHRvIGNvbXBsZXRlIGFuCi1vcGVyYXRpb24uCi1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzZXRfdGxzZXh0X2hvc3RfbmFtZX17bmFtZX0KLVNwZWNpZnkgdGhlIGJ5dGUgc3RyaW5nIHRvIHNlbmQgYXMgdGhlIHNlcnZlciBuYW1lIGluIHRoZSBjbGllbnQgaGVsbG8gbWVzc2FnZS4KLVx2ZXJzaW9uYWRkZWR7MC4xM30KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2dldF9zZXJ2ZXJuYW1lfXt9Ci1HZXQgdGhlIHZhbHVlIG9mIHRoZSBzZXJ2ZXIgbmFtZSByZWNlaXZlZCBpbiB0aGUgY2xpZW50IGhlbGxvIG1lc3NhZ2UuCi1cdmVyc2lvbmFkZGVkezAuMTN9Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLQotCi0KLQotXGVuZHtkb2N1bWVudH0K