ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKCkRhbmllbCBTdGVuYmVyZyAoMjggTWF5IDIwMDgpCi0gRW1pbCBSb21hbnVzIGZvdW5kIGEgcHJvYmxlbSBhbmQgaGVscGVkIG1lIHJlcGVhdCBpdC4gSXQgb2NjdXJlZCB3aGVuIHVzaW5nCiAgdGhlIGN1cmxfbXVsdGlfc29ja2V0KCkgQVBJIHdpdGggSFRUUCBwaXBlbGluaW5nIGVuYWJsZWQgYW5kIGNvdWxkIGxlYWQgdG8KICB0aGUgcGlwZWxpbmUgYmFzaWNhbGx5IHN0YWxsaW5nIGZvciBhIHZlcnkgbG9uZyBwZXJpb2Qgb2YgdGltZSB1bnRpbCBpdCB0b29rCiAgb2ZmIGFnYWluLgoKLSBKZWZmIFdlYmVyIHJlcG9ydGVkIG1lbW9yeSBsZWFrcyB3aXRoIGFib3J0ZWQgU0NQIGFuZCBTRlRQIHRyYW5zZmVycyBhbmQKICBwcm92aWRlZCBleGNlbGxlbnQgcmVwZWF0IHJlY2lwZXMuIEkgZml4ZWQgdGhlIGNhc2VzIEkgbWFuYWdlZCB0byByZXByb2R1Y2UKICBidXQgSmVmZiBzdGlsbCBnb3Qgc29tZSAoU0NQKSBwcm9ibGVtcyBldmVuIGFmdGVyIHRoZXNlIGZpeGVzOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOC0wNS8wMzQyLmh0bWwKCkRhbmllbCBTdGVuYmVyZyAoMjYgTWF5IDIwMDgpCi0gQnVnIHJlcG9ydCAjMTk3MzM1MiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTk3MzM1MikgaWRlbnRpZmllZAogIGhvdyB0aGUgSFRUUCByZWRpcmVjdCBmb2xsb3dpbmcgY29kZSBkaWRuJ3QgcHJvcGVybHkgZm9sbG93IHRvIGEgbmV3IFVSTCBpZgogIHRoZSBuZXcgdXJsIHdhcyBidXQgYSBxdWVyeSBzdHJpbmcgc3VjaCBhcyAiTG9jYXRpb246ID9tb289Zm9vIi4gVGVzdCBjYXNlCiAgMTAzMSB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMgZml4LgoKLSBBbmRyZWFzIEZhZXJiZXIgYW5kIFNjb3R0IE1jQ3JlYXJ5IG1hZGUgKGxpYiljdXJsIGJ1aWxkIGZvciB0aGUgSGFpa3UgT1MuIAoKWWFuZyBUc2UgKDI2IE1heSAyMDA4KQotIERhdmlkIFJvc2Vuc3RyYXVjaCByZXBvcnRlZCB0aGF0IGhlYWRlciBmaWxlcyBzcG5lZ29oZWxwLmggYW5kCiAgb3BlbnNzbC9vYmplY3RzLmggd2VyZSBuZWVkZWQgdG8gY29tcGlsZSBTUE5FR08gc3VwcG9ydC4KCkRhbmllbCBGYW5kcmljaCAoMjIgTWF5IDIwMDgpCi0gTWFkZSBzdXJlIHRvIHBhc3MgbG9uZ3MgaW4gdG8gY3VybF9lYXN5X3NldG9wdCB3aGVyZSBuZWNlc3NhcnkgaW4gdGhlCiAgZXhhbXBsZSBwcm9ncmFtcyBhbmQgbGlidGVzdCBjb2RlLgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBNYXkgMjAwOCkKLSBXaGVuIHRyeWluZyB0byByZXBlYXQgYSBtdWx0aSBpbnRlcmZhY2UgcHJvYmxlbSBJIGZlbGwgb3ZlciBhIGZldyBtdWx0aQogIGludGVyZmFjZSBwcm9ibGVtczoKCiAgbyB3aXRoIHBpcGVsaW5pbmcgZGlzYWJsZWQsIHRoZSBzdGF0ZSBzaG91bGQgbmV2ZXIgYmUgc2V0IHRvIFdBSVRETyBidXQKICAgIHJhdGhlciBnbyBzdHJhaWdodCB0byBETwoKICBvIHdlIGhhZCBtdWx0aXBsZSBzdGF0ZXMgZm9yIHdoaWNoIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiByZXR1cm5lZCBubyBzb2NrZXQKICAgIGF0IGFsbCB0byB3YWl0IGZvciwgd2l0aCB0aGUgZWZmZWN0IHRoYXQgbGliY3VybCBjYWxscyB0aGUgc29ja2V0IGNhbGxiYWNrCiAgICAod2hlbiBjdXJsX211bHRpX3NvY2tldCgpIGlzIHVzZWQpIHdpdGggUkVNT1ZFIHByZW1hdHVyZWx5IChhcyBpdCB3b3VsZCBiZQogICAgYWRkZWQgYWdhaW4gd2l0aGluIHZlcnkgc2hvcnRseSkKCiAgbyB3aGVuIGluIERPIGFuZCBET0lORyBzdGF0ZXMsIHRoZSBIVFRQIGFuZCBIVFRQUyBwcm90b2NvbCBoYW5kbGVyIGZ1bmN0aW9ucwogICAgZGlkbid0IHJldHVybiB0aGF0IHRoZSBzb2NrZXQgc2hvdWxkIGJlIHdhaXRlZCBmb3Igd3JpdGluZywgYnV0IGluc3RlYWQgaXQKICAgIHdhcyB0cmVhdGVkIGFzIGlmIG5vIHNvY2tldCB3YXMgbmVlZGluZyBtb25pdG9yaW5nIHNvIGFnYWluIFJFTU9WRSB3YXMKICAgIGNhbGxlZCBwcmVtYXR1cmVseS4KCkRhbmllbCBTdGVuYmVyZyAoMTMgTWF5IDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlIDU1NiB0aGF0IHVzZXMgY3VybF9lYXN5X3NlbmQoKSBhbmQgY3VybF9lYXN5X3JlY3YoKQoKRGFuaWVsIFN0ZW5iZXJnICg5IE1heSAyMDA4KQotIEludHJvZHVjaW5nIGN1cmxfZWFzeV9zZW5kKCkgYW5kIGN1cmxfZWFzeV9yZWN2KCkuIFRoZXkgY2FuIGJlIHVzZWQgdG8gc2VuZAogIGFuZCByZWNlaXZlIGRhdGEgb3ZlciBhIGNvbm5lY3Rpb24gcHJldmlvdXNseSBzZXR1cCB3aXRoIGN1cmxfZWFzeV9wZXJmb3JtKCkKICBhbmQgaXRzIENVUkxPUFRfQ09OTkVDVF9PTkxZIG9wdGlvbi4gVGhlIHNlbmRyZWN2LmMgZXhhbXBsZSB3YXMgYWRkZWQgdG8KICBzaG93IGhvdyB0aGV5IGNhbiBiZSB1c2VkLgoKWWFuZyBUc2UgKDkgTWF5IDIwMDgpCi0gSW50ZXJuYWwgdGltZSBkaWZmZXJlbmNlcyBub3cgdXNlIG1vbm90b25pYyB0aW1lIHNvdXJjZSBpZiBhdmFpbGFibGUuCiAgVGhpcyBhbHNvIGltcGxpZXMgdGhlIHJlbW92YWwgb2YgdGhlIHdpbm1tLmxpYiBkZXBlbmRlbmN5IGZvciBXSU4zMi4KCkRhbmllbCBTdGVuYmVyZyAoOSBNYXkgMjAwOCkKLSBTdGVmYW4gS3JhdXNlIHJlcG9ydGVkIGEgYnVzeS1sb29waW5nIGNhc2Ugd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgYW5kIGRvaW5nIENPTk5FQ1QgdG8gYSBwcm94eS4gVGhlIGFwcCB3b3VsZCB0aGVuIGJ1c3ktbG9vcCB1bnRpbCB0aGUgcHJveHkKICBjb21wbGV0ZWQgaXRzIHJlc3BvbnNlLgoKTWljaGFsIE1hcmVrICg5IE1heSAyMDA4KQotIE1ha2UgQ3VybF93cml0ZSBhbmQgaXQncyBjYWxsZWVzIGFjY2VwdCBhIGNvbnN0IHBvaW50ZXIsIGluIHByZXBhcmF0aW9uCiAgb2YgdGV0ZXRlc3QncyBwYXRjaCBmb3IgY3VybF9lYXN5X3NlbmQoKQoKRGFuaWVsIFN0ZW5iZXJnICg3IE1heSAyMDA4KQotIExpYW0gSGVhbHkgZmlsZWQgdGhlIGRlYmlhbiBidWcgcmVwb3J0ICM0ODAwNDQKICAoaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQ4MDA0NCkgaWRlbnRpZnlpbmcgYQogIHNlZ2ZhdWx0IHdoZW4gdXNpbmcga3JiNSBmdHAsIGJ1dCB0aGUga3JiNCBjb2RlIGhhZCB0aGUgc2FtZSBwcm9ibGVtLgoKWWFuZyBUc2UgKDcgTWF5IDIwMDgpCi0gQ2hyaXN0b3BoZXIgUGFsb3cgcHJvdmlkZWQgdGhlIHBhdGNoIChlZGl0ZWQgYnkgbWUpIHRoYXQgaW50cm9kdWNlcyB0aGUKICB1c2Ugb2YgbWljcm9zZWNvbmQgcmVzb2x1dGlvbiBrZXlzIGZvciBpbnRlcm5hbCBzcGxheSB0cmVlcy4KCkRhbmllbCBTdGVuYmVyZyAoNCBNYXkgMjAwOCkKLSBZdXJpeSBTb3NvdiBwb2ludGVkIG91dCBhIGNvbmZpZ3VyZSBmaXggZm9yIGRldGVjdGluZyBjLWFyZXMgd2hlbiB0aGF0IGlzCiAgYnVpbHQgZGVidWctZW5hYmxlZC4KCkRhbmllbCBTdGVuYmVyZyAoMyBNYXkgMjAwOCkKLSBCZW4gVmFuIEhvZiBmaWxlZCBidWcgcmVwb3J0ICMxOTQ1MjQwOiAibGliY3VybCBzb21ldGltZXMgc2VuZHMgYm9keSB0d2ljZQogIHdoZW4gdXNpbmcgQ1VSTF9BVVRIX0FOWSIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE5NDUyNDApLgogIFRoZSBwcm9ibGVtIHdhcyB0aGF0IHdoZW4gbGliY3VybCByZXdvdW5kIGEgc3RyZWFtIG1lYW50IGZvciB1cGxvYWQgd2hlbiBpdAogIHdvdWxkIHByZXBhcmUgZm9yIGEgc2Vjb25kIHJlcXVlc3QsIGl0IGNvdWxkIGFjY2lkZW50YWxseSBjb250aW51ZSB0aGUKICBzZW5kaW5nIG9mIHRoZSByZXdvdW5kIGRhdGEgb24gdGhlIGZpcnN0IHJlcXVlc3QgaW5zdGVhZCBvZiBvbiB0aGUgc2Vjb25kLgogIEJlbiBhbHNvIHByb3ZpZGVkIHRlc3QgY2FzZSAxMDMwIHRoYXQgdmVyaWZpZXMgdGhpcyBmaXguCgpEYW5pZWwgU3RlbmJlcmcgKDMgTWF5IDIwMDgpCi0gSmVhbi1GcmFuY29pcyBCZXJ0cmFuZCByZXBvcnRlZCBhIGxpYmN1cmwgY3Jhc2ggd2l0aCBDVVJMT1BUX1RDUF9OT0RFTEFZCiAgc2luY2UgbGliY3VybCB1c2VkIGdldHByb3RvYnluYW1lKCkgYW5kIHRoYXQgaXNuJ3QgdGhyZWFkLXNhZmUuIFdlIG5vdwogIHN3aXRjaGVkIHRvIHVzZSBJUFBST1RPX1RDUCB1bmNvbmRpdGlvbmFsbHksIGJ1dCBwZXJoYXBzIHRoZSBwcm9wZXIgZml4IGlzCiAgdG8gZGV0ZWN0IHRoZSB0aHJlYWQtc2FmZSB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBhbmQgdXNlIHRoYXQuCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTA1LzAwMTEuaHRtbAoKRGFuaWVsIFN0ZW5iZXJnICgxIE1heSAyMDA4KQotIEJhcnQgV2hpdGVsZXkgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1hZGUgbGliY3VybCB3b3JrIHByb3Blcmx5IHdoZW4gYW4gYXBwCiAgdXNlcyB0aGUgQ1VSTE9QVF9PUEVOU09DS0VURlVOQ1RJT04gY2FsbGJhY2sgdG8gY3JlYXRlIGEgdW5peCBkb21haW4gc29ja2V0CiAgdG8gYSBodHRwIHNlcnZlci4KCkRhbmllbCBTdGVuYmVyZyAoMjkgQXByIDIwMDgpCi0gVG8gbWFrZSBpdCBlYXNpZXIgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgbG90cyBvZiBtYWdpYyBzdHVmZiBkb25lIG9uCiAgcmVkaXJlY3Rpb25zIGFuZCB0aHVzIGNhbm5vdCB1c2UgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiBlYXNpbHksIHdlIG5vdwogIGludHJvZHVjZSB0aGUgbmV3IENVUkxJTkZPX1JFRElSRUNUX1VSTCBvcHRpb24gdGhhdCBsZXRzIGFwcGxpY2F0aW9ucwogIGV4dHJhY3QgdGhlIFVSTCBsaWJjdXJsIHdvdWxkJ3ZlIHJlZGlyZWN0ZWQgdG8gaWYgaXQgaGFkIGJlZW4gdG9sZCB0by4gVGhpcwogIHRoZW4gZW5hYmxlcyB0aGUgYXBwbGljYXRpb24gdG8gY29udGludWUgdG8gdGhhdCBVUkwgYXMgaXQgdGhpbmtzIGlzCiAgc3VpdGFibGUsIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWltcGxlbWVudCB0aGUgbWFnaWMgb2YgY3JlYXRpbmcgdGhlIG5ldyBVUkwKICBmcm9tIHRoZSBMb2NhdGlvbjogaGVhZGVyIGV0Yy4gVGVzdCAxMDI5IHZlcmlmaWVzIGl0LgoKWWFuZyBUc2UgKDI5IEFwciAyMDA4KQotIEltcHJvdmVkIGVhc3kgaW50ZXJmYWNlIHJlc29sdmluZyB0aW1lb3V0IGhhbmRsaW5nIGluIGMtYXJlcyBlbmFibGVkIGJ1aWxkcwoKRGFuaWVsIEZhbmRyaWNoICgyOCBBcHIgMjAwOCkKLSBBZGRlZCB0ZXN0IDEwMjggdG8gdGVzdCBhbiBIVFRQIHJlZGlyZWN0IHRvIGEgRlRQIFVSTC4KCkRhbmllbCBTdGVuYmVyZyAoMjggQXByIDIwMDgpCi0gTm9yYmVydCBGcmVzZSBmaWxlZCBidWcgcmVwb3J0ICMxOTUxNTg4OiAiUHJvYmxlbSB3aXRoIGN1cmxmdHBmcyBhbmQKICBsaWJjdXJsIiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTk1MTU4OCkgd2hpY2ggc2VlbXMgdG8gYmUgYW4KICBpZGVudGljYWwgcmVwb3J0IHRvIHdoYXQgRGVuaXMgR29sb3ZhbiByZXBvcnRlZCBpbgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOC0wMi8wMTA4Lmh0bWwgVGhlIEZUUCBjb2RlIGRpZG4ndCByZXNldCB0aGUKICB1c2VyL3Bhc3N3b3JkIHBvaW50ZXJzIHByb3Blcmx5IGV2ZW4gdGhvdWdoIHRoZXJlIG1pZ2h0J3ZlIGJlZW4gYSBuZXcKICBzdHJ1Y3QvY2Nvbm5lY3Rpb24gZ2V0dGluZyB1c2VkLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBBcHIgMjAwOCkKLSBSZXZlcnRlZCBiYWNrIHRvIHVzZSBhdXRvbWFrZSAxLjkuNiBpbiB0aGUgbmV4dCByZWxlYXNlIChmcm9tIGF1dG9tYWtlCiAgMS4xMC4xKSBzaW5jZSBpdCAqc3RpbGwqIHN1ZmZlcnMgZnJvbSBTb2xhcmlzLXJlbGF0ZWQgYnVncy4gT3VyIHByZXZpb3VzCiAgYXV0b21ha2UgMS4xMCBwcm9ibGVtIHdhcyByZXBvcnRlZCBpbiBidWcgIzE3MDEzNjAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcwMTM2MCkgYW5kIHRoaXMgcmVjZW50IHByb2JsZW0gd2FzCiAgYnVnICMxOTQ0ODI1IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTQ0ODI1KS4gSSBoYXZlIG5vdAogIHBlcnNvbmFsbHkgYXBwcm9hY2hlZCB0aGUgYXV0b21ha2UgdGVhbSBhYm91dCBlaXRoZXIgb25lIG9mIHRoZXNlIGJ1dCBJCiAgZmlndXJlIHdlIG5lZWQgYSBTb2xhcmlzIDEwIGd1eSB0byBkbyBpdCEKICAKWWFuZyBUc2UgKDI1IEFwciAyMDA4KQotIEFkZGVkICd0aW1lb3V0JyBhbmQgJ2RlbGF5JyBhdHRyaWJ1dGVzIHN1cHBvcnQgZm9yIHRoZSB0ZXN0IGhhcm5lc3MKICA8Y29tbWFuZD4gc3Vic2VjdGlvbi4KCkRhbmllbCBGYW5kcmljaCAoMjQgQXByIDIwMDgpCi0gTWFkZSAtLXN0ZGVyciBhYmxlIHRvIHJlZGlyZWN0IGFsbCBzdGRlcnIgbWVzc2FnZXMuCgpZYW5nIFRzZSAoMjMgQXByIDIwMDgpCi0gSW1wcm92ZSBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiB0ZXN0IGhhcm5lc3MgcnVudGVzdHMucGwgc2NyaXB0CiAgYW5kIHRlc3QgaGFybmVzcyBzZXJ2ZXJzIHRvIG1pbmltaXplIHJpc2sgb2YgZmFsc2UgdGVzdCBmYWlsdXJlcy4KCkRhbmllbCBGYW5kcmljaCAoMjIgQXByIDIwMDgpCi0gQWRkZWQgc3VwcG9ydCBmb3IgcnVubmluZyBvbiBTeW1iaWFuIE9TLgoKRGFuaWVsIEZhbmRyaWNoICgxOCBBcHIgMjAwOCkKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwMjYgYW5kIDEwMjcgdG8gZG8gc29tZSBydWRpbWVudGFyeSB0ZXN0cyBvbiB0aGUgLS1tYW51YWwKICBhbmQgLS1oZWxwIG9wdGlvbnMuCgpNaWNoYWwgTWFyZWsgKDE0IEFwciAyMDA4KQotIGFsbG93IGRpc2FibGluZyB0aGUgdHlwZWNoZWNrZXIgYnkgZGVmaW5pbmcgQ1VSTF9ESVNBQkxFX1RZUEVDSEVDSywgYXMKICBkaXNjdXNzZWQgaW4gaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTA0LzAyOTEuaHRtbAoKRGFuaWVsIFN0ZW5iZXJnICgxNCBBcHIgMjAwOCkKLSBTdGVmYW4gS3JhdXNlIHJlcG9ydGVkIGEgY2FzZSB3aGVyZSB0aGUgT3BlblNTTCBoYW5kc2hha2UgcGhhc2Ugd2Fzbid0CiAgcHJvcGVybHkgYWNrbm93bGVkZ2luZyB0aGUgdGltZW91dCB2YWx1ZXMsIGxpa2UgaWYgeW91IHB1bGxlZCB0aGUgbmV0d29yawogIHBsdWcgaW4gdGhlIG1pZHN0IG9mIGl0LgoKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZpeGVkIGEgc2Vjb25kIGNhc2Ugb2Ygbm90IGNoZWNraW5nIHRoZSBtYWxsb2MoKQogIHJldHVybiBjb2RlIGluIHRoZSBOZWdvdGlhdGUgY29kZS4KCi0gU2FuZG9yIEZlbGRpIHJlcG9ydGVkIGJ1ZyAjMTk0MjAyMgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTQyMDIyKSBwb2ludGluZyBvdXQgYSBtaXN0YWtlIGluIHRoZQogIGxpYi9NYWtlZmlsZS52Y1s2OF0gbWFrZWZpbGVzJyByZWxlYXNlLXNzbC1kbGwgdGFyZ2V0LgoKLSBCcm9jayBOb2xhbmQgcmVwb3J0ZWQgdGhhdCBjdXJsIGJlaGF2ZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHdoaWNoIG9yZGVyCiAgeW91IHVzZWQgLWkgYW5kIC1JLgoKRGFuaWVsIFN0ZW5iZXJnICgxMiBBcHIgMjAwOCkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZvdW5kIGFuZCBmaXhlZCBhIGNhc2Ugd2hlcmUgbWFsbG9jKCkgd2FzIGNhbGxlZCBidXQKICB3YXMgbm90IGNoZWNrZWQgZm9yIGEgTlVMTCByZXR1cm4sIGluIHRoZSBOZWdvdGlhdGUgY29kZS4KCkRhbmllbCBGYW5kcmljaCAoOSBBcHIgMjAwOCkKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwMjQgJiAxMDI1IHRvIHRlc3QgYSBzY2VuYXJpbyBzaW1pbGFyIHRvIHRoZSBvbmUgcmVwb3J0ZWQKICBieSBCZW4gQ29tYmVlIHdoZXJlIGxpYmN1cmwgd291bGQgc2VuZCB0aGUgd3JvbmcgY29va2llIHRvIGEgcmVkaXJlY3RlZAogIHNlcnZlci4gIGxpYmN1cmwgd2FzIGRvaW5nIHRoZSByaWdodCB0aGluZyBpbiB0aGVzZSB0ZXN0IGNhc2VzLgoKTWljaGFsIE1hcmVrICg3IEFwciAyMDA4KQotIEZpeCB0aGUgTUlUIC8gSGVpbWRhbCBjaGVjayBmb3IgZ29vZDoKICBEZWZpbmUgSEFWRV9HU1NNSVQgaWYgPGdzc2FwaS97Z3NzYXBpLmgsZ3NzYXBpX2dlbmVyaWMuaCxnc3NhcGlfa3JiNS5ofT4gYXJlCiAgYXZhaWxhYmxlLCBvdGhlcndpc2UgZGVmaW5lIEhBVkVfR1NTSEVJTURBTCBpZiA8Z3NzYXBpLmg+IGlzIGF2YWlsYWJsZS4KICAKICBPbmx5IGRlZmluZSBHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSB0byBnc3NfbnRfc2VydmljZV9uYW1lIGlmCiAgR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UgaXNuJ3QgZGVjbGFyZWQgYnkgdGhlIGdzc2FwaSBoZWFkZXJzLiBUaGlzIHNob3VsZAogIGF2b2lkIGJyZWFrYWdlIGluIGNhc2Ugd2Ugd3JvbmdseSByZWNvZ25pemUgSGVpbWRhbCBhcyBNSVQgYWdhaW4uCgpEYW5pZWwgU3RlbmJlcmcgKDUgQXByIDIwMDgpCi0gQWxleGV5IFNpbWFrIGZpeGVkIGN1cmxfZWFzeV9yZXNldCgpIHRvIHJlc2V0IHRoZSBtYXggcmVkaXJlY3QgbGltaXQgcHJvcGVybHkKCi0gQmFzZWQgb24gdGhlIERlYmlhbiBidWcgcmVwb3J0ICM0NzQyMjQgdGhhdCBjb21wbGFpbmVkIGFib3V0IHRoZSBGVFAgZXJyb3IKICBtZXNzYWdlIHdoZW4gbGliY3VybCBkb2Vzbid0IGdldCBhIDIyMCBiYWNrIGltbWVkaWF0ZWx5IG9uIGNvbm5lY3QsIEkgbm93CiAgY2hhbmdlZCBpdCB0byBiZSBtb3JlIHNwZWNpZmljIG9uIHdoYXQgdGhlIHByb2JsZW0gaXMuIEFsc28gd29ydGggbm90aWNpbmc6CiAgd2hpbGUgdGhlIGJ1ZyByZXBvcnQgY29udGFpbnMgYW4gZXhhbXBsZSB3aGVyZSB0aGUgcmVzcG9uc2UgaXM6CgogICAgNDIxIFRoZXJlIGFyZSB0b28gbWFueSBjb25uZWN0ZWQgdXNlcnMsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIKCiAgd2UgY2Fubm90IGFzc3VtZSB0aGF0IHRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYWx3YXlzIGJlIHRoaXMgcmVhZGFibGUgbm9yCiAgdGhhdCBpdCBmaXRzIHdpdGhpbiBhIHBhcnRpY3VsYXIgYm91bmRhcnkgZXRjLgoKRGFuaWVsIEZhbmRyaWNoICgzIEFwciAyMDA4KQotIEFkZGVkIHRlc3Q2MjcgdG8gdGVzdCBTRlRQIHdpdGggQ1VSTE9QVF9OT0JPRFkKCkRhbmllbCBTdGVuYmVyZyAoMyBBcHIgMjAwOCkKLSBTZXR0aW5nIENVUkxPUFRfTk9CT0RZIHRvIEZBTFNFIHdpbGwgbm93IHN3aXRjaCB0aGUgSFRUUCByZXF1ZXN0IG1ldGhvZCB0bwogIEdFVCBzaW1wbHkgYmVjYXVzZSBwcmV2aW91c2x5IHdoZW4geW91IHNldCBDVVJMT1BUX05PQk9EWSB0byBUUlVFIGZpcnN0IGFuZAogIHRoZW4gRkFMU0UgeW91J2QgZW5kIHVwIGluIGEgYnJva2VuIHN0YXRlIHdoZXJlIGEgSFRUUCByZXF1ZXN0IHdvdWxkIGRvIGEKICBIRUFEIGJ5IHN0aWxsIGFjdCBhIGxvdCBsaWtlIGZvciBhIEdFVCBhbmQgaGFuZyB3YWl0aW5nIGZvciB0aGUgY29udGVudCBldGMuCgotIFNjb3R0IEJhcnJldHQgYWRkZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9OT0JPRFkgb3ZlciBTRlRQCgpEYW5pZWwgRmFuZHJpY2ggKDMgQXByIDIwMDgpCi0gTWFkZSBzdXJlIHRoYXQgY3VybF9nbG9iYWxfaW5pdCBpcyBjYWxsZWQgaW4gYWxsIHRoZSBtdWx0aXRocmVhZGVkCiAgZXhhbXBsZSBwcm9ncmFtcy4KCk1pY2hhbCBNYXJlayAoMzEgTWFyIDIwMDgpCi0gUmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGNhLWJ1bmRsZS5oIGZpbGUuIFRoZSB2ZXJiYXRpbSB2YWx1ZSBvZiAkY2EgYW5kCiAgJGNhcGF0aCBpcyBrbm93biB0byBjb25maWd1cmUsIHNvIGl0IGNhbiBiZSBkZWZpbmVkIGluIGNvbmZpZy5oIGluc3RlYWQuCgpEYW5pZWwgU3RlbmJlcmcgKDMxIE1hciAyMDA4KQotIEFkZGVkIENVUkxGT1JNX1NUUkVBTSBhcyBhIHN1cHBvcnRlZCBvcHRpb24gdG8gY3VybF9mb3JtYWRkKCkgdG8gYWxsb3cgYW4KICBhcHBsaWNhdGlvbiB0byBwcm92aWRlIGRhdGEgZm9yIGEgbXVsdGlwYXJ0IHdpdGggdGhlIHJlYWQgY2FsbGJhY2suIE5vdGUKICB0aGF0IHRoZSBzaXplIG5lZWRzIHRvIGJlIHByb3ZpZGVkIHdpdGggQ1VSTEZPUk1fQ09OVEVOVFNMRU5HVEggd2hlbiB0aGUKICBzdHJlYW0gb3B0aW9uIGlzIHVzZWQuIFRoaXMgZmVhdHVyZSBpcyB2ZXJpZmllZCBieSB0aGUgbmV3IHRlc3QgY2FzZQogIDU1NC4gVGhpcyBmZWF0dXJlIHdhcyBzcG9uc29yZWQgYnkgWHBvbmF1dC4KCkRhbmllbCBGYW5kcmljaCAoMzAgTWFyIDIwMDgpCi0gQ2hhbmdlZCB0aGUgbWFrZWZpbGUgc28gdGhlIGRvYy9leGFtcGxlcy8gcHJvZ3JhbXMgYXJlIG5ldmVyIGJ1aWx0IGluIGEKICBub3JtYWwgYnVpbGQvaW5zdGFsbCAob25seSB3aXRoIHRoZSAnbWFrZSBjaGVjaycgdGFyZ2V0KSwgc28gdGhhdCBhCiAgYnVpbGQgZmFpbHVyZSBpbiB0aGUgZXhhbXBsZXMgaXNuJ3QgZmF0YWwuCgpWZXJzaW9uIDcuMTguMSAoMzAgTWFyY2ggMjAwOCkKCkRhbmllbCBTdGVuYmVyZyAoMjggTWFyIDIwMDgpCi0gU3RlcGhlbiBDb2xseWVyIHBvaW50ZWQgb3V0IHRoYXQgY29uZmlndXJlIC0td2l0aC1saWJzc2gyIHdpdGhvdXQgYSBnaXZlbgogIHBhdGggZGlkbid0IHdvcmsgcHJvcGVybHkuCgpEYW5pZWwgU3RlbmJlcmcgKDI3IE1hciAyMDA4KQotIEFzIGZvdW5kIG91dCBhbmQgcmVwb3J0ZWQgYnkgRGFuIFBldGl0dCwgbGliY3VybCBkaWRuJ3Qgc2hvdyBwcm9ncmVzcy9jYWxsCiAgdGhlIHByb2dyZXNzIGNhbGxiYWNrIGZvciB0aGUgZmlyc3QgKHBvdGVudGlhbGx5IGh1Z2UpIHBpZWNlIG9mIGJvZHkgZGF0YQogIHNlbnQgdG9nZXRoZXIgd2l0aCB0aGUgUE9TVCByZXF1ZXN0IGhlYWRlcnMgaW4gdGhlIGluaXRpYWwgc2VuZCgpLgoKRGFuaWVsIFN0ZW5iZXJnICgyNSBNYXIgMjAwOCkKLSBNYWRlIHNldHRpbmcgdGhlIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTiBvcHRpb24gcmV0dXJuIGEgZmFpbHVyZSBpbiBjYXNlCiAgbGliY3VybCB3YXNuJ3QgYnVpbHQgdG8gdXNlIE9wZW5TU0wgYXMgdGhhdCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgdGhpcwogIG9wdGlvbiB0byBmdW5jdGlvbiEKCkRhbmllbCBTdGVuYmVyZyAoMjIgTWFyIDIwMDgpCi0gRml4ZWQgdGhlIHByb2JsZW0gd2l0aCBkb2luZyBhIHplcm8gYnl0ZSBTQ1AgdHJhbnNmZXIsIHZlcmlmaWVkIHdpdGggdGVzdAogIGNhc2UgNjE3ICh3aGljaCB3YXMgYWRkZWQgYnkgRGFuaWVsIEZhbmRyaWNoIDUgTWFyIDIwMDgpLgoKRGFuaWVsIEZhbmRyaWNoICgyMCBNYXIgMjAwOCkKLSBGaXhlZCBhIHByb2JsZW0gd2hlcmUgY3VybC1jb25maWcgLS1wcm90b2NvbHMgY291bGQgZXJyb25lb3VzbHkgc2hvdyBMREFQUwogIHN1cHBvcnQgd2hlbiBjdXJsIGRpZG4ndCBldmVuIGhhdmUgcmVndWxhciBMREFQIHN1cHBvcnQuICBJdCBsb29rcyBsaWtlCiAgdGhpcyBjb3VsZCBoYXBwZW4gd2hlbiB0aGUgLS1lbmFibGUtbGRhcHMgY29uZmlndXJlIHN3aXRjaCBpcyBnaXZlbiBidXQKICBjb25maWd1cmUgY291bGRuJ3QgZmluZCB0aGUgTERBUCBoZWFkZXJzIG9yIGxpYnJhcmllcy4KCk1pY2hhbCBNYXJlayAoMjAgTWFyIDIwMDgpCi0gQWRkZWQgLS13aXRoLWNhLXBhdGg9RElSRUNUT1JZIGNvbmZpZ3VyZSBvcHRpb24gdG8gdXNlIGFuIG9wZW5TU0wgQ0FwYXRoIGJ5CiAgZGVmYXVsdCBpbnN0ZWFkIG9mIGEgY2EgYnVuZGxlLiBUaGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGFsc28gbG9vayBmb3IgYQogIGNhIHBhdGggaWYgbm8gY2EgYnVuZGxlIGlzIGZvdW5kIGFuZCBubyBvcHRpb24gZ2l2ZW4uCgotIEZpeGVkIGRldGVjdGlvbiBvZiBwcmV2aW91c2x5IGluc3RhbGxlZCBjdXJsLWNhLWJ1bmRsZS5jcnQKCkRhbmllbCBGYW5kcmljaCAoMTggTWFyIDIwMDgpCi0gQWRkZWQgdGVzdCA2MjYgdG8gcmVwcm9kdWNlIGFuIGluZmluaXRlIGxvb3Agd2hlbiBnaXZlbiBhbiBpbnZhbGlkCiAgU0ZUUCBxdW90ZSBjb21tYW5kIHJlcG9ydGVkIGJ5IFZpbmNlbnQgTGUgTm9ybWFuZCwgYW5kIGZpeGVkIGl0LgoKTWljaGFsIE1hcmVrICgxOCBNYXIgMjAwOCkKLSBBZGRlZCBjdXJsX2Vhc3lfZ2V0aW5mbyB0eXBlY2hlY2tlci4KCi0gQWRkZWQgbWFjcm9zIGZvciBjdXJsX3NoYXJlX3NldG9wdCBhbmQgY3VybF9tdWx0aV9zZXRvcHQgdG8gY2hlY2sgYXQgbGVhc3QKICB0aGUgY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzLgoKRGFuaWVsIEZhbmRyaWNoICgxMyBNYXIgMjAwOCkKLSBBZGRlZCB0ZXN0cyA2MjItNjI1IHRvIHRlc3QgU0ZUUC9TQ1AgdXBsb2Fkcy4gVGVzdCA2MjUgd2FzIGFuIGF0dGVtcHQgdG8KICByZXByb2R1Y2UgdGhlIC0tZnRwLWNyZWF0ZS1kaXJzIHByb2JsZW0gcmVwb3J0ZWQgYnkgQnJpYW4gVWxtLCBidXQgdGhhdAogIHNlZW1zIHRvIG5lZWQgYSBjYWxsIGN1cmxfZWFzeV9yZXNldCgpIHdoaWNoIHRoaXMgdGVzdCBjYXNlIGRvZXNuJ3QgZG8uCgpEYW5pZWwgU3RlbmJlcmcgKDEzIE1hciAyMDA4KQotIEJyaWFuIFVsbSBmaWd1cmVkIG91dCB0aGF0IGlmIHlvdSBkaWQgYW4gU0ZUUCB1cGxvYWQgd2l0aAogIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgdG8gY3JlYXRlIGEgZGlyZWN0b3J5LCBhbmQgdGhlbiByZS11c2VkIHRoZQogIGhhbmRsZSBhbmQgdXBsb2FkZWQgYW5vdGhlciBmaWxlIHRvIGFub3RoZXIgZGlyZWN0b3J5IHRoYXQgbmVlZGVkIHRvIGJlCiAgY3JlYXRlZCwgdGhlIHNlY29uZCB1cGxvYWQgd291bGQgZmFpbC4gQW5vdGhlciBjYXNlIG9mIGEgc3RhdGUgdmFyaWFibGUgdGhhdAogIHdhc24ndCBwcm9wZXJseSByZXNldCBiZXR3ZWVuIHJlcXVlc3RzLgoKLSBJIHJld3JvdGUgdGhlIDEwMC1jb250aW51ZSBjb2RlIHRvIHVzZSBhIHNpbmdsZSBzdGF0ZSB2YXJpYWJsZSBpbnN0ZWFkIG9mCiAgdGhlIHByZXZpb3VzIHR3byBvbmVzLiBJIHRoaW5rIGl0IG1hZGUgdGhlIGxvZ2ljIHNvbWV3aGF0IGNsZWFyZXIuCgpEYW5pZWwgU3RlbmJlcmcgKDExIE1hciAyMDA4KQotIERtaXRyeSBQb3BvdiBmaWxlZCBidWcgcmVwb3J0ICMxOTExMDY5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE5MTEwNjkpIHRoYXQgaWRlbnRpZmllZCBhIHJhY2UKICBjb25kaXRpb24gaW4gdGhlIG5hbWUgcmVzb2x2ZXIgY29kZSB3aGVuIHRoZSBETlMgY2FjaGUgaXMgc2hhcmVkIGJldHdlZW4KICBtdWx0aXBsZSBlYXN5IGhhbmRsZXMsIGVhY2ggcnVubmluZyBpbiBzaW11bHRhbmVvdXMgdGhyZWFkcyB0aGF0IGNvdWxkIGNhdXNlCiAgY3Jhc2hlcy4KCi0gQWRkZWQgYSBtYWNybyBmb3IgY3VybF9lYXN5X3NldG9wdCgpIHRoYXQgYWNjZXB0cyB0aHJlZSBhcmd1bWVudHMgYW5kIHNpbXBseQogIGRvZXMgbm90aGluZyB3aXRoIHRoZW0sIGp1c3QgdG8gbWFrZSBzdXJlIGxpYmN1cmwgdXNlcnMgYWx3YXlzIHVzZSB0aHJlZQogIGFyZ3VtZW50cyB0byB0aGlzIGZ1bmN0aW9uLiBEdWUgdG8gaXRzIHVzZSBvZiAuLi4gZm9yIHRoZSB0aGlyZCBhcmd1bWVudCwgaXQKICBpcyBvdGhlcndpc2UgaGFyZCB0byBkZXRlY3QgYWJ1c2UuCgpNaWNoYWwgTWFyZWsgKDExIE1hciAyMDA4KQotIEFkZGVkIGEgdHlwZSBjaGVja2luZyBtYWNybyBmb3IgY3VybF9lYXN5X3NldG9wdCgpLCBuZWVkcyBnY2MtNC4zIGFuZCBvbmx5CiAgd29ya3MgaW4gQyBtb2RlIGF0bSAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTAyLzAyNjcuaHRtbCAsCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTAyLzAyOTIuaHRtbCApCgpEYW5pZWwgRmFuZHJpY2ggKDEwIE1hciAyMDA4KQotIEFkZGVkIHRlc3RzIDYxOC02MjEgdG8gdGVzdCBTRlRQL1NDUCB0cmFuc2ZlcnMgb2YgbW9yZSB0aGFuIG9uZSBmaWxlCiAgKHRlc3QgNjIwIHRlc3RzIHRoZSBqdXN0LWZpeGVkIHByb2JsZW0gcmVwb3J0ZWQgYnkgQnJpYW4gVWxtKS4KCkRhbmllbCBTdGVuYmVyZyAoOSBNYXIgMjAwOCkKLSBCcmlhbiBVbG0gcmVwb3J0ZWQgYSBjcmFzaCB3aGVuIGRvaW5nIGEgc2Vjb25kIFNGVFAgdHJhbnNmZXIgb24gYSByZS11c2VkCiAgZWFzeSBoYW5kbGUgaWYgY3VybF9lYXN5X3Jlc2V0KCkgd2FzIHVzZWQgYmV0d2VlbiB0aGVtLiBJIGZpeGVkIGl0IGFuZCBCcmlhbgogIHZlcmlmaWVkIHRoYXQgaXQgY3VyZWQgaGlzIHByb2JsZW0uCgotIEJyaWFuIFVsbSByZXBvcnRlZCB0aGF0IGlmIHlvdSBmaXJzdCB0cmllZCB0byBkb3dubG9hZCBhIG5vbi1leGlzdGluZyBTRlRQCiAgZmlsZSBhbmQgdGhlbiBmZXRjaGVkIGFuIGV4aXN0aW5nIG9uZSBhbmQgcmUtdXNlZCB0aGUgaGFuZGxlLCBsaWJjdXJsIHdvdWxkCiAgc3RpbGwgcmVwb3J0IHRoZSBzZWNvbmQgb25lIGFzIG5vbi1leGlzdGluZyBhcyB3ZWxsISBJIGZpeGVkIGl0IGFuZCBCcmlhbgogIHZlcmlmaWVkIHRoYXQgaXQgY3VyZWQgaGlzIHByb2JsZW0uCgpNaWNoYWwgTWFyZWsgKDYgTWFyIDIwMDgpCi0gRml4IHRoZSBnc3NhcGkgY29uZmlndXJlIGNoZWNrIHRvIGRldGVjdCBuZXdlciBNSVQgS2VyYmVyb3MgKHBhdGNoIGJ5CiAgTWljaGFlbCBDYWxtZXIpCgpZYW5nIFRzZSAoNiBNYXIgMjAwOCkKLSBGaXggcmVncmVzc2lvbiBvbiBDdXJsX3NvY2tldF9yZWFkeSgpIGFuZCBDdXJsX3BvbGwoKSBzbyB0aGF0IHRoZXNlIHdpbGwKICBhZ2FpbiBmYWlsIG9uIHNlbGVjdC9wb2xsIGVycm9ycyBkaWZmZXJlbnQgdGhhbiBFSU5UUi4KCkRhbmllbCBGYW5kcmljaCAoNSBNYXIgMjAwOCkKLSBGaXhlZCB0aGUgdGVzdCBoYXJuZXNzIHNvIGl0IHdpbGwgd3JpdGUgb3V0IHplcm8tbGVuZ3RoIGRhdGEgZmlsZXMuCgotIEFkZGVkIHRlc3RzIDYxNiBhbmQgNjE3IHRvIHNlZSBob3cgU0ZUUCBhbmQgU0NQIGNvcGUgd2l0aCB6ZXJvLWxlbmd0aAogIGZpbGVzLCBhcyBxdWVzdGlvbmVkIGJ5IE1pa2UgUHJvdHRzLiBTRlRQIGRvZXMgZm9yIG1lIGJ1dCBTQ1AgZG9lc24ndAogIHNvIHRlc3QgNjE3IGlzIGRpc2FibGVkIGZvciBub3cuCgpEYW5pZWwgUyAoNCBNYXIgMjAwOCkKLSBNaWtlIFByb3R0cyBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlcyByZXN1bWVkIHRyYW5zZmVycyB3b3JrIHdpdGggU0ZUUC4KCkRhbmllbCBTICgxIE1hciAyMDA4KQotIEFuYXRvbGkgVHVibWFuIGZvdW5kIGFuZCBmaXhlZCBhIGNyYXNoIHdpdGggTmVnb3RpYXRlIGF1dGhlbnRpY2F0aW9uIHVzZWQgb24KICBhIHJlLXVzZWQgY29ubmVjdGlvbiB3aGVyZSBib3RoIHJlcXVlc3RzIHVzZWQgTmVnb3RpYXRlLgoKR3VlbnRlciBLbmF1ZiAoMjYgRmViIDIwMDgpCi0gS2FzcGFyIEJyYW5kIHByb3ZpZGVkIGEgcGF0Y2ggdG8gc3VwcG9ydCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIChSRkMgNDM2NikuCgpEYW5pZWwgUyAoMjUgRmViIDIwMDgpCi0gS2FzcGFyIEJyYW5kIG1hZGUgR251VExTLWJ1aWx0IGxpYmN1cmwgcHJvcGVybHkgYWNrbm93bGVkZ2UgdGhlIG9wdGlvbiB0aGF0CiAgZm9yY2VzIGl0IHRvIHByZWZlciBTU0x2My4KCkRhbmllbCBTICgyMyBGZWIgMjAwOCkKLSBTYW0gTGlzdG9wYWQgcHJvdmlkZWQgYSBwYXRjaCBpbiBmZWF0dXJlLXJlcXVlc3QgIzE5MDAwMTQKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy9mZWF0dXJlLmNnaT9pZD0xOTAwMDE0IHRoYXQgbWFrZXMgbGliY3VybCAoYnVpbHQgdG8KICB1c2UgT3BlblNTTCkgc3VwcG9ydCBhIGZ1bGwgY2hhaW4gb2YgY2VydGlmaWNhdGVzIGluIGEgZ2l2ZW4gUEtDUzEyCiAgY2VydGlmaWNhdGUuCgpEYW5pZWwgUyAoMjIgRmViIDIwMDgpCi0gR2VvcmcgTGlwcGl0c2NoIG1hZGUgdGhlIHNyYy9NYWtlZmlsZS52YzYgbWFrZWZpbGUgdXNlIHRoZSBzYW1lIG1lbW9yeSBtb2RlbAogIG9wdGlvbnMgYXMgdGhlIGxpYi9NYWtlZmlsZS52YzYgYWxyZWFkeSBkaWQuCgpEYW5pZWwgUyAoMjEgRmViIDIwMDgpCi0gWm1leSBQZXRyb2ZmIGZvdW5kIGEgY3Jhc2ggd2hlbiBsaWJjdXJsIGFjY2Vzc2VkIGEgTlVMTCBwb2ludGVyLCB3aGljaAogIGhhcHBlbmVkIGlmIHlvdSBzZXQgdGhlIGNvbm5lY3Rpb24gY2FjaGUgc2l6ZSB0byAxIGFuZCBmb3IgZXhhbXBsZSBmYWlsZWQgdG8KICBsb2dpbiB0byBhbiBGVFAgc2l0ZS4gQnVnIHJlcG9ydCAjMTg5NjY5OAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODk2Njk4KQoKRGFuaWVsIFMgKDIwIEZlYiAyMDA4KQotIEZpeGVkIHRlc3QgY2FzZSA0MDUgdG8gbm90IGZhaWwgd2hlbiBsaWJjdXJsIGlzIGJ1aWx0IHdpdGggR251VExTCgotIEJhc2VkIG9uIGluaXRpYWwgd29yayBkb25lIGJ5IEdhdXRhbSBLYWNocm9vIHRvIGFkZHJlc3MgYSBidWcsIHdlIG5vdyBrZWVwCiAgYmV0dGVyIGNvbnRyb2wgYXQgdGhlIGV4YWN0IHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uJ3MgU1NMIHN0YXR1cyBzbyB0aGF0IHdlCiAga25vdyBleGFjdGx5IHdoZW4gaXQgaGFzIGNvbXBsZXRlZCB0aGUgU1NMIG5lZ290aWF0aW9uIG9yIG5vdCBzbyB0aGF0IHRoZXJlCiAgd29uJ3QgYmUgYWNjaWRlbnRhbCByZS11c2VzIG9mIGNvbm5lY3Rpb25zIHRoYXQgYXJlIHdyb25nbHkgYmVsaWV2ZWQgdG8gYmUKICBpbiBTU0wtY29tcGxldGVkLW5lZ290aWF0ZSBzdGF0ZS4KCi0gV2Ugbm8gbG9uZ2VyIHN1cHBvcnQgc2V0dGluZyB0aGUgQ1VSTE9QVF9VUkwgb3B0aW9uIGZyb20gaW5zaWRlIGEgY2FsbGJhY2sKICBzdWNoIGFzIHRoZSBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT04gb25lIHRyZWF0IHRoYXQgYXMgaWYgaXQgd2FzIGEgTG9jYXRpb246CiAgZm9sbG93aW5nLiBUaGUgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIHRoaXMgZmVhdHVyZSB3YXMgZG9uZSBmb3IgNy4xMS4wLCBidXQKICB0aGlzIGNvZGUgYW5kIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gYnJva2VuIHNpbmNlIGFib3V0IDcuMTUuNCAoTWFyY2ggMjAwNikKICB3aXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygbm9uLWJsb2NraW5nIE9wZW5TU0wgImNvbm5lY3RzIi4KCiAgSXQgd2FzIGEgaGFjayB0byBiZWdpbiB3aXRoIGFuZCBzaW5jZSBpdCBkb2Vzbid0IHdvcmsgYW5kIGhhc24ndCB3b3JrZWQKICBjb3JyZWN0bHkgZm9yIGEgbG9uZyB0aW1lIGFuZCBub2JvZHkgaGFzIGV2ZW4gbm90aWNlZCwgSSBjb25zaWRlciBpdCBhIHZlcnkKICBzdWl0YWJsZSBzdWJqZWN0IGZvciBwbGFpbiByZW1vdmFsLiBBbmQgc28gaXQgd2FzIGRvbmUuCgpHdWVudGVyIEtuYXVmICgxOSBGZWIgMjAwOCkKLSBXZSBkbyBubyBsb25nZXIgc3VwcG9ydCBTU0x2MiBieSBkZWZhdWx0IHNpbmNlIGl0IGhhcyBrbm93biBmbGF3cy4KICBLYXNwYXIgQnJhbmQgcHJvdmlkZWQgYSBwYXRjaCBmb3IgYWxsIHN1cHBvcnRlZCBTU0wgdG9vbGtpdHMuCiAKRGFuaWVsIEZhbmRyaWNoICgxOSBGZWIgMjAwOCkKLSBBZGRlZCB0ZXN0MzA5IHRvIHRlc3QgSFRUUCByZWRpcmVjdCB0byBIVFRQUyBVUkwKCkRhbmllbCBTICgxOCBGZWIgMjAwOCkKLSBXZSdyZSBubyBsb25nZXIgcHJvdmlkaW5nIGEgdmVyeSBvbGQgY2EtYnVuZGxlIGluIHRoZSBjdXJsIHRhcmJhbGwuIFlvdSBjYW4KICBnZXQgYSBmcmVzaCBvbmUgZG93bmxvYWRlZCBhbmQgY3JlYXRlZCB3aXRoICdtYWtlIGNhLWJ1bmRsZScgb3IgeW91IGNhbiBnZXQKICBvbmUgZnJvbSBoZXJlID0+IGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9jYWV4dHJhY3QuaHRtbCBpZiB5b3Ugd2FudCBhIGZyZXNoCiAgbmV3IG9uZSBleHRyYWN0ZWQgZnJvbSBNb3ppbGxhJ3MgcmVjZW50IGxpc3Qgb2YgY2EgY2VydHMuCgogIFRoZSBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1jYS1idW5kbGUgbm93IGxldHMgeW91IHNwZWNpZnkgd2hhdCBmaWxlIHRvIHVzZQogIGFzIGRlZmF1bHQgY2EgYnVuZGxlIGZvciB5b3VyIGJ1aWxkLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgY29uZmlndXJlIHNjcmlwdAogIHdpbGwgY2hlY2sgYSBmZXcga25vd24gc3RhbmRhcmQgcGxhY2VzIGZvciBhIGdsb2JhbCBjYSBjZXJ0IHRvIHVzZS4KCkRhbmllbCBTICgxNyBGZWIgMjAwOCkKLSBKZXJvbWUgTXVmZmF0LU1lcmlkb2wgaGVscGVkIG1lIGZpeCBDdXJsX2RvbmUoKSB0byBjbG9zZSB0aGUgY3VycmVudAogIGNvbm5lY3Rpb24gYnkgZm9yY2Ugd2hlbiBpdCB3YXMgY2FsbGVkIGJlZm9yZSB0aGUgZW50aXJlIHJlcXVlc3QgaXMKICBjb21wbGV0ZWQsIHNpbXBseSBiZWNhdXNlIHdlIGNhbid0IGtub3cgaWYgdGhlIGNvbm5lY3Rpb24gcmVhbGx5IGNhbiBiZQogIHJlLXVzZWQgc2FmZWx5IGF0IHRoYXQgcG9pbnQuCgotIEJhc2VkIG9uIHRoZSBzYW1lIGRlYnVnZ2luZyBsb2dpYywgSSd2ZSBhbHNvIG1hZGUgQ3VybF9odHRwX2RvbmUoKSBub3QKICByZXR1cm4gQ1VSTEVfR09UX05PVEhJTkcgaWYgY2FsbGVkICJwcmVtYXR1cmVseSIuIFRoaXMgc2hvdWxkIGhhdmUgbm8gcmVhbAogIGVmZmVjdCB0byBhbnl0aGluZyBidXQgdGhlIGNvZGUgbWFrZXMgbW9yZSBzZW5zZSBsaWtlIHRoaXMuCiAgCkRhbmllbCBTICgxNSBGZWIgMjAwOCkKLSBNYWRlIHRoZSBnbnV0bHMgY29kZSBwYXRoIG5vdCBldmVuIHRyeSB0byBnZXQgdGhlIHNlcnZlciBjZXJ0IGlmIG5vIHBlZXIKICB2ZXJpZmljYXRpb24gaXMgcmVxdWVzdGVkLiBQcmV2aW91c2x5IGl0IHdvdWxkIGV2ZW4gcmV0dXJuIGZhaWx1cmUgaWYgZ251dGxzCiAgZmFpbGVkIHRvIGdldCB0aGUgc2VydmVyIGNlcnQgZXZlbiB0aG91Z2ggbm8gdmVyaWZpY2F0aW9uIHdhcyBhc2tlZCBmb3IuCiAgUHVibGljIHNlcnZlciBzaG93aW5nIHRoZSBwcm9ibGVtOiBodHRwczovL3d3dy5uZXQyMjIuY2Fpc3NlLWVwYXJnbmUuZnIKCi0gRml4IG15IEN1cmxfdGltZWxlZnQoKSBsZWZ0b3ZlciBtaXN0YWtlIGluIHRoZSBnbnV0bHMgY29kZQoKLSBQb295YW4gTWNTcG9ycmFuIGZvdW5kIGFuZCBmaXhlZCBhIGZsYXcgd2hlcmUgeW91IGZpcnN0IHdvdWxkIGRvIGEgbm9ybWFsCiAgaHR0cCByZXF1ZXN0IGFuZCB0aGVuIHlvdSdkIHJldXNlIHRoZSBoYW5kbGUgYW5kIHJlcGxhY2UgdGhlIEFjY2VwdDogaGVhZGVyLAogIGFzIHRoZW4gbGliY3VybCB3b3VsZCBzZW5kIHR3byBBY2NlcHQ6IGhlYWRlcnMhCgpEYW5pZWwgUyAoMTEgRmViIDIwMDgpCi0gWWFuZyBUc2UgcG9pbnRlZCBvdXQgYSBmZXcgcmVtYWluaW5nIHF1aXJrcyBmcm9tIG15IHRpbWVvdXQgcmVmYWN0b3JpbmcgZnJvbQogIEZlYiA3IHRoYXQgZGlkbid0IGFib3J0IHByb3Blcmx5IG9uIHRpbWVvdXRzLiBUaGVzZSBhcmUgYWN0dWFsbHkgb2xkCiAgcHJvYmxlbXMgYnV0IG5vdyB0aGV5IHNob3VsZCBiZSBmaXhlZC4KCllhbmcgVHNlICgxMCBGZWIgMjAwOCkKLSBCdWcgcmVwb3J0ICMxODg4OTMyIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODg4OTMyKSBwb2ludHMgb3V0CiAgYW5kIHByb3ZpZGVzIHRlc3QgcHJvZ3JhbSB0aGF0IGRlbW9uc3RyYXRlcyB0aGF0IGxpYmN1cmwgbWlnaHQgbm90IHNldCBlcnJvcgogIGRlc2NyaXB0aW9uIG1lc3NhZ2UgZm9yIGVycm9yIENVUkxFX0NPVUxETlRfUkVTT0xWRV9IT1NUIGZvciBXaW5kb3dzIHRocmVhZGVkCiAgbmFtZSByZXNvbHZlciBidWlsZHMuIEZpeGVkIG5vdy4KCkRhbmllbCBGYW5kcmljaCAoOCBGZWIgMjAwNykKLSBBZGRlZCBrZXkgd29yZHMgdG8gYWxsIFNTTC11c2luZyB0ZXN0cyBzbyB0aGV5IGNhbiBiZSBza2lwcGVkIGlmIG5lY2Vzc2FyeS4KICBSZW1vdmVkIGEgZmV3IHVubmVjZXNzYXJ5IHJlcXVpcmVzIFNTTCBzdGF0ZW1lbnRzLgoKRGFuaWVsIFMgKDggRmViIDIwMDgpCi0gTWlrZSBIb21tZXkgZmlsZWQgYW5kIGZpeGVkIGJ1ZyByZXBvcnQgIzE4ODk4NTYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg4OTg1Nik6IFdoZW4gdXNpbmcgdGhlIGdudXRscyBzc2wKICBsYXllciwgY2xlYW5pbmctdXAgYW5kIHJlaW5pdGlhbGl6aW5nIGN1cmwgZW5kcyB1cCB3aXRoIGh0dHBzIHJlcXVlc3RzCiAgZmFpbGluZyB3aXRoICJBU04xIHBhcnNlcjogRWxlbWVudCB3YXMgbm90IGZvdW5kIiBlcnJvcnMuIE9idmlvdXNseSBhCiAgcmVncmVzc2lvbiBhZGRlZCBpbiA3LjE2LjMuCgpZYW5nIFRzZSAoOCBGZWIgMjAwOCkKLSBJbXByb3ZlZCB0ZXN0IGhhcm5lc3MgU0NQL1NGVFAgc3RhcnQgdXAgc2VydmVyIHZlcmlmaWNhdGlvbiwgZG9pbmcgYSByZWFsCiAgY29ubmVjdGlvbiB0byB0aGUgc2Z0cCBzZXJ2ZXIsIGF1dGhlbnRpY2F0aW5nIGFuZCBydW5uaW5nIGEgc2ltcGxlIHNmdHAKICBwd2QgY29tbWFuZCB1c2luZyB0aGUgdGVzdCBoYXJuZXNzIGdlbmVyYXRlZCBjb25maWd1cmF0aW9uIGFuZCBrZXkgZmlsZXMuCgpEYW5pZWwgUyAoOCBGZWIgMjAwOCkKLSBH/G50ZXIgS25hdWYgYWRkZWQgbGliL21rLWNhLWJ1bmRsZS5wbCB3aGljaCBnZXRzIHRoZSBGaXJlZm94IGNhIGJ1bmRsZSBhbmQKICBjcmVhdGVzIGEgc3VpdGFibGUgY2EtYnVuZGxlLmNydCBmaWxlIGluIFBFTSBmb3JtYXQgZm9yIHVzZSB3aXRoIGN1cmwuIFRoZQogIHJlY29tbWVuZGVkIHdheSB0byBydW4gaXQgaXMgdG8gdXNlICdtYWtlIGNhLWJ1bmRsZScgaW4gdGhlIGJ1aWxkIHRyZWUgcm9vdC4KCkRhbmllbCBGYW5kcmljaCAoNyBGZWIgMjAwNykKLSBBZGRlZCB0ZXN0cyAxMDIyIGFuZCAxMDIzIHRvIHZhbGlkYXRlIG91dHB1dCBvZiBjdXJsLWNvbmZpZyAtLXZlcnNpb24gYW5kCiAgLS12ZXJudW0KCkRhbmllbCBTICg3IEZlYiAyMDA4KQotIFJlZmFjdG9yZWQgYSBsb3Qgb2YgdGltZW91dCBjb2RlIGludG8gYSBmZXcgZnVuY3Rpb25zIGluIGFuIGF0dGVtcHQgdG8gbWFrZQogIHRoZW0gYWxsIHVzZSB0aGUgc2FtZSAoaG9wZWZ1bGx5IGNvcnJlY3QpIGxvZ2ljIHRvIG1ha2UgaXQgbGVzcyBlcnJvci1wcm9uZQogIGFuZCBlYXNpZXIgdG8gaW50cm9kdWNlIGxpYnJhcnktd2lkZSB3aGVyZSBpdCBzaG91bGQgYmUgdXNlZC4KCllhbmcgVHNlICg2IEZlYiAyMDA4KQotIEZpeCBhbiBpc3N1ZSBpbiBzdHJkdXAgcmVwbGFjZW1lbnQgZnVuY3Rpb24gd2hlbiBkZWFsaW5nIHdpdGggYWJzb2x1dGVseQogIGh1Z2Ugc3RyaW5ncy4gT25seSBzeXN0ZW1zIHdpdGhvdXQgYSBzdGFuZGFyZCBzdHJkdXAgd291bGQgYmUgYWZmZWN0ZWQuCgpEYW5pZWwgUyAoMyBGZWIgMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luIGNsZWFuZWQgdXAgdGhlIHBpcGVsaW5pbmcgY29kZSBhbmQgcmVtb3ZlZCB0aGUgbmVlZCBmb3IgYW5kCiAgdXNlIG9mIHRoZSAiaXNfaW5fcGlwZWxpbmUiIHN0cnVjdCBmaWVsZC4KCi0gSSB3cm90ZSB1cCBhbmQgYWRkZWQgdGhlIHRocmVhZGVkLXNzbC5jIGV4YW1wbGUgc291cmNlIGNvZGUgdGhhdCBzaG93cyBob3cKICB0byBkbyBtdWx0aS10aHJlYWRlZCBkb3dubG9hZHMgb2YgSFRUUFMgZmlsZXMgd2l0aCBhIGxpYmN1cmwgdGhhdCBpcyBidWlsdAogIHdpdGggT3BlblNTTC4gSXQgdXNlcyBwdGhyZWFkcyBmb3IgdGhlIHRocmVhZGluZy4KCkRhbmllbCBTICgzMSBKYW4gMjAwOCkKLSBOaWtsYXMgQW5nZWJyYW5kIG1hZGUgdGhlIGNvb2tpZSBzdXBwb3J0IGluIGxpYmN1cmwgcHJvcGVybHkgZGVhbCB3aXRoIHRoZQogICJIdHRwT25seSIgZmVhdHVyZSBpbnRyb2R1Y2VkIGJ5IE1pY3Jvc29mdCBhbmQgYXBwYXJlbnRseSBhbHNvIHN1cHBvcnRlZCBieQogIEZpcmVmb3g6IGh0dHA6Ly9tc2RuMi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzMwNDYuYXNweCAuIEh0dHBPbmx5CiAgaXMgbm93IHN1cHBvcnRlZCB3aGVuIHJlY2VpdmVkIGZyb20gc2VydmVycyBpbiBIVFRQIGhlYWRlcnMsIHdoZW4gd3JpdHRlbiB0bwogIGNvb2tpZSBqYXJzIGFuZCB3aGVuIHJlYWQgZnJvbSBleGlzdGluZyBjb29raWUgamFycy4KCiAgSSBtb2RpZmllZCB0ZXN0IGNhc2UgMzEgYW5kIDQ2IHRvIGFsc28gZG8gc29tZSBiYXNpYyBIdHRwT25seSB0ZXN0aW5nLgoKLSBEbWl0cnkgS3Vyb2Noa2luIG1vdmVkIHNldmVyYWwgc3RydWN0IGZpZWxkcyBmcm9tIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3QgdG8KICB0aGUgU2luZ2xlUmVxdWVzdCBvbmUgdG8gbWFrZSBwaXBlbGluaW5nIGJldHRlci4gSXQgaXMgYSBiaXQgdHJpY2t5IHRvIGtlZXAKICB0aGVtIGluIHRoZSByaWdodCBwbGFjZSwgdG8ga2VlcCB0aGluZ3MgcmVsYXRlZCB0byB0aGUgYWN0dWFsIHJlcXVlc3Qgb3IgdG8KICB0aGUgYWN0dWFsIGNvbm5lY3Rpb24gaW4gdGhlIHJpZ2h0IHBsYWNlLgoKRGFuaWVsIFMgKDI5IEphbiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW4gZml4ZWQgQ3VybF9kb25lKCkgZm9yIHBpcGVsaW5pbmcsIGFzIGl0IGNvdWxkIHByZXZpb3VzbHkKICBjcmFzaCEKCi0gTWljaGFsIE1hcmVrIGZpeGVkIG1pbm9yIG1pc3Rha2UgaW4gdGVzdCBjYXNlIDU1MyB0aGF0IHByZXZlbnRlZCBpdCBmcm9tCiAgd29ya2luZyBvbiBvdGhlciBJUC1hZGRyZXNzZXMgb3IgcG9ydCBudW1iZXJzLgoKVmVyc2lvbiA3LjE4LjAgKDI4IEphbnVhcnkgMjAwOCkKCkRhbmllbCBTICgyNyBKYW4gMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luOiBJbiAicmVhbCB3b3JsZCIgdGVzdGluZyBJIGZvdW5kIG1vcmUgYnVncyBpbgogIHBpcGVsaW5pbmcuIEJyb2tlbiBjb25uZWN0aW9uIGlzIG5vdCByZXN0b3JlZCBhbmQgd2UgZ2V0IGludG8gaW5maW5pdGUKICBsb29wLiBJdCBoYXBwZW5zIGJlY2F1c2Ugb2Ygd3JvbmcgaXNfaW5fcGlwZWxpbmUgdmFsdWVzLgoKRGFuaWVsIFMgKDI2IEphbiAyMDA4KQotIEtldmluIFJlZWQgZmlsZWQgYnVnIHJlcG9ydCAjMTg3OTM3NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODc5Mzc1KSB3aGljaCBkZXNjcmliZXMgaG93IGxpYmN1cmwKICBnb3QgbG9zdCBpbiB0aGlzIHNjZW5hcmlvOiBwcm94eSB0dW5uZWwgKG9yIEhUVFBTIG92ZXIgcHJveHkpLCBhc2sgdG8gZG8gYW55CiAgcHJveHkgYXV0aGVudGljYXRpb24gYW5kIHRoZSBwcm94eSByZXBsaWVzIHdpdGggYW4gYXV0aCAobGlrZSBOVExNKSBhbmQgdGhlbgogIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBhZnRlciB0aGF0IGluaXRpYWwgaW5mb3JtYXRpb25hbCByZXNwb25zZS4KCiAgbGliY3VybCB3b3VsZCBub3QgcHJvcGVybHkgcmUtaW5pdGlhbGl6ZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgcHJveHkgYW5kCiAgY29udGludWUgdGhlIGF1dGggbmVnb3RpYXRpb24gbGlrZSBzdXBwb3NlZC4gSXQgZG9lcyBub3cgaG93ZXZlciwgYXMgaXQgd2lsbAogIG5vdyBkZXRlY3QgaWYgb25lIG9yIG1vcmUgYXV0aGVudGljYXRpb24gbWV0aG9kcyB3ZXJlIGF2YWlsYWJsZSBhbmQgYXNrZWQKICBmb3IsIGFuZCB3aWxsIHRodXMgcmV0cnkgdGhlIGNvbm5lY3Rpb24gYW5kIGNvbnRpbnVlIGZyb20gdGhlcmUuCgotIEkgbWFkZSB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgZ2V0IGNhbGxlZCBwcm9wZXJseSBkdXJpbmcgcHJveHkgQ09OTkVDVC4KCkRhbmllbCBTICgyMyBKYW4gMjAwOCkKLSBJZ29yIEZyYW5jaHVrIHBvaW50ZWQgb3V0IHRoYXQgQ1VSTE9QVF9DT09LSUVMSVNUIHNldCB0byAiQUxMIiBsZWFrZWQKICBtZW1vcnksIGFuZCBzbyBkaWQgIlNFU1MiLiBGaXhlZCBub3cuCgpZYW5nIFRzZSAoMjIgSmFuIDIwMDgpCi0gQ2hlY2sgcG9sbC5oIGF0IGNvbmZpZ3VyYXRpb24gdGltZSwgYW5kIHVzZSBpdCB3aGVuIHN5cy9wb2xsLmggdW5hdmFpbGFibGUKCkRhbmllbCBTICgyMiBKYW4gMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luIHJlbW92ZWQgdGhlIGNhbmNlbGxlZCBzdGF0ZSBmb3IgcGlwZWxpbmluZywgYXMgd2UgYWdyZWVkCiAgdGhhdCBpdCBpcyBiYWQgYW55d2F5LiBTdGFydGluZyBub3csIHJlbW92aW5nIGEgaGFuZGxlIHRoYXQgaXMgaW4gdXNlZCBpbiBhCiAgcGlwZWxpbmUgd2lsbCBicmVhayB0aGUgcGlwZWxpbmUgLSBpdCdsbCBiZSBzZXQgYmFjayB1cCBhZ2FpbiBidXQgc3RpbGwuLi4KCllhbmcgVHNlICgyMSBKYW4gMjAwOCkKLSBEaXNhYmxlIGxkYXAgc3VwcG9ydCBmb3IgY3lnd2luIGJ1aWxkcywgc2luY2UgaXQgYnJlYWtzIHdob2xlIGJ1aWxkIHByb2Nlc3MuCiAgRml4aW5nIGl0IHdpbGwgYWZmZWN0IG90aGVyIHBsYXRmb3Jtcywgc28gaXQgaXMgcG9zdHBvbmVkIGZvciBhbm90aGVyIHJlbGVhc2UuCgpEYW5pZWwgUyAoMTggSmFuIDIwMDgpCi0gTGF1IEhhbmcgS2luIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZW4gZG9pbmcKICBDT05ORUNUIG92ZXIgYSBwcm94eS4gY3VybF9tdWx0aV9mZHNldCgpIGRpZG4ndCByZXBvcnQgYmFjayB0aGUgc29ja2V0CiAgcHJvcGVybHkgZHVyaW5nIHRoYXQgc3RhdGUsIGR1ZSB0byBhIG1pc3NpbmcgY2FzZSBpbiB0aGUgc3dpdGNoIGluIHRoZQogIG11bHRpX2dldHNvY2soKSBmdW5jdGlvbi4KCllhbmcgVHNlICgxNyBKYW4gMjAwOCkKLSBEb24ndCBhYm9ydCB0ZXN0cyA1MTggYW5kIDUzNyB3aGVuIHVuYWJsZSB0byByYWlzZSB0aGUgb3Blbi1maWxlIHNvZnQgbGltaXQuCgpEYW5pZWwgUyAoMTYgSmFuIDIwMDgpCi0gTmF0aGFuIENvdWx0ZXIncyBwYXRjaCB0aGF0IG1ha2VzIHJ1bnRlc3RzLnBsIHJlc3BlY3QgdGhlIFBBVEggd2hlbiBmaWd1cmluZwogIG91dCB3aGF0IHZhbGdyaW5kIHRvIHJ1bi4KCllhbmcgVHNlICgxNiBKYW4gMjAwOCkKLSBJbXByb3ZlZCBoYW5kbGluZyBvZiBvdXQgb2YgbWVtb3J5IGluIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB0aGF0IGFmZWN0ZWQKICBkYXRhIHVybCBlbmNvZGVkIEhUVFAgUE9TVHMgd2hlbiByZWFkaW5nIGl0IGZyb20gYSBmaWxlLgoKRGFuaWVsIFMgKDE2IEphbiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW4gd29ya2VkIGEgbG90IG9uIGltcHJvdmluZyB0aGUgSFRUUCBQaXBlbGluaW5nIHN1cHBvcnQgdGhhdAogIHByZXZpb3VzbHkgaGFkIGEgbnVtYmVyIG9mIGZsYXdzLCBwZXJoYXBzIG1vc3Qgbm90YWJseSB3aGVuIGFuIGFwcGxpY2F0aW9uCiAgZmlyZWQgdXAgTiB0cmFuc2ZlcnMgYXQgb25jZSBhcyB0aGVuIHRoZXkgd291bGRuJ3QgcGlwZWxpbmUgYXQgYWxsIHRoYXQKICBuaWNlbHkgYXMgYW55b25lIHdvdWxkIHRoaW5rLi4uIFRlc3QgY2FzZSA1MzAgd2FzIGFsc28gdXBkYXRlZCB0byB0YWtlIHRoZQogIGltcHJvdmVkIGZ1bmN0aW9uYWxpdHkgaW50byBhY2NvdW50LgoKLSBDYWxscyB0byBDdXJsX2ZhaWxmKCkgYXJlIG5vdCBzdXBwb3NlZCB0byBwcm92aWRlIGEgdHJhaWxpbmcgbmV3bGluZSBhcyB0aGUKICBmdW5jdGlvbiBpdHNlbGYgYWRkcyB0aGF0LiBGaXhlZCBvbiA1MCBvciBzb21ldGhpbmcgc3RyaW5ncyEKCkRhbmllbCBTICgxNSBKYW4gMjAwOCkKLSBJIG1hZGUgdGhlIHRvcnR1cmUgdGVzdCBvbiB0ZXN0IDUzMCBnbyB0aHJvdWdoLiBUaGlzIHdhcyBhY3R1YWxseSBkdWUgdG8KICBzaWxseSBjb2RlIGxlZnQgZnJvbSB3aGVuIHdlIHN3aXRjaGVkIHRvIGxldCB0aGUgbXVsdGkgaGFuZGxlICJob2xkIiB0aGUgZG5zCiAgY2FjaGUgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLi4uIE9mIGNvdXJzZSB0aGlzIG9ubHkgdHJpZ2dlcmVkIHdoZW4gYQogIGNlcnRhaW4gZnVuY3Rpb24gY2FsbCByZXR1cm5lZCBlcnJvciBhdCB0aGUgY29ycmVjdCBtb21lbnQuCgpEYW5pZWwgUyAoMTQgSmFuIDIwMDgpCi0gSm9lIE1hbGlja2kgZmlsZWQgYnVnIHJlcG9ydCAjMTg3MTI2OQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODcxMjY5KSBhbmQgd2UgY291bGQgZml4IGhpcyBoYW5nLQogIHByb2JsZW0gdGhhdCBvY2N1cnJlZCB3aGVuIGRvaW5nIGEgbGFyZ2UgSFRUUCBQT1NUIHJlcXVlc3Qgd2l0aCB0aGUKICByZXNwb25zZS1ib2R5IHJlYWQgZnJvbSBhIGNhbGxiYWNrLgoKRGFuaWVsIFMgKDEyIEphbiAyMDA4KQotIEkgcmUtYXJyYW5nZWQgdGhlIGN1cmwgLS1oZWxwIG91dHB1dC4gQWxsIHRoZSBvcHRpb25zIGFyZSBub3cgc29ydGVkIG9uCiAgdGhlaXIgbG9uZyBvcHRpb24gbmFtZXMgYW5kIGFsbCBkZXNjcmlwdGlvbnMgYXJlIG9uZS1saW5lcnMuCgotIEVyaWMgTGFuZGVzIHByb3ZpZGVkIHRoZSBwYXRjaCAoZWRpdGVkIGJ5IG1lKSB0aGF0IGludHJvZHVjZXMgdGhlCiAgLS1rZWVwYWxpdmUtdGltZSB0byBjdXJsIHRvIHNldCB0aGUga2VlcGFsaXZlIHByb2JlIGludGVydmFsLiBJIGFsc28gdG9vawogIHRoZSBvcHBvcnR1bml0eSB0byByZW5hbWUgdGhlIHJlY2VudGx5IGFkZGVkIG5vLWtlZXAtYWxpdmUgb3B0aW9uIHRvCiAgbm8ta2VlcGFsaXZlIHRvIGtlZXAgYSBjb25zaXN0ZW50IG5hbWluZyBhbmQgdG8gYXZvaWQgZ2V0dGluZyB0d28gZGFzaGVzIGluCiAgdGhlc2Ugb3B0aW9uIG5hbWVzLiBFcmljIGFsc28gcHJvdmlkZWQgYW4gdXBkYXRlIHRvIHRoZSBtYW4gcGFnZSBmb3IgdGhlIG5ldwogIG9wdGlvbi4KCkRhbmllbCBTICgxMSBKYW4gMjAwOCkKLSBEYW5pZWwgRWdnZXIgbWFkZSBDVVJMT1BUX1JBTkdFIHdvcmsgb24gZmlsZTovLyBVUkxzIHRoZSB2ZXJ5IHNhbWUgd2F5IGl0CiAgYWxyZWFkeSB3b3JrZWQgZm9yIEZUUDovLyBVUkxzLgoKLSBJIG1hZGUgdGhlIGN1cmwgdG9vbCBzd2l0Y2ggZnJvbSB1c2luZyBDVVJMT1BUX0lPQ1RMRlVOQ1RJT04gdG8gbm93IHVzZSB0aGUKICBzcGFua2luZyBuZXcgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gc2ltcGx5IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBpbXByb3ZlZAogIHBlcmZvcm1hbmNlIGZvciB0aGUgdXBsb2FkIHJlc3VtZSBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0byB1cGxvYWQgdGhlIGxhc3QKICBmZXcgYnl0ZXMgb2YgYSB2ZXJ5IGxhcmdlIGZpbGUuIFRvIGltcGxlbWVudCB0aGlzIGRlY2VudGx5LCBJIGhhZCB0byBzd2l0Y2gKICB0aGUgY2xpZW50IGNvZGUgZm9yIHVwbG9hZGluZyBmcm9tIGZvcGVuKCkvZnJlYWQoKSB0byBwbGFpbiBvcGVuKCkvcmVhZCgpIHNvCiAgdGhhdCB3ZSBjYW4gdXNlIGxzZWVrKCkgdG8gZG8gPjMyYml0IHNlZWtzIChhcyBmc2VlaygpIGRvZXNuJ3QgYWxsb3cgdGhhdCkKICBvbiBzeXN0ZW1zIHRoYXQgb2ZmZXIgc3VwcG9ydCBmb3IgdGhhdC4KCkRhbmllbCBTICgxMCBKYW4gMjAwOCkKLSBNaWNoYWwgTWFyZWsgbWFkZSBjdXJsLWNvbmZpZyAtLWxpYnMgbm90IGluY2x1ZGUgL3Vzci9saWI2NCBpbiB0aGUgb3V0cHV0CiAgKGl0IGFscmVhZHkgYmVmb3JlIHNraXBwZWQgL3Vzci9saWIpLiAgL3Vzci9saWI2NCBpcyB0aGUgZGVmYXVsdCBsaWJyYXJ5CiAgZGlyZWN0b3J5IG9uIG1hbnkgNjRiaXQgc3lzdGVtcyBhbmQgaXQncyB1bmxpa2VseSB0aGF0IGFueW9uZSB3b3VsZCB1c2UgdGhlCiAgcGF0aCBwcml2YXRlbHkgb24gc3lzdGVtcyB3aGVyZSBpdCdzIG5vdC4KCi0gR2VvcmcgTGlwcGl0c2NoIGJyb3VnaHQgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gYW5kIENVUkxPUFRfU0VFS0RBVEEgdG8gYWxsb3cKICBsaWJjdXJsIHRvIHNlZWsgaW4gYSBnaXZlbiBpbnB1dCBzdHJlYW0uIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCB3aGVuCiAgZG9pbmcgdXBsb2FkIHJlc3VtZXMgd2hlbiB0aGVyZSdzIGFscmVhZHkgYSBodWdlIHBhcnQgb2YgdGhlIGZpbGUgcHJlc2VudAogIHJlbW90ZWx5LiBCZWZvcmUsIGFuZCBzdGlsbCBpZiB0aGlzIGNhbGxiYWNrIGlzbid0IHVzZWQsIGxpYmN1cmwgd2lsbCByZWFkCiAgYW5kIHRocm91Z2ggYXdheSB0aGUgZW50aXJlIGZpbGUgdXAgdG8gdGhlIHBvaW50IHRvIHdoZXJlIHRoZSByZXN1bWluZwogIGJlZ2lucyAod2hpY2ggb2YgY291cnNlIGNhbiBiZSBhIHNsb3cgb3BlcmVyYXRpb24gZGVwZW5kaW5nIG9uIGZpbGUgc2l6ZSwKICBJL08gYmFuZHdpZHRoIGFuZCBtb3JlKS4gVGhpcyBuZXcgZnVuY3Rpb24gd2lsbCBhbHNvIGJlIHByZWZlcnJlZCB0byBnZXQKICB1c2VkIGluc3RlYWQgb2YgdGhlIENVUkxPUFRfSU9DVExGVU5DVElPTiBmb3Igc2Vla2luZyBiYWNrIGluIGEgc3RyZWFtIHdoZW4KICBkb2luZyBtdWx0aS1zdGFnZSBIVFRQIGF1dGggd2l0aCBQT1NUL1BVVC4KCi0gTmlraXRpbnNraXQgRG1pdHJpeSBmaWxlZCBidWcgcmVwb3J0ICMxODY4MjU1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NjgyNTUpIHdpdGggYSBwYXRjaC4gSXQgaWRlbnRpZmllcwogIGFuZCBmaXhlcyBhIHByb2JsZW0gd2l0aCBwYXJzaW5nIFdXVy1BdXRoZW50aWNhdGU6IGhlYWRlcnMgd2l0aCBhZGRpdGlvbmFsCiAgc3BhY2VzIGluIHRoZSBsaW5lIHRoYXQgdGhlIHBhcnNlciB3YXNuJ3Qgd3JpdHRlbiB0byBkZWFsIHdpdGguCgpEYW5pZWwgUyAoOCBKYW4gMjAwOCkKLSBJbnRyb2R1Y2luZyBjdXJsX2Vhc3lfcGF1c2UoKSBhbmQgbmV3IG1hZ2ljIHJldHVybiBjb2RlcyBmb3IgYm90aCB0aGUgcmVhZAogIGFuZCB0aGUgd3JpdGUgY2FsbGJhY2tzIHRoYXQgbm93IGNhbiBtYWtlIGEgY29ubmVjdGlvbidzIHJlYWRpbmcgYW5kL29yCiAgd3JpdGluZyBnZXQgcGF1c2VkLgoKRGFuaWVsIFMgKDYgSmFuIDIwMDgpCi0gSmVmZiBKb2huc29uIGZpbGVkIGJ1ZyByZXBvcnQgIzE4NjMxNzEKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg2MzE3MSkgd2hlcmUgaGUgcG9pbnRlZCBvdXQgdGhhdAogIGxpYmN1cmwncyBkYXRlIHBhcnNlciBkaWRuJ3QgYWNjZXB0IGEgKzEzMDAgdGltZSB6b25lIHdoaWNoIGFjdHVhbGx5IGlzIHVzZWQKICBmYWlybHkgb2Z0ZW4gKGxpa2UgTmV3IFplYWxhbmQncyBEYWlsaWdodCBTYXZpbmdzIFRpbWUpLCBzbyBJIG1vZGlmaWVkIHRoZQogIHBhcnNlciB0byBub3cgYWNjZXB0IHVwIHRvIGFuZCBpbmNsdWRpbmcgLTE0MDAgdG8gKzE0MDAuCgpEYW5pZWwgUyAoNSBKYW4gMjAwOCkKLSBCYXNlZCBvbiBmdXJ0aGVyIGRpc2N1c3Npb24gb24gY3VybC1saWJyYXJ5LCBJIHJldmVydGVkIHllc3RlcmRheSdzIFNPQ0tTNQogIGNvZGUgdG8gaW5zdGVhZCBpbnRyb2R1Y2Ugc3VwcG9ydCBmb3IgYSBuZXcgcHJveHkgdHlwZSBjYWxsZWQKICBDVVJMUFJPWFlfU09DS1M1X0hPU1ROQU1FIHRoYXQgaXMgdXNlZCB0byBzZW5kIHRoZSBob3N0IG5hbWUgdG8gdGhlIHByb3h5CiAgaW5zdGVhZCBvZiBJUCBhZGRyZXNzIGFuZCB0aGVyZSdzIHRodXMgbm8gbG9uZ2VyIGFueSBuZWVkIGZvciBhIG5ldwogIGN1cmxfZWFzeV9zZXRvcHQoKSBvcHRpb24uCgogIFRoZSBkZWZhdWx0IFNPQ0tTNSBwcm94eSBpcyBhZ2FpbiBiYWNrIHRvIHNlbmRpbmcgdGhlIElQIGFkZHJlc3MgdG8gdGhlCiAgcHJveHkuICBUaGUgbmV3IGN1cmwgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgZW5hYmxpbmcgc2VuZGluZyBob3N0IG5hbWUgdG8gYQogIFNPQ0tTNSBwcm94eSBpcyBub3cgLS1zb2NrczUtaG9zdG5hbWUuCgpEYW5pZWwgUyAoNCBKYW4gMjAwOCkKLSBCYXNlZCBvbiBNYXhpbSBQZXJlbmVzZW5rbydzIHBhdGNoLCB3ZSBub3cgZG8gU09DS1M1IG9wZXJhdGlvbnMgYW5kIGxldCB0aGUKICBwcm94eSBkbyB0aGUgaG9zdCBuYW1lIHJlc29sdmluZyBhbmQgb25seSBpZiAtLXNvY2tzNWlwIChvcgogIENVUkxPUFRfU09DS1M1X1JFU09MVkVfTE9DQUwpIGlzIHVzZWQgd2UgcmVzb2x2ZSB0aGUgaG9zdCBuYW1lIGxvY2FsbHkgYW5kCiAgcGFzcyBvbiB0aGUgSVAgYWRkcmVzcyBvbmx5IHRvIHRoZSBwcm94eS4KCllhbmcgVHNlICgzIEphbiAyMDA4KQotIE1vZGlmaWVkIHRlc3QgaGFybmVzcyB0byBhbGxvdyBTQ1AsIFNGVFAgYW5kIFNPQ0tTNCB0ZXN0cyB0byBydW4gd2l0aAogIE9wZW5TU0ggMi45LjksIFN1blNTSCAxLjAgb3IgbGF0ZXIgdmVyc2lvbnMuIFNPQ0tTNSB0ZXN0cyBuZWVkIE9wZW5TU0gKICAzLjcsIFN1blNTSCAxLjAgb3IgbGF0ZXIuCgpEYW5pZWwgUyAoMiBKYW4gMjAwOCkKLSBJIGZpeGVkIHR3byBjYXNlcyBvZiBtaXNzaW5nIHJldHVybiBjb2RlIGNoZWNrcyB3aGVuIGhhbmRsaW5nIGNodW5rZWQKICBkZWNvZGluZyB3aGVyZSBhIHdyaXRlIGVycm9yIChvciBhYm9ydCByZXR1cm4gZnJvbSBhIGNhbGxiYWNrKSBkaWRuJ3Qgc3RvcAogIGxpYmN1cmwncyBwcm9jZXNzaW5nLgoKLSBJIHJlbW92ZWQgdGhlIHNvY2tsZW5fdCB1c2UgZnJvbSB0aGUgcHVibGljIGN1cmwvY3VybC5oIGhlYWRlciBhbmQgaW5zdGVhZAogIG1hZGUgaXQgYW4gdW5zaWduZWQgaW50LiBUaGUgdHlwZSB3YXMgb25seSB1c2VkIGluIHRoZSBjdXJsX3NvY2thZGRyIHN0cnVjdAogIGRlZmluaXRpb24gKG9ubHkgdXNlZCBieSB0aGUgY3VybF9vcGVuc29ja2V0X2NhbGxiYWNrKS4gT24gYWxsIHBsYXRmb3JtcyBJCiAgY291bGQgZmluZCBpbmZvcm1hdGlvbiBhYm91dCwgc29ja2xlbl90IGlzIDMyIHVuc2lnbmVkIGJpdHMgbGFyZ2Ugc28gSSBkb24ndAogIHRoaW5rIHRoaXMgd2lsbCBicmVhayB0aGUgQVBJIG9yIEFCSS4gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyBvZgogIGNvdXJzZSBmb3IgYWxsIHRoZSBwbGF0Zm9ybXMgdGhhdCBkb24ndCBoYXZlIGEgc29ja2xlbl90IGRlZmluaXRpb24gaW4gdGhlaXIKICBoZWFkZXJzIHRvIGJ1aWxkIGZpbmUgYWdhaW4uIFByb3ZpZGluZyBvdXIgb3duIGNvbmZpZ3VyZSBtYWdpYyBhbmQgY3VzdG9tCiAgZGVmaW5pdGlvbiBvZiBzb2NrbGVuX3Qgb24gdGhvc2Ugc3lzdGVtcyBwcm92ZWQgdG8gd29yayBidXQgd2FzIGEgbG90IG9mCiAgY3J1ZnQsIGNvZGUgYW5kIGV4dHJhIG1hZ2ljIG5lZWRlZCAtIHdoZW4gdGhpcyB2ZXJ5IHNtYWxsIGNoYW5nZSBvZiB0eXBlCiAgc2VlbXMgaGFybWxlc3MgYW5kIHN0aWxsIHNvbHZlcyB0aGUgbWlzc2luZyBzb2NrbGVuX3QgcHJvYmxlbS4KCi0gUmljaGFyZCBBdHRlcmVyIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGFkZGVkIHN1cHBvcnQgZm9yIFNPQ0tTNGEgcHJveGllcywKICB3aGljaCBpcyBhbiBpbm9mZmljaWFsIFBST1hZNCB2YXJpYW50IHRoYXQgc2VuZHMgdGhlIGhvc3RuYW1lIHRvIHRoZSBwcm94eQogIGluc3RlYWQgb2YgdGhlIHJlc29sdmVkIGFkZHJlc3MgKHdoaWNoIGlzIGFscmVhZHkgc3VwcG9ydGVkIGJ5IFNPQ0tTNSkuCiAgLS1zb2NrczRhIGlzIHRoZSBjdXJsIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIGl0IGFuZCBDVVJMT1BUX1BST1hZVFlQRSBjYW4KICBub3cgYmUgc2V0IHRvIENVUkxQUk9YWV9TT0NLUzRBIGFzIHdlbGwuCgpEYW5pZWwgUyAoMSBKYW4gMjAwOCkKLSBNb2h1biBCaXN3YXMgcG9pbnRlZCBvdXQgdGhhdCAtLWxpYmN1cmwgZ2VuZXJhdGVkIGEgc291cmNlIGNvZGUgd2l0aCBhbiBpbnQKICBmdW5jdGlvbiBidXQgd2l0aG91dCBhIHJldHVybiBzdGF0ZW1lbnQuIFdoaWxlIGZpeGluZyB0aGF0LCBJIGFsc28gdG9vayBjYXJlCiAgYWJvdXQgYWRkaW5nIHNvbWUgYmV0dGVyIGNvbW1lbnRzIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuCgpEYW5pZWwgUyAoMjcgRGVjIDIwMDcpCi0gRG1pdHJ5IEt1cm9jaGtpbiBtZW50aW9uZWQgYSBmbGF3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0xMi8wMjUyLmh0bWwpIGluIGRldGVjdF9wcm94eSgpIHdoaWNoCiAgZmFpbGVkIHRvIHNldCB0aGUgYml0cy5wcm94eSB2YXJpYWJsZSBwcm9wZXJseSB3aGVuIGFuIGVudmlyb25tZW50IHZhcmlhYmxlCiAgdG9sZCBsaWJjdXJsIHRvIHVzZSBhIGh0dHAgcHJveHkuCgpEYW5pZWwgUyAoMjYgRGVjIDIwMDcpCi0gSW4gYW4gYXR0ZW1wdCB0byByZXBlYXQgdGhlIHByb2JsZW0gaW4gYnVnIHJlcG9ydCAjMTg1MDczMAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODUwNzMwKSBJIHdyb3RlIHVwIHRlc3QgY2FzZSA1NTIuIFRoZQogIHRlc3QgaXMgZG9pbmcgYSA3MEsgUE9TVCB3aXRoIGEgcmVhZCBjYWxsYmFjayBhbmQgYW4gaW9jdGwgY2FsbGJhY2sgb3ZlciBhCiAgcHJveHkgcmVxdWlyaW5nIERpZ2VzdCBhdXRoLiBUaGUgdGVzdCBjYXNlIGNvZGUgaXMgbW9yZSBvciBsZXNzIGlkZW50aWNhbCB0bwogIHRoZSB0ZXN0IHJlY2lwZSBjb2RlIHByb3ZpZGVkIGJ5IFNwYWNlbiBKYXNzZXQgKHdobyBzdWJtaXR0ZWQgdGhlIGJ1ZwogIHJlcG9ydCkuCgpEYW5pZWwgUyAoMjUgRGVjIDIwMDcpCi0gR2FyeSBNYXh3ZWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzE4NTY2MjgKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg1NjYyOCkgYW5kIHByb3ZpZGVkIGEgZml4IGZvciB0aGUKICAoc21hbGwpIG1lbW9yeSBsZWFrIGluIHRoZSBTU0wgc2Vzc2lvbiBJRCBjYWNoaW5nIGNvZGUuIEl0IGhhcHBlbmVkIHdoZW4gYQogIHByZXZpb3VzIGVudHJ5IGluIHRoZSBjYWNoZSB3YXMgcmUtdXNlZC4KCkRhbmllbCBGYW5kcmljaCAoMTkgRGVjIDIwMDcpCi0gRW5zdXJlIHRoYXQgbnJvZmYgZG9lc24ndCBwdXQgYW55dGhpbmcgYnV0IEFTQ0lJIGNoYXJhY3RlcnMgaW50byB0aGUKICAtLW1hbnVhbCB0ZXh0LgoKWWFuZyBUc2UgKDE4IERlYyAyMDA3KQotIE1TVkMgOS4wIChWUzIwMDgpIGRvZXMgbm90IHN1cHBvcnQgV2luZG93cyBidWlsZCB0YXJnZXRzIHByaW9yIHRvIFdpblhQLAogIGFuZCBtYWtlcyB3cm9uZyBhc3VtcHRpb25zIG9mIGJ1aWxkIHRhcmdldCB3aGVuIGl0IGlzbid0IHNwZWNpZmllZC4gU28sCiAgaWYgbm8gYnVpbGQgdGFyZ2V0IGhhcyBiZWVuIGRlZmluZWQgd2Ugd2lsbCB0YXJnZXQgV2luWFAgd2hlbiBidWlsZGluZwogIGN1cmwvbGliY3VybCB3aXRoIE1TVkMgOS4wIChWUzIwMDgpLgoKLSAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2FyY2hpdmUtMjAwNy0xMi8wMDM5Lmh0bWwpIHJlcG9ydGVkIGFuZCBmaXhlZAogIGEgZmlsZSB0cnVuY2F0aW9uIHByb2JsZW0gb24gV2luZG93cyBidWlsZCB0YXJnZXRzIHRyaWdnZXJlZCB3aGVuIHJldHJ5aW5nCiAgYSBkb3dubG9hZCB3aXRoIGN1cmwuCgpEYW5pZWwgUyAoMTcgRGVjIDIwMDcpCi0gTWF0ZXVzeiBMb3Nrb3QgcG9pbnRlZCBvdXQgdGhhdCBNU1ZDIDkuMCAoVlMyMDA4KSBoYXMgdGhlIHBvbGxmZCBzdHJ1Y3QgYW5kCiAgZGVmaW5lcyBpbiB3aW5zb2NrMi5oIHNvbWVob3cgZGlmZmVyZW50bHkgdGhhbiBwcmV2aW91cyB2ZXJzaW9ucyBhbmQgdGhhdAogIGN1cmwgNy4xNy4xIHdvdWxkIGZhaWwgdG8gY29tcGlsZSBvdXQgb2YgdGhlIGJveC4KCkRhbmllbCBTICgxMyBEZWMgMjAwNykKLSBEYXZpZCBXcmlnaHQgZmlsZWQgYnVnIHJlcG9ydCAjMTg0OTc2NAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODQ5NzY0KSB3aXRoIGFuIGluY2x1ZGVkIGZpeC4gSGUKICBpZGVudGlmaWVkIGEgcHJvYmxlbSBmb3IgcmUtdXNlZCBjb25uZWN0aW9ucyB0aGF0IHByZXZpb3VzbHkgaGFkIHNlbnQKICBFeHBlY3Q6IDEwMC1jb250aW51ZSBhbmQgaW4gc29tZSBzaXR1YXRpb25zIHRoZSBzdWJzZXF1ZW50IFBPU1QgKHRoYXQgZGlkbid0CiAgdXNlIEV4cGVjdDopIHN0aWxsIGhhZCB0aGUgaW50ZXJuYWwgZmxhZyBzZXQgZm9yIGl0cyB1c2UuIERhdmlkJ3MgZml4ICh0aGF0CiAgbWFrZXMgdGhlIHNldHRpbmcgb2YgdGhlIGZsYWcgaW4gZXZlcnkgc2luZ2xlIHJlcXVlc3QgdW5jb25kaXRpb25hbGx5KSBpcwogIGZpbmUgYW5kIGlzIG5vdyB1c2VkIQoKRGFuaWVsIFMgKDEyIERlYyAyMDA3KQotIEdpbGxlcyBCbGFuYyBtYWRlIHRoZSBjdXJsIHRvb2wgZW5hYmxlIFNPX0tFRVBBTElWRSBmb3IgdGhlIGNvbm5lY3Rpb25zIGFuZAogIGFkZGVkIHRoZSAtLW5vLWtlZXAtYWxpdmUgb3B0aW9uIHRoYXQgY2FuIGRpc2FibGUgdGhhdCBvbiBkZW1hbmQuCgpEYW5pZWwgUyAoOSBEZWMgMjAwNykKLSBBbmRyZXcgTW9pc2UgZmlsZWQgYnVnIHJlcG9ydCAjMTg0NzUwMQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODQ3NTAxKSBhbmQgcG9pbnRlZCBvdXQgYSBtZW1jcHkoKQogIHRoYXQgc2hvdWxkIGJlIG1lbW1vdmUoKSBpbiB0aGUgY29udmVydF9saW5lZW5kcygpIGZ1bmN0aW9uLgoKRGFuaWVsIFMgKDggRGVjIDIwMDcpCi0gUmVuYW1lZCBhbGwgaW50ZXJuYWwgc3RhdGljIGZ1bmN0aW9ucyB0aGF0IGhhZCBDdXJsXyBwcmVmaXhlcyB0byBubyBsb25nZXIKICBoYXZlIHRoZW0uIFRoZSBDdXJsXyBwcmVmaXggaXMgZXhjbHVzaXZlbHkgdXNlZCBmb3IgbGlicmFyeSBpbnRlcm5hbCBnbG9iYWwKICBzeW1ib2xzLiBTdGF0aWMgZnVuY3Rpb25zIGNhbiBiZSBuYW1lZCBhbnl0aGluZywgZXhjZXB0IGZvciB1c2luZyBDdXJsXyBvcgogIGN1cmxfIHByZWZpeGVzLiBUaGlzIGlzIGZvciBjb25zaXN0ZW5jeSBhbmQgZm9yIGVhc2llciBtYWludGFpbmFuY2UgYW5kCiAgb3ZlcnZpZXcuCgotIENsZWFuZWQgdXAgYW5kIHJlZm9ybWF0dGVkIHRoZSBUT0RPIGRvY3VtZW50IHRvIGxvb2sgbGlrZSB0aGUgRkFRIGFuZAogIENPTlRSSUJVVEUsIHdoaWNoIG1ha2VzIG5pY2VyIHdlYiBwYWdlcwoKLSBBZGRlZCB0ZXN0IGNhc2VzIDU0OSBhbmQgNTUwIHRoYXQgdGVzdCBDVVJMT1BUX1BST1hZX1RSQU5TRkVSX01PREUuCgotIEFkZGVkIGtleXdvcmRzIG9uIGEgYnVuY2ggb2YgdGVzdCBjYXNlcwoKLSBGaXhlZCBhbiBPT00gcHJvYmxlbSBpbiB0aGUgY3VybCBjb2RlIHRoYXQgd291bGQgbGVhZCB0byBmY2xvc2Ugb24gYSBiYWQKICBoYW5kbGUgYW5kIGNyYXNoCgpEYW5pZWwgUyAoNSBEZWMgMjAwNykKLSBTcGFjZW4gSmFzc2V0IHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIGRvaW5nIFBPU1QgKHdpdGggZGF0YSByZWFkIHdpdGggYQogIGNhbGxiYWNrKSBvdmVyIGEgcHJveHkgd2hlbiBOVExNIGlzIHVzZWQgYXMgYXV0aCB3aXRoIHRoZSBwcm94eS4gVGhlIGJ1ZwogIGFsc28gY29uY2VybmVkIERpZ2VzdCBhbmQgd2FzIGxpbWl0ZWQgdG8gdXNpbmcgY2FsbGJhY2sgb25seS4gU3BhY2VuIHdvcmtlZAogIHdpdGggdXMgdG8gcHJvdmlkZSBhIHVzZWZ1bCBwYXRjaC4gSSBhZGRlZCB0aGUgdGVzdCBjYXNlIDU0NyBhbmQgNTQ4IHRvCiAgdmVyaWZ5IHR3byB2YXJpYXRpb25zIG9mIFBPU1Qgb3ZlciBwcm94eSB3aXRoIE5UTE0uCgpEYW5pZWwgUyAoMyBEZWMgMjAwNykKLSBSYXkgUGVrb3dza2kgZmlsZWQgYnVnIHJlcG9ydCAjMTg0MjAyOQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODQyMDI5KSBpbiB3aGljaCBoZSBpZGVudGlmaWVkIGEKICBwcm9ibGVtIHdpdGggU1NMIHNlc3Npb24gY2FjaGluZyB0aGF0IHByZXZlbnQgaXQgZnJvbSB3b3JraW5nLCBhbmQgcHJvdmlkZWQKICB0aGUgYXNzb2NpYXRlZCBmaXghCgotIE5vdyBsaWJjdXJsIChidWlsdCB3aXRoIE9wZW5TU0wpIGRvZXNuJ3QgcmV0dXJuIGVycm9yIGFueW1vcmUgaWYgdGhlIHJlbW90ZQogIFNTTC1iYXNlZCBzZXJ2ZXIgZG9lc24ndCBwcmVzZW50IGEgY2VydGlmaWNhdGUgd2hlbiB0aGUgcmVxdWVzdCBpcyB0b2xkIHRvCiAgaWdub3JlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhbnl3YXkuCgotIE1pY2hhbCBNYXJlayBpbnRyb2R1Y2VkIENVUkxPUFRfUFJPWFlfVFJBTlNGRVJfTU9ERSB3aGljaCBpcyB1c2VkIHRvIGNvbnRyb2wKICB0aGUgYXBwZW5kaW5nIG9mIHRoZSAidHlwZT0iIHRoaW5nIG9uIEZUUCBVUkxzIHdoZW4gdGhleSBhcmUgcGFzc2VkIHRvIGEKICBIVFRQIHByb3h5LiBTb21lIHByb3hpZXMganVzdCBkb24ndCBsaWtlIHRoYXQgYXBwZW5kaW5nICh3aGljaCBpcyBkb25lCiAgdW5jb25kaXRpb25hbGx5IGluIDcuMTcuMSksIGFuZCBzb21lIHByb3hpZXMgdHJlYXQgYmluYXJ5L2FzY2lpIHRyYW5zZmVycwogIGJldHRlciB3aXRoIHRoZSBhcHBlbmRpbmcgZG9uZSEKCkRhbmllbCBTICgyOSBOb3YgMjAwNykKLSBBIGJ1ZyByZXBvcnQgb24gdGhlIGN1cmwtbGlicmFyeSBsaXN0IHNob3dlZCBhIEhUVFAgRGlnZXN0IHNlc3Npb24gZ29pbmcgb24KICB3aXRoIGEgNzAwKyBsZXR0ZXIgbm9uY2UuIFByZXZpb3VzbHkgbGliY3VybCBvbmx5IHN1cHBvcnQgMTI3IGxldHRlciBvbmVzCiAgYW5kIG5vdyBJIGJ1bXBlZCBpdCB0byAxMDIzLgoKLSBGaXhlZCB0aGUgcmVzdW1lZCBGVFAgdXBsb2FkIGxvb3AgdG8gbm90IHJlcXVpcmUgdGhhdCB0aGUgcmVhZCBjYWxsYmFjawogIHJldHVybnMgYSBmdWxsIGJ1ZmZlciBvbiBlYWNoIGludm9rZS4KCkRhbmllbCBTICgyNSBOb3YgMjAwNykKLSBBZGRlZCB0ZXN0IGNhc2UgMTAxNSB0aGF0IHRlc3RzIC0tZGF0YS11cmxlbmNvZGUgaW4gbXVsdGlwbGUgd2F5cwoKLSBGaXhlZCAtLWRhdGEtdXJsZW5jb2RlIGZvciB3aGVuIG5vIEAgb3IgPSBhcmUgdXNlZAoKLSBFeHRlbmRlZCB0aGUgdXNlci1hZ2VudCBidWZmZXIgY3VybCB1c2VzLCBzaW5jZSB3ZSBjYW4gaGl0IHRoZSAxMjggYnl0ZQogIGJvcmRlciB3aXRoIHBsZW50eSBkZXZlbG9wbWVudCBsaWJyYXJpZXMgdXNlZC4gTGlrZSBteSBjdXJyZW50IHNldDogImN1cmwKICA3LjE3LjItQ1ZTIChpNjg2LXBjLWxpbnV4LWdudSkgbGliY3VybC83LjE3LjItQ1ZTIE9wZW5TU0wvMC45LjhnCiAgemxpYi8xLjIuMy4zIGMtYXJlcy8xLjUuMi1DVlMgbGliaWRuLzEuMSBsaWJzc2gyLzAuMTkuMC1DVlMiCgpEYW5pZWwgUyAoMjQgTm92IDIwMDcpCi0gSW50ZXJuYWwgcmVhcnJhbmdlbWVudHMsIHNvIHRoYXQgdGhlIHByZXZpb3VzIHN0cnVjdCBIYW5kbGVEYXRhIGlzIG5vIG1vcmUuCiAgSXQgaXMgbm93IGtub3duIGFzIFNpbmdsZVJlcXVlc3QgYW5kIHRoZSBDdXJsX3RyYW5zZmVyX2tlZXBlciBzdHJ1Y3Qgd2l0aGluCiAgdGhhdCB3YXMgcmVtb3ZlIGVudGlyZWx5LiBUaGlzIGhhcyB0aGUgdXBzaWRlIHRoYXQgdGhlcmUgYXJlIGxlc3MgZHVwbGljYXRlCiAgc3RydWN0IG1lbWJlcnMgdGhhdCBtYWRlIGl0IGhhcmQgdG8gc2VlIGFuZCByZW1lbWJlciB3aGF0IHN0cnVjdCB0aGF0IHdhcwogIHVzZWQgdG8gc3RvcmUgd2hhdCBkYXRhLiBUaGUgdHJhbnNmZXJfa2VlcGVyIHRoaW5nIHdhcyBvbmNlIHN0b3JlZCBvbiBhCiAgcGVyLWNvbm5lY3Rpb24gYmFzaXMgYW5kIHRoZW4gaXQgbWFkZSBzZW5zZSB0byBoYXZlIHRoZSBkdXBsaWNhdGUgaW5mbyBidXQKICBzaW5jZSBpdCB3YXMgbW92ZWQgdG8gdGhlIFNlc3Npb25IYW5kbGUgKGluIDcuMTYuMCkgaXQganVzdCBhZGRlZCB3ZWlyZG5lc3MuCiAgVGhlIFNpbmdsZVJlcXVlc3Qgc3RydWN0IGlzIHVzZWQgYnkgZGF0YSB0aGF0IG9ubHkgaXMgdmFsaWQgZm9yIHRoaXMgc2luZ2xlCiAgcmVxdWVzdC4KCllhbmcgVHNlICgyMiBOb3YgMjAwNykKLSBQcm92aWRlIGEgc29ja2xlbl90IGRlZmluaXRpb24gaW4gY3VybC5oIGZvciBXaW4zMiBBUEkgYnVpbGQgdGFyZ2V0cwogIHdoaWNoIGRvbid0IGhhdmUgb25lLgoKRGFuaWVsIFMgKDIyIE5vdiAyMDA3KQotIEFsZXNzYW5kcm8gVmVzZWx5IGhlbHBlZCBtZSBpbXByb3ZlIHRoZSAtLWRhdGEtdXJsZW5jb2RlJ3Mgc3ludGF4LCBwYXJzZXIKICBhbmQgZG9jdW1lbnRhdGlvbi4KCkRhbmllbCBTICgyMSBOb3YgMjAwNykKLSBXaGlsZSBpbnNwZWN0aW5nIHRoZSBOZWdvdGlhdGUgY29kZSwgSSBub3RpY2VkIGhvdyB0aGUgcHJveHkgYXV0aCB3YXMgdXNpbmcKICB0aGUgc2FtZSBzdGF0ZSBzdHJ1Y3QgYXMgdGhlIGhvc3QgYXV0aCwgc28gYm90aCBjb3VsZCBuZXZlciBiZSB1c2VkIGF0IHRoZQogIHNhbWUgdGltZSEgSSBmaXhlZCBpdCAod2l0aG91dCBiZWluZyBhYmxlIHRvIGNoZWNrKSB0byB1c2UgdHdvIHNlcGFyYXRlCiAgc3RydWN0cyB0byBhbGxvdyBhdXRoZW50aWNhdGlvbiB1c2luZyBOZWdvdGlhdGUgb24gaG9zdCBhbmQgcHJveHkKICBzaW11bHRhbmVvdXNseS4KCkRhbmllbCBTICgyMCBOb3YgMjAwNykKLSBFbWlsIFJvbWFudXMgcG9pbnRlZCBvdXQgYSBidWcgdGhhdCBtYWRlIGFuIGVhc3kgaGFuZGxlIGdldCB0aGUgY29va2llCiAgZW5naW5lIGFjdGl2YXRlZCB3aGVuIHNldCB0byB1c2UgYSBzaGFyZSAoZXZlbiBpZiB0aGUgc2hhcmUgZG9lc24ndCBzaGFyZQogIGNvb2tpZXMpLiBJIGZpeGVkIGl0LgoKLSBGaXhlZCBhIHZlcnkgbG9uZy1sYXN0aW5nIG1wcmludGYoKSBidWcgdGhhdCBvY2N1cnJlZCB3aGVuIHdlIGRpZCAiJS4qcyVzIiwKICBzaW5jZSB0aGUgc2Vjb25kICVzIHdvdWxkIHRoZW4gd3JvbmdseSB1c2VkIHRoZSBudW1lcmljYWwgcHJlY2lzaW9uIGFyZ3VtZW50CiAgaW5zdGVhZCBhbmQgY3Jhc2guCgotIEludHJvZHVjZWQgLS1kYXRhLXVybGVuY29kZSB0byB0aGUgY3VybCB0b29sIGZvciBlYXNpZXIgdXJsIGVuY29kaW5nIG9mIHRoZQogIGRhdGEgc2VudCBpbiBhIHBvc3QuCgpEYW5pZWwgUyAoMTggTm92IDIwMDcpCi0gUm9iIENyaXR0ZW5kZW4gZml4ZWQgU1NMIGNvbm5lY3Rpb25zIHdpdGggTlNTIGRvbmUgd2l0aCB0aGUgbXVsdGktaW50ZXJmYWNlCgpEYW5pZWwgUyAoMTcgTm92IDIwMDcpCi0gTWljaGFsIE1hcmVrIG1hZGUgdGhlIHRlc3Qgc3VpdGUgcmVtZW1iZXIgd2hhdCB0ZXN0IHNlcnZlcnMgdGhhdCBmYWlsIHRvCiAgc3RhcnQgc28gdGhhdCBzdWJzZXF1ZW50IHRyaWVzIGFyZSBzaW1wbHkgc2tpcHBlZC4KCi0gQW5kcmVzIEdhcmNpYSBtYWRlIHRoZSBleGFtcGxlcyBidWlsZCBmaW5lIG9uIFdpbmRvd3MgKG1pbmd3ICsgbXN5cykgd2hlbgogIHRoZSBsaWIgd2FzIGJ1aWx0IHN0YXRpY2x5LgoKRGFuaWVsIFMgKDE2IE5vdiAyMDA3KQotIEF0ZXMgR29yYWwgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gaHR0cC5jOmFkZF9idWZmZXJfc2VuZCgpIHdoZW4gYSBkZWJ1ZwogIGNhbGxiYWNrIHdhcyB1c2VkLCBhcyBpdCBjb3VsZCB3cm9uZ2x5IHBhc3Mgb24gYSBiYWQgc2l6ZSBmb3IgdGhlIG91dGdvaW5nCiAgSFRUUCBoZWFkZXIuIFRoZSBiYWQgc2l6ZSB3b3VsZCBiZSBhIHZlcnkgbGFyZ2UgdmFsdWUgYXMgaXQgd2FzIGEgd3JhcHBlZAogIHNpemVfdCBjb250ZW50LiBUaGlzIGhhcHBlbmVkIHdoZW4gdGhlIHdob2xlIEhUVFAgcmVxdWVzdCBmYWlsZWQgdG8gZ2V0IHNlbnQKICBpbiBvbmUgc2luZ2xlIHNlbmQuICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDctMTEvMDE2NS5odG1sCgpEYW5pZWwgUyAoMTUgTm92IDIwMDcpCi0gRml4ZWQgeWV0IGFub3RoZXIgcmVtYWluaW5nIHByb2JsZW0gd2l0aCBkb2luZyBTRlRQIGRpcmVjdG9yeSBsaXN0aW5ncyBvbiBhCiAgcmUtdXNlZCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uIE1lbnRpb25lZCBieSBJbW1hbnVlbCBHcmVnb2lyZSBvbiB0aGUgbWFpbGluZwogIGxpc3QuCgotIE1pY2hhbCBNYXJlayBmaXhlZCB0aGUgdGVzdCBzdWl0ZSB0byBiZXR0ZXIgZGVhbCB3aXRoIHRoZSBjYXNlIHdoZW4gdGhlIEhUVFAKICBpcHY2IHNlcnZlciBjYW4ndCBydW4uCgpZYW5nIFRzZSAoMTQgTm92IDIwMDcpCi0gRml4IGEgdmFyaWFibGUgcG90ZW50aWFsIHdyYXBwaW5nIGluIGFkZF9idWZmZXIoKSB3aGVuIHVzaW5nIGFic29sdXRlbHkKICBodWdlIHNlbmQgYnVmZmVyIHNpemVzLgoKRGFuaWVsIFMgKDEzIE5vdiAyMDA3KQotIEZpeGVkIGEgcmVtYWluaW5nIHByb2JsZW0gd2l0aCBkb2luZyBTRlRQIGRpcmVjdG9yeSBsaXN0aW5ncyBvbiBhIHJlLXVzZWQKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uIE1lbnRpb25lZCBieSBJbW1hbnVlbCBHcmVnb2lyZSBvbiB0aGUgbWFpbGluZyBsaXN0LgoKRGFuaWVsIFMgKDEyIE5vdiAyMDA3KQotIEJ1ZyByZXBvcnQgIzE4MzA2MzcgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4MzA2MzcpLCB3aGljaCB3YXMKICBmb3J3YXJkZWQgZnJvbSB0aGUgR2VudG9vIGJ1ZyB0cmFja2VyIGJ5IERhbmllbCBCbGFjayBhbmQgd2FzIG9yaWdpbmFsbHkKICBzdWJtaXR0ZWQgYnkgUm9iaW4gSm9obnNvbiwgcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIHdvdWxkIGRvIGJhZCBtZW1vcnkKICByZWZlcmVuY2VzIHdoZW4gaXQgZmFpbGVkIGFuZCBiYWlsZWQgb3V0IGJlZm9yZSB0aGUgaGFuZGxlciB0aGluZyB3YXMKICBzZXR1cC4gTXkgZml4IGlzIG5vdCBkb25lIGxpa2UgdGhlIHByb3ZpZGVkIHBhdGNoIGRvZXMgaXQsIGJ1dCBpbnN0ZWFkIEkKICBtYWtlIHN1cmUgdGhhdCB0aGVyZSdzIG5ldmVyIGFueSBjaGFuY2UgZm9yIGEgTlVMTCBwb2ludGVyIGluIHRoYXQgc3RydWN0CiAgbWVtYmVyLgoKWWFuZyBUc2UgKDEwIE5vdiAyMDA3KQotIFZpa3JhbSBTYXhlbmEgKGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0xMS8wMDk2Lmh0bWwpIHBvaW50ZWQgb3V0CiAgdGhhdCB0aGUgcG9sbGZkIHN0cnVjdCB3YXMgYmVpbmcgbXVsdGkgZGVmaW5lZCB3aGVuIHVzaW5nIFZTMjAwOC4gVGhpcyBpcwogIG5vdyBmaXhlZCBpbiAvY3VybC9saWIvc2VsZWN0LmgKCkRhbmllbCBTICg4IE5vdiAyMDA3KQotIEJ1ZyByZXBvcnQgIzE4MjM0ODcgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4MjM0ODcpIHBvaW50ZWQKICBvdXQgdGhhdCBTRlRQIHJlcXVlc3RzIGRpZG4ndCB1c2UgcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gTmVpdGhlciBkaWQgU0NQCiAgb25lcy4gIEkgZ2F2ZSB0aGUgU1NIIGNvZGUgYSBnb29kIGJlYXRpbmcgYW5kIG5vdyBib3RoIFNDUCBhbmQgU0ZUUCBzaG91bGQKICB1c2UgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBmaW5lLiBJIGFsc28gZGlkIGEgYnVuY2ggb2YgaW5kZW50IGNoYW5nZXMgYXMKICB3ZWxsIGFzIGEgYnVnIGZpeCBmb3IgdGhlICJrZXlib2FyZCBpbnRlcmFjdGl2ZSIgYXV0aC4KCkRhbiBGICg2IE5vdiAyMDA3KQotIEltcHJvdmVkIHRlbG5ldCBzdXBwb3J0IGJ5IGRyYXN0aWNhbGx5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygd3JpdGUKICBjYWxsYmFja3MgbmVlZGVkIHRvIHBhc3MgYSBidWZmZXIgdG8gdGhlIHVzZXIuICBJbnN0ZWFkIG9uZSBwZXIgYnl0ZSBpdAogIGlzIG5vdyBhcyBsaXR0bGUgYXMgb25lIHBlciBzZWdtZW50LgoKWWFuZyBUc2UgKDYgTm92IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTgyNDg5NCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTgyNDg5NCkgcG9pbnRlZAogIG91dCBhIHByb2JsZW0gaW4gY3VybC5oIHdoZW4gYnVpbGRpbmcgQysrIGFwcHMgd2l0aCBNU1ZDLiBUbyBmaXggaXQsIHRoZQogIGluY2x1c2lvbiBvZiBoZWFkZXIgZmlsZXMgaW4gY3VybC5oIGlzIG1vdmVkIG91dHNpZGUgb2YgdGhlIEMrKyBleHRlcm4gIkMiCiAgbGlua2FnZSBibG9jay4KCkRhbmllbCBTICgxIE5vdiAyMDA3KQotIFRvYnkgUGV0ZXJzb24gcGF0Y2hlZCBhIG1lbW9yeSBwcm9ibGVtIGluIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB0aGF0CiAgaGFwcGVuZWQgd2hlbiBhIHVzZXIgaGFkIGEgaG9tZSBkaXIgYXMgYW4gZW1wdHkgc3RyaW5nLiBjdXJsIHdvdWxkIHRoZW4gZG8KICBmcmVlKCkgb24gYSB3cm9uZyBhcmVhLgoKRGFuIEYgKDEgTm92IDIwMDcpCi0gRml4ZWQgY3VybC1jb25maWcgLS1mZWF0dXJlcyB0byBub3QgZGlzcGxheSBsaWJ6IHdoZW4gaXQgd2Fzbid0IHVzZWQKICBkdWUgdG8gYSBtaXNzaW5nIGhlYWRlciBmaWxlLgoKRGFuIEYgKDMxIE9jdG9iZXIgMjAwNykKLSBGaXhlZCB0aGUgb3V0cHV0IG9mIGN1cmwtY29uZmlnIC0tcHJvdG9jb2xzIHdoaWNoIHNob3dlZCBTQ1AgYW5kIFNGVFAKICBhbHdheXMsIGV4Y2VwdCB3aGVuIC0td2l0aG91dC1saWJzc2gyIHdhcyBnaXZlbgoKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwMTMgYW5kIDEwMTQgdG8gY2hlY2sgdGhhdCBjdXJsLWNvbmZpZyAtLXByb3RvY29scyBhbmQKICBjdXJsLWNvbmZpZyAtLWZlYXR1cmVzIG1hdGNoZXMgdGhlIG91dHB1dCBvZiBjdXJsIC0tdmVyc2lvbgoKRGFuIEYgKDMwIE9jdG9iZXIgMjAwNykKLSBGaXhlZCBhbiBPT00gcHJvYmxlbSB3aXRoIGZpbGU6IFVSTHMKCi0gTW92ZWQgQ3VybF9maWxlX2Nvbm5lY3QgaW50byB0aGUgcHJvdG9jb2wgaGFuZGxlciBzdHJ1Y3QKCkRhbiBGICgyOSBPY3RvYmVyIDIwMDcpCi0gQWRkZWQgdGVzdCBjYXNlIDU0NiB0byBjaGVjayB0aGF0IHN1YnNlcXVlbnQgRlRQIHRyYW5zZmVycyB3b3JrIGFmdGVyIGEKICBmYWlsZWQgb25lIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UKCkRhbmllbCBTICgyOSBPY3RvYmVyIDIwMDcpCi0gQmFzZWQgb24gb25lIG9mIHRob3NlIGJ1ZyByZXBvcnRzIHRoYXQgYXJlIGludGVyY2VwdGVkIGJ5IGEgZGlzdHJvJ3MgYnVnCiAgdHJhY2tlciAoaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD0zMTYxOTEpLCBJIG5vdyBtYWRlCiAgY3VybC1jb25maWcgLS1mZWF0dXJlcyBhbmQgLS1wcm90b2NvbHMgc2hvdyB0aGUgY29ycmVjdCBvdXRwdXQgd2hlbiBidWlsdAogIHdpdGggTlNTLgoKVmVyc2lvbiA3LjE3LjEgKDI5IE9jdG9iZXIgMjAwNykKCkRhbiBGICgyNSBPY3RvYmVyIDIwMDcpCi0gQWRkZWQgdGhlIC0tc3RhdGljLWxpYnMgb3B0aW9uIHRvIGN1cmwtY29uZmlnCgpEYW5pZWwgUyAoMjUgT2N0b2JlciAyMDA3KQotIE1hZGUgbGliY3VybCBidWlsdCB3aXRoIE5TUyBwb3NzaWJsZSB0byBpZ25vcmUgdGhlIHBlZXIgdmVyaWZpY2F0aW9uLgogIFByZXZpb3VzbHkgaXQgd291bGQgZmFpbCBpZiB0aGUgY2EgYnVuZGxlIHdhc24ndCBwcmVzZW50LCBldmVuIGlmIHRoZSBjb2RlCiAgaWdub3JlZCB0aGUgdmVyaWZpY2F0aW9uIHJlc3VsdHMuCgpQYXRyaWNrIE0gKDI1IE9jdG9iZXIgMjAwNykKLSBGaXhlZCB0ZXN0IHNlcnZlciB0byBhbGxvdyBudWxsIGJ5dGVzIGluIGJpbmFyeSBwb3N0cy4KXyBBZGRlZCB0ZXN0cyAzNSwgNTQ0ICYgNTQ1IHRvIGNoZWNrIGJpbmFyeSBkYXRhIHBvc3RzLCBib3RoIHN0YXRpYyAoaW4gcGxhY2UpCiAgYW5kIGR5bmFtaWMgKGNvcGllZCkuCgpEYW5pZWwgUyAoMjUgT2N0b2JlciAyMDA3KQotIE1pY2hhbCBNYXJlayBmaXhlZCB0aGUgdGVzdCBzY3JpcHQgdG8gYmUgYWJsZSB0byB1c2UgdmFsZ3JpbmQgZXZlbiB3aGVuIHRoZQogIGxpYiBpcyBidWlsdCBzaGFyZWQgd2l0aCBsaWJ0b29sLgoKLSBGaXhlZCBhIGZldyBtZW1vcnkgbGVha3Mgd2hlbiB0aGUgc2FtZSBlYXN5IGhhbmRsZSBpcyByZS11c2VkIHRvIHJlcXVlc3QKICBVUkxzIHdpdGggZGlmZmVyZW50IHByb3RvY29scy4gRlRQIGFuZCBURlRQIHJlbGF0ZWQgbGVha3MuIENhdWdodCB0aGFua3MgdG8KICBEYW4gRidzIG5ldyB0ZXN0IGNhc2VzLgoKRGFuIEYgKDI0IE9jdG9iZXIgMjAwNykKLSBGaXhlZCB0aGUgdGVzdCBGVFAgYW5kIFRGVFAgc2VydmVycyB0byBzdXBwb3J0IHRoZSA+MTAwMDAgdGVzdCBudW1iZXIKICBub3RhdGlvbgoKLSBBZGRlZCB0ZXN0IGNhc2VzIDIwMDAgdGhyb3VnaCAyMDAzIHdoaWNoIHRlc3QgbXVsdGlwbGUgcHJvdG9jb2xzIHVzaW5nIHRoZQogIHNhbWUgZWFzeSBoYW5kbGUKCi0gRml4ZWQgdGhlIGZpbGVjaGVjazogbWFrZSB0YXJnZXQgdG8gd29yayBvdXRzaWRlIHRoZSBzb3VyY2UgdHJlZQoKRGFuaWVsIFMgKDI0IE9jdG9iZXIgMjAwNykKLSBWbGFkaW1pciBMYXphcmVua28gcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaG91bGQgZG8gc29tZSAnbXQnIG1hZ2ljIHdoZW4KICBidWlsZGluZyB3aXRoIFZDOCB0byBnZXQgdGhlICJtYW5pZmVzdCIgZW1iZWRkZWQgdG8gbWFrZSBmaW5lIHN0YW5kLWFsb25lCiAgYmluYXJpZXMuIFRoZSBtYWtldGd6IGFuZCB0aGUgc3JjL01ha2VmaWxlLnZjNiBmaWxlcyB3ZXJlIGFkanVzdGVkCiAgYWNjb3JkaW5nbHkuCgpEYW5pZWwgUyAoMjMgT2N0b2JlciAyMDA3KQotIEJ1ZyByZXBvcnQgIzE4MTIxOTAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4MTIxOTApIHBvaW50cyBvdXQKICB0aGF0IGxpYmN1cmwgdHJpZWQgdG8gcmUtdXNlIGNvbm5lY3Rpb25zIGEgYml0IHRvbyBtdWNoIHdoZW4gdXNpbmcgbm9uLVNTTAogIHByb3RvY29scyB0dW5uZWxlZCBvdmVyIGEgSFRUUCBwcm94eS4KCkRhbmllbCBTICgyMiBPY3RvYmVyIDIwMDcpCi0gTWljaGFsIE1hcmVrIGZvcndhcmRlZCB0aGUgYnVnIHJlcG9ydAogIGh0dHBzOi8vYnVnemlsbGEubm92ZWxsLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MzMyOTE3IGFib3V0IGEgSFRUUCByZWRpcmVjdCB0bwogIEZUUCB0aGF0IGNhdXNlZCBtZW1vcnkgaGF2b2MuIEhpcyB3b3JrIHRvZ2V0aGVyIHdpdGggbXkgZWZmb3J0cyBjcmVhdGVkIHR3bwogIGZpeGVzOgoKICAjMSAtIEZUUDo6ZmlsZSB3YXMgbW92ZWQgdG8gc3RydWN0IGZ0cF9jb25uLCBiZWNhdXNlIGlzIGhhcyB0byBiZSBkZWFsdCB3aXRoCiAgICAgICBhdCBjb25uZWN0aW9uIGNsZWFudXAsIGF0IHdoaWNoIHRpbWUgdGhlIHN0cnVjdCBIYW5kbGVEYXRhIGNvdWxkIGJlCiAgICAgICB1c2VkIGJ5IGFub3RoZXIgY29ubmVjdGlvbi4KICAgICAgIEFsc28sIHRoZSB1bnVzZWQgY2hhciAqdXJscGF0aCBtZW1iZXIgaXMgcmVtb3ZlZCBmcm9tIHN0cnVjdCBGVFAuCiAKICAjMiAtIHByb3ZpZGUgYSBDdXJsX3Jlc2V0X3JlcXByb3RvKCkgZnVuY3Rpb24gdGhhdCBmcmVlcwogICAgICAgZGF0YS0+cmVxZGF0YS5wcm90by4qIG9uIGNvbm5lY3Rpb24gc2V0dXAgaWYgbmVlZGVkICh0aGF0IGlzIGlmIHRoZQogICAgICAgU2Vzc2lvbkhhbmRsZSB3YXMgdXNlZCBieSBhIGRpZmZlcmVudCBjb25uZWN0aW9uKS4KCiAgQSBsb25nLXRlcm0gZ29hbCBpcyBvZiBjb3Vyc2UgdG8gc29tZWhvdyBnZXQgcmlkIG9mIGhvdyB0aGUgcmVxZGF0YSBzdHJ1Y3QKICBpcyB1c2VkLCBhcyBpdCBpcyB0b28gZXJyb3ItcHJvbmUuCiAKLSBCdWcgcmVwb3J0ICMxODE1NTMwIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODE1NTMwKSBwb2ludHMgb3V0CiAgdGhhdCBzcGVjaWZ5aW5nIGEgcHJveHkgd2l0aCBhIHRyYWlsaW5nIHNsYXNoIGRpZG4ndCB3b3JrICh1bmxlc3MgaXQgYWxzbwogIGNvbnRhaW5lZCBhIHBvcnQgbnVtYmVyKS4KClBhdHJpY2sgTSAoMTUgT2N0b2JlciAyMDA3KQotIEZpeGVkIHRoZSBkeW5hbWljIENVUkxPUFRfUE9TVEZJRUxEUyBwcm9ibGVtOiB0aGlzIG9wdGlvbiBpcyBub3cgc3RhdGljIGFnYWluCiAgYW5kIG9wdGlvbiBDVVJMT1BUX0NPUFlQT1NURklFTERTIGhhcyBiZWVuIGFkZGVkIHRvIHN1cHBvcnQgZHluYW1pYyBtb2RlLgoKUGF0cmljayBNICgxMiBPY3RvYmVyIDIwMDcpCi0gQWRkZWQgcGVyLXByb3RvY29sIGNhbGxiYWNrIHN0YXRpYyB0YWJsZXMsIHJlcGxhY2luZyBjYWxsYmFjayBwdHIgc3RvcmFnZQogIGluIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3R1cmUgYnkgYSBzaW5nbGUgaGFuZGxlciB0YWJsZSBwdHIuCgpEYW4gRiAoMTEgT2N0b2JlciAyMDA3KQotIEZpeGVkIHRoZSAtbCBvcHRpb24gb2YgcnVudGVzdHMucGwKCi0gQWRkZWQgc3VwcG9ydCBmb3Igc2tpcHBpbmcgdGVzdHMgYmFzZWQgb24ga2V5IHdvcmRzLgoKRGFuaWVsIFMgKDkgT2N0b2JlciAyMDA3KQotIE1pY2hhbCBNYXJlayByZW1vdmVkIHRoZSBubyBsb25nZXIgZXhpc3RpbmcgcmV0dXJuIGNvZGVzIGZyb20gdGhlIGN1cmwuMQogIG1hbiBwYWdlLgoKRGFuaWVsIFMgKDcgT2N0b2JlciAyMDA3KQotIEtub3duIGJ1ZyAjNDcsIHdoaWNoIGNvbmZ1c2VkIGxpYmN1cmwgaWYgZG9pbmcgTlRMTSBhdXRoIG92ZXIgYSBwcm94eSB3aXRoCiAgYSByZXNwb25zZSB0aGF0IHdhcyBsYXJnZXIgdGhhbiAxNktCIGlzIG5vdyBpbXByb3ZlZCBzbGlnaHRseSBzbyB0aGF0IG5vdwogIHRoZSByZXN0cmljdGlvbiBhdCAxNktCIGlzIGZvciB0aGUgaGVhZGVycyBvbmx5IGFuZCBpdCBzaG91bGQgYmUgYSByYXJlCiAgc2l0dWF0aW9uIHdoZXJlIHRoZSByZXNwb25zZS1oZWFkZXJzIGV4Y2VlZCAxNktCLiBUaHVzLCBJIGNvbnNpZGVyICM0NyBmaXhlZAogIGFuZCB0aGUgaGVhZGVyIGxpbWl0YXRpb24gaXMgbm93IGtub3duIGFzIGtub3duIGJ1ZyAjNDguCgpEYW5pZWwgUyAoNSBPY3RvYmVyIDIwMDcpCi0gTWljaGFlbCBXYWxsbmVyIG1hZGUgdGhlIENVTFJPUFRfQ09PS0lFTElTVCBvcHRpb24gc3VwcG9ydCBhIG5ldyBtYWdpYwogIHN0cmluZzogIkZMVVNIIi4gVXNpbmcgdGhhdCB3aWxsIGNhdXNlIGxpYmN1cmwgdG8gZmx1c2ggaXRzIGNvb2tpZXMgdG8gdGhlCiAgQ1VSTE9QVF9DT09LSUVKQVIgZmlsZS4KCi0gVGhlIG5ldyBmaWxlIGRvY3MvbGliY3VybC9BQkkgZGVzY3JpYmVzIGhvdyB3ZSB2aWV3IEFCSSBicmVha2FnZXMsIHNvbmFtZQogIGJ1bXBzIGFuZCB3aGF0IHRoZSB2ZXJzaW9uIG51bWJlcidzIHNpZ25pZmljYW5jZSB0byBhbGwgdGhhdCBpcy4KCkRhbmllbCBTICg0IE9jdG9iZXIgMjAwNykKLSBJIGVuYWJsZWQgdGVzdCAxMDA5IGFuZCBtYWRlIHRoZSAtLWxvY2FsLXBvcnQgdXNlIGEgd2lkZSByYW5nZSB0byByZWR1Y2UgdGhlCiAgcmlzayBvZiBmYWlsdXJlcy4KCi0gS2ltIFJpbm5ld2l0eiByZXBvcnRlZCB0aGF0IC0tbG9jYWwtcG9ydCBkaWRuJ3Qgd29yayB3aXRoIFRGVFAgdHJhbnNmZXJzLgogIFRoaXMgaGFwcGVuZWQgYmVjYXVzZSB0aGUgdGZ0cCBjb2RlIGFsd2F5cyB1bmNvbmRpb25hbGx5IGRpZCBhIGJpbmQoKQogIHdpdGhvdXQgY2FyaW5nIGlmIG9uZSBhbHJlYWR5IGhhZCBiZWVuIGRvbmUgYW5kIHRoZW4gaXQgZmFpbGVkLiBJIHdyb3RlIGEKICB0ZXN0IGNhc2UgKDEwMDkpIHRvIHZlcmlmeSB0aGlzLCBidXQgaXQgaXMgYSBiaXQgZXJyb3ItcHJvbmUgc2luY2UgaXQgd2lsbAogIGhhdmUgdG8gcGljayBhIGZpeGVkIGxvY2FsIHBvcnQgbnVtYmVyIGFuZCBzaW5jZSB0aGUgdGVzdHMgYXJlIHJ1biBvbiBzbwogIG1hbnkgZGlmZmVyZW50IGhvc3RzIGluIGRpZmZlcmVudCBzaXR1YXRpb25zIEknbGwgYWRkIGl0IGluIGRpc2FibGVkIHN0YXRlLgoKWWFuZyBUc2UgKDMgT2N0b2JlciAyMDA3KQotIEZpeGVkIGlzc3VlIHJlbGF0ZWQgd2l0aCB0aGUgdXNlIG9mIGFyZXNfdGltZW91dCgpIHJlc3VsdC4KCkRhbmllbCBTICgzIE9jdG9iZXIgMjAwNykKLSBBbGV4ZXkgUGVzdGVybmlrb3YgaW50cm9kdWNlZCBDVVJMT1BUX09QRU5TT0NLRVRGVU5DVElPTiBhbmQKICBDVVJMT1BUX09QRU5TT0NLRVREQVRBIHRvIHNldCBhIGNhbGxiYWNrIHRoYXQgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvCiAgcmVwbGFjZSB0aGUgc29ja2V0KCkgY2FsbCB1c2VkIGJ5IGxpYmN1cmwuIEl0IGJhc2ljYWxseSBhbGxvd3MgdGhlIGFwcCB0bwogIGNoYW5nZSBhZGRyZXNzLCBwcm90b2NvbCBvciB3aGF0ZXZlciBvZiB0aGUgc29ja2V0LgoKLSBJIHJlbmFtZWQgdGhlIENVUkxFX1NTTF9QRUVSX0NFUlRJRklDQVRFIGVycm9yIGNvZGUgdG8KICBDVVJMRV9QRUVSX0ZBSUxFRF9WRVJJRklDQVRJT04gKHN0YW5kYXJkIENVUkxfTk9fT0xESUVTIHN0eWxlKSwgYW5kIG1hZGUKICB0aGlzIHJldHVybiBjb2RlIGdldCB1c2VkIGJ5IHRoZSBwcmV2aW91cyBTU0ggTUQ1IGZpbmdlcnByaW50IGNoZWNrIGluIGNhc2UKICBpdCBmYWlscy4KCi0gQmFzZWQgb24gYSBwYXRjaCBicm91Z2h0IGJ5IEpvaG5ueSBMdW9uZywgbGliY3VybCBub3cgb2ZmZXJzCiAgQ1VSTE9QVF9TU0hfSE9TVF9QVUJMSUNfS0VZX01ENSBhbmQgdGhlIGN1cmwgdG9vbCAtLWhvc3RwdWJtZDUuIFRoZXkgYm90aAogIG1ha2UgdGhlIFNDUCBvciBTRlRQIGNvbm5lY3Rpb24gdmVyaWZ5IHRoZSByZW1vdGUgaG9zdCdzIG1kNSBjaGVja3N1bSBvZiB0aGUKICBwdWJsaWMga2V5IGJlZm9yZSBkb2luZyBhIGNvbm5lY3QsIHRvIHJlZHVjZSB0aGUgcmlzayBvZiBhIG1hbi1pbi10aGUtbWlkZGxlCiAgYXR0YWNrLgoKRGFuaWVsIFMgKDIgT2N0b2JlciAyMDA3KQotIGxpYmN1cmwgbm93IGhhbmRsZXMgY2h1bmtlZC1lbmNvZGVkIENPTk5FQ1QgcmVzcG9uc2VzCgpEYW5pZWwgUyAoMSBPY3RvYmVyIDIwMDcpCi0gQWxleCBGaXNobWFuIHJlcG9ydGVkIGEgY3VybF9lYXN5X2VzY2FwZSgpIHByb2JsZW0gdGhhdCB3YXMgbWFkZSB0aGUKICBmdW5jdGlvbiBkbyB3cm9uZyBvbiBhbGwgaW5wdXQgYnl0ZXMgdGhhdCBhcmUgPj0gMHg4MCAoZGVjaW1hbCAxMjgpIGR1ZSB0byBhCiAgc2lnbmVkIC8gdW5zaWduZWQgbWlzdGFrZSBpbiB0aGUgY29kZS4gSSBmaXhlZCBpdCBhbmQgYWRkZWQgdGVzdCBjYXNlIDU0MyB0bwogIHZlcmlmeS4KCkRhbmllbCBTICgyOSBTZXB0ZW1iZXIgMjAwNykKLSBJbW1hbnVlbCBHcmVnb2lyZSBmaXhlZCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0ZW50IHRyYW5zZmVycyBvdmVyIFNGVFAuCgpEYW5pZWwgUyAoMjggU2VwdGVtYmVyIDIwMDcpCi0gQWRhcHRlZCB0aGUgYy1hcmVzIGNvZGUgdG8gdGhlIEFQSSBjaGFuZ2UgYy1hcmVzIDEuNS4wIGJyaW5ncyBpbiB0aGUKICBub3RpZmllciBjYWxsYmFjayhzKS4KCkRhbiBGICgyNiBTZXB0ZW1iZXIgMjAwNykKLSBFbmFibGVkIGEgZmV3IG1vcmUgZ2NjIHdhcm5pbmdzIHdpdGggLS1lbmFibGUtZGVidWcuICBSZW5hbWVkIGEgZmV3CiAgdmFyaWFibGVzIHRvIGF2b2lkIHNoYWRvd2luZyBnbG9iYWwgZGVjbGFyYXRpb25zLgoKRGFuaWVsIFMgKDI2IFNlcHRlbWJlciAyMDA3KQotIFBoaWxpcCBMYW5nZGFsZSBwcm92aWRlZCB0aGUgbmV3IENVUkxPUFRfUE9TVDMwMSBvcHRpb24gZm9yCiAgY3VybF9lYXN5X3NldG9wdCgpIHRoYXQgYWx0ZXJzIGhvdyBsaWJjdXJsIGZ1bmN0aW9ucyB3aGVuIGZvbGxvd2luZwogIHJlZGlyZWN0cy4gSXQgbWFrZXMgbGliY3VybCBvYmV5IHRoZSBSRkMyNjE2IHdoZW4gYSAzMDEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQKICBhZnRlciBhIG5vbi1HRVQgcmVxdWVzdCBpcyBtYWRlLiBEZWZhdWx0IGxpYmN1cmwgYmVoYXZpb3VyIGlzIHRvIGNoYW5nZQogIG1ldGhvZCB0byBHRVQgaW4gdGhlIHN1YnNlcXVlbnQgcmVxdWVzdCAobGlrZSBpdCBkb2VzIGZvciByZXNwb25zZSBjb2RlIDMwMgogIC0gYmVjYXVzZSB0aGF0J3Mgd2hhdCBtYW55L21vc3QgYnJvd3NlcnMgZG8pLCBidXQgd2l0aCB0aGlzIENVUkxPUFRfUE9TVDMwMQogIG9wdGlvbiBlbmFibGVkIGl0IHdpbGwgZG8gd2hhdCB0aGUgc3BlYyBzYXlzIGFuZCBkbyB0aGUgbmV4dCByZXF1ZXN0IHVzaW5nCiAgdGhlIHNhbWUgbWV0aG9kIGFnYWluLiBJLmUga2VlcCBQT1NUIGFmdGVyIDMwMS4gCgogIFRoZSBjdXJsIHRvb2wgZ290IHRoaXMgb3B0aW9uIGFzIC0tcG9zdDMwMQoKICBUZXN0IGNhc2UgMTAxMSBhbmQgMTAxMiB3ZXJlIGFkZGVkIHRvIHZlcmlmeS4KCi0gTWF4IEthdHNldiByZXBvcnRlZCB0aGF0IHdoZW4gZG9pbmcgYSBsaWJjdXJsIEZUUCByZXF1ZXN0IHdpdGgKICBDVVJMT1BUX05PQk9EWSBlbmFibGVkIGJ1dCBub3QgQ1VSTE9QVF9IRUFERVIsIGxpYmN1cmwgd291bGRuJ3QgZG8gVFlQRQogIGJlZm9yZSBpdCBkb2VzIFNJWkUgd2hpY2ggbWFrZXMgaXQgbGVzcyB1c2VmdWwuIEkgd2Fsa2VkIG92ZXIgdGhlIGNvZGUgYW5kCiAgbWFkZSBpdCBkbyB0aGlzIHByb3Blcmx5LCBhbmQgYWRkZWQgdGVzdCBjYXNlIDU0MiB0byB2ZXJpZnkgaXQuCgpEYW5pZWwgUyAoMjQgU2VwdGVtYmVyIDIwMDcpCi0gSW1tYW51ZWwgR3JlZ29pcmUgZml4ZWQgS05PV05fQlVHUyAjNDQ6IC0tZnRwLW1ldGhvZCBub2N3ZCBkaWQgbm90IGhhbmRsZQogIFVSTHMgZW5kaW5nIHdpdGggYSBzbGFzaCBwcm9wZXJseSAoaXQgc2hvdWxkIGxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoYXQKICBkaXJlY3RvcnkpLiBUZXN0IGNhc2UgMzUxIGJyb3VnaHQgYmFjayBhbmQgYWxzbyB0ZXN0IDEwMTAgd2FzIGFkZGVkLgoKRGFuaWVsIFMgKDIxIFNlcHRlbWJlciAyMDA3KQotIE1hcmsgRGF2aWVzIGZpeGVkIE5lZ290aWF0ZSBhdXRoZW50aWNhdGlvbiBvdmVyIHByb3h5LCBhbmQgYWxzbyBpbnRyb2R1Y2VkCiAgdGhlIC0tcHJveHktbmVnb3RpYXRlIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gYWxsb3cgYSB1c2VyIHRvIGV4cGxpY2l0bHkKICBzZWxlY3QgaXQuCgpEYW5pZWwgUyAoMTkgU2VwdGVtYmVyIDIwMDcpCi0gUm9iIENyaXR0ZW5kZW4gcHJvdmlkZWQgYW4gTlNTIHVwZGF0ZSB3aXRoIHRoZSBmb2xsb3dpbmcgaGlnaGxpZ2h0czoKCiAgbyBJdCBsb29rcyBmb3IgdGhlIE5TUyBkYXRhYmFzZSBmaXJzdCBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgU1NMX0RJUiwKICAgIHRoZW4gaW4gL2V0Yy9wa2kvbnNzZGIsIHRoZW4gaXQgaW5pdGlhbGl6ZXMgd2l0aCBubyBkYXRhYmFzZSBpZiBuZWl0aGVyIG9mCiAgICB0aG9zZSBleGlzdC4KCiAgbyBJZiB0aGUgTlNTIFBLQ1MjMTEgbGlibnNwc2VtLnNvIGRyaXZlciBpcyBhdmFpbGFibGUgdGhlbiBQRU0gZmlsZXMgbWF5IGJlCiAgICBsb2FkZWQsIGluY2x1ZGluZyB0aGUgY2EtYnVuZGxlLiBJZiBpdCBpcyBub3QgYXZhaWxhYmxlIHRoZW4gb25seQogICAgY2VydGlmaWNhdGVzIGFscmVhZHkgaW4gdGhlIE5TUyBkYXRhYmFzZSBhcmUgdXNlZC4KCiAgbyBUcmllcyB0byBkZXRlY3Qgd2hldGhlciBhIGZpbGUgb3Igbmlja25hbWUgaXMgYmVpbmcgcGFzc2VkIGluIHNvIHRoZSByaWdodAogICAgdGhpbmcgaXMgZG9uZQoKICBvIEFkZGVkIGEgYml0IG9mIGNvZGUgdG8gbWFrZSB0aGUgb3V0cHV0IG1vcmUgbGlrZSB0aGUgT3BlblNTTCBtb2R1bGUsCiAgICBpbmNsdWRpbmcgZGlzcGxheWluZyB0aGUgY2VydGlmaWNhdGUgaW5mb3JtYXRpb24gd2hlbiBjb25uZWN0aW5nIGluCiAgICB2ZXJib3NlIG1vZGUKCiAgbyBJbXByb3ZlZCBoYW5kbGluZyBvZiBjZXJ0aWZpY2F0ZSBlcnJvcnMgKGV4cGlyZWQsIHVudHJ1c3RlZCwgZXRjKQoKICBUaGUgbGlibnNzcGVtLnNvIFBLQ1MjMTEgbW9kdWxlIGlzIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBpbiBGZWRvcmEKICA4L3Jhd2hpZGUuIFdvcmsgd2lsbCBiZSBkb25lIHNvb24gdG8gdXBzdHJlYW0gaXQuIFRoZSBOU1MgbW9kdWxlIHdpbGwgd29yawogIHdpdGggb3Igd2l0aG91dCBpdCwgYWxsIHRoYXQgY2hhbmdlcyBpcyB0aGUgc291cmNlIG9mIHRoZSBjZXJ0aWZpY2F0ZXMgYW5kCiAga2V5cy4KCkRhbmllbCBTICgxOCBTZXB0ZW1iZXIgMjAwNykKLSBJbW1hbnVlbCBHcmVnb2lyZSBwb2ludGVkIG91dCB0aGF0IHB1YmxpYyBrZXkgU1NIIGF1dGggZmFpbGVkIGlmIG5vCiAgcHVibGljL3ByaXZhdGUga2V5IHdhcyBzcGVjaWZpZWQgYW5kIHRoZXJlIHdhcyBubyBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlLAogIGFuZCB0aGVuIGl0IGRpZG4ndCBjb250aW51ZSB0byB0cnkgdGhlIG90aGVyIGF1dGggbWV0aG9kcy4gTm93IGl0IHdpbGwKICBpbnN0ZWFkIHRyeSB0byBnZXQgdGhlIGZpbGVzIGlkX2RzYS5wdWIgYW5kIGlkX2RzYSBmcm9tIHRoZSBjdXJyZW50CiAgZGlyZWN0b3J5IGlmIG5vbmUgb2YgdGhlIHR3byBjb25kaXRpb25zIHdlcmUgbWV0LgoKRGFuIEYgKDE3IFNlcHRlbWJlciAyMDA3KQotIEFkZGVkIGhvb2tzIHRvIHRoZSB0ZXN0IHN1aXRlIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gdGVzdCBhIGN1cmwgcnVubmluZwogIG9uIGEgcmVtb3RlIGhvc3QuCgotIENoYW5nZWQgc29tZSBGVFAgdGVzdHMgdG8gdmFsaWRhdGUgdGhlIGZvcm1hdCBvZiB0aGUgUE9SVCBhbmQgRVBSVCBjb21tYW5kcwogIHNlbnQgYnkgY3VybCwgaWYgbm90IHRoZSBhZGRyZXNzZXMgdGhlbXNlbHZlcy4KCkRhbmllbCBTICgxNSBTZXB0ZW1iZXIgMjAwNykKLSBNaWNoYWwgTWFyZWsgbWFkZSBsaWJjdXJsIGF1dG9tYXRpY2FsbHkgYXBwZW5kICI7dHlwZT08YXxpPiIgd2hlbiB1c2luZyBIVFRQCiAgcHJveGllcyBmb3IgRlRQIHVybHMuCgotIEf8bnRlciBLbmF1ZiBmaXhlZCBMREFQIGJ1aWxkcyBpbiB0aGUgV2luZG93cyBtYWtlZmlsZXMgYW5kIGZpeGVkIExEQVB2MwogIHN1cHBvcnQgb24gV2luZG93cy4KCkRhbiBGICgxMyBTZXB0ZW1iZXIgMjAwNykKLSBBZGRlZCBMREFQUywgU0NQIGFuZCBTRlRQIHRvIGN1cmwtY29uZmlnIC0tcHJvdG9jb2xzLiBSZW1vdmVkIGFuZAogIGZpeGVkIHNvbWUgQUNfU1VCU1QgY29uZmlndXJlIGVudHJpZXMuCgpWZXJzaW9uIDcuMTcuMCAoMTMgU2VwdGVtYmVyIDIwMDcpCgpEYW5pZWwgUyAoMTIgU2VwdGVtYmVyIDIwMDcpCi0gQnVnIHJlcG9ydCAjMTc5MjY0OSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc5MjY0OSkgcG9pbnRlZAogIG91dCBhIHByb2JsZW0gd2l0aCBkb2luZyBhbiBlbXB0eSB1cGxvYWQgb3ZlciBGVFAgb24gYSByZS11c2VkIGNvbm5lY3Rpb24uCiAgSSBhZGRlZCB0ZXN0IGNhc2UgNTQxIHRvIHJlcHJvZHVjZSBpdCBhbmQgdG8gdmVyaWZ5IHRoZSBmaXguCgotIEkgbm90aWNlZCB3aGlsZSB3cml0aW5nIHRlc3QgNTQxIHRoYXQgdGhlIEZUUCBjb2RlIHdyb25nbHkgZGlkIGEgQ1dEIG9uIHRoZQogIHNlY29uZCB0cmFuc2ZlciBhcyBpdCBkaWRuJ3Qgc3RvcmUgYW5kIHJlbWVtYmVyIHRoZSAiIiBwYXRoIGZyb20gdGhlCiAgcHJldmlvdXMgdHJhbnNmZXIgc28gaXQgd291bGQgaW5zdGVhZCBDV0QgdG8gdGhlIGVudHJ5IHBhdGggYXMgc3RvcmVkLiBUaGlzCiAgd29ya2VkLCBidXQgZGlkIGEgc3VwZXJmbHVvdXMgY29tbWFuZC4gVGh1cywgdGVzdCBjYXNlIDU0MSBub3cgYWxzbyB2ZXJpZmllcwogIHRoaXMgZml4LgoKRGFuIEYgKDUgU2VwdGVtYmVyIDIwMDcpCi0gQWRkZWQgdGVzdCBjYXNlIDEwMDcgdG8gdGVzdCBwZXJtaXNzaW9uIHByb2JsZW0gd2hlbiB1cGxvYWRpbmcgd2l0aCBURlRQCiAgKHRvIHZhbGlkYXRlIGJ1ZyAjMTc5MDQwMykuCgotIFRGVFAgbm93IHJlcG9ydHMgdGhlICJub3QgZGVmaW5lZCIgVEZUUCBlcnJvciBjb2RlIDAgYXMgYW4gZXJyb3IsCiAgbm90IHN1Y2Nlc3MuCgpEYW5pZWwgUyAoNSBTZXB0ZW1iZXIgMjAwNykKLSBDb250aW51ZWQgdGhlIHdvcmsgb24gYSBmaXggZm9yICMxNzc5MDU0CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NzkwNTQpLiBNeSBwcmV2aW91cyBmaXggZnJvbSBBdWd1c3QKICAyNCB3YXMgbm90IGNvbXBsZXRlIChlaXRoZXIpIGJ1dCBjb3VsZCBhY2NpZGVudGFsbHkgImZvcmdldCIgcGFydHMgb2YgYQogIHNlcnZlciByZXNwb25zZSB3aGljaCBsZWQgdG8gZmF1bHR5IHNlcnZlciByZXNwb25zZSB0aW1lLW91dCBlcnJvcnMuCgpEYW4gRiAoNSBTZXB0ZW1iZXIgMjAwNykKLSBNaW5peCBkb2Vzbid0IHN1cHBvcnQgZ2V0c29ja29wdCBvbiBVRFAgc29ja2V0cyBvciBzZW5kL3JlY3Ygb24gVENQCiAgc29ja2V0cy4KCkRhbiBGICgzMSBBdWd1c3QgMjAwNykKLSBNYWRlIHNvbWUgb2YgdGhlIGVycm9yIHN0cmluZ3MgcmV0dXJuZWQgYnkgdGhlICpzdHJlcnJvciBmdW5jdGlvbnMgbW9yZQogIGdlbmVyaWMsIGFuZCBtb3JlIGNvbnNpc3RlbnQgd2l0aCBlYWNoIG90aGVyLgoKLSBSZW5hbWVkIHRoZSBjdXJsX2Z0cHNzbCBlbnVtIHRvIGN1cmxfdXNlc3NsIGFuZCBpdHMgZW51bWVyYXRlZCBjb25zdGFudHMsCiAgY3JlYXRpbmcgbWFjcm9zIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgoKICAgIENVUkxGVFBTU0xfTk9ORSA9PiBDVVJMVVNFU1NMX05PTkUKICAgIENVUkxGVFBTU0xfVFJZID0+IENVUkxVU0VTU0xfVFJZCiAgICBDVVJMRlRQU1NMX0NPTlRST0wgPT4gQ1VSTFVTRVNTTF9DT05UUk9MCiAgICBDVVJMRlRQU1NMX0FMTCA9PiBDVVJMVVNFU1NMX0FMTAogICAgQ1VSTEZUUFNTTF9MQVNUID0+IENVUkxVU0VTU0xfTEFTVAoKRGFuIEYgKDMwIEF1Z3VzdCAyMDA3KQotIFJlbmFtZWQgc2V2ZXJhbCBsaWJjdXJsIGVycm9yIGNvZGVzIGFuZCBvcHRpb25zIHRvIG1ha2UgdGhlbSBtb3JlIGdlbmVyYWwKICBhbmQgYWxsb3cgcmV1c2UgYnkgbXVsdGlwbGUgcHJvdG9jb2xzLiBTZXZlcmFsIHVudXNlZCBlcnJvciBjb2RlcyB3ZXJlCiAgcmVtb3ZlZC4gIEluIGFsbCBjYXNlcywgbWFjcm9zIHdlcmUgYWRkZWQgdG8gcHJlc2VydmUgc291cmNlIChhbmQgYmluYXJ5KQogIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIG5hbWVzLiAgVGhlc2UgbWFjcm9zIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgYXQKICBhIGZ1dHVyZSBkYXRlLCBidXQgcHJvYmFibHkgbm90IGJlZm9yZSAyMDA5LiAgQW4gYXBwbGljYXRpb24gY2FuIGJlCiAgdGVzdGVkIHRvIHNlZSBpZiBpdCBpcyB1c2luZyBhbnkgb2Jzb2xldGUgY29kZSBieSBjb21waWxpbmcgaXQgd2l0aCB0aGUKICBDVVJMX05PX09MRElFUyBtYWNybyBkZWZpbmVkLgoKICBUaGUgZm9sbG93aW5nIHVudXNlZCBlcnJvciBjb2RlcyB3ZXJlIHJlbW92ZWQ6CgogICAgQ1VSTEVfQkFEX0NBTExJTkdfT1JERVIKICAgIENVUkxFX0JBRF9QQVNTV09SRF9FTlRFUkVECiAgICBDVVJMRV9GVFBfQ0FOVF9SRUNPTk5FQ1QKICAgIENVUkxFX0ZUUF9DT1VMRE5UX0dFVF9TSVpFCiAgICBDVVJMRV9GVFBfQ09VTEROVF9TRVRfQVNDSUkKICAgIENVUkxFX0ZUUF9VU0VSX1BBU1NXT1JEX0lOQ09SUkVDVAogICAgQ1VSTEVfRlRQX1dFSVJEX1VTRVJfUkVQTFkKICAgIENVUkxFX0ZUUF9XUklURV9FUlJPUgogICAgQ1VSTEVfTElCUkFSWV9OT1RfRk9VTkQKICAgIENVUkxFX01BTEZPUk1BVF9VU0VSCiAgICBDVVJMRV9PQlNPTEVURQogICAgQ1VSTEVfU0hBUkVfSU5fVVNFCiAgICBDVVJMRV9VUkxfTUFMRk9STUFUX1VTRVIKCiAgVGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyB3ZXJlIHJlbmFtZWQ6CgogICAgQ1VSTEVfRlRQX0FDQ0VTU19ERU5JRUQgPT4gICAgICBDVVJMRV9SRU1PVEVfQUNDRVNTX0RFTklFRAogICAgQ1VSTEVfRlRQX0NPVUxETlRfU0VUX0JJTkFSWSA9PiBDVVJMRV9GVFBfQ09VTEROVF9TRVRfVFlQRQogICAgQ1VSTEVfRlRQX1NTTF9GQUlMRUQgPT4gICAgICAgICBDVVJMRV9VU0VfU1NMX0ZBSUxFRAogICAgQ1VSTEVfRlRQX1FVT1RFX0VSUk9SID0+ICAgICAgICBDVVJMRV9RVU9URV9FUlJPUgogICAgQ1VSTEVfVEZUUF9ESVNLRlVMTCA9PiAgICAgICAgICBDVVJMRV9SRU1PVEVfRElTS19GVUxMCiAgICBDVVJMRV9URlRQX0VYSVNUUyA9PiAgICAgICAgICAgIENVUkxFX1JFTU9URV9GSUxFX0VYSVNUUwogICAgQ1VSTEVfSFRUUF9SQU5HRV9FUlJPUiA9PiAgICAgICBDVVJMRV9SQU5HRV9FUlJPUiAKCiAgVGhlIGZvbGxvd2luZyBvcHRpb25zIHdlcmUgcmVuYW1lZDoKCiAgICBDVVJMT1BUX1NTTEtFWVBBU1NXRCA9PiBDVVJMT1BUX0tFWVBBU1NXRCAKICAgIENVUkxPUFRfRlRQQVBQRU5EID0+ICAgIENVUkxPUFRfQVBQRU5ECiAgICBDVVJMT1BUX0ZUUExJU1RPTkxZID0+ICBDVVJMT1BUX0RJUkxJU1RPTkxZCiAgICBDVVJMT1BUX0ZUUF9TU0wgPT4gICAgICBDVVJMT1BUX1VTRV9TU0wKCiAgQSBmZXcgbW9yZSBjaGFuZ2VzIHdpbGwgdGFrZSBwbGFjZSB3aXRoIHRoZSBuZXh0IFNPTkFNRSBidW1wIG9mIHRoZQogIGxpYnJhcnkuICBUaGVzZSBhcmUgZG9jdW1lbnRlZCBpbiBkb2NzL1RPRE8KCi0gRG9jdW1lbnRlZCBzb21lIG5ld2VyIGVycm9yIGNvZGVzIGluIGxpYmN1cmwtZXJyb3IoMykKCi0gQWRkZWQgbW9yZSBhY2N1cmF0ZSBlcnJvciBjb2RlIHJldHVybnMgZnJvbSBTRlRQIG9wZXJhdGlvbnMuICBBZGRlZCB0ZXN0CiAgY2FzZSA2MTUgdG8gdGVzdCBhbiBTRlRQIHVwbG9hZCBmYWlsdXJlLgoKRGFuIEYgKDI4IEF1Z3VzdCAyMDA3KQotIFNvbWUgbWlub3IgaW50ZXJuYWwgdHlwZSBhbmQgY29uc3QgY2hhbmdlcyBiYXNlZCBvbiBhIHNwbGludCBzY2FuLgoKRGFuaWVsIFMgKDI0IEF1Z3VzdCAyMDA3KQotIEJ1ZyByZXBvcnQgIzE3NzkwNTQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NzkwNTQpIHBvaW50ZWQKICBvdXQgdGhhdCBsaWJjdXJsIGRpZG4ndCBkZWFsIHdpdGggbGFyZ2UgcmVzcG9uc2VzIGZyb20gc2VydmVyIGNvbW1hbmRzLCB3aGVuCiAgdGhlIHNpbmdsZSByZXNwb25zZSB3YXMgY29uc2lzdGluZyBvZiBtdWx0aXBsZSBsaW5lcyBidXQgb2YgYSB0b3RhbCBzaXplIG9mCiAgMTZLQiBvciBtb3JlLiBEYW4gRmFuZHJpY2ggaW1wcm92ZWQgdGhlIGZ0cCB0ZXN0IHNjcmlwdCBhbmQgcHJvdmlkZWQgdGVzdAogIGNhc2UgMTAwNiB0byByZXBlYXQgdGhlIHByb2JsZW0sIGFuZCBJIGZpeGVkIHRoZSBjb2RlIHRvIG1ha2Ugc3VyZSB0aGlzIG5ldwogIHRlc3QgY2FzZSBydW5zIGZpbmUuCgpQYXRyaWNrIE0gKDIzIEF1Z3VzdCAyMDA3KQotIE9TLzQwMCBwb3J0OiBuZXcgZmlsZXMgbGliL2NvbmZpZy1vczQwMC5oIGxpYi9zZXR1cC1vczQwMC5oIHBhY2thZ2VzL09TNDAwLyouCiAgU2VlIHBhY2thZ2VzL09TNDAwL1JFQURNRS5PUzQwMC4KCkRhbmllbCBTICgyMyBBdWd1c3QgMjAwNykKLSBCdWcgcmVwb3J0ICMxNzc5NzUxIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc5NzUxKSBwb2ludGVkCiAgb3V0IHRoYXQgZG9pbmcgZmlyc3QgYSBmaWxlOi8vIHVwbG9hZCBhbmQgdGhlbiBhbiBGVFAgdXBsb2FkIGNyYXNoZWQgbGliY3VybAogIG9yIGF0IGJlc3QgY2F1c2VkIGZ1cmlvdXMgdmFsZ3JpbmQgY29tcGxhaW50cy4gRml4ZWQgbm93IQoKRGFuaWVsIFMgKDIyIEF1Z3VzdCAyMDA3KQotIEJ1ZyByZXBvcnQgIzE3NzkwNTQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NzkwNTQpIHBvaW50ZWQKICBvdXQgdGhhdCBsaWJjdXJsIGRpZG4ndCBkZWFsIHdpdGggdmVyeSBsb25nICg+MTZLKSBGVFAgc2VydmVyIHJlc3BvbnNlIGxpbmVzCiAgcHJvcGVybHkuIFN0YXJ0aW5nIG5vdywgbGliY3VybCB3aWxsIGNob3AgdGhlbSBvZmYgKHRodXMgdGhlIGNsaWVudCBhcHAgd2lsbAogIG5vdCBnZXQgdGhlIGZ1bGwgbGluZSkgYnV0IHN1cnZpdmUgYW5kIGRlYWwgd2l0aCB0aGVtIGZpbmUgb3RoZXJ3aXNlLiBUZXN0CiAgY2FzZSAxMDAzIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCBTICgyMCBBdWd1c3QgMjAwNykKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IENocmlzdGlhbiBWb2d0LCB0aGUgRlRQIGNvZGUgbm93IHNldHMgdGhlIHVwY29taW5nCiAgZG93bmxvYWQgdHJhbnNmZXIgc2l6ZSBtdWNoIGVhcmxpZXIgdG8gYmUgcG9zc2libGUgdG8gZ2V0IHJlYWQgd2l0aAogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGFzIHNvb24gYXMgcG9zc2libGUuIFRoaXMgaXMgdmVyeSBtdWNoIGluIGEKICBzaW1pbGFyIHNwaXJpdCB0byB0aGUgSFRUUCBzaXplIGNoYW5nZSBmcm9tIEF1Z3VzdCAxMSAyMDA3LgoKRGFuaWVsIFMgKDE4IEF1Z3VzdCAyMDA3KQotIFJvYnNvbiBCcmFnYSBBcmF1am8gZmlsZWQgYnVnIHJlcG9ydCAjMTc3NjIzMgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc2MjMyKSBhYm91dCBsaWJjdXJsIGNhbGxpbmcKICBDdXJsX2NsaWVudF93cml0ZSgpLCBwYXNzaW5nIG9uIGEgY29uc3Qgc3RyaW5nIHRoYXQgdGhlIGNhbGxlciBtYXkgbm90CiAgbW9kaWZ5IGFuZCB5ZXQgaXQgZG9lcyAob24gc29tZSBwbGF0Zm9ybXMpLgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NzYyMzUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3NjIzNSkgYWJvdXQgZnRwIHJlcXVlc3RzIHdpdGggTk9CT0RZCiAgb24gYSBkaXJlY3Rvcnkgd291bGQgZG8gYSAiU0laRSAobnVsbCkiIHJlcXVlc3QuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0ZXN0CiAgY2FzZSAxMDAwIHdhcyBhZGRlZCB0byB2ZXJpZnkuCgpEYW5pZWwgUyAoMTcgQXVndXN0IDIwMDcpCi0gU29uZyBNYSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgY3VyZXMgYSBwcm9ibGVtIGxpYmN1cmwgaGFzIHdoZW4gZG9pbmcgcmVzdW1lCiAgSFRUUCBQVVQgdXNpbmcgRGlnZXN0IGF1dGhlbnRpY2F0aW9uLiBUZXN0IGNhc2UgNTMyMCBhbmQgNTMyMiB3ZXJlIGFsc28KICBhZGRlZCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgpEYW5pZWwgUyAoMTQgQXVndXN0IDIwMDcpCi0gQW5kcmV3IFdhbnNpbmsgcHJvdmlkZWQgYW4gTlRMTSBidWdmaXg6IGluIHRoZSBjYXNlIHRoZSBzZXJ2ZXIgc2V0cyB0aGUgZmxhZwogIE5UTE1GTEFHX05FR09USUFURV9VTklDT0RFLCB3ZSBuZWVkIHRvIGZpbHRlciBpdCBvZmYgYmVjYXVzZSBsaWJjdXJsIGRvZXNuJ3QKICBVTklDT0RFIGVuY29kZSB0aGUgc3RyaW5ncyBpdCBwYWNrcyBpbnRvIHRoZSBOVExNIGF1dGhlbnRpY2F0ZSBwYWNrZXQuCgpEYW5pZWwgUyAoMTEgQXVndXN0IDIwMDcpCi0gQWxsZW4gUHVsc2lmZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgc2V0IHRoZSBleHBlY3RlZCBkb3dubG9hZAogIHNpemUgZWFybGllciB3aGVuIGRvaW5nIEhUVFAgZG93bmxvYWRzLCBzbyB0aGF0IGFwcGxpY2F0aW9ucyBhbmQgdGhlCiAgcHJvZ3Jlc3MgbWV0ZXIgZXRjIGtub3cgZ2V0IHRoZSBpbmZvIGVhcmxpZXIgaW4gdGhlIGZsb3cgdGhhbiBiZWZvcmUuCgotIFBhdHJpY2sgTW9ubmVyYXQgbW9kaWZpZWQgdGhlIExEQVAgY29kZSBhbmQgYXBwcm9hY2ggaW4gY3VybC4gU3RhcnRpbmcgbm93LAogIHRoZSBjb25maWd1cmUgc2NyaXB0IGNoZWNrcyBmb3Igb3BlbmxkYXAgYW5kIGZyaWVuZHMgYW5kIHdlIGxpbmsgd2l0aCB0aG9zZQogIGxpYnMganVzdCBsaWtlIHdlIGxpbmsgYWxsIG90aGVyIHRoaXJkIHBhcnR5IGxpYnJhcmllcywgYW5kIHdlIG5vIGxvbmdlcgogIGRsb3BlbigpIHRob3NlIGxpYnJhcmllcy4gT3VyIHByaXZhdGUgaGVhZGVyIGZpbGUgbGliL2xkYXAuaCB3YXMgcmVuYW1lZCB0bwogIGxpYi9jdXJsX2xkYXAuaCBkdWUgdG8gdGhpcy4gSSBzZXQgYSB0YWcgaW4gQ1ZTIChjdXJsLTdfMTdfMC1wcmVsZGFwZml4KQogIGp1c3QgYmVmb3JlIHRoaXMgY29tbWl0LCBqdXN0IGluIGNhc2UuCgpEYW4gRiAoOCBBdWd1c3QgMjAwNykKLSBTb25nIE1hIG5vdGVkIGEgemxpYiBtZW1vcnkgbGVhayBpbiB0aGUgaWxsZWdhbCBjb21wcmVzc2VkIGhlYWRlcgogIGNvdW50ZXJtZWFzdXJlcyBjb2RlIHBhdGguCgpEYW5pZWwgUyAoNCBBdWd1c3QgMjAwNykKLSBQYXRyaWNrIE1vbm5lcmF0IGZpeGVkIGN1cmxfZWFzeV9lc2NhcGUoKSBhbmQgY3VybHhfc3RydG9sbCgpIHRvIHdvcmsgb24KICBub24tQVNDSUkgc3lzdGVtcy4KCkRhbmllbCBTICgzIEF1Z3VzdCAyMDA3KQotIEkgY3V0IG91dCBzdXBwb3J0IGZvciBsaWJzc2gyIHZlcnNpb25zIG9sZGVyIHRoYW4gMC4xNiB0byBtYWtlIG91ciBjb2RlIGEKICBsb3Qgc2ltcGxlciwgYW5kIHRvIGF2b2lkIGdldHRpbmcgdHJvdWJsZSB3aXRoIHRoZSBMSUJTU0gyX0FQSU5PIGRlZmluZQogIHRoYXQgMSkgZGlkbid0IHdvcmsgcHJvcGVybHkgc2luY2UgaXQgd2FzID4zMiBiaXRzIGFuZCAyKSBpcyByZW1vdmVkIGluCiAgbGlic3NoMiAwLjE2Li4uCgpEYW5pZWwgUyAoMiBBdWd1c3QgMjAwNykKLSBTY290dCBDYW50b3IgZmlsZWQgYnVnIHJlcG9ydCAjMTc2NjMyMAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzY2MzIwKSBwb2ludGluZyBvdXQgdGhhdCB0aGUgbGliY3VybAogIGNvZGUgYWNjZXNzZWQgdHdvIGN1cmxfZWFzeV9zZXRvcHQoKSBvcHRpb25zIChDVVJMT1BUX0ROU19DQUNIRV9USU1FT1VUIGFuZAogIENVUkxPUFRfRE5TX1VTRV9HTE9CQUxfQ0FDSEUpIGFzIGludHMgZXZlbiB0aG91Z2ggdGhleSdyZSBkb2N1bWVudGVkIHRvIGJlCiAgcGFzc2VkIGluIGFzIGxvbmdzLCBhbmQgdGhhdCBtYWtlcyBhIGRpZmZlcmVuY2Ugb24gNjQgYml0IGFyY2hpdGVjdHVyZXMuCgotIERtaXRyaXkgU2VyZ2V5ZXYgcmVwb3J0ZWQgYSByZWdyZXNzaW9uOiByZXN1bWVkIGZpbGU6Ly8gdHJhbnNmZXJzIGJyb2tlCiAgYWZ0ZXIgNy4xNi4yLiBUaGlzIGlzIG11Y2ggZHVlIHRvIHRoZSBkaWZmZXJlbnQgdHJlYXRtZW50IGZpbGU6Ly8gZ2V0cwogIGludGVybmFsbHksIGJ1dCBub3cgSSBhZGRlZCB0ZXN0IDIzMSB0byBtYWtlIGl0IGxlc3MgbGlrZWx5IHRvIGhhcHBlbiBhZ2FpbgogIHdpdGhvdXQgdXMgbm90aWNpbmchCgpEYW5pZWwgUyAoMSBBdWd1c3QgMjAwNykKLSBQYXRyaWNrIE1vbm5lcmF0IGFuZCBJIG1vZGlmaWVkIGxpYmN1cmwgc28gdGhhdCBub3cgaXQgKmNvcGllcyogYWxsIHN0cmluZ3MKICBwYXNzZWQgdG8gaXQgd2l0aCBjdXJsX2Vhc3lfc2V0b3B0KCkhIFByZXZpb3VzbHkgaXQgaGFzIGFsd2F5cyBqdXN0IHJlZmVyZWQKICB0byB0aGUgZGF0YSwgZm9yY2luZyB0aGUgdXNlciB0byBrZWVwIHRoZSBkYXRhIGFyb3VuZCB1bnRpbCBsaWJjdXJsIGlzIGRvbmUKICB3aXRoIGl0LiBUaGF0IGlzIG5vdyBoaXN0b3J5IGFuZCBsaWJjdXJsIHdpbGwgaW5zdGVhZCBjbG9uZSB0aGUgZ2l2ZW4KICBzdHJpbmdzIGFuZCBrZWVwIHByaXZhdGUgY29waWVzLiBUaGlzIGlzIGFsc28gcGFydCBvZiBQYXRyaWNrIE1vbm5lcmF0J3MKICBPUy80MDAgcG9ydC4KCiAgRHVlIHRvIHRoaXMgYmVpbmcgYSBzb21ld2hhdCBpbnRlcmVzdGluZyBjaGFuZ2UgQVBJIHdpc2UsIEkndmUgZGVjaWRlZCB0bwogIGJ1bXAgdGhlIHZlcnNpb24gb2YgdGhlIHVwY29taW5nIHJlbGVhc2UgdG8gNy4xNy4wLiBPbGRlciBhcHBsaWNhdGlvbnMgd2lsbAogIG9mIGNvdXJzZSBub3Qgbm90aWNlIHRoaXMgY2hhbmdlIG5vciBkbyB0aGV5IGhhdmUgdG8gY2FyZSwgYnV0IG5ldwogIGFwcGxpY2F0aW9ucyBjYW4gYmUgd3JpdHRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLgoKLSBHcmVnIE1vcnNlIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIFBPU1RpbmcgdXNpbmcgQU5ZQVVUSCB0byBhIHNlcnZlcgogIHJlcXVpcmluZyBOVExNLCBhbmQgaGUgcHJvdmlkZWQgdGVzdCBjb2RlIGFuZCBhIHRlc3Qgc2VydmVyIGFuZCB3ZSB3b3JrZWQKICBvdXQgYSBidWcgZml4LiBXZSBmYWlsZWQgdG8gY291bnQgc2VudCBib2R5IGRhdGEgYXQgdGltZXMsIHdoaWNoIHRoZW4gY2F1c2VkCiAgaW50ZXJuYWwgY29uZnVzaW9ucyB3aGVuIGxpYmN1cmwgdHJpZWQgdG8gc2VuZCB0aGUgcmVzdCBvZiB0aGUgZGF0YSBpbiBvcmRlcgogIHRvIG1haW50YWluIHRoZSBzYW1lIGNvbm5lY3Rpb24gYWxpdmUuCgpEYW5pZWwgUyAoMzEgSnVseSAyMDA3KQotIFBldGVyIE8nR29ybWFuIHBvaW50ZWQgb3V0IChhbmQgZml4ZWQpIHRoYXQgdGhlIG5vbi1ibG9ja2luZyBjaGVjayBpbgogIGNvbmZpZ3VyZSBtYWRlIGxpYmN1cmwgdXNlIGJsb2NraW5nIHNvY2tldHMgb24gQUlYIDQgYW5kIDUsIHdoaWxlIHRoYXQKICB3YXNuJ3QgdGhlIGludGVudGlvbi4KCkRhbmllbCBTICgyOSBKdWx5IDIwMDcpCi0gSmF5ZXNoIEEgU2hhaCBmaWxlZCBidWcgcmVwb3J0ICMxNzU5NTQyCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NTk1NDIpIGlkZW50aWZ5aW5nIGEgcmF0aGVyIHNlcmlvdXMKICBwcm9ibGVtIHdpdGggRlRQUzogbGliY3VybCBjbG9zZWQgdGhlIGRhdGEgY29ubmVjdGlvbiBzb2NrZXQgYW5kIHRoZW4gbGF0ZXIKICBpbiB0aGUgZmxvdyBpdCB3b3VsZCBjYWxsIHRoZSBTU0wgbGF5ZXIgdG8gZG8gU1NMIHNodXRkb3duIHdoaWNoIHRoZW4gd291bGQKICB1c2UgYSBzb2NrZXQgdGhhdCBoYWQgYWxyZWFkeSBiZWVuIGNsb3NlZCAtIHNvIGlmIHRoZSBhcHBsaWNhdGlvbiBoYWQgb3BlbmVkCiAgYSBuZXcgb25lIGluIHRoZSBtZWFuIHRpbWUsIGxpYmN1cmwgY291bGQgc2VuZCBnaWJiZXJpc2ggdGhhdCB3YXkhIEkgd29ya2VkCiAgd2l0aCBHcmVnIFphdmVydG5payB0byBwcm9wZXJseSBkaWFnbm9zZSBhbmQgZml4IHRoaXMuIFRoZSBmaXggYWZmZWN0cyBjb2RlCiAgZm9yIGFsbCBTU0wgbGlicmFyaWVzIHdlIHN1cHBvcnQsIGJ1dCBpdCBoYXMgb25seSBiZWVuIHRydWx5IHZlcmlmaWVkIHRvCiAgd29yayBmaW5lIGZvciB0aGUgT3BlblNTTCB2ZXJzaW9uLiBUaGUgb3RoZXJzIGhhdmUgb25seSBiZWVuIGNvZGUgcmV2aWV3ZWQuCgpEYW5pZWwgUyAoMjMgSnVseSAyMDA3KQotIEltcGxlbWVudGVkIHRoZSBwYXJ0cyBvZiBQYXRyaWNrIE1vbm5lcmF0J3MgT1MvNDAwIHBhdGNoIHRoYXQgaW50cm9kdWNlcwogIHN1cHBvcnQgZm9yIHRoZSBPUy80MDAgU2VjdXJlIFNvY2tldHMgTGF5ZXIgbGlicmFyeS4KCkRhbiBGICgyMyBKdWx5IDIwMDcpCi0gSW1wbGVtZW50ZWQgb25seSB0aGUgcGFydHMgb2YgUGF0cmljayBNb25uZXJhdCdzIE9TLzQwMCBwYXRjaCB0aGF0IHJlbmFtZWQKICBzb21lIGZldyBpbnRlcm5hbCBpZGVudGlmaWVycyB0byBhdm9pZCBjb25mbGljdHMsIHdoaWNoIGNvdWxkIGJlIHVzZWZ1bCBvbgogIG90aGVyIHBsYXRmb3Jtcy4KCkRhbmllbCBTICgyMiBKdWx5IDIwMDcpCi0gSFRUUCBEaWdlc3QgYnVnIGZpeCBieSBDaHJpcyBGbGVyYWNrZXJzOgoKICBTY2VuYXJpbwoKICAtIFBlcmZvbWluZyBhIFBPU1QgcmVxdWVzdCB3aXRoIGJvZHkKICAtIFdpdGggYXV0aGVudGljYXRpb24gKG9ubHkgRGlnZXN0KQogIC0gUmUtdXNpbmcgYSBjb25uZWN0aW9uCgogIGxpYmN1cmwgd291bGQgc2VuZCBhIEhUVFAgUE9TVCB3aXRoIGFuIEF1dGhvcml6YXRpb24gaGVhZGVyIGJ1dCB3aXRob3V0CiAgYm9keS4gT3VyIHNlcnZlciB3b3VsZCByZXR1cm4gNDAwIEJhZCBSZXF1ZXN0IGluIHRoYXQgY2FzZSAoYmVjYXVzZQogIGF1dGhlbnRpY2F0aW9uIHBhc3NlZCwgYnV0IHRoZSBib2R5IHdhcyBlbXB0eSkuCgogIENhdXNlCgogIDEpIGh0dHBfZGlnZXN0LmMgLT4gQ3VybF9vdXRwdXRfZGlnZXN0CiAgLSBVcGRhdGVzIGFsbG9jcHRyLnVzZXJwd2QvYWxsb2NwdHIucHJveHl1c2VycHdkICpvbmx5KiBpZiBkLT5ub25jZSBpcwogIGZpbGxlZCBpbiAoYW5kIG5vIGVycm9ycykKICAtIGF1dGhwLT5kb25lID0gVFJVRSBpZiBkLT5ub25jZSBpcyBmaWxsZWQgaW4KICAyKSBodHRwLmMgLT4gQ3VybF9odHRwCiAgLSAqQWx3YXlzKiB1c2VzIGFsbG9jcHRyLnVzZXJwd2QvYWxsb2NwdHIucHJveHl1c2VycHdkIGlmIG5vdCBOVUxMCiAgMykgaHR0cC5jIC0+IEN1cmxfaHR0cCwgQ3VybF9odHRwX291dHB1dF9hdXRoCgogIFNvIHdoYXQgaGFwcGVucyBpcyB0aGF0IEN1cmxfb3V0cHV0X2RpZ2VzdCBjYW5ub3QgeWV0IHVwZGF0ZSB0aGUKICBBdXRob3JpemF0aW9uIGhlYWRlciAoYWxsb2NwdHIudXNlcnB3ZCkgd2hpY2ggcmVzdWx0cyBpbiBhdXRoaG9zdC0+ZG9uZT0wIC0+CiAgYXV0aGhvc3QtPm11bHRpPTEgLT4gY29ubi0+Yml0cy5hdXRobmVnID0gVFJVRS4gIFRoZSBib2R5IGlzIG5vdAogIGFkZGVkLiAqSG93ZXZlciosIGFsbG9jcHRyLnVzZXJwd2QgaXMgc3RpbGwgdXNlZCB3aGVuIGJ1aWxkaW5nIHRoZSByZXF1ZXN0CgotIEFkZGVkIHRlc3QgY2FzZSAzNTQgdGhhdCBtYWtlcyBhIHNpbXBsZSBGVFAgcmV0cmlldmFsIHdpdGhvdXQgcGFzc3dvcmQsIHdoaWNoCiAgdmVyaWZpZXMgdGhlIGJ1ZyBmaXggaW4gIzE3NTczMjguCgpEYW5pZWwgUyAoMjEgSnVseSAyMDA3KQotIFRvIGFsbG93IG1vcmUgZmxleGliaWxpdHkgaW4gRlRQIHRlc3QgY2FzZXMsIEkndmUgcmVtb3ZlZCB0aGUgZW5mb3JjZWQgc3RhdGVzCiAgZnJvbSB0aGUgdGVzdCBzZXJ2ZXIgY29kZSBhcyB0aGV5IHNlcnZlZCBubyByZWFsIHB1cnBvc2UuIFRoZSB0ZXN0IHNlcnZlcgogIGlzIGhlcmUgdG8gc2VydmUgZm9yIHRoZSB0ZXN0IGNhc2VzLCBub3QgdG8gYXR0ZW1wdCB0byBmdW5jdGlvbiBhcyBhIHJlYWwKICBzZXJ2ZXIhIFdoaWxlIGF0IGl0LCBJIG1vZGlmaWVkIHRlc3QgY2FzZSAxNDEgdG8gYmV0dGVyIHRlc3QgYW5kIHZlcmlmeQogIGN1cmwgLUkgb24gYSBzaW5nbGUgRlRQIGZpbGUuCgpEYW5pZWwgUyAoMjAgSnVseSAyMDA3KQotIEphbWVzIEhvdXNsZXkgZml4ZWQgdGhlIFNGVFAgUFdEIGNvbW1hbmQgdG8gd29yay4KCi0gUmFsZiBTLiBFbmdlbHNjaGFsbCBmaWxlZCBidWcgcmVwb3J0ICMxNzU3MzI4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NTczMjgpIGFuZCBzdWJtaXR0ZWQgYSBwYXRjaC4gSXQKICB0dXJucyBvdXQgd2UgYnJva2UgbG9naW4gdG8gRlRQIHNlcnZlcnMgdGhhdCBkb24ndCByZXF1aXJlIChub3IgdW5kZXJzdGFuZCkKICBQQVNTIGFmdGVyIHRoZSBVU0VSIGNvbW1hbmQuIFRoZSBicmVha2FnZSB3YXMgZG9uZSBhcyBwYXJ0IG9mIHRoZSBrcmI1CiAgY29tbWl0IHNvIGEga3JiLXVzaW5nIHBlcnNvbiBuZWVkcyB0byB2ZXJpZnkgdGhhdCB0aGUgY3VycmVudCB2ZXJzaW9uIG5vdwogIHdvcmtzIG9yIGlmIHdlIG5lZWQgdG8gZml4IGl0IChpbiBhIGRpZmZlcmVudCB3YXkgb2YgY291cnNlKS4KCkRhbiBGICgxNyBKdWx5IDIwMDcpCi0gRml4ZWQgdGVzdCBjYXNlcyA2MTMgYW5kIDYxNCBieSBpbXByb3ZpbmcgdGhlIGxvZyBwb3N0cHJvY2Vzc29yIHRvIGhhbmRsZQogIGEgbmV3IGRpcmVjdG9yeSBsaXN0aW5nIGZvcm1hdCB0aGF0IG5ld2VyIGxpYnNzaDIncyBjYW4gcHJvdmlkZS4gIFRoaXMKICBpcyBwcm9iYWJseSBOT1Qgc3VmZmljaWVudCB0byBoYW5kbGUgYWxsIGRpcmVjdG9yeSBsaXN0aW5nIGZvcm1hdHMgdGhhdAogIHNlcnZlcidzIGNhbiBwcm92aWRlLCBhbmQgc2hvdWxkIGJlIHJldmlzaXRlZC4KCkRhbmllbCBTICgxNyBKdWx5IDIwMDcpCi0gRGFuaWVsIEpvaG5zb24gZml4ZWQgYSBidWcgaW4gaG93IGxpYnNzaDJfc2Vzc2lvbl9sYXN0X2Vycm9yKCkgd2FzIHVzZWQsIGluCiAgdHdvIHBsYWNlcy4KCi0gSm9mZWxsIEdhbGxhcmRvIHBvc3RlZCBhIGxpYmN1cmwgbG9nIHVzaW5nIEZUUCB0aGF0IGV4cG9zZWQgYSBidWcgd2hpY2ggbWFkZQogIGEgY29udHJvbCBjb25uZWN0aW9uIHRoYXQgd2FzIGRlZW1lZCAiZGVhZCIgdG8geWV0IGJlIHJlLXVzZWQgaW4gYSBmb2xsb3dpbmcKICByZXF1ZXN0LgoKRGFuaWVsIFMgKDEzIEp1bHkgMjAwNykKLSBDb2xpbiBIb2diZW4gZmlsZWQgYnVnIHJlcG9ydCAjMTc1MDI3NAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzUwMjc0KSBhbmQgc3VibWl0dGVkIGEgcGF0Y2ggZm9yIHRoZQogIGNhc2Ugd2hlcmUgbGliY3VybCBkaWQgYSBjb25uZWN0IGF0dGVtcHQgdG8gYSBub24tbGlzdGVuaW5nIHBvcnQgYW5kIGRpZG4ndAogIHByb3ZpZGUgYSBodW1hbiByZWFkYWJsZSBlcnJvciBzdHJpbmcgYmFjay4KCi0gRGFuaWVsIENhdGVyIGZpeGVzOgogIDEgLSBtYWRlICdtYWtlIHZjOCcgd29yayBvbiB3aW5kb3dzLgogIDIgLSBtYWRlIGxpYmN1cmwgaXRzZWxmIGJ1aWx0IHdpdGggQ1VSTF9OT19PTERJRVMgZGVmaW5lZCAod2hpY2ggZG9lc24ndAogICAgICBkZWZpbmUgdGhlIHN5bWJvbHMgZm9yIGJhY2t3YXJkcyBzb3VyY2UgY29tcGF0aWJpbGl0eSkKICAzIC0gdXBkYXRlZCBsaWJjdXJsLWVycm9ycy4zCiAgNCAtIGFkZGVkIENVUkxfRElTQUJMRV9URlRQIHRvIGRvY3MvSU5TVEFMTAoKRGFuaWVsIFMgKDEyIEp1bHkgMjAwNykKLSBNYWRlIHRoZSBrcmI1IGNvZGUgYnVpbGQgd2l0aCBIZWltZGFsJ3MgR1NTQVBJIGxpYi4KCkRhbiBGICgxMiBKdWx5IDIwMDcpCi0gQ29tcGlsZSBtb3N0IG9mIHRoZSBleGFtcGxlIGFwcHMgaW4gZG9jcy9leGFtcGxlcyB3aGVuIGRvaW5nIGEgJ21ha2UgY2hlY2snLgogIEZpeGVkIHNvbWUgY29tcGlsZSB3YXJuaW5ncyBhbmQgZXJyb3JzIGluIHRob3NlIGV4YW1wbGVzLgoKLSBSZW1vdmVkIHRoZSBleGFtcGxlIHByb2dyYW0gZnRwM3JkcGFydHkuYyBzaW5jZSBsaWJjdXJsIGRvZXNuJ3Qgc3VwcG9ydAogIDNyZCBwYXJ0eSBGVFAgdHJhbnNmZXJzIGFueSBsb25nZXIuCgpEYW5pZWwgUyAoMTIgSnVseSAyMDA3KQotIFNobXVsaWsgUmVnZXYgZm91bmQgYW4gKGFsYmVpdCByYXJlKSBjYXNlIHdoZXJlIHRoZSBwcm94eSBDT05ORUNUIG9wZXJhdGlvbgogIGNvdWxkIGluIGZhY3QgZ2V0IHN0dWNrIGluIGFuIGVuZGxlc3MgbG9vcC4KCi0gTWFkZSBDVVJMT1BUX1NTTF9WRVJJRllIT1NUIHNldCB0byAxIGFjdHMgYXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uOgogIGZhaWwgdG8gY29ubmVjdCBpZiB0aGVyZSBpcyBubyBDb21tb24gTmFtZSBmaWVsZCBmb3VuZCBpbiB0aGUgcmVtb3RlIGNlcnQuCiAgV2Ugc2hvdWxkIGRlcHJlY2F0ZSB0aGUgc3VwcG9ydCBmb3IgdGhpcyBzZXQgdG8gMSBhbnl3YXkgc29vbiwgc2luY2UgdGhlCiAgZmVhdHVyZSBpcyBwb2ludGxlc3MgYW5kIG1vc3QgbGlrZWx5IG5ldmVyIHJlYWxseSB1c2VkIGJ5IGFueW9uZS4KCkRhbmllbCBTICgxMSBKdWx5IDIwMDcpCi0gU2htdWxpayBSZWdldiBmaXhlZCBhIGJ1ZyB3aXRoIHRyYW5zZmVyLWVuY29kaW5nIHNraXBwaW5nIGR1cmluZyB0aGUgNDA3CiAgZXJyb3IgcGFnZXMgZm9yIHByb3h5IGF1dGhlbnRpY2F0aW9uLgoKLSBHaWFuY2FybG8gRm9ybWljdWNjaWEgcmVwb3J0ZWQgYW5kIGZpeGVkIGEgcHJvYmxlbSB3aXRoIGEgY2xvc2VkIGNvbm5lY3Rpb24KICB0byBhIHByb3h5IGR1cmluZyBDT05ORUNUIGF1dGggbmVnb3RpYXRpb24uCgpEYW4gRiAoMTAgSnVseSAyMDA3KQotIEZpeGVkIGEgY3VybCBtZW1vcnkgbGVhayByZXBvcnRlZCBieSBTb25nIE1hIHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uCiAgb2YgdGhlIHBhdGNoIGhlIHN1Z2dlc3RlZC4gIEFkZGVkIGhpcyB0ZXN0IGNhc2UgYXMgdGVzdDI4OSB0byB2ZXJpZnkuCgotIEZvcmNlIHRoZSB0aW1lIHpvbmUgdG8gR01UIGluIHRoZSBjb29raWUgdGVzdHMgaW4gY2FzZSB0aGUgdXNlciBpcwogIHVzaW5nIG9uZSBvZiB0aGUgc28tY2FsbGVkICdyaWdodCcgdGltZSB6b25lcyB0aGF0IHRha2UgaW50byBhY2NvdW50CiAgbGVhcCBzZWNvbmRzLCB3aGljaCBjYXVzZXMgdGhlIHRlc3RzIHRvIGZhaWwgKGFzIHJlcG9ydGVkIGJ5CiAgRGFuaWVsIEJsYWNrIGluIGJ1ZyByZXBvcnQgIzE3NDU5NjQpLgoKVmVyc2lvbiA3LjE2LjQgKDEwIEp1bHkgMjAwNykKCkRhbmllbCBTICgxMCBKdWx5IDIwMDcpCi0gS2VlcyBDb29rIG5vdGlmaWVkIHVzIGFib3V0IGEgc2VjdXJpdHkgZmxhdwogIChodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvYWR2XzIwMDcwNzEwLmh0bWwpIGluIHdoaWNoIGxpYmN1cmwgZmFpbGVkIHRvCiAgcHJvcGVybHkgcmVqZWN0IHNvbWUgb3V0ZGF0ZWQgb3Igbm90IHlldCB2YWxpZCBzZXJ2ZXIgY2VydGlmaWNhdGVzIHdoZW4KICBidWlsdCB3aXRoIEdudVRMUy4gS2VlcyBhbHNvIHByb3ZpZGVkIHRoZSBwYXRjaC4KCkphbWVzIEggKDUgSnVseSAyMDA3KQotIEdhdnJpZSBQaGlsaXBzb24gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IHdpbGwgdXNlIGEgbW9yZSBzcGVjaWZpYyBlcnJvcgogIG1lc3NhZ2UgZm9yIGFuIHNjcDovLyB1cGxvYWQgZmFpbHVyZS4gIElmIGxpYnNzaDIgaGFzIGhpcyBtYXRjaGluZwogIHBhdGNoLCB0aGVuIHRoZSBlcnJvciBtZXNzYWdlIHJldHVybiBieSB0aGUgc2VydmVyIHdpbGwgYmUgdXNlZCBpbnN0ZWFkCiAgb2YgYSBtb3JlIGdlbmVyaWMgZXJyb3IuCgpEYW5pZWwgUyAoMSBKdWx5IDIwMDcpCi0gVGhvbWFzIEouIE1vb3JlIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIEtlcmJlcm9zNSBzdXBwb3J0IGluCiAgbGliY3VybC4gVGhpcyBhbHNvIG1ha2VzIHRoZSBvcHRpb25zIGNoYW5nZSBuYW1lIHRvIC0ta3JiIChmcm9tIC0ta3JiNCkgYW5kCiAgQ1VSTE9QVF9LUkJMRVZFTCAoZnJvbSBDVVJMT1BUX0tSQjRMRVZFTCkgYnV0IHRoZSBvbGQgbmFtZXMgYXJlIHN0aWxsIAoKLSBTb25nIE1hIGhlbHBlZCBtZSB2ZXJpZnkgYW5kIGV4dGVuZCBhIGZpeCBmb3IgZG9pbmcgRlRQIG92ZXIgYSBTT0NLUzQvNQogIHByb3h5LgoKRGFuaWVsIFMgKDI3IEp1bmUgMjAwNykKLSBKYW1lcyBIb3VzbGV5OiBBZGQgdHdvIG5ldyBvcHRpb25zIGZvciB0aGUgU0ZUUC9TQ1AvRklMRSBwcm90b2NvbHM6CiAgQ1VSTE9QVF9ORVdfRklMRV9QRVJNUyBhbmQgQ1VSTE9QVF9ORVdfRElSRUNUT1JZX1BFUk1TLiBUaGVzZSBjb250cm9sIHRoZQogIHByZW1pc3Npb25zIGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgY3JlYXRlZCBvbiB0aGUgcmVtb3RlCiAgc2VydmVyLiBDVVJMT1BUX05FV19GSUxFX1BFUk1TIGRlZmF1bHRzIHRvIDA2NDQgYW5kCiAgQ1VSTE9QVF9ORVdfRElSRUNUT1JZX1BFUk1TIGRlZmF1bHRzIHRvIDA3NTUKCi0gSSBjb3JyZWN0ZWQgdGhlIDEwLWF0LWEtdGltZS5jIGV4YW1wbGUgYW5kIGFwcGxpZWQgYSBwYXRjaCBmb3IgaXQgYnkgSmFtZXMKICBCdXJzYS4KCkRhbmllbCBTICgyNiBKdW5lIDIwMDcpCi0gUm9iZXJ0IElha29iYXNodmlsaSByZS1hcnJhbmdlZCB0aGUgaW50ZXJuYWwgaGFzaCBjb2RlIHRvIHdvcmsgd2l0aCBhIGN1c3RvbQogIGhhc2ggZnVuY3Rpb24gZm9yIGRpZmZlcmVudCBoYXNoZXMsIGFuZCBhbHNvIGV4cGFuZGVkIHRoZSBkZWZhdWx0IHNpemUgZm9yCiAgdGhlIHNvY2tldCBoYXNoIHRhYmxlIHVzZWQgaW4gbXVsdGkgaGFuZGxlcyB0byBncmVhdGx5IGVuaGFuY2Ugc3BlZWQgd2hlbgogIHZlcnkgbWFueSBjb25uZWN0aW9ucyBhcmUgYWRkZWQgYW5kIHRoZSBzb2NrZXQgQVBJIGlzIHVzZWQuCgotIEphbWVzIEhvdXNsZXkgbWFkZSB0aGUgQ1VSTE9QVF9GVFBMSVNUT05MWSBtb2RlIHdvcmsgZm9yIFNGVFAgZGlyZWN0b3J5CiAgbGlzdGluZ3MgYXMgd2VsbAoKRGFuaWVsIFMgKDI1IEp1bmUgMjAwNykKLSBBZGp1c3RlZCBob3cgbGliY3VybCB0cmVhdHMgSFRUUCAxLjEgcmVzcG9uc2VzIHdpdGhvdXQgY29udGVudC1sZW50aCBvcgogIGNodW5rZWQgZW5jb2RpbmcgKHRoYXQgYWxzbyBsYWNrcyAiQ29ubmVjdGlvbjogY2xvc2UiKS4gSXQgbm93IHNpbXBseQogIGFzc3VtZXMgdGhhdCB0aGUgY29ubmVjdGlvbiBXSUxMIGJlIGNsb3NlZCB0byBzaWduYWwgdGhlIGVuZCwgYXMgdGhhdCBpcyBob3cKICBSRkMyNjE2IHNlY3Rpb24gNC40IHBvaW50ICM1IHNheXMgd2Ugc2hvdWxkIGJlaGF2ZS4KICAKVmVyc2lvbiA3LjE2LjMgKDI1IEp1bmUgMjAwNykKCkRhbmllbCBTICgyMyBKdW5lIDIwMDcpCi0gQXMgcmVwb3J0ZWQgYnkgIlRybyIgaW4gaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTA2LzAxNjEuaHRtbCBhbmQKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDctMDYvMDIzOC5odG1sLCBsaWJjdXJsIGRpZG4ndCBwcm9wZXJseSBkbwogIG5vLWJvZHkgcmVxdWVzdHMgb24gRlRQIGZpbGVzIG9uIHJlLXVzZWQgY29ubmVjdGlvbnMgcHJvcGVybHksIG9yIGF0IGxlYXN0CiAgaXQgZGlkbid0IHByb3ZpZGUgdGhlIGluZm8gYmFjayBpbiB0aGUgaGVhZGVyIGNhbGxiYWNrIHByb3Blcmx5IGluIHRoZQogIHN1YnNlcXVlbnQgcmVxdWVzdHMuCgpEYW5pZWwgUyAoMjEgSnVuZSAyMDA3KQotIEdlcnJpdCBCcnVjaGjkdXNlciBwb2ludGVkIG91dCBhIHdhcm5pbmcgdGhhdCB0aGUgSW50ZWwoUikgVGhyZWFkIENoZWNrZXIKICB0b29sIHJlcG9ydHMgYW5kIGl0IHdhcyBpbmRlZWQgYSBsZWdpdGltYXRlIG9uZSBhbmQgaXQgaXMgb25lIGZpeGVkLiBJdCB3YXMKICBhIHVzZSBvZiBhIHNoYXJlIHdpdGhvdXQgZG9pbmcgdGhlIHByb3BlciBsb2NraW5nIGZpcnN0LgogIApEYW5pZWwgUyAoMjAgSnVuZSAyMDA3KQotIEFkYW0gUGlnZ290dCBmaWxlZCBidWcgcmVwb3J0ICMxNzQwMjYzCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NDAyNjMpLiBBZGFtIGRpc2NvdmVyZWQgdGhhdCB3aGVuCiAgZ2V0dGluZyBhIGxhcmdlIGFtb3VudCBvZiBVUkxzIHdpdGggY3VybCwgdGhleSB3ZXJlIGZldGNoZWQgc2xvd2VyIGFuZAogIHNsb3dlci4uLiB3aGljaCB0dXJuZWQgb3V0IHRvIGJlIGJlY2F1c2UgdGhlIC0tbGliY3VybCBkYXRhIGNvbGxlY3Rpbmcgd2hpY2gKICB3cm9uZ2x5IGFsd2F5cyB3YXMgZW5hYmxlZCwgYnV0IG5vIGxvbmdlciBpcy4uLgoKRGFuaWVsIFMgKDE4IEp1bmUgMjAwNykKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIGZpbGVkIGJ1ZyByZXBvcnQgIzE3MzkxMDAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTczOTEwMCkgdGhhdCBtZW50aW9uZWQgdGhhdCBsaWJjdXJsCiAgY291bGQgbm90IGFjdHVhbGx5IGxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSByb290IGRpcmVjdG9yeSBvZiBhIGdpdmVuIEZUUAogIHNlcnZlciBpZiB0aGUgbG9naW4gZGlyZWN0b3J5IGlzbid0IHJvb3QuIEkgZml4ZWQgdGhlIHByb2JsZW0gYW5kIGFkZGVkCiAgdGhyZWUgdGVzdCBjYXNlcyAob25lIGlzIGRpc2FibGVkIGZvciBub3cgc2luY2UgSSBpZGVudGlmaWVkIEtOT1dOX0JVR1MgIzQ0LAogIHdlIGNhbm5vdCB1c2UgLS1mdHAtbWV0aG9kIG5vY3dkIGFuZCBsaXN0IGZ0cCBkaXJlY3RvcmllcykuCgpEYW5pZWwgUyAoMTQgSnVuZSAyMDA3KQotIFNobXVsaWsgUmVnZXY6CgogIEkndmUgZW5jb3VudGVyZWQgKGFuZCBob3BlZnVsbHkgZml4ZWQpIGEgcHJvYmxlbSBpbnZvbHZpbmcgcHJveHkgQ09OTkVDVAogIHJlcXVlc3RzIGFuZCBlYXN5IGhhbmRsZXMgc3RhdGUgbWFuYWdlbWVudC4gVGhlIHByb2JsZW0gaXNuJ3Qgc2ltcGxlIHRvCiAgcmVwcm9kdWNlIHNpbmNlIGl0IGRlcGVuZHMgb24gc29ja2V0IHN0YXRlLiBJdCBvbmx5IG1hbmlmZXN0cyBpdHNlbGYgd2hlbgogIHdvcmtpbmcgd2l0aCBub24tYmxvY2tpbmcgc29ja2V0cy4KCiAgSGVyZSBpcyB0aGUgc2NlbmFyaW86CgogIDEuIGluIG11bHRpX3J1bnNpbmdsZSB0aGUgZWFzeSBoYW5kbGUgaXMgaW4gdGhlIENVUkxNX1NUQVRFX1dBSVRDT05ORUNUIGFuZAogIGNhbGxzIEN1cmxfcHJvdG9jb2xfY29ubmVjdAoKICAyLiBpbiBDdXJsX3Byb3h5Q09OTkVDVCwgbGluZSAxMjQ3LCBpZiB0aGUgc29ja2V0IGlzbid0IHJlYWR5IHRoZSBmdW5jdGlvbgogIHJldHVybnMgYW5kIGNvbm4tPmJpdHMudHVubmVsX2Nvbm5lY3RpbmcgaXMgVFJVRQoKICAzLiB3aGVuIHRoZSBjYWxsIHRvIEN1cmxfcHJvdG9jb2xfY29ubmVjdCByZXR1cm5zIHRoZSBwcm90b2NvbF9jb25uZWN0IGZsYWcKICBpcyBmYWxzZSBhbmQgdGhlIGVhc3kgc3RhdGUgaXMgY2hhbmdlZCB0byBDVVJMTV9TVEFURV9QUk9UT0NPTk5FQ1Qgd2hpY2gKICBpc24ndCBjb3JyZWN0IGlmIGEgcHJveHkgaXMgdXNlZC4gIFJhdGhlciBDVVJMTV9TVEFURV9XQUlUUFJPWFlDT05ORUNUCiAgc2hvdWxkIGJlIHVzZWQuCgogIEkgZGlzY292ZXJlZCB0aGlzIHdoaWxlIHBlcmZvcm1pbmcgYW4gSFRUUFMgcmVxdWVzdCB0aHJvdWdoIGEgcHJveHkgKHNxdWlkKQogIG9uIG15IGxvY2FsIG5ldHdvcmsuIFRoZSBwcm9ibGVtIGNhdXNlZCBvcGVuc3NsIHRvIGZhaWwgYXMgaXQgcmVhZCB0aGUgcHJveHkKICByZXNwb25zZSB0byB0aGUgQ09OTkVDVCBjYWxsICgnSFRUUC8xLjAgRXN0YWJsaXNoZWQnKSByYXRoZXIgdGhhbiB0aGUgU1NMCiAgaGFuZHNoYWtlICh0aGUgZXhhY3Qgb3BlbnNzbCBlcnJvciB3YXMgJ3dyb25nIHNzbCB2ZXJzaW9uJyBidXQgdGhpcyBpc24ndAogIHZlcnkgaW1wb3J0YW50KQoKLSBEYXZlIFZhc2lsZXZza3kgZmlsZWQgYnVnIHJlcG9ydCAjMTczNjg3NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzM2ODc1KSBhbG1vc3Qgc2ltdWx0YW5vdWVzbHkgYXMgRGFuCiAgRmFuZHJpY2ggbWVudGlvbmVkIGEgcmVsYXRlZCBidWlsZCBwcm9ibGVtIG9uIHRoZSBsaWJjdXJsIG1haWxpbmcgbGlzdDoKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDctMDYvMDEzMS5odG1sLiBCb3RoIHByb2JsZW1zIGhhZCB0aGUgc2FtZQogIHJlYXNvbjogdGhlIGRlZmluaXRpb25zIG9mIHRoZSBQT0xMKiBkZWZpbmVzIGFuZCB0aGUgcG9sbGZkIHN0cnVjdCBpbiB0aGUKICBsaWJjdXJsIGNvZGUgd2FzIGRlcGVuZGluZyBvbiBIQVZFX1BPTEwgaW5zdGVhZCBvZiBIQVZFX1NZU19QT0xMX0guCgpEYW5pZWwgUyAoMTMgSnVuZSAyMDA3KQotIFRvbSBSZWduZXIgcHJvdmlkZWQgYSBwYXRjaCBhbmQgd29ya2VkIHRvZ2V0aGVyIHdpdGggSmFtZXMgSG91c2xleSwgc28gbm93CiAgQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUyB3b3JrcyBmb3IgU0ZUUCBjb25uZWN0aW9ucyBhcyB3ZWxsIGFzIEZUUAogIG9uZXMuCgotIFJpY2ggUmF1ZW56YWhuIGZpbGVkIGJ1ZyByZXBvcnQgIzE3MzMxMTkKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTczMzExOSkgYW5kIHdlIGNvbGxhYm9yYXRlZCBvbiB0aGUKICBmaXguICBUaGUgcHJvYmxlbSBpcyB0aGF0IGZvciA2NGJpdCBIUFVYIGJ1aWxkcywgc2V2ZXJhbCBzb2NrZXQtcmVsYXRlZAogIGZ1bmN0aW9ucyB3b3VsZCBzdGlsbCBhc3N1bWUgaW50ICgzMiBiaXQpIGFyZ3VtZW50cyBhbmQgbm90IHNvY2tsZW5fdCAoNjQKICBiaXQpIG9uZXMuCgpEYW5pZWwgUyAoMTIgSnVuZSAyMDA3KQotIEphbWVzIEhvdXNsZXkgYnJvdWdodCBoaXMgcmV2YW1wZWQgU1NIIGNvZGUgdGhhdCBpcyBzdGF0ZS1tYWNoaW5lIGRyaXZlbiB0bwogIHJlYWxseSB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbm93IHRvdGFsbHkgbm9uLWJsb2NraW5nIGxpYnNzaDIgKGluIENWUykuCgpEYW4gRiAoOCBKdW5lIDIwMDcpCi0gSW5jb3Jwb3JhdGVkIERhbmllbCBCbGFjaydzIHRlc3Q3MDYgYW5kIHRlc3Q3MDcgU09DS1MgdGVzdCBjYXNlcy4KCi0gRml4ZWQgYSBmZXcgcHJvYmxlbXMgd2hlbiBzdGFydGluZyB0aGUgU09DS1Mgc2VydmVyLgoKLSBSZXZlcnRlZCBzb21lIHJlY2VudCBjaGFuZ2VzIHRvIHJ1bnRlc3RzLnBsIHRoYXQgd2VyZW4ndCBjb21wYXRpYmxlIHdpdGgKICBwZXJsIDUuMC4KCi0gRml4ZWQgdGhlIHRlc3QgaGFybmVzcyBzbyB0aGF0IGl0IGFjdHVhbGx5IGtpbGxzIHRoZSBzc2ggYmVpbmcgdXNlZCBhcwogIHRoZSBTT0NLUyBzZXJ2ZXIuCgpEYW5pZWwgUyAoNiBKdW5lIDIwMDcpCi0gLXMvLS1zaWxlbnQgY2FuIG5vdyBiZSB1c2VkIHRvIHRvZ2dsZSBvZmYgdGhlIHNpbGVuY2UgYWdhaW4gaWYgdXNlZCBhIHNlY29uZAogIHRpbWUuCgpEYW5pZWwgUyAoNSBKdW5lIDIwMDcpCi0gQWRkZWQgRGFuaWVsIEJsYWNrJ3Mgd29yayB0aGF0IGFkZHMgdGhlIGZpcnN0IGZldyBTT0NLUyB0ZXN0IGNhc2VzLiBJIGFsc28KICBmaXhlZCB0d28gbWlub3IgU09DS1MgcHJvYmxlbXMgdG8gbWFrZSB0aGUgdGVzdCBjYXNlcyBydW4gZmluZS4KCkRhbmllbCBTICgzMSBNYXkgMjAwNykKLSBGZW5nIFR1IG1hZGUgKGxpYiljdXJsIHN1cHBvcnQgInVwbG9hZCIgcmVzdW1pbmcgd29yayBmb3IgZmlsZTovLyBVUkxzLgoKRGFuaWVsIFMgKDMwIE1heSAyMDA3KQotIEkgbW9kaWZpZWQgdGhlIDEwLWF0LWEtdGltZS5jIGV4YW1wbGUgdG8gdHJhbnNmZXIgNTAwIGRvd25sb2FkcyBpbiBwYXJhbGxlbAogIHdpdGggYSBjLWFyZXMgZW5hYmxlZCBidWlsZCBvbmx5IHRvIGZpbmQgdGhhdCBpdCBjcmFzaGVkIG1pc2VyYWJseSwgYW5kIHRoaXMKICB3YXMgZHVlIHRvIHNvbWUgc2VsZWN0KClpc21zIGxlZnQgaW4gdGhlIGNvZGUuIFRoaXMgd2FzIGR1ZSB0byBBUEkKICByZXN0cmljdGlvbnMgaW4gYy1hcmVzIDEuMy54LCBidXQgd2l0aCB0aGUgdXBjb21pbmcgYy1hcmVzIDEuNC4wIHRoaXMgaXMgbm8KICBsb25nZXIgdGhlIGNhc2Ugc28gbm93IGxpYmN1cmwgcnVucyBtdWNoIGJldHRlciB3aXRoIGMtYXJlcyBhbmQgdGhlIG11bHRpCiAgaW50ZXJmYWNlIHdpdGggPiAxMDI0IGZpbGUgZGVzY3JpcHRvcnMgaW4gdXNlLgoKICBFeHRyYSBub3RlOiBzdGFydGluZyBub3cgd2UgcmVxdWlyZSBjLWFyZXMgMS40LjAgZm9yIGFzeW5jaHJvbm91cyBuYW1lCiAgcmVzb2x2ZXMuCgotIEFkZGVkIENVUkxNT1BUX01BWENPTk5FQ1RTIHdoaWNoIGlzIGEgY3VybF9tdWx0aV9zZXRvcHQoKSBvcHRpb24gZm9yIHNldHRpbmcKICB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjb25uZWN0aW9uIGNhY2hlIG1heGltdW0gc2l6ZSBvZiB0aGUgbXVsdGkgaGFuZGxlLgoKRGFuaWVsIFMgKDI3IE1heSAyMDA3KQotIFdoZW4gd29ya2luZyB3aXRoIGEgcHJvYmxlbSBTdGVmYW4gQmVja2VyIGhhZCwgSSBmb3VuZCBhbiBvZmYtYnktb25lIGJ1ZmZlcgogIG92ZXJ3cml0ZSBpbiBDdXJsX3NlbGVjdCgpLiBXaGlsZSBmaXhpbmcgaXQsIEkgYWxzbyBpbXByb3ZlZCBpdHMgcGVyZm9ybWFuY2UKICBzb21ld2hhdCBieSBjaGFuZ2luZyBjYWxsb2MgdG8gbWFsbG9jIGFuZCBicmVha2luZyBvdXQgb2YgYSBsb29wIGVhcmxpZXIKICAod2hlbiBwb3NzaWJsZSkuCgpEYW5pZWwgUyAoMjUgTWF5IDIwMDcpCi0gUm9iIENyaXR0ZW5kZW4gZml4ZWQgYnVnICMxNzA1ODAyCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MDU4MDIpLCB3aGljaCB3YXMgZmlsZWQgYnkgRGFuaWVsCiAgQmxhY2sgaWRlbnRpZnlpbmcgc2V2ZXJhbCBGVFAtU1NMIHRlc3QgY2FzZXMgZmFpbCB3aGVuIHdlIGJ1aWxkIGxpYmN1cmwgd2l0aAogIE5TUyBmb3IgVExTL1NTTC4gTGlzdGVkIGFzICM0MiBpbiBLTk9XTl9CVUdTLgoKRGFuaWVsIFMgKDI0IE1heSAyMDA3KQotIFNvbmcgTWEgZmlsZWQgYnVnIHJlcG9ydCAjMTcyNDAxNgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzI0MDE2KSBub3RpY2luZyB0aGF0IGRvd25sb2FkaW5nCiAgZ2xvYi1yYW5nZXMgZm9yIFRGVFAgd2FzIGJyb2tlbiBpbiBDVlMuIEZpeGVkIG5vdy4KICAKLSAnbXl0eCcgaW4gYnVnIHJlcG9ydCAjMTcyMzE5NCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcyMzE5NCkKICBwb2ludGVkIG91dCB0aGF0IHRoZSB3YXJuZigpIGZ1bmN0aW9uIGluIHRoZSBjdXJsIHRvb2wgZGlkbid0IHByb3Blcmx5IGRlYWwKICB3aXRoIHRoZSBjYXNlcyB3aGVuIGV4Y2Vzc2l2ZWx5IGxvbmcgd29yZHMgd2VyZSB1c2VkIGluIHRoZSBzdHJpbmcgdG8gY2hvcAogIHVwLgoKRGFuaWVsIFMgKDIyIE1heSAyMDA3KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZml4ZWQgYSBtZW1vcnkgbGVhayBpbiB0aGUgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyB0aGUKICBwZWVyJ3MgbmFtZSBpbiB0aGUgU1NMIGNlcnRpZmljYXRlIHdoZW4gYnVpbHQgZm9yIE9wZW5TU0wuIFRoZSBsZWFrIGhhcHBlbnMKICBmb3IgbGliY3VybHMgd2l0aCBDVVJMX0RPRVNfQ09OVkVSU0lPTlMgZW5hYmxlZCB0aGF0IGZhaWwgdG8gY29udmVydCB0aGUgQ04KICBuYW1lIGZyb20gVVRGOC4gSGUgYWxzbyBmaXhlZCBhIGxlYWsgd2hlbiBQS0NTICMxMiBwYXJzaW5nIGZhaWxlZC4KCkRhbmllbCBTICgxOCBNYXkgMjAwNykKLSBGZW5nIFR1IHJlcG9ydGVkIHRoYXQgY3VybCAtdyBkaWQgd3Jvbmcgb24gVEZUUCB0cmFuc2ZlcnMgaW4gYnVnIHJlcG9ydAogICMxNzE1Mzk0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzE1Mzk0KSwgYW5kIHRoZQogIHRyYW5zZmVyLXJlbGF0ZWQgaW5mbyAidmFyaWFibGVzIiB3ZXJlIGluZGVlZCBvdmVyd3JpdHRlbiB3aXRoIHplcm9lcwogIHdyb25nbHkgYW5kIGhhdmUgbm93IGJlZW4gYWRqdXN0ZWQuIFRoZSB1cGxvYWQgc2l6ZSBzdGlsbCBpc24ndCBhY2N1cmF0ZS4KCkRhbmllbCBTICgxNyBNYXkgMjAwNykKLSBGZW5nIFR1IHBvaW50ZWQgb3V0IGEgZGl2aXNpb24gYnkgemVybyBlcnJvciBpbiB0aGUgVEZUUCBjb25uZWN0IHRpbWVvdXQKICBjb2RlIGZvciB0aW1lb3V0cyBsZXNzIHRoYW4gZml2ZSBzZWNvbmRzLCBhbmQgYWxzbyBwcm92aWRlZCBhIGZpeCBmb3IgaXQuCiAgQnVnIHJlcG9ydCAjMTcxNTM5MiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcxNTM5MikKCkRhbiBGICgxNiBNYXkgMjAwNykKLSBBZGRlZCBzdXBwb3J0IGZvciBjb21waWxpbmcgdW5kZXIgTWluaXggMy4xLjMgdXNpbmcgQUNLLgoKRGFuIEYgKDE0IE1heSAyMDA3KQotIEFkZGVkIFNGVFAgZGlyZWN0b3J5IGxpc3RpbmcgdGVzdCBjYXNlIDYxMy4KCi0gQWRkZWQgc3VwcG9ydCBmb3IgcXVvdGUgY29tbWFuZHMgYmVmb3JlIGEgdHJhbnNmZXIgdXNpbmcgU0ZUUCBhbmQgdGVzdAogIGNhc2UgNjE0LgoKLSBDaGFuZ2VkIHRoZSBwb3N0LXF1b3RlIGNvbW1hbmRzIHRvIG9jY3VyIGFmdGVyIHRoZSB0cmFuc2ZlcnJlZCBmaWxlIGlzCiAgY2xvc2VkLgoKLSBBbGxvdyBTRlRQIHF1b3RlIGNvbW1hbmRzIGNobW9kLCBjaG93biwgY2hncnAgdG8gc2V0IGEgdmFsdWUgb2YgMC4KCkRhbiBGICg5IE1heSAyMDA3KQotIEtyaXN0aWFuIEd1bnN0b25lIGZpeGVkIGEgcHJvYmxlbSB3aGVyZSBvdmVyd3JpdGluZyBhbiB1cGxvYWRlZCBmaWxlIHdpdGgKICBzZnRwIGRpZG4ndCB0cnVuY2F0ZSBpdCBmaXJzdCwgd2hpY2ggd291bGQgY29ycnVwdCB0aGUgZmlsZSBpZiB0aGUgbmV3CiAgZmlsZSB3YXMgc2hvcnRlciB0aGFuIHRoZSBvbGQuCgpEYW4gRiAoOCBNYXkgMjAwNykKLSBBZGRlZCBGVFBTIHRlc3QgY2FzZXMgNDA2IGFuZCA0MDcKCkRhbmllbCBTICg4IE1heSAyMDA3KQotIENVUkxFX0ZUUF9DT1VMRE5UX1NUT1JfRklMRSBpcyBub3cga25vd24gYXMgQ1VSTEVfVVBMT0FEX0ZBSUxFRC4gVGhpcyBpcwogIGJlY2F1c2UgSSBqdXN0IG1hZGUgU0NQIHVwbG9hZHMgcmV0dXJuIHRoaXMgdmFsdWUgaWYgdGhlIGZpbGUgc2l6ZSBvZgogIHRoZSB1cGxvYWQgZmlsZSBpc24ndCBnaXZlbiB3aXRoIENVUkxPUFRfSU5GSUxFU0laRSouIERvY3MgdXBkYXRlZCB0bwogIHJlZmxlY3QgdGhpcyBuZXdzLCBhbmQgYSBkZWZpbmUgZm9yIHRoZSBvbGQgbmFtZSB3YXMgYWRkZWQgdG8gdGhlIHB1YmxpYwogIGhlYWRlciBmaWxlLgoKRGFuaWVsIFMgKDcgTWF5IDIwMDcpCi0gSmFtZXMgQnVyc2EgZml4ZWQgYSBidWcgaW4gdGhlIG11bHRpIGhhbmRsZSBjb2RlIHRoYXQgbWFkZSB0aGUgY29ubmVjdGlvbgogIGNhY2hlIGdyb3cgYSBiaXQgdG9vIG11Y2gsIGJleW9uZCB0aGUgbm9ybWFsIDQgKiBlYXN5X2hhbmRsZXMuCgpEYW5pZWwgUyAoMiBNYXkgMjAwNykKLSBBbmRlcnMgR3VzdGFmc3NvbiByZW1hcmtlZCB0aGF0IHJlcXVpcmluZyBDVVJMT1BUX0hUVFBfVkVSU0lPTiBzZXQgdG8gMS4wCiAgd2hlbiBDVVJMT1BUX0hUVFAyMDBBTElBU0VTIGlzIHVzZWQgdG8gYXZvaWQgdGhlIHByb2JsZW0gbWVudGlvbmVkIGJlbG93IGlzCiAgbm90IHZlcnkgbmljZSBpZiB0aGUgY2xpZW50IHdhbnRzIHRvIGJlIGFibGUgdG8gdXNlIF9laXRoZXJfIGEgSFRUUCAxLjEKICBzZXJ2ZXIgb3Igb25lIHdpdGhpbiB0aGUgYWxpYXNlcyBsaXN0Li4uIHNvIHN0YXJ0aW5nIG5vdywgbGliY3VybCB3aWxsCiAgc2ltcGx5IGNvbnNpZGVyIDIwMC1hbGlhcyBtYXRjaGVzIHRoZSB0byBiZSBIVFRQIDEuMCBjb21wbGlhbnQuCgotIFRvYmlhcyBSdW5kc3Ry9m0gcmVwb3J0ZWQgYSBwcm9ibGVtIHRoZXkgZXhwZXJpZW5jZWQgd2l0aCB4bW1zMiBhbmQgcmVjZW50CiAgbGliY3VybHMsIHdoaWNoIHR1cm5lZCBvdXQgdG8gYmUgdGhlIDI1LW5vdi0yMDA2IGNoYW5nZSB3aGljaCB0cmVhdHMgSFRUUAogIHJlc3BvbnNlcyB3aXRob3V0IENvbnRlbnQtTGVuZ3RoIG9yIGNodW5rZWQgZW5jb2RpbmcgYXMgd2l0aG91dCBib2RpZXMuIFdlCiAgbm93IGFkZGVkIHRoZSBjb25kaXRpb25hbCB0aGF0IHRoZSBhYm92ZSBtZW50aW9uZWQgcmVzcG9uc2UgaXMgb25seSB3aXRob3V0CiAgYm9keSBpZiB0aGUgcmVzcG9uc2UgaXMgSFRUUCAxLjEuCgotIEplZmYgUG9obG1leWVyIGltcHJvdmVkIHRoZSBoaXBlcmZpZm8uYyBleGFtcGxlIHRvIHVzZSB0aGUKICBDVVJMTU9QVF9USU1FUkZVTkNUSU9OIGNhbGxiYWNrIG9wdGlvbi4KCi0gU2V0IHRoZSB0aW1lb3V0IGZvciBlYXN5IGhhbmRsZXMgdG8gZXhwaXJlIHJlYWxseSBzb29uIGFmdGVyIGFkZGl0aW9uIG9yCiAgd2hlbiBDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0gaXMgcmV0dXJuZWQgZnJvbSBjdXJsX211bHRpX3NvY2tldCovcGVyZm9ybSwKICB0byBtYWtlIGFwcGxpY2F0aW9ucyB1c2luZyBvbmx5IGN1cmxfbXVsdGlfc29ja2V0KCkgdG8gcHJvcGVybHkgZnVuY3Rpb24KICB3aGVuIGFkZGluZyBlYXN5IGhhbmRsZXMgIm9uIHRoZSBmbHkiLiBCdWcgcmVwb3J0IGFuZCB0ZXN0IGFwcCBwcm92aWRlZCBieQogIE1pY2hhZWwgV2FsbG5lci4KCkRhbiBGICgzMCBBcHJpbCAyMDA3KQotIEltcHJvdmVkIHRoZSB0ZXN0IGhhcm5lc3MgdG8gYWxsb3cgcnVubmluZyB0ZXN0IHNlcnZlcnMgb24gb3RoZXIgdGhhbgogIHRoZSBkZWZhdWx0IHBvcnQgbnVtYmVycywgYWxsb3dpbmcgbW9yZSB0aGFuIG9uZSB0ZXN0IHN1aXRlIHRvIHJ1bgogIHNpbXVsdGFuZW91c2x5IG9uIHRoZSBzYW1lIGhvc3QuCgpEYW5pZWwgUyAoMjggQXByaWwgMjAwNykKLSBQZXRlciBPJ0dvcm1hbiBmaXhlZCBsaWJjdXJsIHRvIG5vdCBpbml0IEdudVRMUyBhcyBlYXJseSBhcyB3ZSBkaWQgYmVmb3JlLAogIHNpbmNlIGl0IHRoZW4gaW5pdHMgbGliZ2NyeXB0IGFuZCBsaWJnY3J5cHQgaXMgYmVpbmcgZXZpbCBhbmQgRVhJVFMgdGhlCiAgYXBwbGljYXRpb24gaWYgaXQgZmFpbHMgdG8gZ2V0IGEgZmluZSByYW5kb20gc2VlZC4gVGhhdCdzIHJlYWxseSBub3QgYSBuaWNlCiAgdGhpbmcgdG8gZG8gYnkgYSBsaWJyYXJ5LgoKLSBGcmFuayBIZW1wZWwgZml4ZWQgYSBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgY3Jhc2ggb24gYSBoYW5kbGUgdGhhdCBoYWQKICBiZWVuIHJlbW92ZWQgZnJvbSBhIG11bHRpIGhhbmRsZSwgYW5kIHRoZW4gZml4ZWQgYW5vdGhlciBmbGF3IHRoYXQgcHJldmVudGVkCiAgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHRvIHdvcmsgZXZlbiBhZnRlciB0aGUgZmlyc3QgZml4IC0gdGhlIGhhbmRsZSB3YXMKICBzdGlsbCBtYXJrZWQgYXMgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZS4KCkRhbmllbCBTICgyNiBBcHJpbCAyMDA3KQotIFBldGVyIE8nR29ybWFuIGZvdW5kIGEgcHJvYmxlbSB3aXRoIFNDUCBkb3dubG9hZHMgd2hlbiB0aGUgZG93bmxvYWRlZCBmaWxlCiAgd2FzIDE2Mzg1IGJ5dGVzICgxNksrMSkgYW5kIGl0IHR1cm5lZCBvdXQgd2UgZGlkbid0IHByb3Blcmx5IGFsd2F5cyAic3VjawogIG91dCIgYWxsIGRhdGEgZnJvbSBsaWJzc2gyLiBUaGUgZWZmZWN0IGJlaW5nIHRoYXQgbGliY3VybCB3b3VsZCBoYW5nIG9uIHRoZQogIHNvY2tldCB3YWl0aW5nIGZvciBkYXRhIHdoZW4gbGlic3NoMiBoYWQgaW4gZmFjdCBhbHJlYWR5IHJlYWQgaXQgYWxsLi4uCgpEYW4gRiAoMjUgQXByaWwgMjAwNykKLSBBZGRlZCBzdXBwb3J0IGluIHJ1bnRlc3RzLnBsIGZvciAiIW4iIHRlc3QgbnVtYmVycyB0byBkaXNhYmxlIGluZGl2aWR1YWwKICB0ZXN0cy4gIENoYW5nZWQgLXQgdG8gb25seSBrZWVwIGxvZyBmaWxlcyBhcm91bmQgd2hlbiAtayBpcyBzcGVjaWZpZWQsCiAgdG8gaGF2ZSB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgd2l0aG91dCAtdC4KCkRhbmllbCBTICgyNSBBcHJpbCAyMDA3KQotIFNvbmlhIFN1YnJhbWFuaWFuIGJyb3VnaHQgb3VyIGF0dGVudGlvbiB0byBhIHByb2JsZW0gdGhhdCBoYXBwZW5zIGlmIHlvdSBzZXQKICB0aGUgQ1VSTE9QVF9SRVNVTUVfRlJPTSBvciBDVVJMT1BUX1JBTkdFIG9wdGlvbnMgYW5kIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24KICBpbiB0aGUgY29ubmVjdGlvbiBjYWNoZSBpcyBjbG9zZWQgdG8gbWFrZSByb29tIGZvciB0aGUgbmV3IG9uZSB3aGVuIHlvdSBjYWxsCiAgY3VybF9lYXN5X3BlcmZvcm0oKS4gSXQgd291bGQgdGhlbiB3cm9uZ2x5IGZyZWUgcmFuZ2UtcmVsYXRlZCBkYXRhIGluIHRoZQogIGNvbm5lY3Rpb24gY2xvc2UgZnVudGlvbi4KCllhbmcgVHNlICgyNSBBcHJpbCAyMDA3KQotIFN0ZXZlIExpdHRsZSBmaXhlZCBjb21waWxhdGlvbiBvbiBWTVMgNjQtYml0IG1vZGUKCkRhbmllbCBTICgyNCBBcHJpbCAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbGkgbWFkZSB0aGUgJ21hc3Rlcl9idWZmZXInIGdldCBhbGxvY2F0ZWQgZmlyc3Qgb25jZSBpdCBpcwogIGNhbi93aWxsIGJlIHVzZWQgYXMgaXQgdGhlbiBtYWtlcyB0aGUgY29tbW9uIGNhc2VzIHNhdmUgMTZLQiBvZiBkYXRhIGZvciBlYWNoCiAgZWFzeSBoYW5kbGUgdGhhdCBpc24ndCB1c2VkIGZvciBwaXBlbGluaW5nLgoKRGFuIEYgKDIzIEFwcmlsIDIwMDcpCi0gQWRkZWQgPHBvc3RjaGVjaz4gc3VwcG9ydCB0byB0aGUgdGVzdCBoYXJuZXNzLgoKLSBBZGRlZCB0ZXN0cyA2MTAtNjEyIHRvIHRlc3QgbW9yZSBTRlRQIHBvc3QtcXVvdGUgY29tbWFuZHMuCgpEYW5pZWwgUyAoMjIgQXByaWwgMjAwNykKLSBTb25nIE1hJ3Mgd2FybmluZyBpZiAtci8tLXJhbmdlIGlzIGdpdmVuIHdpdGggYSAiYmFkIiByYW5nZSwgYWxzbyBub3RlZCBpbgogIHRoZSBtYW4gcGFnZSBub3cuCgotIERhbmllbCBCbGFjayBmaWxlZCBidWcgIzE3MDUxNzcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcwNTE3Nykgd2hlcmUgLS13aXRob3V0LXNzbAogIC0td2l0aC1nbnV0bCBvdXRwdXRzIGEgd2FybmluZyBhYm91dCBTU0wgbm90IGJlaW5nIGVuYWJsZWQgZXZlbiB0aG91Z2ggR251VExTCiAgd2FzIGZvdW5kIGFuZCB1c2VkLgoKRGFuaWVsIFMgKDIxIEFwcmlsIDIwMDcpCi0gRGFuaWVsIEJsYWNrIGZpbGVkIGJ1ZyAjMTcwNDY3NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzA0Njc1KSBpZGVudGlmeWluZyBhIGRvdWJsZS1mcmVlCiAgcHJvYmxlbSBpbiB0aGUgU1NMLWRlYWxpbmcgbGF5ZXIsIHRlbGxpbmcgR251VExTIHRvIGZyZWUgTlVMTCBjcmVkZW50aWFscyBvbgogIGNsb3NlZG93biBhZnRlciBhIGZhaWx1cmUgYW5kIGEgYmFkICNpZmRlZiBmb3IgTlNTIHdoZW4gY2xvc2luZyBkb3duIFNTTC4KCllhbmcgVHNlICgyMCBBcHJpbCAyMDA3KQotIFNhdmUgb25lIGNhbGwgdG8gY3VybHhfdHZub3coKSwgd2hpY2ggY2FsbHMgZ2V0dGltZW9mZGF5KCksIGluIGVhY2ggb2YKICBDdXJsX3NvY2tldF9yZWFkeSgpLCBDdXJsX3BvbGwoKSBhbmQgQ3VybF9zZWxlY3QoKSB3aGVuIHRoZXNlIGFyZSBjYWxsZWQKICB3aXRoIGEgemVybyB0aW1lb3V0IG9yIGEgdGltZW91dCB2YWx1ZSBpbmRpY2F0aW5nIGEgYmxvY2tpbmcgY2FsbCBzaG91bGQKICBiZSBwZXJmb3JtZWQuCgpEYW5pZWwgUyAoMTggQXByaWwgMjAwNykKLSBKYW1lcyBIb3VzbGV5IG1hZGUgU0ZUUCB1cGxvYWRzIHVzZSBsaWJzc2gyJ3Mgbm9uLWJsb2NraW5nIEFQSQoKLSBQcmV2ZW50IHRoZSBpbnRlcm5hbCBwcm9ncmVzcyBtZXRlciBmcm9tIHVwZGF0aW5nIG1vcmUgZnJlcXVlbnRseSB0aGFuIG9uY2UKICBwZXIgc2Vjb25kLgoKRGFuIEYgKDE3IEFwcmlsIDIwMDcpCi0gQWRkZWQgdGVzdCBjYXNlcyAyOTYsIDI5NyBhbmQgMjk4IHRvIHRlc3QgLS1mdHAtbWV0aG9kIGhhbmRsaW5nCgpEYW5pZWwgUyAoMTYgQXByaWwgMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWwgYWRkZWQgY3VybF9tdWx0aV9zb2NrZXRfYWN0aW9uKCkgdG8gbGliY3VybCwgd2hpY2ggaXMgYQogIGZ1bmN0aW9uIHRoYXQgZGVwcmVjYXRlcyB0aGUgY3VybF9tdWx0aV9zb2NrZXQoKSBmdW5jdGlvbi4gVXNpbmcgdGhlIG5ldwogIGZ1bmN0aW9uIHRoZSBhcHBsaWNhdGlvbiB0ZWxsIGxpYmN1cmwgd2hhdCBhY3Rpb24gdGhhdCB3YXMgZm91bmQgaW4gdGhlCiAgc29ja2V0IHRoYXQgaXQgcGFzc2VzIGluLiBUaGlzIGdpdmVzIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgYm9vc3QgYXMgaXQKICBhbGxvd3MgbGliY3VybCB0byBhdm9pZCBhIGNhbGwgdG8gcG9sbCgpL3NlbGVjdCgpIGZvciBldmVyeSBjYWxsIHRvCiAgY3VybF9tdWx0aV9zb2NrZXQqKCkuCgogIEkgYWRkZWQgYSBkZWZpbmUgaW4gdGhlIHB1YmxpYyBjdXJsL211bHRpLmggaGVhZGVyIGZpbGUgdGhhdCB3aWxsIG1ha2UgeW91cgogIGV4aXN0aW5nIGFwcGxpY2F0aW9uIGF1dG9tYXRpY2FsbHkgdXNlIGN1cmxfbXVsdGlfc29ja2V0X2FjdGlvbigpIGluc3RlYWQgb2YKICBjdXJsX211bHRpX3NvY2tldCgpIHdoZW4geW91IHJlY29tcGlsZS4gQnV0IG9mIGNvdXJzZSB5b3UnbGwgZ2V0IGJldHRlcgogIHBlcmZvcm1hbmNlIGlmIHlvdSBhZGp1c3QgeW91ciBjb2RlIG1hbnVhbGx5IGFuZCBhY3R1YWxseSBwYXNzIGluIHRoZQogIGNvcnJlY3QgYWN0aW9uIGJpdG1hc2sgdG8gdGhpcyBmdW5jdGlvbi4KCkRhbmllbCBTICgxNCBBcHJpbCAyMDA3KQotIEpheSBBdXN0aW4gYWRkZWQgIkRIIFBBUkFNRVRFUlMiIHRvIHRoZSBzdHVubmVsLnBlbSBjZXJ0aWZpY2F0ZSBmb3IgdGhlIHRlc3QKICBzdWl0ZSB0byBtYWtlIHN0dW5uZWwgcnVuIGJldHRlciBpbiBzb21lIChtb3N0PykgZW52aXJvbm1lbnRzLgoKRGFuIEYgKDEzIEFwcmlsIDIwMDcpCi0gQWRkZWQgdGVzdCBjYXNlcyAyOTQgYW5kIDI5NSB0byB0ZXN0IC0tZnRwLWFjY291bnQgaGFuZGxpbmcKCi0gSW1wcm92ZWQgaGFuZGxpbmcgb2Ygb3V0IG9mIG1lbW9yeSBpbiBmdHAuCgpZYW5nIFRzZSAoMTMgQXByaWwgMjAwNykKLSBGaXggdGVzdCBjYXNlIDUzNCB3aGljaCBzdGFydGVkIHRvIGZhaWwgMjAwNy0wNC0xMyBkdWUgdG8gdGhlIGV4aXN0YW5jZQogIG9mIGEgbmV3IGhvc3Qgb24gdGhlIG5ldCB3aXRoIHRoZSBzYW1lIHNpbGx5IGRvbWFpbiB0aGUgdGVzdCB3YXMgdXNpbmcKICBmb3IgYSBob3N0IHdoaWNoIHdhcyBzdXBwb3NlZCBub3QgdG8gZXhpc3QuCgpEYW5pZWwgUyAoMTIgQXByaWwgMjAwNykKLSBTb25nIE1hIGZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGlmMmlwIGNvZGUgaWYgeW91IHBhc3MgaW4gYW4gaW50ZXJmYWNlCiAgbmFtZSBsb25nZXIgdGhhbiB0aGUgbmFtZSBmaWVsZCBvZiB0aGUgaWZyZXEgc3RydWN0ICh0eXBpY2FsbHkgNiBieXRlcyksIGFzCiAgdGhlbiBpdCB3b3VsZG4ndCBjbG9zZSB0aGUgdXNlZCBkdW1teSBzb2NrZXQuIEJ1ZyAjMTY5ODk3NAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjk4OTc0KQoKVmVyc2lvbiA3LjE2LjIgKDExIEFwcmlsIDIwMDcpCgpZYW5nIFRzZSAoMTAgQXByaWwgMjAwNykKLSBSYXZpIFByYXRhcCBwcm92aWRlZCBzb21lIGZpeGVzIGZvciBIVFRQIHBpcGVsaW5pbmcKCi0gY29uZmlndXJlIHNjcmlwdCB3aWxsIGlnbm9yZSAtLWVuYWJsZS1zc3BpIG9wdGlvbiBmb3Igbm9uLW5hdGl2ZSBXaW5kb3dzLgoKRGFuaWVsIFMgKDkgQXByaWwgMjAwNykKLSBOaWNrIFppdHptYW5uIGRpZCBzc2guYyBjbGVhbnVwcwoKRGFuaWVsIFMgKDMgQXByaWwgMjAwNykKLSBSb2IgSm9uZXMgZml4ZWQgYmV0dGVyICNpZmRlZidpbmcgZm9yIGEgYnVuY2ggb2YgI2luY2x1ZGUgbGluZXMuCgpEYW5pZWwgUyAoMiBBcHJpbCAyMDA3KQotIE5pY2sgWml0em1hbm4gbWFkZSB0aGUgQ1VSTE9QVF9QT1NUUVVPVEUgb3B0aW9uIHdvcmsgZm9yIFNGVFAgYXMgd2VsbC4gVGhlCiAgYWNjZXB0ZWQgY29tbWFuZHMgYXJlIGFzIGZvbGxvd3M6CgogIGNoZ3JwIChnaWQpIChwYXRoKQogICAgQ2hhbmdlcyB0aGUgZ3JvdXAgSUQgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGF0IChwYXRoKSB0byAoZ2lkKS4gKGdpZCkKICAgIG11c3QgYmUgYSBudW1iZXIuCgogIGNobW9kIChwZXJtcykgKHBhdGgpCiAgICBDaGFuZ2VzIHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYXQgKHBhdGgpIHRvCiAgICAocGVybXMpLiAocGVybXMpIG11c3QgYmUgYSBudW1iZXIgaW4gdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZSBjaG1vZCBVbml4CiAgICBjb21tYW5kLgoKICBjaG93biAodWlkKSAocGF0aCkKICAgIENoYW5nZXMgdGhlIHVzZXIgSUQgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGF0IChwYXRoKSB0byAodWlkKS4gKHVpZCkKICAgIG11c3QgYmUgYSBudW1iZXIuCgogIGxuIChzb3VyY2UpIChkZXN0KQogICAgQ3JlYXRlcyBhIHN5bWJvbGljIGxpbmsgYXQgKGRlc3QpIHRoYXQgcG9pbnRzIHRvIHRoZSBmaWxlIGxvY2F0ZWQgYXQKICAgIChzb3VyY2UpLgoKICBta2RpciAocGF0aCkKICAgIENyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5IGF0IChwYXRoKS4KCiAgcmVuYW1lIChzb3VyY2UpIChkZXN0KQogICAgTW92ZXMgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGF0IChzb3VyY2UpIHRvIChkZXN0KS4KCiAgcm0gKHBhdGgpCiAgICBEZWxldGVzIHRoZSBmaWxlIGxvY2F0ZWQgYXQgKHBhdGgpLgoKICBybWRpciAocGF0aCkKICAgIERlbGV0ZXMgdGhlIGRpcmVjdG9yeSBsb2NhdGVkIGF0IChwYXRoKS4gVGhpcyBjb21tYW5kIHdpbGwgcmFpc2UgYW4gZXJyb3IKICAgIGlmIHRoZSBkaXJlY3RvcnkgaXMgbm90IGVtcHR5LgoKICBzeW1saW5rIChzb3VyY2UpIChkZXN0KQogICAgU2FtZSBhcyBsbi4KCkRhbmllbCBTICgxIEFwcmlsIDIwMDcpCi0gUm9iZXJ0IElha29iYXNodmlsaSBtYWRlIGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgpIGEgbG90IGZhc3RlciB3aGVuIG1hbnkKICBlYXN5IGhhbmRsZXMgYXJlIGFkZGVkIHRvIGEgbXVsdGkgaGFuZGxlLCBieSBhdm9pZGluZyB0aGUgbG9vcGluZyBvdmVyIGFsbAogIHRoZSBoYW5kbGVzIHRvIGZpbmQgd2hpY2ggb25lIHRvIHJlbW92ZS4KCi0gTWF0dCBLcmFhaSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgY3VybCBidWlsZCBvbiBRTlggNiBmaW5lIGFnYWluLgoKRGFuaWVsIFMgKDMxIE1hcmNoIDIwMDcpCi0gRml4ZWQgc2V2ZXJhbCBtaW5vciBpc3N1ZXMgZGV0ZWN0ZWQgYnkgdGhlIGNvdmVyaXR5LmNvbSBzY2FubmVyLgoKLSAiUGl4ZWwiIGZpeGVkIGEgcHJvYmxlbSB0aGF0IGFwcGVhcmVkIHdoZW4geW91IHVzZWQgLWYgd2l0aCB1c2VyK3Bhc3N3b3JkCiAgZW1iZWRkZWQgaW4gdGhlIFVSTC4KCkRhbiBGICgyOSBNYXJjaCAyMDA3KQotIERvbid0IHRlYXIgZG93biB0aGUgZnRwIGNvbm5lY3Rpb24gaWYgdGhlIG1heGltdW0gZmlsZXNpemUgd2FzIGV4Y2VlZGVkCiAgYW5kIGFkZGVkIHRlc3RzIDI5MCBhbmQgMjkxIHRvIGNoZWNrLgoKLSBBZGRlZCBmdHBzIHVwbG9hZCBhbmQgU1NMIHJlcXVpcmVkIHRlc3RzIDQwMSBhbmQgNDAyLgoKLSBTZW5kIGFuIEVPRiBtZXNzYWdlIGJlZm9yZSBjbG9zaW5nIGFuIFNDUCBjaGFubmVsLCBhcyByZWNvbW1lbmRlZCBieQogIFJGQzQyNTQuIEVuYWJsZSBsaWJzc2gyIHRyYWNpbmcgd2hlbiBzc2ggZGVidWdnaW5nIGlzIHR1cm5lZCBvbi4KCllhbmcgVHNlICgyNyBNYXJjaCAyMDA3KQotIEludGVybmFsIGZ1bmN0aW9uIEN1cmxfc2VsZWN0KCkgcmVuYW1lZCB0byBDdXJsX3NvY2tldF9yZWFkeSgpCgogIE5ldyBJbnRlcm5hbCB3cmFwcGVyIGZ1bmN0aW9uIEN1cmxfc2VsZWN0KCkgYXJvdW5kIHNlbGVjdCAoMiksIGl0CiAgdXNlcyBwb2xsKCkgd2hlbiBhIGZpbmUgcG9sbCgpIGlzIGF2YWlsYWJsZSwgc28gbm93IGxpYmN1cmwgY2FuIGJlCiAgYnVpbHQgd2l0aG91dCBzZWxlY3QoKSBzdXBwb3J0IGF0IGFsbCBpZiBhIGZpbmUgcG9sbCgpIGlzIGF2YWlsYWJsZS4KCkRhbmllbCBTICgyNSBNYXJjaCAyMDA3KQotIERhbmllbCBKb2huc29uIGZpeGVkIG11bHRpIGNvZGUgdG8gdHJhdmVyc2UgdGhlIGVhc3kgaGFuZGxlIGxpc3QgcHJvcGVybHkuCiAgQSBsZWZ0LW92ZXIgYnVnIGZyb20gdGhlIEZlYnJ1YXJ5IDIxIGZpeC4KCkRhbiBGICgyMyBNYXJjaCAyMDA3KQotIEFkZGVkIC0tcHVia2V5IG9wdGlvbiB0byBjdXJsIGFuZCBtYWRlIC0ta2V5IGFsc28gd29yayBmb3IgU0NQL1NGVFAsCiAgcGx1cyBtYWRlIC0tcGFzcyB3b3JrIG9uIGFuIFNTSCBwcml2YXRlIGtleSBhcyB3ZWxsLgoKLSBDaGFuZ2VkIHRoZSB0ZXN0IGhhcm5lc3MgdG8gYXR0ZW1wdCB0byBncmFjZWZ1bGx5IHNodXQgZG93biBzZXJ2ZXJzCiAgYmVmb3JlIHJlc29ydGluZyB0byB0aGUga2lsbCAtOSBoYW1tZXIuCgotIEFkZGVkIHRlc3QgaGFybmVzcyBpbmZyYXN0cnVjdHVyZSB0byBzdXBwb3J0IHNjcC9zZnRwIHRlc3RzLCB1c2luZwogIE9wZW5TU0ggYXMgdGhlIHNlcnZlci4KCi0gRml4ZWQgYSBtZW1vcnkgbGVhayB3aGVuIHNwZWNpZnlpbmcgYSBwcm94eSB3aXRoIGEgZmlsZTogVVJMLgoKWWFuZyBUc2UgKDIwIE1hcmNoIDIwMDcpCi0gRml4ZWQ6IFdoZW4gYSBzaWduYWwgd2FzIGNhdWdodCBhd2FpdGluZyBmb3IgYW4gZXZlbnQgdXNpbmcgQ3VybF9zZWxlY3QoKQogIG9yIEN1cmxfcG9sbCgpIHdpdGggYSBub24temVybyB0aW1lb3V0IGJvdGggZnVuY3Rpb25zIHdvdWxkIHJlc3RhcnQgdGhlCiAgc3BlY2lmaWVkIHRpbWVvdXQuIFRoaXMgY291bGQgZXZlbiBsZWFkIHRvIHRoZSBleHRyZW1lIGNhc2UgdGhhdCBpZiBhCiAgc2lnbmFsIGFycml2ZWQgd2l0aCBhIGZyZWN1ZW5jeSBsb3dlciB0byB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgbmVpdGhlcgogIGZ1bmN0aW9uIHdvdWxkIGV2ZXIgZXhpdC4KCiAgQWRkZWQgZXhwZXJpbWVudGFsIHN5bWJvbCBkZWZpbml0aW9uIGNoZWNrIENVUkxfQUNLTk9XTEVER0VfRUlOVFIgaW4KICBDdXJsX3NlbGVjdCgpIGFuZCBDdXJsX3BvbGwoKS4gV2hlbiBjb21waWxlZCB3aXRoIENVUkxfQUNLTk9XTEVER0VfRUlOVFIKICBkZWZpbmVkIGJvdGggZnVuY3Rpb25zIHdpbGwgcmV0dXJuIGFzIHNvb24gYXMgYSBzaWduYWwgaXMgY2F1Z2h0LiBVc2UgaXQKICBhdCB5b3VyIG93biByaXNrLCBhbGwgY2FsbHMgdG8gdGhlc2UgZnVuY3Rpb25zIGluIHRoZSBsaWJyYXJ5IHNob3VsZCBiZQogIHJldmlzaXRlZCBhbmQgY2hlY2tlZCBiZWZvcmUgZnVsbHkgc3VwcG9ydGluZyB0aGlzIGZlYXR1cmUuCgpZYW5nIFRzZSAoMTkgTWFyY2ggMjAwNykKLSBCcnlhbiBIZW5kZXJzb24gZml4ZWQgdGhlIHByb2dyZXNzIGZ1bmN0aW9uIHNvIHRoYXQgaXQgY2FuIGdldCBjYWxsZWQgbW9yZQogIGZyZXF1ZW50bHkgYWxsb3dpbmcgc2FtZSBjYWxsaW5nIGZyZWN1ZW5jeSBmb3IgdGhlIGNsaWVudCBwcm9ncmVzcyBjYWxsYmFjay4KICAKRGFuIEYgKDE1IE1hcmNoIDIwMDcpCi0gVmFyaW91cyBtZW1vcnkgbGVha3MgcGx1Z2dlZCBhbmQgTlVMTCBwb2ludGVyIGZpeGVzIG1hZGUgaW4gdGhlIHNzaCBjb2RlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDA3KQotIE5pY2sgbWFkZSB0aGUgY3VybCB0b29sIGFjY2VwdCBnbG9iYmluZyByYW5nZXMgdGhhdCBvbmx5IGlzIG9uZSBudW1iZXIsIGkuZQogIHlvdSBjYW4gbm93IHVzZSBbMS0xXSB3aXRob3V0IGN1cmwgY29tcGxhaW5pbmcuCgpEYW5pZWwgKDEwIE1hcmNoIDIwMDcpCi0gRXlnZW5lIFJ5YWJpbmtpbjoKCiAgVGhlIHByb2JsZW0gaXMgdGhlIGZvbGxvd2luZzogd2hlbiB3ZSdyZSBjYWxsaW5nIEN1cmxfZG9uZSBhbmQgaXQgZGVjaWRlcyB0bwogIGtlZXAgdGhlIGNvbm5lY3Rpb24gb3BlbmVkICgnbGVmdCBpbnRhY3QnKSwgdGhlbiB0aGUgY2FsbGVyIGlzIG5vdCBub3RpZmllZAogIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzIGRvbmUgdmlhIHRoZSBOVUxMaWZ5aW5nIG9mIHRoZSBwb2ludGVyLCBzbyBzb21lIGVhc3kKICBoYW5kbGUgaXMga2VlcGluZyB0aGUgcG9pbnRlciB0byB0aGlzIGNvbm5lY3Rpb24uCgogIExhdGVyIENvbm5lY3Rpb25FeGlzdHMgY2FuIHNlbGVjdCBzdWNoIGNvbm5lY3Rpb24gZm9yIHJldXNlIGV2ZW4gaWYgd2UncmUKICBub3QgcGlwZWxpbmluZzogcGlwZUxlbiBpcyB6ZXJvLCBzbyB0aGUgKHBpcGVMZW4gPiAwICYmICFjYW5QaXBlbGluZSkgaXMKICBmYWxzZSBhbmQgd2UgY2FuIHJldXNlIHRoaXMgY29ubmVjdGlvbiBmb3IgYW5vdGhlciBlYXN5IGhhbmRsZS4gQnV0IHRodXMgdGhlCiAgY29ubmVjdGlvbiB3aWxsIGJlIHNoYXJlZCBiZXR3ZWVuIHR3byBlYXN5IGhhbmRsZXMgaWYgdGhlIGhhbmRsZSB0aGF0IHdhbnRzCiAgdG8gdGFrZSB0aGUgb3duZXJzaGlwIGlzIG5vdCB0aGUgc2FtZSBhcyB3YXMgbm90IG5vdGlmaWVkIG9mIHRoZSBjb25uZWN0aW9uCiAgd2FzIGRvbmUgaW4gQ3VybF9kb25lLiBBbmQgd2hlbiBzb21lIG9mIHRoZXNlIGVhc3kgaGFuZGxlcyB3aWxsIGdldCB0aGVpcgogIGNvbm5lY3Rpb24gcmVhbGx5IGZyZWVkIHRoZSBhbm90aGVyIG9uZSB3aWxsIHN0aWxsIGtlZXAgdGhlIHBvaW50ZXIuCgogIE15IGZpeCB3YXMgcmF0aGVyIHRyaXZpYWw6IEkganVzdCBhZGRlZCB0aGUgTlVMTGlmaWNhdGlvbiB0byB0aGUgJ2Vsc2UnCiAgYnJhbmNoIGluIHRoZSBDdXJsX2RvbmUuIE15IHRlc3RzIHdpdGggR2l0IGFuZCBFbGVjdHJpY0ZlbmNlIHNob3dlZCBubwogIHByb2JsZW1zIGJvdGggZm9yIEhUVFAgcHVsbGluZyBhbmQgY2xvbmluZy4gUmVwb3NpdG9yeSBzaXplIGlzIGFib3V0IDI1MCBNYiwKICBzbyBpdCB3YXMgYSBjb25zaWRlcmFibGUgYW1vdW50IG9mIEN1cmwncyB3b3JrLgoKRGFuIEYgKDkgTWFyY2ggMjAwNykKLSBVcGRhdGVkIHRoZSB0ZXN0IGhhcm5lc3MgdG8gYWRkIGEgbmV3ICJjcnlwdG8iIGZlYXR1cmUgY2hlY2sgYW5kIHVwZGF0ZWQgdGhlCiAgYXBwcm9wcmlhdGUgdGVzdCBjYXNlIHRvIHVzZSBpdC4gIEZvciBub3csIHRoaXMgaXMgdHJlYXRlZCB0aGUgc2FtZSBhcyB0aGUKICAiU1NMIiBmZWF0dXJlIGJlY2F1c2UgY3VybCBkb2Vzbid0IGxpc3QgaXQgc2VwYXJhdGVseS4KCkRhbmllbCAoOSBNYXJjaCAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbGkgZml4ZWQgQ1VSTE9QVF9JTlRFUkZBQ0UgZm9yIElQdjYuCgotIFJvYmVydCBBLiBNb25hdCBpbXByb3ZlZCB0aGUgbWFrZXRneiBhbmQgVkM2LzggZ2VuZXJhdGluZyB0byBzZXQgdGhlIGNvcnJlY3QKICBtYWNoaW5lIHR5cGUgdG9vLgoKLSBKdXN0aW4gRmxldGNoZXIgZml4ZWQgYSBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiB0aGUgY3VybCB0b29sIHdoZW4gdHJ5aW5nIHRvCiAgdXBsb2FkIGEgZmlsZSBpdCBjb3VsZG4ndCBvcGVuLiBCdWcgIzE2NzY1ODEKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTY3NjU4MSkKCkRhbiBGICg5IE1hcmNoIDIwMDcpCi0gVXBkYXRlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGNoZWNrIGZvciBwcm90b2NvbCBzdXBwb3J0IGJlZm9yZSBydW5uaW5nIGVhY2gKICB0ZXN0LCBmaXhpbmcgS05PV05fQlVHUyAjMTEuCgpEYW4gRiAoNyBNYXJjaCAyMDA3KQotIFJlaW50cm9kdWNlZCAoYWZ0ZXIgYSAzIHllYXIgaGlhdHVzKSBhbiBGVFBTIHRlc3QgY2FzZSAoNDAwKSBpbnRvIHRoZSB0ZXN0CiAgaGFybmVzcy4gIEl0IGlzIHZlcnkgbGltaXRlZCBhcyBpdCBzdXBwb3J0cyBvbmx5IGZ0cHM6Ly8gVVJMcyB3aXRoCiAgLS1mdHAtc3NsLWNvbnRyb2wgc3BlY2lmaWVkLCB3aGljaCBpbXBsaWNpdGx5IGVuY3J5cHRzIHRoZSBjb250cm9sCiAgY2hhbm5lbCBidXQgbm90IHRoZSBkYXRhIGNoYW5uZWxzLiAgVGhhdCBhbGxvd3Mgc3R1bm5lbCB0byBiZSB1c2VkIHdpdGgKICBhbiB1bm1vZGlmaWVkIGZ0cCBzZXJ2ZXIgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgdGhhdCB0aGUgdGVzdCBodHRwcwogIHNlcnZlciBpcyBzZXQgdXAuCgpEYW4gRiAoNyBNYXJjaCAyMDA3KQotIEhvbm91ciAtLWZ0cC1zc2wtY29udHJvbCBvbiBmdHBzOi8vIFVSTHMgdG8gYWxsb3cgZW5jcnlwdGVkIGNvbnRyb2wgYW5kCiAgdW5lbmNyeXB0ZWQgZGF0YSBjb25uZWN0aW9ucy4KCkRhbiBGICg2IE1hcmNoIDIwMDcpCi0gRml4ZWQgYSBjb3VwbGUgb2YgaW1wcm9wZXIgcG9pbnRlciB1c2VzIGRldGVjdGVkIGJ5IHZhbGdyaW5kIGluIHRlc3QKICBjYXNlcyAxODEgJiAyMTYuCgpEYW5pZWwgKDIgTWFyY2ggMjAwNykKLSBSb2JlcnQgQS4gTW9uYXQgYW5kIFNobXVsaWsgUmVnZXYgaGVscGVkIG91dCB0byBmaXggdGhlIG5ldyAqL01ha2VmaWxlLnZjOAogIG1ha2VmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgc291cmNlIHJlbGVhc2UgYXJjaGl2ZXMsIGdlbmVyYXRlZCBmcm9tCiAgdGhlIE1ha2VmaWxlLnZjNiBmaWxlcyBieSB0aGUgbWFrZXRneiBzY3JpcHQuIEkgYWxzbyBtb2RpZmllZCB0aGUgcm9vdAogIE1ha2VmaWxlIHRvIGhhdmUgYSBWQyB2YXJpYWJsZSB0aGF0IGRlZmF1bHRzIHRvIHZjNiBidXQgY2FuIGJlIG92ZXJyaWRkZW4gdG8KICBhbGxvdyBpdCB0byBiZSB1c2VkIGZvciB2YzggYXMgd2VsbC4gTGlrZSB0aGlzOgoKICAgIG5tYWtlIFZDPXZjOCB2YwoKRGFuaWVsICgyNyBGZWJydWFyeSAyMDA3KQotIEhhbmcgS2luIExhdSBmb3VuZCBhbmQgZml4ZWQ6IFdoZW4gSSB1c2UgbGliY3VybCB0byBjb25uZWN0IHRvIGFuIGh0dHBzCiAgc2VydmVyIHRocm91Z2ggYSBwcm94eSBhbmQgaGF2ZSB0aGUgcmVtb3RlIGh0dHBzIHNlcnZlciBwb3J0IHNldCB1c2luZyB0aGUKICBDVVJMT1BUX1BPUlQgb3B0aW9uLCBwcm90b2NvbCBnZXRzIHJlc2V0IHRvIGh0dHAgZnJvbSBodHRwcyBhZnRlciB0aGUgZmlyc3QKICByZXF1ZXN0LgogCiAgVXNlciBkZWZpbmVkIFVSTCB3YXMgbW9kaWZpZWQgaW50ZXJuYWxseSBieSBsaWJjdXJsIGFuZCBzdWJzZXF1ZW50IHJldXNlIG9mCiAgdGhlIGVhc3kgaGFuZGxlIG1heSBsZWFkIHRvIGNvbm5lY3Rpb24gdXNpbmcgYSBkaWZmZXJlbnQgcHJvdG9jb2wgKGlmIG5vdAogIG9yaWdpbmFsbHkgaHR0cCkuCiAKICBJIGZvdW5kIHRoYXQgbGliY3VybCBoYXJkY29kZWQgdGhlIHByb3RvY29sIHRvICJodHRwIiB3aGVuIGl0IHRyaWVzIHRvCiAgcmVnZW5lcmF0ZSB0aGUgVVJMIGlmIENVUkxPUFRfUE9SVCBpcyBzZXQuIEkgdHJpZWQgdG8gZml4IHRoZSBwcm9ibGVtIGFzCiAgZm9sbG93cyBhbmQgaXQncyB3b3JraW5nIGZpbmUgc28gZmFyCgpEYW5pZWwgKDI1IEZlYnJ1YXJ5IDIwMDcpCi0gQWRhbSBELiBNb3NzIG1hZGUgdGhlIEhUVFAgQ09OTkVDVCBwcm9jZWR1cmUgbGVzcyBibG9ja2luZyB3aGVuIHVzZWQgZnJvbQogIHRoZSBtdWx0aSBpbnRlcmZhY2UuIE5vdGUgdGhhdCBpdCBzdGlsbCBkb2VzIGEgcGFydCBvZiB0aGUgY29ubmVjdGlvbiBpbiBhCiAgYmxvY2tpbmcgbWFubmVyLgoKRGFuaWVsICgyMyBGZWJydWFyeSAyMDA3KQotIEFkZGVkIHdhcm5pbmcgb3V0cHV0cyBpZiB0aGUgY29tbWFuZCBsaW5lIHVzZXMgbW9yZSB0aGFuIG9uZSBvZiB0aGUgb3B0aW9ucwogIC12LCAtLXRyYWNlIGFuZCAtLXRyYWNlLWFzY2lpLCBzaW5jZSBpdCBjb3VsZCByZWFsbHkgY29uZnVzZSB0aGUgdXNlci4KICBDbGFyaWZpZWQgdGhpcyBmYWN0IGluIHRoZSBtYW4gcGFnZS4KCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwNykKLSBSYXZpIFByYXRhcCBwcm92aWRlZCB3b3JrIG9uIGxpYmN1cmwgbWFraW5nIHBpcGVsaW5pbmcgbW9yZSByb2J1c3QgYW5kCiAgZml4aW5nIHNvbWUgYnVnczoKICBvIERvbid0IG1peCBHRVQgYW5kIFBPU1QgcmVxdWVzdHMgaW4gYSBwaXBlbGluZQogIG8gRml4IHRoZSBvcmRlciBpbiB3aGljaCByZXF1ZXN0cyBhcmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBwaXBlbGluZQogIG8gRml4ZWQgc2V2ZXJhbCBjdXJsIGJ1Z3Mgd2l0aCBwaXBlbGluaW5nIHdoZW4gdGhlIHNlcnZlciBpcyByZXR1cm5pbmcKICAgIGNodW5rZWQgZW5jb2Rpbmc6CiAgICAqIEFkZGVkIHN0YXRlcyB0byBjaHVua2VkIHBhcnNpbmcgZm9yIGZpbmFsIENSTEYKICAgICogUmV3aW5kIGJ1ZmZlciBhZnRlciBwYXJzaW5nIGNodW5rIHdpdGggZGF0YSByZW1haW5pbmcKICAgICogTW92ZWQgY2h1bmtlZCBoZWFkZXIgaW5pdGlhbGl6aW5nIHRvIGEgc3BvdCBqdXN0IGJlZm9yZSByZWNlaXZpbmcKICAgICAgaGVhZGVycwoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDA3KQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgY2hhbmdlZCB0aGUgQ1VSTE9QVF9GVFBfU1NMX0NDQyBvcHRpb24gdG8gaGFuZGxlCiAgYWN0aXZlIGFuZCBwYXNzaXZlIENDQyBzaHV0ZG93biBhbmQgYWRkZWQgdGhlIC0tZnRwLXNzbC1jY2MtbW9kZSBjb21tYW5kCiAgbGluZSBvcHRpb24uCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDcpCi0gSWFuIFR1cm5lciBmaXhlZCB0aGUgbGliY3VybC5tNCBtYWNybydzIHN1cHBvcnQgZm9yIC0td2l0aC1saWJjdXJsLgoKLSBTaG11bGlrIFJlZ2V2IGZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gcmUtdXNlZCBIVFRQUyBjb25uZWN0aW9ucywgYXQgbGVhc3QKICB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIHVzZWQuCgotIFJvYnNvbiBCcmFnYSBBcmF1am8gbWFkZSBwYXNzaXZlIEZUUCB0cmFuc2ZlcnMgd29yayB3aXRoIFNPQ0tTIChib3RoIDQgYW5kCiAgNSkuCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDcpCi0gSmVmZiBQb2hsbWV5ZXIgaWRlbnRpZmllZCB0d28gcHJvYmxlbXM6IGZpcnN0IGEgcmF0aGVyIG9ic2N1cmUgcHJvYmxlbSB3aXRoCiAgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgY29ubmVjdGlvbiByZS11c2UgdGhhdCBjb3VsZCBtYWtlIGEKICBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKSBydWluIGEgcG9pbnRlciBpbiBhbm90aGVyIGhhbmRsZS4KCiAgVGhlIHNlY29uZCBwcm9ibGVtIHdhcyBsZXNzIG9mIGFuIGFjdHVhbCBwcm9ibGVtIGJ1dCBtb3JlIG9mIG1pbm9yIHF1aXJrOgogIHRoZSByZS11c2luZyBvZiBjb25uZWN0aW9ucyB3YXNuJ3QgcHJvcGVybHkgY2hlY2tpbmcgaWYgdGhlIGNvbm5lY3Rpb24gd2FzCiAgbWFya2VkIGZvciBjbG9zdXJlLgoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDA3KQotIER1bmNhbiBNYWMtVmljYXIgUHJldHQgYW5kIE1pY2hhbCBNYXJlayByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIHJlc2V0dGluZwogIENVUkxPUFRfUkFOR0UgYmFjayB0byBubyByYW5nZSBvbiBhbiBlYXN5IGhhbmRsZSB3aGVuIHVzaW5nIEZUUC4KCkRhbiBGICgxNCBGZWJydWFyeSAyMDA3KQotIEZpeGVkIGN1cmwtY29uZmlnIC0tbGlicyBzbyBpdCBkb2Vzbid0IGxpc3QgdW5uZWNlc3NhcnkgbGlicmFyaWVzIChhbmQKICB0aGVyZWZvcmUgaW50cm9kdWNlIHVubmVjZXNzYXJ5IGRlcGVuZGVuY2llcykgd2hlbiBpdCdzIG5vdCBuZWVkZWQuCiAgQWxzbywgZG9uJ3QgYm90aGVyIGFkZGluZyBhIGxpYnJhcnkgcGF0aCBvZiAvdXNyL2xpYgoKRGFuaWVsICgxMyBGZWJydWFyeSAyMDA3KQotIFRoZSBkZWZhdWx0IHBhc3N3b3JkIGZvciBhbm9ueW1vdXMgRlRQIGNvbm5lY3Rpb25zIGlzIG5vdyBjaGFuZ2VkIHRvIGJlCiAgImZ0cEBleGFtcGxlLmNvbSIuCgotIFJvYmVydCBBLiBNb25hdCBtYWRlIGxpYmN1cmwgYnVpbGQgZmluZSB3aXRoIFZDMjAwNSAtIGl0IGRvZXNuJ3QgaGF2ZQogIGdtdGltZV9yKCkgbGlrZSB0aGUgb2xkZXIgVkMgdmVyc2lvbnMuIEhlIGFsc28gbWFkZSB1c2Ugb2Ygc29tZSBtYWNoaW5lLQogIHNwZWNpZmljIGRlZmluZXMgdG8gZGlmZmVyZW50aWF0ZSB0aGUgIk9TIiBkZWZpbmUuCgpEYW5pZWwgKDEyIEZlYnJ1YXJ5IDIwMDcpCi0gUm9iIENyaXR0ZW5kZW4gYWRkZWQgc3VwcG9ydCBmb3IgTlNTIChOZXR3b3JrIFNlY3VyaXR5IFNlcnZpY2UpIGZvciB0aGUKICBTU0wvVExTIGxheWVyLiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL3Byb2plY3RzL3NlY3VyaXR5L3BraS9uc3MvCgogIFRoaXMgaXMgdGhlIGZvdXJ0aCBzdXBwb3J0ZWQgbGlicmFyeSBmb3IgVExTL1NTTCB0aGF0IGxpYmN1cmwgc3VwcG9ydHMhCgotIFNobXVsaWsgUmVnZXYgZml4ZWQgc28gdGhhdCB0aGUgZmluYWwgQ1JMRiBvZiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgYXJlIHNlbnQKICB0byB0aGUgZGVidWcgY2FsbGJhY2suCgotIFNobXVsaWsgUmVnZXYgYWRkZWQgQ1VSTE9QVF9IVFRQX0NPTlRFTlRfREVDT0RJTkcgYW5kCiAgQ1VSTE9QVF9IVFRQX1RSQU5TRkVSX0RFQ09ESU5HIHRoYXQgaWYgc2V0IHRvIHplcm8gd2lsbCBkaXNhYmxlIGxpYmN1cmwncwogIGludGVybmFsIGRlY29kaW5nIG9mIGNvbnRlbnQgb3IgdHJhbnNmZXIgZW5jb2RlZCBjb250ZW50LiBUaGlzIG1heSBiZQogIHByZWZlcmFibGUgaW4gY2FzZXMgd2hlcmUgeW91IHVzZSBsaWJjdXJsIGZvciBwcm94eSBwdXJwb3NlcyBvciBzaW1pbGFyLiBUaGUKICBjb21tYW5kIGxpbmUgdG9vbCBnb3QgYSAtLXJhdyBvcHRpb24gdG8gZGlzYWJsZSBib3RoIGF0IG9uY2UuCgotIHJlbGVhc2UgdGFyYmFsbHMgbWFkZSB3aXRoIG1ha2V0Z3ogd2lsbCBmcm9tIG5vdyBvbiBoYXZlIGEgTElCQ1VSTF9USU1FU1RBTVAKICBkZWZpbmUgc2V0IHRvIGhvbGQgdGhlIGV4YWN0IGRhdGUgYW5kIHRpbWUgb2Ygd2hlbiB0aGUgdGFyYmFsbCB3YXMgYnVpbHQsIGFzCiAgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgdXNpbmcgdGhlIFVUQyB0aW1lIHpvbmUuCiAgCi0gSmVmZiBQb2hsbWV5ZXIgZml4ZWQgYSBmbGF3IGluIGN1cmxfbXVsdGlfYWRkX2hhbmRsZSgpIHdoZW4gYWRkaW5nIGEgaGFuZGxlCiAgdGhhdCBoYXMgYW4gZWFzeSBoYW5kbGUgcHJlc2VudCBpbiB0aGUgImNsb3N1cmUiIGxpc3QgcGVuZGluZyBjbG9zdXJlLgoKRGFuaWVsICg2IEZlYnJ1YXJ5IDIwMDcpCi0gUmVndWxhciBmaWxlIGRvd25sb2FkcyB3aWh0IFNGVFAgYW5kIFNDUCBhcmUgbm93IGRvbmUgdXNpbmcgdGhlIG5vbi1ibG9ja2luZwogIEFQSSBvZiBsaWJzc2gyLCBpZiB0aGUgbGlic3NoMiBoZWFkZXJzIHNlZW0gdG8gc3VwcG9ydCB0aGVtLiBUaGlzIHdpbGwgbWFrZQogIFNDUCBhbmQgU0ZUUCBtdWNoIG1vcmUgcmVzcG9uc2l2ZSBhbmQgYmV0dGVyIGxpYmN1cmwgY2l0aXplbnMgd2hlbiB1c2VkIHdpdGgKICB0aGUgbXVsdGkgaW50ZXJmYWNlIGV0Yy4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDA3KQotIE1pY2hhZWwgV2FsbG5lciBhZGRlZCBzdXBwb3J0IGZvciBDVVJMT1BUX1RJTUVPVVRfTVMgYW5kCiAgQ1VSTE9QVF9DT05ORUNUVElNRU9VVF9NUyB0aGF0LCBhcyB0aGVpciBuYW1lcyBzdWdnZXN0LCBkbyB0aGUgdGltZW91dHMgd2l0aAogIG1pbGxpc2Vjb25kIHJlc29sdXRpb24uIFRoZSBvbmx5IHJlc3RyaWN0aW9uIHRvIHRoYXQgaXMgdGhlIGFsYXJtKCkKICAoc29tZXRpbWVzKSB1c2VkIHRvIGFib3J0IG5hbWUgcmVzb2x2ZXMgYXMgdGhhdCB1c2VzIGZ1bGwgc2Vjb25kcy4gSSBmaXhlZAogIHRoZSBGVFAgcmVzcG9uc2UgdGltZW91dCBwYXJ0IG9mIHRoZSBwYXRjaC4KCiAgSW50ZXJuYWxseSB3ZSBub3cgY291bnQgYW5kIGtlZXAgdGhlIHRpbWVvdXRzIGluIG1pbGxpc2Vjb25kcyBidXQgaXQgYWxzbwogIG1lYW5zIHdlIG11bHRpcGx5IHNldCB0aW1lb3V0cyB3aXRoIDEwMDAuIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IG5vCiAgdGltZW91dCBjYW4gYmUgc2V0IHRvIG1vcmUgdGhhbiAyXjMxIG1pbGxpc2Vjb25kcyAob24gMzIgYml0IHN5c3RlbXMpLCB3aGljaAogIGVxdWFscyAyNC44NiBkYXlzLiAgV2UgcHJvYmFibHkgY291bGRuJ3QgYmVmb3JlIGVpdGhlciBzaW5jZSB0aGUgY29kZSBkaWQKICAqMTAwMCBvbiB0aGUgdGltZW91dCB2YWx1ZXMgb24gc2V2ZXJhbCBwbGFjZXMgYWxyZWFkeS4KCkRhbmllbCAoMyBGZWJydWFyeSAyMDA3KQotIFlhbmcgVHNlIGZpeGVkIHRoZSBjb29raWUgZXhwaXJ5IGRhdGUgaW4gc2V2ZXJhbCB0ZXN0IGNhc2VzIHRoYXQgc3RhcnRlZCB0bwogIGZhaWwgc2luY2UgdGhleSB1c2VkICIxIGZlYiAyMDA3Ii4uLgoKLSBNYW5mcmVkIFNjaHdhcmIgcmVwb3J0ZWQgdGhhdCBzb2NrczUgc3VwcG9ydCB3YXMgYnJva2VuIGFuZCBoZWxwIHVzIHBpbnBvaW50CiAgdGhlIHByb2JsZW0uIFRoZSBjb2RlIG5vdyB0cmllcyBoYXJkZXIgdG8gdXNlIGh0dHByb3h5IGFuZCBwcm94eSB3aGVyZQogIGFwcHByb3ByaWF0ZSwgYXMgbm90IGFsbCBwcm94aWVzIGFyZSBIVFRQLi4uCgpWZXJzaW9uIDcuMTYuMSAoMjkgSmFudWFyeSAyMDA3KQoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDcpCi0gTWljaGFlbCBXYWxsbmVyIHJlcG9ydGVkIHRoYXQgd2hlbiBkb2luZyBhIENPTk5FQ1Qgd2l0aCBhIGN1c3RvbSBVc2VyLUFnZW50CiAgaGVhZGVyLCB5b3UgZ290IF90d29fIFVzZXItQWdlbnQgaGVhZGVycyBpbiB0aGUgQ09OTkVDVCByZXF1ZXN0Li4uISBBZGRlZAogIHRlc3QgY2FzZSAyODcgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDI4IEphbnVhcnkgMjAwNykKLSBjdXJsX2Vhc3lfcmVzZXQoKSBub3cgcmVzZXRzIHRoZSBDQSBidW5kbGUgcGF0aCBjb3JyZWN0bHkuCgotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIHRoZSBDdXJsIGNvbW1hbmQgbGluZSB0b29sIGZvciBIVFRQIG9uIG5vbi1BU0NJSQogIHBsYXRmb3Jtcy4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDA3KQotIEFkZGVkIHRoZSAtLWxpYmN1cmwgW2ZpbGVdIG9wdGlvbiB0byBjdXJsLiBBcHBlbmQgdGhpcyBvcHRpb24gdG8gYW55CiAgb3JkaW5hcnkgY3VybCBjb21tYW5kIGxpbmUsIGFuZCB5b3Ugd2lsbCBnZXQgYSBsaWJjdXJsLXVzaW5nIHNvdXJjZSBjb2RlCiAgd3JpdHRlbiB0byB0aGUgZmlsZSB0aGF0IGRvZXMgdGhlIGVxdWl2YWxlbnQgb3BlcmF0aW9uIG9mIHdoYXQgeW91ciBjb21tYW5kCiAgbGluZSBvcGVyYXRpb24gZG9lcyEKCkRhbiBGICgyNCBKYW51YXJ5IDIwMDcpCi0gRml4ZWQgYSBkYW5nbGluZyBwb2ludGVyIHByb2JsZW0gdGhhdCBwcmV2ZW50ZWQgdGhlIGh0dHBfcHJveHkgZW52aXJvbm1lbnQKICB2YXJpYWJsZSBmcm9tIGJlaW5nIHByb3Blcmx5IHVzZWQgaW4gbWFueSBjYXNlcyAoYW5kIGNhdXNlZCB0ZXN0IGNhc2UgNjMKICB0byBmYWlsKS4KCkRhbmllbCAoMjMgSmFudWFyeSAyMDA3KQotIERhdmlkIE1jQ3JlZWR5IGRpZCBOVExNIGNoYW5nZXMgbWFpbmx5IGZvciBub24tQVNDSUkgcGxhdGZvcm1zOgoKICAjMQogIFRoZXJlJ3MgYSBjb21waWxhdGlvbiBlcnJvciBpbiBodHRwX250bG0uYyBpZiBVU0VfTlRMTTJTRVNTSU9OIGlzIE5PVAogIGRlZmluZWQuICBJIG5vdGljZWQgdGhpcyB3aGlsZSB0ZXN0aW5nIHZhcmlvdXMgY29uZmlndXJhdGlvbnMuICBMaW5lIDg2NyBvZgogIHRoZSBjdXJyZW50IGh0dHBfbnRsbS5jIGlzIGEgY2xvc2luZyBicmFja2V0IGZvciBhbiBpZi9lbHNlIHBhaXIgdGhhdCBvbmx5CiAgZ2V0cyBjb21waWxlZCBpbiBpZiBVU0VfTlRMTTJTRVNTSU9OIGlzIGRlZmluZWQuICBCdXQgdGhpcyBjbG9zaW5nIGJyYWNrZXQKICB3YXNuJ3QgaW4gYW4gI2lmZGVmIHNvIHRoZSBjb2RlIGZhaWxzIHRvIGNvbXBpbGUgdW5sZXNzIFVTRV9OVExNMlNFU1NJT04gd2FzCiAgZGVmaW5lZC4gIExpbmVzIDE5OCBhbmQgMTQwIG9mIG15IHBhdGNoIHdyYXBzIHRoYXQgY2xvc2luZyBicmFja2V0IGluIGFuCiAgI2lmZGVmIFVTRV9OVExNMlNFU1NJT04uCgogICMyCiAgSSBub3RpY2VkIHNldmVyYWwgcGlja3kgY29tcGlsZXIgd2FybmluZ3Mgd2hlbiBERUJVR19NRSBpcyBkZWZpbmVkLiAgSSd2ZQogIGZpeGVkIHRoZW0gd2l0aCBjYXN0aW5nLiAgQnkgdGhlIHdheSwgREVCVUdfTUUgd2FzIGEgaHVnZSBoZWxwIGluCiAgdW5kZXJzdGFuZGluZyB0aGlzIGNvZGUuCgogICMzCiAgSG9wZWZ1bGx5IHRoZSBsYXN0IG5vbi1BU0NJSSBjb252ZXJzaW9uIHBhdGNoIGZvciBsaWJjdXJsIGluIGEgd2hpbGUuICBJCiAgY2hhbmdlZCB0aGUgIk5UTE1TU1AiIGxpdGVyYWwgdG8gaGV4IHNpbmNlIHRoaXMgc2lnbmF0dXJlIG11c3QgYWx3YXlzIGJlIGluCiAgQVNDSUkuCgogIENvbnZlcnNpb24gY29kZSB3YXMgc3RyYXRlZ2ljYWxseSBhZGRlZCB3aGVyZSBuZWNlc3NhcnkuICBBbmQgdGhlCiAgQ3VybF9iYXNlNjRfZW5jb2RlIGNhbGxzIHdlcmUgY2hhbmdlZCBzbyB0aGUgYmluYXJ5ICJibG9icyIgaHR0cF9udGxtLmMKICBjcmVhdGVzIGFyZSBOT1QgdHJhbnNsYXRlZCBvbiBub24tQVNDSUkgcGxhdGZvcm1zLgoKRGFuIEYgKDIyIEphbnVhcnkgMjAwNykKLSBDb252ZXJ0ZWQgKG1vc3Qgb2YpIHRoZSB0ZXN0IGRhdGEgZmlsZXMgaW50byBnZW51aW5lIFhNTC4gIEEgaGFuZGZ1bCBzdGlsbAogIGFyZSBub3QsIGR1ZSBtYWlubHkgdG8gdGhlIGxhY2sgb2Ygc3VwcG9ydCBmb3IgWE1MIGNoYXJhY3RlciBlbnRpdGllcwogIChlLmcuICYgPT4gJmFtcDsgKS4gIFRoaXMgd2lsbCBtYWtlIGl0IGVhc2llciB0byB2YWxpZGF0ZSB0ZXN0IGZpbGVzIHVzaW5nCiAgdG9vbHMgbGlrZSB4bWxsaW50LCBhcyB3ZWxsIGFzIHRvIGVkaXQgYW5kIHZpZXcgdGhlbSB1c2luZyBYTUwgdG9vbHMuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNykKLSBBcm1lbCBBc3NlbGluIGltcHJvdmVkIGxpYmN1cmwgdG8gYmVoYXZlIGEgbG90IGJldHRlciB3aGVuIGFuIGVhc3kgaGFuZGxlCiAgZG9pbmcgYW4gRlRQIHRyYW5zZmVyIGlzIHJlbW92ZWQgZnJvbSBhIG11bHRpIGhhbmRsZSBiZWZvcmUgY29tcGxldGlvbi4gVGhlCiAgZml4IGFsc28gZml4ZWQgdGhlICJhbGl2ZSBjb3VudGVyIiB0byBiZSBjb3JyZWN0IG9uICJwcmVtYXR1cmUgcmVtb3ZhbCIgZm9yCiAgYWxsIHByb3RvY29scy4KCkRhbiBGICgxNiBKYW51YXJ5IDIwMDcpCi0gRml4ZWQgYSBzbWFsbCBtZW1vcnkgbGVhayBpbiB0ZnRwIHVwbG9hZHMgZGlzY292ZXJlZCBieSBjdXJsJ3MgbWVtb3J5IGxlYWsKICBkZXRlY3Rvci4gIEFsc28gY2hhbmdlZCB0ZnRwIGRvd25sb2FkcyB0byBVUkwtdW5lc2NhcGUgdGhlIGRvd25sb2FkZWQKICBmaWxlIG5hbWUuCgpEYW5pZWwgKDE0IEphbnVhcnkgMjAwNykKLSBEYXZpZCBNY0NyZWVkeSBwcm92aWRlZCBsaWJjdXJsIGNoYW5nZXMgZm9yIGRvaW5nIEhUVFAgY29tbXVuaWNhdGlvbiBvbgogIG5vbi1BU0NJSSBwbGF0Zm9ybXMuIEl0IGRvZXMgYWRkIHNvbWUgY29tcGxleGl0eSwgbW9zdCBub3RhYmx5IHdpdGggbW9yZQogICNpZmRlZnMsIGJ1dCBJIHdhbnQgdG8gc2VlIHRoaXMgc3VwcG9ydGVkIGFkZGVkIGFuZCBJIGNhbid0IHNlZSBob3cgd2UgY2FuCiAgYWRkIGl0IHdpdGhvdXQgdGhlIGV4dHJhIHN0dWZmIGFkZGVkLgoKLSBTZXR0aW5nIENVUkxPUFRfQ09PS0lFTElTVCB0byAiQUxMIiB3aGVuIG5vIGNvb2tpZXMgYXQgYWxsIHdhcyBwcmVzZW50LAogIGxpYmN1cmwgd291bGQgY3Jhc2ggd2hlbiB0cnlpbmcgdG8gcmVhZCBhIE5VTEwgcG9pbnRlci4KCkRhbmllbCAoMTIgSmFudWFyeSAyMDA3KQotIFRvYnkgUGV0ZXJzb24gZm91bmQgYSBuYXN0eSBidWcgdGhhdCBwcmV2ZW50ZWQgKGxpYiljdXJsIGZyb20gcHJvcGVybHkKICBkb3dubG9hZGluZyAobW9zdCkgdGhpbmdzIHRoYXQgd2VyZSBsYXJnZXIgdGhhbiA0R0Igb24gMzIgYml0IHN5c3RlbXMuICBNYXR0CiAgV2l0aGVyc3Bvb24gaGVscGVkIGFzIG5hcnJvdyBkb3duIHRoZSBwcm9ibGVtLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwNykKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIGludHJvZHVjZWQgdGhlIC0tZnRwLXNzbC1jY2MgY29tbWFuZCBsaW5lIG9wdGlvbiB0bwogIGN1cmwgdGhhdCB1c2VzIHRoZSBuZXcgQ1VSTE9QVF9GVFBfU1NMX0NDQyBvcHRpb24gaW4gbGliY3VybC4gSWYgZW5hYmxlZCwgaXQKICB3aWxsIG1ha2UgbGliY3VybCBzaHV0ZG93biBTU0wvVExTIGFmdGVyIHRoZSBhdXRoZW50aWNhdGlvbiBpcyBkb25lIG9uIGEKICBGVFAtU1NMIG9wZXJhdGlvbi4KCkRhbmllbCAoNCBKYW51YXJ5IDIwMDcpCi0gRGF2aWQgTWNDcmVlZHkgbWFkZSBjaGFuZ2VzIHRvIGFsbG93IGJhc2U2NCBlbmNvZGluZy9kZWNvZGluZyB0byB3b3JrIG9uCiAgbm9uLUFTQ0lJIHBsYXRmb3Jtcy4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDcpCi0gTWF0dCBXaXRoZXJzcG9vbiBmaXhlZCB0aGUgZmxhdyB3aGljaCBtYWRlIGxpYmN1cmwgNy4xNi4wIGFsd2F5cyBzdG9yZQogIGRvd25sb2FkZWQgZGF0YSBpbiB0d28gYnVmZmVycywganVzdCB0byBiZSBhYmxlIHRvIGRlYWwgd2l0aCBhIHNwZWNpYWwgSFRUUAogIHBpcGVsaW5pbmcgY2FzZS4gVGhhdCBpcyBub3cgb25seSBhY3RpdmF0ZWQgZm9yIHBpcGVsaW5lZCB0cmFuc2ZlcnMuIEluCiAgTWF0dCdzIGNhc2UsIGl0IHNob3dlZCBhcyBhIGNvbnNpZGVyYWJsZSBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlLAoKRGFuaWVsICgyIEphbnVhcnkgMjAwNykKLSBWaWN0b3IgU25lemhrbyBoZWxwZWQgdXMgZml4IGJ1ZyByZXBvcnQgIzE2MDM3MTIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwMzcxMikgKGtub3duIGJ1ZyAjMzYpIC0tbGltaXQtcmF0ZQogIChDVVJMT1BUX01BWF9TRU5EX1NQRUVEX0xBUkdFIGFuZCBDVVJMT1BUX01BWF9SRUNWX1NQRUVEX0xBUkdFKSBhcmUgYnJva2VuCiAgb24gV2luZG93cyAoc2luY2UgNy4xNi4wLCBidXQgdGhhdCdzIHdoZW4gdGhleSB3ZXJlIGludHJvZHVjZWQgYXMgcHJldmlvdXMKICB0byB0aGF0IHRoZSBsaW1pdGluZyBsb2dpYyB3YXMgbWFkZSBpbiB0aGUgYXBwbGljYXRpb24gb25seSBhbmQgbm90IGluIHRoZQogIGxpYnJhcnkpLiBJdCB3YXMgYWN0dWFsbHkgYWxzbyBicm9rZW4gb24gc2VsZWN0KCktYmFzZWQgc3lzdGVtcyAoYXMgYXBwb3NlZAogIHRvIHBvbGwoKSkgYnV0IHdlIGhhdmVuJ3QgaGFkIGFueSBzdWNoIHJlcG9ydHMuIFdlIG5vdyB1c2Ugc2VsZWN0KCksIFNsZWVwKCkKICBvciBkZWxheSgpIHByb3Blcmx5IHRvIHNsZWVwIGEgd2hpbGUgd2l0aG91dCB3YWl0aW5nIGZvciBhbnl0aGluZyBpbnB1dCBvcgogIG91dHB1dCB3aGVuIHRoZSByYXRlIGxpbWl0aW5nIGlzIGFjdGl2YXRlZCB3aXRoIHRoZSBlYXN5IGludGVyZmFjZS4KCi0gTW9kaWZpZWQgbGliY3VybC5wYy5pbiB0byB1c2UgTGlicy5wcml2YXRlIGZvciB0aGUgbGlicyBsaWJjdXJsIGl0c2VsZiBuZWVkcwogIHRvIGdldCBidWlsdCBzdGF0aWMuIEl0IGhhcyBiZWVuIG1lbnRpb25lZCBiZWZvcmUgYW5kIHdhcyBhZ2FpbiBicm91Z2h0IHRvCiAgb3VyIGF0dGVudGlvbiBieSBOYXRoYW5hZWwgTmVyb2RlIHdobyBmaWxlZCBkZWJpYW4gYnVnIHJlcG9ydCAjNDA1MjI2CiAgKGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz00MDUyMjYpLgoK