CiBPcGVuU1NMIENIQU5HRVMKIF9fX19fX19fX19fX19fXwoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMiBhbmQgMS4xLjAgIFt4eCBYWFggeHh4eF0KCiAgKikgUkFORF9wc2V1ZG9fYnl0ZXMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlcnMgc2hvdWxkIHVzZSBSQU5EIGJ5dGVzIGluc3RlYWQuCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIFRMUyBleHRlbmRlZCBtYXN0ZXIgc2VjcmV0IGZyb20KICAgICBkcmFmdC1pZXRmLXRscy1zZXNzaW9uLWhhc2gtMDMudHh0LiBUaGFua3MgZm9yIEFsZnJlZG8gUGlyb250aSBmb3IgYW4KICAgICBpbml0aWFsIHBhdGNoIHdoaWNoIHdhcyBhIGdyZWF0IGhlbHAgZHVyaW5nIGRldmVsb3BtZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbCBsaWJzc2wgaW50ZXJuYWwgc3RydWN0dXJlcyBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwdWJsaWMgaGVhZGVyCiAgICAgZmlsZXMsIGFuZCB0aGUgT1BFTlNTTF9OT19TU0xfSU5URVJOIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkIChzaW5jZSBpdCBpcwogICAgIG5vdyByZWR1bmRhbnQpLiBVc2VycyBzaG91bGQgbm90IGF0dGVtcHQgdG8gYWNjZXNzIGludGVybmFsIHN0cnVjdHVyZXMKICAgICBkaXJlY3RseS4gSW5zdGVhZCB0aGV5IHNob3VsZCB1c2UgdGhlIHByb3ZpZGVkIEFQSSBmdW5jdGlvbnMuCiAgICAgW01hdHQgQ2Fzd2VsbF0KCiAgKikgY29uZmlnIGhhcyBiZWVuIGNoYW5nZWQgc28gdGhhdCBieSBkZWZhdWx0IE9QRU5TU0xfTk9fREVQUkVDQVRFRCBpcyB1c2VkLgogICAgIEFjY2VzcyB0byBkZXByZWNhdGVkIGZ1bmN0aW9ucyBjYW4gYmUgcmUtZW5hYmxlZCBieSBydW5uaW5nIGNvbmZpZyB3aXRoCiAgICAgImVuYWJsZS1kZXByZWNhdGVkIi4gSW4gYWRkaXRpb24gYXBwbGljYXRpb25zIHdpc2hpbmcgdG8gdXNlIGRlcHJlY2F0ZWQKICAgICBmdW5jdGlvbnMgbXVzdCBkZWZpbmUgT1BFTlNTTF9VU0VfREVQUkVDQVRFRC4gTm90ZSB0aGF0IHRoaXMgbmV3IGJlaGF2aW91cgogICAgIHdpbGwsIGJ5IGRlZmF1bHQsIGRpc2FibGUgc29tZSB0cmFuc2l0aXZlIGluY2x1ZGVzIHRoYXQgcHJldmlvdXNseSBleGlzdGVkCiAgICAgaW4gdGhlIGhlYWRlciBmaWxlcyAoZS5nLiBlYy5oIHdpbGwgbm8gbG9uZ2VyLCBieSBkZWZhdWx0LCBpbmNsdWRlIGJuLmgpCiAgICAgW01hdHQgQ2Fzd2VsbF0KCiAgKikgQWRkZWQgc3VwcG9ydCBmb3IgT0NCIG1vZGUuIE9wZW5TU0wgaGFzIGJlZW4gZ3JhbnRlZCBhIHBhdGVudCBsaWNlbnNlCiAgICAgY29tcGF0aWJsZSB3aXRoIHRoZSBPcGVuU1NMIGxpY2Vuc2UgZm9yIHVzZSBvZiBPQ0IuIERldGFpbHMgYXJlIGF2YWlsYWJsZQogICAgIGF0IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL2RvY3MvbWlzYy9PQ0ItcGF0ZW50LWdyYW50LU9wZW5TU0wucGRmLiBTdXBwb3J0CiAgICAgZm9yIE9DQiBjYW4gYmUgcmVtb3ZlZCBieSBjYWxsaW5nIGNvbmZpZyB3aXRoIG5vLW9jYi4KICAgICBbTWF0dCBDYXN3ZWxsXQoKICAqKSBTU0x2MiBzdXBwb3J0IGhhcyBiZWVuIHJlbW92ZWQuICBJdCBzdGlsbCBzdXBwb3J0cyByZWNlaXZpbmcgYSBTU0x2MgogICAgIGNvbXBhdGlibGUgY2xpZW50IGhlbGxvLgogICAgIFtLdXJ0IFJvZWNreF0KCiAgKikgSW5jcmVhc2VkIHRoZSBtaW5pbWFsIFJTQSBrZXlzaXplIGZyb20gMjU2IHRvIDUxMiBiaXRzIFtSaWNoIFNhbHpdLAogICAgIGRvbmUgd2hpbGUgZml4aW5nIHRoZSBlcnJvciBjb2RlIGZvciB0aGUga2V5LXRvby1zbWFsbCBjYXNlLgogICAgIFtBbm5pZSBZb3VzYXIgPGEueW91c2FyQGluZm9ybWF0aWsuaHUtYmVybGluLmRlPl0KCiAgKikgUmVtb3ZlZCBvbGQgREVTIEFQSS4KICAgICBbUmljaCBTYWx6XQoKICAqKSBSZW1vdmUgdmFyaW91cyB1bnN1cHBvcnRlZCBwbGF0Zm9ybXM6CiAgICAgICAgU29ueSBORVdTNAogICAgICAgIEJFT1MgYW5kIEJFT1NfUjUKICAgICAgICBOZVhUCiAgICAgICAgU1VOT1MKICAgICAgICBNUEUvaVgKICAgICAgICBTaW5peC9SZWxpYW50VU5JWCBSTTQwMAogICAgICAgIERHVVgKICAgICAgICBOQ1IKICAgICAgICBUYW5kZW0KICAgICAgICBDcmF5CiAgICAgICAgMTYtYml0IHBsYXRmb3JtcyBzdWNoIGFzIFdJTjE2CiAgICAgW1JpY2ggU2Fsel0KCiAgKikgQ2xlYW4gdXAgT1BFTlNTTF9OT194eHggI2RlZmluZSdzCiAgICAgICAgVXNlIHNldGJ1ZigpIGFuZCByZW1vdmUgT1BFTlNTTF9OT19TRVRWQlVGX0lPTkJGCiAgICAgICAgUmVuYW1lIE9QRU5TU0xfU1lTTkFNRV94eHggdG8gT1BFTlNTTF9TWVNfeHh4CiAgICAgICAgT1BFTlNTTF9OT19FQ3tESCxEU0F9IG1lcmdlZCBpbnRvIE9QRU5TU0xfTk9fRUMKICAgICAgICBPUEVOU1NMX05PX1JJUEVNRDE2MCwgT1BFTlNTTF9OT19SSVBFTUQgbWVyZ2VkIGludG8gT1BFTlNTTF9OT19STUQxNjAKICAgICAgICBPUEVOU1NMX05PX0ZQX0FQSSBtZXJnZWQgaW50byBPUEVOU1NMX05PX1NURElPCiAgICAgICAgUmVtb3ZlIE9QRU5TU0xfTk9fQklPIE9QRU5TU0xfTk9fQlVGRkVSIE9QRU5TU0xfTk9fQ0hBSU5fVkVSSUZZCiAgICAgICAgT1BFTlNTTF9OT19FVlAgT1BFTlNTTF9OT19GSVBTX0VSUiBPUEVOU1NMX05PX0hBU0hfQ09NUAogICAgICAgIE9QRU5TU0xfTk9fTEhBU0ggT1BFTlNTTF9OT19PQkpFQ1QgT1BFTlNTTF9OT19TUEVFRCBPUEVOU1NMX05PX1NUQUNLCiAgICAgICAgT1BFTlNTTF9OT19YNTA5IE9QRU5TU0xfTk9fWDUwOV9WRVJJRlkKICAgICAgICBSZW1vdmUgTVNfU1RBVElDOyBpdCdzIGEgcmVsaWMgZnJvbSBwbGF0Zm9ybXMgPDMyIGJpdHMuCiAgICAgW1JpY2ggU2Fsel0KCiAgKikgQ2xlYW5lZCB1cCBkZWFkIGNvZGUKICAgICAgICBSZW1vdmUgYWxsIGJ1dCBvbmUgJyNpZmRlZiB1bmRlZicgd2hpY2ggaXMgdG8gYmUgbG9va2VkIGF0LgogICAgIFtSaWNoIFNhbHpdCgogICopIENsZWFuIHVwIGNhbGxpbmcgb2YgeHh4X2ZyZWUgcm91dGluZXMuCiAgICAgICAgSnVzdCBsaWtlIGZyZWUoKSwgZml4IG1vc3Qgb2YgdGhlIHh4eF9mcmVlIHJvdXRpbmVzIHRvIGFjY2VwdAogICAgICAgIE5VTEwuICBSZW1vdmUgdGhlIG5vbi1udWxsIGNoZWNrcyBmcm9tIGNhbGxlcnMuICBTYXZlIG11Y2ggY29kZS4KICAgICBbUmljaCBTYWx6XQoKICAqKSBFeHBlcmltZW50YWwgc3VwcG9ydCBmb3IgYSBuZXcsIGZhc3QsIHVuYmlhc2VkIHByaW1lIGNhbmRpZGF0ZSBnZW5lcmF0b3IsCiAgICAgYm5fcHJvYmFibGVfcHJpbWVfZGhfY29wcmltZSgpLiBOb3QgY3VycmVudGx5IHVzZWQgYnkgYW55IHByaW1lIGdlbmVyYXRvci4KICAgICBbRmVsaXggTGF1cmllIHZvbiBNYXNzZW5iYWNoIDxmZWxpeEBlcmJyaWRnZS5jby51az5dCgogICopIE5ldyBvdXRwdXQgZm9ybWF0IE5TUyBpbiB0aGUgc2Vzc19pZCBjb21tYW5kIGxpbmUgdG9vbC4gVGhpcyBhbGxvd3MKICAgICBleHBvcnRpbmcgdGhlIHNlc3Npb24gaWQgYW5kIHRoZSBtYXN0ZXIga2V5IGluIE5TUyBrZXlsb2cgZm9ybWF0LgogICAgIFtNYXJ0aW4gS2Fpc2VyIDxtYXJ0aW5Aa2Fpc2VyLmN4Pl0KCiAgKikgSGFybW9uaXplIHZlcnNpb24gYW5kIGl0cyBkb2N1bWVudGF0aW9uLiAtZiBmbGFnIGlzIHVzZWQgdG8gZGlzcGxheQogICAgIGNvbXBpbGF0aW9uIGZsYWdzLgogICAgIFttYW5jaGEgPG1hbmNoYTFAem9oby5jb20+XQoKICAqKSBGaXggZWNrZXlfcHJpdl9lbmNvZGUgc28gaXQgaW1tZWRpYXRlbHkgcmV0dXJucyBhbiBlcnJvciB1cG9uIGEgZmFpbHVyZQogICAgIGluIGkyZF9FQ1ByaXZhdGVLZXkuCiAgICAgW21hbmNoYSA8bWFuY2hhMUB6b2hvLmNvbT5dCgogICopIEZpeCBzb21lIGRvdWJsZSBmcmVlcy4gVGhlc2UgYXJlIG5vdCB0aG91Z2h0IHRvIGJlIGV4cGxvaXRhYmxlLgogICAgIFttYW5jaGEgPG1hbmNoYTFAem9oby5jb20+XQoKICAqKSBBIG1pc3NpbmcgYm91bmRzIGNoZWNrIGluIHRoZSBoYW5kbGluZyBvZiB0aGUgVExTIGhlYXJ0YmVhdCBleHRlbnNpb24KICAgICBjYW4gYmUgdXNlZCB0byByZXZlYWwgdXAgdG8gNjRrIG9mIG1lbW9yeSB0byBhIGNvbm5lY3RlZCBjbGllbnQgb3IKICAgICBzZXJ2ZXIuCgogICAgIFRoYW5rcyBmb3IgTmVlbCBNZWh0YSBvZiBHb29nbGUgU2VjdXJpdHkgZm9yIGRpc2NvdmVyaW5nIHRoaXMgYnVnIGFuZCB0bwogICAgIEFkYW0gTGFuZ2xleSA8YWdsQGNocm9taXVtLm9yZz4gYW5kIEJvZG8gTW9lbGxlciA8Ym1vZWxsZXJAYWNtLm9yZz4gZm9yCiAgICAgcHJlcGFyaW5nIHRoZSBmaXggKENWRS0yMDE0LTAxNjApCiAgICAgW0FkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggZm9yIHRoZSBhdHRhY2sgZGVzY3JpYmVkIGluIHRoZSBwYXBlciAiUmVjb3ZlcmluZyBPcGVuU1NMCiAgICAgRUNEU0EgTm9uY2VzIFVzaW5nIHRoZSBGTFVTSCtSRUxPQUQgQ2FjaGUgU2lkZS1jaGFubmVsIEF0dGFjayIKICAgICBieSBZdXZhbCBZYXJvbSBhbmQgTmFvbWkgQmVuZ2VyLiBEZXRhaWxzIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgogICAgIGh0dHA6Ly9lcHJpbnQuaWFjci5vcmcvMjAxNC8xNDAKCiAgICAgVGhhbmtzIHRvIFl1dmFsIFlhcm9tIGFuZCBOYW9taSBCZW5nZXIgZm9yIGRpc2NvdmVyaW5nIHRoaXMKICAgICBmbGF3IGFuZCB0byBZdXZhbCBZYXJvbSBmb3Igc3VwcGx5aW5nIGEgZml4IChDVkUtMjAxNC0wMDc2KQogICAgIFtZdXZhbCBZYXJvbSBhbmQgTmFvbWkgQmVuZ2VyXQoKICAqKSBVc2UgYWxnb3JpdGhtIHNwZWNpZmljIGNoYWlucyBpbiBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKCk6CiAgICAgdGhpcyBmaXhlcyBhIGxpbWl0YXRpb24gaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgT3BlblNTTC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHBlcmltZW50YWwgZW5jcnlwdC10aGVuLW1hYyBzdXBwb3J0LgogICAgCiAgICAgRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGVuY3J5cHQgdGhlbiBtYWMgZnJvbQogICAgIGRyYWZ0LWd1dG1hbm4tdGxzLWVuY3J5cHQtdGhlbi1tYWMtMDIudHh0CgogICAgIFRvIGVuYWJsZSBpdCBzZXQgdGhlIGFwcHJvcHJpYXRlIGV4dGVuc2lvbiBudW1iZXIgKDB4NDIgZm9yIHRoZSB0ZXN0CiAgICAgc2VydmVyKSB1c2luZyBlLmcuIC1EVExTRVhUX1RZUEVfZW5jcnlwdF90aGVuX21hYz0weDQyCiAKICAgICBGb3Igbm9uLWNvbXBsaWFudCBwZWVycyAoaS5lLiBqdXN0IGFib3V0IGV2ZXJ5dGhpbmcpIHRoaXMgc2hvdWxkIGhhdmUgbm8KICAgICBlZmZlY3QuCgogICAgIFdBUk5JTkc6IEVYUEVSSU1FTlRBTCwgU1VCSkVDVCBUTyBDSEFOR0UuCgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBFVlAgc3VwcG9ydCBmb3Iga2V5IHdyYXBwaW5nIGFsZ29yaXRobXMsIHRvIGF2b2lkIHByb2JsZW1zIHdpdGgKICAgICBleGlzdGluZyBjb2RlIHRoZSBmbGFnIEVWUF9DSVBIRVJfQ1RYX1dSQVBfQUxMT1cgaGFzIHRvIGJlIHNldCBpbgogICAgIHRoZSBFVlBfQ0lQSEVSX0NUWCBvciBhbiBlcnJvciBpcyByZXR1cm5lZC4gQWRkIEFFUyBhbmQgREVTMyB3cmFwCiAgICAgYWxnb3JpdGhtcyBhbmQgaW5jbHVkZSB0ZXN0cyBjYXNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbmQgQ01TIGNvZGUgdG8gc3VwcG9ydCBSU0EtUFNTIHNpZ25hdHVyZXMgYW5kIFJTQS1PQUVQIGZvcgogICAgIGVudmVsb3BlZCBkYXRhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZGVkIFJTQSBPQUVQIHN1cHBvcnQgdmlhIEVWUF9QS0VZIEFQSS4gT3B0aW9ucyB0byBzcGVjaWZ5IGRpZ2VzdCwKICAgICBNR0YxIGRpZ2VzdCBhbmQgT0FFUCBsYWJlbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIG9wZW5zc2wgdmVyaWZ5IHJldHVybiBlcnJvcnMuCiAgICAgW0NocmlzIFBhbG1lciA8cGFsbWVyQGdvb2dsZS5jb20+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBOZXcgZnVuY3Rpb24gQVNOMV9USU1FX2RpZmYgdG8gY2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvCiAgICAgQVNOMV9USU1FIHN0cnVjdHVyZXMgb3Igb25lIHN0cnVjdHVyZSBhbmQgdGhlIGN1cnJlbnQgdGltZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgZmlwc190ZXN0X3N1aXRlIHRvIHN1cHBvcnQgbXVsdGlwbGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuIE5ldwogICAgIHRlc3QgdG8gaW5kdWNlIGFsbCBzZWxmIHRlc3QgZXJyb3JzIGluIHNlcXVlbmNlIGFuZCBjaGVjayBleHBlY3RlZAogICAgIGZhaWx1cmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBGSVBTX3tyc2EsZHNhLGVjZHNhfV97c2lnbix2ZXJpZnl9IGZ1bmN0aW9ucyB3aGljaCBkaWdlc3QgYW5kCiAgICAgc2lnbiBvciB2ZXJpZnkgYWxsIGluIG9uZSBvcGVyYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZpcHNfYWxndnM6IGEgbXVsdGljYWxsIGZpcHMgdXRpbGl0eSBpbmNvcnBvcmF0aW5nIGFsbCB0aGUgYWxnb3JpdGhtCiAgICAgdGVzdCBwcm9ncmFtcyBhbmQgZmlwc190ZXN0X3N1aXRlLiBJbmNsdWRlcyBmdW5jdGlvbmFsaXR5IHRvIHBhcnNlCiAgICAgdGhlIG1pbmltYWwgc2NyaXB0IG91dHB1dCBvZiBmaXBzYWxnZXN0LnBsIGRpcmVjdGx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhdXRob3Jpc2F0aW9uIHBhcmFtZXRlciB0byBGSVBTX21vZHVsZV9tb2RlX3NldCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBGSVBTIHNlbGZ0ZXN0IGZvciBFQ0RIIGFsZ29yaXRobSB1c2luZyBQLTIyNCBhbmQgQi0yMzMgY3VydmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVzZSBzZXBhcmF0ZSBEUkJHIGZpZWxkcyBmb3IgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGZsYWdzLiBOZXcgZnVuY3Rpb24KICAgICBGSVBTX2RyYmdfaGVhbHRoX2NoZWNrKCkgdG8gcGVyZm9ybSBvbiBkZW1hbmQgaGVhbHRoIGNoZWNraW5nLiBBZGQKICAgICBnZW5lcmF0aW9uIHRlc3RzIHRvIGZpcHNfdGVzdF9zdWl0ZSB3aXRoIHJlZHVjZWQgaGVhbHRoIGNoZWNrIGludGVydmFsIHRvIAogICAgIGRlbW9uc3RyYXRlIHBlcmlvZGljIGhlYWx0aCBjaGVja2luZy4gQWRkICJub2RoIiBvcHRpb24gdG8KICAgICBmaXBzX3Rlc3Rfc3VpdGUgdG8gc2tpcCB2ZXJ5IHNsb3cgREggdGVzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gRklQU19nZXRfY2lwaGVyYnluaWQoKSB0byBsb29rdXAgRklQUyBzdXBwb3J0ZWQgY2lwaGVycwogICAgIGJhc2VkIG9uIE5JRC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3JlIGV4dGVuc2l2ZSBoZWFsdGggY2hlY2sgZm9yIERSQkcgY2hlY2tpbmcgbWFueSBtb3JlIGZhaWx1cmUgbW9kZXMuCiAgICAgTmV3IGZ1bmN0aW9uIEZJUFNfc2VsZnRlc3RfZHJiZ19hbGwoKSB0byBoYW5kbGUgZXZlcnkgcG9zc2libGUgRFJCRwogICAgIGNvbWJpbmF0aW9uOiBjYWxsIHRoaXMgaW4gZmlwc190ZXN0X3N1aXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBEdWFsIEVDIERSQkcgZnJvbSBTUDgwMC05MC4gVXBkYXRlIERSQkcgYWxnb3JpdGhtIHRlc3QKICAgICBhbmQgUE9TVCB0byBoYW5kbGUgRHVhbCBFQyBjYXNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgY2Fub25pY2FsIGdlbmVyYXRpb24gb2YgRFNBIHBhcmFtZXRlciAnZycuIFNlZSAKICAgICBGSVBTIDE4Ni0zIEEuMi4zLgoKICAqKSBBZGQgc3VwcG9ydCBmb3IgSE1BQyBEUkJHIGZyb20gU1A4MDAtOTAuIFVwZGF0ZSBEUkJHIGFsZ29yaXRobSB0ZXN0IGFuZAogICAgIFBPU1QgdG8gaGFuZGxlIEhNQUMgY2FzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bmN0aW9ucyBGSVBTX21vZHVsZV92ZXJzaW9uKCkgYW5kIEZJUFNfbW9kdWxlX3ZlcnNpb25fdGV4dCgpCiAgICAgdG8gcmV0dXJuIG51bWVyaWNhbCBhbmQgc3RyaW5nIHZlcnNpb25zIG9mIHRoZSBGSVBTIG1vZHVsZSBudW1iZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVuYW1lIEZJUFNfbW9kZV9zZXQgYW5kIEZJUFNfbW9kZSB0byBGSVBTX21vZHVsZV9tb2RlX3NldCBhbmQKICAgICBGSVBTX21vZHVsZV9tb2RlLiBGSVBTX21vZGUgYW5kIEZJUFNfbW9kZV9zZXQgd2lsbCBiZSBpbXBsZW1lbnRlZAogICAgIG91dHNpZGUgdGhlIHZhbGlkYXRlZCBtb2R1bGUgaW4gdGhlIEZJUFMgY2FwYWJsZSBPcGVuU1NMLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1pbm9yIGNoYW5nZSB0byBEUkJHIGVudHJvcHkgY2FsbGJhY2sgc2VtYW50aWNzLiBJbiBzb21lIGNhc2VzCiAgICAgdGhlcmUgaXMgbm8gbXVsdGlwbGUgb2YgdGhlIGJsb2NrIGxlbmd0aCBiZXR3ZWVuIG1pbl9sZW4gYW5kCiAgICAgbWF4X2xlbi4gQWxsb3cgdGhlIGNhbGxiYWNrIHRvIHJldHVybiBtb3JlIHRoYW4gbWF4X2xlbiBieXRlcwogICAgIG9mIGVudHJvcHkgYnV0IGRpc2NhcmQgYW55IGV4dHJhOiBpdCBpcyB0aGUgY2FsbGJhY2sncyByZXNwb25zaWJpbGl0eQogICAgIHRvIGVuc3VyZSB0aGF0IHRoZSBleHRyYSBkYXRhIGRpc2NhcmRlZCBkb2VzIG5vdCBpbXBhY3QgdGhlCiAgICAgcmVxdWVzdGVkIGFtb3VudCBvZiBlbnRyb3B5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBQUk5HIHNlY3VyaXR5IHN0cmVuZ3RoIGNoZWNrcyB0byBSU0EsIERTQSBhbmQgRUNEU0EgdXNpbmcgCiAgICAgaW5mb3JtYXRpb24gaW4gRklQUzE4Ni0zLCBTUDgwMC01NyBhbmQgU1A4MDAtMTMxQS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDQ00gc3VwcG9ydCB2aWEgRVZQLiBJbnRlcmZhY2UgaXMgdmVyeSBzaW1pbGFyIHRvIEdDTSBjYXNlIGV4Y2VwdCB3ZQogICAgIG11c3Qgc3VwcGx5IGFsbCBkYXRhIGluIG9uZSBjaHVuayAoaS5lLiBubyB1cGRhdGUsIGZpbmFsKSBhbmQgdGhlCiAgICAgbWVzc2FnZSBsZW5ndGggbXVzdCBiZSBzdXBwbGllZCBpZiBBQUQgaXMgdXNlZC4gQWRkIGFsZ29yaXRobSB0ZXN0CiAgICAgc3VwcG9ydC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHZlcnNpb24gb2YgUE9TVCBvdmVyaGF1bC4gQWRkIFBPU1QgY2FsbGJhY2sgdG8gYWxsb3cgdGhlIHN0YXR1cwogICAgIG9mIFBPU1QgdG8gYmUgbW9uaXRvcmVkIGFuZC9vciBmYWlsdXJlcyBpbmR1Y2VkLiBNb2RpZnkgZmlwc190ZXN0X3N1aXRlCiAgICAgdG8gdXNlIGNhbGxiYWNrLiBBbHdheXMgcnVuIGFsbCBzZWxmdGVzdHMgZXZlbiBpZiBvbmUgZmFpbHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgWFRTIHN1cHBvcnQgaW5jbHVkaW5nIGFsZ29yaXRobSB0ZXN0IGRyaXZlciBpbiB0aGUgZmlwc19nY210ZXN0IHByb2dyYW0uCiAgICAgTm90ZTogdGhpcyBkb2VzIGluY3JlYXNlIHRoZSBtYXhpbXVtIGtleSBsZW5ndGggZnJvbSAzMiB0byA2NCBieXRlcyBidXQKICAgICB0aGVyZSBzaG91bGQgYmUgbm8gYmluYXJ5IGNvbXBhdGliaWxpdHkgaXNzdWVzIGFzIGV4aXN0aW5nIGFwcGxpY2F0aW9ucwogICAgIHdpbGwgbmV2ZXIgdXNlIFhUUyBtb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuc2l2ZSByZW9yZ2FuaXNhdGlvbiBvZiBGSVBTIFBSTkcgYmVoYXZpb3VyLiBSZW1vdmUgYWxsIGRlcGVuZGVuY2llcwogICAgIHRvIE9wZW5TU0wgUkFORCBjb2RlIGFuZCByZXBsYWNlIHdpdGggYSB0aW55IEZJUFMgUkFORCBBUEkgd2hpY2ggYWxzbwogICAgIHBlcmZvcm1zIGFsZ29yaXRobSBibG9ja2luZyBmb3IgdW5hcHByb3ZlZCBQUk5HIHR5cGVzLiBBbHNvIGRvIG5vdAogICAgIHNldCBQUk5HIHR5cGUgaW4gRklQU19tb2RlX3NldCgpOiBsZWF2ZSB0aGlzIHRvIHRoZSBhcHBsaWNhdGlvbi4KICAgICBBZGQgZGVmYXVsdCBPcGVuU1NMIERSQkcgaGFuZGxpbmc6IHNldHMgdXAgRklQUyBQUk5HIGFuZCBzZWVkcyB3aXRoCiAgICAgdGhlIHN0YW5kYXJkIE9wZW5TU0wgUFJORzogc2V0IGFkZGl0aW9uYWwgZGF0YSB0byBhIGRhdGUgdGltZSB2ZWN0b3IuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVuYW1lIG9sZCBYOS4zMSBQUk5HIGZ1bmN0aW9ucyBvZiB0aGUgZm9ybSBGSVBTX3JhbmQqIHRvIEZJUFNfeDkzMSouCiAgICAgVGhpcyBzaG91bGRuJ3QgcHJlc2VudCBhbnkgaW5jb21wYXRpYmlsaXR5IHByb2JsZW1zIGJlY2F1c2UgYXBwbGljYXRpb25zCiAgICAgc2hvdWxkbid0IGJlIHVzaW5nIHRoZXNlIGRpcmVjdGx5IGFuZCBhbnkgdGhhdCBhcmUgd2lsbCBuZWVkIHRvIHJldGhpbmsKICAgICBhbnl3YXkgYXMgdGhlIFg5LjMxIFBSTkcgaXMgbm93IGRlcHJlY2F0ZWQgYnkgRklQUyAxNDAtMgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuc2l2ZSBzZWxmIHRlc3RzIGFuZCBoZWFsdGggY2hlY2tpbmcgcmVxdWlyZWQgYnkgU1A4MDAtOTAgRFJCRy4KICAgICBSZW1vdmUgc3RyZW5ndGggcGFyYW1ldGVyIGZyb20gRklQU19kcmJnX2luc3RhbnRpYXRlIGFuZCBhbHdheXMKICAgICBpbnN0YW50aWF0ZSBhdCBtYXhpbXVtIHN1cHBvcnRlZCBzdHJlbmd0aC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgRUNESCBjb2RlIHRvIGZpcHMgbW9kdWxlIGFuZCBmaXBzX2VjZGh2cyBmb3IgcHJpbWl0aXZlcyBvbmx5IHRlc3RpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGFsZ29yaXRobSB0ZXN0IHByb2dyYW0gZmlwc19kaHZzIHRvIGhhbmRsZSBESCBwcmltaXRpdmVzIG9ubHkgdGVzdGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gREhfY29tcHV0ZV9rZXlfcGFkZGVkKCkgdG8gY29tcHV0ZSBhIERIIGtleSBhbmQgcGFkIHdpdGgKICAgICBsZWFkaW5nIHplcm9lcyBpZiBuZWVkZWQ6IHRoaXMgY29tcGxpZXMgd2l0aCBTUDgwMC01NkEgZXQgYWwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBTUDgwMC05MCBEUkJHcyBmb3IgSGFzaCBhbmQgQ1RSLiBOb3QgdXNlZCBieQogICAgIGFueXRoaW5nLCBpbmNvbXBsZXRlLCBzdWJqZWN0IHRvIGNoYW5nZSBhbmQgbGFyZ2VseSB1bnRlc3RlZCBhdCBwcmVzZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSBmaXBzY2FuaXN0ZXJvbmx5IGJ1aWxkIG9wdGlvbiB0byBvbmx5IGJ1aWxkIHRoZSBuZWNlc3Nhcnkgb2JqZWN0CiAgICAgZmlsZXMgYnkgZmlsdGVyaW5nIEZJUFNfRVhfT0JKIHRocm91Z2ggYSBwZXJsIHNjcmlwdCBpbiBjcnlwdG8vTWFrZWZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGV4cGVyaW1lbnRhbCBvcHRpb24gRklQU1NZTVMgdG8gZ2l2ZSBhbGwgc3ltYm9scyBpbgogICAgIGZpcHNjYW5pc3Rlci5vIGFuZCBGSVBTIG9yIGZpcHMgcHJlZml4LiBUaGlzIHdpbGwgYXZvaWQKICAgICBjb25mbGljdHMgd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgT3BlblNTTC4gQWRkIHBlcmwgc2NyaXB0CiAgICAgdXRpbC9maXBzYXMucGwgdG8gcHJlcHJvY2VzcyBhc3NlbWJseSBsYW5ndWFnZSBzb3VyY2UgZmlsZXMKICAgICBhbmQgcmVuYW1lIGFueSBhZmZlY3RlZCBzeW1ib2xzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzZWxmdGVzdCBjaGVja3MgYW5kIGFsZ29yaXRobSBibG9jayBvZiBub24tZmlwcyBhbGdvcml0aG1zIGluCiAgICAgRklQUyBtb2RlLiBSZW1vdmUgREVTMiBmcm9tIHNlbGZ0ZXN0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgRUNEU0EgY29kZSB0byBmaXBzIG1vZHVsZS4gQWRkIHRpbnkgZmlwc19lY2RzYV9jaGVjayB0byBqdXN0CiAgICAgcmV0dXJuIGludGVybmFsIG1ldGhvZCB3aXRob3V0IGFueSBFTkdJTkUgZGVwZW5kZW5jaWVzLiBBZGQgbmV3CiAgICAgdGlueSBmaXBzIHNpZ24gYW5kIHZlcmlmeSBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGJ1aWxkIG9wdGlvbiBuby1lYzJtIHRvIGRpc2FibGUgY2hhcmFjdGVyaXN0aWMgMiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBidWlsZCBvcHRpb24gImZpcHNjYW5pc3Rlcm9ubHkiLiBUaGlzIG9ubHkgYnVpbGRzIGZpcHNjYW5pc3Rlci5vCiAgICAgYW5kIChjdXJyZW50bHkpIGFzc29jaWF0ZWQgZmlwcyB1dGlsaXRpZXMuIFVzZXMgdGhlIGZpbGUgTWFrZWZpbGUuZmlwcwogICAgIGluc3RlYWQgb2YgTWFrZWZpbGUub3JnIGFzIHRoZSBwcm90b3R5cGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNvbWUgRklQUyBtb2RlIHJlc3RyaWN0aW9ucyB0byBHQ00uIEFkZCBpbnRlcm5hbCBJViBnZW5lcmF0b3IuCiAgICAgVXBkYXRlIGZpcHNfZ2NtdGVzdCB0byB1c2UgSVYgZ2VuZXJhdG9yLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwsIGV4cGVyaW1lbnRhbCBFVlAgc3VwcG9ydCBmb3IgQUVTLUdDTS4gQUFEIGNhbiBiZSBpbnB1dCBieQogICAgIHNldHRpbmcgb3V0cHV0IGJ1ZmZlciB0byBOVUxMLiBUaGUgKkZpbmFsIGZ1bmN0aW9uIG11c3QgYmUKICAgICBjYWxsZWQgYWx0aG91Z2ggaXQgd2lsbCBub3QgcmV0cmlldmUgYW55IGFkZGl0aW9uYWwgZGF0YS4gVGhlIHRhZwogICAgIGNhbiBiZSBzZXQgb3IgcmV0cmlldmVkIHdpdGggYSBjdHJsLiBUaGUgSVYgbGVuZ3RoIGlzIGJ5IGRlZmF1bHQgMTIKICAgICBieXRlcyAoOTYgYml0cykgYnV0IGNhbiBiZSBzZXQgdG8gYW4gYWx0ZXJuYXRpdmUgdmFsdWUuIElmIHRoZSBJVgogICAgIGxlbmd0aCBleGNlZWRzIHRoZSBtYXhpbXVtIElWIGxlbmd0aCAoY3VycmVudGx5IDE2IGJ5dGVzKSBpdCBjYW5ub3QgYmUKICAgICBzZXQgYmVmb3JlIHRoZSBrZXkuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmbGFnIGluIGNpcGhlcnM6IEVWUF9DSVBIX0ZMQUdfQ1VTVE9NX0NJUEhFUi4gVGhpcyBtZWFucyB0aGUKICAgICB1bmRlcmx5aW5nIGRvX2NpcGhlciBmdW5jdGlvbiBoYW5kbGVzIGFsbCBjaXBoZXIgc2VtYW50aWNzIGl0c2VsZgogICAgIGluY2x1ZGluZyBwYWRkaW5nIGFuZCBmaW5hbGlzYXRpb24uIFRoaXMgaXMgdXNlZnVsIGlmIChmb3IgZXhhbXBsZSkKICAgICBhbiBFTkdJTkUgY2lwaGVyIGhhbmRsZXMgYmxvY2sgcGFkZGluZyBpdHNlbGYuIFRoZSBiZWhhdmlvdXIgb2YKICAgICBkb19jaXBoZXIgaXMgc3VidGx5IGNoYW5nZWQgaWYgdGhpcyBmbGFnIGlzIHNldDogdGhlIHJldHVybiB2YWx1ZQogICAgIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgYnVmZmVyICh6ZXJvIGlzCiAgICAgbm8gbG9uZ2VyIGFuIGVycm9yIGNvZGUpIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gQWxzbyBpZiB0aGUKICAgICBpbnB1dCBidWZmZXIgaXMgTlVMTCBhbmQgbGVuZ3RoIDAgZmluYWxpc2F0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgYSBjYW5kaWRhdGUgaXNzdWVyIGNlcnRpZmljYXRlIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQKICAgICBwYXRoIGlnbm9yZSBpdDogbmV3IGRlYnVnIG5vdGlmaWNhdGlvbiBYNTA5X1ZfRVJSX1BBVEhfTE9PUCBmb3IgdGhpcyBjYXNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcHJvdmUgZm9yd2FyZC1zZWN1cml0eSBzdXBwb3J0OiBhZGQgZnVuY3Rpb25zCgogICAgICAgdm9pZCBTU0xfQ1RYX3NldF9ub3RfcmVzdW1hYmxlX3Nlc3Npb25fY2FsbGJhY2soU1NMX0NUWCAqY3R4LCBpbnQgKCpjYikoU1NMICpzc2wsIGludCBpc19mb3J3YXJkX3NlY3VyZSkpCiAgICAgICB2b2lkIFNTTF9zZXRfbm90X3Jlc3VtYWJsZV9zZXNzaW9uX2NhbGxiYWNrKFNTTCAqc3NsLCBpbnQgKCpjYikoU1NMICpzc2wsIGludCBpc19mb3J3YXJkX3NlY3VyZSkpCgogICAgIGZvciB1c2UgYnkgU1NML1RMUyBzZXJ2ZXJzOyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYQogICAgIG5ldyBzZXNzaW9uIGlzIGNyZWF0ZWQsIGFuZCBnZXRzIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBzZXNzaW9uIG1heSBiZQogICAgIGNhY2hlZCB0byBtYWtlIGl0IHJlc3VtYWJsZSAocmV0dXJuIDApIG9yIG5vdCAocmV0dXJuIDEpLiAgKEFzIGJ5IHRoZQogICAgIFNTTC9UTFMgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbnMsIHRoZSBzZXNzaW9uX2lkIHNlbnQgYnkgdGhlIHNlcnZlciB3aWxsIGJlCiAgICAgZW1wdHkgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc2Vzc2lvbiBpcyBub3QgcmVzdW1hYmxlOyBhbHNvLCB0aGUgc2VydmVyIHdpbGwKICAgICBub3QgZ2VuZXJhdGUgUkZDIDQ1MDcgKFJGQyA1MDc3KSBzZXNzaW9uIHRpY2tldHMuKQoKICAgICBBIHNpbXBsZSByZWFzb25hYmxlIGNhbGxiYWNrIGltcGxlbWVudGF0aW9uIGlzIHRvIHJldHVybiBpc19mb3J3YXJkX3NlY3VyZS4KICAgICBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIHNldCB0byAxIG9yIDAgZGVwZW5kaW5nIG9uIHRoZSBjaXBoZXJzdWl0ZSBzZWxlY3RlZAogICAgIGJ5IHRoZSBTU0wvVExTIHNlcnZlciBsaWJyYXJ5LCBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgY2FuIHByb3ZpZGUgZm9yd2FyZAogICAgIHNlY3VyaXR5LgogICAgIFtFbWlsaWEgS+RzcGVyIDxlbWlsaWEua2FzcGVyQGVzYXQua3VsZXV2ZW4uYmU+IChHb29nbGUpXQoKICAqKSBOZXcgLXZlcmlmeV9uYW1lIG9wdGlvbiBpbiBjb21tYW5kIGxpbmUgdXRpbGl0aWVzIHRvIHNldCB2ZXJpZmljYXRpb24KICAgICBwYXJhbWV0ZXJzIGJ5IG5hbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBDTUFDIGltcGxlbWVudGF0aW9uLiBXQVJOSU5HOiBFWFBFUklNRU5UQUwsIEFQSSBNQVkgQ0hBTkdFLgogICAgIEFkZCBDTUFDIHBrZXkgbWV0aG9kcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHBlcmltZW50YWwgcmVuZWdvdGlhdGlvbiBpbiBzX3NlcnZlciAtd3d3IG1vZGUuIElmIHRoZSBjbGllbnQgCiAgICAgYnJvd3NlcyAvcmVuZWcgY29ubmVjdGlvbiBpcyByZW5lZ290aWF0ZWQuIElmIC9yZW5lZ2NlcnQgaXQgaXMKICAgICByZW5lZ290aWF0ZWQgcmVxdWVzdGluZyBhIGNlcnRpZmljYXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhbiAiZXh0ZXJuYWwiIHNlc3Npb24gY2FjaGUgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB0byBzX3NlcnZlci4gVGhpcwogICAgIHNob3VsZCBoZWxwIHRyYWNlIGlzc3VlcyB3aGljaCBub3JtYWxseSBhcmUgb25seSBhcHBhcmVudCBpbiBkZXBsb3llZAogICAgIG11bHRpLXByb2Nlc3Mgc2VydmVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbnNpdmUgYXVkaXQgb2YgbGliY3J5cHRvIHdpdGggREVCVUdfVU5VU0VELiBGaXggbWFueSBjYXNlcyB3aGVyZQogICAgIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLiBOQi4gVGhlIGZ1bmN0aW9ucyBSQU5EX2FkZCgpLCBSQU5EX3NlZWQoKSwKICAgICBCSU9fc2V0X2NpcGhlcigpIGFuZCBzb21lIG9ic2N1cmUgUEVNIGZ1bmN0aW9ucyB3ZXJlIGNoYW5nZWQgc28gdGhleQogICAgIGNhbiBub3cgcmV0dXJuIGFuIGVycm9yLiBUaGUgUkFORCBjaGFuZ2VzIHJlcXVpcmVkIGEgY2hhbmdlIHRvIHRoZQogICAgIFJBTkRfTUVUSE9EIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgbWFjcm8gX19vd3VyIGZvciAiT3BlblNTTCBXYXJuIFVudXNlZCBSZXN1bHQiLiBUaGlzIG1ha2VzIHVzZSBvZgogICAgIGEgZ2NjIGF0dHJpYnV0ZSB0byB3YXJuIGlmIHRoZSByZXN1bHQgb2YgYSBmdW5jdGlvbiBpcyBpZ25vcmVkLiBUaGlzCiAgICAgaXMgZW5hYmxlIGlmIERFQlVHX1VOVVNFRCBpcyBzZXQuIEFkZCB0byBzZXZlcmFsIGZ1bmN0aW9ucyBpbiBldnAuaAogICAgIHdob3NlIHJldHVybiB2YWx1ZSBpcyBvZnRlbiBpZ25vcmVkLiAKICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMiBhbmQgMS4wLjJhIFt4eCBYWFggeHh4eF0KCiAgKikgQ2xpZW50SGVsbG8gc2lnYWxncyBEb1MgZml4CgogICAgIElmIGEgY2xpZW50IGNvbm5lY3RzIHRvIGFuIE9wZW5TU0wgMS4wLjIgc2VydmVyIGFuZCByZW5lZ290aWF0ZXMgd2l0aCBhbgogICAgIGludmFsaWQgc2lnbmF0dXJlIGFsZ29yaXRobXMgZXh0ZW5zaW9uIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIHdpbGwKICAgICBvY2N1ci4gVGhpcyBjYW4gYmUgZXhwbG9pdGVkIGluIGEgRG9TIGF0dGFjayBhZ2FpbnN0IHRoZSBzZXJ2ZXIuCgogICAgIFRoaXMgaXNzdWUgd2FzIHdhcyByZXBvcnRlZCB0byBPcGVuU1NMIGJ5IERhdmlkIFJhbW9zIG9mIFN0YW5mb3JkCiAgICAgVW5pdmVyc2l0eS4KICAgICAoQ1ZFLTIwMTUtMDI5MSkKICAgICBbU3RlcGhlbiBIZW5zb24gYW5kIE1hdHQgQ2Fzd2VsbF0KCiAgKikgTXVsdGlibG9jayBjb3JydXB0ZWQgcG9pbnRlciBmaXgKCiAgICAgT3BlblNTTCAxLjAuMiBpbnRyb2R1Y2VkIHRoZSAibXVsdGlibG9jayIgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQuIFRoaXMKICAgICBmZWF0dXJlIG9ubHkgYXBwbGllcyBvbiA2NCBiaXQgeDg2IGFyY2hpdGVjdHVyZSBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IEFFUwogICAgIE5JIGluc3RydWN0aW9ucy4gQSBkZWZlY3QgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mICJtdWx0aWJsb2NrIiBjYW4gY2F1c2UKICAgICBPcGVuU1NMJ3MgaW50ZXJuYWwgd3JpdGUgYnVmZmVyIHRvIGJlY29tZSBpbmNvcnJlY3RseSBzZXQgdG8gTlVMTCB3aGVuCiAgICAgdXNpbmcgbm9uLWJsb2NraW5nIElPLiBUeXBpY2FsbHksIHdoZW4gdGhlIHVzZXIgYXBwbGljYXRpb24gaXMgdXNpbmcgYQogICAgIHNvY2tldCBCSU8gZm9yIHdyaXRpbmcsIHRoaXMgd2lsbCBvbmx5IHJlc3VsdCBpbiBhIGZhaWxlZCBjb25uZWN0aW9uLgogICAgIEhvd2V2ZXIgaWYgc29tZSBvdGhlciBCSU8gaXMgdXNlZCB0aGVuIGl0IGlzIGxpa2VseSB0aGF0IGEgc2VnbWVudGF0aW9uCiAgICAgZmF1bHQgd2lsbCBiZSB0cmlnZ2VyZWQsIHRodXMgZW5hYmxpbmcgYSBwb3RlbnRpYWwgRG9TIGF0dGFjay4KCiAgICAgVGhpcyBpc3N1ZSB3YXMgcmVwb3J0ZWQgdG8gT3BlblNTTCBieSBEYW5pZWwgRGFubmVyIGFuZCBSYWluZXIgTXVlbGxlci4KICAgICAoQ1ZFLTIwMTUtMDI5MCkKICAgICBbTWF0dCBDYXN3ZWxsXQoKICAqKSBTZWdtZW50YXRpb24gZmF1bHQgaW4gRFRMU3YxX2xpc3RlbiBmaXgKCiAgICAgVGhlIERUTFN2MV9saXN0ZW4gZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgc3RhdGVsZXNzIGFuZCBwcm9jZXNzZXMgdGhlCiAgICAgaW5pdGlhbCBDbGllbnRIZWxsbyBmcm9tIG1hbnkgcGVlcnMuIEl0IGlzIGNvbW1vbiBmb3IgdXNlciBjb2RlIHRvIGxvb3AKICAgICBvdmVyIHRoZSBjYWxsIHRvIERUTFN2MV9saXN0ZW4gdW50aWwgYSB2YWxpZCBDbGllbnRIZWxsbyBpcyByZWNlaXZlZCB3aXRoCiAgICAgYW4gYXNzb2NpYXRlZCBjb29raWUuIEEgZGVmZWN0IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBEVExTdjFfbGlzdGVuIG1lYW5zCiAgICAgdGhhdCBzdGF0ZSBpcyBwcmVzZXJ2ZWQgaW4gdGhlIFNTTCBvYmplY3QgZnJvbSBvbmUgaW52b2NhdGlvbiB0byB0aGUgbmV4dAogICAgIHRoYXQgY2FuIGxlYWQgdG8gYSBzZWdtZW50YXRpb24gZmF1bHQuIEVycm9ycyBwcm9jZXNzaW5nIHRoZSBpbml0aWFsCiAgICAgQ2xpZW50SGVsbG8gY2FuIHRyaWdnZXIgdGhpcyBzY2VuYXJpby4gQW4gZXhhbXBsZSBvZiBzdWNoIGFuIGVycm9yIGNvdWxkIGJlCiAgICAgdGhhdCBhIERUTFMxLjAgb25seSBjbGllbnQgaXMgYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIGEgRFRMUzEuMiBvbmx5CiAgICAgc2VydmVyLgoKICAgICBUaGlzIGlzc3VlIHdhcyByZXBvcnRlZCB0byBPcGVuU1NMIGJ5IFBlciBBbGxhbnNzb24uCiAgICAgKENWRS0yMDE1LTAyMDcpCiAgICAgW01hdHQgQ2Fzd2VsbF0KCiAgKikgU2VnbWVudGF0aW9uIGZhdWx0IGluIEFTTjFfVFlQRV9jbXAgZml4CgogICAgIFRoZSBmdW5jdGlvbiBBU04xX1RZUEVfY21wIHdpbGwgY3Jhc2ggd2l0aCBhbiBpbnZhbGlkIHJlYWQgaWYgYW4gYXR0ZW1wdCBpcwogICAgIG1hZGUgdG8gY29tcGFyZSBBU04uMSBib29sZWFuIHR5cGVzLiBTaW5jZSBBU04xX1RZUEVfY21wIGlzIHVzZWQgdG8gY2hlY2sKICAgICBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgYWxnb3JpdGhtIGNvbnNpc3RlbmN5IHRoaXMgY2FuIGJlIHVzZWQgdG8gY3Jhc2ggYW55CiAgICAgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIG9wZXJhdGlvbiBhbmQgZXhwbG9pdGVkIGluIGEgRG9TIGF0dGFjay4gQW55CiAgICAgYXBwbGljYXRpb24gd2hpY2ggcGVyZm9ybXMgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGlzIHZ1bG5lcmFibGUgaW5jbHVkaW5nCiAgICAgT3BlblNTTCBjbGllbnRzIGFuZCBzZXJ2ZXJzIHdoaWNoIGVuYWJsZSBjbGllbnQgYXV0aGVudGljYXRpb24uCiAgICAgKENWRS0yMDE1LTAyODYpCiAgICAgW1N0ZXBoZW4gSGVuc29uXQoKICAqKSBTZWdtZW50YXRpb24gZmF1bHQgZm9yIGludmFsaWQgUFNTIHBhcmFtZXRlcnMgZml4CgogICAgIFRoZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHJvdXRpbmVzIHdpbGwgY3Jhc2ggd2l0aCBhIE5VTEwgcG9pbnRlcgogICAgIGRlcmVmZXJlbmNlIGlmIHByZXNlbnRlZCB3aXRoIGFuIEFTTi4xIHNpZ25hdHVyZSB1c2luZyB0aGUgUlNBIFBTUwogICAgIGFsZ29yaXRobSBhbmQgaW52YWxpZCBwYXJhbWV0ZXJzLiBTaW5jZSB0aGVzZSByb3V0aW5lcyBhcmUgdXNlZCB0byB2ZXJpZnkKICAgICBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgYWxnb3JpdGhtcyB0aGlzIGNhbiBiZSB1c2VkIHRvIGNyYXNoIGFueQogICAgIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBvcGVyYXRpb24gYW5kIGV4cGxvaXRlZCBpbiBhIERvUyBhdHRhY2suIEFueQogICAgIGFwcGxpY2F0aW9uIHdoaWNoIHBlcmZvcm1zIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBpcyB2dWxuZXJhYmxlIGluY2x1ZGluZwogICAgIE9wZW5TU0wgY2xpZW50cyBhbmQgc2VydmVycyB3aGljaCBlbmFibGUgY2xpZW50IGF1dGhlbnRpY2F0aW9uLgoKICAgICBUaGlzIGlzc3VlIHdhcyB3YXMgcmVwb3J0ZWQgdG8gT3BlblNTTCBieSBCcmlhbiBDYXJwZW50ZXIuCiAgICAgKENWRS0yMDE1LTAyMDgpCiAgICAgW1N0ZXBoZW4gSGVuc29uXQoKICAqKSBBU04uMSBzdHJ1Y3R1cmUgcmV1c2UgbWVtb3J5IGNvcnJ1cHRpb24gZml4CgogICAgIFJldXNpbmcgYSBzdHJ1Y3R1cmUgaW4gQVNOLjEgcGFyc2luZyBtYXkgYWxsb3cgYW4gYXR0YWNrZXIgdG8gY2F1c2UKICAgICBtZW1vcnkgY29ycnVwdGlvbiB2aWEgYW4gaW52YWxpZCB3cml0ZS4gU3VjaCByZXVzZSBpcyBhbmQgaGFzIGJlZW4KICAgICBzdHJvbmdseSBkaXNjb3VyYWdlZCBhbmQgaXMgYmVsaWV2ZWQgdG8gYmUgcmFyZS4KCiAgICAgQXBwbGljYXRpb25zIHRoYXQgcGFyc2Ugc3RydWN0dXJlcyBjb250YWluaW5nIENIT0lDRSBvciBBTlkgREVGSU5FRCBCWQogICAgIGNvbXBvbmVudHMgbWF5IGJlIGFmZmVjdGVkLiBDZXJ0aWZpY2F0ZSBwYXJzaW5nIChkMmlfWDUwOSBhbmQgcmVsYXRlZAogICAgIGZ1bmN0aW9ucykgYXJlIGhvd2V2ZXIgbm90IGFmZmVjdGVkLiBPcGVuU1NMIGNsaWVudHMgYW5kIHNlcnZlcnMgYXJlCiAgICAgbm90IGFmZmVjdGVkLgogICAgIChDVkUtMjAxNS0wMjg3KQogICAgIFtTdGVwaGVuIEhlbnNvbl0KCiAgKikgUEtDUzcgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBmaXgKCiAgICAgVGhlIFBLQ1MjNyBwYXJzaW5nIGNvZGUgZG9lcyBub3QgaGFuZGxlIG1pc3Npbmcgb3V0ZXIgQ29udGVudEluZm8KICAgICBjb3JyZWN0bHkuIEFuIGF0dGFja2VyIGNhbiBjcmFmdCBtYWxmb3JtZWQgQVNOLjEtZW5jb2RlZCBQS0NTIzcgYmxvYnMgd2l0aAogICAgIG1pc3NpbmcgY29udGVudCBhbmQgdHJpZ2dlciBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBvbiBwYXJzaW5nLgoKICAgICBBcHBsaWNhdGlvbnMgdGhhdCB2ZXJpZnkgUEtDUyM3IHNpZ25hdHVyZXMsIGRlY3J5cHQgUEtDUyM3IGRhdGEgb3IKICAgICBvdGhlcndpc2UgcGFyc2UgUEtDUyM3IHN0cnVjdHVyZXMgZnJvbSB1bnRydXN0ZWQgc291cmNlcyBhcmUKICAgICBhZmZlY3RlZC4gT3BlblNTTCBjbGllbnRzIGFuZCBzZXJ2ZXJzIGFyZSBub3QgYWZmZWN0ZWQuCgogICAgIFRoaXMgaXNzdWUgd2FzIHJlcG9ydGVkIHRvIE9wZW5TU0wgYnkgTWljaGFsIFphbGV3c2tpIChHb29nbGUpLgogICAgIChDVkUtMjAxNS0wMjg5KQogICAgIFtFbWlsaWEgS+RzcGVyXQoKICAqKSBEb1MgdmlhIHJlYWNoYWJsZSBhc3NlcnQgaW4gU1NMdjIgc2VydmVycyBmaXgKCiAgICAgQSBtYWxpY2lvdXMgY2xpZW50IGNhbiB0cmlnZ2VyIGFuIE9QRU5TU0xfYXNzZXJ0IChpLmUuLCBhbiBhYm9ydCkgaW4KICAgICBzZXJ2ZXJzIHRoYXQgYm90aCBzdXBwb3J0IFNTTHYyIGFuZCBlbmFibGUgZXhwb3J0IGNpcGhlciBzdWl0ZXMgYnkgc2VuZGluZwogICAgIGEgc3BlY2lhbGx5IGNyYWZ0ZWQgU1NMdjIgQ0xJRU5ULU1BU1RFUi1LRVkgbWVzc2FnZS4KCiAgICAgVGhpcyBpc3N1ZSB3YXMgZGlzY292ZXJlZCBieSBTZWFuIEJ1cmZvcmQgKEdvb2dsZSkgYW5kIEVtaWxpYSBL5HNwZXIKICAgICAoT3BlblNTTCBkZXZlbG9wbWVudCB0ZWFtKS4KICAgICAoQ1ZFLTIwMTUtMDI5MykKICAgICBbRW1pbGlhIEvkc3Blcl0KCiAgKikgRW1wdHkgQ0tFIHdpdGggY2xpZW50IGF1dGggYW5kIERIRSBmaXgKCiAgICAgSWYgY2xpZW50IGF1dGggaXMgdXNlZCB0aGVuIGEgc2VydmVyIGNhbiBzZWcgZmF1bHQgaW4gdGhlIGV2ZW50IG9mIGEgREhFCiAgICAgY2lwaGVyc3VpdGUgYmVpbmcgc2VsZWN0ZWQgYW5kIGEgemVybyBsZW5ndGggQ2xpZW50S2V5RXhjaGFuZ2UgbWVzc2FnZQogICAgIGJlaW5nIHNlbnQgYnkgdGhlIGNsaWVudC4gVGhpcyBjb3VsZCBiZSBleHBsb2l0ZWQgaW4gYSBEb1MgYXR0YWNrLgogICAgIChDVkUtMjAxNS0xNzg3KQogICAgIFtNYXR0IENhc3dlbGxdCgogICopIEhhbmRzaGFrZSB3aXRoIHVuc2VlZGVkIFBSTkcgZml4CgogICAgIFVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucyBhbiBPcGVuU1NMIDEuMC4yIGNsaWVudCBjYW4gY29tcGxldGUgYSBoYW5kc2hha2UKICAgICB3aXRoIGFuIHVuc2VlZGVkIFBSTkcuIFRoZSBjb25kaXRpb25zIGFyZToKICAgICAtIFRoZSBjbGllbnQgaXMgb24gYSBwbGF0Zm9ybSB3aGVyZSB0aGUgUFJORyBoYXMgbm90IGJlZW4gc2VlZGVkCiAgICAgYXV0b21hdGljYWxseSwgYW5kIHRoZSB1c2VyIGhhcyBub3Qgc2VlZGVkIG1hbnVhbGx5CiAgICAgLSBBIHByb3RvY29sIHNwZWNpZmljIGNsaWVudCBtZXRob2QgdmVyc2lvbiBoYXMgYmVlbiB1c2VkIChpLmUuIG5vdAogICAgIFNTTF9jbGllbnRfbWV0aG9kdjIzKQogICAgIC0gQSBjaXBoZXJzdWl0ZSBpcyB1c2VkIHRoYXQgZG9lcyBub3QgcmVxdWlyZSBhZGRpdGlvbmFsIHJhbmRvbSBkYXRhIGZyb20KICAgICB0aGUgUFJORyBiZXlvbmQgdGhlIGluaXRpYWwgQ2xpZW50SGVsbG8gY2xpZW50IHJhbmRvbSAoZS5nLiBQU0stUkM0LVNIQSkuCgogICAgIElmIHRoZSBoYW5kc2hha2Ugc3VjY2VlZHMgdGhlbiB0aGUgY2xpZW50IHJhbmRvbSB0aGF0IGhhcyBiZWVuIHVzZWQgd2lsbAogICAgIGhhdmUgYmVlbiBnZW5lcmF0ZWQgZnJvbSBhIFBSTkcgd2l0aCBpbnN1ZmZpY2llbnQgZW50cm9weSBhbmQgdGhlcmVmb3JlIHRoZQogICAgIG91dHB1dCBtYXkgYmUgcHJlZGljdGFibGUuCgogICAgIEZvciBleGFtcGxlIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB3aXRoIGFuIHVuc2VlZGVkIG9wZW5zc2wgd2lsbAogICAgIHN1Y2NlZWQgb24gYW4gdW5wYXRjaGVkIHBsYXRmb3JtOgoKICAgICBvcGVuc3NsIHNfY2xpZW50IC1wc2sgMWEyYjNjNGQgLXRsczFfMiAtY2lwaGVyIFBTSy1SQzQtU0hBCiAgICAgKENWRS0yMDE1LTAyODUpCiAgICAgW01hdHQgQ2Fzd2VsbF0KCiAgKikgVXNlIEFmdGVyIEZyZWUgZm9sbG93aW5nIGQyaV9FQ1ByaXZhdGVrZXkgZXJyb3IgZml4CgogICAgIEEgbWFsZm9ybWVkIEVDIHByaXZhdGUga2V5IGZpbGUgY29uc3VtZWQgdmlhIHRoZSBkMmlfRUNQcml2YXRlS2V5IGZ1bmN0aW9uCiAgICAgY291bGQgY2F1c2UgYSB1c2UgYWZ0ZXIgZnJlZSBjb25kaXRpb24uIFRoaXMsIGluIHR1cm4sIGNvdWxkIGNhdXNlIGEgZG91YmxlCiAgICAgZnJlZSBpbiBzZXZlcmFsIHByaXZhdGUga2V5IHBhcnNpbmcgZnVuY3Rpb25zIChzdWNoIGFzIGQyaV9Qcml2YXRlS2V5CiAgICAgb3IgRVZQX1BLQ1M4MlBLRVkpIGFuZCBjb3VsZCBsZWFkIHRvIGEgRG9TIGF0dGFjayBvciBtZW1vcnkgY29ycnVwdGlvbgogICAgIGZvciBhcHBsaWNhdGlvbnMgdGhhdCByZWNlaXZlIEVDIHByaXZhdGUga2V5cyBmcm9tIHVudHJ1c3RlZAogICAgIHNvdXJjZXMuIFRoaXMgc2NlbmFyaW8gaXMgY29uc2lkZXJlZCByYXJlLgoKICAgICBUaGlzIGlzc3VlIHdhcyBkaXNjb3ZlcmVkIGJ5IHRoZSBCb3JpbmdTU0wgcHJvamVjdCBhbmQgZml4ZWQgaW4gdGhlaXIKICAgICBjb21taXQgNTE3MDczY2Q0Yi4KICAgICAoQ1ZFLTIwMTUtMDIwOSkKICAgICBbTWF0dCBDYXN3ZWxsXQoKICAqKSBYNTA5X3RvX1g1MDlfUkVRIE5VTEwgcG9pbnRlciBkZXJlZiBmaXgKCiAgICAgVGhlIGZ1bmN0aW9uIFg1MDlfdG9fWDUwOV9SRVEgd2lsbCBjcmFzaCB3aXRoIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGlmCiAgICAgdGhlIGNlcnRpZmljYXRlIGtleSBpcyBpbnZhbGlkLiBUaGlzIGZ1bmN0aW9uIGlzIHJhcmVseSB1c2VkIGluIHByYWN0aWNlLgoKICAgICBUaGlzIGlzc3VlIHdhcyBkaXNjb3ZlcmVkIGJ5IEJyaWFuIENhcnBlbnRlci4KICAgICAoQ1ZFLTIwMTUtMDI4OCkKICAgICBbU3RlcGhlbiBIZW5zb25dCgogICopIFJlbW92ZWQgdGhlIGV4cG9ydCBjaXBoZXJzIGZyb20gdGhlIERFRkFVTFQgY2lwaGVycwogICAgIFtLdXJ0IFJvZWNreF0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFsIGFuZCAxLjAuMiBbMjIgSmFuIDIwMTVdCgogICopIEZhY2lsaXRhdGUgInVuaXZlcnNhbCIgQVJNIGJ1aWxkcyB0YXJnZXRpbmcgcmFuZ2Ugb2YgQVJNIElTQXMsIGUuZy4KICAgICBBUk12NSB0aHJvdWdoIEFSTXY4LCBhcyBvcHBvc2l0ZSB0byAibG9ja2luZyIgaXQgdG8gc2luZ2xlIG9uZS4KICAgICBTbyBmYXIgdGhvc2Ugd2hvIGhhdmUgdG8gdGFyZ2V0IG11bHRpcGxlIHBsYWZvcm1zIHdvdWxkIGNvbXByb21pc2UKICAgICBhbmQgYXJndWUgdGhhdCBiaW5hcnkgdGFyZ2V0aW5nIHNheSBBUk12NSB3b3VsZCBzdGlsbCBleGVjdXRlIG9uCiAgICAgQVJNdjguICJVbml2ZXJzYWwiIGJ1aWxkIHJlc29sdmVzIHRoaXMgY29tcHJvbWlzZSBieSBwcm92aWRpbmcKICAgICBuZWFyLW9wdGltYWwgcGVyZm9ybWFuY2UgZXZlbiBvbiBuZXdlciBwbGF0Zm9ybXMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFjY2VsZXJhdGVkIE5JU1QgUC0yNTYgZWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb24gZm9yIHg4Nl82NAogICAgIChvdGhlciBwbGF0Zm9ybXMgcGVuZGluZykuCiAgICAgW1NoYXkgR3Vlcm9uICYgVmxhZCBLcmFzbm92IChJbnRlbCBDb3JwKSwgQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHRoZSBTaWduZWRDZXJ0aWZpY2F0ZVRpbWVzdGFtcExpc3QgY2VydGlmaWNhdGUgYW5kCiAgICAgT0NTUCByZXNwb25zZSBleHRlbnNpb25zIGZyb20gUkZDNjk2Mi4KICAgICBbUm9iIFN0cmFkbGluZ10KCiAgKikgRml4IGVjX0dGcF9zaW1wbGVfcG9pbnRzX21ha2VfYWZmaW5lICh0aHVzLCBFQ19QT0lOVHNfbXVsIGV0Yy4pCiAgICAgZm9yIGNvcm5lciBjYXNlcy4gKENlcnRhaW4gaW5wdXQgcG9pbnRzIGF0IGluZmluaXR5IGNvdWxkIGxlYWQgdG8KICAgICBib2d1cyByZXN1bHRzLCB3aXRoIG5vbi1pbmZpbml0eSBpbnB1dHMgbWFwcGVkIHRvIGluZmluaXR5IHRvby4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBQb3dlcklTQSAyLjAuNywgZmlyc3QgaW1wbGVtZW50ZWQgaW4gUE9XRVI4LgogICAgIFRoaXMgY292ZXJzIEFFUywgU0hBMjU2LzUxMiBhbmQgR0hBU0guICJJbml0aWFsIiBtZWFucyB0aGF0IG1vc3QKICAgICBjb21tb24gY2FzZXMgYXJlIG9wdGltaXplZCBhbmQgdGhlcmUgc3RpbGwgaXMgcm9vbSBmb3IgZnVydGhlcgogICAgIGltcHJvdmVtZW50cy4gVmVjdG9yIFBlcm11dGF0aW9uIEFFUyBmb3IgQWx0aXZlYyBpcyBhbHNvIGFkZGVkLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgbGl0dGxlLWVuZGlhbiBwcGM2NCBMaW51eCB0YXJnZXQuCiAgICAgW01hcmNlbG8gQ2VycmkgKElCTSldCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgQU1SdjggSVNBIGNyeXB0byBleHRlbnNpb25zLiBUaGlzIGNvdmVycyBBRVMsCiAgICAgU0hBMSwgU0hBMjU2IGFuZCBHSEFTSC4gIkluaXRpYWwiIG1lYW5zIHRoYXQgbW9zdCBjb21tb24gY2FzZXMKICAgICBhcmUgb3B0aW1pemVkIGFuZCB0aGVyZSBzdGlsbCBpcyByb29tIGZvciBmdXJ0aGVyIGltcHJvdmVtZW50cy4KICAgICBCb3RoIDMyLSBhbmQgNjQtYml0IG1vZGVzIGFyZSBzdXBwb3J0ZWQuCiAgICAgW0FuZHkgUG9seWFrb3YsIEFyZCBCaWVzaGV1dmVsIChMaW5hcm8pXQoKICAqKSBJbXByb3ZlZCBBUk12NyBORU9OIHN1cHBvcnQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIFN1cHBvcnQgZm9yIFNQQVJDIEFyY2hpdGVjdHVyZSAyMDExIGNyeXB0byBleHRlbnNpb25zLCBmaXJzdAogICAgIGltcGxlbWVudGVkIGluIFNQQVJDIFQ0LiBUaGlzIGNvdmVycyBBRVMsIERFUywgQ2FtZWxsaWEsIFNIQTEsCiAgICAgU0hBMjU2LzUxMiwgTUQ1LCBHSEFTSCBhbmQgbW9kdWxhciBleHBvbmVudGlhdGlvbi4KICAgICBbQW5keSBQb2x5YWtvdiwgRGF2aWQgTWlsbGVyXQoKICAqKSBBY2NlbGVyYXRlZCBtb2R1bGFyIGV4cG9uZW50aWF0aW9uIGZvciBJbnRlbCBwcm9jZXNzb3JzLCBhLmsuYS4KICAgICBSU0FaLgogICAgIFtTaGF5IEd1ZXJvbiAmIFZsYWQgS3Jhc25vdiAoSW50ZWwgQ29ycCldCgogICopIFN1cHBvcnQgZm9yIG5ldyBhbmQgdXBjb21pbmcgSW50ZWwgcHJvY2Vzc29ycywgaW5jbHVkaW5nIEFWWDIsCiAgICAgQk1JIGFuZCBTSEEgSVNBIGV4dGVuc2lvbnMuIFRoaXMgaW5jbHVkZXMgYWRkaXRpb25hbCAic3RpdGNoZWQiCiAgICAgaW1wbGVtZW50YXRpb25zLCBBRVNOSS1TSEEyNTYgYW5kIEdDTSwgYW5kIG11bHRpLWJ1ZmZlciBzdXBwb3J0CiAgICAgZm9yIFRMUyBlbmNyeXB0LgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBJbnRlbCBDb3JwLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBTdXBwb3J0IGZvciBEVExTIDEuMi4gVGhpcyBhZGRzIHR3byBzZXRzIG9mIERUTFMgbWV0aG9kczogRFRMU18qX21ldGhvZCgpCiAgICAgc3VwcG9ydHMgYm90aCBEVExTIDEuMiBhbmQgMS4wIGFuZCBzaG91bGQgdXNlIHdoYXRldmVyIHZlcnNpb24gdGhlIHBlZXIKICAgICBzdXBwb3J0cyBhbmQgRFRMU3YxXzJfKl9tZXRob2QoKSB3aGljaCBzdXBwb3J0cyBEVExTIDEuMiBvbmx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVzZSBhbGdvcml0aG0gc3BlY2lmaWMgY2hhaW5zIGluIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoKToKICAgICB0aGlzIGZpeGVzIGEgbGltaWF0aW9uIGluIHByZXZpb3VzIHZlcnNpb25zIG9mIE9wZW5TU0wuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kZWQgUlNBIE9BRVAgc3VwcG9ydCB2aWEgRVZQX1BLRVkgQVBJLiBPcHRpb25zIHRvIHNwZWNpZnkgZGlnZXN0LAogICAgIE1HRjEgZGlnZXN0IGFuZCBPQUVQIGxhYmVsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBFVlAgc3VwcG9ydCBmb3Iga2V5IHdyYXBwaW5nIGFsZ29yaXRobXMsIHRvIGF2b2lkIHByb2JsZW1zIHdpdGgKICAgICBleGlzdGluZyBjb2RlIHRoZSBmbGFnIEVWUF9DSVBIRVJfQ1RYX1dSQVBfQUxMT1cgaGFzIHRvIGJlIHNldCBpbgogICAgIHRoZSBFVlBfQ0lQSEVSX0NUWCBvciBhbiBlcnJvciBpcyByZXR1cm5lZC4gQWRkIEFFUyBhbmQgREVTMyB3cmFwCiAgICAgYWxnb3JpdGhtcyBhbmQgaW5jbHVkZSB0ZXN0cyBjYXNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZnVuY3Rpb25zIHRvIGFsbG9jYXRlIGFuZCBzZXQgdGhlIGZpZWxkcyBvZiBhbiBFQ0RTQV9NRVRIT0QKICAgICBzdHJ1Y3R1cmUuCiAgICAgW0RvdWdsYXMgRS4gRW5nZXJ0LCBTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgT1BFTlNTTF9nbXRpbWVfZGlmZiBhbmQgQVNOMV9USU1FX2RpZmYgdG8gZmluZCB0aGUKICAgICBkaWZmZXJlbmNlIGluIGRheXMgYW5kIHNlY29uZHMgYmV0d2VlbiB0d28gdG0gb3IgQVNOMV9USU1FIHN0cnVjdHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIC1yZXYgdGVzdCBvcHRpb24gdG8gc19zZXJ2ZXIgdG8ganVzdCByZXZlcnNlIG9yZGVyIG9mIGNoYXJhY3RlcnMKICAgICByZWNlaXZlZCBieSBjbGllbnQgYW5kIHNlbmQgYmFjayB0byBzZXJ2ZXIuIEFsc28gcHJpbnRzIGFuIGFiYnJldmlhdGVkCiAgICAgc3VtbWFyeSBvZiB0aGUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb24gLWJyaWVmIGZvciBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgdG8gcHJpbnQgb3V0IGEgYnJpZWYgc3VtbWFyeQogICAgIG9mIGNvbm5lY3Rpb24gcGFyYW1ldGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY2FsbGJhY2tzIGZvciBhcmJpdHJhcnkgVExTIGV4dGVuc2lvbnMuCiAgICAgW1RyZXZvciBQZXJyaW4gPHRyZXZwQHRyZXZwLm5ldD4gYW5kIEJlbiBMYXVyaWVdCgogICopIE5ldyBvcHRpb24gLWNybF9kb3dubG9hZCBpbiBzZXZlcmFsIG9wZW5zc2wgdXRpbGl0aWVzIHRvIGRvd25sb2FkIENSTHMKICAgICBmcm9tIENSTERQIGV4dGVuc2lvbiBpbiBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbnMgLUNSTCBhbmQgLUNSTGZvcm0gZm9yIHNfY2xpZW50IGFuZCBzX3NlcnZlciBmb3IgQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOV9DUkxfZGlmZiB0byBnZW5lcmF0ZSBhIGRlbHRhIENSTCBmcm9tIHRoZSBkaWZmZXJlbmNlCiAgICAgb2YgdHdvIGZ1bGwgQ1JMcy4gQWRkIHN1cHBvcnQgdG8gImNybCIgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIHRvIHNldCBsb29rdXBfY3JscyBmdW5jdGlvbiBhbmQgdG8gcmV0cmlldmUKICAgICBYNTA5X1NUT1JFIGZyb20gWDUwOV9TVE9SRV9DVFguCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJpbnQgb3V0IGRlcHJlY2F0ZWQgaXNzdWVyIGFuZCBzdWJqZWN0IHVuaXF1ZSBJRCBmaWVsZHMgaW4KICAgICBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIE9DU1AgSS9PIGZ1bmN0aW9ucyBzbyB0aGV5IGNhbiBiZSB1c2VkIGZvciBzaW1wbGUgZ2VuZXJhbCBwdXJwb3NlCiAgICAgSFRUUCBhcyB3ZWxsIGFzIE9DU1AuIE5ldyB3cmFwcGVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRvd25sb2FkCiAgICAgQ1JMcyB1c2luZyB0aGUgT0NTUCBBUEkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGVsZWdhdGUgY29tbWFuZCBsaW5lIGhhbmRsaW5nIGluIHNfY2xpZW50L3Nfc2VydmVyIHRvIFNTTF9DT05GIEFQSXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU1NMX0NPTkYqIGZ1bmN0aW9ucy4gVGhlc2UgcHJvdmlkZSBhIGNvbW1vbiBmcmFtZXdvcmsgZm9yIGFwcGxpY2F0aW9uCiAgICAgY29uZmlndXJhdGlvbiB1c2luZyBjb25maWd1cmF0aW9uIGZpbGVzIG9yIGNvbW1hbmQgbGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU1NML1RMUyB0cmFjaW5nIGNvZGUuIFRoaXMgcGFyc2VzIG91dCBTU0wvVExTIHJlY29yZHMgdXNpbmcgdGhlCiAgICAgbWVzc2FnZSBjYWxsYmFjayBhbmQgcHJpbnRzIHRoZSByZXN1bHRzLiBOZWVkcyBjb21waWxlIHRpbWUgb3B0aW9uCiAgICAgImVuYWJsZS1zc2wtdHJhY2UiLiBOZXcgb3B0aW9ucyB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgdG8gZW5hYmxlCiAgICAgdHJhY2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgY3RybCBhbmQgbWFjcm8gdG8gcmV0cmlldmUgc3VwcG9ydGVkIHBvaW50cyBleHRlbnNpb25zLgogICAgIFByaW50IG91dCBleHRlbnNpb24gaW4gc19zZXJ2ZXIgYW5kIHNfY2xpZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgdG8gcmV0cmlldmUgY2VydGlmaWNhdGUgc2lnbmF0dXJlIGFuZCBzaWduYXR1cmUKICAgICBPSUQgTklELgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdW5jdGlvbnMgdG8gcmV0cmlldmUgYW5kIG1hbmlwdWxhdGUgdGhlIHJhdyBjaXBoZXJsaXN0IHNlbnQgYnkgYQogICAgIGNsaWVudCB0byBPcGVuU1NMLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBTdWl0ZSBCIG1vZGVzIGZvciBUTFMgY29kZS4gVGhlc2UgdXNlIGFuZCBlbmZvcmNlIHRoZSByZXF1aXJlbWVudHMKICAgICBvZiBSRkM2NDYwOiByZXN0cmljdCBjaXBoZXJzdWl0ZXMsIG9ubHkgcGVybWl0IFN1aXRlIEIgYWxnb3JpdGhtcyBhbmQKICAgICBvbmx5IHVzZSBTdWl0ZSBCIGN1cnZlcy4gVGhlIFN1aXRlIEIgbW9kZXMgY2FuIGJlIHNldCBieSB1c2luZyB0aGUKICAgICBzdHJpbmdzICJTVUlURUIxMjgiLCAiU1VJVEVCMTkyIiBvciAiU1VJVEVCMTI4T05MWSIgZm9yIHRoZSBjaXBoZXJzdHJpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGNoYWluIHZlcmlmaWNhdGlvbiBmbGFncyBmb3IgU3VpdGUgQiBsZXZlbHMgb2Ygc2VjdXJpdHkuIENoZWNrCiAgICAgYWxnb3JpdGhtcyBhcmUgYWNjZXB0YWJsZSB3aGVuIGZsYWdzIGFyZSBzZXQgaW4gWDUwOV92ZXJpZnlfY2VydC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHRsczFfY2hlY2tfY2hhaW4gcmV0dXJuIGEgc2V0IG9mIGZsYWdzIGluZGljYXRpbmcgY2hlY2tzIHBhc3NlZAogICAgIGJ5IGEgY2VydGlmaWNhdGUgY2hhaW4uIEFkZCBhZGRpdGlvbmFsIHRlc3RzIHRvIGhhbmRsZSBjbGllbnQKICAgICBjZXJ0aWZpY2F0ZXM6IGNoZWNrcyBmb3IgbWF0Y2hpbmcgY2VydGlmaWNhdGUgdHlwZSBhbmQgaXNzdWVyIG5hbWUKICAgICBjb21wYXJpc29uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIElmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1c2UgYSBzaWduYXR1cmUgYWxnb3JpdGhtIG5vdCBpbiB0aGUgcGVlcgogICAgIHByZWZlcmVuY2UgbGlzdCBhYm9ydCB0aGUgaGFuZHNoYWtlLiBJZiBjbGllbnQgaGFzIG5vIHN1aXRhYmxlCiAgICAgc2lnbmF0dXJlIGFsZ29yaXRobXMgaW4gcmVzcG9uc2UgdG8gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGRvIG5vdAogICAgIHVzZSB0aGUgY2VydGlmaWNhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgc2VydmVyIEVDIHRtcCBrZXkgaXMgbm90IGluIGNsaWVudCBwcmVmZXJlbmNlIGxpc3QgYWJvcnQgaGFuZHNoYWtlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBjZXJ0aWZpY2F0ZSBzdG9yZXMgaW4gQ0VSVCBzdHJ1Y3R1cmUuIFRoaXMgbWFrZXMgaXQKICAgICBwb3NzaWJsZSB0byBoYXZlIGRpZmZlcmVudCBzdG9yZXMgcGVyIFNTTCBzdHJ1Y3R1cmUgb3Igb25lIHN0b3JlIGluCiAgICAgdGhlIHBhcmVudCBTU0xfQ1RYLiBJbmNsdWRlIGRpc3RpbnQgc3RvcmVzIGZvciBjZXJ0aWZpY2F0ZSBjaGFpbgogICAgIHZlcmlmaWNhdGlvbiBhbmQgY2hhaW4gYnVpbGRpbmcuIE5ldyBjdHJsIFNTTF9DVFJMX0JVSUxEX0NFUlRfQ0hBSU4KICAgICB0byBidWlsZCBhbmQgc3RvcmUgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBpbiBDRVJUIHN0cnVjdHVyZTogcmV0dXJpbmcKICAgICBhbiBlcnJvciBpZiB0aGUgY2hhaW4gY2Fubm90IGJlIGJ1aWx0OiB0aGlzIHdpbGwgYWxsb3cgYXBwbGljYXRpb25zCiAgICAgdG8gdGVzdCBpZiBhIGNoYWluIGlzIGNvcnJlY3RseSBjb25maWd1cmVkLgoKICAgICBOb3RlOiBpZiB0aGUgQ0VSVCBiYXNlZCBzdG9yZXMgYXJlIG5vdCBzZXQgdGhlbiB0aGUgcGFyZW50IFNTTF9DVFgKICAgICBzdG9yZSBpcyB1c2VkIHRvIHJldGFpbiBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgYmVoYXZpb3VyLgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gc3NsX3NldF9jbGllbnRfZGlzYWJsZWQgdG8gc2V0IGEgY2lwaGVyc3VpdGUgZGlzYWJsZWQKICAgICBtYXNrIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNlc3Npb24sIGNoZWNrIG1hc2sgd2hlbiBzZW5kaW5nIGNsaWVudAogICAgIGhlbGxvIGFuZCBjaGVja2luZyB0aGUgcmVxdWVzdGVkIGNpcGhlcnN1aXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBjdHJscyB0byByZXRyaWV2ZSBhbmQgc2V0IGNlcnRpZmljYXRlIHR5cGVzIGluIGEgY2VydGlmaWNhdGUKICAgICByZXF1ZXN0IG1lc3NhZ2UuIFByaW50IG91dCByZWNlaXZlZCB2YWx1ZXMgaW4gc19jbGllbnQuIElmIGNlcnRpZmljYXRlCiAgICAgdHlwZXMgaXMgbm90IHNldCB3aXRoIGN1c3RvbSB2YWx1ZXMgc2V0IHNlbnNpYmxlIHZhbHVlcyBiYXNlZCBvbgogICAgIHN1cHBvcnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBkaXN0aW5jdCBjbGllbnQgYW5kIHNlcnZlciBzdXBwb3J0ZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNlcnRpZmljYXRlIGNhbGxiYWNrLiBJZiBzZXQgdGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBjZXJ0aWZpY2F0ZQogICAgIGlzIHJlcXVpcmVkIGJ5IGNsaWVudCBvciBzZXJ2ZXIuIEFuIGFwcGxpY2F0aW9uIGNhbiBkZWNpZGUgd2hpY2gKICAgICBjZXJ0aWZpY2F0ZSBjaGFpbiB0byBwcmVzZW50IGJhc2VkIG9uIGFyYml0cmFyeSBjcml0ZXJpYTogZm9yIGV4YW1wbGUKICAgICBzdXBwb3J0ZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMuIEFkZCB2ZXJ5IHNpbXBsZSBleGFtcGxlIHRvIHNfc2VydmVyLgogICAgIFRoaXMgZml4ZXMgbWFueSBvZiB0aGUgcHJvYmxlbXMgYW5kIHJlc3RyaWN0aW9ucyBvZiB0aGUgZXhpc3RpbmcgY2xpZW50CiAgICAgY2VydGlmaWNhdGUgY2FsbGJhY2s6IGZvciBleGFtcGxlIHlvdSBjYW4gbm93IGNsZWFyIGFuIGV4aXN0aW5nCiAgICAgY2VydGlmaWNhdGUgYW5kIHNwZWNpZnkgdGhlIHdob2xlIGNoYWluLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgInZhbGlkX2ZsYWdzIiBmaWVsZCB0byBDRVJUX1BLRVkgc3RydWN0dXJlIHdoaWNoIGRldGVybWluZXMgd2hhdAogICAgIHRoZSBjZXJ0aWZpY2F0ZSBjYW4gYmUgdXNlZCBmb3IgKGlmIGFueXRoaW5nKS4gU2V0IHZhbGlkX2ZsYWdzIGZpZWxkIAogICAgIGluIG5ldyB0bHMxX2NoZWNrX2NoYWluIGZ1bmN0aW9uLiBTaW1wbGlmeSBzc2xfc2V0X2NlcnRfbWFza3Mgd2hpY2ggdXNlZAogICAgIHRvIGhhdmUgc2ltaWxhciBjaGVja3MgaW4gaXQuCgogICAgIEFkZCBuZXcgImNlcnRfZmxhZ3MiIGZpZWxkIHRvIENFUlQgc3RydWN0dXJlIGFuZCBpbmNsdWRlIGEgInN0cmljdCBtb2RlIi4KICAgICBUaGlzIGVuZm9yY2VzIHNvbWUgVExTIGNlcnRpZmljYXRlIHJlcXVpcmVtZW50cyAoc3VjaCBhcyBvbmx5IHBlcm1pdHRpbmcKICAgICBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgYWxnb3JpdGhtcyBjb250YWluZWQgaW4gdGhlIHN1cHBvcnRlZCBhbGdvcml0aG1zCiAgICAgZXh0ZW5zaW9uKSB3aGljaCBzb21lIGltcGxlbWVudGF0aW9ucyBpZ25vcmU6IHRoaXMgb3B0aW9uIHNob3VsZCBiZSB1c2VkCiAgICAgd2l0aCBjYXV0aW9uIGFzIGl0IGNvdWxkIGNhdXNlIGludGVyb3BlcmFiaWxpdHkgaXNzdWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBhbmQgdGlkeSBzaWduYXR1cmUgYWxnb3JpdGhtIGV4dGVuc2lvbiBwcm9jZXNzaW5nLiBXb3JrIG91dAogICAgIHNoYXJlZCBzaWduYXR1cmUgYWxnb3JpdGhtcyBiYXNlZCBvbiBwcmVmZXJlbmNlcyBhbmQgcGVlciBhbGdvcml0aG1zCiAgICAgYW5kIHByaW50IHRoZW0gb3V0IGluIHNfY2xpZW50IGFuZCBzX3NlcnZlci4gQWJvcnQgaGFuZHNoYWtlIGlmIG5vCiAgICAgc2hhcmVkIHNpZ25hdHVyZSBhbGdvcml0aG1zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZnVuY3Rpb25zIHRvIGFsbG93IGN1c3RvbWlzZWQgc3VwcG9ydGVkIHNpZ25hdHVyZSBhbGdvcml0aG1zCiAgICAgZm9yIFNTTCBhbmQgU1NMX0NUWCBzdHJ1Y3R1cmVzLiBBZGQgb3B0aW9ucyB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIKICAgICB0byBzdXBwb3J0IHRoZW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFNTTF9jZXJ0c19jbGVhcigpIHRvIGRlbGV0ZSBhbGwgcmVmZXJlbmNlcyB0byBjZXJ0aWZpY2F0ZXMKICAgICBmcm9tIGFuIFNTTCBzdHJ1Y3R1cmUuIEJlZm9yZSB0aGlzIG9uY2UgYSBjZXJ0aWZpY2F0ZSBoYWQgYmVlbiBhZGRlZAogICAgIGl0IGNvdWxkbid0IGJlIHJlbW92ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW50ZWdyYXRlIGhvc3RuYW1lLCBlbWFpbCBhZGRyZXNzIGFuZCBJUCBhZGRyZXNzIGNoZWNraW5nIHdpdGggY2VydGlmaWNhdGUKICAgICB2ZXJpZmljYXRpb24uIE5ldyB2ZXJpZnkgb3B0aW9ucyBzdXBwb3J0aW5nIGNoZWNraW5nIGluIG9wZW5zbCB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIGFuZCB3aWxkY2FyZCBtYXRjaGluZyBzdXBwb3J0IHRvIGhvc3RuYW1lIGFuZCBlbWFpbCBjaGVja2luZwogICAgIGZ1bmN0aW9ucy4gQWRkIG1hbnVhbCBwYWdlLgogICAgIFtGbG9yaWFuIFdlaW1lciAoUmVkIEhhdCBQcm9kdWN0IFNlY3VyaXR5IFRlYW0pXQoKICAqKSBOZXcgZnVuY3Rpb25zIHRvIGNoZWNrIGEgaG9zdG5hbWUgZW1haWwgb3IgSVAgYWRkcmVzcyBhZ2FpbnN0IGEKICAgICBjZXJ0aWZpY2F0ZS4gQWRkIG9wdGlvbnMgeDUwOSB1dGlsaXR5IHRvIHByaW50IHJlc3VsdHMgb2YgY2hlY2tzIGFnYWluc3QKICAgICBhIGNlcnRpZmljYXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBPQ1NQIGNoZWNraW5nLgogICAgIFtSb2IgU3RyYWRsaW5nIDxyb2Iuc3RyYWRsaW5nQGNvbW9kby5jb20+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBJbml0aWFsIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBleHBsaWNpdGx5IHRydXN0ZWQgbm9uLXJvb3QgQ0FzLiAKICAgICBPcGVuU1NMIHN0aWxsIHRyaWVzIHRvIGJ1aWxkIGEgY29tcGxldGUgY2hhaW4gdG8gYSByb290IGJ1dCBpZiBhbgogICAgIGludGVybWVkaWF0ZSBDQSBoYXMgYSB0cnVzdCBzZXR0aW5nIGluY2x1ZGVkIHRoYXQgaXMgdXNlZC4gVGhlIGZpcnN0CiAgICAgc2V0dGluZyBpcyB1c2VkOiB3aGV0aGVyIHRvIHRydXN0IChlLmcuLCAtYWRkdHJ1c3Qgb3B0aW9uIHRvIHRoZSB4NTA5CiAgICAgdXRpbGl0eSkgb3IgcmVqZWN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAtdHJ1c3RlZF9maXJzdCBvcHRpb24gd2hpY2ggYXR0ZW1wdHMgdG8gZmluZCBjZXJ0aWZpY2F0ZXMgaW4gdGhlCiAgICAgdHJ1c3RlZCBzdG9yZSBldmVuIGlmIGFuIHVudHJ1c3RlZCBjaGFpbiBpcyBhbHNvIHN1cHBsaWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1JUFMgYXNzZW1ibHkgcGFjayB1cGRhdGVzOiBzdXBwb3J0IGZvciBNSVBTMzJyMiBhbmQgU21hcnRNSVBTIEFTRSwKICAgICBwbGF0Zm9ybSBzdXBwb3J0IGZvciBMaW51eCBhbmQgQW5kcm9pZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgU3VwcG9ydCBmb3IgbGludXgteDMyLCBJTFAzMiBlbnZpcm9ubWVudCBpbiB4ODZfNjQgZnJhbWV3b3JrLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBFeHBlcmltZW50YWwgbXVsdGktaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgRklQUyBjYXBhYmxlIE9wZW5TU0wuCiAgICAgV2hlbiBpbiBGSVBTIG1vZGUgdGhlIGFwcHJvdmVkIGltcGxlbWVudGF0aW9ucyBhcmUgdXNlZCBhcyBub3JtYWwsCiAgICAgd2hlbiBub3QgaW4gRklQUyBtb2RlIHRoZSBpbnRlcm5hbCB1bmFwcHJvdmVkIHZlcnNpb25zIGFyZSB1c2VkIGluc3RlYWQuCiAgICAgVGhpcyBtZWFucyB0aGF0IHRoZSBGSVBTIGNhcGFibGUgT3BlblNTTCBpc24ndCBmb3JjZWQgdG8gdXNlIHRoZQogICAgIChvZnRlbiBsb3dlciBwZXJmb3JtYW5jZSkgRklQUyBpbXBsZW1lbnRhdGlvbnMgb3V0c2lkZSBGSVBTIG1vZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVHJhbnNwYXJlbnRseSBzdXBwb3J0IFg5LjQyIERIIHBhcmFtZXRlcnMgd2hlbiBjYWxsaW5nCiAgICAgUEVNX3JlYWRfYmlvX0RIcGFyYW1ldGVycy4gVGhpcyBtZWFucyBleGlzdGluZyBhcHBsaWNhdGlvbnMgY2FuIGhhbmRsZQogICAgIHRoZSBuZXcgcGFyYW1ldGVyIGZvcm1hdCBhdXRvbWF0aWNhbGx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIFg5LjQyIERIIHBhcmFtZXRlciBmb3JtYXQ6IG1haW5seQogICAgIHRvIHN1cHBvcnQgdXNlIG9mICdxJyBwYXJhbWV0ZXIgZm9yIFJGQzUxMTQgcGFyYW1ldGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgREggcGFyYW1ldGVycyBmcm9tIFJGQzUxMTQgaW5jbHVkaW5nIHRlc3QgZGF0YSB0byBkaHRlc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgYXV0b21hdGljIEVDIHRlbXBvcmFyeSBrZXkgcGFyYW1ldGVyIHNlbGVjdGlvbi4gSWYgZW5hYmxlZAogICAgIHRoZSBtb3N0IHByZWZlcnJlZCBFQyBwYXJhbWV0ZXJzIGFyZSBhdXRvbWF0aWNhbGx5IHVzZWQgaW5zdGVhZCBvZgogICAgIGhhcmRjb2RlZCBmaXhlZCBwYXJhbWV0ZXJzLiBOb3cgYSBzZXJ2ZXIganVzdCBoYXMgdG8gY2FsbDoKICAgICBTU0xfQ1RYX3NldF9lY2RoX2F1dG8oY3R4LCAxKSBhbmQgdGhlIHNlcnZlciB3aWxsIGF1dG9tYXRpY2FsbHkKICAgICBzdXBwb3J0IEVDREggYW5kIHVzZSB0aGUgbW9zdCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgYW5kIHRpZHkgRUMgY3VydmUgYW5kIHBvaW50IGZvcm1hdCBUTFMgZXh0ZW5zaW9uIGNvZGUuIFVzZQogICAgIHN0YXRpYyBzdHJ1Y3R1cmVzIGluc3RlYWQgb2YgYWxsb2NhdGlvbiBpZiBkZWZhdWx0IHZhbHVlcyBhcmUgdXNlZC4KICAgICBOZXcgY3RybHMgdG8gc2V0IGN1cnZlcyB3ZSB3aXNoIHRvIHN1cHBvcnQgYW5kIHRvIHJldHJpZXZlIHNoYXJlZCBjdXJ2ZXMuCiAgICAgUHJpbnQgb3V0IHNoYXJlZCBjdXJ2ZXMgaW4gc19zZXJ2ZXIuIE5ldyBvcHRpb25zIHRvIHNfc2VydmVyIGFuZCBzX2NsaWVudAogICAgIHRvIHNldCBsaXN0IG9mIHN1cHBvcnRlZCBjdXJ2ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGN0cmxzIHRvIHJldHJpZXZlIHN1cHBvcnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtcyBhbmQgCiAgICAgc3VwcG9ydGVkIGN1cnZlIHZhbHVlcyBhcyBhbiBhcnJheSBvZiBOSURzLiBFeHRlbmQgb3BlbnNzbCB1dGlsaXR5CiAgICAgdG8gcHJpbnQgb3V0IHJlY2VpdmVkIHZhbHVlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IEFQSXMgRUNfY3VydmVfbmlzdDJuaWQgYW5kIEVDX2N1cnZlX25pZDJuaXN0IHdoaWNoIGNvbnZlcnQKICAgICBiZXR3ZWVuIE5JRHMgYW5kIHRoZSBtb3JlIGNvbW1vbiBOSVNUIG5hbWVzIHN1Y2ggYXMgIlAtMjU2Ii4gRW5oYW5jZQogICAgIGVjcGFyYW0gdXRpbGl0eSBhbmQgRUNDIG1ldGhvZCB0byByZWNvZ25pc2UgdGhlIE5JU1QgbmFtZXMgZm9yIGN1cnZlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIFNTTC9UTFMgY2VydGlmaWNhdGUgY2hhaW4gaGFuZGxpbmcgdG8gc3VwcG9ydCBkaWZmZXJlbnQKICAgICBjaGFpbnMgZm9yIGVhY2ggY2VydGlmaWNhdGUgaW5zdGVhZCBvZiBvbmUgY2hhaW4gaW4gdGhlIHBhcmVudCBTU0xfQ1RYLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIGZpeGVkIERIIGNpcGhlcnN1aXRlIGNsaWVudCBhdXRoZW50aWNhdGlvbjogd2hlcmUgYm90aAogICAgIHNlcnZlciBhbmQgY2xpZW50IHVzZSBESCBjZXJ0aWZpY2F0ZXMgd2l0aCBjb21tb24gcGFyYW1ldGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBmaXhlZCBESCBjaXBoZXJzdWl0ZXM6IHRob3NlIHJlcXVpcmluZyBESCBzZXJ2ZXIKICAgICBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIGkyZF9yZV9YNTA5X3RicyBmb3IgcmUtZW5jb2RpbmcgdGhlIFRCUyBwb3J0aW9uIG9mCiAgICAgdGhlIGNlcnRpZmljYXRlLgogICAgIE5vdGU6IFJlbGF0ZWQgMS4wLjItYmV0YSBzcGVjaWZpYyBtYWNyb3MgWDUwOV9nZXRfY2VydF9pbmZvLAogICAgIFg1MDlfQ0lORl9zZXRfbW9kaWZpZWQsIFg1MDlfQ0lORl9nZXRfaXNzdWVyLCBYNTA5X0NJTkZfZ2V0X2V4dGVuc2lvbnMgYW5kCiAgICAgWDUwOV9DSU5GX2dldF9zaWduYXR1cmUgd2VyZSByZXZlcnRlZCBwb3N0IGludGVybmFsIHRlYW0gcmV2aWV3LgoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWsgYW5kIDEuMC4xbCBbMTUgSmFuIDIwMTVdCgogICopIEJ1aWxkIGZpeGVzIGZvciB0aGUgV2luZG93cyBhbmQgT3BlblZNUyBwbGF0Zm9ybXMKICAgICBbTWF0dCBDYXN3ZWxsIGFuZCBSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xaiBhbmQgMS4wLjFrIFs4IEphbiAyMDE1XQoKICAqKSBGaXggRFRMUyBzZWdtZW50YXRpb24gZmF1bHQgaW4gZHRsczFfZ2V0X3JlY29yZC4gQSBjYXJlZnVsbHkgY3JhZnRlZCBEVExTCiAgICAgbWVzc2FnZSBjYW4gY2F1c2UgYSBzZWdtZW50YXRpb24gZmF1bHQgaW4gT3BlblNTTCBkdWUgdG8gYSBOVUxMIHBvaW50ZXIKICAgICBkZXJlZmVyZW5jZS4gVGhpcyBjb3VsZCBsZWFkIHRvIGEgRGVuaWFsIE9mIFNlcnZpY2UgYXR0YWNrLiBUaGFua3MgdG8KICAgICBNYXJrdXMgU3RlbmJlcmcgb2YgQ2lzY28gU3lzdGVtcywgSW5jLiBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1NzEpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IERUTFMgbWVtb3J5IGxlYWsgaW4gZHRsczFfYnVmZmVyX3JlY29yZC4gQSBtZW1vcnkgbGVhayBjYW4gb2NjdXIgaW4gdGhlCiAgICAgZHRsczFfYnVmZmVyX3JlY29yZCBmdW5jdGlvbiB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuIEluIHBhcnRpY3VsYXIgdGhpcwogICAgIGNvdWxkIG9jY3VyIGlmIGFuIGF0dGFja2VyIHNlbnQgcmVwZWF0ZWQgRFRMUyByZWNvcmRzIHdpdGggdGhlIHNhbWUKICAgICBzZXF1ZW5jZSBudW1iZXIgYnV0IGZvciB0aGUgbmV4dCBlcG9jaC4gVGhlIG1lbW9yeSBsZWFrIGNvdWxkIGJlIGV4cGxvaXRlZAogICAgIGJ5IGFuIGF0dGFja2VyIGluIGEgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrIHRocm91Z2ggbWVtb3J5IGV4aGF1c3Rpb24uCiAgICAgVGhhbmtzIHRvIENocmlzIE11ZWxsZXIgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNS0wMjA2KQogICAgIFtNYXR0IENhc3dlbGxdCgogICopIEZpeCBpc3N1ZSB3aGVyZSBuby1zc2wzIGNvbmZpZ3VyYXRpb24gc2V0cyBtZXRob2QgdG8gTlVMTC4gV2hlbiBvcGVuc3NsIGlzCiAgICAgYnVpbHQgd2l0aCB0aGUgbm8tc3NsMyBvcHRpb24gYW5kIGEgU1NMIHYzIENsaWVudEhlbGxvIGlzIHJlY2VpdmVkIHRoZSBzc2wKICAgICBtZXRob2Qgd291bGQgYmUgc2V0IHRvIE5VTEwgd2hpY2ggY291bGQgbGF0ZXIgcmVzdWx0IGluIGEgTlVMTCBwb2ludGVyCiAgICAgZGVyZWZlcmVuY2UuIFRoYW5rcyB0byBGcmFuayBTY2htaXJsZXIgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTY5KQogICAgIFtLdXJ0IFJvZWNreF0KCiAgKikgQWJvcnQgaGFuZHNoYWtlIGlmIHNlcnZlciBrZXkgZXhjaGFuZ2UgbWVzc2FnZSBpcyBvbWl0dGVkIGZvciBlcGhlbWVyYWwKICAgICBFQ0RIIGNpcGhlcnN1aXRlcy4KCiAgICAgVGhhbmtzIHRvIEthcnRoaWtleWFuIEJoYXJnYXZhbiBvZiB0aGUgUFJPU0VDQ08gdGVhbSBhdCBJTlJJQSBmb3IKICAgICByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzU3MikKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgbm9uLWV4cG9ydCBlcGhlbWVyYWwgUlNBIGNvZGUgb24gY2xpZW50IGFuZCBzZXJ2ZXIuIFRoaXMgY29kZQogICAgIHZpb2xhdGVkIHRoZSBUTFMgc3RhbmRhcmQgYnkgYWxsb3dpbmcgdGhlIHVzZSBvZiB0ZW1wb3JhcnkgUlNBIGtleXMgaW4KICAgICBub24tZXhwb3J0IGNpcGhlcnN1aXRlcyBhbmQgY291bGQgYmUgdXNlZCBieSBhIHNlcnZlciB0byBlZmZlY3RpdmVseQogICAgIGRvd25ncmFkZSB0aGUgUlNBIGtleSBsZW5ndGggdXNlZCB0byBhIHZhbHVlIHNtYWxsZXIgdGhhbiB0aGUgc2VydmVyCiAgICAgY2VydGlmaWNhdGUuIFRoYW5rcyBmb3IgS2FydGhpa2V5YW4gQmhhcmdhdmFuIG9mIHRoZSBQUk9TRUNDTyB0ZWFtIGF0CiAgICAgSU5SSUEgb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE1LTAyMDQpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZWQgaXNzdWUgd2hlcmUgREggY2xpZW50IGNlcnRpZmljYXRlcyBhcmUgYWNjZXB0ZWQgd2l0aG91dCB2ZXJpZmljYXRpb24uCiAgICAgQW4gT3BlblNTTCBzZXJ2ZXIgd2lsbCBhY2NlcHQgYSBESCBjZXJ0aWZpY2F0ZSBmb3IgY2xpZW50IGF1dGhlbnRpY2F0aW9uCiAgICAgd2l0aG91dCB0aGUgY2VydGlmaWNhdGUgdmVyaWZ5IG1lc3NhZ2UuIFRoaXMgZWZmZWN0aXZlbHkgYWxsb3dzIGEgY2xpZW50IHRvCiAgICAgYXV0aGVudGljYXRlIHdpdGhvdXQgdGhlIHVzZSBvZiBhIHByaXZhdGUga2V5LiBUaGlzIG9ubHkgYWZmZWN0cyBzZXJ2ZXJzCiAgICAgd2hpY2ggdHJ1c3QgYSBjbGllbnQgY2VydGlmaWNhdGUgYXV0aG9yaXR5IHdoaWNoIGlzc3VlcyBjZXJ0aWZpY2F0ZXMKICAgICBjb250YWluaW5nIERIIGtleXM6IHRoZXNlIGFyZSBleHRyZW1lbHkgcmFyZSBhbmQgaGFyZGx5IGV2ZXIgZW5jb3VudGVyZWQuCiAgICAgVGhhbmtzIGZvciBLYXJ0aGlrZXlhbiBCaGFyZ2F2YW4gb2YgdGhlIFBST1NFQ0NPIHRlYW0gYXQgSU5SSUEgb3IgcmVwb3J0aW5nCiAgICAgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTUtMDIwNSkKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbnN1cmUgdGhhdCB0aGUgc2Vzc2lvbiBJRCBjb250ZXh0IG9mIGFuIFNTTCBpcyB1cGRhdGVkIHdoZW4gaXRzCiAgICAgU1NMX0NUWCBpcyB1cGRhdGVkIHZpYSBTU0xfc2V0X1NTTF9DVFguCgogICAgIFRoZSBzZXNzaW9uIElEIGNvbnRleHQgaXMgdHlwaWNhbGx5IHNldCBmcm9tIHRoZSBwYXJlbnQgU1NMX0NUWCwKICAgICBhbmQgY2FuIHZhcnkgd2l0aCB0aGUgQ1RYLgogICAgIFtBZGFtIExhbmdsZXldCgogICopIEZpeCB2YXJpb3VzIGNlcnRpZmljYXRlIGZpbmdlcnByaW50IGlzc3Vlcy4KCiAgICAgQnkgdXNpbmcgbm9uLURFUiBvciBpbnZhbGlkIGVuY29kaW5ncyBvdXRzaWRlIHRoZSBzaWduZWQgcG9ydGlvbiBvZiBhCiAgICAgY2VydGlmaWNhdGUgdGhlIGZpbmdlcnByaW50IGNhbiBiZSBjaGFuZ2VkIHdpdGhvdXQgYnJlYWtpbmcgdGhlIHNpZ25hdHVyZS4KICAgICBBbHRob3VnaCBubyBkZXRhaWxzIG9mIHRoZSBzaWduZWQgcG9ydGlvbiBvZiB0aGUgY2VydGlmaWNhdGUgY2FuIGJlIGNoYW5nZWQKICAgICB0aGlzIGNhbiBjYXVzZSBwcm9ibGVtcyB3aXRoIHNvbWUgYXBwbGljYXRpb25zOiBlLmcuIHRob3NlIHVzaW5nIHRoZQogICAgIGNlcnRpZmljYXRlIGZpbmdlcnByaW50IGZvciBibGFja2xpc3RzLgoKICAgICAxLiBSZWplY3Qgc2lnbmF0dXJlcyB3aXRoIG5vbiB6ZXJvIHVudXNlZCBiaXRzLgoKICAgICBJZiB0aGUgQklUIFNUUklORyBjb250YWluaW5nIHRoZSBzaWduYXR1cmUgaGFzIG5vbiB6ZXJvIHVudXNlZCBiaXRzIHJlamVjdAogICAgIHRoZSBzaWduYXR1cmUuIEFsbCBjdXJyZW50IHNpZ25hdHVyZSBhbGdvcml0aG1zIHJlcXVpcmUgemVybyB1bnVzZWQgYml0cy4KCiAgICAgMi4gQ2hlY2sgY2VydGlmaWNhdGUgYWxnb3JpdGhtIGNvbnNpc3RlbmN5LgoKICAgICBDaGVjayB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciBpbnNpZGUgVEJTIG1hdGNoZXMgdGhlIG9uZSBpbiB0aGUKICAgICBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUuIE5COiB0aGlzIHdpbGwgcmVzdWx0IGluIHNpZ25hdHVyZSBmYWlsdXJlCiAgICAgZXJyb3JzIGZvciBzb21lIGJyb2tlbiBjZXJ0aWZpY2F0ZXMuCgogICAgIFRoYW5rcyB0byBLb25yYWQgS3Jhc3pld3NraSBmcm9tIEdvb2dsZSBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCgogICAgIDMuIENoZWNrIERTQS9FQ0RTQSBzaWduYXR1cmVzIHVzZSBERVIuCgogICAgIFJlZW5jb2RlIERTQS9FQ0RTQSBzaWduYXR1cmVzIGFuZCBjb21wYXJlIHdpdGggdGhlIG9yaWdpbmFsIHJlY2VpdmVkCiAgICAgc2lnbmF0dXJlLiBSZXR1cm4gYW4gZXJyb3IgaWYgdGhlcmUgaXMgYSBtaXNtYXRjaC4KCiAgICAgVGhpcyB3aWxsIHJlamVjdCB2YXJpb3VzIGNhc2VzIGluY2x1ZGluZyBnYXJiYWdlIGFmdGVyIHNpZ25hdHVyZQogICAgICh0aGFua3MgdG8gQW50dGkgS2FyamFsYWluZW4gYW5kIFR1b21vIFVudGluZW4gZnJvbSB0aGUgQ29kZW5vbWljb24gQ1JPU1MKICAgICBwcm9ncmFtIGZvciBkaXNjb3ZlcmluZyB0aGlzIGNhc2UpIGFuZCB1c2Ugb2YgQkVSIG9yIGludmFsaWQgQVNOLjEgSU5URUdFUnMKICAgICAobmVnYXRpdmUgb3Igd2l0aCBsZWFkaW5nIHplcm9lcykuCgogICAgIEZ1cnRoZXIgYW5hbHlzaXMgd2FzIGNvbmR1Y3RlZCBhbmQgZml4ZXMgd2VyZSBkZXZlbG9wZWQgYnkgU3RlcGhlbiBIZW5zb24KICAgICBvZiB0aGUgT3BlblNTTCBjb3JlIHRlYW0uCgogICAgIChDVkUtMjAxNC04Mjc1KQogICAgIFtTdGV2ZSBIZW5zb25dCgogICAqKSBDb3JyZWN0IEJpZ251bSBzcXVhcmluZy4gQmlnbnVtIHNxdWFyaW5nIChCTl9zcXIpIG1heSBwcm9kdWNlIGluY29ycmVjdAogICAgICByZXN1bHRzIG9uIHNvbWUgcGxhdGZvcm1zLCBpbmNsdWRpbmcgeDg2XzY0LiBUaGlzIGJ1ZyBvY2N1cnMgYXQgcmFuZG9tCiAgICAgIHdpdGggYSB2ZXJ5IGxvdyBwcm9iYWJpbGl0eSwgYW5kIGlzIG5vdCBrbm93biB0byBiZSBleHBsb2l0YWJsZSBpbiBhbnkKICAgICAgd2F5LCB0aG91Z2ggaXRzIGV4YWN0IGltcGFjdCBpcyBkaWZmaWN1bHQgdG8gZGV0ZXJtaW5lLiBUaGFua3MgdG8gUGlldGVyCiAgICAgIFd1aWxsZSAoQmxvY2tzdHJlYW0pIHdobyByZXBvcnRlZCB0aGlzIGlzc3VlIGFuZCBhbHNvIHN1Z2dlc3RlZCBhbiBpbml0aWFsCiAgICAgIGZpeC4gRnVydGhlciBhbmFseXNpcyB3YXMgY29uZHVjdGVkIGJ5IHRoZSBPcGVuU1NMIGRldmVsb3BtZW50IHRlYW0gYW5kCiAgICAgIEFkYW0gTGFuZ2xleSBvZiBHb29nbGUuIFRoZSBmaW5hbCBmaXggd2FzIGRldmVsb3BlZCBieSBBbmR5IFBvbHlha292IG9mCiAgICAgIHRoZSBPcGVuU1NMIGNvcmUgdGVhbS4KICAgICAgKENWRS0yMDE0LTM1NzApCiAgICAgIFtBbmR5IFBvbHlha292XQoKICAgKikgRG8gbm90IHJlc3VtZSBzZXNzaW9ucyBvbiB0aGUgc2VydmVyIGlmIHRoZSBuZWdvdGlhdGVkIHByb3RvY29sCiAgICAgIHZlcnNpb24gZG9lcyBub3QgbWF0Y2ggdGhlIHNlc3Npb24ncyB2ZXJzaW9uLiBSZXN1bWluZyB3aXRoIGEgZGlmZmVyZW50CiAgICAgIHZlcnNpb24sIHdoaWxlIG5vdCBzdHJpY3RseSBmb3JiaWRkZW4gYnkgdGhlIFJGQywgaXMgb2YgcXVlc3Rpb25hYmxlCiAgICAgIHNhbml0eSBhbmQgYnJlYWtzIGFsbCBrbm93biBjbGllbnRzLgogICAgICBbRGF2aWQgQmVuamFtaW4sIEVtaWxpYSBL5HNwZXJdCgogICAqKSBUaWdodGVuIGhhbmRsaW5nIG9mIHRoZSBDaGFuZ2VDaXBoZXJTcGVjIChDQ1MpIG1lc3NhZ2U6IHJlamVjdAogICAgICBlYXJseSBDQ1MgbWVzc2FnZXMgZHVyaW5nIHJlbmVnb3RpYXRpb24uIChOb3RlIHRoYXQgYmVjYXVzZQogICAgICByZW5lZ290aWF0aW9uIGlzIGVuY3J5cHRlZCwgdGhpcyBlYXJseSBDQ1Mgd2FzIG5vdCBleHBsb2l0YWJsZS4pCiAgICAgIFtFbWlsaWEgS+RzcGVyXQoKICAgKikgVGlnaHRlbiBjbGllbnQtc2lkZSBzZXNzaW9uIHRpY2tldCBoYW5kbGluZyBkdXJpbmcgcmVuZWdvdGlhdGlvbjoKICAgICAgZW5zdXJlIHRoYXQgdGhlIGNsaWVudCBvbmx5IGFjY2VwdHMgYSBzZXNzaW9uIHRpY2tldCBpZiB0aGUgc2VydmVyIHNlbmRzCiAgICAgIHRoZSBleHRlbnNpb24gYW5ldyBpbiB0aGUgU2VydmVySGVsbG8uIFByZXZpb3VzbHksIGEgVExTIGNsaWVudCB3b3VsZAogICAgICByZXVzZSB0aGUgb2xkIGV4dGVuc2lvbiBzdGF0ZSBhbmQgdGh1cyBhY2NlcHQgYSBzZXNzaW9uIHRpY2tldCBpZiBvbmUgd2FzCiAgICAgIGFubm91bmNlZCBpbiB0aGUgaW5pdGlhbCBTZXJ2ZXJIZWxsby4KCiAgICAgIFNpbWlsYXJseSwgZW5zdXJlIHRoYXQgdGhlIGNsaWVudCByZXF1aXJlcyBhIHNlc3Npb24gdGlja2V0IGlmIG9uZQogICAgICB3YXMgYWR2ZXJ0aXNlZCBpbiB0aGUgU2VydmVySGVsbG8uIFByZXZpb3VzbHksIGEgVExTIGNsaWVudCB3b3VsZAogICAgICBpZ25vcmUgYSBtaXNzaW5nIE5ld1Nlc3Npb25UaWNrZXQgbWVzc2FnZS4KICAgICAgW0VtaWxpYSBL5HNwZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xaSBhbmQgMS4wLjFqIFsxNSBPY3QgMjAxNF0KCiAgKikgU1JUUCBNZW1vcnkgTGVhay4KCiAgICAgQSBmbGF3IGluIHRoZSBEVExTIFNSVFAgZXh0ZW5zaW9uIHBhcnNpbmcgY29kZSBhbGxvd3MgYW4gYXR0YWNrZXIsIHdobwogICAgIHNlbmRzIGEgY2FyZWZ1bGx5IGNyYWZ0ZWQgaGFuZHNoYWtlIG1lc3NhZ2UsIHRvIGNhdXNlIE9wZW5TU0wgdG8gZmFpbAogICAgIHRvIGZyZWUgdXAgdG8gNjRrIG9mIG1lbW9yeSBjYXVzaW5nIGEgbWVtb3J5IGxlYWsuIFRoaXMgY291bGQgYmUKICAgICBleHBsb2l0ZWQgaW4gYSBEZW5pYWwgT2YgU2VydmljZSBhdHRhY2suIFRoaXMgaXNzdWUgYWZmZWN0cyBPcGVuU1NMCiAgICAgMS4wLjEgc2VydmVyIGltcGxlbWVudGF0aW9ucyBmb3IgYm90aCBTU0wvVExTIGFuZCBEVExTIHJlZ2FyZGxlc3Mgb2YKICAgICB3aGV0aGVyIFNSVFAgaXMgdXNlZCBvciBjb25maWd1cmVkLiBJbXBsZW1lbnRhdGlvbnMgb2YgT3BlblNTTCB0aGF0CiAgICAgaGF2ZSBiZWVuIGNvbXBpbGVkIHdpdGggT1BFTlNTTF9OT19TUlRQIGRlZmluZWQgYXJlIG5vdCBhZmZlY3RlZC4KCiAgICAgVGhlIGZpeCB3YXMgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIHRlYW0uCiAgICAgKENWRS0yMDE0LTM1MTMpCiAgICAgW09wZW5TU0wgdGVhbV0KCiAgKikgU2Vzc2lvbiBUaWNrZXQgTWVtb3J5IExlYWsuCgogICAgIFdoZW4gYW4gT3BlblNTTCBTU0wvVExTL0RUTFMgc2VydmVyIHJlY2VpdmVzIGEgc2Vzc2lvbiB0aWNrZXQgdGhlCiAgICAgaW50ZWdyaXR5IG9mIHRoYXQgdGlja2V0IGlzIGZpcnN0IHZlcmlmaWVkLiBJbiB0aGUgZXZlbnQgb2YgYSBzZXNzaW9uCiAgICAgdGlja2V0IGludGVncml0eSBjaGVjayBmYWlsaW5nLCBPcGVuU1NMIHdpbGwgZmFpbCB0byBmcmVlIG1lbW9yeQogICAgIGNhdXNpbmcgYSBtZW1vcnkgbGVhay4gQnkgc2VuZGluZyBhIGxhcmdlIG51bWJlciBvZiBpbnZhbGlkIHNlc3Npb24KICAgICB0aWNrZXRzIGFuIGF0dGFja2VyIGNvdWxkIGV4cGxvaXQgdGhpcyBpc3N1ZSBpbiBhIERlbmlhbCBPZiBTZXJ2aWNlCiAgICAgYXR0YWNrLgogICAgIChDVkUtMjAxNC0zNTY3KQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJ1aWxkIG9wdGlvbiBuby1zc2wzIGlzIGluY29tcGxldGUuCgogICAgIFdoZW4gT3BlblNTTCBpcyBjb25maWd1cmVkIHdpdGggIm5vLXNzbDMiIGFzIGEgYnVpbGQgb3B0aW9uLCBzZXJ2ZXJzCiAgICAgY291bGQgYWNjZXB0IGFuZCBjb21wbGV0ZSBhIFNTTCAzLjAgaGFuZHNoYWtlLCBhbmQgY2xpZW50cyBjb3VsZCBiZQogICAgIGNvbmZpZ3VyZWQgdG8gc2VuZCB0aGVtLgogICAgIChDVkUtMjAxNC0zNTY4KQogICAgIFtBa2FtYWkgYW5kIHRoZSBPcGVuU1NMIHRlYW1dCgogICopIEFkZCBzdXBwb3J0IGZvciBUTFNfRkFMTEJBQ0tfU0NTVi4KICAgICBDbGllbnQgYXBwbGljYXRpb25zIGRvaW5nIGZhbGxiYWNrIHJldHJpZXMgc2hvdWxkIGNhbGwKICAgICBTU0xfc2V0X21vZGUocywgU1NMX01PREVfU0VORF9GQUxMQkFDS19TQ1NWKS4KICAgICAoQ1ZFLTIwMTQtMzU2NikKICAgICBbQWRhbSBMYW5nbGV5LCBCb2RvIE1vZWxsZXJdCgogICopIEFkZCBhZGRpdGlvbmFsIERpZ2VzdEluZm8gY2hlY2tzLgogCiAgICAgUmVlbmNvZGUgRGlnZXN0SW50byBpbiBERVIgYW5kIGNoZWNrIGFnYWluc3QgdGhlIG9yaWdpbmFsIHdoZW4KICAgICB2ZXJpZnlpbmcgUlNBIHNpZ25hdHVyZTogdGhpcyB3aWxsIHJlamVjdCBhbnkgaW1wcm9wZXJseSBlbmNvZGVkCiAgICAgRGlnZXN0SW5mbyBzdHJ1Y3R1cmVzLgoKICAgICBOb3RlOiB0aGlzIGlzIGEgcHJlY2F1dGlvbmFyeSBtZWFzdXJlIGFuZCBubyBhdHRhY2tzIGFyZSBjdXJyZW50bHkga25vd24uCgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xaCBhbmQgMS4wLjFpIFs2IEF1ZyAyMDE0XQoKICAqKSBGaXggU1JQIGJ1ZmZlciBvdmVycnVuIHZ1bG5lcmFiaWxpdHkuIEludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlCiAgICAgU1JQIGNvZGUgY2FuIGJlIG92ZXJydW4gYW4gaW50ZXJuYWwgYnVmZmVyLiBBZGQgc2FuaXR5IGNoZWNrIHRoYXQKICAgICBnLCBBLCBCIDwgTiB0byBTUlAgY29kZS4KCiAgICAgVGhhbmtzIHRvIFNlYW4gRGV2bGluIGFuZCBXYXRzb24gTGFkZCBvZiBDcnlwdG9ncmFwaHkgU2VydmljZXMsIE5DQwogICAgIEdyb3VwIGZvciBkaXNjb3ZlcmluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTEyKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEEgZmxhdyBpbiB0aGUgT3BlblNTTCBTU0wvVExTIHNlcnZlciBjb2RlIGNhdXNlcyB0aGUgc2VydmVyIHRvIG5lZ290aWF0ZQogICAgIFRMUyAxLjAgaW5zdGVhZCBvZiBoaWdoZXIgcHJvdG9jb2wgdmVyc2lvbnMgd2hlbiB0aGUgQ2xpZW50SGVsbG8gbWVzc2FnZQogICAgIGlzIGJhZGx5IGZyYWdtZW50ZWQuIFRoaXMgYWxsb3dzIGEgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrZXIgdG8gZm9yY2UgYQogICAgIGRvd25ncmFkZSB0byBUTFMgMS4wIGV2ZW4gaWYgYm90aCB0aGUgc2VydmVyIGFuZCB0aGUgY2xpZW50IHN1cHBvcnQgYQogICAgIGhpZ2hlciBwcm90b2NvbCB2ZXJzaW9uLCBieSBtb2RpZnlpbmcgdGhlIGNsaWVudCdzIFRMUyByZWNvcmRzLgoKICAgICBUaGFua3MgdG8gRGF2aWQgQmVuamFtaW4gYW5kIEFkYW0gTGFuZ2xleSAoR29vZ2xlKSBmb3IgZGlzY292ZXJpbmcgYW5kCiAgICAgcmVzZWFyY2hpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzUxMSkKICAgICBbRGF2aWQgQmVuamFtaW5dCgogICopIE9wZW5TU0wgRFRMUyBjbGllbnRzIGVuYWJsaW5nIGFub255bW91cyAoRUMpREggY2lwaGVyc3VpdGVzIGFyZSBzdWJqZWN0CiAgICAgdG8gYSBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2suIEEgbWFsaWNpb3VzIHNlcnZlciBjYW4gY3Jhc2ggdGhlIGNsaWVudAogICAgIHdpdGggYSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UgKHJlYWQpIGJ5IHNwZWNpZnlpbmcgYW4gYW5vbnltb3VzIChFQylESAogICAgIGNpcGhlcnN1aXRlIGFuZCBzZW5kaW5nIGNhcmVmdWxseSBjcmFmdGVkIGhhbmRzaGFrZSBtZXNzYWdlcy4KCiAgICAgVGhhbmtzIHRvIEZlbGl4IEdy9mJlcnQgKEdvb2dsZSkgZm9yIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZyB0aGlzCiAgICAgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MTApCiAgICAgW0VtaWxpYSBL5HNwZXJdCgogICopIEJ5IHNlbmRpbmcgY2FyZWZ1bGx5IGNyYWZ0ZWQgRFRMUyBwYWNrZXRzIGFuIGF0dGFja2VyIGNvdWxkIGNhdXNlIG9wZW5zc2wKICAgICB0byBsZWFrIG1lbW9yeS4gVGhpcyBjYW4gYmUgZXhwbG9pdGVkIHRocm91Z2ggYSBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2suCiAgICAgVGhhbmtzIHRvIEFkYW0gTGFuZ2xleSBmb3IgZGlzY292ZXJpbmcgYW5kIHJlc2VhcmNoaW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MDcpCiAgICAgW0FkYW0gTGFuZ2xleV0KCiAgKikgQW4gYXR0YWNrZXIgY2FuIGZvcmNlIG9wZW5zc2wgdG8gY29uc3VtZSBsYXJnZSBhbW91bnRzIG9mIG1lbW9yeSB3aGlsc3QKICAgICBwcm9jZXNzaW5nIERUTFMgaGFuZHNoYWtlIG1lc3NhZ2VzLiBUaGlzIGNhbiBiZSBleHBsb2l0ZWQgdGhyb3VnaCBhCiAgICAgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrLgogICAgIFRoYW5rcyB0byBBZGFtIExhbmdsZXkgZm9yIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTA2KQogICAgIFtBZGFtIExhbmdsZXldCgogICopIEFuIGF0dGFja2VyIGNhbiBmb3JjZSBhbiBlcnJvciBjb25kaXRpb24gd2hpY2ggY2F1c2VzIG9wZW5zc2wgdG8gY3Jhc2gKICAgICB3aGlsc3QgcHJvY2Vzc2luZyBEVExTIHBhY2tldHMgZHVlIHRvIG1lbW9yeSBiZWluZyBmcmVlZCB0d2ljZS4gVGhpcwogICAgIGNhbiBiZSBleHBsb2l0ZWQgdGhyb3VnaCBhIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjay4KICAgICBUaGFua3MgdG8gQWRhbSBMYW5nbGV5IGFuZCBXYW4tVGVoIENoYW5nIGZvciBkaXNjb3ZlcmluZyBhbmQgcmVzZWFyY2hpbmcKICAgICB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTA1KQogICAgIFtBZGFtIExhbmdsZXldCgogICopIElmIGEgbXVsdGl0aHJlYWRlZCBjbGllbnQgY29ubmVjdHMgdG8gYSBtYWxpY2lvdXMgc2VydmVyIHVzaW5nIGEgcmVzdW1lZAogICAgIHNlc3Npb24gYW5kIHRoZSBzZXJ2ZXIgc2VuZHMgYW4gZWMgcG9pbnQgZm9ybWF0IGV4dGVuc2lvbiBpdCBjb3VsZCB3cml0ZQogICAgIHVwIHRvIDI1NSBieXRlcyB0byBmcmVlZCBtZW1vcnkuCgogICAgIFRoYW5rcyB0byBHYWJvciBUeXVrYXN6IChMb2dNZUluIEluYykgZm9yIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZyB0aGlzCiAgICAgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MDkpCiAgICAgW0dhYm9yIFR5dWthc3pdCgogICopIEEgbWFsaWNpb3VzIHNlcnZlciBjYW4gY3Jhc2ggYW4gT3BlblNTTCBjbGllbnQgd2l0aCBhIG51bGwgcG9pbnRlcgogICAgIGRlcmVmZXJlbmNlIChyZWFkKSBieSBzcGVjaWZ5aW5nIGFuIFNSUCBjaXBoZXJzdWl0ZSBldmVuIHRob3VnaCBpdCB3YXMgbm90CiAgICAgcHJvcGVybHkgbmVnb3RpYXRlZCB3aXRoIHRoZSBjbGllbnQuIFRoaXMgY2FuIGJlIGV4cGxvaXRlZCB0aHJvdWdoIGEKICAgICBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2suCgogICAgIFRoYW5rcyB0byBKb29uYXMgS3VvcmlsZWh0byBhbmQgUmlrdSBIaWV0YW3ka2kgKENvZGVub21pY29uKSBmb3IKICAgICBkaXNjb3ZlcmluZyBhbmQgcmVzZWFyY2hpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtNTEzOSkKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBIGZsYXcgaW4gT0JKX29iajJ0eHQgbWF5IGNhdXNlIHByZXR0eSBwcmludGluZyBmdW5jdGlvbnMgc3VjaCBhcwogICAgIFg1MDlfbmFtZV9vbmVsaW5lLCBYNTA5X25hbWVfcHJpbnRfZXggZXQgYWwuIHRvIGxlYWsgc29tZSBpbmZvcm1hdGlvbgogICAgIGZyb20gdGhlIHN0YWNrLiBBcHBsaWNhdGlvbnMgbWF5IGJlIGFmZmVjdGVkIGlmIHRoZXkgZWNobyBwcmV0dHkgcHJpbnRpbmcKICAgICBvdXRwdXQgdG8gdGhlIGF0dGFja2VyLgoKICAgICBUaGFua3MgdG8gSXZhbiBGcmF0cmljIChHb29nbGUpIGZvciBkaXNjb3ZlcmluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTA4KQogICAgIFtFbWlsaWEgS+RzcGVyLCBhbmQgU3RldmUgSGVuc29uXQoKICAqKSBGaXggZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUgKHRodXMsIEVDX1BPSU5Uc19tdWwgZXRjLikKICAgICBmb3IgY29ybmVyIGNhc2VzLiAoQ2VydGFpbiBpbnB1dCBwb2ludHMgYXQgaW5maW5pdHkgY291bGQgbGVhZCB0bwogICAgIGJvZ3VzIHJlc3VsdHMsIHdpdGggbm9uLWluZmluaXR5IGlucHV0cyBtYXBwZWQgdG8gaW5maW5pdHkgdG9vLikKICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWcgYW5kIDEuMC4xaCBbNSBKdW4gMjAxNF0KCiAgKikgRml4IGZvciBTU0wvVExTIE1JVE0gZmxhdy4gQW4gYXR0YWNrZXIgdXNpbmcgYSBjYXJlZnVsbHkgY3JhZnRlZAogICAgIGhhbmRzaGFrZSBjYW4gZm9yY2UgdGhlIHVzZSBvZiB3ZWFrIGtleWluZyBtYXRlcmlhbCBpbiBPcGVuU1NMCiAgICAgU1NML1RMUyBjbGllbnRzIGFuZCBzZXJ2ZXJzLgoKICAgICBUaGFua3MgdG8gS0lLVUNISSBNYXNhc2hpIChMZXBpZHVtIENvLiBMdGQuKSBmb3IgZGlzY292ZXJpbmcgYW5kCiAgICAgcmVzZWFyY2hpbmcgdGhpcyBpc3N1ZS4gKENWRS0yMDE0LTAyMjQpCiAgICAgW0tJS1VDSEkgTWFzYXNoaSwgU3RldmUgSGVuc29uXQoKICAqKSBGaXggRFRMUyByZWN1cnNpb24gZmxhdy4gQnkgc2VuZGluZyBhbiBpbnZhbGlkIERUTFMgaGFuZHNoYWtlIHRvIGFuCiAgICAgT3BlblNTTCBEVExTIGNsaWVudCB0aGUgY29kZSBjYW4gYmUgbWFkZSB0byByZWN1cnNlIGV2ZW50dWFsbHkgY3Jhc2hpbmcKICAgICBpbiBhIERvUyBhdHRhY2suCgogICAgIFRoYW5rcyB0byBJbXJlIFJhZCAoU2VhcmNoLUxhYiBMdGQuKSBmb3IgZGlzY292ZXJpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMDIyMSkKICAgICBbSW1yZSBSYWQsIFN0ZXZlIEhlbnNvbl0KCiAgKikgRml4IERUTFMgaW52YWxpZCBmcmFnbWVudCB2dWxuZXJhYmlsaXR5LiBBIGJ1ZmZlciBvdmVycnVuIGF0dGFjayBjYW4KICAgICBiZSB0cmlnZ2VyZWQgYnkgc2VuZGluZyBpbnZhbGlkIERUTFMgZnJhZ21lbnRzIHRvIGFuIE9wZW5TU0wgRFRMUwogICAgIGNsaWVudCBvciBzZXJ2ZXIuIFRoaXMgaXMgcG90ZW50aWFsbHkgZXhwbG9pdGFibGUgdG8gcnVuIGFyYml0cmFyeQogICAgIGNvZGUgb24gYSB2dWxuZXJhYmxlIGNsaWVudCBvciBzZXJ2ZXIuCgogICAgIFRoYW5rcyB0byBK/HJpIEFlZGxhIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4gKENWRS0yMDE0LTAxOTUpCiAgICAgW0r8cmkgQWVkbGEsIFN0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGJ1ZyBpbiBUTFMgY29kZSB3aGVyZSBjbGllbnRzIGVuYWJsZSBhbm9ueW1vdXMgRUNESCBjaXBoZXJzdWl0ZXMKICAgICBhcmUgc3ViamVjdCB0byBhIGRlbmlhbCBvZiBzZXJ2aWNlIGF0dGFjay4KCiAgICAgVGhhbmtzIHRvIEZlbGl4IEdy9mJlcnQgYW5kIEl2YW4gRnJhdHJpYyBhdCBHb29nbGUgZm9yIGRpc2NvdmVyaW5nCiAgICAgdGhpcyBpc3N1ZS4gKENWRS0yMDE0LTM0NzApCiAgICAgW0ZlbGl4IEdy9mJlcnQsIEl2YW4gRnJhdHJpYywgU3RldmUgSGVuc29uXQoKICAqKSBIYXJtb25pemUgdmVyc2lvbiBhbmQgaXRzIGRvY3VtZW50YXRpb24uIC1mIGZsYWcgaXMgdXNlZCB0byBkaXNwbGF5CiAgICAgY29tcGlsYXRpb24gZmxhZ3MuCiAgICAgW21hbmNoYSA8bWFuY2hhMUB6b2hvLmNvbT5dCgogICopIEZpeCBlY2tleV9wcml2X2VuY29kZSBzbyBpdCBpbW1lZGlhdGVseSByZXR1cm5zIGFuIGVycm9yIHVwb24gYSBmYWlsdXJlCiAgICAgaW4gaTJkX0VDUHJpdmF0ZUtleS4KICAgICBbbWFuY2hhIDxtYW5jaGExQHpvaG8uY29tPl0KCiAgKikgRml4IHNvbWUgZG91YmxlIGZyZWVzLiBUaGVzZSBhcmUgbm90IHRob3VnaHQgdG8gYmUgZXhwbG9pdGFibGUuCiAgICAgW21hbmNoYSA8bWFuY2hhMUB6b2hvLmNvbT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xZiBhbmQgMS4wLjFnIFs3IEFwciAyMDE0XQoKICAqKSBBIG1pc3NpbmcgYm91bmRzIGNoZWNrIGluIHRoZSBoYW5kbGluZyBvZiB0aGUgVExTIGhlYXJ0YmVhdCBleHRlbnNpb24KICAgICBjYW4gYmUgdXNlZCB0byByZXZlYWwgdXAgdG8gNjRrIG9mIG1lbW9yeSB0byBhIGNvbm5lY3RlZCBjbGllbnQgb3IKICAgICBzZXJ2ZXIuCgogICAgIFRoYW5rcyBmb3IgTmVlbCBNZWh0YSBvZiBHb29nbGUgU2VjdXJpdHkgZm9yIGRpc2NvdmVyaW5nIHRoaXMgYnVnIGFuZCB0bwogICAgIEFkYW0gTGFuZ2xleSA8YWdsQGNocm9taXVtLm9yZz4gYW5kIEJvZG8gTW9lbGxlciA8Ym1vZWxsZXJAYWNtLm9yZz4gZm9yCiAgICAgcHJlcGFyaW5nIHRoZSBmaXggKENWRS0yMDE0LTAxNjApCiAgICAgW0FkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggZm9yIHRoZSBhdHRhY2sgZGVzY3JpYmVkIGluIHRoZSBwYXBlciAiUmVjb3ZlcmluZyBPcGVuU1NMCiAgICAgRUNEU0EgTm9uY2VzIFVzaW5nIHRoZSBGTFVTSCtSRUxPQUQgQ2FjaGUgU2lkZS1jaGFubmVsIEF0dGFjayIKICAgICBieSBZdXZhbCBZYXJvbSBhbmQgTmFvbWkgQmVuZ2VyLiBEZXRhaWxzIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgogICAgIGh0dHA6Ly9lcHJpbnQuaWFjci5vcmcvMjAxNC8xNDAKCiAgICAgVGhhbmtzIHRvIFl1dmFsIFlhcm9tIGFuZCBOYW9taSBCZW5nZXIgZm9yIGRpc2NvdmVyaW5nIHRoaXMKICAgICBmbGF3IGFuZCB0byBZdXZhbCBZYXJvbSBmb3Igc3VwcGx5aW5nIGEgZml4IChDVkUtMjAxNC0wMDc2KQogICAgIFtZdXZhbCBZYXJvbSBhbmQgTmFvbWkgQmVuZ2VyXQoKICAqKSBUTFMgcGFkIGV4dGVuc2lvbjogZHJhZnQtYWdsLXRscy1wYWRkaW5nLTAzCgogICAgIFdvcmthcm91bmQgZm9yIHRoZSAiVExTIGhhbmcgYnVnIiAoc2VlIEZBUSBhbmQgUFIjMjc3MSk6IGlmIHRoZQogICAgIFRMUyBjbGllbnQgSGVsbG8gcmVjb3JkIGxlbmd0aCB2YWx1ZSB3b3VsZCBvdGhlcndpc2UgYmUgPiAyNTUgYW5kCiAgICAgbGVzcyB0aGF0IDUxMiBwYWQgd2l0aCBhIGR1bW15IGV4dGVuc2lvbiBjb250YWluaW5nIHplcm9lcyBzbyBpdAogICAgIGlzIGF0IGxlYXN0IDUxMiBieXRlcyBsb25nLgoKICAgICBbQWRhbSBMYW5nbGV5LCBTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xZSBhbmQgMS4wLjFmIFs2IEphbiAyMDE0XQoKICAqKSBGaXggZm9yIFRMUyByZWNvcmQgdGFtcGVyaW5nIGJ1Zy4gQSBjYXJlZnVsbHkgY3JhZnRlZCBpbnZhbGlkIAogICAgIGhhbmRzaGFrZSBjb3VsZCBjcmFzaCBPcGVuU1NMIHdpdGggYSBOVUxMIHBvaW50ZXIgZXhjZXB0aW9uLgogICAgIFRoYW5rcyB0byBBbnRvbiBKb2hhbnNzb24gZm9yIHJlcG9ydGluZyB0aGlzIGlzc3Vlcy4KICAgICAoQ1ZFLTIwMTMtNDM1MykKCiAgKikgS2VlcCBvcmlnaW5hbCBEVExTIGRpZ2VzdCBhbmQgZW5jcnlwdGlvbiBjb250ZXh0cyBpbiByZXRyYW5zbWlzc2lvbgogICAgIHN0cnVjdHVyZXMgc28gd2UgY2FuIHVzZSB0aGUgcHJldmlvdXMgc2Vzc2lvbiBwYXJhbWV0ZXJzIGlmIHRoZXkgbmVlZAogICAgIHRvIGJlIHJlc2VudC4gKENWRS0yMDEzLTY0NTApCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG9wdGlvbiBTU0xfT1BfU0FGQVJJX0VDREhFX0VDRFNBX0JVRyAocGFydCBvZiBTU0xfT1BfQUxMKSB3aGljaAogICAgIGF2b2lkcyBwcmVmZXJyaW5nIEVDREhFLUVDRFNBIGNpcGhlcnMgd2hlbiB0aGUgY2xpZW50IGFwcGVhcnMgdG8gYmUKICAgICBTYWZhcmkgb24gT1MgWC4gIFNhZmFyaSBvbiBPUyBYIDEwLjguLjEwLjguMyBhZHZlcnRpc2VzIHN1cHBvcnQgZm9yCiAgICAgc2V2ZXJhbCBFQ0RIRS1FQ0RTQSBjaXBoZXJzLCBidXQgZmFpbHMgdG8gbmVnb3RpYXRlIHRoZW0uICBUaGUgYnVnCiAgICAgaXMgZml4ZWQgaW4gT1MgWCAxMC44LjQsIGJ1dCBBcHBsZSBoYXZlIHJ1bGVkIG91dCBib3RoIGhvdCBmaXhpbmcKICAgICAxMC44Li4xMC44LjMgYW5kIGZvcmNpbmcgdXNlcnMgdG8gdXBncmFkZSB0byAxMC44LjQgb3IgbmV3ZXIuCiAgICAgW1JvYiBTdHJhZGxpbmcsIEFkYW0gTGFuZ2xleV0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFkIGFuZCAxLjAuMWUgWzExIEZlYiAyMDEzXQoKICAqKSBDb3JyZWN0IGZpeCBmb3IgQ1ZFLTIwMTMtMDE2OS4gVGhlIG9yaWdpbmFsIGRpZG4ndCB3b3JrIG9uIEFFUy1OSQogICAgIHN1cHBvcnRpbmcgcGxhdGZvcm1zIG9yIHdoZW4gc21hbGwgcmVjb3JkcyB3ZXJlIHRyYW5zZmVycmVkLgogICAgIFtBbmR5IFBvbHlha292LCBTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xYyBhbmQgMS4wLjFkIFs1IEZlYiAyMDEzXQoKICAqKSBNYWtlIHRoZSBkZWNvZGluZyBvZiBTU0x2MywgVExTIGFuZCBEVExTIENCQyByZWNvcmRzIGNvbnN0YW50IHRpbWUuCgogICAgIFRoaXMgYWRkcmVzc2VzIHRoZSBmbGF3IGluIENCQyByZWNvcmQgcHJvY2Vzc2luZyBkaXNjb3ZlcmVkIGJ5IAogICAgIE5hZGhlbSBBbGZhcmRhbiBhbmQgS2VubnkgUGF0ZXJzb24uIERldGFpbHMgb2YgdGhpcyBhdHRhY2sgY2FuIGJlIGZvdW5kCiAgICAgYXQ6IGh0dHA6Ly93d3cuaXNnLnJodWwuYWMudWsvdGxzLyAgICAgCgogICAgIFRoYW5rcyBnbyB0byBOYWRoZW0gQWxmYXJkYW4gYW5kIEtlbm55IFBhdGVyc29uIG9mIHRoZSBJbmZvcm1hdGlvbgogICAgIFNlY3VyaXR5IEdyb3VwIGF0IFJveWFsIEhvbGxvd2F5LCBVbml2ZXJzaXR5IG9mIExvbmRvbgogICAgICh3d3cuaXNnLnJodWwuYWMudWspIGZvciBkaXNjb3ZlcmluZyB0aGlzIGZsYXcgYW5kIEFkYW0gTGFuZ2xleSBhbmQKICAgICBFbWlsaWEgS+RzcGVyIGZvciB0aGUgaW5pdGlhbCBwYXRjaC4KICAgICAoQ1ZFLTIwMTMtMDE2OSkKICAgICBbRW1pbGlhIEvkc3BlciwgQWRhbSBMYW5nbGV5LCBCZW4gTGF1cmllLCBBbmR5IFBvbHlha292LCBTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmbGF3IGluIEFFU05JIGhhbmRsaW5nIG9mIFRMUyAxLjIgYW5kIDEuMSByZWNvcmRzIGZvciBDQkMgbW9kZQogICAgIGNpcGhlcnN1aXRlcyB3aGljaCBjYW4gYmUgZXhwbG9pdGVkIGluIGEgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrLgogICAgIFRoYW5rcyBnbyB0byBhbmQgdG8gQWRhbSBMYW5nbGV5IDxhZ2xAY2hyb21pdW0ub3JnPiBmb3IgZGlzY292ZXJpbmcKICAgICBhbmQgZGV0ZWN0aW5nIHRoaXMgYnVnIGFuZCB0byBXb2xmZ2FuZyBFdHRsaW5nZXIKICAgICA8d29sZmdhbmcuZXR0bGluZ2VyQGdtYWlsLmNvbT4gZm9yIGluZGVwZW5kZW50bHkgZGlzY292ZXJpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTItMjY4NikKICAgICBbQWRhbSBMYW5nbGV5XQoKICAqKSBSZXR1cm4gYW4gZXJyb3Igd2hlbiBjaGVja2luZyBPQ1NQIHNpZ25hdHVyZXMgd2hlbiBrZXkgaXMgTlVMTC4KICAgICBUaGlzIGZpeGVzIGEgRG9TIGF0dGFjay4gKENWRS0yMDEzLTAxNjYpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBvcGVuc3NsIHZlcmlmeSByZXR1cm4gZXJyb3JzLgogICAgIFtDaHJpcyBQYWxtZXIgPHBhbG1lckBnb29nbGUuY29tPiBhbmQgQmVuIExhdXJpZV0KCiAgKikgQ2FsbCBPQ1NQIFN0YXBsaW5nIGNhbGxiYWNrIGFmdGVyIGNpcGhlcnN1aXRlIGhhcyBiZWVuIGNob3Nlbiwgc28KICAgICB0aGUgcmlnaHQgcmVzcG9uc2UgaXMgc3RhcGxlZC4gQWxzbyBjaGFuZ2UgU1NMX2dldF9jZXJ0aWZpY2F0ZSgpCiAgICAgc28gaXQgcmV0dXJucyB0aGUgY2VydGlmaWNhdGUgYWN0dWFsbHkgc2VudC4KICAgICBTZWUgaHR0cDovL3J0Lm9wZW5zc2wub3JnL1RpY2tldC9EaXNwbGF5Lmh0bWw/aWQ9MjgzNi4KICAgICBbUm9iIFN0cmFkbGluZyA8cm9iLnN0cmFkbGluZ0Bjb21vZG8uY29tPl0KCiAgKikgRml4IHBvc3NpYmxlIGRlYWRsb2NrIHdoZW4gZGVjb2RpbmcgcHVibGljIGtleXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRG9uJ3QgdXNlIFRMUyAxLjAgcmVjb3JkIHZlcnNpb24gbnVtYmVyIGluIGluaXRpYWwgY2xpZW50IGhlbGxvCiAgICAgaWYgcmVuZWdvdGlhdGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWIgYW5kIDEuMC4xYyBbMTAgTWF5IDIwMTJdCgogICopIFNhbml0eSBjaGVjayByZWNvcmQgbGVuZ3RoIGJlZm9yZSBza2lwcGluZyBleHBsaWNpdCBJViBpbiBUTFMKICAgICAxLjIsIDEuMSBhbmQgRFRMUyB0byBmaXggRG9TIGF0dGFjay4KCiAgICAgVGhhbmtzIHRvIENvZGVub21pY29uIGZvciBkaXNjb3ZlcmluZyB0aGlzIGlzc3VlIHVzaW5nIEZ1enotby1NYXRpYwogICAgIGZ1enppbmcgYXMgYSBzZXJ2aWNlIHRlc3RpbmcgcGxhdGZvcm0uCiAgICAgKENWRS0yMDEyLTIzMzMpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbGlzZSB0a2V5bGVuIHByb3Blcmx5IHdoZW4gZW5jcnlwdGluZyBDTVMgbWVzc2FnZXMuCiAgICAgVGhhbmtzIHRvIFNvbGFyIERlc2lnbmVyIG9mIE9wZW53YWxsIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBGSVBTIG1vZGUgZG9uJ3QgdHJ5IHRvIHVzZSBjb21wb3NpdGUgY2lwaGVycyBhcyB0aGV5IGFyZSBub3QKICAgICBhcHByb3ZlZC4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWEgYW5kIDEuMC4xYiBbMjYgQXByIDIwMTJdCgogICopIE9wZW5TU0wgMS4wLjAgc2V0cyBTU0xfT1BfQUxMIHRvIDB4ODAwMDBGRkZMIGFuZCBPcGVuU1NMIDEuMC4xIGFuZAogICAgIDEuMC4xYSBzZXQgU1NMX09QX05PX1RMU3YxXzEgdG8gMHgwMDAwMDQwMEwgd2hpY2ggd291bGQgdW5mb3J0dW5hdGVseQogICAgIG1lYW4gYW55IGFwcGxpY2F0aW9uIGNvbXBpbGVkIGFnYWluc3QgT3BlblNTTCAxLjAuMCBoZWFkZXJzIHNldHRpbmcKICAgICBTU0xfT1BfQUxMIHdvdWxkIGFsc28gc2V0IFNTTF9PUF9OT19UTFN2MV8xLCB1bmludGVudGlvbmFsbHkgZGlzYWJsbmcKICAgICBUTFMgMS4xIGFsc28uIEZpeCB0aGlzIGJ5IGNoYW5naW5nIHRoZSB2YWx1ZSBvZiBTU0xfT1BfTk9fVExTdjFfMSB0bwogICAgIDB4MTAwMDAwMDBMIEFueSBhcHBsaWNhdGlvbiB3aGljaCB3YXMgcHJldmlvdXNseSBjb21waWxlZCBhZ2FpbnN0CiAgICAgT3BlblNTTCAxLjAuMSBvciAxLjAuMWEgaGVhZGVycyBhbmQgd2hpY2ggY2FyZXMgYWJvdXQgU1NMX09QX05PX1RMU3YxXzEKICAgICB3aWxsIG5lZWQgdG8gYmUgcmVjb21waWxlZCBhcyBhIHJlc3VsdC4gTGV0dGluZyBiZSByZXN1bHRzIGluCiAgICAgaW5hYmlsaXR5IHRvIGRpc2FibGUgc3BlY2lmaWNhbGx5IFRMUyAxLjEgYW5kIGluIGNsaWVudCBjb250ZXh0LAogICAgIGluIHVubGlrZSBldmVudCwgbGltaXQgbWF4aW11bSBvZmZlcmVkIHZlcnNpb24gdG8gVExTIDEuMCBbc2VlIGJlbG93XS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBvcmRlciB0byBlbnN1cmUgaW50ZXJvcGVyYWJpbHR5IFNTTF9PUF9OT19wcm90b2NvbFggZG9lcyBub3QKICAgICBkaXNhYmxlIGp1c3QgcHJvdG9jb2wgWCwgYnV0IGFsbCBwcm90b2NvbHMgYWJvdmUgWCAqaWYqIHRoZXJlIGFyZQogICAgIHByb3RvY29scyAqYmVsb3cqIFggc3RpbGwgZW5hYmxlZC4gSW4gbW9yZSBwcmFjdGljYWwgdGVybXMgaXQgbWVhbnMKICAgICB0aGF0IGlmIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGRpc2FibGUgVExTMS4wIGluIGZhdm9yIG9mIFRMUzEuMSBhbmQKICAgICBhYm92ZSwgaXQncyBub3Qgc3VmZmljaWVudCB0byBwYXNzIFNTTF9PUF9OT19UTFN2MSwgb25lIGhhcyB0byBwYXNzCiAgICAgU1NMX09QX05PX1RMU3YxfFNTTF9PUF9OT19TU0x2M3xTU0xfT1BfTk9fU1NMdjIuIFRoaXMgYXBwbGllcyB0bwogICAgIGNsaWVudCBzaWRlLgogICAgIFtBbmR5IFBvbHlha292XQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMSBhbmQgMS4wLjFhIFsxOSBBcHIgMjAxMl0KCiAgKikgQ2hlY2sgZm9yIHBvdGVudGlhbGx5IGV4cGxvaXRhYmxlIG92ZXJmbG93cyBpbiBhc24xX2QyaV9yZWFkX2JpbwogICAgIEJVRl9tZW1fZ3JvdyBhbmQgQlVGX21lbV9ncm93X2NsZWFuLiBSZWZ1c2UgYXR0ZW1wdHMgdG8gc2hyaW5rIGJ1ZmZlcgogICAgIGluIENSWVBUT19yZWFsbG9jX2NsZWFuLgoKICAgICBUaGFua3MgdG8gVGF2aXMgT3JtYW5keSwgR29vZ2xlIFNlY3VyaXR5IFRlYW0sIGZvciBkaXNjb3ZlcmluZyB0aGlzCiAgICAgaXNzdWUgYW5kIHRvIEFkYW0gTGFuZ2xleSA8YWdsQGNocm9taXVtLm9yZz4gZm9yIGZpeGluZyBpdC4KICAgICAoQ1ZFLTIwMTItMjExMCkKICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpLCBUYXZpcyBPcm1hbmR5LCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgRG9uJ3QgYWxsb3cgVExTIDEuMiBTSEEtMjU2IGNpcGhlcnN1aXRlcyBpbiBUTFMgMS4wLCAxLjEgY29ubmVjdGlvbnMuCiAgICAgW0FkYW0gTGFuZ2xleV0KCiAgKikgV29ya2Fyb3VuZHMgZm9yIHNvbWUgYnJva2VuIHNlcnZlcnMgdGhhdCAiaGFuZyIgaWYgYSBjbGllbnQgaGVsbG8KICAgICByZWNvcmQgbGVuZ3RoIGV4Y2VlZHMgMjU1IGJ5dGVzLgoKICAgICAxLiBEbyBub3QgdXNlIHJlY29yZCB2ZXJzaW9uIG51bWJlciA+IFRMUyAxLjAgaW4gaW5pdGlhbCBjbGllbnQKICAgICAgICBoZWxsbzogc29tZSAoYnV0IG5vdCBhbGwpIGhhbmdpbmcgc2VydmVycyB3aWxsIG5vdyB3b3JrLgogICAgIDIuIElmIHdlIHNldCBPUEVOU1NMX01BWF9UTFMxXzJfQ0lQSEVSX0xFTkdUSCB0aGlzIHdpbGwgdHJ1bmNhdGUKCXRoZSBudW1iZXIgb2YgY2lwaGVycyBzZW50IGluIHRoZSBjbGllbnQgaGVsbG8uIFRoaXMgc2hvdWxkIGJlCiAgICAgICAgc2V0IHRvIGFuIGV2ZW4gbnVtYmVyLCBzdWNoIGFzIDUwLCBmb3IgZXhhbXBsZSBieSBwYXNzaW5nOgogICAgICAgIC1ET1BFTlNTTF9NQVhfVExTMV8yX0NJUEhFUl9MRU5HVEg9NTAgdG8gY29uZmlnIG9yIENvbmZpZ3VyZS4KICAgICAgICBNb3N0IGJyb2tlbiBzZXJ2ZXJzIHNob3VsZCBub3cgd29yay4KICAgICAzLiBJZiBhbGwgZWxzZSBmYWlscyBzZXR0aW5nIE9QRU5TU0xfTk9fVExTMV8yX0NMSUVOVCB3aWxsIGRpc2FibGUKCVRMUyAxLjIgY2xpZW50IHN1cHBvcnQgZW50aXJlbHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IFNFR1YgaW4gVmVjdG9yIFBlcm11dGF0aW9uIEFFUyBtb2R1bGUgb2JzZXJ2ZWQgaW4gT3BlblNTSC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBoIGFuZCAxLjAuMSAgWzE0IE1hciAyMDEyXQoKICAqKSBBZGQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBNREMyIHNpZ25hdHVyZXMgd2hpY2ggdXNlIGFuIEFTTjEgT0NURVQKICAgICBTVFJJTkcgZm9ybSBpbnN0ZWFkIG9mIGEgRGlnZXN0SW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUaGUgZm9ybWF0IHVzZWQgZm9yIE1EQzIgUlNBIHNpZ25hdHVyZXMgaXMgaW5jb25zaXN0ZW50IGJldHdlZW4gRVZQCiAgICAgYW5kIHRoZSBSU0Ffc2lnbi9SU0FfdmVyaWZ5IGZ1bmN0aW9ucy4gVGhpcyB3YXMgbWFkZSBtb3JlIGFwcGFyZW50IHdoZW4KICAgICBPcGVuU1NMIHVzZWQgUlNBX3NpZ24vUlNBX3ZlcmlmeSBmb3Igc29tZSBSU0Egc2lnbmF0dXJlcyBpbiBwYXJ0aWN1bGFyCiAgICAgdGhvc2Ugd2hpY2ggd2VudCB0aHJvdWdoIEVWUF9QS0VZX01FVEhPRCBpbiAxLjAuMCBhbmQgbGF0ZXIuIERldGVjdCAKICAgICB0aGUgY29ycmVjdCBmb3JtYXQgaW4gUlNBX3ZlcmlmeSBzbyBib3RoIGZvcm1zIHRyYW5zcGFyZW50bHkgd29yay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTb21lIHNlcnZlcnMgd2hpY2ggc3VwcG9ydCBUTFMgMS4wIGNhbiBjaG9rZSBpZiB3ZSBpbml0aWFsbHkgaW5kaWNhdGUKICAgICBzdXBwb3J0IGZvciBUTFMgMS4yIGFuZCBsYXRlciByZW5lZ290aWF0ZSB1c2luZyBUTFMgMS4wIGluIHRoZSBSU0EKICAgICBlbmNyeXB0ZWQgcHJlbWFzdGVyIHNlY3JldC4gQXMgYSB3b3JrYXJvdW5kIHVzZSB0aGUgbWF4aW11bSBwZXJtaXR0ZWQKICAgICBjbGllbnQgdmVyc2lvbiBpbiBjbGllbnQgaGVsbG8sIHRoaXMgc2hvdWxkIGtlZXAgc3VjaCBzZXJ2ZXJzIGhhcHB5CiAgICAgYW5kIHN0aWxsIHdvcmsgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZiBPcGVuU1NMLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBUTFMvRFRMUyBoZWFydGJlYXRzLgogICAgIFtSb2JpbiBTZWdnZWxtYW5uIDxzZWdnZWxtYW5uQGZoLW11ZW5zdGVyLmRlPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFNDVFAuCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4gPHNlZ2dlbG1hbm5AZmgtbXVlbnN0ZXIuZGU+XQoKICAqKSBJbXByb3ZlZCBQUk5HIHNlZWRpbmcgZm9yIFZPUy4KICAgICBbUGF1bCBHcmVlbiA8UGF1bC5HcmVlbkBzdHJhdHVzLmNvbT5dCgogICopIEV4dGVuc2l2ZSBhc3NlbWJsZXIgcGFja3MgdXBkYXRlcywgbW9zdCBub3RhYmx5OgoKCS0geDg2W182NF06ICAgICBBRVMtTkksIFBDTE1VTFFEUSwgUkRSQU5EIHN1cHBvcnQ7CgktIHg4NltfNjRdOiAgICAgU1NTRTMgc3VwcG9ydCAoU0hBMSwgdmVjdG9yLXBlcm11dGF0aW9uIEFFUyk7CgktIHg4Nl82NDogICAgICAgYml0LXNsaWNlZCBBRVMgaW1wbGVtZW50YXRpb247CgktIEFSTTogICAgICAgICAgTkVPTiBzdXBwb3J0LCBjb250ZW1wb3JhcnkgcGxhdGZvcm1zIG9wdGltaXphdGlvbnM7CgktIHMzOTB4OiAgICAgICAgejE5NiBzdXBwb3J0OwoJLSAqOiAgICAgICAgICAgIEdIQVNIIGFuZCBHRigyXm0pIG11bHRpcGxpY2F0aW9uIGltcGxlbWVudGF0aW9uczsKCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE1ha2UgVExTLVNSUCBjb2RlIGNvbmZvcm1hbnQgd2l0aCBSRkMgNTA1NCBBUEkgY2xlYW51cAogICAgIChyZW1vdmFsIG9mIHVubmVjZXNzYXJ5IGNvZGUpCiAgICAgW1BldGVyIFN5bHZlc3RlciA8cGV0ZXIuc3lsdmVzdGVyQGVkZWx3ZWIuZnI+XQoKICAqKSBBZGQgVExTIGtleSBtYXRlcmlhbCBleHBvcnRlciBmcm9tIFJGQyA1NzA1LgogICAgIFtFcmljIFJlc2NvcmxhXQoKICAqKSBBZGQgRFRMUy1TUlRQIG5lZ290aWF0aW9uIGZyb20gUkZDIDU3NjQuCiAgICAgW0VyaWMgUmVzY29ybGFdCgogICopIEFkZCBOZXh0IFByb3RvY29sIE5lZ290aWF0aW9uLAogICAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWFnbC10bHMtbmV4dHByb3RvbmVnLTAwLiBDYW4gYmUKICAgICBkaXNhYmxlZCB3aXRoIGEgbm8tbnBuIGZsYWcgdG8gY29uZmlnIG9yIENvbmZpZ3VyZS4gQ29kZSBkb25hdGVkCiAgICAgYnkgR29vZ2xlLgogICAgIFtBZGFtIExhbmdsZXkgPGFnbEBnb29nbGUuY29tPiBhbmQgQmVuIExhdXJpZV0KCiAgKikgQWRkIG9wdGlvbmFsIDY0LWJpdCBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb25zIG9mIGVsbGlwdGljIGN1cnZlcyBOSVNULVAyMjQsCiAgICAgTklTVC1QMjU2LCBOSVNULVA1MjEsIHdpdGggY29uc3RhbnQtdGltZSBzaW5nbGUgcG9pbnQgbXVsdGlwbGljYXRpb24gb24KICAgICB0eXBpY2FsIGlucHV0cy4gQ29tcGlsZXIgc3VwcG9ydCBmb3IgdGhlIG5vbnN0YW5kYXJkIHR5cGUgX191aW50MTI4X3QgaXMKICAgICByZXF1aXJlZCB0byB1c2UgdGhpcyAocHJlc2VudCBpbiBnY2MgNC40IGFuZCBsYXRlciwgZm9yIDY0LWJpdCBidWlsZHMpLgogICAgIENvZGUgbWFkZSBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgdmVyc2lvbiAyLjAuCgogICAgIFNwZWNpZnkgImVuYWJsZS1lY19uaXN0cF82NF9nY2NfMTI4IiBvbiB0aGUgQ29uZmlndXJlIChvciBjb25maWcpIGNvbW1hbmQKICAgICBsaW5lIHRvIGluY2x1ZGUgdGhpcyBpbiB5b3VyIGJ1aWxkIG9mIE9wZW5TU0wsIGFuZCBydW4gIm1ha2UgZGVwZW5kIiAob3IKICAgICAibWFrZSB1cGRhdGUiKS4gVGhpcyBlbmFibGVzIHRoZSBmb2xsb3dpbmcgRUNfTUVUSE9EczoKCiAgICAgICAgIEVDX0dGcF9uaXN0cDIyNF9tZXRob2QoKQogICAgICAgICBFQ19HRnBfbmlzdHAyNTZfbWV0aG9kKCkKICAgICAgICAgRUNfR0ZwX25pc3RwNTIxX21ldGhvZCgpCgogICAgIEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKCkgd2lsbCBhdXRvbWF0aWNhbGx5IHVzZSB0aGVzZSAod2hpbGUKICAgICBFQ19HUk9VUF9uZXdfY3VydmVfR0ZwKCkgY3VycmVudGx5IHByZWZlcnMgdGhlIG1vcmUgZmxleGlibGUKICAgICBpbXBsZW1lbnRhdGlvbnMpLgogICAgIFtFbWlsaWEgS+RzcGVyLCBBZGFtIExhbmdsZXksIEJvZG8gTW9lbGxlciAoR29vZ2xlKV0KCiAgKikgVXNlIHR5cGUgb3NzbF9zc2l6ZV90IGluc3RhZCBvZiBzc2l6ZV90IHdoaWNoIGlzbid0IGF2YWlsYWJsZSBvbgogICAgIGFsbCBwbGF0Zm9ybXMuIE1vdmUgc3NpemVfdCBkZWZpbml0aW9uIGZyb20gZV9vcy5oIHRvIHRoZSBwdWJsaWMKICAgICBoZWFkZXIgZmlsZSBlX29zMi5oIGFzIGl0IG5vdyBhcHBlYXJzIGluIHB1YmxpYyBoZWFkZXIgZmlsZSBjbXMuaAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAtc2lnb3B0IG9wdGlvbiB0byB0aGUgY2EsIHJlcSBhbmQgeDUwOSB1dGlsaXRpZXMuIEFkZGl0aW9uYWwKICAgICBzaWduYXR1cmUgcGFyYW1ldGVycyBjYW4gYmUgcGFzc2VkIHVzaW5nIHRoaXMgb3B0aW9uIGFuZCBpbgogICAgIHBhcnRpY3VsYXIgUFNTLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgUlNBIFBTUyBzaWduaW5nIGZ1bmN0aW9uLiBUaGlzIHdpbGwgZ2VuZXJhdGUgYW5kIHNldCB0aGUKICAgICBhcHByb3ByaWF0ZSBBbGdvcml0aG1JZGVudGlmaWVycyBmb3IgUFNTIGJhc2VkIG9uIHRob3NlIGluIHRoZQogICAgIGNvcnJlc3BvbmRpbmcgRVZQX01EX0NUWCBzdHJ1Y3R1cmUuIE5vIGFwcGxpY2F0aW9uIHN1cHBvcnQgeWV0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIGNvbXBhbmlvbiBhbGdvcml0aG0gc3BlY2lmaWMgQVNOMSBzaWduaW5nIHJvdXRpbmVzLgogICAgIE5ldyBmdW5jdGlvbiBBU04xX2l0ZW1fc2lnbl9jdHgoKSBzaWducyBhIHByZS1pbml0aWFsaXNlZAogICAgIEVWUF9NRF9DVFggc3RydWN0dXJlIGFuZCBzZXRzIEFsZ29yaXRobUlkZW50aWZpZXJzIGJhc2VkIG9uCiAgICAgdGhlIGFwcHJvcHJpYXRlIHBhcmFtZXRlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBhbGdvcml0aG0gc3BlY2lmaWMgQVNOMSB2ZXJpZmljYXRpb24gaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24KICAgICB0byBFVlBfUEtFWV9BU04xX01FVEhPRDogdGhpcyBpcyBub3QgaW4gRVZQX1BLRVlfTUVUSE9EIHNpbmNlIHRoZSBBU04xCiAgICAgaGFuZGxpbmcgd2lsbCBiZSB0aGUgc2FtZSBubyBtYXR0ZXIgd2hhdCBFVlBfUEtFWV9NRVRIT0QgaXMgdXNlZC4KICAgICBBZGQgYSBQU1MgaGFuZGxlciB0byBzdXBwb3J0IHZlcmlmaWNhdGlvbiBvZiBQU1Mgc2lnbmF0dXJlczogY2hlY2tlZAogICAgIGFnYWluc3QgYSBudW1iZXIgb2Ygc2FtcGxlIGNlcnRpZmljYXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc2lnbmF0dXJlIHByaW50aW5nIGZvciBQU1MuIEFkZCBQU1MgT0lEcy4KICAgICBbU3RldmUgSGVuc29uLCBNYXJ0aW4gS2Fpc2VyIDxsaXN0c0BrYWlzZXIuY3g+XQoKICAqKSBBZGQgYWxnb3JpdGhtIHNwZWNpZmljIHNpZ25hdHVyZSBwcmludGluZy4gQW4gaW5kaXZpZHVhbCBBU04xIG1ldGhvZAogICAgIGNhbiBub3cgcHJpbnQgb3V0IHNpZ25hdHVyZXMgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgaGV4IGR1bXAuIAoKICAgICBNb3JlIGNvbXBsZXggc2lnbmF0dXJlcyAoZS5nLiBQU1MpIGNhbiBwcmludCBvdXQgbW9yZSBtZWFuaW5nZnVsCiAgICAgaW5mb3JtYXRpb24uIEluY2x1ZGUgRFNBIHZlcnNpb24gdGhhdCBwcmludHMgb3V0IHRoZSBzaWduYXR1cmUKICAgICBwYXJhbWV0ZXJzIHIsIHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUGFzc3dvcmQgYmFzZWQgcmVjaXBpZW50IGluZm8gc3VwcG9ydCBmb3IgQ01TIGxpYnJhcnk6IGltcGxlbWVudGluZwogICAgIFJGQzMyMTEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3BsaXQgcGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiBpbnRvIFBCRVMyIGFuZCBQQktERjIgZnVuY3Rpb25zLiBUaGlzCiAgICAgbmVhdGx5IHNlcGFyYXRlcyB0aGUgY29kZSBpbnRvIGNpcGhlciBhbmQgUEJFIHNlY3Rpb25zIGFuZCBpcyByZXF1aXJlZAogICAgIGZvciBzb21lIGFsZ29yaXRobXMgdGhhdCBzcGxpdCBQQkVTMiBpbnRvIHNlcGFyYXRlIHBpZWNlcyAoc3VjaCBhcwogICAgIHBhc3N3b3JkIGJhc2VkIENNUykuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU2Vzc2lvbi1oYW5kbGluZyBmaXhlczoKICAgICAtIEZpeCBoYW5kbGluZyBvZiBjb25uZWN0aW9ucyB0aGF0IGFyZSByZXN1bWluZyB3aXRoIGEgc2Vzc2lvbiBJRCwKICAgICAgIGJ1dCBhbHNvIHN1cHBvcnQgU2Vzc2lvbiBUaWNrZXRzLgogICAgIC0gRml4IGEgYnVnIHRoYXQgc3VwcHJlc3NlZCBpc3N1aW5nIG9mIGEgbmV3IHRpY2tldCBpZiB0aGUgY2xpZW50CiAgICAgICBwcmVzZW50ZWQgYSB0aWNrZXQgd2l0aCBhbiBleHBpcmVkIHNlc3Npb24uCiAgICAgLSBUcnkgdG8gc2V0IHRoZSB0aWNrZXQgbGlmZXRpbWUgaGludCB0byBzb21ldGhpbmcgcmVhc29uYWJsZS4KICAgICAtIE1ha2UgdGlja2V0cyBzaG9ydGVyIGJ5IGV4Y2x1ZGluZyBpcnJlbGV2YW50IGluZm9ybWF0aW9uLgogICAgIC0gT24gdGhlIGNsaWVudCBzaWRlLCBkb24ndCBpZ25vcmUgcmVuZXdlZCB0aWNrZXRzLgogICAgIFtBZGFtIExhbmdsZXksIEJvZG8gTW9lbGxlciAoR29vZ2xlKV0KCiAgKikgRml4IFBTSyBzZXNzaW9uIHJlcHJlc2VudGF0aW9uLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBSQzQtTUQ1IGFuZCBBRVNOSS1TSEExICJzdGl0Y2hlZCIgaW1wbGVtZW50YXRpb25zLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBJbnRlbC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIEdDTSBzdXBwb3J0IHRvIFRMUyBsaWJyYXJ5LiBTb21lIGN1c3RvbSBjb2RlIGlzIG5lZWRlZCB0byBzcGxpdAogICAgIHRoZSBJViBiZXR3ZWVuIHRoZSBmaXhlZCAoZnJvbSBQUkYpIGFuZCBleHBsaWNpdCAoZnJvbSBUTFMgcmVjb3JkKQogICAgIHBvcnRpb25zLiBUaGlzIGFkZHMgYWxsIEdDTSBjaXBoZXJzdWl0ZXMgc3VwcG9ydGVkIGJ5IFJGQzUyODggYW5kIAogICAgIFJGQzUyODkuIEdlbmVyYWxpc2Ugc29tZSBBRVMqIGNpcGhlcnN0cmluZ3MgdG8gaW5jbHVkZSBHQ00gYW5kCiAgICAgYWRkIGEgc3BlY2lhbCBBRVNHQ00gc3RyaW5nIGZvciBHQ00gb25seS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHBhbmQgcmFuZ2Ugb2YgY3RybHMgZm9yIEFFUyBHQ00uIFBlcm1pdCBzZXR0aW5nIGludm9jYXRpb24KICAgICBmaWVsZCBvbiBkZWNyeXB0IGFuZCByZXRyaWV2YWwgb2YgaW52b2NhdGlvbiBmaWVsZCBvbmx5IG9uIGVuY3J5cHQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEhNQUMgRUNDIGNpcGhlcnN1aXRlcyBmcm9tIFJGQzUyODkuIEluY2x1ZGUgU0hBMzg0IFBSRiBzdXBwb3J0LgogICAgIEFzIHJlcXVpcmVkIGJ5IFJGQzUyODkgdGhlc2UgY2lwaGVyc3VpdGVzIGNhbm5vdCBiZSB1c2VkIGlmIGZvcgogICAgIHZlcnNpb25zIG9mIFRMUyBlYXJsaWVyIHRoYW4gMS4yLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZvciBGSVBTIGNhcGFibGUgT3BlblNTTCBpbnRlcnByZXQgYSBOVUxMIGRlZmF1bHQgcHVibGljIGtleSBtZXRob2QKICAgICBhcyB1bnNldCBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBkZWZhdWx0IGJ1dCBkbyAqbm90KiBzZXQgdGhlIGRlZmF1bHQuCiAgICAgVGhpcyBtZWFucyB3ZSBjYW4gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgaW4gYXBwbGljYXRpb25zIHRoYXQKICAgICBzd2l0Y2ggYmV0d2VlbiBGSVBTIGFuZCBub24tRklQUyBtb2Rlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWRpcmVjdCBITUFDIGFuZCBDTUFDIG9wZXJhdGlvbnMgdG8gRklQUyBtb2R1bGUgaW4gRklQUyBtb2RlLiBJZiBhbgogICAgIEVOR0lORSBpcyB1c2VkIHRoZW4gd2UgY2Fubm90IGhhbmRsZSB0aGF0IGluIHRoZSBGSVBTIG1vZHVsZSBzbyB3ZQogICAgIGtlZXAgb3JpZ2luYWwgY29kZSBpZmYgbm9uLUZJUFMgb3BlcmF0aW9ucyBhcmUgYWxsb3dlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgLWF0dGltZSBvcHRpb24gdG8gb3BlbnNzbCB1dGlsaXRpZXMuCiAgICAgW1BldGVyIEVja2Vyc2xleSA8cGRlQGVmZi5vcmc+LCBCZW4gTGF1cmllIGFuZCBTdGV2ZSBIZW5zb25dCgogICopIFJlZGlyZWN0IERTQSBhbmQgREggb3BlcmF0aW9ucyB0byBGSVBTIG1vZHVsZSBpbiBGSVBTIG1vZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVkaXJlY3QgRUNEU0EgYW5kIEVDREggb3BlcmF0aW9ucyB0byBGSVBTIG1vZHVsZSBpbiBGSVBTIG1vZGUuIEFsc28gdXNlCiAgICAgRklQUyBFQyBtZXRob2RzIHVuY29uZGl0aW9uYWxseSBmb3Igbm93LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBidWlsZCBvcHRpb24gbm8tZWMybSB0byBkaXNhYmxlIGNoYXJhY3RlcmlzdGljIDIgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCYWNrcG9ydCBsaWJjcnlwdG8gYXVkaXQgb2YgcmV0dXJuIHZhbHVlIGNoZWNraW5nIGZyb20gMS4xLjAtZGV2OyBub3QKICAgICBhbGwgY2FzZXMgY2FuIGJlIGNvdmVyZWQgYXMgc29tZSBpbnRyb2R1Y2UgYmluYXJ5IGluY29tcGF0aWJpbGl0aWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlZGlyZWN0IFJTQSBvcGVyYXRpb25zIHRvIEZJUFMgbW9kdWxlIGluY2x1ZGluZyBrZXlnZW4sCiAgICAgZW5jcnlwdCwgZGVjcnlwdCwgc2lnbiBhbmQgdmVyaWZ5LiBCbG9jayB1c2Ugb2Ygbm9uIEZJUFMgUlNBIG1ldGhvZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNpbWlsYXIgbG93IGxldmVsIEFQSSBibG9ja2luZyB0byBjaXBoZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIExvdyBsZXZlbCBkaWdlc3QgQVBJcyBhcmUgbm90IGFwcHJvdmVkIGluIEZJUFMgbW9kZTogYW55IGF0dGVtcHQKICAgICB0byB1c2UgdGhlc2Ugd2lsbCBjYXVzZSBhIGZhdGFsIGVycm9yLiBBcHBsaWNhdGlvbnMgdGhhdCAqcmVhbGx5KiB3YW50CiAgICAgdG8gdXNlIHRoZW0gY2FuIHVzZSB0aGUgcHJpdmF0ZV8qIHZlcnNpb24gaW5zdGVhZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWRpcmVjdCBjaXBoZXIgb3BlcmF0aW9ucyB0byBGSVBTIG1vZHVsZSBmb3IgRklQUyBidWlsZHMuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlZGlyZWN0IGRpZ2VzdCBvcGVyYXRpb25zIHRvIEZJUFMgbW9kdWxlIGZvciBGSVBTIGJ1aWxkcy4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIGJ1aWxkIHN5c3RlbSB0byBhZGQgImZpcHMiIGZsYWcgd2hpY2ggd2lsbCBsaW5rIGluIGZpcHNjYW5pc3Rlci5vCiAgICAgZm9yIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcnkgYnVpbGRzIGVtYmVkZGluZyBhIHNpZ25hdHVyZSBpZiBuZWVkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgT3V0cHV0IFRMUyBzdXBwb3J0ZWQgY3VydmVzIGluIHByZWZlcmVuY2Ugb3JkZXIgaW5zdGVhZCBvZiBudW1lcmljYWwKICAgICBvcmRlci4gVGhpcyBpcyBjdXJyZW50bHkgaGFyZGNvZGVkIGZvciB0aGUgaGlnaGVzdCBvcmRlciBjdXJ2ZXMgZmlyc3QuCiAgICAgVGhpcyBzaG91bGQgYmUgY29uZmlndXJhYmxlIHNvIGFwcGxpY2F0aW9ucyBjYW4ganVkZ2Ugc3BlZWQgdnMgc3RyZW5ndGguCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIFRMUyB2MS4yIHNlcnZlciBzdXBwb3J0IGZvciBjbGllbnQgYXV0aGVudGljYXRpb24uIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBGSVBTIG1vZGUgaW4gc3NsIGxpYnJhcnk6IGRpc2FibGUgU1NMdjMsIG5vbi1GSVBTIGNpcGhlcnMKICAgICBhbmQgZW5hYmxlIE1ENS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdW5jdGlvbnMgRklQU19tb2RlX3NldCgpIGFuZCBGSVBTX21vZGUoKSB3aGljaCBjYWxsIHRoZSB1bmRlcmx5aW5nCiAgICAgRklQUyBtb2R1bGVzIHZlcnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBUTFMgdjEuMiBjbGllbnQgc2lkZSBzdXBwb3J0IGZvciBjbGllbnQgYXV0aGVudGljYXRpb24uIEtlZXAgY2FjaGUKICAgICBvZiBoYW5kc2hha2UgcmVjb3JkcyBsb25nZXIgYXMgd2UgZG9uJ3Qga25vdyB0aGUgaGFzaCBhbGdvcml0aG0gdG8gdXNlCiAgICAgdW50aWwgYWZ0ZXIgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QgbWVzc2FnZSBpcyByZWNlaXZlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIFRMUyB2MS4yIGNsaWVudCBzdXBwb3J0LiBBZGQgYSBkZWZhdWx0IHNpZ25hdHVyZSBhbGdvcml0aG1zCiAgICAgZXh0ZW5zaW9uIGluY2x1ZGluZyBhbGwgdGhlIGFsZ29yaXRobXMgd2Ugc3VwcG9ydC4gUGFyc2UgbmV3IHNpZ25hdHVyZQogICAgIGZvcm1hdCBpbiBjbGllbnQga2V5IGV4Y2hhbmdlLiBSZWxheCBzb21lIEVDQyBzaWduaW5nIHJlc3RyaWN0aW9ucyBmb3IKICAgICBUTFMgdjEuMiBhcyBpbmRpY2F0ZWQgaW4gUkZDNTI0Ni4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc2VydmVyIHN1cHBvcnQgZm9yIFRMUyB2MS4yIHNpZ25hdHVyZSBhbGdvcml0aG1zIGV4dGVuc2lvbi4gU3dpdGNoCiAgICAgdG8gbmV3IHNpZ25hdHVyZSBmb3JtYXQgd2hlbiBuZWVkZWQgdXNpbmcgY2xpZW50IGRpZ2VzdCBwcmVmZXJlbmNlLgogICAgIEFsbCBzZXJ2ZXIgY2lwaGVyc3VpdGVzIHNob3VsZCBub3cgd29yayBjb3JyZWN0bHkgaW4gVExTIHYxLjIuIE5vIGNsaWVudAogICAgIHN1cHBvcnQgeWV0IGFuZCBubyBzdXBwb3J0IGZvciBjbGllbnQgY2VydGlmaWNhdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgVExTIHYxLjIgc3VwcG9ydC4gQWRkIG5ldyBTSEEyNTYgZGlnZXN0IHRvIHNzbCBjb2RlLCBzd2l0Y2gKICAgICB0byBTSEEyNTYgZm9yIFBSRiB3aGVuIHVzaW5nIFRMUyB2MS4yIGFuZCBsYXRlci4gQWRkIG5ldyBTSEEyNTYgYmFzZWQKICAgICBjaXBoZXJzdWl0ZXMuIEF0IHByZXNlbnQgb25seSBSU0Ega2V5IGV4Y2hhbmdlIGNpcGhlcnN1aXRlcyB3b3JrIHdpdGgKICAgICBUTFMgdjEuMi4gQWRkIG5ldyBvcHRpb24gZm9yIFRMUyB2MS4yIHJlcGxhY2luZyB0aGUgb2xkIGFuZCBvYnNvbGV0ZQogICAgIFNTTF9PUF9QS0NTMV9DSEVDSyBmbGFncyB3aXRoIFNTTF9PUF9OT19UTFN2MV8yLiBOZXcgVExTdjEuMiBtZXRob2RzCiAgICAgYW5kIHZlcnNpb24gY2hlY2tpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbiBPUEVOU1NMX05PX1NTTF9JTlRFUk4uIElmIGFuIGFwcGxpY2F0aW9uIGNhbiBiZSBjb21waWxlZAogICAgIHdpdGggdGhpcyBkZWZpbmVkIGl0IHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IGFueSBjaGFuZ2VzIHRvIHNzbCBpbnRlcm5hbAogICAgIHN0cnVjdHVyZXMuIEFkZCBzZXZlcmFsIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGFsbG93IG9wZW5zc2wgYXBwbGljYXRpb24KICAgICB0byB3b3JrIHdpdGggT1BFTlNTTF9OT19TU0xfSU5URVJOIGRlZmluZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIFNSUCBzdXBwb3J0LgogICAgIFtUb20gV3UgPHRqd0Bjcy5zdGFuZm9yZC5lZHU+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBBZGQgZnVuY3Rpb25zIHRvIGNvcHkgRVZQX1BLRVlfTUVUSE9EIGFuZCByZXRyaWV2ZSBmbGFncyBhbmQgaWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUGVybWl0IGFiYnJldmlhdGVkIGhhbmRzaGFrZXMgd2hlbiByZW5lZ290aWF0aW5nIHVzaW5nIHRoZSBmdW5jdGlvbgogICAgIFNTTF9yZW5lZ290aWF0ZV9hYmJyZXZpYXRlZCgpLgogICAgIFtSb2JpbiBTZWdnZWxtYW5uIDxzZWdnZWxtYW5uQGZoLW11ZW5zdGVyLmRlPl0KCiAgKikgQWRkIGNhbGwgdG8gRU5HSU5FX3JlZ2lzdGVyX2FsbF9jb21wbGV0ZSgpIHRvCiAgICAgRU5HSU5FX2xvYWRfYnVpbHRpbl9lbmdpbmVzKCksIHNvIHNvbWUgaW1wbGVtZW50YXRpb25zIGdldCB1c2VkCiAgICAgYXV0b21hdGljYWxseSBpbnN0ZWFkIG9mIG5lZWRpbmcgZXhwbGljaXQgYXBwbGljYXRpb24gc3VwcG9ydC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgVExTIGtleSBleHBvcnRlciBhcyBkZXNjcmliZWQgaW4gUkZDNTcwNS4KICAgICBbUm9iaW4gU2VnZ2VsbWFubiA8c2VnZ2VsbWFubkBmaC1tdWVuc3Rlci5kZT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBUTFN2MS4xIHN1cHBvcnQuIFNpbmNlIFRMU3YxLjEgaXMgdmVyeSBzaW1pbGFyIHRvIFRMUyB2MS4wIG9ubHkKICAgICBhIGZldyBjaGFuZ2VzIGFyZSByZXF1aXJlZDoKCiAgICAgICBBZGQgU1NMX09QX05PX1RMU3YxXzEgZmxhZy4KICAgICAgIEFkZCBUTFN2MV8xIG1ldGhvZHMuCiAgICAgICBVcGRhdGUgdmVyc2lvbiBjaGVja2luZyBsb2dpYyB0byBoYW5kbGUgdmVyc2lvbiAxLjEuCiAgICAgICBBZGQgZXhwbGljaXQgSVYgaGFuZGxpbmcgKHBvcnRlZCBmcm9tIERUTFMgY29kZSkuCiAgICAgICBBZGQgY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gc19jbGllbnQvc19zZXJ2ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBnIGFuZCAxLjAuMGggWzEyIE1hciAyMDEyXQoKICAqKSBGaXggTU1BIChCbGVpY2hlbmJhY2hlcidzIGF0dGFjayBvbiBQS0NTICMxIHYxLjUgUlNBIHBhZGRpbmcpIHdlYWtuZXNzCiAgICAgaW4gQ01TIGFuZCBQS0NTNyBjb2RlLiBXaGVuIFJTQSBkZWNyeXB0aW9uIGZhaWxzIHVzZSBhIHJhbmRvbSBrZXkgZm9yCiAgICAgY29udGVudCBkZWNyeXB0aW9uIGFuZCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGVycm9yLiBOb3RlOiB0aGlzIGF0dGFjawogICAgIG5lZWRzIG9uIGF2ZXJhZ2UgMl4yMCBtZXNzYWdlcyBzbyBpdCBvbmx5IGFmZmVjdHMgYXV0b21hdGVkIHNlbmRlcnMuIFRoZQogICAgIG9sZCBiZWhhdmlvdXIgY2FuIGJlIHJlZW5hYmxlZCBpbiB0aGUgQ01TIGNvZGUgYnkgc2V0dGluZyB0aGUKICAgICBDTVNfREVCVUdfREVDUllQVCBmbGFnOiB0aGlzIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCB0ZXN0aW5nIHdoZXJlCiAgICAgYW4gTU1BIGRlZmVuY2UgaXMgbm90IG5lY2Vzc2FyeS4KICAgICBUaGFua3MgdG8gSXZhbiBOZXN0bGVyb2RlIDxpbmVzdGxlcm9kZUB1cy5pYm0uY29tPiBmb3IgZGlzY292ZXJpbmcKICAgICB0aGlzIGlzc3VlLiAoQ1ZFLTIwMTItMDg4NCkKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggQ1ZFLTIwMTEtNDYxOTogbWFrZSBzdXJlIHdlIHJlYWxseSBhcmUgcmVjZWl2aW5nIGEgCiAgICAgY2xpZW50IGhlbGxvIGJlZm9yZSByZWplY3RpbmcgbXVsdGlwbGUgU0dDIHJlc3RhcnRzLiBUaGFua3MgdG8KICAgICBJdmFuIE5lc3RsZXJvZGUgPGluZXN0bGVyb2RlQHVzLmlibS5jb20+IGZvciBkaXNjb3ZlcmluZyB0aGlzIGJ1Zy4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGYgYW5kIDEuMC4wZyBbMTggSmFuIDIwMTJdCgogICopIEZpeCBmb3IgRFRMUyBEb1MgaXNzdWUgaW50cm9kdWNlZCBieSBmaXggZm9yIENWRS0yMDExLTQxMDkuCiAgICAgVGhhbmtzIHRvIEFudG9uaW8gTWFydGluLCBFbnRlcnByaXNlIFNlY3VyZSBBY2Nlc3MgUmVzZWFyY2ggYW5kCiAgICAgRGV2ZWxvcG1lbnQsIENpc2NvIFN5c3RlbXMsIEluYy4gZm9yIGRpc2NvdmVyaW5nIHRoaXMgYnVnIGFuZAogICAgIHByZXBhcmluZyBhIGZpeC4gKENWRS0yMDEyLTAwNTApCiAgICAgW0FudG9uaW8gTWFydGluXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGUgYW5kIDEuMC4wZiBbNCBKYW4gMjAxMl0KCiAgKikgTmFkaGVtIEFsZmFyZGFuIGFuZCBLZW5ueSBQYXRlcnNvbiBoYXZlIGRpc2NvdmVyZWQgYW4gZXh0ZW5zaW9uCiAgICAgb2YgdGhlIFZhdWRlbmF5IHBhZGRpbmcgb3JhY2xlIGF0dGFjayBvbiBDQkMgbW9kZSBlbmNyeXB0aW9uCiAgICAgd2hpY2ggZW5hYmxlcyBhbiBlZmZpY2llbnQgcGxhaW50ZXh0IHJlY292ZXJ5IGF0dGFjayBhZ2FpbnN0CiAgICAgdGhlIE9wZW5TU0wgaW1wbGVtZW50YXRpb24gb2YgRFRMUy4gVGhlaXIgYXR0YWNrIGV4cGxvaXRzIHRpbWluZwogICAgIGRpZmZlcmVuY2VzIGFyaXNpbmcgZHVyaW5nIGRlY3J5cHRpb24gcHJvY2Vzc2luZy4gQSByZXNlYXJjaAogICAgIHBhcGVyIGRlc2NyaWJpbmcgdGhpcyBhdHRhY2sgY2FuIGJlIGZvdW5kIGF0OgogICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmlzZy5yaHVsLmFjLnVrL35rcC9kdGxzLnBkZgogICAgIFRoYW5rcyBnbyB0byBOYWRoZW0gQWxmYXJkYW4gYW5kIEtlbm55IFBhdGVyc29uIG9mIHRoZSBJbmZvcm1hdGlvbgogICAgIFNlY3VyaXR5IEdyb3VwIGF0IFJveWFsIEhvbGxvd2F5LCBVbml2ZXJzaXR5IG9mIExvbmRvbgogICAgICh3d3cuaXNnLnJodWwuYWMudWspIGZvciBkaXNjb3ZlcmluZyB0aGlzIGZsYXcgYW5kIHRvIFJvYmluIFNlZ2dlbG1hbm4KICAgICA8c2VnZ2VsbWFubkBmaC1tdWVuc3Rlci5kZT4gYW5kIE1pY2hhZWwgVHVleGVuIDx0dWV4ZW5AZmgtbXVlbnN0ZXIuZGU+CiAgICAgZm9yIHByZXBhcmluZyB0aGUgZml4LiAoQ1ZFLTIwMTEtNDEwOCkKICAgICBbUm9iaW4gU2VnZ2VsbWFubiwgTWljaGFlbCBUdWV4ZW5dCgogICopIENsZWFyIGJ5dGVzIHVzZWQgZm9yIGJsb2NrIHBhZGRpbmcgb2YgU1NMIDMuMCByZWNvcmRzLgogICAgIChDVkUtMjAxMS00NTc2KQogICAgIFtBZGFtIExhbmdsZXkgKEdvb2dsZSldCgogICopIE9ubHkgYWxsb3cgb25lIFNHQyBoYW5kc2hha2UgcmVzdGFydCBmb3IgU1NML1RMUy4gVGhhbmtzIHRvIEdlb3JnZQogICAgIEthZGlhbmFraXMgPGRlc25hY2tlZEBnbWFpbC5jb20+IGZvciBkaXNjb3ZlcmluZyB0aGlzIGlzc3VlIGFuZAogICAgIEFkYW0gTGFuZ2xleSBmb3IgcHJlcGFyaW5nIHRoZSBmaXguIChDVkUtMjAxMS00NjE5KQogICAgIFtBZGFtIExhbmdsZXkgKEdvb2dsZSldCgogICopIENoZWNrIHBhcmFtZXRlcnMgYXJlIG5vdCBOVUxMIGluIEdPU1QgRU5HSU5FLiAoQ1ZFLTIwMTItMDAyNykKICAgICBbQW5kcmV5IEt1bGlrb3YgPGFtZGVpY2hAZ21haWwuY29tPl0KCiAgKikgUHJldmVudCBtYWxmb3JtZWQgUkZDMzc3OSBkYXRhIHRyaWdnZXJpbmcgYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCiAgICAgVGhhbmtzIHRvIEFuZHJldyBDaGksIEJCTiBUZWNobm9sb2dpZXMsIGZvciBkaXNjb3ZlcmluZyB0aGUgZmxhdwogICAgIGFuZCBSb2IgQXVzdGVpbiA8c3JhQGhhY3Rybi5uZXQ+IGZvciBmaXhpbmcgaXQuIChDVkUtMjAxMS00NTc3KQogICAgIFtSb2IgQXVzdGVpbiA8c3JhQGhhY3Rybi5uZXQ+XQoKICAqKSBJbXByb3ZlZCBQUk5HIHNlZWRpbmcgZm9yIFZPUy4KICAgICBbUGF1bCBHcmVlbiA8UGF1bC5HcmVlbkBzdHJhdHVzLmNvbT5dCgogICopIEZpeCBzc2xfY2lwaC5jIHNldC11cCByYWNlLgogICAgIFtBZGFtIExhbmdsZXkgKEdvb2dsZSldCgogICopIEZpeCBzcHVyaW91cyBmYWlsdXJlcyBpbiBlY2RzYXRlc3QuYy4KICAgICBbRW1pbGlhIEvkc3BlciAoR29vZ2xlKV0KCiAgKikgRml4IHRoZSBCSU9fZl9idWZmZXIoKSBpbXBsZW1lbnRhdGlvbiAod2hpY2ggd2FzIG1peGluZyBkaWZmZXJlbnQKICAgICBpbnRlcnByZXRhdGlvbnMgb2YgdGhlICcuLi5fbGVuJyBmaWVsZHMpLgogICAgIFtBZGFtIExhbmdsZXkgKEdvb2dsZSldCgogICopIEZpeCBoYW5kbGluZyBvZiBCTl9CTElORElORzogbm93IEJOX0JMSU5ESU5HX2ludmVydF9leCAocmF0aGVyIHRoYW4KICAgICBCTl9CTElORElOR19pbnZlcnRfZXgpIGNhbGxzIEJOX0JMSU5ESU5HX3VwZGF0ZSwgZW5zdXJpbmcgdGhhdCBjb25jdXJyZW50CiAgICAgdGhyZWFkcyB3b24ndCByZXVzZSB0aGUgc2FtZSBibGluZGluZyBjb2VmZmljaWVudHMuCgogICAgIFRoaXMgYWxzbyBhdm9pZHMgdGhlIG5lZWQgdG8gb2J0YWluIHRoZSBDUllQVE9fTE9DS19SU0FfQkxJTkRJTkcKICAgICBsb2NrIHRvIGNhbGwgQk5fQkxJTkRJTkdfaW52ZXJ0X2V4LCBhbmQgYXZvaWRzIG9uZSB1c2Ugb2YKICAgICBCTl9CTElORElOR191cGRhdGUgZm9yIGVhY2ggQk5fQkxJTkRJTkcgc3RydWN0dXJlIChwcmV2aW91c2x5LAogICAgIHRoZSBsYXN0IHVwZGF0ZSBhbHdheXMgcmVtYWluZWQgdW51c2VkKS4KICAgICBbRW1pbGlhIEvkc3BlciAoR29vZ2xlKV0KCiAgKikgSW4gc3NsM19jbGVhciwgcHJlc2VydmUgczMtPmluaXRfZXh0cmEgYWxvbmcgd2l0aCBzMy0+cmJ1Zi4KICAgICBbQm9iIEJ1Y2tob2x6IChHb29nbGUpXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGQgYW5kIDEuMC4wZSBbNiBTZXAgMjAxMV0KCiAgKikgRml4IGJ1ZyB3aGVyZSBDUkxzIHdpdGggbmV4dFVwZGF0ZSBpbiB0aGUgcGFzdCBhcmUgc29tZXRpbWVzIGFjY2VwdGVkCiAgICAgYnkgaW5pdGlhbGlzaW5nIFg1MDlfU1RPUkVfQ1RYIHByb3Blcmx5LiAoQ1ZFLTIwMTEtMzIwNykKICAgICBbS2FzcGFyIEJyYW5kIDxvc3NsQHZlbG94LmNoPl0KCiAgKikgRml4IFNTTCBtZW1vcnkgaGFuZGxpbmcgZm9yIChFQylESCBjaXBoZXJzdWl0ZXMsIGluIHBhcnRpY3VsYXIKICAgICBmb3IgbXVsdGktdGhyZWFkZWQgdXNlIG9mIEVDREguIChDVkUtMjAxMS0zMjEwKQogICAgIFtBZGFtIExhbmdsZXkgKEdvb2dsZSldCgogICopIEZpeCB4NTA5X25hbWVfZXhfZDJpIG1lbW9yeSBsZWFrIG9uIGJhZCBpbnB1dHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVtb3ZlIGhhcmQgY29kZWQgZWNkc2FXaXRoU0hBMSBzaWduYXR1cmUgdGVzdHMgaW4gc3NsIGNvZGUgYW5kIGNoZWNrCiAgICAgc2lnbmF0dXJlIHB1YmxpYyBrZXkgYWxnb3JpdGhtIGJ5IHVzaW5nIE9JRCB4cmVmIHV0aWxpdGllcyBpbnN0ZWFkLgogICAgIEJlZm9yZSB0aGlzIHlvdSBjb3VsZCBvbmx5IHVzZSBzb21lIEVDQyBjaXBoZXJzdWl0ZXMgd2l0aCBTSEExIG9ubHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHByb3RlY3Rpb24gYWdhaW5zdCBFQ0RTQSB0aW1pbmcgYXR0YWNrcyBhcyBtZW50aW9uZWQgaW4gdGhlIHBhcGVyCiAgICAgYnkgQmlsbHkgQm9iIEJydW1sZXkgYW5kIE5pY29sYSBUdXZlcmksIHNlZToKCglodHRwOi8vZXByaW50LmlhY3Iub3JnLzIwMTEvMjMyLnBkZgoKICAgICBbQmlsbHkgQm9iIEJydW1sZXkgYW5kIE5pY29sYSBUdXZlcmldCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wYyBhbmQgMS4wLjBkIFs4IEZlYiAyMDExXQoKICAqKSBGaXggcGFyc2luZyBvZiBPQ1NQIHN0YXBsaW5nIENsaWVudEhlbGxvIGV4dGVuc2lvbi4gQ1ZFLTIwMTEtMDAxNAogICAgIFtOZWVsIE1laHRhLCBBZGFtIExhbmdsZXksIEJvZG8gTW9lbGxlciAoR29vZ2xlKV0KCiAgKikgRml4IGJ1ZyBpbiBzdHJpbmcgcHJpbnRpbmcgY29kZTogaWYgKmFueSogZXNjYXBpbmcgaXMgZW5hYmxlZCB3ZSBtdXN0CiAgICAgZXNjYXBlIHRoZSBlc2NhcGUgY2hhcmFjdGVyIChiYWNrc2xhc2gpIG9yIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzCiAgICAgYW1iaWd1b3VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wYiBhbmQgMS4wLjBjICBbMiBEZWMgMjAxMF0KCiAgKikgRGlzYWJsZSBjb2RlIHdvcmthcm91bmQgZm9yIGFuY2llbnQgYW5kIG9ic29sZXRlIE5ldHNjYXBlIGJyb3dzZXJzCiAgICAgYW5kIHNlcnZlcnM6IGFuIGF0dGFja2VyIGNhbiB1c2UgaXQgaW4gYSBjaXBoZXJzdWl0ZSBkb3duZ3JhZGUgYXR0YWNrLgogICAgIFRoYW5rcyB0byBNYXJ0aW4gUmV4IGZvciBkaXNjb3ZlcmluZyB0aGlzIGJ1Zy4gQ1ZFLTIwMTAtNDE4MAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVkIEotUEFLRSBpbXBsZW1lbnRhdGlvbiBlcnJvciwgb3JpZ2luYWxseSBkaXNjb3ZlcmVkIGJ5CiAgICAgU2ViYXN0aWVuIE1hcnRpbmksIGZ1cnRoZXIgaW5mbyBhbmQgY29uZmlybWF0aW9uIGZyb20gU3RlZmFuCiAgICAgQXJlbnR6IGFuZCBGZW5nIEhhby4gTm90ZSB0aGF0IHRoaXMgZml4IGlzIGEgc2VjdXJpdHkgZml4LiBDVkUtMjAxMC00MjUyCiAgICAgW0JlbiBMYXVyaWVdCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wYSBhbmQgMS4wLjBiICBbMTYgTm92IDIwMTBdCgogICopIEZpeCBleHRlbnNpb24gY29kZSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2hpY2ggY2FuIHJlc3VsdCBpbiBhIGJ1ZmZlcgogICAgIG92ZXJydW4gdnVsbmVyYWJpbGl0eTogcmVzdW1lZCBzZXNzaW9ucyBtdXN0IG5vdCBiZSBtb2RpZmllZCBhcyB0aGV5IGNhbgogICAgIGJlIHNoYXJlZCBieSBtdWx0aXBsZSB0aHJlYWRzLiBDVkUtMjAxMC0zODY0CiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IFdJTjMyIGJ1aWxkIHN5c3RlbSB0byBjb3JyZWN0bHkgbGluayBhbiBFTkdJTkUgZGlyZWN0b3J5IGludG8KICAgICBhIERMTC4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjAgYW5kIDEuMC4wYSAgWzAxIEp1biAyMDEwXQoKICAqKSBDaGVjayByZXR1cm4gdmFsdWUgb2YgaW50X3JzYV92ZXJpZnkgaW4gcGtleV9yc2FfdmVyaWZ5cmVjb3ZlciAKICAgICAoQ1ZFLTIwMTAtMTYzMykKICAgICBbU3RldmUgSGVuc29uLCBQZXRlci1NaWNoYWVsIEhhZ2VyIDxoYWdlckBkb3J0bXVuZC5uZXQ+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOG4gYW5kIDEuMC4wICBbMjkgTWFyIDIwMTBdCgogICopIEFkZCAibWlzc2luZyIgZnVuY3Rpb24gRVZQX0NJUEhFUl9DVFhfY29weSgpLiBUaGlzIGNvcGllcyBhIGNpcGhlcgogICAgIGNvbnRleHQuIFRoZSBvcGVyYXRpb24gY2FuIGJlIGN1c3RvbWlzZWQgdmlhIHRoZSBjdHJsIG1lY2hhbmlzbSBpbgogICAgIGNhc2UgRU5HSU5FcyB3YW50IHRvIGluY2x1ZGUgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRvbGVyYXRlIHlldCBhbm90aGVyIGJyb2tlbiBQS0NTIzgga2V5IGZvcm1hdDogcHJpdmF0ZSBrZXkgdmFsdWUgbmVnYXRpdmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyAtc3ViamVjdF9oYXNoX29sZCBhbmQgLWlzc3Vlcl9oYXNoX29sZCBvcHRpb25zIHRvIHg1MDkgdXRpbGl0eSB0bwogICAgIG91dHB1dCBoYXNoZXMgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5TU0wuCiAgICAgW1dpbGx5IFdlaXN6IDx3ZWlzekB2Y3BjLnVuaXZpZS5hYy5hdD5dCgogICopIEZpeCBjb21wcmVzc2lvbiBhbGdvcml0aG0gaGFuZGxpbmc6IGlmIHJlc3VtaW5nIGEgc2Vzc2lvbiB1c2UgdGhlCiAgICAgY29tcHJlc3Npb24gYWxnb3JpdGhtIG9mIHRoZSByZXN1bWVkIHNlc3Npb24gaW5zdGVhZCBvZiBkZXRlcm1pbmluZwogICAgIGl0IGZyb20gY2xpZW50IGhlbGxvIGFnYWluLiBEb24ndCBhbGxvdyBzZXJ2ZXIgdG8gY2hhbmdlIGFsZ29yaXRobS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbG9hZF9jcmxzKCkgZnVuY3Rpb24gdG8gYXBwcyB0aWR5aW5nIGxvYWRfY2VydHMoKSB0b28uIEFkZCBvcHRpb24KICAgICB0byB2ZXJpZnkgdXRpbGl0eSB0byBhbGxvdyBhZGRpdGlvbmFsIENSTHMgdG8gYmUgaW5jbHVkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIE9DU1AgcmVxdWVzdCBjb2RlIHRvIHBlcm1pdCBhZGRpbmcgY3VzdG9tIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3Q6CiAgICAgc29tZSByZXNwb25kZXJzIG5lZWQgdGhpcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUaGUgZnVuY3Rpb24gRVZQX1BLRVlfc2lnbigpIHJldHVybnMgPD0wIG9uIGVycm9yOiBjaGVjayByZXR1cm4gY29kZQogICAgIGNvcnJlY3RseS4KICAgICBbSnVsaWEgTGF3YWxsIDxqdWxpYUBkaWt1LmRrPl0KCiAgKikgVXBkYXRlIHZlcmlmeSBjYWxsYmFjayBjb2RlIGluIGFwcHMvc19jYi5jIGFuZCBhcHBzL3ZlcmlmeS5jLCBpdAogICAgIG5lZWRsZXNzbHkgZGVyZWZlcmVuY2VkIHN0cnVjdHVyZXMsIHVzZWQgb2Jzb2xldGUgZnVuY3Rpb25zIGFuZAogICAgIGRpZG4ndCBoYW5kbGUgYWxsIHVwZGF0ZWQgdmVyaWZ5IGNvZGVzIGNvcnJlY3RseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEaXNhYmxlIE1EMiBpbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIEJJT19wb3AoKSBhbmQgQklPX3B1c2goKSB1c2UgdGhlIGN0cmwgYXJndW1lbnQgKHdoaWNoIHdhcyBOVUxMKSB0bwogICAgIGluZGljYXRlIHRoZSBpbml0aWFsIEJJTyBiZWluZyBwdXNoZWQgb3IgcG9wcGVkLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlCiAgICAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIEJJTyBpcyB0aGUgb25lIGV4cGxpY2l0bHkgY2FsbGVkIG9yIGFzIGEgcmVzdWx0CiAgICAgb2YgdGhlIGN0cmwgYmVpbmcgcGFzc2VkIGRvd24gdGhlIGNoYWluLiBGaXggQklPX3BvcCgpIGFuZCBTU0wgQklPcyBzbwogICAgIGl0IGhhbmRsZXMgcmVmZXJlbmNlIGNvdW50cyBjb3JyZWN0bHkgYW5kIGRvZXNuJ3QgemVybyBvdXQgdGhlIEkvTyBiaW8KICAgICB3aGVuIGl0IGlzIG5vdCBiZWluZyBleHBsaWNpdGx5IHBvcHBlZC4gV0FSTklORzogYXBwbGljYXRpb25zIHdoaWNoCiAgICAgaW5jbHVkZWQgd29ya2Fyb3VuZHMgZm9yIHRoZSBvbGQgYnVnZ3kgYmVoYXZpb3VyIHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZAogICAgIG9yIHRoZXkgY291bGQgZnJlZSB1cCBhbHJlYWR5IGZyZWVkIEJJT3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIHRoZSB1bmkyYXNjL2FzYzJ1bmkgPT4gT1BFTlNTTF91bmkyYXNjL09QRU5TU0xfYXNjMnVuaQogICAgIHJlbmFtaW5nIHRvIGFsbCBwbGF0Zm9ybXMgKHdpdGhpbiB0aGUgMC45LjggYnJhbmNoLCB0aGlzIHdhcwogICAgIGRvbmUgY29uZGl0aW9uYWxseSBvbiBOZXR3YXJlIHBsYXRmb3JtcyB0byBhdm9pZCBhIG5hbWUgY2xhc2gpLgogICAgIFtHdWVudGVyIDxsaXN0c0Bna253Lm5ldD5dCgogICopIEFkZCBFQ0RIRSBhbmQgUFNLIHN1cHBvcnQgdG8gRFRMUy4KICAgICBbTWljaGFlbCBUdWV4ZW4gPHR1ZXhlbkBmaC1tdWVuc3Rlci5kZT5dCgogICopIEFkZCBDSEVDS0VEX1NUQUNLX09GIG1hY3JvIHRvIHNhZmVzdGFjay5oLCBvdGhlcndpc2Ugc2FmZXN0YWNrIGNhbid0CiAgICAgYmUgdXNlZCBvbiBDKysuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkICJtaXNzaW5nIiBmdW5jdGlvbiBFVlBfTURfZmxhZ3MoKSAod2l0aG91dCB0aGlzIHRoZSBvbmx5IHdheSB0bwogICAgIHJldHJpZXZlIGEgZGlnZXN0IGZsYWdzIGlzIGJ5IGFjY2Vzc2luZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5LiBVcGRhdGUKICAgICBFVlBfTURfZG9fYWxsKigpIGFuZCBFVlBfQ0lQSEVSX2RvX2FsbCooKSB0byBpbmNsdWRlIHRoZSBuYW1lIGEgZGlnZXN0CiAgICAgb3IgY2lwaGVyIGlzIHJlZ2lzdGVyZWQgYXMgaW4gdGhlICJmcm9tIiBhcmd1bWVudC4gUHJpbnQgb3V0IGFsbAogICAgIHJlZ2lzdGVyZWQgZGlnZXN0cyBpbiB0aGUgZGdzdCB1c2FnZSBtZXNzYWdlIGluc3RlYWQgb2YgbWFudWFsbHkgCiAgICAgYXR0ZW1wdGluZyB0byB3b3JrIHRoZW0gb3V0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIElmIG5vIFNTTHYyIGNpcGhlcnMgYXJlIHVzZWQgZG9uJ3QgdXNlIGFuIFNTTHYyIGNvbXBhdGlibGUgY2xpZW50IGhlbGxvOgogICAgIHRoaXMgYWxsb3dzIHRoZSB1c2Ugb2YgY29tcHJlc3Npb24gYW5kIGV4dGVuc2lvbnMuIENoYW5nZSBkZWZhdWx0IGNpcGhlcgogICAgIHN0cmluZyB0byByZW1vdmUgU1NMdjIgY2lwaGVyc3VpdGVzLiBUaGlzIGVmZmVjdGl2ZWx5IGF2b2lkcyBhbmNpZW50IFNTTHYyCiAgICAgYnkgZGVmYXVsdCB1bmxlc3MgYW4gYXBwbGljYXRpb24gY2lwaGVyIHN0cmluZyByZXF1ZXN0cyBpdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbHRlciBtYXRjaCBjcml0ZXJpYSBpbiBQS0NTMTJfcGFyc2UoKS4gSXQgdXNlZCB0byB0cnkgdG8gdXNlIGxvY2FsCiAgICAga2V5IGlkcyB0byBmaW5kIG1hdGNoaW5nIGNlcnRpZmljYXRlcyBhbmQga2V5cyBidXQgc29tZSBQS0NTIzEyIGZpbGVzCiAgICAgZG9uJ3QgZm9sbG93IHRoZSAoc29tZXdoYXQgdW53cml0dGVuKSBydWxlcyBhbmQgdGhpcyBzdHJhdGVneSBmYWlscy4KICAgICBOb3cganVzdCBnYXRoZXIgYWxsIGNlcnRpZmljYXRlcyB0b2dldGhlciBhbmQgdGhlIGZpcnN0IHByaXZhdGUga2V5CiAgICAgdGhlbiBsb29rIGZvciB0aGUgZmlyc3QgY2VydGlmaWNhdGUgdGhhdCBtYXRjaGVzIHRoZSBrZXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCB1c2Ugb2YgcmVnaXN0ZXJlZCBkaWdlc3QgYW5kIGNpcGhlciBuYW1lcyBmb3IgZGdzdCBhbmQgY2lwaGVyCiAgICAgY29tbWFuZHMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gYWRkIGVhY2ggb25lIGFzIGEgc3BlY2lhbCBjYXNlLiBTbyBub3cKICAgICB5b3UgY2FuIGRvOgoKICAgICAgICBvcGVuc3NsIHNoYTI1NiBmb28KCiAgICAgYXMgd2VsbCBhczoKCiAgICAgICAgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgZm9vCgogICAgIGFuZCB0aGlzIHdvcmtzIGZvciBFTkdJTkUgYmFzZWQgYWxnb3JpdGhtcyB0b28uCgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBHb3N0IEVOR0lORSB0byBzdXBwb3J0IHBhcmFtZXRlciBmaWxlcy4KICAgICBbVmljdG9yIEIuIFdhZ25lciA8dml0dXNAY3J5cHRvY29tLnJ1Pl0KCiAgKikgU3VwcG9ydCBHZW5lcmFsaXplZFRpbWUgaW4gY2EgdXRpbGl0eS4gCiAgICAgW09saXZlciBNYXJ0aW4gPG9saXZlckB2b2xhdGlsZXZvaWQubmV0PiwgU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIHRoZSBoYXNoIGZvcm1hdCB1c2VkIGZvciBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnkgbGlua3MuIFRoZSBuZXcKICAgICBmb3JtIHVzZXMgdGhlIGNhbm9uaWNhbCBlbmNvZGluZyAobWVhbmluZyBlcXVpdmFsZW50IG5hbWVzIHdpbGwgd29yawogICAgIGV2ZW4gaWYgdGhleSBhcmVuJ3QgaWRlbnRpY2FsKSBhbmQgdXNlcyBTSEExIGluc3RlYWQgb2YgTUQ1LiBUaGlzIGZvcm0KICAgICBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgb2xkZXIgZm9ybWF0IGFuZCBhcyBhIHJlc3VsdCBjX3JlaGFzaCBzaG91bGQKICAgICBiZSB1c2VkIHRvIHJlYnVpbGQgc3ltYm9saWMgbGlua3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBQS0NTIzggdGhlIGRlZmF1bHQgd3JpdGUgZm9ybWF0IGZvciBwcml2YXRlIGtleXMsIHJlcGxhY2luZyB0aGUKICAgICB0cmFkaXRpb25hbCBmb3JtYXQuIFRoaXMgZm9ybSBpcyBzdGFuZGFyZGlzZWQsIG1vcmUgc2VjdXJlIGFuZCBkb2Vzbid0CiAgICAgaW5jbHVkZSBhbiBpbXBsaWNpdCBNRDUgZGVwZW5kZW5jeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSAkZ2NjX2RldnRlYW1fd2FybiBvcHRpb24gdG8gQ29uZmlndXJlLiBUaGUgaWRlYSBpcyB0aGF0IGFueSBjb2RlCiAgICAgY29tbWl0dGVkIHRvIE9wZW5TU0wgc2hvdWxkIHBhc3MgdGhpcyBsb3QgYXMgYSBtaW5pbXVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzZXNzaW9uIHRpY2tldCBvdmVycmlkZSBmdW5jdGlvbmFsaXR5IGZvciB1c2UgYnkgRUFQLUZBU1QuCiAgICAgW0pvdW5pIE1hbGluZW4gPGpAdzEuZmk+XQoKICAqKSBNb2RpZnkgSE1BQyBmdW5jdGlvbnMgdG8gcmV0dXJuIGEgdmFsdWUuIFNpbmNlIHRoZXNlIGNhbiBiZSBpbXBsZW1lbnRlZAogICAgIGluIGFuIEVOR0lORSBlcnJvcnMgY2FuIG9jY3VyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFR5cGUtY2hlY2tlZCBPQkpfYnNlYXJjaF9leC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgVHlwZS1jaGVja2VkIE9CSl9ic2VhcmNoLiBBbHNvIHNvbWUgY29uc3RpZmljYXRpb24gbmVjZXNzaXRhdGVkCiAgICAgYnkgdHlwZS1jaGVja2luZy4gIFN0aWxsIHRvIGNvbWU6IFRYVF9EQiwgYnNlYXJjaCg/KSwKICAgICBPQkpfYnNlYXJjaF9leCwgcXNvcnQsIENSWVBUT19FWF9EQVRBLCBBU04xX1ZBTFVFLCBBU04xX1NUUklORywKICAgICBDT05GX1ZBTFVFLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBOZXcgZnVuY3Rpb24gT1BFTlNTTF9nbXRpbWVfYWRqKCkgdG8gYWRkIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGRheXMgYW5kCiAgICAgc2Vjb25kcyB0byBhIHRtIHN0cnVjdHVyZSBkaXJlY3RseSwgaW5zdGVhZCBvZiBnb2luZyB0aHJvdWdoIE9TCiAgICAgc3BlY2lmaWMgZGF0ZSByb3V0aW5lcy4gVGhpcyBhdm9pZHMgYW55IGlzc3VlcyB3aXRoIE9TIHJvdXRpbmVzIHN1Y2gKICAgICBhcyB0aGUgeWVhciAyMDM4IGJ1Zy4gTmV3ICpfYWRqKCkgZnVuY3Rpb25zIGZvciBBU04xIHRpbWUgc3RydWN0dXJlcwogICAgIGFuZCBYNTA5X3RpbWVfYWRqX2V4KCkgdG8gY292ZXIgdGhlIGV4dGVuZGVkIHJhbmdlLiBUaGUgZXhpc3RpbmcKICAgICBYNTA5X3RpbWVfYWRqKCkgaXMgc3RpbGwgdXNhYmxlIGFuZCB3aWxsIG5vIGxvbmdlciBoYXZlIGFueSBkYXRlIGlzc3Vlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEZWx0YSBDUkwgc3VwcG9ydC4gTmV3IHVzZSBkZWx0YXMgb3B0aW9uIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byBsb2NhdGUKICAgICBhbmQgc2VhcmNoIGFueSBhcHByb3ByaWF0ZSBkZWx0YSBDUkxzIGF2YWlsYWJsZS4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIENSTHMgcGFydGl0aW9uZWQgYnkgcmVhc29uIGNvZGUuIFJlb3JnYW5pc2UgQ1JMIHByb2Nlc3NpbmcKICAgICBjb2RlIGFuZCBhZGQgYWRkaXRpb25hbCBzY29yZSBlbGVtZW50cy4gVmFsaWRhdGUgYWx0ZXJuYXRlIENSTCBwYXRocwogICAgIGFzIHBhcnQgb2YgdGhlIENSTCBjaGVja2luZyBhbmQgaW5kaWNhdGUgYSBuZXcgZXJyb3IgIkNSTCBwYXRoIHZhbGlkYXRpb24KICAgICBlcnJvciIgaW4gdGhpcyBjYXNlLiBBcHBsaWNhdGlvbnMgd2FudGluZyBhZGRpdGlvbmFsIGRldGFpbHMgY2FuIHVzZQogICAgIHRoZSB2ZXJpZnkgY2FsbGJhY2sgYW5kIGNoZWNrIHRoZSBuZXcgInBhcmVudCIgZmllbGQuIElmIHRoaXMgaXMgbm90CiAgICAgTlVMTCBDUkwgcGF0aCB2YWxpZGF0aW9uIGlzIHRha2luZyBwbGFjZS4gRXhpc3RpbmcgYXBwbGljYXRpb25zIHdvbnQKICAgICBzZWUgdGhpcyBiZWNhdXNlIGl0IHJlcXVpcmVzIGV4dGVuZGVkIENSTCBzdXBwb3J0IHdoaWNoIGlzIG9mZiBieQogICAgIGRlZmF1bHQuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBmcmVzaGVzdCBDUkwgZXh0ZW5zaW9uLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBpbmRpcmVjdCBDUkwgc3VwcG9ydC4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGluIHRoZSBDUkxzCiAgICAgcGFzc2VkIGRpcmVjdGx5IGFuZCBub3QgdmlhIGxvb2t1cC4gUHJvY2VzcyBjZXJ0aWZpY2F0ZSBpc3N1ZXIKICAgICBDUkwgZW50cnkgZXh0ZW5zaW9uIGFuZCBsb29rdXAgQ1JMIGVudHJpZXMgYnkgYm90aGVyIGlzc3VlciBuYW1lCiAgICAgYW5kIHNlcmlhbCBudW1iZXIuIENoZWNrIGFuZCBwcm9jZXNzIENSTCBpc3N1ZXIgZW50cnkgaW4gSURQIGV4dGVuc2lvbi4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBkaXN0aW5jdCBjZXJ0aWZpY2F0ZSBhbmQgQ1JMIHBhdGhzLiBUaGUgQ1JMIGlzc3VlcgogICAgIGNlcnRpZmljYXRlIGlzIHZhbGlkYXRlZCBzZXBhcmF0ZWx5IGluIHRoaXMgY2FzZS4gT25seSBlbmFibGVkIGlmCiAgICAgYW4gZXh0ZW5kZWQgQ1JMIHN1cHBvcnQgZmxhZyBpcyBzZXQ6IHRoaXMgZmxhZyB3aWxsIGVuYWJsZSBhZGRpdGlvbmFsCiAgICAgQ1JMIGZ1bmN0aW9uYWxpdHkgaW4gZnV0dXJlLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHBvbGljeSBtYXBwaW5ncyBleHRlbnNpb24uCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBwYXRobGVuZ3RoIGNvbnN0cmFpbnQsIHNlbGYgaXNzdWVkIGNlcnRpZmljYXRlIGhhbmRsaW5nLAogICAgIHBvbGljeSBwcm9jZXNzaW5nIHRvIGFsaWduIHdpdGggUkZDMzI4MCBhbmQgUEtJVFMgdGVzdHMuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBuYW1lIGNvbnN0cmFpbnRzIGNlcnRpZmljYXRlIGV4dGVuc2lvbi4gRE4sIGVtYWlsLCBETlMKICAgICBhbmQgVVJJIHR5cGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVG8gY2F0ZXIgZm9yIHN5c3RlbXMgdGhhdCBwcm92aWRlIGEgcG9pbnRlci1iYXNlZCB0aHJlYWQgSUQgcmF0aGVyCiAgICAgdGhhbiBudW1lcmljLCBkZXByZWNhdGUgdGhlIGN1cnJlbnQgbnVtZXJpYyB0aHJlYWQgSUQgbWVjaGFuaXNtIGFuZAogICAgIHJlcGxhY2UgaXQgd2l0aCBhIHN0cnVjdHVyZSBhbmQgYXNzb2NpYXRlZCBjYWxsYmFjayB0eXBlLiBUaGlzCiAgICAgbWVjaGFuaXNtIGFsbG93cyBhIG51bWVyaWMgImhhc2giIHRvIGJlIGV4dHJhY3RlZCBmcm9tIGEgdGhyZWFkIElEIGluCiAgICAgZWl0aGVyIGNhc2UsIGFuZCBvbiBwbGF0Zm9ybXMgd2hlcmUgcG9pbnRlcnMgYXJlIGxhcmdlciB0aGFuICdsb25nJywKICAgICBtaXhpbmcgaXMgZG9uZSB0byBoZWxwIGVuc3VyZSB0aGUgbnVtZXJpYyAnaGFzaCcgaXMgdXNhYmxlIGV2ZW4gaWYgaXQKICAgICBjYW4ndCBiZSBndWFyYW50ZWVkIHVuaXF1ZS4gVGhlIGRlZmF1bHQgbWVjaGFuaXNtIGlzIHRvIHVzZSAiJmVycm5vIgogICAgIGFzIGEgcG9pbnRlci1iYXNlZCB0aHJlYWQgSUQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aHJlYWRzLgoKICAgICBBcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIHByb3ZpZGUgdGhlaXIgb3duIHRocmVhZCBJRHMgc2hvdWxkIG5vdyB1c2UKICAgICBDUllQVE9fVEhSRUFESURfc2V0X2NhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0aGF0IHdpbGwgY2FsbAogICAgIGVpdGhlciBDUllQVE9fVEhSRUFESURfc2V0X251bWVyaWMoKSBvciBDUllQVE9fVEhSRUFESURfc2V0X3BvaW50ZXIoKS4KCiAgICAgTm90ZSB0aGF0IEVSUl9yZW1vdmVfc3RhdGUoKSBpcyBub3cgZGVwcmVjYXRlZCwgYmVjYXVzZSBpdCBpcyB0aWVkCiAgICAgdG8gdGhlIGFzc3VtcHRpb24gdGhhdCB0aHJlYWQgSURzIGFyZSBudW1lcmljLiAgRVJSX3JlbW92ZV9zdGF0ZSgwKQogICAgIHRvIGZyZWUgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgZXJyb3Igc3RhdGUgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5CiAgICAgRVJSX3JlbW92ZV90aHJlYWRfc3RhdGUoTlVMTCkuCgogICAgIChUaGlzIG5ldyBhcHByb2FjaCByZXBsYWNlcyB0aGUgZnVuY3Rpb25zIENSWVBUT19zZXRfaWRwdHJfY2FsbGJhY2soKSwKICAgICBDUllQVE9fZ2V0X2lkcHRyX2NhbGxiYWNrKCksIGFuZCBDUllQVE9fdGhyZWFkX2lkcHRyKCkgdGhhdCBleGlzdGVkIGluCiAgICAgT3BlblNTTCAwLjkuOS1kZXYgYmV0d2VlbiBKdW5lIDIwMDYgYW5kIEF1Z3VzdCAyMDA4LiBBbHNvLCBpZiBhbgogICAgIGFwcGxpY2F0aW9uIHdhcyBwcmV2aW91c2x5IHByb3ZpZGluZyBhIG51bWVyaWMgdGhyZWFkIGNhbGxiYWNrIHRoYXQKICAgICB3YXMgaW5hcHByb3ByaWF0ZSBmb3IgZGlzdGluZ3Vpc2hpbmcgdGhyZWFkcywgdGhlbiB1bmlxdWVuZXNzIG1pZ2h0CiAgICAgaGF2ZSBiZWVuIG9idGFpbmVkIHdpdGggJmVycm5vIHRoYXQgaGFwcGVuZWQgaW1tZWRpYXRlbHkgaW4gdGhlCiAgICAgaW50ZXJtZWRpYXRlIGRldmVsb3BtZW50IHZlcnNpb25zIG9mIE9wZW5TU0w7IHRoaXMgaXMgbm8gbG9uZ2VyIHRoZQogICAgIGNhc2UsIHRoZSBudW1lcmljIHRocmVhZCBjYWxsYmFjayB3aWxsIG5vdyBvdmVycmlkZSB0aGUgYXV0b21hdGljIHVzZQogICAgIG9mICZlcnJuby4pCiAgICAgW0dlb2ZmIFRob3JwZSwgd2l0aCBoZWxwIGZyb20gQm9kbyBNb2VsbGVyXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIGRpZmZlcmVudCBDUkwgaXNzdWluZyBjZXJ0aWZpY2F0ZXMuIFRoaXMgY292ZXJzIGEKICAgICBzaW1wbGUgY2FzZSB3aGVyZSB0aGUgc2VsZiBpc3N1ZWQgY2VydGlmaWNhdGVzIGluIHRoZSBjaGFpbiBleGlzdCBhbmQKICAgICB0aGUgcmVhbCBDUkwgaXNzdWVyIGlzIGhpZ2hlciBpbiB0aGUgZXhpc3RpbmcgY2hhaW4uCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmVkIGVmZmVjdGl2ZWx5IGRlZnVuY3QgY3J5cHRvL3N0b3JlIGZyb20gdGhlIGJ1aWxkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBSZXZhbXAgb2YgU1RBQ0sgdG8gcHJvdmlkZSBzdHJvbmdlciB0eXBlLWNoZWNraW5nLiBTdGlsbCB0byBjb21lOgogICAgIFRYVF9EQiwgYnNlYXJjaCg/KSwgT0JKX2JzZWFyY2gsIHFzb3J0LCBDUllQVE9fRVhfREFUQSwgQVNOMV9WQUxVRSwKICAgICBBU04xX1NUUklORywgQ09ORl9WQUxVRS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGEgbmV3IFNTTF9NT0RFX1JFTEVBU0VfQlVGRkVSUyBtb2RlIGZsYWcgdG8gcmVsZWFzZSB1bnVzZWQgYnVmZmVyCiAgICAgUkFNIG9uIFNTTCBjb25uZWN0aW9ucy4gIFRoaXMgb3B0aW9uIGNhbiBzYXZlIGFib3V0IDM0ayBwZXIgaWRsZSBTU0wuCiAgICAgW05pY2sgTWF0aGV3c29uXQoKICAqKSBSZXZhbXAgb2YgTEhBU0ggdG8gcHJvdmlkZSBzdHJvbmdlciB0eXBlLWNoZWNraW5nLiBTdGlsbCB0byBjb21lOgogICAgIFNUQUNLLCBUWFRfREIsIGJzZWFyY2gsIHFzb3J0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIENyeXB0b2dyYXBoaWMgTWVzc2FnZSBTeW50YXggKGFrYSBDTVMpIGJhc2VkCiAgICAgb24gUkZDMzg1MCwgUkZDMzg1MSBhbmQgUkZDMzg1Mi4gTmV3IGNtcyBkaXJlY3RvcnkgYW5kIGNtcyB1dGlsaXR5LAogICAgIHN1cHBvcnQgZm9yIGRhdGEsIHNpZ25lZERhdGEsIGNvbXByZXNzZWREYXRhLCBkaWdlc3RlZERhdGEgYW5kCiAgICAgZW5jcnlwdGVkRGF0YSwgZW52ZWxvcGVkRGF0YSB0eXBlcyBpbmNsdWRlZC4gU2NyaXB0cyB0byBjaGVjayBhZ2FpbnN0CiAgICAgUkZDNDEzNCBleGFtcGxlcyBkcmFmdCBhbmQgaW50ZXJvcCBhbmQgY29uc2lzdGVuY3kgY2hlY2tzIG9mIG1hbnkKICAgICBjb250ZW50IHR5cGVzIGFuZCB2YXJpYW50cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgb3B0aW9ucyB0byBlbmMgdXRpbGl0eSB0byBzdXBwb3J0IHVzZSBvZiB6bGliIGNvbXByZXNzaW9uIEJJTy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbmQgbWsxbWYgdG8gc3VwcG9ydCBpbXBvcnRpbmcgb2Ygb3B0aW9ucyBhbmQgYXNzZW1ibHkgbGFuZ3VhZ2UKICAgICBmaWxlcyBmcm9tIENvbmZpZ3VyZSBzY3JpcHQsIGN1cnJlbnRseSBvbmx5IGluY2x1ZGVkIGluIFZDLVdJTjMyLgogICAgIFRoZSBhc3NlbWJseSBsYW5ndWFnZSBydWxlcyBjYW4gbm93IG9wdGlvbmFsbHkgZ2VuZXJhdGUgdGhlIHNvdXJjZQogICAgIGZpbGVzIGZyb20gdGhlIGFzc29jaWF0ZWQgcGVybCBzY3JpcHRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCByZW1haW5pbmcgZnVuY3Rpb25hbGl0eSBuZWVkZWQgdG8gc3VwcG9ydCBHT1NUIGNpcGhlcnN1aXRlcy4KICAgICBJbnRlcm9wIHRlc3RpbmcgaGFzIGJlZW4gcGVyZm9ybWVkIHVzaW5nIENyeXB0b1BybyBpbXBsZW1lbnRhdGlvbnMuCiAgICAgW1ZpY3RvciBCLiBXYWduZXIgPHZpdHVzQGNyeXB0b2NvbS5ydT5dCgogICopIHMzOTB4IGFzc2VtYmxlciBwYWNrLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBUk12NCBhc3NlbWJsZXIgcGFjay4gQVJNdjQgcmVmZXJzIHRvIHY0IGFuZCBsYXRlciBJU0EsIG5vdCBDUFUKICAgICAiZmFtaWx5LiIKICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgSW1wbGVtZW50IE9wYXF1ZSBQUkYgSW5wdXQgVExTIGV4dGVuc2lvbiBhcyBzcGVjaWZpZWQgaW4KICAgICBkcmFmdC1yZXNjb3JsYS10bHMtb3BhcXVlLXByZi1pbnB1dC0wMC50eHQuICBTaW5jZSB0aGlzIGlzIG5vdCBhbgogICAgIG9mZmljaWFsIHNwZWNpZmljYXRpb24geWV0IGFuZCBubyBleHRlbnNpb24gdHlwZSBhc3NpZ25tZW50IGJ5CiAgICAgSUFOQSBleGlzdHMsIHRoaXMgZXh0ZW5zaW9uIChmb3Igbm93KSB3aWxsIGhhdmUgdG8gYmUgZXhwbGljaXRseQogICAgIGVuYWJsZWQgd2hlbiBidWlsZGluZyBPcGVuU1NMIGJ5IHByb3ZpZGluZyB0aGUgZXh0ZW5zaW9uIG51bWJlcgogICAgIHRvIHVzZS4gIEZvciBleGFtcGxlLCBzcGVjaWZ5IGFuIG9wdGlvbgoKICAgICAgICAgLURUTFNFWFRfVFlQRV9vcGFxdWVfcHJmX2lucHV0PTB4OTUyNwoKICAgICB0byB0aGUgImNvbmZpZyIgb3IgIkNvbmZpZ3VyZSIgc2NyaXB0IHRvIGVuYWJsZSB0aGUgZXh0ZW5zaW9uLAogICAgIGFzc3VtaW5nIGV4dGVuc2lvbiBudW1iZXIgMHg5NTI3ICh3aGljaCBpcyBhIGNvbXBsZXRlbHkgYXJiaXRyYXJ5CiAgICAgYW5kIHVub2ZmaWNpYWwgYXNzaWdubWVudCBiYXNlZCBvbiB0aGUgTUQ1IGhhc2ggb2YgdGhlIEludGVybmV0CiAgICAgRHJhZnQpLiAgTm90ZSB0aGF0IGJ5IGRvaW5nIHNvLCB5b3UgcG90ZW50aWFsbHkgbG9zZQogICAgIGludGVyb3BlcmFiaWxpdHkgd2l0aCBvdGhlciBUTFMgaW1wbGVtZW50YXRpb25zIHNpbmNlIHRoZXNlIG1pZ2h0CiAgICAgYmUgdXNpbmcgdGhlIHNhbWUgZXh0ZW5zaW9uIG51bWJlciBmb3Igb3RoZXIgcHVycG9zZXMuCgogICAgIFNTTF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXQoc3NsLCBzcmMsIGxlbikgaXMgdXNlZCB0byBzZXQgdGhlCiAgICAgb3BhcXVlIFBSRiBpbnB1dCB2YWx1ZSB0byB1c2UgaW4gdGhlIGhhbmRzaGFrZS4gIFRoaXMgd2lsbCBjcmVhdGUKICAgICBhbiBpbnRlcmFsIGNvcHkgb2YgdGhlIGxlbmd0aC0nbGVuJyBzdHJpbmcgYXQgJ3NyYycsIGFuZCB3aWxsCiAgICAgcmV0dXJuIG5vbi16ZXJvIGZvciBzdWNjZXNzLgoKICAgICBUbyBnZXQgbW9yZSBjb250cm9sIGFuZCBmbGV4aWJpbGl0eSwgcHJvdmlkZSBhIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgYnkgdXNpbmcKCiAgICAgICAgICBTU0xfQ1RYX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9jYWxsYmFjayhjdHgsIGNiKQogICAgICAgICAgU1NMX0NUWF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2tfYXJnKGN0eCwgYXJnKQoKICAgICB3aGVyZQoKICAgICAgICAgIGludCAoKmNiKShTU0wgKiwgdm9pZCAqcGVlcmlucHV0LCBzaXplX3QgbGVuLCB2b2lkICphcmcpOwogICAgICAgICAgdm9pZCAqYXJnOwoKICAgICBDYWxsYmFjayBmdW5jdGlvbiAnY2InIHdpbGwgYmUgY2FsbGVkIGluIGhhbmRzaGFrZXMsIGFuZCBpcwogICAgIGV4cGVjdGVkIHRvIHVzZSBTU0xfc2V0X3Rsc2V4dF9vcGFxdWVfcHJmX2lucHV0KCkgYXMgYXBwcm9wcmlhdGUuCiAgICAgQXJndW1lbnQgJ2FyZycgaXMgZm9yIGFwcGxpY2F0aW9uIHB1cnBvc2VzICh0aGUgdmFsdWUgYXMgZ2l2ZW4gdG8KICAgICBTU0xfQ1RYX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9jYWxsYmFja19hcmcoKSB3aWxsIGRpcmVjdGx5CiAgICAgYmUgcHJvdmlkZWQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uKS4gIFRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgIGhhcyB0byByZXR1cm4gbm9uLXplcm8gdG8gcmVwb3J0IHN1Y2Nlc3M6IHVzdWFsbHkgMSB0byB1c2Ugb3BhcXVlCiAgICAgUFJGIGlucHV0IGp1c3QgaWYgcG9zc2libGUsIG9yIDIgdG8gZW5mb3JjZSB1c2Ugb2YgdGhlIG9wYXF1ZSBQUkYKICAgICBpbnB1dC4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIGxpYnJhcnkgd2lsbCBhYm9ydCB0aGUgaGFuZHNoYWtlCiAgICAgaWYgb3BhcXVlIFBSRiBpbnB1dCBpcyBub3Qgc3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZWQuCgogICAgIEFyZ3VtZW50cyAncGVlcmlucHV0JyBhbmQgJ2xlbicgZ2l2ZW4gdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgd2lsbCBhbHdheXMgYmUgTlVMTCBhbmQgMCBpbiB0aGUgY2FzZSBvZiBhIGNsaWVudC4gIEEgc2VydmVyIHdpbGwKICAgICBzZWUgdGhlIGNsaWVudCdzIG9wYXF1ZSBQUkYgaW5wdXQgdGhyb3VnaCB0aGVzZSB2YXJpYWJsZXMgaWYKICAgICBhdmFpbGFibGUgKE5VTEwgYW5kIDAgb3RoZXJ3aXNlKS4gIE5vdGUgdGhhdCBpZiB0aGUgc2VydmVyCiAgICAgcHJvdmlkZXMgYW4gb3BhcXVlIFBSRiBpbnB1dCwgdGhlIGxlbmd0aCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZQogICAgIGxlbmd0aCBvZiB0aGUgY2xpZW50J3Mgb3BhcXVlIFBSRiBpbnB1dC4KCiAgICAgTm90ZSB0aGF0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdoZW4gY3JlYXRpbmcKICAgICBhIG5ldyBzZXNzaW9uIChzZXNzaW9uIHJlc3VtcHRpb24gY2FuIHJlc3VtZSB3aGF0ZXZlciB3YXMKICAgICBwcmV2aW91c2x5IG5lZ290aWF0ZWQpLCBhbmQgd2lsbCBub3QgYmUgY2FsbGVkIGluIFNTTCAyLjAKICAgICBoYW5kc2hha2VzOyB0aHVzLCBTU0xfQ1RYX3NldF9vcHRpb25zKGN0eCwgU1NMX09QX05PX1NTTHYyKSBvcgogICAgIFNTTF9zZXRfb3B0aW9ucyhzc2wsIFNTTF9PUF9OT19TU0x2MikgaXMgZXNwZWNpYWxseSByZWNvbW1lbmRlZAogICAgIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGVuZm9yY2Ugb3BhcXVlIFBSRiBpbnB1dC4KCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXBkYXRlIHNzbCBjb2RlIHRvIHN1cHBvcnQgZGlnZXN0cyBvdGhlciB0aGFuIFNIQTErTUQ1IGZvciBoYW5kc2hha2UKICAgICBNQUMuIAoKICAgICBbVmljdG9yIEIuIFdhZ25lciA8dml0dXNAY3J5cHRvY29tLnJ1Pl0KCiAgKikgQWRkIFJGQzQ1MDcgc3VwcG9ydCB0byBPcGVuU1NMLiBUaGlzIGluY2x1ZGVzIHRoZSBjb3JyZWN0aW9ucyBpbgogICAgIFJGQzQ1MDdiaXMuIFRoZSBlbmNyeXB0ZWQgdGlja2V0IGZvcm1hdCBpcyBhbiBlbmNyeXB0ZWQgZW5jb2RlZAogICAgIFNTTF9TRVNTSU9OIHN0cnVjdHVyZSwgdGhhdCB3YXkgbmV3IHNlc3Npb24gZmVhdHVyZXMgYXJlIGF1dG9tYXRpY2FsbHkKICAgICBzdXBwb3J0ZWQuCgogICAgIElmIGEgY2xpZW50IGFwcGxpY2F0aW9uIGNhY2hlcyBzZXNzaW9uIGluIGFuIFNTTF9TRVNTSU9OIHN0cnVjdHVyZQogICAgIHN1cHBvcnQgaXMgdHJhbnNwYXJlbnQgYmVjYXVzZSB0aWNrZXRzIGFyZSBub3cgc3RvcmVkIGluIHRoZSBlbmNvZGVkCiAgICAgU1NMX1NFU1NJT04uCiAgICAgCiAgICAgVGhlIFNTTF9DVFggc3RydWN0dXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGtleXMgZm9yIHRpY2tldAogICAgIHByb3RlY3Rpb24gaW4gc2VydmVycyBzbyBhZ2FpbiBzdXBwb3J0IHNob3VsZCBiZSBwb3NzaWJsZQogICAgIHdpdGggbm8gYXBwbGljYXRpb24gbW9kaWZpY2F0aW9uLgoKICAgICBJZiBhIGNsaWVudCBvciBzZXJ2ZXIgd2lzaGVzIHRvIGRpc2FibGUgUkZDNDUwNyBzdXBwb3J0IHRoZW4gdGhlIG9wdGlvbgogICAgIFNTTF9PUF9OT19USUNLRVQgY2FuIGJlIHNldC4KCiAgICAgQWRkIGEgVExTIGV4dGVuc2lvbiBkZWJ1Z2dpbmcgY2FsbGJhY2sgdG8gYWxsb3cgdGhlIGNvbnRlbnRzIG9mIGFueSBjbGllbnQKICAgICBvciBzZXJ2ZXIgZXh0ZW5zaW9ucyB0byBiZSBleGFtaW5lZC4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpbmFsIGNoYW5nZXMgdG8gYXZvaWQgdXNlIG9mIHBvaW50ZXIgcG9pbnRlciBjYXN0cyBpbiBPcGVuU1NMLgogICAgIE9wZW5TU0wgc2hvdWxkIG5vdyBjb21waWxlIGNsZWFubHkgb24gZ2NjIDQuMgogICAgIFtQZXRlciBIYXJ0bGV5IDxwZGhAdXR0ZXIuY2hhb3Mub3JnLnVrPiwgU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgU1NMIGxpYnJhcnkgdG8gdXNlIG5ldyBFVlBfUEtFWSBNQUMgQVBJLiBJbmNsdWRlIGdlbmVyaWMgTUFDCiAgICAgc3VwcG9ydCBpbmNsdWRpbmcgc3RyZWFtaW5nIE1BQyBzdXBwb3J0OiB0aGlzIGlzIHJlcXVpcmVkIGZvciBHT1NUCiAgICAgY2lwaGVyc3VpdGUgc3VwcG9ydC4KICAgICBbVmljdG9yIEIuIFdhZ25lciA8dml0dXNAY3J5cHRvY29tLnJ1PiwgU3RldmUgSGVuc29uXQoKICAqKSBBZGQgb3B0aW9uIC1zdHJlYW0gdG8gdXNlIFBLQ1MjNyBzdHJlYW1pbmcgaW4gc21pbWUgdXRpbGl0eS4gTmV3CiAgICAgZnVuY3Rpb24gaTJkX1BLQ1M3X2Jpb19zdHJlYW0oKSBhbmQgUEVNX3dyaXRlX1BLQ1M3X2Jpb19zdHJlYW0oKQogICAgIHRvIG91dHB1dCBpbiBCRVIgYW5kIFBFTSBmb3JtYXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIHVzZSBvZiBITUFDIHZpYSBFVlBfUEtFWSBpbnRlcmZhY2UuIFRoaXMKICAgICBhbGxvd3MgSE1BQyB0byBiZSBoYW5kbGVkIHZpYSB0aGUgRVZQX0RpZ2VzdFNpZ24qKCkgaW50ZXJmYWNlLiBUaGUKICAgICBFVlBfUEtFWSAia2V5IiBpbiB0aGlzIGNhc2UgaXMgdGhlIEhNQUMga2V5LCBwb3RlbnRpYWxseSBhbGxvd2luZwogICAgIEVOR0lORSBzdXBwb3J0IGZvciBITUFDIGtleXMgd2hpY2ggYXJlIHVuZXh0cmFjdGFibGUuIE5ldyAtbWFjIGFuZAogICAgIC1tYWNvcHQgb3B0aW9ucyB0byBkZ3N0IHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbiAtc2lnb3B0IHRvIGRnc3QgdXRpbGl0eS4gVXBkYXRlIGRnc3QgdG8gdXNlCiAgICAgRVZQX0RpZ2VzdHtTaWduLFZlcmlmeX0qLiBUaGVzZSB0d28gY2hhbmdlcyBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZQogICAgIGFsdGVybmF0aXZlIHNpZ25pbmcgcGFyYW1hdGVycyBzdWNoIGFzIFg5LjMxIG9yIFBTUyBpbiB0aGUgZGdzdCAKICAgICB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBzc2xfY2lwaGVyX2FwcGx5X3J1bGUoKSwgdGhlIGludGVybmFsIGZ1bmN0aW9uIHRoYXQgZG9lcwogICAgIHRoZSB3b3JrIGVhY2ggdGltZSBhIGNpcGhlcnN1aXRlIHN0cmluZyByZXF1ZXN0cyBlbmFibGluZwogICAgICgiZm9vK2JhciIpLCBtb3ZpbmcgKCIrZm9vK2JhciIpLCBkaXNhYmxpbmcgKCItZm9vK2JhciIsIG9yCiAgICAgcmVtb3ZpbmcgKCIhZm9vK2JhciIpIGEgY2xhc3Mgb2YgY2lwaGVyc3VpdGVzOiBOb3cgaXQgbWFpbnRhaW5zCiAgICAgdGhlIG9yZGVyIG9mIGRpc2FibGVkIGNpcGhlcnN1aXRlcyBzdWNoIHRoYXQgdGhvc2UgY2lwaGVyc3VpdGVzCiAgICAgdGhhdCBtb3N0IHJlY2VudGx5IHdlbnQgZnJvbSBlbmFibGVkIHRvIGRpc2FibGVkIG5vdCBvbmx5IHN0YXkKICAgICBpbiBvcmRlciB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlciwgYnV0IGFsc28gaGF2ZSBoaWdoZXIgcHJpb3JpdHkKICAgICB0aGFuIG90aGVyIGRpc2FibGVkIGNpcGhlcnN1aXRlcyB0aGUgbmV4dCB0aW1lIGNpcGhlcnN1aXRlcyBhcmUKICAgICBlbmFibGVkIGFnYWluLgoKICAgICBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiBub3cgc2F5LCBlLmcuLCAiUFNLOi1QU0s6SElHSCIgdG8gZW5hYmxlCiAgICAgdGhlIHNhbWUgY2lwaGVyc3VpdGVzIGFzIHdpdGggIkhJR0giIGFsb25lLCBidXQgaW4gYSBzcGVjaWZpYwogICAgIG9yZGVyIHdoZXJlIHRoZSBQU0sgY2lwaGVyc3VpdGVzIGNvbWUgZmlyc3QgKHNpbmNlIHRoZXkgYXJlIHRoZQogICAgIG1vc3QgcmVjZW50bHkgZGlzYWJsZWQgY2lwaGVyc3VpdGVzIHdoZW4gIkhJR0giIGlzIHBhcnNlZCkuCgogICAgIEFsc28sIGNoYW5nZSBzc2xfY3JlYXRlX2NpcGhlcl9saXN0KCkgKHVzaW5nIHRoaXMgbmV3CiAgICAgZnVuY2lvbmFsaXR5KSBzdWNoIHRoYXQgYmV0d2VlbiBvdGhlcndpc2UgaWRlbnRpY2FsCiAgICAgY2locGVyc3VpdGVzLCBlcGhlbWVyYWwgRUNESCBpcyBwcmVmZXJyZWQgb3ZlciBlcGhlbWVyYWwgREggaW4KICAgICB0aGUgZGVmYXVsdCBvcmRlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2Ugc3NsX2NyZWF0ZV9jaXBoZXJfbGlzdCgpIHNvIHRoYXQgaXQgYXV0b21hdGljYWxseQogICAgIGFycmFuZ2VzIHRoZSBjaXBoZXJzdWl0ZXMgaW4gcmVhc29uYWJsZSBvcmRlciBiZWZvcmUgc3RhcnRpbmcKICAgICB0byBwcm9jZXNzIHRoZSBydWxlIHN0cmluZy4gIFRodXMsIHRoZSBkZWZpbml0aW9uIGZvciAiREVGQVVMVCIKICAgICAoU1NMX0RFRkFVTFRfQ0lQSEVSX0xJU1QpIG5vdyBpcyBqdXN0ICJBTEw6IWFOVUxMOiFlTlVMTCIsIGJ1dAogICAgIHJlbWFpbnMgZXF1aXZhbGVudCB0byAiQUVTOkFMTDohYU5VTEw6IWVOVUxMOithRUNESDora1JTQTorUkM0OkBTVFJFTkdUSCIuCiAgICAgVGhpcyBtYWtlcyBpdCBtdWNoIGVhc2llciB0byBhcnJpdmUgYXQgYSByZWFzb25hYmxlIGRlZmF1bHQgb3JkZXIKICAgICBpbiBhcHBsaWNhdGlvbnMgZm9yIHdoaWNoIGFub255bW91cyBjaXBoZXJzIGFyZSBPSyAobWVhbmluZwogICAgIHRoYXQgeW91IGNhbid0IGFjdHVhbGx5IHVzZSBERUZBVUxUKS4KICAgICBbQm9kbyBNb2VsbGVyOyBzdWdnZXN0ZWQgYnkgVmljdG9yIER1Y2hvdm5pXQoKICAqKSBTcGxpdCB0aGUgU1NML1RMUyBhbGdvcml0aG0gbWFzayAoYXMgdXNlZCBmb3IgY2lwaGVyc3VpdGUgc3RyaW5nCiAgICAgcHJvY2Vzc2luZykgaW50byBtdWx0aXBsZSBpbnRlZ2VycyBpbnN0ZWFkIG9mIHNldHRpbmcKICAgICAiU1NMX01LRVlfTUFTSyIgYml0cywgIlNTTF9BVVRIX01BU0siIGJpdHMsICJTU0xfRU5DX01BU0siLAogICAgICJTU0xfTUFDX01BU0siLCBhbmQgIlNTTF9TU0xfTUFTSyIgYml0cyBhbGwgaW4gYSBzaW5nbGUgaW50ZWdlci4KICAgICAoVGhlc2UgbWFza3MgYXMgd2VsbCBhcyB0aGUgaW5kaXZpZHVhbCBiaXQgZGVmaW5pdGlvbnMgYXJlIGhpZGRlbgogICAgIGF3YXkgaW50byB0aGUgbm9uLWV4cG9ydGVkIGludGVyZmFjZSBzc2wvc3NsX2xvY2wuaCwgc28gdGhpcwogICAgIGNoYW5nZSB0byB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgU1NMX0NJUEhFUiBzdHJ1Y3R1cmUgc2hvdWxkbid0CiAgICAgYWZmZWN0IGFwcGxpY2F0aW9ucy4pICBUaGlzIGdpdmUgdXMgbW9yZSBiaXRzIGZvciBlYWNoIG9mIHRoZXNlCiAgICAgY2F0ZWdvcmllcywgc28gdGhlcmUgaXMgbm8gbG9uZ2VyIGEgbmVlZCB0byBjb2FndWxhdGUgQUVTMTI4IGFuZAogICAgIEFFUzI1NiBpbnRvIGEgc2luZ2xlIGFsZ29yaXRobSBiaXQsIGFuZCB0byBjb2FndWxhdGUgQ2FtZWxsaWExMjgKICAgICBhbmQgQ2FtZWxsaWEyNTYgaW50byBhIHNpbmdsZSBhbGdvcml0aG0gYml0LCB3aGljaCBoYXMgbGVkIHRvIGFsbAogICAgIGtpbmRzIG9mIGtsdWRnZXMuCgogICAgIFRodXMsIGFtb25nIG90aGVyIHRoaW5ncywgdGhlIGtsdWRnZSBpbnRyb2R1Y2VkIGluIDAuOS43bSBhbmQKICAgICAwLjkuOGUgZm9yIG1hc2tpbmcgb3V0IEFFUzI1NiBpbmRlcGVuZGVudGx5IG9mIEFFUzEyOCBvciBtYXNraW5nCiAgICAgb3V0IENhbWVsbGlhMjU2IGluZGVwZW5kZW50bHkgb2YgQUVTMjU2IGlzIG5vdCBuZWVkZWQgaGVyZSBpbiAwLjkuOS4KCiAgICAgV2l0aCB0aGUgY2hhbmdlLCB3ZSBhbHNvIGludHJvZHVjZSBuZXcgY2lwaGVyc3VpdGUgYWxpYXNlcyB0aGF0CiAgICAgc28gZmFyIHdlcmUgbWlzc2luZzogIkFFUzEyOCIsICJBRVMyNTYiLCAiQ0FNRUxMSUExMjgiLCBhbmQKICAgICAiQ0FNRUxMSUEyNTYiLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciBkc2Etd2l0aC1TSEEyMjQgYW5kIGRzYS13aXRoLVNIQTI1Ni4KICAgICBVc2UgdGhlIGxlZnRtb3N0IE4gYnl0ZXMgb2YgdGhlIHNpZ25hdHVyZSBpbnB1dCBpZiB0aGUgaW5wdXQgaXMKICAgICBsYXJnZXIgdGhhbiB0aGUgcHJpbWUgcSAod2l0aCBOIGJlaW5nIHRoZSBzaXplIGluIGJ5dGVzIG9mIHEpLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgVmVyeSAqdmVyeSogZXhwZXJpbWVudGFsIFBLQ1MjNyBzdHJlYW1pbmcgZW5jb2RlciBzdXBwb3J0LiBOb3RoaW5nIHVzZXMKICAgICBpdCB5ZXQgYW5kIGl0IGlzIGxhcmdlbHkgdW50ZXN0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHRoZSBlY2RzYS13aXRoLVNIQTIyNC8yNTYvMzg0LzUxMiBzaWduYXR1cmUgdHlwZXMuCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBJbml0aWFsIGluY29tcGxldGUgY2hhbmdlcyB0byBhdm9pZCBuZWVkIGZvciBmdW5jdGlvbiBjYXN0cyBpbiBPcGVuU1NMCiAgICAgc29tZSBjb21waWxlcnMgKGdjYyA0LjIgYW5kIGxhdGVyKSByZWplY3QgdGhlaXIgdXNlLiBTYWZlc3RhY2sgaXMKICAgICByZWltcGxlbWVudGVkLiAgVXBkYXRlIEFTTjEgdG8gYXZvaWQgdXNlIG9mIGxlZ2FjeSBmdW5jdGlvbnMuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFdpbjMyLzY0IHRhcmdldHMgYXJlIGxpbmtlZCB3aXRoIFdpbnNvY2syLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgYW4gWDUwOV9DUkxfTUVUSE9EIHN0cnVjdHVyZSB0byBhbGxvdyBDUkwgcHJvY2Vzc2luZyB0byBiZSByZWRpcmVjdGVkCiAgICAgdG8gZXh0ZXJuYWwgZnVuY3Rpb25zLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGluY3JlYXNlIENSTCBoYW5kbGluZyAKICAgICBlZmZpY2llbmN5IGVzcGVjaWFsbHkgd2hlbiBDUkxzIGFyZSB2ZXJ5IGxhcmdlIGJ5IChmb3IgZXhhbXBsZSkgc3RvcmluZwogICAgIHRoZSBDUkwgcmV2b2tlZCBjZXJ0aWZpY2F0ZXMgaW4gYSBkYXRhYmFzZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBPdmVyaGF1bCBvZiBieV9kaXIgY29kZS4gQWRkIHN1cHBvcnQgZm9yIGR5bmFtaWMgbG9hZGluZyBvZiBDUkxzIHNvCiAgICAgbmV3IENSTHMgYWRkZWQgdG8gYSBkaXJlY3RvcnkgY2FuIGJlIHVzZWQuIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uCiAgICAgLXZlcmlmeV9yZXR1cm5fZXJyb3IgdG8gc19jbGllbnQgYW5kIHNfc2VydmVyLiBUaGlzIGNhdXNlcyByZWFsIGVycm9ycwogICAgIHRvIGJlIHJldHVybmVkIGJ5IHRoZSB2ZXJpZnkgY2FsbGJhY2sgaW5zdGVhZCBvZiBjYXJyeWluZyBvbiBubyBtYXR0ZXIKICAgICB3aGF0LiBUaGlzIHJlZmxlY3RzIHRoZSB3YXkgYSAicmVhbCB3b3JsZCIgdmVyaWZ5IGNhbGxiYWNrIHdvdWxkIGJlaGF2ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBHT1NUIGVuZ2luZSwgc3VwcG9ydGluZyBzZXZlcmFsIEdPU1QgYWxnb3JpdGhtcyBhbmQgcHVibGljIGtleSBmb3JtYXRzLgogICAgIEtpbmRseSBkb25hdGVkIGJ5IENyeXB0b2NvbS4KICAgICBbQ3J5cHRvY29tXQoKICAqKSBQYXJ0aWFsIHN1cHBvcnQgZm9yIElzc3VpbmcgRGlzdHJpYnV0aW9uIFBvaW50IENSTCBleHRlbnNpb24uIENSTHMKICAgICBwYXJ0aXRpb25lZCBieSBEUCBhcmUgaGFuZGxlZCBidXQgbm8gaW5kaXJlY3QgQ1JMIG9yIHJlYXNvbiBwYXJ0aXRpb25pbmcKICAgICAoeWV0KS4gQ29tcGxldGUgb3ZlcmhhdWwgb2YgQ1JMIGhhbmRsaW5nOiBub3cgdGhlIG1vc3Qgc3VpdGFibGUgQ1JMIGlzCiAgICAgc2VsZWN0ZWQgdmlhIGEgc2NvcmluZyB0ZWNobmlxdWUgd2hpY2ggaGFuZGxlcyBJRFAgYW5kIEFLSUQgaW4gQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgWDUwOV9TVE9SRV9DVFggY2FsbGJhY2tzIGxvb2t1cF9jcmxzKCkgYW5kIGxvb2t1cF9jZXJ0cygpIHdoaWNoCiAgICAgd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgZm9yIGFsbCB2ZXJpZnkgb3BlcmF0aW9uczogdGhpcyB3aWxsIHJlbW92ZSB0aGUKICAgICBYNTA5X1NUT1JFIGRlcGVuZGVuY3kgb24gY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGFuZCBhbGxvdyBhbHRlcm5hdGl2ZQogICAgIGxvb2t1cCBtZXRob2RzLiAgWDUwOV9TVE9SRSBiYXNlZCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlc2UgdHdvIGNhbGxiYWNrcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBtdWx0aXBsZSBDUkxzIHRvIGV4aXN0IGluIGFuIFg1MDlfU1RPUkUgd2l0aCBtYXRjaGluZyBpc3N1ZXIgbmFtZXMuCiAgICAgTW9kaWZ5IGdldF9jcmwoKSB0byBmaW5kIGEgdmFsaWQgKHVuZXhwaXJlZCkgQ1JMIGlmIHBvc3NpYmxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X0NSTF9tYXRjaCgpIHRvIGNoZWNrIGlmIHR3byBDUkxzIGFyZSBpZGVudGljYWwuIE5vcm1hbGx5CiAgICAgdGhpcyB3b3VsZCBiZSBjYWxsZWQgWDUwOV9DUkxfY21wKCkgYnV0IHRoYXQgbmFtZSBpcyBhbHJlYWR5IHVzZWQgYnkKICAgICBhIGZ1bmN0aW9uIHRoYXQganVzdCBjb21wYXJlcyBDUkwgaXNzdWVyIG5hbWVzLiBDYWNoZSBzZXZlcmFsIENSTCAKICAgICBleHRlbnNpb25zIGluIFg1MDlfQ1JMIHN0cnVjdHVyZSBhbmQgY2FjaGUgQ1JMRFAgaW4gWDUwOS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdG9yZSBhICJjYW5vbmljYWwiIHJlcHJlc2VudGF0aW9uIG9mIFg1MDlfTkFNRSBzdHJ1Y3R1cmUgKEFTTjEgTmFtZSkKICAgICB0aGlzIG1hcHMgZXF1aXZhbGVudCBYNTA5X05BTUUgc3RydWN0dXJlcyBpbnRvIGEgY29uc2lzdGVudCBzdHJ1Y3R1cmUuCiAgICAgTmFtZSBjb21wYXJpc29uIGNhbiB0aGVuIGJlIHBlcmZvcm1lZCByYXBpZGx5IHVzaW5nIG1lbWNtcCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5vbi1ibG9ja2luZyBPQ1NQIHJlcXVlc3QgcHJvY2Vzc2luZy4gQWRkIC10aW1lb3V0IG9wdGlvbiB0byBvY3NwIAogICAgIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgZGlnZXN0cyB0byBzdXBwbHkgdGhlaXIgb3duIG1pY2FsZyBzdHJpbmcgZm9yIFMvTUlNRSB0eXBlIHVzaW5nCiAgICAgdGhlIGN0cmwgRVZQX01EX0NUUkxfTUlDQUxHLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIER1cmluZyBQS0NTNyBzaWduaW5nIHBhc3MgdGhlIFBLQ1M3IFNpZ25lckluZm8gc3RydWN0dXJlIHRvIHRoZQogICAgIEVWUF9QS0VZX01FVEhPRCBiZWZvcmUgYW5kIGFmdGVyIHNpZ25pbmcgdmlhIHRoZSBFVlBfUEtFWV9DVFJMX1BLQ1M3X1NJR04KICAgICBjdHJsLiBJdCBjYW4gdGhlbiBjdXN0b21pc2UgdGhlIHN0cnVjdHVyZSBiZWZvcmUgYW5kL29yIGFmdGVyIHNpZ25pbmcKICAgICBpZiBuZWNlc3NhcnkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9CSl9hZGRfc2lnaWQoKSB0byBhbGxvdyBhcHBsaWNhdGlvbiBkZWZpbmVkIHNpZ25hdHVyZSBPSURzCiAgICAgdG8gYmUgYWRkZWQgdG8gT3BlblNTTHMgaW50ZXJuYWwgdGFibGVzLiBOZXcgZnVuY3Rpb24gT0JKX3NpZ2lkX2ZyZWUoKQogICAgIHRvIGZyZWUgdXAgYW55IGFkZGVkIHNpZ25hdHVyZSBPSURzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgRVZQX0NJUEhFUl9kb19hbGwoKSwgRVZQX0NJUEhFUl9kb19hbGxfc29ydGVkKCksCiAgICAgRVZQX01EX2RvX2FsbCgpIGFuZCBFVlBfTURfZG9fYWxsX3NvcnRlZCgpIHRvIGVudW1lcmF0ZSBpbnRlcm5hbAogICAgIGRpZ2VzdCBhbmQgY2lwaGVyIHRhYmxlcy4gTmV3IG9wdGlvbnMgYWRkZWQgdG8gb3BlbnNzbCB1dGlsaXR5OgogICAgIGxpc3QtbWVzc2FnZS1kaWdlc3QtYWxnb3JpdGhtcyBhbmQgbGlzdC1jaXBoZXItYWxnb3JpdGhtcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIGJpbmFyeSBwb2x5bm9taWFsczogdGhlIGxpc3QKICAgICBvZiBkZWdyZWVzIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpcyBub3cgdGVybWluYXRlZCB3aXRoIC0xLgogICAgIFByZXZpb3VzbHkgaXQgd2FzIHRlcm1pbmF0ZWQgd2l0aCAwLCB3aGljaCB3YXMgYWxzbyBwYXJ0IG9mIHRoZQogICAgIHZhbHVlOyB0aHVzLCB0aGUgYXJyYXkgcmVwcmVzZW50YXRpb24gd2FzIG5vdCBhcHBsaWNhYmxlIHRvCiAgICAgcG9seW5vbWlhbHMgd2hlcmUgdF4wIGhhcyBjb2VmZmljaWVudCB6ZXJvLiAgVGhpcyBjaGFuZ2UgbWFrZXMKICAgICB0aGUgYXJyYXkgcmVwcmVzZW50YXRpb24gdXNlZnVsIGluIGEgbW9yZSBnZW5lcmFsIGNvbnRleHQuCiAgICAgW0RvdWdsYXMgU3RlYmlsYV0KCiAgKikgVmFyaW91cyBtb2RpZmljYXRpb25zIGFuZCBmaXhlcyB0byBTU0wvVExTIGNpcGhlciBzdHJpbmcKICAgICBoYW5kbGluZy4gIEZvciBFQ0MsIHRoZSBjb2RlIG5vdyBkaXN0aW5ndWlzaGVzIGJldHdlZW4gZml4ZWQgRUNESAogICAgIHdpdGggUlNBIGNlcnRpZmljYXRlcyBvbiB0aGUgb25lIGhhbmQgYW5kIHdpdGggRUNEU0EgY2VydGlmaWNhdGVzCiAgICAgb24gdGhlIG90aGVyIGhhbmQsIHNpbmNlIHRoZXNlIGFyZSBzZXBhcmF0ZSBjaXBoZXJzdWl0ZXMuICBUaGUKICAgICB1bnVzZWQgY29kZSBmb3IgRm9ydGV6emEgY2lwaGVyc3VpdGVzIGhhcyBiZWVuIHJlbW92ZWQuCgogICAgIEZvciBjb25zaXN0ZW5jeSB3aXRoIEVESCwgZXBoZW1lcmFsIEVDREggaXMgbm93IGNhbGxlZCAiRUVDREgiCiAgICAgKG5vdCAiRUNESEUiKS4gIEZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBjb2RlIGZvciBESAogICAgIGNlcnRpZmljYXRlcywgdXNlIG9mIEVDREggY2VydGlmaWNhdGVzIGlzIG5vdyBjb25zaWRlcmVkIEVDREgKICAgICBhdXRoZW50aWNhdGlvbiwgbm90IFJTQSBvciBFQ0RTQSBhdXRoZW50aWNhdGlvbiAodGhlIGxhdHRlciBpcwogICAgIG1lcmVseSB0aGUgQ0EncyBzaWduaW5nIGFsZ29yaXRobSBhbmQgbm90IGFjdGl2ZWx5IHVzZWQgaW4gdGhlCiAgICAgcHJvdG9jb2wpLgoKICAgICBUaGUgdGVtcG9yYXJ5IGNpcGhlcnN1aXRlIGFsaWFzICJFQ0NkcmFmdCIgaXMgbm8gbG9uZ2VyCiAgICAgYXZhaWxhYmxlLCBhbmQgRUNDIGNpcGhlcnN1aXRlcyBhcmUgbm8gbG9uZ2VyIGV4Y2x1ZGVkIGZyb20gIkFMTCIKICAgICBhbmQgIkRFRkFVTFQiLiAgVGhlIGZvbGxvd2luZyBhbGlhc2VzIG5vdyBleGlzdCBmb3IgUkZDIDQ0OTIKICAgICBjaXBoZXJzdWl0ZXMsIG1vc3Qgb2YgdGhlc2UgYnkgYW5hbG9neSB3aXRoIHRoZSBESCBjYXNlOgoKICAgICAgICAga0VDREhyICAgLSBFQ0RIIGNlcnQsIHNpZ25lZCB3aXRoIFJTQQogICAgICAgICBrRUNESGUgICAtIEVDREggY2VydCwgc2lnbmVkIHdpdGggRUNEU0EKICAgICAgICAga0VDREggICAgLSBFQ0RIIGNlcnQgKHNpZ25lZCB3aXRoIGVpdGhlciBSU0Egb3IgRUNEU0EpCiAgICAgICAgIGtFRUNESCAgIC0gZXBoZW1lcmFsIEVDREgKICAgICAgICAgRUNESCAgICAgLSBFQ0RIIGNlcnQgb3IgZXBoZW1lcmFsIEVDREgKCiAgICAgICAgIGFFQ0RIICAgIC0gRUNESCBjZXJ0CiAgICAgICAgIGFFQ0RTQSAgIC0gRUNEU0EgY2VydAogICAgICAgICBFQ0RTQSAgICAtIEVDRFNBIGNlcnQKCiAgICAgICAgIEFFQ0RIICAgIC0gYW5vbnltb3VzIEVDREgKICAgICAgICAgRUVDREggICAgLSBub24tYW5vbnltb3VzIGVwaGVtZXJhbCBFQ0RIIChlcXVpdmFsZW50IHRvICJrRUVDREg6LUFFQ0RIIikKCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGFkZGl0aW9uYWwgUy9NSU1FIGNhcGFiaWxpdGllcyBmb3IgQUVTIGFuZCBHT1NUIGNpcGhlcnMgaWYgc3VwcG9ydGVkLgogICAgIFVzZSBjb3JyZWN0IG1pY2FsZyBwYXJhbWV0ZXJzIGRlcGVuZGluZyBvbiBkaWdlc3QocykgaW4gc2lnbmVkIG1lc3NhZ2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGVuZ2luZSBzdXBwb3J0IGZvciBFVlBfUEtFWV9BU04xX01FVEhPRC4gQWRkIGZ1bmN0aW9ucyB0byBwcm9jZXNzCiAgICAgYW4gRU5HSU5FIGFzbjEgbWV0aG9kLiBTdXBwb3J0IEVOR0lORSBsb29rdXBzIGluIHRoZSBBU04xIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBlbmdpbmUgc3VwcG9ydCBmb3IgRVZQX1BLRVlfTUVUSE9ELiBOZXcgZnVuY3Rpb25zIHRvIHBlcm1pdAogICAgIGFuIGVuZ2luZSB0byByZWdpc3RlciBhIG1ldGhvZC4gQWRkIEVOR0lORSBsb29rdXBzIGZvciBtZXRob2RzIGFuZAogICAgIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIHByb2Nlc3NpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBFVlBfRGlnZXN0e1NpZ24sVmVyaWZ5KSouIFRoZXNlIGFyZSBlbmNoYW5jZSB2ZXJzaW9ucyBvZgogICAgIEVWUF97U2lnbixWZXJpZnl9KiB3aGljaCBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBjdXN0b21pc2UgdGhlIHNpZ25hdHVyZQogICAgIHByb2Nlc3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IC1yZXNpZ24gb3B0aW9uIHRvIHNtaW1lIHV0aWxpdHkuIFRoaXMgYWRkcyBvbmUgb3IgbW9yZSBzaWduZXJzCiAgICAgdG8gYW4gZXhpc3RpbmcgUEtDUyM3IHNpZ25lZERhdGEgc3RydWN0dXJlLiBBbHNvIC1tZCBvcHRpb24gdG8gdXNlIGFuCiAgICAgYWx0ZXJuYXRpdmUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIGZvciBzaWduaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRpZHkgdXAgUEtDUyM3IHJvdXRpbmVzIGFuZCBhZGQgbmV3IGZ1bmN0aW9ucyB0byBtYWtlIGl0IGVhc2llciB0bwogICAgIGNyZWF0ZSBQS0NTNyBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgbXVsdGlwbGUgc2lnbmVycy4gVXBkYXRlIHNtaW1lCiAgICAgYXBwbGljYXRpb24gdG8gc3VwcG9ydCBtdWx0aXBsZSBzaWduZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAtbWFjYWxnIG9wdGlvbiB0byBwa2NzMTIgdXRpbGl0eSB0byBhbGxvdyBzZXR0aW5nIG9mIGFuIGFsdGVybmF0aXZlCiAgICAgZGlnZXN0IE1BQy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIFBLQ1MjNSB2Mi4wIFBSRnMgb3RoZXIgdGhhbiBkZWZhdWx0IFNIQTEgSE1BQy4KICAgICBSZW9yZ2FuaXplIFBCRSBpbnRlcm5hbHMgdG8gbG9va3VwIGZyb20gYSBzdGF0aWMgdGFibGUgdXNpbmcgTklEcywKICAgICBhZGQgc3VwcG9ydCBmb3IgSE1BQyBQQkUgT0lEIHRyYW5zbGF0aW9uLiBBZGQgYSBFVlBfQ0lQSEVSIGN0cmw6CiAgICAgRVZQX0NUUkxfUEJFX1BSRl9OSUQgdGhpcyBhbGxvd3MgYSBjaXBoZXIgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZQogICAgIFBSRiB3aGljaCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXNlZCB3aXRoIFBCRVMyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlcGxhY2UgdGhlIGFsZ29yaXRobSBzcGVjaWZpYyBjYWxscyB0byBnZW5lcmF0ZSBrZXlzIGluICJyZXEiIHdpdGggdGhlCiAgICAgbmV3IEFQSS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgUEtDUyM3IGVudmVsb3BlZCBkYXRhIHJvdXRpbmVzIHRvIHVzZSBuZXcgQVBJLiBUaGlzIGlzIG5vdwogICAgIHN1cHBvcnRlZCBieSBhbnkgcHVibGljIGtleSBtZXRob2Qgc3VwcG9ydGluZyB0aGUgZW5jcnlwdCBvcGVyYXRpb24uIEEKICAgICBjdHJsIGlzIGFkZGVkIHRvIGFsbG93IHRoZSBwdWJsaWMga2V5IGFsZ29yaXRobSB0byBleGFtaW5lIG9yIG1vZGlmeQogICAgIHRoZSBQS0NTIzcgUmVjaXBpZW50SW5mbyBzdHJ1Y3R1cmUgaWYgaXQgbmVlZHMgdG86IGZvciBSU0EgdGhpcyBpcwogICAgIGEgbm8gb3AuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgY3RybCB0byBhc24xIG1ldGhvZCB0byBhbGxvdyBhIHB1YmxpYyBrZXkgYWxnb3JpdGhtIHRvIGV4cHJlc3MKICAgICBhIGRlZmF1bHQgZGlnZXN0IHR5cGUgdG8gdXNlLiBJbiBtb3N0IGNhc2VzIHRoaXMgd2lsbCBiZSBTSEExIGJ1dCBzb21lCiAgICAgYWxnb3JpdGhtcyAoc3VjaCBhcyBHT1NUKSBuZWVkIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUgZGlnZXN0LiBUaGUKICAgICByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGhvdyBzdHJvbmcgdGhlIHByZWZlcmVuY2UgaXMgMSBtZWFucyBvcHRpb25hbCBhbmQKICAgICAyIGlzIG1hbmRhdG9yeSAodGhhdCBpcyBpdCBpcyB0aGUgb25seSBzdXBwb3J0ZWQgdHlwZSkuIE1vZGlmeQogICAgIEFTTjFfaXRlbV9zaWduKCkgdG8gYWNjZXB0IGEgTlVMTCBkaWdlc3QgYXJndW1lbnQgdG8gaW5kaWNhdGUgaXQgc2hvdWxkCiAgICAgdXNlIHRoZSBkZWZhdWx0IG1kLiBVcGRhdGUgb3BlbnNzbCB1dGlsaXRpZXMgdG8gdXNlIHRoZSBkZWZhdWx0IGRpZ2VzdAogICAgIHR5cGUgZm9yIHNpZ25pbmcgaWYgaXQgaXMgbm90IGV4cGxpY2l0bHkgaW5kaWNhdGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVzZSBPSUQgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIGluIEFTTjFfc2lnbigpIGFuZCBBU04xX3ZlcmlmeSgpLiBOZXcgCiAgICAgRVZQX01EIGZsYWcgRVZQX01EX0ZMQUdfUEtFWV9NRVRIT0RfU0lHTkFUVVJFLiBUaGlzIHVzZXMgdGhlIHJlbGV2YW50CiAgICAgc2lnbmluZyBtZXRob2QgZnJvbSB0aGUga2V5IHR5cGUuIFRoaXMgZWZmZWN0aXZlbHkgcmVtb3ZlcyB0aGUgbGluawogICAgIGJldHdlZW4gZGlnZXN0cyBhbmQgcHVibGljIGtleSB0eXBlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYW4gT0lEIGNyb3NzIHJlZmVyZW5jZSB0YWJsZSBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuIEl0cyBwdXJwb3NlIGlzIHRvCiAgICAgdHJhbnNsYXRlIGJldHdlZW4gc2lnbmF0dXJlIE9JRHMgc3VjaCBhcyBTSEExV2l0aHJzYUVuY3J5cHRpb24gYW5kIFNIQTEsCiAgICAgcnNhRW5jcnlwdGlvbi4gVGhpcyB3aWxsIGFsbG93IHNvbWUgb2YgdGhlIGFsZ29yaXRobSBzcGVjaWZpYyBoYWNrZXJ5CiAgICAgbmVlZGVkIHRvIHVzZSB0aGUgY29ycmVjdCBPSUQgdG8gYmUgcmVtb3ZlZC4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIGFsZ29yaXRobSBzcGVjaWZpYyBkZXBlbmRlbmNpZXMgd2hlbiBzZXR0aW5nIFBLQ1M3X1NJR05FUl9JTkZPCiAgICAgc3RydWN0dXJlcyBmb3IgUEtDUzdfc2lnbigpLiBUaGV5IGFyZSBub3cgc2V0IHVwIGJ5IHRoZSByZWxldmFudCBwdWJsaWMKICAgICBrZXkgQVNOMSBtZXRob2QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHByb3Zpc2lvbmFsIEVDIHBrZXkgbWV0aG9kIHdpdGggc3VwcG9ydCBmb3IgRUNEU0EgYW5kIEVDREguCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGtleSBkZXJpdmF0aW9uIChhZ3JlZW1lbnQpIGluIHRoZSBBUEksIERIIG1ldGhvZCBhbmQKICAgICBwa2V5dXRsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBEU0EgcGtleSBtZXRob2QgYW5kIERIIHBrZXkgbWV0aG9kcywgZXh0ZW5kIERIIEFTTjEgbWV0aG9kIHRvIHN1cHBvcnQKICAgICBwdWJsaWMgYW5kIHByaXZhdGUga2V5IGZvcm1hdHMuIEFzIGEgc2lkZSBlZmZlY3QgdGhlc2UgYWRkIGFkZGl0aW9uYWwgCiAgICAgY29tbWFuZCBsaW5lIGZ1bmN0aW9uYWxpdHkgbm90IHByZXZpb3VzbHkgYXZhaWxhYmxlOiBEU0Egc2lnbmF0dXJlcyBjYW4gYmUKICAgICBnZW5lcmF0ZWQgYW5kIHZlcmlmaWVkIHVzaW5nIHBrZXl1dGwgYW5kIERIIGtleSBzdXBwb3J0IGFuZCBnZW5lcmF0aW9uIGluCiAgICAgcGtleSwgZ2VucGtleS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCZU9TIHN1cHBvcnQuCiAgICAgW09saXZlciBUYXBwZSA8em9vZXlAaGlyc2Noa2FlZmVyLmRlPl0KCiAgKikgTmV3IG1ha2UgdGFyZ2V0ICJpbnN0YWxsX2h0bWxfZG9jcyIgaW5zdGFsbHMgSFRNTCByZW5kaXRpb25zIG9mIHRoZQogICAgIG1hbnVhbCBwYWdlcy4KICAgICBbT2xpdmVyIFRhcHBlIDx6b29leUBoaXJzY2hrYWVmZXIuZGU+XQoKICAqKSBOZXcgdXRpbGl0eSAiZ2VucGtleSIgdGhpcyBpcyBhbmFsb2dvdXMgdG8gImdlbnJzYSIgZXRjIGV4Y2VwdCBpdCBjYW4KICAgICBnZW5lcmF0ZSBrZXlzIGZvciBhbnkgYWxnb3JpdGhtLiBFeHRlbmQgYW5kIHVwZGF0ZSBFVlBfUEtFWV9NRVRIT0QgdG8KICAgICBzdXBwb3J0IGtleSBhbmQgcGFyYW1ldGVyIGdlbmVyYXRpb24gYW5kIGFkZCBpbml0aWFsIGtleSBnZW5lcmF0aW9uCiAgICAgZnVuY3Rpb25hbGl0eSBmb3IgUlNBLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdW5jdGlvbnMgZm9yIG1haW4gRVZQX1BLRVlfbWV0aG9kIG9wZXJhdGlvbnMuIFRoZSB1bmRvY3VtZW50ZWQKICAgICBmdW5jdGlvbnMgRVZQX1BLRVlfe2VuY3J5cHQsZGVjcnlwdH0gaGF2ZSBiZWVuIHJlbmFtZWQgdG8KICAgICBFVlBfUEtFWV97ZW5jcnlwdCxkZWNyeXB0fV9vbGQuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgZGVmaW5pdGlvbnMgZm9yIEVWUF9QS0VZX01FVEhPRC4gVGhpcyB3aWxsIGJlIGEgaGlnaCBsZXZlbCBwdWJsaWMKICAgICBrZXkgQVBJLCBkb2Vzbid0IGRvIG11Y2ggeWV0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBFVlBfUEtFWV9hc24xX2dldDBfaW5mbygpIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0CiAgICAgcHVibGljIGtleSBhbGdvcml0aG1zLiBOZXcgb3B0aW9uIHRvIG9wZW5zc2wgdXRpbGl0eToKICAgICAibGlzdC1wdWJsaWMta2V5LWFsZ29yaXRobXMiIHRvIHByaW50IG91dCBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCB0aGUgU3VwcG9ydGVkIEVsbGlwdGljIEN1cnZlcyBFeHRlbnNpb24gZm9yCiAgICAgRUNDIGNpcGhlcnN1aXRlcyBmcm9tIGRyYWZ0LWlldGYtdGxzLWVjYy0xMi50eHQuCiAgICAgW0RvdWdsYXMgU3RlYmlsYV0KCiAgKikgRG9uJ3QgZnJlZSB1cCBPSURzIGluIE9CSl9jbGVhbnVwKCkgaWYgdGhleSBhcmUgaW4gdXNlIGJ5IEVWUF9NRCBvcgogICAgIEVWUF9DSVBIRVIgc3RydWN0dXJlcyB0byBhdm9pZCBsYXRlciBwcm9ibGVtcyBpbiBFVlBfY2xlYW51cCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyB1dGlsaXRpZXMgcGtleSBhbmQgcGtleXBhcmFtLiBUaGVzZSBhcmUgc2ltaWxhciB0byBhbGdvcml0aG0gc3BlY2lmaWMKICAgICB1dGlsaXRpZXMgc3VjaCBhcyByc2EsIGRzYSwgZHNhcGFyYW0gZXRjIGV4Y2VwdCB0aGV5IHByb2Nlc3MgYW55IGtleQogICAgIHR5cGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVHJhbnNmZXIgcHVibGljIGtleSBwcmludGluZyByb3V0aW5lcyB0byBFVlBfUEtFWV9BU04xX01FVEhPRC4gTmV3IAogICAgIGZ1bmN0aW9ucyBFVlBfUEtFWV9wcmludF9wdWJsaWMoKSwgRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZSgpLAogICAgIEVWUF9QS0VZX3ByaW50X3BhcmFtKCkgdG8gcHJpbnQgcHVibGljIGtleSBkYXRhIGZyb20gYW4gRVZQX1BLRVkKICAgICBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBwbHVnZ2FibGUgcHVibGljIGtleSBBU04xLgogICAgIERlLXNwYWdoZXR0aWZ5IHRoZSBwdWJsaWMga2V5IEFTTjEgaGFuZGxpbmcuIE1vdmUgcHVibGljIGFuZCBwcml2YXRlCiAgICAga2V5IEFTTjEgaGFuZGxpbmcgdG8gYSBuZXcgRVZQX1BLRVlfQVNOMV9NRVRIT0Qgc3RydWN0dXJlLiBSZWxvY2F0ZQogICAgIGFsZ29yaXRobSBzcGVjaWZpYyBoYW5kbGluZyB0byBhIHNpbmdsZSBtb2R1bGUgd2l0aGluIHRoZSByZWxldmFudAogICAgIGFsZ29yaXRobSBkaXJlY3RvcnkuIEFkZCBmdW5jdGlvbnMgdG8gYWxsb3cgKG5lYXIpIG9wYXF1ZSBwcm9jZXNzaW5nCiAgICAgb2YgcHVibGljIGFuZCBwcml2YXRlIGtleSBzdHJ1Y3R1cmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCB0aGUgU3VwcG9ydGVkIFBvaW50IEZvcm1hdHMgRXh0ZW5zaW9uIGZvcgogICAgIEVDQyBjaXBoZXJzdWl0ZXMgZnJvbSBkcmFmdC1pZXRmLXRscy1lY2MtMTIudHh0LgogICAgIFtEb3VnbGFzIFN0ZWJpbGFdCgogICopIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIFJGQyA0Mjc5IFBTSyBUTFMgY2lwaGVyc3VpdGVzLiBBZGQgbWVtYmVycwogICAgIGZvciB0aGUgcHNrIGlkZW50aXR5IFtoaW50XSBhbmQgdGhlIHBzayBjYWxsYmFjayBmdW5jdGlvbnMgdG8gdGhlCiAgICAgU1NMX1NFU1NJT04sIFNTTCBhbmQgU1NMX0NUWCBzdHJ1Y3R1cmUuCiAgICAgCiAgICAgTmV3IGNpcGhlcnN1aXRlczoKICAgICAgICAgUFNLLVJDNC1TSEEsIFBTSy0zREVTLUVERS1DQkMtU0hBLCBQU0stQUVTMTI4LUNCQy1TSEEsCiAgICAgICAgIFBTSy1BRVMyNTYtQ0JDLVNIQQogCiAgICAgTmV3IGZ1bmN0aW9uczoKICAgICAgICAgU1NMX0NUWF91c2VfcHNrX2lkZW50aXR5X2hpbnQKICAgICAgICAgU1NMX2dldF9wc2tfaWRlbnRpdHlfaGludAogICAgICAgICBTU0xfZ2V0X3Bza19pZGVudGl0eQogICAgICAgICBTU0xfdXNlX3Bza19pZGVudGl0eV9oaW50CgogICAgIFtNaWthIEtvdXNhIGFuZCBQYXNpIEVyb25lbiBvZiBOb2tpYSBDb3Jwb3JhdGlvbl0KCiAgKikgQWRkIFJGQyAzMTYxIGNvbXBsaWFudCB0aW1lIHN0YW1wIHJlcXVlc3QgY3JlYXRpb24sIHJlc3BvbnNlIGdlbmVyYXRpb24KICAgICBhbmQgcmVzcG9uc2UgdmVyaWZpY2F0aW9uIGZ1bmN0aW9uYWxpdHkuCiAgICAgW1pvbHThbiBHbPN6aWsgPHpnbG96aWtAb3BlbnRzYS5vcmc+LCBUaGUgT3BlblRTQSBQcm9qZWN0XQoKICAqKSBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBUTFMgZXh0ZW5zaW9ucywgc3BlY2lmaWNhbGx5IGZvciB0aGUgc2VydmVyX25hbWUKICAgICBleHRlbnNpb24gc28gZmFyLiAgVGhlIFNTTF9TRVNTSU9OLCBTU0xfQ1RYLCBhbmQgU1NMIGRhdGEgc3RydWN0dXJlcyBub3cKICAgICBoYXZlIG5ldyBtZW1iZXJzIGZvciBhIGhvc3QgbmFtZS4gIFRoZSBTU0wgZGF0YSBzdHJ1Y3R1cmUgaGFzIGFuCiAgICAgYWRkaXRpb25hbCBtZW1iZXIgU1NMX0NUWCAqaW5pdGlhbF9jdHggc28gdGhhdCBuZXcgc2Vzc2lvbnMgY2FuIGJlCiAgICAgc3RvcmVkIGluIHRoYXQgY29udGV4dCB0byBhbGxvdyBmb3Igc2Vzc2lvbiByZXN1bXB0aW9uLCBldmVuIGFmdGVyIHRoZQogICAgIFNTTCBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIG5ldyBTU0xfQ1RYIGluIHJlYWN0aW9uIHRvIGEgY2xpZW50J3MKICAgICBzZXJ2ZXJfbmFtZSBleHRlbnNpb24uCgogICAgIE5ldyBmdW5jdGlvbnMgKHN1YmplY3QgdG8gY2hhbmdlKToKCiAgICAgICAgIFNTTF9nZXRfc2VydmVybmFtZSgpCiAgICAgICAgIFNTTF9nZXRfc2VydmVybmFtZV90eXBlKCkKICAgICAgICAgU1NMX3NldF9TU0xfQ1RYKCkKCiAgICAgTmV3IENUUkwgY29kZXMgYW5kIG1hY3JvcyAoc3ViamVjdCB0byBjaGFuZ2UpOgoKICAgICAgICAgU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0NCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2soKQogICAgICAgICBTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQVJHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9hcmcoKQogICAgICAgICBTU0xfQ1RSTF9TRVRfVExTRVhUX0hPU1ROQU1FICAgICAgICAgICAtIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSgpCgogICAgIG9wZW5zc2wgc19jbGllbnQgaGFzIGEgbmV3ICctc2VydmVybmFtZSAuLi4nIG9wdGlvbi4KCiAgICAgb3BlbnNzbCBzX3NlcnZlciBoYXMgbmV3IG9wdGlvbnMgJy1zZXJ2ZXJuYW1lX2hvc3QgLi4uJywgJy1jZXJ0MiAuLi4nLAogICAgICcta2V5MiAuLi4nLCAnLXNlcnZlcm5hbWVfZmF0YWwnIChzdWJqZWN0IHRvIGNoYW5nZSkuICBUaGlzIGFsbG93cwogICAgIHRlc3RpbmcgdGhlIEhvc3ROYW1lIGV4dGVuc2lvbiBmb3IgYSBzcGVjaWZpYyBzaW5nbGUgaG9zdCBuYW1lICgnLWNlcnQnCiAgICAgYW5kICcta2V5JyByZW1haW4gZmFsbGJhY2tzIGZvciBoYW5kc2hha2VzIHdpdGhvdXQgSG9zdE5hbWUKICAgICBuZWdvdGlhdGlvbikuICBJZiB0aGUgdW5yZWNvZ25pemVkX25hbWUgYWxlcnQgaGFzIHRvIGJlIHNlbnQsIHRoaXMgYnkKICAgICBkZWZhdWx0IGlzIGEgd2FybmluZzsgaXQgYmVjb21lcyBmYXRhbCB3aXRoIHRoZSAnLXNlcnZlcm5hbWVfZmF0YWwnCiAgICAgb3B0aW9uLgoKICAgICBbUGV0ZXIgU3lsdmVzdGVyLCAgUmVteSBBbGxhaXMsIENocmlzdG9waGUgUmVub3VdCgogICopIFdoaXJscG9vbCBoYXNoIGltcGxlbWVudGF0aW9uIGlzIGFkZGVkLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBCSUdOVU0gY29kZSBvbiA2NC1iaXQgU1BBUkN2OSB0YXJnZXRzIGlzIHN3aXRjaGVkIGZyb20gYm4oNjQsNjQpIHRvCiAgICAgYm4oNjQsMzIpLiBCZWNhdXNlIG9mIGluc3RydWN0aW9uIHNldCBsaW1pdGF0aW9ucyBpdCBkb2Vzbid0IGhhdmUKICAgICBhbnkgbmVnYXRpdmUgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLiBUaGlzIHdhcyBkb25lIG1vc3RseSBpbiBvcmRlcgogICAgIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gc2hhcmUgYXNzZW1ibGVyIG1vZHVsZXMsIHN1Y2ggYXMgYm5fbXVsX21vbnQKICAgICBpbXBsZW1lbnRhdGlvbnMsIGJldHdlZW4gMzItIGFuZCA2NC1iaXQgYnVpbGRzIHdpdGhvdXQgaGFzc2xlLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBNb3ZlIGNvZGUgcHJldmlvdXNseSBleGlsZWQgaW50byBmaWxlIGNyeXB0by9lYy9lYzJfc21wdC5jCiAgICAgdG8gZWMyX3NtcGwuYywgYW5kIG5vIGxvbmdlciByZXF1aXJlIHRoZSBPUEVOU1NMX0VDX0JJTl9QVF9DT01QCiAgICAgbWFjcm8uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGNhbmRpZGF0ZSBmb3IgQklHTlVNIGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbiwgYm5fbXVsX21vbnQsCiAgICAgZGVkaWNhdGVkIE1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24gcHJvY2VkdXJlLCBpcyBpbnRyb2R1Y2VkLgogICAgIEJOX01PTlRfQ1RYIGlzIG1vZGlmaWVkIHRvIGFsbG93IGJuX211bF9tb250IHRvIHJlYWNoIGZvciBoaWdoZXIKICAgICAiNjQtYml0IiBwZXJmb3JtYW5jZSBvbiBjZXJ0YWluIDMyLWJpdCB0YXJnZXRzLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBOZXcgb3B0aW9uIFNTTF9PUF9OT19DT01QIHRvIGRpc2FibGUgdXNlIG9mIGNvbXByZXNzaW9uIHNlbGVjdGl2ZWx5CiAgICAgaW4gU1NMIHN0cnVjdHVyZXMuIE5ldyBTU0wgY3RybCB0byBzZXQgbWF4aW11bSBzZW5kIGZyYWdtZW50IHNpemUuIAogICAgIFNhdmUgbWVtb3J5IGJ5IHNlZXRpbmcgdGhlIEkvTyBidWZmZXIgc2l6ZXMgZHluYW1pY2FsbHkgaW5zdGVhZCBvZgogICAgIHVzaW5nIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB2YWx1ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9uIC1WIGZvciAnb3BlbnNzbCBjaXBoZXJzJy4gVGhpcyBwcmludHMgdGhlIGNpcGhlcnN1aXRlIGNvZGUKICAgICBpbiBhZGRpdGlvbiB0byB0aGUgdGV4dCBkZXRhaWxzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFZlcnksIHZlcnkgcHJlbGltaW5hcnkgRVhQRVJJTUVOVEFMIHN1cHBvcnQgZm9yIHByaW50aW5nIG9mIGdlbmVyYWwKICAgICBBU04xIHN0cnVjdHVyZXMuIFRoaXMgY3VycmVudGx5IHByb2R1Y2VzIHJhdGhlciB1Z2x5IG91dHB1dCBhbmQgZG9lc24ndAogICAgIGhhbmRsZSBzZXZlcmFsIGN1c3RvbWlzZWQgc3RydWN0dXJlcyBhdCBhbGwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW50ZWdyYXRlZCBzdXBwb3J0IGZvciBQVksgZmlsZSBmb3JtYXQgYW5kIHNvbWUgcmVsYXRlZCBmb3JtYXRzIHN1Y2gKICAgICBhcyBNUyBQVUJMSUNLRVlCTE9CIGFuZCBQUklWQVRFS0VZQkxPQi4gQ29tbWFuZCBsaW5lIHN3aXRjaGVzIHRvIHN1cHBvcnQKICAgICB0aGVzZSBpbiB0aGUgJ3JzYScgYW5kICdkc2EnIHV0aWxpdGllcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBQS0NTIzEgUlNBUHVibGljS2V5IGZvcm1hdCBvbiByc2EgdXRpbGl0eSBjb21tYW5kIGxpbmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIHRoZSBhbmNpZW50IEFTTjFfTUVUSE9EIGNvZGUuIFRoaXMgd2FzIG9ubHkgZXZlciB1c2VkIGluIG9uZQogICAgIHBsYWNlIGZvciB0aGUgKHZlcnkgb2xkKSAiTkVUU0NBUEUiIGZvcm1hdCBjZXJ0aWZpY2F0ZXMgd2hpY2ggYXJlIG5vdwogICAgIGhhbmRsZWQgdXNpbmcgbmV3IEFTTjEgY29kZSBlcXVpdmFsZW50cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBMZXQgdGhlIFRMU3YxX21ldGhvZCgpIGV0Yy4gZnVuY3Rpb25zIHJldHVybiBhICdjb25zdCcgU1NMX01FVEhPRAogICAgIHBvaW50ZXIgYW5kIG1ha2UgdGhlIFNTTF9NRVRIT0QgcGFyYW1ldGVyIGluIFNTTF9DVFhfbmV3LAogICAgIFNTTF9DVFhfc2V0X3NzbF92ZXJzaW9uIGFuZCBTU0xfc2V0X3NzbF9tZXRob2QgJ2NvbnN0Jy4KICAgICBbTmlscyBMYXJzY2hdCgogICopIE1vZGlmeSBDUkwgZGlzdHJpYnV0aW9uIHBvaW50cyBleHRlbnNpb24gY29kZSB0byBwcmludCBvdXQgcHJldmlvdXNseQogICAgIHVuc3VwcG9ydGVkIGZpZWxkcy4gRW5oYW5jZSBleHRlbnNpb24gc2V0dGluZyBjb2RlIHRvIGFsbG93IHNldHRpbmcgb2YKICAgICBhbGwgZmllbGRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBwcmludCBhbmQgc2V0IHN1cHBvcnQgZm9yIElzc3VpbmcgRGlzdHJpYnV0aW9uIFBvaW50IENSTCBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlICdDb25maWd1cmUnIHNjcmlwdCB0byBlbmFibGUgQ2FtZWxsaWEgYnkgZGVmYXVsdC4KICAgICBbTlRUXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOG0gYW5kIDAuOS44biBbMjQgTWFyIDIwMTBdCgogICopIFdoZW4gcmVqZWN0aW5nIFNTTC9UTFMgcmVjb3JkcyBkdWUgdG8gYW4gaW5jb3JyZWN0IHZlcnNpb24gbnVtYmVyLCBuZXZlcgogICAgIHVwZGF0ZSBzLT5zZXJ2ZXIgd2l0aCBhIG5ldyBtYWpvciB2ZXJzaW9uIG51bWJlci4gIEFzIG9mCiAgICAgLSBPcGVuU1NMIDAuOS44bSBpZiAnc2hvcnQnIGlzIGEgMTYtYml0IHR5cGUsCiAgICAgLSBPcGVuU1NMIDAuOS44ZiBpZiAnc2hvcnQnIGlzIGxvbmdlciB0aGFuIDE2IGJpdHMsCiAgICAgdGhlIHByZXZpb3VzIGJlaGF2aW9yIGNvdWxkIHJlc3VsdCBpbiBhIHJlYWQgYXR0ZW1wdCBhdCBOVUxMIHdoZW4KICAgICByZWNlaXZpbmcgc3BlY2lmaWMgaW5jb3JyZWN0IFNTTC9UTFMgcmVjb3JkcyBvbmNlIHJlY29yZCBwYXlsb2FkCiAgICAgcHJvdGVjdGlvbiBpcyBhY3RpdmUuICAoQ1ZFLTIwMTAtMDc0MCkKICAgICBbQm9kbyBNb2VsbGVyLCBBZGFtIExhbmdsZXkgPGFnbEBjaHJvbWl1bS5vcmc+XQoKICAqKSBGaXggZm9yIENWRS0yMDEwLTA0MzMgd2hlcmUgc29tZSBrZXJiZXJvcyBlbmFibGVkIHZlcnNpb25zIG9mIE9wZW5TU0wgCiAgICAgY291bGQgYmUgY3Jhc2hlZCBpZiB0aGUgcmVsZXZhbnQgdGFibGVzIHdlcmUgbm90IHByZXNlbnQgKGUuZy4gY2hyb290ZWQpLgogICAgIFtUb21hcyBIb2dlciA8dGhvZ2VyQHJlZGhhdC5jb20+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGwgYW5kIDAuOS44bSBbMjUgRmViIDIwMTBdCgogICopIEFsd2F5cyBjaGVjayBibl93ZXhwZW5kKCkgcmV0dXJuIHZhbHVlcyBmb3IgZmFpbHVyZS4gIChDVkUtMjAwOS0zMjQ1KQogICAgIFtNYXJ0aW4gT2xzc29uLCBOZWVsIE1laHRhXQoKICAqKSBGaXggWDUwOV9TVE9SRSBsb2NraW5nOiBFdmVyeSAnb2JqcycgYWNjZXNzIHJlcXVpcmVzIGEgbG9jayAodG8KICAgICBhY2NvbW1vZGF0ZSBmb3Igc3RhY2sgc29ydGluZywgYWx3YXlzIGEgd3JpdGUgbG9jayEpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE9uIHNvbWUgdmVyc2lvbnMgb2YgV0lOMzIgSGVhcDMyTmV4dCBpcyB2ZXJ5IHNsb3cuIFRoaXMgY2FuIGNhdXNlCiAgICAgZXhjZXNzaXZlIGRlbGF5cyBpbiB0aGUgUkFORF9wb2xsKCk6IG92ZXIgYSBtaW51dGUuIEFzIGEgd29ya2Fyb3VuZAogICAgIGluY2x1ZGUgYSB0aW1lIGNoZWNrIGluIHRoZSBpbm5lciBIZWFwMzJOZXh0IGxvb3AgdG9vLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRoZSBjb2RlIHRoYXQgaGFuZGxlZCBmbHVzaGluZyBvZiBkYXRhIGluIFNTTC9UTFMgb3JpZ2luYWxseSB1c2VkIHRoZQogICAgIEJJT19DVFJMX0lORk8gY3RybCB0byBzZWUgaWYgYW55IGRhdGEgd2FzIHBlbmRpbmcgZmlyc3QuIFRoaXMgY2F1c2VkCiAgICAgdGhlIHByb2JsZW0gb3V0bGluZWQgaW4gUFIjMTk0OS4gVGhlIGZpeCBzdWdnZXN0ZWQgdGhlcmUgaG93ZXZlciBjYW4KICAgICB0cmlnZ2VyIHByb2JsZW1zIHdpdGggYnVnZ3kgQklPX0NUUkxfV1BFTkRJTkcgKGUuZy4gc29tZSB2ZXJzaW9ucwogICAgIG9mIEFwYWNoZSkuIFNvIGluc3RlYWQgc2ltcGxpZnkgdGhlIGNvZGUgdG8gZmx1c2ggdW5jb25kaXRpb25hbGx5LgogICAgIFRoaXMgc2hvdWxkIGJlIGZpbmUgc2luY2UgZmx1c2hpbmcgd2l0aCBubyBkYXRhIHRvIGZsdXNoIGlzIGEgbm8gb3AuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSGFuZGxlIFRMUyB2ZXJzaW9ucyAyLjAgYW5kIGxhdGVyIHByb3Blcmx5IGFuZCBjb3JyZWN0bHkgdXNlIHRoZQogICAgIGhpZ2hlc3QgdmVyc2lvbiBvZiBUTFMvU1NMIHN1cHBvcnRlZC4gQWx0aG91Z2ggVExTID49IDIuMCBpcyBzb21lIHdheQogICAgIG9mZiBhbmNpZW50IHNlcnZlcnMgaGF2ZSBhIGhhYml0IG9mIHN0aWNraW5nIGFyb3VuZCBmb3IgYSB3aGlsZS4uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSBjb21wcmVzc2lvbiBjb2RlIHNvIGl0IGZyZWVzIHVwIHN0cnVjdHVyZXMgd2l0aG91dCB1c2luZyB0aGUKICAgICBleF9kYXRhIGNhbGxiYWNrcy4gVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIHdoZXJlIHNvbWUgYXBwbGljYXRpb25zCiAgICAgY2FsbCBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpIGJlZm9yZSBhcHBsaWNhdGlvbiBleGl0IChlLmcuIHdoZW4KICAgICByZXN0YXJ0aW5nKSB0aGVuIHVzZSBjb21wcmVzc2lvbiAoZS5nLiBTU0wgd2l0aCBjb21wcmVzc2lvbikgbGF0ZXIuCiAgICAgVGhpcyByZXN1bHRzIGluIHNpZ25pZmljYW50IHBlci1jb25uZWN0aW9uIG1lbW9yeSBsZWFrcyBhbmQKICAgICBoYXMgY2F1c2VkIHNvbWUgc2VjdXJpdHkgaXNzdWVzIGluY2x1ZGluZyBDVkUtMjAwOC0xNjc4IGFuZAogICAgIENWRS0yMDA5LTQzNTUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29uc3RpZnkgY3J5cHRvL2Nhc3QgKGkuZS4sIDxvcGVuc3NsL2Nhc3QuaD4pOiBhIENBU1RfS0VZIGRvZXNuJ3QKICAgICBjaGFuZ2Ugd2hlbiBlbmNyeXB0aW5nIG9yIGRlY3J5cHRpbmcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIG9wdGlvbiBTU0xfT1BfTEVHQUNZX1NFUlZFUl9DT05ORUNUIHdoaWNoIHdpbGwgYWxsb3cgY2xpZW50cyB0bwogICAgIGNvbm5lY3QgYW5kIHJlbmVnb3RpYXRlIHdpdGggc2VydmVycyB3aGljaCBkbyBub3Qgc3VwcG9ydCBSSS4KICAgICBVbnRpbCBSSSBpcyBtb3JlIHdpZGVseSBkZXBsb3llZCB0aGlzIG9wdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkICJtaXNzaW5nIiBzc2wgY3RybHMgdG8gY2xlYXIgb3B0aW9ucyBhbmQgbW9kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJZiBjbGllbnQgYXR0ZW1wdHMgdG8gcmVuZWdvdGlhdGUgYW5kIGRvZXNuJ3Qgc3VwcG9ydCBSSSByZXNwb25kIHdpdGgKICAgICBhIG5vX3JlbmVnb3RpYXRpb24gYWxlcnQgYXMgcmVxdWlyZWQgYnkgUkZDNTc0Ni4gIFNvbWUgcmVuZWdvdGlhdGluZwogICAgIFRMUyBjbGllbnRzIHdpbGwgY29udGludWUgYSBjb25uZWN0aW9uIGdyYWNlZnVsbHkgd2hlbiB0aGV5IHJlY2VpdmUKICAgICB0aGUgYWxlcnQuIFVuZm9ydHVuYXRlbHkgT3BlblNTTCBtaXNoYW5kbGVkIHRoaXMgYWxlcnQgYW5kIHdvdWxkIGhhbmcKICAgICB3YWl0aW5nIGZvciBhIHNlcnZlciBoZWxsbyB3aGljaCBpdCB3aWxsIG5ldmVyIHJlY2VpdmUuIE5vdyB3ZSB0cmVhdCBhCiAgICAgcmVjZWl2ZWQgbm9fcmVuZWdvdGlhdGlvbiBhbGVydCBhcyBhIGZhdGFsIGVycm9yLiBUaGlzIGlzIGJlY2F1c2UKICAgICBhcHBsaWNhdGlvbnMgcmVxdWVzdGluZyBhIHJlbmVnb3RpYXRpb24gbWlnaHQgd2VsbCBleHBlY3QgaXQgdG8gc3VjY2VlZAogICAgIGFuZCB3b3VsZCBoYXZlIG5vIGNvZGUgaW4gcGxhY2UgdG8gaGFuZGxlIHRoZSBzZXJ2ZXIgZGVueWluZyBpdCBzbyB0aGUKICAgICBvbmx5IHNhZmUgdGhpbmcgdG8gZG8gaXMgdG8gdGVybWluYXRlIHRoZSBjb25uZWN0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjdHJsIG1hY3JvIFNTTF9nZXRfc2VjdXJlX3JlbmVnb3RpYXRpb25fc3VwcG9ydCgpIHdoaWNoIHJldHVybnMgMSBpZgogICAgIHBlZXIgc3VwcG9ydHMgc2VjdXJlIHJlbmVnb3RpYXRpb24gYW5kIDAgb3RoZXJ3aXNlLiBQcmludCBvdXQgcGVlcgogICAgIHJlbmVnb3RpYXRpb24gc3VwcG9ydCBpbiBzX2NsaWVudC9zX3NlcnZlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZXBsYWNlIHRoZSBoaWdobHkgYnJva2VuIGFuZCBkZXByZWNhdGVkIFNQS0FDIGNlcnRpZmljYXRpb24gbWV0aG9kIHdpdGgKICAgICB0aGUgdXBkYXRlZCBOSUQgY3JlYXRpb24gdmVyc2lvbi4gVGhpcyBzaG91bGQgY29ycmVjdGx5IGhhbmRsZSBVVEY4LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCBSRkM1NzQ2LiBSZS1lbmFibGUgcmVuZWdvdGlhdGlvbiBidXQgcmVxdWlyZSB0aGUgZXh0ZW5zaW9uCiAgICAgYXMgbmVlZGVkLiBVbmZvcnR1bmF0ZWx5LCBTU0wzX0ZMQUdTX0FMTE9XX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTgogICAgIHR1cm5zIG91dCB0byBiZSBhIGJhZCBpZGVhLiBJdCBoYXMgYmVlbiByZXBsYWNlZCBieQogICAgIFNTTF9PUF9BTExPV19VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT04gd2hpY2ggY2FuIGJlIHNldCB3aXRoCiAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucygpLiBUaGlzIGlzIHJlYWxseSBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdQogICAgIGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgogICAgIFtFcmljIFJlc2NvcmxhIDxla3JAbmV0d29ya3Jlc29uYW5jZS5jb20+LCBCZW4gTGF1cmllLCBTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIHRvIHN0YXRlbGVzcyBzZXNzaW9uIHJlc3VtcHRpb24gaGFuZGxpbmcuIFVzZSBpbml0aWFsX2N0eCB3aGVuCiAgICAgaXNzdWluZyBhbmQgYXR0ZW1wdGluZyB0byBkZWNyeXB0IHRpY2tldHMgaW4gY2FzZSBpdCBoYXMgY2hhbmdlZCBkdXJpbmcKICAgICBzZXJ2ZXJuYW1lIGhhbmRsaW5nLiBVc2UgYSBub24temVybyBsZW5ndGggc2Vzc2lvbiBJRCB3aGVuIGF0dGVtcHRpbmcKICAgICBzdGF0ZWxlc3Mgc2Vzc2lvbiByZXN1bXB0aW9uOiB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGRldGVybWluZSBpZgogICAgIGEgcmVzdW1wdGlvbiBoYXMgb2NjdXJyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVjZWl2aW5nIHNlcnZlciBoZWxsbwogICAgIChzZXZlcmFsIHBsYWNlcyBpbiBPcGVuU1NMIHN1YnRseSBhc3N1bWUgdGhpcykgaW5zdGVhZCBvZiBsYXRlciBpbgogICAgIHRoZSBoYW5kc2hha2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVGhlIGZ1bmN0aW9ucyBFTkdJTkVfY3RybCgpLCBPUEVOU1NMX2lzc2VydmljZSgpLAogICAgIENNU19nZXQxX1JlY2lwaWVudFJlcXVlc3QoKSBhbmQgUkFORF9ieXRlcygpIGNhbiByZXR1cm4gPD0wIG9uIGVycm9yCiAgICAgZml4ZXMgZm9yIGEgZmV3IHBsYWNlcyB3aGVyZSB0aGUgcmV0dXJuIGNvZGUgaXMgbm90IGNoZWNrZWQKICAgICBjb3JyZWN0bHkuCiAgICAgW0p1bGlhIExhd2FsbCA8anVsaWFAZGlrdS5kaz5dCgogICopIEFkZCAtLXN0cmljdC13YXJuaW5ncyBvcHRpb24gdG8gQ29uZmlndXJlIHNjcmlwdCB0byBpbmNsdWRlIGRldnRlYW0KICAgICB3YXJuaW5ncyBpbiBvdGhlciBjb25maWd1cmF0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgLS1saWJkaXIgb3B0aW9uIGFuZCBMSUJESVIgdmFyaWFibGUgaW4gbWFrZWZpbGVzLiBUaGlzCiAgICAgbWFrZXMgaXQgcG9zc2libGUgdG8gaW5zdGFsbCBvcGVuc3NsIGxpYnJhcmllcyBpbiBsb2NhdGlvbnMgd2hpY2gKICAgICBoYXZlIG5hbWVzIG90aGVyIHRoYW4gImxpYiIsIGZvciBleGFtcGxlICIvdXNyL2xpYjY0IiB3aGljaCBzb21lCiAgICAgc3lzdGVtcyBuZWVkLgogICAgIFtTdGV2ZSBIZW5zb24sIGJhc2VkIG9uIHBhdGNoIGZyb20gSmVyZW15IFV0bGV5XQoKICAqKSBEb24ndCBhbGxvdyB0aGUgdXNlIG9mIGxlYWRpbmcgMHg4MCBpbiBPSURzLiBUaGlzIGlzIGEgdmlvbGF0aW9uIG9mCiAgICAgWDY5MCA4LjkuMTIgYW5kIGNhbiBwcm9kdWNlIHNvbWUgbWlzbGVhZGluZyB0ZXh0dWFsIG91dHB1dCBvZiBPSURzLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IERhbiBLYW1pbnNreV0KCiAgKikgRGVsZXRlIE1EMiBmcm9tIGFsZ29yaXRobSB0YWJsZXMuIFRoaXMgZm9sbG93cyB0aGUgcmVjb21tZW5kYXRpb24gaW4KICAgICBzZXZlcmFsIHN0YW5kYXJkcyB0aGF0IGl0IGlzIG5vdCB1c2VkIGluIG5ldyBhcHBsaWNhdGlvbnMgZHVlIHRvCiAgICAgc2V2ZXJhbCBjcnlwdG9ncmFwaGljIHdlYWtuZXNzZXMuIEZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSByZWFzb25zCiAgICAgdGhlIE1EMiBBUEkgaXMgc3RpbGwgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29tcHJlc3Npb24gaWQgdG8ge2QyaSxpMmR9X1NTTF9TRVNTSU9OIHNvIGl0IGlzIGNvcnJlY3RseSBzYXZlZAogICAgIGFuZCByZXN0b3JlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW5hbWUgdW5pMmFzYyBhbmQgYXNjMnVuaSBmdW5jdGlvbnMgdG8gT1BFTlNTTF91bmkyYXNjIGFuZAogICAgIE9QRU5TU0xfYXNjMnVuaSBjb25kaXRpb25hbGx5IG9uIE5ldHdhcmUgcGxhdGZvcm1zIHRvIGF2b2lkIGEgbmFtZQogICAgIGNsYXNoLgogICAgIFtHdWVudGVyIDxsaXN0c0Bna253Lm5ldD5dCgogICopIEZpeCB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGNoYWluIGJ1aWxkaW5nIGNvZGUgdG8gdXNlIFg1MDlfdmVyaWZ5X2NlcnQoKSwKICAgICBpdCB1c2VkIHRvIGhhdmUgYW4gYWQtaG9jIGJ1aWxkZXIgd2hpY2ggd2FzIHVuYWJsZSB0byBjb3BlIHdpdGggYW55dGhpbmcKICAgICBvdGhlciB0aGFuIGEgc2ltcGxlIGNoYWluLgogICAgIFtEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+LCBTdGV2ZSBIZW5zb25dCgogICopIERvbid0IGNoZWNrIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlIHNpZ25hdHVyZXMgaW4gWDUwOV92ZXJpZnlfY2VydCgpCiAgICAgYnkgZGVmYXVsdCAoYSBmbGFnIGNhbiBvdmVycmlkZSB0aGlzKTogaXQganVzdCB3YXN0ZXMgdGltZSB3aXRob3V0CiAgICAgYWRkaW5nIGFueSBzZWN1cml0eS4gQXMgYSB1c2VmdWwgc2lkZSBlZmZlY3Qgc2VsZiBzaWduZWQgcm9vdCBDQXMKICAgICB3aXRoIG5vbi1GSVBTIGRpZ2VzdHMgYXJlIG5vdyB1c2FibGUgaW4gRklQUyBtb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIGR0bHMxX3Byb2Nlc3Nfb3V0X29mX3NlcV9tZXNzYWdlKCkgdGhlIGNoZWNrIGlmIHRoZSBjdXJyZW50IG1lc3NhZ2UKICAgICBpcyBhbHJlYWR5IGJ1ZmZlcmVkIHdhcyBtaXNzaW5nLiBGb3IgZXZlcnkgbmV3IG1lc3NhZ2Ugd2FzIG1lbW9yeQogICAgIGFsbG9jYXRlZCwgYWxsb3dpbmcgYW4gYXR0YWNrZXIgdG8gcGVyZm9ybSBhbiBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2sKICAgICB3aXRoIHNlbmRpbmcgb3V0IG9mIHNlcSBoYW5kc2hha2UgbWVzc2FnZXMgdW50aWwgdGhlcmUgaXMgbm8gbWVtb3J5CiAgICAgbGVmdC4gQWRkaXRpb25hbGx5IGV2ZXJ5IGZ1dHVyZSBtZXNzZWdlIHdhcyBidWZmZXJlZCwgZXZlbiBpZiB0aGUKICAgICBzZXF1ZW5jZSBudW1iZXIgbWFkZSBubyBzZW5zZSBhbmQgd291bGQgYmUgcGFydCBvZiBhbm90aGVyIGhhbmRzaGFrZS4KICAgICBTbyBvbmx5IG1lc3NhZ2VzIHdpdGggc2VxdWVuY2UgbnVtYmVycyBsZXNzIHRoYW4gMTAgaW4gYWR2YW5jZSB3aWxsIGJlCiAgICAgYnVmZmVyZWQuICAoQ1ZFLTIwMDktMTM3OCkKICAgICBbUm9iaW4gU2VnZ2VsbWFubiwgZGlzY292ZXJlZCBieSBEYW5pZWwgTWVudHpdIAkKCiAgKikgUmVjb3JkcyBhcmUgYnVmZmVyZWQgaWYgdGhleSBhcnJpdmUgd2l0aCBhIGZ1dHVyZSBlcG9jaCB0byBiZQogICAgIHByb2Nlc3NlZCBhZnRlciBmaW5pc2hpbmcgdGhlIGNvcnJlc3BvbmRpbmcgaGFuZHNoYWtlLiBUaGVyZSBpcwogICAgIGN1cnJlbnRseSBubyBsaW1pdGF0aW9uIHRvIHRoaXMgYnVmZmVyIGFsbG93aW5nIGFuIGF0dGFja2VyIHRvIHBlcmZvcm0KICAgICBhIERPUyBhdHRhY2sgd2l0aCBzZW5kaW5nIHJlY29yZHMgd2l0aCBmdXR1cmUgZXBvY2hzIHVudGlsIHRoZXJlIGlzIG5vCiAgICAgbWVtb3J5IGxlZnQuIFRoaXMgcGF0Y2ggYWRkcyB0aGUgcHF1ZXVlX3NpemUoKSBmdW5jdGlvbiB0byBkZXRlcm1pbmUKICAgICB0aGUgc2l6ZSBvZiBhIGJ1ZmZlciBhbmQgbGltaXRzIHRoZSByZWNvcmQgYnVmZmVyIHRvIDEwMCBlbnRyaWVzLgogICAgIChDVkUtMjAwOS0xMzc3KQogICAgIFtSb2JpbiBTZWdnZWxtYW5uLCBkaXNjb3ZlcmVkIGJ5IERhbmllbCBNZW50el0gCQoKICAqKSBLZWVwIGEgY29weSBvZiBmcmFnLT5tc2dfaGVhZGVyLmZyYWdfbGVuIHNvIGl0IGNhbiBiZSB1c2VkIGFmdGVyIHRoZQogICAgIHBhcmVudCBzdHJ1Y3R1cmUgaXMgZnJlZWQuICAoQ1ZFLTIwMDktMTM3OSkKICAgICBbRGFuaWVsIE1lbnR6XSAJCgogICopIEhhbmRsZSBub24tYmxvY2tpbmcgSS9PIHByb3Blcmx5IGluIFNTTF9zaHV0ZG93bigpIGNhbGwuCiAgICAgW0RhcnJ5bCBNaWxlcyA8ZGFycnlsLW1haWxpbmdsaXN0c0BuZXRiYXVkcy5uZXQ+XQoKICAqKSBBZGQgMi41LjQuKiBPSURzCiAgICAgW0lseWEgTy4gPHZyZ2hvc3RAZ21haWwuY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhrIGFuZCAwLjkuOGwgIFs1IE5vdiAyMDA5XQoKICAqKSBEaXNhYmxlIHJlbmVnb3RpYXRpb24gY29tcGxldGVseSAtIHRoaXMgZml4ZXMgYSBzZXZlcmUgc2VjdXJpdHkKICAgICBwcm9ibGVtIChDVkUtMjAwOS0zNTU1KSBhdCB0aGUgY29zdCBvZiBicmVha2luZyBhbGwKICAgICByZW5lZ290aWF0aW9uLiBSZW5lZ290aWF0aW9uIGNhbiBiZSByZS1lbmFibGVkIGJ5IHNldHRpbmcKICAgICBTU0wzX0ZMQUdTX0FMTE9XX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTiBpbiBzMy0+ZmxhZ3MgYXQKICAgICBydW4tdGltZS4gVGhpcyBpcyByZWFsbHkgbm90IHJlY29tbWVuZGVkIHVubGVzcyB5b3Uga25vdyB3aGF0CiAgICAgeW91J3JlIGRvaW5nLgogICAgIFtCZW4gTGF1cmllXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGogYW5kIDAuOS44ayAgWzI1IE1hciAyMDA5XQoKICAqKSBEb24ndCBzZXQgdmFsIHRvIE5VTEwgd2hlbiBmcmVlaW5nIHVwIHN0cnVjdHVyZXMsIGl0IGlzIGZyZWVkIHVwIGJ5CiAgICAgdW5kZXJseWluZyBjb2RlLiBJZiBzaXplb2Yodm9pZCAqKSA+IHNpemVvZihsb25nKSB0aGlzIGNhbiByZXN1bHQgaW4KICAgICB6ZXJvaW5nIHBhc3QgdGhlIHZhbGlkIGZpZWxkLiAoQ1ZFLTIwMDktMDc4OSkKICAgICBbUGFvbG8gR2FuY2kgPFBhb2xvLkdhbmNpQEFkTm92dW0uQ0g+XQoKICAqKSBGaXggYnVnIHdoZXJlIHJldHVybiB2YWx1ZSBvZiBDTVNfU2lnbmVySW5mb192ZXJpZnlfY29udGVudCgpIHdhcyBub3QKICAgICBjaGVja2VkIGNvcnJlY3RseS4gVGhpcyB3b3VsZCBhbGxvdyBzb21lIGludmFsaWQgc2lnbmVkIGF0dHJpYnV0ZXMgdG8KICAgICBhcHBlYXIgdG8gdmVyaWZ5IGNvcnJlY3RseS4gKENWRS0yMDA5LTA1OTEpCiAgICAgW0l2YW4gTmVzdGxlcm9kZSA8aW5lc3RsZXJvZGVAdXMuaWJtLmNvbT5dCgogICopIFJlamVjdCBVbml2ZXJzYWxTdHJpbmcgYW5kIEJNUFN0cmluZyB0eXBlcyB3aXRoIGludmFsaWQgbGVuZ3Rocy4gVGhpcwogICAgIHByZXZlbnRzIGEgY3Jhc2ggaW4gQVNOMV9TVFJJTkdfcHJpbnRfZXgoKSB3aGljaCBhc3N1bWVzIHRoZSBzdHJpbmdzIGhhdmUKICAgICBhIGxlZ2FsIGxlbmd0aC4gKENWRS0yMDA5LTA1OTApCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU2V0IFMvTUlNRSBzaWduaW5nIGFzIHRoZSBkZWZhdWx0IHB1cnBvc2UgcmF0aGVyIHRoYW4gc2V0dGluZyBpdCAKICAgICB1bmNvbmRpdGlvbmFsbHkuIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBvdmVycmlkZSBpdCBhdCB0aGUgc3RvcmUKICAgICBsZXZlbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQZXJtaXQgcmVzdHJpY3RlZCByZWN1cnNpb24gb2YgQVNOMSBzdHJpbmdzLiBUaGlzIGlzIG5lZWRlZCBpbiBwcmFjdGljZQogICAgIHRvIGhhbmRsZSBzb21lIHN0cnVjdHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wcm92ZSBlZmZpY2llbmN5IG9mIG1lbV9nZXRzOiBkb24ndCBzZWFyY2ggd2hvbGUgYnVmZmVyIGVhY2ggdGltZQogICAgIGZvciBhICdcbicKICAgICBbSmVyZW15IFNoYXBpcm8gPGpuc2hhcGlyQHVzLmlibS5jb20+XQoKICAqKSBOZXcgLWhleCBvcHRpb24gZm9yIG9wZW5zc2wgcmFuZC4KICAgICBbTWF0dGhpZXUgSGVycmJdCgogICopIFByaW50IG91dCBVVEY4U3RyaW5nIGFuZCBOdW1lcmljU3RyaW5nIHdoZW4gcGFyc2luZyBBU04xLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgTnVtZXJpY1N0cmluZyB0eXBlIGZvciBuYW1lIGNvbXBvbmVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgQ0MgaW4gdGhlIGVudmlyb25tZW50IHRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWNhbGx5IGNob3NlbgogICAgIGNvbXBpbGVyLiBOb3RlIHRoYXQgbm90aGluZyBpcyBkb25lIHRvIGVuc3VyZSBmbGFncyB3b3JrIHdpdGggdGhlCiAgICAgY2hvc2VuIGNvbXBpbGVyLgogICAgIFtCZW4gTGF1cmllXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGkgYW5kIDAuOS44aiAgWzA3IEphbiAyMDA5XQoKICAqKSBQcm9wZXJseSBjaGVjayBFVlBfVmVyaWZ5RmluYWwoKSBhbmQgc2ltaWxhciByZXR1cm4gdmFsdWVzCiAgICAgKENWRS0yMDA4LTUwNzcpLgogICAgIFtCZW4gTGF1cmllLCBCb2RvIE1vZWxsZXIsIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBFbmFibGUgVExTIGV4dGVuc2lvbnMgYnkgZGVmYXVsdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWxsb3cgdGhlIENISUwgZW5naW5lIHRvIGJlIGxvYWRlZCwgd2hldGhlciB0aGUgYXBwbGljYXRpb24gaXMKICAgICBtdWx0aXRocmVhZGVkIG9yIG5vdC4gKFRoaXMgZG9lcyBub3QgcmVsZWFzZSB0aGUgZGV2ZWxvcGVyIGZyb20gdGhlCiAgICAgb2JsaWdhdGlvbiB0byBzZXQgdXAgdGhlIGR5bmFtaWMgbG9ja2luZyBjYWxsYmFja3MuKQogICAgIFtTYW5kZXIgVGVtbWUgPHNhbmRlckB0ZW1tZS5uZXQ+XQoKICAqKSBVc2UgY29ycmVjdCBleGl0IGNvZGUgaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gZGdzdCBjb21tYW5kLgogICAgIFtTdGV2ZSBIZW5zb247IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgUm9sYW5kIERpcmxld2FuZ2VyXQoKICAqKSBUd2VhayBDb25maWd1cmUgc28gdGhhdCB5b3UgbmVlZCB0byBzYXkgImV4cGVyaW1lbnRhbC1qcGFrZSIgdG8gZW5hYmxlCiAgICAgSlBBS0UsIGFuZCBuZWVkIHRvIHVzZSAtRE9QRU5TU0xfRVhQRVJJTUVOVEFMX0pQQUtFIGluIGFwcGxpY2F0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgZXhwZXJpbWVudGFsIEpQQUtFIHN1cHBvcnQsIGluY2x1ZGluZyBkZW1vIGF1dGhlbnRpY2F0aW9uIGluCiAgICAgc19jbGllbnQgYW5kIHNfc2VydmVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTZXQgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4gdjNfYWRkcl9jYW5vbml6ZSgpLgogICAgIFtSb2IgQXVzdGVpbiA8c3JhQGhhY3Rybi5uZXQ+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgWE1QUCBTVEFSVFRMUyBpbiBzX2NsaWVudC4KICAgICBbUGhpbGlwIFBhZXBzIDxwaGlsaXBAZnJlZWJzZC5vcmc+XQoKICAqKSBDaGFuZ2UgdGhlIHNlcnZlci1zaWRlIFNTTF9PUF9ORVRTQ0FQRV9SRVVTRV9DSVBIRVJfQ0hBTkdFX0JVRyBiZWhhdmlvcgogICAgIHRvIGVuc3VyZSB0aGF0IGV2ZW4gd2l0aCB0aGlzIG9wdGlvbiwgb25seSBjaXBoZXJzdWl0ZXMgaW4gdGhlCiAgICAgc2VydmVyJ3MgcHJlZmVyZW5jZSBsaXN0IHdpbGwgYmUgYWNjZXB0ZWQuICAoTm90ZSB0aGF0IHRoZSBvcHRpb24KICAgICBhcHBsaWVzIG9ubHkgd2hlbiByZXN1bWluZyBhIHNlc3Npb24sIHNvIHRoZSBlYXJsaWVyIGJlaGF2aW9yIHdhcwogICAgIGp1c3QgYWJvdXQgdGhlIGFsZ29yaXRobSBjaG9pY2UgZm9yIHN5bW1ldHJpYyBjcnlwdG9ncmFwaHkuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44aCBhbmQgMC45LjhpICBbMTUgU2VwIDIwMDhdCgogICopIEZpeCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UgaWYgYSBEVExTIHNlcnZlciByZWNlaXZlZAogICAgIENoYW5nZUNpcGhlclNwZWMgYXMgZmlyc3QgcmVjb3JkIChDVkUtMjAwOS0xMzg2KS4KICAgICBbUFIgIzE2NzldCgogICopIEZpeCBhIHN0YXRlIHRyYW5zaXRpb24gaW4gczNfc3J2ci5jIGFuZCBkMV9zcnZyLmMKICAgICAod2FzIHVzaW5nIFNTTDNfU1RfQ1dfQ0xOVF9IRUxMT19CLCBzaG91bGQgYmUgLi4uX1NUX1NXX1NSVlJfLi4uKS4KICAgICBbTmFnZW5kcmEgTW9kYWR1Z3VdCgogICopIFRoZSBmaXggaW4gMC45LjhjIHRoYXQgc3VwcG9zZWRseSBnb3QgcmlkIG9mIHVuc2FmZQogICAgIGRvdWJsZS1jaGVja2VkIGxvY2tpbmcgd2FzIGluY29tcGxldGUgZm9yIFJTQSBibGluZGluZywKICAgICBhZGRyZXNzaW5nIGp1c3Qgb25lIGxheWVyIG9mIHdoYXQgdHVybnMgb3V0IHRvIGhhdmUgYmVlbgogICAgIGRvdWJseSB1bnNhZmUgdHJpcGxlLWNoZWNrZWQgbG9ja2luZy4KCiAgICAgU28gbm93IGZpeCB0aGlzIGZvciByZWFsIGJ5IHJldGlyaW5nIHRoZSBNT05UX0hFTFBFUiBtYWNybwogICAgIGluIGNyeXB0by9yc2EvcnNhX2VheS5jLgoKICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IE1hcml1cyBTY2hpbGRlcl0KCiAgKikgVmFyaW91cyBwcmVjYXV0aW9uYXJ5IG1lYXN1cmVzOgoKICAgICAtIEF2b2lkIHNpemVfdCBpbnRlZ2VyIG92ZXJmbG93IGluIEhBU0hfVVBEQVRFIChtZDMyX2NvbW1vbi5oKS4KCiAgICAgLSBBdm9pZCBhIGJ1ZmZlciBvdmVyZmxvdyBpbiBkMmlfU1NMX1NFU1NJT04oKSAoc3NsX2FzbjEuYykuCiAgICAgICAoTkI6IFRoaXMgd291bGQgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgdGhlIHNlY3JldCBzZXNzaW9uIHRpY2tldCBrZXkKICAgICAgIHRvIGV4cGxvaXQsIGluIHdoaWNoIGNhc2UgeW91J2QgYmUgU09MIGVpdGhlciB3YXkuKQoKICAgICAtIENoYW5nZSBibl9uaXN0LmMgc28gdGhhdCBpdCB3aWxsIHByb3Blcmx5IGhhbmRsZSBpbnB1dCBCSUdOVU1zCiAgICAgICBvdXRzaWRlIHRoZSBleHBlY3RlZCByYW5nZS4KCiAgICAgLSBFbmZvcmNlIHRoZSAnbnVtJyBjaGVjayBpbiBCTl9kaXYoKSAoYm5fZGl2LmMpIGZvciBub24tQk5fREVCVUcKICAgICAgIGJ1aWxkcy4KCiAgICAgW05lZWwgTWVodGEsIEJvZG8gTW9lbGxlcl0KCiAgKikgQWxsb3cgZW5naW5lcyB0byBiZSAic29mdCBsb2FkZWQiIC0gaS5lLiBvcHRpb25hbGx5IGRvbid0IGRpZSBpZgogICAgIHRoZSBsb2FkIGZhaWxzLiBVc2VmdWwgZm9yIGRpc3Ryb3MuCiAgICAgW0JlbiBMYXVyaWUgYW5kIHRoZSBGcmVlQlNEIHRlYW1dCgogICopIEFkZCBzdXBwb3J0IGZvciBMb2NhbCBNYWNoaW5lIEtleXNldCBhdHRyaWJ1dGUgaW4gUEtDUyMxMiBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggQk5fR0YybV9tb2RfYXJyKCkgdG9wLWJpdCBjbGVhbnVwIGNvZGUuCiAgICAgW0h1YW5nIFlpbmddCgogICopIEV4cGFuZCBFTkdJTkUgdG8gc3VwcG9ydCBlbmdpbmUgc3VwcGxpZWQgU1NMIGNsaWVudCBjZXJ0aWZpY2F0ZSBmdW5jdGlvbnMuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IExvZ2ljYS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQ3J5cHRvQVBJIEVOR0lORSB0byBzdXBwb3J0IHVzZSBvZiBSU0EgYW5kIERTQSBrZXlzIGhlbGQgaW4gV2luZG93cwogICAgIGtleXN0b3Jlcy4gU3VwcG9ydCBmb3IgU1NML1RMUyBjbGllbnQgYXV0aGVudGljYXRpb24gdG9vLgogICAgIE5vdCBjb21waWxlZCB1bmxlc3MgZW5hYmxlLWNhcGllbmcgc3BlY2lmaWVkIHRvIENvbmZpZ3VyZS4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgTG9naWNhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBidWcgaW4gWDUwOV9BVFRSSUJVVEUgY3JlYXRpb246IGRvbnQgc2V0IGF0dHJpYnV0ZSB1c2luZwogICAgIEFTTjFfVFlQRV9zZXQxIGlmIE1CU1RSSU5HIGZsYWcgc2V0LiBUaGlzIGJ1ZyB3b3VsZCBjcmFzaCBjZXJ0YWluCiAgICAgYXR0cmlidXRlIGNyZWF0aW9uIHJvdXRpbmVzIHN1Y2ggYXMgY2VydGlmY2F0ZSByZXF1ZXN0cyBhbmQgUEtDUyMxMgogICAgIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ZyBhbmQgMC45LjhoICBbMjggTWF5IDIwMDhdCgogICopIEZpeCBmbGF3IGlmICdTZXJ2ZXIgS2V5IGV4Y2hhbmdlIG1lc3NhZ2UnIGlzIG9taXR0ZWQgZnJvbSBhIFRMUwogICAgIGhhbmRzaGFrZSB3aGljaCBjb3VsZCBsZWFkIHRvIGEgY2lsZW50IGNyYXNoIGFzIGZvdW5kIHVzaW5nIHRoZQogICAgIENvZGVub21pY29uIFRMUyB0ZXN0IHN1aXRlIChDVkUtMjAwOC0xNjcyKSAKICAgICBbU3RldmUgSGVuc29uLCBNYXJrIENveF0KCiAgKikgRml4IGRvdWJsZSBmcmVlIGluIFRMUyBzZXJ2ZXIgbmFtZSBleHRlbnNpb25zIHdoaWNoIGNvdWxkIGxlYWQgdG8KICAgICBhIHJlbW90ZSBjcmFzaCBmb3VuZCBieSBDb2Rlbm9taWNvbiBUTFMgdGVzdCBzdWl0ZSAoQ1ZFLTIwMDgtMDg5MSkgCiAgICAgW0pvZSBPcnRvbl0KCiAgKikgQ2xlYXIgZXJyb3IgcXVldWUgaW4gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSgpCgogICAgIENsZWFyIHRoZSBlcnJvciBxdWV1ZSB0byBlbnN1cmUgdGhhdCBlcnJvciBlbnRyaWVzIGxlZnQgZnJvbQogICAgIG9sZGVyIGZ1bmN0aW9uIGNhbGxzIGRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUgY29ycmVjdCBvcGVyYXRpb24uCiAgICAgW0x1dHogSmFlbmlja2UsIEVyaWsgZGUgQ2FzdHJvIExvcG9dCgogICopIFJlbW92ZSByb290IENBIGNlcnRpZmljYXRlcyBvZiBjb21tZXJjaWFsIENBczoKCiAgICAgVGhlIE9wZW5TU0wgcHJvamVjdCBkb2VzIG5vdCByZWNvbW1lbmQgYW55IHNwZWNpZmljIENBIGFuZCBkb2VzIG5vdAogICAgIGhhdmUgYW55IHBvbGljeSB3aXRoIHJlc3BlY3QgdG8gaW5jbHVkaW5nIG9yIGV4Y2x1ZGluZyBhbnkgQ0EuCiAgICAgVGhlcmVmb3JlIGl0IGRvZXMgbm90IG1ha2UgYW55IHNlbnNlIHRvIHNoaXAgYW4gYXJiaXRyYXJ5IHNlbGVjdGlvbgogICAgIG9mIHJvb3QgQ0EgY2VydGlmaWNhdGVzIHdpdGggdGhlIE9wZW5TU0wgc29mdHdhcmUuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIFJTQSBPQUVQIHBhdGNoZXMgdG8gZml4IHR3byBzZXBhcmF0ZSBpbnZhbGlkIG1lbW9yeSByZWFkcy4KICAgICBUaGUgZmlyc3Qgb25lIGludm9sdmVzIGlucHV0cyB3aGVuICdsemVybycgaXMgZ3JlYXRlciB0aGFuCiAgICAgJ1NIQV9ESUdFU1RfTEVOR1RIJyAoaXQgd291bGQgcmVhZCBhYm91dCBTSEFfRElHRVNUX0xFTkdUSCBieXRlcwogICAgIGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIGZyb20pLiBUaGUgc2Vjb25kIG9uZSBpbnZvbHZlcyBpbnB1dHMgd2hlcmUKICAgICB0aGUgJ2RiJyBzZWN0aW9uIGNvbnRhaW5zIG5vdGhpbmcgYnV0IHplcm9lcyAodGhlcmUgaXMgYSBvbmUtYnl0ZQogICAgIGludmFsaWQgcmVhZCBhZnRlciB0aGUgZW5kIG9mICdkYicpLgogICAgIFtJdmFuIE5lc3RsZXJvZGUgPGluZXN0bGVyb2RlQHVzLmlibS5jb20+XQoKICAqKSBQYXJ0aWFsIGJhY2twb3J0IGZyb20gMC45LjktZGV2OgoKICAgICBJbnRyb2R1Y2UgYm5fbXVsX21vbnQgKGRlZGljYXRlZCBNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uCiAgICAgcHJvY2VkdXJlKSBhcyBhIGNhbmRpZGF0ZSBmb3IgQklHTlVNIGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbi4KICAgICBXaGlsZSAwLjkuOS1kZXYgdXNlcyBhc3NlbWJsZXIgZm9yIHZhcmlvdXMgYXJjaGl0ZWN0dXJlcywgb25seQogICAgIHg4Nl82NCBpcyBhdmFpbGFibGUgYnkgZGVmYXVsdCBoZXJlIGluIHRoZSAwLjkuOCBicmFuY2gsIGFuZAogICAgIDMyLWJpdCB4ODYgaXMgYXZhaWxhYmxlIHRocm91Z2ggYSBjb21waWxlLXRpbWUgc2V0dGluZy4KCiAgICAgVG8gdHJ5IHRoZSAzMi1iaXQgeDg2IGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbiwgdXNlIENvbmZpZ3VyZQogICAgIG9wdGlvbiAiZW5hYmxlLW1vbnRhc20iICh3aGljaCBleGlzdHMgb25seSBmb3IgdGhpcyBiYWNrcG9ydCkuCgogICAgIEFzICJlbmFibGUtbW9udGFzbSIgZm9yIDMyLWJpdCB4ODYgZGlzY2xhaW1zIGNvZGUgc3RhYmlsaXR5CiAgICAgYW55d2F5LCBpbiB0aGlzIGNvbnN0ZWxsYXRpb24gd2UgYWN0aXZhdGUgYWRkaXRpb25hbCBjb2RlCiAgICAgYmFja3BvcnRlZCBmcm9tIDAuOS45LWRldiBmb3IgZnVydGhlciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMsCiAgICAgbmFtZWx5IEJOX2Zyb21fbW9udGdvbWVyeV93b3JkLiAgKFRvIGVuYWJsZSB0aGlzIG90aGVyd2lzZSwKICAgICBlLmcuIHg4Nl82NCwgdHJ5ICItRE1PTlRfRlJPTV9XT1JEX19fTk9OX0RFRkFVTFRfMF85XzhfQlVJTEQiLikKCiAgICAgW0FuZHkgUG9seWFrb3YgKGJhY2twb3J0IHBhcnRpYWxseSBieSBCb2RvIE1vZWxsZXIpXQoKICAqKSBBZGQgVExTIHNlc3Npb24gdGlja2V0IGNhbGxiYWNrLiBUaGlzIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBzZXQKICAgICBUTFMgdGlja2V0IGNpcGhlciBhbmQgSE1BQyBrZXlzIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gaGFyZGNvZGVkIGZpeGVkCiAgICAgdmFsdWVzLiBUaGlzIGlzIHVzZWZ1bCBmb3Iga2V5IHJvbGxvdmVyIGZvciBleGFtcGxlIHdoZXJlIHNldmVyYWwga2V5CiAgICAgc2V0cyBtYXkgZXhpc3Qgd2l0aCBkaWZmZXJlbnQgbmFtZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmV2ZXJzZSBFTkdJTkUtaW50ZXJuYWwgbG9naWMgZm9yIGNhY2hpbmcgZGVmYXVsdCBFTkdJTkUgaGFuZGxlcy4KICAgICBUaGlzIHdhcyBicm9rZW4gdW50aWwgbm93IGluIDAuOS44IHJlbGVhc2VzLCBzdWNoIHRoYXQgdGhlIG9ubHkgd2F5CiAgICAgYSByZWdpc3RlcmVkIEVOR0lORSBjb3VsZCBiZSB1c2VkIChhc3N1bWluZyBpdCBpbml0aWFsaXNlcwogICAgIHN1Y2Nlc3NmdWxseSBvbiB0aGUgaG9zdCkgd2FzIHRvIGV4cGxpY2l0bHkgc2V0IGl0IGFzIHRoZSBkZWZhdWx0CiAgICAgZm9yIHRoZSByZWxldmFudCBhbGdvcml0aG1zLiBUaGlzIGlzIGluIGNvbnRyYWRpY3Rpb24gd2l0aCAwLjkuNwogICAgIGJlaGF2aW91ciBhbmQgdGhlIGRvY3VtZW50YXRpb24uIFdpdGggdGhpcyBmaXgsIHdoZW4gYW4gRU5HSU5FIGlzCiAgICAgcmVnaXN0ZXJlZCBpbnRvIGEgZ2l2ZW4gYWxnb3JpdGhtJ3MgdGFibGUgb2YgaW1wbGVtZW50YXRpb25zLCB0aGUKICAgICAndXB0b2RhdGUnIGZsYWcgaXMgcmVzZXQgc28gdGhhdCBhdXRvLWRpc2NvdmVyeSB3aWxsIGJlIHVzZWQgbmV4dAogICAgIHRpbWUgYSBuZXcgY29udGV4dCBmb3IgdGhhdCBhbGdvcml0aG0gYXR0ZW1wdHMgdG8gc2VsZWN0IGFuCiAgICAgaW1wbGVtZW50YXRpb24uCiAgICAgW0lhbiBMaXN0ZXIgKHR3ZWFrZWQgYnkgR2VvZmYgVGhvcnBlKV0KCiAgKikgQmFja3BvcnQgb2YgQ01TIGNvZGUgdG8gT3BlblNTTCAwLjkuOC4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIDAuOS45CiAgICAgaW1wbGVtZW50aW9uIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKCiAgICAgTGFjayBvZiBFVlBfUEtFWV9BU04xX01FVEhPRCBtZWFucyBhbGdvcml0aG0gcGFyYW1ldGVycyBoYXZlIHRvIGJlCiAgICAgaGFyZCBjb2RlZC4KCiAgICAgTGFjayBvZiBCRVIgc3RyZWFtaW5nIHN1cHBvcnQgbWVhbnMgb25lIHBhc3Mgc3RyZWFtaW5nIHByb2Nlc3NpbmcgaXMKICAgICBvbmx5IHN1cHBvcnRlZCBpZiBkYXRhIGlzIGRldGFjaGVkOiBzZXR0aW5nIHRoZSBzdHJlYW1pbmcgZmxhZyBpcwogICAgIGlnbm9yZWQgZm9yIGVtYmVkZGVkIGNvbnRlbnQuCgogICAgIENNUyBzdXBwb3J0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgZXhwbGljaXRseSBlbmFibGVkCiAgICAgd2l0aCB0aGUgZW5hYmxlLWNtcyBjb25maWd1cmF0aW9uIG9wdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgdGhlIEdNUCBlbmdpbmUgZ2x1ZSB0byBkbyBkaXJlY3QgY29waWVzIGJldHdlZW4gQklHTlVNIGFuZAogICAgIG1wel90IHdoZW4gb3BlbnNzbCBhbmQgR01QIHVzZSB0aGUgc2FtZSBsaW1iIHNpemUuIE90aGVyd2lzZSB0aGUKICAgICBleGlzdGluZyAiY29udmVyc2lvbiB2aWEgYSB0ZXh0IHN0cmluZyBleHBvcnQiIHRyaWNrIGlzIHN0aWxsIHVzZWQuCiAgICAgW1BhdWwgU2hlZXIgPHBhdWxzaGVlckBnbWFpbC5jb20+XQoKICAqKSBabGliIGNvbXByZXNzaW9uIEJJTy4gVGhpcyBpcyBhIGZpbHRlciBCSU8gd2hpY2ggY29tcHJlc3NlZCBhbmQKICAgICB1bmNvbXByZXNzZXMgYW55IGRhdGEgcGFzc2VkIHRocm91Z2ggaXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEFFU193cmFwX2tleSgpIGFuZCBBRVNfdW53cmFwX2tleSgpIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQKICAgICBSRkMzMzk0IGNvbXBhdGlibGUgQUVTIGtleSB3cmFwcGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdXRpbGl0eSBmdW5jdGlvbnMgdG8gaGFuZGxlIEFTTjEgc3RydWN0dXJlcy4gQVNOMV9TVFJJTkdfc2V0MCgpOgogICAgIHNldHMgc3RyaW5nIGRhdGEgd2l0aG91dCBjb3B5aW5nLiBYNTA5X0FMR09SX3NldDAoKSBhbmQKICAgICBYNTA5X0FMR09SX2dldDAoKTogc2V0IGFuZCByZXRyaWV2ZSBYNTA5X0FMR09SIChBbGdvcml0aG1JZGVudGlmaWVyKQogICAgIGRhdGEuIEF0dHJpYnV0ZSBmdW5jdGlvbiBYNTA5YXRfZ2V0MF9kYXRhX2J5X09CSigpOiByZXRyaWV2ZXMgZGF0YQogICAgIGZyb20gYW4gWDUwOV9BVFRSSUJVVEUgc3RydWN0dXJlIG9wdGlvbmFsbHkgY2hlY2tpbmcgaXQgb2NjdXJzIG9ubHkKICAgICBvbmNlLiBBU04xX1RZUEVfc2V0MSgpOiBzZXQgYW5kIEFTTjFfVFlQRSBzdHJ1Y3R1cmUgY29weWluZyBzdXBwbGllZAogICAgIGRhdGEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IEJOIGZsYWcgaGFuZGxpbmcgaW4gUlNBX2VheV9tb2RfZXhwKCkgYW5kIEJOX01PTlRfQ1RYX3NldCgpCiAgICAgdG8gZ2V0IHRoZSBleHBlY3RlZCBCTl9GTEdfQ09OU1RUSU1FIGJlaGF2aW9yLgogICAgIFtCb2RvIE1vZWxsZXIgKEdvb2dsZSldCiAgCiAgKikgTmV0d2FyZSBzdXBwb3J0OgoKICAgICAtIGZpeGVkIHdyb25nIHVzYWdlIG9mIGlvY3Rsc29ja2V0KCkgd2hlbiBidWlsZCBmb3IgTElCQyBCU0Qgc29ja2V0cwogICAgIC0gZml4ZWQgZG9fdGVzdHMucGwgdG8gcnVuIHRoZSB0ZXN0IHN1aXRlIHdpdGggQ0xJQiBidWlsZHMgdG9vIChDTElCX09QVCkKICAgICAtIGFkZGVkIHNvbWUgbW9yZSB0ZXN0cyB0byBkb190ZXN0cy5wbAogICAgIC0gZml4ZWQgUnVubmluZ1Byb2Nlc3MgdXNhZ2Ugc28gdGhhdCBpdCB3b3JrcyB3aXRoIG5ld2VyIExJQkMgTkRLcyB0b28KICAgICAtIHJlbW92ZWQgdXNhZ2Ugb2YgQk5fTExPTkcgZm9yIENMSUIgYnVpbGRzIHRvIGF2b2lkIHJ1bnRpbWUgZGVwZW5kZW5jeQogICAgIC0gYWRkZWQgbmV3IENvbmZpZ3VyZSB0YXJnZXRzIG5ldHdhcmUtY2xpYi1ic2Rzb2NrLCBuZXR3YXJlLWNsaWItZ2NjLAogICAgICAgbmV0d2FyZS1jbGliLWJzZHNvY2stZ2NjLCBuZXR3YXJlLWxpYmMtYnNkc29jay1nY2MKICAgICAtIHZhcmlvdXMgY2hhbmdlcyB0byBuZXR3YXJlLnBsIHRvIGVuYWJsZSBnY2MtY3Jvc3MgYnVpbGRzIG9uIFdpbjMyCiAgICAgICBwbGF0Zm9ybQogICAgIC0gY2hhbmdlZCBjcnlwdG8vYmlvL2Jfc29jay5jIHRvIHdvcmsgd2l0aCBtYWNybyBmdW5jdGlvbnMgKENMSUIgQlNEKQogICAgIC0gdmFyaW91cyBjaGFuZ2VzIHRvIGZpeCBtaXNzaW5nIHByb3RvdHlwZSB3YXJuaW5ncwogICAgIC0gZml4ZWQgeDg2bmFzbS5wbCB0byBjcmVhdGUgY29ycmVjdCBhc20gZmlsZXMgZm9yIE5BU00gQ09GRiBvdXRwdXQKICAgICAtIGFkZGVkIEFFUywgV0hJUkxQT09MIGFuZCBDUFVJRCBhc3NlbWJsZXIgY29kZSB0byBidWlsZCBmaWxlcwogICAgIC0gYWRkZWQgbWlzc2luZyBBRVMgYXNzZW1ibGVyIG1ha2UgcnVsZXMgdG8gbWsxbWYucGwKICAgICAtIGZpeGVkIG9yZGVyIG9mIGluY2x1ZGVzIGluIGFwcHMvb2NzcC5jIHNvIHRoYXQgZV9vcy5oIHNldHRpbmdzIGFwcGx5CiAgICAgW0d1ZW50ZXIgS25hdWYgPGVmbGFzaEBnbXgubmV0Pl0KCiAgKikgSW1wbGVtZW50IGNlcnRpZmljYXRlIHN0YXR1cyByZXF1ZXN0IFRMUyBleHRlbnNpb24gZGVmaW5lZCBpbiBSRkMzNTQ2LgogICAgIEEgY2xpZW50IGNhbiBzZXQgdGhlIGFwcHJvcHJpYXRlIHBhcmFtZXRlcnMgYW5kIHJlY2VpdmUgdGhlIGVuY29kZWQKICAgICBPQ1NQIHJlc3BvbnNlIHZpYSBhIGNhbGxiYWNrLiBBIHNlcnZlciBjYW4gcXVlcnkgdGhlIHN1cHBsaWVkIHBhcmFtZXRlcnMKICAgICBhbmQgc2V0IHRoZSBlbmNvZGVkIE9DU1AgcmVzcG9uc2UgaW4gdGhlIGNhbGxiYWNrLiBBZGQgc2ltcGxpZmllZCBleGFtcGxlcwogICAgIHRvIHNfY2xpZW50IGFuZCBzX3NlcnZlci4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGYgYW5kIDAuOS44ZyAgWzE5IE9jdCAyMDA3XQoKICAqKSBGaXggdmFyaW91cyBidWdzOgogICAgICsgQmluYXJ5IGluY29tcGF0aWJpbGl0eSBvZiBzc2xfY3R4X3N0IHN0cnVjdHVyZQogICAgICsgRFRMUyBpbnRlcm9wZXJhdGlvbiB3aXRoIG5vbi1jb21wbGlhbnQgc2VydmVycwogICAgICsgRG9uJ3QgY2FsbCBnZXRfc2Vzc2lvbl9jYigpIHdpdGhvdXQgcHJvcG9zZWQgc2Vzc2lvbgogICAgICsgRml4IGlhNjQgYXNzZW1ibGVyIGNvZGUKICAgICBbQW5keSBQb2x5YWtvdiwgU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGUgYW5kIDAuOS44ZiAgWzExIE9jdCAyMDA3XQoKICAqKSBEVExTIEhhbmRzaGFrZSBvdmVyaGF1bC4gVGhlcmUgd2VyZSBsb25nc3RhbmRpbmcgaXNzdWVzIHdpdGgKICAgICBPcGVuU1NMIERUTFMgaW1wbGVtZW50YXRpb24sIHdoaWNoIHdlcmUgbWFraW5nIGl0IGltcG9zc2libGUgZm9yCiAgICAgUkZDIDQzNDcgY29tcGxpYW50IGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIE9wZW5TU0wgc2VydmVyLgogICAgIFVuZm9ydHVuYXRlbHkganVzdCBmaXhpbmcgdGhlc2UgaW5jb21wYXRpYmlsaXRpZXMgd291bGQgImN1dCBvZmYiCiAgICAgcHJlLTAuOS44ZiBjbGllbnRzLiBUbyBhbGxvdyBmb3IgaGFzc2xlIGZyZWUgdXBncmFkZSBwb3N0LTAuOS44ZQogICAgIHNlcnZlciBrZWVwcyB0b2xlcmF0aW5nIG5vbiBSRkMgY29tcGxpYW50IHN5bnRheC4gVGhlIG9wcG9zaXRlIGlzCiAgICAgbm90IHRydWUsIDAuOS44ZiBjbGllbnQgY2FuIG5vdCBjb21tdW5pY2F0ZSB3aXRoIGVhcmxpZXIgc2VydmVyLgogICAgIFRoaXMgdXBkYXRlIGV2ZW4gYWRkcmVzc2VzIENWRS0yMDA3LTQ5OTUuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIENoYW5nZXMgdG8gYXZvaWQgbmVlZCBmb3IgZnVuY3Rpb24gY2FzdHMgaW4gT3BlblNTTDogc29tZSBjb21waWxlcnMKICAgICAoZ2NjIDQuMiBhbmQgbGF0ZXIpIHJlamVjdCB0aGVpciB1c2UuCiAgICAgW0t1cnQgUm9lY2t4IDxrdXJ0QHJvZWNreC5iZT4sIFBldGVyIEhhcnRsZXkgPHBkaEB1dHRlci5jaGFvcy5vcmcudWs+LAogICAgICBTdGV2ZSBIZW5zb25dCiAgCiAgKikgQWRkIFJGQzQ1MDcgc3VwcG9ydCB0byBPcGVuU1NMLiBUaGlzIGluY2x1ZGVzIHRoZSBjb3JyZWN0aW9ucyBpbgogICAgIFJGQzQ1MDdiaXMuIFRoZSBlbmNyeXB0ZWQgdGlja2V0IGZvcm1hdCBpcyBhbiBlbmNyeXB0ZWQgZW5jb2RlZAogICAgIFNTTF9TRVNTSU9OIHN0cnVjdHVyZSwgdGhhdCB3YXkgbmV3IHNlc3Npb24gZmVhdHVyZXMgYXJlIGF1dG9tYXRpY2FsbHkKICAgICBzdXBwb3J0ZWQuCgogICAgIElmIGEgY2xpZW50IGFwcGxpY2F0aW9uIGNhY2hlcyBzZXNzaW9uIGluIGFuIFNTTF9TRVNTSU9OIHN0cnVjdHVyZQogICAgIHN1cHBvcnQgaXMgdHJhbnNwYXJlbnQgYmVjYXVzZSB0aWNrZXRzIGFyZSBub3cgc3RvcmVkIGluIHRoZSBlbmNvZGVkCiAgICAgU1NMX1NFU1NJT04uCiAgICAgCiAgICAgVGhlIFNTTF9DVFggc3RydWN0dXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGtleXMgZm9yIHRpY2tldAogICAgIHByb3RlY3Rpb24gaW4gc2VydmVycyBzbyBhZ2FpbiBzdXBwb3J0IHNob3VsZCBiZSBwb3NzaWJsZQogICAgIHdpdGggbm8gYXBwbGljYXRpb24gbW9kaWZpY2F0aW9uLgoKICAgICBJZiBhIGNsaWVudCBvciBzZXJ2ZXIgd2lzaGVzIHRvIGRpc2FibGUgUkZDNDUwNyBzdXBwb3J0IHRoZW4gdGhlIG9wdGlvbgogICAgIFNTTF9PUF9OT19USUNLRVQgY2FuIGJlIHNldC4KCiAgICAgQWRkIGEgVExTIGV4dGVuc2lvbiBkZWJ1Z2dpbmcgY2FsbGJhY2sgdG8gYWxsb3cgdGhlIGNvbnRlbnRzIG9mIGFueSBjbGllbnQKICAgICBvciBzZXJ2ZXIgZXh0ZW5zaW9ucyB0byBiZSBleGFtaW5lZC4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIFRMUyBleHRlbnNpb25zLCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBzZXJ2ZXJfbmFtZQogICAgIGV4dGVuc2lvbiBzbyBmYXIuICBUaGUgU1NMX1NFU1NJT04sIFNTTF9DVFgsIGFuZCBTU0wgZGF0YSBzdHJ1Y3R1cmVzIG5vdwogICAgIGhhdmUgbmV3IG1lbWJlcnMgZm9yIGEgaG9zdCBuYW1lLiAgVGhlIFNTTCBkYXRhIHN0cnVjdHVyZSBoYXMgYW4KICAgICBhZGRpdGlvbmFsIG1lbWJlciBTU0xfQ1RYICppbml0aWFsX2N0eCBzbyB0aGF0IG5ldyBzZXNzaW9ucyBjYW4gYmUKICAgICBzdG9yZWQgaW4gdGhhdCBjb250ZXh0IHRvIGFsbG93IGZvciBzZXNzaW9uIHJlc3VtcHRpb24sIGV2ZW4gYWZ0ZXIgdGhlCiAgICAgU1NMIGhhcyBiZWVuIHN3aXRjaGVkIHRvIGEgbmV3IFNTTF9DVFggaW4gcmVhY3Rpb24gdG8gYSBjbGllbnQncwogICAgIHNlcnZlcl9uYW1lIGV4dGVuc2lvbi4KCiAgICAgTmV3IGZ1bmN0aW9ucyAoc3ViamVjdCB0byBjaGFuZ2UpOgoKICAgICAgICAgU1NMX2dldF9zZXJ2ZXJuYW1lKCkKICAgICAgICAgU1NMX2dldF9zZXJ2ZXJuYW1lX3R5cGUoKQogICAgICAgICBTU0xfc2V0X1NTTF9DVFgoKQoKICAgICBOZXcgQ1RSTCBjb2RlcyBhbmQgbWFjcm9zIChzdWJqZWN0IHRvIGNoYW5nZSk6CgogICAgICAgICBTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQ0IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9jYWxsYmFjaygpCiAgICAgICAgIFNTTF9DVFJMX1NFVF9UTFNFWFRfU0VSVkVSTkFNRV9BUkcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2FyZygpCiAgICAgICAgIFNTTF9DVFJMX1NFVF9UTFNFWFRfSE9TVE5BTUUgICAgICAgICAgIC0gU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKCkKCiAgICAgb3BlbnNzbCBzX2NsaWVudCBoYXMgYSBuZXcgJy1zZXJ2ZXJuYW1lIC4uLicgb3B0aW9uLgoKICAgICBvcGVuc3NsIHNfc2VydmVyIGhhcyBuZXcgb3B0aW9ucyAnLXNlcnZlcm5hbWVfaG9zdCAuLi4nLCAnLWNlcnQyIC4uLicsCiAgICAgJy1rZXkyIC4uLicsICctc2VydmVybmFtZV9mYXRhbCcgKHN1YmplY3QgdG8gY2hhbmdlKS4gIFRoaXMgYWxsb3dzCiAgICAgdGVzdGluZyB0aGUgSG9zdE5hbWUgZXh0ZW5zaW9uIGZvciBhIHNwZWNpZmljIHNpbmdsZSBob3N0IG5hbWUgKCctY2VydCcKICAgICBhbmQgJy1rZXknIHJlbWFpbiBmYWxsYmFja3MgZm9yIGhhbmRzaGFrZXMgd2l0aG91dCBIb3N0TmFtZQogICAgIG5lZ290aWF0aW9uKS4gIElmIHRoZSB1bnJlY29nbml6ZWRfbmFtZSBhbGVydCBoYXMgdG8gYmUgc2VudCwgdGhpcyBieQogICAgIGRlZmF1bHQgaXMgYSB3YXJuaW5nOyBpdCBiZWNvbWVzIGZhdGFsIHdpdGggdGhlICctc2VydmVybmFtZV9mYXRhbCcKICAgICBvcHRpb24uCgogICAgIFtQZXRlciBTeWx2ZXN0ZXIsICBSZW15IEFsbGFpcywgQ2hyaXN0b3BoZSBSZW5vdSwgU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQUVTIGFuZCBTU0UyIGFzc2VtYmx5IGxhbmd1YWdlIHN1cHBvcnQgdG8gVkMrKyBidWlsZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNaXRpZ2F0ZSBhdHRhY2sgb24gZmluYWwgc3VidHJhY3Rpb24gaW4gTW9udGdvbWVyeSByZWR1Y3Rpb24uCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEZpeCBjcnlwdG8vZWMvZWNfbXVsdC5jIHRvIHdvcmsgcHJvcGVybHkgd2l0aCBzY2FsYXJzIG9mIHZhbHVlIDAKICAgICAod2hpY2ggcHJldmlvdXNseSBjYXVzZWQgYW4gaW50ZXJuYWwgZXJyb3IpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFNxdWVlemUgYW5vdGhlciAxMCUgb3V0IG9mIElHRSBtb2RlIHdoZW4gaW4gIT0gb3V0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBRVMgSUdFIG1vZGUgc3BlZWR1cC4KICAgICBbRGVhbiBHYXVkZXQgKEdvb2dsZSldCgogICopIEFkZCB0aGUgS29yZWFuIHN5bW1ldHJpYyAxMjgtYml0IGNpcGhlciBTRUVEIChzZWUKICAgICBodHRwOi8vd3d3Lmtpc2Eub3Iua3Iva2lzYS9zZWVkL2pzcC9zZWVkX2VuZy5qc3ApIGFuZAogICAgIGFkZCBTRUVEIGNpcGhlcnN1aXRlcyBmcm9tIFJGQyA0MTYyOgoKICAgICAgICBUTFNfUlNBX1dJVEhfU0VFRF9DQkNfU0hBICAgICAgPSAgIlNFRUQtU0hBIgogICAgICAgIFRMU19ESEVfRFNTX1dJVEhfU0VFRF9DQkNfU0hBICA9ICAiREhFLURTUy1TRUVELVNIQSIKICAgICAgICBUTFNfREhFX1JTQV9XSVRIX1NFRURfQ0JDX1NIQSAgPSAgIkRIRS1SU0EtU0VFRC1TSEEiCiAgICAgICAgVExTX0RIX2Fub25fV0lUSF9TRUVEX0NCQ19TSEEgID0gICJBREgtU0VFRC1TSEEiCgogICAgIFRvIG1pbmltaXplIGNoYW5nZXMgYmV0d2VlbiBwYXRjaGxldmVscyBpbiB0aGUgT3BlblNTTCAwLjkuOAogICAgIHNlcmllcywgU0VFRCByZW1haW5zIGV4Y2x1ZGVkIGZyb20gY29tcGlsYXRpb24gdW5sZXNzIE9wZW5TU0wKICAgICBpcyBjb25maWd1cmVkIHdpdGggJ2VuYWJsZS1zZWVkJy4KICAgICBbS0lTQSwgQm9kbyBNb2VsbGVyXQoKICAqKSBNaXRpZ2F0ZSBicmFuY2ggcHJlZGljdGlvbiBhdHRhY2tzLCB3aGljaCBjYW4gYmUgcHJhY3RpY2FsIGlmIGEKICAgICBzaW5nbGUgcHJvY2Vzc29yIGlzIHNoYXJlZCwgYWxsb3dpbmcgYSBzcHkgcHJvY2VzcyB0byBleHRyYWN0CiAgICAgaW5mb3JtYXRpb24uICBGb3IgZGV0YWlsZWQgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiwgc2VlCiAgICAgaHR0cDovL2VwcmludC5pYWNyLm9yZy8yMDA3LzAzOSAoTy4gQWNpaWNtZXosIFMuIEd1ZXJvbiwKICAgICBKLi1QLiBTZWlmZXJ0LCAiTmV3IEJyYW5jaCBQcmVkaWN0aW9uIFZ1bG5lcmFiaWxpdGllcyBpbiBPcGVuU1NMCiAgICAgYW5kIE5lY2Vzc2FyeSBTb2Z0d2FyZSBDb3VudGVybWVhc3VyZXMiKS4gIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UKICAgICBhcmUgbmV3IHZlcnNpb25zIEJOX2Rpdl9ub19icmFuY2goKSBhbmQKICAgICBCTl9tb2RfaW52ZXJzZV9ub19icmFuY2goKSBvZiBCTl9kaXYoKSBhbmQgQk5fbW9kX2ludmVyc2UoKSwKICAgICByZXNwZWN0aXZlbHksIHdoaWNoIGFyZSBzbG93ZXIsIGJ1dCBhdm9pZCB0aGUgc2VjdXJpdHktcmVsZXZhbnQKICAgICBjb25kaXRpb25hbCBicmFuY2hlcy4gIFRoZXNlIGFyZSBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSBCTl9kaXYoKQogICAgIGFuZCBCTl9tb2RfaW52ZXJzZSgpIGlmIHRoZSBmbGFnIEJOX0ZMR19DT05TVFRJTUUgaXMgc2V0IGZvciBvbmUKICAgICBvZiB0aGUgaW5wdXQgQklHTlVNcy4gIEFsc28sIEJOX2lzX2JpdF9zZXQoKSBoYXMgYmVlbiBjaGFuZ2VkIHRvCiAgICAgcmVtb3ZlIGEgY29uZGl0aW9uYWwgYnJhbmNoLgoKICAgICBCTl9GTEdfQ09OU1RUSU1FIGlzIHRoZSBuZXcgbmFtZSBmb3IgdGhlIHByZXZpb3VzCiAgICAgQk5fRkxHX0VYUF9DT05TVFRJTUUgZmxhZywgc2luY2UgaXQgbm93IGFmZmVjdHMgbW9yZSB0aGFuIGp1c3QKICAgICBtb2R1bGFyIGV4cG9uZW50aWF0aW9uLiAgKFNpbmNlIE9wZW5TU0wgMC45LjdoLCBzZXR0aW5nIHRoaXMgZmxhZwogICAgIGluIHRoZSBleHBvbmVudCBjYXVzZXMgQk5fbW9kX2V4cF9tb250KCkgdG8gdXNlIHRoZSBhbHRlcm5hdGl2ZQogICAgIGltcGxlbWVudGF0aW9uIGluIEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUoKS4pICBUaGUgb2xkIG5hbWUKICAgICByZW1haW5zIGFzIGEgZGVwcmVjYXRlZCBhbGlhcy4KCiAgICAgU2ltaWxhcnksIFJTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUgaXMgcmVwbGFjZWQgYnkgYSBtb3JlIGdlbmVyYWwKICAgICBSU0FfRkxBR19OT19DT05TVFRJTUUgZmxhZyBzaW5jZSB0aGUgUlNBIGltcGxlbWVudGF0aW9uIG5vdyB1c2VzCiAgICAgY29uc3RhbnQtdGltZSBpbXBsZW1lbnRhdGlvbnMgZm9yIG1vcmUgdGhhbiBqdXN0IGV4cG9uZW50aWF0aW9uLgogICAgIEhlcmUgdG9vIHRoZSBvbGQgbmFtZSBpcyBrZXB0IGFzIGEgZGVwcmVjYXRlZCBhbGlhcy4KCiAgICAgQk5fQkxJTkRJTkdfbmV3KCkgd2lsbCBub3cgdXNlIEJOX2R1cCgpIGZvciB0aGUgbW9kdWx1cyBzbyB0aGF0CiAgICAgdGhlIEJOX0JMSU5ESU5HIHN0cnVjdHVyZSBnZXRzIGFuIGluZGVwZW5kZW50IGNvcHkgb2YgdGhlCiAgICAgbW9kdWx1cy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgcHJldmlvdXMgIkJJR05VTSAqbSIgYXJndW1lbnQgdG8KICAgICBCTl9CTElORElOR19uZXcoKSBhbmQgdG8gQk5fQkxJTkRJTkdfY3JlYXRlX3BhcmFtKCkgbm93CiAgICAgZXNzZW50aWFsbHkgYmVjb21lcyAiY29uc3QgQklHTlVNICptIiwgYWx0aG91Z2ggd2UgY2FuJ3QgYWN0dWFsbHkKICAgICBjaGFuZ2UgdGhpcyBpbiB0aGUgaGVhZGVyIGZpbGUgYmVmb3JlIDAuOS45LiAgSXQgYWxsb3dzCiAgICAgUlNBX3NldHVwX2JsaW5kaW5nKCkgdG8gdXNlIEJOX3dpdGhfZmxhZ3MoKSBvbiB0aGUgbW9kdWx1cyB0bwogICAgIGVuYWJsZSBCTl9GTEdfQ09OU1RUSU1FLgoKICAgICBbTWF0dGhldyBEIFdvb2QgKEludGVsIENvcnApXQoKICAqKSBJbiB0aGUgU1NML1RMUyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24sIGJlIHN0cmljdCBhYm91dCBzZXNzaW9uIElECiAgICAgY29udGV4dCBtYXRjaGluZyAod2hpY2ggbWF0dGVycyBpZiBhbiBhcHBsaWNhdGlvbiB1c2VzIGEgc2luZ2xlCiAgICAgZXh0ZXJuYWwgY2FjaGUgZm9yIGRpZmZlcmVudCBwdXJwb3NlcykuICBQcmV2aW91c2x5LAogICAgIG91dC1vZi1jb250ZXh0IHJldXNlIHdhcyBmb3JiaWRkZW4gb25seSBpZiBTU0xfVkVSSUZZX1BFRVIgd2FzCiAgICAgc2V0LiAgVGhpcyBkaWQgZW5zdXJlIHN0cmljdCBjbGllbnQgdmVyaWZpY2F0aW9uLCBidXQgbWVhbnQgdGhhdCwKICAgICB3aXRoIGFwcGxpY2F0aW9ucyB1c2luZyBhIHNpbmdsZSBleHRlcm5hbCBjYWNoZSBmb3IgcXVpdGUKICAgICBkaWZmZXJlbnQgcmVxdWlyZW1lbnRzLCBjbGllbnRzIGNvdWxkIGNpcmN1bXZlbnQgY2lwaGVyc3VpdGUKICAgICByZXN0cmljdGlvbnMgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBJRCBjb250ZXh0IGJ5IHN0YXJ0aW5nIGEgc2Vzc2lvbgogICAgIGluIGEgZGlmZmVyZW50IGNvbnRleHQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5jbHVkZSAiIWVOVUxMIiBpbiBTU0xfREVGQVVMVF9DSVBIRVJfTElTVCB0byBtYWtlIHN1cmUgdGhhdAogICAgIGEgY2lwaGVyc3VpdGUgc3RyaW5nIHN1Y2ggYXMgIkRFRkFVTFQ6UlNBIiBjYW5ub3QgZW5hYmxlCiAgICAgYXV0aGVudGljYXRpb24tb25seSBjaXBoZXJzdWl0ZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXBkYXRlIHRoZSBTU0xfZ2V0X3NoYXJlZF9jaXBoZXJzKCkgZml4IENWRS0yMDA2LTM3Mzggd2hpY2ggd2FzCiAgICAgbm90IGNvbXBsZXRlIGFuZCBjb3VsZCBsZWFkIHRvIGEgcG9zc2libGUgc2luZ2xlIGJ5dGUgb3ZlcmZsb3cKICAgICAoQ1ZFLTIwMDctNTEzNSkgW0JlbiBMYXVyaWVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ZCBhbmQgMC45LjhlICBbMjMgRmViIDIwMDddCgogICopIFNpbmNlIEFFUzEyOCBhbmQgQUVTMjU2IChhbmQgc2ltaWxhcmx5IENhbWVsbGlhMTI4IGFuZAogICAgIENhbWVsbGlhMjU2KSBzaGFyZSBhIHNpbmdsZSBtYXNrIGJpdCBpbiB0aGUgbG9naWMgb2YKICAgICBzc2wvc3NsX2NpcGguYywgdGhlIGNvZGUgZm9yIG1hc2tpbmcgb3V0IGRpc2FibGVkIGNpcGhlcnMgbmVlZHMgYQogICAgIGtsdWRnZSB0byB3b3JrIHByb3Blcmx5IGlmIEFFUzEyOCBpcyBhdmFpbGFibGUgYW5kIEFFUzI1NiBpc24ndAogICAgIChvciBpZiBDYW1lbGxpYTEyOCBpcyBhdmFpbGFibGUgYW5kIENhbWVsbGlhMjU2IGlzbid0KS4KICAgICBbVmljdG9yIER1Y2hvdm5pXQoKICAqKSBGaXggdGhlIEJJVCBTVFJJTkcgZW5jb2RpbmcgZ2VuZXJhdGVkIGJ5IGNyeXB0by9lYy9lY19hc24xLmMKICAgICAod2l0aGluIGkyZF9FQ1ByaXZhdGVLZXksIGkyZF9FQ1BLUGFyYW1ldGVycywgaTJkX0VDUGFyYW1ldGVycyk6CiAgICAgV2hlbiBhIHBvaW50IG9yIGEgc2VlZCBpcyBlbmNvZGVkIGluIGEgQklUIFNUUklORywgd2UgbmVlZCB0bwogICAgIHByZXZlbnQgdGhlIHJlbW92YWwgb2YgdHJhaWxpbmcgemVybyBiaXRzIHRvIGdldCB0aGUgcHJvcGVyIERFUgogICAgIGVuY29kaW5nLiAgKEJ5IGRlZmF1bHQsIGNyeXB0by9hc24xL2FfYml0c3RyLmMgYXNzdW1lcyB0aGUgY2FzZQogICAgIG9mIGEgTmFtZWRCaXRMaXN0LCBmb3Igd2hpY2ggdHJhaWxpbmcgMCBiaXRzIG5lZWQgdG8gYmUgcmVtb3ZlZC4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSGF2ZSBTU0wvVExTIHNlcnZlciBpbXBsZW1lbnRhdGlvbiB0b2xlcmF0ZSAibWlzbWF0Y2hlZCIgcmVjb3JkCiAgICAgcHJvdG9jb2wgdmVyc2lvbiB3aGlsZSByZWNlaXZpbmcgQ2xpZW50SGVsbG8gZXZlbiBpZiB0aGUKICAgICBDbGllbnRIZWxsbyBpcyBmcmFnbWVudGVkLiAgKFRoZSBzZXJ2ZXIgY2FuJ3QgaW5zaXN0IG9uIHRoZQogICAgIHBhcnRpY3VsYXIgcHJvdG9jb2wgdmVyc2lvbiBpdCBoYXMgY2hvc2VuIGJlZm9yZSB0aGUgU2VydmVySGVsbG8KICAgICBtZXNzYWdlIGhhcyBpbmZvcm1lZCB0aGUgY2xpZW50IGFib3V0IGhpcyBjaG9pY2UuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBSRkMgMzc3OSBzdXBwb3J0LgogICAgIFtSb2IgQXVzdGVpbiBmb3IgQVJJTiwgQmVuIExhdXJpZV0KCiAgKikgTG9hZCBlcnJvciBjb2RlcyBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBwcmVzZW50IGluc3RlYWQgb2YgdXNpbmcgYQogICAgIHN0YXRpYyB2YXJpYWJsZS4gVGhpcyBhbGxvd3MgdGhlbSB0byBiZSBjbGVhbmx5IHVubG9hZGVkIGFuZCByZWxvYWRlZC4KICAgICBJbXByb3ZlIGhlYWRlciBmaWxlIGZ1bmN0aW9uIG5hbWUgcGFyc2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBleHRlbmQgU01UUCBhbmQgSU1BUCBwcm90b2NvbCBlbXVsYXRpb24gaW4gc19jbGllbnQgdG8gdXNlIEVITE8KICAgICBvciBDQVBBQklMSVRZIGhhbmRzaGFrZSBhcyByZXF1aXJlZCBieSBSRkNzLgogICAgIFtHb2V0eiBCYWJpbi1FYmVsbF0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhjIGFuZCAwLjkuOGQgIFsyOCBTZXAgMjAwNl0KCiAgKikgSW50cm9kdWNlIGxpbWl0cyB0byBwcmV2ZW50IG1hbGljaW91cyBrZXlzIGJlaW5nIGFibGUgdG8KICAgICBjYXVzZSBhIGRlbmlhbCBvZiBzZXJ2aWNlLiAgKENWRS0yMDA2LTI5NDApCiAgICAgW1N0ZXZlIEhlbnNvbiwgQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQVNOLjEgcGFyc2luZyBvZiBjZXJ0YWluIGludmFsaWQgc3RydWN0dXJlcyB0aGF0IGNhbiByZXN1bHQKICAgICBpbiBhIGRlbmlhbCBvZiBzZXJ2aWNlLiAgKENWRS0yMDA2LTI5MzcpICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYnVmZmVyIG92ZXJmbG93IGluIFNTTF9nZXRfc2hhcmVkX2NpcGhlcnMoKSBmdW5jdGlvbi4gCiAgICAgKENWRS0yMDA2LTM3MzgpIFtUYXZpcyBPcm1hbmR5IGFuZCBXaWxsIERyZXdyeSwgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIEZpeCBTU0wgY2xpZW50IGNvZGUgd2hpY2ggY291bGQgY3Jhc2ggaWYgY29ubmVjdGluZyB0byBhCiAgICAgbWFsaWNpb3VzIFNTTHYyIHNlcnZlci4gIChDVkUtMjAwNi00MzQzKQogICAgIFtUYXZpcyBPcm1hbmR5IGFuZCBXaWxsIERyZXdyeSwgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIFNpbmNlIDAuOS44YiwgY2lwaGVyc3VpdGUgc3RyaW5ncyBuYW1pbmcgZXhwbGljaXQgY2lwaGVyc3VpdGVzCiAgICAgbWF0Y2ggb25seSB0aG9zZS4gIEJlZm9yZSB0aGF0LCAiQUVTMjU2LVNIQSIgd291bGQgYmUgaW50ZXJwcmV0ZWQKICAgICBhcyBhIHBhdHRlcm4gYW5kIG1hdGNoICJBRVMxMjgtU0hBIiB0b28gKHNpbmNlIEFFUzEyOC1TSEEgZ290CiAgICAgdGhlIHNhbWUgc3RyZW5ndGggY2xhc3NpZmljYXRpb24gaW4gMC45LjdoKSBhcyB3ZSBjdXJyZW50bHkgb25seQogICAgIGhhdmUgYSBzaW5nbGUgQUVTIGJpdCBpbiB0aGUgY2lwaGVyc3VpdGUgZGVzY3JpcHRpb24gYml0bWFwLgogICAgIFRoYXQgY2hhbmdlLCBob3dldmVyLCBhbHNvIGFwcGxpZWQgdG8gY2lwaGVyc3VpdGUgc3RyaW5ncyBzdWNoIGFzCiAgICAgIlJDNC1NRDUiIHRoYXQgaW50ZW50aW9uYWxseSBtYXRjaGVkIG11bHRpcGxlIGNpcGhlcnN1aXRlcyAtLQogICAgIG5hbWVseSwgU1NMIDIuMCBjaXBoZXJzdWl0ZXMgaW4gYWRkaXRpb24gdG8gdGhlIG1vcmUgY29tbW9uIG9uZXMKICAgICBmcm9tIFNTTCAzLjAvVExTIDEuMC4KCiAgICAgU28gd2UgY2hhbmdlIHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIGFnYWluOiBOYW1pbmcgYW4gZXhwbGljaXQKICAgICBjaXBoZXJzdWl0ZSBzZWxlY3RzIHRoaXMgb25lIGNpcGhlcnN1aXRlLCBhbmQgYW55IG90aGVyIHNpbWlsYXIKICAgICBjaXBoZXJzdWl0ZSAoc2FtZSBiaXRtYXApIGZyb20gKm90aGVyKiBwcm90b2NvbCB2ZXJzaW9ucy4KICAgICBUaHVzLCAiUkM0LU1ENSIgYWdhaW4gd2lsbCBwcm9wZXJseSBzZWxlY3QgYm90aCB0aGUgU1NMIDIuMAogICAgIGNpcGhlcnN1aXRlIGFuZCB0aGUgU1NMIDMuMC9UTFMgMS4wIGNpcGhlcnN1aXRlLgoKICAgICBTaW5jZSBTU0wgMi4wIGRvZXMgbm90IGhhdmUgYW55IGNpcGhlcnN1aXRlcyBmb3Igd2hpY2ggdGhlCiAgICAgMTI4LzI1NiBiaXQgZGlzdGluY3Rpb24gd291bGQgYmUgcmVsZXZhbnQsIHRoaXMgd29ya3MgZm9yIG5vdy4KICAgICBUaGUgcHJvcGVyIGZpeCB3aWxsIGJlIHRvIHVzZSBkaWZmZXJlbnQgYml0cyBmb3IgQUVTMTI4IGFuZAogICAgIEFFUzI1Niwgd2hpY2ggd291bGQgaGF2ZSBhdm9pZGVkIHRoZSBwcm9ibGVtcyBmcm9tIHRoZSBiZWdpbm5pbmc7CiAgICAgaG93ZXZlciwgYml0cyBhcmUgc2NhcmNlLCBzbyB3ZSBjYW4gb25seSBkbyB0aGlzIGluIGEgbmV3IHJlbGVhc2UKICAgICAobm90IGp1c3QgYSBwYXRjaGxldmVsKSB3aGVuIHdlIGNhbiBjaGFuZ2UgdGhlIFNTTF9DSVBIRVIKICAgICBkZWZpbml0aW9uIHRvIHNwbGl0IHRoZSBzaW5nbGUgJ3Vuc2lnbmVkIGxvbmcgbWFzaycgYml0bWFwIGludG8KICAgICBtdWx0aXBsZSB2YWx1ZXMgdG8gZXh0ZW5kIHRoZSBhdmFpbGFibGUgc3BhY2UuCgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44YiBhbmQgMC45LjhjICBbMDUgU2VwIDIwMDZdCgogICopIEF2b2lkIFBLQ1MgIzEgdjEuNSBzaWduYXR1cmUgYXR0YWNrIGRpc2NvdmVyZWQgYnkgRGFuaWVsIEJsZWljaGVuYmFjaGVyCiAgICAgKENWRS0yMDA2LTQzMzkpICBbQmVuIExhdXJpZSBhbmQgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIEFkZCBBRVMgSUdFIGFuZCBiaUlHRSBtb2Rlcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2hhbmdlIHRoZSBVbml4IHJhbmRvbW5lc3MgZW50cm9weSBnYXRoZXJpbmcgdG8gdXNlIHBvbGwoKSB3aGVuCiAgICAgcG9zc2libGUgaW5zdGVhZCBvZiBzZWxlY3QoKSwgc2luY2UgdGhlIGxhdHRlciBoYXMgc29tZQogICAgIHVuZGVzaXJhYmxlIGxpbWl0YXRpb25zLgogICAgIFtEYXJyeWwgTWlsZXMgdmlhIFJpY2hhcmQgTGV2aXR0ZSBhbmQgQm9kbyBNb2VsbGVyXQoKICAqKSBEaXNhYmxlICJFQ0NkcmFmdCIgY2lwaGVyc3VpdGVzIG1vcmUgdGhvcm91Z2hseS4gIE5vdyBzcGVjaWFsCiAgICAgdHJlYXRtZW50IGluIHNzbC9zc2xfY2lwaC5zIG1ha2VzIHN1cmUgdGhhdCB0aGVzZSBjaXBoZXJzdWl0ZXMKICAgICBjYW5ub3QgYmUgaW1wbGljaXRseSBhY3RpdmF0ZWQgYXMgcGFydCBvZiwgZS5nLiwgdGhlICJBRVMiIGFsaWFzLgogICAgIEhvd2V2ZXIsIHBsZWFzZSB1cGdyYWRlIHRvIE9wZW5TU0wgMC45LjlbLWRldl0gZm9yCiAgICAgbm9uLWV4cGVyaW1lbnRhbCB1c2Ugb2YgdGhlIEVDQyBjaXBoZXJzdWl0ZXMgdG8gZ2V0IFRMUyBleHRlbnNpb24KICAgICBzdXBwb3J0LCB3aGljaCBpcyByZXF1aXJlZCBmb3IgY3VydmUgYW5kIHBvaW50IGZvcm1hdCBuZWdvdGlhdGlvbgogICAgIHRvIGF2b2lkIHBvdGVudGlhbCBoYW5kc2hha2UgcHJvYmxlbXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSByb2d1ZSBjaXBoZXJzdWl0ZXM6CgogICAgICAtIFNTTHYyIDB4MDggMHgwMCAweDgwICgiUkM0LTY0LU1ENSIpCiAgICAgIC0gU1NMdjMvVExTdjEgMHgwMCAweDYxICgiRVhQMTAyNC1SQzItQ0JDLU1ENSIpCiAgICAgIC0gU1NMdjMvVExTdjEgMHgwMCAweDYwICgiRVhQMTAyNC1SQzQtTUQ1IikKCiAgICAgVGhlIGxhdHRlciB0d28gd2VyZSBwdXJwb3J0ZWRseSBmcm9tCiAgICAgZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wWzAxXS50eHQsIGJ1dCBkbyBub3QgcmVhbGx5CiAgICAgYXBwZWFyIHRoZXJlLgoKICAgICBBbHNvIGRlYWN0aXZhdGUgdGhlIHJlbWFpbmluZyBjaXBoZXJzdWl0ZXMgZnJvbQogICAgIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMDEudHh0LiAgVGhlc2UgYXJlIGp1c3QgYXMKICAgICB1bm9mZmljaWFsLCBhbmQgdGhlIElEIGhhcyBsb25nIGV4cGlyZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IFJTQSBibGluZGluZyBIZWlzZW5idWcgKHByb2JsZW1zIHNvbWV0aW1lcyBvY2N1cmVkIG9uCiAgICAgZHVhbC1jb3JlIG1hY2hpbmVzKSBhbmQgb3RoZXIgcG90ZW50aWFsIHRocmVhZC1zYWZldHkgaXNzdWVzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCB0aGUgc3ltbWV0cmljIGNpcGhlciBDYW1lbGxpYSAoMTI4LWJpdCwgMTkyLWJpdCwgMjU2LWJpdCBrZXkKICAgICB2ZXJzaW9ucyksIHdoaWNoIGlzIG5vdyBhdmFpbGFibGUgZm9yIHJveWFsdHktZnJlZSB1c2UKICAgICAoc2VlIGh0dHA6Ly9pbmZvLmlzbC5udHQuY28uanAvY3J5cHQvZW5nL2luZm8vY2hpdGVraS5odG1sKS4KICAgICBBbHNvLCBhZGQgQ2FtZWxsaWEgVExTIGNpcGhlcnN1aXRlcyBmcm9tIFJGQyA0MTMyLgoKICAgICBUbyBtaW5pbWl6ZSBjaGFuZ2VzIGJldHdlZW4gcGF0Y2hsZXZlbHMgaW4gdGhlIE9wZW5TU0wgMC45LjgKICAgICBzZXJpZXMsIENhbWVsbGlhIHJlbWFpbnMgZXhjbHVkZWQgZnJvbSBjb21waWxhdGlvbiB1bmxlc3MgT3BlblNTTAogICAgIGlzIGNvbmZpZ3VyZWQgd2l0aCAnZW5hYmxlLWNhbWVsbGlhJy4KICAgICBbTlRUXQoKICAqKSBEaXNhYmxlIHRoZSBwYWRkaW5nIGJ1ZyBjaGVjayB3aGVuIGNvbXByZXNzaW9uIGlzIGluIHVzZS4gVGhlIHBhZGRpbmcKICAgICBidWcgY2hlY2sgYXNzdW1lcyB0aGUgZmlyc3QgcGFja2V0IGlzIG9mIGV2ZW4gbGVuZ3RoLCB0aGlzIGlzIG5vdAogICAgIG5lY2Vzc2FyaWx5IHRydWUgaWYgY29tcHJlc3NzaW9uIGlzIGVuYWJsZWQgYW5kIGNhbiByZXN1bHQgaW4gZmFsc2UKICAgICBwb3NpdGl2ZXMgY2F1c2luZyBoYW5kc2hha2UgZmFpbHVyZS4gVGhlIGFjdHVhbCBidWcgdGVzdCBpcyBhbmNpZW50CiAgICAgY29kZSBzbyBpdCBpcyBob3BlZCB0aGF0IGltcGxlbWVudGF0aW9ucyB3aWxsIGVpdGhlciBoYXZlIGZpeGVkIGl0IGJ5CiAgICAgbm93IG9yIGFueSB3aGljaCBzdGlsbCBoYXZlIHRoZSBidWcgZG8gbm90IHN1cHBvcnQgY29tcHJlc3Npb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhhIGFuZCAwLjkuOGIgIFswNCBNYXkgMjAwNl0KCiAgKikgV2hlbiBhcHBseWluZyBhIGNpcGhlciBydWxlIGNoZWNrIHRvIHNlZSBpZiBzdHJpbmcgbWF0Y2ggaXMgYW4gZXhwbGljaXQKICAgICBjaXBoZXIgc3VpdGUgYW5kIG9ubHkgbWF0Y2ggdGhhdCBvbmUgY2lwaGVyIHN1aXRlIGlmIGl0IGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIExpbmsgaW4gbWFuaWZlc3RzIGZvciBWQysrIGlmIG5lZWRlZC4KICAgICBbQXVzdGluIFppZWdsZXIgPGhhbG9zdGF0dWVAZ21haWwuY29tPl0KCiAgKikgVXBkYXRlIHN1cHBvcnQgZm9yIEVDQy1iYXNlZCBUTFMgY2lwaGVyc3VpdGVzIGFjY29yZGluZyB0bwogICAgIGRyYWZ0LWlldGYtdGxzLWVjYy0xMi50eHQgd2l0aCBwcm9wb3NlZCBjaGFuZ2VzIChidXQgd2l0aG91dAogICAgIFRMUyBleHRlbnNpb25zLCB3aGljaCBhcmUgc3VwcG9ydGVkIHN0YXJ0aW5nIHdpdGggdGhlIDAuOS45CiAgICAgYnJhbmNoLCBub3QgaW4gdGhlIE9wZW5TU0wgMC45LjggYnJhbmNoKS4KICAgICBbRG91Z2xhcyBTdGViaWxhXQoKICAqKSBOZXcgZnVuY3Rpb25zIEVWUF9DSVBIRVJfQ1RYX25ldygpIGFuZCBFVlBfQ0lQSEVSX0NUWF9mcmVlKCkgdG8gc3VwcG9ydAogICAgIG9wYXF1ZSBFVlBfQ0lQSEVSX0NUWCBoYW5kbGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyBhbmQgZW5oYW5jZW1lbnRzIHRvIHpsaWIgY29tcHJlc3Npb24gY29kZS4gV2Ugbm93IG9ubHkgdXNlCiAgICAgInpsaWIxLmRsbCIgYW5kIHVzZSB0aGUgZGVmYXVsdCBfX2NkZWNsIGNhbGxpbmcgY29udmVudGlvbiBvbiBXaW4zMgogICAgIHRvIGNvbmZvcm0gd2l0aCB0aGUgc3RhbmRhcmRzIG1lbnRpb25lZCBoZXJlOgogICAgICAgICAgIGh0dHA6Ly93d3cuemxpYi5uZXQvRExMX0ZBUS50eHQKICAgICBTdGF0aWMgemxpYiBsaW5raW5nIG5vdyB3b3JrcyBvbiBXaW5kb3dzIGFuZCB0aGUgbmV3IC0td2l0aC16bGliLWluY2x1ZGUKICAgICAtLXdpdGgtemxpYi1saWIgb3B0aW9ucyB0byBDb25maWd1cmUgY2FuIGJlIHVzZWQgdG8gc3VwcGx5IHRoZSBsb2NhdGlvbgogICAgIG9mIHRoZSBoZWFkZXJzIGFuZCBsaWJyYXJ5LiBHcmFjZWZ1bGx5IGhhbmRsZSBjYXNlIHdoZXJlIHpsaWIgbGlicmFyeQogICAgIGNhbid0IGJlIGxvYWRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTZXZlcmFsIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMgdG8gdGhlIE9JRCBnZW5lcmF0aW9uIGNvZGUuIFRoZSBvbGQgY29kZQogICAgIHNvbWV0aW1lcyBhbGxvd2VkIGludmFsaWQgT0lEcyAoMS5YIGZvciBYID49IDQwIGZvciBleGFtcGxlKSwgY291bGRuJ3QKICAgICBoYW5kbGUgbnVtYmVycyBsYXJnZXIgdGhhbiBVTE9OR19NQVgsIHRydW5jYXRlZCBwcmludGluZyBhbmQgaGFkIGEKICAgICBub24gc3RhbmRhcmQgT0JKX29iajJ0eHQoKSBiZWhhdmlvdXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIG9mIGVuZ2luZXMgdW5kZXIgZW5naW5lLyBhcyBzaGFyZWQgbGlicmFyaWVzCiAgICAgdW5kZXIgVkMrKyBidWlsZCBzeXN0ZW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29ycmVjdGVkIHRoZSBudW1lcm91cyBidWdzIGluIHRoZSBXaW4zMiBwYXRoIHNwbGl0dGVyIGluIERTTy4KICAgICBIb3BlZnVsbHksIHdlIHdpbGwgbm90IHNlZSBhbnkgZmFsc2UgY29tYmluYXRpb24gb2YgcGF0aHMgYW55IG1vcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjggYW5kIDAuOS44YSAgWzExIE9jdCAyMDA1XQoKICAqKSBSZW1vdmUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgU1NMX09QX01TSUVfU1NMVjJfUlNBX1BBRERJTkcKICAgICAocGFydCBvZiBTU0xfT1BfQUxMKS4gIFRoaXMgb3B0aW9uIHVzZWQgdG8gZGlzYWJsZSB0aGUKICAgICBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IG1hbi1pbi10aGUtbWlkZGxlIHByb3RvY29sLXZlcnNpb24KICAgICByb2xsYmFjayBpbiB0aGUgU1NMIDIuMCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIGEgYmFkCiAgICAgaWRlYS4gIChDVkUtMjAwNS0yOTY5KQoKICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IFl1dGFrYSBPaXdhIChSZXNlYXJjaCBDZW50ZXIKICAgICBmb3IgSW5mb3JtYXRpb24gU2VjdXJpdHksIE5hdGlvbmFsIEluc3RpdHV0ZSBvZiBBZHZhbmNlZCBJbmR1c3RyaWFsCiAgICAgU2NpZW5jZSBhbmQgVGVjaG5vbG9neSBbQUlTVF0sIEphcGFuKV0KCiAgKikgQWRkIHR3byBmdW5jdGlvbiB0byBjbGVhciBhbmQgcmV0dXJuIHRoZSB2ZXJpZnkgcGFyYW1ldGVyIGZsYWdzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEtlZXAgY2lwaGVybGlzdHMgc29ydGVkIGluIHRoZSBzb3VyY2UgaW5zdGVhZCBvZiBzb3J0aW5nIHRoZW0gYXQKICAgICBydW50aW1lLCB0aHVzIHJlbW92aW5nIHRoZSBuZWVkIGZvciBhIGxvY2suCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBBdm9pZCBzb21lIHNtYWxsIHN1Ymdyb3VwIGF0dGFja3MgaW4gRGlmZmllLUhlbGxtYW4uCiAgICAgW05pY2sgTWF0aGV3c29uIGFuZCBCZW4gTGF1cmllXQoKICAqKSBBZGQgZnVuY3Rpb25zIGZvciB3ZWxsLWtub3duIHByaW1lcy4KICAgICBbTmljayBNYXRoZXdzb25dCgogICopIEV4dGVuZGVkIFdpbmRvd3MgQ0Ugc3VwcG9ydC4KICAgICBbU2F0b3NoaSBOYWthbXVyYSBhbmQgQW5keSBQb2x5YWtvdl0KCiAgKikgSW5pdGlhbGl6ZSBTU0xfTUVUSE9EIHN0cnVjdHVyZXMgYXQgY29tcGlsZSB0aW1lIGluc3RlYWQgb2YgZHVyaW5nCiAgICAgcnVudGltZSwgdGh1cyByZW1vdmluZyB0aGUgbmVlZCBmb3IgYSBsb2NrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgUEtDUzdfZGVjcnlwdCgpIHdvcmsgZXZlbiBpZiBubyBjZXJ0aWZpY2F0ZSBpcyBzdXBwbGllZCBieQogICAgIGF0dGVtcHRpbmcgdG8gZGVjcnlwdCBlYWNoIGVuY3J5cHRlZCBrZXkgaW4gdHVybi4gQWRkIHN1cHBvcnQgdG8KICAgICBzbWltZSB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43aCBhbmQgMC45LjggIFswNSBKdWwgMjAwNV0KCiAgW05COiBPcGVuU1NMIDAuOS43aSBhbmQgbGF0ZXIgMC45LjcgcGF0Y2ggbGV2ZWxzIHdlcmUgcmVsZWFzZWQgYWZ0ZXIKICBPcGVuU1NMIDAuOS44Ll0KCiAgKikgQWRkIGxpYmNyeXB0by5wYyBhbmQgbGlic3NsLnBjIGZvciB0aG9zZSB3aG8gZmVlbCB0aGV5IG5lZWQgdGhlbS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgQ0Euc2ggYW5kIENBLnBsIHNvIHRoZXkgZG9uJ3QgYnVuZGxlIHRoZSBDU1IgYW5kIHRoZSBwcml2YXRlCiAgICAga2V5IGludG8gdGhlIHNhbWUgZmlsZSBhbnkgbW9yZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBXaW42NCwgYm90aCBJQTY0IGFuZCBBTUQ2NC94NjQgZmxhdm9ycy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIC11dGY4IGNvbW1hbmQgbGluZSBhbmQgY29uZmlnIGZpbGUgb3B0aW9uIHRvICdjYScuCiAgICAgW1N0ZWZhbiA8c3RmQHVkb21hLm9yZ10KCiAgKikgUmVtb3ZlZCB0aGUgbWFjcm8gZGVzX2NyeXB0KCksIGFzIGl0IHNlZW1zIHRvIGNvbmZsaWN0IHdpdGggc29tZQogICAgIGxpYnJhcmllcy4gIFVzZSBERVNfY3J5cHQoKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDb3JyZWN0IG5hbWluZyBvZiB0aGUgJ2NoaWwnIGFuZCAnNDc1OGNjYScgRU5HSU5Fcy4gVGhpcwogICAgIGludm9sdmVzIHJlbmFtaW5nIHRoZSBzb3VyY2UgYW5kIGdlbmVyYXRlZCBzaGFyZWQtbGlicyBmb3IKICAgICBib3RoLiBUaGUgZW5naW5lcyB3aWxsIGFjY2VwdCB0aGUgY29ycmVjdGVkIG9yIGxlZ2FjeSBpZHMKICAgICAoJ25jaXBoZXInIGFuZCAnNDc1OF9jY2EnIHJlc3BlY3RpdmVseSkgd2hlbiBiaW5kaW5nLiBOQiwKICAgICB0aGlzIG9ubHkgYXBwbGllcyB3aGVuIGJ1aWxkaW5nICdzaGFyZWQnLgogICAgIFtDb3Jpbm5hIFZpbnNjaGVuIDx2aW5zY2hlbkByZWRoYXQuY29tPiBhbmQgR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYXR0cmlidXRlIGZ1bmN0aW9ucyB0byBFVlBfUEtFWSBzdHJ1Y3R1cmUuIE1vZGlmeQogICAgIFBLQ1MxMl9jcmVhdGUoKSB0byByZWNvZ25pemUgYSBDU1AgbmFtZSBhdHRyaWJ1dGUgYW5kCiAgICAgdXNlIGl0LiBNYWtlIC1DU1Agb3B0aW9uIHdvcmsgYWdhaW4gaW4gcGtjczEyIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbmFsaXR5IHRvIHRoZSBibiBibGluZGluZyBjb2RlOgogICAgIC0gYXV0b21hdGljIHJlLWNyZWF0aW9uIG9mIHRoZSBCTl9CTElORElORyBwYXJhbWV0ZXJzIGFmdGVyCiAgICAgICBhIGZpeGVkIG51bWJlciBvZiB1c2VzIChjdXJyZW50bHkgMzIpCiAgICAgLSBhZGQgbmV3IGZ1bmN0aW9uIGZvciBwYXJhbWV0ZXIgY3JlYXRpb24KICAgICAtIGludHJvZHVjZSBmbGFncyB0byBjb250cm9sIHRoZSB1cGRhdGUgYmVoYXZpb3VyIG9mIHRoZQogICAgICAgQk5fQkxJTkRJTkcgcGFyYW1ldGVycwogICAgIC0gaGlkZSBCTl9CTElORElORyBzdHJ1Y3R1cmUKICAgICBBZGQgYSBzZWNvbmQgQk5fQkxJTkRJTkcgc2xvdCB0byB0aGUgUlNBIHN0cnVjdHVyZSB0byBpbXByb3ZlCiAgICAgcGVyZm9ybWFuY2Ugd2hlbiBhIHNpbmdsZSBSU0Egb2JqZWN0IGlzIHNoYXJlZCBhbW9uZyBzZXZlcmFsCiAgICAgdGhyZWFkcy4KICAgICBbTmlscyBMYXJzY2hdCgogICopIEFkZCBzdXBwb3J0IGZvciBEVExTLgogICAgIFtOYWdlbmRyYSBNb2RhZHVndSA8bmFnZW5kcmFAY3Muc3RhbmZvcmQuZWR1PiBhbmQgQmVuIExhdXJpZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIERFUiBlbmNvZGVkIHByaXZhdGUga2V5cyAoU1NMX0ZJTEVUWVBFX0FTTjEpCiAgICAgdG8gU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKCkgYW5kIFNTTF91c2VfUHJpdmF0ZUtleV9maWxlKCkKICAgICBbV2FsdGVyIEdvdWxldF0KCiAgKikgUmVtb3ZlIGJ1Z2d5IGFuZCBpbmNvbXBsZXRlIERIIGNlcnQgc3VwcG9ydCBmcm9tCiAgICAgc3NsL3NzbF9yc2EuYyBhbmQgc3NsL3MzX2JvdGguYwogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgVXNlIFNIQS0xIGluc3RlYWQgb2YgTUQ1IGFzIHRoZSBkZWZhdWx0IGRpZ2VzdCBhbGdvcml0aG0gZm9yCiAgICAgdGhlIGFwcHMvb3BlbnNzbCBhcHBsaWNhdGlvbnMuCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBDb21waWxlIGNsZWFuIHdpdGggIi1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzCiAgICAgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XZXJyb3IiLiBDdXJyZW50bHkKICAgICBERUJVR19TQUZFU1RBQ0sgbXVzdCBhbHNvIGJlIHNldC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2hhbmdlIC4vQ29uZmlndXJlIHNvIHRoYXQgY2VydGFpbiBhbGdvcml0aG1zIGNhbiBiZSBkaXNhYmxlZCBieSBkZWZhdWx0LgogICAgIFRoZSBuZXcgY291bnRlcnBpZWNlIHRvICJuby14eHgiIGlzICJlbmFibGUteHh4Ii4KCiAgICAgVGhlIHBhdGVudGVkIFJDNSBhbmQgTURDMiBhbGdvcml0aG1zIHdpbGwgbm93IGJlIGRpc2FibGVkIHVubGVzcwogICAgICJlbmFibGUtcmM1IiBhbmQgImVuYWJsZS1tZGMyIiwgcmVzcGVjdGl2ZWx5LCBhcmUgc3BlY2lmaWVkLgoKICAgICAoSURFQSByZW1haW5zIGVuYWJsZWQgZGVzcGl0ZSBiZWluZyBwYXRlbnRlZC4gIFRoaXMgaXMgYmVjYXVzZSBJREVBCiAgICAgaXMgZnJlcXVlbnRseSByZXF1aXJlZCBmb3IgaW50ZXJvcGVyYWJpbGl0eSwgYW5kIHRoZXJlIGlzIG5vIGxpY2Vuc2UKICAgICBmZWUgZm9yIG5vbi1jb21tZXJjaWFsIHVzZS4gIEFzIGJlZm9yZSwgIm5vLWlkZWEiIGNhbiBiZSB1c2VkIHRvCiAgICAgYXZvaWQgdGhpcyBhbGdvcml0aG0uKQoKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgcHJvY2Vzc2luZyBvZiBwcm94eSBjZXJ0aWZpY2F0ZXMgKHNlZSBSRkMgMzgyMCkuICBUaGlzIHdvcmsgd2FzCiAgICAgc3BvbnNvcmVkIGJ5IEtUSCAoVGhlIFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5IGluIFN0b2NraG9sbSkgYW5kCiAgICAgRUdFRSAoRW5hYmxpbmcgR3JpZHMgZm9yIEUtc2NpZW5jZSBpbiBFdXJvcGUpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFJDNCBwZXJmb3JtYW5jZSBvdmVyaGF1bCBvbiBtb2Rlcm4gYXJjaGl0ZWN0dXJlcy9pbXBsZW1lbnRhdGlvbnMsIHN1Y2gKICAgICBhcyBJbnRlbCBQNCwgSUEtNjQgYW5kIEFNRDY0LgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBOZXcgdXRpbGl0eSBleHRyYWN0LXNlY3Rpb24ucGwuIFRoaXMgY2FuIGJlIHVzZWQgc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZQogICAgIHNlY3Rpb24gbnVtYmVyIGluIGEgcG9kIGZpbGUgaW5zdGVhZCBvZiBoYXZpbmcgdG8gdHJlYXQgZWFjaCBmaWxlIGFzCiAgICAgYSBzZXBhcmF0ZSBjYXNlIGluIE1ha2VmaWxlLiBUaGlzIGNhbiBiZSBkb25lIGJ5IGFkZGluZyB0d28gbGluZXMgdG8gdGhlCiAgICAgcG9kIGZpbGU6CgogICAgID1mb3IgY29tbWVudCBvcGVuc3NsX3NlY3Rpb246WFhYCgogICAgIFRoZSBibGFuayBsaW5lIGlzIG1hbmRhdG9yeS4KCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGFyZ3VtZW50cyAtY2VydGZvcm0sIC1rZXlmb3JtIGFuZCAtcGFzcyBmb3Igc19jbGllbnQgYW5kIHNfc2VydmVyCiAgICAgdG8gYWxsb3cgYWx0ZXJuYXRpdmUgZm9ybWF0IGtleSBhbmQgY2VydGlmaWNhdGUgZmlsZXMgYW5kIHBhc3NwaHJhc2UKICAgICBzb3VyY2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBzdHJ1Y3R1cmUgWDUwOV9WRVJJRllfUEFSQU0gd2hpY2ggY29tYmluZXMgY3VycmVudCB2ZXJpZnkgcGFyYW1ldGVycywKICAgICB1cGRhdGUgYXNzb2NpYXRlZCBzdHJ1Y3R1cmVzIGFuZCBhZGQgdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucy4KCiAgICAgQWRkIG5ldyBwb2xpY3kgcmVsYXRlZCB2ZXJpZnkgcGFyYW1ldGVycywgaW5jbHVkZSBwb2xpY3kgY2hlY2tpbmcgaW4gCiAgICAgc3RhbmRhcmQgdmVyaWZ5IGNvZGUuIEVuaGFuY2UgJ3NtaW1lJyBhcHBsaWNhdGlvbiB3aXRoIGV4dHJhIHBhcmFtZXRlcnMKICAgICB0byBzdXBwb3J0IHBvbGljeSBjaGVja2luZyBhbmQgcHJpbnQgb3V0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIG5ldyBlbmdpbmUgdG8gc3VwcG9ydCBWSUEgUGFkTG9jayBBQ0UgZXh0ZW5zaW9ucyBpbiB0aGUgVklBIEMzCiAgICAgTmVoZW1pYWggcHJvY2Vzc29ycy4gVGhlc2UgZXh0ZW5zaW9ucyBzdXBwb3J0IEFFUyBlbmNyeXB0aW9uIGluIGhhcmR3YXJlCiAgICAgYXMgd2VsbCBhcyBSTkcgKHRob3VnaCBSTkcgc3VwcG9ydCBpcyBjdXJyZW50bHkgZGlzYWJsZWQpLgogICAgIFtNaWNoYWwgTHVkdmlnIDxtaWNoYWxAbG9naXguY3o+LCB3aXRoIGhlbHAgZnJvbSBBbmR5IFBvbHlha292XQoKICAqKSBEZXByZWNhdGUgQk5fW2dldHxzZXRdX3BhcmFtcygpIGZ1bmN0aW9ucyAodGhleSB3ZXJlIGlnbm9yZWQgaW50ZXJuYWxseSkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTmV3IEZJUFMgMTgwLTIgYWxnb3JpdGhtcywgU0hBLTIyNC8tMjU2Ly0zODQvLTUxMiBhcmUgaW1wbGVtZW50ZWQuCiAgICAgW0FuZHkgUG9seWFrb3YgYW5kIGEgbnVtYmVyIG9mIG90aGVyIHBlb3BsZV0KCiAgKikgSW1wcm92ZWQgUG93ZXJQQyBwbGF0Zm9ybSBzdXBwb3J0LiBNb3N0IG5vdGFibHkgQklHTlVNIGFzc2VtYmxlcgogICAgIGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IElCTS4KICAgICBbU3VyZXNoIENoYXJpLCBQZXRlciBXYWx0ZW5iZXJnLCBBbmR5IFBvbHlha292XQoKICAqKSBUaGUgbmV3ICdSU0FfZ2VuZXJhdGVfa2V5X2V4JyBmdW5jdGlvbiBub3cgdGFrZXMgYSBCSUdOVU0gZm9yIHRoZSBwdWJsaWMKICAgICBleHBvbmVudCByYXRoZXIgdGhhbiAndW5zaWduZWQgbG9uZycuIFRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBjaGFuZ2UgdG8KICAgICB0aGUgbmV3ICdyc2Ffa2V5Z2VuJyBlbGVtZW50IG9mIHRoZSBSU0FfTUVUSE9EIHN0cnVjdHVyZS4KICAgICBbSmVsdGUgSmFuc2VuLCBHZW9mZiBUaG9ycGVdCgogICopIEZ1bmN0aW9uYWxpdHkgZm9yIGNyZWF0aW5nIHRoZSBpbml0aWFsIHNlcmlhbCBudW1iZXIgZmlsZSBpcyBub3cKICAgICBtb3ZlZCBmcm9tIENBLnBsIHRvIHRoZSAnY2EnIHV0aWxpdHkgd2l0aCBhIG5ldyBvcHRpb24gLWNyZWF0ZV9zZXJpYWwuCgogICAgIChCZWZvcmUgT3BlblNTTCAwLjkuN2UsIENBLnBsIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc2VyaWFsCiAgICAgbnVtYmVyIGZpbGUgdG8gMSwgd2hpY2ggaXMgYm91bmQgdG8gY2F1c2UgcHJvYmxlbXMuICBUbyBhdm9pZAogICAgIHRoZSBwcm9ibGVtcyB3aGlsZSByZXNwZWN0aW5nIGNvbXBhdGliaWxpdHkgYmV0d2VlbiBkaWZmZXJlbnQgMC45LjcKICAgICBwYXRjaGxldmVscywgMC45LjdlICBlbXBsb3llZCAnb3BlbnNzbCB4NTA5IC1uZXh0X3NlcmlhbCcgaW4KICAgICBDQS5wbCBmb3Igc2VyaWFsIG51bWJlciBpbml0aWFsaXphdGlvbi4gIFdpdGggdGhlIG5ldyByZWxlYXNlIDAuOS44LAogICAgIHdlIGNhbiBmaXggdGhlIHByb2JsZW0gZGlyZWN0bHkgaW4gdGhlICdjYScgdXRpbGl0eS4pCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVkdWNlZCBoZWFkZXIgaW50ZXJkZXBlbmNpZXMgYnkgZGVjbGFyaW5nIG1vcmUgb3BhcXVlIG9iamVjdHMgaW4KICAgICBvc3NsX3R5cC5oLiBBcyBhIGNvbnNlcXVlbmNlLCBpbmNsdWRpbmcgc29tZSBoZWFkZXJzIChlZy4gZW5naW5lLmgpIHdpbGwKICAgICBnaXZlIGZld2VyIHJlY3Vyc2l2ZSBpbmNsdWRlcywgd2hpY2ggY291bGQgYnJlYWsgbGF6eSBzb3VyY2UgY29kZSAtIHNvCiAgICAgdGhpcyBjaGFuZ2UgaXMgY292ZXJlZCBieSB0aGUgT1BFTlNTTF9OT19ERVBSRUNBVEVEIHN5bWJvbC4gQXMgYWx3YXlzLAogICAgIGRldmVsb3BlcnMgc2hvdWxkIGRlZmluZSB0aGlzIHN5bWJvbCB3aGVuIGJ1aWxkaW5nIGFuZCB1c2luZyBvcGVuc3NsIHRvCiAgICAgZW5zdXJlIHRoZXkgdHJhY2sgdGhlIHJlY29tbWVuZGVkIGJlaGF2aW91ciwgaW50ZXJmYWNlcywgW2V0Y10sIGJ1dAogICAgIGJhY2t3YXJkcy1jb21wYXRpYmxlIGJlaGF2aW91ciBwcmV2YWlscyB3aGVuIHRoaXMgaXNuJ3QgZGVmaW5lZC4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOV9QT0xJQ1lfTk9ERV9wcmludCgpIHdoaWNoIHByaW50cyBvdXQgcG9saWN5IG5vZGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgRVZQIGZ1bmN0aW9uIEVWUF9DSVBIRVJfQ1RYX3JhbmRfa2V5IGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9uYWxpdHkuCiAgICAgVGhpcyB3aWxsIGdlbmVyYXRlIGEgcmFuZG9tIGtleSBvZiB0aGUgYXBwcm9wcmlhdGUgbGVuZ3RoIGJhc2VkIG9uIHRoZSAKICAgICBjaXBoZXIgY29udGV4dC4gVGhlIEVWUF9DSVBIRVIgY2FuIHByb3ZpZGUgaXRzIG93biByYW5kb20ga2V5IGdlbmVyYXRpb24KICAgICByb3V0aW5lIHRvIHN1cHBvcnQga2V5cyBvZiBhIHNwZWNpZmljIGZvcm0uIFRoaXMgaXMgdXNlZCBpbiB0aGUgZGVzIGFuZCAKICAgICAzZGVzIHJvdXRpbmVzIHRvIGdlbmVyYXRlIGEga2V5IG9mIHRoZSBjb3JyZWN0IHBhcml0eS4gVXBkYXRlIFMvTUlNRQogICAgIGNvZGUgdG8gdXNlIG5ldyBmdW5jdGlvbnMgYW5kIGhlbmNlIGdlbmVyYXRlIGNvcnJlY3QgcGFyaXR5IERFUyBrZXlzLgogICAgIEFkZCBFVlBfQ0hFQ0tfREVTX0tFWSAjZGVmaW5lIHRvIHJldHVybiBhbiBlcnJvciBpZiB0aGUga2V5IGlzIG5vdCAKICAgICB2YWxpZCAod2VhayBvciBpbmNvcnJlY3QgcGFyaXR5KS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBsb2NhbCBzZXQgb2YgQ1JMcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IFg1MDlfdmVyaWZ5X2NlcnQoKSBhcyB3ZWxsCiAgICAgYXMgbG9va2luZyB0aGVtIHVwLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSB2ZXJpZmllZCBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4KICAgICBDUkxzLCBmb3IgZXhhbXBsZSBQS0NTIzcgc2lnbmVkRGF0YS4gTW9kaWZ5IFBLQ1M3X3ZlcmlmeSgpIHRvIHVzZSBhbnkgQ1JMcwogICAgIHByZXNlbnQgdW5sZXNzIHRoZSBuZXcgUEtDUzdfTk9fQ1JMIGZsYWcgaXMgYXNzZXJ0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIEFTTjEgb2lkIGNvbmZpZ3VyYXRpb24gbW9kdWxlLiBJdCBub3cgYWRkaXRpb25hbGx5IGFjY2VwdHMgdGhlCiAgICAgc3ludGF4OgoKICAgICBzaG9ydE5hbWUgPSBzb21lIGxvbmcgbmFtZSwgMS4yLjMuNAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlaW1wbGVtZW50ZWQgdGhlIEJOX0NUWCBpbXBsZW1lbnRhdGlvbi4gVGhlcmUgaXMgbm93IG5vIG1vcmUgc3RhdGljCiAgICAgbGltaXRhdGlvbiBvbiB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlcyBpdCBjYW4gaGFuZGxlIG5vciB0aGUgZGVwdGggb2YgdGhlCiAgICAgInN0YWNrIiBoYW5kbGluZyBmb3IgQk5fQ1RYX3N0YXJ0KCkvQk5fQ1RYX2VuZCgpIHBhaXJzLiBUaGUgc3RhY2sKICAgICBpbmZvcm1hdGlvbiBjYW4gbm93IGV4cGFuZCBhcyByZXF1aXJlZCwgYW5kIHJhdGhlciB0aGFuIGhhdmluZyBhIHNpbmdsZQogICAgIHN0YXRpYyBhcnJheSBvZiBiaWdudW1zLCBCTl9DVFggbm93IHVzZXMgYSBsaW5rZWQtbGlzdCBvZiBzdWNoIGFycmF5cwogICAgIGFsbG93aW5nIGl0IHRvIGV4cGFuZCBvbiBkZW1hbmQgd2hpbHN0IG1haW50YWluaW5nIHRoZSB1c2VmdWxuZXNzIG9mCiAgICAgQk5fQ1RYJ3MgImJ1bmRsaW5nIi4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYSBtaXNzaW5nIEJOX0NUWCBwYXJhbWV0ZXIgdG8gdGhlICdyc2FfbW9kX2V4cCcgY2FsbGJhY2sgaW4gUlNBX01FVEhPRAogICAgIHRvIGFsbG93IGFsbCBSU0Egb3BlcmF0aW9ucyB0byBmdW5jdGlvbiB1c2luZyBhIHNpbmdsZSBCTl9DVFguCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgY2VydGlmaWNhdGUgcG9saWN5IGV2YWx1YXRpb24gYW5kIGNoZWNraW5nLiBUaGlzCiAgICAgaXMgaW5pdGlhbGx5IGludGVuZGVkIHRvIHBhc3MgdGhlIHRlc3RzIG91dGxpbmVkIGluICJDb25mb3JtYW5jZSBUZXN0aW5nCiAgICAgb2YgUmVseWluZyBQYXJ0eSBDbGllbnQgQ2VydGlmaWNhdGUgUGF0aCBQcm9jZXNzaW5nIExvZ2ljIiB2MS4wNy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBibl9kdXBfZXhwYW5kKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgaXQgd2FzIGludHJvZHVjZWQgaW4gMC45LjcgYW5kCiAgICAgcmVtYWluZWQgdW51c2VkIGFuZCBub3QgdGhhdCB1c2VmdWwuIEEgdmFyaWV0eSBvZiBvdGhlciBsaXR0bGUgYmlnbnVtCiAgICAgdHdlYWtzIGFuZCBmaXhlcyBoYXZlIGFsc28gYmVlbiBtYWRlIGNvbnRpbnVpbmcgb24gZnJvbSB0aGUgYXVkaXQgKHNlZQogICAgIGJlbG93KS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBDb25zdGlmeSBhbGwgb3IgYWxtb3N0IGFsbCBkMmksIGMyaSwgczJpIGFuZCByMmkgZnVuY3Rpb25zLCBhbG9uZyB3aXRoCiAgICAgYXNzb2NpYXRlZCBBU04xLCBFVlAgYW5kIFNTTCBmdW5jdGlvbnMgYW5kIG9sZCBBU04xIG1hY3Jvcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBCTl96ZXJvKCkgb25seSBuZWVkcyB0byBzZXQgJ3RvcCcgYW5kICduZWcnIHRvIHplcm8gZm9yIGNvcnJlY3QgcmVzdWx0cywKICAgICBhbmQgdGhpcyBzaG91bGQgbmV2ZXIgZmFpbC4gU28gdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSB1c2Ugb2YKICAgICBCTl9zZXRfd29yZCgpICh3aGljaCBjYW4gZmFpbCBkdWUgdG8gbmVlZGxlc3MgZXhwYW5zaW9uKSBpcyBub3cgZGVwcmVjYXRlZDsKICAgICBpZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQgaXMgZGVmaW5lZCwgQk5femVybygpIGlzIGEgdm9pZCBtYWNyby4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBCTl9DVFhfZ2V0KCkgc2hvdWxkIHJldHVybiB6ZXJvLXZhbHVlZCBiaWdudW1zLCBwcm92aWRpbmcgdGhlIHNhbWUKICAgICBpbml0aWFsaXNlZCB2YWx1ZSBhcyBCTl9uZXcoKS4KICAgICBbR2VvZmYgVGhvcnBlLCBzdWdnZXN0ZWQgYnkgVWxmIE32bGxlcl0KCiAgKikgU3VwcG9ydCBmb3IgaW5oaWJpdEFueVBvbGljeSBjZXJ0aWZpY2F0ZSBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQW4gYXVkaXQgb2YgdGhlIEJJR05VTSBjb2RlIGlzIHVuZGVyd2F5LCBmb3Igd2hpY2ggZGVidWdnaW5nIGNvZGUgaXMKICAgICBlbmFibGVkIHdoZW4gQk5fREVCVUcgaXMgZGVmaW5lZC4gVGhpcyBtYWtlcyBzdHJpY3RlciBlbmZvcmNlbWVudHMgb24gd2hhdAogICAgIGlzIGNvbnNpZGVyZWQgdmFsaWQgd2hlbiBwcm9jZXNzaW5nIEJJR05VTXMsIGFuZCBjYXVzZXMgZXhlY3V0aW9uIHRvCiAgICAgYXNzZXJ0KCkgd2hlbiBhIHByb2JsZW0gaXMgZGlzY292ZXJlZC4gSWYgQk5fREVCVUdfUkFORCBpcyBkZWZpbmVkLAogICAgIGZ1cnRoZXIgc3RlcHMgYXJlIHRha2VuIHRvIGRlbGliZXJhdGVseSBwb2xsdXRlIHVudXNlZCBkYXRhIGluIEJJR05VTQogICAgIHN0cnVjdHVyZXMgdG8gdHJ5IGFuZCBleHBvc2UgZmF1bHR5IGNvZGUgZnVydGhlciBvbi4gRm9yIG5vdywgb3BlbnNzbCB3aWxsCiAgICAgKGluIGl0cyBkZWZhdWx0IG1vZGUgb2Ygb3BlcmF0aW9uKSBjb250aW51ZSB0byB0b2xlcmF0ZSB0aGUgaW5jb25zaXN0ZW50CiAgICAgZm9ybXMgdGhhdCBpdCBoYXMgdG9sZXJhdGVkIGluIHRoZSBwYXN0LCBidXQgYXV0aG9ycyBhbmQgcGFja2FnZXJzIHNob3VsZAogICAgIGNvbnNpZGVyIHRyeWluZyBvcGVuc3NsIGFuZCB0aGVpciBvd24gYXBwbGljYXRpb25zIHdoZW4gY29tcGlsZWQgd2l0aAogICAgIHRoZXNlIGRlYnVnZ2luZyBzeW1ib2xzIGRlZmluZWQuIEl0IHdpbGwgaGVscCBoaWdobGlnaHQgcG90ZW50aWFsIGJ1Z3MgaW4KICAgICB0aGVpciBvd24gY29kZSwgYW5kIHdpbGwgaW1wcm92ZSB0aGUgdGVzdCBjb3ZlcmFnZSBmb3IgT3BlblNTTCBpdHNlbGYuIEF0CiAgICAgc29tZSBwb2ludCwgdGhlc2UgdGlnaHRlciBydWxlcyB3aWxsIGJlY29tZSBvcGVuc3NsJ3MgZGVmYXVsdCB0byBpbXByb3ZlCiAgICAgbWFpbnRhaW5hYmlsaXR5LCB0aG91Z2ggdGhlIGFzc2VydCgpcyBhbmQgb3RoZXIgb3ZlcmhlYWRzIHdpbGwgcmVtYWluIG9ubHkKICAgICBpbiBkZWJ1Z2dpbmcgY29uZmlndXJhdGlvbnMuIFNlZSBibi5oIGZvciBtb3JlIGRldGFpbHMuCiAgICAgW0dlb2ZmIFRob3JwZSwgTmlscyBMYXJzY2gsIFVsZiBN9mxsZXJdCgogICopIEJOX0NUWF9pbml0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgYXMgQk5fQ1RYIGlzIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUKICAgICB0aGF0IGNhbiBvbmx5IGJlIG9idGFpbmVkIHRocm91Z2ggQk5fQ1RYX25ldygpICh3aGljaCBpbXBsaWNpdGx5CiAgICAgaW5pdGlhbGlzZXMgaXQpLiBUaGUgcHJlc2VuY2Ugb2YgdGhpcyBmdW5jdGlvbiBvbmx5IG1hZGUgaXQgcG9zc2libGUKICAgICB0byBvdmVyd3JpdGUgYW4gZXhpc3Rpbmcgc3RydWN0dXJlIChhbmQgY2F1c2UgbWVtb3J5IGxlYWtzKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBCZWNhdXNlIG9mIHRoZSBjYWxsYmFjay1iYXNlZCBhcHByb2FjaCBmb3IgaW1wbGVtZW50aW5nIExIQVNIIGFzIGEKICAgICB0ZW1wbGF0ZSB0eXBlLCBsaF9pbnNlcnQoKSBhZGRzIG9wYXF1ZSBvYmplY3RzIHRvIGhhc2gtdGFibGVzIGFuZAogICAgIGxoX2RvYWxsKCkgb3IgbGhfZG9hbGxfYXJnKCkgYXJlIHR5cGljYWxseSB1c2VkIHdpdGggYSBkZXN0cnVjdG9yIGNhbGxiYWNrCiAgICAgdG8gY2xlYW4gdXAgdGhvc2UgY29ycmVzcG9uZGluZyBvYmplY3RzIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBoYXNoIHRhYmxlCiAgICAgKGFuZCBsb3NpbmcgdGhlIG9iamVjdCBwb2ludGVycykuIFNvIHNvbWUgb3Zlci16ZWFsb3VzIGNvbnN0aWZpY2F0aW9ucyBpbgogICAgIExIQVNIIGhhdmUgYmVlbiByZWxheGVkIHNvIHRoYXQgbGhfaW5zZXJ0KCkgZG9lcyBub3QgdGFrZSAobm9yIHN0b3JlKSB0aGUKICAgICBvYmplY3RzIGFzICJjb25zdCIgYW5kIHRoZSBsaF9kb2FsbFtfYXJnXSBjYWxsYmFjayB3cmFwcGVycyBhcmUgbm90CiAgICAgcHJvdG90eXBlZCB0byBoYXZlICJjb25zdCIgcmVzdHJpY3Rpb25zIG9uIHRoZSBvYmplY3QgcG9pbnRlcnMgdGhleSBhcmUKICAgICBnaXZlbiAoYW5kIHNvIGFyZW4ndCByZXF1aXJlZCB0byBjYXN0IHRoZW0gYXdheSBhbnkgbW9yZSkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgVGhlIHRtZGlmZi5oIEFQSSB3YXMgc28gdWdseSBhbmQgbWluaW1hbCB0aGF0IG91ciBvd24gdGltaW5nIHV0aWxpdHkKICAgICAoc3BlZWQpIHByZWZlcnMgdG8gdXNlIGl0cyBvd24gaW1wbGVtZW50YXRpb24uIFRoZSB0d28gaW1wbGVtZW50YXRpb25zCiAgICAgaGF2ZW4ndCBiZWVuIGNvbnNvbGlkYXRlZCBhcyB5ZXQgKHZvbHVudGVlcnM/KSBidXQgdGhlIHRtZGlmZiBBUEkgaGFzIGhhZAogICAgIGl0cyBvYmplY3QgdHlwZSBwcm9wZXJseSBleHBvc2VkIChNU19UTSkgaW5zdGVhZCBvZiBjYXN0aW5nIHRvL2Zyb20gImNoYXIKICAgICAqIi4gVGhpcyBtYXkgc3RpbGwgY2hhbmdlIHlldCBpZiBzb21lb25lIHJlYWxpc2VzIE1TX1RNIGFuZCAibXNfdGltZV8qKioiCiAgICAgYXJlbid0IG5lY2Vzc2FyaWx5IHRoZSBncmVhdGVzdCBub21lbmNsYXR1cmVzIC0gYnV0IHRoaXMgaXMgd2hhdCB3YXMgdXNlZAogICAgIGludGVybmFsbHkgdG8gdGhlIGltcGxlbWVudGF0aW9uIHNvIEkndmUgdXNlZCB0aGF0IGZvciBub3cuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgRW5zdXJlIHRoYXQgZGVwcmVjYXRlZCBmdW5jdGlvbnMgZG8gbm90IGdldCBjb21waWxlZCB3aGVuCiAgICAgT1BFTlNTTF9OT19ERVBSRUNBVEVEIGlzIGRlZmluZWQuIFNvbWUgIm9wZW5zc2wiIHN1YmNvbW1hbmRzIGFuZCBhIGZldyBvZgogICAgIHRoZSBzZWxmLXRlc3RzIHdlcmUgc3RpbGwgdXNpbmcgZGVwcmVjYXRlZCBrZXktZ2VuZXJhdGlvbiBmdW5jdGlvbnMgc28KICAgICB0aGVzZSBoYXZlIGJlZW4gdXBkYXRlZCBhbHNvLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFJlb3JnYW5pc2UgUEtDUyM3IGNvZGUgdG8gc2VwYXJhdGUgdGhlIGRpZ2VzdCBsb2NhdGlvbiBmdW5jdGlvbmFsaXR5CiAgICAgaW50byBQS0NTN19maW5kX2RpZ2VzdCgpLCBkaWdlc3QgYWRkaXRpb24gaW50byBQS0NTN19iaW9fYWRkX2RpZ2VzdCgpLgogICAgIE5ldyBmdW5jdGlvbiBQS0NTN19zZXRfZGlnZXN0KCkgdG8gc2V0IHRoZSBkaWdlc3QgdHlwZSBmb3IgUEtDUyM3CiAgICAgZGlnZXN0ZWREYXRhIHR5cGUuIEFkZCBhZGRpdGlvbmFsIGNvZGUgdG8gY29ycmVjdGx5IGdlbmVyYXRlIHRoZQogICAgIGRpZ2VzdGVkRGF0YSB0eXBlIGFuZCBhZGQgc3VwcG9ydCBmb3IgdGhpcyB0eXBlIGluIFBLQ1M3IGluaXRpYWxpemF0aW9uCiAgICAgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBQS0NTN19zZXQwX3R5cGVfb3RoZXIoKSB0aGlzIGluaXRpYWxpemVzIGEgUEtDUzcgCiAgICAgc3RydWN0dXJlIG9mIHR5cGUgIm90aGVyIi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggcHJpbWUgZ2VuZXJhdGlvbiBsb29wIGluIGNyeXB0by9ibi9ibl9wcmltZS5wbCBieSBtYWtpbmcKICAgICBzdXJlIHRoZSBsb29wIGRvZXMgY29ycmVjdGx5IHN0b3AgYW5kIGJyZWFraW5nICgiZGl2aXNpb24gYnkgemVybyIpCiAgICAgbW9kdWx1cyBvcGVyYXRpb25zIGFyZSBub3QgcGVyZm9ybWVkLiBUaGUgKHByZS1nZW5lcmF0ZWQpIHByaW1lCiAgICAgdGFibGUgY3J5cHRvL2JuL2JuX3ByaW1lLmggd2FzIGFscmVhZHkgY29ycmVjdCwgYnV0IGl0IGNvdWxkIG5vdCBiZQogICAgIHJlLWdlbmVyYXRlZCBvbiBzb21lIHBsYXRmb3JtcyBiZWNhdXNlIG9mIHRoZSAiZGl2aXNpb24gYnkgemVybyIKICAgICBzaXR1YXRpb24gaW4gdGhlIHNjcmlwdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgVXBkYXRlIHN1cHBvcnQgZm9yIEVDQy1iYXNlZCBUTFMgY2lwaGVyc3VpdGVzIGFjY29yZGluZyB0bwogICAgIGRyYWZ0LWlldGYtdGxzLWVjYy0wMy50eHQ6IHRoZSBLREYxIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIHdpdGgKICAgICBTSEEtMSBub3cgaXMgb25seSB1c2VkIGZvciAic21hbGwiIGN1cnZlcyAod2hlcmUgdGhlCiAgICAgcmVwcmVzZW50YXRpb24gb2YgYSBmaWVsZCBlbGVtZW50IHRha2VzIHVwIHRvIDI0IGJ5dGVzKTsgZm9yCiAgICAgbGFyZ2VyIGN1cnZlcywgdGhlIGZpZWxkIGVsZW1lbnQgcmVzdWx0aW5nIGZyb20gRUNESCBpcyBkaXJlY3RseQogICAgIHVzZWQgYXMgcHJlbWFzdGVyIHNlY3JldC4KICAgICBbRG91Z2xhcyBTdGViaWxhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBjb2RlIGZvciBrUCtsUSB0aW1pbmdzIHRvIGNyeXB0by9lYy9lY3Rlc3QuYywgYW5kIGFkZCBTRUMyCiAgICAgY3VydmUgc2VjcDE2MHIxIHRvIHRoZSB0ZXN0cy4KICAgICBbRG91Z2xhcyBTdGViaWxhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gbG9hZCBzeW1ib2xzIGdsb2JhbGx5IHdpdGggRFNPLgogICAgIFtH9nR6IEJhYmluLUViZWxsIDxiYWJpbi1lYmVsbEB0cnVzdGNlbnRlci5kZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBmdW5jdGlvbnMgRVJSX3NldF9tYXJrKCkgYW5kIEVSUl9wb3BfdG9fbWFyaygpIGZvciBiZXR0ZXIKICAgICBjb250cm9sIG9mIHRoZSBlcnJvciBzdGFjay4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgU1RPUkUgaW4gRU5HSU5FLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgU1RPUkUgdHlwZS4gIFRoZSBpbnRlbnRpb24gaXMgdG8gcHJvdmlkZSBhIGNvbW1vbiBpbnRlcmZhY2UKICAgICB0byBjZXJ0aWZpY2F0ZSBhbmQga2V5IHN0b3JlcywgYmUgdGhleSBzaW1wbGUgZmlsZS1iYXNlZCBzdG9yZXMsIG9yCiAgICAgSFNNLXR5cGUgc3RvcmUsIG9yIExEQVAgc3RvcmVzLCBvci4uLgogICAgIE5PVEU6IFRoZSBjb2RlIGlzIGN1cnJlbnRseSBVTlRFU1RFRCBhbmQgaXNuJ3QgcmVhbGx5IHVzZWQgYW55d2hlcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGEgZ2VuZXJpYyBzdHJ1Y3R1cmUgY2FsbGVkIE9QRU5TU0xfSVRFTS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8KICAgICBwYXNzIGEgbGlzdCBvZiBhcmd1bWVudHMgdG8gYW55IGZ1bmN0aW9uIGFzIHdlbGwgYXMgcHJvdmlkZSBhIHdheQogICAgIGZvciBhIGZ1bmN0aW9uIHRvIHBhc3MgZGF0YSBiYWNrIHRvIHRoZSBjYWxsZXIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBmdW5jdGlvbnMgQlVGX3N0cm5kdXAoKSBhbmQgQlVGX21lbWR1cCgpLiAgQlVGX3N0cm5kdXAoKQogICAgIHdvcmtzIGxpa2UgQlVGX3N0cmR1cCgpIGJ1dCBjYW4gYmUgdXNlZCB0byBkdXBsaWNhdGUgYSBwb3J0aW9uIG9mCiAgICAgYSBzdHJpbmcuICBUaGUgY29weSBnZXRzIE5VTC10ZXJtaW5hdGVkLiAgQlVGX21lbWR1cCgpIGR1cGxpY2F0ZXMKICAgICBhIG1lbW9yeSBhcmVhLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZnVuY3Rpb24gc2tfZmluZF9leCgpIHdoaWNoIHdvcmtzIGxpa2Ugc2tfZmluZCgpLCBidXQgd2lsbAogICAgIHJldHVybiBhbiBpbmRleCB0byBhbiBlbGVtZW50IGV2ZW4gaWYgYW4gZXhhY3QgbWF0Y2ggY291bGRuJ3QgYmUKICAgICBmb3VuZC4gIFRoZSBpbmRleCBpcyBndWFyYW50ZWVkIHRvIHBvaW50IGF0IHRoZSBlbGVtZW50IHdoZXJlIHRoZQogICAgIHNlYXJjaGVkLWZvciBrZXkgd291bGQgYmUgaW5zZXJ0ZWQgdG8gcHJlc2VydmUgc29ydGluZyBvcmRlci4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZ1bmN0aW9uIE9CSl9ic2VhcmNoX2V4KCkgd2hpY2ggd29ya3MgbGlrZSBPQkpfYnNlYXJjaCgpIGJ1dAogICAgIHRha2VzIGFuIGV4dHJhIGZsYWdzIGFyZ3VtZW50IGZvciBvcHRpb25hbCBmdW5jdGlvbmFsaXR5LiAgQ3VycmVudGx5LAogICAgIHRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIGRlZmluZWQ6CgoJT0JKX0JTRUFSQ0hfVkFMVUVfT05fTk9NQVRDSAoJVGhpcyBvbmUgZ2V0cyBPQkpfYnNlYXJjaF9leCgpIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0CgllbGVtZW50IHdoZXJlIHRoZSBjb21wYXJpbmcgZnVuY3Rpb24gcmV0dXJucyBhIG5lZ2F0aXZlIG9yIHplcm8KCW51bWJlci4KCglPQkpfQlNFQVJDSF9GSVJTVF9WQUxVRV9PTl9NQVRDSAoJVGhpcyBvbmUgZ2V0cyBPQkpfYnNlYXJjaF9leCgpIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0CgllbGVtZW50IHdoZXJlIHRoZSBjb21wYXJpbmcgZnVuY3Rpb24gcmV0dXJucyB6ZXJvLiAgVGhpcyBpcyB1c2VmdWwKCWlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGVsZW1lbnQgd2hlcmUgdGhlIGNvbXBhcmluZyBmdW5jdGlvbgoJcmV0dXJucyB6ZXJvLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gY3JlYXRlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlcyB3aXRoICdvcGVuc3NsIGNhJwogICAgIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgYmVjb21lcyBwYXJ0IG9mIHRoZQogICAgIENBIGRhdGFiYXNlIGFuZCB1c2VzIHRoZSBzYW1lIG1lY2hhbmlzbXMgZm9yIHNlcmlhbCBudW1iZXIgZ2VuZXJhdGlvbgogICAgIGFzIGFsbCBvdGhlciBjZXJ0aWZpY2F0ZSBzaWduaW5nLiAgVGhlIG5ldyBmbGFnICctc2VsZnNpZ24nIGVuYWJsZXMKICAgICB0aGlzIGZ1bmN0aW9uYWxpdHkuICBBZGFwdCBDQS5zaCBhbmQgQ0EucGwuaW4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgdGhlIHB1YmxpYyBrZXkgb2YgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0CiAgICAgYWdhaW5zdCBhIGdpdmVuIHByaXZhdGUuICBUaGlzIGlzIHVzZWZ1bCB0byBjaGVjayB0aGF0IGEgY2VydGlmaWNhdGUKICAgICByZXF1ZXN0IGNhbiBiZSBzaWduZWQgYnkgdGhhdCBrZXkgKHNlbGYtc2lnbmluZykuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGFjdGl2ZSBjZXJ0aWZpY2F0ZXMgd2l0aCB0aGUgc2FtZQogICAgIHN1YmplY3QgaW4gdGhlIENBIGluZGV4IGZpbGUuICBUaGlzIGlzIGRvbmUgb25seSBpZiB0aGUga2V5d29yZAogICAgICd1bmlxdWVfc3ViamVjdCcgaXMgc2V0IHRvICdubycgaW4gdGhlIG1haW4gQ0Egc2VjdGlvbiAoZGVmYXVsdAogICAgIGlmICdDQV9kZWZhdWx0Jykgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSB2YWx1ZSBpcyBzYXZlZAogICAgIHdpdGggdGhlIGRhdGFiYXNlIGl0c2VsZiBpbiBhIHNlcGFyYXRlIGluZGV4IGF0dHJpYnV0ZSBmaWxlLAogICAgIG5hbWVkIGxpa2UgdGhlIGluZGV4IGZpbGUgd2l0aCAnLmF0dHInIGFwcGVuZGVkIHRvIHRoZSBuYW1lLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEdlbmVyYXRlIG11dGkgdmFsdWVkIEFWQXMgdXNpbmcgJysnIG5vdGF0aW9uIGluIGNvbmZpZyBmaWxlcyBmb3IKICAgICByZXEgYW5kIGRpck5hbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgbmFtZUNvbnN0cmFpbnRzIGNlcnRpZmljYXRlIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBwb2xpY3lDb25zdHJhaW50cyBjZXJ0aWZpY2F0ZSBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgcG9saWN5TWFwcGluZ3MgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCBEU0FfTUVUSE9EIGltcGxlbWVudGF0aW9uIG9ubHkgdXNlcyBpdHMKICAgICBkc2FfbW9kX2V4cCgpIGFuZC9vciBibl9tb2RfZXhwKCkgaGFuZGxlcnMgaWYgdGhleSBhcmUgbm9uLU5VTEwsCiAgICAgYW5kIGNoYW5nZSBpdHMgb3duIGhhbmRsZXJzIHRvIGJlIE5VTEwgc28gYXMgdG8gcmVtb3ZlIHVubmVjZXNzYXJ5CiAgICAgaW5kaXJlY3Rpb24uIFRoaXMgbGV0cyBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgZmFsbGJhY2sgdG8gdGhlCiAgICAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBtb3JlIGVhc2lseS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBTdXBwb3J0IGZvciBkaXJlY3RvcnlOYW1lIGluIEdlbmVyYWxOYW1lIHJlbGF0ZWQgZXh0ZW5zaW9ucwogICAgIGluIGNvbmZpZyBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGxpbmsgYXBwbGljYXRpb25zIHVzaW5nIE1ha2VmaWxlLnNoYXJlZC4KICAgICBNYWtlIHRoYXQgcG9zc2libGUgZXZlbiB3aGVuIGxpbmtpbmcgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzIQogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFN1cHBvcnQgZm9yIHNpbmdsZSBwYXNzIHByb2Nlc3NpbmcgZm9yIFMvTUlNRSBzaWduaW5nLiBUaGlzIG5vdwogICAgIG1lYW5zIHRoYXQgUy9NSU1FIHNpZ25pbmcgY2FuIGJlIGRvbmUgZnJvbSBhIHBpcGUsIGluIGFkZGl0aW9uCiAgICAgY2xlYXJ0ZXh0IHNpZ25pbmcgKG11bHRpcGFydC9zaWduZWQgdHlwZSkgaXMgZWZmZWN0aXZlbHkgc3RyZWFtaW5nCiAgICAgYW5kIHRoZSBzaWduZWQgZGF0YSBkb2VzIG5vdCBuZWVkIHRvIGJlIGFsbCBoZWxkIGluIG1lbW9yeS4KCiAgICAgVGhpcyBpcyBkb25lIHdpdGggYSBuZXcgZmxhZyBQS0NTN19TVFJFQU0uIFdoZW4gdGhpcyBmbGFnIGlzIHNldAogICAgIFBLQ1M3X3NpZ24oKSBvbmx5IGluaXRpYWxpemVzIHRoZSBQS0NTNyBzdHJ1Y3R1cmUgYW5kIHRoZSBhY3R1YWwgc2lnbmluZwogICAgIGlzIGRvbmUgYWZ0ZXIgdGhlIGRhdGEgaXMgb3V0cHV0IChhbmQgZGlnZXN0cyBjYWxjdWxhdGVkKSBpbgogICAgIFNNSU1FX3dyaXRlX1BLQ1M3KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bGwgc3VwcG9ydCBmb3IgLXJwYXRoLy1SLCBib3RoIGluIHNoYXJlZCBsaWJyYXJpZXMgYW5kCiAgICAgYXBwbGljYXRpb25zLCBhdCBsZWFzdCBvbiB0aGUgcGxhdGZvcm1zIHdoZXJlIGl0J3Mga25vd24gaG93CiAgICAgdG8gZG8gaXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gY3J5cHRvL2VjL2VjX211bHQuYywgaW1wbGVtZW50IGZhc3QgcG9pbnQgbXVsdGlwbGljYXRpb24gd2l0aAogICAgIHByZWNvbXB1dGF0aW9uLCBiYXNlZCBvbiB3TkFGIHNwbGl0dGluZzogRUNfR1JPVVBfcHJlY29tcHV0ZV9tdWx0KCkKICAgICB3aWxsIG5vdyBjb21wdXRlIGEgdGFibGUgb2YgbXVsdGlwbGVzIG9mIHRoZSBnZW5lcmF0b3IgdGhhdAogICAgIG1ha2VzIHN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YgRUNfUE9JTlRzX211bCgpIG9yIEVDX1BPSU5UX211bCgpCiAgICAgZmFzdGVyIChub3RhYmx5IGluIHRoZSBjYXNlIG9mIGEgc2luZ2xlIHBvaW50IG11bHRpcGxpY2F0aW9uLAogICAgIHNjYWxhciAqIGdlbmVyYXRvcikuCiAgICAgW05pbHMgTGFyc2NoLCBCb2RvIE1vZWxsZXJdCgogICopIElQdjYgc3VwcG9ydCBmb3IgY2VydGlmaWNhdGUgZXh0ZW5zaW9ucy4gVGhlIHZhcmlvdXMgZXh0ZW5zaW9ucwogICAgIHdoaWNoIHVzZSB0aGUgSVA6YS5iLmMuZCBjYW4gbm93IHRha2UgSVB2NiBhZGRyZXNzZXMgdXNpbmcgdGhlCiAgICAgZm9ybWF0cyBvZiBSRkMxODg0IDIuMiAuIElQdjYgYWRkcmVzc2VzIGFyZSBub3cgYWxzbyBkaXNwbGF5ZWQKICAgICBjb3JyZWN0bHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgYW4gRU5HSU5FIHRoYXQgaW1wbGVtZW50cyBSU0EgYnkgcGVyZm9ybWluZyBwcml2YXRlIGtleQogICAgIGV4cG9uZW50aWF0aW9ucyB3aXRoIHRoZSBHTVAgbGlicmFyeS4gVGhlIGNvbnZlcnNpb25zIHRvIGFuZCBmcm9tCiAgICAgR01QJ3MgbXB6X3QgZm9ybWF0IGFyZW4ndCBvcHRpbWlzZWQgbm9yIGFyZSBhbnkgbW9udGdvbWVyeSBmb3JtcwogICAgIGNhY2hlZCwgYW5kIG9uIHg4NiBpdCBhcHBlYXJzIE9wZW5TU0wncyBvd24gcGVyZm9ybWFuY2UgaGFzIGNhdWdodCB1cC4KICAgICBIb3dldmVyIHRoZXJlIGFyZSBsaWtlbHkgdG8gYmUgb3RoZXIgYXJjaGl0ZWN0dXJlcyB3aGVyZSBHTVAgY291bGQKICAgICBwcm92aWRlIGEgYm9vc3QuIFRoaXMgRU5HSU5FIGlzIG5vdCBidWlsdCBpbiBieSBkZWZhdWx0LCBidXQgaXQgY2FuIGJlCiAgICAgc3BlY2lmaWVkIGF0IENvbmZpZ3VyZSB0aW1lIGFuZCBzaG91bGQgYmUgYWNjb21wYW5pZWQgYnkgdGhlIG5lY2Vzc2FyeQogICAgIGxpbmtlciBhZGRpdGlvbnMsIGVnOwogICAgICAgICAuL2NvbmZpZyAtRE9QRU5TU0xfVVNFX0dNUCAtbGdtcAogICAgIFtHZW9mZiBUaG9ycGVdCgogICopICJvcGVuc3NsIGVuZ2luZSIgd2lsbCBub3QgZGlzcGxheSBFTkdJTkUvRFNPIGxvYWQgZmFpbHVyZSBlcnJvcnMgd2hlbgogICAgIHRlc3RpbmcgYXZhaWxhYmlsaXR5IG9mIGVuZ2luZXMgd2l0aCAiLXQiIC0gdGhlIG9sZCBiZWhhdmlvdXIgaXMKICAgICBwcm9kdWNlZCBieSBpbmNyZWFzaW5nIHRoZSBmZWF0dXJlJ3MgdmVyYm9zaXR5IHdpdGggIi10dCIuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgRUNEU0Egcm91dGluZXM6IHVuZGVyIGNlcnRhaW4gZXJyb3IgY29uZGl0aW9ucyB1bmluaXRpYWxpemVkIEJOIG9iamVjdHMKICAgICBjb3VsZCBiZSBmcmVlZC4gU29sdXRpb246IG1ha2Ugc3VyZSBpbml0aWFsaXphdGlvbiBpcyBwZXJmb3JtZWQgZWFybHkKICAgICBlbm91Z2guIChSZXBvcnRlZCBhbmQgZml4IHN1cHBsaWVkIGJ5IE5pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+CiAgICAgdmlhIFBSIzQ1OSkKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgS2V5LWdlbmVyYXRpb24gY2FuIG5vdyBiZSBpbXBsZW1lbnRlZCBpbiBSU0FfTUVUSE9ELCBEU0FfTUVUSE9ECiAgICAgYW5kIERIX01FVEhPRCAoZWcuIGJ5IEVOR0lORSBpbXBsZW1lbnRhdGlvbnMpIHRvIG92ZXJyaWRlIHRoZSBub3JtYWwKICAgICBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbnMuIEZvciBEU0EgYW5kIERILCBwYXJhbWV0ZXIgZ2VuZXJhdGlvbiBjYW4KICAgICBhbHNvIGJlIG92ZXJyaWRlbiBieSBwcm92aWRpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBjYWxsYmFja3MuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQ2hhbmdlIHRoZSAicHJvZ3Jlc3MiIG1lY2hhbmlzbSB1c2VkIGluIGtleS1nZW5lcmF0aW9uIGFuZAogICAgIHByaW1hbGl0eSB0ZXN0aW5nIHRvIGZ1bmN0aW9ucyB0aGF0IHRha2UgYSBuZXcgQk5fR0VOQ0IgcG9pbnRlciBpbgogICAgIHBsYWNlIG9mIGNhbGxiYWNrL2FyZ3VtZW50IHBhaXJzLiBUaGUgbmV3IEFQSSBmdW5jdGlvbnMgaGF2ZSAiX2V4IgogICAgIHBvc3RmaXhlcyBhbmQgdGhlIG9sZGVyIGZ1bmN0aW9ucyBhcmUgcmVpbXBsZW1lbnRlZCBhcyB3cmFwcGVycyBmb3IKICAgICB0aGUgbmV3IG9uZXMuIFRoZSBPUEVOU1NMX05PX0RFUFJFQ0FURUQgc3ltYm9sIGNhbiBiZSB1c2VkIHRvIGhpZGUKICAgICBkZWNsYXJhdGlvbnMgb2YgdGhlIG9sZCBmdW5jdGlvbnMgdG8gaGVscCAoZ3JhY2VmdWwpIGF0dGVtcHRzIHRvCiAgICAgbWlncmF0ZSB0byB0aGUgbmV3IGZ1bmN0aW9ucy4gQWxzbywgdGhlIG5ldyBrZXktZ2VuZXJhdGlvbiBBUEkKICAgICBmdW5jdGlvbnMgb3BlcmF0ZSBvbiBhIGNhbGxlci1zdXBwbGllZCBrZXktc3RydWN0dXJlIGFuZCByZXR1cm4KICAgICBzdWNjZXNzL2ZhaWx1cmUgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGEga2V5IG9yIE5VTEwgLSB0aGlzIGlzIHRvCiAgICAgaGVscCBtYWtlICJrZXlnZW4iIGFub3RoZXIgbWVtYmVyIGZ1bmN0aW9uIG9mIFJTQV9NRVRIT0QgZXRjLgoKICAgICBFeGFtcGxlIGZvciB1c2luZyB0aGUgbmV3IGNhbGxiYWNrIGludGVyZmFjZToKCiAgICAgICAgICBpbnQgKCpteV9jYWxsYmFjaykoaW50IGEsIGludCBiLCBCTl9HRU5DQiAqY2IpID0gLi4uOwogICAgICAgICAgdm9pZCAqbXlfYXJnID0gLi4uOwogICAgICAgICAgQk5fR0VOQ0IgbXlfY2I7CgogICAgICAgICAgQk5fR0VOQ0Jfc2V0KCZteV9jYiwgbXlfY2FsbGJhY2ssIG15X2FyZyk7CgogICAgICAgICAgcmV0dXJuIEJOX2lzX3ByaW1lX2V4KHNvbWVfYmlnbnVtLCBCTl9wcmltZV9jaGVja3MsIE5VTEwsICZjYik7CiAgICAgICAgICAvKiBGb3IgdGhlIG1lYW5pbmcgb2YgYSwgYiBpbiBjYWxscyB0byBteV9jYWxsYmFjaygpLCBzZWUgdGhlCiAgICAgICAgICAgKiBkb2N1bWVudGF0aW9uIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBjYWxsYmFjay4KICAgICAgICAgICAqIGNiIHdpbGwgcG9pbnQgdG8gbXlfY2I7IG15X2FyZyBjYW4gYmUgcmV0cmlldmVkIGFzIGNiLT5hcmcuCiAgICAgICAgICAgKiBteV9jYWxsYmFjayBzaG91bGQgcmV0dXJuIDEgaWYgaXQgd2FudHMgQk5faXNfcHJpbWVfZXgoKQogICAgICAgICAgICogdG8gY29udGludWUsIG9yIDAgdG8gc3RvcC4KICAgICAgICAgICAqLwoKICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBDaGFuZ2UgdGhlIFpMSUIgY29tcHJlc3Npb24gbWV0aG9kIHRvIGJlIHN0YXRlZnVsLCBhbmQgbWFrZSBpdAogICAgIGF2YWlsYWJsZSB0byBUTFMgd2l0aCB0aGUgbnVtYmVyIGRlZmluZWQgaW4gCiAgICAgZHJhZnQtaWV0Zi10bHMtY29tcHJlc3Npb24tMDQudHh0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgQVNOLjEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIGZvciBDZXJ0aWZpY2F0ZVBhaXIsIHdoaWNoCiAgICAgaXMgZGVmaW5lZCBhcyBmb2xsb3dzIChhY2NvcmRpbmcgdG8gWC41MDlfNHRoRWRpdGlvbkRyYWZ0VjYucGRmKToKCiAgICAgQ2VydGlmaWNhdGVQYWlyIDo6PSBTRVFVRU5DRSB7CiAgICAgICAgZm9yd2FyZAkJWzBdCUNlcnRpZmljYXRlIE9QVElPTkFMLAogICAgICAgIHJldmVyc2UJCVsxXQlDZXJ0aWZpY2F0ZSBPUFRJT05BTCwKICAgICAgICAtLSBhdCBsZWFzdCBvbmUgb2YgdGhlIHBhaXIgc2hhbGwgYmUgcHJlc2VudCAtLSB9CgogICAgIEFsc28gaW1wbGVtZW50IHRoZSBQRU0gZnVuY3Rpb25zIHRvIHJlYWQgYW5kIHdyaXRlIGNlcnRpZmljYXRlCiAgICAgcGFpcnMsIGFuZCBkZWZpbmVkIHRoZSBQRU0gdGFnIGFzICJDRVJUSUZJQ0FURSBQQUlSIi4KCiAgICAgVGhpcyBuZWVkZWQgdG8gYmUgZGVmaW5lZCwgbW9zdGx5IGZvciB0aGUgc2FrZSBvZiB0aGUgTERBUAogICAgIGF0dHJpYnV0ZSBjcm9zc0NlcnRpZmljYXRlUGFpciwgYnV0IG1heSBwcm92ZSB1c2VmdWwgZWxzZXdoZXJlIGFzCiAgICAgd2VsbC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGluaGliaXQgc3ltbGlua2luZyBvZiBzaGFyZWQgbGlicmFyaWVzIGluCiAgICAgTWFrZWZpbGUuc2hhcmVkLCBmb3IgQ3lnd2luJ3Mgc2FrZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBFeHRlbmQgdGhlIEJJR05VTSBBUEkgYnkgY3JlYXRpbmcgYSBmdW5jdGlvbiAKICAgICAgICAgIHZvaWQgQk5fc2V0X25lZ2F0aXZlKEJJR05VTSAqYSwgaW50IG5lZyk7CiAgICAgYW5kIGEgbWFjcm8gdGhhdCBiZWhhdmUgbGlrZQogICAgICAgICAgaW50ICBCTl9pc19uZWdhdGl2ZShjb25zdCBCSUdOVU0gKmEpOwoKICAgICB0byBhdm9pZCB0aGUgbmVlZCB0byBhY2Nlc3MgJ2EtPm5lZycgZGlyZWN0bHkgaW4gYXBwbGljYXRpb25zLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgSW1wbGVtZW50IGZhc3QgbW9kdWxhciByZWR1Y3Rpb24gZm9yIHBzZXVkby1NZXJzZW5uZSBwcmltZXMKICAgICB1c2VkIGluIE5JU1QgY3VydmVzIChjcnlwdG8vYm4vYm5fbmlzdC5jLCBjcnlwdG8vZWMvZWNwX25pc3QuYykuCiAgICAgRUNfR1JPVVBfbmV3X2N1cnZlX0dGcCgpIHdpbGwgbm93IGF1dG9tYXRpY2FsbHkgdXNlIHRoaXMKICAgICBpZiBhcHBsaWNhYmxlLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkIG5ldyBsb2NrIHR5cGUgKENSWVBUT19MT0NLX0JOKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgdGhlIEVOR0lORSBmcmFtZXdvcmsgdG8gYXV0b21hdGljYWxseSBsb2FkIGVuZ2luZXMKICAgICBkeW5hbWljYWxseSBmcm9tIHNwZWNpZmljIGRpcmVjdG9yaWVzIHVubGVzcyB0aGV5IGNvdWxkIGJlCiAgICAgZm91bmQgdG8gYWxyZWFkeSBiZSBidWlsdCBpbiBvciBsb2FkZWQuICBNb3ZlIGFsbCB0aGUKICAgICBjdXJyZW50IGVuZ2luZXMgZXhjZXB0IGZvciB0aGUgY3J5cHRvZGV2IG9uZSB0byBhIG5ldwogICAgIGRpcmVjdG9yeSBlbmdpbmVzLy4KICAgICBUaGUgZW5naW5lcyBpbiBlbmdpbmVzLyBhcmUgYnVpbHQgYXMgc2hhcmVkIGxpYnJhcmllcyBpZgogICAgIHRoZSAic2hhcmVkIiBvcHRpb25zIHdhcyBnaXZlbiB0byAuL0NvbmZpZ3VyZSBvciAuL2NvbmZpZy4KICAgICBPdGhlcndpc2UsIHRoZXkgYXJlIGluc2VydGVkIGluIGxpYmNyeXB0by5hLgogICAgIC91c3IvbG9jYWwvc3NsL2VuZ2luZXMgaXMgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGZvciBkeW5hbWljCiAgICAgZW5naW5lcywgYnV0IHRoYXQgY2FuIGJlIG92ZXJyaWRlbiBhdCBjb25maWd1cmUgdGltZSB0aHJvdWdoCiAgICAgdGhlIHVzdWFsIHVzZSBvZiAtLXByZWZpeCBhbmQvb3IgLS1vcGVuc3NsZGlyLCBhbmQgYXQgcnVuCiAgICAgdGltZSB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBPUEVOU1NMX0VOR0lORVMuCiAgICAgW0dlb2ZmIFRob3JwZSBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgTWFrZWZpbGUuc2hhcmVkLCBhIGhlbHBlciBtYWtlZmlsZSB0byBidWlsZCBzaGFyZWQKICAgICBsaWJyYXJpZXMuICBBZGFwdCBNYWtlZmlsZS5vcmcuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHZlcnNpb24gaW5mbyB0byBXaW4zMiBETExzLgogICAgIFtQZXRlciAnTHVuYScgUnVuZXN0aWciIDxwZXRlckBydW5lc3RpZy5jb20+XQoKICAqKSBBZGQgbmV3ICdtZWRpdW0gbGV2ZWwnIFBLQ1MjMTIgQVBJLiBDZXJ0aWZpY2F0ZXMgYW5kIGtleXMKICAgICBjYW4gYmUgYWRkZWQgdXNpbmcgdGhpcyBBUEkgdG8gY3JlYXRlZCBhcmJpdHJhcnkgUEtDUyMxMgogICAgIGZpbGVzIHdoaWxlIGF2b2lkaW5nIHRoZSBsb3cgbGV2ZWwgQVBJLgoKICAgICBOZXcgb3B0aW9ucyB0byBQS0NTMTJfY3JlYXRlKCksIGtleSBvciBjZXJ0IGNhbiBiZSBOVUxMIGFuZAogICAgIHdpbGwgdGhlbiBiZSBvbWl0dGVkIGZyb20gdGhlIG91dHB1dCBmaWxlLiBUaGUgZW5jcnlwdGlvbgogICAgIGFsZ29yaXRobSBOSURzIGNhbiBiZSBzZXQgdG8gLTEgZm9yIG5vIGVuY3J5cHRpb24sIHRoZSBtYWMKICAgICBpdGVyYXRpb24gY291bnQgY2FuIGJlIHNldCB0byAwIHRvIG9taXQgdGhlIG1hYy4KCiAgICAgRW5oYW5jZSBwa2NzMTIgdXRpbGl0eSBieSBtYWtpbmcgdGhlIC1ub2tleXMgYW5kIC1ub2NlcnRzCiAgICAgb3B0aW9ucyB3b3JrIHdoZW4gY3JlYXRpbmcgYSBQS0NTIzEyIGZpbGUuIE5ldyBvcHRpb24gLW5vbWFjCiAgICAgdG8gb21pdCB0aGUgbWFjLCBOT05FIGNhbiBiZSBzZXQgZm9yIGFuIGVuY3J5cHRpb24gYWxnb3JpdGhtLgogICAgIE5ldyBjb2RlIGlzIG1vZGlmaWVkIHRvIHVzZSB0aGUgZW5oYW5jZWQgUEtDUzEyX2NyZWF0ZSgpCiAgICAgaW5zdGVhZCBvZiB0aGUgbG93IGxldmVsIEFQSS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbmQgQVNOMSBlbmNvZGVyIHRvIHN1cHBvcnQgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQKICAgICBlbmNvZGluZy4gVGhpcyBjYW4gb3V0cHV0IHNlcXVlbmNlcyB0YWdzIGFuZCBvY3RldCBzdHJpbmdzIGluCiAgICAgdGhpcyBmb3JtLiBNb2RpZnkgcGs3X2FzbjEuYyB0byBzdXBwb3J0IGluZGVmaW5pdGUgbGVuZ3RoCiAgICAgZW5jb2RpbmcuIFRoaXMgaXMgZXhwZXJpbWVudGFsIGFuZCBuZWVkcyBhZGRpdGlvbmFsIGNvZGUgdG8KICAgICBiZSB1c2VmdWwsIHN1Y2ggYXMgYW4gQVNOMSBiaW8gYW5kIHNvbWUgZW5oYW5jZWQgc3RyZWFtaW5nCiAgICAgUEtDUyM3IGNvZGUuCgogICAgIEV4dGVuZCB0ZW1wbGF0ZSBlbmNvZGUgZnVuY3Rpb25hbGl0eSBzbyB0aGF0IHRhZ2dpbmcgaXMgcGFzc2VkCiAgICAgZG93biB0byB0aGUgdGVtcGxhdGUgZW5jb2Rlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBMZXQgJ29wZW5zc2wgcmVxJyBmYWlsIGlmIGFuIGFyZ3VtZW50IHRvICctbmV3a2V5JyBpcyBub3QKICAgICByZWNvZ25pemVkIGluc3RlYWQgb2YgdXNpbmcgUlNBIGFzIGEgZGVmYXVsdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRUNDLWJhc2VkIGNpcGhlcnN1aXRlcyBmcm9tIGRyYWZ0LWlldGYtdGxzLWVjYy0wMS50eHQuCiAgICAgQXMgdGhlc2UgYXJlIG5vdCBvZmZpY2lhbCwgdGhleSBhcmUgbm90IGluY2x1ZGVkIGluICJBTEwiOwogICAgIHRoZSAiRUNDZHJhZnQiIGNpcGhlcnN1aXRlIGdyb3VwIGFsaWFzIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB0aGVtLgogICAgIFtWaXB1bCBHdXB0YSBhbmQgU3VtaXQgR3VwdGEgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgQWRkIEVDREggZW5naW5lIHN1cHBvcnQuCiAgICAgW05pbHMgR3VyYSBhbmQgRG91Z2xhcyBTdGViaWxhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBFQ0RIIGluIG5ldyBkaXJlY3RvcnkgY3J5cHRvL2VjZGgvLgogICAgIFtEb3VnbGFzIFN0ZWJpbGEgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgTGV0IEJOX3JhbmRfcmFuZ2UoKSBhYm9ydCB3aXRoIGFuIGVycm9yIGFmdGVyIDEwMCBpdGVyYXRpb25zCiAgICAgd2l0aG91dCBzdWNjZXNzICh3aGljaCBpbmRpY2F0ZXMgYSBicm9rZW4gUFJORykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIEJOX21vZF9zcXJ0KCkgc28gdGhhdCBpdCB2ZXJpZmllcyB0aGF0IHRoZSBpbnB1dCB2YWx1ZQogICAgIGlzIHJlYWxseSB0aGUgc3F1YXJlIG9mIHRoZSByZXR1cm4gdmFsdWUuICAoUHJldmlvdXNseSwKICAgICBCTl9tb2Rfc3FydCB3b3VsZCBzaG93IEdJR08gYmVoYXZpb3VyLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgbmFtZWQgZWxsaXB0aWMgY3VydmVzIG92ZXIgYmluYXJ5IGZpZWxkcyBmcm9tIFg5LjYyLCBTRUNHLAogICAgIGFuZCBXQVAvV1RMUzsgYWRkIE9JRHMgdGhhdCB3ZXJlIHN0aWxsIG1pc3NpbmcuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBFeHRlbmQgdGhlIEVDIGxpYnJhcnkgZm9yIGVsbGlwdGljIGN1cnZlcyBvdmVyIGJpbmFyeSBmaWVsZHMKICAgICAobmV3IGZpbGVzIGVjMl9zbXBsLmMsIGVjMl9zbXB0LmMsIGVjMl9tdWx0LmMgaW4gY3J5cHRvL2VjLykuCiAgICAgTmV3IEVDX01FVEhPRDoKCiAgICAgICAgICBFQ19HRjJtX3NpbXBsZV9tZXRob2QKCiAgICAgTmV3IEFQSSBmdW5jdGlvbnM6CgogICAgICAgICAgRUNfR1JPVVBfbmV3X2N1cnZlX0dGMm0KICAgICAgICAgIEVDX0dST1VQX3NldF9jdXJ2ZV9HRjJtCiAgICAgICAgICBFQ19HUk9VUF9nZXRfY3VydmVfR0YybQogICAgICAgICAgRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtCiAgICAgICAgICBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0KICAgICAgICAgIEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGMm0KCiAgICAgUG9pbnQgY29tcHJlc3Npb24gZm9yIGJpbmFyeSBmaWVsZHMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBmb3IKICAgICBwYXRlbnQgcmVhc29ucyAoY29tcGlsZSB3aXRoIE9QRU5TU0xfRUNfQklOX1BUX0NPTVAgZGVmaW5lZCB0bwogICAgIGVuYWJsZSBpdCkuCgogICAgIEFzIGJpbmFyeSBwb2x5bm9taWFscyBhcmUgcmVwcmVzZW50ZWQgYXMgQklHTlVNcywgdmFyaW91cyBtZW1iZXJzCiAgICAgb2YgdGhlIEVDX0dST1VQIGFuZCBFQ19QT0lOVCBkYXRhIHN0cnVjdHVyZXMgY2FuIGJlIHNoYXJlZAogICAgIGJldHdlZW4gdGhlIGltcGxlbWVudGF0aW9ucyBmb3IgcHJpbWUgZmllbGRzIGFuZCBiaW5hcnkgZmllbGRzOwogICAgIHRoZSBhYm92ZSAuLi5fR0YybSBmdW5jdGlvbnMgKGV4Y2VwdCBmb3IgRVhfR1JPVVBfbmV3X2N1cnZlX0dGMm0pCiAgICAgYXJlIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byB0aGVpciAuLi5fR0ZwIGNvdW50ZXJwYXJ0cy4KICAgICAoRm9yIHNpbXBsaWNpdHksIHRoZSAnLi4uX0dGcCcgcHJlZml4IGhhcyBiZWVuIGRyb3BwZWQgZnJvbQogICAgIHZhcmlvdXMgaW50ZXJuYWwgbWV0aG9kIG5hbWVzLikKCiAgICAgQW4gaW50ZXJuYWwgJ2ZpZWxkX2RpdicgbWV0aG9kIChzaW1pbGFyIHRvICdmaWVsZF9tdWwnIGFuZAogICAgICdmaWVsZF9zcXInKSBoYXMgYmVlbiBhZGRlZDsgdGhpcyBpcyB1c2VkIG9ubHkgZm9yIGJpbmFyeSBmaWVsZHMuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBPcHRpb25hbGx5IGRpc3BhdGNoIEVDX1BPSU5UX211bCgpLCBFQ19QT0lOVF9wcmVjb21wdXRlX211bHQoKQogICAgIHRocm91Z2ggbWV0aG9kcyAoJ211bCcsICdwcmVjb21wdXRlX211bHQnKS4KCiAgICAgVGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb25zIChub3cgaW50ZXJuYWxseSBjYWxsZWQgJ2VjX3dOQUZfbXVsJwogICAgIGFuZCAnZWNfd05BRl9wcmVjb21wdXRlZF9tdWx0JykgcmVtYWluIHRoZSBkZWZhdWx0IGlmIHRoZXNlCiAgICAgbWV0aG9kcyBhcmUgdW5kZWZpbmVkLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgTmV3IGZ1bmN0aW9uIEVDX0dST1VQX2dldF9kZWdyZWUsIHdoaWNoIGlzIGRlZmluZWQgdGhyb3VnaAogICAgIEVDX01FVEhPRC4gIEZvciBjdXJ2ZXMgb3ZlciBwcmltZSBmaWVsZHMsIHRoaXMgcmV0dXJucyB0aGUgYml0CiAgICAgbGVuZ3RoIG9mIHRoZSBtb2R1bHVzLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgTmV3IGZ1bmN0aW9ucyBFQ19HUk9VUF9kdXAsIEVDX1BPSU5UX2R1cC4KICAgICAoVGhlc2Ugc2ltcGx5IGNhbGwgLi4uX25ldyAgYW5kIC4uLl9jb3B5KS4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBiaW5hcnkgcG9seW5vbWlhbCBhcml0aG1ldGljIHNvZnR3YXJlIGluIGNyeXB0by9ibi9ibl9nZjJtLmMuCiAgICAgUG9seW5vbWlhbHMgYXJlIHJlcHJlc2VudGVkIGFzIEJJR05VTXMgKHdoZXJlIHRoZSBzaWduIGJpdCBpcyBub3QKICAgICB1c2VkKSBpbiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBbbWFjcm9zXTogIAoKICAgICAgICAgIEJOX0dGMm1fYWRkCiAgICAgICAgICBCTl9HRjJtX3N1YiAgICAgICAgICAgICBbPSBCTl9HRjJtX2FkZF0KICAgICAgICAgIEJOX0dGMm1fbW9kICAgICAgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9tdWwgICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfbXVsX2Fycl0KICAgICAgICAgIEJOX0dGMm1fbW9kX3NxciAgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9zcXJfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2RfaW52CiAgICAgICAgICBCTl9HRjJtX21vZF9leHAgICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfZXhwX2Fycl0KICAgICAgICAgIEJOX0dGMm1fbW9kX3NxcnQgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9zcXJ0X2Fycl0KICAgICAgICAgIEJOX0dGMm1fbW9kX3NvbHZlX3F1YWQgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9zb2x2ZV9xdWFkX2Fycl0KICAgICAgICAgIEJOX0dGMm1fY21wICAgICAgICAgICAgIFs9IEJOX3VjbXBdCgogICAgIChOb3RlIHRoYXQgb25seSB0aGUgJ21vZCcgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBmb3IgZmllbGRzIEdGKDJebSkuCiAgICAgQk5fR0YybV9hZGQoKSBpcyBtaXNub21lciwgYnV0IHRoaXMgaXMgZm9yIHRoZSBzYWtlIG9mIGNvbnNpc3RlbmN5LikKCiAgICAgRm9yIHNvbWUgZnVuY3Rpb25zLCBhbiB0aGUgaXJyZWR1Y2libGUgcG9seW5vbWlhbCBkZWZpbmluZyBhCiAgICAgZmllbGQgY2FuIGJlIGdpdmVuIGFzIGFuICd1bnNpZ25lZCBpbnRbXScgd2l0aCBzdHJpY3RseQogICAgIGRlY3JlYXNpbmcgZWxlbWVudHMgZ2l2aW5nIHRoZSBpbmRpY2VzIG9mIHRob3NlIGJpdHMgdGhhdCBhcmUgc2V0OwogICAgIGkuZS4sIHBbXSByZXByZXNlbnRzIHRoZSBwb2x5bm9taWFsCiAgICAgICAgICBmKHQpID0gdF5wWzBdICsgdF5wWzFdICsgLi4uICsgdF5wW2tdCiAgICAgd2hlcmUKICAgICAgICAgIHBbMF0gPiBwWzFdID4gLi4uID4gcFtrXSA9IDAuCiAgICAgVGhpcyBhcHBsaWVzIHRvIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKICAgICAgICAgIEJOX0dGMm1fbW9kX2FycgogICAgICAgICAgQk5fR0YybV9tb2RfbXVsX2FycgogICAgICAgICAgQk5fR0YybV9tb2Rfc3FyX2FycgogICAgICAgICAgQk5fR0YybV9tb2RfaW52X2FyciAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX2ludl0KICAgICAgICAgIEJOX0dGMm1fbW9kX2Rpdl9hcnIgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9kaXZdCiAgICAgICAgICBCTl9HRjJtX21vZF9leHBfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9zcXJ0X2FycgogICAgICAgICAgQk5fR0YybV9tb2Rfc29sdmVfcXVhZF9hcnIKICAgICAgICAgIEJOX0dGMm1fcG9seTJhcnIKICAgICAgICAgIEJOX0dGMm1fYXJyMnBvbHkKCiAgICAgQ29udmVyc2lvbiBjYW4gYmUgcGVyZm9ybWVkIGJ5IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKICAgICAgICAgIEJOX0dGMm1fcG9seTJhcnIKICAgICAgICAgIEJOX0dGMm1fYXJyMnBvbHkKCiAgICAgYm50ZXN0LmMgaGFzIGFkZGl0aW9uYWwgdGVzdHMgZm9yIGJpbmFyeSBwb2x5bm9taWFsIGFyaXRobWV0aWMuCgogICAgIFR3byBpbXBsZW1lbnRhdGlvbnMgZm9yIEJOX0dGMm1fbW9kX2RpdigpIGFyZSBhdmFpbGFibGUuCiAgICAgVGhlIGRlZmF1bHQgYWxnb3JpdGhtIHNpbXBseSB1c2VzIEJOX0dGMm1fbW9kX2ludigpIGFuZAogICAgIEJOX0dGMm1fbW9kX211bCgpLiAgVGhlIGFsdGVybmF0aXZlIGFsZ29yaXRobSBpcyBjb21waWxlZCBpbiBvbmx5CiAgICAgaWYgT1BFTlNTTF9TVU5fR0YyTV9ESVYgaXMgZGVmaW5lZCAocGF0ZW50IHBlbmRpbmc7IHJlYWQgdGhlCiAgICAgY29weXJpZ2h0IG5vdGljZSBpbiBjcnlwdG8vYm4vYm5fZ2YybS5jIGJlZm9yZSBlbmFibGluZyBpdCkuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgbmV3IGVycm9yIGNvZGUgJ0VSUl9SX0RJU0FCTEVEJyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gc29tZQogICAgIGZ1bmN0aW9uYWxpdHkgaXMgZGlzYWJsZWQgYXQgY29tcGlsZS10aW1lLgogICAgIFtEb3VnbGFzIFN0ZWJpbGEgPGRvdWdsYXMuc3RlYmlsYUBzdW4uY29tPl0KCiAgKikgQ2hhbmdlIGRlZmF1bHQgYmVoYXZpb3VyIG9mICdvcGVuc3NsIGFzbjFwYXJzZScgc28gdGhhdCBtb3JlCiAgICAgaW5mb3JtYXRpb24gaXMgdmlzaWJsZSB3aGVuIHZpZXdpbmcsIGUuZy4sIGEgY2VydGlmaWNhdGU6CgogICAgIE1vZGlmeSBhc24xX3BhcnNlMiAoY3J5cHRvL2FzbjEvYXNuMV9wYXIuYykgc28gdGhhdCBpbiBub24tJ2R1bXAnCiAgICAgbW9kZSB0aGUgY29udGVudCBvZiBub24tcHJpbnRhYmxlIE9DVEVUIFNUUklOR3MgaXMgb3V0cHV0IGluIGEKICAgICBzdHlsZSBzaW1pbGFyIHRvIElOVEVHRVJzLCBidXQgd2l0aCAnW0hFWCBEVU1QXScgcHJlcGVuZGVkIHRvCiAgICAgYXZvaWQgdGhlIGFwcGVhcmFuY2Ugb2YgYSBwcmludGFibGUgc3RyaW5nLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkICdhc24xX2ZsYWcnIGFuZCAnYXNuMV9mb3JtJyBtZW1iZXIgdG8gRUNfR1JPVVAgd2l0aCBhY2Nlc3MKICAgICBmdW5jdGlvbnMKICAgICAgICAgIEVDX0dST1VQX3NldF9hc24xX2ZsYWcoKQogICAgICAgICAgRUNfR1JPVVBfZ2V0X2FzbjFfZmxhZygpCiAgICAgICAgICBFQ19HUk9VUF9zZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0oKQogICAgIFRoZXNlIGNvbnRyb2wgQVNOMSBlbmNvZGluZyBkZXRhaWxzOgogICAgIC0gQ3VydmVzIChpLmUuLCBncm91cHMpIGFyZSBlbmNvZGVkIGV4cGxpY2l0bHkgdW5sZXNzIGFzbjFfZmxhZwogICAgICAgaGFzIGJlZW4gc2V0IHRvIE9QRU5TU0xfRUNfTkFNRURfQ1VSVkUuCiAgICAgLSBQb2ludHMgYXJlIGVuY29kZWQgaW4gdW5jb21wcmVzc2VkIGZvcm0gYnkgZGVmYXVsdDsgb3B0aW9ucyBmb3IKICAgICAgIGFzbjFfZm9yIGFyZSBhcyBmb3IgcG9pbnQyb2N0LCBuYW1lbHkKICAgICAgICAgIFBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRAogICAgICAgICAgUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQKICAgICAgICAgIFBPSU5UX0NPTlZFUlNJT05fSFlCUklECgogICAgIEFsc28gYWRkICdzZWVkJyBhbmQgJ3NlZWRfbGVuJyBtZW1iZXJzIHRvIEVDX0dST1VQIHdpdGggYWNjZXNzCiAgICAgZnVuY3Rpb25zCiAgICAgICAgICBFQ19HUk9VUF9zZXRfc2VlZCgpCiAgICAgICAgICBFQ19HUk9VUF9nZXQwX3NlZWQoKQogICAgICAgICAgRUNfR1JPVVBfZ2V0X3NlZWRfbGVuKCkKICAgICBUaGlzIGlzIHVzZWQgb25seSBmb3IgQVNOMSBwdXJwb3NlcyAoc28gZmFyKS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCAnZmllbGRfdHlwZScgbWVtYmVyIHRvIEVDX01FVEhPRCwgd2hpY2ggaG9sZHMgdGhlIE5JRAogICAgIG9mIHRoZSBhcHByb3ByaWF0ZSBmaWVsZCB0eXBlIE9JRC4gIFRoZSBuZXcgZnVuY3Rpb24KICAgICBFQ19NRVRIT0RfZ2V0X2ZpZWxkX3R5cGUoKSByZXR1cm5zIHRoaXMgdmFsdWUuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBBZGQgZnVuY3Rpb25zIAogICAgICAgICAgRUNfUE9JTlRfcG9pbnQyYm4oKQogICAgICAgICAgRUNfUE9JTlRfYm4ycG9pbnQoKQogICAgICAgICAgRUNfUE9JTlRfcG9pbnQyaGV4KCkKICAgICAgICAgIEVDX1BPSU5UX2hleDJwb2ludCgpCiAgICAgcHJvdmlkaW5nIHVzZWZ1bCBpbnRlcmZhY2VzIHRvIEVDX1BPSU5UX3BvaW50Mm9jdCgpIGFuZAogICAgIEVDX1BPSU5UX29jdDJwb2ludCgpLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQ2hhbmdlIGludGVybmFscyBvZiB0aGUgRUMgbGlicmFyeSBzbyB0aGF0IHRoZSBmdW5jdGlvbnMKICAgICAgICAgIEVDX0dST1VQX3NldF9nZW5lcmF0b3IoKQogICAgICAgICAgRUNfR1JPVVBfZ2V0X2dlbmVyYXRvcigpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfb3JkZXIoKQogICAgICAgICAgRUNfR1JPVVBfZ2V0X2NvZmFjdG9yKCkKICAgICBhcmUgaW1wbGVtZW50ZWQgZGlyZWN0bHkgaW4gY3J5cHRvL2VjL2VjX2xpYi5jIGFuZCBub3QgZGlzcGF0Y2hlZAogICAgIHRvIG1ldGhvZHMsIHdoaWNoIHdvdWxkIGxlYWQgdG8gdW5uZWNlc3NhcnkgY29kZSBkdXBsaWNhdGlvbiB3aGVuCiAgICAgYWRkaW5nIGRpZmZlcmVudCB0eXBlcyBvZiBjdXJ2ZXMuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+IHdpdGggaW5wdXQgYnkgQm9kbyBNb2VsbGVyXQoKICAqKSBJbXBsZW1lbnQgY29tcHV0ZV93TkFGIChjcnlwdG8vZWMvZWNfbXVsdC5jKSB3aXRob3V0IEJJR05VTQogICAgIGFyaXRobWV0aWMsIGFuZCBzdWNoIHRoYXQgbW9kaWZpZWQgd05BRnMgYXJlIGdlbmVyYXRlZAogICAgICh3aGljaCBhdm9pZCBsZW5ndGggZXhwYW5zaW9uIGluIG1hbnkgY2FzZXMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBhIGZ1bmN0aW9uIEVDX0dST1VQX2NoZWNrX2Rpc2NyaW1pbmFudCgpIChkZWZpbmVkIHZpYQogICAgIEVDX01FVEhPRCkgdGhhdCB2ZXJpZmllcyB0aGF0IHRoZSBjdXJ2ZSBkaXNjcmltaW5hbnQgaXMgbm9uLXplcm8uCgogICAgIEFkZCBhIGZ1bmN0aW9uIEVDX0dST1VQX2NoZWNrKCkgdGhhdCBtYWtlcyBzb21lIHNhbml0eSB0ZXN0cwogICAgIG9uIGEgRUNfR1JPVVAsIGl0cyBnZW5lcmF0b3IgYW5kIG9yZGVyLiAgVGhpcyBpbmNsdWRlcwogICAgIEVDX0dST1VQX2NoZWNrX2Rpc2NyaW1pbmFudCgpLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkIEVDRFNBIGluIG5ldyBkaXJlY3RvcnkgY3J5cHRvL2VjZHNhLy4KCiAgICAgQWRkIGFwcGxpY2F0aW9ucyAnb3BlbnNzbCBlY3BhcmFtJyBhbmQgJ29wZW5zc2wgZWNkc2EnCiAgICAgKHRoZXNlIGFyZSBiYXNlZCBvbiAnb3BlbnNzbCBkc2FwYXJhbScgYW5kICdvcGVuc3NsIGRzYScpLgoKICAgICBFQ0RTQSBzdXBwb3J0IGlzIGFsc28gaW5jbHVkZWQgaW4gdmFyaW91cyBvdGhlciBmaWxlcyBhY3Jvc3MgdGhlCiAgICAgbGlicmFyeS4gIE1vc3Qgbm90YWJseSwKICAgICAtICdvcGVuc3NsIHJlcScgbm93IGhhcyBhICctbmV3a2V5IGVjZHNhOmZpbGUnIG9wdGlvbjsKICAgICAtIEVWUF9QS0NTODJQS0VZIChjcnlwdG8vZXZwL2V2cF9wa2V5LmMpIG5vdyBjYW4gaGFuZGxlIEVDRFNBOwogICAgIC0gWDUwOV9QVUJLRVlfZ2V0IChjcnlwdG8vYXNuMS94X3B1YmtleS5jKSBhbmQKICAgICAgIGQyaV9QdWJsaWNLZXkgKGNyeXB0by9hc24xL2QyaV9wdS5jKSBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gbWFrZQogICAgICAgdGhlbSBzdWl0YWJsZSBmb3IgRUNEU0Egd2hlcmUgZG9tYWluIHBhcmFtZXRlcnMgbXVzdCBiZQogICAgICAgZXh0cmFjdGVkIGJlZm9yZSB0aGUgc3BlY2lmaWMgcHVibGljIGtleTsKICAgICAtIEVDRFNBIGVuZ2luZSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgSW5jbHVkZSBzb21lIG5hbWVkIGVsbGlwdGljIGN1cnZlcywgYW5kIGFkZCBPSURzIGZyb20gWDkuNjIsCiAgICAgU0VDRywgYW5kIFdBUC9XVExTLiAgRWFjaCBjdXJ2ZSBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgbmV3CiAgICAgZnVuY3Rpb24KICAgICAgICAgIEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKCksCiAgICAgYW5kIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBuYW1lZCBjdXJ2ZXMgY2FuIGJlIG9idGFpbmVkIHdpdGgKICAgICAgICAgIEVDX2dldF9idWlsdGluX2N1cnZlcygpLgogICAgIEFsc28gYWRkIGEgJ2N1cnZlX25hbWUnIG1lbWJlciB0byBFQ19HUk9VUCBvYmplY3RzLCB3aGljaCBjYW4gYmUKICAgICBhY2Nlc3NlZCB2aWEKICAgICAgICAgRUNfR1JPVVBfc2V0X2N1cnZlX25hbWUoKQogICAgICAgICBFQ19HUk9VUF9nZXRfY3VydmVfbmFtZSgpCiAgICAgW05pbHMgTGFyc2NoIDxsYXJzY2hAdHJ1c3RjZW50ZXIuZGUsIEJvZG8gTW9lbGxlcl0KIAogICopIFJlbW92ZSBhIGZldyBjYWxscyB0byBibl93ZXhwYW5kKCkgaW4gQk5fc3FyKCkgKHRoZSBvbmUgaW4gdGhlcmUKICAgICB3YXMgYWN0dWFsbHkgbmV2ZXIgbmVlZGVkKSBhbmQgaW4gQk5fbXVsKCkuICBUaGUgcmVtb3ZhbCBpbiBCTl9tdWwoKQogICAgIHJlcXVpcmVkIGEgc21hbGwgY2hhbmdlIGluIGJuX211bF9wYXJ0X3JlY3Vyc2l2ZSgpIGFuZCB0aGUgYWRkaXRpb24KICAgICBvZiB0aGUgZnVuY3Rpb25zIGJuX2NtcF9wYXJ0X3dvcmRzKCksIGJuX3N1Yl9wYXJ0X3dvcmRzKCkgYW5kCiAgICAgYm5fYWRkX3BhcnRfd29yZHMoKSwgd2hpY2ggZG8gdGhlIHNhbWUgdGhpbmcgYXMgYm5fY21wX3dvcmRzKCksCiAgICAgYm5fc3ViX3dvcmRzKCkgYW5kIGJuX2FkZF93b3JkcygpIGV4Y2VwdCB0aGV5IHRha2UgYXJyYXlzIHdpdGgKICAgICBkaWZmZXJpbmcgc2l6ZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdsIGFuZCAwLjkuN20gIFsyMyBGZWIgMjAwN10KCiAgKikgQ2xlYW5zZSBQRU0gYnVmZmVycyBiZWZvcmUgZnJlZWluZyB0aGVtIHNpbmNlIHRoZXkgbWF5IGNvbnRhaW4gCiAgICAgc2Vuc2l0aXZlIGRhdGEuCiAgICAgW0JlbmphbWluIEJlbm5ldHQgPGJlbkBwc2MuZWR1Pl0KCiAgKikgSW5jbHVkZSAiIWVOVUxMIiBpbiBTU0xfREVGQVVMVF9DSVBIRVJfTElTVCB0byBtYWtlIHN1cmUgdGhhdAogICAgIGEgY2lwaGVyc3VpdGUgc3RyaW5nIHN1Y2ggYXMgIkRFRkFVTFQ6UlNBIiBjYW5ub3QgZW5hYmxlCiAgICAgYXV0aGVudGljYXRpb24tb25seSBjaXBoZXJzdWl0ZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU2luY2UgQUVTMTI4IGFuZCBBRVMyNTYgc2hhcmUgYSBzaW5nbGUgbWFzayBiaXQgaW4gdGhlIGxvZ2ljIG9mCiAgICAgc3NsL3NzbF9jaXBoLmMsIHRoZSBjb2RlIGZvciBtYXNraW5nIG91dCBkaXNhYmxlZCBjaXBoZXJzIG5lZWRzIGEKICAgICBrbHVkZ2UgdG8gd29yayBwcm9wZXJseSBpZiBBRVMxMjggaXMgYXZhaWxhYmxlIGFuZCBBRVMyNTYgaXNuJ3QuCiAgICAgW1ZpY3RvciBEdWNob3ZuaV0KCiAgKikgRXhwYW5kIHNlY3VyaXR5IGJvdW5kYXJ5IHRvIG1hdGNoIDEuMS4xIG1vZHVsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgcmVkdW5kYW50IGZlYXR1cmVzOiBoYXNoIGZpbGUgc291cmNlLCBlZGl0aW5nIG9mIHRlc3QgdmVjdG9ycwogICAgIG1vZGlmeSBmaXBzbGQgdG8gdXNlIGV4dGVybmFsIGZpcHNfcHJlbWFpbi5jIHNpZ25hdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgcGVybCBzY3JpcHQgbWtmaXBzc2NyLnBsIHRvIGNyZWF0ZSBzaGVsbCBzY3JpcHRzIG9yIGJhdGNoIGZpbGVzIHRvCiAgICAgcnVuIGFsZ29yaXRobSB0ZXN0IHByb2dyYW1zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgYWxnb3JpdGhtIHRlc3QgcHJvZ3JhbXMgbW9yZSB0b2xlcmFudCBvZiB3aGl0ZXNwYWNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhhdmUgU1NML1RMUyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gdG9sZXJhdGUgIm1pc21hdGNoZWQiIHJlY29yZAogICAgIHByb3RvY29sIHZlcnNpb24gd2hpbGUgcmVjZWl2aW5nIENsaWVudEhlbGxvIGV2ZW4gaWYgdGhlCiAgICAgQ2xpZW50SGVsbG8gaXMgZnJhZ21lbnRlZC4gIChUaGUgc2VydmVyIGNhbid0IGluc2lzdCBvbiB0aGUKICAgICBwYXJ0aWN1bGFyIHByb3RvY29sIHZlcnNpb24gaXQgaGFzIGNob3NlbiBiZWZvcmUgdGhlIFNlcnZlckhlbGxvCiAgICAgbWVzc2FnZSBoYXMgaW5mb3JtZWQgdGhlIGNsaWVudCBhYm91dCBoaXMgY2hvaWNlLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBMb2FkIGVycm9yIGNvZGVzIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHByZXNlbnQgaW5zdGVhZCBvZiB1c2luZyBhCiAgICAgc3RhdGljIHZhcmlhYmxlLiBUaGlzIGFsbG93cyB0aGVtIHRvIGJlIGNsZWFubHkgdW5sb2FkZWQgYW5kIHJlbG9hZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43ayBhbmQgMC45LjdsICBbMjggU2VwIDIwMDZdCgogICopIEludHJvZHVjZSBsaW1pdHMgdG8gcHJldmVudCBtYWxpY2lvdXMga2V5cyBiZWluZyBhYmxlIHRvCiAgICAgY2F1c2UgYSBkZW5pYWwgb2Ygc2VydmljZS4gIChDVkUtMjAwNi0yOTQwKQogICAgIFtTdGV2ZSBIZW5zb24sIEJvZG8gTW9lbGxlcl0KCiAgKikgRml4IEFTTi4xIHBhcnNpbmcgb2YgY2VydGFpbiBpbnZhbGlkIHN0cnVjdHVyZXMgdGhhdCBjYW4gcmVzdWx0CiAgICAgaW4gYSBkZW5pYWwgb2Ygc2VydmljZS4gIChDVkUtMjAwNi0yOTM3KSAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGJ1ZmZlciBvdmVyZmxvdyBpbiBTU0xfZ2V0X3NoYXJlZF9jaXBoZXJzKCkgZnVuY3Rpb24uIAogICAgIChDVkUtMjAwNi0zNzM4KSBbVGF2aXMgT3JtYW5keSBhbmQgV2lsbCBEcmV3cnksIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBGaXggU1NMIGNsaWVudCBjb2RlIHdoaWNoIGNvdWxkIGNyYXNoIGlmIGNvbm5lY3RpbmcgdG8gYQogICAgIG1hbGljaW91cyBTU0x2MiBzZXJ2ZXIuICAoQ1ZFLTIwMDYtNDM0MykKICAgICBbVGF2aXMgT3JtYW5keSBhbmQgV2lsbCBEcmV3cnksIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBDaGFuZ2UgY2lwaGVyc3VpdGUgc3RyaW5nIHByb2Nlc3Npbmcgc28gdGhhdCBhbiBleHBsaWNpdAogICAgIGNpcGhlcnN1aXRlIHNlbGVjdHMgdGhpcyBvbmUgY2lwaGVyc3VpdGUgKHNvIHRoYXQgIkFFUzI1Ni1TSEEiCiAgICAgd2lsbCBubyBsb25nZXIgaW5jbHVkZSAiQUVTMTI4LVNIQSIpLCBhbmQgYW55IG90aGVyIHNpbWlsYXIKICAgICBjaXBoZXJzdWl0ZSAoc2FtZSBiaXRtYXApIGZyb20gKm90aGVyKiBwcm90b2NvbCB2ZXJzaW9ucyAoc28gdGhhdAogICAgICJSQzQtTUQ1IiB3aWxsIHN0aWxsIGluY2x1ZGUgYm90aCB0aGUgU1NMIDIuMCBjaXBoZXJzdWl0ZSBhbmQgdGhlCiAgICAgU1NMIDMuMC9UTFMgMS4wIGNpcGhlcnN1aXRlKS4gIFRoaXMgaXMgYSBiYWNrcG9ydCBjb21iaW5pbmcKICAgICBjaGFuZ2VzIGZyb20gMC45LjhiIGFuZCAwLjkuOGQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdqIGFuZCAwLjkuN2sgIFswNSBTZXAgMjAwNl0KCiAgKikgQXZvaWQgUEtDUyAjMSB2MS41IHNpZ25hdHVyZSBhdHRhY2sgZGlzY292ZXJlZCBieSBEYW5pZWwgQmxlaWNoZW5iYWNoZXIKICAgICAoQ1ZFLTIwMDYtNDMzOSkgIFtCZW4gTGF1cmllIGFuZCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgQ2hhbmdlIHRoZSBVbml4IHJhbmRvbW5lc3MgZW50cm9weSBnYXRoZXJpbmcgdG8gdXNlIHBvbGwoKSB3aGVuCiAgICAgcG9zc2libGUgaW5zdGVhZCBvZiBzZWxlY3QoKSwgc2luY2UgdGhlIGxhdHRlciBoYXMgc29tZQogICAgIHVuZGVzaXJhYmxlIGxpbWl0YXRpb25zLgogICAgIFtEYXJyeWwgTWlsZXMgdmlhIFJpY2hhcmQgTGV2aXR0ZSBhbmQgQm9kbyBNb2VsbGVyXQoKICAqKSBEaXNhYmxlIHJvZ3VlIGNpcGhlcnN1aXRlczoKCiAgICAgIC0gU1NMdjIgMHgwOCAweDAwIDB4ODAgKCJSQzQtNjQtTUQ1IikKICAgICAgLSBTU0x2My9UTFN2MSAweDAwIDB4NjEgKCJFWFAxMDI0LVJDMi1DQkMtTUQ1IikKICAgICAgLSBTU0x2My9UTFN2MSAweDAwIDB4NjAgKCJFWFAxMDI0LVJDNC1NRDUiKQoKICAgICBUaGUgbGF0dGVyIHR3byB3ZXJlIHB1cnBvcnRlZGx5IGZyb20KICAgICBkcmFmdC1pZXRmLXRscy01Ni1iaXQtY2lwaGVyc3VpdGVzLTBbMDFdLnR4dCwgYnV0IGRvIG5vdCByZWFsbHkKICAgICBhcHBlYXIgdGhlcmUuCgogICAgIEFsc28gZGVhY3RpdmUgdGhlIHJlbWFpbmluZyBjaXBoZXJzdWl0ZXMgZnJvbQogICAgIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMDEudHh0LiAgVGhlc2UgYXJlIGp1c3QgYXMKICAgICB1bm9mZmljaWFsLCBhbmQgdGhlIElEIGhhcyBsb25nIGV4cGlyZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IFJTQSBibGluZGluZyBIZWlzZW5idWcgKHByb2JsZW1zIHNvbWV0aW1lcyBvY2N1cmVkIG9uCiAgICAgZHVhbC1jb3JlIG1hY2hpbmVzKSBhbmQgb3RoZXIgcG90ZW50aWFsIHRocmVhZC1zYWZldHkgaXNzdWVzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43aSBhbmQgMC45LjdqICBbMDQgTWF5IDIwMDZdCgogICopIEFkYXB0IGZpcHNsZCBhbmQgdGhlIGJ1aWxkIHN5c3RlbSB0byBsaW5rIGFnYWluc3QgdGhlIHZhbGlkYXRlZCBGSVBTCiAgICAgbW9kdWxlIGluIEZJUFMgbW9kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyBmb3IgVkMrKyAyMDA1IGJ1aWxkIHVuZGVyIFdpbmRvd3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBXaW5kb3dzIGJ1aWxkIHRhcmdldCBWQy0zMi1HTUFLRSBmb3IgVkMrKy4gVGhpcyB1c2VzIEdOVSBtYWtlIAogICAgIGZyb20gYSBXaW5kb3dzIGJhc2ggc2hlbGwgc3VjaCBhcyBNU1lTLiBJdCBpcyBhdXRvZGV0ZWN0ZWQgZnJvbSB0aGUKICAgICAiY29uZmlnIiBzY3JpcHQgd2hlbiBydW4gZnJvbSBhIFZDKysgZW52aXJvbm1lbnQuIE1vZGlmeSBzdGFuZGFyZCBWQysrCiAgICAgYnVpbGQgdG8gdXNlIGZpcHNjYW5pc3Rlci5vIGZyb20gdGhlIEdOVSBtYWtlIGJ1aWxkLiAKICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2ggYW5kIDAuOS43aSAgWzE0IE9jdCAyMDA1XQoKICAqKSBXcmFwcGVkIHRoZSBkZWZpbml0aW9uIG9mIEVWUF9NQVhfTURfU0laRSBpbiBhICNpZmRlZiBPUEVOU1NMX0ZJUFMuCiAgICAgVGhlIHZhbHVlIG5vdyBkaWZmZXJzIGRlcGVuZGluZyBvbiBpZiB5b3UgYnVpbGQgZm9yIEZJUFMgb3Igbm90LgogICAgIEJFV0FSRSEgIEEgcHJvZ3JhbSBsaW5rZWQgd2l0aCBhIHNoYXJlZCBGSVBTZWQgbGliY3J5cHRvIGNhbid0IGJlCiAgICAgc2FmZWx5IHJ1biB3aXRoIGEgbm9uLUZJUFNlZCBsaWJjcnlwdG8sIGFzIGl0IG1heSBjcmFzaCBiZWNhdXNlIG9mCiAgICAgdGhlIGRpZmZlcmVuY2UgaW5kdWNlZCBieSB0aGlzIGNoYW5nZS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdnIGFuZCAwLjkuN2ggIFsxMSBPY3QgMjAwNV0KCiAgKikgUmVtb3ZlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFNTTF9PUF9NU0lFX1NTTFYyX1JTQV9QQURESU5HCiAgICAgKHBhcnQgb2YgU1NMX09QX0FMTCkuICBUaGlzIG9wdGlvbiB1c2VkIHRvIGRpc2FibGUgdGhlCiAgICAgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBtYW4taW4tdGhlLW1pZGRsZSBwcm90b2NvbC12ZXJzaW9uCiAgICAgcm9sbGJhY2sgaW4gdGhlIFNTTCAyLjAgc2VydmVyIGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBhIGJhZAogICAgIGlkZWEuICAoQ1ZFLTIwMDUtMjk2OSkKCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBZdXRha2EgT2l3YSAoUmVzZWFyY2ggQ2VudGVyCiAgICAgZm9yIEluZm9ybWF0aW9uIFNlY3VyaXR5LCBOYXRpb25hbCBJbnN0aXR1dGUgb2YgQWR2YW5jZWQgSW5kdXN0cmlhbAogICAgIFNjaWVuY2UgYW5kIFRlY2hub2xvZ3kgW0FJU1RdLCBKYXBhbildCgogICopIE1pbmltYWwgc3VwcG9ydCBmb3IgWDkuMzEgc2lnbmF0dXJlcyBhbmQgUFNTIHBhZGRpbmcgbW9kZXMuIFRoaXMgaXMKICAgICBtYWlubHkgZm9yIEZJUFMgY29tcGxpYW5jZSBhbmQgbm90IGZ1bGx5IGludGVncmF0ZWQgYXQgdGhpcyBzdGFnZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGb3IgRFNBIHNpZ25pbmcsIHVubGVzcyBEU0FfRkxBR19OT19FWFBfQ09OU1RUSU1FIGlzIHNldCwgcGVyZm9ybQogICAgIHRoZSBleHBvbmVudGlhdGlvbiB1c2luZyBhIGZpeGVkLWxlbmd0aCBleHBvbmVudC4gIChPdGhlcndpc2UsCiAgICAgdGhlIGluZm9ybWF0aW9uIGxlYWtlZCB0aHJvdWdoIHRpbWluZyBjb3VsZCBleHBvc2UgdGhlIHNlY3JldCBrZXkKICAgICBhZnRlciBtYW55IHNpZ25hdHVyZXM7IGNmLiBCbGVpY2hlbmJhY2hlcidzIGF0dGFjayBvbiBEU0Egd2l0aAogICAgIGJpYXNlZCBrLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIGEgbmV3IGZpeGVkLXdpbmRvdyBtb2RfZXhwIGltcGxlbWVudGF0aW9uIHRoZSBkZWZhdWx0IGZvcgogICAgIFJTQSwgRFNBLCBhbmQgREggcHJpdmF0ZS1rZXkgb3BlcmF0aW9ucyBzbyB0aGF0IHRoZSBzZXF1ZW5jZSBvZgogICAgIHNxdWFyZXMgYW5kIG11bHRpcGxpZXMgYW5kIHRoZSBtZW1vcnkgYWNjZXNzIHBhdHRlcm4gYXJlCiAgICAgaW5kZXBlbmRlbnQgb2YgdGhlIHBhcnRpY3VsYXIgc2VjcmV0IGtleS4gIFRoaXMgd2lsbCBtaXRpZ2F0ZQogICAgIGNhY2hlLXRpbWluZyBhbmQgcG90ZW50aWFsIHJlbGF0ZWQgYXR0YWNrcy4KCiAgICAgQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSgpIGlzIHRoZSBuZXcgZXhwb25lbnRpYXRpb24gaW1wbGVtZW50YXRpb24sCiAgICAgYW5kIHRoaXMgaXMgYXV0b21hdGljYWxseSB1c2VkIGJ5IEJOX21vZF9leHBfbW9udCgpIGlmIHRoZSBuZXcgZmxhZwogICAgIEJOX0ZMR19FWFBfQ09OU1RUSU1FIGlzIHNldCBmb3IgdGhlIGV4cG9uZW50LiAgUlNBLCBEU0EsIGFuZCBESAogICAgIHdpbGwgdXNlIHRoaXMgQk4gZmxhZyBmb3IgcHJpdmF0ZSBleHBvbmVudHMgdW5sZXNzIHRoZSBmbGFnCiAgICAgUlNBX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSwgRFNBX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSwgb3IKICAgICBESF9GTEFHX05PX0VYUF9DT05TVFRJTUUsIHJlc3BlY3RpdmVseSwgaXMgc2V0LgoKICAgICBbTWF0dGhldyBEIFdvb2QgKEludGVsIENvcnApLCB3aXRoIHNvbWUgY2hhbmdlcyBieSBCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSB0aGUgY2xpZW50IGltcGxlbWVudGF0aW9uIGZvciBTU0x2MjNfbWV0aG9kKCkgYW5kCiAgICAgU1NMdjIzX2NsaWVudF9tZXRob2QoKSBzbyB0aGF0IGlzIHVzZXMgdGhlIFNTTCAzLjAvVExTIDEuMAogICAgIENsaWVudCBIZWxsbyBtZXNzYWdlIGZvcm1hdCBpZiB0aGUgU1NMX09QX05PX1NTTHYyIG9wdGlvbiBpcyBzZXQuCiAgICAgKFByZXZpb3VzbHksIHRoZSBTU0wgMi4wIGJhY2t3YXJkcyBjb21wYXRpYmxlIENsaWVudCBIZWxsbwogICAgIG1lc3NhZ2UgZm9ybWF0IHdvdWxkIGJlIHVzZWQgZXZlbiB3aXRoIFNTTF9PUF9OT19TU0x2Mi4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHNtaW1lLXR5cGUgTUlNRSBwYXJhbWV0ZXIgaW4gUy9NSU1FIG1lc3NhZ2VzIHdoaWNoIHNvbWUKICAgICBjbGllbnRzIG5lZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX01PTlRfQ1RYX3NldF9sb2NrZWQoKSB0byBzZXQgbW9udGdvbWVyeSBwYXJhbWV0ZXJzIGluCiAgICAgYSB0aHJlYWRzYWZlIG1hbm5lci4gTW9kaWZ5IHJzYSBjb2RlIHRvIHVzZSBuZXcgZnVuY3Rpb24gYW5kIGFkZCBjYWxscwogICAgIHRvIGRzYSBhbmQgZGggY29kZSAod2hpY2ggaGFkIHJhY2UgY29uZGl0aW9ucyBiZWZvcmUpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluY2x1ZGUgdGhlIGZpeGVkIGVycm9yIGxpYnJhcnkgY29kZSBpbiB0aGUgQyBlcnJvciBmaWxlIGRlZmluaXRpb25zCiAgICAgaW5zdGVhZCBvZiBmaXhpbmcgdGhlbSB1cCBhdCBydW50aW1lLiBUaGlzIGtlZXBzIHRoZSBlcnJvciBjb2RlCiAgICAgc3RydWN0dXJlcyBjb25zdGFudC4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2YgYW5kIDAuOS43ZyAgWzExIEFwciAyMDA1XQoKICBbTkI6IE9wZW5TU0wgMC45LjdoIGFuZCBsYXRlciAwLjkuNyBwYXRjaCBsZXZlbHMgd2VyZSByZWxlYXNlZCBhZnRlcgogIE9wZW5TU0wgMC45LjguXQoKICAqKSBGaXhlcyBmb3IgbmV3ZXIga2VyYmVyb3MgaGVhZGVycy4gTkI6IHRoZSBjYXN0cyBhcmUgbmVlZGVkIGJlY2F1c2UKICAgICB0aGUgJ2xlbmd0aCcgZmllbGQgaXMgc2lnbmVkIG9uIG9uZSB2ZXJzaW9uIGFuZCB1bnNpZ25lZCBvbiBhbm90aGVyCiAgICAgd2l0aCBubyAoPykgb2J2aW91cyB3YXkgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSwgd2l0aG91dCB0aGVzZSBWQysrCiAgICAgY29tcGxhaW5zLiBBbHNvIHRoZSAiZGVmaW5pdGlvbiIgb2YgRkFSIChibGFuaykgaXMgbm8gbG9uZ2VyIGluY2x1ZGVkCiAgICAgbm9yIGlzIHRoZSBlcnJvciBFTk9NRU0uIEtSQjVfUFJJVkFURSBoYXMgdG8gYmUgc2V0IHRvIDEgdG8gcGljayB1cAogICAgIHNvbWUgbmVlZGVkIGRlZmluaXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVuZG8gQ3lnd2luIGNoYW5nZS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkZWQgc3VwcG9ydCBmb3IgcHJveHkgY2VydGlmaWNhdGVzIGFjY29yZGluZyB0byBSRkMgMzgyMC4KICAgICBCZWNhdXNlIHRoZXkgbWF5IGJlIGEgc2VjdXJpdHkgdGhyZWFkIHRvIHVuYXdhcmUgYXBwbGljYXRpb25zLAogICAgIHRoZXkgbXVzdCBiZSBleHBsaWNpdGVseSBhbGxvd2VkIGluIHJ1bi10aW1lLiAgU2VlCiAgICAgZG9jcy9IT1dUTy9wcm94eV9jZXJ0aWZpY2F0ZXMudHh0IGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43ZSBhbmQgMC45LjdmICBbMjIgTWFyIDIwMDVdCgogICopIFVzZSAoU1NMX1JBTkRPTV9WQUxVRSAtIDQpIGJ5dGVzIG9mIHBzZXVkbyByYW5kb20gZGF0YSB3aGVuIGdlbmVyYXRpbmcKICAgICBzZXJ2ZXIgYW5kIGNsaWVudCByYW5kb20gdmFsdWVzLiBQcmV2aW91c2x5CiAgICAgKFNTTF9SQU5ET01fVkFMVUUgLSBzaXplb2YodGltZV90KSkgd291bGQgYmUgdXNlZCB3aGljaCB3b3VsZCByZXN1bHQgaW4KICAgICBsZXNzIHJhbmRvbSBkYXRhIHdoZW4gc2l6ZW9mKHRpbWVfdCkgPiA0IChzb21lIDY0IGJpdCBwbGF0Zm9ybXMpLgoKICAgICBUaGlzIGNoYW5nZSBoYXMgbmVnbGlnaWJsZSBzZWN1cml0eSBpbXBhY3QgYmVjYXVzZToKCiAgICAgMS4gU2VydmVyIGFuZCBjbGllbnQgcmFuZG9tIHZhbHVlcyBzdGlsbCBoYXZlIDI0IGJ5dGVzIG9mIHBzZXVkbyByYW5kb20KICAgICAgICBkYXRhLgoKICAgICAyLiBTZXJ2ZXIgYW5kIGNsaWVudCByYW5kb20gdmFsdWVzIGFyZSBzZW50IGluIHRoZSBjbGVhciBpbiB0aGUgaW5pdGlhbAogICAgICAgIGhhbmRzaGFrZS4KCiAgICAgMy4gVGhlIG1hc3RlciBzZWNyZXQgaXMgZGVyaXZlZCB1c2luZyB0aGUgcHJlbWFzdGVyIHNlY3JldCAoNDggYnl0ZXMgaW4KICAgICAgICBzaXplIGZvciBzdGF0aWMgUlNBIGNpcGhlcnN1aXRlcykgYXMgd2VsbCBhcyBjbGllbnQgc2VydmVyIGFuZCByYW5kb20KICAgICAgICB2YWx1ZXMuCgogICAgIFRoZSBPcGVuU1NMIHRlYW0gd291bGQgbGlrZSB0byB0aGFuayB0aGUgVUsgTklTQ0MgZm9yIGJyaW5naW5nIHRoaXMgaXNzdWUKICAgICB0byBvdXIgYXR0ZW50aW9uLiAKCiAgICAgW1N0ZXBoZW4gSGVuc29uLCByZXBvcnRlZCBieSBVSyBOSVNDQ10KCiAgKikgVXNlIFdpbmRvd3MgcmFuZG9tbmVzcyBjb2xsZWN0aW9uIG9uIEN5Z3dpbi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IGhhbmcgaW4gRUdEL1BSTkdEIHF1ZXJ5IHdoZW4gY29tbXVuaWNhdGlvbiBzb2NrZXQgaXMgY2xvc2VkCiAgICAgcHJlbWF0dXJlbHkgYnkgRUdEL1BSTkdELgogICAgIFtEYXJyZW4gVHVja2VyIDxkdHVja2VyQHppcC5jb20uYXU+IHZpYSBMdXR6IErkbmlja2UsIHJlc29sdmVzICMxMDE0XQoKICAqKSBQcm9tcHQgZm9yIHBhc3MgcGhyYXNlcyB3aGVuIGFwcHJvcHJpYXRlIGZvciBQS0NTMTIgaW5wdXQgZm9ybWF0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJhY2stcG9ydCBvZiBzZWxlY3RlZCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgZnJvbSBkZXZlbG9wbWVudAogICAgIGJyYW5jaCwgYXMgd2VsbCBhcyBpbXByb3ZlZCBzdXBwb3J0IGZvciBQb3dlclBDIHBsYXRmb3Jtcy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIGxvdHMgb2YgY2hlY2tzIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLCBlcnJvciBjb2RlcyB0byBpbmRpY2F0ZQogICAgIGZhaWx1cmUgYW5kIGZyZWVpbmcgdXAgbWVtb3J5IGlmIGEgZmFpbHVyZSBvY2N1cnMuCiAgICAgW05hdXRpY3VzIE5ldHdvcmtzIFNTTCBUZWFtIDxvcGVuc3NsQG5hdXRpY3VzbmV0LmNvbT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyAtcGFzc2luIGFyZ3VtZW50IHRvIGRnc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUGVyZm9ybSBzb21lIGNoYXJhY3RlciBjb21wYXJpc29ucyBvZiBkaWZmZXJlbnQgdHlwZXMgaW4gWDUwOV9OQU1FX2NtcDoKICAgICB0aGlzIGlzIG5lZWRlZCBmb3Igc29tZSBjZXJ0aWZpY2F0ZXMgdGhhdCByZWVuY29kZSBETnMgaW50byBVVEY4U3RyaW5ncwogICAgIChpbiB2aW9sYXRpb24gb2YgUkZDMzI4MCkgYW5kIGNhbid0IG9yIHdvbnQgaXNzdWUgbmFtZSByb2xsb3ZlcgogICAgIGNlcnRpZmljYXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGFuIGV4cGxpY2l0IGNoZWNrIGR1cmluZyBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIHRvIHNlZSB0aGF0CiAgICAgdGhlIENBIHNldHRpbmcgaW4gZWFjaCBjZXJ0aWZpY2F0ZSBvbiB0aGUgY2hhaW4gaXMgY29ycmVjdC4gIEFzIGEKICAgICBzaWRlIGVmZmVjdCBhbHdheXMgZG8gdGhlIGZvbGxvd2luZyBiYXNpYyBjaGVja3Mgb24gZXh0ZW5zaW9ucywKICAgICBub3QganVzdCB3aGVuIHRoZXJlJ3MgYW4gYXNzb2NpYXRlZCBwdXJwb3NlIHRvIHRoZSBjaGVjazoKCiAgICAgIC0gaWYgdGhlcmUgaXMgYW4gdW5oYW5kbGVkIGNyaXRpY2FsIGV4dGVuc2lvbiAodW5sZXNzIHRoZSB1c2VyCiAgICAgICAgaGFzIGNob3NlbiB0byBpZ25vcmUgdGhpcyBmYXVsdCkKICAgICAgLSBpZiB0aGUgcGF0aCBsZW5ndGggaGFzIGJlZW4gZXhjZWVkZWQgKGlmIG9uZSBpcyBzZXQgYXQgYWxsKQogICAgICAtIHRoYXQgY2VydGFpbiBleHRlbnNpb25zIGZpdCB0aGUgYXNzb2NpYXRlZCBwdXJwb3NlIChpZiBvbmUgaGFzCiAgICAgICAgYmVlbiBnaXZlbikKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2QgYW5kIDAuOS43ZSAgWzI1IE9jdCAyMDA0XQoKICAqKSBBdm9pZCBhIHJhY2UgY29uZGl0aW9uIHdoZW4gQ1JMcyBhcmUgY2hlY2tlZCBpbiBhIG11bHRpIHRocmVhZGVkIAogICAgIGVudmlyb25tZW50LiBUaGlzIHdvdWxkIGhhcHBlbiBkdWUgdG8gdGhlIHJlb3JkZXJpbmcgb2YgdGhlIHJldm9rZWQKICAgICBlbnRyaWVzIGR1cmluZyBzaWduYXR1cmUgY2hlY2tpbmcgYW5kIHNlcmlhbCBudW1iZXIgbG9va3VwLiBOb3cgdGhlCiAgICAgZW5jb2RpbmcgaXMgY2FjaGVkIGFuZCB0aGUgc2VyaWFsIG51bWJlciBzb3J0IHBlcmZvcm1lZCB1bmRlciBhIGxvY2suCiAgICAgQWRkIG5ldyBTVEFDSyBmdW5jdGlvbiBza19pc19zb3J0ZWQoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgRGVsdGEgQ1JMIHRvIHRoZSBleHRlbnNpb24gY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIGZpeGVzIHRvIHMzX3BrdC5jIHNvIGFsZXJ0cyBhcmUgc2VudCBwcm9wZXJseS4KICAgICBbRGF2aWQgSG9sbWVzIDxkLmhvbG1lc0BmNS5jb20+XQoKICAqKSBSZWR1Y2UgdGhlIGNoYW5jZXMgb2YgZHVwbGljYXRlIGlzc3VlciBuYW1lIGFuZCBzZXJpYWwgbnVtYmVycyAoaW4KICAgICB2aW9sYXRpb24gb2YgUkZDMzI4MCkgdXNpbmcgdGhlIE9wZW5TU0wgY2VydGlmaWNhdGUgY3JlYXRpb24gdXRpbGl0aWVzLgogICAgIFRoaXMgaXMgZG9uZSBieSBjcmVhdGluZyBhIHJhbmRvbSA2NCBiaXQgdmFsdWUgZm9yIHRoZSBpbml0aWFsIHNlcmlhbAogICAgIG51bWJlciB3aGVuIGEgc2VyaWFsIG51bWJlciBmaWxlIGlzIGNyZWF0ZWQgb3Igd2hlbiBhIHNlbGYgc2lnbmVkCiAgICAgY2VydGlmaWNhdGUgaXMgY3JlYXRlZCB1c2luZyAnb3BlbnNzbCByZXEgLXg1MDknLiBUaGUgaW5pdGlhbCBzZXJpYWwKICAgICBudW1iZXIgZmlsZSBpcyBjcmVhdGVkIHVzaW5nICdvcGVuc3NsIHg1MDkgLW5leHRfc2VyaWFsJyBpbiBDQS5wbAogICAgIHJhdGhlciB0aGFuIGJlaW5nIGluaXRpYWxpemVkIHRvIDEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdjIGFuZCAwLjkuN2QgIFsxNyBNYXIgMjAwNF0KCiAgKikgRml4IG51bGwtcG9pbnRlciBhc3NpZ25tZW50IGluIGRvX2NoYW5nZV9jaXBoZXJfc3BlYygpIHJldmVhbGVkICAgICAgICAgICAKICAgICBieSB1c2luZyB0aGUgQ29kZW5vbWljb24gVExTIFRlc3QgVG9vbCAoQ1ZFLTIwMDQtMDA3OSkgICAgICAgICAgICAgICAgICAgIAogICAgIFtKb2UgT3J0b24sIFN0ZXZlIEhlbnNvbl0gICAKCiAgKikgRml4IGZsYXcgaW4gU1NML1RMUyBoYW5kc2hha2luZyB3aGVuIHVzaW5nIEtlcmJlcm9zIGNpcGhlcnN1aXRlcwogICAgIChDVkUtMjAwNC0wMTEyKQogICAgIFtKb2UgT3J0b24sIFN0ZXZlIEhlbnNvbl0gICAKCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGFjdGl2ZSBjZXJ0aWZpY2F0ZXMgd2l0aCB0aGUgc2FtZQogICAgIHN1YmplY3QgaW4gdGhlIENBIGluZGV4IGZpbGUuICBUaGlzIGlzIGRvbmUgb25seSBpZiB0aGUga2V5d29yZAogICAgICd1bmlxdWVfc3ViamVjdCcgaXMgc2V0IHRvICdubycgaW4gdGhlIG1haW4gQ0Egc2VjdGlvbiAoZGVmYXVsdAogICAgIGlmICdDQV9kZWZhdWx0Jykgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSB2YWx1ZSBpcyBzYXZlZAogICAgIHdpdGggdGhlIGRhdGFiYXNlIGl0c2VsZiBpbiBhIHNlcGFyYXRlIGluZGV4IGF0dHJpYnV0ZSBmaWxlLAogICAgIG5hbWVkIGxpa2UgdGhlIGluZGV4IGZpbGUgd2l0aCAnLmF0dHInIGFwcGVuZGVkIHRvIHRoZSBuYW1lLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFg1MDkgdmVyaWZ5IGZpeGVzLiBEaXNhYmxlIGJyb2tlbiBjZXJ0aWZpY2F0ZSB3b3JrYXJvdW5kcyB3aGVuIAogICAgIFg1MDlfVl9GTEFHU19YNTA5X1NUUklDVCBpcyBzZXQuIENoZWNrIENSTCBpc3N1ZXIgaGFzIGNSTFNpZ24gc2V0IGlmCiAgICAga2V5VXNhZ2UgZXh0ZW5zaW9uIHByZXNlbnQuIERvbid0IGFjY2VwdCBDUkxzIHdpdGggdW5oYW5kbGVkIGNyaXRpY2FsCiAgICAgZXh0ZW5zaW9uczogc2luY2UgdmVyaWZ5IGN1cnJlbnRseSBkb2Vzbid0IHByb2Nlc3MgQ1JMIGV4dGVuc2lvbnMgdGhpcwogICAgIHJlamVjdHMgYSBDUkwgd2l0aCAqYW55KiBjcml0aWNhbCBleHRlbnNpb25zLiBBZGQgbmV3IHZlcmlmeSBlcnJvciBjb2RlcwogICAgIGZvciB0aGVzZSBjYXNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBXaGVuIGNyZWF0aW5nIGFuIE9DU1Agbm9uY2UgdXNlIGFuIE9DVEVUIFNUUklORyBpbnNpZGUgdGhlIGV4dG5WYWx1ZS4KICAgICBBIGNsYXJpZmljYXRpb24gb2YgUkZDMjU2MCB3aWxsIHJlcXVpcmUgdGhlIHVzZSBvZiBPQ1RFVCBTVFJJTkdzIGFuZCAKICAgICBzb21lIGltcGxlbWVudGF0aW9ucyBjYW5ub3QgaGFuZGxlIHRoZSBjdXJyZW50IHJhdyBmb3JtYXQuIFNpbmNlIE9wZW5TU0wKICAgICBjb3BpZXMgYW5kIGNvbXBhcmVzIE9DU1Agbm9uY2VzIGFzIG9wYXF1ZSBibG9icyB3aXRob3V0IGFueSBhdHRlbXB0IGF0CiAgICAgcGFyc2luZyB0aGVtIHRoaXMgc2hvdWxkIG5vdCBjcmVhdGUgYW55IGNvbXBhdGliaWxpdHkgaXNzdWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBtZCBmbGFnIEVWUF9NRF9DVFhfRkxBR19SRVVTRSB0aGlzIGFsbG93cyBtZF9kYXRhIHRvIGJlIHJldXNlZCB3aGVuCiAgICAgY2FsbGluZyBFVlBfTURfQ1RYX2NvcHlfZXgoKSB0byBhdm9pZCBjYWxsaW5nIE9QRU5TU0xfbWFsbG9jKCkuIFdpdGhvdXQKICAgICB0aGlzIEhNQUMgKGFuZCBvdGhlcikgb3BlcmF0aW9ucyBhcmUgc2V2ZXJhbCB0aW1lcyBzbG93ZXIgdGhhbiBPcGVuU1NMCiAgICAgPCAwLjkuNy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQcmludCBvdXQgR2VuZXJhbGl6ZWRUaW1lIGFuZCBVVENUaW1lIGluIEFTTjFfU1RSSU5HX3ByaW50X2V4KCkuCiAgICAgW1BldGVyIFN5bHZlc3RlciA8UGV0ZXIuU3lsdmVzdGVyQEVkZWxXZWIuZnI+XQoKICAqKSBVc2UgdGhlIGNvcnJlY3QgY29udGVudCB3aGVuIHNpZ25pbmcgdHlwZSAib3RoZXIiLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43YiBhbmQgMC45LjdjICBbMzAgU2VwIDIwMDNdCgogICopIEZpeCB2YXJpb3VzIGJ1Z3MgcmV2ZWFsZWQgYnkgcnVubmluZyB0aGUgTklTQ0MgdGVzdCBzdWl0ZToKCiAgICAgU3RvcCBvdXQgb2YgYm91bmRzIHJlYWRzIGluIHRoZSBBU04xIGNvZGUgd2hlbiBwcmVzZW50ZWQgd2l0aAogICAgIGludmFsaWQgdGFncyAoQ1ZFLTIwMDMtMDU0MyBhbmQgQ1ZFLTIwMDMtMDU0NCkuCiAgICAgCiAgICAgRnJlZSB1cCBBU04xX1RZUEUgY29ycmVjdGx5IGlmIEFOWSB0eXBlIGlzIGludmFsaWQgKENWRS0yMDAzLTA1NDUpLgoKICAgICBJZiB2ZXJpZnkgY2FsbGJhY2sgaWdub3JlcyBpbnZhbGlkIHB1YmxpYyBrZXkgZXJyb3JzIGRvbid0IHRyeSB0byBjaGVjawogICAgIGNlcnRpZmljYXRlIHNpZ25hdHVyZSB3aXRoIHRoZSBOVUxMIHB1YmxpYyBrZXkuCgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAtaWdub3JlX2VyciBvcHRpb24gaW4gb2NzcCBhcHBsaWNhdGlvbiB0byBzdG9wIHRoZSBzZXJ2ZXIKICAgICBleGl0aW5nIG9uIHRoZSBmaXJzdCBlcnJvciBpbiBhIHJlcXVlc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gc3NsM19hY2NlcHQoKSAoc3NsL3MzX3NydnIuYykgb25seSBhY2NlcHQgYSBjbGllbnQgY2VydGlmaWNhdGUKICAgICBpZiB0aGUgc2VydmVyIHJlcXVlc3RlZCBvbmU6IGFzIHN0YXRlZCBpbiBUTFMgMS4wIGFuZCBTU0wgMy4wCiAgICAgc3BlY2lmaWNhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gc3NsM19nZXRfY2xpZW50X2hlbGxvKCkgKHNzbC9zM19zcnZyLmMpLCB0b2xlcmF0ZSBhZGRpdGlvbmFsCiAgICAgZXh0cmEgZGF0YSBhZnRlciB0aGUgY29tcHJlc3Npb24gbWV0aG9kcyBub3Qgb25seSBmb3IgVExTIDEuMAogICAgIGJ1dCBhbHNvIGZvciBTU0wgMy4wIChhcyByZXF1aXJlZCBieSB0aGUgc3BlY2lmaWNhdGlvbikuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBNYXR0aGlhcyBMb2VwZmVdCgogICopIENoYW5nZSBYNTA5X2NlcnRpZmljYXRlX3R5cGUoKSB0byBtYXJrIHRoZSBrZXkgYXMgZXhwb3J0ZWQvZXhwb3J0YWJsZQogICAgIHdoZW4gaXQncyA1MTIgKmJpdHMqIGxvbmcsIG5vdCA1MTIgYnl0ZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIEFFU19jYmNfZW5jcnlwdCgpIHNvIGl0IG91dHB1dHMgZXhhY3QgbXVsdGlwbGUgb2YKICAgICBibG9ja3MgZHVyaW5nIGVuY3J5cHRpb24uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVmFyaW91cyBmaXhlcyB0byBiYXNlNjQgQklPIGFuZCBub24gYmxvY2tpbmcgSS9PLiBPbiB3cml0ZSAKICAgICBmbHVzaGVzIHdlcmUgbm90IGhhbmRsZWQgcHJvcGVybHkgaWYgdGhlIEJJTyByZXRyaWVkLiBPbiByZWFkCiAgICAgZGF0YSB3YXMgbm90IGJlaW5nIGJ1ZmZlcmVkIHByb3Blcmx5IGFuZCBoYWQgdmFyaW91cyBsb2dpYyBidWdzLgogICAgIFRoaXMgYWxzbyBhZmZlY3RzIGJsb2NraW5nIEkvTyB3aGVuIHRoZSBkYXRhIGJlaW5nIGRlY29kZWQgaXMgYQogICAgIGNlcnRhaW4gc2l6ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIFMvTUlNRSBidWdmaXhlcyBhbmQgY29tcGF0aWJpbGl0eSBjaGFuZ2VzOgogICAgIG91dHB1dCBjb3JyZWN0IGFwcGxpY2F0aW9uL3BrY3M3IE1JTUUgdHlwZSBpZgogICAgIFBLQ1M3X05PT0xETUlNRVRZUEUgaXMgc2V0LiBUb2xlcmF0ZSBzb21lIGJyb2tlbiBzaWduYXR1cmVzLgogICAgIE91dHB1dCBDUitMRiBmb3IgRU9MIGlmIFBLQ1M3X0NSTEZFT0wgaXMgc2V0ICh0aGlzIG1ha2VzIG9wZW5pbmcKICAgICBvZiBmaWxlcyBhcyAuZW1sIHdvcmspLiBDb3JyZWN0bHkgaGFuZGxlIHZlcnkgbG9uZyBsaW5lcyBpbiBNSU1FCiAgICAgcGFyc2VyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43YSBhbmQgMC45LjdiICBbMTAgQXByIDIwMDNdCgogICopIENvdW50ZXJtZWFzdXJlIGFnYWluc3QgdGhlIEtsaW1hLVBva29ybnktUm9zYSBleHRlbnNpb24gb2YKICAgICBCbGVpY2hiYWNoZXIncyBhdHRhY2sgb24gUEtDUyAjMSB2MS41IHBhZGRpbmc6IHRyZWF0CiAgICAgYSBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBtaXNtYXRjaCBsaWtlIGEgZGVjcnlwdGlvbiBlcnJvcgogICAgIGluIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UgKHNzbC9zM19zcnZyLmMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFR1cm4gb24gUlNBIGJsaW5kaW5nIGJ5IGRlZmF1bHQgaW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICB0byBhdm9pZCBhIHRpbWluZyBhdHRhY2suIEFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQgaXQgY2FuIGNhbGwKICAgICBSU0FfYmxpbmRpbmdfb2ZmKCkgb3IgdXNlIHRoZSBuZXcgZmxhZyBSU0FfRkxBR19OT19CTElORElORy4KICAgICBUaGV5IHdvdWxkIGJlIGlsbC1hZHZpc2VkIHRvIGRvIHNvIGluIG1vc3QgY2FzZXMuCiAgICAgW0JlbiBMYXVyaWUsIFN0ZXZlIEhlbnNvbiwgR2VvZmYgVGhvcnBlLCBCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBSU0EgYmxpbmRpbmcgY29kZSBzbyB0aGF0IGl0IHdvcmtzIHdoZW4gdGhlIFBSTkcgaXMgbm90CiAgICAgc2VlZGVkIChpbiB0aGlzIGNhc2UsIHRoZSBzZWNyZXQgUlNBIGV4cG9uZW50IGlzIGFidXNlZCBhcwogICAgIGFuIHVucHJlZGljdGFibGUgc2VlZCAtLSBpZiBpdCBpcyBub3QgdW5wcmVkaWN0YWJsZSwgdGhlcmUKICAgICBpcyBubyBwb2ludCBpbiBibGluZGluZyBhbnl3YXkpLiAgTWFrZSBSU0EgYmxpbmRpbmcgdGhyZWFkLXNhZmUKICAgICBieSByZW1lbWJlcmluZyB0aGUgY3JlYXRvcidzIHRocmVhZCBJRCBpbiByc2EtPmJsaW5kaW5nIGFuZAogICAgIGhhdmluZyBhbGwgb3RoZXIgdGhyZWFkcyB1c2UgbG9jYWwgb25lLXRpbWUgYmxpbmRpbmcgZmFjdG9ycwogICAgICh0aGlzIHJlcXVpcmVzIG1vcmUgY29tcHV0YXRpb24gdGhhbiBzaGFyaW5nIHJzYS0+YmxpbmRpbmcsIGJ1dAogICAgIGF2b2lkcyBleGNlc3NpdmUgbG9ja2luZzsgYW5kIGlmIGFuIFJTQSBvYmplY3QgaXMgbm90IHNoYXJlZAogICAgIGJldHdlZW4gdGhyZWFkcywgYmxpbmRpbmcgd2lsbCBzdGlsbCBiZSB2ZXJ5IGZhc3QpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeGVkIGEgdHlwbyBidWcgdGhhdCB3b3VsZCBjYXVzZSBFTkdJTkVfc2V0X2RlZmF1bHQoKSB0byBzZXQgYW4KICAgICBFTkdJTkUgYXMgZGVmYXVsdHMgZm9yIGFsbCBzdXBwb3J0ZWQgYWxnb3JpdGhtcyBpcnJlc3BlY3RpdmUgb2YKICAgICB0aGUgJ2ZsYWdzJyBwYXJhbWV0ZXIuICdmbGFncycgaXMgbm93IGhvbm91cmVkLCBzbyBhcHBsaWNhdGlvbnMKICAgICBzaG91bGQgbWFrZSBzdXJlIHRoZXkgYXJlIHBhc3NpbmcgaXQgY29ycmVjdGx5LgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFRhcmdldCAibWluZ3ciIG5vdyBhbGxvd3MgbmF0aXZlIFdpbmRvd3MgY29kZSB0byBiZSBnZW5lcmF0ZWQgaW4KICAgICB0aGUgQ3lnd2luIGVudmlyb25tZW50IGFzIHdlbGwgYXMgd2l0aCB0aGUgTWluR1cgY29tcGlsZXIuCiAgICAgW1VsZiBNb2VsbGVyXSAKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjcgYW5kIDAuOS43YSAgWzE5IEZlYiAyMDAzXQoKICAqKSBJbiBzc2wzX2dldF9yZWNvcmQgKHNzbC9zM19wa3QuYyksIG1pbmltaXplIGluZm9ybWF0aW9uIGxlYWtlZAogICAgIHZpYSB0aW1pbmcgYnkgcGVyZm9ybWluZyBhIE1BQyBjb21wdXRhdGlvbiBldmVuIGlmIGluY29ycmVjdAogICAgIGJsb2NrIGNpcGhlciBwYWRkaW5nIGhhcyBiZWVuIGZvdW5kLiAgVGhpcyBpcyBhIGNvdW50ZXJtZWFzdXJlCiAgICAgYWdhaW5zdCBhY3RpdmUgYXR0YWNrcyB3aGVyZSB0aGUgYXR0YWNrZXIgaGFzIHRvIGRpc3Rpbmd1aXNoCiAgICAgYmV0d2VlbiBiYWQgcGFkZGluZyBhbmQgYSBNQUMgdmVyaWZpY2F0aW9uIGVycm9yLiAoQ1ZFLTIwMDMtMDA3OCkKCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBCcmljZSBDYW52ZWwgKEVQRkwpLAogICAgIEFsYWluIEhpbHRnZW4gKFVCUyksIFNlcmdlIFZhdWRlbmF5IChFUEZMKSwgYW5kCiAgICAgTWFydGluIFZ1YWdub3V4IChFUEZMLCBJbGlvbildCgogICopIE1ha2UgdGhlIG5vLWVyciBvcHRpb24gd29yayBhcyBpbnRlbmRlZC4gIFRoZSBpbnRlbnRpb24gd2l0aCBuby1lcnIKICAgICBpcyBub3QgdG8gaGF2ZSB0aGUgd2hvbGUgZXJyb3Igc3RhY2sgaGFuZGxpbmcgcm91dGluZXMgcmVtb3ZlZCBmcm9tCiAgICAgbGliY3J5cHRvLCBpdCdzIG9ubHkgaW50ZW5kZWQgdG8gcmVtb3ZlIGFsbCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQKICAgICByZWFzb24gdGV4dHMsIHRoZXJlYnkgcmVtb3Zpbmcgc29tZSBvZiB0aGUgZm9vdHByaW50IHRoYXQgbWF5IG5vdAogICAgIGJlIGludGVyZXN0aW5nIGlmIHRob3NlIGVycm9ycyBhcmVuJ3QgZGlzcGxheWVkIGFueXdheS4KCiAgICAgTk9URTogaXQncyBzdGlsbCBwb3NzaWJsZSBmb3IgYW55IGFwcGxpY2F0aW9uIG9yIG1vZHVsZSB0byBoYXZlIGl0J3MKICAgICBvd24gc2V0IG9mIGVycm9yIHRleHRzIGluc2VydGVkLiAgVGhlIHJvdXRpbmVzIGFyZSB0aGVyZSwganVzdCBub3QKICAgICB1c2VkIGJ5IGRlZmF1bHQgd2hlbiBuby1lcnIgaXMgZ2l2ZW4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEZyZWVCU0Qgb24gSUE2NC4KICAgICBbZGlyay5tZXllckBkaW5vZXguc3ViLm9yZyB2aWEgUmljaGFyZCBMZXZpdHRlLCByZXNvbHZlcyAjNDU0XQoKICAqKSBBZGp1c3QgREVTX2NiY19ja3N1bSgpIHNvIGl0IHJldHVybnMgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIE1JVAogICAgIEtlcmJlcm9zIGZ1bmN0aW9uIG1pdF9kZXNfY2JjX2Nrc3VtKCkuICBCZWZvcmUgdGhpcyBjaGFuZ2UsCiAgICAgdGhlIHZhbHVlIHJldHVybmVkIGJ5IERFU19jYmNfY2tzdW0oKSB3YXMgbGlrZSB0aGUgb25lIGZyb20KICAgICBtaXRfZGVzX2NiY19ja3N1bSgpLCBleGNlcHQgdGhlIGJ5dGVzIHdlcmUgc3dhcHBlZC4KICAgICBbS2V2aW4gR3JlYW5leSA8S2V2aW4uR3JlYW5leUBocC5jb20+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIEFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBTU0wgY2hhaW4gYnVpbGRpbmcuCiAgICAgQmVmb3JlIHRoaXMgYSByYXRoZXIgcHJpbWl0aXZlIGNoYWluIGJ1aWxkIHdhcyBhbHdheXMgcGVyZm9ybWVkIGluCiAgICAgc3NsM19vdXRwdXRfY2VydF9jaGFpbigpOiBhbiBhcHBsaWNhdGlvbiBoYWQgbm8gd2F5IHRvIHNlbmQgdGhlIAogICAgIGNvcnJlY3QgY2hhaW4gaWYgdGhlIGF1dG9tYXRpYyBvcGVyYXRpb24gcHJvZHVjZWQgYW4gaW5jb3JyZWN0IHJlc3VsdC4KCiAgICAgTm93IHRoZSBjaGFpbiBidWlsZGVyIGlzIGRpc2FibGVkIGlmIGVpdGhlcjoKCiAgICAgMS4gRXh0cmEgY2VydGlmaWNhdGVzIGFyZSBhZGRlZCB2aWEgU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydCgpLgoKICAgICAyLiBUaGUgbW9kZSBmbGFnIFNTTF9NT0RFX05PX0FVVE9fQ0hBSU4gaXMgc2V0LgoKICAgICBUaGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIGlzIHRoYXQgYW4gYXBwbGljYXRpb24gd291bGQgbm90IHdhbnQgdGhlCiAgICAgYXV0byBjaGFpbiBidWlsZGluZyB0byB0YWtlIHBsYWNlIGlmIGV4dHJhIGNoYWluIGNlcnRpZmljYXRlcyBhcmUKICAgICBwcmVzZW50IGFuZCBpdCBtaWdodCBhbHNvIHdhbnQgYSBtZWFucyBvZiBzZW5kaW5nIG5vIGFkZGl0aW9uYWwKICAgICBjZXJ0aWZpY2F0ZXMgKGZvciBleGFtcGxlIHRoZSBjaGFpbiBoYXMgdHdvIGNlcnRpZmljYXRlcyBhbmQgdGhlCiAgICAgcm9vdCBpcyBvbWl0dGVkKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGJ1aWxkIHdpdGhvdXQgdGhlIEVOR0lORSBmcmFtZXdvcmsuCiAgICAgW1N0ZXZlbiBSZWRkaWUgPHNtckBlc3NlbWVyLmNvbS5hdT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVW5kZXIgV2luMzIgZ210aW1lKCkgY2FuIHJldHVybiBOVUxMOiBjaGVjayByZXR1cm4gdmFsdWUgaW4KICAgICBPUEVOU1NMX2dtdGltZSgpLiBBZGQgZXJyb3IgY29kZSBmb3IgY2FzZSB3aGVyZSBnbXRpbWUoKSBmYWlscy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEU0Egcm91dGluZXM6IHVuZGVyIGNlcnRhaW4gZXJyb3IgY29uZGl0aW9ucyB1bmluaXRpYWxpemVkIEJOIG9iamVjdHMKICAgICBjb3VsZCBiZSBmcmVlZC4gU29sdXRpb246IG1ha2Ugc3VyZSBpbml0aWFsaXphdGlvbiBpcyBwZXJmb3JtZWQgZWFybHkKICAgICBlbm91Z2guIChSZXBvcnRlZCBhbmQgZml4IHN1cHBsaWVkIGJ5IEl2YW4gRCBOZXN0bGVyb2RlIDxuZXN0bGVyQE1JVC5FRFU+LAogICAgIE5pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+IHZpYSBQUiM0NTkpCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFub3RoZXIgZml4IGZvciBTU0x2MiBzZXNzaW9uIElEIGhhbmRsaW5nOiB0aGUgc2Vzc2lvbiBJRCB3YXMgaW5jb3JyZWN0bHkKICAgICBjaGVja2VkIG9uIHJlY29ubmVjdCBvbiB0aGUgY2xpZW50IHNpZGUsIHRoZXJlZm9yZSBzZXNzaW9uIHJlc3VtcHRpb24KICAgICBjb3VsZCBzdGlsbCBmYWlsIHdpdGggYSAic3NsIHNlc3Npb24gaWQgaXMgZGlmZmVyZW50IiBlcnJvci4gVGhpcwogICAgIGJlaGF2aW91ciBpcyBtYXNrZWQgd2hlbiBTU0xfT1BfQUxMIGlzIHVzZWQgZHVlIHRvCiAgICAgU1NMX09QX01JQ1JPU09GVF9TRVNTX0lEX0JVRyBiZWluZyBzZXQuCiAgICAgQmVoYXZpb3VyIG9ic2VydmVkIGJ5IENyaXNwaW4gRmxvd2VyZGF5IDxjcmlzcGluQGZsb3dlcmRheS5jeD4gYXMKICAgICBmb2xsb3d1cCB0byBQUiAjMzc3LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBJQS0zMiBhc3NlbWJsZXIgc3VwcG9ydCBlbmhhbmNlbWVudHM6IHVuaWZpZWQgRUxGIHRhcmdldHMsIHN1cHBvcnQKICAgICBmb3IgU0NPL0NhbGRlcmEgcGxhdGZvcm1zLCBmaXggZm9yIEN5Z3dpbiBzaGFyZWQgYnVpbGQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCBzdXBwb3J0IGZvciBGcmVlQlNEIG9uIHNwYXJjNjQuICBBcyBhIGNvbnNlcXVlbmNlLCBzdXBwb3J0IGZvcgogICAgIEZyZWVCU0Qgb24gbm9uLXg4NiBwcm9jZXNzb3JzIGlzIHNlcGFyYXRlIGZyb20geDg2IHByb2Nlc3NvcnMgb24KICAgICB0aGUgY29uZmlnIHNjcmlwdCwgbXVjaCBsaWtlIHRoZSBOZXRCU0Qgc3VwcG9ydC4KICAgICBbUmljaGFyZCBMZXZpdHRlICYgS3JpcyBLZW5uYXdheSA8a3Jpc0BvYnNlY3VyaXR5Lm9yZz5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42aCBhbmQgMC45LjcgIFszMSBEZWMgMjAwMl0KCiAgW05COiBPcGVuU1NMIDAuOS42aSBhbmQgbGF0ZXIgMC45LjYgcGF0Y2ggbGV2ZWxzIHdlcmUgcmVsZWFzZWQgYWZ0ZXIKICBPcGVuU1NMIDAuOS43Ll0KCiAgKikgRml4IHNlc3Npb24gSUQgaGFuZGxpbmcgaW4gU1NMdjIgY2xpZW50IGNvZGU6IHRoZSBTRVJWRVIgRklOSVNIRUQKICAgICBjb2RlICgwNikgd2FzIHRha2VuIGFzIHRoZSBmaXJzdCBvY3RldCBvZiB0aGUgc2Vzc2lvbiBJRCBhbmQgdGhlIGxhc3QKICAgICBvY3RldCB3YXMgaWdub3JlZCBjb25zZXF1ZW50bHkuIEFzIGEgcmVzdWx0IFNTTHYyIGNsaWVudCBzaWRlIHNlc3Npb24KICAgICBjYWNoaW5nIGNvdWxkIG5vdCBoYXZlIHdvcmtlZCBkdWUgdG8gdGhlIHNlc3Npb24gSUQgbWlzbWF0Y2ggYmV0d2VlbgogICAgIGNsaWVudCBhbmQgc2VydmVyLgogICAgIEJlaGF2aW91ciBvYnNlcnZlZCBieSBDcmlzcGluIEZsb3dlcmRheSA8Y3Jpc3BpbkBmbG93ZXJkYXkuY3g+IGFzCiAgICAgUFIgIzM3Ny4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQ2hhbmdlIHRoZSBkZWNsYXJhdGlvbiBvZiBuZWVkZWQgS2VyYmVyb3MgbGlicmFyaWVzIHRvIHVzZSBFWF9MSUJTCiAgICAgaW5zdGVhZCBvZiB0aGUgc3BlY2lhbCAoYW5kIGJhZGx5IHN1cHBvcnRlZCkgTElCS1JCNS4gIExJQktSQjUgaXMKICAgICByZW1vdmVkIGVudGlyZWx5LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFRoZSBod19uY2lwaGVyLmMgZW5naW5lIHJlcXVpcmVzIGR5bmFtaWMgbG9ja3MuICBVbmZvcnR1bmF0ZWx5LCBpdAogICAgIHNlZW1zIHRoYXQgaW4gc3BpdGUgb2YgZXhpc3RpbmcgZm9yIG1vcmUgdGhhbiBhIHllYXIsIG1hbnkgYXBwbGljYXRpb24KICAgICBhdXRob3IgaGF2ZSBkb25lIG5vdGhpbmcgdG8gcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGNhbGxiYWNrcywgd2hpY2gKICAgICBtZWFucyB0aGF0IHRoaXMgcGFydGljdWxhciBlbmdpbmUgd2lsbCBub3Qgd29yayBwcm9wZXJseSBhbnl3aGVyZS4KICAgICBUaGlzIGlzIGEgdmVyeSB1bmZvcnR1bmF0ZSBzaXR1YXRpb24gd2hpY2ggZm9yY2VzIHVzLCBpbiB0aGUgbmFtZQogICAgIG9mIHVzYWJpbGl0eSwgdG8gZ2l2ZSB0aGUgaHdfbmNpcGhlci5jIGEgc3RhdGljIGxvY2ssIHdoaWNoIGlzIHBhcnQKICAgICBvZiBsaWJjcnlwdG8uCiAgICAgTk9URTogVGhpcyBpcyBmb3IgdGhlIDAuOS43IHNlcmllcyBPTkxZLiAgVGhpcyBoYWNrIHdpbGwgbmV2ZXIKICAgICBhcHBlYXIgaW4gMC45Ljggb3IgbGF0ZXIuICBXZSBFWFBFQ1QgYXBwbGljYXRpb24gYXV0aG9ycyB0byBoYXZlCiAgICAgZGVhbHQgcHJvcGVybHkgd2l0aCB0aGlzIHdoZW4gMC45LjggaXMgcmVsZWFzZWQgKHVubGVzcyB3ZSBhY3R1YWxseQogICAgIG1ha2Ugc3VjaCBjaGFuZ2VzIGluIHRoZSBsaWJjcnlwdG8gbG9ja2luZyBjb2RlIHRoYXQgY2hhbmdlcyB3aWxsCiAgICAgaGF2ZSB0byBiZSBtYWRlIGFueXdheSkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gYXNuMV9kMmlfcmVhZF9iaW8oKSByZXBlYXRlZGx5IGNhbGwgQklPX3JlYWQoKSB1bnRpbCBhbGwgY29udGVudAogICAgIG9jdGV0cyBoYXZlIGJlZW4gcmVhZCwgRU9GIG9yIGFuIGVycm9yIG9jY3Vycy4gV2l0aG91dCB0aGlzIGNoYW5nZQogICAgIHNvbWUgdHJ1bmNhdGVkIEFTTjEgc3RydWN0dXJlcyB3aWxsIG5vdCBwcm9kdWNlIGFuIGVycm9yLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERpc2FibGUgSGVpbWRhbCBzdXBwb3J0LCBzaW5jZSBpdCBoYXNuJ3QgYmVlbiBmdWxseSBpbXBsZW1lbnRlZC4KICAgICBTdGlsbCBnaXZlIHRoZSBwb3NzaWJpbGl0eSB0byBmb3JjZSB0aGUgdXNlIG9mIEhlaW1kYWwsIGJ1dCB3aXRoCiAgICAgd2FybmluZ3MgYW5kIGEgcmVxdWVzdCB0aGF0IHBhdGNoZXMgZ2V0IHNlbnQgdG8gb3BlbnNzbC1kZXYuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBWQy1DRSB0YXJnZXQsIGludHJvZHVjZSB0aGUgV0lOQ0Ugc3lzbmFtZSwgYW5kIGFkZAogICAgIElOU1RBTEwuV0NFIGFuZCBhcHByb3ByaWF0ZSBjb25kaXRpb25hbHMgdG8gbWFrZSBpdCBidWlsZC4KICAgICBbU3RldmVuIFJlZGRpZSA8c21yQGVzc2VtZXIuY29tLmF1PiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgdGhlIERMTCBuYW1lcyBmb3IgQ3lnd2luIHRvIGN5Z2NyeXB0by14Lnkuei5kbGwgYW5kCiAgICAgY3lnc3NsLXgueS56LmRsbCwgd2hlcmUgeCwgeSBhbmQgeiBhcmUgdGhlIG1ham9yLCBtaW5vciBhbmQKICAgICBlZGl0IG51bWJlcnMgb2YgdGhlIHZlcnNpb24uCiAgICAgW0NvcmlubmEgVmluc2NoZW4gPHZpbnNjaGVuQHJlZGhhdC5jb20+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIEludHJvZHVjZSBzYWZlIHN0cmluZyBjb3B5IGFuZCBjYXRlbmF0aW9uIGZ1bmN0aW9ucwogICAgIChCVUZfc3RybGNweSgpIGFuZCBCVUZfc3RybGNhdCgpKS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpIGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIEF2b2lkIHVzaW5nIGZpeGVkLXNpemUgYnVmZmVycyBmb3Igb25lLWxpbmUgRE5zLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBCVUZfTUVNX2dyb3dfY2xlYW4oKSB0byBhdm9pZCBpbmZvcm1hdGlvbiBsZWFrYWdlIHdoZW4KICAgICByZXNpemluZyBidWZmZXJzIGNvbnRhaW5pbmcgc2VjcmV0cywgYW5kIHVzZSB3aGVyZSBhcHByb3ByaWF0ZS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBdm9pZCB1c2luZyBmaXhlZCBzaXplIGJ1ZmZlcnMgZm9yIGNvbmZpZ3VyYXRpb24gZmlsZSBsb2NhdGlvbi4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBdm9pZCBmaWxlbmFtZSB0cnVuY2F0aW9uIGZvciB2YXJpb3VzIENBIGZpbGVzLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIFVzZSBzaXplb2YgaW4gcHJlZmVyZW5jZSB0byBtYWdpYyBudW1iZXJzLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEF2b2lkIGZpbGVuYW1lIHRydW5jYXRpb24gaW4gY2VydCByZXF1ZXN0cy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBZGQgYXNzZXJ0aW9ucyB0byBjaGVjayBmb3IgKHN1cHBvc2VkbHkgaW1wb3NzaWJsZSkgYnVmZmVyCiAgICAgb3ZlcmZsb3dzLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIERvbid0IGNhY2hlIHRydW5jYXRlZCBETlMgZW50cmllcyBpbiB0aGUgbG9jYWwgY2FjaGUgKHRoaXMgY291bGQKICAgICBwb3RlbnRpYWxseSBsZWFkIHRvIGEgc3Bvb2ZpbmcgYXR0YWNrKS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBGaXggdmFyaW91cyBidWZmZXJzIHRvIGJlIGxhcmdlIGVub3VnaCBmb3IgaGV4L2RlY2ltYWwKICAgICByZXByZXNlbnRhdGlvbnMgaW4gYSBwbGF0Zm9ybSBpbmRlcGVuZGVudCBtYW5uZXIuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIENSWVBUT19yZWFsbG9jX2NsZWFuKCkgdG8gYXZvaWQgaW5mb3JtYXRpb24gbGVha2FnZSB3aGVuCiAgICAgcmVzaXppbmcgYnVmZmVycyBjb250YWluaW5nIHNlY3JldHMsIGFuZCB1c2Ugd2hlcmUgYXBwcm9wcmlhdGUuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIEJJT19pbmRlbnQoKSB0byBhdm9pZCBtdWNoIHNsaWdodGx5IHdvcnJ5aW5nIGNvZGUgdG8gZG8KICAgICBpbmRlbnRzLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIENvbnZlcnQgc3ByaW50ZigpL0JJT19wdXRzKCkgdG8gQklPX3ByaW50ZigpLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIGJ1ZmZlcl9nZXRzKCkgY291bGQgdGVybWluYXRlIHdpdGggdGhlIGJ1ZmZlciBvbmx5IGhhbGYKICAgICBmdWxsLiBGaXhlZC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBZGQgYXNzZXJ0aW9ucyB0byBwcmV2ZW50IHVzZXItc3VwcGxpZWQgY3J5cHRvIGZ1bmN0aW9ucyBmcm9tCiAgICAgb3ZlcmZsb3dpbmcgaW50ZXJuYWwgYnVmZmVycyBieSBoYXZpbmcgbGFyZ2UgYmxvY2sgc2l6ZXMsIGV0Yy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBOZXcgT1BFTlNTTF9hc3NlcnQoKSBtYWNybyAoc2ltaWxhciB0byBhc3NlcnQoKSwgYnV0IGVuYWJsZWQKICAgICB1bmNvbmRpdGlvbmFsbHkpLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgY29weSBvZiBrZXkgaW4gUkM0LgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgYW5kIGluY29ycmVjdGx5IHNpemVkIGJ1ZmZlcnMgZm9yIElWIGluIHBlbS5oLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEZpeCBvZmYtYnktb25lIGVycm9yIGluIEVHRCBwYXRoLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIElmIFJBTkRGSUxFIHBhdGggaXMgdG9vIGxvbmcsIGlnbm9yZSBpbnN0ZWFkIG9mIHRydW5jYXRpbmcuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRWxpbWluYXRlIHVudXNlZCBhbmQgaW5jb3JyZWN0bHkgc2l6ZWQgWC41MDkgc3RydWN0dXJlCiAgICAgQ0JDUGFyYW1ldGVyLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgYW5kIGRhbmdlcm91cyBmdW5jdGlvbiBrbnVtYmVyKCkuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRWxpbWluYXRlIHVudXNlZCBhbmQgZGFuZ2Vyb3VzIHN0cnVjdHVyZSwgS1NTTF9FUlIuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgUHJvdGVjdCBhZ2FpbnN0IG92ZXJsb25nIHNlc3Npb24gSUQgY29udGV4dCBsZW5ndGggaW4gYW4gZW5jb2RlZAogICAgIHNlc3Npb24gb2JqZWN0LiBTaW5jZSB0aGVzZSBhcmUgbG9jYWwsIHRoaXMgZG9lcyBub3QgYXBwZWFyIHRvIGJlCiAgICAgZXhwbG9pdGFibGUuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQ2hhbmdlIGZyb20gc2VjdXJpdHkgcGF0Y2ggKHNlZSAwLjkuNmUgYmVsb3cpIHRoYXQgZGlkIG5vdCBhZmZlY3QKICAgICB0aGUgMC45LjYgcmVsZWFzZSBzZXJpZXM6CgogICAgIFJlbW90ZSBidWZmZXIgb3ZlcmZsb3cgaW4gU1NMMyBwcm90b2NvbCAtIGFuIGF0dGFja2VyIGNvdWxkCiAgICAgc3VwcGx5IGFuIG92ZXJzaXplZCBtYXN0ZXIga2V5IGluIEtlcmJlcm9zLWVuYWJsZWQgdmVyc2lvbnMuCiAgICAgKENWRS0yMDAyLTA2NTcpCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQ2hhbmdlIHRoZSBTU0wga2VyYjUgY29kZXMgdG8gbWF0Y2ggUkZDIDI3MTIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSAtbmFtZW9wdCB3b3JrIGZ1bGx5IGZvciByZXEgYW5kIGFkZCAtcmVxb3B0IHN3aXRjaC4KICAgICBbTWljaGFlbCBCZWxsIDxtaWNoYWVsLmJlbGxAcnouaHUtYmVybGluLmRlPiwgU3RldmUgSGVuc29uXQoKICAqKSBUaGUgImJsb2NrIHNpemUiIGZvciBibG9jayBjaXBoZXJzIGluIENGQiBhbmQgT0ZCIG1vZGUgc2hvdWxkIGJlIDEuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgWW5ndmUgTnlzYWV0ZXIgUGV0dGVyc2VuIDx5bmd2ZUBvcGVyYS5jb20+XQoKICAqKSBNYWtlIHN1cmUgdGVzdHMgY2FuIGJlIHBlcmZvcm1lZCBldmVuIGlmIHRoZSBjb3JyZXNwb25kaW5nIGFsZ29yaXRobXMKICAgICBoYXZlIGJlZW4gcmVtb3ZlZCBlbnRpcmVseS4gIFRoaXMgd2FzIGFsc28gdGhlIGxhc3Qgc3RlcCB0byBtYWtlCiAgICAgT3BlblNTTCBjb21waWxhYmxlIHdpdGggREpHUFAgdW5kZXIgYWxsIHJlYXNvbmFibGUgY29uZGl0aW9ucy4KICAgICBbUmljaGFyZCBMZXZpdHRlLCBEb3VnIEthdWZtYW4gPGRrYXVmbWFuQHJhaHVsLm5ldD5dCgogICopIEFkZCBjaXBoZXIgc2VsZWN0aW9uIHJ1bGVzIENPTVBMRU1FTlRPRkFMTCBhbmQgQ09NUExFTUVOVE9GREVGQVVMVAogICAgIHRvIGFsbG93IHZlcnNpb24gaW5kZXBlbmRlbnQgZGlzYWJsaW5nIG9mIG5vcm1hbGx5IHVuc2VsZWN0ZWQgY2lwaGVycywKICAgICB3aGljaCBtYXkgYmUgYWN0aXZhdGVkIGFzIGEgc2lkZS1lZmZlY3Qgb2Ygc2VsZWN0aW5nIGEgc2luZ2xlIGNpcGhlci4KCiAgICAgKEUuZy4sIGNpcGhlciBsaXN0IHN0cmluZyAiUlNBIiBlbmFibGVzIGNpcGhlcnN1aXRlcyB0aGF0IGFyZSBsZWZ0CiAgICAgb3V0IG9mICJBTEwiIGJlY2F1c2UgdGhleSBkbyBub3QgcHJvdmlkZSBzeW1tZXRyaWMgZW5jcnlwdGlvbi4KICAgICAiUlNBOiFDT01QTEVNRU1FTlRPRkFMTCIgYXZvaWRzIHRoZXNlIHVuc2FmZSBjaXBoZXJzdWl0ZXMuKQogICAgIFtMdXR6IEphZW5pY2tlLCBCb2RvIE1vZWxsZXJdCgogICopIEFkZCBhcHByb3ByaWF0ZSBzdXBwb3J0IGZvciBzZXBhcmF0ZSBwbGF0Zm9ybS1kZXBlbmRlbnQgYnVpbGQKICAgICBkaXJlY3Rvcmllcy4gIFRoZSByZWNvbW1lbmRlZCB3YXkgdG8gbWFrZSBhIHBsYXRmb3JtLWRlcGVuZGVudAogICAgIGJ1aWxkIGRpcmVjdG9yeSBpcyB0aGUgZm9sbG93aW5nICh0ZXN0ZWQgb24gTGludXgpLCBtYXliZSB3aXRoCiAgICAgc29tZSBsb2NhbCB0d2Vha3M6CgoJIyBQbGFjZSB5b3Vyc2VsZiBvdXRzaWRlIG9mIHRoZSBPcGVuU1NMIHNvdXJjZSB0cmVlLiAgSW4KCSMgdGhpcyBleGFtcGxlLCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgT1BFTlNTTF9TT1VSQ0UKCSMgaXMgYXNzdW1lZCB0byBjb250YWluIHRoZSBhYnNvbHV0ZSBPcGVuU1NMIHNvdXJjZSBkaXJlY3RvcnkuCglta2RpciAtcCBvYmp0cmVlLyJgdW5hbWUgLXNgLWB1bmFtZSAtcmAtYHVuYW1lIC1tYCIKCWNkIG9ianRyZWUvImB1bmFtZSAtc2AtYHVuYW1lIC1yYC1gdW5hbWUgLW1gIgoJKGNkICRPUEVOU1NMX1NPVVJDRTsgZmluZCAuIC10eXBlIGYpIHwgd2hpbGUgcmVhZCBGOyBkbwoJCW1rZGlyIC1wIGBkaXJuYW1lICRGYAoJCWxuIC1zICRPUEVOU1NMX1NPVVJDRS8kRiAkRgoJZG9uZQoKICAgICBUbyBiZSBhYnNvbHV0ZWx5IHN1cmUgbm90IHRvIGRpc3R1cmIgdGhlIHNvdXJjZSB0cmVlLCBhICJtYWtlIGNsZWFuIgogICAgIGlzIGEgZ29vZCB0aGluZy4gIElmIGl0IGlzbid0IHN1Y2Nlc3NmdWxsLCBkb24ndCB3b3JyeSBhYm91dCBpdCwKICAgICBpdCBwcm9iYWJseSBtZWFucyB0aGUgc291cmNlIGRpcmVjdG9yeSBpcyB2ZXJ5IGNsZWFuLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2Ugc3VyZSBhbnkgRU5HSU5FIGNvbnRyb2wgY29tbWFuZHMgbWFrZSBsb2NhbCBjb3BpZXMgb2Ygc3RyaW5nCiAgICAgcG9pbnRlcnMgcGFzc2VkIHRvIHRoZW0gd2hlbmV2ZXIgbmVjZXNzYXJ5LiBPdGhlcndpc2UgaXQgaXMgcG9zc2libGUKICAgICB0aGUgY2FsbGVyIG1heSBoYXZlIG92ZXJ3cml0dGVuIChvciBkZWFsbG9jYXRlZCkgdGhlIG9yaWdpbmFsIHN0cmluZwogICAgIGRhdGEgd2hlbiBhIGxhdGVyIEVOR0lORSBvcGVyYXRpb24gdHJpZXMgdG8gdXNlIHRoZSBzdG9yZWQgdmFsdWVzLgogICAgIFtH9nR6IEJhYmluLUViZWxsIDxiYWJpbmViZWxsQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgSW1wcm92ZSBkaWFnbm9zdGljcyBpbiBmaWxlIHJlYWRpbmcgYW5kIGNvbW1hbmQtbGluZSBkaWdlc3RzLgogICAgIFtCZW4gTGF1cmllIGFpZGVkIGFuZCBhYmV0dGVkIGJ5IFNvbGFyIERlc2lnbmVyIDxzb2xhckBvcGVud2FsbC5jb20+XQoKICAqKSBBZGQgQUVTIG1vZGVzIENGQiBhbmQgT0ZCIHRvIHRoZSBvYmplY3QgZGF0YWJhc2UuICBDb3JyZWN0IGFuCiAgICAgZXJyb3IgaW4gQUVTLUNGQiBkZWNyeXB0aW9uLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFJlbW92ZSBtb3N0IGNhbGxzIHRvIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoKSBpbiBldnBfZW5jLmMsIHRoaXMgCiAgICAgYWxsb3dzIGV4aXN0aW5nIEVWUF9DSVBIRVJfQ1RYIHN0cnVjdHVyZXMgdG8gYmUgcmV1c2VkIGFmdGVyCiAgICAgY2FsbGluZyBFVlBfKkZpbmFsKCkuIFRoaXMgYmVoYXZpb3VyIGlzIHVzZWQgYnkgZW5jcnlwdGlvbgogICAgIEJJT3MgYW5kIHNvbWUgYXBwbGljYXRpb25zLiBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3QgdGhhdAogICAgIGFwcGxpY2F0aW9ucyBtdXN0IGV4cGxpY2l0bHkgY2xlYW4gdXAgY2lwaGVyIGNvbnRleHRzIHdpdGgKICAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCkgb3IgdGhleSB3aWxsIGxlYWsgbWVtb3J5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoZWNrIHRoZSB2YWx1ZXMgb2YgZG5hIGFuZCBkbmIgaW4gYm5fbXVsX3JlY3Vyc2l2ZSBiZWZvcmUgY2FsbGluZwogICAgIGJuX211bF9jb21iYSAoYSBub24gemVybyB2YWx1ZSBtZWFucyB0aGUgYSBvciBiIGFycmF5cyBkbyBub3QgY29udGFpbgogICAgIG4yIGVsZW1lbnRzKSBhbmQgZmFsbGJhY2sgdG8gYm5fbXVsX25vcm1hbCBpZiBlaXRoZXIgaXMgbm90IHplcm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGVzY2FwaW5nIG9mIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIHdoZW4gdXNpbmcgdGhlIC1zdWJqIG9wdGlvbgogICAgIG9mIHRoZSAib3BlbnNzbCByZXEiIGNvbW1hbmQgbGluZSB0b29sLiAoUm9iZXJ0IEpvb3AgPGpvb3BAZm9rdXMuZ21kLmRlPikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgTWFrZSBvYmplY3QgZGVmaW5pdGlvbnMgY29tcGxpYW50IHRvIExEQVAgKFJGQzIyNTYpOiBTTiBpcyB0aGUgc2hvcnQKICAgICBmb3JtIGZvciAic3VybmFtZSIsIHNlcmlhbE51bWJlciBoYXMgbm8gc2hvcnQgZm9ybS4KICAgICBVc2UgIm1haWwiIGFzIHRoZSBzaG9ydCBuYW1lIGZvciAicmZjODIyTWFpbGJveCIgYWNjb3JkaW5nIHRvIFJGQzI3OTg7CiAgICAgdGhlcmVmb3JlIHJlbW92ZSAibWFpbCIgc2hvcnQgbmFtZSBmb3IgImludGVybmV0IDciLgogICAgIFRoZSBPSUQgZm9yIHVuaXF1ZSBpZGVudGlmaWVycyBpbiBYNTA5IGNlcnRpZmljYXRlcyBpcwogICAgIHg1MDBVbmlxdWVJZGVudGlmaWVyLCBub3QgdW5pcXVlSWRlbnRpZmllci4KICAgICBTb21lIG1vcmUgT0lEIGFkZGl0aW9ucy4gKE1pY2hhZWwgQmVsbCA8bWljaGFlbC5iZWxsQHJ6Lmh1LWJlcmxpbi5kZT4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBhbiAiaW5pdCIgY29tbWFuZCB0byB0aGUgRU5HSU5FIGNvbmZpZyBtb2R1bGUgYW5kIGF1dG8gaW5pdGlhbGl6ZQogICAgIEVOR0lORXMuIFdpdGhvdXQgYW55ICJpbml0IiBjb21tYW5kIHRoZSBFTkdJTkUgd2lsbCBiZSBpbml0aWFsaXplZCAKICAgICBhZnRlciBhbGwgY3RybCBjb21tYW5kcyBoYXZlIGJlZW4gZXhlY3V0ZWQgb24gaXQuIElmIGluaXQ9MSB0aGUgCiAgICAgRU5HSU5FIGlzIGluaXRhaWxpemVkIGF0IHRoYXQgcG9pbnQgKGN0cmxzIGJlZm9yZSB0aGF0IHBvaW50IGFyZSBydW4KICAgICBvbiB0aGUgdW5pbml0aWFsaXplZCBFTkdJTkUgYW5kIGFmdGVyIG9uIHRoZSBpbml0aWFsaXplZCBvbmUpLiBJZgogICAgIGluaXQ9MCB0aGVuIHRoZSBFTkdJTkUgd2lsbCBub3QgYmUgaW5pYXRpYWxpemVkIGF0IGFsbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlICdhcHBfdmVyaWZ5X2NhbGxiYWNrJyBpbnRlcmZhY2Ugc28gdGhhdCB0aGUgdXNlci1kZWZpbmVkCiAgICAgYXJndW1lbnQgaXMgYWN0dWFsbHkgcGFzc2VkIHRvIHRoZSBjYWxsYmFjazogSW4gdGhlCiAgICAgU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2FsbGJhY2soKSBwcm90b3R5cGUsIHRoZSBjYWxsYmFjawogICAgIGRlY2xhcmF0aW9uIGhhcyBiZWVuIGNoYW5nZWQgZnJvbQogICAgICAgICAgaW50ICgqY2IpKCkKICAgICBpbnRvCiAgICAgICAgICBpbnQgKCpjYikoWDUwOV9TVE9SRV9DVFggKix2b2lkICopOwogICAgIGluIHNzbF92ZXJpZnlfY2VydF9jaGFpbiAoc3NsL3NzbF9jZXJ0LmMpLCB0aGUgY2FsbAogICAgICAgICAgaT1zLT5jdHgtPmFwcF92ZXJpZnlfY2FsbGJhY2soJmN0eCkKICAgICBoYXMgYmVlbiBjaGFuZ2VkIGludG8KICAgICAgICAgIGk9cy0+Y3R4LT5hcHBfdmVyaWZ5X2NhbGxiYWNrKCZjdHgsIHMtPmN0eC0+YXBwX3ZlcmlmeV9hcmcpLgoKICAgICBUbyB1cGRhdGUgYXBwbGljYXRpb25zIHVzaW5nIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKCksCiAgICAgYSBkdW1teSBhcmd1bWVudCBjYW4gYmUgYWRkZWQgdG8gdGhlaXIgY2FsbGJhY2sgZnVuY3Rpb25zLgogICAgIFtELiBLLiBTbWV0dGVycyA8c21ldHRlcnNAcGFyYy54ZXJveC5jb20+XQoKICAqKSBBZGRlZCB0aGUgJzQ3NThjY2EnIEVOR0lORSB0byBzdXBwb3J0IElCTSA0NzU4IGNhcmRzLgogICAgIFtNYXVyaWNlIEdpdHRlbnMgPG1hdXJpY2VAZ2l0dGVucy5ubD4sIHRvdWNodXBzIGJ5IEdlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGFuZCBPUEVOU1NMX0xPQURfQ09ORiBkZWZpbmUgd2hpY2ggd2lsbCBjYXVzZQogICAgIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCkgdG8gbG9hZCB0aGUgb3BlbnNzbC5jbmYgY29uZmlnIGZpbGUuCiAgICAgVGhpcyBhbGxvd3Mgb2xkZXIgYXBwbGljYXRpb25zIHRvIHRyYW5zcGFyZW50bHkgc3VwcG9ydCBjZXJ0YWluCiAgICAgT3BlblNTTCBmZWF0dXJlczogc3VjaCBhcyBjcnlwdG8gYWNjZWxlcmF0aW9uIGFuZCBkeW5hbWljIEVOR0lORSBsb2FkaW5nLgogICAgIFR3byBuZXcgZnVuY3Rpb25zIE9QRU5TU0xfYWRkX2FsbF9hbGdvcml0aG1zX25vY29uZigpIHdoaWNoIHdpbGwgbmV2ZXIKICAgICBsb2FkIHRoZSBjb25maWcgZmlsZSBhbmQgT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfY29uZigpIHdoaWNoIHdpbGwKICAgICBhbHdheXMgbG9hZCBpdCBoYXZlIGFsc28gYmVlbiBhZGRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGhlIE9GQiwgQ0ZCIGFuZCBDVFIgKGFsbCB3aXRoIDEyOCBiaXQgZmVlZGJhY2spIHRvIEFFUy4KICAgICBBZGp1c3QgTklEcyBhbmQgRVZQIGxheWVyLgogICAgIFtTdGVwaGVuIFNwcnVuayA8c3RlcGhlbkBzcHJ1bmsub3JnPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDb25maWcgbW9kdWxlcyBzdXBwb3J0IGluIG9wZW5zc2wgdXRpbGl0eS4KCiAgICAgTW9zdCBjb21tYW5kcyBub3cgbG9hZCBtb2R1bGVzIGZyb20gdGhlIGNvbmZpZyBmaWxlLAogICAgIHRob3VnaCBpbiBhIGZldyAoc3VjaCBhcyB2ZXJzaW9uKSB0aGlzIGlzbid0IGRvbmUgCiAgICAgYmVjYXVzZSBpdCBjb3VsZG4ndCBiZSB1c2VkIGZvciBhbnl0aGluZy4KCiAgICAgSW4gdGhlIGNhc2Ugb2YgY2EgYW5kIHJlcSB0aGUgY29uZmlnIGZpbGUgdXNlZCBpcwogICAgIHRoZSBzYW1lIGFzIHRoZSB1dGlsaXR5IGl0c2VsZjogdGhhdCBpcyB0aGUgLWNvbmZpZwogICAgIGNvbW1hbmQgbGluZSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbgogICAgIGFsdGVybmF0aXZlIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW92ZSBkZWZhdWx0IGJlaGF2aW91ciBmcm9tIE9QRU5TU0xfY29uZmlnKCkuIElmIGFwcG5hbWUgaXMgTlVMTAogICAgIHVzZSAib3BlbnNzbF9jb25mIiBpZiBmaWxlbmFtZSBpcyBOVUxMIHVzZSBkZWZhdWx0IG9wZW5zc2wgY29uZmlnIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGFuIGFyZ3VtZW50IHRvIE9QRU5TU0xfY29uZmlnKCkgdG8gYWxsb3cgdGhlIHVzZSBvZiBhbiBhbHRlcm5hdGl2ZQogICAgIGNvbmZpZyBzZWN0aW9uIG5hbWUuIEFkZCBhIG5ldyBmbGFnIHRvIHRvbGVyYXRlIGEgbWlzc2luZyBjb25maWcgZmlsZQogICAgIGFuZCBtb3ZlIGNvZGUgdG8gQ09ORl9tb2R1bGVzX2xvYWRfZmlsZSgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcyBmcm9tIEFjY2VsZXJhdGVkIEVuY3J5cHRpb24KICAgICBQcm9jZXNzaW5nLCB3d3cuYWVwLmllLiAgKFVzZSBlbmdpbmUgJ2FlcCcpCiAgICAgVGhlIHN1cHBvcnQgd2FzIGNvcGllZCBmcm9tIDAuOS42YyBbZW5naW5lXSBhbmQgYWRhcHRlZC9jb3JyZWN0ZWQKICAgICB0byB3b3JrIHdpdGggdGhlIG5ldyBlbmdpbmUgZnJhbWV3b3JrLgogICAgIFtBRVAgSW5jLiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBTdXBwb3J0IGZvciBTdXJlV2FyZSBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMgZnJvbSBCYWx0aW1vcmUKICAgICBUZWNobm9sb2dpZXMuICAoVXNlIGVuZ2luZSAnc3VyZXdhcmUnKQogICAgIFRoZSBzdXBwb3J0IHdhcyBjb3BpZWQgZnJvbSAwLjkuNmMgW2VuZ2luZV0gYW5kIGFkYXB0ZWQKICAgICB0byB3b3JrIHdpdGggdGhlIG5ldyBlbmdpbmUgZnJhbWV3b3JrLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEhhdmUgdGhlIENISUwgZW5naW5lIGZvcmstc2FmZSAoYXMgZGVmaW5lZCBieSBuQ2lwaGVyKSBhbmQgYWN0dWFsbHkKICAgICBtYWtlIHRoZSBuZXdlciBFTkdJTkUgZnJhbWV3b3JrIGNvbW1hbmRzIGZvciB0aGUgQ0hJTCBlbmdpbmUgd29yay4KICAgICBbVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gcHJvZHVjZSBzaGFyZWQgbGlicmFyaWVzIG9uIFJlbGlhbnRVTklYLgogICAgIFtSb2JlcnQgRGFobGVtIDxSb2JlcnQuRGFobGVtQGZmbTIuc2llbWVucy5kZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBjb25maWd1cmF0aW9uIHRhcmdldCBkZWJ1Zy1saW51eC1wcHJvLgogICAgIE1ha2UgJ29wZW5zc2wgcnNhJyB1c2UgdGhlIGdlbmVyYWwga2V5IGxvYWRpbmcgcm91dGluZXMKICAgICBpbXBsZW1lbnRlZCBpbiBhcHBzLmMsIGFuZCBtYWtlIHRob3NlIHJvdXRpbmVzIGFibGUgdG8KICAgICBoYW5kbGUgdGhlIGtleSBmb3JtYXQgRk9STUFUX05FVFNDQVBFIGFuZCB0aGUgdmFyaWFudAogICAgIEZPUk1BVF9JSVNTR0MuCiAgICAgW1Rvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICopIEZpeCBhIGNyYXNoYnVnIGFuZCBhIGxvZ2ljIGJ1ZyBpbiBod2NyaGtfbG9hZF9wdWJrZXkoKS4KICAgICBbVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCAta2V5Zm9ybSB0byByc2F1dGwsIGFuZCBkb2N1bWVudCAtZW5naW5lLgogICAgIFtSaWNoYXJkIExldml0dGUsIGluc3BpcmVkIGJ5IFRvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPl0KCiAgKikgQ2hhbmdlIEJJT19uZXdfZmlsZSAoY3J5cHRvL2Jpby9ic3NfZmlsZS5jKSB0byB1c2UgbmV3CiAgICAgQklPX1JfTk9fU1VDSF9GSUxFIGVycm9yIGNvZGUgcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMKICAgICBFUlJfUl9TWVNfTElCIGVycm9yIGNvZGUgaWYgZm9wZW4oKSBmYWlscyB3aXRoIEVOT0VOVC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbnMKICAgICAgICAgIEVSUl9wZWVrX2xhc3RfZXJyb3IKICAgICAgICAgIEVSUl9wZWVrX2xhc3RfZXJyb3JfbGluZQogICAgICAgICAgRVJSX3BlZWtfbGFzdF9lcnJvcl9saW5lX2RhdGEuCiAgICAgVGhlc2UgYXJlIHNpbWlsYXIgdG8KICAgICAgICAgIEVSUl9wZWVrX2Vycm9yCiAgICAgICAgICBFUlJfcGVla19lcnJvcl9saW5lCiAgICAgICAgICBFUlJfcGVla19lcnJvcl9saW5lX2RhdGEsCiAgICAgYnV0IHJlcG9ydCBvbiB0aGUgbGF0ZXN0IGVycm9yIHJlY29yZGVkIHJhdGhlciB0aGFuIHRoZSBmaXJzdCBvbmUKICAgICBzdGlsbCBpbiB0aGUgZXJyb3IgcXVldWUuCiAgICAgW0JlbiBMYXVyaWUsIEJvZG8gTW9lbGxlcl0KICAgICAgICAKICAqKSBkZWZhdWx0X2FsZ29yaXRobXMgb3B0aW9uIGluIEVOR0lORSBjb25maWcgbW9kdWxlLiBUaGlzIGFsbG93cyB0aGluZ3MKICAgICBsaWtlOgogICAgIGRlZmF1bHRfYWxnb3JpdGhtcyA9IEFMTAogICAgIGRlZmF1bHRfYWxnb3JpdGhtcyA9IFJTQSwgRFNBLCBSQU5ELCBDSVBIRVJTLCBESUdFU1RTCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJlbGltaW5hcnkgRU5HSU5FIGNvbmZpZyBtb2R1bGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGV4cGVyaW1lbnRhbCBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSBBRVMgY29kZSB0byBmb2xsb3cgdGhlIHNhbWUgbmFtZSBzdHJ1Y3R1cmUgYXMgYWxsIG90aGVyCiAgICAgc3ltbWV0cmljIGNpcGhlcnMsIGFuZCBiZWhhdmUgdGhlIHNhbWUgd2F5LiAgTW92ZSBldmVyeXRoaW5nIHRvCiAgICAgdGhlIGRpcmVjdG9yeSBjcnlwdG8vYWVzLCB0aGVyZWJ5IG9ic29sZXRpbmcgY3J5cHRvL3Jpam5kYWVsLgogICAgIFtTdGVwaGVuIFNwcnVuayA8c3RlcGhlbkBzcHJ1bmsub3JnPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBTRUNVUklUWTogcmVtb3ZlIHVuc2FmZSBzZXRqbXAvc2lnbmFsIGludGVyYWN0aW9uIGZyb20gdWlfb3BlbnNzbC5jLgogICAgIFtCZW4gTGF1cmllIGFuZCBUaGVvIGRlIFJhYWR0XQoKICAqKSBBZGQgb3B0aW9uIHRvIG91dHB1dCBwdWJsaWMga2V5cyBpbiByZXEgY29tbWFuZC4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgbWFkd29sZkBvcGVuY2Eub3JnXQoKICAqKSBVc2Ugd05BRnMgaW4gRUNfUE9JTlRzX211bCgpIGZvciBpbXByb3ZlZCBlZmZpY2llbmN5CiAgICAgKHVwIHRvIGFib3V0IDEwJSBiZXR0ZXIgdGhhbiBiZWZvcmUgZm9yIFAtMTkyIGFuZCBQLTIyNCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9ucy9tYWNyb3MKCiAgICAgICAgICBTU0xfQ1RYX3NldF9tc2dfY2FsbGJhY2soY3R4LCBjYikKICAgICAgICAgIFNTTF9DVFhfc2V0X21zZ19jYWxsYmFja19hcmcoY3R4LCBhcmcpCiAgICAgICAgICBTU0xfc2V0X21zZ19jYWxsYmFjayhzc2wsIGNiKQogICAgICAgICAgU1NMX3NldF9tc2dfY2FsbGJhY2tfYXJnKHNzbCwgYXJnKQoKICAgICB0byByZXF1ZXN0IGNhbGxpbmcgYSBjYWxsYmFjayBmdW5jdGlvbgoKICAgICAgICAgIHZvaWQgY2IoaW50IHdyaXRlX3AsIGludCB2ZXJzaW9uLCBpbnQgY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIFNTTCAqc3NsLCB2b2lkICphcmcpCgogICAgIHdoZW5ldmVyIGEgcHJvdG9jb2wgbWVzc2FnZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlY2VpdmVkCiAgICAgKHdyaXRlX3AgPT0gMCkgb3Igc2VudCAod3JpdGVfcCA9PSAxKS4gIEhlcmUgJ3ZlcnNpb24nIGlzIHRoZQogICAgIHByb3RvY29sIHZlcnNpb24gIGFjY29yZGluZyB0byB3aGljaCB0aGUgU1NMIGxpYnJhcnkgaW50ZXJwcmV0cwogICAgIHRoZSBjdXJyZW50IHByb3RvY29sIG1lc3NhZ2UgKFNTTDJfVkVSU0lPTiwgU1NMM19WRVJTSU9OLCBvcgogICAgIFRMUzFfVkVSU0lPTikuICAnY29udGVudF90eXBlJyBpcyAwIGluIHRoZSBjYXNlIG9mIFNTTCAyLjAsIG9yCiAgICAgdGhlIGNvbnRlbnQgdHlwZSBhcyBkZWZpbmVkIGluIHRoZSBTU0wgMy4wL1RMUyAxLjAgcHJvdG9jb2wKICAgICBzcGVjaWZpY2F0aW9uIChjaGFuZ2VfY2lwaGVyX3NwZWMoMjApLCBhbGVydCgyMSksIGhhbmRzaGFrZSgyMikpLgogICAgICdidWYnIGFuZCAnbGVuJyBwb2ludCB0byB0aGUgYWN0dWFsIG1lc3NhZ2UsICdzc2wnIHRvIHRoZQogICAgIFNTTCBvYmplY3QsIGFuZCAnYXJnJyBpcyB0aGUgYXBwbGljYXRpb24tZGVmaW5lZCB2YWx1ZSBzZXQgYnkKICAgICBTU0xbX0NUWF1fc2V0X21zZ19jYWxsYmFja19hcmcoKS4KCiAgICAgJ29wZW5zc2wgc19jbGllbnQnIGFuZCAnb3BlbnNzbCBzX3NlcnZlcicgaGF2ZSBuZXcgJy1tc2cnIG9wdGlvbnMKICAgICB0byBlbmFibGUgYSBjYWxsYmFjayB0aGF0IGRpc3BsYXlzIGFsbCBwcm90b2NvbCBtZXNzYWdlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgdGhlIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgc28gc2hhcmVkIGxpYnJhcmllcyBhcmUgYnVpbHQgYXMKICAgICBzb29uIGFzIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyBsaWJyYXJ5IGlzIGZpbmlzaGVkLCBhbmQgdGhlcmVieSBnZXQKICAgICBvcGVuc3NsIGFuZCB0aGUgdGVzdCBwcm9ncmFtcyBsaW5rZWQgYWdhaW5zdCB0aGUgc2hhcmVkIGxpYnJhcnkuCiAgICAgVGhpcyBzdGlsbCBvbmx5IGhhcHBlbnMgd2hlbiB0aGUga2V5d29yZCAic2hhcmQiIGhhcyBiZWVuIGdpdmVuIHRvCiAgICAgdGhlIGNvbmZpZ3VyYXRpb24gc2NyaXB0cy4KCiAgICAgTk9URTogc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBpcyBzdGlsbCBhbiBleHBlcmltZW50YWwgdGhpbmcsIGFuZAogICAgIGJhY2t3YXJkIGJpbmFyeSBjb21wYXRpYmlsaXR5IGlzIHN0aWxsIG5vdCBndWFyYW50ZWVkLgogICAgIFsiTWFjaWVqIFcuIFJvenlja2kiIDxtYWNyb0BkczIucGcuZ2RhLnBsPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgU3ViamVjdCBJbmZvcm1hdGlvbiBBY2Nlc3MgZXh0ZW5zaW9uLgogICAgIFtQZXRlciBTeWx2ZXN0ZXIgPFBldGVyLlN5bHZlc3RlckBFZGVsV2ViLmZyPl0KCiAgKikgTWFrZSBCVUZfTUVNX2dyb3coKSBiZWhhdmlvdXIgbW9yZSBjb25zaXN0ZW50OiBJbml0aWFsaXNlIHRvIHplcm8KICAgICBhZGRpdGlvbmFsIGJ5dGVzIHdoZW4gbmV3IG1lbW9yeSBoYWQgdG8gYmUgYWxsb2NhdGVkLCBub3QganVzdAogICAgIHdoZW4gcmV1c2luZyBhbiBleGlzdGluZyBidWZmZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGNvbW1hbmQgbGluZSBhbmQgY29uZmlndXJhdGlvbiBvcHRpb24gJ3V0ZjgnIGZvciB0aGUgcmVxIGNvbW1hbmQuCiAgICAgVGhpcyBhbGxvd3MgZmllbGQgdmFsdWVzIHRvIGJlIHNwZWNpZmllZCBhcyBVVEY4IHN0cmluZ3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIC1tdWx0aSBhbmQgLW1yIG9wdGlvbnMgdG8gIm9wZW5zc2wgc3BlZWQiIC0gZ2l2aW5nIG11bHRpcGxlIHBhcmFsbGVsCiAgICAgcnVucyBmb3IgdGhlIGZvcm1lciBhbmQgbWFjaGluZS1yZWFkYWJsZSBvdXRwdXQgZm9yIHRoZSBsYXR0ZXIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCAnLW5vZW1haWxETicgb3B0aW9uIHRvICdvcGVuc3NsIGNhJy4gIFRoaXMgcHJldmVudHMgaW5jbHVzaW9uCiAgICAgb2YgdGhlIGUtbWFpbCBhZGRyZXNzIGluIHRoZSBETiAoaS5lLiwgaXQgd2lsbCBnbyBpbnRvIGEgY2VydGlmaWNhdGUKICAgICBleHRlbnNpb24gb25seSkuICBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZSBvcHRpb24gJ2VtYWlsX2luX2RuID0gbm8nCiAgICAgaGFzIHRoZSBzYW1lIGVmZmVjdC4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgbWFkd29sZkBvcGVuY2Eub3JnXQoKICAqKSBDaGFuZ2UgYWxsIGZ1bmN0aW9ucyB3aXRoIG5hbWVzIHN0YXJ0aW5nIHdpdGggZGVzXyB0byBiZSBzdGFydGluZwogICAgIHdpdGggREVTXyBpbnN0ZWFkLiAgQWRkIHdyYXBwZXJzIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBsaWJkZXMsCiAgICAgYnV0IGFyZSBuYW1lZCBfb3NzbF9vbGRfZGVzXyouICBGaW5hbGx5LCBhZGQgbWFjcm9zIHRoYXQgbWFwIHRoZQogICAgIGRlc18qIHN5bWJvbHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgX29zc2xfb2xkX2Rlc18qIGlmIGxpYmRlcwogICAgIGNvbXBhdGliaWxpdHkgaXMgZGVzaXJlZC4gIElmIE9wZW5TU0wgMC45LjZjIGNvbXBhdGliaWxpdHkgaXMKICAgICBkZXNpcmVkLCB0aGUgZGVzXyogc3ltYm9scyB3aWxsIGJlIG1hcHBlZCB0byBERVNfKiwgd2l0aCBvbmUKICAgICBleGNlcHRpb24uCgogICAgIFNpbmNlIHdlIHByb3ZpZGUgdHdvIGNvbXBhdGliaWxpdHkgbWFwcGluZ3MsIHRoZSB1c2VyIG5lZWRzIHRvCiAgICAgZGVmaW5lIHRoZSBtYWNybyBPUEVOU1NMX0RFU19MSUJERVNfQ09NUEFUSUJJTElUWSBpZiBsaWJkZXMKICAgICBjb21wYXRpYmlsaXR5IGlzIGRlc2lyZWQuICBUaGUgZGVmYXVsdCAoaS5lLiwgd2hlbiB0aGF0IG1hY3JvCiAgICAgaXNuJ3QgZGVmaW5lZCkgaXMgT3BlblNTTCAwLjkuNmMgY29tcGF0aWJpbGl0eS4KCiAgICAgVGhlcmUgYXJlIGFsc28gbWFjcm9zIHRoYXQgZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBzdXBwb3J0IG9mIG9sZAogICAgIGRlcyBmdW5jdGlvbnMgYWx0b2dldGhlci4gIFRob3NlIGFyZSBPUEVOU1NMX0VOQUJMRV9PTERfREVTX1NVUFBPUlQKICAgICBhbmQgT1BFTlNTTF9ESVNBQkxFX09MRF9ERVNfU1VQUE9SVC4gIElmIG5vbmUgb3IgYm90aCBvZiB0aG9zZQogICAgIGFyZSBkZWZpbmVkLCB0aGUgZGVmYXVsdCB3aWxsIGFwcGx5OiB0byBzdXBwb3J0IHRoZSBvbGQgZGVzIHJvdXRpbmVzLgoKICAgICBJbiBlaXRoZXIgY2FzZSwgb25lIG11c3QgaW5jbHVkZSBvcGVuc3NsL2Rlcy5oIHRvIGdldCB0aGUgY29ycmVjdAogICAgIGRlZmluaXRpb25zLiAgRG8gbm90IHRyeSB0byBqdXN0IGluY2x1ZGUgb3BlbnNzbC9kZXNfb2xkLmgsIHRoYXQKICAgICB3b24ndCB3b3JrLgoKICAgICBOT1RFOiBUaGlzIGlzIGEgbWFqb3IgYnJlYWsgb2YgYW4gb2xkIEFQSSBpbnRvIGEgbmV3IG9uZS4gIFNvZnR3YXJlCiAgICAgYXV0aG9ycyBhcmUgZW5jb3VyYWdlZCB0byBzd2l0Y2ggdG8gdGhlIERFU18gc3R5bGUgZnVuY3Rpb25zLiAgU29tZQogICAgIHRpbWUgaW4gdGhlIGZ1dHVyZSwgZGVzX29sZC5oIGFuZCB0aGUgbGliZGVzIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zCiAgICAgd2lsbCBiZSBkaXNhYmxlIChpLmUuIE9QRU5TU0xfRElTQUJMRV9PTERfREVTX1NVUFBPUlQgd2lsbCBiZSB0aGUKICAgICBkZWZhdWx0KSwgYW5kIHRoZW4gY29tcGxldGVseSByZW1vdmVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFRlc3QgZm9yIGNlcnRpZmljYXRlcyB3aGljaCBjb250YWluIHVuc3VwcG9ydGVkIGNyaXRpY2FsIGV4dGVuc2lvbnMuCiAgICAgSWYgc3VjaCBhIGNlcnRpZmljYXRlIGlzIGZvdW5kIGR1cmluZyBhIHZlcmlmeSBvcGVyYXRpb24gaXQgaXMgCiAgICAgcmVqZWN0ZWQgYnkgZGVmYXVsdDogdGhpcyBiZWhhdmlvdXIgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZWl0aGVyCiAgICAgaGFuZGxpbmcgdGhlIG5ldyBlcnJvciBYNTA5X1ZfRVJSX1VOSEFORExFRF9DUklUSUNBTF9FWFRFTlNJT04gb3IKICAgICBieSBzZXR0aW5nIHRoZSB2ZXJpZnkgZmxhZyBYNTA5X1ZfRkxBR19JR05PUkVfQ1JJVElDQUwuIEEgbmV3IGZ1bmN0aW9uCiAgICAgWDUwOV9zdXBwb3J0ZWRfZXh0ZW5zaW9uKCkgaGFzIGFsc28gYmVlbiBhZGRlZCB3aGljaCByZXR1cm5zIDEgaWYgYQogICAgIHBhcnRpY3VsYXIgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlIGJlaGF2aW91ciBvZiBFVlAgY2lwaGVyIGZ1bmN0aW9ucyBpbiBzaW1pbGFyIHdheSB0byBkaWdlc3RzCiAgICAgdG8gcmV0YWluIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIEVWUF9EaWdlc3RJbml0KCkgYW5kIEVWUF9EaWdlc3RGaW5hbCgpIHRvIHJldGFpbgogICAgIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlLiBJbiBwYXJ0aWN1bGFyIHRoZSAnY3R4JyBwYXJhbWV0ZXIgZG9lcwogICAgIG5vdCBoYXZlIHRvIGJlIHRvIGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgY2FsbCB0byBFVlBfRGlnZXN0SW5pdCgpIGFuZAogICAgIGl0IGlzIHRpZGllZCB1cCBhZnRlciBhIGNhbGwgdG8gRVZQX0RpZ2VzdEZpbmFsKCkuIE5ldyBmdW5jdGlvbgogICAgIEVWUF9EaWdlc3RGaW5hbF9leCgpIHdoaWNoIGRvZXMgbm90IHRpZHkgdXAgdGhlIGN0eC4gU2ltaWxhcmx5IGZ1bmN0aW9uCiAgICAgRVZQX01EX0NUWF9jb3B5KCkgY2hhbmdlZCB0byBub3QgcmVxdWlyZSB0aGUgZGVzdGluYXRpb24gdG8gYmUKICAgICBpbml0aWFsaXplZCB2YWxpZCBhbmQgbmV3IGZ1bmN0aW9uIEVWUF9NRF9DVFhfY29weV9leCgpIGFkZGVkIHdoaWNoCiAgICAgcmVxdWlyZXMgdGhlIGRlc3RpbmF0aW9uIHRvIGJlIHZhbGlkLgoKICAgICBNb2RpZnkgYWxsIHRoZSBPcGVuU1NMIGRpZ2VzdCBjYWxscyB0byB1c2UgRVZQX0RpZ2VzdEluaXRfZXgoKSwKICAgICBFVlBfRGlnZXN0RmluYWxfZXgoKSBhbmQgRVZQX01EX0NUWF9jb3B5X2V4KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHNzbDNfZ2V0X21lc3NhZ2UgKHNzbC9zM19ib3RoLmMpIGFuZCB0aGUgZnVuY3Rpb25zIHVzaW5nIGl0CiAgICAgc28gdGhhdCBjb21wbGV0ZSAnSGFuZHNoYWtlJyBwcm90b2NvbCBzdHJ1Y3R1cmVzIGFyZSBrZXB0IGluIG1lbW9yeQogICAgIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgJ21zZ190eXBlJyBhbmQgJ2xlbmd0aCcgd2l0aCAnYm9keScgZGF0YS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYW4gaW1wbGVtZW50YXRpb24gb2YgU1NMX2FkZF9kaXJfY2VydF9zdWJqZWN0c190b19zdGFjayBmb3IgV2luMzIuCiAgICAgW01hc3NpbW8gU2FudGluIHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIE1ham9yIHJlc3RydWN0dXJpbmcgdG8gdGhlIHVuZGVybHlpbmcgRU5HSU5FIGNvZGUuIFRoaXMgaW5jbHVkZXMKICAgICByZWR1Y3Rpb24gb2YgbGlua2VyIGJsb2F0LCBzZXBhcmF0aW9uIG9mIHB1cmUgIkVOR0lORSIgbWFuaXB1bGF0aW9uCiAgICAgKGluaXRpYWxpc2F0aW9uLCBldGMpIGZyb20gZnVuY3Rpb25hbGl0eSBkZWFsaW5nIHdpdGggaW1wbGVtZW50YXRpb25zCiAgICAgb2Ygc3BlY2lmaWMgY3J5cHRvIGl0ZXJmYWNlcy4gVGhpcyBjaGFuZ2UgYWxzbyBpbnRyb2R1Y2VzIGludGVncmF0ZWQKICAgICBzdXBwb3J0IGZvciBzeW1tZXRyaWMgY2lwaGVycyBhbmQgZGlnZXN0IGltcGxlbWVudGF0aW9ucyAtIHNvIEVOR0lORXMKICAgICBjYW4gbm93IGFjY2VsZXJhdGUgdGhlc2UgYnkgcHJvdmlkaW5nIEVWUF9DSVBIRVIgYW5kIEVWUF9NRAogICAgIGltcGxlbWVudGF0aW9ucyBvZiB0aGVpciBvd24uIFRoaXMgaXMgZGV0YWlsZWQgaW4gY3J5cHRvL2VuZ2luZS9SRUFETUUKICAgICBhcyBpdCBjb3VsZG4ndCBiZSBhZGVxdWF0ZWx5IGRlc2NyaWJlZCBoZXJlLiBIb3dldmVyLCB0aGVyZSBhcmUgYSBmZXcKICAgICBBUEkgY2hhbmdlcyB3b3J0aCBub3RpbmcgLSBzb21lIFJTQSwgRFNBLCBESCwgYW5kIFJBTkQgZnVuY3Rpb25zIHRoYXQKICAgICB3ZXJlIGNoYW5nZWQgaW4gdGhlIG9yaWdpbmFsIGludHJvZHVjdGlvbiBvZiBFTkdJTkUgY29kZSBoYXZlIG5vdwogICAgIHJldmVydGVkIGJhY2sgLSB0aGUgaG9va2luZyBmcm9tIHRoaXMgY29kZSB0byBFTkdJTkUgaXMgbm93IGEgZ29vZAogICAgIGRlYWwgbW9yZSBwYXNzaXZlIGFuZCBhdCBydW4tdGltZSwgb3BlcmF0aW9ucyBkZWFsIGRpcmVjdGx5IHdpdGgKICAgICBSU0FfTUVUSE9EcywgRFNBX01FVEhPRHMgKGV0YykgYXMgdGhleSBkaWQgYmVmb3JlLCByYXRoZXIgdGhhbgogICAgIGRlcmVmZXJlbmNpbmcgdGhyb3VnaCBhbiBFTkdJTkUgcG9pbnRlciBhbnkgbW9yZS4gQWxzbywgdGhlIEVOR0lORQogICAgIGZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggQk5fTU9EX0VYUFtfQ1JUXSBoYW5kbGVycyBoYXZlIGJlZW4gcmVtb3ZlZCAtCiAgICAgdGhleSB3ZXJlIG5vdCBiZWluZyB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgYXMgdGhlcmUgaXMgbm8gY29uY2VwdCBvZiBhCiAgICAgQklHTlVNX01FVEhPRCBhbmQgdGhleSBjb3VsZCBub3QgYmUgZ2VuZXJhbGlzZWQgdG8gdGhlIG5ldwogICAgICdFTkdJTkVfVEFCTEUnIG1lY2hhbmlzbSB0aGF0IHVuZGVybGllcyB0aGUgbmV3IGNvZGUuIFNpbWlsYXJseSwKICAgICBFTkdJTkVfY3B5KCkgaGFzIGJlZW4gcmVtb3ZlZCBhcyBpdCBjYW5ub3QgYmUgY29uc2lzdGVudGx5IGRlZmluZWQgaW4KICAgICB0aGUgbmV3IGNvZGUuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQ2hhbmdlIEFTTjFfR0VORVJBTElaRURUSU1FX2NoZWNrKCkgdG8gYWxsb3cgZnJhY3Rpb25hbCBzZWNvbmRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBta2RlZi5wbCB0byBzb3J0IHN5bWJvbHMgdGhhdCBnZXQgdGhlIHNhbWUgZW50cnkgbnVtYmVyLAogICAgIGFuZCBtYWtlIHN1cmUgdGhlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZ1bmN0aW9ucyBFUlJfbG9hZF8qCiAgICAgYmVjb21lIHBhcnQgb2YgbGliZWF5Lm51bSBhcyB3ZWxsLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbiBTU0xfcmVuZWdvdGlhdGVfcGVuZGluZygpLiAgVGhpcyByZXR1cm5zIHRydWUgb25jZQogICAgIHJlbmVnb3RpYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkIChlaXRoZXIgU1NMX3JlbmVnb3RpYXRlKCkgY2FsbAogICAgIG9yIEhlbGxvUmVxdWVzdC9DbGllbnRIZWxsbyByZWNlaXZlZCBmcm9tIHRoZSBwZWVyKSBhbmQgYmVjb21lcwogICAgIGZhbHNlIG9uY2UgYSBoYW5kc2hha2UgaGFzIGJlZW4gY29tcGxldGVkLgogICAgIChGb3Igc2VydmVycywgU1NMX3JlbmVnb3RpYXRlKCkgZm9sbG93ZWQgYnkgU1NMX2RvX2hhbmRzaGFrZSgpCiAgICAgc2VuZHMgYSBIZWxsb1JlcXVlc3QsIGJ1dCBkb2VzIG5vdCBlbnN1cmUgdGhhdCBhIGhhbmRzaGFrZSB0YWtlcwogICAgIHBsYWNlLiAgU1NMX3JlbmVnb3RpYXRlX3BlbmRpbmcoKSBpcyB1c2VmdWwgZm9yIGNoZWNraW5nIGlmIHRoZQogICAgIGNsaWVudCBoYXMgZm9sbG93ZWQgdGhlIHJlcXVlc3QuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBTU0wgb3B0aW9uIFNTTF9PUF9OT19TRVNTSU9OX1JFU1VNUFRJT05fT05fUkVORUdPVElBVElPTi4KICAgICBCeSBkZWZhdWx0LCBjbGllbnRzIG1heSByZXF1ZXN0IHNlc3Npb24gcmVzdW1wdGlvbiBldmVuIGR1cmluZwogICAgIHJlbmVnb3RpYXRpb24gKGlmIHNlc3Npb24gSUQgY29udGV4dHMgcGVybWl0KTsgd2l0aCB0aGlzIG9wdGlvbiwKICAgICBzZXNzaW9uIHJlc3VtcHRpb24gaXMgcG9zc2libGUgb25seSBpbiB0aGUgZmlyc3QgaGFuZHNoYWtlLgoKICAgICBTU0xfT1BfQUxMIGlzIG5vdyAweDAwMDAwRkZGTCBpbnN0ZWFkIG9mIDB4MDAwRkZGRkZMLiAgVGhpcyBtYWtlcwogICAgIG1vcmUgYml0cyBhdmFpbGFibGUgZm9yIG9wdGlvbnMgdGhhdCBzaG91bGQgbm90IGJlIHBhcnQgb2YKICAgICBTU0xfT1BfQUxMIChzdWNoIGFzIFNTTF9PUF9OT19TRVNTSU9OX1JFU1VNUFRJT05fT05fUkVORUdPVElBVElPTikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHNvbWUgZGVtb3MgZm9yIGNlcnRpZmljYXRlIGFuZCBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGNyZWF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgbWF4aW11bSBjZXJ0aWZpY2F0ZSBjaGFpbiBzaXplIGFjY2VwdGVkIGZyb20gdGhlIHBlZXIgYXBwbGljYXRpb24KICAgICBzZXR0YWJsZSAoU1NMKl9nZXQvc2V0X21heF9jZXJ0X2xpc3QoKSksIGFzIHByb3Bvc2VkIGJ5CiAgICAgIkRvdWdsYXMgRS4gRW5nZXJ0IiA8ZGVlbmdlcnRAYW5sLmdvdj4uCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzIGZvciBVbml4d2FyZS03CiAgICAgKEJveWQgTHlubiBHZXJiZXIgPGdlcmJlcmJAemVuZXouY29tPikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBhICJkZXN0cm95IiBoYW5kbGVyIHRvIEVOR0lORXMgdGhhdCBhbGxvd3Mgc3RydWN0dXJhbCBjbGVhbnVwIHRvCiAgICAgYmUgZG9uZSBwcmlvciB0byBkZXN0cnVjdGlvbi4gVXNlIHRoaXMgdG8gdW5sb2FkIGVycm9yIHN0cmluZ3MgZnJvbQogICAgIEVOR0lORXMgdGhhdCBsb2FkIHRoZWlyIG93biBlcnJvciBzdHJpbmdzLiBOQjogVGhpcyBhZGRzIHR3byBuZXcgQVBJCiAgICAgZnVuY3Rpb25zIHRvICJnZXQiIGFuZCAic2V0IiB0aGlzIGRlc3Ryb3kgaGFuZGxlciBpbiBhbiBFTkdJTkUuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWx0ZXIgYWxsIGV4aXN0aW5nIEVOR0lORSBpbXBsZW1lbnRhdGlvbnMgKGV4Y2VwdCAib3BlbnNzbCIgYW5kCiAgICAgIm9wZW5ic2QiKSB0byBkeW5hbWljYWxseSBpbnN0YW50aWF0ZSB0aGVpciBvd24gZXJyb3Igc3RyaW5ncy4gVGhpcwogICAgIG1ha2VzIHRoZW0gbW9yZSBmbGV4aWJsZSB0byBiZSBidWlsdCBib3RoIGFzIHN0YXRpY2FsbHktbGlua2VkIEVOR0lORXMKICAgICBhbmQgc2VsZi1jb250YWluZWQgc2hhcmVkLWxpYnJhcmllcyBsb2FkYWJsZSB2aWEgdGhlICJkeW5hbWljIiBFTkdJTkUuCiAgICAgQWxzbywgYWRkIHN0dWIgY29kZSB0byBlYWNoIHRoYXQgbWFrZXMgYnVpbGRpbmcgdGhlbSBhcyBzZWxmLWNvbnRhaW5lZAogICAgIHNoYXJlZC1saWJyYXJpZXMgZWFzaWVyIChzZWUgUkVBRE1FLkVOR0lORSkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGEgImR5bmFtaWMiIEVOR0lORSB0aGF0IHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBiaW5kaW5nIEVOR0lORQogICAgIGltcGxlbWVudGF0aW9ucyBpbnRvIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBjb21wbGV0ZWx5IGltcGxlbWVudGVkIGluCiAgICAgc2VsZi1jb250YWluZWQgc2hhcmVkLWxpYnJhcmllcy4gVGhlICJkeW5hbWljIiBFTkdJTkUgZXhwb3NlcyBjb250cm9sCiAgICAgY29tbWFuZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgd2hhdCBzaGFyZWQtbGlicmFyeSB0byBsb2FkIGFuZAogICAgIHRvIGNvbnRyb2wgYXNwZWN0cyBvZiB0aGUgd2F5IGl0IGlzIGhhbmRsZWQuIEFsc28sIG1hZGUgYW4gdXBkYXRlIHRvCiAgICAgdGhlIFJFQURNRS5FTkdJTkUgZmlsZSB0aGF0IGJyaW5ncyBpdHMgaW5mb3JtYXRpb24gdXAtdG8tZGF0ZSBhbmQKICAgICBwcm92aWRlcyBzb21lIGluZm9ybWF0aW9uIGFuZCBpbnN0cnVjdGlvbnMgb24gdGhlICJkeW5hbWljIiBFTkdJTkUKICAgICAoaWUuIGhvdyB0byB1c2UgaXQsIGhvdyB0byBidWlsZCAiZHluYW1pYyItbG9hZGFibGUgRU5HSU5FcywgZXRjKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIHVubG9hZCByYW5nZXMgb2YgRVJSIHN0cmluZ3Mgd2l0aCBhIG5ldwogICAgICJFUlJfdW5sb2FkX3N0cmluZ3MiIGZ1bmN0aW9uLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhIGNvcHkoKSBmdW5jdGlvbiB0byBFVlBfTUQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1ha2UgRVZQX01EIHJvdXRpbmVzIHRha2UgYSBjb250ZXh0IHBvaW50ZXIgaW5zdGVhZCBvZiBqdXN0IHRoZQogICAgIG1kX2RhdGEgdm9pZCBwb2ludGVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgZmxhZ3MgdG8gRVZQX01EIGFuZCBFVlBfTURfQ1RYLiBFVlBfTURfRkxBR19PTkVTSE9UIGluZGljYXRlcwogICAgIHRoYXQgdGhlIGRpZ2VzdCBjYW4gb25seSBwcm9jZXNzIGEgc2luZ2xlIGNodW5rIG9mIGRhdGEKICAgICAodHlwaWNhbGx5IGJlY2F1c2UgaXQgaXMgcHJvdmlkZWQgYnkgYSBwaWVjZSBvZgogICAgIGhhcmR3YXJlKS4gRVZQX01EX0NUWF9GTEFHX09ORVNIT1QgaW5kaWNhdGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uCiAgICAgaXMgb25seSBnb2luZyB0byBwcm92aWRlIGEgc2luZ2xlIGNodW5rIG9mIGRhdGEsIGFuZCBoZW5jZSB0aGUKICAgICBmcmFtZXdvcmsgbmVlZG4ndCBhY2N1bXVsYXRlIHRoZSBkYXRhIGZvciBvbmVzaG90IGRyaXZlcnMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFzIHdpdGggIkVSUiIsIG1ha2UgaXQgcG9zc2libGUgdG8gcmVwbGFjZSB0aGUgdW5kZXJseWluZyAiZXhfZGF0YSIKICAgICBmdW5jdGlvbnMuIFRoaXMgY2hhbmdlIGFsc28gYWx0ZXJzIHRoZSBzdG9yYWdlIGFuZCBtYW5hZ2VtZW50IG9mIGdsb2JhbAogICAgIGV4X2RhdGEgc3RhdGUgLSBpdCdzIG5vdyBhbGwgaW5zaWRlIGV4X2RhdGEuYyBhbmQgYWxsICJjbGFzcyIgY29kZSAoZWcuCiAgICAgUlNBLCBCSU8sIFNTTF9DVFgsIGV0Yykgbm8gbG9uZ2VyIHN0b3JlcyBpdHMgb3duIFNUQUNLUyBhbmQgcGVyLWNsYXNzCiAgICAgaW5kZXggY291bnRlcnMuIFRoZSBBUEkgZnVuY3Rpb25zIHRoYXQgdXNlIHRoaXMgc3RhdGUgaGF2ZSBiZWVuIGNoYW5nZWQKICAgICB0byB0YWtlIGEgImNsYXNzX2luZGV4IiByYXRoZXIgdGhhbiBwb2ludGVycyB0byB0aGUgY2xhc3MncyBsb2NhbCBTVEFDSwogICAgIGFuZCBjb3VudGVyLCBhbmQgdGhlcmUgaXMgbm93IGFuIEFQSSBmdW5jdGlvbiB0byBkeW5hbWljYWxseSBjcmVhdGUgbmV3CiAgICAgY2xhc3Nlcy4gVGhpcyBjZW50cmFsaXNhdGlvbiBhbGxvd3MgdXMgdG8gKGEpIHBsdWcgYSBsb3Qgb2YgdGhlCiAgICAgdGhyZWFkLXNhZmV0eSBwcm9ibGVtcyB0aGF0IGV4aXN0ZWQsIGFuZCAoYikgbWFrZXMgaXQgcG9zc2libGUgdG8gY2xlYW4KICAgICB1cCBhbGwgYWxsb2NhdGVkIHN0YXRlIHVzaW5nICJDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpIi4gVy5yLnQuIChiKQogICAgIHN1Y2ggZGF0YSB3b3VsZCBwcmV2aW91c2x5IGhhdmUgYWx3YXlzIGxlYWtlZCBpbiBhcHBsaWNhdGlvbiBjb2RlIGFuZAogICAgIHdvcmthcm91bmRzIHdlcmUgaW4gcGxhY2UgdG8gbWFrZSB0aGUgbWVtb3J5IGRlYnVnZ2luZyB0dXJuIGEgYmxpbmQgZXllCiAgICAgdG8gaXQuIEFwcGxpY2F0aW9uIGNvZGUgdGhhdCBkb2Vzbid0IHVzZSB0aGlzIG5ldyBmdW5jdGlvbiB3aWxsIHN0aWxsCiAgICAgbGVhayBhcyBiZWZvcmUsIGJ1dCB0aGVpciBtZW1vcnkgZGVidWdnaW5nIG91dHB1dCB3aWxsIGFubm91bmNlIGl0IG5vdwogICAgIHJhdGhlciB0aGFuIGxldHRpbmcgaXQgc2xpZGUuCgogICAgIEJlc2lkZXMgdGhlIGFkZGl0aW9uIG9mIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCksIGFub3RoZXIgQVBJIGNoYW5nZQogICAgIGluZHVjZWQgYnkgdGhlICJleF9kYXRhIiBvdmVyaGF1bCBpcyB0aGF0IFg1MDlfU1RPUkVfQ1RYX2luaXQoKSBub3cKICAgICBoYXMgYSByZXR1cm4gdmFsdWUgdG8gaW5kaWNhdGUgc3VjY2VzcyBvciBmYWlsdXJlLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gcmVwbGFjZSB0aGUgdW5kZXJseWluZyAiRVJSIiBmdW5jdGlvbnMgc3VjaCB0aGF0IHRoZQogICAgIGdsb2JhbCBzdGF0ZSAoMiBMSEFTSCB0YWJsZXMgYW5kIDIgbG9ja3MpIGlzIG9ubHkgdXNlZCBieSB0aGUgImRlZmF1bHQiCiAgICAgaW1wbGVtZW50YXRpb24uIFRoaXMgY2hhbmdlIGFsc28gYWRkcyB0d28gZnVuY3Rpb25zIHRvICJnZXQiIGFuZCAic2V0IgogICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBwcmlvciB0byBpdCBiZWluZyBhdXRvbWF0aWNhbGx5IHNldCB0aGUgZmlyc3QgdGltZQogICAgIGFueSBvdGhlciBFUlIgZnVuY3Rpb24gdGFrZXMgcGxhY2UuIEllLiBhbiBhcHBsaWNhdGlvbiBjYW4gY2FsbCAiZ2V0IiwKICAgICBwYXNzIHRoZSByZXR1cm4gdmFsdWUgdG8gYSBtb2R1bGUgaXQgaGFzIGp1c3QgbG9hZGVkLCBhbmQgdGhhdCBtb2R1bGUKICAgICBjYW4gY2FsbCBpdHMgb3duICJzZXQiIGZ1bmN0aW9uIHVzaW5nIHRoYXQgdmFsdWUuIFRoaXMgbWVhbnMgdGhlCiAgICAgbW9kdWxlJ3MgIkVSUiIgb3BlcmF0aW9ucyB3aWxsIHVzZSAoYW5kIG1vZGlmeSkgdGhlIGVycm9yIHN0YXRlIGluIHRoZQogICAgIGFwcGxpY2F0aW9uIGFuZCBub3QgaW4gaXRzIG93biBzdGF0aWNhbGx5IGxpbmtlZCBjb3B5IG9mIE9wZW5TU0wgY29kZS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBHaXZlIERILCBEU0EsIGFuZCBSU0EgdHlwZXMgdGhlaXIgb3duICIqKl91cF9yZWYoKSIgZnVuY3Rpb24gdG8gaW5jcmVtZW50CiAgICAgcmVmZXJlbmNlIGNvdW50cy4gVGhpcyBwZXJmb3JtcyBub3JtYWwgUkVGX1BSSU5UL1JFRl9DSEVDSyBtYWNyb3Mgb24KICAgICB0aGUgb3BlcmF0aW9uLCBhbmQgcHJvdmlkZXMgYSBtb3JlIGVuY2Fwc3VsYXRlZCB3YXkgZm9yIGV4dGVybmFsIGNvZGUKICAgICAoY3J5cHRvL2V2cC8gYW5kIHNzbC8pIHRvIGRvIHRoaXMuIEFsc28gY2hhbmdlZCB0aGUgZXZwIGFuZCBzc2wgY29kZQogICAgIHRvIHVzZSB0aGVzZSBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gbWFudWFsbHkgaW5jcmVtZW50aW5nIHRoZSBjb3VudHMuCgogICAgIEFsc28gcmVuYW1lICJEU09fdXAoKSIgZnVuY3Rpb24gdG8gbW9yZSBkZXNjcmlwdGl2ZSAiRFNPX3VwX3JlZigpIi4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgRVZQIHRlc3QgcHJvZ3JhbS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIHN5bW1ldHJpYyBjaXBoZXIgc3VwcG9ydCB0byBFTkdJTkUuIEV4cGVjdCB0aGUgQVBJIHRvIGNoYW5nZSEKICAgICBbQmVuIExhdXJpZV0KCiAgKikgTmV3IENSTCBmdW5jdGlvbnM6IFg1MDlfQ1JMX3NldF92ZXJzaW9uKCksIFg1MDlfQ1JMX3NldF9pc3N1ZXJfbmFtZSgpCiAgICAgWDUwOV9DUkxfc2V0X2xhc3RVcGRhdGUoKSwgWDUwOV9DUkxfc2V0X25leHRVcGRhdGUoKSwgWDUwOV9DUkxfc29ydCgpLAogICAgIFg1MDlfUkVWT0tFRF9zZXRfc2VyaWFsTnVtYmVyKCksIGFuZCBYNTA5X1JFVk9LRURfc2V0X3Jldm9jYXRpb25EYXRlKCkuCiAgICAgVGhlc2UgYWxsb3cgYSBDUkwgdG8gYmUgYnVpbHQgd2l0aG91dCBoYXZpbmcgdG8gYWNjZXNzIFg1MDlfQ1JMIGZpZWxkcwogICAgIGRpcmVjdGx5LiBNb2RpZnkgJ2NhJyBhcHBsaWNhdGlvbiB0byB1c2UgbmV3IGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3ZlIFNTTF9PUF9UTFNfUk9MTEJBQ0tfQlVHIG91dCBvZiB0aGUgU1NMX09QX0FMTCBsaXN0IG9mIHJlY29tbWVuZGVkCiAgICAgYnVnIHdvcmthcm91bmRzLiBSb2xsYmFjayBhdHRhY2sgZGV0ZWN0aW9uIGlzIGEgc2VjdXJpdHkgZmVhdHVyZS4KICAgICBUaGUgcHJvYmxlbSB3aWxsIG9ubHkgYXJpc2Ugb24gT3BlblNTTCBzZXJ2ZXJzIHdoZW4gVExTdjEgaXMgbm90CiAgICAgYXZhaWxhYmxlIChzc2x2M19zZXJ2ZXJfbWV0aG9kKCkgb3IgU1NMX09QX05PX1RMU3YxKS4KICAgICBTb2Z0d2FyZSBhdXRob3JzIG5vdCB3YW50aW5nIHRvIHN1cHBvcnQgVExTdjEgd2lsbCBoYXZlIHNwZWNpYWwgcmVhc29ucwogICAgIGZvciB0aGVpciBjaG9pY2UgYW5kIGNhbiBleHBsaWNpdGx5IGVuYWJsZSB0aGlzIG9wdGlvbi4KICAgICBbQm9kbyBNb2VsbGVyLCBMdXR6IEphZW5pY2tlXQoKICAqKSBSYXRpb25hbGlzZSBFVlAgc28gaXQgY2FuIGJlIGV4dGVuZGVkOiBkb24ndCBpbmNsdWRlIGEgdW5pb24gb2YKICAgICBjaXBoZXIvZGlnZXN0IHN0cnVjdHVyZXMsIGFkZCBpbml0L2NsZWFudXAgZnVuY3Rpb25zIGZvciBFVlBfTURfQ1RYCiAgICAgKHNpbWlsYXIgdG8gdGhvc2UgZXhpc3RpbmcgZm9yIEVWUF9DSVBIRVJfQ1RYKS4KICAgICBVc2FnZSBleGFtcGxlOgoKICAgICAgICAgRVZQX01EX0NUWCBtZDsKCiAgICAgICAgIEVWUF9NRF9DVFhfaW5pdCgmbWQpOyAgICAgICAgICAgICAvKiBuZXcgZnVuY3Rpb24gY2FsbCAqLwogICAgICAgICBFVlBfRGlnZXN0SW5pdCgmbWQsIEVWUF9zaGExKCkpOwogICAgICAgICBFVlBfRGlnZXN0VXBkYXRlKCZtZCwgaW4sIGxlbik7CiAgICAgICAgIEVWUF9EaWdlc3RGaW5hbCgmbWQsIG91dCwgTlVMTCk7CiAgICAgICAgIEVWUF9NRF9DVFhfY2xlYW51cCgmbWQpOyAgICAgICAgICAvKiBuZXcgZnVuY3Rpb24gY2FsbCAqLwoKICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBERVMga2V5IHNjaGVkdWxlIGNvbmZvcm0gdG8gdGhlIHVzdWFsIHNjaGVtZSwgYXMgd2VsbCBhcwogICAgIGNvcnJlY3RpbmcgaXRzIHN0cnVjdHVyZS4gVGhpcyBtZWFucyB0aGF0IGNhbGxzIHRvIERFUyBmdW5jdGlvbnMKICAgICBub3cgaGF2ZSB0byBwYXNzIGEgcG9pbnRlciB0byBhIGRlc19rZXlfc2NoZWR1bGUgaW5zdGVhZCBvZiBhCiAgICAgcGxhaW4gZGVzX2tleV9zY2hlZHVsZSAod2hpY2ggd2FzIGFjdHVhbGx5IGFsd2F5cyBhIHBvaW50ZXIKICAgICBhbnl3YXkpOiBFLmcuLAoKICAgICAgICAgZGVzX2tleV9zY2hlZHVsZSBrczsKCgkgZGVzX3NldF9rZXlfY2hlY2tlZCguLi4sICZrcyk7CgkgZGVzX25jYmNfZW5jcnlwdCguLi4sICZrcywgLi4uKTsKCiAgICAgKE5vdGUgdGhhdCBhIGxhdGVyIGNoYW5nZSByZW5hbWVzICdkZXNfLi4uJyBpbnRvICdERVNfLi4uJy4pCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEluaXRpYWwgcmVkdWN0aW9uIG9mIGxpbmtlciBibG9hdDogdGhlIHVzZSBvZiBzb21lIGZ1bmN0aW9ucywgc3VjaCBhcwogICAgIFBFTSBjYXVzZXMgbGFyZ2UgYW1vdW50cyBvZiB1bnVzZWQgZnVuY3Rpb25zIHRvIGJlIGxpbmtlZCBpbiBkdWUgdG8KICAgICBwb29yIG9yZ2FuaXNhdGlvbi4gRm9yIGV4YW1wbGUgcGVtX2FsbC5jIGNvbnRhaW5zIGV2ZXJ5IFBFTSBmdW5jdGlvbgogICAgIHdoaWNoIGhhcyBhIGtub2NrIG9uIGVmZmVjdCBvZiBsaW5raW5nIGluIGxhcmdlIGFtb3VudHMgb2YgKHVudXNlZCkKICAgICBBU04xIGNvZGUuIEdyb3VwaW5nIHRvZ2V0aGVyIHNpbWlsYXIgZnVuY3Rpb25zIGFuZCBzcGxpdHRpbmcgdW5yZWxhdGVkCiAgICAgZnVuY3Rpb25zIHByZXZlbnRzIHRoaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2xlYW51cCBvZiBFVlAgbWFjcm9zLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDaGFuZ2UgaGlzdG9yaWNhbCByZWZlcmVuY2VzIHRvIHtOSUQsU04sTE59X2Rlc19lZGUgYW5kIGVkZTMgdG8gYWRkIHRoZQogICAgIGNvcnJlY3QgX2VjYiBzdWZmaXguCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBpbml0aWFsIE9DU1AgcmVzcG9uZGVyIHN1cHBvcnQgdG8gb2NzcCBhcHBsaWNhdGlvbi4gVGhlCiAgICAgcmV2b2NhdGlvbiBpbmZvcm1hdGlvbiBpcyBoYW5kbGVkIHVzaW5nIHRoZSB0ZXh0IGJhc2VkIGluZGV4CiAgICAgdXNlIGJ5IHRoZSBjYSBhcHBsaWNhdGlvbi4gVGhlIHJlc3BvbmRlciBjYW4gZWl0aGVyIGhhbmRsZQogICAgIHJlcXVlc3RzIGdlbmVyYXRlZCBpbnRlcm5hbGx5LCBzdXBwbGllZCBpbiBmaWxlcyAoZm9yIGV4YW1wbGUKICAgICB2aWEgYSBDR0kgc2NyaXB0KSBvciB1c2luZyBhbiBpbnRlcm5hbCBtaW5pbWFsIHNlcnZlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29uZmlndXJhdGlvbiBjaG9pY2VzIHRvIGdldCB6bGliIGNvbXByZXNzaW9uIGZvciBUTFMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlcyB0byBLZXJiZXJvcyBTU0wgZm9yIFJGQyAyNzEyIGNvbXBsaWFuY2U6CiAgICAgMS4gIEltcGxlbWVudGVkIHJlYWwgS2VyYmVyb3NXcmFwcGVyLCBpbnN0ZWFkIG9mIGp1c3QgdXNpbmcKICAgICAgICAgS1JCNSBBUF9SRVEgbWVzc2FnZS4gIFtUaGFua3MgdG8gU2ltb24gV2lsa2luc29uIDxzeHdAc3h3Lm9yZy51az5dCiAgICAgMi4gIEltcGxlbWVudGVkIG9wdGlvbmFsIGF1dGhlbnRpY2F0b3IgZmllbGQgb2YgS2VyYmVyb3NXcmFwcGVyLgoKICAgICBBZGRlZCBvcGVuc3NsLXN0eWxlIEFTTi4xIG1hY3JvcyBmb3IgS2VyYmVyb3MgdGlja2V0LCBhcF9yZXEsCiAgICAgYW5kIGF1dGhlbnRpY2F0b3Igc3RydWN0czsgc2VlIGNyeXB0by9rcmI1Ly4KCiAgICAgR2VuZXJhbGl6ZWQgS2VyYmVyb3MgY2FsbHMgdG8gc3VwcG9ydCBtdWx0aXBsZSBLZXJiZXJvcyBsaWJyYXJpZXMuCiAgICAgW1Zlcm4gU3RhYXRzIDxzdGFhdHN2ckBhc2MuaHBjLm1pbD4sCiAgICAgIEplZmZyZXkgQWx0bWFuIDxqYWx0bWFuQGNvbHVtYmlhLmVkdT4KICAgICAgdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2F1c2UgJ29wZW5zc2wgc3BlZWQnIHRvIHVzZSBmdWxseSBoYXJkLWNvZGVkIERTQSBrZXlzIGFzIGl0CiAgICAgYWxyZWFkeSBkb2VzIHdpdGggUlNBLiB0ZXN0ZHNhLmggbm93IGhhcyAncHJpdl9rZXkvcHViX2tleScKICAgICB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGtleSBzaXplcyByYXRoZXIgdGhhbiBoYXZpbmcganVzdAogICAgIHBhcmFtZXRlcnMgKGFuZCAnc3BlZWQnIGdlbmVyYXRpbmcga2V5cyBlYWNoIHRpbWUpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFNwZWVkIHVwIEVWUCByb3V0aW5lcy4KICAgICBCZWZvcmU6CmVuY3J5cHQKdHlwZSAgICAgICAgICAgICAgOCBieXRlcyAgICAgNjQgYnl0ZXMgICAgMjU2IGJ5dGVzICAgMTAyNCBieXRlcyAgIDgxOTIgYnl0ZXMKZGVzLWNiYyAgICAgICAgICAgNDQwOC44NWsgICAgIDU1NjAuNTFrICAgICA1Nzc4LjQ2ayAgICAgNTg2Mi4yMGsgICAgIDU4MjUuMTZrCmRlcy1jYmMgICAgICAgICAgIDQzODkuNTVrICAgICA1NTcxLjE3ayAgICAgNTc5Mi4yM2sgICAgIDU4NDYuOTFrICAgICA1ODMyLjExawpkZXMtY2JjICAgICAgICAgICA0Mzk0LjMyayAgICAgNTU3NS45MmsgICAgIDU4MDcuNDRrICAgICA1ODQ4LjM3ayAgICAgNTg0MS4zMGsKZGVjcnlwdApkZXMtY2JjICAgICAgICAgICAzNDgyLjY2ayAgICAgNTA2OS40OWsgICAgIDU0OTYuMzlrICAgICA1NjE0LjE2ayAgICAgNTYzOS4yOGsKZGVzLWNiYyAgICAgICAgICAgMzQ4MC43NGsgICAgIDUwNjguNzZrICAgICA1NTEwLjM0ayAgICAgNTYwOS44N2sgICAgIDU2MzUuNTJrCmRlcy1jYmMgICAgICAgICAgIDM0ODMuNzJrICAgICA1MDY3LjYyayAgICAgNTUwNC42MGsgICAgIDU3MDguMDFrICAgICA1NzI0LjgwawogICAgIEFmdGVyOgplbmNyeXB0CmRlcy1jYmMgICAgICAgICAgIDQ2NjAuMTZrICAgICA1NjUwLjE5ayAgICAgNTgwNy4xOWsgICAgIDU4MjcuMTNrICAgICA1NzgzLjMyawpkZWNyeXB0CmRlcy1jYmMgICAgICAgICAgIDM2MjQuOTZrICAgICA1MjU4LjIxayAgICAgNTUzMC45MWsgICAgIDU2MjQuMzBrICAgICA1NjI4LjI2awogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGRlZCB0aGUgT1MyLUVNWCB0YXJnZXQuCiAgICAgWyJCcmlhbiBIYXZhcmQiIDxicmlhbmhAa2hlbGRhci5hcGFuYS5vcmcuYXU+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIFJld3JpdGUgYXBwcyB0byB1c2UgTkNPTkYgcm91dGluZXMgaW5zdGVhZCBvZiB0aGUgb2xkIENPTkYuIE5ldyBmdW5jdGlvbnMKICAgICB0byBzdXBwb3J0IE5DT05GIHJvdXRpbmVzIGluIGV4dGVuc2lvbiBjb2RlLiBOZXcgZnVuY3Rpb24gQ09ORl9zZXRfbmNvbmYoKQogICAgIHRvIGFsbG93IGZ1bmN0aW9ucyB3aGljaCB0YWtlIGFuIE5DT05GIHRvIGFsc28gaGFuZGxlIHRoZSBvbGQgTEhBU0gKICAgICBzdHJ1Y3R1cmU6IHRoaXMgbWVhbnMgdGhhdCB0aGUgb2xkIENPTkYgY29tcGF0aWJsZSByb3V0aW5lcyBjYW4gYmUKICAgICByZXRhaW5lZCAoaW4gcGFydGljdWxhciB3cnQgZXh0ZW5zaW9ucykgd2l0aG91dCBoYXZpbmcgdG8gZHVwbGljYXRlIHRoZQogICAgIGNvZGUuIE5ldyBmdW5jdGlvbiBYNTA5VjNfYWRkX2V4dF9uY29uZl9zayB0byBhZGQgZXh0ZW5zaW9ucyB0byBhIHN0YWNrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgdGhlIGdlbmVyYWwgdXNlciBpbnRlcmZhY2Ugd2l0aCBtZWNoYW5pc21zIGZvciBpbm5lciBjb250cm9sCiAgICAgYW5kIHdpdGggcG9zc2liaWxpdGllcyB0byBoYXZlIHllcy9ubyBraW5kIG9mIHByb21wdHMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIGFsbCBjYWxscyB0byBsb3cgbGV2ZWwgZGlnZXN0IHJvdXRpbmVzIGluIHRoZSBsaWJyYXJ5IGFuZAogICAgIGFwcGxpY2F0aW9ucyB0byB1c2UgRVZQLiBBZGQgbWlzc2luZyBjYWxscyB0byBITUFDX2NsZWFudXAoKSBhbmQKICAgICBkb24ndCBhc3N1bWUgSE1BQ19DVFggY2FuIGJlIGNvcGllZCB1c2luZyBtZW1jcHkoKS4KICAgICBbVmVyZG9uIFdhbGtlciA8VldhbGtlckBub3ZlbGwuY29tPiwgU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGNvbnRyb2wgZW5naW5lcyB0aHJvdWdoIGNvbnRyb2wgbmFtZXMgYnV0IHdpdGgKICAgICBhcmJpdHJhcnkgYXJndW1lbnRzIGluc3RlYWQgb2YganVzdCBhIHN0cmluZy4KICAgICBDaGFuZ2UgdGhlIGtleSBsb2FkZXJzIHRvIHRha2UgYSBVSV9NRVRIT0QgaW5zdGVhZCBvZiBhIGNhbGxiYWNrCiAgICAgZnVuY3Rpb24gcG9pbnRlci4gIE5PVEU6IHRoaXMgYnJlYWtzIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllcgogICAgIHZlcnNpb25zIG9mIE9wZW5TU0wgW2VuZ2luZV0uCiAgICAgQWRhcHQgdGhlIG5DaXBoZXIgY29kZSBmb3IgdGhlc2UgbmV3IGNvbmRpdGlvbnMgYW5kIGFkZCBhIGNhcmQgaW5zZXJ0aW9uCiAgICAgY2FsbGJhY2suCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRW5oYW5jZSB0aGUgZ2VuZXJhbCB1c2VyIGludGVyZmFjZSB3aXRoIG1lY2hhbmlzbXMgdG8gYmV0dGVyIHN1cHBvcnQKICAgICBkaWFsb2cgYm94IGludGVyZmFjZXMsIGFwcGxpY2F0aW9uLWRlZmluZWQgcHJvbXB0cywgdGhlIHBvc3NpYmlsaXR5CiAgICAgdG8gdXNlIGRlZmF1bHRzIChmb3IgZXhhbXBsZSBkZWZhdWx0IHBhc3N3b3JkcyBmcm9tIHNvbWV3aGVyZSBlbHNlKQogICAgIGFuZCBpbnRlcnJ1cHRzL2NhbmNlbGxhdGlvbnMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVGlkeSB1cCBQS0NTIzEyIGF0dHJpYnV0ZSBoYW5kbGluZy4gQWRkIHN1cHBvcnQgZm9yIHRoZSBDU1AgbmFtZQogICAgIGF0dHJpYnV0ZSBpbiBQS0NTIzEyIGZpbGVzLCBhZGQgbmV3IC1DU1Agb3B0aW9uIHRvIHBrY3MxMiB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBhIG1lbW9yeSBsZWFrIGluICdza19kdXAoKScgaW4gdGhlIGNhc2UgcmVhbGxvY2F0aW9uIGZhaWxzLiAoQWxzbwogICAgIHRpZHkgdXAgc29tZSB1bm5lY2Vzc2FyaWx5IHdlaXJkIGNvZGUgaW4gJ3NrX25ldygpJykuCiAgICAgW0dlb2ZmLCByZXBvcnRlZCBieSBEaWVnbyBUYXJ0YXJhIDxkdGFydGFyYUBub3ZhbWVucy5jb20+XQoKICAqKSBDaGFuZ2UgdGhlIGtleSBsb2FkaW5nIHJvdXRpbmVzIGZvciBFTkdJTkVzIHRvIHVzZSB0aGUgc2FtZSBraW5kCiAgICAgY2FsbGJhY2sgKHBlbV9wYXNzd29yZF9jYikgYXMgYWxsIG90aGVyIHJvdXRpbmVzIHRoYXQgbmVlZCB0aGlzCiAgICAga2luZCBvZiBjYWxsYmFjay4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbmNyZWFzZSBFTlRST1BZX05FRURFRCB0byAzMiBieXRlcywgYXMgUmlqbmRhZWwgY2FuIG9wZXJhdGUgd2l0aAogICAgIDI1NiBiaXQgKD0zMiBieXRlKSBrZXlzLiBPZiBjb3Vyc2Ugc2VlZGluZyB3aXRoIG1vcmUgZW50cm9weSBieXRlcwogICAgIHRoYW4gdGhpcyBtaW5pbXVtIHZhbHVlIGlzIHJlY29tbWVuZGVkLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBOZXcgcmFuZG9tIHNlZWRlciBmb3IgT3BlblZNUywgdXNpbmcgdGhlIHN5c3RlbSBwcm9jZXNzIHN0YXRpc3RpY3MKICAgICB0aGF0IGFyZSBlYXNpbHkgcmVhY2hhYmxlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFdpbmRvd3MgYXBwYXJlbnRseSBjYW4ndCB0cmFuc3BhcmVudGx5IGhhbmRsZSBnbG9iYWwKICAgICB2YXJpYWJsZXMgZGVmaW5lZCBpbiBETExzLiBJbml0aWFsaXNhdGlvbnMgc3VjaCBhczoKCiAgICAgICAgY29uc3QgQVNOMV9JVEVNICppdCA9ICZBU04xX0lOVEVHRVJfaXQ7CgogICAgIHdvbnQgY29tcGlsZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBhbnkgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0bwogICAgIGRlY2xhcmUgdGhlaXIgb3duIEFTTjEgbW9kdWxlcy4gVGhpcyB3YXMgZml4ZWQgYnkgYWRkaW5nIHRoZSBvcHRpb24KICAgICBFWFBPUlRfVkFSX0FTX0ZOIHRvIGFsbCBXaW4zMiBwbGF0Zm9ybXMsIGFsdGhvdWdoIHRoaXMgaXNuJ3Qgc3RyaWN0bHkKICAgICBuZWVkZWQgZm9yIHN0YXRpYyBsaWJyYXJpZXMgdW5kZXIgV2luMzIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBYNTA5X1BVUlBPU0Vfc2V0KCkgYW5kIFg1MDlfVFJVU1Rfc2V0KCkgdG8gaGFuZGxlCiAgICAgc2V0dGluZyBvZiBwdXJwb3NlIGFuZCB0cnVzdCBmaWVsZHMuIE5ldyBYNTA5X1NUT1JFIHRydXN0IGFuZAogICAgIHB1cnBvc2UgZnVuY3Rpb25zIGFuZCB0aWR5IHVwIHNldHRpbmcgaW4gb3RoZXIgU1NMIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29waWVzIG9mIFg1MDlfU1RPUkVfQ1RYIGZpZWxkcyBhbmQgY2FsbGJhY2tzIHRvIFg1MDlfU1RPUkUKICAgICBzdHJ1Y3R1cmUuIFRoZXNlIGFyZSBpbmhlcml0ZWQgYnkgWDUwOV9TVE9SRV9DVFggd2hlbiBpdCBpcyAKICAgICBpbml0aWFsaXNlZC4gVGhpcyBhbGxvd3MgdmFyaW91cyBkZWZhdWx0cyB0byBiZSBzZXQgaW4gdGhlCiAgICAgWDUwOV9TVE9SRSBzdHJ1Y3R1cmUgKHN1Y2ggYXMgZmxhZ3MgZm9yIENSTCBjaGVja2luZyBhbmQgY3VzdG9tCiAgICAgcHVycG9zZSBvciB0cnVzdCBzZXR0aW5ncykgZm9yIGZ1bmN0aW9ucyB3aGljaCBvbmx5IHVzZSBYNTA5X1NUT1JFX0NUWAogICAgIGludGVybmFsbHkgc3VjaCBhcyBTL01JTUUuCgogICAgIE1vZGlmeSBYNTA5X1NUT1JFX0NUWF9wdXJwb3NlX2luaGVyaXQoKSBzbyBpdCBvbmx5IHNldHMgcHVycG9zZXMgYW5kCiAgICAgdHJ1c3Qgc2V0dGluZ3MgaWYgdGhleSBhcmUgbm90IHNldCBpbiBYNTA5X1NUT1JFLiBUaGlzIGFsbG93cyBYNTA5X1NUT1JFCiAgICAgcHVycG9zZXMgYW5kIHRydXN0IChpbiBTL01JTUUgZm9yIGV4YW1wbGUpIHRvIG92ZXJyaWRlIGFueSBzZXQgYnkgZGVmYXVsdC4KCiAgICAgQWRkIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBDUkwgY2hlY2tpbmcgdG8gc21pbWUsIHNfY2xpZW50IGFuZCBzX3NlcnZlcgogICAgIGFwcGxpY2F0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIENSTCBiYXNlZCByZXZvY2F0aW9uIGNoZWNraW5nLiBJZiB0aGUgQ1JMIGNoZWNraW5nIGZsYWcocykKICAgICBhcmUgc2V0IHRoZW4gdGhlIENSTCBpcyBsb29rZWQgdXAgaW4gdGhlIFg1MDlfU1RPUkUgc3RydWN0dXJlIGFuZAogICAgIGl0cyB2YWxpZGl0eSBhbmQgc2lnbmF0dXJlIGNoZWNrZWQsIHRoZW4gaWYgdGhlIGNlcnRpZmljYXRlIGlzIGZvdW5kCiAgICAgaW4gdGhlIENSTCB0aGUgdmVyaWZ5IGZhaWxzIHdpdGggYSByZXZva2VkIGVycm9yLgoKICAgICBWYXJpb3VzIG5ldyBDUkwgcmVsYXRlZCBjYWxsYmFja3MgYWRkZWQgdG8gWDUwOV9TVE9SRV9DVFggc3RydWN0dXJlLgoKICAgICBDb21tYW5kIGxpbmUgb3B0aW9ucyBhZGRlZCB0byAndmVyaWZ5JyBhcHBsaWNhdGlvbiB0byBzdXBwb3J0IHRoaXMuCgogICAgIFRoaXMgbmVlZHMgc29tZSBhZGRpdGlvbmFsIHdvcmssIHN1Y2ggYXMgYmVpbmcgYWJsZSB0byBoYW5kbGUgbXVsdGlwbGUKICAgICBDUkxzIHdpdGggZGlmZmVyZW50IHRpbWVzLCBleHRlbnNpb24gYmFzZWQgbG9va3VwIChyYXRoZXIgdGhhbiBqdXN0CiAgICAgYnkgc3ViamVjdCBuYW1lKSBhbmQgdWx0aW1hdGVseSBtb3JlIGNvbXBsZXRlIFYyIENSTCBleHRlbnNpb24KICAgICBoYW5kbGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBnZW5lcmFsIHVzZXIgaW50ZXJmYWNlIEFQSSAoY3J5cHRvL3VpLykuICBUaGlzIGlzIGRlc2lnbmVkCiAgICAgdG8gcmVwbGFjZSB0aGluZ3MgbGlrZSBkZXNfcmVhZF9wYXNzd29yZCBhbmQgZnJpZW5kcyAoYmFja3dhcmQKICAgICBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucyB1c2luZyB0aGlzIG5ldyBBUEkgYXJlIHByb3ZpZGVkKS4KICAgICBUaGUgcHVycG9zZSBpcyB0byByZW1vdmUgcHJvbXB0aW5nIGZ1bmN0aW9ucyBmcm9tIHRoZSBERVMgY29kZQogICAgIHNlY3Rpb24gYXMgd2VsbCBhcyBwcm92aWRlIGZvciBwcm9tcHRpbmcgdGhyb3VnaCBkaWFsb2cgYm94ZXMgaW4KICAgICBhIHdpbmRvdyBzeXN0ZW0gYW5kIHRoZSBsaWtlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCAiZXhfZGF0YSIgc3VwcG9ydCB0byBFTkdJTkUgc28gaW1wbGVtZW50YXRpb25zIGNhbiBhZGQgc3RhdGUgYXQgYQogICAgIHBlci1zdHJ1Y3R1cmUgbGV2ZWwgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHN0b3JlIGl0IGdsb2JhbGx5LgogICAgIFtHZW9mZl0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSBmb3IgRU5HSU5FIHN0cnVjdHVyZXMgdG8gYmUgY29waWVkIHdoZW4gcmV0cmlldmVkIGJ5CiAgICAgRU5HSU5FX2J5X2lkKCkgaWYgdGhlIEVOR0lORSBzcGVjaWZpZXMgYSBuZXcgZmxhZzogRU5HSU5FX0ZMQUdTX0JZX0lEX0NPUFkuCiAgICAgVGhpcyBjYXVzZXMgdGhlICJvcmlnaW5hbCIgRU5HSU5FIHN0cnVjdHVyZSB0byBhY3QgbGlrZSBhIHRlbXBsYXRlLAogICAgIGFuYWxvZ291cyB0byB0aGUgUlNBIHZzLiBSU0FfTUVUSE9EIHR5cGUgb2Ygc2VwYXJhdGlvbi4gQmVjYXVzZSBvZiB0aGlzCiAgICAgb3BlcmF0aW9uYWwgc3RhdGUgY2FuIGJlIGxvY2FsaXNlZCB0byBlYWNoIEVOR0lORSBzdHJ1Y3R1cmUsIGRlc3BpdGUgdGhlCiAgICAgZmFjdCB0aGV5IGFsbCBzaGFyZSB0aGUgc2FtZSAibWV0aG9kcyIuIE5ldyBFTkdJTkUgc3RydWN0dXJlcyByZXR1cm5lZCBpbgogICAgIHRoaXMgY2FzZSBoYXZlIG5vIGZ1bmN0aW9uYWwgcmVmZXJlbmNlcyBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc2luZ2xlCiAgICAgc3RydWN0dXJhbCByZWZlcmVuY2UuIFRoaXMgbWF0Y2hlcyB0aGUgc2luZ2xlIHN0cnVjdHVyYWwgcmVmZXJlbmNlIHJldHVybmVkCiAgICAgYnkgRU5HSU5FX2J5X2lkKCkgbm9ybWFsbHksIHdoZW4gaXQgaXMgaW5jcmVtZW50ZWQgb24gdGhlIHByZS1leGlzdGluZwogICAgIEVOR0lORSBzdHJ1Y3R1cmUuCiAgICAgW0dlb2ZmXQoKICAqKSBGaXggQVNOMSBkZWNvZGVyIHdoZW4gZGVjb2RpbmcgdHlwZSBBTlkgYW5kIFZfQVNOMV9PVEhFUjogc2luY2UgdGhpcwogICAgIG5lZWRzIHRvIG1hdGNoIGFueSBvdGhlciB0eXBlIGF0IGFsbCB3ZSBuZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHRoZQogICAgIHRhZyBjYWNoZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VzIHRvIHRoZSAib3BlbnNzbCBlbmdpbmUiIHV0aWxpdHkgdG8gaW5jbHVkZTsKICAgICAtIHZlcmJvc2l0eSBsZXZlbHMgKCctdicsICctdnYnLCBhbmQgJy12dnYnKSB0aGF0IHByb3ZpZGUgaW5mb3JtYXRpb24KICAgICAgIGFib3V0IGFuIEVOR0lORSdzIGF2YWlsYWJsZSBjb250cm9sIGNvbW1hbmRzLgogICAgIC0gZXhlY3V0aW5nIGNvbnRyb2wgY29tbWFuZHMgZnJvbSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHVzaW5nIHRoZQogICAgICAgJy1wcmUnIGFuZCAnLXBvc3QnIHN3aXRjaGVzLiAnLXBvc3QnIGlzIG9ubHkgdXNlZCBpZiAnLXQnIGlzCiAgICAgICBzcGVjaWZpZWQgYW5kIHRoZSBFTkdJTkUgaXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpc2VkLiBUaGUgc3ludGF4IGZvcgogICAgICAgdGhlIGluZGl2aWR1YWwgY29tbWFuZHMgYXJlIGNvbG9uLXNlcGFyYXRlZCwgZm9yIGV4YW1wbGU7Cgkgb3BlbnNzbCBlbmdpbmUgY2hpbCAtcHJlIEZPUktfQ0hFQ0s6MCAtcHJlIFNPX1BBVEg6L2xpYi90ZXN0LnNvCiAgICAgW0dlb2ZmXQoKICAqKSBOZXcgZHluYW1pYyBjb250cm9sIGNvbW1hbmQgc3VwcG9ydCBmb3IgRU5HSU5Fcy4gRU5HSU5FcyBjYW4gbm93CiAgICAgZGVjbGFyZSB0aGVpciBvd24gY29tbWFuZHMgKG51bWJlcnMpLCBuYW1lcyAoc3RyaW5ncyksIGRlc2NyaXB0aW9ucywKICAgICBhbmQgaW5wdXQgdHlwZXMgZm9yIHJ1bi10aW1lIGRpc2NvdmVyeSBieSBjYWxsaW5nIGFwcGxpY2F0aW9ucy4gQQogICAgIHN1YnNldCBvZiB0aGVzZSBjb21tYW5kcyBhcmUgaW1wbGljaXRseSBjbGFzc2VkIGFzICJleGVjdXRhYmxlIgogICAgIGRlcGVuZGluZyBvbiB0aGVpciBpbnB1dCB0eXBlLCBhbmQgb25seSB0aGVzZSBjYW4gYmUgaW52b2tlZCB0aHJvdWdoCiAgICAgdGhlIG5ldyBzdHJpbmctYmFzZWQgQVBJIGZ1bmN0aW9uIEVOR0lORV9jdHJsX2NtZF9zdHJpbmcoKS4gKEVnLiB0aGlzCiAgICAgY2FuIGJlIGJhc2VkIG9uIHVzZXIgaW5wdXQsIGNvbmZpZyBmaWxlcywgZXRjKS4gVGhlIGRpc3RpbmN0aW9uIGlzCiAgICAgdGhhdCAiZXhlY3V0YWJsZSIgY29tbWFuZHMgY2Fubm90IHJldHVybiBhbnl0aGluZyBvdGhlciB0aGFuIGEgYm9vbGVhbgogICAgIHJlc3VsdCBhbmQgY2FuIG9ubHkgc3VwcG9ydCBudW1lcmljIG9yIHN0cmluZyBpbnB1dCwgd2hlcmVhcyBzb21lCiAgICAgZGlzY292ZXJhYmxlIGNvbW1hbmRzIG1heSBvbmx5IGJlIGZvciBkaXJlY3QgdXNlIHRocm91Z2gKICAgICBFTkdJTkVfY3RybCgpLCBlZy4gc3VwcG9ydGluZyB0aGUgZXhjaGFuZ2Ugb2YgYmluYXJ5IGRhdGEsIGZ1bmN0aW9uCiAgICAgcG9pbnRlcnMsIG9yIG90aGVyIGN1c3RvbSB1c2VzLiBUaGUgImV4ZWN1dGFibGUiIGNvbW1hbmRzIGFyZSB0bwogICAgIHN1cHBvcnQgcGFyYW1ldGVyaXNhdGlvbnMgb2YgRU5HSU5FIGJlaGF2aW91ciB0aGF0IGNhbiBiZQogICAgIHVuYW1iaWd1b3VzbHkgZGVmaW5lZCBieSBFTkdJTkVzIGFuZCB1c2VkIGNvbnNpc3RlbnRseSBhY3Jvc3MgYW55CiAgICAgT3BlblNTTC1iYXNlZCBhcHBsaWNhdGlvbi4gQ29tbWFuZHMgaGF2ZSBiZWVuIGFkZGVkIHRvIGFsbCB0aGUKICAgICBleGlzdGluZyBoYXJkd2FyZS1zdXBwb3J0aW5nIEVOR0lORXMsIG5vdGljZWFibHkgIlNPX1BBVEgiIHRvIGFsbG93CiAgICAgY29udHJvbCBvdmVyIHNoYXJlZC1saWJyYXJ5IHBhdGhzIHdpdGhvdXQgc291cmNlIGNvZGUgYWx0ZXJhdGlvbnMuCiAgICAgW0dlb2ZmXQoKICAqKSBDaGFuZ2VkIGFsbCBFTkdJTkUgaW1wbGVtZW50YXRpb25zIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHRoZWlyCiAgICAgRU5HSU5FcyByYXRoZXIgdGhhbiBkZWNsYXJpbmcgdGhlbSBzdGF0aWNhbGx5LiBBcGFydCBmcm9tIHRoaXMgYmVpbmcKICAgICBuZWNlc3Nhcnkgd2l0aCB0aGUgcmVtb3ZhbCBvZiB0aGUgRU5HSU5FX0ZMQUdTX01BTExPQ0VEIGRpc3RpbmN0aW9uLAogICAgIHRoaXMgYWxzbyBhbGxvd3MgdGhlIGltcGxlbWVudGF0aW9ucyB0byBjb21waWxlIHdpdGhvdXQgdXNpbmcgdGhlCiAgICAgaW50ZXJuYWwgZW5naW5lX2ludC5oIGhlYWRlci4KICAgICBbR2VvZmZdCgogICopIE1pbm9yIGFkanVzdG1lbnQgdG8gInJhbmQiIGNvZGUuIFJBTkRfZ2V0X3JhbmRfbWV0aG9kKCkgbm93IHJldHVybnMgYQogICAgICdjb25zdCcgdmFsdWUuIEFueSBjb2RlIHRoYXQgc2hvdWxkIGJlIGFibGUgdG8gbW9kaWZ5IGEgUkFORF9NRVRIT0QKICAgICBzaG91bGQgYWxyZWFkeSBoYXZlIG5vbi1jb25zdCBwb2ludGVycyB0byBpdCAoaWUuIHRoZXkgc2hvdWxkIG9ubHkKICAgICBtb2RpZnkgdGhlaXIgb3duIG9uZXMpLgogICAgIFtHZW9mZl0KCiAgKikgTWFkZSBhIHZhcmlldHkgb2YgbGl0dGxlIHR3ZWFrcyB0byB0aGUgRU5HSU5FIGNvZGUuCiAgICAgLSAiYXRhbGxhIiBhbmQgInVic2VjIiBzdHJpbmcgZGVmaW5pdGlvbnMgd2VyZSBtb3ZlZCBmcm9tIGhlYWRlciBmaWxlcwogICAgICAgdG8gQyBjb2RlLiAibnVyb24iIHN0cmluZyBkZWZpbml0aW9ucyB3ZXJlIHBsYWNlZCBpbiB2YXJpYWJsZXMKICAgICAgIHJhdGhlciB0aGFuIGhhcmQtY29kZWQgLSBhbGxvd2luZyBwYXJhbWV0ZXJpc2F0aW9uIG9mIHRoZXNlIHZhbHVlcwogICAgICAgbGF0ZXIgb24gdmlhIGN0cmwoKSBjb21tYW5kcy4KICAgICAtIFJlbW92ZWQgdW51c2VkICIjaWYgMCInZCBjb2RlLgogICAgIC0gRml4ZWQgZW5naW5lIGxpc3QgaXRlcmF0aW9uIGNvZGUgc28gaXQgdXNlcyBFTkdJTkVfZnJlZSgpIHRvIHJlbGVhc2UKICAgICAgIHN0cnVjdHVyYWwgcmVmZXJlbmNlcy4KICAgICAtIENvbnN0aWZpZWQgdGhlIFJBTkRfTUVUSE9EIGVsZW1lbnQgb2YgRU5HSU5FIHN0cnVjdHVyZXMuCiAgICAgLSBDb25zdGlmaWVkIHZhcmlvdXMgZ2V0L3NldCBmdW5jdGlvbnMgYXMgYXBwcm9wcmlhdGUgYW5kIGFkZGVkCiAgICAgICBtaXNzaW5nIGZ1bmN0aW9ucyAoaW5jbHVkaW5nIGEgY2F0Y2gtYWxsIEVOR0lORV9jcHkgdGhhdCBkdXBsaWNhdGVzCiAgICAgICBhbGwgRU5HSU5FIHZhbHVlcyBvbnRvIGEgbmV3IEVOR0lORSBleGNlcHQgcmVmZXJlbmNlIGNvdW50cy9zdGF0ZSkuCiAgICAgLSBSZW1vdmVkIE5VTEwgcGFyYW1ldGVyIGNoZWNrcyBpbiBnZXQvc2V0IGZ1bmN0aW9ucy4gU2V0dGluZyBhIG1ldGhvZAogICAgICAgb3IgZnVuY3Rpb24gdG8gTlVMTCBpcyBhIHdheSBvZiBjYW5jZWxsaW5nIG91dCBhIHByZXZpb3VzbHkgc2V0CiAgICAgICB2YWx1ZS4gIFBhc3NpbmcgYSBOVUxMIEVOR0lORSBwYXJhbWV0ZXIgaXMganVzdCBwbGFpbiBzdHVwaWQgYW55d2F5CiAgICAgICBhbmQgZG9lc24ndCBqdXN0aWZ5IHRoZSBleHRyYSBlcnJvciBzeW1ib2xzIGFuZCBjb2RlLgogICAgIC0gRGVwcmVjYXRlIHRoZSBFTkdJTkVfRkxBR1NfTUFMTE9DRUQgZGVmaW5lIGFuZCBtb3ZlIHRoZSBhcmVhIGZvcgogICAgICAgZmxhZ3MgZnJvbSBlbmdpbmVfaW50LmggdG8gZW5naW5lLmguCiAgICAgLSBDaGFuZ2VkIHByb3RvdHlwZXMgZm9yIEVOR0lORSBoYW5kbGVyIGZ1bmN0aW9ucyAoaW5pdCgpLCBmaW5pc2goKSwKICAgICAgIGN0cmwoKSwga2V5LWxvYWQgZnVuY3Rpb25zLCBldGMpIHRvIHRha2UgYW4gKEVOR0lORSopIHBhcmFtZXRlci4KICAgICBbR2VvZmZdCgogICopIEltcGxlbWVudCBiaW5hcnkgaW52ZXJzaW9uIGFsZ29yaXRobSBmb3IgQk5fbW9kX2ludmVyc2UgaW4gYWRkaXRpb24KICAgICB0byB0aGUgYWxnb3JpdGhtIHVzaW5nIGxvbmcgZGl2aXNpb24uICBUaGUgYmluYXJ5IGFsZ29yaXRobSBjYW4gYmUKICAgICB1c2VkIG9ubHkgaWYgdGhlIG1vZHVsdXMgaXMgb2RkLiAgT24gMzItYml0IHN5c3RlbXMsIGl0IGlzIGZhc3RlcgogICAgIG9ubHkgZm9yIHJlbGF0aXZlbHkgc21hbGwgbW9kdWxpIChyb3VnaGx5IDIwLTMwJSBmb3IgMTI4LWJpdCBtb2R1bGksCiAgICAgcm91Z2hseSA1LTE1JSBmb3IgMjU2LWJpdCBtb2R1bGkpLCBzbyB3ZSB1c2UgaXQgb25seSBmb3IgbW9kdWxpCiAgICAgdXAgdG8gNDUwIGJpdHMuICBJbiA2NC1iaXQgZW52aXJvbm1lbnRzLCB0aGUgYmluYXJ5IGFsZ29yaXRobQogICAgIGFwcGVhcnMgdG8gYmUgYWR2YW50YWdlb3VzIGZvciBtdWNoIGxvbmdlciBtb2R1bGk7IGhlcmUgd2UgdXNlIGl0CiAgICAgZm9yIG1vZHVsaSB1cCB0byAyMDQ4IGJpdHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmV3cml0ZSBDSE9JQ0UgZmllbGQgc2V0dGluZyBpbiBBU04xX2l0ZW1fZXhfZDJpKCkuIFRoZSBvbGQgY29kZQogICAgIGNvdWxkIG5vdCBzdXBwb3J0IHRoZSBjb21iaW5lIGZsYWcgaW4gY2hvaWNlIGZpZWxkcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSAnY29weV9leHRlbnNpb25zJyBvcHRpb24gdG8gdGhlICdjYScgdXRpbGl0eS4gVGhpcyBjb3BpZXMKICAgICBleHRlbnNpb25zIGZyb20gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHRvIHRoZSBjZXJ0aWZpY2F0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBtdWx0aXBsZSAnY2VydG9wdCcgYW5kICduYW1lb3B0JyBvcHRpb25zIHRvIGJlIHNlcGFyYXRlZAogICAgIGJ5IGNvbW1hcy4gQWRkICduYW1vcHQnIGFuZCAnY2VydG9wdCcgb3B0aW9ucyB0byB0aGUgJ2NhJyBjb25maWcKICAgICBmaWxlOiB0aGlzIGFsbG93cyB0aGUgZGlzcGxheSBvZiB0aGUgY2VydGlmaWNhdGUgYWJvdXQgdG8gYmUKICAgICBzaWduZWQgdG8gYmUgY3VzdG9taXNlZCwgdG8gYWxsb3cgY2VydGFpbiBmaWVsZHMgdG8gYmUgaW5jbHVkZWQKICAgICBvciBleGNsdWRlZCBhbmQgZXh0ZW5zaW9uIGRldGFpbHMuIFRoZSBvbGQgc3lzdGVtIGRpZG4ndCBkaXNwbGF5CiAgICAgbXVsdGljaGFyYWN0ZXIgc3RyaW5ncyBwcm9wZXJseSwgb21pdHRlZCBmaWVsZHMgbm90IGluIHRoZSBwb2xpY3kKICAgICBhbmQgY291bGRuJ3QgZGlzcGxheSBhZGRpdGlvbmFsIGRldGFpbHMgc3VjaCBhcyBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1bmN0aW9uIEVDX1BPSU5Uc19tdWwgZm9yIG11bHRpcGxlIHNjYWxhciBtdWx0aXBsaWNhdGlvbgogICAgIG9mIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZWxsaXB0aWMgY3VydmUgcG9pbnRzCiAgICAgICAgICBcc3VtIHNjYWxhcnNbaV0qcG9pbnRzW2ldLAogICAgIG9wdGlvbmFsbHkgaW5jbHVkaW5nIHRoZSBnZW5lcmF0b3IgZGVmaW5lZCBmb3IgdGhlIEVDX0dST1VQOgogICAgICAgICAgc2NhbGFyKmdlbmVyYXRvciArICBcc3VtIHNjYWxhcnNbaV0qcG9pbnRzW2ldLgoKICAgICBFQ19QT0lOVF9tdWwgaXMgYSBzaW1wbGUgd3JhcHBlciBmdW5jdGlvbiBmb3IgdGhlIHR5cGljYWwgY2FzZQogICAgIHRoYXQgdGhlIHBvaW50IGxpc3QgaGFzIGp1c3Qgb25lIGl0ZW0gKGJlc2lkZXMgdGhlIG9wdGlvbmFsCiAgICAgZ2VuZXJhdG9yKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXJzdCBFQ19NRVRIT0RzIGZvciBjdXJ2ZXMgb3ZlciBHRihwKToKCiAgICAgRUNfR0ZwX3NpbXBsZV9tZXRob2QoKSB1c2VzIHRoZSBiYXNpYyBCTl9tb2RfbXVsIGFuZCBCTl9tb2Rfc3FyCiAgICAgb3BlcmF0aW9ucyBhbmQgcHJvdmlkZXMgdmFyaW91cyBtZXRob2QgZnVuY3Rpb25zIHRoYXQgY2FuIGFsc28KICAgICBvcGVyYXRlIHdpdGggZmFzdGVyIGltcGxlbWVudGF0aW9ucyBvZiBtb2R1bGFyIGFyaXRobWV0aWMuICAgICAKCiAgICAgRUNfR0ZwX21vbnRfbWV0aG9kKCkgcmV1c2VzIG1vc3QgZnVuY3Rpb25zIHRoYXQgYXJlIHBhcnQgb2YKICAgICBFQ19HRnBfc2ltcGxlX21ldGhvZCwgYnV0IHVzZXMgTW9udGdvbWVyeSBhcml0aG1ldGljLgoKICAgICBbQm9kbyBNb2VsbGVyOyBwb2ludCBhZGRpdGlvbiBhbmQgcG9pbnQgZG91YmxpbmcKICAgICBpbXBsZW1lbnRhdGlvbiBkaXJlY3RseSBkZXJpdmVkIGZyb20gc291cmNlIGNvZGUgcHJvdmlkZWQgYnkKICAgICBMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPl0KCiAgKikgRnJhbWV3b3JrIGZvciBlbGxpcHRpYyBjdXJ2ZXMgKGNyeXB0by9lYy9lYy5oLCBjcnlwdG8vZWMvZWNfbGNsLmgsCiAgICAgY3J5cHRvL2VjL2VjX2xpYi5jKToKCiAgICAgQ3VydmVzIGFyZSBFQ19HUk9VUCBvYmplY3RzICh3aXRoIGFuIG9wdGlvbmFsIGdyb3VwIGdlbmVyYXRvcikKICAgICBiYXNlZCBvbiBFQ19NRVRIT0RzIHRoYXQgYXJlIGJ1aWx0IGludG8gdGhlIGxpYnJhcnkuCgogICAgIFBvaW50cyBhcmUgRUNfUE9JTlQgb2JqZWN0cyBiYXNlZCBvbiBFQ19HUk9VUCBvYmplY3RzLgoKICAgICBNb3N0IG9mIHRoZSBmcmFtZXdvcmsgd291bGQgYmUgYWJsZSB0byBoYW5kbGUgY3VydmVzIG92ZXIgYXJiaXRyYXJ5CiAgICAgZmluaXRlIGZpZWxkcywgYnV0IGFzIHRoZXJlIGFyZSBubyBvYnZpb3VzIHR5cGVzIGZvciBmaWVsZHMgb3RoZXIKICAgICB0aGFuIEdGKHApLCBzb21lIGZ1bmN0aW9ucyBhcmUgbGltaXRlZCB0byB0aGF0IGZvciBub3cuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHRoZSAtSFRUUCBvcHRpb24gdG8gc19zZXJ2ZXIuICBJdCBpcyBzaW1pbGFyIHRvIC1XV1csIGJ1dCByZXF1aXJlcwogICAgIHRoYXQgdGhlIGZpbGUgY29udGFpbnMgYSBjb21wbGV0ZSBIVFRQIHJlc3BvbnNlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZWMgZGlyZWN0b3J5IHRvIG1rZGVmLnBsIGFuZCBta2ZpbGVzLnBsLiBJbiBta2RlZi5wbAogICAgIGNoYW5nZSB0aGUgZGVmIGFuZCBudW0gZmlsZSBwcmludGYgZm9ybWF0IHNwZWNpZmllciBmcm9tICIlLTQwc1hYWCIKICAgICB0byAiJS0zOXMgWFhYIi4gVGhlIGxhdHRlciB3aWxsIGFsd2F5cyBndWFyYW50ZWUgYSBzcGFjZSBhZnRlciB0aGUKICAgICBmaWVsZCB3aGlsZSB0aGUgZm9ybWVyIHdpbGwgY2F1c2UgdGhlbSB0byBydW4gdG9nZXRoZXIgaWYgdGhlIGZpZWxkCiAgICAgaXMgNDAgb2YgbW9yZSBjaGFyYWN0ZXJzIGxvbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29uc3RpZnkgdGhlIGNpcGhlciBhbmQgZGlnZXN0ICdtZXRob2QnIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcwogICAgIGFuZCBtb2RpZnkgcmVsYXRlZCBmdW5jdGlvbnMgdG8gdGFrZSBjb25zdGFudCBFVlBfTUQgYW5kIEVWUF9DSVBIRVIKICAgICBwb2ludGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIaWRlIEJOX0NUWCBzdHJ1Y3R1cmUgZGV0YWlscyBpbiBibl9sY2wuaCBpbnN0ZWFkIG9mIHB1Ymxpc2hpbmcgdGhlbQogICAgIGluIDxvcGVuc3NsL2JuLmg+LiAgQWxzbyBmdXJ0aGVyIGluY3JlYXNlIEJOX0NUWF9OVU0gdG8gMzIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTW9kaWZ5IEVWUF9EaWdlc3QqKCkgcm91dGluZXMgc28gdGhleSBub3cgcmV0dXJuIHZhbHVlcy4gQWx0aG91Z2ggdGhlCiAgICAgaW50ZXJuYWwgc29mdHdhcmUgcm91dGluZXMgY2FuIG5ldmVyIGZhaWwgYWRkaXRpb25hbCBoYXJkd2FyZSB2ZXJzaW9ucwogICAgIG1pZ2h0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENsZWFuIHVwIGNyeXB0by9lcnIvZXJyLmggYW5kIGNoYW5nZSBzb21lIGVycm9yIGNvZGVzIHRvIGF2b2lkIGNvbmZsaWN0czoKCiAgICAgUHJldmlvdXNseSBFUlJfUl9GQVRBTCB3YXMgdG9vIHNtYWxsIGFuZCBjb2luY2lkZWQgd2l0aCBFUlJfTElCX1BLQ1M3CiAgICAgKD0gRVJSX1JfUEtDUzdfTElCKTsgaXQgaXMgbm93IDY0IGluc3RlYWQgb2YgMzIuCgogICAgIEFTTjEgZXJyb3IgY29kZXMKICAgICAgICAgIEVSUl9SX05FU1RFRF9BU04xX0VSUk9SCiAgICAgICAgICAuLi4KICAgICAgICAgIEVSUl9SX01JU1NJTkdfQVNOMV9FT1MKICAgICB3ZXJlIDQgLi4gOSwgY29uZmxpY3Rpbmcgd2l0aAogICAgICAgICAgRVJSX0xJQl9SU0EgKD0gRVJSX1JfUlNBX0xJQikKICAgICAgICAgIC4uLgogICAgICAgICAgRVJSX0xJQl9QRU0gKD0gRVJSX1JfUEVNX0xJQikuCiAgICAgVGhleSBhcmUgbm93IDU4IC4uIDYzIChpLmUuLCBqdXN0IGJlbG93IEVSUl9SX0ZBVEFMKS4KCiAgICAgQWRkIG5ldyBlcnJvciBjb2RlICdFUlJfUl9JTlRFUk5BTF9FUlJPUicuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRG9uJ3Qgb3ZlcnVzZSBsb2NrcyBpbiBjcnlwdG8vZXJyL2Vyci5jOiBGb3IgZGF0YSByZXRyaWV2YWwsIENSWVBUT19yX2xvY2sKICAgICBzdWZmaWNlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgb3B0aW9uICctc3ViaiBhcmcnIGZvciAnb3BlbnNzbCByZXEnIGFuZCAnb3BlbnNzbCBjYScuICBUaGlzCiAgICAgc2V0cyB0aGUgc3ViamVjdCBuYW1lIGZvciBhIG5ldyByZXF1ZXN0IG9yIHN1cGVyc2VkZXMgdGhlCiAgICAgc3ViamVjdCBuYW1lIGluIGEgZ2l2ZW4gcmVxdWVzdC4gRm9ybWF0cyB0aGF0IGNhbiBiZSBwYXJzZWQgYXJlCiAgICAgICAgICAnQ049U29tZSBOYW1lLCBPVT1teU9VLCBDPUlUJwogICAgIGFuZAogICAgICAgICAgJ0NOPVNvbWUgTmFtZS9PVT1teU9VL0M9SVQnLgoKICAgICBBZGQgb3B0aW9ucyAnLWJhdGNoJyBhbmQgJy12ZXJib3NlJyB0byAnb3BlbnNzbCByZXEnLgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBoYWNrbWFzdGVycy5uZXQ+XQoKICAqKSBJbnRyb2R1Y2UgdGhlIHBvc3NpYmlsaXR5IHRvIGFjY2VzcyBnbG9iYWwgdmFyaWFibGVzIHRocm91Z2gKICAgICBmdW5jdGlvbnMgb24gcGxhdGZvcm0gd2VyZSB0aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIGhhbmRsZSBleHBvcnRpbmcKICAgICBnbG9iYWwgdmFyaWFibGVzIGluIHNoYXJlZCBsaWJyYXJpZXMuICBUbyBlbmFibGUgdGhpcyBmdW5jdGlvbmFsaXR5LAogICAgIG9uZSBtdXN0IGNvbmZpZ3VyZSB3aXRoICJFWFBPUlRfVkFSX0FTX0ZOIiBvciBkZWZpbmVkIHRoZSBDIG1hY3JvCiAgICAgIk9QRU5TU0xfRVhQT1JUX1ZBUl9BU19GVU5DVElPTiIgaW4gY3J5cHRvL29wZW5zc2xjb25mLmggKHRoZSBsYXR0ZXIKICAgICBpcyBub3JtYWxseSBkb25lIGJ5IENvbmZpZ3VyZSBvciBzb21ldGhpbmcgc2ltaWxhcikuCgogICAgIFRvIGltcGxlbWVudCBhIGdsb2JhbCB2YXJpYWJsZSwgdXNlIHRoZSBtYWNybyBPUEVOU1NMX0lNUExFTUVOVF9HTE9CQUwKICAgICBpbiB0aGUgc291cmNlIGZpbGUgKGZvby5jKSBsaWtlIHRoaXM6CgoJT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMKGludCxmb28pPTE7CglPUEVOU1NMX0lNUExFTUVOVF9HTE9CQUwoZG91YmxlLGJhcik7CgogICAgIFRvIGRlY2xhcmUgYSBnbG9iYWwgdmFyaWFibGUsIHVzZSB0aGUgbWFjcm9zIE9QRU5TU0xfREVDTEFSRV9HTE9CQUwKICAgICBhbmQgT1BFTlNTTF9HTE9CQUxfUkVGIGluIHRoZSBoZWFkZXIgZmlsZSAoZm9vLmgpIGxpa2UgdGhpczoKCglPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMKGludCxmb28pOwoJI2RlZmluZSBmb28gT1BFTlNTTF9HTE9CQUxfUkVGKGZvbykKCU9QRU5TU0xfREVDTEFSRV9HTE9CQUwoZG91YmxlLGJhcik7CgkjZGVmaW5lIGJhciBPUEVOU1NMX0dMT0JBTF9SRUYoYmFyKQoKICAgICBUaGUgI2RlZmluZXMgYXJlIHZlcnkgaW1wb3J0YW50LCBhbmQgdGhlcmVmb3JlIHNvIGlzIGluY2x1ZGluZyB0aGUKICAgICBoZWFkZXIgZmlsZSBldmVyeXdoZXJlIHdoZXJlIHRoZSBkZWZpbmVkIGdsb2JhbHMgYXJlIHVzZWQuCgogICAgIFRoZSBtYWNybyBPUEVOU1NMX0VYUE9SVF9WQVJfQVNfRlVOQ1RJT04gYWxzbyBhZmZlY3RzIHRoZSBkZWZpbml0aW9uCiAgICAgb2YgQVNOLjEgaXRlbXMsIGJ1dCB0aGF0IHN0cnVjdHVyZSBpcyBhIGJpdCBkaWZmZXJlbnQuCgogICAgIFRoZSBsYXJnZXN0IGNoYW5nZSBpcyBpbiB1dGlsL21rZGVmLnBsIHdoaWNoIGhhcyBiZWVuIGVuaGFuY2VkIHdpdGgKICAgICBiZXR0ZXIgYW5kIGVhc2llciB0byB1bmRlcnN0YW5kIGxvZ2ljIHRvIGNob29zZSB3aGljaCBzeW1ib2xzIHNob3VsZAogICAgIGdvIGludG8gdGhlIFdpbmRvd3MgLmRlZiBmaWxlcyBhcyB3ZWxsIGFzIGEgbnVtYmVyIG9mIGZpeGVzIGFuZCBjb2RlCiAgICAgY2xlYW51cCAoYW1vbmcgb3RoZXJzLCBhbGdvcml0aG0ga2V5d29yZHMgYXJlIG5vdyBzb3J0ZWQKICAgICBsZXhpY29ncmFwaGljYWxseSB0byBhdm9pZCBjb25zdGFudCByZXdyaXRlcykuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gQk5fZGl2KCkga2VlcCBhIGNvcHkgb2YgdGhlIHNpZ24gb2YgJ251bScgYmVmb3JlIHdyaXRpbmcgdGhlCiAgICAgcmVzdWx0IHRvICdybScgYmVjYXVzZSBpZiBybT09bnVtIHRoZSB2YWx1ZSB3aWxsIGJlIG92ZXJ3cml0dGVuCiAgICAgYW5kIHByb2R1Y2UgdGhlIHdyb25nIHJlc3VsdCBpZiAnbnVtJyBpcyBuZWdhdGl2ZTogdGhpcyBjYXVzZWQKICAgICBwcm9ibGVtcyB3aXRoIEJOX21vZCgpIGFuZCBCTl9ubm1vZCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1bmN0aW9uIE9DU1BfcmVxdWVzdF92ZXJpZnkoKS4gVGhpcyBjaGVja3MgdGhlIHNpZ25hdHVyZSBvbiBhbgogICAgIE9DU1AgcmVxdWVzdCBhbmQgdmVyaWZpZXMgdGhlIHNpZ25lciBjZXJ0aWZpY2F0ZS4gVGhlIHNpZ25lcgogICAgIGNlcnRpZmljYXRlIGlzIGp1c3QgY2hlY2tlZCBmb3IgYSBnZW5lcmljIHB1cnBvc2UgYW5kIE9DU1AgcmVxdWVzdAogICAgIHRydXN0IHNldHRpbmdzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBPQ1NQX2NoZWNrX3ZhbGlkaXR5KCkgZnVuY3Rpb24gdG8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIE9DU1AKICAgICByZXNwb25zZXMuIE9DU1AgcmVzcG9uc2VzIGFyZSBwcmVwYXJlZCBpbiByZWFsIHRpbWUgYW5kIG1heSBvbmx5CiAgICAgYmUgYSBmZXcgc2Vjb25kcyBvbGQuIFNpbXBseSBjaGVja2luZyB0aGF0IHRoZSBjdXJyZW50IHRpbWUgbGllcwogICAgIGJldHdlZW4gdGhpc1VwZGF0ZSBhbmQgbmV4dFVwZGF0ZSBtYXggcmVqZWN0IG90aGVyd2lzZSB2YWxpZCByZXNwb25zZXMKICAgICBjYXVzZWQgYnkgZWl0aGVyIE9DU1AgcmVzcG9uZGVyIG9yIGNsaWVudCBjbG9jayBpbmFjY3VyYWN5LiBJbnN0ZWFkCiAgICAgd2UgYWxsb3cgdGhpc1VwZGF0ZSBhbmQgbmV4dFVwZGF0ZSB0byBmYWxsIHdpdGhpbiBhIGNlcnRhaW4gcGVyaW9kIG9mCiAgICAgdGhlIGN1cnJlbnQgdGltZS4gVGhlIGFnZSBvZiB0aGUgcmVzcG9uc2UgY2FuIGFsc28gb3B0aW9uYWxseSBiZQogICAgIGNoZWNrZWQuIFR3byBuZXcgb3B0aW9ucyAtdmFsaWRpdHlfcGVyaW9kIGFuZCAtc3RhdHVzX2FnZSBhZGRlZCB0bwogICAgIG9jc3AgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJZiBzaWduYXR1cmUgb3IgcHVibGljIGtleSBhbGdvcml0aG0gaXMgdW5yZWNvZ25pemVkIHByaW50IG91dCBpdHMKICAgICBPSUQgcmF0aGVyIHRoYXQganVzdCBVTktOT1dOLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBPQ1NQX2NlcnRfdG9faWQoKSB0byB0b2xlcmF0ZSBhIE5VTEwgc3ViamVjdCBjZXJ0aWZpY2F0ZSBhbmQKICAgICBPQ1NQX2NlcnRfaWRfbmV3KCkgYSBOVUxMIHNlcmlhbE51bWJlci4gVGhpcyBhbGxvd3MgYSBwYXJ0aWFsIGNlcnRpZmljYXRlCiAgICAgSUQgdG8gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIGlzc3VlciBjZXJ0aWZpY2F0ZSBhbG9uZSB3aGljaCBjYW4gdGhlbiBiZQogICAgIHBhc3NlZCB0byBPQ1NQX2lkX2lzc3Vlcl9jbXAoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgY29tcGlsYXRpb24gb3B0aW9uIEFTTjFfSVRFTV9GVU5DVElPTlMuIFRoaXMgY2F1c2VzIHRoZSBuZXcKICAgICBBU04xIG1vZHVsZXMgdG8gZXhwb3J0IGZ1bmN0aW9ucyByZXR1cm5pbmcgQVNOMV9JVEVNIHBvaW50ZXJzCiAgICAgaW5zdGVhZCBvZiB0aGUgQVNOMV9JVEVNIHN0cnVjdHVyZXMgdGhlbXNlbHZlcy4gVGhpcyBhZGRzIHNldmVyYWwKICAgICBuZXcgbWFjcm9zIHdoaWNoIGFsbG93IHRoZSB1bmRlcmx5aW5nIEFTTjEgZnVuY3Rpb24vc3RydWN0dXJlIHRvCiAgICAgYmUgYWNjZXNzZWQgdHJhbnNwYXJlbnRseS4gQXMgYSByZXN1bHQgY29kZSBzaG91bGQgbm90IHVzZSBBU04xX0lURU0KICAgICByZWZlcmVuY2VzIGRpcmVjdGx5IChzdWNoIGFzICZYNTA5X2l0KSBidXQgaW5zdGVhZCB1c2UgdGhlIHJlbGV2YW50CiAgICAgbWFjcm9zIChzdWNoIGFzIEFTTjFfSVRFTV9ycHRyKFg1MDkpKS4gVGhpcyBvcHRpb24gaXMgdG8gYWxsb3cKICAgICB1c2Ugb2YgdGhlIG5ldyBBU04xIGNvZGUgb24gcGxhdGZvcm1zIHdoZXJlIGV4cG9ydGluZyBzdHJ1Y3R1cmVzCiAgICAgaXMgcHJvYmxlbWF0aWNhbCAoZm9yIGV4YW1wbGUgaW4gc2hhcmVkIGxpYnJhcmllcykgYnV0IGV4cG9ydGluZwogICAgIGZ1bmN0aW9ucyByZXR1cm5pbmcgcG9pbnRlcnMgdG8gc3RydWN0dXJlcyBpcyBub3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIG92ZXJyaWRpbmcgdGhlIGdlbmVyYXRpb24gb2YgU1NML1RMUyBzZXNzaW9uIElEcy4KICAgICBUaGVzZSBjYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQgZWl0aGVyIGluIGFuIFNTTF9DVFggb3IgcGVyIFNTTC4KICAgICBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBjb250cm9sLCBpZiB0aGV5IHdpc2gsCiAgICAgdGhlIGFyYml0cmFyeSB2YWx1ZXMgY2hvc2VuIGZvciB1c2UgYXMgc2Vzc2lvbiBJRHMsIHBhcnRpY3VsYXJseSBhcyBpdAogICAgIGNhbiBiZSB1c2VmdWwgZm9yIHNlc3Npb24gY2FjaGluZyBpbiBtdWx0aXBsZS1zZXJ2ZXIgZW52aXJvbm1lbnRzLiBBCiAgICAgY29tbWFuZC1saW5lIHN3aXRjaCBmb3IgdGVzdGluZyB0aGlzIChhbmQgYW55IGNsaWVudCBjb2RlIHRoYXQgd2lzaGVzCiAgICAgdG8gdXNlIHN1Y2ggYSBmZWF0dXJlKSBoYXMgYmVlbiBhZGRlZCB0byAic19zZXJ2ZXIiLgogICAgIFtHZW9mZiBUaG9ycGUsIEx1dHogSmFlbmlja2VdCgogICopIE1vZGlmeSBta2RlZi5wbCB0byByZWNvZ25pc2UgYW5kIHBhcnNlIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMKICAgICBvZiB0aGUgZm9ybSAnI2lmIGRlZmluZWQoLi4uKSB8fCBkZWZpbmVkKC4uLikgfHwgLi4uJyBhbmQKICAgICAnI2lmICFkZWZpbmVkKC4uLikgJiYgIWRlZmluZWQoLi4uKSAmJiAuLi4nLiAgVGhpcyBhbHNvIGF2b2lkcwogICAgIHRoZSBncm93aW5nIG51bWJlciBvZiBzcGVjaWFsIGNhc2VzIGl0IHdhcyBwcmV2aW91c2x5IGhhbmRsaW5nLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgYWxsIGNvbmZpZ3VyYXRpb24gbWFjcm9zIGF2YWlsYWJsZSBmb3IgYXBwbGljYXRpb24gYnkgbWFraW5nCiAgICAgc3VyZSB0aGV5IGFyZSBhdmFpbGFibGUgaW4gb3BlbnNzbGNvbmYuaCwgYnkgZ2l2aW5nIHRoZW0gbmFtZXMgc3RhcnRpbmcKICAgICB3aXRoICJPUEVOU1NMXyIgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb3RoZXIgcGFja2FnZXMgYW5kIGJ5IG1ha2luZwogICAgIHN1cmUgZV9vczIuaCB3aWxsIGNvdmVyIGFsbCBwbGF0Zm9ybS1zcGVjaWZpYyBjYXNlcyB0b2dldGhlciB3aXRoCiAgICAgb3BlbnNzbGNvbmYuaC4KICAgICBBZGRpdGlvbmFsbHksIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBkZWZpbmUgY29uZmlndXJhdGlvbi9wbGF0Zm9ybS0KICAgICBzcGVjaWZpYyBuYW1lcyAoY2FsbGVkICJzeXN0ZW0gaWRlbnRpdGllcyIpLiAgSW4gdGhlIEMgY29kZSwgdGhlc2UKICAgICBhcmUgcHJlZml4ZWQgd2l0aCAiT1BFTlNTTF9TWVNOQU1FXyIuICBlX29zMi5oIHdpbGwgY3JlYXRlIGFub3RoZXIKICAgICBtYWNybyB3aXRoIHRoZSBuYW1lIGJlZ2lubmluZyB3aXRoICJPUEVOU1NMX1NZU18iLCB3aGljaCBpcyBkZXRlcm1pbmVkCiAgICAgZnJvbSAiT1BFTlNTTF9TWVNOQU1FXyoiIG9yIGNvbXBpbGVyLXNwZWNpZmljIG1hY3JvcyBkZXBlbmRpbmcgb24KICAgICB3aGF0IGlzIGF2YWlsYWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgb3B0aW9uIC1zZXRfc2VyaWFsIHRvICdyZXEnIGFuZCAneDUwOScgdGhpcyBhbGxvd3MgdGhlIHNlcmlhbAogICAgIG51bWJlciB0byB1c2UgdG8gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuIFByZXZpb3VzbHkgc2VsZgogICAgIHNpZ25lZCBjZXJ0aWZpY2F0ZXMgd2VyZSBoYXJkIGNvZGVkIHdpdGggc2VyaWFsIG51bWJlciAwIGFuZCB0aGUgCiAgICAgQ0Egb3B0aW9ucyBvZiAneDUwOScgaGFkIHRvIHVzZSBhIHNlcmlhbCBudW1iZXIgaW4gYSBmaWxlIHdoaWNoIHdhcwogICAgIGF1dG8gaW5jcmVtZW50ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbnMgdG8gJ2NhJyB1dGlsaXR5IHRvIHN1cHBvcnQgVjIgQ1JMIGVudHJ5IGV4dGVuc2lvbnMuCiAgICAgQ3VycmVudGx5IENSTCByZWFzb24sIGludmFsaWRpdHkgZGF0ZSBhbmQgaG9sZCBpbnN0cnVjdGlvbiBhcmUKICAgICBzdXBwb3J0ZWQuIEFkZCBuZXcgQ1JMIGV4dGVuc2lvbnMgdG8gVjMgY29kZSBhbmQgc29tZSBuZXcgb2JqZWN0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gRVZQX0NJUEhFUl9DVFhfc2V0X3BhZGRpbmcoKSB0aGlzIGlzIHVzZWQgdG8KICAgICBkaXNhYmxlIHN0YW5kYXJkIGJsb2NrIHBhZGRpbmcgKGFrYSBQS0NTIzUgcGFkZGluZykgaW4gdGhlIEVWUAogICAgIEFQSSwgd2hpY2ggd2FzIHByZXZpb3VzbHkgbWFuZGF0b3J5LiBUaGlzIG1lYW5zIHRoYXQgdGhlIGRhdGEgaXMKICAgICBub3QgcGFkZGVkIGluIGFueSB3YXkgYW5kIHNvIHRoZSB0b3RhbCBsZW5ndGggbXVjaCBiZSBhIG11bHRpcGxlCiAgICAgb2YgdGhlIGJsb2NrIHNpemUsIG90aGVyd2lzZSBhbiBlcnJvciBvY2N1cnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCAoaW5jb21wbGV0ZSkgT0NTUCBTU0wgc3VwcG9ydC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gT0NTUF9wYXJzZV91cmwoKS4gVGhpcyBzcGxpdHMgdXAgYSBVUkwgaW50byBpdHMgaG9zdCwKICAgICBwb3J0IGFuZCBwYXRoIGNvbXBvbmVudHM6IHByaW1hcmlseSB0byBwYXJzZSBPQ1NQIFVSTHMuIE5ldyAtdXJsCiAgICAgb3B0aW9uIHRvIG9jc3AgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgbm9uY2UgYmVoYXZpb3IuIFRoZSByZXR1cm4gdmFsdWUgb2YgT0NTUF9jaGVja19ub25jZSgpIG5vdyAKICAgICByZWZsZWN0cyB0aGUgdmFyaW91cyBjaGVja3MgcGVyZm9ybWVkLiBBcHBsaWNhdGlvbnMgY2FuIGRlY2lkZQogICAgIHdoZXRoZXIgdG8gdG9sZXJhdGUgY2VydGFpbiBzaXR1YXRpb25zIHN1Y2ggYXMgYW4gYWJzZW50IG5vbmNlCiAgICAgaW4gYSByZXNwb25zZSB3aGVuIG9uZSB3YXMgcHJlc2VudCBpbiBhIHJlcXVlc3Q6IHRoZSBvY3NwIGFwcGxpY2F0aW9uCiAgICAganVzdCBwcmludHMgb3V0IGEgd2FybmluZy4gTmV3IGZ1bmN0aW9uIE9DU1BfYWRkMV9iYXNpY19ub25jZSgpCiAgICAgdGhpcyBpcyB0byBhbGxvdyByZXNwb25kZXJzIHRvIGluY2x1ZGUgYSBub25jZSBpbiBhIHJlc3BvbnNlIGV2ZW4gaWYKICAgICB0aGUgcmVxdWVzdCBpcyBub25jZS1sZXNzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERpc2FibGUgc3RkaW4gYnVmZmVyaW5nIGluIGxvYWRfY2VydCAoYXBwcy9hcHBzLmMpIHNvIHRoYXQgbm8gY2VydHMgYXJlCiAgICAgc2tpcHBlZCB3aGVuIHVzaW5nIG9wZW5zc2wgeDUwOSBtdWx0aXBsZSB0aW1lcyBvbiBhIHNpbmdsZSBpbnB1dCBmaWxlLAogICAgIGUuZy4gIihvcGVuc3NsIHg1MDkgLW91dCBjZXJ0MTsgb3BlbnNzbCB4NTA5IC1vdXQgY2VydDIpIDxjZXJ0cyIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTWFrZSBBU04xX1VUQ1RJTUVfc2V0X3N0cmluZygpIGFuZCBBU04xX0dFTkVSQUxJWkVEVElNRV9zZXRfc3RyaW5nKCkKICAgICBzZXQgc3RyaW5nIHR5cGU6IHRvIGhhbmRsZSBzZXR0aW5nIEFTTjFfVElNRSBzdHJ1Y3R1cmVzLiBGaXggY2EKICAgICB1dGlsaXR5IHRvIGNvcnJlY3RseSBpbml0aWFsaXplIHJldm9jYXRpb24gZGF0ZSBvZiBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb24gU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRSBhbGxvd3MgdGhlIHNlcnZlciB0byBvdmVycmlkZQogICAgIHRoZSBjbGllbnRzIHByZWZlcnJlZCBjaXBoZXJzdWl0ZXMgYW5kIHJhdGhlciB1c2UgaXRzIG93biBwcmVmZXJlbmNlcy4KICAgICBTaG91bGQgaGVscCB0byB3b3JrIGFyb3VuZCBNJCBTR0MgKFNlcnZlciBHYXRlZCBDcnlwdG9ncmFwaHkpIGJ1ZyBpbgogICAgIEludGVybmV0IEV4cGxvcmVyIGJ5IGVuc3VyaW5nIHVuY2hhbmdlZCBoYXNoIG1ldGhvZCBkdXJpbmcgc3RlcHVwLgogICAgIChBbHNvIHJlcGxhY2VzIHRoZSBicm9rZW4vZGVhY3RpdmF0ZWQgU1NMX09QX05PTl9FWFBPUlRfRklSU1Qgb3B0aW9uLikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgTWFrZSBta2RlZi5wbCByZWNvZ25pc2UgYWxsIERFQ0xBUkVfQVNOMSBtYWNyb3MsIGNoYW5nZSByaWpuZGFlbAogICAgIHRvIGFlcyBhbmQgYWRkIGEgbmV3ICdleGlzdCcgb3B0aW9uIHRvIHByaW50IG91dCBzeW1ib2xzIHRoYXQgZG9uJ3QKICAgICBhcHBlYXIgdG8gZXhpc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkaXRpb25hbCBvcHRpb25zIHRvIG9jc3AgdXRpbGl0eSB0byBhbGxvdyBmbGFncyB0byBiZSBzZXQgYW5kCiAgICAgYWRkaXRpb25hbCBjZXJ0aWZpY2F0ZXMgc3VwcGxpZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBvcHRpb24gLVZBZmlsZSB0byAnb3BlbnNzbCBvY3NwJywgc28gdGhlIHVzZXIgY2FuIGdpdmUgdGhlCiAgICAgT0NTUCBjbGllbnQgYSBudW1iZXIgb2YgY2VydGlmaWNhdGUgdG8gb25seSB2ZXJpZnkgdGhlIHJlc3BvbnNlCiAgICAgc2lnbmF0dXJlIGFnYWluc3QuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVXBkYXRlIFJpam5kYWVsIGNvZGUgdG8gdmVyc2lvbiAzLjAgYW5kIGNoYW5nZSBFVlAgQUVTIGNpcGhlcnMgdG8KICAgICBoYW5kbGUgdGhlIG5ldyBBUEkuIEN1cnJlbnRseSBvbmx5IEVDQiwgQ0JDIG1vZGVzIHN1cHBvcnRlZC4gQWRkIG5ldwogICAgIEFFUyBPSURzLgoKICAgICBBZGQgVExTIEFFUyBjaXBoZXJzdWl0ZXMgYXMgZGVzY3JpYmVkIGluIFJGQzMyNjgsICJBZHZhbmNlZAogICAgIEVuY3J5cHRpb24gU3RhbmRhcmQgKEFFUykgQ2lwaGVyc3VpdGVzIGZvciBUcmFuc3BvcnQgTGF5ZXIKICAgICBTZWN1cml0eSAoVExTKSIuICAoSW4gYmV0YSB2ZXJzaW9ucyBvZiBPcGVuU1NMIDAuOS43LCB0aGVzZSB3ZXJlCiAgICAgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgd2VyZSBub3QgcGFydCBvZiB0aGUgIkFMTCIgY2lwaGVyc3VpdGUKICAgICBhbGlhcyBiZWNhdXNlIHRoZXkgd2VyZSBub3QgeWV0IG9mZmljaWFsOyB0aGV5IGNvdWxkIGJlCiAgICAgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgc3BlY2lmeWluZyB0aGUgIkFFU2RyYWZ0IiBjaXBoZXJzdWl0ZQogICAgIGdyb3VwIGFsaWFzLiAgSW4gdGhlIGZpbmFsIHJlbGVhc2Ugb2YgT3BlblNTTCAwLjkuNywgdGhlIGdyb3VwCiAgICAgYWxpYXMgaXMgY2FsbGVkICJBRVMiIGFuZCBpcyBwYXJ0IG9mICJBTEwiLikKICAgICBbQmVuIExhdXJpZSwgU3RldmUgIEhlbnNvbiwgQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gT0NTUF9jb3B5X25vbmNlKCkgdG8gY29weSBub25jZSB2YWx1ZSAoaWYgcHJlc2VudCkgZnJvbQogICAgIHJlcXVlc3QgdG8gcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRnVuY3Rpb25zIGZvciBPQ1NQIHJlc3BvbmRlcnMuIE9DU1BfcmVxdWVzdF9vbmVyZXFfY291bnQoKSwKICAgICBPQ1NQX3JlcXVlc3Rfb25lcmVxX2dldDAoKSwgT0NTUF9vbmVyZXFfZ2V0MF9pZCgpIGFuZCBPQ1NQX2lkX2dldDBfaW5mbygpCiAgICAgZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGEgY2VydGlmaWNhdGUgcmVxdWVzdC4gT0NTUF9yZXNwb25zZV9jcmVhdGUoKQogICAgIGNyZWF0ZXMgYSByZXNwb25zZSBhbmQgb3B0aW9uYWxseSBhZGRzIGEgYmFzaWMgcmVzcG9uc2Ugc3RydWN0dXJlLgogICAgIE9DU1BfYmFzaWNfYWRkMV9zdGF0dXMoKSBhZGRzIGEgY29tcGxldGUgc2luZ2xlIHJlc3BvbnNlIHRvIGEgYmFzaWMKICAgICByZXNwb25zZSBhbmQgcmV0dXJucyB0aGUgT0NTUF9TSU5HTEVSRVNQIHN0cnVjdHVyZSBqdXN0IGFkZGVkICh0byBhbGxvdwogICAgIGV4dGVuc2lvbnMgdG8gYmUgaW5jbHVkZWQgZm9yIGV4YW1wbGUpLiBPQ1NQX2Jhc2ljX2FkZDFfY2VydCgpIGFkZHMgYQogICAgIGNlcnRpZmljYXRlIHRvIGEgYmFzaWMgcmVzcG9uc2UgYW5kIE9DU1BfYmFzaWNfc2lnbigpIHNpZ25zIGEgYmFzaWMKICAgICByZXNwb25zZSB3aXRoIHZhcmlvdXMgZmxhZ3MuIE5ldyBoZWxwZXIgZnVuY3Rpb25zIEFTTjFfVElNRV9jaGVjaygpCiAgICAgKGNoZWNrcyB2YWxpZGl0eSBvZiBBU04xX1RJTUUgc3RydWN0dXJlKSBhbmQgQVNOMV9USU1FX3RvX2dlbmVyYWxpemVkdGltZSgpCiAgICAgKGNvbnZlcnRzIEFTTjFfVElNRSB0byBHZW5lcmFsaXplZFRpbWUpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgbmV3IGZ1bmN0aW9ucy4gRVZQX0RpZ2VzdCgpIGNvbWJpbmVzIEVWUF9EaWdlc3R7SW5pdCxVcGRhdGUsRmluYWx9KCkKICAgICBpbiBhIHNpbmdsZSBvcGVyYXRpb24uIFg1MDlfZ2V0MF9wdWJrZXlfYml0c3RyKCkgZXh0cmFjdHMgdGhlIHB1YmxpY19rZXkKICAgICBzdHJ1Y3R1cmUgZnJvbSBhIGNlcnRpZmljYXRlLiBYNTA5X3B1YmtleV9kaWdlc3QoKSBkaWdlc3RzIHRoZSBwdWJsaWNfa2V5CiAgICAgY29udGVudHM6IHRoaXMgaXMgdXNlZCBpbiB2YXJpb3VzIGtleSBpZGVudGlmaWVycy4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBza19zb3J0KCkgdG9sZXJhdGUgYSBOVUxMIGFyZ3VtZW50LgogICAgIFtTdGV2ZSBIZW5zb24gcmVwb3J0ZWQgYnkgTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD5dCgogICopIE5ldyBPQ1NQIHZlcmlmeSBmbGFnIE9DU1BfVFJVU1RPVEhFUi4gV2hlbiBzZXQgdGhlICJvdGhlciIgY2VydGlmaWNhdGVzCiAgICAgcGFzc2VkIGJ5IHRoZSBmdW5jdGlvbiBhcmUgdHJ1c3RlZCBpbXBsaWNpdGx5LiBJZiBhbnkgb2YgdGhlbSBzaWduZWQgdGhlCiAgICAgcmVzcG9uc2UgdGhlbiBpdCBpcyBhc3N1bWVkIHRvIGJlIHZhbGlkIGFuZCBpcyBub3QgdmVyaWZpZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gUEtDUzdfc2V0X3R5cGUoKSBpbml0aWFsaXNlIGNvbnRlbnRfdHlwZSBpbiBQS0NTN19FTkNfQ09OVEVOVAogICAgIHRvIGRhdGEuIFRoaXMgd2FzIHByZXZpb3VzbHkgcGFydCBvZiB0aGUgUEtDUzcgQVNOMSBjb2RlLiBUaGlzCiAgICAgd2FzIGNhdXNpbmcgcHJvYmxlbXMgd2l0aCBPcGVuU1NMIGNyZWF0ZWQgUEtDUyMxMiBhbmQgUEtDUyM3IHN0cnVjdHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgS2VubmV0aCBSLiBSb2JpbmV0dGUKCQkJCTxzdXBwb3J0QHNlY3VyZW5ldHRlcm0uY29tPl0KCiAgKikgQWRkIENSWVBUT19wdXNoX2luZm8oKSBhbmQgQ1JZUFRPX3BvcF9pbmZvKCkgY2FsbHMgdG8gbmV3IEFTTjEKICAgICByb3V0aW5lczogd2l0aG91dCB0aGVzZSB0cmFjaW5nIG1lbW9yeSBsZWFrcyBpcyB2ZXJ5IHBhaW5mdWwuCiAgICAgRml4IGxlYWtzIGluIFBLQ1MxMiBhbmQgUEtDUzcgcm91dGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBYNTA5X3RpbWVfYWRqKCkgY29wZSB3aXRoIHRoZSBuZXcgYmVoYXZpb3VyIG9mIEFTTjFfVElNRV9uZXcoKS4KICAgICBQcmV2aW91c2x5IGl0IGluaXRpYWxpc2VkIHRoZSAndHlwZScgYXJndW1lbnQgdG8gVl9BU04xX1VUQ1RJTUUgd2hpY2gKICAgICBlZmZlY3RpdmVseSBtZWFudCBHZW5lcmFsaXplZFRpbWUgd291bGQgbmV2ZXIgYmUgdXNlZC4gTm93IGl0CiAgICAgaXMgaW5pdGlhbGlzZWQgdG8gLTEgYnV0IFg1MDlfdGltZV9hZGooKSBub3cgaGFzIHRvIGNoZWNrIHRoZSB2YWx1ZQogICAgIGFuZCB1c2UgQVNOMV9USU1FX3NldCgpIGlmIHRoZSB2YWx1ZSBpcyBub3QgVl9BU04xX1VUQ1RJTUUgb3IKICAgICBWX0FTTjFfR0VORVJBTElaRURUSU1FLCB3aXRob3V0IHRoaXMgaXQgYWx3YXlzIHVzZXMgR2VuZXJhbGl6ZWRUaW1lLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEtlbm5ldGggUi4gUm9iaW5ldHRlCgkJCQk8c3VwcG9ydEBzZWN1cmVuZXR0ZXJtLmNvbT5dCgogICopIEZpeGVzIHRvIEJOX3RvX0FTTjFfSU5URUdFUiB3aGVuIGJuIGlzIHplcm8uIFRoaXMgd291bGQgcHJldmlvdXNseQogICAgIHJlc3VsdCBpbiBhIHplcm8gbGVuZ3RoIGluIHRoZSBBU04xX0lOVEVHRVIgc3RydWN0dXJlIHdoaWNoIHdhcwogICAgIG5vdCBjb25zaXN0ZW50IHdpdGggdGhlIHN0cnVjdHVyZSB3aGVuIGQyaV9BU04xX0lOVEVHRVIoKSB3YXMgdXNlZAogICAgIGFuZCB3b3VsZCBjYXVzZSBBU04xX0lOVEVHRVJfY21wKCkgdG8gZmFpbC4gRW5oYW5jZSBzMmlfQVNOMV9JTlRFR0VSKCkKICAgICB0byBjb3BlIHdpdGggaGV4IGFuZCBuZWdhdGl2ZSBpbnRlZ2Vycy4gRml4IGJ1ZyBpbiBpMmFfQVNOMV9JTlRFR0VSKCkKICAgICB3aGVyZSBpdCBkaWQgbm90IHByaW50IG91dCBhIG1pbnVzIGZvciBuZWdhdGl2ZSBBU04xX0lOVEVHRVIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1bW1hcnkgcHJpbnRvdXQgdG8gb2NzcCB1dGlsaXR5LiBUaGUgdmFyaW91cyBmdW5jdGlvbnMgd2hpY2gKICAgICBjb252ZXJ0IHN0YXR1cyB2YWx1ZXMgdG8gc3RyaW5ncyBoYXZlIGJlZW4gcmVuYW1lZCB0bzoKICAgICBPQ1NQX3Jlc3BvbnNlX3N0YXR1c19zdHIoKSwgT0NTUF9jZXJ0X3N0YXR1c19zdHIoKSBhbmQKICAgICBPQ1NQX2NybF9yZWFzb25fc3RyKCkgYW5kIGFyZSBubyBsb25nZXIgc3RhdGljLiBOZXcgb3B0aW9ucwogICAgIHRvIHZlcmlmeSBub25jZSB2YWx1ZXMgYW5kIHRvIGRpc2FibGUgdmVyaWZpY2F0aW9uLiBPQ1NQIHJlc3BvbnNlCiAgICAgcHJpbnRvdXQgZm9ybWF0IGNsZWFuZWQgdXAuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGFkZGl0aW9uYWwgT0NTUCBjZXJ0aWZpY2F0ZSBjaGVja3MuIFRoZXNlIGFyZSB0aG9zZSBzcGVjaWZpZWQKICAgICBpbiBSRkMyNTYwLiBUaGlzIGNvbnNpc3RzIG9mIHR3byBzZXBhcmF0ZSBjaGVja3M6IHRoZSBDQSBvZiB0aGUKICAgICBjZXJ0aWZpY2F0ZSBiZWluZyBjaGVja2VkIG11c3QgZWl0aGVyIGJlIHRoZSBPQ1NQIHNpZ25lciBjZXJ0aWZpY2F0ZQogICAgIG9yIHRoZSBpc3N1ZXIgb2YgdGhlIE9DU1Agc2lnbmVyIGNlcnRpZmljYXRlLiBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlCiAgICAgT0NTUCBzaWduZXIgY2VydGlmaWNhdGUgbXVzdCBjb250YWluIHRoZSBPQ1NQIHNpZ25pbmcgZXh0ZW5kZWQga2V5CiAgICAgdXNhZ2UuIFRoaXMgY2hlY2sgaXMgcGVyZm9ybWVkIGJ5IGF0dGVtcHRpbmcgdG8gbWF0Y2ggdGhlIE9DU1AKICAgICBzaWduZXIgb3IgdGhlIE9DU1Agc2lnbmVyIENBIHRvIHRoZSBpc3N1ZXJOYW1lSGFzaCBhbmQgaXNzdWVyS2V5SGFzaAogICAgIGluIHRoZSBPQ1NQX0NFUlRJRCBzdHJ1Y3R1cmVzIG9mIHRoZSByZXNwb25zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIE9DU1AgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGFkZGVkIHRvIE9DU1BfYmFzaWNfdmVyaWZ5KCkKICAgICBhbmQgcmVsYXRlZCByb3V0aW5lcy4gVGhpcyB1c2VzIHRoZSBzdGFuZGFyZCBPcGVuU1NMIGNlcnRpZmljYXRlCiAgICAgdmVyaWZ5IHJvdXRpbmVzIHRvIHBlcmZvcm0gaW5pdGlhbCBjaGVja3MgKGp1c3QgQ0EgdmFsaWRpdHkpIGFuZAogICAgIHRvIG9idGFpbiB0aGUgY2VydGlmaWNhdGUgY2hhaW4uIFRoZW4gYWRkaXRpb25hbCBjaGVja3Mgd2lsbCBiZQogICAgIHBlcmZvcm1lZCBvbiB0aGUgY2hhaW4uIEN1cnJlbnRseSB0aGUgcm9vdCBDQSBpcyBjaGVja2VkIHRvIHNlZQogICAgIGlmIGl0IGlzIGV4cGxpY2l0bHkgdHJ1c3RlZCBmb3IgT0NTUCBzaWduaW5nLiBUaGlzIGlzIHVzZWQgdG8gc2V0CiAgICAgYSByb290IENBIGFzIGEgZ2xvYmFsIHNpZ25pbmcgcm9vdDogdGhhdCBpcyBhbnkgY2VydGlmaWNhdGUgdGhhdAogICAgIGNoYWlucyB0byB0aGF0IENBIGlzIGFuIGFjY2VwdGFibGUgT0NTUCBzaWduaW5nIGNlcnRpZmljYXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAnLWV4dGZpbGUgLi4uJyBvcHRpb24gdG8gJ29wZW5zc2wgY2EnIGZvciByZWFkaW5nIFguNTA5djMKICAgICBleHRlbnNpb25zIGZyb20gYSBzZXBhcmF0ZSBjb25maWd1cmF0aW9uIGZpbGUuCiAgICAgQXMgd2hlbiByZWFkaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgbWFpbiBjb25maWd1cmF0aW9uIGZpbGUsCiAgICAgdGhlICctZXh0ZW5zaW9ucyAuLi4nIG9wdGlvbiBtYXkgYmUgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGUKICAgICBzZWN0aW9uIHRvIHVzZS4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD5dCgogICopIE5ldyBPQ1NQIHV0aWxpdHkuIEFsbG93cyBPQ1NQIHJlcXVlc3RzIHRvIGJlIGdlbmVyYXRlZCBvcgogICAgIHJlYWQuIFRoZSByZXF1ZXN0IGNhbiBiZSBzZW50IHRvIGEgcmVzcG9uZGVyIGFuZCB0aGUgb3V0cHV0CiAgICAgcGFyc2VkLCBvdXRwdXRlZCBvciBwcmludGVkIGluIHRleHQgZm9ybS4gTm90IGNvbXBsZXRlIHlldDoKICAgICBzdGlsbCBuZWVkcyB0byBjaGVjayB0aGUgT0NTUCByZXNwb25zZSB2YWxpZGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgc3ViY29tbWFuZHMgZm9yICdvcGVuc3NsIGNhJzoKICAgICAnb3BlbnNzbCBjYSAtc3RhdHVzIDxzZXJpYWw+JyBwcmludHMgdGhlIHN0YXR1cyBvZiB0aGUgY2VydCB3aXRoCiAgICAgdGhlIGdpdmVuIHNlcmlhbCBudW1iZXIgKGFjY29yZGluZyB0byB0aGUgaW5kZXggZmlsZSkuCiAgICAgJ29wZW5zc2wgY2EgLXVwZGF0ZWRiJyB1cGRhdGVzIHRoZSBleHBpcnkgc3RhdHVzIG9mIGNlcnRpZmljYXRlcwogICAgIGluIHRoZSBpbmRleCBmaWxlLgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBjb211bmUubW9kZW5hLml0Pl0KCiAgKikgTmV3ICctbmV3cmVxLW5vZGVzJyBjb21tYW5kIG9wdGlvbiB0byBDQS5wbC4gIFRoaXMgaXMgbGlrZQogICAgICctbmV3cmVxJywgYnV0IGNhbGxzICdvcGVuc3NsIHJlcScgd2l0aCB0aGUgJy1ub2Rlcycgb3B0aW9uCiAgICAgc28gdGhhdCB0aGUgcmVzdWx0aW5nIGtleSBpcyBub3QgZW5jcnlwdGVkLgogICAgIFtEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+XQoKICAqKSBOZXcgY29uZmlndXJhdGlvbiBmb3IgdGhlIEdOVSBIdXJkLgogICAgIFtKb25hdGhhbiBCYXJ0bGV0dCA8am9obm55YkB3b2xmcmFtLmNvbT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW5pdGlhbCBjb2RlIHRvIGltcGxlbWVudCBPQ1NQIGJhc2ljIHJlc3BvbnNlIHZlcmlmeS4gVGhpcwogICAgIGlzIGN1cnJlbnRseSBpbmNvbXBsZXRlLiBDdXJyZW50bHkganVzdCBmaW5kcyB0aGUgc2lnbmVyJ3MKICAgICBjZXJ0aWZpY2F0ZSBhbmQgdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBvbiB0aGUgcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IFNTTGVheV92ZXJzaW9uIGNvZGUgU1NMRUFZX0RJUiB0byBkZXRlcm1pbmUgdGhlIGNvbXBpbGVkLWluCiAgICAgdmFsdWUgb2YgT1BFTlNTTERJUi4gIFRoaXMgaXMgYXZhaWxhYmxlIHZpYSB0aGUgbmV3ICctZCcgb3B0aW9uCiAgICAgdG8gJ29wZW5zc2wgdmVyc2lvbicsIGFuZCBpcyBhbHNvIGluY2x1ZGVkIGluICdvcGVuc3NsIHZlcnNpb24gLWEnLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFsbG93aW5nIGRlZmluaW5nIG1lbW9yeSBhbGxvY2F0aW9uIGNhbGxiYWNrcyB0aGF0IHdpbGwgYmUgZ2l2ZW4KICAgICBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uYWwgYXJndW1lbnRzCiAgICAgKGEgY29uc3QgY2hhciogYW5kIGFuIGludCkuICBUaGUgYmFzaWMgZnVuY3Rpb25hbGl0eSByZW1haW5zLCBhcwogICAgIHdlbGwgYXMgdGhlIG9yaWdpbmFsIHBvc3NpYmlsaXR5IHRvIGp1c3QgcmVwbGFjZSBtYWxsb2MoKSwKICAgICByZWFsbG9jKCkgYW5kIGZyZWUoKSBieSBmdW5jdGlvbnMgdGhhdCBkbyBub3Qga25vdyBhYm91dCB0aGVzZQogICAgIGFkZGl0aW9uYWwgYXJndW1lbnRzLiAgVG8gcmVnaXN0ZXIgYW5kIGZpbmQgb3V0IHRoZSBjdXJyZW50CiAgICAgc2V0dGluZ3MgZm9yIGV4dGVuZGVkIGFsbG9jYXRpb24gZnVuY3Rpb25zLCB0aGUgZm9sbG93aW5nCiAgICAgZnVuY3Rpb25zIGFyZSBwcm92aWRlZDoKCglDUllQVE9fc2V0X21lbV9leF9mdW5jdGlvbnMKCUNSWVBUT19zZXRfbG9ja2VkX21lbV9leF9mdW5jdGlvbnMKCUNSWVBUT19nZXRfbWVtX2V4X2Z1bmN0aW9ucwoJQ1JZUFRPX2dldF9sb2NrZWRfbWVtX2V4X2Z1bmN0aW9ucwoKICAgICBUaGVzZSB3b3JrIHRoZSBzYW1lIHdheSBhcyBDUllQVE9fc2V0X21lbV9mdW5jdGlvbnMgYW5kIGZyaWVuZHMuCiAgICAgQ1JZUFRPX2dldF9bbG9ja2VkX11tZW1fZnVuY3Rpb25zIG5vdyB3cml0ZXMgMCB3aGVyZSBzdWNoIGFuCiAgICAgZXh0ZW5kZWQgYWxsb2NhdGlvbiBmdW5jdGlvbiBpcyBlbmFibGVkLgogICAgIFNpbWlsYXJseSwgQ1JZUFRPX2dldF9bbG9ja2VkX11tZW1fZXhfZnVuY3Rpb25zIHdyaXRlcyAwIHdoZXJlCiAgICAgYSBjb252ZW50aW9uYWwgYWxsb2NhdGlvbiBmdW5jdGlvbiBpcyBlbmFibGVkLgogICAgIFtSaWNoYXJkIExldml0dGUsIEJvZG8gTW9lbGxlcl0KCiAgKikgRmluaXNoIG9mZiByZW1vdmluZyB0aGUgcmVtYWluaW5nIExIQVNIIGZ1bmN0aW9uIHBvaW50ZXIgY2FzdHMuCiAgICAgVGhlcmUgc2hvdWxkIG5vIGxvbmdlciBiZSBhbnkgcHJvdG90eXBlLWNhc3RpbmcgcmVxdWlyZWQgd2hlbiB1c2luZwogICAgIHRoZSBMSEFTSCBhYnN0cmFjdGlvbiwgYW5kIGFueSBjYXN0cyB0aGF0IHJlbWFpbiBhcmUgImJ1Z3MiLiBTZWUKICAgICB0aGUgY2FsbGJhY2sgdHlwZXMgYW5kIG1hY3JvcyBhdCB0aGUgaGVhZCBvZiBsaGFzaC5oIGZvciBkZXRhaWxzCiAgICAgKGFuZCAiT0JKX2NsZWFudXAiIGluIGNyeXB0by9vYmplY3RzL29ial9kYXQuYyBhcyBhbiBleGFtcGxlKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYXV0b21hdGljIHF1ZXJ5IG9mIEVHRCBzb2NrZXRzIGluIFJBTkRfcG9sbCgpIGZvciB0aGUgdW5peCB2YXJpYW50LgogICAgIElmIC9kZXYvW3VdcmFuZG9tIGRldmljZXMgYXJlIG5vdCBhdmFpbGFibGUgb3IgZG8gbm90IHJldHVybiBlbm91Z2gKICAgICBlbnRyb3B5LCBFR0Qgc3R5bGUgc29ja2V0cyAoc2VydmVkIGJ5IEVHRCBvciBQUk5HRCkgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgYmUgcXVlcmllZC4KICAgICBUaGUgbG9jYXRpb25zIC92YXIvcnVuL2VnZC1wb29sLCAvZGV2L2VnZC1wb29sLCAvZXRjL2VnZC1wb29sLCBhbmQKICAgICAvZXRjL2VudHJvcHkgd2lsbCBiZSBxdWVyaWVkIG9uY2UgZWFjaCBpbiB0aGlzIHNlcXVlbmNlLCBxdWVyaW5nIHN0b3BzCiAgICAgd2hlbiBlbm91Z2ggZW50cm9weSB3YXMgY29sbGVjdGVkIHdpdGhvdXQgcXVlcnlpbmcgbW9yZSBzb2NrZXRzLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBDaGFuZ2UgdGhlIFVuaXggUkFORF9wb2xsKCkgdmFyaWFudCB0byBiZSBhYmxlIHRvIHBvbGwgc2V2ZXJhbAogICAgIHJhbmRvbSBkZXZpY2VzLCBhcyBzcGVjaWZpZWQgYnkgREVWUkFORE9NLCB1bnRpbCBhIHN1ZmZpY2llbnQgYW1vdW50CiAgICAgb2YgZGF0YSBoYXMgYmVlbiBjb2xsZWN0ZWQuICAgV2Ugc3BlbmQgYXQgbW9zdCAxMCBtcyBvbiBlYWNoIGZpbGUKICAgICAoc2VsZWN0IHRpbWVvdXQpIGFuZCByZWFkIGluIG5vbi1ibG9ja2luZyBtb2RlLiAgREVWUkFORE9NIG5vdwogICAgIGRlZmF1bHRzIHRvIHRoZSBsaXN0ICIvZGV2L3VyYW5kb20iLCAiL2Rldi9yYW5kb20iLCAiL2Rldi9zcmFuZG9tIgogICAgIChwcmV2aW91c2x5IGl0IHdhcyBqdXN0IHRoZSBzdHJpbmcgIi9kZXYvdXJhbmRvbSIpLCBzbyBvbiB0eXBpY2FsCiAgICAgcGxhdGZvcm1zIHRoZSAxMCBtcyBkZWxheSB3aWxsIG5ldmVyIG9jY3VyLgogICAgIEFsc28gc2VwYXJhdGUgb3V0IHRoZSBVbml4IHZhcmlhbnQgdG8gaXRzIG93biBmaWxlLCByYW5kX3VuaXguYy4KICAgICBGb3IgVk1TLCB0aGVyZSdzIGEgY3VycmVudGx5LWVtcHR5IHJhbmRfdm1zLmMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTW92ZSBPQ1NQIGNsaWVudCByZWxhdGVkIHJvdXRpbmVzIHRvIG9jc3BfY2wuYy4gVGhlc2UKICAgICBwcm92aWRlIHV0aWxpdHkgZnVuY3Rpb25zIHdoaWNoIGFuIGFwcGxpY2F0aW9uIG5lZWRpbmcKICAgICB0byBpc3N1ZSBhIHJlcXVlc3QgdG8gYW4gT0NTUCByZXNwb25kZXIgYW5kIGFuYWx5c2UgdGhlCiAgICAgcmVzcG9uc2Ugd2lsbCB0eXBpY2FsbHkgbmVlZDogYXMgb3Bwb3NlZCB0byB0aG9zZSB3aGljaCBhbgogICAgIE9DU1AgcmVzcG9uZGVyIGl0c2VsZiB3b3VsZCBuZWVkIHdoaWNoIHdpbGwgYmUgYWRkZWQgbGF0ZXIuCgogICAgIE9DU1BfcmVxdWVzdF9zaWduKCkgc2lnbnMgYW4gT0NTUCByZXF1ZXN0IHdpdGggYW4gQVBJIHNpbWlsYXIKICAgICB0byBQS0NTN19zaWduKCkuIE9DU1BfcmVzcG9uc2Vfc3RhdHVzKCkgcmV0dXJucyBzdGF0dXMgb2YgT0NTUAogICAgIHJlc3BvbnNlLiBPQ1NQX3Jlc3BvbnNlX2dldDFfYmFzaWMoKSBleHRyYWN0cyBiYXNpYyByZXNwb25zZQogICAgIGZyb20gcmVzcG9uc2UuIE9DU1BfcmVzcF9maW5kX3N0YXR1cygpOiBmaW5kcyBhbmQgZXh0cmFjdHMgc3RhdHVzCiAgICAgaW5mb3JtYXRpb24gZnJvbSBhbiBPQ1NQX0NFUlRJRCBzdHJ1Y3R1cmUgKHdoaWNoIHdpbGwgYmUgY3JlYXRlZAogICAgIHdoZW4gdGhlIHJlcXVlc3Qgc3RydWN0dXJlIGlzIGJ1aWx0KS4gVGhlc2UgYXJlIGJ1aWx0IGZyb20gbG93ZXIKICAgICBsZXZlbCBmdW5jdGlvbnMgd2hpY2ggd29yayBvbiBPQ1NQX1NJTkdMRVJFU1Agc3RydWN0dXJlcyBidXQKICAgICB3b250IG5vcm1hbGx5IGJlIHVzZWQgdW5sZXNzIHRoZSBhcHBsaWNhdGlvbiB3aXNoZXMgdG8gZXhhbWluZQogICAgIGV4dGVuc2lvbnMgaW4gdGhlIE9DU1AgcmVzcG9uc2UgZm9yIGV4YW1wbGUuCgogICAgIFJlcGxhY2Ugbm9uY2Ugcm91dGluZXMgd2l0aCBhIHBhaXIgb2YgZnVuY3Rpb25zLgogICAgIE9DU1BfcmVxdWVzdF9hZGQxX25vbmNlKCkgYWRkcyBhIG5vbmNlIHZhbHVlIGFuZCBvcHRpb25hbGx5CiAgICAgZ2VuZXJhdGVzIGEgcmFuZG9tIHZhbHVlLiBPQ1NQX2NoZWNrX25vbmNlKCkgY2hlY2tzIHRoZQogICAgIHZhbGlkaXR5IG9mIHRoZSBub25jZSBpbiBhbiBPQ1NQIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBmdW5jdGlvbiBPQ1NQX3JlcXVlc3RfYWRkKCkgdG8gT0NTUF9yZXF1ZXN0X2FkZDBfaWQoKS4KICAgICBUaGlzIGRvZXNuJ3QgY29weSB0aGUgc3VwcGxpZWQgT0NTUF9DRVJUSUQgYW5kIGF2b2lkcyB0aGUKICAgICBuZWVkIHRvIGZyZWUgdXAgdGhlIG5ld2x5IGNyZWF0ZWQgaWQuIENoYW5nZSByZXR1cm4gdHlwZQogICAgIHRvIE9DU1BfT05FUkVRIHRvIHJldHVybiB0aGUgaW50ZXJuYWwgT0NTUF9PTkVSRVEgc3RydWN0dXJlLgogICAgIFRoaXMgY2FuIHRoZW4gYmUgdXNlZCB0byBhZGQgZXh0ZW5zaW9ucyB0byB0aGUgcmVxdWVzdC4KICAgICBEZWxldGVkIE9DU1BfcmVxdWVzdF9uZXcoKSwgc2luY2UgbW9zdCBvZiBpdHMgZnVuY3Rpb25hbGl0eQogICAgIGlzIG5vdyBpbiBPQ1NQX1JFUVVFU1RfbmV3KCkgKGFuZCB0aGUgY2FzZSBpbnNlbnNpdGl2ZSBuYW1lCiAgICAgY2xhc2gpIGFwYXJ0IGZyb20gdGhlIGFiaWxpdHkgdG8gc2V0IHRoZSByZXF1ZXN0IG5hbWUgd2hpY2gKICAgICB3aWxsIGJlIGFkZGVkIGVsc2V3aGVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgT0NTUCBBUEkuIFJlbW92ZSBvYnNvbGV0ZSBleHRlbnNpb25zIGFyZ3VtZW50IGZyb20KICAgICB2YXJpb3VzIGZ1bmN0aW9ucy4gRXh0ZW5zaW9ucyBhcmUgbm93IGhhbmRsZWQgdXNpbmcgdGhlIG5ldwogICAgIE9DU1AgZXh0ZW5zaW9uIGNvZGUuIE5ldyBzaW1wbGUgT0NTUCBIVFRQIGZ1bmN0aW9uIHdoaWNoIAogICAgIGNhbiBiZSB1c2VkIHRvIHNlbmQgcmVxdWVzdHMgYW5kIHBhcnNlIHRoZSByZXNwb25zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlIFBLQ1MjNyAoUy9NSU1FKSBjb2RlIHRvIHdvcmsgd2l0aCBuZXcgQVNOMS4gVHdvIG5ldwogICAgIEFTTjFfSVRFTSBzdHJ1Y3R1cmVzIGhlbHAgd2l0aCBzaWduIGFuZCB2ZXJpZnkuIFBLQ1M3X0FUVFJfU0lHTgogICAgIHVzZXMgdGhlIHNwZWNpYWwgcmVvcmRlciB2ZXJzaW9uIG9mIFNFVCBPRiB0byBzb3J0IHRoZSBhdHRyaWJ1dGVzCiAgICAgYW5kIHJlb3JkZXIgdGhlbSB0byBtYXRjaCB0aGUgZW5jb2RlZCBvcmRlci4gVGhpcyByZXNvbHZlcyBhIGxvbmcKICAgICBzdGFuZGluZyBwcm9ibGVtOiBhIHZlcmlmeSBvbiBhIFBLQ1M3IHN0cnVjdHVyZSBqdXN0IGFmdGVyIHNpZ25pbmcKICAgICBpdCB1c2VkIHRvIGZhaWwgYmVjYXVzZSB0aGUgYXR0cmlidXRlIG9yZGVyIGRpZCBub3QgbWF0Y2ggdGhlCiAgICAgZW5jb2RlZCBvcmRlci4gUEtDUzdfQVRUUl9WRVJJRlkgZG9lcyBub3QgcmVvcmRlciB0aGUgYXR0cmlidXRlczoKICAgICBpdCB1c2VzIHRoZSByZWNlaXZlZCBvcmRlci4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gdG9sZXJhdGUgc29tZSBicm9rZW4KICAgICBzb2Z0d2FyZSB0aGF0IGRvZXMgbm90IG9yZGVyIFNFVCBPRi4gVGhpcyBpcyBoYW5kbGVkIGJ5IGVuY29kaW5nCiAgICAgYXMgYSBTRVFVRU5DRSBPRiBidXQgdXNpbmcgaW1wbGljaXQgdGFnZ2luZyAod2l0aCBVTklWRVJTQUwgY2xhc3MpCiAgICAgdG8gcHJvZHVjZSB0aGUgcmVxdWlyZWQgU0VUIE9GLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhhdmUgbWsxbWYucGwgZ2VuZXJhdGUgdGhlIG1hY3JvcyBPUEVOU1NMX0JVSUxEX1NITElCQ1JZUFRPIGFuZAogICAgIE9QRU5TU0xfQlVJTERfU0hMSUJTU0wgYW5kIHVzZSB0aGVtIGFwcHJvcHJpYXRlbHkgaW4gdGhlIGhlYWRlcgogICAgIGZpbGVzIHRvIGdldCBjb3JyZWN0IGRlY2xhcmF0aW9ucyBvZiB0aGUgQVNOLjEgaXRlbSB2YXJpYWJsZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmV3cml0ZSBvZiBQS0NTIzEyIGNvZGUgdG8gdXNlIG5ldyBBU04xIGZ1bmN0aW9uYWxpdHkuIFJlcGxhY2UgbWFueQogICAgIFBLQ1MjMTIgbWFjcm9zIHdpdGggcmVhbCBmdW5jdGlvbnMuIEZpeCB0d28gdW5yZWxhdGVkIEFTTjEgYnVnczoKICAgICBhc24xX2NoZWNrX3RsZW4oKSB3b3VsZCBzb21ldGltZXMgYXR0ZW1wdCB0byB1c2UgJ2N0eCcgd2hlbiBpdCB3YXMKICAgICBOVUxMIGFuZCBBU04xX1RZUEUgd2FzIG5vdCBkZXJlZmVyZW5jZWQgcHJvcGVybHkgaW4gYXNuMV9leF9jMmkoKS4KICAgICBOZXcgQVNOMSBtYWNybzogREVDTEFSRV9BU04xX0lURU0oKSB3aGljaCBqdXN0IGRlY2xhcmVzIHRoZSByZWxldmFudAogICAgIEFTTjFfSVRFTSBhbmQgbm8gd3JhcHBlciBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBvciBBU04xX2l0ZW1fZDJpX2ZwKCkgYW5kIEFTTjFfaXRlbV9kMmlfYmlvKCkuIFRoZXNlCiAgICAgcmVwbGFjZSB0aGUgb2xkIGZ1bmN0aW9uIHBvaW50ZXIgYmFzZWQgSS9PIHJvdXRpbmVzLiBDaGFuZ2UgbW9zdCBvZgogICAgIHRoZSAqX2QyaV9iaW8oKSBhbmQgKl9kMmlfZnAoKSBmdW5jdGlvbnMgdG8gdXNlIHRoZXNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgbWtkZWYucGwgdG8gYmUgbW9yZSBhY2NlcHRpbmcgYWJvdXQgc3BhY2luZyBpbiBDIHByZXByb2Nlc3NvcgogICAgIGxpbmVzLCByZWNvZ25pY2UgbW9yZSAiYWxnb3JpdGhtcyIgdGhhdCBjYW4gYmUgZGVzZWxlY3RlZCwgYW5kIG1ha2UKICAgICBpdCBjb21wbGFpbiBhYm91dCBhbGdvcml0aG0gZGVzZWxlY3Rpb24gdGhhdCBpc24ndCByZWNvZ25pc2VkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBBU04xIGZ1bmN0aW9ucyB0byBoYW5kbGUgZHVwLCBzaWduLCB2ZXJpZnksIGRpZ2VzdCwgcGFjayBhbmQKICAgICB1bnBhY2sgb3BlcmF0aW9ucyBpbiB0ZXJtcyBvZiBBU04xX0lURU0uIE1vZGlmeSBleGlzdGluZyB3cmFwcGVycwogICAgIHRvIHVzZSBuZXcgZnVuY3Rpb25zLiBBZGQgTk9fQVNOMV9PTEQgd2hpY2ggY2FuIGJlIHNldCB0byByZW1vdmUKICAgICBzb21lIG9sZCBzdHlsZSBBU04xIGZ1bmN0aW9uczogdGhpcyBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgb2xkCiAgICAgY29kZSB3aWxsIHN0aWxsIHdvcmsgd2hlbiB0aGVzZSBldmVudHVhbGx5IGdvIGF3YXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGV4dGVuc2lvbiBmdW5jdGlvbnMgZm9yIE9DU1Agc3RydWN0dXJlcywgdGhlc2UgZm9sbG93IHRoZQogICAgIHNhbWUgY29udmVudGlvbnMgYXMgY2VydGlmaWNhdGVzIGFuZCBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBYNTA5VjNfYWRkMV9pMmQoKS4gVGhpcyBhdXRvbWF0aWNhbGx5IGVuY29kZXMgYW5kCiAgICAgYWRkcyBhbiBleHRlbnNpb24uIEl0cyBiZWhhdmlvdXIgY2FuIGJlIGN1c3RvbWlzZWQgd2l0aCB2YXJpb3VzCiAgICAgZmxhZ3MgdG8gYXBwZW5kLCByZXBsYWNlIG9yIGRlbGV0ZS4gVmFyaW91cyB3cmFwcGVycyBhZGRlZCBmb3IKICAgICBjZXJ0aWZjYXRlcyBhbmQgQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdG8gYXZvaWQgY2FsbGluZyB0aGUgdW5kZXJseWluZyBBU04xIHByaW50IHJvdXRpbmUgd2hlbgogICAgIGFuIGV4dGVuc2lvbiBjYW5ub3QgYmUgcGFyc2VkLiBDb3JyZWN0IGEgdHlwbyBpbiB0aGUKICAgICBPQ1NQX1NFUlZJQ0VMT0MgZXh0ZW5zaW9uLiBUaWR5IHVwIHByaW50IE9DU1AgZm9ybWF0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgbWtkZWYucGwgcGFyc2Ugc29tZSBvZiB0aGUgQVNOMSBtYWNyb3MgYW5kIGFkZCBhcHByb3ByaWF0ZQogICAgIGVudHJpZXMgZm9yIHZhcmlhYmxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZnVuY3Rpb25hbGl0eSB0byBhcHBzL29wZW5zc2wuYyBmb3IgZGV0ZWN0aW5nIGxvY2tpbmcKICAgICBwcm9ibGVtczogQXMgdGhlIHByb2dyYW0gaXMgc2luZ2xlLXRocmVhZGVkLCBhbGwgd2UgaGF2ZQogICAgIHRvIGRvIGlzIHJlZ2lzdGVyIGEgbG9ja2luZyBjYWxsYmFjayB1c2luZyBhbiBhcnJheSBmb3IKICAgICBzdG9yaW5nIHdoaWNoIGxvY2tzIGFyZSBjdXJyZW50bHkgaGVsZCBieSB0aGUgcHJvZ3JhbS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVc2UgYSBsb2NrIGFyb3VuZCB0aGUgY2FsbCB0byBDUllQVE9fZ2V0X2V4X25ld19pbmRleCgpIGluCiAgICAgU1NMX2dldF9leF9kYXRhX1g1MDlfU1RPUkVfaWR4KCksIHdoaWNoIGlzIHVzZWQgaW4KICAgICBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4oKSBhbmQgdGh1cyBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lCiAgICAgZHVyaW5nIFRMUy9TU0wgaGFuZHNoYWtlcyBzbyB0aGF0IHRocmVhZC1zYWZldHkgaXMgZXNzZW50aWFsLgogICAgIFVuZm9ydHVuYXRlbHksIHRoZSBleF9kYXRhIGRlc2lnbiBpcyBub3QgYXQgYWxsIHN1aXRlZAogICAgIGZvciBtdWx0aS10aHJlYWRlZCB1c2UsIHNvIGl0IHByb2JhYmx5IHNob3VsZCBiZSBhYm9saXNoZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkZWQgQnJvYWRjb20gInVic2VjIiBFTkdJTkUgdG8gT3BlblNTTC4KICAgICBbQnJvYWRjb20sIHR3ZWFrZWQgYW5kIGludGVncmF0ZWQgYnkgR2VvZmYgVGhvcnBlXQoKICAqKSBNb3ZlIGNvbW1vbiBleHRlbnNpb24gcHJpbnRpbmcgY29kZSB0byBuZXcgZnVuY3Rpb24KICAgICBYNTA5VjNfcHJpbnRfZXh0ZW5zaW9ucygpLiBSZW9yZ2FuaXNlIE9DU1AgcHJpbnQgcm91dGluZXMgYW5kCiAgICAgaW1wbGVtZW50IHNvbWUgbmVlZGVkIE9DU1AgQVNOMSBmdW5jdGlvbnMuIEFkZCBPQ1NQIGV4dGVuc2lvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfc2lnbmF0dXJlX3ByaW50KCkgdG8gcmVtb3ZlIGR1cGxpY2F0aW9uIGluIHNvbWUKICAgICBwcmludCByb3V0aW5lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBzcGVjaWFsIG1lYW5pbmcgd2hlbiBTRVQgT0YgYW5kIFNFUVVFTkNFIE9GIGZsYWdzIGFyZSBib3RoCiAgICAgc2V0ICh0aGlzIHdhcyB0cmVhdGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgU0VUIE9GIHByZXZpb3VzbHkpLiBUaGlzCiAgICAgaXMgdXNlZCB0byByZW9yZGVyIHRoZSBTVEFDSyByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSB0byBtYXRjaCB0aGUKICAgICBlbmNvZGluZy4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gZ2V0IHJvdW5kIGEgcHJvYmxlbSB3aGVyZSBhIFBLQ1M3CiAgICAgc3RydWN0dXJlIHdoaWNoIHdhcyBzaWduZWQgY291bGQgbm90IGJlIHZlcmlmaWVkIGJlY2F1c2UgdGhlIFNUQUNLCiAgICAgb3JkZXIgZGlkIG5vdCByZWZsZWN0IHRoZSBlbmNvZGVkIG9yZGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlaW1wbGVtZW50IHRoZSBPQ1NQIEFTTjEgbW9kdWxlIHVzaW5nIHRoZSBuZXcgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgdGhlIFg1MDlWMyBjb2RlIHRvIHBlcm1pdCB0aGUgdXNlIG9mIGFuIEFTTjFfSVRFTSBzdHJ1Y3R1cmUKICAgICBmb3IgaXRzIEFTTjEgb3BlcmF0aW9ucy4gVGhlIG9sZCBzdHlsZSBmdW5jdGlvbiBwb2ludGVycyBzdGlsbCBleGlzdAogICAgIGZvciBub3cgYnV0IHRoZXkgd2lsbCBldmVudHVhbGx5IGdvIGF3YXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWVyZ2UgaW4gcmVwbGFjZW1lbnQgQVNOMSBjb2RlIGZyb20gdGhlIEFTTjEgYnJhbmNoLiBUaGlzIGFsbW9zdAogICAgIGNvbXBsZXRlbHkgcmVwbGFjZXMgdGhlIG9sZCBBU04xIGZ1bmN0aW9uYWxpdHkgd2l0aCBhIHRhYmxlIGRyaXZlbgogICAgIGVuY29kZXIgYW5kIGRlY29kZXIgd2hpY2ggaW50ZXJwcmV0cyBhbiBBU04xX0lURU0gc3RydWN0dXJlIGRlc2NyaWJpbmcKICAgICB0aGUgQVNOMSBtb2R1bGUuIENvbXBhdGliaWxpdHkgd2l0aCB0aGUgZXhpc3RpbmcgQVNOMSBBUEkgKGkyZCxkMmkpIGlzCiAgICAgbGFyZ2VseSBtYWludGFpbmVkLiBBbG1vc3QgYWxsIG9mIHRoZSBvbGQgYXNuMV9tYWMuaCBtYWNybyBiYXNlZCBBU04xCiAgICAgaGFzIGFsc28gYmVlbiBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBmb3JtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBCTl9tb2RfZXhwX3JlY3Agc28gdGhhdCBuZWdhdGl2ZSBtb2R1bGkgYXJlIHRvbGVyYXRlZAogICAgICh0aGUgc2lnbiBpcyBpZ25vcmVkKS4gIFNpbWlsYXJseSwgaWdub3JlIHRoZSBzaWduIGluIEJOX01PTlRfQ1RYX3NldAogICAgIHNvIHRoYXQgQk5fbW9kX2V4cF9tb250IGFuZCBCTl9tb2RfZXhwX21vbnRfd29yZCB3b3JrCiAgICAgZm9yIG5lZ2F0aXZlIG1vZHVsaS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQk5fdWFkZCBhbmQgQk5fdXN1YjogQWx3YXlzIHJldHVybiBub24tbmVnYXRpdmUgcmVzdWx0cyBpbnN0ZWFkCiAgICAgb2Ygbm90IHRvdWNoaW5nIHRoZSByZXN1bHQncyBzaWduIGJpdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCTl9kaXYgYnVnZml4OiBJZiB0aGUgcmVzdWx0IGlzIDAsIHRoZSBzaWduIChyZXMtPm5lZykgbXVzdCBub3QgYmUKICAgICBzZXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlZCB0aGUgTEhBU0ggY29kZSB0byB1c2UgcHJvdG90eXBlcyBmb3IgY2FsbGJhY2tzLCBhbmQgY3JlYXRlZAogICAgIG1hY3JvcyB0byBkZWNsYXJlIGFuZCBpbXBsZW1lbnQgdGhpbiAob3B0aW9uYWxseSBzdGF0aWMpIGZ1bmN0aW9ucwogICAgIHRoYXQgcHJvdmlkZSB0eXBlLXNhZmV0eSBhbmQgYXZvaWQgZnVuY3Rpb24gcG9pbnRlciBjYXN0aW5nIGZvciB0aGUKICAgICB0eXBlLXNwZWNpZmljIGNhbGxiYWNrcy4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGRlZCBLZXJiZXJvcyBDaXBoZXIgU3VpdGVzIHRvIGJlIHVzZWQgd2l0aCBUTFMsIGFzIHdyaXR0ZW4gaW4KICAgICBSRkMgMjcxMi4KICAgICBbVmVlcnMgU3RhYXRzIDxzdGFhdHN2ckBhc2MuaHBjLm1pbD4sCiAgICAgIEplZmZyZXkgQWx0bWFuIDxqYWx0bWFuQGNvbHVtYmlhLmVkdT4sIHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIFJlZm9ybWF0IHRoZSBGQVEgc28gdGhlIGRpZmZlcmVudCBxdWVzdGlvbnMgYW5kIGFuc3dlcnMgY2FuIGJlIGRpdmlkZWQKICAgICBpbiBzZWN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHN1YmplY3QuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSGF2ZSB0aGUgemxpYiBjb21wcmVzc2lvbiBjb2RlIGxvYWQgWkxJQi5ETEwgZHluYW1pY2FsbHkgdW5kZXIKICAgICBXaW5kb3dzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbiBCTl9tb2Rfc3FydCBmb3IgY29tcHV0aW5nIHNxdWFyZSByb290cyBtb2R1bG8gYSBwcmltZQogICAgICh1c2luZyB0aGUgcHJvYmFiaWxpc3RpYyBUb25lbGxpLVNoYW5rcyBhbGdvcml0aG0gdW5sZXNzCiAgICAgcCA9PSAzIChtb2QgNCkgIG9yICBwID09IDUgKG1vZCA4KSwgIHdoaWNoIGFyZSBjYXNlcyB0aGF0IGNhbgogICAgIGJlIGhhbmRsZWQgZGV0ZXJtaW5pc3RpY2FsbHkpLgogICAgIFtMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPiwgQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIEJOX21vZF9pbnZlcnNlIGZhc3RlciBieSBleHBsaWNpdGx5IGhhbmRsaW5nIHNtYWxsIHF1b3RpZW50cwogICAgIGluIHRoZSBFdWNsaWQgbG9vcC4gKFNwZWVkIGdhaW4gYWJvdXQgMjAlIGZvciBzbWFsbCBtb2R1bGkgWzI1NiBvcgogICAgIDUxMiBiaXRzXSwgYWJvdXQgMzAlIGZvciBsYXJnZXIgb25lcyBbMTAyNCBvciAyMDQ4IGJpdHNdLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fa3JvbmVja2VyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBCTl9nY2Qgc28gdGhhdCBpdCB3b3JrcyBvbiBuZWdhdGl2ZSBpbnB1dHM7IHRoZSByZXN1bHQgaXMKICAgICBwb3NpdGl2ZSB1bmxlc3MgYm90aCBwYXJhbWV0ZXJzIGFyZSB6ZXJvLgogICAgIFByZXZpb3VzbHkgc29tZXRoaW5nIHJlYXNvbmFibHkgY2xvc2UgdG8gYW4gaW5maW5pdGUgbG9vcCB3YXMKICAgICBwb3NzaWJsZSBiZWNhdXNlIG51bWJlcnMgY291bGQgYmUgZ3Jvd2luZyBpbnN0ZWFkIG9mIHNocmlua2luZwogICAgIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBFdWNsaWQncyBhbGdvcml0aG0uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IEJOX2lzX3dvcmQoKSBhbmQgQk5faXNfb25lKCkgbWFjcm9zIHRvIHRha2UgaW50byBhY2NvdW50IHRoZQogICAgIHNpZ24gb2YgdGhlIG51bWJlciBpbiBxdWVzdGlvbi4KCiAgICAgRml4IEJOX2lzX3dvcmQoYSx3KSB0byB3b3JrIGNvcnJlY3RseSBmb3IgdyA9PSAwLgoKICAgICBUaGUgb2xkIEJOX2lzX3dvcmQoYSx3KSBtYWNybyBpcyBub3cgY2FsbGVkIEJOX2Fic19pc193b3JkKGEsdykKICAgICBiZWNhdXNlIGl0cyB0ZXN0IGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiAnYScgZXF1YWxzICd3Jy4KICAgICBOb3RlIHRoYXQgQk5fYWJzX2lzX3dvcmQgZG9lcyAqbm90KiBoYW5kbGUgdyA9PSAwIHJlbGlhYmx5OwogICAgIGl0IGV4aXN0cyBtb3N0bHkgZm9yIHVzZSBpbiB0aGUgaW1wbGVtZW50YXRpb25zIG9mIEJOX2lzX3plcm8oKSwKICAgICBCTl9pc19vbmUoKSwgYW5kIEJOX2lzX3dvcmQoKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fc3dhcC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVc2UgQk5fbm5tb2QgaW5zdGVhZCBvZiBCTl9tb2QgaW4gY3J5cHRvL2JuL2JuX2V4cC5jIHNvIHRoYXQKICAgICB0aGUgZXhwb25lbnRpYXRpb24gZnVuY3Rpb25zIGFyZSBtb3JlIGxpa2VseSB0byBwcm9kdWNlIHJlYXNvbmFibGUKICAgICByZXN1bHRzIG9uIG5lZ2F0aXZlIGlucHV0cy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgQk5fbW9kX211bCBzbyB0aGF0IHRoZSByZXN1bHQgaXMgYWx3YXlzIG5vbi1uZWdhdGl2ZS4KICAgICBQcmV2aW91c2x5LCBpdCBjb3VsZCBiZSBuZWdhdGl2ZSBpZiBvbmUgb2YgdGhlIGZhY3RvcnMgd2FzIG5lZ2F0aXZlOwogICAgIEkgZG9uJ3QgdGhpbmsgYW55b25lIHJlYWxseSB3YW50ZWQgdGhhdCBiZWhhdmlvdXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTW92ZSBCTl9tb2RfLi4uIGZ1bmN0aW9ucyBpbnRvIG5ldyBmaWxlIGNyeXB0by9ibi9ibl9tb2QuYwogICAgIChleGNlcHQgZm9yIGV4cG9uZW50aWF0aW9uLCB3aGljaCBzdGF5cyBpbiBjcnlwdG8vYm4vYm5fZXhwLmMsCiAgICAgYW5kIEJOX21vZF9tdWxfcmVjaXByb2NhbCwgd2hpY2ggc3RheXMgaW4gY3J5cHRvL2JuL2JuX3JlY3AuYykKICAgICBhbmQgYWRkIG5ldyBmdW5jdGlvbnM6CgogICAgICAgICAgQk5fbm5tb2QKICAgICAgICAgIEJOX21vZF9zcXIKICAgICAgICAgIEJOX21vZF9hZGQKICAgICAgICAgIEJOX21vZF9hZGRfcXVpY2sKICAgICAgICAgIEJOX21vZF9zdWIKICAgICAgICAgIEJOX21vZF9zdWJfcXVpY2sKICAgICAgICAgIEJOX21vZF9sc2hpZnQxCiAgICAgICAgICBCTl9tb2RfbHNoaWZ0MV9xdWljawogICAgICAgICAgQk5fbW9kX2xzaGlmdAogICAgICAgICAgQk5fbW9kX2xzaGlmdF9xdWljawoKICAgICBUaGVzZSBmdW5jdGlvbnMgYWx3YXlzIGdlbmVyYXRlIG5vbi1uZWdhdGl2ZSByZXN1bHRzLgoKICAgICBCTl9ubm1vZCBvdGhlcndpc2UgaXMgbGlrZSBCTl9tb2QgKGlmIEJOX21vZCBjb21wdXRlcyBhIHJlbWFpbmRlciAgcgogICAgIHN1Y2ggdGhhdCAgfG18IDwgciA8IDAsICBCTl9ubm1vZCB3aWxsIG91dHB1dCAgcmVtICsgfG18ICBpbnN0ZWFkKS4KCiAgICAgQk5fbW9kX1hYWF9xdWljayhyLCBhLCBbYixdIG0pIGdlbmVyYXRlcyB0aGUgc2FtZSByZXN1bHQgYXMKICAgICBCTl9tb2RfWFhYKHIsIGEsIFtiLF0gbSwgY3R4KSwgYnV0IHJlcXVpcmVzIHRoYXQgIGEgIFthbmQgIGJdCiAgICAgYmUgcmVkdWNlZCBtb2R1bG8gIG0uCiAgICAgW0xlbmthIEZpYmlrb3ZhIDxmaWJpa292YUBleHAtbWF0aC51bmktZXNzZW4uZGU+LCBCb2RvIE1vZWxsZXJdCgojaWYgMAogICAgIFRoZSBmb2xsb3dpbmcgZW50cnkgYWNjaWRlbnRhbGx5IGFwcGVhcmVkIGluIHRoZSBDSEFOR0VTIGZpbGUKICAgICBkaXN0cmlidXRlZCB3aXRoIE9wZW5TU0wgMC45LjcuICBUaGUgbW9kaWZpY2F0aW9ucyBkZXNjcmliZWQgaW4KICAgICBpdCBkbyAqbm90KiBhcHBseSB0byBPcGVuU1NMIDAuOS43LgoKICAqKSBSZW1vdmUgYSBmZXcgY2FsbHMgdG8gYm5fd2V4cGFuZCgpIGluIEJOX3NxcigpICh0aGUgb25lIGluIHRoZXJlCiAgICAgd2FzIGFjdHVhbGx5IG5ldmVyIG5lZWRlZCkgYW5kIGluIEJOX211bCgpLiAgVGhlIHJlbW92YWwgaW4gQk5fbXVsKCkKICAgICByZXF1aXJlZCBhIHNtYWxsIGNoYW5nZSBpbiBibl9tdWxfcGFydF9yZWN1cnNpdmUoKSBhbmQgdGhlIGFkZGl0aW9uCiAgICAgb2YgdGhlIGZ1bmN0aW9ucyBibl9jbXBfcGFydF93b3JkcygpLCBibl9zdWJfcGFydF93b3JkcygpIGFuZAogICAgIGJuX2FkZF9wYXJ0X3dvcmRzKCksIHdoaWNoIGRvIHRoZSBzYW1lIHRoaW5nIGFzIGJuX2NtcF93b3JkcygpLAogICAgIGJuX3N1Yl93b3JkcygpIGFuZCBibl9hZGRfd29yZHMoKSBleGNlcHQgdGhleSB0YWtlIGFycmF5cyB3aXRoCiAgICAgZGlmZmVyaW5nIHNpemVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCiNlbmRpZgoKICAqKSBJbiAnb3BlbnNzbCBwYXNzd2QnLCB2ZXJpZnkgcGFzc3dvcmRzIHJlYWQgZnJvbSB0aGUgdGVybWluYWwKICAgICB1bmxlc3MgdGhlICctc2FsdCcgb3B0aW9uIGlzIHVzZWQgKHdoaWNoIHVzdWFsbHkgbWVhbnMgdGhhdAogICAgIHZlcmlmaWNhdGlvbiB3b3VsZCBqdXN0IHdhc3RlIHVzZXIncyB0aW1lIHNpbmNlIHRoZSByZXN1bHRpbmcKICAgICBoYXNoIGlzIGdvaW5nIHRvIGJlIGNvbXBhcmVkIHdpdGggc29tZSBnaXZlbiBwYXNzd29yZCBoYXNoKQogICAgIG9yIHRoZSBuZXcgJy1ub3ZlcmlmeScgb3B0aW9uIGlzIHVzZWQuCgogICAgIFRoaXMgaXMgYW4gaW5jb21wYXRpYmxlIGNoYW5nZSwgYnV0IGl0IGRvZXMgbm90IGFmZmVjdAogICAgIG5vbi1pbnRlcmFjdGl2ZSB1c2Ugb2YgJ29wZW5zc2wgcGFzc3dkJyAocGFzc3dvcmRzIG9uIHRoZSBjb21tYW5kCiAgICAgbGluZSwgJy1zdGRpbicgb3B0aW9uLCAnLWluIC4uLicgb3B0aW9uKSBhbmQgdGh1cyBzaG91bGQgbm90CiAgICAgY2F1c2UgYW55IHByb2JsZW1zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBSU0FyZWYsIHNpbmNlIHRoZXJlJ3Mgbm8gbW9yZSBuZWVkIGZvciBpdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIERTTyBsb2FkIGFsb25nIGEgcGF0aCBnaXZlbiB0aHJvdWdoIGFuIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICAgKFNITElCX1BBVEgpIHdpdGggc2hsX2xvYWQoKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDb25zdGlmeSB0aGUgRU5HSU5FIGNvZGUgYXMgYSByZXN1bHQgb2YgQklHTlVNIGNvbnN0aWZpY2F0aW9uLgogICAgIEFsc28gY29uc3RpZnkgdGhlIFJTQSBjb2RlIGFuZCBtb3N0IHRoaW5ncyByZWxhdGVkIHRvIGl0LiAgSW4gYQogICAgIGZldyBwbGFjZXMsIG1vc3Qgbm90YWJsZSBpbiB0aGUgZGVwdGggb2YgdGhlIEFTTi4xIGNvZGUsIHVnbHkKICAgICBjYXN0cyBiYWNrIHRvIG5vbi1jb25zdCB3ZXJlIHJlcXVpcmVkICh0byBiZSBzb2x2ZWQgYXQgYSBsYXRlcgogICAgIHRpbWUpCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBpdCBzbyB0aGUgb3BlbnNzbCBhcHBsaWNhdGlvbiBoYXMgYWxsIGVuZ2luZXMgbG9hZGVkIGJ5IGRlZmF1bHQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ29uc3RpZnkgdGhlIEJJR05VTSByb3V0aW5lcyBhIGxpdHRsZSBtb3JlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKCglFTkdJTkVfbG9hZF9jc3dpZnQoKQoJRU5HSU5FX2xvYWRfY2hpbCgpCglFTkdJTkVfbG9hZF9hdGFsbGEoKQoJRU5HSU5FX2xvYWRfbnVyb24oKQoJRU5HSU5FX2xvYWRfYnVpbHRpbl9lbmdpbmVzKCkKCiAgICAgVGhhdCB3YXksIGFuIGFwcGxpY2F0aW9uIGNhbiBpdHNlbGYgY2hvb3NlIGlmIGV4dGVybmFsIGVuZ2luZXMgdGhhdAogICAgIGFyZSBidWlsdC1pbiBpbiBPcGVuU1NMIHNoYWxsIGV2ZXIgYmUgdXNlZCBvciBub3QuICBUaGUgYmVuZWZpdCBpcwogICAgIHRoYXQgYXBwbGljYXRpb25zIHdvbid0IGhhdmUgdG8gYmUgbGlua2VkIHdpdGggbGliZGwgb3Igb3RoZXIgZHNvCiAgICAgbGlicmFyaWVzIHVubGVzcyBpdCdzIHJlYWxseSBuZWVkZWQuCgogICAgIENoYW5nZWQgJ29wZW5zc2wgZW5naW5lJyB0byBsb2FkIGFsbCBlbmdpbmVzIG9uIGRlbWFuZC4KICAgICBDaGFuZ2VkIHRoZSBlbmdpbmUgaGVhZGVyIGZpbGVzIHRvIGF2b2lkIHRoZSBkdXBsaWNhdGlvbiBvZiBzb21lCiAgICAgZGVjbGFyYXRpb25zICh0aGV5IGRpZmZlcmVkISkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgJ29wZW5zc2wgZW5naW5lJyBjYW4gbm93IGxpc3QgY2FwYWJpbGl0aWVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEJldHRlciBlcnJvciByZXBvcnRpbmcgaW4gJ29wZW5zc2wgZW5naW5lJy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXZlciBjYWxsIGxvYWRfZGhfcGFyYW0oTlVMTCkgaW4gc19zZXJ2ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGVuZ2luZSBhcHBsaWNhdGlvbi4gIEl0IGNhbiBjdXJyZW50bHkgbGlzdCBlbmdpbmVzIGJ5IG5hbWUgYW5kCiAgICAgaWRlbnRpdHksIGFuZCB0ZXN0IGlmIHRoZXkgYXJlIGFjdHVhbGx5IGF2YWlsYWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbXByb3ZlIFJQTSBzcGVjaWZpY2F0aW9uIGZpbGUgYnkgZm9yY2luZyBzeW1ib2xpYyBsaW5raW5nIGFuZCBtYWtpbmcKICAgICBzdXJlIHRoZSBpbnN0YWxsZWQgZG9jdW1lbnRhdGlvbiBpcyBhbHNvIG93bmVkIGJ5IHJvb3Qucm9vdC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPl0KCiAgKikgR2l2ZSB0aGUgT3BlblNTTCBhcHBsaWNhdGlvbnMgbW9yZSBwb3NzaWJpbGl0aWVzIHRvIG1ha2UgdXNlIG9mCiAgICAga2V5cyAocHVibGljIGFzIHdlbGwgYXMgcHJpdmF0ZSkgaGFuZGxlZCBieSBlbmdpbmVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBPQ1NQIGNvZGUgdGhhdCBjb21lcyBmcm9tIENlcnRDby4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgVk1TIHN1cHBvcnQgZm9yIHRoZSBSaWpuZGFlbCBjb2RlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZGVkIHVudGVzdGVkIHN1cHBvcnQgZm9yIE51cm9uIGNyeXB0byBhY2NlbGVyYXRvci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGV4dGVybmFsIGNyeXB0b2dyYXBoaWMgZGV2aWNlcy4gIFRoaXMgY29kZSB3YXMKICAgICBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHNlcGFyYXRlbHkgYXMgdGhlICJlbmdpbmUiIGJyYW5jaC4KICAgICBbR2VvZmYgVGhvcnBlLCBSaWNoYXJkIExldml0dGVdCgogICopIFJld29yayB0aGUgZmlsZW5hbWUtdHJhbnNsYXRpb24gaW4gdGhlIERTTyBjb2RlLiBJdCBpcyBub3cgcG9zc2libGUgdG8KICAgICBoYXZlIGZhciBncmVhdGVyIGNvbnRyb2wgb3ZlciBob3cgYSAibmFtZSIgaXMgdHVybmVkIGludG8gYSBmaWxlbmFtZQogICAgIGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0aW5nIGVudmlyb25tZW50IGFuZCBhbnkgb2RkaXRpZXMgYWJvdXQgdGhlCiAgICAgZGlmZmVyZW50IHNoYXJlZCBsaWJyYXJ5IGZpbGVuYW1lcyBvbiBlYWNoIHN5c3RlbS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBTdXBwb3J0IHRocmVhZHMgb24gRnJlZUJTRC1lbGYgaW4gQ29uZmlndXJlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBmb3IgU0hBMSBhc3NlbWJseSBwcm9ibGVtIHdpdGggTUFTTTogaXQgcHJvZHVjZXMKICAgICB3YXJuaW5ncyBhYm91dCBjb3JydXB0IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHdoZW4gYXNzZW1ibGluZwogICAgIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uLiBUaGlzIGlzIGNhdXNlZCBieSB0aGUgb3ZlcmxhcHBpbmcKICAgICBvZiB0d28gc2VjdGlvbnMuCiAgICAgW0Jlcm5kIE1hdHRoZXMgPG1haW5idWdAY2Vsb2NvbS5kZT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgTkNPTkYgY2hhbmdlcy4KICAgICBOQ09ORl9nZXRfbnVtYmVyKCkgaGFzIG5vIGVycm9yIGNoZWNraW5nIGF0IGFsbC4gIEFzIGEgcmVwbGFjZW1lbnQsCiAgICAgTkNPTkZfZ2V0X251bWJlcl9lKCkgaXMgZGVmaW5lZCAoX2UgZm9yICJlcnJvciBjaGVja2luZyIpIGFuZCBpcwogICAgIHByb21vdGVkIHN0cm9uZ2x5LiAgVGhlIG9sZCBOQ09ORl9nZXRfbnVtYmVyIGlzIGtlcHQgYXJvdW5kIGZvcgogICAgIGJpbmFyeSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICAgIE1ha2UgaXQgcG9zc2libGUgZm9yIG1ldGhvZHMgdG8gbG9hZCBmcm9tIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgQklPLAogICAgIGJ5IHByb3ZpZGluZyBhIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCBpcyBnaXZlbiBhIG5hbWUgaW5zdGVhZCBvZiBhIEJJTy4KICAgICBGb3IgZXhhbXBsZSwgdGhpcyBjb3VsZCBiZSB1c2VkIHRvIGxvYWQgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gYW4KICAgICBMREFQIHNlcnZlci4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggZm9yIG5vbiBibG9ja2luZyBhY2NlcHQgQklPcy4gQWRkZWQgbmV3IEkvTyBzcGVjaWFsIHJlYXNvbgogICAgIEJJT19SUl9BQ0NFUFQgdG8gY292ZXIgdGhpcyBjYXNlLiBQcmV2aW91c2x5IHVzZSBvZiBhY2NlcHQgQklPcwogICAgIHdpdGggbm9uIGJsb2NraW5nIEkvTyB3YXMgbm90IHBvc3NpYmxlIGJlY2F1c2Ugbm8gcmV0cnkgY29kZSB3YXMKICAgICBpbXBsZW1lbnRlZC4gQWxzbyBhZGRlZCBuZXcgU1NMIGNvZGUgU1NMX1dBTlRfQUNDRVBUIHRvIGNvdmVyCiAgICAgdGhpcyBjYXNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIHRoZSBiZWdpbm5pbmdzIG9mIFJpam5kYWVsIHN1cHBvcnQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCBmb3IgYnVnIGluIERpcmVjdG9yeVN0cmluZyBtYXNrIHNldHRpbmcuIEFkZCBzdXBwb3J0IGZvcgogICAgIFg1MDlfTkFNRV9wcmludF9leCgpIGluICdyZXEnIGFuZCBYNTA5X3ByaW50X2V4KCkgZnVuY3Rpb24KICAgICB0byBhbGxvdyBjZXJ0aWZpY2F0ZSBwcmludGluZyB0byBtb3JlIGNvbnRyb2xsYWJsZSwgYWRkaXRpb25hbAogICAgICdjZXJ0b3B0JyBvcHRpb24gdG8gJ3g1MDknIHRvIGFsbG93IG5ldyBwcmludGluZyBvcHRpb25zIHRvIGJlCiAgICAgc2V0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENsZWFuIG9sZCBFQVkgTUQ1IGhhY2sgZnJvbSBlX29zLmguCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZsIGFuZCAwLjkuNm0gIFsxNyBNYXIgMjAwNF0KCiAgKikgRml4IG51bGwtcG9pbnRlciBhc3NpZ25tZW50IGluIGRvX2NoYW5nZV9jaXBoZXJfc3BlYygpIHJldmVhbGVkCiAgICAgYnkgdXNpbmcgdGhlIENvZGVub21pY29uIFRMUyBUZXN0IFRvb2wgKENWRS0yMDA0LTAwNzkpCiAgICAgW0pvZSBPcnRvbiwgU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmsgYW5kIDAuOS42bCAgWzA0IE5vdiAyMDAzXQoKICAqKSBGaXggYWRkaXRpb25hbCBidWcgcmV2ZWFsZWQgYnkgdGhlIE5JU0NDIHRlc3Qgc3VpdGU6CgogICAgIFN0b3AgYnVnIHRyaWdnZXJpbmcgbGFyZ2UgcmVjdXJzaW9uIHdoZW4gcHJlc2VudGVkIHdpdGgKICAgICBjZXJ0YWluIEFTTi4xIHRhZ3MgKENWRS0yMDAzLTA4NTEpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZqIGFuZCAwLjkuNmsgIFszMCBTZXAgMjAwM10KCiAgKikgRml4IHZhcmlvdXMgYnVncyByZXZlYWxlZCBieSBydW5uaW5nIHRoZSBOSVNDQyB0ZXN0IHN1aXRlOgoKICAgICBTdG9wIG91dCBvZiBib3VuZHMgcmVhZHMgaW4gdGhlIEFTTjEgY29kZSB3aGVuIHByZXNlbnRlZCB3aXRoCiAgICAgaW52YWxpZCB0YWdzIChDVkUtMjAwMy0wNTQzIGFuZCBDVkUtMjAwMy0wNTQ0KS4KICAgICAKICAgICBJZiB2ZXJpZnkgY2FsbGJhY2sgaWdub3JlcyBpbnZhbGlkIHB1YmxpYyBrZXkgZXJyb3JzIGRvbid0IHRyeSB0byBjaGVjawogICAgIGNlcnRpZmljYXRlIHNpZ25hdHVyZSB3aXRoIHRoZSBOVUxMIHB1YmxpYyBrZXkuCgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHNzbDNfYWNjZXB0KCkgKHNzbC9zM19zcnZyLmMpIG9ubHkgYWNjZXB0IGEgY2xpZW50IGNlcnRpZmljYXRlCiAgICAgaWYgdGhlIHNlcnZlciByZXF1ZXN0ZWQgb25lOiBhcyBzdGF0ZWQgaW4gVExTIDEuMCBhbmQgU1NMIDMuMAogICAgIHNwZWNpZmljYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHNzbDNfZ2V0X2NsaWVudF9oZWxsbygpIChzc2wvczNfc3J2ci5jKSwgdG9sZXJhdGUgYWRkaXRpb25hbAogICAgIGV4dHJhIGRhdGEgYWZ0ZXIgdGhlIGNvbXByZXNzaW9uIG1ldGhvZHMgbm90IG9ubHkgZm9yIFRMUyAxLjAKICAgICBidXQgYWxzbyBmb3IgU1NMIDMuMCAoYXMgcmVxdWlyZWQgYnkgdGhlIHNwZWNpZmljYXRpb24pLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTWF0dGhpYXMgTG9lcGZlXQoKICAqKSBDaGFuZ2UgWDUwOV9jZXJ0aWZpY2F0ZV90eXBlKCkgdG8gbWFyayB0aGUga2V5IGFzIGV4cG9ydGVkL2V4cG9ydGFibGUKICAgICB3aGVuIGl0J3MgNTEyICpiaXRzKiBsb25nLCBub3QgNTEyIGJ5dGVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42aSBhbmQgMC45LjZqICBbMTAgQXByIDIwMDNdCgogICopIENvdW50ZXJtZWFzdXJlIGFnYWluc3QgdGhlIEtsaW1hLVBva29ybnktUm9zYSBleHRlbnNpb24gb2YKICAgICBCbGVpY2hiYWNoZXIncyBhdHRhY2sgb24gUEtDUyAjMSB2MS41IHBhZGRpbmc6IHRyZWF0CiAgICAgYSBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBtaXNtYXRjaCBsaWtlIGEgZGVjcnlwdGlvbiBlcnJvcgogICAgIGluIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UgKHNzbC9zM19zcnZyLmMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFR1cm4gb24gUlNBIGJsaW5kaW5nIGJ5IGRlZmF1bHQgaW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICB0byBhdm9pZCBhIHRpbWluZyBhdHRhY2suIEFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQgaXQgY2FuIGNhbGwKICAgICBSU0FfYmxpbmRpbmdfb2ZmKCkgb3IgdXNlIHRoZSBuZXcgZmxhZyBSU0FfRkxBR19OT19CTElORElORy4KICAgICBUaGV5IHdvdWxkIGJlIGlsbC1hZHZpc2VkIHRvIGRvIHNvIGluIG1vc3QgY2FzZXMuCiAgICAgW0JlbiBMYXVyaWUsIFN0ZXZlIEhlbnNvbiwgR2VvZmYgVGhvcnBlLCBCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBSU0EgYmxpbmRpbmcgY29kZSBzbyB0aGF0IGl0IHdvcmtzIHdoZW4gdGhlIFBSTkcgaXMgbm90CiAgICAgc2VlZGVkIChpbiB0aGlzIGNhc2UsIHRoZSBzZWNyZXQgUlNBIGV4cG9uZW50IGlzIGFidXNlZCBhcwogICAgIGFuIHVucHJlZGljdGFibGUgc2VlZCAtLSBpZiBpdCBpcyBub3QgdW5wcmVkaWN0YWJsZSwgdGhlcmUKICAgICBpcyBubyBwb2ludCBpbiBibGluZGluZyBhbnl3YXkpLiAgTWFrZSBSU0EgYmxpbmRpbmcgdGhyZWFkLXNhZmUKICAgICBieSByZW1lbWJlcmluZyB0aGUgY3JlYXRvcidzIHRocmVhZCBJRCBpbiByc2EtPmJsaW5kaW5nIGFuZAogICAgIGhhdmluZyBhbGwgb3RoZXIgdGhyZWFkcyB1c2UgbG9jYWwgb25lLXRpbWUgYmxpbmRpbmcgZmFjdG9ycwogICAgICh0aGlzIHJlcXVpcmVzIG1vcmUgY29tcHV0YXRpb24gdGhhbiBzaGFyaW5nIHJzYS0+YmxpbmRpbmcsIGJ1dAogICAgIGF2b2lkcyBleGNlc3NpdmUgbG9ja2luZzsgYW5kIGlmIGFuIFJTQSBvYmplY3QgaXMgbm90IHNoYXJlZAogICAgIGJldHdlZW4gdGhyZWFkcywgYmxpbmRpbmcgd2lsbCBzdGlsbCBiZSB2ZXJ5IGZhc3QpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42aCBhbmQgMC45LjZpICBbMTkgRmViIDIwMDNdCgogICopIEluIHNzbDNfZ2V0X3JlY29yZCAoc3NsL3MzX3BrdC5jKSwgbWluaW1pemUgaW5mb3JtYXRpb24gbGVha2VkCiAgICAgdmlhIHRpbWluZyBieSBwZXJmb3JtaW5nIGEgTUFDIGNvbXB1dGF0aW9uIGV2ZW4gaWYgaW5jb3JycmVjdAogICAgIGJsb2NrIGNpcGhlciBwYWRkaW5nIGhhcyBiZWVuIGZvdW5kLiAgVGhpcyBpcyBhIGNvdW50ZXJtZWFzdXJlCiAgICAgYWdhaW5zdCBhY3RpdmUgYXR0YWNrcyB3aGVyZSB0aGUgYXR0YWNrZXIgaGFzIHRvIGRpc3Rpbmd1aXNoCiAgICAgYmV0d2VlbiBiYWQgcGFkZGluZyBhbmQgYSBNQUMgdmVyaWZpY2F0aW9uIGVycm9yLiAoQ1ZFLTIwMDMtMDA3OCkKCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBCcmljZSBDYW52ZWwgKEVQRkwpLAogICAgIEFsYWluIEhpbHRnZW4gKFVCUyksIFNlcmdlIFZhdWRlbmF5IChFUEZMKSwgYW5kCiAgICAgTWFydGluIFZ1YWdub3V4IChFUEZMLCBJbGlvbildCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42ZyBhbmQgMC45LjZoICBbNSBEZWMgMjAwMl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9QRU5TU0xfY2xlYW5zZSgpLCB3aGljaCBpcyB1c2VkIHRvIGNsZWFuc2UgYSBzZWN0aW9uIG9mCiAgICAgbWVtb3J5IGZyb20gaXQncyBjb250ZW50cy4gIFRoaXMgaXMgZG9uZSB3aXRoIGEgY291bnRlciB0aGF0IHdpbGwKICAgICBwbGFjZSBhbHRlcm5hdGluZyB2YWx1ZXMgaW4gZWFjaCBieXRlLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzb2x2ZQogICAgIHR3byBpc3N1ZXM6IDEpIHRoZSByZW1vdmFsIG9mIGNhbGxzIHRvIG1lbXNldCgpIGJ5IGhpZ2hseSBvcHRpbWl6aW5nCiAgICAgY29tcGlsZXJzLCBhbmQgMikgY2xlYW5zaW5nIHdpdGggb3RoZXIgdmFsdWVzIHRoYW4gMCwgc2luY2UgdGhvc2UgY2FuCiAgICAgYmUgcmVhZCB0aHJvdWdoIG9uIGNlcnRhaW4gbWVkaWEsIGZvciBleGFtcGxlIGEgc3dhcCBzcGFjZSBvbiBkaXNrLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEJ1Z2ZpeDogY2xpZW50IHNpZGUgc2Vzc2lvbiBjYWNoaW5nIGRpZCBub3Qgd29yayB3aXRoIGV4dGVybmFsIGNhY2hpbmcsCiAgICAgYmVjYXVzZSB0aGUgc2Vzc2lvbi0+Y2lwaGVyIHNldHRpbmcgd2FzIG5vdCByZXN0b3JlZCB3aGVuIHJlbG9hZGluZwogICAgIGZyb20gdGhlIGV4dGVybmFsIGNhY2hlLiBUaGlzIHByb2JsZW0gd2FzIG1hc2tlZCwgd2hlbgogICAgIFNTTF9PUF9ORVRTQ0FQRV9SRVVTRV9DSVBIRVJfQ0hBTkdFX0JVRyAocGFydCBvZiBTU0xfT1BfQUxMKSB3YXMgc2V0LgogICAgIChGb3VuZCBieSBTdGV2ZSBIYXNsYW0gPHN0ZXZlQGFyYXFuaWQuZGR0cy5uZXQ+LikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IGNsaWVudF9jZXJ0aWZpY2F0ZSAoc3NsL3MyX2NsbnQuYyk6IFRoZSBwZXJtaXNzaWJsZSB0b3RhbAogICAgIGxlbmd0aCBvZiB0aGUgUkVRVUVTVC1DRVJUSUZJQ0FURSBtZXNzYWdlIGlzIDE4IC4uIDM0LCBub3QgMTcgLi4gMzMuCiAgICAgW1plZXYgTGllYmVyIDx6ZWV2LWxAeWFob28uY29tPl0KCiAgKikgVW5kbyBhbiB1bmRvY3VtZW50ZWQgY2hhbmdlIGludHJvZHVjZWQgaW4gMC45LjZlIHdoaWNoIGNhdXNlZAogICAgIHJlcGVhdGVkIGNhbGxzIHRvIE9wZW5TU0xfYWRkX2FsbF9jaXBoZXJzKCkgYW5kIAogICAgIE9wZW5TU0xfYWRkX2FsbF9kaWdlc3RzKCkgdG8gYmUgaWdub3JlZCwgZXZlbiBhZnRlciBjYWxsaW5nCiAgICAgRVZQX2NsZWFudXAoKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiByZWFkZXIgdG8gZGVhbCB3aXRoIGxhc3QgbGluZSBub3QKICAgICBiZWluZyBwcm9wZXJseSB0ZXJtaW5hdGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSBYNTA5X05BTUVfY21wKCkgc28gaXQgYXBwbGllcyB0aGUgc3BlY2lhbCBydWxlcyBvbiBoYW5kbGluZwogICAgIEROIHZhbHVlcyB0aGF0IGFyZSBvZiB0eXBlIFByaW50YWJsZVN0cmluZywgYXMgd2VsbCBhcyBSRE5zIG9mIHR5cGUKICAgICBlbWFpbEFkZHJlc3Mgd2hlcmUgdGhlIHZhbHVlIGhhcyB0aGUgdHlwZSBpYTVTdHJpbmcuCiAgICAgW3N0ZWZhbmtAdmFsaWNlcnQuY29tIHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBhIFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX1NUT1JFIGZsYWcgdG8gdGFrZSBvdmVyIGhhbGYKICAgICB0aGUgam9iIFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX0xPT0tVUCB3YXMgaW5jb25zaXN0ZW50bHkKICAgICBkb2luZywgZGVmaW5lIGEgbmV3IGZsYWcgKFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMKSB0byBiZQogICAgIHRoZSBiaXR3aXNlLU9SIG9mIHRoZSB0d28gZm9yIHVzZSBieSB0aGUgbWFqb3JpdHkgb2YgYXBwbGljYXRpb25zCiAgICAgd2FudGluZyB0aGlzIGJlaGF2aW91ciwgYW5kIHVwZGF0ZSB0aGUgZG9jcy4gVGhlIGRvY3VtZW50ZWQKICAgICBiZWhhdmlvdXIgYW5kIGFjdHVhbCBiZWhhdmlvdXIgd2VyZSBpbmNvbnNpc3RlbnQgYW5kIGhhZCBiZWVuCiAgICAgY2hhbmdpbmcgYW55d2F5LCBzbyB0aGlzIGlzIG1vcmUgYSBidWctZml4IHRoYW4gYSBiZWhhdmlvdXJhbAogICAgIGNoYW5nZS4KICAgICBbR2VvZmYgVGhvcnBlLCBkaWFnbm9zZWQgYnkgTmFkYXYgSGFyJ0VsXQoKICAqKSBEb24ndCBpbXBvc2UgYSAxNi1ieXRlIGxlbmd0aCBtaW5pbXVtIG9uIHNlc3Npb24gSURzIGluIHNzbC9zM19jbG50LmMKICAgICAodGhlIFNTTCAzLjAgYW5kIFRMUyAxLjAgc3BlY2lmaWNhdGlvbnMgYWxsb3cgYW55IGxlbmd0aCB1cCB0byAzMiBieXRlcykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGluaXRpYWxpemF0aW9uIGNvZGUgcmFjZSBjb25kaXRpb25zIGluCiAgICAgICAgU1NMdjIzX21ldGhvZCgpLCAgU1NMdjIzX2NsaWVudF9tZXRob2QoKSwgICBTU0x2MjNfc2VydmVyX21ldGhvZCgpLAogICAgICAgIFNTTHYyX21ldGhvZCgpLCAgIFNTTHYyX2NsaWVudF9tZXRob2QoKSwgICAgU1NMdjJfc2VydmVyX21ldGhvZCgpLAogICAgICAgIFNTTHYzX21ldGhvZCgpLCAgIFNTTHYzX2NsaWVudF9tZXRob2QoKSwgICAgU1NMdjNfc2VydmVyX21ldGhvZCgpLAogICAgICAgIFRMU3YxX21ldGhvZCgpLCAgIFRMU3YxX2NsaWVudF9tZXRob2QoKSwgICAgVExTdjFfc2VydmVyX21ldGhvZCgpLAogICAgICAgIHNzbDJfZ2V0X2NpcGhlcl9ieV9jaGFyKCksCiAgICAgICAgc3NsM19nZXRfY2lwaGVyX2J5X2NoYXIoKS4KICAgICBbUGF0cmljayBNY0Nvcm1pY2sgPHBhdHJpY2tAdGVsbG1lLmNvbT4sIEJvZG8gTW9lbGxlcl0KCiAgKikgUmVvcmRlciBjbGVhbnVwIHNlcXVlbmNlIGluIFNTTF9DVFhfZnJlZSgpOiBvbmx5IHJlbW92ZSB0aGUgZXhfZGF0YSBhZnRlcgogICAgIHRoZSBjYWNoZWQgc2Vzc2lvbnMgYXJlIGZsdXNoZWQsIGFzIHRoZSByZW1vdmVfY2IoKSBtaWdodCB1c2UgZXhfZGF0YQogICAgIGNvbnRlbnRzLiBCdWcgZm91bmQgYnkgU2FtIFZhcnNoYXZjaGlrIDxtcnNhbUBjb3VyaWVyLW10YS5jb20+CiAgICAgKHNlZSBbb3BlbnNzbC5vcmcgIzIxMl0pLgogICAgIFtHZW9mZiBUaG9ycGUsIEx1dHogSmFlbmlja2VdCgogICopIEZpeCB0eXBvIGluIE9CSl90eHQyb2JqIHdoaWNoIGluY29ycmVjdGx5IHBhc3NlZCB0aGUgY29udGVudAogICAgIGxlbmd0aCwgaW5zdGVhZCBvZiB0aGUgZW5jb2RpbmcgbGVuZ3RoIHRvIGQyaV9BU04xX09CSkVDVC4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmYgYW5kIDAuOS42ZyAgWzkgQXVnIDIwMDJdCgogICopIFtJbiAwLjkuNmctZW5naW5lIHJlbGVhc2U6XQogICAgIEZpeCBjcnlwdG8vZW5naW5lL3ZlbmRvcl9kZWZucy9jc3dpZnQuaCBmb3IgV0lOMzIgKHVzZSAnX3N0ZGNhbGwnKS4KICAgICBbTHlubiBHYXppcyA8bGdhemlzQHJhaW5ib3cuY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZlIGFuZCAwLjkuNmYgIFs4IEF1ZyAyMDAyXQoKICAqKSBGaXggQVNOMSBjaGVja3MuIENoZWNrIGZvciBvdmVyZmxvdyBieSBjb21wYXJpbmcgd2l0aCBMT05HX01BWAogICAgIGFuZCBnZXQgZml4IHRoZSBoZWFkZXIgbGVuZ3RoIGNhbGN1bGF0aW9uLgogICAgIFtGbG9yaWFuIFdlaW1lciA8V2VpbWVyQENFUlQuVW5pLVN0dXR0Z2FydC5ERT4sCglBbG9uIEthbnRvciA8YWxvbmtAY2hlY2twb2ludC5jb20+IChhbmQgb3RoZXJzKSwKCVN0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIHByb3BlciBlcnJvciBoYW5kbGluZyBpbnN0ZWFkIG9mICdhc3NlcnRpb25zJyBpbiBidWZmZXIKICAgICBvdmVyZmxvdyBjaGVja3MgYWRkZWQgaW4gMC45LjZlLiAgVGhpcyBwcmV2ZW50cyBEb1MgKHRoZQogICAgIGFzc2VydGlvbnMgY291bGQgY2FsbCBhYm9ydCgpKS4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPiwgQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmQgYW5kIDAuOS42ZSAgWzMwIEp1bCAyMDAyXQoKICAqKSBBZGQgdmFyaW91cyBzYW5pdHkgY2hlY2tzIHRvIGFzbjFfZ2V0X2xlbmd0aCgpIHRvIHJlamVjdAogICAgIHRoZSBBU04xIGxlbmd0aCBieXRlcyBpZiB0aGV5IGV4Y2VlZCBzaXplb2YobG9uZyksIHdpbGwgYXBwZWFyCiAgICAgbmVnYXRpdmUgb3IgdGhlIGNvbnRlbnQgbGVuZ3RoIGV4Y2VlZHMgdGhlIGxlbmd0aCBvZiB0aGUKICAgICBzdXBwbGllZCBidWZmZXIuCiAgICAgW1N0ZXZlIEhlbnNvbiwgQWRpIFN0YXYgPHN0YXZAbWVyY3VyeS5jby5pbD4sIEphbWVzIFlvbmFuIDxqaW1AbnRscC5jb20+XQoKICAqKSBGaXggY2lwaGVyIHNlbGVjdGlvbiByb3V0aW5lczogY2lwaGVycyB3aXRob3V0IGVuY3J5cHRpb24gaGFkIG5vIGZsYWdzCiAgICAgZm9yIHRoZSBjaXBoZXIgc3RyZW5ndGggc2V0IGFuZCB3aGVyZSB0aGVyZWZvcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5CiAgICAgYnkgdGhlIHNlbGVjdGlvbiByb3V0aW5lcyAoUFIgIzEzMCkuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBFVlBfZHNhX3NoYSBtYWNyby4KICAgICBbTmlscyBMYXJzY2hdCgogICopIE5ldyBvcHRpb24KICAgICAgICAgIFNTTF9PUF9ET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMKICAgICBmb3IgZGlzYWJsaW5nIHRoZSBTU0wgMy4wL1RMUyAxLjAgQ0JDIHZ1bG5lcmFiaWxpdHkgY291bnRlcm1lYXN1cmUKICAgICB0aGF0IHdhcyBhZGRlZCBpbiBPcGVuU1NMIDAuOS42ZC4KCiAgICAgQXMgdGhlIGNvdW50ZXJtZWFzdXJlIHR1cm5lZCBvdXQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggc29tZQogICAgIGJyb2tlbiBTU0wgaW1wbGVtZW50YXRpb25zLCB0aGUgbmV3IG9wdGlvbiBpcyBwYXJ0IG9mIFNTTF9PUF9BTEwuCiAgICAgU1NMX09QX0FMTCBpcyB1c3VhbGx5IGVtcGxveWVkIHdoZW4gY29tcGF0aWJpbGl0eSB3aXRoIHdlaXJkIFNTTAogICAgIGltcGxlbWVudGF0aW9ucyBpcyBkZXNpcmVkIChlLmcuICctYnVncycgb3B0aW9uIHRvICdzX2NsaWVudCcgYW5kCiAgICAgJ3Nfc2VydmVyJyksIHNvIHRoZSBuZXcgb3B0aW9uIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGluIG1hbnkKICAgICBhcHBsaWNhdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlcyBpbiBzZWN1cml0eSBwYXRjaDoKCiAgICAgQ2hhbmdlcyBtYXJrZWQgIihDSEFUUykiIHdlcmUgc3BvbnNvcmVkIGJ5IHRoZSBEZWZlbnNlIEFkdmFuY2VkCiAgICAgUmVzZWFyY2ggUHJvamVjdHMgQWdlbmN5IChEQVJQQSkgYW5kIEFpciBGb3JjZSBSZXNlYXJjaCBMYWJvcmF0b3J5LAogICAgIEFpciBGb3JjZSBNYXRlcmllbCBDb21tYW5kLCBVU0FGLCB1bmRlciBhZ3JlZW1lbnQgbnVtYmVyCiAgICAgRjMwNjAyLTAxLTItMDUzNy4KCiAgKikgQWRkIHZhcmlvdXMgc2FuaXR5IGNoZWNrcyB0byBhc24xX2dldF9sZW5ndGgoKSB0byByZWplY3QKICAgICB0aGUgQVNOMSBsZW5ndGggYnl0ZXMgaWYgdGhleSBleGNlZWQgc2l6ZW9mKGxvbmcpLCB3aWxsIGFwcGVhcgogICAgIG5lZ2F0aXZlIG9yIHRoZSBjb250ZW50IGxlbmd0aCBleGNlZWRzIHRoZSBsZW5ndGggb2YgdGhlCiAgICAgc3VwcGxpZWQgYnVmZmVyLiAoQ1ZFLTIwMDItMDY1OSkKICAgICBbU3RldmUgSGVuc29uLCBBZGkgU3RhdiA8c3RhdkBtZXJjdXJ5LmNvLmlsPiwgSmFtZXMgWW9uYW4gPGppbUBudGxwLmNvbT5dCgogICopIEFzc2VydGlvbnMgZm9yIHZhcmlvdXMgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvd3MsIG5vdCBrbm93biB0bwogICAgIGhhcHBlbiBpbiBwcmFjdGljZS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBWYXJpb3VzIHRlbXBvcmFyeSBidWZmZXJzIHRvIGhvbGQgQVNDSUkgdmVyc2lvbnMgb2YgaW50ZWdlcnMgd2VyZQogICAgIHRvbyBzbWFsbCBmb3IgNjQgYml0IHBsYXRmb3Jtcy4gKENWRS0yMDAyLTA2NTUpCiAgICAgW01hdHRoZXcgQnluZy1NYWRkaWNrIDxtYm1AYWxkaWdpdGFsLmNvLnVrPiBhbmQgQmVuIExhdXJpZSAoQ0hBVFMpPgoKICAqKSBSZW1vdGUgYnVmZmVyIG92ZXJmbG93IGluIFNTTDMgcHJvdG9jb2wgLSBhbiBhdHRhY2tlciBjb3VsZAogICAgIHN1cHBseSBhbiBvdmVyc2l6ZWQgc2Vzc2lvbiBJRCB0byBhIGNsaWVudC4gKENWRS0yMDAyLTA2NTYpCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgUmVtb3RlIGJ1ZmZlciBvdmVyZmxvdyBpbiBTU0wyIHByb3RvY29sIC0gYW4gYXR0YWNrZXIgY291bGQKICAgICBzdXBwbHkgYW4gb3ZlcnNpemVkIGNsaWVudCBtYXN0ZXIga2V5LiAoQ1ZFLTIwMDItMDY1NikKICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmMgYW5kIDAuOS42ZCAgWzkgTWF5IDIwMDJdCgogICopIEZpeCBjcnlwdG8vYXNuMS9hX3NpZ24uYyBzbyB0aGF0ICdwYXJhbWV0ZXJzJyBpcyBvbWl0dGVkIChub3QKICAgICBlbmNvZGVkIGFzIE5VTEwpIHdpdGggaWQtZHNhLXdpdGgtc2hhMS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT47IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgQm9kbyBNb2VsbGVyXQoKICAqKSBDaGVjayB2YXJpb3VzIFg1MDlfLi4uKCkgcmV0dXJuIHZhbHVlcyBpbiBhcHBzL3JlcS5jLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgRml4IEJBU0U2NCBkZWNvZGUgKEVWUF9EZWNvZGVVcGRhdGUpIGZvciBkYXRhIHdpdGggQ1IvTEYgZW5kZWQgbGluZXM6CiAgICAgYW4gZW5kLW9mLWZpbGUgY29uZGl0aW9uIHdvdWxkIGVycm9ub3VzbHkgYmUgZmxhZ2dlZCwgd2hlbiB0aGUgQ1JMRgogICAgIHdhcyBqdXN0IGF0IHRoZSBlbmQgb2YgYSBwcm9jZXNzZWQgYmxvY2suIFRoZSBidWcgd2FzIGRpc2NvdmVyZWQgd2hlbgogICAgIHByb2Nlc3NpbmcgZGF0YSB0aHJvdWdoIGEgYnVmZmVyaW5nIG1lbW9yeSBCSU8gaGFuZGluZyB0aGUgZGF0YSB0byBhCiAgICAgQkFTRTY0LWRlY29kaW5nIEJJTy4gQnVnIGZ1bmQgYW5kIHBhdGNoIHN1Ym1pdHRlZCBieSBQYXZlbCBUc2Vrb3YKICAgICA8cHRzZWtvdkBzeW50cmV4LmNvbT4gYW5kIE5lZGVsY2hvIFN0YW5ldi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSW1wbGVtZW50IGEgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBhIHZ1bG5lcmFiaWxpdHkgcmVjZW50bHkgZm91bmQKICAgICBpbiBDQkMgY2lwaGVyc3VpdGVzIGluIFNTTCAzLjAvVExTIDEuMDogU2VuZCBhbiBlbXB0eSBmcmFnbWVudAogICAgIGJlZm9yZSBhcHBsaWNhdGlvbiBkYXRhIGNodW5rcyB0byBhdm9pZCB0aGUgdXNlIG9mIGtub3duIElWcwogICAgIHdpdGggZGF0YSBwb3RlbnRpYWxseSBjaG9zZW4gYnkgdGhlIGF0dGFja2VyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBsZW5ndGggY2hlY2tzIGluIHNzbDNfZ2V0X2NsaWVudF9oZWxsbygpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRMUy9TU0wgbGlicmFyeSBidWdmaXg6IHVzZSBzLT5zMy0+aW5fcmVhZF9hcHBfZGF0YSBkaWZmZXJlbnRseQogICAgIHRvIHByZXZlbnQgc3NsM19yZWFkX2ludGVybmFsKCkgZnJvbSBpbmNvcnJlY3RseSBhc3N1bWluZyB0aGF0CiAgICAgc3NsM19yZWFkX2J5dGVzKCkgZm91bmQgYXBwbGljYXRpb24gZGF0YSB3aGlsZSBoYW5kc2hha2UKICAgICBwcm9jZXNzaW5nIHdhcyBlbmFibGVkIHdoZW4gaW4gZmFjdCBzLT5zMy0+aW5fcmVhZF9hcHBfZGF0YSB3YXMKICAgICBtZXJlbHkgYXV0b21hdGljYWxseSBjbGVhcmVkIGR1cmluZyB0aGUgaW5pdGlhbCBoYW5kc2hha2UuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBGaXggb2JqZWN0IGRlZmluaXRpb25zIGZvciBQcml2YXRlIGFuZCBFbnRlcnByaXNlOiB0aGV5IHdlcmUgbm90CiAgICAgcmVjb2duaXplZCBpbiB0aGVpciBzaG9ydG5hbWUgKD1sb3dlcmNhc2UpIHJlcHJlc2VudGF0aW9uLiBFeHRlbmQKICAgICBvYmpfZGF0LnBsIHRvIGlzc3VlIGFuIGVycm9yIHdoZW4gdXNpbmcgdW5kZWZpbmVkIGtleXdvcmRzIGluc3RlYWQKICAgICBvZiBzaWxlbnRseSBpZ25vcmluZyB0aGUgcHJvYmxlbSAoU3Zlbm5pbmcgU29yZW5zZW4KICAgICA8c3NzQHNzcy5kbnNhbGlhcy5uZXQ+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IERIX2dlbmVyYXRlX3BhcmFtZXRlcnMoKSBzbyB0aGF0IGl0IHdvcmtzIGZvciAnbm9uLXN0YW5kYXJkJwogICAgIGdlbmVyYXRvcnMsIGkuZS4gZ2VuZXJhdG9ycyBvdGhlciB0aGFuIDIgYW5kIDUuICAoUHJldmlvdXNseSwgdGhlCiAgICAgY29kZSBkaWQgbm90IHByb3Blcmx5IGluaXRpYWxpc2UgdGhlICdhZGQnIGFuZCAncmVtJyB2YWx1ZXMgdG8KICAgICBCTl9nZW5lcmF0ZV9wcmltZSgpLikKCiAgICAgSW4gdGhlIG5ldyBnZW5lcmFsIGNhc2UsIHdlIGRvIG5vdCBpbnNpc3QgdGhhdCAnZ2VuZXJhdG9yJyBpcwogICAgIGFjdHVhbGx5IGEgcHJpbWl0aXZlIHJvb3Q6IFRoaXMgcmVxdWlyZW1lbnQgaXMgcmF0aGVyIHBvaW50bGVzczsKICAgICBhIGdlbmVyYXRvciBvZiB0aGUgb3JkZXItcSBzdWJncm91cCBpcyBqdXN0IGFzIGdvb2QsIGlmIG5vdAogICAgIGJldHRlci4KICAgICBbQm9kbyBNb2VsbGVyXQogCiAgKikgTWFwIG5ldyBYNTA5IHZlcmlmaWNhdGlvbiBlcnJvcnMgdG8gYWxlcnRzLiBEaXNjb3ZlcmVkIGFuZCBzdWJtaXR0ZWQgYnkKICAgICBUb20gV3UgPHRvbUBhcmNvdC5jb20+LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggc3NsM19wZW5kaW5nKCkgKHNzbC9zM19saWIuYykgdG8gcHJldmVudCBTU0xfcGVuZGluZygpIGZyb20KICAgICByZXR1cm5pbmcgbm9uLXplcm8gYmVmb3JlIHRoZSBkYXRhIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVjZWl2ZWQKICAgICB3aGVuIHVzaW5nIG5vbi1ibG9ja2luZyBJL08uCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBKb2huIEh1Z2hlc10KCiAgKikgU29tZSBvZiB0aGUgY2lwaGVycyBtaXNzZWQgdGhlIHN0cmVuZ3RoIGVudHJ5IChTU0xfTE9XIGV0YykuCiAgICAgW0JlbiBMYXVyaWUsIEx1dHogSmFlbmlja2VdCgogICopIEZpeCBidWcgaW4gU1NMX2NsZWFyKCk6IGJhZCBzZXNzaW9ucyB3ZXJlIG5vdCByZW1vdmVkIChmb3VuZCBieQogICAgIFlvcmFtIFphaGF2aSA8WW9yYW1aQGdpbGlhbi5jb20+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQWRkIGluZm9ybWF0aW9uIGFib3V0IEN5Z1dpbiAxLjMgYW5kIG9uLCBhbmQgcHJlc2VydmUgcHJvcGVyCiAgICAgY29uZmlndXJhdGlvbiBmb3IgdGhlIHZlcnNpb25zIGJlZm9yZSB0aGF0LgogICAgIFtDb3Jpbm5hIFZpbnNjaGVuIDx2aW5zY2hlbkByZWRoYXQuY29tPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIHJlbW92YWwgZnJvbSBzZXNzaW9uIGNhY2hlIChTU0xfQ1RYX3JlbW92ZV9zZXNzaW9uKCkpIG1vcmUgcm9idXN0OgogICAgIGNoZWNrIHdoZXRoZXIgd2UgZGVhbCB3aXRoIGEgY29weSBvZiBhIHNlc3Npb24gYW5kIGRvIG5vdCBkZWxldGUgZnJvbQogICAgIHRoZSBjYWNoZSBpbiB0aGlzIGNhc2UuIFByb2JsZW0gcmVwb3J0ZWQgYnkgIkl6aGFyIFNob3NoYW5pIExldmkiCiAgICAgPGl6aGFyQGNoZWNrcG9pbnQuY29tPi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRG8gbm90IHN0b3JlIHNlc3Npb24gZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCBzZXNzaW9uIGNhY2hlLCBpZiBpdAogICAgIGlzIG5ldmVyIGludGVuZGVkIHRvIGJlIGxvb2tlZCB1cCAoU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfTE9PS1VQCiAgICAgZmxhZyBpcyBzZXQpLiBQcm9wb3NlZCBieSBBc2xhbSA8YXNsYW1AZnVuay5jb20+LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBIYXZlIEFTTjFfQklUX1NUUklOR19zZXRfYml0KCkgcmVhbGx5IGNsZWFyIGEgYml0IHdoZW4gdGhlIHJlcXVlc3RlZAogICAgIHZhbHVlIGlzIDAuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgW0luIDAuOS42ZC1lbmdpbmUgcmVsZWFzZTpdCiAgICAgRml4IGEgY3Jhc2hidWcgYW5kIGEgbG9naWMgYnVnIGluIGh3Y3Joa19sb2FkX3B1YmtleSgpLgogICAgIFtUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBjb25maWd1cmF0aW9uIHRhcmdldCBsaW51eC1zMzkweC4KICAgICBbTmVhbGUgRmVyZ3Vzb24gPE5lYWxlLkZlcmd1c29uQFNvZnR3YXJlQUctVVNBLmNvbT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVGhlIGVhcmxpZXIgYnVnZml4IGZvciB0aGUgU1NMM19TVF9TV19IRUxMT19SRVFfQyBjYXNlIG9mCiAgICAgc3NsM19hY2NlcHQgKHNzbC9zM19zcnZyLmMpIGluY29ycmVjdGx5IHVzZWQgYSBsb2NhbCBmbGFnCiAgICAgdmFyaWFibGUgYXMgYW4gaW5kaWNhdGlvbiB0aGF0IGEgQ2xpZW50SGVsbG8gbWVzc2FnZSBoYXMgYmVlbgogICAgIHJlY2VpdmVkLiAgQXMgdGhlIGZsYWcgdmFsdWUgd2lsbCBiZSBsb3N0IGJldHdlZW4gbXVsdGlwbGUKICAgICBpbnZvY2F0aW9ucyBvZiBzc2wzX2FjY2VwdCB3aGVuIHVzaW5nIG5vbi1ibG9ja2luZyBJL08sIHRoZQogICAgIGZ1bmN0aW9uIG1heSBub3QgYmUgYXdhcmUgdGhhdCBhIGhhbmRzaGFrZSBoYXMgYWN0dWFsbHkgdGFrZW4KICAgICBwbGFjZSwgdGh1cyBwcmV2ZW50aW5nIGEgbmV3IHNlc3Npb24gZnJvbSBiZWluZyBhZGRlZCB0byB0aGUKICAgICBzZXNzaW9uIGNhY2hlLgoKICAgICBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIG5vdyBzZXQgcy0+bmV3X3Nlc3Npb24gdG8gMiBpbnN0ZWFkIG9mCiAgICAgdXNpbmcgYSBsb2NhbCB2YXJpYWJsZS4KICAgICBbTHV0eiBKYWVuaWNrZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXg6IFJldHVybiAtMSBmcm9tIHNzbDNfZ2V0X3NlcnZlcl9kb25lIChzc2wzL3MzX2NsbnQuYykKICAgICBpZiB0aGUgU1NMX1JfTEVOR1RIX01JU01BVENIIGVycm9yIGlzIGRldGVjdGVkLgogICAgIFtHZW9mZiBUaG9ycGUsIEJvZG8gTW9lbGxlcl0KCiAgKikgTmV3ICdzaGFyZWRfbGRmbGFnJyBjb2x1bW4gaW4gQ29uZmlndXJlIHBsYXRmb3JtIHRhYmxlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBFVlBfQ0lQSEVSX21vZGUgbWFjcm8uCiAgICAgWyJEYW4gUy4gQ2FtcGVyIiA8ZGFuQGJ0aS5uZXQ+XQoKICAqKSBGaXggc3NsM19yZWFkX2J5dGVzIChzc2wvczNfcGt0LmMpOiBUbyBpZ25vcmUgbWVzc2FnZXMgb2YgdW5rbm93bgogICAgIHR5cGUsIHdlIG11c3QgdGhyb3cgdGhlbSBhd2F5IGJ5IHNldHRpbmcgcnItPmxlbmd0aCB0byAwLgogICAgIFtEIFAgQ2hhbmcgPGRwY0BxdWFseXMuY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZiIGFuZCAwLjkuNmMgIFsyMSBkZWMgMjAwMV0KCiAgKikgRml4IEJOX3JhbmRfcmFuZ2UgYnVnIHBvaW50ZWQgb3V0IGJ5IERvbWluaWt1cyBTY2hlcmtsCiAgICAgPERvbWluaWt1cy5TY2hlcmtsQGJpb2RhdGEuY29tPi4gIChUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24KICAgICB3b3JrZWQgaW5jb3JyZWN0bHkgZm9yIHRob3NlIGNhc2VzIHdoZXJlICByYW5nZSA9IDEwLi4uXzIgIGFuZAogICAgIDMqcmFuZ2UgIGlzIHR3byBiaXRzIGxvbmdlciB0aGFuICByYW5nZS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgT25seSBhZGQgc2lnbmluZyB0aW1lIHRvIFBLQ1M3IHN0cnVjdHVyZXMgaWYgaXQgaXMgbm90IGFscmVhZHkKICAgICBwcmVzZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBjcnlwdG8vb2JqZWN0cy9vYmplY3RzLmg6ICJsZC1jZSIgc2hvdWxkIGJlICJpZC1jZSIsCiAgICAgT0JKX2xkX2NlIHNob3VsZCBiZSBPQkpfaWRfY2UuCiAgICAgQWxzbyBzb21lIGlwLXBkYSBPSURzIGluIGNyeXB0by9vYmplY3RzL29iamVjdHMudHh0IHdlcmUKICAgICBpbmNvcnJlY3QgKGNmLiBSRkMgMzAzOSkuCiAgICAgW01hdHQgQ29vcGVyLCBGcmVkZXJpYyBHaXVkaWNlbGxpLCBCb2RvIE1vZWxsZXJdCgogICopIFJlbGVhc2UgQ1JZUFRPX0xPQ0tfRFlOTE9DSyB3aGVuIENSWVBUT19kZXN0cm95X2R5bmxvY2tpZCgpCiAgICAgcmV0dXJucyBlYXJseSBiZWNhdXNlIGl0IGhhcyBub3RoaW5nIHRvIGRvLgogICAgIFtBbmR5IFNjaG5laWRlciA8YW5keS5zY2huZWlkZXJAYmpzcy5jby51az5dCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEZpeCBtdXRleCBjYWxsYmFjayByZXR1cm4gdmFsdWVzIGluIGNyeXB0by9lbmdpbmUvaHdfbmNpcGhlci5jLgogICAgIFtBbmR5IFNjaG5laWRlciA8YW5keS5zY2huZWlkZXJAYmpzcy5jby51az5dCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEFkZCBzdXBwb3J0IGZvciBDcnlwdG9ncmFwaGljIEFwcGxpYW5jZSdzIGtleXNlcnZlciB0ZWNobm9sb2d5LgogICAgIChVc2UgZW5naW5lICdrZXljbGllbnQnKQogICAgIFtDcnlwdG9ncmFwaGljIEFwcGxpYW5jZXMgYW5kIEdlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGEgY29uZmlndXJhdGlvbiBlbnRyeSBmb3IgT1MvMzkwIFVuaXguICBUaGUgQyBjb21waWxlciAnYzg5JwogICAgIGlzIGNhbGxlZCB2aWEgdG9vbHMvYzg5LnNoIGJlY2F1c2UgYXJndW1lbnRzIGhhdmUgdG8gYmUKICAgICByZWFycmFuZ2VkIChhbGwgJy1MJyBvcHRpb25zIG11c3QgYXBwZWFyIGJlZm9yZSB0aGUgZmlyc3Qgb2JqZWN0CiAgICAgbW9kdWxlcykuCiAgICAgW1JpY2hhcmQgU2hhcGlybyA8cnNoYXBpcm9AYWJpbml0aW8uY29tPl0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgQWRkIHN1cHBvcnQgZm9yIEJyb2FkY29tIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcywgYmFja3BvcnRlZAogICAgIGZyb20gMC45LjcuCiAgICAgW0Jyb2FkY29tLCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+LCBNYXJrIENveF0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgQWRkIHN1cHBvcnQgZm9yIFN1cmVXYXJlIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcyBmcm9tIAogICAgIEJhbHRpbW9yZSBUZWNobm9sb2dpZXMuICAoVXNlIGVuZ2luZSAnc3VyZXdhcmUnKQogICAgIFtCYWx0aW1vcmUgVGVjaG5vbG9naWVzIGFuZCBNYXJrIENveF0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgQWRkIHN1cHBvcnQgZm9yIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcyBmcm9tIEFjY2VsZXJhdGVkCiAgICAgRW5jcnlwdGlvbiBQcm9jZXNzaW5nLCB3d3cuYWVwLmllLiAgKFVzZSBlbmdpbmUgJ2FlcCcpCiAgICAgW0FFUCBJbmMuIGFuZCBNYXJrIENveF0KCiAgKikgQWRkIGEgY29uZmlndXJhdGlvbiBlbnRyeSBmb3IgZ2NjIG9uIFVuaXhXYXJlLgogICAgIFtHYXJ5IEJlbnNvbiA8Z2JlbnNvbkByZWRoYXQuY29tPl0KCiAgKikgQ2hhbmdlIHNzbC9zMl9jbG50LmMgYW5kIHNzbC9zMl9zcnZyLmMgc28gdGhhdCByZWNlaXZlZCBoYW5kc2hha2UKICAgICBtZXNzYWdlcyBhcmUgc3RvcmVkIGluIGEgc2luZ2xlIHBpZWNlIChmaXhlZC1sZW5ndGggcGFydCBhbmQKICAgICB2YXJpYWJsZS1sZW5ndGggcGFydCBjb21iaW5lZCkgYW5kIGZpeCB2YXJpb3VzIGJ1Z3MgZm91bmQgb24gdGhlIHdheS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEaXNhYmxlIGNhY2hpbmcgaW4gQklPX2dldGhvc3RieW5hbWUoKSwgZGlyZWN0bHkgdXNlIGdldGhvc3RieW5hbWUoKQogICAgIGluc3RlYWQuICBCSU9fZ2V0aG9zdGJ5bmFtZSgpIGRvZXMgbm90IGtub3cgd2hhdCB0aW1lb3V0cyBhcmUKICAgICBhcHByb3ByaWF0ZSwgc28gZW50cmllcyB3b3VsZCBzdGF5IGluIGNhY2hlIGV2ZW4gd2hlbiB0aGV5IGhhdmUKICAgICBiZWNvbWUgaW52YWxpZC4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IFJpY2ggU2FseiA8cnNhbHpAem9sZXJhLmNvbT4KCiAgKikgQ2hhbmdlIHNzbDIzX2dldF9jbGllbnRfaGVsbG8gKHNzbC9zMjNfc3J2ci5jKSBiZWhhdmlvdXIgd2hlbgogICAgIGZhY2VkIHdpdGggYSBwYXRob2xvZ2ljYWxseSBzbWFsbCBDbGllbnRIZWxsbyBmcmFnbWVudCB0aGF0IGRvZXMKICAgICBub3QgY29udGFpbiBjbGllbnRfdmVyc2lvbjogSW5zdGVhZCBvZiBhYm9ydGluZyB3aXRoIGFuIGVycm9yLAogICAgIHNpbXBseSBjaG9vc2UgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHByb3RvY29sIHZlcnNpb24gKGkuZS4sCiAgICAgVExTIDEuMCB1bmxlc3MgaXQgaXMgZGlzYWJsZWQpLiAgSW4gcHJhY3RpY2UsIENsaWVudEhlbGxvCiAgICAgbWVzc2FnZXMgYXJlIG5ldmVyIHNlbnQgbGlrZSB0aGlzLCBidXQgdGhpcyBjaGFuZ2UgZ2l2ZXMgdXMKICAgICBzdHJpY3RseSBjb3JyZWN0IGJlaGF2aW91ciBhdCBsZWFzdCBmb3IgVExTLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBTU0wgaGFuZHNoYWtlIGZ1bmN0aW9ucyBhbmQgU1NMX2NsZWFyKCkgc3VjaCB0aGF0IFNTTF9jbGVhcigpCiAgICAgbmV2ZXIgcmVzZXRzIHMtPm1ldGhvZCB0byBzLT5jdHgtPm1ldGhvZCB3aGVuIGNhbGxlZCBmcm9tIHdpdGhpbgogICAgIG9uZSBvZiB0aGUgU1NMIGhhbmRzaGFrZSBmdW5jdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBOaWtvIEJhcmljXQoKICAqKSBJbiBzc2wzX2dldF9jbGllbnRfaGVsbG8gKHNzbC9zM19zcnZyLmMpLCBnZW5lcmF0ZSBhIGZhdGFsIGFsZXJ0CiAgICAgKHNlbnQgdXNpbmcgdGhlIGNsaWVudCdzIHZlcnNpb24gbnVtYmVyKSBpZiBjbGllbnRfdmVyc2lvbiBpcwogICAgIHNtYWxsZXIgdGhhbiB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpbiB1c2UuICBBbHNvIGNoYW5nZQogICAgIHNzbDIzX2dldF9jbGllbnRfaGVsbG8gKHNzbC9zMjNfc3J2ci5jKSB0byBzZWxlY3QgVExTIDEuMCBpZgogICAgIHRoZSBjbGllbnQgZGVtYW5kZWQgU1NMIDMuMCBidXQgb25seSBUTFMgMS4wIGlzIGVuYWJsZWQ7IHRoZW4KICAgICB0aGUgY2xpZW50IHdpbGwgYXQgbGVhc3Qgc2VlIHRoYXQgYWxlcnQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHNzbDNfZ2V0X21lc3NhZ2UgKHNzbC9zM19ib3RoLmMpIHRvIGhhbmRsZSBtZXNzYWdlIGZyYWdtZW50YXRpb24KICAgICBjb3JyZWN0bHkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQXZvaWQgaW5maW5pdGUgbG9vcCBpbiBzc2wzX2dldF9tZXNzYWdlIChzc2wvczNfYm90aC5jKSBpZiBhCiAgICAgY2xpZW50IHJlY2VpdmVzIEhlbGxvUmVxdWVzdCB3aGlsZSBpbiBhIGhhbmRzaGFrZS4KICAgICBbQm9kbyBNb2VsbGVyOyBidWcgbm90aWNlZCBieSBBbmR5IFNjaG5laWRlciA8YW5keS5zY2huZWlkZXJAYmpzcy5jby51az5dCgogICopIEJ1Z2ZpeCBpbiBzc2wzX2FjY2VwdCAoc3NsL3MzX3NydnIuYyk6IENhc2UgU1NMM19TVF9TV19IRUxMT19SRVFfQwogICAgIHNob3VsZCBlbmQgaW4gJ2JyZWFrJywgbm90ICdnb3RvIGVuZCcgd2hpY2ggY2lyY3VtdmVudHMgdmFyaW91cwogICAgIGNsZWFudXBzIGRvbmUgaW4gc3RhdGUgU1NMX1NUX09LLiAgIEJ1dCBzZXNzaW9uIHJlbGF0ZWQgc3R1ZmYKICAgICBtdXN0IGJlIGRpc2FibGVkIGZvciBTU0xfU1RfT0sgaW4gdGhlIGNhc2UgdGhhdCB3ZSBqdXN0IHNlbnQgYQogICAgIEhlbGxvUmVxdWVzdC4KCiAgICAgQWxzbyBhdm9pZCBzb21lIG92ZXJoZWFkIGJ5IG5vdCBjYWxsaW5nIHNzbF9pbml0X3diaW9fYnVmZmVyKCkKICAgICBiZWZvcmUganVzdCBzZW5kaW5nIGEgSGVsbG9SZXF1ZXN0LgogICAgIFtCb2RvIE1vZWxsZXIsIEVyaWMgUmVzY29ybGEgPGVrckBydGZtLmNvbT5dCgogICopIEZpeCBzc2wvczNfZW5jLmMsIHNzbC90MV9lbmMuYyBhbmQgc3NsL3MzX3BrdC5jIHNvIHRoYXQgd2UgZG9uJ3QKICAgICByZXZlYWwgd2hldGhlciBpbGxlZ2FsIGJsb2NrIGNpcGhlciBwYWRkaW5nIHdhcyBmb3VuZCBvciBhIE1BQwogICAgIHZlcmlmaWNhdGlvbiBlcnJvciBvY2N1cmVkLiAgKE5laXRoZXIgU1NMZXJyKCkgY29kZXMgbm9yIGFsZXJ0cwogICAgIGFyZSBkaXJlY3RseSB2aXNpYmxlIHRvIHBvdGVudGlhbCBhdHRhY2tlcnMsIGJ1dCB0aGUgaW5mb3JtYXRpb24KICAgICBtYXkgbGVhayB2aWEgbG9nZmlsZXMuKQoKICAgICBTaW1pbGFyIGNoYW5nZXMgYXJlIG5vdCByZXF1aXJlZCBmb3IgdGhlIFNTTCAyLjAgaW1wbGVtZW50YXRpb24KICAgICBiZWNhdXNlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpcyBzZW50IGluIGNsZWFyIGZvciBTU0wgMi4wLAogICAgIGFuZCB0aGUgZXh0cmEgYnl0ZXMgYXJlIGp1c3QgaWdub3JlZC4gIEhvd2V2ZXIgc3NsL3MyX3BrdC5jCiAgICAgZmFpbGVkIHRvIHZlcmlmeSB0aGF0IHRoZSBwdXJwb3J0ZWQgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaXMgaW4KICAgICB0aGUgbGVnYWwgcmFuZ2UuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIE9wZW5VTklYLTggc3VwcG9ydCBpbmNsdWRpbmcgc2hhcmVkIGxpYnJhcmllcwogICAgIChCb3lkIEx5bm4gR2VyYmVyIDxnZXJiZXJiQHplbmV6LmNvbT4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBJbXByb3ZlIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX09BRVAoKSBjaGVjayBhZ2FpbiB0byBhdm9pZAogICAgICd3cmlzdHdhdGNoIGF0dGFjaycgdXNpbmcgaHVnZSBlbmNvZGluZyBwYXJhbWV0ZXJzIChjZi4KICAgICBKYW1lcyBILiBNYW5nZXIncyBDUllQVE8gMjAwMSBwYXBlcikuICBOb3RlIHRoYXQgdGhlCiAgICAgUlNBX1BLQ1MxX09BRVBfUEFERElORyBjYXNlIG9mIFJTQV9wcml2YXRlX2RlY3J5cHQoKSBkb2VzIG5vdCB1c2UKICAgICBlbmNvZGluZyBwYXJhbWV0ZXJzIGFuZCBoZW5jZSB3YXMgbm90IHZ1bG5lcmFibGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQk5fc3FyKCkgYnVnIGZpeC4KICAgICBbVWxmIE32bGxlciwgcmVwb3J0ZWQgYnkgSmltIEVsbGlzIDxqaW0uZWxsaXNAY2F2aXVtLmNvbT5dCgogICopIFJhYmluLU1pbGxlciB0ZXN0IGFuYWx5c2VzIGFzc3VtZSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgd2l0bmVzc2VzLAogICAgIHNvIHVzZSBCTl9wc2V1ZG9fcmFuZF9yYW5nZSgpIGluc3RlYWQgb2YgdXNpbmcgQk5fcHNldWRvX3JhbmQoKQogICAgIGZvbGxvd2VkIGJ5IG1vZHVsYXIgcmVkdWN0aW9uLgogICAgIFtCb2RvIE1vZWxsZXI7IHBvaW50ZWQgb3V0IGJ5IEFkYW0gWW91bmcgPEFZb3VuZzFATkNTVVMuSk5KLkNPTT5dCgogICopIEFkZCBCTl9wc2V1ZG9fcmFuZF9yYW5nZSgpIHdpdGggb2J2aW91cyBmdW5jdGlvbmFsaXR5OiBCTl9yYW5kX3JhbmdlKCkKICAgICBlcXVpdmFsZW50IGJhc2VkIG9uIEJOX3BzZXVkb19yYW5kKCkgaW5zdGVhZCBvZiBCTl9yYW5kKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgczNfc3J2ci5jOiBhbGxvdyBzZW5kaW5nIG9mIGxhcmdlIGNsaWVudCBjZXJ0aWZpY2F0ZSBsaXN0cyAoPiAxNiBrQikuCiAgICAgVGhpcyBmdW5jdGlvbiB3YXMgYnJva2VuLCBhcyB0aGUgY2hlY2sgZm9yIGEgbmV3IGNsaWVudCBoZWxsbyBtZXNzYWdlCiAgICAgdG8gaGFuZGxlIFNHQyBkaWQgbm90IGFsbG93IHRoZXNlIGxhcmdlIG1lc3NhZ2VzLgogICAgIChUcmFja2VkIGRvd24gYnkgIkRvdWdsYXMgRS4gRW5nZXJ0IiA8ZGVlbmdlcnRAYW5sLmdvdj4uKQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgYWxlcnQgZGVzY3JpcHRpb25zIGZvciBUTFN2MSB0byBTU0xfYWxlcnRfZGVzY19zdHJpbmdbX2xvbmddKCkuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBidWdneSBiZWhhdmlvdXIgb2YgQklPX2dldF9udW1fcmVuZWdvdGlhdGVzKCkgYW5kIEJJT19jdHJsKCkKICAgICBmb3IgQklPX0NfR0VUX1dSSVRFX0JVRl9TSVpFICgiU3RlcGhlbiBIaW50b24iIDxzaGludG9uQG5ldG9waWEuY29tPikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIFJld29yayB0aGUgY29uZmlndXJhdGlvbiBhbmQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBmb3IgVHJ1NjQgVW5peC4KICAgICBUaGUgY29uZmlndXJhdGlvbiBwYXJ0IG1ha2VzIHVzZSBvZiBtb2Rlcm4gY29tcGlsZXIgZmVhdHVyZXMgYW5kCiAgICAgc3RpbGwgcmV0YWlucyBvbGQgY29tcGlsZXIgYmVoYXZpb3IgZm9yIHRob3NlIHRoYXQgcnVuIG9sZGVyIHZlcnNpb25zCiAgICAgb2YgdGhlIE9TLiAgVGhlIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcGFydCBpbmNsdWRlcyBhIHZhcmlhbnQgdGhhdAogICAgIHVzZXMgdGhlIFJQQVRIIGZlYXR1cmUsIGFuZCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgc3BlY2lhbAogICAgIGNvbmZpZ3VyYXRpb24gdGFyZ2V0ICJhbHBoYS1jYy1ycGF0aCIsIHdoaWNoIHdpbGwgbmV2ZXIgYmUgc2VsZWN0ZWQKICAgICBhdXRvbWF0aWNhbGx5LgogICAgIFtUaW0gTW9vbmV5IDxtb29uZXlAZG9nYmVydC5jYy5uZHN1Lk5vRGFrLmVkdT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gc3NsM19nZXRfa2V5X2V4Y2hhbmdlIChzc2wvczNfY2xudC5jKSwgY2FsbCBzc2wzX2dldF9tZXNzYWdlKCkKICAgICB3aXRoIHRoZSBzYW1lIG1lc3NhZ2Ugc2l6ZSBhcyBpbiBzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KCkuCiAgICAgT3RoZXJ3aXNlLCBpZiBubyBTZXJ2ZXJLZXlFeGNoYW5nZSBtZXNzYWdlIG9jY3VycywgQ2VydGlmaWNhdGVSZXF1ZXN0CiAgICAgbWVzc2FnZXMgbWlnaHQgaW5hZHZlcnRlbnRseSBiZSByZWplY3QgYXMgdG9vIGxvbmcuCiAgICAgW1BldHIgTGFtcGEgPGxhbXBhQGZlZS52dXRici5jej5dCgogICopIEVuaGFuY2VkIHN1cHBvcnQgZm9yIElBLTY0IFVuaXggcGxhdGZvcm1zICh3ZWxsLCBMaW51eCBhbmQgSFAtVVgpLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBNb2RpZmllZCBTU0wgbGlicmFyeSBzdWNoIHRoYXQgdGhlIHZlcmlmeV9jYWxsYmFjayB0aGF0IGhhcyBiZWVuIHNldAogICAgIHNwZWNpZmljbHkgZm9yIGFuIFNTTCBvYmplY3Qgd2l0aCBTU0xfc2V0X3ZlcmlmeSgpIGlzIGFjdHVhbGx5IGJlaW5nCiAgICAgdXNlZC4gQmVmb3JlIHRoZSBjaGFuZ2UsIGEgdmVyaWZ5X2NhbGxiYWNrIHNldCB3aXRoIHRoaXMgZnVuY3Rpb24gd2FzCiAgICAgaWdub3JlZCBhbmQgdGhlIHZlcmlmeV9jYWxsYmFjaygpIHNldCBpbiB0aGUgU1NMX0NUWCBhdCB0aGUgdGltZSBvZgogICAgIHRoZSBjYWxsIHdhcyB1c2VkLiBOZXcgZnVuY3Rpb24gWDUwOV9TVE9SRV9DVFhfc2V0X3ZlcmlmeV9jYigpIGludHJvZHVjZWQKICAgICB0byBhbGxvdyB0aGUgbmVjZXNzYXJ5IHNldHRpbmdzLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBJbml0aWFsaXplIHN0YXRpYyB2YXJpYWJsZSBpbiBjcnlwdG8vZHNhL2RzYV9saWIuYyBhbmQgY3J5cHRvL2RoL2RoX2xpYi5jCiAgICAgZXhwbGljaXRseSB0byBOVUxMLCBhcyBhdCBsZWFzdCBvbiBTb2xhcmlzIDggdGhpcyBzZWVtcyBub3QgYWx3YXlzIHRvIGJlCiAgICAgZG9uZSBhdXRvbWF0aWNhbGx5IChpbiBjb250cmFkaWN0aW9uIHRvIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIEMKICAgICBzdGFuZGFyZCkuIFRoaXMgbWFkZSBwcm9ibGVtcyB3aGVuIHVzZWQgZnJvbSBPcGVuU1NILgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBJbiBPcGVuU1NMIDAuOS42YSBhbmQgMC45LjZiLCBjcnlwdG8vZGgvZGhfa2V5LmMgaWdub3JlZAogICAgIGRoLT5sZW5ndGggYW5kIGFsd2F5cyB1c2VkCgogICAgICAgICAgQk5fcmFuZF9yYW5nZShwcml2X2tleSwgZGgtPnApLgoKICAgICBCTl9yYW5kX3JhbmdlKCkgaXMgbm90IG5lY2Vzc2FyeSBmb3IgRGlmZmllLUhlbGxtYW4sIGFuZCB0aGlzCiAgICAgc3BlY2lmaWMgcmFuZ2UgbWFrZXMgRGlmZmllLUhlbGxtYW4gdW5uZWNlc3NhcmlseSBpbmVmZmljaWVudCBpZgogICAgIGRoLT5sZW5ndGggKHJlY29tbWVuZGVkIGV4cG9uZW50IGxlbmd0aCkgaXMgbXVjaCBzbWFsbGVyIHRoYW4gdGhlCiAgICAgbGVuZ3RoIG9mIGRoLT5wLiAgV2UgY291bGQgdXNlIEJOX3JhbmRfcmFuZ2UoKSBpZiB0aGUgb3JkZXIgb2YKICAgICB0aGUgc3ViZ3JvdXAgd2FzIHN0b3JlZCBpbiB0aGUgREggc3RydWN0dXJlLCBidXQgd2Ugb25seSBoYXZlCiAgICAgZGgtPmxlbmd0aC4KCiAgICAgU28gc3dpdGNoIGJhY2sgdG8KCiAgICAgICAgICBCTl9yYW5kKHByaXZfa2V5LCBsLCAuLi4pCgogICAgIHdoZXJlICdsJyBpcyBkaC0+bGVuZ3RoIGlmIHRoaXMgaXMgZGVmaW5lZCwgb3IgQk5fbnVtX2JpdHMoZGgtPnApLTEKICAgICBvdGhlcndpc2UuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4KCiAgICAgICAgICBSU0FfZWF5X3B1YmxpY19lbmNyeXB0CiAgICAgICAgICBSU0FfZWF5X3ByaXZhdGVfZGVjcnlwdAogICAgICAgICAgUlNBX2VheV9wcml2YXRlX2VuY3J5cHQgKHNpZ25pbmcpCiAgICAgICAgICBSU0FfZWF5X3B1YmxpY19kZWNyeXB0IChzaWduYXR1cmUgdmVyaWZpY2F0aW9uKQoKICAgICAoZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgZm9yIFJTQV9wdWJsaWNfZW5jcnlwdCwKICAgICBSU0FfcHJpdmF0ZV9kZWNyeXB0LCBSU0FfcHJpdmF0ZV9lbmNyeXB0LCBSU0FfcHVibGljX2RlY3J5cHQpLAogICAgIGFsd2F5cyByZWplY3QgbnVtYmVycyA+PSBuLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIGNyeXB0by9yYW5kL21kX3JhbmQuYywgdXNlIGEgbmV3IHNob3J0LXRpbWUgbG9jayBDUllQVE9fTE9DS19SQU5EMgogICAgIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byAnbG9ja2luZ190aHJlYWQnLiAgVGhpcyBpcyBuZWNlc3Nhcnkgb24KICAgICBzeXN0ZW1zIHdoZXJlIGFjY2VzcyB0byAnbG9ja2luZ190aHJlYWQnIChhbiAndW5zaWduZWQgbG9uZycKICAgICB2YXJpYWJsZSkgaXMgbm90IGF0b21pYy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBjcnlwdG8vcmFuZC9tZF9yYW5kLmMsIHNldCAnbG9ja2luZ190aHJlYWQnIHRvIGN1cnJlbnQgdGhyZWFkJ3MgSUQKICAgICAqYmVmb3JlKiBzZXR0aW5nIHRoZSAnY3J5cHRvX2xvY2tfcmFuZCcgZmxhZy4gIFRoZSBwcmV2aW91cyBjb2RlIGhhZAogICAgIGEgcmFjZSBjb25kaXRpb24gaWYgMCBpcyBhIHZhbGlkIHRocmVhZCBJRC4KICAgICBbVHJhdmlzIFZpdGVrIDx2aXRla0Byb2d1ZXdhdmUuY29tPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgdW5kZXIgSXJpeC4KICAgICBbQWxiZXJ0IENoaW4tQS1Zb3VuZyA8Y2hpbmFAdGhld3JpdHRlbndvcmQuY29tPl0KCiAgKikgQWRkIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGJ1aWxkIG9uIExpbnV4IG9uIGJvdGggYmlnLWVuZGlhbiBhbmQKICAgICBsaXR0bGUtZW5kaWFuIE1JUFMuCiAgICAgW1JhbGYgQmFlY2hsZSA8cmFsZkB1bmkta29ibGVuei5kZT5dCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gSFAtVVguCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZhIGFuZCAwLjkuNmIgIFs5IEp1bCAyMDAxXQoKICAqKSBDaGFuZ2Ugc3NsZWF5X3JhbmRfYnl0ZXMgKGNyeXB0by9yYW5kL21kX3JhbmQuYykKICAgICB0byBhdm9pZCBhIFNTTGVheS9PcGVuU1NMIFBSTkcgd2Vha25lc3MgcG9pbnRlZCBvdXQgYnkKICAgICBNYXJra3UtSnVoYW5pIE8uIFNhYXJpbmVuIDxtYXJra3UtanVoYW5pLnNhYXJpbmVuQG5va2lhLmNvbT46CiAgICAgUFJORyBzdGF0ZSByZWNvdmVyeSB3YXMgcG9zc2libGUgYmFzZWQgb24gdGhlIG91dHB1dCBvZgogICAgIG9uZSBQUk5HIHJlcXVlc3QgYXBwcm9wcmlhdGVseSBzaXplZCB0byBnYWluIGtub3dsZWRnZSBvbgogICAgICdtZCcgZm9sbG93ZWQgYnkgZW5vdWdoIGNvbnNlY3V0aXZlIDEtYnl0ZSBQUk5HIHJlcXVlc3RzCiAgICAgdG8gdHJhdmVyc2UgYWxsIG9mICdzdGF0ZScuCgogICAgIDEuIFdoZW4gdXBkYXRpbmcgJ21kX2xvY2FsJyAodGhlIGN1cnJlbnQgdGhyZWFkJ3MgY29weSBvZiAnbWQnKQogICAgICAgIGR1cmluZyBQUk5HIG91dHB1dCBnZW5lcmF0aW9uLCBoYXNoIGFsbCBvZiB0aGUgcHJldmlvdXMKICAgICAgICAnbWRfbG9jYWwnIHZhbHVlLCBub3QganVzdCB0aGUgaGFsZiB1c2VkIGZvciBQUk5HIG91dHB1dC4KCiAgICAgMi4gTWFrZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gJ3N0YXRlJyBpbmNsdWRlZCBpbnRvIHRoZSBoYXNoCiAgICAgICAgaW5kZXBlbmRlbnQgZnJvbSB0aGUgbnVtYmVyIG9mIFBSTkcgYnl0ZXMgcmVxdWVzdGVkLgoKICAgICBUaGUgZmlyc3QgbWVhc3VyZSBhbG9uZSB3b3VsZCBiZSBzdWZmaWNpZW50IHRvIGF2b2lkCiAgICAgTWFya2t1LUp1aGFuaSdzIGF0dGFjay4gIChBY3R1YWxseSBpdCBoYWQgbmV2ZXIgb2NjdXJyZWQKICAgICB0byBtZSB0aGF0IHRoZSBoYWxmIG9mICdtZF9sb2NhbCcgdXNlZCBmb3IgY2hhaW5pbmcgd2FzIHRoZQogICAgIGhhbGYgZnJvbSB3aGljaCBQUk5HIG91dHB1dCBieXRlcyB3ZXJlIHRha2VuIC0tIEkgaGFkIGFsd2F5cwogICAgIGFzc3VtZWQgdGhhdCB0aGUgc2VjcmV0IGhhbGYgd291bGQgYmUgdXNlZC4pICBUaGUgc2Vjb25kCiAgICAgbWVhc3VyZSBtYWtlcyBzdXJlIHRoYXQgYWRkaXRpb25hbCBkYXRhIGZyb20gJ3N0YXRlJyBpcyBuZXZlcgogICAgIG1peGVkIGludG8gJ21kX2xvY2FsJyBpbiBzbWFsbCBwb3J0aW9uczsgdGhpcyBoZXVyaXN0aWNhbGx5CiAgICAgZnVydGhlciBzdHJlbmd0aGVucyB0aGUgUFJORy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggY3J5cHRvL2JuL2FzbS9taXBzMy5zLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBXaGVuIG9ubHkgdGhlIGtleSBpcyBnaXZlbiB0byAiZW5jIiwgdGhlIElWIGlzIHVuZGVmaW5lZC4gUHJpbnQgb3V0CiAgICAgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGlzIGNhc2UuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEhhbmRsZSBzcGVjaWFsIGNhc2Ugd2hlbiBYNTA5X05BTUUgaXMgZW1wdHkgaW4gWDUwOSBwcmludGluZyByb3V0aW5lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBkc2FfZG9fdmVyaWZ5IChjcnlwdG8vZHNhL2RzYV9vc3NsLmMpLCB2ZXJpZnkgdGhhdCByIGFuZCBzIGFyZQogICAgIHBvc2l0aXZlIGFuZCBsZXNzIHRoYW4gcS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEb24ndCBjaGFuZ2UgKnBvaW50ZXIgaW4gQ1JZUFRPX2FkZF9sb2NrKCkgaXMgYWRkX2xvY2tfY2FsbGJhY2sgaXMKICAgICB1c2VkOiBpdCBpc24ndCB0aHJlYWQgc2FmZSBhbmQgdGhlIGFkZF9sb2NrX2NhbGxiYWNrIHNob3VsZCBoYW5kbGUKICAgICB0aGF0IGl0c2VsZi4KICAgICBbUGF1bCBSb3NlIDxQYXVsLlJvc2VAYnJpZGdlLmNvbT5dCgogICopIFZlcmlmeSB0aGF0IGluY29taW5nIGRhdGEgb2JleXMgdGhlIGJsb2NrIHNpemUgaW4KICAgICBzc2wzX2VuYyAoc3NsL3MzX2VuYy5jKSBhbmQgdGxzMV9lbmMgKHNzbC90MV9lbmMuYykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IE9BRVAgY2hlY2suCiAgICAgW1VsZiBN9mxsZXIsIEJvZG8gTfZsbGVyXQoKICAqKSBUaGUgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBCbGVpY2hiYWNoZXIncyBhdHRhY2sgb24gUEtDUyAjMSB2MS41CiAgICAgUlNBIGVuY3J5cHRpb24gd2FzIGFjY2lkZW50YWxseSByZW1vdmVkIGluIHMzX3NydnIuYyBpbiBPcGVuU1NMIDAuOS41CiAgICAgd2hlbiBmaXhpbmcgdGhlIHNlcnZlciBiZWhhdmlvdXIgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmxlICdjbGllbnQKICAgICBoZWxsbycgbWVzc2FnZXMuICAoTm90ZSB0aGF0IHRoZSBhdHRhY2sgaXMgaW1wcmFjdGljYWwgYWdhaW5zdAogICAgIFNTTCAzLjAgYW5kIFRMUyAxLjAgYW55d2F5IGJlY2F1c2UgbGVuZ3RoIGFuZCB2ZXJzaW9uIGNoZWNraW5nCiAgICAgbWVhbnMgdGhhdCB0aGUgcHJvYmFiaWxpdHkgb2YgZ3Vlc3NpbmcgYSB2YWxpZCBjaXBoZXJ0ZXh0IGlzCiAgICAgYXJvdW5kIDJeLTQwOyBzZWUgc2VjdGlvbiA1IGluIEJsZWljaGVuYmFjaGVyJ3MgQ1JZUFRPICc5OAogICAgIHBhcGVyLikKCiAgICAgQmVmb3JlIDAuOS41LCB0aGUgY291bnRlcm1lYXN1cmUgKGhpZGUgdGhlIGVycm9yIGJ5IGdlbmVyYXRpbmcgYQogICAgIHJhbmRvbSAnZGVjcnlwdGlvbiByZXN1bHQnKSBkaWQgbm90IHdvcmsgcHJvcGVybHkgYmVjYXVzZQogICAgIEVSUl9jbGVhcl9lcnJvcigpIHdhcyBtaXNzaW5nLCBtZWFuaW5nIHRoYXQgU1NMX2dldF9lcnJvcigpIHdvdWxkCiAgICAgZGV0ZWN0IHRoZSBzdXBwb3NlZGx5IGlnbm9yZWQgZXJyb3IuCgogICAgIEJvdGggcHJvYmxlbXMgYXJlIG5vdyBmaXhlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBjcnlwdG8vYmlvL2JmX2J1ZmYuYywgaW5jcmVhc2UgREVGQVVMVF9CVUZGRVJfU0laRSB0byA0MDk2CiAgICAgKHByZXZpb3VzbHkgaXQgd2FzIDEwMjQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBmb3IgY29tcGF0aWJpbGl0eSBtb2RlIHRydXN0IHNldHRpbmdzOiBpZ25vcmUgdHJ1c3Qgc2V0dGluZ3MKICAgICB1bmxlc3Mgc29tZSB2YWxpZCB0cnVzdCBvciByZWplY3Qgc2V0dGluZ3MgYXJlIHByZXNlbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGZvciBibG93ZmlzaCBFVlA6IGl0cyBhIHZhcmlhYmxlIGxlbmd0aCBjaXBoZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHZhcmlvdXMgYnVncyByZWxhdGVkIHRvIERTQSBTL01JTUUgdmVyaWZpY2F0aW9uLiBIYW5kbGUgbWlzc2luZwogICAgIHBhcmFtZXRlcnMgaW4gRFNBIHB1YmxpYyBrZXkgc3RydWN0dXJlcyBhbmQgcmV0dXJuIGFuIGVycm9yIGluIHRoZQogICAgIERTQSByb3V0aW5lcyBpZiBwYXJhbWV0ZXJzIGFyZSBhYnNlbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gdmVyc2lvbnMgdXAgdG8gMC45LjYsIFJBTkRfZmlsZV9uYW1lKCkgcmVzb3J0ZWQgdG8gZmlsZSAiLnJuZCIKICAgICBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgbmVpdGhlciAkUkFOREZJTEUgbm9yICRIT01FIHdhcyBzZXQuCiAgICAgUkFORF9maWxlX25hbWUoKSBpbiAwLjkuNmEgcmV0dXJuZWQgTlVMTCBpbiB0aGlzIGNhc2UuICBUaGlzIGhhcwogICAgIGNhdXNlZCBzb21lIGNvbmZ1c2lvbiB0byBXaW5kb3dzIHVzZXJzIHdobyBoYXZlbid0IGRlZmluZWQgJEhPTUUuCiAgICAgVGh1cyBSQU5EX2ZpbGVfbmFtZSgpIGlzIGNoYW5nZWQgYWdhaW46IGVfb3MuaCBjYW4gZGVmaW5lIGEKICAgICBERUZBVUxUX0hPTUUsIHdoaWNoIHdpbGwgYmUgdXNlZCBpZiAkSE9NRSBpcyBub3Qgc2V0LgogICAgIEZvciBXaW5kb3dzLCB3ZSB1c2UgIkM6Ijsgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBzdGlsbCByZXF1aXJlCiAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLgoKICAqKSBNb3ZlICdpZiAoIWluaXRpYWxpemVkKSBSQU5EX3BvbGwoKScgaW50byByZWdpb25zIHByb3RlY3RlZCBieQogICAgIENSWVBUT19MT0NLX1JBTkQuICBUaGlzIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dCBhdm9pZHMKICAgICBoYXZpbmcgbXVsdGlwbGUgdGhyZWFkcyBjYWxsIFJBTkRfcG9sbCgpIGNvbmN1cnJlbnRseS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBjcnlwdG8vcmFuZC9tZF9yYW5kLmMsIHJlcGxhY2UgJ2FkZF9kb19ub3RfbG9jaycgZmxhZyBieSBhCiAgICAgY29tYmluYXRpb24gb2YgYSBmbGFnIGFuZCBhIHRocmVhZCBJRCB2YXJpYWJsZS4KICAgICBPdGhlcndpc2Ugd2hpbGUgb25lIHRocmVhZCBpcyBpbiBzc2xlYXlfcmFuZF9ieXRlcyAod2hpY2ggc2V0cyB0aGUKICAgICBmbGFnKSwgKm90aGVyKiB0aHJlYWRzIGNhbiBlbnRlciBzc2xlYXlfYWRkX2J5dGVzIHdpdGhvdXQgb2JleWluZwogICAgIHRoZSBDUllQVE9fTE9DS19SQU5EIGxvY2sgKGFuZCBtYXkgZXZlbiBpbGxlZ2FsbHkgcmVsZWFzZSB0aGUgbG9jawogICAgIHRoYXQgdGhleSBkbyBub3QgaG9sZCBhZnRlciB0aGUgZmlyc3QgdGhyZWFkIHVuc2V0cyBhZGRfZG9fbm90X2xvY2spLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBiY3Rlc3QgYWdhaW46ICcteCcgZXhwcmVzc2lvbnMgYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsCiAgICAgdmVyc2lvbnMgb2YgJ3Rlc3QnLgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42IGFuZCAwLjkuNmEgIFs1IEFwciAyMDAxXQoKICAqKSBGaXggYSBjb3VwbGUgb2YgbWVtb3J5IGxlYWtzIGluIFBLQ1M3X2RhdGFEZWNvZGUoKQogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEhleXVuIFpoZW5nIDxoemhlbmdAYXRkc3ByaW50LmNvbT5dCgogICopIENoYW5nZSBDb25maWd1cmUgYW5kIE1ha2VmaWxlcyB0byBwcm92aWRlIEVYRV9FWFQsIHdoaWNoIHdpbGwgY29udGFpbgogICAgIHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgZXhlY3V0YWJsZXMsIGlmIGFueS4gIEFsc28sIG1ha2UgdGhlIHBlcmwKICAgICBzY3JpcHRzIHRoYXQgdXNlIHN5bWxpbmsoKSB0byB0ZXN0IGlmIGl0IHJlYWxseSBleGlzdHMgYW5kIHVzZSAiY3AiCiAgICAgaWYgaXQgZG9lc24ndC4gIEFsbCB0aGlzIG1hZGUgT3BlblNTTCBjb21waWxhYmxlIGFuZCBpbnN0YWxsYWJsZSBpbgogICAgIEN5Z1dpbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggZm9yIGFzbjFfR2V0U2VxdWVuY2UoKSBmb3IgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgZGF0YS4KICAgICBJZiBTRVFVRU5DRSBpcyBsZW5ndGggaXMgaW5kZWZpbml0ZSBqdXN0IHNldCBjLT5zbGVuIHRvIHRoZSB0b3RhbAogICAgIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBzaGlnZUBGcmVlQlNELm9yZ10KICAgICBbVGhpcyBjaGFuZ2UgZG9lcyBub3QgYXBwbHkgdG8gMC45LjcuXQoKICAqKSBDaGFuZ2UgYmN0ZXN0IHRvIGF2b2lkIGhlcmUtZG9jdW1lbnRzIGluc2lkZSBjb21tYW5kIHN1YnN0aXR1dGlvbgogICAgICh3b3JrYXJvdW5kIGZvciBGcmVlQlNEIC9iaW4vc2ggYnVnKS4KICAgICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFVsdHJpeCwgYXZvaWQgc2hlbGwgZnVuY3Rpb25zIChpbnRyb2R1Y2VkCiAgICAgaW4gdGhlIGJjdGVzdCB2ZXJzaW9uIHRoYXQgc2VhcmNoZXMgYWxvbmcgJFBBVEgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlbmFtZSAnZGVzX2VuY3J5cHQnIHRvICdkZXNfZW5jcnlwdDEnLiAgVGhpcyBhdm9pZHMgdGhlIGNsYXNoZXMKICAgICB3aXRoIGRlc19lbmNyeXB0KCkgZGVmaW5lZCBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLCBsaWtlIFNvbGFyaXMKICAgICBhbmQgVW5peFdhcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hlY2sgdGhlIHJlc3VsdCBvZiBSU0EtQ1JUIChzZWUgRC4gQm9uZWgsIFIuIERlTWlsbG8sIFIuIExpcHRvbjoKICAgICBPbiB0aGUgSW1wb3J0YW5jZSBvZiBFbGltaW5hdGluZyBFcnJvcnMgaW4gQ3J5cHRvZ3JhcGhpYwogICAgIENvbXB1dGF0aW9ucywgSi4gQ3J5cHRvbG9neSAxNCAoMjAwMSkgMiwgMTAxLTExOSwKICAgICBodHRwOi8vdGhlb3J5LnN0YW5mb3JkLmVkdS9+ZGFiby9wYXBlcnMvZmF1bHRzLnBzLmd6KS4KICAgICBbVWxmIE1vZWxsZXJdCiAgCiAgKikgTUlQUyBhc3NlbWJsZXIgQklHTlVNIGRpdmlzaW9uIGJ1ZyBmaXguIAogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBEaXNhYmxlZCBpbmNvcnJlY3QgQWxwaGEgYXNzZW1ibGVyIGNvZGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IFBLQ1MjNyBkZWNvZGUgcm91dGluZXMgc28gdGhleSBjb3JyZWN0bHkgdXBkYXRlIHRoZSBsZW5ndGgKICAgICBhZnRlciByZWFkaW5nIGFuIEVPQyBmb3IgdGhlIEVYUExJQ0lUIHRhZy4KICAgICBbU3RldmUgSGVuc29uXQogICAgIFtUaGlzIGNoYW5nZSBkb2VzIG5vdCBhcHBseSB0byAwLjkuNy5dCgogICopIEZpeCBidWcgaW4gUEtDUyMxMiBrZXkgZ2VuZXJhdGlvbiByb3V0aW5lcy4gVGhpcyB3YXMgdHJpZ2dlcmVkCiAgICAgaWYgYSAzREVTIGtleSB3YXMgZ2VuZXJhdGVkIHdpdGggYSAwIGluaXRpYWwgYnl0ZS4gSW5jbHVkZQogICAgIFBLQ1MxMl9CUk9LRU5fS0VZR0VOIGNvbXBpbGF0aW9uIG9wdGlvbiB0byByZXRhaW4gdGhlIG9sZAogICAgIChidXQgYnJva2VuKSBiZWhhdmlvdXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSBiY3Rlc3QgdG8gc2VhcmNoIGZvciBhIHdvcmtpbmcgYmMgYWxvbmcgJFBBVEggYW5kIHByaW50CiAgICAgaXQgd2hlbiBmb3VuZC4KICAgICBbVGltIFJpY2UgPHRpbUBtdWx0aXRhbGVudHMubmV0PiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggbWVtb3J5IGxlYWtzIGluIGVyci5jOiBmcmVlIGVycl9kYXRhIHN0cmluZyBpZiBuZWNlc3Nhcnk7CiAgICAgZG9uJ3Qgd3JpdGUgdG8gdGhlIHdyb25nIGluZGV4IGluIEVSUl9zZXRfZXJyb3JfZGF0YS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbXBsZW1lbnQgc3NsMjNfcGVlayAoYW5hbG9nb3VzIHRvIHNzbDIzX3JlYWQpLCB3aGljaCBwcmV2aW91c2x5CiAgICAgZGlkIG5vdCBleGlzdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZXBsYWNlIHJkdHNjIHdpdGggX2VtaXQgc3RhdGVtZW50cyBmb3IgVkMrKyB2ZXJzaW9uIDUuCiAgICAgW0plcmVteSBDb29wZXIgPGplcmVteUBiYXltb28ub3JnPl0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byByZXVzZSBTU0x2MiBzZXNzaW9ucy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbiBjb3B5X2VtYWlsKCkgY2hlY2sgZm9yID49IDAgYXMgYSByZXR1cm4gdmFsdWUgZm9yCiAgICAgWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQoKSBzaW5jZSAwIGlzIGEgdmFsaWQgaW5kZXguCiAgICAgW1N0ZXZlIEhlbnNvbiByZXBvcnRlZCBieSBNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBvcGVuc2NhLm9yZz5dCgogICopIEF2b2lkIGNvcmVkdW1wIHdpdGggdW5zdXBwb3J0ZWQgb3IgaW52YWxpZCBwdWJsaWMga2V5cyBieSBjaGVja2luZyBpZgogICAgIFg1MDlfZ2V0X3B1YmtleSgpIGZhaWxzIGluIFBLQ1M3X3ZlcmlmeSgpLiBGaXggbWVtb3J5IGxlYWsgd2hlbgogICAgIFBLQ1M3X3ZlcmlmeSgpIGZhaWxzIHdpdGggbm9uIGRldGFjaGVkIGRhdGEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRG9uJ3QgdXNlIGdldGVudiBpbiBsaWJyYXJ5IGZ1bmN0aW9ucyB3aGVuIHJ1biBhcyBzZXR1aWQvc2V0Z2lkLgogICAgIE5ldyBmdW5jdGlvbiBPUEVOU1NMX2lzc2V0dWdpZCgpLgogICAgIFtVbGYgTW9lbGxlcl0KCiAgKikgQXZvaWQgZmFsc2UgcG9zaXRpdmVzIGluIG1lbW9yeSBsZWFrIGRldGVjdGlvbiBjb2RlIChjcnlwdG8vbWVtX2RiZy5jKQogICAgIGR1ZSB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgbXVsdGktdGhyZWFkaW5nOgoKICAgICAxLiBGaXggdGltaW5nIGdsaXRjaCBpbiB0aGUgTWVtQ2hlY2tfb2ZmKCkgcG9ydGlvbiBvZiBDUllQVE9fbWVtX2N0cmwoKS4KCiAgICAgMi4gRml4IGxvZ2ljYWwgZ2xpdGNoIGluIGlzX01lbUNoZWNrX29uKCkgYWthIENSWVBUT19pc19tZW1fY2hlY2tfb24oKS4KCiAgICAgMy4gQ291bnQgaG93IG1hbnkgdGltZXMgTWVtQ2hlY2tfb2ZmKCkgaGFzIGJlZW4gY2FsbGVkIHNvIHRoYXQKICAgICAgICBuZXN0ZWQgdXNlIGNhbiBiZSB0cmVhdGVkIGNvcnJlY3RseS4gIFRoaXMgYWxzbyBhdm9pZHMgCiAgICAgICAgaW5iYW5kLXNpZ25hbGxpbmcgaW4gdGhlIHByZXZpb3VzIGNvZGUgKHdoaWNoIHJlbGllZCBvbiB0aGUKICAgICAgICBhc3N1bXB0aW9uIHRoYXQgdGhyZWFkIElEIDAgaXMgaW1wb3NzaWJsZSkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkICItcmFuZCIgb3B0aW9uIGFsc28gdG8gc19jbGllbnQgYW5kIHNfc2VydmVyLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggQ1BVIGRldGVjdGlvbiBvbiBJcml4IDYueC4KICAgICBbS3VydCBIb2NrZW5idXJ5IDxraG9ja2VuYkBzdGV2ZW5zLXRlY2guZWR1PiBhbmQKICAgICAgIkJydWNlIFcuIEZvcnNiZXJnIiA8YnJ1Y2UuZm9yc2JlcmdAYmFlc3lzdGVtcy5jb20+XQoKICAqKSBGaXggWDUwOV9OQU1FIGJ1ZyB3aGljaCBwcm9kdWNlZCBpbmNvcnJlY3QgZW5jb2RpbmcgaWYgWDUwOV9OQU1FCiAgICAgd2FzIGVtcHR5LgogICAgIFtTdGV2ZSBIZW5zb25dCiAgICAgW1RoaXMgY2hhbmdlIGRvZXMgbm90IGFwcGx5IHRvIDAuOS43Ll0KCiAgKikgVXNlIHRoZSBjYWNoZWQgZW5jb2Rpbmcgb2YgYW4gWDUwOV9OQU1FIHN0cnVjdHVyZSByYXRoZXIgdGhhbgogICAgIGNvcHlpbmcgaXQuIFRoaXMgaXMgYXBwYXJlbnRseSB0aGUgcmVhc29uIGZvciB0aGUgbGlic2FmZSAiZXJyb3JzIgogICAgIGJ1dCB0aGUgY29kZSBpcyBhY3R1YWxseSBjb3JyZWN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZnVuY3Rpb24gQk5fcmFuZF9yYW5nZSgpLCBhbmQgZml4IERTQV9zaWduX3NldHVwKCkgdG8gcHJldmVudAogICAgIEJsZWljaGVuYmFjaGVyJ3MgRFNBIGF0dGFjay4KICAgICBFeHRlbmQgQk5fW3BzZXVkb19dcmFuZDogQXMgYmVmb3JlLCB0b3A9MSBmb3JjZXMgdGhlIGhpZ2hlc3QgdHdvIGJpdHMKICAgICB0byBiZSBzZXQgYW5kIHRvcD0wIGZvcmNlcyB0aGUgaGlnaGVzdCBiaXQgdG8gYmUgc2V0OyB0b3A9LTEgaXMgbmV3CiAgICAgYW5kIGxlYXZlcyB0aGUgaGlnaGVzdCBiaXQgcmFuZG9tLgogICAgIFtVbGYgTW9lbGxlciwgQm9kbyBNb2VsbGVyXQoKICAqKSBJbiB0aGUgTkNPTkZfLi4uLWJhc2VkIGltcGxlbWVudGF0aW9ucyBmb3IgQ09ORl8uLi4gcXVlcmllcwogICAgIChjcnlwdG8vY29uZi9jb25mX2xpYi5jKSwgaWYgdGhlIGlucHV0IExIQVNIIGlzIE5VTEwsIGF2b2lkIHVzaW5nCiAgICAgYSB0ZW1wb3JhcnkgQ09ORiBzdHJ1Y3R1cmUgd2l0aCB0aGUgZGF0YSBjb21wb25lbnQgc2V0IHRvIE5VTEwKICAgICAod2hpY2ggZ2l2ZXMgc2VnbWVudGF0aW9uIGZhdWx0cyBpbiBsaF9yZXRyaWV2ZSkuCiAgICAgSW5zdGVhZCwgdXNlIE5VTEwgZm9yIHRoZSBDT05GIHBvaW50ZXIgaW4gQ09ORl9nZXRfc3RyaW5nIGFuZAogICAgIENPTkZfZ2V0X251bWJlciAod2hpY2ggbWF5IHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMpIGFuZCBkaXJlY3RseQogICAgIHJldHVybiBOVUxMIGZyb20gQ09ORl9nZXRfc2VjdGlvbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggcG90ZW50aWFsIGJ1ZmZlciBvdmVycnVuIGZvciBFQkNESUMuCiAgICAgW1VsZiBNb2VsbGVyXQoKICAqKSBUb2xlcmF0ZSBub25SZXB1ZGlhdGlvbiBhcyBiZWluZyB2YWxpZCBmb3IgUy9NSU1FIHNpZ25pbmcgYW5kIGNlcnRTaWduCiAgICAga2V5VXNhZ2UgaWYgYmFzaWNDb25zdHJhaW50cyBhYnNlbnQgZm9yIGEgQ0EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBTTUlNRV93cml0ZV9QS0NTNygpIHdyaXRlIG1haWwgaGVhZGVyIHZhbHVlcyB3aXRoIGEgZm9ybWF0IHRoYXQKICAgICBpcyBtb3JlIGdlbmVyYWxseSBhY2NlcHRlZCAobm8gc3BhY2VzIGJlZm9yZSB0aGUgc2VtaWNvbG9uKSwgc2luY2UKICAgICBzb21lIHByb2dyYW1zIGNhbid0IHBhcnNlIHRob3NlIHZhbHVlcyBwcm9wZXJseSBvdGhlcndpc2UuICBBbHNvIG1ha2UKICAgICBzdXJlIEJJTydzIHRoYXQgYnJlYWsgbGluZXMgYWZ0ZXIgZWFjaCB3cml0ZSBkbyBub3QgY3JlYXRlIGludmFsaWQKICAgICBoZWFkZXJzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgdGhlIENSTCBlbmNvZGluZyByb3V0aW5lcyB3b3JrIHdpdGggZW1wdHkgU0VRVUVOQ0UgT0YuIFRoZQogICAgIG1hY3JvcyBwcmV2aW91c2x5IHVzZWQgd291bGQgbm90IGVuY29kZSBhbiBlbXB0eSBTRVFVRU5DRSBPRgogICAgIGFuZCBicmVhayB0aGUgc2lnbmF0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCiAgICAgW1RoaXMgY2hhbmdlIGRvZXMgbm90IGFwcGx5IHRvIDAuOS43Ll0KCiAgKikgWmVybyB0aGUgcHJlbWFzdGVyIHNlY3JldCBhZnRlciBkZXJpdmluZyB0aGUgbWFzdGVyIHNlY3JldCBpbgogICAgIERIIGNpcGhlcnN1aXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc29tZSBFVlBfYWRkX2RpZ2VzdF9hbGlhcyByZWdpc3RyYXRpb25zIChhcyBmb3VuZCBpbgogICAgIE9wZW5TU0xfYWRkX2FsbF9kaWdlc3RzKCkpIHRvIFNTTF9saWJyYXJ5X2luaXQoKQogICAgIGFrYSBPcGVuU1NMX2FkZF9zc2xfYWxnb3JpdGhtcygpLiAgVGhpcyBwcm92aWRlcyBpbXByb3ZlZAogICAgIGNvbXBhdGliaWxpdHkgd2l0aCBwZWVycyB1c2luZyBYLjUwOSBjZXJ0aWZpY2F0ZXMKICAgICB3aXRoIHVuY29udmVudGlvbmFsIEFsZ29yaXRobUlkZW50aWZpZXIgT0lEcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggZm9yIElyaXggd2l0aCBOT19BU00uCiAgICAgWyJCcnVjZSBXLiBGb3JzYmVyZyIgPGJydWNlLmZvcnNiZXJnQGJhZXN5c3RlbXMuY29tPl0KCiAgKikgLi9jb25maWcgc2NyaXB0IGZpeGVzLgogICAgIFtVbGYgTW9lbGxlciwgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggJ29wZW5zc2wgcGFzc3dkIC0xJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgUEtDUzEyX2tleV9nZW5fYXNjKCkgc28gaXQgY2FuIGNvcGUgd2l0aCBub24gbnVsbAogICAgIHRlcm1pbmF0ZWQgc3RyaW5ncyB3aG9zZSBsZW5ndGggaXMgcGFzc2VkIGluIHRoZSBwYXNzbGVuCiAgICAgcGFyYW1ldGVyLCBmb3IgZXhhbXBsZSBmcm9tIFBFTSBjYWxsYmFja3MuIFRoaXMgd2FzIGRvbmUKICAgICBieSBhZGRpbmcgYW4gZXh0cmEgbGVuZ3RoIHBhcmFtZXRlciB0byBhc2MydW5pKCkuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgPG9kZGlzc2V5QHNhbXN1bmcuY28ua3I+XQoKICAqKSBGaXggQyBjb2RlIGdlbmVyYXRlZCBieSAnb3BlbnNzbCBkc2FwYXJhbSAtQyc6IElmIGEgQk5fYmluMmJuCiAgICAgY2FsbCBmYWlsZWQsIGZyZWUgdGhlIERTQSBzdHJ1Y3R1cmUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHRvIHVuaTJhc2MoKSB0byBjb3BlIHdpdGggemVybyBsZW5ndGggVW5pY29kZSBzdHJpbmdzLgogICAgIFRoZXNlIGFyZSBwcmVzZW50IGluIHNvbWUgUEtDUyMxMiBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbmNyZWFzZSBzMi0+d2J1ZiBhbGxvY2F0aW9uIGJ5IG9uZSBieXRlIGluIHNzbDJfbmV3IChzc2wvczJfbGliLmMpLgogICAgIE90aGVyd2lzZSBkb19zc2xfd3JpdGUgKHNzbC9zMl9wa3QuYykgd2lsbCB3cml0ZSBiZXlvbmQgYnVmZmVyIGxpbWl0cwogICAgIHdoZW4gd3JpdGluZyBhIDMyNzY3IGJ5dGUgcmVjb3JkLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcmVwb3J0ZWQgYnkgRXJpYyBEYXkgPGVkYXlAY29uY2VudHJpYy5uZXQ+XQoKICAqKSBJbiBSU0FfZWF5X3B1YmxpY197ZW4sZWR9Y3J5cHQgYW5kIFJTQV9lYXlfbW9kX2V4cCAocnNhX2VheS5jKSwKICAgICBvYnRhaW4gbG9jayBDUllQVE9fTE9DS19SU0EgYmVmb3JlIHNldHRpbmcgcnNhLT5fbWV0aG9kX21vZF97bixwLHF9LgoKICAgICAoUlNBIG9iamVjdHMgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudCBhY2Nlc3MgdG8gd2hpY2ggaXMgcHJvdGVjdGVkCiAgICAgYnkgQ1JZUFRPX0xPQ0tfUlNBIFtzZWUgcnNhX2xpYi5jLCBzM19zcnZyLmMsIHNzbF9jZXJ0LmMsIHNzbF9yc2EuY10sCiAgICAgc28gdGhleSBhcmUgbWVhbnQgdG8gYmUgc2hhcmVkIGJldHdlZW4gdGhyZWFkcy4pCiAgICAgW0JvZG8gTW9lbGxlciwgR2VvZmYgVGhvcnBlOyBvcmlnaW5hbCBwYXRjaCBzdWJtaXR0ZWQgYnkKICAgICAiUmVkZGllLCBTdGV2ZW4iIDxTdGV2ZW4uUmVkZGllQGNhLmNvbT5dCgogICopIEZpeCBhIGRlYWRsb2NrIGluIENSWVBUT19tZW1fbGVha3MoKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVc2UgYmV0dGVyIHRlc3QgcGF0dGVybnMgaW4gYm50ZXN0LgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSByYW5kX3dpbi5jIGZpeCBmb3IgQm9ybGFuZCBDLgogICAgIFtVbGYgTfZsbGVyXQogCiAgKikgQk5fcnNoaWZ0IGJ1Z2ZpeCBmb3IgbiA9PSAwLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBhICdiY3Rlc3QnIHNjcmlwdCB0aGF0IGNoZWNrcyBmb3Igc29tZSBrbm93biAnYmMnIGJ1Z3MKICAgICBzbyB0aGF0ICdtYWtlIHRlc3QnIGRvZXMgbm90IGFib3J0IGp1c3QgYmVjYXVzZSAnYmMnIGlzIGJyb2tlbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdG9yZSB2ZXJpZnlfcmVzdWx0IHdpdGhpbiBTU0xfU0VTU0lPTiBhbHNvIGZvciBjbGllbnQgc2lkZSB0bwogICAgIGF2b2lkIHBvdGVudGlhbCBzZWN1cml0eSBob2xlLiAoUmUtdXNlZCBzZXNzaW9ucyBvbiB0aGUgY2xpZW50IHNpZGUKICAgICBhbHdheXMgcmVzdWx0ZWQgaW4gdmVyaWZ5X3Jlc3VsdD09WDUwOV9WX09LLCBub3QgdXNpbmcgdGhlIG9yaWdpbmFsCiAgICAgcmVzdWx0IG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IHNzbDNfcGVuZGluZzogSWYgdGhlIHJlY29yZCBpbiBzLT5zMy0+cnJlYyBpcyBub3Qgb2YgdHlwZQogICAgIFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSwgcmV0dXJuIDAuCiAgICAgU2ltaWxhcmx5LCBjaGFuZ2Ugc3NsMl9wZW5kaW5nIHRvIHJldHVybiAwIGlmIFNTTF9pbl9pbml0KHMpIGlzIHRydWUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IFNTTF9wZWVrOgogICAgIEJvdGggc3NsMl9wZWVrIGFuZCBzc2wzX3BlZWssIHdoaWNoIHdlcmUgdG90YWxseSBicm9rZW4gaW4gZWFybGllcgogICAgIHJlbGVhc2VzLCBoYXZlIGJlZW4gcmUtaW1wbGVtZW50ZWQgYnkgcmVuYW1pbmcgdGhlIHByZXZpb3VzCiAgICAgaW1wbGVtZW50YXRpb25zIG9mIHNzbDJfcmVhZCBhbmQgc3NsM19yZWFkIHRvIHNzbDJfcmVhZF9pbnRlcm5hbAogICAgIGFuZCBzc2wzX3JlYWRfaW50ZXJuYWwsIHJlc3BlY3RpdmVseSwgYW5kIGFkZGluZyAncGVlaycgcGFyYW1ldGVycwogICAgIHRvIHRoZW0uICBUaGUgbmV3IHNzbFsyM11fe3JlYWQscGVla30gZnVuY3Rpb25zIGFyZSBjYWxscyB0bwogICAgIHNzbFsyM11fcmVhZF9pbnRlcm5hbCB3aXRoIHRoZSAncGVlaycgZmxhZyBzZXQgYXBwcm9wcmlhdGVseS4KICAgICBBICdwZWVrJyBwYXJhbWV0ZXIgaGFzIGFsc28gYmVlbiBhZGRlZCB0byBzc2wzX3JlYWRfYnl0ZXMsIHdoaWNoCiAgICAgZG9lcyB0aGUgYWN0dWFsIHdvcmsgZm9yIHNzbDNfcmVhZF9pbnRlcm5hbC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbml0aWFsaXNlICJleF9kYXRhIiBtZW1iZXIgb2YgUlNBL0RTQS9ESCBzdHJ1Y3R1cmVzIHByaW9yIHRvIGNhbGxpbmcKICAgICB0aGUgbWV0aG9kLXNwZWNpZmljICJpbml0KCkiIGhhbmRsZXIuIEFsc28gY2xlYW4gdXAgZXhfZGF0YSBhZnRlcgogICAgIGNhbGxpbmcgdGhlIG1ldGhvZC1zcGVjaWZpYyAiZmluaXNoKCkiIGhhbmRsZXIuIFByZXZpb3VzbHksIHRoaXMgd2FzCiAgICAgaGFwcGVuaW5nIHRoZSBvdGhlciB3YXkgcm91bmQuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgSW5jcmVhc2UgQk5fQ1RYX05VTSAodGhlIG51bWJlciBvZiBCSUdOVU1zIGluIGEgQk5fQ1RYKSB0byAxNi4KICAgICBUaGUgcHJldmlvdXMgdmFsdWUsIDEyLCB3YXMgbm90IGFsd2F5cyBzdWZmaWNpZW50IGZvciBCTl9tb2RfZXhwKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTWFrZSBzdXJlIHRoYXQgc2hhcmVkIGxpYnJhcmllcyBnZXQgdGhlIGludGVybmFsIG5hbWUgZW5naW5lIHdpdGgKICAgICB0aGUgZnVsbCB2ZXJzaW9uIG51bWJlciBhbmQgbm90IGp1c3QgMC4gIFRoaXMgc2hvdWxkIG1hcmsgdGhlCiAgICAgc2hhcmVkIGxpYnJhcmllcyBhcyBub3QgYmFja3dhcmQgY29tcGF0aWJsZS4gIE9mIGNvdXJzZSwgdGhpcyBzaG91bGQKICAgICBiZSBjaGFuZ2VkIGFnYWluIHdoZW4gd2UgY2FuIGd1YXJhbnRlZSBiYWNrd2FyZCBiaW5hcnkgY29tcGF0aWJpbGl0eS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggdHlwbyBpbiBnZXRfY2VydF9ieV9zdWJqZWN0KCkgaW4gYnlfZGlyLmMKICAgICBbSmVhbi1NYXJjIERlc3BlcnJpZXIgPGplYW4tbWFyYy5kZXNwZXJyaWVyQGNlcnRwbHVzLmNvbT5dCgogICopIFJld29yayB0aGUgc3lzdGVtIHRvIGdlbmVyYXRlIHNoYXJlZCBsaWJyYXJpZXM6CgogICAgIC0gTWFrZSBub3RlIG9mIHRoZSBleHBlY3RlZCBleHRlbnNpb24gZm9yIHRoZSBzaGFyZWQgbGlicmFyaWVzIGFuZAogICAgICAgaWYgdGhlcmUgaXMgYSBuZWVkIGZvciBzeW1ib2xpYyBsaW5rcyBmcm9tIGZvciBleGFtcGxlIGxpYmNyeXB0by5zby4wCiAgICAgICB0byBsaWJjcnlwdG8uc28uMC45LjcuICBUaGVyZSBpcyBleHRlbmRlZCBpbmZvIGluIENvbmZpZ3VyZSBmb3IKICAgICAgIHRoYXQuCgogICAgIC0gTWFrZSBhcyBmZXcgcmVidWlsZHMgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgYXMgcG9zc2libGUuCgogICAgIC0gU3RpbGwgYXZvaWQgbGlua2luZyB0aGUgT3BlblNTTCBwcm9ncmFtcyB3aXRoIHRoZSBzaGFyZWQgbGlicmFyaWVzLgoKICAgICAtIFdoZW4gaW5zdGFsbGluZywgaW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcmllcyBzZXBhcmF0ZWx5IGZyb20gdGhlCiAgICAgICBzdGF0aWMgb25lcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggU1NMX0NUWF9zZXRfcmVhZF9haGVhZCBtYWNybyB0byBhY3R1YWxseSB1c2UgaXRzIGFyZ3VtZW50LgoKICAgICBDb3B5IFNTTF9DVFgncyByZWFkX2FoZWFkIGZsYWcgdG8gU1NMIG9iamVjdCBkaXJlY3RseSBpbiBTU0xfbmV3CiAgICAgYW5kIG5vdCBpbiBTU0xfY2xlYXIgYmVjYXVzZSB0aGUgbGF0dGVyIGlzIGFsc28gdXNlZCBieSB0aGUKICAgICBhY2NlcHQvY29ubmVjdCBmdW5jdGlvbnM7IHByZXZpb3VzbHksIHRoZSBzZXR0aW5ncyBtYWRlIGJ5CiAgICAgU1NMX3NldF9yZWFkX2FoZWFkIHdvdWxkIGJlIGxvc3QgZHVyaW5nIHRoZSBoYW5kc2hha2UuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbXMgcmVwb3J0ZWQgYnkgQW5kZXJzIEdlcnR6IDxnZXJ0ekBlcGFjdC5zZT5dICAgICAKCiAgKikgQ29ycmVjdCB1dGlsL21rZGVmLnBsIHRvIGJlIHNlbGVjdGl2ZSBhYm91dCBkaXNhYmxlZCBhbGdvcml0aG1zLgogICAgIFByZXZpb3VzbHksIGl0IHdvdWxkIGNyZWF0ZSBlbnRyaWVzIGZvciBkaXNhYmxlZWQgYWxnb3JpdGhtcyBubwogICAgIG1hdHRlciB3aGF0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZGVkIHNldmVyYWwgbmV3IG1hbnVhbCBwYWdlcyBmb3IgU1NMXyogZnVuY3Rpb24uCiAgICAgW0x1dHogSmFlbmlja2VdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS41YSBhbmQgMC45LjYgIFsyNCBTZXAgMjAwMF0KCiAgKikgSW4gc3NsMjNfZ2V0X2NsaWVudF9oZWxsbywgZ2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIGZhY2VkCiAgICAgd2l0aCBhbiBpbml0aWFsIFNTTCAzLjAvVExTIHJlY29yZCB0aGF0IGlzIHRvbyBzbWFsbCB0byBjb250YWluIHRoZQogICAgIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgQ2xpZW50SGVsbG8gbWVzc2FnZSwgaS5lLiBjbGllbnRfdmVyc2lvbi4KICAgICAoTm90ZSB0aGF0IHRoaXMgaXMgYSBwYXRob2xvZ2ljIGNhc2UgdGhhdCBwcm9iYWJseSBoYXMgbmV2ZXIgaGFwcGVuZWQKICAgICBpbiByZWFsIGxpZmUuKSAgVGhlIHByZXZpb3VzIGFwcHJvYWNoIHdhcyB0byB1c2UgdGhlIHZlcnNpb24gbnVtYmVyCiAgICAgZnJvbSB0aGUgcmVjb3JkIGhlYWRlciBhcyBhIHN1YnN0aXR1dGU7IGJ1dCBvdXIgcHJvdG9jb2wgY2hvaWNlCiAgICAgc2hvdWxkIG5vdCBkZXBlbmQgb24gdGhhdCBvbmUgYmVjYXVzZSBpdCBpcyBub3QgYXV0aGVudGljYXRlZAogICAgIGJ5IHRoZSBGaW5pc2hlZCBtZXNzYWdlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNb3JlIHJvYnVzdCByYW5kb21uZXNzIGdhdGhlcmluZyBmdW5jdGlvbnMgZm9yIFdpbmRvd3MuCiAgICAgW0plZmZyZXkgQWx0bWFuIDxqYWx0bWFuQGNvbHVtYmlhLmVkdT5dCgogICopIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgaWYgdGhlIGZsYWcgWDUwOV9WX0ZMQUdfSVNTVUVSX0NIRUNLIGlzCiAgICAgbm90IHNldCB0aGVuIHdlIGRvbid0IHNldHVwIHRoZSBlcnJvciBjb2RlIGZvciBpc3N1ZXIgY2hlY2sgZXJyb3JzCiAgICAgdG8gYXZvaWQgcG9zc2libHkgb3ZlcndyaXRpbmcgb3RoZXIgZXJyb3JzIHdoaWNoIHRoZSBjYWxsYmFjayBkb2VzCiAgICAgaGFuZGxlLiBJZiBhbiBhcHBsaWNhdGlvbiBkb2VzIHNldCB0aGUgZmxhZyB0aGVuIHdlIGFzc3VtZSBpdCBrbm93cwogICAgIHdoYXQgaXQgaXMgZG9pbmcgYW5kIGNhbiBoYW5kbGUgdGhlIG5ldyBpbmZvcm1hdGlvbmFsIGNvZGVzCiAgICAgYXBwcm9wcmlhdGVseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZm9yIGEgbmFzdHkgYnVnIGluIEFTTjFfVFlQRSBoYW5kbGluZy4gQVNOMV9UWVBFIGlzIHVzZWQgZm9yCiAgICAgYSBnZW5lcmFsICJBTlkiIHR5cGUsIGFzIHN1Y2ggaXQgc2hvdWxkIGJlIGFibGUgdG8gZGVjb2RlIGFueXRoaW5nCiAgICAgaW5jbHVkaW5nIHRhZ2dlZCB0eXBlcy4gSG93ZXZlciBpdCBkaWRuJ3QgY2hlY2sgdGhlIGNsYXNzIHNvIGl0IHdvdWxkCiAgICAgd3JvbmdseSBpbnRlcnByZXQgdGFnZ2VkIHR5cGVzIGluIHRoZSBzYW1lIHdheSBhcyB0aGVpciB1bml2ZXJzYWwKICAgICBjb3VudGVycGFydCBhbmQgdW5rbm93biB0eXBlcyB3ZXJlIGp1c3QgcmVqZWN0ZWQuIENoYW5nZWQgc28gdGhhdCB0aGUKICAgICB0YWdnZWQgYW5kIHVua25vd24gdHlwZXMgYXJlIGhhbmRsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGEgU0VRVUVOQ0U6CiAgICAgdGhhdCBpcyB0aGUgZW5jb2RpbmcgaXMgc3RvcmVkIGludGFjdC4gVGhlcmUgaXMgYWxzbyBhIG5ldyB0eXBlCiAgICAgIlZfQVNOMV9PVEhFUiIgd2hpY2ggaXMgdXNlZCB3aGVuIHRoZSBjbGFzcyBpcyBub3QgdW5pdmVyc2FsLCBpbiB0aGlzCiAgICAgY2FzZSB3ZSBoYXZlIG5vIGlkZWEgd2hhdCB0aGUgYWN0dWFsIHR5cGUgaXMgc28gd2UganVzdCBsdW1wIHRoZW0gYWxsCiAgICAgdG9nZXRoZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgT24gVk1TLCBzdGRvdXQgbWF5IHZlcnkgd2VsbCBsZWFkIHRvIGEgZmlsZSB0aGF0IGlzIHdyaXR0ZW4gdG8KICAgICBpbiBhIHJlY29yZC1vcmllbnRlZCBmYXNoaW9uLiAgVGhhdCBtZWFucyB0aGF0IGV2ZXJ5IHdyaXRlKCkgd2lsbAogICAgIHdyaXRlIGEgc2VwYXJhdGUgcmVjb3JkLCB3aGljaCB3aWxsIGJlIHJlYWQgc2VwYXJhdGVseSBieSB0aGUKICAgICBwcm9ncmFtcyB0cnlpbmcgdG8gcmVhZCBmcm9tIGl0LiAgVGhpcyBjYW4gYmUgdmVyeSBjb25mdXNpbmcuCgogICAgIFRoZSBzb2x1dGlvbiBpcyB0byBwdXQgYSBCSU8gZmlsdGVyIGluIHRoZSB3YXkgdGhhdCB3aWxsIGJ1ZmZlcgogICAgIHRleHQgdW50aWwgYSBsaW5lZmVlZCBpcyByZWFjaGVkLCBhbmQgdGhlbiB3cml0ZSBldmVyeXRoaW5nIGEKICAgICBsaW5lIGF0IGEgdGltZSwgc28gZXZlcnkgcmVjb3JkIHdyaXR0ZW4gd2lsbCBiZSBhbiBhY3R1YWwgbGluZSwKICAgICBub3QgY2h1bmtzIG9mIGxpbmVzIGFuZCBub3QgKHVzdWFsbHkgZG9lc24ndCBoYXBwZW4sIGJ1dCBJJ3ZlCiAgICAgc2VlbiBpdCBvbmNlKSBzZXZlcmFsIGxpbmVzIGluIG9uZSByZWNvcmQuICBCSU9fZl9saW5lYnVmZmVyKCkgaXMKICAgICB0aGUgYW5zd2VyLgoKICAgICBDdXJyZW50bHksIGl0J3MgYSBWTVMtb25seSBtZXRob2QsIGJlY2F1c2UgdGhhdCdzIHdoZXJlIGl0IGhhcwogICAgIGJlZW4gdGVzdGVkIHdlbGwgZW5vdWdoLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFJlbW92ZSAnb3B0aW1pemVkJyBzcXVhcmluZyB2YXJpYW50IGluIEJOX21vZF9tdWxfbW9udGdvbWVyeSwKICAgICBpdCBjYW4gcmV0dXJuIGluY29ycmVjdCByZXN1bHRzLgogICAgIChOb3RlOiBUaGUgYnVnZ3kgdmFyaWFudCB3YXMgbm90IGVuYWJsZWQgaW4gT3BlblNTTCAwLjkuNWEsCiAgICAgYnV0IGl0IHdhcyBpbiAwLjkuNi1iZXRhWzEyXS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSB0aGUgY2hlY2sgZm9yIGNvbnRlbnQgYmVpbmcgcHJlc2VudCB3aGVuIHZlcmlmeWluZyBkZXRhY2hlZAogICAgIHNpZ25hdHVyZXMgaW4gcGs3X3NtaW1lLmMuIFNvbWUgdmVyc2lvbnMgb2YgTmV0c2NhcGUgKHdyb25nbHkpCiAgICAgaW5jbHVkZSB6ZXJvIGxlbmd0aCBjb250ZW50IHdoZW4gc2lnbmluZyBtZXNzYWdlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQklPX3NodXRkb3duX3dyIG1hY3JvLCB3aGljaCBpbnZva2VzIHRoZSBCSU9fQ19TSFVURE9XTl9XUgogICAgIEJJT19jdHJsIChmb3IgQklPIHBhaXJzKS4KICAgICBbQm9kbyBN9mxsZXJdCgogICopIEFkZCBEU08gbWV0aG9kIGZvciBWTVMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQnVnIGZpeDogTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiBjb3VsZCBwcm9kdWNlIHJlc3VsdHMgd2l0aCB0aGUKICAgICB3cm9uZyBzaWduLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgUlBNIHNwZWNpZmljYXRpb24gb3BlbnNzbC5zcGVjIGFuZCBtb2RpZnkgaXQgdG8gYnVpbGQgdGhyZWUKICAgICBwYWNrYWdlcy4gIFRoZSBkZWZhdWx0IHBhY2thZ2UgY29udGFpbnMgYXBwbGljYXRpb25zLCBhcHBsaWNhdGlvbgogICAgIGRvY3VtZW50YXRpb24gYW5kIHJ1bi10aW1lIGxpYnJhcmllcy4gIFRoZSBkZXZlbCBwYWNrYWdlIGNvbnRhaW5zCiAgICAgaW5jbHVkZSBmaWxlcywgc3RhdGljIGxpYnJhcmllcyBhbmQgZnVuY3Rpb24gZG9jdW1lbnRhdGlvbi4gIFRoZQogICAgIGRvYyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBjb250ZW50cyBvZiB0aGUgZG9jIGRpcmVjdG9yeS4gIFRoZSBvcmlnaW5hbAogICAgIG9wZW5zc2wuc3BlYyB3YXMgcHJvdmlkZWQgYnkgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQogICAgIAogICopIEFkZCBhIGxhcmdlIG51bWJlciBvZiBkb2N1bWVudGF0aW9uIGZpbGVzIGZvciBtYW55IFNTTCByb3V0aW5lcy4KICAgICBbTHV0eiBKYWVuaWNrZSA8THV0ei5KYWVuaWNrZUBhZXQuVFUtQ290dGJ1cy5ERT5dCgogICopIEFkZCBhIGNvbmZpZ3VyYXRpb24gZW50cnkgZm9yIFNvbnkgTmV3cyA0LgogICAgIFtOQUtBSkkgSGlyb3l1a2kgPG5ha2FqaUB0dXRycC50dXQuYWMuanA+XQoKICAqKSBEb24ndCBzZXQgdGhlIHR3byBtb3N0IHNpZ25pZmljYW50IGJpdHMgdG8gb25lIHdoZW4gZ2VuZXJhdGluZyBhCiAgICAgcmFuZG9tIG51bWJlciA8IHEgaW4gdGhlIERTQSBsaWJyYXJ5LgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBOZXcgU1NMIEFQSSBtb2RlICdTU0xfTU9ERV9BVVRPX1JFVFJZJy4gIFRoaXMgZGlzYWJsZXMgdGhlIGRlZmF1bHQKICAgICBiZWhhdmlvdXIgdGhhdCBTU0xfcmVhZCBtYXkgcmVzdWx0IGluIFNTTF9FUlJPUl9XQU5UX1JFQUQgKGV2ZW4gaWYKICAgICB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaXMgYmxvY2tpbmcpIGlmIGEgaGFuZHNoYWtlIHRvb2sgcGxhY2UuCiAgICAgKFRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyBuZWVkZWQgYnkgYXBwbGljYXRpb25zIHN1Y2ggYXMgc19jbGllbnQKICAgICBhbmQgc19zZXJ2ZXIgdGhhdCB1c2Ugc2VsZWN0KCkgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gdXNlIFNTTF9yZWFkOwogICAgIGJ1dCBmb3IgYXBwbGljYXRpb25zIHRoYXQga25vdyBpbiBhZHZhbmNlIHdoZW4gdG8gZXhwZWN0IGRhdGEsIGl0CiAgICAganVzdCBtYWtlcyB0aGluZ3MgbW9yZSBjb21wbGljYXRlZC4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIFJBTkRfZWdkX2J5dGVzKCksIHdoaWNoIGdpdmVzIGNvbnRyb2wgb3ZlciB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKICAgICBmcm9tIEVHRC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGEgZmV3IG1vcmUgRUJDRElDIGNvbmRpdGlvbmFscyB0aGF0IG1ha2UgYHJlcScgYW5kIGB4NTA5JwogICAgIHdvcmsgYmV0dGVyIG9uIHN1Y2ggc3lzdGVtcy4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaFAuU2llbWVucy5EZT5dCgogICopIEFkZCB0d28gZGVtbyBwcm9ncmFtcyBmb3IgUEtDUzEyX3BhcnNlKCkgYW5kIFBLQ1MxMl9jcmVhdGUoKS4KICAgICBVcGRhdGUgUEtDUzEyX3BhcnNlKCkgc28gaXQgY29waWVzIHRoZSBmcmllbmRseU5hbWUgYW5kIHRoZQogICAgIGtleWlkIHRvIHRoZSBjZXJ0aWZpY2F0ZXMgYXV4IGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGJ1ZyBpbiBQS0NTN192ZXJpZnkoKSB3aGljaCBjYXVzZWQgYW4gaW5maW5pdGUgbG9vcAogICAgIGlmIHRoZXJlIHdhcyBtb3JlIHRoYW4gb25lIHNpZ25hdHVyZS4KICAgICBbU3ZlbiBVc3pwZWxrYXQgPHN1QGNlbG9jb20uZGU+XQoKICAqKSBNYWpvciBjaGFuZ2UgaW4gdXRpbC9ta2RlZi5wbCB0byBpbmNsdWRlIGV4dHJhIGluZm9ybWF0aW9uCiAgICAgYWJvdXQgZWFjaCBzeW1ib2wsIGFzIHdlbGwgYXMgcHJlc2VudGluZyB2YXJpYWJsZXMgYXMgd2VsbAogICAgIGFzIGZ1bmN0aW9ucy4gIFRoaXMgY2hhbmdlIG1lYW5zIHRoYXQgdGhlcmUncyBuIG1vcmUgbmVlZAogICAgIHRvIHJlYnVpbGQgdGhlIC5udW0gZmlsZXMgd2hlbiBzb21lIGFsZ29yaXRobXMgYXJlIGV4Y2x1ZGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFsbG93IHRoZSB2ZXJpZnkgdGltZSB0byBiZSBzZXQgYnkgYW4gYXBwbGljYXRpb24sCiAgICAgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KICAKICAqKSBQaGFzZSAyIHZlcmlmeSBjb2RlIHJlb3JnYW5pc2F0aW9uLiBUaGUgY2VydGlmaWNhdGUKICAgICB2ZXJpZnkgY29kZSBub3cgbG9va3MgdXAgYW4gaXNzdWVyIGNlcnRpZmljYXRlIGJ5IGEKICAgICBudW1iZXIgb2YgY3JpdGVyaWE6IHN1YmplY3QgbmFtZSwgYXV0aG9yaXR5IGtleSBpZAogICAgIGFuZCBrZXkgdXNhZ2UuIEl0IGFsc28gdmVyaWZpZXMgc2VsZiBzaWduZWQgY2VydGlmaWNhdGVzCiAgICAgYnkgdGhlIHNhbWUgY3JpdGVyaWEuIFRoZSBtYWluIGNvbXBhcmlzb24gZnVuY3Rpb24gaXMKICAgICBYNTA5X2NoZWNrX2lzc3VlZCgpIHdoaWNoIHBlcmZvcm1zIHRoZXNlIGNoZWNrcy4KIAogICAgIExvdCBvZiBjaGFuZ2VzIHdlcmUgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcwogICAgIHdpdGhvdXQgY29tcGxldGVseSByZXdyaXRpbmcgdGhlIGxvb2t1cCBjb2RlLgogCiAgICAgQXV0aG9yaXR5IGFuZCBzdWJqZWN0IGtleSBpZGVudGlmaWVyIGFyZSBub3cgY2FjaGVkLgogCiAgICAgVGhlIExIQVNIICdjZXJ0cycgaXMgWDUwOV9TVE9SRSBoYXMgbm93IGJlZW4gcmVwbGFjZWQKICAgICBieSBhIFNUQUNLX09GKFg1MDlfT0JKRUNUKS4gVGhpcyBpcyBtYWlubHkgYmVjYXVzZSBhbgogICAgIExIQVNIIGNhbid0IHN0b3JlIG9yIHJldHJpZXZlIG11bHRpcGxlIG9iamVjdHMgd2l0aAogICAgIHRoZSBzYW1lIGhhc2ggdmFsdWUuCgogICAgIEFzIGEgcmVzdWx0IHZhcmlvdXMgZnVuY3Rpb25zICh3aGljaCB3ZXJlIGFsbCBpbnRlcm5hbAogICAgIHVzZSBvbmx5KSBoYXZlIGNoYW5nZWQgdG8gaGFuZGxlIHRoZSBuZXcgWDUwOV9TVE9SRQogICAgIHN0cnVjdHVyZS4gVGhpcyB3aWxsIGJyZWFrIGFueXRoaW5nIHRoYXQgbWVzc2VkIHJvdW5kCiAgICAgd2l0aCBYNTA5X1NUT1JFIGludGVybmFsbHkuCiAKICAgICBUaGUgZnVuY3Rpb25zIFg1MDlfU1RPUkVfYWRkX2NlcnQoKSBub3cgY2hlY2tzIGZvciBhbgogICAgIGV4YWN0IG1hdGNoLCByYXRoZXIgdGhhbiBqdXN0IHN1YmplY3QgbmFtZS4KIAogICAgIFRoZSBYNTA5X1NUT1JFIEFQSSBkb2Vzbid0IGRpcmVjdGx5IHN1cHBvcnQgdGhlIHJldHJpZXZhbAogICAgIG9mIG11bHRpcGxlIGNlcnRpZmljYXRlcyBtYXRjaGluZyBhIGdpdmVuIGNyaXRlcmlhLCBob3dldmVyCiAgICAgdGhpcyBjYW4gYmUgd29ya2VkIHJvdW5kIGJ5IHBlcmZvcm1pbmcgYSBsb29rdXAgZmlyc3QKICAgICAod2hpY2ggd2lsbCBmaWxsIHRoZSBjYWNoZSB3aXRoIGNhbmRpZGF0ZSBjZXJ0aWZpY2F0ZXMpCiAgICAgYW5kIHRoZW4gZXhhbWluaW5nIHRoZSBjYWNoZSBmb3IgbWF0Y2hlcy4gVGhpcyBpcyBwcm9iYWJseQogICAgIHRoZSBiZXN0IHdlIGNhbiBkbyB3aXRob3V0IHRocm93aW5nIG91dCBYNTA5X0xPT0tVUAogICAgIGVudGlyZWx5IChtYXliZSBsYXRlci4uLikuCiAKICAgICBUaGUgWDUwOV9WRVJJRllfQ1RYIHN0cnVjdHVyZSBoYXMgYmVlbiBlbmhhbmNlZCBjb25zaWRlcmFibHkuCiAKICAgICBBbGwgY2VydGlmaWNhdGUgbG9va3VwIG9wZXJhdGlvbnMgbm93IGdvIHZpYSBhIGdldF9pc3N1ZXIoKQogICAgIGNhbGxiYWNrLiBBbHRob3VnaCB0aGlzIGN1cnJlbnRseSB1c2VzIGFuIFg1MDlfU1RPUkUgaXQKICAgICBjYW4gYmUgcmVwbGFjZWQgYnkgY3VzdG9tIGxvb2t1cHMuIFRoaXMgaXMgYSBzaW1wbGUgd2F5CiAgICAgdG8gYnlwYXNzIHRoZSBYNTA5X1NUT1JFIGhhY2tlcnkgbmVjZXNzYXJ5IHRvIG1ha2UgdGhpcwogICAgIHdvcmsgYW5kIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBtb3JlIGVmZmljaWVudCB0ZWNobmlxdWVzCiAgICAgaW4gZnV0dXJlLiBBIHZlcnkgc2ltcGxlIHZlcnNpb24gd2hpY2ggdXNlcyBhIHNpbXBsZQogICAgIFNUQUNLIGZvciBpdHMgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBzdG9yZSBpcyBhbHNvIHByb3ZpZGVkCiAgICAgdXNpbmcgWDUwOV9TVE9SRV9DVFhfdHJ1c3RlZF9zdGFjaygpLgogCiAgICAgVGhlIHZlcmlmeV9jYigpIGFuZCB2ZXJpZnkoKSBjYWxsYmFja3Mgbm93IGhhdmUgZXF1aXZhbGVudHMKICAgICBpbiB0aGUgWDUwOV9TVE9SRV9DVFggc3RydWN0dXJlLgogCiAgICAgWDUwOV9TVE9SRV9DVFggYWxzbyBoYXMgYSAnZmxhZ3MnIGZpZWxkIHdoaWNoIGNhbiBiZSB1c2VkCiAgICAgdG8gY3VzdG9taXNlIHRoZSB2ZXJpZnkgYmVoYXZpb3VyLgogICAgIFtTdGV2ZSBIZW5zb25dCiAKICAqKSBBZGQgbmV3IFBLQ1MjNyBzaWduaW5nIG9wdGlvbiBQS0NTN19OT1NNSU1FQ0FQIHdoaWNoIAogICAgIGV4Y2x1ZGVzIFMvTUlNRSBjYXBhYmlsaXRpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgV2hlbiBhIGNlcnRpZmljYXRlIHJlcXVlc3QgaXMgcmVhZCBpbiBrZWVwIGEgY29weSBvZiB0aGUKICAgICBvcmlnaW5hbCBlbmNvZGluZyBvZiB0aGUgc2lnbmVkIGRhdGEgYW5kIHVzZSBpdCB3aGVuIG91dHB1dGluZwogICAgIGFnYWluLiBTaWduYXR1cmVzIHRoZW4gdXNlIHRoZSBvcmlnaW5hbCBlbmNvZGluZyByYXRoZXIgdGhhbgogICAgIGEgZGVjb2RlZCwgZW5jb2RlZCB2ZXJzaW9uIHdoaWNoIG1heSBjYXVzZSBwcm9ibGVtcyBpZiB0aGUKICAgICByZXF1ZXN0IGlzIGltcHJvcGVybHkgZW5jb2RlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBCSU9fcHV0cyBpbXBsZW1lbnRhdGlvbnMsIGNhbGwKICAgICBidWZmZXJfd3JpdGUoYiwgLi4uKSBkaXJlY3RseSBpbiBidWZmZXJfcHV0cyBpbnN0ZWFkIG9mIGNhbGxpbmcKICAgICBCSU9fd3JpdGUoYiwgLi4uKS4KCiAgICAgSW4gQklPX3B1dHMsIGluY3JlbWVudCBiLT5udW1fd3JpdGUgYXMgaW4gQklPX3dyaXRlLgogICAgIFtQZXRlci5TeWx2ZXN0ZXJARWRlbFdlYi5mcl0KCiAgKikgRml4IEJOX211bF93b3JkIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgd29yZCBpcyAwLiAoV2UgaGF2ZSB0byB1c2UKICAgICBCTl96ZXJvLCB3ZSBtYXkgbm90IHJldHVybiBhIEJJR05VTSB3aXRoIGFuIGFycmF5IGNvbnNpc3Rpbmcgb2YKICAgICB3b3JkcyBzZXQgdG8gemVyby4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQXZvaWQgY2FsbGluZyBhYm9ydCgpIGZyb20gd2l0aGluIHRoZSBsaWJyYXJ5IHdoZW4gcHJvYmxlbXMgYXJlCiAgICAgZGV0ZWN0ZWQsIGV4Y2VwdCBpZiBwcmVwcm9jZXNzb3Igc3ltYm9scyBoYXZlIGJlZW4gZGVmaW5lZAogICAgIChzdWNoIGFzIFJFRl9DSEVDSywgQk5fREVCVUcgZXRjLikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IG9wZW5zc2wgYXBwbGljYXRpb24gJ3JzYXV0bCcuIFRoaXMgdXRpbGl0eSBjYW4gYmUKICAgICB1c2VkIGZvciBsb3cgbGV2ZWwgUlNBIG9wZXJhdGlvbnMuIERFUiBwdWJsaWMga2V5CiAgICAgQklPL2ZwIHJvdXRpbmVzIGFsc28gYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IENvbmZpZ3VyZSBlbnRyeSBhbmQgcGF0Y2hlcyBmb3IgY29tcGlsaW5nIG9uIFFOWCA0LgogICAgIFtBbmRyZWFzIFNjaG5laWRlciA8YW5kcmVhc0BkczMuZXRlY2guZmgtaGFtYnVyZy5kZT5dCgogICopIEEgZGVtbyBzdGF0ZS1tYWNoaW5lIGltcGxlbWVudGF0aW9uIHdhcyBzcG9uc29yZWQgYnkKICAgICBOdXJvbiAoaHR0cDovL3d3dy5udXJvbi5jb20vKSBhbmQgaXMgbm93IGF2YWlsYWJsZSBpbgogICAgIGRlbW9zL3N0YXRlX21hY2hpbmUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE5ldyBvcHRpb25zIGFkZGVkIHRvIHRoZSAnZGdzdCcgdXRpbGl0eSBmb3Igc2lnbmF0dXJlCiAgICAgZ2VuZXJhdGlvbiBhbmQgdmVyaWZpY2F0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVucmVjb2duaXplZCBQS0NTIzcgY29udGVudCB0eXBlcyBhcmUgbm93IGhhbmRsZWQgdmlhIGEKICAgICBjYXRjaCBhbGwgQVNOMV9UWVBFIHN0cnVjdHVyZS4gVGhpcyBhbGxvd3MgdW5zdXBwb3J0ZWQKICAgICB0eXBlcyB0byBiZSBzdG9yZWQgYXMgYSAiYmxvYiIgYW5kIGFuIGFwcGxpY2F0aW9uIGNhbgogICAgIGVuY29kZSBhbmQgZGVjb2RlIGl0IG1hbnVhbGx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB2YXJpb3VzIHNpZ25lZC91bnNpZ25lZCBpc3N1ZXMgdG8gbWFrZSBhX3N0cmV4LmMKICAgICBjb21waWxlIHVuZGVyIFZDKysuCiAgICAgW09zY2FyIEphY29ic3NvbiA8b3NjYXIuamFjb2Jzc29uQGNlbG9jb20uY29tPl0KCiAgKikgQVNOMSBmaXhlcy4gaTJkX0FTTjFfT0JKRUNUIHdhcyBub3QgcmV0dXJuaW5nIHRoZSBjb3JyZWN0CiAgICAgbGVuZ3RoIGlmIHBhc3NlZCBhIGJ1ZmZlci4gQVNOMV9JTlRFR0VSX3RvX0JOIGZhaWxlZAogICAgIGlmIHBhc3NlZCBhIE5VTEwgQk4gYW5kIGl0cyBhcmd1bWVudCB3YXMgbmVnYXRpdmUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgU3ZlbiBIZWliZXJnIDxzdmVuQHRhcnR1LmN5YmVyLmVlPl0KCiAgKikgTW9kaWZpY2F0aW9uIHRvIFBLQ1MjNyBlbmNvZGluZyByb3V0aW5lcyB0byBvdXRwdXQgZGVmaW5pdGUKICAgICBsZW5ndGggZW5jb2RpbmcuIFNpbmNlIGN1cnJlbnRseSB0aGUgd2hvbGUgc3RydWN0dXJlcyBhcmUgaW4KICAgICBtZW1vcnkgdGhlcmUncyBub3QgcmVhbCBwb2ludCBpbiB1c2luZyBpbmRlZmluaXRlIGxlbmd0aCAKICAgICBjb25zdHJ1Y3RlZCBlbmNvZGluZy4gSG93ZXZlciBpZiBPcGVuU1NMIGlzIGNvbXBpbGVkIHdpdGgKICAgICB0aGUgZmxhZyBQS0NTN19JTkRFRklOSVRFX0VOQ09ESU5HIHRoZSBvbGQgZm9ybSBpcyB1c2VkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIEJJT192cHJpbnRmKCkgYW5kIEJJT192c25wcmludGYoKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGRlZCBtb3JlIHByZWZpeGVzIHRvIHBhcnNlIGZvciBpbiB0aGUgdGhlIHN0cmluZ3Mgd3JpdHRlbgogICAgIHRocm91Z2ggYSBsb2dnaW5nIGJpbywgdG8gY292ZXIgYWxsIHRoZSBsZXZlbHMgdGhhdCBhcmUgYXZhaWxhYmxlCiAgICAgdGhyb3VnaCBzeXNsb2cuICBUaGUgcHJlZml4ZXMgYXJlIG5vdzoKCglQQU5JQywgRU1FUkcsIEVNUgk9PglMT0dfRU1FUkcKCUFMRVJULCBBTFIJCT0+CUxPR19BTEVSVAoJQ1JJVCwgQ1JJCQk9PglMT0dfQ1JJVAoJRVJST1IsIEVSUgkJPT4JTE9HX0VSUgoJV0FSTklORywgV0FSTiwgV0FSCT0+CUxPR19XQVJOSU5HCglOT1RJQ0UsIE5PVEUsIE5PVAk9PglMT0dfTk9USUNFCglJTkZPLCBJTkYJCT0+CUxPR19JTkZPCglERUJVRywgREJHCQk9PglMT0dfREVCVUcKCiAgICAgYW5kIGFzIGJlZm9yZSwgaWYgbm9uZSBvZiB0aG9zZSBwcmVmaXhlcyBhcmUgcHJlc2VudCBhdCB0aGUKICAgICBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZywgTE9HX0VSUiBpcyBjaG9zZW4uCgogICAgIE9uIFdpbjMyLCB0aGUgTE9HXyogbGV2ZWxzIGFyZSBtYXBwZWQgYWNjb3JkaW5nIHRvIHRoaXM6CgoJTE9HX0VNRVJHLCBMT0dfQUxFUlQsIExPR19DUklULCBMT0dfRVJSCT0+IEVWRU5UTE9HX0VSUk9SX1RZUEUKCUxPR19XQVJOSU5HCQkJCT0+IEVWRU5UTE9HX1dBUk5JTkdfVFlQRQoJTE9HX05PVElDRSwgTE9HX0lORk8sIExPR19ERUJVRwkJPT4gRVZFTlRMT0dfSU5GT1JNQVRJT05fVFlQRQoKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWRlIGl0IHBvc3NpYmxlIHRvIHJlY29uZmlndXJlIHdpdGgganVzdCB0aGUgY29uZmlndXJhdGlvbgogICAgIGFyZ3VtZW50ICJyZWNvbmYiIG9yICJyZWNvbmZpZ3VyZSIuICBUaGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwogICAgIGFyZSBzdG9yZWQgaW4gTWFrZWZpbGUuc3NsIGluIHRoZSB2YXJpYWJsZSBDT05GSUdVUkVfQVJHUywKICAgICBhbmQgYXJlIHJldHJpZXZlZCBmcm9tIHRoZXJlIHdoZW4gcmVjb25maWd1cmluZy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNRDQgaW1wbGVtZW50ZWQuCiAgICAgW0Fzc2FyIFdlc3Rlcmx1bmQgPGFzc2FyQHNpY3Muc2U+LCBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgYXJndW1lbnRzIC1DQWZpbGUgYW5kIC1DQXBhdGggdG8gdGhlIHBrY3MxMiB1dGlsaXR5LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFRoZSBvYmpfZGF0LnBsIHNjcmlwdCB3YXMgbWVzc2luZyB1cCB0aGUgc29ydGluZyBvZiBvYmplY3QKICAgICBuYW1lcy4gVGhlIHJlYXNvbiB3YXMgdGhhdCBpdCBjb21wYXJlZCB0aGUgcXVvdGVkIHZlcnNpb24KICAgICBvZiBzdHJpbmdzIGFzIGEgcmVzdWx0ICJPQ1NQIiA+ICJPQ1NQIFNpZ25pbmciIGJlY2F1c2UKICAgICAiID4gU1BBQ0UuIENoYW5nZWQgc2NyaXB0IHRvIHN0b3JlIHVucXVvdGVkIHZlcnNpb25zIG9mCiAgICAgbmFtZXMgYW5kIGFkZCBxdW90ZXMgb24gb3V0cHV0LiBJdCB3YXMgYWxzbyBvbWl0dGluZyBzb21lCiAgICAgbmFtZXMgZnJvbSB0aGUgbG9va3VwIHRhYmxlIGlmIHRoZXkgd2VyZSBnaXZlbiBhIGRlZmF1bHQKICAgICB2YWx1ZSAodGhhdCBpcyBpZiBTTiBpcyBtaXNzaW5nIGl0IGlzIGdpdmVuIHRoZSBzYW1lCiAgICAgdmFsdWUgYXMgTE4gYW5kIHZpY2UgdmVyc2EpLCB0aGVzZSBhcmUgbm93IGFkZGVkIG9uIHRoZQogICAgIGdyb3VuZHMgdGhhdCBpZiBhbiBvYmplY3QgaGFzIGEgbmFtZSB3ZSBzaG91bGQgYmUgYWJsZSB0bwogICAgIGxvb2sgaXQgdXAuIEZpbmFsbHkgYWRkZWQgd2FybmluZyBvdXRwdXQgd2hlbiBkdXBsaWNhdGUKICAgICBzaG9ydCBvciBsb25nIG5hbWVzIGFyZSBmb3VuZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VzIG5lZWRlZCBmb3IgVGFuZGVtIE5TSy4KICAgICBbU2NvdHQgVXJvZmYgPHNjb3R0QHh5cHJvLmNvbT5dCgogICopIEZpeCBTU0wgMi4wIHJvbGxiYWNrIGNoZWNraW5nOiBEdWUgdG8gYW4gb2ZmLWJ5LW9uZSBlcnJvciBpbgogICAgIFJTQV9wYWRkaW5nX2NoZWNrX1NTTHYyMygpLCBzcGVjaWFsIHBhZGRpbmcgd2FzIG5ldmVyIGRldGVjdGVkCiAgICAgYW5kIHRodXMgdGhlIFNTTCAzLjAvVExTIDEuMCBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IHByb3RvY29sCiAgICAgdmVyc2lvbiByb2xsYmFjayBhdHRhY2tzIHdhcyBub3QgZWZmZWN0aXZlLgoKICAgICBJbiBzMjNfY2xudC5jLCBkb24ndCB1c2Ugc3BlY2lhbCByb2xsYmFjay1hdHRhY2sgZGV0ZWN0aW9uIHBhZGRpbmcKICAgICAoUlNBX1NTTFYyM19QQURESU5HKSBpZiBTU0wgMi4wIGlzIHRoZSBvbmx5IHByb3RvY29sIGVuYWJsZWQgaW4gdGhlCiAgICAgY2xpZW50OyBzaW1pbGFybHksIGluIHMyM19zcnZyLmMsIGRvbid0IGRvIHRoZSByb2xsYmFjayBjaGVjayBpZgogICAgIFNTTCAyLjAgaXMgdGhlIG9ubHkgcHJvdG9jb2wgZW5hYmxlZCBpbiB0aGUgc2VydmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gZ2V0IGhleGR1bXBzIG9mIHVucHJpbnRhYmxlIGRhdGEgd2l0aCAnb3BlbnNzbAogICAgIGFzbjFwYXJzZScuICBCeSBpbXBsaWNhdGlvbiwgdGhlIGZ1bmN0aW9ucyBBU04xX3BhcnNlX2R1bXAoKSBhbmQKICAgICBCSU9fZHVtcF9pbmRlbnQoKSBhcmUgYWRkZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IGZ1bmN0aW9ucyBBU04xX1NUUklOR19wcmludF9leCgpIGFuZCBYNTA5X05BTUVfcHJpbnRfZXgoKQogICAgIHRoZXNlIHByaW50IG91dCBzdHJpbmdzIGFuZCBuYW1lIHN0cnVjdHVyZXMgYmFzZWQgb24gdmFyaW91cwogICAgIGZsYWdzIGluY2x1ZGluZyBSRkMyMjUzIHN1cHBvcnQgYW5kIHByb3BlciBoYW5kbGluZyBvZgogICAgIG11bHRpYnl0ZSBjaGFyYWN0ZXJzLiBBZGRlZCBvcHRpb25zIHRvIHRoZSAneDUwOScgdXRpbGl0eSAKICAgICB0byBhbGxvdyB0aGUgdmFyaW91cyBmbGFncyB0byBiZSBzZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyBmaXhlcyB0byB1c2UgQVNOMV9USU1FIGluc3RlYWQgb2YgQVNOMV9VVENUSU1FLgogICAgIEFsc28gY2hhbmdlIHRoZSBmdW5jdGlvbnMgWDUwOV9jbXBfY3VycmVudF90aW1lKCkgYW5kCiAgICAgWDUwOV9nbXRpbWVfYWRqKCkgd29yayB3aXRoIGFuIEFTTjFfVElNRSBzdHJ1Y3R1cmUsCiAgICAgdGhpcyB3aWxsIGVuYWJsZSBjZXJ0aWZpY2F0ZXMgdXNpbmcgR2VuZXJhbGl6ZWRUaW1lIGluIHZhbGlkaXR5CiAgICAgZGF0ZXMgdG8gYmUgY2hlY2tlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHRoZSBORUdfUFVCS0VZX0JVRyBjb2RlICh3aGljaCB0b2xlcmF0ZXMgaW52YWxpZAogICAgIG5lZ2F0aXZlIHB1YmxpYyBrZXkgZW5jb2RpbmdzKSBvbiBieSBkZWZhdWx0LAogICAgIE5PX05FR19QVUJLRVlfQlVHIGNhbiBiZSBzZXQgdG8gZGlzYWJsZSBpdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gYzJpX0FTTjFfT0JKRUNUKCkgd2hpY2ggYWN0cyBvbiBBU04xX09CSkVDVAogICAgIGNvbnRlbnQgb2N0ZXRzLiBBbiBpMmNfQVNOMV9PQkpFQ1QgaXMgdW5uZWNlc3NhcnkgYmVjYXVzZQogICAgIHRoZSBlbmNvZGluZyBjYW4gYmUgdHJpdmlhbGx5IG9idGFpbmVkIGZyb20gdGhlIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBjcnlwdG8vZXJyLmMgbG9ja2luZyBidWdmaXg6IFVzZSB3cml0ZSBsb2NrcyAoQ1JZUFRPX3dfW3VuXWxvY2spLAogICAgIG5vdCByZWFkIGxvY2tzIChDUllQVE9fcl9bdW5dbG9jaykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQSBmaXJzdCBhdHRlbXB0IGF0IGNyZWF0aW5nIG9mZmljaWFsIHN1cHBvcnQgZm9yIHNoYXJlZAogICAgIGxpYnJhcmllcyB0aHJvdWdoIGNvbmZpZ3VyYXRpb24uICBJJ3ZlIGtlcHQgaXQgc28gdGhlCiAgICAgZGVmYXVsdCBpcyBzdGF0aWMgbGlicmFyaWVzIG9ubHksIGFuZCB0aGUgT3BlblNTTCBwcm9ncmFtcwogICAgIGFyZSBhbHdheXMgc3RhdGljYWxseSBsaW5rZWQgZm9yIG5vdywgYnV0IHRoZXJlIGFyZQogICAgIHByZXBhcmF0aW9ucyBmb3IgZHluYW1pYyBsaW5raW5nIGluIHBsYWNlLgogICAgIFRoaXMgaGFzIGJlZW4gdGVzdGVkIG9uIExpbnV4IGFuZCBUcnU2NC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSYW5kb21uZXNzIHBvbGxpbmcgZnVuY3Rpb24gZm9yIFdpbjl4LCBhcyBkZXNjcmliZWQgaW46CiAgICAgUGV0ZXIgR3V0bWFubiwgU29mdHdhcmUgR2VuZXJhdGlvbiBvZiBQcmFjdGljYWxseSBTdHJvbmcKICAgICBSYW5kb20gTnVtYmVycy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IHNvIFBSTkcgaXMgc2VlZGVkIGluIHJlcSBpZiB1c2luZyBhbiBhbHJlYWR5IGV4aXN0aW5nCiAgICAgRFNBIGtleS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9ucyB0byBzbWltZSBhcHBsaWNhdGlvbi4gLWluZm9ybSBhbmQgLW91dGZvcm0KICAgICBhbGxvdyBhbHRlcm5hdGl2ZSBmb3JtYXRzIGZvciB0aGUgUy9NSU1FIG1lc3NhZ2UgaW5jbHVkaW5nCiAgICAgUEVNIGFuZCBERVIuIFRoZSAtY29udGVudCBvcHRpb24gYWxsb3dzIHRoZSBjb250ZW50IHRvIGJlCiAgICAgc3BlY2lmaWVkIHNlcGFyYXRlbHkuIFRoaXMgc2hvdWxkIGFsbG93IHRoaW5ncyBsaWtlIE5ldHNjYXBlCiAgICAgZm9ybSBzaWduaW5nIG91dHB1dCBlYXNpZXIgdG8gdmVyaWZ5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0aGUgQVNOMSBlbmNvZGluZyBvZiB0YWdzIHVzaW5nIHRoZSAnbG9uZyBmb3JtJy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQVNOMSBmdW5jdGlvbnMsIGkyY18qIGFuZCBjMmlfKiBmb3IgSU5URUdFUiBhbmQgQklUCiAgICAgU1RSSU5HIHR5cGVzLiBUaGVzZSBjb252ZXJ0IGNvbnRlbnQgb2N0ZXRzIHRvIGFuZCBmcm9tIHRoZQogICAgIHVuZGVybHlpbmcgdHlwZS4gVGhlIGFjdHVhbCB0YWcgYW5kIGxlbmd0aCBvY3RldHMgYXJlCiAgICAgYWxyZWFkeSBhc3N1bWVkIHRvIGhhdmUgYmVlbiByZWFkIGluIGFuZCBjaGVja2VkLiBUaGVzZQogICAgIGFyZSBuZWVkZWQgYmVjYXVzZSBhbGwgb3RoZXIgc3RyaW5nIHR5cGVzIGhhdmUgdmlydHVhbGx5CiAgICAgaWRlbnRpY2FsIGhhbmRsaW5nIGFwYXJ0IGZyb20gdGhlIHRhZy4gQnkgaGF2aW5nIHZlcnNpb25zCiAgICAgb2YgdGhlIEFTTjEgZnVuY3Rpb25zIHRoYXQganVzdCBvcGVyYXRlIG9uIGNvbnRlbnQgb2N0ZXRzCiAgICAgSU1QTElDSVQgdGFnZ2luZyBjYW4gYmUgaGFuZGxlZCBwcm9wZXJseS4gSXQgYWxzbyBhbGxvd3MKICAgICB0aGUgQVNOMV9FTlVNRVJBVEVEIGNvZGUgdG8gYmUgY3V0IGRvd24gYmVjYXVzZSBBU04xX0VOVU1FUkFURUQKICAgICBhbmQgQVNOMV9JTlRFR0VSIGFyZSBpZGVudGljYWwgYXBhcnQgZnJvbSB0aGUgdGFnLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0aGUgaGFuZGxpbmcgb2YgT0lEIG9iamVjdHMgYXMgZm9sbG93czoKCiAgICAgLSBOZXcgb2JqZWN0IGlkZW50aWZpZXJzIGFyZSBpbnNlcnRlZCBpbiBvYmplY3RzLnR4dCwgZm9sbG93aW5nCiAgICAgICB0aGUgc3ludGF4IGdpdmVuIGluIG9iamVjdHMuUkVBRE1FLgogICAgIC0gb2JqZWN0cy5wbCBpcyB1c2VkIHRvIHByb2Nlc3Mgb2JqX21hYy5udW0gYW5kIGNyZWF0ZSBhIG5ldwogICAgICAgb2JqX21hYy5oLgogICAgIC0gb2JqX2RhdC5wbCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvYmpfZGF0LmgsIHVzaW5nIHRoZSBkYXRhIGluCiAgICAgICBvYmpfbWFjLmguCgogICAgIFRoaXMgaXMgY3VycmVudGx5IGtpbmQgb2YgYSBoYWNrLCBhbmQgdGhlIHBlcmwgY29kZSBpbiBvYmplY3RzLnBsCiAgICAgaXNuJ3QgdmVyeSBlbGVnYW50LCBidXQgaXQgd29ya3MgYXMgSSBpbnRlbmRlZC4gIFRoZSBzaW1wbGVzdCB3YXkKICAgICB0byBjaGVjayB0aGF0IGl0IHdvcmtlZCBjb3JyZWN0bHkgaXMgdG8gbG9vayBpbiBvYmpfZGF0LmggYW5kCiAgICAgY2hlY2sgdGhlIGFycmF5IG5pZF9vYmpzIGFuZCBtYWtlIHN1cmUgdGhlIG9iamVjdHMgaGF2ZW4ndCBtb3ZlZAogICAgIGFyb3VuZCAodGhpcyBpcyBpbXBvcnRhbnQhKS4gIEFkZGl0aW9ucyBhcmUgT0ssIGFzIHdlbGwgYXMKICAgICBjb25zaXN0ZW50IG5hbWUgY2hhbmdlcy4gCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIEJTRC1zdHlsZSBNRDUtYmFzZWQgcGFzc3dvcmRzIHRvICdvcGVuc3NsIHBhc3N3ZCcgKG9wdGlvbiAnLTEnKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGRpdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlciAnLXJhbmQgZmlsZScgdG8gJ29wZW5zc2wgcmVxJy4KICAgICBUaGUgZ2l2ZW4gZmlsZSBhZGRzIHRvIHdoYXRldmVyIGhhcyBhbHJlYWR5IGJlZW4gc2VlZGVkIGludG8gdGhlCiAgICAgcmFuZG9tIHBvb2wgdGhyb3VnaCB0aGUgUkFOREZJTEUgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbiBvcgogICAgIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciB0aGUgZGVmYXVsdCByYW5kb20gc3RhdGUgZmlsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBta3N0YWNrLnBsIG5vdyBzb3J0cyBlYWNoIG1hY3JvIGdyb3VwIGludG8gbGV4aWNhbCBvcmRlci4KICAgICBQcmV2aW91c2x5IHRoZSBvdXRwdXQgb3JkZXIgZGVwZW5kZWQgb24gdGhlIG9yZGVyIHRoZSBmaWxlcwogICAgIGFwcGVhcmVkIGluIHRoZSBkaXJlY3RvcnksIHJlc3VsdGluZyBpbiBuZWVkbGVzcyByZXdyaXRpbmcKICAgICBvZiBzYWZlc3RhY2suaCAuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUGF0Y2hlcyB0byBtYWtlIE9wZW5TU0wgY29tcGlsZSB1bmRlciBXaW4zMiBhZ2Fpbi4gTW9zdGx5CiAgICAgd29yayBhcm91bmRzIGZvciB0aGUgVkMrKyBwcm9ibGVtIHRoYXQgaXQgdHJlYXRzIGZ1bmMoKSBhcwogICAgIGZ1bmModm9pZCkuIEFsc28gc3RyaXBwZWQgb3V0IHRoZSBwYXJ0cyBvZiBta2RlZi5wbCB0aGF0CiAgICAgYWRkZWQgZXh0cmEgdHlwZXNhZmUgZnVuY3Rpb25zOiB0aGVzZSBubyBsb25nZXIgZXhpc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVvcmdhbmlzYXRpb24gb2YgdGhlIHN0YWNrIGNvZGUuIFRoZSBtYWNyb3MgYXJlIG5vdyBhbGwgCiAgICAgY29sbGVjdGVkIGluIHNhZmVzdGFjay5oIC4gRWFjaCBtYWNybyBpcyBkZWZpbmVkIGluIHRlcm1zIG9mCiAgICAgYSAic3RhY2sgbWFjcm8iIG9mIHRoZSBmb3JtIFNLTV88bmFtZT4odHlwZSwgYSwgYikuIFRoZSAKICAgICBERUJVR19TQUZFU1RBQ0sgaXMgbm93IGhhbmRsZWQgaW4gdGVybXMgb2YgZnVuY3Rpb24gY2FzdHMsCiAgICAgdGhpcyBoYXMgdGhlIGFkdmFudGFnZSBvZiByZXRhaW5pbmcgdHlwZSBzYWZldHkgd2l0aG91dCB0aGUKICAgICB1c2Ugb2YgYWRkaXRpb25hbCBmdW5jdGlvbnMuIElmIERFQlVHX1NBRkVTVEFDSyBpcyBub3QgZGVmaW5lZAogICAgIHRoZW4gdGhlIG5vbiB0eXBlc2FmZSBtYWNyb3MgYXJlIHVzZWQgaW5zdGVhZC4gQWxzbyBtb2RpZmllZCB0aGUKICAgICBta3N0YWNrLnBsIHNjcmlwdCB0byBoYW5kbGUgdGhlIG5ldyBmb3JtLiBOZWVkcyB0ZXN0aW5nIHRvIHNlZQogICAgIGlmIHdoaWNoIChpZiBhbnkpIGNvbXBpbGVycyBpdCBjaG9rZXMgYW5kIG1heWJlIG1ha2UgREVCVUdfU0FGRVNUQUNLCiAgICAgdGhlIGRlZmF1bHQgaWYgbm8gbWFqb3IgcHJvYmxlbXMuIFNpbWlsYXIgYmVoYXZpb3VyIGZvciBBU04xX1NFVF9PRgogICAgIGFuZCBQS0NTMTJfU1RBQ0tfT0YuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgV2hlbiBzb21lIHZlcnNpb25zIG9mIElJUyB1c2UgdGhlICdORVQnIGZvcm0gb2YgcHJpdmF0ZSBrZXkgdGhlCiAgICAga2V5IGRlcml2YXRpb24gYWxnb3JpdGhtIGlzIGRpZmZlcmVudC4gTm9ybWFsbHkgTUQ1KHBhc3N3b3JkKSBpcwogICAgIHVzZWQgYXMgYSAxMjggYml0IFJDNCBrZXkuIEluIHRoZSBtb2RpZmllZCBjYXNlCiAgICAgTUQ1KE1ENShwYXNzd29yZCkgKyAiU0dDS0VZU0FMVCIpICBpcyB1c2VkIGluc3RlYWQuIEFkZGVkIHNvbWUKICAgICBuZXcgZnVuY3Rpb25zIGkyZF9SU0FfTkVUKCksIGQyaV9SU0FfTkVUKCkgZXRjIHdoaWNoIGFyZSB0aGUgc2FtZQogICAgIGFzIHRoZSBvbGQgTmV0c2NhcGVfUlNBIGZ1bmN0aW9ucyBleGNlcHQgdGhleSBoYXZlIGFuIGFkZGl0aW9uYWwKICAgICAnc2dja2V5JyBwYXJhbWV0ZXIgd2hpY2ggdXNlcyB0aGUgbW9kaWZpZWQgYWxnb3JpdGhtLiBBbHNvIGFkZGVkCiAgICAgYW4gLXNnY2tleSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHRoZSByc2EgdXRpbGl0eS4gVGhhbmtzIHRvIAogICAgIEFkcmlhbiBQZWNrIDxiZXJ0aWVAbmNpcGhlci5jb20+IGZvciBwb3N0aW5nIGRldGFpbHMgb2YgdGhlIG1vZGlmaWVkCiAgICAgYWxnb3JpdGhtIHRvIG9wZW5zc2wtZGV2LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRoZSBldnBfbG9jYWwuaCBtYWNyb3Mgd2VyZSB1c2luZyAnYy4jI2tuYW1lJyB3aGljaCByZXN1bHRlZCBpbgogICAgIGludmFsaWQgZXhwYW5zaW9uIG9uIHNvbWUgc3lzdGVtcyAoU0NPIDUuMC41IGZvciBleGFtcGxlKS4KICAgICBDb3JyZWN0ZWQgdG8gJ2Mua25hbWUnLgogICAgIFtQaGlsbGlwIFBvcmNoIDxyb290QHRoZXBvcmNoLmNvbT5dCgogICopIE5ldyBYNTA5X2dldDFfZW1haWwoKSBhbmQgWDUwOV9SRVFfZ2V0MV9lbWFpbCgpIGZ1bmN0aW9ucyB0aGF0IHJldHVybgogICAgIGEgU1RBQ0sgb2YgZW1haWwgYWRkcmVzc2VzIGZyb20gYSBjZXJ0aWZpY2F0ZSBvciByZXF1ZXN0LCB0aGVzZSBsb29rCiAgICAgaW4gdGhlIHN1YmplY3QgbmFtZSBhbmQgdGhlIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZSBleHRlbnNpb25zIGFuZCAKICAgICBvbWl0IGFueSBkdXBsaWNhdGUgYWRkcmVzc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlLWltcGxlbWVudCBCTl9tb2RfZXhwMl9tb250IHVzaW5nIGluZGVwZW5kZW50IChhbmQgbGFyZ2VyKSB3aW5kb3dzLgogICAgIFRoaXMgbWFrZXMgRFNBIHZlcmlmaWNhdGlvbiBhYm91dCAyICUgZmFzdGVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluY3JlYXNlIG1heGltdW0gd2luZG93IHNpemUgaW4gQk5fbW9kX2V4cF8uLi4gdG8gNiBiaXRzIGluc3RlYWQgb2YgNQogICAgIChtZWFuaW5nIHRoYXQgbm93IDJeNSB2YWx1ZXMgd2lsbCBiZSBwcmVjb21wdXRlZCwgd2hpY2ggaXMgb25seSA0IEtCCiAgICAgcGx1cyBvdmVyaGVhZCBmb3IgMTAyNCBiaXQgbW9kdWxpKS4KICAgICBUaGlzIG1ha2VzIGV4cG9uZW50aWF0aW9ucyBhYm91dCAwLjUgJSBmYXN0ZXIgZm9yIDEwMjQgYml0CiAgICAgZXhwb25lbnRzIChhcyBtZWFzdXJlZCBieSAib3BlbnNzbCBzcGVlZCByc2EyMDQ4IikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVuYW1lIG1lbW9yeSBoYW5kbGluZyBtYWNyb3MgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb3RoZXIKICAgICBzb2Z0d2FyZToKICAgICAgICAgIE1hbGxvYyAgICAgICAgID0+ICBPUEVOU1NMX21hbGxvYwogICAgICAgICAgTWFsbG9jX2xvY2tlZCAgPT4gIE9QRU5TU0xfbWFsbG9jX2xvY2tlZAogICAgICAgICAgUmVhbGxvYyAgICAgICAgPT4gIE9QRU5TU0xfcmVhbGxvYwogICAgICAgICAgRnJlZSAgICAgICAgICAgPT4gIE9QRU5TU0xfZnJlZQogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbiBCTl9tb2RfZXhwX21vbnRfd29yZCBmb3Igc21hbGwgYmFzZXMgKHJvdWdobHkgMTUlCiAgICAgZmFzdGVyIHRoYW4gQk5fbW9kX2V4cF9tb250LCBpLmUuIDclIGZvciBhIGZ1bGwgREggZXhjaGFuZ2UpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEN5Z1dpbjMyIHN1cHBvcnQuCiAgICAgW0pvaG4gSmFydmllIDxqamFydmllQG5ld3NndXkuY29tPl0KCiAgKikgVGhlIHR5cGUtc2FmZSBzdGFjayBjb2RlIGhhcyBiZWVuIHJlamlnZ2VkLiBJdCBpcyBub3cgb25seSBjb21waWxlZAogICAgIGluIHdoZW4gT3BlblNTTCBpcyBjb25maWd1cmVkIHdpdGggdGhlIERFQlVHX1NBRkVTVEFDSyBvcHRpb24gYW5kCiAgICAgYnkgZGVmYXVsdCBhbGwgdHlwZS1zcGVjaWZpYyBzdGFjayBmdW5jdGlvbnMgYXJlICIjZGVmaW5lImQgYmFjayB0bwogICAgIHN0YW5kYXJkIHN0YWNrIGZ1bmN0aW9ucy4gVGhpcyByZXN1bHRzIGluIG1vcmUgc3RyZWFtbGluZWQgb3V0cHV0CiAgICAgYnV0IHJldGFpbnMgdGhlIHR5cGUtc2FmZXR5IGNoZWNraW5nIHBvc3NpYmlsaXRpZXMgb2YgdGhlIG9yaWdpbmFsCiAgICAgYXBwcm9hY2guCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgVGhlIFNUQUNLIGNvZGUgaGFzIGJlZW4gY2xlYW5lZCB1cCwgYW5kIGNlcnRhaW4gdHlwZSBkZWNsYXJhdGlvbnMKICAgICB0aGF0IGRpZG4ndCBtYWtlIGEgbG90IG9mIHNlbnNlIGhhdmUgYmVlbiBicm91Z2h0IGluIGxpbmUuIFRoaXMgaGFzCiAgICAgYWxzbyBpbnZvbHZlZCBhIGNsZWFudXAgb2Ygc29ydHMgaW4gc2FmZXN0YWNrLmggdG8gbW9yZSBjb3JyZWN0bHkKICAgICBtYXAgdHlwZS1zYWZlIHN0YWNrIGZ1bmN0aW9ucyBvbnRvIHRoZWlyIHBsYWluIHN0YWNrIGNvdW50ZXJwYXJ0cy4KICAgICBUaGlzIHdvcmsgaGFzIGFsc28gcmVzdWx0ZWQgaW4gYSB2YXJpZXR5IG9mICJjb25zdCJpZmljYXRpb25zIG9mCiAgICAgbG90cyBvZiB0aGUgY29kZSwgZXNwZWNpYWxseSAiX2NtcCIgb3BlcmF0aW9ucyB3aGljaCBzaG91bGQgbm9ybWFsbHkKICAgICBiZSBwcm90b3R5cGVkIHdpdGggImNvbnN0IiBwYXJhbWV0ZXJzIGFueXdheS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBXaGVuIGdlbmVyYXRpbmcgYnl0ZXMgZm9yIHRoZSBmaXJzdCB0aW1lIGluIG1kX3JhbmQuYywgJ3N0aXIgdGhlIHBvb2wnCiAgICAgYnkgc2VlZGluZyB3aXRoIFNUQVRFX1NJWkUgZHVtbXkgYnl0ZXMgKHdpdGggemVybyBlbnRyb3B5IGNvdW50KS4KICAgICAoVGhlIFBSTkcgc3RhdGUgY29uc2lzdHMgb2YgdHdvIHBhcnRzLCB0aGUgbGFyZ2UgcG9vbCAnc3RhdGUnIGFuZCAnbWQnLAogICAgIHdoZXJlIGFsbCBvZiAnbWQnIGlzIHVzZWQgZWFjaCB0aW1lIHRoZSBQUk5HIGlzIHVzZWQsIGJ1dCAnc3RhdGUnCiAgICAgaXMgdXNlZCBvbmx5IGluZGV4ZWQgYnkgYSBjeWNsaWMgY291bnRlci4gQXMgZW50cm9weSBtYXkgbm90IGJlCiAgICAgd2VsbCBkaXN0cmlidXRlZCBmcm9tIHRoZSBiZWdpbm5pbmcsICdtZCcgaXMgaW1wb3J0YW50IGFzIGEKICAgICBjaGFpbmluZyB2YXJpYWJsZS4gSG93ZXZlciwgdGhlIG91dHB1dCBmdW5jdGlvbiBjaGFpbnMgb25seSBoYWxmCiAgICAgb2YgJ21kJywgaS5lLiA4MCBiaXRzLiAgc3NsZWF5X3JhbmRfYWRkLCBvbiB0aGUgb3RoZXIgaGFuZCwgY2hhaW5zCiAgICAgYWxsIG9mICdtZCcsIGFuZCBzZWVkaW5nIHdpdGggU1RBVEVfU0laRSBkdW1teSBieXRlcyB3aWxsIHJlc3VsdAogICAgIGluIGFsbCBvZiAnc3RhdGUnIGJlaW5nIHJld3JpdHRlbiwgd2l0aCB0aGUgbmV3IHZhbHVlcyBkZXBlbmRpbmcKICAgICBvbiB2aXJ0dWFsbHkgYWxsIG9mICdtZCcuICBUaGlzIG92ZXJjb21lcyB0aGUgODAgYml0IGxpbWl0YXRpb24uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIHNzbC9zMl9jbG50LmMgYW5kIHNzbC9zM19jbG50LmMsIGNhbGwgRVJSX2NsZWFyX2Vycm9yKCkgd2hlbgogICAgIHRoZSBoYW5kc2hha2UgaXMgY29udGludWVkIGFmdGVyIHNzbF92ZXJpZnlfY2VydF9jaGFpbigpOwogICAgIG90aGVyd2lzZSwgaWYgU1NMX1ZFUklGWV9OT05FIGlzIHNldCwgcmVtYWluaW5nIGVycm9yIGNvZGVzCiAgICAgY2FuIGxlYWQgdG8gJ3VuZXhwbGFpbmFibGUnIGNvbm5lY3Rpb24gYWJvcnRzIGxhdGVyLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gdHJhY2tlZCBkb3duIGJ5IEx1dHogSmFlbmlja2VdCgogICopIE1ham9yIEVWUCBBUEkgY2lwaGVyIHJldmlzaW9uLgogICAgIEFkZCBob29rcyBmb3IgZXh0cmEgRVZQIGZlYXR1cmVzLiBUaGlzIGFsbG93cyB2YXJpb3VzIGNpcGhlcgogICAgIHBhcmFtZXRlcnMgdG8gYmUgc2V0IGluIHRoZSBFVlAgaW50ZXJmYWNlLiBTdXBwb3J0IGFkZGVkIGZvciB2YXJpYWJsZQogICAgIGtleSBsZW5ndGggY2lwaGVycyB2aWEgdGhlIEVWUF9DSVBIRVJfQ1RYX3NldF9rZXlfbGVuZ3RoKCkgZnVuY3Rpb24gYW5kCiAgICAgc2V0dGluZyBvZiBSQzIgYW5kIFJDNSBwYXJhbWV0ZXJzLgoKICAgICBNb2RpZnkgRVZQX09wZW5Jbml0KCkgYW5kIEVWUF9TZWFsSW5pdCgpIHRvIGNvcGUgd2l0aCB2YXJpYWJsZSBrZXkgbGVuZ3RoCiAgICAgY2lwaGVycy4KCiAgICAgUmVtb3ZlIGxvdHMgb2YgZHVwbGljYXRlZCBjb2RlIGZyb20gdGhlIEVWUCBsaWJyYXJ5LiBGb3IgZXhhbXBsZSAqZXZlcnkqCiAgICAgY2lwaGVyIGluaXQoKSBmdW5jdGlvbiBoYW5kbGVzIHRoZSAnaXYnIGluIHRoZSBzYW1lIHdheSBhY2NvcmRpbmcgdG8gdGhlCiAgICAgY2lwaGVyIG1vZGUuIFRoZXkgYWxzbyBhbGwgZG8gbm90aGluZyBpZiB0aGUgJ2tleScgcGFyYW1ldGVyIGlzIE5VTEwgYW5kCiAgICAgZm9yIENGQiBhbmQgT0ZCIG1vZGVzIHRoZXkgemVybyBjdHgtPm51bS4KCiAgICAgTmV3IGZ1bmN0aW9uYWxpdHkgYWxsb3dzIHJlbW92YWwgb2YgUy9NSU1FIGNvZGUgUkMyIGhhY2suCgogICAgIE1vc3Qgb2YgdGhlIHJvdXRpbmVzIGhhdmUgdGhlIHNhbWUgZm9ybSBhbmQgc28gY2FuIGJlIGRlY2xhcmVkIGluIHRlcm1zCiAgICAgb2YgbWFjcm9zLgoKICAgICBCeSBzaGlmdGluZyB0aGlzIHRvIHRoZSB0b3AgbGV2ZWwgRVZQX0NpcGhlckluaXQoKSBpdCBjYW4gYmUgcmVtb3ZlZCBmcm9tCiAgICAgYWxsIGluZGl2aWR1YWwgY2lwaGVycy4gSWYgdGhlIGNpcGhlciB3YW50cyB0byBoYW5kbGUgSVZzIG9yIGtleXMKICAgICBkaWZmZXJlbnRseSBpdCBjYW4gc2V0IHRoZSBFVlBfQ0lQSF9DVVNUT01fSVYgb3IgRVZQX0NJUEhfQUxXQVlTX0NBTExfSU5JVAogICAgIGZsYWdzLgoKICAgICBDaGFuZ2UgbG90cyBvZiBmdW5jdGlvbnMgbGlrZSBFVlBfRW5jcnlwdFVwZGF0ZSgpIHRvIG5vdyByZXR1cm4gYQogICAgIHZhbHVlOiBhbHRob3VnaCBzb2Z0d2FyZSB2ZXJzaW9ucyBvZiB0aGUgYWxnb3JpdGhtcyBjYW5ub3QgZmFpbAogICAgIGFueSBpbnN0YWxsZWQgaGFyZHdhcmUgdmVyc2lvbnMgY2FuLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCBTU0xfT1BfVExTX1JPTExCQUNLX0JVRzogSW4gc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwgaWYKICAgICB0aGlzIG9wdGlvbiBpcyBzZXQsIHRvbGVyYXRlIGJyb2tlbiBjbGllbnRzIHRoYXQgc2VuZCB0aGUgbmVnb3RpYXRlZAogICAgIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIGluc3RlYWQgb2YgdGhlIHJlcXVlc3RlZCBwcm90b2NvbCB2ZXJzaW9uCiAgICAgbnVtYmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENhbGwgZGhfdG1wX2NiIChzZXQgYnkgLi4uX1RNUF9ESF9DQikgd2l0aCBjb3JyZWN0ICdpc19leHBvcnQnIGZsYWc7CiAgICAgaS5lLiBub24temVybyBmb3IgZXhwb3J0IGNpcGhlcnN1aXRlcywgemVybyBvdGhlcndpc2UuCiAgICAgUHJldmlvdXMgdmVyc2lvbnMgaGFkIHRoaXMgZmxhZyBpbnZlcnRlZCwgaW5jb25zaXN0ZW50IHdpdGgKICAgICByc2FfdG1wX2NiICguLi5fVE1QX1JTQV9DQikuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSByZXBvcnRlZCBieSBBbWl0IENob3ByYV0KCiAgKikgQWRkIG1pc3NpbmcgRFNBIGxpYnJhcnkgdGV4dCBzdHJpbmcuIFdvcmsgYXJvdW5kIGZvciBzb21lIElJUwogICAgIGtleSBmaWxlcyB3aXRoIGludmFsaWQgU0VRVUVOQ0UgZW5jb2RpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZG9jdW1lbnQgKGRvYy9zdGFuZGFyZHMudHh0KSB0aGF0IGxpc3QgYWxsIGtpbmRzIG9mIHN0YW5kYXJkcwogICAgIGFuZCBzbyBvbiB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiBPcGVuU1NMLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEVuaGFuY2UgY19yZWhhc2ggc2NyaXB0LiBPbGQgdmVyc2lvbiB3b3VsZCBtaXNoYW5kbGUgY2VydGlmaWNhdGVzCiAgICAgd2l0aCB0aGUgc2FtZSBzdWJqZWN0IG5hbWUgaGFzaCBhbmQgd291bGRuJ3QgaGFuZGxlIENSTHMgYXQgYWxsLgogICAgIEFkZGVkIC1maW5nZXJwcmludCBvcHRpb24gdG8gY3JsIHV0aWxpdHksIHRvIHN1cHBvcnQgbmV3IGNfcmVoYXNoCiAgICAgZmVhdHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRWxpbWluYXRlIG5vbi1BTlNJIGRlY2xhcmF0aW9ucyBpbiBjcnlwdG8uaCBhbmQgc3RhY2suaC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IGZvciBTU0wgc2VydmVyIHB1cnBvc2UgY2hlY2tpbmcuIFNlcnZlciBjaGVja2luZyB3YXMKICAgICByZWplY3RpbmcgY2VydGlmaWNhdGVzIHdoaWNoIGhhZCBleHRlbmRlZCBrZXkgdXNhZ2UgcHJlc2VudAogICAgIGJ1dCBubyBzc2wgY2xpZW50IHB1cnBvc2UuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgUmVuZSBHcm9zc2VyIDxncm9zc2VyQGhpc29sdXRpb25zLmNvbT5dCgogICopIE1ha2UgUEtDUyMxMiBjb2RlIHdvcmsgd2l0aCBubyBwYXNzd29yZC4gVGhlIFBLQ1MjMTIgc3BlYwogICAgIGlzIGEgbGl0dGxlIHVuY2xlYXIgYWJvdXQgaG93IGEgYmxhbmsgcGFzc3dvcmQgaXMgaGFuZGxlZC4KICAgICBTaW5jZSB0aGUgcGFzc3dvcmQgaW4gZW5jb2RlZCBhcyBhIEJNUFN0cmluZyB3aXRoIHRlcm1pbmF0aW5nCiAgICAgZG91YmxlIE5VTEwgYSB6ZXJvIGxlbmd0aCBwYXNzd29yZCB3b3VsZCBlbmQgdXAgYXMganVzdCB0aGUKICAgICBkb3VibGUgTlVMTC4gSG93ZXZlciBubyBwYXNzd29yZCBhdCBhbGwgaXMgZGlmZmVyZW50IGFuZCBpcwogICAgIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIFBLQ1MjMTIga2V5IGdlbmVyYXRpb24gY29kZS4gTlMKICAgICB0cmVhdHMgYSBibGFuayBwYXNzd29yZCBhcyB6ZXJvIGxlbmd0aC4gTVNJRSB0cmVhdHMgaXQgYXMgbm8KICAgICBwYXNzd29yZCBvbiBleHBvcnQ6IGJ1dCBpdCB3aWxsIHRyeSBib3RoIG9uIGltcG9ydC4gV2Ugbm93IGRvCiAgICAgdGhlIHNhbWU6IFBLQ1MxMl9wYXJzZSgpIHRyaWVzIHplcm8gbGVuZ3RoIGFuZCBubyBwYXNzd29yZCBpZgogICAgIHRoZSBwYXNzd29yZCBpcyBzZXQgdG8gIiIgb3IgTlVMTCAoTlVMTCBpcyBub3cgYSB2YWxpZCBwYXNzd29yZDoKICAgICBpdCB3YXNuJ3QgYmVmb3JlKSBhcyBkb2VzIHRoZSBwa2NzMTIgYXBwbGljYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVnZml4ZXMgaW4gYXBwcy94NTA5LmM6IEF2b2lkIGEgbWVtb3J5IGxlYWs7IGFuZCBkb24ndCB1c2UKICAgICBwZXJyb3Igd2hlbiBQRU1fcmVhZF9iaW9fWDUwOV9SRVEgZmFpbHMsIHRoZSBlcnJvciBtZXNzYWdlIG11c3QKICAgICBiZSBvYnRhaW5lZCBmcm9tIHRoZSBlcnJvciBxdWV1ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBdm9pZCAndGhyZWFkX2hhc2gnIG1lbW9yeSBsZWFrIGluIGNyeXB0by9lcnIvZXJyLmMgYnkgZnJlZWluZwogICAgIGl0IGluIEVSUl9yZW1vdmVfc3RhdGUgaWYgYXBwcm9wcmlhdGUsIGFuZCBjaGFuZ2UgRVJSX2dldF9zdGF0ZQogICAgIGFjY29yZGluZ2x5IHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyAodGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZQogICAgIHRocmVhZF9oYXNoIGlzIG5vIGxvbmdlciBjb25zdGFudCBvbmNlIHNldCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4IGZvciBsaW51eC1lbGYgbWFrZWZpbGUub25lLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKCkgd2lsbCBub3cgY2F1c2UgYSBkZWZhdWx0CiAgICAgUlNBX01FVEhPRCB0byBiZSBjaG9zZW4gaWYgb25lIGRvZXNuJ3QgZXhpc3QgYWxyZWFkeS4KICAgICBQcmV2aW91c2x5IHRoaXMgd2FzIG9ubHkgc2V0IGR1cmluZyBhIGNhbGwgdG8gUlNBX25ldygpCiAgICAgb3IgUlNBX25ld19tZXRob2QoTlVMTCkgbWVhbmluZyBpdCB3YXMgcG9zc2libGUgZm9yCiAgICAgUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpIHRvIHJldHVybiBOVUxMLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZGVkIG5hdGl2ZSBuYW1lIHRyYW5zbGF0aW9uIHRvIHRoZSBleGlzdGluZyBEU08gY29kZQogICAgIHRoYXQgd2lsbCBjb252ZXJ0IChpZiB0aGUgZmxhZyB0byBkbyBzbyBpcyBzZXQpIGZpbGVuYW1lcwogICAgIHRoYXQgYXJlIHN1ZmZpY2llbnRseSBzbWFsbCBhbmQgaGF2ZSBubyBwYXRoIGluZm9ybWF0aW9uCiAgICAgaW50byBhIGNhbm9uaWNhbCBuYXRpdmUgZm9ybS4gRWcuICJibGFoIiBjb252ZXJ0ZWQgdG8KICAgICAibGliYmxhaC5zbyIgb3IgImJsYWguZGxsIiBldGMuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTmV3IGZ1bmN0aW9uIEVSUl9lcnJvcl9zdHJpbmdfbihlLCBidWYsIGxlbikgd2hpY2ggaXMgbGlrZQogICAgIEVSUl9lcnJvcl9zdHJpbmcoZSwgYnVmKSwgYnV0IHdyaXRlcyBhdCBtb3N0ICdsZW4nIGJ5dGVzCiAgICAgaW5jbHVkaW5nIHRoZSAwIHRlcm1pbmF0b3IuICBGb3IgRVJSX2Vycm9yX3N0cmluZ19uLCAnYnVmJwogICAgIG1heSBub3QgYmUgTlVMTC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPiwgQm9kbyBNb2VsbGVyXQoKICAqKSBDT05GIGxpYnJhcnkgcmV3b3JrZWQgdG8gYmVjb21lIG1vcmUgZ2VuZXJhbC4gIEEgbmV3IENPTkYKICAgICBjb25maWd1cmF0aW9uIGZpbGUgcmVhZGVyICJjbGFzcyIgaXMgaW1wbGVtZW50ZWQgYXMgd2VsbCBhcyBhCiAgICAgbmV3IGZ1bmN0aW9ucyAoTkNPTkZfKiwgZm9yICJOZXcgQ09ORiIpIHRvIGhhbmRsZSBpdC4gIFRoZSBub3cKICAgICBvbGQgQ09ORl8qIGZ1bmN0aW9ucyBhcmUgc3RpbGwgdGhlcmUsIGJ1dCBhcmUgcmVpbXBsZW1lbnRlZCB0bwogICAgIHdvcmsgaW4gdGVybXMgb2YgdGhlIG5ldyBmdW5jdGlvbnMuICBBbHNvLCBhIHNldCBvZiBmdW5jdGlvbnMKICAgICB0byBoYW5kbGUgdGhlIGludGVybmFsIHN0b3JhZ2Ugb2YgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBpcwogICAgIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdyaXRlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUKICAgICByZWFkZXIgImNsYXNzZXMiIChJIGNhbiBkZWZpbml0ZWx5IHNlZSBzb21ldGhpbmcgcmVhZGluZyBhCiAgICAgY29uZmlndXJhdGlvbiBmaWxlIGluIFhNTCBmb3JtYXQsIGZvciBleGFtcGxlKSwgY2FsbGVkIF9DT05GXyosCiAgICAgb3IgInRoZSBjb25maWd1cmF0aW9uIHN0b3JhZ2UgQVBJIi4uLgoKICAgICBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZSByZWFkaW5nIGZ1bmN0aW9ucyBhcmU6CgogICAgICAgIE5DT05GX25ldywgTkNPTkZfZnJlZSwgTkNPTkZfbG9hZCwgTkNPTkZfbG9hZF9mcCwgTkNPTkZfbG9hZF9iaW8sCiAgICAgICAgTkNPTkZfZ2V0X3NlY3Rpb24sIE5DT05GX2dldF9zdHJpbmcsIE5DT05GX2dldF9udW1icmUKCiAgICAgICAgTkNPTkZfZGVmYXVsdCwgTkNPTkZfV0lOMzIKCiAgICAgICAgTkNPTkZfZHVtcF9mcCwgTkNPTkZfZHVtcF9iaW8KCiAgICAgTkNPTkZfZGVmYXVsdCBhbmQgTkNPTkZfV0lOMzIgYXJlIG1ldGhvZCAob3IgImNsYXNzIikgY2hvb3NlcnMsCiAgICAgTkNPTkZfbmV3IGNyZWF0ZXMgYSBuZXcgQ09ORiBvYmplY3QuICBUaGlzIHdvcmtzIGluIHRoZSBzYW1lIHdheQogICAgIGFzIG90aGVyIGludGVyZmFjZXMgaW4gT3BlblNTTCwgbGlrZSB0aGUgQklPIGludGVyZmFjZS4KICAgICBOQ09ORl9kdW1wXyogZHVtcCB0aGUgaW50ZXJuYWwgc3RvcmFnZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLAogICAgIHdoaWNoIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLiAgQWxsIG90aGVyIGZ1bmN0aW9ucyB0YWtlIHRoZSBzYW1lCiAgICAgYXJndW1lbnRzIGFzIHRoZSBvbGQgQ09ORl8qIGZ1bmN0aW9ucyB3dGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUKICAgICBmaXJzdCB0aGF0IG11c3QgYmUgYSBgQ09ORiAqJyBpbnN0ZWFkIG9mIGEgYExIQVNIIConLgoKICAgICBUbyBtYWtlIGl0IGVhc2VyIHRvIHVzZSB0aGUgbmV3IGNsYXNzZXMgd2l0aCB0aGUgb2xkIENPTkZfKiBmdW5jdGlvbnMsCiAgICAgdGhlIGZ1bmN0aW9uIENPTkZfc2V0X2RlZmF1bHRfbWV0aG9kIGlzIHByb3ZpZGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCAnLXRsczEnIG9wdGlvbiB0byAnb3BlbnNzbCBjaXBoZXJzJywgd2hpY2ggd2FzIGFscmVhZHkKICAgICBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYnV0IGhhZCBub3QgYmVlbiBpbXBsZW1lbnRlZC4KICAgICAoVGhpcyBvcHRpb24gaXMgbm90IHlldCByZWFsbHkgdXNlZnVsIGJlY2F1c2UgZXZlbiB0aGUgYWRkaXRpb25hbAogICAgIGV4cGVyaW1lbnRhbCBUTFMgMS4wIGNpcGhlcnMgYXJlIGN1cnJlbnRseSB0cmVhdGVkIGFzIFNTTCAzLjAgY2lwaGVycy4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5pdGlhbCBEU08gY29kZSBhZGRlZCBpbnRvIGxpYmNyeXB0byBmb3IgbGV0dGluZyBPcGVuU1NMIChhbmQKICAgICBPcGVuU1NMLWJhc2VkIGFwcGxpY2F0aW9ucykgbG9hZCBzaGFyZWQgbGlicmFyaWVzIGFuZCBiaW5kIHRvCiAgICAgdGhlbSBpbiBhIHBvcnRhYmxlIHdheS4KICAgICBbR2VvZmYgVGhvcnBlLCB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSBSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS41IGFuZCAwLjkuNWEgIFsxIEFwciAyMDAwXQoKICAqKSBNYWtlIHN1cmUgX2xyb3RsIGFuZCBfbHJvdHIgYXJlIG9ubHkgdXNlZCB3aXRoIE1TVkMuCgogICopIFVzZSBsb2NrIENSWVBUT19MT0NLX1JBTkQgY29ycmVjdGx5IGluIHNzbGVheV9yYW5kX3N0YXR1cwogICAgICh0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBSQU5EX3N0YXR1cykuCgogICopIFJlbmFtZSBvcGVuc3NsIHg1MDkgb3B0aW9uICctY3JsZXh0Jywgd2hpY2ggd2FzIGFkZGVkIGluIDAuOS41LAogICAgIHRvICctY2xyZXh0JyAoPSBjbGVhciBleHRlbnNpb25zKSwgYXMgaW50ZW5kZWQgYW5kIGRvY3VtZW50ZWQuCiAgICAgW0JvZG8gTW9lbGxlcjsgaW5jb25zaXN0ZW5jeSBwb2ludGVkIG91dCBieSBNaWNoYWVsIEF0dGlsaQogICAgIDxhdHRpbGlAYW1heG8uY29tPl0KCiAgKikgRml4IGZvciBITUFDLiBJdCB3YXNuJ3QgemVyb2luZyB0aGUgcmVzdCBvZiB0aGUgYmxvY2sgaWYgdGhlIGtleSBsZW5ndGgKICAgICB3YXMgbGFyZ2VyIHRoYW4gdGhlIE1EIGJsb2NrIHNpemUuICAgICAgCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgWW9zdCBXaWxsaWFtIDxZb3N0V0B0Y2UuY29tPl0KCiAgKikgTW9kZXJuaXNlIFBLQ1MxMl9wYXJzZSgpIHNvIGl0IHVzZXMgU1RBQ0tfT0YoWDUwOSkgZm9yIGl0cyBjYSBhcmd1bWVudAogICAgIGZpeCBhIGxlYWsgd2hlbiB0aGUgY2EgYXJndW1lbnQgd2FzIHBhc3NlZCBhcyBOVUxMLiBTdG9wIFg1MDlfUFVCS0VZX3NldCgpCiAgICAgdXNpbmcgdGhlIHBhc3NlZCBrZXk6IGlmIHRoZSBwYXNzZWQga2V5IHdhcyBhIHByaXZhdGUga2V5IHRoZSByZXN1bHQKICAgICBvZiBYNTA5X3ByaW50KCksIGZvciBleGFtcGxlLCB3b3VsZCBiZSB0byBwcmludCBvdXQgYWxsIHRoZSBwcml2YXRlIGtleQogICAgIGNvbXBvbmVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgZGVzX3F1YWRfY2tzdW0oKSBieXRlIG9yZGVyIGJ1ZyBmaXguCiAgICAgW1VsZiBN9mxsZXIsIHVzaW5nIHRoZSBwcm9ibGVtIGRlc2NyaXB0aW9uIGluIGtyYjQtMC45LjcsIHdoZXJlCiAgICAgIHRoZSBzb2x1dGlvbiBpcyBhdHRyaWJ1dGVkIHRvIERlcnJpY2sgSiBCcmFzaGVhciA8c2hhZG93QERFTUVOVElBLk9SRz5dCgogICopIEZpeCBzbyBWX0FTTjFfQVBQX0NIT09TRSB3b3JrcyBhZ2FpbjogaG93ZXZlciBpdHMgdXNlIGlzIHN0cm9uZ2x5CiAgICAgZGlzY291cmFnZWQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgQnJpYW4gS29ydmVyIDxicmlhbmtAY3Muc3RhbmZvcmQuZWR1Pl0KCiAgKikgRm9yIGVhc2lseSB0ZXN0aW5nIGluIHNoZWxsIHNjcmlwdHMgd2hldGhlciBzb21lIGNvbW1hbmQKICAgICAnb3BlbnNzbCBYWFgnIGV4aXN0cywgdGhlIG5ldyBwc2V1ZG8tY29tbWFuZCAnb3BlbnNzbCBuby1YWFgnCiAgICAgcmV0dXJucyB3aXRoIGV4aXQgY29kZSAwIGlmZiBubyBjb21tYW5kIG9mIHRoZSBnaXZlbiBuYW1lIGlzIGF2YWlsYWJsZS4KICAgICAnbm8tWFhYJyBpcyBwcmludGVkIGluIHRoaXMgY2FzZSwgJ1hYWCcgb3RoZXJ3aXNlLiAgSW4gYm90aCBjYXNlcywKICAgICB0aGUgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGFuZCBub3RoaW5nIGlzIHByaW50ZWQgdG8gc3RkZXJyLgogICAgIEFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBhbHdheXMgaWdub3JlZC4KCiAgICAgU2luY2UgZm9yIGVhY2ggY2lwaGVyIHRoZXJlIGlzIGEgY29tbWFuZCBvZiB0aGUgc2FtZSBuYW1lLAogICAgIHRoZSAnbm8tY2lwaGVyJyBjb21waWxhdGlvbiBzd2l0Y2hlcyBjYW4gYmUgdGVzdGVkIHRoaXMgd2F5LgoKICAgICAoJ29wZW5zc2wgbm8tWFhYJyBpcyBub3QgYWJsZSB0byBkZXRlY3QgcHNldWRvLWNvbW1hbmRzIHN1Y2gKICAgICBhcyAncXVpdCcsICdsaXN0LVhYWC1jb21tYW5kcycsIG9yICduby1YWFgnIGl0c2VsZi4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXBkYXRlIHRlc3Qgc3VpdGUgc28gdGhhdCAnbWFrZSB0ZXN0JyBzdWNjZWVkcyBpbiAnbm8tcnNhJyBjb25maWd1cmF0aW9uLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZvciBTU0xfW0NUWF9dc2V0X3RtcF9kaCwgZG9uJ3QgY3JlYXRlIGEgREgga2V5IGlmIFNTTF9PUF9TSU5HTEVfREhfVVNFCiAgICAgaXMgc2V0OyBpdCB3aWxsIGJlIHRocm93biBhd2F5IGFueXdheSBiZWNhdXNlIGVhY2ggaGFuZHNoYWtlIGNyZWF0ZXMKICAgICBpdHMgb3duIGtleS4KICAgICBzc2xfY2VydF9kdXAsIHdoaWNoIGlzIHVzZWQgYnkgU1NMX25ldywgbm93IGNvcGllcyBESCBrZXlzIGluIGFkZGl0aW9uCiAgICAgdG8gcGFyYW1ldGVycyAtLSBpbiBwcmV2aW91cyB2ZXJzaW9ucyAoc2luY2UgT3BlblNTTCAwLjkuMykgdGhlCiAgICAgJ2RlZmF1bHQga2V5JyBmcm9tIFNTTF9DVFhfc2V0X3RtcF9kaCB3b3VsZCBhbHdheXMgYmUgbG9zdCwgbWVhbmluZwogICAgIHlvdSBlZmZlY3Rpdmx5IGdvdCBTU0xfT1BfU0lOR0xFX0RIX1VTRSB3aGVuIHVzaW5nIHRoaXMgbWFjcm8uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IHNfY2xpZW50IG9wdGlvbiAtaWduX2VvZjogRU9GIGF0IHN0ZGluIGlzIGlnbm9yZWQsIGFuZAogICAgICdRJyBhbmQgJ1InIGxvc2UgdGhlaXIgc3BlY2lhbCBtZWFuaW5ncyAocXVpdC9yZW5lZ290aWF0ZSkuCiAgICAgVGhpcyBpcyBwYXJ0IG9mIHdoYXQgLXF1aWV0IGRvZXM7IHVubGlrZSAtcXVpZXQsIC1pZ25fZW9mCiAgICAgZG9lcyBub3Qgc3VwcHJlc3MgYW55IG91dHB1dC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgY29tcGF0aWJpbGl0eSBvcHRpb25zIHRvIHRoZSBwdXJwb3NlIGFuZCB0cnVzdCBjb2RlLiBUaGUKICAgICBwdXJwb3NlIFg1MDlfUFVSUE9TRV9BTlkgaXMgImFueSBwdXJwb3NlIiB3aGljaCBhdXRvbWF0aWNhbGx5CiAgICAgYWNjZXB0cyBhIGNlcnRpZmljYXRlIG9yIENBLCB0aGlzIHdhcyB0aGUgcHJldmlvdXMgYmVoYXZpb3VyLAogICAgIHdpdGggYWxsIHRoZSBhc3NvY2lhdGVkIHNlY3VyaXR5IGlzc3Vlcy4KCiAgICAgWDUwOV9UUlVTVF9DT01QQVQgaXMgdGhlIG9sZCB0cnVzdCBiZWhhdmlvdXI6IG9ubHkgYW5kCiAgICAgYXV0b21hdGljYWxseSB0cnVzdCBzZWxmIHNpZ25lZCByb290cyBpbiBjZXJ0aWZpY2F0ZSBzdG9yZS4gQQogICAgIG5ldyB0cnVzdCBzZXR0aW5nIFg1MDlfVFJVU1RfREVGQVVMVCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhhdAogICAgIGEgcHVycG9zZSBoYXMgbm8gYXNzb2NpYXRlZCB0cnVzdCBzZXR0aW5nIGFuZCBpdCBzaG91bGQgaW5zdGVhZAogICAgIHVzZSB0aGUgdmFsdWUgaW4gdGhlIGRlZmF1bHQgcHVycG9zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlIFBLQ1MjOCBEU0EgcHJpdmF0ZSBrZXkgY29kZSBzbyBpdCBkZWNvZGVzIGtleXMgYWdhaW4KICAgICBhbmQgZml4IGEgbWVtb3J5IGxlYWsuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gdXRpbC9ta2Vyci5wbCAod2hpY2ggaW1wbGVtZW50cyAnbWFrZSBlcnJvcnMnKSwgcHJlc2VydmUKICAgICByZWFzb24gc3RyaW5ncyBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSAuYyBmaWxlLCBhcwogICAgIHRoZSBkZWZhdWx0IHRvIGhhdmUgb25seSBkb3duY2FzZSBsZXR0ZXJzIChhbmQgZGlnaXRzKSBpbgogICAgIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHJlYXNvbnMgY29kZXMgaXMgbm90IGFsd2F5cyBhcHByb3ByaWF0ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBFUlJfbG9hZF9FUlJfc3RyaW5ncygpLCBidWlsZCBhbiBFUlJfTElCX1NZUyBlcnJvciByZWFzb24gdGFibGUKICAgICB1c2luZyBzdHJlcnJvci4gIFByZXZpb3VzbHksIEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKCkgcmV0dXJuZWQKICAgICBsaWJyYXJ5IG5hbWVzIGFzIHJlYXNvbiBzdHJpbmdzIGZvciBTWVNlcnI7IGJ1dCBTWVNlcnIgaXMgYSBzcGVjaWFsCiAgICAgY2FzZSB3aGVyZSBzbWFsbCBudW1iZXJzIGFyZSBlcnJubyB2YWx1ZXMsIG5vdCBsaWJyYXJ5IG51bWJlcnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkICctZHNhcGFyYW0nIG9wdGlvbiB0byAnb3BlbnNzbCBkaHBhcmFtJyBhcHBsaWNhdGlvbi4gIFRoaXMKICAgICBjb252ZXJ0cyBEU0EgcGFyYW1ldGVycyBpbnRvIERIIHBhcmFtZXRlcnMuIChXaGVuIGNyZWF0aW5nIHBhcmFtZXRlcnMsCiAgICAgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgaXMgdXNlZC4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5jbHVkZSAnbGVuZ3RoJyAocmVjb21tZW5kZWQgZXhwb25lbnQgbGVuZ3RoKSBpbiBDIGNvZGUgZ2VuZXJhdGVkCiAgICAgYnkgJ29wZW5zc2wgZGhwYXJhbSAtQycuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVGhlIHNlY29uZCBhcmd1bWVudCB0byBzZXRfbGFiZWwgaW4gcGVybGFzbSB3YXMgYWxyZWFkeSBiZWluZyB1c2VkCiAgICAgc28gY291bGRuJ3QgYmUgdXNlZCBhcyBhICJmaWxlIHNjb3BlIiBmbGFnLiBNb3ZlZCB0byB0aGlyZCBhcmd1bWVudAogICAgIHdoaWNoIHdhcyBmcmVlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIFBFTV9BU04xX3dyaXRlX2JpbyBhbmQgc29tZSBvdGhlciBmdW5jdGlvbnMsIHVzZSBSQU5EX3BzZXVkb19ieXRlcwogICAgIGluc3RlYWQgb2YgUkFORF9ieXRlcyBmb3IgZW5jcnlwdGlvbiBJVnMgYW5kIHNhbHRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluY2x1ZGUgUkFORF9zdGF0dXMoKSBpbnRvIFJBTkRfTUVUSE9EIGluc3RlYWQgb2YgaW1wbGVtZW50aW5nCiAgICAgaXQgb25seSBmb3IgbWRfcmFuZC5jICBPdGhlcndpc2UgcmVwbGFjaW5nIHRoZSBQUk5HIGJ5IGNhbGxpbmcKICAgICBSQU5EX3NldF9yYW5kX21ldGhvZCB3b3VsZCBiZSBpbXBvc3NpYmxlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERvbid0IGxldCBEU0FfZ2VuZXJhdGVfa2V5KCkgZW50ZXIgYW4gaW5maW5pdGUgbG9vcCBpZiB0aGUgcmFuZG9tCiAgICAgbnVtYmVyIGdlbmVyYXRpb24gZmFpbHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3ICdyYW5kJyBhcHBsaWNhdGlvbiBmb3IgY3JlYXRpbmcgcHNldWRvLXJhbmRvbSBvdXRwdXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkZWQgY29uZmlndXJhdGlvbiBzdXBwb3J0IGZvciBMaW51eC9JQTY0CiAgICAgW1JvbGYgSGFiZXJyZWNrZXIgPHJvbGZAc3VzZS5kZT5dCgogICopIEFzc2VtYmxlciBtb2R1bGUgc3VwcG9ydCBmb3IgTWluZ3czMi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBmb3IgSFBVWCAoaW4gc2hsaWIvKS4KICAgICBbTHV0eiBKYWVuaWNrZSA8THV0ei5KYWVuaWNrZUBhZXQuVFUtQ290dGJ1cy5ERT4gYW5kIEFub255bW91c10KCiAgKikgU2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBmb3IgU29sYXJpcyBnY2MuCiAgICAgW0x1dHogQmVobmtlIDxiZWhua2VAdHJ1c3RjZW50ZXIuZGU+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNCBhbmQgMC45LjUgIFsyOCBGZWIgMjAwMF0KCiAgKikgUEtDUzdfZW5jcnlwdCgpIHdhcyBhZGRpbmcgdGV4dCBNSU1FIGhlYWRlcnMgdHdpY2UgYmVjYXVzZSB0aGV5CiAgICAgd2VyZSBhZGRlZCBtYW51YWxseSBhbmQgYnkgU01JTUVfY3JsZl9jb3B5KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gYm50ZXN0LmMgZG9uJ3QgY2FsbCBCTl9yYW5kIHdpdGggemVybyBiaXRzIGFyZ3VtZW50LgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IEFuZHJldyBXLiBHcmF5IDxhZ3JheUBpY29uc2luYy5jb20+XQoKICAqKSBCTl9tdWwgYnVnZml4OiBJbiBibl9tdWxfcGFydF9yZWN1cnNpb24oKSBvbmx5IHRoZSBhPmFbbl0gJiYgYj5iW25dCiAgICAgY2FzZSB3YXMgaW1wbGVtZW50ZWQuIFRoaXMgY2F1c2VkIEJOX2Rpdl9yZWNwKCkgdG8gZmFpbCBvY2Nhc2lvbmFsbHkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIHNldF9sYWJlbCgpIGluIHRoZSBwZXJsCiAgICAgYXNzZW1ibHkgbGFuZ3VhZ2UgYnVpbGRlci4gSWYgdGhpcyBhcmd1bWVudCBleGlzdHMgYW5kIGlzIHNldAogICAgIHRvIDEgaXQgc2lnbmFscyB0aGF0IHRoZSBhc3NlbWJsZXIgc2hvdWxkIHVzZSBhIHN5bWJvbCB3aG9zZSAKICAgICBzY29wZSBpcyB0aGUgZW50aXJlIGZpbGUsIG5vdCBqdXN0IHRoZSBjdXJyZW50IGZ1bmN0aW9uLiBUaGlzCiAgICAgaXMgbmVlZGVkIHdpdGggTUFTTSB3aGljaCB1c2VzIHRoZSBmb3JtYXQgbGFiZWw6OiBmb3IgdGhpcyBzY29wZS4KICAgICBbU3RldmUgSGVuc29uLCBwb2ludGVkIG91dCBieSBQZXRlciBSdW5lc3RpZyA8cGV0ZXJAcnVuZXN0aWcuY29tPl0KCiAgKikgQ2hhbmdlIHRoZSBBU04xIHR5cGVzIHNvIHRoZXkgYXJlIHR5cGVkZWZzIGJ5IGRlZmF1bHQuIEJlZm9yZQogICAgIGFsbW9zdCBhbGwgdHlwZXMgd2VyZSAjZGVmaW5lJ2QgdG8gQVNOMV9TVFJJTkcgd2hpY2ggd2FzIGNhdXNpbmcKICAgICBTVEFDS19PRigpIHByb2JsZW1zOiB5b3UgY291bGRuJ3QgZGVjbGFyZSBTVEFDS19PRihBU04xX1VURjhTVFJJTkcpCiAgICAgZm9yIGV4YW1wbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIG5hbWVzIG9mIG5ldyBmdW5jdGlvbnMgdG8gdGhlIG5ldyBnZXQxL2dldDAgbmFtaW5nCiAgICAgY29udmVudGlvbjogQWZ0ZXIgJ2dldDEnLCB0aGUgY2FsbGVyIG93bnMgYSByZWZlcmVuY2UgY291bnQKICAgICBhbmQgaGFzIHRvIGNhbGwgLi4uX2ZyZWU7ICdnZXQwJyByZXR1cm5zIGEgcG9pbnRlciB0byBzb21lCiAgICAgZGF0YSBzdHJ1Y3R1cmUgd2l0aG91dCBpbmNyZW1lbnRpbmcgcmVmZXJlbmNlIGNvdW50ZXJzLgogICAgIChTb21lIG9mIHRoZSBleGlzdGluZyAnZ2V0JyBmdW5jdGlvbnMgaW5jcmVtZW50IGEgcmVmZXJlbmNlCiAgICAgY291bnRlciwgc29tZSBkb24ndC4pCiAgICAgU2ltaWxhcmx5LCAnc2V0MScgYW5kICdhZGQxJyBmdW5jdGlvbnMgaW5jcmVhc2UgcmVmZXJlbmNlCiAgICAgY291bnRlcnMgb3IgZHVwbGljYXRlIG9iamVjdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgZm9yIHRoZSBwb3NzaWJpbGl0eSBvZiB0ZW1wIFJTQSBrZXkgZ2VuZXJhdGlvbiBmYWlsdXJlOgogICAgIHRoZSBjb2RlIHVzZWQgdG8gYXNzdW1lIGl0IGFsd2F5cyB3b3JrZWQgYW5kIGNyYXNoZWQgb24gZmFpbHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggcG90ZW50aWFsIGJ1ZmZlciBvdmVycnVuIHByb2JsZW0gaW4gQklPX3ByaW50ZigpLgogICAgIFtVbGYgTfZsbGVyLCB1c2luZyBwdWJsaWMgZG9tYWluIGNvZGUgYnkgUGF0cmljayBQb3dlbGw7IHByb2JsZW0KICAgICAgcG9pbnRlZCBvdXQgYnkgRGF2aWQgU2FjZXJkb3RlIDxkYXMzM0Bjb3JuZWxsLmVkdT5dCgogICopIFN1cHBvcnQgRUdEIDxodHRwOi8vd3d3LmxvdGhhci5jb20vdGVjaC9jcnlwdG8vPi4gIE5ldyBmdW5jdGlvbnMKICAgICBSQU5EX2VnZCgpIGFuZCBSQU5EX3N0YXR1cygpLiAgSW4gdGhlIGNvbW1hbmQgbGluZSBhcHBsaWNhdGlvbiwKICAgICB0aGUgRUdEIHNvY2tldCBjYW4gYmUgc3BlY2lmaWVkIGxpa2UgYSBzZWVkIGZpbGUgdXNpbmcgUkFOREZJTEUKICAgICBvciAtcmFuZC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWxsb3cgdGhlIHN0cmluZyBDRVJUSUZJQ0FURSB0byBiZSB0b2xlcmF0ZWQgaW4gUEtDUyM3IHN0cnVjdHVyZXMuCiAgICAgU29tZSBDQXMgKGUuZy4gVmVyaXNpZ24pIGRpc3RyaWJ1dGUgY2VydGlmaWNhdGVzIGluIHRoaXMgZm9ybS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgdGhlIFNTTF9BTExPV19BREggY29tcGlsZSBvcHRpb24gYW5kIHNldCB0aGUgZGVmYXVsdCBjaXBoZXIKICAgICBsaXN0IHRvIGV4Y2x1ZGUgdGhlbS4gVGhpcyBtZWFucyB0aGF0IG5vIHNwZWNpYWwgY29tcGlsYXRpb24gb3B0aW9uCiAgICAgaXMgbmVlZGVkIHRvIHVzZSBhbm9ueW1vdXMgREg6IGl0IGp1c3QgbmVlZHMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCiAgICAgY2lwaGVyIGxpc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSBFVlBfTURfQ1RYX3R5cGUgbWFjcm8gc28gaXRzIG1lYW5pbmcgY29uc2lzdGVudCB3aXRoCiAgICAgRVZQX01EX3R5cGUuIFRoZSBvbGQgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgaW4gYSBuZXcgbWFjcm8gY2FsbGVkCiAgICAgRVZQX01EX21kKCkuIENoYW5nZSBjb2RlIHRoYXQgdXNlcyBpdCBhbmQgdXBkYXRlIGRvY3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgLi4uX2N0cmwgZnVuY3Rpb25zIG5vdyBoYXZlIGNvcnJlc3BvbmRpbmcgLi4uX2NhbGxiYWNrX2N0cmwgZnVuY3Rpb25zCiAgICAgd2hlcmUgdGhlICd2b2lkIConIGFyZ3VtZW50IGlzIHJlcGxhY2VkIGJ5IGEgZnVuY3Rpb24gcG9pbnRlciBhcmd1bWVudC4KICAgICBQcmV2aW91c2x5ICd2b2lkIConIHdhcyBhYnVzZWQgdG8gcG9pbnQgdG8gZnVuY3Rpb25zLCB3aGljaCB3b3JrcyBvbgogICAgIG1hbnkgcGxhdGZvcm1zLCBidXQgaXMgbm90IGNvcnJlY3QuICBBcyB0aGVzZSBmdW5jdGlvbnMgYXJlIHVzdWFsbHkKICAgICBjYWxsZWQgYnkgbWFjcm9zIGRlZmluZWQgaW4gT3BlblNTTCBoZWFkZXIgZmlsZXMsIG1vc3Qgc291cmNlIGNvZGUKICAgICBzaG91bGQgd29yayB3aXRob3V0IGNoYW5nZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4gKHdoaWNoIGlzIGNyZWF0ZWQgYnkgQ29uZmlndXJlKSBub3cgY29udGFpbnMKICAgICBzZWN0aW9ucyB3aXRoIGluZm9ybWF0aW9uIG9uIC1ELi4uIGNvbXBpbGVyIHN3aXRjaGVzIHVzZWQgZm9yCiAgICAgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IHNvIHRoYXQgYXBwbGljYXRpb25zIGNhbiBzZWUgdGhlbS4gIFRvIGVuYWJsZQogICAgIG9uZSBvZiB0aGVzZSBzZWN0aW9ucywgYSBwcmUtcHJvY2Vzc29yIHN5bWJvbCBPUEVOU1NMXy4uLl9ERUZJTkVTCiAgICAgbXVzdCBiZSBkZWZpbmVkLiAgRS5nLiwKICAgICAgICAjZGVmaW5lIE9QRU5TU0xfQUxHT1JJVEhNX0RFRklORVMKICAgICAgICAjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgogICAgIGRlZmluZXMgYWxsIHBlcnRpbmVudCBOT188YWxnbz4gc3ltYm9scywgc3VjaCBhcyBOT19JREVBLCBOT19SU0EsIGV0Yy4KICAgICBbUmljaGFyZCBMZXZpdHRlLCBVbGYgYW5kIEJvZG8gTfZsbGVyXQoKICAqKSBCdWdmaXg6IFRvbGVyYXRlIGZyYWdtZW50YXRpb24gYW5kIGludGVybGVhdmluZyBpbiB0aGUgU1NMIDMvVExTCiAgICAgcmVjb3JkIGxheWVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSB0aGUgJ290aGVyJyB0eXBlIGluIGNlcnRpZmljYXRlIGF1eCBpbmZvIHRvIGEgU1RBQ0tfT0YKICAgICBYNTA5X0FMR09SLiBBbHRob3VnaCBub3QgYW4gQWxnb3JpdGhtSWRlbnRpZmllciBhcyBzdWNoIGl0IGhhcwogICAgIHRoZSByZXF1aXJlZCBBU04xIGZvcm1hdDogYXJiaXRyYXJ5IHR5cGVzIGRldGVybWluZWQgYnkgYW4gT0lELgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzb21lIFBFTV93cml0ZV9YNTA5X1JFUV9ORVcoKSBmdW5jdGlvbnMgYW5kIGEgY29tbWFuZCBsaW5lCiAgICAgYXJndW1lbnQgdG8gJ3JlcScuIFRoaXMgaXMgbm90IGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzIG5ld2VyIG9yCiAgICAgYmV0dGVyIHRoYW4gb3RoZXJzIGl0IGp1c3QgdXNlcyB0aGUgd29yayAnTkVXJyBpbiB0aGUgY2VydGlmaWNhdGUKICAgICByZXF1ZXN0IGhlYWRlciBsaW5lcy4gU29tZSBzb2Z0d2FyZSBuZWVkcyB0aGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlb3JnYW5pc2UgcGFzc3dvcmQgY29tbWFuZCBsaW5lIGFyZ3VtZW50czogbm93IHBhc3N3b3JkcyBjYW4gYmUKICAgICBvYnRhaW5lZCBmcm9tIHZhcmlvdXMgc291cmNlcy4gRGVsZXRlIHRoZSBQRU1fY2IgZnVuY3Rpb24gYW5kIG1ha2UKICAgICBpdCB0aGUgZGVmYXVsdCBiZWhhdmlvdXI6IGkuZS4gaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwgYW5kIHRoZQogICAgIHVzcmRhdGEgYXJndW1lbnQgaXMgbm90IE5VTEwgaW50ZXJwcmV0IGl0IGFzIGEgbnVsbCB0ZXJtaW5hdGVkIHBhc3MKICAgICBwaHJhc2UuIElmIHVzcmRhdGEgYW5kIHRoZSBjYWxsYmFjayBhcmUgTlVMTCB0aGVuIHRoZSBwYXNzIHBocmFzZQogICAgIGlzIHByb21wdGVkIGZvciBhcyB1c3VhbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdGhlIENvbXBhcSBBdGFsbGEgY3J5cHRvIGFjY2VsZXJhdG9yLiBJZiBpdCBpcyBpbnN0YWxsZWQsCiAgICAgdGhlIHN1cHBvcnQgaXMgYXV0b21hdGljYWxseSBlbmFibGVkLiBUaGUgcmVzdWx0aW5nIGJpbmFyaWVzIHdpbGwKICAgICBhdXRvZGV0ZWN0IHRoZSBjYXJkIGFuZCB1c2UgaXQgaWYgcHJlc2VudC4KICAgICBbQmVuIExhdXJpZSBhbmQgQ29tcGFxIEluYy5dCgogICopIFdvcmsgYXJvdW5kIGZvciBOZXRzY2FwZSBoYW5nIGJ1Zy4gVGhpcyBzZW5kcyBjZXJ0aWZpY2F0ZSByZXF1ZXN0CiAgICAgYW5kIHNlcnZlciBkb25lIGluIG9uZSByZWNvcmQuIFNpbmNlIHRoaXMgaXMgcGVyZmVjdGx5IGxlZ2FsIGluIHRoZQogICAgIFNTTC9UTFMgcHJvdG9jb2wgaXQgaXNuJ3QgYSAiYnVnIiBvcHRpb24gYW5kIGlzIG9uIGJ5IGRlZmF1bHQuIFNlZQogICAgIHRoZSBidWdzL1NTTHYzIGVudHJ5IGZvciBtb3JlIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSFAtVVggdHVuZS11cDogbmV3IHVuaWZpZWQgY29uZmlncywgSFAgQyBjb21waWxlciBidWcgd29ya2Fyb3VuZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIC1yYW5kIGFyZ3VtZW50IHRvIHNtaW1lIGFuZCBwa2NzMTIgYXBwbGljYXRpb25zIGFuZCByZWFkL3dyaXRlCiAgICAgb2Ygc2VlZCBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAncGFzc3dkJyB0b29sIGZvciBjcnlwdCgzKSBhbmQgYXByMSBwYXNzd29yZCBoYXNoZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGNvbW1hbmQgbGluZSBwYXNzd29yZCBvcHRpb25zIHRvIHRoZSByZW1haW5pbmcgYXBwbGljYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJ1ZyBmaXggZm9yIEJOX2Rpdl9yZWNwKCkgZm9yIG51bWVyYXRvcnMgd2l0aCBhbiBldmVuIG51bWJlciBvZgogICAgIGJpdHMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIE1vcmUgdGVzdHMgaW4gYm50ZXN0LmMsIGFuZCBjaGFuZ2VkIHRlc3RfYm4gb3V0cHV0LgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSAuL2NvbmZpZyByZWNvZ25pemVzIE1hY09TIFggbm93LgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBCdWcgZml4IGZvciBCTl9kaXYoKSB3aGVuIHRoZSBmaXJzdCB3b3JkcyBvZiBudW0gYW5kIGRpdnNvciBhcmUKICAgICBlcXVhbCAoaXQgZ2F2ZSB3cm9uZyByZXN1bHRzIGlmIChyZW09KG4xLXEqZDApJkJOX01BU0syKSA8IGQwKS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHZhcmlvdXMgYnJva2VuIFBLQ1MjOCBmb3JtYXRzLCBhbmQgY29tbWFuZCBsaW5lCiAgICAgb3B0aW9ucyB0byBwcm9kdWNlIHRoZW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBCTl9DVFhfc3RhcnQoKSwgQk5fQ1RYX2dldCgpIGFuZCBCVF9DVFhfZW5kKCkgdG8KICAgICBnZXQgdGVtcG9yYXJ5IEJJR05VTXMgZnJvbSBhIEJOX0NUWC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQ29ycmVjdCByZXR1cm4gdmFsdWVzIGluIEJOX21vZF9leHBfbW9udCgpIGFuZCBCTl9tb2RfZXhwMl9tb250KCkKICAgICBmb3IgcCA9PSAwLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDaGFuZ2UgdGhlIFNTTGVheV9hZGRfYWxsXyooKSBmdW5jdGlvbnMgdG8gT3BlblNTTF9hZGRfYWxsXyooKSBhbmQKICAgICBpbmNsdWRlIGEgI2RlZmluZSBmcm9tIHRoZSBvbGQgbmFtZSB0byB0aGUgbmV3LiBUaGUgb3JpZ2luYWwgaW50ZW50CiAgICAgd2FzIHRoYXQgc3RhdGljYWxseSBsaW5rZWQgYmluYXJpZXMgY291bGQgZm9yIGV4YW1wbGUganVzdCBjYWxsCiAgICAgU1NMZWF5X2FkZF9hbGxfY2lwaGVycygpIHRvIGp1c3QgYWRkIGNpcGhlcnMgdG8gdGhlIHRhYmxlIGFuZCBub3QKICAgICBsaW5rIHdpdGggZGlnZXN0cy4gVGhpcyBuZXZlciB3b3JrZWQgYmVjYXVzZSBTU0xlYXlfYWRkX2FsbF9kaWdlc3RzKCkKICAgICBhbmQgU1NMZWF5X2FkZF9hbGxfY2lwaGVycygpIHdlcmUgaW4gdGhlIHNhbWUgc291cmNlIGZpbGUgc28gY2FsbGluZwogICAgIG9uZSB3b3VsZCBsaW5rIHdpdGggdGhlIG90aGVyLiBUaGV5IGFyZSBub3cgaW4gc2VwYXJhdGUgc291cmNlIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIG5ldyAtbm90ZXh0IG9wdGlvbiB0byAnY2EnIGFuZCBhIC1wdWJrZXkgb3B0aW9uIHRvICdzcGthYycuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIGEgbGVzcyB1bnVzdWFsIGZvcm0gb2YgdGhlIE1pbGxlci1SYWJpbiBwcmltYWxpdHkgdGVzdCAoaXQgdXNlZAogICAgIGEgYmluYXJ5IGFsZ29yaXRobSBmb3IgZXhwb25lbnRpYXRpb24gaW50ZWdyYXRlZCBpbnRvIHRoZSBNaWxsZXItUmFiaW4KICAgICBsb29wLCBvdXIgc3RhbmRhcmQgbW9kZXhwIGFsZ29yaXRobXMgYXJlIGZhc3RlcikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU3VwcG9ydCBmb3IgdGhlIEVCQ0RJQyBjaGFyYWN0ZXIgc2V0IGNvbXBsZXRlZC4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaC5TTkkuRGU+XQoKICAqKSBTb3VyY2UgY29kZSBjbGVhbnVwczogdXNlIGNvbnN0IHdoZXJlIGFwcHJvcHJpYXRlLCBlbGltaW5hdGUgY2FzdHMsCiAgICAgdXNlIHZvaWQgKiBpbnN0ZWFkIG9mIGNoYXIgKiBpbiBsaGFzaC4KICAgICBbVWxmIE32bGxlcl0gCgogICopIEJ1Z2ZpeDogc3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2Ugd2FzIG5vdCByZXN0YXJ0YWJsZQogICAgICh0aGUgc3RhdGUgd2FzIG5vdCBjaGFuZ2VkIHRvIFNTTDNfU1RfU1dfS0VZX0VYQ0hfQiwgYW5kIGJlY2F1c2Ugb2YKICAgICB0aGlzIHRoZSBzZXJ2ZXIgY291bGQgb3ZlcndyaXRlIGVwaGVtZXJhbCBrZXlzIHRoYXQgdGhlIGNsaWVudAogICAgIGhhcyBhbHJlYWR5IHNlZW4pLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFR1cm4gRFNBX2lzX3ByaW1lIGludG8gYSBtYWNybyB0aGF0IGNhbGxzIEJOX2lzX3ByaW1lLAogICAgIHVzaW5nIDUwIGl0ZXJhdGlvbnMgb2YgdGhlIFJhYmluLU1pbGxlciB0ZXN0LgoKICAgICBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBub3cgdXNlcyBCTl9pc19wcmltZV9mYXN0dGVzdCAod2l0aCA1MAogICAgIGl0ZXJhdGlvbnMgb2YgdGhlIFJhYmluLU1pbGxlciB0ZXN0IGFzIHJlcXVpcmVkIGJ5IHRoZSBhcHBlbmRpeAogICAgIHRvIEZJUFMgUFVCIDE4NlstMV0pIGluc3RlYWQgb2YgRFNBX2lzX3ByaW1lLgogICAgIEFzIEJOX2lzX3ByaW1lX2Zhc3R0ZXN0IGluY2x1ZGVzIHRyaWFsIGRpdmlzaW9uLCBEU0EgcGFyYW1ldGVyCiAgICAgZ2VuZXJhdGlvbiBiZWNvbWVzIG11Y2ggZmFzdGVyLgoKICAgICBUaGlzIGltcGxpZXMgYSBjaGFuZ2UgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgaW4gRFNBX2lzX3ByaW1lCiAgICAgYW5kIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzOiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UKICAgICBmb3IgZWFjaCBwb3NpdGl2ZSB3aXRuZXNzIGluIHRoZSBSYWJpbi1NaWxsZXIgdGVzdCwgbm90IGp1c3QKICAgICBvY2Nhc2lvbmFsbHkgaW4gdGhlIGlubmVyIGxvb3A7IGFuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUKICAgICBjYWxsYmFjayBmdW5jdGlvbiBub3cgcHJvdmlkZSBhbiBpdGVyYXRpb24gY291bnQgZm9yIHRoZSBvdXRlcgogICAgIGxvb3AgcmF0aGVyIHRoYW4gZm9yIHRoZSBjdXJyZW50IGludm9jYXRpb24gb2YgdGhlIGlubmVyIGxvb3AuCiAgICAgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgYWRkaXRpb25hbGx5IGNhbiBjYWxsIHRoZSBjYWxsYmFjawogICAgIGZ1bmN0aW9uIHdpdGggYW4gJ2l0ZXJhdGlvbiBjb3VudCcgb2YgLTEsIG1lYW5pbmcgdGhhdCBhCiAgICAgY2FuZGlkYXRlIGhhcyBwYXNzZWQgdGhlIHRyaWFsIGRpdmlzaW9uIHRlc3QgKHdoZW4gcSBpcyBnZW5lcmF0ZWQgCiAgICAgZnJvbSBhbiBhcHBsaWNhdGlvbi1wcm92aWRlZCBzZWVkLCB0cmlhbCBkaXZpc2lvbiBpcyBza2lwcGVkKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5faXNfcHJpbWVfZmFzdHRlc3QgdGhhdCBvcHRpb25hbGx5IGRvZXMgdHJpYWwKICAgICBkaXZpc2lvbiBiZWZvcmUgc3RhcnRpbmcgdGhlIFJhYmluLU1pbGxlciB0ZXN0IGFuZCBoYXMKICAgICBhbiBhZGRpdGlvbmFsIEJOX0NUWCAqIGFyZ3VtZW50ICh3aGVyZWFzIEJOX2lzX3ByaW1lIGFsd2F5cwogICAgIGhhcyB0byBhbGxvY2F0ZSBhdCBsZWFzdCBvbmUgQk5fQ1RYKS4KICAgICAnY2FsbGJhY2soMSwgLTEsIGNiX2FyZyknIGlzIGNhbGxlZCB3aGVuIGEgbnVtYmVyIGhhcyBwYXNzZWQgdGhlCiAgICAgdHJpYWwgZGl2aXNpb24gc3RhZ2UuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGZvciBidWcgaW4gQ1JMIGVuY29kaW5nLiBUaGUgdmFsaWRpdHkgZGF0ZXMgd2VyZW4ndCBiZWluZyBoYW5kbGVkCiAgICAgYXMgQVNOMV9USU1FLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAtcGtjczEyIG9wdGlvbiB0byBDQS5wbCBzY3JpcHQgdG8gd3JpdGUgb3V0IGEgUEtDUyMxMiBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBCTl9wc2V1ZG9fcmFuZCgpLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDbGVhbiB1cCBCTl9tb2RfbXVsX21vbnRnb21lcnkoKTogcmVwbGFjZSB0aGUgYnJva2VuIChhbmQgdW5yZWFkYWJsZSkKICAgICBiaWdudW0gdmVyc2lvbiBvZiBCTl9mcm9tX21vbnRnb21lcnkoKSB3aXRoIHRoZSB3b3JraW5nIGNvZGUgZnJvbQogICAgIFNTTGVheSAwLjkuMCAodGhlIHdvcmQgYmFzZWQgdmVyc2lvbiBpcyBmYXN0ZXIgYW55d2F5KSwgYW5kIGNsZWFuIHVwCiAgICAgdGhlIGNvbW1lbnRzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBdm9pZCBhIHJhY2UgY29uZGl0aW9uIGluIHMyX2NsbnQuYyAoZnVuY3Rpb24gZ2V0X3NlcnZlcl9oZWxsbykgdGhhdAogICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byB1c2UgdGhlIHNhbWUgU1NMX1NFU1NJT04gZGF0YSBzdHJ1Y3R1cmUgaW4KICAgICBTU0wyIGNsaWVudHMgaW4gbXVsdGlwbGUgdGhyZWFkcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUaGUgcmV0dXJuIHZhbHVlIG9mIFJBTkRfbG9hZF9maWxlKCkgbm8gbG9uZ2VyIGNvdW50cyBieXRlcyBvYnRhaW5lZAogICAgIGJ5IHN0YXQoKS4gIFJBTkRfbG9hZF9maWxlKC4uLiwgLTEpIGlzIG5ldyBhbmQgdXNlcyB0aGUgY29tcGxldGUgZmlsZQogICAgIHRvIHNlZWQgdGhlIFBSTkcgKHByZXZpb3VzbHkgYW4gZXhwbGljaXQgYnl0ZSBjb3VudCB3YXMgcmVxdWlyZWQpLgogICAgIFtVbGYgTfZsbGVyLCBCb2RvIE32bGxlcl0KCiAgKikgQ2xlYW4gdXAgQ1JZUFRPX0VYX0RBVEEgZnVuY3Rpb25zLCBzb21lIG9mIHRoZXNlIGRpZG4ndCBoYXZlIHByb3RvdHlwZXMKICAgICB1c2VkIChjaGFyICopIGluc3RlYWQgb2YgKHZvaWQgKikgYW5kIGhhZCBjYXN0cyBhbGwgb3ZlciB0aGUgcGxhY2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBCTl9nZW5lcmF0ZV9wcmltZSgpIHJldHVybiBOVUxMIG9uIGVycm9yIGlmIHJldCE9TlVMTC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgUmV0YWluIHNvdXJjZSBjb2RlIGNvbXBhdGliaWxpdHkgZm9yIEJOX3ByaW1lX2NoZWNrcyBtYWNybzoKICAgICBCTl9pc19wcmltZSguLi4sIEJOX3ByaW1lX2NoZWNrcywgLi4uKSBub3cgdXNlcwogICAgIEJOX3ByaW1lX2NoZWNrc19mb3Jfc2l6ZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZgogICAgIFJhYmluLU1pbGxlciBpdGVyYXRpb25zLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBEaWZmaWUtSGVsbG1hbiB1c2VzICJzYWZlIiBwcmltZXM6IERIX2NoZWNrKCkgcmV0dXJuIGNvZGUgcmVuYW1lZCB0bwogICAgIERIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUUuCiAgICAgKENoZWNrIGlmIHRoaXMgaXMgdHJ1ZT8gT3BlblBHUCBjYWxscyB0aGVtICJzdHJvbmciLikKICAgICBbVWxmIE32bGxlcl0KCiAgKikgTWVyZ2UgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgImRoIiBhbmQgImdlbmRoIiBwcm9ncmFtcyBpbnRvIGEgbmV3IHByb2dyYW0KICAgICAiZGhwYXJhbSIuIFRoZSBvbGQgcHJvZ3JhbXMgYXJlIHJldGFpbmVkIGZvciBub3cgYnV0IHdpbGwgaGFuZGxlIERIIGtleXMKICAgICAoaW5zdGVhZCBvZiBwYXJhbWV0ZXJzKSBpbiBmdXR1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0aGUgY2lwaGVycywgc19zZXJ2ZXIgYW5kIHNfY2xpZW50IHByb2dyYW1zIGNoZWNrIHRoZSByZXR1cm4gdmFsdWVzCiAgICAgd2hlbiBhIG5ldyBjaXBoZXIgbGlzdCBpcyBzZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSB0aGUgU1NML1RMUyBjaXBoZXIgbWVjaGFuaXNtIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIFRMUyA1NmJpdAogICAgIGNpcGhlcnMuIEJlZm9yZSB3aGVuIHRoZSA1NmJpdCBjaXBoZXJzIHdlcmUgZW5hYmxlZCB0aGUgc29ydGluZyB3YXMKICAgICB3cm9uZy4KCiAgICAgVGhlIHN5bnRheCBmb3IgdGhlIGNpcGhlciBzb3J0aW5nIGhhcyBiZWVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgc29ydGluZyBieQogICAgIGNpcGhlci1zdHJlbmd0aCAodXNpbmcgdGhlIHN0cmVuZ3RoX2JpdHMgaGFyZCBjb2RlZCBpbiB0aGUgdGFibGVzKS4KICAgICBUaGUgbmV3IGNvbW1hbmQgaXMgIkBTVFJFTkdUSCIgKHNlZSBhbHNvIGRvYy9hcHBzL2NpcGhlcnMucG9kKS4KCiAgICAgRml4IGEgYnVnIGluIHRoZSBjaXBoZXItY29tbWFuZCBwYXJzZXI6IHdoZW4gc3VwcGx5aW5nIGEgY2lwaGVyIGNvbW1hbmQKICAgICBzdHJpbmcgd2l0aCBhbiAidW5kZWZpbmVkIiBzeW1ib2wgKG5laXRoZXIgY29tbWFuZCBub3IgYWxwaGFudW1lcmljCiAgICAgW0EtWmEtejAtOV0sIHNzbF9zZXRfY2lwaGVyX2xpc3QgdXNlZCB0byBoYW5nIGluIGFuIGVuZGxlc3MgbG9vcC4gTm93CiAgICAgYW4gZXJyb3IgaXMgZmxhZ2dlZC4KCiAgICAgRHVlIHRvIHRoZSBzdHJlbmd0aC1zb3J0aW5nIGV4dGVuc2lvbiwgdGhlIGNvZGUgb2YgdGhlCiAgICAgc3NsX2NyZWF0ZV9jaXBoZXJfbGlzdCgpIGZ1bmN0aW9uIHdhcyBjb21wbGV0ZWx5IHJlYXJyYW5nZWQuIEkgaG9wZSB0aGF0CiAgICAgdGhlIHJlYWRhYmlsaXR5IHdhcyBhbHNvIGluY3JlYXNlZCA6LSkKICAgICBbTHV0eiBKYWVuaWNrZSA8THV0ei5KYWVuaWNrZUBhZXQuVFUtQ290dGJ1cy5ERT5dCgogICopIE1pbm9yIGNoYW5nZSB0byAneDUwOScgdXRpbGl0eS4gVGhlIC1DQWNyZWF0ZXNlcmlhbCBvcHRpb24gbm93IHVzZXMgMQogICAgIGZvciB0aGUgZmlyc3Qgc2VyaWFsIG51bWJlciBhbmQgcGxhY2VzIDIgaW4gdGhlIHNlcmlhbCBudW1iZXIgZmlsZS4gVGhpcwogICAgIGF2b2lkcyBwcm9ibGVtcyB3aGVuIHRoZSByb290IENBIGlzIGNyZWF0ZWQgd2l0aCBzZXJpYWwgbnVtYmVyIHplcm8gYW5kCiAgICAgdGhlIGZpcnN0IHVzZXIgY2VydGlmaWNhdGUgaGFzIHRoZSBzYW1lIGlzc3VlciBuYW1lIGFuZCBzZXJpYWwgbnVtYmVyCiAgICAgYXMgdGhlIHJvb3QgQ0EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgdG8gWDUwOV9BVFRSSUJVVEUgdXRpbGl0aWVzLCBjaGFuZ2UgdGhlICdyZXEnIHByb2dyYW0gc28gaXQgdXNlcwogICAgIHRoZSBuZXcgY29kZS4gQWRkIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3R1ZmYuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlcyB0byBYNTA5X0FUVFJJQlVURSB1dGlsaXRpZXMuIFRoZXNlIGhhdmUgYmVlbiByZW5hbWVkIGZyb20KICAgICBYNTA5XyooKSB0byBYNTA5YXRfKigpIG9uIHRoZSBncm91bmRzIHRoYXQgdGhleSBkb24ndCBoYW5kbGUgWDUwOQogICAgIHN0cnVjdHVyZXMgYW5kIGJlaGF2ZSBpbiBhbiBhbmFsb2dvdXMgd2F5IHRvIHRoZSBYNTA5djMgZnVuY3Rpb25zOgogICAgIHRoZXkgc2hvdWxkbid0IGJlIGNhbGxlZCBkaXJlY3RseSBidXQgd3JhcHBlciBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQKICAgICBpbnN0ZWFkLgoKICAgICBTbyB3ZSBhbHNvIG5vdyBoYXZlIHNvbWUgd3JhcHBlciBmdW5jdGlvbnMgdGhhdCBjYWxsIHRoZSBYNTA5YXQgZnVuY3Rpb25zCiAgICAgd2hlbiBwYXNzZWQgY2VydGlmaWNhdGUgcmVxdWVzdHMuIChUTyBETzogc2ltaWxhciB0aGluZ3MgY2FuIGJlIGRvbmUgd2l0aAogICAgIFBLQ1MjNyBzaWduZWQgYW5kIHVuc2lnbmVkIGF0dHJpYnV0ZXMsIFBLQ1MjMTIgYXR0cmlidXRlcyBhbmQgYSBmZXcgb3RoZXIKICAgICB0aGluZ3MuIFNvbWUgb2YgdGhlc2UgbmVlZCBzb21lIGQyaSBvciBpMmQgYW5kIHByaW50IGZ1bmN0aW9uYWxpdHkKICAgICBiZWNhdXNlIHRoZXkgaGFuZGxlIG1vcmUgY29tcGxleCBzdHJ1Y3R1cmVzLikKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbWlzc2luZyAjaWZuZGVmcyB0aGF0IGNhdXNlZCBtaXNzaW5nIHN5bWJvbHMgd2hlbiBidWlsZGluZyBsaWJzc2wKICAgICBhcyBhIHNoYXJlZCBsaWJyYXJ5IHdpdGhvdXQgUlNBLiAgVXNlICNpZm5kZWYgTk9fU1NMMiBpbnN0ZWFkIG9mCiAgICAgTk9fUlNBIGluIHNzbC9zMiouYy4gCiAgICAgW0tyaXMgS2VubmF3YXkgPGtyaXNAaHViLmZyZWVic2Qub3JnPiwgbW9kaWZpZWQgYnkgVWxmIE32bGxlcl0KCiAgKikgUHJlY2F1dGlvbnMgYWdhaW5zdCB1c2luZyB0aGUgUFJORyB1bmluaXRpYWxpemVkOiBSQU5EX2J5dGVzKCkgbm93CiAgICAgaGFzIGEgcmV0dXJuIHZhbHVlIHdoaWNoIGluZGljYXRlcyB0aGUgcXVhbGl0eSBvZiB0aGUgcmFuZG9tIGRhdGEKICAgICAoMSA9IG9rLCAwID0gbm90IHNlZWRlZCkuICBBbHNvIGFuIGVycm9yIGlzIHJlY29yZGVkIG9uIHRoZSB0aHJlYWQncwogICAgIGVycm9yIHF1ZXVlLiBOZXcgZnVuY3Rpb24gUkFORF9wc2V1ZG9fYnl0ZXMoKSBnZW5lcmF0ZXMgb3V0cHV0IHRoYXQgaXMKICAgICBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBidXQgbm90IHVucHJlZGljdGFibGUuIFJBTkRfYWRkIGlzIGxpa2UKICAgICBSQU5EX3NlZWQsIGJ1dCB0YWtlcyBhbiBleHRyYSBhcmd1bWVudCBmb3IgYW4gZW50cm9weSBlc3RpbWF0ZQogICAgIChSQU5EX3NlZWQgYWx3YXlzIGFzc3VtZXMgZnVsbCBlbnRyb3B5KS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRG8gbW9yZSBpdGVyYXRpb25zIG9mIFJhYmluLU1pbGxlciBwcm9iYWJsZSBwcmltZSB0ZXN0IChzcGVjaWZpY2FsbHksCiAgICAgMyBmb3IgMTAyNC1iaXQgcHJpbWVzLCA2IGZvciA1MTItYml0IHByaW1lcywgMTIgZm9yIDI1Ni1iaXQgcHJpbWVzCiAgICAgaW5zdGVhZCBvZiBvbmx5IDIgZm9yIGFsbCBsZW5ndGhzOyBzZWUgQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplIGRlZmluaXRpb24KICAgICBpbiBjcnlwdG8vYm4vYm5fcHJpbWUuYyBmb3IgdGhlIGNvbXBsZXRlIHRhYmxlKS4gIFRoaXMgZ3VhcmFudGVlcyBhCiAgICAgZmFsc2UtcG9zaXRpdmUgcmF0ZSBvZiBhdCBtb3N0IDJeLTgwIGZvciByYW5kb20gaW5wdXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmV3cml0ZSBzc2wzX3JlYWRfbiAoc3NsL3MzX3BrdC5jKSBhdm9pZGluZyBhIGNvdXBsZSBvZiBidWdzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X0NUWF9yZ2V0X2NoYWluKCkgKHJlbmFtZWQgdG8gWDUwOV9DVFhfZ2V0MV9jaGFpbgogICAgIGluIHRoZSAwLjkuNSByZWxlYXNlKSwgdGhpcyByZXR1cm5zIHRoZSBjaGFpbgogICAgIGZyb20gYW4gWDUwOV9DVFggc3RydWN0dXJlIHdpdGggYSBkdXAgb2YgdGhlIHN0YWNrIGFuZCBhbGwKICAgICB0aGUgWDUwOSByZWZlcmVuY2UgY291bnRzIHVwcGVkOiBzbyB0aGUgc3RhY2sgd2lsbCBleGlzdAogICAgIGFmdGVyIFg1MDlfQ1RYX2NsZWFudXAoKSBoYXMgYmVlbiBjYWxsZWQuIE1vZGlmeSBwa2NzMTIuYwogICAgIHRvIHVzZSB0aGlzLgoKICAgICBBbHNvIG1ha2UgU1NMX1NFU1NJT05fcHJpbnQoKSBwcmludCBvdXQgdGhlIHZlcmlmeSByZXR1cm4KICAgICBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBtYW5wYWdlIGZvciB0aGUgcGtjczEyIGNvbW1hbmQuIEFsc28gY2hhbmdlIHRoZSBkZWZhdWx0CiAgICAgYmVoYXZpb3VyIHNvIE1BQyBpdGVyYXRpb24gY291bnRzIGFyZSB1c2VkIHVubGVzcyB0aGUgbmV3CiAgICAgLW5vbWFjaXRlciBvcHRpb24gaXMgdXNlZC4gVGhpcyBpbXByb3ZlcyBmaWxlIHNlY3VyaXR5IGFuZAogICAgIG9ubHkgb2xkZXIgdmVyc2lvbnMgb2YgTVNJRSAoNC4wIGZvciBleGFtcGxlKSBuZWVkIGl0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhvbm9yIHRoZSBuby14eHggQ29uZmlndXJlIG9wdGlvbnMgd2hlbiBjcmVhdGluZyAuREVGIGZpbGVzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgUEtDUyMxMCBhdHRyaWJ1dGVzIHRvIGZpZWxkIHRhYmxlOiBjaGFsbGVuZ2VQYXNzd29yZCwgCiAgICAgdW5zdHJ1Y3R1cmVkTmFtZSBhbmQgdW5zdHJ1Y3R1cmVkQWRkcmVzcy4gVGhlc2UgYXJlIHRha2VuIGZyb20KICAgICBkcmFmdCBQS0NTIzkgdjIuMCBidXQgYXJlIGNvbXBhdGlibGUgd2l0aCB2MS4yIHByb3ZpZGVkIG5vIAogICAgIGludGVybmF0aW9uYWwgY2hhcmFjdGVycyBhcmUgdXNlZC4KCiAgICAgTW9yZSBjaGFuZ2VzIHRvIFg1MDlfQVRUUklCVVRFIGNvZGU6IGFsbG93IHRoZSBzZXR0aW5nIG9mIHR5cGVzCiAgICAgYmFzZWQgb24gc3RyaW5ncy4gUmVtb3ZlIHRoZSAnbG9jJyBwYXJhbWV0ZXIgd2hlbiBhZGRpbmcKICAgICBhdHRyaWJ1dGVzIGJlY2F1c2UgdGhlc2Ugd2lsbCBiZSBhIFNFVCBPRiBlbmNvZGluZyB3aGljaCBpcyBzb3J0ZWQKICAgICBpbiBBU04xIG9yZGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgY2hhbmdlcyB0byB0aGUgJ3JlcScgdXRpbGl0eSB0byBhbGxvdyByZXF1ZXN0IGdlbmVyYXRpb24KICAgICBhdXRvbWF0aW9uLiBUaGlzIHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8ganVzdCBnZW5lcmF0ZSBhIHRlbXBsYXRlCiAgICAgZmlsZSBjb250YWluaW5nIGFsbCB0aGUgZmllbGQgdmFsdWVzIGFuZCBoYXZlIHJlcSBjb25zdHJ1Y3QgdGhlCiAgICAgcmVxdWVzdC4KCiAgICAgSW5pdGlhbCBzdXBwb3J0IGZvciBYNTA5X0FUVFJJQlVURSBoYW5kbGluZy4gU3RhY2tzIG9mIHRoZXNlIGFyZQogICAgIHVzZWQgYWxsIG92ZXIgdGhlIHBsYWNlIGluY2x1ZGluZyBjZXJ0aWZpY2F0ZSByZXF1ZXN0cyBhbmQgUEtDUyM3CiAgICAgc3RydWN0dXJlcy4gVGhleSBhcmUgY3VycmVudGx5IGhhbmRsZWQgbWFudWFsbHkgd2hlcmUgbmVjZXNzYXJ5IHdpdGgKICAgICBzb21lIHByaW1pdGl2ZSB3cmFwcGVycyBmb3IgUEtDUyM3LiBUaGUgbmV3IGZ1bmN0aW9ucyBiZWhhdmUgaW4gYQogICAgIG1hbm5lciBhbmFsb2dvdXMgdG8gdGhlIFg1MDkgZXh0ZW5zaW9uIGZ1bmN0aW9uczogdGhleSBhbGxvdwogICAgIGF0dHJpYnV0ZXMgdG8gYmUgbG9va2VkIHVwIGJ5IE5JRCBhbmQgYWRkZWQuCgogICAgIExhdGVyIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoZSBYNTA5VjMgY29kZSB3b3VsZCBiZSBkZXNpcmFibGUgdG8KICAgICBhdXRvbWF0aWNhbGx5IGhhbmRsZSB0aGUgZW5jb2RpbmcsIGRlY29kaW5nIGFuZCBwcmludGluZyBvZiB0aGUKICAgICBtb3JlIGNvbXBsZXggdHlwZXMuIFRoZSBzdHJpbmcgdHlwZXMgbGlrZSBjaGFsbGVuZ2VQYXNzd29yZCBjYW4KICAgICBiZSBoYW5kbGVkIGJ5IHRoZSBzdHJpbmcgdGFibGUgZnVuY3Rpb25zLgoKICAgICBBbHNvIG1vZGlmaWVkIHRoZSBtdWx0aSBieXRlIHN0cmluZyB0YWJsZSBoYW5kbGluZy4gTm93IHRoZXJlIGlzCiAgICAgYSAnZ2xvYmFsIG1hc2snIHdoaWNoIG1hc2tzIG91dCBjZXJ0YWluIHR5cGVzLiBUaGUgdGFibGUgaXRzZWxmCiAgICAgY2FuIHVzZSB0aGUgZmxhZyBTVEFCTEVfTk9fTUFTSyB0byBpZ25vcmUgdGhlIG1hc2sgc2V0dGluZzogdGhpcwogICAgIGlzIHVzZWZ1bCB3aGVuIGZvciBleGFtcGxlIHRoZXJlIGlzIG9ubHkgb25lIHBlcm1pc3NpYmxlIHR5cGUKICAgICAoYXMgaW4gY291bnRyeU5hbWUpIGFuZCB1c2luZyB0aGUgbWFzayBtaWdodCByZXN1bHQgaW4gbm8gdmFsaWQKICAgICB0eXBlcyBhdCBhbGwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2xlYW4gdXAgJ0ZpbmlzaGVkJyBoYW5kbGluZywgYW5kIGFkZCBmdW5jdGlvbnMgU1NMX2dldF9maW5pc2hlZCBhbmQKICAgICBTU0xfZ2V0X3BlZXJfZmluaXNoZWQgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIG9idGFpbiB0aGUgbGF0ZXN0CiAgICAgRmluaXNoZWQgbWVzc2FnZXMgc2VudCB0byB0aGUgcGVlciBvciBleHBlY3RlZCBmcm9tIHRoZSBwZWVyLAogICAgIHJlc3BlY3RpdmVseS4gIChTU0xfZ2V0X3BlZXJfZmluaXNoZWQgaXMgdXN1YWxseSB0aGUgRmluaXNoZWQgbWVzc2FnZQogICAgIGFjdHVhbGx5IHJlY2VpdmVkIGZyb20gdGhlIHBlZXIsIG90aGVyd2lzZSB0aGUgcHJvdG9jb2wgd2lsbCBiZSBhYm9ydGVkLikKCiAgICAgQXMgdGhlIEZpbmlzaGVkIG1lc3NhZ2UgYXJlIG1lc3NhZ2UgZGlnZXN0cyBvZiB0aGUgY29tcGxldGUgaGFuZHNoYWtlCiAgICAgKHdpdGggYSB0b3RhbCBvZiAxOTIgYml0cyBmb3IgVExTIDEuMCBhbmQgbW9yZSBmb3IgU1NMIDMuMCksIHRoZXkgY2FuCiAgICAgYmUgdXNlZCBmb3IgZXh0ZXJuYWwgYXV0aGVudGljYXRpb24gcHJvY2VkdXJlcyB3aGVuIHRoZSBhdXRoZW50aWNhdGlvbgogICAgIHByb3ZpZGVkIGJ5IFNTTC9UTFMgaXMgbm90IGRlc2lyZWQgb3IgaXMgbm90IGVub3VnaC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBFbmhhbmNlZCBzdXBwb3J0IGZvciBBbHBoYSBMaW51eCBpcyBhZGRlZC4gTm93IC4vY29uZmlnIGNoZWNrcyBpZgogICAgIHRoZSBob3N0IHN1cHBvcnRzIEJXWCBleHRlbnNpb24gYW5kIGlmIENvbXBhcSBDIGlzIHByZXNlbnQgb24gdGhlCiAgICAgJFBBVEguIEp1c3QgZXhwbG9pdGluZyBvZiB0aGUgQldYIGV4dGVuc2lvbiByZXN1bHRzIGluIDIwLTMwJQogICAgIHBlcmZvcm1hbmNlIGtpY2sgZm9yIHNvbWUgYWxnb3JpdGhtcywgZS5nLiBERVMgYW5kIFJDNCB0byBtZW50aW9uCiAgICAgYSBjb3VwbGUuIENvbXBhcSBDIGluIHR1cm4gZ2VuZXJhdGVzIH4yMCUgZmFzdGVyIGNvZGUgZm9yIE1ENSBhbmQKICAgICBTSEExLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgTVMgImZhc3QgU0dDIi4gVGhpcyBpcyBhcmd1YWJseSBhIHZpb2xhdGlvbiBvZiB0aGUKICAgICBTU0wzL1RMUyBwcm90b2NvbC4gTmV0c2NhcGUgU0dDIGRvZXMgdHdvIGhhbmRzaGFrZXM6IHRoZSBmaXJzdCB3aXRoCiAgICAgd2VhayBjcnlwdG8gYW5kIGFmdGVyIGNoZWNraW5nIHRoZSBjZXJ0aWZpY2F0ZSBpcyBTR0MgYSBzZWNvbmQgb25lCiAgICAgd2l0aCBzdHJvbmcgY3J5cHRvLiBNUyBTR0Mgc3RvcHMgdGhlIGZpcnN0IGhhbmRzaGFrZSBhZnRlciByZWNlaXZpbmcKICAgICB0aGUgc2VydmVyIGNlcnRpZmljYXRlIG1lc3NhZ2UgYW5kIHNlbmRzIGEgc2Vjb25kIGNsaWVudCBoZWxsby4gU2luY2UKICAgICBhIHNlcnZlciB3aWxsIHR5cGljYWxseSBkbyBhbGwgdGhlIHRpbWUgY29uc3VtaW5nIG9wZXJhdGlvbnMgYmVmb3JlCiAgICAgZXhwZWN0aW5nIGFueSBmdXJ0aGVyIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudCAoc2VydmVyIGtleSBleGNoYW5nZQogICAgIGlzIHRoZSBtb3N0IGV4cGVuc2l2ZSkgdGhlcmUgaXMgbGl0dGxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvLgoKICAgICBUbyBnZXQgT3BlblNTTCB0byBzdXBwb3J0IE1TIFNHQyB3ZSBoYXZlIHRvIHBlcm1pdCBhIHNlY29uZCBjbGllbnQKICAgICBoZWxsbyBtZXNzYWdlIGFmdGVyIHdlIGhhdmUgc2VudCBzZXJ2ZXIgZG9uZS4gSW4gYWRkaXRpb24gd2UgaGF2ZSB0bwogICAgIHJlc2V0IHRoZSBNQUMgaWYgd2UgZG8gZ2V0IHRoaXMgc2Vjb25kIGNsaWVudCBoZWxsby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBmdW5jdGlvbiAnZDJpX0F1dG9Qcml2YXRlS2V5KCknIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGRlY2lkZQogICAgIGlmIGEgREVSIGVuY29kZWQgcHJpdmF0ZSBrZXkgaXMgUlNBIG9yIERTQSB0cmFkaXRpb25hbCBmb3JtYXQuIENoYW5nZWQKICAgICBkMmlfUHJpdmF0ZUtleV9iaW8oKSB0byB1c2UgaXQuIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIHRoZSAidHJhZGl0aW9uYWwiCiAgICAgZm9ybWF0IERFUiBlbmNvZGVkIHByaXZhdGUga2V5LiBOZXdlciBjb2RlIHNob3VsZCB1c2UgUEtDUyM4IGZvcm1hdCB3aGljaAogICAgIGhhcyB0aGUga2V5IHR5cGUgZW5jb2RlZCBpbiB0aGUgQVNOMSBzdHJ1Y3R1cmUuIEFkZGVkIERFUiBwcml2YXRlIGtleQogICAgIHN1cHBvcnQgdG8gcGtjczggYXBwbGljYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU1NMIDMvVExTIDEgc2VydmVycyBub3cgZG9uJ3QgcmVxdWVzdCBjZXJ0aWZpY2F0ZXMgd2hlbiBhbiBhbm9ueW1vdXMKICAgICBjaXBoZXJzdWl0ZXMgaGFzIGJlZW4gc2VsZWN0ZWQgKGFzIHJlcXVpcmVkIGJ5IHRoZSBTU0wgMy9UTFMgMQogICAgIHNwZWNpZmljYXRpb25zKS4gIEV4Y2VwdGlvbjogV2hlbiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUCiAgICAgaXMgc2V0LCB3ZSBpbnRlcnByZXQgdGhpcyBhcyBhIHJlcXVlc3QgdG8gdmlvbGF0ZSB0aGUgc3BlY2lmaWNhdGlvbgogICAgICh0aGUgd29yc3QgdGhhdCBjYW4gaGFwcGVuIGlzIGEgaGFuZHNoYWtlIGZhaWx1cmUsIGFuZCAnY29ycmVjdCcKICAgICBiZWhhdmlvdXIgd291bGQgcmVzdWx0IGluIGEgaGFuZHNoYWtlIGZhaWx1cmUgYW55d2F5KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBTU0xfQ1RYX2FkZF9zZXNzaW9uLCB0YWtlIGludG8gYWNjb3VudCB0aGF0IHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlCiAgICAgU1NMX1NFU1NJT04gc3RydWN0dXJlcyB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgKGUuZy4gd2hlbiB0d28gdGhyZWFkcwogICAgIGNvbmN1cnJlbnRseSBvYnRhaW4gdGhlbSBmcm9tIGFuIGV4dGVybmFsIGNhY2hlKS4KICAgICBUaGUgaW50ZXJuYWwgY2FjaGUgY2FuIGhhbmRsZSBvbmx5IG9uZSBTU0xfU0VTU0lPTiB3aXRoIGEgZ2l2ZW4gSUQsCiAgICAgc28gaWYgdGhlcmUncyBhIGNvbmZsaWN0LCB3ZSBub3cgdGhyb3cgb3V0IHRoZSBvbGQgb25lIHRvIGFjaGlldmUKICAgICBjb25zaXN0ZW5jeS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgT0lEcyBmb3IgaWRlYSBhbmQgYmxvd2Zpc2ggaW4gQ0JDIG1vZGUuIFRoaXMgd2lsbCBhbGxvdyBib3RoCiAgICAgdG8gYmUgdXNlZCBpbiBQS0NTIzUgdjIuMCBhbmQgUy9NSU1FLiAgQWxzbyBhZGQgY2hlY2tpbmcgdG8KICAgICBzb21lIHJvdXRpbmVzIHRoYXQgdXNlIGNpcGhlciBPSURzOiBzb21lIGNpcGhlcnMgZG8gbm90IGhhdmUgT0lEcwogICAgIGRlZmluZWQgYW5kIHNvIHRoZXkgY2Fubm90IGJlIHVzZWQgZm9yIFMvTUlNRSBhbmQgUEtDUyM1IHYyLjAgZm9yCiAgICAgZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTaW1wbGlmeSB0aGUgdHJ1c3Qgc2V0dGluZyBzdHJ1Y3R1cmUgYW5kIGNvZGUuIE5vdyB3ZSBqdXN0IGhhdmUKICAgICB0d28gc2VxdWVuY2VzIG9mIE9JRHMgZm9yIHRydXN0ZWQgYW5kIHJlamVjdGVkIHNldHRpbmdzLiBUaGVzZSB3aWxsCiAgICAgdHlwaWNhbGx5IGhhdmUgdmFsdWVzIHRoZSBzYW1lIGFzIHRoZSBleHRlbmRlZCBrZXkgdXNhZ2UgZXh0ZW5zaW9uCiAgICAgYW5kIGFueSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwdXJwb3Nlcy4KCiAgICAgVGhlIHRydXN0IGNoZWNraW5nIGNvZGUgbm93IGhhcyBhIGRlZmF1bHQgYmVoYXZpb3VyOiBpdCB3aWxsIGp1c3QKICAgICBjaGVjayBmb3IgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgTklEIGFzIHRoZSBwYXNzZWQgaWQuIEZ1bmN0aW9ucyBjYW4KICAgICBiZSBwcm92aWRlZCB0byBvdmVycmlkZSBlaXRoZXIgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9yIHRoZSBiZWhhdmlvdXIKICAgICBmb3IgYSBnaXZlbiBpZC4gU1NMIGNsaWVudCwgc2VydmVyIGFuZCBlbWFpbCBhbHJlYWR5IGhhdmUgZnVuY3Rpb25zCiAgICAgaW4gcGxhY2UgZm9yIGNvbXBhdGliaWxpdHk6IHRoZXkgY2hlY2sgdGhlIE5JRCBhbmQgYWxzbyByZXR1cm4gInRydXN0ZWQiCiAgICAgaWYgdGhlIGNlcnRpZmljYXRlIGlzIHNlbGYgc2lnbmVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBkMmksaTJkIGJpby9mcCBmdW5jdGlvbnMgZm9yIFByaXZhdGVLZXk6IHRoZXNlIGNvbnZlcnQgdGhlCiAgICAgdHJhZGl0aW9uYWwgZm9ybWF0IGludG8gYW4gRVZQX1BLRVkgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIHBhc3N3b3JkIGNhbGxiYWNrIGZ1bmN0aW9uIFBFTV9jYigpIHdoaWNoIGVpdGhlciBwcm9tcHRzIGZvcgogICAgIGEgcGFzc3dvcmQgaWYgdXNyX2RhdGEgaXMgTlVMTCBvciBvdGhlcndpc2UgYXNzdW1lcyBpdCBpcyBhIG51bGwKICAgICB0ZXJtaW5hdGVkIHBhc3N3b3JkLiBBbGxvdyBwYXNzd29yZHMgdG8gYmUgcGFzc2VkIG9uIGNvbW1hbmQgbGluZQogICAgIGVudmlyb25tZW50IG9yIGNvbmZpZyBmaWxlcyBpbiBhIGZldyBtb3JlIHV0aWxpdGllcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBidW5jaCBvZiBERVIgYW5kIFBFTSBmdW5jdGlvbnMgdG8gaGFuZGxlIFBLQ1MjOCBmb3JtYXQgcHJpdmF0ZQogICAgIGtleXMuIEFkZCBzb21lIHNob3J0IG5hbWVzIGZvciBQS0NTIzggUEJFIGFsZ29yaXRobXMgYW5kIGFsbG93IHRoZW0KICAgICB0byBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBmb3IgdGhlIHBrY3M4IGFuZCBwa2NzMTIgdXRpbGl0aWVzLgogICAgIFVwZGF0ZSBkb2N1bWVudGF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIEFTTjEgIk5VTEwiIHR5cGUuIFRoaXMgY291bGQgYmUgaGFuZGxlZCBiZWZvcmUgYnkgdXNpbmcKICAgICBBU04xX1RZUEUgYnV0IHRoZXJlIHdhc24ndCBhbnkgZnVuY3Rpb24gdGhhdCB3b3VsZCB0cnkgdG8gcmVhZCBhIE5VTEwKICAgICBhbmQgcHJvZHVjZSBhbiBlcnJvciBpZiBpdCBjb3VsZG4ndC4gRm9yIGNvbXBhdGliaWxpdHkgd2UgYWxzbyBoYXZlCiAgICAgQVNOMV9OVUxMX25ldygpIGFuZCBBU04xX05VTExfZnJlZSgpIGZ1bmN0aW9ucyBidXQgdGhlc2UgYXJlIGZha2VkIGFuZAogICAgIGRvbid0IGFsbG9jYXRlIGFueXRoaW5nIGJlY2F1c2UgdGhleSBkb24ndCBuZWVkIHRvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgTWFjT1MgaXMgbm93IHByb3ZpZGVkLiBFeGFtaW5lIElOU1RBTEwuTWFjT1MKICAgICBmb3IgZGV0YWlscy4KICAgICBbQW5keSBQb2x5YWtvdiwgUm95IFdvb2RzIDxyb3lAY2VudGljc3lzdGVtcy5jYT5dCgogICopIFJlYnVpbGQgb2YgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIHVzZWQgYnkgT3BlblNTTCBjb2RlIGFuZAogICAgIHBvc3NpYmx5IG90aGVycyBhcyB3ZWxsLiAgVGhlIHB1cnBvc2UgaXMgdG8gbWFrZSBhbiBpbnRlcmZhY2UgdGhhdAogICAgIHByb3ZpZGUgaG9va3Mgc28gYW55b25lIGNhbiBidWlsZCBhIHNlcGFyYXRlIHNldCBvZiBhbGxvY2F0aW9uIGFuZAogICAgIGRlYWxsb2NhdGlvbiByb3V0aW5lcyB0byBiZSB1c2VkIGJ5IE9wZW5TU0wsIGZvciBleGFtcGxlIG1lbW9yeQogICAgIHBvb2wgaW1wbGVtZW50YXRpb25zLCBvciBzb21ldGhpbmcgZWxzZSwgd2hpY2ggd2FzIHByZXZpb3VzbHkgaGFyZAogICAgIHNpbmNlIE1hbGxvYygpLCBSZWFsbG9jKCkgYW5kIEZyZWUoKSB3ZXJlIGRlZmluZWQgYXMgbWFjcm9zIGhhdmluZwogICAgIHRoZSB2YWx1ZXMgbWFsbG9jLCByZWFsbG9jIGFuZCBmcmVlLCByZXNwZWN0aXZlbHkgKGV4Y2VwdCBmb3IgV2luMzIKICAgICBjb21waWxhdGlvbnMpLiAgVGhlIHNhbWUgaXMgcHJvdmlkZWQgZm9yIG1lbW9yeSBkZWJ1Z2dpbmcgY29kZS4KICAgICBPcGVuU1NMIGFscmVhZHkgY29tZXMgd2l0aCBmdW5jdGlvbmFsaXR5IHRvIGZpbmQgbWVtb3J5IGxlYWtzLCBidXQKICAgICB0aGlzIGdpdmVzIHBlb3BsZSBhIGNoYW5jZSB0byBkZWJ1ZyBvdGhlciBtZW1vcnkgcHJvYmxlbXMuCgogICAgIFdpdGggdGhlc2UgY2hhbmdlcywgYSBuZXcgc2V0IG9mIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIGhhdmUgYXBwZWFyZWQ6CgogICAgICAgQ1JZUFRPX3NldF9tZW1fZGVidWdfZnVuY3Rpb25zKCkJICAgICAgICBbRl0KICAgICAgIENSWVBUT19nZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucygpICAgICAgICAgW0ZdCiAgICAgICBDUllQVE9fZGJnX3NldF9vcHRpb25zKCkJICAgICAgICAgICAgICAgIFtGXQogICAgICAgQ1JZUFRPX2RiZ19nZXRfb3B0aW9ucygpICAgICAgICAgICAgICAgICBbRl0KICAgICAgIENSWVBUT19tYWxsb2NfZGVidWdfaW5pdCgpICAgICAgICAgICAgICAgW01dCgogICAgIFRoZSBtZW1vcnkgZGVidWcgZnVuY3Rpb25zIGFyZSBOVUxMIGJ5IGRlZmF1bHQsIHVubGVzcyB0aGUgbGlicmFyeQogICAgIGlzIGNvbXBpbGVkIHdpdGggQ1JZUFRPX01ERUJVRyBvciBmcmllbmRzIGlzIGRlZmluZWQuICBJZiBzb21lb25lCiAgICAgd2FudHMgdG8gZGVidWcgbWVtb3J5IGFueXdheSwgQ1JZUFRPX21hbGxvY19kZWJ1Z19pbml0KCkgKHdoaWNoCiAgICAgZ2l2ZXMgdGhlIHN0YW5kYXJkIGRlYnVnZ2luZyBmdW5jdGlvbnMgdGhhdCBjb21lIHdpdGggT3BlblNTTCkgb3IKICAgICBDUllQVE9fc2V0X21lbV9kZWJ1Z19mdW5jdGlvbnMoKSAodGVsbHMgT3BlblNTTCB0byB1c2UgZnVuY3Rpb25zCiAgICAgcHJvdmlkZWQgYnkgdGhlIGxpYnJhcnkgdXNlcikgbXVzdCBiZSB1c2VkLiAgV2hlbiB0aGUgc3RhbmRhcmQKICAgICBkZWJ1Z2dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkLCBDUllQVE9fZGJnX3NldF9vcHRpb25zIGNhbiBiZSB1c2VkIHRvCiAgICAgcmVxdWVzdCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uOgogICAgIENSWVBUT19kYmdfc2V0X29wdGlvbnMoVl9DWVJQVE9fTURFQlVHX3h4eCkgY29ycmVzcG9uZHMgdG8gc2V0dGluZwogICAgIHRoZSBDUllQVE9fTURFQlVHX3h4eCBtYWNybyB3aGVuIGNvbXBpbGluZyB0aGUgbGlicmFyeS4gICAKCiAgICAgQWxzbywgdGhpbmdzIGxpa2UgQ1JZUFRPX3NldF9tZW1fZnVuY3Rpb25zIHdpbGwgYWx3YXlzIGdpdmUgdGhlCiAgICAgZXhwZWN0ZWQgcmVzdWx0ICh0aGUgbmV3IHNldCBvZiBmdW5jdGlvbnMgaXMgdXNlZCBmb3IgYWxsb2NhdGlvbgogICAgIGFuZCBkZWFsbG9jYXRpb24pIGF0IGFsbCB0aW1lcywgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybSBhbmQgY29tcGlsZXIKICAgICBvcHRpb25zLgoKICAgICBUbyBmaW5pc2ggaXQgdXAsIHNvbWUgZnVuY3Rpb25zIHRoYXQgd2VyZSBuZXZlciB1c2UgaW4gYW55IG90aGVyCiAgICAgd2F5IHRoYW4gdGhyb3VnaCBtYWNyb3MgaGF2ZSBhIG5ldyBBUEkgYW5kIG5ldyBzZW1hbnRpYzoKCiAgICAgICBDUllQVE9fZGJnX21hbGxvYygpCiAgICAgICBDUllQVE9fZGJnX3JlYWxsb2MoKQogICAgICAgQ1JZUFRPX2RiZ19mcmVlKCkKCiAgICAgQWxsIG1hY3JvcyBvZiB2YWx1ZSBoYXZlIHJldGFpbmVkIHRoZWlyIG9sZCBzeW50YXguCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSBhbmQgQm9kbyBNb2VsbGVyXQoKICAqKSBTb21lIFMvTUlNRSBmaXhlcy4gVGhlIE9JRCBmb3IgU01JTUVDYXBhYmlsaXRpZXMgd2FzIHdyb25nLCB0aGUKICAgICBvcmRlcmluZyBvZiBTTUlNRUNhcGFiaWxpdGllcyB3YXNuJ3QgaW4gInN0cmVuZ3RoIG9yZGVyIiBhbmQgdGhlcmUKICAgICB3YXMgYSBtaXNzaW5nIE5VTEwgaW4gdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgZm9yIHRoZSBTSEExIHNpZ25hdHVyZQogICAgIGFsZ29yaXRobS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTb21lIEFTTjEgdHlwZXMgd2l0aCBpbGxlZ2FsIHplcm8gbGVuZ3RoIGVuY29kaW5nIChJTlRFR0VSLAogICAgIEVOVU1FUkFURUQgYW5kIE9CSkVDVCBJREVOVElGSUVSKSBjaG9rZWQgdGhlIEFTTjEgcm91dGluZXMuCiAgICAgW0ZyYW5zIEhleW1hbnMgPGZoZXltYW5zQGlzYXNlcnZlci5iZT4sIG1vZGlmaWVkIGJ5IFN0ZXZlIEhlbnNvbl0KCiAgKikgTWVyZ2UgaW4gbXkgUy9NSU1FIGxpYnJhcnkgZm9yIE9wZW5TU0wuIFRoaXMgcHJvdmlkZXMgYSBzaW1wbGUKICAgICBTL01JTUUgQVBJIG9uIHRvcCBvZiB0aGUgUEtDUyM3IGNvZGUsIGEgTUlNRSBwYXJzZXIgKHdpdGggZW5vdWdoCiAgICAgZnVuY3Rpb25hbGl0eSB0byBoYW5kbGUgbXVsdGlwYXJ0L3NpZ25lZCBwcm9wZXJseSkgYW5kIGEgdXRpbGl0eQogICAgIGNhbGxlZCAnc21pbWUnIHRvIGNhbGwgYWxsIHRoaXMgc3R1ZmYuIFRoaXMgaXMgYmFzZWQgb24gY29kZSBJCiAgICAgb3JpZ2luYWxseSB3cm90ZSBmb3IgQ2VsbyB3aG8gaGF2ZSBraW5kbHkgYWxsb3dlZCBpdCB0byBiZQogICAgIGluY2x1ZGVkIGluIE9wZW5TU0wuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHZhcmlhbnRzIGRlc19zZXRfa2V5X2NoZWNrZWQgYW5kIGRlc19zZXRfa2V5X3VuY2hlY2tlZCBvZgogICAgIGRlc19zZXRfa2V5IChha2EgZGVzX2tleV9zY2hlZCkuICBHbG9iYWwgdmFyaWFibGUgZGVzX2NoZWNrX2tleQogICAgIGRlY2lkZXMgd2hpY2ggb2YgdGhlc2UgaXMgY2FsbGVkIGJ5IGRlc19zZXRfa2V5OyB0aGlzIHdheQogICAgIGRlc19jaGVja19rZXkgYmVoYXZlcyBhcyBpdCBhbHdheXMgZGlkLCBidXQgYXBwbGljYXRpb25zIGFuZAogICAgIHRoZSBsaWJyYXJ5IGl0c2VsZiwgd2hpY2ggd2FzIGJ1Z2d5IGZvciBkZXNfY2hlY2tfa2V5ID09IDEsCiAgICAgaGF2ZSBhIGNsZWFuZXIgd2F5IHRvIHBpY2sgdGhlIHZlcnNpb24gdGhleSBuZWVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBQS0NTMTJfbmV3cGFzcygpIHdoaWNoIGNoYW5nZXMgdGhlIHBhc3N3b3JkIG9mIGEKICAgICBQS0NTMTIgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSBYNTA5X1RSVVNUIGFuZCBYNTA5X1BVUlBPU0Ugc28gaXQgYWxzbyB1c2VzIGEgc3RhdGljIGFuZAogICAgIGR5bmFtaWMgbWl4LiBJbiBib3RoIGNhc2VzIHRoZSBpZHMgY2FuIGJlIHVzZWQgYXMgYW4gaW5kZXggaW50byB0aGUKICAgICB0YWJsZS4gQWxzbyBtb2RpZmllZCB0aGUgWDUwOV9UUlVTVF9hZGQoKSBhbmQgWDUwOV9QVVJQT1NFX2FkZCgpCiAgICAgZnVuY3Rpb25zIHNvIHRoZXkgYWNjZXB0IGEgbGlzdCBvZiB0aGUgZmllbGQgdmFsdWVzIGFuZCB0aGUKICAgICBhcHBsaWNhdGlvbiBkb2Vzbid0IG5lZWQgdG8gZGlyZWN0bHkgbWFuaXB1bGF0ZSB0aGUgWDUwOV9UUlVTVAogICAgIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlIEFTTjFfU1RSSU5HX1RBQkxFIHN0dWZmIHNvIGl0IGFsc28gdXNlcyBic2VhcmNoIGFuZCBkb2Vzbid0CiAgICAgbmVlZCBpbml0aWFsaXNpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSB3YXkgdGhlIFYzIGV4dGVuc2lvbiBjb2RlIGxvb2tzIHVwIGV4dGVuc2lvbnMuIFRoaXMgbm93CiAgICAgd29ya3MgaW4gYSBzaW1pbGFyIHdheSB0byB0aGUgb2JqZWN0IGNvZGU6IHdlIGhhdmUgc29tZSAic3RhbmRhcmQiCiAgICAgZXh0ZW5zaW9ucyBpbiBhIHN0YXRpYyB0YWJsZSB3aGljaCBpcyBzZWFyY2hlZCB3aXRoIE9CSl9ic2VhcmNoKCkKICAgICBhbmQgdGhlIGFwcGxpY2F0aW9uIGNhbiBhZGQgZHluYW1pYyBvbmVzIGlmIG5lZWRlZC4gVGhlIGZpbGUKICAgICBjcnlwdG8veDUwOXYzL2V4dF9kYXQuaCBub3cgaGFzIHRoZSBpbmZvOiB0aGlzIGZpbGUgbmVlZHMgdG8gYmUKICAgICB1cGRhdGVkIHdoZW5ldmVyIGEgbmV3IGV4dGVuc2lvbiBpcyBhZGRlZCB0byB0aGUgY29yZSBjb2RlIGFuZCBrZXB0CiAgICAgaW4gZXh0X25pZCBvcmRlci4gVGhlcmUgaXMgYSBzaW1wbGUgcHJvZ3JhbSAndGFidGVzdC5jJyB3aGljaCBjaGVja3MKICAgICB0aGlzLiBOZXcgZXh0ZW5zaW9ucyBhcmUgbm90IGFkZGVkIHRvbyBvZnRlbiBzbyB0aGlzIGZpbGUgY2FuIHJlYWRpbHkKICAgICBiZSBtYWludGFpbmVkIG1hbnVhbGx5LgoKICAgICBUaGVyZSBhcmUgdHdvIGJpZyBhZHZhbnRhZ2VzIGluIGRvaW5nIHRoaW5ncyB0aGlzIHdheS4gVGhlIGV4dGVuc2lvbnMKICAgICBjYW4gYmUgbG9va2VkIHVwIGltbWVkaWF0ZWx5IGFuZCBubyBsb25nZXIgbmVlZCB0byBiZSAiYWRkZWQiIHVzaW5nCiAgICAgWDUwOVYzX2FkZF9zdGFuZGFyZF9leHRlbnNpb25zKCk6IHRoaXMgZnVuY3Rpb24gbm93IGRvZXMgbm90aGluZy4KICAgICBbU2lkZSBub3RlOiBJIGdldCAqbG90cyogb2YgZW1haWwgc2F5aW5nIHRoZSBleHRlbnNpb24gY29kZSBkb2Vzbid0CiAgICAgIHdvcmsgYmVjYXVzZSBwZW9wbGUgZm9yZ2V0IHRvIGNhbGwgdGhpcyBmdW5jdGlvbl0KICAgICBBbHNvIG5vIGR5bmFtaWMgYWxsb2NhdGlvbiBpcyBkb25lIHVubGVzcyBuZXcgZXh0ZW5zaW9ucyBhcmUgYWRkZWQ6CiAgICAgc28gaWYgd2UgZG9uJ3QgYWRkIGN1c3RvbSBleHRlbnNpb25zIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsbAogICAgIFg1MDlWM19FWFRfY2xlYW51cCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSBlbmMgdXRpbGl0eSdzIHNhbHRpbmcgYXMgZm9sbG93czogbWFrZSBzYWx0aW5nIHRoZSBkZWZhdWx0LiBBZGQgYQogICAgIG1hZ2ljIGhlYWRlciwgc28gdW5zYWx0ZWQgZmlsZXMgZmFpbCBncmFjZWZ1bGx5IGluc3RlYWQgb2YganVzdCBkZWNyeXB0aW5nCiAgICAgdG8gZ2FyYmFnZS4gVGhpcyBpcyBiZWNhdXNlIG5vdCBzYWx0aW5nIGlzIGEgYmlnIHNlY3VyaXR5IGhvbGUsIHNvIHBlb3BsZQogICAgIHNob3VsZCBiZSBkaXNjb3VyYWdlZCBmcm9tIGRvaW5nIGl0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXhlcyBhbmQgZW5oYW5jZW1lbnRzIHRvIHRoZSAneDUwOScgdXRpbGl0eS4gSXQgYWxsb3dlZCBhIG1lc3NhZ2UKICAgICBkaWdlc3QgdG8gYmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUgYnV0IGl0IG9ubHkgdXNlZCB0aGlzCiAgICAgcGFyYW1ldGVyIHdoZW4gc2lnbmluZyBhIGNlcnRpZmljYXRlLiBNb2RpZmllZCBzbyBhbGwgcmVsZXZhbnQKICAgICBvcGVyYXRpb25zIGFyZSBhZmZlY3RlZCBieSB0aGUgZGlnZXN0IHBhcmFtZXRlciBpbmNsdWRpbmcgdGhlCiAgICAgLWZpbmdlcnByaW50IGFuZCAteDUwOXRvcmVxIG9wdGlvbnMuIEFsc28gLXg1MDl0b3JlcSBjaG9rZWQgaWYgYQogICAgIERTQSBrZXkgd2FzIHVzZWQgYmVjYXVzZSBpdCBkaWRuJ3QgZml4IHRoZSBkaWdlc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBjZXJ0aWZpY2F0ZSBjaGFpbiB2ZXJpZnkgY29kZS4gQ3VycmVudGx5IHRlc3RzIHRoZSB1bnRydXN0ZWQKICAgICBjZXJ0aWZpY2F0ZXMgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIHZlcmlmeSBwdXJwb3NlICh3aGljaCBpcyBzZXQKICAgICB3aGVuIHRoZSBYNTA5X1NUT1JFX0NUWCBzdHJ1Y3R1cmUgaXMgc2V0IHVwKSBhbmQgY2hlY2tzIHRoZSBwYXRobGVuZ3RoLgoKICAgICBUaGVyZSBpcyBhIE5PX0NIQUlOX1ZFUklGWSBjb21waWxhdGlvbiBvcHRpb24gdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91cjoKICAgICB0aGlzIGlzIGJlY2F1c2UgaXQgd2lsbCByZWplY3QgY2hhaW5zIHdpdGggaW52YWxpZCBleHRlbnNpb25zIHdoZXJlYXMKICAgICBldmVyeSBwcmV2aW91cyB2ZXJzaW9uIG9mIE9wZW5TU0wgYW5kIFNTTGVheSBtYWRlIG5vIGNoZWNrcyBhdCBhbGwuCgogICAgIFRydXN0IGNvZGU6IGNoZWNrcyB0aGUgcm9vdCBDQSBmb3IgdGhlIHJlbGV2YW50IHRydXN0IHNldHRpbmdzLiBUcnVzdAogICAgIHNldHRpbmdzIGhhdmUgYW4gaW5pdGlhbCB2YWx1ZSBjb25zaXN0ZW50IHdpdGggdGhlIHZlcmlmeSBwdXJwb3NlOiBlLmcuCiAgICAgaWYgdGhlIHZlcmlmeSBwdXJwb3NlIGlzIGZvciBTU0wgY2xpZW50IHVzZSBpdCBleHBlY3RzIHRoZSBDQSB0byBiZQogICAgIHRydXN0ZWQgZm9yIFNTTCBjbGllbnQgdXNlLiBIb3dldmVyIHRoZSBkZWZhdWx0IHZhbHVlIGNhbiBiZSBjaGFuZ2VkIHRvCiAgICAgcGVybWl0IGN1c3RvbSB0cnVzdCBzZXR0aW5nczogb25lIGV4YW1wbGUgb2YgdGhpcyB3b3VsZCBiZSB0byBvbmx5IHRydXN0CiAgICAgY2VydGlmaWNhdGVzIGZyb20gYSBzcGVjaWZpYyAic2VjdXJlIiBzZXQgb2YgQ0FzLgoKICAgICBBbHNvIGFkZGVkIFg1MDlfU1RPUkVfQ1RYX25ldygpIGFuZCBYNTA5X1NUT1JFX0NUWF9mcmVlKCkgZnVuY3Rpb25zCiAgICAgd2hpY2ggc2hvdWxkIGJlIHVzZWQgZm9yIHZlcnNpb24gcG9ydGFiaWxpdHk6IGVzcGVjaWFsbHkgc2luY2UgdGhlCiAgICAgdmVyaWZ5IHN0cnVjdHVyZSBpcyBsaWtlbHkgdG8gY2hhbmdlIG1vcmUgb2Z0ZW4gbm93LgoKICAgICBTU0wgaW50ZWdyYXRpb24uIEFkZCBwdXJwb3NlIGFuZCB0cnVzdCB0byBTU0xfQ1RYIGFuZCBTU0wgYW5kIGZ1bmN0aW9ucwogICAgIHRvIHNldCB0aGVtLiBJZiBub3Qgc2V0IHRoZW4gYXNzdW1lIFNTTCBjbGllbnRzIHdpbGwgdmVyaWZ5IFNTTCBzZXJ2ZXJzCiAgICAgYW5kIHZpY2UgdmVyc2EuCgogICAgIFR3byBuZXcgb3B0aW9ucyB0byB0aGUgdmVyaWZ5IHByb2dyYW06IC11bnRydXN0ZWQgYWxsb3dzIGEgc2V0IG9mCiAgICAgdW50cnVzdGVkIGNlcnRpZmljYXRlcyB0byBiZSBwYXNzZWQgaW4gYW5kIC1wdXJwb3NlIHdoaWNoIHNldHMgdGhlCiAgICAgaW50ZW5kZWQgcHVycG9zZSBvZiB0aGUgY2VydGlmaWNhdGUuIElmIGEgcHVycG9zZSBpcyBzZXQgdGhlbiB0aGUKICAgICBuZXcgY2hhaW4gdmVyaWZ5IGNvZGUgaXMgdXNlZCB0byBjaGVjayBleHRlbnNpb24gY29uc2lzdGVuY3kuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgdGhlIGF1dGhvcml0eSBpbmZvcm1hdGlvbiBhY2Nlc3MgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSBSU0EgYW5kIERTQSBQRU0gcmVhZCByb3V0aW5lcyB0byB0cmFuc3BhcmVudGx5IGhhbmRsZQogICAgIFBLQ1MjOCBmb3JtYXQgcHJpdmF0ZSBrZXlzLiBOZXcgKl9QVUJLRVlfKiBmdW5jdGlvbnMgdGhhdCBoYW5kbGUKICAgICBwdWJsaWMga2V5cyBpbiBhIGZvcm1hdCBjb21wYXRpYmxlIHdpdGggY2VydGlmaWNhdGUKICAgICBTdWJqZWN0UHVibGljS2V5SW5mbyBzdHJ1Y3R1cmVzLiBVbmZvcnR1bmF0ZWx5IHRoZXJlIHdlcmUgYWxyZWFkeQogICAgIGZ1bmN0aW9ucyBjYWxsZWQgKl9QdWJsaWNLZXlfKiB3aGljaCB1c2VkIHZhcmlvdXMgb2RkIGZvcm1hdHMgc28KICAgICB0aGVzZSBhcmUgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHk6IGhvd2V2ZXIgdGhlIERTQSB2YXJpYW50cyB3ZXJlCiAgICAgbmV2ZXIgaW4gYSBwdWJsaWMgcmVsZWFzZSBzbyB0aGV5IGhhdmUgYmVlbiBkZWxldGVkLiBDaGFuZ2VkIGRzYS9yc2EKICAgICB1dGlsaXRpZXMgdG8gaGFuZGxlIHRoZSBuZXcgZm9ybWF0OiBub3RlIG5vIHJlbGVhc2VzIGV2ZXIgaGFuZGxlZCBwdWJsaWMKICAgICBrZXlzIHNvIHdlIHNob3VsZCBiZSBPSy4KCiAgICAgVGhlIHByaW1hcnkgbW90aXZhdGlvbiBmb3IgdGhpcyBjaGFuZ2UgaXMgdG8gYXZvaWQgdGhlIHNhbWUgZmlhc2NvCiAgICAgdGhhdCBkb2dzIHByaXZhdGUga2V5czogdGhlcmUgYXJlIHNldmVyYWwgaW5jb21wYXRpYmxlIHByaXZhdGUga2V5CiAgICAgZm9ybWF0cyBzb21lIG9mIHdoaWNoIGFyZSBzdGFuZGFyZCBhbmQgc29tZSBPcGVuU1NMIHNwZWNpZmljIGFuZAogICAgIHJlcXVpcmUgdmFyaW91cyBldmlsIGhhY2tzIHRvIGFsbG93IHBhcnRpYWwgdHJhbnNwYXJlbnQgaGFuZGxpbmcgYW5kCiAgICAgZXZlbiB0aGVuIGl0IGRvZXNuJ3Qgd29yayB3aXRoIERFUiBmb3JtYXRzLiBHaXZlbiB0aGUgb3B0aW9uIGFueXRoaW5nCiAgICAgb3RoZXIgdGhhbiBQS0NTIzggc2hvdWxkIGJlIGR1bXBlZDogYnV0IHRoZSBvdGhlciBmb3JtYXRzIGhhdmUgdG8KICAgICBzdGF5IGluIHRoZSBuYW1lIG9mIGNvbXBhdGliaWxpdHkuCgogICAgIFdpdGggcHVibGljIGtleXMgYW5kIHRoZSBiZW5lZml0IG9mIGhpbmRzaWdodCBvbmUgc3RhbmRhcmQgZm9ybWF0IAogICAgIGlzIHVzZWQgd2hpY2ggd29ya3Mgd2l0aCBFVlBfUEtFWSwgUlNBIG9yIERTQSBzdHJ1Y3R1cmVzOiB0aG91Z2gKICAgICBpdCBjbGVhcmx5IHJldHVybnMgYW4gZXJyb3IgaWYgeW91IHRyeSB0byByZWFkIHRoZSB3cm9uZyBraW5kIG9mIGtleS4KCiAgICAgQWRkZWQgYSAtcHVia2V5IG9wdGlvbiB0byB0aGUgJ3g1MDknIHV0aWxpdHkgdG8gb3V0cHV0IHRoZSBwdWJsaWMga2V5LgogICAgIEFsc28gcmVuYW1lIHRoZSBFVlBfUEtFWV9nZXRfKigpIHRvIEVWUF9QS0VZX3JnZXRfKigpCiAgICAgKHJlbmFtZWQgdG8gRVZQX1BLRVlfZ2V0MV8qKCkgaW4gdGhlIE9wZW5TU0wgMC45LjUgcmVsZWFzZSkgYW5kIGFkZAogICAgIEVWUF9QS0VZX3JzZXRfKigpIGZ1bmN0aW9ucyAocmVuYW1lZCB0byBFVlBfUEtFWV9zZXQxXyooKSkKICAgICB0aGF0IGRvIHRoZSBzYW1lIGFzIHRoZSBFVlBfUEtFWV9hc3NpZ25fKigpIGV4Y2VwdCB0aGV5IHVwIHRoZQogICAgIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgYWRkZWQga2V5ICh0aGV5IGRvbid0ICJzd2FsbG93IiB0aGUKICAgICBzdXBwbGllZCBrZXkpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIHRvIGNyeXB0by94NTA5L2J5X2ZpbGUuYyB0aGUgY29kZSB0byByZWFkIGluIGNlcnRpZmljYXRlcyBhbmQKICAgICBDUkxzIHdvdWxkIGZhaWwgaWYgdGhlIGZpbGUgY29udGFpbmVkIG5vIGNlcnRpZmljYXRlcyBvciBubyBDUkxzOgogICAgIGFkZGVkIGEgbmV3IGZ1bmN0aW9uIHRvIHJlYWQgaW4gYm90aCB0eXBlcyBhbmQgcmV0dXJuIHRoZSBudW1iZXIKICAgICByZWFkOiB0aGlzIG1lYW5zIHRoYXQgaWYgbm9uZSBhcmUgcmVhZCBpdCB3aWxsIGJlIGFuIGVycm9yLiBUaGUKICAgICBERVIgdmVyc2lvbnMgb2YgdGhlIGNlcnRpZmljYXRlIGFuZCBDUkwgcmVhZGVyIHdvdWxkIGFsd2F5cyBmYWlsCiAgICAgYmVjYXVzZSBpdCBpc24ndCBwb3NzaWJsZSB0byBtaXggY2VydGlmaWNhdGVzIGFuZCBDUkxzIGluIERFUiBmb3JtYXQKICAgICB3aXRob3V0IGNob2tpbmcgb25lIG9yIHRoZSBvdGhlciByb3V0aW5lLiBDaGFuZ2VkIHRoaXMgdG8ganVzdCByZWFkCiAgICAgYSBjZXJ0aWZpY2F0ZTogdGhpcyBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8uIEFsc28gbW9kaWZpZWQgdGhlIGNvZGUKICAgICBpbiBhcHBzL3ZlcmlmeS5jIHRvIHRha2Ugbm90aWNlIG9mIHJldHVybiBjb2RlczogaXQgd2FzIHByZXZpb3VzbHkKICAgICBhdHRlbXB0aW5nIHRvIHJlYWQgaW4gY2VydGlmaWNhdGVzIGZyb20gTlVMTCBwb2ludGVycyBhbmQgaWdub3JpbmcKICAgICBhbnkgZXJyb3JzOiB0aGlzIGlzIG9uZSByZWFzb24gd2h5IHRoZSBjZXJ0IGFuZCBDUkwgcmVhZGVyIHNlZW1lZAogICAgIHRvIHdvcmsuIEl0IGRvZXNuJ3QgY2hlY2sgcmV0dXJuIGNvZGVzIGZyb20gdGhlIGRlZmF1bHQgY2VydGlmaWNhdGUKICAgICByb3V0aW5lczogdGhlc2UgbWF5IHdlbGwgZmFpbCBpZiB0aGUgY2VydGlmaWNhdGVzIGFyZW4ndCBpbnN0YWxsZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29kZSB0byBzdXBwb3J0IG90aGVyTmFtZSBvcHRpb24gaW4gR2VuZXJhbE5hbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRmlyc3QgdXBkYXRlIHRvIHZlcmlmeSBjb2RlLiBDaGFuZ2UgdGhlIHZlcmlmeSB1dGlsaXR5CiAgICAgc28gaXQgd2FybnMgaWYgaXQgaXMgcGFzc2VkIGEgc2VsZiBzaWduZWQgY2VydGlmaWNhdGU6CiAgICAgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIG5vcm1hbCBiZWhhdmlvdXIuIFg1MDlfdmVyaWZ5CiAgICAgaGFzIGJlZW4gbW9kaWZpZWQgdG8gaXQgd2lsbCBub3cgdmVyaWZ5IGEgc2VsZiBzaWduZWQKICAgICBjZXJ0aWZpY2F0ZSBpZiAqZXhhY3RseSogdGhlIHNhbWUgY2VydGlmaWNhdGUgYXBwZWFycwogICAgIGluIHRoZSBzdG9yZTogaXQgd2FzIHByZXZpb3VzbHkgaW1wb3NzaWJsZSB0byB0cnVzdCBhCiAgICAgc2luZ2xlIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlLiBUaGlzIG1lYW5zIHRoYXQ6CiAgICAgb3BlbnNzbCB2ZXJpZnkgc3MucGVtCiAgICAgbm93IGdpdmVzIGEgd2FybmluZyBhYm91dCBhIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlIGJ1dAogICAgIG9wZW5zc2wgdmVyaWZ5IC1DQWZpbGUgc3MucGVtIHNzLnBlbQogICAgIGlzIE9LLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZvciBzZXJ2ZXJzLCBzdG9yZSB2ZXJpZnlfcmVzdWx0IGluIFNTTF9TRVNTSU9OIGRhdGEgc3RydWN0dXJlCiAgICAgKGFuZCBhZGQgaXQgdG8gZXh0ZXJuYWwgc2Vzc2lvbiByZXByZXNlbnRhdGlvbikuCiAgICAgVGhpcyBpcyBuZWVkZWQgd2hlbiBjbGllbnQgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9ucyBmYWlscywKICAgICBidXQgYW4gYXBwbGljYXRpb24tcHJvdmlkZWQgdmVyaWZpY2F0aW9uIGNhbGxiYWNrIChzZXQgYnkKICAgICBTU0xfQ1RYX3NldF9jZXJ0X3ZlcmlmeV9jYWxsYmFjaykgYWxsb3dzIGFjY2VwdGluZyB0aGUgc2Vzc2lvbgogICAgIGFueXdheSAoaS5lLiBsZWF2ZXMgeDUwOV9zdG9yZV9jdHgtPmVycm9yICE9IFg1MDlfVl9PSwogICAgIGJ1dCByZXR1cm5zIDEpOiBXaGVuIHRoZSBzZXNzaW9uIGlzIHJldXNlZCwgd2UgaGF2ZSB0byBzZXQKICAgICBzc2wtPnZlcmlmeV9yZXN1bHQgdG8gdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgdG8gYXZvaWQKICAgICBzZWN1cml0eSBob2xlcy4KICAgICBbQm9kbyBNb2VsbGVyLCBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEx1dHogSmFlbmlja2VdCgogICopIEZpeCBhIGJ1ZyBpbiB0aGUgbmV3IFBLQ1MjNyBjb2RlOiBpdCBkaWRuJ3QgY29uc2lkZXIgdGhlCiAgICAgY2FzZSBpbiBQS0NTN19kYXRhSW5pdCgpIHdoZXJlIHRoZSBzaWduZWQgUEtDUzcgc3RydWN0dXJlCiAgICAgZGlkbid0IGNvbnRhaW4gYW55IGV4aXN0aW5nIGRhdGEgYmVjYXVzZSBpdCB3YXMgYmVpbmcgY3JlYXRlZC4KICAgICBbUG8tQ2hlbmcgQ2hlbiA8cG9jaGVuZ0Buc3QuY29tLnR3Piwgc2xpZ2h0bHkgbW9kaWZpZWQgYnkgU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBzYWx0IHRvIHRoZSBrZXkgZGVyaXZhdGlvbiByb3V0aW5lcyBpbiBlbmMuYy4gVGhpcwogICAgIGZvcm1zIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSBlbmNyeXB0ZWQgZmlsZS4gQWxzbyBhZGQgYQogICAgIC1TIG9wdGlvbiB0byBhbGxvdyBhIHNhbHQgdG8gYmUgaW5wdXQgb24gdGhlIGNvbW1hbmQgbGluZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOV9jbXAoKS4gT2RkbHkgZW5vdWdoIHRoZXJlIHdhc24ndCBhIGZ1bmN0aW9uCiAgICAgdG8gY29tcGFyZSB0d28gY2VydGlmaWNhdGVzLiBXZSBkbyB0aGlzIGJ5IHdvcmtpbmcgb3V0IHRoZSBTSEExCiAgICAgaGFzaCBhbmQgY29tcGFyaW5nIHRoYXQuIFg1MDlfY21wKCkgd2lsbCBiZSBuZWVkZWQgYnkgdGhlIHRydXN0CiAgICAgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTU0xfZ2V0MV9zZXNzaW9uKCkgaXMgbGlrZSBTU0xfZ2V0X3Nlc3Npb24oKSwgYnV0IGluY3JlbWVudHMKICAgICB0aGUgcmVmZXJlbmNlIGNvdW50IGluIHRoZSBTU0xfU0VTU0lPTiByZXR1cm5lZC4KICAgICBbR2VvZmYgVGhvcnBlIDxnZW9mZkBldS5jMi5uZXQ+XQoKICAqKSBGaXggZm9yICdyZXEnOiBpdCB3YXMgYWRkaW5nIGEgbnVsbCB0byByZXF1ZXN0IGF0dHJpYnV0ZXMuCiAgICAgQWxzbyBjaGFuZ2UgdGhlIFg1MDlfTE9PS1VQIGFuZCBYNTA5X0lORk8gY29kZSB0byBoYW5kbGUKICAgICBjZXJ0aWZpY2F0ZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIDQwIGFuZCA2NCBiaXQgUkMyIGFuZCBSQzQgYWxnb3JpdGhtczogZG9jdW1lbnQKICAgICB0aGUgJ2VuYycgY29tbWFuZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGFkZCBleHRyYSBpbmZvcm1hdGlvbiB0byB0aGUgbWVtb3J5IGxlYWsKICAgICBkZXRlY3Rpbmcgb3V0cHV0LCB0byBmb3JtIHRyYWNlYmFja3MsIHNob3dpbmcgZnJvbSB3aGVyZSBlYWNoCiAgICAgYWxsb2NhdGlvbiB3YXMgb3JpZ2luYXRlZDogQ1JZUFRPX3B1c2hfaW5mbygiY29uc3RhbnQgc3RyaW5nIikgYWRkcwogICAgIHRoZSBzdHJpbmcgcGx1cyBjdXJyZW50IGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgdG8gYSBwZXItdGhyZWFkCiAgICAgc3RhY2ssIENSWVBUT19wb3BfaW5mbygpIGRvZXMgdGhlIG9idmlvdXMsIENSWVBUT19yZW1vdmVfYWxsX2luZm8oKQogICAgIGlzIGxpa2UgY2FsbGluZyBDWVJQVE9fcG9wX2luZm8oKSB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHkuCiAgICAgQWxzbyB1cGRhdGVkIG1lbW9yeSBsZWFrIGRldGVjdGlvbiBjb2RlIHRvIGJlIG11bHRpLXRocmVhZC1zYWZlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBvcHRpb25zIC10ZXh0IGFuZCAtbm9vdXQgdG8gcGtjczcgdXRpbGl0eSBhbmQgZGVsZXRlIHRoZQogICAgIGVuY3J5cHRpb24gb3B0aW9ucyB3aGljaCBuZXZlciBkaWQgYW55dGhpbmcuIFVwZGF0ZSBkb2NzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBvcHRpb25zIHRvIHNvbWUgb2YgdGhlIHV0aWxpdGllcyB0byBhbGxvdyB0aGUgcGFzcyBwaHJhc2UKICAgICB0byBiZSBpbmNsdWRlZCBvbiBlaXRoZXIgdGhlIGNvbW1hbmQgbGluZSAobm90IHJlY29tbWVuZGVkIG9uCiAgICAgT1NlcyBsaWtlIFVuaXgpIG9yIHJlYWQgZnJvbSB0aGUgZW52aXJvbm1lbnQuIFVwZGF0ZSB0aGUKICAgICBtYW5wYWdlcyBhbmQgZml4IGEgZmV3IGJ1Z3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZmV3IG1hbnBhZ2VzIGZvciBzb21lIG9mIHRoZSBvcGVuc3NsIGNvbW1hbmRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0aGUgLXJldm9rZSBvcHRpb24gaW4gY2EuIEl0IHdhcyBmcmVlaW5nIHVwIG1lbW9yeSB0d2ljZSwKICAgICBsZWFraW5nIGFuZCBub3QgZmluZGluZyBhbHJlYWR5IHJldm9rZWQgY2VydGlmaWNhdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHN1cHBvcnQgY2VydGlmaWNhdGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uLgogICAgIFRoaXMgaW52b2x2ZXMgdGhlIHVzZSBvZiBYNTA5X0NFUlRfQVVYIHN0cnVjdHVyZSBhbmQgWDUwOV9BVVgKICAgICBmdW5jdGlvbnMuIEFuIFg1MDlfQVVYIGZ1bmN0aW9uIHN1Y2ggYXMgUEVNX3JlYWRfWDUwOV9BVVgoKQogICAgIGNhbiBzdGlsbCByZWFkIGluIGEgY2VydGlmaWNhdGUgZmlsZSBpbiB0aGUgdXN1YWwgd2F5IGJ1dCBpdAogICAgIHdpbGwgYWxzbyByZWFkIGluIGFueSBhZGRpdGlvbmFsICJhdXhpbGlhcnkgaW5mb3JtYXRpb24iLiBCeQogICAgIGRvaW5nIHRoaW5ncyB0aGlzIHdheSBhIGZhaXIgZGVncmVlIG9mIGNvbXBhdGliaWxpdHkgY2FuIGJlCiAgICAgcmV0YWluZWQ6IGV4aXN0aW5nIGNlcnRpZmljYXRlcyBjYW4gaGF2ZSB0aGlzIGluZm9ybWF0aW9uIGFkZGVkCiAgICAgdXNpbmcgdGhlIG5ldyAneDUwOScgb3B0aW9ucy4gCgogICAgIEN1cnJlbnQgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGluY2x1ZGVzIGFuICJhbGlhcyIgYW5kIHNvbWUgdHJ1c3QKICAgICBzZXR0aW5ncy4gVGhlIHRydXN0IHNldHRpbmdzIHdpbGwgdWx0aW1hdGVseSBiZSB1c2VkIGluIGVuaGFuY2VkCiAgICAgY2VydGlmaWNhdGUgY2hhaW4gdmVyaWZpY2F0aW9uIHJvdXRpbmVzOiBjdXJyZW50bHkgYSBjZXJ0aWZpY2F0ZQogICAgIGNhbiBvbmx5IGJlIHRydXN0ZWQgaWYgaXQgaXMgc2VsZiBzaWduZWQgYW5kIHRoZW4gaXQgaXMgdHJ1c3RlZAogICAgIGZvciBhbGwgcHVycG9zZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGFzc2VtYmxlciBmb3IgQWxwaGEgKHRlc3RlZCBvbmx5IG9uIERFQyBPU0Ygbm90IExpbnV4IG9yICpCU0QpLgogICAgIFRoZSBwcm9ibGVtIHdhcyB0aGF0IG9uZSBvZiB0aGUgcmVwbGFjZW1lbnQgcm91dGluZXMgaGFkIG5vdCBiZWVuIHdvcmtpbmcKICAgICBzaW5jZSBTU0xlYXkgcmVsZWFzZXMuICBGb3Igbm93IHRoZSBvZmZlbmRpbmcgcm91dGluZSBoYXMgYmVlbiByZXBsYWNlZAogICAgIHdpdGggbm9uLW9wdGltaXNlZCBhc3NlbWJsZXIuICBFdmVuIHNvLCB0aGlzIG5vdyBnaXZlcyBhcm91bmQgOTUlCiAgICAgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZm9yIDEwMjQgYml0IFJTQSBzaWducy4KICAgICBbTWFyayBDb3hdCgogICopIEhhY2sgdG8gZml4IFBLQ1MjNyBkZWNyeXB0aW9uIHdoZW4gdXNlZCB3aXRoIHNvbWUgdW5vcnRob2RveCBSQzIgCiAgICAgaGFuZGxpbmcuIE1vc3QgY2xpZW50cyBoYXZlIHRoZSBlZmZlY3RpdmUga2V5IHNpemUgaW4gYml0cyBlcXVhbCB0bwogICAgIHRoZSBrZXkgbGVuZ3RoIGluIGJpdHM6IHNvIGEgNDAgYml0IFJDMiBrZXkgdXNlcyBhIDQwIGJpdCAoNSBieXRlKSBrZXkuCiAgICAgQSBmZXcgaG93ZXZlciBkb24ndCBkbyB0aGlzIGFuZCBpbnN0ZWFkIHVzZSB0aGUgc2l6ZSBvZiB0aGUgZGVjcnlwdGVkIGtleQogICAgIHRvIGRldGVybWluZSB0aGUgUkMyIGtleSBsZW5ndGggYW5kIHRoZSBBbGdvcml0aG1JZGVudGlmaWVyIHRvIGRldGVybWluZQogICAgIHRoZSBlZmZlY3RpdmUga2V5IGxlbmd0aC4gSW4gdGhpcyBjYXNlIHRoZSBlZmZlY3RpdmUga2V5IGxlbmd0aCBjYW4gc3RpbGwKICAgICBiZSA0MCBiaXRzIGJ1dCB0aGUga2V5IGxlbmd0aCBjYW4gYmUgMTY4IGJpdHMgZm9yIGV4YW1wbGUuIFRoaXMgaXMgZml4ZWQKICAgICBieSBtYW51YWxseSBmb3JjaW5nIGFuIFJDMiBrZXkgaW50byB0aGUgRVZQX1BLRVkgc3RydWN0dXJlIGJlY2F1c2UgdGhlCiAgICAgRVZQIGNvZGUgY2FuJ3QgY3VycmVudGx5IGhhbmRsZSB1bnVzdWFsIFJDMiBrZXkgc2l6ZXM6IGl0IGFsd2F5cyBhc3N1bWVzCiAgICAgdGhlIGtleSBsZW5ndGggYW5kIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoIGFyZSBlcXVhbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBidW5jaCBvZiBmdW5jdGlvbnMgdGhhdCBzaG91bGQgc2ltcGxpZnkgdGhlIGNyZWF0aW9uIG9mIAogICAgIFg1MDlfTkFNRSBzdHJ1Y3R1cmVzLiBOb3cgeW91IHNob3VsZCBiZSBhYmxlIHRvIGRvOgogICAgIFg1MDlfTkFNRV9hZGRfZW50cnlfYnlfdHh0KG5tLCAiQ04iLCBNQlNUUklOR19BU0MsICJTdGV2ZSIsIC0xLCAtMSwgMCk7CiAgICAgYW5kIGhhdmUgaXQgYXV0b21hdGljYWxseSB3b3JrIG91dCB0aGUgY29ycmVjdCBmaWVsZCB0eXBlIGFuZCBmaWxsIGluCiAgICAgdGhlIHN0cnVjdHVyZXMuIFRoZSBtb3JlIGFkdmVudHVyb3VzIGNhbiB0cnk6CiAgICAgWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV90eHQobm0sIGZpZWxkLCBNQlNUUklOR19VVEY4LCBzdHIsIC0xLCAtMSwgMCk7CiAgICAgYW5kIGl0IHdpbGwgKGhvcGVmdWxseSkgd29yayBvdXQgdGhlIGNvcnJlY3QgbXVsdGlieXRlIGVuY29kaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0aGUgJ3JlcScgdXRpbGl0eSB0byB1c2UgdGhlIG5ldyBmaWVsZCBoYW5kbGluZyBhbmQgbXVsdGlieXRlCiAgICAgY29weSByb3V0aW5lcy4gQmVmb3JlIHRoZSBETiBmaWVsZCBjcmVhdGlvbiB3YXMgaGFuZGxlZCBpbiBhbiBhZCBob2MKICAgICB3YXkgaW4gcmVxLCBjYSwgYW5kIHg1MDkgd2hpY2ggd2FzIHJhdGhlciBicm9rZW4gYW5kIGRpZG4ndCBzdXBwb3J0CiAgICAgQk1QU3RyaW5ncyBvciBVVEY4U3RyaW5ncy4gU2luY2Ugc29tZSBzb2Z0d2FyZSBkb2Vzbid0IGltcGxlbWVudAogICAgIEJNUFN0cmluZ3Mgb3IgVVRGOFN0cmluZ3MgeWV0LCB0aGV5IGNhbiBiZSBlbmFibGVkIHVzaW5nIHRoZSBjb25maWcgZmlsZQogICAgIHVzaW5nIHRoZSBkaXJzdHJpbmdfdHlwZSBvcHRpb24uIFNlZSB0aGUgbmV3IGNvbW1lbnQgaW4gdGhlIGRlZmF1bHQKICAgICBvcGVuc3NsLmNuZiBmb3IgbW9yZSBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgY3J5cHRvL3JhbmQvbWRfcmFuZC5jIG1vcmUgcm9idXN0OgogICAgIC0gQXNzdXJlIHVuaXF1ZSByYW5kb20gbnVtYmVycyBhZnRlciBmb3JrKCkuCiAgICAgLSBNYWtlIHN1cmUgdGhhdCBjb25jdXJyZW50IHRocmVhZHMgYWNjZXNzIHRoZSBnbG9iYWwgY291bnRlciBhbmQKICAgICAgIG1kIHNlcmlhbGl6YWJseSBzbyB0aGF0IHdlIG5ldmVyIGxvc2UgZW50cm9weSBpbiB0aGVtCiAgICAgICBvciB1c2UgZXhhY3RseSB0aGUgc2FtZSBzdGF0ZSBpbiBtdWx0aXBsZSB0aHJlYWRzLgogICAgICAgQWNjZXNzIHRvIHRoZSBsYXJnZSBzdGF0ZSBpcyBub3QgYWx3YXlzIHNlcmlhbGl6YWJsZSBiZWNhdXNlCiAgICAgICB0aGUgYWRkaXRpb25hbCBsb2NraW5nIGNvdWxkIGJlIGEgcGVyZm9ybWFuY2Uga2lsbGVyLCBhbmQKICAgICAgIG1kIHNob3VsZCBiZSBsYXJnZSBlbm91Z2ggYW55d2F5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmaWxlIGFwcHMvYXBwX3JhbmQuYyB3aXRoIGNvbW1vbmx5IG5lZWRlZCBmdW5jdGlvbmFsaXR5CiAgICAgZm9yIGhhbmRsaW5nIHRoZSByYW5kb20gc2VlZCBmaWxlLgoKICAgICBVc2UgdGhlIHJhbmRvbSBzZWVkIGZpbGUgaW4gc29tZSBhcHBsaWNhdGlvbnMgdGhhdCBwcmV2aW91c2x5IGRpZCBub3Q6CiAgICAgICAgICBjYSwKICAgICAgICAgIGRzYXBhcmFtIC1nZW5rZXkgKHdoaWNoIGFsc28gaWdub3JlZCBpdHMgJy1yYW5kJyBvcHRpb24pLCAKICAgICAgICAgIHNfY2xpZW50LAogICAgICAgICAgc19zZXJ2ZXIsCiAgICAgICAgICB4NTA5ICh3aGVuIHNpZ25pbmcpLgogICAgIEV4Y2VwdCBvbiBzeXN0ZW1zIHdpdGggL2Rldi91cmFuZG9tLCBpdCBpcyBjcnVjaWFsIHRvIGhhdmUgYSByYW5kb20KICAgICBzZWVkIGZpbGUgYXQgbGVhc3QgZm9yIGtleSBjcmVhdGlvbiwgRFNBIHNpZ25pbmcsIGFuZCBmb3IgREggZXhjaGFuZ2VzOwogICAgIGZvciBSU0Egc2lnbmF0dXJlcyB3ZSBjb3VsZCBkbyB3aXRob3V0IG9uZS4KCiAgICAgZ2VuZGggYW5kIGdlbmRzYSAodW5saWtlIGdlbnJzYSkgdXNlZCB0byByZWFkIG9ubHkgdGhlIGZpcnN0IGJ5dGUKICAgICBvZiBlYWNoIGZpbGUgbGlzdGVkIGluIHRoZSAnLXJhbmQnIG9wdGlvbi4gIFRoZSBmdW5jdGlvbiBhcyBwcmV2aW91c2x5CiAgICAgZm91bmQgaW4gZ2VucnNhIGlzIG5vdyBpbiBhcHBfcmFuZC5jIGFuZCBpcyB1c2VkIGJ5IGFsbCBwcm9ncmFtcwogICAgIHRoYXQgc3VwcG9ydCAnLXJhbmQnLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIFJBTkRfd3JpdGVfZmlsZSwgdXNlIG1vZGUgMDYwMCBmb3IgY3JlYXRpbmcgZmlsZXM7CiAgICAgZG9uJ3QganVzdCBjaG1vZCB3aGVuIGl0IG1heSBiZSB0b28gbGF0ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZXBvcnQgYW4gZXJyb3IgZnJvbSBYNTA5X1NUT1JFX2xvYWRfbG9jYXRpb25zCiAgICAgd2hlbiBYNTA5X0xPT0tVUF9sb2FkX2ZpbGUgb3IgWDUwOV9MT09LVVBfYWRkX2RpciBmYWlsZWQuCiAgICAgW0JpbGwgUGVycnldCgogICopIE5ldyBmdW5jdGlvbiBBU04xX21ic3RyaW5nX2NvcHkoKSB0aGlzIGNvcGllcyBhIHN0cmluZyBpbiBlaXRoZXIKICAgICBBU0NJSSwgVW5pY29kZSwgVW5pdmVyc2FsICg0IGJ5dGVzIHBlciBjaGFyYWN0ZXIpIG9yIFVURjggZm9ybWF0CiAgICAgaW50byBhbiBBU04xX1NUUklORyB0eXBlLiBBIG1hc2sgb2YgcGVybWlzc2libGUgdHlwZXMgaXMgcGFzc2VkCiAgICAgYW5kIGl0IGNob29zZXMgdGhlICJtaW5pbWFsIiB0eXBlIHRvIHVzZSBvciBhbiBlcnJvciBpZiBub3QgdHlwZQogICAgIGlzIHN1aXRhYmxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdW5jdGlvbiBlcXVpdmFsZW50cyB0byB0aGUgdmFyaW91cyBtYWNyb3MgaW4gYXNuMS5oLiBUaGUgb2xkCiAgICAgbWFjcm9zIGFyZSByZXRhaW5lZCB3aXRoIGFuIE1fIHByZWZpeC4gQ29kZSBpbnNpZGUgdGhlIGxpYnJhcnkgY2FuCiAgICAgdXNlIHRoZSBNXyBtYWNyb3MuIEV4dGVybmFsIGNvZGUgKGluY2x1ZGluZyB0aGUgb3BlbnNzbCB1dGlsaXR5KQogICAgIHNob3VsZCAqTk9UKiBpbiBvcmRlciB0byBiZSAic2hhcmVkIGxpYnJhcnkgZnJpZW5kbHkiLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB2YXJpb3VzIGZ1bmN0aW9ucyB0aGF0IGNhbiBjaGVjayBhIGNlcnRpZmljYXRlJ3MgZXh0ZW5zaW9ucwogICAgIHRvIHNlZSBpZiBpdCB1c2FibGUgZm9yIHZhcmlvdXMgcHVycG9zZXMgc3VjaCBhcyBTU0wgY2xpZW50LAogICAgIHNlcnZlciBvciBTL01JTUUgYW5kIENBcyBvZiB0aGVzZSB0eXBlcy4gVGhpcyBpcyBjdXJyZW50bHkgCiAgICAgVkVSWSBFWFBFUklNRU5UQUwgYnV0IHdpbGwgdWx0aW1hdGVseSBiZSB1c2VkIGZvciBjZXJ0aWZpY2F0ZSBjaGFpbgogICAgIHZlcmlmaWNhdGlvbi4gQWxzbyBhZGRlZCBhIC1wdXJwb3NlIGZsYWcgdG8geDUwOSB1dGlsaXR5IHRvCiAgICAgcHJpbnQgb3V0IGFsbCB0aGUgcHVycG9zZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgQ1JZUFRPX0VYX0RBVEEgdG8gWDUwOSBjZXJ0aWZpY2F0ZSBzdHJ1Y3R1cmUgYW5kIGFzc29jaWF0ZWQKICAgICBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IFg1MDlWM197WDUwOSxDUkwsUkVWT0tFRH1fZ2V0X2QyaSgpIGZ1bmN0aW9ucy4gVGhlc2Ugd2lsbCBzZWFyY2gKICAgICBmb3IsIG9idGFpbiBhbmQgZGVjb2RlIGFuZCBleHRlbnNpb24gYW5kIG9idGFpbiBpdHMgY3JpdGljYWwgZmxhZy4KICAgICBUaGlzIGFsbG93cyBhbGwgdGhlIG5lY2Vzc2FyeSBleHRlbnNpb24gY29kZSB0byBiZSBoYW5kbGVkIGluIGEKICAgICBzaW5nbGUgZnVuY3Rpb24gY2FsbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSQzQgdHVuZS11cCBmZWF0dXJpbmcgMzAtNDAlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG9uIG1vc3QgUklTQwogICAgIHBsYXRmb3Jtcy4gU2VlIGNyeXB0by9yYzQvcmM0X2VuYy5jIGZvciBmdXJ0aGVyIGRldGFpbHMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE5ldyAtbm9vdXQgb3B0aW9uIHRvIGFzbjFwYXJzZS4gVGhpcyBjYXVzZXMgbm8gb3V0cHV0IHRvIGJlIHByb2R1Y2VkCiAgICAgaXRzIG1haW4gdXNlIGlzIHdoZW4gY29tYmluZWQgd2l0aCAtc3RycGFyc2UgYW5kIC1vdXQgdG8gZXh0cmFjdCBkYXRhCiAgICAgZnJvbSBhIGZpbGUgKHdoaWNoIG1heSBub3QgYmUgaW4gQVNOLjEgZm9ybWF0KS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZm9yIHBrY3MxMiBwcm9ncmFtLiBJdCB3YXMgaGFzaGluZyBhbiBpbnZhbGlkIGNlcnRpZmljYXRlIHBvaW50ZXIKICAgICB3aGVuIHByb2R1Y2luZyB0aGUgbG9jYWwga2V5IGlkLgogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQoKICAqKSBOZXcgb3B0aW9uIC1kaHBhcmFtIGluIHNfc2VydmVyLiBUaGlzIGFsbG93cyBhIERIIHBhcmFtZXRlciBmaWxlIHRvIGJlCiAgICAgc3RhdGVkIGV4cGxpY2l0bHkuIElmIGl0IGlzIG5vdCBzdGF0ZWQgdGhlbiBpdCB0cmllcyB0aGUgZmlyc3Qgc2VydmVyCiAgICAgY2VydGlmaWNhdGUgZmlsZS4gVGhlIHByZXZpb3VzIGJlaGF2aW91ciBoYXJkIGNvZGVkIHRoZSBmaWxlbmFtZQogICAgICJzZXJ2ZXIucGVtIi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgLXB1YmluIGFuZCAtcHVib3V0IG9wdGlvbnMgdG8gdGhlIHJzYSBhbmQgZHNhIGNvbW1hbmRzLiBUaGVzZSBhbGxvdwogICAgIGEgcHVibGljIGtleSB0byBiZSBpbnB1dCBvciBvdXRwdXQuIEZvciBleGFtcGxlOgogICAgIG9wZW5zc2wgcnNhIC1pbiBrZXkucGVtIC1wdWJvdXQgLW91dCBwdWJrZXkucGVtCiAgICAgQWxzbyBhZGRlZCBuZWNlc3NhcnkgRFNBIHB1YmxpYyBrZXkgZnVuY3Rpb25zIHRvIGhhbmRsZSB0aGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBzbyBQS0NTN19kYXRhVmVyaWZ5KCkgZG9lc24ndCBjcmFzaCBpZiBubyBjZXJ0aWZpY2F0ZXMgYXJlIGNvbnRhaW5lZAogICAgIGluIHRoZSBtZXNzYWdlLiBUaGlzIHdhcyBoYW5kbGVkIGJ5IGFsbG93aW5nCiAgICAgWDUwOV9maW5kX2J5X2lzc3Vlcl9hbmRfc2VyaWFsKCkgdG8gdG9sZXJhdGUgYSBOVUxMIHBhc3NlZCB0byBpdC4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBTYW1wbyBLZWxsb21ha2kgPHNhbXBvQG1haWwubmV1cm9uaW8ucHQ+XQoKICAqKSBGaXggZm9yIGJ1ZyBpbiBkMmlfQVNOMV9ieXRlcygpOiBvdGhlciBBU04xIGZ1bmN0aW9ucyBhZGQgYW4gZXh0cmEgbnVsbAogICAgIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZ3Mgd2hlcmVhcyB0aGlzIGRpZG4ndC4gVGhpcyB3b3VsZCBjYXVzZSBwcm9ibGVtcwogICAgIGlmIHN0cmluZ3MgcmVhZCB3aXRoIGQyaV9BU04xX2J5dGVzKCkgd2VyZSBsYXRlciBtb2RpZmllZC4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBGaXggZm9yIGJhc2U2NCBkZWNvZGUgYnVnLiBXaGVuIGEgYmFzZTY0IGJpbyByZWFkcyBvbmx5IG9uZSBsaW5lIG9mCiAgICAgZGF0YSBhbmQgaXQgY29udGFpbnMgRU9GIGl0IHdpbGwgZW5kIHVwIHJldHVybmluZyBhbiBlcnJvci4gVGhpcyBpcwogICAgIGNhdXNlZCBieSBpbnB1dCA0NiBieXRlcyBsb25nLiBUaGUgY2F1c2UgaXMgZHVlIHRvIHRoZSB3YXkgYmFzZTY0CiAgICAgQklPcyBmaW5kIHRoZSBzdGFydCBvZiBiYXNlNjQgZW5jb2RlZCBkYXRhLiBUaGV5IGRvIHRoaXMgYnkgdHJ5aW5nIGEKICAgICB0cmlhbCBkZWNvZGUgb24gZWFjaCBsaW5lIHVudGlsIHRoZXkgZmluZCBvbmUgdGhhdCB3b3Jrcy4gV2hlbiB0aGV5CiAgICAgZG8gYSBmbGFnIGlzIHNldCBhbmQgaXQgc3RhcnRzIGFnYWluIGtub3dpbmcgaXQgY2FuIHBhc3MgYWxsIHRoZQogICAgIGRhdGEgZGlyZWN0bHkgdGhyb3VnaCB0aGUgZGVjb2Rlci4gVW5mb3J0dW5hdGVseSBpdCBkb2Vzbid0IHJlc2V0CiAgICAgdGhlIGNvbnRleHQgaXQgdXNlcy4gVGhpcyBtZWFucyB0aGF0IGlmIEVPRiBpcyByZWFjaGVkIGFuIGF0dGVtcHQKICAgICBpcyBtYWRlIHRvIHBhc3MgdHdvIEVPRnMgdGhyb3VnaCB0aGUgY29udGV4dCBhbmQgdGhpcyBjYXVzZXMgdGhlCiAgICAgcmVzdWx0aW5nIGVycm9yLiBUaGlzIGNhbiBhbHNvIGNhdXNlIG90aGVyIHByb2JsZW1zIGFzIHdlbGwuIEFzIGlzCiAgICAgdXN1YWwgd2l0aCB0aGVzZSBwcm9ibGVtcyBpdCB0YWtlcyAqYWdlcyogdG8gZmluZCBhbmQgdGhlIGZpeCBpcwogICAgIHRyaXZpYWw6IG1vdmUgb25lIGxpbmUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgaWFuQHVucy5ucy5hYy55dSAoSXZhbiBOZWpnZWJhdWVyKSBdCgogICopIFVnbHkgd29ya2Fyb3VuZCB0byBnZXQgc19jbGllbnQgYW5kIHNfc2VydmVyIHdvcmtpbmcgdW5kZXIgV2luZG93cy4gVGhlCiAgICAgb2xkIGNvZGUgd291bGRuJ3Qgd29yayBiZWNhdXNlIGl0IG5lZWRlZCB0byBzZWxlY3QoKSBvbiBzb2NrZXRzIGFuZCB0aGUKICAgICB0dHkgKGZvciBrZXlwcmVzc2VzIGFuZCB0byBzZWUgaWYgZGF0YSBjb3VsZCBiZSB3cml0dGVuKS4gV2luMzIgb25seQogICAgIHN1cHBvcnRzIHNlbGVjdCgpIG9uIHNvY2tldHMgc28gd2Ugc2VsZWN0KCkgd2l0aCBhIDFzIHRpbWVvdXQgb24gdGhlCiAgICAgc29ja2V0cyBhbmQgdGhlbiBzZWUgaWYgYW55IGNoYXJhY3RlcnMgYXJlIHdhaXRpbmcgdG8gYmUgcmVhZCwgaWYgbm9uZQogICAgIGFyZSBwcmVzZW50IHRoZW4gd2UgcmV0cnksIHdlIGFsc28gYXNzdW1lIHdlIGNhbiBhbHdheXMgd3JpdGUgZGF0YSB0bwogICAgIHRoZSB0dHkuIFRoaXMgaXNuJ3QgbmljZSBiZWNhdXNlIHRoZSBjb2RlIHRoZW4gYmxvY2tzIHVudGlsIHdlJ3ZlCiAgICAgcmVjZWl2ZWQgYSBjb21wbGV0ZSBsaW5lIG9mIGRhdGEgYW5kIGl0IGlzIGVmZmVjdGl2ZWx5IHBvbGxpbmcgdGhlCiAgICAga2V5Ym9hcmQgYXQgMXMgaW50ZXJ2YWxzOiBob3dldmVyIGl0J3MgcXVpdGUgYSBiaXQgYmV0dGVyIHRoYW4gbm90CiAgICAgd29ya2luZyBhdCBhbGwgOi0pIEEgZGVkaWNhdGVkIFdpbmRvd3MgYXBwbGljYXRpb24gbWlnaHQgaGFuZGxlIHRoaXMKICAgICB3aXRoIGFuIGV2ZW50IGxvb3AgZm9yIGV4YW1wbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSBSU0FfTUVUSE9EIHN0cnVjdHVyZS4gTm93IHRoZXJlIGFyZSB0d28gZXh0cmEgbWV0aG9kcywgcnNhX3NpZ24KICAgICBhbmQgcnNhX3ZlcmlmeS4gV2hlbiB0aGUgUlNBX0ZMQUdTX1NJR05fVkVSIG9wdGlvbiBpcyBzZXQgdGhlc2UgZnVuY3Rpb25zCiAgICAgd2lsbCBiZSBjYWxsZWQgd2hlbiBSU0Ffc2lnbigpIGFuZCBSU0FfdmVyaWZ5KCkgYXJlIHVzZWQuIFRoaXMgaXMgdXNlZnVsCiAgICAgaWYgcnNhX3B1Yl9kZWMoKSBhbmQgcnNhX3ByaXZfZW5jKCkgZXF1aXZhbGVudHMgYXJlIG5vdCBhdmFpbGFibGUuCiAgICAgRm9yIHRoaXMgdG8gd29yayBwcm9wZXJseSBSU0FfcHVibGljX2RlY3J5cHQoKSBhbmQgUlNBX3ByaXZhdGVfZW5jcnlwdCgpCiAgICAgc2hvdWxkICpub3QqIGJlIHVzZWQ6IFJTQV9zaWduKCkgYW5kIFJTQV92ZXJpZnkoKSBtdXN0IGJlIHVzZWQgaW5zdGVhZC4KICAgICBUaGlzIG5lY2Vzc2l0YXRlZCB0aGUgc3VwcG9ydCBvZiBhbiBleHRyYSBzaWduYXR1cmUgdHlwZSBOSURfbWQ1X3NoYTEKICAgICBmb3IgU1NMIHNpZ25hdHVyZXMgYW5kIG1vZGlmaWNhdGlvbnMgdG8gdGhlIFNTTCBsaWJyYXJ5IHRvIHVzZSBpdCBpbnN0ZWFkCiAgICAgb2YgY2FsbGluZyBSU0FfcHVibGljX2RlY3J5cHQoKSBhbmQgUlNBX3ByaXZhdGVfZW5jcnlwdCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgLXZlcmlmeSAtQ0FmaWxlIGFuZCAtQ0FwYXRoIG9wdGlvbnMgdG8gdGhlIGNybCBwcm9ncmFtLCB0aGVzZQogICAgIHdpbGwgbG9va3VwIGEgQ1JMIGlzc3VlcnMgY2VydGlmaWNhdGUgYW5kIHZlcmlmeSB0aGUgc2lnbmF0dXJlIGluIGEKICAgICBzaW1pbGFyIHdheSB0byB0aGUgdmVyaWZ5IHByb2dyYW0uIFRpZHkgdXAgdGhlIGNybCBwcm9ncmFtIHNvIGl0CiAgICAgbm8gbG9uZ2VyIGFjY2Vzc2VzIHN0cnVjdHVyZXMgZGlyZWN0bHkuIE1ha2UgdGhlIEFTTjEgQ1JMIHBhcnNpbmcgYSBiaXQKICAgICBsZXNzIHN0cmljdC4gSXQgd2lsbCBub3cgcGVybWl0IENSTCBleHRlbnNpb25zIGV2ZW4gaWYgaXQgaXMgbm90CiAgICAgYSBWMiBDUkw6IHRoaXMgd2lsbCBhbGxvdyBpdCB0byB0b2xlcmF0ZSBzb21lIGJyb2tlbiBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWxpemUgYWxsIG5vbi1hdXRvbWF0aWMgdmFyaWFibGVzIGVhY2ggdGltZSBvbmUgb2YgdGhlIG9wZW5zc2wKICAgICBzdWItcHJvZ3JhbXMgaXMgc3RhcnRlZCAodGhpcyBpcyBuZWNlc3NhcnkgYXMgdGhleSBtYXkgYmUgc3RhcnRlZAogICAgIG11bHRpcGxlIHRpbWVzIGZyb20gdGhlICJPcGVuU1NMPiIgcHJvbXB0KS4KICAgICBbTGVubmFydCBCYW5nLCBCb2RvIE1vZWxsZXJdCgogICopIFByZWxpbWluYXJ5IGNvbXBpbGF0aW9uIG9wdGlvbiBSU0FfTlVMTCB3aGljaCBkaXNhYmxlcyBSU0EgY3J5cHRvIHdpdGhvdXQKICAgICByZW1vdmluZyBhbGwgb3RoZXIgUlNBIGZ1bmN0aW9uYWxpdHkgKHRoaXMgaXMgd2hhdCBOT19SU0EgZG9lcykuIFRoaXMKICAgICBpcyBzbyAoZm9yIGV4YW1wbGUpIHRob3NlIGluIHRoZSBVUyBjYW4gZGlzYWJsZSB0aG9zZSBvcGVyYXRpb25zIGNvdmVyZWQKICAgICBieSB0aGUgUlNBIHBhdGVudCB3aGlsZSBhbGxvd2luZyBzdG9yYWdlIGFuZCBwYXJzaW5nIG9mIFJTQSBrZXlzIGFuZCBSU0EKICAgICBrZXkgZ2VuZXJhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOb24tY29weWluZyBpbnRlcmZhY2UgdG8gQklPIHBhaXJzLgogICAgIChzdGlsbCBsYXJnZWx5IHVudGVzdGVkKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBBTlMxX3RhZzJzdHIoKSB0byBjb252ZXJ0IGFuIEFTTjEgdGFnIHRvIGEgZGVzY3JpcHRpdmUKICAgICBBU0NJSSBzdHJpbmcuIFRoaXMgd2FzIGhhbmRsZWQgaW5kZXBlbmRlbnRseSBpbiB2YXJpb3VzIHBsYWNlcyBiZWZvcmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBVVEY4X2dldGMoKSBhbmQgVVRGOF9wdXRjKCkgdGhhdCBwYXJzZSBhbmQgZ2VuZXJhdGUKICAgICBVVEY4IHN0cmluZ3MgYSBjaGFyYWN0ZXIgYXQgYSB0aW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVzZSBjbGllbnRfdmVyc2lvbiBmcm9tIGNsaWVudCBoZWxsbyB0byBzZWxlY3QgdGhlIHByb3RvY29sCiAgICAgKHMyM19zcnZyLmMpIGFuZCBmb3IgUlNBIGNsaWVudCBrZXkgZXhjaGFuZ2UgdmVyaWZpY2F0aW9uCiAgICAgKHMzX3NydnIuYyksIGFzIHJlcXVpcmVkIGJ5IHRoZSBTU0wgMy4wL1RMUyAxLjAgc3BlY2lmaWNhdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMgdG8gaGFuZGxlIFNQS0FDcywgdGhlc2Ugd2VyZSBwcmV2aW91c2x5CiAgICAgaGFuZGxlZCBieSBwb2tpbmcgcm91bmQgaW4gdGhlIHN0cnVjdHVyZSBpbnRlcm5hbHMuIEFkZGVkIG5ldyBmdW5jdGlvbgogICAgIE5FVFNDQVBFX1NQS0lfcHJpbnQoKSB0byBwcmludCBvdXQgU1BLQUMgYW5kIGEgbmV3IHV0aWxpdHkgJ3Nwa2FjJyB0bwogICAgIHByaW50LCB2ZXJpZnkgYW5kIGdlbmVyYXRlIFNQS0FDcy4gQmFzZWQgb24gYW4gb3JpZ2luYWwgaWRlYSBmcm9tCiAgICAgTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD4gYnV0IGV4dGVuc2l2ZWx5IG1vZGlmaWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJJUEVNRDE2MCBpcyBvcGVyYXRpb25hbCBvbiBhbGwgcGxhdGZvcm1zIGFuZCBpcyBiYWNrIGluICdtYWtlIHRlc3QnLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBbGxvdyB0aGUgY29uZmlnIGZpbGUgZXh0ZW5zaW9uIHNlY3Rpb24gdG8gYmUgb3ZlcndyaXR0ZW4gb24gdGhlCiAgICAgY29tbWFuZCBsaW5lLiBCYXNlZCBvbiBhbiBvcmlnaW5hbCBpZGVhIGZyb20gTWFzc2ltaWxpYW5vIFBhbGEKICAgICA8bWFkd29sZkBjb211bmUubW9kZW5hLml0Pi4gVGhlIG5ldyBvcHRpb24gaXMgY2FsbGVkIC1leHRlbnNpb25zCiAgICAgYW5kIGNhbiBiZSBhcHBsaWVkIHRvIGNhLCByZXEgYW5kIHg1MDkuIEFsc28gLXJlcWV4dHMgdG8gb3ZlcnJpZGUKICAgICB0aGUgcmVxdWVzdCBleHRlbnNpb25zIGluIHJlcSBhbmQgLWNybGV4dHMgdG8gb3ZlcnJpZGUgdGhlIGNybCBleHRlbnNpb25zCiAgICAgaW4gY2EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBmZWF0dXJlIHRvIHRoZSBTUEtBQyBoYW5kbGluZyBpbiBjYS4gIE5vdyB5b3UgY2FuIGluY2x1ZGUKICAgICB0aGUgc2FtZSBmaWVsZCBtdWx0aXBsZSB0aW1lcyBieSBwcmVjZWRpbmcgaXQgYnkgIlhYWFguIiBmb3IgZXhhbXBsZToKICAgICAxLk9VPSJVbml0IG5hbWUgMSIKICAgICAyLk9VPSJVbml0IG5hbWUgMiIKICAgICB0aGlzIGlzIHRoZSBzYW1lIHN5bnRheCBhcyB1c2VkIGluIHRoZSByZXEgY29uZmlnIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgY2VydGlmaWNhdGUgZXh0ZW5zaW9ucyB0byBiZSBhZGRlZCB0byBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4gVGhlc2UKICAgICBhcmUgc3BlY2lmaWVkIGluIGEgJ3JlcV9leHRlbnNpb25zJyBvcHRpb24gb2YgdGhlIHJlcSBzZWN0aW9uIG9mIHRoZQogICAgIGNvbmZpZyBmaWxlLiBUaGV5IGNhbiBiZSBwcmludGVkIG91dCB3aXRoIHRoZSAtdGV4dCBvcHRpb24gdG8gcmVxIGJ1dAogICAgIGFyZSBvdGhlcndpc2UgaWdub3JlZCBhdCBwcmVzZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBhIGhvcnJpYmxlIGJ1ZyBpbiBlbmNfcmVhZCgpIGluIGNyeXB0by9ldnAvYmlvX2VuYy5jOiBpZiB0aGUgZmlyc3QKICAgICBkYXRhIHJlYWQgY29uc2lzdHMgb2Ygb25seSB0aGUgZmluYWwgYmxvY2sgaXQgd291bGQgbm90IGRlY3J5cHRlZCBiZWNhdXNlCiAgICAgRVZQX0NpcGhlclVwZGF0ZSgpIHdvdWxkIGNvcnJlY3RseSByZXBvcnQgemVybyBieXRlcyBoYWQgYmVlbiBkZWNyeXB0ZWQuCiAgICAgQSBtaXNwbGFjZWQgJ2JyZWFrJyBhbHNvIG1lYW50IHRoZSBkZWNyeXB0ZWQgZmluYWwgYmxvY2sgbWlnaHQgbm90IGJlCiAgICAgY29waWVkIHVudGlsIHRoZSBuZXh0IHJlYWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBESF9NRVRIT0QuIEFnYWluIGJhc2VkIG9uIFJTQV9NRVRIT0QuIEFsc28gYWRkZWQKICAgICBhIGZldyBleHRyYSBwYXJhbWV0ZXJzIHRvIHRoZSBESCBzdHJ1Y3R1cmU6IHRoZXNlIHdpbGwgYmUgdXNlZnVsIGlmCiAgICAgZm9yIGV4YW1wbGUgd2Ugd2FudCB0aGUgdmFsdWUgb2YgJ3EnIG9yIGltcGxlbWVudCBYOS40MiBESC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIERTQV9NRVRIT0QuIFRoaXMgaXMgYmFzZWQgb24gdGhlIFJTQV9NRVRIT0QgYW5kCiAgICAgcHJvdmlkZXMgaG9va3MgdGhhdCBhbGxvdyB0aGUgZGVmYXVsdCBEU0EgZnVuY3Rpb25zIG9yIGZ1bmN0aW9ucyBvbiBhCiAgICAgInBlciBrZXkiIGJhc2lzIHRvIGJlIHJlcGxhY2VkLiBUaGlzIGFsbG93cyBoYXJkd2FyZSBhY2NlbGVyYXRpb24gYW5kCiAgICAgaGFyZHdhcmUga2V5IHN0b3JhZ2UgdG8gYmUgaGFuZGxlZCB3aXRob3V0IG1ham9yIG1vZGlmaWNhdGlvbiB0byB0aGUKICAgICBsaWJyYXJ5LiBBbHNvIGFkZGVkIGxvdyBsZXZlbCBtb2RleHAgaG9va3MgYW5kIENSWVBUT19FWCBzdHJ1Y3R1cmUgYW5kIAogICAgIGFzc29jaWF0ZWQgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIG5ldyBmbGFnIHRvIG1lbW9yeSBCSU9zLCBCSU9fRkxBR19NRU1fUkRPTkxZLiBUaGlzIG1hcmtzIHRoZSBCSU8KICAgICBhcyAicmVhZCBvbmx5IjogaXQgY2FuJ3QgYmUgd3JpdHRlbiB0byBhbmQgdGhlIGJ1ZmZlciBpdCBwb2ludHMgdG8gd2lsbAogICAgIG5vdCBiZSBmcmVlZC4gUmVhZGluZyBmcm9tIGEgcmVhZCBvbmx5IEJJTyBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IHRoYW4KICAgICBhIG5vcm1hbCBtZW1vcnkgQklPLiBUaGlzIHdhcyBhZGRlZCBiZWNhdXNlIHRoZXJlIGFyZSBzZXZlcmFsIHRpbWVzIHdoZW4KICAgICBhbiBhcmVhIG9mIG1lbW9yeSBuZWVkcyB0byBiZSByZWFkIGZyb20gYSBCSU8uIFRoZSBwcmV2aW91cyBtZXRob2Qgd2FzCiAgICAgdG8gY3JlYXRlIGEgbWVtb3J5IEJJTyBhbmQgd3JpdGUgdGhlIGRhdGEgdG8gaXQsIHRoaXMgcmVzdWx0cyBpbiB0d28KICAgICBjb3BpZXMgb2YgdGhlIGRhdGEgYW5kIGFuIE8obl4yKSByZWFkaW5nIGFsZ29yaXRobS4gVGhlcmUgaXMgYSBuZXcKICAgICBmdW5jdGlvbiBCSU9fbmV3X21lbV9idWYoKSB3aGljaCBjcmVhdGVzIGEgcmVhZCBvbmx5IG1lbW9yeSBCSU8gZnJvbQogICAgIGFuIGFyZWEgb2YgbWVtb3J5LiBBbHNvIG1vZGlmaWVkIHRoZSBQS0NTIzcgcm91dGluZXMgdG8gdXNlIHJlYWQgb25seQogICAgIG1lbW9yeSBCSU9zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJ1Z2ZpeDogc3NsMjNfZ2V0X2NsaWVudF9oZWxsbyBkaWQgbm90IHdvcmsgcHJvcGVybHkgd2hlbiBjYWxsZWQgaW4KICAgICBzdGF0ZSBTU0wyM19TVF9TUl9DTE5UX0hFTExPX0IsIGkuZS4gd2hlbiB0aGUgZmlyc3QgNyBieXRlcyBvZgogICAgIGEgU1NMdjItY29tcGF0aWJsZSBjbGllbnQgaGVsbG8gZm9yIFNTTHYzIG9yIFRMU3YxIGNvdWxkIGJlIHJlYWQsCiAgICAgYnV0IGEgcmV0cnkgY29uZGl0aW9uIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlYWQgdGhlIHJlc3QuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVGhlIFBLQ1M3X0VOQ19DT05URU5UX25ldygpIGZ1bmN0aW9uIHdhcyBzZXR0aW5nIHRoZSBjb250ZW50IHR5cGUgYXMKICAgICBOSURfcGtjczdfZW5jcnlwdGVkIGJ5IGRlZmF1bHQ6IHRoaXMgd2FzIHdyb25nIHNpbmNlIHRoaXMgc2hvdWxkIGFsbW9zdAogICAgIGFsd2F5cyBiZSBOSURfcGtjczdfZGF0YS4gQWxzbyBtb2RpZmllZCB0aGUgUEtDUzdfc2V0X3R5cGUoKSB0byBoYW5kbGUKICAgICB0aGUgZW5jcnlwdGVkIGRhdGEgdHlwZTogdGhpcyBpcyBhIG1vcmUgc2Vuc2libGUgcGxhY2UgdG8gcHV0IGl0IGFuZCBpdAogICAgIGFsbG93cyB0aGUgUEtDUyMxMiBjb2RlIHRvIGJlIHRpZGllZCB1cCB0aGF0IGR1cGxpY2F0ZWQgdGhpcwogICAgIGZ1bmN0aW9uYWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlZCBvYmpfZGF0LnBsIHNjcmlwdCBzbyBpdCB0YWtlcyBpdHMgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBvbgogICAgIHRoZSBjb21tYW5kIGxpbmUuIFRoaXMgc2hvdWxkIGF2b2lkIHNoZWxsIGVzY2FwZSByZWRpcmVjdGlvbiBwcm9ibGVtcwogICAgIHVuZGVyIFdpbjMyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgY2VydGlmaWNhdGUgZXh0ZW5zaW9uIHJlcXVlc3RzLCB0aGVzZSBhcmUgaW5jbHVkZWQKICAgICBpbiB0aGluZ3MgbGlrZSBYZW5yb2xsIGNlcnRpZmljYXRlIHJlcXVlc3RzLiBJbmNsdWRlZCBmdW5jdGlvbnMgdG8gYWxsb3cKICAgICBleHRlbnNpb25zIHRvIGJlIG9idGFpbmVkIGFuZCBhZGRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSAtY3JsZiBvcHRpb24gdG8gc19jbGllbnQgYW5kIHNfc2VydmVyIGZvciBzZW5kaW5nIG5ld2xpbmVzIGFzCiAgICAgQ1JMRiAoYXMgcmVxdWlyZWQgYnkgbWFueSBwcm90b2NvbHMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4zYSBhbmQgMC45LjQgIFswOSBBdWcgMTk5OV0KICAKICAqKSBJbnN0YWxsIGxpYlJTQWdsdWUuYSB3aGVuIE9wZW5TU0wgaXMgYnVpbHQgd2l0aCBSU0FyZWYuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEEgZmV3IG1vcmUgYGAjaWZuZGVmIE5PX0ZQX0FQSSAvICNlbmRpZicnIHBhaXJzIGZvciBjb25zaXN0ZW5jeS4KICAgICBbQW5kcmlqYSBBbnRvbmlqZXZpYyA8VGhlQW50b255MkBiaWdmb290LmNvbT5dCgogICopIEZpeCAtc3RhcnRkYXRlIGFuZCAtZW5kZGF0ZSAod2hpY2ggd2FzIG1pc3NpbmcpIGFyZ3VtZW50cyB0byAnY2EnCiAgICAgcHJvZ3JhbS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gRFNBX2R1cF9ESCwgd2hpY2ggZHVwbGljYXRlcyBEU0EgcGFyYW1ldGVycy9rZXlzIGFzCiAgICAgREggcGFyYW1ldGVycy9rZXlzIChxIGlzIGxvc3QgZHVyaW5nIHRoYXQgY29udmVyc2lvbiwgYnV0IHRoZSByZXN1bHRpbmcKICAgICBESCBwYXJhbWV0ZXJzIGNvbnRhaW4gaXRzIGxlbmd0aCkuCgogICAgIEZvciAxMDI0LWJpdCBwLCBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBmb2xsb3dlZCBieSBEU0FfZHVwX0RIIGlzCiAgICAgbXVjaCBmYXN0ZXIgdGhhbiBESF9nZW5lcmF0ZV9wYXJhbWV0ZXJzICh3aGljaCBjcmVhdGVzIHBhcmFtZXRlcnMKICAgICB3aGVyZSBwID0gMipxICsgMSksIGFuZCBhbHNvIHRoZSBzbWFsbGVyIHEgbWFrZXMgREggY29tcHV0YXRpb25zCiAgICAgbXVjaCBtb3JlIGVmZmljaWVudCAoMTYwLWJpdCBleHBvbmVudGlhdGlvbiBpbnN0ZWFkIG9mIDEwMjQtYml0CiAgICAgZXhwb25lbnRpYXRpb24pOyBzbyB0aGlzIHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gc3VwcG9ydCBESEUKICAgICBjaXBoZXJzdWl0ZXMgaW4gU1NML1RMUyBzZXJ2ZXJzIChzZWUgc3NsL3NzbHRlc3QuYykuICBJdCBpcyBvZgogICAgIHV0dGVyIGltcG9ydGFuY2UgdG8gdXNlCiAgICAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoc19jdHgsIFNTTF9PUF9TSU5HTEVfREhfVVNFKTsKICAgICBvcgogICAgICAgICBTU0xfc2V0X29wdGlvbnMoc19jdHgsIFNTTF9PUF9TSU5HTEVfREhfVVNFKTsKICAgICB3aGVuIHN1Y2ggREggcGFyYW1ldGVycyBhcmUgdXNlZCwgYmVjYXVzZSBvdGhlcndpc2Ugc21hbGwgc3ViZ3JvdXAKICAgICBhdHRhY2tzIG1heSBiZWNvbWUgcG9zc2libGUhCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQXZvaWQgbWVtb3J5IGxlYWsgaW4gaTJkX0RIcGFyYW1zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFsbG93IHRoZSAtayBvcHRpb24gdG8gYmUgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgZW5jIHByb2dyYW06CiAgICAgdGhpcyBhbGxvd3MgdGhlIHNhbWUgZW5jcnlwdGVkIG1lc3NhZ2UgdG8gYmUgcmVhZCBieSBtdWx0aXBsZSByZWNpcGllbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBPQkpfb2JqMnR4dChidWYsIGJ1Zl9sZW4sIGEsIG5vX25hbWUpLCB0aGlzIGNvbnZlcnRzCiAgICAgYW4gQVNOMV9PQkpFQ1QgdG8gYSB0ZXh0IHN0cmluZy4gSWYgdGhlICJub19uYW1lIiBwYXJhbWV0ZXIgaXMgc2V0IHRoZW4KICAgICBpdCB3aWxsIGFsd2F5cyB1c2UgdGhlIG51bWVyaWNhbCBmb3JtIG9mIHRoZSBPSUQsIGV2ZW4gaWYgaXQgaGFzIGEgc2hvcnQKICAgICBvciBsb25nIG5hbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgYW4gZXh0cmEgUlNBIGZsYWc6IFJTQV9GTEFHX0VYVF9QS0VZLiBQcmV2aW91c2x5IHRoZSByc2FfbW9kX2V4cAogICAgIG1ldGhvZCBvbmx5IGdvdCBjYWxsZWQgaWYgcCxxLGRtcDEsZG1xMSxpcW1wIGNvbXBvbmVudHMgd2VyZSBwcmVzZW50LAogICAgIG90aGVyd2lzZSBibl9tb2RfZXhwIHdhcyBjYWxsZWQuIEluIHRoZSBjYXNlIG9mIGhhcmR3YXJlIGtleXMgZm9yIGV4YW1wbGUKICAgICBubyBwcml2YXRlIGtleSBjb21wb25lbnRzIG5lZWQgYmUgcHJlc2VudCBhbmQgaXQgbWlnaHQgc3RvcmUgZXh0cmEgZGF0YQogICAgIGluIHRoZSBSU0Egc3RydWN0dXJlLCB3aGljaCBjYW5ub3QgYmUgYWNjZXNzZWQgZnJvbSBibl9tb2RfZXhwLgogICAgIEJ5IHNldHRpbmcgUlNBX0ZMQUdfRVhUX1BLRVkgcnNhX21vZF9leHAgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGZvcgogICAgIHByaXZhdGUga2V5IG9wZXJhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgc3VwcG9ydCBmb3IgU1BBUkMgTGludXguCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIHBlbV9wYXNzd29yZF9jYiBmdW5jdGlvbiB0eXBlIGluY29tcGF0aWJseSBjaGFuZ2VkIGZyb20KICAgICAgICAgIHR5cGVkZWYgaW50IHBlbV9wYXNzd29yZF9jYihjaGFyICpidWYsIGludCBzaXplLCBpbnQgcndmbGFnKTsKICAgICB0bwogICAgICAgICAgLi4uLihjaGFyICpidWYsIGludCBzaXplLCBpbnQgcndmbGFnLCB2b2lkICp1c2VyZGF0YSk7CiAgICAgc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHBhc3MgZGF0YSB0byB0aGVpciBjYWxsYmFja3M6CiAgICAgVGhlIFBFTVtfQVNOMV1fe3JlYWQsd3JpdGV9Li4uIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIG5vdyB0YWtlIGFuCiAgICAgYWRkaXRpb25hbCB2b2lkICogYXJndW1lbnQsIHdoaWNoIGlzIGp1c3QgaGFuZGVkIHRocm91Z2ggd2hlbmV2ZXIKICAgICB0aGUgcGFzc3dvcmQgY2FsbGJhY2sgaXMgY2FsbGVkLgogICAgIFtEYW1pZW4gTWlsbGVyIDxkbWlsbGVyQGlsb2dpYy5jb20uYXU+OyB0aW55IGNoYW5nZXMgYnkgQm9kbyBNb2VsbGVyXQoKICAgICBOZXcgZnVuY3Rpb24gU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEuCgogICAgIENvbXBhdGliaWxpdHkgbm90ZTogQXMgbWFueSBDIGltcGxlbWVudGF0aW9ucyBwdXNoIGZ1bmN0aW9uIGFyZ3VtZW50cwogICAgIG9udG8gdGhlIHN0YWNrIGluIHJldmVyc2Ugb3JkZXIsIHRoZSBuZXcgbGlicmFyeSB2ZXJzaW9uIGlzIGxpa2VseSB0bwogICAgIGludGVyb3BlcmF0ZSB3aXRoIHByb2dyYW1zIHRoYXQgaGF2ZSBiZWVuIGNvbXBpbGVkIHdpdGggdGhlIG9sZAogICAgIHBlbV9wYXNzd29yZF9jYiBkZWZpbml0aW9uIChQRU1fd2hhdGV2ZXIgdGFrZXMgc29tZSBkYXRhIHRoYXQKICAgICBoYXBwZW5zIHRvIGJlIG9uIHRoZSBzdGFjayBhcyBpdHMgbGFzdCBhcmd1bWVudCwgYW5kIHRoZSBjYWxsYmFjawogICAgIGp1c3QgaWdub3JlcyB0aGlzIGdhcmJhZ2UpOyBidXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHdoYXRzb2V2ZXIgdGhhdAogICAgIHRoaXMgd2lsbCB3b3JrLgoKICAqKSBUaGUgLURQTEFURk9STT0iXCIkKFBMQVRGT1JNKVwiIiBkZWZpbml0aW9uIGFuZCB0aGUgc2ltaWxhciAtRENGTEFHUz0uLi4KICAgICAoYm90aCBpbiBjcnlwdG8vTWFrZWZpbGUuc3NsIGZvciB1c2UgYnkgY3J5cHRvL2N2ZXJzaW9uLmMpIGNhdXNlZAogICAgIHByb2JsZW1zIG5vdCBvbmx5IG9uIFdpbmRvd3MsIGJ1dCBhbHNvIG9uIHNvbWUgVW5peCBwbGF0Zm9ybXMuCiAgICAgVG8gYXZvaWQgcHJvYmxlbWF0aWMgY29tbWFuZCBsaW5lcywgdGhlc2UgZGVmaW5pdGlvbnMgYXJlIG5vdyBpbiBhbgogICAgIGF1dG8tZ2VuZXJhdGVkIGZpbGUgY3J5cHRvL2J1aWxkaW5mLmggKGNyZWF0ZWQgYnkgY3J5cHRvL01ha2VmaWxlLnNzbAogICAgIGZvciBzdGFuZGFyZCAibWFrZSIgYnVpbGRzLCBieSB1dGlsL21rMW1mLnBsIGZvciAibWsxbWYiIGJ1aWxkcykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTUlQUyBJSUkvSVYgYXNzZW1ibGVyIG1vZHVsZSBpcyByZWltcGxlbWVudGVkLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBNb3JlIERFUyBsaWJyYXJ5IGNsZWFudXBzOiByZW1vdmUgcmVmZXJlbmNlcyB0byBzcmFuZC9yYW5kIGFuZAogICAgIGRlbGV0ZSBhbiB1bnVzZWQgZmlsZS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHRoZSB0aGUgZnJlZSBOZXR3aWRlIGFzc2VtYmxlciAoTkFTTSkgdW5kZXIgV2luMzIsCiAgICAgc2luY2Ugbm90IG1hbnkgcGVvcGxlIGhhdmUgTUFTTSAobWwpIGFuZCBpdCBjYW4gYmUgaGFyZCB0byBvYnRhaW4uCiAgICAgVGhpcyBpcyBjdXJyZW50bHkgZXhwZXJpbWVudGFsIGJ1dCBpdCBzZWVtcyB0byB3b3JrIE9LIGFuZCBwYXNzIGFsbAogICAgIHRoZSB0ZXN0cy4gQ2hlY2sgb3V0IElOU1RBTEwuVzMyIGZvciBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBtZW1vcnkgbGVha3MgaW4gczNfY2xudC5jOiBBbGwgbm9uLWFub255bW91cyBTU0wzL1RMUzEgY29ubmVjdGlvbnMKICAgICB3aXRob3V0IHRlbXBvcmFyeSBrZXlzIGtlcHQgYW4gZXh0cmEgY29weSBvZiB0aGUgc2VydmVyIGtleSwKICAgICBhbmQgY29ubmVjdGlvbnMgd2l0aCB0ZW1wb3Jhcnkga2V5cyBkaWQgbm90IGZyZWUgZXZlcnl0aGluZyBpbiBjYXNlCiAgICAgb2YgYW4gZXJyb3IuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFJTQV9jaGVja19rZXkgYW5kIG5ldyBvcGVuc3NsIHJzYSBvcHRpb24gLWNoZWNrCiAgICAgZm9yIHZlcmlmeWluZyB0aGUgY29uc2lzdGVuY3kgb2YgUlNBIGtleXMuCiAgICAgW1VsZiBNb2VsbGVyLCBCb2RvIE1vZWxsZXJdCgogICopIFZhcmlvdXMgY2hhbmdlcyB0byBtYWtlIFdpbjMyIGNvbXBpbGUgd29yazogCiAgICAgMS4gQ2FzdHMgdG8gYXZvaWQgImxvc3Mgb2YgZGF0YSIgd2FybmluZ3MgaW4gcDVfY3JwdDIuYwogICAgIDIuIENoYW5nZSB1bnNpZ25lZCBpbnQgdG8gaW50IGluIGJfZHVtcC5jIHRvIGF2b2lkICJzaWduZWQvdW5zaWduZWQKICAgICAgICBjb21wYXJpc29uIiB3YXJuaW5ncy4KICAgICAzLiBBZGQgc2tfPFRZUEU+X3NvcnQgdG8gREVGIGZpbGUgZ2VuZXJhdG9yIGFuZCBkbyBtYWtlIHVwZGF0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBkZWJ1Z2dpbmcgb3B0aW9uIHRvIFBLQ1MjNSB2MiBrZXkgZ2VuZXJhdGlvbiBmdW5jdGlvbjogd2hlbgogICAgIHlvdSAjZGVmaW5lIERFQlVHX1BLQ1M1VjIgcGFzc3dvcmRzLCBzYWx0cywgaXRlcmF0aW9uIGNvdW50cyBhbmQKICAgICBkZXJpdmVkIGtleXMgYXJlIHByaW50ZWQgdG8gc3RkZXJyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvcHkgdGhlIGZsYWdzIGluIEFTTjFfU1RSSU5HX2R1cCgpLgogICAgIFtSb21hbiBFLiBQYXZsb3YgPHByZUBtby5tc2sucnU+XQoKICAqKSBUaGUgeDUwOSBhcHBsaWNhdGlvbiBtaXNoYW5kbGVkIHNpZ25pbmcgcmVxdWVzdHMgY29udGFpbmluZyBEU0EKICAgICBrZXlzIHdoZW4gdGhlIHNpZ25pbmcga2V5IHdhcyBhbHNvIERTQSBhbmQgdGhlIHBhcmFtZXRlcnMgZGlkbid0IG1hdGNoLgoKICAgICBJdCB3YXMgc3VwcG9zZWQgdG8gb21pdCB0aGUgcGFyYW1ldGVycyB3aGVuIHRoZXkgbWF0Y2hlZCB0aGUgc2lnbmluZyBrZXk6CiAgICAgdGhlIHZlcmlmeWluZyBzb2Z0d2FyZSB3YXMgdGhlbiBzdXBwb3NlZCB0byBhdXRvbWF0aWNhbGx5IHVzZSB0aGUgQ0EncwogICAgIHBhcmFtZXRlcnMgaWYgdGhleSB3ZXJlIGFic2VudCBmcm9tIHRoZSBlbmQgdXNlciBjZXJ0aWZpY2F0ZS4KCiAgICAgT21pdHRpbmcgcGFyYW1ldGVycyBpcyBubyBsb25nZXIgcmVjb21tZW5kZWQuIFRoZSB0ZXN0IHdhcyBhbHNvCiAgICAgdGhlIHdyb25nIHdheSByb3VuZCEgVGhpcyB3YXMgcHJvYmFibHkgZHVlIHRvIHVudXN1YWwgYmVoYXZpb3VyIGluCiAgICAgRVZQX2NtcF9wYXJhbWV0ZXJzKCkgd2hpY2ggcmV0dXJucyAxIGlmIHRoZSBwYXJhbWV0ZXJzIG1hdGNoLiAKICAgICBUaGlzIG1lYW50IHRoYXQgcGFyYW1ldGVycyB3ZXJlIG9taXR0ZWQgd2hlbiB0aGV5ICpkaWRuJ3QqIG1hdGNoIGFuZAogICAgIHRoZSBjZXJ0aWZpY2F0ZSB3YXMgdXNlbGVzcy4gQ2VydGlmaWNhdGVzIHNpZ25lZCB3aXRoICdjYScgZGlkbid0IGhhdmUKICAgICB0aGlzIGJ1Zy4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBEb3VnIEVyaWNrc29uIDxEb3VnLkVyaWNrc29uQFBhcnQuTkVUPl0KCiAgKikgTWVtb3J5IGxlYWsgY2hlY2tpbmcgKC1EQ1JZUFRPX01ERUJVRykgaGFkIHNvbWUgcHJvYmxlbXMuCiAgICAgVGhlIGludGVyZmFjZSBpcyBhcyBmb2xsb3dzOgogICAgIEFwcGxpY2F0aW9ucyBjYW4gdXNlCiAgICAgICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX09OKSBha2EgTWVtQ2hlY2tfc3RhcnQoKSwKICAgICAgICAgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfT0ZGKSBha2EgTWVtQ2hlY2tfc3RvcCgpOwogICAgICJvZmYiIGlzIG5vdyB0aGUgZGVmYXVsdC4KICAgICBUaGUgbGlicmFyeSBpbnRlcm5hbGx5IHVzZXMKICAgICAgICAgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfRElTQUJMRSkgYWthIE1lbUNoZWNrX29mZigpLAogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19FTkFCTEUpIGFrYSBNZW1DaGVja19vbigpCiAgICAgdG8gZGlzYWJsZSBtZW1vcnktY2hlY2tpbmcgdGVtcG9yYXJpbHkuCgogICAgIFNvbWUgaW5jb25zaXN0ZW50IHN0YXRlcyB0aGF0IHByZXZpb3VzbHkgd2VyZSBwb3NzaWJsZSAoYW5kIHdlcmUKICAgICBldmVuIHRoZSBkZWZhdWx0KSBhcmUgbm93IGF2b2lkZWQuCgogICAgIC1EQ1JZUFRPX01ERUJVR19USU1FIGlzIG5ldyBhbmQgYWRkaXRpb25hbGx5IHN0b3JlcyB0aGUgY3VycmVudCB0aW1lCiAgICAgd2l0aCBlYWNoIG1lbW9yeSBjaHVuayBhbGxvY2F0ZWQ7IHRoaXMgaXMgb2NjYXNpb25hbGx5IG1vcmUgaGVscGZ1bAogICAgIHRoYW4ganVzdCBoYXZpbmcgYSBjb3VudGVyLgoKICAgICAtRENSWVBUT19NREVCVUdfVEhSRUFEIGlzIGFsc28gbmV3IGFuZCBhZGRzIHRoZSB0aHJlYWQgSUQuCgogICAgIC1EQ1JZUFRPX01ERUJVR19BTEwgZW5hYmxlcyBhbGwgb2YgdGhlIGFib3ZlLCBwbHVzIGFueSBmdXR1cmUKICAgICBleHRlbnNpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEludHJvZHVjZSAibW9kZSIgZm9yIFNTTCBzdHJ1Y3R1cmVzICh3aXRoIGRlZmF1bHRzIGluIFNTTF9DVFgpLAogICAgIHdoaWNoIGxhcmdlbHkgcGFyYWxsZWxzICJvcHRpb25zIiwgYnV0IGlzIGZvciBjaGFuZ2luZyBBUEkgYmVoYXZpb3VyLAogICAgIHdoZXJlYXMgIm9wdGlvbnMiIGFyZSBhYm91dCBwcm90b2NvbCBiZWhhdmlvdXIuCiAgICAgSW5pdGlhbCAibW9kZSIgZmxhZ3MgYXJlOgoKICAgICBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSAgIEFsbG93IFNTTF93cml0ZSB0byByZXBvcnQgc3VjY2VzcyB3aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHNpbmdsZSByZWNvcmQgaGFzIGJlZW4gd3JpdHRlbi4KICAgICBTU0xfTU9ERV9BQ0NFUFRfTU9WSU5HX1dSSVRFX0JVRkZFUiAgRG9uJ3QgaW5zaXN0IHRoYXQgU1NMX3dyaXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzIHVzZSB0aGUgc2FtZSBidWZmZXIgbG9jYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQnV0IGFsbCBvZiB0aGUgY29udGVudHMgbXVzdCBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkISkKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXg6IFNTTF9zZXRfb3B0aW9ucyBpZ25vcmVkIGl0cyBwYXJhbWV0ZXIsIG9ubHkgU1NMX0NUWF9zZXRfb3B0aW9ucwogICAgIHdvcmtlZC4KCiAgKikgRml4IHByb2JsZW1zIHdpdGggbm8taG1hYyBldGMuCiAgICAgW1VsZiBN9mxsZXIsIHBvaW50ZWQgb3V0IGJ5IEJyaWFuIFdlbGxpbmd0b24gPGJ3ZWxsaW5nQHRpc2xhYnMuY29tPl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKCksIFJTQV9zZXRfbWV0aG9kKCkgYW5kCiAgICAgUlNBX2dldF9tZXRob2QoKS4gVGhlc2UgYWxsb3dzIHJlcGxhY2VtZW50IG9mIFJTQV9NRVRIT0RzIHdpdGhvdXQgaGF2aW5nCiAgICAgdG8gbWVzcyBhcm91bmQgd2l0aCB0aGUgaW50ZXJuYWxzIG9mIGFuIFJTQSBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IG1lbW9yeSBsZWFrcyBpbiBEU0FfZG9fc2lnbiBhbmQgRFNBX2lzX3ByaW1lLgogICAgIEFsc28gcmVhbGx5IGVuYWJsZSBtZW1vcnkgbGVhayBjaGVja3MgaW4gb3BlbnNzbC5jIGFuZCBpbiBzb21lCiAgICAgdGVzdCBwcm9ncmFtcy4KICAgICBbQ2hhZCBDLiBNdWxsaWdhbiwgQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggYSBidWcgaW4gZDJpX0FTTjFfSU5URUdFUigpIGFuZCBpMmRfQVNOMV9JTlRFR0VSKCkgd2hpY2ggY2FuIG1lc3MKICAgICB1cCB0aGUgbGVuZ3RoIG9mIG5lZ2F0aXZlIGludGVnZXJzLiBUaGlzIGhhcyBub3cgYmVlbiBzaW1wbGlmaWVkIHRvIGp1c3QKICAgICBzdG9yZSB0aGUgbGVuZ3RoIHdoZW4gaXQgaXMgZmlyc3QgZGV0ZXJtaW5lZCBhbmQgdXNlIGl0IGxhdGVyLCByYXRoZXIKICAgICB0aGFuIHRyeWluZyB0byBrZWVwIHRyYWNrIG9mIHdoZXJlIGRhdGEgaXMgY29waWVkIGFuZCB1cGRhdGluZyBpdCB0bwogICAgIHBvaW50IHRvIHRoZSBlbmQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgQnJpZW4gV2hlZWxlcgogICAgICA8YndoZWVsZXJAYXV0aGVudGljYS1zZWN1cml0eS5jb20+XQoKICAqKSBBZGQgYSBuZXcgZnVuY3Rpb24gUEtDUzdfc2lnbmF0dXJlVmVyaWZ5LiBUaGlzIGFsbG93cyB0aGUgdmVyaWZpY2F0aW9uCiAgICAgb2YgYSBQS0NTIzcgc2lnbmF0dXJlIGJ1dCB3aXRoIHRoZSBzaWduaW5nIGNlcnRpZmljYXRlIHBhc3NlZCB0byB0aGUKICAgICBmdW5jdGlvbiBpdHNlbGYuIFRoaXMgY29udHJhc3RzIHdpdGggUEtDUzdfZGF0YVZlcmlmeSB3aGljaCBhc3N1bWVzIHRoZQogICAgIGNlcnRpZmljYXRlIGlzIHByZXNlbnQgaW4gdGhlIFBLQ1MjNyBzdHJ1Y3R1cmUuIFRoaXMgaXNuJ3QgYWx3YXlzIHRoZQogICAgIGNhc2U6IGNlcnRpZmljYXRlcyBjYW4gYmUgb21pdHRlZCBmcm9tIGEgUEtDUyM3IHN0cnVjdHVyZSBhbmQgYmUKICAgICBkaXN0cmlidXRlZCBieSAib3V0IG9mIGJhbmQiIG1lYW5zIChzdWNoIGFzIGEgY2VydGlmaWNhdGUgZGF0YWJhc2UpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbXBsZXRlIHRoZSBQRU1fKiBtYWNyb3Mgd2l0aCBERUNMQVJFX1BFTSB2ZXJzaW9ucyB0byByZXBsYWNlIHRoZQogICAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgaW4gcGVtLmgsIGFsc28gY2hhbmdlIHV0aWwvbWtkZWYucGwgdG8gYWRkIHRoZQogICAgIG5lY2Vzc2FyeSBmdW5jdGlvbiBuYW1lcy4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgbWsxbWYucGwgKHVzZWQgYnkgV2luZG93cyBidWlsZHMpIGRpZCBub3QgcHJvcGVybHkgcmVhZCB0aGUKICAgICBvcHRpb25zIHNldCBieSBDb25maWd1cmUgaW4gdGhlIHRvcCBsZXZlbCBNYWtlZmlsZSwgYW5kIENvbmZpZ3VyZQogICAgIHdhcyBub3QgZXZlbiBhYmxlIHRvIHdyaXRlIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGNvcnJlY3RseS4KICAgICBGaXhlZCwgbm93ICJuby1pZGVhIG5vLXJjNSAtRENSWVBUT19NREVCVUciIGV0Yy4gd29ya3MgYXMgaW50ZW5kZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBDT05GX2xvYWRfYmlvKCkgYW5kIENPTkZfbG9hZF9mcCgpIHRvIGFsbG93IGEgY29uZmlnCiAgICAgZmlsZSB0byBiZSBsb2FkZWQgZnJvbSBhIEJJTyBvciBGSUxFIHBvaW50ZXIuIFRoZSBCSU8gdmVyc2lvbiB3aWxsCiAgICAgZm9yIGV4YW1wbGUgYWxsb3cgbWVtb3J5IEJJT3MgdG8gY29udGFpbiBjb25maWcgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gIkNSWVBUT19udW1fbG9ja3MiIHRoYXQgcmV0dXJucyBDUllQVE9fTlVNX0xPQ0tTLgogICAgIFdob2V2ZXIgaG9wZXMgdG8gYWNoaWV2ZSBzaGFyZWQtbGlicmFyeSBjb21wYXRpYmlsaXR5IGFjcm9zcyB2ZXJzaW9ucwogICAgIG11c3QgdXNlIHRoaXMsIG5vdCB0aGUgY29tcGlsZS10aW1lIG1hY3JvLgogICAgIChFeGVyY2lzZSAwLjkuNDogV2hpY2ggaXMgdGhlIG1pbmltdW0gbGlicmFyeSB2ZXJzaW9uIHJlcXVpcmVkIGJ5CiAgICAgc3VjaCBwcm9ncmFtcz8pCiAgICAgTm90ZTogQWxsIHRoaXMgYXBwbGllcyBvbmx5IHRvIG11bHRpLXRocmVhZGVkIHByb2dyYW1zLCBvdGhlcnMgZG9uJ3QKICAgICBuZWVkIGxvY2tzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBtaXNzaW5nIGNhc2UgdG8gczNfY2xudC5jIHN0YXRlIG1hY2hpbmUgLS0gb25lIG9mIHRoZSBuZXcgU1NMIHRlc3RzCiAgICAgdGhyb3VnaCBhIEJJTyBwYWlyIHRyaWdnZXJlZCB0aGUgZGVmYXVsdCBjYXNlLCBpLmUuCiAgICAgU1NMZXJyKC4uLixTU0xfUl9VTktOT1dOX1NUQVRFKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgIkJJTyBwYWlyIiBjb25jZXB0IChjcnlwdG8vYmlvL2Jzc19iaW8uYykgc28gdGhhdCBhcHBsaWNhdGlvbnMKICAgICBjYW4gdXNlIHRoZSBTU0wgbGlicmFyeSBldmVuIGlmIG5vbmUgb2YgdGhlIHNwZWNpZmljIEJJT3MgaXMKICAgICBhcHByb3ByaWF0ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggYSBidWcgaW4gaTJkX0RTQVB1YmxpY0tleSgpIHdoaWNoIG1lYW50IGl0IHJldHVybmVkIHRoZSB3cm9uZyB2YWx1ZQogICAgIGZvciB0aGUgZW5jb2RlZCBsZW5ndGguCiAgICAgW0plb24gS3lvdW5nSG8gPGtoamVvbkBzZHMuc2Ftc3VuZy5jby5rcj5dCgogICopIEFkZCBpbml0aWFsIGRvY3VtZW50YXRpb24gb2YgdGhlIFg1MDlWMyBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3IHBhaXIgb2YgZnVuY3Rpb25zIFBFTV93cml0ZV9QS0NTOFByaXZhdGVLZXkoKSBhbmQgCiAgICAgUEVNX3dyaXRlX2Jpb19QS0NTOFByaXZhdGVLZXkoKSB0aGF0IGFyZSBlcXVpdmFsZW50IHRvCiAgICAgUEVNX3dyaXRlX1ByaXZhdGVLZXkoKSBhbmQgUEVNX3dyaXRlX2Jpb19Qcml2YXRlS2V5KCkgYnV0IHVzZSB0aGUgbW9yZQogICAgIHNlY3VyZSBQS0NTIzggcHJpdmF0ZSBrZXkgZm9ybWF0IHdpdGggYSBoaWdoIGl0ZXJhdGlvbiBjb3VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZGV0ZXJtaW5hdGlvbiBvZiBQZXJsIGludGVycHJldGVyOiBBIHBlcmwgb3IgcGVybDUKICAgICBfZGlyZWN0b3J5XyBpbiAkUEFUSCB3YXMgYWxzbyBhY2NlcHRlZCBhcyB0aGUgaW50ZXJwcmV0ZXIuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBkZW1vcy9zaWduL3NpZ24uYzogd2VsbCB0aGVyZSB3YXNuJ3QgYW55dGhpbmcgc3RyaWN0bHkgc3BlYWtpbmcKICAgICB3cm9uZyB3aXRoIGl0IGJ1dCBpdCB3YXMgdmVyeSBvbGQgYW5kIGRpZCB0aGluZ3MgbGlrZSBjYWxsaW5nCiAgICAgUEVNX0FTTjFfcmVhZCgpIGRpcmVjdGx5IGFuZCB1c2VkIE1ENSBmb3IgdGhlIGhhc2ggbm90IHRvIG1lbnRpb24gc29tZQogICAgIHVudXN1YWwgZm9ybWF0dGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZGVtb3Mvc2VsZnNpZ24uYzogaXQgdXNlZCBvYnNvbGV0ZSBhbmQgZGVsZXRlZCBmdW5jdGlvbnMsIGNoYW5nZWQKICAgICB0byB1c2UgdGhlIG5ldyBleHRlbnNpb24gY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXBsZW1lbnQgdGhlIFBFTV9yZWFkL1BFTV93cml0ZSBmdW5jdGlvbnMgaW4gY3J5cHRvL3BlbS9wZW1fYWxsLmMKICAgICB3aXRoIG1hY3Jvcy4gVGhpcyBzaG91bGQgbWFrZSBpdCBlYXNpZXIgdG8gY2hhbmdlIHRoZWlyIGZvcm0sIGFkZCBleHRyYQogICAgIGFyZ3VtZW50cyBldGMuIEZpeCBhIGZldyBQRU0gcHJvdG90eXBlcyB3aGljaCBkaWRuJ3QgaGF2ZSBjaXBoZXIgYXMgYQogICAgIGNvbnN0YW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0byBjb25maWd1cmF0aW9uIHRhYmxlIGEgbmV3IGVudHJ5IHRoYXQgY2FuIHNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUKICAgICBuYW1lIGZvciB1bmlzdGQuaCAoZm9yIHByZS1QT1NJWCBzeXN0ZW1zKTsgd2UgbmVlZCB0aGlzIGZvciBOZVhUc3RlcCwKICAgICBhY2NvcmRpbmcgdG8gTWFyayBDcmlzcGluIDxNUkNAUGFuZGEuQ09NPi4KICAgICBbQm9kbyBNb2VsbGVyXQoKI2lmIDAKICAqKSBERVMgQ0JDIGRpZCBub3QgdXBkYXRlIHRoZSBJVi4gV2VpcmQuCiAgICAgW0JlbiBMYXVyaWVdCiNlbHNlCiAgICAgZGVzX2NiY19lbmNyeXB0IGRvZXMgbm90IHVwZGF0ZSB0aGUgSVYsIGJ1dCBkZXNfbmNiY19lbmNyeXB0IGRvZXMuCiAgICAgQ2hhbmdpbmcgdGhlIGJlaGF2aW91ciBvZiB0aGUgZm9ybWVyIG1pZ2h0IGJyZWFrIGV4aXN0aW5nIHByb2dyYW1zIC0tCiAgICAgd2hlcmUgSVYgdXBkYXRpbmcgaXMgbmVlZGVkLCBkZXNfbmNiY19lbmNyeXB0IGNhbiBiZSB1c2VkLgojZW5kaWYKCiAgKikgV2hlbiBibnRlc3QgaXMgcnVuIGZyb20gIm1ha2UgdGVzdCIgaXQgZHJpdmVzIGJjIHRvIGNoZWNrIGl0cwogICAgIGNhbGN1bGF0aW9ucywgYXMgd2VsbCBhcyBpbnRlcm5hbGx5IGNoZWNraW5nIHRoZW0uIElmIGFuIGludGVybmFsIGNoZWNrCiAgICAgZmFpbHMsIGl0IG5lZWRzIHRvIGNhdXNlIGJjIHRvIGdpdmUgYSBub24temVybyByZXN1bHQgb3IgbWFrZSB0ZXN0IGNhcnJpZXMKICAgICBvbiB3aXRob3V0IG5vdGljaW5nIHRoZSBmYWlsdXJlLiBGaXhlZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgREVTIGxpYnJhcnkgY2xlYW51cHMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciBQS0NTIzUgdjIuMCBQQkUgYWxnb3JpdGhtcy4gVGhpcyB3aWxsIHBlcm1pdCBQS0NTIzggdG8gYmUKICAgICB1c2VkIHdpdGggYW55IGNpcGhlciB1bmxpa2UgUEtDUyM1IHYxLjUgd2hpY2ggY2FuIGF0IG1vc3QgaGFuZGxlIDY0IGJpdAogICAgIGNpcGhlcnMuIE5PVEU6IGFsdGhvdWdoIHRoZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBoYXMgYmVlbiB2ZXJpZmllZAogICAgIGFnYWluc3Qgc29tZSBwdWJsaXNoZWQgdGVzdCB2ZWN0b3JzIGl0IGhhcyBub3QgYmVlbiBleHRlbnNpdmVseSB0ZXN0ZWQKICAgICB5ZXQuIEFkZGVkIGEgLXYyICJjaXBoZXIiIG9wdGlvbiB0byBwa2NzOCBhcHBsaWNhdGlvbiB0byBhbGxvdyB0aGUgdXNlCiAgICAgb2YgdjIuMC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbnN0ZWFkIG9mICJta2RpciAtcCIsIHdoaWNoIGlzIG5vdCBmdWxseSBwb3J0YWJsZSwgdXNlIG5ldwogICAgIFBlcmwgc2NyaXB0ICJ1dGlsL21rZGlyLXAucGwiLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJld3JpdGUgdGhlIHdheSBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIChQQkUpIGlzIGhhbmRsZWQuIEl0IHVzZWQgdG8KICAgICBhc3N1bWUgdGhhdCB0aGUgQVNOMSBBbGdvcml0aG1JZGVudGlmaWVyIHBhcmFtZXRlciB3YXMgYSBQQkVQYXJhbWV0ZXIKICAgICBzdHJ1Y3R1cmUuIFRoaXMgd2FzIHRydWUgZm9yIHRoZSBQS0NTIzUgdjEuNSBhbmQgUEtDUyMxMiBQQkUgYWxnb3JpdGhtcwogICAgIGJ1dCBkb2Vzbid0IGFwcGx5IHRvIFBLQ1MjNSB2Mi4wIHdoZXJlIGl0IGNhbiBiZSBzb21ldGhpbmcgZWxzZS4gTm93CiAgICAgdGhlICdwYXJhbWV0ZXInIGZpZWxkIG9mIHRoZSBBbGdvcml0aG1JZGVudGlmaWVyIGlzIHBhc3NlZCB0byB0aGUKICAgICB1bmRlcmx5aW5nIGtleSBnZW5lcmF0aW9uIGZ1bmN0aW9uIHNvIGl0IG11c3QgZG8gaXRzIG93biBBU04xIHBhcnNpbmcuCiAgICAgVGhpcyBoYXMgYWxzbyBjaGFuZ2VkIHRoZSBFVlBfUEJFX0NpcGhlckluaXQoKSBmdW5jdGlvbiB3aGljaCBub3cgaGFzIGEKICAgICAncGFyYW1ldGVyJyBhcmd1bWVudCBpbnN0ZWFkIG9mIGxpdGVyYWwgc2FsdCBhbmQgaXRlcmF0aW9uIGNvdW50IHZhbHVlcwogICAgIGFuZCB0aGUgZnVuY3Rpb24gRVZQX1BCRV9BTEdPUl9DaXBoZXJJbml0KCkgaGFzIGJlZW4gZGVsZXRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBQS0NTIzUgdjEuNSBjb21wYXRpYmxlIHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gYWxnb3JpdGhtcwogICAgIGFuZCBQS0NTIzggZnVuY3Rpb25hbGl0eS4gTmV3ICdwa2NzOCcgYXBwbGljYXRpb24gbGlua2VkIHRvIG9wZW5zc2wuCiAgICAgTmVlZGVkIHRvIGNoYW5nZSB0aGUgUEVNX1NUUklOR19FVlBfUEtFWSB2YWx1ZSB3aGljaCB3YXMganVzdCAiUFJJVkFURQogICAgIEtFWSIgYmVjYXVzZSB0aGlzIGNsYXNoZWQgd2l0aCBQS0NTIzggdW5lbmNyeXB0ZWQgc3RyaW5nLiBTaW5jZSB0aGlzCiAgICAgdmFsdWUgd2FzIGp1c3QgdXNlZCBhcyBhICJtYWdpYyBzdHJpbmciIGFuZCBub3QgdXNlZCBkaXJlY3RseSBpdHMKICAgICB2YWx1ZSBkb2Vzbid0IG1hdHRlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbnRyb2R1Y2Ugc29tZSBzZW1ibGFuY2Ugb2YgY29uc3QgY29ycmVjdG5lc3MgdG8gQk4uIFNoYW1lIEMgZG9lc24ndAogICAgIHN1cHBvcnQgbXV0YWJsZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgImxpbnV4LXNwYXJjNjQiIGNvbmZpZ3VyYXRpb24gKHVsdHJhcGVuZ3VpbikuCiAgICAgW1JheSBNaWxsZXIgPHJheS5taWxsZXJAb3Vjcy5veC5hYy51az5dCiAgICAgImxpbnV4LXNwYXJjIiBjb25maWd1cmF0aW9uLgogICAgIFtDaHJpc3RpYW4gRm9yc3RlciA8Zm9AaGF3by5zdHcudW5pLWVybGFuZ2VuLmRlPl0KCiAgKikgY29uZmlnIG5vdyBnZW5lcmF0ZXMgbm8teHh4IG9wdGlvbnMgZm9yIG1pc3NpbmcgY2lwaGVycy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU3VwcG9ydCB0aGUgRUJDRElDIGNoYXJhY3RlciBzZXQgKHdvcmsgaW4gcHJvZ3Jlc3MpLgogICAgIEZpbGUgZWJjZGljLmMgbm90IHlldCBpbmNsdWRlZCBiZWNhdXNlIGl0IGhhcyBhIGRpZmZlcmVudCBsaWNlbnNlLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoUC5TaWVtZW5zLkRlPl0KCiAgKikgU3VwcG9ydCBCUzIwMDAvT1NELVBPU0lYLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoUC5TaWVtZW5zLkRlPl0KCiAgKikgTWFrZSBjYWxsYmFja3MgZm9yIGtleSBnZW5lcmF0aW9uIHVzZSB2b2lkICogaW5zdGVhZCBvZiBjaGFyICouCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1ha2UgUy9NSU1FIHNhbXBsZXMgY29tcGlsZSAobm90IHlldCB0ZXN0ZWQpLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGRpdGlvbmFsIHR5cGVzYWZlIHN0YWNrcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTmV3IGNvbmZpZ3VyYXRpb24gdmFyaWFudHMgImJzZGktZWxmLWdjYyIgKEJTRC9PUyA0LngpLgogICAgIFtCb2RvIE1vZWxsZXJdCgoKIENoYW5nZXMgYmV0d2VlbiAwLjkuMyBhbmQgMC45LjNhICBbMjkgTWF5IDE5OTldCgogICopIE5ldyBjb25maWd1cmF0aW9uIHZhcmlhbnQgInNjbzUtZ2NjIi4KCiAgKikgVXBkYXRlZCBzb21lIGRlbW9zLgogICAgIFtTZWFuIE8gUmlvcmRhaW4sIFdhZGUgU2Nob2xpbmVdCgogICopIEFkZCBtaXNzaW5nIEJJT19mcmVlIGF0IGV4aXQgb2YgcGtjczEyIGFwcGxpY2F0aW9uLgogICAgIFtXdSBaaGlnYW5nXQoKICAqKSBGaXggbWVtb3J5IGxlYWsgaW4gY29uZi5jLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZXMgZm9yIFdpbjMyIHRvIGFzc2VtYmxlciB2ZXJzaW9uIG9mIE1ENS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTZXQgIyEgcGF0aCB0byBwZXJsIGluIGFwcHMvZGVyX2Nob3AgdG8gd2hlcmUgd2UgZm91bmQgaXQKICAgICBpbnN0ZWFkIG9mIHVzaW5nIGEgZml4ZWQgcGF0aC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTSEEgbGlicmFyeSBjaGFuZ2VzIGZvciBpcml4NjQtbWlwczQtY2MuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEltcHJvdmVtZW50cyBmb3IgVk1TIHN1cHBvcnQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4yYiBhbmQgMC45LjMgIFsyNCBNYXkgMTk5OV0KCiAgKikgQmlnbnVtIGxpYnJhcnkgYnVnIGZpeC4gSVJJWCA2IHBhc3NlcyAibWFrZSB0ZXN0IiBub3chCiAgICAgVGhpcyBhbHNvIGF2b2lkcyB0aGUgcHJvYmxlbXMgd2l0aCBTQzQuMiBhbmQgdW5wYXRjaGVkIFNDNS4gIAogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIE5ldyBmdW5jdGlvbnMgc2tfbnVtLCBza192YWx1ZSBhbmQgc2tfc2V0IHRvIHJlcGxhY2UgdGhlIHByZXZpb3VzIG1hY3Jvcy4KICAgICBUaGVzZSBhcmUgcmVxdWlyZWQgYmVjYXVzZSBvZiB0aGUgdHlwZXNhZmUgc3RhY2sgd291bGQgb3RoZXJ3aXNlIGJyZWFrIAogICAgIGV4aXN0aW5nIGNvZGUuIElmIG9sZCBjb2RlIHVzZWQgYSBzdHJ1Y3R1cmUgbWVtYmVyIHdoaWNoIHVzZWQgdG8gYmUgU1RBQ0sKICAgICBhbmQgaXMgbm93IFNUQUNLX09GIChmb3IgZXhhbXBsZSBjZXJ0IGluIGEgUEtDUzdfU0lHTkVEIHN0cnVjdHVyZSkgd2l0aAogICAgIHNrX251bSBvciBza192YWx1ZSBpdCB3b3VsZCBwcm9kdWNlIGFuIGVycm9yIGJlY2F1c2UgdGhlIG51bSwgZGF0YSBtZW1iZXJzCiAgICAgYXJlIG5vdCBwcmVzZW50IGluIFNUQUNLX09GLiBOb3cgaXQganVzdCBwcm9kdWNlcyBhIHdhcm5pbmcuIHNrX3NldAogICAgIHJlcGxhY2VzIHRoZSBvbGQgbWV0aG9kIG9mIGFzc2lnbmluZyBhIHZhbHVlIHRvIHNrX3ZhbHVlCiAgICAgKGUuZy4gc2tfdmFsdWUoeCwgaSkgPSB5KSB3aGljaCB0aGUgbGlicmFyeSB1c2VkIGluIGEgZmV3IGNhc2VzLiBBbnkgY29kZQogICAgIHRoYXQgZG9lcyB0aGlzIHdpbGwgbm8gbG9uZ2VyIHdvcmsgKGFuZCBzaG91bGQgdXNlIHNrX3NldCBpbnN0ZWFkKSBidXQKICAgICB0aGlzIGNvdWxkIGJlIHJlZ2FyZGVkIGFzIGEgInF1ZXN0aW9uYWJsZSIgYmVoYXZpb3VyIGFueXdheS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggbW9zdCBvZiB0aGUgb3RoZXIgUEtDUyM3IGJ1Z3MuIFRoZSAiZXhwZXJpbWVudGFsIiBjb2RlIGNhbiBub3cKICAgICBjb3JyZWN0bHkgaGFuZGxlIGVuY3J5cHRlZCBTL01JTUUgZGF0YS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdHlwZSBvZiB2YXJpb3VzIERFUyBmdW5jdGlvbiBhcmd1bWVudHMgZnJvbSBkZXNfY2Jsb2NrCiAgICAgKHdoaWNoIG1lYW5zLCBpbiBmdW5jdGlvbiBhcmd1bWVudCBkZWNsYXJhdGlvbnMsIHBvaW50ZXIgdG8gY2hhcikKICAgICB0byBkZXNfY2Jsb2NrICogKG1lYW5pbmcgcG9pbnRlciB0byBhcnJheSB3aXRoIDggY2hhciBlbGVtZW50cyksCiAgICAgd2hpY2ggYWxsb3dzIHRoZSBjb21waWxlciB0byBkbyBtb3JlIHR5cGVjaGVja2luZzsgaXQgd2FzIGxpa2UKICAgICB0aGF0IGJhY2sgaW4gU1NMZWF5LCBidXQgd2l0aCBsb3RzIG9mIHVnbHkgY2FzdHMuCgogICAgIEludHJvZHVjZSBuZXcgdHlwZSBjb25zdF9kZXNfY2Jsb2NrLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlb3JnYW5pc2UgdGhlIFBLQ1MjNyBsaWJyYXJ5IGFuZCBnZXQgcmlkIG9mIHNvbWUgb2YgdGhlIG1vcmUgb2J2aW91cwogICAgIHByb2JsZW1zOiBmaW5kIFJlY2lwaWVudEluZm8gc3RydWN0dXJlIHRoYXQgbWF0Y2hlcyByZWNpcGllbnQgY2VydGlmaWNhdGUKICAgICBhbmQgaW5pdGlhbGlzZSB0aGUgQVNOMSBzdHJ1Y3R1cmVzIHByb3Blcmx5IGJhc2VkIG9uIHBhc3NlZCBjaXBoZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQmVsYXRlZGx5IG1ha2UgdGhlIEJOIHRlc3RzIGFjdHVhbGx5IGNoZWNrIHRoZSByZXN1bHRzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIGVuY29kaW5nIGFuZCBkZWNvZGluZyBvZiBuZWdhdGl2ZSBBU04xIElOVEVHRVJTIGFuZCBjb252ZXJzaW9uCiAgICAgdG8gYW5kIGZyb20gQk5zOiBpdCB3YXMgY29tcGxldGVseSBicm9rZW4uIE5ldyBjb21waWxhdGlvbiBvcHRpb24KICAgICBORUdfUFVCS0VZX0JVRyB0byBhbGxvdyBmb3Igc29tZSBicm9rZW4gY2VydGlmaWNhdGVzIHRoYXQgZW5jb2RlIHB1YmxpYwogICAgIGtleSBlbGVtZW50cyBhcyBuZWdhdGl2ZSBpbnRlZ2Vycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW9yZ2FuaXplIGFuZCBzcGVlZCB1cCBNRDUuCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgVk1TIHN1cHBvcnQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8cmljaGFyZEBsZXZpdHRlLm9yZz5dCgogICopIE5ldyBvcHRpb24gLW91dCB0byBhc24xcGFyc2UgdG8gYWxsb3cgdGhlIHBhcnNlZCBzdHJ1Y3R1cmUgdG8gYmUKICAgICBvdXRwdXQgdG8gYSBmaWxlLiBUaGlzIGlzIG1vc3QgdXNlZnVsIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgLXN0cnBhcnNlCiAgICAgb3B0aW9uIHRvIGV4YW1pbmUgdGhlIG91dHB1dCBvZiB0aGluZ3MgbGlrZSBPQ1RFVCBTVFJJTkdTLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgU1NMIGxpYnJhcnkgYSBsaXR0bGUgbW9yZSBmb29sLXByb29mIGJ5IG5vdCByZXF1aXJpbmcgYW55IGxvbmdlcgogICAgIHRoYXQgU1NMX3NldF97YWNjZXB0LGNvbm5lY3R9X3N0YXRlIGJlIGNhbGxlZCBiZWZvcmUKICAgICBTU0xfe2FjY2VwdCxjb25uZWN0fSBtYXkgYmUgdXNlZCAoU1NMX3NldF8uLi5fc3RhdGUgaXMgb21pdHRlZAogICAgIGluIG1hbnkgYXBwbGljYXRpb25zIGJlY2F1c2UgdXN1YWxseSBldmVyeXRoaW5nICphcHBlYXJlZCogdG8gd29yayBhcwogICAgIGludGVuZGVkIGFueXdheSAtLSBub3cgaXQgcmVhbGx5IHdvcmtzIGFzIGludGVuZGVkKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNb3ZlIG9wZW5zc2wuY25mIG91dCBvZiBsaWIvLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggdmFyaW91cyB0aGluZ3MgdG8gbGV0IE9wZW5TU0wgZXZlbiBwYXNzIGBgZWdjYyAtcGlwZSAtTzIgLVdhbGwKICAgICAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLVdjYXN0LWFsaWduIC1XbWlzc2luZy1wcm90b3R5cGVzCiAgICAgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV25lc3RlZC1leHRlcm5zIC1XaW5saW5lJycgd2l0aCBFR0NTIDEuMS4yKyAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgVmFyaW91cyBmaXhlcyB0byB0aGUgRVZQIGFuZCBQS0NTIzcgY29kZS4gSXQgbWF5IG5vdyBiZSBhYmxlIHRvCiAgICAgaGFuZGxlIFBLQ1MjNyBlbnZlbG9wZWQgZGF0YSBwcm9wZXJseS4KICAgICBbU2ViYXN0aWFuIEFrZXJtYW4gPHNha0BwYXJhbGxlbGNvbnN1bHRpbmcuY29tPiwgbW9kaWZpZWQgYnkgU3RldmVdCgogICopIENyZWF0ZSBhIGR1cGxpY2F0ZSBvZiB0aGUgU1NMX0NUWCdzIENFUlQgaW4gU1NMX25ldyBpbnN0ZWFkIG9mCiAgICAgY29weWluZyBwb2ludGVycy4gIFRoZSBjZXJ0X3N0IGhhbmRsaW5nIGlzIGNoYW5nZWQgYnkgdGhpcyBpbgogICAgIHZhcmlvdXMgd2F5cyAoYW5kIHRodXMgd2hhdCB1c2VkIHRvIGJlIGtub3duIGFzIGN0eC0+ZGVmYXVsdF9jZXJ0CiAgICAgaXMgbm93IGNhbGxlZCBjdHgtPmNlcnQsIHNpbmNlIHdlIGRvbid0IHJlc29ydCB0byBzLT5jdHgtPltkZWZhdWx0X11jZXJ0CiAgICAgYW55IGxvbmdlciB3aGVuIHMtPmNlcnQgZG9lcyBub3QgZ2l2ZSB1cyB3aGF0IHdlIG5lZWQpLgogICAgIHNzbF9jZXJ0X2luc3RhbnRpYXRlIGJlY29tZXMgb2Jzb2xldGUgYnkgdGhpcyBjaGFuZ2UuCiAgICAgQXMgc29vbiBhcyB3ZSd2ZSBnb3QgdGhlIG5ldyBjb2RlIHJpZ2h0IChwb3NzaWJseSBpdCBhbHJlYWR5IGlzPyksCiAgICAgd2UgaGF2ZSBzb2x2ZWQgYSBjb3VwbGUgb2YgYnVncyBvZiB0aGUgZWFybGllciBjb2RlIHdoZXJlIHMtPmNlcnQKICAgICB3YXMgdXNlZCBhcyBpZiBpdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHNoYXJlZCB3aXRoIG90aGVyIFNTTCBzdHJ1Y3R1cmVzLgoKICAgICBOb3RlIHRoYXQgdXNpbmcgdGhlIFNTTCBBUEkgaW4gY2VydGFpbiBkaXJ0eSB3YXlzIG5vdyB3aWxsIHJlc3VsdAogICAgIGluIGRpZmZlcmVudCBiZWhhdmlvdXIgdGhhbiBvYnNlcnZlZCB3aXRoIGVhcmxpZXIgbGlicmFyeSB2ZXJzaW9uczoKICAgICBDaGFuZ2luZyBzZXR0aW5ncyBmb3IgYW4gU1NMX0NUWCAqY3R4IGFmdGVyIGhhdmluZyBkb25lIHMgPSBTU0xfbmV3KGN0eCkKICAgICBkb2VzIG5vdCBpbmZsdWVuY2UgcyBhcyBpdCB1c2VkIHRvLgogICAgIAogICAgIEluIG9yZGVyIHRvIGNsZWFuIHVwIHRoaW5ncyBtb3JlIHRob3JvdWdobHksIGluc2lkZSBTU0xfU0VTU0lPTgogICAgIHdlIGRvbid0IHVzZSBDRVJUIGFueSBsb25nZXIsIGJ1dCBhIG5ldyBzdHJ1Y3R1cmUgU0VTU19DRVJUCiAgICAgdGhhdCBob2xkcyBwZXItc2Vzc2lvbiBkYXRhIChpZiBhdmFpbGFibGUpOyBjdXJyZW50bHksIHRoaXMgaXMKICAgICB0aGUgcGVlcidzIGNlcnRpZmljYXRlIGNoYWluIGFuZCwgZm9yIGNsaWVudHMsIHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZQogICAgIGFuZCB0ZW1wb3Jhcnkga2V5LiAgQ0VSVCBob2xkcyBvbmx5IHRob3NlIHZhbHVlcyB0aGF0IGNhbiBoYXZlCiAgICAgbWVhbmluZ2Z1bCBkZWZhdWx0cyBpbiBhbiBTU0xfQ1RYLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBYNTA5VjNfRVhUX2kyZCgpIHRvIGNyZWF0ZSBhbiBYNTA5X0VYVEVOU0lPTiBzdHJ1Y3R1cmUKICAgICBmcm9tIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4gVmFyaW91cyBQS0NTIzcgZml4ZXM6IHJlbW92ZSBzb21lCiAgICAgZXZpbCBjYXN0cyBhbmQgc2V0IHRoZSBlbmNfZGlnX2FsZyBmaWVsZCBwcm9wZXJseSBiYXNlZCBvbiB0aGUgc2lnbmluZwogICAgIGtleSB0eXBlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IFBLQ1MjMTIgcGFzc3dvcmQgdG8gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZSBvciB0aGUKICAgICBlbnZpcm9ubWVudC4gTGV0ICdjYScgZ2V0IGl0cyBjb25maWcgZmlsZSBuYW1lIGZyb20gdGhlIGVudmlyb25tZW50CiAgICAgdmFyaWFibGVzICJPUEVOU1NMX0NPTkYiIG9yICJTU0xFQVlfQ09ORiIgKGZvciBjb25zaXN0ZW5jeSB3aXRoICdyZXEnCiAgICAgYW5kICd4NTA5JykuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgY2VydGlmaWNhdGUgcG9saWNpZXMgZXh0ZW5zaW9uIHRvIHVzZSBhbiBJQTVTVFJJTkcgZm9yIHRoZQogICAgIG9yZ2FuaXphdGlvbiBmaWVsZC4gVGhpcyBpcyBjb250cmFyeSB0byB0aGUgUEtJWCBkZWZpbml0aW9uIGJ1dAogICAgIFZlcmlTaWduIHVzZXMgaXQgYW5kIElFNSBvbmx5IHJlY29nbmlzZXMgdGhpcyBmb3JtLiBEb2N1bWVudCAneDUwOScKICAgICBleHRlbnNpb24gb3B0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBQRURBTlRJQyBjb21waWxlciBmbGFnIHRvIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggZ2NjIC1wZWRhbnRpYywKICAgICB3aXRob3V0IGRpc2FsbG93aW5nIGlubGluZSBhc3NlbWJsZXIgYW5kIHRoZSBsaWtlIGZvciBub24tcGVkYW50aWMgYnVpbGRzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTdXBwb3J0IEJvcmxhbmQgQysrIGJ1aWxkZXIuCiAgICAgW0phbmV6IEplcmUgPGpqQHZvaWQuc2k+LCBtb2RpZmllZCBieSBVbGYgTfZsbGVyXQoKICAqKSBTdXBwb3J0IE1pbmd3MzIuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFNIQS0xIGNsZWFudXBzIGFuZCBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMuCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgU3BhcmMgdjhwbHVzIGFzc2VtYmxlciBmb3IgdGhlIGJpZ251bSBsaWJyYXJ5LgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIEFjY2VwdCBhbnkgLXh4eCBhbmQgK3h4eCBjb21waWxlciBvcHRpb25zIGluIENvbmZpZ3VyZS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgVXBkYXRlIEhQVVggY29uZmlndXJhdGlvbi4KICAgICBbQW5vbnltb3VzXQogIAogICopIEFkZCBtaXNzaW5nIHNrXzx0eXBlPl91bnNoaWZ0KCkgZnVuY3Rpb24gdG8gc2FmZXN0YWNrLmgKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTmV3IGZ1bmN0aW9uIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUgdGhhdCBzZXRzIHRoZQogICAgICJleHRyYV9jZXJ0InMgaW4gYWRkaXRpb24gdG8gdGhlIGNlcnRpZmljYXRlLiAgKFRoaXMgbWFrZXMgc2Vuc2UKICAgICBvbmx5IGZvciAiUEVNIiBmb3JtYXQgZmlsZXMsIGFzIGNoYWlucyBhcyBhIHdob2xlIGFyZSBub3QKICAgICBERVItZW5jb2RlZC4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU3VwcG9ydCB2ZXJpZnlfZGVwdGggZnJvbSB0aGUgU1NMIEFQSS4KICAgICB4NTA5X3ZmeS5jIGhhZCB3aGF0IGNhbiBiZSBjb25zaWRlcmVkIGFuIG9mZi1ieS1vbmUtZXJyb3I6CiAgICAgSXRzIGRlcHRoICh3aGljaCB3YXMgbm90IHBhcnQgb2YgdGhlIGV4dGVybmFsIGludGVyZmFjZSkKICAgICB3YXMgYWN0dWFsbHkgY291bnRpbmcgdGhlIG51bWJlciBvZiBjZXJ0aWZpY2F0ZXMgaW4gYSBjaGFpbjsKICAgICBub3cgaXQgcmVhbGx5IGNvdW50cyB0aGUgZGVwdGguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4IGluIGNyeXB0by94NTA5L3g1MDlfY21wLmM6IFRoZSBTU0xlcnIgbWFjcm8gd2FzIHVzZWQKICAgICBpbnN0ZWFkIG9mIFg1MDllcnIsIHdoaWNoIG9mdGVuIHJlc3VsdGVkIGluIGNvbmZ1c2luZyBlcnJvcgogICAgIG1lc3NhZ2VzIHNpbmNlIHRoZSBlcnJvciBjb2RlcyBhcmUgbm90IGdsb2JhbGx5IHVuaXF1ZQogICAgIChlLmcuIGFuIGFsbGVnZWQgZXJyb3IgaW4gc3NsM19hY2NlcHQgd2hlbiBhIGNlcnRpZmljYXRlCiAgICAgZGlkbid0IG1hdGNoIHRoZSBwcml2YXRlIGtleSkuCgogICopIE5ldyBmdW5jdGlvbiBTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQgdGhhdCBhbGxvd3MgdG8gc2V0IGEgZGVmYXVsdAogICAgIHZhbHVlIChzbyB0aGF0IHlvdSBkb24ndCBuZWVkIFNTTF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0IGZvciBlYWNoCiAgICAgY29ubmVjdGlvbiB1c2luZyB0aGUgU1NMX0NUWCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgT0FFUCBkZWNvZGluZyBidWcgZml4LgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTdXBwb3J0IElOU1RBTExfUFJFRklYIGZvciBwYWNrYWdlIGJ1aWxkZXJzLCBhcyBwcm9wb3NlZCBieQogICAgIERhdmlkIEhhcnJpcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbnMgInRocmVhZHMiIGFuZCAibm8tdGhyZWFkcyIuICBGb3Igc3lzdGVtcwogICAgIHdoZXJlIHRoZSBwcm9wZXIgY29tcGlsZXIgb3B0aW9ucyBhcmUga25vd24gKGN1cnJlbnRseSBTb2xhcmlzCiAgICAgYW5kIExpbnV4KSwgInRocmVhZHMiIGlzIHRoZSBkZWZhdWx0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBzY3JpcHQgdXRpbC9ta2xpbmsucGwgYXMgYSBmYXN0ZXIgc3Vic3RpdHV0ZSBmb3IgdXRpbC9ta2xpbmsuc2guCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5zdGFsbCB2YXJpb3VzIHNjcmlwdHMgdG8gJChPUEVOU1NMRElSKS9taXNjLCBub3QgdG8KICAgICAkKElOU1RBTExUT1ApL2JpbiAtLSB0aGV5IHNob3VsZG4ndCBjbHV0dGVyIGRpcmVjdG9yaWVzCiAgICAgc3VjaCBhcyAvdXNyL2xvY2FsL2Jpbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSAibWFrZSBsaW51eC1zaGFyZWQiIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCiAgICAgW05pZWxzIFBvcHBlIDxuaWVsc0BuZXRib3gub3JnPl0KCiAgKikgTmV3IENvbmZpZ3VyZSBvcHRpb24gbm8tPGNpcGhlcj4gKHJzYSwgaWRlYSwgcmM1LCAuLi4pLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgdGhlIFBLQ1MjMTIgQVBJIGRvY3VtZW50YXRpb24gdG8gb3BlbnNzbC50eHQuIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yCiAgICAgZXh0ZW5zaW9uIGFkZGluZyBpbiB4NTA5IHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIE5PUFJPVE8gc2VjdGlvbnMgYW5kIGVycm9yIGNvZGUgY29tbWVudHMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFBhcnRpYWwgcmV3cml0ZSBvZiB0aGUgREVGIGZpbGUgZ2VuZXJhdG9yIHRvIG5vdyBwYXJzZSB0aGUgQU5TSQogICAgIHByb3RvdHlwZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IENvbmZpZ3VyZSBvcHRpb25zIC0tcHJlZml4PURJUiBhbmQgLS1vcGVuc3NsZGlyPURJUi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQ29tcGxldGUgcmV3cml0ZSBvZiB0aGUgZXJyb3IgY29kZSBzY3JpcHQocykuIEl0IGlzIGFsbCBub3cgaGFuZGxlZAogICAgIGJ5IG9uZSBzY3JpcHQgYXQgdGhlIHRvcCBsZXZlbCB3aGljaCBoYW5kbGVzIGVycm9yIGNvZGUgZ2F0aGVyaW5nLAogICAgIGhlYWRlciByZXdyaXRpbmcgYW5kIEMgc291cmNlIGZpbGUgZ2VuZXJhdGlvbi4gSXQgc2hvdWxkIGJlIG11Y2ggYmV0dGVyCiAgICAgdGhhbiB0aGUgb2xkIG1ldGhvZDogaXQgbm93IHVzZXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIFVsZidzIHBhcnNlciB0bwogICAgIHJlYWQgdGhlIEFOU0kgcHJvdG90eXBlcyBpbiBhbGwgaGVhZGVyIGZpbGVzICh0aHVzIHRoZSBvbGQgSyZSIGRlZmluaXRpb25zCiAgICAgYXJlbid0IG5lZWRlZCBmb3IgZXJyb3IgY3JlYXRpb24gYW55IG1vcmUpIGFuZCBkbyBhIGJldHRlciBqb2Igb2YKICAgICB0cmFuc2xhdGluZyBmdW5jdGlvbiBjb2RlcyBpbnRvIG5hbWVzLiBUaGUgb2xkICdBU04xIGVycm9yIGNvZGUgaW1iZWRkZWQKICAgICBpbiBhIGNvbW1lbnQnIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgYW5kIGl0IGRvZXNuJ3QgdXNlIC5lcnIgZmlsZXMgd2hpY2gKICAgICBoYXZlIG5vdyBiZWVuIGRlbGV0ZWQuIEFsc28gdGhlIGVycm9yIGNvZGUgY2FsbCBkb2Vzbid0IGhhdmUgdG8gYXBwZWFyIGFsbAogICAgIG9uIG9uZSBsaW5lICh3aGljaCByZXN1bHRlZCBpbiBzb21lIGxhcmdlIGxpbmVzLi4uKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgI2luY2x1ZGUgZmlsZW5hbWVzIGZyb20gPGZvby5oPiB0byA8b3BlbnNzbC9mb28uaD4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIGJlaGF2aW91ciBvZiBzc2wyX3JlYWQgd2hlbiBmYWNpbmcgbGVuZ3RoLTAgcGFja2V0czogRG9uJ3QgcmV0dXJuCiAgICAgMCAod2hpY2ggdXN1YWxseSBpbmRpY2F0ZXMgYSBjbG9zZWQgY29ubmVjdGlvbiksIGJ1dCBjb250aW51ZSByZWFkaW5nLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBzb21lIHJhY2UgY29uZGl0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgQ1JMIGRpc3RyaWJ1dGlvbiBwb2ludHMgZXh0ZW5zaW9uLiBBZGQgQ2VydGlmaWNhdGUKICAgICBQb2xpY2llcyBhbmQgQ1JMIGRpc3RyaWJ1dGlvbiBwb2ludHMgZG9jdW1lbnRhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3ZlIHRoZSBhdXRvZ2VuZXJhdGVkIGhlYWRlciBmaWxlIHBhcnRzIHRvIGNyeXB0by9vcGVuc3NsY29uZi5oLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggbmV3IDU2LWJpdCBERVMgZXhwb3J0IGNpcGhlcnN1aXRlczogdGhleSB3ZXJlIHVzaW5nIDcgYnl0ZXMgaW5zdGVhZCBvZgogICAgIDggb2Yga2V5aW5nIG1hdGVyaWFsLiBNZXJsaW4gaGFzIGFsc28gY29uZmlybWVkIGludGVyb3Agd2l0aCB0aGlzIGZpeAogICAgIGJldHdlZW4gT3BlblNTTCBhbmQgQmFsdGltb3JlIEMvU1NMIDIuMCBhbmQgSi9TU0wgMi4wLgogICAgIFtNZXJsaW4gSHVnaGVzIDxtZXJsaW5AYmFsdGltb3JlLmllPl0KCiAgKikgRml4IGxvdHMgb2Ygd2FybmluZ3MuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCiAKICAqKSBJbiBhZGRfY2VydF9kaXIoKSBpbiBjcnlwdG8veDUwOS9ieV9kaXIuYywgYnJlYWsgb3V0IG9mIHRoZSBsb29wIGlmCiAgICAgdGhlIGRpcmVjdG9yeSBzcGVjIGRpZG4ndCBlbmQgd2l0aCBhIExJU1RfU0VQQVJBVE9SX0NIQVIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCiAKICAqKSBGaXggcHJvYmxlbXMgd2l0aCBzaXplb2YobG9uZykgPT0gOC4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBDaGFuZ2UgZnVuY3Rpb25zIHRvIEFOU0kgQy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IHR5cG9zIGluIGVycm9yIGNvZGVzLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoUC5TaWVtZW5zLkRlPiwgVWxmIE32bGxlcl0KCiAgKikgUmVtb3ZlIGRlZnVuY3QgYXNzZW1ibGVyIGZpbGVzIGZyb20gQ29uZmlndXJlLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTUEFSQyB2OCBhc3NlbWJsZXIgQklHTlVNIGltcGxlbWVudGF0aW9uLgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIFN1cHBvcnQgZm9yIENlcnRpZmljYXRlIFBvbGljaWVzIGV4dGVuc2lvbjogYm90aCBwcmludCBhbmQgc2V0LgogICAgIFZhcmlvdXMgYWRkaXRpb25zIHRvIHN1cHBvcnQgdGhlIHIyaSBtZXRob2QgdGhpcyB1c2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEEgbG90IG9mIGNvbnN0aWZpY2F0aW9uLCBhbmQgZml4IGEgYnVnIGluIFg1MDlfTkFNRV9vbmVsaW5lKCkgdGhhdCBjb3VsZAogICAgIHJldHVybiBhIGNvbnN0IHN0cmluZyB3aGVuIHlvdSBhcmUgZXhwZWN0aW5nIGFuIGFsbG9jYXRlZCBidWZmZXIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBzdXBwb3J0IGZvciBBU04xIHR5cGVzIFVURjhTdHJpbmcgYW5kIFZJU0lCTEVTVFJJTkcsIGFsc28gdGhlIENIT0lDRQogICAgIHR5cGVzIERpcmVjdG9yeVN0cmluZyBhbmQgRGlzcGxheVRleHQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvZGUgdG8gYWxsb3cgcjJpIGV4dGVuc2lvbnMgdG8gYWNjZXNzIHRoZSBjb25maWd1cmF0aW9uIGRhdGFiYXNlLAogICAgIGFkZCBhbiBMSEFTSCBkYXRhYmFzZSBkcml2ZXIgYW5kIGFkZCBzZXZlcmFsIGN0eCBoZWxwZXIgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBhbiBldmlsIGJ1ZyBpbiBibl9leHBhbmQyKCkgd2hpY2ggY2F1c2VkIHZhcmlvdXMgQk4gZnVuY3Rpb25zIHRvCiAgICAgZmFpbCB3aGVuIHRoZXkgZXh0ZW5kZWQgdGhlIHNpemUgb2YgYSBCSUdOVU0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyB0byBoYW5kbGUgU1hOZXQgZXh0ZW5zaW9uLiBNb2RpZnkgbWtkZWYucGwgdG8KICAgICBzdXBwb3J0IHR5cGVzYWZlIHN0YWNrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0eXBvIGluIFNTTF9bZ3NdZXRfb3B0aW9ucygpLgogICAgIFtOaWxzIEZyb3N0YmVyZyA8bmlsc0BtZWRjb20uc2U+XQoKICAqKSBEZWxldGUgdmFyaW91cyBmdW5jdGlvbnMgYW5kIGZpbGVzIHRoYXQgYmVsb25nZWQgdG8gdGhlIChub3cgb2Jzb2xldGUpCiAgICAgb2xkIFg1MDlWMyBoYW5kbGluZyBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBDb25maWd1cmUgb3B0aW9uICJyc2FyZWYiLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBEb24ndCBhdXRvLWdlbmVyYXRlIHBlbS5oLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEludHJvZHVjZSB0eXBlLXNhZmUgQVNOLjEgU0VUcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ29udmVydCB2YXJpb3VzIGFkZGl0aW9uYWwgY2FzdGVkIHN0YWNrcyB0byB0eXBlLXNhZmUgU1RBQ0tfT0YoKSB2YXJpYW50cy4KICAgICBbQmVuIExhdXJpZSwgUmFsZiBTLiBFbmdlbHNjaGFsbCwgU3RldmUgSGVuc29uXQoKICAqKSBJbnRyb2R1Y2UgdHlwZS1zYWZlIFNUQUNLcy4gVGhpcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYnJlYWsgbG90cyBvZiBjb2RlCiAgICAgdGhhdCBsaW5rcyB3aXRoIE9wZW5TU0wgKHdlbGwgYXQgbGVhc3QgY2F1c2UgbG90cyBvZiB3YXJuaW5ncyksIGJ1dCBmZWFyCiAgICAgbm90OiB0aGUgY29udmVyc2lvbiBpcyB0cml2aWFsLCBhbmQgaXQgZWxpbWluYXRlcyBsb2FkcyBvZiBldmlsIGNhc3RzLiBBCiAgICAgZmV3IFNUQUNLZWQgdGhpbmdzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgYWxyZWFkeS4gRmVlbCBmcmVlIHRvIGNvbnZlcnQgbW9yZS4KICAgICBJbiB0aGUgZnVsbG5lc3Mgb2YgdGltZSwgSSdsbCBkbyBhd2F5IHdpdGggdGhlIFNUQUNLIHR5cGUgYWx0b2dldGhlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGBvcGVuc3NsIGNhIC1yZXZva2UgPGNlcnRmaWxlPicgZmFjaWxpdHkgd2hpY2ggcmV2b2tlcyBhIGNlcnRpZmljYXRlCiAgICAgc3BlY2lmaWVkIGluIDxjZXJ0ZmlsZT4gYnkgdXBkYXRpbmcgdGhlIGVudHJ5IGluIHRoZSBpbmRleC50eHQgZmlsZS4KICAgICBUaGlzIHdheSBvbmUgbm8gbG9uZ2VyIGhhcyB0byBlZGl0IHRoZSBpbmRleC50eHQgZmlsZSBtYW51YWxseSBmb3IKICAgICByZXZva2luZyBhIGNlcnRpZmljYXRlLiBUaGUgLXJldm9rZSBvcHRpb24gZG9lcyB0aGUgZ29yeSBkZXRhaWxzIG5vdy4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAb3BlbmNhLm9yZz4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBgb3BlbnNzbCBjcmwgLW5vb3V0IC10ZXh0JyBjb21iaW5hdGlvbiB3aGVyZSBgLW5vb3V0JyBraWxsZWQgdGhlCiAgICAgYC10ZXh0JyBvcHRpb24gYXQgYWxsIGFuZCB0aGlzIHdheSB0aGUgYC1ub291dCAtdGV4dCcgY29tYmluYXRpb24gd2FzCiAgICAgaW5jb25zaXN0ZW50IGluIGBvcGVuc3NsIGNybCcgd2l0aCB0aGUgZnJpZW5kcyBpbiBgb3BlbnNzbCB4NTA5fHJzYXxkc2EnLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBNYWtlIHN1cmUgYSBjb3JyZXNwb25kaW5nIHBsYWluIHRleHQgZXJyb3IgbWVzc2FnZSBleGlzdHMgZm9yIHRoZQogICAgIFg1MDlfVl9FUlJfQ0VSVF9SRVZPS0VELzIzIGVycm9yIG51bWJlciB3aGljaCBjYW4gb2NjdXIgd2hlbiBhCiAgICAgdmVyaWZ5IGNhbGxiYWNrIGZ1bmN0aW9uIGRldGVybWluZWQgdGhhdCBhIGNlcnRpZmljYXRlIHdhcyByZXZva2VkLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBCdWdmaXg6IEluIHRlc3QvdGVzdGVuYywgZG9uJ3QgdGVzdCAib3BlbnNzbCA8Y2lwaGVyPiIgZm9yCiAgICAgY2lwaGVycyB0aGF0IHdlcmUgZXhjbHVkZWQsIGUuZy4gYnkgLUROT19JREVBLiAgQWxzbywgdGVzdAogICAgIGFsbCBhdmFpbGFibGUgY2lwZXJzIGluY2x1ZGluZyByYzUsIHdoaWNoIHdhcyBmb3Jnb3R0ZW4gdW50aWwgbm93LgogICAgIEluIG9yZGVyIHRvIGxldCB0aGUgdGVzdGluZyBzaGVsbCBzY3JpcHQga25vdyB3aGljaCBhbGdvcml0aG1zCiAgICAgYXJlIGF2YWlsYWJsZSwgYSBuZXcgKHVwIHRvIG5vdyB1bmRvY3VtZW50ZWQpIGNvbW1hbmQKICAgICAib3BlbnNzbCBsaXN0LWNpcGhlci1jb21tYW5kcyIgaXMgdXNlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXg6IHNfY2xpZW50IG9jY2FzaW9uYWxseSB3b3VsZCBzbGVlcCBpbiBzZWxlY3QoKSB3aGVuCiAgICAgaXQgc2hvdWxkIGhhdmUgY2hlY2tlZCBTU0xfcGVuZGluZygpIGZpcnN0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbnMgRFNBX2RvX3NpZ24gYW5kIERTQV9kb192ZXJpZnkgdG8gcHJvdmlkZSBhY2Nlc3MgdG8KICAgICB0aGUgcmF3IERTQSB2YWx1ZXMgcHJpb3IgdG8gQVNOLjEgZW5jb2RpbmcuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFR3ZWFrcyB0byBDb25maWd1cmUKICAgICBbTmllbHMgUG9wcGUgPG5pZWxzQG5ldGJveC5vcmc+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgUEtDUyM1IHYyLjAgQVNOMSBQQkVTMiBzdHJ1Y3R1cmVzLiBObyBvdGhlciBzdXBwb3J0LAogICAgIHlldC4uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyB2YXJpYWJsZXMgJChSQU5MSUIpIGFuZCAkKFBFUkwpIGluIHRoZSBNYWtlZmlsZXMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIE5ldyBjb25maWcgb3B0aW9uIHRvIGF2b2lkIGluc3RydWN0aW9ucyB0aGF0IGFyZSBpbGxlZ2FsIG9uIHRoZSA4MDM4Ni4KICAgICBUaGUgZGVmYXVsdCBjb2RlIGlzIGZhc3RlciwgYnV0IHJlcXVpcmVzIGF0IGxlYXN0IGEgNDg2LgogICAgIFtVbGYgTfZsbGVyXQogIAogICopIEdvdCByaWQgb2Ygb2xkIFNTTDJfQ0xJRU5UX1ZFUlNJT04gKGluY29uc2lzdGVudGx5IHVzZWQpIGFuZAogICAgIFNTTDJfU0VSVkVSX1ZFUlNJT04gKG5vdCB1c2VkIGF0IGFsbCkgbWFjcm9zLCB3aGljaCBhcmUgbm93IHRoZQogICAgIHNhbWUgYXMgU1NMMl9WRVJTSU9OIGFueXdheS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgIi1zaG93Y2VydHMiIG9wdGlvbiBmb3Igc19jbGllbnQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU3RpbGwgbW9yZSBQS0NTIzEyIGludGVncmF0aW9uLiBBZGQgcGtjczEyIGFwcGxpY2F0aW9uIHRvIG9wZW5zc2wKICAgICBhcHBsaWNhdGlvbi4gVmFyaW91cyBjbGVhbnVwcyBhbmQgZml4ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9yZSBQS0NTIzEyIGludGVncmF0aW9uLiBBZGQgbmV3IHBrY3MxMiBkaXJlY3Rvcnkgd2l0aCBNYWtlZmlsZS5zc2wgYW5kCiAgICAgbW9kaWZ5IGVycm9yIHJvdXRpbmVzIHRvIHdvcmsgaW50ZXJuYWxseS4gQWRkIGVycm9yIGNvZGVzIGFuZCBQQkUgaW5pdAogICAgIHRvIGxpYnJhcnkgc3RhcnR1cCByb3V0aW5lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdXJ0aGVyIFBLQ1MjMTIgaW50ZWdyYXRpb24uIEFkZGVkIHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24sIFBLQ1MjOCBhbmQKICAgICBwYWNraW5nIGZ1bmN0aW9ucyB0byBhc24xIGFuZCBldnAuIENoYW5nZWQgZnVuY3Rpb24gbmFtZXMgYW5kIGVycm9yCiAgICAgY29kZXMgYWxvbmcgdGhlIHdheS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQS0NTMTIgaW50ZWdyYXRpb246IGFuZCBzbyBpdCBiZWdpbnMuLi4gRmlyc3Qgb2Ygc2V2ZXJhbCBwYXRjaGVzIHRvCiAgICAgc2xvd2x5IGludGVncmF0ZSBQS0NTIzEyIGZ1bmN0aW9uYWxpdHkgaW50byBPcGVuU1NMLiBBZGQgUEtDUyMxMgogICAgIG9iamVjdHMgdG8gb2JqZWN0cy5oCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3ICdpbmRlbnQnIG9wdGlvbiB0byBzb21lIFg1MDlWMyBleHRlbnNpb24gY29kZS4gSW5pdGlhbCBBU04xCiAgICAgYW5kIGRpc3BsYXkgc3VwcG9ydCBmb3IgVGhhd3RlIHN0cm9uZyBleHRyYW5ldCBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIExpbnV4UFBDIHN1cHBvcnQuCiAgICAgW0plZmYgRHVicnVsZSA8aWdvckBwb2JveC5vcmc+XQoKICAqKSBHZXQgcmlkIG9mIHJlZHVuZGFudCBCTiBmaWxlIGJuX211bHcuYywgYW5kIHJlbmFtZSBibl9kaXY2NCB0bwogICAgIGJuX2Rpdl93b3JkcyBpbiBhbHBoYS5zLgogICAgIFtIYW5uZXMgUmVpbmVja2UgPEguUmVpbmVja2VAaHcuYWMudWs+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBNYWtlIHN1cmUgdGhlIFJTQSBPQUVQIHRlc3QgaXMgc2tpcHBlZCB1bmRlciAtRFJTQXJlZiBiZWNhdXNlCiAgICAgT0FFUCBpc24ndCBzdXBwb3J0ZWQgd2hlbiBPcGVuU1NMIGlzIGJ1aWx0IHdpdGggUlNBcmVmLgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgTW92ZSBkZWZpbml0aW9ucyBvZiBJU19TRVQvSVNfU0VRVUVOQ0UgaW5zaWRlIGNyeXB0by9hc24xL2FzbjEuaCAKICAgICBzbyB0aGV5IG5vIGxvbmdlciBhcmUgbWlzc2luZyB1bmRlciAtRE5PUFJPVE8uIAogICAgIFtTb3JlbiBTLiBKb3J2YW5nIDxzb3JlbkB0LmRrPl0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4xYyBhbmQgMC45LjJiICBbMjIgTWFyIDE5OTldCgogICopIE1ha2UgU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4oKSB3b3JrIGluIHNlcnZlcnMuIFVuZm9ydHVuYXRlbHksIGl0IHN0aWxsCiAgICAgZG9lc24ndCB3b3JrIHdoZW4gdGhlIHNlc3Npb24gaXMgcmV1c2VkLiBDb21pbmcgc29vbiEKICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IGEgc2VjdXJpdHkgaG9sZSwgdGhhdCBhbGxvd3Mgc2Vzc2lvbnMgdG8gYmUgcmV1c2VkIGluIHRoZSB3cm9uZwogICAgIGNvbnRleHQgdGh1cyBieXBhc3NpbmcgY2xpZW50IGNlcnQgcHJvdGVjdGlvbiEgQWxsIHNvZnR3YXJlIHRoYXQgdXNlcwogICAgIGNsaWVudCBjZXJ0cyBhbmQgc2Vzc2lvbiBjYWNoZXMgaW4gbXVsdGlwbGUgY29udGV4dHMgTkVFRFMgUEFUQ0hJTkcgdG8KICAgICBhbGxvdyBzZXNzaW9uIHJldXNlISBBIGZ1bGxlciBzb2x1dGlvbiBpcyBpbiB0aGUgd29ya3MuCiAgICAgW0JlbiBMYXVyaWUsIHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgSG9sZ2VyIFJlaWYsIEJvZG8gTW9lbGxlciAoYW5kID8/PyldCgogICopIFNvbWUgbW9yZSBzb3VyY2UgdHJlZSBjbGVhbnVwcyAocmVtb3ZlZCBvYnNvbGV0ZSBmaWxlcwogICAgIGNyeXB0by9iZi9hc20vYmY1ODYucGwsIHRlc3QvdGVzdC50eHQgYW5kIGNyeXB0by9zaGEvYXNtL2YuczsgY2hhbmdlZAogICAgIHBlcm1pc3Npb24gb24gImNvbmZpZyIgc2NyaXB0IHRvIGJlIGV4ZWN1dGFibGUpIGFuZCBhIGZpeCBmb3IgdGhlIElOU1RBTEwKICAgICBkb2N1bWVudC4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIFJlbW92ZSBzb21lIGxlZ2FjeSBhbmQgZXJyb25lb3VzIHVzZXMgb2YgbWFsbG9jLCBmcmVlIGluc3RlYWQgb2YKICAgICBNYWxsb2MsIEZyZWUuCiAgICAgW0xlbm5hcnQgQmFuZyA8bG9iQG5ldHN0cmVhbS5zZT4sIHdpdGggbWlub3IgY2hhbmdlcyBieSBTdGV2ZV0KCiAgKikgTWFrZSByc2Ffb2FlcF90ZXN0IHJldHVybiBub24temVybyBvbiBlcnJvci4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEFkZCBzdXBwb3J0IGZvciBuYXRpdmUgU29sYXJpcyBzaGFyZWQgbGlicmFyaWVzLiBDb25maWd1cmUKICAgICBzb2xhcmlzLXNwYXJjLXNjNC1waWMsIG1ha2UsIHRoZW4gcnVuIHNobGliL3NvbGFyaXMtc2M0LnNoLiBJdCdkIGJlIG5pY2UKICAgICBpZiBzb21lb25lIHdvdWxkIG1ha2UgdGhhdCBsYXN0IHN0ZXAgYXV0b21hdGljLgogICAgIFtNYXR0aGlhcyBMb2VwZmUgPE1hdHRoaWFzLkxvZXBmZUBBZE5vdnVtLkNIPl0KCiAgKikgY3R4X3NpemUgd2FzIG5vdCBidWlsdCB3aXRoIHRoZSByaWdodCBjb21waWxlciBkdXJpbmcgIm1ha2UgbGlua3MiLiBGaXhlZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2hhbmdlIHRoZSBtZWFuaW5nIG9mICdBTEwnIGluIHRoZSBjaXBoZXIgbGlzdC4gSXQgbm93IG1lYW5zICJldmVyeXRoaW5nCiAgICAgZXhjZXB0IE5VTEwgY2lwaGVycyIuIFRoaXMgbWVhbnMgdGhlIGRlZmF1bHQgY2lwaGVyIGxpc3Qgd2lsbCBubyBsb25nZXIKICAgICBlbmFibGUgTlVMTCBjaXBoZXJzLiBUaGV5IG5lZWQgdG8gYmUgc3BlY2lmaWNhbGx5IGVuYWJsZWQgZS5nLiB3aXRoCiAgICAgdGhlIHN0cmluZyAiREVGQVVMVDplTlVMTCIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRvIFJTQSBwcml2YXRlIGVuY3J5cHRpb24gcm91dGluZXM6IGlmIHAgPCBxIHRoZW4gaXQgd291bGQKICAgICBvY2Nhc2lvbmFsbHkgcHJvZHVjZSBhbiBpbnZhbGlkIHJlc3VsdC4gVGhpcyB3aWxsIG9ubHkgaGFwcGVuIHdpdGgKICAgICBleHRlcm5hbGx5IGdlbmVyYXRlZCBrZXlzIGJlY2F1c2UgT3BlblNTTCAoYW5kIFNTTGVheSkgZW5zdXJlIHAgPiBxLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJlIGxlc3MgcmVzdHJpY3RpdmUgYW5kIGFsbG93IGFsc28gYHBlcmwgdXRpbC9wZXJscGF0aC5wbAogICAgIC9wYXRoL3RvL2Jpbi9wZXJsJyBpbiBhZGRpdGlvbiB0byBgcGVybCB1dGlsL3BlcmxwYXRoLnBsIC9wYXRoL3RvL2JpbicsCiAgICAgYmVjYXVzZSB0aGlzIHdheSBvbmUgY2FuIGFsc28gdXNlIGFuIGludGVycHJldGVyIG5hbWVkIGBwZXJsNScgKHdoaWNoIGlzCiAgICAgdXN1YWxseSB0aGUgbmFtZSBvZiBQZXJsIDUueHh4IG9uIHBsYXRmb3JtcyB3aGVyZSBhbiBQZXJsIDQueCBpcyBzdGlsbAogICAgIGluc3RhbGxlZCBhcyBgcGVybCcpLgogICAgIFtNYXR0aGlhcyBMb2VwZmUgPE1hdHRoaWFzLkxvZXBmZUBhZG5vdnVtLmNoPl0KCiAgKikgTGV0IHV0aWwvY2xlYW4tZGVwZW5kLnBsIHdvcmsgYWxzbyB3aXRoIG9sZGVyIFBlcmwgNS4wMHggdmVyc2lvbnMuCiAgICAgW01hdHRoaWFzIExvZXBmZSA8TWF0dGhpYXMuTG9lcGZlQGFkbm92dW0uY2g+XQoKICAqKSBGaXggTWFrZWZpbGUub3JnIHNvIENDLENGTEFHIGV0YyBhcmUgcGFzc2VkIHRvICdtYWtlIGxpbmtzJyBhZGQKICAgICBhZHZhcGkzMi5saWIgdG8gV2luMzIgYnVpbGQgYW5kIGNoYW5nZSB0aGUgcGVtIHRlc3QgY29tcGFyaXNvbgogICAgIHRvIGZjLmV4ZSAodGhhbmtzIHRvIFVscmljaCBLcm9lbmVyIDxrcm9uZXJ1QHlhaG9vLmNvbT4gZm9yIHRoZQogICAgIHN1Z2dlc3Rpb24pLiBGaXggbWlzcGxhY2VkIEFTTkkgcHJvdG90eXBlcyBhbmQgZGVjbGFyYXRpb25zIGluIGV2cC5oCiAgICAgYW5kIGNyeXB0by9kZXMvZWRlX2NiY21fZW5jLmMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgREVTIHF1YWQgY2hlY2tzdW0gd2FzIGJyb2tlbiBvbiBiaWctZW5kaWFuIGFyY2hpdGVjdHVyZXMuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb21tZW50IG91dCB0d28gZnVuY3Rpb25zIGluIGJpby5oIHRoYXQgYXJlbid0IGltcGxlbWVudGVkLiBGaXggdXAgdGhlCiAgICAgV2luMzIgdGVzdCBiYXRjaCBmaWxlIHNvIGl0IChtaWdodCkgd29yayBhZ2Fpbi4gVGhlIFdpbjMyIHRlc3QgYmF0Y2ggZmlsZQogICAgIGlzIGhvcnJpYmxlOiBJIGZlZWwgaWxsLi4uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgdmFyaW91cyAjaWZkZWZzIGFyb3VuZCBzbyBOT19TWVNMT0csIE5PX0RJUkVOVCBldGMgYXJlIG5vdyBzZWxlY3RlZAogICAgIGluIGVfb3MuaC4gQXVkaXQgb2YgaGVhZGVyIGZpbGVzIHRvIGNoZWNrIEFOU0kgYW5kIG5vbiBBTlNJCiAgICAgc2VjdGlvbnM6IDEwIGZ1bmN0aW9ucyB3ZXJlIGFic2VudCBmcm9tIG5vbiBBTlNJIHNlY3Rpb24gYW5kIG5vdCBleHBvcnRlZAogICAgIGZyb20gV2luZG93cyBETExzLiBGaXhlZCB1cCBsaWJlYXkubnVtIGZvciBuZXcgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgYG9wZW5zc2wgdmVyc2lvbicgb3V0cHV0IGxpbmVzIGNvbnNpc3RlbnQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBXaW4zMiBzeW1ib2wgZXhwb3J0IGxpc3RzIGZvciBCSU8gZnVuY3Rpb25zOiBBZGRlZAogICAgIEJJT19nZXRfZXhfbmV3X2luZGV4LCBCSU9fZ2V0X2V4X251bSwgQklPX2dldF9leF9kYXRhIGFuZCBCSU9fc2V0X2V4X2RhdGEKICAgICB0byBtcy9saWJlYXl7MTYsMzJ9LmRlZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgU2Vjb25kIHJvdW5kIG9mIGZpeGluZyB0aGUgT3BlblNTTCBwZXJsLyBzdHVmZi4gSXQgbm93IGF0IGxlYXN0IGNvbXBpbGVkCiAgICAgZmluZSB1bmRlciBVbml4IGFuZCBwYXNzZXMgc29tZSB0cml2aWFsIHRlc3RzIEkndmUgbm93IGFkZGVkLiBCdXQgdGhlCiAgICAgd2hvbGUgc3R1ZmYgaXMgaG9ycmlibHkgaW5jb21wbGV0ZSwgc28gYSBSRUFETUUuMVNUIHdpdGggYSBkaXNjbGFpbWVyIHdhcwogICAgIGFkZGVkIHRvIG1ha2Ugc3VyZSBubyBvbmUgZXhwZWN0cyB0aGF0IHRoaXMgc3R1ZmYgcmVhbGx5IHdvcmtzIGluIHRoZQogICAgIE9wZW5TU0wgMC45LjIgcmVsZWFzZS4gIEFkZGl0aW9uYWxseSBJJ3ZlIHN0YXJ0ZWQgdG8gY2xlYW4gdGhlIFhTIHNvdXJjZXMKICAgICB1cCBhbmQgZml4ZWQgYSBmZXcgbGl0dGxlIGJ1Z3MgYW5kIGluY29uc2lzdGVuY2llcyBpbiBPcGVuU1NMLntwbSx4c30gYW5kCiAgICAgb3BlbnNzbF9iaW8ueHMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgZ2VuZXJhdGlvbiBvZiB0d28gcGFydCBhZGRyZXNzZXMgaW4gcGVybC4KICAgICBbS2VuamkgTWl5YWtlIDxrZW5qaUBtaXlha2Uub3JnPiwgaW50ZWdyYXRlZCBieSBCZW4gTGF1cmllXQoKICAqKSBBZGQgY29uZmlnIGVudHJ5IGZvciBMaW51eCBvbiBNSVBTLgogICAgIFtKb2huIFRvYmV5IDxqdG9iZXlAY2hhbm5lbDEuY29tPl0KCiAgKikgTWFrZSBsaW5rcyB3aGVuZXZlciBDb25maWd1cmUgaXMgcnVuLCB1bmxlc3Mgd2UgYXJlIG9uIFdpbmRvemUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFBlcm1pdCBleHRlbnNpb25zIHRvIGJlIGFkZGVkIHRvIENSTHMgdXNpbmcgY3JsX3NlY3Rpb24gaW4gb3BlbnNzbC5jbmYuCiAgICAgQ3VycmVudGx5IG9ubHkgaXNzdWVyQWx0TmFtZSBhbmQgQXV0aG9yaXR5S2V5SWRlbnRpZmllciBtYWtlIGFueSBzZW5zZQogICAgIGluIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgdXNlZnVsIGtsdWRnZSB0byBhbGxvdyBwYWNrYWdlIG1haW50YWluZXJzIHRvIHNwZWNpZnkgY29tcGlsZXIgYW5kCiAgICAgb3RoZXIgcGxhdGZvcm1zIGRldGFpbHMgb24gdGhlIGNvbW1hbmQgbGluZSB3aXRob3V0IGhhdmluZyB0byBwYXRjaCB0aGUKICAgICBDb25maWd1cmUgc2NyaXB0IGV2ZXJ5dGltZTogT25lIG5vdyBjYW4gdXNlIGBgcGVybCBDb25maWd1cmUKICAgICA8aWQ+OjxkZXRhaWxzPicnLCBpLmUuIHBsYXRmb3JtIGlkcyBhcmUgYWxsb3dlZCB0byBoYXZlIGRldGFpbHMgYXBwZW5kZWQKICAgICB0byB0aGVtIChzZXBhcmF0ZWQgYnkgY29sb25zKS4gVGhpcyBpcyB0cmVhdGVkIGFzIHRoZXJlIHdvdWxkIGJlIGEgc3RhdGljCiAgICAgcHJlLWNvbmZpZ3VyZWQgZW50cnkgaW4gQ29uZmlndXJlJ3MgJXRhYmxlIHVuZGVyIGtleSA8aWQ+IHdpdGggdmFsdWUKICAgICA8ZGV0YWlscz4gYW5kIGBgcGVybCBDb25maWd1cmUgPGlkPicnIGlzIGNhbGxlZC4gIFNvLCB3aGVuIHlvdSB3YW50IHRvCiAgICAgcGVyZm9ybSBhIHF1aWNrIHRlc3QtY29tcGlsZSB1bmRlciBGcmVlQlNEIDMuMSB3aXRoIHBnY2MgYW5kIHdpdGhvdXQKICAgICBhc3NlbWJsZXIgc3R1ZmYgeW91IGNhbiB1c2UgYGBwZXJsIENvbmZpZ3VyZSAiRnJlZUJTRC1lbGY6cGdjYzotTzY6OjoiJycKICAgICBub3csIHdoaWNoIG92ZXJyaWRlcyB0aGUgRnJlZUJTRC1lbGYgZW50cnkgb24tdGhlLWZseS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRGlzYWJsZSBuZXcgVExTMSBjaXBoZXJzdWl0ZXMgYnkgZGVmYXVsdDogdGhleSBhcmVuJ3Qgb2ZmaWNpYWwgeWV0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBbGxvdyBEU08gZmxhZ3MgbGlrZSAtZnBpYywgLWZQSUMsIC1LUElDIGV0Yy4gdG8gYmUgc3BlY2lmaWVkCiAgICAgb24gdGhlIGBwZXJsIENvbmZpZ3VyZSAuLi4nIGNvbW1hbmQgbGluZS4gVGhpcyB3YXkgb25lIGNhbiBjb21waWxlCiAgICAgT3BlblNTTCBsaWJyYXJpZXMgd2l0aCBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIChQSUMpIHdoaWNoIGlzIG5lZWRlZAogICAgIGZvciBsaW5raW5nIGl0IGludG8gRFNPcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtYXJrYWJseSwgZXhwb3J0IGNpcGhlcnMgd2VyZSB0b3RhbGx5IGJyb2tlbiBhbmQgbm8tb25lIGhhZCBub3RpY2VkIQogICAgIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDbGVhbmVkIHVwIHRoZSBMSUNFTlNFIGRvY3VtZW50OiBUaGUgb2ZmaWNpYWwgY29udGFjdCBmb3IgYW55IGxpY2Vuc2UKICAgICBxdWVzdGlvbnMgbm93IGlzIHRoZSBPcGVuU1NMIGNvcmUgdGVhbSB1bmRlciBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCiAgICAgQW5kIGFkZCBhIHBhcmFncmFwaCBhYm91dCB0aGUgZHVhbC1saWNlbnNlIHNpdHVhdGlvbiB0byBtYWtlIHN1cmUgcGVvcGxlCiAgICAgcmVjb2duaXplIHRoYXQgX0JPVEhfIHRoZSBPcGVuU1NMIGxpY2Vuc2UgX0FORF8gdGhlIFNTTGVheSBsaWNlbnNlIGFwcGx5CiAgICAgdG8gdGhlIE9wZW5TU0wgdG9vbGtpdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgR2VuZXJhbCBzb3VyY2UgdHJlZSBtYWtlZmlsZSBjbGVhbnVwczogTWFkZSBgbWFraW5nIHh4eCBpbiB5eXkuLi4nCiAgICAgZGlzcGxheSBjb25zaXN0ZW50IGluIHRoZSBzb3VyY2UgdHJlZSBhbmQgcmVwbGFjZWQgYC9iaW4vcm0nIGJ5IGBybScuCiAgICAgQWRkaXRpb25hbGx5IGNsZWFuZWQgdXAgdGhlIGBtYWtlIGxpbmtzJyB0YXJnZXQ6IFJlbW92ZSB1bm5lY2Vzc2FyeQogICAgIHNlbWljb2xvbnMsIHN1YnNlcXVlbnQgcmVkdW5kYW50IHJlbW92ZXMsIGlubGluZSBwb2ludC5zaCBpbnRvIG1rbGluay5zaAogICAgIHRvIHNwZWVkIHByb2Nlc3NpbmcgYW5kIG5vIGxvbmdlciBjbHV0dGVyIHRoZSBkaXNwbGF5IHdpdGggY29uZnVzaW5nCiAgICAgc3R1ZmYuIEluc3RlYWQgb25seSB0aGUgYWN0dWFsbHkgZG9uZSBsaW5rcyBhcmUgZGlzcGxheWVkLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBQZXJtaXQgbnVsbCBlbmNyeXB0aW9uIGNpcGhlcnN1aXRlcywgdXNlZCBmb3IgYXV0aGVudGljYXRpb24gb25seS4gSXQgdXNlZAogICAgIHRvIGJlIG5lY2Vzc2FyeSB0byBzZXQgdGhlIHByZXByb2Nlc3NvciBkZWZpbmUgU1NMX0FMTE9XX0VOVUxMIHRvIGRvIHRoaXMuCiAgICAgSXQgaXMgbm93IG5lY2Vzc2FyeSB0byBzZXQgU1NMX0ZPUkJJRF9FTlVMTCB0byBwcmV2ZW50IHRoZSB1c2Ugb2YgbnVsbAogICAgIGVuY3J5cHRpb24uCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBhIGJ1bmNoIG9mIGZpeGVzIHRvIHRoZSBQS0NTIzcgc3R1ZmYuIEl0IHVzZWQgdG8gc29tZXRpbWVzIHJlb3JkZXIKICAgICBzaWduZWQgYXR0cmlidXRlcyB3aGVuIHZlcmlmeWluZyBzaWduYXR1cmVzICh0aGlzIHdvdWxkIGJyZWFrIHRoZW0pLCAKICAgICB0aGUgZGV0YWNoZWQgZGF0YSBlbmNvZGluZyB3YXMgd3JvbmcgYW5kIHB1YmxpYyBrZXlzIG9idGFpbmVkIHVzaW5nCiAgICAgWDUwOV9nZXRfcHVia2V5KCkgd2VyZW4ndCBmcmVlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGV4dCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQlVGRkVSIGZ1bmN0aW9ucy4gQWxzbyBhZGRlZCBhIHdvcmsgYXJvdW5kCiAgICAgdG8gYSBXaW45NSBjb25zb2xlIGJ1Zy4gVGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBwYXNzd29yZCByZWFkIHN0dWZmOiB0aGUKICAgICBsYXN0IGNoYXJhY3RlciB0eXBlZCBnZXRzIGNhcnJpZWQgb3ZlciB0byB0aGUgbmV4dCBmcmVhZCgpLiBJZiB5b3Ugd2VyZSAKICAgICBnZW5lcmF0aW5nIGEgbmV3IGNlcnQgcmVxdWVzdCB1c2luZyAncmVxJyBmb3IgZXhhbXBsZSB0aGVuIHRoZSBsYXN0CiAgICAgY2hhcmFjdGVyIG9mIHRoZSBwYXNzcGhyYXNlIHdvdWxkIGJlIENSIHdoaWNoIHdvdWxkIHRoZW4gZW50ZXIgdGhlIGZpcnN0CiAgICAgZmllbGQgYXMgYmxhbmsuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgdGhlIG5ldyBgSW5jbHVkZXMgT3BlblNTTCBDcnlwdG9ncmFwaHkgU29mdHdhcmUnIGJ1dHRvbiBhcwogICAgIGRvYy9vcGVuc3NsX2J1dHRvbi57Z2lmLGh0bWx9IHdoaWNoIGlzIHNpbWlsYXIgaW4gc3R5bGUgdG8gdGhlIG9sZCBTU0xlYXkKICAgICBidXR0b24gYW5kIGNhbiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyBiYXNlZCBvbiBPcGVuU1NMIHRvIHNob3cgdGhlCiAgICAgcmVsYXRpb25zaGlwIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuICAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtb3ZlIGNvbmZ1c2luZyB2YXJpYWJsZXMgaW4gZnVuY3Rpb24gc2lnbmF0dXJlcyBpbiBmaWxlcwogICAgIHNzbC9zc2xfbGliLmMgYW5kIHNzbC9zc2wuaC4KICAgICBbTGVubmFydCBCb25nIDxsb2JAa3VsdGhlYS5zdGFja2VuLmt0aC5zZT5dCgogICopIERvbid0IGluc3RhbGwgYnNzX2ZpbGUuYyB1bmRlciBQUkVGSVgvaW5jbHVkZS8KICAgICBbTGVubmFydCBCb25nIDxsb2JAa3VsdGhlYS5zdGFja2VuLmt0aC5zZT5dCgogICopIEdldCB0aGUgV2luMzIgY29tcGlsZSB3b3JraW5nIGFnYWluLiBNb2RpZnkgbWtkZWYucGwgc28gaXQgY2FuIGhhbmRsZQogICAgIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBmdW5jdGlvbiBwb2ludGVycyBhbmQgaGFzIHN1cHBvcnQgZm9yIE5UIHNwZWNpZmljCiAgICAgc3R1ZmYuIEZpeCBtazFtZi5wbCBhbmQgVkMtMzIucGwgdG8gc3VwcG9ydCBOVCBkaWZmZXJlbmNlcyBhbHNvLiBWYXJpb3VzCiAgICAgI2lmZGVmIFdJTjMyIGFuZCBXSU5OVHMgc3ByaW5rbGVkIGFib3V0IHRoZSBwbGFjZSBhbmQgc29tZSBjaGFuZ2VzIGZyb20KICAgICB1bnNpZ25lZCB0byBzaWduZWQgdHlwZXM6IHRoaXMgd2FzIGtpbGxpbmcgdGhlIFdpbjMyIGNvbXBpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBjZXJ0aWZpY2F0ZSBmaWxlIHRvIHN0YWNrIGZ1bmN0aW9ucywKICAgICBTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKCkgYW5kCiAgICAgU1NMX2FkZF9maWxlX2NlcnRfc3ViamVjdHNfdG9fc3RhY2soKS4gIFRoZXNlIGxhcmdlbHkgc3VwcGxhbnQKICAgICBTU0xfbG9hZF9jbGllbnRfQ0FfZmlsZSgpLCBhbmQgY2FuIGJlIHVzZWQgdG8gYWRkIG11bHRpcGxlIGNlcnRzIGVhc2lseQogICAgIHRvIGEgc3RhY2sgKHVzdWFsbHkgdGhpcyBpcyB0aGVuIGhhbmRlZCB0byBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdCgpKS4KICAgICBUaGlzIG1lYW5zIHRoYXQgQXBhY2hlLVNTTCBhbmQgc2ltaWxhciBwYWNrYWdlcyBkb24ndCBoYXZlIHRvIG1lc3MgYXJvdW5kCiAgICAgdG8gYWRkIGFzIG1hbnkgQ0FzIGFzIHRoZXkgd2FudCB0byB0aGUgcHJlZmVycmVkIGxpc3QuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEV4cGVyaW1lbnQgd2l0aCBkb3h5Z2VuIGRvY3VtZW50YXRpb24uIEN1cnJlbnRseSBvbmx5IHBhcnRpYWxseSBhcHBsaWVkIHRvCiAgICAgc3NsL3NzbF9saWIuYy4KICAgICBTZWUgaHR0cDovL3d3dy5zdGFjay5ubC9+ZGltaXRyaS9kb3h5Z2VuL2luZGV4Lmh0bWwsIGFuZCBydW4gZG94eWdlbiB3aXRoCiAgICAgb3BlbnNzbC5kb3h5IGFzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCiAgICAgW0JlbiBMYXVyaWVdCiAgCiAgKikgR2V0IHJpZCBvZiByZW1haW5pbmcgQysrLXN0eWxlIGNvbW1lbnRzIHdoaWNoIHN0cmljdCBDIGNvbXBpbGVycyBoYXRlLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBwb2ludGVkIG91dCBieSBDYXJsb3MgQW1lbmd1YWxdCgogICopIENoYW5nZWQgQk5fUkVDVVJTSU9OIGluIGJuX21vbnQuYyB0byBCTl9SRUNVUlNJT05fTU9OVCBzbyBpdCBpcyBub3QKICAgICBjb21waWxlZCBpbiBieSBkZWZhdWx0OiBpdCBoYXMgcHJvYmxlbXMgd2l0aCBsYXJnZSBrZXlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGJ1bmNoIG9mIFNTTF94eHgoKSBmdW5jdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSB0ZW1wb3JhcnkgUlNBIGFuZAogICAgIERIIHByaXZhdGUga2V5cyBhbmQvb3IgY2FsbGJhY2sgZnVuY3Rpb25zIHdoaWNoIGRpcmVjdGx5IGNvcnJlc3BvbmQgdG8KICAgICB0aGVpciBTU0xfQ1RYX3h4eCgpIGNvdW50ZXJwYXJ0cyBidXQgd29yayBvbiBhIHBlci1jb25uZWN0aW9uIGJhc2lzLiBUaGlzCiAgICAgaXMgbmVlZGVkIGZvciBhcHBsaWNhdGlvbnMgd2hpY2ggaGF2ZSB0byBjb25maWd1cmUgY2VydGlmaWNhdGVzIG9uIGEKICAgICBwZXItY29ubmVjdGlvbiBiYXNpcyAoZS5nLiBBcGFjaGUrbW9kX3NzbCkgaW5zdGVhZCBvZiBhIHBlci1jb250ZXh0IGJhc2lzCiAgICAgKGUuZy4gc19zZXJ2ZXIpLiAKICAgICAgICBGb3IgdGhlIFJTQSBjZXJ0aWZpY2F0ZSBzaXR1YXRpb24gaXMgbWFrZXMgbm8gZGlmZmVyZW5jZSwgYnV0CiAgICAgZm9yIHRoZSBEU0EgY2VydGlmaWNhdGUgc2l0dWF0aW9uIHRoaXMgZml4ZXMgdGhlICJubyBzaGFyZWQgY2lwaGVyIgogICAgIHByb2JsZW0gd2hlcmUgdGhlIE9wZW5TU0wgY2lwaGVyIHNlbGVjdGlvbiBwcm9jZWR1cmUgZmFpbGVkIGJlY2F1c2UgdGhlCiAgICAgdGVtcG9yYXJ5IGtleXMgd2VyZSBub3Qgb3ZlcnRha2VuIGZyb20gdGhlIGNvbnRleHQgYW5kIHRoZSBBUEkgcHJvdmlkZWQKICAgICBubyB3YXkgdG8gcmVjb25maWd1cmUgdGhlbS4gCiAgICAgICAgVGhlIG5ldyBmdW5jdGlvbnMgbm93IGxldCBhcHBsaWNhdGlvbnMgcmVjb25maWd1cmUgdGhlIHN0dWZmIGFuZCB0aGV5CiAgICAgYXJlIGluIGRldGFpbDogU1NMX25lZWRfdG1wX1JTQSwgU1NMX3NldF90bXBfcnNhLCBTU0xfc2V0X3RtcF9kaCwKICAgICBTU0xfc2V0X3RtcF9yc2FfY2FsbGJhY2sgYW5kIFNTTF9zZXRfdG1wX2RoX2NhbGxiYWNrLiAgQWRkaXRpb25hbGx5IGEgbmV3CiAgICAgbm9uLXB1YmxpYy1BUEkgZnVuY3Rpb24gc3NsX2NlcnRfaW5zdGFudGlhdGUoKSBpcyB1c2VkIGFzIGEgaGVscGVyCiAgICAgZnVuY3Rpb24gYW5kIGFsc28gdG8gcmVkdWNlIGNvZGUgcmVkdW5kYW5jeSBpbnNpZGUgc3NsX3JzYS5jLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBNb3ZlIHNfc2VydmVyIC1kY2VydCBhbmQgLWRrZXkgb3B0aW9ucyBvdXQgb2YgdGhlIHVuZG9jdW1lbnRlZCBmZWF0dXJlCiAgICAgYXJlYSBiZWNhdXNlIHRoZXkgYXJlIHVzZWZ1bCBmb3IgdGhlIERTQSBzaXR1YXRpb24gYW5kIHNob3VsZCBiZQogICAgIHJlY29nbml6ZWQgYnkgdGhlIHVzZXJzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggdGhlIGNpcGhlciBkZWNpc2lvbiBzY2hlbWUgZm9yIGV4cG9ydCBjaXBoZXJzOiB0aGUgZXhwb3J0IGJpdHMgYXJlCiAgICAgKm5vdCogd2l0aGluIFNTTF9NS0VZX01BU0sgb3IgU1NMX0FVVEhfTUFTSywgdGhleSBhcmUgd2l0aGluCiAgICAgU1NMX0VYUF9NQVNLLiAgU28sIHRoZSBvcmlnaW5hbCB2YXJpYWJsZSBoYXMgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZQogICAgIGFscmVhZHkgbWFza2VkIHZhcmlhYmxlLgogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQoKICAqKSBGaXggJ3BvcnQnIHZhcmlhYmxlIGZyb20gYGludCcgdG8gYHVuc2lnbmVkIGludCcgaW4gY3J5cHRvL2Jpby9iX3NvY2suYwogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQoKICAqKSBDaGFuZ2UgdHlwZSBvZiBhbm90aGVyIG1kX2xlbiB2YXJpYWJsZSBpbiBwazdfZG9pdC5jOlBLQ1M3X2RhdGFGaW5hbCgpCiAgICAgZnJvbSBgaW50JyB0byBgdW5zaWduZWQgaW50JyBiZWNhdXNlIGl0J3MgYSBsZW5ndGggYW5kIGluaXRpYWxpemVkIGJ5CiAgICAgRVZQX0RpZ2VzdEZpbmFsKCkgd2hpY2ggZXhwZWN0cyBhbiBgdW5zaWduZWQgaW50IConLgogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQoKICAqKSBEb24ndCBoYXJkLWNvZGUgcGF0aCB0byBQZXJsIGludGVycHJldGVyIG9uIHNoZWJhbmcgbGluZSBvZiBDb25maWd1cmUKICAgICBzY3JpcHQuIEluc3RlYWQgdXNlIHRoZSB1c3VhbCBTaGVsbC0+UGVybCB0cmFuc2l0aW9uIHRyaWNrLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBNYWtlIGBvcGVuc3NsIHg1MDkgLW5vb3V0IC1tb2R1bHVzJyBmdW5jdGlvbmFsIGFsc28gZm9yIERTQSBjZXJ0aWZpY2F0ZXMKICAgICAoaW4gYWRkaXRpb24gdG8gUlNBIGNlcnRpZmljYXRlcykgdG8gbWF0Y2ggdGhlIGJlaGF2aW91ciBvZiBgb3BlbnNzbCBkc2EKICAgICAtbm9vdXQgLW1vZHVsdXMnIGFzIGl0J3MgYWxyZWFkeSB0aGUgY2FzZSBmb3IgYG9wZW5zc2wgcnNhIC1ub291dAogICAgIC1tb2R1bHVzJy4gIEZvciBSU0EgdGhlIC1tb2R1bHVzIGlzIHRoZSByZWFsICJtb2R1bHVzIiB3aGlsZSBmb3IgRFNBCiAgICAgY3VycmVudGx5IHRoZSBwdWJsaWMga2V5IGlzIHByaW50ZWQgKGEgZGVjaXNpb24gd2hpY2ggd2FzIGFscmVhZHkgZG9uZSBieQogICAgIGBvcGVuc3NsIGRzYSAtbW9kdWx1cycgaW4gdGhlIHBhc3QpIHdoaWNoIHNlcnZlcyBhIHNpbWlsYXIgcHVycG9zZS4KICAgICBBZGRpdGlvbmFsbHkgdGhlIE5PX1JTQSBubyBsb25nZXIgY29tcGxldGVseSByZW1vdmVzIHRoZSB3aG9sZSAtbW9kdWx1cwogICAgIG9wdGlvbjsgaXQgbm93IG9ubHkgYXZvaWRzIHVzaW5nIHRoZSBSU0Egc3R1ZmYuIFNhbWUgYXBwbGllcyB0byBOT19EU0EKICAgICBub3csIHRvby4KICAgICBbUmFsZiBTLiAgRW5nZWxzY2hhbGxdCgogICopIEFkZCBBcm5lIEFuc3BlcidzIHJlbGlhYmxlIEJJTyAtIHRoaXMgaXMgYW4gZW5jcnlwdGVkLCBibG9jay1kaWdlc3RlZAogICAgIEJJTy4gU2VlIHRoZSBzb3VyY2UgKGNyeXB0by9ldnAvYmlvX29rLmMpIGZvciBtb3JlIGluZm8uCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIER1bXAgdGhlIG9sZCB5dWNreSByZXEgY29kZSB0aGF0IHRyaWVkIChhbmQgZmFpbGVkKSB0byBhbGxvdyByYXcgT0lEcwogICAgIHRvIGJlIGFkZGVkLiBOb3cgYm90aCAncmVxJyBhbmQgJ2NhJyBjYW4gdXNlIG5ldyBvYmplY3RzIGRlZmluZWQgaW4gdGhlCiAgICAgY29uZmlnIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvb2wgQklPIHRoYXQgZG9lcyBzeXNsb2cgKG9yIGV2ZW50IGxvZyBvbiBOVCkuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT4sIGludGVncmF0ZWQgYnkgQmVuIExhdXJpZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIG5ldyBUTFMgY2lwaGVyc3VpdGVzLCBUTFNfUlNBX0VYUE9SVDU2X1dJVEhfUkM0XzU2X01ENSwKICAgICBUTFNfUlNBX0VYUE9SVDU2X1dJVEhfUkMyX0NCQ181Nl9NRDUgYW5kCiAgICAgVExTX1JTQV9FWFBPUlQ1Nl9XSVRIX0RFU19DQkNfU0hBLCBhcyBzcGVjaWZpZWQgaW4gIjU2LWJpdCBFeHBvcnQgQ2lwaGVyCiAgICAgU3VpdGVzIEZvciBUTFMiLCBkcmFmdC1pZXRmLXRscy01Ni1iaXQtY2lwaGVyc3VpdGVzLTAwLnR4dC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIHByZWxpbWluYXJ5IGNvbmZpZyBpbmZvIGZvciBuZXcgZXh0ZW5zaW9uIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBSU0FfTk9fUEFERElORyByZWFsbHkgdXNlIG5vIHBhZGRpbmcuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBHZW5lcmF0ZSBlcnJvcnMgd2hlbiBwcml2YXRlL3B1YmxpYyBrZXkgY2hlY2sgaXMgZG9uZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgT3ZlcmhhdWwgZm9yICdjcmwnIHV0aWxpdHkuIE5ldyBmdW5jdGlvbiBYNTA5X0NSTF9wcmludC4gUGFydGlhbCBzdXBwb3J0CiAgICAgZm9yIHNvbWUgQ1JMIGV4dGVuc2lvbnMgYW5kIG5ldyBvYmplY3RzIGFkZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlYWxseSBmaXggdGhlIEFTTjEgSU1QTElDSVQgYnVnIHRoaXMgdGltZS4uLiBQYXJ0aWFsIHN1cHBvcnQgZm9yIHByaXZhdGUKICAgICBrZXkgdXNhZ2UgZXh0ZW5zaW9uIGFuZCBmdWxsZXIgc3VwcG9ydCBmb3IgYXV0aG9yaXR5IGtleSBpZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgT0FFUCBlbmNyeXB0aW9uIGZvciB0aGUgT3BlblNTTCBjcnlwdG8gbGlicmFyeS4gT0FFUCBpcyB0aGUgaW1wcm92ZWQKICAgICBwYWRkaW5nIG1ldGhvZCBmb3IgUlNBLCB3aGljaCBpcyByZWNvbW1lbmRlZCBmb3IgbmV3IGFwcGxpY2F0aW9ucyBpbiBQS0NTCiAgICAgIzEgdjIuMCAoUkZDIDI0MzcsIE9jdG9iZXIgMTk5OCkuCiAgICAgT0FFUCAoT3B0aW1hbCBBc3ltbWV0cmljIEVuY3J5cHRpb24gUGFkZGluZykgaGFzIGJldHRlciB0aGVvcmV0aWNhbAogICAgIGZvdW5kYXRpb25zIHRoYW4gdGhlIGFkLWhvYyBwYWRkaW5nIHVzZWQgaW4gUEtDUyAjMSB2MS41LiBJdCBpcyBzZWN1cmUKICAgICBhZ2FpbnN0IEJsZWljaGJhY2hlcidzIGF0dGFjayBvbiBSU0EuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+LCByZWZvcm1hdHRlZCwgY29ycmVjdGVkIGFuZCBpbnRlZ3JhdGVkIGJ5CiAgICAgIEJlbiBMYXVyaWVdCgogICopIFVwZGF0ZXMgdG8gdGhlIG5ldyBTU0wgY29tcHJlc3Npb24gY29kZQogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIEZpeCBzbyB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlciBpbiB0aGUgbWFzdGVyIHNlY3JldCwgd2hlbiBwYXNzZWQKICAgICB2aWEgUlNBLCBjaGVja3MgdGhhdCBpZiBUTFMgd2FzIHByb3Bvc2VkLCBidXQgd2Ugcm9sbCBiYWNrIHRvIFNTTHYzCiAgICAgKGJlY2F1c2UgdGhlIHNlcnZlciB3aWxsIG5vdCBhY2NlcHQgaGlnaGVyKSwgdGhhdCB0aGUgdmVyc2lvbiBudW1iZXIKICAgICBpcyAweDAzLDB4MDEsIG5vdCAweDAzLDB4MDAKICAgICBbRXJpYyBBLiBZb3VuZywgKGZyb20gY2hhbmdlcyB0byBDMk5ldCBTU0xlYXksIGludGVncmF0ZWQgYnkgTWFyayBDb3gpXQoKICAqKSBSdW4gZXh0ZW5zaXZlIG1lbW9yeSBsZWFrIGNoZWNrcyBvbiBTU0wgYXBwcy4gRml4ZWQgKmxvdHMqIG9mIG1lbW9yeQogICAgIGxlYWtzIGluIHNzbC8gcmVsYXRpbmcgdG8gbmV3IFg1MDlfZ2V0X3B1YmtleSgpIGJlaGF2aW91ci4gQWxzbyBmaXhlcwogICAgIGluIGFwcHMvIGFuZCBhbiB1bnJlbGF0ZWQgbGVhayBpbiBjcnlwdG8vZHNhL2RzYV92cmYuYwogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIFJBVyBleHRlbnNpb25zIHdoZXJlIGFuIGFyYml0cmFyeSBleHRlbnNpb24gY2FuIGJlCiAgICAgY3JlYXRlZCBieSBpbmNsdWRpbmcgaXRzIERFUiBlbmNvZGluZy4gU2VlIGFwcHMvb3BlbnNzbC5jbmYgZm9yCiAgICAgYW4gZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHN1cmUgbGF0ZXN0IFBlcmwgdmVyc2lvbnMgZG9uJ3QgaW50ZXJwcmV0IHNvbWUgZ2VuZXJhdGVkIEMgYXJyYXkKICAgICBjb2RlIGFzIFBlcmwgYXJyYXkgY29kZSBpbiB0aGUgY3J5cHRvL2Vyci9lcnJfZ2VuYy5wbCBzY3JpcHQuCiAgICAgW0xhcnMgV2ViZXIgPDN3ZWJlckBpbmZvcm1hdGlrLnVuaS1oYW1idXJnLmRlPl0KCiAgKikgTW9kaWZ5IG1zL2RvX21zLmJhdCB0byBub3QgZ2VuZXJhdGUgYXNzZW1ibHkgbGFuZ3VhZ2UgbWFrZWZpbGVzIHNpbmNlCiAgICAgbm90IG1hbnkgcGVvcGxlIGhhdmUgdGhlIGFzc2VtYmxlci4gVmFyaW91cyBXaW4zMiBjb21waWxhdGlvbiBmaXhlcyBhbmQKICAgICB1cGRhdGUgdG8gdGhlIElOU1RBTEwuVzMyIGZpbGUgd2l0aCAoaG9wZWZ1bGx5KSBtb3JlIGFjY3VyYXRlIFdpbjMyCiAgICAgYnVpbGQgaW5zdHJ1Y3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSBjb25maWd1cmUgc2NyaXB0ICdDb25maWd1cmUnIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGNyeXB0by9kYXRlLmgKICAgICBmaWxlIHVuZGVyIFdpbjMyIGFuZCBhbHNvIGJ1aWxkIHBlbS5oIGZyb20gcGVtLm9yZy4gTmV3IHNjcmlwdAogICAgIHV0aWwvbWtmaWxlcy5wbCB0byBjcmVhdGUgdGhlIE1JTkZPIGZpbGUgb24gZW52aXJvbm1lbnRzIHRoYXQgY2FuJ3QgZG8gYQogICAgICdtYWtlIGZpbGVzJzogcGVybCB1dGlsL21rZmlsZXMucGwgPk1JTkZPIHNob3VsZCB3b3JrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ham9yIHJld29yayBvZiBERVMgZnVuY3Rpb24gZGVjbGFyYXRpb25zLCBpbiB0aGUgcHVyc3VpdCBvZiBjb3JyZWN0bmVzcwogICAgIGFuZCBwdXJpdHkuIEFzIGEgcmVzdWx0LCBtYW55IGV2aWwgY2FzdHMgZXZhcG9yYXRlZCwgYW5kIHNvbWUgd2VpcmRuZXNzLAogICAgIHRvby4gWW91IG1heSBmaW5kIHRoaXMgY2F1c2VzIHdhcm5pbmdzIGluIHlvdXIgY29kZS4gWmFwcGluZyB5b3VyIGV2aWwKICAgICBjYXN0cyB3aWxsIHByb2JhYmx5IGZpeCB0aGVtLiBNb3N0bHkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCBmb3IgYSB0eXBvIGluIGFzbjEuaC4gQnVnIGZpeCB0byBvYmplY3QgY3JlYXRpb24gc2NyaXB0CiAgICAgb2JqX2RhdC5wbC4gSXQgY29uc2lkZXJlZCBhIHplcm8gaW4gYW4gb2JqZWN0IGRlZmluaXRpb24gdG8gbWVhbgogICAgICJlbmQgb2Ygb2JqZWN0Ijogbm9uZSBvZiB0aGUgb2JqZWN0cyBpbiBvYmplY3RzLmggaGF2ZSBhbnkgemVyb3MKICAgICBzbyBpdCB3YXNuJ3Qgc3BvdHRlZC4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBFcndhbm4gQUJBTEVBIDxlYWJhbGVhQGNlcnRwbHVzLmNvbT5dCgogICopIEFkZCBzdXBwb3J0IGZvciBUcmlwbGUgREVTIENpcGhlciBCbG9jayBDaGFpbmluZyB3aXRoIE91dHB1dCBGZWVkYmFjawogICAgIE1hc2tpbmcgKENCQ00pLiBJbiB0aGUgYWJzZW5jZSBvZiB0ZXN0IHZlY3RvcnMsIHRoZSBiZXN0IEkgaGF2ZSBiZWVuIGFibGUKICAgICB0byBkbyBpcyBjaGVjayB0aGF0IHRoZSBkZWNyeXB0IHVuZG9lcyB0aGUgZW5jcnlwdCwgc28gZmFyLiBTZW5kIG1lIHRlc3QKICAgICB2ZWN0b3JzIGlmIHlvdSBoYXZlIHRoZW0uCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENvcnJlY3QgY2FsY3VsYXRpb24gb2Yga2V5IGxlbmd0aCBmb3IgZXhwb3J0IGNpcGhlcnMgKHRvbyBtdWNoIHNwYWNlIHdhcwogICAgIGFsbG9jYXRlZCBmb3IgbnVsbCBjaXBoZXJzKS4gVGhpcyBoYXMgbm90IGJlZW4gdGVzdGVkIQogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNb2RpZmljYXRpb25zIHRvIHRoZSBta2RlZi5wbCBmb3IgV2luMzIgREVGIGZpbGUgY3JlYXRpb24uIFRoZSB1c2FnZQogICAgIG1lc3NhZ2UgaXMgbm93IGNvcnJlY3QgKGl0IHVuZGVyc3RhbmRzICJjcnlwdG8iIGFuZCAic3NsIiBvbiBpdHMKICAgICBjb21tYW5kIGxpbmUpLiBUaGVyZSBpcyBhbHNvIG5vdyBhbiAidXBkYXRlIiBvcHRpb24uIFRoaXMgd2lsbCB1cGRhdGUKICAgICB0aGUgdXRpbC9zc2xlYXkubnVtIGFuZCB1dGlsL2xpYmVheS5udW0gZmlsZXMgd2l0aCBhbnkgbmV3IGZ1bmN0aW9ucy4KICAgICBJZiB5b3UgZG8gYTogCiAgICAgcGVybCB1dGlsL21rZGVmLnBsIGNyeXB0byBzc2wgdXBkYXRlCiAgICAgaXQgd2lsbCB1cGRhdGUgdGhlbS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBPdmVyaGF1bGVkIHRoZSBQZXJsIGludGVyZmFjZSAocGVybC8qKToKICAgICAtIHBvcnRlZCBCTiBzdHVmZiB0byBPcGVuU1NMJ3MgZGlmZmVyZW50IEJOIGxpYnJhcnkKICAgICAtIG1hZGUgdGhlIHBlcmwvIHNvdXJjZSB0cmVlIENWUy1hd2FyZQogICAgIC0gcmVuYW1lZCB0aGUgcGFja2FnZSBmcm9tIFNTTGVheSB0byBPcGVuU1NMICh0aGUgZmlsZXMgc3RpbGwgY29udGFpbgogICAgICAgdGhlaXIgaGlzdG9yeSBiZWNhdXNlIEkndmUgY29waWVkIHRoZW0gaW4gdGhlIHJlcG9zaXRvcnkpCiAgICAgLSByZW1vdmVkIG9ic29sZXRlIGZpbGVzICh0aGUgdGVzdCBzY3JpcHRzIHdpbGwgYmUgcmVwbGFjZWQKICAgICAgIGJ5IGJldHRlciBUZXN0OjpIYXJuZXNzIHZhcmlhbnRzIGluIHRoZSBmdXR1cmUpCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpcnN0IGN1dCBmb3IgYSB2ZXJ5IGNvbnNlcnZhdGl2ZSBzb3VyY2UgdHJlZSBjbGVhbnVwOgogICAgIDEuIG1lcmdlIHZhcmlvdXMgb2Jzb2xldGUgcmVhZG1lIHRleHRzIGludG8gZG9jL3NzbGVheS50eHQKICAgICB3aGVyZSB3ZSBjb2xsZWN0IHRoZSBvbGQgZG9jdW1lbnRzIGFuZCByZWFkbWUgdGV4dHMuCiAgICAgMi4gcmVtb3ZlIHRoZSBmaXJzdCBwYXJ0IG9mIGZpbGVzIHdoZXJlIEknbSBhbHJlYWR5IHN1cmUgdGhhdCB3ZSBubwogICAgIGxvbmdlciBuZWVkIHRoZW0gYmVjYXVzZSBvZiB0aHJlZSByZWFzb25zOiBlaXRoZXIgdGhleSBhcmUganVzdCB0ZW1wb3JhcnkKICAgICBmaWxlcyB3aGljaCB3ZXJlIGxlZnQgYnkgRXJpYyBvciB0aGV5IGFyZSBwcmVzZXJ2ZWQgb3JpZ2luYWwgZmlsZXMgd2hlcmUKICAgICBJJ3ZlIHZlcmlmaWVkIHRoYXQgdGhlIGRpZmYgaXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIENWUyB2aWEgImN2cyBkaWZmCiAgICAgLXJTU0xlYXlfMF84XzFiIiBvciB0aGV5IHdlcmUgcmVuYW1lZCAoYXMgaXQgd2FzIGRlZmluaXRlbHkgdGhlIGNhc2UgZm9yCiAgICAgdGhlIGNyeXB0by9tZC8gc3R1ZmYpLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBNb3JlIGV4dGVuc2lvbiBjb2RlLiBJbmNvbXBsZXRlIHN1cHBvcnQgZm9yIHN1YmplY3QgYW5kIGlzc3VlciBhbHQKICAgICBuYW1lLCBpc3N1ZXIgYW5kIGF1dGhvcml0eSBrZXkgaWQuIENoYW5nZSB0aGUgaTJ2IGZ1bmN0aW9uIHBhcmFtZXRlcnMKICAgICBhbmQgYWRkIGFuIGV4dHJhICdjcmwnIHBhcmFtZXRlciBpbiB0aGUgWDUwOVYzX0NUWCBzdHJ1Y3R1cmU6IGd1ZXNzCiAgICAgd2hhdCB0aGF0J3MgZm9yIDotKSBGaXggdG8gQVNOMSBtYWNybyB3aGljaCBtZXNzZWQgdXAKICAgICBJTVBMSUNJVCB0YWcgYW5kIGFkZCBmX2VudW0uYyB3aGljaCBhZGRzIGEyaSwgaTJhIGZvciBFTlVNRVJBVEVELgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIEVOVU1FUkFURUQgdHlwZS4gVGhpcyBpcyBsYXJnZWx5IGNvcGllZCBmcm9tIHRoZQogICAgIElOVEVHRVIgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGZ1bmN0aW9uLCBFVlBfTURfQ1RYX2NvcHkoKSB0byByZXBsYWNlIGZyZXF1ZW50IHVzZSBvZiBtZW1jcHkuCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgTWFrZSBzdXJlIGBtYWtlIHJlaGFzaCcgdGFyZ2V0IHJlYWxseSBmaW5kcyB0aGUgYG9wZW5zc2wnIHByb2dyYW0uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIE1hdHRoaWFzIExvZXBmZSA8TWF0dGhpYXMuTG9lcGZlQGFkbm92dW0uY2g+XQoKICAqKSBTcXVlZXplIGFub3RoZXIgNyUgb2Ygc3BlZWQgb3V0IG9mIE1ENSBhc3NlbWJsZXIsIGF0IGxlYXN0IG9uIGEgUDIuIEknZAogICAgIGxpa2UgdG8gaGVhciBhYm91dCBpdCBpZiB0aGlzIHNsb3dzIGRvd24gb3RoZXIgcHJvY2Vzc29ycy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIEN5Z1dpbjMyIHBsYXRmb3JtIGluZm9ybWF0aW9uIHRvIENvbmZpZ3VyZSBzY3JpcHQuCiAgICAgW0FsYW4gQmF0aWUgPGJhdGllQGFhaHouamYuaW50ZWwuY29tPl0KCiAgKikgRml4ZWQgbXMvMzJhbGwuYmF0IHNjcmlwdDogYG5vX2FzbScgLT4gYG5vLWFzbScKICAgICBbUmFpbmVyIFcuIEdlcmxpbmcgPGdlcmxpbmdAbXBnLWd2Lm1wZy5kZT5dCiAgCiAgKikgTmV3IHByb2dyYW0gbnNlcSB0byBtYW5pcHVsYXRlIG5ldHNjYXBlIGNlcnRpZmljYXRlIHNlcXVlbmNlcwogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSBjcmwycGtjczcgc28gaXQgc3VwcG9ydHMgbXVsdGlwbGUgLWNlcnRmaWxlIGFyZ3VtZW50cy4gRml4IGEKICAgICBmZXcgdHlwb3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgdG8gQk4gY29kZS4gIFByZXZpb3VzbHkgdGhlIGRlZmF1bHQgd2FzIHRvIGRlZmluZSBCTl9SRUNVUlNJT04KICAgICBidXQgdGhlIEJOIGNvZGUgaGFkIHNvbWUgcHJvYmxlbXMgdGhhdCB3b3VsZCBjYXVzZSBmYWlsdXJlcyB3aGVuCiAgICAgZG9pbmcgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGFuZCBzb21lIG90aGVyIGZ1bmN0aW9ucy4KICAgICBbRXJpYyBBLiBZb3VuZywgKGZyb20gY2hhbmdlcyB0byBDMk5ldCBTU0xlYXksIGludGVncmF0ZWQgYnkgTWFyayBDb3gpXQoKICAqKSBBZGQgQVNOMSBhbmQgUEVNIGNvZGUgdG8gc3VwcG9ydCBuZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEFTTjEgYW5kIFBFTSBjb2RlIHRvIHN1cHBvcnQgbmV0c2NhcGUgY2VydGlmaWNhdGUgc2VxdWVuY2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzZXZlcmFsIFBLSVggYW5kIHByaXZhdGUgZXh0ZW5kZWQga2V5IHVzYWdlIE9JRHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSAnY2EnIHByb2dyYW0gdG8gaGFuZGxlIHRoZSBuZXcgZXh0ZW5zaW9uIGNvZGUuIE1vZGlmeQogICAgIG9wZW5zc2wuY25mIGZvciBuZXcgZXh0ZW5zaW9uIGZvcm1hdCwgYWRkIGNvbW1lbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vcmUgWDUwOSBWMyBjaGFuZ2VzLiBGaXggdHlwbyBpbiB2M19iaXRzdHIuYy4gQWRkIHN1cHBvcnQgdG8gJ3JlcScKICAgICBhbmQgYWRkIGEgc2FtcGxlIHRvIG9wZW5zc2wuY25mIHNvIHJlcSAteDUwOSBub3cgYWRkcyBhcHByb3ByaWF0ZQogICAgIENBIGV4dGVuc2lvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29udGludWVkIFg1MDkgVjMgY2hhbmdlcy4gQWRkIHRvIG90aGVyIG1ha2VmaWxlcywgaW50ZWdyYXRlIHdpdGggdGhlCiAgICAgZXJyb3IgY29kZSwgYWRkIGluaXRpYWwgc3VwcG9ydCB0byBYNTA5X3ByaW50KCkgYW5kIHg1MDkgYXBwbGljYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVGFrZXMgYSBkZWVwIGJyZWF0aCBhbmQgc3RhcnQgYWRkaW5nIFg1MDkgVjMgZXh0ZW5zaW9uIHN1cHBvcnQgY29kZS4gQWRkCiAgICAgZmlsZXMgaW4gY3J5cHRvL3g1MDl2My4gTW92ZSBvcmlnaW5hbCBzdHVmZiB0byBjcnlwdG8veDUwOXYzL29sZC4gQWxsIHRoaXMKICAgICBzdHVmZiBpcyBjdXJyZW50bHkgaXNvbGF0ZWQgYW5kIGlzbid0IGV2ZW4gY29tcGlsZWQgeWV0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnRpbnVpbmcgcGF0Y2hlcyBmb3IgR2VuZXJhbGl6ZWRUaW1lLiBGaXggdXAgY2VydGlmaWNhdGUgYW5kIENSTAogICAgIEFTTjEgdG8gdXNlIEFTTjFfVElNRSBhbmQgbW9kaWZ5IHByaW50IHJvdXRpbmVzIHRvIHVzZSBBU04xX1RJTUVfcHJpbnQuCiAgICAgUmVtb3ZlZCB0aGUgdmVyc2lvbnMgY2hlY2sgZnJvbSBYNTA5IHJvdXRpbmVzIHdoZW4gbG9hZGluZyBleHRlbnNpb25zOgogICAgIHRoaXMgYWxsb3dzIGNlcnRhaW4gYnJva2VuIGNlcnRpZmljYXRlcyB0aGF0IGRvbid0IHNldCB0aGUgdmVyc2lvbgogICAgIHByb3Blcmx5IHRvIGJlIHByb2Nlc3NlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEZWFsIHdpdGggaXJyaXRhdGluZyBzaGl0IHRvIGRvIHdpdGggZGVwZW5kZW5jaWVzLCBpbiBZQUFIVyAoWWV0IEFub3RoZXIKICAgICBBZCBIb2MgV2F5KSAtIE1ha2VmaWxlLnNzbHMgbm93IGFsbCBjb250YWluIGxvY2FsIGRlcGVuZGVuY2llcywgd2hpY2gKICAgICBjYW4gc3RpbGwgYmUgcmVnZW5lcmF0ZWQgd2l0aCAibWFrZSBkZXBlbmQiLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTcGVsbGluZyBtaXN0YWtlIGluIEMgdmVyc2lvbiBvZiBDQVNULTEyOC4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgYnkgSmVyZW15IEh5bHRvbiA8amVyZW15QGNucmkucmVzdG9uLnZhLnVzPl0KCiAgKikgQ2hhbmdlcyB0byB0aGUgZXJyb3IgZ2VuZXJhdGlvbiBjb2RlLiBUaGUgcGVybCBzY3JpcHQgZXJyLWNvZGUucGwgCiAgICAgbm93IHJlYWRzIGluIHRoZSBvbGQgZXJyb3IgY29kZXMgYW5kIHJldGFpbnMgdGhlIG9sZCBudW1iZXJzLCBvbmx5CiAgICAgYWRkaW5nIG5ldyBvbmVzIGlmIG5lY2Vzc2FyeS4gSXQgYWxzbyBvbmx5IGNoYW5nZXMgdGhlIC5lcnIgZmlsZXMgaWYgbmV3CiAgICAgY29kZXMgYXJlIGFkZGVkLiBUaGUgbWFrZWZpbGVzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBvbmx5IGluc2VydCBlcnJvcnMKICAgICB3aGVuIG5lZWRlZCAodG8gYXZvaWQgbmVlZGxlc3NseSBtb2RpZnlpbmcgaGVhZGVyIGZpbGVzKS4gVGhpcyBpcyBkb25lCiAgICAgYnkgb25seSBpbnNlcnRpbmcgZXJyb3JzIGlmIHRoZSAuZXJyIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgYXV0byBnZW5lcmF0ZWQKICAgICBDIGZpbGUuIFRvIHJlYnVpbGQgYWxsIHRoZSBlcnJvciBjb2RlcyBmcm9tIHNjcmF0Y2ggKHRoZSBvbGQgYmVoYXZpb3VyKQogICAgIGVpdGhlciBtb2RpZnkgY3J5cHRvL01ha2VmaWxlLnNzbCB0byBwYXNzIHRoZSAtcmVnZW4gZmxhZyB0byBlcnJfY29kZS5wbAogICAgIG9yIGRlbGV0ZSBhbGwgdGhlIC5lcnIgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ0FTVC0xMjggd2FzIGluY29ycmVjdGx5IGltcGxlbWVudGVkIGZvciBzaG9ydCBrZXlzLiBUaGUgQyB2ZXJzaW9uIGhhcwogICAgIGJlZW4gZml4ZWQsIGJ1dCBpcyB1bnRlc3RlZC4gVGhlIGFzc2VtYmxlciB2ZXJzaW9ucyBhcmUgYWxzbyBmaXhlZCwgYnV0CiAgICAgbmV3IGFzc2VtYmxlciBIQVMgTk9UIEJFRU4gR0VORVJBVEVEIEZPUiBXSU4zMiAtIHRoZSBNYWtlZmlsZSBuZWVkcyBmaXhpbmcKICAgICB0byByZWdlbmVyYXRlIGl0IGlmIG5lZWRlZC4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgKHdpdGggZml4IGZvciBDIHZlcnNpb24pIGJ5IEp1bi1pY2hpcm8gaXRvanVuCiAgICAgIEhhZ2lubyA8aXRvanVuQGthbWUubmV0Pl0KCiAgKikgRmlsZSB3YXMgb3BlbmVkIGluY29ycmVjdGx5IGluIHJhbmRmaWxlLmMuCiAgICAgW1VsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEJlZ2lubmluZyBvZiBzdXBwb3J0IGZvciBHZW5lcmFsaXplZFRpbWUuIGQyaSwgaTJkLCBjaGVjayBhbmQgcHJpbnQKICAgICBmdW5jdGlvbnMuIEFsc28gQVNOMV9USU1FIHN1aXRlIHdoaWNoIGlzIGEgQ0hPSUNFIG9mIFVUQ1RpbWUgb3IKICAgICBHZW5lcmFsaXplZFRpbWUuIEFTTjFfVElNRSBpcyB0aGUgcHJvcGVyIHR5cGUgdXNlZCBpbiBjZXJ0aWZpY2F0ZXMgZXQKICAgICBhbDogaXQncyBqdXN0IGFsbW9zdCBhbHdheXMgYSBVVENUaW1lLiBOb3RlIHRoaXMgcGF0Y2ggYWRkcyBuZXcgZXJyb3IKICAgICBjb2RlcyBzbyBkbyBhICJtYWtlIGVycm9ycyIgaWYgdGhlcmUgYXJlIHByb2JsZW1zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvcnJlY3QgTGludXggMSByZWNvZ25pdGlvbiBpbiBjb25maWcuCiAgICAgW1VsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIFJlbW92ZSBwb2ludGxlc3MgTUQ1IGhhc2ggd2hlbiB1c2luZyBEU0Ega2V5cyBpbiBjYS4KICAgICBbQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCgogICopIEdlbmVyYXRlIGFuIGVycm9yIGlmIGdpdmVuIGFuIGVtcHR5IHN0cmluZyBhcyBhIGNlcnQgZGlyZWN0b3J5LiBBbHNvCiAgICAgZ2VuZXJhdGUgYW4gZXJyb3IgaWYgaGFuZGVkIE5VTEwgKHByZXZpb3VzbHkgcmV0dXJuZWQgMCB0byBpbmRpY2F0ZSBhbgogICAgIGVycm9yLCBidXQgZGlkbid0IHNldCBvbmUpLgogICAgIFtCZW4gTGF1cmllLCByZXBvcnRlZCBieSBBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgQWRkIHByb3RvdHlwZXMgdG8gU1NMIG1ldGhvZHMuIE1ha2UgU1NMX3dyaXRlJ3MgYnVmZmVyIGNvbnN0LCBhdCBsYXN0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIGR1bW15IGZ1bmN0aW9uIEJOX3JlZl9tb2RfZXhwKCkgaW4gcnNhcmVmLmMgdG8gaGF2ZSB0aGUgY29ycmVjdAogICAgIHBhcmFtZXRlcnMuIFRoaXMgd2FzIGNhdXNpbmcgYSB3YXJuaW5nIHdoaWNoIGtpbGxlZCBvZmYgdGhlIFdpbjMyIGNvbXBpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIEMrKyBzdHlsZSBjb21tZW50cyBmcm9tIGNyeXB0by9ibi9ibl9sb2NhbC5oLgogICAgIFtOZWlsIENvc3RpZ2FuIDxuZWlsLmNvc3RpZ2FuQGNlbG9jb20uY29tPl0KCiAgKikgVGhlIGZ1bmN0aW9uIE9CSl90eHQybmlkIHdhcyBicm9rZW4uIEl0IHdhcyBzdXBwb3NlZCB0byByZXR1cm4gYSBuaWQKICAgICBiYXNlZCBvbiBhIHRleHQgc3RyaW5nLCBsb29raW5nIHVwIHNob3J0IGFuZCBsb25nIG5hbWVzIGFuZCBmaW5hbGx5CiAgICAgImRvdCIgZm9ybWF0LiBUaGUgImRvdCIgZm9ybWF0IHN0dWZmIGRpZG4ndCB3b3JrLiBBZGRlZCBuZXcgZnVuY3Rpb24KICAgICBPQkpfdHh0Mm9iaiB0byBkbyB0aGUgc2FtZSBidXQgcmV0dXJuIGFuIEFTTjFfT0JKRUNUIGFuZCByZXdyb3RlIAogICAgIE9CSl90eHQybmlkIHRvIHVzZSBpdC4gT0JKX3R4dDJvYmogY2FuIGFsc28gcmV0dXJuIG9iamVjdHMgZXZlbiBpZiB0aGUKICAgICBPSUQgaXMgbm90IHBhcnQgb2YgdGhlIHRhYmxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBwcm90b3R5cGVzIHRvIFg1MDkgbG9va3VwL3ZlcmlmeSBtZXRob2RzLCBmaXhpbmcgYSBidWcgaW4KICAgICBYNTA5X0xPT0tVUF9ieV9hbGlhcygpLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTb3J0IG9wZW5zc2wgZnVuY3Rpb25zIGJ5IG5hbWUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEdldCB0aGUgZ2VuZHNhIHByb2dyYW0gd29ya2luZyAoaG9wZWZ1bGx5KSBhbmQgYWRkIGl0IHRvIGFwcCBsaXN0LiBSZW1vdmUKICAgICBlbmNyeXB0aW9uIGZyb20gc2FtcGxlIERTQSBrZXlzIChpbiBjYXNlIGFueW9uZSBpcyBpbnRlcmVzdGVkIHRoZSBwYXNzd29yZAogICAgIHdhcyAiMTIzNCIpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgX2FsbF8gKl9mcmVlIGZ1bmN0aW9ucyBhY2NlcHQgYSBOVUxMIHBvaW50ZXIuCiAgICAgW0ZyYW5zIEhleW1hbnMgPGZoZXltYW5zQGlzYXNlcnZlci5iZT5dCgogICopIElmIGEgREgga2V5IGlzIGdlbmVyYXRlZCBpbiBzM19zcnZyLmMsIGRvbid0IGJsb3cgaXQgYnkgdHJ5aW5nIHRvIHVzZQogICAgIE5VTEwgcG9pbnRlcnMuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBzX3NlcnZlciBzaG91bGQgc2VuZCB0aGUgQ0FmaWxlIGFzIGFjY2VwdGFibGUgQ0FzLCBub3QgaXRzIG93biBjZXJ0LgogICAgIFtCb2RvIE1vZWxsZXIgPDNtb2VsbGVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBEb24ndCBibG93IGl0IGZvciBudW1lcmljIC1uZXdrZXkgYXJndW1lbnRzIHRvIGFwcHMvcmVxLgogICAgIFtCb2RvIE1vZWxsZXIgPDNtb2VsbGVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBUZW1wIGtleSAiZm9yIGV4cG9ydCIgdGVzdHMgd2VyZSB3cm9uZyBpbiBzM19zcnZyLmMuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBBZGQgcHJvdG90eXBlIGZvciB0ZW1wIGtleSBjYWxsYmFjayBmdW5jdGlvbnMKICAgICBTU0xfQ1RYX3NldF90bXBfe3JzYSxkaH1fY2FsbGJhY2soKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBESF9mcmVlKCkgdG9sZXJhdGUgYmVpbmcgcGFzc2VkIGEgTlVMTCBwb2ludGVyIChsaWtlIFJTQV9mcmVlKCkgYW5kCiAgICAgRFNBX2ZyZWUoKSkuIE1ha2UgWDUwOV9QVUJLRVlfc2V0KCkgY2hlY2sgZm9yIGVycm9ycyBpbiBkMmlfUHVibGljS2V5KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgWDUwOV9uYW1lX2FkZF9lbnRyeSgpIGZyZWVkIHRoZSB3cm9uZyB0aGluZyBhZnRlciBhbiBlcnJvci4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgcnNhX2VheS5jIHdvdWxkIGF0dGVtcHQgdG8gZnJlZSBhIE5VTEwgY29udGV4dC4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgQklPX3Nfc29ja2V0KCkgaGFkIGEgYnJva2VuIHNob3VsZF9yZXRyeSgpIG9uIFdpbmRvemUuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEJJT19mX2J1ZmZlcigpIGRpZG4ndCBwYXNzIG9uIEJJT19DVFJMX0ZMVVNILgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBNYWtlIHN1cmUgdGhlIGFscmVhZHkgZXhpc3RpbmcgWDUwOV9TVE9SRS0+ZGVwdGggdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQKICAgICBpbiBYNTA5X1NUT1JFX25ldygpLCBidXQgZG9jdW1lbnQgdGhlIGZhY3QgdGhhdCB0aGlzIHZhcmlhYmxlIGlzIHN0aWxsCiAgICAgdW51c2VkIGluIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHRoZSB2YXJpb3VzIGxpYnJhcnkgYW5kIGFwcHMgZmlsZXMgdG8gZnJlZSB1cCBwa2V5cyBvYnRhaW5lZCBmcm9tCiAgICAgWDUwOV9QVUJLRVlfZ2V0KCkgZXQgYWwuIEFsc28gYWxsb3cgeDUwOS5jIHRvIGhhbmRsZSBuZXRzY2FwZSBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCByZWZlcmVuY2UgY291bnRpbmcgaW4gWDUwOV9QVUJLRVlfZ2V0KCkuIFRoaXMgbWFrZXMKICAgICBkZW1vcy9tYXVyaWNlL2V4YW1wbGUyLmMgd29yaywgYW1vbmdzdCBvdGhlcnMsIHByb2JhYmx5LgogICAgIFtTdGV2ZSBIZW5zb24gYW5kIEJlbiBMYXVyaWVdCgogICopIEZpcnN0IGN1dCBvZiBhIGNsZWFudXAgZm9yIGFwcHMvLiBGaXJzdCB0aGUgYHNzbGVheScgcHJvZ3JhbSBpcyBub3cgbmFtZWQKICAgICBgb3BlbnNzbCcgYW5kIHNlY29uZCwgdGhlIHNob3J0Y3V0IHN5bWxpbmtzIGZvciB0aGUgYG9wZW5zc2wgPGNvbW1hbmQ+JwogICAgIGFyZSBubyBsb25nZXIgY3JlYXRlZC4gVGhpcyB3YXkgd2UgaGF2ZSBhIHNpbmdsZSBhbmQgY29uc2lzdGVudCBjb21tYW5kCiAgICAgbGluZSBpbnRlcmZhY2UgYG9wZW5zc2wgPGNvbW1hbmQ+Jywgc2ltaWxhciB0byBgY3ZzIDxjb21tYW5kPicuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIFBhdWwgU3V0dG9uIGFuZCBCZW4gTGF1cmllXQoKICAqKSBjYS5jOiBtb3ZlIHRlc3QgZm9yIERTQSBrZXlzIGluc2lkZSAjaWZuZGVmIE5PX0RTQS4gTWFrZSBwdWJrZXkKICAgICBCSVQgU1RSSU5HIHdyYXBwZXIgYWx3YXlzIGhhdmUgemVybyB1bnVzZWQgYml0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQ0EucGwsIHBlcmwgdmVyc2lvbiBvZiBDQS5zaCwgYWRkIGV4dGVuZGVkIGtleSB1c2FnZSBPSUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0aGUgdG9wLWxldmVsIElOU1RBTEwgZG9jdW1lbnRhdGlvbiBlYXNpZXIgdG8gdW5kZXJzdGFuZC4KICAgICBbUGF1bCBTdXR0b25dCgogICopIE1ha2VmaWxlcyB1cGRhdGVkIHRvIGV4aXQgaWYgYW4gZXJyb3Igb2NjdXJzIGluIGEgc3ViLWRpcmVjdG9yeQogICAgIG1ha2UgKGluY2x1ZGluZyBpZiB1c2VyIHByZXNzZXMgXkMpIFtQYXVsIFN1dHRvbl0KCiAgKikgTWFrZSBNb250Z29tZXJ5IGNvbnRleHQgc3R1ZmYgZXhwbGljaXQgaW4gUlNBIGRhdGEgc3RydWN0dXJlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggYnVpbGQgb3JkZXIgb2YgcGVtIGFuZCBlcnIgdG8gYWxsb3cgZm9yIGdlbmVyYXRlZCBwZW0uaC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHJlbnVtYmVyaW5nIGJ1ZyBpbiBYNTA5X05BTUVfZGVsZXRlX2VudHJ5KCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEVuaGFuY2VkIHRoZSBlcnItaW5zLnBsIHNjcmlwdCBzbyBpdCBtYWtlcyB0aGUgZXJyb3IgbGlicmFyeSBudW1iZXIgCiAgICAgZ2xvYmFsIGFuZCBjYW4gYWRkIGEgbGlicmFyeSBuYW1lLiBUaGlzIGlzIG5lZWRlZCBmb3IgZXh0ZXJuYWwgQVNOMSBhbmQKICAgICBvdGhlciBlcnJvciBsaWJyYXJpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZWQgc2tfaW5zZXJ0IHdoaWNoIG5ldmVyIHdvcmtlZCBwcm9wZXJseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggQVNOMSBtYWNyb3Mgc28gdGhleSBjYW4gaGFuZGxlIGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkIAogICAgIEVYUExJQ0lUIHRhZ3MuIFNvbWUgbm9uIHN0YW5kYXJkIGNlcnRpZmljYXRlcyB1c2UgdGhlc2U6IHRoZXkgY2FuIG5vdwogICAgIGJlIHJlYWQgaW4uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWVyZ2VkIHRoZSB2YXJpb3VzIG9sZC9vYnNvbGV0ZSBTU0xlYXkgZG9jdW1lbnRhdGlvbiBmaWxlcyAoZG9jL3h4eC5kb2MpCiAgICAgaW50byBhIHNpbmdsZSBkb2Mvc3NsZWF5LnR4dCBidW5kbGUuIFRoaXMgd2F5IHRoZSBpbmZvcm1hdGlvbiBpcyBzdGlsbAogICAgIHByZXNlcnZlZCBidXQgbm8gbG9uZ2VyIG1lc3NlcyB1cCB0aGlzIGRpcmVjdG9yeS4gTm93IGl0J3MgbmV3IHJvb20gZm9yCiAgICAgdGhlIG5ldyBzZXQgb2YgZG9jdW1lbnRhdGlvbiBmaWxlcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgU0VUcyB3ZXJlIGluY29ycmVjdGx5IERFUiBlbmNvZGVkLiBUaGlzIHdhcyBhIG1ham9yIHBhaW4sIGJlY2F1c2UgdGhleQogICAgIHNoYXJlZCBjb2RlIHdpdGggU0VRVUVOQ0VzLCB3aGljaCBhcmVuJ3QgY29kZWQgdGhlIHNhbWUuIFRoaXMgbWVhbnMgdGhhdAogICAgIGFsbW9zdCBldmVyeXRoaW5nIHRvIGRvIHdpdGggU0VUcyBvciBTRVFVRU5DRXMgaGFzIGVpdGhlciBjaGFuZ2VkIG5hbWUgb3IKICAgICBudW1iZXIgb2YgYXJndW1lbnRzLgogICAgIFtCZW4gTGF1cmllLCBiYXNlZCBvbiBhIHBhcnRpYWwgZml4IGJ5IEdQIEpheWFuIDxncEBuc2ouY28uanA+XQoKICAqKSBGaXggdGVzdCBkYXRhIHRvIHdvcmsgd2l0aCB0aGUgYWJvdmUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCB0aGUgUlNBIGhlYWRlciBkZWNsYXJhdGlvbnMgdGhhdCBoaWQgYSBidWcgSSBmaXhlZCBpbiAwLjkuMGIgYnV0CiAgICAgd2FzIGFscmVhZHkgZml4ZWQgYnkgRXJpYyBmb3IgMC45LjEgaXQgc2VlbXMuCiAgICAgW0JlbiBMYXVyaWUgLSBwb2ludGVkIG91dCBieSBVbGYgTfZsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBBdXRvZGV0ZWN0IEZyZWVCU0QzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdmFyaW91cyBidWdzIGluIENvbmZpZ3VyZS4gVGhpcyBhZmZlY3RzIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zOgogICAgIG5leHRzdGVwCiAgICAgbmNyLXNjZGUKICAgICB1bml4d2FyZS0yLjAKICAgICB1bml4d2FyZS0yLjAtcGVudGl1bQogICAgIHNjbzUtY2MuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEVsaW1pbmF0ZSBnZW5lcmF0ZWQgZmlsZXMgZnJvbSBDVlMuIFJlb3JkZXIgdGVzdHMgdG8gcmVnZW5lcmF0ZSBmaWxlcwogICAgIGJlZm9yZSB0aGV5IGFyZSBuZWVkZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEdlbmVyYXRlIE1ha2VmaWxlLnNzbCBmcm9tIE1ha2VmaWxlLm9yZyAodG8ga2VlcCBDVlMgaGFwcHkpLgogICAgIFtCZW4gTGF1cmllXQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjFiIGFuZCAwLjkuMWMgIFsyMy1EZWMtMTk5OF0KCiAgKikgQWRkZWQgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiB0byBjcnlwdG8vY3J5cHRvLmggYW5kIAogICAgIGNoYW5nZWQgU1NMZWF5IHRvIE9wZW5TU0wgaW4gdmVyc2lvbiBzdHJpbmdzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogIAogICopIFNvbWUgZml4dXBzIHRvIHRoZSB0b3AtbGV2ZWwgZG9jdW1lbnRzLgogICAgIFtQYXVsIFN1dHRvbl0KCiAgKikgRml4ZWQgdGhlIG5hc3R5IGJ1ZyB3aGVyZSByc2FyZWYuaCB3YXMgbm90IGZvdW5kIHVuZGVyIGNvbXBpbGUtdGltZQogICAgIGJlY2F1c2UgdGhlIHN5bWxpbmsgdG8gaW5jbHVkZS8gd2FzIG1pc3NpbmcuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEluY29ycG9yYXRlZCB0aGUgcG9wdWxhciBuby1SU0EvRFNBLW9ubHkgcGF0Y2hlcyAKICAgICB3aGljaCBhbGxvdyB0byBjb21waWxlIGEgUlNBLWZyZWUgU1NMZWF5LgogICAgIFtBbmRyZXcgQ29va2UgLyBJbnRlcnJhZGVyIExkdC4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeGVkIG5hc3R5IHJlaGFzaCBwcm9ibGVtIHVuZGVyIGBtYWtlIC1mIE1ha2VmaWxlLnNzbCBsaW5rcycKICAgICB3aGVuICJzc2xlYXkiIGlzIHN0aWxsIG5vdCBmb3VuZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgbW9yZSBwbGF0Zm9ybXMgdG8gQ29uZmlndXJlOiBDcmF5IFQzRSwgSFBVWCAxMSwgCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIEJlY2ttYW5uIDxiZWNrbWFuQGFjbC5sYW5sLmdvdj5dCgogICopIFVwZGF0ZWQgdGhlIFJFQURNRSBmaWxlLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGRlZCB2YXJpb3VzIC5jdnNpZ25vcmUgZmlsZXMgaW4gdGhlIENWUyByZXBvc2l0b3J5IHN1YmRpcnMKICAgICB0byBtYWtlIGEgImN2cyB1cGRhdGUiIHJlYWxseSBzaWxlbnQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlY29tcGlsZWQgdGhlIGVycm9yLWRlZmluaXRpb24gaGVhZGVyIGZpbGVzIGFuZCBhZGRlZAogICAgIG1pc3Npbmcgc3ltYm9scyB0byB0aGUgV2luMzIgbGlua2VyIHRhYmxlcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQ2xlYW5lZCB1cCB0aGUgdG9wLWxldmVsIGRvY3VtZW50czsKICAgICBvIG5ldyBmaWxlczogQ0hBTkdFUyBhbmQgTElDRU5TRQogICAgIG8gbWVyZ2VkIFZFUlNJT04sIEhJU1RPUlkqIGFuZCBSRUFETUUqIGZpbGVzIGEgQ0hBTkdFUy5TU0xlYXkgCiAgICAgbyBtZXJnZWQgQ09QWVJJR0hUIGludG8gTElDRU5TRQogICAgIG8gcmVtb3ZlZCBvYnNvbGV0ZSBUT0RPIGZpbGUKICAgICBvIHJlbmFtZWQgTUlDUk9TT0ZUIHRvIElOU1RBTEwuVzMyCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlbW92ZWQgZHVtbXkgZmlsZXMgZnJvbSB0aGUgMC45LjFiIHNvdXJjZSB0cmVlOiAKICAgICBjcnlwdG8vYXNuMS94IGNyeXB0by9iaW8vY2QgY3J5cHRvL2Jpby9mZyBjcnlwdG8vYmlvL2dyZXAgY3J5cHRvL2Jpby92aQogICAgIGNyeXB0by9ibi9hc20vLi4uLi4uYWRkLmMgY3J5cHRvL2JuL2FzbS9hLm91dCBjcnlwdG8vZHNhL2YgY3J5cHRvL21kNS9mCiAgICAgY3J5cHRvL3BlbS9nbW9uLm91dCBjcnlwdG8vcGVybGFzbS9mIGNyeXB0by9wa2NzNy9idWlsZCBjcnlwdG8vcnNhL2YKICAgICBjcnlwdG8vc2hhL2FzbS9mIGNyeXB0by90aHJlYWRzL2YgbXMvenp6IHNzbC9mIHNzbC9mLm1hayB0ZXN0L2YKICAgICB1dGlsL2YubWFrIHV0aWwvcGwvZiB1dGlsL3BsL2YubWFrIGNyeXB0by9iZi9iZl9sb2NsLm9sZCBhcHBzL2YKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgdmFyaW91cyBwbGF0Zm9ybSBwb3J0YWJpbGl0eSBmaXhlcy4KICAgICBbTWFyayBKLiBDb3hdCgogICopIFRoZSBHZW5lc2lzIG9mIHRoZSBPcGVuU1NMIHJwamVjdDoKICAgICBXZSBzdGFydCB3aXRoIHRoZSBsYXRlc3QgKHVucmVsZWFzZWQpIFNTTGVheSB2ZXJzaW9uIDAuOS4xYiB3aGljaCBFcmljIEEuCiAgICAgWW91bmcgYW5kIFRpbSBKLiBIdWRzb24gY3JlYXRlZCB3aGlsZSB0aGV5IHdlcmUgd29ya2luZyBmb3IgQzJOZXQgdW50aWwKICAgICBzdW1tZXIgMTk5OC4KICAgICBbVGhlIE9wZW5TU0wgUHJvamVjdF0KIAoKIENoYW5nZXMgYmV0d2VlbiAwLjkuMGIgYW5kIDAuOS4xYiAgW25vdCByZWxlYXNlZF0KCiAgKikgVXBkYXRlZCBhIGZldyBDQSBjZXJ0aWZpY2F0ZXMgdW5kZXIgY2VydHMvCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIENoYW5nZWQgc29tZSBCSUdOVU0gYXBpIHN0dWZmLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBWYXJpb3VzIHBsYXRmb3JtIHBvcnRzOiBPcGVuQlNELCBVbHRyaXgsIElSSVggNjRiaXQsIE5ldEJTRCwgCiAgICAgREdVWCB4ODYsIExpbnV4IEFscGhhLCBldGMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIE5ldyBDT01QIGxpYnJhcnkgW2NyeXB0by9jb21wL10gZm9yIFNTTCBSZWNvcmQgTGF5ZXIgQ29tcHJlc3Npb246IAogICAgIFJMRSAoZHVtbXkgaW1wbGVtZW50ZWQpIGFuZCBaTElCIChyZWFsbHkgaW1wbGVtZW50ZWQgd2hlbiBaTElCIGlzCiAgICAgYXZhaWxhYmxlKS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkIC1zdHJwYXJzZSBvcHRpb24gdG8gYXNuMXBhcnMgcHJvZ3JhbSB3aGljaCBwYXJzZXMgbmVzdGVkIAogICAgIGJpbmFyeSBzdHJ1Y3R1cmVzIAogICAgIFtEciBTdGVwaGVuIEhlbnNvbiA8c2hlbnNvbkBiaWdmb290LmNvbT5dCgogICopIEFkZGVkICJvaWRfZmlsZSIgdG8gc3NsZWF5LmNuZiBmb3IgImNhIiBhbmQgInJlcSIgcHJvZ3JhbXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIERTQSBmaXggZm9yICJjYSIgcHJvZ3JhbS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgIi1nZW5rZXkiIG9wdGlvbiB0byAiZHNhcGFyYW0iIHByb2dyYW0uCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIFJJUEUgTUQxNjAgKHJtZDE2MCkgbWVzc2FnZSBkaWdlc3QuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIC1hIChhbGwpIG9wdGlvbiB0byAic3NsZWF5IHZlcnNpb24iIGNvbW1hbmQuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIFBMQVRGT1JNIGRlZmluZSB3aGljaCBpcyB0aGUgaWQgZ2l2ZW4gdG8gQ29uZmlndXJlLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBNZW1DaGVja19YWFhYIGZ1bmN0aW9ucyB0byBjcnlwdG8vbWVtLmMgZm9yIG1lbW9yeSBjaGVja2luZy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRXh0ZW5kZWQgdGhlIEFTTi4xIHBhcnNlciByb3V0aW5lcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRXh0ZW5kZWQgQklPIHJvdXRpbmVzIHRvIHN1cHBvcnQgUkVVU0VBRERSLCBzZWVrLCB0ZWxsLCBldGMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIGEgQk5fQ1RYIHRvIHRoZSBCTiBsaWJyYXJ5LgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBGaXhlZCB0aGUgd2VhayBrZXkgdmFsdWVzIGluIERFUyBsaWJyYXJ5CiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIENoYW5nZWQgQVBJIGluIEVWUCBsaWJyYXJ5IGZvciBjaXBoZXIgYWxpYXNlcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgc3VwcG9ydCBmb3IgUkMyLzY0Yml0IGNpcGhlci4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQ29udmVydGVkIHRoZSBsaGFzaCBsaWJyYXJ5IHRvIHRoZSBjcnlwdG8vbWVtLmMgZnVuY3Rpb25zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBtb3JlIHJlY29nbml6ZWQgQVNOLjEgb2JqZWN0IGlkcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgbW9yZSBSU0EgcGFkZGluZyBjaGVja3MgZm9yIFNTTC9UTFMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIEJJTyBwcm94eS9maWx0ZXIgZnVuY3Rpb25hbGl0eS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgZXh0cmFfY2VydHMgdG8gU1NMX0NUWCB3aGljaCBjYW4gYmUgdXNlZAogICAgIHNlbmQgZXh0cmEgQ0EgY2VydGlmaWNhdGVzIHRvIHRoZSBjbGllbnQgaW4gdGhlIENBIGNlcnQgY2hhaW4gc2VuZGluZwogICAgIHByb2Nlc3MuIEl0IGNhbiBiZSBjb25maWd1cmVkIHdpdGggU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydCgpLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBOb3cgRm9ydGV6emEgaXMgZGVuaWVkIGluIHRoZSBhdXRoZW50aWNhdGlvbiBwaGFzZSBiZWNhdXNlCiAgICAgdGhpcyBpcyBrZXkgZXhjaGFuZ2UgbWVjaGFuaXNtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgU1NMZWF5IGF0IGFsbC4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkaXRpb25hbCBQS0NTMSBjaGVja3MuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIFN1cHBvcnQgdGhlIHN0cmluZyAiVExTdjEiIGZvciBhbGwgVExTIHYxIGNpcGhlcnMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIGZ1bmN0aW9uIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHgoKSB3aGljaCBnaXZlcyB0aGUKICAgICBleF9kYXRhIGluZGV4IG9mIHRoZSBTU0wgY29udGV4dCBpbiB0aGUgWDUwOV9TVE9SRV9DVFggZXhfZGF0YS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgYSBmZXcgbWVtb3J5IGxlYWtzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBGaXhlZCB2YXJpb3VzIGNvZGUgYW5kIGNvbW1lbnQgdHlwb3MuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEEgbWlub3IgYnVnIGluIHNzbC9zM19jbG50LmMgd2hlcmUgdGhlcmUgd291bGQgYWx3YXlzIGJlIDQgMCAKICAgICBieXRlcyBzZW50IGluIHRoZSBjbGllbnQgcmFuZG9tLgogICAgIFtFZHdhcmQgQmlzaG9wIDxlYmlzaG9wQHNweWdsYXNzLmNvbT5dCgo=