CiBPcGVuU1NMIENIQU5HRVMKIF9fX19fX19fX19fX19fXwoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMiBhbmQgMS4xLjAgIFt4eCBYWFggeHh4eF0KCiAgKikgQWRkZWQgc3VwcG9ydCBmb3IgVExTIGV4dGVuZGVkIG1hc3RlciBzZWNyZXQgZnJvbQogICAgIGRyYWZ0LWlldGYtdGxzLXNlc3Npb24taGFzaC0wMy50eHQuIFRoYW5rcyBmb3IgQWxmcmVkbyBQaXJvbnRpIGZvciBhbgogICAgIGluaXRpYWwgcGF0Y2ggd2hpY2ggd2FzIGEgZ3JlYXQgaGVscCBkdXJpbmcgZGV2ZWxvcG1lbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsIGxpYnNzbCBpbnRlcm5hbCBzdHJ1Y3R1cmVzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHB1YmxpYyBoZWFkZXIKICAgICBmaWxlcywgYW5kIHRoZSBPUEVOU1NMX05PX1NTTF9JTlRFUk4gb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQgKHNpbmNlIGl0IGlzCiAgICAgbm93IHJlZHVuZGFudCkuIFVzZXJzIHNob3VsZCBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgaW50ZXJuYWwgc3RydWN0dXJlcwogICAgIGRpcmVjdGx5LiBJbnN0ZWFkIHRoZXkgc2hvdWxkIHVzZSB0aGUgcHJvdmlkZWQgQVBJIGZ1bmN0aW9ucy4KICAgICBbTWF0dCBDYXN3ZWxsXQoKICAqKSBjb25maWcgaGFzIGJlZW4gY2hhbmdlZCBzbyB0aGF0IGJ5IGRlZmF1bHQgT1BFTlNTTF9OT19ERVBSRUNBVEVEIGlzIHVzZWQuCiAgICAgQWNjZXNzIHRvIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGNhbiBiZSByZS1lbmFibGVkIGJ5IHJ1bm5pbmcgY29uZmlnIHdpdGgKICAgICAiZW5hYmxlLWRlcHJlY2F0ZWQiLiBJbiBhZGRpdGlvbiBhcHBsaWNhdGlvbnMgd2lzaGluZyB0byB1c2UgZGVwcmVjYXRlZAogICAgIGZ1bmN0aW9ucyBtdXN0IGRlZmluZSBPUEVOU1NMX1VTRV9ERVBSRUNBVEVELiBOb3RlIHRoYXQgdGhpcyBuZXcgYmVoYXZpb3VyCiAgICAgd2lsbCwgYnkgZGVmYXVsdCwgZGlzYWJsZSBzb21lIHRyYW5zaXRpdmUgaW5jbHVkZXMgdGhhdCBwcmV2aW91c2x5IGV4aXN0ZWQKICAgICBpbiB0aGUgaGVhZGVyIGZpbGVzIChlLmcuIGVjLmggd2lsbCBubyBsb25nZXIsIGJ5IGRlZmF1bHQsIGluY2x1ZGUgYm4uaCkKICAgICBbTWF0dCBDYXN3ZWxsXQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBPQ0IgbW9kZS4gT3BlblNTTCBoYXMgYmVlbiBncmFudGVkIGEgcGF0ZW50IGxpY2Vuc2UKICAgICBjb21wYXRpYmxlIHdpdGggdGhlIE9wZW5TU0wgbGljZW5zZSBmb3IgdXNlIG9mIE9DQi4gRGV0YWlscyBhcmUgYXZhaWxhYmxlCiAgICAgYXQgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9taXNjL09DQi1wYXRlbnQtZ3JhbnQtT3BlblNTTC5wZGYuIFN1cHBvcnQKICAgICBmb3IgT0NCIGNhbiBiZSByZW1vdmVkIGJ5IGNhbGxpbmcgY29uZmlnIHdpdGggbm8tb2NiLgogICAgIFtNYXR0IENhc3dlbGxdCgogICopIFNTTHYyIHN1cHBvcnQgaGFzIGJlZW4gcmVtb3ZlZC4gIEl0IHN0aWxsIHN1cHBvcnRzIHJlY2VpdmluZyBhIFNTTHYyCiAgICAgY29tcGF0aWJsZSBjbGllbnQgaGVsbG8uCiAgICAgW0t1cnQgUm9lY2t4XQoKICAqKSBJbmNyZWFzZWQgdGhlIG1pbmltYWwgUlNBIGtleXNpemUgZnJvbSAyNTYgdG8gNTEyIGJpdHMgW1JpY2ggU2Fsel0sCiAgICAgZG9uZSB3aGlsZSBmaXhpbmcgdGhlIGVycm9yIGNvZGUgZm9yIHRoZSBrZXktdG9vLXNtYWxsIGNhc2UuCiAgICAgW0FubmllIFlvdXNhciA8YS55b3VzYXJAaW5mb3JtYXRpay5odS1iZXJsaW4uZGU+XQoKICAqKSBSZW1vdmVkIG9sZCBERVMgQVBJLgogICAgIFtSaWNoIFNhbHpdCgogICopIFJlbW92ZSB2YXJpb3VzIHVuc3VwcG9ydGVkIHBsYXRmb3JtczoKICAgICAgICBTb255IE5FV1M0CiAgICAgICAgQkVPUyBhbmQgQkVPU19SNQogICAgICAgIE5lWFQKICAgICAgICBTVU5PUwogICAgICAgIE1QRS9pWAogICAgICAgIFNpbml4L1JlbGlhbnRVTklYIFJNNDAwCiAgICAgICAgREdVWAogICAgICAgIE5DUgogICAgICAgIFRhbmRlbQogICAgICAgIENyYXkKICAgICAgICAxNi1iaXQgcGxhdGZvcm1zIHN1Y2ggYXMgV0lOMTYKICAgICBbUmljaCBTYWx6XQoKICAqKSBDbGVhbiB1cCBPUEVOU1NMX05PX3h4eCAjZGVmaW5lJ3MKICAgICAgICBVc2Ugc2V0YnVmKCkgYW5kIHJlbW92ZSBPUEVOU1NMX05PX1NFVFZCVUZfSU9OQkYKICAgICAgICBSZW5hbWUgT1BFTlNTTF9TWVNOQU1FX3h4eCB0byBPUEVOU1NMX1NZU194eHgKICAgICAgICBPUEVOU1NMX05PX0VDe0RILERTQX0gbWVyZ2VkIGludG8gT1BFTlNTTF9OT19FQwogICAgICAgIE9QRU5TU0xfTk9fUklQRU1EMTYwLCBPUEVOU1NMX05PX1JJUEVNRCBtZXJnZWQgaW50byBPUEVOU1NMX05PX1JNRDE2MAogICAgICAgIE9QRU5TU0xfTk9fRlBfQVBJIG1lcmdlZCBpbnRvIE9QRU5TU0xfTk9fU1RESU8KICAgICAgICBSZW1vdmUgT1BFTlNTTF9OT19CSU8gT1BFTlNTTF9OT19CVUZGRVIgT1BFTlNTTF9OT19DSEFJTl9WRVJJRlkKICAgICAgICBPUEVOU1NMX05PX0VWUCBPUEVOU1NMX05PX0ZJUFNfRVJSIE9QRU5TU0xfTk9fSEFTSF9DT01QCiAgICAgICAgT1BFTlNTTF9OT19MSEFTSCBPUEVOU1NMX05PX09CSkVDVCBPUEVOU1NMX05PX1NQRUVEIE9QRU5TU0xfTk9fU1RBQ0sKICAgICAgICBPUEVOU1NMX05PX1g1MDkgT1BFTlNTTF9OT19YNTA5X1ZFUklGWQogICAgICAgIFJlbW92ZSBNU19TVEFUSUM7IGl0J3MgYSByZWxpYyBmcm9tIHBsYXRmb3JtcyA8MzIgYml0cy4KICAgICBbUmljaCBTYWx6XQoKICAqKSBDbGVhbmVkIHVwIGRlYWQgY29kZQogICAgICAgIFJlbW92ZSBhbGwgYnV0IG9uZSAnI2lmZGVmIHVuZGVmJyB3aGljaCBpcyB0byBiZSBsb29rZWQgYXQuCiAgICAgW1JpY2ggU2Fsel0KCiAgKikgRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGEgbmV3LCBmYXN0LCB1bmJpYXNlZCBwcmltZSBjYW5kaWRhdGUgZ2VuZXJhdG9yLAogICAgIGJuX3Byb2JhYmxlX3ByaW1lX2RoX2NvcHJpbWUoKS4gTm90IGN1cnJlbnRseSB1c2VkIGJ5IGFueSBwcmltZSBnZW5lcmF0b3IuCiAgICAgW0ZlbGl4IExhdXJpZSB2b24gTWFzc2VuYmFjaCA8ZmVsaXhAZXJicmlkZ2UuY28udWs+XQoKICAqKSBOZXcgb3V0cHV0IGZvcm1hdCBOU1MgaW4gdGhlIHNlc3NfaWQgY29tbWFuZCBsaW5lIHRvb2wuIFRoaXMgYWxsb3dzCiAgICAgZXhwb3J0aW5nIHRoZSBzZXNzaW9uIGlkIGFuZCB0aGUgbWFzdGVyIGtleSBpbiBOU1Mga2V5bG9nIGZvcm1hdC4KICAgICBbTWFydGluIEthaXNlciA8bWFydGluQGthaXNlci5jeD5dCgogICopIEhhcm1vbml6ZSB2ZXJzaW9uIGFuZCBpdHMgZG9jdW1lbnRhdGlvbi4gLWYgZmxhZyBpcyB1c2VkIHRvIGRpc3BsYXkKICAgICBjb21waWxhdGlvbiBmbGFncy4KICAgICBbbWFuY2hhIDxtYW5jaGExQHpvaG8uY29tPl0KCiAgKikgRml4IGVja2V5X3ByaXZfZW5jb2RlIHNvIGl0IGltbWVkaWF0ZWx5IHJldHVybnMgYW4gZXJyb3IgdXBvbiBhIGZhaWx1cmUKICAgICBpbiBpMmRfRUNQcml2YXRlS2V5LgogICAgIFttYW5jaGEgPG1hbmNoYTFAem9oby5jb20+XQoKICAqKSBGaXggc29tZSBkb3VibGUgZnJlZXMuIFRoZXNlIGFyZSBub3QgdGhvdWdodCB0byBiZSBleHBsb2l0YWJsZS4KICAgICBbbWFuY2hhIDxtYW5jaGExQHpvaG8uY29tPl0KCiAgKikgQSBtaXNzaW5nIGJvdW5kcyBjaGVjayBpbiB0aGUgaGFuZGxpbmcgb2YgdGhlIFRMUyBoZWFydGJlYXQgZXh0ZW5zaW9uCiAgICAgY2FuIGJlIHVzZWQgdG8gcmV2ZWFsIHVwIHRvIDY0ayBvZiBtZW1vcnkgdG8gYSBjb25uZWN0ZWQgY2xpZW50IG9yCiAgICAgc2VydmVyLgoKICAgICBUaGFua3MgZm9yIE5lZWwgTWVodGEgb2YgR29vZ2xlIFNlY3VyaXR5IGZvciBkaXNjb3ZlcmluZyB0aGlzIGJ1ZyBhbmQgdG8KICAgICBBZGFtIExhbmdsZXkgPGFnbEBjaHJvbWl1bS5vcmc+IGFuZCBCb2RvIE1vZWxsZXIgPGJtb2VsbGVyQGFjbS5vcmc+IGZvcgogICAgIHByZXBhcmluZyB0aGUgZml4IChDVkUtMjAxNC0wMTYwKQogICAgIFtBZGFtIExhbmdsZXksIEJvZG8gTW9lbGxlcl0KCiAgKikgRml4IGZvciB0aGUgYXR0YWNrIGRlc2NyaWJlZCBpbiB0aGUgcGFwZXIgIlJlY292ZXJpbmcgT3BlblNTTAogICAgIEVDRFNBIE5vbmNlcyBVc2luZyB0aGUgRkxVU0grUkVMT0FEIENhY2hlIFNpZGUtY2hhbm5lbCBBdHRhY2siCiAgICAgYnkgWXV2YWwgWWFyb20gYW5kIE5hb21pIEJlbmdlci4gRGV0YWlscyBjYW4gYmUgb2J0YWluZWQgZnJvbToKICAgICBodHRwOi8vZXByaW50LmlhY3Iub3JnLzIwMTQvMTQwCgogICAgIFRoYW5rcyB0byBZdXZhbCBZYXJvbSBhbmQgTmFvbWkgQmVuZ2VyIGZvciBkaXNjb3ZlcmluZyB0aGlzCiAgICAgZmxhdyBhbmQgdG8gWXV2YWwgWWFyb20gZm9yIHN1cHBseWluZyBhIGZpeCAoQ1ZFLTIwMTQtMDA3NikKICAgICBbWXV2YWwgWWFyb20gYW5kIE5hb21pIEJlbmdlcl0KCiAgKikgVXNlIGFsZ29yaXRobSBzcGVjaWZpYyBjaGFpbnMgaW4gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSgpOgogICAgIHRoaXMgZml4ZXMgYSBsaW1pdGF0aW9uIGluIHByZXZpb3VzIHZlcnNpb25zIG9mIE9wZW5TU0wuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXhwZXJpbWVudGFsIGVuY3J5cHQtdGhlbi1tYWMgc3VwcG9ydC4KICAgIAogICAgIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBlbmNyeXB0IHRoZW4gbWFjIGZyb20KICAgICBkcmFmdC1ndXRtYW5uLXRscy1lbmNyeXB0LXRoZW4tbWFjLTAyLnR4dAoKICAgICBUbyBlbmFibGUgaXQgc2V0IHRoZSBhcHByb3ByaWF0ZSBleHRlbnNpb24gbnVtYmVyICgweDQyIGZvciB0aGUgdGVzdAogICAgIHNlcnZlcikgdXNpbmcgZS5nLiAtRFRMU0VYVF9UWVBFX2VuY3J5cHRfdGhlbl9tYWM9MHg0MgogCiAgICAgRm9yIG5vbi1jb21wbGlhbnQgcGVlcnMgKGkuZS4ganVzdCBhYm91dCBldmVyeXRoaW5nKSB0aGlzIHNob3VsZCBoYXZlIG5vCiAgICAgZWZmZWN0LgoKICAgICBXQVJOSU5HOiBFWFBFUklNRU5UQUwsIFNVQkpFQ1QgVE8gQ0hBTkdFLgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgRVZQIHN1cHBvcnQgZm9yIGtleSB3cmFwcGluZyBhbGdvcml0aG1zLCB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCiAgICAgZXhpc3RpbmcgY29kZSB0aGUgZmxhZyBFVlBfQ0lQSEVSX0NUWF9XUkFQX0FMTE9XIGhhcyB0byBiZSBzZXQgaW4KICAgICB0aGUgRVZQX0NJUEhFUl9DVFggb3IgYW4gZXJyb3IgaXMgcmV0dXJuZWQuIEFkZCBBRVMgYW5kIERFUzMgd3JhcAogICAgIGFsZ29yaXRobXMgYW5kIGluY2x1ZGUgdGVzdHMgY2FzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIENNUyBjb2RlIHRvIHN1cHBvcnQgUlNBLVBTUyBzaWduYXR1cmVzIGFuZCBSU0EtT0FFUCBmb3IKICAgICBlbnZlbG9wZWQgZGF0YS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbmRlZCBSU0EgT0FFUCBzdXBwb3J0IHZpYSBFVlBfUEtFWSBBUEkuIE9wdGlvbnMgdG8gc3BlY2lmeSBkaWdlc3QsCiAgICAgTUdGMSBkaWdlc3QgYW5kIE9BRVAgbGFiZWwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBvcGVuc3NsIHZlcmlmeSByZXR1cm4gZXJyb3JzLgogICAgIFtDaHJpcyBQYWxtZXIgPHBhbG1lckBnb29nbGUuY29tPiBhbmQgQmVuIExhdXJpZV0KCiAgKikgTmV3IGZ1bmN0aW9uIEFTTjFfVElNRV9kaWZmIHRvIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3bwogICAgIEFTTjFfVElNRSBzdHJ1Y3R1cmVzIG9yIG9uZSBzdHJ1Y3R1cmUgYW5kIHRoZSBjdXJyZW50IHRpbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIGZpcHNfdGVzdF9zdWl0ZSB0byBzdXBwb3J0IG11bHRpcGxlIGNvbW1hbmQgbGluZSBvcHRpb25zLiBOZXcKICAgICB0ZXN0IHRvIGluZHVjZSBhbGwgc2VsZiB0ZXN0IGVycm9ycyBpbiBzZXF1ZW5jZSBhbmQgY2hlY2sgZXhwZWN0ZWQKICAgICBmYWlsdXJlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgRklQU197cnNhLGRzYSxlY2RzYX1fe3NpZ24sdmVyaWZ5fSBmdW5jdGlvbnMgd2hpY2ggZGlnZXN0IGFuZAogICAgIHNpZ24gb3IgdmVyaWZ5IGFsbCBpbiBvbmUgb3BlcmF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmaXBzX2FsZ3ZzOiBhIG11bHRpY2FsbCBmaXBzIHV0aWxpdHkgaW5jb3Jwb3JhdGluZyBhbGwgdGhlIGFsZ29yaXRobQogICAgIHRlc3QgcHJvZ3JhbXMgYW5kIGZpcHNfdGVzdF9zdWl0ZS4gSW5jbHVkZXMgZnVuY3Rpb25hbGl0eSB0byBwYXJzZQogICAgIHRoZSBtaW5pbWFsIHNjcmlwdCBvdXRwdXQgb2YgZmlwc2FsZ2VzdC5wbCBkaXJlY3RseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYXV0aG9yaXNhdGlvbiBwYXJhbWV0ZXIgdG8gRklQU19tb2R1bGVfbW9kZV9zZXQoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgRklQUyBzZWxmdGVzdCBmb3IgRUNESCBhbGdvcml0aG0gdXNpbmcgUC0yMjQgYW5kIEItMjMzIGN1cnZlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVc2Ugc2VwYXJhdGUgRFJCRyBmaWVsZHMgZm9yIGludGVybmFsIGFuZCBleHRlcm5hbCBmbGFncy4gTmV3IGZ1bmN0aW9uCiAgICAgRklQU19kcmJnX2hlYWx0aF9jaGVjaygpIHRvIHBlcmZvcm0gb24gZGVtYW5kIGhlYWx0aCBjaGVja2luZy4gQWRkCiAgICAgZ2VuZXJhdGlvbiB0ZXN0cyB0byBmaXBzX3Rlc3Rfc3VpdGUgd2l0aCByZWR1Y2VkIGhlYWx0aCBjaGVjayBpbnRlcnZhbCB0byAKICAgICBkZW1vbnN0cmF0ZSBwZXJpb2RpYyBoZWFsdGggY2hlY2tpbmcuIEFkZCAibm9kaCIgb3B0aW9uIHRvCiAgICAgZmlwc190ZXN0X3N1aXRlIHRvIHNraXAgdmVyeSBzbG93IERIIHRlc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEZJUFNfZ2V0X2NpcGhlcmJ5bmlkKCkgdG8gbG9va3VwIEZJUFMgc3VwcG9ydGVkIGNpcGhlcnMKICAgICBiYXNlZCBvbiBOSUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9yZSBleHRlbnNpdmUgaGVhbHRoIGNoZWNrIGZvciBEUkJHIGNoZWNraW5nIG1hbnkgbW9yZSBmYWlsdXJlIG1vZGVzLgogICAgIE5ldyBmdW5jdGlvbiBGSVBTX3NlbGZ0ZXN0X2RyYmdfYWxsKCkgdG8gaGFuZGxlIGV2ZXJ5IHBvc3NpYmxlIERSQkcKICAgICBjb21iaW5hdGlvbjogY2FsbCB0aGlzIGluIGZpcHNfdGVzdF9zdWl0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRHVhbCBFQyBEUkJHIGZyb20gU1A4MDAtOTAuIFVwZGF0ZSBEUkJHIGFsZ29yaXRobSB0ZXN0CiAgICAgYW5kIFBPU1QgdG8gaGFuZGxlIER1YWwgRUMgY2FzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGNhbm9uaWNhbCBnZW5lcmF0aW9uIG9mIERTQSBwYXJhbWV0ZXIgJ2cnLiBTZWUgCiAgICAgRklQUyAxODYtMyBBLjIuMy4KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEhNQUMgRFJCRyBmcm9tIFNQODAwLTkwLiBVcGRhdGUgRFJCRyBhbGdvcml0aG0gdGVzdCBhbmQKICAgICBQT1NUIHRvIGhhbmRsZSBITUFDIGNhc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdW5jdGlvbnMgRklQU19tb2R1bGVfdmVyc2lvbigpIGFuZCBGSVBTX21vZHVsZV92ZXJzaW9uX3RleHQoKQogICAgIHRvIHJldHVybiBudW1lcmljYWwgYW5kIHN0cmluZyB2ZXJzaW9ucyBvZiB0aGUgRklQUyBtb2R1bGUgbnVtYmVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbmFtZSBGSVBTX21vZGVfc2V0IGFuZCBGSVBTX21vZGUgdG8gRklQU19tb2R1bGVfbW9kZV9zZXQgYW5kCiAgICAgRklQU19tb2R1bGVfbW9kZS4gRklQU19tb2RlIGFuZCBGSVBTX21vZGVfc2V0IHdpbGwgYmUgaW1wbGVtZW50ZWQKICAgICBvdXRzaWRlIHRoZSB2YWxpZGF0ZWQgbW9kdWxlIGluIHRoZSBGSVBTIGNhcGFibGUgT3BlblNTTC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNaW5vciBjaGFuZ2UgdG8gRFJCRyBlbnRyb3B5IGNhbGxiYWNrIHNlbWFudGljcy4gSW4gc29tZSBjYXNlcwogICAgIHRoZXJlIGlzIG5vIG11bHRpcGxlIG9mIHRoZSBibG9jayBsZW5ndGggYmV0d2VlbiBtaW5fbGVuIGFuZAogICAgIG1heF9sZW4uIEFsbG93IHRoZSBjYWxsYmFjayB0byByZXR1cm4gbW9yZSB0aGFuIG1heF9sZW4gYnl0ZXMKICAgICBvZiBlbnRyb3B5IGJ1dCBkaXNjYXJkIGFueSBleHRyYTogaXQgaXMgdGhlIGNhbGxiYWNrJ3MgcmVzcG9uc2liaWxpdHkKICAgICB0byBlbnN1cmUgdGhhdCB0aGUgZXh0cmEgZGF0YSBkaXNjYXJkZWQgZG9lcyBub3QgaW1wYWN0IHRoZQogICAgIHJlcXVlc3RlZCBhbW91bnQgb2YgZW50cm9weS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgUFJORyBzZWN1cml0eSBzdHJlbmd0aCBjaGVja3MgdG8gUlNBLCBEU0EgYW5kIEVDRFNBIHVzaW5nIAogICAgIGluZm9ybWF0aW9uIGluIEZJUFMxODYtMywgU1A4MDAtNTcgYW5kIFNQODAwLTEzMUEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ0NNIHN1cHBvcnQgdmlhIEVWUC4gSW50ZXJmYWNlIGlzIHZlcnkgc2ltaWxhciB0byBHQ00gY2FzZSBleGNlcHQgd2UKICAgICBtdXN0IHN1cHBseSBhbGwgZGF0YSBpbiBvbmUgY2h1bmsgKGkuZS4gbm8gdXBkYXRlLCBmaW5hbCkgYW5kIHRoZQogICAgIG1lc3NhZ2UgbGVuZ3RoIG11c3QgYmUgc3VwcGxpZWQgaWYgQUFEIGlzIHVzZWQuIEFkZCBhbGdvcml0aG0gdGVzdAogICAgIHN1cHBvcnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCB2ZXJzaW9uIG9mIFBPU1Qgb3ZlcmhhdWwuIEFkZCBQT1NUIGNhbGxiYWNrIHRvIGFsbG93IHRoZSBzdGF0dXMKICAgICBvZiBQT1NUIHRvIGJlIG1vbml0b3JlZCBhbmQvb3IgZmFpbHVyZXMgaW5kdWNlZC4gTW9kaWZ5IGZpcHNfdGVzdF9zdWl0ZQogICAgIHRvIHVzZSBjYWxsYmFjay4gQWx3YXlzIHJ1biBhbGwgc2VsZnRlc3RzIGV2ZW4gaWYgb25lIGZhaWxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFhUUyBzdXBwb3J0IGluY2x1ZGluZyBhbGdvcml0aG0gdGVzdCBkcml2ZXIgaW4gdGhlIGZpcHNfZ2NtdGVzdCBwcm9ncmFtLgogICAgIE5vdGU6IHRoaXMgZG9lcyBpbmNyZWFzZSB0aGUgbWF4aW11bSBrZXkgbGVuZ3RoIGZyb20gMzIgdG8gNjQgYnl0ZXMgYnV0CiAgICAgdGhlcmUgc2hvdWxkIGJlIG5vIGJpbmFyeSBjb21wYXRpYmlsaXR5IGlzc3VlcyBhcyBleGlzdGluZyBhcHBsaWNhdGlvbnMKICAgICB3aWxsIG5ldmVyIHVzZSBYVFMgbW9kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbnNpdmUgcmVvcmdhbmlzYXRpb24gb2YgRklQUyBQUk5HIGJlaGF2aW91ci4gUmVtb3ZlIGFsbCBkZXBlbmRlbmNpZXMKICAgICB0byBPcGVuU1NMIFJBTkQgY29kZSBhbmQgcmVwbGFjZSB3aXRoIGEgdGlueSBGSVBTIFJBTkQgQVBJIHdoaWNoIGFsc28KICAgICBwZXJmb3JtcyBhbGdvcml0aG0gYmxvY2tpbmcgZm9yIHVuYXBwcm92ZWQgUFJORyB0eXBlcy4gQWxzbyBkbyBub3QKICAgICBzZXQgUFJORyB0eXBlIGluIEZJUFNfbW9kZV9zZXQoKTogbGVhdmUgdGhpcyB0byB0aGUgYXBwbGljYXRpb24uCiAgICAgQWRkIGRlZmF1bHQgT3BlblNTTCBEUkJHIGhhbmRsaW5nOiBzZXRzIHVwIEZJUFMgUFJORyBhbmQgc2VlZHMgd2l0aAogICAgIHRoZSBzdGFuZGFyZCBPcGVuU1NMIFBSTkc6IHNldCBhZGRpdGlvbmFsIGRhdGEgdG8gYSBkYXRlIHRpbWUgdmVjdG9yLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbmFtZSBvbGQgWDkuMzEgUFJORyBmdW5jdGlvbnMgb2YgdGhlIGZvcm0gRklQU19yYW5kKiB0byBGSVBTX3g5MzEqLgogICAgIFRoaXMgc2hvdWxkbid0IHByZXNlbnQgYW55IGluY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBiZWNhdXNlIGFwcGxpY2F0aW9ucwogICAgIHNob3VsZG4ndCBiZSB1c2luZyB0aGVzZSBkaXJlY3RseSBhbmQgYW55IHRoYXQgYXJlIHdpbGwgbmVlZCB0byByZXRoaW5rCiAgICAgYW55d2F5IGFzIHRoZSBYOS4zMSBQUk5HIGlzIG5vdyBkZXByZWNhdGVkIGJ5IEZJUFMgMTQwLTIKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbnNpdmUgc2VsZiB0ZXN0cyBhbmQgaGVhbHRoIGNoZWNraW5nIHJlcXVpcmVkIGJ5IFNQODAwLTkwIERSQkcuCiAgICAgUmVtb3ZlIHN0cmVuZ3RoIHBhcmFtZXRlciBmcm9tIEZJUFNfZHJiZ19pbnN0YW50aWF0ZSBhbmQgYWx3YXlzCiAgICAgaW5zdGFudGlhdGUgYXQgbWF4aW11bSBzdXBwb3J0ZWQgc3RyZW5ndGguCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEVDREggY29kZSB0byBmaXBzIG1vZHVsZSBhbmQgZmlwc19lY2RodnMgZm9yIHByaW1pdGl2ZXMgb25seSB0ZXN0aW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBhbGdvcml0aG0gdGVzdCBwcm9ncmFtIGZpcHNfZGh2cyB0byBoYW5kbGUgREggcHJpbWl0aXZlcyBvbmx5IHRlc3RpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIERIX2NvbXB1dGVfa2V5X3BhZGRlZCgpIHRvIGNvbXB1dGUgYSBESCBrZXkgYW5kIHBhZCB3aXRoCiAgICAgbGVhZGluZyB6ZXJvZXMgaWYgbmVlZGVkOiB0aGlzIGNvbXBsaWVzIHdpdGggU1A4MDAtNTZBIGV0IGFsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgU1A4MDAtOTAgRFJCR3MgZm9yIEhhc2ggYW5kIENUUi4gTm90IHVzZWQgYnkKICAgICBhbnl0aGluZywgaW5jb21wbGV0ZSwgc3ViamVjdCB0byBjaGFuZ2UgYW5kIGxhcmdlbHkgdW50ZXN0ZWQgYXQgcHJlc2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgZmlwc2NhbmlzdGVyb25seSBidWlsZCBvcHRpb24gdG8gb25seSBidWlsZCB0aGUgbmVjZXNzYXJ5IG9iamVjdAogICAgIGZpbGVzIGJ5IGZpbHRlcmluZyBGSVBTX0VYX09CSiB0aHJvdWdoIGEgcGVybCBzY3JpcHQgaW4gY3J5cHRvL01ha2VmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBleHBlcmltZW50YWwgb3B0aW9uIEZJUFNTWU1TIHRvIGdpdmUgYWxsIHN5bWJvbHMgaW4KICAgICBmaXBzY2FuaXN0ZXIubyBhbmQgRklQUyBvciBmaXBzIHByZWZpeC4gVGhpcyB3aWxsIGF2b2lkCiAgICAgY29uZmxpY3RzIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIE9wZW5TU0wuIEFkZCBwZXJsIHNjcmlwdAogICAgIHV0aWwvZmlwc2FzLnBsIHRvIHByZXByb2Nlc3MgYXNzZW1ibHkgbGFuZ3VhZ2Ugc291cmNlIGZpbGVzCiAgICAgYW5kIHJlbmFtZSBhbnkgYWZmZWN0ZWQgc3ltYm9scy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc2VsZnRlc3QgY2hlY2tzIGFuZCBhbGdvcml0aG0gYmxvY2sgb2Ygbm9uLWZpcHMgYWxnb3JpdGhtcyBpbgogICAgIEZJUFMgbW9kZS4gUmVtb3ZlIERFUzIgZnJvbSBzZWxmdGVzdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEVDRFNBIGNvZGUgdG8gZmlwcyBtb2R1bGUuIEFkZCB0aW55IGZpcHNfZWNkc2FfY2hlY2sgdG8ganVzdAogICAgIHJldHVybiBpbnRlcm5hbCBtZXRob2Qgd2l0aG91dCBhbnkgRU5HSU5FIGRlcGVuZGVuY2llcy4gQWRkIG5ldwogICAgIHRpbnkgZmlwcyBzaWduIGFuZCB2ZXJpZnkgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBidWlsZCBvcHRpb24gbm8tZWMybSB0byBkaXNhYmxlIGNoYXJhY3RlcmlzdGljIDIgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgYnVpbGQgb3B0aW9uICJmaXBzY2FuaXN0ZXJvbmx5Ii4gVGhpcyBvbmx5IGJ1aWxkcyBmaXBzY2FuaXN0ZXIubwogICAgIGFuZCAoY3VycmVudGx5KSBhc3NvY2lhdGVkIGZpcHMgdXRpbGl0aWVzLiBVc2VzIHRoZSBmaWxlIE1ha2VmaWxlLmZpcHMKICAgICBpbnN0ZWFkIG9mIE1ha2VmaWxlLm9yZyBhcyB0aGUgcHJvdG90eXBlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzb21lIEZJUFMgbW9kZSByZXN0cmljdGlvbnMgdG8gR0NNLiBBZGQgaW50ZXJuYWwgSVYgZ2VuZXJhdG9yLgogICAgIFVwZGF0ZSBmaXBzX2djbXRlc3QgdG8gdXNlIElWIGdlbmVyYXRvci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsLCBleHBlcmltZW50YWwgRVZQIHN1cHBvcnQgZm9yIEFFUy1HQ00uIEFBRCBjYW4gYmUgaW5wdXQgYnkKICAgICBzZXR0aW5nIG91dHB1dCBidWZmZXIgdG8gTlVMTC4gVGhlICpGaW5hbCBmdW5jdGlvbiBtdXN0IGJlCiAgICAgY2FsbGVkIGFsdGhvdWdoIGl0IHdpbGwgbm90IHJldHJpZXZlIGFueSBhZGRpdGlvbmFsIGRhdGEuIFRoZSB0YWcKICAgICBjYW4gYmUgc2V0IG9yIHJldHJpZXZlZCB3aXRoIGEgY3RybC4gVGhlIElWIGxlbmd0aCBpcyBieSBkZWZhdWx0IDEyCiAgICAgYnl0ZXMgKDk2IGJpdHMpIGJ1dCBjYW4gYmUgc2V0IHRvIGFuIGFsdGVybmF0aXZlIHZhbHVlLiBJZiB0aGUgSVYKICAgICBsZW5ndGggZXhjZWVkcyB0aGUgbWF4aW11bSBJViBsZW5ndGggKGN1cnJlbnRseSAxNiBieXRlcykgaXQgY2Fubm90IGJlCiAgICAgc2V0IGJlZm9yZSB0aGUga2V5LiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZmxhZyBpbiBjaXBoZXJzOiBFVlBfQ0lQSF9GTEFHX0NVU1RPTV9DSVBIRVIuIFRoaXMgbWVhbnMgdGhlCiAgICAgdW5kZXJseWluZyBkb19jaXBoZXIgZnVuY3Rpb24gaGFuZGxlcyBhbGwgY2lwaGVyIHNlbWFudGljcyBpdHNlbGYKICAgICBpbmNsdWRpbmcgcGFkZGluZyBhbmQgZmluYWxpc2F0aW9uLiBUaGlzIGlzIHVzZWZ1bCBpZiAoZm9yIGV4YW1wbGUpCiAgICAgYW4gRU5HSU5FIGNpcGhlciBoYW5kbGVzIGJsb2NrIHBhZGRpbmcgaXRzZWxmLiBUaGUgYmVoYXZpb3VyIG9mCiAgICAgZG9fY2lwaGVyIGlzIHN1YnRseSBjaGFuZ2VkIGlmIHRoaXMgZmxhZyBpcyBzZXQ6IHRoZSByZXR1cm4gdmFsdWUKICAgICBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGJ1ZmZlciAoemVybyBpcwogICAgIG5vIGxvbmdlciBhbiBlcnJvciBjb2RlKSBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuIEFsc28gaWYgdGhlCiAgICAgaW5wdXQgYnVmZmVyIGlzIE5VTEwgYW5kIGxlbmd0aCAwIGZpbmFsaXNhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIElmIGEgY2FuZGlkYXRlIGlzc3VlciBjZXJ0aWZpY2F0ZSBpcyBhbHJlYWR5IHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkCiAgICAgcGF0aCBpZ25vcmUgaXQ6IG5ldyBkZWJ1ZyBub3RpZmljYXRpb24gWDUwOV9WX0VSUl9QQVRIX0xPT1AgZm9yIHRoaXMgY2FzZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXByb3ZlIGZvcndhcmQtc2VjdXJpdHkgc3VwcG9ydDogYWRkIGZ1bmN0aW9ucwoKICAgICAgIHZvaWQgU1NMX0NUWF9zZXRfbm90X3Jlc3VtYWJsZV9zZXNzaW9uX2NhbGxiYWNrKFNTTF9DVFggKmN0eCwgaW50ICgqY2IpKFNTTCAqc3NsLCBpbnQgaXNfZm9yd2FyZF9zZWN1cmUpKQogICAgICAgdm9pZCBTU0xfc2V0X25vdF9yZXN1bWFibGVfc2Vzc2lvbl9jYWxsYmFjayhTU0wgKnNzbCwgaW50ICgqY2IpKFNTTCAqc3NsLCBpbnQgaXNfZm9yd2FyZF9zZWN1cmUpKQoKICAgICBmb3IgdXNlIGJ5IFNTTC9UTFMgc2VydmVyczsgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEKICAgICBuZXcgc2Vzc2lvbiBpcyBjcmVhdGVkLCBhbmQgZ2V0cyB0byBkZWNpZGUgd2hldGhlciB0aGUgc2Vzc2lvbiBtYXkgYmUKICAgICBjYWNoZWQgdG8gbWFrZSBpdCByZXN1bWFibGUgKHJldHVybiAwKSBvciBub3QgKHJldHVybiAxKS4gIChBcyBieSB0aGUKICAgICBTU0wvVExTIHByb3RvY29sIHNwZWNpZmljYXRpb25zLCB0aGUgc2Vzc2lvbl9pZCBzZW50IGJ5IHRoZSBzZXJ2ZXIgd2lsbCBiZQogICAgIGVtcHR5IHRvIGluZGljYXRlIHRoYXQgdGhlIHNlc3Npb24gaXMgbm90IHJlc3VtYWJsZTsgYWxzbywgdGhlIHNlcnZlciB3aWxsCiAgICAgbm90IGdlbmVyYXRlIFJGQyA0NTA3IChSRkMgNTA3Nykgc2Vzc2lvbiB0aWNrZXRzLikKCiAgICAgQSBzaW1wbGUgcmVhc29uYWJsZSBjYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBpcyB0byByZXR1cm4gaXNfZm9yd2FyZF9zZWN1cmUuCiAgICAgVGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgdG8gMSBvciAwIGRlcGVuZGluZyBvbiB0aGUgY2lwaGVyc3VpdGUgc2VsZWN0ZWQKICAgICBieSB0aGUgU1NML1RMUyBzZXJ2ZXIgbGlicmFyeSwgaW5kaWNhdGluZyB3aGV0aGVyIGl0IGNhbiBwcm92aWRlIGZvcndhcmQKICAgICBzZWN1cml0eS4KICAgICBbRW1pbGlhIEvkc3BlciA8ZW1pbGlhLmthc3BlckBlc2F0Lmt1bGV1dmVuLmJlPiAoR29vZ2xlKV0KCiAgKikgTmV3IC12ZXJpZnlfbmFtZSBvcHRpb24gaW4gY29tbWFuZCBsaW5lIHV0aWxpdGllcyB0byBzZXQgdmVyaWZpY2F0aW9uCiAgICAgcGFyYW1ldGVycyBieSBuYW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgQ01BQyBpbXBsZW1lbnRhdGlvbi4gV0FSTklORzogRVhQRVJJTUVOVEFMLCBBUEkgTUFZIENIQU5HRS4KICAgICBBZGQgQ01BQyBwa2V5IG1ldGhvZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXhwZXJpbWVudGFsIHJlbmVnb3RpYXRpb24gaW4gc19zZXJ2ZXIgLXd3dyBtb2RlLiBJZiB0aGUgY2xpZW50IAogICAgIGJyb3dzZXMgL3JlbmVnIGNvbm5lY3Rpb24gaXMgcmVuZWdvdGlhdGVkLiBJZiAvcmVuZWdjZXJ0IGl0IGlzCiAgICAgcmVuZWdvdGlhdGVkIHJlcXVlc3RpbmcgYSBjZXJ0aWZpY2F0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYW4gImV4dGVybmFsIiBzZXNzaW9uIGNhY2hlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgdG8gc19zZXJ2ZXIuIFRoaXMKICAgICBzaG91bGQgaGVscCB0cmFjZSBpc3N1ZXMgd2hpY2ggbm9ybWFsbHkgYXJlIG9ubHkgYXBwYXJlbnQgaW4gZGVwbG95ZWQKICAgICBtdWx0aS1wcm9jZXNzIHNlcnZlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5zaXZlIGF1ZGl0IG9mIGxpYmNyeXB0byB3aXRoIERFQlVHX1VOVVNFRC4gRml4IG1hbnkgY2FzZXMgd2hlcmUKICAgICByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4gTkIuIFRoZSBmdW5jdGlvbnMgUkFORF9hZGQoKSwgUkFORF9zZWVkKCksCiAgICAgQklPX3NldF9jaXBoZXIoKSBhbmQgc29tZSBvYnNjdXJlIFBFTSBmdW5jdGlvbnMgd2VyZSBjaGFuZ2VkIHNvIHRoZXkKICAgICBjYW4gbm93IHJldHVybiBhbiBlcnJvci4gVGhlIFJBTkQgY2hhbmdlcyByZXF1aXJlZCBhIGNoYW5nZSB0byB0aGUKICAgICBSQU5EX01FVEhPRCBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG1hY3JvIF9fb3d1ciBmb3IgIk9wZW5TU0wgV2FybiBVbnVzZWQgUmVzdWx0Ii4gVGhpcyBtYWtlcyB1c2Ugb2YKICAgICBhIGdjYyBhdHRyaWJ1dGUgdG8gd2FybiBpZiB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24gaXMgaWdub3JlZC4gVGhpcwogICAgIGlzIGVuYWJsZSBpZiBERUJVR19VTlVTRUQgaXMgc2V0LiBBZGQgdG8gc2V2ZXJhbCBmdW5jdGlvbnMgaW4gZXZwLmgKICAgICB3aG9zZSByZXR1cm4gdmFsdWUgaXMgb2Z0ZW4gaWdub3JlZC4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjIgYW5kIDEuMC4yYSBbeHggWFhYIHh4eHhdCgogICopIENsaWVudEhlbGxvIHNpZ2FsZ3MgRG9TIGZpeAoKICAgICBJZiBhIGNsaWVudCBjb25uZWN0cyB0byBhbiBPcGVuU1NMIDEuMC4yIHNlcnZlciBhbmQgcmVuZWdvdGlhdGVzIHdpdGggYW4KICAgICBpbnZhbGlkIHNpZ25hdHVyZSBhbGdvcml0aG1zIGV4dGVuc2lvbiBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSB3aWxsCiAgICAgb2NjdXIuIFRoaXMgY2FuIGJlIGV4cGxvaXRlZCBpbiBhIERvUyBhdHRhY2sgYWdhaW5zdCB0aGUgc2VydmVyLgoKICAgICBUaGlzIGlzc3VlIHdhcyB3YXMgcmVwb3J0ZWQgdG8gT3BlblNTTCBieSBEYXZpZCBSYW1vcyBvZiBTdGFuZm9yZAogICAgIFVuaXZlcnNpdHkuCiAgICAgKENWRS0yMDE1LTAyOTEpCiAgICAgW1N0ZXBoZW4gSGVuc29uIGFuZCBNYXR0IENhc3dlbGxdCgogICopIE11bHRpYmxvY2sgY29ycnVwdGVkIHBvaW50ZXIgZml4CgogICAgIE9wZW5TU0wgMS4wLjIgaW50cm9kdWNlZCB0aGUgIm11bHRpYmxvY2siIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LiBUaGlzCiAgICAgZmVhdHVyZSBvbmx5IGFwcGxpZXMgb24gNjQgYml0IHg4NiBhcmNoaXRlY3R1cmUgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBBRVMKICAgICBOSSBpbnN0cnVjdGlvbnMuIEEgZGVmZWN0IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiAibXVsdGlibG9jayIgY2FuIGNhdXNlCiAgICAgT3BlblNTTCdzIGludGVybmFsIHdyaXRlIGJ1ZmZlciB0byBiZWNvbWUgaW5jb3JyZWN0bHkgc2V0IHRvIE5VTEwgd2hlbgogICAgIHVzaW5nIG5vbi1ibG9ja2luZyBJTy4gVHlwaWNhbGx5LCB3aGVuIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGlzIHVzaW5nIGEKICAgICBzb2NrZXQgQklPIGZvciB3cml0aW5nLCB0aGlzIHdpbGwgb25seSByZXN1bHQgaW4gYSBmYWlsZWQgY29ubmVjdGlvbi4KICAgICBIb3dldmVyIGlmIHNvbWUgb3RoZXIgQklPIGlzIHVzZWQgdGhlbiBpdCBpcyBsaWtlbHkgdGhhdCBhIHNlZ21lbnRhdGlvbgogICAgIGZhdWx0IHdpbGwgYmUgdHJpZ2dlcmVkLCB0aHVzIGVuYWJsaW5nIGEgcG90ZW50aWFsIERvUyBhdHRhY2suCgogICAgIFRoaXMgaXNzdWUgd2FzIHJlcG9ydGVkIHRvIE9wZW5TU0wgYnkgRGFuaWVsIERhbm5lciBhbmQgUmFpbmVyIE11ZWxsZXIuCiAgICAgKENWRS0yMDE1LTAyOTApCiAgICAgW01hdHQgQ2Fzd2VsbF0KCiAgKikgU2VnbWVudGF0aW9uIGZhdWx0IGluIERUTFN2MV9saXN0ZW4gZml4CgogICAgIFRoZSBEVExTdjFfbGlzdGVuIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHN0YXRlbGVzcyBhbmQgcHJvY2Vzc2VzIHRoZQogICAgIGluaXRpYWwgQ2xpZW50SGVsbG8gZnJvbSBtYW55IHBlZXJzLiBJdCBpcyBjb21tb24gZm9yIHVzZXIgY29kZSB0byBsb29wCiAgICAgb3ZlciB0aGUgY2FsbCB0byBEVExTdjFfbGlzdGVuIHVudGlsIGEgdmFsaWQgQ2xpZW50SGVsbG8gaXMgcmVjZWl2ZWQgd2l0aAogICAgIGFuIGFzc29jaWF0ZWQgY29va2llLiBBIGRlZmVjdCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgRFRMU3YxX2xpc3RlbiBtZWFucwogICAgIHRoYXQgc3RhdGUgaXMgcHJlc2VydmVkIGluIHRoZSBTU0wgb2JqZWN0IGZyb20gb25lIGludm9jYXRpb24gdG8gdGhlIG5leHQKICAgICB0aGF0IGNhbiBsZWFkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0LiBFcnJvcnMgcHJvY2Vzc2luZyB0aGUgaW5pdGlhbAogICAgIENsaWVudEhlbGxvIGNhbiB0cmlnZ2VyIHRoaXMgc2NlbmFyaW8uIEFuIGV4YW1wbGUgb2Ygc3VjaCBhbiBlcnJvciBjb3VsZCBiZQogICAgIHRoYXQgYSBEVExTMS4wIG9ubHkgY2xpZW50IGlzIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBhIERUTFMxLjIgb25seQogICAgIHNlcnZlci4KCiAgICAgVGhpcyBpc3N1ZSB3YXMgcmVwb3J0ZWQgdG8gT3BlblNTTCBieSBQZXIgQWxsYW5zc29uLgogICAgIChDVkUtMjAxNS0wMjA3KQogICAgIFtNYXR0IENhc3dlbGxdCgogICopIFNlZ21lbnRhdGlvbiBmYXVsdCBpbiBBU04xX1RZUEVfY21wIGZpeAoKICAgICBUaGUgZnVuY3Rpb24gQVNOMV9UWVBFX2NtcCB3aWxsIGNyYXNoIHdpdGggYW4gaW52YWxpZCByZWFkIGlmIGFuIGF0dGVtcHQgaXMKICAgICBtYWRlIHRvIGNvbXBhcmUgQVNOLjEgYm9vbGVhbiB0eXBlcy4gU2luY2UgQVNOMV9UWVBFX2NtcCBpcyB1c2VkIHRvIGNoZWNrCiAgICAgY2VydGlmaWNhdGUgc2lnbmF0dXJlIGFsZ29yaXRobSBjb25zaXN0ZW5jeSB0aGlzIGNhbiBiZSB1c2VkIHRvIGNyYXNoIGFueQogICAgIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBvcGVyYXRpb24gYW5kIGV4cGxvaXRlZCBpbiBhIERvUyBhdHRhY2suIEFueQogICAgIGFwcGxpY2F0aW9uIHdoaWNoIHBlcmZvcm1zIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBpcyB2dWxuZXJhYmxlIGluY2x1ZGluZwogICAgIE9wZW5TU0wgY2xpZW50cyBhbmQgc2VydmVycyB3aGljaCBlbmFibGUgY2xpZW50IGF1dGhlbnRpY2F0aW9uLgogICAgIChDVkUtMjAxNS0wMjg2KQogICAgIFtTdGVwaGVuIEhlbnNvbl0KCiAgKikgU2VnbWVudGF0aW9uIGZhdWx0IGZvciBpbnZhbGlkIFBTUyBwYXJhbWV0ZXJzIGZpeAoKICAgICBUaGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiByb3V0aW5lcyB3aWxsIGNyYXNoIHdpdGggYSBOVUxMIHBvaW50ZXIKICAgICBkZXJlZmVyZW5jZSBpZiBwcmVzZW50ZWQgd2l0aCBhbiBBU04uMSBzaWduYXR1cmUgdXNpbmcgdGhlIFJTQSBQU1MKICAgICBhbGdvcml0aG0gYW5kIGludmFsaWQgcGFyYW1ldGVycy4gU2luY2UgdGhlc2Ugcm91dGluZXMgYXJlIHVzZWQgdG8gdmVyaWZ5CiAgICAgY2VydGlmaWNhdGUgc2lnbmF0dXJlIGFsZ29yaXRobXMgdGhpcyBjYW4gYmUgdXNlZCB0byBjcmFzaCBhbnkKICAgICBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gb3BlcmF0aW9uIGFuZCBleHBsb2l0ZWQgaW4gYSBEb1MgYXR0YWNrLiBBbnkKICAgICBhcHBsaWNhdGlvbiB3aGljaCBwZXJmb3JtcyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gaXMgdnVsbmVyYWJsZSBpbmNsdWRpbmcKICAgICBPcGVuU1NMIGNsaWVudHMgYW5kIHNlcnZlcnMgd2hpY2ggZW5hYmxlIGNsaWVudCBhdXRoZW50aWNhdGlvbi4KCiAgICAgVGhpcyBpc3N1ZSB3YXMgd2FzIHJlcG9ydGVkIHRvIE9wZW5TU0wgYnkgQnJpYW4gQ2FycGVudGVyLgogICAgIChDVkUtMjAxNS0wMjA4KQogICAgIFtTdGVwaGVuIEhlbnNvbl0KCiAgKikgQVNOLjEgc3RydWN0dXJlIHJldXNlIG1lbW9yeSBjb3JydXB0aW9uIGZpeAoKICAgICBSZXVzaW5nIGEgc3RydWN0dXJlIGluIEFTTi4xIHBhcnNpbmcgbWF5IGFsbG93IGFuIGF0dGFja2VyIHRvIGNhdXNlCiAgICAgbWVtb3J5IGNvcnJ1cHRpb24gdmlhIGFuIGludmFsaWQgd3JpdGUuIFN1Y2ggcmV1c2UgaXMgYW5kIGhhcyBiZWVuCiAgICAgc3Ryb25nbHkgZGlzY291cmFnZWQgYW5kIGlzIGJlbGlldmVkIHRvIGJlIHJhcmUuCgogICAgIEFwcGxpY2F0aW9ucyB0aGF0IHBhcnNlIHN0cnVjdHVyZXMgY29udGFpbmluZyBDSE9JQ0Ugb3IgQU5ZIERFRklORUQgQlkKICAgICBjb21wb25lbnRzIG1heSBiZSBhZmZlY3RlZC4gQ2VydGlmaWNhdGUgcGFyc2luZyAoZDJpX1g1MDkgYW5kIHJlbGF0ZWQKICAgICBmdW5jdGlvbnMpIGFyZSBob3dldmVyIG5vdCBhZmZlY3RlZC4gT3BlblNTTCBjbGllbnRzIGFuZCBzZXJ2ZXJzIGFyZQogICAgIG5vdCBhZmZlY3RlZC4KICAgICAoQ1ZFLTIwMTUtMDI4NykKICAgICBbU3RlcGhlbiBIZW5zb25dCgogICopIFBLQ1M3IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMgZml4CgogICAgIFRoZSBQS0NTIzcgcGFyc2luZyBjb2RlIGRvZXMgbm90IGhhbmRsZSBtaXNzaW5nIG91dGVyIENvbnRlbnRJbmZvCiAgICAgY29ycmVjdGx5LiBBbiBhdHRhY2tlciBjYW4gY3JhZnQgbWFsZm9ybWVkIEFTTi4xLWVuY29kZWQgUEtDUyM3IGJsb2JzIHdpdGgKICAgICBtaXNzaW5nIGNvbnRlbnQgYW5kIHRyaWdnZXIgYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2Ugb24gcGFyc2luZy4KCiAgICAgQXBwbGljYXRpb25zIHRoYXQgdmVyaWZ5IFBLQ1MjNyBzaWduYXR1cmVzLCBkZWNyeXB0IFBLQ1MjNyBkYXRhIG9yCiAgICAgb3RoZXJ3aXNlIHBhcnNlIFBLQ1MjNyBzdHJ1Y3R1cmVzIGZyb20gdW50cnVzdGVkIHNvdXJjZXMgYXJlCiAgICAgYWZmZWN0ZWQuIE9wZW5TU0wgY2xpZW50cyBhbmQgc2VydmVycyBhcmUgbm90IGFmZmVjdGVkLgoKICAgICBUaGlzIGlzc3VlIHdhcyByZXBvcnRlZCB0byBPcGVuU1NMIGJ5IE1pY2hhbCBaYWxld3NraSAoR29vZ2xlKS4KICAgICAoQ1ZFLTIwMTUtMDI4OSkKICAgICBbRW1pbGlhIEvkc3Blcl0KCiAgKikgRG9TIHZpYSByZWFjaGFibGUgYXNzZXJ0IGluIFNTTHYyIHNlcnZlcnMgZml4CgogICAgIEEgbWFsaWNpb3VzIGNsaWVudCBjYW4gdHJpZ2dlciBhbiBPUEVOU1NMX2Fzc2VydCAoaS5lLiwgYW4gYWJvcnQpIGluCiAgICAgc2VydmVycyB0aGF0IGJvdGggc3VwcG9ydCBTU0x2MiBhbmQgZW5hYmxlIGV4cG9ydCBjaXBoZXIgc3VpdGVzIGJ5IHNlbmRpbmcKICAgICBhIHNwZWNpYWxseSBjcmFmdGVkIFNTTHYyIENMSUVOVC1NQVNURVItS0VZIG1lc3NhZ2UuCgogICAgIFRoaXMgaXNzdWUgd2FzIGRpc2NvdmVyZWQgYnkgU2VhbiBCdXJmb3JkIChHb29nbGUpIGFuZCBFbWlsaWEgS+RzcGVyCiAgICAgKE9wZW5TU0wgZGV2ZWxvcG1lbnQgdGVhbSkuCiAgICAgKENWRS0yMDE1LTAyOTMpCiAgICAgW0VtaWxpYSBL5HNwZXJdCgogICopIEVtcHR5IENLRSB3aXRoIGNsaWVudCBhdXRoIGFuZCBESEUgZml4CgogICAgIElmIGNsaWVudCBhdXRoIGlzIHVzZWQgdGhlbiBhIHNlcnZlciBjYW4gc2VnIGZhdWx0IGluIHRoZSBldmVudCBvZiBhIERIRQogICAgIGNpcGhlcnN1aXRlIGJlaW5nIHNlbGVjdGVkIGFuZCBhIHplcm8gbGVuZ3RoIENsaWVudEtleUV4Y2hhbmdlIG1lc3NhZ2UKICAgICBiZWluZyBzZW50IGJ5IHRoZSBjbGllbnQuIFRoaXMgY291bGQgYmUgZXhwbG9pdGVkIGluIGEgRG9TIGF0dGFjay4KICAgICAoQ1ZFLTIwMTUtMTc4NykKICAgICBbTWF0dCBDYXN3ZWxsXQoKICAqKSBIYW5kc2hha2Ugd2l0aCB1bnNlZWRlZCBQUk5HIGZpeAoKICAgICBVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgYW4gT3BlblNTTCAxLjAuMiBjbGllbnQgY2FuIGNvbXBsZXRlIGEgaGFuZHNoYWtlCiAgICAgd2l0aCBhbiB1bnNlZWRlZCBQUk5HLiBUaGUgY29uZGl0aW9ucyBhcmU6CiAgICAgLSBUaGUgY2xpZW50IGlzIG9uIGEgcGxhdGZvcm0gd2hlcmUgdGhlIFBSTkcgaGFzIG5vdCBiZWVuIHNlZWRlZAogICAgIGF1dG9tYXRpY2FsbHksIGFuZCB0aGUgdXNlciBoYXMgbm90IHNlZWRlZCBtYW51YWxseQogICAgIC0gQSBwcm90b2NvbCBzcGVjaWZpYyBjbGllbnQgbWV0aG9kIHZlcnNpb24gaGFzIGJlZW4gdXNlZCAoaS5lLiBub3QKICAgICBTU0xfY2xpZW50X21ldGhvZHYyMykKICAgICAtIEEgY2lwaGVyc3VpdGUgaXMgdXNlZCB0aGF0IGRvZXMgbm90IHJlcXVpcmUgYWRkaXRpb25hbCByYW5kb20gZGF0YSBmcm9tCiAgICAgdGhlIFBSTkcgYmV5b25kIHRoZSBpbml0aWFsIENsaWVudEhlbGxvIGNsaWVudCByYW5kb20gKGUuZy4gUFNLLVJDNC1TSEEpLgoKICAgICBJZiB0aGUgaGFuZHNoYWtlIHN1Y2NlZWRzIHRoZW4gdGhlIGNsaWVudCByYW5kb20gdGhhdCBoYXMgYmVlbiB1c2VkIHdpbGwKICAgICBoYXZlIGJlZW4gZ2VuZXJhdGVkIGZyb20gYSBQUk5HIHdpdGggaW5zdWZmaWNpZW50IGVudHJvcHkgYW5kIHRoZXJlZm9yZSB0aGUKICAgICBvdXRwdXQgbWF5IGJlIHByZWRpY3RhYmxlLgoKICAgICBGb3IgZXhhbXBsZSB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQgd2l0aCBhbiB1bnNlZWRlZCBvcGVuc3NsIHdpbGwKICAgICBzdWNjZWVkIG9uIGFuIHVucGF0Y2hlZCBwbGF0Zm9ybToKCiAgICAgb3BlbnNzbCBzX2NsaWVudCAtcHNrIDFhMmIzYzRkIC10bHMxXzIgLWNpcGhlciBQU0stUkM0LVNIQQogICAgIChDVkUtMjAxNS0wMjg1KQogICAgIFtNYXR0IENhc3dlbGxdCgogICopIFVzZSBBZnRlciBGcmVlIGZvbGxvd2luZyBkMmlfRUNQcml2YXRla2V5IGVycm9yIGZpeAoKICAgICBBIG1hbGZvcm1lZCBFQyBwcml2YXRlIGtleSBmaWxlIGNvbnN1bWVkIHZpYSB0aGUgZDJpX0VDUHJpdmF0ZUtleSBmdW5jdGlvbgogICAgIGNvdWxkIGNhdXNlIGEgdXNlIGFmdGVyIGZyZWUgY29uZGl0aW9uLiBUaGlzLCBpbiB0dXJuLCBjb3VsZCBjYXVzZSBhIGRvdWJsZQogICAgIGZyZWUgaW4gc2V2ZXJhbCBwcml2YXRlIGtleSBwYXJzaW5nIGZ1bmN0aW9ucyAoc3VjaCBhcyBkMmlfUHJpdmF0ZUtleQogICAgIG9yIEVWUF9QS0NTODJQS0VZKSBhbmQgY291bGQgbGVhZCB0byBhIERvUyBhdHRhY2sgb3IgbWVtb3J5IGNvcnJ1cHRpb24KICAgICBmb3IgYXBwbGljYXRpb25zIHRoYXQgcmVjZWl2ZSBFQyBwcml2YXRlIGtleXMgZnJvbSB1bnRydXN0ZWQKICAgICBzb3VyY2VzLiBUaGlzIHNjZW5hcmlvIGlzIGNvbnNpZGVyZWQgcmFyZS4KCiAgICAgVGhpcyBpc3N1ZSB3YXMgZGlzY292ZXJlZCBieSB0aGUgQm9yaW5nU1NMIHByb2plY3QgYW5kIGZpeGVkIGluIHRoZWlyCiAgICAgY29tbWl0IDUxNzA3M2NkNGIuCiAgICAgKENWRS0yMDE1LTAyMDkpCiAgICAgW01hdHQgQ2Fzd2VsbF0KCiAgKikgWDUwOV90b19YNTA5X1JFUSBOVUxMIHBvaW50ZXIgZGVyZWYgZml4CgogICAgIFRoZSBmdW5jdGlvbiBYNTA5X3RvX1g1MDlfUkVRIHdpbGwgY3Jhc2ggd2l0aCBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBpZgogICAgIHRoZSBjZXJ0aWZpY2F0ZSBrZXkgaXMgaW52YWxpZC4gVGhpcyBmdW5jdGlvbiBpcyByYXJlbHkgdXNlZCBpbiBwcmFjdGljZS4KCiAgICAgVGhpcyBpc3N1ZSB3YXMgZGlzY292ZXJlZCBieSBCcmlhbiBDYXJwZW50ZXIuCiAgICAgKENWRS0yMDE1LTAyODgpCiAgICAgW1N0ZXBoZW4gSGVuc29uXQoKICAqKSBSZW1vdmVkIHRoZSBleHBvcnQgY2lwaGVycyBmcm9tIHRoZSBERUZBVUxUIGNpcGhlcnMKICAgICBbS3VydCBSb2Vja3hdCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xbCBhbmQgMS4wLjIgWzIyIEphbiAyMDE1XQoKICAqKSBGYWNpbGl0YXRlICJ1bml2ZXJzYWwiIEFSTSBidWlsZHMgdGFyZ2V0aW5nIHJhbmdlIG9mIEFSTSBJU0FzLCBlLmcuCiAgICAgQVJNdjUgdGhyb3VnaCBBUk12OCwgYXMgb3Bwb3NpdGUgdG8gImxvY2tpbmciIGl0IHRvIHNpbmdsZSBvbmUuCiAgICAgU28gZmFyIHRob3NlIHdobyBoYXZlIHRvIHRhcmdldCBtdWx0aXBsZSBwbGFmb3JtcyB3b3VsZCBjb21wcm9taXNlCiAgICAgYW5kIGFyZ3VlIHRoYXQgYmluYXJ5IHRhcmdldGluZyBzYXkgQVJNdjUgd291bGQgc3RpbGwgZXhlY3V0ZSBvbgogICAgIEFSTXY4LiAiVW5pdmVyc2FsIiBidWlsZCByZXNvbHZlcyB0aGlzIGNvbXByb21pc2UgYnkgcHJvdmlkaW5nCiAgICAgbmVhci1vcHRpbWFsIHBlcmZvcm1hbmNlIGV2ZW4gb24gbmV3ZXIgcGxhdGZvcm1zLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBY2NlbGVyYXRlZCBOSVNUIFAtMjU2IGVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uIGZvciB4ODZfNjQKICAgICAob3RoZXIgcGxhdGZvcm1zIHBlbmRpbmcpLgogICAgIFtTaGF5IEd1ZXJvbiAmIFZsYWQgS3Jhc25vdiAoSW50ZWwgQ29ycCksIEFuZHkgUG9seWFrb3ZdCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgU2lnbmVkQ2VydGlmaWNhdGVUaW1lc3RhbXBMaXN0IGNlcnRpZmljYXRlIGFuZAogICAgIE9DU1AgcmVzcG9uc2UgZXh0ZW5zaW9ucyBmcm9tIFJGQzY5NjIuCiAgICAgW1JvYiBTdHJhZGxpbmddCgogICopIEZpeCBlY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZSAodGh1cywgRUNfUE9JTlRzX211bCBldGMuKQogICAgIGZvciBjb3JuZXIgY2FzZXMuIChDZXJ0YWluIGlucHV0IHBvaW50cyBhdCBpbmZpbml0eSBjb3VsZCBsZWFkIHRvCiAgICAgYm9ndXMgcmVzdWx0cywgd2l0aCBub24taW5maW5pdHkgaW5wdXRzIG1hcHBlZCB0byBpbmZpbml0eSB0b28uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgUG93ZXJJU0EgMi4wLjcsIGZpcnN0IGltcGxlbWVudGVkIGluIFBPV0VSOC4KICAgICBUaGlzIGNvdmVycyBBRVMsIFNIQTI1Ni81MTIgYW5kIEdIQVNILiAiSW5pdGlhbCIgbWVhbnMgdGhhdCBtb3N0CiAgICAgY29tbW9uIGNhc2VzIGFyZSBvcHRpbWl6ZWQgYW5kIHRoZXJlIHN0aWxsIGlzIHJvb20gZm9yIGZ1cnRoZXIKICAgICBpbXByb3ZlbWVudHMuIFZlY3RvciBQZXJtdXRhdGlvbiBBRVMgZm9yIEFsdGl2ZWMgaXMgYWxzbyBhZGRlZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGxpdHRsZS1lbmRpYW4gcHBjNjQgTGludXggdGFyZ2V0LgogICAgIFtNYXJjZWxvIENlcnJpIChJQk0pXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIEFNUnY4IElTQSBjcnlwdG8gZXh0ZW5zaW9ucy4gVGhpcyBjb3ZlcnMgQUVTLAogICAgIFNIQTEsIFNIQTI1NiBhbmQgR0hBU0guICJJbml0aWFsIiBtZWFucyB0aGF0IG1vc3QgY29tbW9uIGNhc2VzCiAgICAgYXJlIG9wdGltaXplZCBhbmQgdGhlcmUgc3RpbGwgaXMgcm9vbSBmb3IgZnVydGhlciBpbXByb3ZlbWVudHMuCiAgICAgQm90aCAzMi0gYW5kIDY0LWJpdCBtb2RlcyBhcmUgc3VwcG9ydGVkLgogICAgIFtBbmR5IFBvbHlha292LCBBcmQgQmllc2hldXZlbCAoTGluYXJvKV0KCiAgKikgSW1wcm92ZWQgQVJNdjcgTkVPTiBzdXBwb3J0LgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBTdXBwb3J0IGZvciBTUEFSQyBBcmNoaXRlY3R1cmUgMjAxMSBjcnlwdG8gZXh0ZW5zaW9ucywgZmlyc3QKICAgICBpbXBsZW1lbnRlZCBpbiBTUEFSQyBUNC4gVGhpcyBjb3ZlcnMgQUVTLCBERVMsIENhbWVsbGlhLCBTSEExLAogICAgIFNIQTI1Ni81MTIsIE1ENSwgR0hBU0ggYW5kIG1vZHVsYXIgZXhwb25lbnRpYXRpb24uCiAgICAgW0FuZHkgUG9seWFrb3YsIERhdmlkIE1pbGxlcl0KCiAgKikgQWNjZWxlcmF0ZWQgbW9kdWxhciBleHBvbmVudGlhdGlvbiBmb3IgSW50ZWwgcHJvY2Vzc29ycywgYS5rLmEuCiAgICAgUlNBWi4KICAgICBbU2hheSBHdWVyb24gJiBWbGFkIEtyYXNub3YgKEludGVsIENvcnApXQoKICAqKSBTdXBwb3J0IGZvciBuZXcgYW5kIHVwY29taW5nIEludGVsIHByb2Nlc3NvcnMsIGluY2x1ZGluZyBBVlgyLAogICAgIEJNSSBhbmQgU0hBIElTQSBleHRlbnNpb25zLiBUaGlzIGluY2x1ZGVzIGFkZGl0aW9uYWwgInN0aXRjaGVkIgogICAgIGltcGxlbWVudGF0aW9ucywgQUVTTkktU0hBMjU2IGFuZCBHQ00sIGFuZCBtdWx0aS1idWZmZXIgc3VwcG9ydAogICAgIGZvciBUTFMgZW5jcnlwdC4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgSW50ZWwgQ29ycC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgU3VwcG9ydCBmb3IgRFRMUyAxLjIuIFRoaXMgYWRkcyB0d28gc2V0cyBvZiBEVExTIG1ldGhvZHM6IERUTFNfKl9tZXRob2QoKQogICAgIHN1cHBvcnRzIGJvdGggRFRMUyAxLjIgYW5kIDEuMCBhbmQgc2hvdWxkIHVzZSB3aGF0ZXZlciB2ZXJzaW9uIHRoZSBwZWVyCiAgICAgc3VwcG9ydHMgYW5kIERUTFN2MV8yXypfbWV0aG9kKCkgd2hpY2ggc3VwcG9ydHMgRFRMUyAxLjIgb25seS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVc2UgYWxnb3JpdGhtIHNwZWNpZmljIGNoYWlucyBpbiBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKCk6CiAgICAgdGhpcyBmaXhlcyBhIGxpbWlhdGlvbiBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBPcGVuU1NMLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZGVkIFJTQSBPQUVQIHN1cHBvcnQgdmlhIEVWUF9QS0VZIEFQSS4gT3B0aW9ucyB0byBzcGVjaWZ5IGRpZ2VzdCwKICAgICBNR0YxIGRpZ2VzdCBhbmQgT0FFUCBsYWJlbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgRVZQIHN1cHBvcnQgZm9yIGtleSB3cmFwcGluZyBhbGdvcml0aG1zLCB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCiAgICAgZXhpc3RpbmcgY29kZSB0aGUgZmxhZyBFVlBfQ0lQSEVSX0NUWF9XUkFQX0FMTE9XIGhhcyB0byBiZSBzZXQgaW4KICAgICB0aGUgRVZQX0NJUEhFUl9DVFggb3IgYW4gZXJyb3IgaXMgcmV0dXJuZWQuIEFkZCBBRVMgYW5kIERFUzMgd3JhcAogICAgIGFsZ29yaXRobXMgYW5kIGluY2x1ZGUgdGVzdHMgY2FzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bmN0aW9ucyB0byBhbGxvY2F0ZSBhbmQgc2V0IHRoZSBmaWVsZHMgb2YgYW4gRUNEU0FfTUVUSE9ECiAgICAgc3RydWN0dXJlLgogICAgIFtEb3VnbGFzIEUuIEVuZ2VydCwgU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIE9QRU5TU0xfZ210aW1lX2RpZmYgYW5kIEFTTjFfVElNRV9kaWZmIHRvIGZpbmQgdGhlCiAgICAgZGlmZmVyZW5jZSBpbiBkYXlzIGFuZCBzZWNvbmRzIGJldHdlZW4gdHdvIHRtIG9yIEFTTjFfVElNRSBzdHJ1Y3R1cmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAtcmV2IHRlc3Qgb3B0aW9uIHRvIHNfc2VydmVyIHRvIGp1c3QgcmV2ZXJzZSBvcmRlciBvZiBjaGFyYWN0ZXJzCiAgICAgcmVjZWl2ZWQgYnkgY2xpZW50IGFuZCBzZW5kIGJhY2sgdG8gc2VydmVyLiBBbHNvIHByaW50cyBhbiBhYmJyZXZpYXRlZAogICAgIHN1bW1hcnkgb2YgdGhlIGNvbm5lY3Rpb24gcGFyYW1ldGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9uIC1icmllZiBmb3Igc19jbGllbnQgYW5kIHNfc2VydmVyIHRvIHByaW50IG91dCBhIGJyaWVmIHN1bW1hcnkKICAgICBvZiBjb25uZWN0aW9uIHBhcmFtZXRlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNhbGxiYWNrcyBmb3IgYXJiaXRyYXJ5IFRMUyBleHRlbnNpb25zLgogICAgIFtUcmV2b3IgUGVycmluIDx0cmV2cEB0cmV2cC5uZXQ+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBOZXcgb3B0aW9uIC1jcmxfZG93bmxvYWQgaW4gc2V2ZXJhbCBvcGVuc3NsIHV0aWxpdGllcyB0byBkb3dubG9hZCBDUkxzCiAgICAgZnJvbSBDUkxEUCBleHRlbnNpb24gaW4gY2VydGlmaWNhdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb25zIC1DUkwgYW5kIC1DUkxmb3JtIGZvciBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgZm9yIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfQ1JMX2RpZmYgdG8gZ2VuZXJhdGUgYSBkZWx0YSBDUkwgZnJvbSB0aGUgZGlmZmVyZW5jZQogICAgIG9mIHR3byBmdWxsIENSTHMuIEFkZCBzdXBwb3J0IHRvICJjcmwiIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyB0byBzZXQgbG9va3VwX2NybHMgZnVuY3Rpb24gYW5kIHRvIHJldHJpZXZlCiAgICAgWDUwOV9TVE9SRSBmcm9tIFg1MDlfU1RPUkVfQ1RYLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFByaW50IG91dCBkZXByZWNhdGVkIGlzc3VlciBhbmQgc3ViamVjdCB1bmlxdWUgSUQgZmllbGRzIGluCiAgICAgY2VydGlmaWNhdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZCBPQ1NQIEkvTyBmdW5jdGlvbnMgc28gdGhleSBjYW4gYmUgdXNlZCBmb3Igc2ltcGxlIGdlbmVyYWwgcHVycG9zZQogICAgIEhUVFAgYXMgd2VsbCBhcyBPQ1NQLiBOZXcgd3JhcHBlciBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBkb3dubG9hZAogICAgIENSTHMgdXNpbmcgdGhlIE9DU1AgQVBJLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERlbGVnYXRlIGNvbW1hbmQgbGluZSBoYW5kbGluZyBpbiBzX2NsaWVudC9zX3NlcnZlciB0byBTU0xfQ09ORiBBUElzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNTTF9DT05GKiBmdW5jdGlvbnMuIFRoZXNlIHByb3ZpZGUgYSBjb21tb24gZnJhbWV3b3JrIGZvciBhcHBsaWNhdGlvbgogICAgIGNvbmZpZ3VyYXRpb24gdXNpbmcgY29uZmlndXJhdGlvbiBmaWxlcyBvciBjb21tYW5kIGxpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNTTC9UTFMgdHJhY2luZyBjb2RlLiBUaGlzIHBhcnNlcyBvdXQgU1NML1RMUyByZWNvcmRzIHVzaW5nIHRoZQogICAgIG1lc3NhZ2UgY2FsbGJhY2sgYW5kIHByaW50cyB0aGUgcmVzdWx0cy4gTmVlZHMgY29tcGlsZSB0aW1lIG9wdGlvbgogICAgICJlbmFibGUtc3NsLXRyYWNlIi4gTmV3IG9wdGlvbnMgdG8gc19jbGllbnQgYW5kIHNfc2VydmVyIHRvIGVuYWJsZQogICAgIHRyYWNpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGN0cmwgYW5kIG1hY3JvIHRvIHJldHJpZXZlIHN1cHBvcnRlZCBwb2ludHMgZXh0ZW5zaW9ucy4KICAgICBQcmludCBvdXQgZXh0ZW5zaW9uIGluIHNfc2VydmVyIGFuZCBzX2NsaWVudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIHRvIHJldHJpZXZlIGNlcnRpZmljYXRlIHNpZ25hdHVyZSBhbmQgc2lnbmF0dXJlCiAgICAgT0lEIE5JRC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZnVuY3Rpb25zIHRvIHJldHJpZXZlIGFuZCBtYW5pcHVsYXRlIHRoZSByYXcgY2lwaGVybGlzdCBzZW50IGJ5IGEKICAgICBjbGllbnQgdG8gT3BlblNTTC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgU3VpdGUgQiBtb2RlcyBmb3IgVExTIGNvZGUuIFRoZXNlIHVzZSBhbmQgZW5mb3JjZSB0aGUgcmVxdWlyZW1lbnRzCiAgICAgb2YgUkZDNjQ2MDogcmVzdHJpY3QgY2lwaGVyc3VpdGVzLCBvbmx5IHBlcm1pdCBTdWl0ZSBCIGFsZ29yaXRobXMgYW5kCiAgICAgb25seSB1c2UgU3VpdGUgQiBjdXJ2ZXMuIFRoZSBTdWl0ZSBCIG1vZGVzIGNhbiBiZSBzZXQgYnkgdXNpbmcgdGhlCiAgICAgc3RyaW5ncyAiU1VJVEVCMTI4IiwgIlNVSVRFQjE5MiIgb3IgIlNVSVRFQjEyOE9OTFkiIGZvciB0aGUgY2lwaGVyc3RyaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBjaGFpbiB2ZXJpZmljYXRpb24gZmxhZ3MgZm9yIFN1aXRlIEIgbGV2ZWxzIG9mIHNlY3VyaXR5LiBDaGVjawogICAgIGFsZ29yaXRobXMgYXJlIGFjY2VwdGFibGUgd2hlbiBmbGFncyBhcmUgc2V0IGluIFg1MDlfdmVyaWZ5X2NlcnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0bHMxX2NoZWNrX2NoYWluIHJldHVybiBhIHNldCBvZiBmbGFncyBpbmRpY2F0aW5nIGNoZWNrcyBwYXNzZWQKICAgICBieSBhIGNlcnRpZmljYXRlIGNoYWluLiBBZGQgYWRkaXRpb25hbCB0ZXN0cyB0byBoYW5kbGUgY2xpZW50CiAgICAgY2VydGlmaWNhdGVzOiBjaGVja3MgZm9yIG1hdGNoaW5nIGNlcnRpZmljYXRlIHR5cGUgYW5kIGlzc3VlciBuYW1lCiAgICAgY29tcGFyaXNvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdXNlIGEgc2lnbmF0dXJlIGFsZ29yaXRobSBub3QgaW4gdGhlIHBlZXIKICAgICBwcmVmZXJlbmNlIGxpc3QgYWJvcnQgdGhlIGhhbmRzaGFrZS4gSWYgY2xpZW50IGhhcyBubyBzdWl0YWJsZQogICAgIHNpZ25hdHVyZSBhbGdvcml0aG1zIGluIHJlc3BvbnNlIHRvIGEgY2VydGlmaWNhdGUgcmVxdWVzdCBkbyBub3QKICAgICB1c2UgdGhlIGNlcnRpZmljYXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIElmIHNlcnZlciBFQyB0bXAga2V5IGlzIG5vdCBpbiBjbGllbnQgcHJlZmVyZW5jZSBsaXN0IGFib3J0IGhhbmRzaGFrZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgY2VydGlmaWNhdGUgc3RvcmVzIGluIENFUlQgc3RydWN0dXJlLiBUaGlzIG1ha2VzIGl0CiAgICAgcG9zc2libGUgdG8gaGF2ZSBkaWZmZXJlbnQgc3RvcmVzIHBlciBTU0wgc3RydWN0dXJlIG9yIG9uZSBzdG9yZSBpbgogICAgIHRoZSBwYXJlbnQgU1NMX0NUWC4gSW5jbHVkZSBkaXN0aW50IHN0b3JlcyBmb3IgY2VydGlmaWNhdGUgY2hhaW4KICAgICB2ZXJpZmljYXRpb24gYW5kIGNoYWluIGJ1aWxkaW5nLiBOZXcgY3RybCBTU0xfQ1RSTF9CVUlMRF9DRVJUX0NIQUlOCiAgICAgdG8gYnVpbGQgYW5kIHN0b3JlIGEgY2VydGlmaWNhdGUgY2hhaW4gaW4gQ0VSVCBzdHJ1Y3R1cmU6IHJldHVyaW5nCiAgICAgYW4gZXJyb3IgaWYgdGhlIGNoYWluIGNhbm5vdCBiZSBidWlsdDogdGhpcyB3aWxsIGFsbG93IGFwcGxpY2F0aW9ucwogICAgIHRvIHRlc3QgaWYgYSBjaGFpbiBpcyBjb3JyZWN0bHkgY29uZmlndXJlZC4KCiAgICAgTm90ZTogaWYgdGhlIENFUlQgYmFzZWQgc3RvcmVzIGFyZSBub3Qgc2V0IHRoZW4gdGhlIHBhcmVudCBTU0xfQ1RYCiAgICAgc3RvcmUgaXMgdXNlZCB0byByZXRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGJlaGF2aW91ci4KCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIHNzbF9zZXRfY2xpZW50X2Rpc2FibGVkIHRvIHNldCBhIGNpcGhlcnN1aXRlIGRpc2FibGVkCiAgICAgbWFzayBiYXNlZCBvbiB0aGUgY3VycmVudCBzZXNzaW9uLCBjaGVjayBtYXNrIHdoZW4gc2VuZGluZyBjbGllbnQKICAgICBoZWxsbyBhbmQgY2hlY2tpbmcgdGhlIHJlcXVlc3RlZCBjaXBoZXJzdWl0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgY3RybHMgdG8gcmV0cmlldmUgYW5kIHNldCBjZXJ0aWZpY2F0ZSB0eXBlcyBpbiBhIGNlcnRpZmljYXRlCiAgICAgcmVxdWVzdCBtZXNzYWdlLiBQcmludCBvdXQgcmVjZWl2ZWQgdmFsdWVzIGluIHNfY2xpZW50LiBJZiBjZXJ0aWZpY2F0ZQogICAgIHR5cGVzIGlzIG5vdCBzZXQgd2l0aCBjdXN0b20gdmFsdWVzIHNldCBzZW5zaWJsZSB2YWx1ZXMgYmFzZWQgb24KICAgICBzdXBwb3J0ZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgZGlzdGluY3QgY2xpZW50IGFuZCBzZXJ2ZXIgc3VwcG9ydGVkIHNpZ25hdHVyZSBhbGdvcml0aG1zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjZXJ0aWZpY2F0ZSBjYWxsYmFjay4gSWYgc2V0IHRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIGEgY2VydGlmaWNhdGUKICAgICBpcyByZXF1aXJlZCBieSBjbGllbnQgb3Igc2VydmVyLiBBbiBhcHBsaWNhdGlvbiBjYW4gZGVjaWRlIHdoaWNoCiAgICAgY2VydGlmaWNhdGUgY2hhaW4gdG8gcHJlc2VudCBiYXNlZCBvbiBhcmJpdHJhcnkgY3JpdGVyaWE6IGZvciBleGFtcGxlCiAgICAgc3VwcG9ydGVkIHNpZ25hdHVyZSBhbGdvcml0aG1zLiBBZGQgdmVyeSBzaW1wbGUgZXhhbXBsZSB0byBzX3NlcnZlci4KICAgICBUaGlzIGZpeGVzIG1hbnkgb2YgdGhlIHByb2JsZW1zIGFuZCByZXN0cmljdGlvbnMgb2YgdGhlIGV4aXN0aW5nIGNsaWVudAogICAgIGNlcnRpZmljYXRlIGNhbGxiYWNrOiBmb3IgZXhhbXBsZSB5b3UgY2FuIG5vdyBjbGVhciBhbiBleGlzdGluZwogICAgIGNlcnRpZmljYXRlIGFuZCBzcGVjaWZ5IHRoZSB3aG9sZSBjaGFpbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3ICJ2YWxpZF9mbGFncyIgZmllbGQgdG8gQ0VSVF9QS0VZIHN0cnVjdHVyZSB3aGljaCBkZXRlcm1pbmVzIHdoYXQKICAgICB0aGUgY2VydGlmaWNhdGUgY2FuIGJlIHVzZWQgZm9yIChpZiBhbnl0aGluZykuIFNldCB2YWxpZF9mbGFncyBmaWVsZCAKICAgICBpbiBuZXcgdGxzMV9jaGVja19jaGFpbiBmdW5jdGlvbi4gU2ltcGxpZnkgc3NsX3NldF9jZXJ0X21hc2tzIHdoaWNoIHVzZWQKICAgICB0byBoYXZlIHNpbWlsYXIgY2hlY2tzIGluIGl0LgoKICAgICBBZGQgbmV3ICJjZXJ0X2ZsYWdzIiBmaWVsZCB0byBDRVJUIHN0cnVjdHVyZSBhbmQgaW5jbHVkZSBhICJzdHJpY3QgbW9kZSIuCiAgICAgVGhpcyBlbmZvcmNlcyBzb21lIFRMUyBjZXJ0aWZpY2F0ZSByZXF1aXJlbWVudHMgKHN1Y2ggYXMgb25seSBwZXJtaXR0aW5nCiAgICAgY2VydGlmaWNhdGUgc2lnbmF0dXJlIGFsZ29yaXRobXMgY29udGFpbmVkIGluIHRoZSBzdXBwb3J0ZWQgYWxnb3JpdGhtcwogICAgIGV4dGVuc2lvbikgd2hpY2ggc29tZSBpbXBsZW1lbnRhdGlvbnMgaWdub3JlOiB0aGlzIG9wdGlvbiBzaG91bGQgYmUgdXNlZAogICAgIHdpdGggY2F1dGlvbiBhcyBpdCBjb3VsZCBjYXVzZSBpbnRlcm9wZXJhYmlsaXR5IGlzc3Vlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgYW5kIHRpZHkgc2lnbmF0dXJlIGFsZ29yaXRobSBleHRlbnNpb24gcHJvY2Vzc2luZy4gV29yayBvdXQKICAgICBzaGFyZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMgYmFzZWQgb24gcHJlZmVyZW5jZXMgYW5kIHBlZXIgYWxnb3JpdGhtcwogICAgIGFuZCBwcmludCB0aGVtIG91dCBpbiBzX2NsaWVudCBhbmQgc19zZXJ2ZXIuIEFib3J0IGhhbmRzaGFrZSBpZiBubwogICAgIHNoYXJlZCBzaWduYXR1cmUgYWxnb3JpdGhtcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGZ1bmN0aW9ucyB0byBhbGxvdyBjdXN0b21pc2VkIHN1cHBvcnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtcwogICAgIGZvciBTU0wgYW5kIFNTTF9DVFggc3RydWN0dXJlcy4gQWRkIG9wdGlvbnMgdG8gc19jbGllbnQgYW5kIHNfc2VydmVyCiAgICAgdG8gc3VwcG9ydCB0aGVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBTU0xfY2VydHNfY2xlYXIoKSB0byBkZWxldGUgYWxsIHJlZmVyZW5jZXMgdG8gY2VydGlmaWNhdGVzCiAgICAgZnJvbSBhbiBTU0wgc3RydWN0dXJlLiBCZWZvcmUgdGhpcyBvbmNlIGEgY2VydGlmaWNhdGUgaGFkIGJlZW4gYWRkZWQKICAgICBpdCBjb3VsZG4ndCBiZSByZW1vdmVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEludGVncmF0ZSBob3N0bmFtZSwgZW1haWwgYWRkcmVzcyBhbmQgSVAgYWRkcmVzcyBjaGVja2luZyB3aXRoIGNlcnRpZmljYXRlCiAgICAgdmVyaWZpY2F0aW9uLiBOZXcgdmVyaWZ5IG9wdGlvbnMgc3VwcG9ydGluZyBjaGVja2luZyBpbiBvcGVuc2wgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyBhbmQgd2lsZGNhcmQgbWF0Y2hpbmcgc3VwcG9ydCB0byBob3N0bmFtZSBhbmQgZW1haWwgY2hlY2tpbmcKICAgICBmdW5jdGlvbnMuIEFkZCBtYW51YWwgcGFnZS4KICAgICBbRmxvcmlhbiBXZWltZXIgKFJlZCBIYXQgUHJvZHVjdCBTZWN1cml0eSBUZWFtKV0KCiAgKikgTmV3IGZ1bmN0aW9ucyB0byBjaGVjayBhIGhvc3RuYW1lIGVtYWlsIG9yIElQIGFkZHJlc3MgYWdhaW5zdCBhCiAgICAgY2VydGlmaWNhdGUuIEFkZCBvcHRpb25zIHg1MDkgdXRpbGl0eSB0byBwcmludCByZXN1bHRzIG9mIGNoZWNrcyBhZ2FpbnN0CiAgICAgYSBjZXJ0aWZpY2F0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggT0NTUCBjaGVja2luZy4KICAgICBbUm9iIFN0cmFkbGluZyA8cm9iLnN0cmFkbGluZ0Bjb21vZG8uY29tPiBhbmQgQmVuIExhdXJpZV0KCiAgKikgSW5pdGlhbCBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IgZXhwbGljaXRseSB0cnVzdGVkIG5vbi1yb290IENBcy4gCiAgICAgT3BlblNTTCBzdGlsbCB0cmllcyB0byBidWlsZCBhIGNvbXBsZXRlIGNoYWluIHRvIGEgcm9vdCBidXQgaWYgYW4KICAgICBpbnRlcm1lZGlhdGUgQ0EgaGFzIGEgdHJ1c3Qgc2V0dGluZyBpbmNsdWRlZCB0aGF0IGlzIHVzZWQuIFRoZSBmaXJzdAogICAgIHNldHRpbmcgaXMgdXNlZDogd2hldGhlciB0byB0cnVzdCAoZS5nLiwgLWFkZHRydXN0IG9wdGlvbiB0byB0aGUgeDUwOQogICAgIHV0aWxpdHkpIG9yIHJlamVjdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgLXRydXN0ZWRfZmlyc3Qgb3B0aW9uIHdoaWNoIGF0dGVtcHRzIHRvIGZpbmQgY2VydGlmaWNhdGVzIGluIHRoZQogICAgIHRydXN0ZWQgc3RvcmUgZXZlbiBpZiBhbiB1bnRydXN0ZWQgY2hhaW4gaXMgYWxzbyBzdXBwbGllZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNSVBTIGFzc2VtYmx5IHBhY2sgdXBkYXRlczogc3VwcG9ydCBmb3IgTUlQUzMycjIgYW5kIFNtYXJ0TUlQUyBBU0UsCiAgICAgcGxhdGZvcm0gc3VwcG9ydCBmb3IgTGludXggYW5kIEFuZHJvaWQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIFN1cHBvcnQgZm9yIGxpbnV4LXgzMiwgSUxQMzIgZW52aXJvbm1lbnQgaW4geDg2XzY0IGZyYW1ld29yay4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgRXhwZXJpbWVudGFsIG11bHRpLWltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIEZJUFMgY2FwYWJsZSBPcGVuU1NMLgogICAgIFdoZW4gaW4gRklQUyBtb2RlIHRoZSBhcHByb3ZlZCBpbXBsZW1lbnRhdGlvbnMgYXJlIHVzZWQgYXMgbm9ybWFsLAogICAgIHdoZW4gbm90IGluIEZJUFMgbW9kZSB0aGUgaW50ZXJuYWwgdW5hcHByb3ZlZCB2ZXJzaW9ucyBhcmUgdXNlZCBpbnN0ZWFkLgogICAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgRklQUyBjYXBhYmxlIE9wZW5TU0wgaXNuJ3QgZm9yY2VkIHRvIHVzZSB0aGUKICAgICAob2Z0ZW4gbG93ZXIgcGVyZm9ybWFuY2UpIEZJUFMgaW1wbGVtZW50YXRpb25zIG91dHNpZGUgRklQUyBtb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRyYW5zcGFyZW50bHkgc3VwcG9ydCBYOS40MiBESCBwYXJhbWV0ZXJzIHdoZW4gY2FsbGluZwogICAgIFBFTV9yZWFkX2Jpb19ESHBhcmFtZXRlcnMuIFRoaXMgbWVhbnMgZXhpc3RpbmcgYXBwbGljYXRpb25zIGNhbiBoYW5kbGUKICAgICB0aGUgbmV3IHBhcmFtZXRlciBmb3JtYXQgYXV0b21hdGljYWxseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBYOS40MiBESCBwYXJhbWV0ZXIgZm9ybWF0OiBtYWlubHkKICAgICB0byBzdXBwb3J0IHVzZSBvZiAncScgcGFyYW1ldGVyIGZvciBSRkM1MTE0IHBhcmFtZXRlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIERIIHBhcmFtZXRlcnMgZnJvbSBSRkM1MTE0IGluY2x1ZGluZyB0ZXN0IGRhdGEgdG8gZGh0ZXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIGF1dG9tYXRpYyBFQyB0ZW1wb3Jhcnkga2V5IHBhcmFtZXRlciBzZWxlY3Rpb24uIElmIGVuYWJsZWQKICAgICB0aGUgbW9zdCBwcmVmZXJyZWQgRUMgcGFyYW1ldGVycyBhcmUgYXV0b21hdGljYWxseSB1c2VkIGluc3RlYWQgb2YKICAgICBoYXJkY29kZWQgZml4ZWQgcGFyYW1ldGVycy4gTm93IGEgc2VydmVyIGp1c3QgaGFzIHRvIGNhbGw6CiAgICAgU1NMX0NUWF9zZXRfZWNkaF9hdXRvKGN0eCwgMSkgYW5kIHRoZSBzZXJ2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgc3VwcG9ydCBFQ0RIIGFuZCB1c2UgdGhlIG1vc3QgYXBwcm9wcmlhdGUgcGFyYW1ldGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIGFuZCB0aWR5IEVDIGN1cnZlIGFuZCBwb2ludCBmb3JtYXQgVExTIGV4dGVuc2lvbiBjb2RlLiBVc2UKICAgICBzdGF0aWMgc3RydWN0dXJlcyBpbnN0ZWFkIG9mIGFsbG9jYXRpb24gaWYgZGVmYXVsdCB2YWx1ZXMgYXJlIHVzZWQuCiAgICAgTmV3IGN0cmxzIHRvIHNldCBjdXJ2ZXMgd2Ugd2lzaCB0byBzdXBwb3J0IGFuZCB0byByZXRyaWV2ZSBzaGFyZWQgY3VydmVzLgogICAgIFByaW50IG91dCBzaGFyZWQgY3VydmVzIGluIHNfc2VydmVyLiBOZXcgb3B0aW9ucyB0byBzX3NlcnZlciBhbmQgc19jbGllbnQKICAgICB0byBzZXQgbGlzdCBvZiBzdXBwb3J0ZWQgY3VydmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBjdHJscyB0byByZXRyaWV2ZSBzdXBwb3J0ZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMgYW5kIAogICAgIHN1cHBvcnRlZCBjdXJ2ZSB2YWx1ZXMgYXMgYW4gYXJyYXkgb2YgTklEcy4gRXh0ZW5kIG9wZW5zc2wgdXRpbGl0eQogICAgIHRvIHByaW50IG91dCByZWNlaXZlZCB2YWx1ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBBUElzIEVDX2N1cnZlX25pc3QybmlkIGFuZCBFQ19jdXJ2ZV9uaWQybmlzdCB3aGljaCBjb252ZXJ0CiAgICAgYmV0d2VlbiBOSURzIGFuZCB0aGUgbW9yZSBjb21tb24gTklTVCBuYW1lcyBzdWNoIGFzICJQLTI1NiIuIEVuaGFuY2UKICAgICBlY3BhcmFtIHV0aWxpdHkgYW5kIEVDQyBtZXRob2QgdG8gcmVjb2duaXNlIHRoZSBOSVNUIG5hbWVzIGZvciBjdXJ2ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSBTU0wvVExTIGNlcnRpZmljYXRlIGNoYWluIGhhbmRsaW5nIHRvIHN1cHBvcnQgZGlmZmVyZW50CiAgICAgY2hhaW5zIGZvciBlYWNoIGNlcnRpZmljYXRlIGluc3RlYWQgb2Ygb25lIGNoYWluIGluIHRoZSBwYXJlbnQgU1NMX0NUWC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBmaXhlZCBESCBjaXBoZXJzdWl0ZSBjbGllbnQgYXV0aGVudGljYXRpb246IHdoZXJlIGJvdGgKICAgICBzZXJ2ZXIgYW5kIGNsaWVudCB1c2UgREggY2VydGlmaWNhdGVzIHdpdGggY29tbW9uIHBhcmFtZXRlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgZml4ZWQgREggY2lwaGVyc3VpdGVzOiB0aG9zZSByZXF1aXJpbmcgREggc2VydmVyCiAgICAgY2VydGlmaWNhdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBpMmRfcmVfWDUwOV90YnMgZm9yIHJlLWVuY29kaW5nIHRoZSBUQlMgcG9ydGlvbiBvZgogICAgIHRoZSBjZXJ0aWZpY2F0ZS4KICAgICBOb3RlOiBSZWxhdGVkIDEuMC4yLWJldGEgc3BlY2lmaWMgbWFjcm9zIFg1MDlfZ2V0X2NlcnRfaW5mbywKICAgICBYNTA5X0NJTkZfc2V0X21vZGlmaWVkLCBYNTA5X0NJTkZfZ2V0X2lzc3VlciwgWDUwOV9DSU5GX2dldF9leHRlbnNpb25zIGFuZAogICAgIFg1MDlfQ0lORl9nZXRfc2lnbmF0dXJlIHdlcmUgcmV2ZXJ0ZWQgcG9zdCBpbnRlcm5hbCB0ZWFtIHJldmlldy4KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFrIGFuZCAxLjAuMWwgWzE1IEphbiAyMDE1XQoKICAqKSBCdWlsZCBmaXhlcyBmb3IgdGhlIFdpbmRvd3MgYW5kIE9wZW5WTVMgcGxhdGZvcm1zCiAgICAgW01hdHQgQ2Fzd2VsbCBhbmQgUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWogYW5kIDEuMC4xayBbOCBKYW4gMjAxNV0KCiAgKikgRml4IERUTFMgc2VnbWVudGF0aW9uIGZhdWx0IGluIGR0bHMxX2dldF9yZWNvcmQuIEEgY2FyZWZ1bGx5IGNyYWZ0ZWQgRFRMUwogICAgIG1lc3NhZ2UgY2FuIGNhdXNlIGEgc2VnbWVudGF0aW9uIGZhdWx0IGluIE9wZW5TU0wgZHVlIHRvIGEgTlVMTCBwb2ludGVyCiAgICAgZGVyZWZlcmVuY2UuIFRoaXMgY291bGQgbGVhZCB0byBhIERlbmlhbCBPZiBTZXJ2aWNlIGF0dGFjay4gVGhhbmtzIHRvCiAgICAgTWFya3VzIFN0ZW5iZXJnIG9mIENpc2NvIFN5c3RlbXMsIEluYy4gZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTcxKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBEVExTIG1lbW9yeSBsZWFrIGluIGR0bHMxX2J1ZmZlcl9yZWNvcmQuIEEgbWVtb3J5IGxlYWsgY2FuIG9jY3VyIGluIHRoZQogICAgIGR0bHMxX2J1ZmZlcl9yZWNvcmQgZnVuY3Rpb24gdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLiBJbiBwYXJ0aWN1bGFyIHRoaXMKICAgICBjb3VsZCBvY2N1ciBpZiBhbiBhdHRhY2tlciBzZW50IHJlcGVhdGVkIERUTFMgcmVjb3JkcyB3aXRoIHRoZSBzYW1lCiAgICAgc2VxdWVuY2UgbnVtYmVyIGJ1dCBmb3IgdGhlIG5leHQgZXBvY2guIFRoZSBtZW1vcnkgbGVhayBjb3VsZCBiZSBleHBsb2l0ZWQKICAgICBieSBhbiBhdHRhY2tlciBpbiBhIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjayB0aHJvdWdoIG1lbW9yeSBleGhhdXN0aW9uLgogICAgIFRoYW5rcyB0byBDaHJpcyBNdWVsbGVyIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTUtMDIwNikKICAgICBbTWF0dCBDYXN3ZWxsXQoKICAqKSBGaXggaXNzdWUgd2hlcmUgbm8tc3NsMyBjb25maWd1cmF0aW9uIHNldHMgbWV0aG9kIHRvIE5VTEwuIFdoZW4gb3BlbnNzbCBpcwogICAgIGJ1aWx0IHdpdGggdGhlIG5vLXNzbDMgb3B0aW9uIGFuZCBhIFNTTCB2MyBDbGllbnRIZWxsbyBpcyByZWNlaXZlZCB0aGUgc3NsCiAgICAgbWV0aG9kIHdvdWxkIGJlIHNldCB0byBOVUxMIHdoaWNoIGNvdWxkIGxhdGVyIHJlc3VsdCBpbiBhIE5VTEwgcG9pbnRlcgogICAgIGRlcmVmZXJlbmNlLiBUaGFua3MgdG8gRnJhbmsgU2NobWlybGVyIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzU2OSkKICAgICBbS3VydCBSb2Vja3hdCgogICopIEFib3J0IGhhbmRzaGFrZSBpZiBzZXJ2ZXIga2V5IGV4Y2hhbmdlIG1lc3NhZ2UgaXMgb21pdHRlZCBmb3IgZXBoZW1lcmFsCiAgICAgRUNESCBjaXBoZXJzdWl0ZXMuCgogICAgIFRoYW5rcyB0byBLYXJ0aGlrZXlhbiBCaGFyZ2F2YW4gb2YgdGhlIFBST1NFQ0NPIHRlYW0gYXQgSU5SSUEgZm9yCiAgICAgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1NzIpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIG5vbi1leHBvcnQgZXBoZW1lcmFsIFJTQSBjb2RlIG9uIGNsaWVudCBhbmQgc2VydmVyLiBUaGlzIGNvZGUKICAgICB2aW9sYXRlZCB0aGUgVExTIHN0YW5kYXJkIGJ5IGFsbG93aW5nIHRoZSB1c2Ugb2YgdGVtcG9yYXJ5IFJTQSBrZXlzIGluCiAgICAgbm9uLWV4cG9ydCBjaXBoZXJzdWl0ZXMgYW5kIGNvdWxkIGJlIHVzZWQgYnkgYSBzZXJ2ZXIgdG8gZWZmZWN0aXZlbHkKICAgICBkb3duZ3JhZGUgdGhlIFJTQSBrZXkgbGVuZ3RoIHVzZWQgdG8gYSB2YWx1ZSBzbWFsbGVyIHRoYW4gdGhlIHNlcnZlcgogICAgIGNlcnRpZmljYXRlLiBUaGFua3MgZm9yIEthcnRoaWtleWFuIEJoYXJnYXZhbiBvZiB0aGUgUFJPU0VDQ08gdGVhbSBhdAogICAgIElOUklBIG9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNS0wMjA0KQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVkIGlzc3VlIHdoZXJlIERIIGNsaWVudCBjZXJ0aWZpY2F0ZXMgYXJlIGFjY2VwdGVkIHdpdGhvdXQgdmVyaWZpY2F0aW9uLgogICAgIEFuIE9wZW5TU0wgc2VydmVyIHdpbGwgYWNjZXB0IGEgREggY2VydGlmaWNhdGUgZm9yIGNsaWVudCBhdXRoZW50aWNhdGlvbgogICAgIHdpdGhvdXQgdGhlIGNlcnRpZmljYXRlIHZlcmlmeSBtZXNzYWdlLiBUaGlzIGVmZmVjdGl2ZWx5IGFsbG93cyBhIGNsaWVudCB0bwogICAgIGF1dGhlbnRpY2F0ZSB3aXRob3V0IHRoZSB1c2Ugb2YgYSBwcml2YXRlIGtleS4gVGhpcyBvbmx5IGFmZmVjdHMgc2VydmVycwogICAgIHdoaWNoIHRydXN0IGEgY2xpZW50IGNlcnRpZmljYXRlIGF1dGhvcml0eSB3aGljaCBpc3N1ZXMgY2VydGlmaWNhdGVzCiAgICAgY29udGFpbmluZyBESCBrZXlzOiB0aGVzZSBhcmUgZXh0cmVtZWx5IHJhcmUgYW5kIGhhcmRseSBldmVyIGVuY291bnRlcmVkLgogICAgIFRoYW5rcyBmb3IgS2FydGhpa2V5YW4gQmhhcmdhdmFuIG9mIHRoZSBQUk9TRUNDTyB0ZWFtIGF0IElOUklBIG9yIHJlcG9ydGluZwogICAgIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE1LTAyMDUpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5zdXJlIHRoYXQgdGhlIHNlc3Npb24gSUQgY29udGV4dCBvZiBhbiBTU0wgaXMgdXBkYXRlZCB3aGVuIGl0cwogICAgIFNTTF9DVFggaXMgdXBkYXRlZCB2aWEgU1NMX3NldF9TU0xfQ1RYLgoKICAgICBUaGUgc2Vzc2lvbiBJRCBjb250ZXh0IGlzIHR5cGljYWxseSBzZXQgZnJvbSB0aGUgcGFyZW50IFNTTF9DVFgsCiAgICAgYW5kIGNhbiB2YXJ5IHdpdGggdGhlIENUWC4KICAgICBbQWRhbSBMYW5nbGV5XQoKICAqKSBGaXggdmFyaW91cyBjZXJ0aWZpY2F0ZSBmaW5nZXJwcmludCBpc3N1ZXMuCgogICAgIEJ5IHVzaW5nIG5vbi1ERVIgb3IgaW52YWxpZCBlbmNvZGluZ3Mgb3V0c2lkZSB0aGUgc2lnbmVkIHBvcnRpb24gb2YgYQogICAgIGNlcnRpZmljYXRlIHRoZSBmaW5nZXJwcmludCBjYW4gYmUgY2hhbmdlZCB3aXRob3V0IGJyZWFraW5nIHRoZSBzaWduYXR1cmUuCiAgICAgQWx0aG91Z2ggbm8gZGV0YWlscyBvZiB0aGUgc2lnbmVkIHBvcnRpb24gb2YgdGhlIGNlcnRpZmljYXRlIGNhbiBiZSBjaGFuZ2VkCiAgICAgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgd2l0aCBzb21lIGFwcGxpY2F0aW9uczogZS5nLiB0aG9zZSB1c2luZyB0aGUKICAgICBjZXJ0aWZpY2F0ZSBmaW5nZXJwcmludCBmb3IgYmxhY2tsaXN0cy4KCiAgICAgMS4gUmVqZWN0IHNpZ25hdHVyZXMgd2l0aCBub24gemVybyB1bnVzZWQgYml0cy4KCiAgICAgSWYgdGhlIEJJVCBTVFJJTkcgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlIGhhcyBub24gemVybyB1bnVzZWQgYml0cyByZWplY3QKICAgICB0aGUgc2lnbmF0dXJlLiBBbGwgY3VycmVudCBzaWduYXR1cmUgYWxnb3JpdGhtcyByZXF1aXJlIHplcm8gdW51c2VkIGJpdHMuCgogICAgIDIuIENoZWNrIGNlcnRpZmljYXRlIGFsZ29yaXRobSBjb25zaXN0ZW5jeS4KCiAgICAgQ2hlY2sgdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgaW5zaWRlIFRCUyBtYXRjaGVzIHRoZSBvbmUgaW4gdGhlCiAgICAgY2VydGlmaWNhdGUgc2lnbmF0dXJlLiBOQjogdGhpcyB3aWxsIHJlc3VsdCBpbiBzaWduYXR1cmUgZmFpbHVyZQogICAgIGVycm9ycyBmb3Igc29tZSBicm9rZW4gY2VydGlmaWNhdGVzLgoKICAgICBUaGFua3MgdG8gS29ucmFkIEtyYXN6ZXdza2kgZnJvbSBHb29nbGUgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLgoKICAgICAzLiBDaGVjayBEU0EvRUNEU0Egc2lnbmF0dXJlcyB1c2UgREVSLgoKICAgICBSZWVuY29kZSBEU0EvRUNEU0Egc2lnbmF0dXJlcyBhbmQgY29tcGFyZSB3aXRoIHRoZSBvcmlnaW5hbCByZWNlaXZlZAogICAgIHNpZ25hdHVyZS4gUmV0dXJuIGFuIGVycm9yIGlmIHRoZXJlIGlzIGEgbWlzbWF0Y2guCgogICAgIFRoaXMgd2lsbCByZWplY3QgdmFyaW91cyBjYXNlcyBpbmNsdWRpbmcgZ2FyYmFnZSBhZnRlciBzaWduYXR1cmUKICAgICAodGhhbmtzIHRvIEFudHRpIEthcmphbGFpbmVuIGFuZCBUdW9tbyBVbnRpbmVuIGZyb20gdGhlIENvZGVub21pY29uIENST1NTCiAgICAgcHJvZ3JhbSBmb3IgZGlzY292ZXJpbmcgdGhpcyBjYXNlKSBhbmQgdXNlIG9mIEJFUiBvciBpbnZhbGlkIEFTTi4xIElOVEVHRVJzCiAgICAgKG5lZ2F0aXZlIG9yIHdpdGggbGVhZGluZyB6ZXJvZXMpLgoKICAgICBGdXJ0aGVyIGFuYWx5c2lzIHdhcyBjb25kdWN0ZWQgYW5kIGZpeGVzIHdlcmUgZGV2ZWxvcGVkIGJ5IFN0ZXBoZW4gSGVuc29uCiAgICAgb2YgdGhlIE9wZW5TU0wgY29yZSB0ZWFtLgoKICAgICAoQ1ZFLTIwMTQtODI3NSkKICAgICBbU3RldmUgSGVuc29uXQoKICAgKikgQ29ycmVjdCBCaWdudW0gc3F1YXJpbmcuIEJpZ251bSBzcXVhcmluZyAoQk5fc3FyKSBtYXkgcHJvZHVjZSBpbmNvcnJlY3QKICAgICAgcmVzdWx0cyBvbiBzb21lIHBsYXRmb3JtcywgaW5jbHVkaW5nIHg4Nl82NC4gVGhpcyBidWcgb2NjdXJzIGF0IHJhbmRvbQogICAgICB3aXRoIGEgdmVyeSBsb3cgcHJvYmFiaWxpdHksIGFuZCBpcyBub3Qga25vd24gdG8gYmUgZXhwbG9pdGFibGUgaW4gYW55CiAgICAgIHdheSwgdGhvdWdoIGl0cyBleGFjdCBpbXBhY3QgaXMgZGlmZmljdWx0IHRvIGRldGVybWluZS4gVGhhbmtzIHRvIFBpZXRlcgogICAgICBXdWlsbGUgKEJsb2Nrc3RyZWFtKSB3aG8gcmVwb3J0ZWQgdGhpcyBpc3N1ZSBhbmQgYWxzbyBzdWdnZXN0ZWQgYW4gaW5pdGlhbAogICAgICBmaXguIEZ1cnRoZXIgYW5hbHlzaXMgd2FzIGNvbmR1Y3RlZCBieSB0aGUgT3BlblNTTCBkZXZlbG9wbWVudCB0ZWFtIGFuZAogICAgICBBZGFtIExhbmdsZXkgb2YgR29vZ2xlLiBUaGUgZmluYWwgZml4IHdhcyBkZXZlbG9wZWQgYnkgQW5keSBQb2x5YWtvdiBvZgogICAgICB0aGUgT3BlblNTTCBjb3JlIHRlYW0uCiAgICAgIChDVkUtMjAxNC0zNTcwKQogICAgICBbQW5keSBQb2x5YWtvdl0KCiAgICopIERvIG5vdCByZXN1bWUgc2Vzc2lvbnMgb24gdGhlIHNlcnZlciBpZiB0aGUgbmVnb3RpYXRlZCBwcm90b2NvbAogICAgICB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoIHRoZSBzZXNzaW9uJ3MgdmVyc2lvbi4gUmVzdW1pbmcgd2l0aCBhIGRpZmZlcmVudAogICAgICB2ZXJzaW9uLCB3aGlsZSBub3Qgc3RyaWN0bHkgZm9yYmlkZGVuIGJ5IHRoZSBSRkMsIGlzIG9mIHF1ZXN0aW9uYWJsZQogICAgICBzYW5pdHkgYW5kIGJyZWFrcyBhbGwga25vd24gY2xpZW50cy4KICAgICAgW0RhdmlkIEJlbmphbWluLCBFbWlsaWEgS+RzcGVyXQoKICAgKikgVGlnaHRlbiBoYW5kbGluZyBvZiB0aGUgQ2hhbmdlQ2lwaGVyU3BlYyAoQ0NTKSBtZXNzYWdlOiByZWplY3QKICAgICAgZWFybHkgQ0NTIG1lc3NhZ2VzIGR1cmluZyByZW5lZ290aWF0aW9uLiAoTm90ZSB0aGF0IGJlY2F1c2UKICAgICAgcmVuZWdvdGlhdGlvbiBpcyBlbmNyeXB0ZWQsIHRoaXMgZWFybHkgQ0NTIHdhcyBub3QgZXhwbG9pdGFibGUuKQogICAgICBbRW1pbGlhIEvkc3Blcl0KCiAgICopIFRpZ2h0ZW4gY2xpZW50LXNpZGUgc2Vzc2lvbiB0aWNrZXQgaGFuZGxpbmcgZHVyaW5nIHJlbmVnb3RpYXRpb246CiAgICAgIGVuc3VyZSB0aGF0IHRoZSBjbGllbnQgb25seSBhY2NlcHRzIGEgc2Vzc2lvbiB0aWNrZXQgaWYgdGhlIHNlcnZlciBzZW5kcwogICAgICB0aGUgZXh0ZW5zaW9uIGFuZXcgaW4gdGhlIFNlcnZlckhlbGxvLiBQcmV2aW91c2x5LCBhIFRMUyBjbGllbnQgd291bGQKICAgICAgcmV1c2UgdGhlIG9sZCBleHRlbnNpb24gc3RhdGUgYW5kIHRodXMgYWNjZXB0IGEgc2Vzc2lvbiB0aWNrZXQgaWYgb25lIHdhcwogICAgICBhbm5vdW5jZWQgaW4gdGhlIGluaXRpYWwgU2VydmVySGVsbG8uCgogICAgICBTaW1pbGFybHksIGVuc3VyZSB0aGF0IHRoZSBjbGllbnQgcmVxdWlyZXMgYSBzZXNzaW9uIHRpY2tldCBpZiBvbmUKICAgICAgd2FzIGFkdmVydGlzZWQgaW4gdGhlIFNlcnZlckhlbGxvLiBQcmV2aW91c2x5LCBhIFRMUyBjbGllbnQgd291bGQKICAgICAgaWdub3JlIGEgbWlzc2luZyBOZXdTZXNzaW9uVGlja2V0IG1lc3NhZ2UuCiAgICAgIFtFbWlsaWEgS+RzcGVyXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWkgYW5kIDEuMC4xaiBbMTUgT2N0IDIwMTRdCgogICopIFNSVFAgTWVtb3J5IExlYWsuCgogICAgIEEgZmxhdyBpbiB0aGUgRFRMUyBTUlRQIGV4dGVuc2lvbiBwYXJzaW5nIGNvZGUgYWxsb3dzIGFuIGF0dGFja2VyLCB3aG8KICAgICBzZW5kcyBhIGNhcmVmdWxseSBjcmFmdGVkIGhhbmRzaGFrZSBtZXNzYWdlLCB0byBjYXVzZSBPcGVuU1NMIHRvIGZhaWwKICAgICB0byBmcmVlIHVwIHRvIDY0ayBvZiBtZW1vcnkgY2F1c2luZyBhIG1lbW9yeSBsZWFrLiBUaGlzIGNvdWxkIGJlCiAgICAgZXhwbG9pdGVkIGluIGEgRGVuaWFsIE9mIFNlcnZpY2UgYXR0YWNrLiBUaGlzIGlzc3VlIGFmZmVjdHMgT3BlblNTTAogICAgIDEuMC4xIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMgZm9yIGJvdGggU1NML1RMUyBhbmQgRFRMUyByZWdhcmRsZXNzIG9mCiAgICAgd2hldGhlciBTUlRQIGlzIHVzZWQgb3IgY29uZmlndXJlZC4gSW1wbGVtZW50YXRpb25zIG9mIE9wZW5TU0wgdGhhdAogICAgIGhhdmUgYmVlbiBjb21waWxlZCB3aXRoIE9QRU5TU0xfTk9fU1JUUCBkZWZpbmVkIGFyZSBub3QgYWZmZWN0ZWQuCgogICAgIFRoZSBmaXggd2FzIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCB0ZWFtLgogICAgIChDVkUtMjAxNC0zNTEzKQogICAgIFtPcGVuU1NMIHRlYW1dCgogICopIFNlc3Npb24gVGlja2V0IE1lbW9yeSBMZWFrLgoKICAgICBXaGVuIGFuIE9wZW5TU0wgU1NML1RMUy9EVExTIHNlcnZlciByZWNlaXZlcyBhIHNlc3Npb24gdGlja2V0IHRoZQogICAgIGludGVncml0eSBvZiB0aGF0IHRpY2tldCBpcyBmaXJzdCB2ZXJpZmllZC4gSW4gdGhlIGV2ZW50IG9mIGEgc2Vzc2lvbgogICAgIHRpY2tldCBpbnRlZ3JpdHkgY2hlY2sgZmFpbGluZywgT3BlblNTTCB3aWxsIGZhaWwgdG8gZnJlZSBtZW1vcnkKICAgICBjYXVzaW5nIGEgbWVtb3J5IGxlYWsuIEJ5IHNlbmRpbmcgYSBsYXJnZSBudW1iZXIgb2YgaW52YWxpZCBzZXNzaW9uCiAgICAgdGlja2V0cyBhbiBhdHRhY2tlciBjb3VsZCBleHBsb2l0IHRoaXMgaXNzdWUgaW4gYSBEZW5pYWwgT2YgU2VydmljZQogICAgIGF0dGFjay4KICAgICAoQ1ZFLTIwMTQtMzU2NykKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCdWlsZCBvcHRpb24gbm8tc3NsMyBpcyBpbmNvbXBsZXRlLgoKICAgICBXaGVuIE9wZW5TU0wgaXMgY29uZmlndXJlZCB3aXRoICJuby1zc2wzIiBhcyBhIGJ1aWxkIG9wdGlvbiwgc2VydmVycwogICAgIGNvdWxkIGFjY2VwdCBhbmQgY29tcGxldGUgYSBTU0wgMy4wIGhhbmRzaGFrZSwgYW5kIGNsaWVudHMgY291bGQgYmUKICAgICBjb25maWd1cmVkIHRvIHNlbmQgdGhlbS4KICAgICAoQ1ZFLTIwMTQtMzU2OCkKICAgICBbQWthbWFpIGFuZCB0aGUgT3BlblNTTCB0ZWFtXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgVExTX0ZBTExCQUNLX1NDU1YuCiAgICAgQ2xpZW50IGFwcGxpY2F0aW9ucyBkb2luZyBmYWxsYmFjayByZXRyaWVzIHNob3VsZCBjYWxsCiAgICAgU1NMX3NldF9tb2RlKHMsIFNTTF9NT0RFX1NFTkRfRkFMTEJBQ0tfU0NTVikuCiAgICAgKENWRS0yMDE0LTM1NjYpCiAgICAgW0FkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYWRkaXRpb25hbCBEaWdlc3RJbmZvIGNoZWNrcy4KIAogICAgIFJlZW5jb2RlIERpZ2VzdEludG8gaW4gREVSIGFuZCBjaGVjayBhZ2FpbnN0IHRoZSBvcmlnaW5hbCB3aGVuCiAgICAgdmVyaWZ5aW5nIFJTQSBzaWduYXR1cmU6IHRoaXMgd2lsbCByZWplY3QgYW55IGltcHJvcGVybHkgZW5jb2RlZAogICAgIERpZ2VzdEluZm8gc3RydWN0dXJlcy4KCiAgICAgTm90ZTogdGhpcyBpcyBhIHByZWNhdXRpb25hcnkgbWVhc3VyZSBhbmQgbm8gYXR0YWNrcyBhcmUgY3VycmVudGx5IGtub3duLgoKICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWggYW5kIDEuMC4xaSBbNiBBdWcgMjAxNF0KCiAgKikgRml4IFNSUCBidWZmZXIgb3ZlcnJ1biB2dWxuZXJhYmlsaXR5LiBJbnZhbGlkIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZQogICAgIFNSUCBjb2RlIGNhbiBiZSBvdmVycnVuIGFuIGludGVybmFsIGJ1ZmZlci4gQWRkIHNhbml0eSBjaGVjayB0aGF0CiAgICAgZywgQSwgQiA8IE4gdG8gU1JQIGNvZGUuCgogICAgIFRoYW5rcyB0byBTZWFuIERldmxpbiBhbmQgV2F0c29uIExhZGQgb2YgQ3J5cHRvZ3JhcGh5IFNlcnZpY2VzLCBOQ0MKICAgICBHcm91cCBmb3IgZGlzY292ZXJpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzUxMikKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBIGZsYXcgaW4gdGhlIE9wZW5TU0wgU1NML1RMUyBzZXJ2ZXIgY29kZSBjYXVzZXMgdGhlIHNlcnZlciB0byBuZWdvdGlhdGUKICAgICBUTFMgMS4wIGluc3RlYWQgb2YgaGlnaGVyIHByb3RvY29sIHZlcnNpb25zIHdoZW4gdGhlIENsaWVudEhlbGxvIG1lc3NhZ2UKICAgICBpcyBiYWRseSBmcmFnbWVudGVkLiBUaGlzIGFsbG93cyBhIG1hbi1pbi10aGUtbWlkZGxlIGF0dGFja2VyIHRvIGZvcmNlIGEKICAgICBkb3duZ3JhZGUgdG8gVExTIDEuMCBldmVuIGlmIGJvdGggdGhlIHNlcnZlciBhbmQgdGhlIGNsaWVudCBzdXBwb3J0IGEKICAgICBoaWdoZXIgcHJvdG9jb2wgdmVyc2lvbiwgYnkgbW9kaWZ5aW5nIHRoZSBjbGllbnQncyBUTFMgcmVjb3Jkcy4KCiAgICAgVGhhbmtzIHRvIERhdmlkIEJlbmphbWluIGFuZCBBZGFtIExhbmdsZXkgKEdvb2dsZSkgZm9yIGRpc2NvdmVyaW5nIGFuZAogICAgIHJlc2VhcmNoaW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MTEpCiAgICAgW0RhdmlkIEJlbmphbWluXQoKICAqKSBPcGVuU1NMIERUTFMgY2xpZW50cyBlbmFibGluZyBhbm9ueW1vdXMgKEVDKURIIGNpcGhlcnN1aXRlcyBhcmUgc3ViamVjdAogICAgIHRvIGEgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrLiBBIG1hbGljaW91cyBzZXJ2ZXIgY2FuIGNyYXNoIHRoZSBjbGllbnQKICAgICB3aXRoIGEgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlIChyZWFkKSBieSBzcGVjaWZ5aW5nIGFuIGFub255bW91cyAoRUMpREgKICAgICBjaXBoZXJzdWl0ZSBhbmQgc2VuZGluZyBjYXJlZnVsbHkgY3JhZnRlZCBoYW5kc2hha2UgbWVzc2FnZXMuCgogICAgIFRoYW5rcyB0byBGZWxpeCBHcvZiZXJ0IChHb29nbGUpIGZvciBkaXNjb3ZlcmluZyBhbmQgcmVzZWFyY2hpbmcgdGhpcwogICAgIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTEwKQogICAgIFtFbWlsaWEgS+RzcGVyXQoKICAqKSBCeSBzZW5kaW5nIGNhcmVmdWxseSBjcmFmdGVkIERUTFMgcGFja2V0cyBhbiBhdHRhY2tlciBjb3VsZCBjYXVzZSBvcGVuc3NsCiAgICAgdG8gbGVhayBtZW1vcnkuIFRoaXMgY2FuIGJlIGV4cGxvaXRlZCB0aHJvdWdoIGEgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrLgogICAgIFRoYW5rcyB0byBBZGFtIExhbmdsZXkgZm9yIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTA3KQogICAgIFtBZGFtIExhbmdsZXldCgogICopIEFuIGF0dGFja2VyIGNhbiBmb3JjZSBvcGVuc3NsIHRvIGNvbnN1bWUgbGFyZ2UgYW1vdW50cyBvZiBtZW1vcnkgd2hpbHN0CiAgICAgcHJvY2Vzc2luZyBEVExTIGhhbmRzaGFrZSBtZXNzYWdlcy4gVGhpcyBjYW4gYmUgZXhwbG9pdGVkIHRocm91Z2ggYQogICAgIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjay4KICAgICBUaGFua3MgdG8gQWRhbSBMYW5nbGV5IGZvciBkaXNjb3ZlcmluZyBhbmQgcmVzZWFyY2hpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzUwNikKICAgICBbQWRhbSBMYW5nbGV5XQoKICAqKSBBbiBhdHRhY2tlciBjYW4gZm9yY2UgYW4gZXJyb3IgY29uZGl0aW9uIHdoaWNoIGNhdXNlcyBvcGVuc3NsIHRvIGNyYXNoCiAgICAgd2hpbHN0IHByb2Nlc3NpbmcgRFRMUyBwYWNrZXRzIGR1ZSB0byBtZW1vcnkgYmVpbmcgZnJlZWQgdHdpY2UuIFRoaXMKICAgICBjYW4gYmUgZXhwbG9pdGVkIHRocm91Z2ggYSBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2suCiAgICAgVGhhbmtzIHRvIEFkYW0gTGFuZ2xleSBhbmQgV2FuLVRlaCBDaGFuZyBmb3IgZGlzY292ZXJpbmcgYW5kIHJlc2VhcmNoaW5nCiAgICAgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzUwNSkKICAgICBbQWRhbSBMYW5nbGV5XQoKICAqKSBJZiBhIG11bHRpdGhyZWFkZWQgY2xpZW50IGNvbm5lY3RzIHRvIGEgbWFsaWNpb3VzIHNlcnZlciB1c2luZyBhIHJlc3VtZWQKICAgICBzZXNzaW9uIGFuZCB0aGUgc2VydmVyIHNlbmRzIGFuIGVjIHBvaW50IGZvcm1hdCBleHRlbnNpb24gaXQgY291bGQgd3JpdGUKICAgICB1cCB0byAyNTUgYnl0ZXMgdG8gZnJlZWQgbWVtb3J5LgoKICAgICBUaGFua3MgdG8gR2Fib3IgVHl1a2FzeiAoTG9nTWVJbiBJbmMpIGZvciBkaXNjb3ZlcmluZyBhbmQgcmVzZWFyY2hpbmcgdGhpcwogICAgIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTA5KQogICAgIFtHYWJvciBUeXVrYXN6XQoKICAqKSBBIG1hbGljaW91cyBzZXJ2ZXIgY2FuIGNyYXNoIGFuIE9wZW5TU0wgY2xpZW50IHdpdGggYSBudWxsIHBvaW50ZXIKICAgICBkZXJlZmVyZW5jZSAocmVhZCkgYnkgc3BlY2lmeWluZyBhbiBTUlAgY2lwaGVyc3VpdGUgZXZlbiB0aG91Z2ggaXQgd2FzIG5vdAogICAgIHByb3Blcmx5IG5lZ290aWF0ZWQgd2l0aCB0aGUgY2xpZW50LiBUaGlzIGNhbiBiZSBleHBsb2l0ZWQgdGhyb3VnaCBhCiAgICAgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrLgoKICAgICBUaGFua3MgdG8gSm9vbmFzIEt1b3JpbGVodG8gYW5kIFJpa3UgSGlldGFt5GtpIChDb2Rlbm9taWNvbikgZm9yCiAgICAgZGlzY292ZXJpbmcgYW5kIHJlc2VhcmNoaW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTUxMzkpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQSBmbGF3IGluIE9CSl9vYmoydHh0IG1heSBjYXVzZSBwcmV0dHkgcHJpbnRpbmcgZnVuY3Rpb25zIHN1Y2ggYXMKICAgICBYNTA5X25hbWVfb25lbGluZSwgWDUwOV9uYW1lX3ByaW50X2V4IGV0IGFsLiB0byBsZWFrIHNvbWUgaW5mb3JtYXRpb24KICAgICBmcm9tIHRoZSBzdGFjay4gQXBwbGljYXRpb25zIG1heSBiZSBhZmZlY3RlZCBpZiB0aGV5IGVjaG8gcHJldHR5IHByaW50aW5nCiAgICAgb3V0cHV0IHRvIHRoZSBhdHRhY2tlci4KCiAgICAgVGhhbmtzIHRvIEl2YW4gRnJhdHJpYyAoR29vZ2xlKSBmb3IgZGlzY292ZXJpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzUwOCkKICAgICBbRW1pbGlhIEvkc3BlciwgYW5kIFN0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGVjX0dGcF9zaW1wbGVfcG9pbnRzX21ha2VfYWZmaW5lICh0aHVzLCBFQ19QT0lOVHNfbXVsIGV0Yy4pCiAgICAgZm9yIGNvcm5lciBjYXNlcy4gKENlcnRhaW4gaW5wdXQgcG9pbnRzIGF0IGluZmluaXR5IGNvdWxkIGxlYWQgdG8KICAgICBib2d1cyByZXN1bHRzLCB3aXRoIG5vbi1pbmZpbml0eSBpbnB1dHMgbWFwcGVkIHRvIGluZmluaXR5IHRvby4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFnIGFuZCAxLjAuMWggWzUgSnVuIDIwMTRdCgogICopIEZpeCBmb3IgU1NML1RMUyBNSVRNIGZsYXcuIEFuIGF0dGFja2VyIHVzaW5nIGEgY2FyZWZ1bGx5IGNyYWZ0ZWQKICAgICBoYW5kc2hha2UgY2FuIGZvcmNlIHRoZSB1c2Ugb2Ygd2VhayBrZXlpbmcgbWF0ZXJpYWwgaW4gT3BlblNTTAogICAgIFNTTC9UTFMgY2xpZW50cyBhbmQgc2VydmVycy4KCiAgICAgVGhhbmtzIHRvIEtJS1VDSEkgTWFzYXNoaSAoTGVwaWR1bSBDby4gTHRkLikgZm9yIGRpc2NvdmVyaW5nIGFuZAogICAgIHJlc2VhcmNoaW5nIHRoaXMgaXNzdWUuIChDVkUtMjAxNC0wMjI0KQogICAgIFtLSUtVQ0hJIE1hc2FzaGksIFN0ZXZlIEhlbnNvbl0KCiAgKikgRml4IERUTFMgcmVjdXJzaW9uIGZsYXcuIEJ5IHNlbmRpbmcgYW4gaW52YWxpZCBEVExTIGhhbmRzaGFrZSB0byBhbgogICAgIE9wZW5TU0wgRFRMUyBjbGllbnQgdGhlIGNvZGUgY2FuIGJlIG1hZGUgdG8gcmVjdXJzZSBldmVudHVhbGx5IGNyYXNoaW5nCiAgICAgaW4gYSBEb1MgYXR0YWNrLgoKICAgICBUaGFua3MgdG8gSW1yZSBSYWQgKFNlYXJjaC1MYWIgTHRkLikgZm9yIGRpc2NvdmVyaW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTAyMjEpCiAgICAgW0ltcmUgUmFkLCBTdGV2ZSBIZW5zb25dCgogICopIEZpeCBEVExTIGludmFsaWQgZnJhZ21lbnQgdnVsbmVyYWJpbGl0eS4gQSBidWZmZXIgb3ZlcnJ1biBhdHRhY2sgY2FuCiAgICAgYmUgdHJpZ2dlcmVkIGJ5IHNlbmRpbmcgaW52YWxpZCBEVExTIGZyYWdtZW50cyB0byBhbiBPcGVuU1NMIERUTFMKICAgICBjbGllbnQgb3Igc2VydmVyLiBUaGlzIGlzIHBvdGVudGlhbGx5IGV4cGxvaXRhYmxlIHRvIHJ1biBhcmJpdHJhcnkKICAgICBjb2RlIG9uIGEgdnVsbmVyYWJsZSBjbGllbnQgb3Igc2VydmVyLgoKICAgICBUaGFua3MgdG8gSvxyaSBBZWRsYSBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuIChDVkUtMjAxNC0wMTk1KQogICAgIFtK/HJpIEFlZGxhLCBTdGV2ZSBIZW5zb25dCgogICopIEZpeCBidWcgaW4gVExTIGNvZGUgd2hlcmUgY2xpZW50cyBlbmFibGUgYW5vbnltb3VzIEVDREggY2lwaGVyc3VpdGVzCiAgICAgYXJlIHN1YmplY3QgdG8gYSBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2suCgogICAgIFRoYW5rcyB0byBGZWxpeCBHcvZiZXJ0IGFuZCBJdmFuIEZyYXRyaWMgYXQgR29vZ2xlIGZvciBkaXNjb3ZlcmluZwogICAgIHRoaXMgaXNzdWUuIChDVkUtMjAxNC0zNDcwKQogICAgIFtGZWxpeCBHcvZiZXJ0LCBJdmFuIEZyYXRyaWMsIFN0ZXZlIEhlbnNvbl0KCiAgKikgSGFybW9uaXplIHZlcnNpb24gYW5kIGl0cyBkb2N1bWVudGF0aW9uLiAtZiBmbGFnIGlzIHVzZWQgdG8gZGlzcGxheQogICAgIGNvbXBpbGF0aW9uIGZsYWdzLgogICAgIFttYW5jaGEgPG1hbmNoYTFAem9oby5jb20+XQoKICAqKSBGaXggZWNrZXlfcHJpdl9lbmNvZGUgc28gaXQgaW1tZWRpYXRlbHkgcmV0dXJucyBhbiBlcnJvciB1cG9uIGEgZmFpbHVyZQogICAgIGluIGkyZF9FQ1ByaXZhdGVLZXkuCiAgICAgW21hbmNoYSA8bWFuY2hhMUB6b2hvLmNvbT5dCgogICopIEZpeCBzb21lIGRvdWJsZSBmcmVlcy4gVGhlc2UgYXJlIG5vdCB0aG91Z2h0IHRvIGJlIGV4cGxvaXRhYmxlLgogICAgIFttYW5jaGEgPG1hbmNoYTFAem9oby5jb20+XQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWYgYW5kIDEuMC4xZyBbNyBBcHIgMjAxNF0KCiAgKikgQSBtaXNzaW5nIGJvdW5kcyBjaGVjayBpbiB0aGUgaGFuZGxpbmcgb2YgdGhlIFRMUyBoZWFydGJlYXQgZXh0ZW5zaW9uCiAgICAgY2FuIGJlIHVzZWQgdG8gcmV2ZWFsIHVwIHRvIDY0ayBvZiBtZW1vcnkgdG8gYSBjb25uZWN0ZWQgY2xpZW50IG9yCiAgICAgc2VydmVyLgoKICAgICBUaGFua3MgZm9yIE5lZWwgTWVodGEgb2YgR29vZ2xlIFNlY3VyaXR5IGZvciBkaXNjb3ZlcmluZyB0aGlzIGJ1ZyBhbmQgdG8KICAgICBBZGFtIExhbmdsZXkgPGFnbEBjaHJvbWl1bS5vcmc+IGFuZCBCb2RvIE1vZWxsZXIgPGJtb2VsbGVyQGFjbS5vcmc+IGZvcgogICAgIHByZXBhcmluZyB0aGUgZml4IChDVkUtMjAxNC0wMTYwKQogICAgIFtBZGFtIExhbmdsZXksIEJvZG8gTW9lbGxlcl0KCiAgKikgRml4IGZvciB0aGUgYXR0YWNrIGRlc2NyaWJlZCBpbiB0aGUgcGFwZXIgIlJlY292ZXJpbmcgT3BlblNTTAogICAgIEVDRFNBIE5vbmNlcyBVc2luZyB0aGUgRkxVU0grUkVMT0FEIENhY2hlIFNpZGUtY2hhbm5lbCBBdHRhY2siCiAgICAgYnkgWXV2YWwgWWFyb20gYW5kIE5hb21pIEJlbmdlci4gRGV0YWlscyBjYW4gYmUgb2J0YWluZWQgZnJvbToKICAgICBodHRwOi8vZXByaW50LmlhY3Iub3JnLzIwMTQvMTQwCgogICAgIFRoYW5rcyB0byBZdXZhbCBZYXJvbSBhbmQgTmFvbWkgQmVuZ2VyIGZvciBkaXNjb3ZlcmluZyB0aGlzCiAgICAgZmxhdyBhbmQgdG8gWXV2YWwgWWFyb20gZm9yIHN1cHBseWluZyBhIGZpeCAoQ1ZFLTIwMTQtMDA3NikKICAgICBbWXV2YWwgWWFyb20gYW5kIE5hb21pIEJlbmdlcl0KCiAgKikgVExTIHBhZCBleHRlbnNpb246IGRyYWZ0LWFnbC10bHMtcGFkZGluZy0wMwoKICAgICBXb3JrYXJvdW5kIGZvciB0aGUgIlRMUyBoYW5nIGJ1ZyIgKHNlZSBGQVEgYW5kIFBSIzI3NzEpOiBpZiB0aGUKICAgICBUTFMgY2xpZW50IEhlbGxvIHJlY29yZCBsZW5ndGggdmFsdWUgd291bGQgb3RoZXJ3aXNlIGJlID4gMjU1IGFuZAogICAgIGxlc3MgdGhhdCA1MTIgcGFkIHdpdGggYSBkdW1teSBleHRlbnNpb24gY29udGFpbmluZyB6ZXJvZXMgc28gaXQKICAgICBpcyBhdCBsZWFzdCA1MTIgYnl0ZXMgbG9uZy4KCiAgICAgW0FkYW0gTGFuZ2xleSwgU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWUgYW5kIDEuMC4xZiBbNiBKYW4gMjAxNF0KCiAgKikgRml4IGZvciBUTFMgcmVjb3JkIHRhbXBlcmluZyBidWcuIEEgY2FyZWZ1bGx5IGNyYWZ0ZWQgaW52YWxpZCAKICAgICBoYW5kc2hha2UgY291bGQgY3Jhc2ggT3BlblNTTCB3aXRoIGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbi4KICAgICBUaGFua3MgdG8gQW50b24gSm9oYW5zc29uIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZXMuCiAgICAgKENWRS0yMDEzLTQzNTMpCgogICopIEtlZXAgb3JpZ2luYWwgRFRMUyBkaWdlc3QgYW5kIGVuY3J5cHRpb24gY29udGV4dHMgaW4gcmV0cmFuc21pc3Npb24KICAgICBzdHJ1Y3R1cmVzIHNvIHdlIGNhbiB1c2UgdGhlIHByZXZpb3VzIHNlc3Npb24gcGFyYW1ldGVycyBpZiB0aGV5IG5lZWQKICAgICB0byBiZSByZXNlbnQuIChDVkUtMjAxMy02NDUwKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBvcHRpb24gU1NMX09QX1NBRkFSSV9FQ0RIRV9FQ0RTQV9CVUcgKHBhcnQgb2YgU1NMX09QX0FMTCkgd2hpY2gKICAgICBhdm9pZHMgcHJlZmVycmluZyBFQ0RIRS1FQ0RTQSBjaXBoZXJzIHdoZW4gdGhlIGNsaWVudCBhcHBlYXJzIHRvIGJlCiAgICAgU2FmYXJpIG9uIE9TIFguICBTYWZhcmkgb24gT1MgWCAxMC44Li4xMC44LjMgYWR2ZXJ0aXNlcyBzdXBwb3J0IGZvcgogICAgIHNldmVyYWwgRUNESEUtRUNEU0EgY2lwaGVycywgYnV0IGZhaWxzIHRvIG5lZ290aWF0ZSB0aGVtLiAgVGhlIGJ1ZwogICAgIGlzIGZpeGVkIGluIE9TIFggMTAuOC40LCBidXQgQXBwbGUgaGF2ZSBydWxlZCBvdXQgYm90aCBob3QgZml4aW5nCiAgICAgMTAuOC4uMTAuOC4zIGFuZCBmb3JjaW5nIHVzZXJzIHRvIHVwZ3JhZGUgdG8gMTAuOC40IG9yIG5ld2VyLgogICAgIFtSb2IgU3RyYWRsaW5nLCBBZGFtIExhbmdsZXldCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xZCBhbmQgMS4wLjFlIFsxMSBGZWIgMjAxM10KCiAgKikgQ29ycmVjdCBmaXggZm9yIENWRS0yMDEzLTAxNjkuIFRoZSBvcmlnaW5hbCBkaWRuJ3Qgd29yayBvbiBBRVMtTkkKICAgICBzdXBwb3J0aW5nIHBsYXRmb3JtcyBvciB3aGVuIHNtYWxsIHJlY29yZHMgd2VyZSB0cmFuc2ZlcnJlZC4KICAgICBbQW5keSBQb2x5YWtvdiwgU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWMgYW5kIDEuMC4xZCBbNSBGZWIgMjAxM10KCiAgKikgTWFrZSB0aGUgZGVjb2Rpbmcgb2YgU1NMdjMsIFRMUyBhbmQgRFRMUyBDQkMgcmVjb3JkcyBjb25zdGFudCB0aW1lLgoKICAgICBUaGlzIGFkZHJlc3NlcyB0aGUgZmxhdyBpbiBDQkMgcmVjb3JkIHByb2Nlc3NpbmcgZGlzY292ZXJlZCBieSAKICAgICBOYWRoZW0gQWxmYXJkYW4gYW5kIEtlbm55IFBhdGVyc29uLiBEZXRhaWxzIG9mIHRoaXMgYXR0YWNrIGNhbiBiZSBmb3VuZAogICAgIGF0OiBodHRwOi8vd3d3LmlzZy5yaHVsLmFjLnVrL3Rscy8gICAgIAoKICAgICBUaGFua3MgZ28gdG8gTmFkaGVtIEFsZmFyZGFuIGFuZCBLZW5ueSBQYXRlcnNvbiBvZiB0aGUgSW5mb3JtYXRpb24KICAgICBTZWN1cml0eSBHcm91cCBhdCBSb3lhbCBIb2xsb3dheSwgVW5pdmVyc2l0eSBvZiBMb25kb24KICAgICAod3d3LmlzZy5yaHVsLmFjLnVrKSBmb3IgZGlzY292ZXJpbmcgdGhpcyBmbGF3IGFuZCBBZGFtIExhbmdsZXkgYW5kCiAgICAgRW1pbGlhIEvkc3BlciBmb3IgdGhlIGluaXRpYWwgcGF0Y2guCiAgICAgKENWRS0yMDEzLTAxNjkpCiAgICAgW0VtaWxpYSBL5HNwZXIsIEFkYW0gTGFuZ2xleSwgQmVuIExhdXJpZSwgQW5keSBQb2x5YWtvdiwgU3RldmUgSGVuc29uXQoKICAqKSBGaXggZmxhdyBpbiBBRVNOSSBoYW5kbGluZyBvZiBUTFMgMS4yIGFuZCAxLjEgcmVjb3JkcyBmb3IgQ0JDIG1vZGUKICAgICBjaXBoZXJzdWl0ZXMgd2hpY2ggY2FuIGJlIGV4cGxvaXRlZCBpbiBhIGRlbmlhbCBvZiBzZXJ2aWNlIGF0dGFjay4KICAgICBUaGFua3MgZ28gdG8gYW5kIHRvIEFkYW0gTGFuZ2xleSA8YWdsQGNocm9taXVtLm9yZz4gZm9yIGRpc2NvdmVyaW5nCiAgICAgYW5kIGRldGVjdGluZyB0aGlzIGJ1ZyBhbmQgdG8gV29sZmdhbmcgRXR0bGluZ2VyCiAgICAgPHdvbGZnYW5nLmV0dGxpbmdlckBnbWFpbC5jb20+IGZvciBpbmRlcGVuZGVudGx5IGRpc2NvdmVyaW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDEyLTI2ODYpCiAgICAgW0FkYW0gTGFuZ2xleV0KCiAgKikgUmV0dXJuIGFuIGVycm9yIHdoZW4gY2hlY2tpbmcgT0NTUCBzaWduYXR1cmVzIHdoZW4ga2V5IGlzIE5VTEwuCiAgICAgVGhpcyBmaXhlcyBhIERvUyBhdHRhY2suIChDVkUtMjAxMy0wMTY2KQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugb3BlbnNzbCB2ZXJpZnkgcmV0dXJuIGVycm9ycy4KICAgICBbQ2hyaXMgUGFsbWVyIDxwYWxtZXJAZ29vZ2xlLmNvbT4gYW5kIEJlbiBMYXVyaWVdCgogICopIENhbGwgT0NTUCBTdGFwbGluZyBjYWxsYmFjayBhZnRlciBjaXBoZXJzdWl0ZSBoYXMgYmVlbiBjaG9zZW4sIHNvCiAgICAgdGhlIHJpZ2h0IHJlc3BvbnNlIGlzIHN0YXBsZWQuIEFsc28gY2hhbmdlIFNTTF9nZXRfY2VydGlmaWNhdGUoKQogICAgIHNvIGl0IHJldHVybnMgdGhlIGNlcnRpZmljYXRlIGFjdHVhbGx5IHNlbnQuCiAgICAgU2VlIGh0dHA6Ly9ydC5vcGVuc3NsLm9yZy9UaWNrZXQvRGlzcGxheS5odG1sP2lkPTI4MzYuCiAgICAgW1JvYiBTdHJhZGxpbmcgPHJvYi5zdHJhZGxpbmdAY29tb2RvLmNvbT5dCgogICopIEZpeCBwb3NzaWJsZSBkZWFkbG9jayB3aGVuIGRlY29kaW5nIHB1YmxpYyBrZXlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERvbid0IHVzZSBUTFMgMS4wIHJlY29yZCB2ZXJzaW9uIG51bWJlciBpbiBpbml0aWFsIGNsaWVudCBoZWxsbwogICAgIGlmIHJlbmVnb3RpYXRpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFiIGFuZCAxLjAuMWMgWzEwIE1heSAyMDEyXQoKICAqKSBTYW5pdHkgY2hlY2sgcmVjb3JkIGxlbmd0aCBiZWZvcmUgc2tpcHBpbmcgZXhwbGljaXQgSVYgaW4gVExTCiAgICAgMS4yLCAxLjEgYW5kIERUTFMgdG8gZml4IERvUyBhdHRhY2suCgogICAgIFRoYW5rcyB0byBDb2Rlbm9taWNvbiBmb3IgZGlzY292ZXJpbmcgdGhpcyBpc3N1ZSB1c2luZyBGdXp6LW8tTWF0aWMKICAgICBmdXp6aW5nIGFzIGEgc2VydmljZSB0ZXN0aW5nIHBsYXRmb3JtLgogICAgIChDVkUtMjAxMi0yMzMzKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWxpc2UgdGtleWxlbiBwcm9wZXJseSB3aGVuIGVuY3J5cHRpbmcgQ01TIG1lc3NhZ2VzLgogICAgIFRoYW5rcyB0byBTb2xhciBEZXNpZ25lciBvZiBPcGVud2FsbCBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gRklQUyBtb2RlIGRvbid0IHRyeSB0byB1c2UgY29tcG9zaXRlIGNpcGhlcnMgYXMgdGhleSBhcmUgbm90CiAgICAgYXBwcm92ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFhIGFuZCAxLjAuMWIgWzI2IEFwciAyMDEyXQoKICAqKSBPcGVuU1NMIDEuMC4wIHNldHMgU1NMX09QX0FMTCB0byAweDgwMDAwRkZGTCBhbmQgT3BlblNTTCAxLjAuMSBhbmQKICAgICAxLjAuMWEgc2V0IFNTTF9PUF9OT19UTFN2MV8xIHRvIDB4MDAwMDA0MDBMIHdoaWNoIHdvdWxkIHVuZm9ydHVuYXRlbHkKICAgICBtZWFuIGFueSBhcHBsaWNhdGlvbiBjb21waWxlZCBhZ2FpbnN0IE9wZW5TU0wgMS4wLjAgaGVhZGVycyBzZXR0aW5nCiAgICAgU1NMX09QX0FMTCB3b3VsZCBhbHNvIHNldCBTU0xfT1BfTk9fVExTdjFfMSwgdW5pbnRlbnRpb25hbGx5IGRpc2FibG5nCiAgICAgVExTIDEuMSBhbHNvLiBGaXggdGhpcyBieSBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgU1NMX09QX05PX1RMU3YxXzEgdG8KICAgICAweDEwMDAwMDAwTCBBbnkgYXBwbGljYXRpb24gd2hpY2ggd2FzIHByZXZpb3VzbHkgY29tcGlsZWQgYWdhaW5zdAogICAgIE9wZW5TU0wgMS4wLjEgb3IgMS4wLjFhIGhlYWRlcnMgYW5kIHdoaWNoIGNhcmVzIGFib3V0IFNTTF9PUF9OT19UTFN2MV8xCiAgICAgd2lsbCBuZWVkIHRvIGJlIHJlY29tcGlsZWQgYXMgYSByZXN1bHQuIExldHRpbmcgYmUgcmVzdWx0cyBpbgogICAgIGluYWJpbGl0eSB0byBkaXNhYmxlIHNwZWNpZmljYWxseSBUTFMgMS4xIGFuZCBpbiBjbGllbnQgY29udGV4dCwKICAgICBpbiB1bmxpa2UgZXZlbnQsIGxpbWl0IG1heGltdW0gb2ZmZXJlZCB2ZXJzaW9uIHRvIFRMUyAxLjAgW3NlZSBiZWxvd10uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gb3JkZXIgdG8gZW5zdXJlIGludGVyb3BlcmFiaWx0eSBTU0xfT1BfTk9fcHJvdG9jb2xYIGRvZXMgbm90CiAgICAgZGlzYWJsZSBqdXN0IHByb3RvY29sIFgsIGJ1dCBhbGwgcHJvdG9jb2xzIGFib3ZlIFggKmlmKiB0aGVyZSBhcmUKICAgICBwcm90b2NvbHMgKmJlbG93KiBYIHN0aWxsIGVuYWJsZWQuIEluIG1vcmUgcHJhY3RpY2FsIHRlcm1zIGl0IG1lYW5zCiAgICAgdGhhdCBpZiBhcHBsaWNhdGlvbiB3YW50cyB0byBkaXNhYmxlIFRMUzEuMCBpbiBmYXZvciBvZiBUTFMxLjEgYW5kCiAgICAgYWJvdmUsIGl0J3Mgbm90IHN1ZmZpY2llbnQgdG8gcGFzcyBTU0xfT1BfTk9fVExTdjEsIG9uZSBoYXMgdG8gcGFzcwogICAgIFNTTF9PUF9OT19UTFN2MXxTU0xfT1BfTk9fU1NMdjN8U1NMX09QX05PX1NTTHYyLiBUaGlzIGFwcGxpZXMgdG8KICAgICBjbGllbnQgc2lkZS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjEgYW5kIDEuMC4xYSBbMTkgQXByIDIwMTJdCgogICopIENoZWNrIGZvciBwb3RlbnRpYWxseSBleHBsb2l0YWJsZSBvdmVyZmxvd3MgaW4gYXNuMV9kMmlfcmVhZF9iaW8KICAgICBCVUZfbWVtX2dyb3cgYW5kIEJVRl9tZW1fZ3Jvd19jbGVhbi4gUmVmdXNlIGF0dGVtcHRzIHRvIHNocmluayBidWZmZXIKICAgICBpbiBDUllQVE9fcmVhbGxvY19jbGVhbi4KCiAgICAgVGhhbmtzIHRvIFRhdmlzIE9ybWFuZHksIEdvb2dsZSBTZWN1cml0eSBUZWFtLCBmb3IgZGlzY292ZXJpbmcgdGhpcwogICAgIGlzc3VlIGFuZCB0byBBZGFtIExhbmdsZXkgPGFnbEBjaHJvbWl1bS5vcmc+IGZvciBmaXhpbmcgaXQuCiAgICAgKENWRS0yMDEyLTIxMTApCiAgICAgW0FkYW0gTGFuZ2xleSAoR29vZ2xlKSwgVGF2aXMgT3JtYW5keSwgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIERvbid0IGFsbG93IFRMUyAxLjIgU0hBLTI1NiBjaXBoZXJzdWl0ZXMgaW4gVExTIDEuMCwgMS4xIGNvbm5lY3Rpb25zLgogICAgIFtBZGFtIExhbmdsZXldCgogICopIFdvcmthcm91bmRzIGZvciBzb21lIGJyb2tlbiBzZXJ2ZXJzIHRoYXQgImhhbmciIGlmIGEgY2xpZW50IGhlbGxvCiAgICAgcmVjb3JkIGxlbmd0aCBleGNlZWRzIDI1NSBieXRlcy4KCiAgICAgMS4gRG8gbm90IHVzZSByZWNvcmQgdmVyc2lvbiBudW1iZXIgPiBUTFMgMS4wIGluIGluaXRpYWwgY2xpZW50CiAgICAgICAgaGVsbG86IHNvbWUgKGJ1dCBub3QgYWxsKSBoYW5naW5nIHNlcnZlcnMgd2lsbCBub3cgd29yay4KICAgICAyLiBJZiB3ZSBzZXQgT1BFTlNTTF9NQVhfVExTMV8yX0NJUEhFUl9MRU5HVEggdGhpcyB3aWxsIHRydW5jYXRlCgl0aGUgbnVtYmVyIG9mIGNpcGhlcnMgc2VudCBpbiB0aGUgY2xpZW50IGhlbGxvLiBUaGlzIHNob3VsZCBiZQogICAgICAgIHNldCB0byBhbiBldmVuIG51bWJlciwgc3VjaCBhcyA1MCwgZm9yIGV4YW1wbGUgYnkgcGFzc2luZzoKICAgICAgICAtRE9QRU5TU0xfTUFYX1RMUzFfMl9DSVBIRVJfTEVOR1RIPTUwIHRvIGNvbmZpZyBvciBDb25maWd1cmUuCiAgICAgICAgTW9zdCBicm9rZW4gc2VydmVycyBzaG91bGQgbm93IHdvcmsuCiAgICAgMy4gSWYgYWxsIGVsc2UgZmFpbHMgc2V0dGluZyBPUEVOU1NMX05PX1RMUzFfMl9DTElFTlQgd2lsbCBkaXNhYmxlCglUTFMgMS4yIGNsaWVudCBzdXBwb3J0IGVudGlyZWx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBTRUdWIGluIFZlY3RvciBQZXJtdXRhdGlvbiBBRVMgbW9kdWxlIG9ic2VydmVkIGluIE9wZW5TU0guCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4waCBhbmQgMS4wLjEgIFsxNCBNYXIgMjAxMl0KCiAgKikgQWRkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgTURDMiBzaWduYXR1cmVzIHdoaWNoIHVzZSBhbiBBU04xIE9DVEVUCiAgICAgU1RSSU5HIGZvcm0gaW5zdGVhZCBvZiBhIERpZ2VzdEluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVGhlIGZvcm1hdCB1c2VkIGZvciBNREMyIFJTQSBzaWduYXR1cmVzIGlzIGluY29uc2lzdGVudCBiZXR3ZWVuIEVWUAogICAgIGFuZCB0aGUgUlNBX3NpZ24vUlNBX3ZlcmlmeSBmdW5jdGlvbnMuIFRoaXMgd2FzIG1hZGUgbW9yZSBhcHBhcmVudCB3aGVuCiAgICAgT3BlblNTTCB1c2VkIFJTQV9zaWduL1JTQV92ZXJpZnkgZm9yIHNvbWUgUlNBIHNpZ25hdHVyZXMgaW4gcGFydGljdWxhcgogICAgIHRob3NlIHdoaWNoIHdlbnQgdGhyb3VnaCBFVlBfUEtFWV9NRVRIT0QgaW4gMS4wLjAgYW5kIGxhdGVyLiBEZXRlY3QgCiAgICAgdGhlIGNvcnJlY3QgZm9ybWF0IGluIFJTQV92ZXJpZnkgc28gYm90aCBmb3JtcyB0cmFuc3BhcmVudGx5IHdvcmsuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU29tZSBzZXJ2ZXJzIHdoaWNoIHN1cHBvcnQgVExTIDEuMCBjYW4gY2hva2UgaWYgd2UgaW5pdGlhbGx5IGluZGljYXRlCiAgICAgc3VwcG9ydCBmb3IgVExTIDEuMiBhbmQgbGF0ZXIgcmVuZWdvdGlhdGUgdXNpbmcgVExTIDEuMCBpbiB0aGUgUlNBCiAgICAgZW5jcnlwdGVkIHByZW1hc3RlciBzZWNyZXQuIEFzIGEgd29ya2Fyb3VuZCB1c2UgdGhlIG1heGltdW0gcGVybWl0dGVkCiAgICAgY2xpZW50IHZlcnNpb24gaW4gY2xpZW50IGhlbGxvLCB0aGlzIHNob3VsZCBrZWVwIHN1Y2ggc2VydmVycyBoYXBweQogICAgIGFuZCBzdGlsbCB3b3JrIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgT3BlblNTTC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgVExTL0RUTFMgaGVhcnRiZWF0cy4KICAgICBbUm9iaW4gU2VnZ2VsbWFubiA8c2VnZ2VsbWFubkBmaC1tdWVuc3Rlci5kZT5dCgogICopIEFkZCBzdXBwb3J0IGZvciBTQ1RQLgogICAgIFtSb2JpbiBTZWdnZWxtYW5uIDxzZWdnZWxtYW5uQGZoLW11ZW5zdGVyLmRlPl0KCiAgKikgSW1wcm92ZWQgUFJORyBzZWVkaW5nIGZvciBWT1MuCiAgICAgW1BhdWwgR3JlZW4gPFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20+XQoKICAqKSBFeHRlbnNpdmUgYXNzZW1ibGVyIHBhY2tzIHVwZGF0ZXMsIG1vc3Qgbm90YWJseToKCgktIHg4NltfNjRdOiAgICAgQUVTLU5JLCBQQ0xNVUxRRFEsIFJEUkFORCBzdXBwb3J0OwoJLSB4ODZbXzY0XTogICAgIFNTU0UzIHN1cHBvcnQgKFNIQTEsIHZlY3Rvci1wZXJtdXRhdGlvbiBBRVMpOwoJLSB4ODZfNjQ6ICAgICAgIGJpdC1zbGljZWQgQUVTIGltcGxlbWVudGF0aW9uOwoJLSBBUk06ICAgICAgICAgIE5FT04gc3VwcG9ydCwgY29udGVtcG9yYXJ5IHBsYXRmb3JtcyBvcHRpbWl6YXRpb25zOwoJLSBzMzkweDogICAgICAgIHoxOTYgc3VwcG9ydDsKCS0gKjogICAgICAgICAgICBHSEFTSCBhbmQgR0YoMl5tKSBtdWx0aXBsaWNhdGlvbiBpbXBsZW1lbnRhdGlvbnM7CgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBNYWtlIFRMUy1TUlAgY29kZSBjb25mb3JtYW50IHdpdGggUkZDIDUwNTQgQVBJIGNsZWFudXAKICAgICAocmVtb3ZhbCBvZiB1bm5lY2Vzc2FyeSBjb2RlKQogICAgIFtQZXRlciBTeWx2ZXN0ZXIgPHBldGVyLnN5bHZlc3RlckBlZGVsd2ViLmZyPl0KCiAgKikgQWRkIFRMUyBrZXkgbWF0ZXJpYWwgZXhwb3J0ZXIgZnJvbSBSRkMgNTcwNS4KICAgICBbRXJpYyBSZXNjb3JsYV0KCiAgKikgQWRkIERUTFMtU1JUUCBuZWdvdGlhdGlvbiBmcm9tIFJGQyA1NzY0LgogICAgIFtFcmljIFJlc2NvcmxhXQoKICAqKSBBZGQgTmV4dCBQcm90b2NvbCBOZWdvdGlhdGlvbiwKICAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1hZ2wtdGxzLW5leHRwcm90b25lZy0wMC4gQ2FuIGJlCiAgICAgZGlzYWJsZWQgd2l0aCBhIG5vLW5wbiBmbGFnIHRvIGNvbmZpZyBvciBDb25maWd1cmUuIENvZGUgZG9uYXRlZAogICAgIGJ5IEdvb2dsZS4KICAgICBbQWRhbSBMYW5nbGV5IDxhZ2xAZ29vZ2xlLmNvbT4gYW5kIEJlbiBMYXVyaWVdCgogICopIEFkZCBvcHRpb25hbCA2NC1iaXQgb3B0aW1pemVkIGltcGxlbWVudGF0aW9ucyBvZiBlbGxpcHRpYyBjdXJ2ZXMgTklTVC1QMjI0LAogICAgIE5JU1QtUDI1NiwgTklTVC1QNTIxLCB3aXRoIGNvbnN0YW50LXRpbWUgc2luZ2xlIHBvaW50IG11bHRpcGxpY2F0aW9uIG9uCiAgICAgdHlwaWNhbCBpbnB1dHMuIENvbXBpbGVyIHN1cHBvcnQgZm9yIHRoZSBub25zdGFuZGFyZCB0eXBlIF9fdWludDEyOF90IGlzCiAgICAgcmVxdWlyZWQgdG8gdXNlIHRoaXMgKHByZXNlbnQgaW4gZ2NjIDQuNCBhbmQgbGF0ZXIsIGZvciA2NC1iaXQgYnVpbGRzKS4KICAgICBDb2RlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIHZlcnNpb24gMi4wLgoKICAgICBTcGVjaWZ5ICJlbmFibGUtZWNfbmlzdHBfNjRfZ2NjXzEyOCIgb24gdGhlIENvbmZpZ3VyZSAob3IgY29uZmlnKSBjb21tYW5kCiAgICAgbGluZSB0byBpbmNsdWRlIHRoaXMgaW4geW91ciBidWlsZCBvZiBPcGVuU1NMLCBhbmQgcnVuICJtYWtlIGRlcGVuZCIgKG9yCiAgICAgIm1ha2UgdXBkYXRlIikuIFRoaXMgZW5hYmxlcyB0aGUgZm9sbG93aW5nIEVDX01FVEhPRHM6CgogICAgICAgICBFQ19HRnBfbmlzdHAyMjRfbWV0aG9kKCkKICAgICAgICAgRUNfR0ZwX25pc3RwMjU2X21ldGhvZCgpCiAgICAgICAgIEVDX0dGcF9uaXN0cDUyMV9tZXRob2QoKQoKICAgICBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZSgpIHdpbGwgYXV0b21hdGljYWxseSB1c2UgdGhlc2UgKHdoaWxlCiAgICAgRUNfR1JPVVBfbmV3X2N1cnZlX0dGcCgpIGN1cnJlbnRseSBwcmVmZXJzIHRoZSBtb3JlIGZsZXhpYmxlCiAgICAgaW1wbGVtZW50YXRpb25zKS4KICAgICBbRW1pbGlhIEvkc3BlciwgQWRhbSBMYW5nbGV5LCBCb2RvIE1vZWxsZXIgKEdvb2dsZSldCgogICopIFVzZSB0eXBlIG9zc2xfc3NpemVfdCBpbnN0YWQgb2Ygc3NpemVfdCB3aGljaCBpc24ndCBhdmFpbGFibGUgb24KICAgICBhbGwgcGxhdGZvcm1zLiBNb3ZlIHNzaXplX3QgZGVmaW5pdGlvbiBmcm9tIGVfb3MuaCB0byB0aGUgcHVibGljCiAgICAgaGVhZGVyIGZpbGUgZV9vczIuaCBhcyBpdCBub3cgYXBwZWFycyBpbiBwdWJsaWMgaGVhZGVyIGZpbGUgY21zLmgKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgLXNpZ29wdCBvcHRpb24gdG8gdGhlIGNhLCByZXEgYW5kIHg1MDkgdXRpbGl0aWVzLiBBZGRpdGlvbmFsCiAgICAgc2lnbmF0dXJlIHBhcmFtZXRlcnMgY2FuIGJlIHBhc3NlZCB1c2luZyB0aGlzIG9wdGlvbiBhbmQgaW4KICAgICBwYXJ0aWN1bGFyIFBTUy4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIFJTQSBQU1Mgc2lnbmluZyBmdW5jdGlvbi4gVGhpcyB3aWxsIGdlbmVyYXRlIGFuZCBzZXQgdGhlCiAgICAgYXBwcm9wcmlhdGUgQWxnb3JpdGhtSWRlbnRpZmllcnMgZm9yIFBTUyBiYXNlZCBvbiB0aG9zZSBpbiB0aGUKICAgICBjb3JyZXNwb25kaW5nIEVWUF9NRF9DVFggc3RydWN0dXJlLiBObyBhcHBsaWNhdGlvbiBzdXBwb3J0IHlldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBjb21wYW5pb24gYWxnb3JpdGhtIHNwZWNpZmljIEFTTjEgc2lnbmluZyByb3V0aW5lcy4KICAgICBOZXcgZnVuY3Rpb24gQVNOMV9pdGVtX3NpZ25fY3R4KCkgc2lnbnMgYSBwcmUtaW5pdGlhbGlzZWQKICAgICBFVlBfTURfQ1RYIHN0cnVjdHVyZSBhbmQgc2V0cyBBbGdvcml0aG1JZGVudGlmaWVycyBiYXNlZCBvbgogICAgIHRoZSBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgYWxnb3JpdGhtIHNwZWNpZmljIEFTTjEgdmVyaWZpY2F0aW9uIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uCiAgICAgdG8gRVZQX1BLRVlfQVNOMV9NRVRIT0Q6IHRoaXMgaXMgbm90IGluIEVWUF9QS0VZX01FVEhPRCBzaW5jZSB0aGUgQVNOMQogICAgIGhhbmRsaW5nIHdpbGwgYmUgdGhlIHNhbWUgbm8gbWF0dGVyIHdoYXQgRVZQX1BLRVlfTUVUSE9EIGlzIHVzZWQuCiAgICAgQWRkIGEgUFNTIGhhbmRsZXIgdG8gc3VwcG9ydCB2ZXJpZmljYXRpb24gb2YgUFNTIHNpZ25hdHVyZXM6IGNoZWNrZWQKICAgICBhZ2FpbnN0IGEgbnVtYmVyIG9mIHNhbXBsZSBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNpZ25hdHVyZSBwcmludGluZyBmb3IgUFNTLiBBZGQgUFNTIE9JRHMuCiAgICAgW1N0ZXZlIEhlbnNvbiwgTWFydGluIEthaXNlciA8bGlzdHNAa2Fpc2VyLmN4Pl0KCiAgKikgQWRkIGFsZ29yaXRobSBzcGVjaWZpYyBzaWduYXR1cmUgcHJpbnRpbmcuIEFuIGluZGl2aWR1YWwgQVNOMSBtZXRob2QKICAgICBjYW4gbm93IHByaW50IG91dCBzaWduYXR1cmVzIGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIGhleCBkdW1wLiAKCiAgICAgTW9yZSBjb21wbGV4IHNpZ25hdHVyZXMgKGUuZy4gUFNTKSBjYW4gcHJpbnQgb3V0IG1vcmUgbWVhbmluZ2Z1bAogICAgIGluZm9ybWF0aW9uLiBJbmNsdWRlIERTQSB2ZXJzaW9uIHRoYXQgcHJpbnRzIG91dCB0aGUgc2lnbmF0dXJlCiAgICAgcGFyYW1ldGVycyByLCBzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBhc3N3b3JkIGJhc2VkIHJlY2lwaWVudCBpbmZvIHN1cHBvcnQgZm9yIENNUyBsaWJyYXJ5OiBpbXBsZW1lbnRpbmcKICAgICBSRkMzMjExLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNwbGl0IHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gaW50byBQQkVTMiBhbmQgUEJLREYyIGZ1bmN0aW9ucy4gVGhpcwogICAgIG5lYXRseSBzZXBhcmF0ZXMgdGhlIGNvZGUgaW50byBjaXBoZXIgYW5kIFBCRSBzZWN0aW9ucyBhbmQgaXMgcmVxdWlyZWQKICAgICBmb3Igc29tZSBhbGdvcml0aG1zIHRoYXQgc3BsaXQgUEJFUzIgaW50byBzZXBhcmF0ZSBwaWVjZXMgKHN1Y2ggYXMKICAgICBwYXNzd29yZCBiYXNlZCBDTVMpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNlc3Npb24taGFuZGxpbmcgZml4ZXM6CiAgICAgLSBGaXggaGFuZGxpbmcgb2YgY29ubmVjdGlvbnMgdGhhdCBhcmUgcmVzdW1pbmcgd2l0aCBhIHNlc3Npb24gSUQsCiAgICAgICBidXQgYWxzbyBzdXBwb3J0IFNlc3Npb24gVGlja2V0cy4KICAgICAtIEZpeCBhIGJ1ZyB0aGF0IHN1cHByZXNzZWQgaXNzdWluZyBvZiBhIG5ldyB0aWNrZXQgaWYgdGhlIGNsaWVudAogICAgICAgcHJlc2VudGVkIGEgdGlja2V0IHdpdGggYW4gZXhwaXJlZCBzZXNzaW9uLgogICAgIC0gVHJ5IHRvIHNldCB0aGUgdGlja2V0IGxpZmV0aW1lIGhpbnQgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUuCiAgICAgLSBNYWtlIHRpY2tldHMgc2hvcnRlciBieSBleGNsdWRpbmcgaXJyZWxldmFudCBpbmZvcm1hdGlvbi4KICAgICAtIE9uIHRoZSBjbGllbnQgc2lkZSwgZG9uJ3QgaWdub3JlIHJlbmV3ZWQgdGlja2V0cy4KICAgICBbQWRhbSBMYW5nbGV5LCBCb2RvIE1vZWxsZXIgKEdvb2dsZSldCgogICopIEZpeCBQU0sgc2Vzc2lvbiByZXByZXNlbnRhdGlvbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgUkM0LU1ENSBhbmQgQUVTTkktU0hBMSAic3RpdGNoZWQiIGltcGxlbWVudGF0aW9ucy4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgSW50ZWwuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCBHQ00gc3VwcG9ydCB0byBUTFMgbGlicmFyeS4gU29tZSBjdXN0b20gY29kZSBpcyBuZWVkZWQgdG8gc3BsaXQKICAgICB0aGUgSVYgYmV0d2VlbiB0aGUgZml4ZWQgKGZyb20gUFJGKSBhbmQgZXhwbGljaXQgKGZyb20gVExTIHJlY29yZCkKICAgICBwb3J0aW9ucy4gVGhpcyBhZGRzIGFsbCBHQ00gY2lwaGVyc3VpdGVzIHN1cHBvcnRlZCBieSBSRkM1Mjg4IGFuZCAKICAgICBSRkM1Mjg5LiBHZW5lcmFsaXNlIHNvbWUgQUVTKiBjaXBoZXJzdHJpbmdzIHRvIGluY2x1ZGUgR0NNIGFuZAogICAgIGFkZCBhIHNwZWNpYWwgQUVTR0NNIHN0cmluZyBmb3IgR0NNIG9ubHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXhwYW5kIHJhbmdlIG9mIGN0cmxzIGZvciBBRVMgR0NNLiBQZXJtaXQgc2V0dGluZyBpbnZvY2F0aW9uCiAgICAgZmllbGQgb24gZGVjcnlwdCBhbmQgcmV0cmlldmFsIG9mIGludm9jYXRpb24gZmllbGQgb25seSBvbiBlbmNyeXB0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBITUFDIEVDQyBjaXBoZXJzdWl0ZXMgZnJvbSBSRkM1Mjg5LiBJbmNsdWRlIFNIQTM4NCBQUkYgc3VwcG9ydC4KICAgICBBcyByZXF1aXJlZCBieSBSRkM1Mjg5IHRoZXNlIGNpcGhlcnN1aXRlcyBjYW5ub3QgYmUgdXNlZCBpZiBmb3IKICAgICB2ZXJzaW9ucyBvZiBUTFMgZWFybGllciB0aGFuIDEuMi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGb3IgRklQUyBjYXBhYmxlIE9wZW5TU0wgaW50ZXJwcmV0IGEgTlVMTCBkZWZhdWx0IHB1YmxpYyBrZXkgbWV0aG9kCiAgICAgYXMgdW5zZXQgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgZGVmYXVsdCBidXQgZG8gKm5vdCogc2V0IHRoZSBkZWZhdWx0LgogICAgIFRoaXMgbWVhbnMgd2UgY2FuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kIGluIGFwcGxpY2F0aW9ucyB0aGF0CiAgICAgc3dpdGNoIGJldHdlZW4gRklQUyBhbmQgbm9uLUZJUFMgbW9kZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVkaXJlY3QgSE1BQyBhbmQgQ01BQyBvcGVyYXRpb25zIHRvIEZJUFMgbW9kdWxlIGluIEZJUFMgbW9kZS4gSWYgYW4KICAgICBFTkdJTkUgaXMgdXNlZCB0aGVuIHdlIGNhbm5vdCBoYW5kbGUgdGhhdCBpbiB0aGUgRklQUyBtb2R1bGUgc28gd2UKICAgICBrZWVwIG9yaWdpbmFsIGNvZGUgaWZmIG5vbi1GSVBTIG9wZXJhdGlvbnMgYXJlIGFsbG93ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIC1hdHRpbWUgb3B0aW9uIHRvIG9wZW5zc2wgdXRpbGl0aWVzLgogICAgIFtQZXRlciBFY2tlcnNsZXkgPHBkZUBlZmYub3JnPiwgQmVuIExhdXJpZSBhbmQgU3RldmUgSGVuc29uXQoKICAqKSBSZWRpcmVjdCBEU0EgYW5kIERIIG9wZXJhdGlvbnMgdG8gRklQUyBtb2R1bGUgaW4gRklQUyBtb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlZGlyZWN0IEVDRFNBIGFuZCBFQ0RIIG9wZXJhdGlvbnMgdG8gRklQUyBtb2R1bGUgaW4gRklQUyBtb2RlLiBBbHNvIHVzZQogICAgIEZJUFMgRUMgbWV0aG9kcyB1bmNvbmRpdGlvbmFsbHkgZm9yIG5vdy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgYnVpbGQgb3B0aW9uIG5vLWVjMm0gdG8gZGlzYWJsZSBjaGFyYWN0ZXJpc3RpYyAyIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQmFja3BvcnQgbGliY3J5cHRvIGF1ZGl0IG9mIHJldHVybiB2YWx1ZSBjaGVja2luZyBmcm9tIDEuMS4wLWRldjsgbm90CiAgICAgYWxsIGNhc2VzIGNhbiBiZSBjb3ZlcmVkIGFzIHNvbWUgaW50cm9kdWNlIGJpbmFyeSBpbmNvbXBhdGliaWxpdGllcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWRpcmVjdCBSU0Egb3BlcmF0aW9ucyB0byBGSVBTIG1vZHVsZSBpbmNsdWRpbmcga2V5Z2VuLAogICAgIGVuY3J5cHQsIGRlY3J5cHQsIHNpZ24gYW5kIHZlcmlmeS4gQmxvY2sgdXNlIG9mIG5vbiBGSVBTIFJTQSBtZXRob2RzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzaW1pbGFyIGxvdyBsZXZlbCBBUEkgYmxvY2tpbmcgdG8gY2lwaGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBMb3cgbGV2ZWwgZGlnZXN0IEFQSXMgYXJlIG5vdCBhcHByb3ZlZCBpbiBGSVBTIG1vZGU6IGFueSBhdHRlbXB0CiAgICAgdG8gdXNlIHRoZXNlIHdpbGwgY2F1c2UgYSBmYXRhbCBlcnJvci4gQXBwbGljYXRpb25zIHRoYXQgKnJlYWxseSogd2FudAogICAgIHRvIHVzZSB0aGVtIGNhbiB1c2UgdGhlIHByaXZhdGVfKiB2ZXJzaW9uIGluc3RlYWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVkaXJlY3QgY2lwaGVyIG9wZXJhdGlvbnMgdG8gRklQUyBtb2R1bGUgZm9yIEZJUFMgYnVpbGRzLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWRpcmVjdCBkaWdlc3Qgb3BlcmF0aW9ucyB0byBGSVBTIG1vZHVsZSBmb3IgRklQUyBidWlsZHMuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBidWlsZCBzeXN0ZW0gdG8gYWRkICJmaXBzIiBmbGFnIHdoaWNoIHdpbGwgbGluayBpbiBmaXBzY2FuaXN0ZXIubwogICAgIGZvciBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkcyBlbWJlZGRpbmcgYSBzaWduYXR1cmUgaWYgbmVlZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE91dHB1dCBUTFMgc3VwcG9ydGVkIGN1cnZlcyBpbiBwcmVmZXJlbmNlIG9yZGVyIGluc3RlYWQgb2YgbnVtZXJpY2FsCiAgICAgb3JkZXIuIFRoaXMgaXMgY3VycmVudGx5IGhhcmRjb2RlZCBmb3IgdGhlIGhpZ2hlc3Qgb3JkZXIgY3VydmVzIGZpcnN0LgogICAgIFRoaXMgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZSBzbyBhcHBsaWNhdGlvbnMgY2FuIGp1ZGdlIHNwZWVkIHZzIHN0cmVuZ3RoLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBUTFMgdjEuMiBzZXJ2ZXIgc3VwcG9ydCBmb3IgY2xpZW50IGF1dGhlbnRpY2F0aW9uLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRklQUyBtb2RlIGluIHNzbCBsaWJyYXJ5OiBkaXNhYmxlIFNTTHYzLCBub24tRklQUyBjaXBoZXJzCiAgICAgYW5kIGVuYWJsZSBNRDUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRnVuY3Rpb25zIEZJUFNfbW9kZV9zZXQoKSBhbmQgRklQU19tb2RlKCkgd2hpY2ggY2FsbCB0aGUgdW5kZXJseWluZwogICAgIEZJUFMgbW9kdWxlcyB2ZXJzaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgVExTIHYxLjIgY2xpZW50IHNpZGUgc3VwcG9ydCBmb3IgY2xpZW50IGF1dGhlbnRpY2F0aW9uLiBLZWVwIGNhY2hlCiAgICAgb2YgaGFuZHNoYWtlIHJlY29yZHMgbG9uZ2VyIGFzIHdlIGRvbid0IGtub3cgdGhlIGhhc2ggYWxnb3JpdGhtIHRvIHVzZQogICAgIHVudGlsIGFmdGVyIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IG1lc3NhZ2UgaXMgcmVjZWl2ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBUTFMgdjEuMiBjbGllbnQgc3VwcG9ydC4gQWRkIGEgZGVmYXVsdCBzaWduYXR1cmUgYWxnb3JpdGhtcwogICAgIGV4dGVuc2lvbiBpbmNsdWRpbmcgYWxsIHRoZSBhbGdvcml0aG1zIHdlIHN1cHBvcnQuIFBhcnNlIG5ldyBzaWduYXR1cmUKICAgICBmb3JtYXQgaW4gY2xpZW50IGtleSBleGNoYW5nZS4gUmVsYXggc29tZSBFQ0Mgc2lnbmluZyByZXN0cmljdGlvbnMgZm9yCiAgICAgVExTIHYxLjIgYXMgaW5kaWNhdGVkIGluIFJGQzUyNDYuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNlcnZlciBzdXBwb3J0IGZvciBUTFMgdjEuMiBzaWduYXR1cmUgYWxnb3JpdGhtcyBleHRlbnNpb24uIFN3aXRjaAogICAgIHRvIG5ldyBzaWduYXR1cmUgZm9ybWF0IHdoZW4gbmVlZGVkIHVzaW5nIGNsaWVudCBkaWdlc3QgcHJlZmVyZW5jZS4KICAgICBBbGwgc2VydmVyIGNpcGhlcnN1aXRlcyBzaG91bGQgbm93IHdvcmsgY29ycmVjdGx5IGluIFRMUyB2MS4yLiBObyBjbGllbnQKICAgICBzdXBwb3J0IHlldCBhbmQgbm8gc3VwcG9ydCBmb3IgY2xpZW50IGNlcnRpZmljYXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIFRMUyB2MS4yIHN1cHBvcnQuIEFkZCBuZXcgU0hBMjU2IGRpZ2VzdCB0byBzc2wgY29kZSwgc3dpdGNoCiAgICAgdG8gU0hBMjU2IGZvciBQUkYgd2hlbiB1c2luZyBUTFMgdjEuMiBhbmQgbGF0ZXIuIEFkZCBuZXcgU0hBMjU2IGJhc2VkCiAgICAgY2lwaGVyc3VpdGVzLiBBdCBwcmVzZW50IG9ubHkgUlNBIGtleSBleGNoYW5nZSBjaXBoZXJzdWl0ZXMgd29yayB3aXRoCiAgICAgVExTIHYxLjIuIEFkZCBuZXcgb3B0aW9uIGZvciBUTFMgdjEuMiByZXBsYWNpbmcgdGhlIG9sZCBhbmQgb2Jzb2xldGUKICAgICBTU0xfT1BfUEtDUzFfQ0hFQ0sgZmxhZ3Mgd2l0aCBTU0xfT1BfTk9fVExTdjFfMi4gTmV3IFRMU3YxLjIgbWV0aG9kcwogICAgIGFuZCB2ZXJzaW9uIGNoZWNraW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb24gT1BFTlNTTF9OT19TU0xfSU5URVJOLiBJZiBhbiBhcHBsaWNhdGlvbiBjYW4gYmUgY29tcGlsZWQKICAgICB3aXRoIHRoaXMgZGVmaW5lZCBpdCB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBhbnkgY2hhbmdlcyB0byBzc2wgaW50ZXJuYWwKICAgICBzdHJ1Y3R1cmVzLiBBZGQgc2V2ZXJhbCB1dGlsaXR5IGZ1bmN0aW9ucyB0byBhbGxvdyBvcGVuc3NsIGFwcGxpY2F0aW9uCiAgICAgdG8gd29yayB3aXRoIE9QRU5TU0xfTk9fU1NMX0lOVEVSTiBkZWZpbmVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBTUlAgc3VwcG9ydC4KICAgICBbVG9tIFd1IDx0andAY3Muc3RhbmZvcmQuZWR1PiBhbmQgQmVuIExhdXJpZV0KCiAgKikgQWRkIGZ1bmN0aW9ucyB0byBjb3B5IEVWUF9QS0VZX01FVEhPRCBhbmQgcmV0cmlldmUgZmxhZ3MgYW5kIGlkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBlcm1pdCBhYmJyZXZpYXRlZCBoYW5kc2hha2VzIHdoZW4gcmVuZWdvdGlhdGluZyB1c2luZyB0aGUgZnVuY3Rpb24KICAgICBTU0xfcmVuZWdvdGlhdGVfYWJicmV2aWF0ZWQoKS4KICAgICBbUm9iaW4gU2VnZ2VsbWFubiA8c2VnZ2VsbWFubkBmaC1tdWVuc3Rlci5kZT5dCgogICopIEFkZCBjYWxsIHRvIEVOR0lORV9yZWdpc3Rlcl9hbGxfY29tcGxldGUoKSB0bwogICAgIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpLCBzbyBzb21lIGltcGxlbWVudGF0aW9ucyBnZXQgdXNlZAogICAgIGF1dG9tYXRpY2FsbHkgaW5zdGVhZCBvZiBuZWVkaW5nIGV4cGxpY2l0IGFwcGxpY2F0aW9uIHN1cHBvcnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFRMUyBrZXkgZXhwb3J0ZXIgYXMgZGVzY3JpYmVkIGluIFJGQzU3MDUuCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4gPHNlZ2dlbG1hbm5AZmgtbXVlbnN0ZXIuZGU+LCBTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgVExTdjEuMSBzdXBwb3J0LiBTaW5jZSBUTFN2MS4xIGlzIHZlcnkgc2ltaWxhciB0byBUTFMgdjEuMCBvbmx5CiAgICAgYSBmZXcgY2hhbmdlcyBhcmUgcmVxdWlyZWQ6CgogICAgICAgQWRkIFNTTF9PUF9OT19UTFN2MV8xIGZsYWcuCiAgICAgICBBZGQgVExTdjFfMSBtZXRob2RzLgogICAgICAgVXBkYXRlIHZlcnNpb24gY2hlY2tpbmcgbG9naWMgdG8gaGFuZGxlIHZlcnNpb24gMS4xLgogICAgICAgQWRkIGV4cGxpY2l0IElWIGhhbmRsaW5nIChwb3J0ZWQgZnJvbSBEVExTIGNvZGUpLgogICAgICAgQWRkIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIHNfY2xpZW50L3Nfc2VydmVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wZyBhbmQgMS4wLjBoIFsxMiBNYXIgMjAxMl0KCiAgKikgRml4IE1NQSAoQmxlaWNoZW5iYWNoZXIncyBhdHRhY2sgb24gUEtDUyAjMSB2MS41IFJTQSBwYWRkaW5nKSB3ZWFrbmVzcwogICAgIGluIENNUyBhbmQgUEtDUzcgY29kZS4gV2hlbiBSU0EgZGVjcnlwdGlvbiBmYWlscyB1c2UgYSByYW5kb20ga2V5IGZvcgogICAgIGNvbnRlbnQgZGVjcnlwdGlvbiBhbmQgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBlcnJvci4gTm90ZTogdGhpcyBhdHRhY2sKICAgICBuZWVkcyBvbiBhdmVyYWdlIDJeMjAgbWVzc2FnZXMgc28gaXQgb25seSBhZmZlY3RzIGF1dG9tYXRlZCBzZW5kZXJzLiBUaGUKICAgICBvbGQgYmVoYXZpb3VyIGNhbiBiZSByZWVuYWJsZWQgaW4gdGhlIENNUyBjb2RlIGJ5IHNldHRpbmcgdGhlCiAgICAgQ01TX0RFQlVHX0RFQ1JZUFQgZmxhZzogdGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgdGVzdGluZyB3aGVyZQogICAgIGFuIE1NQSBkZWZlbmNlIGlzIG5vdCBuZWNlc3NhcnkuCiAgICAgVGhhbmtzIHRvIEl2YW4gTmVzdGxlcm9kZSA8aW5lc3RsZXJvZGVAdXMuaWJtLmNvbT4gZm9yIGRpc2NvdmVyaW5nCiAgICAgdGhpcyBpc3N1ZS4gKENWRS0yMDEyLTA4ODQpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IENWRS0yMDExLTQ2MTk6IG1ha2Ugc3VyZSB3ZSByZWFsbHkgYXJlIHJlY2VpdmluZyBhIAogICAgIGNsaWVudCBoZWxsbyBiZWZvcmUgcmVqZWN0aW5nIG11bHRpcGxlIFNHQyByZXN0YXJ0cy4gVGhhbmtzIHRvCiAgICAgSXZhbiBOZXN0bGVyb2RlIDxpbmVzdGxlcm9kZUB1cy5pYm0uY29tPiBmb3IgZGlzY292ZXJpbmcgdGhpcyBidWcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBmIGFuZCAxLjAuMGcgWzE4IEphbiAyMDEyXQoKICAqKSBGaXggZm9yIERUTFMgRG9TIGlzc3VlIGludHJvZHVjZWQgYnkgZml4IGZvciBDVkUtMjAxMS00MTA5LgogICAgIFRoYW5rcyB0byBBbnRvbmlvIE1hcnRpbiwgRW50ZXJwcmlzZSBTZWN1cmUgQWNjZXNzIFJlc2VhcmNoIGFuZAogICAgIERldmVsb3BtZW50LCBDaXNjbyBTeXN0ZW1zLCBJbmMuIGZvciBkaXNjb3ZlcmluZyB0aGlzIGJ1ZyBhbmQKICAgICBwcmVwYXJpbmcgYSBmaXguIChDVkUtMjAxMi0wMDUwKQogICAgIFtBbnRvbmlvIE1hcnRpbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBlIGFuZCAxLjAuMGYgWzQgSmFuIDIwMTJdCgogICopIE5hZGhlbSBBbGZhcmRhbiBhbmQgS2VubnkgUGF0ZXJzb24gaGF2ZSBkaXNjb3ZlcmVkIGFuIGV4dGVuc2lvbgogICAgIG9mIHRoZSBWYXVkZW5heSBwYWRkaW5nIG9yYWNsZSBhdHRhY2sgb24gQ0JDIG1vZGUgZW5jcnlwdGlvbgogICAgIHdoaWNoIGVuYWJsZXMgYW4gZWZmaWNpZW50IHBsYWludGV4dCByZWNvdmVyeSBhdHRhY2sgYWdhaW5zdAogICAgIHRoZSBPcGVuU1NMIGltcGxlbWVudGF0aW9uIG9mIERUTFMuIFRoZWlyIGF0dGFjayBleHBsb2l0cyB0aW1pbmcKICAgICBkaWZmZXJlbmNlcyBhcmlzaW5nIGR1cmluZyBkZWNyeXB0aW9uIHByb2Nlc3NpbmcuIEEgcmVzZWFyY2gKICAgICBwYXBlciBkZXNjcmliaW5nIHRoaXMgYXR0YWNrIGNhbiBiZSBmb3VuZCBhdDoKICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5pc2cucmh1bC5hYy51ay9+a3AvZHRscy5wZGYKICAgICBUaGFua3MgZ28gdG8gTmFkaGVtIEFsZmFyZGFuIGFuZCBLZW5ueSBQYXRlcnNvbiBvZiB0aGUgSW5mb3JtYXRpb24KICAgICBTZWN1cml0eSBHcm91cCBhdCBSb3lhbCBIb2xsb3dheSwgVW5pdmVyc2l0eSBvZiBMb25kb24KICAgICAod3d3LmlzZy5yaHVsLmFjLnVrKSBmb3IgZGlzY292ZXJpbmcgdGhpcyBmbGF3IGFuZCB0byBSb2JpbiBTZWdnZWxtYW5uCiAgICAgPHNlZ2dlbG1hbm5AZmgtbXVlbnN0ZXIuZGU+IGFuZCBNaWNoYWVsIFR1ZXhlbiA8dHVleGVuQGZoLW11ZW5zdGVyLmRlPgogICAgIGZvciBwcmVwYXJpbmcgdGhlIGZpeC4gKENWRS0yMDExLTQxMDgpCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4sIE1pY2hhZWwgVHVleGVuXQoKICAqKSBDbGVhciBieXRlcyB1c2VkIGZvciBibG9jayBwYWRkaW5nIG9mIFNTTCAzLjAgcmVjb3Jkcy4KICAgICAoQ1ZFLTIwMTEtNDU3NikKICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBPbmx5IGFsbG93IG9uZSBTR0MgaGFuZHNoYWtlIHJlc3RhcnQgZm9yIFNTTC9UTFMuIFRoYW5rcyB0byBHZW9yZ2UKICAgICBLYWRpYW5ha2lzIDxkZXNuYWNrZWRAZ21haWwuY29tPiBmb3IgZGlzY292ZXJpbmcgdGhpcyBpc3N1ZSBhbmQKICAgICBBZGFtIExhbmdsZXkgZm9yIHByZXBhcmluZyB0aGUgZml4LiAoQ1ZFLTIwMTEtNDYxOSkKICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBDaGVjayBwYXJhbWV0ZXJzIGFyZSBub3QgTlVMTCBpbiBHT1NUIEVOR0lORS4gKENWRS0yMDEyLTAwMjcpCiAgICAgW0FuZHJleSBLdWxpa292IDxhbWRlaWNoQGdtYWlsLmNvbT5dCgogICopIFByZXZlbnQgbWFsZm9ybWVkIFJGQzM3NzkgZGF0YSB0cmlnZ2VyaW5nIGFuIGFzc2VydGlvbiBmYWlsdXJlLgogICAgIFRoYW5rcyB0byBBbmRyZXcgQ2hpLCBCQk4gVGVjaG5vbG9naWVzLCBmb3IgZGlzY292ZXJpbmcgdGhlIGZsYXcKICAgICBhbmQgUm9iIEF1c3RlaW4gPHNyYUBoYWN0cm4ubmV0PiBmb3IgZml4aW5nIGl0LiAoQ1ZFLTIwMTEtNDU3NykKICAgICBbUm9iIEF1c3RlaW4gPHNyYUBoYWN0cm4ubmV0Pl0KCiAgKikgSW1wcm92ZWQgUFJORyBzZWVkaW5nIGZvciBWT1MuCiAgICAgW1BhdWwgR3JlZW4gPFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20+XQoKICAqKSBGaXggc3NsX2NpcGguYyBzZXQtdXAgcmFjZS4KICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBGaXggc3B1cmlvdXMgZmFpbHVyZXMgaW4gZWNkc2F0ZXN0LmMuCiAgICAgW0VtaWxpYSBL5HNwZXIgKEdvb2dsZSldCgogICopIEZpeCB0aGUgQklPX2ZfYnVmZmVyKCkgaW1wbGVtZW50YXRpb24gKHdoaWNoIHdhcyBtaXhpbmcgZGlmZmVyZW50CiAgICAgaW50ZXJwcmV0YXRpb25zIG9mIHRoZSAnLi4uX2xlbicgZmllbGRzKS4KICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBGaXggaGFuZGxpbmcgb2YgQk5fQkxJTkRJTkc6IG5vdyBCTl9CTElORElOR19pbnZlcnRfZXggKHJhdGhlciB0aGFuCiAgICAgQk5fQkxJTkRJTkdfaW52ZXJ0X2V4KSBjYWxscyBCTl9CTElORElOR191cGRhdGUsIGVuc3VyaW5nIHRoYXQgY29uY3VycmVudAogICAgIHRocmVhZHMgd29uJ3QgcmV1c2UgdGhlIHNhbWUgYmxpbmRpbmcgY29lZmZpY2llbnRzLgoKICAgICBUaGlzIGFsc28gYXZvaWRzIHRoZSBuZWVkIHRvIG9idGFpbiB0aGUgQ1JZUFRPX0xPQ0tfUlNBX0JMSU5ESU5HCiAgICAgbG9jayB0byBjYWxsIEJOX0JMSU5ESU5HX2ludmVydF9leCwgYW5kIGF2b2lkcyBvbmUgdXNlIG9mCiAgICAgQk5fQkxJTkRJTkdfdXBkYXRlIGZvciBlYWNoIEJOX0JMSU5ESU5HIHN0cnVjdHVyZSAocHJldmlvdXNseSwKICAgICB0aGUgbGFzdCB1cGRhdGUgYWx3YXlzIHJlbWFpbmVkIHVudXNlZCkuCiAgICAgW0VtaWxpYSBL5HNwZXIgKEdvb2dsZSldCgogICopIEluIHNzbDNfY2xlYXIsIHByZXNlcnZlIHMzLT5pbml0X2V4dHJhIGFsb25nIHdpdGggczMtPnJidWYuCiAgICAgW0JvYiBCdWNraG9seiAoR29vZ2xlKV0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBkIGFuZCAxLjAuMGUgWzYgU2VwIDIwMTFdCgogICopIEZpeCBidWcgd2hlcmUgQ1JMcyB3aXRoIG5leHRVcGRhdGUgaW4gdGhlIHBhc3QgYXJlIHNvbWV0aW1lcyBhY2NlcHRlZAogICAgIGJ5IGluaXRpYWxpc2luZyBYNTA5X1NUT1JFX0NUWCBwcm9wZXJseS4gKENWRS0yMDExLTMyMDcpCiAgICAgW0thc3BhciBCcmFuZCA8b3NzbEB2ZWxveC5jaD5dCgogICopIEZpeCBTU0wgbWVtb3J5IGhhbmRsaW5nIGZvciAoRUMpREggY2lwaGVyc3VpdGVzLCBpbiBwYXJ0aWN1bGFyCiAgICAgZm9yIG11bHRpLXRocmVhZGVkIHVzZSBvZiBFQ0RILiAoQ1ZFLTIwMTEtMzIxMCkKICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBGaXggeDUwOV9uYW1lX2V4X2QyaSBtZW1vcnkgbGVhayBvbiBiYWQgaW5wdXRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlbW92ZSBoYXJkIGNvZGVkIGVjZHNhV2l0aFNIQTEgc2lnbmF0dXJlIHRlc3RzIGluIHNzbCBjb2RlIGFuZCBjaGVjawogICAgIHNpZ25hdHVyZSBwdWJsaWMga2V5IGFsZ29yaXRobSBieSB1c2luZyBPSUQgeHJlZiB1dGlsaXRpZXMgaW5zdGVhZC4KICAgICBCZWZvcmUgdGhpcyB5b3UgY291bGQgb25seSB1c2Ugc29tZSBFQ0MgY2lwaGVyc3VpdGVzIHdpdGggU0hBMSBvbmx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBwcm90ZWN0aW9uIGFnYWluc3QgRUNEU0EgdGltaW5nIGF0dGFja3MgYXMgbWVudGlvbmVkIGluIHRoZSBwYXBlcgogICAgIGJ5IEJpbGx5IEJvYiBCcnVtbGV5IGFuZCBOaWNvbGEgVHV2ZXJpLCBzZWU6CgoJaHR0cDovL2VwcmludC5pYWNyLm9yZy8yMDExLzIzMi5wZGYKCiAgICAgW0JpbGx5IEJvYiBCcnVtbGV5IGFuZCBOaWNvbGEgVHV2ZXJpXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGMgYW5kIDEuMC4wZCBbOCBGZWIgMjAxMV0KCiAgKikgRml4IHBhcnNpbmcgb2YgT0NTUCBzdGFwbGluZyBDbGllbnRIZWxsbyBleHRlbnNpb24uIENWRS0yMDExLTAwMTQKICAgICBbTmVlbCBNZWh0YSwgQWRhbSBMYW5nbGV5LCBCb2RvIE1vZWxsZXIgKEdvb2dsZSldCgogICopIEZpeCBidWcgaW4gc3RyaW5nIHByaW50aW5nIGNvZGU6IGlmICphbnkqIGVzY2FwaW5nIGlzIGVuYWJsZWQgd2UgbXVzdAogICAgIGVzY2FwZSB0aGUgZXNjYXBlIGNoYXJhY3RlciAoYmFja3NsYXNoKSBvciB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcwogICAgIGFtYmlndW91cy4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGIgYW5kIDEuMC4wYyAgWzIgRGVjIDIwMTBdCgogICopIERpc2FibGUgY29kZSB3b3JrYXJvdW5kIGZvciBhbmNpZW50IGFuZCBvYnNvbGV0ZSBOZXRzY2FwZSBicm93c2VycwogICAgIGFuZCBzZXJ2ZXJzOiBhbiBhdHRhY2tlciBjYW4gdXNlIGl0IGluIGEgY2lwaGVyc3VpdGUgZG93bmdyYWRlIGF0dGFjay4KICAgICBUaGFua3MgdG8gTWFydGluIFJleCBmb3IgZGlzY292ZXJpbmcgdGhpcyBidWcuIENWRS0yMDEwLTQxODAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlZCBKLVBBS0UgaW1wbGVtZW50YXRpb24gZXJyb3IsIG9yaWdpbmFsbHkgZGlzY292ZXJlZCBieQogICAgIFNlYmFzdGllbiBNYXJ0aW5pLCBmdXJ0aGVyIGluZm8gYW5kIGNvbmZpcm1hdGlvbiBmcm9tIFN0ZWZhbgogICAgIEFyZW50eiBhbmQgRmVuZyBIYW8uIE5vdGUgdGhhdCB0aGlzIGZpeCBpcyBhIHNlY3VyaXR5IGZpeC4gQ1ZFLTIwMTAtNDI1MgogICAgIFtCZW4gTGF1cmllXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGEgYW5kIDEuMC4wYiAgWzE2IE5vdiAyMDEwXQoKICAqKSBGaXggZXh0ZW5zaW9uIGNvZGUgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdoaWNoIGNhbiByZXN1bHQgaW4gYSBidWZmZXIKICAgICBvdmVycnVuIHZ1bG5lcmFiaWxpdHk6IHJlc3VtZWQgc2Vzc2lvbnMgbXVzdCBub3QgYmUgbW9kaWZpZWQgYXMgdGhleSBjYW4KICAgICBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgdGhyZWFkcy4gQ1ZFLTIwMTAtMzg2NAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBXSU4zMiBidWlsZCBzeXN0ZW0gdG8gY29ycmVjdGx5IGxpbmsgYW4gRU5HSU5FIGRpcmVjdG9yeSBpbnRvCiAgICAgYSBETEwuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wIGFuZCAxLjAuMGEgIFswMSBKdW4gMjAxMF0KCiAgKikgQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGludF9yc2FfdmVyaWZ5IGluIHBrZXlfcnNhX3ZlcmlmeXJlY292ZXIgCiAgICAgKENWRS0yMDEwLTE2MzMpCiAgICAgW1N0ZXZlIEhlbnNvbiwgUGV0ZXItTWljaGFlbCBIYWdlciA8aGFnZXJAZG9ydG11bmQubmV0Pl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhuIGFuZCAxLjAuMCAgWzI5IE1hciAyMDEwXQoKICAqKSBBZGQgIm1pc3NpbmciIGZ1bmN0aW9uIEVWUF9DSVBIRVJfQ1RYX2NvcHkoKS4gVGhpcyBjb3BpZXMgYSBjaXBoZXIKICAgICBjb250ZXh0LiBUaGUgb3BlcmF0aW9uIGNhbiBiZSBjdXN0b21pc2VkIHZpYSB0aGUgY3RybCBtZWNoYW5pc20gaW4KICAgICBjYXNlIEVOR0lORXMgd2FudCB0byBpbmNsdWRlIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUb2xlcmF0ZSB5ZXQgYW5vdGhlciBicm9rZW4gUEtDUyM4IGtleSBmb3JtYXQ6IHByaXZhdGUga2V5IHZhbHVlIG5lZ2F0aXZlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgLXN1YmplY3RfaGFzaF9vbGQgYW5kIC1pc3N1ZXJfaGFzaF9vbGQgb3B0aW9ucyB0byB4NTA5IHV0aWxpdHkgdG8KICAgICBvdXRwdXQgaGFzaGVzIGNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuU1NMLgogICAgIFtXaWxseSBXZWlzeiA8d2Vpc3pAdmNwYy51bml2aWUuYWMuYXQ+XQoKICAqKSBGaXggY29tcHJlc3Npb24gYWxnb3JpdGhtIGhhbmRsaW5nOiBpZiByZXN1bWluZyBhIHNlc3Npb24gdXNlIHRoZQogICAgIGNvbXByZXNzaW9uIGFsZ29yaXRobSBvZiB0aGUgcmVzdW1lZCBzZXNzaW9uIGluc3RlYWQgb2YgZGV0ZXJtaW5pbmcKICAgICBpdCBmcm9tIGNsaWVudCBoZWxsbyBhZ2Fpbi4gRG9uJ3QgYWxsb3cgc2VydmVyIHRvIGNoYW5nZSBhbGdvcml0aG0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGxvYWRfY3JscygpIGZ1bmN0aW9uIHRvIGFwcHMgdGlkeWluZyBsb2FkX2NlcnRzKCkgdG9vLiBBZGQgb3B0aW9uCiAgICAgdG8gdmVyaWZ5IHV0aWxpdHkgdG8gYWxsb3cgYWRkaXRpb25hbCBDUkxzIHRvIGJlIGluY2x1ZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBPQ1NQIHJlcXVlc3QgY29kZSB0byBwZXJtaXQgYWRkaW5nIGN1c3RvbSBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0OgogICAgIHNvbWUgcmVzcG9uZGVycyBuZWVkIHRoaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVGhlIGZ1bmN0aW9uIEVWUF9QS0VZX3NpZ24oKSByZXR1cm5zIDw9MCBvbiBlcnJvcjogY2hlY2sgcmV0dXJuIGNvZGUKICAgICBjb3JyZWN0bHkuCiAgICAgW0p1bGlhIExhd2FsbCA8anVsaWFAZGlrdS5kaz5dCgogICopIFVwZGF0ZSB2ZXJpZnkgY2FsbGJhY2sgY29kZSBpbiBhcHBzL3NfY2IuYyBhbmQgYXBwcy92ZXJpZnkuYywgaXQKICAgICBuZWVkbGVzc2x5IGRlcmVmZXJlbmNlZCBzdHJ1Y3R1cmVzLCB1c2VkIG9ic29sZXRlIGZ1bmN0aW9ucyBhbmQKICAgICBkaWRuJ3QgaGFuZGxlIGFsbCB1cGRhdGVkIHZlcmlmeSBjb2RlcyBjb3JyZWN0bHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGlzYWJsZSBNRDIgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBCSU9fcG9wKCkgYW5kIEJJT19wdXNoKCkgdXNlIHRoZSBjdHJsIGFyZ3VtZW50ICh3aGljaCB3YXMgTlVMTCkgdG8KICAgICBpbmRpY2F0ZSB0aGUgaW5pdGlhbCBCSU8gYmVpbmcgcHVzaGVkIG9yIHBvcHBlZC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZQogICAgIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBCSU8gaXMgdGhlIG9uZSBleHBsaWNpdGx5IGNhbGxlZCBvciBhcyBhIHJlc3VsdAogICAgIG9mIHRoZSBjdHJsIGJlaW5nIHBhc3NlZCBkb3duIHRoZSBjaGFpbi4gRml4IEJJT19wb3AoKSBhbmQgU1NMIEJJT3Mgc28KICAgICBpdCBoYW5kbGVzIHJlZmVyZW5jZSBjb3VudHMgY29ycmVjdGx5IGFuZCBkb2Vzbid0IHplcm8gb3V0IHRoZSBJL08gYmlvCiAgICAgd2hlbiBpdCBpcyBub3QgYmVpbmcgZXhwbGljaXRseSBwb3BwZWQuIFdBUk5JTkc6IGFwcGxpY2F0aW9ucyB3aGljaAogICAgIGluY2x1ZGVkIHdvcmthcm91bmRzIGZvciB0aGUgb2xkIGJ1Z2d5IGJlaGF2aW91ciB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQKICAgICBvciB0aGV5IGNvdWxkIGZyZWUgdXAgYWxyZWFkeSBmcmVlZCBCSU9zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZCB0aGUgdW5pMmFzYy9hc2MydW5pID0+IE9QRU5TU0xfdW5pMmFzYy9PUEVOU1NMX2FzYzJ1bmkKICAgICByZW5hbWluZyB0byBhbGwgcGxhdGZvcm1zICh3aXRoaW4gdGhlIDAuOS44IGJyYW5jaCwgdGhpcyB3YXMKICAgICBkb25lIGNvbmRpdGlvbmFsbHkgb24gTmV0d2FyZSBwbGF0Zm9ybXMgdG8gYXZvaWQgYSBuYW1lIGNsYXNoKS4KICAgICBbR3VlbnRlciA8bGlzdHNAZ2tudy5uZXQ+XQoKICAqKSBBZGQgRUNESEUgYW5kIFBTSyBzdXBwb3J0IHRvIERUTFMuCiAgICAgW01pY2hhZWwgVHVleGVuIDx0dWV4ZW5AZmgtbXVlbnN0ZXIuZGU+XQoKICAqKSBBZGQgQ0hFQ0tFRF9TVEFDS19PRiBtYWNybyB0byBzYWZlc3RhY2suaCwgb3RoZXJ3aXNlIHNhZmVzdGFjayBjYW4ndAogICAgIGJlIHVzZWQgb24gQysrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAibWlzc2luZyIgZnVuY3Rpb24gRVZQX01EX2ZsYWdzKCkgKHdpdGhvdXQgdGhpcyB0aGUgb25seSB3YXkgdG8KICAgICByZXRyaWV2ZSBhIGRpZ2VzdCBmbGFncyBpcyBieSBhY2Nlc3NpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseS4gVXBkYXRlCiAgICAgRVZQX01EX2RvX2FsbCooKSBhbmQgRVZQX0NJUEhFUl9kb19hbGwqKCkgdG8gaW5jbHVkZSB0aGUgbmFtZSBhIGRpZ2VzdAogICAgIG9yIGNpcGhlciBpcyByZWdpc3RlcmVkIGFzIGluIHRoZSAiZnJvbSIgYXJndW1lbnQuIFByaW50IG91dCBhbGwKICAgICByZWdpc3RlcmVkIGRpZ2VzdHMgaW4gdGhlIGRnc3QgdXNhZ2UgbWVzc2FnZSBpbnN0ZWFkIG9mIG1hbnVhbGx5IAogICAgIGF0dGVtcHRpbmcgdG8gd29yayB0aGVtIG91dC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJZiBubyBTU0x2MiBjaXBoZXJzIGFyZSB1c2VkIGRvbid0IHVzZSBhbiBTU0x2MiBjb21wYXRpYmxlIGNsaWVudCBoZWxsbzoKICAgICB0aGlzIGFsbG93cyB0aGUgdXNlIG9mIGNvbXByZXNzaW9uIGFuZCBleHRlbnNpb25zLiBDaGFuZ2UgZGVmYXVsdCBjaXBoZXIKICAgICBzdHJpbmcgdG8gcmVtb3ZlIFNTTHYyIGNpcGhlcnN1aXRlcy4gVGhpcyBlZmZlY3RpdmVseSBhdm9pZHMgYW5jaWVudCBTU0x2MgogICAgIGJ5IGRlZmF1bHQgdW5sZXNzIGFuIGFwcGxpY2F0aW9uIGNpcGhlciBzdHJpbmcgcmVxdWVzdHMgaXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWx0ZXIgbWF0Y2ggY3JpdGVyaWEgaW4gUEtDUzEyX3BhcnNlKCkuIEl0IHVzZWQgdG8gdHJ5IHRvIHVzZSBsb2NhbAogICAgIGtleSBpZHMgdG8gZmluZCBtYXRjaGluZyBjZXJ0aWZpY2F0ZXMgYW5kIGtleXMgYnV0IHNvbWUgUEtDUyMxMiBmaWxlcwogICAgIGRvbid0IGZvbGxvdyB0aGUgKHNvbWV3aGF0IHVud3JpdHRlbikgcnVsZXMgYW5kIHRoaXMgc3RyYXRlZ3kgZmFpbHMuCiAgICAgTm93IGp1c3QgZ2F0aGVyIGFsbCBjZXJ0aWZpY2F0ZXMgdG9nZXRoZXIgYW5kIHRoZSBmaXJzdCBwcml2YXRlIGtleQogICAgIHRoZW4gbG9vayBmb3IgdGhlIGZpcnN0IGNlcnRpZmljYXRlIHRoYXQgbWF0Y2hlcyB0aGUga2V5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgdXNlIG9mIHJlZ2lzdGVyZWQgZGlnZXN0IGFuZCBjaXBoZXIgbmFtZXMgZm9yIGRnc3QgYW5kIGNpcGhlcgogICAgIGNvbW1hbmRzIGluc3RlYWQgb2YgaGF2aW5nIHRvIGFkZCBlYWNoIG9uZSBhcyBhIHNwZWNpYWwgY2FzZS4gU28gbm93CiAgICAgeW91IGNhbiBkbzoKCiAgICAgICAgb3BlbnNzbCBzaGEyNTYgZm9vCgogICAgIGFzIHdlbGwgYXM6CgogICAgICAgIG9wZW5zc2wgZGdzdCAtc2hhMjU2IGZvbwoKICAgICBhbmQgdGhpcyB3b3JrcyBmb3IgRU5HSU5FIGJhc2VkIGFsZ29yaXRobXMgdG9vLgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgR29zdCBFTkdJTkUgdG8gc3VwcG9ydCBwYXJhbWV0ZXIgZmlsZXMuCiAgICAgW1ZpY3RvciBCLiBXYWduZXIgPHZpdHVzQGNyeXB0b2NvbS5ydT5dCgogICopIFN1cHBvcnQgR2VuZXJhbGl6ZWRUaW1lIGluIGNhIHV0aWxpdHkuIAogICAgIFtPbGl2ZXIgTWFydGluIDxvbGl2ZXJAdm9sYXRpbGV2b2lkLm5ldD4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSB0aGUgaGFzaCBmb3JtYXQgdXNlZCBmb3IgY2VydGlmaWNhdGUgZGlyZWN0b3J5IGxpbmtzLiBUaGUgbmV3CiAgICAgZm9ybSB1c2VzIHRoZSBjYW5vbmljYWwgZW5jb2RpbmcgKG1lYW5pbmcgZXF1aXZhbGVudCBuYW1lcyB3aWxsIHdvcmsKICAgICBldmVuIGlmIHRoZXkgYXJlbid0IGlkZW50aWNhbCkgYW5kIHVzZXMgU0hBMSBpbnN0ZWFkIG9mIE1ENS4gVGhpcyBmb3JtCiAgICAgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIG9sZGVyIGZvcm1hdCBhbmQgYXMgYSByZXN1bHQgY19yZWhhc2ggc2hvdWxkCiAgICAgYmUgdXNlZCB0byByZWJ1aWxkIHN5bWJvbGljIGxpbmtzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgUEtDUyM4IHRoZSBkZWZhdWx0IHdyaXRlIGZvcm1hdCBmb3IgcHJpdmF0ZSBrZXlzLCByZXBsYWNpbmcgdGhlCiAgICAgdHJhZGl0aW9uYWwgZm9ybWF0LiBUaGlzIGZvcm0gaXMgc3RhbmRhcmRpc2VkLCBtb3JlIHNlY3VyZSBhbmQgZG9lc24ndAogICAgIGluY2x1ZGUgYW4gaW1wbGljaXQgTUQ1IGRlcGVuZGVuY3kuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgJGdjY19kZXZ0ZWFtX3dhcm4gb3B0aW9uIHRvIENvbmZpZ3VyZS4gVGhlIGlkZWEgaXMgdGhhdCBhbnkgY29kZQogICAgIGNvbW1pdHRlZCB0byBPcGVuU1NMIHNob3VsZCBwYXNzIHRoaXMgbG90IGFzIGEgbWluaW11bS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc2Vzc2lvbiB0aWNrZXQgb3ZlcnJpZGUgZnVuY3Rpb25hbGl0eSBmb3IgdXNlIGJ5IEVBUC1GQVNULgogICAgIFtKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPl0KCiAgKikgTW9kaWZ5IEhNQUMgZnVuY3Rpb25zIHRvIHJldHVybiBhIHZhbHVlLiBTaW5jZSB0aGVzZSBjYW4gYmUgaW1wbGVtZW50ZWQKICAgICBpbiBhbiBFTkdJTkUgZXJyb3JzIGNhbiBvY2N1ci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUeXBlLWNoZWNrZWQgT0JKX2JzZWFyY2hfZXguCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFR5cGUtY2hlY2tlZCBPQkpfYnNlYXJjaC4gQWxzbyBzb21lIGNvbnN0aWZpY2F0aW9uIG5lY2Vzc2l0YXRlZAogICAgIGJ5IHR5cGUtY2hlY2tpbmcuICBTdGlsbCB0byBjb21lOiBUWFRfREIsIGJzZWFyY2goPyksCiAgICAgT0JKX2JzZWFyY2hfZXgsIHFzb3J0LCBDUllQVE9fRVhfREFUQSwgQVNOMV9WQUxVRSwgQVNOMV9TVFJJTkcsCiAgICAgQ09ORl9WQUxVRS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTmV3IGZ1bmN0aW9uIE9QRU5TU0xfZ210aW1lX2FkaigpIHRvIGFkZCBhIHNwZWNpZmljIG51bWJlciBvZiBkYXlzIGFuZAogICAgIHNlY29uZHMgdG8gYSB0bSBzdHJ1Y3R1cmUgZGlyZWN0bHksIGluc3RlYWQgb2YgZ29pbmcgdGhyb3VnaCBPUwogICAgIHNwZWNpZmljIGRhdGUgcm91dGluZXMuIFRoaXMgYXZvaWRzIGFueSBpc3N1ZXMgd2l0aCBPUyByb3V0aW5lcyBzdWNoCiAgICAgYXMgdGhlIHllYXIgMjAzOCBidWcuIE5ldyAqX2FkaigpIGZ1bmN0aW9ucyBmb3IgQVNOMSB0aW1lIHN0cnVjdHVyZXMKICAgICBhbmQgWDUwOV90aW1lX2Fkal9leCgpIHRvIGNvdmVyIHRoZSBleHRlbmRlZCByYW5nZS4gVGhlIGV4aXN0aW5nCiAgICAgWDUwOV90aW1lX2FkaigpIGlzIHN0aWxsIHVzYWJsZSBhbmQgd2lsbCBubyBsb25nZXIgaGF2ZSBhbnkgZGF0ZSBpc3N1ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGVsdGEgQ1JMIHN1cHBvcnQuIE5ldyB1c2UgZGVsdGFzIG9wdGlvbiB3aGljaCB3aWxsIGF0dGVtcHQgdG8gbG9jYXRlCiAgICAgYW5kIHNlYXJjaCBhbnkgYXBwcm9wcmlhdGUgZGVsdGEgQ1JMcyBhdmFpbGFibGUuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBDUkxzIHBhcnRpdGlvbmVkIGJ5IHJlYXNvbiBjb2RlLiBSZW9yZ2FuaXNlIENSTCBwcm9jZXNzaW5nCiAgICAgY29kZSBhbmQgYWRkIGFkZGl0aW9uYWwgc2NvcmUgZWxlbWVudHMuIFZhbGlkYXRlIGFsdGVybmF0ZSBDUkwgcGF0aHMKICAgICBhcyBwYXJ0IG9mIHRoZSBDUkwgY2hlY2tpbmcgYW5kIGluZGljYXRlIGEgbmV3IGVycm9yICJDUkwgcGF0aCB2YWxpZGF0aW9uCiAgICAgZXJyb3IiIGluIHRoaXMgY2FzZS4gQXBwbGljYXRpb25zIHdhbnRpbmcgYWRkaXRpb25hbCBkZXRhaWxzIGNhbiB1c2UKICAgICB0aGUgdmVyaWZ5IGNhbGxiYWNrIGFuZCBjaGVjayB0aGUgbmV3ICJwYXJlbnQiIGZpZWxkLiBJZiB0aGlzIGlzIG5vdAogICAgIE5VTEwgQ1JMIHBhdGggdmFsaWRhdGlvbiBpcyB0YWtpbmcgcGxhY2UuIEV4aXN0aW5nIGFwcGxpY2F0aW9ucyB3b250CiAgICAgc2VlIHRoaXMgYmVjYXVzZSBpdCByZXF1aXJlcyBleHRlbmRlZCBDUkwgc3VwcG9ydCB3aGljaCBpcyBvZmYgYnkKICAgICBkZWZhdWx0LgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgZnJlc2hlc3QgQ1JMIGV4dGVuc2lvbi4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgaW5kaXJlY3QgQ1JMIHN1cHBvcnQuIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBpbiB0aGUgQ1JMcwogICAgIHBhc3NlZCBkaXJlY3RseSBhbmQgbm90IHZpYSBsb29rdXAuIFByb2Nlc3MgY2VydGlmaWNhdGUgaXNzdWVyCiAgICAgQ1JMIGVudHJ5IGV4dGVuc2lvbiBhbmQgbG9va3VwIENSTCBlbnRyaWVzIGJ5IGJvdGhlciBpc3N1ZXIgbmFtZQogICAgIGFuZCBzZXJpYWwgbnVtYmVyLiBDaGVjayBhbmQgcHJvY2VzcyBDUkwgaXNzdWVyIGVudHJ5IGluIElEUCBleHRlbnNpb24uCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgZGlzdGluY3QgY2VydGlmaWNhdGUgYW5kIENSTCBwYXRocy4gVGhlIENSTCBpc3N1ZXIKICAgICBjZXJ0aWZpY2F0ZSBpcyB2YWxpZGF0ZWQgc2VwYXJhdGVseSBpbiB0aGlzIGNhc2UuIE9ubHkgZW5hYmxlZCBpZgogICAgIGFuIGV4dGVuZGVkIENSTCBzdXBwb3J0IGZsYWcgaXMgc2V0OiB0aGlzIGZsYWcgd2lsbCBlbmFibGUgYWRkaXRpb25hbAogICAgIENSTCBmdW5jdGlvbmFsaXR5IGluIGZ1dHVyZS4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBwb2xpY3kgbWFwcGluZ3MgZXh0ZW5zaW9uLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgdG8gcGF0aGxlbmd0aCBjb25zdHJhaW50LCBzZWxmIGlzc3VlZCBjZXJ0aWZpY2F0ZSBoYW5kbGluZywKICAgICBwb2xpY3kgcHJvY2Vzc2luZyB0byBhbGlnbiB3aXRoIFJGQzMyODAgYW5kIFBLSVRTIHRlc3RzLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgbmFtZSBjb25zdHJhaW50cyBjZXJ0aWZpY2F0ZSBleHRlbnNpb24uIEROLCBlbWFpbCwgRE5TCiAgICAgYW5kIFVSSSB0eXBlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRvIGNhdGVyIGZvciBzeXN0ZW1zIHRoYXQgcHJvdmlkZSBhIHBvaW50ZXItYmFzZWQgdGhyZWFkIElEIHJhdGhlcgogICAgIHRoYW4gbnVtZXJpYywgZGVwcmVjYXRlIHRoZSBjdXJyZW50IG51bWVyaWMgdGhyZWFkIElEIG1lY2hhbmlzbSBhbmQKICAgICByZXBsYWNlIGl0IHdpdGggYSBzdHJ1Y3R1cmUgYW5kIGFzc29jaWF0ZWQgY2FsbGJhY2sgdHlwZS4gVGhpcwogICAgIG1lY2hhbmlzbSBhbGxvd3MgYSBudW1lcmljICJoYXNoIiB0byBiZSBleHRyYWN0ZWQgZnJvbSBhIHRocmVhZCBJRCBpbgogICAgIGVpdGhlciBjYXNlLCBhbmQgb24gcGxhdGZvcm1zIHdoZXJlIHBvaW50ZXJzIGFyZSBsYXJnZXIgdGhhbiAnbG9uZycsCiAgICAgbWl4aW5nIGlzIGRvbmUgdG8gaGVscCBlbnN1cmUgdGhlIG51bWVyaWMgJ2hhc2gnIGlzIHVzYWJsZSBldmVuIGlmIGl0CiAgICAgY2FuJ3QgYmUgZ3VhcmFudGVlZCB1bmlxdWUuIFRoZSBkZWZhdWx0IG1lY2hhbmlzbSBpcyB0byB1c2UgIiZlcnJubyIKICAgICBhcyBhIHBvaW50ZXItYmFzZWQgdGhyZWFkIElEIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhyZWFkcy4KCiAgICAgQXBwbGljYXRpb25zIHRoYXQgd2FudCB0byBwcm92aWRlIHRoZWlyIG93biB0aHJlYWQgSURzIHNob3VsZCBub3cgdXNlCiAgICAgQ1JZUFRPX1RIUkVBRElEX3NldF9jYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGNhbGwKICAgICBlaXRoZXIgQ1JZUFRPX1RIUkVBRElEX3NldF9udW1lcmljKCkgb3IgQ1JZUFRPX1RIUkVBRElEX3NldF9wb2ludGVyKCkuCgogICAgIE5vdGUgdGhhdCBFUlJfcmVtb3ZlX3N0YXRlKCkgaXMgbm93IGRlcHJlY2F0ZWQsIGJlY2F1c2UgaXQgaXMgdGllZAogICAgIHRvIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhyZWFkIElEcyBhcmUgbnVtZXJpYy4gIEVSUl9yZW1vdmVfc3RhdGUoMCkKICAgICB0byBmcmVlIHRoZSBjdXJyZW50IHRocmVhZCdzIGVycm9yIHN0YXRlIHNob3VsZCBiZSByZXBsYWNlZCBieQogICAgIEVSUl9yZW1vdmVfdGhyZWFkX3N0YXRlKE5VTEwpLgoKICAgICAoVGhpcyBuZXcgYXBwcm9hY2ggcmVwbGFjZXMgdGhlIGZ1bmN0aW9ucyBDUllQVE9fc2V0X2lkcHRyX2NhbGxiYWNrKCksCiAgICAgQ1JZUFRPX2dldF9pZHB0cl9jYWxsYmFjaygpLCBhbmQgQ1JZUFRPX3RocmVhZF9pZHB0cigpIHRoYXQgZXhpc3RlZCBpbgogICAgIE9wZW5TU0wgMC45LjktZGV2IGJldHdlZW4gSnVuZSAyMDA2IGFuZCBBdWd1c3QgMjAwOC4gQWxzbywgaWYgYW4KICAgICBhcHBsaWNhdGlvbiB3YXMgcHJldmlvdXNseSBwcm92aWRpbmcgYSBudW1lcmljIHRocmVhZCBjYWxsYmFjayB0aGF0CiAgICAgd2FzIGluYXBwcm9wcmlhdGUgZm9yIGRpc3Rpbmd1aXNoaW5nIHRocmVhZHMsIHRoZW4gdW5pcXVlbmVzcyBtaWdodAogICAgIGhhdmUgYmVlbiBvYnRhaW5lZCB3aXRoICZlcnJubyB0aGF0IGhhcHBlbmVkIGltbWVkaWF0ZWx5IGluIHRoZQogICAgIGludGVybWVkaWF0ZSBkZXZlbG9wbWVudCB2ZXJzaW9ucyBvZiBPcGVuU1NMOyB0aGlzIGlzIG5vIGxvbmdlciB0aGUKICAgICBjYXNlLCB0aGUgbnVtZXJpYyB0aHJlYWQgY2FsbGJhY2sgd2lsbCBub3cgb3ZlcnJpZGUgdGhlIGF1dG9tYXRpYyB1c2UKICAgICBvZiAmZXJybm8uKQogICAgIFtHZW9mZiBUaG9ycGUsIHdpdGggaGVscCBmcm9tIEJvZG8gTW9lbGxlcl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgQ1JMIGlzc3VpbmcgY2VydGlmaWNhdGVzLiBUaGlzIGNvdmVycyBhCiAgICAgc2ltcGxlIGNhc2Ugd2hlcmUgdGhlIHNlbGYgaXNzdWVkIGNlcnRpZmljYXRlcyBpbiB0aGUgY2hhaW4gZXhpc3QgYW5kCiAgICAgdGhlIHJlYWwgQ1JMIGlzc3VlciBpcyBoaWdoZXIgaW4gdGhlIGV4aXN0aW5nIGNoYWluLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlZCBlZmZlY3RpdmVseSBkZWZ1bmN0IGNyeXB0by9zdG9yZSBmcm9tIHRoZSBidWlsZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgUmV2YW1wIG9mIFNUQUNLIHRvIHByb3ZpZGUgc3Ryb25nZXIgdHlwZS1jaGVja2luZy4gU3RpbGwgdG8gY29tZToKICAgICBUWFRfREIsIGJzZWFyY2goPyksIE9CSl9ic2VhcmNoLCBxc29ydCwgQ1JZUFRPX0VYX0RBVEEsIEFTTjFfVkFMVUUsCiAgICAgQVNOMV9TVFJJTkcsIENPTkZfVkFMVUUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBhIG5ldyBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMgbW9kZSBmbGFnIHRvIHJlbGVhc2UgdW51c2VkIGJ1ZmZlcgogICAgIFJBTSBvbiBTU0wgY29ubmVjdGlvbnMuICBUaGlzIG9wdGlvbiBjYW4gc2F2ZSBhYm91dCAzNGsgcGVyIGlkbGUgU1NMLgogICAgIFtOaWNrIE1hdGhld3Nvbl0KCiAgKikgUmV2YW1wIG9mIExIQVNIIHRvIHByb3ZpZGUgc3Ryb25nZXIgdHlwZS1jaGVja2luZy4gU3RpbGwgdG8gY29tZToKICAgICBTVEFDSywgVFhUX0RCLCBic2VhcmNoLCBxc29ydC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBDcnlwdG9ncmFwaGljIE1lc3NhZ2UgU3ludGF4IChha2EgQ01TKSBiYXNlZAogICAgIG9uIFJGQzM4NTAsIFJGQzM4NTEgYW5kIFJGQzM4NTIuIE5ldyBjbXMgZGlyZWN0b3J5IGFuZCBjbXMgdXRpbGl0eSwKICAgICBzdXBwb3J0IGZvciBkYXRhLCBzaWduZWREYXRhLCBjb21wcmVzc2VkRGF0YSwgZGlnZXN0ZWREYXRhIGFuZAogICAgIGVuY3J5cHRlZERhdGEsIGVudmVsb3BlZERhdGEgdHlwZXMgaW5jbHVkZWQuIFNjcmlwdHMgdG8gY2hlY2sgYWdhaW5zdAogICAgIFJGQzQxMzQgZXhhbXBsZXMgZHJhZnQgYW5kIGludGVyb3AgYW5kIGNvbnNpc3RlbmN5IGNoZWNrcyBvZiBtYW55CiAgICAgY29udGVudCB0eXBlcyBhbmQgdmFyaWFudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG9wdGlvbnMgdG8gZW5jIHV0aWxpdHkgdG8gc3VwcG9ydCB1c2Ugb2YgemxpYiBjb21wcmVzc2lvbiBCSU8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIG1rMW1mIHRvIHN1cHBvcnQgaW1wb3J0aW5nIG9mIG9wdGlvbnMgYW5kIGFzc2VtYmx5IGxhbmd1YWdlCiAgICAgZmlsZXMgZnJvbSBDb25maWd1cmUgc2NyaXB0LCBjdXJyZW50bHkgb25seSBpbmNsdWRlZCBpbiBWQy1XSU4zMi4KICAgICBUaGUgYXNzZW1ibHkgbGFuZ3VhZ2UgcnVsZXMgY2FuIG5vdyBvcHRpb25hbGx5IGdlbmVyYXRlIHRoZSBzb3VyY2UKICAgICBmaWxlcyBmcm9tIHRoZSBhc3NvY2lhdGVkIHBlcmwgc2NyaXB0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXBsZW1lbnQgcmVtYWluaW5nIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIHRvIHN1cHBvcnQgR09TVCBjaXBoZXJzdWl0ZXMuCiAgICAgSW50ZXJvcCB0ZXN0aW5nIGhhcyBiZWVuIHBlcmZvcm1lZCB1c2luZyBDcnlwdG9Qcm8gaW1wbGVtZW50YXRpb25zLgogICAgIFtWaWN0b3IgQi4gV2FnbmVyIDx2aXR1c0BjcnlwdG9jb20ucnU+XQoKICAqKSBzMzkweCBhc3NlbWJsZXIgcGFjay4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQVJNdjQgYXNzZW1ibGVyIHBhY2suIEFSTXY0IHJlZmVycyB0byB2NCBhbmQgbGF0ZXIgSVNBLCBub3QgQ1BVCiAgICAgImZhbWlseS4iCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEltcGxlbWVudCBPcGFxdWUgUFJGIElucHV0IFRMUyBleHRlbnNpb24gYXMgc3BlY2lmaWVkIGluCiAgICAgZHJhZnQtcmVzY29ybGEtdGxzLW9wYXF1ZS1wcmYtaW5wdXQtMDAudHh0LiAgU2luY2UgdGhpcyBpcyBub3QgYW4KICAgICBvZmZpY2lhbCBzcGVjaWZpY2F0aW9uIHlldCBhbmQgbm8gZXh0ZW5zaW9uIHR5cGUgYXNzaWdubWVudCBieQogICAgIElBTkEgZXhpc3RzLCB0aGlzIGV4dGVuc2lvbiAoZm9yIG5vdykgd2lsbCBoYXZlIHRvIGJlIGV4cGxpY2l0bHkKICAgICBlbmFibGVkIHdoZW4gYnVpbGRpbmcgT3BlblNTTCBieSBwcm92aWRpbmcgdGhlIGV4dGVuc2lvbiBudW1iZXIKICAgICB0byB1c2UuICBGb3IgZXhhbXBsZSwgc3BlY2lmeSBhbiBvcHRpb24KCiAgICAgICAgIC1EVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dD0weDk1MjcKCiAgICAgdG8gdGhlICJjb25maWciIG9yICJDb25maWd1cmUiIHNjcmlwdCB0byBlbmFibGUgdGhlIGV4dGVuc2lvbiwKICAgICBhc3N1bWluZyBleHRlbnNpb24gbnVtYmVyIDB4OTUyNyAod2hpY2ggaXMgYSBjb21wbGV0ZWx5IGFyYml0cmFyeQogICAgIGFuZCB1bm9mZmljaWFsIGFzc2lnbm1lbnQgYmFzZWQgb24gdGhlIE1ENSBoYXNoIG9mIHRoZSBJbnRlcm5ldAogICAgIERyYWZ0KS4gIE5vdGUgdGhhdCBieSBkb2luZyBzbywgeW91IHBvdGVudGlhbGx5IGxvc2UKICAgICBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgVExTIGltcGxlbWVudGF0aW9ucyBzaW5jZSB0aGVzZSBtaWdodAogICAgIGJlIHVzaW5nIHRoZSBzYW1lIGV4dGVuc2lvbiBudW1iZXIgZm9yIG90aGVyIHB1cnBvc2VzLgoKICAgICBTU0xfc2V0X3Rsc2V4dF9vcGFxdWVfcHJmX2lucHV0KHNzbCwgc3JjLCBsZW4pIGlzIHVzZWQgdG8gc2V0IHRoZQogICAgIG9wYXF1ZSBQUkYgaW5wdXQgdmFsdWUgdG8gdXNlIGluIHRoZSBoYW5kc2hha2UuICBUaGlzIHdpbGwgY3JlYXRlCiAgICAgYW4gaW50ZXJhbCBjb3B5IG9mIHRoZSBsZW5ndGgtJ2xlbicgc3RyaW5nIGF0ICdzcmMnLCBhbmQgd2lsbAogICAgIHJldHVybiBub24temVybyBmb3Igc3VjY2Vzcy4KCiAgICAgVG8gZ2V0IG1vcmUgY29udHJvbCBhbmQgZmxleGliaWxpdHksIHByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbgogICAgIGJ5IHVzaW5nCgogICAgICAgICAgU1NMX0NUWF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2soY3R4LCBjYikKICAgICAgICAgIFNTTF9DVFhfc2V0X3Rsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2NhbGxiYWNrX2FyZyhjdHgsIGFyZykKCiAgICAgd2hlcmUKCiAgICAgICAgICBpbnQgKCpjYikoU1NMICosIHZvaWQgKnBlZXJpbnB1dCwgc2l6ZV90IGxlbiwgdm9pZCAqYXJnKTsKICAgICAgICAgIHZvaWQgKmFyZzsKCiAgICAgQ2FsbGJhY2sgZnVuY3Rpb24gJ2NiJyB3aWxsIGJlIGNhbGxlZCBpbiBoYW5kc2hha2VzLCBhbmQgaXMKICAgICBleHBlY3RlZCB0byB1c2UgU1NMX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dCgpIGFzIGFwcHJvcHJpYXRlLgogICAgIEFyZ3VtZW50ICdhcmcnIGlzIGZvciBhcHBsaWNhdGlvbiBwdXJwb3NlcyAodGhlIHZhbHVlIGFzIGdpdmVuIHRvCiAgICAgU1NMX0NUWF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2tfYXJnKCkgd2lsbCBkaXJlY3RseQogICAgIGJlIHByb3ZpZGVkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbikuICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICBoYXMgdG8gcmV0dXJuIG5vbi16ZXJvIHRvIHJlcG9ydCBzdWNjZXNzOiB1c3VhbGx5IDEgdG8gdXNlIG9wYXF1ZQogICAgIFBSRiBpbnB1dCBqdXN0IGlmIHBvc3NpYmxlLCBvciAyIHRvIGVuZm9yY2UgdXNlIG9mIHRoZSBvcGFxdWUgUFJGCiAgICAgaW5wdXQuICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBsaWJyYXJ5IHdpbGwgYWJvcnQgdGhlIGhhbmRzaGFrZQogICAgIGlmIG9wYXF1ZSBQUkYgaW5wdXQgaXMgbm90IHN1Y2Nlc3NmdWxseSBuZWdvdGlhdGVkLgoKICAgICBBcmd1bWVudHMgJ3BlZXJpbnB1dCcgYW5kICdsZW4nIGdpdmVuIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgIHdpbGwgYWx3YXlzIGJlIE5VTEwgYW5kIDAgaW4gdGhlIGNhc2Ugb2YgYSBjbGllbnQuICBBIHNlcnZlciB3aWxsCiAgICAgc2VlIHRoZSBjbGllbnQncyBvcGFxdWUgUFJGIGlucHV0IHRocm91Z2ggdGhlc2UgdmFyaWFibGVzIGlmCiAgICAgYXZhaWxhYmxlIChOVUxMIGFuZCAwIG90aGVyd2lzZSkuICBOb3RlIHRoYXQgaWYgdGhlIHNlcnZlcgogICAgIHByb3ZpZGVzIGFuIG9wYXF1ZSBQUkYgaW5wdXQsIHRoZSBsZW5ndGggbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUKICAgICBsZW5ndGggb2YgdGhlIGNsaWVudCdzIG9wYXF1ZSBQUkYgaW5wdXQuCgogICAgIE5vdGUgdGhhdCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCB3aGVuIGNyZWF0aW5nCiAgICAgYSBuZXcgc2Vzc2lvbiAoc2Vzc2lvbiByZXN1bXB0aW9uIGNhbiByZXN1bWUgd2hhdGV2ZXIgd2FzCiAgICAgcHJldmlvdXNseSBuZWdvdGlhdGVkKSwgYW5kIHdpbGwgbm90IGJlIGNhbGxlZCBpbiBTU0wgMi4wCiAgICAgaGFuZHNoYWtlczsgdGh1cywgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHgsIFNTTF9PUF9OT19TU0x2Mikgb3IKICAgICBTU0xfc2V0X29wdGlvbnMoc3NsLCBTU0xfT1BfTk9fU1NMdjIpIGlzIGVzcGVjaWFsbHkgcmVjb21tZW5kZWQKICAgICBmb3IgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byBlbmZvcmNlIG9wYXF1ZSBQUkYgaW5wdXQuCgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVwZGF0ZSBzc2wgY29kZSB0byBzdXBwb3J0IGRpZ2VzdHMgb3RoZXIgdGhhbiBTSEExK01ENSBmb3IgaGFuZHNoYWtlCiAgICAgTUFDLiAKCiAgICAgW1ZpY3RvciBCLiBXYWduZXIgPHZpdHVzQGNyeXB0b2NvbS5ydT5dCgogICopIEFkZCBSRkM0NTA3IHN1cHBvcnQgdG8gT3BlblNTTC4gVGhpcyBpbmNsdWRlcyB0aGUgY29ycmVjdGlvbnMgaW4KICAgICBSRkM0NTA3YmlzLiBUaGUgZW5jcnlwdGVkIHRpY2tldCBmb3JtYXQgaXMgYW4gZW5jcnlwdGVkIGVuY29kZWQKICAgICBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmUsIHRoYXQgd2F5IG5ldyBzZXNzaW9uIGZlYXR1cmVzIGFyZSBhdXRvbWF0aWNhbGx5CiAgICAgc3VwcG9ydGVkLgoKICAgICBJZiBhIGNsaWVudCBhcHBsaWNhdGlvbiBjYWNoZXMgc2Vzc2lvbiBpbiBhbiBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmUKICAgICBzdXBwb3J0IGlzIHRyYW5zcGFyZW50IGJlY2F1c2UgdGlja2V0cyBhcmUgbm93IHN0b3JlZCBpbiB0aGUgZW5jb2RlZAogICAgIFNTTF9TRVNTSU9OLgogICAgIAogICAgIFRoZSBTU0xfQ1RYIHN0cnVjdHVyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBrZXlzIGZvciB0aWNrZXQKICAgICBwcm90ZWN0aW9uIGluIHNlcnZlcnMgc28gYWdhaW4gc3VwcG9ydCBzaG91bGQgYmUgcG9zc2libGUKICAgICB3aXRoIG5vIGFwcGxpY2F0aW9uIG1vZGlmaWNhdGlvbi4KCiAgICAgSWYgYSBjbGllbnQgb3Igc2VydmVyIHdpc2hlcyB0byBkaXNhYmxlIFJGQzQ1MDcgc3VwcG9ydCB0aGVuIHRoZSBvcHRpb24KICAgICBTU0xfT1BfTk9fVElDS0VUIGNhbiBiZSBzZXQuCgogICAgIEFkZCBhIFRMUyBleHRlbnNpb24gZGVidWdnaW5nIGNhbGxiYWNrIHRvIGFsbG93IHRoZSBjb250ZW50cyBvZiBhbnkgY2xpZW50CiAgICAgb3Igc2VydmVyIGV4dGVuc2lvbnMgdG8gYmUgZXhhbWluZWQuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaW5hbCBjaGFuZ2VzIHRvIGF2b2lkIHVzZSBvZiBwb2ludGVyIHBvaW50ZXIgY2FzdHMgaW4gT3BlblNTTC4KICAgICBPcGVuU1NMIHNob3VsZCBub3cgY29tcGlsZSBjbGVhbmx5IG9uIGdjYyA0LjIKICAgICBbUGV0ZXIgSGFydGxleSA8cGRoQHV0dGVyLmNoYW9zLm9yZy51az4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIFNTTCBsaWJyYXJ5IHRvIHVzZSBuZXcgRVZQX1BLRVkgTUFDIEFQSS4gSW5jbHVkZSBnZW5lcmljIE1BQwogICAgIHN1cHBvcnQgaW5jbHVkaW5nIHN0cmVhbWluZyBNQUMgc3VwcG9ydDogdGhpcyBpcyByZXF1aXJlZCBmb3IgR09TVAogICAgIGNpcGhlcnN1aXRlIHN1cHBvcnQuCiAgICAgW1ZpY3RvciBCLiBXYWduZXIgPHZpdHVzQGNyeXB0b2NvbS5ydT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG9wdGlvbiAtc3RyZWFtIHRvIHVzZSBQS0NTIzcgc3RyZWFtaW5nIGluIHNtaW1lIHV0aWxpdHkuIE5ldwogICAgIGZ1bmN0aW9uIGkyZF9QS0NTN19iaW9fc3RyZWFtKCkgYW5kIFBFTV93cml0ZV9QS0NTN19iaW9fc3RyZWFtKCkKICAgICB0byBvdXRwdXQgaW4gQkVSIGFuZCBQRU0gZm9ybWF0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB1c2Ugb2YgSE1BQyB2aWEgRVZQX1BLRVkgaW50ZXJmYWNlLiBUaGlzCiAgICAgYWxsb3dzIEhNQUMgdG8gYmUgaGFuZGxlZCB2aWEgdGhlIEVWUF9EaWdlc3RTaWduKigpIGludGVyZmFjZS4gVGhlCiAgICAgRVZQX1BLRVkgImtleSIgaW4gdGhpcyBjYXNlIGlzIHRoZSBITUFDIGtleSwgcG90ZW50aWFsbHkgYWxsb3dpbmcKICAgICBFTkdJTkUgc3VwcG9ydCBmb3IgSE1BQyBrZXlzIHdoaWNoIGFyZSB1bmV4dHJhY3RhYmxlLiBOZXcgLW1hYyBhbmQKICAgICAtbWFjb3B0IG9wdGlvbnMgdG8gZGdzdCB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb24gLXNpZ29wdCB0byBkZ3N0IHV0aWxpdHkuIFVwZGF0ZSBkZ3N0IHRvIHVzZQogICAgIEVWUF9EaWdlc3R7U2lnbixWZXJpZnl9Ki4gVGhlc2UgdHdvIGNoYW5nZXMgbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UKICAgICBhbHRlcm5hdGl2ZSBzaWduaW5nIHBhcmFtYXRlcnMgc3VjaCBhcyBYOS4zMSBvciBQU1MgaW4gdGhlIGRnc3QgCiAgICAgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2Ugc3NsX2NpcGhlcl9hcHBseV9ydWxlKCksIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiB0aGF0IGRvZXMKICAgICB0aGUgd29yayBlYWNoIHRpbWUgYSBjaXBoZXJzdWl0ZSBzdHJpbmcgcmVxdWVzdHMgZW5hYmxpbmcKICAgICAoImZvbytiYXIiKSwgbW92aW5nICgiK2ZvbytiYXIiKSwgZGlzYWJsaW5nICgiLWZvbytiYXIiLCBvcgogICAgIHJlbW92aW5nICgiIWZvbytiYXIiKSBhIGNsYXNzIG9mIGNpcGhlcnN1aXRlczogTm93IGl0IG1haW50YWlucwogICAgIHRoZSBvcmRlciBvZiBkaXNhYmxlZCBjaXBoZXJzdWl0ZXMgc3VjaCB0aGF0IHRob3NlIGNpcGhlcnN1aXRlcwogICAgIHRoYXQgbW9zdCByZWNlbnRseSB3ZW50IGZyb20gZW5hYmxlZCB0byBkaXNhYmxlZCBub3Qgb25seSBzdGF5CiAgICAgaW4gb3JkZXIgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIsIGJ1dCBhbHNvIGhhdmUgaGlnaGVyIHByaW9yaXR5CiAgICAgdGhhbiBvdGhlciBkaXNhYmxlZCBjaXBoZXJzdWl0ZXMgdGhlIG5leHQgdGltZSBjaXBoZXJzdWl0ZXMgYXJlCiAgICAgZW5hYmxlZCBhZ2Fpbi4KCiAgICAgVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gbm93IHNheSwgZS5nLiwgIlBTSzotUFNLOkhJR0giIHRvIGVuYWJsZQogICAgIHRoZSBzYW1lIGNpcGhlcnN1aXRlcyBhcyB3aXRoICJISUdIIiBhbG9uZSwgYnV0IGluIGEgc3BlY2lmaWMKICAgICBvcmRlciB3aGVyZSB0aGUgUFNLIGNpcGhlcnN1aXRlcyBjb21lIGZpcnN0IChzaW5jZSB0aGV5IGFyZSB0aGUKICAgICBtb3N0IHJlY2VudGx5IGRpc2FibGVkIGNpcGhlcnN1aXRlcyB3aGVuICJISUdIIiBpcyBwYXJzZWQpLgoKICAgICBBbHNvLCBjaGFuZ2Ugc3NsX2NyZWF0ZV9jaXBoZXJfbGlzdCgpICh1c2luZyB0aGlzIG5ldwogICAgIGZ1bmNpb25hbGl0eSkgc3VjaCB0aGF0IGJldHdlZW4gb3RoZXJ3aXNlIGlkZW50aWNhbAogICAgIGNpaHBlcnN1aXRlcywgZXBoZW1lcmFsIEVDREggaXMgcHJlZmVycmVkIG92ZXIgZXBoZW1lcmFsIERIIGluCiAgICAgdGhlIGRlZmF1bHQgb3JkZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHNzbF9jcmVhdGVfY2lwaGVyX2xpc3QoKSBzbyB0aGF0IGl0IGF1dG9tYXRpY2FsbHkKICAgICBhcnJhbmdlcyB0aGUgY2lwaGVyc3VpdGVzIGluIHJlYXNvbmFibGUgb3JkZXIgYmVmb3JlIHN0YXJ0aW5nCiAgICAgdG8gcHJvY2VzcyB0aGUgcnVsZSBzdHJpbmcuICBUaHVzLCB0aGUgZGVmaW5pdGlvbiBmb3IgIkRFRkFVTFQiCiAgICAgKFNTTF9ERUZBVUxUX0NJUEhFUl9MSVNUKSBub3cgaXMganVzdCAiQUxMOiFhTlVMTDohZU5VTEwiLCBidXQKICAgICByZW1haW5zIGVxdWl2YWxlbnQgdG8gIkFFUzpBTEw6IWFOVUxMOiFlTlVMTDorYUVDREg6K2tSU0E6K1JDNDpAU1RSRU5HVEgiLgogICAgIFRoaXMgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gYXJyaXZlIGF0IGEgcmVhc29uYWJsZSBkZWZhdWx0IG9yZGVyCiAgICAgaW4gYXBwbGljYXRpb25zIGZvciB3aGljaCBhbm9ueW1vdXMgY2lwaGVycyBhcmUgT0sgKG1lYW5pbmcKICAgICB0aGF0IHlvdSBjYW4ndCBhY3R1YWxseSB1c2UgREVGQVVMVCkuCiAgICAgW0JvZG8gTW9lbGxlcjsgc3VnZ2VzdGVkIGJ5IFZpY3RvciBEdWNob3ZuaV0KCiAgKikgU3BsaXQgdGhlIFNTTC9UTFMgYWxnb3JpdGhtIG1hc2sgKGFzIHVzZWQgZm9yIGNpcGhlcnN1aXRlIHN0cmluZwogICAgIHByb2Nlc3NpbmcpIGludG8gbXVsdGlwbGUgaW50ZWdlcnMgaW5zdGVhZCBvZiBzZXR0aW5nCiAgICAgIlNTTF9NS0VZX01BU0siIGJpdHMsICJTU0xfQVVUSF9NQVNLIiBiaXRzLCAiU1NMX0VOQ19NQVNLIiwKICAgICAiU1NMX01BQ19NQVNLIiwgYW5kICJTU0xfU1NMX01BU0siIGJpdHMgYWxsIGluIGEgc2luZ2xlIGludGVnZXIuCiAgICAgKFRoZXNlIG1hc2tzIGFzIHdlbGwgYXMgdGhlIGluZGl2aWR1YWwgYml0IGRlZmluaXRpb25zIGFyZSBoaWRkZW4KICAgICBhd2F5IGludG8gdGhlIG5vbi1leHBvcnRlZCBpbnRlcmZhY2Ugc3NsL3NzbF9sb2NsLmgsIHNvIHRoaXMKICAgICBjaGFuZ2UgdG8gdGhlIGRlZmluaXRpb24gb2YgdGhlIFNTTF9DSVBIRVIgc3RydWN0dXJlIHNob3VsZG4ndAogICAgIGFmZmVjdCBhcHBsaWNhdGlvbnMuKSAgVGhpcyBnaXZlIHVzIG1vcmUgYml0cyBmb3IgZWFjaCBvZiB0aGVzZQogICAgIGNhdGVnb3JpZXMsIHNvIHRoZXJlIGlzIG5vIGxvbmdlciBhIG5lZWQgdG8gY29hZ3VsYXRlIEFFUzEyOCBhbmQKICAgICBBRVMyNTYgaW50byBhIHNpbmdsZSBhbGdvcml0aG0gYml0LCBhbmQgdG8gY29hZ3VsYXRlIENhbWVsbGlhMTI4CiAgICAgYW5kIENhbWVsbGlhMjU2IGludG8gYSBzaW5nbGUgYWxnb3JpdGhtIGJpdCwgd2hpY2ggaGFzIGxlZCB0byBhbGwKICAgICBraW5kcyBvZiBrbHVkZ2VzLgoKICAgICBUaHVzLCBhbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBrbHVkZ2UgaW50cm9kdWNlZCBpbiAwLjkuN20gYW5kCiAgICAgMC45LjhlIGZvciBtYXNraW5nIG91dCBBRVMyNTYgaW5kZXBlbmRlbnRseSBvZiBBRVMxMjggb3IgbWFza2luZwogICAgIG91dCBDYW1lbGxpYTI1NiBpbmRlcGVuZGVudGx5IG9mIEFFUzI1NiBpcyBub3QgbmVlZGVkIGhlcmUgaW4gMC45LjkuCgogICAgIFdpdGggdGhlIGNoYW5nZSwgd2UgYWxzbyBpbnRyb2R1Y2UgbmV3IGNpcGhlcnN1aXRlIGFsaWFzZXMgdGhhdAogICAgIHNvIGZhciB3ZXJlIG1pc3Npbmc6ICJBRVMxMjgiLCAiQUVTMjU2IiwgIkNBTUVMTElBMTI4IiwgYW5kCiAgICAgIkNBTUVMTElBMjU2Ii4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgZHNhLXdpdGgtU0hBMjI0IGFuZCBkc2Etd2l0aC1TSEEyNTYuCiAgICAgVXNlIHRoZSBsZWZ0bW9zdCBOIGJ5dGVzIG9mIHRoZSBzaWduYXR1cmUgaW5wdXQgaWYgdGhlIGlucHV0IGlzCiAgICAgbGFyZ2VyIHRoYW4gdGhlIHByaW1lIHEgKHdpdGggTiBiZWluZyB0aGUgc2l6ZSBpbiBieXRlcyBvZiBxKS4KICAgICBbTmlscyBMYXJzY2hdCgogICopIFZlcnkgKnZlcnkqIGV4cGVyaW1lbnRhbCBQS0NTIzcgc3RyZWFtaW5nIGVuY29kZXIgc3VwcG9ydC4gTm90aGluZyB1c2VzCiAgICAgaXQgeWV0IGFuZCBpdCBpcyBsYXJnZWx5IHVudGVzdGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgZWNkc2Etd2l0aC1TSEEyMjQvMjU2LzM4NC81MTIgc2lnbmF0dXJlIHR5cGVzLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgSW5pdGlhbCBpbmNvbXBsZXRlIGNoYW5nZXMgdG8gYXZvaWQgbmVlZCBmb3IgZnVuY3Rpb24gY2FzdHMgaW4gT3BlblNTTAogICAgIHNvbWUgY29tcGlsZXJzIChnY2MgNC4yIGFuZCBsYXRlcikgcmVqZWN0IHRoZWlyIHVzZS4gU2FmZXN0YWNrIGlzCiAgICAgcmVpbXBsZW1lbnRlZC4gIFVwZGF0ZSBBU04xIHRvIGF2b2lkIHVzZSBvZiBsZWdhY3kgZnVuY3Rpb25zLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBXaW4zMi82NCB0YXJnZXRzIGFyZSBsaW5rZWQgd2l0aCBXaW5zb2NrMi4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIGFuIFg1MDlfQ1JMX01FVEhPRCBzdHJ1Y3R1cmUgdG8gYWxsb3cgQ1JMIHByb2Nlc3NpbmcgdG8gYmUgcmVkaXJlY3RlZAogICAgIHRvIGV4dGVybmFsIGZ1bmN0aW9ucy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpbmNyZWFzZSBDUkwgaGFuZGxpbmcgCiAgICAgZWZmaWNpZW5jeSBlc3BlY2lhbGx5IHdoZW4gQ1JMcyBhcmUgdmVyeSBsYXJnZSBieSAoZm9yIGV4YW1wbGUpIHN0b3JpbmcKICAgICB0aGUgQ1JMIHJldm9rZWQgY2VydGlmaWNhdGVzIGluIGEgZGF0YWJhc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgT3ZlcmhhdWwgb2YgYnlfZGlyIGNvZGUuIEFkZCBzdXBwb3J0IGZvciBkeW5hbWljIGxvYWRpbmcgb2YgQ1JMcyBzbwogICAgIG5ldyBDUkxzIGFkZGVkIHRvIGEgZGlyZWN0b3J5IGNhbiBiZSB1c2VkLiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbgogICAgIC12ZXJpZnlfcmV0dXJuX2Vycm9yIHRvIHNfY2xpZW50IGFuZCBzX3NlcnZlci4gVGhpcyBjYXVzZXMgcmVhbCBlcnJvcnMKICAgICB0byBiZSByZXR1cm5lZCBieSB0aGUgdmVyaWZ5IGNhbGxiYWNrIGluc3RlYWQgb2YgY2Fycnlpbmcgb24gbm8gbWF0dGVyCiAgICAgd2hhdC4gVGhpcyByZWZsZWN0cyB0aGUgd2F5IGEgInJlYWwgd29ybGQiIHZlcmlmeSBjYWxsYmFjayB3b3VsZCBiZWhhdmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgR09TVCBlbmdpbmUsIHN1cHBvcnRpbmcgc2V2ZXJhbCBHT1NUIGFsZ29yaXRobXMgYW5kIHB1YmxpYyBrZXkgZm9ybWF0cy4KICAgICBLaW5kbHkgZG9uYXRlZCBieSBDcnlwdG9jb20uCiAgICAgW0NyeXB0b2NvbV0KCiAgKikgUGFydGlhbCBzdXBwb3J0IGZvciBJc3N1aW5nIERpc3RyaWJ1dGlvbiBQb2ludCBDUkwgZXh0ZW5zaW9uLiBDUkxzCiAgICAgcGFydGl0aW9uZWQgYnkgRFAgYXJlIGhhbmRsZWQgYnV0IG5vIGluZGlyZWN0IENSTCBvciByZWFzb24gcGFydGl0aW9uaW5nCiAgICAgKHlldCkuIENvbXBsZXRlIG92ZXJoYXVsIG9mIENSTCBoYW5kbGluZzogbm93IHRoZSBtb3N0IHN1aXRhYmxlIENSTCBpcwogICAgIHNlbGVjdGVkIHZpYSBhIHNjb3JpbmcgdGVjaG5pcXVlIHdoaWNoIGhhbmRsZXMgSURQIGFuZCBBS0lEIGluIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IFg1MDlfU1RPUkVfQ1RYIGNhbGxiYWNrcyBsb29rdXBfY3JscygpIGFuZCBsb29rdXBfY2VydHMoKSB3aGljaAogICAgIHdpbGwgdWx0aW1hdGVseSBiZSB1c2VkIGZvciBhbGwgdmVyaWZ5IG9wZXJhdGlvbnM6IHRoaXMgd2lsbCByZW1vdmUgdGhlCiAgICAgWDUwOV9TVE9SRSBkZXBlbmRlbmN5IG9uIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhbmQgYWxsb3cgYWx0ZXJuYXRpdmUKICAgICBsb29rdXAgbWV0aG9kcy4gIFg1MDlfU1RPUkUgYmFzZWQgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIHR3byBjYWxsYmFja3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgbXVsdGlwbGUgQ1JMcyB0byBleGlzdCBpbiBhbiBYNTA5X1NUT1JFIHdpdGggbWF0Y2hpbmcgaXNzdWVyIG5hbWVzLgogICAgIE1vZGlmeSBnZXRfY3JsKCkgdG8gZmluZCBhIHZhbGlkICh1bmV4cGlyZWQpIENSTCBpZiBwb3NzaWJsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOV9DUkxfbWF0Y2goKSB0byBjaGVjayBpZiB0d28gQ1JMcyBhcmUgaWRlbnRpY2FsLiBOb3JtYWxseQogICAgIHRoaXMgd291bGQgYmUgY2FsbGVkIFg1MDlfQ1JMX2NtcCgpIGJ1dCB0aGF0IG5hbWUgaXMgYWxyZWFkeSB1c2VkIGJ5CiAgICAgYSBmdW5jdGlvbiB0aGF0IGp1c3QgY29tcGFyZXMgQ1JMIGlzc3VlciBuYW1lcy4gQ2FjaGUgc2V2ZXJhbCBDUkwgCiAgICAgZXh0ZW5zaW9ucyBpbiBYNTA5X0NSTCBzdHJ1Y3R1cmUgYW5kIGNhY2hlIENSTERQIGluIFg1MDkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3RvcmUgYSAiY2Fub25pY2FsIiByZXByZXNlbnRhdGlvbiBvZiBYNTA5X05BTUUgc3RydWN0dXJlIChBU04xIE5hbWUpCiAgICAgdGhpcyBtYXBzIGVxdWl2YWxlbnQgWDUwOV9OQU1FIHN0cnVjdHVyZXMgaW50byBhIGNvbnNpc3RlbnQgc3RydWN0dXJlLgogICAgIE5hbWUgY29tcGFyaXNvbiBjYW4gdGhlbiBiZSBwZXJmb3JtZWQgcmFwaWRseSB1c2luZyBtZW1jbXAoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOb24tYmxvY2tpbmcgT0NTUCByZXF1ZXN0IHByb2Nlc3NpbmcuIEFkZCAtdGltZW91dCBvcHRpb24gdG8gb2NzcCAKICAgICB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IGRpZ2VzdHMgdG8gc3VwcGx5IHRoZWlyIG93biBtaWNhbGcgc3RyaW5nIGZvciBTL01JTUUgdHlwZSB1c2luZwogICAgIHRoZSBjdHJsIEVWUF9NRF9DVFJMX01JQ0FMRy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEdXJpbmcgUEtDUzcgc2lnbmluZyBwYXNzIHRoZSBQS0NTNyBTaWduZXJJbmZvIHN0cnVjdHVyZSB0byB0aGUKICAgICBFVlBfUEtFWV9NRVRIT0QgYmVmb3JlIGFuZCBhZnRlciBzaWduaW5nIHZpYSB0aGUgRVZQX1BLRVlfQ1RSTF9QS0NTN19TSUdOCiAgICAgY3RybC4gSXQgY2FuIHRoZW4gY3VzdG9taXNlIHRoZSBzdHJ1Y3R1cmUgYmVmb3JlIGFuZC9vciBhZnRlciBzaWduaW5nCiAgICAgaWYgbmVjZXNzYXJ5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBPQkpfYWRkX3NpZ2lkKCkgdG8gYWxsb3cgYXBwbGljYXRpb24gZGVmaW5lZCBzaWduYXR1cmUgT0lEcwogICAgIHRvIGJlIGFkZGVkIHRvIE9wZW5TU0xzIGludGVybmFsIHRhYmxlcy4gTmV3IGZ1bmN0aW9uIE9CSl9zaWdpZF9mcmVlKCkKICAgICB0byBmcmVlIHVwIGFueSBhZGRlZCBzaWduYXR1cmUgT0lEcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIEVWUF9DSVBIRVJfZG9fYWxsKCksIEVWUF9DSVBIRVJfZG9fYWxsX3NvcnRlZCgpLAogICAgIEVWUF9NRF9kb19hbGwoKSBhbmQgRVZQX01EX2RvX2FsbF9zb3J0ZWQoKSB0byBlbnVtZXJhdGUgaW50ZXJuYWwKICAgICBkaWdlc3QgYW5kIGNpcGhlciB0YWJsZXMuIE5ldyBvcHRpb25zIGFkZGVkIHRvIG9wZW5zc2wgdXRpbGl0eToKICAgICBsaXN0LW1lc3NhZ2UtZGlnZXN0LWFsZ29yaXRobXMgYW5kIGxpc3QtY2lwaGVyLWFsZ29yaXRobXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiBvZiBiaW5hcnkgcG9seW5vbWlhbHM6IHRoZSBsaXN0CiAgICAgb2YgZGVncmVlcyBvZiBub24temVybyBjb2VmZmljaWVudHMgaXMgbm93IHRlcm1pbmF0ZWQgd2l0aCAtMS4KICAgICBQcmV2aW91c2x5IGl0IHdhcyB0ZXJtaW5hdGVkIHdpdGggMCwgd2hpY2ggd2FzIGFsc28gcGFydCBvZiB0aGUKICAgICB2YWx1ZTsgdGh1cywgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIHdhcyBub3QgYXBwbGljYWJsZSB0bwogICAgIHBvbHlub21pYWxzIHdoZXJlIHReMCBoYXMgY29lZmZpY2llbnQgemVyby4gIFRoaXMgY2hhbmdlIG1ha2VzCiAgICAgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIHVzZWZ1bCBpbiBhIG1vcmUgZ2VuZXJhbCBjb250ZXh0LgogICAgIFtEb3VnbGFzIFN0ZWJpbGFdCgogICopIFZhcmlvdXMgbW9kaWZpY2F0aW9ucyBhbmQgZml4ZXMgdG8gU1NML1RMUyBjaXBoZXIgc3RyaW5nCiAgICAgaGFuZGxpbmcuICBGb3IgRUNDLCB0aGUgY29kZSBub3cgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGZpeGVkIEVDREgKICAgICB3aXRoIFJTQSBjZXJ0aWZpY2F0ZXMgb24gdGhlIG9uZSBoYW5kIGFuZCB3aXRoIEVDRFNBIGNlcnRpZmljYXRlcwogICAgIG9uIHRoZSBvdGhlciBoYW5kLCBzaW5jZSB0aGVzZSBhcmUgc2VwYXJhdGUgY2lwaGVyc3VpdGVzLiAgVGhlCiAgICAgdW51c2VkIGNvZGUgZm9yIEZvcnRlenphIGNpcGhlcnN1aXRlcyBoYXMgYmVlbiByZW1vdmVkLgoKICAgICBGb3IgY29uc2lzdGVuY3kgd2l0aCBFREgsIGVwaGVtZXJhbCBFQ0RIIGlzIG5vdyBjYWxsZWQgIkVFQ0RIIgogICAgIChub3QgIkVDREhFIikuICBGb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgY29kZSBmb3IgREgKICAgICBjZXJ0aWZpY2F0ZXMsIHVzZSBvZiBFQ0RIIGNlcnRpZmljYXRlcyBpcyBub3cgY29uc2lkZXJlZCBFQ0RICiAgICAgYXV0aGVudGljYXRpb24sIG5vdCBSU0Egb3IgRUNEU0EgYXV0aGVudGljYXRpb24gKHRoZSBsYXR0ZXIgaXMKICAgICBtZXJlbHkgdGhlIENBJ3Mgc2lnbmluZyBhbGdvcml0aG0gYW5kIG5vdCBhY3RpdmVseSB1c2VkIGluIHRoZQogICAgIHByb3RvY29sKS4KCiAgICAgVGhlIHRlbXBvcmFyeSBjaXBoZXJzdWl0ZSBhbGlhcyAiRUNDZHJhZnQiIGlzIG5vIGxvbmdlcgogICAgIGF2YWlsYWJsZSwgYW5kIEVDQyBjaXBoZXJzdWl0ZXMgYXJlIG5vIGxvbmdlciBleGNsdWRlZCBmcm9tICJBTEwiCiAgICAgYW5kICJERUZBVUxUIi4gIFRoZSBmb2xsb3dpbmcgYWxpYXNlcyBub3cgZXhpc3QgZm9yIFJGQyA0NDkyCiAgICAgY2lwaGVyc3VpdGVzLCBtb3N0IG9mIHRoZXNlIGJ5IGFuYWxvZ3kgd2l0aCB0aGUgREggY2FzZToKCiAgICAgICAgIGtFQ0RIciAgIC0gRUNESCBjZXJ0LCBzaWduZWQgd2l0aCBSU0EKICAgICAgICAga0VDREhlICAgLSBFQ0RIIGNlcnQsIHNpZ25lZCB3aXRoIEVDRFNBCiAgICAgICAgIGtFQ0RIICAgIC0gRUNESCBjZXJ0IChzaWduZWQgd2l0aCBlaXRoZXIgUlNBIG9yIEVDRFNBKQogICAgICAgICBrRUVDREggICAtIGVwaGVtZXJhbCBFQ0RICiAgICAgICAgIEVDREggICAgIC0gRUNESCBjZXJ0IG9yIGVwaGVtZXJhbCBFQ0RICgogICAgICAgICBhRUNESCAgICAtIEVDREggY2VydAogICAgICAgICBhRUNEU0EgICAtIEVDRFNBIGNlcnQKICAgICAgICAgRUNEU0EgICAgLSBFQ0RTQSBjZXJ0CgogICAgICAgICBBRUNESCAgICAtIGFub255bW91cyBFQ0RICiAgICAgICAgIEVFQ0RIICAgIC0gbm9uLWFub255bW91cyBlcGhlbWVyYWwgRUNESCAoZXF1aXZhbGVudCB0byAia0VFQ0RIOi1BRUNESCIpCgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBhZGRpdGlvbmFsIFMvTUlNRSBjYXBhYmlsaXRpZXMgZm9yIEFFUyBhbmQgR09TVCBjaXBoZXJzIGlmIHN1cHBvcnRlZC4KICAgICBVc2UgY29ycmVjdCBtaWNhbGcgcGFyYW1ldGVycyBkZXBlbmRpbmcgb24gZGlnZXN0KHMpIGluIHNpZ25lZCBtZXNzYWdlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBlbmdpbmUgc3VwcG9ydCBmb3IgRVZQX1BLRVlfQVNOMV9NRVRIT0QuIEFkZCBmdW5jdGlvbnMgdG8gcHJvY2VzcwogICAgIGFuIEVOR0lORSBhc24xIG1ldGhvZC4gU3VwcG9ydCBFTkdJTkUgbG9va3VwcyBpbiB0aGUgQVNOMSBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgZW5naW5lIHN1cHBvcnQgZm9yIEVWUF9QS0VZX01FVEhPRC4gTmV3IGZ1bmN0aW9ucyB0byBwZXJtaXQKICAgICBhbiBlbmdpbmUgdG8gcmVnaXN0ZXIgYSBtZXRob2QuIEFkZCBFTkdJTkUgbG9va3VwcyBmb3IgbWV0aG9kcyBhbmQKICAgICBmdW5jdGlvbmFsIHJlZmVyZW5jZSBwcm9jZXNzaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgRVZQX0RpZ2VzdHtTaWduLFZlcmlmeSkqLiBUaGVzZSBhcmUgZW5jaGFuY2UgdmVyc2lvbnMgb2YKICAgICBFVlBfe1NpZ24sVmVyaWZ5fSogd2hpY2ggYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gY3VzdG9taXNlIHRoZSBzaWduYXR1cmUKICAgICBwcm9jZXNzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAtcmVzaWduIG9wdGlvbiB0byBzbWltZSB1dGlsaXR5LiBUaGlzIGFkZHMgb25lIG9yIG1vcmUgc2lnbmVycwogICAgIHRvIGFuIGV4aXN0aW5nIFBLQ1MjNyBzaWduZWREYXRhIHN0cnVjdHVyZS4gQWxzbyAtbWQgb3B0aW9uIHRvIHVzZSBhbgogICAgIGFsdGVybmF0aXZlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSBmb3Igc2lnbmluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUaWR5IHVwIFBLQ1MjNyByb3V0aW5lcyBhbmQgYWRkIG5ldyBmdW5jdGlvbnMgdG8gbWFrZSBpdCBlYXNpZXIgdG8KICAgICBjcmVhdGUgUEtDUzcgc3RydWN0dXJlcyBjb250YWluaW5nIG11bHRpcGxlIHNpZ25lcnMuIFVwZGF0ZSBzbWltZQogICAgIGFwcGxpY2F0aW9uIHRvIHN1cHBvcnQgbXVsdGlwbGUgc2lnbmVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgLW1hY2FsZyBvcHRpb24gdG8gcGtjczEyIHV0aWxpdHkgdG8gYWxsb3cgc2V0dGluZyBvZiBhbiBhbHRlcm5hdGl2ZQogICAgIGRpZ2VzdCBNQUMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBQS0NTIzUgdjIuMCBQUkZzIG90aGVyIHRoYW4gZGVmYXVsdCBTSEExIEhNQUMuCiAgICAgUmVvcmdhbml6ZSBQQkUgaW50ZXJuYWxzIHRvIGxvb2t1cCBmcm9tIGEgc3RhdGljIHRhYmxlIHVzaW5nIE5JRHMsCiAgICAgYWRkIHN1cHBvcnQgZm9yIEhNQUMgUEJFIE9JRCB0cmFuc2xhdGlvbi4gQWRkIGEgRVZQX0NJUEhFUiBjdHJsOgogICAgIEVWUF9DVFJMX1BCRV9QUkZfTklEIHRoaXMgYWxsb3dzIGEgY2lwaGVyIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUKICAgICBQUkYgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVzZWQgd2l0aCBQQkVTMi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZXBsYWNlIHRoZSBhbGdvcml0aG0gc3BlY2lmaWMgY2FsbHMgdG8gZ2VuZXJhdGUga2V5cyBpbiAicmVxIiB3aXRoIHRoZQogICAgIG5ldyBBUEkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIFBLQ1MjNyBlbnZlbG9wZWQgZGF0YSByb3V0aW5lcyB0byB1c2UgbmV3IEFQSS4gVGhpcyBpcyBub3cKICAgICBzdXBwb3J0ZWQgYnkgYW55IHB1YmxpYyBrZXkgbWV0aG9kIHN1cHBvcnRpbmcgdGhlIGVuY3J5cHQgb3BlcmF0aW9uLiBBCiAgICAgY3RybCBpcyBhZGRlZCB0byBhbGxvdyB0aGUgcHVibGljIGtleSBhbGdvcml0aG0gdG8gZXhhbWluZSBvciBtb2RpZnkKICAgICB0aGUgUEtDUyM3IFJlY2lwaWVudEluZm8gc3RydWN0dXJlIGlmIGl0IG5lZWRzIHRvOiBmb3IgUlNBIHRoaXMgaXMKICAgICBhIG5vIG9wLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGN0cmwgdG8gYXNuMSBtZXRob2QgdG8gYWxsb3cgYSBwdWJsaWMga2V5IGFsZ29yaXRobSB0byBleHByZXNzCiAgICAgYSBkZWZhdWx0IGRpZ2VzdCB0eXBlIHRvIHVzZS4gSW4gbW9zdCBjYXNlcyB0aGlzIHdpbGwgYmUgU0hBMSBidXQgc29tZQogICAgIGFsZ29yaXRobXMgKHN1Y2ggYXMgR09TVCkgbmVlZCB0byBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGRpZ2VzdC4gVGhlCiAgICAgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBob3cgc3Ryb25nIHRoZSBwcmVmZXJlbmNlIGlzIDEgbWVhbnMgb3B0aW9uYWwgYW5kCiAgICAgMiBpcyBtYW5kYXRvcnkgKHRoYXQgaXMgaXQgaXMgdGhlIG9ubHkgc3VwcG9ydGVkIHR5cGUpLiBNb2RpZnkKICAgICBBU04xX2l0ZW1fc2lnbigpIHRvIGFjY2VwdCBhIE5VTEwgZGlnZXN0IGFyZ3VtZW50IHRvIGluZGljYXRlIGl0IHNob3VsZAogICAgIHVzZSB0aGUgZGVmYXVsdCBtZC4gVXBkYXRlIG9wZW5zc2wgdXRpbGl0aWVzIHRvIHVzZSB0aGUgZGVmYXVsdCBkaWdlc3QKICAgICB0eXBlIGZvciBzaWduaW5nIGlmIGl0IGlzIG5vdCBleHBsaWNpdGx5IGluZGljYXRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVc2UgT0lEIGNyb3NzIHJlZmVyZW5jZSB0YWJsZSBpbiBBU04xX3NpZ24oKSBhbmQgQVNOMV92ZXJpZnkoKS4gTmV3IAogICAgIEVWUF9NRCBmbGFnIEVWUF9NRF9GTEFHX1BLRVlfTUVUSE9EX1NJR05BVFVSRS4gVGhpcyB1c2VzIHRoZSByZWxldmFudAogICAgIHNpZ25pbmcgbWV0aG9kIGZyb20gdGhlIGtleSB0eXBlLiBUaGlzIGVmZmVjdGl2ZWx5IHJlbW92ZXMgdGhlIGxpbmsKICAgICBiZXR3ZWVuIGRpZ2VzdHMgYW5kIHB1YmxpYyBrZXkgdHlwZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGFuIE9JRCBjcm9zcyByZWZlcmVuY2UgdGFibGUgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLiBJdHMgcHVycG9zZSBpcyB0bwogICAgIHRyYW5zbGF0ZSBiZXR3ZWVuIHNpZ25hdHVyZSBPSURzIHN1Y2ggYXMgU0hBMVdpdGhyc2FFbmNyeXB0aW9uIGFuZCBTSEExLAogICAgIHJzYUVuY3J5cHRpb24uIFRoaXMgd2lsbCBhbGxvdyBzb21lIG9mIHRoZSBhbGdvcml0aG0gc3BlY2lmaWMgaGFja2VyeQogICAgIG5lZWRlZCB0byB1c2UgdGhlIGNvcnJlY3QgT0lEIHRvIGJlIHJlbW92ZWQuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSBhbGdvcml0aG0gc3BlY2lmaWMgZGVwZW5kZW5jaWVzIHdoZW4gc2V0dGluZyBQS0NTN19TSUdORVJfSU5GTwogICAgIHN0cnVjdHVyZXMgZm9yIFBLQ1M3X3NpZ24oKS4gVGhleSBhcmUgbm93IHNldCB1cCBieSB0aGUgcmVsZXZhbnQgcHVibGljCiAgICAga2V5IEFTTjEgbWV0aG9kLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBwcm92aXNpb25hbCBFQyBwa2V5IG1ldGhvZCB3aXRoIHN1cHBvcnQgZm9yIEVDRFNBIGFuZCBFQ0RILgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBrZXkgZGVyaXZhdGlvbiAoYWdyZWVtZW50KSBpbiB0aGUgQVBJLCBESCBtZXRob2QgYW5kCiAgICAgcGtleXV0bC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgRFNBIHBrZXkgbWV0aG9kIGFuZCBESCBwa2V5IG1ldGhvZHMsIGV4dGVuZCBESCBBU04xIG1ldGhvZCB0byBzdXBwb3J0CiAgICAgcHVibGljIGFuZCBwcml2YXRlIGtleSBmb3JtYXRzLiBBcyBhIHNpZGUgZWZmZWN0IHRoZXNlIGFkZCBhZGRpdGlvbmFsIAogICAgIGNvbW1hbmQgbGluZSBmdW5jdGlvbmFsaXR5IG5vdCBwcmV2aW91c2x5IGF2YWlsYWJsZTogRFNBIHNpZ25hdHVyZXMgY2FuIGJlCiAgICAgZ2VuZXJhdGVkIGFuZCB2ZXJpZmllZCB1c2luZyBwa2V5dXRsIGFuZCBESCBrZXkgc3VwcG9ydCBhbmQgZ2VuZXJhdGlvbiBpbgogICAgIHBrZXksIGdlbnBrZXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQmVPUyBzdXBwb3J0LgogICAgIFtPbGl2ZXIgVGFwcGUgPHpvb2V5QGhpcnNjaGthZWZlci5kZT5dCgogICopIE5ldyBtYWtlIHRhcmdldCAiaW5zdGFsbF9odG1sX2RvY3MiIGluc3RhbGxzIEhUTUwgcmVuZGl0aW9ucyBvZiB0aGUKICAgICBtYW51YWwgcGFnZXMuCiAgICAgW09saXZlciBUYXBwZSA8em9vZXlAaGlyc2Noa2FlZmVyLmRlPl0KCiAgKikgTmV3IHV0aWxpdHkgImdlbnBrZXkiIHRoaXMgaXMgYW5hbG9nb3VzIHRvICJnZW5yc2EiIGV0YyBleGNlcHQgaXQgY2FuCiAgICAgZ2VuZXJhdGUga2V5cyBmb3IgYW55IGFsZ29yaXRobS4gRXh0ZW5kIGFuZCB1cGRhdGUgRVZQX1BLRVlfTUVUSE9EIHRvCiAgICAgc3VwcG9ydCBrZXkgYW5kIHBhcmFtZXRlciBnZW5lcmF0aW9uIGFuZCBhZGQgaW5pdGlhbCBrZXkgZ2VuZXJhdGlvbgogICAgIGZ1bmN0aW9uYWxpdHkgZm9yIFJTQS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZnVuY3Rpb25zIGZvciBtYWluIEVWUF9QS0VZX21ldGhvZCBvcGVyYXRpb25zLiBUaGUgdW5kb2N1bWVudGVkCiAgICAgZnVuY3Rpb25zIEVWUF9QS0VZX3tlbmNyeXB0LGRlY3J5cHR9IGhhdmUgYmVlbiByZW5hbWVkIHRvCiAgICAgRVZQX1BLRVlfe2VuY3J5cHQsZGVjcnlwdH1fb2xkLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGRlZmluaXRpb25zIGZvciBFVlBfUEtFWV9NRVRIT0QuIFRoaXMgd2lsbCBiZSBhIGhpZ2ggbGV2ZWwgcHVibGljCiAgICAga2V5IEFQSSwgZG9lc24ndCBkbyBtdWNoIHlldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gRVZQX1BLRVlfYXNuMV9nZXQwX2luZm8oKSB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dAogICAgIHB1YmxpYyBrZXkgYWxnb3JpdGhtcy4gTmV3IG9wdGlvbiB0byBvcGVuc3NsIHV0aWxpdHk6CiAgICAgImxpc3QtcHVibGljLWtleS1hbGdvcml0aG1zIiB0byBwcmludCBvdXQgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXBsZW1lbnQgdGhlIFN1cHBvcnRlZCBFbGxpcHRpYyBDdXJ2ZXMgRXh0ZW5zaW9uIGZvcgogICAgIEVDQyBjaXBoZXJzdWl0ZXMgZnJvbSBkcmFmdC1pZXRmLXRscy1lY2MtMTIudHh0LgogICAgIFtEb3VnbGFzIFN0ZWJpbGFdCgogICopIERvbid0IGZyZWUgdXAgT0lEcyBpbiBPQkpfY2xlYW51cCgpIGlmIHRoZXkgYXJlIGluIHVzZSBieSBFVlBfTUQgb3IKICAgICBFVlBfQ0lQSEVSIHN0cnVjdHVyZXMgdG8gYXZvaWQgbGF0ZXIgcHJvYmxlbXMgaW4gRVZQX2NsZWFudXAoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgdXRpbGl0aWVzIHBrZXkgYW5kIHBrZXlwYXJhbS4gVGhlc2UgYXJlIHNpbWlsYXIgdG8gYWxnb3JpdGhtIHNwZWNpZmljCiAgICAgdXRpbGl0aWVzIHN1Y2ggYXMgcnNhLCBkc2EsIGRzYXBhcmFtIGV0YyBleGNlcHQgdGhleSBwcm9jZXNzIGFueSBrZXkKICAgICB0eXBlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRyYW5zZmVyIHB1YmxpYyBrZXkgcHJpbnRpbmcgcm91dGluZXMgdG8gRVZQX1BLRVlfQVNOMV9NRVRIT0QuIE5ldyAKICAgICBmdW5jdGlvbnMgRVZQX1BLRVlfcHJpbnRfcHVibGljKCksIEVWUF9QS0VZX3ByaW50X3ByaXZhdGUoKSwKICAgICBFVlBfUEtFWV9wcmludF9wYXJhbSgpIHRvIHByaW50IHB1YmxpYyBrZXkgZGF0YSBmcm9tIGFuIEVWUF9QS0VZCiAgICAgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgcGx1Z2dhYmxlIHB1YmxpYyBrZXkgQVNOMS4KICAgICBEZS1zcGFnaGV0dGlmeSB0aGUgcHVibGljIGtleSBBU04xIGhhbmRsaW5nLiBNb3ZlIHB1YmxpYyBhbmQgcHJpdmF0ZQogICAgIGtleSBBU04xIGhhbmRsaW5nIHRvIGEgbmV3IEVWUF9QS0VZX0FTTjFfTUVUSE9EIHN0cnVjdHVyZS4gUmVsb2NhdGUKICAgICBhbGdvcml0aG0gc3BlY2lmaWMgaGFuZGxpbmcgdG8gYSBzaW5nbGUgbW9kdWxlIHdpdGhpbiB0aGUgcmVsZXZhbnQKICAgICBhbGdvcml0aG0gZGlyZWN0b3J5LiBBZGQgZnVuY3Rpb25zIHRvIGFsbG93IChuZWFyKSBvcGFxdWUgcHJvY2Vzc2luZwogICAgIG9mIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXkgc3RydWN0dXJlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXBsZW1lbnQgdGhlIFN1cHBvcnRlZCBQb2ludCBGb3JtYXRzIEV4dGVuc2lvbiBmb3IKICAgICBFQ0MgY2lwaGVyc3VpdGVzIGZyb20gZHJhZnQtaWV0Zi10bHMtZWNjLTEyLnR4dC4KICAgICBbRG91Z2xhcyBTdGViaWxhXQoKICAqKSBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBSRkMgNDI3OSBQU0sgVExTIGNpcGhlcnN1aXRlcy4gQWRkIG1lbWJlcnMKICAgICBmb3IgdGhlIHBzayBpZGVudGl0eSBbaGludF0gYW5kIHRoZSBwc2sgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIHRoZQogICAgIFNTTF9TRVNTSU9OLCBTU0wgYW5kIFNTTF9DVFggc3RydWN0dXJlLgogICAgIAogICAgIE5ldyBjaXBoZXJzdWl0ZXM6CiAgICAgICAgIFBTSy1SQzQtU0hBLCBQU0stM0RFUy1FREUtQ0JDLVNIQSwgUFNLLUFFUzEyOC1DQkMtU0hBLAogICAgICAgICBQU0stQUVTMjU2LUNCQy1TSEEKIAogICAgIE5ldyBmdW5jdGlvbnM6CiAgICAgICAgIFNTTF9DVFhfdXNlX3Bza19pZGVudGl0eV9oaW50CiAgICAgICAgIFNTTF9nZXRfcHNrX2lkZW50aXR5X2hpbnQKICAgICAgICAgU1NMX2dldF9wc2tfaWRlbnRpdHkKICAgICAgICAgU1NMX3VzZV9wc2tfaWRlbnRpdHlfaGludAoKICAgICBbTWlrYSBLb3VzYSBhbmQgUGFzaSBFcm9uZW4gb2YgTm9raWEgQ29ycG9yYXRpb25dCgogICopIEFkZCBSRkMgMzE2MSBjb21wbGlhbnQgdGltZSBzdGFtcCByZXF1ZXN0IGNyZWF0aW9uLCByZXNwb25zZSBnZW5lcmF0aW9uCiAgICAgYW5kIHJlc3BvbnNlIHZlcmlmaWNhdGlvbiBmdW5jdGlvbmFsaXR5LgogICAgIFtab2x04W4gR2zzemlrIDx6Z2xvemlrQG9wZW50c2Eub3JnPiwgVGhlIE9wZW5UU0EgUHJvamVjdF0KCiAgKikgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgVExTIGV4dGVuc2lvbnMsIHNwZWNpZmljYWxseSBmb3IgdGhlIHNlcnZlcl9uYW1lCiAgICAgZXh0ZW5zaW9uIHNvIGZhci4gIFRoZSBTU0xfU0VTU0lPTiwgU1NMX0NUWCwgYW5kIFNTTCBkYXRhIHN0cnVjdHVyZXMgbm93CiAgICAgaGF2ZSBuZXcgbWVtYmVycyBmb3IgYSBob3N0IG5hbWUuICBUaGUgU1NMIGRhdGEgc3RydWN0dXJlIGhhcyBhbgogICAgIGFkZGl0aW9uYWwgbWVtYmVyIFNTTF9DVFggKmluaXRpYWxfY3R4IHNvIHRoYXQgbmV3IHNlc3Npb25zIGNhbiBiZQogICAgIHN0b3JlZCBpbiB0aGF0IGNvbnRleHQgdG8gYWxsb3cgZm9yIHNlc3Npb24gcmVzdW1wdGlvbiwgZXZlbiBhZnRlciB0aGUKICAgICBTU0wgaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBuZXcgU1NMX0NUWCBpbiByZWFjdGlvbiB0byBhIGNsaWVudCdzCiAgICAgc2VydmVyX25hbWUgZXh0ZW5zaW9uLgoKICAgICBOZXcgZnVuY3Rpb25zIChzdWJqZWN0IHRvIGNoYW5nZSk6CgogICAgICAgICBTU0xfZ2V0X3NlcnZlcm5hbWUoKQogICAgICAgICBTU0xfZ2V0X3NlcnZlcm5hbWVfdHlwZSgpCiAgICAgICAgIFNTTF9zZXRfU1NMX0NUWCgpCgogICAgIE5ldyBDVFJMIGNvZGVzIGFuZCBtYWNyb3MgKHN1YmplY3QgdG8gY2hhbmdlKToKCiAgICAgICAgIFNTTF9DVFJMX1NFVF9UTFNFWFRfU0VSVkVSTkFNRV9DQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrKCkKICAgICAgICAgU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0FSRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfYXJnKCkKICAgICAgICAgU1NMX0NUUkxfU0VUX1RMU0VYVF9IT1NUTkFNRSAgICAgICAgICAgLSBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKQoKICAgICBvcGVuc3NsIHNfY2xpZW50IGhhcyBhIG5ldyAnLXNlcnZlcm5hbWUgLi4uJyBvcHRpb24uCgogICAgIG9wZW5zc2wgc19zZXJ2ZXIgaGFzIG5ldyBvcHRpb25zICctc2VydmVybmFtZV9ob3N0IC4uLicsICctY2VydDIgLi4uJywKICAgICAnLWtleTIgLi4uJywgJy1zZXJ2ZXJuYW1lX2ZhdGFsJyAoc3ViamVjdCB0byBjaGFuZ2UpLiAgVGhpcyBhbGxvd3MKICAgICB0ZXN0aW5nIHRoZSBIb3N0TmFtZSBleHRlbnNpb24gZm9yIGEgc3BlY2lmaWMgc2luZ2xlIGhvc3QgbmFtZSAoJy1jZXJ0JwogICAgIGFuZCAnLWtleScgcmVtYWluIGZhbGxiYWNrcyBmb3IgaGFuZHNoYWtlcyB3aXRob3V0IEhvc3ROYW1lCiAgICAgbmVnb3RpYXRpb24pLiAgSWYgdGhlIHVucmVjb2duaXplZF9uYW1lIGFsZXJ0IGhhcyB0byBiZSBzZW50LCB0aGlzIGJ5CiAgICAgZGVmYXVsdCBpcyBhIHdhcm5pbmc7IGl0IGJlY29tZXMgZmF0YWwgd2l0aCB0aGUgJy1zZXJ2ZXJuYW1lX2ZhdGFsJwogICAgIG9wdGlvbi4KCiAgICAgW1BldGVyIFN5bHZlc3RlciwgIFJlbXkgQWxsYWlzLCBDaHJpc3RvcGhlIFJlbm91XQoKICAqKSBXaGlybHBvb2wgaGFzaCBpbXBsZW1lbnRhdGlvbiBpcyBhZGRlZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQklHTlVNIGNvZGUgb24gNjQtYml0IFNQQVJDdjkgdGFyZ2V0cyBpcyBzd2l0Y2hlZCBmcm9tIGJuKDY0LDY0KSB0bwogICAgIGJuKDY0LDMyKS4gQmVjYXVzZSBvZiBpbnN0cnVjdGlvbiBzZXQgbGltaXRhdGlvbnMgaXQgZG9lc24ndCBoYXZlCiAgICAgYW55IG5lZ2F0aXZlIGltcGFjdCBvbiBwZXJmb3JtYW5jZS4gVGhpcyB3YXMgZG9uZSBtb3N0bHkgaW4gb3JkZXIKICAgICB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHNoYXJlIGFzc2VtYmxlciBtb2R1bGVzLCBzdWNoIGFzIGJuX211bF9tb250CiAgICAgaW1wbGVtZW50YXRpb25zLCBiZXR3ZWVuIDMyLSBhbmQgNjQtYml0IGJ1aWxkcyB3aXRob3V0IGhhc3NsZS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTW92ZSBjb2RlIHByZXZpb3VzbHkgZXhpbGVkIGludG8gZmlsZSBjcnlwdG8vZWMvZWMyX3NtcHQuYwogICAgIHRvIGVjMl9zbXBsLmMsIGFuZCBubyBsb25nZXIgcmVxdWlyZSB0aGUgT1BFTlNTTF9FQ19CSU5fUFRfQ09NUAogICAgIG1hY3JvLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBjYW5kaWRhdGUgZm9yIEJJR05VTSBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24sIGJuX211bF9tb250LAogICAgIGRlZGljYXRlZCBNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uIHByb2NlZHVyZSwgaXMgaW50cm9kdWNlZC4KICAgICBCTl9NT05UX0NUWCBpcyBtb2RpZmllZCB0byBhbGxvdyBibl9tdWxfbW9udCB0byByZWFjaCBmb3IgaGlnaGVyCiAgICAgIjY0LWJpdCIgcGVyZm9ybWFuY2Ugb24gY2VydGFpbiAzMi1iaXQgdGFyZ2V0cy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTmV3IG9wdGlvbiBTU0xfT1BfTk9fQ09NUCB0byBkaXNhYmxlIHVzZSBvZiBjb21wcmVzc2lvbiBzZWxlY3RpdmVseQogICAgIGluIFNTTCBzdHJ1Y3R1cmVzLiBOZXcgU1NMIGN0cmwgdG8gc2V0IG1heGltdW0gc2VuZCBmcmFnbWVudCBzaXplLiAKICAgICBTYXZlIG1lbW9yeSBieSBzZWV0aW5nIHRoZSBJL08gYnVmZmVyIHNpemVzIGR5bmFtaWNhbGx5IGluc3RlYWQgb2YKICAgICB1c2luZyB0aGUgbWF4aW11bSBhdmFpbGFibGUgdmFsdWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbiAtViBmb3IgJ29wZW5zc2wgY2lwaGVycycuIFRoaXMgcHJpbnRzIHRoZSBjaXBoZXJzdWl0ZSBjb2RlCiAgICAgaW4gYWRkaXRpb24gdG8gdGhlIHRleHQgZGV0YWlscy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBWZXJ5LCB2ZXJ5IHByZWxpbWluYXJ5IEVYUEVSSU1FTlRBTCBzdXBwb3J0IGZvciBwcmludGluZyBvZiBnZW5lcmFsCiAgICAgQVNOMSBzdHJ1Y3R1cmVzLiBUaGlzIGN1cnJlbnRseSBwcm9kdWNlcyByYXRoZXIgdWdseSBvdXRwdXQgYW5kIGRvZXNuJ3QKICAgICBoYW5kbGUgc2V2ZXJhbCBjdXN0b21pc2VkIHN0cnVjdHVyZXMgYXQgYWxsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEludGVncmF0ZWQgc3VwcG9ydCBmb3IgUFZLIGZpbGUgZm9ybWF0IGFuZCBzb21lIHJlbGF0ZWQgZm9ybWF0cyBzdWNoCiAgICAgYXMgTVMgUFVCTElDS0VZQkxPQiBhbmQgUFJJVkFURUtFWUJMT0IuIENvbW1hbmQgbGluZSBzd2l0Y2hlcyB0byBzdXBwb3J0CiAgICAgdGhlc2UgaW4gdGhlICdyc2EnIGFuZCAnZHNhJyB1dGlsaXRpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgUEtDUyMxIFJTQVB1YmxpY0tleSBmb3JtYXQgb24gcnNhIHV0aWxpdHkgY29tbWFuZCBsaW5lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSB0aGUgYW5jaWVudCBBU04xX01FVEhPRCBjb2RlLiBUaGlzIHdhcyBvbmx5IGV2ZXIgdXNlZCBpbiBvbmUKICAgICBwbGFjZSBmb3IgdGhlICh2ZXJ5IG9sZCkgIk5FVFNDQVBFIiBmb3JtYXQgY2VydGlmaWNhdGVzIHdoaWNoIGFyZSBub3cKICAgICBoYW5kbGVkIHVzaW5nIG5ldyBBU04xIGNvZGUgZXF1aXZhbGVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTGV0IHRoZSBUTFN2MV9tZXRob2QoKSBldGMuIGZ1bmN0aW9ucyByZXR1cm4gYSAnY29uc3QnIFNTTF9NRVRIT0QKICAgICBwb2ludGVyIGFuZCBtYWtlIHRoZSBTU0xfTUVUSE9EIHBhcmFtZXRlciBpbiBTU0xfQ1RYX25ldywKICAgICBTU0xfQ1RYX3NldF9zc2xfdmVyc2lvbiBhbmQgU1NMX3NldF9zc2xfbWV0aG9kICdjb25zdCcuCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBNb2RpZnkgQ1JMIGRpc3RyaWJ1dGlvbiBwb2ludHMgZXh0ZW5zaW9uIGNvZGUgdG8gcHJpbnQgb3V0IHByZXZpb3VzbHkKICAgICB1bnN1cHBvcnRlZCBmaWVsZHMuIEVuaGFuY2UgZXh0ZW5zaW9uIHNldHRpbmcgY29kZSB0byBhbGxvdyBzZXR0aW5nIG9mCiAgICAgYWxsIGZpZWxkcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgcHJpbnQgYW5kIHNldCBzdXBwb3J0IGZvciBJc3N1aW5nIERpc3RyaWJ1dGlvbiBQb2ludCBDUkwgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSAnQ29uZmlndXJlJyBzY3JpcHQgdG8gZW5hYmxlIENhbWVsbGlhIGJ5IGRlZmF1bHQuCiAgICAgW05UVF0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhtIGFuZCAwLjkuOG4gWzI0IE1hciAyMDEwXQoKICAqKSBXaGVuIHJlamVjdGluZyBTU0wvVExTIHJlY29yZHMgZHVlIHRvIGFuIGluY29ycmVjdCB2ZXJzaW9uIG51bWJlciwgbmV2ZXIKICAgICB1cGRhdGUgcy0+c2VydmVyIHdpdGggYSBuZXcgbWFqb3IgdmVyc2lvbiBudW1iZXIuICBBcyBvZgogICAgIC0gT3BlblNTTCAwLjkuOG0gaWYgJ3Nob3J0JyBpcyBhIDE2LWJpdCB0eXBlLAogICAgIC0gT3BlblNTTCAwLjkuOGYgaWYgJ3Nob3J0JyBpcyBsb25nZXIgdGhhbiAxNiBiaXRzLAogICAgIHRoZSBwcmV2aW91cyBiZWhhdmlvciBjb3VsZCByZXN1bHQgaW4gYSByZWFkIGF0dGVtcHQgYXQgTlVMTCB3aGVuCiAgICAgcmVjZWl2aW5nIHNwZWNpZmljIGluY29ycmVjdCBTU0wvVExTIHJlY29yZHMgb25jZSByZWNvcmQgcGF5bG9hZAogICAgIHByb3RlY3Rpb24gaXMgYWN0aXZlLiAgKENWRS0yMDEwLTA3NDApCiAgICAgW0JvZG8gTW9lbGxlciwgQWRhbSBMYW5nbGV5IDxhZ2xAY2hyb21pdW0ub3JnPl0KCiAgKikgRml4IGZvciBDVkUtMjAxMC0wNDMzIHdoZXJlIHNvbWUga2VyYmVyb3MgZW5hYmxlZCB2ZXJzaW9ucyBvZiBPcGVuU1NMIAogICAgIGNvdWxkIGJlIGNyYXNoZWQgaWYgdGhlIHJlbGV2YW50IHRhYmxlcyB3ZXJlIG5vdCBwcmVzZW50IChlLmcuIGNocm9vdGVkKS4KICAgICBbVG9tYXMgSG9nZXIgPHRob2dlckByZWRoYXQuY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhsIGFuZCAwLjkuOG0gWzI1IEZlYiAyMDEwXQoKICAqKSBBbHdheXMgY2hlY2sgYm5fd2V4cGVuZCgpIHJldHVybiB2YWx1ZXMgZm9yIGZhaWx1cmUuICAoQ1ZFLTIwMDktMzI0NSkKICAgICBbTWFydGluIE9sc3NvbiwgTmVlbCBNZWh0YV0KCiAgKikgRml4IFg1MDlfU1RPUkUgbG9ja2luZzogRXZlcnkgJ29ianMnIGFjY2VzcyByZXF1aXJlcyBhIGxvY2sgKHRvCiAgICAgYWNjb21tb2RhdGUgZm9yIHN0YWNrIHNvcnRpbmcsIGFsd2F5cyBhIHdyaXRlIGxvY2shKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBPbiBzb21lIHZlcnNpb25zIG9mIFdJTjMyIEhlYXAzMk5leHQgaXMgdmVyeSBzbG93LiBUaGlzIGNhbiBjYXVzZQogICAgIGV4Y2Vzc2l2ZSBkZWxheXMgaW4gdGhlIFJBTkRfcG9sbCgpOiBvdmVyIGEgbWludXRlLiBBcyBhIHdvcmthcm91bmQKICAgICBpbmNsdWRlIGEgdGltZSBjaGVjayBpbiB0aGUgaW5uZXIgSGVhcDMyTmV4dCBsb29wIHRvby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUaGUgY29kZSB0aGF0IGhhbmRsZWQgZmx1c2hpbmcgb2YgZGF0YSBpbiBTU0wvVExTIG9yaWdpbmFsbHkgdXNlZCB0aGUKICAgICBCSU9fQ1RSTF9JTkZPIGN0cmwgdG8gc2VlIGlmIGFueSBkYXRhIHdhcyBwZW5kaW5nIGZpcnN0LiBUaGlzIGNhdXNlZAogICAgIHRoZSBwcm9ibGVtIG91dGxpbmVkIGluIFBSIzE5NDkuIFRoZSBmaXggc3VnZ2VzdGVkIHRoZXJlIGhvd2V2ZXIgY2FuCiAgICAgdHJpZ2dlciBwcm9ibGVtcyB3aXRoIGJ1Z2d5IEJJT19DVFJMX1dQRU5ESU5HIChlLmcuIHNvbWUgdmVyc2lvbnMKICAgICBvZiBBcGFjaGUpLiBTbyBpbnN0ZWFkIHNpbXBsaWZ5IHRoZSBjb2RlIHRvIGZsdXNoIHVuY29uZGl0aW9uYWxseS4KICAgICBUaGlzIHNob3VsZCBiZSBmaW5lIHNpbmNlIGZsdXNoaW5nIHdpdGggbm8gZGF0YSB0byBmbHVzaCBpcyBhIG5vIG9wLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhhbmRsZSBUTFMgdmVyc2lvbnMgMi4wIGFuZCBsYXRlciBwcm9wZXJseSBhbmQgY29ycmVjdGx5IHVzZSB0aGUKICAgICBoaWdoZXN0IHZlcnNpb24gb2YgVExTL1NTTCBzdXBwb3J0ZWQuIEFsdGhvdWdoIFRMUyA+PSAyLjAgaXMgc29tZSB3YXkKICAgICBvZmYgYW5jaWVudCBzZXJ2ZXJzIGhhdmUgYSBoYWJpdCBvZiBzdGlja2luZyBhcm91bmQgZm9yIGEgd2hpbGUuLi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgY29tcHJlc3Npb24gY29kZSBzbyBpdCBmcmVlcyB1cCBzdHJ1Y3R1cmVzIHdpdGhvdXQgdXNpbmcgdGhlCiAgICAgZXhfZGF0YSBjYWxsYmFja3MuIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSB3aGVyZSBzb21lIGFwcGxpY2F0aW9ucwogICAgIGNhbGwgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKSBiZWZvcmUgYXBwbGljYXRpb24gZXhpdCAoZS5nLiB3aGVuCiAgICAgcmVzdGFydGluZykgdGhlbiB1c2UgY29tcHJlc3Npb24gKGUuZy4gU1NMIHdpdGggY29tcHJlc3Npb24pIGxhdGVyLgogICAgIFRoaXMgcmVzdWx0cyBpbiBzaWduaWZpY2FudCBwZXItY29ubmVjdGlvbiBtZW1vcnkgbGVha3MgYW5kCiAgICAgaGFzIGNhdXNlZCBzb21lIHNlY3VyaXR5IGlzc3VlcyBpbmNsdWRpbmcgQ1ZFLTIwMDgtMTY3OCBhbmQKICAgICBDVkUtMjAwOS00MzU1LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnN0aWZ5IGNyeXB0by9jYXN0IChpLmUuLCA8b3BlbnNzbC9jYXN0Lmg+KTogYSBDQVNUX0tFWSBkb2Vzbid0CiAgICAgY2hhbmdlIHdoZW4gZW5jcnlwdGluZyBvciBkZWNyeXB0aW5nLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBvcHRpb24gU1NMX09QX0xFR0FDWV9TRVJWRVJfQ09OTkVDVCB3aGljaCB3aWxsIGFsbG93IGNsaWVudHMgdG8KICAgICBjb25uZWN0IGFuZCByZW5lZ290aWF0ZSB3aXRoIHNlcnZlcnMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUkkuCiAgICAgVW50aWwgUkkgaXMgbW9yZSB3aWRlbHkgZGVwbG95ZWQgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAibWlzc2luZyIgc3NsIGN0cmxzIHRvIGNsZWFyIG9wdGlvbnMgYW5kIG1vZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgY2xpZW50IGF0dGVtcHRzIHRvIHJlbmVnb3RpYXRlIGFuZCBkb2Vzbid0IHN1cHBvcnQgUkkgcmVzcG9uZCB3aXRoCiAgICAgYSBub19yZW5lZ290aWF0aW9uIGFsZXJ0IGFzIHJlcXVpcmVkIGJ5IFJGQzU3NDYuICBTb21lIHJlbmVnb3RpYXRpbmcKICAgICBUTFMgY2xpZW50cyB3aWxsIGNvbnRpbnVlIGEgY29ubmVjdGlvbiBncmFjZWZ1bGx5IHdoZW4gdGhleSByZWNlaXZlCiAgICAgdGhlIGFsZXJ0LiBVbmZvcnR1bmF0ZWx5IE9wZW5TU0wgbWlzaGFuZGxlZCB0aGlzIGFsZXJ0IGFuZCB3b3VsZCBoYW5nCiAgICAgd2FpdGluZyBmb3IgYSBzZXJ2ZXIgaGVsbG8gd2hpY2ggaXQgd2lsbCBuZXZlciByZWNlaXZlLiBOb3cgd2UgdHJlYXQgYQogICAgIHJlY2VpdmVkIG5vX3JlbmVnb3RpYXRpb24gYWxlcnQgYXMgYSBmYXRhbCBlcnJvci4gVGhpcyBpcyBiZWNhdXNlCiAgICAgYXBwbGljYXRpb25zIHJlcXVlc3RpbmcgYSByZW5lZ290aWF0aW9uIG1pZ2h0IHdlbGwgZXhwZWN0IGl0IHRvIHN1Y2NlZWQKICAgICBhbmQgd291bGQgaGF2ZSBubyBjb2RlIGluIHBsYWNlIHRvIGhhbmRsZSB0aGUgc2VydmVyIGRlbnlpbmcgaXQgc28gdGhlCiAgICAgb25seSBzYWZlIHRoaW5nIHRvIGRvIGlzIHRvIHRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY3RybCBtYWNybyBTU0xfZ2V0X3NlY3VyZV9yZW5lZ290aWF0aW9uX3N1cHBvcnQoKSB3aGljaCByZXR1cm5zIDEgaWYKICAgICBwZWVyIHN1cHBvcnRzIHNlY3VyZSByZW5lZ290aWF0aW9uIGFuZCAwIG90aGVyd2lzZS4gUHJpbnQgb3V0IHBlZXIKICAgICByZW5lZ290aWF0aW9uIHN1cHBvcnQgaW4gc19jbGllbnQvc19zZXJ2ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVwbGFjZSB0aGUgaGlnaGx5IGJyb2tlbiBhbmQgZGVwcmVjYXRlZCBTUEtBQyBjZXJ0aWZpY2F0aW9uIG1ldGhvZCB3aXRoCiAgICAgdGhlIHVwZGF0ZWQgTklEIGNyZWF0aW9uIHZlcnNpb24uIFRoaXMgc2hvdWxkIGNvcnJlY3RseSBoYW5kbGUgVVRGOC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXBsZW1lbnQgUkZDNTc0Ni4gUmUtZW5hYmxlIHJlbmVnb3RpYXRpb24gYnV0IHJlcXVpcmUgdGhlIGV4dGVuc2lvbgogICAgIGFzIG5lZWRlZC4gVW5mb3J0dW5hdGVseSwgU1NMM19GTEFHU19BTExPV19VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT04KICAgICB0dXJucyBvdXQgdG8gYmUgYSBiYWQgaWRlYS4gSXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkKICAgICBTU0xfT1BfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OIHdoaWNoIGNhbiBiZSBzZXQgd2l0aAogICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoKS4gVGhpcyBpcyByZWFsbHkgbm90IHJlY29tbWVuZGVkIHVubGVzcyB5b3UKICAgICBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KICAgICBbRXJpYyBSZXNjb3JsYSA8ZWtyQG5ldHdvcmtyZXNvbmFuY2UuY29tPiwgQmVuIExhdXJpZSwgU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBzdGF0ZWxlc3Mgc2Vzc2lvbiByZXN1bXB0aW9uIGhhbmRsaW5nLiBVc2UgaW5pdGlhbF9jdHggd2hlbgogICAgIGlzc3VpbmcgYW5kIGF0dGVtcHRpbmcgdG8gZGVjcnlwdCB0aWNrZXRzIGluIGNhc2UgaXQgaGFzIGNoYW5nZWQgZHVyaW5nCiAgICAgc2VydmVybmFtZSBoYW5kbGluZy4gVXNlIGEgbm9uLXplcm8gbGVuZ3RoIHNlc3Npb24gSUQgd2hlbiBhdHRlbXB0aW5nCiAgICAgc3RhdGVsZXNzIHNlc3Npb24gcmVzdW1wdGlvbjogdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaWYKICAgICBhIHJlc3VtcHRpb24gaGFzIG9jY3VycmVkIGltbWVkaWF0ZWx5IGFmdGVyIHJlY2VpdmluZyBzZXJ2ZXIgaGVsbG8KICAgICAoc2V2ZXJhbCBwbGFjZXMgaW4gT3BlblNTTCBzdWJ0bHkgYXNzdW1lIHRoaXMpIGluc3RlYWQgb2YgbGF0ZXIgaW4KICAgICB0aGUgaGFuZHNoYWtlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRoZSBmdW5jdGlvbnMgRU5HSU5FX2N0cmwoKSwgT1BFTlNTTF9pc3NlcnZpY2UoKSwKICAgICBDTVNfZ2V0MV9SZWNpcGllbnRSZXF1ZXN0KCkgYW5kIFJBTkRfYnl0ZXMoKSBjYW4gcmV0dXJuIDw9MCBvbiBlcnJvcgogICAgIGZpeGVzIGZvciBhIGZldyBwbGFjZXMgd2hlcmUgdGhlIHJldHVybiBjb2RlIGlzIG5vdCBjaGVja2VkCiAgICAgY29ycmVjdGx5LgogICAgIFtKdWxpYSBMYXdhbGwgPGp1bGlhQGRpa3UuZGs+XQoKICAqKSBBZGQgLS1zdHJpY3Qtd2FybmluZ3Mgb3B0aW9uIHRvIENvbmZpZ3VyZSBzY3JpcHQgdG8gaW5jbHVkZSBkZXZ0ZWFtCiAgICAgd2FybmluZ3MgaW4gb3RoZXIgY29uZmlndXJhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIC0tbGliZGlyIG9wdGlvbiBhbmQgTElCRElSIHZhcmlhYmxlIGluIG1ha2VmaWxlcy4gVGhpcwogICAgIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGluc3RhbGwgb3BlbnNzbCBsaWJyYXJpZXMgaW4gbG9jYXRpb25zIHdoaWNoCiAgICAgaGF2ZSBuYW1lcyBvdGhlciB0aGFuICJsaWIiLCBmb3IgZXhhbXBsZSAiL3Vzci9saWI2NCIgd2hpY2ggc29tZQogICAgIHN5c3RlbXMgbmVlZC4KICAgICBbU3RldmUgSGVuc29uLCBiYXNlZCBvbiBwYXRjaCBmcm9tIEplcmVteSBVdGxleV0KCiAgKikgRG9uJ3QgYWxsb3cgdGhlIHVzZSBvZiBsZWFkaW5nIDB4ODAgaW4gT0lEcy4gVGhpcyBpcyBhIHZpb2xhdGlvbiBvZgogICAgIFg2OTAgOC45LjEyIGFuZCBjYW4gcHJvZHVjZSBzb21lIG1pc2xlYWRpbmcgdGV4dHVhbCBvdXRwdXQgb2YgT0lEcy4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBEYW4gS2FtaW5za3ldCgogICopIERlbGV0ZSBNRDIgZnJvbSBhbGdvcml0aG0gdGFibGVzLiBUaGlzIGZvbGxvd3MgdGhlIHJlY29tbWVuZGF0aW9uIGluCiAgICAgc2V2ZXJhbCBzdGFuZGFyZHMgdGhhdCBpdCBpcyBub3QgdXNlZCBpbiBuZXcgYXBwbGljYXRpb25zIGR1ZSB0bwogICAgIHNldmVyYWwgY3J5cHRvZ3JhcGhpYyB3ZWFrbmVzc2VzLiBGb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgcmVhc29ucwogICAgIHRoZSBNRDIgQVBJIGlzIHN0aWxsIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvbXByZXNzaW9uIGlkIHRvIHtkMmksaTJkfV9TU0xfU0VTU0lPTiBzbyBpdCBpcyBjb3JyZWN0bHkgc2F2ZWQKICAgICBhbmQgcmVzdG9yZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVuYW1lIHVuaTJhc2MgYW5kIGFzYzJ1bmkgZnVuY3Rpb25zIHRvIE9QRU5TU0xfdW5pMmFzYyBhbmQKICAgICBPUEVOU1NMX2FzYzJ1bmkgY29uZGl0aW9uYWxseSBvbiBOZXR3YXJlIHBsYXRmb3JtcyB0byBhdm9pZCBhIG5hbWUKICAgICBjbGFzaC4KICAgICBbR3VlbnRlciA8bGlzdHNAZ2tudy5uZXQ+XQoKICAqKSBGaXggdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBjaGFpbiBidWlsZGluZyBjb2RlIHRvIHVzZSBYNTA5X3ZlcmlmeV9jZXJ0KCksCiAgICAgaXQgdXNlZCB0byBoYXZlIGFuIGFkLWhvYyBidWlsZGVyIHdoaWNoIHdhcyB1bmFibGUgdG8gY29wZSB3aXRoIGFueXRoaW5nCiAgICAgb3RoZXIgdGhhbiBhIHNpbXBsZSBjaGFpbi4KICAgICBbRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPiwgU3RldmUgSGVuc29uXQoKICAqKSBEb24ndCBjaGVjayBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSBzaWduYXR1cmVzIGluIFg1MDlfdmVyaWZ5X2NlcnQoKQogICAgIGJ5IGRlZmF1bHQgKGEgZmxhZyBjYW4gb3ZlcnJpZGUgdGhpcyk6IGl0IGp1c3Qgd2FzdGVzIHRpbWUgd2l0aG91dAogICAgIGFkZGluZyBhbnkgc2VjdXJpdHkuIEFzIGEgdXNlZnVsIHNpZGUgZWZmZWN0IHNlbGYgc2lnbmVkIHJvb3QgQ0FzCiAgICAgd2l0aCBub24tRklQUyBkaWdlc3RzIGFyZSBub3cgdXNhYmxlIGluIEZJUFMgbW9kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBkdGxzMV9wcm9jZXNzX291dF9vZl9zZXFfbWVzc2FnZSgpIHRoZSBjaGVjayBpZiB0aGUgY3VycmVudCBtZXNzYWdlCiAgICAgaXMgYWxyZWFkeSBidWZmZXJlZCB3YXMgbWlzc2luZy4gRm9yIGV2ZXJ5IG5ldyBtZXNzYWdlIHdhcyBtZW1vcnkKICAgICBhbGxvY2F0ZWQsIGFsbG93aW5nIGFuIGF0dGFja2VyIHRvIHBlcmZvcm0gYW4gZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrCiAgICAgd2l0aCBzZW5kaW5nIG91dCBvZiBzZXEgaGFuZHNoYWtlIG1lc3NhZ2VzIHVudGlsIHRoZXJlIGlzIG5vIG1lbW9yeQogICAgIGxlZnQuIEFkZGl0aW9uYWxseSBldmVyeSBmdXR1cmUgbWVzc2VnZSB3YXMgYnVmZmVyZWQsIGV2ZW4gaWYgdGhlCiAgICAgc2VxdWVuY2UgbnVtYmVyIG1hZGUgbm8gc2Vuc2UgYW5kIHdvdWxkIGJlIHBhcnQgb2YgYW5vdGhlciBoYW5kc2hha2UuCiAgICAgU28gb25seSBtZXNzYWdlcyB3aXRoIHNlcXVlbmNlIG51bWJlcnMgbGVzcyB0aGFuIDEwIGluIGFkdmFuY2Ugd2lsbCBiZQogICAgIGJ1ZmZlcmVkLiAgKENWRS0yMDA5LTEzNzgpCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4sIGRpc2NvdmVyZWQgYnkgRGFuaWVsIE1lbnR6XSAJCgogICopIFJlY29yZHMgYXJlIGJ1ZmZlcmVkIGlmIHRoZXkgYXJyaXZlIHdpdGggYSBmdXR1cmUgZXBvY2ggdG8gYmUKICAgICBwcm9jZXNzZWQgYWZ0ZXIgZmluaXNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRzaGFrZS4gVGhlcmUgaXMKICAgICBjdXJyZW50bHkgbm8gbGltaXRhdGlvbiB0byB0aGlzIGJ1ZmZlciBhbGxvd2luZyBhbiBhdHRhY2tlciB0byBwZXJmb3JtCiAgICAgYSBET1MgYXR0YWNrIHdpdGggc2VuZGluZyByZWNvcmRzIHdpdGggZnV0dXJlIGVwb2NocyB1bnRpbCB0aGVyZSBpcyBubwogICAgIG1lbW9yeSBsZWZ0LiBUaGlzIHBhdGNoIGFkZHMgdGhlIHBxdWV1ZV9zaXplKCkgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lCiAgICAgdGhlIHNpemUgb2YgYSBidWZmZXIgYW5kIGxpbWl0cyB0aGUgcmVjb3JkIGJ1ZmZlciB0byAxMDAgZW50cmllcy4KICAgICAoQ1ZFLTIwMDktMTM3NykKICAgICBbUm9iaW4gU2VnZ2VsbWFubiwgZGlzY292ZXJlZCBieSBEYW5pZWwgTWVudHpdIAkKCiAgKikgS2VlcCBhIGNvcHkgb2YgZnJhZy0+bXNnX2hlYWRlci5mcmFnX2xlbiBzbyBpdCBjYW4gYmUgdXNlZCBhZnRlciB0aGUKICAgICBwYXJlbnQgc3RydWN0dXJlIGlzIGZyZWVkLiAgKENWRS0yMDA5LTEzNzkpCiAgICAgW0RhbmllbCBNZW50el0gCQoKICAqKSBIYW5kbGUgbm9uLWJsb2NraW5nIEkvTyBwcm9wZXJseSBpbiBTU0xfc2h1dGRvd24oKSBjYWxsLgogICAgIFtEYXJyeWwgTWlsZXMgPGRhcnJ5bC1tYWlsaW5nbGlzdHNAbmV0YmF1ZHMubmV0Pl0KCiAgKikgQWRkIDIuNS40LiogT0lEcwogICAgIFtJbHlhIE8uIDx2cmdob3N0QGdtYWlsLmNvbT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ayBhbmQgMC45LjhsICBbNSBOb3YgMjAwOV0KCiAgKikgRGlzYWJsZSByZW5lZ290aWF0aW9uIGNvbXBsZXRlbHkgLSB0aGlzIGZpeGVzIGEgc2V2ZXJlIHNlY3VyaXR5CiAgICAgcHJvYmxlbSAoQ1ZFLTIwMDktMzU1NSkgYXQgdGhlIGNvc3Qgb2YgYnJlYWtpbmcgYWxsCiAgICAgcmVuZWdvdGlhdGlvbi4gUmVuZWdvdGlhdGlvbiBjYW4gYmUgcmUtZW5hYmxlZCBieSBzZXR0aW5nCiAgICAgU1NMM19GTEFHU19BTExPV19VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT04gaW4gczMtPmZsYWdzIGF0CiAgICAgcnVuLXRpbWUuIFRoaXMgaXMgcmVhbGx5IG5vdCByZWNvbW1lbmRlZCB1bmxlc3MgeW91IGtub3cgd2hhdAogICAgIHlvdSdyZSBkb2luZy4KICAgICBbQmVuIExhdXJpZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhqIGFuZCAwLjkuOGsgIFsyNSBNYXIgMjAwOV0KCiAgKikgRG9uJ3Qgc2V0IHZhbCB0byBOVUxMIHdoZW4gZnJlZWluZyB1cCBzdHJ1Y3R1cmVzLCBpdCBpcyBmcmVlZCB1cCBieQogICAgIHVuZGVybHlpbmcgY29kZS4gSWYgc2l6ZW9mKHZvaWQgKikgPiBzaXplb2YobG9uZykgdGhpcyBjYW4gcmVzdWx0IGluCiAgICAgemVyb2luZyBwYXN0IHRoZSB2YWxpZCBmaWVsZC4gKENWRS0yMDA5LTA3ODkpCiAgICAgW1Bhb2xvIEdhbmNpIDxQYW9sby5HYW5jaUBBZE5vdnVtLkNIPl0KCiAgKikgRml4IGJ1ZyB3aGVyZSByZXR1cm4gdmFsdWUgb2YgQ01TX1NpZ25lckluZm9fdmVyaWZ5X2NvbnRlbnQoKSB3YXMgbm90CiAgICAgY2hlY2tlZCBjb3JyZWN0bHkuIFRoaXMgd291bGQgYWxsb3cgc29tZSBpbnZhbGlkIHNpZ25lZCBhdHRyaWJ1dGVzIHRvCiAgICAgYXBwZWFyIHRvIHZlcmlmeSBjb3JyZWN0bHkuIChDVkUtMjAwOS0wNTkxKQogICAgIFtJdmFuIE5lc3RsZXJvZGUgPGluZXN0bGVyb2RlQHVzLmlibS5jb20+XQoKICAqKSBSZWplY3QgVW5pdmVyc2FsU3RyaW5nIGFuZCBCTVBTdHJpbmcgdHlwZXMgd2l0aCBpbnZhbGlkIGxlbmd0aHMuIFRoaXMKICAgICBwcmV2ZW50cyBhIGNyYXNoIGluIEFTTjFfU1RSSU5HX3ByaW50X2V4KCkgd2hpY2ggYXNzdW1lcyB0aGUgc3RyaW5ncyBoYXZlCiAgICAgYSBsZWdhbCBsZW5ndGguIChDVkUtMjAwOS0wNTkwKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNldCBTL01JTUUgc2lnbmluZyBhcyB0aGUgZGVmYXVsdCBwdXJwb3NlIHJhdGhlciB0aGFuIHNldHRpbmcgaXQgCiAgICAgdW5jb25kaXRpb25hbGx5LiBUaGlzIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gb3ZlcnJpZGUgaXQgYXQgdGhlIHN0b3JlCiAgICAgbGV2ZWwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUGVybWl0IHJlc3RyaWN0ZWQgcmVjdXJzaW9uIG9mIEFTTjEgc3RyaW5ncy4gVGhpcyBpcyBuZWVkZWQgaW4gcHJhY3RpY2UKICAgICB0byBoYW5kbGUgc29tZSBzdHJ1Y3R1cmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcHJvdmUgZWZmaWNpZW5jeSBvZiBtZW1fZ2V0czogZG9uJ3Qgc2VhcmNoIHdob2xlIGJ1ZmZlciBlYWNoIHRpbWUKICAgICBmb3IgYSAnXG4nCiAgICAgW0plcmVteSBTaGFwaXJvIDxqbnNoYXBpckB1cy5pYm0uY29tPl0KCiAgKikgTmV3IC1oZXggb3B0aW9uIGZvciBvcGVuc3NsIHJhbmQuCiAgICAgW01hdHRoaWV1IEhlcnJiXQoKICAqKSBQcmludCBvdXQgVVRGOFN0cmluZyBhbmQgTnVtZXJpY1N0cmluZyB3aGVuIHBhcnNpbmcgQVNOMS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IE51bWVyaWNTdHJpbmcgdHlwZSBmb3IgbmFtZSBjb21wb25lbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IENDIGluIHRoZSBlbnZpcm9ubWVudCB0byBvdmVycmlkZSB0aGUgYXV0b21hdGljYWxseSBjaG9zZW4KICAgICBjb21waWxlci4gTm90ZSB0aGF0IG5vdGhpbmcgaXMgZG9uZSB0byBlbnN1cmUgZmxhZ3Mgd29yayB3aXRoIHRoZQogICAgIGNob3NlbiBjb21waWxlci4KICAgICBbQmVuIExhdXJpZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhpIGFuZCAwLjkuOGogIFswNyBKYW4gMjAwOV0KCiAgKikgUHJvcGVybHkgY2hlY2sgRVZQX1ZlcmlmeUZpbmFsKCkgYW5kIHNpbWlsYXIgcmV0dXJuIHZhbHVlcwogICAgIChDVkUtMjAwOC01MDc3KS4KICAgICBbQmVuIExhdXJpZSwgQm9kbyBNb2VsbGVyLCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgRW5hYmxlIFRMUyBleHRlbnNpb25zIGJ5IGRlZmF1bHQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFsbG93IHRoZSBDSElMIGVuZ2luZSB0byBiZSBsb2FkZWQsIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGlzCiAgICAgbXVsdGl0aHJlYWRlZCBvciBub3QuIChUaGlzIGRvZXMgbm90IHJlbGVhc2UgdGhlIGRldmVsb3BlciBmcm9tIHRoZQogICAgIG9ibGlnYXRpb24gdG8gc2V0IHVwIHRoZSBkeW5hbWljIGxvY2tpbmcgY2FsbGJhY2tzLikKICAgICBbU2FuZGVyIFRlbW1lIDxzYW5kZXJAdGVtbWUubmV0Pl0KCiAgKikgVXNlIGNvcnJlY3QgZXhpdCBjb2RlIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIGRnc3QgY29tbWFuZC4KICAgICBbU3RldmUgSGVuc29uOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IFJvbGFuZCBEaXJsZXdhbmdlcl0KCiAgKikgVHdlYWsgQ29uZmlndXJlIHNvIHRoYXQgeW91IG5lZWQgdG8gc2F5ICJleHBlcmltZW50YWwtanBha2UiIHRvIGVuYWJsZQogICAgIEpQQUtFLCBhbmQgbmVlZCB0byB1c2UgLURPUEVOU1NMX0VYUEVSSU1FTlRBTF9KUEFLRSBpbiBhcHBsaWNhdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGV4cGVyaW1lbnRhbCBKUEFLRSBzdXBwb3J0LCBpbmNsdWRpbmcgZGVtbyBhdXRoZW50aWNhdGlvbiBpbgogICAgIHNfY2xpZW50IGFuZCBzX3NlcnZlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgU2V0IHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIGluIHYzX2FkZHJfY2Fub25pemUoKS4KICAgICBbUm9iIEF1c3RlaW4gPHNyYUBoYWN0cm4ubmV0Pl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFhNUFAgU1RBUlRUTFMgaW4gc19jbGllbnQuCiAgICAgW1BoaWxpcCBQYWVwcyA8cGhpbGlwQGZyZWVic2Qub3JnPl0KCiAgKikgQ2hhbmdlIHRoZSBzZXJ2ZXItc2lkZSBTU0xfT1BfTkVUU0NBUEVfUkVVU0VfQ0lQSEVSX0NIQU5HRV9CVUcgYmVoYXZpb3IKICAgICB0byBlbnN1cmUgdGhhdCBldmVuIHdpdGggdGhpcyBvcHRpb24sIG9ubHkgY2lwaGVyc3VpdGVzIGluIHRoZQogICAgIHNlcnZlcidzIHByZWZlcmVuY2UgbGlzdCB3aWxsIGJlIGFjY2VwdGVkLiAgKE5vdGUgdGhhdCB0aGUgb3B0aW9uCiAgICAgYXBwbGllcyBvbmx5IHdoZW4gcmVzdW1pbmcgYSBzZXNzaW9uLCBzbyB0aGUgZWFybGllciBiZWhhdmlvciB3YXMKICAgICBqdXN0IGFib3V0IHRoZSBhbGdvcml0aG0gY2hvaWNlIGZvciBzeW1tZXRyaWMgY3J5cHRvZ3JhcGh5LikKICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGggYW5kIDAuOS44aSAgWzE1IFNlcCAyMDA4XQoKICAqKSBGaXggTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGlmIGEgRFRMUyBzZXJ2ZXIgcmVjZWl2ZWQKICAgICBDaGFuZ2VDaXBoZXJTcGVjIGFzIGZpcnN0IHJlY29yZCAoQ1ZFLTIwMDktMTM4NikuCiAgICAgW1BSICMxNjc5XQoKICAqKSBGaXggYSBzdGF0ZSB0cmFuc2l0aW9uIGluIHMzX3NydnIuYyBhbmQgZDFfc3J2ci5jCiAgICAgKHdhcyB1c2luZyBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQiwgc2hvdWxkIGJlIC4uLl9TVF9TV19TUlZSXy4uLikuCiAgICAgW05hZ2VuZHJhIE1vZGFkdWd1XQoKICAqKSBUaGUgZml4IGluIDAuOS44YyB0aGF0IHN1cHBvc2VkbHkgZ290IHJpZCBvZiB1bnNhZmUKICAgICBkb3VibGUtY2hlY2tlZCBsb2NraW5nIHdhcyBpbmNvbXBsZXRlIGZvciBSU0EgYmxpbmRpbmcsCiAgICAgYWRkcmVzc2luZyBqdXN0IG9uZSBsYXllciBvZiB3aGF0IHR1cm5zIG91dCB0byBoYXZlIGJlZW4KICAgICBkb3VibHkgdW5zYWZlIHRyaXBsZS1jaGVja2VkIGxvY2tpbmcuCgogICAgIFNvIG5vdyBmaXggdGhpcyBmb3IgcmVhbCBieSByZXRpcmluZyB0aGUgTU9OVF9IRUxQRVIgbWFjcm8KICAgICBpbiBjcnlwdG8vcnNhL3JzYV9lYXkuYy4KCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBNYXJpdXMgU2NoaWxkZXJdCgogICopIFZhcmlvdXMgcHJlY2F1dGlvbmFyeSBtZWFzdXJlczoKCiAgICAgLSBBdm9pZCBzaXplX3QgaW50ZWdlciBvdmVyZmxvdyBpbiBIQVNIX1VQREFURSAobWQzMl9jb21tb24uaCkuCgogICAgIC0gQXZvaWQgYSBidWZmZXIgb3ZlcmZsb3cgaW4gZDJpX1NTTF9TRVNTSU9OKCkgKHNzbF9hc24xLmMpLgogICAgICAgKE5COiBUaGlzIHdvdWxkIHJlcXVpcmUga25vd2xlZGdlIG9mIHRoZSBzZWNyZXQgc2Vzc2lvbiB0aWNrZXQga2V5CiAgICAgICB0byBleHBsb2l0LCBpbiB3aGljaCBjYXNlIHlvdSdkIGJlIFNPTCBlaXRoZXIgd2F5LikKCiAgICAgLSBDaGFuZ2UgYm5fbmlzdC5jIHNvIHRoYXQgaXQgd2lsbCBwcm9wZXJseSBoYW5kbGUgaW5wdXQgQklHTlVNcwogICAgICAgb3V0c2lkZSB0aGUgZXhwZWN0ZWQgcmFuZ2UuCgogICAgIC0gRW5mb3JjZSB0aGUgJ251bScgY2hlY2sgaW4gQk5fZGl2KCkgKGJuX2Rpdi5jKSBmb3Igbm9uLUJOX0RFQlVHCiAgICAgICBidWlsZHMuCgogICAgIFtOZWVsIE1laHRhLCBCb2RvIE1vZWxsZXJdCgogICopIEFsbG93IGVuZ2luZXMgdG8gYmUgInNvZnQgbG9hZGVkIiAtIGkuZS4gb3B0aW9uYWxseSBkb24ndCBkaWUgaWYKICAgICB0aGUgbG9hZCBmYWlscy4gVXNlZnVsIGZvciBkaXN0cm9zLgogICAgIFtCZW4gTGF1cmllIGFuZCB0aGUgRnJlZUJTRCB0ZWFtXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgTG9jYWwgTWFjaGluZSBLZXlzZXQgYXR0cmlidXRlIGluIFBLQ1MjMTIgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IEJOX0dGMm1fbW9kX2FycigpIHRvcC1iaXQgY2xlYW51cCBjb2RlLgogICAgIFtIdWFuZyBZaW5nXQoKICAqKSBFeHBhbmQgRU5HSU5FIHRvIHN1cHBvcnQgZW5naW5lIHN1cHBsaWVkIFNTTCBjbGllbnQgY2VydGlmaWNhdGUgZnVuY3Rpb25zLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBMb2dpY2EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIENyeXB0b0FQSSBFTkdJTkUgdG8gc3VwcG9ydCB1c2Ugb2YgUlNBIGFuZCBEU0Ega2V5cyBoZWxkIGluIFdpbmRvd3MKICAgICBrZXlzdG9yZXMuIFN1cHBvcnQgZm9yIFNTTC9UTFMgY2xpZW50IGF1dGhlbnRpY2F0aW9uIHRvby4KICAgICBOb3QgY29tcGlsZWQgdW5sZXNzIGVuYWJsZS1jYXBpZW5nIHNwZWNpZmllZCB0byBDb25maWd1cmUuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IExvZ2ljYS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYnVnIGluIFg1MDlfQVRUUklCVVRFIGNyZWF0aW9uOiBkb250IHNldCBhdHRyaWJ1dGUgdXNpbmcKICAgICBBU04xX1RZUEVfc2V0MSBpZiBNQlNUUklORyBmbGFnIHNldC4gVGhpcyBidWcgd291bGQgY3Jhc2ggY2VydGFpbgogICAgIGF0dHJpYnV0ZSBjcmVhdGlvbiByb3V0aW5lcyBzdWNoIGFzIGNlcnRpZmNhdGUgcmVxdWVzdHMgYW5kIFBLQ1MjMTIKICAgICBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGcgYW5kIDAuOS44aCAgWzI4IE1heSAyMDA4XQoKICAqKSBGaXggZmxhdyBpZiAnU2VydmVyIEtleSBleGNoYW5nZSBtZXNzYWdlJyBpcyBvbWl0dGVkIGZyb20gYSBUTFMKICAgICBoYW5kc2hha2Ugd2hpY2ggY291bGQgbGVhZCB0byBhIGNpbGVudCBjcmFzaCBhcyBmb3VuZCB1c2luZyB0aGUKICAgICBDb2Rlbm9taWNvbiBUTFMgdGVzdCBzdWl0ZSAoQ1ZFLTIwMDgtMTY3MikgCiAgICAgW1N0ZXZlIEhlbnNvbiwgTWFyayBDb3hdCgogICopIEZpeCBkb3VibGUgZnJlZSBpbiBUTFMgc2VydmVyIG5hbWUgZXh0ZW5zaW9ucyB3aGljaCBjb3VsZCBsZWFkIHRvCiAgICAgYSByZW1vdGUgY3Jhc2ggZm91bmQgYnkgQ29kZW5vbWljb24gVExTIHRlc3Qgc3VpdGUgKENWRS0yMDA4LTA4OTEpIAogICAgIFtKb2UgT3J0b25dCgogICopIENsZWFyIGVycm9yIHF1ZXVlIGluIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoKQoKICAgICBDbGVhciB0aGUgZXJyb3IgcXVldWUgdG8gZW5zdXJlIHRoYXQgZXJyb3IgZW50cmllcyBsZWZ0IGZyb20KICAgICBvbGRlciBmdW5jdGlvbiBjYWxscyBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlIGNvcnJlY3Qgb3BlcmF0aW9uLgogICAgIFtMdXR6IEphZW5pY2tlLCBFcmlrIGRlIENhc3RybyBMb3BvXQoKICAqKSBSZW1vdmUgcm9vdCBDQSBjZXJ0aWZpY2F0ZXMgb2YgY29tbWVyY2lhbCBDQXM6CgogICAgIFRoZSBPcGVuU1NMIHByb2plY3QgZG9lcyBub3QgcmVjb21tZW5kIGFueSBzcGVjaWZpYyBDQSBhbmQgZG9lcyBub3QKICAgICBoYXZlIGFueSBwb2xpY3kgd2l0aCByZXNwZWN0IHRvIGluY2x1ZGluZyBvciBleGNsdWRpbmcgYW55IENBLgogICAgIFRoZXJlZm9yZSBpdCBkb2VzIG5vdCBtYWtlIGFueSBzZW5zZSB0byBzaGlwIGFuIGFyYml0cmFyeSBzZWxlY3Rpb24KICAgICBvZiByb290IENBIGNlcnRpZmljYXRlcyB3aXRoIHRoZSBPcGVuU1NMIHNvZnR3YXJlLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBSU0EgT0FFUCBwYXRjaGVzIHRvIGZpeCB0d28gc2VwYXJhdGUgaW52YWxpZCBtZW1vcnkgcmVhZHMuCiAgICAgVGhlIGZpcnN0IG9uZSBpbnZvbHZlcyBpbnB1dHMgd2hlbiAnbHplcm8nIGlzIGdyZWF0ZXIgdGhhbgogICAgICdTSEFfRElHRVNUX0xFTkdUSCcgKGl0IHdvdWxkIHJlYWQgYWJvdXQgU0hBX0RJR0VTVF9MRU5HVEggYnl0ZXMKICAgICBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiBmcm9tKS4gVGhlIHNlY29uZCBvbmUgaW52b2x2ZXMgaW5wdXRzIHdoZXJlCiAgICAgdGhlICdkYicgc2VjdGlvbiBjb250YWlucyBub3RoaW5nIGJ1dCB6ZXJvZXMgKHRoZXJlIGlzIGEgb25lLWJ5dGUKICAgICBpbnZhbGlkIHJlYWQgYWZ0ZXIgdGhlIGVuZCBvZiAnZGInKS4KICAgICBbSXZhbiBOZXN0bGVyb2RlIDxpbmVzdGxlcm9kZUB1cy5pYm0uY29tPl0KCiAgKikgUGFydGlhbCBiYWNrcG9ydCBmcm9tIDAuOS45LWRldjoKCiAgICAgSW50cm9kdWNlIGJuX211bF9tb250IChkZWRpY2F0ZWQgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbgogICAgIHByb2NlZHVyZSkgYXMgYSBjYW5kaWRhdGUgZm9yIEJJR05VTSBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24uCiAgICAgV2hpbGUgMC45LjktZGV2IHVzZXMgYXNzZW1ibGVyIGZvciB2YXJpb3VzIGFyY2hpdGVjdHVyZXMsIG9ubHkKICAgICB4ODZfNjQgaXMgYXZhaWxhYmxlIGJ5IGRlZmF1bHQgaGVyZSBpbiB0aGUgMC45LjggYnJhbmNoLCBhbmQKICAgICAzMi1iaXQgeDg2IGlzIGF2YWlsYWJsZSB0aHJvdWdoIGEgY29tcGlsZS10aW1lIHNldHRpbmcuCgogICAgIFRvIHRyeSB0aGUgMzItYml0IHg4NiBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24sIHVzZSBDb25maWd1cmUKICAgICBvcHRpb24gImVuYWJsZS1tb250YXNtIiAod2hpY2ggZXhpc3RzIG9ubHkgZm9yIHRoaXMgYmFja3BvcnQpLgoKICAgICBBcyAiZW5hYmxlLW1vbnRhc20iIGZvciAzMi1iaXQgeDg2IGRpc2NsYWltcyBjb2RlIHN0YWJpbGl0eQogICAgIGFueXdheSwgaW4gdGhpcyBjb25zdGVsbGF0aW9uIHdlIGFjdGl2YXRlIGFkZGl0aW9uYWwgY29kZQogICAgIGJhY2twb3J0ZWQgZnJvbSAwLjkuOS1kZXYgZm9yIGZ1cnRoZXIgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLAogICAgIG5hbWVseSBCTl9mcm9tX21vbnRnb21lcnlfd29yZC4gIChUbyBlbmFibGUgdGhpcyBvdGhlcndpc2UsCiAgICAgZS5nLiB4ODZfNjQsIHRyeSAiLURNT05UX0ZST01fV09SRF9fX05PTl9ERUZBVUxUXzBfOV84X0JVSUxEIi4pCgogICAgIFtBbmR5IFBvbHlha292IChiYWNrcG9ydCBwYXJ0aWFsbHkgYnkgQm9kbyBNb2VsbGVyKV0KCiAgKikgQWRkIFRMUyBzZXNzaW9uIHRpY2tldCBjYWxsYmFjay4gVGhpcyBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gc2V0CiAgICAgVExTIHRpY2tldCBjaXBoZXIgYW5kIEhNQUMga2V5cyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGhhcmRjb2RlZCBmaXhlZAogICAgIHZhbHVlcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGtleSByb2xsb3ZlciBmb3IgZXhhbXBsZSB3aGVyZSBzZXZlcmFsIGtleQogICAgIHNldHMgbWF5IGV4aXN0IHdpdGggZGlmZmVyZW50IG5hbWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJldmVyc2UgRU5HSU5FLWludGVybmFsIGxvZ2ljIGZvciBjYWNoaW5nIGRlZmF1bHQgRU5HSU5FIGhhbmRsZXMuCiAgICAgVGhpcyB3YXMgYnJva2VuIHVudGlsIG5vdyBpbiAwLjkuOCByZWxlYXNlcywgc3VjaCB0aGF0IHRoZSBvbmx5IHdheQogICAgIGEgcmVnaXN0ZXJlZCBFTkdJTkUgY291bGQgYmUgdXNlZCAoYXNzdW1pbmcgaXQgaW5pdGlhbGlzZXMKICAgICBzdWNjZXNzZnVsbHkgb24gdGhlIGhvc3QpIHdhcyB0byBleHBsaWNpdGx5IHNldCBpdCBhcyB0aGUgZGVmYXVsdAogICAgIGZvciB0aGUgcmVsZXZhbnQgYWxnb3JpdGhtcy4gVGhpcyBpcyBpbiBjb250cmFkaWN0aW9uIHdpdGggMC45LjcKICAgICBiZWhhdmlvdXIgYW5kIHRoZSBkb2N1bWVudGF0aW9uLiBXaXRoIHRoaXMgZml4LCB3aGVuIGFuIEVOR0lORSBpcwogICAgIHJlZ2lzdGVyZWQgaW50byBhIGdpdmVuIGFsZ29yaXRobSdzIHRhYmxlIG9mIGltcGxlbWVudGF0aW9ucywgdGhlCiAgICAgJ3VwdG9kYXRlJyBmbGFnIGlzIHJlc2V0IHNvIHRoYXQgYXV0by1kaXNjb3Zlcnkgd2lsbCBiZSB1c2VkIG5leHQKICAgICB0aW1lIGEgbmV3IGNvbnRleHQgZm9yIHRoYXQgYWxnb3JpdGhtIGF0dGVtcHRzIHRvIHNlbGVjdCBhbgogICAgIGltcGxlbWVudGF0aW9uLgogICAgIFtJYW4gTGlzdGVyICh0d2Vha2VkIGJ5IEdlb2ZmIFRob3JwZSldCgogICopIEJhY2twb3J0IG9mIENNUyBjb2RlIHRvIE9wZW5TU0wgMC45LjguIFRoaXMgZGlmZmVycyBmcm9tIHRoZSAwLjkuOQogICAgIGltcGxlbWVudGlvbiBpbiB0aGUgZm9sbG93aW5nIHdheXM6CgogICAgIExhY2sgb2YgRVZQX1BLRVlfQVNOMV9NRVRIT0QgbWVhbnMgYWxnb3JpdGhtIHBhcmFtZXRlcnMgaGF2ZSB0byBiZQogICAgIGhhcmQgY29kZWQuCgogICAgIExhY2sgb2YgQkVSIHN0cmVhbWluZyBzdXBwb3J0IG1lYW5zIG9uZSBwYXNzIHN0cmVhbWluZyBwcm9jZXNzaW5nIGlzCiAgICAgb25seSBzdXBwb3J0ZWQgaWYgZGF0YSBpcyBkZXRhY2hlZDogc2V0dGluZyB0aGUgc3RyZWFtaW5nIGZsYWcgaXMKICAgICBpZ25vcmVkIGZvciBlbWJlZGRlZCBjb250ZW50LgoKICAgICBDTVMgc3VwcG9ydCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZAogICAgIHdpdGggdGhlIGVuYWJsZS1jbXMgY29uZmlndXJhdGlvbiBvcHRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIHRoZSBHTVAgZW5naW5lIGdsdWUgdG8gZG8gZGlyZWN0IGNvcGllcyBiZXR3ZWVuIEJJR05VTSBhbmQKICAgICBtcHpfdCB3aGVuIG9wZW5zc2wgYW5kIEdNUCB1c2UgdGhlIHNhbWUgbGltYiBzaXplLiBPdGhlcndpc2UgdGhlCiAgICAgZXhpc3RpbmcgImNvbnZlcnNpb24gdmlhIGEgdGV4dCBzdHJpbmcgZXhwb3J0IiB0cmljayBpcyBzdGlsbCB1c2VkLgogICAgIFtQYXVsIFNoZWVyIDxwYXVsc2hlZXJAZ21haWwuY29tPl0KCiAgKikgWmxpYiBjb21wcmVzc2lvbiBCSU8uIFRoaXMgaXMgYSBmaWx0ZXIgQklPIHdoaWNoIGNvbXByZXNzZWQgYW5kCiAgICAgdW5jb21wcmVzc2VzIGFueSBkYXRhIHBhc3NlZCB0aHJvdWdoIGl0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBBRVNfd3JhcF9rZXkoKSBhbmQgQUVTX3Vud3JhcF9rZXkoKSBmdW5jdGlvbnMgdG8gaW1wbGVtZW50CiAgICAgUkZDMzM5NCBjb21wYXRpYmxlIEFFUyBrZXkgd3JhcHBpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSBBU04xIHN0cnVjdHVyZXMuIEFTTjFfU1RSSU5HX3NldDAoKToKICAgICBzZXRzIHN0cmluZyBkYXRhIHdpdGhvdXQgY29weWluZy4gWDUwOV9BTEdPUl9zZXQwKCkgYW5kCiAgICAgWDUwOV9BTEdPUl9nZXQwKCk6IHNldCBhbmQgcmV0cmlldmUgWDUwOV9BTEdPUiAoQWxnb3JpdGhtSWRlbnRpZmllcikKICAgICBkYXRhLiBBdHRyaWJ1dGUgZnVuY3Rpb24gWDUwOWF0X2dldDBfZGF0YV9ieV9PQkooKTogcmV0cmlldmVzIGRhdGEKICAgICBmcm9tIGFuIFg1MDlfQVRUUklCVVRFIHN0cnVjdHVyZSBvcHRpb25hbGx5IGNoZWNraW5nIGl0IG9jY3VycyBvbmx5CiAgICAgb25jZS4gQVNOMV9UWVBFX3NldDEoKTogc2V0IGFuZCBBU04xX1RZUEUgc3RydWN0dXJlIGNvcHlpbmcgc3VwcGxpZWQKICAgICBkYXRhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBCTiBmbGFnIGhhbmRsaW5nIGluIFJTQV9lYXlfbW9kX2V4cCgpIGFuZCBCTl9NT05UX0NUWF9zZXQoKQogICAgIHRvIGdldCB0aGUgZXhwZWN0ZWQgQk5fRkxHX0NPTlNUVElNRSBiZWhhdmlvci4KICAgICBbQm9kbyBNb2VsbGVyIChHb29nbGUpXQogIAogICopIE5ldHdhcmUgc3VwcG9ydDoKCiAgICAgLSBmaXhlZCB3cm9uZyB1c2FnZSBvZiBpb2N0bHNvY2tldCgpIHdoZW4gYnVpbGQgZm9yIExJQkMgQlNEIHNvY2tldHMKICAgICAtIGZpeGVkIGRvX3Rlc3RzLnBsIHRvIHJ1biB0aGUgdGVzdCBzdWl0ZSB3aXRoIENMSUIgYnVpbGRzIHRvbyAoQ0xJQl9PUFQpCiAgICAgLSBhZGRlZCBzb21lIG1vcmUgdGVzdHMgdG8gZG9fdGVzdHMucGwKICAgICAtIGZpeGVkIFJ1bm5pbmdQcm9jZXNzIHVzYWdlIHNvIHRoYXQgaXQgd29ya3Mgd2l0aCBuZXdlciBMSUJDIE5ES3MgdG9vCiAgICAgLSByZW1vdmVkIHVzYWdlIG9mIEJOX0xMT05HIGZvciBDTElCIGJ1aWxkcyB0byBhdm9pZCBydW50aW1lIGRlcGVuZGVuY3kKICAgICAtIGFkZGVkIG5ldyBDb25maWd1cmUgdGFyZ2V0cyBuZXR3YXJlLWNsaWItYnNkc29jaywgbmV0d2FyZS1jbGliLWdjYywKICAgICAgIG5ldHdhcmUtY2xpYi1ic2Rzb2NrLWdjYywgbmV0d2FyZS1saWJjLWJzZHNvY2stZ2NjCiAgICAgLSB2YXJpb3VzIGNoYW5nZXMgdG8gbmV0d2FyZS5wbCB0byBlbmFibGUgZ2NjLWNyb3NzIGJ1aWxkcyBvbiBXaW4zMgogICAgICAgcGxhdGZvcm0KICAgICAtIGNoYW5nZWQgY3J5cHRvL2Jpby9iX3NvY2suYyB0byB3b3JrIHdpdGggbWFjcm8gZnVuY3Rpb25zIChDTElCIEJTRCkKICAgICAtIHZhcmlvdXMgY2hhbmdlcyB0byBmaXggbWlzc2luZyBwcm90b3R5cGUgd2FybmluZ3MKICAgICAtIGZpeGVkIHg4Nm5hc20ucGwgdG8gY3JlYXRlIGNvcnJlY3QgYXNtIGZpbGVzIGZvciBOQVNNIENPRkYgb3V0cHV0CiAgICAgLSBhZGRlZCBBRVMsIFdISVJMUE9PTCBhbmQgQ1BVSUQgYXNzZW1ibGVyIGNvZGUgdG8gYnVpbGQgZmlsZXMKICAgICAtIGFkZGVkIG1pc3NpbmcgQUVTIGFzc2VtYmxlciBtYWtlIHJ1bGVzIHRvIG1rMW1mLnBsCiAgICAgLSBmaXhlZCBvcmRlciBvZiBpbmNsdWRlcyBpbiBhcHBzL29jc3AuYyBzbyB0aGF0IGVfb3MuaCBzZXR0aW5ncyBhcHBseQogICAgIFtHdWVudGVyIEtuYXVmIDxlZmxhc2hAZ214Lm5ldD5dCgogICopIEltcGxlbWVudCBjZXJ0aWZpY2F0ZSBzdGF0dXMgcmVxdWVzdCBUTFMgZXh0ZW5zaW9uIGRlZmluZWQgaW4gUkZDMzU0Ni4KICAgICBBIGNsaWVudCBjYW4gc2V0IHRoZSBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzIGFuZCByZWNlaXZlIHRoZSBlbmNvZGVkCiAgICAgT0NTUCByZXNwb25zZSB2aWEgYSBjYWxsYmFjay4gQSBzZXJ2ZXIgY2FuIHF1ZXJ5IHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzCiAgICAgYW5kIHNldCB0aGUgZW5jb2RlZCBPQ1NQIHJlc3BvbnNlIGluIHRoZSBjYWxsYmFjay4gQWRkIHNpbXBsaWZpZWQgZXhhbXBsZXMKICAgICB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhmIGFuZCAwLjkuOGcgIFsxOSBPY3QgMjAwN10KCiAgKikgRml4IHZhcmlvdXMgYnVnczoKICAgICArIEJpbmFyeSBpbmNvbXBhdGliaWxpdHkgb2Ygc3NsX2N0eF9zdCBzdHJ1Y3R1cmUKICAgICArIERUTFMgaW50ZXJvcGVyYXRpb24gd2l0aCBub24tY29tcGxpYW50IHNlcnZlcnMKICAgICArIERvbid0IGNhbGwgZ2V0X3Nlc3Npb25fY2IoKSB3aXRob3V0IHByb3Bvc2VkIHNlc3Npb24KICAgICArIEZpeCBpYTY0IGFzc2VtYmxlciBjb2RlCiAgICAgW0FuZHkgUG9seWFrb3YsIFN0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhlIGFuZCAwLjkuOGYgIFsxMSBPY3QgMjAwN10KCiAgKikgRFRMUyBIYW5kc2hha2Ugb3ZlcmhhdWwuIFRoZXJlIHdlcmUgbG9uZ3N0YW5kaW5nIGlzc3VlcyB3aXRoCiAgICAgT3BlblNTTCBEVExTIGltcGxlbWVudGF0aW9uLCB3aGljaCB3ZXJlIG1ha2luZyBpdCBpbXBvc3NpYmxlIGZvcgogICAgIFJGQyA0MzQ3IGNvbXBsaWFudCBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBPcGVuU1NMIHNlcnZlci4KICAgICBVbmZvcnR1bmF0ZWx5IGp1c3QgZml4aW5nIHRoZXNlIGluY29tcGF0aWJpbGl0aWVzIHdvdWxkICJjdXQgb2ZmIgogICAgIHByZS0wLjkuOGYgY2xpZW50cy4gVG8gYWxsb3cgZm9yIGhhc3NsZSBmcmVlIHVwZ3JhZGUgcG9zdC0wLjkuOGUKICAgICBzZXJ2ZXIga2VlcHMgdG9sZXJhdGluZyBub24gUkZDIGNvbXBsaWFudCBzeW50YXguIFRoZSBvcHBvc2l0ZSBpcwogICAgIG5vdCB0cnVlLCAwLjkuOGYgY2xpZW50IGNhbiBub3QgY29tbXVuaWNhdGUgd2l0aCBlYXJsaWVyIHNlcnZlci4KICAgICBUaGlzIHVwZGF0ZSBldmVuIGFkZHJlc3NlcyBDVkUtMjAwNy00OTk1LgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBDaGFuZ2VzIHRvIGF2b2lkIG5lZWQgZm9yIGZ1bmN0aW9uIGNhc3RzIGluIE9wZW5TU0w6IHNvbWUgY29tcGlsZXJzCiAgICAgKGdjYyA0LjIgYW5kIGxhdGVyKSByZWplY3QgdGhlaXIgdXNlLgogICAgIFtLdXJ0IFJvZWNreCA8a3VydEByb2Vja3guYmU+LCBQZXRlciBIYXJ0bGV5IDxwZGhAdXR0ZXIuY2hhb3Mub3JnLnVrPiwKICAgICAgU3RldmUgSGVuc29uXQogIAogICopIEFkZCBSRkM0NTA3IHN1cHBvcnQgdG8gT3BlblNTTC4gVGhpcyBpbmNsdWRlcyB0aGUgY29ycmVjdGlvbnMgaW4KICAgICBSRkM0NTA3YmlzLiBUaGUgZW5jcnlwdGVkIHRpY2tldCBmb3JtYXQgaXMgYW4gZW5jcnlwdGVkIGVuY29kZWQKICAgICBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmUsIHRoYXQgd2F5IG5ldyBzZXNzaW9uIGZlYXR1cmVzIGFyZSBhdXRvbWF0aWNhbGx5CiAgICAgc3VwcG9ydGVkLgoKICAgICBJZiBhIGNsaWVudCBhcHBsaWNhdGlvbiBjYWNoZXMgc2Vzc2lvbiBpbiBhbiBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmUKICAgICBzdXBwb3J0IGlzIHRyYW5zcGFyZW50IGJlY2F1c2UgdGlja2V0cyBhcmUgbm93IHN0b3JlZCBpbiB0aGUgZW5jb2RlZAogICAgIFNTTF9TRVNTSU9OLgogICAgIAogICAgIFRoZSBTU0xfQ1RYIHN0cnVjdHVyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBrZXlzIGZvciB0aWNrZXQKICAgICBwcm90ZWN0aW9uIGluIHNlcnZlcnMgc28gYWdhaW4gc3VwcG9ydCBzaG91bGQgYmUgcG9zc2libGUKICAgICB3aXRoIG5vIGFwcGxpY2F0aW9uIG1vZGlmaWNhdGlvbi4KCiAgICAgSWYgYSBjbGllbnQgb3Igc2VydmVyIHdpc2hlcyB0byBkaXNhYmxlIFJGQzQ1MDcgc3VwcG9ydCB0aGVuIHRoZSBvcHRpb24KICAgICBTU0xfT1BfTk9fVElDS0VUIGNhbiBiZSBzZXQuCgogICAgIEFkZCBhIFRMUyBleHRlbnNpb24gZGVidWdnaW5nIGNhbGxiYWNrIHRvIGFsbG93IHRoZSBjb250ZW50cyBvZiBhbnkgY2xpZW50CiAgICAgb3Igc2VydmVyIGV4dGVuc2lvbnMgdG8gYmUgZXhhbWluZWQuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBUTFMgZXh0ZW5zaW9ucywgc3BlY2lmaWNhbGx5IGZvciB0aGUgc2VydmVyX25hbWUKICAgICBleHRlbnNpb24gc28gZmFyLiAgVGhlIFNTTF9TRVNTSU9OLCBTU0xfQ1RYLCBhbmQgU1NMIGRhdGEgc3RydWN0dXJlcyBub3cKICAgICBoYXZlIG5ldyBtZW1iZXJzIGZvciBhIGhvc3QgbmFtZS4gIFRoZSBTU0wgZGF0YSBzdHJ1Y3R1cmUgaGFzIGFuCiAgICAgYWRkaXRpb25hbCBtZW1iZXIgU1NMX0NUWCAqaW5pdGlhbF9jdHggc28gdGhhdCBuZXcgc2Vzc2lvbnMgY2FuIGJlCiAgICAgc3RvcmVkIGluIHRoYXQgY29udGV4dCB0byBhbGxvdyBmb3Igc2Vzc2lvbiByZXN1bXB0aW9uLCBldmVuIGFmdGVyIHRoZQogICAgIFNTTCBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIG5ldyBTU0xfQ1RYIGluIHJlYWN0aW9uIHRvIGEgY2xpZW50J3MKICAgICBzZXJ2ZXJfbmFtZSBleHRlbnNpb24uCgogICAgIE5ldyBmdW5jdGlvbnMgKHN1YmplY3QgdG8gY2hhbmdlKToKCiAgICAgICAgIFNTTF9nZXRfc2VydmVybmFtZSgpCiAgICAgICAgIFNTTF9nZXRfc2VydmVybmFtZV90eXBlKCkKICAgICAgICAgU1NMX3NldF9TU0xfQ1RYKCkKCiAgICAgTmV3IENUUkwgY29kZXMgYW5kIG1hY3JvcyAoc3ViamVjdCB0byBjaGFuZ2UpOgoKICAgICAgICAgU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0NCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2soKQogICAgICAgICBTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQVJHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9hcmcoKQogICAgICAgICBTU0xfQ1RSTF9TRVRfVExTRVhUX0hPU1ROQU1FICAgICAgICAgICAtIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSgpCgogICAgIG9wZW5zc2wgc19jbGllbnQgaGFzIGEgbmV3ICctc2VydmVybmFtZSAuLi4nIG9wdGlvbi4KCiAgICAgb3BlbnNzbCBzX3NlcnZlciBoYXMgbmV3IG9wdGlvbnMgJy1zZXJ2ZXJuYW1lX2hvc3QgLi4uJywgJy1jZXJ0MiAuLi4nLAogICAgICcta2V5MiAuLi4nLCAnLXNlcnZlcm5hbWVfZmF0YWwnIChzdWJqZWN0IHRvIGNoYW5nZSkuICBUaGlzIGFsbG93cwogICAgIHRlc3RpbmcgdGhlIEhvc3ROYW1lIGV4dGVuc2lvbiBmb3IgYSBzcGVjaWZpYyBzaW5nbGUgaG9zdCBuYW1lICgnLWNlcnQnCiAgICAgYW5kICcta2V5JyByZW1haW4gZmFsbGJhY2tzIGZvciBoYW5kc2hha2VzIHdpdGhvdXQgSG9zdE5hbWUKICAgICBuZWdvdGlhdGlvbikuICBJZiB0aGUgdW5yZWNvZ25pemVkX25hbWUgYWxlcnQgaGFzIHRvIGJlIHNlbnQsIHRoaXMgYnkKICAgICBkZWZhdWx0IGlzIGEgd2FybmluZzsgaXQgYmVjb21lcyBmYXRhbCB3aXRoIHRoZSAnLXNlcnZlcm5hbWVfZmF0YWwnCiAgICAgb3B0aW9uLgoKICAgICBbUGV0ZXIgU3lsdmVzdGVyLCAgUmVteSBBbGxhaXMsIENocmlzdG9waGUgUmVub3UsIFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEFFUyBhbmQgU1NFMiBhc3NlbWJseSBsYW5ndWFnZSBzdXBwb3J0IHRvIFZDKysgYnVpbGQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWl0aWdhdGUgYXR0YWNrIG9uIGZpbmFsIHN1YnRyYWN0aW9uIGluIE1vbnRnb21lcnkgcmVkdWN0aW9uLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBGaXggY3J5cHRvL2VjL2VjX211bHQuYyB0byB3b3JrIHByb3Blcmx5IHdpdGggc2NhbGFycyBvZiB2YWx1ZSAwCiAgICAgKHdoaWNoIHByZXZpb3VzbHkgY2F1c2VkIGFuIGludGVybmFsIGVycm9yKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTcXVlZXplIGFub3RoZXIgMTAlIG91dCBvZiBJR0UgbW9kZSB3aGVuIGluICE9IG91dC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQUVTIElHRSBtb2RlIHNwZWVkdXAuCiAgICAgW0RlYW4gR2F1ZGV0IChHb29nbGUpXQoKICAqKSBBZGQgdGhlIEtvcmVhbiBzeW1tZXRyaWMgMTI4LWJpdCBjaXBoZXIgU0VFRCAoc2VlCiAgICAgaHR0cDovL3d3dy5raXNhLm9yLmtyL2tpc2Evc2VlZC9qc3Avc2VlZF9lbmcuanNwKSBhbmQKICAgICBhZGQgU0VFRCBjaXBoZXJzdWl0ZXMgZnJvbSBSRkMgNDE2MjoKCiAgICAgICAgVExTX1JTQV9XSVRIX1NFRURfQ0JDX1NIQSAgICAgID0gICJTRUVELVNIQSIKICAgICAgICBUTFNfREhFX0RTU19XSVRIX1NFRURfQ0JDX1NIQSAgPSAgIkRIRS1EU1MtU0VFRC1TSEEiCiAgICAgICAgVExTX0RIRV9SU0FfV0lUSF9TRUVEX0NCQ19TSEEgID0gICJESEUtUlNBLVNFRUQtU0hBIgogICAgICAgIFRMU19ESF9hbm9uX1dJVEhfU0VFRF9DQkNfU0hBICA9ICAiQURILVNFRUQtU0hBIgoKICAgICBUbyBtaW5pbWl6ZSBjaGFuZ2VzIGJldHdlZW4gcGF0Y2hsZXZlbHMgaW4gdGhlIE9wZW5TU0wgMC45LjgKICAgICBzZXJpZXMsIFNFRUQgcmVtYWlucyBleGNsdWRlZCBmcm9tIGNvbXBpbGF0aW9uIHVubGVzcyBPcGVuU1NMCiAgICAgaXMgY29uZmlndXJlZCB3aXRoICdlbmFibGUtc2VlZCcuCiAgICAgW0tJU0EsIEJvZG8gTW9lbGxlcl0KCiAgKikgTWl0aWdhdGUgYnJhbmNoIHByZWRpY3Rpb24gYXR0YWNrcywgd2hpY2ggY2FuIGJlIHByYWN0aWNhbCBpZiBhCiAgICAgc2luZ2xlIHByb2Nlc3NvciBpcyBzaGFyZWQsIGFsbG93aW5nIGEgc3B5IHByb2Nlc3MgdG8gZXh0cmFjdAogICAgIGluZm9ybWF0aW9uLiAgRm9yIGRldGFpbGVkIGJhY2tncm91bmQgaW5mb3JtYXRpb24sIHNlZQogICAgIGh0dHA6Ly9lcHJpbnQuaWFjci5vcmcvMjAwNy8wMzkgKE8uIEFjaWljbWV6LCBTLiBHdWVyb24sCiAgICAgSi4tUC4gU2VpZmVydCwgIk5ldyBCcmFuY2ggUHJlZGljdGlvbiBWdWxuZXJhYmlsaXRpZXMgaW4gT3BlblNTTAogICAgIGFuZCBOZWNlc3NhcnkgU29mdHdhcmUgQ291bnRlcm1lYXN1cmVzIikuICBUaGUgY29yZSBvZiB0aGUgY2hhbmdlCiAgICAgYXJlIG5ldyB2ZXJzaW9ucyBCTl9kaXZfbm9fYnJhbmNoKCkgYW5kCiAgICAgQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoKCkgb2YgQk5fZGl2KCkgYW5kIEJOX21vZF9pbnZlcnNlKCksCiAgICAgcmVzcGVjdGl2ZWx5LCB3aGljaCBhcmUgc2xvd2VyLCBidXQgYXZvaWQgdGhlIHNlY3VyaXR5LXJlbGV2YW50CiAgICAgY29uZGl0aW9uYWwgYnJhbmNoZXMuICBUaGVzZSBhcmUgYXV0b21hdGljYWxseSBjYWxsZWQgYnkgQk5fZGl2KCkKICAgICBhbmQgQk5fbW9kX2ludmVyc2UoKSBpZiB0aGUgZmxhZyBCTl9GTEdfQ09OU1RUSU1FIGlzIHNldCBmb3Igb25lCiAgICAgb2YgdGhlIGlucHV0IEJJR05VTXMuICBBbHNvLCBCTl9pc19iaXRfc2V0KCkgaGFzIGJlZW4gY2hhbmdlZCB0bwogICAgIHJlbW92ZSBhIGNvbmRpdGlvbmFsIGJyYW5jaC4KCiAgICAgQk5fRkxHX0NPTlNUVElNRSBpcyB0aGUgbmV3IG5hbWUgZm9yIHRoZSBwcmV2aW91cwogICAgIEJOX0ZMR19FWFBfQ09OU1RUSU1FIGZsYWcsIHNpbmNlIGl0IG5vdyBhZmZlY3RzIG1vcmUgdGhhbiBqdXN0CiAgICAgbW9kdWxhciBleHBvbmVudGlhdGlvbi4gIChTaW5jZSBPcGVuU1NMIDAuOS43aCwgc2V0dGluZyB0aGlzIGZsYWcKICAgICBpbiB0aGUgZXhwb25lbnQgY2F1c2VzIEJOX21vZF9leHBfbW9udCgpIHRvIHVzZSB0aGUgYWx0ZXJuYXRpdmUKICAgICBpbXBsZW1lbnRhdGlvbiBpbiBCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKCkuKSAgVGhlIG9sZCBuYW1lCiAgICAgcmVtYWlucyBhcyBhIGRlcHJlY2F0ZWQgYWxpYXMuCgogICAgIFNpbWlsYXJ5LCBSU0FfRkxBR19OT19FWFBfQ09OU1RUSU1FIGlzIHJlcGxhY2VkIGJ5IGEgbW9yZSBnZW5lcmFsCiAgICAgUlNBX0ZMQUdfTk9fQ09OU1RUSU1FIGZsYWcgc2luY2UgdGhlIFJTQSBpbXBsZW1lbnRhdGlvbiBub3cgdXNlcwogICAgIGNvbnN0YW50LXRpbWUgaW1wbGVtZW50YXRpb25zIGZvciBtb3JlIHRoYW4ganVzdCBleHBvbmVudGlhdGlvbi4KICAgICBIZXJlIHRvbyB0aGUgb2xkIG5hbWUgaXMga2VwdCBhcyBhIGRlcHJlY2F0ZWQgYWxpYXMuCgogICAgIEJOX0JMSU5ESU5HX25ldygpIHdpbGwgbm93IHVzZSBCTl9kdXAoKSBmb3IgdGhlIG1vZHVsdXMgc28gdGhhdAogICAgIHRoZSBCTl9CTElORElORyBzdHJ1Y3R1cmUgZ2V0cyBhbiBpbmRlcGVuZGVudCBjb3B5IG9mIHRoZQogICAgIG1vZHVsdXMuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHByZXZpb3VzICJCSUdOVU0gKm0iIGFyZ3VtZW50IHRvCiAgICAgQk5fQkxJTkRJTkdfbmV3KCkgYW5kIHRvIEJOX0JMSU5ESU5HX2NyZWF0ZV9wYXJhbSgpIG5vdwogICAgIGVzc2VudGlhbGx5IGJlY29tZXMgImNvbnN0IEJJR05VTSAqbSIsIGFsdGhvdWdoIHdlIGNhbid0IGFjdHVhbGx5CiAgICAgY2hhbmdlIHRoaXMgaW4gdGhlIGhlYWRlciBmaWxlIGJlZm9yZSAwLjkuOS4gIEl0IGFsbG93cwogICAgIFJTQV9zZXR1cF9ibGluZGluZygpIHRvIHVzZSBCTl93aXRoX2ZsYWdzKCkgb24gdGhlIG1vZHVsdXMgdG8KICAgICBlbmFibGUgQk5fRkxHX0NPTlNUVElNRS4KCiAgICAgW01hdHRoZXcgRCBXb29kIChJbnRlbCBDb3JwKV0KCiAgKikgSW4gdGhlIFNTTC9UTFMgc2VydmVyIGltcGxlbWVudGF0aW9uLCBiZSBzdHJpY3QgYWJvdXQgc2Vzc2lvbiBJRAogICAgIGNvbnRleHQgbWF0Y2hpbmcgKHdoaWNoIG1hdHRlcnMgaWYgYW4gYXBwbGljYXRpb24gdXNlcyBhIHNpbmdsZQogICAgIGV4dGVybmFsIGNhY2hlIGZvciBkaWZmZXJlbnQgcHVycG9zZXMpLiAgUHJldmlvdXNseSwKICAgICBvdXQtb2YtY29udGV4dCByZXVzZSB3YXMgZm9yYmlkZGVuIG9ubHkgaWYgU1NMX1ZFUklGWV9QRUVSIHdhcwogICAgIHNldC4gIFRoaXMgZGlkIGVuc3VyZSBzdHJpY3QgY2xpZW50IHZlcmlmaWNhdGlvbiwgYnV0IG1lYW50IHRoYXQsCiAgICAgd2l0aCBhcHBsaWNhdGlvbnMgdXNpbmcgYSBzaW5nbGUgZXh0ZXJuYWwgY2FjaGUgZm9yIHF1aXRlCiAgICAgZGlmZmVyZW50IHJlcXVpcmVtZW50cywgY2xpZW50cyBjb3VsZCBjaXJjdW12ZW50IGNpcGhlcnN1aXRlCiAgICAgcmVzdHJpY3Rpb25zIGZvciBhIGdpdmVuIHNlc3Npb24gSUQgY29udGV4dCBieSBzdGFydGluZyBhIHNlc3Npb24KICAgICBpbiBhIGRpZmZlcmVudCBjb250ZXh0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluY2x1ZGUgIiFlTlVMTCIgaW4gU1NMX0RFRkFVTFRfQ0lQSEVSX0xJU1QgdG8gbWFrZSBzdXJlIHRoYXQKICAgICBhIGNpcGhlcnN1aXRlIHN0cmluZyBzdWNoIGFzICJERUZBVUxUOlJTQSIgY2Fubm90IGVuYWJsZQogICAgIGF1dGhlbnRpY2F0aW9uLW9ubHkgY2lwaGVyc3VpdGVzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVwZGF0ZSB0aGUgU1NMX2dldF9zaGFyZWRfY2lwaGVycygpIGZpeCBDVkUtMjAwNi0zNzM4IHdoaWNoIHdhcwogICAgIG5vdCBjb21wbGV0ZSBhbmQgY291bGQgbGVhZCB0byBhIHBvc3NpYmxlIHNpbmdsZSBieXRlIG92ZXJmbG93CiAgICAgKENWRS0yMDA3LTUxMzUpIFtCZW4gTGF1cmllXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGQgYW5kIDAuOS44ZSAgWzIzIEZlYiAyMDA3XQoKICAqKSBTaW5jZSBBRVMxMjggYW5kIEFFUzI1NiAoYW5kIHNpbWlsYXJseSBDYW1lbGxpYTEyOCBhbmQKICAgICBDYW1lbGxpYTI1Nikgc2hhcmUgYSBzaW5nbGUgbWFzayBiaXQgaW4gdGhlIGxvZ2ljIG9mCiAgICAgc3NsL3NzbF9jaXBoLmMsIHRoZSBjb2RlIGZvciBtYXNraW5nIG91dCBkaXNhYmxlZCBjaXBoZXJzIG5lZWRzIGEKICAgICBrbHVkZ2UgdG8gd29yayBwcm9wZXJseSBpZiBBRVMxMjggaXMgYXZhaWxhYmxlIGFuZCBBRVMyNTYgaXNuJ3QKICAgICAob3IgaWYgQ2FtZWxsaWExMjggaXMgYXZhaWxhYmxlIGFuZCBDYW1lbGxpYTI1NiBpc24ndCkuCiAgICAgW1ZpY3RvciBEdWNob3ZuaV0KCiAgKikgRml4IHRoZSBCSVQgU1RSSU5HIGVuY29kaW5nIGdlbmVyYXRlZCBieSBjcnlwdG8vZWMvZWNfYXNuMS5jCiAgICAgKHdpdGhpbiBpMmRfRUNQcml2YXRlS2V5LCBpMmRfRUNQS1BhcmFtZXRlcnMsIGkyZF9FQ1BhcmFtZXRlcnMpOgogICAgIFdoZW4gYSBwb2ludCBvciBhIHNlZWQgaXMgZW5jb2RlZCBpbiBhIEJJVCBTVFJJTkcsIHdlIG5lZWQgdG8KICAgICBwcmV2ZW50IHRoZSByZW1vdmFsIG9mIHRyYWlsaW5nIHplcm8gYml0cyB0byBnZXQgdGhlIHByb3BlciBERVIKICAgICBlbmNvZGluZy4gIChCeSBkZWZhdWx0LCBjcnlwdG8vYXNuMS9hX2JpdHN0ci5jIGFzc3VtZXMgdGhlIGNhc2UKICAgICBvZiBhIE5hbWVkQml0TGlzdCwgZm9yIHdoaWNoIHRyYWlsaW5nIDAgYml0cyBuZWVkIHRvIGJlIHJlbW92ZWQuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEhhdmUgU1NML1RMUyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gdG9sZXJhdGUgIm1pc21hdGNoZWQiIHJlY29yZAogICAgIHByb3RvY29sIHZlcnNpb24gd2hpbGUgcmVjZWl2aW5nIENsaWVudEhlbGxvIGV2ZW4gaWYgdGhlCiAgICAgQ2xpZW50SGVsbG8gaXMgZnJhZ21lbnRlZC4gIChUaGUgc2VydmVyIGNhbid0IGluc2lzdCBvbiB0aGUKICAgICBwYXJ0aWN1bGFyIHByb3RvY29sIHZlcnNpb24gaXQgaGFzIGNob3NlbiBiZWZvcmUgdGhlIFNlcnZlckhlbGxvCiAgICAgbWVzc2FnZSBoYXMgaW5mb3JtZWQgdGhlIGNsaWVudCBhYm91dCBoaXMgY2hvaWNlLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgUkZDIDM3Nzkgc3VwcG9ydC4KICAgICBbUm9iIEF1c3RlaW4gZm9yIEFSSU4sIEJlbiBMYXVyaWVdCgogICopIExvYWQgZXJyb3IgY29kZXMgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgcHJlc2VudCBpbnN0ZWFkIG9mIHVzaW5nIGEKICAgICBzdGF0aWMgdmFyaWFibGUuIFRoaXMgYWxsb3dzIHRoZW0gdG8gYmUgY2xlYW5seSB1bmxvYWRlZCBhbmQgcmVsb2FkZWQuCiAgICAgSW1wcm92ZSBoZWFkZXIgZmlsZSBmdW5jdGlvbiBuYW1lIHBhcnNpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgZXh0ZW5kIFNNVFAgYW5kIElNQVAgcHJvdG9jb2wgZW11bGF0aW9uIGluIHNfY2xpZW50IHRvIHVzZSBFSExPCiAgICAgb3IgQ0FQQUJJTElUWSBoYW5kc2hha2UgYXMgcmVxdWlyZWQgYnkgUkZDcy4KICAgICBbR29ldHogQmFiaW4tRWJlbGxdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44YyBhbmQgMC45LjhkICBbMjggU2VwIDIwMDZdCgogICopIEludHJvZHVjZSBsaW1pdHMgdG8gcHJldmVudCBtYWxpY2lvdXMga2V5cyBiZWluZyBhYmxlIHRvCiAgICAgY2F1c2UgYSBkZW5pYWwgb2Ygc2VydmljZS4gIChDVkUtMjAwNi0yOTQwKQogICAgIFtTdGV2ZSBIZW5zb24sIEJvZG8gTW9lbGxlcl0KCiAgKikgRml4IEFTTi4xIHBhcnNpbmcgb2YgY2VydGFpbiBpbnZhbGlkIHN0cnVjdHVyZXMgdGhhdCBjYW4gcmVzdWx0CiAgICAgaW4gYSBkZW5pYWwgb2Ygc2VydmljZS4gIChDVkUtMjAwNi0yOTM3KSAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGJ1ZmZlciBvdmVyZmxvdyBpbiBTU0xfZ2V0X3NoYXJlZF9jaXBoZXJzKCkgZnVuY3Rpb24uIAogICAgIChDVkUtMjAwNi0zNzM4KSBbVGF2aXMgT3JtYW5keSBhbmQgV2lsbCBEcmV3cnksIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBGaXggU1NMIGNsaWVudCBjb2RlIHdoaWNoIGNvdWxkIGNyYXNoIGlmIGNvbm5lY3RpbmcgdG8gYQogICAgIG1hbGljaW91cyBTU0x2MiBzZXJ2ZXIuICAoQ1ZFLTIwMDYtNDM0MykKICAgICBbVGF2aXMgT3JtYW5keSBhbmQgV2lsbCBEcmV3cnksIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBTaW5jZSAwLjkuOGIsIGNpcGhlcnN1aXRlIHN0cmluZ3MgbmFtaW5nIGV4cGxpY2l0IGNpcGhlcnN1aXRlcwogICAgIG1hdGNoIG9ubHkgdGhvc2UuICBCZWZvcmUgdGhhdCwgIkFFUzI1Ni1TSEEiIHdvdWxkIGJlIGludGVycHJldGVkCiAgICAgYXMgYSBwYXR0ZXJuIGFuZCBtYXRjaCAiQUVTMTI4LVNIQSIgdG9vIChzaW5jZSBBRVMxMjgtU0hBIGdvdAogICAgIHRoZSBzYW1lIHN0cmVuZ3RoIGNsYXNzaWZpY2F0aW9uIGluIDAuOS43aCkgYXMgd2UgY3VycmVudGx5IG9ubHkKICAgICBoYXZlIGEgc2luZ2xlIEFFUyBiaXQgaW4gdGhlIGNpcGhlcnN1aXRlIGRlc2NyaXB0aW9uIGJpdG1hcC4KICAgICBUaGF0IGNoYW5nZSwgaG93ZXZlciwgYWxzbyBhcHBsaWVkIHRvIGNpcGhlcnN1aXRlIHN0cmluZ3Mgc3VjaCBhcwogICAgICJSQzQtTUQ1IiB0aGF0IGludGVudGlvbmFsbHkgbWF0Y2hlZCBtdWx0aXBsZSBjaXBoZXJzdWl0ZXMgLS0KICAgICBuYW1lbHksIFNTTCAyLjAgY2lwaGVyc3VpdGVzIGluIGFkZGl0aW9uIHRvIHRoZSBtb3JlIGNvbW1vbiBvbmVzCiAgICAgZnJvbSBTU0wgMy4wL1RMUyAxLjAuCgogICAgIFNvIHdlIGNoYW5nZSB0aGUgc2VsZWN0aW9uIGFsZ29yaXRobSBhZ2FpbjogTmFtaW5nIGFuIGV4cGxpY2l0CiAgICAgY2lwaGVyc3VpdGUgc2VsZWN0cyB0aGlzIG9uZSBjaXBoZXJzdWl0ZSwgYW5kIGFueSBvdGhlciBzaW1pbGFyCiAgICAgY2lwaGVyc3VpdGUgKHNhbWUgYml0bWFwKSBmcm9tICpvdGhlciogcHJvdG9jb2wgdmVyc2lvbnMuCiAgICAgVGh1cywgIlJDNC1NRDUiIGFnYWluIHdpbGwgcHJvcGVybHkgc2VsZWN0IGJvdGggdGhlIFNTTCAyLjAKICAgICBjaXBoZXJzdWl0ZSBhbmQgdGhlIFNTTCAzLjAvVExTIDEuMCBjaXBoZXJzdWl0ZS4KCiAgICAgU2luY2UgU1NMIDIuMCBkb2VzIG5vdCBoYXZlIGFueSBjaXBoZXJzdWl0ZXMgZm9yIHdoaWNoIHRoZQogICAgIDEyOC8yNTYgYml0IGRpc3RpbmN0aW9uIHdvdWxkIGJlIHJlbGV2YW50LCB0aGlzIHdvcmtzIGZvciBub3cuCiAgICAgVGhlIHByb3BlciBmaXggd2lsbCBiZSB0byB1c2UgZGlmZmVyZW50IGJpdHMgZm9yIEFFUzEyOCBhbmQKICAgICBBRVMyNTYsIHdoaWNoIHdvdWxkIGhhdmUgYXZvaWRlZCB0aGUgcHJvYmxlbXMgZnJvbSB0aGUgYmVnaW5uaW5nOwogICAgIGhvd2V2ZXIsIGJpdHMgYXJlIHNjYXJjZSwgc28gd2UgY2FuIG9ubHkgZG8gdGhpcyBpbiBhIG5ldyByZWxlYXNlCiAgICAgKG5vdCBqdXN0IGEgcGF0Y2hsZXZlbCkgd2hlbiB3ZSBjYW4gY2hhbmdlIHRoZSBTU0xfQ0lQSEVSCiAgICAgZGVmaW5pdGlvbiB0byBzcGxpdCB0aGUgc2luZ2xlICd1bnNpZ25lZCBsb25nIG1hc2snIGJpdG1hcCBpbnRvCiAgICAgbXVsdGlwbGUgdmFsdWVzIHRvIGV4dGVuZCB0aGUgYXZhaWxhYmxlIHNwYWNlLgoKICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGIgYW5kIDAuOS44YyAgWzA1IFNlcCAyMDA2XQoKICAqKSBBdm9pZCBQS0NTICMxIHYxLjUgc2lnbmF0dXJlIGF0dGFjayBkaXNjb3ZlcmVkIGJ5IERhbmllbCBCbGVpY2hlbmJhY2hlcgogICAgIChDVkUtMjAwNi00MzM5KSAgW0JlbiBMYXVyaWUgYW5kIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBBZGQgQUVTIElHRSBhbmQgYmlJR0UgbW9kZXMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENoYW5nZSB0aGUgVW5peCByYW5kb21uZXNzIGVudHJvcHkgZ2F0aGVyaW5nIHRvIHVzZSBwb2xsKCkgd2hlbgogICAgIHBvc3NpYmxlIGluc3RlYWQgb2Ygc2VsZWN0KCksIHNpbmNlIHRoZSBsYXR0ZXIgaGFzIHNvbWUKICAgICB1bmRlc2lyYWJsZSBsaW1pdGF0aW9ucy4KICAgICBbRGFycnlsIE1pbGVzIHZpYSBSaWNoYXJkIExldml0dGUgYW5kIEJvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSAiRUNDZHJhZnQiIGNpcGhlcnN1aXRlcyBtb3JlIHRob3JvdWdobHkuICBOb3cgc3BlY2lhbAogICAgIHRyZWF0bWVudCBpbiBzc2wvc3NsX2NpcGgucyBtYWtlcyBzdXJlIHRoYXQgdGhlc2UgY2lwaGVyc3VpdGVzCiAgICAgY2Fubm90IGJlIGltcGxpY2l0bHkgYWN0aXZhdGVkIGFzIHBhcnQgb2YsIGUuZy4sIHRoZSAiQUVTIiBhbGlhcy4KICAgICBIb3dldmVyLCBwbGVhc2UgdXBncmFkZSB0byBPcGVuU1NMIDAuOS45Wy1kZXZdIGZvcgogICAgIG5vbi1leHBlcmltZW50YWwgdXNlIG9mIHRoZSBFQ0MgY2lwaGVyc3VpdGVzIHRvIGdldCBUTFMgZXh0ZW5zaW9uCiAgICAgc3VwcG9ydCwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGN1cnZlIGFuZCBwb2ludCBmb3JtYXQgbmVnb3RpYXRpb24KICAgICB0byBhdm9pZCBwb3RlbnRpYWwgaGFuZHNoYWtlIHByb2JsZW1zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERpc2FibGUgcm9ndWUgY2lwaGVyc3VpdGVzOgoKICAgICAgLSBTU0x2MiAweDA4IDB4MDAgMHg4MCAoIlJDNC02NC1NRDUiKQogICAgICAtIFNTTHYzL1RMU3YxIDB4MDAgMHg2MSAoIkVYUDEwMjQtUkMyLUNCQy1NRDUiKQogICAgICAtIFNTTHYzL1RMU3YxIDB4MDAgMHg2MCAoIkVYUDEwMjQtUkM0LU1ENSIpCgogICAgIFRoZSBsYXR0ZXIgdHdvIHdlcmUgcHVycG9ydGVkbHkgZnJvbQogICAgIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMFswMV0udHh0LCBidXQgZG8gbm90IHJlYWxseQogICAgIGFwcGVhciB0aGVyZS4KCiAgICAgQWxzbyBkZWFjdGl2YXRlIHRoZSByZW1haW5pbmcgY2lwaGVyc3VpdGVzIGZyb20KICAgICBkcmFmdC1pZXRmLXRscy01Ni1iaXQtY2lwaGVyc3VpdGVzLTAxLnR4dC4gIFRoZXNlIGFyZSBqdXN0IGFzCiAgICAgdW5vZmZpY2lhbCwgYW5kIHRoZSBJRCBoYXMgbG9uZyBleHBpcmVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBSU0EgYmxpbmRpbmcgSGVpc2VuYnVnIChwcm9ibGVtcyBzb21ldGltZXMgb2NjdXJlZCBvbgogICAgIGR1YWwtY29yZSBtYWNoaW5lcykgYW5kIG90aGVyIHBvdGVudGlhbCB0aHJlYWQtc2FmZXR5IGlzc3Vlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgdGhlIHN5bW1ldHJpYyBjaXBoZXIgQ2FtZWxsaWEgKDEyOC1iaXQsIDE5Mi1iaXQsIDI1Ni1iaXQga2V5CiAgICAgdmVyc2lvbnMpLCB3aGljaCBpcyBub3cgYXZhaWxhYmxlIGZvciByb3lhbHR5LWZyZWUgdXNlCiAgICAgKHNlZSBodHRwOi8vaW5mby5pc2wubnR0LmNvLmpwL2NyeXB0L2VuZy9pbmZvL2NoaXRla2kuaHRtbCkuCiAgICAgQWxzbywgYWRkIENhbWVsbGlhIFRMUyBjaXBoZXJzdWl0ZXMgZnJvbSBSRkMgNDEzMi4KCiAgICAgVG8gbWluaW1pemUgY2hhbmdlcyBiZXR3ZWVuIHBhdGNobGV2ZWxzIGluIHRoZSBPcGVuU1NMIDAuOS44CiAgICAgc2VyaWVzLCBDYW1lbGxpYSByZW1haW5zIGV4Y2x1ZGVkIGZyb20gY29tcGlsYXRpb24gdW5sZXNzIE9wZW5TU0wKICAgICBpcyBjb25maWd1cmVkIHdpdGggJ2VuYWJsZS1jYW1lbGxpYScuCiAgICAgW05UVF0KCiAgKikgRGlzYWJsZSB0aGUgcGFkZGluZyBidWcgY2hlY2sgd2hlbiBjb21wcmVzc2lvbiBpcyBpbiB1c2UuIFRoZSBwYWRkaW5nCiAgICAgYnVnIGNoZWNrIGFzc3VtZXMgdGhlIGZpcnN0IHBhY2tldCBpcyBvZiBldmVuIGxlbmd0aCwgdGhpcyBpcyBub3QKICAgICBuZWNlc3NhcmlseSB0cnVlIGlmIGNvbXByZXNzc2lvbiBpcyBlbmFibGVkIGFuZCBjYW4gcmVzdWx0IGluIGZhbHNlCiAgICAgcG9zaXRpdmVzIGNhdXNpbmcgaGFuZHNoYWtlIGZhaWx1cmUuIFRoZSBhY3R1YWwgYnVnIHRlc3QgaXMgYW5jaWVudAogICAgIGNvZGUgc28gaXQgaXMgaG9wZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBlaXRoZXIgaGF2ZSBmaXhlZCBpdCBieQogICAgIG5vdyBvciBhbnkgd2hpY2ggc3RpbGwgaGF2ZSB0aGUgYnVnIGRvIG5vdCBzdXBwb3J0IGNvbXByZXNzaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44YSBhbmQgMC45LjhiICBbMDQgTWF5IDIwMDZdCgogICopIFdoZW4gYXBwbHlpbmcgYSBjaXBoZXIgcnVsZSBjaGVjayB0byBzZWUgaWYgc3RyaW5nIG1hdGNoIGlzIGFuIGV4cGxpY2l0CiAgICAgY2lwaGVyIHN1aXRlIGFuZCBvbmx5IG1hdGNoIHRoYXQgb25lIGNpcGhlciBzdWl0ZSBpZiBpdCBpcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBMaW5rIGluIG1hbmlmZXN0cyBmb3IgVkMrKyBpZiBuZWVkZWQuCiAgICAgW0F1c3RpbiBaaWVnbGVyIDxoYWxvc3RhdHVlQGdtYWlsLmNvbT5dCgogICopIFVwZGF0ZSBzdXBwb3J0IGZvciBFQ0MtYmFzZWQgVExTIGNpcGhlcnN1aXRlcyBhY2NvcmRpbmcgdG8KICAgICBkcmFmdC1pZXRmLXRscy1lY2MtMTIudHh0IHdpdGggcHJvcG9zZWQgY2hhbmdlcyAoYnV0IHdpdGhvdXQKICAgICBUTFMgZXh0ZW5zaW9ucywgd2hpY2ggYXJlIHN1cHBvcnRlZCBzdGFydGluZyB3aXRoIHRoZSAwLjkuOQogICAgIGJyYW5jaCwgbm90IGluIHRoZSBPcGVuU1NMIDAuOS44IGJyYW5jaCkuCiAgICAgW0RvdWdsYXMgU3RlYmlsYV0KCiAgKikgTmV3IGZ1bmN0aW9ucyBFVlBfQ0lQSEVSX0NUWF9uZXcoKSBhbmQgRVZQX0NJUEhFUl9DVFhfZnJlZSgpIHRvIHN1cHBvcnQKICAgICBvcGFxdWUgRVZQX0NJUEhFUl9DVFggaGFuZGxpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgYW5kIGVuaGFuY2VtZW50cyB0byB6bGliIGNvbXByZXNzaW9uIGNvZGUuIFdlIG5vdyBvbmx5IHVzZQogICAgICJ6bGliMS5kbGwiIGFuZCB1c2UgdGhlIGRlZmF1bHQgX19jZGVjbCBjYWxsaW5nIGNvbnZlbnRpb24gb24gV2luMzIKICAgICB0byBjb25mb3JtIHdpdGggdGhlIHN0YW5kYXJkcyBtZW50aW9uZWQgaGVyZToKICAgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0L0RMTF9GQVEudHh0CiAgICAgU3RhdGljIHpsaWIgbGlua2luZyBub3cgd29ya3Mgb24gV2luZG93cyBhbmQgdGhlIG5ldyAtLXdpdGgtemxpYi1pbmNsdWRlCiAgICAgLS13aXRoLXpsaWItbGliIG9wdGlvbnMgdG8gQ29uZmlndXJlIGNhbiBiZSB1c2VkIHRvIHN1cHBseSB0aGUgbG9jYXRpb24KICAgICBvZiB0aGUgaGVhZGVycyBhbmQgbGlicmFyeS4gR3JhY2VmdWxseSBoYW5kbGUgY2FzZSB3aGVyZSB6bGliIGxpYnJhcnkKICAgICBjYW4ndCBiZSBsb2FkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU2V2ZXJhbCBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzIHRvIHRoZSBPSUQgZ2VuZXJhdGlvbiBjb2RlLiBUaGUgb2xkIGNvZGUKICAgICBzb21ldGltZXMgYWxsb3dlZCBpbnZhbGlkIE9JRHMgKDEuWCBmb3IgWCA+PSA0MCBmb3IgZXhhbXBsZSksIGNvdWxkbid0CiAgICAgaGFuZGxlIG51bWJlcnMgbGFyZ2VyIHRoYW4gVUxPTkdfTUFYLCB0cnVuY2F0ZWQgcHJpbnRpbmcgYW5kIGhhZCBhCiAgICAgbm9uIHN0YW5kYXJkIE9CSl9vYmoydHh0KCkgYmVoYXZpb3VyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyBvZiBlbmdpbmVzIHVuZGVyIGVuZ2luZS8gYXMgc2hhcmVkIGxpYnJhcmllcwogICAgIHVuZGVyIFZDKysgYnVpbGQgc3lzdGVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvcnJlY3RlZCB0aGUgbnVtZXJvdXMgYnVncyBpbiB0aGUgV2luMzIgcGF0aCBzcGxpdHRlciBpbiBEU08uCiAgICAgSG9wZWZ1bGx5LCB3ZSB3aWxsIG5vdCBzZWUgYW55IGZhbHNlIGNvbWJpbmF0aW9uIG9mIHBhdGhzIGFueSBtb3JlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44IGFuZCAwLjkuOGEgIFsxMSBPY3QgMjAwNV0KCiAgKikgUmVtb3ZlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFNTTF9PUF9NU0lFX1NTTFYyX1JTQV9QQURESU5HCiAgICAgKHBhcnQgb2YgU1NMX09QX0FMTCkuICBUaGlzIG9wdGlvbiB1c2VkIHRvIGRpc2FibGUgdGhlCiAgICAgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBtYW4taW4tdGhlLW1pZGRsZSBwcm90b2NvbC12ZXJzaW9uCiAgICAgcm9sbGJhY2sgaW4gdGhlIFNTTCAyLjAgc2VydmVyIGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBhIGJhZAogICAgIGlkZWEuICAoQ1ZFLTIwMDUtMjk2OSkKCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBZdXRha2EgT2l3YSAoUmVzZWFyY2ggQ2VudGVyCiAgICAgZm9yIEluZm9ybWF0aW9uIFNlY3VyaXR5LCBOYXRpb25hbCBJbnN0aXR1dGUgb2YgQWR2YW5jZWQgSW5kdXN0cmlhbAogICAgIFNjaWVuY2UgYW5kIFRlY2hub2xvZ3kgW0FJU1RdLCBKYXBhbildCgogICopIEFkZCB0d28gZnVuY3Rpb24gdG8gY2xlYXIgYW5kIHJldHVybiB0aGUgdmVyaWZ5IHBhcmFtZXRlciBmbGFncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBLZWVwIGNpcGhlcmxpc3RzIHNvcnRlZCBpbiB0aGUgc291cmNlIGluc3RlYWQgb2Ygc29ydGluZyB0aGVtIGF0CiAgICAgcnVudGltZSwgdGh1cyByZW1vdmluZyB0aGUgbmVlZCBmb3IgYSBsb2NrLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgQXZvaWQgc29tZSBzbWFsbCBzdWJncm91cCBhdHRhY2tzIGluIERpZmZpZS1IZWxsbWFuLgogICAgIFtOaWNrIE1hdGhld3NvbiBhbmQgQmVuIExhdXJpZV0KCiAgKikgQWRkIGZ1bmN0aW9ucyBmb3Igd2VsbC1rbm93biBwcmltZXMuCiAgICAgW05pY2sgTWF0aGV3c29uXQoKICAqKSBFeHRlbmRlZCBXaW5kb3dzIENFIHN1cHBvcnQuCiAgICAgW1NhdG9zaGkgTmFrYW11cmEgYW5kIEFuZHkgUG9seWFrb3ZdCgogICopIEluaXRpYWxpemUgU1NMX01FVEhPRCBzdHJ1Y3R1cmVzIGF0IGNvbXBpbGUgdGltZSBpbnN0ZWFkIG9mIGR1cmluZwogICAgIHJ1bnRpbWUsIHRodXMgcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIGEgbG9jay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFBLQ1M3X2RlY3J5cHQoKSB3b3JrIGV2ZW4gaWYgbm8gY2VydGlmaWNhdGUgaXMgc3VwcGxpZWQgYnkKICAgICBhdHRlbXB0aW5nIHRvIGRlY3J5cHQgZWFjaCBlbmNyeXB0ZWQga2V5IGluIHR1cm4uIEFkZCBzdXBwb3J0IHRvCiAgICAgc21pbWUgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2ggYW5kIDAuOS44ICBbMDUgSnVsIDIwMDVdCgogIFtOQjogT3BlblNTTCAwLjkuN2kgYW5kIGxhdGVyIDAuOS43IHBhdGNoIGxldmVscyB3ZXJlIHJlbGVhc2VkIGFmdGVyCiAgT3BlblNTTCAwLjkuOC5dCgogICopIEFkZCBsaWJjcnlwdG8ucGMgYW5kIGxpYnNzbC5wYyBmb3IgdGhvc2Ugd2hvIGZlZWwgdGhleSBuZWVkIHRoZW0uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIENBLnNoIGFuZCBDQS5wbCBzbyB0aGV5IGRvbid0IGJ1bmRsZSB0aGUgQ1NSIGFuZCB0aGUgcHJpdmF0ZQogICAgIGtleSBpbnRvIHRoZSBzYW1lIGZpbGUgYW55IG1vcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgV2luNjQsIGJvdGggSUE2NCBhbmQgQU1ENjQveDY0IGZsYXZvcnMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCAtdXRmOCBjb21tYW5kIGxpbmUgYW5kIGNvbmZpZyBmaWxlIG9wdGlvbiB0byAnY2EnLgogICAgIFtTdGVmYW4gPHN0ZkB1ZG9tYS5vcmddCgogICopIFJlbW92ZWQgdGhlIG1hY3JvIGRlc19jcnlwdCgpLCBhcyBpdCBzZWVtcyB0byBjb25mbGljdCB3aXRoIHNvbWUKICAgICBsaWJyYXJpZXMuICBVc2UgREVTX2NyeXB0KCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ29ycmVjdCBuYW1pbmcgb2YgdGhlICdjaGlsJyBhbmQgJzQ3NThjY2EnIEVOR0lORXMuIFRoaXMKICAgICBpbnZvbHZlcyByZW5hbWluZyB0aGUgc291cmNlIGFuZCBnZW5lcmF0ZWQgc2hhcmVkLWxpYnMgZm9yCiAgICAgYm90aC4gVGhlIGVuZ2luZXMgd2lsbCBhY2NlcHQgdGhlIGNvcnJlY3RlZCBvciBsZWdhY3kgaWRzCiAgICAgKCduY2lwaGVyJyBhbmQgJzQ3NThfY2NhJyByZXNwZWN0aXZlbHkpIHdoZW4gYmluZGluZy4gTkIsCiAgICAgdGhpcyBvbmx5IGFwcGxpZXMgd2hlbiBidWlsZGluZyAnc2hhcmVkJy4KICAgICBbQ29yaW5uYSBWaW5zY2hlbiA8dmluc2NoZW5AcmVkaGF0LmNvbT4gYW5kIEdlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGF0dHJpYnV0ZSBmdW5jdGlvbnMgdG8gRVZQX1BLRVkgc3RydWN0dXJlLiBNb2RpZnkKICAgICBQS0NTMTJfY3JlYXRlKCkgdG8gcmVjb2duaXplIGEgQ1NQIG5hbWUgYXR0cmlidXRlIGFuZAogICAgIHVzZSBpdC4gTWFrZSAtQ1NQIG9wdGlvbiB3b3JrIGFnYWluIGluIHBrY3MxMiB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZnVuY3Rpb25hbGl0eSB0byB0aGUgYm4gYmxpbmRpbmcgY29kZToKICAgICAtIGF1dG9tYXRpYyByZS1jcmVhdGlvbiBvZiB0aGUgQk5fQkxJTkRJTkcgcGFyYW1ldGVycyBhZnRlcgogICAgICAgYSBmaXhlZCBudW1iZXIgb2YgdXNlcyAoY3VycmVudGx5IDMyKQogICAgIC0gYWRkIG5ldyBmdW5jdGlvbiBmb3IgcGFyYW1ldGVyIGNyZWF0aW9uCiAgICAgLSBpbnRyb2R1Y2UgZmxhZ3MgdG8gY29udHJvbCB0aGUgdXBkYXRlIGJlaGF2aW91ciBvZiB0aGUKICAgICAgIEJOX0JMSU5ESU5HIHBhcmFtZXRlcnMKICAgICAtIGhpZGUgQk5fQkxJTkRJTkcgc3RydWN0dXJlCiAgICAgQWRkIGEgc2Vjb25kIEJOX0JMSU5ESU5HIHNsb3QgdG8gdGhlIFJTQSBzdHJ1Y3R1cmUgdG8gaW1wcm92ZQogICAgIHBlcmZvcm1hbmNlIHdoZW4gYSBzaW5nbGUgUlNBIG9iamVjdCBpcyBzaGFyZWQgYW1vbmcgc2V2ZXJhbAogICAgIHRocmVhZHMuCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRFRMUy4KICAgICBbTmFnZW5kcmEgTW9kYWR1Z3UgPG5hZ2VuZHJhQGNzLnN0YW5mb3JkLmVkdT4gYW5kIEJlbiBMYXVyaWVdCgogICopIEFkZCBzdXBwb3J0IGZvciBERVIgZW5jb2RlZCBwcml2YXRlIGtleXMgKFNTTF9GSUxFVFlQRV9BU04xKQogICAgIHRvIFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZSgpIGFuZCBTU0xfdXNlX1ByaXZhdGVLZXlfZmlsZSgpCiAgICAgW1dhbHRlciBHb3VsZXRdCgogICopIFJlbW92ZSBidWdneSBhbmQgaW5jb21wbGV0ZSBESCBjZXJ0IHN1cHBvcnQgZnJvbQogICAgIHNzbC9zc2xfcnNhLmMgYW5kIHNzbC9zM19ib3RoLmMKICAgICBbTmlscyBMYXJzY2hdCgogICopIFVzZSBTSEEtMSBpbnN0ZWFkIG9mIE1ENSBhcyB0aGUgZGVmYXVsdCBkaWdlc3QgYWxnb3JpdGhtIGZvcgogICAgIHRoZSBhcHBzL29wZW5zc2wgYXBwbGljYXRpb25zLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgQ29tcGlsZSBjbGVhbiB3aXRoICItV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcwogICAgIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV2Vycm9yIi4gQ3VycmVudGx5CiAgICAgREVCVUdfU0FGRVNUQUNLIG11c3QgYWxzbyBiZSBzZXQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENoYW5nZSAuL0NvbmZpZ3VyZSBzbyB0aGF0IGNlcnRhaW4gYWxnb3JpdGhtcyBjYW4gYmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4KICAgICBUaGUgbmV3IGNvdW50ZXJwaWVjZSB0byAibm8teHh4IiBpcyAiZW5hYmxlLXh4eCIuCgogICAgIFRoZSBwYXRlbnRlZCBSQzUgYW5kIE1EQzIgYWxnb3JpdGhtcyB3aWxsIG5vdyBiZSBkaXNhYmxlZCB1bmxlc3MKICAgICAiZW5hYmxlLXJjNSIgYW5kICJlbmFibGUtbWRjMiIsIHJlc3BlY3RpdmVseSwgYXJlIHNwZWNpZmllZC4KCiAgICAgKElERUEgcmVtYWlucyBlbmFibGVkIGRlc3BpdGUgYmVpbmcgcGF0ZW50ZWQuICBUaGlzIGlzIGJlY2F1c2UgSURFQQogICAgIGlzIGZyZXF1ZW50bHkgcmVxdWlyZWQgZm9yIGludGVyb3BlcmFiaWxpdHksIGFuZCB0aGVyZSBpcyBubyBsaWNlbnNlCiAgICAgZmVlIGZvciBub24tY29tbWVyY2lhbCB1c2UuICBBcyBiZWZvcmUsICJuby1pZGVhIiBjYW4gYmUgdXNlZCB0bwogICAgIGF2b2lkIHRoaXMgYWxnb3JpdGhtLikKCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHByb2Nlc3Npbmcgb2YgcHJveHkgY2VydGlmaWNhdGVzIChzZWUgUkZDIDM4MjApLiAgVGhpcyB3b3JrIHdhcwogICAgIHNwb25zb3JlZCBieSBLVEggKFRoZSBSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSBpbiBTdG9ja2hvbG0pIGFuZAogICAgIEVHRUUgKEVuYWJsaW5nIEdyaWRzIGZvciBFLXNjaWVuY2UgaW4gRXVyb3BlKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSQzQgcGVyZm9ybWFuY2Ugb3ZlcmhhdWwgb24gbW9kZXJuIGFyY2hpdGVjdHVyZXMvaW1wbGVtZW50YXRpb25zLCBzdWNoCiAgICAgYXMgSW50ZWwgUDQsIElBLTY0IGFuZCBBTUQ2NC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTmV3IHV0aWxpdHkgZXh0cmFjdC1zZWN0aW9uLnBsLiBUaGlzIGNhbiBiZSB1c2VkIHNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUKICAgICBzZWN0aW9uIG51bWJlciBpbiBhIHBvZCBmaWxlIGluc3RlYWQgb2YgaGF2aW5nIHRvIHRyZWF0IGVhY2ggZmlsZSBhcwogICAgIGEgc2VwYXJhdGUgY2FzZSBpbiBNYWtlZmlsZS4gVGhpcyBjYW4gYmUgZG9uZSBieSBhZGRpbmcgdHdvIGxpbmVzIHRvIHRoZQogICAgIHBvZCBmaWxlOgoKICAgICA9Zm9yIGNvbW1lbnQgb3BlbnNzbF9zZWN0aW9uOlhYWAoKICAgICBUaGUgYmxhbmsgbGluZSBpcyBtYW5kYXRvcnkuCgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBhcmd1bWVudHMgLWNlcnRmb3JtLCAta2V5Zm9ybSBhbmQgLXBhc3MgZm9yIHNfY2xpZW50IGFuZCBzX3NlcnZlcgogICAgIHRvIGFsbG93IGFsdGVybmF0aXZlIGZvcm1hdCBrZXkgYW5kIGNlcnRpZmljYXRlIGZpbGVzIGFuZCBwYXNzcGhyYXNlCiAgICAgc291cmNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgc3RydWN0dXJlIFg1MDlfVkVSSUZZX1BBUkFNIHdoaWNoIGNvbWJpbmVzIGN1cnJlbnQgdmVyaWZ5IHBhcmFtZXRlcnMsCiAgICAgdXBkYXRlIGFzc29jaWF0ZWQgc3RydWN0dXJlcyBhbmQgYWRkIHZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMuCgogICAgIEFkZCBuZXcgcG9saWN5IHJlbGF0ZWQgdmVyaWZ5IHBhcmFtZXRlcnMsIGluY2x1ZGUgcG9saWN5IGNoZWNraW5nIGluIAogICAgIHN0YW5kYXJkIHZlcmlmeSBjb2RlLiBFbmhhbmNlICdzbWltZScgYXBwbGljYXRpb24gd2l0aCBleHRyYSBwYXJhbWV0ZXJzCiAgICAgdG8gc3VwcG9ydCBwb2xpY3kgY2hlY2tpbmcgYW5kIHByaW50IG91dC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgZW5naW5lIHRvIHN1cHBvcnQgVklBIFBhZExvY2sgQUNFIGV4dGVuc2lvbnMgaW4gdGhlIFZJQSBDMwogICAgIE5laGVtaWFoIHByb2Nlc3NvcnMuIFRoZXNlIGV4dGVuc2lvbnMgc3VwcG9ydCBBRVMgZW5jcnlwdGlvbiBpbiBoYXJkd2FyZQogICAgIGFzIHdlbGwgYXMgUk5HICh0aG91Z2ggUk5HIHN1cHBvcnQgaXMgY3VycmVudGx5IGRpc2FibGVkKS4KICAgICBbTWljaGFsIEx1ZHZpZyA8bWljaGFsQGxvZ2l4LmN6Piwgd2l0aCBoZWxwIGZyb20gQW5keSBQb2x5YWtvdl0KCiAgKikgRGVwcmVjYXRlIEJOX1tnZXR8c2V0XV9wYXJhbXMoKSBmdW5jdGlvbnMgKHRoZXkgd2VyZSBpZ25vcmVkIGludGVybmFsbHkpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE5ldyBGSVBTIDE4MC0yIGFsZ29yaXRobXMsIFNIQS0yMjQvLTI1Ni8tMzg0Ly01MTIgYXJlIGltcGxlbWVudGVkLgogICAgIFtBbmR5IFBvbHlha292IGFuZCBhIG51bWJlciBvZiBvdGhlciBwZW9wbGVdCgogICopIEltcHJvdmVkIFBvd2VyUEMgcGxhdGZvcm0gc3VwcG9ydC4gTW9zdCBub3RhYmx5IEJJR05VTSBhc3NlbWJsZXIKICAgICBpbXBsZW1lbnRhdGlvbiBjb250cmlidXRlZCBieSBJQk0uCiAgICAgW1N1cmVzaCBDaGFyaSwgUGV0ZXIgV2FsdGVuYmVyZywgQW5keSBQb2x5YWtvdl0KCiAgKikgVGhlIG5ldyAnUlNBX2dlbmVyYXRlX2tleV9leCcgZnVuY3Rpb24gbm93IHRha2VzIGEgQklHTlVNIGZvciB0aGUgcHVibGljCiAgICAgZXhwb25lbnQgcmF0aGVyIHRoYW4gJ3Vuc2lnbmVkIGxvbmcnLiBUaGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgY2hhbmdlIHRvCiAgICAgdGhlIG5ldyAncnNhX2tleWdlbicgZWxlbWVudCBvZiB0aGUgUlNBX01FVEhPRCBzdHJ1Y3R1cmUuCiAgICAgW0plbHRlIEphbnNlbiwgR2VvZmYgVGhvcnBlXQoKICAqKSBGdW5jdGlvbmFsaXR5IGZvciBjcmVhdGluZyB0aGUgaW5pdGlhbCBzZXJpYWwgbnVtYmVyIGZpbGUgaXMgbm93CiAgICAgbW92ZWQgZnJvbSBDQS5wbCB0byB0aGUgJ2NhJyB1dGlsaXR5IHdpdGggYSBuZXcgb3B0aW9uIC1jcmVhdGVfc2VyaWFsLgoKICAgICAoQmVmb3JlIE9wZW5TU0wgMC45LjdlLCBDQS5wbCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHNlcmlhbAogICAgIG51bWJlciBmaWxlIHRvIDEsIHdoaWNoIGlzIGJvdW5kIHRvIGNhdXNlIHByb2JsZW1zLiAgVG8gYXZvaWQKICAgICB0aGUgcHJvYmxlbXMgd2hpbGUgcmVzcGVjdGluZyBjb21wYXRpYmlsaXR5IGJldHdlZW4gZGlmZmVyZW50IDAuOS43CiAgICAgcGF0Y2hsZXZlbHMsIDAuOS43ZSAgZW1wbG95ZWQgJ29wZW5zc2wgeDUwOSAtbmV4dF9zZXJpYWwnIGluCiAgICAgQ0EucGwgZm9yIHNlcmlhbCBudW1iZXIgaW5pdGlhbGl6YXRpb24uICBXaXRoIHRoZSBuZXcgcmVsZWFzZSAwLjkuOCwKICAgICB3ZSBjYW4gZml4IHRoZSBwcm9ibGVtIGRpcmVjdGx5IGluIHRoZSAnY2EnIHV0aWxpdHkuKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlZHVjZWQgaGVhZGVyIGludGVyZGVwZW5jaWVzIGJ5IGRlY2xhcmluZyBtb3JlIG9wYXF1ZSBvYmplY3RzIGluCiAgICAgb3NzbF90eXAuaC4gQXMgYSBjb25zZXF1ZW5jZSwgaW5jbHVkaW5nIHNvbWUgaGVhZGVycyAoZWcuIGVuZ2luZS5oKSB3aWxsCiAgICAgZ2l2ZSBmZXdlciByZWN1cnNpdmUgaW5jbHVkZXMsIHdoaWNoIGNvdWxkIGJyZWFrIGxhenkgc291cmNlIGNvZGUgLSBzbwogICAgIHRoaXMgY2hhbmdlIGlzIGNvdmVyZWQgYnkgdGhlIE9QRU5TU0xfTk9fREVQUkVDQVRFRCBzeW1ib2wuIEFzIGFsd2F5cywKICAgICBkZXZlbG9wZXJzIHNob3VsZCBkZWZpbmUgdGhpcyBzeW1ib2wgd2hlbiBidWlsZGluZyBhbmQgdXNpbmcgb3BlbnNzbCB0bwogICAgIGVuc3VyZSB0aGV5IHRyYWNrIHRoZSByZWNvbW1lbmRlZCBiZWhhdmlvdXIsIGludGVyZmFjZXMsIFtldGNdLCBidXQKICAgICBiYWNrd2FyZHMtY29tcGF0aWJsZSBiZWhhdmlvdXIgcHJldmFpbHMgd2hlbiB0aGlzIGlzbid0IGRlZmluZWQuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfUE9MSUNZX05PREVfcHJpbnQoKSB3aGljaCBwcmludHMgb3V0IHBvbGljeSBub2Rlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IEVWUCBmdW5jdGlvbiBFVlBfQ0lQSEVSX0NUWF9yYW5kX2tleSBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbmFsaXR5LgogICAgIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIHJhbmRvbSBrZXkgb2YgdGhlIGFwcHJvcHJpYXRlIGxlbmd0aCBiYXNlZCBvbiB0aGUgCiAgICAgY2lwaGVyIGNvbnRleHQuIFRoZSBFVlBfQ0lQSEVSIGNhbiBwcm92aWRlIGl0cyBvd24gcmFuZG9tIGtleSBnZW5lcmF0aW9uCiAgICAgcm91dGluZSB0byBzdXBwb3J0IGtleXMgb2YgYSBzcGVjaWZpYyBmb3JtLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGRlcyBhbmQgCiAgICAgM2RlcyByb3V0aW5lcyB0byBnZW5lcmF0ZSBhIGtleSBvZiB0aGUgY29ycmVjdCBwYXJpdHkuIFVwZGF0ZSBTL01JTUUKICAgICBjb2RlIHRvIHVzZSBuZXcgZnVuY3Rpb25zIGFuZCBoZW5jZSBnZW5lcmF0ZSBjb3JyZWN0IHBhcml0eSBERVMga2V5cy4KICAgICBBZGQgRVZQX0NIRUNLX0RFU19LRVkgI2RlZmluZSB0byByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIGtleSBpcyBub3QgCiAgICAgdmFsaWQgKHdlYWsgb3IgaW5jb3JyZWN0IHBhcml0eSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbG9jYWwgc2V0IG9mIENSTHMgdGhhdCBjYW4gYmUgdXNlZCBieSBYNTA5X3ZlcmlmeV9jZXJ0KCkgYXMgd2VsbAogICAgIGFzIGxvb2tpbmcgdGhlbSB1cC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdmVyaWZpZWQgc3RydWN0dXJlIG1heSBjb250YWluCiAgICAgQ1JMcywgZm9yIGV4YW1wbGUgUEtDUyM3IHNpZ25lZERhdGEuIE1vZGlmeSBQS0NTN192ZXJpZnkoKSB0byB1c2UgYW55IENSTHMKICAgICBwcmVzZW50IHVubGVzcyB0aGUgbmV3IFBLQ1M3X05PX0NSTCBmbGFnIGlzIGFzc2VydGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZCBBU04xIG9pZCBjb25maWd1cmF0aW9uIG1vZHVsZS4gSXQgbm93IGFkZGl0aW9uYWxseSBhY2NlcHRzIHRoZQogICAgIHN5bnRheDoKCiAgICAgc2hvcnROYW1lID0gc29tZSBsb25nIG5hbWUsIDEuMi4zLjQKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWltcGxlbWVudGVkIHRoZSBCTl9DVFggaW1wbGVtZW50YXRpb24uIFRoZXJlIGlzIG5vdyBubyBtb3JlIHN0YXRpYwogICAgIGxpbWl0YXRpb24gb24gdGhlIG51bWJlciBvZiB2YXJpYWJsZXMgaXQgY2FuIGhhbmRsZSBub3IgdGhlIGRlcHRoIG9mIHRoZQogICAgICJzdGFjayIgaGFuZGxpbmcgZm9yIEJOX0NUWF9zdGFydCgpL0JOX0NUWF9lbmQoKSBwYWlycy4gVGhlIHN0YWNrCiAgICAgaW5mb3JtYXRpb24gY2FuIG5vdyBleHBhbmQgYXMgcmVxdWlyZWQsIGFuZCByYXRoZXIgdGhhbiBoYXZpbmcgYSBzaW5nbGUKICAgICBzdGF0aWMgYXJyYXkgb2YgYmlnbnVtcywgQk5fQ1RYIG5vdyB1c2VzIGEgbGlua2VkLWxpc3Qgb2Ygc3VjaCBhcnJheXMKICAgICBhbGxvd2luZyBpdCB0byBleHBhbmQgb24gZGVtYW5kIHdoaWxzdCBtYWludGFpbmluZyB0aGUgdXNlZnVsbmVzcyBvZgogICAgIEJOX0NUWCdzICJidW5kbGluZyIuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGEgbWlzc2luZyBCTl9DVFggcGFyYW1ldGVyIHRvIHRoZSAncnNhX21vZF9leHAnIGNhbGxiYWNrIGluIFJTQV9NRVRIT0QKICAgICB0byBhbGxvdyBhbGwgUlNBIG9wZXJhdGlvbnMgdG8gZnVuY3Rpb24gdXNpbmcgYSBzaW5nbGUgQk5fQ1RYLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGNlcnRpZmljYXRlIHBvbGljeSBldmFsdWF0aW9uIGFuZCBjaGVja2luZy4gVGhpcwogICAgIGlzIGluaXRpYWxseSBpbnRlbmRlZCB0byBwYXNzIHRoZSB0ZXN0cyBvdXRsaW5lZCBpbiAiQ29uZm9ybWFuY2UgVGVzdGluZwogICAgIG9mIFJlbHlpbmcgUGFydHkgQ2xpZW50IENlcnRpZmljYXRlIFBhdGggUHJvY2Vzc2luZyBMb2dpYyIgdjEuMDcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgYm5fZHVwX2V4cGFuZCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIGl0IHdhcyBpbnRyb2R1Y2VkIGluIDAuOS43IGFuZAogICAgIHJlbWFpbmVkIHVudXNlZCBhbmQgbm90IHRoYXQgdXNlZnVsLiBBIHZhcmlldHkgb2Ygb3RoZXIgbGl0dGxlIGJpZ251bQogICAgIHR3ZWFrcyBhbmQgZml4ZXMgaGF2ZSBhbHNvIGJlZW4gbWFkZSBjb250aW51aW5nIG9uIGZyb20gdGhlIGF1ZGl0IChzZWUKICAgICBiZWxvdykuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQ29uc3RpZnkgYWxsIG9yIGFsbW9zdCBhbGwgZDJpLCBjMmksIHMyaSBhbmQgcjJpIGZ1bmN0aW9ucywgYWxvbmcgd2l0aAogICAgIGFzc29jaWF0ZWQgQVNOMSwgRVZQIGFuZCBTU0wgZnVuY3Rpb25zIGFuZCBvbGQgQVNOMSBtYWNyb3MuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQk5femVybygpIG9ubHkgbmVlZHMgdG8gc2V0ICd0b3AnIGFuZCAnbmVnJyB0byB6ZXJvIGZvciBjb3JyZWN0IHJlc3VsdHMsCiAgICAgYW5kIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuIFNvIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgdXNlIG9mCiAgICAgQk5fc2V0X3dvcmQoKSAod2hpY2ggY2FuIGZhaWwgZHVlIHRvIG5lZWRsZXNzIGV4cGFuc2lvbikgaXMgbm93IGRlcHJlY2F0ZWQ7CiAgICAgaWYgT1BFTlNTTF9OT19ERVBSRUNBVEVEIGlzIGRlZmluZWQsIEJOX3plcm8oKSBpcyBhIHZvaWQgbWFjcm8uCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQk5fQ1RYX2dldCgpIHNob3VsZCByZXR1cm4gemVyby12YWx1ZWQgYmlnbnVtcywgcHJvdmlkaW5nIHRoZSBzYW1lCiAgICAgaW5pdGlhbGlzZWQgdmFsdWUgYXMgQk5fbmV3KCkuCiAgICAgW0dlb2ZmIFRob3JwZSwgc3VnZ2VzdGVkIGJ5IFVsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgZm9yIGluaGliaXRBbnlQb2xpY3kgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFuIGF1ZGl0IG9mIHRoZSBCSUdOVU0gY29kZSBpcyB1bmRlcndheSwgZm9yIHdoaWNoIGRlYnVnZ2luZyBjb2RlIGlzCiAgICAgZW5hYmxlZCB3aGVuIEJOX0RFQlVHIGlzIGRlZmluZWQuIFRoaXMgbWFrZXMgc3RyaWN0ZXIgZW5mb3JjZW1lbnRzIG9uIHdoYXQKICAgICBpcyBjb25zaWRlcmVkIHZhbGlkIHdoZW4gcHJvY2Vzc2luZyBCSUdOVU1zLCBhbmQgY2F1c2VzIGV4ZWN1dGlvbiB0bwogICAgIGFzc2VydCgpIHdoZW4gYSBwcm9ibGVtIGlzIGRpc2NvdmVyZWQuIElmIEJOX0RFQlVHX1JBTkQgaXMgZGVmaW5lZCwKICAgICBmdXJ0aGVyIHN0ZXBzIGFyZSB0YWtlbiB0byBkZWxpYmVyYXRlbHkgcG9sbHV0ZSB1bnVzZWQgZGF0YSBpbiBCSUdOVU0KICAgICBzdHJ1Y3R1cmVzIHRvIHRyeSBhbmQgZXhwb3NlIGZhdWx0eSBjb2RlIGZ1cnRoZXIgb24uIEZvciBub3csIG9wZW5zc2wgd2lsbAogICAgIChpbiBpdHMgZGVmYXVsdCBtb2RlIG9mIG9wZXJhdGlvbikgY29udGludWUgdG8gdG9sZXJhdGUgdGhlIGluY29uc2lzdGVudAogICAgIGZvcm1zIHRoYXQgaXQgaGFzIHRvbGVyYXRlZCBpbiB0aGUgcGFzdCwgYnV0IGF1dGhvcnMgYW5kIHBhY2thZ2VycyBzaG91bGQKICAgICBjb25zaWRlciB0cnlpbmcgb3BlbnNzbCBhbmQgdGhlaXIgb3duIGFwcGxpY2F0aW9ucyB3aGVuIGNvbXBpbGVkIHdpdGgKICAgICB0aGVzZSBkZWJ1Z2dpbmcgc3ltYm9scyBkZWZpbmVkLiBJdCB3aWxsIGhlbHAgaGlnaGxpZ2h0IHBvdGVudGlhbCBidWdzIGluCiAgICAgdGhlaXIgb3duIGNvZGUsIGFuZCB3aWxsIGltcHJvdmUgdGhlIHRlc3QgY292ZXJhZ2UgZm9yIE9wZW5TU0wgaXRzZWxmLiBBdAogICAgIHNvbWUgcG9pbnQsIHRoZXNlIHRpZ2h0ZXIgcnVsZXMgd2lsbCBiZWNvbWUgb3BlbnNzbCdzIGRlZmF1bHQgdG8gaW1wcm92ZQogICAgIG1haW50YWluYWJpbGl0eSwgdGhvdWdoIHRoZSBhc3NlcnQoKXMgYW5kIG90aGVyIG92ZXJoZWFkcyB3aWxsIHJlbWFpbiBvbmx5CiAgICAgaW4gZGVidWdnaW5nIGNvbmZpZ3VyYXRpb25zLiBTZWUgYm4uaCBmb3IgbW9yZSBkZXRhaWxzLgogICAgIFtHZW9mZiBUaG9ycGUsIE5pbHMgTGFyc2NoLCBVbGYgTfZsbGVyXQoKICAqKSBCTl9DVFhfaW5pdCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIGFzIEJOX0NUWCBpcyBhbiBvcGFxdWUgc3RydWN0dXJlCiAgICAgdGhhdCBjYW4gb25seSBiZSBvYnRhaW5lZCB0aHJvdWdoIEJOX0NUWF9uZXcoKSAod2hpY2ggaW1wbGljaXRseQogICAgIGluaXRpYWxpc2VzIGl0KS4gVGhlIHByZXNlbmNlIG9mIHRoaXMgZnVuY3Rpb24gb25seSBtYWRlIGl0IHBvc3NpYmxlCiAgICAgdG8gb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHN0cnVjdHVyZSAoYW5kIGNhdXNlIG1lbW9yeSBsZWFrcykuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQmVjYXVzZSBvZiB0aGUgY2FsbGJhY2stYmFzZWQgYXBwcm9hY2ggZm9yIGltcGxlbWVudGluZyBMSEFTSCBhcyBhCiAgICAgdGVtcGxhdGUgdHlwZSwgbGhfaW5zZXJ0KCkgYWRkcyBvcGFxdWUgb2JqZWN0cyB0byBoYXNoLXRhYmxlcyBhbmQKICAgICBsaF9kb2FsbCgpIG9yIGxoX2RvYWxsX2FyZygpIGFyZSB0eXBpY2FsbHkgdXNlZCB3aXRoIGEgZGVzdHJ1Y3RvciBjYWxsYmFjawogICAgIHRvIGNsZWFuIHVwIHRob3NlIGNvcnJlc3BvbmRpbmcgb2JqZWN0cyBiZWZvcmUgZGVzdHJveWluZyB0aGUgaGFzaCB0YWJsZQogICAgIChhbmQgbG9zaW5nIHRoZSBvYmplY3QgcG9pbnRlcnMpLiBTbyBzb21lIG92ZXItemVhbG91cyBjb25zdGlmaWNhdGlvbnMgaW4KICAgICBMSEFTSCBoYXZlIGJlZW4gcmVsYXhlZCBzbyB0aGF0IGxoX2luc2VydCgpIGRvZXMgbm90IHRha2UgKG5vciBzdG9yZSkgdGhlCiAgICAgb2JqZWN0cyBhcyAiY29uc3QiIGFuZCB0aGUgbGhfZG9hbGxbX2FyZ10gY2FsbGJhY2sgd3JhcHBlcnMgYXJlIG5vdAogICAgIHByb3RvdHlwZWQgdG8gaGF2ZSAiY29uc3QiIHJlc3RyaWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBvaW50ZXJzIHRoZXkgYXJlCiAgICAgZ2l2ZW4gKGFuZCBzbyBhcmVuJ3QgcmVxdWlyZWQgdG8gY2FzdCB0aGVtIGF3YXkgYW55IG1vcmUpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFRoZSB0bWRpZmYuaCBBUEkgd2FzIHNvIHVnbHkgYW5kIG1pbmltYWwgdGhhdCBvdXIgb3duIHRpbWluZyB1dGlsaXR5CiAgICAgKHNwZWVkKSBwcmVmZXJzIHRvIHVzZSBpdHMgb3duIGltcGxlbWVudGF0aW9uLiBUaGUgdHdvIGltcGxlbWVudGF0aW9ucwogICAgIGhhdmVuJ3QgYmVlbiBjb25zb2xpZGF0ZWQgYXMgeWV0ICh2b2x1bnRlZXJzPykgYnV0IHRoZSB0bWRpZmYgQVBJIGhhcyBoYWQKICAgICBpdHMgb2JqZWN0IHR5cGUgcHJvcGVybHkgZXhwb3NlZCAoTVNfVE0pIGluc3RlYWQgb2YgY2FzdGluZyB0by9mcm9tICJjaGFyCiAgICAgKiIuIFRoaXMgbWF5IHN0aWxsIGNoYW5nZSB5ZXQgaWYgc29tZW9uZSByZWFsaXNlcyBNU19UTSBhbmQgIm1zX3RpbWVfKioqIgogICAgIGFyZW4ndCBuZWNlc3NhcmlseSB0aGUgZ3JlYXRlc3Qgbm9tZW5jbGF0dXJlcyAtIGJ1dCB0aGlzIGlzIHdoYXQgd2FzIHVzZWQKICAgICBpbnRlcm5hbGx5IHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBzbyBJJ3ZlIHVzZWQgdGhhdCBmb3Igbm93LgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEVuc3VyZSB0aGF0IGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGRvIG5vdCBnZXQgY29tcGlsZWQgd2hlbgogICAgIE9QRU5TU0xfTk9fREVQUkVDQVRFRCBpcyBkZWZpbmVkLiBTb21lICJvcGVuc3NsIiBzdWJjb21tYW5kcyBhbmQgYSBmZXcgb2YKICAgICB0aGUgc2VsZi10ZXN0cyB3ZXJlIHN0aWxsIHVzaW5nIGRlcHJlY2F0ZWQga2V5LWdlbmVyYXRpb24gZnVuY3Rpb25zIHNvCiAgICAgdGhlc2UgaGF2ZSBiZWVuIHVwZGF0ZWQgYWxzby4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBSZW9yZ2FuaXNlIFBLQ1MjNyBjb2RlIHRvIHNlcGFyYXRlIHRoZSBkaWdlc3QgbG9jYXRpb24gZnVuY3Rpb25hbGl0eQogICAgIGludG8gUEtDUzdfZmluZF9kaWdlc3QoKSwgZGlnZXN0IGFkZGl0aW9uIGludG8gUEtDUzdfYmlvX2FkZF9kaWdlc3QoKS4KICAgICBOZXcgZnVuY3Rpb24gUEtDUzdfc2V0X2RpZ2VzdCgpIHRvIHNldCB0aGUgZGlnZXN0IHR5cGUgZm9yIFBLQ1MjNwogICAgIGRpZ2VzdGVkRGF0YSB0eXBlLiBBZGQgYWRkaXRpb25hbCBjb2RlIHRvIGNvcnJlY3RseSBnZW5lcmF0ZSB0aGUKICAgICBkaWdlc3RlZERhdGEgdHlwZSBhbmQgYWRkIHN1cHBvcnQgZm9yIHRoaXMgdHlwZSBpbiBQS0NTNyBpbml0aWFsaXphdGlvbgogICAgIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gUEtDUzdfc2V0MF90eXBlX290aGVyKCkgdGhpcyBpbml0aWFsaXplcyBhIFBLQ1M3IAogICAgIHN0cnVjdHVyZSBvZiB0eXBlICJvdGhlciIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHByaW1lIGdlbmVyYXRpb24gbG9vcCBpbiBjcnlwdG8vYm4vYm5fcHJpbWUucGwgYnkgbWFraW5nCiAgICAgc3VyZSB0aGUgbG9vcCBkb2VzIGNvcnJlY3RseSBzdG9wIGFuZCBicmVha2luZyAoImRpdmlzaW9uIGJ5IHplcm8iKQogICAgIG1vZHVsdXMgb3BlcmF0aW9ucyBhcmUgbm90IHBlcmZvcm1lZC4gVGhlIChwcmUtZ2VuZXJhdGVkKSBwcmltZQogICAgIHRhYmxlIGNyeXB0by9ibi9ibl9wcmltZS5oIHdhcyBhbHJlYWR5IGNvcnJlY3QsIGJ1dCBpdCBjb3VsZCBub3QgYmUKICAgICByZS1nZW5lcmF0ZWQgb24gc29tZSBwbGF0Zm9ybXMgYmVjYXVzZSBvZiB0aGUgImRpdmlzaW9uIGJ5IHplcm8iCiAgICAgc2l0dWF0aW9uIGluIHRoZSBzY3JpcHQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFVwZGF0ZSBzdXBwb3J0IGZvciBFQ0MtYmFzZWQgVExTIGNpcGhlcnN1aXRlcyBhY2NvcmRpbmcgdG8KICAgICBkcmFmdC1pZXRmLXRscy1lY2MtMDMudHh0OiB0aGUgS0RGMSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiB3aXRoCiAgICAgU0hBLTEgbm93IGlzIG9ubHkgdXNlZCBmb3IgInNtYWxsIiBjdXJ2ZXMgKHdoZXJlIHRoZQogICAgIHJlcHJlc2VudGF0aW9uIG9mIGEgZmllbGQgZWxlbWVudCB0YWtlcyB1cCB0byAyNCBieXRlcyk7IGZvcgogICAgIGxhcmdlciBjdXJ2ZXMsIHRoZSBmaWVsZCBlbGVtZW50IHJlc3VsdGluZyBmcm9tIEVDREggaXMgZGlyZWN0bHkKICAgICB1c2VkIGFzIHByZW1hc3RlciBzZWNyZXQuCiAgICAgW0RvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgY29kZSBmb3Iga1ArbFEgdGltaW5ncyB0byBjcnlwdG8vZWMvZWN0ZXN0LmMsIGFuZCBhZGQgU0VDMgogICAgIGN1cnZlIHNlY3AxNjByMSB0byB0aGUgdGVzdHMuCiAgICAgW0RvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGxvYWQgc3ltYm9scyBnbG9iYWxseSB3aXRoIERTTy4KICAgICBbR/Z0eiBCYWJpbi1FYmVsbCA8YmFiaW4tZWJlbGxAdHJ1c3RjZW50ZXIuZGU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZnVuY3Rpb25zIEVSUl9zZXRfbWFyaygpIGFuZCBFUlJfcG9wX3RvX21hcmsoKSBmb3IgYmV0dGVyCiAgICAgY29udHJvbCBvZiB0aGUgZXJyb3Igc3RhY2suCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFNUT1JFIGluIEVOR0lORS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIFNUT1JFIHR5cGUuICBUaGUgaW50ZW50aW9uIGlzIHRvIHByb3ZpZGUgYSBjb21tb24gaW50ZXJmYWNlCiAgICAgdG8gY2VydGlmaWNhdGUgYW5kIGtleSBzdG9yZXMsIGJlIHRoZXkgc2ltcGxlIGZpbGUtYmFzZWQgc3RvcmVzLCBvcgogICAgIEhTTS10eXBlIHN0b3JlLCBvciBMREFQIHN0b3Jlcywgb3IuLi4KICAgICBOT1RFOiBUaGUgY29kZSBpcyBjdXJyZW50bHkgVU5URVNURUQgYW5kIGlzbid0IHJlYWxseSB1c2VkIGFueXdoZXJlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBhIGdlbmVyaWMgc3RydWN0dXJlIGNhbGxlZCBPUEVOU1NMX0lURU0uICBUaGlzIGNhbiBiZSB1c2VkIHRvCiAgICAgcGFzcyBhIGxpc3Qgb2YgYXJndW1lbnRzIHRvIGFueSBmdW5jdGlvbiBhcyB3ZWxsIGFzIHByb3ZpZGUgYSB3YXkKICAgICBmb3IgYSBmdW5jdGlvbiB0byBwYXNzIGRhdGEgYmFjayB0byB0aGUgY2FsbGVyLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZnVuY3Rpb25zIEJVRl9zdHJuZHVwKCkgYW5kIEJVRl9tZW1kdXAoKS4gIEJVRl9zdHJuZHVwKCkKICAgICB3b3JrcyBsaWtlIEJVRl9zdHJkdXAoKSBidXQgY2FuIGJlIHVzZWQgdG8gZHVwbGljYXRlIGEgcG9ydGlvbiBvZgogICAgIGEgc3RyaW5nLiAgVGhlIGNvcHkgZ2V0cyBOVUwtdGVybWluYXRlZC4gIEJVRl9tZW1kdXAoKSBkdXBsaWNhdGVzCiAgICAgYSBtZW1vcnkgYXJlYS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZ1bmN0aW9uIHNrX2ZpbmRfZXgoKSB3aGljaCB3b3JrcyBsaWtlIHNrX2ZpbmQoKSwgYnV0IHdpbGwKICAgICByZXR1cm4gYW4gaW5kZXggdG8gYW4gZWxlbWVudCBldmVuIGlmIGFuIGV4YWN0IG1hdGNoIGNvdWxkbid0IGJlCiAgICAgZm91bmQuICBUaGUgaW5kZXggaXMgZ3VhcmFudGVlZCB0byBwb2ludCBhdCB0aGUgZWxlbWVudCB3aGVyZSB0aGUKICAgICBzZWFyY2hlZC1mb3Iga2V5IHdvdWxkIGJlIGluc2VydGVkIHRvIHByZXNlcnZlIHNvcnRpbmcgb3JkZXIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBmdW5jdGlvbiBPQkpfYnNlYXJjaF9leCgpIHdoaWNoIHdvcmtzIGxpa2UgT0JKX2JzZWFyY2goKSBidXQKICAgICB0YWtlcyBhbiBleHRyYSBmbGFncyBhcmd1bWVudCBmb3Igb3B0aW9uYWwgZnVuY3Rpb25hbGl0eS4gIEN1cnJlbnRseSwKICAgICB0aGUgZm9sbG93aW5nIGZsYWdzIGFyZSBkZWZpbmVkOgoKCU9CSl9CU0VBUkNIX1ZBTFVFX09OX05PTUFUQ0gKCVRoaXMgb25lIGdldHMgT0JKX2JzZWFyY2hfZXgoKSB0byByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdAoJZWxlbWVudCB3aGVyZSB0aGUgY29tcGFyaW5nIGZ1bmN0aW9uIHJldHVybnMgYSBuZWdhdGl2ZSBvciB6ZXJvCgludW1iZXIuCgoJT0JKX0JTRUFSQ0hfRklSU1RfVkFMVUVfT05fTUFUQ0gKCVRoaXMgb25lIGdldHMgT0JKX2JzZWFyY2hfZXgoKSB0byByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdAoJZWxlbWVudCB3aGVyZSB0aGUgY29tcGFyaW5nIGZ1bmN0aW9uIHJldHVybnMgemVyby4gIFRoaXMgaXMgdXNlZnVsCglpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBlbGVtZW50IHdoZXJlIHRoZSBjb21wYXJpbmcgZnVuY3Rpb24KCXJldHVybnMgemVyby4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGNyZWF0ZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMgd2l0aCAnb3BlbnNzbCBjYScKICAgICBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGJlY29tZXMgcGFydCBvZiB0aGUKICAgICBDQSBkYXRhYmFzZSBhbmQgdXNlcyB0aGUgc2FtZSBtZWNoYW5pc21zIGZvciBzZXJpYWwgbnVtYmVyIGdlbmVyYXRpb24KICAgICBhcyBhbGwgb3RoZXIgY2VydGlmaWNhdGUgc2lnbmluZy4gIFRoZSBuZXcgZmxhZyAnLXNlbGZzaWduJyBlbmFibGVzCiAgICAgdGhpcyBmdW5jdGlvbmFsaXR5LiAgQWRhcHQgQ0Euc2ggYW5kIENBLnBsLmluLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIHRoZSBwdWJsaWMga2V5IG9mIGEgY2VydGlmaWNhdGUgcmVxdWVzdAogICAgIGFnYWluc3QgYSBnaXZlbiBwcml2YXRlLiAgVGhpcyBpcyB1c2VmdWwgdG8gY2hlY2sgdGhhdCBhIGNlcnRpZmljYXRlCiAgICAgcmVxdWVzdCBjYW4gYmUgc2lnbmVkIGJ5IHRoYXQga2V5IChzZWxmLXNpZ25pbmcpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgY2VydGlmaWNhdGVzIHdpdGggdGhlIHNhbWUKICAgICBzdWJqZWN0IGluIHRoZSBDQSBpbmRleCBmaWxlLiAgVGhpcyBpcyBkb25lIG9ubHkgaWYgdGhlIGtleXdvcmQKICAgICAndW5pcXVlX3N1YmplY3QnIGlzIHNldCB0byAnbm8nIGluIHRoZSBtYWluIENBIHNlY3Rpb24gKGRlZmF1bHQKICAgICBpZiAnQ0FfZGVmYXVsdCcpIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuICBUaGUgdmFsdWUgaXMgc2F2ZWQKICAgICB3aXRoIHRoZSBkYXRhYmFzZSBpdHNlbGYgaW4gYSBzZXBhcmF0ZSBpbmRleCBhdHRyaWJ1dGUgZmlsZSwKICAgICBuYW1lZCBsaWtlIHRoZSBpbmRleCBmaWxlIHdpdGggJy5hdHRyJyBhcHBlbmRlZCB0byB0aGUgbmFtZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBHZW5lcmF0ZSBtdXRpIHZhbHVlZCBBVkFzIHVzaW5nICcrJyBub3RhdGlvbiBpbiBjb25maWcgZmlsZXMgZm9yCiAgICAgcmVxIGFuZCBkaXJOYW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIG5hbWVDb25zdHJhaW50cyBjZXJ0aWZpY2F0ZSBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgcG9saWN5Q29uc3RyYWludHMgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIHBvbGljeU1hcHBpbmdzIGNlcnRpZmljYXRlIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgRFNBX01FVEhPRCBpbXBsZW1lbnRhdGlvbiBvbmx5IHVzZXMgaXRzCiAgICAgZHNhX21vZF9leHAoKSBhbmQvb3IgYm5fbW9kX2V4cCgpIGhhbmRsZXJzIGlmIHRoZXkgYXJlIG5vbi1OVUxMLAogICAgIGFuZCBjaGFuZ2UgaXRzIG93biBoYW5kbGVycyB0byBiZSBOVUxMIHNvIGFzIHRvIHJlbW92ZSB1bm5lY2Vzc2FyeQogICAgIGluZGlyZWN0aW9uLiBUaGlzIGxldHMgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb25zIGZhbGxiYWNrIHRvIHRoZQogICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbW9yZSBlYXNpbHkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgU3VwcG9ydCBmb3IgZGlyZWN0b3J5TmFtZSBpbiBHZW5lcmFsTmFtZSByZWxhdGVkIGV4dGVuc2lvbnMKICAgICBpbiBjb25maWcgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBsaW5rIGFwcGxpY2F0aW9ucyB1c2luZyBNYWtlZmlsZS5zaGFyZWQuCiAgICAgTWFrZSB0aGF0IHBvc3NpYmxlIGV2ZW4gd2hlbiBsaW5raW5nIGFnYWluc3Qgc3RhdGljIGxpYnJhcmllcyEKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBTdXBwb3J0IGZvciBzaW5nbGUgcGFzcyBwcm9jZXNzaW5nIGZvciBTL01JTUUgc2lnbmluZy4gVGhpcyBub3cKICAgICBtZWFucyB0aGF0IFMvTUlNRSBzaWduaW5nIGNhbiBiZSBkb25lIGZyb20gYSBwaXBlLCBpbiBhZGRpdGlvbgogICAgIGNsZWFydGV4dCBzaWduaW5nIChtdWx0aXBhcnQvc2lnbmVkIHR5cGUpIGlzIGVmZmVjdGl2ZWx5IHN0cmVhbWluZwogICAgIGFuZCB0aGUgc2lnbmVkIGRhdGEgZG9lcyBub3QgbmVlZCB0byBiZSBhbGwgaGVsZCBpbiBtZW1vcnkuCgogICAgIFRoaXMgaXMgZG9uZSB3aXRoIGEgbmV3IGZsYWcgUEtDUzdfU1RSRUFNLiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQKICAgICBQS0NTN19zaWduKCkgb25seSBpbml0aWFsaXplcyB0aGUgUEtDUzcgc3RydWN0dXJlIGFuZCB0aGUgYWN0dWFsIHNpZ25pbmcKICAgICBpcyBkb25lIGFmdGVyIHRoZSBkYXRhIGlzIG91dHB1dCAoYW5kIGRpZ2VzdHMgY2FsY3VsYXRlZCkgaW4KICAgICBTTUlNRV93cml0ZV9QS0NTNygpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdWxsIHN1cHBvcnQgZm9yIC1ycGF0aC8tUiwgYm90aCBpbiBzaGFyZWQgbGlicmFyaWVzIGFuZAogICAgIGFwcGxpY2F0aW9ucywgYXQgbGVhc3Qgb24gdGhlIHBsYXRmb3JtcyB3aGVyZSBpdCdzIGtub3duIGhvdwogICAgIHRvIGRvIGl0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIGNyeXB0by9lYy9lY19tdWx0LmMsIGltcGxlbWVudCBmYXN0IHBvaW50IG11bHRpcGxpY2F0aW9uIHdpdGgKICAgICBwcmVjb21wdXRhdGlvbiwgYmFzZWQgb24gd05BRiBzcGxpdHRpbmc6IEVDX0dST1VQX3ByZWNvbXB1dGVfbXVsdCgpCiAgICAgd2lsbCBub3cgY29tcHV0ZSBhIHRhYmxlIG9mIG11bHRpcGxlcyBvZiB0aGUgZ2VuZXJhdG9yIHRoYXQKICAgICBtYWtlcyBzdWJzZXF1ZW50IGludm9jYXRpb25zIG9mIEVDX1BPSU5Uc19tdWwoKSBvciBFQ19QT0lOVF9tdWwoKQogICAgIGZhc3RlciAobm90YWJseSBpbiB0aGUgY2FzZSBvZiBhIHNpbmdsZSBwb2ludCBtdWx0aXBsaWNhdGlvbiwKICAgICBzY2FsYXIgKiBnZW5lcmF0b3IpLgogICAgIFtOaWxzIExhcnNjaCwgQm9kbyBNb2VsbGVyXQoKICAqKSBJUHY2IHN1cHBvcnQgZm9yIGNlcnRpZmljYXRlIGV4dGVuc2lvbnMuIFRoZSB2YXJpb3VzIGV4dGVuc2lvbnMKICAgICB3aGljaCB1c2UgdGhlIElQOmEuYi5jLmQgY2FuIG5vdyB0YWtlIElQdjYgYWRkcmVzc2VzIHVzaW5nIHRoZQogICAgIGZvcm1hdHMgb2YgUkZDMTg4NCAyLjIgLiBJUHY2IGFkZHJlc3NlcyBhcmUgbm93IGFsc28gZGlzcGxheWVkCiAgICAgY29ycmVjdGx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIGFuIEVOR0lORSB0aGF0IGltcGxlbWVudHMgUlNBIGJ5IHBlcmZvcm1pbmcgcHJpdmF0ZSBrZXkKICAgICBleHBvbmVudGlhdGlvbnMgd2l0aCB0aGUgR01QIGxpYnJhcnkuIFRoZSBjb252ZXJzaW9ucyB0byBhbmQgZnJvbQogICAgIEdNUCdzIG1wel90IGZvcm1hdCBhcmVuJ3Qgb3B0aW1pc2VkIG5vciBhcmUgYW55IG1vbnRnb21lcnkgZm9ybXMKICAgICBjYWNoZWQsIGFuZCBvbiB4ODYgaXQgYXBwZWFycyBPcGVuU1NMJ3Mgb3duIHBlcmZvcm1hbmNlIGhhcyBjYXVnaHQgdXAuCiAgICAgSG93ZXZlciB0aGVyZSBhcmUgbGlrZWx5IHRvIGJlIG90aGVyIGFyY2hpdGVjdHVyZXMgd2hlcmUgR01QIGNvdWxkCiAgICAgcHJvdmlkZSBhIGJvb3N0LiBUaGlzIEVOR0lORSBpcyBub3QgYnVpbHQgaW4gYnkgZGVmYXVsdCwgYnV0IGl0IGNhbiBiZQogICAgIHNwZWNpZmllZCBhdCBDb25maWd1cmUgdGltZSBhbmQgc2hvdWxkIGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBuZWNlc3NhcnkKICAgICBsaW5rZXIgYWRkaXRpb25zLCBlZzsKICAgICAgICAgLi9jb25maWcgLURPUEVOU1NMX1VTRV9HTVAgLWxnbXAKICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSAib3BlbnNzbCBlbmdpbmUiIHdpbGwgbm90IGRpc3BsYXkgRU5HSU5FL0RTTyBsb2FkIGZhaWx1cmUgZXJyb3JzIHdoZW4KICAgICB0ZXN0aW5nIGF2YWlsYWJpbGl0eSBvZiBlbmdpbmVzIHdpdGggIi10IiAtIHRoZSBvbGQgYmVoYXZpb3VyIGlzCiAgICAgcHJvZHVjZWQgYnkgaW5jcmVhc2luZyB0aGUgZmVhdHVyZSdzIHZlcmJvc2l0eSB3aXRoICItdHQiLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEVDRFNBIHJvdXRpbmVzOiB1bmRlciBjZXJ0YWluIGVycm9yIGNvbmRpdGlvbnMgdW5pbml0aWFsaXplZCBCTiBvYmplY3RzCiAgICAgY291bGQgYmUgZnJlZWQuIFNvbHV0aW9uOiBtYWtlIHN1cmUgaW5pdGlhbGl6YXRpb24gaXMgcGVyZm9ybWVkIGVhcmx5CiAgICAgZW5vdWdoLiAoUmVwb3J0ZWQgYW5kIGZpeCBzdXBwbGllZCBieSBOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPgogICAgIHZpYSBQUiM0NTkpCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEtleS1nZW5lcmF0aW9uIGNhbiBub3cgYmUgaW1wbGVtZW50ZWQgaW4gUlNBX01FVEhPRCwgRFNBX01FVEhPRAogICAgIGFuZCBESF9NRVRIT0QgKGVnLiBieSBFTkdJTkUgaW1wbGVtZW50YXRpb25zKSB0byBvdmVycmlkZSB0aGUgbm9ybWFsCiAgICAgc29mdHdhcmUgaW1wbGVtZW50YXRpb25zLiBGb3IgRFNBIGFuZCBESCwgcGFyYW1ldGVyIGdlbmVyYXRpb24gY2FuCiAgICAgYWxzbyBiZSBvdmVycmlkZW4gYnkgcHJvdmlkaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgY2FsbGJhY2tzLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIENoYW5nZSB0aGUgInByb2dyZXNzIiBtZWNoYW5pc20gdXNlZCBpbiBrZXktZ2VuZXJhdGlvbiBhbmQKICAgICBwcmltYWxpdHkgdGVzdGluZyB0byBmdW5jdGlvbnMgdGhhdCB0YWtlIGEgbmV3IEJOX0dFTkNCIHBvaW50ZXIgaW4KICAgICBwbGFjZSBvZiBjYWxsYmFjay9hcmd1bWVudCBwYWlycy4gVGhlIG5ldyBBUEkgZnVuY3Rpb25zIGhhdmUgIl9leCIKICAgICBwb3N0Zml4ZXMgYW5kIHRoZSBvbGRlciBmdW5jdGlvbnMgYXJlIHJlaW1wbGVtZW50ZWQgYXMgd3JhcHBlcnMgZm9yCiAgICAgdGhlIG5ldyBvbmVzLiBUaGUgT1BFTlNTTF9OT19ERVBSRUNBVEVEIHN5bWJvbCBjYW4gYmUgdXNlZCB0byBoaWRlCiAgICAgZGVjbGFyYXRpb25zIG9mIHRoZSBvbGQgZnVuY3Rpb25zIHRvIGhlbHAgKGdyYWNlZnVsKSBhdHRlbXB0cyB0bwogICAgIG1pZ3JhdGUgdG8gdGhlIG5ldyBmdW5jdGlvbnMuIEFsc28sIHRoZSBuZXcga2V5LWdlbmVyYXRpb24gQVBJCiAgICAgZnVuY3Rpb25zIG9wZXJhdGUgb24gYSBjYWxsZXItc3VwcGxpZWQga2V5LXN0cnVjdHVyZSBhbmQgcmV0dXJuCiAgICAgc3VjY2Vzcy9mYWlsdXJlIHJhdGhlciB0aGFuIHJldHVybmluZyBhIGtleSBvciBOVUxMIC0gdGhpcyBpcyB0bwogICAgIGhlbHAgbWFrZSAia2V5Z2VuIiBhbm90aGVyIG1lbWJlciBmdW5jdGlvbiBvZiBSU0FfTUVUSE9EIGV0Yy4KCiAgICAgRXhhbXBsZSBmb3IgdXNpbmcgdGhlIG5ldyBjYWxsYmFjayBpbnRlcmZhY2U6CgogICAgICAgICAgaW50ICgqbXlfY2FsbGJhY2spKGludCBhLCBpbnQgYiwgQk5fR0VOQ0IgKmNiKSA9IC4uLjsKICAgICAgICAgIHZvaWQgKm15X2FyZyA9IC4uLjsKICAgICAgICAgIEJOX0dFTkNCIG15X2NiOwoKICAgICAgICAgIEJOX0dFTkNCX3NldCgmbXlfY2IsIG15X2NhbGxiYWNrLCBteV9hcmcpOwoKICAgICAgICAgIHJldHVybiBCTl9pc19wcmltZV9leChzb21lX2JpZ251bSwgQk5fcHJpbWVfY2hlY2tzLCBOVUxMLCAmY2IpOwogICAgICAgICAgLyogRm9yIHRoZSBtZWFuaW5nIG9mIGEsIGIgaW4gY2FsbHMgdG8gbXlfY2FsbGJhY2soKSwgc2VlIHRoZQogICAgICAgICAgICogZG9jdW1lbnRhdGlvbiBvZiB0aGUgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgY2FsbGJhY2suCiAgICAgICAgICAgKiBjYiB3aWxsIHBvaW50IHRvIG15X2NiOyBteV9hcmcgY2FuIGJlIHJldHJpZXZlZCBhcyBjYi0+YXJnLgogICAgICAgICAgICogbXlfY2FsbGJhY2sgc2hvdWxkIHJldHVybiAxIGlmIGl0IHdhbnRzIEJOX2lzX3ByaW1lX2V4KCkKICAgICAgICAgICAqIHRvIGNvbnRpbnVlLCBvciAwIHRvIHN0b3AuCiAgICAgICAgICAgKi8KCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQ2hhbmdlIHRoZSBaTElCIGNvbXByZXNzaW9uIG1ldGhvZCB0byBiZSBzdGF0ZWZ1bCwgYW5kIG1ha2UgaXQKICAgICBhdmFpbGFibGUgdG8gVExTIHdpdGggdGhlIG51bWJlciBkZWZpbmVkIGluIAogICAgIGRyYWZ0LWlldGYtdGxzLWNvbXByZXNzaW9uLTA0LnR4dC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIEFTTi4xIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyBmb3IgQ2VydGlmaWNhdGVQYWlyLCB3aGljaAogICAgIGlzIGRlZmluZWQgYXMgZm9sbG93cyAoYWNjb3JkaW5nIHRvIFguNTA5XzR0aEVkaXRpb25EcmFmdFY2LnBkZik6CgogICAgIENlcnRpZmljYXRlUGFpciA6Oj0gU0VRVUVOQ0UgewogICAgICAgIGZvcndhcmQJCVswXQlDZXJ0aWZpY2F0ZSBPUFRJT05BTCwKICAgICAgICByZXZlcnNlCQlbMV0JQ2VydGlmaWNhdGUgT1BUSU9OQUwsCiAgICAgICAgLS0gYXQgbGVhc3Qgb25lIG9mIHRoZSBwYWlyIHNoYWxsIGJlIHByZXNlbnQgLS0gfQoKICAgICBBbHNvIGltcGxlbWVudCB0aGUgUEVNIGZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBjZXJ0aWZpY2F0ZQogICAgIHBhaXJzLCBhbmQgZGVmaW5lZCB0aGUgUEVNIHRhZyBhcyAiQ0VSVElGSUNBVEUgUEFJUiIuCgogICAgIFRoaXMgbmVlZGVkIHRvIGJlIGRlZmluZWQsIG1vc3RseSBmb3IgdGhlIHNha2Ugb2YgdGhlIExEQVAKICAgICBhdHRyaWJ1dGUgY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIsIGJ1dCBtYXkgcHJvdmUgdXNlZnVsIGVsc2V3aGVyZSBhcwogICAgIHdlbGwuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBpbmhpYml0IHN5bWxpbmtpbmcgb2Ygc2hhcmVkIGxpYnJhcmllcyBpbgogICAgIE1ha2VmaWxlLnNoYXJlZCwgZm9yIEN5Z3dpbidzIHNha2UuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRXh0ZW5kIHRoZSBCSUdOVU0gQVBJIGJ5IGNyZWF0aW5nIGEgZnVuY3Rpb24gCiAgICAgICAgICB2b2lkIEJOX3NldF9uZWdhdGl2ZShCSUdOVU0gKmEsIGludCBuZWcpOwogICAgIGFuZCBhIG1hY3JvIHRoYXQgYmVoYXZlIGxpa2UKICAgICAgICAgIGludCAgQk5faXNfbmVnYXRpdmUoY29uc3QgQklHTlVNICphKTsKCiAgICAgdG8gYXZvaWQgdGhlIG5lZWQgdG8gYWNjZXNzICdhLT5uZWcnIGRpcmVjdGx5IGluIGFwcGxpY2F0aW9ucy4KICAgICBbTmlscyBMYXJzY2hdCgogICopIEltcGxlbWVudCBmYXN0IG1vZHVsYXIgcmVkdWN0aW9uIGZvciBwc2V1ZG8tTWVyc2VubmUgcHJpbWVzCiAgICAgdXNlZCBpbiBOSVNUIGN1cnZlcyAoY3J5cHRvL2JuL2JuX25pc3QuYywgY3J5cHRvL2VjL2VjcF9uaXN0LmMpLgogICAgIEVDX0dST1VQX25ld19jdXJ2ZV9HRnAoKSB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IHVzZSB0aGlzCiAgICAgaWYgYXBwbGljYWJsZS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCBuZXcgbG9jayB0eXBlIChDUllQVE9fTE9DS19CTikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHRoZSBFTkdJTkUgZnJhbWV3b3JrIHRvIGF1dG9tYXRpY2FsbHkgbG9hZCBlbmdpbmVzCiAgICAgZHluYW1pY2FsbHkgZnJvbSBzcGVjaWZpYyBkaXJlY3RvcmllcyB1bmxlc3MgdGhleSBjb3VsZCBiZQogICAgIGZvdW5kIHRvIGFscmVhZHkgYmUgYnVpbHQgaW4gb3IgbG9hZGVkLiAgTW92ZSBhbGwgdGhlCiAgICAgY3VycmVudCBlbmdpbmVzIGV4Y2VwdCBmb3IgdGhlIGNyeXB0b2RldiBvbmUgdG8gYSBuZXcKICAgICBkaXJlY3RvcnkgZW5naW5lcy8uCiAgICAgVGhlIGVuZ2luZXMgaW4gZW5naW5lcy8gYXJlIGJ1aWx0IGFzIHNoYXJlZCBsaWJyYXJpZXMgaWYKICAgICB0aGUgInNoYXJlZCIgb3B0aW9ucyB3YXMgZ2l2ZW4gdG8gLi9Db25maWd1cmUgb3IgLi9jb25maWcuCiAgICAgT3RoZXJ3aXNlLCB0aGV5IGFyZSBpbnNlcnRlZCBpbiBsaWJjcnlwdG8uYS4KICAgICAvdXNyL2xvY2FsL3NzbC9lbmdpbmVzIGlzIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBmb3IgZHluYW1pYwogICAgIGVuZ2luZXMsIGJ1dCB0aGF0IGNhbiBiZSBvdmVycmlkZW4gYXQgY29uZmlndXJlIHRpbWUgdGhyb3VnaAogICAgIHRoZSB1c3VhbCB1c2Ugb2YgLS1wcmVmaXggYW5kL29yIC0tb3BlbnNzbGRpciwgYW5kIGF0IHJ1bgogICAgIHRpbWUgd2l0aCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgT1BFTlNTTF9FTkdJTkVTLgogICAgIFtHZW9mZiBUaG9ycGUgYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIE1ha2VmaWxlLnNoYXJlZCwgYSBoZWxwZXIgbWFrZWZpbGUgdG8gYnVpbGQgc2hhcmVkCiAgICAgbGlicmFyaWVzLiAgQWRhcHQgTWFrZWZpbGUub3JnLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB2ZXJzaW9uIGluZm8gdG8gV2luMzIgRExMcy4KICAgICBbUGV0ZXIgJ0x1bmEnIFJ1bmVzdGlnIiA8cGV0ZXJAcnVuZXN0aWcuY29tPl0KCiAgKikgQWRkIG5ldyAnbWVkaXVtIGxldmVsJyBQS0NTIzEyIEFQSS4gQ2VydGlmaWNhdGVzIGFuZCBrZXlzCiAgICAgY2FuIGJlIGFkZGVkIHVzaW5nIHRoaXMgQVBJIHRvIGNyZWF0ZWQgYXJiaXRyYXJ5IFBLQ1MjMTIKICAgICBmaWxlcyB3aGlsZSBhdm9pZGluZyB0aGUgbG93IGxldmVsIEFQSS4KCiAgICAgTmV3IG9wdGlvbnMgdG8gUEtDUzEyX2NyZWF0ZSgpLCBrZXkgb3IgY2VydCBjYW4gYmUgTlVMTCBhbmQKICAgICB3aWxsIHRoZW4gYmUgb21pdHRlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZS4gVGhlIGVuY3J5cHRpb24KICAgICBhbGdvcml0aG0gTklEcyBjYW4gYmUgc2V0IHRvIC0xIGZvciBubyBlbmNyeXB0aW9uLCB0aGUgbWFjCiAgICAgaXRlcmF0aW9uIGNvdW50IGNhbiBiZSBzZXQgdG8gMCB0byBvbWl0IHRoZSBtYWMuCgogICAgIEVuaGFuY2UgcGtjczEyIHV0aWxpdHkgYnkgbWFraW5nIHRoZSAtbm9rZXlzIGFuZCAtbm9jZXJ0cwogICAgIG9wdGlvbnMgd29yayB3aGVuIGNyZWF0aW5nIGEgUEtDUyMxMiBmaWxlLiBOZXcgb3B0aW9uIC1ub21hYwogICAgIHRvIG9taXQgdGhlIG1hYywgTk9ORSBjYW4gYmUgc2V0IGZvciBhbiBlbmNyeXB0aW9uIGFsZ29yaXRobS4KICAgICBOZXcgY29kZSBpcyBtb2RpZmllZCB0byB1c2UgdGhlIGVuaGFuY2VkIFBLQ1MxMl9jcmVhdGUoKQogICAgIGluc3RlYWQgb2YgdGhlIGxvdyBsZXZlbCBBUEkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIEFTTjEgZW5jb2RlciB0byBzdXBwb3J0IGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkCiAgICAgZW5jb2RpbmcuIFRoaXMgY2FuIG91dHB1dCBzZXF1ZW5jZXMgdGFncyBhbmQgb2N0ZXQgc3RyaW5ncyBpbgogICAgIHRoaXMgZm9ybS4gTW9kaWZ5IHBrN19hc24xLmMgdG8gc3VwcG9ydCBpbmRlZmluaXRlIGxlbmd0aAogICAgIGVuY29kaW5nLiBUaGlzIGlzIGV4cGVyaW1lbnRhbCBhbmQgbmVlZHMgYWRkaXRpb25hbCBjb2RlIHRvCiAgICAgYmUgdXNlZnVsLCBzdWNoIGFzIGFuIEFTTjEgYmlvIGFuZCBzb21lIGVuaGFuY2VkIHN0cmVhbWluZwogICAgIFBLQ1MjNyBjb2RlLgoKICAgICBFeHRlbmQgdGVtcGxhdGUgZW5jb2RlIGZ1bmN0aW9uYWxpdHkgc28gdGhhdCB0YWdnaW5nIGlzIHBhc3NlZAogICAgIGRvd24gdG8gdGhlIHRlbXBsYXRlIGVuY29kZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTGV0ICdvcGVuc3NsIHJlcScgZmFpbCBpZiBhbiBhcmd1bWVudCB0byAnLW5ld2tleScgaXMgbm90CiAgICAgcmVjb2duaXplZCBpbnN0ZWFkIG9mIHVzaW5nIFJTQSBhcyBhIGRlZmF1bHQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEVDQy1iYXNlZCBjaXBoZXJzdWl0ZXMgZnJvbSBkcmFmdC1pZXRmLXRscy1lY2MtMDEudHh0LgogICAgIEFzIHRoZXNlIGFyZSBub3Qgb2ZmaWNpYWwsIHRoZXkgYXJlIG5vdCBpbmNsdWRlZCBpbiAiQUxMIjsKICAgICB0aGUgIkVDQ2RyYWZ0IiBjaXBoZXJzdWl0ZSBncm91cCBhbGlhcyBjYW4gYmUgdXNlZCB0byBzZWxlY3QgdGhlbS4KICAgICBbVmlwdWwgR3VwdGEgYW5kIFN1bWl0IEd1cHRhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBFQ0RIIGVuZ2luZSBzdXBwb3J0LgogICAgIFtOaWxzIEd1cmEgYW5kIERvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgRUNESCBpbiBuZXcgZGlyZWN0b3J5IGNyeXB0by9lY2RoLy4KICAgICBbRG91Z2xhcyBTdGViaWxhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIExldCBCTl9yYW5kX3JhbmdlKCkgYWJvcnQgd2l0aCBhbiBlcnJvciBhZnRlciAxMDAgaXRlcmF0aW9ucwogICAgIHdpdGhvdXQgc3VjY2VzcyAod2hpY2ggaW5kaWNhdGVzIGEgYnJva2VuIFBSTkcpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBCTl9tb2Rfc3FydCgpIHNvIHRoYXQgaXQgdmVyaWZpZXMgdGhhdCB0aGUgaW5wdXQgdmFsdWUKICAgICBpcyByZWFsbHkgdGhlIHNxdWFyZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKFByZXZpb3VzbHksCiAgICAgQk5fbW9kX3NxcnQgd291bGQgc2hvdyBHSUdPIGJlaGF2aW91ci4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIG5hbWVkIGVsbGlwdGljIGN1cnZlcyBvdmVyIGJpbmFyeSBmaWVsZHMgZnJvbSBYOS42MiwgU0VDRywKICAgICBhbmQgV0FQL1dUTFM7IGFkZCBPSURzIHRoYXQgd2VyZSBzdGlsbCBtaXNzaW5nLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgRXh0ZW5kIHRoZSBFQyBsaWJyYXJ5IGZvciBlbGxpcHRpYyBjdXJ2ZXMgb3ZlciBiaW5hcnkgZmllbGRzCiAgICAgKG5ldyBmaWxlcyBlYzJfc21wbC5jLCBlYzJfc21wdC5jLCBlYzJfbXVsdC5jIGluIGNyeXB0by9lYy8pLgogICAgIE5ldyBFQ19NRVRIT0Q6CgogICAgICAgICAgRUNfR0YybV9zaW1wbGVfbWV0aG9kCgogICAgIE5ldyBBUEkgZnVuY3Rpb25zOgoKICAgICAgICAgIEVDX0dST1VQX25ld19jdXJ2ZV9HRjJtCiAgICAgICAgICBFQ19HUk9VUF9zZXRfY3VydmVfR0YybQogICAgICAgICAgRUNfR1JPVVBfZ2V0X2N1cnZlX0dGMm0KICAgICAgICAgIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybQogICAgICAgICAgRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtCiAgICAgICAgICBFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRjJtCgogICAgIFBvaW50IGNvbXByZXNzaW9uIGZvciBiaW5hcnkgZmllbGRzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgZm9yCiAgICAgcGF0ZW50IHJlYXNvbnMgKGNvbXBpbGUgd2l0aCBPUEVOU1NMX0VDX0JJTl9QVF9DT01QIGRlZmluZWQgdG8KICAgICBlbmFibGUgaXQpLgoKICAgICBBcyBiaW5hcnkgcG9seW5vbWlhbHMgYXJlIHJlcHJlc2VudGVkIGFzIEJJR05VTXMsIHZhcmlvdXMgbWVtYmVycwogICAgIG9mIHRoZSBFQ19HUk9VUCBhbmQgRUNfUE9JTlQgZGF0YSBzdHJ1Y3R1cmVzIGNhbiBiZSBzaGFyZWQKICAgICBiZXR3ZWVuIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHByaW1lIGZpZWxkcyBhbmQgYmluYXJ5IGZpZWxkczsKICAgICB0aGUgYWJvdmUgLi4uX0dGMm0gZnVuY3Rpb25zIChleGNlcHQgZm9yIEVYX0dST1VQX25ld19jdXJ2ZV9HRjJtKQogICAgIGFyZSBlc3NlbnRpYWxseSBpZGVudGljYWwgdG8gdGhlaXIgLi4uX0dGcCBjb3VudGVycGFydHMuCiAgICAgKEZvciBzaW1wbGljaXR5LCB0aGUgJy4uLl9HRnAnIHByZWZpeCBoYXMgYmVlbiBkcm9wcGVkIGZyb20KICAgICB2YXJpb3VzIGludGVybmFsIG1ldGhvZCBuYW1lcy4pCgogICAgIEFuIGludGVybmFsICdmaWVsZF9kaXYnIG1ldGhvZCAoc2ltaWxhciB0byAnZmllbGRfbXVsJyBhbmQKICAgICAnZmllbGRfc3FyJykgaGFzIGJlZW4gYWRkZWQ7IHRoaXMgaXMgdXNlZCBvbmx5IGZvciBiaW5hcnkgZmllbGRzLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgT3B0aW9uYWxseSBkaXNwYXRjaCBFQ19QT0lOVF9tdWwoKSwgRUNfUE9JTlRfcHJlY29tcHV0ZV9tdWx0KCkKICAgICB0aHJvdWdoIG1ldGhvZHMgKCdtdWwnLCAncHJlY29tcHV0ZV9tdWx0JykuCgogICAgIFRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9ucyAobm93IGludGVybmFsbHkgY2FsbGVkICdlY193TkFGX211bCcKICAgICBhbmQgJ2VjX3dOQUZfcHJlY29tcHV0ZWRfbXVsdCcpIHJlbWFpbiB0aGUgZGVmYXVsdCBpZiB0aGVzZQogICAgIG1ldGhvZHMgYXJlIHVuZGVmaW5lZC4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIE5ldyBmdW5jdGlvbiBFQ19HUk9VUF9nZXRfZGVncmVlLCB3aGljaCBpcyBkZWZpbmVkIHRocm91Z2gKICAgICBFQ19NRVRIT0QuICBGb3IgY3VydmVzIG92ZXIgcHJpbWUgZmllbGRzLCB0aGlzIHJldHVybnMgdGhlIGJpdAogICAgIGxlbmd0aCBvZiB0aGUgbW9kdWx1cy4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIE5ldyBmdW5jdGlvbnMgRUNfR1JPVVBfZHVwLCBFQ19QT0lOVF9kdXAuCiAgICAgKFRoZXNlIHNpbXBseSBjYWxsIC4uLl9uZXcgIGFuZCAuLi5fY29weSkuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgYmluYXJ5IHBvbHlub21pYWwgYXJpdGhtZXRpYyBzb2Z0d2FyZSBpbiBjcnlwdG8vYm4vYm5fZ2YybS5jLgogICAgIFBvbHlub21pYWxzIGFyZSByZXByZXNlbnRlZCBhcyBCSUdOVU1zICh3aGVyZSB0aGUgc2lnbiBiaXQgaXMgbm90CiAgICAgdXNlZCkgaW4gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgW21hY3Jvc106ICAKCiAgICAgICAgICBCTl9HRjJtX2FkZAogICAgICAgICAgQk5fR0YybV9zdWIgICAgICAgICAgICAgWz0gQk5fR0YybV9hZGRdCiAgICAgICAgICBCTl9HRjJtX21vZCAgICAgICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2RfbXVsICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX211bF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9zcXIgICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2Rfc3FyX2Fycl0KICAgICAgICAgIEJOX0dGMm1fbW9kX2ludgogICAgICAgICAgQk5fR0YybV9tb2RfZXhwICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX2V4cF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9zcXJ0ICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2Rfc3FydF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9zb2x2ZV9xdWFkICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2Rfc29sdmVfcXVhZF9hcnJdCiAgICAgICAgICBCTl9HRjJtX2NtcCAgICAgICAgICAgICBbPSBCTl91Y21wXQoKICAgICAoTm90ZSB0aGF0IG9ubHkgdGhlICdtb2QnIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgZm9yIGZpZWxkcyBHRigyXm0pLgogICAgIEJOX0dGMm1fYWRkKCkgaXMgbWlzbm9tZXIsIGJ1dCB0aGlzIGlzIGZvciB0aGUgc2FrZSBvZiBjb25zaXN0ZW5jeS4pCgogICAgIEZvciBzb21lIGZ1bmN0aW9ucywgYW4gdGhlIGlycmVkdWNpYmxlIHBvbHlub21pYWwgZGVmaW5pbmcgYQogICAgIGZpZWxkIGNhbiBiZSBnaXZlbiBhcyBhbiAndW5zaWduZWQgaW50W10nIHdpdGggc3RyaWN0bHkKICAgICBkZWNyZWFzaW5nIGVsZW1lbnRzIGdpdmluZyB0aGUgaW5kaWNlcyBvZiB0aG9zZSBiaXRzIHRoYXQgYXJlIHNldDsKICAgICBpLmUuLCBwW10gcmVwcmVzZW50cyB0aGUgcG9seW5vbWlhbAogICAgICAgICAgZih0KSA9IHRecFswXSArIHRecFsxXSArIC4uLiArIHRecFtrXQogICAgIHdoZXJlCiAgICAgICAgICBwWzBdID4gcFsxXSA+IC4uLiA+IHBba10gPSAwLgogICAgIFRoaXMgYXBwbGllcyB0byB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICBCTl9HRjJtX21vZF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX211bF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX3Nxcl9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX2ludl9hcnIgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9pbnZdCiAgICAgICAgICBCTl9HRjJtX21vZF9kaXZfYXJyICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfZGl2XQogICAgICAgICAgQk5fR0YybV9tb2RfZXhwX2FycgogICAgICAgICAgQk5fR0YybV9tb2Rfc3FydF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX3NvbHZlX3F1YWRfYXJyCiAgICAgICAgICBCTl9HRjJtX3BvbHkyYXJyCiAgICAgICAgICBCTl9HRjJtX2FycjJwb2x5CgogICAgIENvbnZlcnNpb24gY2FuIGJlIHBlcmZvcm1lZCBieSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICBCTl9HRjJtX3BvbHkyYXJyCiAgICAgICAgICBCTl9HRjJtX2FycjJwb2x5CgogICAgIGJudGVzdC5jIGhhcyBhZGRpdGlvbmFsIHRlc3RzIGZvciBiaW5hcnkgcG9seW5vbWlhbCBhcml0aG1ldGljLgoKICAgICBUd28gaW1wbGVtZW50YXRpb25zIGZvciBCTl9HRjJtX21vZF9kaXYoKSBhcmUgYXZhaWxhYmxlLgogICAgIFRoZSBkZWZhdWx0IGFsZ29yaXRobSBzaW1wbHkgdXNlcyBCTl9HRjJtX21vZF9pbnYoKSBhbmQKICAgICBCTl9HRjJtX21vZF9tdWwoKS4gIFRoZSBhbHRlcm5hdGl2ZSBhbGdvcml0aG0gaXMgY29tcGlsZWQgaW4gb25seQogICAgIGlmIE9QRU5TU0xfU1VOX0dGMk1fRElWIGlzIGRlZmluZWQgKHBhdGVudCBwZW5kaW5nOyByZWFkIHRoZQogICAgIGNvcHlyaWdodCBub3RpY2UgaW4gY3J5cHRvL2JuL2JuX2dmMm0uYyBiZWZvcmUgZW5hYmxpbmcgaXQpLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgQWRkIG5ldyBlcnJvciBjb2RlICdFUlJfUl9ESVNBQkxFRCcgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHNvbWUKICAgICBmdW5jdGlvbmFsaXR5IGlzIGRpc2FibGVkIGF0IGNvbXBpbGUtdGltZS4KICAgICBbRG91Z2xhcyBTdGViaWxhIDxkb3VnbGFzLnN0ZWJpbGFAc3VuLmNvbT5dCgogICopIENoYW5nZSBkZWZhdWx0IGJlaGF2aW91ciBvZiAnb3BlbnNzbCBhc24xcGFyc2UnIHNvIHRoYXQgbW9yZQogICAgIGluZm9ybWF0aW9uIGlzIHZpc2libGUgd2hlbiB2aWV3aW5nLCBlLmcuLCBhIGNlcnRpZmljYXRlOgoKICAgICBNb2RpZnkgYXNuMV9wYXJzZTIgKGNyeXB0by9hc24xL2FzbjFfcGFyLmMpIHNvIHRoYXQgaW4gbm9uLSdkdW1wJwogICAgIG1vZGUgdGhlIGNvbnRlbnQgb2Ygbm9uLXByaW50YWJsZSBPQ1RFVCBTVFJJTkdzIGlzIG91dHB1dCBpbiBhCiAgICAgc3R5bGUgc2ltaWxhciB0byBJTlRFR0VScywgYnV0IHdpdGggJ1tIRVggRFVNUF0nIHByZXBlbmRlZCB0bwogICAgIGF2b2lkIHRoZSBhcHBlYXJhbmNlIG9mIGEgcHJpbnRhYmxlIHN0cmluZy4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCAnYXNuMV9mbGFnJyBhbmQgJ2FzbjFfZm9ybScgbWVtYmVyIHRvIEVDX0dST1VQIHdpdGggYWNjZXNzCiAgICAgZnVuY3Rpb25zCiAgICAgICAgICBFQ19HUk9VUF9zZXRfYXNuMV9mbGFnKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9hc24xX2ZsYWcoKQogICAgICAgICAgRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybSgpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKCkKICAgICBUaGVzZSBjb250cm9sIEFTTjEgZW5jb2RpbmcgZGV0YWlsczoKICAgICAtIEN1cnZlcyAoaS5lLiwgZ3JvdXBzKSBhcmUgZW5jb2RlZCBleHBsaWNpdGx5IHVubGVzcyBhc24xX2ZsYWcKICAgICAgIGhhcyBiZWVuIHNldCB0byBPUEVOU1NMX0VDX05BTUVEX0NVUlZFLgogICAgIC0gUG9pbnRzIGFyZSBlbmNvZGVkIGluIHVuY29tcHJlc3NlZCBmb3JtIGJ5IGRlZmF1bHQ7IG9wdGlvbnMgZm9yCiAgICAgICBhc24xX2ZvciBhcmUgYXMgZm9yIHBvaW50Mm9jdCwgbmFtZWx5CiAgICAgICAgICBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQKICAgICAgICAgIFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VECiAgICAgICAgICBQT0lOVF9DT05WRVJTSU9OX0hZQlJJRAoKICAgICBBbHNvIGFkZCAnc2VlZCcgYW5kICdzZWVkX2xlbicgbWVtYmVycyB0byBFQ19HUk9VUCB3aXRoIGFjY2VzcwogICAgIGZ1bmN0aW9ucwogICAgICAgICAgRUNfR1JPVVBfc2V0X3NlZWQoKQogICAgICAgICAgRUNfR1JPVVBfZ2V0MF9zZWVkKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9zZWVkX2xlbigpCiAgICAgVGhpcyBpcyB1c2VkIG9ubHkgZm9yIEFTTjEgcHVycG9zZXMgKHNvIGZhcikuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBBZGQgJ2ZpZWxkX3R5cGUnIG1lbWJlciB0byBFQ19NRVRIT0QsIHdoaWNoIGhvbGRzIHRoZSBOSUQKICAgICBvZiB0aGUgYXBwcm9wcmlhdGUgZmllbGQgdHlwZSBPSUQuICBUaGUgbmV3IGZ1bmN0aW9uCiAgICAgRUNfTUVUSE9EX2dldF9maWVsZF90eXBlKCkgcmV0dXJucyB0aGlzIHZhbHVlLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkIGZ1bmN0aW9ucyAKICAgICAgICAgIEVDX1BPSU5UX3BvaW50MmJuKCkKICAgICAgICAgIEVDX1BPSU5UX2JuMnBvaW50KCkKICAgICAgICAgIEVDX1BPSU5UX3BvaW50MmhleCgpCiAgICAgICAgICBFQ19QT0lOVF9oZXgycG9pbnQoKQogICAgIHByb3ZpZGluZyB1c2VmdWwgaW50ZXJmYWNlcyB0byBFQ19QT0lOVF9wb2ludDJvY3QoKSBhbmQKICAgICBFQ19QT0lOVF9vY3QycG9pbnQoKS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIENoYW5nZSBpbnRlcm5hbHMgb2YgdGhlIEVDIGxpYnJhcnkgc28gdGhhdCB0aGUgZnVuY3Rpb25zCiAgICAgICAgICBFQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9nZW5lcmF0b3IoKQogICAgICAgICAgRUNfR1JPVVBfZ2V0X29yZGVyKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9jb2ZhY3RvcigpCiAgICAgYXJlIGltcGxlbWVudGVkIGRpcmVjdGx5IGluIGNyeXB0by9lYy9lY19saWIuYyBhbmQgbm90IGRpc3BhdGNoZWQKICAgICB0byBtZXRob2RzLCB3aGljaCB3b3VsZCBsZWFkIHRvIHVubmVjZXNzYXJ5IGNvZGUgZHVwbGljYXRpb24gd2hlbgogICAgIGFkZGluZyBkaWZmZXJlbnQgdHlwZXMgb2YgY3VydmVzLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPiB3aXRoIGlucHV0IGJ5IEJvZG8gTW9lbGxlcl0KCiAgKikgSW1wbGVtZW50IGNvbXB1dGVfd05BRiAoY3J5cHRvL2VjL2VjX211bHQuYykgd2l0aG91dCBCSUdOVU0KICAgICBhcml0aG1ldGljLCBhbmQgc3VjaCB0aGF0IG1vZGlmaWVkIHdOQUZzIGFyZSBnZW5lcmF0ZWQKICAgICAod2hpY2ggYXZvaWQgbGVuZ3RoIGV4cGFuc2lvbiBpbiBtYW55IGNhc2VzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYSBmdW5jdGlvbiBFQ19HUk9VUF9jaGVja19kaXNjcmltaW5hbnQoKSAoZGVmaW5lZCB2aWEKICAgICBFQ19NRVRIT0QpIHRoYXQgdmVyaWZpZXMgdGhhdCB0aGUgY3VydmUgZGlzY3JpbWluYW50IGlzIG5vbi16ZXJvLgoKICAgICBBZGQgYSBmdW5jdGlvbiBFQ19HUk9VUF9jaGVjaygpIHRoYXQgbWFrZXMgc29tZSBzYW5pdHkgdGVzdHMKICAgICBvbiBhIEVDX0dST1VQLCBpdHMgZ2VuZXJhdG9yIGFuZCBvcmRlci4gIFRoaXMgaW5jbHVkZXMKICAgICBFQ19HUk9VUF9jaGVja19kaXNjcmltaW5hbnQoKS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCBFQ0RTQSBpbiBuZXcgZGlyZWN0b3J5IGNyeXB0by9lY2RzYS8uCgogICAgIEFkZCBhcHBsaWNhdGlvbnMgJ29wZW5zc2wgZWNwYXJhbScgYW5kICdvcGVuc3NsIGVjZHNhJwogICAgICh0aGVzZSBhcmUgYmFzZWQgb24gJ29wZW5zc2wgZHNhcGFyYW0nIGFuZCAnb3BlbnNzbCBkc2EnKS4KCiAgICAgRUNEU0Egc3VwcG9ydCBpcyBhbHNvIGluY2x1ZGVkIGluIHZhcmlvdXMgb3RoZXIgZmlsZXMgYWNyb3NzIHRoZQogICAgIGxpYnJhcnkuICBNb3N0IG5vdGFibHksCiAgICAgLSAnb3BlbnNzbCByZXEnIG5vdyBoYXMgYSAnLW5ld2tleSBlY2RzYTpmaWxlJyBvcHRpb247CiAgICAgLSBFVlBfUEtDUzgyUEtFWSAoY3J5cHRvL2V2cC9ldnBfcGtleS5jKSBub3cgY2FuIGhhbmRsZSBFQ0RTQTsKICAgICAtIFg1MDlfUFVCS0VZX2dldCAoY3J5cHRvL2FzbjEveF9wdWJrZXkuYykgYW5kCiAgICAgICBkMmlfUHVibGljS2V5IChjcnlwdG8vYXNuMS9kMmlfcHUuYykgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIG1ha2UKICAgICAgIHRoZW0gc3VpdGFibGUgZm9yIEVDRFNBIHdoZXJlIGRvbWFpbiBwYXJhbWV0ZXJzIG11c3QgYmUKICAgICAgIGV4dHJhY3RlZCBiZWZvcmUgdGhlIHNwZWNpZmljIHB1YmxpYyBrZXk7CiAgICAgLSBFQ0RTQSBlbmdpbmUgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEluY2x1ZGUgc29tZSBuYW1lZCBlbGxpcHRpYyBjdXJ2ZXMsIGFuZCBhZGQgT0lEcyBmcm9tIFg5LjYyLAogICAgIFNFQ0csIGFuZCBXQVAvV1RMUy4gIEVhY2ggY3VydmUgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIG5ldwogICAgIGZ1bmN0aW9uCiAgICAgICAgICBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZSgpLAogICAgIGFuZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbmFtZWQgY3VydmVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoCiAgICAgICAgICBFQ19nZXRfYnVpbHRpbl9jdXJ2ZXMoKS4KICAgICBBbHNvIGFkZCBhICdjdXJ2ZV9uYW1lJyBtZW1iZXIgdG8gRUNfR1JPVVAgb2JqZWN0cywgd2hpY2ggY2FuIGJlCiAgICAgYWNjZXNzZWQgdmlhCiAgICAgICAgIEVDX0dST1VQX3NldF9jdXJ2ZV9uYW1lKCkKICAgICAgICAgRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoKQogICAgIFtOaWxzIExhcnNjaCA8bGFyc2NoQHRydXN0Y2VudGVyLmRlLCBCb2RvIE1vZWxsZXJdCiAKICAqKSBSZW1vdmUgYSBmZXcgY2FsbHMgdG8gYm5fd2V4cGFuZCgpIGluIEJOX3NxcigpICh0aGUgb25lIGluIHRoZXJlCiAgICAgd2FzIGFjdHVhbGx5IG5ldmVyIG5lZWRlZCkgYW5kIGluIEJOX211bCgpLiAgVGhlIHJlbW92YWwgaW4gQk5fbXVsKCkKICAgICByZXF1aXJlZCBhIHNtYWxsIGNoYW5nZSBpbiBibl9tdWxfcGFydF9yZWN1cnNpdmUoKSBhbmQgdGhlIGFkZGl0aW9uCiAgICAgb2YgdGhlIGZ1bmN0aW9ucyBibl9jbXBfcGFydF93b3JkcygpLCBibl9zdWJfcGFydF93b3JkcygpIGFuZAogICAgIGJuX2FkZF9wYXJ0X3dvcmRzKCksIHdoaWNoIGRvIHRoZSBzYW1lIHRoaW5nIGFzIGJuX2NtcF93b3JkcygpLAogICAgIGJuX3N1Yl93b3JkcygpIGFuZCBibl9hZGRfd29yZHMoKSBleGNlcHQgdGhleSB0YWtlIGFycmF5cyB3aXRoCiAgICAgZGlmZmVyaW5nIHNpemVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43bCBhbmQgMC45LjdtICBbMjMgRmViIDIwMDddCgogICopIENsZWFuc2UgUEVNIGJ1ZmZlcnMgYmVmb3JlIGZyZWVpbmcgdGhlbSBzaW5jZSB0aGV5IG1heSBjb250YWluIAogICAgIHNlbnNpdGl2ZSBkYXRhLgogICAgIFtCZW5qYW1pbiBCZW5uZXR0IDxiZW5AcHNjLmVkdT5dCgogICopIEluY2x1ZGUgIiFlTlVMTCIgaW4gU1NMX0RFRkFVTFRfQ0lQSEVSX0xJU1QgdG8gbWFrZSBzdXJlIHRoYXQKICAgICBhIGNpcGhlcnN1aXRlIHN0cmluZyBzdWNoIGFzICJERUZBVUxUOlJTQSIgY2Fubm90IGVuYWJsZQogICAgIGF1dGhlbnRpY2F0aW9uLW9ubHkgY2lwaGVyc3VpdGVzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFNpbmNlIEFFUzEyOCBhbmQgQUVTMjU2IHNoYXJlIGEgc2luZ2xlIG1hc2sgYml0IGluIHRoZSBsb2dpYyBvZgogICAgIHNzbC9zc2xfY2lwaC5jLCB0aGUgY29kZSBmb3IgbWFza2luZyBvdXQgZGlzYWJsZWQgY2lwaGVycyBuZWVkcyBhCiAgICAga2x1ZGdlIHRvIHdvcmsgcHJvcGVybHkgaWYgQUVTMTI4IGlzIGF2YWlsYWJsZSBhbmQgQUVTMjU2IGlzbid0LgogICAgIFtWaWN0b3IgRHVjaG92bmldCgogICopIEV4cGFuZCBzZWN1cml0eSBib3VuZGFyeSB0byBtYXRjaCAxLjEuMSBtb2R1bGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIHJlZHVuZGFudCBmZWF0dXJlczogaGFzaCBmaWxlIHNvdXJjZSwgZWRpdGluZyBvZiB0ZXN0IHZlY3RvcnMKICAgICBtb2RpZnkgZmlwc2xkIHRvIHVzZSBleHRlcm5hbCBmaXBzX3ByZW1haW4uYyBzaWduYXR1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHBlcmwgc2NyaXB0IG1rZmlwc3Njci5wbCB0byBjcmVhdGUgc2hlbGwgc2NyaXB0cyBvciBiYXRjaCBmaWxlcyB0bwogICAgIHJ1biBhbGdvcml0aG0gdGVzdCBwcm9ncmFtcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGFsZ29yaXRobSB0ZXN0IHByb2dyYW1zIG1vcmUgdG9sZXJhbnQgb2Ygd2hpdGVzcGFjZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIYXZlIFNTTC9UTFMgc2VydmVyIGltcGxlbWVudGF0aW9uIHRvbGVyYXRlICJtaXNtYXRjaGVkIiByZWNvcmQKICAgICBwcm90b2NvbCB2ZXJzaW9uIHdoaWxlIHJlY2VpdmluZyBDbGllbnRIZWxsbyBldmVuIGlmIHRoZQogICAgIENsaWVudEhlbGxvIGlzIGZyYWdtZW50ZWQuICAoVGhlIHNlcnZlciBjYW4ndCBpbnNpc3Qgb24gdGhlCiAgICAgcGFydGljdWxhciBwcm90b2NvbCB2ZXJzaW9uIGl0IGhhcyBjaG9zZW4gYmVmb3JlIHRoZSBTZXJ2ZXJIZWxsbwogICAgIG1lc3NhZ2UgaGFzIGluZm9ybWVkIHRoZSBjbGllbnQgYWJvdXQgaGlzIGNob2ljZS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTG9hZCBlcnJvciBjb2RlcyBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBwcmVzZW50IGluc3RlYWQgb2YgdXNpbmcgYQogICAgIHN0YXRpYyB2YXJpYWJsZS4gVGhpcyBhbGxvd3MgdGhlbSB0byBiZSBjbGVhbmx5IHVubG9hZGVkIGFuZCByZWxvYWRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2sgYW5kIDAuOS43bCAgWzI4IFNlcCAyMDA2XQoKICAqKSBJbnRyb2R1Y2UgbGltaXRzIHRvIHByZXZlbnQgbWFsaWNpb3VzIGtleXMgYmVpbmcgYWJsZSB0bwogICAgIGNhdXNlIGEgZGVuaWFsIG9mIHNlcnZpY2UuICAoQ1ZFLTIwMDYtMjk0MCkKICAgICBbU3RldmUgSGVuc29uLCBCb2RvIE1vZWxsZXJdCgogICopIEZpeCBBU04uMSBwYXJzaW5nIG9mIGNlcnRhaW4gaW52YWxpZCBzdHJ1Y3R1cmVzIHRoYXQgY2FuIHJlc3VsdAogICAgIGluIGEgZGVuaWFsIG9mIHNlcnZpY2UuICAoQ1ZFLTIwMDYtMjkzNykgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBidWZmZXIgb3ZlcmZsb3cgaW4gU1NMX2dldF9zaGFyZWRfY2lwaGVycygpIGZ1bmN0aW9uLiAKICAgICAoQ1ZFLTIwMDYtMzczOCkgW1RhdmlzIE9ybWFuZHkgYW5kIFdpbGwgRHJld3J5LCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgRml4IFNTTCBjbGllbnQgY29kZSB3aGljaCBjb3VsZCBjcmFzaCBpZiBjb25uZWN0aW5nIHRvIGEKICAgICBtYWxpY2lvdXMgU1NMdjIgc2VydmVyLiAgKENWRS0yMDA2LTQzNDMpCiAgICAgW1RhdmlzIE9ybWFuZHkgYW5kIFdpbGwgRHJld3J5LCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgQ2hhbmdlIGNpcGhlcnN1aXRlIHN0cmluZyBwcm9jZXNzaW5nIHNvIHRoYXQgYW4gZXhwbGljaXQKICAgICBjaXBoZXJzdWl0ZSBzZWxlY3RzIHRoaXMgb25lIGNpcGhlcnN1aXRlIChzbyB0aGF0ICJBRVMyNTYtU0hBIgogICAgIHdpbGwgbm8gbG9uZ2VyIGluY2x1ZGUgIkFFUzEyOC1TSEEiKSwgYW5kIGFueSBvdGhlciBzaW1pbGFyCiAgICAgY2lwaGVyc3VpdGUgKHNhbWUgYml0bWFwKSBmcm9tICpvdGhlciogcHJvdG9jb2wgdmVyc2lvbnMgKHNvIHRoYXQKICAgICAiUkM0LU1ENSIgd2lsbCBzdGlsbCBpbmNsdWRlIGJvdGggdGhlIFNTTCAyLjAgY2lwaGVyc3VpdGUgYW5kIHRoZQogICAgIFNTTCAzLjAvVExTIDEuMCBjaXBoZXJzdWl0ZSkuICBUaGlzIGlzIGEgYmFja3BvcnQgY29tYmluaW5nCiAgICAgY2hhbmdlcyBmcm9tIDAuOS44YiBhbmQgMC45LjhkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43aiBhbmQgMC45LjdrICBbMDUgU2VwIDIwMDZdCgogICopIEF2b2lkIFBLQ1MgIzEgdjEuNSBzaWduYXR1cmUgYXR0YWNrIGRpc2NvdmVyZWQgYnkgRGFuaWVsIEJsZWljaGVuYmFjaGVyCiAgICAgKENWRS0yMDA2LTQzMzkpICBbQmVuIExhdXJpZSBhbmQgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIENoYW5nZSB0aGUgVW5peCByYW5kb21uZXNzIGVudHJvcHkgZ2F0aGVyaW5nIHRvIHVzZSBwb2xsKCkgd2hlbgogICAgIHBvc3NpYmxlIGluc3RlYWQgb2Ygc2VsZWN0KCksIHNpbmNlIHRoZSBsYXR0ZXIgaGFzIHNvbWUKICAgICB1bmRlc2lyYWJsZSBsaW1pdGF0aW9ucy4KICAgICBbRGFycnlsIE1pbGVzIHZpYSBSaWNoYXJkIExldml0dGUgYW5kIEJvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSByb2d1ZSBjaXBoZXJzdWl0ZXM6CgogICAgICAtIFNTTHYyIDB4MDggMHgwMCAweDgwICgiUkM0LTY0LU1ENSIpCiAgICAgIC0gU1NMdjMvVExTdjEgMHgwMCAweDYxICgiRVhQMTAyNC1SQzItQ0JDLU1ENSIpCiAgICAgIC0gU1NMdjMvVExTdjEgMHgwMCAweDYwICgiRVhQMTAyNC1SQzQtTUQ1IikKCiAgICAgVGhlIGxhdHRlciB0d28gd2VyZSBwdXJwb3J0ZWRseSBmcm9tCiAgICAgZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wWzAxXS50eHQsIGJ1dCBkbyBub3QgcmVhbGx5CiAgICAgYXBwZWFyIHRoZXJlLgoKICAgICBBbHNvIGRlYWN0aXZlIHRoZSByZW1haW5pbmcgY2lwaGVyc3VpdGVzIGZyb20KICAgICBkcmFmdC1pZXRmLXRscy01Ni1iaXQtY2lwaGVyc3VpdGVzLTAxLnR4dC4gIFRoZXNlIGFyZSBqdXN0IGFzCiAgICAgdW5vZmZpY2lhbCwgYW5kIHRoZSBJRCBoYXMgbG9uZyBleHBpcmVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBSU0EgYmxpbmRpbmcgSGVpc2VuYnVnIChwcm9ibGVtcyBzb21ldGltZXMgb2NjdXJlZCBvbgogICAgIGR1YWwtY29yZSBtYWNoaW5lcykgYW5kIG90aGVyIHBvdGVudGlhbCB0aHJlYWQtc2FmZXR5IGlzc3Vlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2kgYW5kIDAuOS43aiAgWzA0IE1heSAyMDA2XQoKICAqKSBBZGFwdCBmaXBzbGQgYW5kIHRoZSBidWlsZCBzeXN0ZW0gdG8gbGluayBhZ2FpbnN0IHRoZSB2YWxpZGF0ZWQgRklQUwogICAgIG1vZHVsZSBpbiBGSVBTIG1vZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgZm9yIFZDKysgMjAwNSBidWlsZCB1bmRlciBXaW5kb3dzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgV2luZG93cyBidWlsZCB0YXJnZXQgVkMtMzItR01BS0UgZm9yIFZDKysuIFRoaXMgdXNlcyBHTlUgbWFrZSAKICAgICBmcm9tIGEgV2luZG93cyBiYXNoIHNoZWxsIHN1Y2ggYXMgTVNZUy4gSXQgaXMgYXV0b2RldGVjdGVkIGZyb20gdGhlCiAgICAgImNvbmZpZyIgc2NyaXB0IHdoZW4gcnVuIGZyb20gYSBWQysrIGVudmlyb25tZW50LiBNb2RpZnkgc3RhbmRhcmQgVkMrKwogICAgIGJ1aWxkIHRvIHVzZSBmaXBzY2FuaXN0ZXIubyBmcm9tIHRoZSBHTlUgbWFrZSBidWlsZC4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdoIGFuZCAwLjkuN2kgIFsxNCBPY3QgMjAwNV0KCiAgKikgV3JhcHBlZCB0aGUgZGVmaW5pdGlvbiBvZiBFVlBfTUFYX01EX1NJWkUgaW4gYSAjaWZkZWYgT1BFTlNTTF9GSVBTLgogICAgIFRoZSB2YWx1ZSBub3cgZGlmZmVycyBkZXBlbmRpbmcgb24gaWYgeW91IGJ1aWxkIGZvciBGSVBTIG9yIG5vdC4KICAgICBCRVdBUkUhICBBIHByb2dyYW0gbGlua2VkIHdpdGggYSBzaGFyZWQgRklQU2VkIGxpYmNyeXB0byBjYW4ndCBiZQogICAgIHNhZmVseSBydW4gd2l0aCBhIG5vbi1GSVBTZWQgbGliY3J5cHRvLCBhcyBpdCBtYXkgY3Jhc2ggYmVjYXVzZSBvZgogICAgIHRoZSBkaWZmZXJlbmNlIGluZHVjZWQgYnkgdGhpcyBjaGFuZ2UuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43ZyBhbmQgMC45LjdoICBbMTEgT2N0IDIwMDVdCgogICopIFJlbW92ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBTU0xfT1BfTVNJRV9TU0xWMl9SU0FfUEFERElORwogICAgIChwYXJ0IG9mIFNTTF9PUF9BTEwpLiAgVGhpcyBvcHRpb24gdXNlZCB0byBkaXNhYmxlIHRoZQogICAgIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgbWFuLWluLXRoZS1taWRkbGUgcHJvdG9jb2wtdmVyc2lvbgogICAgIHJvbGxiYWNrIGluIHRoZSBTU0wgMi4wIHNlcnZlciBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgYSBiYWQKICAgICBpZGVhLiAgKENWRS0yMDA1LTI5NjkpCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgWXV0YWthIE9pd2EgKFJlc2VhcmNoIENlbnRlcgogICAgIGZvciBJbmZvcm1hdGlvbiBTZWN1cml0eSwgTmF0aW9uYWwgSW5zdGl0dXRlIG9mIEFkdmFuY2VkIEluZHVzdHJpYWwKICAgICBTY2llbmNlIGFuZCBUZWNobm9sb2d5IFtBSVNUXSwgSmFwYW4pXQoKICAqKSBNaW5pbWFsIHN1cHBvcnQgZm9yIFg5LjMxIHNpZ25hdHVyZXMgYW5kIFBTUyBwYWRkaW5nIG1vZGVzLiBUaGlzIGlzCiAgICAgbWFpbmx5IGZvciBGSVBTIGNvbXBsaWFuY2UgYW5kIG5vdCBmdWxseSBpbnRlZ3JhdGVkIGF0IHRoaXMgc3RhZ2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIERTQSBzaWduaW5nLCB1bmxlc3MgRFNBX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSBpcyBzZXQsIHBlcmZvcm0KICAgICB0aGUgZXhwb25lbnRpYXRpb24gdXNpbmcgYSBmaXhlZC1sZW5ndGggZXhwb25lbnQuICAoT3RoZXJ3aXNlLAogICAgIHRoZSBpbmZvcm1hdGlvbiBsZWFrZWQgdGhyb3VnaCB0aW1pbmcgY291bGQgZXhwb3NlIHRoZSBzZWNyZXQga2V5CiAgICAgYWZ0ZXIgbWFueSBzaWduYXR1cmVzOyBjZi4gQmxlaWNoZW5iYWNoZXIncyBhdHRhY2sgb24gRFNBIHdpdGgKICAgICBiaWFzZWQgay4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTWFrZSBhIG5ldyBmaXhlZC13aW5kb3cgbW9kX2V4cCBpbXBsZW1lbnRhdGlvbiB0aGUgZGVmYXVsdCBmb3IKICAgICBSU0EsIERTQSwgYW5kIERIIHByaXZhdGUta2V5IG9wZXJhdGlvbnMgc28gdGhhdCB0aGUgc2VxdWVuY2Ugb2YKICAgICBzcXVhcmVzIGFuZCBtdWx0aXBsaWVzIGFuZCB0aGUgbWVtb3J5IGFjY2VzcyBwYXR0ZXJuIGFyZQogICAgIGluZGVwZW5kZW50IG9mIHRoZSBwYXJ0aWN1bGFyIHNlY3JldCBrZXkuICBUaGlzIHdpbGwgbWl0aWdhdGUKICAgICBjYWNoZS10aW1pbmcgYW5kIHBvdGVudGlhbCByZWxhdGVkIGF0dGFja3MuCgogICAgIEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUoKSBpcyB0aGUgbmV3IGV4cG9uZW50aWF0aW9uIGltcGxlbWVudGF0aW9uLAogICAgIGFuZCB0aGlzIGlzIGF1dG9tYXRpY2FsbHkgdXNlZCBieSBCTl9tb2RfZXhwX21vbnQoKSBpZiB0aGUgbmV3IGZsYWcKICAgICBCTl9GTEdfRVhQX0NPTlNUVElNRSBpcyBzZXQgZm9yIHRoZSBleHBvbmVudC4gIFJTQSwgRFNBLCBhbmQgREgKICAgICB3aWxsIHVzZSB0aGlzIEJOIGZsYWcgZm9yIHByaXZhdGUgZXhwb25lbnRzIHVubGVzcyB0aGUgZmxhZwogICAgIFJTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUsIERTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUsIG9yCiAgICAgREhfRkxBR19OT19FWFBfQ09OU1RUSU1FLCByZXNwZWN0aXZlbHksIGlzIHNldC4KCiAgICAgW01hdHRoZXcgRCBXb29kIChJbnRlbCBDb3JwKSwgd2l0aCBzb21lIGNoYW5nZXMgYnkgQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgdGhlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiBmb3IgU1NMdjIzX21ldGhvZCgpIGFuZAogICAgIFNTTHYyM19jbGllbnRfbWV0aG9kKCkgc28gdGhhdCBpcyB1c2VzIHRoZSBTU0wgMy4wL1RMUyAxLjAKICAgICBDbGllbnQgSGVsbG8gbWVzc2FnZSBmb3JtYXQgaWYgdGhlIFNTTF9PUF9OT19TU0x2MiBvcHRpb24gaXMgc2V0LgogICAgIChQcmV2aW91c2x5LCB0aGUgU1NMIDIuMCBiYWNrd2FyZHMgY29tcGF0aWJsZSBDbGllbnQgSGVsbG8KICAgICBtZXNzYWdlIGZvcm1hdCB3b3VsZCBiZSB1c2VkIGV2ZW4gd2l0aCBTU0xfT1BfTk9fU1NMdjIuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciBzbWltZS10eXBlIE1JTUUgcGFyYW1ldGVyIGluIFMvTUlNRSBtZXNzYWdlcyB3aGljaCBzb21lCiAgICAgY2xpZW50cyBuZWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBCTl9NT05UX0NUWF9zZXRfbG9ja2VkKCkgdG8gc2V0IG1vbnRnb21lcnkgcGFyYW1ldGVycyBpbgogICAgIGEgdGhyZWFkc2FmZSBtYW5uZXIuIE1vZGlmeSByc2EgY29kZSB0byB1c2UgbmV3IGZ1bmN0aW9uIGFuZCBhZGQgY2FsbHMKICAgICB0byBkc2EgYW5kIGRoIGNvZGUgKHdoaWNoIGhhZCByYWNlIGNvbmRpdGlvbnMgYmVmb3JlKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbmNsdWRlIHRoZSBmaXhlZCBlcnJvciBsaWJyYXJ5IGNvZGUgaW4gdGhlIEMgZXJyb3IgZmlsZSBkZWZpbml0aW9ucwogICAgIGluc3RlYWQgb2YgZml4aW5nIHRoZW0gdXAgYXQgcnVudGltZS4gVGhpcyBrZWVwcyB0aGUgZXJyb3IgY29kZQogICAgIHN0cnVjdHVyZXMgY29uc3RhbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdmIGFuZCAwLjkuN2cgIFsxMSBBcHIgMjAwNV0KCiAgW05COiBPcGVuU1NMIDAuOS43aCBhbmQgbGF0ZXIgMC45LjcgcGF0Y2ggbGV2ZWxzIHdlcmUgcmVsZWFzZWQgYWZ0ZXIKICBPcGVuU1NMIDAuOS44Ll0KCiAgKikgRml4ZXMgZm9yIG5ld2VyIGtlcmJlcm9zIGhlYWRlcnMuIE5COiB0aGUgY2FzdHMgYXJlIG5lZWRlZCBiZWNhdXNlCiAgICAgdGhlICdsZW5ndGgnIGZpZWxkIGlzIHNpZ25lZCBvbiBvbmUgdmVyc2lvbiBhbmQgdW5zaWduZWQgb24gYW5vdGhlcgogICAgIHdpdGggbm8gKD8pIG9idmlvdXMgd2F5IHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UsIHdpdGhvdXQgdGhlc2UgVkMrKwogICAgIGNvbXBsYWlucy4gQWxzbyB0aGUgImRlZmluaXRpb24iIG9mIEZBUiAoYmxhbmspIGlzIG5vIGxvbmdlciBpbmNsdWRlZAogICAgIG5vciBpcyB0aGUgZXJyb3IgRU5PTUVNLiBLUkI1X1BSSVZBVEUgaGFzIHRvIGJlIHNldCB0byAxIHRvIHBpY2sgdXAKICAgICBzb21lIG5lZWRlZCBkZWZpbml0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVbmRvIEN5Z3dpbiBjaGFuZ2UuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIHByb3h5IGNlcnRpZmljYXRlcyBhY2NvcmRpbmcgdG8gUkZDIDM4MjAuCiAgICAgQmVjYXVzZSB0aGV5IG1heSBiZSBhIHNlY3VyaXR5IHRocmVhZCB0byB1bmF3YXJlIGFwcGxpY2F0aW9ucywKICAgICB0aGV5IG11c3QgYmUgZXhwbGljaXRlbHkgYWxsb3dlZCBpbiBydW4tdGltZS4gIFNlZQogICAgIGRvY3MvSE9XVE8vcHJveHlfY2VydGlmaWNhdGVzLnR4dCBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2UgYW5kIDAuOS43ZiAgWzIyIE1hciAyMDA1XQoKICAqKSBVc2UgKFNTTF9SQU5ET01fVkFMVUUgLSA0KSBieXRlcyBvZiBwc2V1ZG8gcmFuZG9tIGRhdGEgd2hlbiBnZW5lcmF0aW5nCiAgICAgc2VydmVyIGFuZCBjbGllbnQgcmFuZG9tIHZhbHVlcy4gUHJldmlvdXNseQogICAgIChTU0xfUkFORE9NX1ZBTFVFIC0gc2l6ZW9mKHRpbWVfdCkpIHdvdWxkIGJlIHVzZWQgd2hpY2ggd291bGQgcmVzdWx0IGluCiAgICAgbGVzcyByYW5kb20gZGF0YSB3aGVuIHNpemVvZih0aW1lX3QpID4gNCAoc29tZSA2NCBiaXQgcGxhdGZvcm1zKS4KCiAgICAgVGhpcyBjaGFuZ2UgaGFzIG5lZ2xpZ2libGUgc2VjdXJpdHkgaW1wYWN0IGJlY2F1c2U6CgogICAgIDEuIFNlcnZlciBhbmQgY2xpZW50IHJhbmRvbSB2YWx1ZXMgc3RpbGwgaGF2ZSAyNCBieXRlcyBvZiBwc2V1ZG8gcmFuZG9tCiAgICAgICAgZGF0YS4KCiAgICAgMi4gU2VydmVyIGFuZCBjbGllbnQgcmFuZG9tIHZhbHVlcyBhcmUgc2VudCBpbiB0aGUgY2xlYXIgaW4gdGhlIGluaXRpYWwKICAgICAgICBoYW5kc2hha2UuCgogICAgIDMuIFRoZSBtYXN0ZXIgc2VjcmV0IGlzIGRlcml2ZWQgdXNpbmcgdGhlIHByZW1hc3RlciBzZWNyZXQgKDQ4IGJ5dGVzIGluCiAgICAgICAgc2l6ZSBmb3Igc3RhdGljIFJTQSBjaXBoZXJzdWl0ZXMpIGFzIHdlbGwgYXMgY2xpZW50IHNlcnZlciBhbmQgcmFuZG9tCiAgICAgICAgdmFsdWVzLgoKICAgICBUaGUgT3BlblNTTCB0ZWFtIHdvdWxkIGxpa2UgdG8gdGhhbmsgdGhlIFVLIE5JU0NDIGZvciBicmluZ2luZyB0aGlzIGlzc3VlCiAgICAgdG8gb3VyIGF0dGVudGlvbi4gCgogICAgIFtTdGVwaGVuIEhlbnNvbiwgcmVwb3J0ZWQgYnkgVUsgTklTQ0NdCgogICopIFVzZSBXaW5kb3dzIHJhbmRvbW5lc3MgY29sbGVjdGlvbiBvbiBDeWd3aW4uCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBoYW5nIGluIEVHRC9QUk5HRCBxdWVyeSB3aGVuIGNvbW11bmljYXRpb24gc29ja2V0IGlzIGNsb3NlZAogICAgIHByZW1hdHVyZWx5IGJ5IEVHRC9QUk5HRC4KICAgICBbRGFycmVuIFR1Y2tlciA8ZHR1Y2tlckB6aXAuY29tLmF1PiB2aWEgTHV0eiBK5G5pY2tlLCByZXNvbHZlcyAjMTAxNF0KCiAgKikgUHJvbXB0IGZvciBwYXNzIHBocmFzZXMgd2hlbiBhcHByb3ByaWF0ZSBmb3IgUEtDUzEyIGlucHV0IGZvcm1hdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCYWNrLXBvcnQgb2Ygc2VsZWN0ZWQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGZyb20gZGV2ZWxvcG1lbnQKICAgICBicmFuY2gsIGFzIHdlbGwgYXMgaW1wcm92ZWQgc3VwcG9ydCBmb3IgUG93ZXJQQyBwbGF0Zm9ybXMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCBsb3RzIG9mIGNoZWNrcyBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgZXJyb3IgY29kZXMgdG8gaW5kaWNhdGUKICAgICBmYWlsdXJlIGFuZCBmcmVlaW5nIHVwIG1lbW9yeSBpZiBhIGZhaWx1cmUgb2NjdXJzLgogICAgIFtOYXV0aWN1cyBOZXR3b3JrcyBTU0wgVGVhbSA8b3BlbnNzbEBuYXV0aWN1c25ldC5jb20+LCBTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgLXBhc3NpbiBhcmd1bWVudCB0byBkZ3N0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBlcmZvcm0gc29tZSBjaGFyYWN0ZXIgY29tcGFyaXNvbnMgb2YgZGlmZmVyZW50IHR5cGVzIGluIFg1MDlfTkFNRV9jbXA6CiAgICAgdGhpcyBpcyBuZWVkZWQgZm9yIHNvbWUgY2VydGlmaWNhdGVzIHRoYXQgcmVlbmNvZGUgRE5zIGludG8gVVRGOFN0cmluZ3MKICAgICAoaW4gdmlvbGF0aW9uIG9mIFJGQzMyODApIGFuZCBjYW4ndCBvciB3b250IGlzc3VlIG5hbWUgcm9sbG92ZXIKICAgICBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBhbiBleHBsaWNpdCBjaGVjayBkdXJpbmcgY2VydGlmaWNhdGUgdmFsaWRhdGlvbiB0byBzZWUgdGhhdAogICAgIHRoZSBDQSBzZXR0aW5nIGluIGVhY2ggY2VydGlmaWNhdGUgb24gdGhlIGNoYWluIGlzIGNvcnJlY3QuICBBcyBhCiAgICAgc2lkZSBlZmZlY3QgYWx3YXlzIGRvIHRoZSBmb2xsb3dpbmcgYmFzaWMgY2hlY2tzIG9uIGV4dGVuc2lvbnMsCiAgICAgbm90IGp1c3Qgd2hlbiB0aGVyZSdzIGFuIGFzc29jaWF0ZWQgcHVycG9zZSB0byB0aGUgY2hlY2s6CgogICAgICAtIGlmIHRoZXJlIGlzIGFuIHVuaGFuZGxlZCBjcml0aWNhbCBleHRlbnNpb24gKHVubGVzcyB0aGUgdXNlcgogICAgICAgIGhhcyBjaG9zZW4gdG8gaWdub3JlIHRoaXMgZmF1bHQpCiAgICAgIC0gaWYgdGhlIHBhdGggbGVuZ3RoIGhhcyBiZWVuIGV4Y2VlZGVkIChpZiBvbmUgaXMgc2V0IGF0IGFsbCkKICAgICAgLSB0aGF0IGNlcnRhaW4gZXh0ZW5zaW9ucyBmaXQgdGhlIGFzc29jaWF0ZWQgcHVycG9zZSAoaWYgb25lIGhhcwogICAgICAgIGJlZW4gZ2l2ZW4pCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdkIGFuZCAwLjkuN2UgIFsyNSBPY3QgMjAwNF0KCiAgKikgQXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVuIENSTHMgYXJlIGNoZWNrZWQgaW4gYSBtdWx0aSB0aHJlYWRlZCAKICAgICBlbnZpcm9ubWVudC4gVGhpcyB3b3VsZCBoYXBwZW4gZHVlIHRvIHRoZSByZW9yZGVyaW5nIG9mIHRoZSByZXZva2VkCiAgICAgZW50cmllcyBkdXJpbmcgc2lnbmF0dXJlIGNoZWNraW5nIGFuZCBzZXJpYWwgbnVtYmVyIGxvb2t1cC4gTm93IHRoZQogICAgIGVuY29kaW5nIGlzIGNhY2hlZCBhbmQgdGhlIHNlcmlhbCBudW1iZXIgc29ydCBwZXJmb3JtZWQgdW5kZXIgYSBsb2NrLgogICAgIEFkZCBuZXcgU1RBQ0sgZnVuY3Rpb24gc2tfaXNfc29ydGVkKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIERlbHRhIENSTCB0byB0aGUgZXh0ZW5zaW9uIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyBmaXhlcyB0byBzM19wa3QuYyBzbyBhbGVydHMgYXJlIHNlbnQgcHJvcGVybHkuCiAgICAgW0RhdmlkIEhvbG1lcyA8ZC5ob2xtZXNAZjUuY29tPl0KCiAgKikgUmVkdWNlIHRoZSBjaGFuY2VzIG9mIGR1cGxpY2F0ZSBpc3N1ZXIgbmFtZSBhbmQgc2VyaWFsIG51bWJlcnMgKGluCiAgICAgdmlvbGF0aW9uIG9mIFJGQzMyODApIHVzaW5nIHRoZSBPcGVuU1NMIGNlcnRpZmljYXRlIGNyZWF0aW9uIHV0aWxpdGllcy4KICAgICBUaGlzIGlzIGRvbmUgYnkgY3JlYXRpbmcgYSByYW5kb20gNjQgYml0IHZhbHVlIGZvciB0aGUgaW5pdGlhbCBzZXJpYWwKICAgICBudW1iZXIgd2hlbiBhIHNlcmlhbCBudW1iZXIgZmlsZSBpcyBjcmVhdGVkIG9yIHdoZW4gYSBzZWxmIHNpZ25lZAogICAgIGNlcnRpZmljYXRlIGlzIGNyZWF0ZWQgdXNpbmcgJ29wZW5zc2wgcmVxIC14NTA5Jy4gVGhlIGluaXRpYWwgc2VyaWFsCiAgICAgbnVtYmVyIGZpbGUgaXMgY3JlYXRlZCB1c2luZyAnb3BlbnNzbCB4NTA5IC1uZXh0X3NlcmlhbCcgaW4gQ0EucGwKICAgICByYXRoZXIgdGhhbiBiZWluZyBpbml0aWFsaXplZCB0byAxLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43YyBhbmQgMC45LjdkICBbMTcgTWFyIDIwMDRdCgogICopIEZpeCBudWxsLXBvaW50ZXIgYXNzaWdubWVudCBpbiBkb19jaGFuZ2VfY2lwaGVyX3NwZWMoKSByZXZlYWxlZCAgICAgICAgICAgCiAgICAgYnkgdXNpbmcgdGhlIENvZGVub21pY29uIFRMUyBUZXN0IFRvb2wgKENWRS0yMDA0LTAwNzkpICAgICAgICAgICAgICAgICAgICAKICAgICBbSm9lIE9ydG9uLCBTdGV2ZSBIZW5zb25dICAgCgogICopIEZpeCBmbGF3IGluIFNTTC9UTFMgaGFuZHNoYWtpbmcgd2hlbiB1c2luZyBLZXJiZXJvcyBjaXBoZXJzdWl0ZXMKICAgICAoQ1ZFLTIwMDQtMDExMikKICAgICBbSm9lIE9ydG9uLCBTdGV2ZSBIZW5zb25dICAgCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgY2VydGlmaWNhdGVzIHdpdGggdGhlIHNhbWUKICAgICBzdWJqZWN0IGluIHRoZSBDQSBpbmRleCBmaWxlLiAgVGhpcyBpcyBkb25lIG9ubHkgaWYgdGhlIGtleXdvcmQKICAgICAndW5pcXVlX3N1YmplY3QnIGlzIHNldCB0byAnbm8nIGluIHRoZSBtYWluIENBIHNlY3Rpb24gKGRlZmF1bHQKICAgICBpZiAnQ0FfZGVmYXVsdCcpIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuICBUaGUgdmFsdWUgaXMgc2F2ZWQKICAgICB3aXRoIHRoZSBkYXRhYmFzZSBpdHNlbGYgaW4gYSBzZXBhcmF0ZSBpbmRleCBhdHRyaWJ1dGUgZmlsZSwKICAgICBuYW1lZCBsaWtlIHRoZSBpbmRleCBmaWxlIHdpdGggJy5hdHRyJyBhcHBlbmRlZCB0byB0aGUgbmFtZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBYNTA5IHZlcmlmeSBmaXhlcy4gRGlzYWJsZSBicm9rZW4gY2VydGlmaWNhdGUgd29ya2Fyb3VuZHMgd2hlbiAKICAgICBYNTA5X1ZfRkxBR1NfWDUwOV9TVFJJQ1QgaXMgc2V0LiBDaGVjayBDUkwgaXNzdWVyIGhhcyBjUkxTaWduIHNldCBpZgogICAgIGtleVVzYWdlIGV4dGVuc2lvbiBwcmVzZW50LiBEb24ndCBhY2NlcHQgQ1JMcyB3aXRoIHVuaGFuZGxlZCBjcml0aWNhbAogICAgIGV4dGVuc2lvbnM6IHNpbmNlIHZlcmlmeSBjdXJyZW50bHkgZG9lc24ndCBwcm9jZXNzIENSTCBleHRlbnNpb25zIHRoaXMKICAgICByZWplY3RzIGEgQ1JMIHdpdGggKmFueSogY3JpdGljYWwgZXh0ZW5zaW9ucy4gQWRkIG5ldyB2ZXJpZnkgZXJyb3IgY29kZXMKICAgICBmb3IgdGhlc2UgY2FzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgV2hlbiBjcmVhdGluZyBhbiBPQ1NQIG5vbmNlIHVzZSBhbiBPQ1RFVCBTVFJJTkcgaW5zaWRlIHRoZSBleHRuVmFsdWUuCiAgICAgQSBjbGFyaWZpY2F0aW9uIG9mIFJGQzI1NjAgd2lsbCByZXF1aXJlIHRoZSB1c2Ugb2YgT0NURVQgU1RSSU5HcyBhbmQgCiAgICAgc29tZSBpbXBsZW1lbnRhdGlvbnMgY2Fubm90IGhhbmRsZSB0aGUgY3VycmVudCByYXcgZm9ybWF0LiBTaW5jZSBPcGVuU1NMCiAgICAgY29waWVzIGFuZCBjb21wYXJlcyBPQ1NQIG5vbmNlcyBhcyBvcGFxdWUgYmxvYnMgd2l0aG91dCBhbnkgYXR0ZW1wdCBhdAogICAgIHBhcnNpbmcgdGhlbSB0aGlzIHNob3VsZCBub3QgY3JlYXRlIGFueSBjb21wYXRpYmlsaXR5IGlzc3Vlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgbWQgZmxhZyBFVlBfTURfQ1RYX0ZMQUdfUkVVU0UgdGhpcyBhbGxvd3MgbWRfZGF0YSB0byBiZSByZXVzZWQgd2hlbgogICAgIGNhbGxpbmcgRVZQX01EX0NUWF9jb3B5X2V4KCkgdG8gYXZvaWQgY2FsbGluZyBPUEVOU1NMX21hbGxvYygpLiBXaXRob3V0CiAgICAgdGhpcyBITUFDIChhbmQgb3RoZXIpIG9wZXJhdGlvbnMgYXJlIHNldmVyYWwgdGltZXMgc2xvd2VyIHRoYW4gT3BlblNTTAogICAgIDwgMC45LjcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJpbnQgb3V0IEdlbmVyYWxpemVkVGltZSBhbmQgVVRDVGltZSBpbiBBU04xX1NUUklOR19wcmludF9leCgpLgogICAgIFtQZXRlciBTeWx2ZXN0ZXIgPFBldGVyLlN5bHZlc3RlckBFZGVsV2ViLmZyPl0KCiAgKikgVXNlIHRoZSBjb3JyZWN0IGNvbnRlbnQgd2hlbiBzaWduaW5nIHR5cGUgIm90aGVyIi4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2IgYW5kIDAuOS43YyAgWzMwIFNlcCAyMDAzXQoKICAqKSBGaXggdmFyaW91cyBidWdzIHJldmVhbGVkIGJ5IHJ1bm5pbmcgdGhlIE5JU0NDIHRlc3Qgc3VpdGU6CgogICAgIFN0b3Agb3V0IG9mIGJvdW5kcyByZWFkcyBpbiB0aGUgQVNOMSBjb2RlIHdoZW4gcHJlc2VudGVkIHdpdGgKICAgICBpbnZhbGlkIHRhZ3MgKENWRS0yMDAzLTA1NDMgYW5kIENWRS0yMDAzLTA1NDQpLgogICAgIAogICAgIEZyZWUgdXAgQVNOMV9UWVBFIGNvcnJlY3RseSBpZiBBTlkgdHlwZSBpcyBpbnZhbGlkIChDVkUtMjAwMy0wNTQ1KS4KCiAgICAgSWYgdmVyaWZ5IGNhbGxiYWNrIGlnbm9yZXMgaW52YWxpZCBwdWJsaWMga2V5IGVycm9ycyBkb24ndCB0cnkgdG8gY2hlY2sKICAgICBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgd2l0aCB0aGUgTlVMTCBwdWJsaWMga2V5LgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgLWlnbm9yZV9lcnIgb3B0aW9uIGluIG9jc3AgYXBwbGljYXRpb24gdG8gc3RvcCB0aGUgc2VydmVyCiAgICAgZXhpdGluZyBvbiB0aGUgZmlyc3QgZXJyb3IgaW4gYSByZXF1ZXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHNzbDNfYWNjZXB0KCkgKHNzbC9zM19zcnZyLmMpIG9ubHkgYWNjZXB0IGEgY2xpZW50IGNlcnRpZmljYXRlCiAgICAgaWYgdGhlIHNlcnZlciByZXF1ZXN0ZWQgb25lOiBhcyBzdGF0ZWQgaW4gVExTIDEuMCBhbmQgU1NMIDMuMAogICAgIHNwZWNpZmljYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHNzbDNfZ2V0X2NsaWVudF9oZWxsbygpIChzc2wvczNfc3J2ci5jKSwgdG9sZXJhdGUgYWRkaXRpb25hbAogICAgIGV4dHJhIGRhdGEgYWZ0ZXIgdGhlIGNvbXByZXNzaW9uIG1ldGhvZHMgbm90IG9ubHkgZm9yIFRMUyAxLjAKICAgICBidXQgYWxzbyBmb3IgU1NMIDMuMCAoYXMgcmVxdWlyZWQgYnkgdGhlIHNwZWNpZmljYXRpb24pLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTWF0dGhpYXMgTG9lcGZlXQoKICAqKSBDaGFuZ2UgWDUwOV9jZXJ0aWZpY2F0ZV90eXBlKCkgdG8gbWFyayB0aGUga2V5IGFzIGV4cG9ydGVkL2V4cG9ydGFibGUKICAgICB3aGVuIGl0J3MgNTEyICpiaXRzKiBsb25nLCBub3QgNTEyIGJ5dGVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSBBRVNfY2JjX2VuY3J5cHQoKSBzbyBpdCBvdXRwdXRzIGV4YWN0IG11bHRpcGxlIG9mCiAgICAgYmxvY2tzIGR1cmluZyBlbmNyeXB0aW9uLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFZhcmlvdXMgZml4ZXMgdG8gYmFzZTY0IEJJTyBhbmQgbm9uIGJsb2NraW5nIEkvTy4gT24gd3JpdGUgCiAgICAgZmx1c2hlcyB3ZXJlIG5vdCBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBCSU8gcmV0cmllZC4gT24gcmVhZAogICAgIGRhdGEgd2FzIG5vdCBiZWluZyBidWZmZXJlZCBwcm9wZXJseSBhbmQgaGFkIHZhcmlvdXMgbG9naWMgYnVncy4KICAgICBUaGlzIGFsc28gYWZmZWN0cyBibG9ja2luZyBJL08gd2hlbiB0aGUgZGF0YSBiZWluZyBkZWNvZGVkIGlzIGEKICAgICBjZXJ0YWluIHNpemUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyBTL01JTUUgYnVnZml4ZXMgYW5kIGNvbXBhdGliaWxpdHkgY2hhbmdlczoKICAgICBvdXRwdXQgY29ycmVjdCBhcHBsaWNhdGlvbi9wa2NzNyBNSU1FIHR5cGUgaWYKICAgICBQS0NTN19OT09MRE1JTUVUWVBFIGlzIHNldC4gVG9sZXJhdGUgc29tZSBicm9rZW4gc2lnbmF0dXJlcy4KICAgICBPdXRwdXQgQ1IrTEYgZm9yIEVPTCBpZiBQS0NTN19DUkxGRU9MIGlzIHNldCAodGhpcyBtYWtlcyBvcGVuaW5nCiAgICAgb2YgZmlsZXMgYXMgLmVtbCB3b3JrKS4gQ29ycmVjdGx5IGhhbmRsZSB2ZXJ5IGxvbmcgbGluZXMgaW4gTUlNRQogICAgIHBhcnNlci4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2EgYW5kIDAuOS43YiAgWzEwIEFwciAyMDAzXQoKICAqKSBDb3VudGVybWVhc3VyZSBhZ2FpbnN0IHRoZSBLbGltYS1Qb2tvcm55LVJvc2EgZXh0ZW5zaW9uIG9mCiAgICAgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNSBwYWRkaW5nOiB0cmVhdAogICAgIGEgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgbWlzbWF0Y2ggbGlrZSBhIGRlY3J5cHRpb24gZXJyb3IKICAgICBpbiBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlIChzc2wvczNfc3J2ci5jKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUdXJuIG9uIFJTQSBibGluZGluZyBieSBkZWZhdWx0IGluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgdG8gYXZvaWQgYSB0aW1pbmcgYXR0YWNrLiBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IGl0IGNhbiBjYWxsCiAgICAgUlNBX2JsaW5kaW5nX29mZigpIG9yIHVzZSB0aGUgbmV3IGZsYWcgUlNBX0ZMQUdfTk9fQkxJTkRJTkcuCiAgICAgVGhleSB3b3VsZCBiZSBpbGwtYWR2aXNlZCB0byBkbyBzbyBpbiBtb3N0IGNhc2VzLgogICAgIFtCZW4gTGF1cmllLCBTdGV2ZSBIZW5zb24sIEdlb2ZmIFRob3JwZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgUlNBIGJsaW5kaW5nIGNvZGUgc28gdGhhdCBpdCB3b3JrcyB3aGVuIHRoZSBQUk5HIGlzIG5vdAogICAgIHNlZWRlZCAoaW4gdGhpcyBjYXNlLCB0aGUgc2VjcmV0IFJTQSBleHBvbmVudCBpcyBhYnVzZWQgYXMKICAgICBhbiB1bnByZWRpY3RhYmxlIHNlZWQgLS0gaWYgaXQgaXMgbm90IHVucHJlZGljdGFibGUsIHRoZXJlCiAgICAgaXMgbm8gcG9pbnQgaW4gYmxpbmRpbmcgYW55d2F5KS4gIE1ha2UgUlNBIGJsaW5kaW5nIHRocmVhZC1zYWZlCiAgICAgYnkgcmVtZW1iZXJpbmcgdGhlIGNyZWF0b3IncyB0aHJlYWQgSUQgaW4gcnNhLT5ibGluZGluZyBhbmQKICAgICBoYXZpbmcgYWxsIG90aGVyIHRocmVhZHMgdXNlIGxvY2FsIG9uZS10aW1lIGJsaW5kaW5nIGZhY3RvcnMKICAgICAodGhpcyByZXF1aXJlcyBtb3JlIGNvbXB1dGF0aW9uIHRoYW4gc2hhcmluZyByc2EtPmJsaW5kaW5nLCBidXQKICAgICBhdm9pZHMgZXhjZXNzaXZlIGxvY2tpbmc7IGFuZCBpZiBhbiBSU0Egb2JqZWN0IGlzIG5vdCBzaGFyZWQKICAgICBiZXR3ZWVuIHRocmVhZHMsIGJsaW5kaW5nIHdpbGwgc3RpbGwgYmUgdmVyeSBmYXN0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXhlZCBhIHR5cG8gYnVnIHRoYXQgd291bGQgY2F1c2UgRU5HSU5FX3NldF9kZWZhdWx0KCkgdG8gc2V0IGFuCiAgICAgRU5HSU5FIGFzIGRlZmF1bHRzIGZvciBhbGwgc3VwcG9ydGVkIGFsZ29yaXRobXMgaXJyZXNwZWN0aXZlIG9mCiAgICAgdGhlICdmbGFncycgcGFyYW1ldGVyLiAnZmxhZ3MnIGlzIG5vdyBob25vdXJlZCwgc28gYXBwbGljYXRpb25zCiAgICAgc2hvdWxkIG1ha2Ugc3VyZSB0aGV5IGFyZSBwYXNzaW5nIGl0IGNvcnJlY3RseS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBUYXJnZXQgIm1pbmd3IiBub3cgYWxsb3dzIG5hdGl2ZSBXaW5kb3dzIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIGluCiAgICAgdGhlIEN5Z3dpbiBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIHdpdGggdGhlIE1pbkdXIGNvbXBpbGVyLgogICAgIFtVbGYgTW9lbGxlcl0gCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43IGFuZCAwLjkuN2EgIFsxOSBGZWIgMjAwM10KCiAgKikgSW4gc3NsM19nZXRfcmVjb3JkIChzc2wvczNfcGt0LmMpLCBtaW5pbWl6ZSBpbmZvcm1hdGlvbiBsZWFrZWQKICAgICB2aWEgdGltaW5nIGJ5IHBlcmZvcm1pbmcgYSBNQUMgY29tcHV0YXRpb24gZXZlbiBpZiBpbmNvcnJlY3QKICAgICBibG9jayBjaXBoZXIgcGFkZGluZyBoYXMgYmVlbiBmb3VuZC4gIFRoaXMgaXMgYSBjb3VudGVybWVhc3VyZQogICAgIGFnYWluc3QgYWN0aXZlIGF0dGFja3Mgd2hlcmUgdGhlIGF0dGFja2VyIGhhcyB0byBkaXN0aW5ndWlzaAogICAgIGJldHdlZW4gYmFkIHBhZGRpbmcgYW5kIGEgTUFDIHZlcmlmaWNhdGlvbiBlcnJvci4gKENWRS0yMDAzLTAwNzgpCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgQnJpY2UgQ2FudmVsIChFUEZMKSwKICAgICBBbGFpbiBIaWx0Z2VuIChVQlMpLCBTZXJnZSBWYXVkZW5heSAoRVBGTCksIGFuZAogICAgIE1hcnRpbiBWdWFnbm91eCAoRVBGTCwgSWxpb24pXQoKICAqKSBNYWtlIHRoZSBuby1lcnIgb3B0aW9uIHdvcmsgYXMgaW50ZW5kZWQuICBUaGUgaW50ZW50aW9uIHdpdGggbm8tZXJyCiAgICAgaXMgbm90IHRvIGhhdmUgdGhlIHdob2xlIGVycm9yIHN0YWNrIGhhbmRsaW5nIHJvdXRpbmVzIHJlbW92ZWQgZnJvbQogICAgIGxpYmNyeXB0bywgaXQncyBvbmx5IGludGVuZGVkIHRvIHJlbW92ZSBhbGwgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kCiAgICAgcmVhc29uIHRleHRzLCB0aGVyZWJ5IHJlbW92aW5nIHNvbWUgb2YgdGhlIGZvb3RwcmludCB0aGF0IG1heSBub3QKICAgICBiZSBpbnRlcmVzdGluZyBpZiB0aG9zZSBlcnJvcnMgYXJlbid0IGRpc3BsYXllZCBhbnl3YXkuCgogICAgIE5PVEU6IGl0J3Mgc3RpbGwgcG9zc2libGUgZm9yIGFueSBhcHBsaWNhdGlvbiBvciBtb2R1bGUgdG8gaGF2ZSBpdCdzCiAgICAgb3duIHNldCBvZiBlcnJvciB0ZXh0cyBpbnNlcnRlZC4gIFRoZSByb3V0aW5lcyBhcmUgdGhlcmUsIGp1c3Qgbm90CiAgICAgdXNlZCBieSBkZWZhdWx0IHdoZW4gbm8tZXJyIGlzIGdpdmVuLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBzdXBwb3J0IGZvciBGcmVlQlNEIG9uIElBNjQuCiAgICAgW2RpcmsubWV5ZXJAZGlub2V4LnN1Yi5vcmcgdmlhIFJpY2hhcmQgTGV2aXR0ZSwgcmVzb2x2ZXMgIzQ1NF0KCiAgKikgQWRqdXN0IERFU19jYmNfY2tzdW0oKSBzbyBpdCByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBNSVQKICAgICBLZXJiZXJvcyBmdW5jdGlvbiBtaXRfZGVzX2NiY19ja3N1bSgpLiAgQmVmb3JlIHRoaXMgY2hhbmdlLAogICAgIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBERVNfY2JjX2Nrc3VtKCkgd2FzIGxpa2UgdGhlIG9uZSBmcm9tCiAgICAgbWl0X2Rlc19jYmNfY2tzdW0oKSwgZXhjZXB0IHRoZSBieXRlcyB3ZXJlIHN3YXBwZWQuCiAgICAgW0tldmluIEdyZWFuZXkgPEtldmluLkdyZWFuZXlAaHAuY29tPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBkaXNhYmxlIHRoZSBhdXRvbWF0aWMgU1NMIGNoYWluIGJ1aWxkaW5nLgogICAgIEJlZm9yZSB0aGlzIGEgcmF0aGVyIHByaW1pdGl2ZSBjaGFpbiBidWlsZCB3YXMgYWx3YXlzIHBlcmZvcm1lZCBpbgogICAgIHNzbDNfb3V0cHV0X2NlcnRfY2hhaW4oKTogYW4gYXBwbGljYXRpb24gaGFkIG5vIHdheSB0byBzZW5kIHRoZSAKICAgICBjb3JyZWN0IGNoYWluIGlmIHRoZSBhdXRvbWF0aWMgb3BlcmF0aW9uIHByb2R1Y2VkIGFuIGluY29ycmVjdCByZXN1bHQuCgogICAgIE5vdyB0aGUgY2hhaW4gYnVpbGRlciBpcyBkaXNhYmxlZCBpZiBlaXRoZXI6CgogICAgIDEuIEV4dHJhIGNlcnRpZmljYXRlcyBhcmUgYWRkZWQgdmlhIFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoKS4KCiAgICAgMi4gVGhlIG1vZGUgZmxhZyBTU0xfTU9ERV9OT19BVVRPX0NIQUlOIGlzIHNldC4KCiAgICAgVGhlIHJlYXNvbmluZyBiZWhpbmQgdGhpcyBpcyB0aGF0IGFuIGFwcGxpY2F0aW9uIHdvdWxkIG5vdCB3YW50IHRoZQogICAgIGF1dG8gY2hhaW4gYnVpbGRpbmcgdG8gdGFrZSBwbGFjZSBpZiBleHRyYSBjaGFpbiBjZXJ0aWZpY2F0ZXMgYXJlCiAgICAgcHJlc2VudCBhbmQgaXQgbWlnaHQgYWxzbyB3YW50IGEgbWVhbnMgb2Ygc2VuZGluZyBubyBhZGRpdGlvbmFsCiAgICAgY2VydGlmaWNhdGVzIChmb3IgZXhhbXBsZSB0aGUgY2hhaW4gaGFzIHR3byBjZXJ0aWZpY2F0ZXMgYW5kIHRoZQogICAgIHJvb3QgaXMgb21pdHRlZCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBidWlsZCB3aXRob3V0IHRoZSBFTkdJTkUgZnJhbWV3b3JrLgogICAgIFtTdGV2ZW4gUmVkZGllIDxzbXJAZXNzZW1lci5jb20uYXU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIFVuZGVyIFdpbjMyIGdtdGltZSgpIGNhbiByZXR1cm4gTlVMTDogY2hlY2sgcmV0dXJuIHZhbHVlIGluCiAgICAgT1BFTlNTTF9nbXRpbWUoKS4gQWRkIGVycm9yIGNvZGUgZm9yIGNhc2Ugd2hlcmUgZ210aW1lKCkgZmFpbHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRFNBIHJvdXRpbmVzOiB1bmRlciBjZXJ0YWluIGVycm9yIGNvbmRpdGlvbnMgdW5pbml0aWFsaXplZCBCTiBvYmplY3RzCiAgICAgY291bGQgYmUgZnJlZWQuIFNvbHV0aW9uOiBtYWtlIHN1cmUgaW5pdGlhbGl6YXRpb24gaXMgcGVyZm9ybWVkIGVhcmx5CiAgICAgZW5vdWdoLiAoUmVwb3J0ZWQgYW5kIGZpeCBzdXBwbGllZCBieSBJdmFuIEQgTmVzdGxlcm9kZSA8bmVzdGxlckBNSVQuRURVPiwKICAgICBOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPiB2aWEgUFIjNDU5KQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBbm90aGVyIGZpeCBmb3IgU1NMdjIgc2Vzc2lvbiBJRCBoYW5kbGluZzogdGhlIHNlc3Npb24gSUQgd2FzIGluY29ycmVjdGx5CiAgICAgY2hlY2tlZCBvbiByZWNvbm5lY3Qgb24gdGhlIGNsaWVudCBzaWRlLCB0aGVyZWZvcmUgc2Vzc2lvbiByZXN1bXB0aW9uCiAgICAgY291bGQgc3RpbGwgZmFpbCB3aXRoIGEgInNzbCBzZXNzaW9uIGlkIGlzIGRpZmZlcmVudCIgZXJyb3IuIFRoaXMKICAgICBiZWhhdmlvdXIgaXMgbWFza2VkIHdoZW4gU1NMX09QX0FMTCBpcyB1c2VkIGR1ZSB0bwogICAgIFNTTF9PUF9NSUNST1NPRlRfU0VTU19JRF9CVUcgYmVpbmcgc2V0LgogICAgIEJlaGF2aW91ciBvYnNlcnZlZCBieSBDcmlzcGluIEZsb3dlcmRheSA8Y3Jpc3BpbkBmbG93ZXJkYXkuY3g+IGFzCiAgICAgZm9sbG93dXAgdG8gUFIgIzM3Ny4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSUEtMzIgYXNzZW1ibGVyIHN1cHBvcnQgZW5oYW5jZW1lbnRzOiB1bmlmaWVkIEVMRiB0YXJnZXRzLCBzdXBwb3J0CiAgICAgZm9yIFNDTy9DYWxkZXJhIHBsYXRmb3JtcywgZml4IGZvciBDeWd3aW4gc2hhcmVkIGJ1aWxkLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRnJlZUJTRCBvbiBzcGFyYzY0LiAgQXMgYSBjb25zZXF1ZW5jZSwgc3VwcG9ydCBmb3IKICAgICBGcmVlQlNEIG9uIG5vbi14ODYgcHJvY2Vzc29ycyBpcyBzZXBhcmF0ZSBmcm9tIHg4NiBwcm9jZXNzb3JzIG9uCiAgICAgdGhlIGNvbmZpZyBzY3JpcHQsIG11Y2ggbGlrZSB0aGUgTmV0QlNEIHN1cHBvcnQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSAmIEtyaXMgS2VubmF3YXkgPGtyaXNAb2JzZWN1cml0eS5vcmc+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmggYW5kIDAuOS43ICBbMzEgRGVjIDIwMDJdCgogIFtOQjogT3BlblNTTCAwLjkuNmkgYW5kIGxhdGVyIDAuOS42IHBhdGNoIGxldmVscyB3ZXJlIHJlbGVhc2VkIGFmdGVyCiAgT3BlblNTTCAwLjkuNy5dCgogICopIEZpeCBzZXNzaW9uIElEIGhhbmRsaW5nIGluIFNTTHYyIGNsaWVudCBjb2RlOiB0aGUgU0VSVkVSIEZJTklTSEVECiAgICAgY29kZSAoMDYpIHdhcyB0YWtlbiBhcyB0aGUgZmlyc3Qgb2N0ZXQgb2YgdGhlIHNlc3Npb24gSUQgYW5kIHRoZSBsYXN0CiAgICAgb2N0ZXQgd2FzIGlnbm9yZWQgY29uc2VxdWVudGx5LiBBcyBhIHJlc3VsdCBTU0x2MiBjbGllbnQgc2lkZSBzZXNzaW9uCiAgICAgY2FjaGluZyBjb3VsZCBub3QgaGF2ZSB3b3JrZWQgZHVlIHRvIHRoZSBzZXNzaW9uIElEIG1pc21hdGNoIGJldHdlZW4KICAgICBjbGllbnQgYW5kIHNlcnZlci4KICAgICBCZWhhdmlvdXIgb2JzZXJ2ZWQgYnkgQ3Jpc3BpbiBGbG93ZXJkYXkgPGNyaXNwaW5AZmxvd2VyZGF5LmN4PiBhcwogICAgIFBSICMzNzcuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIENoYW5nZSB0aGUgZGVjbGFyYXRpb24gb2YgbmVlZGVkIEtlcmJlcm9zIGxpYnJhcmllcyB0byB1c2UgRVhfTElCUwogICAgIGluc3RlYWQgb2YgdGhlIHNwZWNpYWwgKGFuZCBiYWRseSBzdXBwb3J0ZWQpIExJQktSQjUuICBMSUJLUkI1IGlzCiAgICAgcmVtb3ZlZCBlbnRpcmVseS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUaGUgaHdfbmNpcGhlci5jIGVuZ2luZSByZXF1aXJlcyBkeW5hbWljIGxvY2tzLiAgVW5mb3J0dW5hdGVseSwgaXQKICAgICBzZWVtcyB0aGF0IGluIHNwaXRlIG9mIGV4aXN0aW5nIGZvciBtb3JlIHRoYW4gYSB5ZWFyLCBtYW55IGFwcGxpY2F0aW9uCiAgICAgYXV0aG9yIGhhdmUgZG9uZSBub3RoaW5nIHRvIHByb3ZpZGUgdGhlIG5lY2Vzc2FyeSBjYWxsYmFja3MsIHdoaWNoCiAgICAgbWVhbnMgdGhhdCB0aGlzIHBhcnRpY3VsYXIgZW5naW5lIHdpbGwgbm90IHdvcmsgcHJvcGVybHkgYW55d2hlcmUuCiAgICAgVGhpcyBpcyBhIHZlcnkgdW5mb3J0dW5hdGUgc2l0dWF0aW9uIHdoaWNoIGZvcmNlcyB1cywgaW4gdGhlIG5hbWUKICAgICBvZiB1c2FiaWxpdHksIHRvIGdpdmUgdGhlIGh3X25jaXBoZXIuYyBhIHN0YXRpYyBsb2NrLCB3aGljaCBpcyBwYXJ0CiAgICAgb2YgbGliY3J5cHRvLgogICAgIE5PVEU6IFRoaXMgaXMgZm9yIHRoZSAwLjkuNyBzZXJpZXMgT05MWS4gIFRoaXMgaGFjayB3aWxsIG5ldmVyCiAgICAgYXBwZWFyIGluIDAuOS44IG9yIGxhdGVyLiAgV2UgRVhQRUNUIGFwcGxpY2F0aW9uIGF1dGhvcnMgdG8gaGF2ZQogICAgIGRlYWx0IHByb3Blcmx5IHdpdGggdGhpcyB3aGVuIDAuOS44IGlzIHJlbGVhc2VkICh1bmxlc3Mgd2UgYWN0dWFsbHkKICAgICBtYWtlIHN1Y2ggY2hhbmdlcyBpbiB0aGUgbGliY3J5cHRvIGxvY2tpbmcgY29kZSB0aGF0IGNoYW5nZXMgd2lsbAogICAgIGhhdmUgdG8gYmUgbWFkZSBhbnl3YXkpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIGFzbjFfZDJpX3JlYWRfYmlvKCkgcmVwZWF0ZWRseSBjYWxsIEJJT19yZWFkKCkgdW50aWwgYWxsIGNvbnRlbnQKICAgICBvY3RldHMgaGF2ZSBiZWVuIHJlYWQsIEVPRiBvciBhbiBlcnJvciBvY2N1cnMuIFdpdGhvdXQgdGhpcyBjaGFuZ2UKICAgICBzb21lIHRydW5jYXRlZCBBU04xIHN0cnVjdHVyZXMgd2lsbCBub3QgcHJvZHVjZSBhbiBlcnJvci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEaXNhYmxlIEhlaW1kYWwgc3VwcG9ydCwgc2luY2UgaXQgaGFzbid0IGJlZW4gZnVsbHkgaW1wbGVtZW50ZWQuCiAgICAgU3RpbGwgZ2l2ZSB0aGUgcG9zc2liaWxpdHkgdG8gZm9yY2UgdGhlIHVzZSBvZiBIZWltZGFsLCBidXQgd2l0aAogICAgIHdhcm5pbmdzIGFuZCBhIHJlcXVlc3QgdGhhdCBwYXRjaGVzIGdldCBzZW50IHRvIG9wZW5zc2wtZGV2LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgVkMtQ0UgdGFyZ2V0LCBpbnRyb2R1Y2UgdGhlIFdJTkNFIHN5c25hbWUsIGFuZCBhZGQKICAgICBJTlNUQUxMLldDRSBhbmQgYXBwcm9wcmlhdGUgY29uZGl0aW9uYWxzIHRvIG1ha2UgaXQgYnVpbGQuCiAgICAgW1N0ZXZlbiBSZWRkaWUgPHNtckBlc3NlbWVyLmNvbS5hdT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIHRoZSBETEwgbmFtZXMgZm9yIEN5Z3dpbiB0byBjeWdjcnlwdG8teC55LnouZGxsIGFuZAogICAgIGN5Z3NzbC14Lnkuei5kbGwsIHdoZXJlIHgsIHkgYW5kIHogYXJlIHRoZSBtYWpvciwgbWlub3IgYW5kCiAgICAgZWRpdCBudW1iZXJzIG9mIHRoZSB2ZXJzaW9uLgogICAgIFtDb3Jpbm5hIFZpbnNjaGVuIDx2aW5zY2hlbkByZWRoYXQuY29tPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbnRyb2R1Y2Ugc2FmZSBzdHJpbmcgY29weSBhbmQgY2F0ZW5hdGlvbiBmdW5jdGlvbnMKICAgICAoQlVGX3N0cmxjcHkoKSBhbmQgQlVGX3N0cmxjYXQoKSkuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKSBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBdm9pZCB1c2luZyBmaXhlZC1zaXplIGJ1ZmZlcnMgZm9yIG9uZS1saW5lIEROcy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBZGQgQlVGX01FTV9ncm93X2NsZWFuKCkgdG8gYXZvaWQgaW5mb3JtYXRpb24gbGVha2FnZSB3aGVuCiAgICAgcmVzaXppbmcgYnVmZmVycyBjb250YWluaW5nIHNlY3JldHMsIGFuZCB1c2Ugd2hlcmUgYXBwcm9wcmlhdGUuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQXZvaWQgdXNpbmcgZml4ZWQgc2l6ZSBidWZmZXJzIGZvciBjb25maWd1cmF0aW9uIGZpbGUgbG9jYXRpb24uCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQXZvaWQgZmlsZW5hbWUgdHJ1bmNhdGlvbiBmb3IgdmFyaW91cyBDQSBmaWxlcy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBVc2Ugc2l6ZW9mIGluIHByZWZlcmVuY2UgdG8gbWFnaWMgbnVtYmVycy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBdm9pZCBmaWxlbmFtZSB0cnVuY2F0aW9uIGluIGNlcnQgcmVxdWVzdHMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIGFzc2VydGlvbnMgdG8gY2hlY2sgZm9yIChzdXBwb3NlZGx5IGltcG9zc2libGUpIGJ1ZmZlcgogICAgIG92ZXJmbG93cy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBEb24ndCBjYWNoZSB0cnVuY2F0ZWQgRE5TIGVudHJpZXMgaW4gdGhlIGxvY2FsIGNhY2hlICh0aGlzIGNvdWxkCiAgICAgcG90ZW50aWFsbHkgbGVhZCB0byBhIHNwb29maW5nIGF0dGFjaykuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRml4IHZhcmlvdXMgYnVmZmVycyB0byBiZSBsYXJnZSBlbm91Z2ggZm9yIGhleC9kZWNpbWFsCiAgICAgcmVwcmVzZW50YXRpb25zIGluIGEgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWFubmVyLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBDUllQVE9fcmVhbGxvY19jbGVhbigpIHRvIGF2b2lkIGluZm9ybWF0aW9uIGxlYWthZ2Ugd2hlbgogICAgIHJlc2l6aW5nIGJ1ZmZlcnMgY29udGFpbmluZyBzZWNyZXRzLCBhbmQgdXNlIHdoZXJlIGFwcHJvcHJpYXRlLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBCSU9faW5kZW50KCkgdG8gYXZvaWQgbXVjaCBzbGlnaHRseSB3b3JyeWluZyBjb2RlIHRvIGRvCiAgICAgaW5kZW50cy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBDb252ZXJ0IHNwcmludGYoKS9CSU9fcHV0cygpIHRvIEJJT19wcmludGYoKS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBidWZmZXJfZ2V0cygpIGNvdWxkIHRlcm1pbmF0ZSB3aXRoIHRoZSBidWZmZXIgb25seSBoYWxmCiAgICAgZnVsbC4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIGFzc2VydGlvbnMgdG8gcHJldmVudCB1c2VyLXN1cHBsaWVkIGNyeXB0byBmdW5jdGlvbnMgZnJvbQogICAgIG92ZXJmbG93aW5nIGludGVybmFsIGJ1ZmZlcnMgYnkgaGF2aW5nIGxhcmdlIGJsb2NrIHNpemVzLCBldGMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgTmV3IE9QRU5TU0xfYXNzZXJ0KCkgbWFjcm8gKHNpbWlsYXIgdG8gYXNzZXJ0KCksIGJ1dCBlbmFibGVkCiAgICAgdW5jb25kaXRpb25hbGx5KS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGNvcHkgb2Yga2V5IGluIFJDNC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGFuZCBpbmNvcnJlY3RseSBzaXplZCBidWZmZXJzIGZvciBJViBpbiBwZW0uaC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBGaXggb2ZmLWJ5LW9uZSBlcnJvciBpbiBFR0QgcGF0aC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBJZiBSQU5ERklMRSBwYXRoIGlzIHRvbyBsb25nLCBpZ25vcmUgaW5zdGVhZCBvZiB0cnVuY2F0aW5nLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgYW5kIGluY29ycmVjdGx5IHNpemVkIFguNTA5IHN0cnVjdHVyZQogICAgIENCQ1BhcmFtZXRlci4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGFuZCBkYW5nZXJvdXMgZnVuY3Rpb24ga251bWJlcigpLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgYW5kIGRhbmdlcm91cyBzdHJ1Y3R1cmUsIEtTU0xfRVJSLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIFByb3RlY3QgYWdhaW5zdCBvdmVybG9uZyBzZXNzaW9uIElEIGNvbnRleHQgbGVuZ3RoIGluIGFuIGVuY29kZWQKICAgICBzZXNzaW9uIG9iamVjdC4gU2luY2UgdGhlc2UgYXJlIGxvY2FsLCB0aGlzIGRvZXMgbm90IGFwcGVhciB0byBiZQogICAgIGV4cGxvaXRhYmxlLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIENoYW5nZSBmcm9tIHNlY3VyaXR5IHBhdGNoIChzZWUgMC45LjZlIGJlbG93KSB0aGF0IGRpZCBub3QgYWZmZWN0CiAgICAgdGhlIDAuOS42IHJlbGVhc2Ugc2VyaWVzOgoKICAgICBSZW1vdGUgYnVmZmVyIG92ZXJmbG93IGluIFNTTDMgcHJvdG9jb2wgLSBhbiBhdHRhY2tlciBjb3VsZAogICAgIHN1cHBseSBhbiBvdmVyc2l6ZWQgbWFzdGVyIGtleSBpbiBLZXJiZXJvcy1lbmFibGVkIHZlcnNpb25zLgogICAgIChDVkUtMjAwMi0wNjU3KQogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIENoYW5nZSB0aGUgU1NMIGtlcmI1IGNvZGVzIHRvIG1hdGNoIFJGQyAyNzEyLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgLW5hbWVvcHQgd29yayBmdWxseSBmb3IgcmVxIGFuZCBhZGQgLXJlcW9wdCBzd2l0Y2guCiAgICAgW01pY2hhZWwgQmVsbCA8bWljaGFlbC5iZWxsQHJ6Lmh1LWJlcmxpbi5kZT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgVGhlICJibG9jayBzaXplIiBmb3IgYmxvY2sgY2lwaGVycyBpbiBDRkIgYW5kIE9GQiBtb2RlIHNob3VsZCBiZSAxLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IFluZ3ZlIE55c2FldGVyIFBldHRlcnNlbiA8eW5ndmVAb3BlcmEuY29tPl0KCiAgKikgTWFrZSBzdXJlIHRlc3RzIGNhbiBiZSBwZXJmb3JtZWQgZXZlbiBpZiB0aGUgY29ycmVzcG9uZGluZyBhbGdvcml0aG1zCiAgICAgaGF2ZSBiZWVuIHJlbW92ZWQgZW50aXJlbHkuICBUaGlzIHdhcyBhbHNvIHRoZSBsYXN0IHN0ZXAgdG8gbWFrZQogICAgIE9wZW5TU0wgY29tcGlsYWJsZSB3aXRoIERKR1BQIHVuZGVyIGFsbCByZWFzb25hYmxlIGNvbmRpdGlvbnMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSwgRG91ZyBLYXVmbWFuIDxka2F1Zm1hbkByYWh1bC5uZXQ+XQoKICAqKSBBZGQgY2lwaGVyIHNlbGVjdGlvbiBydWxlcyBDT01QTEVNRU5UT0ZBTEwgYW5kIENPTVBMRU1FTlRPRkRFRkFVTFQKICAgICB0byBhbGxvdyB2ZXJzaW9uIGluZGVwZW5kZW50IGRpc2FibGluZyBvZiBub3JtYWxseSB1bnNlbGVjdGVkIGNpcGhlcnMsCiAgICAgd2hpY2ggbWF5IGJlIGFjdGl2YXRlZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHNlbGVjdGluZyBhIHNpbmdsZSBjaXBoZXIuCgogICAgIChFLmcuLCBjaXBoZXIgbGlzdCBzdHJpbmcgIlJTQSIgZW5hYmxlcyBjaXBoZXJzdWl0ZXMgdGhhdCBhcmUgbGVmdAogICAgIG91dCBvZiAiQUxMIiBiZWNhdXNlIHRoZXkgZG8gbm90IHByb3ZpZGUgc3ltbWV0cmljIGVuY3J5cHRpb24uCiAgICAgIlJTQTohQ09NUExFTUVNRU5UT0ZBTEwiIGF2b2lkcyB0aGVzZSB1bnNhZmUgY2lwaGVyc3VpdGVzLikKICAgICBbTHV0eiBKYWVuaWNrZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYXBwcm9wcmlhdGUgc3VwcG9ydCBmb3Igc2VwYXJhdGUgcGxhdGZvcm0tZGVwZW5kZW50IGJ1aWxkCiAgICAgZGlyZWN0b3JpZXMuICBUaGUgcmVjb21tZW5kZWQgd2F5IHRvIG1ha2UgYSBwbGF0Zm9ybS1kZXBlbmRlbnQKICAgICBidWlsZCBkaXJlY3RvcnkgaXMgdGhlIGZvbGxvd2luZyAodGVzdGVkIG9uIExpbnV4KSwgbWF5YmUgd2l0aAogICAgIHNvbWUgbG9jYWwgdHdlYWtzOgoKCSMgUGxhY2UgeW91cnNlbGYgb3V0c2lkZSBvZiB0aGUgT3BlblNTTCBzb3VyY2UgdHJlZS4gIEluCgkjIHRoaXMgZXhhbXBsZSwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIE9QRU5TU0xfU09VUkNFCgkjIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgYWJzb2x1dGUgT3BlblNTTCBzb3VyY2UgZGlyZWN0b3J5LgoJbWtkaXIgLXAgb2JqdHJlZS8iYHVuYW1lIC1zYC1gdW5hbWUgLXJgLWB1bmFtZSAtbWAiCgljZCBvYmp0cmVlLyJgdW5hbWUgLXNgLWB1bmFtZSAtcmAtYHVuYW1lIC1tYCIKCShjZCAkT1BFTlNTTF9TT1VSQ0U7IGZpbmQgLiAtdHlwZSBmKSB8IHdoaWxlIHJlYWQgRjsgZG8KCQlta2RpciAtcCBgZGlybmFtZSAkRmAKCQlsbiAtcyAkT1BFTlNTTF9TT1VSQ0UvJEYgJEYKCWRvbmUKCiAgICAgVG8gYmUgYWJzb2x1dGVseSBzdXJlIG5vdCB0byBkaXN0dXJiIHRoZSBzb3VyY2UgdHJlZSwgYSAibWFrZSBjbGVhbiIKICAgICBpcyBhIGdvb2QgdGhpbmcuICBJZiBpdCBpc24ndCBzdWNjZXNzZnVsbCwgZG9uJ3Qgd29ycnkgYWJvdXQgaXQsCiAgICAgaXQgcHJvYmFibHkgbWVhbnMgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgdmVyeSBjbGVhbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIHN1cmUgYW55IEVOR0lORSBjb250cm9sIGNvbW1hbmRzIG1ha2UgbG9jYWwgY29waWVzIG9mIHN0cmluZwogICAgIHBvaW50ZXJzIHBhc3NlZCB0byB0aGVtIHdoZW5ldmVyIG5lY2Vzc2FyeS4gT3RoZXJ3aXNlIGl0IGlzIHBvc3NpYmxlCiAgICAgdGhlIGNhbGxlciBtYXkgaGF2ZSBvdmVyd3JpdHRlbiAob3IgZGVhbGxvY2F0ZWQpIHRoZSBvcmlnaW5hbCBzdHJpbmcKICAgICBkYXRhIHdoZW4gYSBsYXRlciBFTkdJTkUgb3BlcmF0aW9uIHRyaWVzIHRvIHVzZSB0aGUgc3RvcmVkIHZhbHVlcy4KICAgICBbR/Z0eiBCYWJpbi1FYmVsbCA8YmFiaW5lYmVsbEB0cnVzdGNlbnRlci5kZT5dCgogICopIEltcHJvdmUgZGlhZ25vc3RpY3MgaW4gZmlsZSByZWFkaW5nIGFuZCBjb21tYW5kLWxpbmUgZGlnZXN0cy4KICAgICBbQmVuIExhdXJpZSBhaWRlZCBhbmQgYWJldHRlZCBieSBTb2xhciBEZXNpZ25lciA8c29sYXJAb3BlbndhbGwuY29tPl0KCiAgKikgQWRkIEFFUyBtb2RlcyBDRkIgYW5kIE9GQiB0byB0aGUgb2JqZWN0IGRhdGFiYXNlLiAgQ29ycmVjdCBhbgogICAgIGVycm9yIGluIEFFUy1DRkIgZGVjcnlwdGlvbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZW1vdmUgbW9zdCBjYWxscyB0byBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCkgaW4gZXZwX2VuYy5jLCB0aGlzIAogICAgIGFsbG93cyBleGlzdGluZyBFVlBfQ0lQSEVSX0NUWCBzdHJ1Y3R1cmVzIHRvIGJlIHJldXNlZCBhZnRlcgogICAgIGNhbGxpbmcgRVZQXypGaW5hbCgpLiBUaGlzIGJlaGF2aW91ciBpcyB1c2VkIGJ5IGVuY3J5cHRpb24KICAgICBCSU9zIGFuZCBzb21lIGFwcGxpY2F0aW9ucy4gVGhpcyBoYXMgdGhlIHNpZGUgZWZmZWN0IHRoYXQKICAgICBhcHBsaWNhdGlvbnMgbXVzdCBleHBsaWNpdGx5IGNsZWFuIHVwIGNpcGhlciBjb250ZXh0cyB3aXRoCiAgICAgRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgpIG9yIHRoZXkgd2lsbCBsZWFrIG1lbW9yeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGVjayB0aGUgdmFsdWVzIG9mIGRuYSBhbmQgZG5iIGluIGJuX211bF9yZWN1cnNpdmUgYmVmb3JlIGNhbGxpbmcKICAgICBibl9tdWxfY29tYmEgKGEgbm9uIHplcm8gdmFsdWUgbWVhbnMgdGhlIGEgb3IgYiBhcnJheXMgZG8gbm90IGNvbnRhaW4KICAgICBuMiBlbGVtZW50cykgYW5kIGZhbGxiYWNrIHRvIGJuX211bF9ub3JtYWwgaWYgZWl0aGVyIGlzIG5vdCB6ZXJvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBlc2NhcGluZyBvZiBub24tQVNDSUkgY2hhcmFjdGVycyB3aGVuIHVzaW5nIHRoZSAtc3ViaiBvcHRpb24KICAgICBvZiB0aGUgIm9wZW5zc2wgcmVxIiBjb21tYW5kIGxpbmUgdG9vbC4gKFJvYmVydCBKb29wIDxqb29wQGZva3VzLmdtZC5kZT4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIE1ha2Ugb2JqZWN0IGRlZmluaXRpb25zIGNvbXBsaWFudCB0byBMREFQIChSRkMyMjU2KTogU04gaXMgdGhlIHNob3J0CiAgICAgZm9ybSBmb3IgInN1cm5hbWUiLCBzZXJpYWxOdW1iZXIgaGFzIG5vIHNob3J0IGZvcm0uCiAgICAgVXNlICJtYWlsIiBhcyB0aGUgc2hvcnQgbmFtZSBmb3IgInJmYzgyMk1haWxib3giIGFjY29yZGluZyB0byBSRkMyNzk4OwogICAgIHRoZXJlZm9yZSByZW1vdmUgIm1haWwiIHNob3J0IG5hbWUgZm9yICJpbnRlcm5ldCA3Ii4KICAgICBUaGUgT0lEIGZvciB1bmlxdWUgaWRlbnRpZmllcnMgaW4gWDUwOSBjZXJ0aWZpY2F0ZXMgaXMKICAgICB4NTAwVW5pcXVlSWRlbnRpZmllciwgbm90IHVuaXF1ZUlkZW50aWZpZXIuCiAgICAgU29tZSBtb3JlIE9JRCBhZGRpdGlvbnMuIChNaWNoYWVsIEJlbGwgPG1pY2hhZWwuYmVsbEByei5odS1iZXJsaW4uZGU+KQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgYW4gImluaXQiIGNvbW1hbmQgdG8gdGhlIEVOR0lORSBjb25maWcgbW9kdWxlIGFuZCBhdXRvIGluaXRpYWxpemUKICAgICBFTkdJTkVzLiBXaXRob3V0IGFueSAiaW5pdCIgY29tbWFuZCB0aGUgRU5HSU5FIHdpbGwgYmUgaW5pdGlhbGl6ZWQgCiAgICAgYWZ0ZXIgYWxsIGN0cmwgY29tbWFuZHMgaGF2ZSBiZWVuIGV4ZWN1dGVkIG9uIGl0LiBJZiBpbml0PTEgdGhlIAogICAgIEVOR0lORSBpcyBpbml0YWlsaXplZCBhdCB0aGF0IHBvaW50IChjdHJscyBiZWZvcmUgdGhhdCBwb2ludCBhcmUgcnVuCiAgICAgb24gdGhlIHVuaW5pdGlhbGl6ZWQgRU5HSU5FIGFuZCBhZnRlciBvbiB0aGUgaW5pdGlhbGl6ZWQgb25lKS4gSWYKICAgICBpbml0PTAgdGhlbiB0aGUgRU5HSU5FIHdpbGwgbm90IGJlIGluaWF0aWFsaXplZCBhdCBhbGwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSAnYXBwX3ZlcmlmeV9jYWxsYmFjaycgaW50ZXJmYWNlIHNvIHRoYXQgdGhlIHVzZXItZGVmaW5lZAogICAgIGFyZ3VtZW50IGlzIGFjdHVhbGx5IHBhc3NlZCB0byB0aGUgY2FsbGJhY2s6IEluIHRoZQogICAgIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKCkgcHJvdG90eXBlLCB0aGUgY2FsbGJhY2sKICAgICBkZWNsYXJhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIGZyb20KICAgICAgICAgIGludCAoKmNiKSgpCiAgICAgaW50bwogICAgICAgICAgaW50ICgqY2IpKFg1MDlfU1RPUkVfQ1RYICosdm9pZCAqKTsKICAgICBpbiBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4gKHNzbC9zc2xfY2VydC5jKSwgdGhlIGNhbGwKICAgICAgICAgIGk9cy0+Y3R4LT5hcHBfdmVyaWZ5X2NhbGxiYWNrKCZjdHgpCiAgICAgaGFzIGJlZW4gY2hhbmdlZCBpbnRvCiAgICAgICAgICBpPXMtPmN0eC0+YXBwX3ZlcmlmeV9jYWxsYmFjaygmY3R4LCBzLT5jdHgtPmFwcF92ZXJpZnlfYXJnKS4KCiAgICAgVG8gdXBkYXRlIGFwcGxpY2F0aW9ucyB1c2luZyBTU0xfQ1RYX3NldF9jZXJ0X3ZlcmlmeV9jYWxsYmFjaygpLAogICAgIGEgZHVtbXkgYXJndW1lbnQgY2FuIGJlIGFkZGVkIHRvIHRoZWlyIGNhbGxiYWNrIGZ1bmN0aW9ucy4KICAgICBbRC4gSy4gU21ldHRlcnMgPHNtZXR0ZXJzQHBhcmMueGVyb3guY29tPl0KCiAgKikgQWRkZWQgdGhlICc0NzU4Y2NhJyBFTkdJTkUgdG8gc3VwcG9ydCBJQk0gNDc1OCBjYXJkcy4KICAgICBbTWF1cmljZSBHaXR0ZW5zIDxtYXVyaWNlQGdpdHRlbnMubmw+LCB0b3VjaHVwcyBieSBHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhbmQgT1BFTlNTTF9MT0FEX0NPTkYgZGVmaW5lIHdoaWNoIHdpbGwgY2F1c2UKICAgICBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpIHRvIGxvYWQgdGhlIG9wZW5zc2wuY25mIGNvbmZpZyBmaWxlLgogICAgIFRoaXMgYWxsb3dzIG9sZGVyIGFwcGxpY2F0aW9ucyB0byB0cmFuc3BhcmVudGx5IHN1cHBvcnQgY2VydGFpbgogICAgIE9wZW5TU0wgZmVhdHVyZXM6IHN1Y2ggYXMgY3J5cHRvIGFjY2VsZXJhdGlvbiBhbmQgZHluYW1pYyBFTkdJTkUgbG9hZGluZy4KICAgICBUd28gbmV3IGZ1bmN0aW9ucyBPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19ub2NvbmYoKSB3aGljaCB3aWxsIG5ldmVyCiAgICAgbG9hZCB0aGUgY29uZmlnIGZpbGUgYW5kIE9QRU5TU0xfYWRkX2FsbF9hbGdvcml0aG1zX2NvbmYoKSB3aGljaCB3aWxsCiAgICAgYWx3YXlzIGxvYWQgaXQgaGF2ZSBhbHNvIGJlZW4gYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBPRkIsIENGQiBhbmQgQ1RSIChhbGwgd2l0aCAxMjggYml0IGZlZWRiYWNrKSB0byBBRVMuCiAgICAgQWRqdXN0IE5JRHMgYW5kIEVWUCBsYXllci4KICAgICBbU3RlcGhlbiBTcHJ1bmsgPHN0ZXBoZW5Ac3BydW5rLm9yZz4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ29uZmlnIG1vZHVsZXMgc3VwcG9ydCBpbiBvcGVuc3NsIHV0aWxpdHkuCgogICAgIE1vc3QgY29tbWFuZHMgbm93IGxvYWQgbW9kdWxlcyBmcm9tIHRoZSBjb25maWcgZmlsZSwKICAgICB0aG91Z2ggaW4gYSBmZXcgKHN1Y2ggYXMgdmVyc2lvbikgdGhpcyBpc24ndCBkb25lIAogICAgIGJlY2F1c2UgaXQgY291bGRuJ3QgYmUgdXNlZCBmb3IgYW55dGhpbmcuCgogICAgIEluIHRoZSBjYXNlIG9mIGNhIGFuZCByZXEgdGhlIGNvbmZpZyBmaWxlIHVzZWQgaXMKICAgICB0aGUgc2FtZSBhcyB0aGUgdXRpbGl0eSBpdHNlbGY6IHRoYXQgaXMgdGhlIC1jb25maWcKICAgICBjb21tYW5kIGxpbmUgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4KICAgICBhbHRlcm5hdGl2ZSBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgZGVmYXVsdCBiZWhhdmlvdXIgZnJvbSBPUEVOU1NMX2NvbmZpZygpLiBJZiBhcHBuYW1lIGlzIE5VTEwKICAgICB1c2UgIm9wZW5zc2xfY29uZiIgaWYgZmlsZW5hbWUgaXMgTlVMTCB1c2UgZGVmYXVsdCBvcGVuc3NsIGNvbmZpZyBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhbiBhcmd1bWVudCB0byBPUEVOU1NMX2NvbmZpZygpIHRvIGFsbG93IHRoZSB1c2Ugb2YgYW4gYWx0ZXJuYXRpdmUKICAgICBjb25maWcgc2VjdGlvbiBuYW1lLiBBZGQgYSBuZXcgZmxhZyB0byB0b2xlcmF0ZSBhIG1pc3NpbmcgY29uZmlnIGZpbGUKICAgICBhbmQgbW92ZSBjb2RlIHRvIENPTkZfbW9kdWxlc19sb2FkX2ZpbGUoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMgZnJvbSBBY2NlbGVyYXRlZCBFbmNyeXB0aW9uCiAgICAgUHJvY2Vzc2luZywgd3d3LmFlcC5pZS4gIChVc2UgZW5naW5lICdhZXAnKQogICAgIFRoZSBzdXBwb3J0IHdhcyBjb3BpZWQgZnJvbSAwLjkuNmMgW2VuZ2luZV0gYW5kIGFkYXB0ZWQvY29ycmVjdGVkCiAgICAgdG8gd29yayB3aXRoIHRoZSBuZXcgZW5naW5lIGZyYW1ld29yay4KICAgICBbQUVQIEluYy4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgU3VwcG9ydCBmb3IgU3VyZVdhcmUgY3J5cHRvIGFjY2VsZXJhdG9yIGNhcmRzIGZyb20gQmFsdGltb3JlCiAgICAgVGVjaG5vbG9naWVzLiAgKFVzZSBlbmdpbmUgJ3N1cmV3YXJlJykKICAgICBUaGUgc3VwcG9ydCB3YXMgY29waWVkIGZyb20gMC45LjZjIFtlbmdpbmVdIGFuZCBhZGFwdGVkCiAgICAgdG8gd29yayB3aXRoIHRoZSBuZXcgZW5naW5lIGZyYW1ld29yay4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBIYXZlIHRoZSBDSElMIGVuZ2luZSBmb3JrLXNhZmUgKGFzIGRlZmluZWQgYnkgbkNpcGhlcikgYW5kIGFjdHVhbGx5CiAgICAgbWFrZSB0aGUgbmV3ZXIgRU5HSU5FIGZyYW1ld29yayBjb21tYW5kcyBmb3IgdGhlIENISUwgZW5naW5lIHdvcmsuCiAgICAgW1Rvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIHByb2R1Y2Ugc2hhcmVkIGxpYnJhcmllcyBvbiBSZWxpYW50VU5JWC4KICAgICBbUm9iZXJ0IERhaGxlbSA8Um9iZXJ0LkRhaGxlbUBmZm0yLnNpZW1lbnMuZGU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgY29uZmlndXJhdGlvbiB0YXJnZXQgZGVidWctbGludXgtcHByby4KICAgICBNYWtlICdvcGVuc3NsIHJzYScgdXNlIHRoZSBnZW5lcmFsIGtleSBsb2FkaW5nIHJvdXRpbmVzCiAgICAgaW1wbGVtZW50ZWQgaW4gYXBwcy5jLCBhbmQgbWFrZSB0aG9zZSByb3V0aW5lcyBhYmxlIHRvCiAgICAgaGFuZGxlIHRoZSBrZXkgZm9ybWF0IEZPUk1BVF9ORVRTQ0FQRSBhbmQgdGhlIHZhcmlhbnQKICAgICBGT1JNQVRfSUlTU0dDLgogICAgIFtUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAqKSBGaXggYSBjcmFzaGJ1ZyBhbmQgYSBsb2dpYyBidWcgaW4gaHdjcmhrX2xvYWRfcHVia2V5KCkuCiAgICAgW1Rvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgLWtleWZvcm0gdG8gcnNhdXRsLCBhbmQgZG9jdW1lbnQgLWVuZ2luZS4KICAgICBbUmljaGFyZCBMZXZpdHRlLCBpbnNwaXJlZCBieSBUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT5dCgogICopIENoYW5nZSBCSU9fbmV3X2ZpbGUgKGNyeXB0by9iaW8vYnNzX2ZpbGUuYykgdG8gdXNlIG5ldwogICAgIEJJT19SX05PX1NVQ0hfRklMRSBlcnJvciBjb2RlIHJhdGhlciB0aGFuIHRoZSBnZW5lcmljCiAgICAgRVJSX1JfU1lTX0xJQiBlcnJvciBjb2RlIGlmIGZvcGVuKCkgZmFpbHMgd2l0aCBFTk9FTlQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBuZXcgZnVuY3Rpb25zCiAgICAgICAgICBFUlJfcGVla19sYXN0X2Vycm9yCiAgICAgICAgICBFUlJfcGVla19sYXN0X2Vycm9yX2xpbmUKICAgICAgICAgIEVSUl9wZWVrX2xhc3RfZXJyb3JfbGluZV9kYXRhLgogICAgIFRoZXNlIGFyZSBzaW1pbGFyIHRvCiAgICAgICAgICBFUlJfcGVla19lcnJvcgogICAgICAgICAgRVJSX3BlZWtfZXJyb3JfbGluZQogICAgICAgICAgRVJSX3BlZWtfZXJyb3JfbGluZV9kYXRhLAogICAgIGJ1dCByZXBvcnQgb24gdGhlIGxhdGVzdCBlcnJvciByZWNvcmRlZCByYXRoZXIgdGhhbiB0aGUgZmlyc3Qgb25lCiAgICAgc3RpbGwgaW4gdGhlIGVycm9yIHF1ZXVlLgogICAgIFtCZW4gTGF1cmllLCBCb2RvIE1vZWxsZXJdCiAgICAgICAgCiAgKikgZGVmYXVsdF9hbGdvcml0aG1zIG9wdGlvbiBpbiBFTkdJTkUgY29uZmlnIG1vZHVsZS4gVGhpcyBhbGxvd3MgdGhpbmdzCiAgICAgbGlrZToKICAgICBkZWZhdWx0X2FsZ29yaXRobXMgPSBBTEwKICAgICBkZWZhdWx0X2FsZ29yaXRobXMgPSBSU0EsIERTQSwgUkFORCwgQ0lQSEVSUywgRElHRVNUUwogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFByZWxpbWluYXJ5IEVOR0lORSBjb25maWcgbW9kdWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBleHBlcmltZW50YWwgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0aGUgQUVTIGNvZGUgdG8gZm9sbG93IHRoZSBzYW1lIG5hbWUgc3RydWN0dXJlIGFzIGFsbCBvdGhlcgogICAgIHN5bW1ldHJpYyBjaXBoZXJzLCBhbmQgYmVoYXZlIHRoZSBzYW1lIHdheS4gIE1vdmUgZXZlcnl0aGluZyB0bwogICAgIHRoZSBkaXJlY3RvcnkgY3J5cHRvL2FlcywgdGhlcmVieSBvYnNvbGV0aW5nIGNyeXB0by9yaWpuZGFlbC4KICAgICBbU3RlcGhlbiBTcHJ1bmsgPHN0ZXBoZW5Ac3BydW5rLm9yZz4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgU0VDVVJJVFk6IHJlbW92ZSB1bnNhZmUgc2V0am1wL3NpZ25hbCBpbnRlcmFjdGlvbiBmcm9tIHVpX29wZW5zc2wuYy4KICAgICBbQmVuIExhdXJpZSBhbmQgVGhlbyBkZSBSYWFkdF0KCiAgKikgQWRkIG9wdGlvbiB0byBvdXRwdXQgcHVibGljIGtleXMgaW4gcmVxIGNvbW1hbmQuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIG1hZHdvbGZAb3BlbmNhLm9yZ10KCiAgKikgVXNlIHdOQUZzIGluIEVDX1BPSU5Uc19tdWwoKSBmb3IgaW1wcm92ZWQgZWZmaWNpZW5jeQogICAgICh1cCB0byBhYm91dCAxMCUgYmV0dGVyIHRoYW4gYmVmb3JlIGZvciBQLTE5MiBhbmQgUC0yMjQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbnMvbWFjcm9zCgogICAgICAgICAgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrKGN0eCwgY2IpCiAgICAgICAgICBTU0xfQ1RYX3NldF9tc2dfY2FsbGJhY2tfYXJnKGN0eCwgYXJnKQogICAgICAgICAgU1NMX3NldF9tc2dfY2FsbGJhY2soc3NsLCBjYikKICAgICAgICAgIFNTTF9zZXRfbXNnX2NhbGxiYWNrX2FyZyhzc2wsIGFyZykKCiAgICAgdG8gcmVxdWVzdCBjYWxsaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24KCiAgICAgICAgICB2b2lkIGNiKGludCB3cml0ZV9wLCBpbnQgdmVyc2lvbiwgaW50IGNvbnRlbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBTU0wgKnNzbCwgdm9pZCAqYXJnKQoKICAgICB3aGVuZXZlciBhIHByb3RvY29sIG1lc3NhZ2UgaGFzIGJlZW4gY29tcGxldGVseSByZWNlaXZlZAogICAgICh3cml0ZV9wID09IDApIG9yIHNlbnQgKHdyaXRlX3AgPT0gMSkuICBIZXJlICd2ZXJzaW9uJyBpcyB0aGUKICAgICBwcm90b2NvbCB2ZXJzaW9uICBhY2NvcmRpbmcgdG8gd2hpY2ggdGhlIFNTTCBsaWJyYXJ5IGludGVycHJldHMKICAgICB0aGUgY3VycmVudCBwcm90b2NvbCBtZXNzYWdlIChTU0wyX1ZFUlNJT04sIFNTTDNfVkVSU0lPTiwgb3IKICAgICBUTFMxX1ZFUlNJT04pLiAgJ2NvbnRlbnRfdHlwZScgaXMgMCBpbiB0aGUgY2FzZSBvZiBTU0wgMi4wLCBvcgogICAgIHRoZSBjb250ZW50IHR5cGUgYXMgZGVmaW5lZCBpbiB0aGUgU1NMIDMuMC9UTFMgMS4wIHByb3RvY29sCiAgICAgc3BlY2lmaWNhdGlvbiAoY2hhbmdlX2NpcGhlcl9zcGVjKDIwKSwgYWxlcnQoMjEpLCBoYW5kc2hha2UoMjIpKS4KICAgICAnYnVmJyBhbmQgJ2xlbicgcG9pbnQgdG8gdGhlIGFjdHVhbCBtZXNzYWdlLCAnc3NsJyB0byB0aGUKICAgICBTU0wgb2JqZWN0LCBhbmQgJ2FyZycgaXMgdGhlIGFwcGxpY2F0aW9uLWRlZmluZWQgdmFsdWUgc2V0IGJ5CiAgICAgU1NMW19DVFhdX3NldF9tc2dfY2FsbGJhY2tfYXJnKCkuCgogICAgICdvcGVuc3NsIHNfY2xpZW50JyBhbmQgJ29wZW5zc2wgc19zZXJ2ZXInIGhhdmUgbmV3ICctbXNnJyBvcHRpb25zCiAgICAgdG8gZW5hYmxlIGEgY2FsbGJhY2sgdGhhdCBkaXNwbGF5cyBhbGwgcHJvdG9jb2wgbWVzc2FnZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHRoZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHNvIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGFzCiAgICAgc29vbiBhcyB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgbGlicmFyeSBpcyBmaW5pc2hlZCwgYW5kIHRoZXJlYnkgZ2V0CiAgICAgb3BlbnNzbCBhbmQgdGhlIHRlc3QgcHJvZ3JhbXMgbGlua2VkIGFnYWluc3QgdGhlIHNoYXJlZCBsaWJyYXJ5LgogICAgIFRoaXMgc3RpbGwgb25seSBoYXBwZW5zIHdoZW4gdGhlIGtleXdvcmQgInNoYXJkIiBoYXMgYmVlbiBnaXZlbiB0bwogICAgIHRoZSBjb25maWd1cmF0aW9uIHNjcmlwdHMuCgogICAgIE5PVEU6IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgaXMgc3RpbGwgYW4gZXhwZXJpbWVudGFsIHRoaW5nLCBhbmQKICAgICBiYWNrd2FyZCBiaW5hcnkgY29tcGF0aWJpbGl0eSBpcyBzdGlsbCBub3QgZ3VhcmFudGVlZC4KICAgICBbIk1hY2llaiBXLiBSb3p5Y2tpIiA8bWFjcm9AZHMyLnBnLmdkYS5wbD4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFN1YmplY3QgSW5mb3JtYXRpb24gQWNjZXNzIGV4dGVuc2lvbi4KICAgICBbUGV0ZXIgU3lsdmVzdGVyIDxQZXRlci5TeWx2ZXN0ZXJARWRlbFdlYi5mcj5dCgogICopIE1ha2UgQlVGX01FTV9ncm93KCkgYmVoYXZpb3VyIG1vcmUgY29uc2lzdGVudDogSW5pdGlhbGlzZSB0byB6ZXJvCiAgICAgYWRkaXRpb25hbCBieXRlcyB3aGVuIG5ldyBtZW1vcnkgaGFkIHRvIGJlIGFsbG9jYXRlZCwgbm90IGp1c3QKICAgICB3aGVuIHJldXNpbmcgYW4gZXhpc3RpbmcgYnVmZmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBjb21tYW5kIGxpbmUgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9uICd1dGY4JyBmb3IgdGhlIHJlcSBjb21tYW5kLgogICAgIFRoaXMgYWxsb3dzIGZpZWxkIHZhbHVlcyB0byBiZSBzcGVjaWZpZWQgYXMgVVRGOCBzdHJpbmdzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAtbXVsdGkgYW5kIC1tciBvcHRpb25zIHRvICJvcGVuc3NsIHNwZWVkIiAtIGdpdmluZyBtdWx0aXBsZSBwYXJhbGxlbAogICAgIHJ1bnMgZm9yIHRoZSBmb3JtZXIgYW5kIG1hY2hpbmUtcmVhZGFibGUgb3V0cHV0IGZvciB0aGUgbGF0dGVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgJy1ub2VtYWlsRE4nIG9wdGlvbiB0byAnb3BlbnNzbCBjYScuICBUaGlzIHByZXZlbnRzIGluY2x1c2lvbgogICAgIG9mIHRoZSBlLW1haWwgYWRkcmVzcyBpbiB0aGUgRE4gKGkuZS4sIGl0IHdpbGwgZ28gaW50byBhIGNlcnRpZmljYXRlCiAgICAgZXh0ZW5zaW9uIG9ubHkpLiAgVGhlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uICdlbWFpbF9pbl9kbiA9IG5vJwogICAgIGhhcyB0aGUgc2FtZSBlZmZlY3QuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIG1hZHdvbGZAb3BlbmNhLm9yZ10KCiAgKikgQ2hhbmdlIGFsbCBmdW5jdGlvbnMgd2l0aCBuYW1lcyBzdGFydGluZyB3aXRoIGRlc18gdG8gYmUgc3RhcnRpbmcKICAgICB3aXRoIERFU18gaW5zdGVhZC4gIEFkZCB3cmFwcGVycyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggbGliZGVzLAogICAgIGJ1dCBhcmUgbmFtZWQgX29zc2xfb2xkX2Rlc18qLiAgRmluYWxseSwgYWRkIG1hY3JvcyB0aGF0IG1hcCB0aGUKICAgICBkZXNfKiBzeW1ib2xzIHRvIHRoZSBjb3JyZXNwb25kaW5nIF9vc3NsX29sZF9kZXNfKiBpZiBsaWJkZXMKICAgICBjb21wYXRpYmlsaXR5IGlzIGRlc2lyZWQuICBJZiBPcGVuU1NMIDAuOS42YyBjb21wYXRpYmlsaXR5IGlzCiAgICAgZGVzaXJlZCwgdGhlIGRlc18qIHN5bWJvbHMgd2lsbCBiZSBtYXBwZWQgdG8gREVTXyosIHdpdGggb25lCiAgICAgZXhjZXB0aW9uLgoKICAgICBTaW5jZSB3ZSBwcm92aWRlIHR3byBjb21wYXRpYmlsaXR5IG1hcHBpbmdzLCB0aGUgdXNlciBuZWVkcyB0bwogICAgIGRlZmluZSB0aGUgbWFjcm8gT1BFTlNTTF9ERVNfTElCREVTX0NPTVBBVElCSUxJVFkgaWYgbGliZGVzCiAgICAgY29tcGF0aWJpbGl0eSBpcyBkZXNpcmVkLiAgVGhlIGRlZmF1bHQgKGkuZS4sIHdoZW4gdGhhdCBtYWNybwogICAgIGlzbid0IGRlZmluZWQpIGlzIE9wZW5TU0wgMC45LjZjIGNvbXBhdGliaWxpdHkuCgogICAgIFRoZXJlIGFyZSBhbHNvIG1hY3JvcyB0aGF0IGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgc3VwcG9ydCBvZiBvbGQKICAgICBkZXMgZnVuY3Rpb25zIGFsdG9nZXRoZXIuICBUaG9zZSBhcmUgT1BFTlNTTF9FTkFCTEVfT0xEX0RFU19TVVBQT1JUCiAgICAgYW5kIE9QRU5TU0xfRElTQUJMRV9PTERfREVTX1NVUFBPUlQuICBJZiBub25lIG9yIGJvdGggb2YgdGhvc2UKICAgICBhcmUgZGVmaW5lZCwgdGhlIGRlZmF1bHQgd2lsbCBhcHBseTogdG8gc3VwcG9ydCB0aGUgb2xkIGRlcyByb3V0aW5lcy4KCiAgICAgSW4gZWl0aGVyIGNhc2UsIG9uZSBtdXN0IGluY2x1ZGUgb3BlbnNzbC9kZXMuaCB0byBnZXQgdGhlIGNvcnJlY3QKICAgICBkZWZpbml0aW9ucy4gIERvIG5vdCB0cnkgdG8ganVzdCBpbmNsdWRlIG9wZW5zc2wvZGVzX29sZC5oLCB0aGF0CiAgICAgd29uJ3Qgd29yay4KCiAgICAgTk9URTogVGhpcyBpcyBhIG1ham9yIGJyZWFrIG9mIGFuIG9sZCBBUEkgaW50byBhIG5ldyBvbmUuICBTb2Z0d2FyZQogICAgIGF1dGhvcnMgYXJlIGVuY291cmFnZWQgdG8gc3dpdGNoIHRvIHRoZSBERVNfIHN0eWxlIGZ1bmN0aW9ucy4gIFNvbWUKICAgICB0aW1lIGluIHRoZSBmdXR1cmUsIGRlc19vbGQuaCBhbmQgdGhlIGxpYmRlcyBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucwogICAgIHdpbGwgYmUgZGlzYWJsZSAoaS5lLiBPUEVOU1NMX0RJU0FCTEVfT0xEX0RFU19TVVBQT1JUIHdpbGwgYmUgdGhlCiAgICAgZGVmYXVsdCksIGFuZCB0aGVuIGNvbXBsZXRlbHkgcmVtb3ZlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUZXN0IGZvciBjZXJ0aWZpY2F0ZXMgd2hpY2ggY29udGFpbiB1bnN1cHBvcnRlZCBjcml0aWNhbCBleHRlbnNpb25zLgogICAgIElmIHN1Y2ggYSBjZXJ0aWZpY2F0ZSBpcyBmb3VuZCBkdXJpbmcgYSB2ZXJpZnkgb3BlcmF0aW9uIGl0IGlzIAogICAgIHJlamVjdGVkIGJ5IGRlZmF1bHQ6IHRoaXMgYmVoYXZpb3VyIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGVpdGhlcgogICAgIGhhbmRsaW5nIHRoZSBuZXcgZXJyb3IgWDUwOV9WX0VSUl9VTkhBTkRMRURfQ1JJVElDQUxfRVhURU5TSU9OIG9yCiAgICAgYnkgc2V0dGluZyB0aGUgdmVyaWZ5IGZsYWcgWDUwOV9WX0ZMQUdfSUdOT1JFX0NSSVRJQ0FMLiBBIG5ldyBmdW5jdGlvbgogICAgIFg1MDlfc3VwcG9ydGVkX2V4dGVuc2lvbigpIGhhcyBhbHNvIGJlZW4gYWRkZWQgd2hpY2ggcmV0dXJucyAxIGlmIGEKICAgICBwYXJ0aWN1bGFyIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgRVZQIGNpcGhlciBmdW5jdGlvbnMgaW4gc2ltaWxhciB3YXkgdG8gZGlnZXN0cwogICAgIHRvIHJldGFpbiBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlIGJlaGF2aW91ciBvZiBFVlBfRGlnZXN0SW5pdCgpIGFuZCBFVlBfRGlnZXN0RmluYWwoKSB0byByZXRhaW4KICAgICBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZS4gSW4gcGFydGljdWxhciB0aGUgJ2N0eCcgcGFyYW1ldGVyIGRvZXMKICAgICBub3QgaGF2ZSB0byBiZSB0byBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGNhbGwgdG8gRVZQX0RpZ2VzdEluaXQoKSBhbmQKICAgICBpdCBpcyB0aWRpZWQgdXAgYWZ0ZXIgYSBjYWxsIHRvIEVWUF9EaWdlc3RGaW5hbCgpLiBOZXcgZnVuY3Rpb24KICAgICBFVlBfRGlnZXN0RmluYWxfZXgoKSB3aGljaCBkb2VzIG5vdCB0aWR5IHVwIHRoZSBjdHguIFNpbWlsYXJseSBmdW5jdGlvbgogICAgIEVWUF9NRF9DVFhfY29weSgpIGNoYW5nZWQgdG8gbm90IHJlcXVpcmUgdGhlIGRlc3RpbmF0aW9uIHRvIGJlCiAgICAgaW5pdGlhbGl6ZWQgdmFsaWQgYW5kIG5ldyBmdW5jdGlvbiBFVlBfTURfQ1RYX2NvcHlfZXgoKSBhZGRlZCB3aGljaAogICAgIHJlcXVpcmVzIHRoZSBkZXN0aW5hdGlvbiB0byBiZSB2YWxpZC4KCiAgICAgTW9kaWZ5IGFsbCB0aGUgT3BlblNTTCBkaWdlc3QgY2FsbHMgdG8gdXNlIEVWUF9EaWdlc3RJbml0X2V4KCksCiAgICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCkgYW5kIEVWUF9NRF9DVFhfY29weV9leCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBzc2wzX2dldF9tZXNzYWdlIChzc2wvczNfYm90aC5jKSBhbmQgdGhlIGZ1bmN0aW9ucyB1c2luZyBpdAogICAgIHNvIHRoYXQgY29tcGxldGUgJ0hhbmRzaGFrZScgcHJvdG9jb2wgc3RydWN0dXJlcyBhcmUga2VwdCBpbiBtZW1vcnkKICAgICBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nICdtc2dfdHlwZScgYW5kICdsZW5ndGgnIHdpdGggJ2JvZHknIGRhdGEuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGFuIGltcGxlbWVudGF0aW9uIG9mIFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2sgZm9yIFdpbjMyLgogICAgIFtNYXNzaW1vIFNhbnRpbiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWpvciByZXN0cnVjdHVyaW5nIHRvIHRoZSB1bmRlcmx5aW5nIEVOR0lORSBjb2RlLiBUaGlzIGluY2x1ZGVzCiAgICAgcmVkdWN0aW9uIG9mIGxpbmtlciBibG9hdCwgc2VwYXJhdGlvbiBvZiBwdXJlICJFTkdJTkUiIG1hbmlwdWxhdGlvbgogICAgIChpbml0aWFsaXNhdGlvbiwgZXRjKSBmcm9tIGZ1bmN0aW9uYWxpdHkgZGVhbGluZyB3aXRoIGltcGxlbWVudGF0aW9ucwogICAgIG9mIHNwZWNpZmljIGNyeXB0byBpdGVyZmFjZXMuIFRoaXMgY2hhbmdlIGFsc28gaW50cm9kdWNlcyBpbnRlZ3JhdGVkCiAgICAgc3VwcG9ydCBmb3Igc3ltbWV0cmljIGNpcGhlcnMgYW5kIGRpZ2VzdCBpbXBsZW1lbnRhdGlvbnMgLSBzbyBFTkdJTkVzCiAgICAgY2FuIG5vdyBhY2NlbGVyYXRlIHRoZXNlIGJ5IHByb3ZpZGluZyBFVlBfQ0lQSEVSIGFuZCBFVlBfTUQKICAgICBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlaXIgb3duLiBUaGlzIGlzIGRldGFpbGVkIGluIGNyeXB0by9lbmdpbmUvUkVBRE1FCiAgICAgYXMgaXQgY291bGRuJ3QgYmUgYWRlcXVhdGVseSBkZXNjcmliZWQgaGVyZS4gSG93ZXZlciwgdGhlcmUgYXJlIGEgZmV3CiAgICAgQVBJIGNoYW5nZXMgd29ydGggbm90aW5nIC0gc29tZSBSU0EsIERTQSwgREgsIGFuZCBSQU5EIGZ1bmN0aW9ucyB0aGF0CiAgICAgd2VyZSBjaGFuZ2VkIGluIHRoZSBvcmlnaW5hbCBpbnRyb2R1Y3Rpb24gb2YgRU5HSU5FIGNvZGUgaGF2ZSBub3cKICAgICByZXZlcnRlZCBiYWNrIC0gdGhlIGhvb2tpbmcgZnJvbSB0aGlzIGNvZGUgdG8gRU5HSU5FIGlzIG5vdyBhIGdvb2QKICAgICBkZWFsIG1vcmUgcGFzc2l2ZSBhbmQgYXQgcnVuLXRpbWUsIG9wZXJhdGlvbnMgZGVhbCBkaXJlY3RseSB3aXRoCiAgICAgUlNBX01FVEhPRHMsIERTQV9NRVRIT0RzIChldGMpIGFzIHRoZXkgZGlkIGJlZm9yZSwgcmF0aGVyIHRoYW4KICAgICBkZXJlZmVyZW5jaW5nIHRocm91Z2ggYW4gRU5HSU5FIHBvaW50ZXIgYW55IG1vcmUuIEFsc28sIHRoZSBFTkdJTkUKICAgICBmdW5jdGlvbnMgZGVhbGluZyB3aXRoIEJOX01PRF9FWFBbX0NSVF0gaGFuZGxlcnMgaGF2ZSBiZWVuIHJlbW92ZWQgLQogICAgIHRoZXkgd2VyZSBub3QgYmVpbmcgdXNlZCBieSB0aGUgZnJhbWV3b3JrIGFzIHRoZXJlIGlzIG5vIGNvbmNlcHQgb2YgYQogICAgIEJJR05VTV9NRVRIT0QgYW5kIHRoZXkgY291bGQgbm90IGJlIGdlbmVyYWxpc2VkIHRvIHRoZSBuZXcKICAgICAnRU5HSU5FX1RBQkxFJyBtZWNoYW5pc20gdGhhdCB1bmRlcmxpZXMgdGhlIG5ldyBjb2RlLiBTaW1pbGFybHksCiAgICAgRU5HSU5FX2NweSgpIGhhcyBiZWVuIHJlbW92ZWQgYXMgaXQgY2Fubm90IGJlIGNvbnNpc3RlbnRseSBkZWZpbmVkIGluCiAgICAgdGhlIG5ldyBjb2RlLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIENoYW5nZSBBU04xX0dFTkVSQUxJWkVEVElNRV9jaGVjaygpIHRvIGFsbG93IGZyYWN0aW9uYWwgc2Vjb25kcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgbWtkZWYucGwgdG8gc29ydCBzeW1ib2xzIHRoYXQgZ2V0IHRoZSBzYW1lIGVudHJ5IG51bWJlciwKICAgICBhbmQgbWFrZSBzdXJlIHRoZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmdW5jdGlvbnMgRVJSX2xvYWRfKgogICAgIGJlY29tZSBwYXJ0IG9mIGxpYmVheS5udW0gYXMgd2VsbC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgZnVuY3Rpb24gU1NMX3JlbmVnb3RpYXRlX3BlbmRpbmcoKS4gIFRoaXMgcmV0dXJucyB0cnVlIG9uY2UKICAgICByZW5lZ290aWF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZCAoZWl0aGVyIFNTTF9yZW5lZ290aWF0ZSgpIGNhbGwKICAgICBvciBIZWxsb1JlcXVlc3QvQ2xpZW50SGVsbG8gcmVjZWl2ZWQgZnJvbSB0aGUgcGVlcikgYW5kIGJlY29tZXMKICAgICBmYWxzZSBvbmNlIGEgaGFuZHNoYWtlIGhhcyBiZWVuIGNvbXBsZXRlZC4KICAgICAoRm9yIHNlcnZlcnMsIFNTTF9yZW5lZ290aWF0ZSgpIGZvbGxvd2VkIGJ5IFNTTF9kb19oYW5kc2hha2UoKQogICAgIHNlbmRzIGEgSGVsbG9SZXF1ZXN0LCBidXQgZG9lcyBub3QgZW5zdXJlIHRoYXQgYSBoYW5kc2hha2UgdGFrZXMKICAgICBwbGFjZS4gIFNTTF9yZW5lZ290aWF0ZV9wZW5kaW5nKCkgaXMgdXNlZnVsIGZvciBjaGVja2luZyBpZiB0aGUKICAgICBjbGllbnQgaGFzIGZvbGxvd2VkIHRoZSByZXF1ZXN0LikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgU1NMIG9wdGlvbiBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04uCiAgICAgQnkgZGVmYXVsdCwgY2xpZW50cyBtYXkgcmVxdWVzdCBzZXNzaW9uIHJlc3VtcHRpb24gZXZlbiBkdXJpbmcKICAgICByZW5lZ290aWF0aW9uIChpZiBzZXNzaW9uIElEIGNvbnRleHRzIHBlcm1pdCk7IHdpdGggdGhpcyBvcHRpb24sCiAgICAgc2Vzc2lvbiByZXN1bXB0aW9uIGlzIHBvc3NpYmxlIG9ubHkgaW4gdGhlIGZpcnN0IGhhbmRzaGFrZS4KCiAgICAgU1NMX09QX0FMTCBpcyBub3cgMHgwMDAwMEZGRkwgaW5zdGVhZCBvZiAweDAwMEZGRkZGTC4gIFRoaXMgbWFrZXMKICAgICBtb3JlIGJpdHMgYXZhaWxhYmxlIGZvciBvcHRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBwYXJ0IG9mCiAgICAgU1NMX09QX0FMTCAoc3VjaCBhcyBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04pLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzb21lIGRlbW9zIGZvciBjZXJ0aWZpY2F0ZSBhbmQgY2VydGlmaWNhdGUgcmVxdWVzdCBjcmVhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIG1heGltdW0gY2VydGlmaWNhdGUgY2hhaW4gc2l6ZSBhY2NlcHRlZCBmcm9tIHRoZSBwZWVyIGFwcGxpY2F0aW9uCiAgICAgc2V0dGFibGUgKFNTTCpfZ2V0L3NldF9tYXhfY2VydF9saXN0KCkpLCBhcyBwcm9wb3NlZCBieQogICAgICJEb3VnbGFzIEUuIEVuZ2VydCIgPGRlZW5nZXJ0QGFubC5nb3Y+LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBmb3IgVW5peHdhcmUtNwogICAgIChCb3lkIEx5bm4gR2VyYmVyIDxnZXJiZXJiQHplbmV6LmNvbT4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgYSAiZGVzdHJveSIgaGFuZGxlciB0byBFTkdJTkVzIHRoYXQgYWxsb3dzIHN0cnVjdHVyYWwgY2xlYW51cCB0bwogICAgIGJlIGRvbmUgcHJpb3IgdG8gZGVzdHJ1Y3Rpb24uIFVzZSB0aGlzIHRvIHVubG9hZCBlcnJvciBzdHJpbmdzIGZyb20KICAgICBFTkdJTkVzIHRoYXQgbG9hZCB0aGVpciBvd24gZXJyb3Igc3RyaW5ncy4gTkI6IFRoaXMgYWRkcyB0d28gbmV3IEFQSQogICAgIGZ1bmN0aW9ucyB0byAiZ2V0IiBhbmQgInNldCIgdGhpcyBkZXN0cm95IGhhbmRsZXIgaW4gYW4gRU5HSU5FLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFsdGVyIGFsbCBleGlzdGluZyBFTkdJTkUgaW1wbGVtZW50YXRpb25zIChleGNlcHQgIm9wZW5zc2wiIGFuZAogICAgICJvcGVuYnNkIikgdG8gZHluYW1pY2FsbHkgaW5zdGFudGlhdGUgdGhlaXIgb3duIGVycm9yIHN0cmluZ3MuIFRoaXMKICAgICBtYWtlcyB0aGVtIG1vcmUgZmxleGlibGUgdG8gYmUgYnVpbHQgYm90aCBhcyBzdGF0aWNhbGx5LWxpbmtlZCBFTkdJTkVzCiAgICAgYW5kIHNlbGYtY29udGFpbmVkIHNoYXJlZC1saWJyYXJpZXMgbG9hZGFibGUgdmlhIHRoZSAiZHluYW1pYyIgRU5HSU5FLgogICAgIEFsc28sIGFkZCBzdHViIGNvZGUgdG8gZWFjaCB0aGF0IG1ha2VzIGJ1aWxkaW5nIHRoZW0gYXMgc2VsZi1jb250YWluZWQKICAgICBzaGFyZWQtbGlicmFyaWVzIGVhc2llciAoc2VlIFJFQURNRS5FTkdJTkUpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhICJkeW5hbWljIiBFTkdJTkUgdGhhdCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgYmluZGluZyBFTkdJTkUKICAgICBpbXBsZW1lbnRhdGlvbnMgaW50byBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgY29tcGxldGVseSBpbXBsZW1lbnRlZCBpbgogICAgIHNlbGYtY29udGFpbmVkIHNoYXJlZC1saWJyYXJpZXMuIFRoZSAiZHluYW1pYyIgRU5HSU5FIGV4cG9zZXMgY29udHJvbAogICAgIGNvbW1hbmRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHdoYXQgc2hhcmVkLWxpYnJhcnkgdG8gbG9hZCBhbmQKICAgICB0byBjb250cm9sIGFzcGVjdHMgb2YgdGhlIHdheSBpdCBpcyBoYW5kbGVkLiBBbHNvLCBtYWRlIGFuIHVwZGF0ZSB0bwogICAgIHRoZSBSRUFETUUuRU5HSU5FIGZpbGUgdGhhdCBicmluZ3MgaXRzIGluZm9ybWF0aW9uIHVwLXRvLWRhdGUgYW5kCiAgICAgcHJvdmlkZXMgc29tZSBpbmZvcm1hdGlvbiBhbmQgaW5zdHJ1Y3Rpb25zIG9uIHRoZSAiZHluYW1pYyIgRU5HSU5FCiAgICAgKGllLiBob3cgdG8gdXNlIGl0LCBob3cgdG8gYnVpbGQgImR5bmFtaWMiLWxvYWRhYmxlIEVOR0lORXMsIGV0YykuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byB1bmxvYWQgcmFuZ2VzIG9mIEVSUiBzdHJpbmdzIHdpdGggYSBuZXcKICAgICAiRVJSX3VubG9hZF9zdHJpbmdzIiBmdW5jdGlvbi4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYSBjb3B5KCkgZnVuY3Rpb24gdG8gRVZQX01ELgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNYWtlIEVWUF9NRCByb3V0aW5lcyB0YWtlIGEgY29udGV4dCBwb2ludGVyIGluc3RlYWQgb2YganVzdCB0aGUKICAgICBtZF9kYXRhIHZvaWQgcG9pbnRlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGZsYWdzIHRvIEVWUF9NRCBhbmQgRVZQX01EX0NUWC4gRVZQX01EX0ZMQUdfT05FU0hPVCBpbmRpY2F0ZXMKICAgICB0aGF0IHRoZSBkaWdlc3QgY2FuIG9ubHkgcHJvY2VzcyBhIHNpbmdsZSBjaHVuayBvZiBkYXRhCiAgICAgKHR5cGljYWxseSBiZWNhdXNlIGl0IGlzIHByb3ZpZGVkIGJ5IGEgcGllY2Ugb2YKICAgICBoYXJkd2FyZSkuIEVWUF9NRF9DVFhfRkxBR19PTkVTSE9UIGluZGljYXRlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbgogICAgIGlzIG9ubHkgZ29pbmcgdG8gcHJvdmlkZSBhIHNpbmdsZSBjaHVuayBvZiBkYXRhLCBhbmQgaGVuY2UgdGhlCiAgICAgZnJhbWV3b3JrIG5lZWRuJ3QgYWNjdW11bGF0ZSB0aGUgZGF0YSBmb3Igb25lc2hvdCBkcml2ZXJzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBcyB3aXRoICJFUlIiLCBtYWtlIGl0IHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlIHVuZGVybHlpbmcgImV4X2RhdGEiCiAgICAgZnVuY3Rpb25zLiBUaGlzIGNoYW5nZSBhbHNvIGFsdGVycyB0aGUgc3RvcmFnZSBhbmQgbWFuYWdlbWVudCBvZiBnbG9iYWwKICAgICBleF9kYXRhIHN0YXRlIC0gaXQncyBub3cgYWxsIGluc2lkZSBleF9kYXRhLmMgYW5kIGFsbCAiY2xhc3MiIGNvZGUgKGVnLgogICAgIFJTQSwgQklPLCBTU0xfQ1RYLCBldGMpIG5vIGxvbmdlciBzdG9yZXMgaXRzIG93biBTVEFDS1MgYW5kIHBlci1jbGFzcwogICAgIGluZGV4IGNvdW50ZXJzLiBUaGUgQVBJIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGlzIHN0YXRlIGhhdmUgYmVlbiBjaGFuZ2VkCiAgICAgdG8gdGFrZSBhICJjbGFzc19pbmRleCIgcmF0aGVyIHRoYW4gcG9pbnRlcnMgdG8gdGhlIGNsYXNzJ3MgbG9jYWwgU1RBQ0sKICAgICBhbmQgY291bnRlciwgYW5kIHRoZXJlIGlzIG5vdyBhbiBBUEkgZnVuY3Rpb24gdG8gZHluYW1pY2FsbHkgY3JlYXRlIG5ldwogICAgIGNsYXNzZXMuIFRoaXMgY2VudHJhbGlzYXRpb24gYWxsb3dzIHVzIHRvIChhKSBwbHVnIGEgbG90IG9mIHRoZQogICAgIHRocmVhZC1zYWZldHkgcHJvYmxlbXMgdGhhdCBleGlzdGVkLCBhbmQgKGIpIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNsZWFuCiAgICAgdXAgYWxsIGFsbG9jYXRlZCBzdGF0ZSB1c2luZyAiQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKSIuIFcuci50LiAoYikKICAgICBzdWNoIGRhdGEgd291bGQgcHJldmlvdXNseSBoYXZlIGFsd2F5cyBsZWFrZWQgaW4gYXBwbGljYXRpb24gY29kZSBhbmQKICAgICB3b3JrYXJvdW5kcyB3ZXJlIGluIHBsYWNlIHRvIG1ha2UgdGhlIG1lbW9yeSBkZWJ1Z2dpbmcgdHVybiBhIGJsaW5kIGV5ZQogICAgIHRvIGl0LiBBcHBsaWNhdGlvbiBjb2RlIHRoYXQgZG9lc24ndCB1c2UgdGhpcyBuZXcgZnVuY3Rpb24gd2lsbCBzdGlsbAogICAgIGxlYWsgYXMgYmVmb3JlLCBidXQgdGhlaXIgbWVtb3J5IGRlYnVnZ2luZyBvdXRwdXQgd2lsbCBhbm5vdW5jZSBpdCBub3cKICAgICByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IHNsaWRlLgoKICAgICBCZXNpZGVzIHRoZSBhZGRpdGlvbiBvZiBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpLCBhbm90aGVyIEFQSSBjaGFuZ2UKICAgICBpbmR1Y2VkIGJ5IHRoZSAiZXhfZGF0YSIgb3ZlcmhhdWwgaXMgdGhhdCBYNTA5X1NUT1JFX0NUWF9pbml0KCkgbm93CiAgICAgaGFzIGEgcmV0dXJuIHZhbHVlIHRvIGluZGljYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlIHVuZGVybHlpbmcgIkVSUiIgZnVuY3Rpb25zIHN1Y2ggdGhhdCB0aGUKICAgICBnbG9iYWwgc3RhdGUgKDIgTEhBU0ggdGFibGVzIGFuZCAyIGxvY2tzKSBpcyBvbmx5IHVzZWQgYnkgdGhlICJkZWZhdWx0IgogICAgIGltcGxlbWVudGF0aW9uLiBUaGlzIGNoYW5nZSBhbHNvIGFkZHMgdHdvIGZ1bmN0aW9ucyB0byAiZ2V0IiBhbmQgInNldCIKICAgICB0aGUgaW1wbGVtZW50YXRpb24gcHJpb3IgdG8gaXQgYmVpbmcgYXV0b21hdGljYWxseSBzZXQgdGhlIGZpcnN0IHRpbWUKICAgICBhbnkgb3RoZXIgRVJSIGZ1bmN0aW9uIHRha2VzIHBsYWNlLiBJZS4gYW4gYXBwbGljYXRpb24gY2FuIGNhbGwgImdldCIsCiAgICAgcGFzcyB0aGUgcmV0dXJuIHZhbHVlIHRvIGEgbW9kdWxlIGl0IGhhcyBqdXN0IGxvYWRlZCwgYW5kIHRoYXQgbW9kdWxlCiAgICAgY2FuIGNhbGwgaXRzIG93biAic2V0IiBmdW5jdGlvbiB1c2luZyB0aGF0IHZhbHVlLiBUaGlzIG1lYW5zIHRoZQogICAgIG1vZHVsZSdzICJFUlIiIG9wZXJhdGlvbnMgd2lsbCB1c2UgKGFuZCBtb2RpZnkpIHRoZSBlcnJvciBzdGF0ZSBpbiB0aGUKICAgICBhcHBsaWNhdGlvbiBhbmQgbm90IGluIGl0cyBvd24gc3RhdGljYWxseSBsaW5rZWQgY29weSBvZiBPcGVuU1NMIGNvZGUuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgR2l2ZSBESCwgRFNBLCBhbmQgUlNBIHR5cGVzIHRoZWlyIG93biAiKipfdXBfcmVmKCkiIGZ1bmN0aW9uIHRvIGluY3JlbWVudAogICAgIHJlZmVyZW5jZSBjb3VudHMuIFRoaXMgcGVyZm9ybXMgbm9ybWFsIFJFRl9QUklOVC9SRUZfQ0hFQ0sgbWFjcm9zIG9uCiAgICAgdGhlIG9wZXJhdGlvbiwgYW5kIHByb3ZpZGVzIGEgbW9yZSBlbmNhcHN1bGF0ZWQgd2F5IGZvciBleHRlcm5hbCBjb2RlCiAgICAgKGNyeXB0by9ldnAvIGFuZCBzc2wvKSB0byBkbyB0aGlzLiBBbHNvIGNoYW5nZWQgdGhlIGV2cCBhbmQgc3NsIGNvZGUKICAgICB0byB1c2UgdGhlc2UgZnVuY3Rpb25zIHJhdGhlciB0aGFuIG1hbnVhbGx5IGluY3JlbWVudGluZyB0aGUgY291bnRzLgoKICAgICBBbHNvIHJlbmFtZSAiRFNPX3VwKCkiIGZ1bmN0aW9uIHRvIG1vcmUgZGVzY3JpcHRpdmUgIkRTT191cF9yZWYoKSIuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIEVWUCB0ZXN0IHByb2dyYW0uCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBzeW1tZXRyaWMgY2lwaGVyIHN1cHBvcnQgdG8gRU5HSU5FLiBFeHBlY3QgdGhlIEFQSSB0byBjaGFuZ2UhCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE5ldyBDUkwgZnVuY3Rpb25zOiBYNTA5X0NSTF9zZXRfdmVyc2lvbigpLCBYNTA5X0NSTF9zZXRfaXNzdWVyX25hbWUoKQogICAgIFg1MDlfQ1JMX3NldF9sYXN0VXBkYXRlKCksIFg1MDlfQ1JMX3NldF9uZXh0VXBkYXRlKCksIFg1MDlfQ1JMX3NvcnQoKSwKICAgICBYNTA5X1JFVk9LRURfc2V0X3NlcmlhbE51bWJlcigpLCBhbmQgWDUwOV9SRVZPS0VEX3NldF9yZXZvY2F0aW9uRGF0ZSgpLgogICAgIFRoZXNlIGFsbG93IGEgQ1JMIHRvIGJlIGJ1aWx0IHdpdGhvdXQgaGF2aW5nIHRvIGFjY2VzcyBYNTA5X0NSTCBmaWVsZHMKICAgICBkaXJlY3RseS4gTW9kaWZ5ICdjYScgYXBwbGljYXRpb24gdG8gdXNlIG5ldyBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW92ZSBTU0xfT1BfVExTX1JPTExCQUNLX0JVRyBvdXQgb2YgdGhlIFNTTF9PUF9BTEwgbGlzdCBvZiByZWNvbW1lbmRlZAogICAgIGJ1ZyB3b3JrYXJvdW5kcy4gUm9sbGJhY2sgYXR0YWNrIGRldGVjdGlvbiBpcyBhIHNlY3VyaXR5IGZlYXR1cmUuCiAgICAgVGhlIHByb2JsZW0gd2lsbCBvbmx5IGFyaXNlIG9uIE9wZW5TU0wgc2VydmVycyB3aGVuIFRMU3YxIGlzIG5vdAogICAgIGF2YWlsYWJsZSAoc3NsdjNfc2VydmVyX21ldGhvZCgpIG9yIFNTTF9PUF9OT19UTFN2MSkuCiAgICAgU29mdHdhcmUgYXV0aG9ycyBub3Qgd2FudGluZyB0byBzdXBwb3J0IFRMU3YxIHdpbGwgaGF2ZSBzcGVjaWFsIHJlYXNvbnMKICAgICBmb3IgdGhlaXIgY2hvaWNlIGFuZCBjYW4gZXhwbGljaXRseSBlbmFibGUgdGhpcyBvcHRpb24uCiAgICAgW0JvZG8gTW9lbGxlciwgTHV0eiBKYWVuaWNrZV0KCiAgKikgUmF0aW9uYWxpc2UgRVZQIHNvIGl0IGNhbiBiZSBleHRlbmRlZDogZG9uJ3QgaW5jbHVkZSBhIHVuaW9uIG9mCiAgICAgY2lwaGVyL2RpZ2VzdCBzdHJ1Y3R1cmVzLCBhZGQgaW5pdC9jbGVhbnVwIGZ1bmN0aW9ucyBmb3IgRVZQX01EX0NUWAogICAgIChzaW1pbGFyIHRvIHRob3NlIGV4aXN0aW5nIGZvciBFVlBfQ0lQSEVSX0NUWCkuCiAgICAgVXNhZ2UgZXhhbXBsZToKCiAgICAgICAgIEVWUF9NRF9DVFggbWQ7CgogICAgICAgICBFVlBfTURfQ1RYX2luaXQoJm1kKTsgICAgICAgICAgICAgLyogbmV3IGZ1bmN0aW9uIGNhbGwgKi8KICAgICAgICAgRVZQX0RpZ2VzdEluaXQoJm1kLCBFVlBfc2hhMSgpKTsKICAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGluLCBsZW4pOwogICAgICAgICBFVlBfRGlnZXN0RmluYWwoJm1kLCBvdXQsIE5VTEwpOwogICAgICAgICBFVlBfTURfQ1RYX2NsZWFudXAoJm1kKTsgICAgICAgICAgLyogbmV3IGZ1bmN0aW9uIGNhbGwgKi8KCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1ha2UgREVTIGtleSBzY2hlZHVsZSBjb25mb3JtIHRvIHRoZSB1c3VhbCBzY2hlbWUsIGFzIHdlbGwgYXMKICAgICBjb3JyZWN0aW5nIGl0cyBzdHJ1Y3R1cmUuIFRoaXMgbWVhbnMgdGhhdCBjYWxscyB0byBERVMgZnVuY3Rpb25zCiAgICAgbm93IGhhdmUgdG8gcGFzcyBhIHBvaW50ZXIgdG8gYSBkZXNfa2V5X3NjaGVkdWxlIGluc3RlYWQgb2YgYQogICAgIHBsYWluIGRlc19rZXlfc2NoZWR1bGUgKHdoaWNoIHdhcyBhY3R1YWxseSBhbHdheXMgYSBwb2ludGVyCiAgICAgYW55d2F5KTogRS5nLiwKCiAgICAgICAgIGRlc19rZXlfc2NoZWR1bGUga3M7CgoJIGRlc19zZXRfa2V5X2NoZWNrZWQoLi4uLCAma3MpOwoJIGRlc19uY2JjX2VuY3J5cHQoLi4uLCAma3MsIC4uLik7CgogICAgIChOb3RlIHRoYXQgYSBsYXRlciBjaGFuZ2UgcmVuYW1lcyAnZGVzXy4uLicgaW50byAnREVTXy4uLicuKQogICAgIFtCZW4gTGF1cmllXQoKICAqKSBJbml0aWFsIHJlZHVjdGlvbiBvZiBsaW5rZXIgYmxvYXQ6IHRoZSB1c2Ugb2Ygc29tZSBmdW5jdGlvbnMsIHN1Y2ggYXMKICAgICBQRU0gY2F1c2VzIGxhcmdlIGFtb3VudHMgb2YgdW51c2VkIGZ1bmN0aW9ucyB0byBiZSBsaW5rZWQgaW4gZHVlIHRvCiAgICAgcG9vciBvcmdhbmlzYXRpb24uIEZvciBleGFtcGxlIHBlbV9hbGwuYyBjb250YWlucyBldmVyeSBQRU0gZnVuY3Rpb24KICAgICB3aGljaCBoYXMgYSBrbm9jayBvbiBlZmZlY3Qgb2YgbGlua2luZyBpbiBsYXJnZSBhbW91bnRzIG9mICh1bnVzZWQpCiAgICAgQVNOMSBjb2RlLiBHcm91cGluZyB0b2dldGhlciBzaW1pbGFyIGZ1bmN0aW9ucyBhbmQgc3BsaXR0aW5nIHVucmVsYXRlZAogICAgIGZ1bmN0aW9ucyBwcmV2ZW50cyB0aGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENsZWFudXAgb2YgRVZQIG1hY3Jvcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2hhbmdlIGhpc3RvcmljYWwgcmVmZXJlbmNlcyB0byB7TklELFNOLExOfV9kZXNfZWRlIGFuZCBlZGUzIHRvIGFkZCB0aGUKICAgICBjb3JyZWN0IF9lY2Igc3VmZml4LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgaW5pdGlhbCBPQ1NQIHJlc3BvbmRlciBzdXBwb3J0IHRvIG9jc3AgYXBwbGljYXRpb24uIFRoZQogICAgIHJldm9jYXRpb24gaW5mb3JtYXRpb24gaXMgaGFuZGxlZCB1c2luZyB0aGUgdGV4dCBiYXNlZCBpbmRleAogICAgIHVzZSBieSB0aGUgY2EgYXBwbGljYXRpb24uIFRoZSByZXNwb25kZXIgY2FuIGVpdGhlciBoYW5kbGUKICAgICByZXF1ZXN0cyBnZW5lcmF0ZWQgaW50ZXJuYWxseSwgc3VwcGxpZWQgaW4gZmlsZXMgKGZvciBleGFtcGxlCiAgICAgdmlhIGEgQ0dJIHNjcmlwdCkgb3IgdXNpbmcgYW4gaW50ZXJuYWwgbWluaW1hbCBzZXJ2ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvbmZpZ3VyYXRpb24gY2hvaWNlcyB0byBnZXQgemxpYiBjb21wcmVzc2lvbiBmb3IgVExTLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZXMgdG8gS2VyYmVyb3MgU1NMIGZvciBSRkMgMjcxMiBjb21wbGlhbmNlOgogICAgIDEuICBJbXBsZW1lbnRlZCByZWFsIEtlcmJlcm9zV3JhcHBlciwgaW5zdGVhZCBvZiBqdXN0IHVzaW5nCiAgICAgICAgIEtSQjUgQVBfUkVRIG1lc3NhZ2UuICBbVGhhbmtzIHRvIFNpbW9uIFdpbGtpbnNvbiA8c3h3QHN4dy5vcmcudWs+XQogICAgIDIuICBJbXBsZW1lbnRlZCBvcHRpb25hbCBhdXRoZW50aWNhdG9yIGZpZWxkIG9mIEtlcmJlcm9zV3JhcHBlci4KCiAgICAgQWRkZWQgb3BlbnNzbC1zdHlsZSBBU04uMSBtYWNyb3MgZm9yIEtlcmJlcm9zIHRpY2tldCwgYXBfcmVxLAogICAgIGFuZCBhdXRoZW50aWNhdG9yIHN0cnVjdHM7IHNlZSBjcnlwdG8va3JiNS8uCgogICAgIEdlbmVyYWxpemVkIEtlcmJlcm9zIGNhbGxzIHRvIHN1cHBvcnQgbXVsdGlwbGUgS2VyYmVyb3MgbGlicmFyaWVzLgogICAgIFtWZXJuIFN0YWF0cyA8c3RhYXRzdnJAYXNjLmhwYy5taWw+LAogICAgICBKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBjb2x1bWJpYS5lZHU+CiAgICAgIHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIENhdXNlICdvcGVuc3NsIHNwZWVkJyB0byB1c2UgZnVsbHkgaGFyZC1jb2RlZCBEU0Ega2V5cyBhcyBpdAogICAgIGFscmVhZHkgZG9lcyB3aXRoIFJTQS4gdGVzdGRzYS5oIG5vdyBoYXMgJ3ByaXZfa2V5L3B1Yl9rZXknCiAgICAgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBrZXkgc2l6ZXMgcmF0aGVyIHRoYW4gaGF2aW5nIGp1c3QKICAgICBwYXJhbWV0ZXJzIChhbmQgJ3NwZWVkJyBnZW5lcmF0aW5nIGtleXMgZWFjaCB0aW1lKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBTcGVlZCB1cCBFVlAgcm91dGluZXMuCiAgICAgQmVmb3JlOgplbmNyeXB0CnR5cGUgICAgICAgICAgICAgIDggYnl0ZXMgICAgIDY0IGJ5dGVzICAgIDI1NiBieXRlcyAgIDEwMjQgYnl0ZXMgICA4MTkyIGJ5dGVzCmRlcy1jYmMgICAgICAgICAgIDQ0MDguODVrICAgICA1NTYwLjUxayAgICAgNTc3OC40NmsgICAgIDU4NjIuMjBrICAgICA1ODI1LjE2awpkZXMtY2JjICAgICAgICAgICA0Mzg5LjU1ayAgICAgNTU3MS4xN2sgICAgIDU3OTIuMjNrICAgICA1ODQ2LjkxayAgICAgNTgzMi4xMWsKZGVzLWNiYyAgICAgICAgICAgNDM5NC4zMmsgICAgIDU1NzUuOTJrICAgICA1ODA3LjQ0ayAgICAgNTg0OC4zN2sgICAgIDU4NDEuMzBrCmRlY3J5cHQKZGVzLWNiYyAgICAgICAgICAgMzQ4Mi42NmsgICAgIDUwNjkuNDlrICAgICA1NDk2LjM5ayAgICAgNTYxNC4xNmsgICAgIDU2MzkuMjhrCmRlcy1jYmMgICAgICAgICAgIDM0ODAuNzRrICAgICA1MDY4Ljc2ayAgICAgNTUxMC4zNGsgICAgIDU2MDkuODdrICAgICA1NjM1LjUyawpkZXMtY2JjICAgICAgICAgICAzNDgzLjcyayAgICAgNTA2Ny42MmsgICAgIDU1MDQuNjBrICAgICA1NzA4LjAxayAgICAgNTcyNC44MGsKICAgICBBZnRlcjoKZW5jcnlwdApkZXMtY2JjICAgICAgICAgICA0NjYwLjE2ayAgICAgNTY1MC4xOWsgICAgIDU4MDcuMTlrICAgICA1ODI3LjEzayAgICAgNTc4My4zMmsKZGVjcnlwdApkZXMtY2JjICAgICAgICAgICAzNjI0Ljk2ayAgICAgNTI1OC4yMWsgICAgIDU1MzAuOTFrICAgICA1NjI0LjMwayAgICAgNTYyOC4yNmsKICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkZWQgdGhlIE9TMi1FTVggdGFyZ2V0LgogICAgIFsiQnJpYW4gSGF2YXJkIiA8YnJpYW5oQGtoZWxkYXIuYXBhbmEub3JnLmF1PiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZXdyaXRlIGFwcHMgdG8gdXNlIE5DT05GIHJvdXRpbmVzIGluc3RlYWQgb2YgdGhlIG9sZCBDT05GLiBOZXcgZnVuY3Rpb25zCiAgICAgdG8gc3VwcG9ydCBOQ09ORiByb3V0aW5lcyBpbiBleHRlbnNpb24gY29kZS4gTmV3IGZ1bmN0aW9uIENPTkZfc2V0X25jb25mKCkKICAgICB0byBhbGxvdyBmdW5jdGlvbnMgd2hpY2ggdGFrZSBhbiBOQ09ORiB0byBhbHNvIGhhbmRsZSB0aGUgb2xkIExIQVNICiAgICAgc3RydWN0dXJlOiB0aGlzIG1lYW5zIHRoYXQgdGhlIG9sZCBDT05GIGNvbXBhdGlibGUgcm91dGluZXMgY2FuIGJlCiAgICAgcmV0YWluZWQgKGluIHBhcnRpY3VsYXIgd3J0IGV4dGVuc2lvbnMpIHdpdGhvdXQgaGF2aW5nIHRvIGR1cGxpY2F0ZSB0aGUKICAgICBjb2RlLiBOZXcgZnVuY3Rpb24gWDUwOVYzX2FkZF9leHRfbmNvbmZfc2sgdG8gYWRkIGV4dGVuc2lvbnMgdG8gYSBzdGFjay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIHRoZSBnZW5lcmFsIHVzZXIgaW50ZXJmYWNlIHdpdGggbWVjaGFuaXNtcyBmb3IgaW5uZXIgY29udHJvbAogICAgIGFuZCB3aXRoIHBvc3NpYmlsaXRpZXMgdG8gaGF2ZSB5ZXMvbm8ga2luZCBvZiBwcm9tcHRzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSBhbGwgY2FsbHMgdG8gbG93IGxldmVsIGRpZ2VzdCByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSBhbmQKICAgICBhcHBsaWNhdGlvbnMgdG8gdXNlIEVWUC4gQWRkIG1pc3NpbmcgY2FsbHMgdG8gSE1BQ19jbGVhbnVwKCkgYW5kCiAgICAgZG9uJ3QgYXNzdW1lIEhNQUNfQ1RYIGNhbiBiZSBjb3BpZWQgdXNpbmcgbWVtY3B5KCkuCiAgICAgW1ZlcmRvbiBXYWxrZXIgPFZXYWxrZXJAbm92ZWxsLmNvbT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBjb250cm9sIGVuZ2luZXMgdGhyb3VnaCBjb250cm9sIG5hbWVzIGJ1dCB3aXRoCiAgICAgYXJiaXRyYXJ5IGFyZ3VtZW50cyBpbnN0ZWFkIG9mIGp1c3QgYSBzdHJpbmcuCiAgICAgQ2hhbmdlIHRoZSBrZXkgbG9hZGVycyB0byB0YWtlIGEgVUlfTUVUSE9EIGluc3RlYWQgb2YgYSBjYWxsYmFjawogICAgIGZ1bmN0aW9uIHBvaW50ZXIuICBOT1RFOiB0aGlzIGJyZWFrcyBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIKICAgICB2ZXJzaW9ucyBvZiBPcGVuU1NMIFtlbmdpbmVdLgogICAgIEFkYXB0IHRoZSBuQ2lwaGVyIGNvZGUgZm9yIHRoZXNlIG5ldyBjb25kaXRpb25zIGFuZCBhZGQgYSBjYXJkIGluc2VydGlvbgogICAgIGNhbGxiYWNrLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEVuaGFuY2UgdGhlIGdlbmVyYWwgdXNlciBpbnRlcmZhY2Ugd2l0aCBtZWNoYW5pc21zIHRvIGJldHRlciBzdXBwb3J0CiAgICAgZGlhbG9nIGJveCBpbnRlcmZhY2VzLCBhcHBsaWNhdGlvbi1kZWZpbmVkIHByb21wdHMsIHRoZSBwb3NzaWJpbGl0eQogICAgIHRvIHVzZSBkZWZhdWx0cyAoZm9yIGV4YW1wbGUgZGVmYXVsdCBwYXNzd29yZHMgZnJvbSBzb21ld2hlcmUgZWxzZSkKICAgICBhbmQgaW50ZXJydXB0cy9jYW5jZWxsYXRpb25zLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFRpZHkgdXAgUEtDUyMxMiBhdHRyaWJ1dGUgaGFuZGxpbmcuIEFkZCBzdXBwb3J0IGZvciB0aGUgQ1NQIG5hbWUKICAgICBhdHRyaWJ1dGUgaW4gUEtDUyMxMiBmaWxlcywgYWRkIG5ldyAtQ1NQIG9wdGlvbiB0byBwa2NzMTIgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYSBtZW1vcnkgbGVhayBpbiAnc2tfZHVwKCknIGluIHRoZSBjYXNlIHJlYWxsb2NhdGlvbiBmYWlscy4gKEFsc28KICAgICB0aWR5IHVwIHNvbWUgdW5uZWNlc3NhcmlseSB3ZWlyZCBjb2RlIGluICdza19uZXcoKScpLgogICAgIFtHZW9mZiwgcmVwb3J0ZWQgYnkgRGllZ28gVGFydGFyYSA8ZHRhcnRhcmFAbm92YW1lbnMuY29tPl0KCiAgKikgQ2hhbmdlIHRoZSBrZXkgbG9hZGluZyByb3V0aW5lcyBmb3IgRU5HSU5FcyB0byB1c2UgdGhlIHNhbWUga2luZAogICAgIGNhbGxiYWNrIChwZW1fcGFzc3dvcmRfY2IpIGFzIGFsbCBvdGhlciByb3V0aW5lcyB0aGF0IG5lZWQgdGhpcwogICAgIGtpbmQgb2YgY2FsbGJhY2suCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW5jcmVhc2UgRU5UUk9QWV9ORUVERUQgdG8gMzIgYnl0ZXMsIGFzIFJpam5kYWVsIGNhbiBvcGVyYXRlIHdpdGgKICAgICAyNTYgYml0ICg9MzIgYnl0ZSkga2V5cy4gT2YgY291cnNlIHNlZWRpbmcgd2l0aCBtb3JlIGVudHJvcHkgYnl0ZXMKICAgICB0aGFuIHRoaXMgbWluaW11bSB2YWx1ZSBpcyByZWNvbW1lbmRlZC4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgTmV3IHJhbmRvbSBzZWVkZXIgZm9yIE9wZW5WTVMsIHVzaW5nIHRoZSBzeXN0ZW0gcHJvY2VzcyBzdGF0aXN0aWNzCiAgICAgdGhhdCBhcmUgZWFzaWx5IHJlYWNoYWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBXaW5kb3dzIGFwcGFyZW50bHkgY2FuJ3QgdHJhbnNwYXJlbnRseSBoYW5kbGUgZ2xvYmFsCiAgICAgdmFyaWFibGVzIGRlZmluZWQgaW4gRExMcy4gSW5pdGlhbGlzYXRpb25zIHN1Y2ggYXM6CgogICAgICAgIGNvbnN0IEFTTjFfSVRFTSAqaXQgPSAmQVNOMV9JTlRFR0VSX2l0OwoKICAgICB3b250IGNvbXBpbGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgYW55IGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8KICAgICBkZWNsYXJlIHRoZWlyIG93biBBU04xIG1vZHVsZXMuIFRoaXMgd2FzIGZpeGVkIGJ5IGFkZGluZyB0aGUgb3B0aW9uCiAgICAgRVhQT1JUX1ZBUl9BU19GTiB0byBhbGwgV2luMzIgcGxhdGZvcm1zLCBhbHRob3VnaCB0aGlzIGlzbid0IHN0cmljdGx5CiAgICAgbmVlZGVkIGZvciBzdGF0aWMgbGlicmFyaWVzIHVuZGVyIFdpbjMyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgWDUwOV9QVVJQT1NFX3NldCgpIGFuZCBYNTA5X1RSVVNUX3NldCgpIHRvIGhhbmRsZQogICAgIHNldHRpbmcgb2YgcHVycG9zZSBhbmQgdHJ1c3QgZmllbGRzLiBOZXcgWDUwOV9TVE9SRSB0cnVzdCBhbmQKICAgICBwdXJwb3NlIGZ1bmN0aW9ucyBhbmQgdGlkeSB1cCBzZXR0aW5nIGluIG90aGVyIFNTTCBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvcGllcyBvZiBYNTA5X1NUT1JFX0NUWCBmaWVsZHMgYW5kIGNhbGxiYWNrcyB0byBYNTA5X1NUT1JFCiAgICAgc3RydWN0dXJlLiBUaGVzZSBhcmUgaW5oZXJpdGVkIGJ5IFg1MDlfU1RPUkVfQ1RYIHdoZW4gaXQgaXMgCiAgICAgaW5pdGlhbGlzZWQuIFRoaXMgYWxsb3dzIHZhcmlvdXMgZGVmYXVsdHMgdG8gYmUgc2V0IGluIHRoZQogICAgIFg1MDlfU1RPUkUgc3RydWN0dXJlIChzdWNoIGFzIGZsYWdzIGZvciBDUkwgY2hlY2tpbmcgYW5kIGN1c3RvbQogICAgIHB1cnBvc2Ugb3IgdHJ1c3Qgc2V0dGluZ3MpIGZvciBmdW5jdGlvbnMgd2hpY2ggb25seSB1c2UgWDUwOV9TVE9SRV9DVFgKICAgICBpbnRlcm5hbGx5IHN1Y2ggYXMgUy9NSU1FLgoKICAgICBNb2RpZnkgWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0KCkgc28gaXQgb25seSBzZXRzIHB1cnBvc2VzIGFuZAogICAgIHRydXN0IHNldHRpbmdzIGlmIHRoZXkgYXJlIG5vdCBzZXQgaW4gWDUwOV9TVE9SRS4gVGhpcyBhbGxvd3MgWDUwOV9TVE9SRQogICAgIHB1cnBvc2VzIGFuZCB0cnVzdCAoaW4gUy9NSU1FIGZvciBleGFtcGxlKSB0byBvdmVycmlkZSBhbnkgc2V0IGJ5IGRlZmF1bHQuCgogICAgIEFkZCBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgQ1JMIGNoZWNraW5nIHRvIHNtaW1lLCBzX2NsaWVudCBhbmQgc19zZXJ2ZXIKICAgICBhcHBsaWNhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBDUkwgYmFzZWQgcmV2b2NhdGlvbiBjaGVja2luZy4gSWYgdGhlIENSTCBjaGVja2luZyBmbGFnKHMpCiAgICAgYXJlIHNldCB0aGVuIHRoZSBDUkwgaXMgbG9va2VkIHVwIGluIHRoZSBYNTA5X1NUT1JFIHN0cnVjdHVyZSBhbmQKICAgICBpdHMgdmFsaWRpdHkgYW5kIHNpZ25hdHVyZSBjaGVja2VkLCB0aGVuIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBmb3VuZAogICAgIGluIHRoZSBDUkwgdGhlIHZlcmlmeSBmYWlscyB3aXRoIGEgcmV2b2tlZCBlcnJvci4KCiAgICAgVmFyaW91cyBuZXcgQ1JMIHJlbGF0ZWQgY2FsbGJhY2tzIGFkZGVkIHRvIFg1MDlfU1RPUkVfQ1RYIHN0cnVjdHVyZS4KCiAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgYWRkZWQgdG8gJ3ZlcmlmeScgYXBwbGljYXRpb24gdG8gc3VwcG9ydCB0aGlzLgoKICAgICBUaGlzIG5lZWRzIHNvbWUgYWRkaXRpb25hbCB3b3JrLCBzdWNoIGFzIGJlaW5nIGFibGUgdG8gaGFuZGxlIG11bHRpcGxlCiAgICAgQ1JMcyB3aXRoIGRpZmZlcmVudCB0aW1lcywgZXh0ZW5zaW9uIGJhc2VkIGxvb2t1cCAocmF0aGVyIHRoYW4ganVzdAogICAgIGJ5IHN1YmplY3QgbmFtZSkgYW5kIHVsdGltYXRlbHkgbW9yZSBjb21wbGV0ZSBWMiBDUkwgZXh0ZW5zaW9uCiAgICAgaGFuZGxpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZ2VuZXJhbCB1c2VyIGludGVyZmFjZSBBUEkgKGNyeXB0by91aS8pLiAgVGhpcyBpcyBkZXNpZ25lZAogICAgIHRvIHJlcGxhY2UgdGhpbmdzIGxpa2UgZGVzX3JlYWRfcGFzc3dvcmQgYW5kIGZyaWVuZHMgKGJhY2t3YXJkCiAgICAgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMgdXNpbmcgdGhpcyBuZXcgQVBJIGFyZSBwcm92aWRlZCkuCiAgICAgVGhlIHB1cnBvc2UgaXMgdG8gcmVtb3ZlIHByb21wdGluZyBmdW5jdGlvbnMgZnJvbSB0aGUgREVTIGNvZGUKICAgICBzZWN0aW9uIGFzIHdlbGwgYXMgcHJvdmlkZSBmb3IgcHJvbXB0aW5nIHRocm91Z2ggZGlhbG9nIGJveGVzIGluCiAgICAgYSB3aW5kb3cgc3lzdGVtIGFuZCB0aGUgbGlrZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgImV4X2RhdGEiIHN1cHBvcnQgdG8gRU5HSU5FIHNvIGltcGxlbWVudGF0aW9ucyBjYW4gYWRkIHN0YXRlIGF0IGEKICAgICBwZXItc3RydWN0dXJlIGxldmVsIHJhdGhlciB0aGFuIGhhdmluZyB0byBzdG9yZSBpdCBnbG9iYWxseS4KICAgICBbR2VvZmZdCgogICopIE1ha2UgaXQgcG9zc2libGUgZm9yIEVOR0lORSBzdHJ1Y3R1cmVzIHRvIGJlIGNvcGllZCB3aGVuIHJldHJpZXZlZCBieQogICAgIEVOR0lORV9ieV9pZCgpIGlmIHRoZSBFTkdJTkUgc3BlY2lmaWVzIGEgbmV3IGZsYWc6IEVOR0lORV9GTEFHU19CWV9JRF9DT1BZLgogICAgIFRoaXMgY2F1c2VzIHRoZSAib3JpZ2luYWwiIEVOR0lORSBzdHJ1Y3R1cmUgdG8gYWN0IGxpa2UgYSB0ZW1wbGF0ZSwKICAgICBhbmFsb2dvdXMgdG8gdGhlIFJTQSB2cy4gUlNBX01FVEhPRCB0eXBlIG9mIHNlcGFyYXRpb24uIEJlY2F1c2Ugb2YgdGhpcwogICAgIG9wZXJhdGlvbmFsIHN0YXRlIGNhbiBiZSBsb2NhbGlzZWQgdG8gZWFjaCBFTkdJTkUgc3RydWN0dXJlLCBkZXNwaXRlIHRoZQogICAgIGZhY3QgdGhleSBhbGwgc2hhcmUgdGhlIHNhbWUgIm1ldGhvZHMiLiBOZXcgRU5HSU5FIHN0cnVjdHVyZXMgcmV0dXJuZWQgaW4KICAgICB0aGlzIGNhc2UgaGF2ZSBubyBmdW5jdGlvbmFsIHJlZmVyZW5jZXMgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNpbmdsZQogICAgIHN0cnVjdHVyYWwgcmVmZXJlbmNlLiBUaGlzIG1hdGNoZXMgdGhlIHNpbmdsZSBzdHJ1Y3R1cmFsIHJlZmVyZW5jZSByZXR1cm5lZAogICAgIGJ5IEVOR0lORV9ieV9pZCgpIG5vcm1hbGx5LCB3aGVuIGl0IGlzIGluY3JlbWVudGVkIG9uIHRoZSBwcmUtZXhpc3RpbmcKICAgICBFTkdJTkUgc3RydWN0dXJlLgogICAgIFtHZW9mZl0KCiAgKikgRml4IEFTTjEgZGVjb2RlciB3aGVuIGRlY29kaW5nIHR5cGUgQU5ZIGFuZCBWX0FTTjFfT1RIRVI6IHNpbmNlIHRoaXMKICAgICBuZWVkcyB0byBtYXRjaCBhbnkgb3RoZXIgdHlwZSBhdCBhbGwgd2UgbmVlZCB0byBtYW51YWxseSBjbGVhciB0aGUKICAgICB0YWcgY2FjaGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlcyB0byB0aGUgIm9wZW5zc2wgZW5naW5lIiB1dGlsaXR5IHRvIGluY2x1ZGU7CiAgICAgLSB2ZXJib3NpdHkgbGV2ZWxzICgnLXYnLCAnLXZ2JywgYW5kICctdnZ2JykgdGhhdCBwcm92aWRlIGluZm9ybWF0aW9uCiAgICAgICBhYm91dCBhbiBFTkdJTkUncyBhdmFpbGFibGUgY29udHJvbCBjb21tYW5kcy4KICAgICAtIGV4ZWN1dGluZyBjb250cm9sIGNvbW1hbmRzIGZyb20gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB1c2luZyB0aGUKICAgICAgICctcHJlJyBhbmQgJy1wb3N0JyBzd2l0Y2hlcy4gJy1wb3N0JyBpcyBvbmx5IHVzZWQgaWYgJy10JyBpcwogICAgICAgc3BlY2lmaWVkIGFuZCB0aGUgRU5HSU5FIGlzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXNlZC4gVGhlIHN5bnRheCBmb3IKICAgICAgIHRoZSBpbmRpdmlkdWFsIGNvbW1hbmRzIGFyZSBjb2xvbi1zZXBhcmF0ZWQsIGZvciBleGFtcGxlOwoJIG9wZW5zc2wgZW5naW5lIGNoaWwgLXByZSBGT1JLX0NIRUNLOjAgLXByZSBTT19QQVRIOi9saWIvdGVzdC5zbwogICAgIFtHZW9mZl0KCiAgKikgTmV3IGR5bmFtaWMgY29udHJvbCBjb21tYW5kIHN1cHBvcnQgZm9yIEVOR0lORXMuIEVOR0lORXMgY2FuIG5vdwogICAgIGRlY2xhcmUgdGhlaXIgb3duIGNvbW1hbmRzIChudW1iZXJzKSwgbmFtZXMgKHN0cmluZ3MpLCBkZXNjcmlwdGlvbnMsCiAgICAgYW5kIGlucHV0IHR5cGVzIGZvciBydW4tdGltZSBkaXNjb3ZlcnkgYnkgY2FsbGluZyBhcHBsaWNhdGlvbnMuIEEKICAgICBzdWJzZXQgb2YgdGhlc2UgY29tbWFuZHMgYXJlIGltcGxpY2l0bHkgY2xhc3NlZCBhcyAiZXhlY3V0YWJsZSIKICAgICBkZXBlbmRpbmcgb24gdGhlaXIgaW5wdXQgdHlwZSwgYW5kIG9ubHkgdGhlc2UgY2FuIGJlIGludm9rZWQgdGhyb3VnaAogICAgIHRoZSBuZXcgc3RyaW5nLWJhc2VkIEFQSSBmdW5jdGlvbiBFTkdJTkVfY3RybF9jbWRfc3RyaW5nKCkuIChFZy4gdGhpcwogICAgIGNhbiBiZSBiYXNlZCBvbiB1c2VyIGlucHV0LCBjb25maWcgZmlsZXMsIGV0YykuIFRoZSBkaXN0aW5jdGlvbiBpcwogICAgIHRoYXQgImV4ZWN1dGFibGUiIGNvbW1hbmRzIGNhbm5vdCByZXR1cm4gYW55dGhpbmcgb3RoZXIgdGhhbiBhIGJvb2xlYW4KICAgICByZXN1bHQgYW5kIGNhbiBvbmx5IHN1cHBvcnQgbnVtZXJpYyBvciBzdHJpbmcgaW5wdXQsIHdoZXJlYXMgc29tZQogICAgIGRpc2NvdmVyYWJsZSBjb21tYW5kcyBtYXkgb25seSBiZSBmb3IgZGlyZWN0IHVzZSB0aHJvdWdoCiAgICAgRU5HSU5FX2N0cmwoKSwgZWcuIHN1cHBvcnRpbmcgdGhlIGV4Y2hhbmdlIG9mIGJpbmFyeSBkYXRhLCBmdW5jdGlvbgogICAgIHBvaW50ZXJzLCBvciBvdGhlciBjdXN0b20gdXNlcy4gVGhlICJleGVjdXRhYmxlIiBjb21tYW5kcyBhcmUgdG8KICAgICBzdXBwb3J0IHBhcmFtZXRlcmlzYXRpb25zIG9mIEVOR0lORSBiZWhhdmlvdXIgdGhhdCBjYW4gYmUKICAgICB1bmFtYmlndW91c2x5IGRlZmluZWQgYnkgRU5HSU5FcyBhbmQgdXNlZCBjb25zaXN0ZW50bHkgYWNyb3NzIGFueQogICAgIE9wZW5TU0wtYmFzZWQgYXBwbGljYXRpb24uIENvbW1hbmRzIGhhdmUgYmVlbiBhZGRlZCB0byBhbGwgdGhlCiAgICAgZXhpc3RpbmcgaGFyZHdhcmUtc3VwcG9ydGluZyBFTkdJTkVzLCBub3RpY2VhYmx5ICJTT19QQVRIIiB0byBhbGxvdwogICAgIGNvbnRyb2wgb3ZlciBzaGFyZWQtbGlicmFyeSBwYXRocyB3aXRob3V0IHNvdXJjZSBjb2RlIGFsdGVyYXRpb25zLgogICAgIFtHZW9mZl0KCiAgKikgQ2hhbmdlZCBhbGwgRU5HSU5FIGltcGxlbWVudGF0aW9ucyB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0aGVpcgogICAgIEVOR0lORXMgcmF0aGVyIHRoYW4gZGVjbGFyaW5nIHRoZW0gc3RhdGljYWxseS4gQXBhcnQgZnJvbSB0aGlzIGJlaW5nCiAgICAgbmVjZXNzYXJ5IHdpdGggdGhlIHJlbW92YWwgb2YgdGhlIEVOR0lORV9GTEFHU19NQUxMT0NFRCBkaXN0aW5jdGlvbiwKICAgICB0aGlzIGFsc28gYWxsb3dzIHRoZSBpbXBsZW1lbnRhdGlvbnMgdG8gY29tcGlsZSB3aXRob3V0IHVzaW5nIHRoZQogICAgIGludGVybmFsIGVuZ2luZV9pbnQuaCBoZWFkZXIuCiAgICAgW0dlb2ZmXQoKICAqKSBNaW5vciBhZGp1c3RtZW50IHRvICJyYW5kIiBjb2RlLiBSQU5EX2dldF9yYW5kX21ldGhvZCgpIG5vdyByZXR1cm5zIGEKICAgICAnY29uc3QnIHZhbHVlLiBBbnkgY29kZSB0aGF0IHNob3VsZCBiZSBhYmxlIHRvIG1vZGlmeSBhIFJBTkRfTUVUSE9ECiAgICAgc2hvdWxkIGFscmVhZHkgaGF2ZSBub24tY29uc3QgcG9pbnRlcnMgdG8gaXQgKGllLiB0aGV5IHNob3VsZCBvbmx5CiAgICAgbW9kaWZ5IHRoZWlyIG93biBvbmVzKS4KICAgICBbR2VvZmZdCgogICopIE1hZGUgYSB2YXJpZXR5IG9mIGxpdHRsZSB0d2Vha3MgdG8gdGhlIEVOR0lORSBjb2RlLgogICAgIC0gImF0YWxsYSIgYW5kICJ1YnNlYyIgc3RyaW5nIGRlZmluaXRpb25zIHdlcmUgbW92ZWQgZnJvbSBoZWFkZXIgZmlsZXMKICAgICAgIHRvIEMgY29kZS4gIm51cm9uIiBzdHJpbmcgZGVmaW5pdGlvbnMgd2VyZSBwbGFjZWQgaW4gdmFyaWFibGVzCiAgICAgICByYXRoZXIgdGhhbiBoYXJkLWNvZGVkIC0gYWxsb3dpbmcgcGFyYW1ldGVyaXNhdGlvbiBvZiB0aGVzZSB2YWx1ZXMKICAgICAgIGxhdGVyIG9uIHZpYSBjdHJsKCkgY29tbWFuZHMuCiAgICAgLSBSZW1vdmVkIHVudXNlZCAiI2lmIDAiJ2QgY29kZS4KICAgICAtIEZpeGVkIGVuZ2luZSBsaXN0IGl0ZXJhdGlvbiBjb2RlIHNvIGl0IHVzZXMgRU5HSU5FX2ZyZWUoKSB0byByZWxlYXNlCiAgICAgICBzdHJ1Y3R1cmFsIHJlZmVyZW5jZXMuCiAgICAgLSBDb25zdGlmaWVkIHRoZSBSQU5EX01FVEhPRCBlbGVtZW50IG9mIEVOR0lORSBzdHJ1Y3R1cmVzLgogICAgIC0gQ29uc3RpZmllZCB2YXJpb3VzIGdldC9zZXQgZnVuY3Rpb25zIGFzIGFwcHJvcHJpYXRlIGFuZCBhZGRlZAogICAgICAgbWlzc2luZyBmdW5jdGlvbnMgKGluY2x1ZGluZyBhIGNhdGNoLWFsbCBFTkdJTkVfY3B5IHRoYXQgZHVwbGljYXRlcwogICAgICAgYWxsIEVOR0lORSB2YWx1ZXMgb250byBhIG5ldyBFTkdJTkUgZXhjZXB0IHJlZmVyZW5jZSBjb3VudHMvc3RhdGUpLgogICAgIC0gUmVtb3ZlZCBOVUxMIHBhcmFtZXRlciBjaGVja3MgaW4gZ2V0L3NldCBmdW5jdGlvbnMuIFNldHRpbmcgYSBtZXRob2QKICAgICAgIG9yIGZ1bmN0aW9uIHRvIE5VTEwgaXMgYSB3YXkgb2YgY2FuY2VsbGluZyBvdXQgYSBwcmV2aW91c2x5IHNldAogICAgICAgdmFsdWUuICBQYXNzaW5nIGEgTlVMTCBFTkdJTkUgcGFyYW1ldGVyIGlzIGp1c3QgcGxhaW4gc3R1cGlkIGFueXdheQogICAgICAgYW5kIGRvZXNuJ3QganVzdGlmeSB0aGUgZXh0cmEgZXJyb3Igc3ltYm9scyBhbmQgY29kZS4KICAgICAtIERlcHJlY2F0ZSB0aGUgRU5HSU5FX0ZMQUdTX01BTExPQ0VEIGRlZmluZSBhbmQgbW92ZSB0aGUgYXJlYSBmb3IKICAgICAgIGZsYWdzIGZyb20gZW5naW5lX2ludC5oIHRvIGVuZ2luZS5oLgogICAgIC0gQ2hhbmdlZCBwcm90b3R5cGVzIGZvciBFTkdJTkUgaGFuZGxlciBmdW5jdGlvbnMgKGluaXQoKSwgZmluaXNoKCksCiAgICAgICBjdHJsKCksIGtleS1sb2FkIGZ1bmN0aW9ucywgZXRjKSB0byB0YWtlIGFuIChFTkdJTkUqKSBwYXJhbWV0ZXIuCiAgICAgW0dlb2ZmXQoKICAqKSBJbXBsZW1lbnQgYmluYXJ5IGludmVyc2lvbiBhbGdvcml0aG0gZm9yIEJOX21vZF9pbnZlcnNlIGluIGFkZGl0aW9uCiAgICAgdG8gdGhlIGFsZ29yaXRobSB1c2luZyBsb25nIGRpdmlzaW9uLiAgVGhlIGJpbmFyeSBhbGdvcml0aG0gY2FuIGJlCiAgICAgdXNlZCBvbmx5IGlmIHRoZSBtb2R1bHVzIGlzIG9kZC4gIE9uIDMyLWJpdCBzeXN0ZW1zLCBpdCBpcyBmYXN0ZXIKICAgICBvbmx5IGZvciByZWxhdGl2ZWx5IHNtYWxsIG1vZHVsaSAocm91Z2hseSAyMC0zMCUgZm9yIDEyOC1iaXQgbW9kdWxpLAogICAgIHJvdWdobHkgNS0xNSUgZm9yIDI1Ni1iaXQgbW9kdWxpKSwgc28gd2UgdXNlIGl0IG9ubHkgZm9yIG1vZHVsaQogICAgIHVwIHRvIDQ1MCBiaXRzLiAgSW4gNjQtYml0IGVudmlyb25tZW50cywgdGhlIGJpbmFyeSBhbGdvcml0aG0KICAgICBhcHBlYXJzIHRvIGJlIGFkdmFudGFnZW91cyBmb3IgbXVjaCBsb25nZXIgbW9kdWxpOyBoZXJlIHdlIHVzZSBpdAogICAgIGZvciBtb2R1bGkgdXAgdG8gMjA0OCBiaXRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJld3JpdGUgQ0hPSUNFIGZpZWxkIHNldHRpbmcgaW4gQVNOMV9pdGVtX2V4X2QyaSgpLiBUaGUgb2xkIGNvZGUKICAgICBjb3VsZCBub3Qgc3VwcG9ydCB0aGUgY29tYmluZSBmbGFnIGluIGNob2ljZSBmaWVsZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgJ2NvcHlfZXh0ZW5zaW9ucycgb3B0aW9uIHRvIHRoZSAnY2EnIHV0aWxpdHkuIFRoaXMgY29waWVzCiAgICAgZXh0ZW5zaW9ucyBmcm9tIGEgY2VydGlmaWNhdGUgcmVxdWVzdCB0byB0aGUgY2VydGlmaWNhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgbXVsdGlwbGUgJ2NlcnRvcHQnIGFuZCAnbmFtZW9wdCcgb3B0aW9ucyB0byBiZSBzZXBhcmF0ZWQKICAgICBieSBjb21tYXMuIEFkZCAnbmFtb3B0JyBhbmQgJ2NlcnRvcHQnIG9wdGlvbnMgdG8gdGhlICdjYScgY29uZmlnCiAgICAgZmlsZTogdGhpcyBhbGxvd3MgdGhlIGRpc3BsYXkgb2YgdGhlIGNlcnRpZmljYXRlIGFib3V0IHRvIGJlCiAgICAgc2lnbmVkIHRvIGJlIGN1c3RvbWlzZWQsIHRvIGFsbG93IGNlcnRhaW4gZmllbGRzIHRvIGJlIGluY2x1ZGVkCiAgICAgb3IgZXhjbHVkZWQgYW5kIGV4dGVuc2lvbiBkZXRhaWxzLiBUaGUgb2xkIHN5c3RlbSBkaWRuJ3QgZGlzcGxheQogICAgIG11bHRpY2hhcmFjdGVyIHN0cmluZ3MgcHJvcGVybHksIG9taXR0ZWQgZmllbGRzIG5vdCBpbiB0aGUgcG9saWN5CiAgICAgYW5kIGNvdWxkbid0IGRpc3BsYXkgYWRkaXRpb25hbCBkZXRhaWxzIHN1Y2ggYXMgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdW5jdGlvbiBFQ19QT0lOVHNfbXVsIGZvciBtdWx0aXBsZSBzY2FsYXIgbXVsdGlwbGljYXRpb24KICAgICBvZiBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGVsbGlwdGljIGN1cnZlIHBvaW50cwogICAgICAgICAgXHN1bSBzY2FsYXJzW2ldKnBvaW50c1tpXSwKICAgICBvcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgZ2VuZXJhdG9yIGRlZmluZWQgZm9yIHRoZSBFQ19HUk9VUDoKICAgICAgICAgIHNjYWxhcipnZW5lcmF0b3IgKyAgXHN1bSBzY2FsYXJzW2ldKnBvaW50c1tpXS4KCiAgICAgRUNfUE9JTlRfbXVsIGlzIGEgc2ltcGxlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHRoZSB0eXBpY2FsIGNhc2UKICAgICB0aGF0IHRoZSBwb2ludCBsaXN0IGhhcyBqdXN0IG9uZSBpdGVtIChiZXNpZGVzIHRoZSBvcHRpb25hbAogICAgIGdlbmVyYXRvcikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRmlyc3QgRUNfTUVUSE9EcyBmb3IgY3VydmVzIG92ZXIgR0YocCk6CgogICAgIEVDX0dGcF9zaW1wbGVfbWV0aG9kKCkgdXNlcyB0aGUgYmFzaWMgQk5fbW9kX211bCBhbmQgQk5fbW9kX3NxcgogICAgIG9wZXJhdGlvbnMgYW5kIHByb3ZpZGVzIHZhcmlvdXMgbWV0aG9kIGZ1bmN0aW9ucyB0aGF0IGNhbiBhbHNvCiAgICAgb3BlcmF0ZSB3aXRoIGZhc3RlciBpbXBsZW1lbnRhdGlvbnMgb2YgbW9kdWxhciBhcml0aG1ldGljLiAgICAgCgogICAgIEVDX0dGcF9tb250X21ldGhvZCgpIHJldXNlcyBtb3N0IGZ1bmN0aW9ucyB0aGF0IGFyZSBwYXJ0IG9mCiAgICAgRUNfR0ZwX3NpbXBsZV9tZXRob2QsIGJ1dCB1c2VzIE1vbnRnb21lcnkgYXJpdGhtZXRpYy4KCiAgICAgW0JvZG8gTW9lbGxlcjsgcG9pbnQgYWRkaXRpb24gYW5kIHBvaW50IGRvdWJsaW5nCiAgICAgaW1wbGVtZW50YXRpb24gZGlyZWN0bHkgZGVyaXZlZCBmcm9tIHNvdXJjZSBjb2RlIHByb3ZpZGVkIGJ5CiAgICAgTGVua2EgRmliaWtvdmEgPGZpYmlrb3ZhQGV4cC1tYXRoLnVuaS1lc3Nlbi5kZT5dCgogICopIEZyYW1ld29yayBmb3IgZWxsaXB0aWMgY3VydmVzIChjcnlwdG8vZWMvZWMuaCwgY3J5cHRvL2VjL2VjX2xjbC5oLAogICAgIGNyeXB0by9lYy9lY19saWIuYyk6CgogICAgIEN1cnZlcyBhcmUgRUNfR1JPVVAgb2JqZWN0cyAod2l0aCBhbiBvcHRpb25hbCBncm91cCBnZW5lcmF0b3IpCiAgICAgYmFzZWQgb24gRUNfTUVUSE9EcyB0aGF0IGFyZSBidWlsdCBpbnRvIHRoZSBsaWJyYXJ5LgoKICAgICBQb2ludHMgYXJlIEVDX1BPSU5UIG9iamVjdHMgYmFzZWQgb24gRUNfR1JPVVAgb2JqZWN0cy4KCiAgICAgTW9zdCBvZiB0aGUgZnJhbWV3b3JrIHdvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGN1cnZlcyBvdmVyIGFyYml0cmFyeQogICAgIGZpbml0ZSBmaWVsZHMsIGJ1dCBhcyB0aGVyZSBhcmUgbm8gb2J2aW91cyB0eXBlcyBmb3IgZmllbGRzIG90aGVyCiAgICAgdGhhbiBHRihwKSwgc29tZSBmdW5jdGlvbnMgYXJlIGxpbWl0ZWQgdG8gdGhhdCBmb3Igbm93LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCB0aGUgLUhUVFAgb3B0aW9uIHRvIHNfc2VydmVyLiAgSXQgaXMgc2ltaWxhciB0byAtV1dXLCBidXQgcmVxdWlyZXMKICAgICB0aGF0IHRoZSBmaWxlIGNvbnRhaW5zIGEgY29tcGxldGUgSFRUUCByZXNwb25zZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGVjIGRpcmVjdG9yeSB0byBta2RlZi5wbCBhbmQgbWtmaWxlcy5wbC4gSW4gbWtkZWYucGwKICAgICBjaGFuZ2UgdGhlIGRlZiBhbmQgbnVtIGZpbGUgcHJpbnRmIGZvcm1hdCBzcGVjaWZpZXIgZnJvbSAiJS00MHNYWFgiCiAgICAgdG8gIiUtMzlzIFhYWCIuIFRoZSBsYXR0ZXIgd2lsbCBhbHdheXMgZ3VhcmFudGVlIGEgc3BhY2UgYWZ0ZXIgdGhlCiAgICAgZmllbGQgd2hpbGUgdGhlIGZvcm1lciB3aWxsIGNhdXNlIHRoZW0gdG8gcnVuIHRvZ2V0aGVyIGlmIHRoZSBmaWVsZAogICAgIGlzIDQwIG9mIG1vcmUgY2hhcmFjdGVycyBsb25nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnN0aWZ5IHRoZSBjaXBoZXIgYW5kIGRpZ2VzdCAnbWV0aG9kJyBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMKICAgICBhbmQgbW9kaWZ5IHJlbGF0ZWQgZnVuY3Rpb25zIHRvIHRha2UgY29uc3RhbnQgRVZQX01EIGFuZCBFVlBfQ0lQSEVSCiAgICAgcG9pbnRlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSGlkZSBCTl9DVFggc3RydWN0dXJlIGRldGFpbHMgaW4gYm5fbGNsLmggaW5zdGVhZCBvZiBwdWJsaXNoaW5nIHRoZW0KICAgICBpbiA8b3BlbnNzbC9ibi5oPi4gIEFsc28gZnVydGhlciBpbmNyZWFzZSBCTl9DVFhfTlVNIHRvIDMyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vZGlmeSBFVlBfRGlnZXN0KigpIHJvdXRpbmVzIHNvIHRoZXkgbm93IHJldHVybiB2YWx1ZXMuIEFsdGhvdWdoIHRoZQogICAgIGludGVybmFsIHNvZnR3YXJlIHJvdXRpbmVzIGNhbiBuZXZlciBmYWlsIGFkZGl0aW9uYWwgaGFyZHdhcmUgdmVyc2lvbnMKICAgICBtaWdodC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbiB1cCBjcnlwdG8vZXJyL2Vyci5oIGFuZCBjaGFuZ2Ugc29tZSBlcnJvciBjb2RlcyB0byBhdm9pZCBjb25mbGljdHM6CgogICAgIFByZXZpb3VzbHkgRVJSX1JfRkFUQUwgd2FzIHRvbyBzbWFsbCBhbmQgY29pbmNpZGVkIHdpdGggRVJSX0xJQl9QS0NTNwogICAgICg9IEVSUl9SX1BLQ1M3X0xJQik7IGl0IGlzIG5vdyA2NCBpbnN0ZWFkIG9mIDMyLgoKICAgICBBU04xIGVycm9yIGNvZGVzCiAgICAgICAgICBFUlJfUl9ORVNURURfQVNOMV9FUlJPUgogICAgICAgICAgLi4uCiAgICAgICAgICBFUlJfUl9NSVNTSU5HX0FTTjFfRU9TCiAgICAgd2VyZSA0IC4uIDksIGNvbmZsaWN0aW5nIHdpdGgKICAgICAgICAgIEVSUl9MSUJfUlNBICg9IEVSUl9SX1JTQV9MSUIpCiAgICAgICAgICAuLi4KICAgICAgICAgIEVSUl9MSUJfUEVNICg9IEVSUl9SX1BFTV9MSUIpLgogICAgIFRoZXkgYXJlIG5vdyA1OCAuLiA2MyAoaS5lLiwganVzdCBiZWxvdyBFUlJfUl9GQVRBTCkuCgogICAgIEFkZCBuZXcgZXJyb3IgY29kZSAnRVJSX1JfSU5URVJOQUxfRVJST1InLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERvbid0IG92ZXJ1c2UgbG9ja3MgaW4gY3J5cHRvL2Vyci9lcnIuYzogRm9yIGRhdGEgcmV0cmlldmFsLCBDUllQVE9fcl9sb2NrCiAgICAgc3VmZmljZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IG9wdGlvbiAnLXN1YmogYXJnJyBmb3IgJ29wZW5zc2wgcmVxJyBhbmQgJ29wZW5zc2wgY2EnLiAgVGhpcwogICAgIHNldHMgdGhlIHN1YmplY3QgbmFtZSBmb3IgYSBuZXcgcmVxdWVzdCBvciBzdXBlcnNlZGVzIHRoZQogICAgIHN1YmplY3QgbmFtZSBpbiBhIGdpdmVuIHJlcXVlc3QuIEZvcm1hdHMgdGhhdCBjYW4gYmUgcGFyc2VkIGFyZQogICAgICAgICAgJ0NOPVNvbWUgTmFtZSwgT1U9bXlPVSwgQz1JVCcKICAgICBhbmQKICAgICAgICAgICdDTj1Tb21lIE5hbWUvT1U9bXlPVS9DPUlUJy4KCiAgICAgQWRkIG9wdGlvbnMgJy1iYXRjaCcgYW5kICctdmVyYm9zZScgdG8gJ29wZW5zc2wgcmVxJy4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAaGFja21hc3RlcnMubmV0Pl0KCiAgKikgSW50cm9kdWNlIHRoZSBwb3NzaWJpbGl0eSB0byBhY2Nlc3MgZ2xvYmFsIHZhcmlhYmxlcyB0aHJvdWdoCiAgICAgZnVuY3Rpb25zIG9uIHBsYXRmb3JtIHdlcmUgdGhhdCdzIHRoZSBiZXN0IHdheSB0byBoYW5kbGUgZXhwb3J0aW5nCiAgICAgZ2xvYmFsIHZhcmlhYmxlcyBpbiBzaGFyZWQgbGlicmFyaWVzLiAgVG8gZW5hYmxlIHRoaXMgZnVuY3Rpb25hbGl0eSwKICAgICBvbmUgbXVzdCBjb25maWd1cmUgd2l0aCAiRVhQT1JUX1ZBUl9BU19GTiIgb3IgZGVmaW5lZCB0aGUgQyBtYWNybwogICAgICJPUEVOU1NMX0VYUE9SVF9WQVJfQVNfRlVOQ1RJT04iIGluIGNyeXB0by9vcGVuc3NsY29uZi5oICh0aGUgbGF0dGVyCiAgICAgaXMgbm9ybWFsbHkgZG9uZSBieSBDb25maWd1cmUgb3Igc29tZXRoaW5nIHNpbWlsYXIpLgoKICAgICBUbyBpbXBsZW1lbnQgYSBnbG9iYWwgdmFyaWFibGUsIHVzZSB0aGUgbWFjcm8gT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMCiAgICAgaW4gdGhlIHNvdXJjZSBmaWxlIChmb28uYykgbGlrZSB0aGlzOgoKCU9QRU5TU0xfSU1QTEVNRU5UX0dMT0JBTChpbnQsZm9vKT0xOwoJT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMKGRvdWJsZSxiYXIpOwoKICAgICBUbyBkZWNsYXJlIGEgZ2xvYmFsIHZhcmlhYmxlLCB1c2UgdGhlIG1hY3JvcyBPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMCiAgICAgYW5kIE9QRU5TU0xfR0xPQkFMX1JFRiBpbiB0aGUgaGVhZGVyIGZpbGUgKGZvby5oKSBsaWtlIHRoaXM6CgoJT1BFTlNTTF9ERUNMQVJFX0dMT0JBTChpbnQsZm9vKTsKCSNkZWZpbmUgZm9vIE9QRU5TU0xfR0xPQkFMX1JFRihmb28pCglPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMKGRvdWJsZSxiYXIpOwoJI2RlZmluZSBiYXIgT1BFTlNTTF9HTE9CQUxfUkVGKGJhcikKCiAgICAgVGhlICNkZWZpbmVzIGFyZSB2ZXJ5IGltcG9ydGFudCwgYW5kIHRoZXJlZm9yZSBzbyBpcyBpbmNsdWRpbmcgdGhlCiAgICAgaGVhZGVyIGZpbGUgZXZlcnl3aGVyZSB3aGVyZSB0aGUgZGVmaW5lZCBnbG9iYWxzIGFyZSB1c2VkLgoKICAgICBUaGUgbWFjcm8gT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OIGFsc28gYWZmZWN0cyB0aGUgZGVmaW5pdGlvbgogICAgIG9mIEFTTi4xIGl0ZW1zLCBidXQgdGhhdCBzdHJ1Y3R1cmUgaXMgYSBiaXQgZGlmZmVyZW50LgoKICAgICBUaGUgbGFyZ2VzdCBjaGFuZ2UgaXMgaW4gdXRpbC9ta2RlZi5wbCB3aGljaCBoYXMgYmVlbiBlbmhhbmNlZCB3aXRoCiAgICAgYmV0dGVyIGFuZCBlYXNpZXIgdG8gdW5kZXJzdGFuZCBsb2dpYyB0byBjaG9vc2Ugd2hpY2ggc3ltYm9scyBzaG91bGQKICAgICBnbyBpbnRvIHRoZSBXaW5kb3dzIC5kZWYgZmlsZXMgYXMgd2VsbCBhcyBhIG51bWJlciBvZiBmaXhlcyBhbmQgY29kZQogICAgIGNsZWFudXAgKGFtb25nIG90aGVycywgYWxnb3JpdGhtIGtleXdvcmRzIGFyZSBub3cgc29ydGVkCiAgICAgbGV4aWNvZ3JhcGhpY2FsbHkgdG8gYXZvaWQgY29uc3RhbnQgcmV3cml0ZXMpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIEJOX2RpdigpIGtlZXAgYSBjb3B5IG9mIHRoZSBzaWduIG9mICdudW0nIGJlZm9yZSB3cml0aW5nIHRoZQogICAgIHJlc3VsdCB0byAncm0nIGJlY2F1c2UgaWYgcm09PW51bSB0aGUgdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbgogICAgIGFuZCBwcm9kdWNlIHRoZSB3cm9uZyByZXN1bHQgaWYgJ251bScgaXMgbmVnYXRpdmU6IHRoaXMgY2F1c2VkCiAgICAgcHJvYmxlbXMgd2l0aCBCTl9tb2QoKSBhbmQgQk5fbm5tb2QoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdW5jdGlvbiBPQ1NQX3JlcXVlc3RfdmVyaWZ5KCkuIFRoaXMgY2hlY2tzIHRoZSBzaWduYXR1cmUgb24gYW4KICAgICBPQ1NQIHJlcXVlc3QgYW5kIHZlcmlmaWVzIHRoZSBzaWduZXIgY2VydGlmaWNhdGUuIFRoZSBzaWduZXIKICAgICBjZXJ0aWZpY2F0ZSBpcyBqdXN0IGNoZWNrZWQgZm9yIGEgZ2VuZXJpYyBwdXJwb3NlIGFuZCBPQ1NQIHJlcXVlc3QKICAgICB0cnVzdCBzZXR0aW5ncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgT0NTUF9jaGVja192YWxpZGl0eSgpIGZ1bmN0aW9uIHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBPQ1NQCiAgICAgcmVzcG9uc2VzLiBPQ1NQIHJlc3BvbnNlcyBhcmUgcHJlcGFyZWQgaW4gcmVhbCB0aW1lIGFuZCBtYXkgb25seQogICAgIGJlIGEgZmV3IHNlY29uZHMgb2xkLiBTaW1wbHkgY2hlY2tpbmcgdGhhdCB0aGUgY3VycmVudCB0aW1lIGxpZXMKICAgICBiZXR3ZWVuIHRoaXNVcGRhdGUgYW5kIG5leHRVcGRhdGUgbWF4IHJlamVjdCBvdGhlcndpc2UgdmFsaWQgcmVzcG9uc2VzCiAgICAgY2F1c2VkIGJ5IGVpdGhlciBPQ1NQIHJlc3BvbmRlciBvciBjbGllbnQgY2xvY2sgaW5hY2N1cmFjeS4gSW5zdGVhZAogICAgIHdlIGFsbG93IHRoaXNVcGRhdGUgYW5kIG5leHRVcGRhdGUgdG8gZmFsbCB3aXRoaW4gYSBjZXJ0YWluIHBlcmlvZCBvZgogICAgIHRoZSBjdXJyZW50IHRpbWUuIFRoZSBhZ2Ugb2YgdGhlIHJlc3BvbnNlIGNhbiBhbHNvIG9wdGlvbmFsbHkgYmUKICAgICBjaGVja2VkLiBUd28gbmV3IG9wdGlvbnMgLXZhbGlkaXR5X3BlcmlvZCBhbmQgLXN0YXR1c19hZ2UgYWRkZWQgdG8KICAgICBvY3NwIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgc2lnbmF0dXJlIG9yIHB1YmxpYyBrZXkgYWxnb3JpdGhtIGlzIHVucmVjb2duaXplZCBwcmludCBvdXQgaXRzCiAgICAgT0lEIHJhdGhlciB0aGF0IGp1c3QgVU5LTk9XTi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgT0NTUF9jZXJ0X3RvX2lkKCkgdG8gdG9sZXJhdGUgYSBOVUxMIHN1YmplY3QgY2VydGlmaWNhdGUgYW5kCiAgICAgT0NTUF9jZXJ0X2lkX25ldygpIGEgTlVMTCBzZXJpYWxOdW1iZXIuIFRoaXMgYWxsb3dzIGEgcGFydGlhbCBjZXJ0aWZpY2F0ZQogICAgIElEIHRvIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBpc3N1ZXIgY2VydGlmaWNhdGUgYWxvbmUgd2hpY2ggY2FuIHRoZW4gYmUKICAgICBwYXNzZWQgdG8gT0NTUF9pZF9pc3N1ZXJfY21wKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGNvbXBpbGF0aW9uIG9wdGlvbiBBU04xX0lURU1fRlVOQ1RJT05TLiBUaGlzIGNhdXNlcyB0aGUgbmV3CiAgICAgQVNOMSBtb2R1bGVzIHRvIGV4cG9ydCBmdW5jdGlvbnMgcmV0dXJuaW5nIEFTTjFfSVRFTSBwb2ludGVycwogICAgIGluc3RlYWQgb2YgdGhlIEFTTjFfSVRFTSBzdHJ1Y3R1cmVzIHRoZW1zZWx2ZXMuIFRoaXMgYWRkcyBzZXZlcmFsCiAgICAgbmV3IG1hY3JvcyB3aGljaCBhbGxvdyB0aGUgdW5kZXJseWluZyBBU04xIGZ1bmN0aW9uL3N0cnVjdHVyZSB0bwogICAgIGJlIGFjY2Vzc2VkIHRyYW5zcGFyZW50bHkuIEFzIGEgcmVzdWx0IGNvZGUgc2hvdWxkIG5vdCB1c2UgQVNOMV9JVEVNCiAgICAgcmVmZXJlbmNlcyBkaXJlY3RseSAoc3VjaCBhcyAmWDUwOV9pdCkgYnV0IGluc3RlYWQgdXNlIHRoZSByZWxldmFudAogICAgIG1hY3JvcyAoc3VjaCBhcyBBU04xX0lURU1fcnB0cihYNTA5KSkuIFRoaXMgb3B0aW9uIGlzIHRvIGFsbG93CiAgICAgdXNlIG9mIHRoZSBuZXcgQVNOMSBjb2RlIG9uIHBsYXRmb3JtcyB3aGVyZSBleHBvcnRpbmcgc3RydWN0dXJlcwogICAgIGlzIHByb2JsZW1hdGljYWwgKGZvciBleGFtcGxlIGluIHNoYXJlZCBsaWJyYXJpZXMpIGJ1dCBleHBvcnRpbmcKICAgICBmdW5jdGlvbnMgcmV0dXJuaW5nIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgaXMgbm90LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBvdmVycmlkaW5nIHRoZSBnZW5lcmF0aW9uIG9mIFNTTC9UTFMgc2Vzc2lvbiBJRHMuCiAgICAgVGhlc2UgY2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkIGVpdGhlciBpbiBhbiBTU0xfQ1RYIG9yIHBlciBTU0wuCiAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gY29udHJvbCwgaWYgdGhleSB3aXNoLAogICAgIHRoZSBhcmJpdHJhcnkgdmFsdWVzIGNob3NlbiBmb3IgdXNlIGFzIHNlc3Npb24gSURzLCBwYXJ0aWN1bGFybHkgYXMgaXQKICAgICBjYW4gYmUgdXNlZnVsIGZvciBzZXNzaW9uIGNhY2hpbmcgaW4gbXVsdGlwbGUtc2VydmVyIGVudmlyb25tZW50cy4gQQogICAgIGNvbW1hbmQtbGluZSBzd2l0Y2ggZm9yIHRlc3RpbmcgdGhpcyAoYW5kIGFueSBjbGllbnQgY29kZSB0aGF0IHdpc2hlcwogICAgIHRvIHVzZSBzdWNoIGEgZmVhdHVyZSkgaGFzIGJlZW4gYWRkZWQgdG8gInNfc2VydmVyIi4KICAgICBbR2VvZmYgVGhvcnBlLCBMdXR6IEphZW5pY2tlXQoKICAqKSBNb2RpZnkgbWtkZWYucGwgdG8gcmVjb2duaXNlIGFuZCBwYXJzZSBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzCiAgICAgb2YgdGhlIGZvcm0gJyNpZiBkZWZpbmVkKC4uLikgfHwgZGVmaW5lZCguLi4pIHx8IC4uLicgYW5kCiAgICAgJyNpZiAhZGVmaW5lZCguLi4pICYmICFkZWZpbmVkKC4uLikgJiYgLi4uJy4gIFRoaXMgYWxzbyBhdm9pZHMKICAgICB0aGUgZ3Jvd2luZyBudW1iZXIgb2Ygc3BlY2lhbCBjYXNlcyBpdCB3YXMgcHJldmlvdXNseSBoYW5kbGluZy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGFsbCBjb25maWd1cmF0aW9uIG1hY3JvcyBhdmFpbGFibGUgZm9yIGFwcGxpY2F0aW9uIGJ5IG1ha2luZwogICAgIHN1cmUgdGhleSBhcmUgYXZhaWxhYmxlIGluIG9wZW5zc2xjb25mLmgsIGJ5IGdpdmluZyB0aGVtIG5hbWVzIHN0YXJ0aW5nCiAgICAgd2l0aCAiT1BFTlNTTF8iIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIHBhY2thZ2VzIGFuZCBieSBtYWtpbmcKICAgICBzdXJlIGVfb3MyLmggd2lsbCBjb3ZlciBhbGwgcGxhdGZvcm0tc3BlY2lmaWMgY2FzZXMgdG9nZXRoZXIgd2l0aAogICAgIG9wZW5zc2xjb25mLmguCiAgICAgQWRkaXRpb25hbGx5LCBpdCBpcyBub3cgcG9zc2libGUgdG8gZGVmaW5lIGNvbmZpZ3VyYXRpb24vcGxhdGZvcm0tCiAgICAgc3BlY2lmaWMgbmFtZXMgKGNhbGxlZCAic3lzdGVtIGlkZW50aXRpZXMiKS4gIEluIHRoZSBDIGNvZGUsIHRoZXNlCiAgICAgYXJlIHByZWZpeGVkIHdpdGggIk9QRU5TU0xfU1lTTkFNRV8iLiAgZV9vczIuaCB3aWxsIGNyZWF0ZSBhbm90aGVyCiAgICAgbWFjcm8gd2l0aCB0aGUgbmFtZSBiZWdpbm5pbmcgd2l0aCAiT1BFTlNTTF9TWVNfIiwgd2hpY2ggaXMgZGV0ZXJtaW5lZAogICAgIGZyb20gIk9QRU5TU0xfU1lTTkFNRV8qIiBvciBjb21waWxlci1zcGVjaWZpYyBtYWNyb3MgZGVwZW5kaW5nIG9uCiAgICAgd2hhdCBpcyBhdmFpbGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IG9wdGlvbiAtc2V0X3NlcmlhbCB0byAncmVxJyBhbmQgJ3g1MDknIHRoaXMgYWxsb3dzIHRoZSBzZXJpYWwKICAgICBudW1iZXIgdG8gdXNlIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiBQcmV2aW91c2x5IHNlbGYKICAgICBzaWduZWQgY2VydGlmaWNhdGVzIHdlcmUgaGFyZCBjb2RlZCB3aXRoIHNlcmlhbCBudW1iZXIgMCBhbmQgdGhlIAogICAgIENBIG9wdGlvbnMgb2YgJ3g1MDknIGhhZCB0byB1c2UgYSBzZXJpYWwgbnVtYmVyIGluIGEgZmlsZSB3aGljaCB3YXMKICAgICBhdXRvIGluY3JlbWVudGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb25zIHRvICdjYScgdXRpbGl0eSB0byBzdXBwb3J0IFYyIENSTCBlbnRyeSBleHRlbnNpb25zLgogICAgIEN1cnJlbnRseSBDUkwgcmVhc29uLCBpbnZhbGlkaXR5IGRhdGUgYW5kIGhvbGQgaW5zdHJ1Y3Rpb24gYXJlCiAgICAgc3VwcG9ydGVkLiBBZGQgbmV3IENSTCBleHRlbnNpb25zIHRvIFYzIGNvZGUgYW5kIHNvbWUgbmV3IG9iamVjdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKCkgdGhpcyBpcyB1c2VkIHRvCiAgICAgZGlzYWJsZSBzdGFuZGFyZCBibG9jayBwYWRkaW5nIChha2EgUEtDUyM1IHBhZGRpbmcpIGluIHRoZSBFVlAKICAgICBBUEksIHdoaWNoIHdhcyBwcmV2aW91c2x5IG1hbmRhdG9yeS4gVGhpcyBtZWFucyB0aGF0IHRoZSBkYXRhIGlzCiAgICAgbm90IHBhZGRlZCBpbiBhbnkgd2F5IGFuZCBzbyB0aGUgdG90YWwgbGVuZ3RoIG11Y2ggYmUgYSBtdWx0aXBsZQogICAgIG9mIHRoZSBibG9jayBzaXplLCBvdGhlcndpc2UgYW4gZXJyb3Igb2NjdXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgKGluY29tcGxldGUpIE9DU1AgU1NMIHN1cHBvcnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9DU1BfcGFyc2VfdXJsKCkuIFRoaXMgc3BsaXRzIHVwIGEgVVJMIGludG8gaXRzIGhvc3QsCiAgICAgcG9ydCBhbmQgcGF0aCBjb21wb25lbnRzOiBwcmltYXJpbHkgdG8gcGFyc2UgT0NTUCBVUkxzLiBOZXcgLXVybAogICAgIG9wdGlvbiB0byBvY3NwIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG5vbmNlIGJlaGF2aW9yLiBUaGUgcmV0dXJuIHZhbHVlIG9mIE9DU1BfY2hlY2tfbm9uY2UoKSBub3cgCiAgICAgcmVmbGVjdHMgdGhlIHZhcmlvdXMgY2hlY2tzIHBlcmZvcm1lZC4gQXBwbGljYXRpb25zIGNhbiBkZWNpZGUKICAgICB3aGV0aGVyIHRvIHRvbGVyYXRlIGNlcnRhaW4gc2l0dWF0aW9ucyBzdWNoIGFzIGFuIGFic2VudCBub25jZQogICAgIGluIGEgcmVzcG9uc2Ugd2hlbiBvbmUgd2FzIHByZXNlbnQgaW4gYSByZXF1ZXN0OiB0aGUgb2NzcCBhcHBsaWNhdGlvbgogICAgIGp1c3QgcHJpbnRzIG91dCBhIHdhcm5pbmcuIE5ldyBmdW5jdGlvbiBPQ1NQX2FkZDFfYmFzaWNfbm9uY2UoKQogICAgIHRoaXMgaXMgdG8gYWxsb3cgcmVzcG9uZGVycyB0byBpbmNsdWRlIGEgbm9uY2UgaW4gYSByZXNwb25zZSBldmVuIGlmCiAgICAgdGhlIHJlcXVlc3QgaXMgbm9uY2UtbGVzcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEaXNhYmxlIHN0ZGluIGJ1ZmZlcmluZyBpbiBsb2FkX2NlcnQgKGFwcHMvYXBwcy5jKSBzbyB0aGF0IG5vIGNlcnRzIGFyZQogICAgIHNraXBwZWQgd2hlbiB1c2luZyBvcGVuc3NsIHg1MDkgbXVsdGlwbGUgdGltZXMgb24gYSBzaW5nbGUgaW5wdXQgZmlsZSwKICAgICBlLmcuICIob3BlbnNzbCB4NTA5IC1vdXQgY2VydDE7IG9wZW5zc2wgeDUwOSAtb3V0IGNlcnQyKSA8Y2VydHMiLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2UgQVNOMV9VVENUSU1FX3NldF9zdHJpbmcoKSBhbmQgQVNOMV9HRU5FUkFMSVpFRFRJTUVfc2V0X3N0cmluZygpCiAgICAgc2V0IHN0cmluZyB0eXBlOiB0byBoYW5kbGUgc2V0dGluZyBBU04xX1RJTUUgc3RydWN0dXJlcy4gRml4IGNhCiAgICAgdXRpbGl0eSB0byBjb3JyZWN0bHkgaW5pdGlhbGl6ZSByZXZvY2F0aW9uIGRhdGUgb2YgQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9uIFNTTF9PUF9DSVBIRVJfU0VSVkVSX1BSRUZFUkVOQ0UgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gb3ZlcnJpZGUKICAgICB0aGUgY2xpZW50cyBwcmVmZXJyZWQgY2lwaGVyc3VpdGVzIGFuZCByYXRoZXIgdXNlIGl0cyBvd24gcHJlZmVyZW5jZXMuCiAgICAgU2hvdWxkIGhlbHAgdG8gd29yayBhcm91bmQgTSQgU0dDIChTZXJ2ZXIgR2F0ZWQgQ3J5cHRvZ3JhcGh5KSBidWcgaW4KICAgICBJbnRlcm5ldCBFeHBsb3JlciBieSBlbnN1cmluZyB1bmNoYW5nZWQgaGFzaCBtZXRob2QgZHVyaW5nIHN0ZXB1cC4KICAgICAoQWxzbyByZXBsYWNlcyB0aGUgYnJva2VuL2RlYWN0aXZhdGVkIFNTTF9PUF9OT05fRVhQT1JUX0ZJUlNUIG9wdGlvbi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIE1ha2UgbWtkZWYucGwgcmVjb2duaXNlIGFsbCBERUNMQVJFX0FTTjEgbWFjcm9zLCBjaGFuZ2UgcmlqbmRhZWwKICAgICB0byBhZXMgYW5kIGFkZCBhIG5ldyAnZXhpc3QnIG9wdGlvbiB0byBwcmludCBvdXQgc3ltYm9scyB0aGF0IGRvbid0CiAgICAgYXBwZWFyIHRvIGV4aXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGl0aW9uYWwgb3B0aW9ucyB0byBvY3NwIHV0aWxpdHkgdG8gYWxsb3cgZmxhZ3MgdG8gYmUgc2V0IGFuZAogICAgIGFkZGl0aW9uYWwgY2VydGlmaWNhdGVzIHN1cHBsaWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgb3B0aW9uIC1WQWZpbGUgdG8gJ29wZW5zc2wgb2NzcCcsIHNvIHRoZSB1c2VyIGNhbiBnaXZlIHRoZQogICAgIE9DU1AgY2xpZW50IGEgbnVtYmVyIG9mIGNlcnRpZmljYXRlIHRvIG9ubHkgdmVyaWZ5IHRoZSByZXNwb25zZQogICAgIHNpZ25hdHVyZSBhZ2FpbnN0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFVwZGF0ZSBSaWpuZGFlbCBjb2RlIHRvIHZlcnNpb24gMy4wIGFuZCBjaGFuZ2UgRVZQIEFFUyBjaXBoZXJzIHRvCiAgICAgaGFuZGxlIHRoZSBuZXcgQVBJLiBDdXJyZW50bHkgb25seSBFQ0IsIENCQyBtb2RlcyBzdXBwb3J0ZWQuIEFkZCBuZXcKICAgICBBRVMgT0lEcy4KCiAgICAgQWRkIFRMUyBBRVMgY2lwaGVyc3VpdGVzIGFzIGRlc2NyaWJlZCBpbiBSRkMzMjY4LCAiQWR2YW5jZWQKICAgICBFbmNyeXB0aW9uIFN0YW5kYXJkIChBRVMpIENpcGhlcnN1aXRlcyBmb3IgVHJhbnNwb3J0IExheWVyCiAgICAgU2VjdXJpdHkgKFRMUykiLiAgKEluIGJldGEgdmVyc2lvbnMgb2YgT3BlblNTTCAwLjkuNywgdGhlc2Ugd2VyZQogICAgIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIHdlcmUgbm90IHBhcnQgb2YgdGhlICJBTEwiIGNpcGhlcnN1aXRlCiAgICAgYWxpYXMgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHlldCBvZmZpY2lhbDsgdGhleSBjb3VsZCBiZQogICAgIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHNwZWNpZnlpbmcgdGhlICJBRVNkcmFmdCIgY2lwaGVyc3VpdGUKICAgICBncm91cCBhbGlhcy4gIEluIHRoZSBmaW5hbCByZWxlYXNlIG9mIE9wZW5TU0wgMC45LjcsIHRoZSBncm91cAogICAgIGFsaWFzIGlzIGNhbGxlZCAiQUVTIiBhbmQgaXMgcGFydCBvZiAiQUxMIi4pCiAgICAgW0JlbiBMYXVyaWUsIFN0ZXZlICBIZW5zb24sIEJvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9DU1BfY29weV9ub25jZSgpIHRvIGNvcHkgbm9uY2UgdmFsdWUgKGlmIHByZXNlbnQpIGZyb20KICAgICByZXF1ZXN0IHRvIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1bmN0aW9ucyBmb3IgT0NTUCByZXNwb25kZXJzLiBPQ1NQX3JlcXVlc3Rfb25lcmVxX2NvdW50KCksCiAgICAgT0NTUF9yZXF1ZXN0X29uZXJlcV9nZXQwKCksIE9DU1Bfb25lcmVxX2dldDBfaWQoKSBhbmQgT0NTUF9pZF9nZXQwX2luZm8oKQogICAgIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBhIGNlcnRpZmljYXRlIHJlcXVlc3QuIE9DU1BfcmVzcG9uc2VfY3JlYXRlKCkKICAgICBjcmVhdGVzIGEgcmVzcG9uc2UgYW5kIG9wdGlvbmFsbHkgYWRkcyBhIGJhc2ljIHJlc3BvbnNlIHN0cnVjdHVyZS4KICAgICBPQ1NQX2Jhc2ljX2FkZDFfc3RhdHVzKCkgYWRkcyBhIGNvbXBsZXRlIHNpbmdsZSByZXNwb25zZSB0byBhIGJhc2ljCiAgICAgcmVzcG9uc2UgYW5kIHJldHVybnMgdGhlIE9DU1BfU0lOR0xFUkVTUCBzdHJ1Y3R1cmUganVzdCBhZGRlZCAodG8gYWxsb3cKICAgICBleHRlbnNpb25zIHRvIGJlIGluY2x1ZGVkIGZvciBleGFtcGxlKS4gT0NTUF9iYXNpY19hZGQxX2NlcnQoKSBhZGRzIGEKICAgICBjZXJ0aWZpY2F0ZSB0byBhIGJhc2ljIHJlc3BvbnNlIGFuZCBPQ1NQX2Jhc2ljX3NpZ24oKSBzaWducyBhIGJhc2ljCiAgICAgcmVzcG9uc2Ugd2l0aCB2YXJpb3VzIGZsYWdzLiBOZXcgaGVscGVyIGZ1bmN0aW9ucyBBU04xX1RJTUVfY2hlY2soKQogICAgIChjaGVja3MgdmFsaWRpdHkgb2YgQVNOMV9USU1FIHN0cnVjdHVyZSkgYW5kIEFTTjFfVElNRV90b19nZW5lcmFsaXplZHRpbWUoKQogICAgIChjb252ZXJ0cyBBU04xX1RJTUUgdG8gR2VuZXJhbGl6ZWRUaW1lKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIG5ldyBmdW5jdGlvbnMuIEVWUF9EaWdlc3QoKSBjb21iaW5lcyBFVlBfRGlnZXN0e0luaXQsVXBkYXRlLEZpbmFsfSgpCiAgICAgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLiBYNTA5X2dldDBfcHVia2V5X2JpdHN0cigpIGV4dHJhY3RzIHRoZSBwdWJsaWNfa2V5CiAgICAgc3RydWN0dXJlIGZyb20gYSBjZXJ0aWZpY2F0ZS4gWDUwOV9wdWJrZXlfZGlnZXN0KCkgZGlnZXN0cyB0aGUgcHVibGljX2tleQogICAgIGNvbnRlbnRzOiB0aGlzIGlzIHVzZWQgaW4gdmFyaW91cyBrZXkgaWRlbnRpZmllcnMuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugc2tfc29ydCgpIHRvbGVyYXRlIGEgTlVMTCBhcmd1bWVudC4KICAgICBbU3RldmUgSGVuc29uIHJlcG9ydGVkIGJ5IE1hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+XQoKICAqKSBOZXcgT0NTUCB2ZXJpZnkgZmxhZyBPQ1NQX1RSVVNUT1RIRVIuIFdoZW4gc2V0IHRoZSAib3RoZXIiIGNlcnRpZmljYXRlcwogICAgIHBhc3NlZCBieSB0aGUgZnVuY3Rpb24gYXJlIHRydXN0ZWQgaW1wbGljaXRseS4gSWYgYW55IG9mIHRoZW0gc2lnbmVkIHRoZQogICAgIHJlc3BvbnNlIHRoZW4gaXQgaXMgYXNzdW1lZCB0byBiZSB2YWxpZCBhbmQgaXMgbm90IHZlcmlmaWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIFBLQ1M3X3NldF90eXBlKCkgaW5pdGlhbGlzZSBjb250ZW50X3R5cGUgaW4gUEtDUzdfRU5DX0NPTlRFTlQKICAgICB0byBkYXRhLiBUaGlzIHdhcyBwcmV2aW91c2x5IHBhcnQgb2YgdGhlIFBLQ1M3IEFTTjEgY29kZS4gVGhpcwogICAgIHdhcyBjYXVzaW5nIHByb2JsZW1zIHdpdGggT3BlblNTTCBjcmVhdGVkIFBLQ1MjMTIgYW5kIFBLQ1MjNyBzdHJ1Y3R1cmVzLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEtlbm5ldGggUi4gUm9iaW5ldHRlCgkJCQk8c3VwcG9ydEBzZWN1cmVuZXR0ZXJtLmNvbT5dCgogICopIEFkZCBDUllQVE9fcHVzaF9pbmZvKCkgYW5kIENSWVBUT19wb3BfaW5mbygpIGNhbGxzIHRvIG5ldyBBU04xCiAgICAgcm91dGluZXM6IHdpdGhvdXQgdGhlc2UgdHJhY2luZyBtZW1vcnkgbGVha3MgaXMgdmVyeSBwYWluZnVsLgogICAgIEZpeCBsZWFrcyBpbiBQS0NTMTIgYW5kIFBLQ1M3IHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgWDUwOV90aW1lX2FkaigpIGNvcGUgd2l0aCB0aGUgbmV3IGJlaGF2aW91ciBvZiBBU04xX1RJTUVfbmV3KCkuCiAgICAgUHJldmlvdXNseSBpdCBpbml0aWFsaXNlZCB0aGUgJ3R5cGUnIGFyZ3VtZW50IHRvIFZfQVNOMV9VVENUSU1FIHdoaWNoCiAgICAgZWZmZWN0aXZlbHkgbWVhbnQgR2VuZXJhbGl6ZWRUaW1lIHdvdWxkIG5ldmVyIGJlIHVzZWQuIE5vdyBpdAogICAgIGlzIGluaXRpYWxpc2VkIHRvIC0xIGJ1dCBYNTA5X3RpbWVfYWRqKCkgbm93IGhhcyB0byBjaGVjayB0aGUgdmFsdWUKICAgICBhbmQgdXNlIEFTTjFfVElNRV9zZXQoKSBpZiB0aGUgdmFsdWUgaXMgbm90IFZfQVNOMV9VVENUSU1FIG9yCiAgICAgVl9BU04xX0dFTkVSQUxJWkVEVElNRSwgd2l0aG91dCB0aGlzIGl0IGFsd2F5cyB1c2VzIEdlbmVyYWxpemVkVGltZS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBLZW5uZXRoIFIuIFJvYmluZXR0ZQoJCQkJPHN1cHBvcnRAc2VjdXJlbmV0dGVybS5jb20+XQoKICAqKSBGaXhlcyB0byBCTl90b19BU04xX0lOVEVHRVIgd2hlbiBibiBpcyB6ZXJvLiBUaGlzIHdvdWxkIHByZXZpb3VzbHkKICAgICByZXN1bHQgaW4gYSB6ZXJvIGxlbmd0aCBpbiB0aGUgQVNOMV9JTlRFR0VSIHN0cnVjdHVyZSB3aGljaCB3YXMKICAgICBub3QgY29uc2lzdGVudCB3aXRoIHRoZSBzdHJ1Y3R1cmUgd2hlbiBkMmlfQVNOMV9JTlRFR0VSKCkgd2FzIHVzZWQKICAgICBhbmQgd291bGQgY2F1c2UgQVNOMV9JTlRFR0VSX2NtcCgpIHRvIGZhaWwuIEVuaGFuY2UgczJpX0FTTjFfSU5URUdFUigpCiAgICAgdG8gY29wZSB3aXRoIGhleCBhbmQgbmVnYXRpdmUgaW50ZWdlcnMuIEZpeCBidWcgaW4gaTJhX0FTTjFfSU5URUdFUigpCiAgICAgd2hlcmUgaXQgZGlkIG5vdCBwcmludCBvdXQgYSBtaW51cyBmb3IgbmVnYXRpdmUgQVNOMV9JTlRFR0VSLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdW1tYXJ5IHByaW50b3V0IHRvIG9jc3AgdXRpbGl0eS4gVGhlIHZhcmlvdXMgZnVuY3Rpb25zIHdoaWNoCiAgICAgY29udmVydCBzdGF0dXMgdmFsdWVzIHRvIHN0cmluZ3MgaGF2ZSBiZWVuIHJlbmFtZWQgdG86CiAgICAgT0NTUF9yZXNwb25zZV9zdGF0dXNfc3RyKCksIE9DU1BfY2VydF9zdGF0dXNfc3RyKCkgYW5kCiAgICAgT0NTUF9jcmxfcmVhc29uX3N0cigpIGFuZCBhcmUgbm8gbG9uZ2VyIHN0YXRpYy4gTmV3IG9wdGlvbnMKICAgICB0byB2ZXJpZnkgbm9uY2UgdmFsdWVzIGFuZCB0byBkaXNhYmxlIHZlcmlmaWNhdGlvbi4gT0NTUCByZXNwb25zZQogICAgIHByaW50b3V0IGZvcm1hdCBjbGVhbmVkIHVwLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhZGRpdGlvbmFsIE9DU1AgY2VydGlmaWNhdGUgY2hlY2tzLiBUaGVzZSBhcmUgdGhvc2Ugc3BlY2lmaWVkCiAgICAgaW4gUkZDMjU2MC4gVGhpcyBjb25zaXN0cyBvZiB0d28gc2VwYXJhdGUgY2hlY2tzOiB0aGUgQ0Egb2YgdGhlCiAgICAgY2VydGlmaWNhdGUgYmVpbmcgY2hlY2tlZCBtdXN0IGVpdGhlciBiZSB0aGUgT0NTUCBzaWduZXIgY2VydGlmaWNhdGUKICAgICBvciB0aGUgaXNzdWVyIG9mIHRoZSBPQ1NQIHNpZ25lciBjZXJ0aWZpY2F0ZS4gSW4gdGhlIGxhdHRlciBjYXNlIHRoZQogICAgIE9DU1Agc2lnbmVyIGNlcnRpZmljYXRlIG11c3QgY29udGFpbiB0aGUgT0NTUCBzaWduaW5nIGV4dGVuZGVkIGtleQogICAgIHVzYWdlLiBUaGlzIGNoZWNrIGlzIHBlcmZvcm1lZCBieSBhdHRlbXB0aW5nIHRvIG1hdGNoIHRoZSBPQ1NQCiAgICAgc2lnbmVyIG9yIHRoZSBPQ1NQIHNpZ25lciBDQSB0byB0aGUgaXNzdWVyTmFtZUhhc2ggYW5kIGlzc3VlcktleUhhc2gKICAgICBpbiB0aGUgT0NTUF9DRVJUSUQgc3RydWN0dXJlcyBvZiB0aGUgcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBPQ1NQIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhZGRlZCB0byBPQ1NQX2Jhc2ljX3ZlcmlmeSgpCiAgICAgYW5kIHJlbGF0ZWQgcm91dGluZXMuIFRoaXMgdXNlcyB0aGUgc3RhbmRhcmQgT3BlblNTTCBjZXJ0aWZpY2F0ZQogICAgIHZlcmlmeSByb3V0aW5lcyB0byBwZXJmb3JtIGluaXRpYWwgY2hlY2tzIChqdXN0IENBIHZhbGlkaXR5KSBhbmQKICAgICB0byBvYnRhaW4gdGhlIGNlcnRpZmljYXRlIGNoYWluLiBUaGVuIGFkZGl0aW9uYWwgY2hlY2tzIHdpbGwgYmUKICAgICBwZXJmb3JtZWQgb24gdGhlIGNoYWluLiBDdXJyZW50bHkgdGhlIHJvb3QgQ0EgaXMgY2hlY2tlZCB0byBzZWUKICAgICBpZiBpdCBpcyBleHBsaWNpdGx5IHRydXN0ZWQgZm9yIE9DU1Agc2lnbmluZy4gVGhpcyBpcyB1c2VkIHRvIHNldAogICAgIGEgcm9vdCBDQSBhcyBhIGdsb2JhbCBzaWduaW5nIHJvb3Q6IHRoYXQgaXMgYW55IGNlcnRpZmljYXRlIHRoYXQKICAgICBjaGFpbnMgdG8gdGhhdCBDQSBpcyBhbiBhY2NlcHRhYmxlIE9DU1Agc2lnbmluZyBjZXJ0aWZpY2F0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgJy1leHRmaWxlIC4uLicgb3B0aW9uIHRvICdvcGVuc3NsIGNhJyBmb3IgcmVhZGluZyBYLjUwOXYzCiAgICAgZXh0ZW5zaW9ucyBmcm9tIGEgc2VwYXJhdGUgY29uZmlndXJhdGlvbiBmaWxlLgogICAgIEFzIHdoZW4gcmVhZGluZyBleHRlbnNpb25zIGZyb20gdGhlIG1haW4gY29uZmlndXJhdGlvbiBmaWxlLAogICAgIHRoZSAnLWV4dGVuc2lvbnMgLi4uJyBvcHRpb24gbWF5IGJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlCiAgICAgc2VjdGlvbiB0byB1c2UuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+XQoKICAqKSBOZXcgT0NTUCB1dGlsaXR5LiBBbGxvd3MgT0NTUCByZXF1ZXN0cyB0byBiZSBnZW5lcmF0ZWQgb3IKICAgICByZWFkLiBUaGUgcmVxdWVzdCBjYW4gYmUgc2VudCB0byBhIHJlc3BvbmRlciBhbmQgdGhlIG91dHB1dAogICAgIHBhcnNlZCwgb3V0cHV0ZWQgb3IgcHJpbnRlZCBpbiB0ZXh0IGZvcm0uIE5vdCBjb21wbGV0ZSB5ZXQ6CiAgICAgc3RpbGwgbmVlZHMgdG8gY2hlY2sgdGhlIE9DU1AgcmVzcG9uc2UgdmFsaWRpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHN1YmNvbW1hbmRzIGZvciAnb3BlbnNzbCBjYSc6CiAgICAgJ29wZW5zc2wgY2EgLXN0YXR1cyA8c2VyaWFsPicgcHJpbnRzIHRoZSBzdGF0dXMgb2YgdGhlIGNlcnQgd2l0aAogICAgIHRoZSBnaXZlbiBzZXJpYWwgbnVtYmVyIChhY2NvcmRpbmcgdG8gdGhlIGluZGV4IGZpbGUpLgogICAgICdvcGVuc3NsIGNhIC11cGRhdGVkYicgdXBkYXRlcyB0aGUgZXhwaXJ5IHN0YXR1cyBvZiBjZXJ0aWZpY2F0ZXMKICAgICBpbiB0aGUgaW5kZXggZmlsZS4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD5dCgogICopIE5ldyAnLW5ld3JlcS1ub2RlcycgY29tbWFuZCBvcHRpb24gdG8gQ0EucGwuICBUaGlzIGlzIGxpa2UKICAgICAnLW5ld3JlcScsIGJ1dCBjYWxscyAnb3BlbnNzbCByZXEnIHdpdGggdGhlICctbm9kZXMnIG9wdGlvbgogICAgIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBrZXkgaXMgbm90IGVuY3J5cHRlZC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPl0KCiAgKikgTmV3IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBHTlUgSHVyZC4KICAgICBbSm9uYXRoYW4gQmFydGxldHQgPGpvaG5ueWJAd29sZnJhbS5jb20+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEluaXRpYWwgY29kZSB0byBpbXBsZW1lbnQgT0NTUCBiYXNpYyByZXNwb25zZSB2ZXJpZnkuIFRoaXMKICAgICBpcyBjdXJyZW50bHkgaW5jb21wbGV0ZS4gQ3VycmVudGx5IGp1c3QgZmluZHMgdGhlIHNpZ25lcidzCiAgICAgY2VydGlmaWNhdGUgYW5kIHZlcmlmaWVzIHRoZSBzaWduYXR1cmUgb24gdGhlIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBTU0xlYXlfdmVyc2lvbiBjb2RlIFNTTEVBWV9ESVIgdG8gZGV0ZXJtaW5lIHRoZSBjb21waWxlZC1pbgogICAgIHZhbHVlIG9mIE9QRU5TU0xESVIuICBUaGlzIGlzIGF2YWlsYWJsZSB2aWEgdGhlIG5ldyAnLWQnIG9wdGlvbgogICAgIHRvICdvcGVuc3NsIHZlcnNpb24nLCBhbmQgaXMgYWxzbyBpbmNsdWRlZCBpbiAnb3BlbnNzbCB2ZXJzaW9uIC1hJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBbGxvd2luZyBkZWZpbmluZyBtZW1vcnkgYWxsb2NhdGlvbiBjYWxsYmFja3MgdGhhdCB3aWxsIGJlIGdpdmVuCiAgICAgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbmFsIGFyZ3VtZW50cwogICAgIChhIGNvbnN0IGNoYXIqIGFuZCBhbiBpbnQpLiAgVGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgcmVtYWlucywgYXMKICAgICB3ZWxsIGFzIHRoZSBvcmlnaW5hbCBwb3NzaWJpbGl0eSB0byBqdXN0IHJlcGxhY2UgbWFsbG9jKCksCiAgICAgcmVhbGxvYygpIGFuZCBmcmVlKCkgYnkgZnVuY3Rpb25zIHRoYXQgZG8gbm90IGtub3cgYWJvdXQgdGhlc2UKICAgICBhZGRpdGlvbmFsIGFyZ3VtZW50cy4gIFRvIHJlZ2lzdGVyIGFuZCBmaW5kIG91dCB0aGUgY3VycmVudAogICAgIHNldHRpbmdzIGZvciBleHRlbmRlZCBhbGxvY2F0aW9uIGZ1bmN0aW9ucywgdGhlIGZvbGxvd2luZwogICAgIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQ6CgoJQ1JZUFRPX3NldF9tZW1fZXhfZnVuY3Rpb25zCglDUllQVE9fc2V0X2xvY2tlZF9tZW1fZXhfZnVuY3Rpb25zCglDUllQVE9fZ2V0X21lbV9leF9mdW5jdGlvbnMKCUNSWVBUT19nZXRfbG9ja2VkX21lbV9leF9mdW5jdGlvbnMKCiAgICAgVGhlc2Ugd29yayB0aGUgc2FtZSB3YXkgYXMgQ1JZUFRPX3NldF9tZW1fZnVuY3Rpb25zIGFuZCBmcmllbmRzLgogICAgIENSWVBUT19nZXRfW2xvY2tlZF9dbWVtX2Z1bmN0aW9ucyBub3cgd3JpdGVzIDAgd2hlcmUgc3VjaCBhbgogICAgIGV4dGVuZGVkIGFsbG9jYXRpb24gZnVuY3Rpb24gaXMgZW5hYmxlZC4KICAgICBTaW1pbGFybHksIENSWVBUT19nZXRfW2xvY2tlZF9dbWVtX2V4X2Z1bmN0aW9ucyB3cml0ZXMgMCB3aGVyZQogICAgIGEgY29udmVudGlvbmFsIGFsbG9jYXRpb24gZnVuY3Rpb24gaXMgZW5hYmxlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlLCBCb2RvIE1vZWxsZXJdCgogICopIEZpbmlzaCBvZmYgcmVtb3ZpbmcgdGhlIHJlbWFpbmluZyBMSEFTSCBmdW5jdGlvbiBwb2ludGVyIGNhc3RzLgogICAgIFRoZXJlIHNob3VsZCBubyBsb25nZXIgYmUgYW55IHByb3RvdHlwZS1jYXN0aW5nIHJlcXVpcmVkIHdoZW4gdXNpbmcKICAgICB0aGUgTEhBU0ggYWJzdHJhY3Rpb24sIGFuZCBhbnkgY2FzdHMgdGhhdCByZW1haW4gYXJlICJidWdzIi4gU2VlCiAgICAgdGhlIGNhbGxiYWNrIHR5cGVzIGFuZCBtYWNyb3MgYXQgdGhlIGhlYWQgb2YgbGhhc2guaCBmb3IgZGV0YWlscwogICAgIChhbmQgIk9CSl9jbGVhbnVwIiBpbiBjcnlwdG8vb2JqZWN0cy9vYmpfZGF0LmMgYXMgYW4gZXhhbXBsZSkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGF1dG9tYXRpYyBxdWVyeSBvZiBFR0Qgc29ja2V0cyBpbiBSQU5EX3BvbGwoKSBmb3IgdGhlIHVuaXggdmFyaWFudC4KICAgICBJZiAvZGV2L1t1XXJhbmRvbSBkZXZpY2VzIGFyZSBub3QgYXZhaWxhYmxlIG9yIGRvIG5vdCByZXR1cm4gZW5vdWdoCiAgICAgZW50cm9weSwgRUdEIHN0eWxlIHNvY2tldHMgKHNlcnZlZCBieSBFR0Qgb3IgUFJOR0QpIHdpbGwgYXV0b21hdGljYWxseQogICAgIGJlIHF1ZXJpZWQuCiAgICAgVGhlIGxvY2F0aW9ucyAvdmFyL3J1bi9lZ2QtcG9vbCwgL2Rldi9lZ2QtcG9vbCwgL2V0Yy9lZ2QtcG9vbCwgYW5kCiAgICAgL2V0Yy9lbnRyb3B5IHdpbGwgYmUgcXVlcmllZCBvbmNlIGVhY2ggaW4gdGhpcyBzZXF1ZW5jZSwgcXVlcmluZyBzdG9wcwogICAgIHdoZW4gZW5vdWdoIGVudHJvcHkgd2FzIGNvbGxlY3RlZCB3aXRob3V0IHF1ZXJ5aW5nIG1vcmUgc29ja2V0cy4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQ2hhbmdlIHRoZSBVbml4IFJBTkRfcG9sbCgpIHZhcmlhbnQgdG8gYmUgYWJsZSB0byBwb2xsIHNldmVyYWwKICAgICByYW5kb20gZGV2aWNlcywgYXMgc3BlY2lmaWVkIGJ5IERFVlJBTkRPTSwgdW50aWwgYSBzdWZmaWNpZW50IGFtb3VudAogICAgIG9mIGRhdGEgaGFzIGJlZW4gY29sbGVjdGVkLiAgIFdlIHNwZW5kIGF0IG1vc3QgMTAgbXMgb24gZWFjaCBmaWxlCiAgICAgKHNlbGVjdCB0aW1lb3V0KSBhbmQgcmVhZCBpbiBub24tYmxvY2tpbmcgbW9kZS4gIERFVlJBTkRPTSBub3cKICAgICBkZWZhdWx0cyB0byB0aGUgbGlzdCAiL2Rldi91cmFuZG9tIiwgIi9kZXYvcmFuZG9tIiwgIi9kZXYvc3JhbmRvbSIKICAgICAocHJldmlvdXNseSBpdCB3YXMganVzdCB0aGUgc3RyaW5nICIvZGV2L3VyYW5kb20iKSwgc28gb24gdHlwaWNhbAogICAgIHBsYXRmb3JtcyB0aGUgMTAgbXMgZGVsYXkgd2lsbCBuZXZlciBvY2N1ci4KICAgICBBbHNvIHNlcGFyYXRlIG91dCB0aGUgVW5peCB2YXJpYW50IHRvIGl0cyBvd24gZmlsZSwgcmFuZF91bml4LmMuCiAgICAgRm9yIFZNUywgdGhlcmUncyBhIGN1cnJlbnRseS1lbXB0eSByYW5kX3Ztcy5jLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1vdmUgT0NTUCBjbGllbnQgcmVsYXRlZCByb3V0aW5lcyB0byBvY3NwX2NsLmMuIFRoZXNlCiAgICAgcHJvdmlkZSB1dGlsaXR5IGZ1bmN0aW9ucyB3aGljaCBhbiBhcHBsaWNhdGlvbiBuZWVkaW5nCiAgICAgdG8gaXNzdWUgYSByZXF1ZXN0IHRvIGFuIE9DU1AgcmVzcG9uZGVyIGFuZCBhbmFseXNlIHRoZQogICAgIHJlc3BvbnNlIHdpbGwgdHlwaWNhbGx5IG5lZWQ6IGFzIG9wcG9zZWQgdG8gdGhvc2Ugd2hpY2ggYW4KICAgICBPQ1NQIHJlc3BvbmRlciBpdHNlbGYgd291bGQgbmVlZCB3aGljaCB3aWxsIGJlIGFkZGVkIGxhdGVyLgoKICAgICBPQ1NQX3JlcXVlc3Rfc2lnbigpIHNpZ25zIGFuIE9DU1AgcmVxdWVzdCB3aXRoIGFuIEFQSSBzaW1pbGFyCiAgICAgdG8gUEtDUzdfc2lnbigpLiBPQ1NQX3Jlc3BvbnNlX3N0YXR1cygpIHJldHVybnMgc3RhdHVzIG9mIE9DU1AKICAgICByZXNwb25zZS4gT0NTUF9yZXNwb25zZV9nZXQxX2Jhc2ljKCkgZXh0cmFjdHMgYmFzaWMgcmVzcG9uc2UKICAgICBmcm9tIHJlc3BvbnNlLiBPQ1NQX3Jlc3BfZmluZF9zdGF0dXMoKTogZmluZHMgYW5kIGV4dHJhY3RzIHN0YXR1cwogICAgIGluZm9ybWF0aW9uIGZyb20gYW4gT0NTUF9DRVJUSUQgc3RydWN0dXJlICh3aGljaCB3aWxsIGJlIGNyZWF0ZWQKICAgICB3aGVuIHRoZSByZXF1ZXN0IHN0cnVjdHVyZSBpcyBidWlsdCkuIFRoZXNlIGFyZSBidWlsdCBmcm9tIGxvd2VyCiAgICAgbGV2ZWwgZnVuY3Rpb25zIHdoaWNoIHdvcmsgb24gT0NTUF9TSU5HTEVSRVNQIHN0cnVjdHVyZXMgYnV0CiAgICAgd29udCBub3JtYWxseSBiZSB1c2VkIHVubGVzcyB0aGUgYXBwbGljYXRpb24gd2lzaGVzIHRvIGV4YW1pbmUKICAgICBleHRlbnNpb25zIGluIHRoZSBPQ1NQIHJlc3BvbnNlIGZvciBleGFtcGxlLgoKICAgICBSZXBsYWNlIG5vbmNlIHJvdXRpbmVzIHdpdGggYSBwYWlyIG9mIGZ1bmN0aW9ucy4KICAgICBPQ1NQX3JlcXVlc3RfYWRkMV9ub25jZSgpIGFkZHMgYSBub25jZSB2YWx1ZSBhbmQgb3B0aW9uYWxseQogICAgIGdlbmVyYXRlcyBhIHJhbmRvbSB2YWx1ZS4gT0NTUF9jaGVja19ub25jZSgpIGNoZWNrcyB0aGUKICAgICB2YWxpZGl0eSBvZiB0aGUgbm9uY2UgaW4gYW4gT0NTUCByZXNwb25zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgZnVuY3Rpb24gT0NTUF9yZXF1ZXN0X2FkZCgpIHRvIE9DU1BfcmVxdWVzdF9hZGQwX2lkKCkuCiAgICAgVGhpcyBkb2Vzbid0IGNvcHkgdGhlIHN1cHBsaWVkIE9DU1BfQ0VSVElEIGFuZCBhdm9pZHMgdGhlCiAgICAgbmVlZCB0byBmcmVlIHVwIHRoZSBuZXdseSBjcmVhdGVkIGlkLiBDaGFuZ2UgcmV0dXJuIHR5cGUKICAgICB0byBPQ1NQX09ORVJFUSB0byByZXR1cm4gdGhlIGludGVybmFsIE9DU1BfT05FUkVRIHN0cnVjdHVyZS4KICAgICBUaGlzIGNhbiB0aGVuIGJlIHVzZWQgdG8gYWRkIGV4dGVuc2lvbnMgdG8gdGhlIHJlcXVlc3QuCiAgICAgRGVsZXRlZCBPQ1NQX3JlcXVlc3RfbmV3KCksIHNpbmNlIG1vc3Qgb2YgaXRzIGZ1bmN0aW9uYWxpdHkKICAgICBpcyBub3cgaW4gT0NTUF9SRVFVRVNUX25ldygpIChhbmQgdGhlIGNhc2UgaW5zZW5zaXRpdmUgbmFtZQogICAgIGNsYXNoKSBhcGFydCBmcm9tIHRoZSBhYmlsaXR5IHRvIHNldCB0aGUgcmVxdWVzdCBuYW1lIHdoaWNoCiAgICAgd2lsbCBiZSBhZGRlZCBlbHNld2hlcmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIE9DU1AgQVBJLiBSZW1vdmUgb2Jzb2xldGUgZXh0ZW5zaW9ucyBhcmd1bWVudCBmcm9tCiAgICAgdmFyaW91cyBmdW5jdGlvbnMuIEV4dGVuc2lvbnMgYXJlIG5vdyBoYW5kbGVkIHVzaW5nIHRoZSBuZXcKICAgICBPQ1NQIGV4dGVuc2lvbiBjb2RlLiBOZXcgc2ltcGxlIE9DU1AgSFRUUCBmdW5jdGlvbiB3aGljaCAKICAgICBjYW4gYmUgdXNlZCB0byBzZW5kIHJlcXVlc3RzIGFuZCBwYXJzZSB0aGUgcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSBQS0NTIzcgKFMvTUlNRSkgY29kZSB0byB3b3JrIHdpdGggbmV3IEFTTjEuIFR3byBuZXcKICAgICBBU04xX0lURU0gc3RydWN0dXJlcyBoZWxwIHdpdGggc2lnbiBhbmQgdmVyaWZ5LiBQS0NTN19BVFRSX1NJR04KICAgICB1c2VzIHRoZSBzcGVjaWFsIHJlb3JkZXIgdmVyc2lvbiBvZiBTRVQgT0YgdG8gc29ydCB0aGUgYXR0cmlidXRlcwogICAgIGFuZCByZW9yZGVyIHRoZW0gdG8gbWF0Y2ggdGhlIGVuY29kZWQgb3JkZXIuIFRoaXMgcmVzb2x2ZXMgYSBsb25nCiAgICAgc3RhbmRpbmcgcHJvYmxlbTogYSB2ZXJpZnkgb24gYSBQS0NTNyBzdHJ1Y3R1cmUganVzdCBhZnRlciBzaWduaW5nCiAgICAgaXQgdXNlZCB0byBmYWlsIGJlY2F1c2UgdGhlIGF0dHJpYnV0ZSBvcmRlciBkaWQgbm90IG1hdGNoIHRoZQogICAgIGVuY29kZWQgb3JkZXIuIFBLQ1M3X0FUVFJfVkVSSUZZIGRvZXMgbm90IHJlb3JkZXIgdGhlIGF0dHJpYnV0ZXM6CiAgICAgaXQgdXNlcyB0aGUgcmVjZWl2ZWQgb3JkZXIuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHRvbGVyYXRlIHNvbWUgYnJva2VuCiAgICAgc29mdHdhcmUgdGhhdCBkb2VzIG5vdCBvcmRlciBTRVQgT0YuIFRoaXMgaXMgaGFuZGxlZCBieSBlbmNvZGluZwogICAgIGFzIGEgU0VRVUVOQ0UgT0YgYnV0IHVzaW5nIGltcGxpY2l0IHRhZ2dpbmcgKHdpdGggVU5JVkVSU0FMIGNsYXNzKQogICAgIHRvIHByb2R1Y2UgdGhlIHJlcXVpcmVkIFNFVCBPRi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIYXZlIG1rMW1mLnBsIGdlbmVyYXRlIHRoZSBtYWNyb3MgT1BFTlNTTF9CVUlMRF9TSExJQkNSWVBUTyBhbmQKICAgICBPUEVOU1NMX0JVSUxEX1NITElCU1NMIGFuZCB1c2UgdGhlbSBhcHByb3ByaWF0ZWx5IGluIHRoZSBoZWFkZXIKICAgICBmaWxlcyB0byBnZXQgY29ycmVjdCBkZWNsYXJhdGlvbnMgb2YgdGhlIEFTTi4xIGl0ZW0gdmFyaWFibGVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFJld3JpdGUgb2YgUEtDUyMxMiBjb2RlIHRvIHVzZSBuZXcgQVNOMSBmdW5jdGlvbmFsaXR5LiBSZXBsYWNlIG1hbnkKICAgICBQS0NTIzEyIG1hY3JvcyB3aXRoIHJlYWwgZnVuY3Rpb25zLiBGaXggdHdvIHVucmVsYXRlZCBBU04xIGJ1Z3M6CiAgICAgYXNuMV9jaGVja190bGVuKCkgd291bGQgc29tZXRpbWVzIGF0dGVtcHQgdG8gdXNlICdjdHgnIHdoZW4gaXQgd2FzCiAgICAgTlVMTCBhbmQgQVNOMV9UWVBFIHdhcyBub3QgZGVyZWZlcmVuY2VkIHByb3Blcmx5IGluIGFzbjFfZXhfYzJpKCkuCiAgICAgTmV3IEFTTjEgbWFjcm86IERFQ0xBUkVfQVNOMV9JVEVNKCkgd2hpY2gganVzdCBkZWNsYXJlcyB0aGUgcmVsZXZhbnQKICAgICBBU04xX0lURU0gYW5kIG5vIHdyYXBwZXIgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgb3IgQVNOMV9pdGVtX2QyaV9mcCgpIGFuZCBBU04xX2l0ZW1fZDJpX2JpbygpLiBUaGVzZQogICAgIHJlcGxhY2UgdGhlIG9sZCBmdW5jdGlvbiBwb2ludGVyIGJhc2VkIEkvTyByb3V0aW5lcy4gQ2hhbmdlIG1vc3Qgb2YKICAgICB0aGUgKl9kMmlfYmlvKCkgYW5kICpfZDJpX2ZwKCkgZnVuY3Rpb25zIHRvIHVzZSB0aGVzZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIG1rZGVmLnBsIHRvIGJlIG1vcmUgYWNjZXB0aW5nIGFib3V0IHNwYWNpbmcgaW4gQyBwcmVwcm9jZXNzb3IKICAgICBsaW5lcywgcmVjb2duaWNlIG1vcmUgImFsZ29yaXRobXMiIHRoYXQgY2FuIGJlIGRlc2VsZWN0ZWQsIGFuZCBtYWtlCiAgICAgaXQgY29tcGxhaW4gYWJvdXQgYWxnb3JpdGhtIGRlc2VsZWN0aW9uIHRoYXQgaXNuJ3QgcmVjb2duaXNlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgQVNOMSBmdW5jdGlvbnMgdG8gaGFuZGxlIGR1cCwgc2lnbiwgdmVyaWZ5LCBkaWdlc3QsIHBhY2sgYW5kCiAgICAgdW5wYWNrIG9wZXJhdGlvbnMgaW4gdGVybXMgb2YgQVNOMV9JVEVNLiBNb2RpZnkgZXhpc3Rpbmcgd3JhcHBlcnMKICAgICB0byB1c2UgbmV3IGZ1bmN0aW9ucy4gQWRkIE5PX0FTTjFfT0xEIHdoaWNoIGNhbiBiZSBzZXQgdG8gcmVtb3ZlCiAgICAgc29tZSBvbGQgc3R5bGUgQVNOMSBmdW5jdGlvbnM6IHRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIG9sZAogICAgIGNvZGUgd2lsbCBzdGlsbCB3b3JrIHdoZW4gdGhlc2UgZXZlbnR1YWxseSBnbyBhd2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBleHRlbnNpb24gZnVuY3Rpb25zIGZvciBPQ1NQIHN0cnVjdHVyZXMsIHRoZXNlIGZvbGxvdyB0aGUKICAgICBzYW1lIGNvbnZlbnRpb25zIGFzIGNlcnRpZmljYXRlcyBhbmQgQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOVYzX2FkZDFfaTJkKCkuIFRoaXMgYXV0b21hdGljYWxseSBlbmNvZGVzIGFuZAogICAgIGFkZHMgYW4gZXh0ZW5zaW9uLiBJdHMgYmVoYXZpb3VyIGNhbiBiZSBjdXN0b21pc2VkIHdpdGggdmFyaW91cwogICAgIGZsYWdzIHRvIGFwcGVuZCwgcmVwbGFjZSBvciBkZWxldGUuIFZhcmlvdXMgd3JhcHBlcnMgYWRkZWQgZm9yCiAgICAgY2VydGlmY2F0ZXMgYW5kIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRvIGF2b2lkIGNhbGxpbmcgdGhlIHVuZGVybHlpbmcgQVNOMSBwcmludCByb3V0aW5lIHdoZW4KICAgICBhbiBleHRlbnNpb24gY2Fubm90IGJlIHBhcnNlZC4gQ29ycmVjdCBhIHR5cG8gaW4gdGhlCiAgICAgT0NTUF9TRVJWSUNFTE9DIGV4dGVuc2lvbi4gVGlkeSB1cCBwcmludCBPQ1NQIGZvcm1hdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIG1rZGVmLnBsIHBhcnNlIHNvbWUgb2YgdGhlIEFTTjEgbWFjcm9zIGFuZCBhZGQgYXBwcm9wcmlhdGUKICAgICBlbnRyaWVzIGZvciB2YXJpYWJsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bmN0aW9uYWxpdHkgdG8gYXBwcy9vcGVuc3NsLmMgZm9yIGRldGVjdGluZyBsb2NraW5nCiAgICAgcHJvYmxlbXM6IEFzIHRoZSBwcm9ncmFtIGlzIHNpbmdsZS10aHJlYWRlZCwgYWxsIHdlIGhhdmUKICAgICB0byBkbyBpcyByZWdpc3RlciBhIGxvY2tpbmcgY2FsbGJhY2sgdXNpbmcgYW4gYXJyYXkgZm9yCiAgICAgc3RvcmluZyB3aGljaCBsb2NrcyBhcmUgY3VycmVudGx5IGhlbGQgYnkgdGhlIHByb2dyYW0uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXNlIGEgbG9jayBhcm91bmQgdGhlIGNhbGwgdG8gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoKSBpbgogICAgIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX2lkeCgpLCB3aGljaCBpcyB1c2VkIGluCiAgICAgc3NsX3ZlcmlmeV9jZXJ0X2NoYWluKCkgYW5kIHRodXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZQogICAgIGR1cmluZyBUTFMvU1NMIGhhbmRzaGFrZXMgc28gdGhhdCB0aHJlYWQtc2FmZXR5IGlzIGVzc2VudGlhbC4KICAgICBVbmZvcnR1bmF0ZWx5LCB0aGUgZXhfZGF0YSBkZXNpZ24gaXMgbm90IGF0IGFsbCBzdWl0ZWQKICAgICBmb3IgbXVsdGktdGhyZWFkZWQgdXNlLCBzbyBpdCBwcm9iYWJseSBzaG91bGQgYmUgYWJvbGlzaGVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZGVkIEJyb2FkY29tICJ1YnNlYyIgRU5HSU5FIHRvIE9wZW5TU0wuCiAgICAgW0Jyb2FkY29tLCB0d2Vha2VkIGFuZCBpbnRlZ3JhdGVkIGJ5IEdlb2ZmIFRob3JwZV0KCiAgKikgTW92ZSBjb21tb24gZXh0ZW5zaW9uIHByaW50aW5nIGNvZGUgdG8gbmV3IGZ1bmN0aW9uCiAgICAgWDUwOVYzX3ByaW50X2V4dGVuc2lvbnMoKS4gUmVvcmdhbmlzZSBPQ1NQIHByaW50IHJvdXRpbmVzIGFuZAogICAgIGltcGxlbWVudCBzb21lIG5lZWRlZCBPQ1NQIEFTTjEgZnVuY3Rpb25zLiBBZGQgT0NTUCBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X3NpZ25hdHVyZV9wcmludCgpIHRvIHJlbW92ZSBkdXBsaWNhdGlvbiBpbiBzb21lCiAgICAgcHJpbnQgcm91dGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgc3BlY2lhbCBtZWFuaW5nIHdoZW4gU0VUIE9GIGFuZCBTRVFVRU5DRSBPRiBmbGFncyBhcmUgYm90aAogICAgIHNldCAodGhpcyB3YXMgdHJlYXRlZCBleGFjdGx5IHRoZSBzYW1lIGFzIFNFVCBPRiBwcmV2aW91c2x5KS4gVGhpcwogICAgIGlzIHVzZWQgdG8gcmVvcmRlciB0aGUgU1RBQ0sgcmVwcmVzZW50aW5nIHRoZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggdGhlCiAgICAgZW5jb2RpbmcuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGdldCByb3VuZCBhIHByb2JsZW0gd2hlcmUgYSBQS0NTNwogICAgIHN0cnVjdHVyZSB3aGljaCB3YXMgc2lnbmVkIGNvdWxkIG5vdCBiZSB2ZXJpZmllZCBiZWNhdXNlIHRoZSBTVEFDSwogICAgIG9yZGVyIGRpZCBub3QgcmVmbGVjdCB0aGUgZW5jb2RlZCBvcmRlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWltcGxlbWVudCB0aGUgT0NTUCBBU04xIG1vZHVsZSB1c2luZyB0aGUgbmV3IGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIHRoZSBYNTA5VjMgY29kZSB0byBwZXJtaXQgdGhlIHVzZSBvZiBhbiBBU04xX0lURU0gc3RydWN0dXJlCiAgICAgZm9yIGl0cyBBU04xIG9wZXJhdGlvbnMuIFRoZSBvbGQgc3R5bGUgZnVuY3Rpb24gcG9pbnRlcnMgc3RpbGwgZXhpc3QKICAgICBmb3Igbm93IGJ1dCB0aGV5IHdpbGwgZXZlbnR1YWxseSBnbyBhd2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1lcmdlIGluIHJlcGxhY2VtZW50IEFTTjEgY29kZSBmcm9tIHRoZSBBU04xIGJyYW5jaC4gVGhpcyBhbG1vc3QKICAgICBjb21wbGV0ZWx5IHJlcGxhY2VzIHRoZSBvbGQgQVNOMSBmdW5jdGlvbmFsaXR5IHdpdGggYSB0YWJsZSBkcml2ZW4KICAgICBlbmNvZGVyIGFuZCBkZWNvZGVyIHdoaWNoIGludGVycHJldHMgYW4gQVNOMV9JVEVNIHN0cnVjdHVyZSBkZXNjcmliaW5nCiAgICAgdGhlIEFTTjEgbW9kdWxlLiBDb21wYXRpYmlsaXR5IHdpdGggdGhlIGV4aXN0aW5nIEFTTjEgQVBJIChpMmQsZDJpKSBpcwogICAgIGxhcmdlbHkgbWFpbnRhaW5lZC4gQWxtb3N0IGFsbCBvZiB0aGUgb2xkIGFzbjFfbWFjLmggbWFjcm8gYmFzZWQgQVNOMQogICAgIGhhcyBhbHNvIGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgZm9ybS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgQk5fbW9kX2V4cF9yZWNwIHNvIHRoYXQgbmVnYXRpdmUgbW9kdWxpIGFyZSB0b2xlcmF0ZWQKICAgICAodGhlIHNpZ24gaXMgaWdub3JlZCkuICBTaW1pbGFybHksIGlnbm9yZSB0aGUgc2lnbiBpbiBCTl9NT05UX0NUWF9zZXQKICAgICBzbyB0aGF0IEJOX21vZF9leHBfbW9udCBhbmQgQk5fbW9kX2V4cF9tb250X3dvcmQgd29yawogICAgIGZvciBuZWdhdGl2ZSBtb2R1bGkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IEJOX3VhZGQgYW5kIEJOX3VzdWI6IEFsd2F5cyByZXR1cm4gbm9uLW5lZ2F0aXZlIHJlc3VsdHMgaW5zdGVhZAogICAgIG9mIG5vdCB0b3VjaGluZyB0aGUgcmVzdWx0J3Mgc2lnbiBiaXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQk5fZGl2IGJ1Z2ZpeDogSWYgdGhlIHJlc3VsdCBpcyAwLCB0aGUgc2lnbiAocmVzLT5uZWcpIG11c3Qgbm90IGJlCiAgICAgc2V0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZWQgdGhlIExIQVNIIGNvZGUgdG8gdXNlIHByb3RvdHlwZXMgZm9yIGNhbGxiYWNrcywgYW5kIGNyZWF0ZWQKICAgICBtYWNyb3MgdG8gZGVjbGFyZSBhbmQgaW1wbGVtZW50IHRoaW4gKG9wdGlvbmFsbHkgc3RhdGljKSBmdW5jdGlvbnMKICAgICB0aGF0IHByb3ZpZGUgdHlwZS1zYWZldHkgYW5kIGF2b2lkIGZ1bmN0aW9uIHBvaW50ZXIgY2FzdGluZyBmb3IgdGhlCiAgICAgdHlwZS1zcGVjaWZpYyBjYWxsYmFja3MuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkZWQgS2VyYmVyb3MgQ2lwaGVyIFN1aXRlcyB0byBiZSB1c2VkIHdpdGggVExTLCBhcyB3cml0dGVuIGluCiAgICAgUkZDIDI3MTIuCiAgICAgW1ZlZXJzIFN0YWF0cyA8c3RhYXRzdnJAYXNjLmhwYy5taWw+LAogICAgICBKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBjb2x1bWJpYS5lZHU+LCB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZWZvcm1hdCB0aGUgRkFRIHNvIHRoZSBkaWZmZXJlbnQgcXVlc3Rpb25zIGFuZCBhbnN3ZXJzIGNhbiBiZSBkaXZpZGVkCiAgICAgaW4gc2VjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBzdWJqZWN0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEhhdmUgdGhlIHpsaWIgY29tcHJlc3Npb24gY29kZSBsb2FkIFpMSUIuRExMIGR5bmFtaWNhbGx5IHVuZGVyCiAgICAgV2luZG93cy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fbW9kX3NxcnQgZm9yIGNvbXB1dGluZyBzcXVhcmUgcm9vdHMgbW9kdWxvIGEgcHJpbWUKICAgICAodXNpbmcgdGhlIHByb2JhYmlsaXN0aWMgVG9uZWxsaS1TaGFua3MgYWxnb3JpdGhtIHVubGVzcwogICAgIHAgPT0gMyAobW9kIDQpICBvciAgcCA9PSA1IChtb2QgOCksICB3aGljaCBhcmUgY2FzZXMgdGhhdCBjYW4KICAgICBiZSBoYW5kbGVkIGRldGVybWluaXN0aWNhbGx5KS4KICAgICBbTGVua2EgRmliaWtvdmEgPGZpYmlrb3ZhQGV4cC1tYXRoLnVuaS1lc3Nlbi5kZT4sIEJvZG8gTW9lbGxlcl0KCiAgKikgTWFrZSBCTl9tb2RfaW52ZXJzZSBmYXN0ZXIgYnkgZXhwbGljaXRseSBoYW5kbGluZyBzbWFsbCBxdW90aWVudHMKICAgICBpbiB0aGUgRXVjbGlkIGxvb3AuIChTcGVlZCBnYWluIGFib3V0IDIwJSBmb3Igc21hbGwgbW9kdWxpIFsyNTYgb3IKICAgICA1MTIgYml0c10sIGFib3V0IDMwJSBmb3IgbGFyZ2VyIG9uZXMgWzEwMjQgb3IgMjA0OCBiaXRzXS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX2tyb25lY2tlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQk5fZ2NkIHNvIHRoYXQgaXQgd29ya3Mgb24gbmVnYXRpdmUgaW5wdXRzOyB0aGUgcmVzdWx0IGlzCiAgICAgcG9zaXRpdmUgdW5sZXNzIGJvdGggcGFyYW1ldGVycyBhcmUgemVyby4KICAgICBQcmV2aW91c2x5IHNvbWV0aGluZyByZWFzb25hYmx5IGNsb3NlIHRvIGFuIGluZmluaXRlIGxvb3Agd2FzCiAgICAgcG9zc2libGUgYmVjYXVzZSBudW1iZXJzIGNvdWxkIGJlIGdyb3dpbmcgaW5zdGVhZCBvZiBzaHJpbmtpbmcKICAgICBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgRXVjbGlkJ3MgYWxnb3JpdGhtLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBCTl9pc193b3JkKCkgYW5kIEJOX2lzX29uZSgpIG1hY3JvcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUKICAgICBzaWduIG9mIHRoZSBudW1iZXIgaW4gcXVlc3Rpb24uCgogICAgIEZpeCBCTl9pc193b3JkKGEsdykgdG8gd29yayBjb3JyZWN0bHkgZm9yIHcgPT0gMC4KCiAgICAgVGhlIG9sZCBCTl9pc193b3JkKGEsdykgbWFjcm8gaXMgbm93IGNhbGxlZCBCTl9hYnNfaXNfd29yZChhLHcpCiAgICAgYmVjYXVzZSBpdHMgdGVzdCBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgJ2EnIGVxdWFscyAndycuCiAgICAgTm90ZSB0aGF0IEJOX2Fic19pc193b3JkIGRvZXMgKm5vdCogaGFuZGxlIHcgPT0gMCByZWxpYWJseTsKICAgICBpdCBleGlzdHMgbW9zdGx5IGZvciB1c2UgaW4gdGhlIGltcGxlbWVudGF0aW9ucyBvZiBCTl9pc196ZXJvKCksCiAgICAgQk5faXNfb25lKCksIGFuZCBCTl9pc193b3JkKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX3N3YXAuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXNlIEJOX25ubW9kIGluc3RlYWQgb2YgQk5fbW9kIGluIGNyeXB0by9ibi9ibl9leHAuYyBzbyB0aGF0CiAgICAgdGhlIGV4cG9uZW50aWF0aW9uIGZ1bmN0aW9ucyBhcmUgbW9yZSBsaWtlbHkgdG8gcHJvZHVjZSByZWFzb25hYmxlCiAgICAgcmVzdWx0cyBvbiBuZWdhdGl2ZSBpbnB1dHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIEJOX21vZF9tdWwgc28gdGhhdCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBub24tbmVnYXRpdmUuCiAgICAgUHJldmlvdXNseSwgaXQgY291bGQgYmUgbmVnYXRpdmUgaWYgb25lIG9mIHRoZSBmYWN0b3JzIHdhcyBuZWdhdGl2ZTsKICAgICBJIGRvbid0IHRoaW5rIGFueW9uZSByZWFsbHkgd2FudGVkIHRoYXQgYmVoYXZpb3VyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vdmUgQk5fbW9kXy4uLiBmdW5jdGlvbnMgaW50byBuZXcgZmlsZSBjcnlwdG8vYm4vYm5fbW9kLmMKICAgICAoZXhjZXB0IGZvciBleHBvbmVudGlhdGlvbiwgd2hpY2ggc3RheXMgaW4gY3J5cHRvL2JuL2JuX2V4cC5jLAogICAgIGFuZCBCTl9tb2RfbXVsX3JlY2lwcm9jYWwsIHdoaWNoIHN0YXlzIGluIGNyeXB0by9ibi9ibl9yZWNwLmMpCiAgICAgYW5kIGFkZCBuZXcgZnVuY3Rpb25zOgoKICAgICAgICAgIEJOX25ubW9kCiAgICAgICAgICBCTl9tb2Rfc3FyCiAgICAgICAgICBCTl9tb2RfYWRkCiAgICAgICAgICBCTl9tb2RfYWRkX3F1aWNrCiAgICAgICAgICBCTl9tb2Rfc3ViCiAgICAgICAgICBCTl9tb2Rfc3ViX3F1aWNrCiAgICAgICAgICBCTl9tb2RfbHNoaWZ0MQogICAgICAgICAgQk5fbW9kX2xzaGlmdDFfcXVpY2sKICAgICAgICAgIEJOX21vZF9sc2hpZnQKICAgICAgICAgIEJOX21vZF9sc2hpZnRfcXVpY2sKCiAgICAgVGhlc2UgZnVuY3Rpb25zIGFsd2F5cyBnZW5lcmF0ZSBub24tbmVnYXRpdmUgcmVzdWx0cy4KCiAgICAgQk5fbm5tb2Qgb3RoZXJ3aXNlIGlzIGxpa2UgQk5fbW9kIChpZiBCTl9tb2QgY29tcHV0ZXMgYSByZW1haW5kZXIgIHIKICAgICBzdWNoIHRoYXQgIHxtfCA8IHIgPCAwLCAgQk5fbm5tb2Qgd2lsbCBvdXRwdXQgIHJlbSArIHxtfCAgaW5zdGVhZCkuCgogICAgIEJOX21vZF9YWFhfcXVpY2sociwgYSwgW2IsXSBtKSBnZW5lcmF0ZXMgdGhlIHNhbWUgcmVzdWx0IGFzCiAgICAgQk5fbW9kX1hYWChyLCBhLCBbYixdIG0sIGN0eCksIGJ1dCByZXF1aXJlcyB0aGF0ICBhICBbYW5kICBiXQogICAgIGJlIHJlZHVjZWQgbW9kdWxvICBtLgogICAgIFtMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPiwgQm9kbyBNb2VsbGVyXQoKI2lmIDAKICAgICBUaGUgZm9sbG93aW5nIGVudHJ5IGFjY2lkZW50YWxseSBhcHBlYXJlZCBpbiB0aGUgQ0hBTkdFUyBmaWxlCiAgICAgZGlzdHJpYnV0ZWQgd2l0aCBPcGVuU1NMIDAuOS43LiAgVGhlIG1vZGlmaWNhdGlvbnMgZGVzY3JpYmVkIGluCiAgICAgaXQgZG8gKm5vdCogYXBwbHkgdG8gT3BlblNTTCAwLjkuNy4KCiAgKikgUmVtb3ZlIGEgZmV3IGNhbGxzIHRvIGJuX3dleHBhbmQoKSBpbiBCTl9zcXIoKSAodGhlIG9uZSBpbiB0aGVyZQogICAgIHdhcyBhY3R1YWxseSBuZXZlciBuZWVkZWQpIGFuZCBpbiBCTl9tdWwoKS4gIFRoZSByZW1vdmFsIGluIEJOX211bCgpCiAgICAgcmVxdWlyZWQgYSBzbWFsbCBjaGFuZ2UgaW4gYm5fbXVsX3BhcnRfcmVjdXJzaXZlKCkgYW5kIHRoZSBhZGRpdGlvbgogICAgIG9mIHRoZSBmdW5jdGlvbnMgYm5fY21wX3BhcnRfd29yZHMoKSwgYm5fc3ViX3BhcnRfd29yZHMoKSBhbmQKICAgICBibl9hZGRfcGFydF93b3JkcygpLCB3aGljaCBkbyB0aGUgc2FtZSB0aGluZyBhcyBibl9jbXBfd29yZHMoKSwKICAgICBibl9zdWJfd29yZHMoKSBhbmQgYm5fYWRkX3dvcmRzKCkgZXhjZXB0IHRoZXkgdGFrZSBhcnJheXMgd2l0aAogICAgIGRpZmZlcmluZyBzaXplcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQojZW5kaWYKCiAgKikgSW4gJ29wZW5zc2wgcGFzc3dkJywgdmVyaWZ5IHBhc3N3b3JkcyByZWFkIGZyb20gdGhlIHRlcm1pbmFsCiAgICAgdW5sZXNzIHRoZSAnLXNhbHQnIG9wdGlvbiBpcyB1c2VkICh3aGljaCB1c3VhbGx5IG1lYW5zIHRoYXQKICAgICB2ZXJpZmljYXRpb24gd291bGQganVzdCB3YXN0ZSB1c2VyJ3MgdGltZSBzaW5jZSB0aGUgcmVzdWx0aW5nCiAgICAgaGFzaCBpcyBnb2luZyB0byBiZSBjb21wYXJlZCB3aXRoIHNvbWUgZ2l2ZW4gcGFzc3dvcmQgaGFzaCkKICAgICBvciB0aGUgbmV3ICctbm92ZXJpZnknIG9wdGlvbiBpcyB1c2VkLgoKICAgICBUaGlzIGlzIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UsIGJ1dCBpdCBkb2VzIG5vdCBhZmZlY3QKICAgICBub24taW50ZXJhY3RpdmUgdXNlIG9mICdvcGVuc3NsIHBhc3N3ZCcgKHBhc3N3b3JkcyBvbiB0aGUgY29tbWFuZAogICAgIGxpbmUsICctc3RkaW4nIG9wdGlvbiwgJy1pbiAuLi4nIG9wdGlvbikgYW5kIHRodXMgc2hvdWxkIG5vdAogICAgIGNhdXNlIGFueSBwcm9ibGVtcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gUlNBcmVmLCBzaW5jZSB0aGVyZSdzIG5vIG1vcmUgbmVlZCBmb3IgaXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBEU08gbG9hZCBhbG9uZyBhIHBhdGggZ2l2ZW4gdGhyb3VnaCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgIChTSExJQl9QQVRIKSB3aXRoIHNobF9sb2FkKCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ29uc3RpZnkgdGhlIEVOR0lORSBjb2RlIGFzIGEgcmVzdWx0IG9mIEJJR05VTSBjb25zdGlmaWNhdGlvbi4KICAgICBBbHNvIGNvbnN0aWZ5IHRoZSBSU0EgY29kZSBhbmQgbW9zdCB0aGluZ3MgcmVsYXRlZCB0byBpdC4gIEluIGEKICAgICBmZXcgcGxhY2VzLCBtb3N0IG5vdGFibGUgaW4gdGhlIGRlcHRoIG9mIHRoZSBBU04uMSBjb2RlLCB1Z2x5CiAgICAgY2FzdHMgYmFjayB0byBub24tY29uc3Qgd2VyZSByZXF1aXJlZCAodG8gYmUgc29sdmVkIGF0IGEgbGF0ZXIKICAgICB0aW1lKQogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgc28gdGhlIG9wZW5zc2wgYXBwbGljYXRpb24gaGFzIGFsbCBlbmdpbmVzIGxvYWRlZCBieSBkZWZhdWx0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENvbnN0aWZ5IHRoZSBCSUdOVU0gcm91dGluZXMgYSBsaXR0bGUgbW9yZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgoJRU5HSU5FX2xvYWRfY3N3aWZ0KCkKCUVOR0lORV9sb2FkX2NoaWwoKQoJRU5HSU5FX2xvYWRfYXRhbGxhKCkKCUVOR0lORV9sb2FkX251cm9uKCkKCUVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpCgogICAgIFRoYXQgd2F5LCBhbiBhcHBsaWNhdGlvbiBjYW4gaXRzZWxmIGNob29zZSBpZiBleHRlcm5hbCBlbmdpbmVzIHRoYXQKICAgICBhcmUgYnVpbHQtaW4gaW4gT3BlblNTTCBzaGFsbCBldmVyIGJlIHVzZWQgb3Igbm90LiAgVGhlIGJlbmVmaXQgaXMKICAgICB0aGF0IGFwcGxpY2F0aW9ucyB3b24ndCBoYXZlIHRvIGJlIGxpbmtlZCB3aXRoIGxpYmRsIG9yIG90aGVyIGRzbwogICAgIGxpYnJhcmllcyB1bmxlc3MgaXQncyByZWFsbHkgbmVlZGVkLgoKICAgICBDaGFuZ2VkICdvcGVuc3NsIGVuZ2luZScgdG8gbG9hZCBhbGwgZW5naW5lcyBvbiBkZW1hbmQuCiAgICAgQ2hhbmdlZCB0aGUgZW5naW5lIGhlYWRlciBmaWxlcyB0byBhdm9pZCB0aGUgZHVwbGljYXRpb24gb2Ygc29tZQogICAgIGRlY2xhcmF0aW9ucyAodGhleSBkaWZmZXJlZCEpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopICdvcGVuc3NsIGVuZ2luZScgY2FuIG5vdyBsaXN0IGNhcGFiaWxpdGllcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGluICdvcGVuc3NsIGVuZ2luZScuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV2ZXIgY2FsbCBsb2FkX2RoX3BhcmFtKE5VTEwpIGluIHNfc2VydmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBlbmdpbmUgYXBwbGljYXRpb24uICBJdCBjYW4gY3VycmVudGx5IGxpc3QgZW5naW5lcyBieSBuYW1lIGFuZAogICAgIGlkZW50aXR5LCBhbmQgdGVzdCBpZiB0aGV5IGFyZSBhY3R1YWxseSBhdmFpbGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW1wcm92ZSBSUE0gc3BlY2lmaWNhdGlvbiBmaWxlIGJ5IGZvcmNpbmcgc3ltYm9saWMgbGlua2luZyBhbmQgbWFraW5nCiAgICAgc3VyZSB0aGUgaW5zdGFsbGVkIGRvY3VtZW50YXRpb24gaXMgYWxzbyBvd25lZCBieSByb290LnJvb3QuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz5dCgogICopIEdpdmUgdGhlIE9wZW5TU0wgYXBwbGljYXRpb25zIG1vcmUgcG9zc2liaWxpdGllcyB0byBtYWtlIHVzZSBvZgogICAgIGtleXMgKHB1YmxpYyBhcyB3ZWxsIGFzIHByaXZhdGUpIGhhbmRsZWQgYnkgZW5naW5lcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgT0NTUCBjb2RlIHRoYXQgY29tZXMgZnJvbSBDZXJ0Q28uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIFZNUyBzdXBwb3J0IGZvciB0aGUgUmlqbmRhZWwgY29kZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGRlZCB1bnRlc3RlZCBzdXBwb3J0IGZvciBOdXJvbiBjcnlwdG8gYWNjZWxlcmF0b3IuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBzdXBwb3J0IGZvciBleHRlcm5hbCBjcnlwdG9ncmFwaGljIGRldmljZXMuICBUaGlzIGNvZGUgd2FzCiAgICAgcHJldmlvdXNseSBkaXN0cmlidXRlZCBzZXBhcmF0ZWx5IGFzIHRoZSAiZW5naW5lIiBicmFuY2guCiAgICAgW0dlb2ZmIFRob3JwZSwgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZXdvcmsgdGhlIGZpbGVuYW1lLXRyYW5zbGF0aW9uIGluIHRoZSBEU08gY29kZS4gSXQgaXMgbm93IHBvc3NpYmxlIHRvCiAgICAgaGF2ZSBmYXIgZ3JlYXRlciBjb250cm9sIG92ZXIgaG93IGEgIm5hbWUiIGlzIHR1cm5lZCBpbnRvIGEgZmlsZW5hbWUKICAgICBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdGluZyBlbnZpcm9ubWVudCBhbmQgYW55IG9kZGl0aWVzIGFib3V0IHRoZQogICAgIGRpZmZlcmVudCBzaGFyZWQgbGlicmFyeSBmaWxlbmFtZXMgb24gZWFjaCBzeXN0ZW0uCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgU3VwcG9ydCB0aHJlYWRzIG9uIEZyZWVCU0QtZWxmIGluIENvbmZpZ3VyZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggZm9yIFNIQTEgYXNzZW1ibHkgcHJvYmxlbSB3aXRoIE1BU006IGl0IHByb2R1Y2VzCiAgICAgd2FybmluZ3MgYWJvdXQgY29ycnVwdCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB3aGVuIGFzc2VtYmxpbmcKICAgICB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gVGhpcyBpcyBjYXVzZWQgYnkgdGhlIG92ZXJsYXBwaW5nCiAgICAgb2YgdHdvIHNlY3Rpb25zLgogICAgIFtCZXJuZCBNYXR0aGVzIDxtYWluYnVnQGNlbG9jb20uZGU+LCBTdGV2ZSBIZW5zb25dCgogICopIE5DT05GIGNoYW5nZXMuCiAgICAgTkNPTkZfZ2V0X251bWJlcigpIGhhcyBubyBlcnJvciBjaGVja2luZyBhdCBhbGwuICBBcyBhIHJlcGxhY2VtZW50LAogICAgIE5DT05GX2dldF9udW1iZXJfZSgpIGlzIGRlZmluZWQgKF9lIGZvciAiZXJyb3IgY2hlY2tpbmciKSBhbmQgaXMKICAgICBwcm9tb3RlZCBzdHJvbmdseS4gIFRoZSBvbGQgTkNPTkZfZ2V0X251bWJlciBpcyBrZXB0IGFyb3VuZCBmb3IKICAgICBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICAgICBNYWtlIGl0IHBvc3NpYmxlIGZvciBtZXRob2RzIHRvIGxvYWQgZnJvbSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIEJJTywKICAgICBieSBwcm92aWRpbmcgYSBmdW5jdGlvbiBwb2ludGVyIHRoYXQgaXMgZ2l2ZW4gYSBuYW1lIGluc3RlYWQgb2YgYSBCSU8uCiAgICAgRm9yIGV4YW1wbGUsIHRoaXMgY291bGQgYmUgdXNlZCB0byBsb2FkIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGFuCiAgICAgTERBUCBzZXJ2ZXIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IGZvciBub24gYmxvY2tpbmcgYWNjZXB0IEJJT3MuIEFkZGVkIG5ldyBJL08gc3BlY2lhbCByZWFzb24KICAgICBCSU9fUlJfQUNDRVBUIHRvIGNvdmVyIHRoaXMgY2FzZS4gUHJldmlvdXNseSB1c2Ugb2YgYWNjZXB0IEJJT3MKICAgICB3aXRoIG5vbiBibG9ja2luZyBJL08gd2FzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIG5vIHJldHJ5IGNvZGUgd2FzCiAgICAgaW1wbGVtZW50ZWQuIEFsc28gYWRkZWQgbmV3IFNTTCBjb2RlIFNTTF9XQU5UX0FDQ0VQVCB0byBjb3ZlcgogICAgIHRoaXMgY2FzZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCB0aGUgYmVnaW5uaW5ncyBvZiBSaWpuZGFlbCBzdXBwb3J0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggZm9yIGJ1ZyBpbiBEaXJlY3RvcnlTdHJpbmcgbWFzayBzZXR0aW5nLiBBZGQgc3VwcG9ydCBmb3IKICAgICBYNTA5X05BTUVfcHJpbnRfZXgoKSBpbiAncmVxJyBhbmQgWDUwOV9wcmludF9leCgpIGZ1bmN0aW9uCiAgICAgdG8gYWxsb3cgY2VydGlmaWNhdGUgcHJpbnRpbmcgdG8gbW9yZSBjb250cm9sbGFibGUsIGFkZGl0aW9uYWwKICAgICAnY2VydG9wdCcgb3B0aW9uIHRvICd4NTA5JyB0byBhbGxvdyBuZXcgcHJpbnRpbmcgb3B0aW9ucyB0byBiZQogICAgIHNldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbiBvbGQgRUFZIE1ENSBoYWNrIGZyb20gZV9vcy5oLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42bCBhbmQgMC45LjZtICBbMTcgTWFyIDIwMDRdCgogICopIEZpeCBudWxsLXBvaW50ZXIgYXNzaWdubWVudCBpbiBkb19jaGFuZ2VfY2lwaGVyX3NwZWMoKSByZXZlYWxlZAogICAgIGJ5IHVzaW5nIHRoZSBDb2Rlbm9taWNvbiBUTFMgVGVzdCBUb29sIChDVkUtMjAwNC0wMDc5KQogICAgIFtKb2UgT3J0b24sIFN0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZrIGFuZCAwLjkuNmwgIFswNCBOb3YgMjAwM10KCiAgKikgRml4IGFkZGl0aW9uYWwgYnVnIHJldmVhbGVkIGJ5IHRoZSBOSVNDQyB0ZXN0IHN1aXRlOgoKICAgICBTdG9wIGJ1ZyB0cmlnZ2VyaW5nIGxhcmdlIHJlY3Vyc2lvbiB3aGVuIHByZXNlbnRlZCB3aXRoCiAgICAgY2VydGFpbiBBU04uMSB0YWdzIChDVkUtMjAwMy0wODUxKQogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42aiBhbmQgMC45LjZrICBbMzAgU2VwIDIwMDNdCgogICopIEZpeCB2YXJpb3VzIGJ1Z3MgcmV2ZWFsZWQgYnkgcnVubmluZyB0aGUgTklTQ0MgdGVzdCBzdWl0ZToKCiAgICAgU3RvcCBvdXQgb2YgYm91bmRzIHJlYWRzIGluIHRoZSBBU04xIGNvZGUgd2hlbiBwcmVzZW50ZWQgd2l0aAogICAgIGludmFsaWQgdGFncyAoQ1ZFLTIwMDMtMDU0MyBhbmQgQ1ZFLTIwMDMtMDU0NCkuCiAgICAgCiAgICAgSWYgdmVyaWZ5IGNhbGxiYWNrIGlnbm9yZXMgaW52YWxpZCBwdWJsaWMga2V5IGVycm9ycyBkb24ndCB0cnkgdG8gY2hlY2sKICAgICBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgd2l0aCB0aGUgTlVMTCBwdWJsaWMga2V5LgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBzc2wzX2FjY2VwdCgpIChzc2wvczNfc3J2ci5jKSBvbmx5IGFjY2VwdCBhIGNsaWVudCBjZXJ0aWZpY2F0ZQogICAgIGlmIHRoZSBzZXJ2ZXIgcmVxdWVzdGVkIG9uZTogYXMgc3RhdGVkIGluIFRMUyAxLjAgYW5kIFNTTCAzLjAKICAgICBzcGVjaWZpY2F0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBzc2wzX2dldF9jbGllbnRfaGVsbG8oKSAoc3NsL3MzX3NydnIuYyksIHRvbGVyYXRlIGFkZGl0aW9uYWwKICAgICBleHRyYSBkYXRhIGFmdGVyIHRoZSBjb21wcmVzc2lvbiBtZXRob2RzIG5vdCBvbmx5IGZvciBUTFMgMS4wCiAgICAgYnV0IGFsc28gZm9yIFNTTCAzLjAgKGFzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9uKS4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IE1hdHRoaWFzIExvZXBmZV0KCiAgKikgQ2hhbmdlIFg1MDlfY2VydGlmaWNhdGVfdHlwZSgpIHRvIG1hcmsgdGhlIGtleSBhcyBleHBvcnRlZC9leHBvcnRhYmxlCiAgICAgd2hlbiBpdCdzIDUxMiAqYml0cyogbG9uZywgbm90IDUxMiBieXRlcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmkgYW5kIDAuOS42aiAgWzEwIEFwciAyMDAzXQoKICAqKSBDb3VudGVybWVhc3VyZSBhZ2FpbnN0IHRoZSBLbGltYS1Qb2tvcm55LVJvc2EgZXh0ZW5zaW9uIG9mCiAgICAgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNSBwYWRkaW5nOiB0cmVhdAogICAgIGEgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgbWlzbWF0Y2ggbGlrZSBhIGRlY3J5cHRpb24gZXJyb3IKICAgICBpbiBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlIChzc2wvczNfc3J2ci5jKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUdXJuIG9uIFJTQSBibGluZGluZyBieSBkZWZhdWx0IGluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgdG8gYXZvaWQgYSB0aW1pbmcgYXR0YWNrLiBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IGl0IGNhbiBjYWxsCiAgICAgUlNBX2JsaW5kaW5nX29mZigpIG9yIHVzZSB0aGUgbmV3IGZsYWcgUlNBX0ZMQUdfTk9fQkxJTkRJTkcuCiAgICAgVGhleSB3b3VsZCBiZSBpbGwtYWR2aXNlZCB0byBkbyBzbyBpbiBtb3N0IGNhc2VzLgogICAgIFtCZW4gTGF1cmllLCBTdGV2ZSBIZW5zb24sIEdlb2ZmIFRob3JwZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgUlNBIGJsaW5kaW5nIGNvZGUgc28gdGhhdCBpdCB3b3JrcyB3aGVuIHRoZSBQUk5HIGlzIG5vdAogICAgIHNlZWRlZCAoaW4gdGhpcyBjYXNlLCB0aGUgc2VjcmV0IFJTQSBleHBvbmVudCBpcyBhYnVzZWQgYXMKICAgICBhbiB1bnByZWRpY3RhYmxlIHNlZWQgLS0gaWYgaXQgaXMgbm90IHVucHJlZGljdGFibGUsIHRoZXJlCiAgICAgaXMgbm8gcG9pbnQgaW4gYmxpbmRpbmcgYW55d2F5KS4gIE1ha2UgUlNBIGJsaW5kaW5nIHRocmVhZC1zYWZlCiAgICAgYnkgcmVtZW1iZXJpbmcgdGhlIGNyZWF0b3IncyB0aHJlYWQgSUQgaW4gcnNhLT5ibGluZGluZyBhbmQKICAgICBoYXZpbmcgYWxsIG90aGVyIHRocmVhZHMgdXNlIGxvY2FsIG9uZS10aW1lIGJsaW5kaW5nIGZhY3RvcnMKICAgICAodGhpcyByZXF1aXJlcyBtb3JlIGNvbXB1dGF0aW9uIHRoYW4gc2hhcmluZyByc2EtPmJsaW5kaW5nLCBidXQKICAgICBhdm9pZHMgZXhjZXNzaXZlIGxvY2tpbmc7IGFuZCBpZiBhbiBSU0Egb2JqZWN0IGlzIG5vdCBzaGFyZWQKICAgICBiZXR3ZWVuIHRocmVhZHMsIGJsaW5kaW5nIHdpbGwgc3RpbGwgYmUgdmVyeSBmYXN0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmggYW5kIDAuOS42aSAgWzE5IEZlYiAyMDAzXQoKICAqKSBJbiBzc2wzX2dldF9yZWNvcmQgKHNzbC9zM19wa3QuYyksIG1pbmltaXplIGluZm9ybWF0aW9uIGxlYWtlZAogICAgIHZpYSB0aW1pbmcgYnkgcGVyZm9ybWluZyBhIE1BQyBjb21wdXRhdGlvbiBldmVuIGlmIGluY29ycnJlY3QKICAgICBibG9jayBjaXBoZXIgcGFkZGluZyBoYXMgYmVlbiBmb3VuZC4gIFRoaXMgaXMgYSBjb3VudGVybWVhc3VyZQogICAgIGFnYWluc3QgYWN0aXZlIGF0dGFja3Mgd2hlcmUgdGhlIGF0dGFja2VyIGhhcyB0byBkaXN0aW5ndWlzaAogICAgIGJldHdlZW4gYmFkIHBhZGRpbmcgYW5kIGEgTUFDIHZlcmlmaWNhdGlvbiBlcnJvci4gKENWRS0yMDAzLTAwNzgpCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgQnJpY2UgQ2FudmVsIChFUEZMKSwKICAgICBBbGFpbiBIaWx0Z2VuIChVQlMpLCBTZXJnZSBWYXVkZW5heSAoRVBGTCksIGFuZAogICAgIE1hcnRpbiBWdWFnbm91eCAoRVBGTCwgSWxpb24pXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmcgYW5kIDAuOS42aCAgWzUgRGVjIDIwMDJdCgogICopIE5ldyBmdW5jdGlvbiBPUEVOU1NMX2NsZWFuc2UoKSwgd2hpY2ggaXMgdXNlZCB0byBjbGVhbnNlIGEgc2VjdGlvbiBvZgogICAgIG1lbW9yeSBmcm9tIGl0J3MgY29udGVudHMuICBUaGlzIGlzIGRvbmUgd2l0aCBhIGNvdW50ZXIgdGhhdCB3aWxsCiAgICAgcGxhY2UgYWx0ZXJuYXRpbmcgdmFsdWVzIGluIGVhY2ggYnl0ZS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc29sdmUKICAgICB0d28gaXNzdWVzOiAxKSB0aGUgcmVtb3ZhbCBvZiBjYWxscyB0byBtZW1zZXQoKSBieSBoaWdobHkgb3B0aW1pemluZwogICAgIGNvbXBpbGVycywgYW5kIDIpIGNsZWFuc2luZyB3aXRoIG90aGVyIHZhbHVlcyB0aGFuIDAsIHNpbmNlIHRob3NlIGNhbgogICAgIGJlIHJlYWQgdGhyb3VnaCBvbiBjZXJ0YWluIG1lZGlhLCBmb3IgZXhhbXBsZSBhIHN3YXAgc3BhY2Ugb24gZGlzay4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBCdWdmaXg6IGNsaWVudCBzaWRlIHNlc3Npb24gY2FjaGluZyBkaWQgbm90IHdvcmsgd2l0aCBleHRlcm5hbCBjYWNoaW5nLAogICAgIGJlY2F1c2UgdGhlIHNlc3Npb24tPmNpcGhlciBzZXR0aW5nIHdhcyBub3QgcmVzdG9yZWQgd2hlbiByZWxvYWRpbmcKICAgICBmcm9tIHRoZSBleHRlcm5hbCBjYWNoZS4gVGhpcyBwcm9ibGVtIHdhcyBtYXNrZWQsIHdoZW4KICAgICBTU0xfT1BfTkVUU0NBUEVfUkVVU0VfQ0lQSEVSX0NIQU5HRV9CVUcgKHBhcnQgb2YgU1NMX09QX0FMTCkgd2FzIHNldC4KICAgICAoRm91bmQgYnkgU3RldmUgSGFzbGFtIDxzdGV2ZUBhcmFxbmlkLmRkdHMubmV0Pi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBjbGllbnRfY2VydGlmaWNhdGUgKHNzbC9zMl9jbG50LmMpOiBUaGUgcGVybWlzc2libGUgdG90YWwKICAgICBsZW5ndGggb2YgdGhlIFJFUVVFU1QtQ0VSVElGSUNBVEUgbWVzc2FnZSBpcyAxOCAuLiAzNCwgbm90IDE3IC4uIDMzLgogICAgIFtaZWV2IExpZWJlciA8emVldi1sQHlhaG9vLmNvbT5dCgogICopIFVuZG8gYW4gdW5kb2N1bWVudGVkIGNoYW5nZSBpbnRyb2R1Y2VkIGluIDAuOS42ZSB3aGljaCBjYXVzZWQKICAgICByZXBlYXRlZCBjYWxscyB0byBPcGVuU1NMX2FkZF9hbGxfY2lwaGVycygpIGFuZCAKICAgICBPcGVuU1NMX2FkZF9hbGxfZGlnZXN0cygpIHRvIGJlIGlnbm9yZWQsIGV2ZW4gYWZ0ZXIgY2FsbGluZwogICAgIEVWUF9jbGVhbnVwKCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcmVhZGVyIHRvIGRlYWwgd2l0aCBsYXN0IGxpbmUgbm90CiAgICAgYmVpbmcgcHJvcGVybHkgdGVybWluYXRlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgWDUwOV9OQU1FX2NtcCgpIHNvIGl0IGFwcGxpZXMgdGhlIHNwZWNpYWwgcnVsZXMgb24gaGFuZGxpbmcKICAgICBETiB2YWx1ZXMgdGhhdCBhcmUgb2YgdHlwZSBQcmludGFibGVTdHJpbmcsIGFzIHdlbGwgYXMgUkROcyBvZiB0eXBlCiAgICAgZW1haWxBZGRyZXNzIHdoZXJlIHRoZSB2YWx1ZSBoYXMgdGhlIHR5cGUgaWE1U3RyaW5nLgogICAgIFtzdGVmYW5rQHZhbGljZXJ0LmNvbSB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgYSBTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9TVE9SRSBmbGFnIHRvIHRha2Ugb3ZlciBoYWxmCiAgICAgdGhlIGpvYiBTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9MT09LVVAgd2FzIGluY29uc2lzdGVudGx5CiAgICAgZG9pbmcsIGRlZmluZSBhIG5ldyBmbGFnIChTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTCkgdG8gYmUKICAgICB0aGUgYml0d2lzZS1PUiBvZiB0aGUgdHdvIGZvciB1c2UgYnkgdGhlIG1ham9yaXR5IG9mIGFwcGxpY2F0aW9ucwogICAgIHdhbnRpbmcgdGhpcyBiZWhhdmlvdXIsIGFuZCB1cGRhdGUgdGhlIGRvY3MuIFRoZSBkb2N1bWVudGVkCiAgICAgYmVoYXZpb3VyIGFuZCBhY3R1YWwgYmVoYXZpb3VyIHdlcmUgaW5jb25zaXN0ZW50IGFuZCBoYWQgYmVlbgogICAgIGNoYW5naW5nIGFueXdheSwgc28gdGhpcyBpcyBtb3JlIGEgYnVnLWZpeCB0aGFuIGEgYmVoYXZpb3VyYWwKICAgICBjaGFuZ2UuCiAgICAgW0dlb2ZmIFRob3JwZSwgZGlhZ25vc2VkIGJ5IE5hZGF2IEhhcidFbF0KCiAgKikgRG9uJ3QgaW1wb3NlIGEgMTYtYnl0ZSBsZW5ndGggbWluaW11bSBvbiBzZXNzaW9uIElEcyBpbiBzc2wvczNfY2xudC5jCiAgICAgKHRoZSBTU0wgMy4wIGFuZCBUTFMgMS4wIHNwZWNpZmljYXRpb25zIGFsbG93IGFueSBsZW5ndGggdXAgdG8gMzIgYnl0ZXMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBpbml0aWFsaXphdGlvbiBjb2RlIHJhY2UgY29uZGl0aW9ucyBpbgogICAgICAgIFNTTHYyM19tZXRob2QoKSwgIFNTTHYyM19jbGllbnRfbWV0aG9kKCksICAgU1NMdjIzX3NlcnZlcl9tZXRob2QoKSwKICAgICAgICBTU0x2Ml9tZXRob2QoKSwgICBTU0x2Ml9jbGllbnRfbWV0aG9kKCksICAgIFNTTHYyX3NlcnZlcl9tZXRob2QoKSwKICAgICAgICBTU0x2M19tZXRob2QoKSwgICBTU0x2M19jbGllbnRfbWV0aG9kKCksICAgIFNTTHYzX3NlcnZlcl9tZXRob2QoKSwKICAgICAgICBUTFN2MV9tZXRob2QoKSwgICBUTFN2MV9jbGllbnRfbWV0aG9kKCksICAgIFRMU3YxX3NlcnZlcl9tZXRob2QoKSwKICAgICAgICBzc2wyX2dldF9jaXBoZXJfYnlfY2hhcigpLAogICAgICAgIHNzbDNfZ2V0X2NpcGhlcl9ieV9jaGFyKCkuCiAgICAgW1BhdHJpY2sgTWNDb3JtaWNrIDxwYXRyaWNrQHRlbGxtZS5jb20+LCBCb2RvIE1vZWxsZXJdCgogICopIFJlb3JkZXIgY2xlYW51cCBzZXF1ZW5jZSBpbiBTU0xfQ1RYX2ZyZWUoKTogb25seSByZW1vdmUgdGhlIGV4X2RhdGEgYWZ0ZXIKICAgICB0aGUgY2FjaGVkIHNlc3Npb25zIGFyZSBmbHVzaGVkLCBhcyB0aGUgcmVtb3ZlX2NiKCkgbWlnaHQgdXNlIGV4X2RhdGEKICAgICBjb250ZW50cy4gQnVnIGZvdW5kIGJ5IFNhbSBWYXJzaGF2Y2hpayA8bXJzYW1AY291cmllci1tdGEuY29tPgogICAgIChzZWUgW29wZW5zc2wub3JnICMyMTJdKS4KICAgICBbR2VvZmYgVGhvcnBlLCBMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggdHlwbyBpbiBPQkpfdHh0Mm9iaiB3aGljaCBpbmNvcnJlY3RseSBwYXNzZWQgdGhlIGNvbnRlbnQKICAgICBsZW5ndGgsIGluc3RlYWQgb2YgdGhlIGVuY29kaW5nIGxlbmd0aCB0byBkMmlfQVNOMV9PQkpFQ1QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZmIGFuZCAwLjkuNmcgIFs5IEF1ZyAyMDAyXQoKICAqKSBbSW4gMC45LjZnLWVuZ2luZSByZWxlYXNlOl0KICAgICBGaXggY3J5cHRvL2VuZ2luZS92ZW5kb3JfZGVmbnMvY3N3aWZ0LmggZm9yIFdJTjMyICh1c2UgJ19zdGRjYWxsJykuCiAgICAgW0x5bm4gR2F6aXMgPGxnYXppc0ByYWluYm93LmNvbT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42ZSBhbmQgMC45LjZmICBbOCBBdWcgMjAwMl0KCiAgKikgRml4IEFTTjEgY2hlY2tzLiBDaGVjayBmb3Igb3ZlcmZsb3cgYnkgY29tcGFyaW5nIHdpdGggTE9OR19NQVgKICAgICBhbmQgZ2V0IGZpeCB0aGUgaGVhZGVyIGxlbmd0aCBjYWxjdWxhdGlvbi4KICAgICBbRmxvcmlhbiBXZWltZXIgPFdlaW1lckBDRVJULlVuaS1TdHV0dGdhcnQuREU+LAoJQWxvbiBLYW50b3IgPGFsb25rQGNoZWNrcG9pbnQuY29tPiAoYW5kIG90aGVycyksCglTdGV2ZSBIZW5zb25dCgogICopIFVzZSBwcm9wZXIgZXJyb3IgaGFuZGxpbmcgaW5zdGVhZCBvZiAnYXNzZXJ0aW9ucycgaW4gYnVmZmVyCiAgICAgb3ZlcmZsb3cgY2hlY2tzIGFkZGVkIGluIDAuOS42ZS4gIFRoaXMgcHJldmVudHMgRG9TICh0aGUKICAgICBhc3NlcnRpb25zIGNvdWxkIGNhbGwgYWJvcnQoKSkuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT4sIEJvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZkIGFuZCAwLjkuNmUgIFszMCBKdWwgMjAwMl0KCiAgKikgQWRkIHZhcmlvdXMgc2FuaXR5IGNoZWNrcyB0byBhc24xX2dldF9sZW5ndGgoKSB0byByZWplY3QKICAgICB0aGUgQVNOMSBsZW5ndGggYnl0ZXMgaWYgdGhleSBleGNlZWQgc2l6ZW9mKGxvbmcpLCB3aWxsIGFwcGVhcgogICAgIG5lZ2F0aXZlIG9yIHRoZSBjb250ZW50IGxlbmd0aCBleGNlZWRzIHRoZSBsZW5ndGggb2YgdGhlCiAgICAgc3VwcGxpZWQgYnVmZmVyLgogICAgIFtTdGV2ZSBIZW5zb24sIEFkaSBTdGF2IDxzdGF2QG1lcmN1cnkuY28uaWw+LCBKYW1lcyBZb25hbiA8amltQG50bHAuY29tPl0KCiAgKikgRml4IGNpcGhlciBzZWxlY3Rpb24gcm91dGluZXM6IGNpcGhlcnMgd2l0aG91dCBlbmNyeXB0aW9uIGhhZCBubyBmbGFncwogICAgIGZvciB0aGUgY2lwaGVyIHN0cmVuZ3RoIHNldCBhbmQgd2hlcmUgdGhlcmVmb3JlIG5vdCBoYW5kbGVkIGNvcnJlY3RseQogICAgIGJ5IHRoZSBzZWxlY3Rpb24gcm91dGluZXMgKFBSICMxMzApLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggRVZQX2RzYV9zaGEgbWFjcm8uCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBOZXcgb3B0aW9uCiAgICAgICAgICBTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTCiAgICAgZm9yIGRpc2FibGluZyB0aGUgU1NMIDMuMC9UTFMgMS4wIENCQyB2dWxuZXJhYmlsaXR5IGNvdW50ZXJtZWFzdXJlCiAgICAgdGhhdCB3YXMgYWRkZWQgaW4gT3BlblNTTCAwLjkuNmQuCgogICAgIEFzIHRoZSBjb3VudGVybWVhc3VyZSB0dXJuZWQgb3V0IHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIHNvbWUKICAgICBicm9rZW4gU1NMIGltcGxlbWVudGF0aW9ucywgdGhlIG5ldyBvcHRpb24gaXMgcGFydCBvZiBTU0xfT1BfQUxMLgogICAgIFNTTF9PUF9BTEwgaXMgdXN1YWxseSBlbXBsb3llZCB3aGVuIGNvbXBhdGliaWxpdHkgd2l0aCB3ZWlyZCBTU0wKICAgICBpbXBsZW1lbnRhdGlvbnMgaXMgZGVzaXJlZCAoZS5nLiAnLWJ1Z3MnIG9wdGlvbiB0byAnc19jbGllbnQnIGFuZAogICAgICdzX3NlcnZlcicpLCBzbyB0aGUgbmV3IG9wdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHNldCBpbiBtYW55CiAgICAgYXBwbGljYXRpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZXMgaW4gc2VjdXJpdHkgcGF0Y2g6CgogICAgIENoYW5nZXMgbWFya2VkICIoQ0hBVFMpIiB3ZXJlIHNwb25zb3JlZCBieSB0aGUgRGVmZW5zZSBBZHZhbmNlZAogICAgIFJlc2VhcmNoIFByb2plY3RzIEFnZW5jeSAoREFSUEEpIGFuZCBBaXIgRm9yY2UgUmVzZWFyY2ggTGFib3JhdG9yeSwKICAgICBBaXIgRm9yY2UgTWF0ZXJpZWwgQ29tbWFuZCwgVVNBRiwgdW5kZXIgYWdyZWVtZW50IG51bWJlcgogICAgIEYzMDYwMi0wMS0yLTA1MzcuCgogICopIEFkZCB2YXJpb3VzIHNhbml0eSBjaGVja3MgdG8gYXNuMV9nZXRfbGVuZ3RoKCkgdG8gcmVqZWN0CiAgICAgdGhlIEFTTjEgbGVuZ3RoIGJ5dGVzIGlmIHRoZXkgZXhjZWVkIHNpemVvZihsb25nKSwgd2lsbCBhcHBlYXIKICAgICBuZWdhdGl2ZSBvciB0aGUgY29udGVudCBsZW5ndGggZXhjZWVkcyB0aGUgbGVuZ3RoIG9mIHRoZQogICAgIHN1cHBsaWVkIGJ1ZmZlci4gKENWRS0yMDAyLTA2NTkpCiAgICAgW1N0ZXZlIEhlbnNvbiwgQWRpIFN0YXYgPHN0YXZAbWVyY3VyeS5jby5pbD4sIEphbWVzIFlvbmFuIDxqaW1AbnRscC5jb20+XQoKICAqKSBBc3NlcnRpb25zIGZvciB2YXJpb3VzIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3dzLCBub3Qga25vd24gdG8KICAgICBoYXBwZW4gaW4gcHJhY3RpY2UuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgVmFyaW91cyB0ZW1wb3JhcnkgYnVmZmVycyB0byBob2xkIEFTQ0lJIHZlcnNpb25zIG9mIGludGVnZXJzIHdlcmUKICAgICB0b28gc21hbGwgZm9yIDY0IGJpdCBwbGF0Zm9ybXMuIChDVkUtMjAwMi0wNjU1KQogICAgIFtNYXR0aGV3IEJ5bmctTWFkZGljayA8bWJtQGFsZGlnaXRhbC5jby51az4gYW5kIEJlbiBMYXVyaWUgKENIQVRTKT4KCiAgKikgUmVtb3RlIGJ1ZmZlciBvdmVyZmxvdyBpbiBTU0wzIHByb3RvY29sIC0gYW4gYXR0YWNrZXIgY291bGQKICAgICBzdXBwbHkgYW4gb3ZlcnNpemVkIHNlc3Npb24gSUQgdG8gYSBjbGllbnQuIChDVkUtMjAwMi0wNjU2KQogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIFJlbW90ZSBidWZmZXIgb3ZlcmZsb3cgaW4gU1NMMiBwcm90b2NvbCAtIGFuIGF0dGFja2VyIGNvdWxkCiAgICAgc3VwcGx5IGFuIG92ZXJzaXplZCBjbGllbnQgbWFzdGVyIGtleS4gKENWRS0yMDAyLTA2NTYpCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZjIGFuZCAwLjkuNmQgIFs5IE1heSAyMDAyXQoKICAqKSBGaXggY3J5cHRvL2FzbjEvYV9zaWduLmMgc28gdGhhdCAncGFyYW1ldGVycycgaXMgb21pdHRlZCAobm90CiAgICAgZW5jb2RlZCBhcyBOVUxMKSB3aXRoIGlkLWRzYS13aXRoLXNoYTEuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+OyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEJvZG8gTW9lbGxlcl0KCiAgKikgQ2hlY2sgdmFyaW91cyBYNTA5Xy4uLigpIHJldHVybiB2YWx1ZXMgaW4gYXBwcy9yZXEuYy4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEZpeCBCQVNFNjQgZGVjb2RlIChFVlBfRGVjb2RlVXBkYXRlKSBmb3IgZGF0YSB3aXRoIENSL0xGIGVuZGVkIGxpbmVzOgogICAgIGFuIGVuZC1vZi1maWxlIGNvbmRpdGlvbiB3b3VsZCBlcnJvbm91c2x5IGJlIGZsYWdnZWQsIHdoZW4gdGhlIENSTEYKICAgICB3YXMganVzdCBhdCB0aGUgZW5kIG9mIGEgcHJvY2Vzc2VkIGJsb2NrLiBUaGUgYnVnIHdhcyBkaXNjb3ZlcmVkIHdoZW4KICAgICBwcm9jZXNzaW5nIGRhdGEgdGhyb3VnaCBhIGJ1ZmZlcmluZyBtZW1vcnkgQklPIGhhbmRpbmcgdGhlIGRhdGEgdG8gYQogICAgIEJBU0U2NC1kZWNvZGluZyBCSU8uIEJ1ZyBmdW5kIGFuZCBwYXRjaCBzdWJtaXR0ZWQgYnkgUGF2ZWwgVHNla292CiAgICAgPHB0c2Vrb3ZAc3ludHJleC5jb20+IGFuZCBOZWRlbGNobyBTdGFuZXYuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEltcGxlbWVudCBhIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgYSB2dWxuZXJhYmlsaXR5IHJlY2VudGx5IGZvdW5kCiAgICAgaW4gQ0JDIGNpcGhlcnN1aXRlcyBpbiBTU0wgMy4wL1RMUyAxLjA6IFNlbmQgYW4gZW1wdHkgZnJhZ21lbnQKICAgICBiZWZvcmUgYXBwbGljYXRpb24gZGF0YSBjaHVua3MgdG8gYXZvaWQgdGhlIHVzZSBvZiBrbm93biBJVnMKICAgICB3aXRoIGRhdGEgcG90ZW50aWFsbHkgY2hvc2VuIGJ5IHRoZSBhdHRhY2tlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggbGVuZ3RoIGNoZWNrcyBpbiBzc2wzX2dldF9jbGllbnRfaGVsbG8oKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUTFMvU1NMIGxpYnJhcnkgYnVnZml4OiB1c2Ugcy0+czMtPmluX3JlYWRfYXBwX2RhdGEgZGlmZmVyZW50bHkKICAgICB0byBwcmV2ZW50IHNzbDNfcmVhZF9pbnRlcm5hbCgpIGZyb20gaW5jb3JyZWN0bHkgYXNzdW1pbmcgdGhhdAogICAgIHNzbDNfcmVhZF9ieXRlcygpIGZvdW5kIGFwcGxpY2F0aW9uIGRhdGEgd2hpbGUgaGFuZHNoYWtlCiAgICAgcHJvY2Vzc2luZyB3YXMgZW5hYmxlZCB3aGVuIGluIGZhY3Qgcy0+czMtPmluX3JlYWRfYXBwX2RhdGEgd2FzCiAgICAgbWVyZWx5IGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBkdXJpbmcgdGhlIGluaXRpYWwgaGFuZHNoYWtlLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgRml4IG9iamVjdCBkZWZpbml0aW9ucyBmb3IgUHJpdmF0ZSBhbmQgRW50ZXJwcmlzZTogdGhleSB3ZXJlIG5vdAogICAgIHJlY29nbml6ZWQgaW4gdGhlaXIgc2hvcnRuYW1lICg9bG93ZXJjYXNlKSByZXByZXNlbnRhdGlvbi4gRXh0ZW5kCiAgICAgb2JqX2RhdC5wbCB0byBpc3N1ZSBhbiBlcnJvciB3aGVuIHVzaW5nIHVuZGVmaW5lZCBrZXl3b3JkcyBpbnN0ZWFkCiAgICAgb2Ygc2lsZW50bHkgaWdub3JpbmcgdGhlIHByb2JsZW0gKFN2ZW5uaW5nIFNvcmVuc2VuCiAgICAgPHNzc0Bzc3MuZG5zYWxpYXMubmV0PikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBESF9nZW5lcmF0ZV9wYXJhbWV0ZXJzKCkgc28gdGhhdCBpdCB3b3JrcyBmb3IgJ25vbi1zdGFuZGFyZCcKICAgICBnZW5lcmF0b3JzLCBpLmUuIGdlbmVyYXRvcnMgb3RoZXIgdGhhbiAyIGFuZCA1LiAgKFByZXZpb3VzbHksIHRoZQogICAgIGNvZGUgZGlkIG5vdCBwcm9wZXJseSBpbml0aWFsaXNlIHRoZSAnYWRkJyBhbmQgJ3JlbScgdmFsdWVzIHRvCiAgICAgQk5fZ2VuZXJhdGVfcHJpbWUoKS4pCgogICAgIEluIHRoZSBuZXcgZ2VuZXJhbCBjYXNlLCB3ZSBkbyBub3QgaW5zaXN0IHRoYXQgJ2dlbmVyYXRvcicgaXMKICAgICBhY3R1YWxseSBhIHByaW1pdGl2ZSByb290OiBUaGlzIHJlcXVpcmVtZW50IGlzIHJhdGhlciBwb2ludGxlc3M7CiAgICAgYSBnZW5lcmF0b3Igb2YgdGhlIG9yZGVyLXEgc3ViZ3JvdXAgaXMganVzdCBhcyBnb29kLCBpZiBub3QKICAgICBiZXR0ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KIAogICopIE1hcCBuZXcgWDUwOSB2ZXJpZmljYXRpb24gZXJyb3JzIHRvIGFsZXJ0cy4gRGlzY292ZXJlZCBhbmQgc3VibWl0dGVkIGJ5CiAgICAgVG9tIFd1IDx0b21AYXJjb3QuY29tPi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IHNzbDNfcGVuZGluZygpIChzc2wvczNfbGliLmMpIHRvIHByZXZlbnQgU1NMX3BlbmRpbmcoKSBmcm9tCiAgICAgcmV0dXJuaW5nIG5vbi16ZXJvIGJlZm9yZSB0aGUgZGF0YSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlY2VpdmVkCiAgICAgd2hlbiB1c2luZyBub24tYmxvY2tpbmcgSS9PLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgSm9obiBIdWdoZXNdCgogICopIFNvbWUgb2YgdGhlIGNpcGhlcnMgbWlzc2VkIHRoZSBzdHJlbmd0aCBlbnRyeSAoU1NMX0xPVyBldGMpLgogICAgIFtCZW4gTGF1cmllLCBMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggYnVnIGluIFNTTF9jbGVhcigpOiBiYWQgc2Vzc2lvbnMgd2VyZSBub3QgcmVtb3ZlZCAoZm91bmQgYnkKICAgICBZb3JhbSBaYWhhdmkgPFlvcmFtWkBnaWxpYW4uY29tPikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBDeWdXaW4gMS4zIGFuZCBvbiwgYW5kIHByZXNlcnZlIHByb3BlcgogICAgIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB2ZXJzaW9ucyBiZWZvcmUgdGhhdC4KICAgICBbQ29yaW5uYSBWaW5zY2hlbiA8dmluc2NoZW5AcmVkaGF0LmNvbT4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSByZW1vdmFsIGZyb20gc2Vzc2lvbiBjYWNoZSAoU1NMX0NUWF9yZW1vdmVfc2Vzc2lvbigpKSBtb3JlIHJvYnVzdDoKICAgICBjaGVjayB3aGV0aGVyIHdlIGRlYWwgd2l0aCBhIGNvcHkgb2YgYSBzZXNzaW9uIGFuZCBkbyBub3QgZGVsZXRlIGZyb20KICAgICB0aGUgY2FjaGUgaW4gdGhpcyBjYXNlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5ICJJemhhciBTaG9zaGFuaSBMZXZpIgogICAgIDxpemhhckBjaGVja3BvaW50LmNvbT4uCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIERvIG5vdCBzdG9yZSBzZXNzaW9uIGRhdGEgaW50byB0aGUgaW50ZXJuYWwgc2Vzc2lvbiBjYWNoZSwgaWYgaXQKICAgICBpcyBuZXZlciBpbnRlbmRlZCB0byBiZSBsb29rZWQgdXAgKFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX0xPT0tVUAogICAgIGZsYWcgaXMgc2V0KS4gUHJvcG9zZWQgYnkgQXNsYW0gPGFzbGFtQGZ1bmsuY29tPi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSGF2ZSBBU04xX0JJVF9TVFJJTkdfc2V0X2JpdCgpIHJlYWxseSBjbGVhciBhIGJpdCB3aGVuIHRoZSByZXF1ZXN0ZWQKICAgICB2YWx1ZSBpcyAwLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFtJbiAwLjkuNmQtZW5naW5lIHJlbGVhc2U6XQogICAgIEZpeCBhIGNyYXNoYnVnIGFuZCBhIGxvZ2ljIGJ1ZyBpbiBod2NyaGtfbG9hZF9wdWJrZXkoKS4KICAgICBbVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgY29uZmlndXJhdGlvbiB0YXJnZXQgbGludXgtczM5MHguCiAgICAgW05lYWxlIEZlcmd1c29uIDxOZWFsZS5GZXJndXNvbkBTb2Z0d2FyZUFHLVVTQS5jb20+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIFRoZSBlYXJsaWVyIGJ1Z2ZpeCBmb3IgdGhlIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0MgY2FzZSBvZgogICAgIHNzbDNfYWNjZXB0IChzc2wvczNfc3J2ci5jKSBpbmNvcnJlY3RseSB1c2VkIGEgbG9jYWwgZmxhZwogICAgIHZhcmlhYmxlIGFzIGFuIGluZGljYXRpb24gdGhhdCBhIENsaWVudEhlbGxvIG1lc3NhZ2UgaGFzIGJlZW4KICAgICByZWNlaXZlZC4gIEFzIHRoZSBmbGFnIHZhbHVlIHdpbGwgYmUgbG9zdCBiZXR3ZWVuIG11bHRpcGxlCiAgICAgaW52b2NhdGlvbnMgb2Ygc3NsM19hY2NlcHQgd2hlbiB1c2luZyBub24tYmxvY2tpbmcgSS9PLCB0aGUKICAgICBmdW5jdGlvbiBtYXkgbm90IGJlIGF3YXJlIHRoYXQgYSBoYW5kc2hha2UgaGFzIGFjdHVhbGx5IHRha2VuCiAgICAgcGxhY2UsIHRodXMgcHJldmVudGluZyBhIG5ldyBzZXNzaW9uIGZyb20gYmVpbmcgYWRkZWQgdG8gdGhlCiAgICAgc2Vzc2lvbiBjYWNoZS4KCiAgICAgVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCB3ZSBub3cgc2V0IHMtPm5ld19zZXNzaW9uIHRvIDIgaW5zdGVhZCBvZgogICAgIHVzaW5nIGEgbG9jYWwgdmFyaWFibGUuCiAgICAgW0x1dHogSmFlbmlja2UsIEJvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4OiBSZXR1cm4gLTEgZnJvbSBzc2wzX2dldF9zZXJ2ZXJfZG9uZSAoc3NsMy9zM19jbG50LmMpCiAgICAgaWYgdGhlIFNTTF9SX0xFTkdUSF9NSVNNQVRDSCBlcnJvciBpcyBkZXRlY3RlZC4KICAgICBbR2VvZmYgVGhvcnBlLCBCb2RvIE1vZWxsZXJdCgogICopIE5ldyAnc2hhcmVkX2xkZmxhZycgY29sdW1uIGluIENvbmZpZ3VyZSBwbGF0Zm9ybSB0YWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggRVZQX0NJUEhFUl9tb2RlIG1hY3JvLgogICAgIFsiRGFuIFMuIENhbXBlciIgPGRhbkBidGkubmV0Pl0KCiAgKikgRml4IHNzbDNfcmVhZF9ieXRlcyAoc3NsL3MzX3BrdC5jKTogVG8gaWdub3JlIG1lc3NhZ2VzIG9mIHVua25vd24KICAgICB0eXBlLCB3ZSBtdXN0IHRocm93IHRoZW0gYXdheSBieSBzZXR0aW5nIHJyLT5sZW5ndGggdG8gMC4KICAgICBbRCBQIENoYW5nIDxkcGNAcXVhbHlzLmNvbT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42YiBhbmQgMC45LjZjICBbMjEgZGVjIDIwMDFdCgogICopIEZpeCBCTl9yYW5kX3JhbmdlIGJ1ZyBwb2ludGVkIG91dCBieSBEb21pbmlrdXMgU2NoZXJrbAogICAgIDxEb21pbmlrdXMuU2NoZXJrbEBiaW9kYXRhLmNvbT4uICAoVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uCiAgICAgd29ya2VkIGluY29ycmVjdGx5IGZvciB0aG9zZSBjYXNlcyB3aGVyZSAgcmFuZ2UgPSAxMC4uLl8yICBhbmQKICAgICAzKnJhbmdlICBpcyB0d28gYml0cyBsb25nZXIgdGhhbiAgcmFuZ2UuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE9ubHkgYWRkIHNpZ25pbmcgdGltZSB0byBQS0NTNyBzdHJ1Y3R1cmVzIGlmIGl0IGlzIG5vdCBhbHJlYWR5CiAgICAgcHJlc2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggY3J5cHRvL29iamVjdHMvb2JqZWN0cy5oOiAibGQtY2UiIHNob3VsZCBiZSAiaWQtY2UiLAogICAgIE9CSl9sZF9jZSBzaG91bGQgYmUgT0JKX2lkX2NlLgogICAgIEFsc28gc29tZSBpcC1wZGEgT0lEcyBpbiBjcnlwdG8vb2JqZWN0cy9vYmplY3RzLnR4dCB3ZXJlCiAgICAgaW5jb3JyZWN0IChjZi4gUkZDIDMwMzkpLgogICAgIFtNYXR0IENvb3BlciwgRnJlZGVyaWMgR2l1ZGljZWxsaSwgQm9kbyBNb2VsbGVyXQoKICAqKSBSZWxlYXNlIENSWVBUT19MT0NLX0RZTkxPQ0sgd2hlbiBDUllQVE9fZGVzdHJveV9keW5sb2NraWQoKQogICAgIHJldHVybnMgZWFybHkgYmVjYXVzZSBpdCBoYXMgbm90aGluZyB0byBkby4KICAgICBbQW5keSBTY2huZWlkZXIgPGFuZHkuc2NobmVpZGVyQGJqc3MuY28udWs+XQoKICAqKSBbSW4gMC45LjZjLWVuZ2luZSByZWxlYXNlOl0KICAgICBGaXggbXV0ZXggY2FsbGJhY2sgcmV0dXJuIHZhbHVlcyBpbiBjcnlwdG8vZW5naW5lL2h3X25jaXBoZXIuYy4KICAgICBbQW5keSBTY2huZWlkZXIgPGFuZHkuc2NobmVpZGVyQGJqc3MuY28udWs+XQoKICAqKSBbSW4gMC45LjZjLWVuZ2luZSByZWxlYXNlOl0KICAgICBBZGQgc3VwcG9ydCBmb3IgQ3J5cHRvZ3JhcGhpYyBBcHBsaWFuY2UncyBrZXlzZXJ2ZXIgdGVjaG5vbG9neS4KICAgICAoVXNlIGVuZ2luZSAna2V5Y2xpZW50JykKICAgICBbQ3J5cHRvZ3JhcGhpYyBBcHBsaWFuY2VzIGFuZCBHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhIGNvbmZpZ3VyYXRpb24gZW50cnkgZm9yIE9TLzM5MCBVbml4LiAgVGhlIEMgY29tcGlsZXIgJ2M4OScKICAgICBpcyBjYWxsZWQgdmlhIHRvb2xzL2M4OS5zaCBiZWNhdXNlIGFyZ3VtZW50cyBoYXZlIHRvIGJlCiAgICAgcmVhcnJhbmdlZCAoYWxsICctTCcgb3B0aW9ucyBtdXN0IGFwcGVhciBiZWZvcmUgdGhlIGZpcnN0IG9iamVjdAogICAgIG1vZHVsZXMpLgogICAgIFtSaWNoYXJkIFNoYXBpcm8gPHJzaGFwaXJvQGFiaW5pdGlvLmNvbT5dCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEFkZCBzdXBwb3J0IGZvciBCcm9hZGNvbSBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMsIGJhY2twb3J0ZWQKICAgICBmcm9tIDAuOS43LgogICAgIFtCcm9hZGNvbSwgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPiwgTWFyayBDb3hdCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEFkZCBzdXBwb3J0IGZvciBTdXJlV2FyZSBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMgZnJvbSAKICAgICBCYWx0aW1vcmUgVGVjaG5vbG9naWVzLiAgKFVzZSBlbmdpbmUgJ3N1cmV3YXJlJykKICAgICBbQmFsdGltb3JlIFRlY2hub2xvZ2llcyBhbmQgTWFyayBDb3hdCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEFkZCBzdXBwb3J0IGZvciBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMgZnJvbSBBY2NlbGVyYXRlZAogICAgIEVuY3J5cHRpb24gUHJvY2Vzc2luZywgd3d3LmFlcC5pZS4gIChVc2UgZW5naW5lICdhZXAnKQogICAgIFtBRVAgSW5jLiBhbmQgTWFyayBDb3hdCgogICopIEFkZCBhIGNvbmZpZ3VyYXRpb24gZW50cnkgZm9yIGdjYyBvbiBVbml4V2FyZS4KICAgICBbR2FyeSBCZW5zb24gPGdiZW5zb25AcmVkaGF0LmNvbT5dCgogICopIENoYW5nZSBzc2wvczJfY2xudC5jIGFuZCBzc2wvczJfc3J2ci5jIHNvIHRoYXQgcmVjZWl2ZWQgaGFuZHNoYWtlCiAgICAgbWVzc2FnZXMgYXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBwaWVjZSAoZml4ZWQtbGVuZ3RoIHBhcnQgYW5kCiAgICAgdmFyaWFibGUtbGVuZ3RoIHBhcnQgY29tYmluZWQpIGFuZCBmaXggdmFyaW91cyBidWdzIGZvdW5kIG9uIHRoZSB3YXkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSBjYWNoaW5nIGluIEJJT19nZXRob3N0YnluYW1lKCksIGRpcmVjdGx5IHVzZSBnZXRob3N0YnluYW1lKCkKICAgICBpbnN0ZWFkLiAgQklPX2dldGhvc3RieW5hbWUoKSBkb2VzIG5vdCBrbm93IHdoYXQgdGltZW91dHMgYXJlCiAgICAgYXBwcm9wcmlhdGUsIHNvIGVudHJpZXMgd291bGQgc3RheSBpbiBjYWNoZSBldmVuIHdoZW4gdGhleSBoYXZlCiAgICAgYmVjb21lIGludmFsaWQuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBSaWNoIFNhbHogPHJzYWx6QHpvbGVyYS5jb20+CgogICopIENoYW5nZSBzc2wyM19nZXRfY2xpZW50X2hlbGxvIChzc2wvczIzX3NydnIuYykgYmVoYXZpb3VyIHdoZW4KICAgICBmYWNlZCB3aXRoIGEgcGF0aG9sb2dpY2FsbHkgc21hbGwgQ2xpZW50SGVsbG8gZnJhZ21lbnQgdGhhdCBkb2VzCiAgICAgbm90IGNvbnRhaW4gY2xpZW50X3ZlcnNpb246IEluc3RlYWQgb2YgYWJvcnRpbmcgd2l0aCBhbiBlcnJvciwKICAgICBzaW1wbHkgY2hvb3NlIHRoZSBoaWdoZXN0IGF2YWlsYWJsZSBwcm90b2NvbCB2ZXJzaW9uIChpLmUuLAogICAgIFRMUyAxLjAgdW5sZXNzIGl0IGlzIGRpc2FibGVkKS4gIEluIHByYWN0aWNlLCBDbGllbnRIZWxsbwogICAgIG1lc3NhZ2VzIGFyZSBuZXZlciBzZW50IGxpa2UgdGhpcywgYnV0IHRoaXMgY2hhbmdlIGdpdmVzIHVzCiAgICAgc3RyaWN0bHkgY29ycmVjdCBiZWhhdmlvdXIgYXQgbGVhc3QgZm9yIFRMUy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggU1NMIGhhbmRzaGFrZSBmdW5jdGlvbnMgYW5kIFNTTF9jbGVhcigpIHN1Y2ggdGhhdCBTU0xfY2xlYXIoKQogICAgIG5ldmVyIHJlc2V0cyBzLT5tZXRob2QgdG8gcy0+Y3R4LT5tZXRob2Qgd2hlbiBjYWxsZWQgZnJvbSB3aXRoaW4KICAgICBvbmUgb2YgdGhlIFNTTCBoYW5kc2hha2UgZnVuY3Rpb25zLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTmlrbyBCYXJpY10KCiAgKikgSW4gc3NsM19nZXRfY2xpZW50X2hlbGxvIChzc2wvczNfc3J2ci5jKSwgZ2VuZXJhdGUgYSBmYXRhbCBhbGVydAogICAgIChzZW50IHVzaW5nIHRoZSBjbGllbnQncyB2ZXJzaW9uIG51bWJlcikgaWYgY2xpZW50X3ZlcnNpb24gaXMKICAgICBzbWFsbGVyIHRoYW4gdGhlIHByb3RvY29sIHZlcnNpb24gaW4gdXNlLiAgQWxzbyBjaGFuZ2UKICAgICBzc2wyM19nZXRfY2xpZW50X2hlbGxvIChzc2wvczIzX3NydnIuYykgdG8gc2VsZWN0IFRMUyAxLjAgaWYKICAgICB0aGUgY2xpZW50IGRlbWFuZGVkIFNTTCAzLjAgYnV0IG9ubHkgVExTIDEuMCBpcyBlbmFibGVkOyB0aGVuCiAgICAgdGhlIGNsaWVudCB3aWxsIGF0IGxlYXN0IHNlZSB0aGF0IGFsZXJ0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBzc2wzX2dldF9tZXNzYWdlIChzc2wvczNfYm90aC5jKSB0byBoYW5kbGUgbWVzc2FnZSBmcmFnbWVudGF0aW9uCiAgICAgY29ycmVjdGx5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEF2b2lkIGluZmluaXRlIGxvb3AgaW4gc3NsM19nZXRfbWVzc2FnZSAoc3NsL3MzX2JvdGguYykgaWYgYQogICAgIGNsaWVudCByZWNlaXZlcyBIZWxsb1JlcXVlc3Qgd2hpbGUgaW4gYSBoYW5kc2hha2UuCiAgICAgW0JvZG8gTW9lbGxlcjsgYnVnIG5vdGljZWQgYnkgQW5keSBTY2huZWlkZXIgPGFuZHkuc2NobmVpZGVyQGJqc3MuY28udWs+XQoKICAqKSBCdWdmaXggaW4gc3NsM19hY2NlcHQgKHNzbC9zM19zcnZyLmMpOiBDYXNlIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0MKICAgICBzaG91bGQgZW5kIGluICdicmVhaycsIG5vdCAnZ290byBlbmQnIHdoaWNoIGNpcmN1bXZlbnRzIHZhcmlvdXMKICAgICBjbGVhbnVwcyBkb25lIGluIHN0YXRlIFNTTF9TVF9PSy4gICBCdXQgc2Vzc2lvbiByZWxhdGVkIHN0dWZmCiAgICAgbXVzdCBiZSBkaXNhYmxlZCBmb3IgU1NMX1NUX09LIGluIHRoZSBjYXNlIHRoYXQgd2UganVzdCBzZW50IGEKICAgICBIZWxsb1JlcXVlc3QuCgogICAgIEFsc28gYXZvaWQgc29tZSBvdmVyaGVhZCBieSBub3QgY2FsbGluZyBzc2xfaW5pdF93YmlvX2J1ZmZlcigpCiAgICAgYmVmb3JlIGp1c3Qgc2VuZGluZyBhIEhlbGxvUmVxdWVzdC4KICAgICBbQm9kbyBNb2VsbGVyLCBFcmljIFJlc2NvcmxhIDxla3JAcnRmbS5jb20+XQoKICAqKSBGaXggc3NsL3MzX2VuYy5jLCBzc2wvdDFfZW5jLmMgYW5kIHNzbC9zM19wa3QuYyBzbyB0aGF0IHdlIGRvbid0CiAgICAgcmV2ZWFsIHdoZXRoZXIgaWxsZWdhbCBibG9jayBjaXBoZXIgcGFkZGluZyB3YXMgZm91bmQgb3IgYSBNQUMKICAgICB2ZXJpZmljYXRpb24gZXJyb3Igb2NjdXJlZC4gIChOZWl0aGVyIFNTTGVycigpIGNvZGVzIG5vciBhbGVydHMKICAgICBhcmUgZGlyZWN0bHkgdmlzaWJsZSB0byBwb3RlbnRpYWwgYXR0YWNrZXJzLCBidXQgdGhlIGluZm9ybWF0aW9uCiAgICAgbWF5IGxlYWsgdmlhIGxvZ2ZpbGVzLikKCiAgICAgU2ltaWxhciBjaGFuZ2VzIGFyZSBub3QgcmVxdWlyZWQgZm9yIHRoZSBTU0wgMi4wIGltcGxlbWVudGF0aW9uCiAgICAgYmVjYXVzZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaXMgc2VudCBpbiBjbGVhciBmb3IgU1NMIDIuMCwKICAgICBhbmQgdGhlIGV4dHJhIGJ5dGVzIGFyZSBqdXN0IGlnbm9yZWQuICBIb3dldmVyIHNzbC9zMl9wa3QuYwogICAgIGZhaWxlZCB0byB2ZXJpZnkgdGhhdCB0aGUgcHVycG9ydGVkIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGlzIGluCiAgICAgdGhlIGxlZ2FsIHJhbmdlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBPcGVuVU5JWC04IHN1cHBvcnQgaW5jbHVkaW5nIHNoYXJlZCBsaWJyYXJpZXMKICAgICAoQm95ZCBMeW5uIEdlcmJlciA8Z2VyYmVyYkB6ZW5lei5jb20+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSW1wcm92ZSBSU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQKCkgY2hlY2sgYWdhaW4gdG8gYXZvaWQKICAgICAnd3Jpc3R3YXRjaCBhdHRhY2snIHVzaW5nIGh1Z2UgZW5jb2RpbmcgcGFyYW1ldGVycyAoY2YuCiAgICAgSmFtZXMgSC4gTWFuZ2VyJ3MgQ1JZUFRPIDIwMDEgcGFwZXIpLiAgTm90ZSB0aGF0IHRoZQogICAgIFJTQV9QS0NTMV9PQUVQX1BBRERJTkcgY2FzZSBvZiBSU0FfcHJpdmF0ZV9kZWNyeXB0KCkgZG9lcyBub3QgdXNlCiAgICAgZW5jb2RpbmcgcGFyYW1ldGVycyBhbmQgaGVuY2Ugd2FzIG5vdCB2dWxuZXJhYmxlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJOX3NxcigpIGJ1ZyBmaXguCiAgICAgW1VsZiBN9mxsZXIsIHJlcG9ydGVkIGJ5IEppbSBFbGxpcyA8amltLmVsbGlzQGNhdml1bS5jb20+XQoKICAqKSBSYWJpbi1NaWxsZXIgdGVzdCBhbmFseXNlcyBhc3N1bWUgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIHdpdG5lc3NlcywKICAgICBzbyB1c2UgQk5fcHNldWRvX3JhbmRfcmFuZ2UoKSBpbnN0ZWFkIG9mIHVzaW5nIEJOX3BzZXVkb19yYW5kKCkKICAgICBmb2xsb3dlZCBieSBtb2R1bGFyIHJlZHVjdGlvbi4KICAgICBbQm9kbyBNb2VsbGVyOyBwb2ludGVkIG91dCBieSBBZGFtIFlvdW5nIDxBWW91bmcxQE5DU1VTLkpOSi5DT00+XQoKICAqKSBBZGQgQk5fcHNldWRvX3JhbmRfcmFuZ2UoKSB3aXRoIG9idmlvdXMgZnVuY3Rpb25hbGl0eTogQk5fcmFuZF9yYW5nZSgpCiAgICAgZXF1aXZhbGVudCBiYXNlZCBvbiBCTl9wc2V1ZG9fcmFuZCgpIGluc3RlYWQgb2YgQk5fcmFuZCgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIHMzX3NydnIuYzogYWxsb3cgc2VuZGluZyBvZiBsYXJnZSBjbGllbnQgY2VydGlmaWNhdGUgbGlzdHMgKD4gMTYga0IpLgogICAgIFRoaXMgZnVuY3Rpb24gd2FzIGJyb2tlbiwgYXMgdGhlIGNoZWNrIGZvciBhIG5ldyBjbGllbnQgaGVsbG8gbWVzc2FnZQogICAgIHRvIGhhbmRsZSBTR0MgZGlkIG5vdCBhbGxvdyB0aGVzZSBsYXJnZSBtZXNzYWdlcy4KICAgICAoVHJhY2tlZCBkb3duIGJ5ICJEb3VnbGFzIEUuIEVuZ2VydCIgPGRlZW5nZXJ0QGFubC5nb3Y+LikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQWRkIGFsZXJ0IGRlc2NyaXB0aW9ucyBmb3IgVExTdjEgdG8gU1NMX2FsZXJ0X2Rlc2Nfc3RyaW5nW19sb25nXSgpLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggYnVnZ3kgYmVoYXZpb3VyIG9mIEJJT19nZXRfbnVtX3JlbmVnb3RpYXRlcygpIGFuZCBCSU9fY3RybCgpCiAgICAgZm9yIEJJT19DX0dFVF9XUklURV9CVUZfU0laRSAoIlN0ZXBoZW4gSGludG9uIiA8c2hpbnRvbkBuZXRvcGlhLmNvbT4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBSZXdvcmsgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIFRydTY0IFVuaXguCiAgICAgVGhlIGNvbmZpZ3VyYXRpb24gcGFydCBtYWtlcyB1c2Ugb2YgbW9kZXJuIGNvbXBpbGVyIGZlYXR1cmVzIGFuZAogICAgIHN0aWxsIHJldGFpbnMgb2xkIGNvbXBpbGVyIGJlaGF2aW9yIGZvciB0aG9zZSB0aGF0IHJ1biBvbGRlciB2ZXJzaW9ucwogICAgIG9mIHRoZSBPUy4gIFRoZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHBhcnQgaW5jbHVkZXMgYSB2YXJpYW50IHRoYXQKICAgICB1c2VzIHRoZSBSUEFUSCBmZWF0dXJlLCBhbmQgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHNwZWNpYWwKICAgICBjb25maWd1cmF0aW9uIHRhcmdldCAiYWxwaGEtY2MtcnBhdGgiLCB3aGljaCB3aWxsIG5ldmVyIGJlIHNlbGVjdGVkCiAgICAgYXV0b21hdGljYWxseS4KICAgICBbVGltIE1vb25leSA8bW9vbmV5QGRvZ2JlcnQuY2MubmRzdS5Ob0Rhay5lZHU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEluIHNzbDNfZ2V0X2tleV9leGNoYW5nZSAoc3NsL3MzX2NsbnQuYyksIGNhbGwgc3NsM19nZXRfbWVzc2FnZSgpCiAgICAgd2l0aCB0aGUgc2FtZSBtZXNzYWdlIHNpemUgYXMgaW4gc3NsM19nZXRfY2VydGlmaWNhdGVfcmVxdWVzdCgpLgogICAgIE90aGVyd2lzZSwgaWYgbm8gU2VydmVyS2V5RXhjaGFuZ2UgbWVzc2FnZSBvY2N1cnMsIENlcnRpZmljYXRlUmVxdWVzdAogICAgIG1lc3NhZ2VzIG1pZ2h0IGluYWR2ZXJ0ZW50bHkgYmUgcmVqZWN0IGFzIHRvbyBsb25nLgogICAgIFtQZXRyIExhbXBhIDxsYW1wYUBmZWUudnV0YnIuY3o+XQoKICAqKSBFbmhhbmNlZCBzdXBwb3J0IGZvciBJQS02NCBVbml4IHBsYXRmb3JtcyAod2VsbCwgTGludXggYW5kIEhQLVVYKS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTW9kaWZpZWQgU1NMIGxpYnJhcnkgc3VjaCB0aGF0IHRoZSB2ZXJpZnlfY2FsbGJhY2sgdGhhdCBoYXMgYmVlbiBzZXQKICAgICBzcGVjaWZpY2x5IGZvciBhbiBTU0wgb2JqZWN0IHdpdGggU1NMX3NldF92ZXJpZnkoKSBpcyBhY3R1YWxseSBiZWluZwogICAgIHVzZWQuIEJlZm9yZSB0aGUgY2hhbmdlLCBhIHZlcmlmeV9jYWxsYmFjayBzZXQgd2l0aCB0aGlzIGZ1bmN0aW9uIHdhcwogICAgIGlnbm9yZWQgYW5kIHRoZSB2ZXJpZnlfY2FsbGJhY2soKSBzZXQgaW4gdGhlIFNTTF9DVFggYXQgdGhlIHRpbWUgb2YKICAgICB0aGUgY2FsbCB3YXMgdXNlZC4gTmV3IGZ1bmN0aW9uIFg1MDlfU1RPUkVfQ1RYX3NldF92ZXJpZnlfY2IoKSBpbnRyb2R1Y2VkCiAgICAgdG8gYWxsb3cgdGhlIG5lY2Vzc2FyeSBzZXR0aW5ncy4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSW5pdGlhbGl6ZSBzdGF0aWMgdmFyaWFibGUgaW4gY3J5cHRvL2RzYS9kc2FfbGliLmMgYW5kIGNyeXB0by9kaC9kaF9saWIuYwogICAgIGV4cGxpY2l0bHkgdG8gTlVMTCwgYXMgYXQgbGVhc3Qgb24gU29sYXJpcyA4IHRoaXMgc2VlbXMgbm90IGFsd2F5cyB0byBiZQogICAgIGRvbmUgYXV0b21hdGljYWxseSAoaW4gY29udHJhZGljdGlvbiB0byB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBDCiAgICAgc3RhbmRhcmQpLiBUaGlzIG1hZGUgcHJvYmxlbXMgd2hlbiB1c2VkIGZyb20gT3BlblNTSC4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSW4gT3BlblNTTCAwLjkuNmEgYW5kIDAuOS42YiwgY3J5cHRvL2RoL2RoX2tleS5jIGlnbm9yZWQKICAgICBkaC0+bGVuZ3RoIGFuZCBhbHdheXMgdXNlZAoKICAgICAgICAgIEJOX3JhbmRfcmFuZ2UocHJpdl9rZXksIGRoLT5wKS4KCiAgICAgQk5fcmFuZF9yYW5nZSgpIGlzIG5vdCBuZWNlc3NhcnkgZm9yIERpZmZpZS1IZWxsbWFuLCBhbmQgdGhpcwogICAgIHNwZWNpZmljIHJhbmdlIG1ha2VzIERpZmZpZS1IZWxsbWFuIHVubmVjZXNzYXJpbHkgaW5lZmZpY2llbnQgaWYKICAgICBkaC0+bGVuZ3RoIChyZWNvbW1lbmRlZCBleHBvbmVudCBsZW5ndGgpIGlzIG11Y2ggc21hbGxlciB0aGFuIHRoZQogICAgIGxlbmd0aCBvZiBkaC0+cC4gIFdlIGNvdWxkIHVzZSBCTl9yYW5kX3JhbmdlKCkgaWYgdGhlIG9yZGVyIG9mCiAgICAgdGhlIHN1Ymdyb3VwIHdhcyBzdG9yZWQgaW4gdGhlIERIIHN0cnVjdHVyZSwgYnV0IHdlIG9ubHkgaGF2ZQogICAgIGRoLT5sZW5ndGguCgogICAgIFNvIHN3aXRjaCBiYWNrIHRvCgogICAgICAgICAgQk5fcmFuZChwcml2X2tleSwgbCwgLi4uKQoKICAgICB3aGVyZSAnbCcgaXMgZGgtPmxlbmd0aCBpZiB0aGlzIGlzIGRlZmluZWQsIG9yIEJOX251bV9iaXRzKGRoLT5wKS0xCiAgICAgb3RoZXJ3aXNlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluCgogICAgICAgICAgUlNBX2VheV9wdWJsaWNfZW5jcnlwdAogICAgICAgICAgUlNBX2VheV9wcml2YXRlX2RlY3J5cHQKICAgICAgICAgIFJTQV9lYXlfcHJpdmF0ZV9lbmNyeXB0IChzaWduaW5nKQogICAgICAgICAgUlNBX2VheV9wdWJsaWNfZGVjcnlwdCAoc2lnbmF0dXJlIHZlcmlmaWNhdGlvbikKCiAgICAgKGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBSU0FfcHVibGljX2VuY3J5cHQsCiAgICAgUlNBX3ByaXZhdGVfZGVjcnlwdCwgUlNBX3ByaXZhdGVfZW5jcnlwdCwgUlNBX3B1YmxpY19kZWNyeXB0KSwKICAgICBhbHdheXMgcmVqZWN0IG51bWJlcnMgPj0gbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBjcnlwdG8vcmFuZC9tZF9yYW5kLmMsIHVzZSBhIG5ldyBzaG9ydC10aW1lIGxvY2sgQ1JZUFRPX0xPQ0tfUkFORDIKICAgICB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gJ2xvY2tpbmdfdGhyZWFkJy4gIFRoaXMgaXMgbmVjZXNzYXJ5IG9uCiAgICAgc3lzdGVtcyB3aGVyZSBhY2Nlc3MgdG8gJ2xvY2tpbmdfdGhyZWFkJyAoYW4gJ3Vuc2lnbmVkIGxvbmcnCiAgICAgdmFyaWFibGUpIGlzIG5vdCBhdG9taWMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gY3J5cHRvL3JhbmQvbWRfcmFuZC5jLCBzZXQgJ2xvY2tpbmdfdGhyZWFkJyB0byBjdXJyZW50IHRocmVhZCdzIElECiAgICAgKmJlZm9yZSogc2V0dGluZyB0aGUgJ2NyeXB0b19sb2NrX3JhbmQnIGZsYWcuICBUaGUgcHJldmlvdXMgY29kZSBoYWQKICAgICBhIHJhY2UgY29uZGl0aW9uIGlmIDAgaXMgYSB2YWxpZCB0aHJlYWQgSUQuCiAgICAgW1RyYXZpcyBWaXRlayA8dml0ZWtAcm9ndWV3YXZlLmNvbT5dCgogICopIEFkZCBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzIHVuZGVyIElyaXguCiAgICAgW0FsYmVydCBDaGluLUEtWW91bmcgPGNoaW5hQHRoZXdyaXR0ZW53b3JkLmNvbT5dCgogICopIEFkZCBjb25maWd1cmF0aW9uIG9wdGlvbiB0byBidWlsZCBvbiBMaW51eCBvbiBib3RoIGJpZy1lbmRpYW4gYW5kCiAgICAgbGl0dGxlLWVuZGlhbiBNSVBTLgogICAgIFtSYWxmIEJhZWNobGUgPHJhbGZAdW5pLWtvYmxlbnouZGU+XQoKICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEhQLVVYLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42YSBhbmQgMC45LjZiICBbOSBKdWwgMjAwMV0KCiAgKikgQ2hhbmdlIHNzbGVheV9yYW5kX2J5dGVzIChjcnlwdG8vcmFuZC9tZF9yYW5kLmMpCiAgICAgdG8gYXZvaWQgYSBTU0xlYXkvT3BlblNTTCBQUk5HIHdlYWtuZXNzIHBvaW50ZWQgb3V0IGJ5CiAgICAgTWFya2t1LUp1aGFuaSBPLiBTYWFyaW5lbiA8bWFya2t1LWp1aGFuaS5zYWFyaW5lbkBub2tpYS5jb20+OgogICAgIFBSTkcgc3RhdGUgcmVjb3Zlcnkgd2FzIHBvc3NpYmxlIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YKICAgICBvbmUgUFJORyByZXF1ZXN0IGFwcHJvcHJpYXRlbHkgc2l6ZWQgdG8gZ2FpbiBrbm93bGVkZ2Ugb24KICAgICAnbWQnIGZvbGxvd2VkIGJ5IGVub3VnaCBjb25zZWN1dGl2ZSAxLWJ5dGUgUFJORyByZXF1ZXN0cwogICAgIHRvIHRyYXZlcnNlIGFsbCBvZiAnc3RhdGUnLgoKICAgICAxLiBXaGVuIHVwZGF0aW5nICdtZF9sb2NhbCcgKHRoZSBjdXJyZW50IHRocmVhZCdzIGNvcHkgb2YgJ21kJykKICAgICAgICBkdXJpbmcgUFJORyBvdXRwdXQgZ2VuZXJhdGlvbiwgaGFzaCBhbGwgb2YgdGhlIHByZXZpb3VzCiAgICAgICAgJ21kX2xvY2FsJyB2YWx1ZSwgbm90IGp1c3QgdGhlIGhhbGYgdXNlZCBmb3IgUFJORyBvdXRwdXQuCgogICAgIDIuIE1ha2UgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tICdzdGF0ZScgaW5jbHVkZWQgaW50byB0aGUgaGFzaAogICAgICAgIGluZGVwZW5kZW50IGZyb20gdGhlIG51bWJlciBvZiBQUk5HIGJ5dGVzIHJlcXVlc3RlZC4KCiAgICAgVGhlIGZpcnN0IG1lYXN1cmUgYWxvbmUgd291bGQgYmUgc3VmZmljaWVudCB0byBhdm9pZAogICAgIE1hcmtrdS1KdWhhbmkncyBhdHRhY2suICAoQWN0dWFsbHkgaXQgaGFkIG5ldmVyIG9jY3VycmVkCiAgICAgdG8gbWUgdGhhdCB0aGUgaGFsZiBvZiAnbWRfbG9jYWwnIHVzZWQgZm9yIGNoYWluaW5nIHdhcyB0aGUKICAgICBoYWxmIGZyb20gd2hpY2ggUFJORyBvdXRwdXQgYnl0ZXMgd2VyZSB0YWtlbiAtLSBJIGhhZCBhbHdheXMKICAgICBhc3N1bWVkIHRoYXQgdGhlIHNlY3JldCBoYWxmIHdvdWxkIGJlIHVzZWQuKSAgVGhlIHNlY29uZAogICAgIG1lYXN1cmUgbWFrZXMgc3VyZSB0aGF0IGFkZGl0aW9uYWwgZGF0YSBmcm9tICdzdGF0ZScgaXMgbmV2ZXIKICAgICBtaXhlZCBpbnRvICdtZF9sb2NhbCcgaW4gc21hbGwgcG9ydGlvbnM7IHRoaXMgaGV1cmlzdGljYWxseQogICAgIGZ1cnRoZXIgc3RyZW5ndGhlbnMgdGhlIFBSTkcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGNyeXB0by9ibi9hc20vbWlwczMucy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgV2hlbiBvbmx5IHRoZSBrZXkgaXMgZ2l2ZW4gdG8gImVuYyIsIHRoZSBJViBpcyB1bmRlZmluZWQuIFByaW50IG91dAogICAgIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhpcyBjYXNlLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZW4gWDUwOV9OQU1FIGlzIGVtcHR5IGluIFg1MDkgcHJpbnRpbmcgcm91dGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gZHNhX2RvX3ZlcmlmeSAoY3J5cHRvL2RzYS9kc2Ffb3NzbC5jKSwgdmVyaWZ5IHRoYXQgciBhbmQgcyBhcmUKICAgICBwb3NpdGl2ZSBhbmQgbGVzcyB0aGFuIHEuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRG9uJ3QgY2hhbmdlICpwb2ludGVyIGluIENSWVBUT19hZGRfbG9jaygpIGlzIGFkZF9sb2NrX2NhbGxiYWNrIGlzCiAgICAgdXNlZDogaXQgaXNuJ3QgdGhyZWFkIHNhZmUgYW5kIHRoZSBhZGRfbG9ja19jYWxsYmFjayBzaG91bGQgaGFuZGxlCiAgICAgdGhhdCBpdHNlbGYuCiAgICAgW1BhdWwgUm9zZSA8UGF1bC5Sb3NlQGJyaWRnZS5jb20+XQoKICAqKSBWZXJpZnkgdGhhdCBpbmNvbWluZyBkYXRhIG9iZXlzIHRoZSBibG9jayBzaXplIGluCiAgICAgc3NsM19lbmMgKHNzbC9zM19lbmMuYykgYW5kIHRsczFfZW5jIChzc2wvdDFfZW5jLmMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBPQUVQIGNoZWNrLgogICAgIFtVbGYgTfZsbGVyLCBCb2RvIE32bGxlcl0KCiAgKikgVGhlIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNQogICAgIFJTQSBlbmNyeXB0aW9uIHdhcyBhY2NpZGVudGFsbHkgcmVtb3ZlZCBpbiBzM19zcnZyLmMgaW4gT3BlblNTTCAwLjkuNQogICAgIHdoZW4gZml4aW5nIHRoZSBzZXJ2ZXIgYmVoYXZpb3VyIGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSAnY2xpZW50CiAgICAgaGVsbG8nIG1lc3NhZ2VzLiAgKE5vdGUgdGhhdCB0aGUgYXR0YWNrIGlzIGltcHJhY3RpY2FsIGFnYWluc3QKICAgICBTU0wgMy4wIGFuZCBUTFMgMS4wIGFueXdheSBiZWNhdXNlIGxlbmd0aCBhbmQgdmVyc2lvbiBjaGVja2luZwogICAgIG1lYW5zIHRoYXQgdGhlIHByb2JhYmlsaXR5IG9mIGd1ZXNzaW5nIGEgdmFsaWQgY2lwaGVydGV4dCBpcwogICAgIGFyb3VuZCAyXi00MDsgc2VlIHNlY3Rpb24gNSBpbiBCbGVpY2hlbmJhY2hlcidzIENSWVBUTyAnOTgKICAgICBwYXBlci4pCgogICAgIEJlZm9yZSAwLjkuNSwgdGhlIGNvdW50ZXJtZWFzdXJlIChoaWRlIHRoZSBlcnJvciBieSBnZW5lcmF0aW5nIGEKICAgICByYW5kb20gJ2RlY3J5cHRpb24gcmVzdWx0JykgZGlkIG5vdCB3b3JrIHByb3Blcmx5IGJlY2F1c2UKICAgICBFUlJfY2xlYXJfZXJyb3IoKSB3YXMgbWlzc2luZywgbWVhbmluZyB0aGF0IFNTTF9nZXRfZXJyb3IoKSB3b3VsZAogICAgIGRldGVjdCB0aGUgc3VwcG9zZWRseSBpZ25vcmVkIGVycm9yLgoKICAgICBCb3RoIHByb2JsZW1zIGFyZSBub3cgZml4ZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gY3J5cHRvL2Jpby9iZl9idWZmLmMsIGluY3JlYXNlIERFRkFVTFRfQlVGRkVSX1NJWkUgdG8gNDA5NgogICAgIChwcmV2aW91c2x5IGl0IHdhcyAxMDI0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggZm9yIGNvbXBhdGliaWxpdHkgbW9kZSB0cnVzdCBzZXR0aW5nczogaWdub3JlIHRydXN0IHNldHRpbmdzCiAgICAgdW5sZXNzIHNvbWUgdmFsaWQgdHJ1c3Qgb3IgcmVqZWN0IHNldHRpbmdzIGFyZSBwcmVzZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmb3IgYmxvd2Zpc2ggRVZQOiBpdHMgYSB2YXJpYWJsZSBsZW5ndGggY2lwaGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB2YXJpb3VzIGJ1Z3MgcmVsYXRlZCB0byBEU0EgUy9NSU1FIHZlcmlmaWNhdGlvbi4gSGFuZGxlIG1pc3NpbmcKICAgICBwYXJhbWV0ZXJzIGluIERTQSBwdWJsaWMga2V5IHN0cnVjdHVyZXMgYW5kIHJldHVybiBhbiBlcnJvciBpbiB0aGUKICAgICBEU0Egcm91dGluZXMgaWYgcGFyYW1ldGVycyBhcmUgYWJzZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHZlcnNpb25zIHVwIHRvIDAuOS42LCBSQU5EX2ZpbGVfbmFtZSgpIHJlc29ydGVkIHRvIGZpbGUgIi5ybmQiCiAgICAgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5laXRoZXIgJFJBTkRGSUxFIG5vciAkSE9NRSB3YXMgc2V0LgogICAgIFJBTkRfZmlsZV9uYW1lKCkgaW4gMC45LjZhIHJldHVybmVkIE5VTEwgaW4gdGhpcyBjYXNlLiAgVGhpcyBoYXMKICAgICBjYXVzZWQgc29tZSBjb25mdXNpb24gdG8gV2luZG93cyB1c2VycyB3aG8gaGF2ZW4ndCBkZWZpbmVkICRIT01FLgogICAgIFRodXMgUkFORF9maWxlX25hbWUoKSBpcyBjaGFuZ2VkIGFnYWluOiBlX29zLmggY2FuIGRlZmluZSBhCiAgICAgREVGQVVMVF9IT01FLCB3aGljaCB3aWxsIGJlIHVzZWQgaWYgJEhPTUUgaXMgbm90IHNldC4KICAgICBGb3IgV2luZG93cywgd2UgdXNlICJDOiI7IG9uIG90aGVyIHBsYXRmb3Jtcywgd2Ugc3RpbGwgcmVxdWlyZQogICAgIGVudmlyb25tZW50IHZhcmlhYmxlcy4KCiAgKikgTW92ZSAnaWYgKCFpbml0aWFsaXplZCkgUkFORF9wb2xsKCknIGludG8gcmVnaW9ucyBwcm90ZWN0ZWQgYnkKICAgICBDUllQVE9fTE9DS19SQU5ELiAgVGhpcyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgYXZvaWRzCiAgICAgaGF2aW5nIG11bHRpcGxlIHRocmVhZHMgY2FsbCBSQU5EX3BvbGwoKSBjb25jdXJyZW50bHkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gY3J5cHRvL3JhbmQvbWRfcmFuZC5jLCByZXBsYWNlICdhZGRfZG9fbm90X2xvY2snIGZsYWcgYnkgYQogICAgIGNvbWJpbmF0aW9uIG9mIGEgZmxhZyBhbmQgYSB0aHJlYWQgSUQgdmFyaWFibGUuCiAgICAgT3RoZXJ3aXNlIHdoaWxlIG9uZSB0aHJlYWQgaXMgaW4gc3NsZWF5X3JhbmRfYnl0ZXMgKHdoaWNoIHNldHMgdGhlCiAgICAgZmxhZyksICpvdGhlciogdGhyZWFkcyBjYW4gZW50ZXIgc3NsZWF5X2FkZF9ieXRlcyB3aXRob3V0IG9iZXlpbmcKICAgICB0aGUgQ1JZUFRPX0xPQ0tfUkFORCBsb2NrIChhbmQgbWF5IGV2ZW4gaWxsZWdhbGx5IHJlbGVhc2UgdGhlIGxvY2sKICAgICB0aGF0IHRoZXkgZG8gbm90IGhvbGQgYWZ0ZXIgdGhlIGZpcnN0IHRocmVhZCB1bnNldHMgYWRkX2RvX25vdF9sb2NrKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgYmN0ZXN0IGFnYWluOiAnLXgnIGV4cHJlc3Npb25zIGFyZSBub3QgYXZhaWxhYmxlIGluIGFsbAogICAgIHZlcnNpb25zIG9mICd0ZXN0Jy4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNiBhbmQgMC45LjZhICBbNSBBcHIgMjAwMV0KCiAgKikgRml4IGEgY291cGxlIG9mIG1lbW9yeSBsZWFrcyBpbiBQS0NTN19kYXRhRGVjb2RlKCkKICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBIZXl1biBaaGVuZyA8aHpoZW5nQGF0ZHNwcmludC5jb20+XQoKICAqKSBDaGFuZ2UgQ29uZmlndXJlIGFuZCBNYWtlZmlsZXMgdG8gcHJvdmlkZSBFWEVfRVhULCB3aGljaCB3aWxsIGNvbnRhaW4KICAgICB0aGUgZGVmYXVsdCBleHRlbnNpb24gZm9yIGV4ZWN1dGFibGVzLCBpZiBhbnkuICBBbHNvLCBtYWtlIHRoZSBwZXJsCiAgICAgc2NyaXB0cyB0aGF0IHVzZSBzeW1saW5rKCkgdG8gdGVzdCBpZiBpdCByZWFsbHkgZXhpc3RzIGFuZCB1c2UgImNwIgogICAgIGlmIGl0IGRvZXNuJ3QuICBBbGwgdGhpcyBtYWRlIE9wZW5TU0wgY29tcGlsYWJsZSBhbmQgaW5zdGFsbGFibGUgaW4KICAgICBDeWdXaW4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IGZvciBhc24xX0dldFNlcXVlbmNlKCkgZm9yIGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkIGRhdGEuCiAgICAgSWYgU0VRVUVOQ0UgaXMgbGVuZ3RoIGlzIGluZGVmaW5pdGUganVzdCBzZXQgYy0+c2xlbiB0byB0aGUgdG90YWwKICAgICBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgc2hpZ2VARnJlZUJTRC5vcmddCiAgICAgW1RoaXMgY2hhbmdlIGRvZXMgbm90IGFwcGx5IHRvIDAuOS43Ll0KCiAgKikgQ2hhbmdlIGJjdGVzdCB0byBhdm9pZCBoZXJlLWRvY3VtZW50cyBpbnNpZGUgY29tbWFuZCBzdWJzdGl0dXRpb24KICAgICAod29ya2Fyb3VuZCBmb3IgRnJlZUJTRCAvYmluL3NoIGJ1ZykuCiAgICAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBVbHRyaXgsIGF2b2lkIHNoZWxsIGZ1bmN0aW9ucyAoaW50cm9kdWNlZAogICAgIGluIHRoZSBiY3Rlc3QgdmVyc2lvbiB0aGF0IHNlYXJjaGVzIGFsb25nICRQQVRIKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW5hbWUgJ2Rlc19lbmNyeXB0JyB0byAnZGVzX2VuY3J5cHQxJy4gIFRoaXMgYXZvaWRzIHRoZSBjbGFzaGVzCiAgICAgd2l0aCBkZXNfZW5jcnlwdCgpIGRlZmluZWQgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcywgbGlrZSBTb2xhcmlzCiAgICAgYW5kIFVuaXhXYXJlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoZWNrIHRoZSByZXN1bHQgb2YgUlNBLUNSVCAoc2VlIEQuIEJvbmVoLCBSLiBEZU1pbGxvLCBSLiBMaXB0b246CiAgICAgT24gdGhlIEltcG9ydGFuY2Ugb2YgRWxpbWluYXRpbmcgRXJyb3JzIGluIENyeXB0b2dyYXBoaWMKICAgICBDb21wdXRhdGlvbnMsIEouIENyeXB0b2xvZ3kgMTQgKDIwMDEpIDIsIDEwMS0xMTksCiAgICAgaHR0cDovL3RoZW9yeS5zdGFuZm9yZC5lZHUvfmRhYm8vcGFwZXJzL2ZhdWx0cy5wcy5neikuCiAgICAgW1VsZiBNb2VsbGVyXQogIAogICopIE1JUFMgYXNzZW1ibGVyIEJJR05VTSBkaXZpc2lvbiBidWcgZml4LiAKICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgRGlzYWJsZWQgaW5jb3JyZWN0IEFscGhhIGFzc2VtYmxlciBjb2RlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBQS0NTIzcgZGVjb2RlIHJvdXRpbmVzIHNvIHRoZXkgY29ycmVjdGx5IHVwZGF0ZSB0aGUgbGVuZ3RoCiAgICAgYWZ0ZXIgcmVhZGluZyBhbiBFT0MgZm9yIHRoZSBFWFBMSUNJVCB0YWcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KICAgICBbVGhpcyBjaGFuZ2UgZG9lcyBub3QgYXBwbHkgdG8gMC45LjcuXQoKICAqKSBGaXggYnVnIGluIFBLQ1MjMTIga2V5IGdlbmVyYXRpb24gcm91dGluZXMuIFRoaXMgd2FzIHRyaWdnZXJlZAogICAgIGlmIGEgM0RFUyBrZXkgd2FzIGdlbmVyYXRlZCB3aXRoIGEgMCBpbml0aWFsIGJ5dGUuIEluY2x1ZGUKICAgICBQS0NTMTJfQlJPS0VOX0tFWUdFTiBjb21waWxhdGlvbiBvcHRpb24gdG8gcmV0YWluIHRoZSBvbGQKICAgICAoYnV0IGJyb2tlbikgYmVoYXZpb3VyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgYmN0ZXN0IHRvIHNlYXJjaCBmb3IgYSB3b3JraW5nIGJjIGFsb25nICRQQVRIIGFuZCBwcmludAogICAgIGl0IHdoZW4gZm91bmQuCiAgICAgW1RpbSBSaWNlIDx0aW1AbXVsdGl0YWxlbnRzLm5ldD4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IG1lbW9yeSBsZWFrcyBpbiBlcnIuYzogZnJlZSBlcnJfZGF0YSBzdHJpbmcgaWYgbmVjZXNzYXJ5OwogICAgIGRvbid0IHdyaXRlIHRvIHRoZSB3cm9uZyBpbmRleCBpbiBFUlJfc2V0X2Vycm9yX2RhdGEuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW1wbGVtZW50IHNzbDIzX3BlZWsgKGFuYWxvZ291cyB0byBzc2wyM19yZWFkKSwgd2hpY2ggcHJldmlvdXNseQogICAgIGRpZCBub3QgZXhpc3QuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVwbGFjZSByZHRzYyB3aXRoIF9lbWl0IHN0YXRlbWVudHMgZm9yIFZDKysgdmVyc2lvbiA1LgogICAgIFtKZXJlbXkgQ29vcGVyIDxqZXJlbXlAYmF5bW9vLm9yZz5dCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gcmV1c2UgU1NMdjIgc2Vzc2lvbnMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gY29weV9lbWFpbCgpIGNoZWNrIGZvciA+PSAwIGFzIGEgcmV0dXJuIHZhbHVlIGZvcgogICAgIFg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfTklEKCkgc2luY2UgMCBpcyBhIHZhbGlkIGluZGV4LgogICAgIFtTdGV2ZSBIZW5zb24gcmVwb3J0ZWQgYnkgTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAb3BlbnNjYS5vcmc+XQoKICAqKSBBdm9pZCBjb3JlZHVtcCB3aXRoIHVuc3VwcG9ydGVkIG9yIGludmFsaWQgcHVibGljIGtleXMgYnkgY2hlY2tpbmcgaWYKICAgICBYNTA5X2dldF9wdWJrZXkoKSBmYWlscyBpbiBQS0NTN192ZXJpZnkoKS4gRml4IG1lbW9yeSBsZWFrIHdoZW4KICAgICBQS0NTN192ZXJpZnkoKSBmYWlscyB3aXRoIG5vbiBkZXRhY2hlZCBkYXRhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERvbid0IHVzZSBnZXRlbnYgaW4gbGlicmFyeSBmdW5jdGlvbnMgd2hlbiBydW4gYXMgc2V0dWlkL3NldGdpZC4KICAgICBOZXcgZnVuY3Rpb24gT1BFTlNTTF9pc3NldHVnaWQoKS4KICAgICBbVWxmIE1vZWxsZXJdCgogICopIEF2b2lkIGZhbHNlIHBvc2l0aXZlcyBpbiBtZW1vcnkgbGVhayBkZXRlY3Rpb24gY29kZSAoY3J5cHRvL21lbV9kYmcuYykKICAgICBkdWUgdG8gaW5jb3JyZWN0IGhhbmRsaW5nIG9mIG11bHRpLXRocmVhZGluZzoKCiAgICAgMS4gRml4IHRpbWluZyBnbGl0Y2ggaW4gdGhlIE1lbUNoZWNrX29mZigpIHBvcnRpb24gb2YgQ1JZUFRPX21lbV9jdHJsKCkuCgogICAgIDIuIEZpeCBsb2dpY2FsIGdsaXRjaCBpbiBpc19NZW1DaGVja19vbigpIGFrYSBDUllQVE9faXNfbWVtX2NoZWNrX29uKCkuCgogICAgIDMuIENvdW50IGhvdyBtYW55IHRpbWVzIE1lbUNoZWNrX29mZigpIGhhcyBiZWVuIGNhbGxlZCBzbyB0aGF0CiAgICAgICAgbmVzdGVkIHVzZSBjYW4gYmUgdHJlYXRlZCBjb3JyZWN0bHkuICBUaGlzIGFsc28gYXZvaWRzIAogICAgICAgIGluYmFuZC1zaWduYWxsaW5nIGluIHRoZSBwcmV2aW91cyBjb2RlICh3aGljaCByZWxpZWQgb24gdGhlCiAgICAgICAgYXNzdW1wdGlvbiB0aGF0IHRocmVhZCBJRCAwIGlzIGltcG9zc2libGUpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCAiLXJhbmQiIG9wdGlvbiBhbHNvIHRvIHNfY2xpZW50IGFuZCBzX3NlcnZlci4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IENQVSBkZXRlY3Rpb24gb24gSXJpeCA2LnguCiAgICAgW0t1cnQgSG9ja2VuYnVyeSA8a2hvY2tlbmJAc3RldmVucy10ZWNoLmVkdT4gYW5kCiAgICAgICJCcnVjZSBXLiBGb3JzYmVyZyIgPGJydWNlLmZvcnNiZXJnQGJhZXN5c3RlbXMuY29tPl0KCiAgKikgRml4IFg1MDlfTkFNRSBidWcgd2hpY2ggcHJvZHVjZWQgaW5jb3JyZWN0IGVuY29kaW5nIGlmIFg1MDlfTkFNRQogICAgIHdhcyBlbXB0eS4KICAgICBbU3RldmUgSGVuc29uXQogICAgIFtUaGlzIGNoYW5nZSBkb2VzIG5vdCBhcHBseSB0byAwLjkuNy5dCgogICopIFVzZSB0aGUgY2FjaGVkIGVuY29kaW5nIG9mIGFuIFg1MDlfTkFNRSBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4KICAgICBjb3B5aW5nIGl0LiBUaGlzIGlzIGFwcGFyZW50bHkgdGhlIHJlYXNvbiBmb3IgdGhlIGxpYnNhZmUgImVycm9ycyIKICAgICBidXQgdGhlIGNvZGUgaXMgYWN0dWFsbHkgY29ycmVjdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGZ1bmN0aW9uIEJOX3JhbmRfcmFuZ2UoKSwgYW5kIGZpeCBEU0Ffc2lnbl9zZXR1cCgpIHRvIHByZXZlbnQKICAgICBCbGVpY2hlbmJhY2hlcidzIERTQSBhdHRhY2suCiAgICAgRXh0ZW5kIEJOX1twc2V1ZG9fXXJhbmQ6IEFzIGJlZm9yZSwgdG9wPTEgZm9yY2VzIHRoZSBoaWdoZXN0IHR3byBiaXRzCiAgICAgdG8gYmUgc2V0IGFuZCB0b3A9MCBmb3JjZXMgdGhlIGhpZ2hlc3QgYml0IHRvIGJlIHNldDsgdG9wPS0xIGlzIG5ldwogICAgIGFuZCBsZWF2ZXMgdGhlIGhpZ2hlc3QgYml0IHJhbmRvbS4KICAgICBbVWxmIE1vZWxsZXIsIEJvZG8gTW9lbGxlcl0KCiAgKikgSW4gdGhlIE5DT05GXy4uLi1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgZm9yIENPTkZfLi4uIHF1ZXJpZXMKICAgICAoY3J5cHRvL2NvbmYvY29uZl9saWIuYyksIGlmIHRoZSBpbnB1dCBMSEFTSCBpcyBOVUxMLCBhdm9pZCB1c2luZwogICAgIGEgdGVtcG9yYXJ5IENPTkYgc3RydWN0dXJlIHdpdGggdGhlIGRhdGEgY29tcG9uZW50IHNldCB0byBOVUxMCiAgICAgKHdoaWNoIGdpdmVzIHNlZ21lbnRhdGlvbiBmYXVsdHMgaW4gbGhfcmV0cmlldmUpLgogICAgIEluc3RlYWQsIHVzZSBOVUxMIGZvciB0aGUgQ09ORiBwb2ludGVyIGluIENPTkZfZ2V0X3N0cmluZyBhbmQKICAgICBDT05GX2dldF9udW1iZXIgKHdoaWNoIG1heSB1c2UgZW52aXJvbm1lbnQgdmFyaWFibGVzKSBhbmQgZGlyZWN0bHkKICAgICByZXR1cm4gTlVMTCBmcm9tIENPTkZfZ2V0X3NlY3Rpb24uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHBvdGVudGlhbCBidWZmZXIgb3ZlcnJ1biBmb3IgRUJDRElDLgogICAgIFtVbGYgTW9lbGxlcl0KCiAgKikgVG9sZXJhdGUgbm9uUmVwdWRpYXRpb24gYXMgYmVpbmcgdmFsaWQgZm9yIFMvTUlNRSBzaWduaW5nIGFuZCBjZXJ0U2lnbgogICAgIGtleVVzYWdlIGlmIGJhc2ljQ29uc3RyYWludHMgYWJzZW50IGZvciBhIENBLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgU01JTUVfd3JpdGVfUEtDUzcoKSB3cml0ZSBtYWlsIGhlYWRlciB2YWx1ZXMgd2l0aCBhIGZvcm1hdCB0aGF0CiAgICAgaXMgbW9yZSBnZW5lcmFsbHkgYWNjZXB0ZWQgKG5vIHNwYWNlcyBiZWZvcmUgdGhlIHNlbWljb2xvbiksIHNpbmNlCiAgICAgc29tZSBwcm9ncmFtcyBjYW4ndCBwYXJzZSB0aG9zZSB2YWx1ZXMgcHJvcGVybHkgb3RoZXJ3aXNlLiAgQWxzbyBtYWtlCiAgICAgc3VyZSBCSU8ncyB0aGF0IGJyZWFrIGxpbmVzIGFmdGVyIGVhY2ggd3JpdGUgZG8gbm90IGNyZWF0ZSBpbnZhbGlkCiAgICAgaGVhZGVycy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIHRoZSBDUkwgZW5jb2Rpbmcgcm91dGluZXMgd29yayB3aXRoIGVtcHR5IFNFUVVFTkNFIE9GLiBUaGUKICAgICBtYWNyb3MgcHJldmlvdXNseSB1c2VkIHdvdWxkIG5vdCBlbmNvZGUgYW4gZW1wdHkgU0VRVUVOQ0UgT0YKICAgICBhbmQgYnJlYWsgdGhlIHNpZ25hdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQogICAgIFtUaGlzIGNoYW5nZSBkb2VzIG5vdCBhcHBseSB0byAwLjkuNy5dCgogICopIFplcm8gdGhlIHByZW1hc3RlciBzZWNyZXQgYWZ0ZXIgZGVyaXZpbmcgdGhlIG1hc3RlciBzZWNyZXQgaW4KICAgICBESCBjaXBoZXJzdWl0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNvbWUgRVZQX2FkZF9kaWdlc3RfYWxpYXMgcmVnaXN0cmF0aW9ucyAoYXMgZm91bmQgaW4KICAgICBPcGVuU1NMX2FkZF9hbGxfZGlnZXN0cygpKSB0byBTU0xfbGlicmFyeV9pbml0KCkKICAgICBha2EgT3BlblNTTF9hZGRfc3NsX2FsZ29yaXRobXMoKS4gIFRoaXMgcHJvdmlkZXMgaW1wcm92ZWQKICAgICBjb21wYXRpYmlsaXR5IHdpdGggcGVlcnMgdXNpbmcgWC41MDkgY2VydGlmaWNhdGVzCiAgICAgd2l0aCB1bmNvbnZlbnRpb25hbCBBbGdvcml0aG1JZGVudGlmaWVyIE9JRHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGZvciBJcml4IHdpdGggTk9fQVNNLgogICAgIFsiQnJ1Y2UgVy4gRm9yc2JlcmciIDxicnVjZS5mb3JzYmVyZ0BiYWVzeXN0ZW1zLmNvbT5dCgogICopIC4vY29uZmlnIHNjcmlwdCBmaXhlcy4KICAgICBbVWxmIE1vZWxsZXIsIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4ICdvcGVuc3NsIHBhc3N3ZCAtMScuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIFBLQ1MxMl9rZXlfZ2VuX2FzYygpIHNvIGl0IGNhbiBjb3BlIHdpdGggbm9uIG51bGwKICAgICB0ZXJtaW5hdGVkIHN0cmluZ3Mgd2hvc2UgbGVuZ3RoIGlzIHBhc3NlZCBpbiB0aGUgcGFzc2xlbgogICAgIHBhcmFtZXRlciwgZm9yIGV4YW1wbGUgZnJvbSBQRU0gY2FsbGJhY2tzLiBUaGlzIHdhcyBkb25lCiAgICAgYnkgYWRkaW5nIGFuIGV4dHJhIGxlbmd0aCBwYXJhbWV0ZXIgdG8gYXNjMnVuaSgpLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IDxvZGRpc3NleUBzYW1zdW5nLmNvLmtyPl0KCiAgKikgRml4IEMgY29kZSBnZW5lcmF0ZWQgYnkgJ29wZW5zc2wgZHNhcGFyYW0gLUMnOiBJZiBhIEJOX2JpbjJibgogICAgIGNhbGwgZmFpbGVkLCBmcmVlIHRoZSBEU0Egc3RydWN0dXJlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCB0byB1bmkyYXNjKCkgdG8gY29wZSB3aXRoIHplcm8gbGVuZ3RoIFVuaWNvZGUgc3RyaW5ncy4KICAgICBUaGVzZSBhcmUgcHJlc2VudCBpbiBzb21lIFBLQ1MjMTIgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5jcmVhc2UgczItPndidWYgYWxsb2NhdGlvbiBieSBvbmUgYnl0ZSBpbiBzc2wyX25ldyAoc3NsL3MyX2xpYi5jKS4KICAgICBPdGhlcndpc2UgZG9fc3NsX3dyaXRlIChzc2wvczJfcGt0LmMpIHdpbGwgd3JpdGUgYmV5b25kIGJ1ZmZlciBsaW1pdHMKICAgICB3aGVuIHdyaXRpbmcgYSAzMjc2NyBieXRlIHJlY29yZC4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHJlcG9ydGVkIGJ5IEVyaWMgRGF5IDxlZGF5QGNvbmNlbnRyaWMubmV0Pl0KCiAgKikgSW4gUlNBX2VheV9wdWJsaWNfe2VuLGVkfWNyeXB0IGFuZCBSU0FfZWF5X21vZF9leHAgKHJzYV9lYXkuYyksCiAgICAgb2J0YWluIGxvY2sgQ1JZUFRPX0xPQ0tfUlNBIGJlZm9yZSBzZXR0aW5nIHJzYS0+X21ldGhvZF9tb2Rfe24scCxxfS4KCiAgICAgKFJTQSBvYmplY3RzIGhhdmUgYSByZWZlcmVuY2UgY291bnQgYWNjZXNzIHRvIHdoaWNoIGlzIHByb3RlY3RlZAogICAgIGJ5IENSWVBUT19MT0NLX1JTQSBbc2VlIHJzYV9saWIuYywgczNfc3J2ci5jLCBzc2xfY2VydC5jLCBzc2xfcnNhLmNdLAogICAgIHNvIHRoZXkgYXJlIG1lYW50IHRvIGJlIHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMuKQogICAgIFtCb2RvIE1vZWxsZXIsIEdlb2ZmIFRob3JwZTsgb3JpZ2luYWwgcGF0Y2ggc3VibWl0dGVkIGJ5CiAgICAgIlJlZGRpZSwgU3RldmVuIiA8U3RldmVuLlJlZGRpZUBjYS5jb20+XQoKICAqKSBGaXggYSBkZWFkbG9jayBpbiBDUllQVE9fbWVtX2xlYWtzKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXNlIGJldHRlciB0ZXN0IHBhdHRlcm5zIGluIGJudGVzdC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgcmFuZF93aW4uYyBmaXggZm9yIEJvcmxhbmQgQy4KICAgICBbVWxmIE32bGxlcl0KIAogICopIEJOX3JzaGlmdCBidWdmaXggZm9yIG4gPT0gMC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYSAnYmN0ZXN0JyBzY3JpcHQgdGhhdCBjaGVja3MgZm9yIHNvbWUga25vd24gJ2JjJyBidWdzCiAgICAgc28gdGhhdCAnbWFrZSB0ZXN0JyBkb2VzIG5vdCBhYm9ydCBqdXN0IGJlY2F1c2UgJ2JjJyBpcyBicm9rZW4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU3RvcmUgdmVyaWZ5X3Jlc3VsdCB3aXRoaW4gU1NMX1NFU1NJT04gYWxzbyBmb3IgY2xpZW50IHNpZGUgdG8KICAgICBhdm9pZCBwb3RlbnRpYWwgc2VjdXJpdHkgaG9sZS4gKFJlLXVzZWQgc2Vzc2lvbnMgb24gdGhlIGNsaWVudCBzaWRlCiAgICAgYWx3YXlzIHJlc3VsdGVkIGluIHZlcmlmeV9yZXN1bHQ9PVg1MDlfVl9PSywgbm90IHVzaW5nIHRoZSBvcmlnaW5hbAogICAgIHJlc3VsdCBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBzc2wzX3BlbmRpbmc6IElmIHRoZSByZWNvcmQgaW4gcy0+czMtPnJyZWMgaXMgbm90IG9mIHR5cGUKICAgICBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEsIHJldHVybiAwLgogICAgIFNpbWlsYXJseSwgY2hhbmdlIHNzbDJfcGVuZGluZyB0byByZXR1cm4gMCBpZiBTU0xfaW5faW5pdChzKSBpcyB0cnVlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBTU0xfcGVlazoKICAgICBCb3RoIHNzbDJfcGVlayBhbmQgc3NsM19wZWVrLCB3aGljaCB3ZXJlIHRvdGFsbHkgYnJva2VuIGluIGVhcmxpZXIKICAgICByZWxlYXNlcywgaGF2ZSBiZWVuIHJlLWltcGxlbWVudGVkIGJ5IHJlbmFtaW5nIHRoZSBwcmV2aW91cwogICAgIGltcGxlbWVudGF0aW9ucyBvZiBzc2wyX3JlYWQgYW5kIHNzbDNfcmVhZCB0byBzc2wyX3JlYWRfaW50ZXJuYWwKICAgICBhbmQgc3NsM19yZWFkX2ludGVybmFsLCByZXNwZWN0aXZlbHksIGFuZCBhZGRpbmcgJ3BlZWsnIHBhcmFtZXRlcnMKICAgICB0byB0aGVtLiAgVGhlIG5ldyBzc2xbMjNdX3tyZWFkLHBlZWt9IGZ1bmN0aW9ucyBhcmUgY2FsbHMgdG8KICAgICBzc2xbMjNdX3JlYWRfaW50ZXJuYWwgd2l0aCB0aGUgJ3BlZWsnIGZsYWcgc2V0IGFwcHJvcHJpYXRlbHkuCiAgICAgQSAncGVlaycgcGFyYW1ldGVyIGhhcyBhbHNvIGJlZW4gYWRkZWQgdG8gc3NsM19yZWFkX2J5dGVzLCB3aGljaAogICAgIGRvZXMgdGhlIGFjdHVhbCB3b3JrIGZvciBzc2wzX3JlYWRfaW50ZXJuYWwuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5pdGlhbGlzZSAiZXhfZGF0YSIgbWVtYmVyIG9mIFJTQS9EU0EvREggc3RydWN0dXJlcyBwcmlvciB0byBjYWxsaW5nCiAgICAgdGhlIG1ldGhvZC1zcGVjaWZpYyAiaW5pdCgpIiBoYW5kbGVyLiBBbHNvIGNsZWFuIHVwIGV4X2RhdGEgYWZ0ZXIKICAgICBjYWxsaW5nIHRoZSBtZXRob2Qtc3BlY2lmaWMgImZpbmlzaCgpIiBoYW5kbGVyLiBQcmV2aW91c2x5LCB0aGlzIHdhcwogICAgIGhhcHBlbmluZyB0aGUgb3RoZXIgd2F5IHJvdW5kLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEluY3JlYXNlIEJOX0NUWF9OVU0gKHRoZSBudW1iZXIgb2YgQklHTlVNcyBpbiBhIEJOX0NUWCkgdG8gMTYuCiAgICAgVGhlIHByZXZpb3VzIHZhbHVlLCAxMiwgd2FzIG5vdCBhbHdheXMgc3VmZmljaWVudCBmb3IgQk5fbW9kX2V4cCgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2Ugc3VyZSB0aGF0IHNoYXJlZCBsaWJyYXJpZXMgZ2V0IHRoZSBpbnRlcm5hbCBuYW1lIGVuZ2luZSB3aXRoCiAgICAgdGhlIGZ1bGwgdmVyc2lvbiBudW1iZXIgYW5kIG5vdCBqdXN0IDAuICBUaGlzIHNob3VsZCBtYXJrIHRoZQogICAgIHNoYXJlZCBsaWJyYXJpZXMgYXMgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUuICBPZiBjb3Vyc2UsIHRoaXMgc2hvdWxkCiAgICAgYmUgY2hhbmdlZCBhZ2FpbiB3aGVuIHdlIGNhbiBndWFyYW50ZWUgYmFja3dhcmQgYmluYXJ5IGNvbXBhdGliaWxpdHkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IHR5cG8gaW4gZ2V0X2NlcnRfYnlfc3ViamVjdCgpIGluIGJ5X2Rpci5jCiAgICAgW0plYW4tTWFyYyBEZXNwZXJyaWVyIDxqZWFuLW1hcmMuZGVzcGVycmllckBjZXJ0cGx1cy5jb20+XQoKICAqKSBSZXdvcmsgdGhlIHN5c3RlbSB0byBnZW5lcmF0ZSBzaGFyZWQgbGlicmFyaWVzOgoKICAgICAtIE1ha2Ugbm90ZSBvZiB0aGUgZXhwZWN0ZWQgZXh0ZW5zaW9uIGZvciB0aGUgc2hhcmVkIGxpYnJhcmllcyBhbmQKICAgICAgIGlmIHRoZXJlIGlzIGEgbmVlZCBmb3Igc3ltYm9saWMgbGlua3MgZnJvbSBmb3IgZXhhbXBsZSBsaWJjcnlwdG8uc28uMAogICAgICAgdG8gbGliY3J5cHRvLnNvLjAuOS43LiAgVGhlcmUgaXMgZXh0ZW5kZWQgaW5mbyBpbiBDb25maWd1cmUgZm9yCiAgICAgICB0aGF0LgoKICAgICAtIE1ha2UgYXMgZmV3IHJlYnVpbGRzIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIGFzIHBvc3NpYmxlLgoKICAgICAtIFN0aWxsIGF2b2lkIGxpbmtpbmcgdGhlIE9wZW5TU0wgcHJvZ3JhbXMgd2l0aCB0aGUgc2hhcmVkIGxpYnJhcmllcy4KCiAgICAgLSBXaGVuIGluc3RhbGxpbmcsIGluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJpZXMgc2VwYXJhdGVseSBmcm9tIHRoZQogICAgICAgc3RhdGljIG9uZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IFNTTF9DVFhfc2V0X3JlYWRfYWhlYWQgbWFjcm8gdG8gYWN0dWFsbHkgdXNlIGl0cyBhcmd1bWVudC4KCiAgICAgQ29weSBTU0xfQ1RYJ3MgcmVhZF9haGVhZCBmbGFnIHRvIFNTTCBvYmplY3QgZGlyZWN0bHkgaW4gU1NMX25ldwogICAgIGFuZCBub3QgaW4gU1NMX2NsZWFyIGJlY2F1c2UgdGhlIGxhdHRlciBpcyBhbHNvIHVzZWQgYnkgdGhlCiAgICAgYWNjZXB0L2Nvbm5lY3QgZnVuY3Rpb25zOyBwcmV2aW91c2x5LCB0aGUgc2V0dGluZ3MgbWFkZSBieQogICAgIFNTTF9zZXRfcmVhZF9haGVhZCB3b3VsZCBiZSBsb3N0IGR1cmluZyB0aGUgaGFuZHNoYWtlLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW1zIHJlcG9ydGVkIGJ5IEFuZGVycyBHZXJ0eiA8Z2VydHpAZXBhY3Quc2U+XSAgICAgCgogICopIENvcnJlY3QgdXRpbC9ta2RlZi5wbCB0byBiZSBzZWxlY3RpdmUgYWJvdXQgZGlzYWJsZWQgYWxnb3JpdGhtcy4KICAgICBQcmV2aW91c2x5LCBpdCB3b3VsZCBjcmVhdGUgZW50cmllcyBmb3IgZGlzYWJsZWVkIGFsZ29yaXRobXMgbm8KICAgICBtYXR0ZXIgd2hhdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGRlZCBzZXZlcmFsIG5ldyBtYW51YWwgcGFnZXMgZm9yIFNTTF8qIGZ1bmN0aW9uLgogICAgIFtMdXR6IEphZW5pY2tlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNWEgYW5kIDAuOS42ICBbMjQgU2VwIDIwMDBdCgogICopIEluIHNzbDIzX2dldF9jbGllbnRfaGVsbG8sIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBmYWNlZAogICAgIHdpdGggYW4gaW5pdGlhbCBTU0wgMy4wL1RMUyByZWNvcmQgdGhhdCBpcyB0b28gc21hbGwgdG8gY29udGFpbiB0aGUKICAgICBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIENsaWVudEhlbGxvIG1lc3NhZ2UsIGkuZS4gY2xpZW50X3ZlcnNpb24uCiAgICAgKE5vdGUgdGhhdCB0aGlzIGlzIGEgcGF0aG9sb2dpYyBjYXNlIHRoYXQgcHJvYmFibHkgaGFzIG5ldmVyIGhhcHBlbmVkCiAgICAgaW4gcmVhbCBsaWZlLikgIFRoZSBwcmV2aW91cyBhcHByb2FjaCB3YXMgdG8gdXNlIHRoZSB2ZXJzaW9uIG51bWJlcgogICAgIGZyb20gdGhlIHJlY29yZCBoZWFkZXIgYXMgYSBzdWJzdGl0dXRlOyBidXQgb3VyIHByb3RvY29sIGNob2ljZQogICAgIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoYXQgb25lIGJlY2F1c2UgaXQgaXMgbm90IGF1dGhlbnRpY2F0ZWQKICAgICBieSB0aGUgRmluaXNoZWQgbWVzc2FnZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTW9yZSByb2J1c3QgcmFuZG9tbmVzcyBnYXRoZXJpbmcgZnVuY3Rpb25zIGZvciBXaW5kb3dzLgogICAgIFtKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBjb2x1bWJpYS5lZHU+XQoKICAqKSBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIGlmIHRoZSBmbGFnIFg1MDlfVl9GTEFHX0lTU1VFUl9DSEVDSyBpcwogICAgIG5vdCBzZXQgdGhlbiB3ZSBkb24ndCBzZXR1cCB0aGUgZXJyb3IgY29kZSBmb3IgaXNzdWVyIGNoZWNrIGVycm9ycwogICAgIHRvIGF2b2lkIHBvc3NpYmx5IG92ZXJ3cml0aW5nIG90aGVyIGVycm9ycyB3aGljaCB0aGUgY2FsbGJhY2sgZG9lcwogICAgIGhhbmRsZS4gSWYgYW4gYXBwbGljYXRpb24gZG9lcyBzZXQgdGhlIGZsYWcgdGhlbiB3ZSBhc3N1bWUgaXQga25vd3MKICAgICB3aGF0IGl0IGlzIGRvaW5nIGFuZCBjYW4gaGFuZGxlIHRoZSBuZXcgaW5mb3JtYXRpb25hbCBjb2RlcwogICAgIGFwcHJvcHJpYXRlbHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGZvciBhIG5hc3R5IGJ1ZyBpbiBBU04xX1RZUEUgaGFuZGxpbmcuIEFTTjFfVFlQRSBpcyB1c2VkIGZvcgogICAgIGEgZ2VuZXJhbCAiQU5ZIiB0eXBlLCBhcyBzdWNoIGl0IHNob3VsZCBiZSBhYmxlIHRvIGRlY29kZSBhbnl0aGluZwogICAgIGluY2x1ZGluZyB0YWdnZWQgdHlwZXMuIEhvd2V2ZXIgaXQgZGlkbid0IGNoZWNrIHRoZSBjbGFzcyBzbyBpdCB3b3VsZAogICAgIHdyb25nbHkgaW50ZXJwcmV0IHRhZ2dlZCB0eXBlcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlaXIgdW5pdmVyc2FsCiAgICAgY291bnRlcnBhcnQgYW5kIHVua25vd24gdHlwZXMgd2VyZSBqdXN0IHJlamVjdGVkLiBDaGFuZ2VkIHNvIHRoYXQgdGhlCiAgICAgdGFnZ2VkIGFuZCB1bmtub3duIHR5cGVzIGFyZSBoYW5kbGVkIGluIHRoZSBzYW1lIHdheSBhcyBhIFNFUVVFTkNFOgogICAgIHRoYXQgaXMgdGhlIGVuY29kaW5nIGlzIHN0b3JlZCBpbnRhY3QuIFRoZXJlIGlzIGFsc28gYSBuZXcgdHlwZQogICAgICJWX0FTTjFfT1RIRVIiIHdoaWNoIGlzIHVzZWQgd2hlbiB0aGUgY2xhc3MgaXMgbm90IHVuaXZlcnNhbCwgaW4gdGhpcwogICAgIGNhc2Ugd2UgaGF2ZSBubyBpZGVhIHdoYXQgdGhlIGFjdHVhbCB0eXBlIGlzIHNvIHdlIGp1c3QgbHVtcCB0aGVtIGFsbAogICAgIHRvZ2V0aGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE9uIFZNUywgc3Rkb3V0IG1heSB2ZXJ5IHdlbGwgbGVhZCB0byBhIGZpbGUgdGhhdCBpcyB3cml0dGVuIHRvCiAgICAgaW4gYSByZWNvcmQtb3JpZW50ZWQgZmFzaGlvbi4gIFRoYXQgbWVhbnMgdGhhdCBldmVyeSB3cml0ZSgpIHdpbGwKICAgICB3cml0ZSBhIHNlcGFyYXRlIHJlY29yZCwgd2hpY2ggd2lsbCBiZSByZWFkIHNlcGFyYXRlbHkgYnkgdGhlCiAgICAgcHJvZ3JhbXMgdHJ5aW5nIHRvIHJlYWQgZnJvbSBpdC4gIFRoaXMgY2FuIGJlIHZlcnkgY29uZnVzaW5nLgoKICAgICBUaGUgc29sdXRpb24gaXMgdG8gcHV0IGEgQklPIGZpbHRlciBpbiB0aGUgd2F5IHRoYXQgd2lsbCBidWZmZXIKICAgICB0ZXh0IHVudGlsIGEgbGluZWZlZWQgaXMgcmVhY2hlZCwgYW5kIHRoZW4gd3JpdGUgZXZlcnl0aGluZyBhCiAgICAgbGluZSBhdCBhIHRpbWUsIHNvIGV2ZXJ5IHJlY29yZCB3cml0dGVuIHdpbGwgYmUgYW4gYWN0dWFsIGxpbmUsCiAgICAgbm90IGNodW5rcyBvZiBsaW5lcyBhbmQgbm90ICh1c3VhbGx5IGRvZXNuJ3QgaGFwcGVuLCBidXQgSSd2ZQogICAgIHNlZW4gaXQgb25jZSkgc2V2ZXJhbCBsaW5lcyBpbiBvbmUgcmVjb3JkLiAgQklPX2ZfbGluZWJ1ZmZlcigpIGlzCiAgICAgdGhlIGFuc3dlci4KCiAgICAgQ3VycmVudGx5LCBpdCdzIGEgVk1TLW9ubHkgbWV0aG9kLCBiZWNhdXNlIHRoYXQncyB3aGVyZSBpdCBoYXMKICAgICBiZWVuIHRlc3RlZCB3ZWxsIGVub3VnaC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZW1vdmUgJ29wdGltaXplZCcgc3F1YXJpbmcgdmFyaWFudCBpbiBCTl9tb2RfbXVsX21vbnRnb21lcnksCiAgICAgaXQgY2FuIHJldHVybiBpbmNvcnJlY3QgcmVzdWx0cy4KICAgICAoTm90ZTogVGhlIGJ1Z2d5IHZhcmlhbnQgd2FzIG5vdCBlbmFibGVkIGluIE9wZW5TU0wgMC45LjVhLAogICAgIGJ1dCBpdCB3YXMgaW4gMC45LjYtYmV0YVsxMl0uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERpc2FibGUgdGhlIGNoZWNrIGZvciBjb250ZW50IGJlaW5nIHByZXNlbnQgd2hlbiB2ZXJpZnlpbmcgZGV0YWNoZWQKICAgICBzaWduYXR1cmVzIGluIHBrN19zbWltZS5jLiBTb21lIHZlcnNpb25zIG9mIE5ldHNjYXBlICh3cm9uZ2x5KQogICAgIGluY2x1ZGUgemVybyBsZW5ndGggY29udGVudCB3aGVuIHNpZ25pbmcgbWVzc2FnZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IEJJT19zaHV0ZG93bl93ciBtYWNybywgd2hpY2ggaW52b2tlcyB0aGUgQklPX0NfU0hVVERPV05fV1IKICAgICBCSU9fY3RybCAoZm9yIEJJTyBwYWlycykuCiAgICAgW0JvZG8gTfZsbGVyXQoKICAqKSBBZGQgRFNPIG1ldGhvZCBmb3IgVk1TLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEJ1ZyBmaXg6IE1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24gY291bGQgcHJvZHVjZSByZXN1bHRzIHdpdGggdGhlCiAgICAgd3Jvbmcgc2lnbi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIFJQTSBzcGVjaWZpY2F0aW9uIG9wZW5zc2wuc3BlYyBhbmQgbW9kaWZ5IGl0IHRvIGJ1aWxkIHRocmVlCiAgICAgcGFja2FnZXMuICBUaGUgZGVmYXVsdCBwYWNrYWdlIGNvbnRhaW5zIGFwcGxpY2F0aW9ucywgYXBwbGljYXRpb24KICAgICBkb2N1bWVudGF0aW9uIGFuZCBydW4tdGltZSBsaWJyYXJpZXMuICBUaGUgZGV2ZWwgcGFja2FnZSBjb250YWlucwogICAgIGluY2x1ZGUgZmlsZXMsIHN0YXRpYyBsaWJyYXJpZXMgYW5kIGZ1bmN0aW9uIGRvY3VtZW50YXRpb24uICBUaGUKICAgICBkb2MgcGFja2FnZSBjb250YWlucyB0aGUgY29udGVudHMgb2YgdGhlIGRvYyBkaXJlY3RvcnkuICBUaGUgb3JpZ2luYWwKICAgICBvcGVuc3NsLnNwZWMgd2FzIHByb3ZpZGVkIGJ5IERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KICAgICAKICAqKSBBZGQgYSBsYXJnZSBudW1iZXIgb2YgZG9jdW1lbnRhdGlvbiBmaWxlcyBmb3IgbWFueSBTU0wgcm91dGluZXMuCiAgICAgW0x1dHogSmFlbmlja2UgPEx1dHouSmFlbmlja2VAYWV0LlRVLUNvdHRidXMuREU+XQoKICAqKSBBZGQgYSBjb25maWd1cmF0aW9uIGVudHJ5IGZvciBTb255IE5ld3MgNC4KICAgICBbTkFLQUpJIEhpcm95dWtpIDxuYWthamlAdHV0cnAudHV0LmFjLmpwPl0KCiAgKikgRG9uJ3Qgc2V0IHRoZSB0d28gbW9zdCBzaWduaWZpY2FudCBiaXRzIHRvIG9uZSB3aGVuIGdlbmVyYXRpbmcgYQogICAgIHJhbmRvbSBudW1iZXIgPCBxIGluIHRoZSBEU0EgbGlicmFyeS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgTmV3IFNTTCBBUEkgbW9kZSAnU1NMX01PREVfQVVUT19SRVRSWScuICBUaGlzIGRpc2FibGVzIHRoZSBkZWZhdWx0CiAgICAgYmVoYXZpb3VyIHRoYXQgU1NMX3JlYWQgbWF5IHJlc3VsdCBpbiBTU0xfRVJST1JfV0FOVF9SRUFEIChldmVuIGlmCiAgICAgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlzIGJsb2NraW5nKSBpZiBhIGhhbmRzaGFrZSB0b29rIHBsYWNlLgogICAgIChUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbmVlZGVkIGJ5IGFwcGxpY2F0aW9ucyBzdWNoIGFzIHNfY2xpZW50CiAgICAgYW5kIHNfc2VydmVyIHRoYXQgdXNlIHNlbGVjdCgpIHRvIGRldGVybWluZSB3aGVuIHRvIHVzZSBTU0xfcmVhZDsKICAgICBidXQgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGtub3cgaW4gYWR2YW5jZSB3aGVuIHRvIGV4cGVjdCBkYXRhLCBpdAogICAgIGp1c3QgbWFrZXMgdGhpbmdzIG1vcmUgY29tcGxpY2F0ZWQuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBSQU5EX2VnZF9ieXRlcygpLCB3aGljaCBnaXZlcyBjb250cm9sIG92ZXIgdGhlIG51bWJlciBvZiBieXRlcyByZWFkCiAgICAgZnJvbSBFR0QuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBhIGZldyBtb3JlIEVCQ0RJQyBjb25kaXRpb25hbHMgdGhhdCBtYWtlIGByZXEnIGFuZCBgeDUwOScKICAgICB3b3JrIGJldHRlciBvbiBzdWNoIHN5c3RlbXMuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+XQoKICAqKSBBZGQgdHdvIGRlbW8gcHJvZ3JhbXMgZm9yIFBLQ1MxMl9wYXJzZSgpIGFuZCBQS0NTMTJfY3JlYXRlKCkuCiAgICAgVXBkYXRlIFBLQ1MxMl9wYXJzZSgpIHNvIGl0IGNvcGllcyB0aGUgZnJpZW5kbHlOYW1lIGFuZCB0aGUKICAgICBrZXlpZCB0byB0aGUgY2VydGlmaWNhdGVzIGF1eCBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBidWcgaW4gUEtDUzdfdmVyaWZ5KCkgd2hpY2ggY2F1c2VkIGFuIGluZmluaXRlIGxvb3AKICAgICBpZiB0aGVyZSB3YXMgbW9yZSB0aGFuIG9uZSBzaWduYXR1cmUuCiAgICAgW1N2ZW4gVXN6cGVsa2F0IDxzdUBjZWxvY29tLmRlPl0KCiAgKikgTWFqb3IgY2hhbmdlIGluIHV0aWwvbWtkZWYucGwgdG8gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbgogICAgIGFib3V0IGVhY2ggc3ltYm9sLCBhcyB3ZWxsIGFzIHByZXNlbnRpbmcgdmFyaWFibGVzIGFzIHdlbGwKICAgICBhcyBmdW5jdGlvbnMuICBUaGlzIGNoYW5nZSBtZWFucyB0aGF0IHRoZXJlJ3MgbiBtb3JlIG5lZWQKICAgICB0byByZWJ1aWxkIHRoZSAubnVtIGZpbGVzIHdoZW4gc29tZSBhbGdvcml0aG1zIGFyZSBleGNsdWRlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBbGxvdyB0aGUgdmVyaWZ5IHRpbWUgdG8gYmUgc2V0IGJ5IGFuIGFwcGxpY2F0aW9uLAogICAgIHJhdGhlciB0aGFuIGFsd2F5cyB1c2luZyB0aGUgY3VycmVudCB0aW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCiAgCiAgKikgUGhhc2UgMiB2ZXJpZnkgY29kZSByZW9yZ2FuaXNhdGlvbi4gVGhlIGNlcnRpZmljYXRlCiAgICAgdmVyaWZ5IGNvZGUgbm93IGxvb2tzIHVwIGFuIGlzc3VlciBjZXJ0aWZpY2F0ZSBieSBhCiAgICAgbnVtYmVyIG9mIGNyaXRlcmlhOiBzdWJqZWN0IG5hbWUsIGF1dGhvcml0eSBrZXkgaWQKICAgICBhbmQga2V5IHVzYWdlLiBJdCBhbHNvIHZlcmlmaWVzIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlcwogICAgIGJ5IHRoZSBzYW1lIGNyaXRlcmlhLiBUaGUgbWFpbiBjb21wYXJpc29uIGZ1bmN0aW9uIGlzCiAgICAgWDUwOV9jaGVja19pc3N1ZWQoKSB3aGljaCBwZXJmb3JtcyB0aGVzZSBjaGVja3MuCiAKICAgICBMb3Qgb2YgY2hhbmdlcyB3ZXJlIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMKICAgICB3aXRob3V0IGNvbXBsZXRlbHkgcmV3cml0aW5nIHRoZSBsb29rdXAgY29kZS4KIAogICAgIEF1dGhvcml0eSBhbmQgc3ViamVjdCBrZXkgaWRlbnRpZmllciBhcmUgbm93IGNhY2hlZC4KIAogICAgIFRoZSBMSEFTSCAnY2VydHMnIGlzIFg1MDlfU1RPUkUgaGFzIG5vdyBiZWVuIHJlcGxhY2VkCiAgICAgYnkgYSBTVEFDS19PRihYNTA5X09CSkVDVCkuIFRoaXMgaXMgbWFpbmx5IGJlY2F1c2UgYW4KICAgICBMSEFTSCBjYW4ndCBzdG9yZSBvciByZXRyaWV2ZSBtdWx0aXBsZSBvYmplY3RzIHdpdGgKICAgICB0aGUgc2FtZSBoYXNoIHZhbHVlLgoKICAgICBBcyBhIHJlc3VsdCB2YXJpb3VzIGZ1bmN0aW9ucyAod2hpY2ggd2VyZSBhbGwgaW50ZXJuYWwKICAgICB1c2Ugb25seSkgaGF2ZSBjaGFuZ2VkIHRvIGhhbmRsZSB0aGUgbmV3IFg1MDlfU1RPUkUKICAgICBzdHJ1Y3R1cmUuIFRoaXMgd2lsbCBicmVhayBhbnl0aGluZyB0aGF0IG1lc3NlZCByb3VuZAogICAgIHdpdGggWDUwOV9TVE9SRSBpbnRlcm5hbGx5LgogCiAgICAgVGhlIGZ1bmN0aW9ucyBYNTA5X1NUT1JFX2FkZF9jZXJ0KCkgbm93IGNoZWNrcyBmb3IgYW4KICAgICBleGFjdCBtYXRjaCwgcmF0aGVyIHRoYW4ganVzdCBzdWJqZWN0IG5hbWUuCiAKICAgICBUaGUgWDUwOV9TVE9SRSBBUEkgZG9lc24ndCBkaXJlY3RseSBzdXBwb3J0IHRoZSByZXRyaWV2YWwKICAgICBvZiBtdWx0aXBsZSBjZXJ0aWZpY2F0ZXMgbWF0Y2hpbmcgYSBnaXZlbiBjcml0ZXJpYSwgaG93ZXZlcgogICAgIHRoaXMgY2FuIGJlIHdvcmtlZCByb3VuZCBieSBwZXJmb3JtaW5nIGEgbG9va3VwIGZpcnN0CiAgICAgKHdoaWNoIHdpbGwgZmlsbCB0aGUgY2FjaGUgd2l0aCBjYW5kaWRhdGUgY2VydGlmaWNhdGVzKQogICAgIGFuZCB0aGVuIGV4YW1pbmluZyB0aGUgY2FjaGUgZm9yIG1hdGNoZXMuIFRoaXMgaXMgcHJvYmFibHkKICAgICB0aGUgYmVzdCB3ZSBjYW4gZG8gd2l0aG91dCB0aHJvd2luZyBvdXQgWDUwOV9MT09LVVAKICAgICBlbnRpcmVseSAobWF5YmUgbGF0ZXIuLi4pLgogCiAgICAgVGhlIFg1MDlfVkVSSUZZX0NUWCBzdHJ1Y3R1cmUgaGFzIGJlZW4gZW5oYW5jZWQgY29uc2lkZXJhYmx5LgogCiAgICAgQWxsIGNlcnRpZmljYXRlIGxvb2t1cCBvcGVyYXRpb25zIG5vdyBnbyB2aWEgYSBnZXRfaXNzdWVyKCkKICAgICBjYWxsYmFjay4gQWx0aG91Z2ggdGhpcyBjdXJyZW50bHkgdXNlcyBhbiBYNTA5X1NUT1JFIGl0CiAgICAgY2FuIGJlIHJlcGxhY2VkIGJ5IGN1c3RvbSBsb29rdXBzLiBUaGlzIGlzIGEgc2ltcGxlIHdheQogICAgIHRvIGJ5cGFzcyB0aGUgWDUwOV9TVE9SRSBoYWNrZXJ5IG5lY2Vzc2FyeSB0byBtYWtlIHRoaXMKICAgICB3b3JrIGFuZCBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgbW9yZSBlZmZpY2llbnQgdGVjaG5pcXVlcwogICAgIGluIGZ1dHVyZS4gQSB2ZXJ5IHNpbXBsZSB2ZXJzaW9uIHdoaWNoIHVzZXMgYSBzaW1wbGUKICAgICBTVEFDSyBmb3IgaXRzIHRydXN0ZWQgY2VydGlmaWNhdGUgc3RvcmUgaXMgYWxzbyBwcm92aWRlZAogICAgIHVzaW5nIFg1MDlfU1RPUkVfQ1RYX3RydXN0ZWRfc3RhY2soKS4KIAogICAgIFRoZSB2ZXJpZnlfY2IoKSBhbmQgdmVyaWZ5KCkgY2FsbGJhY2tzIG5vdyBoYXZlIGVxdWl2YWxlbnRzCiAgICAgaW4gdGhlIFg1MDlfU1RPUkVfQ1RYIHN0cnVjdHVyZS4KIAogICAgIFg1MDlfU1RPUkVfQ1RYIGFsc28gaGFzIGEgJ2ZsYWdzJyBmaWVsZCB3aGljaCBjYW4gYmUgdXNlZAogICAgIHRvIGN1c3RvbWlzZSB0aGUgdmVyaWZ5IGJlaGF2aW91ci4KICAgICBbU3RldmUgSGVuc29uXQogCiAgKikgQWRkIG5ldyBQS0NTIzcgc2lnbmluZyBvcHRpb24gUEtDUzdfTk9TTUlNRUNBUCB3aGljaCAKICAgICBleGNsdWRlcyBTL01JTUUgY2FwYWJpbGl0aWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFdoZW4gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGlzIHJlYWQgaW4ga2VlcCBhIGNvcHkgb2YgdGhlCiAgICAgb3JpZ2luYWwgZW5jb2Rpbmcgb2YgdGhlIHNpZ25lZCBkYXRhIGFuZCB1c2UgaXQgd2hlbiBvdXRwdXRpbmcKICAgICBhZ2Fpbi4gU2lnbmF0dXJlcyB0aGVuIHVzZSB0aGUgb3JpZ2luYWwgZW5jb2RpbmcgcmF0aGVyIHRoYW4KICAgICBhIGRlY29kZWQsIGVuY29kZWQgdmVyc2lvbiB3aGljaCBtYXkgY2F1c2UgcHJvYmxlbXMgaWYgdGhlCiAgICAgcmVxdWVzdCBpcyBpbXByb3Blcmx5IGVuY29kZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgQklPX3B1dHMgaW1wbGVtZW50YXRpb25zLCBjYWxsCiAgICAgYnVmZmVyX3dyaXRlKGIsIC4uLikgZGlyZWN0bHkgaW4gYnVmZmVyX3B1dHMgaW5zdGVhZCBvZiBjYWxsaW5nCiAgICAgQklPX3dyaXRlKGIsIC4uLikuCgogICAgIEluIEJJT19wdXRzLCBpbmNyZW1lbnQgYi0+bnVtX3dyaXRlIGFzIGluIEJJT193cml0ZS4KICAgICBbUGV0ZXIuU3lsdmVzdGVyQEVkZWxXZWIuZnJdCgogICopIEZpeCBCTl9tdWxfd29yZCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHdvcmQgaXMgMC4gKFdlIGhhdmUgdG8gdXNlCiAgICAgQk5femVybywgd2UgbWF5IG5vdCByZXR1cm4gYSBCSUdOVU0gd2l0aCBhbiBhcnJheSBjb25zaXN0aW5nIG9mCiAgICAgd29yZHMgc2V0IHRvIHplcm8uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEF2b2lkIGNhbGxpbmcgYWJvcnQoKSBmcm9tIHdpdGhpbiB0aGUgbGlicmFyeSB3aGVuIHByb2JsZW1zIGFyZQogICAgIGRldGVjdGVkLCBleGNlcHQgaWYgcHJlcHJvY2Vzc29yIHN5bWJvbHMgaGF2ZSBiZWVuIGRlZmluZWQKICAgICAoc3VjaCBhcyBSRUZfQ0hFQ0ssIEJOX0RFQlVHIGV0Yy4pLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBvcGVuc3NsIGFwcGxpY2F0aW9uICdyc2F1dGwnLiBUaGlzIHV0aWxpdHkgY2FuIGJlCiAgICAgdXNlZCBmb3IgbG93IGxldmVsIFJTQSBvcGVyYXRpb25zLiBERVIgcHVibGljIGtleQogICAgIEJJTy9mcCByb3V0aW5lcyBhbHNvIGFkZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBDb25maWd1cmUgZW50cnkgYW5kIHBhdGNoZXMgZm9yIGNvbXBpbGluZyBvbiBRTlggNC4KICAgICBbQW5kcmVhcyBTY2huZWlkZXIgPGFuZHJlYXNAZHMzLmV0ZWNoLmZoLWhhbWJ1cmcuZGU+XQoKICAqKSBBIGRlbW8gc3RhdGUtbWFjaGluZSBpbXBsZW1lbnRhdGlvbiB3YXMgc3BvbnNvcmVkIGJ5CiAgICAgTnVyb24gKGh0dHA6Ly93d3cubnVyb24uY29tLykgYW5kIGlzIG5vdyBhdmFpbGFibGUgaW4KICAgICBkZW1vcy9zdGF0ZV9tYWNoaW5lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBOZXcgb3B0aW9ucyBhZGRlZCB0byB0aGUgJ2Rnc3QnIHV0aWxpdHkgZm9yIHNpZ25hdHVyZQogICAgIGdlbmVyYXRpb24gYW5kIHZlcmlmaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVbnJlY29nbml6ZWQgUEtDUyM3IGNvbnRlbnQgdHlwZXMgYXJlIG5vdyBoYW5kbGVkIHZpYSBhCiAgICAgY2F0Y2ggYWxsIEFTTjFfVFlQRSBzdHJ1Y3R1cmUuIFRoaXMgYWxsb3dzIHVuc3VwcG9ydGVkCiAgICAgdHlwZXMgdG8gYmUgc3RvcmVkIGFzIGEgImJsb2IiIGFuZCBhbiBhcHBsaWNhdGlvbiBjYW4KICAgICBlbmNvZGUgYW5kIGRlY29kZSBpdCBtYW51YWxseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdmFyaW91cyBzaWduZWQvdW5zaWduZWQgaXNzdWVzIHRvIG1ha2UgYV9zdHJleC5jCiAgICAgY29tcGlsZSB1bmRlciBWQysrLgogICAgIFtPc2NhciBKYWNvYnNzb24gPG9zY2FyLmphY29ic3NvbkBjZWxvY29tLmNvbT5dCgogICopIEFTTjEgZml4ZXMuIGkyZF9BU04xX09CSkVDVCB3YXMgbm90IHJldHVybmluZyB0aGUgY29ycmVjdAogICAgIGxlbmd0aCBpZiBwYXNzZWQgYSBidWZmZXIuIEFTTjFfSU5URUdFUl90b19CTiBmYWlsZWQKICAgICBpZiBwYXNzZWQgYSBOVUxMIEJOIGFuZCBpdHMgYXJndW1lbnQgd2FzIG5lZ2F0aXZlLgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IFN2ZW4gSGVpYmVyZyA8c3ZlbkB0YXJ0dS5jeWJlci5lZT5dCgogICopIE1vZGlmaWNhdGlvbiB0byBQS0NTIzcgZW5jb2Rpbmcgcm91dGluZXMgdG8gb3V0cHV0IGRlZmluaXRlCiAgICAgbGVuZ3RoIGVuY29kaW5nLiBTaW5jZSBjdXJyZW50bHkgdGhlIHdob2xlIHN0cnVjdHVyZXMgYXJlIGluCiAgICAgbWVtb3J5IHRoZXJlJ3Mgbm90IHJlYWwgcG9pbnQgaW4gdXNpbmcgaW5kZWZpbml0ZSBsZW5ndGggCiAgICAgY29uc3RydWN0ZWQgZW5jb2RpbmcuIEhvd2V2ZXIgaWYgT3BlblNTTCBpcyBjb21waWxlZCB3aXRoCiAgICAgdGhlIGZsYWcgUEtDUzdfSU5ERUZJTklURV9FTkNPRElORyB0aGUgb2xkIGZvcm0gaXMgdXNlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBCSU9fdnByaW50ZigpIGFuZCBCSU9fdnNucHJpbnRmKCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkZWQgbW9yZSBwcmVmaXhlcyB0byBwYXJzZSBmb3IgaW4gdGhlIHRoZSBzdHJpbmdzIHdyaXR0ZW4KICAgICB0aHJvdWdoIGEgbG9nZ2luZyBiaW8sIHRvIGNvdmVyIGFsbCB0aGUgbGV2ZWxzIHRoYXQgYXJlIGF2YWlsYWJsZQogICAgIHRocm91Z2ggc3lzbG9nLiAgVGhlIHByZWZpeGVzIGFyZSBub3c6CgoJUEFOSUMsIEVNRVJHLCBFTVIJPT4JTE9HX0VNRVJHCglBTEVSVCwgQUxSCQk9PglMT0dfQUxFUlQKCUNSSVQsIENSSQkJPT4JTE9HX0NSSVQKCUVSUk9SLCBFUlIJCT0+CUxPR19FUlIKCVdBUk5JTkcsIFdBUk4sIFdBUgk9PglMT0dfV0FSTklORwoJTk9USUNFLCBOT1RFLCBOT1QJPT4JTE9HX05PVElDRQoJSU5GTywgSU5GCQk9PglMT0dfSU5GTwoJREVCVUcsIERCRwkJPT4JTE9HX0RFQlVHCgogICAgIGFuZCBhcyBiZWZvcmUsIGlmIG5vbmUgb2YgdGhvc2UgcHJlZml4ZXMgYXJlIHByZXNlbnQgYXQgdGhlCiAgICAgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIExPR19FUlIgaXMgY2hvc2VuLgoKICAgICBPbiBXaW4zMiwgdGhlIExPR18qIGxldmVscyBhcmUgbWFwcGVkIGFjY29yZGluZyB0byB0aGlzOgoKCUxPR19FTUVSRywgTE9HX0FMRVJULCBMT0dfQ1JJVCwgTE9HX0VSUgk9PiBFVkVOVExPR19FUlJPUl9UWVBFCglMT0dfV0FSTklORwkJCQk9PiBFVkVOVExPR19XQVJOSU5HX1RZUEUKCUxPR19OT1RJQ0UsIExPR19JTkZPLCBMT0dfREVCVUcJCT0+IEVWRU5UTE9HX0lORk9STUFUSU9OX1RZUEUKCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFkZSBpdCBwb3NzaWJsZSB0byByZWNvbmZpZ3VyZSB3aXRoIGp1c3QgdGhlIGNvbmZpZ3VyYXRpb24KICAgICBhcmd1bWVudCAicmVjb25mIiBvciAicmVjb25maWd1cmUiLiAgVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKICAgICBhcmUgc3RvcmVkIGluIE1ha2VmaWxlLnNzbCBpbiB0aGUgdmFyaWFibGUgQ09ORklHVVJFX0FSR1MsCiAgICAgYW5kIGFyZSByZXRyaWV2ZWQgZnJvbSB0aGVyZSB3aGVuIHJlY29uZmlndXJpbmcuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTUQ0IGltcGxlbWVudGVkLgogICAgIFtBc3NhciBXZXN0ZXJsdW5kIDxhc3NhckBzaWNzLnNlPiwgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGFyZ3VtZW50cyAtQ0FmaWxlIGFuZCAtQ0FwYXRoIHRvIHRoZSBwa2NzMTIgdXRpbGl0eS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUaGUgb2JqX2RhdC5wbCBzY3JpcHQgd2FzIG1lc3NpbmcgdXAgdGhlIHNvcnRpbmcgb2Ygb2JqZWN0CiAgICAgbmFtZXMuIFRoZSByZWFzb24gd2FzIHRoYXQgaXQgY29tcGFyZWQgdGhlIHF1b3RlZCB2ZXJzaW9uCiAgICAgb2Ygc3RyaW5ncyBhcyBhIHJlc3VsdCAiT0NTUCIgPiAiT0NTUCBTaWduaW5nIiBiZWNhdXNlCiAgICAgIiA+IFNQQUNFLiBDaGFuZ2VkIHNjcmlwdCB0byBzdG9yZSB1bnF1b3RlZCB2ZXJzaW9ucyBvZgogICAgIG5hbWVzIGFuZCBhZGQgcXVvdGVzIG9uIG91dHB1dC4gSXQgd2FzIGFsc28gb21pdHRpbmcgc29tZQogICAgIG5hbWVzIGZyb20gdGhlIGxvb2t1cCB0YWJsZSBpZiB0aGV5IHdlcmUgZ2l2ZW4gYSBkZWZhdWx0CiAgICAgdmFsdWUgKHRoYXQgaXMgaWYgU04gaXMgbWlzc2luZyBpdCBpcyBnaXZlbiB0aGUgc2FtZQogICAgIHZhbHVlIGFzIExOIGFuZCB2aWNlIHZlcnNhKSwgdGhlc2UgYXJlIG5vdyBhZGRlZCBvbiB0aGUKICAgICBncm91bmRzIHRoYXQgaWYgYW4gb2JqZWN0IGhhcyBhIG5hbWUgd2Ugc2hvdWxkIGJlIGFibGUgdG8KICAgICBsb29rIGl0IHVwLiBGaW5hbGx5IGFkZGVkIHdhcm5pbmcgb3V0cHV0IHdoZW4gZHVwbGljYXRlCiAgICAgc2hvcnQgb3IgbG9uZyBuYW1lcyBhcmUgZm91bmQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlcyBuZWVkZWQgZm9yIFRhbmRlbSBOU0suCiAgICAgW1Njb3R0IFVyb2ZmIDxzY290dEB4eXByby5jb20+XQoKICAqKSBGaXggU1NMIDIuMCByb2xsYmFjayBjaGVja2luZzogRHVlIHRvIGFuIG9mZi1ieS1vbmUgZXJyb3IgaW4KICAgICBSU0FfcGFkZGluZ19jaGVja19TU0x2MjMoKSwgc3BlY2lhbCBwYWRkaW5nIHdhcyBuZXZlciBkZXRlY3RlZAogICAgIGFuZCB0aHVzIHRoZSBTU0wgMy4wL1RMUyAxLjAgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBwcm90b2NvbAogICAgIHZlcnNpb24gcm9sbGJhY2sgYXR0YWNrcyB3YXMgbm90IGVmZmVjdGl2ZS4KCiAgICAgSW4gczIzX2NsbnQuYywgZG9uJ3QgdXNlIHNwZWNpYWwgcm9sbGJhY2stYXR0YWNrIGRldGVjdGlvbiBwYWRkaW5nCiAgICAgKFJTQV9TU0xWMjNfUEFERElORykgaWYgU1NMIDIuMCBpcyB0aGUgb25seSBwcm90b2NvbCBlbmFibGVkIGluIHRoZQogICAgIGNsaWVudDsgc2ltaWxhcmx5LCBpbiBzMjNfc3J2ci5jLCBkb24ndCBkbyB0aGUgcm9sbGJhY2sgY2hlY2sgaWYKICAgICBTU0wgMi4wIGlzIHRoZSBvbmx5IHByb3RvY29sIGVuYWJsZWQgaW4gdGhlIHNlcnZlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGdldCBoZXhkdW1wcyBvZiB1bnByaW50YWJsZSBkYXRhIHdpdGggJ29wZW5zc2wKICAgICBhc24xcGFyc2UnLiAgQnkgaW1wbGljYXRpb24sIHRoZSBmdW5jdGlvbnMgQVNOMV9wYXJzZV9kdW1wKCkgYW5kCiAgICAgQklPX2R1bXBfaW5kZW50KCkgYXJlIGFkZGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbnMgQVNOMV9TVFJJTkdfcHJpbnRfZXgoKSBhbmQgWDUwOV9OQU1FX3ByaW50X2V4KCkKICAgICB0aGVzZSBwcmludCBvdXQgc3RyaW5ncyBhbmQgbmFtZSBzdHJ1Y3R1cmVzIGJhc2VkIG9uIHZhcmlvdXMKICAgICBmbGFncyBpbmNsdWRpbmcgUkZDMjI1MyBzdXBwb3J0IGFuZCBwcm9wZXIgaGFuZGxpbmcgb2YKICAgICBtdWx0aWJ5dGUgY2hhcmFjdGVycy4gQWRkZWQgb3B0aW9ucyB0byB0aGUgJ3g1MDknIHV0aWxpdHkgCiAgICAgdG8gYWxsb3cgdGhlIHZhcmlvdXMgZmxhZ3MgdG8gYmUgc2V0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgZml4ZXMgdG8gdXNlIEFTTjFfVElNRSBpbnN0ZWFkIG9mIEFTTjFfVVRDVElNRS4KICAgICBBbHNvIGNoYW5nZSB0aGUgZnVuY3Rpb25zIFg1MDlfY21wX2N1cnJlbnRfdGltZSgpIGFuZAogICAgIFg1MDlfZ210aW1lX2FkaigpIHdvcmsgd2l0aCBhbiBBU04xX1RJTUUgc3RydWN0dXJlLAogICAgIHRoaXMgd2lsbCBlbmFibGUgY2VydGlmaWNhdGVzIHVzaW5nIEdlbmVyYWxpemVkVGltZSBpbiB2YWxpZGl0eQogICAgIGRhdGVzIHRvIGJlIGNoZWNrZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0aGUgTkVHX1BVQktFWV9CVUcgY29kZSAod2hpY2ggdG9sZXJhdGVzIGludmFsaWQKICAgICBuZWdhdGl2ZSBwdWJsaWMga2V5IGVuY29kaW5ncykgb24gYnkgZGVmYXVsdCwKICAgICBOT19ORUdfUFVCS0VZX0JVRyBjYW4gYmUgc2V0IHRvIGRpc2FibGUgaXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIGMyaV9BU04xX09CSkVDVCgpIHdoaWNoIGFjdHMgb24gQVNOMV9PQkpFQ1QKICAgICBjb250ZW50IG9jdGV0cy4gQW4gaTJjX0FTTjFfT0JKRUNUIGlzIHVubmVjZXNzYXJ5IGJlY2F1c2UKICAgICB0aGUgZW5jb2RpbmcgY2FuIGJlIHRyaXZpYWxseSBvYnRhaW5lZCBmcm9tIHRoZSBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgY3J5cHRvL2Vyci5jIGxvY2tpbmcgYnVnZml4OiBVc2Ugd3JpdGUgbG9ja3MgKENSWVBUT193X1t1bl1sb2NrKSwKICAgICBub3QgcmVhZCBsb2NrcyAoQ1JZUFRPX3JfW3VuXWxvY2spLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEEgZmlyc3QgYXR0ZW1wdCBhdCBjcmVhdGluZyBvZmZpY2lhbCBzdXBwb3J0IGZvciBzaGFyZWQKICAgICBsaWJyYXJpZXMgdGhyb3VnaCBjb25maWd1cmF0aW9uLiAgSSd2ZSBrZXB0IGl0IHNvIHRoZQogICAgIGRlZmF1bHQgaXMgc3RhdGljIGxpYnJhcmllcyBvbmx5LCBhbmQgdGhlIE9wZW5TU0wgcHJvZ3JhbXMKICAgICBhcmUgYWx3YXlzIHN0YXRpY2FsbHkgbGlua2VkIGZvciBub3csIGJ1dCB0aGVyZSBhcmUKICAgICBwcmVwYXJhdGlvbnMgZm9yIGR5bmFtaWMgbGlua2luZyBpbiBwbGFjZS4KICAgICBUaGlzIGhhcyBiZWVuIHRlc3RlZCBvbiBMaW51eCBhbmQgVHJ1NjQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmFuZG9tbmVzcyBwb2xsaW5nIGZ1bmN0aW9uIGZvciBXaW45eCwgYXMgZGVzY3JpYmVkIGluOgogICAgIFBldGVyIEd1dG1hbm4sIFNvZnR3YXJlIEdlbmVyYXRpb24gb2YgUHJhY3RpY2FsbHkgU3Ryb25nCiAgICAgUmFuZG9tIE51bWJlcnMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBzbyBQUk5HIGlzIHNlZWRlZCBpbiByZXEgaWYgdXNpbmcgYW4gYWxyZWFkeSBleGlzdGluZwogICAgIERTQSBrZXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbnMgdG8gc21pbWUgYXBwbGljYXRpb24uIC1pbmZvcm0gYW5kIC1vdXRmb3JtCiAgICAgYWxsb3cgYWx0ZXJuYXRpdmUgZm9ybWF0cyBmb3IgdGhlIFMvTUlNRSBtZXNzYWdlIGluY2x1ZGluZwogICAgIFBFTSBhbmQgREVSLiBUaGUgLWNvbnRlbnQgb3B0aW9uIGFsbG93cyB0aGUgY29udGVudCB0byBiZQogICAgIHNwZWNpZmllZCBzZXBhcmF0ZWx5LiBUaGlzIHNob3VsZCBhbGxvdyB0aGluZ3MgbGlrZSBOZXRzY2FwZQogICAgIGZvcm0gc2lnbmluZyBvdXRwdXQgZWFzaWVyIHRvIHZlcmlmeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlIEFTTjEgZW5jb2Rpbmcgb2YgdGFncyB1c2luZyB0aGUgJ2xvbmcgZm9ybScuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IEFTTjEgZnVuY3Rpb25zLCBpMmNfKiBhbmQgYzJpXyogZm9yIElOVEVHRVIgYW5kIEJJVAogICAgIFNUUklORyB0eXBlcy4gVGhlc2UgY29udmVydCBjb250ZW50IG9jdGV0cyB0byBhbmQgZnJvbSB0aGUKICAgICB1bmRlcmx5aW5nIHR5cGUuIFRoZSBhY3R1YWwgdGFnIGFuZCBsZW5ndGggb2N0ZXRzIGFyZQogICAgIGFscmVhZHkgYXNzdW1lZCB0byBoYXZlIGJlZW4gcmVhZCBpbiBhbmQgY2hlY2tlZC4gVGhlc2UKICAgICBhcmUgbmVlZGVkIGJlY2F1c2UgYWxsIG90aGVyIHN0cmluZyB0eXBlcyBoYXZlIHZpcnR1YWxseQogICAgIGlkZW50aWNhbCBoYW5kbGluZyBhcGFydCBmcm9tIHRoZSB0YWcuIEJ5IGhhdmluZyB2ZXJzaW9ucwogICAgIG9mIHRoZSBBU04xIGZ1bmN0aW9ucyB0aGF0IGp1c3Qgb3BlcmF0ZSBvbiBjb250ZW50IG9jdGV0cwogICAgIElNUExJQ0lUIHRhZ2dpbmcgY2FuIGJlIGhhbmRsZWQgcHJvcGVybHkuIEl0IGFsc28gYWxsb3dzCiAgICAgdGhlIEFTTjFfRU5VTUVSQVRFRCBjb2RlIHRvIGJlIGN1dCBkb3duIGJlY2F1c2UgQVNOMV9FTlVNRVJBVEVECiAgICAgYW5kIEFTTjFfSU5URUdFUiBhcmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHRhZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIGhhbmRsaW5nIG9mIE9JRCBvYmplY3RzIGFzIGZvbGxvd3M6CgogICAgIC0gTmV3IG9iamVjdCBpZGVudGlmaWVycyBhcmUgaW5zZXJ0ZWQgaW4gb2JqZWN0cy50eHQsIGZvbGxvd2luZwogICAgICAgdGhlIHN5bnRheCBnaXZlbiBpbiBvYmplY3RzLlJFQURNRS4KICAgICAtIG9iamVjdHMucGwgaXMgdXNlZCB0byBwcm9jZXNzIG9ial9tYWMubnVtIGFuZCBjcmVhdGUgYSBuZXcKICAgICAgIG9ial9tYWMuaC4KICAgICAtIG9ial9kYXQucGwgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb2JqX2RhdC5oLCB1c2luZyB0aGUgZGF0YSBpbgogICAgICAgb2JqX21hYy5oLgoKICAgICBUaGlzIGlzIGN1cnJlbnRseSBraW5kIG9mIGEgaGFjaywgYW5kIHRoZSBwZXJsIGNvZGUgaW4gb2JqZWN0cy5wbAogICAgIGlzbid0IHZlcnkgZWxlZ2FudCwgYnV0IGl0IHdvcmtzIGFzIEkgaW50ZW5kZWQuICBUaGUgc2ltcGxlc3Qgd2F5CiAgICAgdG8gY2hlY2sgdGhhdCBpdCB3b3JrZWQgY29ycmVjdGx5IGlzIHRvIGxvb2sgaW4gb2JqX2RhdC5oIGFuZAogICAgIGNoZWNrIHRoZSBhcnJheSBuaWRfb2JqcyBhbmQgbWFrZSBzdXJlIHRoZSBvYmplY3RzIGhhdmVuJ3QgbW92ZWQKICAgICBhcm91bmQgKHRoaXMgaXMgaW1wb3J0YW50ISkuICBBZGRpdGlvbnMgYXJlIE9LLCBhcyB3ZWxsIGFzCiAgICAgY29uc2lzdGVudCBuYW1lIGNoYW5nZXMuIAogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBCU0Qtc3R5bGUgTUQ1LWJhc2VkIHBhc3N3b3JkcyB0byAnb3BlbnNzbCBwYXNzd2QnIChvcHRpb24gJy0xJykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkaXRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgJy1yYW5kIGZpbGUnIHRvICdvcGVuc3NsIHJlcScuCiAgICAgVGhlIGdpdmVuIGZpbGUgYWRkcyB0byB3aGF0ZXZlciBoYXMgYWxyZWFkeSBiZWVuIHNlZWRlZCBpbnRvIHRoZQogICAgIHJhbmRvbSBwb29sIHRocm91Z2ggdGhlIFJBTkRGSUxFIGNvbmZpZ3VyYXRpb24gZmlsZSBvcHRpb24gb3IKICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgdGhlIGRlZmF1bHQgcmFuZG9tIHN0YXRlIGZpbGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgbWtzdGFjay5wbCBub3cgc29ydHMgZWFjaCBtYWNybyBncm91cCBpbnRvIGxleGljYWwgb3JkZXIuCiAgICAgUHJldmlvdXNseSB0aGUgb3V0cHV0IG9yZGVyIGRlcGVuZGVkIG9uIHRoZSBvcmRlciB0aGUgZmlsZXMKICAgICBhcHBlYXJlZCBpbiB0aGUgZGlyZWN0b3J5LCByZXN1bHRpbmcgaW4gbmVlZGxlc3MgcmV3cml0aW5nCiAgICAgb2Ygc2FmZXN0YWNrLmggLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBhdGNoZXMgdG8gbWFrZSBPcGVuU1NMIGNvbXBpbGUgdW5kZXIgV2luMzIgYWdhaW4uIE1vc3RseQogICAgIHdvcmsgYXJvdW5kcyBmb3IgdGhlIFZDKysgcHJvYmxlbSB0aGF0IGl0IHRyZWF0cyBmdW5jKCkgYXMKICAgICBmdW5jKHZvaWQpLiBBbHNvIHN0cmlwcGVkIG91dCB0aGUgcGFydHMgb2YgbWtkZWYucGwgdGhhdAogICAgIGFkZGVkIGV4dHJhIHR5cGVzYWZlIGZ1bmN0aW9uczogdGhlc2Ugbm8gbG9uZ2VyIGV4aXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlb3JnYW5pc2F0aW9uIG9mIHRoZSBzdGFjayBjb2RlLiBUaGUgbWFjcm9zIGFyZSBub3cgYWxsIAogICAgIGNvbGxlY3RlZCBpbiBzYWZlc3RhY2suaCAuIEVhY2ggbWFjcm8gaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZgogICAgIGEgInN0YWNrIG1hY3JvIiBvZiB0aGUgZm9ybSBTS01fPG5hbWU+KHR5cGUsIGEsIGIpLiBUaGUgCiAgICAgREVCVUdfU0FGRVNUQUNLIGlzIG5vdyBoYW5kbGVkIGluIHRlcm1zIG9mIGZ1bmN0aW9uIGNhc3RzLAogICAgIHRoaXMgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgcmV0YWluaW5nIHR5cGUgc2FmZXR5IHdpdGhvdXQgdGhlCiAgICAgdXNlIG9mIGFkZGl0aW9uYWwgZnVuY3Rpb25zLiBJZiBERUJVR19TQUZFU1RBQ0sgaXMgbm90IGRlZmluZWQKICAgICB0aGVuIHRoZSBub24gdHlwZXNhZmUgbWFjcm9zIGFyZSB1c2VkIGluc3RlYWQuIEFsc28gbW9kaWZpZWQgdGhlCiAgICAgbWtzdGFjay5wbCBzY3JpcHQgdG8gaGFuZGxlIHRoZSBuZXcgZm9ybS4gTmVlZHMgdGVzdGluZyB0byBzZWUKICAgICBpZiB3aGljaCAoaWYgYW55KSBjb21waWxlcnMgaXQgY2hva2VzIGFuZCBtYXliZSBtYWtlIERFQlVHX1NBRkVTVEFDSwogICAgIHRoZSBkZWZhdWx0IGlmIG5vIG1ham9yIHByb2JsZW1zLiBTaW1pbGFyIGJlaGF2aW91ciBmb3IgQVNOMV9TRVRfT0YKICAgICBhbmQgUEtDUzEyX1NUQUNLX09GLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFdoZW4gc29tZSB2ZXJzaW9ucyBvZiBJSVMgdXNlIHRoZSAnTkVUJyBmb3JtIG9mIHByaXZhdGUga2V5IHRoZQogICAgIGtleSBkZXJpdmF0aW9uIGFsZ29yaXRobSBpcyBkaWZmZXJlbnQuIE5vcm1hbGx5IE1ENShwYXNzd29yZCkgaXMKICAgICB1c2VkIGFzIGEgMTI4IGJpdCBSQzQga2V5LiBJbiB0aGUgbW9kaWZpZWQgY2FzZQogICAgIE1ENShNRDUocGFzc3dvcmQpICsgIlNHQ0tFWVNBTFQiKSAgaXMgdXNlZCBpbnN0ZWFkLiBBZGRlZCBzb21lCiAgICAgbmV3IGZ1bmN0aW9ucyBpMmRfUlNBX05FVCgpLCBkMmlfUlNBX05FVCgpIGV0YyB3aGljaCBhcmUgdGhlIHNhbWUKICAgICBhcyB0aGUgb2xkIE5ldHNjYXBlX1JTQSBmdW5jdGlvbnMgZXhjZXB0IHRoZXkgaGF2ZSBhbiBhZGRpdGlvbmFsCiAgICAgJ3NnY2tleScgcGFyYW1ldGVyIHdoaWNoIHVzZXMgdGhlIG1vZGlmaWVkIGFsZ29yaXRobS4gQWxzbyBhZGRlZAogICAgIGFuIC1zZ2NrZXkgY29tbWFuZCBsaW5lIG9wdGlvbiB0byB0aGUgcnNhIHV0aWxpdHkuIFRoYW5rcyB0byAKICAgICBBZHJpYW4gUGVjayA8YmVydGllQG5jaXBoZXIuY29tPiBmb3IgcG9zdGluZyBkZXRhaWxzIG9mIHRoZSBtb2RpZmllZAogICAgIGFsZ29yaXRobSB0byBvcGVuc3NsLWRldi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUaGUgZXZwX2xvY2FsLmggbWFjcm9zIHdlcmUgdXNpbmcgJ2MuIyNrbmFtZScgd2hpY2ggcmVzdWx0ZWQgaW4KICAgICBpbnZhbGlkIGV4cGFuc2lvbiBvbiBzb21lIHN5c3RlbXMgKFNDTyA1LjAuNSBmb3IgZXhhbXBsZSkuCiAgICAgQ29ycmVjdGVkIHRvICdjLmtuYW1lJy4KICAgICBbUGhpbGxpcCBQb3JjaCA8cm9vdEB0aGVwb3JjaC5jb20+XQoKICAqKSBOZXcgWDUwOV9nZXQxX2VtYWlsKCkgYW5kIFg1MDlfUkVRX2dldDFfZW1haWwoKSBmdW5jdGlvbnMgdGhhdCByZXR1cm4KICAgICBhIFNUQUNLIG9mIGVtYWlsIGFkZHJlc3NlcyBmcm9tIGEgY2VydGlmaWNhdGUgb3IgcmVxdWVzdCwgdGhlc2UgbG9vawogICAgIGluIHRoZSBzdWJqZWN0IG5hbWUgYW5kIHRoZSBzdWJqZWN0IGFsdGVybmF0aXZlIG5hbWUgZXh0ZW5zaW9ucyBhbmQgCiAgICAgb21pdCBhbnkgZHVwbGljYXRlIGFkZHJlc3Nlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZS1pbXBsZW1lbnQgQk5fbW9kX2V4cDJfbW9udCB1c2luZyBpbmRlcGVuZGVudCAoYW5kIGxhcmdlcikgd2luZG93cy4KICAgICBUaGlzIG1ha2VzIERTQSB2ZXJpZmljYXRpb24gYWJvdXQgMiAlIGZhc3Rlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbmNyZWFzZSBtYXhpbXVtIHdpbmRvdyBzaXplIGluIEJOX21vZF9leHBfLi4uIHRvIDYgYml0cyBpbnN0ZWFkIG9mIDUKICAgICAobWVhbmluZyB0aGF0IG5vdyAyXjUgdmFsdWVzIHdpbGwgYmUgcHJlY29tcHV0ZWQsIHdoaWNoIGlzIG9ubHkgNCBLQgogICAgIHBsdXMgb3ZlcmhlYWQgZm9yIDEwMjQgYml0IG1vZHVsaSkuCiAgICAgVGhpcyBtYWtlcyBleHBvbmVudGlhdGlvbnMgYWJvdXQgMC41ICUgZmFzdGVyIGZvciAxMDI0IGJpdAogICAgIGV4cG9uZW50cyAoYXMgbWVhc3VyZWQgYnkgIm9wZW5zc2wgc3BlZWQgcnNhMjA0OCIpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlbmFtZSBtZW1vcnkgaGFuZGxpbmcgbWFjcm9zIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyCiAgICAgc29mdHdhcmU6CiAgICAgICAgICBNYWxsb2MgICAgICAgICA9PiAgT1BFTlNTTF9tYWxsb2MKICAgICAgICAgIE1hbGxvY19sb2NrZWQgID0+ICBPUEVOU1NMX21hbGxvY19sb2NrZWQKICAgICAgICAgIFJlYWxsb2MgICAgICAgID0+ICBPUEVOU1NMX3JlYWxsb2MKICAgICAgICAgIEZyZWUgICAgICAgICAgID0+ICBPUEVOU1NMX2ZyZWUKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fbW9kX2V4cF9tb250X3dvcmQgZm9yIHNtYWxsIGJhc2VzIChyb3VnaGx5IDE1JQogICAgIGZhc3RlciB0aGFuIEJOX21vZF9leHBfbW9udCwgaS5lLiA3JSBmb3IgYSBmdWxsIERIIGV4Y2hhbmdlKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDeWdXaW4zMiBzdXBwb3J0LgogICAgIFtKb2huIEphcnZpZSA8amphcnZpZUBuZXdzZ3V5LmNvbT5dCgogICopIFRoZSB0eXBlLXNhZmUgc3RhY2sgY29kZSBoYXMgYmVlbiByZWppZ2dlZC4gSXQgaXMgbm93IG9ubHkgY29tcGlsZWQKICAgICBpbiB3aGVuIE9wZW5TU0wgaXMgY29uZmlndXJlZCB3aXRoIHRoZSBERUJVR19TQUZFU1RBQ0sgb3B0aW9uIGFuZAogICAgIGJ5IGRlZmF1bHQgYWxsIHR5cGUtc3BlY2lmaWMgc3RhY2sgZnVuY3Rpb25zIGFyZSAiI2RlZmluZSJkIGJhY2sgdG8KICAgICBzdGFuZGFyZCBzdGFjayBmdW5jdGlvbnMuIFRoaXMgcmVzdWx0cyBpbiBtb3JlIHN0cmVhbWxpbmVkIG91dHB1dAogICAgIGJ1dCByZXRhaW5zIHRoZSB0eXBlLXNhZmV0eSBjaGVja2luZyBwb3NzaWJpbGl0aWVzIG9mIHRoZSBvcmlnaW5hbAogICAgIGFwcHJvYWNoLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFRoZSBTVEFDSyBjb2RlIGhhcyBiZWVuIGNsZWFuZWQgdXAsIGFuZCBjZXJ0YWluIHR5cGUgZGVjbGFyYXRpb25zCiAgICAgdGhhdCBkaWRuJ3QgbWFrZSBhIGxvdCBvZiBzZW5zZSBoYXZlIGJlZW4gYnJvdWdodCBpbiBsaW5lLiBUaGlzIGhhcwogICAgIGFsc28gaW52b2x2ZWQgYSBjbGVhbnVwIG9mIHNvcnRzIGluIHNhZmVzdGFjay5oIHRvIG1vcmUgY29ycmVjdGx5CiAgICAgbWFwIHR5cGUtc2FmZSBzdGFjayBmdW5jdGlvbnMgb250byB0aGVpciBwbGFpbiBzdGFjayBjb3VudGVycGFydHMuCiAgICAgVGhpcyB3b3JrIGhhcyBhbHNvIHJlc3VsdGVkIGluIGEgdmFyaWV0eSBvZiAiY29uc3QiaWZpY2F0aW9ucyBvZgogICAgIGxvdHMgb2YgdGhlIGNvZGUsIGVzcGVjaWFsbHkgIl9jbXAiIG9wZXJhdGlvbnMgd2hpY2ggc2hvdWxkIG5vcm1hbGx5CiAgICAgYmUgcHJvdG90eXBlZCB3aXRoICJjb25zdCIgcGFyYW1ldGVycyBhbnl3YXkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgV2hlbiBnZW5lcmF0aW5nIGJ5dGVzIGZvciB0aGUgZmlyc3QgdGltZSBpbiBtZF9yYW5kLmMsICdzdGlyIHRoZSBwb29sJwogICAgIGJ5IHNlZWRpbmcgd2l0aCBTVEFURV9TSVpFIGR1bW15IGJ5dGVzICh3aXRoIHplcm8gZW50cm9weSBjb3VudCkuCiAgICAgKFRoZSBQUk5HIHN0YXRlIGNvbnNpc3RzIG9mIHR3byBwYXJ0cywgdGhlIGxhcmdlIHBvb2wgJ3N0YXRlJyBhbmQgJ21kJywKICAgICB3aGVyZSBhbGwgb2YgJ21kJyBpcyB1c2VkIGVhY2ggdGltZSB0aGUgUFJORyBpcyB1c2VkLCBidXQgJ3N0YXRlJwogICAgIGlzIHVzZWQgb25seSBpbmRleGVkIGJ5IGEgY3ljbGljIGNvdW50ZXIuIEFzIGVudHJvcHkgbWF5IG5vdCBiZQogICAgIHdlbGwgZGlzdHJpYnV0ZWQgZnJvbSB0aGUgYmVnaW5uaW5nLCAnbWQnIGlzIGltcG9ydGFudCBhcyBhCiAgICAgY2hhaW5pbmcgdmFyaWFibGUuIEhvd2V2ZXIsIHRoZSBvdXRwdXQgZnVuY3Rpb24gY2hhaW5zIG9ubHkgaGFsZgogICAgIG9mICdtZCcsIGkuZS4gODAgYml0cy4gIHNzbGVheV9yYW5kX2FkZCwgb24gdGhlIG90aGVyIGhhbmQsIGNoYWlucwogICAgIGFsbCBvZiAnbWQnLCBhbmQgc2VlZGluZyB3aXRoIFNUQVRFX1NJWkUgZHVtbXkgYnl0ZXMgd2lsbCByZXN1bHQKICAgICBpbiBhbGwgb2YgJ3N0YXRlJyBiZWluZyByZXdyaXR0ZW4sIHdpdGggdGhlIG5ldyB2YWx1ZXMgZGVwZW5kaW5nCiAgICAgb24gdmlydHVhbGx5IGFsbCBvZiAnbWQnLiAgVGhpcyBvdmVyY29tZXMgdGhlIDgwIGJpdCBsaW1pdGF0aW9uLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBzc2wvczJfY2xudC5jIGFuZCBzc2wvczNfY2xudC5jLCBjYWxsIEVSUl9jbGVhcl9lcnJvcigpIHdoZW4KICAgICB0aGUgaGFuZHNoYWtlIGlzIGNvbnRpbnVlZCBhZnRlciBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4oKTsKICAgICBvdGhlcndpc2UsIGlmIFNTTF9WRVJJRllfTk9ORSBpcyBzZXQsIHJlbWFpbmluZyBlcnJvciBjb2RlcwogICAgIGNhbiBsZWFkIHRvICd1bmV4cGxhaW5hYmxlJyBjb25uZWN0aW9uIGFib3J0cyBsYXRlci4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHRyYWNrZWQgZG93biBieSBMdXR6IEphZW5pY2tlXQoKICAqKSBNYWpvciBFVlAgQVBJIGNpcGhlciByZXZpc2lvbi4KICAgICBBZGQgaG9va3MgZm9yIGV4dHJhIEVWUCBmZWF0dXJlcy4gVGhpcyBhbGxvd3MgdmFyaW91cyBjaXBoZXIKICAgICBwYXJhbWV0ZXJzIHRvIGJlIHNldCBpbiB0aGUgRVZQIGludGVyZmFjZS4gU3VwcG9ydCBhZGRlZCBmb3IgdmFyaWFibGUKICAgICBrZXkgbGVuZ3RoIGNpcGhlcnMgdmlhIHRoZSBFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aCgpIGZ1bmN0aW9uIGFuZAogICAgIHNldHRpbmcgb2YgUkMyIGFuZCBSQzUgcGFyYW1ldGVycy4KCiAgICAgTW9kaWZ5IEVWUF9PcGVuSW5pdCgpIGFuZCBFVlBfU2VhbEluaXQoKSB0byBjb3BlIHdpdGggdmFyaWFibGUga2V5IGxlbmd0aAogICAgIGNpcGhlcnMuCgogICAgIFJlbW92ZSBsb3RzIG9mIGR1cGxpY2F0ZWQgY29kZSBmcm9tIHRoZSBFVlAgbGlicmFyeS4gRm9yIGV4YW1wbGUgKmV2ZXJ5KgogICAgIGNpcGhlciBpbml0KCkgZnVuY3Rpb24gaGFuZGxlcyB0aGUgJ2l2JyBpbiB0aGUgc2FtZSB3YXkgYWNjb3JkaW5nIHRvIHRoZQogICAgIGNpcGhlciBtb2RlLiBUaGV5IGFsc28gYWxsIGRvIG5vdGhpbmcgaWYgdGhlICdrZXknIHBhcmFtZXRlciBpcyBOVUxMIGFuZAogICAgIGZvciBDRkIgYW5kIE9GQiBtb2RlcyB0aGV5IHplcm8gY3R4LT5udW0uCgogICAgIE5ldyBmdW5jdGlvbmFsaXR5IGFsbG93cyByZW1vdmFsIG9mIFMvTUlNRSBjb2RlIFJDMiBoYWNrLgoKICAgICBNb3N0IG9mIHRoZSByb3V0aW5lcyBoYXZlIHRoZSBzYW1lIGZvcm0gYW5kIHNvIGNhbiBiZSBkZWNsYXJlZCBpbiB0ZXJtcwogICAgIG9mIG1hY3Jvcy4KCiAgICAgQnkgc2hpZnRpbmcgdGhpcyB0byB0aGUgdG9wIGxldmVsIEVWUF9DaXBoZXJJbml0KCkgaXQgY2FuIGJlIHJlbW92ZWQgZnJvbQogICAgIGFsbCBpbmRpdmlkdWFsIGNpcGhlcnMuIElmIHRoZSBjaXBoZXIgd2FudHMgdG8gaGFuZGxlIElWcyBvciBrZXlzCiAgICAgZGlmZmVyZW50bHkgaXQgY2FuIHNldCB0aGUgRVZQX0NJUEhfQ1VTVE9NX0lWIG9yIEVWUF9DSVBIX0FMV0FZU19DQUxMX0lOSVQKICAgICBmbGFncy4KCiAgICAgQ2hhbmdlIGxvdHMgb2YgZnVuY3Rpb25zIGxpa2UgRVZQX0VuY3J5cHRVcGRhdGUoKSB0byBub3cgcmV0dXJuIGEKICAgICB2YWx1ZTogYWx0aG91Z2ggc29mdHdhcmUgdmVyc2lvbnMgb2YgdGhlIGFsZ29yaXRobXMgY2Fubm90IGZhaWwKICAgICBhbnkgaW5zdGFsbGVkIGhhcmR3YXJlIHZlcnNpb25zIGNhbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXBsZW1lbnQgU1NMX09QX1RMU19ST0xMQkFDS19CVUc6IEluIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsIGlmCiAgICAgdGhpcyBvcHRpb24gaXMgc2V0LCB0b2xlcmF0ZSBicm9rZW4gY2xpZW50cyB0aGF0IHNlbmQgdGhlIG5lZ290aWF0ZWQKICAgICBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBpbnN0ZWFkIG9mIHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wgdmVyc2lvbgogICAgIG51bWJlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDYWxsIGRoX3RtcF9jYiAoc2V0IGJ5IC4uLl9UTVBfREhfQ0IpIHdpdGggY29ycmVjdCAnaXNfZXhwb3J0JyBmbGFnOwogICAgIGkuZS4gbm9uLXplcm8gZm9yIGV4cG9ydCBjaXBoZXJzdWl0ZXMsIHplcm8gb3RoZXJ3aXNlLgogICAgIFByZXZpb3VzIHZlcnNpb25zIGhhZCB0aGlzIGZsYWcgaW52ZXJ0ZWQsIGluY29uc2lzdGVudCB3aXRoCiAgICAgcnNhX3RtcF9jYiAoLi4uX1RNUF9SU0FfQ0IpLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcmVwb3J0ZWQgYnkgQW1pdCBDaG9wcmFdCgogICopIEFkZCBtaXNzaW5nIERTQSBsaWJyYXJ5IHRleHQgc3RyaW5nLiBXb3JrIGFyb3VuZCBmb3Igc29tZSBJSVMKICAgICBrZXkgZmlsZXMgd2l0aCBpbnZhbGlkIFNFUVVFTkNFIGVuY29kaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGRvY3VtZW50IChkb2Mvc3RhbmRhcmRzLnR4dCkgdGhhdCBsaXN0IGFsbCBraW5kcyBvZiBzdGFuZGFyZHMKICAgICBhbmQgc28gb24gdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gT3BlblNTTC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBFbmhhbmNlIGNfcmVoYXNoIHNjcmlwdC4gT2xkIHZlcnNpb24gd291bGQgbWlzaGFuZGxlIGNlcnRpZmljYXRlcwogICAgIHdpdGggdGhlIHNhbWUgc3ViamVjdCBuYW1lIGhhc2ggYW5kIHdvdWxkbid0IGhhbmRsZSBDUkxzIGF0IGFsbC4KICAgICBBZGRlZCAtZmluZ2VycHJpbnQgb3B0aW9uIHRvIGNybCB1dGlsaXR5LCB0byBzdXBwb3J0IG5ldyBjX3JlaGFzaAogICAgIGZlYXR1cmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVsaW1pbmF0ZSBub24tQU5TSSBkZWNsYXJhdGlvbnMgaW4gY3J5cHRvLmggYW5kIHN0YWNrLmguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBmb3IgU1NMIHNlcnZlciBwdXJwb3NlIGNoZWNraW5nLiBTZXJ2ZXIgY2hlY2tpbmcgd2FzCiAgICAgcmVqZWN0aW5nIGNlcnRpZmljYXRlcyB3aGljaCBoYWQgZXh0ZW5kZWQga2V5IHVzYWdlIHByZXNlbnQKICAgICBidXQgbm8gc3NsIGNsaWVudCBwdXJwb3NlLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IFJlbmUgR3Jvc3NlciA8Z3Jvc3NlckBoaXNvbHV0aW9ucy5jb20+XQoKICAqKSBNYWtlIFBLQ1MjMTIgY29kZSB3b3JrIHdpdGggbm8gcGFzc3dvcmQuIFRoZSBQS0NTIzEyIHNwZWMKICAgICBpcyBhIGxpdHRsZSB1bmNsZWFyIGFib3V0IGhvdyBhIGJsYW5rIHBhc3N3b3JkIGlzIGhhbmRsZWQuCiAgICAgU2luY2UgdGhlIHBhc3N3b3JkIGluIGVuY29kZWQgYXMgYSBCTVBTdHJpbmcgd2l0aCB0ZXJtaW5hdGluZwogICAgIGRvdWJsZSBOVUxMIGEgemVybyBsZW5ndGggcGFzc3dvcmQgd291bGQgZW5kIHVwIGFzIGp1c3QgdGhlCiAgICAgZG91YmxlIE5VTEwuIEhvd2V2ZXIgbm8gcGFzc3dvcmQgYXQgYWxsIGlzIGRpZmZlcmVudCBhbmQgaXMKICAgICBoYW5kbGVkIGRpZmZlcmVudGx5IGluIHRoZSBQS0NTIzEyIGtleSBnZW5lcmF0aW9uIGNvZGUuIE5TCiAgICAgdHJlYXRzIGEgYmxhbmsgcGFzc3dvcmQgYXMgemVybyBsZW5ndGguIE1TSUUgdHJlYXRzIGl0IGFzIG5vCiAgICAgcGFzc3dvcmQgb24gZXhwb3J0OiBidXQgaXQgd2lsbCB0cnkgYm90aCBvbiBpbXBvcnQuIFdlIG5vdyBkbwogICAgIHRoZSBzYW1lOiBQS0NTMTJfcGFyc2UoKSB0cmllcyB6ZXJvIGxlbmd0aCBhbmQgbm8gcGFzc3dvcmQgaWYKICAgICB0aGUgcGFzc3dvcmQgaXMgc2V0IHRvICIiIG9yIE5VTEwgKE5VTEwgaXMgbm93IGEgdmFsaWQgcGFzc3dvcmQ6CiAgICAgaXQgd2Fzbid0IGJlZm9yZSkgYXMgZG9lcyB0aGUgcGtjczEyIGFwcGxpY2F0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJ1Z2ZpeGVzIGluIGFwcHMveDUwOS5jOiBBdm9pZCBhIG1lbW9yeSBsZWFrOyBhbmQgZG9uJ3QgdXNlCiAgICAgcGVycm9yIHdoZW4gUEVNX3JlYWRfYmlvX1g1MDlfUkVRIGZhaWxzLCB0aGUgZXJyb3IgbWVzc2FnZSBtdXN0CiAgICAgYmUgb2J0YWluZWQgZnJvbSB0aGUgZXJyb3IgcXVldWUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQXZvaWQgJ3RocmVhZF9oYXNoJyBtZW1vcnkgbGVhayBpbiBjcnlwdG8vZXJyL2Vyci5jIGJ5IGZyZWVpbmcKICAgICBpdCBpbiBFUlJfcmVtb3ZlX3N0YXRlIGlmIGFwcHJvcHJpYXRlLCBhbmQgY2hhbmdlIEVSUl9nZXRfc3RhdGUKICAgICBhY2NvcmRpbmdseSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgKHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKICAgICB0aHJlYWRfaGFzaCBpcyBubyBsb25nZXIgY29uc3RhbnQgb25jZSBzZXQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeCBmb3IgbGludXgtZWxmIG1ha2VmaWxlLm9uZS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpIHdpbGwgbm93IGNhdXNlIGEgZGVmYXVsdAogICAgIFJTQV9NRVRIT0QgdG8gYmUgY2hvc2VuIGlmIG9uZSBkb2Vzbid0IGV4aXN0IGFscmVhZHkuCiAgICAgUHJldmlvdXNseSB0aGlzIHdhcyBvbmx5IHNldCBkdXJpbmcgYSBjYWxsIHRvIFJTQV9uZXcoKQogICAgIG9yIFJTQV9uZXdfbWV0aG9kKE5VTEwpIG1lYW5pbmcgaXQgd2FzIHBvc3NpYmxlIGZvcgogICAgIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSB0byByZXR1cm4gTlVMTC4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGRlZCBuYXRpdmUgbmFtZSB0cmFuc2xhdGlvbiB0byB0aGUgZXhpc3RpbmcgRFNPIGNvZGUKICAgICB0aGF0IHdpbGwgY29udmVydCAoaWYgdGhlIGZsYWcgdG8gZG8gc28gaXMgc2V0KSBmaWxlbmFtZXMKICAgICB0aGF0IGFyZSBzdWZmaWNpZW50bHkgc21hbGwgYW5kIGhhdmUgbm8gcGF0aCBpbmZvcm1hdGlvbgogICAgIGludG8gYSBjYW5vbmljYWwgbmF0aXZlIGZvcm0uIEVnLiAiYmxhaCIgY29udmVydGVkIHRvCiAgICAgImxpYmJsYWguc28iIG9yICJibGFoLmRsbCIgZXRjLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE5ldyBmdW5jdGlvbiBFUlJfZXJyb3Jfc3RyaW5nX24oZSwgYnVmLCBsZW4pIHdoaWNoIGlzIGxpa2UKICAgICBFUlJfZXJyb3Jfc3RyaW5nKGUsIGJ1ZiksIGJ1dCB3cml0ZXMgYXQgbW9zdCAnbGVuJyBieXRlcwogICAgIGluY2x1ZGluZyB0aGUgMCB0ZXJtaW5hdG9yLiAgRm9yIEVSUl9lcnJvcl9zdHJpbmdfbiwgJ2J1ZicKICAgICBtYXkgbm90IGJlIE5VTEwuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4sIEJvZG8gTW9lbGxlcl0KCiAgKikgQ09ORiBsaWJyYXJ5IHJld29ya2VkIHRvIGJlY29tZSBtb3JlIGdlbmVyYWwuICBBIG5ldyBDT05GCiAgICAgY29uZmlndXJhdGlvbiBmaWxlIHJlYWRlciAiY2xhc3MiIGlzIGltcGxlbWVudGVkIGFzIHdlbGwgYXMgYQogICAgIG5ldyBmdW5jdGlvbnMgKE5DT05GXyosIGZvciAiTmV3IENPTkYiKSB0byBoYW5kbGUgaXQuICBUaGUgbm93CiAgICAgb2xkIENPTkZfKiBmdW5jdGlvbnMgYXJlIHN0aWxsIHRoZXJlLCBidXQgYXJlIHJlaW1wbGVtZW50ZWQgdG8KICAgICB3b3JrIGluIHRlcm1zIG9mIHRoZSBuZXcgZnVuY3Rpb25zLiAgQWxzbywgYSBzZXQgb2YgZnVuY3Rpb25zCiAgICAgdG8gaGFuZGxlIHRoZSBpbnRlcm5hbCBzdG9yYWdlIG9mIHRoZSBjb25maWd1cmF0aW9uIGRhdGEgaXMKICAgICBwcm92aWRlZCB0byBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlCiAgICAgcmVhZGVyICJjbGFzc2VzIiAoSSBjYW4gZGVmaW5pdGVseSBzZWUgc29tZXRoaW5nIHJlYWRpbmcgYQogICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiBYTUwgZm9ybWF0LCBmb3IgZXhhbXBsZSksIGNhbGxlZCBfQ09ORl8qLAogICAgIG9yICJ0aGUgY29uZmlndXJhdGlvbiBzdG9yYWdlIEFQSSIuLi4KCiAgICAgVGhlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUgcmVhZGluZyBmdW5jdGlvbnMgYXJlOgoKICAgICAgICBOQ09ORl9uZXcsIE5DT05GX2ZyZWUsIE5DT05GX2xvYWQsIE5DT05GX2xvYWRfZnAsIE5DT05GX2xvYWRfYmlvLAogICAgICAgIE5DT05GX2dldF9zZWN0aW9uLCBOQ09ORl9nZXRfc3RyaW5nLCBOQ09ORl9nZXRfbnVtYnJlCgogICAgICAgIE5DT05GX2RlZmF1bHQsIE5DT05GX1dJTjMyCgogICAgICAgIE5DT05GX2R1bXBfZnAsIE5DT05GX2R1bXBfYmlvCgogICAgIE5DT05GX2RlZmF1bHQgYW5kIE5DT05GX1dJTjMyIGFyZSBtZXRob2QgKG9yICJjbGFzcyIpIGNob29zZXJzLAogICAgIE5DT05GX25ldyBjcmVhdGVzIGEgbmV3IENPTkYgb2JqZWN0LiAgVGhpcyB3b3JrcyBpbiB0aGUgc2FtZSB3YXkKICAgICBhcyBvdGhlciBpbnRlcmZhY2VzIGluIE9wZW5TU0wsIGxpa2UgdGhlIEJJTyBpbnRlcmZhY2UuCiAgICAgTkNPTkZfZHVtcF8qIGR1bXAgdGhlIGludGVybmFsIHN0b3JhZ2Ugb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSwKICAgICB3aGljaCBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy4gIEFsbCBvdGhlciBmdW5jdGlvbnMgdGFrZSB0aGUgc2FtZQogICAgIGFyZ3VtZW50cyBhcyB0aGUgb2xkIENPTkZfKiBmdW5jdGlvbnMgd3RoIHRoZSBleGNlcHRpb24gb2YgdGhlCiAgICAgZmlyc3QgdGhhdCBtdXN0IGJlIGEgYENPTkYgKicgaW5zdGVhZCBvZiBhIGBMSEFTSCAqJy4KCiAgICAgVG8gbWFrZSBpdCBlYXNlciB0byB1c2UgdGhlIG5ldyBjbGFzc2VzIHdpdGggdGhlIG9sZCBDT05GXyogZnVuY3Rpb25zLAogICAgIHRoZSBmdW5jdGlvbiBDT05GX3NldF9kZWZhdWx0X21ldGhvZCBpcyBwcm92aWRlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgJy10bHMxJyBvcHRpb24gdG8gJ29wZW5zc2wgY2lwaGVycycsIHdoaWNoIHdhcyBhbHJlYWR5CiAgICAgbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGJ1dCBoYWQgbm90IGJlZW4gaW1wbGVtZW50ZWQuCiAgICAgKFRoaXMgb3B0aW9uIGlzIG5vdCB5ZXQgcmVhbGx5IHVzZWZ1bCBiZWNhdXNlIGV2ZW4gdGhlIGFkZGl0aW9uYWwKICAgICBleHBlcmltZW50YWwgVExTIDEuMCBjaXBoZXJzIGFyZSBjdXJyZW50bHkgdHJlYXRlZCBhcyBTU0wgMy4wIGNpcGhlcnMuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluaXRpYWwgRFNPIGNvZGUgYWRkZWQgaW50byBsaWJjcnlwdG8gZm9yIGxldHRpbmcgT3BlblNTTCAoYW5kCiAgICAgT3BlblNTTC1iYXNlZCBhcHBsaWNhdGlvbnMpIGxvYWQgc2hhcmVkIGxpYnJhcmllcyBhbmQgYmluZCB0bwogICAgIHRoZW0gaW4gYSBwb3J0YWJsZSB3YXkuCiAgICAgW0dlb2ZmIFRob3JwZSwgd2l0aCBjb250cmlidXRpb25zIGZyb20gUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNSBhbmQgMC45LjVhICBbMSBBcHIgMjAwMF0KCiAgKikgTWFrZSBzdXJlIF9scm90bCBhbmQgX2xyb3RyIGFyZSBvbmx5IHVzZWQgd2l0aCBNU1ZDLgoKICAqKSBVc2UgbG9jayBDUllQVE9fTE9DS19SQU5EIGNvcnJlY3RseSBpbiBzc2xlYXlfcmFuZF9zdGF0dXMKICAgICAodGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgUkFORF9zdGF0dXMpLgoKICAqKSBSZW5hbWUgb3BlbnNzbCB4NTA5IG9wdGlvbiAnLWNybGV4dCcsIHdoaWNoIHdhcyBhZGRlZCBpbiAwLjkuNSwKICAgICB0byAnLWNscmV4dCcgKD0gY2xlYXIgZXh0ZW5zaW9ucyksIGFzIGludGVuZGVkIGFuZCBkb2N1bWVudGVkLgogICAgIFtCb2RvIE1vZWxsZXI7IGluY29uc2lzdGVuY3kgcG9pbnRlZCBvdXQgYnkgTWljaGFlbCBBdHRpbGkKICAgICA8YXR0aWxpQGFtYXhvLmNvbT5dCgogICopIEZpeCBmb3IgSE1BQy4gSXQgd2Fzbid0IHplcm9pbmcgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrIGlmIHRoZSBrZXkgbGVuZ3RoCiAgICAgd2FzIGxhcmdlciB0aGFuIHRoZSBNRCBibG9jayBzaXplLiAgICAgIAogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IFlvc3QgV2lsbGlhbSA8WW9zdFdAdGNlLmNvbT5dCgogICopIE1vZGVybmlzZSBQS0NTMTJfcGFyc2UoKSBzbyBpdCB1c2VzIFNUQUNLX09GKFg1MDkpIGZvciBpdHMgY2EgYXJndW1lbnQKICAgICBmaXggYSBsZWFrIHdoZW4gdGhlIGNhIGFyZ3VtZW50IHdhcyBwYXNzZWQgYXMgTlVMTC4gU3RvcCBYNTA5X1BVQktFWV9zZXQoKQogICAgIHVzaW5nIHRoZSBwYXNzZWQga2V5OiBpZiB0aGUgcGFzc2VkIGtleSB3YXMgYSBwcml2YXRlIGtleSB0aGUgcmVzdWx0CiAgICAgb2YgWDUwOV9wcmludCgpLCBmb3IgZXhhbXBsZSwgd291bGQgYmUgdG8gcHJpbnQgb3V0IGFsbCB0aGUgcHJpdmF0ZSBrZXkKICAgICBjb21wb25lbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIGRlc19xdWFkX2Nrc3VtKCkgYnl0ZSBvcmRlciBidWcgZml4LgogICAgIFtVbGYgTfZsbGVyLCB1c2luZyB0aGUgcHJvYmxlbSBkZXNjcmlwdGlvbiBpbiBrcmI0LTAuOS43LCB3aGVyZQogICAgICB0aGUgc29sdXRpb24gaXMgYXR0cmlidXRlZCB0byBEZXJyaWNrIEogQnJhc2hlYXIgPHNoYWRvd0BERU1FTlRJQS5PUkc+XQoKICAqKSBGaXggc28gVl9BU04xX0FQUF9DSE9PU0Ugd29ya3MgYWdhaW46IGhvd2V2ZXIgaXRzIHVzZSBpcyBzdHJvbmdseQogICAgIGRpc2NvdXJhZ2VkLgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IEJyaWFuIEtvcnZlciA8YnJpYW5rQGNzLnN0YW5mb3JkLmVkdT5dCgogICopIEZvciBlYXNpbHkgdGVzdGluZyBpbiBzaGVsbCBzY3JpcHRzIHdoZXRoZXIgc29tZSBjb21tYW5kCiAgICAgJ29wZW5zc2wgWFhYJyBleGlzdHMsIHRoZSBuZXcgcHNldWRvLWNvbW1hbmQgJ29wZW5zc2wgbm8tWFhYJwogICAgIHJldHVybnMgd2l0aCBleGl0IGNvZGUgMCBpZmYgbm8gY29tbWFuZCBvZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhdmFpbGFibGUuCiAgICAgJ25vLVhYWCcgaXMgcHJpbnRlZCBpbiB0aGlzIGNhc2UsICdYWFgnIG90aGVyd2lzZS4gIEluIGJvdGggY2FzZXMsCiAgICAgdGhlIG91dHB1dCBnb2VzIHRvIHN0ZG91dCBhbmQgbm90aGluZyBpcyBwcmludGVkIHRvIHN0ZGVyci4KICAgICBBZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgYWx3YXlzIGlnbm9yZWQuCgogICAgIFNpbmNlIGZvciBlYWNoIGNpcGhlciB0aGVyZSBpcyBhIGNvbW1hbmQgb2YgdGhlIHNhbWUgbmFtZSwKICAgICB0aGUgJ25vLWNpcGhlcicgY29tcGlsYXRpb24gc3dpdGNoZXMgY2FuIGJlIHRlc3RlZCB0aGlzIHdheS4KCiAgICAgKCdvcGVuc3NsIG5vLVhYWCcgaXMgbm90IGFibGUgdG8gZGV0ZWN0IHBzZXVkby1jb21tYW5kcyBzdWNoCiAgICAgYXMgJ3F1aXQnLCAnbGlzdC1YWFgtY29tbWFuZHMnLCBvciAnbm8tWFhYJyBpdHNlbGYuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVwZGF0ZSB0ZXN0IHN1aXRlIHNvIHRoYXQgJ21ha2UgdGVzdCcgc3VjY2VlZHMgaW4gJ25vLXJzYScgY29uZmlndXJhdGlvbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGb3IgU1NMX1tDVFhfXXNldF90bXBfZGgsIGRvbid0IGNyZWF0ZSBhIERIIGtleSBpZiBTU0xfT1BfU0lOR0xFX0RIX1VTRQogICAgIGlzIHNldDsgaXQgd2lsbCBiZSB0aHJvd24gYXdheSBhbnl3YXkgYmVjYXVzZSBlYWNoIGhhbmRzaGFrZSBjcmVhdGVzCiAgICAgaXRzIG93biBrZXkuCiAgICAgc3NsX2NlcnRfZHVwLCB3aGljaCBpcyB1c2VkIGJ5IFNTTF9uZXcsIG5vdyBjb3BpZXMgREgga2V5cyBpbiBhZGRpdGlvbgogICAgIHRvIHBhcmFtZXRlcnMgLS0gaW4gcHJldmlvdXMgdmVyc2lvbnMgKHNpbmNlIE9wZW5TU0wgMC45LjMpIHRoZQogICAgICdkZWZhdWx0IGtleScgZnJvbSBTU0xfQ1RYX3NldF90bXBfZGggd291bGQgYWx3YXlzIGJlIGxvc3QsIG1lYW5pbmcKICAgICB5b3UgZWZmZWN0aXZseSBnb3QgU1NMX09QX1NJTkdMRV9ESF9VU0Ugd2hlbiB1c2luZyB0aGlzIG1hY3JvLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBzX2NsaWVudCBvcHRpb24gLWlnbl9lb2Y6IEVPRiBhdCBzdGRpbiBpcyBpZ25vcmVkLCBhbmQKICAgICAnUScgYW5kICdSJyBsb3NlIHRoZWlyIHNwZWNpYWwgbWVhbmluZ3MgKHF1aXQvcmVuZWdvdGlhdGUpLgogICAgIFRoaXMgaXMgcGFydCBvZiB3aGF0IC1xdWlldCBkb2VzOyB1bmxpa2UgLXF1aWV0LCAtaWduX2VvZgogICAgIGRvZXMgbm90IHN1cHByZXNzIGFueSBvdXRwdXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGNvbXBhdGliaWxpdHkgb3B0aW9ucyB0byB0aGUgcHVycG9zZSBhbmQgdHJ1c3QgY29kZS4gVGhlCiAgICAgcHVycG9zZSBYNTA5X1BVUlBPU0VfQU5ZIGlzICJhbnkgcHVycG9zZSIgd2hpY2ggYXV0b21hdGljYWxseQogICAgIGFjY2VwdHMgYSBjZXJ0aWZpY2F0ZSBvciBDQSwgdGhpcyB3YXMgdGhlIHByZXZpb3VzIGJlaGF2aW91ciwKICAgICB3aXRoIGFsbCB0aGUgYXNzb2NpYXRlZCBzZWN1cml0eSBpc3N1ZXMuCgogICAgIFg1MDlfVFJVU1RfQ09NUEFUIGlzIHRoZSBvbGQgdHJ1c3QgYmVoYXZpb3VyOiBvbmx5IGFuZAogICAgIGF1dG9tYXRpY2FsbHkgdHJ1c3Qgc2VsZiBzaWduZWQgcm9vdHMgaW4gY2VydGlmaWNhdGUgc3RvcmUuIEEKICAgICBuZXcgdHJ1c3Qgc2V0dGluZyBYNTA5X1RSVVNUX0RFRkFVTFQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoYXQKICAgICBhIHB1cnBvc2UgaGFzIG5vIGFzc29jaWF0ZWQgdHJ1c3Qgc2V0dGluZyBhbmQgaXQgc2hvdWxkIGluc3RlYWQKICAgICB1c2UgdGhlIHZhbHVlIGluIHRoZSBkZWZhdWx0IHB1cnBvc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSBQS0NTIzggRFNBIHByaXZhdGUga2V5IGNvZGUgc28gaXQgZGVjb2RlcyBrZXlzIGFnYWluCiAgICAgYW5kIGZpeCBhIG1lbW9yeSBsZWFrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHV0aWwvbWtlcnIucGwgKHdoaWNoIGltcGxlbWVudHMgJ21ha2UgZXJyb3JzJyksIHByZXNlcnZlCiAgICAgcmVhc29uIHN0cmluZ3MgZnJvbSB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgLmMgZmlsZSwgYXMKICAgICB0aGUgZGVmYXVsdCB0byBoYXZlIG9ubHkgZG93bmNhc2UgbGV0dGVycyAoYW5kIGRpZ2l0cykgaW4KICAgICBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCByZWFzb25zIGNvZGVzIGlzIG5vdCBhbHdheXMgYXBwcm9wcmlhdGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gRVJSX2xvYWRfRVJSX3N0cmluZ3MoKSwgYnVpbGQgYW4gRVJSX0xJQl9TWVMgZXJyb3IgcmVhc29uIHRhYmxlCiAgICAgdXNpbmcgc3RyZXJyb3IuICBQcmV2aW91c2x5LCBFUlJfcmVhc29uX2Vycm9yX3N0cmluZygpIHJldHVybmVkCiAgICAgbGlicmFyeSBuYW1lcyBhcyByZWFzb24gc3RyaW5ncyBmb3IgU1lTZXJyOyBidXQgU1lTZXJyIGlzIGEgc3BlY2lhbAogICAgIGNhc2Ugd2hlcmUgc21hbGwgbnVtYmVycyBhcmUgZXJybm8gdmFsdWVzLCBub3QgbGlicmFyeSBudW1iZXJzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCAnLWRzYXBhcmFtJyBvcHRpb24gdG8gJ29wZW5zc2wgZGhwYXJhbScgYXBwbGljYXRpb24uICBUaGlzCiAgICAgY29udmVydHMgRFNBIHBhcmFtZXRlcnMgaW50byBESCBwYXJhbWV0ZXJzLiAoV2hlbiBjcmVhdGluZyBwYXJhbWV0ZXJzLAogICAgIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIGlzIHVzZWQuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluY2x1ZGUgJ2xlbmd0aCcgKHJlY29tbWVuZGVkIGV4cG9uZW50IGxlbmd0aCkgaW4gQyBjb2RlIGdlbmVyYXRlZAogICAgIGJ5ICdvcGVuc3NsIGRocGFyYW0gLUMnLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gc2V0X2xhYmVsIGluIHBlcmxhc20gd2FzIGFscmVhZHkgYmVpbmcgdXNlZAogICAgIHNvIGNvdWxkbid0IGJlIHVzZWQgYXMgYSAiZmlsZSBzY29wZSIgZmxhZy4gTW92ZWQgdG8gdGhpcmQgYXJndW1lbnQKICAgICB3aGljaCB3YXMgZnJlZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBQRU1fQVNOMV93cml0ZV9iaW8gYW5kIHNvbWUgb3RoZXIgZnVuY3Rpb25zLCB1c2UgUkFORF9wc2V1ZG9fYnl0ZXMKICAgICBpbnN0ZWFkIG9mIFJBTkRfYnl0ZXMgZm9yIGVuY3J5cHRpb24gSVZzIGFuZCBzYWx0cy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbmNsdWRlIFJBTkRfc3RhdHVzKCkgaW50byBSQU5EX01FVEhPRCBpbnN0ZWFkIG9mIGltcGxlbWVudGluZwogICAgIGl0IG9ubHkgZm9yIG1kX3JhbmQuYyAgT3RoZXJ3aXNlIHJlcGxhY2luZyB0aGUgUFJORyBieSBjYWxsaW5nCiAgICAgUkFORF9zZXRfcmFuZF9tZXRob2Qgd291bGQgYmUgaW1wb3NzaWJsZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEb24ndCBsZXQgRFNBX2dlbmVyYXRlX2tleSgpIGVudGVyIGFuIGluZmluaXRlIGxvb3AgaWYgdGhlIHJhbmRvbQogICAgIG51bWJlciBnZW5lcmF0aW9uIGZhaWxzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyAncmFuZCcgYXBwbGljYXRpb24gZm9yIGNyZWF0aW5nIHBzZXVkby1yYW5kb20gb3V0cHV0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZGVkIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCBmb3IgTGludXgvSUE2NAogICAgIFtSb2xmIEhhYmVycmVja2VyIDxyb2xmQHN1c2UuZGU+XQoKICAqKSBBc3NlbWJsZXIgbW9kdWxlIHN1cHBvcnQgZm9yIE1pbmd3MzIuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIEhQVVggKGluIHNobGliLykuCiAgICAgW0x1dHogSmFlbmlja2UgPEx1dHouSmFlbmlja2VAYWV0LlRVLUNvdHRidXMuREU+IGFuZCBBbm9ueW1vdXNdCgogICopIFNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIFNvbGFyaXMgZ2NjLgogICAgIFtMdXR6IEJlaG5rZSA8YmVobmtlQHRydXN0Y2VudGVyLmRlPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjQgYW5kIDAuOS41ICBbMjggRmViIDIwMDBdCgogICopIFBLQ1M3X2VuY3J5cHQoKSB3YXMgYWRkaW5nIHRleHQgTUlNRSBoZWFkZXJzIHR3aWNlIGJlY2F1c2UgdGhleQogICAgIHdlcmUgYWRkZWQgbWFudWFsbHkgYW5kIGJ5IFNNSU1FX2NybGZfY29weSgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIGJudGVzdC5jIGRvbid0IGNhbGwgQk5fcmFuZCB3aXRoIHplcm8gYml0cyBhcmd1bWVudC4KICAgICBbU3RldmUgSGVuc29uLCBwb2ludGVkIG91dCBieSBBbmRyZXcgVy4gR3JheSA8YWdyYXlAaWNvbnNpbmMuY29tPl0KCiAgKikgQk5fbXVsIGJ1Z2ZpeDogSW4gYm5fbXVsX3BhcnRfcmVjdXJzaW9uKCkgb25seSB0aGUgYT5hW25dICYmIGI+YltuXQogICAgIGNhc2Ugd2FzIGltcGxlbWVudGVkLiBUaGlzIGNhdXNlZCBCTl9kaXZfcmVjcCgpIHRvIGZhaWwgb2NjYXNpb25hbGx5LgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBzZXRfbGFiZWwoKSBpbiB0aGUgcGVybAogICAgIGFzc2VtYmx5IGxhbmd1YWdlIGJ1aWxkZXIuIElmIHRoaXMgYXJndW1lbnQgZXhpc3RzIGFuZCBpcyBzZXQKICAgICB0byAxIGl0IHNpZ25hbHMgdGhhdCB0aGUgYXNzZW1ibGVyIHNob3VsZCB1c2UgYSBzeW1ib2wgd2hvc2UgCiAgICAgc2NvcGUgaXMgdGhlIGVudGlyZSBmaWxlLCBub3QganVzdCB0aGUgY3VycmVudCBmdW5jdGlvbi4gVGhpcwogICAgIGlzIG5lZWRlZCB3aXRoIE1BU00gd2hpY2ggdXNlcyB0aGUgZm9ybWF0IGxhYmVsOjogZm9yIHRoaXMgc2NvcGUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgUGV0ZXIgUnVuZXN0aWcgPHBldGVyQHJ1bmVzdGlnLmNvbT5dCgogICopIENoYW5nZSB0aGUgQVNOMSB0eXBlcyBzbyB0aGV5IGFyZSB0eXBlZGVmcyBieSBkZWZhdWx0LiBCZWZvcmUKICAgICBhbG1vc3QgYWxsIHR5cGVzIHdlcmUgI2RlZmluZSdkIHRvIEFTTjFfU1RSSU5HIHdoaWNoIHdhcyBjYXVzaW5nCiAgICAgU1RBQ0tfT0YoKSBwcm9ibGVtczogeW91IGNvdWxkbid0IGRlY2xhcmUgU1RBQ0tfT0YoQVNOMV9VVEY4U1RSSU5HKQogICAgIGZvciBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBuYW1lcyBvZiBuZXcgZnVuY3Rpb25zIHRvIHRoZSBuZXcgZ2V0MS9nZXQwIG5hbWluZwogICAgIGNvbnZlbnRpb246IEFmdGVyICdnZXQxJywgdGhlIGNhbGxlciBvd25zIGEgcmVmZXJlbmNlIGNvdW50CiAgICAgYW5kIGhhcyB0byBjYWxsIC4uLl9mcmVlOyAnZ2V0MCcgcmV0dXJucyBhIHBvaW50ZXIgdG8gc29tZQogICAgIGRhdGEgc3RydWN0dXJlIHdpdGhvdXQgaW5jcmVtZW50aW5nIHJlZmVyZW5jZSBjb3VudGVycy4KICAgICAoU29tZSBvZiB0aGUgZXhpc3RpbmcgJ2dldCcgZnVuY3Rpb25zIGluY3JlbWVudCBhIHJlZmVyZW5jZQogICAgIGNvdW50ZXIsIHNvbWUgZG9uJ3QuKQogICAgIFNpbWlsYXJseSwgJ3NldDEnIGFuZCAnYWRkMScgZnVuY3Rpb25zIGluY3JlYXNlIHJlZmVyZW5jZQogICAgIGNvdW50ZXJzIG9yIGR1cGxpY2F0ZSBvYmplY3RzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IGZvciB0aGUgcG9zc2liaWxpdHkgb2YgdGVtcCBSU0Ega2V5IGdlbmVyYXRpb24gZmFpbHVyZToKICAgICB0aGUgY29kZSB1c2VkIHRvIGFzc3VtZSBpdCBhbHdheXMgd29ya2VkIGFuZCBjcmFzaGVkIG9uIGZhaWx1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHBvdGVudGlhbCBidWZmZXIgb3ZlcnJ1biBwcm9ibGVtIGluIEJJT19wcmludGYoKS4KICAgICBbVWxmIE32bGxlciwgdXNpbmcgcHVibGljIGRvbWFpbiBjb2RlIGJ5IFBhdHJpY2sgUG93ZWxsOyBwcm9ibGVtCiAgICAgIHBvaW50ZWQgb3V0IGJ5IERhdmlkIFNhY2VyZG90ZSA8ZGFzMzNAY29ybmVsbC5lZHU+XQoKICAqKSBTdXBwb3J0IEVHRCA8aHR0cDovL3d3dy5sb3RoYXIuY29tL3RlY2gvY3J5cHRvLz4uICBOZXcgZnVuY3Rpb25zCiAgICAgUkFORF9lZ2QoKSBhbmQgUkFORF9zdGF0dXMoKS4gIEluIHRoZSBjb21tYW5kIGxpbmUgYXBwbGljYXRpb24sCiAgICAgdGhlIEVHRCBzb2NrZXQgY2FuIGJlIHNwZWNpZmllZCBsaWtlIGEgc2VlZCBmaWxlIHVzaW5nIFJBTkRGSUxFCiAgICAgb3IgLXJhbmQuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFsbG93IHRoZSBzdHJpbmcgQ0VSVElGSUNBVEUgdG8gYmUgdG9sZXJhdGVkIGluIFBLQ1MjNyBzdHJ1Y3R1cmVzLgogICAgIFNvbWUgQ0FzIChlLmcuIFZlcmlzaWduKSBkaXN0cmlidXRlIGNlcnRpZmljYXRlcyBpbiB0aGlzIGZvcm0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIHRoZSBTU0xfQUxMT1dfQURIIGNvbXBpbGUgb3B0aW9uIGFuZCBzZXQgdGhlIGRlZmF1bHQgY2lwaGVyCiAgICAgbGlzdCB0byBleGNsdWRlIHRoZW0uIFRoaXMgbWVhbnMgdGhhdCBubyBzcGVjaWFsIGNvbXBpbGF0aW9uIG9wdGlvbgogICAgIGlzIG5lZWRlZCB0byB1c2UgYW5vbnltb3VzIERIOiBpdCBqdXN0IG5lZWRzIHRvIGJlIGluY2x1ZGVkIGluIHRoZQogICAgIGNpcGhlciBsaXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0aGUgRVZQX01EX0NUWF90eXBlIG1hY3JvIHNvIGl0cyBtZWFuaW5nIGNvbnNpc3RlbnQgd2l0aAogICAgIEVWUF9NRF90eXBlLiBUaGUgb2xkIGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIGluIGEgbmV3IG1hY3JvIGNhbGxlZAogICAgIEVWUF9NRF9tZCgpLiBDaGFuZ2UgY29kZSB0aGF0IHVzZXMgaXQgYW5kIHVwZGF0ZSBkb2NzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIC4uLl9jdHJsIGZ1bmN0aW9ucyBub3cgaGF2ZSBjb3JyZXNwb25kaW5nIC4uLl9jYWxsYmFja19jdHJsIGZ1bmN0aW9ucwogICAgIHdoZXJlIHRoZSAndm9pZCAqJyBhcmd1bWVudCBpcyByZXBsYWNlZCBieSBhIGZ1bmN0aW9uIHBvaW50ZXIgYXJndW1lbnQuCiAgICAgUHJldmlvdXNseSAndm9pZCAqJyB3YXMgYWJ1c2VkIHRvIHBvaW50IHRvIGZ1bmN0aW9ucywgd2hpY2ggd29ya3Mgb24KICAgICBtYW55IHBsYXRmb3JtcywgYnV0IGlzIG5vdCBjb3JyZWN0LiAgQXMgdGhlc2UgZnVuY3Rpb25zIGFyZSB1c3VhbGx5CiAgICAgY2FsbGVkIGJ5IG1hY3JvcyBkZWZpbmVkIGluIE9wZW5TU0wgaGVhZGVyIGZpbGVzLCBtb3N0IHNvdXJjZSBjb2RlCiAgICAgc2hvdWxkIHdvcmsgd2l0aG91dCBjaGFuZ2VzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+ICh3aGljaCBpcyBjcmVhdGVkIGJ5IENvbmZpZ3VyZSkgbm93IGNvbnRhaW5zCiAgICAgc2VjdGlvbnMgd2l0aCBpbmZvcm1hdGlvbiBvbiAtRC4uLiBjb21waWxlciBzd2l0Y2hlcyB1c2VkIGZvcgogICAgIGNvbXBpbGluZyB0aGUgbGlicmFyeSBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gc2VlIHRoZW0uICBUbyBlbmFibGUKICAgICBvbmUgb2YgdGhlc2Ugc2VjdGlvbnMsIGEgcHJlLXByb2Nlc3NvciBzeW1ib2wgT1BFTlNTTF8uLi5fREVGSU5FUwogICAgIG11c3QgYmUgZGVmaW5lZC4gIEUuZy4sCiAgICAgICAgI2RlZmluZSBPUEVOU1NMX0FMR09SSVRITV9ERUZJTkVTCiAgICAgICAgI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KICAgICBkZWZpbmVzIGFsbCBwZXJ0aW5lbnQgTk9fPGFsZ28+IHN5bWJvbHMsIHN1Y2ggYXMgTk9fSURFQSwgTk9fUlNBLCBldGMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSwgVWxmIGFuZCBCb2RvIE32bGxlcl0KCiAgKikgQnVnZml4OiBUb2xlcmF0ZSBmcmFnbWVudGF0aW9uIGFuZCBpbnRlcmxlYXZpbmcgaW4gdGhlIFNTTCAzL1RMUwogICAgIHJlY29yZCBsYXllci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgdGhlICdvdGhlcicgdHlwZSBpbiBjZXJ0aWZpY2F0ZSBhdXggaW5mbyB0byBhIFNUQUNLX09GCiAgICAgWDUwOV9BTEdPUi4gQWx0aG91Z2ggbm90IGFuIEFsZ29yaXRobUlkZW50aWZpZXIgYXMgc3VjaCBpdCBoYXMKICAgICB0aGUgcmVxdWlyZWQgQVNOMSBmb3JtYXQ6IGFyYml0cmFyeSB0eXBlcyBkZXRlcm1pbmVkIGJ5IGFuIE9JRC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc29tZSBQRU1fd3JpdGVfWDUwOV9SRVFfTkVXKCkgZnVuY3Rpb25zIGFuZCBhIGNvbW1hbmQgbGluZQogICAgIGFyZ3VtZW50IHRvICdyZXEnLiBUaGlzIGlzIG5vdCBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyBuZXdlciBvcgogICAgIGJldHRlciB0aGFuIG90aGVycyBpdCBqdXN0IHVzZXMgdGhlIHdvcmsgJ05FVycgaW4gdGhlIGNlcnRpZmljYXRlCiAgICAgcmVxdWVzdCBoZWFkZXIgbGluZXMuIFNvbWUgc29mdHdhcmUgbmVlZHMgdGhpcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW9yZ2FuaXNlIHBhc3N3b3JkIGNvbW1hbmQgbGluZSBhcmd1bWVudHM6IG5vdyBwYXNzd29yZHMgY2FuIGJlCiAgICAgb2J0YWluZWQgZnJvbSB2YXJpb3VzIHNvdXJjZXMuIERlbGV0ZSB0aGUgUEVNX2NiIGZ1bmN0aW9uIGFuZCBtYWtlCiAgICAgaXQgdGhlIGRlZmF1bHQgYmVoYXZpb3VyOiBpLmUuIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMIGFuZCB0aGUKICAgICB1c3JkYXRhIGFyZ3VtZW50IGlzIG5vdCBOVUxMIGludGVycHJldCBpdCBhcyBhIG51bGwgdGVybWluYXRlZCBwYXNzCiAgICAgcGhyYXNlLiBJZiB1c3JkYXRhIGFuZCB0aGUgY2FsbGJhY2sgYXJlIE5VTEwgdGhlbiB0aGUgcGFzcyBwaHJhc2UKICAgICBpcyBwcm9tcHRlZCBmb3IgYXMgdXN1YWwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHRoZSBDb21wYXEgQXRhbGxhIGNyeXB0byBhY2NlbGVyYXRvci4gSWYgaXQgaXMgaW5zdGFsbGVkLAogICAgIHRoZSBzdXBwb3J0IGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZC4gVGhlIHJlc3VsdGluZyBiaW5hcmllcyB3aWxsCiAgICAgYXV0b2RldGVjdCB0aGUgY2FyZCBhbmQgdXNlIGl0IGlmIHByZXNlbnQuCiAgICAgW0JlbiBMYXVyaWUgYW5kIENvbXBhcSBJbmMuXQoKICAqKSBXb3JrIGFyb3VuZCBmb3IgTmV0c2NhcGUgaGFuZyBidWcuIFRoaXMgc2VuZHMgY2VydGlmaWNhdGUgcmVxdWVzdAogICAgIGFuZCBzZXJ2ZXIgZG9uZSBpbiBvbmUgcmVjb3JkLiBTaW5jZSB0aGlzIGlzIHBlcmZlY3RseSBsZWdhbCBpbiB0aGUKICAgICBTU0wvVExTIHByb3RvY29sIGl0IGlzbid0IGEgImJ1ZyIgb3B0aW9uIGFuZCBpcyBvbiBieSBkZWZhdWx0LiBTZWUKICAgICB0aGUgYnVncy9TU0x2MyBlbnRyeSBmb3IgbW9yZSBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhQLVVYIHR1bmUtdXA6IG5ldyB1bmlmaWVkIGNvbmZpZ3MsIEhQIEMgY29tcGlsZXIgYnVnIHdvcmthcm91bmQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCAtcmFuZCBhcmd1bWVudCB0byBzbWltZSBhbmQgcGtjczEyIGFwcGxpY2F0aW9ucyBhbmQgcmVhZC93cml0ZQogICAgIG9mIHNlZWQgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgJ3Bhc3N3ZCcgdG9vbCBmb3IgY3J5cHQoMykgYW5kIGFwcjEgcGFzc3dvcmQgaGFzaGVzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBjb21tYW5kIGxpbmUgcGFzc3dvcmQgb3B0aW9ucyB0byB0aGUgcmVtYWluaW5nIGFwcGxpY2F0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCdWcgZml4IGZvciBCTl9kaXZfcmVjcCgpIGZvciBudW1lcmF0b3JzIHdpdGggYW4gZXZlbiBudW1iZXIgb2YKICAgICBiaXRzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBNb3JlIHRlc3RzIGluIGJudGVzdC5jLCBhbmQgY2hhbmdlZCB0ZXN0X2JuIG91dHB1dC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgLi9jb25maWcgcmVjb2duaXplcyBNYWNPUyBYIG5vdy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQnVnIGZpeCBmb3IgQk5fZGl2KCkgd2hlbiB0aGUgZmlyc3Qgd29yZHMgb2YgbnVtIGFuZCBkaXZzb3IgYXJlCiAgICAgZXF1YWwgKGl0IGdhdmUgd3JvbmcgcmVzdWx0cyBpZiAocmVtPShuMS1xKmQwKSZCTl9NQVNLMikgPCBkMCkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciB2YXJpb3VzIGJyb2tlbiBQS0NTIzggZm9ybWF0cywgYW5kIGNvbW1hbmQgbGluZQogICAgIG9wdGlvbnMgdG8gcHJvZHVjZSB0aGVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgQk5fQ1RYX3N0YXJ0KCksIEJOX0NUWF9nZXQoKSBhbmQgQlRfQ1RYX2VuZCgpIHRvCiAgICAgZ2V0IHRlbXBvcmFyeSBCSUdOVU1zIGZyb20gYSBCTl9DVFguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENvcnJlY3QgcmV0dXJuIHZhbHVlcyBpbiBCTl9tb2RfZXhwX21vbnQoKSBhbmQgQk5fbW9kX2V4cDJfbW9udCgpCiAgICAgZm9yIHAgPT0gMC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQ2hhbmdlIHRoZSBTU0xlYXlfYWRkX2FsbF8qKCkgZnVuY3Rpb25zIHRvIE9wZW5TU0xfYWRkX2FsbF8qKCkgYW5kCiAgICAgaW5jbHVkZSBhICNkZWZpbmUgZnJvbSB0aGUgb2xkIG5hbWUgdG8gdGhlIG5ldy4gVGhlIG9yaWdpbmFsIGludGVudAogICAgIHdhcyB0aGF0IHN0YXRpY2FsbHkgbGlua2VkIGJpbmFyaWVzIGNvdWxkIGZvciBleGFtcGxlIGp1c3QgY2FsbAogICAgIFNTTGVheV9hZGRfYWxsX2NpcGhlcnMoKSB0byBqdXN0IGFkZCBjaXBoZXJzIHRvIHRoZSB0YWJsZSBhbmQgbm90CiAgICAgbGluayB3aXRoIGRpZ2VzdHMuIFRoaXMgbmV2ZXIgd29ya2VkIGJlY2F1c2UgU1NMZWF5X2FkZF9hbGxfZGlnZXN0cygpCiAgICAgYW5kIFNTTGVheV9hZGRfYWxsX2NpcGhlcnMoKSB3ZXJlIGluIHRoZSBzYW1lIHNvdXJjZSBmaWxlIHNvIGNhbGxpbmcKICAgICBvbmUgd291bGQgbGluayB3aXRoIHRoZSBvdGhlci4gVGhleSBhcmUgbm93IGluIHNlcGFyYXRlIHNvdXJjZSBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgLW5vdGV4dCBvcHRpb24gdG8gJ2NhJyBhbmQgYSAtcHVia2V5IG9wdGlvbiB0byAnc3BrYWMnLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVzZSBhIGxlc3MgdW51c3VhbCBmb3JtIG9mIHRoZSBNaWxsZXItUmFiaW4gcHJpbWFsaXR5IHRlc3QgKGl0IHVzZWQKICAgICBhIGJpbmFyeSBhbGdvcml0aG0gZm9yIGV4cG9uZW50aWF0aW9uIGludGVncmF0ZWQgaW50byB0aGUgTWlsbGVyLVJhYmluCiAgICAgbG9vcCwgb3VyIHN0YW5kYXJkIG1vZGV4cCBhbGdvcml0aG1zIGFyZSBmYXN0ZXIpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFN1cHBvcnQgZm9yIHRoZSBFQkNESUMgY2hhcmFjdGVyIHNldCBjb21wbGV0ZWQuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2guU05JLkRlPl0KCiAgKikgU291cmNlIGNvZGUgY2xlYW51cHM6IHVzZSBjb25zdCB3aGVyZSBhcHByb3ByaWF0ZSwgZWxpbWluYXRlIGNhc3RzLAogICAgIHVzZSB2b2lkICogaW5zdGVhZCBvZiBjaGFyICogaW4gbGhhc2guCiAgICAgW1VsZiBN9mxsZXJdIAoKICAqKSBCdWdmaXg6IHNzbDNfc2VuZF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlIHdhcyBub3QgcmVzdGFydGFibGUKICAgICAodGhlIHN0YXRlIHdhcyBub3QgY2hhbmdlZCB0byBTU0wzX1NUX1NXX0tFWV9FWENIX0IsIGFuZCBiZWNhdXNlIG9mCiAgICAgdGhpcyB0aGUgc2VydmVyIGNvdWxkIG92ZXJ3cml0ZSBlcGhlbWVyYWwga2V5cyB0aGF0IHRoZSBjbGllbnQKICAgICBoYXMgYWxyZWFkeSBzZWVuKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUdXJuIERTQV9pc19wcmltZSBpbnRvIGEgbWFjcm8gdGhhdCBjYWxscyBCTl9pc19wcmltZSwKICAgICB1c2luZyA1MCBpdGVyYXRpb25zIG9mIHRoZSBSYWJpbi1NaWxsZXIgdGVzdC4KCiAgICAgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgbm93IHVzZXMgQk5faXNfcHJpbWVfZmFzdHRlc3QgKHdpdGggNTAKICAgICBpdGVyYXRpb25zIG9mIHRoZSBSYWJpbi1NaWxsZXIgdGVzdCBhcyByZXF1aXJlZCBieSB0aGUgYXBwZW5kaXgKICAgICB0byBGSVBTIFBVQiAxODZbLTFdKSBpbnN0ZWFkIG9mIERTQV9pc19wcmltZS4KICAgICBBcyBCTl9pc19wcmltZV9mYXN0dGVzdCBpbmNsdWRlcyB0cmlhbCBkaXZpc2lvbiwgRFNBIHBhcmFtZXRlcgogICAgIGdlbmVyYXRpb24gYmVjb21lcyBtdWNoIGZhc3Rlci4KCiAgICAgVGhpcyBpbXBsaWVzIGEgY2hhbmdlIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGluIERTQV9pc19wcmltZQogICAgIGFuZCBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVyczogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlCiAgICAgZm9yIGVhY2ggcG9zaXRpdmUgd2l0bmVzcyBpbiB0aGUgUmFiaW4tTWlsbGVyIHRlc3QsIG5vdCBqdXN0CiAgICAgb2NjYXNpb25hbGx5IGluIHRoZSBpbm5lciBsb29wOyBhbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlCiAgICAgY2FsbGJhY2sgZnVuY3Rpb24gbm93IHByb3ZpZGUgYW4gaXRlcmF0aW9uIGNvdW50IGZvciB0aGUgb3V0ZXIKICAgICBsb29wIHJhdGhlciB0aGFuIGZvciB0aGUgY3VycmVudCBpbnZvY2F0aW9uIG9mIHRoZSBpbm5lciBsb29wLgogICAgIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIGFkZGl0aW9uYWxseSBjYW4gY2FsbCB0aGUgY2FsbGJhY2sKICAgICBmdW5jdGlvbiB3aXRoIGFuICdpdGVyYXRpb24gY291bnQnIG9mIC0xLCBtZWFuaW5nIHRoYXQgYQogICAgIGNhbmRpZGF0ZSBoYXMgcGFzc2VkIHRoZSB0cmlhbCBkaXZpc2lvbiB0ZXN0ICh3aGVuIHEgaXMgZ2VuZXJhdGVkIAogICAgIGZyb20gYW4gYXBwbGljYXRpb24tcHJvdmlkZWQgc2VlZCwgdHJpYWwgZGl2aXNpb24gaXMgc2tpcHBlZCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX2lzX3ByaW1lX2Zhc3R0ZXN0IHRoYXQgb3B0aW9uYWxseSBkb2VzIHRyaWFsCiAgICAgZGl2aXNpb24gYmVmb3JlIHN0YXJ0aW5nIHRoZSBSYWJpbi1NaWxsZXIgdGVzdCBhbmQgaGFzCiAgICAgYW4gYWRkaXRpb25hbCBCTl9DVFggKiBhcmd1bWVudCAod2hlcmVhcyBCTl9pc19wcmltZSBhbHdheXMKICAgICBoYXMgdG8gYWxsb2NhdGUgYXQgbGVhc3Qgb25lIEJOX0NUWCkuCiAgICAgJ2NhbGxiYWNrKDEsIC0xLCBjYl9hcmcpJyBpcyBjYWxsZWQgd2hlbiBhIG51bWJlciBoYXMgcGFzc2VkIHRoZQogICAgIHRyaWFsIGRpdmlzaW9uIHN0YWdlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBmb3IgYnVnIGluIENSTCBlbmNvZGluZy4gVGhlIHZhbGlkaXR5IGRhdGVzIHdlcmVuJ3QgYmVpbmcgaGFuZGxlZAogICAgIGFzIEFTTjFfVElNRS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgLXBrY3MxMiBvcHRpb24gdG8gQ0EucGwgc2NyaXB0IHRvIHdyaXRlIG91dCBhIFBLQ1MjMTIgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fcHNldWRvX3JhbmQoKS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQ2xlYW4gdXAgQk5fbW9kX211bF9tb250Z29tZXJ5KCk6IHJlcGxhY2UgdGhlIGJyb2tlbiAoYW5kIHVucmVhZGFibGUpCiAgICAgYmlnbnVtIHZlcnNpb24gb2YgQk5fZnJvbV9tb250Z29tZXJ5KCkgd2l0aCB0aGUgd29ya2luZyBjb2RlIGZyb20KICAgICBTU0xlYXkgMC45LjAgKHRoZSB3b3JkIGJhc2VkIHZlcnNpb24gaXMgZmFzdGVyIGFueXdheSksIGFuZCBjbGVhbiB1cAogICAgIHRoZSBjb21tZW50cy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQXZvaWQgYSByYWNlIGNvbmRpdGlvbiBpbiBzMl9jbG50LmMgKGZ1bmN0aW9uIGdldF9zZXJ2ZXJfaGVsbG8pIHRoYXQKICAgICBtYWRlIGl0IGltcG9zc2libGUgdG8gdXNlIHRoZSBzYW1lIFNTTF9TRVNTSU9OIGRhdGEgc3RydWN0dXJlIGluCiAgICAgU1NMMiBjbGllbnRzIGluIG11bHRpcGxlIHRocmVhZHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVGhlIHJldHVybiB2YWx1ZSBvZiBSQU5EX2xvYWRfZmlsZSgpIG5vIGxvbmdlciBjb3VudHMgYnl0ZXMgb2J0YWluZWQKICAgICBieSBzdGF0KCkuICBSQU5EX2xvYWRfZmlsZSguLi4sIC0xKSBpcyBuZXcgYW5kIHVzZXMgdGhlIGNvbXBsZXRlIGZpbGUKICAgICB0byBzZWVkIHRoZSBQUk5HIChwcmV2aW91c2x5IGFuIGV4cGxpY2l0IGJ5dGUgY291bnQgd2FzIHJlcXVpcmVkKS4KICAgICBbVWxmIE32bGxlciwgQm9kbyBN9mxsZXJdCgogICopIENsZWFuIHVwIENSWVBUT19FWF9EQVRBIGZ1bmN0aW9ucywgc29tZSBvZiB0aGVzZSBkaWRuJ3QgaGF2ZSBwcm90b3R5cGVzCiAgICAgdXNlZCAoY2hhciAqKSBpbnN0ZWFkIG9mICh2b2lkICopIGFuZCBoYWQgY2FzdHMgYWxsIG92ZXIgdGhlIHBsYWNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgQk5fZ2VuZXJhdGVfcHJpbWUoKSByZXR1cm4gTlVMTCBvbiBlcnJvciBpZiByZXQhPU5VTEwuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFJldGFpbiBzb3VyY2UgY29kZSBjb21wYXRpYmlsaXR5IGZvciBCTl9wcmltZV9jaGVja3MgbWFjcm86CiAgICAgQk5faXNfcHJpbWUoLi4uLCBCTl9wcmltZV9jaGVja3MsIC4uLikgbm93IHVzZXMKICAgICBCTl9wcmltZV9jaGVja3NfZm9yX3NpemUgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YKICAgICBSYWJpbi1NaWxsZXIgaXRlcmF0aW9ucy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRGlmZmllLUhlbGxtYW4gdXNlcyAic2FmZSIgcHJpbWVzOiBESF9jaGVjaygpIHJldHVybiBjb2RlIHJlbmFtZWQgdG8KICAgICBESF9DSEVDS19QX05PVF9TQUZFX1BSSU1FLgogICAgIChDaGVjayBpZiB0aGlzIGlzIHRydWU/IE9wZW5QR1AgY2FsbHMgdGhlbSAic3Ryb25nIi4pCiAgICAgW1VsZiBN9mxsZXJdCgogICopIE1lcmdlIHRoZSBmdW5jdGlvbmFsaXR5IG9mICJkaCIgYW5kICJnZW5kaCIgcHJvZ3JhbXMgaW50byBhIG5ldyBwcm9ncmFtCiAgICAgImRocGFyYW0iLiBUaGUgb2xkIHByb2dyYW1zIGFyZSByZXRhaW5lZCBmb3Igbm93IGJ1dCB3aWxsIGhhbmRsZSBESCBrZXlzCiAgICAgKGluc3RlYWQgb2YgcGFyYW1ldGVycykgaW4gZnV0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgdGhlIGNpcGhlcnMsIHNfc2VydmVyIGFuZCBzX2NsaWVudCBwcm9ncmFtcyBjaGVjayB0aGUgcmV0dXJuIHZhbHVlcwogICAgIHdoZW4gYSBuZXcgY2lwaGVyIGxpc3QgaXMgc2V0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgdGhlIFNTTC9UTFMgY2lwaGVyIG1lY2hhbmlzbSB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBUTFMgNTZiaXQKICAgICBjaXBoZXJzLiBCZWZvcmUgd2hlbiB0aGUgNTZiaXQgY2lwaGVycyB3ZXJlIGVuYWJsZWQgdGhlIHNvcnRpbmcgd2FzCiAgICAgd3JvbmcuCgogICAgIFRoZSBzeW50YXggZm9yIHRoZSBjaXBoZXIgc29ydGluZyBoYXMgYmVlbiBleHRlbmRlZCB0byBzdXBwb3J0IHNvcnRpbmcgYnkKICAgICBjaXBoZXItc3RyZW5ndGggKHVzaW5nIHRoZSBzdHJlbmd0aF9iaXRzIGhhcmQgY29kZWQgaW4gdGhlIHRhYmxlcykuCiAgICAgVGhlIG5ldyBjb21tYW5kIGlzICJAU1RSRU5HVEgiIChzZWUgYWxzbyBkb2MvYXBwcy9jaXBoZXJzLnBvZCkuCgogICAgIEZpeCBhIGJ1ZyBpbiB0aGUgY2lwaGVyLWNvbW1hbmQgcGFyc2VyOiB3aGVuIHN1cHBseWluZyBhIGNpcGhlciBjb21tYW5kCiAgICAgc3RyaW5nIHdpdGggYW4gInVuZGVmaW5lZCIgc3ltYm9sIChuZWl0aGVyIGNvbW1hbmQgbm9yIGFscGhhbnVtZXJpYwogICAgIFtBLVphLXowLTldLCBzc2xfc2V0X2NpcGhlcl9saXN0IHVzZWQgdG8gaGFuZyBpbiBhbiBlbmRsZXNzIGxvb3AuIE5vdwogICAgIGFuIGVycm9yIGlzIGZsYWdnZWQuCgogICAgIER1ZSB0byB0aGUgc3RyZW5ndGgtc29ydGluZyBleHRlbnNpb24sIHRoZSBjb2RlIG9mIHRoZQogICAgIHNzbF9jcmVhdGVfY2lwaGVyX2xpc3QoKSBmdW5jdGlvbiB3YXMgY29tcGxldGVseSByZWFycmFuZ2VkLiBJIGhvcGUgdGhhdAogICAgIHRoZSByZWFkYWJpbGl0eSB3YXMgYWxzbyBpbmNyZWFzZWQgOi0pCiAgICAgW0x1dHogSmFlbmlja2UgPEx1dHouSmFlbmlja2VAYWV0LlRVLUNvdHRidXMuREU+XQoKICAqKSBNaW5vciBjaGFuZ2UgdG8gJ3g1MDknIHV0aWxpdHkuIFRoZSAtQ0FjcmVhdGVzZXJpYWwgb3B0aW9uIG5vdyB1c2VzIDEKICAgICBmb3IgdGhlIGZpcnN0IHNlcmlhbCBudW1iZXIgYW5kIHBsYWNlcyAyIGluIHRoZSBzZXJpYWwgbnVtYmVyIGZpbGUuIFRoaXMKICAgICBhdm9pZHMgcHJvYmxlbXMgd2hlbiB0aGUgcm9vdCBDQSBpcyBjcmVhdGVkIHdpdGggc2VyaWFsIG51bWJlciB6ZXJvIGFuZAogICAgIHRoZSBmaXJzdCB1c2VyIGNlcnRpZmljYXRlIGhhcyB0aGUgc2FtZSBpc3N1ZXIgbmFtZSBhbmQgc2VyaWFsIG51bWJlcgogICAgIGFzIHRoZSByb290IENBLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIHRvIFg1MDlfQVRUUklCVVRFIHV0aWxpdGllcywgY2hhbmdlIHRoZSAncmVxJyBwcm9ncmFtIHNvIGl0IHVzZXMKICAgICB0aGUgbmV3IGNvZGUuIEFkZCBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0dWZmLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZXMgdG8gWDUwOV9BVFRSSUJVVEUgdXRpbGl0aWVzLiBUaGVzZSBoYXZlIGJlZW4gcmVuYW1lZCBmcm9tCiAgICAgWDUwOV8qKCkgdG8gWDUwOWF0XyooKSBvbiB0aGUgZ3JvdW5kcyB0aGF0IHRoZXkgZG9uJ3QgaGFuZGxlIFg1MDkKICAgICBzdHJ1Y3R1cmVzIGFuZCBiZWhhdmUgaW4gYW4gYW5hbG9nb3VzIHdheSB0byB0aGUgWDUwOXYzIGZ1bmN0aW9uczoKICAgICB0aGV5IHNob3VsZG4ndCBiZSBjYWxsZWQgZGlyZWN0bHkgYnV0IHdyYXBwZXIgZnVuY3Rpb25zIHNob3VsZCBiZSB1c2VkCiAgICAgaW5zdGVhZC4KCiAgICAgU28gd2UgYWxzbyBub3cgaGF2ZSBzb21lIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgY2FsbCB0aGUgWDUwOWF0IGZ1bmN0aW9ucwogICAgIHdoZW4gcGFzc2VkIGNlcnRpZmljYXRlIHJlcXVlc3RzLiAoVE8gRE86IHNpbWlsYXIgdGhpbmdzIGNhbiBiZSBkb25lIHdpdGgKICAgICBQS0NTIzcgc2lnbmVkIGFuZCB1bnNpZ25lZCBhdHRyaWJ1dGVzLCBQS0NTIzEyIGF0dHJpYnV0ZXMgYW5kIGEgZmV3IG90aGVyCiAgICAgdGhpbmdzLiBTb21lIG9mIHRoZXNlIG5lZWQgc29tZSBkMmkgb3IgaTJkIGFuZCBwcmludCBmdW5jdGlvbmFsaXR5CiAgICAgYmVjYXVzZSB0aGV5IGhhbmRsZSBtb3JlIGNvbXBsZXggc3RydWN0dXJlcy4pCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG1pc3NpbmcgI2lmbmRlZnMgdGhhdCBjYXVzZWQgbWlzc2luZyBzeW1ib2xzIHdoZW4gYnVpbGRpbmcgbGlic3NsCiAgICAgYXMgYSBzaGFyZWQgbGlicmFyeSB3aXRob3V0IFJTQS4gIFVzZSAjaWZuZGVmIE5PX1NTTDIgaW5zdGVhZCBvZgogICAgIE5PX1JTQSBpbiBzc2wvczIqLmMuIAogICAgIFtLcmlzIEtlbm5hd2F5IDxrcmlzQGh1Yi5mcmVlYnNkLm9yZz4sIG1vZGlmaWVkIGJ5IFVsZiBN9mxsZXJdCgogICopIFByZWNhdXRpb25zIGFnYWluc3QgdXNpbmcgdGhlIFBSTkcgdW5pbml0aWFsaXplZDogUkFORF9ieXRlcygpIG5vdwogICAgIGhhcyBhIHJldHVybiB2YWx1ZSB3aGljaCBpbmRpY2F0ZXMgdGhlIHF1YWxpdHkgb2YgdGhlIHJhbmRvbSBkYXRhCiAgICAgKDEgPSBvaywgMCA9IG5vdCBzZWVkZWQpLiAgQWxzbyBhbiBlcnJvciBpcyByZWNvcmRlZCBvbiB0aGUgdGhyZWFkJ3MKICAgICBlcnJvciBxdWV1ZS4gTmV3IGZ1bmN0aW9uIFJBTkRfcHNldWRvX2J5dGVzKCkgZ2VuZXJhdGVzIG91dHB1dCB0aGF0IGlzCiAgICAgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYnV0IG5vdCB1bnByZWRpY3RhYmxlLiBSQU5EX2FkZCBpcyBsaWtlCiAgICAgUkFORF9zZWVkLCBidXQgdGFrZXMgYW4gZXh0cmEgYXJndW1lbnQgZm9yIGFuIGVudHJvcHkgZXN0aW1hdGUKICAgICAoUkFORF9zZWVkIGFsd2F5cyBhc3N1bWVzIGZ1bGwgZW50cm9weSkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIERvIG1vcmUgaXRlcmF0aW9ucyBvZiBSYWJpbi1NaWxsZXIgcHJvYmFibGUgcHJpbWUgdGVzdCAoc3BlY2lmaWNhbGx5LAogICAgIDMgZm9yIDEwMjQtYml0IHByaW1lcywgNiBmb3IgNTEyLWJpdCBwcmltZXMsIDEyIGZvciAyNTYtYml0IHByaW1lcwogICAgIGluc3RlYWQgb2Ygb25seSAyIGZvciBhbGwgbGVuZ3Roczsgc2VlIEJOX3ByaW1lX2NoZWNrc19mb3Jfc2l6ZSBkZWZpbml0aW9uCiAgICAgaW4gY3J5cHRvL2JuL2JuX3ByaW1lLmMgZm9yIHRoZSBjb21wbGV0ZSB0YWJsZSkuICBUaGlzIGd1YXJhbnRlZXMgYQogICAgIGZhbHNlLXBvc2l0aXZlIHJhdGUgb2YgYXQgbW9zdCAyXi04MCBmb3IgcmFuZG9tIGlucHV0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJld3JpdGUgc3NsM19yZWFkX24gKHNzbC9zM19wa3QuYykgYXZvaWRpbmcgYSBjb3VwbGUgb2YgYnVncy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOV9DVFhfcmdldF9jaGFpbigpIChyZW5hbWVkIHRvIFg1MDlfQ1RYX2dldDFfY2hhaW4KICAgICBpbiB0aGUgMC45LjUgcmVsZWFzZSksIHRoaXMgcmV0dXJucyB0aGUgY2hhaW4KICAgICBmcm9tIGFuIFg1MDlfQ1RYIHN0cnVjdHVyZSB3aXRoIGEgZHVwIG9mIHRoZSBzdGFjayBhbmQgYWxsCiAgICAgdGhlIFg1MDkgcmVmZXJlbmNlIGNvdW50cyB1cHBlZDogc28gdGhlIHN0YWNrIHdpbGwgZXhpc3QKICAgICBhZnRlciBYNTA5X0NUWF9jbGVhbnVwKCkgaGFzIGJlZW4gY2FsbGVkLiBNb2RpZnkgcGtjczEyLmMKICAgICB0byB1c2UgdGhpcy4KCiAgICAgQWxzbyBtYWtlIFNTTF9TRVNTSU9OX3ByaW50KCkgcHJpbnQgb3V0IHRoZSB2ZXJpZnkgcmV0dXJuCiAgICAgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbWFucGFnZSBmb3IgdGhlIHBrY3MxMiBjb21tYW5kLiBBbHNvIGNoYW5nZSB0aGUgZGVmYXVsdAogICAgIGJlaGF2aW91ciBzbyBNQUMgaXRlcmF0aW9uIGNvdW50cyBhcmUgdXNlZCB1bmxlc3MgdGhlIG5ldwogICAgIC1ub21hY2l0ZXIgb3B0aW9uIGlzIHVzZWQuIFRoaXMgaW1wcm92ZXMgZmlsZSBzZWN1cml0eSBhbmQKICAgICBvbmx5IG9sZGVyIHZlcnNpb25zIG9mIE1TSUUgKDQuMCBmb3IgZXhhbXBsZSkgbmVlZCBpdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIb25vciB0aGUgbm8teHh4IENvbmZpZ3VyZSBvcHRpb25zIHdoZW4gY3JlYXRpbmcgLkRFRiBmaWxlcy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIFBLQ1MjMTAgYXR0cmlidXRlcyB0byBmaWVsZCB0YWJsZTogY2hhbGxlbmdlUGFzc3dvcmQsIAogICAgIHVuc3RydWN0dXJlZE5hbWUgYW5kIHVuc3RydWN0dXJlZEFkZHJlc3MuIFRoZXNlIGFyZSB0YWtlbiBmcm9tCiAgICAgZHJhZnQgUEtDUyM5IHYyLjAgYnV0IGFyZSBjb21wYXRpYmxlIHdpdGggdjEuMiBwcm92aWRlZCBubyAKICAgICBpbnRlcm5hdGlvbmFsIGNoYXJhY3RlcnMgYXJlIHVzZWQuCgogICAgIE1vcmUgY2hhbmdlcyB0byBYNTA5X0FUVFJJQlVURSBjb2RlOiBhbGxvdyB0aGUgc2V0dGluZyBvZiB0eXBlcwogICAgIGJhc2VkIG9uIHN0cmluZ3MuIFJlbW92ZSB0aGUgJ2xvYycgcGFyYW1ldGVyIHdoZW4gYWRkaW5nCiAgICAgYXR0cmlidXRlcyBiZWNhdXNlIHRoZXNlIHdpbGwgYmUgYSBTRVQgT0YgZW5jb2Rpbmcgd2hpY2ggaXMgc29ydGVkCiAgICAgaW4gQVNOMSBvcmRlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGNoYW5nZXMgdG8gdGhlICdyZXEnIHV0aWxpdHkgdG8gYWxsb3cgcmVxdWVzdCBnZW5lcmF0aW9uCiAgICAgYXV0b21hdGlvbi4gVGhpcyB3aWxsIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGp1c3QgZ2VuZXJhdGUgYSB0ZW1wbGF0ZQogICAgIGZpbGUgY29udGFpbmluZyBhbGwgdGhlIGZpZWxkIHZhbHVlcyBhbmQgaGF2ZSByZXEgY29uc3RydWN0IHRoZQogICAgIHJlcXVlc3QuCgogICAgIEluaXRpYWwgc3VwcG9ydCBmb3IgWDUwOV9BVFRSSUJVVEUgaGFuZGxpbmcuIFN0YWNrcyBvZiB0aGVzZSBhcmUKICAgICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZSBpbmNsdWRpbmcgY2VydGlmaWNhdGUgcmVxdWVzdHMgYW5kIFBLQ1MjNwogICAgIHN0cnVjdHVyZXMuIFRoZXkgYXJlIGN1cnJlbnRseSBoYW5kbGVkIG1hbnVhbGx5IHdoZXJlIG5lY2Vzc2FyeSB3aXRoCiAgICAgc29tZSBwcmltaXRpdmUgd3JhcHBlcnMgZm9yIFBLQ1MjNy4gVGhlIG5ldyBmdW5jdGlvbnMgYmVoYXZlIGluIGEKICAgICBtYW5uZXIgYW5hbG9nb3VzIHRvIHRoZSBYNTA5IGV4dGVuc2lvbiBmdW5jdGlvbnM6IHRoZXkgYWxsb3cKICAgICBhdHRyaWJ1dGVzIHRvIGJlIGxvb2tlZCB1cCBieSBOSUQgYW5kIGFkZGVkLgoKICAgICBMYXRlciBzb21ldGhpbmcgc2ltaWxhciB0byB0aGUgWDUwOVYzIGNvZGUgd291bGQgYmUgZGVzaXJhYmxlIHRvCiAgICAgYXV0b21hdGljYWxseSBoYW5kbGUgdGhlIGVuY29kaW5nLCBkZWNvZGluZyBhbmQgcHJpbnRpbmcgb2YgdGhlCiAgICAgbW9yZSBjb21wbGV4IHR5cGVzLiBUaGUgc3RyaW5nIHR5cGVzIGxpa2UgY2hhbGxlbmdlUGFzc3dvcmQgY2FuCiAgICAgYmUgaGFuZGxlZCBieSB0aGUgc3RyaW5nIHRhYmxlIGZ1bmN0aW9ucy4KCiAgICAgQWxzbyBtb2RpZmllZCB0aGUgbXVsdGkgYnl0ZSBzdHJpbmcgdGFibGUgaGFuZGxpbmcuIE5vdyB0aGVyZSBpcwogICAgIGEgJ2dsb2JhbCBtYXNrJyB3aGljaCBtYXNrcyBvdXQgY2VydGFpbiB0eXBlcy4gVGhlIHRhYmxlIGl0c2VsZgogICAgIGNhbiB1c2UgdGhlIGZsYWcgU1RBQkxFX05PX01BU0sgdG8gaWdub3JlIHRoZSBtYXNrIHNldHRpbmc6IHRoaXMKICAgICBpcyB1c2VmdWwgd2hlbiBmb3IgZXhhbXBsZSB0aGVyZSBpcyBvbmx5IG9uZSBwZXJtaXNzaWJsZSB0eXBlCiAgICAgKGFzIGluIGNvdW50cnlOYW1lKSBhbmQgdXNpbmcgdGhlIG1hc2sgbWlnaHQgcmVzdWx0IGluIG5vIHZhbGlkCiAgICAgdHlwZXMgYXQgYWxsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENsZWFuIHVwICdGaW5pc2hlZCcgaGFuZGxpbmcsIGFuZCBhZGQgZnVuY3Rpb25zIFNTTF9nZXRfZmluaXNoZWQgYW5kCiAgICAgU1NMX2dldF9wZWVyX2ZpbmlzaGVkIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBvYnRhaW4gdGhlIGxhdGVzdAogICAgIEZpbmlzaGVkIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIHBlZXIgb3IgZXhwZWN0ZWQgZnJvbSB0aGUgcGVlciwKICAgICByZXNwZWN0aXZlbHkuICAoU1NMX2dldF9wZWVyX2ZpbmlzaGVkIGlzIHVzdWFsbHkgdGhlIEZpbmlzaGVkIG1lc3NhZ2UKICAgICBhY3R1YWxseSByZWNlaXZlZCBmcm9tIHRoZSBwZWVyLCBvdGhlcndpc2UgdGhlIHByb3RvY29sIHdpbGwgYmUgYWJvcnRlZC4pCgogICAgIEFzIHRoZSBGaW5pc2hlZCBtZXNzYWdlIGFyZSBtZXNzYWdlIGRpZ2VzdHMgb2YgdGhlIGNvbXBsZXRlIGhhbmRzaGFrZQogICAgICh3aXRoIGEgdG90YWwgb2YgMTkyIGJpdHMgZm9yIFRMUyAxLjAgYW5kIG1vcmUgZm9yIFNTTCAzLjApLCB0aGV5IGNhbgogICAgIGJlIHVzZWQgZm9yIGV4dGVybmFsIGF1dGhlbnRpY2F0aW9uIHByb2NlZHVyZXMgd2hlbiB0aGUgYXV0aGVudGljYXRpb24KICAgICBwcm92aWRlZCBieSBTU0wvVExTIGlzIG5vdCBkZXNpcmVkIG9yIGlzIG5vdCBlbm91Z2guCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRW5oYW5jZWQgc3VwcG9ydCBmb3IgQWxwaGEgTGludXggaXMgYWRkZWQuIE5vdyAuL2NvbmZpZyBjaGVja3MgaWYKICAgICB0aGUgaG9zdCBzdXBwb3J0cyBCV1ggZXh0ZW5zaW9uIGFuZCBpZiBDb21wYXEgQyBpcyBwcmVzZW50IG9uIHRoZQogICAgICRQQVRILiBKdXN0IGV4cGxvaXRpbmcgb2YgdGhlIEJXWCBleHRlbnNpb24gcmVzdWx0cyBpbiAyMC0zMCUKICAgICBwZXJmb3JtYW5jZSBraWNrIGZvciBzb21lIGFsZ29yaXRobXMsIGUuZy4gREVTIGFuZCBSQzQgdG8gbWVudGlvbgogICAgIGEgY291cGxlLiBDb21wYXEgQyBpbiB0dXJuIGdlbmVyYXRlcyB+MjAlIGZhc3RlciBjb2RlIGZvciBNRDUgYW5kCiAgICAgU0hBMS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIE1TICJmYXN0IFNHQyIuIFRoaXMgaXMgYXJndWFibHkgYSB2aW9sYXRpb24gb2YgdGhlCiAgICAgU1NMMy9UTFMgcHJvdG9jb2wuIE5ldHNjYXBlIFNHQyBkb2VzIHR3byBoYW5kc2hha2VzOiB0aGUgZmlyc3Qgd2l0aAogICAgIHdlYWsgY3J5cHRvIGFuZCBhZnRlciBjaGVja2luZyB0aGUgY2VydGlmaWNhdGUgaXMgU0dDIGEgc2Vjb25kIG9uZQogICAgIHdpdGggc3Ryb25nIGNyeXB0by4gTVMgU0dDIHN0b3BzIHRoZSBmaXJzdCBoYW5kc2hha2UgYWZ0ZXIgcmVjZWl2aW5nCiAgICAgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBtZXNzYWdlIGFuZCBzZW5kcyBhIHNlY29uZCBjbGllbnQgaGVsbG8uIFNpbmNlCiAgICAgYSBzZXJ2ZXIgd2lsbCB0eXBpY2FsbHkgZG8gYWxsIHRoZSB0aW1lIGNvbnN1bWluZyBvcGVyYXRpb25zIGJlZm9yZQogICAgIGV4cGVjdGluZyBhbnkgZnVydGhlciBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQgKHNlcnZlciBrZXkgZXhjaGFuZ2UKICAgICBpcyB0aGUgbW9zdCBleHBlbnNpdmUpIHRoZXJlIGlzIGxpdHRsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3by4KCiAgICAgVG8gZ2V0IE9wZW5TU0wgdG8gc3VwcG9ydCBNUyBTR0Mgd2UgaGF2ZSB0byBwZXJtaXQgYSBzZWNvbmQgY2xpZW50CiAgICAgaGVsbG8gbWVzc2FnZSBhZnRlciB3ZSBoYXZlIHNlbnQgc2VydmVyIGRvbmUuIEluIGFkZGl0aW9uIHdlIGhhdmUgdG8KICAgICByZXNldCB0aGUgTUFDIGlmIHdlIGRvIGdldCB0aGlzIHNlY29uZCBjbGllbnQgaGVsbG8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZnVuY3Rpb24gJ2QyaV9BdXRvUHJpdmF0ZUtleSgpJyB0aGlzIHdpbGwgYXV0b21hdGljYWxseSBkZWNpZGUKICAgICBpZiBhIERFUiBlbmNvZGVkIHByaXZhdGUga2V5IGlzIFJTQSBvciBEU0EgdHJhZGl0aW9uYWwgZm9ybWF0LiBDaGFuZ2VkCiAgICAgZDJpX1ByaXZhdGVLZXlfYmlvKCkgdG8gdXNlIGl0LiBUaGlzIGlzIG9ubHkgbmVlZGVkIGZvciB0aGUgInRyYWRpdGlvbmFsIgogICAgIGZvcm1hdCBERVIgZW5jb2RlZCBwcml2YXRlIGtleS4gTmV3ZXIgY29kZSBzaG91bGQgdXNlIFBLQ1MjOCBmb3JtYXQgd2hpY2gKICAgICBoYXMgdGhlIGtleSB0eXBlIGVuY29kZWQgaW4gdGhlIEFTTjEgc3RydWN0dXJlLiBBZGRlZCBERVIgcHJpdmF0ZSBrZXkKICAgICBzdXBwb3J0IHRvIHBrY3M4IGFwcGxpY2F0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNTTCAzL1RMUyAxIHNlcnZlcnMgbm93IGRvbid0IHJlcXVlc3QgY2VydGlmaWNhdGVzIHdoZW4gYW4gYW5vbnltb3VzCiAgICAgY2lwaGVyc3VpdGVzIGhhcyBiZWVuIHNlbGVjdGVkIChhcyByZXF1aXJlZCBieSB0aGUgU1NMIDMvVExTIDEKICAgICBzcGVjaWZpY2F0aW9ucykuICBFeGNlcHRpb246IFdoZW4gU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVAogICAgIGlzIHNldCwgd2UgaW50ZXJwcmV0IHRoaXMgYXMgYSByZXF1ZXN0IHRvIHZpb2xhdGUgdGhlIHNwZWNpZmljYXRpb24KICAgICAodGhlIHdvcnN0IHRoYXQgY2FuIGhhcHBlbiBpcyBhIGhhbmRzaGFrZSBmYWlsdXJlLCBhbmQgJ2NvcnJlY3QnCiAgICAgYmVoYXZpb3VyIHdvdWxkIHJlc3VsdCBpbiBhIGhhbmRzaGFrZSBmYWlsdXJlIGFueXdheSkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gU1NMX0NUWF9hZGRfc2Vzc2lvbiwgdGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZQogICAgIFNTTF9TRVNTSU9OIHN0cnVjdHVyZXMgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIChlLmcuIHdoZW4gdHdvIHRocmVhZHMKICAgICBjb25jdXJyZW50bHkgb2J0YWluIHRoZW0gZnJvbSBhbiBleHRlcm5hbCBjYWNoZSkuCiAgICAgVGhlIGludGVybmFsIGNhY2hlIGNhbiBoYW5kbGUgb25seSBvbmUgU1NMX1NFU1NJT04gd2l0aCBhIGdpdmVuIElELAogICAgIHNvIGlmIHRoZXJlJ3MgYSBjb25mbGljdCwgd2Ugbm93IHRocm93IG91dCB0aGUgb2xkIG9uZSB0byBhY2hpZXZlCiAgICAgY29uc2lzdGVuY3kuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIE9JRHMgZm9yIGlkZWEgYW5kIGJsb3dmaXNoIGluIENCQyBtb2RlLiBUaGlzIHdpbGwgYWxsb3cgYm90aAogICAgIHRvIGJlIHVzZWQgaW4gUEtDUyM1IHYyLjAgYW5kIFMvTUlNRS4gIEFsc28gYWRkIGNoZWNraW5nIHRvCiAgICAgc29tZSByb3V0aW5lcyB0aGF0IHVzZSBjaXBoZXIgT0lEczogc29tZSBjaXBoZXJzIGRvIG5vdCBoYXZlIE9JRHMKICAgICBkZWZpbmVkIGFuZCBzbyB0aGV5IGNhbm5vdCBiZSB1c2VkIGZvciBTL01JTUUgYW5kIFBLQ1MjNSB2Mi4wIGZvcgogICAgIGV4YW1wbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU2ltcGxpZnkgdGhlIHRydXN0IHNldHRpbmcgc3RydWN0dXJlIGFuZCBjb2RlLiBOb3cgd2UganVzdCBoYXZlCiAgICAgdHdvIHNlcXVlbmNlcyBvZiBPSURzIGZvciB0cnVzdGVkIGFuZCByZWplY3RlZCBzZXR0aW5ncy4gVGhlc2Ugd2lsbAogICAgIHR5cGljYWxseSBoYXZlIHZhbHVlcyB0aGUgc2FtZSBhcyB0aGUgZXh0ZW5kZWQga2V5IHVzYWdlIGV4dGVuc2lvbgogICAgIGFuZCBhbnkgYXBwbGljYXRpb24gc3BlY2lmaWMgcHVycG9zZXMuCgogICAgIFRoZSB0cnVzdCBjaGVja2luZyBjb2RlIG5vdyBoYXMgYSBkZWZhdWx0IGJlaGF2aW91cjogaXQgd2lsbCBqdXN0CiAgICAgY2hlY2sgZm9yIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIE5JRCBhcyB0aGUgcGFzc2VkIGlkLiBGdW5jdGlvbnMgY2FuCiAgICAgYmUgcHJvdmlkZWQgdG8gb3ZlcnJpZGUgZWl0aGVyIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvciB0aGUgYmVoYXZpb3VyCiAgICAgZm9yIGEgZ2l2ZW4gaWQuIFNTTCBjbGllbnQsIHNlcnZlciBhbmQgZW1haWwgYWxyZWFkeSBoYXZlIGZ1bmN0aW9ucwogICAgIGluIHBsYWNlIGZvciBjb21wYXRpYmlsaXR5OiB0aGV5IGNoZWNrIHRoZSBOSUQgYW5kIGFsc28gcmV0dXJuICJ0cnVzdGVkIgogICAgIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBzZWxmIHNpZ25lZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZDJpLGkyZCBiaW8vZnAgZnVuY3Rpb25zIGZvciBQcml2YXRlS2V5OiB0aGVzZSBjb252ZXJ0IHRoZQogICAgIHRyYWRpdGlvbmFsIGZvcm1hdCBpbnRvIGFuIEVWUF9QS0VZIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBwYXNzd29yZCBjYWxsYmFjayBmdW5jdGlvbiBQRU1fY2IoKSB3aGljaCBlaXRoZXIgcHJvbXB0cyBmb3IKICAgICBhIHBhc3N3b3JkIGlmIHVzcl9kYXRhIGlzIE5VTEwgb3Igb3RoZXJ3aXNlIGFzc3VtZXMgaXQgaXMgYSBudWxsCiAgICAgdGVybWluYXRlZCBwYXNzd29yZC4gQWxsb3cgcGFzc3dvcmRzIHRvIGJlIHBhc3NlZCBvbiBjb21tYW5kIGxpbmUKICAgICBlbnZpcm9ubWVudCBvciBjb25maWcgZmlsZXMgaW4gYSBmZXcgbW9yZSB1dGlsaXRpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgYnVuY2ggb2YgREVSIGFuZCBQRU0gZnVuY3Rpb25zIHRvIGhhbmRsZSBQS0NTIzggZm9ybWF0IHByaXZhdGUKICAgICBrZXlzLiBBZGQgc29tZSBzaG9ydCBuYW1lcyBmb3IgUEtDUyM4IFBCRSBhbGdvcml0aG1zIGFuZCBhbGxvdyB0aGVtCiAgICAgdG8gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgZm9yIHRoZSBwa2NzOCBhbmQgcGtjczEyIHV0aWxpdGllcy4KICAgICBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBBU04xICJOVUxMIiB0eXBlLiBUaGlzIGNvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIGJ5IHVzaW5nCiAgICAgQVNOMV9UWVBFIGJ1dCB0aGVyZSB3YXNuJ3QgYW55IGZ1bmN0aW9uIHRoYXQgd291bGQgdHJ5IHRvIHJlYWQgYSBOVUxMCiAgICAgYW5kIHByb2R1Y2UgYW4gZXJyb3IgaWYgaXQgY291bGRuJ3QuIEZvciBjb21wYXRpYmlsaXR5IHdlIGFsc28gaGF2ZQogICAgIEFTTjFfTlVMTF9uZXcoKSBhbmQgQVNOMV9OVUxMX2ZyZWUoKSBmdW5jdGlvbnMgYnV0IHRoZXNlIGFyZSBmYWtlZCBhbmQKICAgICBkb24ndCBhbGxvY2F0ZSBhbnl0aGluZyBiZWNhdXNlIHRoZXkgZG9uJ3QgbmVlZCB0by4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIE1hY09TIGlzIG5vdyBwcm92aWRlZC4gRXhhbWluZSBJTlNUQUxMLk1hY09TCiAgICAgZm9yIGRldGFpbHMuCiAgICAgW0FuZHkgUG9seWFrb3YsIFJveSBXb29kcyA8cm95QGNlbnRpY3N5c3RlbXMuY2E+XQoKICAqKSBSZWJ1aWxkIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB1c2VkIGJ5IE9wZW5TU0wgY29kZSBhbmQKICAgICBwb3NzaWJseSBvdGhlcnMgYXMgd2VsbC4gIFRoZSBwdXJwb3NlIGlzIHRvIG1ha2UgYW4gaW50ZXJmYWNlIHRoYXQKICAgICBwcm92aWRlIGhvb2tzIHNvIGFueW9uZSBjYW4gYnVpbGQgYSBzZXBhcmF0ZSBzZXQgb2YgYWxsb2NhdGlvbiBhbmQKICAgICBkZWFsbG9jYXRpb24gcm91dGluZXMgdG8gYmUgdXNlZCBieSBPcGVuU1NMLCBmb3IgZXhhbXBsZSBtZW1vcnkKICAgICBwb29sIGltcGxlbWVudGF0aW9ucywgb3Igc29tZXRoaW5nIGVsc2UsIHdoaWNoIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICBzaW5jZSBNYWxsb2MoKSwgUmVhbGxvYygpIGFuZCBGcmVlKCkgd2VyZSBkZWZpbmVkIGFzIG1hY3JvcyBoYXZpbmcKICAgICB0aGUgdmFsdWVzIG1hbGxvYywgcmVhbGxvYyBhbmQgZnJlZSwgcmVzcGVjdGl2ZWx5IChleGNlcHQgZm9yIFdpbjMyCiAgICAgY29tcGlsYXRpb25zKS4gIFRoZSBzYW1lIGlzIHByb3ZpZGVkIGZvciBtZW1vcnkgZGVidWdnaW5nIGNvZGUuCiAgICAgT3BlblNTTCBhbHJlYWR5IGNvbWVzIHdpdGggZnVuY3Rpb25hbGl0eSB0byBmaW5kIG1lbW9yeSBsZWFrcywgYnV0CiAgICAgdGhpcyBnaXZlcyBwZW9wbGUgYSBjaGFuY2UgdG8gZGVidWcgb3RoZXIgbWVtb3J5IHByb2JsZW1zLgoKICAgICBXaXRoIHRoZXNlIGNoYW5nZXMsIGEgbmV3IHNldCBvZiBmdW5jdGlvbnMgYW5kIG1hY3JvcyBoYXZlIGFwcGVhcmVkOgoKICAgICAgIENSWVBUT19zZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucygpCSAgICAgICAgW0ZdCiAgICAgICBDUllQVE9fZ2V0X21lbV9kZWJ1Z19mdW5jdGlvbnMoKSAgICAgICAgIFtGXQogICAgICAgQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucygpCSAgICAgICAgICAgICAgICBbRl0KICAgICAgIENSWVBUT19kYmdfZ2V0X29wdGlvbnMoKSAgICAgICAgICAgICAgICAgW0ZdCiAgICAgICBDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKSAgICAgICAgICAgICAgIFtNXQoKICAgICBUaGUgbWVtb3J5IGRlYnVnIGZ1bmN0aW9ucyBhcmUgTlVMTCBieSBkZWZhdWx0LCB1bmxlc3MgdGhlIGxpYnJhcnkKICAgICBpcyBjb21waWxlZCB3aXRoIENSWVBUT19NREVCVUcgb3IgZnJpZW5kcyBpcyBkZWZpbmVkLiAgSWYgc29tZW9uZQogICAgIHdhbnRzIHRvIGRlYnVnIG1lbW9yeSBhbnl3YXksIENSWVBUT19tYWxsb2NfZGVidWdfaW5pdCgpICh3aGljaAogICAgIGdpdmVzIHRoZSBzdGFuZGFyZCBkZWJ1Z2dpbmcgZnVuY3Rpb25zIHRoYXQgY29tZSB3aXRoIE9wZW5TU0wpIG9yCiAgICAgQ1JZUFRPX3NldF9tZW1fZGVidWdfZnVuY3Rpb25zKCkgKHRlbGxzIE9wZW5TU0wgdG8gdXNlIGZ1bmN0aW9ucwogICAgIHByb3ZpZGVkIGJ5IHRoZSBsaWJyYXJ5IHVzZXIpIG11c3QgYmUgdXNlZC4gIFdoZW4gdGhlIHN0YW5kYXJkCiAgICAgZGVidWdnaW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCwgQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucyBjYW4gYmUgdXNlZCB0bwogICAgIHJlcXVlc3QgYWRkaXRpb25hbCBpbmZvcm1hdGlvbjoKICAgICBDUllQVE9fZGJnX3NldF9vcHRpb25zKFZfQ1lSUFRPX01ERUJVR194eHgpIGNvcnJlc3BvbmRzIHRvIHNldHRpbmcKICAgICB0aGUgQ1JZUFRPX01ERUJVR194eHggbWFjcm8gd2hlbiBjb21waWxpbmcgdGhlIGxpYnJhcnkuICAgCgogICAgIEFsc28sIHRoaW5ncyBsaWtlIENSWVBUT19zZXRfbWVtX2Z1bmN0aW9ucyB3aWxsIGFsd2F5cyBnaXZlIHRoZQogICAgIGV4cGVjdGVkIHJlc3VsdCAodGhlIG5ldyBzZXQgb2YgZnVuY3Rpb25zIGlzIHVzZWQgZm9yIGFsbG9jYXRpb24KICAgICBhbmQgZGVhbGxvY2F0aW9uKSBhdCBhbGwgdGltZXMsIHJlZ2FyZGxlc3Mgb2YgcGxhdGZvcm0gYW5kIGNvbXBpbGVyCiAgICAgb3B0aW9ucy4KCiAgICAgVG8gZmluaXNoIGl0IHVwLCBzb21lIGZ1bmN0aW9ucyB0aGF0IHdlcmUgbmV2ZXIgdXNlIGluIGFueSBvdGhlcgogICAgIHdheSB0aGFuIHRocm91Z2ggbWFjcm9zIGhhdmUgYSBuZXcgQVBJIGFuZCBuZXcgc2VtYW50aWM6CgogICAgICAgQ1JZUFRPX2RiZ19tYWxsb2MoKQogICAgICAgQ1JZUFRPX2RiZ19yZWFsbG9jKCkKICAgICAgIENSWVBUT19kYmdfZnJlZSgpCgogICAgIEFsbCBtYWNyb3Mgb2YgdmFsdWUgaGF2ZSByZXRhaW5lZCB0aGVpciBvbGQgc3ludGF4LgogICAgIFtSaWNoYXJkIExldml0dGUgYW5kIEJvZG8gTW9lbGxlcl0KCiAgKikgU29tZSBTL01JTUUgZml4ZXMuIFRoZSBPSUQgZm9yIFNNSU1FQ2FwYWJpbGl0aWVzIHdhcyB3cm9uZywgdGhlCiAgICAgb3JkZXJpbmcgb2YgU01JTUVDYXBhYmlsaXRpZXMgd2Fzbid0IGluICJzdHJlbmd0aCBvcmRlciIgYW5kIHRoZXJlCiAgICAgd2FzIGEgbWlzc2luZyBOVUxMIGluIHRoZSBBbGdvcml0aG1JZGVudGlmaWVyIGZvciB0aGUgU0hBMSBzaWduYXR1cmUKICAgICBhbGdvcml0aG0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU29tZSBBU04xIHR5cGVzIHdpdGggaWxsZWdhbCB6ZXJvIGxlbmd0aCBlbmNvZGluZyAoSU5URUdFUiwKICAgICBFTlVNRVJBVEVEIGFuZCBPQkpFQ1QgSURFTlRJRklFUikgY2hva2VkIHRoZSBBU04xIHJvdXRpbmVzLgogICAgIFtGcmFucyBIZXltYW5zIDxmaGV5bWFuc0Bpc2FzZXJ2ZXIuYmU+LCBtb2RpZmllZCBieSBTdGV2ZSBIZW5zb25dCgogICopIE1lcmdlIGluIG15IFMvTUlNRSBsaWJyYXJ5IGZvciBPcGVuU1NMLiBUaGlzIHByb3ZpZGVzIGEgc2ltcGxlCiAgICAgUy9NSU1FIEFQSSBvbiB0b3Agb2YgdGhlIFBLQ1MjNyBjb2RlLCBhIE1JTUUgcGFyc2VyICh3aXRoIGVub3VnaAogICAgIGZ1bmN0aW9uYWxpdHkgdG8gaGFuZGxlIG11bHRpcGFydC9zaWduZWQgcHJvcGVybHkpIGFuZCBhIHV0aWxpdHkKICAgICBjYWxsZWQgJ3NtaW1lJyB0byBjYWxsIGFsbCB0aGlzIHN0dWZmLiBUaGlzIGlzIGJhc2VkIG9uIGNvZGUgSQogICAgIG9yaWdpbmFsbHkgd3JvdGUgZm9yIENlbG8gd2hvIGhhdmUga2luZGx5IGFsbG93ZWQgaXQgdG8gYmUKICAgICBpbmNsdWRlZCBpbiBPcGVuU1NMLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB2YXJpYW50cyBkZXNfc2V0X2tleV9jaGVja2VkIGFuZCBkZXNfc2V0X2tleV91bmNoZWNrZWQgb2YKICAgICBkZXNfc2V0X2tleSAoYWthIGRlc19rZXlfc2NoZWQpLiAgR2xvYmFsIHZhcmlhYmxlIGRlc19jaGVja19rZXkKICAgICBkZWNpZGVzIHdoaWNoIG9mIHRoZXNlIGlzIGNhbGxlZCBieSBkZXNfc2V0X2tleTsgdGhpcyB3YXkKICAgICBkZXNfY2hlY2tfa2V5IGJlaGF2ZXMgYXMgaXQgYWx3YXlzIGRpZCwgYnV0IGFwcGxpY2F0aW9ucyBhbmQKICAgICB0aGUgbGlicmFyeSBpdHNlbGYsIHdoaWNoIHdhcyBidWdneSBmb3IgZGVzX2NoZWNrX2tleSA9PSAxLAogICAgIGhhdmUgYSBjbGVhbmVyIHdheSB0byBwaWNrIHRoZSB2ZXJzaW9uIHRoZXkgbmVlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gUEtDUzEyX25ld3Bhc3MoKSB3aGljaCBjaGFuZ2VzIHRoZSBwYXNzd29yZCBvZiBhCiAgICAgUEtDUzEyIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgWDUwOV9UUlVTVCBhbmQgWDUwOV9QVVJQT1NFIHNvIGl0IGFsc28gdXNlcyBhIHN0YXRpYyBhbmQKICAgICBkeW5hbWljIG1peC4gSW4gYm90aCBjYXNlcyB0aGUgaWRzIGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4IGludG8gdGhlCiAgICAgdGFibGUuIEFsc28gbW9kaWZpZWQgdGhlIFg1MDlfVFJVU1RfYWRkKCkgYW5kIFg1MDlfUFVSUE9TRV9hZGQoKQogICAgIGZ1bmN0aW9ucyBzbyB0aGV5IGFjY2VwdCBhIGxpc3Qgb2YgdGhlIGZpZWxkIHZhbHVlcyBhbmQgdGhlCiAgICAgYXBwbGljYXRpb24gZG9lc24ndCBuZWVkIHRvIGRpcmVjdGx5IG1hbmlwdWxhdGUgdGhlIFg1MDlfVFJVU1QKICAgICBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSBBU04xX1NUUklOR19UQUJMRSBzdHVmZiBzbyBpdCBhbHNvIHVzZXMgYnNlYXJjaCBhbmQgZG9lc24ndAogICAgIG5lZWQgaW5pdGlhbGlzaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgd2F5IHRoZSBWMyBleHRlbnNpb24gY29kZSBsb29rcyB1cCBleHRlbnNpb25zLiBUaGlzIG5vdwogICAgIHdvcmtzIGluIGEgc2ltaWxhciB3YXkgdG8gdGhlIG9iamVjdCBjb2RlOiB3ZSBoYXZlIHNvbWUgInN0YW5kYXJkIgogICAgIGV4dGVuc2lvbnMgaW4gYSBzdGF0aWMgdGFibGUgd2hpY2ggaXMgc2VhcmNoZWQgd2l0aCBPQkpfYnNlYXJjaCgpCiAgICAgYW5kIHRoZSBhcHBsaWNhdGlvbiBjYW4gYWRkIGR5bmFtaWMgb25lcyBpZiBuZWVkZWQuIFRoZSBmaWxlCiAgICAgY3J5cHRvL3g1MDl2My9leHRfZGF0Lmggbm93IGhhcyB0aGUgaW5mbzogdGhpcyBmaWxlIG5lZWRzIHRvIGJlCiAgICAgdXBkYXRlZCB3aGVuZXZlciBhIG5ldyBleHRlbnNpb24gaXMgYWRkZWQgdG8gdGhlIGNvcmUgY29kZSBhbmQga2VwdAogICAgIGluIGV4dF9uaWQgb3JkZXIuIFRoZXJlIGlzIGEgc2ltcGxlIHByb2dyYW0gJ3RhYnRlc3QuYycgd2hpY2ggY2hlY2tzCiAgICAgdGhpcy4gTmV3IGV4dGVuc2lvbnMgYXJlIG5vdCBhZGRlZCB0b28gb2Z0ZW4gc28gdGhpcyBmaWxlIGNhbiByZWFkaWx5CiAgICAgYmUgbWFpbnRhaW5lZCBtYW51YWxseS4KCiAgICAgVGhlcmUgYXJlIHR3byBiaWcgYWR2YW50YWdlcyBpbiBkb2luZyB0aGluZ3MgdGhpcyB3YXkuIFRoZSBleHRlbnNpb25zCiAgICAgY2FuIGJlIGxvb2tlZCB1cCBpbW1lZGlhdGVseSBhbmQgbm8gbG9uZ2VyIG5lZWQgdG8gYmUgImFkZGVkIiB1c2luZwogICAgIFg1MDlWM19hZGRfc3RhbmRhcmRfZXh0ZW5zaW9ucygpOiB0aGlzIGZ1bmN0aW9uIG5vdyBkb2VzIG5vdGhpbmcuCiAgICAgW1NpZGUgbm90ZTogSSBnZXQgKmxvdHMqIG9mIGVtYWlsIHNheWluZyB0aGUgZXh0ZW5zaW9uIGNvZGUgZG9lc24ndAogICAgICB3b3JrIGJlY2F1c2UgcGVvcGxlIGZvcmdldCB0byBjYWxsIHRoaXMgZnVuY3Rpb25dCiAgICAgQWxzbyBubyBkeW5hbWljIGFsbG9jYXRpb24gaXMgZG9uZSB1bmxlc3MgbmV3IGV4dGVuc2lvbnMgYXJlIGFkZGVkOgogICAgIHNvIGlmIHdlIGRvbid0IGFkZCBjdXN0b20gZXh0ZW5zaW9ucyB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwKICAgICBYNTA5VjNfRVhUX2NsZWFudXAoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgZW5jIHV0aWxpdHkncyBzYWx0aW5nIGFzIGZvbGxvd3M6IG1ha2Ugc2FsdGluZyB0aGUgZGVmYXVsdC4gQWRkIGEKICAgICBtYWdpYyBoZWFkZXIsIHNvIHVuc2FsdGVkIGZpbGVzIGZhaWwgZ3JhY2VmdWxseSBpbnN0ZWFkIG9mIGp1c3QgZGVjcnlwdGluZwogICAgIHRvIGdhcmJhZ2UuIFRoaXMgaXMgYmVjYXVzZSBub3Qgc2FsdGluZyBpcyBhIGJpZyBzZWN1cml0eSBob2xlLCBzbyBwZW9wbGUKICAgICBzaG91bGQgYmUgZGlzY291cmFnZWQgZnJvbSBkb2luZyBpdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4ZXMgYW5kIGVuaGFuY2VtZW50cyB0byB0aGUgJ3g1MDknIHV0aWxpdHkuIEl0IGFsbG93ZWQgYSBtZXNzYWdlCiAgICAgZGlnZXN0IHRvIGJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGJ1dCBpdCBvbmx5IHVzZWQgdGhpcwogICAgIHBhcmFtZXRlciB3aGVuIHNpZ25pbmcgYSBjZXJ0aWZpY2F0ZS4gTW9kaWZpZWQgc28gYWxsIHJlbGV2YW50CiAgICAgb3BlcmF0aW9ucyBhcmUgYWZmZWN0ZWQgYnkgdGhlIGRpZ2VzdCBwYXJhbWV0ZXIgaW5jbHVkaW5nIHRoZQogICAgIC1maW5nZXJwcmludCBhbmQgLXg1MDl0b3JlcSBvcHRpb25zLiBBbHNvIC14NTA5dG9yZXEgY2hva2VkIGlmIGEKICAgICBEU0Ega2V5IHdhcyB1c2VkIGJlY2F1c2UgaXQgZGlkbid0IGZpeCB0aGUgZGlnZXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgY2VydGlmaWNhdGUgY2hhaW4gdmVyaWZ5IGNvZGUuIEN1cnJlbnRseSB0ZXN0cyB0aGUgdW50cnVzdGVkCiAgICAgY2VydGlmaWNhdGVzIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSB2ZXJpZnkgcHVycG9zZSAod2hpY2ggaXMgc2V0CiAgICAgd2hlbiB0aGUgWDUwOV9TVE9SRV9DVFggc3RydWN0dXJlIGlzIHNldCB1cCkgYW5kIGNoZWNrcyB0aGUgcGF0aGxlbmd0aC4KCiAgICAgVGhlcmUgaXMgYSBOT19DSEFJTl9WRVJJRlkgY29tcGlsYXRpb24gb3B0aW9uIHRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvdXI6CiAgICAgdGhpcyBpcyBiZWNhdXNlIGl0IHdpbGwgcmVqZWN0IGNoYWlucyB3aXRoIGludmFsaWQgZXh0ZW5zaW9ucyB3aGVyZWFzCiAgICAgZXZlcnkgcHJldmlvdXMgdmVyc2lvbiBvZiBPcGVuU1NMIGFuZCBTU0xlYXkgbWFkZSBubyBjaGVja3MgYXQgYWxsLgoKICAgICBUcnVzdCBjb2RlOiBjaGVja3MgdGhlIHJvb3QgQ0EgZm9yIHRoZSByZWxldmFudCB0cnVzdCBzZXR0aW5ncy4gVHJ1c3QKICAgICBzZXR0aW5ncyBoYXZlIGFuIGluaXRpYWwgdmFsdWUgY29uc2lzdGVudCB3aXRoIHRoZSB2ZXJpZnkgcHVycG9zZTogZS5nLgogICAgIGlmIHRoZSB2ZXJpZnkgcHVycG9zZSBpcyBmb3IgU1NMIGNsaWVudCB1c2UgaXQgZXhwZWN0cyB0aGUgQ0EgdG8gYmUKICAgICB0cnVzdGVkIGZvciBTU0wgY2xpZW50IHVzZS4gSG93ZXZlciB0aGUgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgY2hhbmdlZCB0bwogICAgIHBlcm1pdCBjdXN0b20gdHJ1c3Qgc2V0dGluZ3M6IG9uZSBleGFtcGxlIG9mIHRoaXMgd291bGQgYmUgdG8gb25seSB0cnVzdAogICAgIGNlcnRpZmljYXRlcyBmcm9tIGEgc3BlY2lmaWMgInNlY3VyZSIgc2V0IG9mIENBcy4KCiAgICAgQWxzbyBhZGRlZCBYNTA5X1NUT1JFX0NUWF9uZXcoKSBhbmQgWDUwOV9TVE9SRV9DVFhfZnJlZSgpIGZ1bmN0aW9ucwogICAgIHdoaWNoIHNob3VsZCBiZSB1c2VkIGZvciB2ZXJzaW9uIHBvcnRhYmlsaXR5OiBlc3BlY2lhbGx5IHNpbmNlIHRoZQogICAgIHZlcmlmeSBzdHJ1Y3R1cmUgaXMgbGlrZWx5IHRvIGNoYW5nZSBtb3JlIG9mdGVuIG5vdy4KCiAgICAgU1NMIGludGVncmF0aW9uLiBBZGQgcHVycG9zZSBhbmQgdHJ1c3QgdG8gU1NMX0NUWCBhbmQgU1NMIGFuZCBmdW5jdGlvbnMKICAgICB0byBzZXQgdGhlbS4gSWYgbm90IHNldCB0aGVuIGFzc3VtZSBTU0wgY2xpZW50cyB3aWxsIHZlcmlmeSBTU0wgc2VydmVycwogICAgIGFuZCB2aWNlIHZlcnNhLgoKICAgICBUd28gbmV3IG9wdGlvbnMgdG8gdGhlIHZlcmlmeSBwcm9ncmFtOiAtdW50cnVzdGVkIGFsbG93cyBhIHNldCBvZgogICAgIHVudHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgdG8gYmUgcGFzc2VkIGluIGFuZCAtcHVycG9zZSB3aGljaCBzZXRzIHRoZQogICAgIGludGVuZGVkIHB1cnBvc2Ugb2YgdGhlIGNlcnRpZmljYXRlLiBJZiBhIHB1cnBvc2UgaXMgc2V0IHRoZW4gdGhlCiAgICAgbmV3IGNoYWluIHZlcmlmeSBjb2RlIGlzIHVzZWQgdG8gY2hlY2sgZXh0ZW5zaW9uIGNvbnNpc3RlbmN5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIHRoZSBhdXRob3JpdHkgaW5mb3JtYXRpb24gYWNjZXNzIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgUlNBIGFuZCBEU0EgUEVNIHJlYWQgcm91dGluZXMgdG8gdHJhbnNwYXJlbnRseSBoYW5kbGUKICAgICBQS0NTIzggZm9ybWF0IHByaXZhdGUga2V5cy4gTmV3ICpfUFVCS0VZXyogZnVuY3Rpb25zIHRoYXQgaGFuZGxlCiAgICAgcHVibGljIGtleXMgaW4gYSBmb3JtYXQgY29tcGF0aWJsZSB3aXRoIGNlcnRpZmljYXRlCiAgICAgU3ViamVjdFB1YmxpY0tleUluZm8gc3RydWN0dXJlcy4gVW5mb3J0dW5hdGVseSB0aGVyZSB3ZXJlIGFscmVhZHkKICAgICBmdW5jdGlvbnMgY2FsbGVkICpfUHVibGljS2V5Xyogd2hpY2ggdXNlZCB2YXJpb3VzIG9kZCBmb3JtYXRzIHNvCiAgICAgdGhlc2UgYXJlIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5OiBob3dldmVyIHRoZSBEU0EgdmFyaWFudHMgd2VyZQogICAgIG5ldmVyIGluIGEgcHVibGljIHJlbGVhc2Ugc28gdGhleSBoYXZlIGJlZW4gZGVsZXRlZC4gQ2hhbmdlZCBkc2EvcnNhCiAgICAgdXRpbGl0aWVzIHRvIGhhbmRsZSB0aGUgbmV3IGZvcm1hdDogbm90ZSBubyByZWxlYXNlcyBldmVyIGhhbmRsZWQgcHVibGljCiAgICAga2V5cyBzbyB3ZSBzaG91bGQgYmUgT0suCgogICAgIFRoZSBwcmltYXJ5IG1vdGl2YXRpb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRvIGF2b2lkIHRoZSBzYW1lIGZpYXNjbwogICAgIHRoYXQgZG9ncyBwcml2YXRlIGtleXM6IHRoZXJlIGFyZSBzZXZlcmFsIGluY29tcGF0aWJsZSBwcml2YXRlIGtleQogICAgIGZvcm1hdHMgc29tZSBvZiB3aGljaCBhcmUgc3RhbmRhcmQgYW5kIHNvbWUgT3BlblNTTCBzcGVjaWZpYyBhbmQKICAgICByZXF1aXJlIHZhcmlvdXMgZXZpbCBoYWNrcyB0byBhbGxvdyBwYXJ0aWFsIHRyYW5zcGFyZW50IGhhbmRsaW5nIGFuZAogICAgIGV2ZW4gdGhlbiBpdCBkb2Vzbid0IHdvcmsgd2l0aCBERVIgZm9ybWF0cy4gR2l2ZW4gdGhlIG9wdGlvbiBhbnl0aGluZwogICAgIG90aGVyIHRoYW4gUEtDUyM4IHNob3VsZCBiZSBkdW1wZWQ6IGJ1dCB0aGUgb3RoZXIgZm9ybWF0cyBoYXZlIHRvCiAgICAgc3RheSBpbiB0aGUgbmFtZSBvZiBjb21wYXRpYmlsaXR5LgoKICAgICBXaXRoIHB1YmxpYyBrZXlzIGFuZCB0aGUgYmVuZWZpdCBvZiBoaW5kc2lnaHQgb25lIHN0YW5kYXJkIGZvcm1hdCAKICAgICBpcyB1c2VkIHdoaWNoIHdvcmtzIHdpdGggRVZQX1BLRVksIFJTQSBvciBEU0Egc3RydWN0dXJlczogdGhvdWdoCiAgICAgaXQgY2xlYXJseSByZXR1cm5zIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gcmVhZCB0aGUgd3Jvbmcga2luZCBvZiBrZXkuCgogICAgIEFkZGVkIGEgLXB1YmtleSBvcHRpb24gdG8gdGhlICd4NTA5JyB1dGlsaXR5IHRvIG91dHB1dCB0aGUgcHVibGljIGtleS4KICAgICBBbHNvIHJlbmFtZSB0aGUgRVZQX1BLRVlfZ2V0XyooKSB0byBFVlBfUEtFWV9yZ2V0XyooKQogICAgIChyZW5hbWVkIHRvIEVWUF9QS0VZX2dldDFfKigpIGluIHRoZSBPcGVuU1NMIDAuOS41IHJlbGVhc2UpIGFuZCBhZGQKICAgICBFVlBfUEtFWV9yc2V0XyooKSBmdW5jdGlvbnMgKHJlbmFtZWQgdG8gRVZQX1BLRVlfc2V0MV8qKCkpCiAgICAgdGhhdCBkbyB0aGUgc2FtZSBhcyB0aGUgRVZQX1BLRVlfYXNzaWduXyooKSBleGNlcHQgdGhleSB1cCB0aGUKICAgICByZWZlcmVuY2UgY291bnQgb2YgdGhlIGFkZGVkIGtleSAodGhleSBkb24ndCAic3dhbGxvdyIgdGhlCiAgICAgc3VwcGxpZWQga2V5KS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBjcnlwdG8veDUwOS9ieV9maWxlLmMgdGhlIGNvZGUgdG8gcmVhZCBpbiBjZXJ0aWZpY2F0ZXMgYW5kCiAgICAgQ1JMcyB3b3VsZCBmYWlsIGlmIHRoZSBmaWxlIGNvbnRhaW5lZCBubyBjZXJ0aWZpY2F0ZXMgb3Igbm8gQ1JMczoKICAgICBhZGRlZCBhIG5ldyBmdW5jdGlvbiB0byByZWFkIGluIGJvdGggdHlwZXMgYW5kIHJldHVybiB0aGUgbnVtYmVyCiAgICAgcmVhZDogdGhpcyBtZWFucyB0aGF0IGlmIG5vbmUgYXJlIHJlYWQgaXQgd2lsbCBiZSBhbiBlcnJvci4gVGhlCiAgICAgREVSIHZlcnNpb25zIG9mIHRoZSBjZXJ0aWZpY2F0ZSBhbmQgQ1JMIHJlYWRlciB3b3VsZCBhbHdheXMgZmFpbAogICAgIGJlY2F1c2UgaXQgaXNuJ3QgcG9zc2libGUgdG8gbWl4IGNlcnRpZmljYXRlcyBhbmQgQ1JMcyBpbiBERVIgZm9ybWF0CiAgICAgd2l0aG91dCBjaG9raW5nIG9uZSBvciB0aGUgb3RoZXIgcm91dGluZS4gQ2hhbmdlZCB0aGlzIHRvIGp1c3QgcmVhZAogICAgIGEgY2VydGlmaWNhdGU6IHRoaXMgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvLiBBbHNvIG1vZGlmaWVkIHRoZSBjb2RlCiAgICAgaW4gYXBwcy92ZXJpZnkuYyB0byB0YWtlIG5vdGljZSBvZiByZXR1cm4gY29kZXM6IGl0IHdhcyBwcmV2aW91c2x5CiAgICAgYXR0ZW1wdGluZyB0byByZWFkIGluIGNlcnRpZmljYXRlcyBmcm9tIE5VTEwgcG9pbnRlcnMgYW5kIGlnbm9yaW5nCiAgICAgYW55IGVycm9yczogdGhpcyBpcyBvbmUgcmVhc29uIHdoeSB0aGUgY2VydCBhbmQgQ1JMIHJlYWRlciBzZWVtZWQKICAgICB0byB3b3JrLiBJdCBkb2Vzbid0IGNoZWNrIHJldHVybiBjb2RlcyBmcm9tIHRoZSBkZWZhdWx0IGNlcnRpZmljYXRlCiAgICAgcm91dGluZXM6IHRoZXNlIG1heSB3ZWxsIGZhaWwgaWYgdGhlIGNlcnRpZmljYXRlcyBhcmVuJ3QgaW5zdGFsbGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvZGUgdG8gc3VwcG9ydCBvdGhlck5hbWUgb3B0aW9uIGluIEdlbmVyYWxOYW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpcnN0IHVwZGF0ZSB0byB2ZXJpZnkgY29kZS4gQ2hhbmdlIHRoZSB2ZXJpZnkgdXRpbGl0eQogICAgIHNvIGl0IHdhcm5zIGlmIGl0IGlzIHBhc3NlZCBhIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlOgogICAgIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBub3JtYWwgYmVoYXZpb3VyLiBYNTA5X3ZlcmlmeQogICAgIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGl0IHdpbGwgbm93IHZlcmlmeSBhIHNlbGYgc2lnbmVkCiAgICAgY2VydGlmaWNhdGUgaWYgKmV4YWN0bHkqIHRoZSBzYW1lIGNlcnRpZmljYXRlIGFwcGVhcnMKICAgICBpbiB0aGUgc3RvcmU6IGl0IHdhcyBwcmV2aW91c2x5IGltcG9zc2libGUgdG8gdHJ1c3QgYQogICAgIHNpbmdsZSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZS4gVGhpcyBtZWFucyB0aGF0OgogICAgIG9wZW5zc2wgdmVyaWZ5IHNzLnBlbQogICAgIG5vdyBnaXZlcyBhIHdhcm5pbmcgYWJvdXQgYSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSBidXQKICAgICBvcGVuc3NsIHZlcmlmeSAtQ0FmaWxlIHNzLnBlbSBzcy5wZW0KICAgICBpcyBPSy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGb3Igc2VydmVycywgc3RvcmUgdmVyaWZ5X3Jlc3VsdCBpbiBTU0xfU0VTU0lPTiBkYXRhIHN0cnVjdHVyZQogICAgIChhbmQgYWRkIGl0IHRvIGV4dGVybmFsIHNlc3Npb24gcmVwcmVzZW50YXRpb24pLgogICAgIFRoaXMgaXMgbmVlZGVkIHdoZW4gY2xpZW50IGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbnMgZmFpbHMsCiAgICAgYnV0IGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIHZlcmlmaWNhdGlvbiBjYWxsYmFjayAoc2V0IGJ5CiAgICAgU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2FsbGJhY2spIGFsbG93cyBhY2NlcHRpbmcgdGhlIHNlc3Npb24KICAgICBhbnl3YXkgKGkuZS4gbGVhdmVzIHg1MDlfc3RvcmVfY3R4LT5lcnJvciAhPSBYNTA5X1ZfT0sKICAgICBidXQgcmV0dXJucyAxKTogV2hlbiB0aGUgc2Vzc2lvbiBpcyByZXVzZWQsIHdlIGhhdmUgdG8gc2V0CiAgICAgc3NsLT52ZXJpZnlfcmVzdWx0IHRvIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIHRvIGF2b2lkCiAgICAgc2VjdXJpdHkgaG9sZXMuCiAgICAgW0JvZG8gTW9lbGxlciwgcHJvYmxlbSBwb2ludGVkIG91dCBieSBMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggYSBidWcgaW4gdGhlIG5ldyBQS0NTIzcgY29kZTogaXQgZGlkbid0IGNvbnNpZGVyIHRoZQogICAgIGNhc2UgaW4gUEtDUzdfZGF0YUluaXQoKSB3aGVyZSB0aGUgc2lnbmVkIFBLQ1M3IHN0cnVjdHVyZQogICAgIGRpZG4ndCBjb250YWluIGFueSBleGlzdGluZyBkYXRhIGJlY2F1c2UgaXQgd2FzIGJlaW5nIGNyZWF0ZWQuCiAgICAgW1BvLUNoZW5nIENoZW4gPHBvY2hlbmdAbnN0LmNvbS50dz4sIHNsaWdodGx5IG1vZGlmaWVkIGJ5IFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgc2FsdCB0byB0aGUga2V5IGRlcml2YXRpb24gcm91dGluZXMgaW4gZW5jLmMuIFRoaXMKICAgICBmb3JtcyB0aGUgZmlyc3QgOCBieXRlcyBvZiB0aGUgZW5jcnlwdGVkIGZpbGUuIEFsc28gYWRkIGEKICAgICAtUyBvcHRpb24gdG8gYWxsb3cgYSBzYWx0IHRvIGJlIGlucHV0IG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfY21wKCkuIE9kZGx5IGVub3VnaCB0aGVyZSB3YXNuJ3QgYSBmdW5jdGlvbgogICAgIHRvIGNvbXBhcmUgdHdvIGNlcnRpZmljYXRlcy4gV2UgZG8gdGhpcyBieSB3b3JraW5nIG91dCB0aGUgU0hBMQogICAgIGhhc2ggYW5kIGNvbXBhcmluZyB0aGF0LiBYNTA5X2NtcCgpIHdpbGwgYmUgbmVlZGVkIGJ5IHRoZSB0cnVzdAogICAgIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU1NMX2dldDFfc2Vzc2lvbigpIGlzIGxpa2UgU1NMX2dldF9zZXNzaW9uKCksIGJ1dCBpbmNyZW1lbnRzCiAgICAgdGhlIHJlZmVyZW5jZSBjb3VudCBpbiB0aGUgU1NMX1NFU1NJT04gcmV0dXJuZWQuCiAgICAgW0dlb2ZmIFRob3JwZSA8Z2VvZmZAZXUuYzIubmV0Pl0KCiAgKikgRml4IGZvciAncmVxJzogaXQgd2FzIGFkZGluZyBhIG51bGwgdG8gcmVxdWVzdCBhdHRyaWJ1dGVzLgogICAgIEFsc28gY2hhbmdlIHRoZSBYNTA5X0xPT0tVUCBhbmQgWDUwOV9JTkZPIGNvZGUgdG8gaGFuZGxlCiAgICAgY2VydGlmaWNhdGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciA0MCBhbmQgNjQgYml0IFJDMiBhbmQgUkM0IGFsZ29yaXRobXM6IGRvY3VtZW50CiAgICAgdGhlICdlbmMnIGNvbW1hbmQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBhZGQgZXh0cmEgaW5mb3JtYXRpb24gdG8gdGhlIG1lbW9yeSBsZWFrCiAgICAgZGV0ZWN0aW5nIG91dHB1dCwgdG8gZm9ybSB0cmFjZWJhY2tzLCBzaG93aW5nIGZyb20gd2hlcmUgZWFjaAogICAgIGFsbG9jYXRpb24gd2FzIG9yaWdpbmF0ZWQ6IENSWVBUT19wdXNoX2luZm8oImNvbnN0YW50IHN0cmluZyIpIGFkZHMKICAgICB0aGUgc3RyaW5nIHBsdXMgY3VycmVudCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIHRvIGEgcGVyLXRocmVhZAogICAgIHN0YWNrLCBDUllQVE9fcG9wX2luZm8oKSBkb2VzIHRoZSBvYnZpb3VzLCBDUllQVE9fcmVtb3ZlX2FsbF9pbmZvKCkKICAgICBpcyBsaWtlIGNhbGxpbmcgQ1lSUFRPX3BvcF9pbmZvKCkgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5LgogICAgIEFsc28gdXBkYXRlZCBtZW1vcnkgbGVhayBkZXRlY3Rpb24gY29kZSB0byBiZSBtdWx0aS10aHJlYWQtc2FmZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgb3B0aW9ucyAtdGV4dCBhbmQgLW5vb3V0IHRvIHBrY3M3IHV0aWxpdHkgYW5kIGRlbGV0ZSB0aGUKICAgICBlbmNyeXB0aW9uIG9wdGlvbnMgd2hpY2ggbmV2ZXIgZGlkIGFueXRoaW5nLiBVcGRhdGUgZG9jcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgb3B0aW9ucyB0byBzb21lIG9mIHRoZSB1dGlsaXRpZXMgdG8gYWxsb3cgdGhlIHBhc3MgcGhyYXNlCiAgICAgdG8gYmUgaW5jbHVkZWQgb24gZWl0aGVyIHRoZSBjb21tYW5kIGxpbmUgKG5vdCByZWNvbW1lbmRlZCBvbgogICAgIE9TZXMgbGlrZSBVbml4KSBvciByZWFkIGZyb20gdGhlIGVudmlyb25tZW50LiBVcGRhdGUgdGhlCiAgICAgbWFucGFnZXMgYW5kIGZpeCBhIGZldyBidWdzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGZldyBtYW5wYWdlcyBmb3Igc29tZSBvZiB0aGUgb3BlbnNzbCBjb21tYW5kcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlIC1yZXZva2Ugb3B0aW9uIGluIGNhLiBJdCB3YXMgZnJlZWluZyB1cCBtZW1vcnkgdHdpY2UsCiAgICAgbGVha2luZyBhbmQgbm90IGZpbmRpbmcgYWxyZWFkeSByZXZva2VkIGNlcnRpZmljYXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbnNpdmUgY2hhbmdlcyB0byBzdXBwb3J0IGNlcnRpZmljYXRlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbi4KICAgICBUaGlzIGludm9sdmVzIHRoZSB1c2Ugb2YgWDUwOV9DRVJUX0FVWCBzdHJ1Y3R1cmUgYW5kIFg1MDlfQVVYCiAgICAgZnVuY3Rpb25zLiBBbiBYNTA5X0FVWCBmdW5jdGlvbiBzdWNoIGFzIFBFTV9yZWFkX1g1MDlfQVVYKCkKICAgICBjYW4gc3RpbGwgcmVhZCBpbiBhIGNlcnRpZmljYXRlIGZpbGUgaW4gdGhlIHVzdWFsIHdheSBidXQgaXQKICAgICB3aWxsIGFsc28gcmVhZCBpbiBhbnkgYWRkaXRpb25hbCAiYXV4aWxpYXJ5IGluZm9ybWF0aW9uIi4gQnkKICAgICBkb2luZyB0aGluZ3MgdGhpcyB3YXkgYSBmYWlyIGRlZ3JlZSBvZiBjb21wYXRpYmlsaXR5IGNhbiBiZQogICAgIHJldGFpbmVkOiBleGlzdGluZyBjZXJ0aWZpY2F0ZXMgY2FuIGhhdmUgdGhpcyBpbmZvcm1hdGlvbiBhZGRlZAogICAgIHVzaW5nIHRoZSBuZXcgJ3g1MDknIG9wdGlvbnMuIAoKICAgICBDdXJyZW50IGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBhbiAiYWxpYXMiIGFuZCBzb21lIHRydXN0CiAgICAgc2V0dGluZ3MuIFRoZSB0cnVzdCBzZXR0aW5ncyB3aWxsIHVsdGltYXRlbHkgYmUgdXNlZCBpbiBlbmhhbmNlZAogICAgIGNlcnRpZmljYXRlIGNoYWluIHZlcmlmaWNhdGlvbiByb3V0aW5lczogY3VycmVudGx5IGEgY2VydGlmaWNhdGUKICAgICBjYW4gb25seSBiZSB0cnVzdGVkIGlmIGl0IGlzIHNlbGYgc2lnbmVkIGFuZCB0aGVuIGl0IGlzIHRydXN0ZWQKICAgICBmb3IgYWxsIHB1cnBvc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBhc3NlbWJsZXIgZm9yIEFscGhhICh0ZXN0ZWQgb25seSBvbiBERUMgT1NGIG5vdCBMaW51eCBvciAqQlNEKS4KICAgICBUaGUgcHJvYmxlbSB3YXMgdGhhdCBvbmUgb2YgdGhlIHJlcGxhY2VtZW50IHJvdXRpbmVzIGhhZCBub3QgYmVlbiB3b3JraW5nCiAgICAgc2luY2UgU1NMZWF5IHJlbGVhc2VzLiAgRm9yIG5vdyB0aGUgb2ZmZW5kaW5nIHJvdXRpbmUgaGFzIGJlZW4gcmVwbGFjZWQKICAgICB3aXRoIG5vbi1vcHRpbWlzZWQgYXNzZW1ibGVyLiAgRXZlbiBzbywgdGhpcyBub3cgZ2l2ZXMgYXJvdW5kIDk1JQogICAgIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGZvciAxMDI0IGJpdCBSU0Egc2lnbnMuCiAgICAgW01hcmsgQ294XQoKICAqKSBIYWNrIHRvIGZpeCBQS0NTIzcgZGVjcnlwdGlvbiB3aGVuIHVzZWQgd2l0aCBzb21lIHVub3J0aG9kb3ggUkMyIAogICAgIGhhbmRsaW5nLiBNb3N0IGNsaWVudHMgaGF2ZSB0aGUgZWZmZWN0aXZlIGtleSBzaXplIGluIGJpdHMgZXF1YWwgdG8KICAgICB0aGUga2V5IGxlbmd0aCBpbiBiaXRzOiBzbyBhIDQwIGJpdCBSQzIga2V5IHVzZXMgYSA0MCBiaXQgKDUgYnl0ZSkga2V5LgogICAgIEEgZmV3IGhvd2V2ZXIgZG9uJ3QgZG8gdGhpcyBhbmQgaW5zdGVhZCB1c2UgdGhlIHNpemUgb2YgdGhlIGRlY3J5cHRlZCBrZXkKICAgICB0byBkZXRlcm1pbmUgdGhlIFJDMiBrZXkgbGVuZ3RoIGFuZCB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciB0byBkZXRlcm1pbmUKICAgICB0aGUgZWZmZWN0aXZlIGtleSBsZW5ndGguIEluIHRoaXMgY2FzZSB0aGUgZWZmZWN0aXZlIGtleSBsZW5ndGggY2FuIHN0aWxsCiAgICAgYmUgNDAgYml0cyBidXQgdGhlIGtleSBsZW5ndGggY2FuIGJlIDE2OCBiaXRzIGZvciBleGFtcGxlLiBUaGlzIGlzIGZpeGVkCiAgICAgYnkgbWFudWFsbHkgZm9yY2luZyBhbiBSQzIga2V5IGludG8gdGhlIEVWUF9QS0VZIHN0cnVjdHVyZSBiZWNhdXNlIHRoZQogICAgIEVWUCBjb2RlIGNhbid0IGN1cnJlbnRseSBoYW5kbGUgdW51c3VhbCBSQzIga2V5IHNpemVzOiBpdCBhbHdheXMgYXNzdW1lcwogICAgIHRoZSBrZXkgbGVuZ3RoIGFuZCBlZmZlY3RpdmUga2V5IGxlbmd0aCBhcmUgZXF1YWwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgYnVuY2ggb2YgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIHNpbXBsaWZ5IHRoZSBjcmVhdGlvbiBvZiAKICAgICBYNTA5X05BTUUgc3RydWN0dXJlcy4gTm93IHlvdSBzaG91bGQgYmUgYWJsZSB0byBkbzoKICAgICBYNTA5X05BTUVfYWRkX2VudHJ5X2J5X3R4dChubSwgIkNOIiwgTUJTVFJJTkdfQVNDLCAiU3RldmUiLCAtMSwgLTEsIDApOwogICAgIGFuZCBoYXZlIGl0IGF1dG9tYXRpY2FsbHkgd29yayBvdXQgdGhlIGNvcnJlY3QgZmllbGQgdHlwZSBhbmQgZmlsbCBpbgogICAgIHRoZSBzdHJ1Y3R1cmVzLiBUaGUgbW9yZSBhZHZlbnR1cm91cyBjYW4gdHJ5OgogICAgIFg1MDlfTkFNRV9hZGRfZW50cnlfYnlfdHh0KG5tLCBmaWVsZCwgTUJTVFJJTkdfVVRGOCwgc3RyLCAtMSwgLTEsIDApOwogICAgIGFuZCBpdCB3aWxsIChob3BlZnVsbHkpIHdvcmsgb3V0IHRoZSBjb3JyZWN0IG11bHRpYnl0ZSBlbmNvZGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlICdyZXEnIHV0aWxpdHkgdG8gdXNlIHRoZSBuZXcgZmllbGQgaGFuZGxpbmcgYW5kIG11bHRpYnl0ZQogICAgIGNvcHkgcm91dGluZXMuIEJlZm9yZSB0aGUgRE4gZmllbGQgY3JlYXRpb24gd2FzIGhhbmRsZWQgaW4gYW4gYWQgaG9jCiAgICAgd2F5IGluIHJlcSwgY2EsIGFuZCB4NTA5IHdoaWNoIHdhcyByYXRoZXIgYnJva2VuIGFuZCBkaWRuJ3Qgc3VwcG9ydAogICAgIEJNUFN0cmluZ3Mgb3IgVVRGOFN0cmluZ3MuIFNpbmNlIHNvbWUgc29mdHdhcmUgZG9lc24ndCBpbXBsZW1lbnQKICAgICBCTVBTdHJpbmdzIG9yIFVURjhTdHJpbmdzIHlldCwgdGhleSBjYW4gYmUgZW5hYmxlZCB1c2luZyB0aGUgY29uZmlnIGZpbGUKICAgICB1c2luZyB0aGUgZGlyc3RyaW5nX3R5cGUgb3B0aW9uLiBTZWUgdGhlIG5ldyBjb21tZW50IGluIHRoZSBkZWZhdWx0CiAgICAgb3BlbnNzbC5jbmYgZm9yIG1vcmUgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGNyeXB0by9yYW5kL21kX3JhbmQuYyBtb3JlIHJvYnVzdDoKICAgICAtIEFzc3VyZSB1bmlxdWUgcmFuZG9tIG51bWJlcnMgYWZ0ZXIgZm9yaygpLgogICAgIC0gTWFrZSBzdXJlIHRoYXQgY29uY3VycmVudCB0aHJlYWRzIGFjY2VzcyB0aGUgZ2xvYmFsIGNvdW50ZXIgYW5kCiAgICAgICBtZCBzZXJpYWxpemFibHkgc28gdGhhdCB3ZSBuZXZlciBsb3NlIGVudHJvcHkgaW4gdGhlbQogICAgICAgb3IgdXNlIGV4YWN0bHkgdGhlIHNhbWUgc3RhdGUgaW4gbXVsdGlwbGUgdGhyZWFkcy4KICAgICAgIEFjY2VzcyB0byB0aGUgbGFyZ2Ugc3RhdGUgaXMgbm90IGFsd2F5cyBzZXJpYWxpemFibGUgYmVjYXVzZQogICAgICAgdGhlIGFkZGl0aW9uYWwgbG9ja2luZyBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIGtpbGxlciwgYW5kCiAgICAgICBtZCBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIGFueXdheS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZmlsZSBhcHBzL2FwcF9yYW5kLmMgd2l0aCBjb21tb25seSBuZWVkZWQgZnVuY3Rpb25hbGl0eQogICAgIGZvciBoYW5kbGluZyB0aGUgcmFuZG9tIHNlZWQgZmlsZS4KCiAgICAgVXNlIHRoZSByYW5kb20gc2VlZCBmaWxlIGluIHNvbWUgYXBwbGljYXRpb25zIHRoYXQgcHJldmlvdXNseSBkaWQgbm90OgogICAgICAgICAgY2EsCiAgICAgICAgICBkc2FwYXJhbSAtZ2Vua2V5ICh3aGljaCBhbHNvIGlnbm9yZWQgaXRzICctcmFuZCcgb3B0aW9uKSwgCiAgICAgICAgICBzX2NsaWVudCwKICAgICAgICAgIHNfc2VydmVyLAogICAgICAgICAgeDUwOSAod2hlbiBzaWduaW5nKS4KICAgICBFeGNlcHQgb24gc3lzdGVtcyB3aXRoIC9kZXYvdXJhbmRvbSwgaXQgaXMgY3J1Y2lhbCB0byBoYXZlIGEgcmFuZG9tCiAgICAgc2VlZCBmaWxlIGF0IGxlYXN0IGZvciBrZXkgY3JlYXRpb24sIERTQSBzaWduaW5nLCBhbmQgZm9yIERIIGV4Y2hhbmdlczsKICAgICBmb3IgUlNBIHNpZ25hdHVyZXMgd2UgY291bGQgZG8gd2l0aG91dCBvbmUuCgogICAgIGdlbmRoIGFuZCBnZW5kc2EgKHVubGlrZSBnZW5yc2EpIHVzZWQgdG8gcmVhZCBvbmx5IHRoZSBmaXJzdCBieXRlCiAgICAgb2YgZWFjaCBmaWxlIGxpc3RlZCBpbiB0aGUgJy1yYW5kJyBvcHRpb24uICBUaGUgZnVuY3Rpb24gYXMgcHJldmlvdXNseQogICAgIGZvdW5kIGluIGdlbnJzYSBpcyBub3cgaW4gYXBwX3JhbmQuYyBhbmQgaXMgdXNlZCBieSBhbGwgcHJvZ3JhbXMKICAgICB0aGF0IHN1cHBvcnQgJy1yYW5kJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBSQU5EX3dyaXRlX2ZpbGUsIHVzZSBtb2RlIDA2MDAgZm9yIGNyZWF0aW5nIGZpbGVzOwogICAgIGRvbid0IGp1c3QgY2htb2Qgd2hlbiBpdCBtYXkgYmUgdG9vIGxhdGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVwb3J0IGFuIGVycm9yIGZyb20gWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucwogICAgIHdoZW4gWDUwOV9MT09LVVBfbG9hZF9maWxlIG9yIFg1MDlfTE9PS1VQX2FkZF9kaXIgZmFpbGVkLgogICAgIFtCaWxsIFBlcnJ5XQoKICAqKSBOZXcgZnVuY3Rpb24gQVNOMV9tYnN0cmluZ19jb3B5KCkgdGhpcyBjb3BpZXMgYSBzdHJpbmcgaW4gZWl0aGVyCiAgICAgQVNDSUksIFVuaWNvZGUsIFVuaXZlcnNhbCAoNCBieXRlcyBwZXIgY2hhcmFjdGVyKSBvciBVVEY4IGZvcm1hdAogICAgIGludG8gYW4gQVNOMV9TVFJJTkcgdHlwZS4gQSBtYXNrIG9mIHBlcm1pc3NpYmxlIHR5cGVzIGlzIHBhc3NlZAogICAgIGFuZCBpdCBjaG9vc2VzIHRoZSAibWluaW1hbCIgdHlwZSB0byB1c2Ugb3IgYW4gZXJyb3IgaWYgbm90IHR5cGUKICAgICBpcyBzdWl0YWJsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZnVuY3Rpb24gZXF1aXZhbGVudHMgdG8gdGhlIHZhcmlvdXMgbWFjcm9zIGluIGFzbjEuaC4gVGhlIG9sZAogICAgIG1hY3JvcyBhcmUgcmV0YWluZWQgd2l0aCBhbiBNXyBwcmVmaXguIENvZGUgaW5zaWRlIHRoZSBsaWJyYXJ5IGNhbgogICAgIHVzZSB0aGUgTV8gbWFjcm9zLiBFeHRlcm5hbCBjb2RlIChpbmNsdWRpbmcgdGhlIG9wZW5zc2wgdXRpbGl0eSkKICAgICBzaG91bGQgKk5PVCogaW4gb3JkZXIgdG8gYmUgInNoYXJlZCBsaWJyYXJ5IGZyaWVuZGx5Ii4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdmFyaW91cyBmdW5jdGlvbnMgdGhhdCBjYW4gY2hlY2sgYSBjZXJ0aWZpY2F0ZSdzIGV4dGVuc2lvbnMKICAgICB0byBzZWUgaWYgaXQgdXNhYmxlIGZvciB2YXJpb3VzIHB1cnBvc2VzIHN1Y2ggYXMgU1NMIGNsaWVudCwKICAgICBzZXJ2ZXIgb3IgUy9NSU1FIGFuZCBDQXMgb2YgdGhlc2UgdHlwZXMuIFRoaXMgaXMgY3VycmVudGx5IAogICAgIFZFUlkgRVhQRVJJTUVOVEFMIGJ1dCB3aWxsIHVsdGltYXRlbHkgYmUgdXNlZCBmb3IgY2VydGlmaWNhdGUgY2hhaW4KICAgICB2ZXJpZmljYXRpb24uIEFsc28gYWRkZWQgYSAtcHVycG9zZSBmbGFnIHRvIHg1MDkgdXRpbGl0eSB0bwogICAgIHByaW50IG91dCBhbGwgdGhlIHB1cnBvc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIENSWVBUT19FWF9EQVRBIHRvIFg1MDkgY2VydGlmaWNhdGUgc3RydWN0dXJlIGFuZCBhc3NvY2lhdGVkCiAgICAgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBYNTA5VjNfe1g1MDksQ1JMLFJFVk9LRUR9X2dldF9kMmkoKSBmdW5jdGlvbnMuIFRoZXNlIHdpbGwgc2VhcmNoCiAgICAgZm9yLCBvYnRhaW4gYW5kIGRlY29kZSBhbmQgZXh0ZW5zaW9uIGFuZCBvYnRhaW4gaXRzIGNyaXRpY2FsIGZsYWcuCiAgICAgVGhpcyBhbGxvd3MgYWxsIHRoZSBuZWNlc3NhcnkgZXh0ZW5zaW9uIGNvZGUgdG8gYmUgaGFuZGxlZCBpbiBhCiAgICAgc2luZ2xlIGZ1bmN0aW9uIGNhbGwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUkM0IHR1bmUtdXAgZmVhdHVyaW5nIDMwLTQwJSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvbiBtb3N0IFJJU0MKICAgICBwbGF0Zm9ybXMuIFNlZSBjcnlwdG8vcmM0L3JjNF9lbmMuYyBmb3IgZnVydGhlciBkZXRhaWxzLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBOZXcgLW5vb3V0IG9wdGlvbiB0byBhc24xcGFyc2UuIFRoaXMgY2F1c2VzIG5vIG91dHB1dCB0byBiZSBwcm9kdWNlZAogICAgIGl0cyBtYWluIHVzZSBpcyB3aGVuIGNvbWJpbmVkIHdpdGggLXN0cnBhcnNlIGFuZCAtb3V0IHRvIGV4dHJhY3QgZGF0YQogICAgIGZyb20gYSBmaWxlICh3aGljaCBtYXkgbm90IGJlIGluIEFTTi4xIGZvcm1hdCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGZvciBwa2NzMTIgcHJvZ3JhbS4gSXQgd2FzIGhhc2hpbmcgYW4gaW52YWxpZCBjZXJ0aWZpY2F0ZSBwb2ludGVyCiAgICAgd2hlbiBwcm9kdWNpbmcgdGhlIGxvY2FsIGtleSBpZC4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KCiAgKikgTmV3IG9wdGlvbiAtZGhwYXJhbSBpbiBzX3NlcnZlci4gVGhpcyBhbGxvd3MgYSBESCBwYXJhbWV0ZXIgZmlsZSB0byBiZQogICAgIHN0YXRlZCBleHBsaWNpdGx5LiBJZiBpdCBpcyBub3Qgc3RhdGVkIHRoZW4gaXQgdHJpZXMgdGhlIGZpcnN0IHNlcnZlcgogICAgIGNlcnRpZmljYXRlIGZpbGUuIFRoZSBwcmV2aW91cyBiZWhhdmlvdXIgaGFyZCBjb2RlZCB0aGUgZmlsZW5hbWUKICAgICAic2VydmVyLnBlbSIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIC1wdWJpbiBhbmQgLXB1Ym91dCBvcHRpb25zIHRvIHRoZSByc2EgYW5kIGRzYSBjb21tYW5kcy4gVGhlc2UgYWxsb3cKICAgICBhIHB1YmxpYyBrZXkgdG8gYmUgaW5wdXQgb3Igb3V0cHV0LiBGb3IgZXhhbXBsZToKICAgICBvcGVuc3NsIHJzYSAtaW4ga2V5LnBlbSAtcHVib3V0IC1vdXQgcHVia2V5LnBlbQogICAgIEFsc28gYWRkZWQgbmVjZXNzYXJ5IERTQSBwdWJsaWMga2V5IGZ1bmN0aW9ucyB0byBoYW5kbGUgdGhpcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggc28gUEtDUzdfZGF0YVZlcmlmeSgpIGRvZXNuJ3QgY3Jhc2ggaWYgbm8gY2VydGlmaWNhdGVzIGFyZSBjb250YWluZWQKICAgICBpbiB0aGUgbWVzc2FnZS4gVGhpcyB3YXMgaGFuZGxlZCBieSBhbGxvd2luZwogICAgIFg1MDlfZmluZF9ieV9pc3N1ZXJfYW5kX3NlcmlhbCgpIHRvIHRvbGVyYXRlIGEgTlVMTCBwYXNzZWQgdG8gaXQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgU2FtcG8gS2VsbG9tYWtpIDxzYW1wb0BtYWlsLm5ldXJvbmlvLnB0Pl0KCiAgKikgRml4IGZvciBidWcgaW4gZDJpX0FTTjFfYnl0ZXMoKTogb3RoZXIgQVNOMSBmdW5jdGlvbnMgYWRkIGFuIGV4dHJhIG51bGwKICAgICB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmdzIHdoZXJlYXMgdGhpcyBkaWRuJ3QuIFRoaXMgd291bGQgY2F1c2UgcHJvYmxlbXMKICAgICBpZiBzdHJpbmdzIHJlYWQgd2l0aCBkMmlfQVNOMV9ieXRlcygpIHdlcmUgbGF0ZXIgbW9kaWZpZWQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgRml4IGZvciBiYXNlNjQgZGVjb2RlIGJ1Zy4gV2hlbiBhIGJhc2U2NCBiaW8gcmVhZHMgb25seSBvbmUgbGluZSBvZgogICAgIGRhdGEgYW5kIGl0IGNvbnRhaW5zIEVPRiBpdCB3aWxsIGVuZCB1cCByZXR1cm5pbmcgYW4gZXJyb3IuIFRoaXMgaXMKICAgICBjYXVzZWQgYnkgaW5wdXQgNDYgYnl0ZXMgbG9uZy4gVGhlIGNhdXNlIGlzIGR1ZSB0byB0aGUgd2F5IGJhc2U2NAogICAgIEJJT3MgZmluZCB0aGUgc3RhcnQgb2YgYmFzZTY0IGVuY29kZWQgZGF0YS4gVGhleSBkbyB0aGlzIGJ5IHRyeWluZyBhCiAgICAgdHJpYWwgZGVjb2RlIG9uIGVhY2ggbGluZSB1bnRpbCB0aGV5IGZpbmQgb25lIHRoYXQgd29ya3MuIFdoZW4gdGhleQogICAgIGRvIGEgZmxhZyBpcyBzZXQgYW5kIGl0IHN0YXJ0cyBhZ2FpbiBrbm93aW5nIGl0IGNhbiBwYXNzIGFsbCB0aGUKICAgICBkYXRhIGRpcmVjdGx5IHRocm91Z2ggdGhlIGRlY29kZXIuIFVuZm9ydHVuYXRlbHkgaXQgZG9lc24ndCByZXNldAogICAgIHRoZSBjb250ZXh0IGl0IHVzZXMuIFRoaXMgbWVhbnMgdGhhdCBpZiBFT0YgaXMgcmVhY2hlZCBhbiBhdHRlbXB0CiAgICAgaXMgbWFkZSB0byBwYXNzIHR3byBFT0ZzIHRocm91Z2ggdGhlIGNvbnRleHQgYW5kIHRoaXMgY2F1c2VzIHRoZQogICAgIHJlc3VsdGluZyBlcnJvci4gVGhpcyBjYW4gYWxzbyBjYXVzZSBvdGhlciBwcm9ibGVtcyBhcyB3ZWxsLiBBcyBpcwogICAgIHVzdWFsIHdpdGggdGhlc2UgcHJvYmxlbXMgaXQgdGFrZXMgKmFnZXMqIHRvIGZpbmQgYW5kIHRoZSBmaXggaXMKICAgICB0cml2aWFsOiBtb3ZlIG9uZSBsaW5lLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IGlhbkB1bnMubnMuYWMueXUgKEl2YW4gTmVqZ2ViYXVlcikgXQoKICAqKSBVZ2x5IHdvcmthcm91bmQgdG8gZ2V0IHNfY2xpZW50IGFuZCBzX3NlcnZlciB3b3JraW5nIHVuZGVyIFdpbmRvd3MuIFRoZQogICAgIG9sZCBjb2RlIHdvdWxkbid0IHdvcmsgYmVjYXVzZSBpdCBuZWVkZWQgdG8gc2VsZWN0KCkgb24gc29ja2V0cyBhbmQgdGhlCiAgICAgdHR5IChmb3Iga2V5cHJlc3NlcyBhbmQgdG8gc2VlIGlmIGRhdGEgY291bGQgYmUgd3JpdHRlbikuIFdpbjMyIG9ubHkKICAgICBzdXBwb3J0cyBzZWxlY3QoKSBvbiBzb2NrZXRzIHNvIHdlIHNlbGVjdCgpIHdpdGggYSAxcyB0aW1lb3V0IG9uIHRoZQogICAgIHNvY2tldHMgYW5kIHRoZW4gc2VlIGlmIGFueSBjaGFyYWN0ZXJzIGFyZSB3YWl0aW5nIHRvIGJlIHJlYWQsIGlmIG5vbmUKICAgICBhcmUgcHJlc2VudCB0aGVuIHdlIHJldHJ5LCB3ZSBhbHNvIGFzc3VtZSB3ZSBjYW4gYWx3YXlzIHdyaXRlIGRhdGEgdG8KICAgICB0aGUgdHR5LiBUaGlzIGlzbid0IG5pY2UgYmVjYXVzZSB0aGUgY29kZSB0aGVuIGJsb2NrcyB1bnRpbCB3ZSd2ZQogICAgIHJlY2VpdmVkIGEgY29tcGxldGUgbGluZSBvZiBkYXRhIGFuZCBpdCBpcyBlZmZlY3RpdmVseSBwb2xsaW5nIHRoZQogICAgIGtleWJvYXJkIGF0IDFzIGludGVydmFsczogaG93ZXZlciBpdCdzIHF1aXRlIGEgYml0IGJldHRlciB0aGFuIG5vdAogICAgIHdvcmtpbmcgYXQgYWxsIDotKSBBIGRlZGljYXRlZCBXaW5kb3dzIGFwcGxpY2F0aW9uIG1pZ2h0IGhhbmRsZSB0aGlzCiAgICAgd2l0aCBhbiBldmVudCBsb29wIGZvciBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgUlNBX01FVEhPRCBzdHJ1Y3R1cmUuIE5vdyB0aGVyZSBhcmUgdHdvIGV4dHJhIG1ldGhvZHMsIHJzYV9zaWduCiAgICAgYW5kIHJzYV92ZXJpZnkuIFdoZW4gdGhlIFJTQV9GTEFHU19TSUdOX1ZFUiBvcHRpb24gaXMgc2V0IHRoZXNlIGZ1bmN0aW9ucwogICAgIHdpbGwgYmUgY2FsbGVkIHdoZW4gUlNBX3NpZ24oKSBhbmQgUlNBX3ZlcmlmeSgpIGFyZSB1c2VkLiBUaGlzIGlzIHVzZWZ1bAogICAgIGlmIHJzYV9wdWJfZGVjKCkgYW5kIHJzYV9wcml2X2VuYygpIGVxdWl2YWxlbnRzIGFyZSBub3QgYXZhaWxhYmxlLgogICAgIEZvciB0aGlzIHRvIHdvcmsgcHJvcGVybHkgUlNBX3B1YmxpY19kZWNyeXB0KCkgYW5kIFJTQV9wcml2YXRlX2VuY3J5cHQoKQogICAgIHNob3VsZCAqbm90KiBiZSB1c2VkOiBSU0Ffc2lnbigpIGFuZCBSU0FfdmVyaWZ5KCkgbXVzdCBiZSB1c2VkIGluc3RlYWQuCiAgICAgVGhpcyBuZWNlc3NpdGF0ZWQgdGhlIHN1cHBvcnQgb2YgYW4gZXh0cmEgc2lnbmF0dXJlIHR5cGUgTklEX21kNV9zaGExCiAgICAgZm9yIFNTTCBzaWduYXR1cmVzIGFuZCBtb2RpZmljYXRpb25zIHRvIHRoZSBTU0wgbGlicmFyeSB0byB1c2UgaXQgaW5zdGVhZAogICAgIG9mIGNhbGxpbmcgUlNBX3B1YmxpY19kZWNyeXB0KCkgYW5kIFJTQV9wcml2YXRlX2VuY3J5cHQoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IC12ZXJpZnkgLUNBZmlsZSBhbmQgLUNBcGF0aCBvcHRpb25zIHRvIHRoZSBjcmwgcHJvZ3JhbSwgdGhlc2UKICAgICB3aWxsIGxvb2t1cCBhIENSTCBpc3N1ZXJzIGNlcnRpZmljYXRlIGFuZCB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBpbiBhCiAgICAgc2ltaWxhciB3YXkgdG8gdGhlIHZlcmlmeSBwcm9ncmFtLiBUaWR5IHVwIHRoZSBjcmwgcHJvZ3JhbSBzbyBpdAogICAgIG5vIGxvbmdlciBhY2Nlc3NlcyBzdHJ1Y3R1cmVzIGRpcmVjdGx5LiBNYWtlIHRoZSBBU04xIENSTCBwYXJzaW5nIGEgYml0CiAgICAgbGVzcyBzdHJpY3QuIEl0IHdpbGwgbm93IHBlcm1pdCBDUkwgZXh0ZW5zaW9ucyBldmVuIGlmIGl0IGlzIG5vdAogICAgIGEgVjIgQ1JMOiB0aGlzIHdpbGwgYWxsb3cgaXQgdG8gdG9sZXJhdGUgc29tZSBicm9rZW4gQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsaXplIGFsbCBub24tYXV0b21hdGljIHZhcmlhYmxlcyBlYWNoIHRpbWUgb25lIG9mIHRoZSBvcGVuc3NsCiAgICAgc3ViLXByb2dyYW1zIGlzIHN0YXJ0ZWQgKHRoaXMgaXMgbmVjZXNzYXJ5IGFzIHRoZXkgbWF5IGJlIHN0YXJ0ZWQKICAgICBtdWx0aXBsZSB0aW1lcyBmcm9tIHRoZSAiT3BlblNTTD4iIHByb21wdCkuCiAgICAgW0xlbm5hcnQgQmFuZywgQm9kbyBNb2VsbGVyXQoKICAqKSBQcmVsaW1pbmFyeSBjb21waWxhdGlvbiBvcHRpb24gUlNBX05VTEwgd2hpY2ggZGlzYWJsZXMgUlNBIGNyeXB0byB3aXRob3V0CiAgICAgcmVtb3ZpbmcgYWxsIG90aGVyIFJTQSBmdW5jdGlvbmFsaXR5ICh0aGlzIGlzIHdoYXQgTk9fUlNBIGRvZXMpLiBUaGlzCiAgICAgaXMgc28gKGZvciBleGFtcGxlKSB0aG9zZSBpbiB0aGUgVVMgY2FuIGRpc2FibGUgdGhvc2Ugb3BlcmF0aW9ucyBjb3ZlcmVkCiAgICAgYnkgdGhlIFJTQSBwYXRlbnQgd2hpbGUgYWxsb3dpbmcgc3RvcmFnZSBhbmQgcGFyc2luZyBvZiBSU0Ega2V5cyBhbmQgUlNBCiAgICAga2V5IGdlbmVyYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTm9uLWNvcHlpbmcgaW50ZXJmYWNlIHRvIEJJTyBwYWlycy4KICAgICAoc3RpbGwgbGFyZ2VseSB1bnRlc3RlZCkKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQU5TMV90YWcyc3RyKCkgdG8gY29udmVydCBhbiBBU04xIHRhZyB0byBhIGRlc2NyaXB0aXZlCiAgICAgQVNDSUkgc3RyaW5nLiBUaGlzIHdhcyBoYW5kbGVkIGluZGVwZW5kZW50bHkgaW4gdmFyaW91cyBwbGFjZXMgYmVmb3JlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgVVRGOF9nZXRjKCkgYW5kIFVURjhfcHV0YygpIHRoYXQgcGFyc2UgYW5kIGdlbmVyYXRlCiAgICAgVVRGOCBzdHJpbmdzIGEgY2hhcmFjdGVyIGF0IGEgdGltZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVc2UgY2xpZW50X3ZlcnNpb24gZnJvbSBjbGllbnQgaGVsbG8gdG8gc2VsZWN0IHRoZSBwcm90b2NvbAogICAgIChzMjNfc3J2ci5jKSBhbmQgZm9yIFJTQSBjbGllbnQga2V5IGV4Y2hhbmdlIHZlcmlmaWNhdGlvbgogICAgIChzM19zcnZyLmMpLCBhcyByZXF1aXJlZCBieSB0aGUgU1NMIDMuMC9UTFMgMS4wIHNwZWNpZmljYXRpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSBTUEtBQ3MsIHRoZXNlIHdlcmUgcHJldmlvdXNseQogICAgIGhhbmRsZWQgYnkgcG9raW5nIHJvdW5kIGluIHRoZSBzdHJ1Y3R1cmUgaW50ZXJuYWxzLiBBZGRlZCBuZXcgZnVuY3Rpb24KICAgICBORVRTQ0FQRV9TUEtJX3ByaW50KCkgdG8gcHJpbnQgb3V0IFNQS0FDIGFuZCBhIG5ldyB1dGlsaXR5ICdzcGthYycgdG8KICAgICBwcmludCwgdmVyaWZ5IGFuZCBnZW5lcmF0ZSBTUEtBQ3MuIEJhc2VkIG9uIGFuIG9yaWdpbmFsIGlkZWEgZnJvbQogICAgIE1hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+IGJ1dCBleHRlbnNpdmVseSBtb2RpZmllZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSSVBFTUQxNjAgaXMgb3BlcmF0aW9uYWwgb24gYWxsIHBsYXRmb3JtcyBhbmQgaXMgYmFjayBpbiAnbWFrZSB0ZXN0Jy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWxsb3cgdGhlIGNvbmZpZyBmaWxlIGV4dGVuc2lvbiBzZWN0aW9uIHRvIGJlIG92ZXJ3cml0dGVuIG9uIHRoZQogICAgIGNvbW1hbmQgbGluZS4gQmFzZWQgb24gYW4gb3JpZ2luYWwgaWRlYSBmcm9tIE1hc3NpbWlsaWFubyBQYWxhCiAgICAgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD4uIFRoZSBuZXcgb3B0aW9uIGlzIGNhbGxlZCAtZXh0ZW5zaW9ucwogICAgIGFuZCBjYW4gYmUgYXBwbGllZCB0byBjYSwgcmVxIGFuZCB4NTA5LiBBbHNvIC1yZXFleHRzIHRvIG92ZXJyaWRlCiAgICAgdGhlIHJlcXVlc3QgZXh0ZW5zaW9ucyBpbiByZXEgYW5kIC1jcmxleHRzIHRvIG92ZXJyaWRlIHRoZSBjcmwgZXh0ZW5zaW9ucwogICAgIGluIGNhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZmVhdHVyZSB0byB0aGUgU1BLQUMgaGFuZGxpbmcgaW4gY2EuICBOb3cgeW91IGNhbiBpbmNsdWRlCiAgICAgdGhlIHNhbWUgZmllbGQgbXVsdGlwbGUgdGltZXMgYnkgcHJlY2VkaW5nIGl0IGJ5ICJYWFhYLiIgZm9yIGV4YW1wbGU6CiAgICAgMS5PVT0iVW5pdCBuYW1lIDEiCiAgICAgMi5PVT0iVW5pdCBuYW1lIDIiCiAgICAgdGhpcyBpcyB0aGUgc2FtZSBzeW50YXggYXMgdXNlZCBpbiB0aGUgcmVxIGNvbmZpZyBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IGNlcnRpZmljYXRlIGV4dGVuc2lvbnMgdG8gYmUgYWRkZWQgdG8gY2VydGlmaWNhdGUgcmVxdWVzdHMuIFRoZXNlCiAgICAgYXJlIHNwZWNpZmllZCBpbiBhICdyZXFfZXh0ZW5zaW9ucycgb3B0aW9uIG9mIHRoZSByZXEgc2VjdGlvbiBvZiB0aGUKICAgICBjb25maWcgZmlsZS4gVGhleSBjYW4gYmUgcHJpbnRlZCBvdXQgd2l0aCB0aGUgLXRleHQgb3B0aW9uIHRvIHJlcSBidXQKICAgICBhcmUgb3RoZXJ3aXNlIGlnbm9yZWQgYXQgcHJlc2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYSBob3JyaWJsZSBidWcgaW4gZW5jX3JlYWQoKSBpbiBjcnlwdG8vZXZwL2Jpb19lbmMuYzogaWYgdGhlIGZpcnN0CiAgICAgZGF0YSByZWFkIGNvbnNpc3RzIG9mIG9ubHkgdGhlIGZpbmFsIGJsb2NrIGl0IHdvdWxkIG5vdCBkZWNyeXB0ZWQgYmVjYXVzZQogICAgIEVWUF9DaXBoZXJVcGRhdGUoKSB3b3VsZCBjb3JyZWN0bHkgcmVwb3J0IHplcm8gYnl0ZXMgaGFkIGJlZW4gZGVjcnlwdGVkLgogICAgIEEgbWlzcGxhY2VkICdicmVhaycgYWxzbyBtZWFudCB0aGUgZGVjcnlwdGVkIGZpbmFsIGJsb2NrIG1pZ2h0IG5vdCBiZQogICAgIGNvcGllZCB1bnRpbCB0aGUgbmV4dCByZWFkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgREhfTUVUSE9ELiBBZ2FpbiBiYXNlZCBvbiBSU0FfTUVUSE9ELiBBbHNvIGFkZGVkCiAgICAgYSBmZXcgZXh0cmEgcGFyYW1ldGVycyB0byB0aGUgREggc3RydWN0dXJlOiB0aGVzZSB3aWxsIGJlIHVzZWZ1bCBpZgogICAgIGZvciBleGFtcGxlIHdlIHdhbnQgdGhlIHZhbHVlIG9mICdxJyBvciBpbXBsZW1lbnQgWDkuNDIgREguCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBEU0FfTUVUSE9ELiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBSU0FfTUVUSE9EIGFuZAogICAgIHByb3ZpZGVzIGhvb2tzIHRoYXQgYWxsb3cgdGhlIGRlZmF1bHQgRFNBIGZ1bmN0aW9ucyBvciBmdW5jdGlvbnMgb24gYQogICAgICJwZXIga2V5IiBiYXNpcyB0byBiZSByZXBsYWNlZC4gVGhpcyBhbGxvd3MgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGFuZAogICAgIGhhcmR3YXJlIGtleSBzdG9yYWdlIHRvIGJlIGhhbmRsZWQgd2l0aG91dCBtYWpvciBtb2RpZmljYXRpb24gdG8gdGhlCiAgICAgbGlicmFyeS4gQWxzbyBhZGRlZCBsb3cgbGV2ZWwgbW9kZXhwIGhvb2tzIGFuZCBDUllQVE9fRVggc3RydWN0dXJlIGFuZCAKICAgICBhc3NvY2lhdGVkIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgZmxhZyB0byBtZW1vcnkgQklPcywgQklPX0ZMQUdfTUVNX1JET05MWS4gVGhpcyBtYXJrcyB0aGUgQklPCiAgICAgYXMgInJlYWQgb25seSI6IGl0IGNhbid0IGJlIHdyaXR0ZW4gdG8gYW5kIHRoZSBidWZmZXIgaXQgcG9pbnRzIHRvIHdpbGwKICAgICBub3QgYmUgZnJlZWQuIFJlYWRpbmcgZnJvbSBhIHJlYWQgb25seSBCSU8gaXMgbXVjaCBtb3JlIGVmZmljaWVudCB0aGFuCiAgICAgYSBub3JtYWwgbWVtb3J5IEJJTy4gVGhpcyB3YXMgYWRkZWQgYmVjYXVzZSB0aGVyZSBhcmUgc2V2ZXJhbCB0aW1lcyB3aGVuCiAgICAgYW4gYXJlYSBvZiBtZW1vcnkgbmVlZHMgdG8gYmUgcmVhZCBmcm9tIGEgQklPLiBUaGUgcHJldmlvdXMgbWV0aG9kIHdhcwogICAgIHRvIGNyZWF0ZSBhIG1lbW9yeSBCSU8gYW5kIHdyaXRlIHRoZSBkYXRhIHRvIGl0LCB0aGlzIHJlc3VsdHMgaW4gdHdvCiAgICAgY29waWVzIG9mIHRoZSBkYXRhIGFuZCBhbiBPKG5eMikgcmVhZGluZyBhbGdvcml0aG0uIFRoZXJlIGlzIGEgbmV3CiAgICAgZnVuY3Rpb24gQklPX25ld19tZW1fYnVmKCkgd2hpY2ggY3JlYXRlcyBhIHJlYWQgb25seSBtZW1vcnkgQklPIGZyb20KICAgICBhbiBhcmVhIG9mIG1lbW9yeS4gQWxzbyBtb2RpZmllZCB0aGUgUEtDUyM3IHJvdXRpbmVzIHRvIHVzZSByZWFkIG9ubHkKICAgICBtZW1vcnkgQklPcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCdWdmaXg6IHNzbDIzX2dldF9jbGllbnRfaGVsbG8gZGlkIG5vdCB3b3JrIHByb3Blcmx5IHdoZW4gY2FsbGVkIGluCiAgICAgc3RhdGUgU1NMMjNfU1RfU1JfQ0xOVF9IRUxMT19CLCBpLmUuIHdoZW4gdGhlIGZpcnN0IDcgYnl0ZXMgb2YKICAgICBhIFNTTHYyLWNvbXBhdGlibGUgY2xpZW50IGhlbGxvIGZvciBTU0x2MyBvciBUTFN2MSBjb3VsZCBiZSByZWFkLAogICAgIGJ1dCBhIHJldHJ5IGNvbmRpdGlvbiBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byByZWFkIHRoZSByZXN0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRoZSBQS0NTN19FTkNfQ09OVEVOVF9uZXcoKSBmdW5jdGlvbiB3YXMgc2V0dGluZyB0aGUgY29udGVudCB0eXBlIGFzCiAgICAgTklEX3BrY3M3X2VuY3J5cHRlZCBieSBkZWZhdWx0OiB0aGlzIHdhcyB3cm9uZyBzaW5jZSB0aGlzIHNob3VsZCBhbG1vc3QKICAgICBhbHdheXMgYmUgTklEX3BrY3M3X2RhdGEuIEFsc28gbW9kaWZpZWQgdGhlIFBLQ1M3X3NldF90eXBlKCkgdG8gaGFuZGxlCiAgICAgdGhlIGVuY3J5cHRlZCBkYXRhIHR5cGU6IHRoaXMgaXMgYSBtb3JlIHNlbnNpYmxlIHBsYWNlIHRvIHB1dCBpdCBhbmQgaXQKICAgICBhbGxvd3MgdGhlIFBLQ1MjMTIgY29kZSB0byBiZSB0aWRpZWQgdXAgdGhhdCBkdXBsaWNhdGVkIHRoaXMKICAgICBmdW5jdGlvbmFsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZWQgb2JqX2RhdC5wbCBzY3JpcHQgc28gaXQgdGFrZXMgaXRzIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgb24KICAgICB0aGUgY29tbWFuZCBsaW5lLiBUaGlzIHNob3VsZCBhdm9pZCBzaGVsbCBlc2NhcGUgcmVkaXJlY3Rpb24gcHJvYmxlbXMKICAgICB1bmRlciBXaW4zMi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIGNlcnRpZmljYXRlIGV4dGVuc2lvbiByZXF1ZXN0cywgdGhlc2UgYXJlIGluY2x1ZGVkCiAgICAgaW4gdGhpbmdzIGxpa2UgWGVucm9sbCBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4gSW5jbHVkZWQgZnVuY3Rpb25zIHRvIGFsbG93CiAgICAgZXh0ZW5zaW9ucyB0byBiZSBvYnRhaW5lZCBhbmQgYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgLWNybGYgb3B0aW9uIHRvIHNfY2xpZW50IGFuZCBzX3NlcnZlciBmb3Igc2VuZGluZyBuZXdsaW5lcyBhcwogICAgIENSTEYgKGFzIHJlcXVpcmVkIGJ5IG1hbnkgcHJvdG9jb2xzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuM2EgYW5kIDAuOS40ICBbMDkgQXVnIDE5OTldCiAgCiAgKikgSW5zdGFsbCBsaWJSU0FnbHVlLmEgd2hlbiBPcGVuU1NMIGlzIGJ1aWx0IHdpdGggUlNBcmVmLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBIGZldyBtb3JlIGBgI2lmbmRlZiBOT19GUF9BUEkgLyAjZW5kaWYnJyBwYWlycyBmb3IgY29uc2lzdGVuY3kuCiAgICAgW0FuZHJpamEgQW50b25pamV2aWMgPFRoZUFudG9ueTJAYmlnZm9vdC5jb20+XQoKICAqKSBGaXggLXN0YXJ0ZGF0ZSBhbmQgLWVuZGRhdGUgKHdoaWNoIHdhcyBtaXNzaW5nKSBhcmd1bWVudHMgdG8gJ2NhJwogICAgIHByb2dyYW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIERTQV9kdXBfREgsIHdoaWNoIGR1cGxpY2F0ZXMgRFNBIHBhcmFtZXRlcnMva2V5cyBhcwogICAgIERIIHBhcmFtZXRlcnMva2V5cyAocSBpcyBsb3N0IGR1cmluZyB0aGF0IGNvbnZlcnNpb24sIGJ1dCB0aGUgcmVzdWx0aW5nCiAgICAgREggcGFyYW1ldGVycyBjb250YWluIGl0cyBsZW5ndGgpLgoKICAgICBGb3IgMTAyNC1iaXQgcCwgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgZm9sbG93ZWQgYnkgRFNBX2R1cF9ESCBpcwogICAgIG11Y2ggZmFzdGVyIHRoYW4gREhfZ2VuZXJhdGVfcGFyYW1ldGVycyAod2hpY2ggY3JlYXRlcyBwYXJhbWV0ZXJzCiAgICAgd2hlcmUgcCA9IDIqcSArIDEpLCBhbmQgYWxzbyB0aGUgc21hbGxlciBxIG1ha2VzIERIIGNvbXB1dGF0aW9ucwogICAgIG11Y2ggbW9yZSBlZmZpY2llbnQgKDE2MC1iaXQgZXhwb25lbnRpYXRpb24gaW5zdGVhZCBvZiAxMDI0LWJpdAogICAgIGV4cG9uZW50aWF0aW9uKTsgc28gdGhpcyBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIHN1cHBvcnQgREhFCiAgICAgY2lwaGVyc3VpdGVzIGluIFNTTC9UTFMgc2VydmVycyAoc2VlIHNzbC9zc2x0ZXN0LmMpLiAgSXQgaXMgb2YKICAgICB1dHRlciBpbXBvcnRhbmNlIHRvIHVzZQogICAgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKHNfY3R4LCBTU0xfT1BfU0lOR0xFX0RIX1VTRSk7CiAgICAgb3IKICAgICAgICAgU1NMX3NldF9vcHRpb25zKHNfY3R4LCBTU0xfT1BfU0lOR0xFX0RIX1VTRSk7CiAgICAgd2hlbiBzdWNoIERIIHBhcmFtZXRlcnMgYXJlIHVzZWQsIGJlY2F1c2Ugb3RoZXJ3aXNlIHNtYWxsIHN1Ymdyb3VwCiAgICAgYXR0YWNrcyBtYXkgYmVjb21lIHBvc3NpYmxlIQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEF2b2lkIG1lbW9yeSBsZWFrIGluIGkyZF9ESHBhcmFtcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBbGxvdyB0aGUgLWsgb3B0aW9uIHRvIGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGVuYyBwcm9ncmFtOgogICAgIHRoaXMgYWxsb3dzIHRoZSBzYW1lIGVuY3J5cHRlZCBtZXNzYWdlIHRvIGJlIHJlYWQgYnkgbXVsdGlwbGUgcmVjaXBpZW50cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gT0JKX29iajJ0eHQoYnVmLCBidWZfbGVuLCBhLCBub19uYW1lKSwgdGhpcyBjb252ZXJ0cwogICAgIGFuIEFTTjFfT0JKRUNUIHRvIGEgdGV4dCBzdHJpbmcuIElmIHRoZSAibm9fbmFtZSIgcGFyYW1ldGVyIGlzIHNldCB0aGVuCiAgICAgaXQgd2lsbCBhbHdheXMgdXNlIHRoZSBudW1lcmljYWwgZm9ybSBvZiB0aGUgT0lELCBldmVuIGlmIGl0IGhhcyBhIHNob3J0CiAgICAgb3IgbG9uZyBuYW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIGFuIGV4dHJhIFJTQSBmbGFnOiBSU0FfRkxBR19FWFRfUEtFWS4gUHJldmlvdXNseSB0aGUgcnNhX21vZF9leHAKICAgICBtZXRob2Qgb25seSBnb3QgY2FsbGVkIGlmIHAscSxkbXAxLGRtcTEsaXFtcCBjb21wb25lbnRzIHdlcmUgcHJlc2VudCwKICAgICBvdGhlcndpc2UgYm5fbW9kX2V4cCB3YXMgY2FsbGVkLiBJbiB0aGUgY2FzZSBvZiBoYXJkd2FyZSBrZXlzIGZvciBleGFtcGxlCiAgICAgbm8gcHJpdmF0ZSBrZXkgY29tcG9uZW50cyBuZWVkIGJlIHByZXNlbnQgYW5kIGl0IG1pZ2h0IHN0b3JlIGV4dHJhIGRhdGEKICAgICBpbiB0aGUgUlNBIHN0cnVjdHVyZSwgd2hpY2ggY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gYm5fbW9kX2V4cC4KICAgICBCeSBzZXR0aW5nIFJTQV9GTEFHX0VYVF9QS0VZIHJzYV9tb2RfZXhwIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBmb3IKICAgICBwcml2YXRlIGtleSBvcGVyYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIFNQQVJDIExpbnV4LgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBwZW1fcGFzc3dvcmRfY2IgZnVuY3Rpb24gdHlwZSBpbmNvbXBhdGlibHkgY2hhbmdlZCBmcm9tCiAgICAgICAgICB0eXBlZGVmIGludCBwZW1fcGFzc3dvcmRfY2IoY2hhciAqYnVmLCBpbnQgc2l6ZSwgaW50IHJ3ZmxhZyk7CiAgICAgdG8KICAgICAgICAgIC4uLi4oY2hhciAqYnVmLCBpbnQgc2l6ZSwgaW50IHJ3ZmxhZywgdm9pZCAqdXNlcmRhdGEpOwogICAgIHNvIHRoYXQgYXBwbGljYXRpb25zIGNhbiBwYXNzIGRhdGEgdG8gdGhlaXIgY2FsbGJhY2tzOgogICAgIFRoZSBQRU1bX0FTTjFdX3tyZWFkLHdyaXRlfS4uLiBmdW5jdGlvbnMgYW5kIG1hY3JvcyBub3cgdGFrZSBhbgogICAgIGFkZGl0aW9uYWwgdm9pZCAqIGFyZ3VtZW50LCB3aGljaCBpcyBqdXN0IGhhbmRlZCB0aHJvdWdoIHdoZW5ldmVyCiAgICAgdGhlIHBhc3N3b3JkIGNhbGxiYWNrIGlzIGNhbGxlZC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZG1pbGxlckBpbG9naWMuY29tLmF1PjsgdGlueSBjaGFuZ2VzIGJ5IEJvZG8gTW9lbGxlcl0KCiAgICAgTmV3IGZ1bmN0aW9uIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhLgoKICAgICBDb21wYXRpYmlsaXR5IG5vdGU6IEFzIG1hbnkgQyBpbXBsZW1lbnRhdGlvbnMgcHVzaCBmdW5jdGlvbiBhcmd1bWVudHMKICAgICBvbnRvIHRoZSBzdGFjayBpbiByZXZlcnNlIG9yZGVyLCB0aGUgbmV3IGxpYnJhcnkgdmVyc2lvbiBpcyBsaWtlbHkgdG8KICAgICBpbnRlcm9wZXJhdGUgd2l0aCBwcm9ncmFtcyB0aGF0IGhhdmUgYmVlbiBjb21waWxlZCB3aXRoIHRoZSBvbGQKICAgICBwZW1fcGFzc3dvcmRfY2IgZGVmaW5pdGlvbiAoUEVNX3doYXRldmVyIHRha2VzIHNvbWUgZGF0YSB0aGF0CiAgICAgaGFwcGVucyB0byBiZSBvbiB0aGUgc3RhY2sgYXMgaXRzIGxhc3QgYXJndW1lbnQsIGFuZCB0aGUgY2FsbGJhY2sKICAgICBqdXN0IGlnbm9yZXMgdGhpcyBnYXJiYWdlKTsgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB3aGF0c29ldmVyIHRoYXQKICAgICB0aGlzIHdpbGwgd29yay4KCiAgKikgVGhlIC1EUExBVEZPUk09IlwiJChQTEFURk9STSlcIiIgZGVmaW5pdGlvbiBhbmQgdGhlIHNpbWlsYXIgLURDRkxBR1M9Li4uCiAgICAgKGJvdGggaW4gY3J5cHRvL01ha2VmaWxlLnNzbCBmb3IgdXNlIGJ5IGNyeXB0by9jdmVyc2lvbi5jKSBjYXVzZWQKICAgICBwcm9ibGVtcyBub3Qgb25seSBvbiBXaW5kb3dzLCBidXQgYWxzbyBvbiBzb21lIFVuaXggcGxhdGZvcm1zLgogICAgIFRvIGF2b2lkIHByb2JsZW1hdGljIGNvbW1hbmQgbGluZXMsIHRoZXNlIGRlZmluaXRpb25zIGFyZSBub3cgaW4gYW4KICAgICBhdXRvLWdlbmVyYXRlZCBmaWxlIGNyeXB0by9idWlsZGluZi5oIChjcmVhdGVkIGJ5IGNyeXB0by9NYWtlZmlsZS5zc2wKICAgICBmb3Igc3RhbmRhcmQgIm1ha2UiIGJ1aWxkcywgYnkgdXRpbC9tazFtZi5wbCBmb3IgIm1rMW1mIiBidWlsZHMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1JUFMgSUlJL0lWIGFzc2VtYmxlciBtb2R1bGUgaXMgcmVpbXBsZW1lbnRlZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTW9yZSBERVMgbGlicmFyeSBjbGVhbnVwczogcmVtb3ZlIHJlZmVyZW5jZXMgdG8gc3JhbmQvcmFuZCBhbmQKICAgICBkZWxldGUgYW4gdW51c2VkIGZpbGUuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgdGhlIGZyZWUgTmV0d2lkZSBhc3NlbWJsZXIgKE5BU00pIHVuZGVyIFdpbjMyLAogICAgIHNpbmNlIG5vdCBtYW55IHBlb3BsZSBoYXZlIE1BU00gKG1sKSBhbmQgaXQgY2FuIGJlIGhhcmQgdG8gb2J0YWluLgogICAgIFRoaXMgaXMgY3VycmVudGx5IGV4cGVyaW1lbnRhbCBidXQgaXQgc2VlbXMgdG8gd29yayBPSyBhbmQgcGFzcyBhbGwKICAgICB0aGUgdGVzdHMuIENoZWNrIG91dCBJTlNUQUxMLlczMiBmb3IgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggbWVtb3J5IGxlYWtzIGluIHMzX2NsbnQuYzogQWxsIG5vbi1hbm9ueW1vdXMgU1NMMy9UTFMxIGNvbm5lY3Rpb25zCiAgICAgd2l0aG91dCB0ZW1wb3Jhcnkga2V5cyBrZXB0IGFuIGV4dHJhIGNvcHkgb2YgdGhlIHNlcnZlciBrZXksCiAgICAgYW5kIGNvbm5lY3Rpb25zIHdpdGggdGVtcG9yYXJ5IGtleXMgZGlkIG5vdCBmcmVlIGV2ZXJ5dGhpbmcgaW4gY2FzZQogICAgIG9mIGFuIGVycm9yLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBSU0FfY2hlY2tfa2V5IGFuZCBuZXcgb3BlbnNzbCByc2Egb3B0aW9uIC1jaGVjawogICAgIGZvciB2ZXJpZnlpbmcgdGhlIGNvbnNpc3RlbmN5IG9mIFJTQSBrZXlzLgogICAgIFtVbGYgTW9lbGxlciwgQm9kbyBNb2VsbGVyXQoKICAqKSBWYXJpb3VzIGNoYW5nZXMgdG8gbWFrZSBXaW4zMiBjb21waWxlIHdvcms6IAogICAgIDEuIENhc3RzIHRvIGF2b2lkICJsb3NzIG9mIGRhdGEiIHdhcm5pbmdzIGluIHA1X2NycHQyLmMKICAgICAyLiBDaGFuZ2UgdW5zaWduZWQgaW50IHRvIGludCBpbiBiX2R1bXAuYyB0byBhdm9pZCAic2lnbmVkL3Vuc2lnbmVkCiAgICAgICAgY29tcGFyaXNvbiIgd2FybmluZ3MuCiAgICAgMy4gQWRkIHNrXzxUWVBFPl9zb3J0IHRvIERFRiBmaWxlIGdlbmVyYXRvciBhbmQgZG8gbWFrZSB1cGRhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZGVidWdnaW5nIG9wdGlvbiB0byBQS0NTIzUgdjIga2V5IGdlbmVyYXRpb24gZnVuY3Rpb246IHdoZW4KICAgICB5b3UgI2RlZmluZSBERUJVR19QS0NTNVYyIHBhc3N3b3Jkcywgc2FsdHMsIGl0ZXJhdGlvbiBjb3VudHMgYW5kCiAgICAgZGVyaXZlZCBrZXlzIGFyZSBwcmludGVkIHRvIHN0ZGVyci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb3B5IHRoZSBmbGFncyBpbiBBU04xX1NUUklOR19kdXAoKS4KICAgICBbUm9tYW4gRS4gUGF2bG92IDxwcmVAbW8ubXNrLnJ1Pl0KCiAgKikgVGhlIHg1MDkgYXBwbGljYXRpb24gbWlzaGFuZGxlZCBzaWduaW5nIHJlcXVlc3RzIGNvbnRhaW5pbmcgRFNBCiAgICAga2V5cyB3aGVuIHRoZSBzaWduaW5nIGtleSB3YXMgYWxzbyBEU0EgYW5kIHRoZSBwYXJhbWV0ZXJzIGRpZG4ndCBtYXRjaC4KCiAgICAgSXQgd2FzIHN1cHBvc2VkIHRvIG9taXQgdGhlIHBhcmFtZXRlcnMgd2hlbiB0aGV5IG1hdGNoZWQgdGhlIHNpZ25pbmcga2V5OgogICAgIHRoZSB2ZXJpZnlpbmcgc29mdHdhcmUgd2FzIHRoZW4gc3VwcG9zZWQgdG8gYXV0b21hdGljYWxseSB1c2UgdGhlIENBJ3MKICAgICBwYXJhbWV0ZXJzIGlmIHRoZXkgd2VyZSBhYnNlbnQgZnJvbSB0aGUgZW5kIHVzZXIgY2VydGlmaWNhdGUuCgogICAgIE9taXR0aW5nIHBhcmFtZXRlcnMgaXMgbm8gbG9uZ2VyIHJlY29tbWVuZGVkLiBUaGUgdGVzdCB3YXMgYWxzbwogICAgIHRoZSB3cm9uZyB3YXkgcm91bmQhIFRoaXMgd2FzIHByb2JhYmx5IGR1ZSB0byB1bnVzdWFsIGJlaGF2aW91ciBpbgogICAgIEVWUF9jbXBfcGFyYW1ldGVycygpIHdoaWNoIHJldHVybnMgMSBpZiB0aGUgcGFyYW1ldGVycyBtYXRjaC4gCiAgICAgVGhpcyBtZWFudCB0aGF0IHBhcmFtZXRlcnMgd2VyZSBvbWl0dGVkIHdoZW4gdGhleSAqZGlkbid0KiBtYXRjaCBhbmQKICAgICB0aGUgY2VydGlmaWNhdGUgd2FzIHVzZWxlc3MuIENlcnRpZmljYXRlcyBzaWduZWQgd2l0aCAnY2EnIGRpZG4ndCBoYXZlCiAgICAgdGhpcyBidWcuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgRG91ZyBFcmlja3NvbiA8RG91Zy5Fcmlja3NvbkBQYXJ0Lk5FVD5dCgogICopIE1lbW9yeSBsZWFrIGNoZWNraW5nICgtRENSWVBUT19NREVCVUcpIGhhZCBzb21lIHByb2JsZW1zLgogICAgIFRoZSBpbnRlcmZhY2UgaXMgYXMgZm9sbG93czoKICAgICBBcHBsaWNhdGlvbnMgY2FuIHVzZQogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19PTikgYWthIE1lbUNoZWNrX3N0YXJ0KCksCiAgICAgICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX09GRikgYWthIE1lbUNoZWNrX3N0b3AoKTsKICAgICAib2ZmIiBpcyBub3cgdGhlIGRlZmF1bHQuCiAgICAgVGhlIGxpYnJhcnkgaW50ZXJuYWxseSB1c2VzCiAgICAgICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX0RJU0FCTEUpIGFrYSBNZW1DaGVja19vZmYoKSwKICAgICAgICAgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfRU5BQkxFKSBha2EgTWVtQ2hlY2tfb24oKQogICAgIHRvIGRpc2FibGUgbWVtb3J5LWNoZWNraW5nIHRlbXBvcmFyaWx5LgoKICAgICBTb21lIGluY29uc2lzdGVudCBzdGF0ZXMgdGhhdCBwcmV2aW91c2x5IHdlcmUgcG9zc2libGUgKGFuZCB3ZXJlCiAgICAgZXZlbiB0aGUgZGVmYXVsdCkgYXJlIG5vdyBhdm9pZGVkLgoKICAgICAtRENSWVBUT19NREVCVUdfVElNRSBpcyBuZXcgYW5kIGFkZGl0aW9uYWxseSBzdG9yZXMgdGhlIGN1cnJlbnQgdGltZQogICAgIHdpdGggZWFjaCBtZW1vcnkgY2h1bmsgYWxsb2NhdGVkOyB0aGlzIGlzIG9jY2FzaW9uYWxseSBtb3JlIGhlbHBmdWwKICAgICB0aGFuIGp1c3QgaGF2aW5nIGEgY291bnRlci4KCiAgICAgLURDUllQVE9fTURFQlVHX1RIUkVBRCBpcyBhbHNvIG5ldyBhbmQgYWRkcyB0aGUgdGhyZWFkIElELgoKICAgICAtRENSWVBUT19NREVCVUdfQUxMIGVuYWJsZXMgYWxsIG9mIHRoZSBhYm92ZSwgcGx1cyBhbnkgZnV0dXJlCiAgICAgZXh0ZW5zaW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbnRyb2R1Y2UgIm1vZGUiIGZvciBTU0wgc3RydWN0dXJlcyAod2l0aCBkZWZhdWx0cyBpbiBTU0xfQ1RYKSwKICAgICB3aGljaCBsYXJnZWx5IHBhcmFsbGVscyAib3B0aW9ucyIsIGJ1dCBpcyBmb3IgY2hhbmdpbmcgQVBJIGJlaGF2aW91ciwKICAgICB3aGVyZWFzICJvcHRpb25zIiBhcmUgYWJvdXQgcHJvdG9jb2wgYmVoYXZpb3VyLgogICAgIEluaXRpYWwgIm1vZGUiIGZsYWdzIGFyZToKCiAgICAgU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEUgICBBbGxvdyBTU0xfd3JpdGUgdG8gcmVwb3J0IHN1Y2Nlc3Mgd2hlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzaW5nbGUgcmVjb3JkIGhhcyBiZWVuIHdyaXR0ZW4uCiAgICAgU1NMX01PREVfQUNDRVBUX01PVklOR19XUklURV9CVUZGRVIgIERvbid0IGluc2lzdCB0aGF0IFNTTF93cml0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllcyB1c2UgdGhlIHNhbWUgYnVmZmVyIGxvY2F0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1dCBhbGwgb2YgdGhlIGNvbnRlbnRzIG11c3QgYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZCEpCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4OiBTU0xfc2V0X29wdGlvbnMgaWdub3JlZCBpdHMgcGFyYW1ldGVyLCBvbmx5IFNTTF9DVFhfc2V0X29wdGlvbnMKICAgICB3b3JrZWQuCgogICopIEZpeCBwcm9ibGVtcyB3aXRoIG5vLWhtYWMgZXRjLgogICAgIFtVbGYgTfZsbGVyLCBwb2ludGVkIG91dCBieSBCcmlhbiBXZWxsaW5ndG9uIDxid2VsbGluZ0B0aXNsYWJzLmNvbT5dCgogICopIE5ldyBmdW5jdGlvbnMgUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpLCBSU0Ffc2V0X21ldGhvZCgpIGFuZAogICAgIFJTQV9nZXRfbWV0aG9kKCkuIFRoZXNlIGFsbG93cyByZXBsYWNlbWVudCBvZiBSU0FfTUVUSE9EcyB3aXRob3V0IGhhdmluZwogICAgIHRvIG1lc3MgYXJvdW5kIHdpdGggdGhlIGludGVybmFscyBvZiBhbiBSU0Egc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBtZW1vcnkgbGVha3MgaW4gRFNBX2RvX3NpZ24gYW5kIERTQV9pc19wcmltZS4KICAgICBBbHNvIHJlYWxseSBlbmFibGUgbWVtb3J5IGxlYWsgY2hlY2tzIGluIG9wZW5zc2wuYyBhbmQgaW4gc29tZQogICAgIHRlc3QgcHJvZ3JhbXMuCiAgICAgW0NoYWQgQy4gTXVsbGlnYW4sIEJvZG8gTW9lbGxlcl0KCiAgKikgRml4IGEgYnVnIGluIGQyaV9BU04xX0lOVEVHRVIoKSBhbmQgaTJkX0FTTjFfSU5URUdFUigpIHdoaWNoIGNhbiBtZXNzCiAgICAgdXAgdGhlIGxlbmd0aCBvZiBuZWdhdGl2ZSBpbnRlZ2Vycy4gVGhpcyBoYXMgbm93IGJlZW4gc2ltcGxpZmllZCB0byBqdXN0CiAgICAgc3RvcmUgdGhlIGxlbmd0aCB3aGVuIGl0IGlzIGZpcnN0IGRldGVybWluZWQgYW5kIHVzZSBpdCBsYXRlciwgcmF0aGVyCiAgICAgdGhhbiB0cnlpbmcgdG8ga2VlcCB0cmFjayBvZiB3aGVyZSBkYXRhIGlzIGNvcGllZCBhbmQgdXBkYXRpbmcgaXQgdG8KICAgICBwb2ludCB0byB0aGUgZW5kLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEJyaWVuIFdoZWVsZXIKICAgICAgPGJ3aGVlbGVyQGF1dGhlbnRpY2Etc2VjdXJpdHkuY29tPl0KCiAgKikgQWRkIGEgbmV3IGZ1bmN0aW9uIFBLQ1M3X3NpZ25hdHVyZVZlcmlmeS4gVGhpcyBhbGxvd3MgdGhlIHZlcmlmaWNhdGlvbgogICAgIG9mIGEgUEtDUyM3IHNpZ25hdHVyZSBidXQgd2l0aCB0aGUgc2lnbmluZyBjZXJ0aWZpY2F0ZSBwYXNzZWQgdG8gdGhlCiAgICAgZnVuY3Rpb24gaXRzZWxmLiBUaGlzIGNvbnRyYXN0cyB3aXRoIFBLQ1M3X2RhdGFWZXJpZnkgd2hpY2ggYXNzdW1lcyB0aGUKICAgICBjZXJ0aWZpY2F0ZSBpcyBwcmVzZW50IGluIHRoZSBQS0NTIzcgc3RydWN0dXJlLiBUaGlzIGlzbid0IGFsd2F5cyB0aGUKICAgICBjYXNlOiBjZXJ0aWZpY2F0ZXMgY2FuIGJlIG9taXR0ZWQgZnJvbSBhIFBLQ1MjNyBzdHJ1Y3R1cmUgYW5kIGJlCiAgICAgZGlzdHJpYnV0ZWQgYnkgIm91dCBvZiBiYW5kIiBtZWFucyAoc3VjaCBhcyBhIGNlcnRpZmljYXRlIGRhdGFiYXNlKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb21wbGV0ZSB0aGUgUEVNXyogbWFjcm9zIHdpdGggREVDTEFSRV9QRU0gdmVyc2lvbnMgdG8gcmVwbGFjZSB0aGUKICAgICBmdW5jdGlvbiBwcm90b3R5cGVzIGluIHBlbS5oLCBhbHNvIGNoYW5nZSB1dGlsL21rZGVmLnBsIHRvIGFkZCB0aGUKICAgICBuZWNlc3NhcnkgZnVuY3Rpb24gbmFtZXMuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIG1rMW1mLnBsICh1c2VkIGJ5IFdpbmRvd3MgYnVpbGRzKSBkaWQgbm90IHByb3Blcmx5IHJlYWQgdGhlCiAgICAgb3B0aW9ucyBzZXQgYnkgQ29uZmlndXJlIGluIHRoZSB0b3AgbGV2ZWwgTWFrZWZpbGUsIGFuZCBDb25maWd1cmUKICAgICB3YXMgbm90IGV2ZW4gYWJsZSB0byB3cml0ZSBtb3JlIHRoYW4gb25lIG9wdGlvbiBjb3JyZWN0bHkuCiAgICAgRml4ZWQsIG5vdyAibm8taWRlYSBuby1yYzUgLURDUllQVE9fTURFQlVHIiBldGMuIHdvcmtzIGFzIGludGVuZGVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbnMgQ09ORl9sb2FkX2JpbygpIGFuZCBDT05GX2xvYWRfZnAoKSB0byBhbGxvdyBhIGNvbmZpZwogICAgIGZpbGUgdG8gYmUgbG9hZGVkIGZyb20gYSBCSU8gb3IgRklMRSBwb2ludGVyLiBUaGUgQklPIHZlcnNpb24gd2lsbAogICAgIGZvciBleGFtcGxlIGFsbG93IG1lbW9yeSBCSU9zIHRvIGNvbnRhaW4gY29uZmlnIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uICJDUllQVE9fbnVtX2xvY2tzIiB0aGF0IHJldHVybnMgQ1JZUFRPX05VTV9MT0NLUy4KICAgICBXaG9ldmVyIGhvcGVzIHRvIGFjaGlldmUgc2hhcmVkLWxpYnJhcnkgY29tcGF0aWJpbGl0eSBhY3Jvc3MgdmVyc2lvbnMKICAgICBtdXN0IHVzZSB0aGlzLCBub3QgdGhlIGNvbXBpbGUtdGltZSBtYWNyby4KICAgICAoRXhlcmNpc2UgMC45LjQ6IFdoaWNoIGlzIHRoZSBtaW5pbXVtIGxpYnJhcnkgdmVyc2lvbiByZXF1aXJlZCBieQogICAgIHN1Y2ggcHJvZ3JhbXM/KQogICAgIE5vdGU6IEFsbCB0aGlzIGFwcGxpZXMgb25seSB0byBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcywgb3RoZXJzIGRvbid0CiAgICAgbmVlZCBsb2Nrcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgbWlzc2luZyBjYXNlIHRvIHMzX2NsbnQuYyBzdGF0ZSBtYWNoaW5lIC0tIG9uZSBvZiB0aGUgbmV3IFNTTCB0ZXN0cwogICAgIHRocm91Z2ggYSBCSU8gcGFpciB0cmlnZ2VyZWQgdGhlIGRlZmF1bHQgY2FzZSwgaS5lLgogICAgIFNTTGVyciguLi4sU1NMX1JfVU5LTk9XTl9TVEFURSkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3ICJCSU8gcGFpciIgY29uY2VwdCAoY3J5cHRvL2Jpby9ic3NfYmlvLmMpIHNvIHRoYXQgYXBwbGljYXRpb25zCiAgICAgY2FuIHVzZSB0aGUgU1NMIGxpYnJhcnkgZXZlbiBpZiBub25lIG9mIHRoZSBzcGVjaWZpYyBCSU9zIGlzCiAgICAgYXBwcm9wcmlhdGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGEgYnVnIGluIGkyZF9EU0FQdWJsaWNLZXkoKSB3aGljaCBtZWFudCBpdCByZXR1cm5lZCB0aGUgd3JvbmcgdmFsdWUKICAgICBmb3IgdGhlIGVuY29kZWQgbGVuZ3RoLgogICAgIFtKZW9uIEt5b3VuZ0hvIDxraGplb25Ac2RzLnNhbXN1bmcuY28ua3I+XQoKICAqKSBBZGQgaW5pdGlhbCBkb2N1bWVudGF0aW9uIG9mIHRoZSBYNTA5VjMgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIG5ldyBwYWlyIG9mIGZ1bmN0aW9ucyBQRU1fd3JpdGVfUEtDUzhQcml2YXRlS2V5KCkgYW5kIAogICAgIFBFTV93cml0ZV9iaW9fUEtDUzhQcml2YXRlS2V5KCkgdGhhdCBhcmUgZXF1aXZhbGVudCB0bwogICAgIFBFTV93cml0ZV9Qcml2YXRlS2V5KCkgYW5kIFBFTV93cml0ZV9iaW9fUHJpdmF0ZUtleSgpIGJ1dCB1c2UgdGhlIG1vcmUKICAgICBzZWN1cmUgUEtDUyM4IHByaXZhdGUga2V5IGZvcm1hdCB3aXRoIGEgaGlnaCBpdGVyYXRpb24gY291bnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGRldGVybWluYXRpb24gb2YgUGVybCBpbnRlcnByZXRlcjogQSBwZXJsIG9yIHBlcmw1CiAgICAgX2RpcmVjdG9yeV8gaW4gJFBBVEggd2FzIGFsc28gYWNjZXB0ZWQgYXMgdGhlIGludGVycHJldGVyLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggZGVtb3Mvc2lnbi9zaWduLmM6IHdlbGwgdGhlcmUgd2Fzbid0IGFueXRoaW5nIHN0cmljdGx5IHNwZWFraW5nCiAgICAgd3Jvbmcgd2l0aCBpdCBidXQgaXQgd2FzIHZlcnkgb2xkIGFuZCBkaWQgdGhpbmdzIGxpa2UgY2FsbGluZwogICAgIFBFTV9BU04xX3JlYWQoKSBkaXJlY3RseSBhbmQgdXNlZCBNRDUgZm9yIHRoZSBoYXNoIG5vdCB0byBtZW50aW9uIHNvbWUKICAgICB1bnVzdWFsIGZvcm1hdHRpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGRlbW9zL3NlbGZzaWduLmM6IGl0IHVzZWQgb2Jzb2xldGUgYW5kIGRlbGV0ZWQgZnVuY3Rpb25zLCBjaGFuZ2VkCiAgICAgdG8gdXNlIHRoZSBuZXcgZXh0ZW5zaW9uIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wbGVtZW50IHRoZSBQRU1fcmVhZC9QRU1fd3JpdGUgZnVuY3Rpb25zIGluIGNyeXB0by9wZW0vcGVtX2FsbC5jCiAgICAgd2l0aCBtYWNyb3MuIFRoaXMgc2hvdWxkIG1ha2UgaXQgZWFzaWVyIHRvIGNoYW5nZSB0aGVpciBmb3JtLCBhZGQgZXh0cmEKICAgICBhcmd1bWVudHMgZXRjLiBGaXggYSBmZXcgUEVNIHByb3RvdHlwZXMgd2hpY2ggZGlkbid0IGhhdmUgY2lwaGVyIGFzIGEKICAgICBjb25zdGFudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdG8gY29uZmlndXJhdGlvbiB0YWJsZSBhIG5ldyBlbnRyeSB0aGF0IGNhbiBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlCiAgICAgbmFtZSBmb3IgdW5pc3RkLmggKGZvciBwcmUtUE9TSVggc3lzdGVtcyk7IHdlIG5lZWQgdGhpcyBmb3IgTmVYVHN0ZXAsCiAgICAgYWNjb3JkaW5nIHRvIE1hcmsgQ3Jpc3BpbiA8TVJDQFBhbmRhLkNPTT4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiNpZiAwCiAgKikgREVTIENCQyBkaWQgbm90IHVwZGF0ZSB0aGUgSVYuIFdlaXJkLgogICAgIFtCZW4gTGF1cmllXQojZWxzZQogICAgIGRlc19jYmNfZW5jcnlwdCBkb2VzIG5vdCB1cGRhdGUgdGhlIElWLCBidXQgZGVzX25jYmNfZW5jcnlwdCBkb2VzLgogICAgIENoYW5naW5nIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGZvcm1lciBtaWdodCBicmVhayBleGlzdGluZyBwcm9ncmFtcyAtLQogICAgIHdoZXJlIElWIHVwZGF0aW5nIGlzIG5lZWRlZCwgZGVzX25jYmNfZW5jcnlwdCBjYW4gYmUgdXNlZC4KI2VuZGlmCgogICopIFdoZW4gYm50ZXN0IGlzIHJ1biBmcm9tICJtYWtlIHRlc3QiIGl0IGRyaXZlcyBiYyB0byBjaGVjayBpdHMKICAgICBjYWxjdWxhdGlvbnMsIGFzIHdlbGwgYXMgaW50ZXJuYWxseSBjaGVja2luZyB0aGVtLiBJZiBhbiBpbnRlcm5hbCBjaGVjawogICAgIGZhaWxzLCBpdCBuZWVkcyB0byBjYXVzZSBiYyB0byBnaXZlIGEgbm9uLXplcm8gcmVzdWx0IG9yIG1ha2UgdGVzdCBjYXJyaWVzCiAgICAgb24gd2l0aG91dCBub3RpY2luZyB0aGUgZmFpbHVyZS4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIERFUyBsaWJyYXJ5IGNsZWFudXBzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgUEtDUyM1IHYyLjAgUEJFIGFsZ29yaXRobXMuIFRoaXMgd2lsbCBwZXJtaXQgUEtDUyM4IHRvIGJlCiAgICAgdXNlZCB3aXRoIGFueSBjaXBoZXIgdW5saWtlIFBLQ1MjNSB2MS41IHdoaWNoIGNhbiBhdCBtb3N0IGhhbmRsZSA2NCBiaXQKICAgICBjaXBoZXJzLiBOT1RFOiBhbHRob3VnaCB0aGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gaGFzIGJlZW4gdmVyaWZpZWQKICAgICBhZ2FpbnN0IHNvbWUgcHVibGlzaGVkIHRlc3QgdmVjdG9ycyBpdCBoYXMgbm90IGJlZW4gZXh0ZW5zaXZlbHkgdGVzdGVkCiAgICAgeWV0LiBBZGRlZCBhIC12MiAiY2lwaGVyIiBvcHRpb24gdG8gcGtjczggYXBwbGljYXRpb24gdG8gYWxsb3cgdGhlIHVzZQogICAgIG9mIHYyLjAuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5zdGVhZCBvZiAibWtkaXIgLXAiLCB3aGljaCBpcyBub3QgZnVsbHkgcG9ydGFibGUsIHVzZSBuZXcKICAgICBQZXJsIHNjcmlwdCAidXRpbC9ta2Rpci1wLnBsIi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZXdyaXRlIHRoZSB3YXkgcGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiAoUEJFKSBpcyBoYW5kbGVkLiBJdCB1c2VkIHRvCiAgICAgYXNzdW1lIHRoYXQgdGhlIEFTTjEgQWxnb3JpdGhtSWRlbnRpZmllciBwYXJhbWV0ZXIgd2FzIGEgUEJFUGFyYW1ldGVyCiAgICAgc3RydWN0dXJlLiBUaGlzIHdhcyB0cnVlIGZvciB0aGUgUEtDUyM1IHYxLjUgYW5kIFBLQ1MjMTIgUEJFIGFsZ29yaXRobXMKICAgICBidXQgZG9lc24ndCBhcHBseSB0byBQS0NTIzUgdjIuMCB3aGVyZSBpdCBjYW4gYmUgc29tZXRoaW5nIGVsc2UuIE5vdwogICAgIHRoZSAncGFyYW1ldGVyJyBmaWVsZCBvZiB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciBpcyBwYXNzZWQgdG8gdGhlCiAgICAgdW5kZXJseWluZyBrZXkgZ2VuZXJhdGlvbiBmdW5jdGlvbiBzbyBpdCBtdXN0IGRvIGl0cyBvd24gQVNOMSBwYXJzaW5nLgogICAgIFRoaXMgaGFzIGFsc28gY2hhbmdlZCB0aGUgRVZQX1BCRV9DaXBoZXJJbml0KCkgZnVuY3Rpb24gd2hpY2ggbm93IGhhcyBhCiAgICAgJ3BhcmFtZXRlcicgYXJndW1lbnQgaW5zdGVhZCBvZiBsaXRlcmFsIHNhbHQgYW5kIGl0ZXJhdGlvbiBjb3VudCB2YWx1ZXMKICAgICBhbmQgdGhlIGZ1bmN0aW9uIEVWUF9QQkVfQUxHT1JfQ2lwaGVySW5pdCgpIGhhcyBiZWVuIGRlbGV0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgUEtDUyM1IHYxLjUgY29tcGF0aWJsZSBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIGFsZ29yaXRobXMKICAgICBhbmQgUEtDUyM4IGZ1bmN0aW9uYWxpdHkuIE5ldyAncGtjczgnIGFwcGxpY2F0aW9uIGxpbmtlZCB0byBvcGVuc3NsLgogICAgIE5lZWRlZCB0byBjaGFuZ2UgdGhlIFBFTV9TVFJJTkdfRVZQX1BLRVkgdmFsdWUgd2hpY2ggd2FzIGp1c3QgIlBSSVZBVEUKICAgICBLRVkiIGJlY2F1c2UgdGhpcyBjbGFzaGVkIHdpdGggUEtDUyM4IHVuZW5jcnlwdGVkIHN0cmluZy4gU2luY2UgdGhpcwogICAgIHZhbHVlIHdhcyBqdXN0IHVzZWQgYXMgYSAibWFnaWMgc3RyaW5nIiBhbmQgbm90IHVzZWQgZGlyZWN0bHkgaXRzCiAgICAgdmFsdWUgZG9lc24ndCBtYXR0ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW50cm9kdWNlIHNvbWUgc2VtYmxhbmNlIG9mIGNvbnN0IGNvcnJlY3RuZXNzIHRvIEJOLiBTaGFtZSBDIGRvZXNuJ3QKICAgICBzdXBwb3J0IG11dGFibGUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopICJsaW51eC1zcGFyYzY0IiBjb25maWd1cmF0aW9uICh1bHRyYXBlbmd1aW4pLgogICAgIFtSYXkgTWlsbGVyIDxyYXkubWlsbGVyQG91Y3Mub3guYWMudWs+XQogICAgICJsaW51eC1zcGFyYyIgY29uZmlndXJhdGlvbi4KICAgICBbQ2hyaXN0aWFuIEZvcnN0ZXIgPGZvQGhhd28uc3R3LnVuaS1lcmxhbmdlbi5kZT5dCgogICopIGNvbmZpZyBub3cgZ2VuZXJhdGVzIG5vLXh4eCBvcHRpb25zIGZvciBtaXNzaW5nIGNpcGhlcnMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgdGhlIEVCQ0RJQyBjaGFyYWN0ZXIgc2V0ICh3b3JrIGluIHByb2dyZXNzKS4KICAgICBGaWxlIGViY2RpYy5jIG5vdCB5ZXQgaW5jbHVkZWQgYmVjYXVzZSBpdCBoYXMgYSBkaWZmZXJlbnQgbGljZW5zZS4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaFAuU2llbWVucy5EZT5dCgogICopIFN1cHBvcnQgQlMyMDAwL09TRC1QT1NJWC4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaFAuU2llbWVucy5EZT5dCgogICopIE1ha2UgY2FsbGJhY2tzIGZvciBrZXkgZ2VuZXJhdGlvbiB1c2Ugdm9pZCAqIGluc3RlYWQgb2YgY2hhciAqLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNYWtlIFMvTUlNRSBzYW1wbGVzIGNvbXBpbGUgKG5vdCB5ZXQgdGVzdGVkKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkaXRpb25hbCB0eXBlc2FmZSBzdGFja3MuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE5ldyBjb25maWd1cmF0aW9uIHZhcmlhbnRzICJic2RpLWVsZi1nY2MiIChCU0QvT1MgNC54KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjMgYW5kIDAuOS4zYSAgWzI5IE1heSAxOTk5XQoKICAqKSBOZXcgY29uZmlndXJhdGlvbiB2YXJpYW50ICJzY281LWdjYyIuCgogICopIFVwZGF0ZWQgc29tZSBkZW1vcy4KICAgICBbU2VhbiBPIFJpb3JkYWluLCBXYWRlIFNjaG9saW5lXQoKICAqKSBBZGQgbWlzc2luZyBCSU9fZnJlZSBhdCBleGl0IG9mIHBrY3MxMiBhcHBsaWNhdGlvbi4KICAgICBbV3UgWmhpZ2FuZ10KCiAgKikgRml4IG1lbW9yeSBsZWFrIGluIGNvbmYuYy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGVzIGZvciBXaW4zMiB0byBhc3NlbWJsZXIgdmVyc2lvbiBvZiBNRDUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU2V0ICMhIHBhdGggdG8gcGVybCBpbiBhcHBzL2Rlcl9jaG9wIHRvIHdoZXJlIHdlIGZvdW5kIGl0CiAgICAgaW5zdGVhZCBvZiB1c2luZyBhIGZpeGVkIHBhdGguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU0hBIGxpYnJhcnkgY2hhbmdlcyBmb3IgaXJpeDY0LW1pcHM0LWNjLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBJbXByb3ZlbWVudHMgZm9yIFZNUyBzdXBwb3J0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgoKIENoYW5nZXMgYmV0d2VlbiAwLjkuMmIgYW5kIDAuOS4zICBbMjQgTWF5IDE5OTldCgogICopIEJpZ251bSBsaWJyYXJ5IGJ1ZyBmaXguIElSSVggNiBwYXNzZXMgIm1ha2UgdGVzdCIgbm93IQogICAgIFRoaXMgYWxzbyBhdm9pZHMgdGhlIHByb2JsZW1zIHdpdGggU0M0LjIgYW5kIHVucGF0Y2hlZCBTQzUuICAKICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBOZXcgZnVuY3Rpb25zIHNrX251bSwgc2tfdmFsdWUgYW5kIHNrX3NldCB0byByZXBsYWNlIHRoZSBwcmV2aW91cyBtYWNyb3MuCiAgICAgVGhlc2UgYXJlIHJlcXVpcmVkIGJlY2F1c2Ugb2YgdGhlIHR5cGVzYWZlIHN0YWNrIHdvdWxkIG90aGVyd2lzZSBicmVhayAKICAgICBleGlzdGluZyBjb2RlLiBJZiBvbGQgY29kZSB1c2VkIGEgc3RydWN0dXJlIG1lbWJlciB3aGljaCB1c2VkIHRvIGJlIFNUQUNLCiAgICAgYW5kIGlzIG5vdyBTVEFDS19PRiAoZm9yIGV4YW1wbGUgY2VydCBpbiBhIFBLQ1M3X1NJR05FRCBzdHJ1Y3R1cmUpIHdpdGgKICAgICBza19udW0gb3Igc2tfdmFsdWUgaXQgd291bGQgcHJvZHVjZSBhbiBlcnJvciBiZWNhdXNlIHRoZSBudW0sIGRhdGEgbWVtYmVycwogICAgIGFyZSBub3QgcHJlc2VudCBpbiBTVEFDS19PRi4gTm93IGl0IGp1c3QgcHJvZHVjZXMgYSB3YXJuaW5nLiBza19zZXQKICAgICByZXBsYWNlcyB0aGUgb2xkIG1ldGhvZCBvZiBhc3NpZ25pbmcgYSB2YWx1ZSB0byBza192YWx1ZQogICAgIChlLmcuIHNrX3ZhbHVlKHgsIGkpID0geSkgd2hpY2ggdGhlIGxpYnJhcnkgdXNlZCBpbiBhIGZldyBjYXNlcy4gQW55IGNvZGUKICAgICB0aGF0IGRvZXMgdGhpcyB3aWxsIG5vIGxvbmdlciB3b3JrIChhbmQgc2hvdWxkIHVzZSBza19zZXQgaW5zdGVhZCkgYnV0CiAgICAgdGhpcyBjb3VsZCBiZSByZWdhcmRlZCBhcyBhICJxdWVzdGlvbmFibGUiIGJlaGF2aW91ciBhbnl3YXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IG1vc3Qgb2YgdGhlIG90aGVyIFBLQ1MjNyBidWdzLiBUaGUgImV4cGVyaW1lbnRhbCIgY29kZSBjYW4gbm93CiAgICAgY29ycmVjdGx5IGhhbmRsZSBlbmNyeXB0ZWQgUy9NSU1FIGRhdGEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHR5cGUgb2YgdmFyaW91cyBERVMgZnVuY3Rpb24gYXJndW1lbnRzIGZyb20gZGVzX2NibG9jawogICAgICh3aGljaCBtZWFucywgaW4gZnVuY3Rpb24gYXJndW1lbnQgZGVjbGFyYXRpb25zLCBwb2ludGVyIHRvIGNoYXIpCiAgICAgdG8gZGVzX2NibG9jayAqIChtZWFuaW5nIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCA4IGNoYXIgZWxlbWVudHMpLAogICAgIHdoaWNoIGFsbG93cyB0aGUgY29tcGlsZXIgdG8gZG8gbW9yZSB0eXBlY2hlY2tpbmc7IGl0IHdhcyBsaWtlCiAgICAgdGhhdCBiYWNrIGluIFNTTGVheSwgYnV0IHdpdGggbG90cyBvZiB1Z2x5IGNhc3RzLgoKICAgICBJbnRyb2R1Y2UgbmV3IHR5cGUgY29uc3RfZGVzX2NibG9jay4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW9yZ2FuaXNlIHRoZSBQS0NTIzcgbGlicmFyeSBhbmQgZ2V0IHJpZCBvZiBzb21lIG9mIHRoZSBtb3JlIG9idmlvdXMKICAgICBwcm9ibGVtczogZmluZCBSZWNpcGllbnRJbmZvIHN0cnVjdHVyZSB0aGF0IG1hdGNoZXMgcmVjaXBpZW50IGNlcnRpZmljYXRlCiAgICAgYW5kIGluaXRpYWxpc2UgdGhlIEFTTjEgc3RydWN0dXJlcyBwcm9wZXJseSBiYXNlZCBvbiBwYXNzZWQgY2lwaGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJlbGF0ZWRseSBtYWtlIHRoZSBCTiB0ZXN0cyBhY3R1YWxseSBjaGVjayB0aGUgcmVzdWx0cy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHRoZSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgb2YgbmVnYXRpdmUgQVNOMSBJTlRFR0VSUyBhbmQgY29udmVyc2lvbgogICAgIHRvIGFuZCBmcm9tIEJOczogaXQgd2FzIGNvbXBsZXRlbHkgYnJva2VuLiBOZXcgY29tcGlsYXRpb24gb3B0aW9uCiAgICAgTkVHX1BVQktFWV9CVUcgdG8gYWxsb3cgZm9yIHNvbWUgYnJva2VuIGNlcnRpZmljYXRlcyB0aGF0IGVuY29kZSBwdWJsaWMKICAgICBrZXkgZWxlbWVudHMgYXMgbmVnYXRpdmUgaW50ZWdlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVvcmdhbml6ZSBhbmQgc3BlZWQgdXAgTUQ1LgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIFZNUyBzdXBwb3J0LgogICAgIFtSaWNoYXJkIExldml0dGUgPHJpY2hhcmRAbGV2aXR0ZS5vcmc+XQoKICAqKSBOZXcgb3B0aW9uIC1vdXQgdG8gYXNuMXBhcnNlIHRvIGFsbG93IHRoZSBwYXJzZWQgc3RydWN0dXJlIHRvIGJlCiAgICAgb3V0cHV0IHRvIGEgZmlsZS4gVGhpcyBpcyBtb3N0IHVzZWZ1bCB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIC1zdHJwYXJzZQogICAgIG9wdGlvbiB0byBleGFtaW5lIHRoZSBvdXRwdXQgb2YgdGhpbmdzIGxpa2UgT0NURVQgU1RSSU5HUy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFNTTCBsaWJyYXJ5IGEgbGl0dGxlIG1vcmUgZm9vbC1wcm9vZiBieSBub3QgcmVxdWlyaW5nIGFueSBsb25nZXIKICAgICB0aGF0IFNTTF9zZXRfe2FjY2VwdCxjb25uZWN0fV9zdGF0ZSBiZSBjYWxsZWQgYmVmb3JlCiAgICAgU1NMX3thY2NlcHQsY29ubmVjdH0gbWF5IGJlIHVzZWQgKFNTTF9zZXRfLi4uX3N0YXRlIGlzIG9taXR0ZWQKICAgICBpbiBtYW55IGFwcGxpY2F0aW9ucyBiZWNhdXNlIHVzdWFsbHkgZXZlcnl0aGluZyAqYXBwZWFyZWQqIHRvIHdvcmsgYXMKICAgICBpbnRlbmRlZCBhbnl3YXkgLS0gbm93IGl0IHJlYWxseSB3b3JrcyBhcyBpbnRlbmRlZCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTW92ZSBvcGVuc3NsLmNuZiBvdXQgb2YgbGliLy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IHZhcmlvdXMgdGhpbmdzIHRvIGxldCBPcGVuU1NMIGV2ZW4gcGFzcyBgYGVnY2MgLXBpcGUgLU8yIC1XYWxsCiAgICAgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1XY2FzdC1hbGlnbiAtV21pc3NpbmctcHJvdG90eXBlcwogICAgIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVduZXN0ZWQtZXh0ZXJucyAtV2lubGluZScnIHdpdGggRUdDUyAxLjEuMisgCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFZhcmlvdXMgZml4ZXMgdG8gdGhlIEVWUCBhbmQgUEtDUyM3IGNvZGUuIEl0IG1heSBub3cgYmUgYWJsZSB0bwogICAgIGhhbmRsZSBQS0NTIzcgZW52ZWxvcGVkIGRhdGEgcHJvcGVybHkuCiAgICAgW1NlYmFzdGlhbiBBa2VybWFuIDxzYWtAcGFyYWxsZWxjb25zdWx0aW5nLmNvbT4sIG1vZGlmaWVkIGJ5IFN0ZXZlXQoKICAqKSBDcmVhdGUgYSBkdXBsaWNhdGUgb2YgdGhlIFNTTF9DVFgncyBDRVJUIGluIFNTTF9uZXcgaW5zdGVhZCBvZgogICAgIGNvcHlpbmcgcG9pbnRlcnMuICBUaGUgY2VydF9zdCBoYW5kbGluZyBpcyBjaGFuZ2VkIGJ5IHRoaXMgaW4KICAgICB2YXJpb3VzIHdheXMgKGFuZCB0aHVzIHdoYXQgdXNlZCB0byBiZSBrbm93biBhcyBjdHgtPmRlZmF1bHRfY2VydAogICAgIGlzIG5vdyBjYWxsZWQgY3R4LT5jZXJ0LCBzaW5jZSB3ZSBkb24ndCByZXNvcnQgdG8gcy0+Y3R4LT5bZGVmYXVsdF9dY2VydAogICAgIGFueSBsb25nZXIgd2hlbiBzLT5jZXJ0IGRvZXMgbm90IGdpdmUgdXMgd2hhdCB3ZSBuZWVkKS4KICAgICBzc2xfY2VydF9pbnN0YW50aWF0ZSBiZWNvbWVzIG9ic29sZXRlIGJ5IHRoaXMgY2hhbmdlLgogICAgIEFzIHNvb24gYXMgd2UndmUgZ290IHRoZSBuZXcgY29kZSByaWdodCAocG9zc2libHkgaXQgYWxyZWFkeSBpcz8pLAogICAgIHdlIGhhdmUgc29sdmVkIGEgY291cGxlIG9mIGJ1Z3Mgb2YgdGhlIGVhcmxpZXIgY29kZSB3aGVyZSBzLT5jZXJ0CiAgICAgd2FzIHVzZWQgYXMgaWYgaXQgY291bGQgbm90IGhhdmUgYmVlbiBzaGFyZWQgd2l0aCBvdGhlciBTU0wgc3RydWN0dXJlcy4KCiAgICAgTm90ZSB0aGF0IHVzaW5nIHRoZSBTU0wgQVBJIGluIGNlcnRhaW4gZGlydHkgd2F5cyBub3cgd2lsbCByZXN1bHQKICAgICBpbiBkaWZmZXJlbnQgYmVoYXZpb3VyIHRoYW4gb2JzZXJ2ZWQgd2l0aCBlYXJsaWVyIGxpYnJhcnkgdmVyc2lvbnM6CiAgICAgQ2hhbmdpbmcgc2V0dGluZ3MgZm9yIGFuIFNTTF9DVFggKmN0eCBhZnRlciBoYXZpbmcgZG9uZSBzID0gU1NMX25ldyhjdHgpCiAgICAgZG9lcyBub3QgaW5mbHVlbmNlIHMgYXMgaXQgdXNlZCB0by4KICAgICAKICAgICBJbiBvcmRlciB0byBjbGVhbiB1cCB0aGluZ3MgbW9yZSB0aG9yb3VnaGx5LCBpbnNpZGUgU1NMX1NFU1NJT04KICAgICB3ZSBkb24ndCB1c2UgQ0VSVCBhbnkgbG9uZ2VyLCBidXQgYSBuZXcgc3RydWN0dXJlIFNFU1NfQ0VSVAogICAgIHRoYXQgaG9sZHMgcGVyLXNlc3Npb24gZGF0YSAoaWYgYXZhaWxhYmxlKTsgY3VycmVudGx5LCB0aGlzIGlzCiAgICAgdGhlIHBlZXIncyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQsIGZvciBjbGllbnRzLCB0aGUgc2VydmVyJ3MgY2VydGlmaWNhdGUKICAgICBhbmQgdGVtcG9yYXJ5IGtleS4gIENFUlQgaG9sZHMgb25seSB0aG9zZSB2YWx1ZXMgdGhhdCBjYW4gaGF2ZQogICAgIG1lYW5pbmdmdWwgZGVmYXVsdHMgaW4gYW4gU1NMX0NUWC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOVYzX0VYVF9pMmQoKSB0byBjcmVhdGUgYW4gWDUwOV9FWFRFTlNJT04gc3RydWN0dXJlCiAgICAgZnJvbSB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uIFZhcmlvdXMgUEtDUyM3IGZpeGVzOiByZW1vdmUgc29tZQogICAgIGV2aWwgY2FzdHMgYW5kIHNldCB0aGUgZW5jX2RpZ19hbGcgZmllbGQgcHJvcGVybHkgYmFzZWQgb24gdGhlIHNpZ25pbmcKICAgICBrZXkgdHlwZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBQS0NTIzEyIHBhc3N3b3JkIHRvIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3IgdGhlCiAgICAgZW52aXJvbm1lbnQuIExldCAnY2EnIGdldCBpdHMgY29uZmlnIGZpbGUgbmFtZSBmcm9tIHRoZSBlbnZpcm9ubWVudAogICAgIHZhcmlhYmxlcyAiT1BFTlNTTF9DT05GIiBvciAiU1NMRUFZX0NPTkYiIChmb3IgY29uc2lzdGVuY3kgd2l0aCAncmVxJwogICAgIGFuZCAneDUwOScpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IGNlcnRpZmljYXRlIHBvbGljaWVzIGV4dGVuc2lvbiB0byB1c2UgYW4gSUE1U1RSSU5HIGZvciB0aGUKICAgICBvcmdhbml6YXRpb24gZmllbGQuIFRoaXMgaXMgY29udHJhcnkgdG8gdGhlIFBLSVggZGVmaW5pdGlvbiBidXQKICAgICBWZXJpU2lnbiB1c2VzIGl0IGFuZCBJRTUgb25seSByZWNvZ25pc2VzIHRoaXMgZm9ybS4gRG9jdW1lbnQgJ3g1MDknCiAgICAgZXh0ZW5zaW9uIG9wdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgUEVEQU5USUMgY29tcGlsZXIgZmxhZyB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRoIGdjYyAtcGVkYW50aWMsCiAgICAgd2l0aG91dCBkaXNhbGxvd2luZyBpbmxpbmUgYXNzZW1ibGVyIGFuZCB0aGUgbGlrZSBmb3Igbm9uLXBlZGFudGljIGJ1aWxkcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgU3VwcG9ydCBCb3JsYW5kIEMrKyBidWlsZGVyLgogICAgIFtKYW5leiBKZXJlIDxqakB2b2lkLnNpPiwgbW9kaWZpZWQgYnkgVWxmIE32bGxlcl0KCiAgKikgU3VwcG9ydCBNaW5ndzMyLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTSEEtMSBjbGVhbnVwcyBhbmQgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzLgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIFNwYXJjIHY4cGx1cyBhc3NlbWJsZXIgZm9yIHRoZSBiaWdudW0gbGlicmFyeS4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBBY2NlcHQgYW55IC14eHggYW5kICt4eHggY29tcGlsZXIgb3B0aW9ucyBpbiBDb25maWd1cmUuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFVwZGF0ZSBIUFVYIGNvbmZpZ3VyYXRpb24uCiAgICAgW0Fub255bW91c10KICAKICAqKSBBZGQgbWlzc2luZyBza188dHlwZT5fdW5zaGlmdCgpIGZ1bmN0aW9uIHRvIHNhZmVzdGFjay5oCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE5ldyBmdW5jdGlvbiBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlIHRoYXQgc2V0cyB0aGUKICAgICAiZXh0cmFfY2VydCJzIGluIGFkZGl0aW9uIHRvIHRoZSBjZXJ0aWZpY2F0ZS4gIChUaGlzIG1ha2VzIHNlbnNlCiAgICAgb25seSBmb3IgIlBFTSIgZm9ybWF0IGZpbGVzLCBhcyBjaGFpbnMgYXMgYSB3aG9sZSBhcmUgbm90CiAgICAgREVSLWVuY29kZWQuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFN1cHBvcnQgdmVyaWZ5X2RlcHRoIGZyb20gdGhlIFNTTCBBUEkuCiAgICAgeDUwOV92ZnkuYyBoYWQgd2hhdCBjYW4gYmUgY29uc2lkZXJlZCBhbiBvZmYtYnktb25lLWVycm9yOgogICAgIEl0cyBkZXB0aCAod2hpY2ggd2FzIG5vdCBwYXJ0IG9mIHRoZSBleHRlcm5hbCBpbnRlcmZhY2UpCiAgICAgd2FzIGFjdHVhbGx5IGNvdW50aW5nIHRoZSBudW1iZXIgb2YgY2VydGlmaWNhdGVzIGluIGEgY2hhaW47CiAgICAgbm93IGl0IHJlYWxseSBjb3VudHMgdGhlIGRlcHRoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeCBpbiBjcnlwdG8veDUwOS94NTA5X2NtcC5jOiBUaGUgU1NMZXJyIG1hY3JvIHdhcyB1c2VkCiAgICAgaW5zdGVhZCBvZiBYNTA5ZXJyLCB3aGljaCBvZnRlbiByZXN1bHRlZCBpbiBjb25mdXNpbmcgZXJyb3IKICAgICBtZXNzYWdlcyBzaW5jZSB0aGUgZXJyb3IgY29kZXMgYXJlIG5vdCBnbG9iYWxseSB1bmlxdWUKICAgICAoZS5nLiBhbiBhbGxlZ2VkIGVycm9yIGluIHNzbDNfYWNjZXB0IHdoZW4gYSBjZXJ0aWZpY2F0ZQogICAgIGRpZG4ndCBtYXRjaCB0aGUgcHJpdmF0ZSBrZXkpLgoKICAqKSBOZXcgZnVuY3Rpb24gU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0IHRoYXQgYWxsb3dzIHRvIHNldCBhIGRlZmF1bHQKICAgICB2YWx1ZSAoc28gdGhhdCB5b3UgZG9uJ3QgbmVlZCBTU0xfc2V0X3Nlc3Npb25faWRfY29udGV4dCBmb3IgZWFjaAogICAgIGNvbm5lY3Rpb24gdXNpbmcgdGhlIFNTTF9DVFgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE9BRVAgZGVjb2RpbmcgYnVnIGZpeC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU3VwcG9ydCBJTlNUQUxMX1BSRUZJWCBmb3IgcGFja2FnZSBidWlsZGVycywgYXMgcHJvcG9zZWQgYnkKICAgICBEYXZpZCBIYXJyaXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IENvbmZpZ3VyZSBvcHRpb25zICJ0aHJlYWRzIiBhbmQgIm5vLXRocmVhZHMiLiAgRm9yIHN5c3RlbXMKICAgICB3aGVyZSB0aGUgcHJvcGVyIGNvbXBpbGVyIG9wdGlvbnMgYXJlIGtub3duIChjdXJyZW50bHkgU29sYXJpcwogICAgIGFuZCBMaW51eCksICJ0aHJlYWRzIiBpcyB0aGUgZGVmYXVsdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgc2NyaXB0IHV0aWwvbWtsaW5rLnBsIGFzIGEgZmFzdGVyIHN1YnN0aXR1dGUgZm9yIHV0aWwvbWtsaW5rLnNoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluc3RhbGwgdmFyaW91cyBzY3JpcHRzIHRvICQoT1BFTlNTTERJUikvbWlzYywgbm90IHRvCiAgICAgJChJTlNUQUxMVE9QKS9iaW4gLS0gdGhleSBzaG91bGRuJ3QgY2x1dHRlciBkaXJlY3RvcmllcwogICAgIHN1Y2ggYXMgL3Vzci9sb2NhbC9iaW4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgIm1ha2UgbGludXgtc2hhcmVkIiB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgogICAgIFtOaWVscyBQb3BwZSA8bmllbHNAbmV0Ym94Lm9yZz5dCgogICopIE5ldyBDb25maWd1cmUgb3B0aW9uIG5vLTxjaXBoZXI+IChyc2EsIGlkZWEsIHJjNSwgLi4uKS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIHRoZSBQS0NTIzEyIEFQSSBkb2N1bWVudGF0aW9uIHRvIG9wZW5zc2wudHh0LiBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvcgogICAgIGV4dGVuc2lvbiBhZGRpbmcgaW4geDUwOSB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSBOT1BST1RPIHNlY3Rpb25zIGFuZCBlcnJvciBjb2RlIGNvbW1lbnRzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBQYXJ0aWFsIHJld3JpdGUgb2YgdGhlIERFRiBmaWxlIGdlbmVyYXRvciB0byBub3cgcGFyc2UgdGhlIEFOU0kKICAgICBwcm90b3R5cGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBDb25maWd1cmUgb3B0aW9ucyAtLXByZWZpeD1ESVIgYW5kIC0tb3BlbnNzbGRpcj1ESVIuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENvbXBsZXRlIHJld3JpdGUgb2YgdGhlIGVycm9yIGNvZGUgc2NyaXB0KHMpLiBJdCBpcyBhbGwgbm93IGhhbmRsZWQKICAgICBieSBvbmUgc2NyaXB0IGF0IHRoZSB0b3AgbGV2ZWwgd2hpY2ggaGFuZGxlcyBlcnJvciBjb2RlIGdhdGhlcmluZywKICAgICBoZWFkZXIgcmV3cml0aW5nIGFuZCBDIHNvdXJjZSBmaWxlIGdlbmVyYXRpb24uIEl0IHNob3VsZCBiZSBtdWNoIGJldHRlcgogICAgIHRoYW4gdGhlIG9sZCBtZXRob2Q6IGl0IG5vdyB1c2VzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBVbGYncyBwYXJzZXIgdG8KICAgICByZWFkIHRoZSBBTlNJIHByb3RvdHlwZXMgaW4gYWxsIGhlYWRlciBmaWxlcyAodGh1cyB0aGUgb2xkIEsmUiBkZWZpbml0aW9ucwogICAgIGFyZW4ndCBuZWVkZWQgZm9yIGVycm9yIGNyZWF0aW9uIGFueSBtb3JlKSBhbmQgZG8gYSBiZXR0ZXIgam9iIG9mCiAgICAgdHJhbnNsYXRpbmcgZnVuY3Rpb24gY29kZXMgaW50byBuYW1lcy4gVGhlIG9sZCAnQVNOMSBlcnJvciBjb2RlIGltYmVkZGVkCiAgICAgaW4gYSBjb21tZW50JyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IGFuZCBpdCBkb2Vzbid0IHVzZSAuZXJyIGZpbGVzIHdoaWNoCiAgICAgaGF2ZSBub3cgYmVlbiBkZWxldGVkLiBBbHNvIHRoZSBlcnJvciBjb2RlIGNhbGwgZG9lc24ndCBoYXZlIHRvIGFwcGVhciBhbGwKICAgICBvbiBvbmUgbGluZSAod2hpY2ggcmVzdWx0ZWQgaW4gc29tZSBsYXJnZSBsaW5lcy4uLikuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlICNpbmNsdWRlIGZpbGVuYW1lcyBmcm9tIDxmb28uaD4gdG8gPG9wZW5zc2wvZm9vLmg+LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBiZWhhdmlvdXIgb2Ygc3NsMl9yZWFkIHdoZW4gZmFjaW5nIGxlbmd0aC0wIHBhY2tldHM6IERvbid0IHJldHVybgogICAgIDAgKHdoaWNoIHVzdWFsbHkgaW5kaWNhdGVzIGEgY2xvc2VkIGNvbm5lY3Rpb24pLCBidXQgY29udGludWUgcmVhZGluZy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggc29tZSByYWNlIGNvbmRpdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIENSTCBkaXN0cmlidXRpb24gcG9pbnRzIGV4dGVuc2lvbi4gQWRkIENlcnRpZmljYXRlCiAgICAgUG9saWNpZXMgYW5kIENSTCBkaXN0cmlidXRpb24gcG9pbnRzIGRvY3VtZW50YXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW92ZSB0aGUgYXV0b2dlbmVyYXRlZCBoZWFkZXIgZmlsZSBwYXJ0cyB0byBjcnlwdG8vb3BlbnNzbGNvbmYuaC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IG5ldyA1Ni1iaXQgREVTIGV4cG9ydCBjaXBoZXJzdWl0ZXM6IHRoZXkgd2VyZSB1c2luZyA3IGJ5dGVzIGluc3RlYWQgb2YKICAgICA4IG9mIGtleWluZyBtYXRlcmlhbC4gTWVybGluIGhhcyBhbHNvIGNvbmZpcm1lZCBpbnRlcm9wIHdpdGggdGhpcyBmaXgKICAgICBiZXR3ZWVuIE9wZW5TU0wgYW5kIEJhbHRpbW9yZSBDL1NTTCAyLjAgYW5kIEovU1NMIDIuMC4KICAgICBbTWVybGluIEh1Z2hlcyA8bWVybGluQGJhbHRpbW9yZS5pZT5dCgogICopIEZpeCBsb3RzIG9mIHdhcm5pbmdzLgogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQogCiAgKikgSW4gYWRkX2NlcnRfZGlyKCkgaW4gY3J5cHRvL3g1MDkvYnlfZGlyLmMsIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBpZgogICAgIHRoZSBkaXJlY3Rvcnkgc3BlYyBkaWRuJ3QgZW5kIHdpdGggYSBMSVNUX1NFUEFSQVRPUl9DSEFSLgogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQogCiAgKikgRml4IHByb2JsZW1zIHdpdGggc2l6ZW9mKGxvbmcpID09IDguCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgQ2hhbmdlIGZ1bmN0aW9ucyB0byBBTlNJIEMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCB0eXBvcyBpbiBlcnJvciBjb2Rlcy4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaFAuU2llbWVucy5EZT4sIFVsZiBN9mxsZXJdCgogICopIFJlbW92ZSBkZWZ1bmN0IGFzc2VtYmxlciBmaWxlcyBmcm9tIENvbmZpZ3VyZS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU1BBUkMgdjggYXNzZW1ibGVyIEJJR05VTSBpbXBsZW1lbnRhdGlvbi4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBTdXBwb3J0IGZvciBDZXJ0aWZpY2F0ZSBQb2xpY2llcyBleHRlbnNpb246IGJvdGggcHJpbnQgYW5kIHNldC4KICAgICBWYXJpb3VzIGFkZGl0aW9ucyB0byBzdXBwb3J0IHRoZSByMmkgbWV0aG9kIHRoaXMgdXNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBIGxvdCBvZiBjb25zdGlmaWNhdGlvbiwgYW5kIGZpeCBhIGJ1ZyBpbiBYNTA5X05BTUVfb25lbGluZSgpIHRoYXQgY291bGQKICAgICByZXR1cm4gYSBjb25zdCBzdHJpbmcgd2hlbiB5b3UgYXJlIGV4cGVjdGluZyBhbiBhbGxvY2F0ZWQgYnVmZmVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgQVNOMSB0eXBlcyBVVEY4U3RyaW5nIGFuZCBWSVNJQkxFU1RSSU5HLCBhbHNvIHRoZSBDSE9JQ0UKICAgICB0eXBlcyBEaXJlY3RvcnlTdHJpbmcgYW5kIERpc3BsYXlUZXh0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjb2RlIHRvIGFsbG93IHIyaSBleHRlbnNpb25zIHRvIGFjY2VzcyB0aGUgY29uZmlndXJhdGlvbiBkYXRhYmFzZSwKICAgICBhZGQgYW4gTEhBU0ggZGF0YWJhc2UgZHJpdmVyIGFuZCBhZGQgc2V2ZXJhbCBjdHggaGVscGVyIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYW4gZXZpbCBidWcgaW4gYm5fZXhwYW5kMigpIHdoaWNoIGNhdXNlZCB2YXJpb3VzIEJOIGZ1bmN0aW9ucyB0bwogICAgIGZhaWwgd2hlbiB0aGV5IGV4dGVuZGVkIHRoZSBzaXplIG9mIGEgQklHTlVNLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMgdG8gaGFuZGxlIFNYTmV0IGV4dGVuc2lvbi4gTW9kaWZ5IG1rZGVmLnBsIHRvCiAgICAgc3VwcG9ydCB0eXBlc2FmZSBzdGFjay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdHlwbyBpbiBTU0xfW2dzXWV0X29wdGlvbnMoKS4KICAgICBbTmlscyBGcm9zdGJlcmcgPG5pbHNAbWVkY29tLnNlPl0KCiAgKikgRGVsZXRlIHZhcmlvdXMgZnVuY3Rpb25zIGFuZCBmaWxlcyB0aGF0IGJlbG9uZ2VkIHRvIHRoZSAobm93IG9ic29sZXRlKQogICAgIG9sZCBYNTA5VjMgaGFuZGxpbmcgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbiAicnNhcmVmIi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRG9uJ3QgYXV0by1nZW5lcmF0ZSBwZW0uaC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbnRyb2R1Y2UgdHlwZS1zYWZlIEFTTi4xIFNFVHMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENvbnZlcnQgdmFyaW91cyBhZGRpdGlvbmFsIGNhc3RlZCBzdGFja3MgdG8gdHlwZS1zYWZlIFNUQUNLX09GKCkgdmFyaWFudHMuCiAgICAgW0JlbiBMYXVyaWUsIFJhbGYgUy4gRW5nZWxzY2hhbGwsIFN0ZXZlIEhlbnNvbl0KCiAgKikgSW50cm9kdWNlIHR5cGUtc2FmZSBTVEFDS3MuIFRoaXMgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJyZWFrIGxvdHMgb2YgY29kZQogICAgIHRoYXQgbGlua3Mgd2l0aCBPcGVuU1NMICh3ZWxsIGF0IGxlYXN0IGNhdXNlIGxvdHMgb2Ygd2FybmluZ3MpLCBidXQgZmVhcgogICAgIG5vdDogdGhlIGNvbnZlcnNpb24gaXMgdHJpdmlhbCwgYW5kIGl0IGVsaW1pbmF0ZXMgbG9hZHMgb2YgZXZpbCBjYXN0cy4gQQogICAgIGZldyBTVEFDS2VkIHRoaW5ncyBoYXZlIGJlZW4gY29udmVydGVkIGFscmVhZHkuIEZlZWwgZnJlZSB0byBjb252ZXJ0IG1vcmUuCiAgICAgSW4gdGhlIGZ1bGxuZXNzIG9mIHRpbWUsIEknbGwgZG8gYXdheSB3aXRoIHRoZSBTVEFDSyB0eXBlIGFsdG9nZXRoZXIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBgb3BlbnNzbCBjYSAtcmV2b2tlIDxjZXJ0ZmlsZT4nIGZhY2lsaXR5IHdoaWNoIHJldm9rZXMgYSBjZXJ0aWZpY2F0ZQogICAgIHNwZWNpZmllZCBpbiA8Y2VydGZpbGU+IGJ5IHVwZGF0aW5nIHRoZSBlbnRyeSBpbiB0aGUgaW5kZXgudHh0IGZpbGUuCiAgICAgVGhpcyB3YXkgb25lIG5vIGxvbmdlciBoYXMgdG8gZWRpdCB0aGUgaW5kZXgudHh0IGZpbGUgbWFudWFsbHkgZm9yCiAgICAgcmV2b2tpbmcgYSBjZXJ0aWZpY2F0ZS4gVGhlIC1yZXZva2Ugb3B0aW9uIGRvZXMgdGhlIGdvcnkgZGV0YWlscyBub3cuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQG9wZW5jYS5vcmc+LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggYG9wZW5zc2wgY3JsIC1ub291dCAtdGV4dCcgY29tYmluYXRpb24gd2hlcmUgYC1ub291dCcga2lsbGVkIHRoZQogICAgIGAtdGV4dCcgb3B0aW9uIGF0IGFsbCBhbmQgdGhpcyB3YXkgdGhlIGAtbm9vdXQgLXRleHQnIGNvbWJpbmF0aW9uIHdhcwogICAgIGluY29uc2lzdGVudCBpbiBgb3BlbnNzbCBjcmwnIHdpdGggdGhlIGZyaWVuZHMgaW4gYG9wZW5zc2wgeDUwOXxyc2F8ZHNhJy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBzdXJlIGEgY29ycmVzcG9uZGluZyBwbGFpbiB0ZXh0IGVycm9yIG1lc3NhZ2UgZXhpc3RzIGZvciB0aGUKICAgICBYNTA5X1ZfRVJSX0NFUlRfUkVWT0tFRC8yMyBlcnJvciBudW1iZXIgd2hpY2ggY2FuIG9jY3VyIHdoZW4gYQogICAgIHZlcmlmeSBjYWxsYmFjayBmdW5jdGlvbiBkZXRlcm1pbmVkIHRoYXQgYSBjZXJ0aWZpY2F0ZSB3YXMgcmV2b2tlZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQnVnZml4OiBJbiB0ZXN0L3Rlc3RlbmMsIGRvbid0IHRlc3QgIm9wZW5zc2wgPGNpcGhlcj4iIGZvcgogICAgIGNpcGhlcnMgdGhhdCB3ZXJlIGV4Y2x1ZGVkLCBlLmcuIGJ5IC1ETk9fSURFQS4gIEFsc28sIHRlc3QKICAgICBhbGwgYXZhaWxhYmxlIGNpcGVycyBpbmNsdWRpbmcgcmM1LCB3aGljaCB3YXMgZm9yZ290dGVuIHVudGlsIG5vdy4KICAgICBJbiBvcmRlciB0byBsZXQgdGhlIHRlc3Rpbmcgc2hlbGwgc2NyaXB0IGtub3cgd2hpY2ggYWxnb3JpdGhtcwogICAgIGFyZSBhdmFpbGFibGUsIGEgbmV3ICh1cCB0byBub3cgdW5kb2N1bWVudGVkKSBjb21tYW5kCiAgICAgIm9wZW5zc2wgbGlzdC1jaXBoZXItY29tbWFuZHMiIGlzIHVzZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4OiBzX2NsaWVudCBvY2Nhc2lvbmFsbHkgd291bGQgc2xlZXAgaW4gc2VsZWN0KCkgd2hlbgogICAgIGl0IHNob3VsZCBoYXZlIGNoZWNrZWQgU1NMX3BlbmRpbmcoKSBmaXJzdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb25zIERTQV9kb19zaWduIGFuZCBEU0FfZG9fdmVyaWZ5IHRvIHByb3ZpZGUgYWNjZXNzIHRvCiAgICAgdGhlIHJhdyBEU0EgdmFsdWVzIHByaW9yIHRvIEFTTi4xIGVuY29kaW5nLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBUd2Vha3MgdG8gQ29uZmlndXJlCiAgICAgW05pZWxzIFBvcHBlIDxuaWVsc0BuZXRib3gub3JnPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFBLQ1MjNSB2Mi4wIEFTTjEgUEJFUzIgc3RydWN0dXJlcy4gTm8gb3RoZXIgc3VwcG9ydCwKICAgICB5ZXQuLi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgdmFyaWFibGVzICQoUkFOTElCKSBhbmQgJChQRVJMKSBpbiB0aGUgTWFrZWZpbGVzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBOZXcgY29uZmlnIG9wdGlvbiB0byBhdm9pZCBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgaWxsZWdhbCBvbiB0aGUgODAzODYuCiAgICAgVGhlIGRlZmF1bHQgY29kZSBpcyBmYXN0ZXIsIGJ1dCByZXF1aXJlcyBhdCBsZWFzdCBhIDQ4Ni4KICAgICBbVWxmIE32bGxlcl0KICAKICAqKSBHb3QgcmlkIG9mIG9sZCBTU0wyX0NMSUVOVF9WRVJTSU9OIChpbmNvbnNpc3RlbnRseSB1c2VkKSBhbmQKICAgICBTU0wyX1NFUlZFUl9WRVJTSU9OIChub3QgdXNlZCBhdCBhbGwpIG1hY3Jvcywgd2hpY2ggYXJlIG5vdyB0aGUKICAgICBzYW1lIGFzIFNTTDJfVkVSU0lPTiBhbnl3YXkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3ICItc2hvd2NlcnRzIiBvcHRpb24gZm9yIHNfY2xpZW50LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFN0aWxsIG1vcmUgUEtDUyMxMiBpbnRlZ3JhdGlvbi4gQWRkIHBrY3MxMiBhcHBsaWNhdGlvbiB0byBvcGVuc3NsCiAgICAgYXBwbGljYXRpb24uIFZhcmlvdXMgY2xlYW51cHMgYW5kIGZpeGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vcmUgUEtDUyMxMiBpbnRlZ3JhdGlvbi4gQWRkIG5ldyBwa2NzMTIgZGlyZWN0b3J5IHdpdGggTWFrZWZpbGUuc3NsIGFuZAogICAgIG1vZGlmeSBlcnJvciByb3V0aW5lcyB0byB3b3JrIGludGVybmFsbHkuIEFkZCBlcnJvciBjb2RlcyBhbmQgUEJFIGluaXQKICAgICB0byBsaWJyYXJ5IHN0YXJ0dXAgcm91dGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRnVydGhlciBQS0NTIzEyIGludGVncmF0aW9uLiBBZGRlZCBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uLCBQS0NTIzggYW5kCiAgICAgcGFja2luZyBmdW5jdGlvbnMgdG8gYXNuMSBhbmQgZXZwLiBDaGFuZ2VkIGZ1bmN0aW9uIG5hbWVzIGFuZCBlcnJvcgogICAgIGNvZGVzIGFsb25nIHRoZSB3YXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUEtDUzEyIGludGVncmF0aW9uOiBhbmQgc28gaXQgYmVnaW5zLi4uIEZpcnN0IG9mIHNldmVyYWwgcGF0Y2hlcyB0bwogICAgIHNsb3dseSBpbnRlZ3JhdGUgUEtDUyMxMiBmdW5jdGlvbmFsaXR5IGludG8gT3BlblNTTC4gQWRkIFBLQ1MjMTIKICAgICBvYmplY3RzIHRvIG9iamVjdHMuaAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIG5ldyAnaW5kZW50JyBvcHRpb24gdG8gc29tZSBYNTA5VjMgZXh0ZW5zaW9uIGNvZGUuIEluaXRpYWwgQVNOMQogICAgIGFuZCBkaXNwbGF5IHN1cHBvcnQgZm9yIFRoYXd0ZSBzdHJvbmcgZXh0cmFuZXQgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBMaW51eFBQQyBzdXBwb3J0LgogICAgIFtKZWZmIER1YnJ1bGUgPGlnb3JAcG9ib3gub3JnPl0KCiAgKikgR2V0IHJpZCBvZiByZWR1bmRhbnQgQk4gZmlsZSBibl9tdWx3LmMsIGFuZCByZW5hbWUgYm5fZGl2NjQgdG8KICAgICBibl9kaXZfd29yZHMgaW4gYWxwaGEucy4KICAgICBbSGFubmVzIFJlaW5lY2tlIDxILlJlaW5lY2tlQGh3LmFjLnVrPiBhbmQgQmVuIExhdXJpZV0KCiAgKikgTWFrZSBzdXJlIHRoZSBSU0EgT0FFUCB0ZXN0IGlzIHNraXBwZWQgdW5kZXIgLURSU0FyZWYgYmVjYXVzZQogICAgIE9BRVAgaXNuJ3Qgc3VwcG9ydGVkIHdoZW4gT3BlblNTTCBpcyBidWlsdCB3aXRoIFJTQXJlZi4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIE1vdmUgZGVmaW5pdGlvbnMgb2YgSVNfU0VUL0lTX1NFUVVFTkNFIGluc2lkZSBjcnlwdG8vYXNuMS9hc24xLmggCiAgICAgc28gdGhleSBubyBsb25nZXIgYXJlIG1pc3NpbmcgdW5kZXIgLUROT1BST1RPLiAKICAgICBbU29yZW4gUy4gSm9ydmFuZyA8c29yZW5AdC5kaz5dCgoKIENoYW5nZXMgYmV0d2VlbiAwLjkuMWMgYW5kIDAuOS4yYiAgWzIyIE1hciAxOTk5XQoKICAqKSBNYWtlIFNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKCkgd29yayBpbiBzZXJ2ZXJzLiBVbmZvcnR1bmF0ZWx5LCBpdCBzdGlsbAogICAgIGRvZXNuJ3Qgd29yayB3aGVuIHRoZSBzZXNzaW9uIGlzIHJldXNlZC4gQ29taW5nIHNvb24hCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCBhIHNlY3VyaXR5IGhvbGUsIHRoYXQgYWxsb3dzIHNlc3Npb25zIHRvIGJlIHJldXNlZCBpbiB0aGUgd3JvbmcKICAgICBjb250ZXh0IHRodXMgYnlwYXNzaW5nIGNsaWVudCBjZXJ0IHByb3RlY3Rpb24hIEFsbCBzb2Z0d2FyZSB0aGF0IHVzZXMKICAgICBjbGllbnQgY2VydHMgYW5kIHNlc3Npb24gY2FjaGVzIGluIG11bHRpcGxlIGNvbnRleHRzIE5FRURTIFBBVENISU5HIHRvCiAgICAgYWxsb3cgc2Vzc2lvbiByZXVzZSEgQSBmdWxsZXIgc29sdXRpb24gaXMgaW4gdGhlIHdvcmtzLgogICAgIFtCZW4gTGF1cmllLCBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEhvbGdlciBSZWlmLCBCb2RvIE1vZWxsZXIgKGFuZCA/Pz8pXQoKICAqKSBTb21lIG1vcmUgc291cmNlIHRyZWUgY2xlYW51cHMgKHJlbW92ZWQgb2Jzb2xldGUgZmlsZXMKICAgICBjcnlwdG8vYmYvYXNtL2JmNTg2LnBsLCB0ZXN0L3Rlc3QudHh0IGFuZCBjcnlwdG8vc2hhL2FzbS9mLnM7IGNoYW5nZWQKICAgICBwZXJtaXNzaW9uIG9uICJjb25maWciIHNjcmlwdCB0byBiZSBleGVjdXRhYmxlKSBhbmQgYSBmaXggZm9yIHRoZSBJTlNUQUxMCiAgICAgZG9jdW1lbnQuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBSZW1vdmUgc29tZSBsZWdhY3kgYW5kIGVycm9uZW91cyB1c2VzIG9mIG1hbGxvYywgZnJlZSBpbnN0ZWFkIG9mCiAgICAgTWFsbG9jLCBGcmVlLgogICAgIFtMZW5uYXJ0IEJhbmcgPGxvYkBuZXRzdHJlYW0uc2U+LCB3aXRoIG1pbm9yIGNoYW5nZXMgYnkgU3RldmVdCgogICopIE1ha2UgcnNhX29hZXBfdGVzdCByZXR1cm4gbm9uLXplcm8gb24gZXJyb3IuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgbmF0aXZlIFNvbGFyaXMgc2hhcmVkIGxpYnJhcmllcy4gQ29uZmlndXJlCiAgICAgc29sYXJpcy1zcGFyYy1zYzQtcGljLCBtYWtlLCB0aGVuIHJ1biBzaGxpYi9zb2xhcmlzLXNjNC5zaC4gSXQnZCBiZSBuaWNlCiAgICAgaWYgc29tZW9uZSB3b3VsZCBtYWtlIHRoYXQgbGFzdCBzdGVwIGF1dG9tYXRpYy4KICAgICBbTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAQWROb3Z1bS5DSD5dCgogICopIGN0eF9zaXplIHdhcyBub3QgYnVpbHQgd2l0aCB0aGUgcmlnaHQgY29tcGlsZXIgZHVyaW5nICJtYWtlIGxpbmtzIi4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENoYW5nZSB0aGUgbWVhbmluZyBvZiAnQUxMJyBpbiB0aGUgY2lwaGVyIGxpc3QuIEl0IG5vdyBtZWFucyAiZXZlcnl0aGluZwogICAgIGV4Y2VwdCBOVUxMIGNpcGhlcnMiLiBUaGlzIG1lYW5zIHRoZSBkZWZhdWx0IGNpcGhlciBsaXN0IHdpbGwgbm8gbG9uZ2VyCiAgICAgZW5hYmxlIE5VTEwgY2lwaGVycy4gVGhleSBuZWVkIHRvIGJlIHNwZWNpZmljYWxseSBlbmFibGVkIGUuZy4gd2l0aAogICAgIHRoZSBzdHJpbmcgIkRFRkFVTFQ6ZU5VTEwiLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0byBSU0EgcHJpdmF0ZSBlbmNyeXB0aW9uIHJvdXRpbmVzOiBpZiBwIDwgcSB0aGVuIGl0IHdvdWxkCiAgICAgb2NjYXNpb25hbGx5IHByb2R1Y2UgYW4gaW52YWxpZCByZXN1bHQuIFRoaXMgd2lsbCBvbmx5IGhhcHBlbiB3aXRoCiAgICAgZXh0ZXJuYWxseSBnZW5lcmF0ZWQga2V5cyBiZWNhdXNlIE9wZW5TU0wgKGFuZCBTU0xlYXkpIGVuc3VyZSBwID4gcS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCZSBsZXNzIHJlc3RyaWN0aXZlIGFuZCBhbGxvdyBhbHNvIGBwZXJsIHV0aWwvcGVybHBhdGgucGwKICAgICAvcGF0aC90by9iaW4vcGVybCcgaW4gYWRkaXRpb24gdG8gYHBlcmwgdXRpbC9wZXJscGF0aC5wbCAvcGF0aC90by9iaW4nLAogICAgIGJlY2F1c2UgdGhpcyB3YXkgb25lIGNhbiBhbHNvIHVzZSBhbiBpbnRlcnByZXRlciBuYW1lZCBgcGVybDUnICh3aGljaCBpcwogICAgIHVzdWFsbHkgdGhlIG5hbWUgb2YgUGVybCA1Lnh4eCBvbiBwbGF0Zm9ybXMgd2hlcmUgYW4gUGVybCA0LnggaXMgc3RpbGwKICAgICBpbnN0YWxsZWQgYXMgYHBlcmwnKS4KICAgICBbTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIExldCB1dGlsL2NsZWFuLWRlcGVuZC5wbCB3b3JrIGFsc28gd2l0aCBvbGRlciBQZXJsIDUuMDB4IHZlcnNpb25zLgogICAgIFtNYXR0aGlhcyBMb2VwZmUgPE1hdHRoaWFzLkxvZXBmZUBhZG5vdnVtLmNoPl0KCiAgKikgRml4IE1ha2VmaWxlLm9yZyBzbyBDQyxDRkxBRyBldGMgYXJlIHBhc3NlZCB0byAnbWFrZSBsaW5rcycgYWRkCiAgICAgYWR2YXBpMzIubGliIHRvIFdpbjMyIGJ1aWxkIGFuZCBjaGFuZ2UgdGhlIHBlbSB0ZXN0IGNvbXBhcmlzb24KICAgICB0byBmYy5leGUgKHRoYW5rcyB0byBVbHJpY2ggS3JvZW5lciA8a3JvbmVydUB5YWhvby5jb20+IGZvciB0aGUKICAgICBzdWdnZXN0aW9uKS4gRml4IG1pc3BsYWNlZCBBU05JIHByb3RvdHlwZXMgYW5kIGRlY2xhcmF0aW9ucyBpbiBldnAuaAogICAgIGFuZCBjcnlwdG8vZGVzL2VkZV9jYmNtX2VuYy5jLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERFUyBxdWFkIGNoZWNrc3VtIHdhcyBicm9rZW4gb24gYmlnLWVuZGlhbiBhcmNoaXRlY3R1cmVzLiBGaXhlZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ29tbWVudCBvdXQgdHdvIGZ1bmN0aW9ucyBpbiBiaW8uaCB0aGF0IGFyZW4ndCBpbXBsZW1lbnRlZC4gRml4IHVwIHRoZQogICAgIFdpbjMyIHRlc3QgYmF0Y2ggZmlsZSBzbyBpdCAobWlnaHQpIHdvcmsgYWdhaW4uIFRoZSBXaW4zMiB0ZXN0IGJhdGNoIGZpbGUKICAgICBpcyBob3JyaWJsZTogSSBmZWVsIGlsbC4uLi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3ZlIHZhcmlvdXMgI2lmZGVmcyBhcm91bmQgc28gTk9fU1lTTE9HLCBOT19ESVJFTlQgZXRjIGFyZSBub3cgc2VsZWN0ZWQKICAgICBpbiBlX29zLmguIEF1ZGl0IG9mIGhlYWRlciBmaWxlcyB0byBjaGVjayBBTlNJIGFuZCBub24gQU5TSQogICAgIHNlY3Rpb25zOiAxMCBmdW5jdGlvbnMgd2VyZSBhYnNlbnQgZnJvbSBub24gQU5TSSBzZWN0aW9uIGFuZCBub3QgZXhwb3J0ZWQKICAgICBmcm9tIFdpbmRvd3MgRExMcy4gRml4ZWQgdXAgbGliZWF5Lm51bSBmb3IgbmV3IGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGBvcGVuc3NsIHZlcnNpb24nIG91dHB1dCBsaW5lcyBjb25zaXN0ZW50LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggV2luMzIgc3ltYm9sIGV4cG9ydCBsaXN0cyBmb3IgQklPIGZ1bmN0aW9uczogQWRkZWQKICAgICBCSU9fZ2V0X2V4X25ld19pbmRleCwgQklPX2dldF9leF9udW0sIEJJT19nZXRfZXhfZGF0YSBhbmQgQklPX3NldF9leF9kYXRhCiAgICAgdG8gbXMvbGliZWF5ezE2LDMyfS5kZWYuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFNlY29uZCByb3VuZCBvZiBmaXhpbmcgdGhlIE9wZW5TU0wgcGVybC8gc3R1ZmYuIEl0IG5vdyBhdCBsZWFzdCBjb21waWxlZAogICAgIGZpbmUgdW5kZXIgVW5peCBhbmQgcGFzc2VzIHNvbWUgdHJpdmlhbCB0ZXN0cyBJJ3ZlIG5vdyBhZGRlZC4gQnV0IHRoZQogICAgIHdob2xlIHN0dWZmIGlzIGhvcnJpYmx5IGluY29tcGxldGUsIHNvIGEgUkVBRE1FLjFTVCB3aXRoIGEgZGlzY2xhaW1lciB3YXMKICAgICBhZGRlZCB0byBtYWtlIHN1cmUgbm8gb25lIGV4cGVjdHMgdGhhdCB0aGlzIHN0dWZmIHJlYWxseSB3b3JrcyBpbiB0aGUKICAgICBPcGVuU1NMIDAuOS4yIHJlbGVhc2UuICBBZGRpdGlvbmFsbHkgSSd2ZSBzdGFydGVkIHRvIGNsZWFuIHRoZSBYUyBzb3VyY2VzCiAgICAgdXAgYW5kIGZpeGVkIGEgZmV3IGxpdHRsZSBidWdzIGFuZCBpbmNvbnNpc3RlbmNpZXMgaW4gT3BlblNTTC57cG0seHN9IGFuZAogICAgIG9wZW5zc2xfYmlvLnhzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggdGhlIGdlbmVyYXRpb24gb2YgdHdvIHBhcnQgYWRkcmVzc2VzIGluIHBlcmwuCiAgICAgW0tlbmppIE1peWFrZSA8a2VuamlAbWl5YWtlLm9yZz4sIGludGVncmF0ZWQgYnkgQmVuIExhdXJpZV0KCiAgKikgQWRkIGNvbmZpZyBlbnRyeSBmb3IgTGludXggb24gTUlQUy4KICAgICBbSm9obiBUb2JleSA8anRvYmV5QGNoYW5uZWwxLmNvbT5dCgogICopIE1ha2UgbGlua3Mgd2hlbmV2ZXIgQ29uZmlndXJlIGlzIHJ1biwgdW5sZXNzIHdlIGFyZSBvbiBXaW5kb3plLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBQZXJtaXQgZXh0ZW5zaW9ucyB0byBiZSBhZGRlZCB0byBDUkxzIHVzaW5nIGNybF9zZWN0aW9uIGluIG9wZW5zc2wuY25mLgogICAgIEN1cnJlbnRseSBvbmx5IGlzc3VlckFsdE5hbWUgYW5kIEF1dGhvcml0eUtleUlkZW50aWZpZXIgbWFrZSBhbnkgc2Vuc2UKICAgICBpbiBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIHVzZWZ1bCBrbHVkZ2UgdG8gYWxsb3cgcGFja2FnZSBtYWludGFpbmVycyB0byBzcGVjaWZ5IGNvbXBpbGVyIGFuZAogICAgIG90aGVyIHBsYXRmb3JtcyBkZXRhaWxzIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aG91dCBoYXZpbmcgdG8gcGF0Y2ggdGhlCiAgICAgQ29uZmlndXJlIHNjcmlwdCBldmVyeXRpbWU6IE9uZSBub3cgY2FuIHVzZSBgYHBlcmwgQ29uZmlndXJlCiAgICAgPGlkPjo8ZGV0YWlscz4nJywgaS5lLiBwbGF0Zm9ybSBpZHMgYXJlIGFsbG93ZWQgdG8gaGF2ZSBkZXRhaWxzIGFwcGVuZGVkCiAgICAgdG8gdGhlbSAoc2VwYXJhdGVkIGJ5IGNvbG9ucykuIFRoaXMgaXMgdHJlYXRlZCBhcyB0aGVyZSB3b3VsZCBiZSBhIHN0YXRpYwogICAgIHByZS1jb25maWd1cmVkIGVudHJ5IGluIENvbmZpZ3VyZSdzICV0YWJsZSB1bmRlciBrZXkgPGlkPiB3aXRoIHZhbHVlCiAgICAgPGRldGFpbHM+IGFuZCBgYHBlcmwgQ29uZmlndXJlIDxpZD4nJyBpcyBjYWxsZWQuICBTbywgd2hlbiB5b3Ugd2FudCB0bwogICAgIHBlcmZvcm0gYSBxdWljayB0ZXN0LWNvbXBpbGUgdW5kZXIgRnJlZUJTRCAzLjEgd2l0aCBwZ2NjIGFuZCB3aXRob3V0CiAgICAgYXNzZW1ibGVyIHN0dWZmIHlvdSBjYW4gdXNlIGBgcGVybCBDb25maWd1cmUgIkZyZWVCU0QtZWxmOnBnY2M6LU82Ojo6IicnCiAgICAgbm93LCB3aGljaCBvdmVycmlkZXMgdGhlIEZyZWVCU0QtZWxmIGVudHJ5IG9uLXRoZS1mbHkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIERpc2FibGUgbmV3IFRMUzEgY2lwaGVyc3VpdGVzIGJ5IGRlZmF1bHQ6IHRoZXkgYXJlbid0IG9mZmljaWFsIHlldC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWxsb3cgRFNPIGZsYWdzIGxpa2UgLWZwaWMsIC1mUElDLCAtS1BJQyBldGMuIHRvIGJlIHNwZWNpZmllZAogICAgIG9uIHRoZSBgcGVybCBDb25maWd1cmUgLi4uJyBjb21tYW5kIGxpbmUuIFRoaXMgd2F5IG9uZSBjYW4gY29tcGlsZQogICAgIE9wZW5TU0wgbGlicmFyaWVzIHdpdGggUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAoUElDKSB3aGljaCBpcyBuZWVkZWQKICAgICBmb3IgbGlua2luZyBpdCBpbnRvIERTT3MuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlbWFya2FibHksIGV4cG9ydCBjaXBoZXJzIHdlcmUgdG90YWxseSBicm9rZW4gYW5kIG5vLW9uZSBoYWQgbm90aWNlZCEKICAgICBGaXhlZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2xlYW5lZCB1cCB0aGUgTElDRU5TRSBkb2N1bWVudDogVGhlIG9mZmljaWFsIGNvbnRhY3QgZm9yIGFueSBsaWNlbnNlCiAgICAgcXVlc3Rpb25zIG5vdyBpcyB0aGUgT3BlblNTTCBjb3JlIHRlYW0gdW5kZXIgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgogICAgIEFuZCBhZGQgYSBwYXJhZ3JhcGggYWJvdXQgdGhlIGR1YWwtbGljZW5zZSBzaXR1YXRpb24gdG8gbWFrZSBzdXJlIHBlb3BsZQogICAgIHJlY29nbml6ZSB0aGF0IF9CT1RIXyB0aGUgT3BlblNTTCBsaWNlbnNlIF9BTkRfIHRoZSBTU0xlYXkgbGljZW5zZSBhcHBseQogICAgIHRvIHRoZSBPcGVuU1NMIHRvb2xraXQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEdlbmVyYWwgc291cmNlIHRyZWUgbWFrZWZpbGUgY2xlYW51cHM6IE1hZGUgYG1ha2luZyB4eHggaW4geXl5Li4uJwogICAgIGRpc3BsYXkgY29uc2lzdGVudCBpbiB0aGUgc291cmNlIHRyZWUgYW5kIHJlcGxhY2VkIGAvYmluL3JtJyBieSBgcm0nLgogICAgIEFkZGl0aW9uYWxseSBjbGVhbmVkIHVwIHRoZSBgbWFrZSBsaW5rcycgdGFyZ2V0OiBSZW1vdmUgdW5uZWNlc3NhcnkKICAgICBzZW1pY29sb25zLCBzdWJzZXF1ZW50IHJlZHVuZGFudCByZW1vdmVzLCBpbmxpbmUgcG9pbnQuc2ggaW50byBta2xpbmsuc2gKICAgICB0byBzcGVlZCBwcm9jZXNzaW5nIGFuZCBubyBsb25nZXIgY2x1dHRlciB0aGUgZGlzcGxheSB3aXRoIGNvbmZ1c2luZwogICAgIHN0dWZmLiBJbnN0ZWFkIG9ubHkgdGhlIGFjdHVhbGx5IGRvbmUgbGlua3MgYXJlIGRpc3BsYXllZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUGVybWl0IG51bGwgZW5jcnlwdGlvbiBjaXBoZXJzdWl0ZXMsIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIG9ubHkuIEl0IHVzZWQKICAgICB0byBiZSBuZWNlc3NhcnkgdG8gc2V0IHRoZSBwcmVwcm9jZXNzb3IgZGVmaW5lIFNTTF9BTExPV19FTlVMTCB0byBkbyB0aGlzLgogICAgIEl0IGlzIG5vdyBuZWNlc3NhcnkgdG8gc2V0IFNTTF9GT1JCSURfRU5VTEwgdG8gcHJldmVudCB0aGUgdXNlIG9mIG51bGwKICAgICBlbmNyeXB0aW9uLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYSBidW5jaCBvZiBmaXhlcyB0byB0aGUgUEtDUyM3IHN0dWZmLiBJdCB1c2VkIHRvIHNvbWV0aW1lcyByZW9yZGVyCiAgICAgc2lnbmVkIGF0dHJpYnV0ZXMgd2hlbiB2ZXJpZnlpbmcgc2lnbmF0dXJlcyAodGhpcyB3b3VsZCBicmVhayB0aGVtKSwgCiAgICAgdGhlIGRldGFjaGVkIGRhdGEgZW5jb2Rpbmcgd2FzIHdyb25nIGFuZCBwdWJsaWMga2V5cyBvYnRhaW5lZCB1c2luZwogICAgIFg1MDlfZ2V0X3B1YmtleSgpIHdlcmVuJ3QgZnJlZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRleHQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEJVRkZFUiBmdW5jdGlvbnMuIEFsc28gYWRkZWQgYSB3b3JrIGFyb3VuZAogICAgIHRvIGEgV2luOTUgY29uc29sZSBidWcuIFRoaXMgd2FzIHRyaWdnZXJlZCBieSB0aGUgcGFzc3dvcmQgcmVhZCBzdHVmZjogdGhlCiAgICAgbGFzdCBjaGFyYWN0ZXIgdHlwZWQgZ2V0cyBjYXJyaWVkIG92ZXIgdG8gdGhlIG5leHQgZnJlYWQoKS4gSWYgeW91IHdlcmUgCiAgICAgZ2VuZXJhdGluZyBhIG5ldyBjZXJ0IHJlcXVlc3QgdXNpbmcgJ3JlcScgZm9yIGV4YW1wbGUgdGhlbiB0aGUgbGFzdAogICAgIGNoYXJhY3RlciBvZiB0aGUgcGFzc3BocmFzZSB3b3VsZCBiZSBDUiB3aGljaCB3b3VsZCB0aGVuIGVudGVyIHRoZSBmaXJzdAogICAgIGZpZWxkIGFzIGJsYW5rLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIHRoZSBuZXcgYEluY2x1ZGVzIE9wZW5TU0wgQ3J5cHRvZ3JhcGh5IFNvZnR3YXJlJyBidXR0b24gYXMKICAgICBkb2Mvb3BlbnNzbF9idXR0b24ue2dpZixodG1sfSB3aGljaCBpcyBzaW1pbGFyIGluIHN0eWxlIHRvIHRoZSBvbGQgU1NMZWF5CiAgICAgYnV0dG9uIGFuZCBjYW4gYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMgYmFzZWQgb24gT3BlblNTTCB0byBzaG93IHRoZQogICAgIHJlbGF0aW9uc2hpcCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LiAgCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlbW92ZSBjb25mdXNpbmcgdmFyaWFibGVzIGluIGZ1bmN0aW9uIHNpZ25hdHVyZXMgaW4gZmlsZXMKICAgICBzc2wvc3NsX2xpYi5jIGFuZCBzc2wvc3NsLmguCiAgICAgW0xlbm5hcnQgQm9uZyA8bG9iQGt1bHRoZWEuc3RhY2tlbi5rdGguc2U+XQoKICAqKSBEb24ndCBpbnN0YWxsIGJzc19maWxlLmMgdW5kZXIgUFJFRklYL2luY2x1ZGUvCiAgICAgW0xlbm5hcnQgQm9uZyA8bG9iQGt1bHRoZWEuc3RhY2tlbi5rdGguc2U+XQoKICAqKSBHZXQgdGhlIFdpbjMyIGNvbXBpbGUgd29ya2luZyBhZ2Fpbi4gTW9kaWZ5IG1rZGVmLnBsIHNvIGl0IGNhbiBoYW5kbGUKICAgICBmdW5jdGlvbnMgdGhhdCByZXR1cm4gZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGhhcyBzdXBwb3J0IGZvciBOVCBzcGVjaWZpYwogICAgIHN0dWZmLiBGaXggbWsxbWYucGwgYW5kIFZDLTMyLnBsIHRvIHN1cHBvcnQgTlQgZGlmZmVyZW5jZXMgYWxzby4gVmFyaW91cwogICAgICNpZmRlZiBXSU4zMiBhbmQgV0lOTlRzIHNwcmlua2xlZCBhYm91dCB0aGUgcGxhY2UgYW5kIHNvbWUgY2hhbmdlcyBmcm9tCiAgICAgdW5zaWduZWQgdG8gc2lnbmVkIHR5cGVzOiB0aGlzIHdhcyBraWxsaW5nIHRoZSBXaW4zMiBjb21waWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgY2VydGlmaWNhdGUgZmlsZSB0byBzdGFjayBmdW5jdGlvbnMsCiAgICAgU1NMX2FkZF9kaXJfY2VydF9zdWJqZWN0c190b19zdGFjaygpIGFuZAogICAgIFNTTF9hZGRfZmlsZV9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKCkuICBUaGVzZSBsYXJnZWx5IHN1cHBsYW50CiAgICAgU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUoKSwgYW5kIGNhbiBiZSB1c2VkIHRvIGFkZCBtdWx0aXBsZSBjZXJ0cyBlYXNpbHkKICAgICB0byBhIHN0YWNrICh1c3VhbGx5IHRoaXMgaXMgdGhlbiBoYW5kZWQgdG8gU1NMX0NUWF9zZXRfY2xpZW50X0NBX2xpc3QoKSkuCiAgICAgVGhpcyBtZWFucyB0aGF0IEFwYWNoZS1TU0wgYW5kIHNpbWlsYXIgcGFja2FnZXMgZG9uJ3QgaGF2ZSB0byBtZXNzIGFyb3VuZAogICAgIHRvIGFkZCBhcyBtYW55IENBcyBhcyB0aGV5IHdhbnQgdG8gdGhlIHByZWZlcnJlZCBsaXN0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBFeHBlcmltZW50IHdpdGggZG94eWdlbiBkb2N1bWVudGF0aW9uLiBDdXJyZW50bHkgb25seSBwYXJ0aWFsbHkgYXBwbGllZCB0bwogICAgIHNzbC9zc2xfbGliLmMuCiAgICAgU2VlIGh0dHA6Ly93d3cuc3RhY2submwvfmRpbWl0cmkvZG94eWdlbi9pbmRleC5odG1sLCBhbmQgcnVuIGRveHlnZW4gd2l0aAogICAgIG9wZW5zc2wuZG94eSBhcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgogICAgIFtCZW4gTGF1cmllXQogIAogICopIEdldCByaWQgb2YgcmVtYWluaW5nIEMrKy1zdHlsZSBjb21tZW50cyB3aGljaCBzdHJpY3QgQyBjb21waWxlcnMgaGF0ZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgcG9pbnRlZCBvdXQgYnkgQ2FybG9zIEFtZW5ndWFsXQoKICAqKSBDaGFuZ2VkIEJOX1JFQ1VSU0lPTiBpbiBibl9tb250LmMgdG8gQk5fUkVDVVJTSU9OX01PTlQgc28gaXQgaXMgbm90CiAgICAgY29tcGlsZWQgaW4gYnkgZGVmYXVsdDogaXQgaGFzIHByb2JsZW1zIHdpdGggbGFyZ2Uga2V5cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBidW5jaCBvZiBTU0xfeHh4KCkgZnVuY3Rpb25zIGZvciBjb25maWd1cmluZyB0aGUgdGVtcG9yYXJ5IFJTQSBhbmQKICAgICBESCBwcml2YXRlIGtleXMgYW5kL29yIGNhbGxiYWNrIGZ1bmN0aW9ucyB3aGljaCBkaXJlY3RseSBjb3JyZXNwb25kIHRvCiAgICAgdGhlaXIgU1NMX0NUWF94eHgoKSBjb3VudGVycGFydHMgYnV0IHdvcmsgb24gYSBwZXItY29ubmVjdGlvbiBiYXNpcy4gVGhpcwogICAgIGlzIG5lZWRlZCBmb3IgYXBwbGljYXRpb25zIHdoaWNoIGhhdmUgdG8gY29uZmlndXJlIGNlcnRpZmljYXRlcyBvbiBhCiAgICAgcGVyLWNvbm5lY3Rpb24gYmFzaXMgKGUuZy4gQXBhY2hlK21vZF9zc2wpIGluc3RlYWQgb2YgYSBwZXItY29udGV4dCBiYXNpcwogICAgIChlLmcuIHNfc2VydmVyKS4gCiAgICAgICAgRm9yIHRoZSBSU0EgY2VydGlmaWNhdGUgc2l0dWF0aW9uIGlzIG1ha2VzIG5vIGRpZmZlcmVuY2UsIGJ1dAogICAgIGZvciB0aGUgRFNBIGNlcnRpZmljYXRlIHNpdHVhdGlvbiB0aGlzIGZpeGVzIHRoZSAibm8gc2hhcmVkIGNpcGhlciIKICAgICBwcm9ibGVtIHdoZXJlIHRoZSBPcGVuU1NMIGNpcGhlciBzZWxlY3Rpb24gcHJvY2VkdXJlIGZhaWxlZCBiZWNhdXNlIHRoZQogICAgIHRlbXBvcmFyeSBrZXlzIHdlcmUgbm90IG92ZXJ0YWtlbiBmcm9tIHRoZSBjb250ZXh0IGFuZCB0aGUgQVBJIHByb3ZpZGVkCiAgICAgbm8gd2F5IHRvIHJlY29uZmlndXJlIHRoZW0uIAogICAgICAgIFRoZSBuZXcgZnVuY3Rpb25zIG5vdyBsZXQgYXBwbGljYXRpb25zIHJlY29uZmlndXJlIHRoZSBzdHVmZiBhbmQgdGhleQogICAgIGFyZSBpbiBkZXRhaWw6IFNTTF9uZWVkX3RtcF9SU0EsIFNTTF9zZXRfdG1wX3JzYSwgU1NMX3NldF90bXBfZGgsCiAgICAgU1NMX3NldF90bXBfcnNhX2NhbGxiYWNrIGFuZCBTU0xfc2V0X3RtcF9kaF9jYWxsYmFjay4gIEFkZGl0aW9uYWxseSBhIG5ldwogICAgIG5vbi1wdWJsaWMtQVBJIGZ1bmN0aW9uIHNzbF9jZXJ0X2luc3RhbnRpYXRlKCkgaXMgdXNlZCBhcyBhIGhlbHBlcgogICAgIGZ1bmN0aW9uIGFuZCBhbHNvIHRvIHJlZHVjZSBjb2RlIHJlZHVuZGFuY3kgaW5zaWRlIHNzbF9yc2EuYy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTW92ZSBzX3NlcnZlciAtZGNlcnQgYW5kIC1ka2V5IG9wdGlvbnMgb3V0IG9mIHRoZSB1bmRvY3VtZW50ZWQgZmVhdHVyZQogICAgIGFyZWEgYmVjYXVzZSB0aGV5IGFyZSB1c2VmdWwgZm9yIHRoZSBEU0Egc2l0dWF0aW9uIGFuZCBzaG91bGQgYmUKICAgICByZWNvZ25pemVkIGJ5IHRoZSB1c2Vycy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHRoZSBjaXBoZXIgZGVjaXNpb24gc2NoZW1lIGZvciBleHBvcnQgY2lwaGVyczogdGhlIGV4cG9ydCBiaXRzIGFyZQogICAgICpub3QqIHdpdGhpbiBTU0xfTUtFWV9NQVNLIG9yIFNTTF9BVVRIX01BU0ssIHRoZXkgYXJlIHdpdGhpbgogICAgIFNTTF9FWFBfTUFTSy4gIFNvLCB0aGUgb3JpZ2luYWwgdmFyaWFibGUgaGFzIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUKICAgICBhbHJlYWR5IG1hc2tlZCB2YXJpYWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KCiAgKikgRml4ICdwb3J0JyB2YXJpYWJsZSBmcm9tIGBpbnQnIHRvIGB1bnNpZ25lZCBpbnQnIGluIGNyeXB0by9iaW8vYl9zb2NrLmMKICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KCiAgKikgQ2hhbmdlIHR5cGUgb2YgYW5vdGhlciBtZF9sZW4gdmFyaWFibGUgaW4gcGs3X2RvaXQuYzpQS0NTN19kYXRhRmluYWwoKQogICAgIGZyb20gYGludCcgdG8gYHVuc2lnbmVkIGludCcgYmVjYXVzZSBpdCdzIGEgbGVuZ3RoIGFuZCBpbml0aWFsaXplZCBieQogICAgIEVWUF9EaWdlc3RGaW5hbCgpIHdoaWNoIGV4cGVjdHMgYW4gYHVuc2lnbmVkIGludCAqJy4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KCiAgKikgRG9uJ3QgaGFyZC1jb2RlIHBhdGggdG8gUGVybCBpbnRlcnByZXRlciBvbiBzaGViYW5nIGxpbmUgb2YgQ29uZmlndXJlCiAgICAgc2NyaXB0LiBJbnN0ZWFkIHVzZSB0aGUgdXN1YWwgU2hlbGwtPlBlcmwgdHJhbnNpdGlvbiB0cmljay4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBgb3BlbnNzbCB4NTA5IC1ub291dCAtbW9kdWx1cycgZnVuY3Rpb25hbCBhbHNvIGZvciBEU0EgY2VydGlmaWNhdGVzCiAgICAgKGluIGFkZGl0aW9uIHRvIFJTQSBjZXJ0aWZpY2F0ZXMpIHRvIG1hdGNoIHRoZSBiZWhhdmlvdXIgb2YgYG9wZW5zc2wgZHNhCiAgICAgLW5vb3V0IC1tb2R1bHVzJyBhcyBpdCdzIGFscmVhZHkgdGhlIGNhc2UgZm9yIGBvcGVuc3NsIHJzYSAtbm9vdXQKICAgICAtbW9kdWx1cycuICBGb3IgUlNBIHRoZSAtbW9kdWx1cyBpcyB0aGUgcmVhbCAibW9kdWx1cyIgd2hpbGUgZm9yIERTQQogICAgIGN1cnJlbnRseSB0aGUgcHVibGljIGtleSBpcyBwcmludGVkIChhIGRlY2lzaW9uIHdoaWNoIHdhcyBhbHJlYWR5IGRvbmUgYnkKICAgICBgb3BlbnNzbCBkc2EgLW1vZHVsdXMnIGluIHRoZSBwYXN0KSB3aGljaCBzZXJ2ZXMgYSBzaW1pbGFyIHB1cnBvc2UuCiAgICAgQWRkaXRpb25hbGx5IHRoZSBOT19SU0Egbm8gbG9uZ2VyIGNvbXBsZXRlbHkgcmVtb3ZlcyB0aGUgd2hvbGUgLW1vZHVsdXMKICAgICBvcHRpb247IGl0IG5vdyBvbmx5IGF2b2lkcyB1c2luZyB0aGUgUlNBIHN0dWZmLiBTYW1lIGFwcGxpZXMgdG8gTk9fRFNBCiAgICAgbm93LCB0b28uCiAgICAgW1JhbGYgUy4gIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgQXJuZSBBbnNwZXIncyByZWxpYWJsZSBCSU8gLSB0aGlzIGlzIGFuIGVuY3J5cHRlZCwgYmxvY2stZGlnZXN0ZWQKICAgICBCSU8uIFNlZSB0aGUgc291cmNlIChjcnlwdG8vZXZwL2Jpb19vay5jKSBmb3IgbW9yZSBpbmZvLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBEdW1wIHRoZSBvbGQgeXVja3kgcmVxIGNvZGUgdGhhdCB0cmllZCAoYW5kIGZhaWxlZCkgdG8gYWxsb3cgcmF3IE9JRHMKICAgICB0byBiZSBhZGRlZC4gTm93IGJvdGggJ3JlcScgYW5kICdjYScgY2FuIHVzZSBuZXcgb2JqZWN0cyBkZWZpbmVkIGluIHRoZQogICAgIGNvbmZpZyBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjb29sIEJJTyB0aGF0IGRvZXMgc3lzbG9nIChvciBldmVudCBsb2cgb24gTlQpLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+LCBpbnRlZ3JhdGVkIGJ5IEJlbiBMYXVyaWVdCgogICopIEFkZCBzdXBwb3J0IGZvciBuZXcgVExTIGNpcGhlcnN1aXRlcywgVExTX1JTQV9FWFBPUlQ1Nl9XSVRIX1JDNF81Nl9NRDUsCiAgICAgVExTX1JTQV9FWFBPUlQ1Nl9XSVRIX1JDMl9DQkNfNTZfTUQ1IGFuZAogICAgIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9ERVNfQ0JDX1NIQSwgYXMgc3BlY2lmaWVkIGluICI1Ni1iaXQgRXhwb3J0IENpcGhlcgogICAgIFN1aXRlcyBGb3IgVExTIiwgZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wMC50eHQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBwcmVsaW1pbmFyeSBjb25maWcgaW5mbyBmb3IgbmV3IGV4dGVuc2lvbiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgUlNBX05PX1BBRERJTkcgcmVhbGx5IHVzZSBubyBwYWRkaW5nLgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgR2VuZXJhdGUgZXJyb3JzIHdoZW4gcHJpdmF0ZS9wdWJsaWMga2V5IGNoZWNrIGlzIGRvbmUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE92ZXJoYXVsIGZvciAnY3JsJyB1dGlsaXR5LiBOZXcgZnVuY3Rpb24gWDUwOV9DUkxfcHJpbnQuIFBhcnRpYWwgc3VwcG9ydAogICAgIGZvciBzb21lIENSTCBleHRlbnNpb25zIGFuZCBuZXcgb2JqZWN0cyBhZGRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWFsbHkgZml4IHRoZSBBU04xIElNUExJQ0lUIGJ1ZyB0aGlzIHRpbWUuLi4gUGFydGlhbCBzdXBwb3J0IGZvciBwcml2YXRlCiAgICAga2V5IHVzYWdlIGV4dGVuc2lvbiBhbmQgZnVsbGVyIHN1cHBvcnQgZm9yIGF1dGhvcml0eSBrZXkgaWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIE9BRVAgZW5jcnlwdGlvbiBmb3IgdGhlIE9wZW5TU0wgY3J5cHRvIGxpYnJhcnkuIE9BRVAgaXMgdGhlIGltcHJvdmVkCiAgICAgcGFkZGluZyBtZXRob2QgZm9yIFJTQSwgd2hpY2ggaXMgcmVjb21tZW5kZWQgZm9yIG5ldyBhcHBsaWNhdGlvbnMgaW4gUEtDUwogICAgICMxIHYyLjAgKFJGQyAyNDM3LCBPY3RvYmVyIDE5OTgpLgogICAgIE9BRVAgKE9wdGltYWwgQXN5bW1ldHJpYyBFbmNyeXB0aW9uIFBhZGRpbmcpIGhhcyBiZXR0ZXIgdGhlb3JldGljYWwKICAgICBmb3VuZGF0aW9ucyB0aGFuIHRoZSBhZC1ob2MgcGFkZGluZyB1c2VkIGluIFBLQ1MgIzEgdjEuNS4gSXQgaXMgc2VjdXJlCiAgICAgYWdhaW5zdCBCbGVpY2hiYWNoZXIncyBhdHRhY2sgb24gUlNBLgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPiwgcmVmb3JtYXR0ZWQsIGNvcnJlY3RlZCBhbmQgaW50ZWdyYXRlZCBieQogICAgICBCZW4gTGF1cmllXQoKICAqKSBVcGRhdGVzIHRvIHRoZSBuZXcgU1NMIGNvbXByZXNzaW9uIGNvZGUKICAgICBbRXJpYyBBLiBZb3VuZywgKGZyb20gY2hhbmdlcyB0byBDMk5ldCBTU0xlYXksIGludGVncmF0ZWQgYnkgTWFyayBDb3gpXQoKICAqKSBGaXggc28gdGhhdCB0aGUgdmVyc2lvbiBudW1iZXIgaW4gdGhlIG1hc3RlciBzZWNyZXQsIHdoZW4gcGFzc2VkCiAgICAgdmlhIFJTQSwgY2hlY2tzIHRoYXQgaWYgVExTIHdhcyBwcm9wb3NlZCwgYnV0IHdlIHJvbGwgYmFjayB0byBTU0x2MwogICAgIChiZWNhdXNlIHRoZSBzZXJ2ZXIgd2lsbCBub3QgYWNjZXB0IGhpZ2hlciksIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyCiAgICAgaXMgMHgwMywweDAxLCBub3QgMHgwMywweDAwCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgUnVuIGV4dGVuc2l2ZSBtZW1vcnkgbGVhayBjaGVja3Mgb24gU1NMIGFwcHMuIEZpeGVkICpsb3RzKiBvZiBtZW1vcnkKICAgICBsZWFrcyBpbiBzc2wvIHJlbGF0aW5nIHRvIG5ldyBYNTA5X2dldF9wdWJrZXkoKSBiZWhhdmlvdXIuIEFsc28gZml4ZXMKICAgICBpbiBhcHBzLyBhbmQgYW4gdW5yZWxhdGVkIGxlYWsgaW4gY3J5cHRvL2RzYS9kc2FfdnJmLmMKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBSQVcgZXh0ZW5zaW9ucyB3aGVyZSBhbiBhcmJpdHJhcnkgZXh0ZW5zaW9uIGNhbiBiZQogICAgIGNyZWF0ZWQgYnkgaW5jbHVkaW5nIGl0cyBERVIgZW5jb2RpbmcuIFNlZSBhcHBzL29wZW5zc2wuY25mIGZvcgogICAgIGFuIGV4YW1wbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBzdXJlIGxhdGVzdCBQZXJsIHZlcnNpb25zIGRvbid0IGludGVycHJldCBzb21lIGdlbmVyYXRlZCBDIGFycmF5CiAgICAgY29kZSBhcyBQZXJsIGFycmF5IGNvZGUgaW4gdGhlIGNyeXB0by9lcnIvZXJyX2dlbmMucGwgc2NyaXB0LgogICAgIFtMYXJzIFdlYmVyIDwzd2ViZXJAaW5mb3JtYXRpay51bmktaGFtYnVyZy5kZT5dCgogICopIE1vZGlmeSBtcy9kb19tcy5iYXQgdG8gbm90IGdlbmVyYXRlIGFzc2VtYmx5IGxhbmd1YWdlIG1ha2VmaWxlcyBzaW5jZQogICAgIG5vdCBtYW55IHBlb3BsZSBoYXZlIHRoZSBhc3NlbWJsZXIuIFZhcmlvdXMgV2luMzIgY29tcGlsYXRpb24gZml4ZXMgYW5kCiAgICAgdXBkYXRlIHRvIHRoZSBJTlNUQUxMLlczMiBmaWxlIHdpdGggKGhvcGVmdWxseSkgbW9yZSBhY2N1cmF0ZSBXaW4zMgogICAgIGJ1aWxkIGluc3RydWN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgY29uZmlndXJlIHNjcmlwdCAnQ29uZmlndXJlJyB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBjcnlwdG8vZGF0ZS5oCiAgICAgZmlsZSB1bmRlciBXaW4zMiBhbmQgYWxzbyBidWlsZCBwZW0uaCBmcm9tIHBlbS5vcmcuIE5ldyBzY3JpcHQKICAgICB1dGlsL21rZmlsZXMucGwgdG8gY3JlYXRlIHRoZSBNSU5GTyBmaWxlIG9uIGVudmlyb25tZW50cyB0aGF0IGNhbid0IGRvIGEKICAgICAnbWFrZSBmaWxlcyc6IHBlcmwgdXRpbC9ta2ZpbGVzLnBsID5NSU5GTyBzaG91bGQgd29yay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWpvciByZXdvcmsgb2YgREVTIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucywgaW4gdGhlIHB1cnN1aXQgb2YgY29ycmVjdG5lc3MKICAgICBhbmQgcHVyaXR5LiBBcyBhIHJlc3VsdCwgbWFueSBldmlsIGNhc3RzIGV2YXBvcmF0ZWQsIGFuZCBzb21lIHdlaXJkbmVzcywKICAgICB0b28uIFlvdSBtYXkgZmluZCB0aGlzIGNhdXNlcyB3YXJuaW5ncyBpbiB5b3VyIGNvZGUuIFphcHBpbmcgeW91ciBldmlsCiAgICAgY2FzdHMgd2lsbCBwcm9iYWJseSBmaXggdGhlbS4gTW9zdGx5LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggZm9yIGEgdHlwbyBpbiBhc24xLmguIEJ1ZyBmaXggdG8gb2JqZWN0IGNyZWF0aW9uIHNjcmlwdAogICAgIG9ial9kYXQucGwuIEl0IGNvbnNpZGVyZWQgYSB6ZXJvIGluIGFuIG9iamVjdCBkZWZpbml0aW9uIHRvIG1lYW4KICAgICAiZW5kIG9mIG9iamVjdCI6IG5vbmUgb2YgdGhlIG9iamVjdHMgaW4gb2JqZWN0cy5oIGhhdmUgYW55IHplcm9zCiAgICAgc28gaXQgd2Fzbid0IHNwb3R0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgRXJ3YW5uIEFCQUxFQSA8ZWFiYWxlYUBjZXJ0cGx1cy5jb20+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgVHJpcGxlIERFUyBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgd2l0aCBPdXRwdXQgRmVlZGJhY2sKICAgICBNYXNraW5nIChDQkNNKS4gSW4gdGhlIGFic2VuY2Ugb2YgdGVzdCB2ZWN0b3JzLCB0aGUgYmVzdCBJIGhhdmUgYmVlbiBhYmxlCiAgICAgdG8gZG8gaXMgY2hlY2sgdGhhdCB0aGUgZGVjcnlwdCB1bmRvZXMgdGhlIGVuY3J5cHQsIHNvIGZhci4gU2VuZCBtZSB0ZXN0CiAgICAgdmVjdG9ycyBpZiB5b3UgaGF2ZSB0aGVtLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb3JyZWN0IGNhbGN1bGF0aW9uIG9mIGtleSBsZW5ndGggZm9yIGV4cG9ydCBjaXBoZXJzICh0b28gbXVjaCBzcGFjZSB3YXMKICAgICBhbGxvY2F0ZWQgZm9yIG51bGwgY2lwaGVycykuIFRoaXMgaGFzIG5vdCBiZWVuIHRlc3RlZCEKICAgICBbQmVuIExhdXJpZV0KCiAgKikgTW9kaWZpY2F0aW9ucyB0byB0aGUgbWtkZWYucGwgZm9yIFdpbjMyIERFRiBmaWxlIGNyZWF0aW9uLiBUaGUgdXNhZ2UKICAgICBtZXNzYWdlIGlzIG5vdyBjb3JyZWN0IChpdCB1bmRlcnN0YW5kcyAiY3J5cHRvIiBhbmQgInNzbCIgb24gaXRzCiAgICAgY29tbWFuZCBsaW5lKS4gVGhlcmUgaXMgYWxzbyBub3cgYW4gInVwZGF0ZSIgb3B0aW9uLiBUaGlzIHdpbGwgdXBkYXRlCiAgICAgdGhlIHV0aWwvc3NsZWF5Lm51bSBhbmQgdXRpbC9saWJlYXkubnVtIGZpbGVzIHdpdGggYW55IG5ldyBmdW5jdGlvbnMuCiAgICAgSWYgeW91IGRvIGE6IAogICAgIHBlcmwgdXRpbC9ta2RlZi5wbCBjcnlwdG8gc3NsIHVwZGF0ZQogICAgIGl0IHdpbGwgdXBkYXRlIHRoZW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgT3ZlcmhhdWxlZCB0aGUgUGVybCBpbnRlcmZhY2UgKHBlcmwvKik6CiAgICAgLSBwb3J0ZWQgQk4gc3R1ZmYgdG8gT3BlblNTTCdzIGRpZmZlcmVudCBCTiBsaWJyYXJ5CiAgICAgLSBtYWRlIHRoZSBwZXJsLyBzb3VyY2UgdHJlZSBDVlMtYXdhcmUKICAgICAtIHJlbmFtZWQgdGhlIHBhY2thZ2UgZnJvbSBTU0xlYXkgdG8gT3BlblNTTCAodGhlIGZpbGVzIHN0aWxsIGNvbnRhaW4KICAgICAgIHRoZWlyIGhpc3RvcnkgYmVjYXVzZSBJJ3ZlIGNvcGllZCB0aGVtIGluIHRoZSByZXBvc2l0b3J5KQogICAgIC0gcmVtb3ZlZCBvYnNvbGV0ZSBmaWxlcyAodGhlIHRlc3Qgc2NyaXB0cyB3aWxsIGJlIHJlcGxhY2VkCiAgICAgICBieSBiZXR0ZXIgVGVzdDo6SGFybmVzcyB2YXJpYW50cyBpbiB0aGUgZnV0dXJlKQogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXJzdCBjdXQgZm9yIGEgdmVyeSBjb25zZXJ2YXRpdmUgc291cmNlIHRyZWUgY2xlYW51cDoKICAgICAxLiBtZXJnZSB2YXJpb3VzIG9ic29sZXRlIHJlYWRtZSB0ZXh0cyBpbnRvIGRvYy9zc2xlYXkudHh0CiAgICAgd2hlcmUgd2UgY29sbGVjdCB0aGUgb2xkIGRvY3VtZW50cyBhbmQgcmVhZG1lIHRleHRzLgogICAgIDIuIHJlbW92ZSB0aGUgZmlyc3QgcGFydCBvZiBmaWxlcyB3aGVyZSBJJ20gYWxyZWFkeSBzdXJlIHRoYXQgd2Ugbm8KICAgICBsb25nZXIgbmVlZCB0aGVtIGJlY2F1c2Ugb2YgdGhyZWUgcmVhc29uczogZWl0aGVyIHRoZXkgYXJlIGp1c3QgdGVtcG9yYXJ5CiAgICAgZmlsZXMgd2hpY2ggd2VyZSBsZWZ0IGJ5IEVyaWMgb3IgdGhleSBhcmUgcHJlc2VydmVkIG9yaWdpbmFsIGZpbGVzIHdoZXJlCiAgICAgSSd2ZSB2ZXJpZmllZCB0aGF0IHRoZSBkaWZmIGlzIGFsc28gYXZhaWxhYmxlIGluIHRoZSBDVlMgdmlhICJjdnMgZGlmZgogICAgIC1yU1NMZWF5XzBfOF8xYiIgb3IgdGhleSB3ZXJlIHJlbmFtZWQgKGFzIGl0IHdhcyBkZWZpbml0ZWx5IHRoZSBjYXNlIGZvcgogICAgIHRoZSBjcnlwdG8vbWQvIHN0dWZmKS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTW9yZSBleHRlbnNpb24gY29kZS4gSW5jb21wbGV0ZSBzdXBwb3J0IGZvciBzdWJqZWN0IGFuZCBpc3N1ZXIgYWx0CiAgICAgbmFtZSwgaXNzdWVyIGFuZCBhdXRob3JpdHkga2V5IGlkLiBDaGFuZ2UgdGhlIGkydiBmdW5jdGlvbiBwYXJhbWV0ZXJzCiAgICAgYW5kIGFkZCBhbiBleHRyYSAnY3JsJyBwYXJhbWV0ZXIgaW4gdGhlIFg1MDlWM19DVFggc3RydWN0dXJlOiBndWVzcwogICAgIHdoYXQgdGhhdCdzIGZvciA6LSkgRml4IHRvIEFTTjEgbWFjcm8gd2hpY2ggbWVzc2VkIHVwCiAgICAgSU1QTElDSVQgdGFnIGFuZCBhZGQgZl9lbnVtLmMgd2hpY2ggYWRkcyBhMmksIGkyYSBmb3IgRU5VTUVSQVRFRC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBFTlVNRVJBVEVEIHR5cGUuIFRoaXMgaXMgbGFyZ2VseSBjb3BpZWQgZnJvbSB0aGUKICAgICBJTlRFR0VSIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbiwgRVZQX01EX0NUWF9jb3B5KCkgdG8gcmVwbGFjZSBmcmVxdWVudCB1c2Ugb2YgbWVtY3B5LgogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIE1ha2Ugc3VyZSBgbWFrZSByZWhhc2gnIHRhcmdldCByZWFsbHkgZmluZHMgdGhlIGBvcGVuc3NsJyBwcm9ncmFtLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBNYXR0aGlhcyBMb2VwZmUgPE1hdHRoaWFzLkxvZXBmZUBhZG5vdnVtLmNoPl0KCiAgKikgU3F1ZWV6ZSBhbm90aGVyIDclIG9mIHNwZWVkIG91dCBvZiBNRDUgYXNzZW1ibGVyLCBhdCBsZWFzdCBvbiBhIFAyLiBJJ2QKICAgICBsaWtlIHRvIGhlYXIgYWJvdXQgaXQgaWYgdGhpcyBzbG93cyBkb3duIG90aGVyIHByb2Nlc3NvcnMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBDeWdXaW4zMiBwbGF0Zm9ybSBpbmZvcm1hdGlvbiB0byBDb25maWd1cmUgc2NyaXB0LgogICAgIFtBbGFuIEJhdGllIDxiYXRpZUBhYWh6LmpmLmludGVsLmNvbT5dCgogICopIEZpeGVkIG1zLzMyYWxsLmJhdCBzY3JpcHQ6IGBub19hc20nIC0+IGBuby1hc20nCiAgICAgW1JhaW5lciBXLiBHZXJsaW5nIDxnZXJsaW5nQG1wZy1ndi5tcGcuZGU+XQogIAogICopIE5ldyBwcm9ncmFtIG5zZXEgdG8gbWFuaXB1bGF0ZSBuZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZXMKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgY3JsMnBrY3M3IHNvIGl0IHN1cHBvcnRzIG11bHRpcGxlIC1jZXJ0ZmlsZSBhcmd1bWVudHMuIEZpeCBhCiAgICAgZmV3IHR5cG9zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIHRvIEJOIGNvZGUuICBQcmV2aW91c2x5IHRoZSBkZWZhdWx0IHdhcyB0byBkZWZpbmUgQk5fUkVDVVJTSU9OCiAgICAgYnV0IHRoZSBCTiBjb2RlIGhhZCBzb21lIHByb2JsZW1zIHRoYXQgd291bGQgY2F1c2UgZmFpbHVyZXMgd2hlbgogICAgIGRvaW5nIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhbmQgc29tZSBvdGhlciBmdW5jdGlvbnMuCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgQWRkIEFTTjEgYW5kIFBFTSBjb2RlIHRvIHN1cHBvcnQgbmV0c2NhcGUgY2VydGlmaWNhdGUgc2VxdWVuY2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBBU04xIGFuZCBQRU0gY29kZSB0byBzdXBwb3J0IG5ldHNjYXBlIGNlcnRpZmljYXRlIHNlcXVlbmNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc2V2ZXJhbCBQS0lYIGFuZCBwcml2YXRlIGV4dGVuZGVkIGtleSB1c2FnZSBPSURzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgJ2NhJyBwcm9ncmFtIHRvIGhhbmRsZSB0aGUgbmV3IGV4dGVuc2lvbiBjb2RlLiBNb2RpZnkKICAgICBvcGVuc3NsLmNuZiBmb3IgbmV3IGV4dGVuc2lvbiBmb3JtYXQsIGFkZCBjb21tZW50cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3JlIFg1MDkgVjMgY2hhbmdlcy4gRml4IHR5cG8gaW4gdjNfYml0c3RyLmMuIEFkZCBzdXBwb3J0IHRvICdyZXEnCiAgICAgYW5kIGFkZCBhIHNhbXBsZSB0byBvcGVuc3NsLmNuZiBzbyByZXEgLXg1MDkgbm93IGFkZHMgYXBwcm9wcmlhdGUKICAgICBDQSBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnRpbnVlZCBYNTA5IFYzIGNoYW5nZXMuIEFkZCB0byBvdGhlciBtYWtlZmlsZXMsIGludGVncmF0ZSB3aXRoIHRoZQogICAgIGVycm9yIGNvZGUsIGFkZCBpbml0aWFsIHN1cHBvcnQgdG8gWDUwOV9wcmludCgpIGFuZCB4NTA5IGFwcGxpY2F0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRha2VzIGEgZGVlcCBicmVhdGggYW5kIHN0YXJ0IGFkZGluZyBYNTA5IFYzIGV4dGVuc2lvbiBzdXBwb3J0IGNvZGUuIEFkZAogICAgIGZpbGVzIGluIGNyeXB0by94NTA5djMuIE1vdmUgb3JpZ2luYWwgc3R1ZmYgdG8gY3J5cHRvL3g1MDl2My9vbGQuIEFsbCB0aGlzCiAgICAgc3R1ZmYgaXMgY3VycmVudGx5IGlzb2xhdGVkIGFuZCBpc24ndCBldmVuIGNvbXBpbGVkIHlldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb250aW51aW5nIHBhdGNoZXMgZm9yIEdlbmVyYWxpemVkVGltZS4gRml4IHVwIGNlcnRpZmljYXRlIGFuZCBDUkwKICAgICBBU04xIHRvIHVzZSBBU04xX1RJTUUgYW5kIG1vZGlmeSBwcmludCByb3V0aW5lcyB0byB1c2UgQVNOMV9USU1FX3ByaW50LgogICAgIFJlbW92ZWQgdGhlIHZlcnNpb25zIGNoZWNrIGZyb20gWDUwOSByb3V0aW5lcyB3aGVuIGxvYWRpbmcgZXh0ZW5zaW9uczoKICAgICB0aGlzIGFsbG93cyBjZXJ0YWluIGJyb2tlbiBjZXJ0aWZpY2F0ZXMgdGhhdCBkb24ndCBzZXQgdGhlIHZlcnNpb24KICAgICBwcm9wZXJseSB0byBiZSBwcm9jZXNzZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGVhbCB3aXRoIGlycml0YXRpbmcgc2hpdCB0byBkbyB3aXRoIGRlcGVuZGVuY2llcywgaW4gWUFBSFcgKFlldCBBbm90aGVyCiAgICAgQWQgSG9jIFdheSkgLSBNYWtlZmlsZS5zc2xzIG5vdyBhbGwgY29udGFpbiBsb2NhbCBkZXBlbmRlbmNpZXMsIHdoaWNoCiAgICAgY2FuIHN0aWxsIGJlIHJlZ2VuZXJhdGVkIHdpdGggIm1ha2UgZGVwZW5kIi4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgU3BlbGxpbmcgbWlzdGFrZSBpbiBDIHZlcnNpb24gb2YgQ0FTVC0xMjguCiAgICAgW0JlbiBMYXVyaWUsIHJlcG9ydGVkIGJ5IEplcmVteSBIeWx0b24gPGplcmVteUBjbnJpLnJlc3Rvbi52YS51cz5dCgogICopIENoYW5nZXMgdG8gdGhlIGVycm9yIGdlbmVyYXRpb24gY29kZS4gVGhlIHBlcmwgc2NyaXB0IGVyci1jb2RlLnBsIAogICAgIG5vdyByZWFkcyBpbiB0aGUgb2xkIGVycm9yIGNvZGVzIGFuZCByZXRhaW5zIHRoZSBvbGQgbnVtYmVycywgb25seQogICAgIGFkZGluZyBuZXcgb25lcyBpZiBuZWNlc3NhcnkuIEl0IGFsc28gb25seSBjaGFuZ2VzIHRoZSAuZXJyIGZpbGVzIGlmIG5ldwogICAgIGNvZGVzIGFyZSBhZGRlZC4gVGhlIG1ha2VmaWxlcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gb25seSBpbnNlcnQgZXJyb3JzCiAgICAgd2hlbiBuZWVkZWQgKHRvIGF2b2lkIG5lZWRsZXNzbHkgbW9kaWZ5aW5nIGhlYWRlciBmaWxlcykuIFRoaXMgaXMgZG9uZQogICAgIGJ5IG9ubHkgaW5zZXJ0aW5nIGVycm9ycyBpZiB0aGUgLmVyciBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIGF1dG8gZ2VuZXJhdGVkCiAgICAgQyBmaWxlLiBUbyByZWJ1aWxkIGFsbCB0aGUgZXJyb3IgY29kZXMgZnJvbSBzY3JhdGNoICh0aGUgb2xkIGJlaGF2aW91cikKICAgICBlaXRoZXIgbW9kaWZ5IGNyeXB0by9NYWtlZmlsZS5zc2wgdG8gcGFzcyB0aGUgLXJlZ2VuIGZsYWcgdG8gZXJyX2NvZGUucGwKICAgICBvciBkZWxldGUgYWxsIHRoZSAuZXJyIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENBU1QtMTI4IHdhcyBpbmNvcnJlY3RseSBpbXBsZW1lbnRlZCBmb3Igc2hvcnQga2V5cy4gVGhlIEMgdmVyc2lvbiBoYXMKICAgICBiZWVuIGZpeGVkLCBidXQgaXMgdW50ZXN0ZWQuIFRoZSBhc3NlbWJsZXIgdmVyc2lvbnMgYXJlIGFsc28gZml4ZWQsIGJ1dAogICAgIG5ldyBhc3NlbWJsZXIgSEFTIE5PVCBCRUVOIEdFTkVSQVRFRCBGT1IgV0lOMzIgLSB0aGUgTWFrZWZpbGUgbmVlZHMgZml4aW5nCiAgICAgdG8gcmVnZW5lcmF0ZSBpdCBpZiBuZWVkZWQuCiAgICAgW0JlbiBMYXVyaWUsIHJlcG9ydGVkICh3aXRoIGZpeCBmb3IgQyB2ZXJzaW9uKSBieSBKdW4taWNoaXJvIGl0b2p1bgogICAgICBIYWdpbm8gPGl0b2p1bkBrYW1lLm5ldD5dCgogICopIEZpbGUgd2FzIG9wZW5lZCBpbmNvcnJlY3RseSBpbiByYW5kZmlsZS5jLgogICAgIFtVbGYgTfZsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBCZWdpbm5pbmcgb2Ygc3VwcG9ydCBmb3IgR2VuZXJhbGl6ZWRUaW1lLiBkMmksIGkyZCwgY2hlY2sgYW5kIHByaW50CiAgICAgZnVuY3Rpb25zLiBBbHNvIEFTTjFfVElNRSBzdWl0ZSB3aGljaCBpcyBhIENIT0lDRSBvZiBVVENUaW1lIG9yCiAgICAgR2VuZXJhbGl6ZWRUaW1lLiBBU04xX1RJTUUgaXMgdGhlIHByb3BlciB0eXBlIHVzZWQgaW4gY2VydGlmaWNhdGVzIGV0CiAgICAgYWw6IGl0J3MganVzdCBhbG1vc3QgYWx3YXlzIGEgVVRDVGltZS4gTm90ZSB0aGlzIHBhdGNoIGFkZHMgbmV3IGVycm9yCiAgICAgY29kZXMgc28gZG8gYSAibWFrZSBlcnJvcnMiIGlmIHRoZXJlIGFyZSBwcm9ibGVtcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb3JyZWN0IExpbnV4IDEgcmVjb2duaXRpb24gaW4gY29uZmlnLgogICAgIFtVbGYgTfZsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBSZW1vdmUgcG9pbnRsZXNzIE1ENSBoYXNoIHdoZW4gdXNpbmcgRFNBIGtleXMgaW4gY2EuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBHZW5lcmF0ZSBhbiBlcnJvciBpZiBnaXZlbiBhbiBlbXB0eSBzdHJpbmcgYXMgYSBjZXJ0IGRpcmVjdG9yeS4gQWxzbwogICAgIGdlbmVyYXRlIGFuIGVycm9yIGlmIGhhbmRlZCBOVUxMIChwcmV2aW91c2x5IHJldHVybmVkIDAgdG8gaW5kaWNhdGUgYW4KICAgICBlcnJvciwgYnV0IGRpZG4ndCBzZXQgb25lKS4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgYnkgQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCgogICopIEFkZCBwcm90b3R5cGVzIHRvIFNTTCBtZXRob2RzLiBNYWtlIFNTTF93cml0ZSdzIGJ1ZmZlciBjb25zdCwgYXQgbGFzdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHRoZSBkdW1teSBmdW5jdGlvbiBCTl9yZWZfbW9kX2V4cCgpIGluIHJzYXJlZi5jIHRvIGhhdmUgdGhlIGNvcnJlY3QKICAgICBwYXJhbWV0ZXJzLiBUaGlzIHdhcyBjYXVzaW5nIGEgd2FybmluZyB3aGljaCBraWxsZWQgb2ZmIHRoZSBXaW4zMiBjb21waWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSBDKysgc3R5bGUgY29tbWVudHMgZnJvbSBjcnlwdG8vYm4vYm5fbG9jYWwuaC4KICAgICBbTmVpbCBDb3N0aWdhbiA8bmVpbC5jb3N0aWdhbkBjZWxvY29tLmNvbT5dCgogICopIFRoZSBmdW5jdGlvbiBPQkpfdHh0Mm5pZCB3YXMgYnJva2VuLiBJdCB3YXMgc3VwcG9zZWQgdG8gcmV0dXJuIGEgbmlkCiAgICAgYmFzZWQgb24gYSB0ZXh0IHN0cmluZywgbG9va2luZyB1cCBzaG9ydCBhbmQgbG9uZyBuYW1lcyBhbmQgZmluYWxseQogICAgICJkb3QiIGZvcm1hdC4gVGhlICJkb3QiIGZvcm1hdCBzdHVmZiBkaWRuJ3Qgd29yay4gQWRkZWQgbmV3IGZ1bmN0aW9uCiAgICAgT0JKX3R4dDJvYmogdG8gZG8gdGhlIHNhbWUgYnV0IHJldHVybiBhbiBBU04xX09CSkVDVCBhbmQgcmV3cm90ZSAKICAgICBPQkpfdHh0Mm5pZCB0byB1c2UgaXQuIE9CSl90eHQyb2JqIGNhbiBhbHNvIHJldHVybiBvYmplY3RzIGV2ZW4gaWYgdGhlCiAgICAgT0lEIGlzIG5vdCBwYXJ0IG9mIHRoZSB0YWJsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgcHJvdG90eXBlcyB0byBYNTA5IGxvb2t1cC92ZXJpZnkgbWV0aG9kcywgZml4aW5nIGEgYnVnIGluCiAgICAgWDUwOV9MT09LVVBfYnlfYWxpYXMoKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgU29ydCBvcGVuc3NsIGZ1bmN0aW9ucyBieSBuYW1lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBHZXQgdGhlIGdlbmRzYSBwcm9ncmFtIHdvcmtpbmcgKGhvcGVmdWxseSkgYW5kIGFkZCBpdCB0byBhcHAgbGlzdC4gUmVtb3ZlCiAgICAgZW5jcnlwdGlvbiBmcm9tIHNhbXBsZSBEU0Ega2V5cyAoaW4gY2FzZSBhbnlvbmUgaXMgaW50ZXJlc3RlZCB0aGUgcGFzc3dvcmQKICAgICB3YXMgIjEyMzQiKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIF9hbGxfICpfZnJlZSBmdW5jdGlvbnMgYWNjZXB0IGEgTlVMTCBwb2ludGVyLgogICAgIFtGcmFucyBIZXltYW5zIDxmaGV5bWFuc0Bpc2FzZXJ2ZXIuYmU+XQoKICAqKSBJZiBhIERIIGtleSBpcyBnZW5lcmF0ZWQgaW4gczNfc3J2ci5jLCBkb24ndCBibG93IGl0IGJ5IHRyeWluZyB0byB1c2UKICAgICBOVUxMIHBvaW50ZXJzLgogICAgIFtBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgc19zZXJ2ZXIgc2hvdWxkIHNlbmQgdGhlIENBZmlsZSBhcyBhY2NlcHRhYmxlIENBcywgbm90IGl0cyBvd24gY2VydC4KICAgICBbQm9kbyBNb2VsbGVyIDwzbW9lbGxlckBpbmZvcm1hdGlrLnVuaS1oYW1idXJnLmRlPl0KCiAgKikgRG9uJ3QgYmxvdyBpdCBmb3IgbnVtZXJpYyAtbmV3a2V5IGFyZ3VtZW50cyB0byBhcHBzL3JlcS4KICAgICBbQm9kbyBNb2VsbGVyIDwzbW9lbGxlckBpbmZvcm1hdGlrLnVuaS1oYW1idXJnLmRlPl0KCiAgKikgVGVtcCBrZXkgImZvciBleHBvcnQiIHRlc3RzIHdlcmUgd3JvbmcgaW4gczNfc3J2ci5jLgogICAgIFtBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgQWRkIHByb3RvdHlwZSBmb3IgdGVtcCBrZXkgY2FsbGJhY2sgZnVuY3Rpb25zCiAgICAgU1NMX0NUWF9zZXRfdG1wX3tyc2EsZGh9X2NhbGxiYWNrKCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1ha2UgREhfZnJlZSgpIHRvbGVyYXRlIGJlaW5nIHBhc3NlZCBhIE5VTEwgcG9pbnRlciAobGlrZSBSU0FfZnJlZSgpIGFuZAogICAgIERTQV9mcmVlKCkpLiBNYWtlIFg1MDlfUFVCS0VZX3NldCgpIGNoZWNrIGZvciBlcnJvcnMgaW4gZDJpX1B1YmxpY0tleSgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFg1MDlfbmFtZV9hZGRfZW50cnkoKSBmcmVlZCB0aGUgd3JvbmcgdGhpbmcgYWZ0ZXIgYW4gZXJyb3IuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIHJzYV9lYXkuYyB3b3VsZCBhdHRlbXB0IHRvIGZyZWUgYSBOVUxMIGNvbnRleHQuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEJJT19zX3NvY2tldCgpIGhhZCBhIGJyb2tlbiBzaG91bGRfcmV0cnkoKSBvbiBXaW5kb3plLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBCSU9fZl9idWZmZXIoKSBkaWRuJ3QgcGFzcyBvbiBCSU9fQ1RSTF9GTFVTSC4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgTWFrZSBzdXJlIHRoZSBhbHJlYWR5IGV4aXN0aW5nIFg1MDlfU1RPUkUtPmRlcHRoIHZhcmlhYmxlIGlzIGluaXRpYWxpemVkCiAgICAgaW4gWDUwOV9TVE9SRV9uZXcoKSwgYnV0IGRvY3VtZW50IHRoZSBmYWN0IHRoYXQgdGhpcyB2YXJpYWJsZSBpcyBzdGlsbAogICAgIHVudXNlZCBpbiB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgdmFyaW91cyBsaWJyYXJ5IGFuZCBhcHBzIGZpbGVzIHRvIGZyZWUgdXAgcGtleXMgb2J0YWluZWQgZnJvbQogICAgIFg1MDlfUFVCS0VZX2dldCgpIGV0IGFsLiBBbHNvIGFsbG93IHg1MDkuYyB0byBoYW5kbGUgbmV0c2NhcGUgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggcmVmZXJlbmNlIGNvdW50aW5nIGluIFg1MDlfUFVCS0VZX2dldCgpLiBUaGlzIG1ha2VzCiAgICAgZGVtb3MvbWF1cmljZS9leGFtcGxlMi5jIHdvcmssIGFtb25nc3Qgb3RoZXJzLCBwcm9iYWJseS4KICAgICBbU3RldmUgSGVuc29uIGFuZCBCZW4gTGF1cmllXQoKICAqKSBGaXJzdCBjdXQgb2YgYSBjbGVhbnVwIGZvciBhcHBzLy4gRmlyc3QgdGhlIGBzc2xlYXknIHByb2dyYW0gaXMgbm93IG5hbWVkCiAgICAgYG9wZW5zc2wnIGFuZCBzZWNvbmQsIHRoZSBzaG9ydGN1dCBzeW1saW5rcyBmb3IgdGhlIGBvcGVuc3NsIDxjb21tYW5kPicKICAgICBhcmUgbm8gbG9uZ2VyIGNyZWF0ZWQuIFRoaXMgd2F5IHdlIGhhdmUgYSBzaW5nbGUgYW5kIGNvbnNpc3RlbnQgY29tbWFuZAogICAgIGxpbmUgaW50ZXJmYWNlIGBvcGVuc3NsIDxjb21tYW5kPicsIHNpbWlsYXIgdG8gYGN2cyA8Y29tbWFuZD4nLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBQYXVsIFN1dHRvbiBhbmQgQmVuIExhdXJpZV0KCiAgKikgY2EuYzogbW92ZSB0ZXN0IGZvciBEU0Ega2V5cyBpbnNpZGUgI2lmbmRlZiBOT19EU0EuIE1ha2UgcHVia2V5CiAgICAgQklUIFNUUklORyB3cmFwcGVyIGFsd2F5cyBoYXZlIHplcm8gdW51c2VkIGJpdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIENBLnBsLCBwZXJsIHZlcnNpb24gb2YgQ0Euc2gsIGFkZCBleHRlbmRlZCBrZXkgdXNhZ2UgT0lELgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgdGhlIHRvcC1sZXZlbCBJTlNUQUxMIGRvY3VtZW50YXRpb24gZWFzaWVyIHRvIHVuZGVyc3RhbmQuCiAgICAgW1BhdWwgU3V0dG9uXQoKICAqKSBNYWtlZmlsZXMgdXBkYXRlZCB0byBleGl0IGlmIGFuIGVycm9yIG9jY3VycyBpbiBhIHN1Yi1kaXJlY3RvcnkKICAgICBtYWtlIChpbmNsdWRpbmcgaWYgdXNlciBwcmVzc2VzIF5DKSBbUGF1bCBTdXR0b25dCgogICopIE1ha2UgTW9udGdvbWVyeSBjb250ZXh0IHN0dWZmIGV4cGxpY2l0IGluIFJTQSBkYXRhIHN0cnVjdHVyZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IGJ1aWxkIG9yZGVyIG9mIHBlbSBhbmQgZXJyIHRvIGFsbG93IGZvciBnZW5lcmF0ZWQgcGVtLmguCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCByZW51bWJlcmluZyBidWcgaW4gWDUwOV9OQU1FX2RlbGV0ZV9lbnRyeSgpLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBFbmhhbmNlZCB0aGUgZXJyLWlucy5wbCBzY3JpcHQgc28gaXQgbWFrZXMgdGhlIGVycm9yIGxpYnJhcnkgbnVtYmVyIAogICAgIGdsb2JhbCBhbmQgY2FuIGFkZCBhIGxpYnJhcnkgbmFtZS4gVGhpcyBpcyBuZWVkZWQgZm9yIGV4dGVybmFsIEFTTjEgYW5kCiAgICAgb3RoZXIgZXJyb3IgbGlicmFyaWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVkIHNrX2luc2VydCB3aGljaCBuZXZlciB3b3JrZWQgcHJvcGVybHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IEFTTjEgbWFjcm9zIHNvIHRoZXkgY2FuIGhhbmRsZSBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCAKICAgICBFWFBMSUNJVCB0YWdzLiBTb21lIG5vbiBzdGFuZGFyZCBjZXJ0aWZpY2F0ZXMgdXNlIHRoZXNlOiB0aGV5IGNhbiBub3cKICAgICBiZSByZWFkIGluLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1lcmdlZCB0aGUgdmFyaW91cyBvbGQvb2Jzb2xldGUgU1NMZWF5IGRvY3VtZW50YXRpb24gZmlsZXMgKGRvYy94eHguZG9jKQogICAgIGludG8gYSBzaW5nbGUgZG9jL3NzbGVheS50eHQgYnVuZGxlLiBUaGlzIHdheSB0aGUgaW5mb3JtYXRpb24gaXMgc3RpbGwKICAgICBwcmVzZXJ2ZWQgYnV0IG5vIGxvbmdlciBtZXNzZXMgdXAgdGhpcyBkaXJlY3RvcnkuIE5vdyBpdCdzIG5ldyByb29tIGZvcgogICAgIHRoZSBuZXcgc2V0IG9mIGRvY3VtZW50YXRpb24gZmlsZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFNFVHMgd2VyZSBpbmNvcnJlY3RseSBERVIgZW5jb2RlZC4gVGhpcyB3YXMgYSBtYWpvciBwYWluLCBiZWNhdXNlIHRoZXkKICAgICBzaGFyZWQgY29kZSB3aXRoIFNFUVVFTkNFcywgd2hpY2ggYXJlbid0IGNvZGVkIHRoZSBzYW1lLiBUaGlzIG1lYW5zIHRoYXQKICAgICBhbG1vc3QgZXZlcnl0aGluZyB0byBkbyB3aXRoIFNFVHMgb3IgU0VRVUVOQ0VzIGhhcyBlaXRoZXIgY2hhbmdlZCBuYW1lIG9yCiAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICBbQmVuIExhdXJpZSwgYmFzZWQgb24gYSBwYXJ0aWFsIGZpeCBieSBHUCBKYXlhbiA8Z3BAbnNqLmNvLmpwPl0KCiAgKikgRml4IHRlc3QgZGF0YSB0byB3b3JrIHdpdGggdGhlIGFib3ZlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIFJTQSBoZWFkZXIgZGVjbGFyYXRpb25zIHRoYXQgaGlkIGEgYnVnIEkgZml4ZWQgaW4gMC45LjBiIGJ1dAogICAgIHdhcyBhbHJlYWR5IGZpeGVkIGJ5IEVyaWMgZm9yIDAuOS4xIGl0IHNlZW1zLgogICAgIFtCZW4gTGF1cmllIC0gcG9pbnRlZCBvdXQgYnkgVWxmIE32bGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgQXV0b2RldGVjdCBGcmVlQlNEMy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHZhcmlvdXMgYnVncyBpbiBDb25maWd1cmUuIFRoaXMgYWZmZWN0cyB0aGUgZm9sbG93aW5nIHBsYXRmb3JtczoKICAgICBuZXh0c3RlcAogICAgIG5jci1zY2RlCiAgICAgdW5peHdhcmUtMi4wCiAgICAgdW5peHdhcmUtMi4wLXBlbnRpdW0KICAgICBzY281LWNjLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBFbGltaW5hdGUgZ2VuZXJhdGVkIGZpbGVzIGZyb20gQ1ZTLiBSZW9yZGVyIHRlc3RzIHRvIHJlZ2VuZXJhdGUgZmlsZXMKICAgICBiZWZvcmUgdGhleSBhcmUgbmVlZGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBHZW5lcmF0ZSBNYWtlZmlsZS5zc2wgZnJvbSBNYWtlZmlsZS5vcmcgKHRvIGtlZXAgQ1ZTIGhhcHB5KS4KICAgICBbQmVuIExhdXJpZV0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4xYiBhbmQgMC45LjFjICBbMjMtRGVjLTE5OThdCgogICopIEFkZGVkIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgdG8gY3J5cHRvL2NyeXB0by5oIGFuZCAKICAgICBjaGFuZ2VkIFNTTGVheSB0byBPcGVuU1NMIGluIHZlcnNpb24gc3RyaW5ncy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KICAKICAqKSBTb21lIGZpeHVwcyB0byB0aGUgdG9wLWxldmVsIGRvY3VtZW50cy4KICAgICBbUGF1bCBTdXR0b25dCgogICopIEZpeGVkIHRoZSBuYXN0eSBidWcgd2hlcmUgcnNhcmVmLmggd2FzIG5vdCBmb3VuZCB1bmRlciBjb21waWxlLXRpbWUKICAgICBiZWNhdXNlIHRoZSBzeW1saW5rIHRvIGluY2x1ZGUvIHdhcyBtaXNzaW5nLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBJbmNvcnBvcmF0ZWQgdGhlIHBvcHVsYXIgbm8tUlNBL0RTQS1vbmx5IHBhdGNoZXMgCiAgICAgd2hpY2ggYWxsb3cgdG8gY29tcGlsZSBhIFJTQS1mcmVlIFNTTGVheS4KICAgICBbQW5kcmV3IENvb2tlIC8gSW50ZXJyYWRlciBMZHQuLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXhlZCBuYXN0eSByZWhhc2ggcHJvYmxlbSB1bmRlciBgbWFrZSAtZiBNYWtlZmlsZS5zc2wgbGlua3MnCiAgICAgd2hlbiAic3NsZWF5IiBpcyBzdGlsbCBub3QgZm91bmQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIG1vcmUgcGxhdGZvcm1zIHRvIENvbmZpZ3VyZTogQ3JheSBUM0UsIEhQVVggMTEsIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBCZWNrbWFubiA8YmVja21hbkBhY2wubGFubC5nb3Y+XQoKICAqKSBVcGRhdGVkIHRoZSBSRUFETUUgZmlsZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgdmFyaW91cyAuY3ZzaWdub3JlIGZpbGVzIGluIHRoZSBDVlMgcmVwb3NpdG9yeSBzdWJkaXJzCiAgICAgdG8gbWFrZSBhICJjdnMgdXBkYXRlIiByZWFsbHkgc2lsZW50LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZWNvbXBpbGVkIHRoZSBlcnJvci1kZWZpbml0aW9uIGhlYWRlciBmaWxlcyBhbmQgYWRkZWQKICAgICBtaXNzaW5nIHN5bWJvbHMgdG8gdGhlIFdpbjMyIGxpbmtlciB0YWJsZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIENsZWFuZWQgdXAgdGhlIHRvcC1sZXZlbCBkb2N1bWVudHM7CiAgICAgbyBuZXcgZmlsZXM6IENIQU5HRVMgYW5kIExJQ0VOU0UKICAgICBvIG1lcmdlZCBWRVJTSU9OLCBISVNUT1JZKiBhbmQgUkVBRE1FKiBmaWxlcyBhIENIQU5HRVMuU1NMZWF5IAogICAgIG8gbWVyZ2VkIENPUFlSSUdIVCBpbnRvIExJQ0VOU0UKICAgICBvIHJlbW92ZWQgb2Jzb2xldGUgVE9ETyBmaWxlCiAgICAgbyByZW5hbWVkIE1JQ1JPU09GVCB0byBJTlNUQUxMLlczMgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmVkIGR1bW15IGZpbGVzIGZyb20gdGhlIDAuOS4xYiBzb3VyY2UgdHJlZTogCiAgICAgY3J5cHRvL2FzbjEveCBjcnlwdG8vYmlvL2NkIGNyeXB0by9iaW8vZmcgY3J5cHRvL2Jpby9ncmVwIGNyeXB0by9iaW8vdmkKICAgICBjcnlwdG8vYm4vYXNtLy4uLi4uLmFkZC5jIGNyeXB0by9ibi9hc20vYS5vdXQgY3J5cHRvL2RzYS9mIGNyeXB0by9tZDUvZgogICAgIGNyeXB0by9wZW0vZ21vbi5vdXQgY3J5cHRvL3Blcmxhc20vZiBjcnlwdG8vcGtjczcvYnVpbGQgY3J5cHRvL3JzYS9mCiAgICAgY3J5cHRvL3NoYS9hc20vZiBjcnlwdG8vdGhyZWFkcy9mIG1zL3p6eiBzc2wvZiBzc2wvZi5tYWsgdGVzdC9mCiAgICAgdXRpbC9mLm1hayB1dGlsL3BsL2YgdXRpbC9wbC9mLm1hayBjcnlwdG8vYmYvYmZfbG9jbC5vbGQgYXBwcy9mCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIHZhcmlvdXMgcGxhdGZvcm0gcG9ydGFiaWxpdHkgZml4ZXMuCiAgICAgW01hcmsgSi4gQ294XQoKICAqKSBUaGUgR2VuZXNpcyBvZiB0aGUgT3BlblNTTCBycGplY3Q6CiAgICAgV2Ugc3RhcnQgd2l0aCB0aGUgbGF0ZXN0ICh1bnJlbGVhc2VkKSBTU0xlYXkgdmVyc2lvbiAwLjkuMWIgd2hpY2ggRXJpYyBBLgogICAgIFlvdW5nIGFuZCBUaW0gSi4gSHVkc29uIGNyZWF0ZWQgd2hpbGUgdGhleSB3ZXJlIHdvcmtpbmcgZm9yIEMyTmV0IHVudGlsCiAgICAgc3VtbWVyIDE5OTguCiAgICAgW1RoZSBPcGVuU1NMIFByb2plY3RdCiAKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjBiIGFuZCAwLjkuMWIgIFtub3QgcmVsZWFzZWRdCgogICopIFVwZGF0ZWQgYSBmZXcgQ0EgY2VydGlmaWNhdGVzIHVuZGVyIGNlcnRzLwogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDaGFuZ2VkIHNvbWUgQklHTlVNIGFwaSBzdHVmZi4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgVmFyaW91cyBwbGF0Zm9ybSBwb3J0czogT3BlbkJTRCwgVWx0cml4LCBJUklYIDY0Yml0LCBOZXRCU0QsIAogICAgIERHVVggeDg2LCBMaW51eCBBbHBoYSwgZXRjLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBOZXcgQ09NUCBsaWJyYXJ5IFtjcnlwdG8vY29tcC9dIGZvciBTU0wgUmVjb3JkIExheWVyIENvbXByZXNzaW9uOiAKICAgICBSTEUgKGR1bW15IGltcGxlbWVudGVkKSBhbmQgWkxJQiAocmVhbGx5IGltcGxlbWVudGVkIHdoZW4gWkxJQiBpcwogICAgIGF2YWlsYWJsZSkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZCAtc3RycGFyc2Ugb3B0aW9uIHRvIGFzbjFwYXJzIHByb2dyYW0gd2hpY2ggcGFyc2VzIG5lc3RlZCAKICAgICBiaW5hcnkgc3RydWN0dXJlcyAKICAgICBbRHIgU3RlcGhlbiBIZW5zb24gPHNoZW5zb25AYmlnZm9vdC5jb20+XQoKICAqKSBBZGRlZCAib2lkX2ZpbGUiIHRvIHNzbGVheS5jbmYgZm9yICJjYSIgYW5kICJyZXEiIHByb2dyYW1zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBEU0EgZml4IGZvciAiY2EiIHByb2dyYW0uCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkICItZ2Vua2V5IiBvcHRpb24gdG8gImRzYXBhcmFtIiBwcm9ncmFtLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBSSVBFIE1EMTYwIChybWQxNjApIG1lc3NhZ2UgZGlnZXN0LgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCAtYSAoYWxsKSBvcHRpb24gdG8gInNzbGVheSB2ZXJzaW9uIiBjb21tYW5kLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBQTEFURk9STSBkZWZpbmUgd2hpY2ggaXMgdGhlIGlkIGdpdmVuIHRvIENvbmZpZ3VyZS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgTWVtQ2hlY2tfWFhYWCBmdW5jdGlvbnMgdG8gY3J5cHRvL21lbS5jIGZvciBtZW1vcnkgY2hlY2tpbmcuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEV4dGVuZGVkIHRoZSBBU04uMSBwYXJzZXIgcm91dGluZXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEV4dGVuZGVkIEJJTyByb3V0aW5lcyB0byBzdXBwb3J0IFJFVVNFQUREUiwgc2VlaywgdGVsbCwgZXRjLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBhIEJOX0NUWCB0byB0aGUgQk4gbGlicmFyeS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgdGhlIHdlYWsga2V5IHZhbHVlcyBpbiBERVMgbGlicmFyeQogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDaGFuZ2VkIEFQSSBpbiBFVlAgbGlicmFyeSBmb3IgY2lwaGVyIGFsaWFzZXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIFJDMi82NGJpdCBjaXBoZXIuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIENvbnZlcnRlZCB0aGUgbGhhc2ggbGlicmFyeSB0byB0aGUgY3J5cHRvL21lbS5jIGZ1bmN0aW9ucy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgbW9yZSByZWNvZ25pemVkIEFTTi4xIG9iamVjdCBpZHMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIG1vcmUgUlNBIHBhZGRpbmcgY2hlY2tzIGZvciBTU0wvVExTLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBCSU8gcHJveHkvZmlsdGVyIGZ1bmN0aW9uYWxpdHkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIGV4dHJhX2NlcnRzIHRvIFNTTF9DVFggd2hpY2ggY2FuIGJlIHVzZWQKICAgICBzZW5kIGV4dHJhIENBIGNlcnRpZmljYXRlcyB0byB0aGUgY2xpZW50IGluIHRoZSBDQSBjZXJ0IGNoYWluIHNlbmRpbmcKICAgICBwcm9jZXNzLiBJdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoKS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgTm93IEZvcnRlenphIGlzIGRlbmllZCBpbiB0aGUgYXV0aGVudGljYXRpb24gcGhhc2UgYmVjYXVzZQogICAgIHRoaXMgaXMga2V5IGV4Y2hhbmdlIG1lY2hhbmlzbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IFNTTGVheSBhdCBhbGwuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGl0aW9uYWwgUEtDUzEgY2hlY2tzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBTdXBwb3J0IHRoZSBzdHJpbmcgIlRMU3YxIiBmb3IgYWxsIFRMUyB2MSBjaXBoZXJzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBmdW5jdGlvbiBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KCkgd2hpY2ggZ2l2ZXMgdGhlCiAgICAgZXhfZGF0YSBpbmRleCBvZiB0aGUgU1NMIGNvbnRleHQgaW4gdGhlIFg1MDlfU1RPUkVfQ1RYIGV4X2RhdGEuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEZpeGVkIGEgZmV3IG1lbW9yeSBsZWFrcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgdmFyaW91cyBjb2RlIGFuZCBjb21tZW50IHR5cG9zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBIG1pbm9yIGJ1ZyBpbiBzc2wvczNfY2xudC5jIHdoZXJlIHRoZXJlIHdvdWxkIGFsd2F5cyBiZSA0IDAgCiAgICAgYnl0ZXMgc2VudCBpbiB0aGUgY2xpZW50IHJhbmRvbS4KICAgICBbRWR3YXJkIEJpc2hvcCA8ZWJpc2hvcEBzcHlnbGFzcy5jb20+XQoK