ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkIENoYW5nZWxvZwoKQ2hhbmdlcyBkb25lIHRvIGN1cmwgYW5kIGxpYmN1cmwgZnJvbSAxOTk3IHRvIDIwMDguIFRoZSBtb3N0IHJlY2VudCBjaGFuZ2VzIGFyZQphbHdheXMga2VwdCBpbiB0aGUgQ0hBTkdFUyBmaWxlLgoKVmVyc2lvbiA3LjE5LjIgKDEzIE5vdmVtYmVyIDIwMDgpCgpNaWNoYWwgTWFyZWsgKDEzIE5vdiAyMDA4KQotIEZpeGVkIGEgcG90ZW50aWFsIGRhdGEgbG9zcyBpbiBDdXJsX2NsaWVudF93cml0ZSgpIHdoZW4gdGhlIHRyYW5zZmVyIGlzCiAgcGF1c2VkLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBOb3YgMjAwOCkKLSBSYWluZXIgQ2FuYXZhbiBmaWxlZCBidWcgIzIyNTU2MjcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjI1NTYyNykgd2hpY2ggcG9pbnRlZCBvdXQgdGhhdCBhCiAgcHJvZ3JhbSB1c2luZyBsaWJjdXJsJ3MgbXVsdGkgaW50ZXJmYWNlIHRvIGRvd25sb2FkIGEgSFRUUFMgcGFnZSB3aXRoIGEKICBsaWJjdXJsIGJ1aWx0IHBvd2VyZWQgYnkgT3BlblNTTCwgd291bGQgZWFzaWx5IGdldCBzaWxseSBhbmQgaW5zdGVhZCBoYW5kCiAgb3ZlciBTU0wgZGV0YWlscyBhcyBkYXRhIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBIVFRQIGhlYWRlcnMgYW5kIGJvZHkuIFRoaXMKICBoYXBwZW5lZCBiZWNhdXNlIGxpYmN1cmwgd291bGQgY29uc2lkZXIgdGhlIGNvbm5lY3Rpb24gaGFuZHNoYWtlIGRvbmUgdG9vCiAgZWFybHkuIFRoaXMgcHJvYmxlbSB3YXMgaW50cm9kdWNlZCBhdCBTZXB0ZW1iZXIgMjJuZCAyMDA4IHdpdGggbXkgZml4IG9mIHRoZQogIGJ1ZyAjMjEwNzM3NwoKICBUaGUgY29ycmVjdCBmaXggaXMgbm93IGluc3RlYWQgZG9uZSB3aXRoaW4gdGhlIEdudVRMUy1oYW5kbGluZyBjb2RlLCBhcyBib3RoCiAgdGhlIE9wZW5TU0wgYW5kIHRoZSBOU1MgY29kZSBhbHJlYWR5IGRlYWwgd2l0aCB0aGlzIHNpdHVhdGlvbiBpbiBzaW1pbGFyCiAgZmFzaGlvbi4gSSBhZGRlZCB0ZXN0IGNhc2UgNTYwIGluIGFuIGF0dGVtcHQgdG8gdmVyaWZ5IHRoaXMgZml4LCBidXQKICB1bmZvcnR1bmF0ZWx5IGl0IGRpZG4ndCB0cmlnZ2VyIGl0IGV2ZW4gYmVmb3JlIHRoaXMgZml4IQoKWWFuZyBUc2UgKDExIE5vdiAyMDA4KQotIFJlbGF0ZWQgd2l0aCBidWcgIzIyMzA1MzUgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIyMzA1MzUpCiAgRGFuaWVsIEZhbmRyaWNoIG5vdGljZWQgdGhhdCBjdXJsX2FkZHJpbmZvIHdhcyBhbHNvIG1pc3NpbmcgaW4gdGhlIGJ1aWxkCiAgcHJvY2VzcyBvZiBvdGhlciBmb3VyIG5vbi1jb25maWd1cmUgcGxhdGZvcm1zLiBBZGRlZCBub3cuCgpEYW5pZWwgRmFuZHJpY2ggKDcgTm92IDIwMDgpCi0gVGhlIGdldGlmYWRkcnMoKSB2ZXJzaW9uIG9mIEN1cmxfaWYyaXAoKSBjcmFzaGVkIHdoZW4gdXNlZCBvbiBhIExpbnV4CiAgc3lzdGVtIHdpdGggYSBURVFMIGxvYWQtYmFsYW5jaW5nIGRldmljZSBjb25maWd1cmVkLCB3aGljaCBkb2Vzbid0CiAgaGF2ZSBhbiBhZGRyZXNzLiAgVGhhbmtzIHRvIEFkYW0gU2FtcHNvbiBmb3Igc3BvdHRpbmcgdGhpcyAoYnVnICMyMjM0OTIzKS4KCllhbmcgVHNlICg2IE5vdiAyMDA4KQotIE1lcmdlZCBleGlzdGluZyBJUHY0IGFuZCBJUHY2IEN1cmxfaXAyYWRkciBmdW5jdGlvbnMgaW50byBhIHNpbmdsZSBvbmUKICB3aGljaCBub3cgYWxzbyB0YWtlcyBhIHByb3RvY29sIGFkZHJlc3MgZmFtaWx5IGFyZ3VtZW50LgoKLSBCdWcgIzIyMzA1MzUgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIyMzA1MzUpIHBvaW50ZWQgb3V0IGEKICBwcm9ibGVtIHdpdGggTVNWQyA2IG1ha2VmaWxlIHRoYXQgY2F1c2VkIGEgYnVpbGQgZmFpbHVyZS4gSXQgd2FzIG5vdGVkIHRoYXQKICB0aGUgY3VybF9hZGRyaW5mby5vYmogcmVmZXJlbmNlIHdhcyBtaXNzaW5nLiBJIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvIHNvcnQKICB0aGUgbGlzdCBpbiB3aGljaCB0aGlzIHdhcyBtaXNzaW5nLiBJc3N1ZSBzdWJtaXR0ZWQgYnkgSm9obiBXaWxraW5zb24uCgpWZXJzaW9uIDcuMTkuMSAoNSBOb3ZlbWJlciAyMDA4KQoKRGFuaWVsIFN0ZW5iZXJnICg0IE5vdiAyMDA4KQotIENVUkxJTkZPX0ZJTEVUSU1FIG5vdyB3b3JrcyBmb3IgZmlsZTovLyB0cmFuc2ZlcnMgYXMgd2VsbAoKRGFuaWVsIFN0ZW5iZXJnICgzIE5vdiAyMDA4KQotIEJ1ZyAjMjIxODQ4MCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjIxODQ4MCkgcG9pbnRlZCBvdXQgYQogIHByb2JsZW0gd2l0aCBteSBDVVJMSU5GT19QUklNQVJZX0lQIGZpeCBmcm9tIE9jdG9iZXIgN3RoIHRoYXQgY2F1c2VkIGEgTlVMTAogIHBvaW50ZXIgcmVhZC4gSSBhbHNvIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvIGNsZWFuIHVwIHRoaXMgbG9naWMgKHN0b3Jpbmcgb2YKICB0aGUgY29ubmVjdGlvbidzIElQIGFkZHJlc3MpIHNvbWV3aGF0IGFzIHdlIGhhZCBpdCBzdG9yZWQgaW4gdHdvIGRpZmZlcmVudAogIHBsYWNlcyBhbmQgd2F5cyBwcmV2aW91c2x5IGFuZCB0aGV5IGFyZSBub3cgdW5pZmllZC4KCllhbmcgVHNlICgzIE5vdiAyMDA4KQotIEZpeCB1bmRlcnNpemVkIElQdjYgYWRkcmVzcyBpbnRlcm5hbCBidWZmZXIuIElQdjYgYWRkcmVzcyBzdHJpbmdzIGxvbmdlcgogIHRoYW4gMzUgY2hhcmFjdGVycyB3b3VsZCBiZSB0cnVuY2F0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDIgTm92IDIwMDgpCi0gRGFuaWVsIEpvaG5zb24gcmVwb3J0ZWQgYW5kIGZpeGVkOgoKICBXaGVuIGMtYXJlcyBpc24ndCBlbmFibGVkLCBsaWJjdXJsIGJ5IGRlZmF1bHQgY2FsbHMgZ2V0YWRkcmluZm8gd2l0aCBmYW1pbHkKICBzZXQgdG8gUEZfVU5TUEVDIHdoaWNoIGNhdXNlcyBnZXRhZGRyaW5mbyB0byByZXR1cm4gYWxsIGF2YWlsYWJsZSBhZGRyZXNzZXMsCiAgYm90aCBJUHY0IGFuZCBJUHY2LiBMaWJjdXJsIHRoZW4gdHJpZXMgZWFjaCBvbmUgdW50aWwgaXQgY2FuIGNvbm5lY3QuIElmIHRoZQogIG5ldCBjb25uZWN0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBJUHY2LCBsaWJjdXJsIGNhbiBzdGlsbCBmYWxsIGJhY2sgdG8gSVB2NC4KCiAgSG93ZXZlciwgc2luY2UgYy1hcmVzIGRvZXNuJ3Qgc3VwcG9ydCBQRl9VTlNQRUMsIHdoZW4gaXQncyB1c2VkIGl0IGRlZmF1bHRzCiAgdG8gdXNpbmcgZmFtaWx5PVBGX0lORVQ2IGFuZCB0aGVyZWZvcmUgb25seSByZXR1cm5zIElQdjYgYWRkcmVzc2VzIHdoZW4gQUFBQQogIHJlY29yZHMgYXJlIGF2YWlsYWJsZSwgZXZlbiBpZiBJUHY0IGFkZHJlc3NlcyBhcmUgYWxzbyBhdmFpbGFibGUuIFRoZSBlZmZlY3QKICBpcyB0aGF0IHNpbmNlIG15IElTUCBkb2Vzbid0IGRvIElQdjYsIGxpYmN1cmwgY2FuJ3QgY29ubmVjdCBhdCBhbGwgdG8gYSBzaXRlCiAgdGhhdCBoYXMgQUFBQSByZWNvcmRzLiBJdCB3aWxsIHdvcmsgaWYgSSBleHBsaWNpdGx5IHVzZSBDVVJMX0lQUkVTT0xWRV9WNCBvcgogIC0taXB2NCB3aXRoIHRoZSBjdXJsIHRvb2wuIEkgZGlzY292ZXJlZCB0aGlzIHdoZW4gY3VybCB3b3VsZCBmYWlsIHRvIGNvbm5lY3QKICB0byBzZWVtaW5nbHkgcmFuZG9tIHNpdGVzLiBJdCB0dXJucyBvdXQgdGhleSB3ZXJlbid0IHJhbmRvbSwgdGhleSB3ZXJlIHNpdGVzCiAgd2l0aCBBQUFBIHJlY29yZHMuCgogIFNvIG5vdyBsaWJjdXJsIGRlZmF1bHRzIHRvIFBGX0lORVQuLi4gdW50aWwgYy1hcmVzIGhhcyBiZWVuIHRvdWdodCB0byBvZmZlcgogIGJvdGguCgpZYW5nIFRzZSAoMzEgT2N0IDIwMDgpCi0gVGVzdHMgNTU4IGFuZCA1NTkgYXJlIHN0YWJpbGl6ZWQuIFRoZXNlIHR3byB0ZXN0cyB3ZXJlIGluaXRpYWxseSBpbnRyb2R1Y2VkCiAgdG8gYWlkIGluIHRoZSBsb2NhdGlvbiBvZiBhIHNlZy1mYXVsdCB3aGljaCB3YXMgb25seSB0cmlnZ2VyZWQgb24gbm9uLWRlYnVnCiAgYnVpbGRzIGRvbmUgd2l0aCB0aGUgaWNjIDkuMSBJbnRlbCBjb21waWxlci4gVGVzdCA1NTggZG9lcyBub3QgdHJpZ2dlciB0aGUKICBwcm9ibGVtLCBidXQgdGVzdCA1NTkgZG9lcyB0cmlnZ2VyIGl0LiBBcyBvZiB0b2RheSwgaXQgaXNuJ3QgeWV0IGFic29sdXRlbHkKICBjbGVhciBpZiBpdCBpcyBhIGNvbXBpbGVyIG9wdGltaXplciBpc3N1ZSBvciBhIG1lbW9yeSBjb3JydXB0aW9uIG9uZS4KCllhbmcgVHNlICgzMCBPY3QgMjAwOCkKLSBVc2Ugb3VyIEN1cmxfYWRkcmluZm8gc3RydWN0dXJlIGRlZmluaXRpb24gdG8gaGFuZGxlIGFkZHJlc3MgaW5mbyBkYXRhIGV2ZW4KICB3aGVuIGEgc3lzdGVtIGFkZHJpbmZvIHN0cnVjdCBpcyBhdmFpbGFibGUuIFByb3ZpZGUgYW5kIHVzZSBhIHdyYXBwZXIgYXJvdW5kCiAgc3lzdGVtcyBnZXRhZGRyaW5mbyBmdW5jdGlvbiwgQ3VybF9nZXRhZGRyaW5mb19leCB3aGljaCByZXR1cm5zIGEgcG9pbnRlciB0bwogIGEgbGlzdCBvZiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgQ3VybF9hZGRyaW5mbyBzdHJ1Y3RzLgoKICBDb25maWd1cmUgd2lsbCBjaGVjayBmcmVlYWRkcmluZm8gYW5kIGdldGFkZHJpbmZvIGZ1bmN0aW9ucyBhbmQgZGVmaW5lCiAgcHJlcHJvY2Vzc29yIHN5bWJvbHMgSEFWRV9GUkVFQUREUklORk8gYW5kIEhBVkVfR0VUQUREUklORk8gd2hlbiBhcHByb3ByaWF0ZS4KCkRhbmllbCBGYW5kcmljaCAoMjkgT2N0IDIwMDgpCi0gRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgYSBmZXcgYnl0ZXMgb2YgZ2FyYmFnZSB0byBiZSBzZW50IGFmdGVyIGEKICBjdXJsX2Vhc3lfcGF1c2UoKSBkdXJpbmcgYSBjaHVua3kgdXBsb2FkLiBSZXBvcnRlZCBieSBTdGV2ZSBSb3Nrb3dza2kuCgpEYW5pZWwgRmFuZHJpY2ggKDI4IE9jdCAyMDA4KQotIENoYW5nZWQgdGhlICJyZXNvbHZlIiB0ZXN0IHByZWNoZWNrIHByb2dyYW0gdG8gdmVyaWZ5IHRoYXQgYW4gSVB2NiBzb2NrZXQKICBjYW4gYmUgY3JlYXRlZCBiZWZvcmUgcmVzb2x2aW5nIHRoZSBJUHY2IG5hbWUuICBJbiB0aGUgY29udGV4dCBvZiBydW5uaW5nCiAgYSB0ZXN0LCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcnVuIGFuIElQdjYgdGVzdCB3aGVuIGEgaG9zdCBpcyByZXNvbHZhYmxlCiAgYnV0IElQdjYgaXNuJ3QgdXNhYmxlLiAgVGhpcyBzaG91bGQgZml4IGZhaWx1cmVzIG9mIHRlc3QgMTA4NSBvbiBob3N0cyB3aXRoCiAgbGlicmFyeSBhbmQgRE5TIHN1cHBvcnQgZm9yIElQdjYgYnV0IHdoZXJlIGFjdHVhbCB1c2Ugb2YgSVB2NiBoYXMgYmVlbgogIGFkbWluaXN0cmF0aXZlbHkgZGlzYWJsZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDI0IE9jdCAyMDA4KQotIEFkZGVkIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB6bGliIGFuZCBPcGVuU1NMIG9uIFN5bWJpYW4gT1MuCgpEYW5pZWwgRmFuZHJpY2ggKDIxIE9jdCAyMDA4KQotIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCBTRlRQIHJhbmdlIHN1cHBvcnQgdG8gZml4IHRlc3QgY2FzZXMgNjM0IHRocm91Z2gKICA2MzcuCgpEYW5pZWwgRmFuZHJpY2ggKDE3IE9jdCAyMDA4KQotIEZpeGVkIGEgY29tcGlsZSBlcnJvciByZXBvcnRlZCBieSBBbGJlcnQgQ2hpbiBvbiBBSVggYW5kIElSSVggd2hlbiB1c2luZwogIEdUTFMuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IE9jdCAyMDA4KQotIElnb3IgTm92b3NlbHRzZXYgYWRkZWQgQ1VSTE9QVF9QUk9YWVVTRVIgYW5kIENVUkxPUFRfUFJPWFlQQVNTV09SRCB0aGF0IHRoZW4KICBtYWtlIENVUkxPUFRfUFJPWFlVU0VSUFdEIHNvcnQgb2YgZGVwcmVjYXRlZC4gVGhlIHByaW1hcnkgbW90aXZlIGZvciBhZGRpbmcKICB0aGVzZSBuZXcgb3B0aW9ucyBpcyB0aGF0IHRoZXkgaGF2ZSBubyBwcm9ibGVtcyB3aXRoIHRoZSBjb2xvbiBzZXBhcmF0b3IKICB0aGF0IHRoZSBDVVJMT1BUX1BST1hZVVNFUlBXRCBvcHRpb24gZG9lcy4KCkRhbmllbCBTdGVuYmVyZyAoMTUgT2N0IDIwMDgpCi0gUGFzY2FsIFRlcmphbiBmaWxlZCBidWcgIzIxNTQ2MjcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjE1NDYyNykgd2hpY2ggcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsCiAgdXNlcyBzdHJjYXNlY21wKCkgaW4gbXVsdGlwbGUgcGxhY2VzIHdoZXJlIGl0IGNhdXNlcyBmYWlsdXJlcyB3aGVuIHRoZQogIFR1cmtpc2ggbG9jYWxlIGlzIHVzZWQuIFRoaXMgaXMgYmVjYXVzZSAnaScgYW5kICdJJyBpc24ndCB0aGUgc2FtZSBsZXR0ZXIgc28KICBzdHJjYXNlY21wKCkgb24gdGhvc2UgbGV0dGVycyBhcmUgZGlmZmVyZW50IGluIFR1cmtpc2ggdGhhbiBpbiBFbmdsaXNoIChvcgogIGp1c3QgYWJvdXQgYWxsIG90aGVyIGxhbmd1YWdlcykuIEkgdGh1cyBpbnRyb2R1Y2VkIGEgdG90YWxseSBuZXcgaW50ZXJuYWwKICBmdW5jdGlvbiBpbiBsaWJjdXJsIChjYWxsZWQgQ3VybF9yYXdfZXF1YWwpIGZvciBkb2luZyBjYXNlIGluc2VudGl2ZQogIGNvbXBhcmlzb25zIGZvciBlbmdsaXNoLShhc2NpaT8pIHN0eWxlIHN0cmluZ3MgdGhhdCB0aHVzIHdpbGwgbWFrZSAiZmlsZSIKICBhbmQgIkZJTEUiIG1hdGNoIGV2ZW4gaWYgdGhlIFR1cmtpc2ggbG9jYWxlIGlzIHNlbGVjdGVkLgoKRGFuaWVsIEZhbmRyaWNoICgxNSBPY3QgMjAwOCkKLSBBIDxwcmVjaGVjaz4gY29tbWFuZCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgZmFpbGVkIGlmIGl0IHJldHVybnMgYSBub24temVybwogIHJldHVybiBjb2RlLiAgVGhpcyB3YXksIGlmIHRoZSBwcmVjaGVjayBjb21tYW5kIGNhbid0IGJlIHJ1biBhdCBhbGwgZm9yCiAgd2hhdGV2ZXIgcmVhc29uLCBpdCdzIHRyZWF0ZWQgYXMgYSBwcmVjaGVjayBmYWlsdXJlIHdoaWNoIGNhdXNlcyB0aGUKICB0ZXN0IHRvIGJlIHNraXBwZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDE1IE9jdCAyMDA4KQotIEpvaG4gV2lsa2luc29uIGZpbGVkIGJ1ZyAjMjE1NTQ5NgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTU1NDk2KSBwb2ludGluZyBvdXQgYW4gZXJyb3IgY2FzZQogIHdpdGhvdXQgYSBwcm9wZXIgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4gV2hlbiBhIHJlYWQgY2FsbGJhY2sgcmV0dXJucwogIGEgdG9vIGxhcmdlIHZhbHVlIChsaWtlIHdoZW4gdHJ5aW5nIHRvIHJldHVybiBhIG5lZ2F0aXZlIG51bWJlcikgaXQgd291bGQKICB0cmlnZ2VyIGFuZCB0aGUgZ2VuZXJpYyBlcnJvciBtZXNzYWdlIHRoZW4gbWFrZXMgdGhlIHByb3BsZW0gc2xpZ2h0bHkKICBkaWZmZXJlbnQgdG8gdHJhY2sgZG93bi4gSSd2ZSBhZGRlZCBhbiBlcnJvciBtZXNzYWdlIGZvciB0aGlzIG5vdy4KCkRhbmllbCBGYW5kcmljaCAoOSBPY3QgMjAwOCkKLSBGaXhlZCB0aGUgLS1pbnRlcmZhY2Ugb3B0aW9uIHRvIHdvcmsgd2l0aCBJUHY2IGNvbm5lY3Rpb25zIG9uIGdsaWJjCiAgc3lzdGVtcyBzdXBwb3J0aW5nIGdldGlmYWRkcnMoKS4gQWxzbyBmaXhlZCBhIHByb2JsZW0gd2hlcmUgYW4gSVB2NgogIGFkZHJlc3MgY291bGQgYmUgY2hvc2VuIGluc3RlYWQgb2YgYW4gSVB2NCBvbmUgZm9yIC0taW50ZXJmYWNlIHdoZW4gaXQKICBpbnZvbHZlZCBhIG5hbWUgbG9va3VwLgoKRGFuaWVsIEZhbmRyaWNoICg4IE9jdCAyMDA4KQotIEFkZGVkIHRlc3RzIDEwODIgdGhyb3VnaCAxMDg1IHRvIHRlc3Qgc3ltYm9saWMgLS1pbnRlcmZhY2UgcGFyYW1ldGVycwoKLSBBZGRlZCB0ZXN0cyA2MzMgdGhyb3VnaCA2MzcgdG8gdGVzdCB0aGUgbmV3IGZpbGUgcmFuZ2Ugc3VwcG9ydCBmb3IgU0ZUUC4KICBBbGwgYnV0IHRoZSBmaXJzdCB0ZXN0IGNhdXNlIGFuIGluZmluaXRlIGxvb3Agb3Igb3RoZXIgZmFpbHVyZSBhbmQgc28KICBhcmUgYWRkZWQgdG8gRElTQUJMRUQuCgpEYW5pZWwgU3RlbmJlcmcgKDggT2N0IDIwMDgpCi0gSm9obiBXaWxraW5zb24gZmlsZWQgYnVnICMyMTUyMjcwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIxNTIyNzApIHdoaWNoIGlkZW50aWZpZWQgYW5kIGZpeGVkIGEKICBDVVJMSU5GT19SRURJUkVDVF9VUkwgbWVtb3J5IGxlYWsgYW5kIGFuIGFkZGl0aW9uYWwgd3JvbmctZG9pbmc6CgogIEFueSBzdWJzZXF1ZW50IHRyYW5zZmVyIHdpdGggYSByZWRpcmVjdCBsZWFrcyBtZW1vcnksIGV2ZW50dWFsbHkgY3Jhc2hpbmcKICB0aGUgcHJvY2VzcyBwb3RlbnRpYWxseS4KCiAgQW55IHN1YnNlcXVlbnQgdHJhbnNmZXIgV0lUSE9VVCBhIHJlZGlyZWN0IGNhdXNlcyB0aGUgbW9zdCByZWNlbnQgcmVkaXJlY3QKICB0aGF0IERJRCBvY2N1ciBvbiBzb21lIHByZXZpb3VzIHRyYW5zZmVyIHRvIHN0aWxsIGJlIHJlcG9ydGVkLgoKLSBJZ29yIE5vdm9zZWx0c2V2IGZpbGVkIGJ1ZyAjMjExMTYxMwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTExNjEzKSB0aGF0IGV2ZW50dWFsbHkgaWRlbnRpZmllZCBhCiAgZmxhdyBpbiBob3cgdGhlIG11bHRpX3NvY2tldCBpbnRlcmZhY2UgaW4gc29tZSBjYXNlcyBtaXNzZWQgdG8gY2FsbCB0aGUKICB0aW1lb3V0IGNhbGxiYWNrIHdoZW4gZWFzeSBpbnRlcmZhY2VzIGFyZSByZW1vdmVkIGFuZCBhZGRlZCB3aXRoaW4gdGhlIHNhbWUKICBtaWxsaXNlY29uZC4KCi0gSWdvciBOb3Zvc2VsdHNldiBicm91Z2h0IGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIHR3byBuZXcgb3B0aW9ucyB0bwogIGN1cmxfZWFzeV9zZXRvcHQ6IENVUkxPUFRfVVNFUk5BTUUgYW5kIENVUkxPUFRfUEFTU1dPUkQgdGhhdCBzb3J0IG9mCiAgZGVwcmVjYXRlcyB0aGUgZ29vZCBvbGQgQ1VSTE9QVF9VU0VSUFdEIHNpbmNlIHRoZXkgYWxsb3cgYXBwbGljYXRpb25zIHRvIHNldAogIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGluZGVwZW5kZW50bHkgYW5kIHBlcmhhcHMgbW9yZSBpbXBvcnRhbnRseSBhbGxvdwogIGJvdGggdG8gY29udGFpbiBjb2xvbihzKSB3aGljaCBDVVJMT1BUX1VTRVJQV0QgZG9lc24ndCBmdWxseSBzdXBwb3J0LgoKRGFuaWVsIEZhbmRyaWNoICg3IE9jdCAyMDA4KQotIENoYW5nZWQgdGhlIGhhbmRsaW5nIG9mIHJlYWQvd3JpdGUgZXJyb3JzIGluIEN1cmxfcGVyZm9ybSgpIHRvIGFsbG93IGEKICBhIGZyZXNoIGNvbm5lY3Rpb24gdG8gYmUgbWFkZSBpbiBzdWNoIGNhc2VzIGFuZCB0aGUgcmVxdWVzdCByZXRyYW5zbWl0dGVkLgogIFRoaXMgc2hvdWxkIGZpeCB0ZXN0IGNhc2UgMTYwLiAgQWRkZWQgdGVzdCBjYXNlIDEwNzkgaW4gYW4gYXR0ZW1wdCB0bwogIHRlc3QgYSBzaW1pbGFyIGNvbm5lY3Rpb24gZHJvcHBpbmcgc2NlbmFyaW8sIGJ1dCBhcyBhIHJhY2UgY29uZGl0aW9uLCBpdCdzCiAgaGFyZCB0byB0ZXN0IHJlbGlhYmx5LgoKLSBDcmVhdGVkIHRlc3QgY2FzZXMgMTA4MCBhbmQgMTA4MSB0byByZXByb2R1Y2UgYSBwcm9ibGVtIG9mCiAgQ1VSTElORk9fUkVESVJFQ1RfVVJMIGxlYWtpbmcgbWVtb3J5IGFuZCByZXR1cm5pbmcgaW5jb3JyZWN0IHJlc3VsdHMgd2hlbgogIHR3byBVUkxzIGFyZSByZXF1ZXN0ZWQuIFJlcG9ydGVkIGJ5IHZtcGRlbW8gaW4gYnVnICMyMTUyMjcwCgpEYW5pZWwgU3RlbmJlcmcgKDcgT2N0IDIwMDgpCi0gRml4ZWQgQ1VSTElORk9fUFJJTUFSWV9JUDogV2hlbiBsaWJjdXJsIGNyZWF0ZWQgYSBjb25uZWN0aW9uIHRvIGhvc3QgQSB0aGVuCiAgdGhlIGFwcCByZS11c2VkIHRoZSBoYW5kbGUgdG8gZG8gYSBjb25uZWN0aW9uIHRvIGhvc3QgQiBhbmQgdGhlbiBhZ2FpbgogIHJlLXVzZWQgdGhlIGhhbmRsZSB0byBob3N0IEEsIGl0IHdvdWxkIG5vdCB1cGRhdGUgdGhlIGluZm8gd2l0aCBob3N0IEEncyBJUAogIGFkZHJlc3MgKGR1ZSB0byB0aGUgY29ubmVjdGlvbiBiZWluZyByZS11c2VkKSBidXQgaXQgd291bGQgaW5zdGVhZCByZXBvcnQKICB0aGUgaW5mbyBmcm9tIGhvc3QgQi4KCllhbmcgVHNlICg3IE9jdCAyMDA4KQotIEFkZGVkIC0tZW5hYmxlLW9wdGltaXplIGNvbmZpZ3VyZSBvcHRpb24gdG8gZW5hYmxlIGFuZCBkaXNhYmxlIGNvbXBpbGVyCiAgb3B0aW1pemF0aW9ucyB0byBhbGxvdyBkZWNvdXBsZWQgc2V0dGluZyBmcm9tIC0tZW5hYmxlLWRlYnVnLgoKWWFuZyBUc2UgKDIgT2N0IDIwMDgpCi0gQWRkZWQgLS1lbmFibGUtd2FybmluZ3MgY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUgYW5kIGRpc2FibGUgc3RyaWN0CiAgY29tcGlsZXIgd2FybmluZ3MgdG8gYWxsb3cgZGVjb3VwbGVkIHNldHRpbmcgZnJvbSAtLWVuYWJsZS1kZWJ1Zy4KCiAgcnVudGVzdHMucGwgd2lsbCBub3cgcnVuIHdpdGggcGlja3kgY29tcGlsZXIgd2FybmluZ3MgZW5hYmxlZCB1bmxlc3MKICBleHBsaWNpdGx5IGRpc2FibGVkLgoKRGFuaWVsIEZhbmRyaWNoICgxIE9jdCAyMDA4KQotICJtYWtlIGNsZWFuIiBub3cgY2xlYW5zIG91dCB0aGUgZG9jcyBhbmQgdGVzdHMgZGlyZWN0b3JpZXMsIHRvby4KCkRhbmllbCBTdGVuYmVyZyAoMzAgU2VwIDIwMDgpCi0gVGhlIGxpYmN1cmwgRlRQIGNvZGUgbm93IHJldHVybnMgQ1VSTEVfUkVNT1RFX0ZJTEVfTk9UX0ZPVU5EIGVycm9yIHdoZW4gU0laRQogIGdldHMgYSA1NTAgcmVzcG9uc2UgYmFjayBmb3IgdGhlIGNhc2VzIHdoZXJlIGEgZG93bmxvYWQgKG9yIE5PQk9EWSkgaXMKICB3YW50ZWQuIEl0IHN0aWxsIGFsbG93cyBhIDU1MCBhcyByZXNwb25zZSBpZiB0aGUgU0laRSBpcyB1c2VkIGFzIHBhcnQgb2YgYW4KICB1cGxvYWQgcHJvY2VzcyAobGlrZSBpZiByZXN1bWluZyBhbiB1cGxvYWQgaXMgcmVxdWVzdGVkIGFuZCB0aGUgZmlsZSBpc24ndAogIHRoZXJlIGJlZm9yZSB0aGUgdXBsb2FkKS4gSSBhbHNvIG1vZGlmaWVkIHRoZSBGVFAgdGVzdCBzZXJ2ZXIgYW5kIGEgZmV3IHRlc3QKICBjYXNlcyBhY2NvcmRpbmdseSB0byBtYXRjaCB0aGlzIG1vZGlmaWVkIGJlaGF2aW9yLgoKRGFuaWVsIFN0ZW5iZXJnICgyOSBTZXAgMjAwOCkKLSBEYW5pZWwgRWdnZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFsbG93cyB5b3UgdG8gZGlzYWJsZSBwcm94eSBzdXBwb3J0IGluCiAgbGliY3VybCB0byBzb21ld2hhdCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGJpbmFyeS4gUnVuIGNvbmZpZ3VyZQogIC0tZGlzYWJsZS1wcm94eS4KCkRhbmllbCBGYW5kcmljaCAoMjkgU2VwIDIwMDgpCi0gTW92ZWQgYWxsIHNpZ25hbC1iYXNlZCBuYW1lIHJlc29sdXRpb24gdGltZW91dCBoYW5kbGluZyBpbnRvIGEgc2luZ2xlIG5ldwogIEN1cmxfcmVzb2x2X3RpbWVvdXQgZnVuY3Rpb24gdG8gcmVkdWNlIGNvdXBsaW5nLgoKRGFuaWVsIFN0ZW5iZXJnICgyOSBTZXAgMjAwOCkKLSBJYW4gTHluYWdoIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBub3cgbWFrZXMgQ1VSTE9QVF9SQU5HRSB3b3JrIGZpbmUgZm9yIFNGVFAKICBkb3dubG9hZHMhCgotIE1heGltIEl2YW5vdiBmaWxlZCBidWcgcmVwb3J0ICMyMTA3ODAzCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIxMDc4MDMpICJubyBDVVJMSU5GT19SRURJUkVDVF9VUkwgaW4KICBtdWx0aSBtb2RlIiB0b2dldGhlciB3aXRoIGEgcGF0Y2ggdGhhdCBmaXhlZCB0aGUgcHJvYmxlbS4KCkRhbmllbCBTdGVuYmVyZyAoMjUgU2VwIDIwMDgpCi0gRW1hbnVlbGUgQm92aXNpbyBzdWJtaXR0ZWQgYnVnIHJlcG9ydCAjMjEyNjQzNS4gV2UgZml4ZWQgdGhlIEhUVFAgRGlnZXN0CiAgYXV0aCBjb2RlIHRvIG5vdCBiZWhhdmUgYmFkbHkgd2hlbiBnZXR0aW5nIGEgYmxhbmsgcmVhbG0gd2l0aAogIHJlYWxtPSIiLiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTI2NDM1CgpEYW5pZWwgRmFuZHJpY2ggKDIzIFNlcCAyMDA4KQotIE1ha2Ugc3VyZSBub3QgdG8gZGVyZWZlcmVuY2UgdGhlIHdyb25nIFVybFN0YXRlIHByb3RvIHVuaW9uIG1lbWJlciB3aGVuCiAgc3dpdGNoaW5nIGZyb20gb25lIHByb3RvY29sIHRvIGFub3RoZXIgaW4gYSBzaW5nbGUgcmVxdWVzdCAoZS5nLgogIHJlZGlyZWN0aW5nIGZyb20gSFRUUCB0byBGVFAgYXMgaW4gdGVzdCAxMDU1KSBieSByZXNldHRpbmcKICBzdGF0ZS5leHBlY3QxMDBoZWFkZXIgYmVmb3JlIGV2ZXJ5IHJlcXVlc3QuCgpEYW5pZWwgU3RlbmJlcmcgKDIzIFNlcCAyMDA4KQotIEludHJvZHVjaW5nIEphbWllIExva2llcidzIGZ1bmN0aW9uIGZvciBkYXRlIHRvIGVwb2NoIGNvbnZlcnNpb24gdXNlZCBpbiB0aGUKICBkYXRlIHBhcnNlciBmdW5jdGlvbi4gVGhpcyBtYWtlcyBvdXIgZnVuY3Rpb24gbGVzcyBkZXBlbmRlbnQgb24gc3lzdGVtLQogIHByb3ZpZGVkIGZ1bmN0aW9ucyBhbmQgaW5zdGVhZCB3ZSBkbyBhbGwgdGhlIG1hZ2ljIG91cnNlbHZlcy4gV2UgYWxzbyBubwogIGxvbmdlciBkZXBlbmQgb24gdGhlIFRaIGVudmlyb25tZW50IHZhcmlhYmxlLiBTd2l0Y2hpbmcgdG8gb3VyIG93biBjb252ZXJ0ZXIKICBoYXMgc29tZSBzaWRlLWVmZmVjdCBhbmQgdGhleSBhcmUgbm90ZWQgaGVyZSBmb3IgZnV0dXJlIHJlZmVyZW5jZSAodGFrZW4KICBmcm9tIGEgbWFpbCBieSBtciBMb2tpZXIpOgoKICB0aW1lX3QgaXMgbm90IG1lYXN1cmVkIGluIHNlY29uZHMgaW4gdGhlIEFOU0kgQyBzdGFuZGFyZCAtIG9yIGV2ZW4gY291bnRlZAogIHVuaWZvcm1seSAtIHdlaXJkIHBsYXRmb3JtcyBjYW4gdXNlIG90aGVyIG51bWVyaWMgcmVwcmVzZW50YXRpb25zIG9mIGRhdGVzCiAgaW4gdGltZV90IC0gaGVuY2UgdGhlIGRpZmZ0aW1lKCkgZnVuY3Rpb24uCgogIE9uIFBPU0lYIHRpbWVfdCBpcyBtZWFzdXJlZCBpbiBVVEMgc2Vjb25kcywgd2hpY2ggbWVhbnMgbm90IGluY2x1ZGluZyBsZWFwCiAgc2Vjb25kcy4gIEJ1dCBpdCdzIG1lbnRpb25lZCBpbiBhIGZldyBwbGFjZXMgdGhhdCBzb21lIG9sZCBQT1NJWC1pc2gKICBlbnZpcm9ubWVudHMgaW5jbHVkZSBsZWFwIHNlY29uZHMgaW4gdGhlaXIgdGltZV90IGNvdW50cy4uLgoKICBJJ20gcHJldHR5IHN1cmUgW3RoZSBuZXcgaW1wbGVtZW50YXRpb24gaXNdIGNvcnJlY3Qgb24gYW55dGhpbmcgdHJ1bHkgUE9TSVguCiAgQW5kIGl0J3Mgb2J2aW91c2x5IGEgbG90IGxlc3MgZGVwZW5kZW50IG9uIHBsYXRmb3JtIHF1aXJrcyBhbmQgY29ybmVyIGNhc2VzCiAgaW4gbWFueSB3YXlzIHRoYW4gdGhlIG1rdGltZSgpIHZlcnNpb24uCgotIFJvYiBDcml0dGVuZGVuIGJyb3VnaHQgYSBwYXRjaCB0byAiYWRkIHNvbWUgbG9ja2luZyBmb3IgdGhyZWFkLXNhZmV0eSB0byBOU1MKICBpbXBsZW1lbnRhdGlvbiIuCgpEYW5pZWwgU3RlbmJlcmcgKDIyIFNlcCAyMDA4KQotIE1hZGUgdGhlIFNPQ0tTIGNvZGUgdXNlIHRoZSBuZXcgQ3VybF9yZWFkX3BsYWluKCkgZnVuY3Rpb24gdG8gZml4IHRoZSBidWcKICBNYXJrdXMgTW9lbGxlciByZXBvcnRlZDogaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2FyY2hpdmUtMjAwOC0wOS8wMDE2Lmh0bWwKCi0gcmVjdigpIGVycm9ycyBvdGhlciB0aGFuIHRob3NlIGVxdWFsIHRvIEVBR0FJTiBub3cgY2F1c2UgcHJvcGVyCiAgQ1VSTEVfUkVDVl9FUlJPUiB0byBnZXQgcmV0dXJuZWQuIFRoaXMgbWFkZSB0ZXN0IGNhc2UgMTYwIGZhaWwgc28gSSd2ZSBub3cKICBkaXNhYmxlZCBpdCB1bnRpbCB3ZSBjYW4gZmlndXJlIG91dCBhbm90aGVyIHdheSB0byBleGVyY2lzZSB0aGF0IGxvZ2ljLgoKLSBNaWNoYWVsIEdvZmZpb3VsIGZpbGVkIGJ1ZyByZXBvcnQgIzIxMDczNzcgIlByb2JsZW0gd2l0aCBtdWx0aSArIEdudVRMUyArCiAgcHJveHkiIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTA3Mzc3KSB0aGF0IHNob3dlZCBob3cgYSBtdWx0aQogIGludGVyZmFjZSB1c2luZyBwcm9ncmFtIGRpZG4ndCB3b3JrIHdoZW4gYnVpbHQgd2l0aCBHbnVUTFMgYW5kIGEgQ09OTkVDVAogIHJlcXVlc3Qgd2FzIGRvbmUgb3ZlciBhIHByb3h5IChiYXNpY2FsbHkgdGVzdCA1MDIgb3ZlciBhIHByb3h5IHRvIGEgSFRUUFMKICBzaXRlKS4gSXQgdHVybmVkIG91dCB0aGUgc3NsIGNvbm5lY3QgZnVuY3Rpb24gd291bGQgZ2V0IGNhbGxlZCB0d2ljZSB3aGljaAogIGNhdXNlZCB0aGUgc2Vjb25kIGNhbGwgdG8gZmFpbC4KCkRhbmllbCBGYW5kcmljaCAoMjIgU2VwIDIwMDgpCi0gRml4ZWQgdGVzdCA1MzkgdG8gaGFuZGxlIGFuIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uIHRoYXQgc2hvd3MgdXAgbm93CiAgdGhhdCBtZW1kZWJ1Zy5oIGlzIGluY2x1ZGVkIGluIHRoZSB0ZXN0IHByb2dyYW1zLgoKWWFuZyBUc2UgKDIwIFNlcCAyMDA4KQotIEZpeCByZWdyZXNzaW9uIGluIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggYWZmZWN0ZWQgT3BlblNTTCBidWlsZHMgb24gTVNZUy4KCllhbmcgVHNlICgxOSBTZXAgMjAwOCkKLSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgYXZhaWxhYmlsaXR5IG9mIHRoZSBhbGFybSgpIGZ1bmN0aW9uLgoKRGFuaWVsIEZhbmRyaWNoICgxOCBTZXAgMjAwOCkKLSBEb24ndCBib3RoZXIgdG8gaW5zdGFsbCBhIFNJR0FMUk0gaGFuZGxlciB1bmxlc3MgYWxhcm0oKSBpcyBhdmFpbGFibGUuCiAgQWxzbywgbGVhdmUgdGhlIGV4aXN0aW5nIFNJR0FMUk0gaGFuZGxlciBhbG9uZSBpZiB0aGUgdGltZW91dCBpcyB0b28gc21hbGwKICB0byBoYW5kbGUuCgpEYW5pZWwgRmFuZHJpY2ggKDE3IFNlcCAyMDA4KQotIFJlbW92ZWQgcmVmZXJlbmNlIHRvIGN1cmwtY2EtYnVuZGxlLmNydCBpbiB0aGUgaG9zdCB2ZXJpZmljYXRpb24gZmFpbHVyZQogIGVycm9yIG1lc3NhZ2UuCgpZYW5nIFRzZSAoMTcgU2VwIDIwMDgpCi0gSW1wcm92ZSBjb25maWd1cmUgZGV0ZWN0aW9uIG9mIGdldGhvc3RuYW1lKCksIGxvY2FsdGltZV9yKCksIHN0cnN0cigpLAogIGdldHNlcnZieXBvcnRfcigpLCBnZXRob3N0YnlhZGRyX3IoKSBhbmQgZ2V0aG9zdGJ5bmFtZV9yKCkuCgpZYW5nIFRzZSAoMTQgU2VwIDIwMDgpCi0gSW1wcm92ZSBjb25maWd1cmUgZGV0ZWN0aW9uIG9mIHN0cmNhc2VjbXAoKSwgc3RyY2FzZXN0cigpLCBzdHJjbXBpKCksCiAgc3RyaWNtcCgpLCBzdHJsY2F0KCksIHN0cm5jYXNlY21wKCksIHN0cm5jbXBpKCkgYW5kIHN0cm5pY21wKCkuCgpZYW5nIFRzZSAoMTMgU2VwIDIwMDgpCi0gRGlzYWJsZSB0cmFja2luZyBvZiBmZG9wZW4oKSBjYWxscyBpbiB0aGUgbG93LWxldmVsIG1lbW9yeSBsZWFrIHRyYWNraW5nCiAgY29kZSB3aGVuIGZkb3BlbigpIGlzIG5vdCBhdmFpbGFibGUsIHRvIGF2b2lkIGNvbXBpbGVyIGVycm9yLgoKWWFuZyBUc2UgKDEyIFNlcCAyMDA4KQotIEZ1cnRoZXIgYWRqdXN0IGRldGVjdGlvbiBvZiBzdHJlcnJvcl9yKCkgaW4gdGhlIGNvbmZpZ3VyZSBwcm9jZXNzLCBhbmQKICBlbnN1cmUgdGhhdCBlcnJubyBpcyBub3QgbW9kaWZpZWQgaW5zaWRlIEN1cmxfc3RyZXJyb3IoKS4KCllhbmcgVHNlICgxMCBTZXAgMjAwOCkKLSBJbXByb3ZlIGRldGVjdGlvbiBvZiBnbXRpbWVfcigpLCBzdHJ0b2xsKCksIHNpZ2FjdGlvbigpLCBzdHJ0b2tfcigpLAogIHN0cmR1cCgpIGFuZCBmdHJ1bmNhdGUoKSBpbiB0aGUgY29uZmlndXJlIHByb2Nlc3MuCgpEYW5pZWwgRmFuZHJpY2ggKDkgU2VwIDIwMDgpCi0gTWlrZSBSZXZpIGRpc2NvdmVyZWQgc29tZSBzd2FwcGVkIHNwZWVkIHN3aXRjaGVzIGRvY3VtZW50ZWQgaW4gdGhlIGN1cmwgbWFuCiAgcGFnZS4KCi0gQ2hlY2tlZCBpbiBzb21lIGRvY3VtZW50YXRpb24gYW5kIGNvZGUgaW1wcm92ZW1lbnRzIGFuZCBmaXhlcyB0aGF0IEkKICBkaXNjb3ZlcmVkIGluIHRoZSBGcmVlQlNEIHBvcnRzIHN5c3RlbS4KCkRhbmllbCBTdGVuYmVyZyAoOCBTZXAgMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luIHBhdGNoZWQgYSBwcm9ibGVtOiBJIGhhdmUgZm91bmQgYnVnIGluIHBpcGVsaW5pbmcgdGhyb3VnaAogIHByb3h5LiBJIGhhdmUgYSB0cmFuc3BhcmVudCBwcm94eS4gV2hlbiBydW5uaW5nIHdpdGggaHR0cF9wcm94eSBlbnZpcm9ubWVudAogIHZhcmlhYmxlIG5vdCBzZXQgbXkgdGVzdCBjb21wbGV0ZXMgZmluZSAoaXQgZ29lcyB0aHJvdWdoIHRyYW5zcGFyZW50CiAgcHJveHkpLiBXaGVuIEkgc2V0IGh0dHBfcHJveHkgdmFyaWFibGUgbXkgdGVzdCBoYW5ncyBhZnRlciB0aGUgZmlyc3QKICBkb3dubG9hZGVkIGlzIGNvbXBsZXRlLiBMb29rcyBsaWtlIHRoZSBzZWNvbmQgaGFuZGxlIG5ldmVyIGdldHMgb3V0IGZyb20KICBXQUlURE8gc3RhdGUuCgogIFRoZSBmaXg6IEl0IG1ha2VzIGNoZWNrUGVuZFBpcGVsaW5lIG1vdmUgMSBoYW5kbGVyIGZyb20gcGVuZCBwaXBlIHRvIHNlbmQKICBwaXBlIGlmIHBpcGVsaW5pbmcgaXMgbm90IHN1cHBvcnRlZCBieSBzZXJ2ZXIgYnV0IHRoZXJlIGFyZSBubyBoYW5kbGVzIGluCiAgc2VuZCBhbmQgcmVjdiBwaXBlcy4KCi0gU3RlZmFuIEtyYXVzZSBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgd291bGQgd3JvbmdseSBzZW5kIGF3YXkgY29va2llcyB0bwogIHNpdGVzIGluIGNhc2VzIHdoZXJlIHRoZSBjb29raWUgY2xlYXJseSBoYXMgYSB2ZXJ5IG9sZCBleHBpcnkgZGF0ZS4gVGhlCiAgY29uZGl0aW9uIHdhcyBzaW1wbHkgdGhhdCBsaWJjdXJsJ3MgZGF0ZSBwYXJzZXIgd291bGQgZmFpbCB0byBjb252ZXJ0IHRoZQogIGRhdGUgYW5kIGl0IHdvdWxkIHRoZW4gY291bnQgYXMgYSAodGltZWQtYmFzZWQpIG1hdGNoLiBTdGFydGluZyBub3csIGEKICBtaXNzZWQgZGF0ZSBkdWUgdG8gYW4gdW5zdXBwb3J0ZWQgZGF0ZSBmb3JtYXQgb3IgZGF0ZSByYW5nZSB3aWxsIG5vdyBjYXVzZQogIHRoZSBjb29raWUgdG8gbm90IG1hdGNoLgoKRGFuaWVsIEZhbmRyaWNoICg1IFNlcCAyMDA4KQotIEltcHJvdmVkIHRoZSBsb2dpYyB0aGF0IGRlY2lkZXMgd2hldGhlciB0byB1c2UgSFRUUCAxLjEgZmVhdHVyZXMgb3Igbm90IGluIGEKICByZXF1ZXN0LiAgU2V0dGluZyBhIHNwZWNpZmljIHZlcnNpb24gd2l0aCBDVVJMT1BUX0hUVFBfVkVSU0lPTiBvdmVycmlkZXMKICBhbGwgb3RoZXIgY2hlY2tzLCBidXQgb3RoZXJ3aXNlLCBhIDEuMCByZXF1ZXN0IHdpbGwgYmUgbWFkZSBpZiB0aGUgc2VydmVyCiAgaXMga25vd24gdG8gc3VwcG9ydCBvbmx5IDEuMCBiZWNhdXNlIGl0IHByZXZpb3VzbHkgcmVzcG9uZGVkIHNvIGFuZCB0aGUKICBjb25uZWN0aW9uIHdhcyBrZXB0IGFsaXZlLCBvciBhIHJlc3BvbnNlIHRvIGEgcHJldmlvdXMgcmVxdWVzdCBvbiB0aGlzIGhhbmRsZQogIGNhbWUgYmFjayBhcyAxLjAuIFRoZSBsYXR0ZXIgY291bGQgdGFrZSBwbGFjZSBpbiBjYXNlcyBsaWtlIHJlZGlyZWN0aW9uIG9yCiAgYXV0aGVudGljYXRpb24gd2hlcmUgc2V2ZXJhbCByZXF1ZXN0cyBoYXZlIHRvIGJlIG1hZGUgYmVmb3JlIHRoZSBvcGVyYXRpb24KICBpcyBjb21wbGV0ZS4gIElmIGFueSBvbmUgb2YgdGhlIHNlcnZlcnMgaW4gYSByZWRpcmVjdGlvbiBjaGFpbiBzdXBwb3J0cyBvbmx5CiAgMS4wLCB0aGVuIHJlbWFpbmluZyByZXF1ZXN0cyB3aWxsIGJlIHNlbnQgaW4gMS4wIG1vZGUuCgotIERldGVjdCBjYXNlcyB3aGVyZSBhbiB1cGxvYWQgbXVzdCBiZSBzZW50IGNodW5rZWQgYW5kIHRoZSBzZXJ2ZXIgc3VwcG9ydHMKICBvbmx5IEhUVFAgMS4wIGFuZCByZXR1cm4gQ1VSTEVfVVBMT0FEX0ZBSUxFRC4KCkRhbmllbCBTdGVuYmVyZyAoNSBTZXAgMjAwOCkKLSBNYXJ0aW4gRHJhc2FyIHByb3ZpZGVkIHRoZSBDVVJMT1BUX1BPU1RSRURJUiBwYXRjaC4gSXQgcmVuYW1lcwogIENVUkxPUFRfUE9TVDMwMSAoYnV0IGFkZHMgYSBkZWZpbmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB5b3Ugd2hvCiAgZG9uJ3QgZGVmaW5lIENVUkxfTk9fT0xESUVTKS4gVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBub3cgYWxzbyBjaGFuZ2UgdGhlCiAgbGliY3VybCBiZWhhdmlvciBmb3IgYSBIVFRQIHJlc3BvbnNlIDMwMiBhZnRlciBhIFBPU1QgdG8gbm90IHVzZSBHRVQgaW4gdGhlCiAgc3Vic2VxdWVudCByZXF1ZXN0ICh3aGVuIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gaXMgZW5hYmxlZCkuIEkgZWRpdGVkIHRoZQogIHBhdGNoIHNvbWV3aGF0IGJlZm9yZSBjb21taXQuIFRoZSBjdXJsIHRvb2wgZ290IGEgbWF0Y2hpbmcgLS1wb3N0MzAyCiAgb3B0aW9uLiBUZXN0IGNhc2UgMTA3NiB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMuCgotIEludHJvZHVjaW5nIENVUkxPUFRfQ0VSVElORk8gYW5kIHRoZSBjb3JyZXNwb25kaW5nIENVUkxJTkZPX0NFUlRJTkZPLiBCeQogIGVuYWJsaW5nIHRoaXMgZmVhdHVyZSB3aXRoIENVUkxPUFRfQ0VSVElORk8gZm9yIGEgcmVxdWVzdCB1c2luZyBTU0wgKEhUVFBTCiAgb3IgRlRQUyksIGxpYmN1cmwgd2lsbCBnYXRoZXIgbG90cyBvZiBzZXJ2ZXIgY2VydGlmaWNhdGUgaW5mbyBhbmQgdGhhdCBpbmZvCiAgY2FuIHRoZW4gZ2V0IGV4dHJhY3RlZCBieSBhIGNsaWVudCBhZnRlciB0aGUgcmVxdWVzdCBoYXMgY29tcGxldGVkIHdpdGgKICBjdXJsX2Vhc3lfZ2V0aW5mbygpJ3MgQ1VSTElORk9fQ0VSVElORk8gb3B0aW9uLiBMaW51cyBOaWVsc2VuIEZlbHR6aW5nCiAgaGVscGVkIG1lIHRlc3QgYW5kIHNtb290aGVuIG91dCB0aGlzIGZlYXR1cmUuCgogIFVuZm9ydHVuYXRlbHksIHRoaXMgZmVhdHVyZSBjdXJyZW50bHkgb25seSB3b3JrcyB3aXRoIGxpYmN1cmwgYnVpbHQgdG8gdXNlCiAgT3BlblNTTC4KCiAgVGhpcyBmZWF0dXJlIHdhcyBzcG9uc29yZWQgYnkgbmV0d29ya2luZzRhbGwuY29tIC0gdGhhbmtzIQoKLSBEbWl0cml5IFNlcmdleWV2IHBvaW50ZWQgb3V0IHRoYXQgY3VybF9lYXN5X3BhdXNlKCkgZGlkbid0IHVucGF1c2UgcHJvcGVybHkKICBkdXJpbmcgY2VydGFpbiBjb25kaXRpb25zLiBJIGFsc28gY2hhbmdlZCB0aGlzIGNvZGUgdG8gdXNlIHJlYWxsb2MoKSBiYXNlZAogIG9uIERhbmllbCBGYW5kcmljaCdzIHN1Z2dlc3Rpb24uCgpHdWVudGVyIEtuYXVmICg0IFNlcCAyMDA4KQotIE1pbmdXMzIgbm9uLWNvbmZpZ3VyZSBidWlsZHMgYXJlIG5vdyBsYXJnZWZpbGUgZmVhdHVyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCiAgTmV0V2FyZSBMSUJDIGJ1aWxkcyBhcmUgYWxzbyBub3cgbGFyZ2VmaWxlIGZlYXR1cmUgZW5hYmxlZCBieSBkZWZhdWx0LgoKWWFuZyBUc2UgKDQgU2VwIDIwMDgpCi0gU2V2ZXJhbCBmaXhlcyByZWxhdGVkIHdpdGggcHJpbnQgZm9ybWF0dGluZyBzdHJpbmcgZGlyZWN0aXZlcy4KCkRhbmllbCBGYW5kcmljaCAoMyBTZXAgMjAwOCkKLSBTZWFyY2ggZm9yIHRoZSBGcmVlQlNEIENBIGNlcnQgZmlsZSAvdXNyL2xvY2FsL3NoYXJlL2NlcnRzL2NhLXJvb3QuY3J0CgpEYW5pZWwgRmFuZHJpY2ggKDIgU2VwIDIwMDgpCi0gRml4ZWQgYW4gb3V0IG9mIG1lbW9yeSBwcm9ibGVtIHRoYXQgY2F1c2VkIHRvcnR1cmUgdGVzdCBmYWlsdXJlcyBpbiB0ZXN0cwogIDcwNiBhbmQgNzA3LgoKRGFuaWVsIFN0ZW5iZXJnICgyIFNlcCAyMDA4KQotIEtlaXRoIE1vayBhZGRlZCBzdXBwb3J0ZWRfcHJvdG9jb2xzIGFuZCBzdXBwb3J0ZWRfZmVhdHVyZXMgdG8gdGhlIHBrZy1jb25maWcKICBmaWxlIGZvciBsaWJjdXJsLCBhbmQgd2hpbGUgZG9pbmcgdGhhdCBmaXggaGUgdW5pZmllZCB3aXRoIGN1cmwtY29uZmlnLmluCiAgaG93IHRoZSBzdXBwb3J0ZWQgcHJvdG9jb2xzIGFuZCBmZWF0dXJlcyBhcmUgZXh0cmFjdGVkIGFuZCB1c2VkLCBzbyBib3RoIHRob3NlCiAgdG9vbHMgc2hvdWxkIG5vdyBhbHdheXMgYmUgc3luY2VkLgoKVmVyc2lvbiA3LjE5LjAgKDEgU2VwdGVtYmVyIDIwMDgpCgpEYW5pZWwgRmFuZHJpY2ggKDI5IEF1ZyAyMDA4KQotIEFkZGVkIHRlc3RzIDEwNzEgdGhyb3VnaCAxMDc0IHRvIHRlc3QgYXV0b21hdGljIGRvd25ncmFkaW5nIGZyb20gSFRUUCAxLjEKICB0byBIVFRQIDEuMCB1cG9uIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIEhUVFAgc2VydmVyLiAgVGVzdHMgMTA3MgogIGFuZCAxMDczIGFyZSBzaW1pbGFyIHRvIHRlc3QgMTA2OSBpbiB0aGF0IHRoZXkgaW52b2x2ZSB0aGUgaW1wb3NzaWJsZQogIHNjZW5hcmlvIG9mIHNlbmRpbmcgY2h1bmtlZCBkYXRhIHRvIGEgSFRUUCAxLjAgc2VydmVyLiAgQWxsIHRoZXNlIGZhaWwKICBhbmQgYXJlIGFkZGVkIHRvIERJU0FCTEVELgoKLSBBZGRlZCB0ZXN0IDEwNzUgdG8gdGVzdCAtLWFueWF1dGggd2l0aCBCYXNpYyBhdXRoZW50aWNhdGlvbi4KCkRhbmllbCBTdGVuYmVyZyAoMjkgQXVnIDIwMDgpCi0gV2hlbiBsaWJjdXJsIHdhcyBkb2luZyBhIEhUVFAgUE9TVCBhbmQgdGhlIHNlcnZlciB3b3VsZCByZXNwb25kIHdpdGgKICAiQ29ubmVjdGlvbjogY2xvc2UiIGFuZCBhY3R1YWxseSBjbG9zZSB0aGUgY29ubmVjdGlvbiBhZnRlciB0aGUKICByZXNwb25zZS1ib2R5LCBsaWJjdXJsIGNvdWxkIHN0aWxsIGhhdmUgb3V0c3RhbmRpbmcgZGF0YSB0byBzZW5kIGFuZCBpdAogIHdvdWxkIG5vdCBwcm9wZXJseSBub3RpY2UgdGhpcyBhbmQgc3RvcCBzZW5kaW5nLiBUaGlzIGNhdXNlZCB3ZWlyZG5lc3MgYW5kCiAgc2FkIGZhY2VzLiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDgwMjIyCgogIE5vdGUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgcmVhc29ucyB0byBjb25zaWRlciBsaWJjdXJsJ3MgYmVoYXZpb3Igd2hlbgogIGdldHRpbmcgYSA+PSA0MDAgcmVzcG9uc2UgY29kZSB3aGlsZSBzZW5kaW5nIGRhdGEsIGFzIENyYWlnIFBlcnJhcycgbm90ZQogICJodHRwIHVwbG9hZDogaG93IHRvIHN0b3Agb24gZXJyb3IiIHNwZWNpZmllczoKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA4LTA4LzAxMzguaHRtbAoKRGFuaWVsIFN0ZW5iZXJnICgyOCBBdWcgMjAwOCkKLSBEZW5nbWlud2VuIHJlcG9ydGVkIHRoYXQgbGliY3VybCB3b3VsZCBsb2NrIGEgKGNvb2tpZSkgc2hhcmUgdHdpY2UgKHdpdGhvdXQKICBhbiB1bmxvY2sgaW4gYmV0d2VlbikgZm9yIGEgY2VydGFpbiBjYXNlIGFuZCB0aGF0IGluIGZhY3Qgd29ya3Mgd2hlbiB1c2luZwogIHJlZ3VsYXIgd2luZG93cyBtdXRleGVzIGJ1dCBub3Qgd2l0aCBwdGhyZWFkcychIExvY2tzIHNob3VsZCBvZiBjb3Vyc2Ugbm90CiAgZ2V0IGxvY2tlZCBhZ2FpbiBzbyB0aGlzIGlzIG5vdyBmaXhlZC4KICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDgvMDQyMi5odG1sCgotIEknbSBhYmFuZG9uaW5nIHRoZSBzeXN0ZW0gd2l0aCB0aGUgd2ViIHNpdGUgbWlycm9ycyAoYnV0IGtlZXBpbmcgZG93bmxvYWQKICBmaWxlcyBiaW5nIG1pcnJvcmVkKSBhbmQgdGh1cyBJJ3ZlIGNoYW5nZWQgdGhlIFVSTCBpbiB0aGUgY29va2llamFyIGhlYWRlcgogIHRvIG5vIGxvbmdlciB1c2UgY3VybG0uaGF4eC5zZSBidXQgaW5zdGVhZCB1c2UgdGhlIG1haW4gc2l0ZSBjdXJsLmhheHguc2UKCkRhbmllbCBGYW5kcmljaCAoMjcgQXVnIDIwMDgpCi0gRml4ZWQgdGVzdCBjYXNlIDEwNjUgYnkgY2hhbmdpbmcgdGhlIGhhbmRsaW5nIG9mIENVUkxPUFRfVVBMT0FEIHRvIHNldAogIHRoZSBIVFRQIG1ldGhvZCB0byBHRVQgKG9yIEhFQUQpIHdoZW4gZ2l2ZW4gYSB2YWx1ZSBvZiAwLgoKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwNjggYW5kIDEwNjkgdG8gdGVzdCBhIHNpbXBsZSBIVFRQIFBVVCBmcm9tIHN0ZGluLiAgVGVzdAogIGNhc2UgMTA2OSBmYWlscyBpbiBhIHNpbWlsYXIgbWFubmVyIHRvIHRlc3QgMTA2NSBzbyBpcyBhZGRlZCB0byBESVNBQkxFRC4KCllhbmcgVHNlICgyNyBBdWcgMjAwOCkKLSBGaXggZ2VuZXJhdGlvbiBvZiBNUyBWQzYgLmRzcCBmaWxlIHRvIG1ha2UgaXQgc3VwcG9ydCBjb21waWxhdGlvbiBvZiBlaXRoZXIKICBkeW5hbWljIChETEwpIG9yIHN0YXRpYyAoTElCKSBsaWJjdXJsIGxpYnJhcmllcyBpbiBkZWJ1ZyBhbmQgcmVsZWFzZSBtb2Rlcy4KCkRhbmllbCBGYW5kcmljaCAoMjYgQXVnIDIwMDgpCi0gRml4ZWQgb3V0IG9mIG1lbW9yeSBwcm9ibGVtcyB0aGF0IGNhdXNlZCB0b3J0dXJlIHRlc3QgZmFpbHVyZXMgaW4gdGVzdHMKICAxMDIxIGFuZCAxMDY3LgoKWWFuZyBUc2UgKDI2IEF1ZyAyMDA4KQotIEFkZGVkIGNoZWNrIGFuZCBzeW1ib2wgZGVmaW5pdGlvbiBmb3IgV0lOMzIgZmlsZSBBUEkgdXNhZ2UgaW4gY29uZmlndXJlLAogIHN1cHBvcnRpbmcgY29uZmlndXJlJ3MgLS1kaXNhYmxlLWxhcmdlZmlsZSBvcHRpb24gZm9yIFdJTjMyIHRhcmdldHMgYWxzby4KCi0gTm9uLWNvbmZpZ3VyZSBzeXN0ZW1zIHdoaWNoIGRvIG5vdCB1c2UgY29uZmlnLXdpbjMyLmggY29uZmlndXJhdGlvbiBmaWxlLAogIGFuZCB3YW50IHRvIHVzZSB0aGUgV0lOMzIgZmlsZSBBUEksIG11c3QgZGVmaW5lIFVTRV9XSU4zMl9MQVJHRV9GSUxFUyBvcgogIFVTRV9XSU4zMl9TTUFMTF9GSUxFUyBhcyBhcHByb3ByaWF0ZSBpbiB0aGVpciBvd24gY29uZmlndXJhdGlvbiBmaWxlcy4KCkRhbmllbCBTdGVuYmVyZyAoMjMgQXVnIDIwMDgpCi0gUnVubmluZyAnbWFrZSBjYS1maXJlZm94JyBpbiB0aGUgcm9vdCBidWlsZCBkaXIgd2lsbCBub3cgcnVuIHRoZSBuZXcKICBmaXJlZm94LWRiMnBlbS5zaCBjb252ZXJzaW9uIHNjcmlwdCB0aGF0IGNvbnZlcnRzIGEgbG9jYWwgRmlyZWZveCBkYiBvZiBjYQogIGNlcnRzIGludG8gUEVNIGZvcm1hdCwgc3VpdGFibGUgZm9yIHVzZSB3aXRoIGEgT3BlblNTTCBvciBHbnVUTFMgYnVpbHQKICBsaWJjdXJsLgoKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBmaXhlZCBhIGJ1ZyB3aGVuIGRvaW5nIHByb3h5IENPTk5FQ1Qgd2l0aCB0aGUgbXVsdGkKICBpbnRlcmZhY2UsIGFuZCB0aGUgcHJveHkgd291bGQgc2VuZCBDb25uZWN0aW9uOiBjbG9zZSBkdXJpbmcgdGhlCiAgYXV0aGVudGljYXRpb24gcGhhc2UuICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDY5MDQ3CgpEYW5pZWwgRmFuZHJpY2ggKDIyIEF1ZyAyMDA4KQotIEZpeGVkIGEgcHJvYmxlbSB3aGVuIC0tZHVtcC1oZWFkZXIgLSB3YXMgZ2l2ZW4gd2l0aCBtb3JlIHRoYW4gb25lIFVSTCwKICB3aGljaCBjYXVzZWQgYW4gZXJyb3Igd2hlbiB0aGUgc2Vjb25kIGhlYWRlciB3YXMgZHVtcGVkIGR1ZSB0byBzdGRvdXQKICBiZWluZyBjbG9zZWQuICBBZGRlZCB0ZXN0IGNhc2UgMTA2NiB0byB2ZXJpZnkuICBBbHNvIGZpeGVkIGEgcG90ZW50aWFsCiAgcHJvYmxlbSB3aGVyZSBhIGNsb3NlZCBmaWxlIGRlc2NyaXB0b3IgbWlnaHQgYmUgdXNlZCBmb3IgYW4gdXBsb2FkCiAgd2hlbiBtb3JlIHRoYW4gb25lIFVSTCBpcyBnaXZlbi4KCllhbmcgVHNlICgyMiBBdWcgMjAwOCkKLSBJbXByb3ZlZCBsaWJjdXJsJ3MgaW50ZXJuYWwgY3VybF9tKnByaW50ZigpIGZ1bmN0aW9ucyBpbnRlZ3JhbCBkYXRhIHR5cGUKICBzaXplIGFuZCBzaWduZWRuZXNzIGhhbmRsaW5nLgoKLSBJbnRlcm5hbCBhZGp1c3RtZW50cyB0byBiZXR0ZXIgc2VsZWN0L2RpZmZlcmVudGlhdGUgd2hlbiBsYXJnZS9zbWFsbCBmaWxlCiAgc3VwcG9ydCBpcyBwcm92aWRlZCB1c2luZyBXSU4zMiBmdW5jdGlvbnMgZGlyZWN0bHkuCgpEYW5pZWwgRmFuZHJpY2ggKDIwIEF1ZyAyMDA4KQotIEFkZGVkIGFuIGVkaXRlZCB2ZXJzaW9uIG9mIFZpbmNlbnQgTGUgTm9ybWFuZCdzIGRvY3VtZW50YXRpb24gb2YgU0ZUUCBxdW90ZQogIGNvbW1hbmRzIHRvIHRoZSBtYW4gcGFnZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIEF1ZyAyMDA4KQotIFBoaWwgUGVsbG91Y2hvdWQgcG9pbnRlZCBvdXQgdGhhdCB0aGUgd2luZG93cyB2ZXJzaW9uIG9mIGxpYmN1cmwgaGFkIGEKICBtZW1vcnkgbGVhayBiZWNhdXNlIGl0IG5ldmVyIGNhbGxlZCB0aGUgT3BlblNTTCBmdW5jdGlvbgogIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCkgYXMgaXQgd2FzIHN1cHBvc2VkIHRvLiBUaGlzIHdhcyBiZWNhdXNlIG9mIGEKICBtaXNzaW5nIGRlZmluZSBpbiBjb25maWctd2luMzIuaCEKCkdpc2xlIFZhbmVtICgxOCBBdWcgMjAwOCkKLSBVcGRhdGVkIGxpYi9NYWtlZmlsZS5XYXRjb20gd2l0aCB0aGUgb3B0aW9uIHRvIHVzZSBjLWFyZXMgKFVTRV9BUkVTPTEpLgoKWWFuZyBUc2UgKDE4IEF1ZyAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZSA1NTcgdG8gdmVyaWZ5IGxpYmN1cmwncyBpbnRlcm5hbCBjdXJsX20qcHJpbnRmKCkgZnVuY3Rpb25zCiAgZm9ybWF0dGluZyBmdW5jdGlvbmFsaXR5IHdoZW4gaGFuZGxpbmcgc2lnbmVkIGFuZCB1bnNpZ25lZCBsb25ncywgYXMgd2VsbCBhcwogIG91ciBjdXJsX29mZl90IGRhdGEgdHlwZS4KCllhbmcgVHNlICgxNyBBdWcgMjAwOCkKLSBPcGVuU1NsIGVuYWJsZWQgTmV0V2FyZSBidWlsZHMgYXJlIGNoYW5nZWQgdG8gdXNlIHRoZSAnb3BlbnNzbCcgc3ViZGlyZWN0b3J5CiAgd2hlbiBpbmNsdWRpbmcgdGhlIE9wZW5TU0wgaGVhZGVyIGZpbGVzLiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5nLCB0aGlzCiAgcHJldmVudHMgdGhlIHVuZGVzaXJlZCBpbmNsdXNpb24gb2YgaGVhZGVyIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aG9zZQogIG9mIE9wZW5TU0wgYnV0IHdoaWNoIGRvIG5vdCBiZWxvbmcgdG8gdGhlIE9wZW5TU0wgcGFja2FnZS4gVGhlIHZpc2libGUgY2hhbmdlCiAgZnJvbSBwcmV2aW91c2x5IHJlbGVhc2VkIGxpYmN1cmwgdmVyc2lvbnMgaXMgdGhhdCBub3cgT3BlblNTbCBlbmFibGVkIE5ldFdhcmUKICBidWlsZHMgYWxzbyBkZWZpbmUgVVNFX09QRU5TU0wgaW4gY29uZmlnIGZpbGVzLCBhbmQgdGhhdCBPcGVuU1NMIGhlYWRlciBmaWxlcwogIG11c3QgYmUgbG9jYXRlZCBpbiBhIHN1YmRpcmVjdG9yeSBuYW1lZCAnb3BlbnNzbCcuCgpZYW5nIFRzZSAoMTYgQXVnIDIwMDgpCi0gTGlicmFyeSBpbnRlcm5hbCBvbmx5IEMgcHJlcHJvY2Vzc29yIG1hY3JvcyBGT1JNQVRfT0ZGX1QgYW5kIEZPUk1BVF9PRkZfVFUKICByZW1haW4gaW4gdXNlIGFzIGludGVybmFsIGN1cmxfb2ZmX3QgcHJpbnQgZm9ybWF0dGluZyBzdHJpbmdzIGZvciB0aGUgaW50ZXJuYWwKICAqcHJpbnRmIGZ1bmN0aW9ucyB3aGljaCBzdGlsbCBjYW5ub3QgaGFuZGxlIHByaW50IGZvcm1hdHRpbmcgc3RyaW5nIGRpcmVjdGl2ZXMKICBzdWNoIGFzICJJNjRkIiwgIkk2NHUiLCBhbmQgb3RoZXJzIGF2YWlsYWJsZSBvbiBNU1ZDLCBNaW5HVywgSW50ZWwncyBJQ0MsIGFuZAogIG90aGVyIERPUy9XaW5kb3dzIGNvbXBpbGVycy4KCkRhbmllbCBGYW5kcmljaCAoMTUgQXVnIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlIDEwNjMgdG8gdGVzdCBpbnZhbGlkIGxvbmcgZmlsZSByYW5nZXMgd2l0aCBmaWxlOiBVUkxzIGFuZAogIDEwNjQgdG8gdGVzdCBtdWx0aXBsZSBodHRwIFBVVHMuCgotIEFkZGVkIHRlc3QgY2FzZSAxMDY1IHRvIHRlc3QgYSBQVVQgd2l0aCBhIHNpbmdsZSBmaWxlIGJ1dCB0d28gVVJMcy4gVGhpcwogIHdhcyBkaXNjb3ZlcmVkIHRvIGJlIHByb2JsZW1hdGljIHdoaWxlIGludmVzdGlnYXRpbmcgYW4gaW5jaWRlbnQgcmVwb3J0ZWQgYnkKICBWb24gYmFjayBpbiBNYXkuICBjdXJsIGluIHRoaXMgY2FzZSBkb2Vzbid0IGluY2x1ZGUgYSBDb250ZW50LUxlbmd0aDogb3IKICBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCBoZWFkZXIgd2hpY2ggaXMgaWxsZWdhbC4gVGhpcyB0ZXN0IGNhc2UgaXMKICBhZGRlZCB0byBESVNBQkxFRCB1bnRpbCBhIHNvbHV0aW9uIGlzIGZvdW5kLgoKWWFuZyBUc2UgKDE1IEF1ZyAyMDA4KQotIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyB1c2VkIGludGVybmFsbHkgYW5kIGVxdWFsbHkgYXZhaWxhYmxlIGV4dGVybmFsbHkgd2hpY2gKICBhaWQgaW4gdGhlIHVzZSBvZiB0aGUgY3VybF9vZmZfdCBkYXRhIHR5cGUgYXJlIG5hbWVkOiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9ULAogIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVLCBDVVJMX1NJWkVPRl9DVVJMX09GRl9ULCBDVVJMX1NVRkZJWF9DVVJMX09GRl9ULAogIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVLCBDVVJMX09GRl9UX0MgYW5kIENVUkxfT0ZGX1RVX0MuCgpZYW5nIFRzZSAoMTMgQXVnIDIwMDgpCi0gVGhlIHNpemUgb2YgbG9uZyBpcyBhIGJ1aWxkIHRpbWUgY2hhcmFjdGVyaXN0aWMgYW5kIGFzIHN1Y2ggaXQgaXMgbm93IHJlY29yZGVkCiAgaW4gY3VybGJ1aWxkLmggYXMgQ1VSTF9TSVpFT0ZfTE9ORy4gRGVmaW5pdGlvbiBub3cgZG9uZSBmcm9tIGNvbmZpZ3VyZSBwcm9jZXNzCiAgYW5kIGluIENWUyBjdXJsYnVpbGQuaC5kaXN0IGZvciBub24tY29uZmlndXJlIHN5c3RlbXMuCgpEYW5pZWwgRmFuZHJpY2ggKDEyIEF1ZyAyMDA4KQotIEZpeGVkIGEgYnVmZmVyIG92ZXJmbG93IHByb2JsZW0gaW4gQ3VybF9wcm94eUNPTk5FQ1QgdGhhdCBjb3VsZCBvY2N1cgogIHdoZW4gYSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggbG9uZyBoZWFkZXJzIGFuZCBkYXRhLiAgTHVja2lseSwgdGhlIGJ1ZmZlcgogIG92ZXJmbG93ZWQgaW50byBhbm90aGVyIHVudXNlZCBidWZmZXIsIHNvIG5vIGFjdHVhbCBoYXJtIHdhcyBkb25lLgogIEFkZGVkIHRlc3QgY2FzZXMgMTA2MCBhbmQgMTA2MSB0byB2ZXJpZnkuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIEF1ZyAyMDA4KQotIEFuZHkgVHNvdWxhZHplIGZpeGVkIHJ1bnRlc3RzLnBsIHRvIG5vdCBhdHRlbXB0IHRvIGV4ZWN1dGUgdGhlIHN0dW5uZWwKICBfZGlyZWN0b3J5XyBpZiB0aGF0IGhhcHBlbmVkIHRvIGFwcGVhciBpbiB0aGUgcGF0aCEKCllhbmcgVHNlICgxMiBBdWcgMjAwOCkKLSBBZGRlZCBtYWNyb3MgZm9yIG1pbmltdW0td2lkdGggc2lnbmVkIGFuZCB1bnNpZ25lZCBjdXJsX29mZl90IGludGVnZXIKICBjb25zdGFudHMgQ1VSTF9PRkZfVF9DIGFuZCBDVVJMX09GRl9UVV9DLiBUaGUgY2xldmVyIGRvdWJsZSBoZWxwZXIgbWFjcm8KICB1c2VkIGludGVybmFsbHkgdG8gcHJvdmlkZSBpdHMgZnVuY3Rpb25hbGl0eSBpcyB0aGFua3MgdG8gTGFycyBOaWxzc29uLgoKRGFuaWVsIEZhbmRyaWNoICgxMSBBdWcgMjAwOCkKLSBGaXhlZCBhIGJvdW5kYXJ5IGNvbmRpdGlvbiBlcnJvciBpbiBmdHBfcmVhZHJlc3AoKSB3aGVyZWJ5IGEgbm9uLXRlcm1pbmFsCiAgbGluZSBvZiBhIG11bHRpbGluZSBGVFAgcmVzcG9uc2Ugd2hvc2UgbGFzdCBieXRlIGxhbmRlZCBleGFjdGx5IGF0IHRoZSBlbmQKICBvZiB0aGUgQlVGU0laRS1sZW5ndGggYnVmZmVyIHdvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIHRlcm1pbmFsIHJlc3BvbnNlCiAgbGluZS4gIFRoZSBmb2xsb3dpbmcgcmVzcG9uc2UgY29kZSByZWFkIGluIHdvdWxkIHRoZW4gYWN0dWFsbHkgYmUgdGhlCiAgZW5kIG9mIHRoZSBwcmV2aW91cyByZXNwb25zZSBsaW5lLCBhbmQgYWxsIHJlc3BvbnNlcyBmcm9tIHRoZW4gb24gd291bGQKICBjb3JyZXNwb25kIHRvIHRoZSB3cm9uZyBjb21tYW5kLiBUZXN0IGNhc2UgMTA2MiB2ZXJpZmllcyB0aGlzLgoKLSBTdG9wIGNsb3NpbmcgYSBuZXZlci1vcGVuZWQgZnRwIHNvY2tldC4KCkRhbmllbCBTdGVuYmVyZyAoMTEgQXVnIDIwMDgpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZmlsZWQgYnVnIHJlcG9ydCAjMjA0MjQzMAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDQyNDMwKSB3aXRoIGEgcGF0Y2guICJOVExNIFdpbmRvd3MKICBTU1BJIGNvZGUgaXMgbm90IHRocmVhZCBzYWZlIi4gVGhpcyB3YXMgZHVlIHRvIGxpYmN1cmwgdXNpbmcgc3RhdGljCiAgdmFyaWFibGVzIHRvIHRlbGwgd2V0aGVyIHRvIGxvYWQgdGhlIG5lY2Vzc2FyeSBTU1BJIERMTCwgYnV0IG5vdyB0aGUgbG9hZGluZwogIGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBtb3JlIHN1aXRhYmxlIGN1cmxfZ2xvYmFsX2luaXQoKSBjYWxsLgoKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBmaWxlZCBidWcgcmVwb3J0ICMyMDQyNDQwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIwNDI0NDApIHdpdGggYSBwYXRjaC4gSGUgaWRlbnRpZmllZCBhCiAgcHJvYmxlbSB3aGVuIHVzaW5nIE5UTE0gb3ZlciBhIHByb3h5IGJ1dCB0aGUgZW5kLXBvaW50IGRvZXMgQmFzaWMsIGFuZCB0aGVuCiAgbGliY3VybCB3b3VsZCBkbyB3cm9uZyB3aGVuIHRoZSBob3N0IHNlbnQgIkNvbm5lY3Rpb246IGNsb3NlIiBhcyB0aGUgcHJveHkncwogIE5UTE0gc3RhdGUgd2FzIGVycm9uZW91c2x5IGNsZWFyZWQuCgpZYW5nIFRzZSAoMTEgQXVnIDIwMDgpCi0gQWRkZWQgbWlzc2luZyBzaWduZWQgYW5kIHVuc2lnbmVkIGN1cmxfb2ZmX3QgaW50ZWdlciBjb25zdGFudCBzdWZmaXhlcyBmb3IKICBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgdXNlLiBDVVJMX1NVRkZJWF9DVVJMX09GRl9ULCBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVS4KCkRhbmllbCBGYW5kcmljaCAoNyBBdWcgMjAwOCkKLSBGaXhlZCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGluIG11bHRpX3J1bnNpbmdsZSgpIHRoYXQgY291bGQgY2F1c2UgYQogIHJlcXVlc3QgdG8gcHJlbWF0dXJlbHkgZW5kLgoKLSBBZGRlZCB0ZXN0MTA1OSB0byB0ZXN0IHRoZSBGVFAgcHJveHkgdHVubmVsIHByb2JsZW0gZml4ZWQgSnVseSAxMS4KCllhbmcgVHNlICg3IEF1ZyAyMDA4KQotIEFkZGVkIGN1cmxidWlsZC5oIGFuZCBjdXJscnVsZXMuaCBoZWFkZXIgZmlsZXMgdG8gbGliY3VybCdzIHB1YmxpYyBoZWFkZXJzLgogIEZpbGUgY3VybGJ1aWxkLmggaXMgYSBnZW5lcmF0ZWQgZmlsZSBvbiBjb25maWd1cmUtY2FwYWJsZSBzeXN0ZW1zLiBUaGlzIGlzCiAgYSBmaXJzdCBzdGVwIHRvd2FyZHMgY29uZmlndXJlLWJhc2VkIGluZm8gaW4gcHVibGljIGhlYWRlcnMuIEN1cnJlbnRseSBvbmx5CiAgdXNlZCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIGEgY3VybF9vZmZfdCBkYXRhIHR5cGUgd2hpY2ggaXMgbm90IGdhdGVkIHRvCiAgb2ZmX3QuIEZ1cnRoZXIgZGV0YWlscyBhcmUgZG9jdW1lbnRlZCBpbnNpZGUgdGhlc2UgbWVudGlvbmVkIGhlYWRlciBmaWxlcy4KCi0gRml4IENVUkxfQ0hFQ0tfREVGIHNvIHRoYXQgd2hlbiB0aGUgZXhwYW5zaW9uIG9mIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sCiAgcmVzdWx0cyBpbiBhIHNldCBvZiBkb3VibGUtcXVvdGVkIHN0cmluZ3MsIHRoaXMgbWFjcm8gd2lsbCBub3cgcmV0dXJuIGFuCiAgZXhwYW5zaW9uIHdoaWNoIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGRvdWJsZS1xdW90ZWQgc3RyaW5nIGFzIHRoZSByZXN1bHQgb2YKICBjb25jYXRlbmF0aW5nIGFsbCBvZiB0aGVtLgoKLSBTa2lwIGRhdGEgdHlwZSBjaGVjayBpbiBET19DVVJMX09GRl9UX0NIRUNLIG1hY3JvIHdoZW4gYXJndW1lbnQgaXMgZW1wdHkuCgotIEFkanVzdGVkIHRlc3RjdXJsLnBsIHRvIGNvcHkgY2hlY2tlZCBvdXQgY3VybGJ1aWxkLmguZGlzdCBhcyBjdXJsYnVpbGQuaAogIGZvciBub24tY29uZmlndXJlIHRhcmdldHMgd2hlbiB0aGUgaG9zdCBzeXN0ZW0gZG9lc24ndCBydW4gYnVpbGRjb25mLmJhdC4KCi0gUHJldmVudCBidWlsZGNvbmYgZnJvbSByZW1vdmluZyAnTWFrZWZpbGUnIGFuZCAnbWlzc2luZycgZmlsZXMuIFRoaXMgd291bGQKICBibG93IGF3YXkgb3VyIENWUyBjaGVja2VkIGZpbGVzICdtaXNzaW5nJyBhbmQgJ2hpcGVyL01ha2VmaWxlJy4KCi0gUmVtb3ZlIGFkanVzdG1lbnQgZG9uZSB0byB0ZXN0Y3VybC5wbCB0byB2ZXJpZnkgaWYgY2hhbmdlIGludHJvZHVjZWQgYnkKICBHdWVudGVyIEtuYXVmIGluIGxpYi9NYWtlZmlsZS5uZXR3YXJlIGlzIGVub3VnaCB0byBnZXQgdGhlIG5ldHdhcmUgYXV0b2J1aWxkcwogIGdvaW5nIGFnYWluLgoKWWFuZyBUc2UgKDUgQXVnIDIwMDgpCi0gQ2hhbmdlcyBkb25lIHRvIGJ1aWxkY29uZiBzY3JpcHQuIFZhbGlkYXRlIHRoYXQgYXV0b200dGUgYW5kIGF1dG9jb25mLCBhcwogIHdlbGwgYXMgYWNsb2NhbCBhbmQgYXV0b21ha2UsIHZlcnNpb25zIG1hdGNoLiBJbXByb3ZlIHJlbW92YWwgb2YgcHJldmlvdXMKICBydW4gZ2VuZXJhdGVkIGZpbGVzLiBSZW1vdmUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIG9mIGFjbG9jYWwgb24gU29sYXJpcy4KCkRhbmllbCBTdGVuYmVyZyAoNSBBdWcgMjAwOCkKLSBZZWhvc2h1YSBIZXJzaGJlcmcgZm91bmQgYSBwcm9ibGVtIHRoYXQgd291bGQgbWFrZSBsaWJjdXJsIHJlLXVzZSBhCiAgY29ubmVjdGlvbiB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgZXZlbiBpZiBhIHByZXZpb3VzIHVzZSBvZiBpdCBjYXVzZWQgYQogIENVUkxFX1BFRVJfRkFJTEVEX1ZFUklGSUNBVElPTiB0byBnZXQgcmV0dXJuZWQuIEkgbm93IG1ha2Ugc3VyZSB0aGF0IGZhaWxlZAogIFNTTCBjb25uZWN0aW9ucyBwcm9wZXJseSBjbG9zZSB0aGUgY29ubmVjdGlvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDQgQXVnIDIwMDgpCi0gVGVzdCBjYXNlcyAxMDUxLCAxMDUyIGFuZCAxMDU1IHdlcmUgYWRkZWQgYnkgRGFuaWVsIEZhbmRyaWNoIG9uIEp1bHkgMzAgYW5kCiAgcHJvdmVkIGhvdyBQVVQgYW5kIFBPU1Qgd2l0aCBhIHJlZGlyZWN0IGNvdWxkIGxlYWQgdG8gYSAiaGFuZyIgZHVlIHRvIHRoZQogIGRhdGEgc3RyZWFtIG5vdCBiZWluZyByZXdvdW5kIHByb3Blcmx5IHdoZW4gaXQgaGFkIHRvIGluIG9yZGVyIHRvIGdldCBzZW50CiAgcHJvcGVybHkgKGFnYWluKSB0byB0aGUgc3Vic2VxdWVudCBVUkwuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0aGVzZSB0ZXN0CiAgY2FzZXMgYXJlIG5vIGxvbmdlciBkaXNhYmxlZC4KCllhbmcgVHNlICg0IEF1ZyAyMDA4KQotIEF1dG9jb25mIDIuNjIgaGFzIGNoYW5nZWQgdGhlIGJlaGF2aW91ciBvZiB0aGUgQUNfQUlYIG1hY3JvIHdoaWNoIHdlIHVzZS4KICBQcmlvciB2ZXJzaW9ucyBvZiBhdXRvY29uZiBkZWZpbmVkIF9BTExfU09VUkNFIGlmIF9BSVggd2FzIGRlZmluZWQuIDIuNjIKICB2ZXJzaW9uIG9mIEFDX0FJWCBkZWZpbmVzIF9BTExfU09VUkNFIGFuZCBvdGhlciBmb3VyIHByZXByb2Nlc3NvciBzeW1ib2xzCiAgbm8gbWF0dGVyIGlmIHRoZSBzeXN0ZW0gaXMgQUlYIG9yIG5vdC4gVG8ga2VlcCB0aGUgdHJhZGl0aW9uYWwgYmVoYXZpb3VyLAogIGFuZCBhbiB1bmlmb3JtIG9uZSBhY3Jvc3MgYXV0b2NvbmYgdmVyc2lvbnMgQUNfQUlYIGlzIHJlcGxhY2VkIHdpdGggb3VyCiAgb3duIGludGVybmFsIG1hY3JvIENVUkxfQ0hFQ0tfQUlYX0FMTF9TT1VSQ0UuCgpEYW5pZWwgU3RlbmJlcmcgKDQgQXVnIDIwMDgpCi0gVGVzdCBjYXNlIDEwNDEgKGFkZGVkIGJ5IERhbmllbCBGYW5kcmljaCBKdWx5IDE0dGgpIHByb3ZlZCBhIGJ1ZyB3aGVyZSBQVVQKICB3aXRoIC1DIC0gc2VudCBnYXJiYWdlIGluIHRoZSBDb250ZW50LVJhbmdlOiBoZWFkZXIuIEkgZml4ZWQgdGhpcyBwcm9ibGVtIGJ5CiAgbWFraW5nIHN1cmUgbGliY3VybCBhbHdheXMgc2V0cyB0aGUgc2l6ZSBvZiB0aGUgX2VudGlyZV8gdXBsb2FkIGlmIGFuIGFwcAogIGF0dGVtcHMgdG8gZG8gcmVzdW1lZCB1cGxvYWRzIHNpbmNlIGxpYmN1cmwgc2ltcGx5IGNhbm5vdCBrbm93IHRoZSBzaXplIG9mCiAgd2hhdCBpcyBjdXJyZW50bHkgYXQgdGhlIHNlcnZlciBlbmQuIFRlc3QgMTA0MSBpcyBubyBsb25nZXIgZGlzYWJsZWQuCgpZYW5nIFRzZSAoMiBBdWcgMjAwOCkKLSBObyBsb25nZXIgdGVzdCBhdmFpbGFiaWxpdHkgb2YgdGhlIGdkaTMyIGxpYnJhcnksIG5vciB1c2UgaXQgZm9yIGxpbmtpbmcsIGV2ZW4KICB3aGVuIHdlIGhhdmUgYmVlbiBkb2luZyB0aGlzIHNpbmNlIHJldmlzaW9uIDEuNDcgb2YgY29uZmlndXJlLmFjIDQgeWVhcnMgYW5kCiAgNSBtb250aHMgYWdvIHdoZW4gY3Jvc3MtY29tcGlsaW5nIGEgV2luZG93cyB0YXJnZXQuIFdlIGFjdHVhbGx5IGRvbid0IHVzZSBhbnkKICBmdW5jdGlvbiBmcm9tIHRoZSBXaW5kb3dzIEdESSAoR3JhcGhpY3MgRGV2aWNlIEludGVyZmFjZSkgcmVsYXRlZCB3aXRoIGRyYXdpbmcKICBvciBncmFwaGljcy1yZWxhdGVkIG9wZXJhdGlvbnMuCgpEYW5pZWwgRmFuZHJpY2ggKDEgQXVnIDIwMDgpCi0gQWRkZWQgc3VwcG9ydCBmb3IgLS1hcHBlbmQgb24gU0ZUUCB1cGxvYWRzLiBVbmZvcnR1bmF0ZWx5LCBPcGVuU1NIIGRvZXNuJ3QKICBzdXBwb3J0IHRoaXMgc28gaXQgZ29lcyB1bnRlc3RlZC4KCllhbmcgVHNlICgxIEF1ZyAyMDA4KQotIENvbmZpZ3VyZSBwcm9jZXNzIG5vdyBjaGVja3MgaWYgdGhlIHByZXByb2Nlc3NvciBfUkVFTlRSQU5UIHN5bWJvbCBpcyBhbHJlYWR5CiAgZGVmaW5lZC4gSWYgaXQgaXNuJ3QgY3VycmVudGx5IGRlZmluZWQgYSBzZXQgb2YgY2hlY2tzIGFyZSBwZXJmb3JtZWQgdG8gdGVzdAogIGlmIGl0cyBkZWZpbml0aW9uIGlzIHJlcXVpcmVkIHRvIG1ha2UgdmlzaWJsZSB0byB0aGUgY29tcGlsZXIgYSBzZXQgb2YgKl9yCiAgZnVuY3Rpb25zLiBGaW5hbGx5LCBpZiBfUkVFTlRSQU5UIGlzIGFscmVhZHkgZGVmaW5lZCBvciBuZWVkZWQgaXQgdGFrZXMgY2FyZQogIG9mIG1ha2luZyBhZGp1c3RtZW50cyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgaXQgaXMgZGVmaW5lZCBlcXVhbGx5IGZvciB0aGUKICBjb25maWd1cmUgcHJvY2VzcyB0ZXN0cyBhbmQgZ2VuZXJhdGVkIGNvbmZpZyBmaWxlLgoKLSBSZW1vdmVkIGRlZmluaXRpb24gb2YgQ1VSTF9DSEVDS19XT1JLSU5HX1JFU09MVkVSIGZyb20gYWNpbmNsdWRlLm00IGl0IGhhcwogIG5vdCBiZWVuIGluIHVzZSBzaW5jZSByZXZpc2lvbiAxLjgxIG9mIGNvbmZpZ3VyZS5pbiA2IHllYXJzLCA5IG1vbnRocyBhZ28uCgpEYW5pZWwgRmFuZHJpY2ggKDMxIEp1bCAyMDA4KQotIEZpeGVkIHBhcnNpbmcgb2YgYW4gSVB2NiBwcm94eSBhZGRyZXNzIHRvIHN1cHBvcnQgYSBzY29wZSBpZGVudGlmaWVyLAogIGFzIHdlbGwgYXMgSVB2NCBhZGRyZXNzZXMgaW4gSVB2NiBmb3JtYXQuIEFsc28sIGJldHRlciBoYW5kbGUgdGhlIGNhc2UKICBvZiBhIG1hbGZvcm1hdHRlZCBJUHY2IGFkZHJlc3MgKGF2b2lkIGVtcHR5IGFuZCBOVUxMIHN0cmluZ3MpLgoKLSBGaXhlZCBhIHByb2JsZW0gd2l0aCBhbnkgRlRQIFVSTCBvciBhbnkgVVJMcyBjb250YWluaW5nIGFuIElQdjYgYWRkcmVzcwogIGJlaW5nIG1hbmdsZWQgd2hlbiBwYXNzZWQgdG8gcHJveGllcyB3aGVuIENVUkxPUFRfUE9SVCBpcyBhbHNvIHNldAogIChyZXBvcnRlZCBieSBQcmFtb2QgU2hhcm1hKS4KCi0gVXNlciBuYW1lcyBlbWJlZGRlZCBpbiBwcm94eSBVUkxzIHdpdGhvdXQgYSBwYXNzd29yZCB3ZXJlIHBhcnNlZAogIGluY29ycmVjdGx5LS10aGUgaG9zdCBuYW1lIGlzIHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgdXNlciBuYW1lIGFuZCB0aGUKICBwb3J0IG51bWJlciBiZWNvbWVzIHRoZSBwYXNzd29yZC4gIFRoaXMgY2FuIGJlIG9ic2VydmVkIGluIHRlc3QgMjc5CiAgKHdhcyBLTk9XTl9JU1NVRSAjNTQpLgoKRGFuaWVsIFN0ZW5iZXJnICgzMCBKdWwgMjAwOCkKLSBQaGlsIEJsdW5kZWxsIGFkZGVkIHRoZSBDVVJMT1BUX0FERFJFU1NfU0NPUEUgb3B0aW9uLCBhcyB3ZWxsIGFzIGFkanVzdGVkCiAgdGhlIFVSTCBwYXJzZXIgdG8gYWxsb3cgbnVtZXJpY2FsIElQdjYtYWRkcmVzc2VzIHRvIGJlIHNwZWNpZmllZCB3aXRoIHRoZQogIHNjb3BlIGdpdmVuLCBhcyBwZXIgUkZDNDAwNyAtIHdpdGggYSBwZXJjZW50IGxldHRlciB0aGF0IGl0c2VsZiBuZWVkcyB0byBiZQogIFVSTCBlc2NhcGVkLiBGb3IgZXhhbXBsZSwgZm9yIGFuIGFkZHJlc3Mgb2YgZmU4MDo6MTIzNCUxIHRoZSBIVFRQIFVSTCBpczoKICAiaHR0cDovL1tmZTgwOjoxMjM0JTI1MV0vIgoKLSBQSFAncyBidWcgcmVwb3J0ICM0MzE1OCAoaHR0cDovL2J1Z3MucGhwLm5ldC9idWcucGhwP2lkPTQzMTU4KSBpZGVudGlmaWVzIGEKICB0cnVlIGJ1ZyBpbiBsaWJjdXJsIGJ1aWx0IHdpdGggT3BlblNTTC4gSXQgbWFkZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIG1vcmUgb3IKICBsZXNzIGFsd2F5cyByZXR1cm4gMCBmb3IgQ1VSTElORk9fU1NMX1ZFUklGWVJFU1VMVCBiZWNhdXNlIHRoZSBmdW5jdGlvbiB0aGF0CiAgd291bGQgc2V0IGl0IHRvIHNvbWV0aGluZyBub24temVybyB3b3VsZCByZXR1cm4gYmVmb3JlIHRoZSBhc3NpZ24gaW4gYWxtb3N0CiAgYWxsIGVycm9yIGNhc2VzLiBUaGUgaW50ZXJuYWwgdmFyaWFibGUgaXMgbm93IHNldCB0byBub24temVybyBmcm9tIHRoZSBzdGFydAogIG9mIHRoZSBmdW5jdGlvbiBvbmx5IHRvIGdldCBjbGVhcmVkIGxhdGVyIG9uIGlmIHRoaW5ncyB3b3JrIG91dCBmaW5lLgoKLSBNYWRlIHRoZSBjdXJsIHRvb2wncyAtdyBvcHRpb24gc3VwcG9ydCB0aGUgJXtzc2xfdmVyaWZ5X3Jlc3VsdH0gdmFyaWFibGUKCkRhbmllbCBGYW5kcmljaCAoMzAgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDUyIHRocm91Z2ggMTA1NSB0byB0ZXN0IHVwbG9hZGluZyBkYXRhIGZyb20gZmlsZXMKICBkdXJpbmcgcmVkaXJlY3RzLiAgVGVzdCBjYXNlcyAxMDUyIGFuZCAxMDU1IHNob3cgcHJvYmxlbXMgKG1heWJlIHRoZSBzYW1lCiAgcm9vdCBjYXVzZSBhcyAxMDUxKSBhbmQgYXJlIGRpc2FibGVkLgoKLSBGaXhlZCBhIGNvdXBsZSBvZiBidWZmZXIgb3ZlcmZsb3dzIGluIHRoZSBNUy1ET1MgcG9ydCBvZiB0aGUgY3VybCB0b29sLgoKRGFuaWVsIEZhbmRyaWNoICgyOSBKdWwgMjAwOCkKLSBGaXhlZCAtLXVzZS1hc2NpaSB0byBwcm9wZXJseSBjb252ZXJ0IHRleHQgZmlsZXMgb24gU3ltYmlhbiBPUywgTVMtRE9TCiAgYW5kIE9TLzIuCgotIEFkZGVkIHRlc3QgY2FzZSAxMDUxIHRvIHRlc3QgTG9jYXRpb246IGZvbGxvd2luZyB3aXRoIFBVVCwgYXMgcmVwb3J0ZWQKICBieSBCZW4gU3V0Y2xpZmZlLiAgVGhlIHRlc3Qgd2hlbiBydW4gbWFudWFsbHkgc2hvd3MgYSBwcm9ibGVtIGluIGN1cmwKICBzbyBpdCdzIGRpc2FibGVkLgoKRGFuaWVsIEZhbmRyaWNoICgyOCBKdWwgMjAwOCkKLSBGaXhlZCBkaXNwbGF5IG9mIHRoZSBpbnRlcmZhY2UgYmluZCBhZGRyZXNzIGluIHRoZSB0cmFjZSBvdXRwdXQgd2hlbiBpdCdzCiAgYW4gSVB2NiBhZGRyZXNzLgoKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwNDUgdGhyb3VnaCAxMDQ5IGFzIHNpbXBsZSB0ZXN0cyBvZiAtLWludGVyZmFjZSB1c2luZyB0aGUKICBsb2NhbGhvc3QgaW50ZXJmYWNlLgoKLSBBZGRlZCB0ZXN0IGNhc2UgMTA1MCB0byB0ZXN0IC0tZnRwLXBvcnQgd2l0aCBhbiBJUHY2IGFkZHJlc3MKCkRhbmllbCBTdGVuYmVyZyAoMjYgSnVsIDIwMDgpCi0gRGF2aWQgQmF1IGZpbGVkIGJ1ZyByZXBvcnQgIzIwMjYyNDAgIkNVUkxfUkVBREZVTkNfUEFVU0UgbGVhZHMgdG8gYnVmZmVyCiAgb3ZlcnJ1biIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIwMjYyNDApIGlkZW50aWZ5aW5nIHR3bwogIHByb2JsZW1zLCBhbmQgcHJvdmlkaW5nIHRoZSBmaXggZm9yIHRoZW06CgogIC0gQ1VSTF9SRUFERlVOQ19QQVVTRSBkaWQgaW4gZmFjdCBub3QgcGF1c2UgdGhlIF9zZW5kaW5nXyBvZiBkYXRhIHRoYXQgaXQgaXMKICAgIGRlc2lnbmVkIGZvciBidXQgcGF1c2VkIF9yZWNlaXZpbmdfIG9mIGRhdGEhCgogIC0gbGliY3VybCBkaWRuJ3QgaW50ZXJuYWxseSBzZXQgdGhlIHJlYWQgY291bnRlciB0byB6ZXJvIHdoZW4gdGhpcyByZXR1cm4KICAgIGNvZGUgd2FzIGRldGVjdGVkLCB3aGljaCB3b3VsZCBwb3RlbnRpYWxseSBsZWFkIHRvIGp1bmsgZ2V0dGluZyBzZW50IHRvCiAgICB0aGUgc2VydmVyLgoKRGFuaWVsIEZhbmRyaWNoICgyNiBKdWwgMjAwOCkKLSBBZGRlZCB0ZXN0IDEwNDQgdG8gdGVzdCBsYXJnZSBmaWxlIHN1cHBvcnQgaW4gZnRwIHdpdGggLUkuCgotIEVsaW1pbmF0ZSBhIHVubmVjZXNzYXJ5IHNvY2tldCBjcmVhdGlvbiBpbiBDdXJsX2dldGFkZHJpbmZvIGZvciBhbiBJUHY0CiAgYWRkcmVzcyBpbiBhbiBJUHY2IGNhcGFibGUgbGliY3VybC4KCi0gQWRkZWQgZmVhdHVyZSBpbiBydW50ZXN0cy5wbCB0byBzZWxlY3QgdGVzdHMgYmFzZWQgb24ga2V5IHdvcmQuCgpEYW5pZWwgRmFuZHJpY2ggKDIzIEp1bCAyMDA4KQotIENoYW5nZWQgdGhlIGxvbmcgbG9nZmlsZSBlbGlzaW9uIGNvZGUgaW4gcnVudGVzdHMucGwgdG8gcHJvcGVybHkgaGFuZGxlCiAgbGluZXMgZW5kaW5nIGluIFxyLgoKLSBDaGFuZ2VkIHJlZmVyZW5jZXMgdG8gVFJVRSBhbmQgRkFMU0UgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2UgdG8KICAxIGFuZCB6ZXJvLCByZXNwZWN0aXZlbHksIHNpbmNlIFRSVUUgYW5kIEZBTFNFIGFyZW4ndCBwYXJ0IG9mIHRoZQogIGxpYmN1cmwgQVBJLgoKRGFuaWVsIFN0ZW5iZXJnICgyMyBKdWwgMjAwOCkKLSBJIHdlbnQgb3ZlciB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSBhbmQgcmVwbGFjZWQgbW9zdCByZWZlcmVuY2VzIHRvCiAgbm9uLXplcm8gd2l0aCB0aGUgZml4ZWQgdmFsdWUgb2YgMS4gV2Ugc2hvdWxkIHN0cml2ZSBhdCBtYWtpbmcgb3B0aW9ucwogIHN1cHBvcnQgJzEnIGZvciBlbmFibGluZyB0aGVtIG1lbnRpb25lZCBleHBsaWNpdGx5LCBhcyB0aGF0IHRoZW4gd2lsbCBhbGxvdwogIHVzIGZvciB0byBleHRlbmQgdGhlbSBpbiB0aGUgZnV0dXJlIHdpdGhvdXQgYnJlYWtpbmcgb2xkZXIgcHJvZ3JhbXMuCgogIFBvc3NpYmx5IHdlIHNob3VsZCBldmVuIGludHJvZHVjZSBhIGZhbmN5IGRlZmluZSB0byB1c2UgaW5zdGVhZCBvZiAnMScgYWxsCiAgb3Zlci4uLgoKWWFuZyBUc2UgKDIxIEp1bCAyMDA4KQotIFVzZSB0aGUgc3JlYWRmcm9tKCkgd3JhcHBlciB0byByZXBsYWNlIHJlY3Zmcm9tKCkgaW4gb3VyIGNvZGUuCgpZYW5nIFRzZSAoMjAgSnVsIDIwMDgpCi0gd2hlbiByZWN2ZnJvbSBwcm90b3R5cGUgdXNlcyBhIHZvaWQgcG9pbnRlciBmb3IgYXJndW1lbnRzIDIsIDUgb3IgNiB0aGlzIHdpbGwKICBub3cgY2F1c2UgdGhlIGRlZmluaXRpb24sIGFzIGFwcHJvcHJpYXRlLCBvZiBSRUNWRlJPTV9UWVBFX0FSRzJfSVNfVk9JRCwKICBSRUNWRlJPTV9UWVBFX0FSRzVfSVNfVk9JRCBvciBSRUNWRlJPTV9UWVBFX0FSRzZfSVNfVk9JRC4KCllhbmcgVHNlICgxNyBKdWwgMjAwOCkKLSBSRUNWRlJPTV9UWVBFX0FSRzIsIFJFQ1ZGUk9NX1RZUEVfQVJHNSBhbmQgUkVDVkZST01fVFlQRV9BUkc2IGFyZSBub3cgZGVmaW5lZAogIHRvIHRoZSBkYXRhIHR5cGUgcG9pbnRlZCBieSBpdHMgcmVzcGVjdGl2ZSBhcmd1bWVudCBhbmQgbm90IHRoZSBwb2ludGVyIHR5cGUuCgpZYW5nIFRzZSAoMTYgSnVsIDIwMDgpCi0gQ29uZmlndXJlIHByb2Nlc3Mgbm93IGNoZWNrcyBhdmFpbGFiaWxpdHkgb2YgcmVjdmZyb20oKSBzb2NrZXQgZnVuY3Rpb24gYW5kCiAgZmluZHMgb3V0IGl0cyByZXR1cm4gdHlwZSBhbmQgdGhlIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIEFkZGVkIGRlZmluaXRpb25zCiAgZm9yIG5vbi1jb25maWd1cmUgc3lzdGVtcyBjb25maWcgZmlsZXMsIGFuZCBpbnRyb2R1Y2VkIG1hY3JvIHNyZWFkZnJvbSB3aGljaAogIHdpbGwgYmUgdXNlZCBvbiB1ZHAgc29ja2V0cyBhcyBhIHJlY3Zmcm9tKCkgd3JhcHBlci4KCllhbmcgVHNlICgxNSBKdWwgMjAwOCkKLSBBZGRlZCBkZXNjcmlwdGlvbi9jb21tZW50IHRvIGluY2x1ZGUgcGF0aHMgdXNlZCBpbiBzZXZlcmFsIE1ha2VmaWxlLmFtIGZpbGVzLgogIEFkZGVkIGF1dG9tYWtlIG9wdGlvbiBub3N0ZGluYyB0byB0ZXN0IHNlcnZlcnMgbWFrZWZpbGUgYW5kIG1vZGlmaWVkIGxpYmN1cmwKICBleHRlcm5hbCBoZWFkZXJzIGluY2x1ZGUgcGF0aCBmb3IgbGlidGVzdCBwcm9ncmFtcy4KCkRhbmllbCBGYW5kcmljaCAoMTQgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdDEwNDAgdGhyb3VnaCB0ZXN0MTA0MyB0byB0ZXN0IC1DIC0gb24gSFRUUC4gVGVzdCAxMDQxIGZhaWxlZCBzbwogIGl0J3MgYWRkZWQgdG8gRElTQUJMRUQuCgpZYW5nIFRzZSAoMTQgSnVsIDIwMDgpCi0gSFRUUF9PTkxZIGRlZmluaXRpb24gY2hlY2sgaW4gbGliL3NldHVwLmggaXMgbm93IGRvbmUgb25jZSB0aGF0IGNvbmZpZ3VyYXRpb24KICBmaWxlIGhhcyBiZWVuIGluY2x1ZGVkLiBJbiB0aGlzIHdheSBpZiBzeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGUgY29uZmlnIGZpbGUKICBpdCB3aWxsIG5vIGxvbmdlciBiZSBpZ25vcmVkLiAgUmVtb3ZlZCBpbmNsdXNpb24gb2YgcmVtYWluaW5nIHN5c3RlbSBoZWFkZXIKICBmaWxlcyBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZXMuIE1vdmVkIF9SRUVOVFJBTlQgZGVmaW5pdGlvbiB1cC9lYXJsaWVyIGluCiAgbGliL3NldHVwLmgKCllhbmcgVHNlICgxMSBKdWwgMjAwOCkKLSBBZGRlZCBtaXNzaW5nIG11bHRpcGxlIGhlYWRlciBpbmNsdXNpb24gcHJldmVudGlvbiBkZWZpbml0aW9uIGZvciBoZWFkZXIKICBmaWxlIGNvbnRlbnRfZW5jb2RpbmcuaAoKRGFuaWVsIEZhbmRyaWNoICgxMSBKdWwgMjAwOCkKLSBGaXhlZCB0ZXN0IDU1MyB0byBwYXNzIHRoZSB0b3J0dXJlIHRlc3QuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEp1bCAyMDA4KQotIERhbmllbCBGYW5kcmljaCBmb3VuZCBvdXQgd2UgZGlkbid0IHBhc3Mgb24gdGhlIHVzZXItYWdlbnQgcHJvcGVybHkgd2hlbgogIGRvaW5nICJwcm94eS10dW5uZWxzIiB3aXRoIG5vbi1IVFRQIHByb3RvdG9scyBhbmQgdGhhdCB3YXMgc2ltcGx5IGJlY2F1c2UKICB0aGUgY29kZSBhc3N1bWVkIHRoZSB1c2VyLWFnZW50IHdhcyBvbmx5IG5lZWRlZCBmb3IgSFRUUC4KCkRhbmllbCBGYW5kcmljaCAoMTAgSnVsIDIwMDgpCi0gQ2hhbmdlZCBzbGlnaHRseSB0aGUgU0ZUUCBxdW90ZSBjb21tYW5kcyBjaG1vZCwgY2hvd24gYW5kIGNoZ3JwIHRvIG9ubHkKICBzZXQgdGhlIGF0dHJpYnV0ZSB0aGF0IGhhcyBjaGFuZ2VkIGluc3RlYWQgb2YgYWxsIHBvc3NpYmxlIG9uZXMuIEhvcGVmdWxseSwKICB0aGlzIHdpbGwgc29sdmUgdGhlICJQZXJtaXNzaW9uIGRlbmllZCIgcHJvYmxlbSB0aGF0IE5hZ2FyYWphbiBTcmVlbml2YXNhbgogIHJlcG9ydGVkIHdoZW4gc2V0dGluZyBzb21lIG1vZGVzLCBidXQgcmVnYXJkbGVzcywgaXQgc2F2ZXMgYSBwcm90b2NvbAogIHJvdW5kIHRyaXAgaW4gdGhlIGNobW9kIGNhc2UuCgotIEFkZGVkIHRlc3QgY2FzZXMgMTAzOCBhbmQgMTAzOSB0byB0ZXN0IEFkcmlhbiBLcmVoZXIncyByZXBvcnQgdGhhdCBmdHAKICB1cGxvYWRzIHdpdGggLUMgLSBkaWRuJ3QgcmVzdW1lIHByb3Blcmx5LCBidXQgdGhlIHRlc3RzIHBhc3MuCgpZYW5nIFRzZSAoMTAgSnVsIDIwMDgpCi0gUGV0ZXIgTGFtYmVyZyBmaWxlZCBidWcgcmVwb3J0ICMyMDE1MTI2OiAicG9sbCBnaXZlcyBXU0FFSU5WQUwgd2hlbiBQT0xMUFJJCiAgaXMgc2V0IGluIGZkc2V0LmV2ZW50cyIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIwMTUxMjYpIHdoaWNoCiAgZXhhY3RseSBwaW5wb2ludGVkIHRoZSBwcm9ibGVtIG9ubHkgdHJpZ2dlcmVkIG9uIFdpbmRvd3MgVmlzdGEsIHByb3ZpZGVkCiAgcmVmZXJlbmNlIHRvIGRvY3MgYW5kIGFsc28gYSBmaXguIFRoZXJlIGlzIG11Y2ggd29yayBiZWhpbmQgUGV0ZXIgTGFtYmVyZydzCiAgZXhjZWxsZW50IGJ1ZyByZXBvcnQuIFRoYW5rIFlvdSEKCkRhbmllbCBGYW5kcmljaCAoOSBKdWwgMjAwOCkKLSBBZGRlZCB0ZXN0cyAxMDM2IGFuZCAxMDM3IHRvIHZlcmlmeSByZXN1bWVkIGZ0cCBkb3dubG9hZHMgd2l0aCAtQyAtCgpEYW5pZWwgU3RlbmJlcmcgKDkgSnVsIDIwMDgpCi0gQW5kcmVhcyBTY2h1bGRlaSBpbXByb3ZlZCBQaGlsIEJsdW5kZWxsJ3MgcGF0Y2ggZm9yIElQdjYgdXNpbmcgYy1hcmVzLCBhbmQgSQogIGVkaXRlZCBpdCBzbGlnaHRseS4gTm93IHlvdSBzaG91bGQgYmUgYWJsZSB0byB1c2UgSVB2NiBhZGRyZXNzZXMgZmluZSBldmVuCiAgd2l0aCBsaWJjdXJsIGJ1aWx0IHRvIHVzZSBjLWFyZXMuCgpEYW5pZWwgRmFuZHJpY2ggKDkgSnVsIDIwMDgpCi0gRml4ZWQgYW4gT09NIGhhbmRsaW5nIHByb2JsZW0gdGhhdCBjYXVzZSB0ZXN0IDExIHRvIGZhaWwgdGhlIHRvcnR1cmUgdGVzdC4KCkRhbmllbCBGYW5kcmljaCAoOCBKdWwgMjAwOCkKLSBGaXhlZCB0ZXN0IDU1NCB0byBwYXNzIHRoZSB0b3J0dXJlIHRlc3QuCgpEYW5pZWwgRmFuZHJpY2ggKDcgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDM0ICYgMTAzNSB0byB0ZXN0IElETiBuYW1lIGNvbnZlcnNpb24gZmFpbHVyZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDcgSnVsIDIwMDgpCi0gU2NvdHQgQmFycmV0dCBwcm92aWRlZCBhIHRlc3QgY2FzZSBmb3IgYSBzZWdmYXVsdCBpbiB0aGUgRlRQIGNvZGUgYW5kIHRoZQogIGZpeCBmb3IgaXQuIEl0IG9jY3VyZWQgd2hlbiB5b3UgZGlkIGEgRlRQIHRyYW5zZmVyIHVzaW5nCiAgQ1VSTEZUUE1FVEhPRF9TSU5HTEVDV0QgYW5kIHRoZW4gZGlkIGFub3RoZXIgb25lIG9uIHRoZSBzYW1lIGVhc3kgaGFuZGxlIGJ1dAogIHN3aXRjaGVkIHRvIENVUkxGVFBNRVRIT0RfTk9DV0QuIER1ZSB0byB0aGUgImRpciBkZXB0aCIgdmFyaWFibGUgbm90IGJlaW5nCiAgY2xlYXJlZCBwcm9wZXJseS4gIFNjb3R0J3MgdGVzdCBjYXNlIGlzIG5vdyBrbm93biBhcyB0ZXN0IDUzOSBhbmQgaXQKICB2ZXJpZmllcyB0aGUgZml4LgoKRGFuaWVsIFN0ZW5iZXJnICgzIEp1bCAyMDA4KQotIFBoaWwgQmx1bmRlbGwgcHJvdmlkZWQgYSBmaXggZm9yIGxpYmN1cmwncyB0cmVhdG1lbnQgb2YgdW5leHBlY3RlZCAxeHgKICByZXNwb25zZSBjb2Rlcy4gUHJldmlvdXNseSBsaWJjdXJsIHdvdWxkIGhhbmcgb24gc3VjaCBvY2N1cmFuY2VzLiBJIGFkZGVkCiAgdGVzdCBjYXNlIDEwMzMgdG8gdmVyaWZ5LgoKLSBJbnRyb2N1ZGluZyBhIG5ldyB0aW1lc3RhbXAgZm9yIGN1cmxfZWFzeV9nZXRpbmZvKCk6CiAgQ1VSTElORk9fQVBQQ09OTkVDVF9USU1FLiBUaGlzIGlzIHNldCB3aXRoIHRoZSAiYXBwbGljYXRpb24gbGF5ZXIiCiAgaGFuZHNoYWtlL2Nvbm5lY3Rpb24gaXMgY29tcGxldGVkLiBXaGljaCB0eXBpY2FsbHkgaXMgU1NMLCBUTFMgb3IgU1NIIGFuZCBieQogIHVzaW5nIHRoaXMgeW91IGNhbiBmaWd1cmUgb3V0IHRoZSBhcHBsaWNhdGlvbiBsYXllcidzIG93biBjb25uZWN0IHRpbWUuIFlvdQogIGNhbiBleHRyYWN0IHRoZSB0aW1lIHN0YW1wIHVzaW5nIGN1cmwncyAtdyBvcHRpb24gYW5kIHRoZSBuZXcgdmFyaWFibGUgbmFtZWQKICAndGltZV9hcHBjb25uZWN0Jy4gVGhpcyBmZWF0dXJlIHdhcyBzcG9uc29yZWQgYnkgTGVubnkgUmFjaGl0c2t5IGF0IE5ldVN0YXIuCgpEYW5pZWwgRmFuZHJpY2ggKDIgSnVsIDIwMDgpCi0gU3VwcG9ydCBPcGVuIFdhdGNvbSBDIG9uIExpbnV4IChhcyB3ZWxsIGFzIFdpbmRvd3MpLgoKWWFuZyBUc2UgKDIgSnVsIDIwMDgpCi0gVGhlIHByZXZpb3VzbHkgY29tbWl0dGVkIGZpeCBmb3IgYnVnIHJlcG9ydCAjMTk5OTE4MSBwcmV2ZW50ZWQgdXNpbmcgdGhlCiAgbW9ub3RvbmljIGNsb2NrIG9uIGFueSBzeXN0ZW0gd2l0aG91dCBhbiBhbHdheXMgc3VwcG9ydGVkIFBPU0lYIGNvbXBsaWFudAogIGltcGxlbWVudGF0aW9uLiBOb3cgdGhlIFBPU0lYIGNvbXBsaWFudCBjb25maWd1cmF0aW9uIGNoZWNrIGlzIHJlbW92ZWQgYW5kCiAgd2lsbCBmYWxsYmFjayB0byBnZXR0aW1lb2ZkYXkgd2hlbiB0aGUgbW9ub3RvbmljIGNsb2NrIGlzIHVuYXZhaWxhYmxlIGF0CiAgcnVuLXRpbWUuCgotIFRoZSBjb25maWd1cmUgcHJvY2VzcyB3aWxsIG5vdyBoYWx0IHdoZW4gc2VkLCBncmVwLCBlZ3JlcCBvciBhciBwcm9ncmFtcwogIGNhbiBub3QgYmUgZm91bmQgYW1vbmcgdGhlIGRpcmVjdG9yaWVzIGluIFBBVEggdmFyaWFibGUuCgpEYW5pZWwgU3RlbmJlcmcgKDEgSnVsIDIwMDgpCi0gUm9sbGFuZCBEdWRlbWFpbmUgcHJvdmlkZWQgZml4ZXMgdG8gZ2V0IGxpYmN1cmwgdG8gYnVpbGQgZm9yIHRoZSBJTlRFR1JJVFkKICBvcGVyYXRpbmcgc3lzdGVtLgoKRGFuaWVsIFN0ZW5iZXJnICgzMCBKdW4gMjAwOCkKLSBNYWRlIHRoZSBpbnRlcm5hbCBwcmludGYoKSBzdXBwb3J0ICVsbHUgcHJvcGVybHkgdG8gcHJpbnQgdW5zaWduZWQgbG9uZyBsb25ncy4KCi0gU3RlcGhlbiBDb2xseWVyIGFuZCBUb3IgQXJudHNlbiBoZWxwZWQgaWRlbnRpZnkgYSBmbGF3IGluIHRoZSByYW5nZSBjb2RlCiAgd2hpY2ggb3V0cHV0IHRoZSByYW5nZSB1c2luZyBhIHNpZ25lZCB2YXJpYWJsZSB3aGVyZSBpdCBzaG91bGQgcmF0aGVyIHVzZQogIHVuc2lnbmVkLgoKWWFuZyBUc2UgKDI5IEp1biAyMDA4KQotIEpvaG4gTGlnaHRzZXkgZmlsZWQgYnVnIHJlcG9ydCAjMTk5OTE4MTogIkNMT0NLX01PTk9UT05JQyBhbHdheXMgZmFpbHMgb24KICBzb21lIHN5c3RlbXMiIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTk5MTgxKS4gVGhlIHByb2JsZW0gd2FzCiAgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBkaWQgbm90IHVzZSB0aGUgX1BPU0lYX01PTk9UT05JQ19DTE9DSyBmZWF0dXJlIHRlc3QKICBtYWNybyB3aGVuIGNoZWNraW5nIG1vbm90b25pYyBjbG9jayBhdmFpbGFiaWxpdHkuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0aGUKICBtb25vdG9uaWMgY2xvY2sgd2lsbCBub3QgYmUgdXNlZCB1bmxlc3MgdGhlIGZlYXR1cmUgdGVzdCBtYWNybyBpcyBkZWZpbmVkCiAgd2l0aCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvIGluZGljYXRpbmcgYWx3YXlzIHN1cHBvcnRlZC4KCkRhbmllbCBGYW5kcmljaCAoMjUgSnVuIDIwMDgpCi0gSG9ub3VyIC0tc3RkZXJyIHdpdGggdGhlIC12IG9wdGlvbi4KCi0gRml4ZWQgYSBmaWxlIGhhbmRsZSBsZWFrIGluIHRoZSBjb21tYW5kIGxpbmUgY2xpZW50IGlmIG1vcmUgdGhhbiBvbmUKICAtLXN0ZGVyciBvcHRpb24gd2FzIGdpdmVuLgoKRGFuaWVsIFN0ZW5iZXJnICgyMiBKdW4gMjAwOCkKLSBFZHVhcmQgQmxvY2ggZmlsZWQgdGhlIGRlYmlhbiBidWcgcmVwb3J0ICM0ODc1NjcKICAoaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQ4NzU2NykgcG9pbnRpbmcgb3V0IHRoYXQKICBsaWJjdXJsIHVzZWQgQ29udGVudC1SYW5nZTogaW5zdGVhZCBvZiBSYW5nZSB3aGVuIGRvaW5nIGEgcmFuZ2UgcmVxdWVzdCB3aXRoCiAgLS1oZWFkIChDVVJMT1BUX05PQk9EWSkuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0ZXN0IGNhc2UgMTAzMiB3YXMgYWRkZWQgdG8KICB2ZXJpZnkuCgpEYW5pZWwgRmFuZHJpY2ggKDIxIEp1biAyMDA4KQotIFN0b3BwZWQgdXNpbmcgcmFuZ2VzIGluIHNjYW5mIGNoYXJhY3RlciBzZXF1ZW5jZXMgKGUuZy4gJVthLXpdKSBzaW5jZSB0aGF0CiAgaXMgbm90IEFOU0kgQywganVzdCBhIGNvbW1vbiBleHRlbnNpb24uICBUaGlzIGNhdXNlZCBwcm9ibGVtcyBvbgogIGF0IGxlYXN0IE9wZW4gV2F0Y29tIEMuCgpZYW5nIFRzZSAoMjAgSnVuIDIwMDgpCi0gTW9kaWZpZWQgY29uZmlndXJhdGlvbiBzY3JpcHQgdG8gYWN0dWFsbHkgdmVyaWZ5IGlmIHRoZSBjb21waWxlciBpcyBnb29kCiAgZW5vdWdoIGF0IGRldGVjdGluZyBjb21waWxhdGlvbiBlcnJvcnMgb3IgYXQgbGVhc3QgaXQgaGFzIGJlZW4gcHJvcGVybHkKICBjb25maWd1cmVkIHRvIGRvIHNvLiBDb25maWd1cmF0aW9uIGhlYXZpbHkgZGVwZW5kcyBvbiB0aGlzIGNhcGFiaWxpdHksIHNvCiAgaWYgdGhpcyBjb21waWxlciBzYW5pdHkgY2hlY2sgZmFpbHMgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIG5vdyBmYWlsLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBKdW4gMjAwOCkKLSBQaGlsIFBlbGxvdWNob3VkIGZvdW5kIGEgY2FzZSB3aGVyZSBsaWJjdXJsIGJ1aWx0IHdpdGggTlNTIGZhaWxlZCB0bwogIGhhbmRzaGFrZSB3aXRoIGEgU1NMdjIgc2VydmVyLCBhbmQgaXQgdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIGl0IGRpZG4ndAogIHJlY29nbml6ZSB0aGUgY2lwaGVyIG5hbWVkICJyYzQtbWQ1Ii4gSW4gb3VyIGxpc3QgdGhhdCBjaXBoZXIgd2FzIG5hbWVkCiAgcGxhaW5seSAicmM0Ii4gSSd2ZSBub3cgYWRkZWQgcmM0LW1kNSB0byB3b3JrIGFzIGFuIGFsaWFzIGFzIFBoaWwgcmVwb3J0ZWQKICB0aGF0IGl0IG1hZGUgdGhpbmdzIHdvcmsgZm9yIGhpbSBhZ2Fpbi4KCi0gSGFucy1KdXJnZW4gTWF5IHBvaW50ZWQgb3V0IHRoYXQgdHJ5aW5nIFNDUCBvciBTRlRQIG92ZXIgYSBTT0NLUyBwcm94eQogIGNyYXNoZWQgbGliY3VybC4gVGhpcyBpcyBub3cgYWRkcmVzc2VkIGJ5IG1ha2luZyBzdXJlIHdlIHVzZSAicGxhaW4gc2VuZCIKICBpbnRlcm5hbGx5IHdoZW4gZG9pbmcgdGhlIHNvY2tzIGhhbmRzaGFrZSBpbnN0ZWFkIG9mIHRoZSBDdXJsX3dyaXRlKCkKICBmdW5jdGlvbiB3aGljaCBpcyBkZXNpZ25lZCB0byB1c2UgdGhlICJ0YXJnZXQiIHByb3RvY29sLiBUaGF0J3MgdGhlbiBTQ1Agb3IKICBTRlRQIGluIHRoaXMgY2FzZS4gSSBhbHNvIHRvb2sgdGhlIG9wcG9ydHVuaXR5IGFuZCBjbGVhbmVkIHVwIHNvbWUgc3NoLQogIHJlbGF0ZWQgI2lmZGVmcyBpbiB0aGUgY29kZSBmb3IgcmVhZGFiaWxpdHkuCgpEYW5pZWwgU3RlbmJlcmcgKDE5IEp1biAyMDA4KQotIENocmlzdG9waGVyIFBhbG93IGZpeGVkIGEgY3VybF9tdWx0aV9zb2NrZXQoKSBpc3N1ZSB3aGljaCBwcmV2aW91c2x5IGNhdXNlZAogIGxpYmN1cmwgdG8gbm90IHRlbGwgdGhlIGFwcCBwcm9wZXJseSB3aGVuIGEgc29ja2V0IHdhcyBjbG9zZWQgKHdoZW4gdGhlIG5hbWUKICByZXNvbHZlIGRvbmUgYnkgYy1hcmVzIGlzIGNvbXBsZXRlZCkgYW5kIHRoZW4gaW1tZWRpYXRlbHkgcmUtY3JlYXRlZCBhbmQgcHV0CiAgdG8gdXNlIGFnYWluIChmb3IgdGhlIGFjdHVhbCBjb25uZWN0aW9uKS4gU2luY2UgdGhlIGNsb3N1cmUgd2lsbCBtYWtlIHRoZQogICJ3YXRjaCBzdGF0dXMiIGdldCBsb3N0IGluIHNldmVyYWwgZXZlbnQtYmFzZWQgc3lzdGVtcyBsaWJjdXJsIHdpbGwgbmVlZCB0bwogIHRlbGwgdGhlIGFwcCBhYm91dCB0aGlzIGNsb3NlL3JlLWNyZWF0ZSBjYXNlLgoKLSBEZW5nbWlud2VuIGZvdW5kIGEgYnVnIGluIHRoZSBjb25uZWN0aW9uIHJlLXVzZSBmdW5jdGlvbiB3aGVuIHVzaW5nIHRoZQogIG11bHRpIGludGVyZmFjZSB3aXRoIHBpcGVsaW5pbmcgZW5hYmxlZCBhcyBpdCB3b3VsZCB3cm9uZ2x5IGNoZWNrIGZvciwKICBkZXRlY3QgYW5kIGNsb3NlICJkZWFkIGNvbm5lY3Rpb25zIiBldmVuIHRob3VnaCB0aGF0IGNvbm5lY3Rpb24gd2FzIGFscmVhZHkKICBpbiB1c2UhCgpEYW5pZWwgRmFuZHJpY2ggKDE4IEp1biAyMDA4KQotIEFkZGVkIFNTSCBmYWlsdXJlIHRlc3QgY2FzZXMgNjI4LTYzMgoKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBjb21tYW5kLWxpbmUgdG9vbCB0aGF0IGNhdXNlZCBhIHZhbGdyaW5kIGVycm9yLgoKRGFuaWVsIFN0ZW5iZXJnICgxOCBKdW4gMjAwOCkKLSBSb2IgQ3JpdHRlbmRlbiBicm91Z2h0IGEgZml4IGZvciB0aGUgTlNTIGxheWVyIHRoYXQgbWFrZXMgbGliY3VybCBubyBsb25nZXIKICBhbHdheXMgZmlyZSB1cCBhIG5ldyBjb25uZWN0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBleGlzdGluZyBvbmUgd2hlbiB0aGUKICBtdWx0aSBpbnRlcmZhY2UgaXMgdXNlZC4gT3JpZ2luYWwgYnVnIHJlcG9ydDoKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTQ1MDE0MAoKWWFuZyBUc2UgKDE4IEp1biAyMDA4KQotIEludGVybmFsIGNvbmZpZ3VyZSBzY3JpcHQgaW1wcm92ZW1lbnQuIE5vIGxvbmdlciBicmVhayBvdXQgb2Ygc2hlbGwgImZvciIKICBzdGF0ZW1lbnRzIGZyb20gaW5zaWRlIEFDX0ZPT19JRkVMU0UgbWFjcm9zLCBvdGhlcndpc2UgdGVtcG9yYXJ5IG1hY3JvIGZpbGVzCiAgYXJlIG5vdCBwcm9wZXJseSByZW1vdmVkLgoKRGFuaWVsIEZhbmRyaWNoICgxMiBKdW4gMjAwOCkKLSBGaXhlZCBjdXJsLWNvbmZpZyAtLWNhIHdoaWNoIHdhc24ndCBiZWluZyBleHBvcnRlZCBieSBjb25maWd1cmUuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEp1biAyMDA4KQotIEkgZGlkIGEgY2xlYW51cCBvZiB0aGUgaW50ZXJuYWwgZ2VuZXJpYyBTU0wgbGF5ZXIgYW5kIGhvdyB0aGUgdmFyaW91cyBTU0wKICBsaWJyYXJpZXMgYXJlIHN1cHBvcnRlZC4gU3RhcnRpbmcgbm93LCBlYWNoIHVuZGVybHlpbmcgU1NMIGxpYnJhcnkgc3VwcG9ydAogIGNvZGUgZG9lcyBhIHNldCBvZiBkZWZpbmVzIGZvciB0aGUgMTYgZnVuY3Rpb25zIHRoZSBnZW5lcmljIGxheWVyIChzc2xnZW4uYykKICB1c2VzIChhbGwgdGhlc2UgbmV3IGZ1bmN0aW9uIGRlZmluZXMgdXNlIHRoZSBwcmVmaXggImN1cmxzc2xfIikuIFRoaXMKICBncmVhdGx5IHNpbXBsaWZpZWQgdGhlIGdlbmVyaWMgbGF5ZXIgaW4gcmVhZGFiaWxpdHkgYnkgaW52b2x2aW5nIG11Y2ggbGVzcwogICNpZmRlZnMgYW5kIG90aGVyIHByZXByb2Nlc3NvciBzdHVmZiBhbmQgc2hvdWxkIG1ha2UgaXQgZWFzaWVyIGZvciBwZW9wbGUgdG8KICBtYWtlIGxpYmN1cmwgd29yayB3aXRoIG5ldyBTU0wgbGlicmFyaWVzLgoKICBIb3BlZnVsbHkgSSBjYW4gbGF0ZXIgb24gZG9jdW1lbnQgdGhlc2UgMTYgZnVuY3Rpb25zIHNvbWV3aGF0IGFzIHdlbGwuCgogIEkgYWxzbyBtYWRlIG1vc3Qgb2YgdGhlIGludGVybmFsIFNTTC1kZXBlbmRlbnQgZnVuY3Rpb25zICh1c2luZyBDdXJsX3NzbF8KICBwcmVmaXgpICNkZWZpbmVkIHRvIG5vdGhpbmcgd2hlbiBubyBTU0wgc3VwcG9ydCBpcyByZXF1ZXN0ZWQgLSBwcmV2aW91c2x5CiAgdGhleSB3b3VsZCB1bm5lY2Vzc2FyaWx5IGNhbGwgbW9zdGx5IGVtcHR5IGZ1bmN0aW9ucy4KCiAgSSd2ZSBidWlsdCBsaWJjdXJsIHdpdGggT3BlblNTTCBhbmQgR251VExTIGFuZCB3aXRob3V0IFNTTCB0byB0ZXN0IHRoaXMgYW5kCiAgSSd2ZSBhbHNvIHRyaWVkIGJ1aWxkaW5nIHdpdGggTlNTIGJ1dCB0aGUgTlNTIHN1cHBvcnQgaXMgYSBteXN0ZXJ5IHRvIG1lIGFuZAogIEkgZmFpbGVkIHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCB0aGUgTlNTIGxpYnJhcmllcyBJIGhhdmUgaW5zdGFsbGVkLiBXZSByZWFsbHkKICBzaG91bGQgQSkgaW1wcm92ZSBvdXIgY29uZmlndXJlIHNjcmlwdCB0byBkZXRlY3QgdW5zdWl0YWJsZSBOU1MgdmVyc2lvbnMKICBhbHJlYWR5IGF0IGNvbmZpZ3VyZSB0aW1lIGFuZCBCKSBkb2N1bWVudCBvdXIgcmVxdWlyZW1lbnRzIGJldHRlciBmb3IgdGhlCiAgU1NMIGxpYnJhcmllcy4KCkRhbmllbCBTdGVuYmVyZyAoMTAgSnVuIDIwMDgpCi0gSSBtYWRlIHRoZSBPcGVuU1NMIGNvZGUgYnVpbGQgYWdhaW4gd2l0aCBPcGVuU1NMIDAuOS42LiBUaGUgQ1JMRklMRQogIGZ1bmN0aW9uYWxpdHkga2lsbGVkIGl0IGR1ZSB0byBpdHMgdW5jb25kaXRpb25hbCB1c2Ugb2YKICBYNTA5X1NUT1JFX3NldF9mbGFncy4uLgoKRGFuaWVsIFN0ZW5iZXJnICg4IEp1biAyMDA4KQotIER1ZSB0byB0aGUgdGhyZWUgbmV3IGxpYmN1cmwgY2hhbmdlcyBhbmQgdGhlIG1hc3NpdmUgY29tbWFuZCBsaW5lIG9wdGlvbgogIGNoYW5nZSBJIGRlY2lkZWQgd2UnbGwgbWFyayBpdCBieSBidW1waW5nIHRoZSBuZXh0IHJlbGVhc2UgbnVtYmVyIHRvIDcuMTkuMCEKCi0gY3VybCB0aGUgdG9vbCBub3cgZGVhbHMgd2l0aCBpdHMgY29tbWFuZCBsaW5lIG9wdGlvbnMgc29tZXdoYXQgZGlmZmVyZW50bHkhCiAgQWxsIGJvb2xlYW4gb3B0aW9ucyAoc3VjaCBhcyAtTywgLUksIC12IGV0YyksIGJvdGggc2hvcnQgYW5kIGxvbmcgdmVyc2lvbnMsCiAgbm93IGFsd2F5cyBzd2l0Y2ggb24vZW5hYmxlIHRoZSBvcHRpb24gbmFtZWQuIFVzaW5nIHRoZSBzYW1lIG9wdGlvbiBtdWx0aXBsZQogIHRpbWVzIHRodXMgbWFrZSBubyBkaWZmZXJlbmNlLiBUbyBzd2l0Y2ggb2ZmIG9uZSBvZiB0aG9zZSBvcHRpb25zLCB5b3UgbmVlZAogIHRvIHVzZSB0aGUgbG9uZyB2ZXJzaW9uIG9mIHRoZSBvcHRpb24gYW5kIHR5cGUgLS1uby1PUFRJT04uIExpa2UgdG8gZGlzYWJsZQogIHZlcmJvc2UgbW9kZSB5b3UgdXNlIC0tbm8tdmVyYm9zZSEKCi0gQWRkZWQgLS1yZW1vdGUtbmFtZS1hbGwgdG8gY3VybCwgd2hpY2ggaWYgdXNlZCBjaGFuZ2VzIHRoZSBkZWZhdWx0IGZvciBhbGwKICBnaXZlbiBVUkxzIHRvIGJlIGRlYWx0IHdpdGggYXMgaWYgLU8gaXMgdXNlZC4gU28gaWYgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGF0CiAgZm9yIGEgc3BlY2lmaWMgVVJMIGFmdGVyIC0tcmVtb3RlLW5hbWUtYWxsIGhhcyBiZWVuIHVzZWQsIHlvdSBtdXNlIHVzZSAtbyAtCiAgb3IgLS1uby1yZW1vdGUtbmFtZS4KCkRhbmllbCBTdGVuYmVyZyAoNiBKdW4gMjAwOCkKLSBBeGVsIFRpbGxlcXVpbiBhbmQgQXJuYXVkIEViYWxhcmQgYWRkZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9JU1NVRVJDRVJULCBmb3IKICBPcGVuU1NMLCBOU1MgYW5kIEdudVRMUy1idWlsdCBsaWJjdXJscy4KCi0gQXhlbCBUaWxsZXF1aW4gYW5kIEFybmF1ZCBFYmFsYXJkIGFkZGVkIHN1cHBvcnQgZm9yIENVUkxPUFRfQ1JMRklMRSwgZm9yCiAgT3BlblNTTCwgTlNTIGFuZCBHbnVUTFMtYnVpbHQgbGliY3VybHMuCgotIEFkZGVkIENVUkxJTkZPX1BSSU1BUllfSVAgYXMgYSBuZXcgaW5mb3JtYXRpb24gcmV0cmlldmFibGUgd2l0aAogIGN1cmxfZWFzeV9nZXRpbmZvLiBJdCByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyB3aXRoIHRoZSBtb3N0IHJlY2VudGx5CiAgdXNlZCBJUCBhZGRyZXNzLiBNb2RpZmllZCB0ZXN0IGNhc2UgNTAwIHRvIGFsc28gdmVyaWZ5IHRoaXMgZmVhdHVyZS4gVGhlCiAgaW1wbGVtZW50aW5nIG9mIHRoaXMgZmVhdHVyZSB3YXMgc3BvbnNvcmVkIGJ5IExlbm55IFJhY2hpdHNreSBhdCBOZXVTdGFyLgoKVmVyc2lvbiA3LjE4LjIgKDQgSnVuZSAyMDA4KQoKRGFuaWVsIEZhbmRyaWNoICgzIEp1biAyMDA4KQotIEZpeGVkIGEgcHJvYmxlbSB3aGVyZSB0ZWxuZXQgZGF0YSB3b3VsZCBiZSBsb3N0IGlmIGFuIEVXT1VMREJMT0NLCiAgY29uZGl0aW9uIHdlcmUgZW5jb3VudGVyZWQuCgpNYXJ0eSBLdWhydCAoMSBKdW4gMjAwOCkKLSBVcGRhdGVkIG1haW4uYyB0byByZXR1cm4gQ1VSTEVfT0sgaWYgUEFSQU1fSEVMUF9SRVFVRVNURUQgd2FzIHJldHVybmVkCiAgZnJvbSBnZXRwYXJhbWV0ZXIgaW5zdGVhZCBvZiBDVVJMRV9GQUlMRURfSU5JVC4gIE5vIHBvaW50IGluIHJldHVybmluZwogIGFuIGVycm9yIGlmIC0taGVscCBvciAtLXZlcnNpb24gd2VyZSByZXF1ZXN0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDI4IE1heSAyMDA4KQotIEVtaWwgUm9tYW51cyBmb3VuZCBhIHByb2JsZW0gYW5kIGhlbHBlZCBtZSByZXBlYXQgaXQuIEl0IG9jY3VyZWQgd2hlbiB1c2luZwogIHRoZSBjdXJsX211bHRpX3NvY2tldCgpIEFQSSB3aXRoIEhUVFAgcGlwZWxpbmluZyBlbmFibGVkIGFuZCBjb3VsZCBsZWFkIHRvCiAgdGhlIHBpcGVsaW5lIGJhc2ljYWxseSBzdGFsbGluZyBmb3IgYSB2ZXJ5IGxvbmcgcGVyaW9kIG9mIHRpbWUgdW50aWwgaXQgdG9vawogIG9mZiBhZ2Fpbi4KCi0gSmVmZiBXZWJlciByZXBvcnRlZCBtZW1vcnkgbGVha3Mgd2l0aCBhYm9ydGVkIFNDUCBhbmQgU0ZUUCB0cmFuc2ZlcnMgYW5kCiAgcHJvdmlkZWQgZXhjZWxsZW50IHJlcGVhdCByZWNpcGVzLiBJIGZpeGVkIHRoZSBjYXNlcyBJIG1hbmFnZWQgdG8gcmVwcm9kdWNlCiAgYnV0IEplZmYgc3RpbGwgZ290IHNvbWUgKFNDUCkgcHJvYmxlbXMgZXZlbiBhZnRlciB0aGVzZSBmaXhlczoKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDUvMDM0Mi5odG1sCgpEYW5pZWwgU3RlbmJlcmcgKDI2IE1heSAyMDA4KQotIEJ1ZyByZXBvcnQgIzE5NzMzNTIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE5NzMzNTIpIGlkZW50aWZpZWQKICBob3cgdGhlIEhUVFAgcmVkaXJlY3QgZm9sbG93aW5nIGNvZGUgZGlkbid0IHByb3Blcmx5IGZvbGxvdyB0byBhIG5ldyBVUkwgaWYKICB0aGUgbmV3IHVybCB3YXMgYnV0IGEgcXVlcnkgc3RyaW5nIHN1Y2ggYXMgIkxvY2F0aW9uOiA/bW9vPWZvbyIuIFRlc3QgY2FzZQogIDEwMzEgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGlzIGZpeC4KCi0gQW5kcmVhcyBGYWVyYmVyIGFuZCBTY290dCBNY0NyZWFyeSBtYWRlIChsaWIpY3VybCBidWlsZCBmb3IgdGhlIEhhaWt1IE9TLgoKWWFuZyBUc2UgKDI2IE1heSAyMDA4KQotIERhdmlkIFJvc2Vuc3RyYXVjaCByZXBvcnRlZCB0aGF0IGhlYWRlciBmaWxlcyBzcG5lZ29oZWxwLmggYW5kCiAgb3BlbnNzbC9vYmplY3RzLmggd2VyZSBuZWVkZWQgdG8gY29tcGlsZSBTUE5FR08gc3VwcG9ydC4KCkRhbmllbCBGYW5kcmljaCAoMjIgTWF5IDIwMDgpCi0gTWFkZSBzdXJlIHRvIHBhc3MgbG9uZ3MgaW4gdG8gY3VybF9lYXN5X3NldG9wdCB3aGVyZSBuZWNlc3NhcnkgaW4gdGhlCiAgZXhhbXBsZSBwcm9ncmFtcyBhbmQgbGlidGVzdCBjb2RlLgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBNYXkgMjAwOCkKLSBXaGVuIHRyeWluZyB0byByZXBlYXQgYSBtdWx0aSBpbnRlcmZhY2UgcHJvYmxlbSBJIGZlbGwgb3ZlciBhIGZldyBtdWx0aQogIGludGVyZmFjZSBwcm9ibGVtczoKCiAgbyB3aXRoIHBpcGVsaW5pbmcgZGlzYWJsZWQsIHRoZSBzdGF0ZSBzaG91bGQgbmV2ZXIgYmUgc2V0IHRvIFdBSVRETyBidXQKICAgIHJhdGhlciBnbyBzdHJhaWdodCB0byBETwoKICBvIHdlIGhhZCBtdWx0aXBsZSBzdGF0ZXMgZm9yIHdoaWNoIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiByZXR1cm5lZCBubyBzb2NrZXQKICAgIGF0IGFsbCB0byB3YWl0IGZvciwgd2l0aCB0aGUgZWZmZWN0IHRoYXQgbGliY3VybCBjYWxscyB0aGUgc29ja2V0IGNhbGxiYWNrCiAgICAod2hlbiBjdXJsX211bHRpX3NvY2tldCgpIGlzIHVzZWQpIHdpdGggUkVNT1ZFIHByZW1hdHVyZWx5IChhcyBpdCB3b3VsZCBiZQogICAgYWRkZWQgYWdhaW4gd2l0aGluIHZlcnkgc2hvcnRseSkKCiAgbyB3aGVuIGluIERPIGFuZCBET0lORyBzdGF0ZXMsIHRoZSBIVFRQIGFuZCBIVFRQUyBwcm90b2NvbCBoYW5kbGVyIGZ1bmN0aW9ucwogICAgZGlkbid0IHJldHVybiB0aGF0IHRoZSBzb2NrZXQgc2hvdWxkIGJlIHdhaXRlZCBmb3Igd3JpdGluZywgYnV0IGluc3RlYWQgaXQKICAgIHdhcyB0cmVhdGVkIGFzIGlmIG5vIHNvY2tldCB3YXMgbmVlZGluZyBtb25pdG9yaW5nIHNvIGFnYWluIFJFTU9WRSB3YXMKICAgIGNhbGxlZCBwcmVtYXR1cmVseS4KCkRhbmllbCBTdGVuYmVyZyAoMTMgTWF5IDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlIDU1NiB0aGF0IHVzZXMgY3VybF9lYXN5X3NlbmQoKSBhbmQgY3VybF9lYXN5X3JlY3YoKQoKRGFuaWVsIFN0ZW5iZXJnICg5IE1heSAyMDA4KQotIEludHJvZHVjaW5nIGN1cmxfZWFzeV9zZW5kKCkgYW5kIGN1cmxfZWFzeV9yZWN2KCkuIFRoZXkgY2FuIGJlIHVzZWQgdG8gc2VuZAogIGFuZCByZWNlaXZlIGRhdGEgb3ZlciBhIGNvbm5lY3Rpb24gcHJldmlvdXNseSBzZXR1cCB3aXRoIGN1cmxfZWFzeV9wZXJmb3JtKCkKICBhbmQgaXRzIENVUkxPUFRfQ09OTkVDVF9PTkxZIG9wdGlvbi4gVGhlIHNlbmRyZWN2LmMgZXhhbXBsZSB3YXMgYWRkZWQgdG8KICBzaG93IGhvdyB0aGV5IGNhbiBiZSB1c2VkLgoKWWFuZyBUc2UgKDkgTWF5IDIwMDgpCi0gSW50ZXJuYWwgdGltZSBkaWZmZXJlbmNlcyBub3cgdXNlIG1vbm90b25pYyB0aW1lIHNvdXJjZSBpZiBhdmFpbGFibGUuCiAgVGhpcyBhbHNvIGltcGxpZXMgdGhlIHJlbW92YWwgb2YgdGhlIHdpbm1tLmxpYiBkZXBlbmRlbmN5IGZvciBXSU4zMi4KCkRhbmllbCBTdGVuYmVyZyAoOSBNYXkgMjAwOCkKLSBTdGVmYW4gS3JhdXNlIHJlcG9ydGVkIGEgYnVzeS1sb29waW5nIGNhc2Ugd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgYW5kIGRvaW5nIENPTk5FQ1QgdG8gYSBwcm94eS4gVGhlIGFwcCB3b3VsZCB0aGVuIGJ1c3ktbG9vcCB1bnRpbCB0aGUgcHJveHkKICBjb21wbGV0ZWQgaXRzIHJlc3BvbnNlLgoKTWljaGFsIE1hcmVrICg5IE1heSAyMDA4KQotIE1ha2UgQ3VybF93cml0ZSBhbmQgaXQncyBjYWxsZWVzIGFjY2VwdCBhIGNvbnN0IHBvaW50ZXIsIGluIHByZXBhcmF0aW9uCiAgb2YgdGV0ZXRlc3QncyBwYXRjaCBmb3IgY3VybF9lYXN5X3NlbmQoKQoKRGFuaWVsIFN0ZW5iZXJnICg3IE1heSAyMDA4KQotIExpYW0gSGVhbHkgZmlsZWQgdGhlIGRlYmlhbiBidWcgcmVwb3J0ICM0ODAwNDQKICAoaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQ4MDA0NCkgaWRlbnRpZnlpbmcgYQogIHNlZ2ZhdWx0IHdoZW4gdXNpbmcga3JiNSBmdHAsIGJ1dCB0aGUga3JiNCBjb2RlIGhhZCB0aGUgc2FtZSBwcm9ibGVtLgoKWWFuZyBUc2UgKDcgTWF5IDIwMDgpCi0gQ2hyaXN0b3BoZXIgUGFsb3cgcHJvdmlkZWQgdGhlIHBhdGNoIChlZGl0ZWQgYnkgbWUpIHRoYXQgaW50cm9kdWNlcyB0aGUKICB1c2Ugb2YgbWljcm9zZWNvbmQgcmVzb2x1dGlvbiBrZXlzIGZvciBpbnRlcm5hbCBzcGxheSB0cmVlcy4KCkRhbmllbCBTdGVuYmVyZyAoNCBNYXkgMjAwOCkKLSBZdXJpeSBTb3NvdiBwb2ludGVkIG91dCBhIGNvbmZpZ3VyZSBmaXggZm9yIGRldGVjdGluZyBjLWFyZXMgd2hlbiB0aGF0IGlzCiAgYnVpbHQgZGVidWctZW5hYmxlZC4KCkRhbmllbCBTdGVuYmVyZyAoMyBNYXkgMjAwOCkKLSBCZW4gVmFuIEhvZiBmaWxlZCBidWcgcmVwb3J0ICMxOTQ1MjQwOiAibGliY3VybCBzb21ldGltZXMgc2VuZHMgYm9keSB0d2ljZQogIHdoZW4gdXNpbmcgQ1VSTF9BVVRIX0FOWSIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE5NDUyNDApLgogIFRoZSBwcm9ibGVtIHdhcyB0aGF0IHdoZW4gbGliY3VybCByZXdvdW5kIGEgc3RyZWFtIG1lYW50IGZvciB1cGxvYWQgd2hlbiBpdAogIHdvdWxkIHByZXBhcmUgZm9yIGEgc2Vjb25kIHJlcXVlc3QsIGl0IGNvdWxkIGFjY2lkZW50YWxseSBjb250aW51ZSB0aGUKICBzZW5kaW5nIG9mIHRoZSByZXdvdW5kIGRhdGEgb24gdGhlIGZpcnN0IHJlcXVlc3QgaW5zdGVhZCBvZiBvbiB0aGUgc2Vjb25kLgogIEJlbiBhbHNvIHByb3ZpZGVkIHRlc3QgY2FzZSAxMDMwIHRoYXQgdmVyaWZpZXMgdGhpcyBmaXguCgpEYW5pZWwgU3RlbmJlcmcgKDMgTWF5IDIwMDgpCi0gSmVhbi1GcmFuY29pcyBCZXJ0cmFuZCByZXBvcnRlZCBhIGxpYmN1cmwgY3Jhc2ggd2l0aCBDVVJMT1BUX1RDUF9OT0RFTEFZCiAgc2luY2UgbGliY3VybCB1c2VkIGdldHByb3RvYnluYW1lKCkgYW5kIHRoYXQgaXNuJ3QgdGhyZWFkLXNhZmUuIFdlIG5vdwogIHN3aXRjaGVkIHRvIHVzZSBJUFBST1RPX1RDUCB1bmNvbmRpdGlvbmFsbHksIGJ1dCBwZXJoYXBzIHRoZSBwcm9wZXIgZml4IGlzCiAgdG8gZGV0ZWN0IHRoZSB0aHJlYWQtc2FmZSB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBhbmQgdXNlIHRoYXQuCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTA1LzAwMTEuaHRtbAoKRGFuaWVsIFN0ZW5iZXJnICgxIE1heSAyMDA4KQotIEJhcnQgV2hpdGVsZXkgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1hZGUgbGliY3VybCB3b3JrIHByb3Blcmx5IHdoZW4gYW4gYXBwCiAgdXNlcyB0aGUgQ1VSTE9QVF9PUEVOU09DS0VURlVOQ1RJT04gY2FsbGJhY2sgdG8gY3JlYXRlIGEgdW5peCBkb21haW4gc29ja2V0CiAgdG8gYSBodHRwIHNlcnZlci4KCkRhbmllbCBTdGVuYmVyZyAoMjkgQXByIDIwMDgpCi0gVG8gbWFrZSBpdCBlYXNpZXIgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgbG90cyBvZiBtYWdpYyBzdHVmZiBkb25lIG9uCiAgcmVkaXJlY3Rpb25zIGFuZCB0aHVzIGNhbm5vdCB1c2UgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiBlYXNpbHksIHdlIG5vdwogIGludHJvZHVjZSB0aGUgbmV3IENVUkxJTkZPX1JFRElSRUNUX1VSTCBvcHRpb24gdGhhdCBsZXRzIGFwcGxpY2F0aW9ucwogIGV4dHJhY3QgdGhlIFVSTCBsaWJjdXJsIHdvdWxkJ3ZlIHJlZGlyZWN0ZWQgdG8gaWYgaXQgaGFkIGJlZW4gdG9sZCB0by4gVGhpcwogIHRoZW4gZW5hYmxlcyB0aGUgYXBwbGljYXRpb24gdG8gY29udGludWUgdG8gdGhhdCBVUkwgYXMgaXQgdGhpbmtzIGlzCiAgc3VpdGFibGUsIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWltcGxlbWVudCB0aGUgbWFnaWMgb2YgY3JlYXRpbmcgdGhlIG5ldyBVUkwKICBmcm9tIHRoZSBMb2NhdGlvbjogaGVhZGVyIGV0Yy4gVGVzdCAxMDI5IHZlcmlmaWVzIGl0LgoKWWFuZyBUc2UgKDI5IEFwciAyMDA4KQotIEltcHJvdmVkIGVhc3kgaW50ZXJmYWNlIHJlc29sdmluZyB0aW1lb3V0IGhhbmRsaW5nIGluIGMtYXJlcyBlbmFibGVkIGJ1aWxkcwoKRGFuaWVsIEZhbmRyaWNoICgyOCBBcHIgMjAwOCkKLSBBZGRlZCB0ZXN0IDEwMjggdG8gdGVzdCBhbiBIVFRQIHJlZGlyZWN0IHRvIGEgRlRQIFVSTC4KCkRhbmllbCBTdGVuYmVyZyAoMjggQXByIDIwMDgpCi0gTm9yYmVydCBGcmVzZSBmaWxlZCBidWcgcmVwb3J0ICMxOTUxNTg4OiAiUHJvYmxlbSB3aXRoIGN1cmxmdHBmcyBhbmQKICBsaWJjdXJsIiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTk1MTU4OCkgd2hpY2ggc2VlbXMgdG8gYmUgYW4KICBpZGVudGljYWwgcmVwb3J0IHRvIHdoYXQgRGVuaXMgR29sb3ZhbiByZXBvcnRlZCBpbgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOC0wMi8wMTA4Lmh0bWwgVGhlIEZUUCBjb2RlIGRpZG4ndCByZXNldCB0aGUKICB1c2VyL3Bhc3N3b3JkIHBvaW50ZXJzIHByb3Blcmx5IGV2ZW4gdGhvdWdoIHRoZXJlIG1pZ2h0J3ZlIGJlZW4gYSBuZXcKICBzdHJ1Y3QvY2Nvbm5lY3Rpb24gZ2V0dGluZyB1c2VkLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBBcHIgMjAwOCkKLSBSZXZlcnRlZCBiYWNrIHRvIHVzZSBhdXRvbWFrZSAxLjkuNiBpbiB0aGUgbmV4dCByZWxlYXNlIChmcm9tIGF1dG9tYWtlCiAgMS4xMC4xKSBzaW5jZSBpdCAqc3RpbGwqIHN1ZmZlcnMgZnJvbSBTb2xhcmlzLXJlbGF0ZWQgYnVncy4gT3VyIHByZXZpb3VzCiAgYXV0b21ha2UgMS4xMCBwcm9ibGVtIHdhcyByZXBvcnRlZCBpbiBidWcgIzE3MDEzNjAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcwMTM2MCkgYW5kIHRoaXMgcmVjZW50IHByb2JsZW0gd2FzCiAgYnVnICMxOTQ0ODI1IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTQ0ODI1KS4gSSBoYXZlIG5vdAogIHBlcnNvbmFsbHkgYXBwcm9hY2hlZCB0aGUgYXV0b21ha2UgdGVhbSBhYm91dCBlaXRoZXIgb25lIG9mIHRoZXNlIGJ1dCBJCiAgZmlndXJlIHdlIG5lZWQgYSBTb2xhcmlzIDEwIGd1eSB0byBkbyBpdCEKCllhbmcgVHNlICgyNSBBcHIgMjAwOCkKLSBBZGRlZCAndGltZW91dCcgYW5kICdkZWxheScgYXR0cmlidXRlcyBzdXBwb3J0IGZvciB0aGUgdGVzdCBoYXJuZXNzCiAgPGNvbW1hbmQ+IHN1YnNlY3Rpb24uCgpEYW5pZWwgRmFuZHJpY2ggKDI0IEFwciAyMDA4KQotIE1hZGUgLS1zdGRlcnIgYWJsZSB0byByZWRpcmVjdCBhbGwgc3RkZXJyIG1lc3NhZ2VzLgoKWWFuZyBUc2UgKDIzIEFwciAyMDA4KQotIEltcHJvdmUgc3luY2hyb25pemF0aW9uIGJldHdlZW4gdGVzdCBoYXJuZXNzIHJ1bnRlc3RzLnBsIHNjcmlwdAogIGFuZCB0ZXN0IGhhcm5lc3Mgc2VydmVycyB0byBtaW5pbWl6ZSByaXNrIG9mIGZhbHNlIHRlc3QgZmFpbHVyZXMuCgpEYW5pZWwgRmFuZHJpY2ggKDIyIEFwciAyMDA4KQotIEFkZGVkIHN1cHBvcnQgZm9yIHJ1bm5pbmcgb24gU3ltYmlhbiBPUy4KCkRhbmllbCBGYW5kcmljaCAoMTggQXByIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDI2IGFuZCAxMDI3IHRvIGRvIHNvbWUgcnVkaW1lbnRhcnkgdGVzdHMgb24gdGhlIC0tbWFudWFsCiAgYW5kIC0taGVscCBvcHRpb25zLgoKTWljaGFsIE1hcmVrICgxNCBBcHIgMjAwOCkKLSBhbGxvdyBkaXNhYmxpbmcgdGhlIHR5cGVjaGVja2VyIGJ5IGRlZmluaW5nIENVUkxfRElTQUJMRV9UWVBFQ0hFQ0ssIGFzCiAgZGlzY3Vzc2VkIGluIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOC0wNC8wMjkxLmh0bWwKCkRhbmllbCBTdGVuYmVyZyAoMTQgQXByIDIwMDgpCi0gU3RlZmFuIEtyYXVzZSByZXBvcnRlZCBhIGNhc2Ugd2hlcmUgdGhlIE9wZW5TU0wgaGFuZHNoYWtlIHBoYXNlIHdhc24ndAogIHByb3Blcmx5IGFja25vd2xlZGdpbmcgdGhlIHRpbWVvdXQgdmFsdWVzLCBsaWtlIGlmIHlvdSBwdWxsZWQgdGhlIG5ldHdvcmsKICBwbHVnIGluIHRoZSBtaWRzdCBvZiBpdC4KCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBmaXhlZCBhIHNlY29uZCBjYXNlIG9mIG5vdCBjaGVja2luZyB0aGUgbWFsbG9jKCkKICByZXR1cm4gY29kZSBpbiB0aGUgTmVnb3RpYXRlIGNvZGUuCgotIFNhbmRvciBGZWxkaSByZXBvcnRlZCBidWcgIzE5NDIwMjIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTk0MjAyMikgcG9pbnRpbmcgb3V0IGEgbWlzdGFrZSBpbiB0aGUKICBsaWIvTWFrZWZpbGUudmNbNjhdIG1ha2VmaWxlcycgcmVsZWFzZS1zc2wtZGxsIHRhcmdldC4KCi0gQnJvY2sgTm9sYW5kIHJlcG9ydGVkIHRoYXQgY3VybCBiZWhhdmVkIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB3aGljaCBvcmRlcgogIHlvdSB1c2VkIC1pIGFuZCAtSS4KCkRhbmllbCBTdGVuYmVyZyAoMTIgQXByIDIwMDgpCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBmb3VuZCBhbmQgZml4ZWQgYSBjYXNlIHdoZXJlIG1hbGxvYygpIHdhcyBjYWxsZWQgYnV0CiAgd2FzIG5vdCBjaGVja2VkIGZvciBhIE5VTEwgcmV0dXJuLCBpbiB0aGUgTmVnb3RpYXRlIGNvZGUuCgpEYW5pZWwgRmFuZHJpY2ggKDkgQXByIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDI0ICYgMTAyNSB0byB0ZXN0IGEgc2NlbmFyaW8gc2ltaWxhciB0byB0aGUgb25lIHJlcG9ydGVkCiAgYnkgQmVuIENvbWJlZSB3aGVyZSBsaWJjdXJsIHdvdWxkIHNlbmQgdGhlIHdyb25nIGNvb2tpZSB0byBhIHJlZGlyZWN0ZWQKICBzZXJ2ZXIuICBsaWJjdXJsIHdhcyBkb2luZyB0aGUgcmlnaHQgdGhpbmcgaW4gdGhlc2UgdGVzdCBjYXNlcy4KCk1pY2hhbCBNYXJlayAoNyBBcHIgMjAwOCkKLSBGaXggdGhlIE1JVCAvIEhlaW1kYWwgY2hlY2sgZm9yIGdvb2Q6CiAgRGVmaW5lIEhBVkVfR1NTTUlUIGlmIDxnc3NhcGkve2dzc2FwaS5oLGdzc2FwaV9nZW5lcmljLmgsZ3NzYXBpX2tyYjUuaH0+IGFyZQogIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGRlZmluZSBIQVZFX0dTU0hFSU1EQUwgaWYgPGdzc2FwaS5oPiBpcyBhdmFpbGFibGUuCgogIE9ubHkgZGVmaW5lIEdTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFIHRvIGdzc19udF9zZXJ2aWNlX25hbWUgaWYKICBHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSBpc24ndCBkZWNsYXJlZCBieSB0aGUgZ3NzYXBpIGhlYWRlcnMuIFRoaXMgc2hvdWxkCiAgYXZvaWQgYnJlYWthZ2UgaW4gY2FzZSB3ZSB3cm9uZ2x5IHJlY29nbml6ZSBIZWltZGFsIGFzIE1JVCBhZ2Fpbi4KCkRhbmllbCBTdGVuYmVyZyAoNSBBcHIgMjAwOCkKLSBBbGV4ZXkgU2ltYWsgZml4ZWQgY3VybF9lYXN5X3Jlc2V0KCkgdG8gcmVzZXQgdGhlIG1heCByZWRpcmVjdCBsaW1pdCBwcm9wZXJseQoKLSBCYXNlZCBvbiB0aGUgRGViaWFuIGJ1ZyByZXBvcnQgIzQ3NDIyNCB0aGF0IGNvbXBsYWluZWQgYWJvdXQgdGhlIEZUUCBlcnJvcgogIG1lc3NhZ2Ugd2hlbiBsaWJjdXJsIGRvZXNuJ3QgZ2V0IGEgMjIwIGJhY2sgaW1tZWRpYXRlbHkgb24gY29ubmVjdCwgSSBub3cKICBjaGFuZ2VkIGl0IHRvIGJlIG1vcmUgc3BlY2lmaWMgb24gd2hhdCB0aGUgcHJvYmxlbSBpcy4gQWxzbyB3b3J0aCBub3RpY2luZzoKICB3aGlsZSB0aGUgYnVnIHJlcG9ydCBjb250YWlucyBhbiBleGFtcGxlIHdoZXJlIHRoZSByZXNwb25zZSBpczoKCiAgICA0MjEgVGhlcmUgYXJlIHRvbyBtYW55IGNvbm5lY3RlZCB1c2VycywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcgoKICB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBhbHdheXMgYmUgdGhpcyByZWFkYWJsZSBub3IKICB0aGF0IGl0IGZpdHMgd2l0aGluIGEgcGFydGljdWxhciBib3VuZGFyeSBldGMuCgpEYW5pZWwgRmFuZHJpY2ggKDMgQXByIDIwMDgpCi0gQWRkZWQgdGVzdDYyNyB0byB0ZXN0IFNGVFAgd2l0aCBDVVJMT1BUX05PQk9EWQoKRGFuaWVsIFN0ZW5iZXJnICgzIEFwciAyMDA4KQotIFNldHRpbmcgQ1VSTE9QVF9OT0JPRFkgdG8gRkFMU0Ugd2lsbCBub3cgc3dpdGNoIHRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kIHRvCiAgR0VUIHNpbXBseSBiZWNhdXNlIHByZXZpb3VzbHkgd2hlbiB5b3Ugc2V0IENVUkxPUFRfTk9CT0RZIHRvIFRSVUUgZmlyc3QgYW5kCiAgdGhlbiBGQUxTRSB5b3UnZCBlbmQgdXAgaW4gYSBicm9rZW4gc3RhdGUgd2hlcmUgYSBIVFRQIHJlcXVlc3Qgd291bGQgZG8gYQogIEhFQUQgYnkgc3RpbGwgYWN0IGEgbG90IGxpa2UgZm9yIGEgR0VUIGFuZCBoYW5nIHdhaXRpbmcgZm9yIHRoZSBjb250ZW50IGV0Yy4KCi0gU2NvdHQgQmFycmV0dCBhZGRlZCBzdXBwb3J0IGZvciBDVVJMT1BUX05PQk9EWSBvdmVyIFNGVFAKCkRhbmllbCBGYW5kcmljaCAoMyBBcHIgMjAwOCkKLSBNYWRlIHN1cmUgdGhhdCBjdXJsX2dsb2JhbF9pbml0IGlzIGNhbGxlZCBpbiBhbGwgdGhlIG11bHRpdGhyZWFkZWQKICBleGFtcGxlIHByb2dyYW1zLgoKTWljaGFsIE1hcmVrICgzMSBNYXIgMjAwOCkKLSBSZW1vdmVkIHRoZSBnZW5lcmF0ZWQgY2EtYnVuZGxlLmggZmlsZS4gVGhlIHZlcmJhdGltIHZhbHVlIG9mICRjYSBhbmQKICAkY2FwYXRoIGlzIGtub3duIHRvIGNvbmZpZ3VyZSwgc28gaXQgY2FuIGJlIGRlZmluZWQgaW4gY29uZmlnLmggaW5zdGVhZC4KCkRhbmllbCBTdGVuYmVyZyAoMzEgTWFyIDIwMDgpCi0gQWRkZWQgQ1VSTEZPUk1fU1RSRUFNIGFzIGEgc3VwcG9ydGVkIG9wdGlvbiB0byBjdXJsX2Zvcm1hZGQoKSB0byBhbGxvdyBhbgogIGFwcGxpY2F0aW9uIHRvIHByb3ZpZGUgZGF0YSBmb3IgYSBtdWx0aXBhcnQgd2l0aCB0aGUgcmVhZCBjYWxsYmFjay4gTm90ZQogIHRoYXQgdGhlIHNpemUgbmVlZHMgdG8gYmUgcHJvdmlkZWQgd2l0aCBDVVJMRk9STV9DT05URU5UU0xFTkdUSCB3aGVuIHRoZQogIHN0cmVhbSBvcHRpb24gaXMgdXNlZC4gVGhpcyBmZWF0dXJlIGlzIHZlcmlmaWVkIGJ5IHRoZSBuZXcgdGVzdCBjYXNlCiAgNTU0LiBUaGlzIGZlYXR1cmUgd2FzIHNwb25zb3JlZCBieSBYcG9uYXV0LgoKRGFuaWVsIEZhbmRyaWNoICgzMCBNYXIgMjAwOCkKLSBDaGFuZ2VkIHRoZSBtYWtlZmlsZSBzbyB0aGUgZG9jL2V4YW1wbGVzLyBwcm9ncmFtcyBhcmUgbmV2ZXIgYnVpbHQgaW4gYQogIG5vcm1hbCBidWlsZC9pbnN0YWxsIChvbmx5IHdpdGggdGhlICdtYWtlIGNoZWNrJyB0YXJnZXQpLCBzbyB0aGF0IGEKICBidWlsZCBmYWlsdXJlIGluIHRoZSBleGFtcGxlcyBpc24ndCBmYXRhbC4KClZlcnNpb24gNy4xOC4xICgzMCBNYXJjaCAyMDA4KQoKRGFuaWVsIFN0ZW5iZXJnICgyOCBNYXIgMjAwOCkKLSBTdGVwaGVuIENvbGx5ZXIgcG9pbnRlZCBvdXQgdGhhdCBjb25maWd1cmUgLS13aXRoLWxpYnNzaDIgd2l0aG91dCBhIGdpdmVuCiAgcGF0aCBkaWRuJ3Qgd29yayBwcm9wZXJseS4KCkRhbmllbCBTdGVuYmVyZyAoMjcgTWFyIDIwMDgpCi0gQXMgZm91bmQgb3V0IGFuZCByZXBvcnRlZCBieSBEYW4gUGV0aXR0LCBsaWJjdXJsIGRpZG4ndCBzaG93IHByb2dyZXNzL2NhbGwKICB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgZm9yIHRoZSBmaXJzdCAocG90ZW50aWFsbHkgaHVnZSkgcGllY2Ugb2YgYm9keSBkYXRhCiAgc2VudCB0b2dldGhlciB3aXRoIHRoZSBQT1NUIHJlcXVlc3QgaGVhZGVycyBpbiB0aGUgaW5pdGlhbCBzZW5kKCkuCgpEYW5pZWwgU3RlbmJlcmcgKDI1IE1hciAyMDA4KQotIE1hZGUgc2V0dGluZyB0aGUgQ1VSTE9QVF9TU0xfQ1RYX0ZVTkNUSU9OIG9wdGlvbiByZXR1cm4gYSBmYWlsdXJlIGluIGNhc2UKICBsaWJjdXJsIHdhc24ndCBidWlsdCB0byB1c2UgT3BlblNTTCBhcyB0aGF0IGlzIGEgcHJlcmVxdWlzaXRlIGZvciB0aGlzCiAgb3B0aW9uIHRvIGZ1bmN0aW9uIQoKRGFuaWVsIFN0ZW5iZXJnICgyMiBNYXIgMjAwOCkKLSBGaXhlZCB0aGUgcHJvYmxlbSB3aXRoIGRvaW5nIGEgemVybyBieXRlIFNDUCB0cmFuc2ZlciwgdmVyaWZpZWQgd2l0aCB0ZXN0CiAgY2FzZSA2MTcgKHdoaWNoIHdhcyBhZGRlZCBieSBEYW5pZWwgRmFuZHJpY2ggNSBNYXIgMjAwOCkuCgpEYW5pZWwgRmFuZHJpY2ggKDIwIE1hciAyMDA4KQotIEZpeGVkIGEgcHJvYmxlbSB3aGVyZSBjdXJsLWNvbmZpZyAtLXByb3RvY29scyBjb3VsZCBlcnJvbmVvdXNseSBzaG93IExEQVBTCiAgc3VwcG9ydCB3aGVuIGN1cmwgZGlkbid0IGV2ZW4gaGF2ZSByZWd1bGFyIExEQVAgc3VwcG9ydC4gIEl0IGxvb2tzIGxpa2UKICB0aGlzIGNvdWxkIGhhcHBlbiB3aGVuIHRoZSAtLWVuYWJsZS1sZGFwcyBjb25maWd1cmUgc3dpdGNoIGlzIGdpdmVuIGJ1dAogIGNvbmZpZ3VyZSBjb3VsZG4ndCBmaW5kIHRoZSBMREFQIGhlYWRlcnMgb3IgbGlicmFyaWVzLgoKTWljaGFsIE1hcmVrICgyMCBNYXIgMjAwOCkKLSBBZGRlZCAtLXdpdGgtY2EtcGF0aD1ESVJFQ1RPUlkgY29uZmlndXJlIG9wdGlvbiB0byB1c2UgYW4gb3BlblNTTCBDQXBhdGggYnkKICBkZWZhdWx0IGluc3RlYWQgb2YgYSBjYSBidW5kbGUuIFRoZSBjb25maWd1cmUgc2NyaXB0IHdpbGwgYWxzbyBsb29rIGZvciBhCiAgY2EgcGF0aCBpZiBubyBjYSBidW5kbGUgaXMgZm91bmQgYW5kIG5vIG9wdGlvbiBnaXZlbi4KCi0gRml4ZWQgZGV0ZWN0aW9uIG9mIHByZXZpb3VzbHkgaW5zdGFsbGVkIGN1cmwtY2EtYnVuZGxlLmNydAoKRGFuaWVsIEZhbmRyaWNoICgxOCBNYXIgMjAwOCkKLSBBZGRlZCB0ZXN0IDYyNiB0byByZXByb2R1Y2UgYW4gaW5maW5pdGUgbG9vcCB3aGVuIGdpdmVuIGFuIGludmFsaWQKICBTRlRQIHF1b3RlIGNvbW1hbmQgcmVwb3J0ZWQgYnkgVmluY2VudCBMZSBOb3JtYW5kLCBhbmQgZml4ZWQgaXQuCgpNaWNoYWwgTWFyZWsgKDE4IE1hciAyMDA4KQotIEFkZGVkIGN1cmxfZWFzeV9nZXRpbmZvIHR5cGVjaGVja2VyLgoKLSBBZGRlZCBtYWNyb3MgZm9yIGN1cmxfc2hhcmVfc2V0b3B0IGFuZCBjdXJsX211bHRpX3NldG9wdCB0byBjaGVjayBhdCBsZWFzdAogIHRoZSBjb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMuCgpEYW5pZWwgRmFuZHJpY2ggKDEzIE1hciAyMDA4KQotIEFkZGVkIHRlc3RzIDYyMi02MjUgdG8gdGVzdCBTRlRQL1NDUCB1cGxvYWRzLiBUZXN0IDYyNSB3YXMgYW4gYXR0ZW1wdCB0bwogIHJlcHJvZHVjZSB0aGUgLS1mdHAtY3JlYXRlLWRpcnMgcHJvYmxlbSByZXBvcnRlZCBieSBCcmlhbiBVbG0sIGJ1dCB0aGF0CiAgc2VlbXMgdG8gbmVlZCBhIGNhbGwgY3VybF9lYXN5X3Jlc2V0KCkgd2hpY2ggdGhpcyB0ZXN0IGNhc2UgZG9lc24ndCBkby4KCkRhbmllbCBTdGVuYmVyZyAoMTMgTWFyIDIwMDgpCi0gQnJpYW4gVWxtIGZpZ3VyZWQgb3V0IHRoYXQgaWYgeW91IGRpZCBhbiBTRlRQIHVwbG9hZCB3aXRoCiAgQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUyB0byBjcmVhdGUgYSBkaXJlY3RvcnksIGFuZCB0aGVuIHJlLXVzZWQgdGhlCiAgaGFuZGxlIGFuZCB1cGxvYWRlZCBhbm90aGVyIGZpbGUgdG8gYW5vdGhlciBkaXJlY3RvcnkgdGhhdCBuZWVkZWQgdG8gYmUKICBjcmVhdGVkLCB0aGUgc2Vjb25kIHVwbG9hZCB3b3VsZCBmYWlsLiBBbm90aGVyIGNhc2Ugb2YgYSBzdGF0ZSB2YXJpYWJsZSB0aGF0CiAgd2Fzbid0IHByb3Blcmx5IHJlc2V0IGJldHdlZW4gcmVxdWVzdHMuCgotIEkgcmV3cm90ZSB0aGUgMTAwLWNvbnRpbnVlIGNvZGUgdG8gdXNlIGEgc2luZ2xlIHN0YXRlIHZhcmlhYmxlIGluc3RlYWQgb2YKICB0aGUgcHJldmlvdXMgdHdvIG9uZXMuIEkgdGhpbmsgaXQgbWFkZSB0aGUgbG9naWMgc29tZXdoYXQgY2xlYXJlci4KCkRhbmllbCBTdGVuYmVyZyAoMTEgTWFyIDIwMDgpCi0gRG1pdHJ5IFBvcG92IGZpbGVkIGJ1ZyByZXBvcnQgIzE5MTEwNjkKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTkxMTA2OSkgdGhhdCBpZGVudGlmaWVkIGEgcmFjZQogIGNvbmRpdGlvbiBpbiB0aGUgbmFtZSByZXNvbHZlciBjb2RlIHdoZW4gdGhlIEROUyBjYWNoZSBpcyBzaGFyZWQgYmV0d2VlbgogIG11bHRpcGxlIGVhc3kgaGFuZGxlcywgZWFjaCBydW5uaW5nIGluIHNpbXVsdGFuZW91cyB0aHJlYWRzIHRoYXQgY291bGQgY2F1c2UKICBjcmFzaGVzLgoKLSBBZGRlZCBhIG1hY3JvIGZvciBjdXJsX2Vhc3lfc2V0b3B0KCkgdGhhdCBhY2NlcHRzIHRocmVlIGFyZ3VtZW50cyBhbmQgc2ltcGx5CiAgZG9lcyBub3RoaW5nIHdpdGggdGhlbSwganVzdCB0byBtYWtlIHN1cmUgbGliY3VybCB1c2VycyBhbHdheXMgdXNlIHRocmVlCiAgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24uIER1ZSB0byBpdHMgdXNlIG9mIC4uLiBmb3IgdGhlIHRoaXJkIGFyZ3VtZW50LCBpdAogIGlzIG90aGVyd2lzZSBoYXJkIHRvIGRldGVjdCBhYnVzZS4KCk1pY2hhbCBNYXJlayAoMTEgTWFyIDIwMDgpCi0gQWRkZWQgYSB0eXBlIGNoZWNraW5nIG1hY3JvIGZvciBjdXJsX2Vhc3lfc2V0b3B0KCksIG5lZWRzIGdjYy00LjMgYW5kIG9ubHkKICB3b3JrcyBpbiBDIG1vZGUgYXRtIChodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDIvMDI2Ny5odG1sICwKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDIvMDI5Mi5odG1sICkKCkRhbmllbCBGYW5kcmljaCAoMTAgTWFyIDIwMDgpCi0gQWRkZWQgdGVzdHMgNjE4LTYyMSB0byB0ZXN0IFNGVFAvU0NQIHRyYW5zZmVycyBvZiBtb3JlIHRoYW4gb25lIGZpbGUKICAodGVzdCA2MjAgdGVzdHMgdGhlIGp1c3QtZml4ZWQgcHJvYmxlbSByZXBvcnRlZCBieSBCcmlhbiBVbG0pLgoKRGFuaWVsIFN0ZW5iZXJnICg5IE1hciAyMDA4KQotIEJyaWFuIFVsbSByZXBvcnRlZCBhIGNyYXNoIHdoZW4gZG9pbmcgYSBzZWNvbmQgU0ZUUCB0cmFuc2ZlciBvbiBhIHJlLXVzZWQKICBlYXN5IGhhbmRsZSBpZiBjdXJsX2Vhc3lfcmVzZXQoKSB3YXMgdXNlZCBiZXR3ZWVuIHRoZW0uIEkgZml4ZWQgaXQgYW5kIEJyaWFuCiAgdmVyaWZpZWQgdGhhdCBpdCBjdXJlZCBoaXMgcHJvYmxlbS4KCi0gQnJpYW4gVWxtIHJlcG9ydGVkIHRoYXQgaWYgeW91IGZpcnN0IHRyaWVkIHRvIGRvd25sb2FkIGEgbm9uLWV4aXN0aW5nIFNGVFAKICBmaWxlIGFuZCB0aGVuIGZldGNoZWQgYW4gZXhpc3Rpbmcgb25lIGFuZCByZS11c2VkIHRoZSBoYW5kbGUsIGxpYmN1cmwgd291bGQKICBzdGlsbCByZXBvcnQgdGhlIHNlY29uZCBvbmUgYXMgbm9uLWV4aXN0aW5nIGFzIHdlbGwhIEkgZml4ZWQgaXQgYW5kIEJyaWFuCiAgdmVyaWZpZWQgdGhhdCBpdCBjdXJlZCBoaXMgcHJvYmxlbS4KCk1pY2hhbCBNYXJlayAoNiBNYXIgMjAwOCkKLSBGaXggdGhlIGdzc2FwaSBjb25maWd1cmUgY2hlY2sgdG8gZGV0ZWN0IG5ld2VyIE1JVCBLZXJiZXJvcyAocGF0Y2ggYnkKICBNaWNoYWVsIENhbG1lcikKCllhbmcgVHNlICg2IE1hciAyMDA4KQotIEZpeCByZWdyZXNzaW9uIG9uIEN1cmxfc29ja2V0X3JlYWR5KCkgYW5kIEN1cmxfcG9sbCgpIHNvIHRoYXQgdGhlc2Ugd2lsbAogIGFnYWluIGZhaWwgb24gc2VsZWN0L3BvbGwgZXJyb3JzIGRpZmZlcmVudCB0aGFuIEVJTlRSLgoKRGFuaWVsIEZhbmRyaWNoICg1IE1hciAyMDA4KQotIEZpeGVkIHRoZSB0ZXN0IGhhcm5lc3Mgc28gaXQgd2lsbCB3cml0ZSBvdXQgemVyby1sZW5ndGggZGF0YSBmaWxlcy4KCi0gQWRkZWQgdGVzdHMgNjE2IGFuZCA2MTcgdG8gc2VlIGhvdyBTRlRQIGFuZCBTQ1AgY29wZSB3aXRoIHplcm8tbGVuZ3RoCiAgZmlsZXMsIGFzIHF1ZXN0aW9uZWQgYnkgTWlrZSBQcm90dHMuIFNGVFAgZG9lcyBmb3IgbWUgYnV0IFNDUCBkb2Vzbid0CiAgc28gdGVzdCA2MTcgaXMgZGlzYWJsZWQgZm9yIG5vdy4KCkRhbmllbCBTICg0IE1hciAyMDA4KQotIE1pa2UgUHJvdHRzIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2VzIHJlc3VtZWQgdHJhbnNmZXJzIHdvcmsgd2l0aCBTRlRQLgoKRGFuaWVsIFMgKDEgTWFyIDIwMDgpCi0gQW5hdG9saSBUdWJtYW4gZm91bmQgYW5kIGZpeGVkIGEgY3Jhc2ggd2l0aCBOZWdvdGlhdGUgYXV0aGVudGljYXRpb24gdXNlZCBvbgogIGEgcmUtdXNlZCBjb25uZWN0aW9uIHdoZXJlIGJvdGggcmVxdWVzdHMgdXNlZCBOZWdvdGlhdGUuCgpHdWVudGVyIEtuYXVmICgyNiBGZWIgMjAwOCkKLSBLYXNwYXIgQnJhbmQgcHJvdmlkZWQgYSBwYXRjaCB0byBzdXBwb3J0IHNlcnZlciBuYW1lIGluZGljYXRpb24gKFJGQyA0MzY2KS4KCkRhbmllbCBTICgyNSBGZWIgMjAwOCkKLSBLYXNwYXIgQnJhbmQgbWFkZSBHbnVUTFMtYnVpbHQgbGliY3VybCBwcm9wZXJseSBhY2tub3dsZWRnZSB0aGUgb3B0aW9uIHRoYXQKICBmb3JjZXMgaXQgdG8gcHJlZmVyIFNTTHYzLgoKRGFuaWVsIFMgKDIzIEZlYiAyMDA4KQotIFNhbSBMaXN0b3BhZCBwcm92aWRlZCBhIHBhdGNoIGluIGZlYXR1cmUtcmVxdWVzdCAjMTkwMDAxNAogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL2ZlYXR1cmUuY2dpP2lkPTE5MDAwMTQgdGhhdCBtYWtlcyBsaWJjdXJsIChidWlsdCB0bwogIHVzZSBPcGVuU1NMKSBzdXBwb3J0IGEgZnVsbCBjaGFpbiBvZiBjZXJ0aWZpY2F0ZXMgaW4gYSBnaXZlbiBQS0NTMTIKICBjZXJ0aWZpY2F0ZS4KCkRhbmllbCBTICgyMiBGZWIgMjAwOCkKLSBHZW9yZyBMaXBwaXRzY2ggbWFkZSB0aGUgc3JjL01ha2VmaWxlLnZjNiBtYWtlZmlsZSB1c2UgdGhlIHNhbWUgbWVtb3J5IG1vZGVsCiAgb3B0aW9ucyBhcyB0aGUgbGliL01ha2VmaWxlLnZjNiBhbHJlYWR5IGRpZC4KCkRhbmllbCBTICgyMSBGZWIgMjAwOCkKLSBabWV5IFBldHJvZmYgZm91bmQgYSBjcmFzaCB3aGVuIGxpYmN1cmwgYWNjZXNzZWQgYSBOVUxMIHBvaW50ZXIsIHdoaWNoCiAgaGFwcGVuZWQgaWYgeW91IHNldCB0aGUgY29ubmVjdGlvbiBjYWNoZSBzaXplIHRvIDEgYW5kIGZvciBleGFtcGxlIGZhaWxlZCB0bwogIGxvZ2luIHRvIGFuIEZUUCBzaXRlLiBCdWcgcmVwb3J0ICMxODk2Njk4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4OTY2OTgpCgpEYW5pZWwgUyAoMjAgRmViIDIwMDgpCi0gRml4ZWQgdGVzdCBjYXNlIDQwNSB0byBub3QgZmFpbCB3aGVuIGxpYmN1cmwgaXMgYnVpbHQgd2l0aCBHbnVUTFMKCi0gQmFzZWQgb24gaW5pdGlhbCB3b3JrIGRvbmUgYnkgR2F1dGFtIEthY2hyb28gdG8gYWRkcmVzcyBhIGJ1Zywgd2Ugbm93IGtlZXAKICBiZXR0ZXIgY29udHJvbCBhdCB0aGUgZXhhY3Qgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24ncyBTU0wgc3RhdHVzIHNvIHRoYXQgd2UKICBrbm93IGV4YWN0bHkgd2hlbiBpdCBoYXMgY29tcGxldGVkIHRoZSBTU0wgbmVnb3RpYXRpb24gb3Igbm90IHNvIHRoYXQgdGhlcmUKICB3b24ndCBiZSBhY2NpZGVudGFsIHJlLXVzZXMgb2YgY29ubmVjdGlvbnMgdGhhdCBhcmUgd3JvbmdseSBiZWxpZXZlZCB0byBiZQogIGluIFNTTC1jb21wbGV0ZWQtbmVnb3RpYXRlIHN0YXRlLgoKLSBXZSBubyBsb25nZXIgc3VwcG9ydCBzZXR0aW5nIHRoZSBDVVJMT1BUX1VSTCBvcHRpb24gZnJvbSBpbnNpZGUgYSBjYWxsYmFjawogIHN1Y2ggYXMgdGhlIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTiBvbmUgdHJlYXQgdGhhdCBhcyBpZiBpdCB3YXMgYSBMb2NhdGlvbjoKICBmb2xsb3dpbmcuIFRoZSBwYXRjaCB0aGF0IGludHJvZHVjZWQgdGhpcyBmZWF0dXJlIHdhcyBkb25lIGZvciA3LjExLjAsIGJ1dAogIHRoaXMgY29kZSBhbmQgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBicm9rZW4gc2luY2UgYWJvdXQgNy4xNS40IChNYXJjaCAyMDA2KQogIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZiBub24tYmxvY2tpbmcgT3BlblNTTCAiY29ubmVjdHMiLgoKICBJdCB3YXMgYSBoYWNrIHRvIGJlZ2luIHdpdGggYW5kIHNpbmNlIGl0IGRvZXNuJ3Qgd29yayBhbmQgaGFzbid0IHdvcmtlZAogIGNvcnJlY3RseSBmb3IgYSBsb25nIHRpbWUgYW5kIG5vYm9keSBoYXMgZXZlbiBub3RpY2VkLCBJIGNvbnNpZGVyIGl0IGEgdmVyeQogIHN1aXRhYmxlIHN1YmplY3QgZm9yIHBsYWluIHJlbW92YWwuIEFuZCBzbyBpdCB3YXMgZG9uZS4KCkd1ZW50ZXIgS25hdWYgKDE5IEZlYiAyMDA4KQotIFdlIGRvIG5vIGxvbmdlciBzdXBwb3J0IFNTTHYyIGJ5IGRlZmF1bHQgc2luY2UgaXQgaGFzIGtub3duIGZsYXdzLgogIEthc3BhciBCcmFuZCBwcm92aWRlZCBhIHBhdGNoIGZvciBhbGwgc3VwcG9ydGVkIFNTTCB0b29sa2l0cy4KCkRhbmllbCBGYW5kcmljaCAoMTkgRmViIDIwMDgpCi0gQWRkZWQgdGVzdDMwOSB0byB0ZXN0IEhUVFAgcmVkaXJlY3QgdG8gSFRUUFMgVVJMCgpEYW5pZWwgUyAoMTggRmViIDIwMDgpCi0gV2UncmUgbm8gbG9uZ2VyIHByb3ZpZGluZyBhIHZlcnkgb2xkIGNhLWJ1bmRsZSBpbiB0aGUgY3VybCB0YXJiYWxsLiBZb3UgY2FuCiAgZ2V0IGEgZnJlc2ggb25lIGRvd25sb2FkZWQgYW5kIGNyZWF0ZWQgd2l0aCAnbWFrZSBjYS1idW5kbGUnIG9yIHlvdSBjYW4gZ2V0CiAgb25lIGZyb20gaGVyZSA9PiBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvY2FleHRyYWN0Lmh0bWwgaWYgeW91IHdhbnQgYSBmcmVzaAogIG5ldyBvbmUgZXh0cmFjdGVkIGZyb20gTW96aWxsYSdzIHJlY2VudCBsaXN0IG9mIGNhIGNlcnRzLgoKICBUaGUgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtY2EtYnVuZGxlIG5vdyBsZXRzIHlvdSBzcGVjaWZ5IHdoYXQgZmlsZSB0byB1c2UKICBhcyBkZWZhdWx0IGNhIGJ1bmRsZSBmb3IgeW91ciBidWlsZC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICB3aWxsIGNoZWNrIGEgZmV3IGtub3duIHN0YW5kYXJkIHBsYWNlcyBmb3IgYSBnbG9iYWwgY2EgY2VydCB0byB1c2UuCgpEYW5pZWwgUyAoMTcgRmViIDIwMDgpCi0gSmVyb21lIE11ZmZhdC1NZXJpZG9sIGhlbHBlZCBtZSBmaXggQ3VybF9kb25lKCkgdG8gY2xvc2UgdGhlIGN1cnJlbnQKICBjb25uZWN0aW9uIGJ5IGZvcmNlIHdoZW4gaXQgd2FzIGNhbGxlZCBiZWZvcmUgdGhlIGVudGlyZSByZXF1ZXN0IGlzCiAgY29tcGxldGVkLCBzaW1wbHkgYmVjYXVzZSB3ZSBjYW4ndCBrbm93IGlmIHRoZSBjb25uZWN0aW9uIHJlYWxseSBjYW4gYmUKICByZS11c2VkIHNhZmVseSBhdCB0aGF0IHBvaW50LgoKLSBCYXNlZCBvbiB0aGUgc2FtZSBkZWJ1Z2dpbmcgbG9naWMsIEkndmUgYWxzbyBtYWRlIEN1cmxfaHR0cF9kb25lKCkgbm90CiAgcmV0dXJuIENVUkxFX0dPVF9OT1RISU5HIGlmIGNhbGxlZCAicHJlbWF0dXJlbHkiLiBUaGlzIHNob3VsZCBoYXZlIG5vIHJlYWwKICBlZmZlY3QgdG8gYW55dGhpbmcgYnV0IHRoZSBjb2RlIG1ha2VzIG1vcmUgc2Vuc2UgbGlrZSB0aGlzLgoKRGFuaWVsIFMgKDE1IEZlYiAyMDA4KQotIE1hZGUgdGhlIGdudXRscyBjb2RlIHBhdGggbm90IGV2ZW4gdHJ5IHRvIGdldCB0aGUgc2VydmVyIGNlcnQgaWYgbm8gcGVlcgogIHZlcmlmaWNhdGlvbiBpcyByZXF1ZXN0ZWQuIFByZXZpb3VzbHkgaXQgd291bGQgZXZlbiByZXR1cm4gZmFpbHVyZSBpZiBnbnV0bHMKICBmYWlsZWQgdG8gZ2V0IHRoZSBzZXJ2ZXIgY2VydCBldmVuIHRob3VnaCBubyB2ZXJpZmljYXRpb24gd2FzIGFza2VkIGZvci4KICBQdWJsaWMgc2VydmVyIHNob3dpbmcgdGhlIHByb2JsZW06IGh0dHBzOi8vd3d3Lm5ldDIyMi5jYWlzc2UtZXBhcmduZS5mcgoKLSBGaXggbXkgQ3VybF90aW1lbGVmdCgpIGxlZnRvdmVyIG1pc3Rha2UgaW4gdGhlIGdudXRscyBjb2RlCgotIFBvb3lhbiBNY1Nwb3JyYW4gZm91bmQgYW5kIGZpeGVkIGEgZmxhdyB3aGVyZSB5b3UgZmlyc3Qgd291bGQgZG8gYSBub3JtYWwKICBodHRwIHJlcXVlc3QgYW5kIHRoZW4geW91J2QgcmV1c2UgdGhlIGhhbmRsZSBhbmQgcmVwbGFjZSB0aGUgQWNjZXB0OiBoZWFkZXIsCiAgYXMgdGhlbiBsaWJjdXJsIHdvdWxkIHNlbmQgdHdvIEFjY2VwdDogaGVhZGVycyEKCkRhbmllbCBTICgxMSBGZWIgMjAwOCkKLSBZYW5nIFRzZSBwb2ludGVkIG91dCBhIGZldyByZW1haW5pbmcgcXVpcmtzIGZyb20gbXkgdGltZW91dCByZWZhY3RvcmluZyBmcm9tCiAgRmViIDcgdGhhdCBkaWRuJ3QgYWJvcnQgcHJvcGVybHkgb24gdGltZW91dHMuIFRoZXNlIGFyZSBhY3R1YWxseSBvbGQKICBwcm9ibGVtcyBidXQgbm93IHRoZXkgc2hvdWxkIGJlIGZpeGVkLgoKWWFuZyBUc2UgKDEwIEZlYiAyMDA4KQotIEJ1ZyByZXBvcnQgIzE4ODg5MzIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4ODg5MzIpIHBvaW50cyBvdXQKICBhbmQgcHJvdmlkZXMgdGVzdCBwcm9ncmFtIHRoYXQgZGVtb25zdHJhdGVzIHRoYXQgbGliY3VybCBtaWdodCBub3Qgc2V0IGVycm9yCiAgZGVzY3JpcHRpb24gbWVzc2FnZSBmb3IgZXJyb3IgQ1VSTEVfQ09VTEROVF9SRVNPTFZFX0hPU1QgZm9yIFdpbmRvd3MgdGhyZWFkZWQKICBuYW1lIHJlc29sdmVyIGJ1aWxkcy4gRml4ZWQgbm93LgoKRGFuaWVsIEZhbmRyaWNoICg4IEZlYiAyMDA4KQotIEFkZGVkIGtleSB3b3JkcyB0byBhbGwgU1NMLXVzaW5nIHRlc3RzIHNvIHRoZXkgY2FuIGJlIHNraXBwZWQgaWYgbmVjZXNzYXJ5LgogIFJlbW92ZWQgYSBmZXcgdW5uZWNlc3NhcnkgcmVxdWlyZXMgU1NMIHN0YXRlbWVudHMuCgpEYW5pZWwgUyAoOCBGZWIgMjAwOCkKLSBNaWtlIEhvbW1leSBmaWxlZCBhbmQgZml4ZWQgYnVnIHJlcG9ydCAjMTg4OTg1NgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODg5ODU2KTogV2hlbiB1c2luZyB0aGUgZ251dGxzIHNzbAogIGxheWVyLCBjbGVhbmluZy11cCBhbmQgcmVpbml0aWFsaXppbmcgY3VybCBlbmRzIHVwIHdpdGggaHR0cHMgcmVxdWVzdHMKICBmYWlsaW5nIHdpdGggIkFTTjEgcGFyc2VyOiBFbGVtZW50IHdhcyBub3QgZm91bmQiIGVycm9ycy4gT2J2aW91c2x5IGEKICByZWdyZXNzaW9uIGFkZGVkIGluIDcuMTYuMy4KCllhbmcgVHNlICg4IEZlYiAyMDA4KQotIEltcHJvdmVkIHRlc3QgaGFybmVzcyBTQ1AvU0ZUUCBzdGFydCB1cCBzZXJ2ZXIgdmVyaWZpY2F0aW9uLCBkb2luZyBhIHJlYWwKICBjb25uZWN0aW9uIHRvIHRoZSBzZnRwIHNlcnZlciwgYXV0aGVudGljYXRpbmcgYW5kIHJ1bm5pbmcgYSBzaW1wbGUgc2Z0cAogIHB3ZCBjb21tYW5kIHVzaW5nIHRoZSB0ZXN0IGhhcm5lc3MgZ2VuZXJhdGVkIGNvbmZpZ3VyYXRpb24gYW5kIGtleSBmaWxlcy4KCkRhbmllbCBTICg4IEZlYiAyMDA4KQotIEf8bnRlciBLbmF1ZiBhZGRlZCBsaWIvbWstY2EtYnVuZGxlLnBsIHdoaWNoIGdldHMgdGhlIEZpcmVmb3ggY2EgYnVuZGxlIGFuZAogIGNyZWF0ZXMgYSBzdWl0YWJsZSBjYS1idW5kbGUuY3J0IGZpbGUgaW4gUEVNIGZvcm1hdCBmb3IgdXNlIHdpdGggY3VybC4gVGhlCiAgcmVjb21tZW5kZWQgd2F5IHRvIHJ1biBpdCBpcyB0byB1c2UgJ21ha2UgY2EtYnVuZGxlJyBpbiB0aGUgYnVpbGQgdHJlZSByb290LgoKRGFuaWVsIEZhbmRyaWNoICg3IEZlYiAyMDA4KQotIEFkZGVkIHRlc3RzIDEwMjIgYW5kIDEwMjMgdG8gdmFsaWRhdGUgb3V0cHV0IG9mIGN1cmwtY29uZmlnIC0tdmVyc2lvbiBhbmQKICAtLXZlcm51bQoKRGFuaWVsIFMgKDcgRmViIDIwMDgpCi0gUmVmYWN0b3JlZCBhIGxvdCBvZiB0aW1lb3V0IGNvZGUgaW50byBhIGZldyBmdW5jdGlvbnMgaW4gYW4gYXR0ZW1wdCB0byBtYWtlCiAgdGhlbSBhbGwgdXNlIHRoZSBzYW1lIChob3BlZnVsbHkgY29ycmVjdCkgbG9naWMgdG8gbWFrZSBpdCBsZXNzIGVycm9yLXByb25lCiAgYW5kIGVhc2llciB0byBpbnRyb2R1Y2UgbGlicmFyeS13aWRlIHdoZXJlIGl0IHNob3VsZCBiZSB1c2VkLgoKWWFuZyBUc2UgKDYgRmViIDIwMDgpCi0gRml4IGFuIGlzc3VlIGluIHN0cmR1cCByZXBsYWNlbWVudCBmdW5jdGlvbiB3aGVuIGRlYWxpbmcgd2l0aCBhYnNvbHV0ZWx5CiAgaHVnZSBzdHJpbmdzLiBPbmx5IHN5c3RlbXMgd2l0aG91dCBhIHN0YW5kYXJkIHN0cmR1cCB3b3VsZCBiZSBhZmZlY3RlZC4KCkRhbmllbCBTICgzIEZlYiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW4gY2xlYW5lZCB1cCB0aGUgcGlwZWxpbmluZyBjb2RlIGFuZCByZW1vdmVkIHRoZSBuZWVkIGZvciBhbmQKICB1c2Ugb2YgdGhlICJpc19pbl9waXBlbGluZSIgc3RydWN0IGZpZWxkLgoKLSBJIHdyb3RlIHVwIGFuZCBhZGRlZCB0aGUgdGhyZWFkZWQtc3NsLmMgZXhhbXBsZSBzb3VyY2UgY29kZSB0aGF0IHNob3dzIGhvdwogIHRvIGRvIG11bHRpLXRocmVhZGVkIGRvd25sb2FkcyBvZiBIVFRQUyBmaWxlcyB3aXRoIGEgbGliY3VybCB0aGF0IGlzIGJ1aWx0CiAgd2l0aCBPcGVuU1NMLiBJdCB1c2VzIHB0aHJlYWRzIGZvciB0aGUgdGhyZWFkaW5nLgoKRGFuaWVsIFMgKDMxIEphbiAyMDA4KQotIE5pa2xhcyBBbmdlYnJhbmQgbWFkZSB0aGUgY29va2llIHN1cHBvcnQgaW4gbGliY3VybCBwcm9wZXJseSBkZWFsIHdpdGggdGhlCiAgIkh0dHBPbmx5IiBmZWF0dXJlIGludHJvZHVjZWQgYnkgTWljcm9zb2Z0IGFuZCBhcHBhcmVudGx5IGFsc28gc3VwcG9ydGVkIGJ5CiAgRmlyZWZveDogaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzMzA0Ni5hc3B4IC4gSHR0cE9ubHkKICBpcyBub3cgc3VwcG9ydGVkIHdoZW4gcmVjZWl2ZWQgZnJvbSBzZXJ2ZXJzIGluIEhUVFAgaGVhZGVycywgd2hlbiB3cml0dGVuIHRvCiAgY29va2llIGphcnMgYW5kIHdoZW4gcmVhZCBmcm9tIGV4aXN0aW5nIGNvb2tpZSBqYXJzLgoKICBJIG1vZGlmaWVkIHRlc3QgY2FzZSAzMSBhbmQgNDYgdG8gYWxzbyBkbyBzb21lIGJhc2ljIEh0dHBPbmx5IHRlc3RpbmcuCgotIERtaXRyeSBLdXJvY2hraW4gbW92ZWQgc2V2ZXJhbCBzdHJ1Y3QgZmllbGRzIGZyb20gdGhlIGNvbm5lY3RkYXRhIHN0cnVjdCB0bwogIHRoZSBTaW5nbGVSZXF1ZXN0IG9uZSB0byBtYWtlIHBpcGVsaW5pbmcgYmV0dGVyLiBJdCBpcyBhIGJpdCB0cmlja3kgdG8ga2VlcAogIHRoZW0gaW4gdGhlIHJpZ2h0IHBsYWNlLCB0byBrZWVwIHRoaW5ncyByZWxhdGVkIHRvIHRoZSBhY3R1YWwgcmVxdWVzdCBvciB0bwogIHRoZSBhY3R1YWwgY29ubmVjdGlvbiBpbiB0aGUgcmlnaHQgcGxhY2UuCgpEYW5pZWwgUyAoMjkgSmFuIDIwMDgpCi0gRG1pdHJ5IEt1cm9jaGtpbiBmaXhlZCBDdXJsX2RvbmUoKSBmb3IgcGlwZWxpbmluZywgYXMgaXQgY291bGQgcHJldmlvdXNseQogIGNyYXNoIQoKLSBNaWNoYWwgTWFyZWsgZml4ZWQgbWlub3IgbWlzdGFrZSBpbiB0ZXN0IGNhc2UgNTUzIHRoYXQgcHJldmVudGVkIGl0IGZyb20KICB3b3JraW5nIG9uIG90aGVyIElQLWFkZHJlc3NlcyBvciBwb3J0IG51bWJlcnMuCgpWZXJzaW9uIDcuMTguMCAoMjggSmFudWFyeSAyMDA4KQoKRGFuaWVsIFMgKDI3IEphbiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW46IEluICJyZWFsIHdvcmxkIiB0ZXN0aW5nIEkgZm91bmQgbW9yZSBidWdzIGluCiAgcGlwZWxpbmluZy4gQnJva2VuIGNvbm5lY3Rpb24gaXMgbm90IHJlc3RvcmVkIGFuZCB3ZSBnZXQgaW50byBpbmZpbml0ZQogIGxvb3AuIEl0IGhhcHBlbnMgYmVjYXVzZSBvZiB3cm9uZyBpc19pbl9waXBlbGluZSB2YWx1ZXMuCgpEYW5pZWwgUyAoMjYgSmFuIDIwMDgpCi0gS2V2aW4gUmVlZCBmaWxlZCBidWcgcmVwb3J0ICMxODc5Mzc1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NzkzNzUpIHdoaWNoIGRlc2NyaWJlcyBob3cgbGliY3VybAogIGdvdCBsb3N0IGluIHRoaXMgc2NlbmFyaW86IHByb3h5IHR1bm5lbCAob3IgSFRUUFMgb3ZlciBwcm94eSksIGFzayB0byBkbyBhbnkKICBwcm94eSBhdXRoZW50aWNhdGlvbiBhbmQgdGhlIHByb3h5IHJlcGxpZXMgd2l0aCBhbiBhdXRoIChsaWtlIE5UTE0pIGFuZCB0aGVuCiAgY2xvc2VzIHRoZSBjb25uZWN0aW9uIGFmdGVyIHRoYXQgaW5pdGlhbCBpbmZvcm1hdGlvbmFsIHJlc3BvbnNlLgoKICBsaWJjdXJsIHdvdWxkIG5vdCBwcm9wZXJseSByZS1pbml0aWFsaXplIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBwcm94eSBhbmQKICBjb250aW51ZSB0aGUgYXV0aCBuZWdvdGlhdGlvbiBsaWtlIHN1cHBvc2VkLiBJdCBkb2VzIG5vdyBob3dldmVyLCBhcyBpdCB3aWxsCiAgbm93IGRldGVjdCBpZiBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZXRob2RzIHdlcmUgYXZhaWxhYmxlIGFuZCBhc2tlZAogIGZvciwgYW5kIHdpbGwgdGh1cyByZXRyeSB0aGUgY29ubmVjdGlvbiBhbmQgY29udGludWUgZnJvbSB0aGVyZS4KCi0gSSBtYWRlIHRoZSBwcm9ncmVzcyBjYWxsYmFjayBnZXQgY2FsbGVkIHByb3Blcmx5IGR1cmluZyBwcm94eSBDT05ORUNULgoKRGFuaWVsIFMgKDIzIEphbiAyMDA4KQotIElnb3IgRnJhbmNodWsgcG9pbnRlZCBvdXQgdGhhdCBDVVJMT1BUX0NPT0tJRUxJU1Qgc2V0IHRvICJBTEwiIGxlYWtlZAogIG1lbW9yeSwgYW5kIHNvIGRpZCAiU0VTUyIuIEZpeGVkIG5vdy4KCllhbmcgVHNlICgyMiBKYW4gMjAwOCkKLSBDaGVjayBwb2xsLmggYXQgY29uZmlndXJhdGlvbiB0aW1lLCBhbmQgdXNlIGl0IHdoZW4gc3lzL3BvbGwuaCB1bmF2YWlsYWJsZQoKRGFuaWVsIFMgKDIyIEphbiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW4gcmVtb3ZlZCB0aGUgY2FuY2VsbGVkIHN0YXRlIGZvciBwaXBlbGluaW5nLCBhcyB3ZSBhZ3JlZWQKICB0aGF0IGl0IGlzIGJhZCBhbnl3YXkuIFN0YXJ0aW5nIG5vdywgcmVtb3ZpbmcgYSBoYW5kbGUgdGhhdCBpcyBpbiB1c2VkIGluIGEKICBwaXBlbGluZSB3aWxsIGJyZWFrIHRoZSBwaXBlbGluZSAtIGl0J2xsIGJlIHNldCBiYWNrIHVwIGFnYWluIGJ1dCBzdGlsbC4uLgoKWWFuZyBUc2UgKDIxIEphbiAyMDA4KQotIERpc2FibGUgbGRhcCBzdXBwb3J0IGZvciBjeWd3aW4gYnVpbGRzLCBzaW5jZSBpdCBicmVha3Mgd2hvbGUgYnVpbGQgcHJvY2Vzcy4KICBGaXhpbmcgaXQgd2lsbCBhZmZlY3Qgb3RoZXIgcGxhdGZvcm1zLCBzbyBpdCBpcyBwb3N0cG9uZWQgZm9yIGFub3RoZXIgcmVsZWFzZS4KCkRhbmllbCBTICgxOCBKYW4gMjAwOCkKLSBMYXUgSGFuZyBLaW4gZm91bmQgYW5kIGZpeGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbiBkb2luZwogIENPTk5FQ1Qgb3ZlciBhIHByb3h5LiBjdXJsX211bHRpX2Zkc2V0KCkgZGlkbid0IHJlcG9ydCBiYWNrIHRoZSBzb2NrZXQKICBwcm9wZXJseSBkdXJpbmcgdGhhdCBzdGF0ZSwgZHVlIHRvIGEgbWlzc2luZyBjYXNlIGluIHRoZSBzd2l0Y2ggaW4gdGhlCiAgbXVsdGlfZ2V0c29jaygpIGZ1bmN0aW9uLgoKWWFuZyBUc2UgKDE3IEphbiAyMDA4KQotIERvbid0IGFib3J0IHRlc3RzIDUxOCBhbmQgNTM3IHdoZW4gdW5hYmxlIHRvIHJhaXNlIHRoZSBvcGVuLWZpbGUgc29mdCBsaW1pdC4KCkRhbmllbCBTICgxNiBKYW4gMjAwOCkKLSBOYXRoYW4gQ291bHRlcidzIHBhdGNoIHRoYXQgbWFrZXMgcnVudGVzdHMucGwgcmVzcGVjdCB0aGUgUEFUSCB3aGVuIGZpZ3VyaW5nCiAgb3V0IHdoYXQgdmFsZ3JpbmQgdG8gcnVuLgoKWWFuZyBUc2UgKDE2IEphbiAyMDA4KQotIEltcHJvdmVkIGhhbmRsaW5nIG9mIG91dCBvZiBtZW1vcnkgaW4gdGhlIGNvbW1hbmQgbGluZSB0b29sIHRoYXQgYWZlY3RlZAogIGRhdGEgdXJsIGVuY29kZWQgSFRUUCBQT1NUcyB3aGVuIHJlYWRpbmcgaXQgZnJvbSBhIGZpbGUuCgpEYW5pZWwgUyAoMTYgSmFuIDIwMDgpCi0gRG1pdHJ5IEt1cm9jaGtpbiB3b3JrZWQgYSBsb3Qgb24gaW1wcm92aW5nIHRoZSBIVFRQIFBpcGVsaW5pbmcgc3VwcG9ydCB0aGF0CiAgcHJldmlvdXNseSBoYWQgYSBudW1iZXIgb2YgZmxhd3MsIHBlcmhhcHMgbW9zdCBub3RhYmx5IHdoZW4gYW4gYXBwbGljYXRpb24KICBmaXJlZCB1cCBOIHRyYW5zZmVycyBhdCBvbmNlIGFzIHRoZW4gdGhleSB3b3VsZG4ndCBwaXBlbGluZSBhdCBhbGwgdGhhdAogIG5pY2VseSBhcyBhbnlvbmUgd291bGQgdGhpbmsuLi4gVGVzdCBjYXNlIDUzMCB3YXMgYWxzbyB1cGRhdGVkIHRvIHRha2UgdGhlCiAgaW1wcm92ZWQgZnVuY3Rpb25hbGl0eSBpbnRvIGFjY291bnQuCgotIENhbGxzIHRvIEN1cmxfZmFpbGYoKSBhcmUgbm90IHN1cHBvc2VkIHRvIHByb3ZpZGUgYSB0cmFpbGluZyBuZXdsaW5lIGFzIHRoZQogIGZ1bmN0aW9uIGl0c2VsZiBhZGRzIHRoYXQuIEZpeGVkIG9uIDUwIG9yIHNvbWV0aGluZyBzdHJpbmdzIQoKRGFuaWVsIFMgKDE1IEphbiAyMDA4KQotIEkgbWFkZSB0aGUgdG9ydHVyZSB0ZXN0IG9uIHRlc3QgNTMwIGdvIHRocm91Z2guIFRoaXMgd2FzIGFjdHVhbGx5IGR1ZSB0bwogIHNpbGx5IGNvZGUgbGVmdCBmcm9tIHdoZW4gd2Ugc3dpdGNoZWQgdG8gbGV0IHRoZSBtdWx0aSBoYW5kbGUgImhvbGQiIHRoZSBkbnMKICBjYWNoZSB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UuLi4gT2YgY291cnNlIHRoaXMgb25seSB0cmlnZ2VyZWQgd2hlbiBhCiAgY2VydGFpbiBmdW5jdGlvbiBjYWxsIHJldHVybmVkIGVycm9yIGF0IHRoZSBjb3JyZWN0IG1vbWVudC4KCkRhbmllbCBTICgxNCBKYW4gMjAwOCkKLSBKb2UgTWFsaWNraSBmaWxlZCBidWcgcmVwb3J0ICMxODcxMjY5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NzEyNjkpIGFuZCB3ZSBjb3VsZCBmaXggaGlzIGhhbmctCiAgcHJvYmxlbSB0aGF0IG9jY3VycmVkIHdoZW4gZG9pbmcgYSBsYXJnZSBIVFRQIFBPU1QgcmVxdWVzdCB3aXRoIHRoZQogIHJlc3BvbnNlLWJvZHkgcmVhZCBmcm9tIGEgY2FsbGJhY2suCgpEYW5pZWwgUyAoMTIgSmFuIDIwMDgpCi0gSSByZS1hcnJhbmdlZCB0aGUgY3VybCAtLWhlbHAgb3V0cHV0LiBBbGwgdGhlIG9wdGlvbnMgYXJlIG5vdyBzb3J0ZWQgb24KICB0aGVpciBsb25nIG9wdGlvbiBuYW1lcyBhbmQgYWxsIGRlc2NyaXB0aW9ucyBhcmUgb25lLWxpbmVycy4KCi0gRXJpYyBMYW5kZXMgcHJvdmlkZWQgdGhlIHBhdGNoIChlZGl0ZWQgYnkgbWUpIHRoYXQgaW50cm9kdWNlcyB0aGUKICAtLWtlZXBhbGl2ZS10aW1lIHRvIGN1cmwgdG8gc2V0IHRoZSBrZWVwYWxpdmUgcHJvYmUgaW50ZXJ2YWwuIEkgYWxzbyB0b29rCiAgdGhlIG9wcG9ydHVuaXR5IHRvIHJlbmFtZSB0aGUgcmVjZW50bHkgYWRkZWQgbm8ta2VlcC1hbGl2ZSBvcHRpb24gdG8KICBuby1rZWVwYWxpdmUgdG8ga2VlcCBhIGNvbnNpc3RlbnQgbmFtaW5nIGFuZCB0byBhdm9pZCBnZXR0aW5nIHR3byBkYXNoZXMgaW4KICB0aGVzZSBvcHRpb24gbmFtZXMuIEVyaWMgYWxzbyBwcm92aWRlZCBhbiB1cGRhdGUgdG8gdGhlIG1hbiBwYWdlIGZvciB0aGUgbmV3CiAgb3B0aW9uLgoKRGFuaWVsIFMgKDExIEphbiAyMDA4KQotIERhbmllbCBFZ2dlciBtYWRlIENVUkxPUFRfUkFOR0Ugd29yayBvbiBmaWxlOi8vIFVSTHMgdGhlIHZlcnkgc2FtZSB3YXkgaXQKICBhbHJlYWR5IHdvcmtlZCBmb3IgRlRQOi8vIFVSTHMuCgotIEkgbWFkZSB0aGUgY3VybCB0b29sIHN3aXRjaCBmcm9tIHVzaW5nIENVUkxPUFRfSU9DVExGVU5DVElPTiB0byBub3cgdXNlIHRoZQogIHNwYW5raW5nIG5ldyBDVVJMT1BUX1NFRUtGVU5DVElPTiBzaW1wbHkgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGltcHJvdmVkCiAgcGVyZm9ybWFuY2UgZm9yIHRoZSB1cGxvYWQgcmVzdW1lIGNhc2VzIHdoZXJlIHlvdSB3YW50IHRvIHVwbG9hZCB0aGUgbGFzdAogIGZldyBieXRlcyBvZiBhIHZlcnkgbGFyZ2UgZmlsZS4gVG8gaW1wbGVtZW50IHRoaXMgZGVjZW50bHksIEkgaGFkIHRvIHN3aXRjaAogIHRoZSBjbGllbnQgY29kZSBmb3IgdXBsb2FkaW5nIGZyb20gZm9wZW4oKS9mcmVhZCgpIHRvIHBsYWluIG9wZW4oKS9yZWFkKCkgc28KICB0aGF0IHdlIGNhbiB1c2UgbHNlZWsoKSB0byBkbyA+MzJiaXQgc2Vla3MgKGFzIGZzZWVrKCkgZG9lc24ndCBhbGxvdyB0aGF0KQogIG9uIHN5c3RlbXMgdGhhdCBvZmZlciBzdXBwb3J0IGZvciB0aGF0LgoKRGFuaWVsIFMgKDEwIEphbiAyMDA4KQotIE1pY2hhbCBNYXJlayBtYWRlIGN1cmwtY29uZmlnIC0tbGlicyBub3QgaW5jbHVkZSAvdXNyL2xpYjY0IGluIHRoZSBvdXRwdXQKICAoaXQgYWxyZWFkeSBiZWZvcmUgc2tpcHBlZCAvdXNyL2xpYikuICAvdXNyL2xpYjY0IGlzIHRoZSBkZWZhdWx0IGxpYnJhcnkKICBkaXJlY3Rvcnkgb24gbWFueSA2NGJpdCBzeXN0ZW1zIGFuZCBpdCdzIHVubGlrZWx5IHRoYXQgYW55b25lIHdvdWxkIHVzZSB0aGUKICBwYXRoIHByaXZhdGVseSBvbiBzeXN0ZW1zIHdoZXJlIGl0J3Mgbm90LgoKLSBHZW9yZyBMaXBwaXRzY2ggYnJvdWdodCBDVVJMT1BUX1NFRUtGVU5DVElPTiBhbmQgQ1VSTE9QVF9TRUVLREFUQSB0byBhbGxvdwogIGxpYmN1cmwgdG8gc2VlayBpbiBhIGdpdmVuIGlucHV0IHN0cmVhbS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHdoZW4KICBkb2luZyB1cGxvYWQgcmVzdW1lcyB3aGVuIHRoZXJlJ3MgYWxyZWFkeSBhIGh1Z2UgcGFydCBvZiB0aGUgZmlsZSBwcmVzZW50CiAgcmVtb3RlbHkuIEJlZm9yZSwgYW5kIHN0aWxsIGlmIHRoaXMgY2FsbGJhY2sgaXNuJ3QgdXNlZCwgbGliY3VybCB3aWxsIHJlYWQKICBhbmQgdGhyb3VnaCBhd2F5IHRoZSBlbnRpcmUgZmlsZSB1cCB0byB0aGUgcG9pbnQgdG8gd2hlcmUgdGhlIHJlc3VtaW5nCiAgYmVnaW5zICh3aGljaCBvZiBjb3Vyc2UgY2FuIGJlIGEgc2xvdyBvcGVyZXJhdGlvbiBkZXBlbmRpbmcgb24gZmlsZSBzaXplLAogIEkvTyBiYW5kd2lkdGggYW5kIG1vcmUpLiBUaGlzIG5ldyBmdW5jdGlvbiB3aWxsIGFsc28gYmUgcHJlZmVycmVkIHRvIGdldAogIHVzZWQgaW5zdGVhZCBvZiB0aGUgQ1VSTE9QVF9JT0NUTEZVTkNUSU9OIGZvciBzZWVraW5nIGJhY2sgaW4gYSBzdHJlYW0gd2hlbgogIGRvaW5nIG11bHRpLXN0YWdlIEhUVFAgYXV0aCB3aXRoIFBPU1QvUFVULgoKLSBOaWtpdGluc2tpdCBEbWl0cml5IGZpbGVkIGJ1ZyByZXBvcnQgIzE4NjgyNTUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg2ODI1NSkgd2l0aCBhIHBhdGNoLiBJdCBpZGVudGlmaWVzCiAgYW5kIGZpeGVzIGEgcHJvYmxlbSB3aXRoIHBhcnNpbmcgV1dXLUF1dGhlbnRpY2F0ZTogaGVhZGVycyB3aXRoIGFkZGl0aW9uYWwKICBzcGFjZXMgaW4gdGhlIGxpbmUgdGhhdCB0aGUgcGFyc2VyIHdhc24ndCB3cml0dGVuIHRvIGRlYWwgd2l0aC4KCkRhbmllbCBTICg4IEphbiAyMDA4KQotIEludHJvZHVjaW5nIGN1cmxfZWFzeV9wYXVzZSgpIGFuZCBuZXcgbWFnaWMgcmV0dXJuIGNvZGVzIGZvciBib3RoIHRoZSByZWFkCiAgYW5kIHRoZSB3cml0ZSBjYWxsYmFja3MgdGhhdCBub3cgY2FuIG1ha2UgYSBjb25uZWN0aW9uJ3MgcmVhZGluZyBhbmQvb3IKICB3cml0aW5nIGdldCBwYXVzZWQuCgpEYW5pZWwgUyAoNiBKYW4gMjAwOCkKLSBKZWZmIEpvaG5zb24gZmlsZWQgYnVnIHJlcG9ydCAjMTg2MzE3MQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODYzMTcxKSB3aGVyZSBoZSBwb2ludGVkIG91dCB0aGF0CiAgbGliY3VybCdzIGRhdGUgcGFyc2VyIGRpZG4ndCBhY2NlcHQgYSArMTMwMCB0aW1lIHpvbmUgd2hpY2ggYWN0dWFsbHkgaXMgdXNlZAogIGZhaXJseSBvZnRlbiAobGlrZSBOZXcgWmVhbGFuZCdzIERhaWxpZ2h0IFNhdmluZ3MgVGltZSksIHNvIEkgbW9kaWZpZWQgdGhlCiAgcGFyc2VyIHRvIG5vdyBhY2NlcHQgdXAgdG8gYW5kIGluY2x1ZGluZyAtMTQwMCB0byArMTQwMC4KCkRhbmllbCBTICg1IEphbiAyMDA4KQotIEJhc2VkIG9uIGZ1cnRoZXIgZGlzY3Vzc2lvbiBvbiBjdXJsLWxpYnJhcnksIEkgcmV2ZXJ0ZWQgeWVzdGVyZGF5J3MgU09DS1M1CiAgY29kZSB0byBpbnN0ZWFkIGludHJvZHVjZSBzdXBwb3J0IGZvciBhIG5ldyBwcm94eSB0eXBlIGNhbGxlZAogIENVUkxQUk9YWV9TT0NLUzVfSE9TVE5BTUUgdGhhdCBpcyB1c2VkIHRvIHNlbmQgdGhlIGhvc3QgbmFtZSB0byB0aGUgcHJveHkKICBpbnN0ZWFkIG9mIElQIGFkZHJlc3MgYW5kIHRoZXJlJ3MgdGh1cyBubyBsb25nZXIgYW55IG5lZWQgZm9yIGEgbmV3CiAgY3VybF9lYXN5X3NldG9wdCgpIG9wdGlvbi4KCiAgVGhlIGRlZmF1bHQgU09DS1M1IHByb3h5IGlzIGFnYWluIGJhY2sgdG8gc2VuZGluZyB0aGUgSVAgYWRkcmVzcyB0byB0aGUKICBwcm94eS4gIFRoZSBuZXcgY3VybCBjb21tYW5kIGxpbmUgb3B0aW9uIGZvciBlbmFibGluZyBzZW5kaW5nIGhvc3QgbmFtZSB0byBhCiAgU09DS1M1IHByb3h5IGlzIG5vdyAtLXNvY2tzNS1ob3N0bmFtZS4KCkRhbmllbCBTICg0IEphbiAyMDA4KQotIEJhc2VkIG9uIE1heGltIFBlcmVuZXNlbmtvJ3MgcGF0Y2gsIHdlIG5vdyBkbyBTT0NLUzUgb3BlcmF0aW9ucyBhbmQgbGV0IHRoZQogIHByb3h5IGRvIHRoZSBob3N0IG5hbWUgcmVzb2x2aW5nIGFuZCBvbmx5IGlmIC0tc29ja3M1aXAgKG9yCiAgQ1VSTE9QVF9TT0NLUzVfUkVTT0xWRV9MT0NBTCkgaXMgdXNlZCB3ZSByZXNvbHZlIHRoZSBob3N0IG5hbWUgbG9jYWxseSBhbmQKICBwYXNzIG9uIHRoZSBJUCBhZGRyZXNzIG9ubHkgdG8gdGhlIHByb3h5LgoKWWFuZyBUc2UgKDMgSmFuIDIwMDgpCi0gTW9kaWZpZWQgdGVzdCBoYXJuZXNzIHRvIGFsbG93IFNDUCwgU0ZUUCBhbmQgU09DS1M0IHRlc3RzIHRvIHJ1biB3aXRoCiAgT3BlblNTSCAyLjkuOSwgU3VuU1NIIDEuMCBvciBsYXRlciB2ZXJzaW9ucy4gU09DS1M1IHRlc3RzIG5lZWQgT3BlblNTSAogIDMuNywgU3VuU1NIIDEuMCBvciBsYXRlci4KCkRhbmllbCBTICgyIEphbiAyMDA4KQotIEkgZml4ZWQgdHdvIGNhc2VzIG9mIG1pc3NpbmcgcmV0dXJuIGNvZGUgY2hlY2tzIHdoZW4gaGFuZGxpbmcgY2h1bmtlZAogIGRlY29kaW5nIHdoZXJlIGEgd3JpdGUgZXJyb3IgKG9yIGFib3J0IHJldHVybiBmcm9tIGEgY2FsbGJhY2spIGRpZG4ndCBzdG9wCiAgbGliY3VybCdzIHByb2Nlc3NpbmcuCgotIEkgcmVtb3ZlZCB0aGUgc29ja2xlbl90IHVzZSBmcm9tIHRoZSBwdWJsaWMgY3VybC9jdXJsLmggaGVhZGVyIGFuZCBpbnN0ZWFkCiAgbWFkZSBpdCBhbiB1bnNpZ25lZCBpbnQuIFRoZSB0eXBlIHdhcyBvbmx5IHVzZWQgaW4gdGhlIGN1cmxfc29ja2FkZHIgc3RydWN0CiAgZGVmaW5pdGlvbiAob25seSB1c2VkIGJ5IHRoZSBjdXJsX29wZW5zb2NrZXRfY2FsbGJhY2spLiBPbiBhbGwgcGxhdGZvcm1zIEkKICBjb3VsZCBmaW5kIGluZm9ybWF0aW9uIGFib3V0LCBzb2NrbGVuX3QgaXMgMzIgdW5zaWduZWQgYml0cyBsYXJnZSBzbyBJIGRvbid0CiAgdGhpbmsgdGhpcyB3aWxsIGJyZWFrIHRoZSBBUEkgb3IgQUJJLiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIG9mCiAgY291cnNlIGZvciBhbGwgdGhlIHBsYXRmb3JtcyB0aGF0IGRvbid0IGhhdmUgYSBzb2NrbGVuX3QgZGVmaW5pdGlvbiBpbiB0aGVpcgogIGhlYWRlcnMgdG8gYnVpbGQgZmluZSBhZ2Fpbi4gUHJvdmlkaW5nIG91ciBvd24gY29uZmlndXJlIG1hZ2ljIGFuZCBjdXN0b20KICBkZWZpbml0aW9uIG9mIHNvY2tsZW5fdCBvbiB0aG9zZSBzeXN0ZW1zIHByb3ZlZCB0byB3b3JrIGJ1dCB3YXMgYSBsb3Qgb2YKICBjcnVmdCwgY29kZSBhbmQgZXh0cmEgbWFnaWMgbmVlZGVkIC0gd2hlbiB0aGlzIHZlcnkgc21hbGwgY2hhbmdlIG9mIHR5cGUKICBzZWVtcyBoYXJtbGVzcyBhbmQgc3RpbGwgc29sdmVzIHRoZSBtaXNzaW5nIHNvY2tsZW5fdCBwcm9ibGVtLgoKLSBSaWNoYXJkIEF0dGVyZXIgYnJvdWdodCBhIHBhdGNoIHRoYXQgYWRkZWQgc3VwcG9ydCBmb3IgU09DS1M0YSBwcm94aWVzLAogIHdoaWNoIGlzIGFuIGlub2ZmaWNpYWwgUFJPWFk0IHZhcmlhbnQgdGhhdCBzZW5kcyB0aGUgaG9zdG5hbWUgdG8gdGhlIHByb3h5CiAgaW5zdGVhZCBvZiB0aGUgcmVzb2x2ZWQgYWRkcmVzcyAod2hpY2ggaXMgYWxyZWFkeSBzdXBwb3J0ZWQgYnkgU09DS1M1KS4KICAtLXNvY2tzNGEgaXMgdGhlIGN1cmwgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgaXQgYW5kIENVUkxPUFRfUFJPWFlUWVBFIGNhbgogIG5vdyBiZSBzZXQgdG8gQ1VSTFBST1hZX1NPQ0tTNEEgYXMgd2VsbC4KCkRhbmllbCBTICgxIEphbiAyMDA4KQotIE1vaHVuIEJpc3dhcyBwb2ludGVkIG91dCB0aGF0IC0tbGliY3VybCBnZW5lcmF0ZWQgYSBzb3VyY2UgY29kZSB3aXRoIGFuIGludAogIGZ1bmN0aW9uIGJ1dCB3aXRob3V0IGEgcmV0dXJuIHN0YXRlbWVudC4gV2hpbGUgZml4aW5nIHRoYXQsIEkgYWxzbyB0b29rIGNhcmUKICBhYm91dCBhZGRpbmcgc29tZSBiZXR0ZXIgY29tbWVudHMgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZS4KCkRhbmllbCBTICgyNyBEZWMgMjAwNykKLSBEbWl0cnkgS3Vyb2Noa2luIG1lbnRpb25lZCBhIGZsYXcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTEyLzAyNTIuaHRtbCkgaW4gZGV0ZWN0X3Byb3h5KCkgd2hpY2gKICBmYWlsZWQgdG8gc2V0IHRoZSBiaXRzLnByb3h5IHZhcmlhYmxlIHByb3Blcmx5IHdoZW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKICB0b2xkIGxpYmN1cmwgdG8gdXNlIGEgaHR0cCBwcm94eS4KCkRhbmllbCBTICgyNiBEZWMgMjAwNykKLSBJbiBhbiBhdHRlbXB0IHRvIHJlcGVhdCB0aGUgcHJvYmxlbSBpbiBidWcgcmVwb3J0ICMxODUwNzMwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NTA3MzApIEkgd3JvdGUgdXAgdGVzdCBjYXNlIDU1Mi4gVGhlCiAgdGVzdCBpcyBkb2luZyBhIDcwSyBQT1NUIHdpdGggYSByZWFkIGNhbGxiYWNrIGFuZCBhbiBpb2N0bCBjYWxsYmFjayBvdmVyIGEKICBwcm94eSByZXF1aXJpbmcgRGlnZXN0IGF1dGguIFRoZSB0ZXN0IGNhc2UgY29kZSBpcyBtb3JlIG9yIGxlc3MgaWRlbnRpY2FsIHRvCiAgdGhlIHRlc3QgcmVjaXBlIGNvZGUgcHJvdmlkZWQgYnkgU3BhY2VuIEphc3NldCAod2hvIHN1Ym1pdHRlZCB0aGUgYnVnCiAgcmVwb3J0KS4KCkRhbmllbCBTICgyNSBEZWMgMjAwNykKLSBHYXJ5IE1heHdlbGwgZmlsZWQgYnVnIHJlcG9ydCAjMTg1NjYyOAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODU2NjI4KSBhbmQgcHJvdmlkZWQgYSBmaXggZm9yIHRoZQogIChzbWFsbCkgbWVtb3J5IGxlYWsgaW4gdGhlIFNTTCBzZXNzaW9uIElEIGNhY2hpbmcgY29kZS4gSXQgaGFwcGVuZWQgd2hlbiBhCiAgcHJldmlvdXMgZW50cnkgaW4gdGhlIGNhY2hlIHdhcyByZS11c2VkLgoKRGFuaWVsIEZhbmRyaWNoICgxOSBEZWMgMjAwNykKLSBFbnN1cmUgdGhhdCBucm9mZiBkb2Vzbid0IHB1dCBhbnl0aGluZyBidXQgQVNDSUkgY2hhcmFjdGVycyBpbnRvIHRoZQogIC0tbWFudWFsIHRleHQuCgpZYW5nIFRzZSAoMTggRGVjIDIwMDcpCi0gTVNWQyA5LjAgKFZTMjAwOCkgZG9lcyBub3Qgc3VwcG9ydCBXaW5kb3dzIGJ1aWxkIHRhcmdldHMgcHJpb3IgdG8gV2luWFAsCiAgYW5kIG1ha2VzIHdyb25nIGFzdW1wdGlvbnMgb2YgYnVpbGQgdGFyZ2V0IHdoZW4gaXQgaXNuJ3Qgc3BlY2lmaWVkLiBTbywKICBpZiBubyBidWlsZCB0YXJnZXQgaGFzIGJlZW4gZGVmaW5lZCB3ZSB3aWxsIHRhcmdldCBXaW5YUCB3aGVuIGJ1aWxkaW5nCiAgY3VybC9saWJjdXJsIHdpdGggTVNWQyA5LjAgKFZTMjAwOCkuCgotIChodHRwOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA3LTEyLzAwMzkuaHRtbCkgcmVwb3J0ZWQgYW5kIGZpeGVkCiAgYSBmaWxlIHRydW5jYXRpb24gcHJvYmxlbSBvbiBXaW5kb3dzIGJ1aWxkIHRhcmdldHMgdHJpZ2dlcmVkIHdoZW4gcmV0cnlpbmcKICBhIGRvd25sb2FkIHdpdGggY3VybC4KCkRhbmllbCBTICgxNyBEZWMgMjAwNykKLSBNYXRldXN6IExvc2tvdCBwb2ludGVkIG91dCB0aGF0IE1TVkMgOS4wIChWUzIwMDgpIGhhcyB0aGUgcG9sbGZkIHN0cnVjdCBhbmQKICBkZWZpbmVzIGluIHdpbnNvY2syLmggc29tZWhvdyBkaWZmZXJlbnRseSB0aGFuIHByZXZpb3VzIHZlcnNpb25zIGFuZCB0aGF0CiAgY3VybCA3LjE3LjEgd291bGQgZmFpbCB0byBjb21waWxlIG91dCBvZiB0aGUgYm94LgoKRGFuaWVsIFMgKDEzIERlYyAyMDA3KQotIERhdmlkIFdyaWdodCBmaWxlZCBidWcgcmVwb3J0ICMxODQ5NzY0CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NDk3NjQpIHdpdGggYW4gaW5jbHVkZWQgZml4LiBIZQogIGlkZW50aWZpZWQgYSBwcm9ibGVtIGZvciByZS11c2VkIGNvbm5lY3Rpb25zIHRoYXQgcHJldmlvdXNseSBoYWQgc2VudAogIEV4cGVjdDogMTAwLWNvbnRpbnVlIGFuZCBpbiBzb21lIHNpdHVhdGlvbnMgdGhlIHN1YnNlcXVlbnQgUE9TVCAodGhhdCBkaWRuJ3QKICB1c2UgRXhwZWN0Oikgc3RpbGwgaGFkIHRoZSBpbnRlcm5hbCBmbGFnIHNldCBmb3IgaXRzIHVzZS4gRGF2aWQncyBmaXggKHRoYXQKICBtYWtlcyB0aGUgc2V0dGluZyBvZiB0aGUgZmxhZyBpbiBldmVyeSBzaW5nbGUgcmVxdWVzdCB1bmNvbmRpdGlvbmFsbHkpIGlzCiAgZmluZSBhbmQgaXMgbm93IHVzZWQhCgpEYW5pZWwgUyAoMTIgRGVjIDIwMDcpCi0gR2lsbGVzIEJsYW5jIG1hZGUgdGhlIGN1cmwgdG9vbCBlbmFibGUgU09fS0VFUEFMSVZFIGZvciB0aGUgY29ubmVjdGlvbnMgYW5kCiAgYWRkZWQgdGhlIC0tbm8ta2VlcC1hbGl2ZSBvcHRpb24gdGhhdCBjYW4gZGlzYWJsZSB0aGF0IG9uIGRlbWFuZC4KCkRhbmllbCBTICg5IERlYyAyMDA3KQotIEFuZHJldyBNb2lzZSBmaWxlZCBidWcgcmVwb3J0ICMxODQ3NTAxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NDc1MDEpIGFuZCBwb2ludGVkIG91dCBhIG1lbWNweSgpCiAgdGhhdCBzaG91bGQgYmUgbWVtbW92ZSgpIGluIHRoZSBjb252ZXJ0X2xpbmVlbmRzKCkgZnVuY3Rpb24uCgpEYW5pZWwgUyAoOCBEZWMgMjAwNykKLSBSZW5hbWVkIGFsbCBpbnRlcm5hbCBzdGF0aWMgZnVuY3Rpb25zIHRoYXQgaGFkIEN1cmxfIHByZWZpeGVzIHRvIG5vIGxvbmdlcgogIGhhdmUgdGhlbS4gVGhlIEN1cmxfIHByZWZpeCBpcyBleGNsdXNpdmVseSB1c2VkIGZvciBsaWJyYXJ5IGludGVybmFsIGdsb2JhbAogIHN5bWJvbHMuIFN0YXRpYyBmdW5jdGlvbnMgY2FuIGJlIG5hbWVkIGFueXRoaW5nLCBleGNlcHQgZm9yIHVzaW5nIEN1cmxfIG9yCiAgY3VybF8gcHJlZml4ZXMuIFRoaXMgaXMgZm9yIGNvbnNpc3RlbmN5IGFuZCBmb3IgZWFzaWVyIG1haW50YWluYW5jZSBhbmQKICBvdmVydmlldy4KCi0gQ2xlYW5lZCB1cCBhbmQgcmVmb3JtYXR0ZWQgdGhlIFRPRE8gZG9jdW1lbnQgdG8gbG9vayBsaWtlIHRoZSBGQVEgYW5kCiAgQ09OVFJJQlVURSwgd2hpY2ggbWFrZXMgbmljZXIgd2ViIHBhZ2VzCgotIEFkZGVkIHRlc3QgY2FzZXMgNTQ5IGFuZCA1NTAgdGhhdCB0ZXN0IENVUkxPUFRfUFJPWFlfVFJBTlNGRVJfTU9ERS4KCi0gQWRkZWQga2V5d29yZHMgb24gYSBidW5jaCBvZiB0ZXN0IGNhc2VzCgotIEZpeGVkIGFuIE9PTSBwcm9ibGVtIGluIHRoZSBjdXJsIGNvZGUgdGhhdCB3b3VsZCBsZWFkIHRvIGZjbG9zZSBvbiBhIGJhZAogIGhhbmRsZSBhbmQgY3Jhc2gKCkRhbmllbCBTICg1IERlYyAyMDA3KQotIFNwYWNlbiBKYXNzZXQgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggZG9pbmcgUE9TVCAod2l0aCBkYXRhIHJlYWQgd2l0aCBhCiAgY2FsbGJhY2spIG92ZXIgYSBwcm94eSB3aGVuIE5UTE0gaXMgdXNlZCBhcyBhdXRoIHdpdGggdGhlIHByb3h5LiBUaGUgYnVnCiAgYWxzbyBjb25jZXJuZWQgRGlnZXN0IGFuZCB3YXMgbGltaXRlZCB0byB1c2luZyBjYWxsYmFjayBvbmx5LiBTcGFjZW4gd29ya2VkCiAgd2l0aCB1cyB0byBwcm92aWRlIGEgdXNlZnVsIHBhdGNoLiBJIGFkZGVkIHRoZSB0ZXN0IGNhc2UgNTQ3IGFuZCA1NDggdG8KICB2ZXJpZnkgdHdvIHZhcmlhdGlvbnMgb2YgUE9TVCBvdmVyIHByb3h5IHdpdGggTlRMTS4KCkRhbmllbCBTICgzIERlYyAyMDA3KQotIFJheSBQZWtvd3NraSBmaWxlZCBidWcgcmVwb3J0ICMxODQyMDI5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NDIwMjkpIGluIHdoaWNoIGhlIGlkZW50aWZpZWQgYQogIHByb2JsZW0gd2l0aCBTU0wgc2Vzc2lvbiBjYWNoaW5nIHRoYXQgcHJldmVudCBpdCBmcm9tIHdvcmtpbmcsIGFuZCBwcm92aWRlZAogIHRoZSBhc3NvY2lhdGVkIGZpeCEKCi0gTm93IGxpYmN1cmwgKGJ1aWx0IHdpdGggT3BlblNTTCkgZG9lc24ndCByZXR1cm4gZXJyb3IgYW55bW9yZSBpZiB0aGUgcmVtb3RlCiAgU1NMLWJhc2VkIHNlcnZlciBkb2Vzbid0IHByZXNlbnQgYSBjZXJ0aWZpY2F0ZSB3aGVuIHRoZSByZXF1ZXN0IGlzIHRvbGQgdG8KICBpZ25vcmUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGFueXdheS4KCi0gTWljaGFsIE1hcmVrIGludHJvZHVjZWQgQ1VSTE9QVF9QUk9YWV9UUkFOU0ZFUl9NT0RFIHdoaWNoIGlzIHVzZWQgdG8gY29udHJvbAogIHRoZSBhcHBlbmRpbmcgb2YgdGhlICJ0eXBlPSIgdGhpbmcgb24gRlRQIFVSTHMgd2hlbiB0aGV5IGFyZSBwYXNzZWQgdG8gYQogIEhUVFAgcHJveHkuIFNvbWUgcHJveGllcyBqdXN0IGRvbid0IGxpa2UgdGhhdCBhcHBlbmRpbmcgKHdoaWNoIGlzIGRvbmUKICB1bmNvbmRpdGlvbmFsbHkgaW4gNy4xNy4xKSwgYW5kIHNvbWUgcHJveGllcyB0cmVhdCBiaW5hcnkvYXNjaWkgdHJhbnNmZXJzCiAgYmV0dGVyIHdpdGggdGhlIGFwcGVuZGluZyBkb25lIQoKRGFuaWVsIFMgKDI5IE5vdiAyMDA3KQotIEEgYnVnIHJlcG9ydCBvbiB0aGUgY3VybC1saWJyYXJ5IGxpc3Qgc2hvd2VkIGEgSFRUUCBEaWdlc3Qgc2Vzc2lvbiBnb2luZyBvbgogIHdpdGggYSA3MDArIGxldHRlciBub25jZS4gUHJldmlvdXNseSBsaWJjdXJsIG9ubHkgc3VwcG9ydCAxMjcgbGV0dGVyIG9uZXMKICBhbmQgbm93IEkgYnVtcGVkIGl0IHRvIDEwMjMuCgotIEZpeGVkIHRoZSByZXN1bWVkIEZUUCB1cGxvYWQgbG9vcCB0byBub3QgcmVxdWlyZSB0aGF0IHRoZSByZWFkIGNhbGxiYWNrCiAgcmV0dXJucyBhIGZ1bGwgYnVmZmVyIG9uIGVhY2ggaW52b2tlLgoKRGFuaWVsIFMgKDI1IE5vdiAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZSAxMDE1IHRoYXQgdGVzdHMgLS1kYXRhLXVybGVuY29kZSBpbiBtdWx0aXBsZSB3YXlzCgotIEZpeGVkIC0tZGF0YS11cmxlbmNvZGUgZm9yIHdoZW4gbm8gQCBvciA9IGFyZSB1c2VkCgotIEV4dGVuZGVkIHRoZSB1c2VyLWFnZW50IGJ1ZmZlciBjdXJsIHVzZXMsIHNpbmNlIHdlIGNhbiBoaXQgdGhlIDEyOCBieXRlCiAgYm9yZGVyIHdpdGggcGxlbnR5IGRldmVsb3BtZW50IGxpYnJhcmllcyB1c2VkLiBMaWtlIG15IGN1cnJlbnQgc2V0OiAiY3VybAogIDcuMTcuMi1DVlMgKGk2ODYtcGMtbGludXgtZ251KSBsaWJjdXJsLzcuMTcuMi1DVlMgT3BlblNTTC8wLjkuOGcKICB6bGliLzEuMi4zLjMgYy1hcmVzLzEuNS4yLUNWUyBsaWJpZG4vMS4xIGxpYnNzaDIvMC4xOS4wLUNWUyIKCkRhbmllbCBTICgyNCBOb3YgMjAwNykKLSBJbnRlcm5hbCByZWFycmFuZ2VtZW50cywgc28gdGhhdCB0aGUgcHJldmlvdXMgc3RydWN0IEhhbmRsZURhdGEgaXMgbm8gbW9yZS4KICBJdCBpcyBub3cga25vd24gYXMgU2luZ2xlUmVxdWVzdCBhbmQgdGhlIEN1cmxfdHJhbnNmZXJfa2VlcGVyIHN0cnVjdCB3aXRoaW4KICB0aGF0IHdhcyByZW1vdmUgZW50aXJlbHkuIFRoaXMgaGFzIHRoZSB1cHNpZGUgdGhhdCB0aGVyZSBhcmUgbGVzcyBkdXBsaWNhdGUKICBzdHJ1Y3QgbWVtYmVycyB0aGF0IG1hZGUgaXQgaGFyZCB0byBzZWUgYW5kIHJlbWVtYmVyIHdoYXQgc3RydWN0IHRoYXQgd2FzCiAgdXNlZCB0byBzdG9yZSB3aGF0IGRhdGEuIFRoZSB0cmFuc2Zlcl9rZWVwZXIgdGhpbmcgd2FzIG9uY2Ugc3RvcmVkIG9uIGEKICBwZXItY29ubmVjdGlvbiBiYXNpcyBhbmQgdGhlbiBpdCBtYWRlIHNlbnNlIHRvIGhhdmUgdGhlIGR1cGxpY2F0ZSBpbmZvIGJ1dAogIHNpbmNlIGl0IHdhcyBtb3ZlZCB0byB0aGUgU2Vzc2lvbkhhbmRsZSAoaW4gNy4xNi4wKSBpdCBqdXN0IGFkZGVkIHdlaXJkbmVzcy4KICBUaGUgU2luZ2xlUmVxdWVzdCBzdHJ1Y3QgaXMgdXNlZCBieSBkYXRhIHRoYXQgb25seSBpcyB2YWxpZCBmb3IgdGhpcyBzaW5nbGUKICByZXF1ZXN0LgoKWWFuZyBUc2UgKDIyIE5vdiAyMDA3KQotIFByb3ZpZGUgYSBzb2NrbGVuX3QgZGVmaW5pdGlvbiBpbiBjdXJsLmggZm9yIFdpbjMyIEFQSSBidWlsZCB0YXJnZXRzCiAgd2hpY2ggZG9uJ3QgaGF2ZSBvbmUuCgpEYW5pZWwgUyAoMjIgTm92IDIwMDcpCi0gQWxlc3NhbmRybyBWZXNlbHkgaGVscGVkIG1lIGltcHJvdmUgdGhlIC0tZGF0YS11cmxlbmNvZGUncyBzeW50YXgsIHBhcnNlcgogIGFuZCBkb2N1bWVudGF0aW9uLgoKRGFuaWVsIFMgKDIxIE5vdiAyMDA3KQotIFdoaWxlIGluc3BlY3RpbmcgdGhlIE5lZ290aWF0ZSBjb2RlLCBJIG5vdGljZWQgaG93IHRoZSBwcm94eSBhdXRoIHdhcyB1c2luZwogIHRoZSBzYW1lIHN0YXRlIHN0cnVjdCBhcyB0aGUgaG9zdCBhdXRoLCBzbyBib3RoIGNvdWxkIG5ldmVyIGJlIHVzZWQgYXQgdGhlCiAgc2FtZSB0aW1lISBJIGZpeGVkIGl0ICh3aXRob3V0IGJlaW5nIGFibGUgdG8gY2hlY2spIHRvIHVzZSB0d28gc2VwYXJhdGUKICBzdHJ1Y3RzIHRvIGFsbG93IGF1dGhlbnRpY2F0aW9uIHVzaW5nIE5lZ290aWF0ZSBvbiBob3N0IGFuZCBwcm94eQogIHNpbXVsdGFuZW91c2x5LgoKRGFuaWVsIFMgKDIwIE5vdiAyMDA3KQotIEVtaWwgUm9tYW51cyBwb2ludGVkIG91dCBhIGJ1ZyB0aGF0IG1hZGUgYW4gZWFzeSBoYW5kbGUgZ2V0IHRoZSBjb29raWUKICBlbmdpbmUgYWN0aXZhdGVkIHdoZW4gc2V0IHRvIHVzZSBhIHNoYXJlIChldmVuIGlmIHRoZSBzaGFyZSBkb2Vzbid0IHNoYXJlCiAgY29va2llcykuIEkgZml4ZWQgaXQuCgotIEZpeGVkIGEgdmVyeSBsb25nLWxhc3RpbmcgbXByaW50ZigpIGJ1ZyB0aGF0IG9jY3VycmVkIHdoZW4gd2UgZGlkICIlLipzJXMiLAogIHNpbmNlIHRoZSBzZWNvbmQgJXMgd291bGQgdGhlbiB3cm9uZ2x5IHVzZWQgdGhlIG51bWVyaWNhbCBwcmVjaXNpb24gYXJndW1lbnQKICBpbnN0ZWFkIGFuZCBjcmFzaC4KCi0gSW50cm9kdWNlZCAtLWRhdGEtdXJsZW5jb2RlIHRvIHRoZSBjdXJsIHRvb2wgZm9yIGVhc2llciB1cmwgZW5jb2Rpbmcgb2YgdGhlCiAgZGF0YSBzZW50IGluIGEgcG9zdC4KCkRhbmllbCBTICgxOCBOb3YgMjAwNykKLSBSb2IgQ3JpdHRlbmRlbiBmaXhlZCBTU0wgY29ubmVjdGlvbnMgd2l0aCBOU1MgZG9uZSB3aXRoIHRoZSBtdWx0aS1pbnRlcmZhY2UKCkRhbmllbCBTICgxNyBOb3YgMjAwNykKLSBNaWNoYWwgTWFyZWsgbWFkZSB0aGUgdGVzdCBzdWl0ZSByZW1lbWJlciB3aGF0IHRlc3Qgc2VydmVycyB0aGF0IGZhaWwgdG8KICBzdGFydCBzbyB0aGF0IHN1YnNlcXVlbnQgdHJpZXMgYXJlIHNpbXBseSBza2lwcGVkLgoKLSBBbmRyZXMgR2FyY2lhIG1hZGUgdGhlIGV4YW1wbGVzIGJ1aWxkIGZpbmUgb24gV2luZG93cyAobWluZ3cgKyBtc3lzKSB3aGVuCiAgdGhlIGxpYiB3YXMgYnVpbHQgc3RhdGljbHkuCgpEYW5pZWwgUyAoMTYgTm92IDIwMDcpCi0gQXRlcyBHb3JhbCBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiBodHRwLmM6YWRkX2J1ZmZlcl9zZW5kKCkgd2hlbiBhIGRlYnVnCiAgY2FsbGJhY2sgd2FzIHVzZWQsIGFzIGl0IGNvdWxkIHdyb25nbHkgcGFzcyBvbiBhIGJhZCBzaXplIGZvciB0aGUgb3V0Z29pbmcKICBIVFRQIGhlYWRlci4gVGhlIGJhZCBzaXplIHdvdWxkIGJlIGEgdmVyeSBsYXJnZSB2YWx1ZSBhcyBpdCB3YXMgYSB3cmFwcGVkCiAgc2l6ZV90IGNvbnRlbnQuIFRoaXMgaGFwcGVuZWQgd2hlbiB0aGUgd2hvbGUgSFRUUCByZXF1ZXN0IGZhaWxlZCB0byBnZXQgc2VudAogIGluIG9uZSBzaW5nbGUgc2VuZC4gIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0xMS8wMTY1Lmh0bWwKCkRhbmllbCBTICgxNSBOb3YgMjAwNykKLSBGaXhlZCB5ZXQgYW5vdGhlciByZW1haW5pbmcgcHJvYmxlbSB3aXRoIGRvaW5nIFNGVFAgZGlyZWN0b3J5IGxpc3RpbmdzIG9uIGEKICByZS11c2VkIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4gTWVudGlvbmVkIGJ5IEltbWFudWVsIEdyZWdvaXJlIG9uIHRoZSBtYWlsaW5nCiAgbGlzdC4KCi0gTWljaGFsIE1hcmVrIGZpeGVkIHRoZSB0ZXN0IHN1aXRlIHRvIGJldHRlciBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlbiB0aGUgSFRUUAogIGlwdjYgc2VydmVyIGNhbid0IHJ1bi4KCllhbmcgVHNlICgxNCBOb3YgMjAwNykKLSBGaXggYSB2YXJpYWJsZSBwb3RlbnRpYWwgd3JhcHBpbmcgaW4gYWRkX2J1ZmZlcigpIHdoZW4gdXNpbmcgYWJzb2x1dGVseQogIGh1Z2Ugc2VuZCBidWZmZXIgc2l6ZXMuCgpEYW5pZWwgUyAoMTMgTm92IDIwMDcpCi0gRml4ZWQgYSByZW1haW5pbmcgcHJvYmxlbSB3aXRoIGRvaW5nIFNGVFAgZGlyZWN0b3J5IGxpc3RpbmdzIG9uIGEgcmUtdXNlZAogIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4gTWVudGlvbmVkIGJ5IEltbWFudWVsIEdyZWdvaXJlIG9uIHRoZSBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgUyAoMTIgTm92IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTgzMDYzNyAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTgzMDYzNyksIHdoaWNoIHdhcwogIGZvcndhcmRlZCBmcm9tIHRoZSBHZW50b28gYnVnIHRyYWNrZXIgYnkgRGFuaWVsIEJsYWNrIGFuZCB3YXMgb3JpZ2luYWxseQogIHN1Ym1pdHRlZCBieSBSb2JpbiBKb2huc29uLCBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgd291bGQgZG8gYmFkIG1lbW9yeQogIHJlZmVyZW5jZXMgd2hlbiBpdCBmYWlsZWQgYW5kIGJhaWxlZCBvdXQgYmVmb3JlIHRoZSBoYW5kbGVyIHRoaW5nIHdhcwogIHNldHVwLiBNeSBmaXggaXMgbm90IGRvbmUgbGlrZSB0aGUgcHJvdmlkZWQgcGF0Y2ggZG9lcyBpdCwgYnV0IGluc3RlYWQgSQogIG1ha2Ugc3VyZSB0aGF0IHRoZXJlJ3MgbmV2ZXIgYW55IGNoYW5jZSBmb3IgYSBOVUxMIHBvaW50ZXIgaW4gdGhhdCBzdHJ1Y3QKICBtZW1iZXIuCgpZYW5nIFRzZSAoMTAgTm92IDIwMDcpCi0gVmlrcmFtIFNheGVuYSAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTExLzAwOTYuaHRtbCkgcG9pbnRlZCBvdXQKICB0aGF0IHRoZSBwb2xsZmQgc3RydWN0IHdhcyBiZWluZyBtdWx0aSBkZWZpbmVkIHdoZW4gdXNpbmcgVlMyMDA4LiBUaGlzIGlzCiAgbm93IGZpeGVkIGluIC9jdXJsL2xpYi9zZWxlY3QuaAoKRGFuaWVsIFMgKDggTm92IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTgyMzQ4NyAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTgyMzQ4NykgcG9pbnRlZAogIG91dCB0aGF0IFNGVFAgcmVxdWVzdHMgZGlkbid0IHVzZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLiBOZWl0aGVyIGRpZCBTQ1AKICBvbmVzLiAgSSBnYXZlIHRoZSBTU0ggY29kZSBhIGdvb2QgYmVhdGluZyBhbmQgbm93IGJvdGggU0NQIGFuZCBTRlRQIHNob3VsZAogIHVzZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGZpbmUuIEkgYWxzbyBkaWQgYSBidW5jaCBvZiBpbmRlbnQgY2hhbmdlcyBhcwogIHdlbGwgYXMgYSBidWcgZml4IGZvciB0aGUgImtleWJvYXJkIGludGVyYWN0aXZlIiBhdXRoLgoKRGFuIEYgKDYgTm92IDIwMDcpCi0gSW1wcm92ZWQgdGVsbmV0IHN1cHBvcnQgYnkgZHJhc3RpY2FsbHkgcmVkdWNpbmcgdGhlIG51bWJlciBvZiB3cml0ZQogIGNhbGxiYWNrcyBuZWVkZWQgdG8gcGFzcyBhIGJ1ZmZlciB0byB0aGUgdXNlci4gIEluc3RlYWQgb25lIHBlciBieXRlIGl0CiAgaXMgbm93IGFzIGxpdHRsZSBhcyBvbmUgcGVyIHNlZ21lbnQuCgpZYW5nIFRzZSAoNiBOb3YgMjAwNykKLSBCdWcgcmVwb3J0ICMxODI0ODk0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODI0ODk0KSBwb2ludGVkCiAgb3V0IGEgcHJvYmxlbSBpbiBjdXJsLmggd2hlbiBidWlsZGluZyBDKysgYXBwcyB3aXRoIE1TVkMuIFRvIGZpeCBpdCwgdGhlCiAgaW5jbHVzaW9uIG9mIGhlYWRlciBmaWxlcyBpbiBjdXJsLmggaXMgbW92ZWQgb3V0c2lkZSBvZiB0aGUgQysrIGV4dGVybiAiQyIKICBsaW5rYWdlIGJsb2NrLgoKRGFuaWVsIFMgKDEgTm92IDIwMDcpCi0gVG9ieSBQZXRlcnNvbiBwYXRjaGVkIGEgbWVtb3J5IHByb2JsZW0gaW4gdGhlIGNvbW1hbmQgbGluZSB0b29sIHRoYXQKICBoYXBwZW5lZCB3aGVuIGEgdXNlciBoYWQgYSBob21lIGRpciBhcyBhbiBlbXB0eSBzdHJpbmcuIGN1cmwgd291bGQgdGhlbiBkbwogIGZyZWUoKSBvbiBhIHdyb25nIGFyZWEuCgpEYW4gRiAoMSBOb3YgMjAwNykKLSBGaXhlZCBjdXJsLWNvbmZpZyAtLWZlYXR1cmVzIHRvIG5vdCBkaXNwbGF5IGxpYnogd2hlbiBpdCB3YXNuJ3QgdXNlZAogIGR1ZSB0byBhIG1pc3NpbmcgaGVhZGVyIGZpbGUuCgpEYW4gRiAoMzEgT2N0b2JlciAyMDA3KQotIEZpeGVkIHRoZSBvdXRwdXQgb2YgY3VybC1jb25maWcgLS1wcm90b2NvbHMgd2hpY2ggc2hvd2VkIFNDUCBhbmQgU0ZUUAogIGFsd2F5cywgZXhjZXB0IHdoZW4gLS13aXRob3V0LWxpYnNzaDIgd2FzIGdpdmVuCgotIEFkZGVkIHRlc3QgY2FzZXMgMTAxMyBhbmQgMTAxNCB0byBjaGVjayB0aGF0IGN1cmwtY29uZmlnIC0tcHJvdG9jb2xzIGFuZAogIGN1cmwtY29uZmlnIC0tZmVhdHVyZXMgbWF0Y2hlcyB0aGUgb3V0cHV0IG9mIGN1cmwgLS12ZXJzaW9uCgpEYW4gRiAoMzAgT2N0b2JlciAyMDA3KQotIEZpeGVkIGFuIE9PTSBwcm9ibGVtIHdpdGggZmlsZTogVVJMcwoKLSBNb3ZlZCBDdXJsX2ZpbGVfY29ubmVjdCBpbnRvIHRoZSBwcm90b2NvbCBoYW5kbGVyIHN0cnVjdAoKRGFuIEYgKDI5IE9jdG9iZXIgMjAwNykKLSBBZGRlZCB0ZXN0IGNhc2UgNTQ2IHRvIGNoZWNrIHRoYXQgc3Vic2VxdWVudCBGVFAgdHJhbnNmZXJzIHdvcmsgYWZ0ZXIgYQogIGZhaWxlZCBvbmUgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZQoKRGFuaWVsIFMgKDI5IE9jdG9iZXIgMjAwNykKLSBCYXNlZCBvbiBvbmUgb2YgdGhvc2UgYnVnIHJlcG9ydHMgdGhhdCBhcmUgaW50ZXJjZXB0ZWQgYnkgYSBkaXN0cm8ncyBidWcKICB0cmFja2VyIChodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTMxNjE5MSksIEkgbm93IG1hZGUKICBjdXJsLWNvbmZpZyAtLWZlYXR1cmVzIGFuZCAtLXByb3RvY29scyBzaG93IHRoZSBjb3JyZWN0IG91dHB1dCB3aGVuIGJ1aWx0CiAgd2l0aCBOU1MuCgpWZXJzaW9uIDcuMTcuMSAoMjkgT2N0b2JlciAyMDA3KQoKRGFuIEYgKDI1IE9jdG9iZXIgMjAwNykKLSBBZGRlZCB0aGUgLS1zdGF0aWMtbGlicyBvcHRpb24gdG8gY3VybC1jb25maWcKCkRhbmllbCBTICgyNSBPY3RvYmVyIDIwMDcpCi0gTWFkZSBsaWJjdXJsIGJ1aWx0IHdpdGggTlNTIHBvc3NpYmxlIHRvIGlnbm9yZSB0aGUgcGVlciB2ZXJpZmljYXRpb24uCiAgUHJldmlvdXNseSBpdCB3b3VsZCBmYWlsIGlmIHRoZSBjYSBidW5kbGUgd2Fzbid0IHByZXNlbnQsIGV2ZW4gaWYgdGhlIGNvZGUKICBpZ25vcmVkIHRoZSB2ZXJpZmljYXRpb24gcmVzdWx0cy4KClBhdHJpY2sgTSAoMjUgT2N0b2JlciAyMDA3KQotIEZpeGVkIHRlc3Qgc2VydmVyIHRvIGFsbG93IG51bGwgYnl0ZXMgaW4gYmluYXJ5IHBvc3RzLgpfIEFkZGVkIHRlc3RzIDM1LCA1NDQgJiA1NDUgdG8gY2hlY2sgYmluYXJ5IGRhdGEgcG9zdHMsIGJvdGggc3RhdGljIChpbiBwbGFjZSkKICBhbmQgZHluYW1pYyAoY29waWVkKS4KCkRhbmllbCBTICgyNSBPY3RvYmVyIDIwMDcpCi0gTWljaGFsIE1hcmVrIGZpeGVkIHRoZSB0ZXN0IHNjcmlwdCB0byBiZSBhYmxlIHRvIHVzZSB2YWxncmluZCBldmVuIHdoZW4gdGhlCiAgbGliIGlzIGJ1aWx0IHNoYXJlZCB3aXRoIGxpYnRvb2wuCgotIEZpeGVkIGEgZmV3IG1lbW9yeSBsZWFrcyB3aGVuIHRoZSBzYW1lIGVhc3kgaGFuZGxlIGlzIHJlLXVzZWQgdG8gcmVxdWVzdAogIFVSTHMgd2l0aCBkaWZmZXJlbnQgcHJvdG9jb2xzLiBGVFAgYW5kIFRGVFAgcmVsYXRlZCBsZWFrcy4gQ2F1Z2h0IHRoYW5rcyB0bwogIERhbiBGJ3MgbmV3IHRlc3QgY2FzZXMuCgpEYW4gRiAoMjQgT2N0b2JlciAyMDA3KQotIEZpeGVkIHRoZSB0ZXN0IEZUUCBhbmQgVEZUUCBzZXJ2ZXJzIHRvIHN1cHBvcnQgdGhlID4xMDAwMCB0ZXN0IG51bWJlcgogIG5vdGF0aW9uCgotIEFkZGVkIHRlc3QgY2FzZXMgMjAwMCB0aHJvdWdoIDIwMDMgd2hpY2ggdGVzdCBtdWx0aXBsZSBwcm90b2NvbHMgdXNpbmcgdGhlCiAgc2FtZSBlYXN5IGhhbmRsZQoKLSBGaXhlZCB0aGUgZmlsZWNoZWNrOiBtYWtlIHRhcmdldCB0byB3b3JrIG91dHNpZGUgdGhlIHNvdXJjZSB0cmVlCgpEYW5pZWwgUyAoMjQgT2N0b2JlciAyMDA3KQotIFZsYWRpbWlyIExhemFyZW5rbyBwb2ludGVkIG91dCB0aGF0IHdlIHNob3VsZCBkbyBzb21lICdtdCcgbWFnaWMgd2hlbgogIGJ1aWxkaW5nIHdpdGggVkM4IHRvIGdldCB0aGUgIm1hbmlmZXN0IiBlbWJlZGRlZCB0byBtYWtlIGZpbmUgc3RhbmQtYWxvbmUKICBiaW5hcmllcy4gVGhlIG1ha2V0Z3ogYW5kIHRoZSBzcmMvTWFrZWZpbGUudmM2IGZpbGVzIHdlcmUgYWRqdXN0ZWQKICBhY2NvcmRpbmdseS4KCkRhbmllbCBTICgyMyBPY3RvYmVyIDIwMDcpCi0gQnVnIHJlcG9ydCAjMTgxMjE5MCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTgxMjE5MCkgcG9pbnRzIG91dAogIHRoYXQgbGliY3VybCB0cmllZCB0byByZS11c2UgY29ubmVjdGlvbnMgYSBiaXQgdG9vIG11Y2ggd2hlbiB1c2luZyBub24tU1NMCiAgcHJvdG9jb2xzIHR1bm5lbGVkIG92ZXIgYSBIVFRQIHByb3h5LgoKRGFuaWVsIFMgKDIyIE9jdG9iZXIgMjAwNykKLSBNaWNoYWwgTWFyZWsgZm9yd2FyZGVkIHRoZSBidWcgcmVwb3J0CiAgaHR0cHM6Ly9idWd6aWxsYS5ub3ZlbGwuY29tL3Nob3dfYnVnLmNnaT9pZD0zMzI5MTcgYWJvdXQgYSBIVFRQIHJlZGlyZWN0IHRvCiAgRlRQIHRoYXQgY2F1c2VkIG1lbW9yeSBoYXZvYy4gSGlzIHdvcmsgdG9nZXRoZXIgd2l0aCBteSBlZmZvcnRzIGNyZWF0ZWQgdHdvCiAgZml4ZXM6CgogICMxIC0gRlRQOjpmaWxlIHdhcyBtb3ZlZCB0byBzdHJ1Y3QgZnRwX2Nvbm4sIGJlY2F1c2UgaXMgaGFzIHRvIGJlIGRlYWx0IHdpdGgKICAgICAgIGF0IGNvbm5lY3Rpb24gY2xlYW51cCwgYXQgd2hpY2ggdGltZSB0aGUgc3RydWN0IEhhbmRsZURhdGEgY291bGQgYmUKICAgICAgIHVzZWQgYnkgYW5vdGhlciBjb25uZWN0aW9uLgogICAgICAgQWxzbywgdGhlIHVudXNlZCBjaGFyICp1cmxwYXRoIG1lbWJlciBpcyByZW1vdmVkIGZyb20gc3RydWN0IEZUUC4KIAogICMyIC0gcHJvdmlkZSBhIEN1cmxfcmVzZXRfcmVxcHJvdG8oKSBmdW5jdGlvbiB0aGF0IGZyZWVzCiAgICAgICBkYXRhLT5yZXFkYXRhLnByb3RvLiogb24gY29ubmVjdGlvbiBzZXR1cCBpZiBuZWVkZWQgKHRoYXQgaXMgaWYgdGhlCiAgICAgICBTZXNzaW9uSGFuZGxlIHdhcyB1c2VkIGJ5IGEgZGlmZmVyZW50IGNvbm5lY3Rpb24pLgoKICBBIGxvbmctdGVybSBnb2FsIGlzIG9mIGNvdXJzZSB0byBzb21laG93IGdldCByaWQgb2YgaG93IHRoZSByZXFkYXRhIHN0cnVjdAogIGlzIHVzZWQsIGFzIGl0IGlzIHRvbyBlcnJvci1wcm9uZS4KIAotIEJ1ZyByZXBvcnQgIzE4MTU1MzAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4MTU1MzApIHBvaW50cyBvdXQKICB0aGF0IHNwZWNpZnlpbmcgYSBwcm94eSB3aXRoIGEgdHJhaWxpbmcgc2xhc2ggZGlkbid0IHdvcmsgKHVubGVzcyBpdCBhbHNvCiAgY29udGFpbmVkIGEgcG9ydCBudW1iZXIpLgoKUGF0cmljayBNICgxNSBPY3RvYmVyIDIwMDcpCi0gRml4ZWQgdGhlIGR5bmFtaWMgQ1VSTE9QVF9QT1NURklFTERTIHByb2JsZW06IHRoaXMgb3B0aW9uIGlzIG5vdyBzdGF0aWMgYWdhaW4KICBhbmQgb3B0aW9uIENVUkxPUFRfQ09QWVBPU1RGSUVMRFMgaGFzIGJlZW4gYWRkZWQgdG8gc3VwcG9ydCBkeW5hbWljIG1vZGUuCgpQYXRyaWNrIE0gKDEyIE9jdG9iZXIgMjAwNykKLSBBZGRlZCBwZXItcHJvdG9jb2wgY2FsbGJhY2sgc3RhdGljIHRhYmxlcywgcmVwbGFjaW5nIGNhbGxiYWNrIHB0ciBzdG9yYWdlCiAgaW4gdGhlIGNvbm5lY3RkYXRhIHN0cnVjdHVyZSBieSBhIHNpbmdsZSBoYW5kbGVyIHRhYmxlIHB0ci4KCkRhbiBGICgxMSBPY3RvYmVyIDIwMDcpCi0gRml4ZWQgdGhlIC1sIG9wdGlvbiBvZiBydW50ZXN0cy5wbAoKLSBBZGRlZCBzdXBwb3J0IGZvciBza2lwcGluZyB0ZXN0cyBiYXNlZCBvbiBrZXkgd29yZHMuCgpEYW5pZWwgUyAoOSBPY3RvYmVyIDIwMDcpCi0gTWljaGFsIE1hcmVrIHJlbW92ZWQgdGhlIG5vIGxvbmdlciBleGlzdGluZyByZXR1cm4gY29kZXMgZnJvbSB0aGUgY3VybC4xCiAgbWFuIHBhZ2UuCgpEYW5pZWwgUyAoNyBPY3RvYmVyIDIwMDcpCi0gS25vd24gYnVnICM0Nywgd2hpY2ggY29uZnVzZWQgbGliY3VybCBpZiBkb2luZyBOVExNIGF1dGggb3ZlciBhIHByb3h5IHdpdGgKICBhIHJlc3BvbnNlIHRoYXQgd2FzIGxhcmdlciB0aGFuIDE2S0IgaXMgbm93IGltcHJvdmVkIHNsaWdodGx5IHNvIHRoYXQgbm93CiAgdGhlIHJlc3RyaWN0aW9uIGF0IDE2S0IgaXMgZm9yIHRoZSBoZWFkZXJzIG9ubHkgYW5kIGl0IHNob3VsZCBiZSBhIHJhcmUKICBzaXR1YXRpb24gd2hlcmUgdGhlIHJlc3BvbnNlLWhlYWRlcnMgZXhjZWVkIDE2S0IuIFRodXMsIEkgY29uc2lkZXIgIzQ3IGZpeGVkCiAgYW5kIHRoZSBoZWFkZXIgbGltaXRhdGlvbiBpcyBub3cga25vd24gYXMga25vd24gYnVnICM0OC4KCkRhbmllbCBTICg1IE9jdG9iZXIgMjAwNykKLSBNaWNoYWVsIFdhbGxuZXIgbWFkZSB0aGUgQ1VMUk9QVF9DT09LSUVMSVNUIG9wdGlvbiBzdXBwb3J0IGEgbmV3IG1hZ2ljCiAgc3RyaW5nOiAiRkxVU0giLiBVc2luZyB0aGF0IHdpbGwgY2F1c2UgbGliY3VybCB0byBmbHVzaCBpdHMgY29va2llcyB0byB0aGUKICBDVVJMT1BUX0NPT0tJRUpBUiBmaWxlLgoKLSBUaGUgbmV3IGZpbGUgZG9jcy9saWJjdXJsL0FCSSBkZXNjcmliZXMgaG93IHdlIHZpZXcgQUJJIGJyZWFrYWdlcywgc29uYW1lCiAgYnVtcHMgYW5kIHdoYXQgdGhlIHZlcnNpb24gbnVtYmVyJ3Mgc2lnbmlmaWNhbmNlIHRvIGFsbCB0aGF0IGlzLgoKRGFuaWVsIFMgKDQgT2N0b2JlciAyMDA3KQotIEkgZW5hYmxlZCB0ZXN0IDEwMDkgYW5kIG1hZGUgdGhlIC0tbG9jYWwtcG9ydCB1c2UgYSB3aWRlIHJhbmdlIHRvIHJlZHVjZSB0aGUKICByaXNrIG9mIGZhaWx1cmVzLgoKLSBLaW0gUmlubmV3aXR6IHJlcG9ydGVkIHRoYXQgLS1sb2NhbC1wb3J0IGRpZG4ndCB3b3JrIHdpdGggVEZUUCB0cmFuc2ZlcnMuCiAgVGhpcyBoYXBwZW5lZCBiZWNhdXNlIHRoZSB0ZnRwIGNvZGUgYWx3YXlzIHVuY29uZGlvbmFsbHkgZGlkIGEgYmluZCgpCiAgd2l0aG91dCBjYXJpbmcgaWYgb25lIGFscmVhZHkgaGFkIGJlZW4gZG9uZSBhbmQgdGhlbiBpdCBmYWlsZWQuIEkgd3JvdGUgYQogIHRlc3QgY2FzZSAoMTAwOSkgdG8gdmVyaWZ5IHRoaXMsIGJ1dCBpdCBpcyBhIGJpdCBlcnJvci1wcm9uZSBzaW5jZSBpdCB3aWxsCiAgaGF2ZSB0byBwaWNrIGEgZml4ZWQgbG9jYWwgcG9ydCBudW1iZXIgYW5kIHNpbmNlIHRoZSB0ZXN0cyBhcmUgcnVuIG9uIHNvCiAgbWFueSBkaWZmZXJlbnQgaG9zdHMgaW4gZGlmZmVyZW50IHNpdHVhdGlvbnMgSSdsbCBhZGQgaXQgaW4gZGlzYWJsZWQgc3RhdGUuCgpZYW5nIFRzZSAoMyBPY3RvYmVyIDIwMDcpCi0gRml4ZWQgaXNzdWUgcmVsYXRlZCB3aXRoIHRoZSB1c2Ugb2YgYXJlc190aW1lb3V0KCkgcmVzdWx0LgoKRGFuaWVsIFMgKDMgT2N0b2JlciAyMDA3KQotIEFsZXhleSBQZXN0ZXJuaWtvdiBpbnRyb2R1Y2VkIENVUkxPUFRfT1BFTlNPQ0tFVEZVTkNUSU9OIGFuZAogIENVUkxPUFRfT1BFTlNPQ0tFVERBVEEgdG8gc2V0IGEgY2FsbGJhY2sgdGhhdCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8KICByZXBsYWNlIHRoZSBzb2NrZXQoKSBjYWxsIHVzZWQgYnkgbGliY3VybC4gSXQgYmFzaWNhbGx5IGFsbG93cyB0aGUgYXBwIHRvCiAgY2hhbmdlIGFkZHJlc3MsIHByb3RvY29sIG9yIHdoYXRldmVyIG9mIHRoZSBzb2NrZXQuCgotIEkgcmVuYW1lZCB0aGUgQ1VSTEVfU1NMX1BFRVJfQ0VSVElGSUNBVEUgZXJyb3IgY29kZSB0bwogIENVUkxFX1BFRVJfRkFJTEVEX1ZFUklGSUNBVElPTiAoc3RhbmRhcmQgQ1VSTF9OT19PTERJRVMgc3R5bGUpLCBhbmQgbWFkZQogIHRoaXMgcmV0dXJuIGNvZGUgZ2V0IHVzZWQgYnkgdGhlIHByZXZpb3VzIFNTSCBNRDUgZmluZ2VycHJpbnQgY2hlY2sgaW4gY2FzZQogIGl0IGZhaWxzLgoKLSBCYXNlZCBvbiBhIHBhdGNoIGJyb3VnaHQgYnkgSm9obm55IEx1b25nLCBsaWJjdXJsIG5vdyBvZmZlcnMKICBDVVJMT1BUX1NTSF9IT1NUX1BVQkxJQ19LRVlfTUQ1IGFuZCB0aGUgY3VybCB0b29sIC0taG9zdHB1Ym1kNS4gVGhleSBib3RoCiAgbWFrZSB0aGUgU0NQIG9yIFNGVFAgY29ubmVjdGlvbiB2ZXJpZnkgdGhlIHJlbW90ZSBob3N0J3MgbWQ1IGNoZWNrc3VtIG9mIHRoZQogIHB1YmxpYyBrZXkgYmVmb3JlIGRvaW5nIGEgY29ubmVjdCwgdG8gcmVkdWNlIHRoZSByaXNrIG9mIGEgbWFuLWluLXRoZS1taWRkbGUKICBhdHRhY2suCgpEYW5pZWwgUyAoMiBPY3RvYmVyIDIwMDcpCi0gbGliY3VybCBub3cgaGFuZGxlcyBjaHVua2VkLWVuY29kZWQgQ09OTkVDVCByZXNwb25zZXMKCkRhbmllbCBTICgxIE9jdG9iZXIgMjAwNykKLSBBbGV4IEZpc2htYW4gcmVwb3J0ZWQgYSBjdXJsX2Vhc3lfZXNjYXBlKCkgcHJvYmxlbSB0aGF0IHdhcyBtYWRlIHRoZQogIGZ1bmN0aW9uIGRvIHdyb25nIG9uIGFsbCBpbnB1dCBieXRlcyB0aGF0IGFyZSA+PSAweDgwIChkZWNpbWFsIDEyOCkgZHVlIHRvIGEKICBzaWduZWQgLyB1bnNpZ25lZCBtaXN0YWtlIGluIHRoZSBjb2RlLiBJIGZpeGVkIGl0IGFuZCBhZGRlZCB0ZXN0IGNhc2UgNTQzIHRvCiAgdmVyaWZ5LgoKRGFuaWVsIFMgKDI5IFNlcHRlbWJlciAyMDA3KQotIEltbWFudWVsIEdyZWdvaXJlIGZpeGVkIGEgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQgdHJhbnNmZXJzIG92ZXIgU0ZUUC4KCkRhbmllbCBTICgyOCBTZXB0ZW1iZXIgMjAwNykKLSBBZGFwdGVkIHRoZSBjLWFyZXMgY29kZSB0byB0aGUgQVBJIGNoYW5nZSBjLWFyZXMgMS41LjAgYnJpbmdzIGluIHRoZQogIG5vdGlmaWVyIGNhbGxiYWNrKHMpLgoKRGFuIEYgKDI2IFNlcHRlbWJlciAyMDA3KQotIEVuYWJsZWQgYSBmZXcgbW9yZSBnY2Mgd2FybmluZ3Mgd2l0aCAtLWVuYWJsZS1kZWJ1Zy4gIFJlbmFtZWQgYSBmZXcKICB2YXJpYWJsZXMgdG8gYXZvaWQgc2hhZG93aW5nIGdsb2JhbCBkZWNsYXJhdGlvbnMuCgpEYW5pZWwgUyAoMjYgU2VwdGVtYmVyIDIwMDcpCi0gUGhpbGlwIExhbmdkYWxlIHByb3ZpZGVkIHRoZSBuZXcgQ1VSTE9QVF9QT1NUMzAxIG9wdGlvbiBmb3IKICBjdXJsX2Vhc3lfc2V0b3B0KCkgdGhhdCBhbHRlcnMgaG93IGxpYmN1cmwgZnVuY3Rpb25zIHdoZW4gZm9sbG93aW5nCiAgcmVkaXJlY3RzLiBJdCBtYWtlcyBsaWJjdXJsIG9iZXkgdGhlIFJGQzI2MTYgd2hlbiBhIDMwMSByZXNwb25zZSBpcyByZWNlaXZlZAogIGFmdGVyIGEgbm9uLUdFVCByZXF1ZXN0IGlzIG1hZGUuIERlZmF1bHQgbGliY3VybCBiZWhhdmlvdXIgaXMgdG8gY2hhbmdlCiAgbWV0aG9kIHRvIEdFVCBpbiB0aGUgc3Vic2VxdWVudCByZXF1ZXN0IChsaWtlIGl0IGRvZXMgZm9yIHJlc3BvbnNlIGNvZGUgMzAyCiAgLSBiZWNhdXNlIHRoYXQncyB3aGF0IG1hbnkvbW9zdCBicm93c2VycyBkbyksIGJ1dCB3aXRoIHRoaXMgQ1VSTE9QVF9QT1NUMzAxCiAgb3B0aW9uIGVuYWJsZWQgaXQgd2lsbCBkbyB3aGF0IHRoZSBzcGVjIHNheXMgYW5kIGRvIHRoZSBuZXh0IHJlcXVlc3QgdXNpbmcKICB0aGUgc2FtZSBtZXRob2QgYWdhaW4uIEkuZSBrZWVwIFBPU1QgYWZ0ZXIgMzAxLiAKCiAgVGhlIGN1cmwgdG9vbCBnb3QgdGhpcyBvcHRpb24gYXMgLS1wb3N0MzAxCgogIFRlc3QgY2FzZSAxMDExIGFuZCAxMDEyIHdlcmUgYWRkZWQgdG8gdmVyaWZ5LgoKLSBNYXggS2F0c2V2IHJlcG9ydGVkIHRoYXQgd2hlbiBkb2luZyBhIGxpYmN1cmwgRlRQIHJlcXVlc3Qgd2l0aAogIENVUkxPUFRfTk9CT0RZIGVuYWJsZWQgYnV0IG5vdCBDVVJMT1BUX0hFQURFUiwgbGliY3VybCB3b3VsZG4ndCBkbyBUWVBFCiAgYmVmb3JlIGl0IGRvZXMgU0laRSB3aGljaCBtYWtlcyBpdCBsZXNzIHVzZWZ1bC4gSSB3YWxrZWQgb3ZlciB0aGUgY29kZSBhbmQKICBtYWRlIGl0IGRvIHRoaXMgcHJvcGVybHksIGFuZCBhZGRlZCB0ZXN0IGNhc2UgNTQyIHRvIHZlcmlmeSBpdC4KCkRhbmllbCBTICgyNCBTZXB0ZW1iZXIgMjAwNykKLSBJbW1hbnVlbCBHcmVnb2lyZSBmaXhlZCBLTk9XTl9CVUdTICM0NDogLS1mdHAtbWV0aG9kIG5vY3dkIGRpZCBub3QgaGFuZGxlCiAgVVJMcyBlbmRpbmcgd2l0aCBhIHNsYXNoIHByb3Blcmx5IChpdCBzaG91bGQgbGlzdCB0aGUgY29udGVudHMgb2YgdGhhdAogIGRpcmVjdG9yeSkuIFRlc3QgY2FzZSAzNTEgYnJvdWdodCBiYWNrIGFuZCBhbHNvIHRlc3QgMTAxMCB3YXMgYWRkZWQuCgpEYW5pZWwgUyAoMjEgU2VwdGVtYmVyIDIwMDcpCi0gTWFyayBEYXZpZXMgZml4ZWQgTmVnb3RpYXRlIGF1dGhlbnRpY2F0aW9uIG92ZXIgcHJveHksIGFuZCBhbHNvIGludHJvZHVjZWQKICB0aGUgLS1wcm94eS1uZWdvdGlhdGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0byBhbGxvdyBhIHVzZXIgdG8gZXhwbGljaXRseQogIHNlbGVjdCBpdC4KCkRhbmllbCBTICgxOSBTZXB0ZW1iZXIgMjAwNykKLSBSb2IgQ3JpdHRlbmRlbiBwcm92aWRlZCBhbiBOU1MgdXBkYXRlIHdpdGggdGhlIGZvbGxvd2luZyBoaWdobGlnaHRzOgoKICBvIEl0IGxvb2tzIGZvciB0aGUgTlNTIGRhdGFiYXNlIGZpcnN0IGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBTU0xfRElSLAogICAgdGhlbiBpbiAvZXRjL3BraS9uc3NkYiwgdGhlbiBpdCBpbml0aWFsaXplcyB3aXRoIG5vIGRhdGFiYXNlIGlmIG5laXRoZXIgb2YKICAgIHRob3NlIGV4aXN0LgoKICBvIElmIHRoZSBOU1MgUEtDUyMxMSBsaWJuc3BzZW0uc28gZHJpdmVyIGlzIGF2YWlsYWJsZSB0aGVuIFBFTSBmaWxlcyBtYXkgYmUKICAgIGxvYWRlZCwgaW5jbHVkaW5nIHRoZSBjYS1idW5kbGUuIElmIGl0IGlzIG5vdCBhdmFpbGFibGUgdGhlbiBvbmx5CiAgICBjZXJ0aWZpY2F0ZXMgYWxyZWFkeSBpbiB0aGUgTlNTIGRhdGFiYXNlIGFyZSB1c2VkLgoKICBvIFRyaWVzIHRvIGRldGVjdCB3aGV0aGVyIGEgZmlsZSBvciBuaWNrbmFtZSBpcyBiZWluZyBwYXNzZWQgaW4gc28gdGhlIHJpZ2h0CiAgICB0aGluZyBpcyBkb25lCgogIG8gQWRkZWQgYSBiaXQgb2YgY29kZSB0byBtYWtlIHRoZSBvdXRwdXQgbW9yZSBsaWtlIHRoZSBPcGVuU1NMIG1vZHVsZSwKICAgIGluY2x1ZGluZyBkaXNwbGF5aW5nIHRoZSBjZXJ0aWZpY2F0ZSBpbmZvcm1hdGlvbiB3aGVuIGNvbm5lY3RpbmcgaW4KICAgIHZlcmJvc2UgbW9kZQoKICBvIEltcHJvdmVkIGhhbmRsaW5nIG9mIGNlcnRpZmljYXRlIGVycm9ycyAoZXhwaXJlZCwgdW50cnVzdGVkLCBldGMpCgogIFRoZSBsaWJuc3NwZW0uc28gUEtDUyMxMSBtb2R1bGUgaXMgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGluIEZlZG9yYQogIDgvcmF3aGlkZS4gV29yayB3aWxsIGJlIGRvbmUgc29vbiB0byB1cHN0cmVhbSBpdC4gVGhlIE5TUyBtb2R1bGUgd2lsbCB3b3JrCiAgd2l0aCBvciB3aXRob3V0IGl0LCBhbGwgdGhhdCBjaGFuZ2VzIGlzIHRoZSBzb3VyY2Ugb2YgdGhlIGNlcnRpZmljYXRlcyBhbmQKICBrZXlzLgoKRGFuaWVsIFMgKDE4IFNlcHRlbWJlciAyMDA3KQotIEltbWFudWVsIEdyZWdvaXJlIHBvaW50ZWQgb3V0IHRoYXQgcHVibGljIGtleSBTU0ggYXV0aCBmYWlsZWQgaWYgbm8KICBwdWJsaWMvcHJpdmF0ZSBrZXkgd2FzIHNwZWNpZmllZCBhbmQgdGhlcmUgd2FzIG5vIEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUsCiAgYW5kIHRoZW4gaXQgZGlkbid0IGNvbnRpbnVlIHRvIHRyeSB0aGUgb3RoZXIgYXV0aCBtZXRob2RzLiBOb3cgaXQgd2lsbAogIGluc3RlYWQgdHJ5IHRvIGdldCB0aGUgZmlsZXMgaWRfZHNhLnB1YiBhbmQgaWRfZHNhIGZyb20gdGhlIGN1cnJlbnQKICBkaXJlY3RvcnkgaWYgbm9uZSBvZiB0aGUgdHdvIGNvbmRpdGlvbnMgd2VyZSBtZXQuCgpEYW4gRiAoMTcgU2VwdGVtYmVyIDIwMDcpCi0gQWRkZWQgaG9va3MgdG8gdGhlIHRlc3Qgc3VpdGUgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB0ZXN0IGEgY3VybCBydW5uaW5nCiAgb24gYSByZW1vdGUgaG9zdC4KCi0gQ2hhbmdlZCBzb21lIEZUUCB0ZXN0cyB0byB2YWxpZGF0ZSB0aGUgZm9ybWF0IG9mIHRoZSBQT1JUIGFuZCBFUFJUIGNvbW1hbmRzCiAgc2VudCBieSBjdXJsLCBpZiBub3QgdGhlIGFkZHJlc3NlcyB0aGVtc2VsdmVzLgoKRGFuaWVsIFMgKDE1IFNlcHRlbWJlciAyMDA3KQotIE1pY2hhbCBNYXJlayBtYWRlIGxpYmN1cmwgYXV0b21hdGljYWxseSBhcHBlbmQgIjt0eXBlPTxhfGk+IiB3aGVuIHVzaW5nIEhUVFAKICBwcm94aWVzIGZvciBGVFAgdXJscy4KCi0gR/xudGVyIEtuYXVmIGZpeGVkIExEQVAgYnVpbGRzIGluIHRoZSBXaW5kb3dzIG1ha2VmaWxlcyBhbmQgZml4ZWQgTERBUHYzCiAgc3VwcG9ydCBvbiBXaW5kb3dzLgoKRGFuIEYgKDEzIFNlcHRlbWJlciAyMDA3KQotIEFkZGVkIExEQVBTLCBTQ1AgYW5kIFNGVFAgdG8gY3VybC1jb25maWcgLS1wcm90b2NvbHMuIFJlbW92ZWQgYW5kCiAgZml4ZWQgc29tZSBBQ19TVUJTVCBjb25maWd1cmUgZW50cmllcy4KClZlcnNpb24gNy4xNy4wICgxMyBTZXB0ZW1iZXIgMjAwNykKCkRhbmllbCBTICgxMiBTZXB0ZW1iZXIgMjAwNykKLSBCdWcgcmVwb3J0ICMxNzkyNjQ5IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzkyNjQ5KSBwb2ludGVkCiAgb3V0IGEgcHJvYmxlbSB3aXRoIGRvaW5nIGFuIGVtcHR5IHVwbG9hZCBvdmVyIEZUUCBvbiBhIHJlLXVzZWQgY29ubmVjdGlvbi4KICBJIGFkZGVkIHRlc3QgY2FzZSA1NDEgdG8gcmVwcm9kdWNlIGl0IGFuZCB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gSSBub3RpY2VkIHdoaWxlIHdyaXRpbmcgdGVzdCA1NDEgdGhhdCB0aGUgRlRQIGNvZGUgd3JvbmdseSBkaWQgYSBDV0Qgb24gdGhlCiAgc2Vjb25kIHRyYW5zZmVyIGFzIGl0IGRpZG4ndCBzdG9yZSBhbmQgcmVtZW1iZXIgdGhlICIiIHBhdGggZnJvbSB0aGUKICBwcmV2aW91cyB0cmFuc2ZlciBzbyBpdCB3b3VsZCBpbnN0ZWFkIENXRCB0byB0aGUgZW50cnkgcGF0aCBhcyBzdG9yZWQuIFRoaXMKICB3b3JrZWQsIGJ1dCBkaWQgYSBzdXBlcmZsdW91cyBjb21tYW5kLiBUaHVzLCB0ZXN0IGNhc2UgNTQxIG5vdyBhbHNvIHZlcmlmaWVzCiAgdGhpcyBmaXguCgpEYW4gRiAoNSBTZXB0ZW1iZXIgMjAwNykKLSBBZGRlZCB0ZXN0IGNhc2UgMTAwNyB0byB0ZXN0IHBlcm1pc3Npb24gcHJvYmxlbSB3aGVuIHVwbG9hZGluZyB3aXRoIFRGVFAKICAodG8gdmFsaWRhdGUgYnVnICMxNzkwNDAzKS4KCi0gVEZUUCBub3cgcmVwb3J0cyB0aGUgIm5vdCBkZWZpbmVkIiBURlRQIGVycm9yIGNvZGUgMCBhcyBhbiBlcnJvciwKICBub3Qgc3VjY2Vzcy4KCkRhbmllbCBTICg1IFNlcHRlbWJlciAyMDA3KQotIENvbnRpbnVlZCB0aGUgd29yayBvbiBhIGZpeCBmb3IgIzE3NzkwNTQKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3OTA1NCkuIE15IHByZXZpb3VzIGZpeCBmcm9tIEF1Z3VzdAogIDI0IHdhcyBub3QgY29tcGxldGUgKGVpdGhlcikgYnV0IGNvdWxkIGFjY2lkZW50YWxseSAiZm9yZ2V0IiBwYXJ0cyBvZiBhCiAgc2VydmVyIHJlc3BvbnNlIHdoaWNoIGxlZCB0byBmYXVsdHkgc2VydmVyIHJlc3BvbnNlIHRpbWUtb3V0IGVycm9ycy4KCkRhbiBGICg1IFNlcHRlbWJlciAyMDA3KQotIE1pbml4IGRvZXNuJ3Qgc3VwcG9ydCBnZXRzb2Nrb3B0IG9uIFVEUCBzb2NrZXRzIG9yIHNlbmQvcmVjdiBvbiBUQ1AKICBzb2NrZXRzLgoKRGFuIEYgKDMxIEF1Z3VzdCAyMDA3KQotIE1hZGUgc29tZSBvZiB0aGUgZXJyb3Igc3RyaW5ncyByZXR1cm5lZCBieSB0aGUgKnN0cmVycm9yIGZ1bmN0aW9ucyBtb3JlCiAgZ2VuZXJpYywgYW5kIG1vcmUgY29uc2lzdGVudCB3aXRoIGVhY2ggb3RoZXIuCgotIFJlbmFtZWQgdGhlIGN1cmxfZnRwc3NsIGVudW0gdG8gY3VybF91c2Vzc2wgYW5kIGl0cyBlbnVtZXJhdGVkIGNvbnN0YW50cywKICBjcmVhdGluZyBtYWNyb3MgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CgogICAgQ1VSTEZUUFNTTF9OT05FID0+IENVUkxVU0VTU0xfTk9ORQogICAgQ1VSTEZUUFNTTF9UUlkgPT4gQ1VSTFVTRVNTTF9UUlkKICAgIENVUkxGVFBTU0xfQ09OVFJPTCA9PiBDVVJMVVNFU1NMX0NPTlRST0wKICAgIENVUkxGVFBTU0xfQUxMID0+IENVUkxVU0VTU0xfQUxMCiAgICBDVVJMRlRQU1NMX0xBU1QgPT4gQ1VSTFVTRVNTTF9MQVNUCgpEYW4gRiAoMzAgQXVndXN0IDIwMDcpCi0gUmVuYW1lZCBzZXZlcmFsIGxpYmN1cmwgZXJyb3IgY29kZXMgYW5kIG9wdGlvbnMgdG8gbWFrZSB0aGVtIG1vcmUgZ2VuZXJhbAogIGFuZCBhbGxvdyByZXVzZSBieSBtdWx0aXBsZSBwcm90b2NvbHMuIFNldmVyYWwgdW51c2VkIGVycm9yIGNvZGVzIHdlcmUKICByZW1vdmVkLiAgSW4gYWxsIGNhc2VzLCBtYWNyb3Mgd2VyZSBhZGRlZCB0byBwcmVzZXJ2ZSBzb3VyY2UgKGFuZCBiaW5hcnkpCiAgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQgbmFtZXMuICBUaGVzZSBtYWNyb3MgYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCBhdAogIGEgZnV0dXJlIGRhdGUsIGJ1dCBwcm9iYWJseSBub3QgYmVmb3JlIDIwMDkuICBBbiBhcHBsaWNhdGlvbiBjYW4gYmUKICB0ZXN0ZWQgdG8gc2VlIGlmIGl0IGlzIHVzaW5nIGFueSBvYnNvbGV0ZSBjb2RlIGJ5IGNvbXBpbGluZyBpdCB3aXRoIHRoZQogIENVUkxfTk9fT0xESUVTIG1hY3JvIGRlZmluZWQuCgogIFRoZSBmb2xsb3dpbmcgdW51c2VkIGVycm9yIGNvZGVzIHdlcmUgcmVtb3ZlZDoKCiAgICBDVVJMRV9CQURfQ0FMTElOR19PUkRFUgogICAgQ1VSTEVfQkFEX1BBU1NXT1JEX0VOVEVSRUQKICAgIENVUkxFX0ZUUF9DQU5UX1JFQ09OTkVDVAogICAgQ1VSTEVfRlRQX0NPVUxETlRfR0VUX1NJWkUKICAgIENVUkxFX0ZUUF9DT1VMRE5UX1NFVF9BU0NJSQogICAgQ1VSTEVfRlRQX1VTRVJfUEFTU1dPUkRfSU5DT1JSRUNUCiAgICBDVVJMRV9GVFBfV0VJUkRfVVNFUl9SRVBMWQogICAgQ1VSTEVfRlRQX1dSSVRFX0VSUk9SCiAgICBDVVJMRV9MSUJSQVJZX05PVF9GT1VORAogICAgQ1VSTEVfTUFMRk9STUFUX1VTRVIKICAgIENVUkxFX09CU09MRVRFCiAgICBDVVJMRV9TSEFSRV9JTl9VU0UKICAgIENVUkxFX1VSTF9NQUxGT1JNQVRfVVNFUgoKICBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIHdlcmUgcmVuYW1lZDoKCiAgICBDVVJMRV9GVFBfQUNDRVNTX0RFTklFRCA9PiAgICAgIENVUkxFX1JFTU9URV9BQ0NFU1NfREVOSUVECiAgICBDVVJMRV9GVFBfQ09VTEROVF9TRVRfQklOQVJZID0+IENVUkxFX0ZUUF9DT1VMRE5UX1NFVF9UWVBFCiAgICBDVVJMRV9GVFBfU1NMX0ZBSUxFRCA9PiAgICAgICAgIENVUkxFX1VTRV9TU0xfRkFJTEVECiAgICBDVVJMRV9GVFBfUVVPVEVfRVJST1IgPT4gICAgICAgIENVUkxFX1FVT1RFX0VSUk9SCiAgICBDVVJMRV9URlRQX0RJU0tGVUxMID0+ICAgICAgICAgIENVUkxFX1JFTU9URV9ESVNLX0ZVTEwKICAgIENVUkxFX1RGVFBfRVhJU1RTID0+ICAgICAgICAgICAgQ1VSTEVfUkVNT1RFX0ZJTEVfRVhJU1RTCiAgICBDVVJMRV9IVFRQX1JBTkdFX0VSUk9SID0+ICAgICAgIENVUkxFX1JBTkdFX0VSUk9SIAoKICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgd2VyZSByZW5hbWVkOgoKICAgIENVUkxPUFRfU1NMS0VZUEFTU1dEID0+IENVUkxPUFRfS0VZUEFTU1dEIAogICAgQ1VSTE9QVF9GVFBBUFBFTkQgPT4gICAgQ1VSTE9QVF9BUFBFTkQKICAgIENVUkxPUFRfRlRQTElTVE9OTFkgPT4gIENVUkxPUFRfRElSTElTVE9OTFkKICAgIENVUkxPUFRfRlRQX1NTTCA9PiAgICAgIENVUkxPUFRfVVNFX1NTTAoKICBBIGZldyBtb3JlIGNoYW5nZXMgd2lsbCB0YWtlIHBsYWNlIHdpdGggdGhlIG5leHQgU09OQU1FIGJ1bXAgb2YgdGhlCiAgbGlicmFyeS4gIFRoZXNlIGFyZSBkb2N1bWVudGVkIGluIGRvY3MvVE9ETwoKLSBEb2N1bWVudGVkIHNvbWUgbmV3ZXIgZXJyb3IgY29kZXMgaW4gbGliY3VybC1lcnJvcigzKQoKLSBBZGRlZCBtb3JlIGFjY3VyYXRlIGVycm9yIGNvZGUgcmV0dXJucyBmcm9tIFNGVFAgb3BlcmF0aW9ucy4gIEFkZGVkIHRlc3QKICBjYXNlIDYxNSB0byB0ZXN0IGFuIFNGVFAgdXBsb2FkIGZhaWx1cmUuCgpEYW4gRiAoMjggQXVndXN0IDIwMDcpCi0gU29tZSBtaW5vciBpbnRlcm5hbCB0eXBlIGFuZCBjb25zdCBjaGFuZ2VzIGJhc2VkIG9uIGEgc3BsaW50IHNjYW4uCgpEYW5pZWwgUyAoMjQgQXVndXN0IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTc3OTA1NCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3OTA1NCkgcG9pbnRlZAogIG91dCB0aGF0IGxpYmN1cmwgZGlkbid0IGRlYWwgd2l0aCBsYXJnZSByZXNwb25zZXMgZnJvbSBzZXJ2ZXIgY29tbWFuZHMsIHdoZW4KICB0aGUgc2luZ2xlIHJlc3BvbnNlIHdhcyBjb25zaXN0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGJ1dCBvZiBhIHRvdGFsIHNpemUgb2YKICAxNktCIG9yIG1vcmUuIERhbiBGYW5kcmljaCBpbXByb3ZlZCB0aGUgZnRwIHRlc3Qgc2NyaXB0IGFuZCBwcm92aWRlZCB0ZXN0CiAgY2FzZSAxMDA2IHRvIHJlcGVhdCB0aGUgcHJvYmxlbSwgYW5kIEkgZml4ZWQgdGhlIGNvZGUgdG8gbWFrZSBzdXJlIHRoaXMgbmV3CiAgdGVzdCBjYXNlIHJ1bnMgZmluZS4KClBhdHJpY2sgTSAoMjMgQXVndXN0IDIwMDcpCi0gT1MvNDAwIHBvcnQ6IG5ldyBmaWxlcyBsaWIvY29uZmlnLW9zNDAwLmggbGliL3NldHVwLW9zNDAwLmggcGFja2FnZXMvT1M0MDAvKi4KICBTZWUgcGFja2FnZXMvT1M0MDAvUkVBRE1FLk9TNDAwLgoKRGFuaWVsIFMgKDIzIEF1Z3VzdCAyMDA3KQotIEJ1ZyByZXBvcnQgIzE3Nzk3NTEgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3Nzk3NTEpIHBvaW50ZWQKICBvdXQgdGhhdCBkb2luZyBmaXJzdCBhIGZpbGU6Ly8gdXBsb2FkIGFuZCB0aGVuIGFuIEZUUCB1cGxvYWQgY3Jhc2hlZCBsaWJjdXJsCiAgb3IgYXQgYmVzdCBjYXVzZWQgZnVyaW91cyB2YWxncmluZCBjb21wbGFpbnRzLiBGaXhlZCBub3chCgpEYW5pZWwgUyAoMjIgQXVndXN0IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTc3OTA1NCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3OTA1NCkgcG9pbnRlZAogIG91dCB0aGF0IGxpYmN1cmwgZGlkbid0IGRlYWwgd2l0aCB2ZXJ5IGxvbmcgKD4xNkspIEZUUCBzZXJ2ZXIgcmVzcG9uc2UgbGluZXMKICBwcm9wZXJseS4gU3RhcnRpbmcgbm93LCBsaWJjdXJsIHdpbGwgY2hvcCB0aGVtIG9mZiAodGh1cyB0aGUgY2xpZW50IGFwcCB3aWxsCiAgbm90IGdldCB0aGUgZnVsbCBsaW5lKSBidXQgc3Vydml2ZSBhbmQgZGVhbCB3aXRoIHRoZW0gZmluZSBvdGhlcndpc2UuIFRlc3QKICBjYXNlIDEwMDMgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsIFMgKDIwIEF1Z3VzdCAyMDA3KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgQ2hyaXN0aWFuIFZvZ3QsIHRoZSBGVFAgY29kZSBub3cgc2V0cyB0aGUgdXBjb21pbmcKICBkb3dubG9hZCB0cmFuc2ZlciBzaXplIG11Y2ggZWFybGllciB0byBiZSBwb3NzaWJsZSB0byBnZXQgcmVhZCB3aXRoCiAgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgYXMgc29vbiBhcyBwb3NzaWJsZS4gVGhpcyBpcyB2ZXJ5IG11Y2ggaW4gYQogIHNpbWlsYXIgc3Bpcml0IHRvIHRoZSBIVFRQIHNpemUgY2hhbmdlIGZyb20gQXVndXN0IDExIDIwMDcuCgpEYW5pZWwgUyAoMTggQXVndXN0IDIwMDcpCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaWxlZCBidWcgcmVwb3J0ICMxNzc2MjMyCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NzYyMzIpIGFib3V0IGxpYmN1cmwgY2FsbGluZwogIEN1cmxfY2xpZW50X3dyaXRlKCksIHBhc3Npbmcgb24gYSBjb25zdCBzdHJpbmcgdGhhdCB0aGUgY2FsbGVyIG1heSBub3QKICBtb2RpZnkgYW5kIHlldCBpdCBkb2VzIChvbiBzb21lIHBsYXRmb3JtcykuCgotIFJvYnNvbiBCcmFnYSBBcmF1am8gZmlsZWQgYnVnIHJlcG9ydCAjMTc3NjIzNQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc2MjM1KSBhYm91dCBmdHAgcmVxdWVzdHMgd2l0aCBOT0JPRFkKICBvbiBhIGRpcmVjdG9yeSB3b3VsZCBkbyBhICJTSVpFIChudWxsKSIgcmVxdWVzdC4gVGhpcyBpcyBub3cgZml4ZWQgYW5kIHRlc3QKICBjYXNlIDEwMDAgd2FzIGFkZGVkIHRvIHZlcmlmeS4KCkRhbmllbCBTICgxNyBBdWd1c3QgMjAwNykKLSBTb25nIE1hIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBjdXJlcyBhIHByb2JsZW0gbGliY3VybCBoYXMgd2hlbiBkb2luZyByZXN1bWUKICBIVFRQIFBVVCB1c2luZyBEaWdlc3QgYXV0aGVudGljYXRpb24uIFRlc3QgY2FzZSA1MzIwIGFuZCA1MzIyIHdlcmUgYWxzbwogIGFkZGVkIHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCkRhbmllbCBTICgxNCBBdWd1c3QgMjAwNykKLSBBbmRyZXcgV2Fuc2luayBwcm92aWRlZCBhbiBOVExNIGJ1Z2ZpeDogaW4gdGhlIGNhc2UgdGhlIHNlcnZlciBzZXRzIHRoZSBmbGFnCiAgTlRMTUZMQUdfTkVHT1RJQVRFX1VOSUNPREUsIHdlIG5lZWQgdG8gZmlsdGVyIGl0IG9mZiBiZWNhdXNlIGxpYmN1cmwgZG9lc24ndAogIFVOSUNPREUgZW5jb2RlIHRoZSBzdHJpbmdzIGl0IHBhY2tzIGludG8gdGhlIE5UTE0gYXV0aGVudGljYXRlIHBhY2tldC4KCkRhbmllbCBTICgxMSBBdWd1c3QgMjAwNykKLSBBbGxlbiBQdWxzaWZlciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgbGliY3VybCBzZXQgdGhlIGV4cGVjdGVkIGRvd25sb2FkCiAgc2l6ZSBlYXJsaWVyIHdoZW4gZG9pbmcgSFRUUCBkb3dubG9hZHMsIHNvIHRoYXQgYXBwbGljYXRpb25zIGFuZCB0aGUKICBwcm9ncmVzcyBtZXRlciBldGMga25vdyBnZXQgdGhlIGluZm8gZWFybGllciBpbiB0aGUgZmxvdyB0aGFuIGJlZm9yZS4KCi0gUGF0cmljayBNb25uZXJhdCBtb2RpZmllZCB0aGUgTERBUCBjb2RlIGFuZCBhcHByb2FjaCBpbiBjdXJsLiBTdGFydGluZyBub3csCiAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2hlY2tzIGZvciBvcGVubGRhcCBhbmQgZnJpZW5kcyBhbmQgd2UgbGluayB3aXRoIHRob3NlCiAgbGlicyBqdXN0IGxpa2Ugd2UgbGluayBhbGwgb3RoZXIgdGhpcmQgcGFydHkgbGlicmFyaWVzLCBhbmQgd2Ugbm8gbG9uZ2VyCiAgZGxvcGVuKCkgdGhvc2UgbGlicmFyaWVzLiBPdXIgcHJpdmF0ZSBoZWFkZXIgZmlsZSBsaWIvbGRhcC5oIHdhcyByZW5hbWVkIHRvCiAgbGliL2N1cmxfbGRhcC5oIGR1ZSB0byB0aGlzLiBJIHNldCBhIHRhZyBpbiBDVlMgKGN1cmwtN18xN18wLXByZWxkYXBmaXgpCiAganVzdCBiZWZvcmUgdGhpcyBjb21taXQsIGp1c3QgaW4gY2FzZS4KCkRhbiBGICg4IEF1Z3VzdCAyMDA3KQotIFNvbmcgTWEgbm90ZWQgYSB6bGliIG1lbW9yeSBsZWFrIGluIHRoZSBpbGxlZ2FsIGNvbXByZXNzZWQgaGVhZGVyCiAgY291bnRlcm1lYXN1cmVzIGNvZGUgcGF0aC4KCkRhbmllbCBTICg0IEF1Z3VzdCAyMDA3KQotIFBhdHJpY2sgTW9ubmVyYXQgZml4ZWQgY3VybF9lYXN5X2VzY2FwZSgpIGFuZCBjdXJseF9zdHJ0b2xsKCkgdG8gd29yayBvbgogIG5vbi1BU0NJSSBzeXN0ZW1zLgoKRGFuaWVsIFMgKDMgQXVndXN0IDIwMDcpCi0gSSBjdXQgb3V0IHN1cHBvcnQgZm9yIGxpYnNzaDIgdmVyc2lvbnMgb2xkZXIgdGhhbiAwLjE2IHRvIG1ha2Ugb3VyIGNvZGUgYQogIGxvdCBzaW1wbGVyLCBhbmQgdG8gYXZvaWQgZ2V0dGluZyB0cm91YmxlIHdpdGggdGhlIExJQlNTSDJfQVBJTk8gZGVmaW5lCiAgdGhhdCAxKSBkaWRuJ3Qgd29yayBwcm9wZXJseSBzaW5jZSBpdCB3YXMgPjMyIGJpdHMgYW5kIDIpIGlzIHJlbW92ZWQgaW4KICBsaWJzc2gyIDAuMTYuLi4KCkRhbmllbCBTICgyIEF1Z3VzdCAyMDA3KQotIFNjb3R0IENhbnRvciBmaWxlZCBidWcgcmVwb3J0ICMxNzY2MzIwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NjYzMjApIHBvaW50aW5nIG91dCB0aGF0IHRoZSBsaWJjdXJsCiAgY29kZSBhY2Nlc3NlZCB0d28gY3VybF9lYXN5X3NldG9wdCgpIG9wdGlvbnMgKENVUkxPUFRfRE5TX0NBQ0hFX1RJTUVPVVQgYW5kCiAgQ1VSTE9QVF9ETlNfVVNFX0dMT0JBTF9DQUNIRSkgYXMgaW50cyBldmVuIHRob3VnaCB0aGV5J3JlIGRvY3VtZW50ZWQgdG8gYmUKICBwYXNzZWQgaW4gYXMgbG9uZ3MsIGFuZCB0aGF0IG1ha2VzIGEgZGlmZmVyZW5jZSBvbiA2NCBiaXQgYXJjaGl0ZWN0dXJlcy4KCi0gRG1pdHJpeSBTZXJnZXlldiByZXBvcnRlZCBhIHJlZ3Jlc3Npb246IHJlc3VtZWQgZmlsZTovLyB0cmFuc2ZlcnMgYnJva2UKICBhZnRlciA3LjE2LjIuIFRoaXMgaXMgbXVjaCBkdWUgdG8gdGhlIGRpZmZlcmVudCB0cmVhdG1lbnQgZmlsZTovLyBnZXRzCiAgaW50ZXJuYWxseSwgYnV0IG5vdyBJIGFkZGVkIHRlc3QgMjMxIHRvIG1ha2UgaXQgbGVzcyBsaWtlbHkgdG8gaGFwcGVuIGFnYWluCiAgd2l0aG91dCB1cyBub3RpY2luZyEKCkRhbmllbCBTICgxIEF1Z3VzdCAyMDA3KQotIFBhdHJpY2sgTW9ubmVyYXQgYW5kIEkgbW9kaWZpZWQgbGliY3VybCBzbyB0aGF0IG5vdyBpdCAqY29waWVzKiBhbGwgc3RyaW5ncwogIHBhc3NlZCB0byBpdCB3aXRoIGN1cmxfZWFzeV9zZXRvcHQoKSEgUHJldmlvdXNseSBpdCBoYXMgYWx3YXlzIGp1c3QgcmVmZXJlZAogIHRvIHRoZSBkYXRhLCBmb3JjaW5nIHRoZSB1c2VyIHRvIGtlZXAgdGhlIGRhdGEgYXJvdW5kIHVudGlsIGxpYmN1cmwgaXMgZG9uZQogIHdpdGggaXQuIFRoYXQgaXMgbm93IGhpc3RvcnkgYW5kIGxpYmN1cmwgd2lsbCBpbnN0ZWFkIGNsb25lIHRoZSBnaXZlbgogIHN0cmluZ3MgYW5kIGtlZXAgcHJpdmF0ZSBjb3BpZXMuIFRoaXMgaXMgYWxzbyBwYXJ0IG9mIFBhdHJpY2sgTW9ubmVyYXQncwogIE9TLzQwMCBwb3J0LgoKICBEdWUgdG8gdGhpcyBiZWluZyBhIHNvbWV3aGF0IGludGVyZXN0aW5nIGNoYW5nZSBBUEkgd2lzZSwgSSd2ZSBkZWNpZGVkIHRvCiAgYnVtcCB0aGUgdmVyc2lvbiBvZiB0aGUgdXBjb21pbmcgcmVsZWFzZSB0byA3LjE3LjAuIE9sZGVyIGFwcGxpY2F0aW9ucyB3aWxsCiAgb2YgY291cnNlIG5vdCBub3RpY2UgdGhpcyBjaGFuZ2Ugbm9yIGRvIHRoZXkgaGF2ZSB0byBjYXJlLCBidXQgbmV3CiAgYXBwbGljYXRpb25zIGNhbiBiZSB3cml0dGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMuCgotIEdyZWcgTW9yc2UgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggUE9TVGluZyB1c2luZyBBTllBVVRIIHRvIGEgc2VydmVyCiAgcmVxdWlyaW5nIE5UTE0sIGFuZCBoZSBwcm92aWRlZCB0ZXN0IGNvZGUgYW5kIGEgdGVzdCBzZXJ2ZXIgYW5kIHdlIHdvcmtlZAogIG91dCBhIGJ1ZyBmaXguIFdlIGZhaWxlZCB0byBjb3VudCBzZW50IGJvZHkgZGF0YSBhdCB0aW1lcywgd2hpY2ggdGhlbiBjYXVzZWQKICBpbnRlcm5hbCBjb25mdXNpb25zIHdoZW4gbGliY3VybCB0cmllZCB0byBzZW5kIHRoZSByZXN0IG9mIHRoZSBkYXRhIGluIG9yZGVyCiAgdG8gbWFpbnRhaW4gdGhlIHNhbWUgY29ubmVjdGlvbiBhbGl2ZS4KCkRhbmllbCBTICgzMSBKdWx5IDIwMDcpCi0gUGV0ZXIgTydHb3JtYW4gcG9pbnRlZCBvdXQgKGFuZCBmaXhlZCkgdGhhdCB0aGUgbm9uLWJsb2NraW5nIGNoZWNrIGluCiAgY29uZmlndXJlIG1hZGUgbGliY3VybCB1c2UgYmxvY2tpbmcgc29ja2V0cyBvbiBBSVggNCBhbmQgNSwgd2hpbGUgdGhhdAogIHdhc24ndCB0aGUgaW50ZW50aW9uLgoKRGFuaWVsIFMgKDI5IEp1bHkgMjAwNykKLSBKYXllc2ggQSBTaGFoIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NTk1NDIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc1OTU0MikgaWRlbnRpZnlpbmcgYSByYXRoZXIgc2VyaW91cwogIHByb2JsZW0gd2l0aCBGVFBTOiBsaWJjdXJsIGNsb3NlZCB0aGUgZGF0YSBjb25uZWN0aW9uIHNvY2tldCBhbmQgdGhlbiBsYXRlcgogIGluIHRoZSBmbG93IGl0IHdvdWxkIGNhbGwgdGhlIFNTTCBsYXllciB0byBkbyBTU0wgc2h1dGRvd24gd2hpY2ggdGhlbiB3b3VsZAogIHVzZSBhIHNvY2tldCB0aGF0IGhhZCBhbHJlYWR5IGJlZW4gY2xvc2VkIC0gc28gaWYgdGhlIGFwcGxpY2F0aW9uIGhhZCBvcGVuZWQKICBhIG5ldyBvbmUgaW4gdGhlIG1lYW4gdGltZSwgbGliY3VybCBjb3VsZCBzZW5kIGdpYmJlcmlzaCB0aGF0IHdheSEgSSB3b3JrZWQKICB3aXRoIEdyZWcgWmF2ZXJ0bmlrIHRvIHByb3Blcmx5IGRpYWdub3NlIGFuZCBmaXggdGhpcy4gVGhlIGZpeCBhZmZlY3RzIGNvZGUKICBmb3IgYWxsIFNTTCBsaWJyYXJpZXMgd2Ugc3VwcG9ydCwgYnV0IGl0IGhhcyBvbmx5IGJlZW4gdHJ1bHkgdmVyaWZpZWQgdG8KICB3b3JrIGZpbmUgZm9yIHRoZSBPcGVuU1NMIHZlcnNpb24uIFRoZSBvdGhlcnMgaGF2ZSBvbmx5IGJlZW4gY29kZSByZXZpZXdlZC4KCkRhbmllbCBTICgyMyBKdWx5IDIwMDcpCi0gSW1wbGVtZW50ZWQgdGhlIHBhcnRzIG9mIFBhdHJpY2sgTW9ubmVyYXQncyBPUy80MDAgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzCiAgc3VwcG9ydCBmb3IgdGhlIE9TLzQwMCBTZWN1cmUgU29ja2V0cyBMYXllciBsaWJyYXJ5LgoKRGFuIEYgKDIzIEp1bHkgMjAwNykKLSBJbXBsZW1lbnRlZCBvbmx5IHRoZSBwYXJ0cyBvZiBQYXRyaWNrIE1vbm5lcmF0J3MgT1MvNDAwIHBhdGNoIHRoYXQgcmVuYW1lZAogIHNvbWUgZmV3IGludGVybmFsIGlkZW50aWZpZXJzIHRvIGF2b2lkIGNvbmZsaWN0cywgd2hpY2ggY291bGQgYmUgdXNlZnVsIG9uCiAgb3RoZXIgcGxhdGZvcm1zLgoKRGFuaWVsIFMgKDIyIEp1bHkgMjAwNykKLSBIVFRQIERpZ2VzdCBidWcgZml4IGJ5IENocmlzIEZsZXJhY2tlcnM6CgogIFNjZW5hcmlvCgogIC0gUGVyZm9taW5nIGEgUE9TVCByZXF1ZXN0IHdpdGggYm9keQogIC0gV2l0aCBhdXRoZW50aWNhdGlvbiAob25seSBEaWdlc3QpCiAgLSBSZS11c2luZyBhIGNvbm5lY3Rpb24KCiAgbGliY3VybCB3b3VsZCBzZW5kIGEgSFRUUCBQT1NUIHdpdGggYW4gQXV0aG9yaXphdGlvbiBoZWFkZXIgYnV0IHdpdGhvdXQKICBib2R5LiBPdXIgc2VydmVyIHdvdWxkIHJldHVybiA0MDAgQmFkIFJlcXVlc3QgaW4gdGhhdCBjYXNlIChiZWNhdXNlCiAgYXV0aGVudGljYXRpb24gcGFzc2VkLCBidXQgdGhlIGJvZHkgd2FzIGVtcHR5KS4KCiAgQ2F1c2UKCiAgMSkgaHR0cF9kaWdlc3QuYyAtPiBDdXJsX291dHB1dF9kaWdlc3QKICAtIFVwZGF0ZXMgYWxsb2NwdHIudXNlcnB3ZC9hbGxvY3B0ci5wcm94eXVzZXJwd2QgKm9ubHkqIGlmIGQtPm5vbmNlIGlzCiAgZmlsbGVkIGluIChhbmQgbm8gZXJyb3JzKQogIC0gYXV0aHAtPmRvbmUgPSBUUlVFIGlmIGQtPm5vbmNlIGlzIGZpbGxlZCBpbgogIDIpIGh0dHAuYyAtPiBDdXJsX2h0dHAKICAtICpBbHdheXMqIHVzZXMgYWxsb2NwdHIudXNlcnB3ZC9hbGxvY3B0ci5wcm94eXVzZXJwd2QgaWYgbm90IE5VTEwKICAzKSBodHRwLmMgLT4gQ3VybF9odHRwLCBDdXJsX2h0dHBfb3V0cHV0X2F1dGgKCiAgU28gd2hhdCBoYXBwZW5zIGlzIHRoYXQgQ3VybF9vdXRwdXRfZGlnZXN0IGNhbm5vdCB5ZXQgdXBkYXRlIHRoZQogIEF1dGhvcml6YXRpb24gaGVhZGVyIChhbGxvY3B0ci51c2VycHdkKSB3aGljaCByZXN1bHRzIGluIGF1dGhob3N0LT5kb25lPTAgLT4KICBhdXRoaG9zdC0+bXVsdGk9MSAtPiBjb25uLT5iaXRzLmF1dGhuZWcgPSBUUlVFLiAgVGhlIGJvZHkgaXMgbm90CiAgYWRkZWQuICpIb3dldmVyKiwgYWxsb2NwdHIudXNlcnB3ZCBpcyBzdGlsbCB1c2VkIHdoZW4gYnVpbGRpbmcgdGhlIHJlcXVlc3QKCi0gQWRkZWQgdGVzdCBjYXNlIDM1NCB0aGF0IG1ha2VzIGEgc2ltcGxlIEZUUCByZXRyaWV2YWwgd2l0aG91dCBwYXNzd29yZCwgd2hpY2gKICB2ZXJpZmllcyB0aGUgYnVnIGZpeCBpbiAjMTc1NzMyOC4KCkRhbmllbCBTICgyMSBKdWx5IDIwMDcpCi0gVG8gYWxsb3cgbW9yZSBmbGV4aWJpbGl0eSBpbiBGVFAgdGVzdCBjYXNlcywgSSd2ZSByZW1vdmVkIHRoZSBlbmZvcmNlZCBzdGF0ZXMKICBmcm9tIHRoZSB0ZXN0IHNlcnZlciBjb2RlIGFzIHRoZXkgc2VydmVkIG5vIHJlYWwgcHVycG9zZS4gVGhlIHRlc3Qgc2VydmVyCiAgaXMgaGVyZSB0byBzZXJ2ZSBmb3IgdGhlIHRlc3QgY2FzZXMsIG5vdCB0byBhdHRlbXB0IHRvIGZ1bmN0aW9uIGFzIGEgcmVhbAogIHNlcnZlciEgV2hpbGUgYXQgaXQsIEkgbW9kaWZpZWQgdGVzdCBjYXNlIDE0MSB0byBiZXR0ZXIgdGVzdCBhbmQgdmVyaWZ5CiAgY3VybCAtSSBvbiBhIHNpbmdsZSBGVFAgZmlsZS4KCkRhbmllbCBTICgyMCBKdWx5IDIwMDcpCi0gSmFtZXMgSG91c2xleSBmaXhlZCB0aGUgU0ZUUCBQV0QgY29tbWFuZCB0byB3b3JrLgoKLSBSYWxmIFMuIEVuZ2Vsc2NoYWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NTczMjgKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc1NzMyOCkgYW5kIHN1Ym1pdHRlZCBhIHBhdGNoLiBJdAogIHR1cm5zIG91dCB3ZSBicm9rZSBsb2dpbiB0byBGVFAgc2VydmVycyB0aGF0IGRvbid0IHJlcXVpcmUgKG5vciB1bmRlcnN0YW5kKQogIFBBU1MgYWZ0ZXIgdGhlIFVTRVIgY29tbWFuZC4gVGhlIGJyZWFrYWdlIHdhcyBkb25lIGFzIHBhcnQgb2YgdGhlIGtyYjUKICBjb21taXQgc28gYSBrcmItdXNpbmcgcGVyc29uIG5lZWRzIHRvIHZlcmlmeSB0aGF0IHRoZSBjdXJyZW50IHZlcnNpb24gbm93CiAgd29ya3Mgb3IgaWYgd2UgbmVlZCB0byBmaXggaXQgKGluIGEgZGlmZmVyZW50IHdheSBvZiBjb3Vyc2UpLgoKRGFuIEYgKDE3IEp1bHkgMjAwNykKLSBGaXhlZCB0ZXN0IGNhc2VzIDYxMyBhbmQgNjE0IGJ5IGltcHJvdmluZyB0aGUgbG9nIHBvc3Rwcm9jZXNzb3IgdG8gaGFuZGxlCiAgYSBuZXcgZGlyZWN0b3J5IGxpc3RpbmcgZm9ybWF0IHRoYXQgbmV3ZXIgbGlic3NoMidzIGNhbiBwcm92aWRlLiAgVGhpcwogIGlzIHByb2JhYmx5IE5PVCBzdWZmaWNpZW50IHRvIGhhbmRsZSBhbGwgZGlyZWN0b3J5IGxpc3RpbmcgZm9ybWF0cyB0aGF0CiAgc2VydmVyJ3MgY2FuIHByb3ZpZGUsIGFuZCBzaG91bGQgYmUgcmV2aXNpdGVkLgoKRGFuaWVsIFMgKDE3IEp1bHkgMjAwNykKLSBEYW5pZWwgSm9obnNvbiBmaXhlZCBhIGJ1ZyBpbiBob3cgbGlic3NoMl9zZXNzaW9uX2xhc3RfZXJyb3IoKSB3YXMgdXNlZCwgaW4KICB0d28gcGxhY2VzLgoKLSBKb2ZlbGwgR2FsbGFyZG8gcG9zdGVkIGEgbGliY3VybCBsb2cgdXNpbmcgRlRQIHRoYXQgZXhwb3NlZCBhIGJ1ZyB3aGljaCBtYWRlCiAgYSBjb250cm9sIGNvbm5lY3Rpb24gdGhhdCB3YXMgZGVlbWVkICJkZWFkIiB0byB5ZXQgYmUgcmUtdXNlZCBpbiBhIGZvbGxvd2luZwogIHJlcXVlc3QuCgpEYW5pZWwgUyAoMTMgSnVseSAyMDA3KQotIENvbGluIEhvZ2JlbiBmaWxlZCBidWcgcmVwb3J0ICMxNzUwMjc0CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NTAyNzQpIGFuZCBzdWJtaXR0ZWQgYSBwYXRjaCBmb3IgdGhlCiAgY2FzZSB3aGVyZSBsaWJjdXJsIGRpZCBhIGNvbm5lY3QgYXR0ZW1wdCB0byBhIG5vbi1saXN0ZW5pbmcgcG9ydCBhbmQgZGlkbid0CiAgcHJvdmlkZSBhIGh1bWFuIHJlYWRhYmxlIGVycm9yIHN0cmluZyBiYWNrLgoKLSBEYW5pZWwgQ2F0ZXIgZml4ZXM6CiAgMSAtIG1hZGUgJ21ha2UgdmM4JyB3b3JrIG9uIHdpbmRvd3MuCiAgMiAtIG1hZGUgbGliY3VybCBpdHNlbGYgYnVpbHQgd2l0aCBDVVJMX05PX09MRElFUyBkZWZpbmVkICh3aGljaCBkb2Vzbid0CiAgICAgIGRlZmluZSB0aGUgc3ltYm9scyBmb3IgYmFja3dhcmRzIHNvdXJjZSBjb21wYXRpYmlsaXR5KQogIDMgLSB1cGRhdGVkIGxpYmN1cmwtZXJyb3JzLjMKICA0IC0gYWRkZWQgQ1VSTF9ESVNBQkxFX1RGVFAgdG8gZG9jcy9JTlNUQUxMCgpEYW5pZWwgUyAoMTIgSnVseSAyMDA3KQotIE1hZGUgdGhlIGtyYjUgY29kZSBidWlsZCB3aXRoIEhlaW1kYWwncyBHU1NBUEkgbGliLgoKRGFuIEYgKDEyIEp1bHkgMjAwNykKLSBDb21waWxlIG1vc3Qgb2YgdGhlIGV4YW1wbGUgYXBwcyBpbiBkb2NzL2V4YW1wbGVzIHdoZW4gZG9pbmcgYSAnbWFrZSBjaGVjaycuCiAgRml4ZWQgc29tZSBjb21waWxlIHdhcm5pbmdzIGFuZCBlcnJvcnMgaW4gdGhvc2UgZXhhbXBsZXMuCgotIFJlbW92ZWQgdGhlIGV4YW1wbGUgcHJvZ3JhbSBmdHAzcmRwYXJ0eS5jIHNpbmNlIGxpYmN1cmwgZG9lc24ndCBzdXBwb3J0CiAgM3JkIHBhcnR5IEZUUCB0cmFuc2ZlcnMgYW55IGxvbmdlci4KCkRhbmllbCBTICgxMiBKdWx5IDIwMDcpCi0gU2htdWxpayBSZWdldiBmb3VuZCBhbiAoYWxiZWl0IHJhcmUpIGNhc2Ugd2hlcmUgdGhlIHByb3h5IENPTk5FQ1Qgb3BlcmF0aW9uCiAgY291bGQgaW4gZmFjdCBnZXQgc3R1Y2sgaW4gYW4gZW5kbGVzcyBsb29wLgoKLSBNYWRlIENVUkxPUFRfU1NMX1ZFUklGWUhPU1Qgc2V0IHRvIDEgYWN0cyBhcyBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50YXRpb246CiAgZmFpbCB0byBjb25uZWN0IGlmIHRoZXJlIGlzIG5vIENvbW1vbiBOYW1lIGZpZWxkIGZvdW5kIGluIHRoZSByZW1vdGUgY2VydC4KICBXZSBzaG91bGQgZGVwcmVjYXRlIHRoZSBzdXBwb3J0IGZvciB0aGlzIHNldCB0byAxIGFueXdheSBzb29uLCBzaW5jZSB0aGUKICBmZWF0dXJlIGlzIHBvaW50bGVzcyBhbmQgbW9zdCBsaWtlbHkgbmV2ZXIgcmVhbGx5IHVzZWQgYnkgYW55b25lLgoKRGFuaWVsIFMgKDExIEp1bHkgMjAwNykKLSBTaG11bGlrIFJlZ2V2IGZpeGVkIGEgYnVnIHdpdGggdHJhbnNmZXItZW5jb2Rpbmcgc2tpcHBpbmcgZHVyaW5nIHRoZSA0MDcKICBlcnJvciBwYWdlcyBmb3IgcHJveHkgYXV0aGVudGljYXRpb24uCgotIEdpYW5jYXJsbyBGb3JtaWN1Y2NpYSByZXBvcnRlZCBhbmQgZml4ZWQgYSBwcm9ibGVtIHdpdGggYSBjbG9zZWQgY29ubmVjdGlvbgogIHRvIGEgcHJveHkgZHVyaW5nIENPTk5FQ1QgYXV0aCBuZWdvdGlhdGlvbi4KCkRhbiBGICgxMCBKdWx5IDIwMDcpCi0gRml4ZWQgYSBjdXJsIG1lbW9yeSBsZWFrIHJlcG9ydGVkIGJ5IFNvbmcgTWEgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24KICBvZiB0aGUgcGF0Y2ggaGUgc3VnZ2VzdGVkLiAgQWRkZWQgaGlzIHRlc3QgY2FzZSBhcyB0ZXN0Mjg5IHRvIHZlcmlmeS4KCi0gRm9yY2UgdGhlIHRpbWUgem9uZSB0byBHTVQgaW4gdGhlIGNvb2tpZSB0ZXN0cyBpbiBjYXNlIHRoZSB1c2VyIGlzCiAgdXNpbmcgb25lIG9mIHRoZSBzby1jYWxsZWQgJ3JpZ2h0JyB0aW1lIHpvbmVzIHRoYXQgdGFrZSBpbnRvIGFjY291bnQKICBsZWFwIHNlY29uZHMsIHdoaWNoIGNhdXNlcyB0aGUgdGVzdHMgdG8gZmFpbCAoYXMgcmVwb3J0ZWQgYnkKICBEYW5pZWwgQmxhY2sgaW4gYnVnIHJlcG9ydCAjMTc0NTk2NCkuCgpWZXJzaW9uIDcuMTYuNCAoMTAgSnVseSAyMDA3KQoKRGFuaWVsIFMgKDEwIEp1bHkgMjAwNykKLSBLZWVzIENvb2sgbm90aWZpZWQgdXMgYWJvdXQgYSBzZWN1cml0eSBmbGF3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9hZHZfMjAwNzA3MTAuaHRtbCkgaW4gd2hpY2ggbGliY3VybCBmYWlsZWQgdG8KICBwcm9wZXJseSByZWplY3Qgc29tZSBvdXRkYXRlZCBvciBub3QgeWV0IHZhbGlkIHNlcnZlciBjZXJ0aWZpY2F0ZXMgd2hlbgogIGJ1aWx0IHdpdGggR251VExTLiBLZWVzIGFsc28gcHJvdmlkZWQgdGhlIHBhdGNoLgoKSmFtZXMgSCAoNSBKdWx5IDIwMDcpCi0gR2F2cmllIFBoaWxpcHNvbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgd2lsbCB1c2UgYSBtb3JlIHNwZWNpZmljIGVycm9yCiAgbWVzc2FnZSBmb3IgYW4gc2NwOi8vIHVwbG9hZCBmYWlsdXJlLiAgSWYgbGlic3NoMiBoYXMgaGlzIG1hdGNoaW5nCiAgcGF0Y2gsIHRoZW4gdGhlIGVycm9yIG1lc3NhZ2UgcmV0dXJuIGJ5IHRoZSBzZXJ2ZXIgd2lsbCBiZSB1c2VkIGluc3RlYWQKICBvZiBhIG1vcmUgZ2VuZXJpYyBlcnJvci4KCkRhbmllbCBTICgxIEp1bHkgMjAwNykKLSBUaG9tYXMgSi4gTW9vcmUgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGludHJvZHVjZXMgS2VyYmVyb3M1IHN1cHBvcnQgaW4KICBsaWJjdXJsLiBUaGlzIGFsc28gbWFrZXMgdGhlIG9wdGlvbnMgY2hhbmdlIG5hbWUgdG8gLS1rcmIgKGZyb20gLS1rcmI0KSBhbmQKICBDVVJMT1BUX0tSQkxFVkVMIChmcm9tIENVUkxPUFRfS1JCNExFVkVMKSBidXQgdGhlIG9sZCBuYW1lcyBhcmUgc3RpbGwgCgotIFNvbmcgTWEgaGVscGVkIG1lIHZlcmlmeSBhbmQgZXh0ZW5kIGEgZml4IGZvciBkb2luZyBGVFAgb3ZlciBhIFNPQ0tTNC81CiAgcHJveHkuCgpEYW5pZWwgUyAoMjcgSnVuZSAyMDA3KQotIEphbWVzIEhvdXNsZXk6IEFkZCB0d28gbmV3IG9wdGlvbnMgZm9yIHRoZSBTRlRQL1NDUC9GSUxFIHByb3RvY29sczoKICBDVVJMT1BUX05FV19GSUxFX1BFUk1TIGFuZCBDVVJMT1BUX05FV19ESVJFQ1RPUllfUEVSTVMuIFRoZXNlIGNvbnRyb2wgdGhlCiAgcHJlbWlzc2lvbnMgZm9yIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBjcmVhdGVkIG9uIHRoZSByZW1vdGUKICBzZXJ2ZXIuIENVUkxPUFRfTkVXX0ZJTEVfUEVSTVMgZGVmYXVsdHMgdG8gMDY0NCBhbmQKICBDVVJMT1BUX05FV19ESVJFQ1RPUllfUEVSTVMgZGVmYXVsdHMgdG8gMDc1NQoKLSBJIGNvcnJlY3RlZCB0aGUgMTAtYXQtYS10aW1lLmMgZXhhbXBsZSBhbmQgYXBwbGllZCBhIHBhdGNoIGZvciBpdCBieSBKYW1lcwogIEJ1cnNhLgoKRGFuaWVsIFMgKDI2IEp1bmUgMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWxpIHJlLWFycmFuZ2VkIHRoZSBpbnRlcm5hbCBoYXNoIGNvZGUgdG8gd29yayB3aXRoIGEgY3VzdG9tCiAgaGFzaCBmdW5jdGlvbiBmb3IgZGlmZmVyZW50IGhhc2hlcywgYW5kIGFsc28gZXhwYW5kZWQgdGhlIGRlZmF1bHQgc2l6ZSBmb3IKICB0aGUgc29ja2V0IGhhc2ggdGFibGUgdXNlZCBpbiBtdWx0aSBoYW5kbGVzIHRvIGdyZWF0bHkgZW5oYW5jZSBzcGVlZCB3aGVuCiAgdmVyeSBtYW55IGNvbm5lY3Rpb25zIGFyZSBhZGRlZCBhbmQgdGhlIHNvY2tldCBBUEkgaXMgdXNlZC4KCi0gSmFtZXMgSG91c2xleSBtYWRlIHRoZSBDVVJMT1BUX0ZUUExJU1RPTkxZIG1vZGUgd29yayBmb3IgU0ZUUCBkaXJlY3RvcnkKICBsaXN0aW5ncyBhcyB3ZWxsCgpEYW5pZWwgUyAoMjUgSnVuZSAyMDA3KQotIEFkanVzdGVkIGhvdyBsaWJjdXJsIHRyZWF0cyBIVFRQIDEuMSByZXNwb25zZXMgd2l0aG91dCBjb250ZW50LWxlbnRoIG9yCiAgY2h1bmtlZCBlbmNvZGluZyAodGhhdCBhbHNvIGxhY2tzICJDb25uZWN0aW9uOiBjbG9zZSIpLiBJdCBub3cgc2ltcGx5CiAgYXNzdW1lcyB0aGF0IHRoZSBjb25uZWN0aW9uIFdJTEwgYmUgY2xvc2VkIHRvIHNpZ25hbCB0aGUgZW5kLCBhcyB0aGF0IGlzIGhvdwogIFJGQzI2MTYgc2VjdGlvbiA0LjQgcG9pbnQgIzUgc2F5cyB3ZSBzaG91bGQgYmVoYXZlLgogIApWZXJzaW9uIDcuMTYuMyAoMjUgSnVuZSAyMDA3KQoKRGFuaWVsIFMgKDIzIEp1bmUgMjAwNykKLSBBcyByZXBvcnRlZCBieSAiVHJvIiBpbiBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDctMDYvMDE2MS5odG1sIGFuZAogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0wNi8wMjM4Lmh0bWwsIGxpYmN1cmwgZGlkbid0IHByb3Blcmx5IGRvCiAgbm8tYm9keSByZXF1ZXN0cyBvbiBGVFAgZmlsZXMgb24gcmUtdXNlZCBjb25uZWN0aW9ucyBwcm9wZXJseSwgb3IgYXQgbGVhc3QKICBpdCBkaWRuJ3QgcHJvdmlkZSB0aGUgaW5mbyBiYWNrIGluIHRoZSBoZWFkZXIgY2FsbGJhY2sgcHJvcGVybHkgaW4gdGhlCiAgc3Vic2VxdWVudCByZXF1ZXN0cy4KCkRhbmllbCBTICgyMSBKdW5lIDIwMDcpCi0gR2Vycml0IEJydWNoaOR1c2VyIHBvaW50ZWQgb3V0IGEgd2FybmluZyB0aGF0IHRoZSBJbnRlbChSKSBUaHJlYWQgQ2hlY2tlcgogIHRvb2wgcmVwb3J0cyBhbmQgaXQgd2FzIGluZGVlZCBhIGxlZ2l0aW1hdGUgb25lIGFuZCBpdCBpcyBvbmUgZml4ZWQuIEl0IHdhcwogIGEgdXNlIG9mIGEgc2hhcmUgd2l0aG91dCBkb2luZyB0aGUgcHJvcGVyIGxvY2tpbmcgZmlyc3QuCiAgCkRhbmllbCBTICgyMCBKdW5lIDIwMDcpCi0gQWRhbSBQaWdnb3R0IGZpbGVkIGJ1ZyByZXBvcnQgIzE3NDAyNjMKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc0MDI2MykuIEFkYW0gZGlzY292ZXJlZCB0aGF0IHdoZW4KICBnZXR0aW5nIGEgbGFyZ2UgYW1vdW50IG9mIFVSTHMgd2l0aCBjdXJsLCB0aGV5IHdlcmUgZmV0Y2hlZCBzbG93ZXIgYW5kCiAgc2xvd2VyLi4uIHdoaWNoIHR1cm5lZCBvdXQgdG8gYmUgYmVjYXVzZSB0aGUgLS1saWJjdXJsIGRhdGEgY29sbGVjdGluZyB3aGljaAogIHdyb25nbHkgYWx3YXlzIHdhcyBlbmFibGVkLCBidXQgbm8gbG9uZ2VyIGlzLi4uCgpEYW5pZWwgUyAoMTggSnVuZSAyMDA3KQotIFJvYnNvbiBCcmFnYSBBcmF1am8gZmlsZWQgYnVnIHJlcG9ydCAjMTczOTEwMAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzM5MTAwKSB0aGF0IG1lbnRpb25lZCB0aGF0IGxpYmN1cmwKICBjb3VsZCBub3QgYWN0dWFsbHkgbGlzdCB0aGUgY29udGVudHMgb2YgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIGEgZ2l2ZW4gRlRQCiAgc2VydmVyIGlmIHRoZSBsb2dpbiBkaXJlY3RvcnkgaXNuJ3Qgcm9vdC4gSSBmaXhlZCB0aGUgcHJvYmxlbSBhbmQgYWRkZWQKICB0aHJlZSB0ZXN0IGNhc2VzIChvbmUgaXMgZGlzYWJsZWQgZm9yIG5vdyBzaW5jZSBJIGlkZW50aWZpZWQgS05PV05fQlVHUyAjNDQsCiAgd2UgY2Fubm90IHVzZSAtLWZ0cC1tZXRob2Qgbm9jd2QgYW5kIGxpc3QgZnRwIGRpcmVjdG9yaWVzKS4KCkRhbmllbCBTICgxNCBKdW5lIDIwMDcpCi0gU2htdWxpayBSZWdldjoKCiAgSSd2ZSBlbmNvdW50ZXJlZCAoYW5kIGhvcGVmdWxseSBmaXhlZCkgYSBwcm9ibGVtIGludm9sdmluZyBwcm94eSBDT05ORUNUCiAgcmVxdWVzdHMgYW5kIGVhc3kgaGFuZGxlcyBzdGF0ZSBtYW5hZ2VtZW50LiBUaGUgcHJvYmxlbSBpc24ndCBzaW1wbGUgdG8KICByZXByb2R1Y2Ugc2luY2UgaXQgZGVwZW5kcyBvbiBzb2NrZXQgc3RhdGUuIEl0IG9ubHkgbWFuaWZlc3RzIGl0c2VsZiB3aGVuCiAgd29ya2luZyB3aXRoIG5vbi1ibG9ja2luZyBzb2NrZXRzLgoKICBIZXJlIGlzIHRoZSBzY2VuYXJpbzoKCiAgMS4gaW4gbXVsdGlfcnVuc2luZ2xlIHRoZSBlYXN5IGhhbmRsZSBpcyBpbiB0aGUgQ1VSTE1fU1RBVEVfV0FJVENPTk5FQ1QgYW5kCiAgY2FsbHMgQ3VybF9wcm90b2NvbF9jb25uZWN0CgogIDIuIGluIEN1cmxfcHJveHlDT05ORUNULCBsaW5lIDEyNDcsIGlmIHRoZSBzb2NrZXQgaXNuJ3QgcmVhZHkgdGhlIGZ1bmN0aW9uCiAgcmV0dXJucyBhbmQgY29ubi0+Yml0cy50dW5uZWxfY29ubmVjdGluZyBpcyBUUlVFCgogIDMuIHdoZW4gdGhlIGNhbGwgdG8gQ3VybF9wcm90b2NvbF9jb25uZWN0IHJldHVybnMgdGhlIHByb3RvY29sX2Nvbm5lY3QgZmxhZwogIGlzIGZhbHNlIGFuZCB0aGUgZWFzeSBzdGF0ZSBpcyBjaGFuZ2VkIHRvIENVUkxNX1NUQVRFX1BST1RPQ09OTkVDVCB3aGljaAogIGlzbid0IGNvcnJlY3QgaWYgYSBwcm94eSBpcyB1c2VkLiAgUmF0aGVyIENVUkxNX1NUQVRFX1dBSVRQUk9YWUNPTk5FQ1QKICBzaG91bGQgYmUgdXNlZC4KCiAgSSBkaXNjb3ZlcmVkIHRoaXMgd2hpbGUgcGVyZm9ybWluZyBhbiBIVFRQUyByZXF1ZXN0IHRocm91Z2ggYSBwcm94eSAoc3F1aWQpCiAgb24gbXkgbG9jYWwgbmV0d29yay4gVGhlIHByb2JsZW0gY2F1c2VkIG9wZW5zc2wgdG8gZmFpbCBhcyBpdCByZWFkIHRoZSBwcm94eQogIHJlc3BvbnNlIHRvIHRoZSBDT05ORUNUIGNhbGwgKCdIVFRQLzEuMCBFc3RhYmxpc2hlZCcpIHJhdGhlciB0aGFuIHRoZSBTU0wKICBoYW5kc2hha2UgKHRoZSBleGFjdCBvcGVuc3NsIGVycm9yIHdhcyAnd3Jvbmcgc3NsIHZlcnNpb24nIGJ1dCB0aGlzIGlzbid0CiAgdmVyeSBpbXBvcnRhbnQpCgotIERhdmUgVmFzaWxldnNreSBmaWxlZCBidWcgcmVwb3J0ICMxNzM2ODc1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MzY4NzUpIGFsbW9zdCBzaW11bHRhbm91ZXNseSBhcyBEYW4KICBGYW5kcmljaCBtZW50aW9uZWQgYSByZWxhdGVkIGJ1aWxkIHByb2JsZW0gb24gdGhlIGxpYmN1cmwgbWFpbGluZyBsaXN0OgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0wNi8wMTMxLmh0bWwuIEJvdGggcHJvYmxlbXMgaGFkIHRoZSBzYW1lCiAgcmVhc29uOiB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIFBPTEwqIGRlZmluZXMgYW5kIHRoZSBwb2xsZmQgc3RydWN0IGluIHRoZQogIGxpYmN1cmwgY29kZSB3YXMgZGVwZW5kaW5nIG9uIEhBVkVfUE9MTCBpbnN0ZWFkIG9mIEhBVkVfU1lTX1BPTExfSC4KCkRhbmllbCBTICgxMyBKdW5lIDIwMDcpCi0gVG9tIFJlZ25lciBwcm92aWRlZCBhIHBhdGNoIGFuZCB3b3JrZWQgdG9nZXRoZXIgd2l0aCBKYW1lcyBIb3VzbGV5LCBzbyBub3cKICBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIHdvcmtzIGZvciBTRlRQIGNvbm5lY3Rpb25zIGFzIHdlbGwgYXMgRlRQCiAgb25lcy4KCi0gUmljaCBSYXVlbnphaG4gZmlsZWQgYnVnIHJlcG9ydCAjMTczMzExOQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzMzMTE5KSBhbmQgd2UgY29sbGFib3JhdGVkIG9uIHRoZQogIGZpeC4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgZm9yIDY0Yml0IEhQVVggYnVpbGRzLCBzZXZlcmFsIHNvY2tldC1yZWxhdGVkCiAgZnVuY3Rpb25zIHdvdWxkIHN0aWxsIGFzc3VtZSBpbnQgKDMyIGJpdCkgYXJndW1lbnRzIGFuZCBub3Qgc29ja2xlbl90ICg2NAogIGJpdCkgb25lcy4KCkRhbmllbCBTICgxMiBKdW5lIDIwMDcpCi0gSmFtZXMgSG91c2xleSBicm91Z2h0IGhpcyByZXZhbXBlZCBTU0ggY29kZSB0aGF0IGlzIHN0YXRlLW1hY2hpbmUgZHJpdmVuIHRvCiAgcmVhbGx5IHRha2UgYWR2YW50YWdlIG9mIHRoZSBub3cgdG90YWxseSBub24tYmxvY2tpbmcgbGlic3NoMiAoaW4gQ1ZTKS4KCkRhbiBGICg4IEp1bmUgMjAwNykKLSBJbmNvcnBvcmF0ZWQgRGFuaWVsIEJsYWNrJ3MgdGVzdDcwNiBhbmQgdGVzdDcwNyBTT0NLUyB0ZXN0IGNhc2VzLgoKLSBGaXhlZCBhIGZldyBwcm9ibGVtcyB3aGVuIHN0YXJ0aW5nIHRoZSBTT0NLUyBzZXJ2ZXIuCgotIFJldmVydGVkIHNvbWUgcmVjZW50IGNoYW5nZXMgdG8gcnVudGVzdHMucGwgdGhhdCB3ZXJlbid0IGNvbXBhdGlibGUgd2l0aAogIHBlcmwgNS4wLgoKLSBGaXhlZCB0aGUgdGVzdCBoYXJuZXNzIHNvIHRoYXQgaXQgYWN0dWFsbHkga2lsbHMgdGhlIHNzaCBiZWluZyB1c2VkIGFzCiAgdGhlIFNPQ0tTIHNlcnZlci4KCkRhbmllbCBTICg2IEp1bmUgMjAwNykKLSAtcy8tLXNpbGVudCBjYW4gbm93IGJlIHVzZWQgdG8gdG9nZ2xlIG9mZiB0aGUgc2lsZW5jZSBhZ2FpbiBpZiB1c2VkIGEgc2Vjb25kCiAgdGltZS4KCkRhbmllbCBTICg1IEp1bmUgMjAwNykKLSBBZGRlZCBEYW5pZWwgQmxhY2sncyB3b3JrIHRoYXQgYWRkcyB0aGUgZmlyc3QgZmV3IFNPQ0tTIHRlc3QgY2FzZXMuIEkgYWxzbwogIGZpeGVkIHR3byBtaW5vciBTT0NLUyBwcm9ibGVtcyB0byBtYWtlIHRoZSB0ZXN0IGNhc2VzIHJ1biBmaW5lLgoKRGFuaWVsIFMgKDMxIE1heSAyMDA3KQotIEZlbmcgVHUgbWFkZSAobGliKWN1cmwgc3VwcG9ydCAidXBsb2FkIiByZXN1bWluZyB3b3JrIGZvciBmaWxlOi8vIFVSTHMuCgpEYW5pZWwgUyAoMzAgTWF5IDIwMDcpCi0gSSBtb2RpZmllZCB0aGUgMTAtYXQtYS10aW1lLmMgZXhhbXBsZSB0byB0cmFuc2ZlciA1MDAgZG93bmxvYWRzIGluIHBhcmFsbGVsCiAgd2l0aCBhIGMtYXJlcyBlbmFibGVkIGJ1aWxkIG9ubHkgdG8gZmluZCB0aGF0IGl0IGNyYXNoZWQgbWlzZXJhYmx5LCBhbmQgdGhpcwogIHdhcyBkdWUgdG8gc29tZSBzZWxlY3QoKWlzbXMgbGVmdCBpbiB0aGUgY29kZS4gVGhpcyB3YXMgZHVlIHRvIEFQSQogIHJlc3RyaWN0aW9ucyBpbiBjLWFyZXMgMS4zLngsIGJ1dCB3aXRoIHRoZSB1cGNvbWluZyBjLWFyZXMgMS40LjAgdGhpcyBpcyBubwogIGxvbmdlciB0aGUgY2FzZSBzbyBub3cgbGliY3VybCBydW5zIG11Y2ggYmV0dGVyIHdpdGggYy1hcmVzIGFuZCB0aGUgbXVsdGkKICBpbnRlcmZhY2Ugd2l0aCA+IDEwMjQgZmlsZSBkZXNjcmlwdG9ycyBpbiB1c2UuCgogIEV4dHJhIG5vdGU6IHN0YXJ0aW5nIG5vdyB3ZSByZXF1aXJlIGMtYXJlcyAxLjQuMCBmb3IgYXN5bmNocm9ub3VzIG5hbWUKICByZXNvbHZlcy4KCi0gQWRkZWQgQ1VSTE1PUFRfTUFYQ09OTkVDVFMgd2hpY2ggaXMgYSBjdXJsX211bHRpX3NldG9wdCgpIG9wdGlvbiBmb3Igc2V0dGluZwogIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNvbm5lY3Rpb24gY2FjaGUgbWF4aW11bSBzaXplIG9mIHRoZSBtdWx0aSBoYW5kbGUuCgpEYW5pZWwgUyAoMjcgTWF5IDIwMDcpCi0gV2hlbiB3b3JraW5nIHdpdGggYSBwcm9ibGVtIFN0ZWZhbiBCZWNrZXIgaGFkLCBJIGZvdW5kIGFuIG9mZi1ieS1vbmUgYnVmZmVyCiAgb3ZlcndyaXRlIGluIEN1cmxfc2VsZWN0KCkuIFdoaWxlIGZpeGluZyBpdCwgSSBhbHNvIGltcHJvdmVkIGl0cyBwZXJmb3JtYW5jZQogIHNvbWV3aGF0IGJ5IGNoYW5naW5nIGNhbGxvYyB0byBtYWxsb2MgYW5kIGJyZWFraW5nIG91dCBvZiBhIGxvb3AgZWFybGllcgogICh3aGVuIHBvc3NpYmxlKS4KCkRhbmllbCBTICgyNSBNYXkgMjAwNykKLSBSb2IgQ3JpdHRlbmRlbiBmaXhlZCBidWcgIzE3MDU4MDIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcwNTgwMiksIHdoaWNoIHdhcyBmaWxlZCBieSBEYW5pZWwKICBCbGFjayBpZGVudGlmeWluZyBzZXZlcmFsIEZUUC1TU0wgdGVzdCBjYXNlcyBmYWlsIHdoZW4gd2UgYnVpbGQgbGliY3VybCB3aXRoCiAgTlNTIGZvciBUTFMvU1NMLiBMaXN0ZWQgYXMgIzQyIGluIEtOT1dOX0JVR1MuCgpEYW5pZWwgUyAoMjQgTWF5IDIwMDcpCi0gU29uZyBNYSBmaWxlZCBidWcgcmVwb3J0ICMxNzI0MDE2CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MjQwMTYpIG5vdGljaW5nIHRoYXQgZG93bmxvYWRpbmcKICBnbG9iLXJhbmdlcyBmb3IgVEZUUCB3YXMgYnJva2VuIGluIENWUy4gRml4ZWQgbm93LgogIAotICdteXR4JyBpbiBidWcgcmVwb3J0ICMxNzIzMTk0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzIzMTk0KQogIHBvaW50ZWQgb3V0IHRoYXQgdGhlIHdhcm5mKCkgZnVuY3Rpb24gaW4gdGhlIGN1cmwgdG9vbCBkaWRuJ3QgcHJvcGVybHkgZGVhbAogIHdpdGggdGhlIGNhc2VzIHdoZW4gZXhjZXNzaXZlbHkgbG9uZyB3b3JkcyB3ZXJlIHVzZWQgaW4gdGhlIHN0cmluZyB0byBjaG9wCiAgdXAuCgpEYW5pZWwgUyAoMjIgTWF5IDIwMDcpCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBmaXhlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBmdW5jdGlvbiB0aGF0IHZlcmlmaWVzIHRoZQogIHBlZXIncyBuYW1lIGluIHRoZSBTU0wgY2VydGlmaWNhdGUgd2hlbiBidWlsdCBmb3IgT3BlblNTTC4gVGhlIGxlYWsgaGFwcGVucwogIGZvciBsaWJjdXJscyB3aXRoIENVUkxfRE9FU19DT05WRVJTSU9OUyBlbmFibGVkIHRoYXQgZmFpbCB0byBjb252ZXJ0IHRoZSBDTgogIG5hbWUgZnJvbSBVVEY4LiBIZSBhbHNvIGZpeGVkIGEgbGVhayB3aGVuIFBLQ1MgIzEyIHBhcnNpbmcgZmFpbGVkLgoKRGFuaWVsIFMgKDE4IE1heSAyMDA3KQotIEZlbmcgVHUgcmVwb3J0ZWQgdGhhdCBjdXJsIC13IGRpZCB3cm9uZyBvbiBURlRQIHRyYW5zZmVycyBpbiBidWcgcmVwb3J0CiAgIzE3MTUzOTQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MTUzOTQpLCBhbmQgdGhlCiAgdHJhbnNmZXItcmVsYXRlZCBpbmZvICJ2YXJpYWJsZXMiIHdlcmUgaW5kZWVkIG92ZXJ3cml0dGVuIHdpdGggemVyb2VzCiAgd3JvbmdseSBhbmQgaGF2ZSBub3cgYmVlbiBhZGp1c3RlZC4gVGhlIHVwbG9hZCBzaXplIHN0aWxsIGlzbid0IGFjY3VyYXRlLgoKRGFuaWVsIFMgKDE3IE1heSAyMDA3KQotIEZlbmcgVHUgcG9pbnRlZCBvdXQgYSBkaXZpc2lvbiBieSB6ZXJvIGVycm9yIGluIHRoZSBURlRQIGNvbm5lY3QgdGltZW91dAogIGNvZGUgZm9yIHRpbWVvdXRzIGxlc3MgdGhhbiBmaXZlIHNlY29uZHMsIGFuZCBhbHNvIHByb3ZpZGVkIGEgZml4IGZvciBpdC4KICBCdWcgcmVwb3J0ICMxNzE1MzkyIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzE1MzkyKQoKRGFuIEYgKDE2IE1heSAyMDA3KQotIEFkZGVkIHN1cHBvcnQgZm9yIGNvbXBpbGluZyB1bmRlciBNaW5peCAzLjEuMyB1c2luZyBBQ0suCgpEYW4gRiAoMTQgTWF5IDIwMDcpCi0gQWRkZWQgU0ZUUCBkaXJlY3RvcnkgbGlzdGluZyB0ZXN0IGNhc2UgNjEzLgoKLSBBZGRlZCBzdXBwb3J0IGZvciBxdW90ZSBjb21tYW5kcyBiZWZvcmUgYSB0cmFuc2ZlciB1c2luZyBTRlRQIGFuZCB0ZXN0CiAgY2FzZSA2MTQuCgotIENoYW5nZWQgdGhlIHBvc3QtcXVvdGUgY29tbWFuZHMgdG8gb2NjdXIgYWZ0ZXIgdGhlIHRyYW5zZmVycmVkIGZpbGUgaXMKICBjbG9zZWQuCgotIEFsbG93IFNGVFAgcXVvdGUgY29tbWFuZHMgY2htb2QsIGNob3duLCBjaGdycCB0byBzZXQgYSB2YWx1ZSBvZiAwLgoKRGFuIEYgKDkgTWF5IDIwMDcpCi0gS3Jpc3RpYW4gR3Vuc3RvbmUgZml4ZWQgYSBwcm9ibGVtIHdoZXJlIG92ZXJ3cml0aW5nIGFuIHVwbG9hZGVkIGZpbGUgd2l0aAogIHNmdHAgZGlkbid0IHRydW5jYXRlIGl0IGZpcnN0LCB3aGljaCB3b3VsZCBjb3JydXB0IHRoZSBmaWxlIGlmIHRoZSBuZXcKICBmaWxlIHdhcyBzaG9ydGVyIHRoYW4gdGhlIG9sZC4KCkRhbiBGICg4IE1heSAyMDA3KQotIEFkZGVkIEZUUFMgdGVzdCBjYXNlcyA0MDYgYW5kIDQwNwoKRGFuaWVsIFMgKDggTWF5IDIwMDcpCi0gQ1VSTEVfRlRQX0NPVUxETlRfU1RPUl9GSUxFIGlzIG5vdyBrbm93biBhcyBDVVJMRV9VUExPQURfRkFJTEVELiBUaGlzIGlzCiAgYmVjYXVzZSBJIGp1c3QgbWFkZSBTQ1AgdXBsb2FkcyByZXR1cm4gdGhpcyB2YWx1ZSBpZiB0aGUgZmlsZSBzaXplIG9mCiAgdGhlIHVwbG9hZCBmaWxlIGlzbid0IGdpdmVuIHdpdGggQ1VSTE9QVF9JTkZJTEVTSVpFKi4gRG9jcyB1cGRhdGVkIHRvCiAgcmVmbGVjdCB0aGlzIG5ld3MsIGFuZCBhIGRlZmluZSBmb3IgdGhlIG9sZCBuYW1lIHdhcyBhZGRlZCB0byB0aGUgcHVibGljCiAgaGVhZGVyIGZpbGUuCgpEYW5pZWwgUyAoNyBNYXkgMjAwNykKLSBKYW1lcyBCdXJzYSBmaXhlZCBhIGJ1ZyBpbiB0aGUgbXVsdGkgaGFuZGxlIGNvZGUgdGhhdCBtYWRlIHRoZSBjb25uZWN0aW9uCiAgY2FjaGUgZ3JvdyBhIGJpdCB0b28gbXVjaCwgYmV5b25kIHRoZSBub3JtYWwgNCAqIGVhc3lfaGFuZGxlcy4KCkRhbmllbCBTICgyIE1heSAyMDA3KQotIEFuZGVycyBHdXN0YWZzc29uIHJlbWFya2VkIHRoYXQgcmVxdWlyaW5nIENVUkxPUFRfSFRUUF9WRVJTSU9OIHNldCB0byAxLjAKICB3aGVuIENVUkxPUFRfSFRUUDIwMEFMSUFTRVMgaXMgdXNlZCB0byBhdm9pZCB0aGUgcHJvYmxlbSBtZW50aW9uZWQgYmVsb3cgaXMKICBub3QgdmVyeSBuaWNlIGlmIHRoZSBjbGllbnQgd2FudHMgdG8gYmUgYWJsZSB0byB1c2UgX2VpdGhlcl8gYSBIVFRQIDEuMQogIHNlcnZlciBvciBvbmUgd2l0aGluIHRoZSBhbGlhc2VzIGxpc3QuLi4gc28gc3RhcnRpbmcgbm93LCBsaWJjdXJsIHdpbGwKICBzaW1wbHkgY29uc2lkZXIgMjAwLWFsaWFzIG1hdGNoZXMgdGhlIHRvIGJlIEhUVFAgMS4wIGNvbXBsaWFudC4KCi0gVG9iaWFzIFJ1bmRzdHL2bSByZXBvcnRlZCBhIHByb2JsZW0gdGhleSBleHBlcmllbmNlZCB3aXRoIHhtbXMyIGFuZCByZWNlbnQKICBsaWJjdXJscywgd2hpY2ggdHVybmVkIG91dCB0byBiZSB0aGUgMjUtbm92LTIwMDYgY2hhbmdlIHdoaWNoIHRyZWF0cyBIVFRQCiAgcmVzcG9uc2VzIHdpdGhvdXQgQ29udGVudC1MZW5ndGggb3IgY2h1bmtlZCBlbmNvZGluZyBhcyB3aXRob3V0IGJvZGllcy4gV2UKICBub3cgYWRkZWQgdGhlIGNvbmRpdGlvbmFsIHRoYXQgdGhlIGFib3ZlIG1lbnRpb25lZCByZXNwb25zZSBpcyBvbmx5IHdpdGhvdXQKICBib2R5IGlmIHRoZSByZXNwb25zZSBpcyBIVFRQIDEuMS4KCi0gSmVmZiBQb2hsbWV5ZXIgaW1wcm92ZWQgdGhlIGhpcGVyZmlmby5jIGV4YW1wbGUgdG8gdXNlIHRoZQogIENVUkxNT1BUX1RJTUVSRlVOQ1RJT04gY2FsbGJhY2sgb3B0aW9uLgoKLSBTZXQgdGhlIHRpbWVvdXQgZm9yIGVhc3kgaGFuZGxlcyB0byBleHBpcmUgcmVhbGx5IHNvb24gYWZ0ZXIgYWRkaXRpb24gb3IKICB3aGVuIENVUkxNX0NBTExfTVVMVElfUEVSRk9STSBpcyByZXR1cm5lZCBmcm9tIGN1cmxfbXVsdGlfc29ja2V0Ki9wZXJmb3JtLAogIHRvIG1ha2UgYXBwbGljYXRpb25zIHVzaW5nIG9ubHkgY3VybF9tdWx0aV9zb2NrZXQoKSB0byBwcm9wZXJseSBmdW5jdGlvbgogIHdoZW4gYWRkaW5nIGVhc3kgaGFuZGxlcyAib24gdGhlIGZseSIuIEJ1ZyByZXBvcnQgYW5kIHRlc3QgYXBwIHByb3ZpZGVkIGJ5CiAgTWljaGFlbCBXYWxsbmVyLgoKRGFuIEYgKDMwIEFwcmlsIDIwMDcpCi0gSW1wcm92ZWQgdGhlIHRlc3QgaGFybmVzcyB0byBhbGxvdyBydW5uaW5nIHRlc3Qgc2VydmVycyBvbiBvdGhlciB0aGFuCiAgdGhlIGRlZmF1bHQgcG9ydCBudW1iZXJzLCBhbGxvd2luZyBtb3JlIHRoYW4gb25lIHRlc3Qgc3VpdGUgdG8gcnVuCiAgc2ltdWx0YW5lb3VzbHkgb24gdGhlIHNhbWUgaG9zdC4KCkRhbmllbCBTICgyOCBBcHJpbCAyMDA3KQotIFBldGVyIE8nR29ybWFuIGZpeGVkIGxpYmN1cmwgdG8gbm90IGluaXQgR251VExTIGFzIGVhcmx5IGFzIHdlIGRpZCBiZWZvcmUsCiAgc2luY2UgaXQgdGhlbiBpbml0cyBsaWJnY3J5cHQgYW5kIGxpYmdjcnlwdCBpcyBiZWluZyBldmlsIGFuZCBFWElUUyB0aGUKICBhcHBsaWNhdGlvbiBpZiBpdCBmYWlscyB0byBnZXQgYSBmaW5lIHJhbmRvbSBzZWVkLiBUaGF0J3MgcmVhbGx5IG5vdCBhIG5pY2UKICB0aGluZyB0byBkbyBieSBhIGxpYnJhcnkuCgotIEZyYW5rIEhlbXBlbCBmaXhlZCBhIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSBjcmFzaCBvbiBhIGhhbmRsZSB0aGF0IGhhZAogIGJlZW4gcmVtb3ZlZCBmcm9tIGEgbXVsdGkgaGFuZGxlLCBhbmQgdGhlbiBmaXhlZCBhbm90aGVyIGZsYXcgdGhhdCBwcmV2ZW50ZWQKICBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgdG8gd29yayBldmVuIGFmdGVyIHRoZSBmaXJzdCBmaXggLSB0aGUgaGFuZGxlIHdhcwogIHN0aWxsIG1hcmtlZCBhcyB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLgoKRGFuaWVsIFMgKDI2IEFwcmlsIDIwMDcpCi0gUGV0ZXIgTydHb3JtYW4gZm91bmQgYSBwcm9ibGVtIHdpdGggU0NQIGRvd25sb2FkcyB3aGVuIHRoZSBkb3dubG9hZGVkIGZpbGUKICB3YXMgMTYzODUgYnl0ZXMgKDE2SysxKSBhbmQgaXQgdHVybmVkIG91dCB3ZSBkaWRuJ3QgcHJvcGVybHkgYWx3YXlzICJzdWNrCiAgb3V0IiBhbGwgZGF0YSBmcm9tIGxpYnNzaDIuIFRoZSBlZmZlY3QgYmVpbmcgdGhhdCBsaWJjdXJsIHdvdWxkIGhhbmcgb24gdGhlCiAgc29ja2V0IHdhaXRpbmcgZm9yIGRhdGEgd2hlbiBsaWJzc2gyIGhhZCBpbiBmYWN0IGFscmVhZHkgcmVhZCBpdCBhbGwuLi4KCkRhbiBGICgyNSBBcHJpbCAyMDA3KQotIEFkZGVkIHN1cHBvcnQgaW4gcnVudGVzdHMucGwgZm9yICIhbiIgdGVzdCBudW1iZXJzIHRvIGRpc2FibGUgaW5kaXZpZHVhbAogIHRlc3RzLiAgQ2hhbmdlZCAtdCB0byBvbmx5IGtlZXAgbG9nIGZpbGVzIGFyb3VuZCB3aGVuIC1rIGlzIHNwZWNpZmllZCwKICB0byBoYXZlIHRoZSBzYW1lIGJlaGF2aW91ciBhcyB3aXRob3V0IC10LgoKRGFuaWVsIFMgKDI1IEFwcmlsIDIwMDcpCi0gU29uaWEgU3VicmFtYW5pYW4gYnJvdWdodCBvdXIgYXR0ZW50aW9uIHRvIGEgcHJvYmxlbSB0aGF0IGhhcHBlbnMgaWYgeW91IHNldAogIHRoZSBDVVJMT1BUX1JFU1VNRV9GUk9NIG9yIENVUkxPUFRfUkFOR0Ugb3B0aW9ucyBhbmQgYW4gZXhpc3RpbmcgY29ubmVjdGlvbgogIGluIHRoZSBjb25uZWN0aW9uIGNhY2hlIGlzIGNsb3NlZCB0byBtYWtlIHJvb20gZm9yIHRoZSBuZXcgb25lIHdoZW4geW91IGNhbGwKICBjdXJsX2Vhc3lfcGVyZm9ybSgpLiBJdCB3b3VsZCB0aGVuIHdyb25nbHkgZnJlZSByYW5nZS1yZWxhdGVkIGRhdGEgaW4gdGhlCiAgY29ubmVjdGlvbiBjbG9zZSBmdW50aW9uLgoKWWFuZyBUc2UgKDI1IEFwcmlsIDIwMDcpCi0gU3RldmUgTGl0dGxlIGZpeGVkIGNvbXBpbGF0aW9uIG9uIFZNUyA2NC1iaXQgbW9kZQoKRGFuaWVsIFMgKDI0IEFwcmlsIDIwMDcpCi0gUm9iZXJ0IElha29iYXNodmlsaSBtYWRlIHRoZSAnbWFzdGVyX2J1ZmZlcicgZ2V0IGFsbG9jYXRlZCBmaXJzdCBvbmNlIGl0IGlzCiAgY2FuL3dpbGwgYmUgdXNlZCBhcyBpdCB0aGVuIG1ha2VzIHRoZSBjb21tb24gY2FzZXMgc2F2ZSAxNktCIG9mIGRhdGEgZm9yIGVhY2gKICBlYXN5IGhhbmRsZSB0aGF0IGlzbid0IHVzZWQgZm9yIHBpcGVsaW5pbmcuCgpEYW4gRiAoMjMgQXByaWwgMjAwNykKLSBBZGRlZCA8cG9zdGNoZWNrPiBzdXBwb3J0IHRvIHRoZSB0ZXN0IGhhcm5lc3MuCgotIEFkZGVkIHRlc3RzIDYxMC02MTIgdG8gdGVzdCBtb3JlIFNGVFAgcG9zdC1xdW90ZSBjb21tYW5kcy4KCkRhbmllbCBTICgyMiBBcHJpbCAyMDA3KQotIFNvbmcgTWEncyB3YXJuaW5nIGlmIC1yLy0tcmFuZ2UgaXMgZ2l2ZW4gd2l0aCBhICJiYWQiIHJhbmdlLCBhbHNvIG5vdGVkIGluCiAgdGhlIG1hbiBwYWdlIG5vdy4KCi0gRGFuaWVsIEJsYWNrIGZpbGVkIGJ1ZyAjMTcwNTE3NwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzA1MTc3KSB3aGVyZSAtLXdpdGhvdXQtc3NsCiAgLS13aXRoLWdudXRsIG91dHB1dHMgYSB3YXJuaW5nIGFib3V0IFNTTCBub3QgYmVpbmcgZW5hYmxlZCBldmVuIHRob3VnaCBHbnVUTFMKICB3YXMgZm91bmQgYW5kIHVzZWQuCgpEYW5pZWwgUyAoMjEgQXByaWwgMjAwNykKLSBEYW5pZWwgQmxhY2sgZmlsZWQgYnVnICMxNzA0Njc1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MDQ2NzUpIGlkZW50aWZ5aW5nIGEgZG91YmxlLWZyZWUKICBwcm9ibGVtIGluIHRoZSBTU0wtZGVhbGluZyBsYXllciwgdGVsbGluZyBHbnVUTFMgdG8gZnJlZSBOVUxMIGNyZWRlbnRpYWxzIG9uCiAgY2xvc2Vkb3duIGFmdGVyIGEgZmFpbHVyZSBhbmQgYSBiYWQgI2lmZGVmIGZvciBOU1Mgd2hlbiBjbG9zaW5nIGRvd24gU1NMLgoKWWFuZyBUc2UgKDIwIEFwcmlsIDIwMDcpCi0gU2F2ZSBvbmUgY2FsbCB0byBjdXJseF90dm5vdygpLCB3aGljaCBjYWxscyBnZXR0aW1lb2ZkYXkoKSwgaW4gZWFjaCBvZgogIEN1cmxfc29ja2V0X3JlYWR5KCksIEN1cmxfcG9sbCgpIGFuZCBDdXJsX3NlbGVjdCgpIHdoZW4gdGhlc2UgYXJlIGNhbGxlZAogIHdpdGggYSB6ZXJvIHRpbWVvdXQgb3IgYSB0aW1lb3V0IHZhbHVlIGluZGljYXRpbmcgYSBibG9ja2luZyBjYWxsIHNob3VsZAogIGJlIHBlcmZvcm1lZC4KCkRhbmllbCBTICgxOCBBcHJpbCAyMDA3KQotIEphbWVzIEhvdXNsZXkgbWFkZSBTRlRQIHVwbG9hZHMgdXNlIGxpYnNzaDIncyBub24tYmxvY2tpbmcgQVBJCgotIFByZXZlbnQgdGhlIGludGVybmFsIHByb2dyZXNzIG1ldGVyIGZyb20gdXBkYXRpbmcgbW9yZSBmcmVxdWVudGx5IHRoYW4gb25jZQogIHBlciBzZWNvbmQuCgpEYW4gRiAoMTcgQXByaWwgMjAwNykKLSBBZGRlZCB0ZXN0IGNhc2VzIDI5NiwgMjk3IGFuZCAyOTggdG8gdGVzdCAtLWZ0cC1tZXRob2QgaGFuZGxpbmcKCkRhbmllbCBTICgxNiBBcHJpbCAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbCBhZGRlZCBjdXJsX211bHRpX3NvY2tldF9hY3Rpb24oKSB0byBsaWJjdXJsLCB3aGljaCBpcyBhCiAgZnVuY3Rpb24gdGhhdCBkZXByZWNhdGVzIHRoZSBjdXJsX211bHRpX3NvY2tldCgpIGZ1bmN0aW9uLiBVc2luZyB0aGUgbmV3CiAgZnVuY3Rpb24gdGhlIGFwcGxpY2F0aW9uIHRlbGwgbGliY3VybCB3aGF0IGFjdGlvbiB0aGF0IHdhcyBmb3VuZCBpbiB0aGUKICBzb2NrZXQgdGhhdCBpdCBwYXNzZXMgaW4uIFRoaXMgZ2l2ZXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBib29zdCBhcyBpdAogIGFsbG93cyBsaWJjdXJsIHRvIGF2b2lkIGEgY2FsbCB0byBwb2xsKCkvc2VsZWN0KCkgZm9yIGV2ZXJ5IGNhbGwgdG8KICBjdXJsX211bHRpX3NvY2tldCooKS4KCiAgSSBhZGRlZCBhIGRlZmluZSBpbiB0aGUgcHVibGljIGN1cmwvbXVsdGkuaCBoZWFkZXIgZmlsZSB0aGF0IHdpbGwgbWFrZSB5b3VyCiAgZXhpc3RpbmcgYXBwbGljYXRpb24gYXV0b21hdGljYWxseSB1c2UgY3VybF9tdWx0aV9zb2NrZXRfYWN0aW9uKCkgaW5zdGVhZCBvZgogIGN1cmxfbXVsdGlfc29ja2V0KCkgd2hlbiB5b3UgcmVjb21waWxlLiBCdXQgb2YgY291cnNlIHlvdSdsbCBnZXQgYmV0dGVyCiAgcGVyZm9ybWFuY2UgaWYgeW91IGFkanVzdCB5b3VyIGNvZGUgbWFudWFsbHkgYW5kIGFjdHVhbGx5IHBhc3MgaW4gdGhlCiAgY29ycmVjdCBhY3Rpb24gYml0bWFzayB0byB0aGlzIGZ1bmN0aW9uLgoKRGFuaWVsIFMgKDE0IEFwcmlsIDIwMDcpCi0gSmF5IEF1c3RpbiBhZGRlZCAiREggUEFSQU1FVEVSUyIgdG8gdGhlIHN0dW5uZWwucGVtIGNlcnRpZmljYXRlIGZvciB0aGUgdGVzdAogIHN1aXRlIHRvIG1ha2Ugc3R1bm5lbCBydW4gYmV0dGVyIGluIHNvbWUgKG1vc3Q/KSBlbnZpcm9ubWVudHMuCgpEYW4gRiAoMTMgQXByaWwgMjAwNykKLSBBZGRlZCB0ZXN0IGNhc2VzIDI5NCBhbmQgMjk1IHRvIHRlc3QgLS1mdHAtYWNjb3VudCBoYW5kbGluZwoKLSBJbXByb3ZlZCBoYW5kbGluZyBvZiBvdXQgb2YgbWVtb3J5IGluIGZ0cC4KCllhbmcgVHNlICgxMyBBcHJpbCAyMDA3KQotIEZpeCB0ZXN0IGNhc2UgNTM0IHdoaWNoIHN0YXJ0ZWQgdG8gZmFpbCAyMDA3LTA0LTEzIGR1ZSB0byB0aGUgZXhpc3RhbmNlCiAgb2YgYSBuZXcgaG9zdCBvbiB0aGUgbmV0IHdpdGggdGhlIHNhbWUgc2lsbHkgZG9tYWluIHRoZSB0ZXN0IHdhcyB1c2luZwogIGZvciBhIGhvc3Qgd2hpY2ggd2FzIHN1cHBvc2VkIG5vdCB0byBleGlzdC4KCkRhbmllbCBTICgxMiBBcHJpbCAyMDA3KQotIFNvbmcgTWEgZm91bmQgYSBtZW1vcnkgbGVhayBpbiB0aGUgaWYyaXAgY29kZSBpZiB5b3UgcGFzcyBpbiBhbiBpbnRlcmZhY2UKICBuYW1lIGxvbmdlciB0aGFuIHRoZSBuYW1lIGZpZWxkIG9mIHRoZSBpZnJlcSBzdHJ1Y3QgKHR5cGljYWxseSA2IGJ5dGVzKSwgYXMKICB0aGVuIGl0IHdvdWxkbid0IGNsb3NlIHRoZSB1c2VkIGR1bW15IHNvY2tldC4gQnVnICMxNjk4OTc0CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2OTg5NzQpCgpWZXJzaW9uIDcuMTYuMiAoMTEgQXByaWwgMjAwNykKCllhbmcgVHNlICgxMCBBcHJpbCAyMDA3KQotIFJhdmkgUHJhdGFwIHByb3ZpZGVkIHNvbWUgZml4ZXMgZm9yIEhUVFAgcGlwZWxpbmluZwoKLSBjb25maWd1cmUgc2NyaXB0IHdpbGwgaWdub3JlIC0tZW5hYmxlLXNzcGkgb3B0aW9uIGZvciBub24tbmF0aXZlIFdpbmRvd3MuCgpEYW5pZWwgUyAoOSBBcHJpbCAyMDA3KQotIE5pY2sgWml0em1hbm4gZGlkIHNzaC5jIGNsZWFudXBzCgpEYW5pZWwgUyAoMyBBcHJpbCAyMDA3KQotIFJvYiBKb25lcyBmaXhlZCBiZXR0ZXIgI2lmZGVmJ2luZyBmb3IgYSBidW5jaCBvZiAjaW5jbHVkZSBsaW5lcy4KCkRhbmllbCBTICgyIEFwcmlsIDIwMDcpCi0gTmljayBaaXR6bWFubiBtYWRlIHRoZSBDVVJMT1BUX1BPU1RRVU9URSBvcHRpb24gd29yayBmb3IgU0ZUUCBhcyB3ZWxsLiBUaGUKICBhY2NlcHRlZCBjb21tYW5kcyBhcmUgYXMgZm9sbG93czoKCiAgY2hncnAgKGdpZCkgKHBhdGgpCiAgICBDaGFuZ2VzIHRoZSBncm91cCBJRCBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYXQgKHBhdGgpIHRvIChnaWQpLiAoZ2lkKQogICAgbXVzdCBiZSBhIG51bWJlci4KCiAgY2htb2QgKHBlcm1zKSAocGF0aCkKICAgIENoYW5nZXMgdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhdCAocGF0aCkgdG8KICAgIChwZXJtcykuIChwZXJtcykgbXVzdCBiZSBhIG51bWJlciBpbiB0aGUgZm9ybWF0IHVzZWQgYnkgdGhlIGNobW9kIFVuaXgKICAgIGNvbW1hbmQuCgogIGNob3duICh1aWQpIChwYXRoKQogICAgQ2hhbmdlcyB0aGUgdXNlciBJRCBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYXQgKHBhdGgpIHRvICh1aWQpLiAodWlkKQogICAgbXVzdCBiZSBhIG51bWJlci4KCiAgbG4gKHNvdXJjZSkgKGRlc3QpCiAgICBDcmVhdGVzIGEgc3ltYm9saWMgbGluayBhdCAoZGVzdCkgdGhhdCBwb2ludHMgdG8gdGhlIGZpbGUgbG9jYXRlZCBhdAogICAgKHNvdXJjZSkuCgogIG1rZGlyIChwYXRoKQogICAgQ3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkgYXQgKHBhdGgpLgoKICByZW5hbWUgKHNvdXJjZSkgKGRlc3QpCiAgICBNb3ZlcyB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYXQgKHNvdXJjZSkgdG8gKGRlc3QpLgoKICBybSAocGF0aCkKICAgIERlbGV0ZXMgdGhlIGZpbGUgbG9jYXRlZCBhdCAocGF0aCkuCgogIHJtZGlyIChwYXRoKQogICAgRGVsZXRlcyB0aGUgZGlyZWN0b3J5IGxvY2F0ZWQgYXQgKHBhdGgpLiBUaGlzIGNvbW1hbmQgd2lsbCByYWlzZSBhbiBlcnJvcgogICAgaWYgdGhlIGRpcmVjdG9yeSBpcyBub3QgZW1wdHkuCgogIHN5bWxpbmsgKHNvdXJjZSkgKGRlc3QpCiAgICBTYW1lIGFzIGxuLgoKRGFuaWVsIFMgKDEgQXByaWwgMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWxpIG1hZGUgY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCkgYSBsb3QgZmFzdGVyIHdoZW4gbWFueQogIGVhc3kgaGFuZGxlcyBhcmUgYWRkZWQgdG8gYSBtdWx0aSBoYW5kbGUsIGJ5IGF2b2lkaW5nIHRoZSBsb29waW5nIG92ZXIgYWxsCiAgdGhlIGhhbmRsZXMgdG8gZmluZCB3aGljaCBvbmUgdG8gcmVtb3ZlLgoKLSBNYXR0IEtyYWFpIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBjdXJsIGJ1aWxkIG9uIFFOWCA2IGZpbmUgYWdhaW4uCgpEYW5pZWwgUyAoMzEgTWFyY2ggMjAwNykKLSBGaXhlZCBzZXZlcmFsIG1pbm9yIGlzc3VlcyBkZXRlY3RlZCBieSB0aGUgY292ZXJpdHkuY29tIHNjYW5uZXIuCgotICJQaXhlbCIgZml4ZWQgYSBwcm9ibGVtIHRoYXQgYXBwZWFyZWQgd2hlbiB5b3UgdXNlZCAtZiB3aXRoIHVzZXIrcGFzc3dvcmQKICBlbWJlZGRlZCBpbiB0aGUgVVJMLgoKRGFuIEYgKDI5IE1hcmNoIDIwMDcpCi0gRG9uJ3QgdGVhciBkb3duIHRoZSBmdHAgY29ubmVjdGlvbiBpZiB0aGUgbWF4aW11bSBmaWxlc2l6ZSB3YXMgZXhjZWVkZWQKICBhbmQgYWRkZWQgdGVzdHMgMjkwIGFuZCAyOTEgdG8gY2hlY2suCgotIEFkZGVkIGZ0cHMgdXBsb2FkIGFuZCBTU0wgcmVxdWlyZWQgdGVzdHMgNDAxIGFuZCA0MDIuCgotIFNlbmQgYW4gRU9GIG1lc3NhZ2UgYmVmb3JlIGNsb3NpbmcgYW4gU0NQIGNoYW5uZWwsIGFzIHJlY29tbWVuZGVkIGJ5CiAgUkZDNDI1NC4gRW5hYmxlIGxpYnNzaDIgdHJhY2luZyB3aGVuIHNzaCBkZWJ1Z2dpbmcgaXMgdHVybmVkIG9uLgoKWWFuZyBUc2UgKDI3IE1hcmNoIDIwMDcpCi0gSW50ZXJuYWwgZnVuY3Rpb24gQ3VybF9zZWxlY3QoKSByZW5hbWVkIHRvIEN1cmxfc29ja2V0X3JlYWR5KCkKCiAgTmV3IEludGVybmFsIHdyYXBwZXIgZnVuY3Rpb24gQ3VybF9zZWxlY3QoKSBhcm91bmQgc2VsZWN0ICgyKSwgaXQKICB1c2VzIHBvbGwoKSB3aGVuIGEgZmluZSBwb2xsKCkgaXMgYXZhaWxhYmxlLCBzbyBub3cgbGliY3VybCBjYW4gYmUKICBidWlsdCB3aXRob3V0IHNlbGVjdCgpIHN1cHBvcnQgYXQgYWxsIGlmIGEgZmluZSBwb2xsKCkgaXMgYXZhaWxhYmxlLgoKRGFuaWVsIFMgKDI1IE1hcmNoIDIwMDcpCi0gRGFuaWVsIEpvaG5zb24gZml4ZWQgbXVsdGkgY29kZSB0byB0cmF2ZXJzZSB0aGUgZWFzeSBoYW5kbGUgbGlzdCBwcm9wZXJseS4KICBBIGxlZnQtb3ZlciBidWcgZnJvbSB0aGUgRmVicnVhcnkgMjEgZml4LgoKRGFuIEYgKDIzIE1hcmNoIDIwMDcpCi0gQWRkZWQgLS1wdWJrZXkgb3B0aW9uIHRvIGN1cmwgYW5kIG1hZGUgLS1rZXkgYWxzbyB3b3JrIGZvciBTQ1AvU0ZUUCwKICBwbHVzIG1hZGUgLS1wYXNzIHdvcmsgb24gYW4gU1NIIHByaXZhdGUga2V5IGFzIHdlbGwuCgotIENoYW5nZWQgdGhlIHRlc3QgaGFybmVzcyB0byBhdHRlbXB0IHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duIHNlcnZlcnMKICBiZWZvcmUgcmVzb3J0aW5nIHRvIHRoZSBraWxsIC05IGhhbW1lci4KCi0gQWRkZWQgdGVzdCBoYXJuZXNzIGluZnJhc3RydWN0dXJlIHRvIHN1cHBvcnQgc2NwL3NmdHAgdGVzdHMsIHVzaW5nCiAgT3BlblNTSCBhcyB0aGUgc2VydmVyLgoKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4gc3BlY2lmeWluZyBhIHByb3h5IHdpdGggYSBmaWxlOiBVUkwuCgpZYW5nIFRzZSAoMjAgTWFyY2ggMjAwNykKLSBGaXhlZDogV2hlbiBhIHNpZ25hbCB3YXMgY2F1Z2h0IGF3YWl0aW5nIGZvciBhbiBldmVudCB1c2luZyBDdXJsX3NlbGVjdCgpCiAgb3IgQ3VybF9wb2xsKCkgd2l0aCBhIG5vbi16ZXJvIHRpbWVvdXQgYm90aCBmdW5jdGlvbnMgd291bGQgcmVzdGFydCB0aGUKICBzcGVjaWZpZWQgdGltZW91dC4gVGhpcyBjb3VsZCBldmVuIGxlYWQgdG8gdGhlIGV4dHJlbWUgY2FzZSB0aGF0IGlmIGEKICBzaWduYWwgYXJyaXZlZCB3aXRoIGEgZnJlY3VlbmN5IGxvd2VyIHRvIHRoZSBzcGVjaWZpZWQgdGltZW91dCBuZWl0aGVyCiAgZnVuY3Rpb24gd291bGQgZXZlciBleGl0LgoKICBBZGRlZCBleHBlcmltZW50YWwgc3ltYm9sIGRlZmluaXRpb24gY2hlY2sgQ1VSTF9BQ0tOT1dMRURHRV9FSU5UUiBpbgogIEN1cmxfc2VsZWN0KCkgYW5kIEN1cmxfcG9sbCgpLiBXaGVuIGNvbXBpbGVkIHdpdGggQ1VSTF9BQ0tOT1dMRURHRV9FSU5UUgogIGRlZmluZWQgYm90aCBmdW5jdGlvbnMgd2lsbCByZXR1cm4gYXMgc29vbiBhcyBhIHNpZ25hbCBpcyBjYXVnaHQuIFVzZSBpdAogIGF0IHlvdXIgb3duIHJpc2ssIGFsbCBjYWxscyB0byB0aGVzZSBmdW5jdGlvbnMgaW4gdGhlIGxpYnJhcnkgc2hvdWxkIGJlCiAgcmV2aXNpdGVkIGFuZCBjaGVja2VkIGJlZm9yZSBmdWxseSBzdXBwb3J0aW5nIHRoaXMgZmVhdHVyZS4KCllhbmcgVHNlICgxOSBNYXJjaCAyMDA3KQotIEJyeWFuIEhlbmRlcnNvbiBmaXhlZCB0aGUgcHJvZ3Jlc3MgZnVuY3Rpb24gc28gdGhhdCBpdCBjYW4gZ2V0IGNhbGxlZCBtb3JlCiAgZnJlcXVlbnRseSBhbGxvd2luZyBzYW1lIGNhbGxpbmcgZnJlY3VlbmN5IGZvciB0aGUgY2xpZW50IHByb2dyZXNzIGNhbGxiYWNrLgogIApEYW4gRiAoMTUgTWFyY2ggMjAwNykKLSBWYXJpb3VzIG1lbW9yeSBsZWFrcyBwbHVnZ2VkIGFuZCBOVUxMIHBvaW50ZXIgZml4ZXMgbWFkZSBpbiB0aGUgc3NoIGNvZGUuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDcpCi0gTmljayBtYWRlIHRoZSBjdXJsIHRvb2wgYWNjZXB0IGdsb2JiaW5nIHJhbmdlcyB0aGF0IG9ubHkgaXMgb25lIG51bWJlciwgaS5lCiAgeW91IGNhbiBub3cgdXNlIFsxLTFdIHdpdGhvdXQgY3VybCBjb21wbGFpbmluZy4KCkRhbmllbCAoMTAgTWFyY2ggMjAwNykKLSBFeWdlbmUgUnlhYmlua2luOgoKICBUaGUgcHJvYmxlbSBpcyB0aGUgZm9sbG93aW5nOiB3aGVuIHdlJ3JlIGNhbGxpbmcgQ3VybF9kb25lIGFuZCBpdCBkZWNpZGVzIHRvCiAga2VlcCB0aGUgY29ubmVjdGlvbiBvcGVuZWQgKCdsZWZ0IGludGFjdCcpLCB0aGVuIHRoZSBjYWxsZXIgaXMgbm90IG5vdGlmaWVkCiAgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMgZG9uZSB2aWEgdGhlIE5VTExpZnlpbmcgb2YgdGhlIHBvaW50ZXIsIHNvIHNvbWUgZWFzeQogIGhhbmRsZSBpcyBrZWVwaW5nIHRoZSBwb2ludGVyIHRvIHRoaXMgY29ubmVjdGlvbi4KCiAgTGF0ZXIgQ29ubmVjdGlvbkV4aXN0cyBjYW4gc2VsZWN0IHN1Y2ggY29ubmVjdGlvbiBmb3IgcmV1c2UgZXZlbiBpZiB3ZSdyZQogIG5vdCBwaXBlbGluaW5nOiBwaXBlTGVuIGlzIHplcm8sIHNvIHRoZSAocGlwZUxlbiA+IDAgJiYgIWNhblBpcGVsaW5lKSBpcwogIGZhbHNlIGFuZCB3ZSBjYW4gcmV1c2UgdGhpcyBjb25uZWN0aW9uIGZvciBhbm90aGVyIGVhc3kgaGFuZGxlLiBCdXQgdGh1cyB0aGUKICBjb25uZWN0aW9uIHdpbGwgYmUgc2hhcmVkIGJldHdlZW4gdHdvIGVhc3kgaGFuZGxlcyBpZiB0aGUgaGFuZGxlIHRoYXQgd2FudHMKICB0byB0YWtlIHRoZSBvd25lcnNoaXAgaXMgbm90IHRoZSBzYW1lIGFzIHdhcyBub3Qgbm90aWZpZWQgb2YgdGhlIGNvbm5lY3Rpb24KICB3YXMgZG9uZSBpbiBDdXJsX2RvbmUuIEFuZCB3aGVuIHNvbWUgb2YgdGhlc2UgZWFzeSBoYW5kbGVzIHdpbGwgZ2V0IHRoZWlyCiAgY29ubmVjdGlvbiByZWFsbHkgZnJlZWQgdGhlIGFub3RoZXIgb25lIHdpbGwgc3RpbGwga2VlcCB0aGUgcG9pbnRlci4KCiAgTXkgZml4IHdhcyByYXRoZXIgdHJpdmlhbDogSSBqdXN0IGFkZGVkIHRoZSBOVUxMaWZpY2F0aW9uIHRvIHRoZSAnZWxzZScKICBicmFuY2ggaW4gdGhlIEN1cmxfZG9uZS4gTXkgdGVzdHMgd2l0aCBHaXQgYW5kIEVsZWN0cmljRmVuY2Ugc2hvd2VkIG5vCiAgcHJvYmxlbXMgYm90aCBmb3IgSFRUUCBwdWxsaW5nIGFuZCBjbG9uaW5nLiBSZXBvc2l0b3J5IHNpemUgaXMgYWJvdXQgMjUwIE1iLAogIHNvIGl0IHdhcyBhIGNvbnNpZGVyYWJsZSBhbW91bnQgb2YgQ3VybCdzIHdvcmsuCgpEYW4gRiAoOSBNYXJjaCAyMDA3KQotIFVwZGF0ZWQgdGhlIHRlc3QgaGFybmVzcyB0byBhZGQgYSBuZXcgImNyeXB0byIgZmVhdHVyZSBjaGVjayBhbmQgdXBkYXRlZCB0aGUKICBhcHByb3ByaWF0ZSB0ZXN0IGNhc2UgdG8gdXNlIGl0LiAgRm9yIG5vdywgdGhpcyBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIHRoZQogICJTU0wiIGZlYXR1cmUgYmVjYXVzZSBjdXJsIGRvZXNuJ3QgbGlzdCBpdCBzZXBhcmF0ZWx5LgoKRGFuaWVsICg5IE1hcmNoIDIwMDcpCi0gUm9iZXJ0IElha29iYXNodmlsaSBmaXhlZCBDVVJMT1BUX0lOVEVSRkFDRSBmb3IgSVB2Ni4KCi0gUm9iZXJ0IEEuIE1vbmF0IGltcHJvdmVkIHRoZSBtYWtldGd6IGFuZCBWQzYvOCBnZW5lcmF0aW5nIHRvIHNldCB0aGUgY29ycmVjdAogIG1hY2hpbmUgdHlwZSB0b28uCgotIEp1c3RpbiBGbGV0Y2hlciBmaXhlZCBhIGZpbGUgZGVzY3JpcHRvciBsZWFrIGluIHRoZSBjdXJsIHRvb2wgd2hlbiB0cnlpbmcgdG8KICB1cGxvYWQgYSBmaWxlIGl0IGNvdWxkbid0IG9wZW4uIEJ1ZyAjMTY3NjU4MQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjc2NTgxKQoKRGFuIEYgKDkgTWFyY2ggMjAwNykKLSBVcGRhdGVkIHRoZSB0ZXN0IGhhcm5lc3MgdG8gY2hlY2sgZm9yIHByb3RvY29sIHN1cHBvcnQgYmVmb3JlIHJ1bm5pbmcgZWFjaAogIHRlc3QsIGZpeGluZyBLTk9XTl9CVUdTICMxMS4KCkRhbiBGICg3IE1hcmNoIDIwMDcpCi0gUmVpbnRyb2R1Y2VkIChhZnRlciBhIDMgeWVhciBoaWF0dXMpIGFuIEZUUFMgdGVzdCBjYXNlICg0MDApIGludG8gdGhlIHRlc3QKICBoYXJuZXNzLiAgSXQgaXMgdmVyeSBsaW1pdGVkIGFzIGl0IHN1cHBvcnRzIG9ubHkgZnRwczovLyBVUkxzIHdpdGgKICAtLWZ0cC1zc2wtY29udHJvbCBzcGVjaWZpZWQsIHdoaWNoIGltcGxpY2l0bHkgZW5jcnlwdHMgdGhlIGNvbnRyb2wKICBjaGFubmVsIGJ1dCBub3QgdGhlIGRhdGEgY2hhbm5lbHMuICBUaGF0IGFsbG93cyBzdHVubmVsIHRvIGJlIHVzZWQgd2l0aAogIGFuIHVubW9kaWZpZWQgZnRwIHNlcnZlciBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGF0IHRoZSB0ZXN0IGh0dHBzCiAgc2VydmVyIGlzIHNldCB1cC4KCkRhbiBGICg3IE1hcmNoIDIwMDcpCi0gSG9ub3VyIC0tZnRwLXNzbC1jb250cm9sIG9uIGZ0cHM6Ly8gVVJMcyB0byBhbGxvdyBlbmNyeXB0ZWQgY29udHJvbCBhbmQKICB1bmVuY3J5cHRlZCBkYXRhIGNvbm5lY3Rpb25zLgoKRGFuIEYgKDYgTWFyY2ggMjAwNykKLSBGaXhlZCBhIGNvdXBsZSBvZiBpbXByb3BlciBwb2ludGVyIHVzZXMgZGV0ZWN0ZWQgYnkgdmFsZ3JpbmQgaW4gdGVzdAogIGNhc2VzIDE4MSAmIDIxNi4KCkRhbmllbCAoMiBNYXJjaCAyMDA3KQotIFJvYmVydCBBLiBNb25hdCBhbmQgU2htdWxpayBSZWdldiBoZWxwZWQgb3V0IHRvIGZpeCB0aGUgbmV3ICovTWFrZWZpbGUudmM4CiAgbWFrZWZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgcmVsZWFzZSBhcmNoaXZlcywgZ2VuZXJhdGVkIGZyb20KICB0aGUgTWFrZWZpbGUudmM2IGZpbGVzIGJ5IHRoZSBtYWtldGd6IHNjcmlwdC4gSSBhbHNvIG1vZGlmaWVkIHRoZSByb290CiAgTWFrZWZpbGUgdG8gaGF2ZSBhIFZDIHZhcmlhYmxlIHRoYXQgZGVmYXVsdHMgdG8gdmM2IGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiB0bwogIGFsbG93IGl0IHRvIGJlIHVzZWQgZm9yIHZjOCBhcyB3ZWxsLiBMaWtlIHRoaXM6CgogICAgbm1ha2UgVkM9dmM4IHZjCgpEYW5pZWwgKDI3IEZlYnJ1YXJ5IDIwMDcpCi0gSGFuZyBLaW4gTGF1IGZvdW5kIGFuZCBmaXhlZDogV2hlbiBJIHVzZSBsaWJjdXJsIHRvIGNvbm5lY3QgdG8gYW4gaHR0cHMKICBzZXJ2ZXIgdGhyb3VnaCBhIHByb3h5IGFuZCBoYXZlIHRoZSByZW1vdGUgaHR0cHMgc2VydmVyIHBvcnQgc2V0IHVzaW5nIHRoZQogIENVUkxPUFRfUE9SVCBvcHRpb24sIHByb3RvY29sIGdldHMgcmVzZXQgdG8gaHR0cCBmcm9tIGh0dHBzIGFmdGVyIHRoZSBmaXJzdAogIHJlcXVlc3QuCiAKICBVc2VyIGRlZmluZWQgVVJMIHdhcyBtb2RpZmllZCBpbnRlcm5hbGx5IGJ5IGxpYmN1cmwgYW5kIHN1YnNlcXVlbnQgcmV1c2Ugb2YKICB0aGUgZWFzeSBoYW5kbGUgbWF5IGxlYWQgdG8gY29ubmVjdGlvbiB1c2luZyBhIGRpZmZlcmVudCBwcm90b2NvbCAoaWYgbm90CiAgb3JpZ2luYWxseSBodHRwKS4KIAogIEkgZm91bmQgdGhhdCBsaWJjdXJsIGhhcmRjb2RlZCB0aGUgcHJvdG9jb2wgdG8gImh0dHAiIHdoZW4gaXQgdHJpZXMgdG8KICByZWdlbmVyYXRlIHRoZSBVUkwgaWYgQ1VSTE9QVF9QT1JUIGlzIHNldC4gSSB0cmllZCB0byBmaXggdGhlIHByb2JsZW0gYXMKICBmb2xsb3dzIGFuZCBpdCdzIHdvcmtpbmcgZmluZSBzbyBmYXIKCkRhbmllbCAoMjUgRmVicnVhcnkgMjAwNykKLSBBZGFtIEQuIE1vc3MgbWFkZSB0aGUgSFRUUCBDT05ORUNUIHByb2NlZHVyZSBsZXNzIGJsb2NraW5nIHdoZW4gdXNlZCBmcm9tCiAgdGhlIG11bHRpIGludGVyZmFjZS4gTm90ZSB0aGF0IGl0IHN0aWxsIGRvZXMgYSBwYXJ0IG9mIHRoZSBjb25uZWN0aW9uIGluIGEKICBibG9ja2luZyBtYW5uZXIuCgpEYW5pZWwgKDIzIEZlYnJ1YXJ5IDIwMDcpCi0gQWRkZWQgd2FybmluZyBvdXRwdXRzIGlmIHRoZSBjb21tYW5kIGxpbmUgdXNlcyBtb3JlIHRoYW4gb25lIG9mIHRoZSBvcHRpb25zCiAgLXYsIC0tdHJhY2UgYW5kIC0tdHJhY2UtYXNjaWksIHNpbmNlIGl0IGNvdWxkIHJlYWxseSBjb25mdXNlIHRoZSB1c2VyLgogIENsYXJpZmllZCB0aGlzIGZhY3QgaW4gdGhlIG1hbiBwYWdlLgoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDA3KQotIFJhdmkgUHJhdGFwIHByb3ZpZGVkIHdvcmsgb24gbGliY3VybCBtYWtpbmcgcGlwZWxpbmluZyBtb3JlIHJvYnVzdCBhbmQKICBmaXhpbmcgc29tZSBidWdzOgogIG8gRG9uJ3QgbWl4IEdFVCBhbmQgUE9TVCByZXF1ZXN0cyBpbiBhIHBpcGVsaW5lCiAgbyBGaXggdGhlIG9yZGVyIGluIHdoaWNoIHJlcXVlc3RzIGFyZSBkaXNwYXRjaGVkIGZyb20gdGhlIHBpcGVsaW5lCiAgbyBGaXhlZCBzZXZlcmFsIGN1cmwgYnVncyB3aXRoIHBpcGVsaW5pbmcgd2hlbiB0aGUgc2VydmVyIGlzIHJldHVybmluZwogICAgY2h1bmtlZCBlbmNvZGluZzoKICAgICogQWRkZWQgc3RhdGVzIHRvIGNodW5rZWQgcGFyc2luZyBmb3IgZmluYWwgQ1JMRgogICAgKiBSZXdpbmQgYnVmZmVyIGFmdGVyIHBhcnNpbmcgY2h1bmsgd2l0aCBkYXRhIHJlbWFpbmluZwogICAgKiBNb3ZlZCBjaHVua2VkIGhlYWRlciBpbml0aWFsaXppbmcgdG8gYSBzcG90IGp1c3QgYmVmb3JlIHJlY2VpdmluZwogICAgICBoZWFkZXJzCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDcpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBjaGFuZ2VkIHRoZSBDVVJMT1BUX0ZUUF9TU0xfQ0NDIG9wdGlvbiB0byBoYW5kbGUKICBhY3RpdmUgYW5kIHBhc3NpdmUgQ0NDIHNodXRkb3duIGFuZCBhZGRlZCB0aGUgLS1mdHAtc3NsLWNjYy1tb2RlIGNvbW1hbmQKICBsaW5lIG9wdGlvbi4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwNykKLSBJYW4gVHVybmVyIGZpeGVkIHRoZSBsaWJjdXJsLm00IG1hY3JvJ3Mgc3VwcG9ydCBmb3IgLS13aXRoLWxpYmN1cmwuCgotIFNobXVsaWsgUmVnZXYgZm91bmQgYSBtZW1vcnkgbGVhayBpbiByZS11c2VkIEhUVFBTIGNvbm5lY3Rpb25zLCBhdCBsZWFzdAogIHdoZW4gdGhlIG11bHRpIGludGVyZmFjZSB3YXMgdXNlZC4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBtYWRlIHBhc3NpdmUgRlRQIHRyYW5zZmVycyB3b3JrIHdpdGggU09DS1MgKGJvdGggNCBhbmQKICA1KS4KCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNykKLSBKZWZmIFBvaGxtZXllciBpZGVudGlmaWVkIHR3byBwcm9ibGVtczogZmlyc3QgYSByYXRoZXIgb2JzY3VyZSBwcm9ibGVtIHdpdGgKICB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBjb25uZWN0aW9uIHJlLXVzZSB0aGF0IGNvdWxkIG1ha2UgYQogIGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgpIHJ1aW4gYSBwb2ludGVyIGluIGFub3RoZXIgaGFuZGxlLgoKICBUaGUgc2Vjb25kIHByb2JsZW0gd2FzIGxlc3Mgb2YgYW4gYWN0dWFsIHByb2JsZW0gYnV0IG1vcmUgb2YgbWlub3IgcXVpcms6CiAgdGhlIHJlLXVzaW5nIG9mIGNvbm5lY3Rpb25zIHdhc24ndCBwcm9wZXJseSBjaGVja2luZyBpZiB0aGUgY29ubmVjdGlvbiB3YXMKICBtYXJrZWQgZm9yIGNsb3N1cmUuCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDcpCi0gRHVuY2FuIE1hYy1WaWNhciBQcmV0dCBhbmQgTWljaGFsIE1hcmVrIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggcmVzZXR0aW5nCiAgQ1VSTE9QVF9SQU5HRSBiYWNrIHRvIG5vIHJhbmdlIG9uIGFuIGVhc3kgaGFuZGxlIHdoZW4gdXNpbmcgRlRQLgoKRGFuIEYgKDE0IEZlYnJ1YXJ5IDIwMDcpCi0gRml4ZWQgY3VybC1jb25maWcgLS1saWJzIHNvIGl0IGRvZXNuJ3QgbGlzdCB1bm5lY2Vzc2FyeSBsaWJyYXJpZXMgKGFuZAogIHRoZXJlZm9yZSBpbnRyb2R1Y2UgdW5uZWNlc3NhcnkgZGVwZW5kZW5jaWVzKSB3aGVuIGl0J3Mgbm90IG5lZWRlZC4KICBBbHNvLCBkb24ndCBib3RoZXIgYWRkaW5nIGEgbGlicmFyeSBwYXRoIG9mIC91c3IvbGliCgpEYW5pZWwgKDEzIEZlYnJ1YXJ5IDIwMDcpCi0gVGhlIGRlZmF1bHQgcGFzc3dvcmQgZm9yIGFub255bW91cyBGVFAgY29ubmVjdGlvbnMgaXMgbm93IGNoYW5nZWQgdG8gYmUKICAiZnRwQGV4YW1wbGUuY29tIi4KCi0gUm9iZXJ0IEEuIE1vbmF0IG1hZGUgbGliY3VybCBidWlsZCBmaW5lIHdpdGggVkMyMDA1IC0gaXQgZG9lc24ndCBoYXZlCiAgZ210aW1lX3IoKSBsaWtlIHRoZSBvbGRlciBWQyB2ZXJzaW9ucy4gSGUgYWxzbyBtYWRlIHVzZSBvZiBzb21lIG1hY2hpbmUtCiAgc3BlY2lmaWMgZGVmaW5lcyB0byBkaWZmZXJlbnRpYXRlIHRoZSAiT1MiIGRlZmluZS4KCkRhbmllbCAoMTIgRmVicnVhcnkgMjAwNykKLSBSb2IgQ3JpdHRlbmRlbiBhZGRlZCBzdXBwb3J0IGZvciBOU1MgKE5ldHdvcmsgU2VjdXJpdHkgU2VydmljZSkgZm9yIHRoZQogIFNTTC9UTFMgbGF5ZXIuIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvcHJvamVjdHMvc2VjdXJpdHkvcGtpL25zcy8KCiAgVGhpcyBpcyB0aGUgZm91cnRoIHN1cHBvcnRlZCBsaWJyYXJ5IGZvciBUTFMvU1NMIHRoYXQgbGliY3VybCBzdXBwb3J0cyEKCi0gU2htdWxpayBSZWdldiBmaXhlZCBzbyB0aGF0IHRoZSBmaW5hbCBDUkxGIG9mIEhUVFAgcmVzcG9uc2UgaGVhZGVycyBhcmUgc2VudAogIHRvIHRoZSBkZWJ1ZyBjYWxsYmFjay4KCi0gU2htdWxpayBSZWdldiBhZGRlZCBDVVJMT1BUX0hUVFBfQ09OVEVOVF9ERUNPRElORyBhbmQKICBDVVJMT1BUX0hUVFBfVFJBTlNGRVJfREVDT0RJTkcgdGhhdCBpZiBzZXQgdG8gemVybyB3aWxsIGRpc2FibGUgbGliY3VybCdzCiAgaW50ZXJuYWwgZGVjb2Rpbmcgb2YgY29udGVudCBvciB0cmFuc2ZlciBlbmNvZGVkIGNvbnRlbnQuIFRoaXMgbWF5IGJlCiAgcHJlZmVyYWJsZSBpbiBjYXNlcyB3aGVyZSB5b3UgdXNlIGxpYmN1cmwgZm9yIHByb3h5IHB1cnBvc2VzIG9yIHNpbWlsYXIuIFRoZQogIGNvbW1hbmQgbGluZSB0b29sIGdvdCBhIC0tcmF3IG9wdGlvbiB0byBkaXNhYmxlIGJvdGggYXQgb25jZS4KCi0gcmVsZWFzZSB0YXJiYWxscyBtYWRlIHdpdGggbWFrZXRneiB3aWxsIGZyb20gbm93IG9uIGhhdmUgYSBMSUJDVVJMX1RJTUVTVEFNUAogIGRlZmluZSBzZXQgdG8gaG9sZCB0aGUgZXhhY3QgZGF0ZSBhbmQgdGltZSBvZiB3aGVuIHRoZSB0YXJiYWxsIHdhcyBidWlsdCwgYXMKICBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZyB1c2luZyB0aGUgVVRDIHRpbWUgem9uZS4KICAKLSBKZWZmIFBvaGxtZXllciBmaXhlZCBhIGZsYXcgaW4gY3VybF9tdWx0aV9hZGRfaGFuZGxlKCkgd2hlbiBhZGRpbmcgYSBoYW5kbGUKICB0aGF0IGhhcyBhbiBlYXN5IGhhbmRsZSBwcmVzZW50IGluIHRoZSAiY2xvc3VyZSIgbGlzdCBwZW5kaW5nIGNsb3N1cmUuCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwNykKLSBSZWd1bGFyIGZpbGUgZG93bmxvYWRzIHdpaHQgU0ZUUCBhbmQgU0NQIGFyZSBub3cgZG9uZSB1c2luZyB0aGUgbm9uLWJsb2NraW5nCiAgQVBJIG9mIGxpYnNzaDIsIGlmIHRoZSBsaWJzc2gyIGhlYWRlcnMgc2VlbSB0byBzdXBwb3J0IHRoZW0uIFRoaXMgd2lsbCBtYWtlCiAgU0NQIGFuZCBTRlRQIG11Y2ggbW9yZSByZXNwb25zaXZlIGFuZCBiZXR0ZXIgbGliY3VybCBjaXRpemVucyB3aGVuIHVzZWQgd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgZXRjLgoKRGFuaWVsICg1IEZlYnJ1YXJ5IDIwMDcpCi0gTWljaGFlbCBXYWxsbmVyIGFkZGVkIHN1cHBvcnQgZm9yIENVUkxPUFRfVElNRU9VVF9NUyBhbmQKICBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUX01TIHRoYXQsIGFzIHRoZWlyIG5hbWVzIHN1Z2dlc3QsIGRvIHRoZSB0aW1lb3V0cyB3aXRoCiAgbWlsbGlzZWNvbmQgcmVzb2x1dGlvbi4gVGhlIG9ubHkgcmVzdHJpY3Rpb24gdG8gdGhhdCBpcyB0aGUgYWxhcm0oKQogIChzb21ldGltZXMpIHVzZWQgdG8gYWJvcnQgbmFtZSByZXNvbHZlcyBhcyB0aGF0IHVzZXMgZnVsbCBzZWNvbmRzLiBJIGZpeGVkCiAgdGhlIEZUUCByZXNwb25zZSB0aW1lb3V0IHBhcnQgb2YgdGhlIHBhdGNoLgoKICBJbnRlcm5hbGx5IHdlIG5vdyBjb3VudCBhbmQga2VlcCB0aGUgdGltZW91dHMgaW4gbWlsbGlzZWNvbmRzIGJ1dCBpdCBhbHNvCiAgbWVhbnMgd2UgbXVsdGlwbHkgc2V0IHRpbWVvdXRzIHdpdGggMTAwMC4gVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgbm8KICB0aW1lb3V0IGNhbiBiZSBzZXQgdG8gbW9yZSB0aGFuIDJeMzEgbWlsbGlzZWNvbmRzIChvbiAzMiBiaXQgc3lzdGVtcyksIHdoaWNoCiAgZXF1YWxzIDI0Ljg2IGRheXMuICBXZSBwcm9iYWJseSBjb3VsZG4ndCBiZWZvcmUgZWl0aGVyIHNpbmNlIHRoZSBjb2RlIGRpZAogICoxMDAwIG9uIHRoZSB0aW1lb3V0IHZhbHVlcyBvbiBzZXZlcmFsIHBsYWNlcyBhbHJlYWR5LgoKRGFuaWVsICgzIEZlYnJ1YXJ5IDIwMDcpCi0gWWFuZyBUc2UgZml4ZWQgdGhlIGNvb2tpZSBleHBpcnkgZGF0ZSBpbiBzZXZlcmFsIHRlc3QgY2FzZXMgdGhhdCBzdGFydGVkIHRvCiAgZmFpbCBzaW5jZSB0aGV5IHVzZWQgIjEgZmViIDIwMDciLi4uCgotIE1hbmZyZWQgU2Nod2FyYiByZXBvcnRlZCB0aGF0IHNvY2tzNSBzdXBwb3J0IHdhcyBicm9rZW4gYW5kIGhlbHAgdXMgcGlucG9pbnQKICB0aGUgcHJvYmxlbS4gVGhlIGNvZGUgbm93IHRyaWVzIGhhcmRlciB0byB1c2UgaHR0cHJveHkgYW5kIHByb3h5IHdoZXJlCiAgYXBwcHJvcHJpYXRlLCBhcyBub3QgYWxsIHByb3hpZXMgYXJlIEhUVFAuLi4KClZlcnNpb24gNy4xNi4xICgyOSBKYW51YXJ5IDIwMDcpCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwNykKLSBNaWNoYWVsIFdhbGxuZXIgcmVwb3J0ZWQgdGhhdCB3aGVuIGRvaW5nIGEgQ09OTkVDVCB3aXRoIGEgY3VzdG9tIFVzZXItQWdlbnQKICBoZWFkZXIsIHlvdSBnb3QgX3R3b18gVXNlci1BZ2VudCBoZWFkZXJzIGluIHRoZSBDT05ORUNUIHJlcXVlc3QuLi4hIEFkZGVkCiAgdGVzdCBjYXNlIDI4NyB0byB2ZXJpZnkgdGhlIGZpeC4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA3KQotIGN1cmxfZWFzeV9yZXNldCgpIG5vdyByZXNldHMgdGhlIENBIGJ1bmRsZSBwYXRoIGNvcnJlY3RseS4KCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgdGhlIEN1cmwgY29tbWFuZCBsaW5lIHRvb2wgZm9yIEhUVFAgb24gbm9uLUFTQ0lJCiAgcGxhdGZvcm1zLgoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDcpCi0gQWRkZWQgdGhlIC0tbGliY3VybCBbZmlsZV0gb3B0aW9uIHRvIGN1cmwuIEFwcGVuZCB0aGlzIG9wdGlvbiB0byBhbnkKICBvcmRpbmFyeSBjdXJsIGNvbW1hbmQgbGluZSwgYW5kIHlvdSB3aWxsIGdldCBhIGxpYmN1cmwtdXNpbmcgc291cmNlIGNvZGUKICB3cml0dGVuIHRvIHRoZSBmaWxlIHRoYXQgZG9lcyB0aGUgZXF1aXZhbGVudCBvcGVyYXRpb24gb2Ygd2hhdCB5b3VyIGNvbW1hbmQKICBsaW5lIG9wZXJhdGlvbiBkb2VzIQoKRGFuIEYgKDI0IEphbnVhcnkgMjAwNykKLSBGaXhlZCBhIGRhbmdsaW5nIHBvaW50ZXIgcHJvYmxlbSB0aGF0IHByZXZlbnRlZCB0aGUgaHR0cF9wcm94eSBlbnZpcm9ubWVudAogIHZhcmlhYmxlIGZyb20gYmVpbmcgcHJvcGVybHkgdXNlZCBpbiBtYW55IGNhc2VzIChhbmQgY2F1c2VkIHRlc3QgY2FzZSA2MwogIHRvIGZhaWwpLgoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDcpCi0gRGF2aWQgTWNDcmVlZHkgZGlkIE5UTE0gY2hhbmdlcyBtYWlubHkgZm9yIG5vbi1BU0NJSSBwbGF0Zm9ybXM6CgogICMxCiAgVGhlcmUncyBhIGNvbXBpbGF0aW9uIGVycm9yIGluIGh0dHBfbnRsbS5jIGlmIFVTRV9OVExNMlNFU1NJT04gaXMgTk9UCiAgZGVmaW5lZC4gIEkgbm90aWNlZCB0aGlzIHdoaWxlIHRlc3RpbmcgdmFyaW91cyBjb25maWd1cmF0aW9ucy4gIExpbmUgODY3IG9mCiAgdGhlIGN1cnJlbnQgaHR0cF9udGxtLmMgaXMgYSBjbG9zaW5nIGJyYWNrZXQgZm9yIGFuIGlmL2Vsc2UgcGFpciB0aGF0IG9ubHkKICBnZXRzIGNvbXBpbGVkIGluIGlmIFVTRV9OVExNMlNFU1NJT04gaXMgZGVmaW5lZC4gIEJ1dCB0aGlzIGNsb3NpbmcgYnJhY2tldAogIHdhc24ndCBpbiBhbiAjaWZkZWYgc28gdGhlIGNvZGUgZmFpbHMgdG8gY29tcGlsZSB1bmxlc3MgVVNFX05UTE0yU0VTU0lPTiB3YXMKICBkZWZpbmVkLiAgTGluZXMgMTk4IGFuZCAxNDAgb2YgbXkgcGF0Y2ggd3JhcHMgdGhhdCBjbG9zaW5nIGJyYWNrZXQgaW4gYW4KICAjaWZkZWYgVVNFX05UTE0yU0VTU0lPTi4KCiAgIzIKICBJIG5vdGljZWQgc2V2ZXJhbCBwaWNreSBjb21waWxlciB3YXJuaW5ncyB3aGVuIERFQlVHX01FIGlzIGRlZmluZWQuICBJJ3ZlCiAgZml4ZWQgdGhlbSB3aXRoIGNhc3RpbmcuICBCeSB0aGUgd2F5LCBERUJVR19NRSB3YXMgYSBodWdlIGhlbHAgaW4KICB1bmRlcnN0YW5kaW5nIHRoaXMgY29kZS4KCiAgIzMKICBIb3BlZnVsbHkgdGhlIGxhc3Qgbm9uLUFTQ0lJIGNvbnZlcnNpb24gcGF0Y2ggZm9yIGxpYmN1cmwgaW4gYSB3aGlsZS4gIEkKICBjaGFuZ2VkIHRoZSAiTlRMTVNTUCIgbGl0ZXJhbCB0byBoZXggc2luY2UgdGhpcyBzaWduYXR1cmUgbXVzdCBhbHdheXMgYmUgaW4KICBBU0NJSS4KCiAgQ29udmVyc2lvbiBjb2RlIHdhcyBzdHJhdGVnaWNhbGx5IGFkZGVkIHdoZXJlIG5lY2Vzc2FyeS4gIEFuZCB0aGUKICBDdXJsX2Jhc2U2NF9lbmNvZGUgY2FsbHMgd2VyZSBjaGFuZ2VkIHNvIHRoZSBiaW5hcnkgImJsb2JzIiBodHRwX250bG0uYwogIGNyZWF0ZXMgYXJlIE5PVCB0cmFuc2xhdGVkIG9uIG5vbi1BU0NJSSBwbGF0Zm9ybXMuCgpEYW4gRiAoMjIgSmFudWFyeSAyMDA3KQotIENvbnZlcnRlZCAobW9zdCBvZikgdGhlIHRlc3QgZGF0YSBmaWxlcyBpbnRvIGdlbnVpbmUgWE1MLiAgQSBoYW5kZnVsIHN0aWxsCiAgYXJlIG5vdCwgZHVlIG1haW5seSB0byB0aGUgbGFjayBvZiBzdXBwb3J0IGZvciBYTUwgY2hhcmFjdGVyIGVudGl0aWVzCiAgKGUuZy4gJiA9PiAmYW1wOyApLiAgVGhpcyB3aWxsIG1ha2UgaXQgZWFzaWVyIHRvIHZhbGlkYXRlIHRlc3QgZmlsZXMgdXNpbmcKICB0b29scyBsaWtlIHhtbGxpbnQsIGFzIHdlbGwgYXMgdG8gZWRpdCBhbmQgdmlldyB0aGVtIHVzaW5nIFhNTCB0b29scy4KCkRhbmllbCAoMTYgSmFudWFyeSAyMDA3KQotIEFybWVsIEFzc2VsaW4gaW1wcm92ZWQgbGliY3VybCB0byBiZWhhdmUgYSBsb3QgYmV0dGVyIHdoZW4gYW4gZWFzeSBoYW5kbGUKICBkb2luZyBhbiBGVFAgdHJhbnNmZXIgaXMgcmVtb3ZlZCBmcm9tIGEgbXVsdGkgaGFuZGxlIGJlZm9yZSBjb21wbGV0aW9uLiBUaGUKICBmaXggYWxzbyBmaXhlZCB0aGUgImFsaXZlIGNvdW50ZXIiIHRvIGJlIGNvcnJlY3Qgb24gInByZW1hdHVyZSByZW1vdmFsIiBmb3IKICBhbGwgcHJvdG9jb2xzLgoKRGFuIEYgKDE2IEphbnVhcnkgMjAwNykKLSBGaXhlZCBhIHNtYWxsIG1lbW9yeSBsZWFrIGluIHRmdHAgdXBsb2FkcyBkaXNjb3ZlcmVkIGJ5IGN1cmwncyBtZW1vcnkgbGVhawogIGRldGVjdG9yLiAgQWxzbyBjaGFuZ2VkIHRmdHAgZG93bmxvYWRzIHRvIFVSTC11bmVzY2FwZSB0aGUgZG93bmxvYWRlZAogIGZpbGUgbmFtZS4KCkRhbmllbCAoMTQgSmFudWFyeSAyMDA3KQotIERhdmlkIE1jQ3JlZWR5IHByb3ZpZGVkIGxpYmN1cmwgY2hhbmdlcyBmb3IgZG9pbmcgSFRUUCBjb21tdW5pY2F0aW9uIG9uCiAgbm9uLUFTQ0lJIHBsYXRmb3Jtcy4gSXQgZG9lcyBhZGQgc29tZSBjb21wbGV4aXR5LCBtb3N0IG5vdGFibHkgd2l0aCBtb3JlCiAgI2lmZGVmcywgYnV0IEkgd2FudCB0byBzZWUgdGhpcyBzdXBwb3J0ZWQgYWRkZWQgYW5kIEkgY2FuJ3Qgc2VlIGhvdyB3ZSBjYW4KICBhZGQgaXQgd2l0aG91dCB0aGUgZXh0cmEgc3R1ZmYgYWRkZWQuCgotIFNldHRpbmcgQ1VSTE9QVF9DT09LSUVMSVNUIHRvICJBTEwiIHdoZW4gbm8gY29va2llcyBhdCBhbGwgd2FzIHByZXNlbnQsCiAgbGliY3VybCB3b3VsZCBjcmFzaCB3aGVuIHRyeWluZyB0byByZWFkIGEgTlVMTCBwb2ludGVyLgoKRGFuaWVsICgxMiBKYW51YXJ5IDIwMDcpCi0gVG9ieSBQZXRlcnNvbiBmb3VuZCBhIG5hc3R5IGJ1ZyB0aGF0IHByZXZlbnRlZCAobGliKWN1cmwgZnJvbSBwcm9wZXJseQogIGRvd25sb2FkaW5nIChtb3N0KSB0aGluZ3MgdGhhdCB3ZXJlIGxhcmdlciB0aGFuIDRHQiBvbiAzMiBiaXQgc3lzdGVtcy4gIE1hdHQKICBXaXRoZXJzcG9vbiBoZWxwZWQgYXMgbmFycm93IGRvd24gdGhlIHByb2JsZW0uCgpEYW5pZWwgKDUgSmFudWFyeSAyMDA3KQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgaW50cm9kdWNlZCB0aGUgLS1mdHAtc3NsLWNjYyBjb21tYW5kIGxpbmUgb3B0aW9uIHRvCiAgY3VybCB0aGF0IHVzZXMgdGhlIG5ldyBDVVJMT1BUX0ZUUF9TU0xfQ0NDIG9wdGlvbiBpbiBsaWJjdXJsLiBJZiBlbmFibGVkLCBpdAogIHdpbGwgbWFrZSBsaWJjdXJsIHNodXRkb3duIFNTTC9UTFMgYWZ0ZXIgdGhlIGF1dGhlbnRpY2F0aW9uIGlzIGRvbmUgb24gYQogIEZUUC1TU0wgb3BlcmF0aW9uLgoKRGFuaWVsICg0IEphbnVhcnkgMjAwNykKLSBEYXZpZCBNY0NyZWVkeSBtYWRlIGNoYW5nZXMgdG8gYWxsb3cgYmFzZTY0IGVuY29kaW5nL2RlY29kaW5nIHRvIHdvcmsgb24KICBub24tQVNDSUkgcGxhdGZvcm1zLgoKRGFuaWVsICgzIEphbnVhcnkgMjAwNykKLSBNYXR0IFdpdGhlcnNwb29uIGZpeGVkIHRoZSBmbGF3IHdoaWNoIG1hZGUgbGliY3VybCA3LjE2LjAgYWx3YXlzIHN0b3JlCiAgZG93bmxvYWRlZCBkYXRhIGluIHR3byBidWZmZXJzLCBqdXN0IHRvIGJlIGFibGUgdG8gZGVhbCB3aXRoIGEgc3BlY2lhbCBIVFRQCiAgcGlwZWxpbmluZyBjYXNlLiBUaGF0IGlzIG5vdyBvbmx5IGFjdGl2YXRlZCBmb3IgcGlwZWxpbmVkIHRyYW5zZmVycy4gSW4KICBNYXR0J3MgY2FzZSwgaXQgc2hvd2VkIGFzIGEgY29uc2lkZXJhYmxlIHBlcmZvcm1hbmNlIGRpZmZlcmVuY2UsCgpEYW5pZWwgKDIgSmFudWFyeSAyMDA3KQotIFZpY3RvciBTbmV6aGtvIGhlbHBlZCB1cyBmaXggYnVnIHJlcG9ydCAjMTYwMzcxMgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjAzNzEyKSAoa25vd24gYnVnICMzNikgLS1saW1pdC1yYXRlCiAgKENVUkxPUFRfTUFYX1NFTkRfU1BFRURfTEFSR0UgYW5kIENVUkxPUFRfTUFYX1JFQ1ZfU1BFRURfTEFSR0UpIGFyZSBicm9rZW4KICBvbiBXaW5kb3dzIChzaW5jZSA3LjE2LjAsIGJ1dCB0aGF0J3Mgd2hlbiB0aGV5IHdlcmUgaW50cm9kdWNlZCBhcyBwcmV2aW91cwogIHRvIHRoYXQgdGhlIGxpbWl0aW5nIGxvZ2ljIHdhcyBtYWRlIGluIHRoZSBhcHBsaWNhdGlvbiBvbmx5IGFuZCBub3QgaW4gdGhlCiAgbGlicmFyeSkuIEl0IHdhcyBhY3R1YWxseSBhbHNvIGJyb2tlbiBvbiBzZWxlY3QoKS1iYXNlZCBzeXN0ZW1zIChhcyBhcHBvc2VkCiAgdG8gcG9sbCgpKSBidXQgd2UgaGF2ZW4ndCBoYWQgYW55IHN1Y2ggcmVwb3J0cy4gV2Ugbm93IHVzZSBzZWxlY3QoKSwgU2xlZXAoKQogIG9yIGRlbGF5KCkgcHJvcGVybHkgdG8gc2xlZXAgYSB3aGlsZSB3aXRob3V0IHdhaXRpbmcgZm9yIGFueXRoaW5nIGlucHV0IG9yCiAgb3V0cHV0IHdoZW4gdGhlIHJhdGUgbGltaXRpbmcgaXMgYWN0aXZhdGVkIHdpdGggdGhlIGVhc3kgaW50ZXJmYWNlLgoKLSBNb2RpZmllZCBsaWJjdXJsLnBjLmluIHRvIHVzZSBMaWJzLnByaXZhdGUgZm9yIHRoZSBsaWJzIGxpYmN1cmwgaXRzZWxmIG5lZWRzCiAgdG8gZ2V0IGJ1aWx0IHN0YXRpYy4gSXQgaGFzIGJlZW4gbWVudGlvbmVkIGJlZm9yZSBhbmQgd2FzIGFnYWluIGJyb3VnaHQgdG8KICBvdXIgYXR0ZW50aW9uIGJ5IE5hdGhhbmFlbCBOZXJvZGUgd2hvIGZpbGVkIGRlYmlhbiBidWcgcmVwb3J0ICM0MDUyMjYKICAoaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQwNTIyNikuCgpEYW5pZWwgKDI5IERlY2VtYmVyIDIwMDYpCi0gTWFrZSBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgc2V0IHRoZSBtYWdpYyBudW1iZXIgaW4gdGhlIG5ldyBoYW5kbGUuCgpEYW5pZWwgKDIyIERlY2VtYmVyIDIwMDYpCi0gUm9iZXJ0IEZvcmVtYW4gcHJvdmlkZWQgYSBwcmltZSBleGFtcGxlIHNuaXBwZXQgc2hvd2luZyBob3cgbGliY3VybCB3b3VsZAogIGdldCBjb25mdXNlZCBhbmQgbm90IGFja25vd2xlZGdlIHRoZSAnbm9fcHJveHknIHZhcmlhYmxlIHByb3Blcmx5IG9uY2UgaXQKICBoYWQgdXNlZCB0aGUgcHJveHkgYW5kIHlvdSByZS11c2VkIHRoZSBzYW1lIGVhc3kgaGFuZGxlLiBJIG1hZGUgc3VyZSB0aGUKICBwcm94eSBuYW1lIGlzIHByb3Blcmx5IHN0b3JlZCBpbiB0aGUgY29ubmVjdCBzdHJ1Y3QgcmF0aGVyIHRoYW4gdGhlCiAgc2Vzc2lvbmhhbmRsZS9lYXN5IHN0cnVjdC4KCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgYSBiYWQgY2FsbCB0byBnZXRzb2NrbmFtZSgpIHRoYXQgd3JvbmdseSB1c2VkIGEgc2l6ZV90CiAgdmFyaWFibGUgdG8gcG9pbnQgdG8gd2hlbiBpdCBzaG91bGQgYmUgYSBzb2NrbGVuX3QuCgotIFdoZW4gc2V0dGluZyBhIHByb3h5IHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCAoZm9yIGV4YW1wbGUpIHJ1bm5pbmcKICAnY3VybCBbVVJMXScgd2l0aCBhIFVSTCB3aXRob3V0IGEgcHJvdG9jb2wgcHJlZml4LCBjdXJsIHdvdWxkIG5vdCBzZW5kIGEKICBjb3JyZWN0IHJlcXVlc3QgYXMgaXQgZmFpbGVkIHRvIGFkZCB0aGUgcHJvdG9jb2wgcHJlZml4LgoKRGFuaWVsICgyMSBEZWNlbWJlciAyMDA2KQotIFJvYnNvbiBCcmFnYSBBcmF1am8gcmVwb3J0ZWQgYnVnICMxNjE4MzU5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2MTgzNTkpIGFuZCBzdWJzZXF1ZW50bHkgcHJvdmlkZWQgYQogIHBhdGNoIGZvciBpdDogd2hlbiBkb3dubG9hZGluZyAyIHplcm8gYnl0ZSBmaWxlcyBpbiBhIHJvdywgY3VybCA3LjE2LjAKICBlbnRlcnMgYW4gaW5maW5pdGUgbG9vcCwgd2hpbGUgY3VybCA3LjE2LjEtMjAwNjEyMTggZG9lcyBvbmUgYWRkaXRpb25hbAogIHVubmVjZXNzYXJ5IHJlcXVlc3QuCgogIEZpeDogRHVyaW5nIHRoZSAiTWFqb3Igb3ZlcmhhdWwgaW50cm9kdWNpbmcgaHR0cCBwaXBlbGluaW5nIHN1cHBvcnQgYW5kCiAgc2hhcmVkIGNvbm5lY3Rpb24gY2FjaGUgd2l0aGluIHRoZSBtdWx0aSBoYW5kbGUuIiBjaGFuZ2UsIGhlYWRlcmJ5dGVjb3VudAogIHdhcyBtb3ZlZCB0byBsaXZlIGluIHRoZSBDdXJsX3RyYW5zZmVyX2tlZXBlciBzdHJ1Y3R1cmUuIEJ1dCB0aGF0IHN0cnVjdHVyZQogIGlzIHJlc2V0IGluIHRoZSBUcmFuc2ZlciBtZXRob2QsIGxvc2luZyB0aGUgaW5mb3JtYXRpb24gdGhhdCB3ZSBoYWQgYWJvdXQKICB0aGUgaGVhZGVyIHNpemUuIFRoaXMgcGF0Y2ggbW92ZXMgaXQgYmFjayB0byB0aGUgY29ubmVjdGRhdGEgc3RydWN0LgoKRGFuaWVsICgxNiBEZWNlbWJlciAyMDA2KQotIEJyZW5kYW4gSnVyZCBwcm92aWRlZCBhIGZpeCB0aGF0IG5vdyBwcmV2ZW50cyBsaWJjdXJsIGZyb20gZ2V0dGluZyBhIFNJR1BJUEUKICBkdXJpbmcgY2VydGFpbiBjb25kaXRpb25zIHdoZW4gR251VExTIGlzIHVzZWQuCgpEYW5pZWwgKDExIERlY2VtYmVyIDIwMDYpCi0gQWxleGV5IFNpbWFrIGZvdW5kIG91dCB0aGF0IHdoZW4gZG9pbmcgRlRQIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBhbmQKICBzb21ldGhpbmcgd2VudCB3cm9uZyBsaWtlIGl0IGdvdCBhIGJhZCByZXNwb25zZSBjb2RlIGJhY2sgZnJvbSB0aGUgc2VydmVyLAogIGxpYmN1cmwgd291bGQgbGVhayBtZW1vcnkuIEFkZGVkIHRlc3QgY2FzZSA1MzggdG8gdmVyaWZ5IHRoZSBmaXguCgogIEkgYWxzbyBub3RlZCB0aGF0IHRoZSBjb25uZWN0aW9uIHdvdWxkIGdldCBjYWNoZWQgaW4gdGhhdCBjYXNlLCB3aGljaAogIGRvZXNuJ3QgbWFrZSBzZW5zZSBzaW5jZSBpdCBjYW5ub3QgYmUgcmUtdXNlIHdoZW4gdGhlIGF1dGhlbnRpY2F0aW9uIGhhcwogIGZhaWxlZC4gSSBmaXhlZCB0aGF0IGlzc3VlIHRvbyBhdCB0aGUgc2FtZSB0aW1lLCBhbmQgYWxzbyB0aGF0IHRoZSBwYXRoCiAgd291bGQgYmUgInJlbWVtYmVyZWQiIGluIHZhaW4gZm9yIGNhc2VzIHdoZXJlIHRoZSBjb25uZWN0aW9uIHdhcyBhYm91dCB0bwogIGdldCBjbG9zZWQuCgpEYW5pZWwgKDYgRGVjZW1iZXIgMjAwNikKLSBTZWJhc3RpZW4gV2lsbGVtaWpucyByZXBvcnRlZCBidWcgIzE2MDM3MTIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwMzcxMikgd2hpY2ggaXMgYWJvdXQgY29ubmVjdGlvbnMKICBnZXR0aW5nIGN1dCBvZmYgcHJlbWF0dXJlbHkgd2hlbiAtLWxpbWl0LXJhdGUgaXMgdXNlZC4gV2hpbGUgSSBmb3VuZCBubyBzdWNoCiAgcHJvYmxlbXMgaW4gbXkgdGVzdHMgbm9yIGluIG15IHJlYWRpbmcgb2YgdGhlIGNvZGUsIEkgZm91bmQgdGhhdCB0aGUKICAtLWxpbWl0LXJhdGUgY29kZSB3YXMgc2V2ZXJseSBmbGF3ZWQgKHNpbmNlIGl0IHdhcyBtb3ZlZCBpbnRvIHRoZSBsaWIsIHNpbmNlCiAgNy4xNS41KSB3aGVuIHVzZWQgd2l0aCB0aGUgZWFzeSBpbnRlcmZhY2UgYW5kIGl0IGRpZG4ndCB3b3JrIGFzIGRvY3VtZW50ZWQKICBzbyBJIHJld29ya2VkIGl0IHNvbWV3aGF0IGFuZCBub3cgaXQgd29ya3MgZm9yIG15IHRlc3RzLgoKRGFuaWVsICg1IERlY2VtYmVyIDIwMDYpCi0gU3RlZmFuIEtyYXVzZSBwb2ludGVkIG91dCBhIGNvbXBpbGVyIHdhcm5pbmcgd2l0aCBhIHBpY2t5IE1TQ1YgY29tcGlsZXIgd2hlbgogIHBhc3NpbmcgYSBjdXJsX29mZl90IGFyZ3VtZW50IHRvIHRoZSBDdXJsX3JlYWRfcmV3aW5kKCkgZnVuY3Rpb24gd2hpY2ggdGFrZXMKICBhbiBzaXplX3QgYXJndW1lbnQuIEN1cmxfcmVhZF9yZXdpbmQoKSBhbHNvIGhhZCBkZWJ1ZyBjb2RlIGxlZnQgaW4gaXQgYW5kIGl0CiAgd2FzIHB1dCBpbiBhIGRpZmZlcmVudCBzb3VyY2UgZmlsZSB3aXRoIG5vIGdvb2QgcmVhc29uIHdoZW4gb25seSB1c2VkIGZyb20KICBvbmUgc2luZ2xlIHNwb3QuCgotIFNoIERpYW8gcmVwb3J0ZWQgdGhhdCBDVVJMT1BUX0NMT1NFUE9MSUNZIGRvZXNuJ3Qgd29yaywgYW5kIGluZGVlZCwgdGhlcmUgaXMKICBubyBjb2RlIHByZXNlbnQgaW4gdGhlIGxpYnJhcnkgdGhhdCByZWNlaXZlcyB0aGUgb3B0aW9uLiBTaW5jZSBpdCB3YXMgbm90CiAgcG9zc2libGUgdG8gdXNlLCB3ZSBrbm93IHRoYXQgbm8gY3VycmVudCB1c2VycyBleGlzdCBhbmQgdGh1cyB3ZSBzaW1wbHkKICByZW1vdmVkIGl0IGZyb20gdGhlIGRvY3MgYW5kIG1hZGUgdGhlIGNvZGUgYWx3YXlzIHVzZSB0aGUgZGVmYXVsdCBwYXRoIG9mCiAgdGhlIGNvZGUuCgotIEphcmVkIEx1bmRlbGwgZmlsZWQgYnVnIHJlcG9ydCAjMTYwNDk1NgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjA0OTU2KSB3aGljaCBpZGVudGlmaWVkIHNldHRpbmcKICBDVVJMT1BUX01BWENPTk5FQ1RTIHRvIHplcm8gY2F1c2VkIGxpYmN1cmwgdG8gU0lHU0VHVi4gU3RhcnRpbmcgbm93LCBsaWJjdXJsCiAgd2lsbCBhbHdheXMgaW50ZXJuYWxseSB1c2Ugbm8gbGVzcyB0aGFuIDEgZW50cnkgaW4gdGhlIGNvbm5lY3Rpb24gY2FjaGUuCgotIFNoIERpYW8gcmVwb3J0ZWQgdGhhdCBDVVJMT1BUX0ZPUkJJRF9SRVVTRSBubyB3b3JrcywgYW5kIGluZGVlZCBpdCBicm9rZSBpbgogIHRoZSA3LjE2LjAgcmVsZWFzZS4KCi0gTWFydGluIFNraW5uZXIgYnJvdWdodCBiYWNrIGJ1ZyByZXBvcnQgIzEyMzAxMTggdG8gaGF1bnQgdXMgb25jZSBhZ2Fpbi4KICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIzMDExOCkgY3VybF9nZXRkYXRlKCkgZGlkIG5vdCB3b3JrCiAgcHJvcGVybHkgZm9yIGFsbCBpbnB1dCBkYXRlcyBvbiBXaW5kb3dzLiBJdCB3YXMgbW9zdGx5IHNlZW4gb24gc29tZSBUWiB0aW1lCiAgem9uZXMgdXNpbmcgRFNULiBMdWNraWx5LCBNYXJ0aW4gYWxzbyBwcm92aWRlZCBhIGZpeC4KCi0gQWxleGV5IFNpbWFrIGZpbGVkIGJ1ZyByZXBvcnQgIzE2MDA0NDcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwMDQ0NykgaW4gd2hpY2ggaGUgbm90ZWQgdGhhdCBhY3RpdmUKICBGVFAgY29ubmVjdGlvbnMgZG9uJ3Qgd29yayB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UuIFRoZSBwcm9ibGVtIGlzIGhlcmUKICB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2Ugc3RhdGUgbWFjaGluZSBoYXMgYSBzdGF0ZSBkdXJpbmcgd2hpY2ggaXQgY2FuIHdhaXQKICBmb3IgdGhlIGRhdGEgY29ubmVjdGlvbiB0byBjb25uZWN0LCBidXQgdGhlIGFjdGl2ZSBjb25uZWN0aW9uIGlzIG5vdCBkb25lIGluCiAgdGhlIHNhbWUgc3RlcCBpbiB0aGUgc2VxdWVuY2UgYXMgdGhlIHBhc3NpdmUgb25lIGlzIHNvIGl0IGRvZXNuJ3QgcXVpdGUgd29yawogIGZvciBhY3RpdmUuIFRoZSBhY3RpdmUgRlRQIGNvZGUgc3RpbGwgdXNlIGEgYmxvY2tpbmcgZnVuY3Rpb24gdG8gYWxsb3cgdGhlCiAgcmVtb3RlIHNlcnZlciB0byBjb25uZWN0LgoKICBUaGUgZml4ICh3b3JrLWFyb3VuZCBpcyBhIGJldHRlciB3b3JkKSBmb3IgdGhpcyBwcm9ibGVtIGlzIHRvIHNldCB0aGUKICBib29sZWFuIHByZW1hdHVyZWx5IHRoYXQgdGhlIGRhdGEgY29ubmVjdGlvbiBpcyBjb21wbGV0ZWQsIHNvIHRoYXQgdGhlICJ3YWl0CiAgZm9yIGNvbm5lY3QiIHBoYXNlIGVuZHMgYXQgb25jZS4KCiAgVGhlIHByb3BlciBmaXgsIGxlZnQgZm9yIHRoZSBmdXR1cmUsIGlzIG9mIGNvdXJzZSB0byBtYWtlIHRoZSBhY3RpdmUgRlRQCiAgY2FzZSB0byBhY3QgaW4gYSBub24tYmxvY2tpbmcgd2F5IHRvby4KCi0gTWF0dCBXaXRoZXJzcG9vbiBmaXhlZCBhIHByb2JsZW0gY2FzZSB3aGVuIHRoZSBDUFUgbG9hZCB3ZW50IHRvIDEwMCUgd2hlbiBhCiAgSFRUUCB1cGxvYWQgd2FzIGRpc2Nvbm5lY3RlZDoKCiAgIldoYXQgYXBwZWFycyB0byBiZSBoYXBwZW5pbmcgaXMgdGhhdCBteSBzeXN0ZW0gKExpbnV4IDIuNi4xNyBhbmQgMi42LjEzKSBpcwogIHNldHRpbmcgKm9ubHkqIFBPTExIVVAgb24gcG9sbCgpIHdoZW4gdGhlIGNvbmRpdGlvbnMgaW4gbXkgcHJldmlvdXMgbWFpbAogIG9jY3VyLiBBcyB5b3UgY2FuIHNlZSwgc2VsZWN0LmM6Q3VybF9zZWxlY3QoKSBkb2VzIG5vdCBjaGVjayBmb3IgUE9MTEhVUC4gU28KICBiYXNpY2FsbHkgd2hhdCB3YXMgaGFwcGVuaW5nLCBpcyBwb2xsKCkgd2FzIHJldHVybmluZyBpbW1lZGlhdGVseSAod2l0aAogIFBPTExIVVAgc2V0KSwgYnV0IHdoZW4gQ3VybF9zZWxlY3QoKSBsb29rZWQgYXQgdGhlIGJpdHMsIG5laXRoZXIgUE9MTEVSUiBvcgogIFBPTExPVVQgd2FzIHNldC4gVGhpcyBzdGlsbCBjYXVzZWQgQ3VybF9yZWFkd3JpdGUoKSB0byBiZSBjYWxsZWQsIHdoaWNoCiAgcXVpY2tseSByZXR1cm5lZC4gVGhlbiB0aGUgdHJhbnNmZXIoKSBsb29wIGtlcHQgY29udGludWluZyBhdCBmdWxsIHNwZWVkCiAgZm9yZXZlci4iCgpEYW5pZWwgKDEgRGVjZW1iZXIgMjAwNikKLSBUb29uIFZlcndhZXN0IHJlcG9ydGVkIHRoYXQgdGhlcmUgYXJlIHNlcnZlcnMgdGhhdCBzZW5kIHRoZSBDb250ZW50LVJhbmdlOgogIGhlYWRlciBpbiBhIHRoaXJkLCBub3Qgc3VwcHBvcnRlZCBieSBsaWJjdXJsLCBmb3JtYXQgYW5kIHdlIGFncmVlZCB0aGF0IHdlCiAgY291bGQgbWFrZSB0aGUgcGFyc2VyIG1vcmUgZm9yZ2l2aW5nIHRvIGFjY2VwdCBhbGwgdGhlIHRocmVlIGZvdW5kCiAgdmFyaWF0aW9ucy4KCkRhbmllbCAoMjUgTm92ZW1iZXIgMjAwNikKLSBWZW5rYXQgQWtlbGxhIGZvdW5kIG91dCB0aGF0IGxpYmN1cmwgZGlkIG5vdCBsaWtlIEhUVFAgcmVzcG9uc2VzIHRoYXQgc2ltcGx5CiAgcmVzcG9uZGVkIHdpdGggYSBzaW5nbGUgc3RhdHVzIGxpbmUgYW5kIG5vIGhlYWRlcnMgbm9yIGJvZHkuIFN0YXJ0aW5nIG5vdywgYQogIEhUVFAgcmVzcG9uc2Ugb24gYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gKGkuZSBub3Qgc2V0IHRvIGJlIGNsb3NlZCBhZnRlciB0aGUKICByZXNwb25zZSBoYXMgYmVlbiB0YWtlbiBjYXJlIG9mKSBtdXN0IGhhdmUgQ29udGVudC1MZW5ndGggb3IgY2h1bmtlZAogIGVuY29kaW5nIHNldCwgb3IgbGliY3VybCB3aWxsIHNpbXBseSBhc3N1bWUgdGhhdCB0aGVyZSBpcyBubyBib2R5LgoKICBUbyBteSBob3Jyb3IgSSBsZWFybmVkIHRoYXQgd2UgaGFkIG5vIGxlc3MgdGhhbiA1NyghKSB0ZXN0IGNhc2VzIHRoYXQgZGlkIGJhZAogIEhUVFAgcmVzcG9uc2VzIGxpa2UgdGhpcywgYW5kIGV2ZW4gdGhlIHRlc3QgaHR0cCBzZXJ2ZXIgKHN3cykgcmVzcG9uZGVkIGJhZGx5CiAgd2hlbiBxdWVyaWVkIGJ5IHRoZSB0ZXN0IHN5c3RlbSBpZiBpdCBpcyB0aGUgdGVzdCBzeXN0ZW0uIFNvIGFsdGhvdWdoIHRoZQogIGFjdHVhbCBmaXggZm9yIHRoZSBwcm9ibGVtIHdhcyB0aW55LCBnb2luZyB0aHJvdWdoIGFsbCB0aGUgbmV3bHkgZmFpbGluZyB0ZXN0CiAgY2FzZXMgZ290IHJlYWxseSBwYWluZnVsIGFuZCBib3JpbmcuCgpEYW5pZWwgKDI0IE5vdmVtYmVyIDIwMDYpCi0gSmFtZXMgSG91c2xleSBkaWQgbG90cyBvZiB3b3JrIGFuZCBpbnRyb2R1Y2VkIFNGVFAgZG93bmxvYWRzLgoKRGFuaWVsICgxMyBOb3ZlbWJlciAyMDA2KQotIFJvbiBpbiBidWcgIzE1OTUzNDggKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1OTUzNDgpIHBvaW50ZWQKICBvdXQgYSBzdGFjayBvdmVyd3JpdGUgKGFuZCB0aGUgY29ycmVzcG9uZGluZyBmaXgpIG9uIDY0Yml0IFdpbmRvd3Mgd2hlbgogIGRlYWxpbmcgd2l0aCBIVFRQIGNodW5rZWQgZW5jb2RpbmcuCgpEYW5pZWwgKDkgTm92ZW1iZXIgMjAwNikKLSBOaXIgU29mZmVyIHVwZGF0ZWQgbGliY3VybC5mcmFtZXdvcmsubWFrZToKICBvIGZpeCBzeW1saW5rcywgc2hvdWxkIGxpbmsgdG8gVmVyc2lvbnMsIG5vdCB0byAuL1ZlcnNpb25zCiAgbyBpbmRlbnRhdGlvbiBpbXByb3ZtZW50cwoKLSBEbWl0cml5IFNlcmdleWV2IGZvdW5kIGEgU0lHU0VHViB3aXRoIGhpcyB0ZXN0MDQuYyBleGFtcGxlIHBvc3RlZCBvbiA3IE5vdgogIDIwMDYuIEl0IHR1cm5lZCBvdXQgd2Ugd3JvbmdseSBhc3N1bWVkIHRoYXQgdGhlIGNvbm5lY3Rpb24gY2FjaGUgd2FzIHByZXNlbnQKICB3aGVuIHRlYXJpbmcgZG93biBhIGNvbm5lY3Rpb24uCgotIENpcHJpYW4gQmFkZXNjdSBmb3VuZCBhIFNJR1NFR1Ygd2hlbiBkb2luZyBtdWx0aXBsZSBURlRQIHRyYW5zZmVycyB1c2luZyB0aGUKICBtdWx0aSBpbnRlcmZhY2UsIGJ1dCBJIGNvdWxkIGFsc28gcmVwZWF0IGl0IGRvaW5nIG11bHRpcGxlIHNlcXVlbnRpYWwgb25lcwogIHdpdGggdGhlIGVhc3kgaW50ZXJmYWNlLiBVc2luZyBDaXByaWFuJ3MgdGVzdCBjYXNlLCBJIGNvdWxkIGZpeCBpdC4KCkRhbmllbCAoOCBOb3ZlbWJlciAyMDA2KQotIEJyYWRmb3JkIEJydWNlIHJlcG9ydGVkIHRoYXQgd2hlbiBzZXR0aW5nIENVUkxPUFRfREVCVUdGVU5DVElPTiB3aXRob3V0CiAgQ1VSTE9QVF9WRVJCT1NFIHNldCB0byBub24temVybywgeW91IHN0aWxsIGdvdCBhIGZldyBkZWJ1ZyBtZXNzYWdlcyBmcm9tIHRoZQogIFNTTCBoYW5kc2hha2UuIFRoaXMgaXMgbm93IHN0b3BwZWQuCgpEYW5pZWwgKDcgTm92ZW1iZXIgMjAwNikKLSBPbGFmIGZpeGVkIGEgbGVmdG92ZXIgcHJvYmxlbSB3aXRoIHRoZSBDT05ORUNUIGZpeCBvZiBoaXMgdGhhdCB3b3VsZCBsZWF2ZSBhCiAgd3JvbmcgZXJyb3IgbWVzc2FnZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSBidWZmZXIuCgpEYW5pZWwgKDMgTm92ZW1iZXIgMjAwNikKLSBPbGFmIFN0dWViZW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IEkgZWRpdGVkIHNsaWdodGx5LiBJdCBmaXhlcyB0aGUgbm90b3Jpb3VzCiAgS05PV05fQlVHUyAjMjUsIHdoaWNoIGhhcHBlbnMgd2hlbiBhIHByb3h5IGNsb3NlcyB0aGUgY29ubmVjdGlvbiB3aGVuCiAgbGliY3VybCBoYXMgc2VudCBDT05ORUNULCBhcyBwYXJ0IG9mIGFuIGF1dGhlbnRpY2F0aW9uIG5lZ290aWF0aW9uLiBTdGFydGluZwogIG5vdywgbGliY3VybCB3aWxsIHJlLWNvbm5lY3QgYWNjb3JkaW5nbHkgYW5kIGNvbnRpbnVlIHRoZSBhdXRoZW50aWNhdGlvbiBhcwogIGl0IHNob3VsZC4KCkRhbmllbCAoMiBOb3ZlbWJlciAyMDA2KQotIEphbWVzIEhvdXNsZXkgYnJvdWdodCBzdXBwb3J0IGZvciBTQ1AgdHJhbnNmZXJzLCBiYXNlZCBvbiB0aGUgbGlic3NoMiBsaWJyYXJ5CiAgZm9yIHRoZSBhY3R1YWwgbmV0d29yayBwcm90b2NvbCBzdHVmZi4KCiAgQWRkZWQgdGhlc2UgbmV3IGN1cmxfZWFzeV9zZXRvcHQoKSBvcHRpb25zOgoKICAgIENVUkxPUFRfU1NIX0FVVEhfVFlQRVMKICAgIENVUkxPUFRfU1NIX1BVQkxJQ19LRVlGSUxFCiAgICBDVVJMT1BUX1NTSF9QUklWQVRFX0tFWUZJTEUKClZlcnNpb24gNy4xNi4wICgzMCBPY3RvYmVyIDIwMDYpCgpEYW5pZWwgKDI1IE9jdG9iZXIgMjAwNikKLSBGaXhlZCBDVVJMT1BUX0ZBSUxPTkVSUk9SIHRvIHJldHVybiBDVVJMRV9IVFRQX1JFVFVSTkVEX0VSUk9SIGV2ZW4gZm9yIHRoZQogIGNhc2Ugd2hlbiA0MDEgb3IgNDA3IGFyZSByZXR1cm5lZCwgKklGKiBubyBhdXRoIGNyZWRlbnRpYWxzIGhhdmUgYmVlbiBnaXZlbi4KICBUaGUgQ1VSTE9QVF9GQUlMT05FUlJPUiBvcHRpb24gaXMgbm90IHBvc3NpYmxlIHRvIG1ha2UgZm9vbC1wcm9vZiBmb3IgNDAxCiAgYW5kIDQwNyBjYXNlcyB3aGVuIGF1dGggY3JlZGVudGlhbHMgaXMgZ2l2ZW4sIGJ1dCB3ZSd2ZSBub3cgY292ZXJlZCB0aGlzCiAgc29tZXdoYXQgbW9yZS4KCiAgWW91IG1pZ2h0IGdldCBzb21lIGFtb3VudHMgb2YgaGVhZGVycyB0cmFuc2ZlcnJlZCBiZWZvcmUgdGhpcyBzaXR1YXRpb24gaXMKICBkZXRlY3RlZCwgbGlrZSBmb3Igd2hlbiBhICIxMDAtY29udGludWUiIGlzIHJlY2VpdmVkIGFzIGEgcmVzcG9uc2UgdG8gYQogIFBPU1QvUFVUIGFuZCBhIDQwMSBvciA0MDcgaXMgcmVjZWl2ZWQgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcy4KCiAgQWRkZWQgdGVzdCAyODEgdG8gdmVyaWZ5IHRoaXMgY2hhbmdlLgoKRGFuaWVsICgyMyBPY3RvYmVyIDIwMDYpCi0gUmF2aSBQcmF0YXAgcHJvdmlkZWQgYSBtYWpvciB1cGRhdGUgd2l0aCBwaXBlbGluaW5nIGZpeGVzLiBXZSBhbHNvIG5vIGxvbmdlcgogIHJlLXVzZSBjb25uZWN0aW9ucyAoZm9yIHBpcGVsaW5pbmcpIGJlZm9yZSB0aGUgbmFtZSByZXNvbHZpbmcgaXMgZG9uZS4KCkRhbmllbCAoMjEgT2N0b2JlciAyMDA2KQotIE5pciBTb2ZmZXIgbWFkZSB0aGUgdGVzdHMvbGlidGVzdC9NYWtlZmlsZS5hbSB1c2UgYSBwcm9wZXIgdmFyaWFibGUgZm9yIGFsbAogIHRoZSBzaW5nbGUgdGVzdCBhcHBsaWNhdGlvbnMnIGxpbmsgYW5kIGRlcGVuZGVuY2VzLCBzbyB0aGF0IHlvdSBlYXNpZXIgY2FuCiAgb3ZlcnJpZGUgdGhvc2UgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHdoZW4gdXNpbmcgbWFrZS4KCi0gQXJtZWwgQXNzZWxpbiBzZXBhcmF0ZWQgQ0EgY2VydCB2ZXJpZmljYXRpb24gcHJvYmxlbXMgZnJvbSBwcm9ibGVtcyB3aXRoCiAgcmVhZGluZyB0aGUgKGxvY2FsKSBDQSBjZXJ0IGZpbGUgdG8gbGV0IHVzZXJzIGVhc2llciBwaW5wb2ludCB0aGUgYWN0dWFsCiAgcHJvYmxlbS4gQ1VSTEVfU1NMX0NBQ0VSVF9CQURGSUxFICg3NykgaXMgdGhlIG5ldyBsaWJjdXJsIGVycm9yIGNvZGUuCgpEYW5pZWwgKDE4IE9jdG9iZXIgMjAwNikKLSBSZW1vdmVkIHRoZSAicHJvdG9jb2wtZ3Vlc3NpbmciIGZvciBVUkxzIHdpdGggaG9zdCBuYW1lcyBzdGFydGluZyB3aXRoIEZUUFMKICBvciBURUxORVQgc2luY2UgdGhleSBhcmUgcHJhY3RpY2FsbHkgbm9uLWV4aXN0YW50LiBUaGlzIGxlYXZlcyB1cyB3aXRoIG9ubHkKICB0aHJlZSBkaWZmZXJlbnQgcHJlZml4ZXMgdGhhdCB3b3VsZCBhc3N1bWUgdGhlIHByb3RvY29sIGlzIGFueXRoaW5nIGJ1dAogIEhUVFAsIGFuZCB0aGV5IGFyZSBob3N0IG5hbWVzIHN0YXJ0aW5nIHdpdGggImZ0cC4iLCAiZGljdC4iIG9yICJsZGFwLiIuCgpEYW5pZWwgKDE3IE9jdG9iZXIgMjAwNikKLSBCdWcgcmVwb3J0ICMxNTc5MTcxIHBvaW50ZWQgb3V0IGNvZGUgZmxhd3MgZGV0ZWN0ZWQgd2l0aCAicHJlZmFzdCIsIGFuZCB0aGV5CiAgd2VyZSAxIC0gYSB0b28gc21hbGwgbWVtb3J5IGNsZWFyIHdpdGggbWVtc2V0KCkgaW4gdGhlIHRocmVhZGVkIHJlc29sdmVyIGFuZAogIDIgLSBhIHJhbmdlIG9mIHBvdGVudGlhbGx5IGJhZCB1c2VzIG9mIHRoZSBjdHlwZSBmYW1pbHkgb2YgaXMqKCkgZnVuY3Rpb25zCiAgc3VjaCBhcyBpc2RpZ2l0KCksIGlzYWxudW0oKSwgaXNwcmludCgpIGFuZCBtb3JlLiBUaGUgbGF0dGVyIG1hZGUgbWUgc3dpdGNoCiAgdG8gdXNpbmcgb3VyIG93biBzZXQgb2YgdGhlc2UgZnVuY3Rpb25zL21hY3JvcyB1c2luZyB1cHBlcmNhc2UgbGV0dGVycywgYW5kCiAgd2l0aCBzb21lIGV4dHJhIHNldCBvZiBjcmF6eSB0eXBlY2FzdHMgdG8gYXZvaWQgbWlzdGFraW5nbHkgcGFzc2luZyBpbgogIG5lZ2F0aXZlIG51bWJlcnMgdG8gdGhlIHVuZGVybHlpbmcgaXMqKCkgZnVuY3Rpb25zLgoKLSBXaXRoIEplZmYgUG9obG1leWVyJ3MgaGVscCwgSSBmaXhlZCB0aGUgZXhwaXJlIHRpbWVyIHdoZW4gdXNpbmcKICBjdXJsX211bHRpX3NvY2tldCgpIGR1cmluZyBuYW1lIHJlc29sdmVzIHdpdGggYy1hcmVzIGFuZCB0aGUgTE9XX1NQRUVECiAgb3B0aW9ucyBub3cgd29yayBmaW5lIHdpdGggY3VybF9tdWx0aV9zb2NrZXQoKSBhcyB3ZWxsLgoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDYpCi0gQWRkZWQgYSBjaGVjayBpbiBjb25maWd1cmUgdGhhdCBzaW1wbHkgdHJpZXMgdG8gcnVuIGEgcHJvZ3JhbSAobm90IHdoZW4KICBjcm9zcy1jb21waWxpbmcpIGluIG9yZGVyIHRvIGRldGVjdCBwcm9ibGVtcyB3aXRoIHJ1bi10aW1lIGxpYnJhcmllcyB0aGF0CiAgb3RoZXJ3aXNlIHdvdWxkIG9jY3VyIHdoZW4gdGhlIHNpemVvZiB0ZXN0cyBmb3IgY3VybF9vZmZfdCB3b3VsZCBydW4gYW5kCiAgdGh1cyBiZSBtdWNoIG1vcmUgY29uZnVzaW5nIHRvIHVzZXJzLiBUaGUgY2hlY2sgb2YgY291cnNlIHNob3VsZCBydW4gYWZ0ZXIKICBhbGwgbGliLWNoZWNrcyBhcmUgZG9uZSBhbmQgYmVmb3JlIGFueSBvdGhlciB0ZXN0IGlzIHVzZWQgdGhhdCB3b3VsZCBydW4gYW4KICBleGVjdXRhYmxlIGJ1aWx0IGZvciB0ZXN0aW5nLXB1cnBvc2VzLgoKRGFuIEYgKDEzIE9jdG9iZXIgMjAwNikKLSBUaGUgdGFnZ2luZyBvZiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgUE9TVCBib2R5IGRhdGEgc2VudAogIHRvIHRoZSBDVVJMT1BUX0RFQlVHRlVOQ1RJT04gY2FsbGJhY2sgaGFzIGJlZW4gZml4ZWQgKGl0IHdhcyBlcnJvbmVvdXNseQogIGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIGhlYWRlcikuICBBIG1lc3NhZ2Ugd2FzIGFsc28gYWRkZWQgdG8gdGhlCiAgY29tbWFuZCBsaW5lIHRvb2wgdG8gc2hvdyB3aGVuIGRhdGEgaXMgYmVpbmcgc2VudCwgZW5hYmxlZCB3aGVuCiAgLS12ZXJib3NlIGlzIHVzZWQuCgpEYW5pZWwgKDEyIE9jdG9iZXIgMjAwNikKLSBTdGFydGluZyBub3csIGFkZGluZyBhbiBlYXN5IGhhbmRsZSB0byBhIG11bHRpIHN0YWNrIHRoYXQgd2FzIGFscmVhZHkgYWRkZWQKICB0byBhIG11bHRpIHN0YWNrIHdpbGwgY2F1c2UgQ1VSTE1fQkFEX0VBU1lfSEFORExFIHRvIGdldCByZXR1cm5lZC4KCi0gSmVmZiBQb2hsbWV5ZXIgaGFzIGJlZW4gd29ya2luZyB3aXRoIHRoZSBoaXBlcmZpZm8uYyBleGFtcGxlIHNvdXJjZSBjb2RlLAogIGFuZCB3aGlsZSBkb2luZyBzbyBpdCBiZWNhbWUgYXBwYXJlbnQgdGhhdCB0aGUgY3VycmVudCB0aW1lb3V0IHN5c3RlbSBmb3IKICB0aGUgc29ja2V0IEFQSSByZWFsbHkgd2FzIGEgYml0IGF3a3dhcmQgc2luY2UgaXQgYmVjb21lIHF1aXRlIHNvbWUgd29yayB0bwogIGJlIHN1cmUgd2UgaGF2ZSB0aGUgY29ycmVjdCB0aW1lb3V0IHNldC4KCiAgSmVmZiB0aGVuIHByb3ZpZGVkIHRoZSBuZXcgQ1VSTE1PUFRfVElNRVJGVU5DVElPTiB0aGF0IGlzIHlldCBhbm90aGVyCiAgY2FsbGJhY2sgdGhlIGFwcCBjYW4gc2V0IHRvIGdldCB0byBrbm93IHdoZW4gdGhlIGdlbmVyYWwgdGltZW91dCB0aW1lCiAgY2hhbmdlcyBhbmQgdGh1cyBmb3IgYW4gYXBwbGljYXRpb24gbGlrZSBoaXBlcmZpZm8uYyBpdCBtYWtlcyBldmVyeXRoaW5nIGEKICBsb3QgZWFzaWVyIGFuZCBuaWNlci4gVGhlcmUncyBhIENVUkxNT1BUX1RJTUVSREFUQSBvcHRpb24gdG9vIG9mIGNvdXJzZSBpbgogIGdvb2Qgb2xkIGxpYmN1cmwgdHJhZGl0aW9uLgoKICBKZWZmIGhhcyBhbHNvIHVwZGF0ZWQgdGhlIGhpcGVyZmlmby5jIGV4YW1wbGUgY29kZSB0byB1c2UgdGhpcyBuZXdzLgoKRGFuaWVsICg5IE9jdG9iZXIgMjAwNikKLSBCb2dkYW4gTmljdWxhJ3Mgc2Vjb25kIHRlc3QgY2FzZSAocG9zdGVkIFN1biwgMDggT2N0IDIwMDYpIGNvbnZlcnRlZCB0byB0ZXN0CiAgY2FzZSA1MzUgYW5kIGl0IG5vdyBydW5zIGZpbmUuIEFnYWluIGEgcHJvYmxlbSB3aXRoIHRoZSBwaXBlbGluaW5nIGNvZGUgbm90CiAgdGFraW5nIGFsbCBwb3NzaWJsZSAoZXJyb3IpIGNvbmRpdGlvbnMgaW50byBhY2NvdW50LgoKRGFuaWVsICg2IE9jdG9iZXIgMjAwNikKLSBCb2dkYW4gTmljdWxhJ3MgaGFuZ2luZyB0ZXN0IGNhc2UgKHBvc3RlZCBXZWQsIDA0IE9jdCAyMDA2KSB3YXMgY29udmVydGVkIHRvCiAgdGVzdCBjYXNlIDUzMyBhbmQgdGhlIHRlc3Qgbm93IHJ1bnMgZmluZS4KCkRhbmllbCAoNCBPY3RvYmVyIDIwMDYpCi0gRG1pdHJpeSBTZXJnZXlldiBwcm92aWRlZCBhbiBleGFtcGxlIHNvdXJjZSBjb2RlIHRoYXQgY3Jhc2hlZCBDVlMgbGliY3VybAogIGJ1dCB0aGF0IHdvcmtlZCBuaWNlbHkgaW4gNy4xNS41LiBJIGNvbnZlcnRlZCBpdCBpbnRvIHRlc3QgY2FzZSA1MzIgYW5kCiAgZml4ZWQgdGhlIHByb2JsZW0uCgpEYW5pZWwgKDI5IFNlcHRlbWJlciAyMDA2KQotIFJlbW92ZWQgYSBmZXcgb3RoZXIgbm8tbG9uZ2VyIHByZXNlbnQgb3B0aW9ucyBmcm9tIHRoZSBoZWFkZXIgZmlsZS4KCi0gU3VwcG9ydCBmb3IgRlRQIHRoaXJkIHBhcnR5IHRyYW5zZmVycyB3YXMgcmVtb3ZlZC4gSGVyZSdzIHdoeToKCiAgbyBUaGUgcmVjZW50IG11bHRpIGludGVyZmFjZSBjaGFuZ2VzIGJyb2tlIGl0IGFuZCB0aGUgZGVzaWduIG9mIHRoZSAzcmQgcGFydHkKICAgIHRyYW5zZmVycyBtYWRlIGl0IHZlcnkgaGFyZCB0byBmaXggdGhlIHByb2JsZW1zCiAgbyBJdCB3YXMgc3RpbGwgYmxvY2tpbmcgYW5kIHRodXMgbmFzdHkgZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UKICBvIEl0IHdhcyBhIGxvdCBvZiBleHRyYSBjb2RlIGZvciBhIHZlcnkgcmFyZWx5IHVzZWQgZmVhdHVyZQogIG8gSXQgZGlkbid0IHVzZSB0aGUgc2FtZSBjb2RlIGFzIGZvciAicGxhaW4iIEZUUCB0cmFuc2ZlcnMsIHNvIGl0IGRpZG4ndCB3b3JrCiAgICBmaW5lIGZvciBJUHY2IGFuZCBpdCBkaWRuJ3QgcHJvcGVybHkgcmUtdXNlIGNvbm5lY3Rpb25zIGFuZCBtb3JlCiAgbyBUaGVyZSdzIG5vYm9keSBhcm91bmQgd2hvJ3Mgd2lsbGluZyB0byB3b3JrIG9uIGFuZCBpbXByb3ZlIHRoZSBleGlzdGluZwogICAgY29kZQoKICBUaGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGlyZCBwYXJ0eSB0cmFuc2ZlcnMgYXJlIGJhbm5lZCBmb3JldmVyLCBvbmx5IHRoYXQKICB0aGV5IG5lZWQgdG8gYmUgZG9uZSBiZXR0ZXIgaWYgdGhleSBhcmUgdG8gYmUgcmUtYWRkZWQgaW4gdGhlIGZ1dHVyZS4KCiAgVGhlIENVUkxPUFRfU09VUkNFXyogb3B0aW9ucyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBsaWIgYW5kIHNvIGFyZSB0aGUgLS0zcCoKICBvcHRpb25zIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0b29sLiBGb3IgdGhpcyByZWFzb24sIEkgYWxzbyBidW1wZWQgdGhlCiAgdmVyc2lvbiBpbmZvIGZvciB0aGUgbGliLgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwNikKLSBSZXBvcnRlZCBpbiAjMTU2MTQ3MCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTU2MTQ3MCksIGxpYmN1cmwKICB3b3VsZCBjcmFzaCBpZiBhIGJhZCBmdW5jdGlvbiBzZXF1ZW5jZSB3YXMgdXNlZCB3aGVuIHNodXR0aW5nIGRvd24gYWZ0ZXIKICB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIChpLmUgdXNpbmcgZWFzeV9jbGVhbnVwIGFmdGVyIG11bHRpX2NsZWFudXApIHNvCiAgcHJlY2F1dGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGFueSBtb3JlIC0gdGVzdCBjYXNlIDUyOQogIHdhcyBhZGRlZCB0byB2ZXJpZnkuCgpEYW5pZWwgKDI3IFNlcHRlbWJlciAyMDA2KQotIFRoZSBVUkwgaW4gdGhlIGNvb2tpZSBqYXIgZmlsZSBpcyBub3cgY2hhbmdlZCBzaW5jZSBpdCB3YXMgZ2l2aW5nIGEgNDA0LgogIFJlcG9ydGVkIGJ5IFRpbW90aHkgU3RvbmUuIFRoZSBuZXcgVVJMIHdpbGwgdGFrZSB0aGUgdmlzaXRvciB0byBhIGN1cmwgd2ViCiAgc2l0ZSBtaXJyb3Igd2l0aCB0aGUgZG9jdW1lbnQuCgpEYW5pZWwgKDI0IFNlcHRlbWJlciAyMDA2KQotIEJlcm5hcmQgTGVhayBmaXhlZCBjb25maWd1cmUgLS13aXRoLWdzc2FwaS1saWJzLgoKLSBDb3J5IE5lbHNvbiBtYWRlIGxpYmN1cmwgdXNlIHRoZSBXU0FQb2xsKCkgZnVuY3Rpb24gaWYgYnVpbHQgZm9yIFdpbmRvd3MKICBWaXN0YSAoX1dJTjMyX1dJTk5UID49IDB4MDYwMCkKCkRhbmllbCAoMjMgU2VwdGVtYmVyIDIwMDYpCi0gTWlrZSBQcm90dHMgYWRkZWQgLS1mdHAtc3NsLWNvbnRyb2wgdG8gbWFrZSBjdXJsIHVzZSBGVFAtU1NMLCBidXQgb25seQogIGVuY3J5cHQgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBhbmQgdXNlIHRoZSBkYXRhIGNvbm5lY3Rpb24gInBsYWluIi4KCi0gRG1pdHJpeSBTZXJnZXlldiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFkZSB0aGUgU09DS1NbNDVdIGNvZGUgd29yayBiZXR0ZXIKICBhcyBpdCBub3cgd2lsbCByZWFkIHRoZSBmdWxsIGRhdGEgc2VudCBmcm9tIHNlcnZlcnMuIFRoZSBTT0NLUy1yZWxhdGVkIGNvZGUKICB3YXMgYWxzbyBtb3ZlZCB0byB0aGUgbmV3IGxpYi9zb2Nrcy5jIHNvdXJjZSBmaWxlLgoKRGFuaWVsICgyMSBTZXB0ZW1iZXIgMjAwNikKLSBBZGRlZCB0ZXN0IGNhc2UgNTMxIGluIGFuIGF0dGVtcHQgdG8gcmVwZWF0IGJ1ZyByZXBvcnQgIzE1NjE0NzAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTU2MTQ3MCkgdGhhdCBpcyBzYWlkIHRvIGNyYXNoIHdoZW4gYW4KICBGVFAgdXBsb2FkIGZhaWxzIHdpdGggdGhlIG11bHRpIGludGVyZmFjZS4gSXQgZGlkIG5vdCwgYnV0IEkgbWFkZSBhIGZhaWxlZAogIHVwbG9hZCBzdGlsbCBhc3N1bWUgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiB0byBiZSBmaW5lLgoKRGFuaWVsICgyMCBTZXB0ZW1iZXIgMjAwNikKLSBBcm1lbCBBc3NlbGluIGZpeGVkIHByb2JsZW1zIHdoZW4geW91IGdhdmUgYSBwcm94eSBVUkwgd2l0aCB1c2VyIG5hbWUgYW5kCiAgZW1wdHkgcGFzc3dvcmQgb3Igbm8gcGFzc3dvcmQgYXQgYWxsLiBUZXN0IGNhc2UgMjc4IGFuZCAyNzkgd2VyZSBhZGRlZCB0bwogIHZlcmlmeS4KCkRhbmllbCAoMTIgU2VwdGVtYmVyIDIwMDYpCi0gQWRkZWQgZG9jcy9leGFtcGxlcy8xMC1hdC1hLXRpbWUuYyBieSBNaWNoYWVsIFdhbGxuZXIKCi0gQWRkZWQgZG9jcy9leGFtcGxlcy9oaXBlcmZpZm8uYyBieSBKZWZmIFBvaGxtZXllcgoKRGFuaWVsICgxMSBTZXB0ZW1iZXIgMjAwNikKLSBGaXhlZCBteSBicmVha2FnZSBmcm9tIGVhcmxpZXIgdG9kYXkgc28gdGhhdCBkb2luZyBjdXJsX2Vhc3lfY2xlYW51cCgpIG9uIGEKICBoYW5kbGUgdGhhdCBpcyBwYXJ0IG9mIGEgbXVsdGkgaGFuZGxlIGZpcnN0IHJlbW92ZXMgdGhlIGhhbmRsZSBmcm9tIHRoZQogIHN0YWNrLgoKLSBBZGRlZCBDVVJMT1BUX1NTTF9TRVNTSU9OSURfQ0FDSEUgYW5kIC0tbm8tc2Vzc2lvbmlkIHRvIGRpc2FibGUgU1NMCiAgc2Vzc2lvbi1JRCByZS11c2Ugb24gZGVtYW5kIHNpbmNlIHRoZXJlIG9idmlvdXNseSBhcmUgYnJva2VuIHNlcnZlcnMgb3V0CiAgdGhlcmUgdGhhdCBtaXNiZWhhdmUgd2l0aCBzZXNzaW9uLUlEcyB1c2VkLgoKLSBKZWZmIFBvaGxtZXllciBwcmVzZW50ZWQgYSAqbXVsdGlfc29ja2V0KCktdXNpbmcgcHJvZ3JhbSB0aGF0IGV4cG9zZWQgYQogIHByb2JsZW0gd2l0aCBpdCAoU0lHU0VHVi1zdHlsZSkuIEl0IGNsZWFybHkgc2hvd2VkIHRoYXQgdGhlIGV4aXN0aW5nCiAgc29ja2V0LXN0YXRlIGFuZCBzdGF0ZS1kaWZmZXJlbmNlIGZ1bmN0aW9uIHdhc24ndCBnb29kIGVub3VnaCBzbyBJIHJld3JvdGUKICBpdCBhbmQgY291bGQgdGhlbiByZS1ydW4gSmVmZidzIHByb2dyYW0gd2l0aG91dCBhbnkgY3Jhc2guIFRoZSBwcmV2aW91cwogIHZlcnNpb24gY2xlYXJseSBjb3VsZCBtaXNzIHRvIHRlbGwgdGhlIGFwcGxpY2F0aW9uIHdoZW4gYSBoYW5kbGUgY2hhbmdlZAogIGZyb20gdXNpbmcgb25lIHNvY2tldCB0byB1c2luZyBhbm90aGVyLgoKICBXaGlsZSBJIHdhcyBhdCBpdCAoYXMgSSBjb3VsZCB1c2UgdGhpcyBhcyBhIG1lYW5zIHRvIHRyYWNrIHRoaXMgcHJvYmxlbQogIGRvd24pLCBJJ3ZlIG5vdyBhZGRlZCBhICdtYWdpYycgbnVtYmVyIHRvIHRoZSBlYXN5IGhhbmRsZSBzdHJ1Y3QgdGhhdCBpcwogIGluaXRlZCBhdCBjdXJsX2Vhc3lfaW5pdCgpIHRpbWUgYW5kIGNsZWFyZWQgYXQgY3VybF9lYXN5X2NsZWFudXAoKSB0aW1lIHRoYXQKICB3ZSBjYW4gdXNlIGludGVybmFsbHkgdG8gZGV0ZWN0IHRoYXQgYW4gZWFzeSBoYW5kbGUgc2VlbXMgdG8gYmUgZmluZSwgb3IgYXQKICBsZWFzdCBub3QgY2xvc2VkIG9yIGZyZWVkIChmcmVlaW5nIGluIGRlYnVnIGJ1aWxkcyBmaWxsIHRoZSBhcmVhIHdpdGggMHgxMwogIGJ5dGVzIGJ1dCBpbiBub3JtYWwgYnVpbGRzIHdlIGNhbiBvZiBjb3Vyc2Ugbm90IGFzc3VtZSBhbnkgcGFydGljdWxhciBkYXRhCiAgaW4gdGhlIGZyZWVkIGFyZWFzKS4KCkRhbmllbCAoOSBTZXB0ZW1iZXIgMjAwNikKLSBNaWNoZWxlIEJpbmkgZml4ZWQgaG93IHRoZSBob3N0bmFtZSBpcyBwdXQgaW4gTlRMTSBwYWNrYWdlcy4gQXMgc2VydmVycwogIGRvbid0IGV4cGVjdCBmdWxseSBxdWFsaWZpZWQgbmFtZXMgd2UgbmVlZCB0byBjdXQgdGhlbSBvZmYgYXQgdGhlIGZpcnN0IGRvdC4KCi0gUGV0ZXIgU3lsdmVzdGVyIGNsZWFuZWQgdXAgYW5kIGZpeGVkIHRoZSBnZXRzb2NrbmFtZSgpIHVzZXMgaW4gZnRwLmMuIFNvbWUKICBvZiB0aGVtIGNhbiBiZSBjb21wbGV0ZXRseSByZW1vdmVkIHRob3VnaC4uLgoKRGFuaWVsICg2IFNlcHRlbWJlciAyMDA2KQotIFJhdmkgUHJhdGFwIGFuZCBJIGhhdmUgaW1wbGVtZW50ZWQgSFRUUCBQaXBlbGluaW5nIHN1cHBvcnQuIEVuYWJsZSBpdCBmb3IgYQogIG11bHRpIGhhbmRsZSB1c2luZyBDVVJMTU9QVF9QSVBFTElOSU5HIGFuZCBhbGwgSFRUUCBjb25uZWN0aW9ucyBkb25lIG9uIHRoYXQKICBoYW5kbGUgd2lsbCBiZSBhdHRlbXB0ZWQgdG8gZ2V0IHBpcGVsaW5lZCBpbnN0ZWFkIG9mIGRvbmUgaW4gcGFyYWxsZWxsIGFzCiAgdGhleSBhcmUgcGVyZm9ybWVkIG90aGVyd2lzZS4KCiAgQXMgYSBzaWRlLWVmZmVjdCBmcm9tIHRoaXMgd29yaywgY29ubmVjdGlvbnMgYXJlIG5vdyBzaGFyZWQgYmV0d2VlbiBhbGwgZWFzeQogIGhhbmRsZXMgd2l0aGluIGEgbXVsdGkgaGFuZGxlLCBzbyBpZiB5b3UgdXNlIE4gZWFzeSBoYW5kbGVzIGZvciB0cmFuc2ZlcnMsCiAgZWFjaCBvZiB0aGVtIGNhbiBwaWNrIHVwIGFuZCByZS11c2UgYSBjb25uZWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgdXNlZCBieQogIGFueSBvZiB0aGUgaGFuZGxlcywgYmUgaXQgdGhlIHNhbWUgb3Igb25lIG9mIHRoZSBvdGhlcnMuCgogIFRoaXMgc2VwYXJhdGlvbiBvZiB0aGUgdGlnaHQgcmVsYXRpb25zaGlwIGJldHdlZW4gY29ubmVjdGlvbnMgYW5kIGVhc3kKICBoYW5kbGVzIGlzIG1vc3Qgbm90aWNhYmxlIHdoZW4geW91IGNsb3NlIGVhc3kgaGFuZGxlcyB0aGF0IGhhdmUgYmVlbiB1c2VkIGluCiAgYSBtdWx0aSBoYW5kbGUgYW5kIGNoZWNrIGFtb3VudCBvZiB1c2VkIG1lbW9yeSBvciB3YXRjaCB0aGUgZGVidWcgb3V0cHV0LCBhcwogIHRoZXJlIGFyZSB0aW1lcyB3aGVuIGxpYmN1cmwgd2lsbCBrZWVwIHRoZSBlYXN5IGhhbmRsZSBhcm91bmQgZm9yIGEgd2hpbGUKICBsb25nZXIgdG8gYmUgYWJsZSB0byBjbG9zZSBpdCBwcm9wZXJseS4gTGlrZSBmb3Igc2VuZGluZyBRVUlUIHRvIGNsb3NlIGRvd24KICBhbiBGVFAgY29ubmVjdGlvbi4KCiAgVGhpcyBpcyBhIG1ham9yIGNoYW5nZS4KICAKRGFuaWVsICg0IFNlcHRlbWJlciAyMDA2KQotIERtaXRyeSBSZWNoa2luIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTUxNDEyKSBwcm92aWRlZCBhCiAgcGF0Y2ggdGhhdCB3aGlsZSBub3QgZml4aW5nIHRoaW5ncyB2ZXJ5IG5pY2VseSwgaXQgZG9lcyBtYWtlIHRoZSBTT0NLUzUKICBwcm94eSBjb25uZWN0aW9uIHNsaWdodGx5IGJldHRlciBhcyBpdCBub3cgYWNrbm93bGVkZ2VzIHRoZSB0aW1lb3V0IGZvcgogIGNvbm5lY3Rpb24gYW5kIGl0IG5vIGxvbmdlciBzZWdmYXVsdHMgaW4gdGhlIGNhc2Ugd2hlbiBTT0NLUyByZXF1aXJlcwogIGF1dGhlbnRpY2F0aW9uIGFuZCB5b3UgZGlkIG5vdCBzcGVjaWZ5IHVzZXJuYW1lOnBhc3N3b3JkLgoKRGFuaWVsICgzMSBBdWd1c3QgMjAwNikKLSBEbWl0cml5IFNlcmdleWV2IGZvdW5kIGFuZCBmaXhlZCBhIG11bHRpIGludGVyZmFjZSBmbGF3IHdoZW4gdXNpbmcgYXN5bmNoCiAgbmFtZSByZXNvbHZlcy4gSXQgY291bGQgZ2V0IHN0dWNrIGluIHRoZSB3cm9uZyBzdGF0ZS4KCkdpc2xlICgyOSBBdWd1c3QgMjAwNikKLSBBZGRlZCBzdXBwb3J0IGZvciBvdGhlciBNUy1ET1MgY29tcGlsZXJzIChkZXNpZGVzIGRqZ3BwKS4gQWxsIE1TLURPUwogIGNvbXBpbGVyIG5vdyB1c2VzIHRoZSBzYW1lIGNvbmZpZy5kb3MgZmlsZSAocmVuYW1lZCB0byBjb25maWcuaCBieQogIG1ha2UpLiBsaWJjdXJsIG5vdyBidWlsZHMgZmluZSB1c2luZyBXYXRjb20gYW5kIE1ldGF3YXJlJ3MgSGlnaC1DCiAgdXNpbmcgdGhlIFdhdHQtMzIgdGNwL2lwLXN0YWNrLgoKRGFuaWVsICgyOSBBdWd1c3QgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBhZGRlZCBDVVJMT1BUX1NPQ0tPUFRGVU5DVElPTiBhbmQgQ1VSTE9QVF9TT0NLT1BUREFUQSB0bwogIGFsbG93IGFwcGxpY2F0aW9ucyB0byBzZXQgdGhlaXIgb3duIHNvY2tldCBvcHRpb25zLgoKRGFuaWVsICgyNSBBdWd1c3QgMjAwNikKLSBBcm1lbCBBc3NlbGluIHJlcG9ydGVkIHRoYXQgdGhlICdydW5uaW5nX2hhbmRsZXMnIGNvdW50ZXIgd2Fzbid0IHVwZGF0ZWQKICBwcm9wZXJseSBpZiB5b3UgcmVtb3ZlZCBhICJsaXZlIiBoYW5kbGUgZnJvbSBhIG11bHRpIGhhbmRsZSB3aXRoCiAgY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCkuCgpEYW5pZWwgKDIyIEF1Z3VzdCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIGEgcmVtYWluaW5nIG1pc3Rha2UgZnJvbSB0aGUgQXVndXN0IDE5IFRZUEUgY2hhbmdlLgoKLSBQZXRlciBTeWx2ZXN0ZXIgcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSBBbGxvd1NlcnZlckNvbm5lY3QoKSBpbiB0aGUgRlRQCiAgY29kZSB3aGVuIGRvaW5nIHB1cmUgaXB2NiBFUFJUIGNvbm5lY3Rpb25zLgoKRGFuaWVsICgxOSBBdWd1c3QgMjAwNikKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEFybWVsIEFzc2VsaW4sIHRoZSBGVFAgY29kZSBubyBsb25nZXIgcmUtaXNzdWVzIHRoZSBUWVBFCiAgY29tbWFuZCBvbiBzdWJzZXF1ZW50IHJlcXVlc3RzIG9uIGEgcmUtdXNlZCBjb25uZWN0aW9uIHVubGVzcyBpdCBoYXMgdG8uCgotIEFybWVsIEFzc2VsaW4gZml4ZWQgYSBjcmFzaCBpbiB0aGUgRlRQIGNvZGUgd2hlbiB1c2luZyBTSU5HTEVDV0QgbW9kZSBhbmQKICBmaWxlcyBpbiB0aGUgcm9vdCBkaXJlY3RvcnkuCgotIEFuZHJldyBCaWdncyBwb2ludGVkIG91dCBhICJFeHBlY3Q6IDEwMC1jb250aW51ZSIgZmxhdyB3aGVyZSBsaWJjdXJsIGRpZG4ndAogIHNlbmQgdGhlIHdob2xlIHJlcXVlc3QgYXQgb25jZSwgZXZlbiB0aG91Z2ggdGhlIEV4cGVjdDogaGVhZGVyIHdhcyBkaXNhYmxlZAogIGJ5IHRoZSBhcHBsaWNhdGlvbi4gQW4gZWZmZWN0IG9mIHRoaXMgY2hhbmdlIGlzIGFsc28gdGhhdCBzbWFsbCAoPCAxMDI0CiAgYnl0ZXMpIFBPU1RzIGFyZSBub3cgYWx3YXlzIHNlbnQgd2l0aG91dCBFeHBlY3Q6IGhlYWRlciBzaW5jZSB3ZSBkZWVtIGl0CiAgbW9yZSBjb3N0bHkgdG8gYm90aGVyIGFib3V0IHRoYXQgdGhhbiB0aGUgcmlzayB0aGF0IHdlIHNlbmQgdGhlIGRhdGEgaW4KICB2YWluLgoKRGFuaWVsICg5IEF1Z3VzdCAyMDA2KQotIEFybWVsIEFzc2VsaW4gbWFkZSB0aGUgQ1VSTE9QVF9QUkVRVU9URSBvcHRpb24gd29yayBmaW5lIGV2ZW4gd2hlbgogIENVUkxPUFRfTk9CT0RZIGlzIHNldCB0cnVlLiBQUkVRVU9URSBpcyB0aGVuIHJ1biByb3VnaGx5IGF0IHRoZSBzYW1lIHBsYWNlCiAgaW4gdGhlIGNvbW1hbmQgc2VxdWVuY2UgYXMgaXQgd291bGQgaGF2ZSBydW4gaWYgdGhlcmUgd291bGQndmUgYmVlbiBhCiAgdHJhbnNmZXIuCgpEYW5pZWwgKDggQXVndXN0IDIwMDYpCi0gRml4ZWQgYSBmbGF3IGluIHRoZSAiRXhwZWN0OiAxMDAtY29udGludWUiIHRyZWF0bWVudC4gSWYgeW91IGRpZCB0d28gUE9TVHMKICBvbiBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBhbmQgYWxsb3dlZCB0aGUgZmlyc3QgdG8gdXNlIHRoYXQgaGVhZGVyLCB5b3UKICBjb3VsZCBub3QgZGlzYWJsZSBpdCBmb3IgdGhlIHNlY29uZCByZXF1ZXN0LgoKRGFuaWVsICg3IEF1Z3VzdCAyMDA2KQotIERvbWVuaWNvIEFuZHJlb2xmb3VuZCBhIHF1aWNrIGJ1aWxkIGVycm9yIHdoaWNoIGhhcHBlbmVkIGJlY2F1c2UKICBzcmMvY29uZmlnLmguaW4gd2FzIG5vdCBhIHByb3BlciBkdXBsY2F0ZSBvZiBsaWIvY29uZmlnLmguaW4gd2hpY2ggaXQKICBzaG91bGQndmUgYmVlbiBhbmQgdGhpcyB3YXMgZHVlIHRvIHRoZSBtYWtldGd6IHNjcmlwdCBub3QgZG9pbmcgdGhlIGNwCiAgcHJvcGVybHkuCgpWZXJzaW9uIDcuMTUuNSAoNyBBdWd1c3QgMjAwNikKCkRhbmllbCAoMiBBdWd1c3QgMjAwNikKLSBNYXJrIExlbnRjem5lciBmaXhlZCBob3cgbGliY3VybCB3YXMgbm90IHByb3Blcmx5IGRvaW5nIGNodW5rZWQgZW5jb2RpbmcKICBpZiB0aGUgaGVhZGVyICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCIgd2FzIHNldCBieSB0aGUgYXBwbGljYXRpb24uCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTUzMTgzOAoKRGFuaWVsICgxIEF1Z3VzdCAyMDA2KQotIE1hY2llaiBLYXJwaXVrIGZpeGVkIGEgY3Jhc2ggdGhhdCB3b3VsZCBvY2N1ciBpZiB3ZSBwYXNzZWQgQ3VybF9zdHJlcnJvcigpCiAgYW4gdW5rbm93biBlcnJvciBudW1iZXIgb24gZ2xpYmMgc3lzdGVtcy4KICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTMyMjg5CgpEYW5pZWwgKDMxIEp1bHkgMjAwNikKLSAqQUxFUlQqIGN1cmxfbXVsdGlfc29ja2V0KCkgYW5kIGN1cmxfbXVsdGlfc29ja2V0X2FsbCgpIGdvdCBtb2RpZmllZAogIHByb3RvdHlwZXM6IHRoZXkgYm90aCBub3cgcHJvdmlkZSB0aGUgbnVtYmVyIG9mIHJ1bm5pbmcgaGFuZGxlcyBiYWNrIHRvIHRoZQogIGNhbGxpbmcgZnVuY3Rpb24uIEl0IG1ha2VzIHRoZSBmdW5jdGlvbnMgcmVzZW1ibGUgdGhlIGdvb2Qgb2xkCiAgY3VybF9tdWx0aV9wZXJmb3JtKCkgbW9yZSBhbmQgcHJvdmlkZXMgYSBuaWNlIHdheSB0byBrbm93IHdoZW4gdGhlIG11bHRpCiAgaGFuZGxlIGdvZXMgZW1wdHkuCgogIEFMRVJUMjogZG9uJ3QgdXNlIHRoZSBjdXJsX211bHRpX3NvY2tldCooKSBmdW5jdGlvbmFsaXR5IGluIGFueXRoaW5nCiAgcHJvZHVjdGlvbi1saWtlIHVudGlsIEkgc2F5IGl0J3Mgc29tZXdoYXQgc2V0dGxlZCwgYXMgSSBzdXNwZWN0IHRoZXJlIG1pZ2h0CiAgYmUgc29tZSBmdXJ0aGVyIEFQSSBjaGFuZ2VzIGJlZm9yZSBJJ20gZG9uZS4uLgoKRGFuaWVsICgyOCBKdWx5IDIwMDYpCi0gWXZlcyBMZWpldW5lIGZpeGVkIHNvIHRoYXQgcmVwbGFjaW5nIENvbnRlbnQtVHlwZTogd2hlbiBkb2luZyBtdWx0aXBhcnQKICBmb3JtcG9zdHMgd29yayBleGFjdGx5IHRoZSB3YXkgeW91IHdhbnQgaXQgKGFuZCB0aGUgd2F5IHlvdSdkIGFzc3VtZSBpdAogIHdvcmtzKS4KCkRhbmllbCAoMjcgSnVseSAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGFkZGVkIC0tZnRwLXNzbC1yZXFkIHdoaWNoIG1ha2VzIGN1cmwgKnJlcXVpcmUqIFNTTCBmb3IgYm90aAogIGNvbnRyb2wgYW5kIGRhdGEgY29ubmVjdGlvbiwgYXMgdGhlIGV4aXN0aW5nIC0tZnRwLXNzbCBvcHRpb24gb25seSByZXF1ZXN0cwogIGl0LgoKLSBbSGlwZXItcmVsYXRlZCB3b3JrXSBBZGRlZCBhIGZ1bmN0aW9uIGNhbGxlZCBjdXJsX211bHRpX2Fzc2lnbigpIHRoYXQgd2lsbAogIHNldCBhIHByaXZhdGUgcG9pbnRlciBhZGRlZCB0byB0aGUgaW50ZXJuYWwgbGliY3VybCBoYXNoIHRhYmxlIGZvciB0aGUKICBwYXJ0aWN1bGFyIHNvY2tldCBwYXNzZWQgaW4gdG8gdGhpcyBmdW5jdGlvbjoKCiAgQ1VSTE1jb2RlIGN1cmxfbXVsdGlfYXNzaWduKENVUkxNICptdWx0aV9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfc29ja2V0X3Qgc29ja2ZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzb2NrcCk7CgogICdzb2NrcCcgYmVpbmcgYSBjdXN0b20gcG9pbnRlciBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGFzc29jaWF0ZWQgd2l0aAogIHRoaXMgc29ja2V0LiBUaGUgc29ja2V0IGhhcyB0byBiZSBhbHJlYWR5IGV4aXN0aW5nIGFuZCBpbi11c2UgYnkgbGliY3VybCwKICBsaWtlIGhhdmluZyBhbHJlYWR5IGNhbGxlZCB0aGUgY2FsbGJhY2sgdGVsbGluZyBhYm91dCBpdHMgZXhpc3RhbmNlLgoKICBUaGUgc2V0IGhhc2hwIHBvaW50ZXIgd2lsbCB0aGVuIGJlIHBhc3NlZCBvbiB0byB0aGUgY2FsbGJhY2sgaW4gdXBjb21pbmcKICBjYWxscyB3aGVuIHRoaXMgc2FtZSBzb2NrZXQgaXMgdXNlZCAoaW4gdGhlIGJyYW5kIG5ldyAnc29ja2V0cCcgYXJndW1lbnQpLgoKRGFuaWVsICgyNiBKdWx5IDIwMDYpCi0gRGFuIE5lbHNvbiBhZGRlZCB0aGUgQ1VSTE9QVF9GVFBfQUxURVJOQVRJVkVfVE9fVVNFUiBsaWJjdXJsIG9wdGlvbiBhbmQgY3VybAogIHRvb2wgb3B0aW9uIG5hbWVkIC0tZnRwLWFsdGVybmF0aXZlLXRvLXVzZXIuIEl0IHByb3ZpZGVzIGEgbWVhbiB0byBzZW5kIGEKICBwYXJ0aWN1bGFyIGNvbW1hbmQgaWYgdGhlIG5vcm1hbCBVU0VSL1BBU1MgYXBwcm9hY2ggZmFpbHMuCgotIE1pY2hhZWwgSmVycmlzIGFkZGVkIG1hZ2ljIHRoYXQgYnVpbGRzIGxpYi9jdXJsbGliLnZjcHJvaiBhdXRvbWF0aWNhbGx5IGZvcgogIG5ld2VyIE1TVkMuCgpEYW5pZWwgKDI1IEp1bHkgMjAwNikKLSBHZW9yZyBIb3JuIG1hZGUgdGhlIHRyYW5zZmVyIHRpbWVvdXQgZXJyb3IgbWVzc2FnZSBpbmNsdWRlIG1vcmUgZGV0YWlscy4KCkRhbmllbCAoMjAgSnVseSAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIGEgYnVpbGQgZXJyb3Igd2hlbiBidWlsZGluZyBsaWJjdXJsIHdpdGggSFRUUCBkaXNhYmxlZCwKICBwcm9ibGVtIGFkZGVkIHdpdGggdGhlIGN1cmxfZm9ybWdldCgpIHBhdGNoLgoKRGFuaWVsICgxNyBKdWx5IDIwMDYpCi0gSmFyaSBTdW5kZWxsIGRpZCBzb21lIGV4Y2VsbGVudCByZXNlYXJjaCBhbmQgYnVnIHRyYWNraW5nLCBmaWd1cmVkIG91dCB0aGF0CiAgd2UgZGlkIHdyb25nIGFuZCBwYXRjaGVkIGl0OiBXaGVuIG5vZGVzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBzcGxheSB0cmVlLAogIGFuZCB3ZSBkaWRuJ3QgcHJvcGVybHkgcmVtb3ZlIGl0IGZyb20gdGhlIHNwbGF5IHRyZWUgd2hlbiBhbiBlYXN5IGhhbmRsZSB3YXMKICByZW1vdmVkIGZyb20gYSBtdWx0aSBzdGFjayBhbmQgdGh1cyB3ZSBjb3VsZCB3cm9uZ2x5IGxlYXZlIGEgbm9kZSBpbiB0aGUKICBzcGxheSB0cmVlIHBvaW50aW5nIHRvIChiYWQpIG1lbW9yeS4KCkRhbmllbCAoMTQgSnVseSAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIGEgZmxhdyB3aGVyZSB0aGUgQ1JMRiBjb3VudGVyIHdhc24ndCBwcm9wZXJseSBjbGVhcmVkCiAgZm9yIEZUUCBBU0NJSSB0cmFuc2ZlcnMuCgpEYW5pZWwgKDggSnVseSAyMDA2KQotIEF0ZXMgR29yYWwgcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsJ3MgY29va2llIHBhcnNlciBkaWQgY2FzZSBpbnNlbnNpdGl2ZQogIHN0cmluZyBjb21wYXJpc29ucyBvbiB0aGUgcGF0aCB3aGljaCBpcyBpbmNvcnJlY3QgYW5kIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdAogIGZpeGVzIHRoaXMuIEkgZWRpdGVkIHRlc3QgY2FzZSA4IHRvIGluY2x1ZGUgZGV0YWlscyB0aGF0IHRlc3QgZm9yIHRoaXMuCgotIEluZ21hciBSdW5nZSBwcm92aWRlZCBhIHNvdXJjZSBzbmlwcGV0IHRoYXQgY2F1c2VkIGEgY3Jhc2guIFRoZSByZWFzb24gZm9yCiAgdGhlIGNyYXNoIHdhcyB0aGF0IGxpYmN1cmwgaW50ZXJuYWxseSB3YXMgYSBiaXQgY29uZnVzZWQgYWJvdXQgd2hvIG93bmVkIHRoZQogIEROUyBjYWNoZSBhdCBhbGwgdGltZXMgc28gaWYgeW91IGNyZWF0ZWQgYW4gZWFzeSBoYW5kbGUgdGhhdCB1c2VzIGEgc2hhcmVkCiAgRE5TIGNhY2hlIGFuZCBhZGRlZCB0aGF0IHRvIGEgbXVsdGkgaGFuZGxlIGl0IHdvdWxkIGNyYXNoLiBOb3cgd2Uga2VlcCBtb3JlCiAgY2FyZWZ1bCBpbnRlcm5hbCB0cmFjayBvZiBleGFjdGx5IHdoYXQga2luZCBvZiBETlMgY2FjaGUgZWFjaCBlYXN5IGhhbmRsZQogIHVzZXM6IE5vbmUsIFByaXZhdGUgKGFsbG9jYXRlZCBmb3IgYW5kIHVzZWQgb25seSBieSB0aGlzIHNpbmdsZSBoYW5kbGUpLAogIFNoYXJlZCAocG9pbnRzIHRvIGEgY2FjaGUgaGVsZCBieSBhIHNoYXJlZCBvYmplY3QpLCBHbG9iYWwgKHBvaW50cyB0byB0aGUKICBnbG9iYWwgY2FjaGUpIG9yIE11bHRpIChwb2ludHMgdG8gdGhlIGNhY2hlIHdpdGhpbiB0aGUgbXVsdGkgaGFuZGxlIHRoYXQgaXMKICBhdXRvbWF0aWNhbGx5IHNoYXJlZCBiZXR3ZWVuIGFsbCBlYXN5IGhhbmRsZXMgdGhhdCBhcmUgYWRkZWQgd2l0aCBwcml2YXRlCiAgY2FjaGVzKS4KCkRhbmllbCAoNCBKdWx5IDIwMDYpCi0gVG9zaGl5dWtpIE1hZXphd2EgZml4ZWQgYSBwcm9ibGVtIHdoZXJlIHlvdSBjb3VsZG4ndCBvdmVycmlkZSB0aGUKICBQcm94eS1Db25uZWN0aW9uOiBoZWFkZXIgd2hlbiB1c2luZyBhIHByb3h5IGFuZCBub3QgZG9pbmcgQ09OTkVDVC4KCkRhbmllbCAoMjQgSnVuZSAyMDA2KQotIE1pY2hhZWwgV2FsbG5lciBhZGRlZCBjdXJsX2Zvcm1nZXQoKSwgd2hpY2ggYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGV4dHJhY3QKICAoc2VyaWFsaXNlKSBhIHByZXZpb3VzbHkgYnVpbHQgZm9ybXBvc3QgKGFzIHdpdGggY3VybF9mb3JtYWRkKCkpLgoKRGFuaWVsICgyMyBKdW5lIDIwMDYpCi0gQXJ2ZSBLbnVkc2VuIGZvdW5kIGEgZmxhdyBpbiBjdXJsX211bHRpX2Zkc2V0KCkgZm9yIHN5c3RlbXMgd2hlcmUKICBjdXJsX3NvY2tldF90IGlzIHVuc2lnbmVkIChsaWtlIFdpbmRvd3MpIHRoYXQgY291bGQgY2F1c2UgaXQgdG8gd3JvbmdseQogIHJldHVybiBhIG1heCBmZCBvZiAtMS4KCkRhbmllbCAoMjAgSnVuZSAyMDA2KQotIFBldGVyIFNpbHZhIGludHJvZHVjZWQgQ1VSTE9QVF9NQVhfU0VORF9TUEVFRF9MQVJHRSBhbmQKICBDVVJMT1BUX01BWF9SRUNWX1NQRUVEX0xBUkdFIHRoYXQgbGltaXQgdGhhIG1heGltdW0gcmF0ZSBsaWJjdXJsIGlzIGFsbG93ZWQKICB0byBzZW5kIG9yIHJlY2VpdmUgZGF0YS4gVGhpcyBraW5kIG9mIGFkZHMgdGhlIHRoZSBjb21tYW5kIGxpbmUgdG9vbCdzCiAgb3B0aW9uIC0tbGltaXQtcmF0ZSB0byB0aGUgbGlicmFyeS4KCiAgVGhlIHJhdGUgbGltaXRpbmcgbG9naWMgaW4gdGhlIGN1cmwgYXBwIGlzIG5vdyByZW1vdmVkIGFuZCBpcyBpbnN0ZWFkCiAgcHJvdmlkZWQgYnkgbGliY3VybCBpdHNlbGYuIFRyYW5zZmVyIHJhdGUgbGltaXRpbmcgd2lsbCBub3cgYWxzbyB3b3JrIGZvciAtZAogIGFuZCAtRiwgd2hpY2ggaXQgZGlkbid0IGJlZm9yZS4KCkRhbmllbCAoMTkgSnVuZSAyMDA2KQotIE1hZGUgLUsgb24gYSBmaWxlIHRoYXQgY291bGRuJ3QgYmUgcmVhZCBjYXVzZSBhIHdhcm5pbmcgdG8gYmUgZGlzcGxheWVkLgoKRGFuaWVsICgxMyBKdW5lIDIwMDYpCi0gRGFuIEZhbmRyaWNoIGltcGxlbWVudGVkIC0tZW5hYmxlLWhpZGRlbi1zeW1ib2xzIGNvbmZpZ3VyZSBvcHRpb24gdG8gZW5hYmxlCiAgLWZ2aXNpYmlsaXR5PWhpZGRlbiBvbiBnY2MgPj0gNC4wLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBsaWJjdXJsCiAgYmluYXJ5IGFuZCBzcGVlZHMgdXAgZHluYW1pYyBsaW5raW5nIGJ5IGhpZGluZyBhbGwgdGhlIGludGVybmFsIHN5bWJvbHMgZnJvbQogIHRoZSBzeW1ib2wgdGFibGUuCgpWZXJzaW9uIDcuMTUuNCAoMTIgSnVuZSAyMDA2KQoKRGFuaWVsICg4IEp1bmUgMjAwNikKLSBCcmlhbiBEZXNzZW50IGZpeGVkIHRoZSBjb2RlIGZvciBjeWd3aW4gaW4gdGhyZWUgZGlzdGluY3Qgd2F5czoKCiAgVGhlIGZpcnN0IG1vZGlmaWVzIHtsaWIsc3JjfS9zZXR1cC5oIHRvIG5vdCBpbmNsdWRlIHRoZSB3aW5zb2NrIGhlYWRlcnMKICB1bmRlciBDeWd3aW4uICBUaGlzIGZpeGVzIHRoZSByZXBvcnRlZCBidWlsZCBwcm9ibGVtLiAgQ3lnd2luIGF0dGVtcHRzIGFzCiAgbXVjaCBhcyBwb3NzaWJsZSB0byBlbXVsYXRlIGEgcG9zaXggZW52aXJvbm1lbnQgdW5kZXIgV2luZG93cy4gIFRoaXMgbWVhbnMKICB0aGF0IFdJTjMyIGlzICpub3QqICNkZWZpbmVkIGFuZCAodG8gdGhlIGV4dGVudCBwb3NzaWJsZSkgZXZlcnl0aGluZyBpcyBkb25lCiAgYXMgaXQgd291bGQgYmUgb24gYSAqaXggdHlwZSBzeXN0ZW0uICBUaHVzIDxzeXMvc29ja2V0Lmg+IGlzIHRoZSBwcm9wZXIKICBpbmNsdWRlLCBhbmQgZXZlbiB0aG91Z2ggd2luc29jazIuaCBpcyBwcmVzZW50LCBpbmNsdWRpbmcgaXQganVzdCBpbnRyb2R1Y2VzCiAgYSB3aG9sZSBidW5jaCBvZiBpbmNvbXBhdGlibGUgc29ja2V0IEFQSSBzdHVmZi4KCiAgVGhlIHNlY29uZCBpcyBhIHBhdGNoIEkndmUgaW5jbHVkZWQgaW4gdGhlIEN5Z3dpbiBiaW5hcnkgcGFja2FnZXMgZm9yIGEKICB3aGlsZS4gIEl0IHNraXBzIHR3byB1bm5lY2Vzc2FyeSBsaWJyYXJ5IGNoZWNrcyAoLWx3aW5tbSBhbmQgLWxnZGkzMikuICBUaGUKICBjaGVja3MgYXJlIGlubm9jdW91cyBhbmQgdGhleSBkbyBzdWNjZWVkLCBidXQgdGhleSBwb2xsdXRlIExJQlMgd2l0aAogIHVubmVjZXNzYXJ5IHN0dWZmIHdoaWNoIGdldHMgcmVjb3JkZWQgYXMgc3VjaCBpbiB0aGUgbGliY3VybC5sYSBmaWxlLCB3aGljaAogIGJyaW5ncyB0aGVtIGludG8gdGhlIGJ1aWxkIG9mIGFueSBsaWJjdXJsLWRvd25zdHJlYW0uICBBcyBmYXIgYXMgSSBrbm93CiAgdGhlc2UgbGlicyBhcmUgcmVhbGx5IG9ubHkgbmVjZXNzYXJ5IGZvciBtaW5ndywgc28gYWx0ZXJuYXRpdmVseSB0aGV5IGNvdWxkCiAgYmUgZGVzaWduZWQgdG8gb25seSBydW4gaWYgJGhvc3QgbWF0Y2hlcyAqLSotbWluZ3cqIGJ1dCBJIHRvb2sgdGhlIHNhZmVyCiAgcm91dGUgb2Ygc2tpcHBpbmcgdGhlbSBmb3IgKi0qLWN5Z3dpbiouCgogIFRoZSB0aGlyZCBwYXRjaCByZXBsYWNlcyBhbGwgdXNlcyBvZiB0aGUgYW5jaWVudCBhbmQgb2Jzb2xldGUgX19DWUdXSU4zMl9fCiAgd2l0aCBfX0NZR1dJTl9fLiBSZWY6IDxodHRwOi8vY3lnd2luLmNvbS9tbC9jeWd3aW4vMjAwMy0wOS9tc2cwMTUyMC5odG1sPi4KCkRhbmllbCAoNyBKdW5lIDIwMDYpCi0gTWlrYWVsIFNlbm5lcmhvbG0gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFkZGVkIE5UTE0yIHNlc3Npb24gcmVzcG9uc2Ugc3VwcG9ydAogIHRvIGxpYmN1cmwuIFRoZSAyMSBOVExNIHRlc3QgY2FzZXMgd2VyZSBhZ2FpbiBtb2RpZmllZCB0byBjb21wbHkuLi4KCkRhbmllbCAoMjcgTWF5IDIwMDYpCi0g03NjYXIgTW9yYWxlcyBWaXbzIHVwZGF0ZWQgdGhlIGxpYmN1cmwuZnJhbWV3b3JrLm1ha2UgZmlsZS4KCkRhbmllbCAoMjYgTWF5IDIwMDYpCi0gT2xhZiBTdPxiZW4gZml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgRGlnZXN0IGF1dGhlbnRpY2F0aW9uIHdpdGggbWQ1LXNlc3MgdG8KICBmYWlsLiBXaGVuIHVzaW5nIHRoZSBtZDUtc2VzcywgdGhlIHJlc3VsdCB3YXMgbm90IE1kNSBlbmNvZGVkIGFuZCBCYXNlNjQKICB0cmFuc2Zvcm1lZC4KCkRhbmllbCAoMjUgTWF5IDIwMDYpCi0gTWljaGFlbCBXYWxsbmVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhbGxvd3MgIlNFU1MiIHRvIGJlIHNldCB3aXRoCiAgQ1VSTE9QVF9DT09LSUVMSVNULCB3aGljaCB0aGVuIG1ha2VzIGFsbCBzZXNzaW9uIGNvb2tpZXMgZ2V0IGNsZWFyZWQuCgpEYW5pZWwgKDI0IE1heSAyMDA2KQotIFRvciBBcm50c2VuIG1hZGUgdGVzdCAyNzEgcnVuIGZpbmUgYWdhaW4gc2luY2UgdGhlIFRGVFAgcGF0aCBmaXguCgpEYW5pZWwgKDIzIE1heSAyMDA2KQotIE1hcnRpbiBNaWNobG1heXIgZmlsZWQgZGViaWFuIGJ1ZyByZXBvcnQgIzM2Nzk1NCwgYnV0IHRoZSBzYW1lIGVycm9yIGFsc28KICBzaG93ZWQgdXAgaW4gdGhlIGF1dG9idWlsZHMuIEl0IHNlZW1zIGEgcmF0aGVyIGxvbmctc2luY2UgaW50cm9kdWNlZCBzaGVsbAogIHNjcmlwdCBmbGF3IGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHN1ZGRlbmx5IHdhcyBkZXRlY3RlZCBieSB0aGUgYmFzaAogIHZlcnNpb24gaW4gRGViaWFuIFVuc3RhYmxlLiBJdCBoYWQgcHJldmlvdXNseSBwYXNzZWQgdW5kZXRlY3RlZCBieSBhbGwKICBzaGVsbHMgdXNlZCBzbyBmYXIuLi4KCi0gRGF2aWQgTWNDcmVlZHkgdXBkYXRlZCBsaWIvY29uZmlnLXRwZi5oCgpEYW5pZWwgKDExIE1heSAyMDA2KQotIEZpeGVkIHRoZSBjb25maWd1cmUncyBjaGVjayBmb3Igb2xkLXN0eWxlIFNTTGVheSBoZWFkZXJzIHNpbmNlIEkgZmVsbCBvdmVyIGEKICBjYXNlIHdpdGggYSBkdXBsaWNhdGUgZmlsZSBuYW1lIChhIGtyYjQgaW1wbGVtZW50YXRpb24gd2l0aCBhbiBlcnIuaAogIGZpbGUpLiBJIGNvbnZlcnRlZCB0aGUgY2hlY2sgdG8gbWFudWFsbHkgbWFrZSBzdXJlIHRocmVlIG9mIHRoZSBoZWFkZXJzIGFyZQogIHByZXNlbnQgYmVmb3JlIGNvbnNpZGVyaW5nIHRoZW0gZmluZS4KCi0gRGF2aWQgTWNDcmVlZHkgcHJvdmlkZWQgYSBmaXggZm9yIENVUkxJTkZPX0xBU1RTT0NLRVQgdGhhdCBkb2VzIGV4dGVuZGVkCiAgY2hlY2tzIG9uIHRoZSB0by1iZS1yZXR1cm5lZCBzb2NrZXQgdG8gbWFrZSBzdXJlIGl0IHRydWx5IHNlZW1zIHRvIGJlIGFsaXZlCiAgYW5kIHdlbGwuIEZvciBTU0wgY29ubmVjdGlvbiBpdCAob25seSkgdXNlcyBPcGVuU1NMIGZ1bmN0aW9ucy4KCkRhbmllbCAoMTAgTWF5IDIwMDYpCi0gRml4ZWQgRElDVCBpbiB0d28gYXNwZWN0czoKCiAgMSAtIGFsbG93IHByb3Blcmx5IFVSTC1lc2NhcGVkIHdvcmRzLCBsaWtlIHVzaW5nICUyMCBmb3Igc3BhY2VzCgogIDIgLSBwcm9wZXJseSBlc2NhcGUgY2VydGFpbiBsZXR0ZXJzIHdpdGhpbiBhIHdvcmQgdG8gY29tcGx5IHRvIHRoZSBSRkMyMjI5CgpEYW5pZWwgKDkgTWF5IDIwMDYpCi0gQW5kcmVhcyBOdGFmbG9zIHJlcG9ydGVkIGEgYnVnIGluIGxpYmN1cmwubTQ6IFdoZW4gY29uZmlndXJpbmcgbXkgR05VCiAgYXV0b3Rvb2xzIHByb2plY3QsIHdoaWNoIG9wdGlvbmFsbHkgKGRlZmF1bHQ9eWVzKSB1c2VzIGxpYmN1cmwgb24gYSBzeXN0ZW0KICB3aXRob3V0IGEgKHVzYWJsZSkgbGliY3VybCBpbnN0YWxsYXRpb24sIGJ1dCBub3Qgc3BlY2lmeWluZwogIGAtLXdpdGhvdXQtbGliY3VybCcsIGNvbmZpZ3VyZSBkZXRlcm1pbmVzIGNvcnJlY3RseSB0aGF0IG5vIGxpYmN1cmwgaXMKICBhdmFpbGFibGUsIGhvd2V2ZXIsIHRoZSBMSUJDVVJMIHZhcmlhYmxlIGdldHMgZXhwYW5kZWQgdG8gYExJQkNVUkwgPSAtbGN1cmwnCiAgaW4gdGhlIHJlc3VsdGluZyBNYWtlZmlsZXMuCgogIERhdmlkIFNoYXcgZml4ZWQgdGhlIGZsYXcuCgotIFJvYnNvbiBCcmFnYSBBcmF1am8gZml4ZWQgdHdvIHByb2JsZW1zIGluIHRoZSByZWNlbnRseSBhZGRlZCBub24tYmxvY2tpbmcgU1NMCiAgY29ubmVjdHMuIFRoZSBzdGF0ZSBtYWNoaW5lIHdhcyBub3QgcmVzZXQgcHJvcGVybHkgc28gdGhhdCBzdWJzZXF1ZW50CiAgY29ubmVjdHMgdXNpbmcgdGhlIHNhbWUgaGFuZGxlIHdvdWxkIGZhaWwsIGFuZCB0aGVyZSB3ZXJlIHR3byBtZW1vcnkgbGVha3MuCgotIFJvYnNvbiBCcmFnYSBBcmF1am8gZml4ZWQgYSBtZW1vcnkgbGVhayB3aGVuIHlvdSBhZGRlZCBhbiBlYXN5IGhhbmRsZSB0byBhCiAgbXVsdGkgc3RhY2sgYW5kIHRoYXQgZWFzeSBoYW5kbGUgaGFkIGFscmVhZHkgYmVlbiB1c2VkIHRvIGRvIG9uZSBvciBtb3JlCiAgZWFzeSBpbnRlcmZhY2UgdHJhbnNmZXJzLCBhcyB0aGVuIHRoZSBjb2RlIHRocmV3IGF3YXkgdGhlIHByZXZpb3VzbHkgdXNlZAogIEROUyBjYWNoZSB3aXRob3V0IHByb3Blcmx5IGZyZWVpbmcgaXQuCgpEYW5pZWwgKDggTWF5IDIwMDYpCi0gRGFuIEZhbmRyaWNoIHdlbnQgb3ZlciB0aGUgVEZUUCBjb2RlIGFuZCBoZSBwb2ludGVkIG91dCBhbmQgZml4ZWQgbnVtZXJvdXMKICBwcm9ibGVtczoKCiAgKiBUaGUgcmVjZWl2ZWQgZmlsZSBpcyBjb3JydXB0ZWQgd2hlbiBhIHBhY2tldCBpcyBsb3N0IGFuZCByZXRyYW5zbWl0dGVkCiAgICAodGhpcyBpcyBhIHNlcmlvdXMgcHJvYmxlbSEpCgogICogVHJhbnNtaXR0aW5nIGEgZmlsZSBhYm9ydHMgaWYgYSBibG9jayBpcyBsb3N0IGFuZCByZXRyYW5zbWl0dGVkCgogICogRGF0YSBpcyBzdG9yZWQgaW4gdGhlIHdyb25nIGxvY2F0aW9uIGluIHRoZSBidWZmZXIgZm9yIHVwbG9hZHMsIHNvIHVwbG9hZHMKICAgIGFsd2F5cyBmYWlsIChJIGRvbid0IHNlZSBob3cgaXQgY291bGQgaGF2ZSBldmVyIHdvcmtlZCwgYnV0IGl0IGRpZCBvbiB4ODYKICAgIGF0IGxlYXN0KQoKICAqIEEgbnVtYmVyIG9mIGNhbGxzIGFyZSBtYWRlIHRvIHN0cmVycm9yIGluc3RlYWQgb2YgQ3VybF9zdHJlcnJvciwgbWFraW5nCiAgICB0aGUgY29kZSBub3QgdGhyZWFkIHNhZmUKCiAgKiBUaGVyZSBhcmUgcmVmZXJlbmNlcyB0byBlcnJubyBpbnN0ZWFkIG9mIEN1cmxfc29ja2Vycm5vKCksIGNhdXNpbmcKICAgIGluY29ycmVjdCBlcnJvciBtZXNzYWdlcyBvbiBXaW5kb3dzCgogICogVGhlIGZpbGUgbmFtZSBpbmNsdWRlcyBhIGxlYWRpbmcgLyB3aGljaCB2aW9sYXRlcyBSRkMzNjE3LiBEb2luZyBzb21ldGhpbmcKICAgIHNpbWlsYXIgdG8gZnRwLCB3aGVyZSB0d28gc2xhc2hlcyBhZnRlciB0aGUgaG9zdCBuYW1lIG1lYW5zIGFuIGFic29sdXRlCiAgICByZWZlcmVuY2Ugc2VlbXMgYSByZWFzb25hYmxlIGV4dGVuc2lvbiB0byBmaXggdGhpcy4KCiAgKiBGYWlsdXJlcyBpbiBFQkNESUMgY29udmVyc2lvbiBhcmUgbm90IHByb3BhZ2F0ZWQgdXAgdG8gdGhlIGNhbGxlciBidXQgYXJlCiAgICBzaWxlbnRseSBpZ25vcmVkCgotIEZpeGVkIGtub3duIGJ1ZyAjMjguIFRoZSBURlRQIGNvZGUgbm8gbG9uZ2VyIGFzc3VtZXMgYSBwYWNrZWQgc3RydWN0IGFuZAogIHRodXMgd29ya3MgcmVsaWFibHkgb24gbW9yZSBwbGF0Zm9ybXMuCgpEYW5pZWwgKDUgTWF5IDIwMDYpCi0gUm9sYW5kIEJsb20gZmlsZWQgYnVnIHJlcG9ydCAjMTQ4MTIxNwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDgxMjE3KSwgd2l0aCBmb2xsb3ctdXBzIGJ5IE1pY2hlbGUKICBCaW5pIGFuZCBEYXZpZCBCeXJvbi4gbGliY3VybCBwcmV2aW91c2x5IHdyb25nbHkgdXNlZCBHZXRMYXN0RXJyb3IoKSBvbgogIHdpbmRvd3MgdG8gZ2V0IGVycm9yIGRldGFpbHMgYWZ0ZXIgc29ja2V0LXJlbGF0ZWQgZnVuY3Rpb24gY2FsbHMsIHdoZW4gaXQKICByZWFsbHkgc2hvdWxkIHVzZSBXU0FHZXRMYXN0RXJyb3IoKSBpbnN0ZWFkLgoKICBXaGVuIGNoYW5naW5nIHRvIHRoaXMsIHRoZSBmb3JtZXIgZnVuY3Rpb24gQ3VybF9vdXJlcnJubygpIGlzIG5vdyBpbnN0ZWFkCiAgY2FsbGVkIEN1cmxfc29ja2Vycm5vKCkgYXMgaXQgaXMgbmVjZXNzYXJ5IHRvIG9ubHkgdXNlIGl0IHRvIGdldCBlcnJubyBmcm9tCiAgc29ja2V0LXJlbGF0ZWQgZnVuY3Rpb25zIGFzIG90aGVyd2lzZSBpdCB3b24ndCB3b3JrIGFzIGludGVuZGVkIG9uIFdpbmRvd3MuCgpEYW5pZWwgKDQgTWF5IDIwMDYpCi0gTWFyayBFaWNoaW4gc3VibWl0dGVkIGJ1ZyByZXBvcnQgIzE0ODA4MjEKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQ4MDgyMSkgSGUgZm91bmQgYW5kIGlkZW50aWZpZWQgYQogIHByb2JsZW0gd2l0aCBob3cgbGliY3VybCBkZWFsdCB3aXRoIEdudVRMUyBhbmQgYSBjYXNlIHdoZXJlIGdudXRscyByZXR1cm5lZAogIEdOVVRMU19FX0FHQUlOIGluZGljYXRpbmcgaXQgd291bGQgYmxvY2suIEl0IHdvdWxkIHRoZW4gcmV0dXJuIGFuIHVuZXhwZWN0ZWQKICByZXR1cm4gY29kZSwgbWFraW5nIEN1cmxfc3NsX3NlbmQoKSBjb25mdXNlIHRoZSB1cHBlciBsYXllciAtIGNhdXNpbmcgcmFuZG9tCiAgMjggYnl0ZXMgdHJhc2ggZGF0YSB0byBnZXQgaW5zZXJ0ZWQgaW4gdGhlIHRyYW5zZmVyZWQgc3RyZWFtLgoKICBUaGUgcHJvcGVyIGZpeCB3YXMgdG8gbWFrZSB0aGUgQ3VybF9ndGxzX3NlbmQoKSBmdW5jdGlvbiByZXR1cm4gdGhlIHByb3BlcgogIHJldHVybiBjb2RlcyB0aGF0IHRoZSBjYWxsZXJzIHdvdWxkIGV4cGVjdC4gVGhlIEN1cmxfb3NzbF9zZW5kKCkgZnVuY3Rpb24KICBhbHJlYWR5IGRpZCB0aGlzLgoKRGFuaWVsICgyIE1heSAyMDA2KQotIEFkZGVkIGEgLS1jaGVja2ZvciBvcHRpb24gdG8gY3VybC1jb25maWcgdG8gYWxsb3cgdXNlcnMgdG8gZWFzaWVyCiAgd3JpdGUgZm9yIGV4YW1wbGUgc2hlbGwgc2NyaXB0cyB0aGF0IHRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBhCiAgbmV3LWVub3VnaCBsaWJjdXJsIHZlcnNpb24uIElmIC0tY2hlY2tmb3IgaXMgZ2l2ZW4gYSB2ZXJzaW9uIHN0cmluZwogIG5ld2VyIHRoYW4gd2hhdCBpcyBjdXJyZW50bHkgaW5zdGFsbGVkLCBjdXJsLWNvbmZpZyB3aWxsIHJldHVybiBhCiAgbm9uLXplcm8gZXhpdCBjb2RlIGFuZCBvdXRwdXQgYSBzdHJpbmcgYWJvdXQgdGhlIHVuZnVsZmlsbGVkCiAgcmVxdWlyZW1lbnQuCgpEYW5pZWwgKDI2IEFwcmlsIDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgYnJvdWdodCBpbml0aWFsIGxpbmUgZW5kIGNvbnZlcnNpb25zIHdoZW4gZG9pbmcgRlRQIEFTQ0lJCiAgdHJhbnNmZXJzLiBUaGV5IGFyZSBkb25lIG9uIG5vbi13aW5kb3dzIHN5c3RlbXMgYW5kIHRyYW5zbGF0ZSBDUkxGIHRvIExGLgoKICBJIG1vZGlmaWVkIHRoZSAxNSBMSVNULXVzaW5nIHRlc3QgY2FzZXMgYWNjb3JkaW5nbHkuIFRoZSBkb3duc2lkZSBpcyB0aGF0IG5vdwogIHdlJ2xsIGhhdmUgZXZlbiBtb3JlIHRyb3VibGUgdG8gZ2V0IHRoZSB0ZXN0cyB0byBydW4gb24gV2luZG93cyBzaW5jZSB0aGV5CiAgc2hvdWxkIGdldCBDUkxGIG5ld2xpbmVzIGxlZnQgaW50YWN0IHdoaWNoIHRoZSAqbml4IHZlcnNpb25zIGRvbid0LiBJIGZpZ3VyZQogIHRoZSBvbmx5IHNhbmUgdGhpbmcgdG8gZG8gaXMgdG8gYWRkIHNvbWUga2luZCBvZiBbbmV3bGluZV0gbWFjcm8gZm9yIHRoZSB0ZXN0CiAgY2FzZSBmaWxlcyBhbmQgaGF2ZSB0aGVtIGV4cGFuZGVkIHRvIHRoZSBwcm9wZXIgbmF0aXZlIGxpbmUgZW5kaW5nIHdoZW4gdGhlCiAgdGVzdCBjYXNlcyBhcmUgcnVuLiBUaGlzIGlzIGhvd2V2ZXIgbGVmdCB0byBpbXBsZW1lbnQuCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDYpCi0gUGF1bCBRdWVybmEgZml4ZWQgbGliY3VybCB0byBiZXR0ZXIgZGVhbCB3aXRoIGRlZmxhdGUgY29udGVudCBlbmNvZGluZwogIHdoZW4gdGhlIHN0cmVhbSAod3JvbmdseSkgbGFja3MgYSBwcm9wZXIgemxpYiBoZWFkZXIuIFRoaXMgc2VlbXMgdG8gYmUgdGhlCiAgY2FzZSBvbiB0b28gbWFueSBhY3R1YWwgc2VydmVyIGltcGxlbWVudGF0aW9ucy4KCkRhbmllbCAoMjEgQXByaWwgMjAwNikKLSBBbGUgVmVzZWx5IGZpeGVkIENVUkxPUFRfSU5URVJGQUNFIHdoZW4gdXNpbmcgYSBob3N0bmFtZS4KCkRhbmllbCAoMTkgQXByaWwgMjAwNikKLSBCYXNlZCBvbiBwcmV2aW91cyBpbmZvIGZyb20gVG9yIEFybnRzZW4sIEkgbWFkZSBjb25maWd1cmUgZGV0ZWN0IHRoZSBJbnRlbAogIElDQyBjb21waWxlciB0byBhZGQgYSBjb21waWxlciBvcHRpb24gZm9yIGl0LCBpbiBvcmRlciBmb3IgY29uZmlndXJlIHRvCiAgcHJvcGVybHkgYmUgYWJsZSB0byBkZXRlY3QgZnVuY3Rpb24gcHJvdG90eXBlcy4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgbGliY3VybCBsZXNzIGVhZ2VyIHRvIGNsb3NlCiAgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiB3aGVuIHVzaW5nIEZUUCwgZm9yIGV4YW1wbGUgd2hlbiB5b3UgcmVtb3ZlIGFuIGVhc3kKICBoYW5kbGUgZnJvbSBhIG11bHRpIHN0YWNrLgoKLSBBcHBsaWVkIGEgcGF0Y2ggYnkgQXRlcyBHb3JhbCBhbmQgS2F0aWUgV2FuZyB0aGF0IGNvcnJlY3RlZCBteSBiYWQgZml4CiAgYXR0ZW1wdCBmcm9tIEFwcmlsIDEwLgoKRGFuaWVsICgxMSBBcHJpbCAyMDA2KQotICMxNDY4MzMwIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDY4MzMwKSBwb2ludGVkIG91dCBhIGJhZAogIHR5cGVjYXN0IGluIHRoZSBjdXJsIHRvb2wgbGVhZGluZyB0byBhIGNyYXNoIHdpdGggKDY0Yml0PykgVlMyMDA1IChhdCBsZWFzdCkKICBzaW5jZSB0aGUgc3RydWN0IHRpbWV2YWwgZmllbGQgdHZfc2VjIGlzIGFuIGludCB3aGlsZSB0aW1lX3QgaXMgNjRiaXQuCgpEYW5pZWwgKDEwIEFwcmlsIDIwMDYpCi0gQXRlcyBHb3JhbCBmb3VuZCBvdXQgdGhhdCBpZiB5b3Ugc3BlY2lmaWVkIGJvdGggQ1VSTE9QVF9DT05ORUNUVElNRU9VVCBhbmQKICBDVVJMT1BUX1RJTUVPVVQsIHRoZSBfbG9uZ2VyXyB0aW1lIHdvdWxkIHdyb25nbHkgYmUgdXNlZCBmb3IgdGhlIFNTTAogIGNvbm5lY3Rpb24gdGltZS1vdXQhCgotIEkgbWVyZ2VkIG15IGhpcGVyIHBhdGNoIChodHRwOi8vY3VybC5oYXh4LnNlL2xpYmN1cmwvaGlwZXIvKSBpbnRvIHRoZSBtYWluCiAgc291cmNlcy4gU2VlIHRoZSBsaWIvUkVBRE1FLm11bHRpX3NvY2tldCBmb3IgaW1wbGVtZW50YXRpb24gc3Rvcnkgd2l0aAogIGRldGFpbHMuIERvbid0IGV4cGVjdCBpdCB0byB3b3JrIGZ1bGx5IHlldC4gSSBkb24ndCBpbnRlbmQgdG8gYmxvdyBhbnkKICB3aGlzdGxlcyBvciByaW5nIGFueSBiZWxscyBhYm91dCBpdCB1bnRpbCBJJ20gbW9yZSBjb252aW5jZWQgaXQgd29ya3MgYXQKICBsZWFzdCBzb21ld2hhdCByZWxpYWJseS4KCkRhbmllbCAoNyBBcHJpbCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5J3MgRUJDRElDIGFuZCBUUEYgY2hhbmdlcy4gVGhyZWUgbmV3IGN1cmxfZWFzeV9zZXRvcHQoKQogIG9wdGlvbnMgKGNhbGxiYWNrcykgd2VyZSBhZGRlZDoKCiAgQ09OVl9GUk9NX05FVFdPUktfRlVOQ1RJT04KICBDT05WX1RPX05FVFdPUktfRlVOQ1RJT04KICBDT05WX0ZST01fVVRGOF9GVU5DVElPTgoKRGFuaWVsICg1IEFwcmlsIDIwMDYpCi0gTWljaGVsZSBCaW5pIG1vZGlmaWVkIHRoZSBOVExNIGNvZGUgdG8gd29yayBmb3IgaGlzICJ3ZWlyZCBJSVMgY2FzZSIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA2LTAyLzAxNTQuaHRtbCkgYnkgYWRkaW5nIHRoZSBOVExNIGhhc2gKICBmdW5jdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgTE0gb25lIGFuZCBtYWtpbmcgc29tZSBvdGhlciBhZGp1c3RtZW50cyBpbiB0aGUKICBvcmRlciB0aGUgZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBkYXRhIGJsb2NrIGFyZSBzZW50IGluIHRoZSBUeXBlLTIgcmVwbHkuCiAgSW5zcGlyYXRpb24gZm9yIHRoaXMgd29yayB3YXMgdGFrZW4gZnJvbSB0aGUgRmlyZWZveCBOVExNIGltcGxlbWVudGF0aW9uLgoKICBJIGVkaXRlZCB0aGUgZXhpc3RpbmcgMjEoISkgTlRMTSB0ZXN0IGNhc2VzIHRvIHJ1biBmaW5lIHdpdGggdGhlc2UgbmV3cy4gRHVlCiAgdG8gdGhlIGZhY3QgdGhhdCB3ZSBub3cgcHJvcGVybHkgaW5jbHVkZSB0aGUgaG9zdCBuYW1lIGluIHRoZSBUeXBlLTIgbWVzc2FnZQogIHRoZSB0ZXN0IGNhc2VzIG5vdyBvbmx5IGNvbXBhcmUgcGFydHMgb2YgdGhhdCBjaHVuay4KCkRhbmllbCAoMjggTWFyY2ggMjAwNikKLSAjMTQ1MTkyOSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQ1MTkyOSkgZGV0YWlsZWQgYSBidWcgdGhhdAogIG9jY3VycmVkIHdoZW4gYXNraW5nIGxpYmN1cmwgdG8gZm9sbG93IEhUVFAgcmVkaXJlY3RzIGFuZCB0aGUgb3JpZ2luYWwgVVJMCiAgaGFkIG1vcmUgdGhhbiBvbmUgcXVlc3Rpb24gbWFyayAoPykuIEFkZGVkIHRlc3QgY2FzZSAyNzYgdG8gdmVyaWZ5LgoKRGFuaWVsICgyNyBNYXJjaCAyMDA2KQotIERhdmlkIEJ5cm9uIGZvdW5kIGEgcHJvYmxlbSBtdWx0aXBsZSAtZCBvcHRpb25zIHdoZW4gbGliY3VybCB3YXMgYnVpbHQgd2l0aAogIC0tZW5hYmxlLWRlYnVnLCBhcyB0aGVuIGN1cmwgdXNlZCBmcmVlKCkgb24gbWVtb3J5IGFsbG9jYXRlZCBib3RoIHdpdGgKICBub3JtYWwgbWFsbG9jKCkgYW5kIHdpdGggbGliY3VybC1wcm92aWRlZCBmdW5jdGlvbnMsIHdoZW4gdGhlIGxhdHRlciBNVVNUIGJlCiAgZnJlZWQgd2l0aCBjdXJsX2ZyZWUoKSBpbiBkZWJ1ZyBidWlsZHMuCgpEYW5pZWwgKDI2IE1hcmNoIDIwMDYpCi0gVG9yIEFybnRzZW4gZmlndXJlZCBvdXQgdGhhdCBURlRQIHdhcyBicm9rZW4gb24gYSBsb3Qgb2Ygc3lzdGVtcyBzaW5jZSB3ZQogIGNhbGxlZCBiaW5kKCkgd2l0aCBhIHRvbyBiaWcgYXJndW1lbnQgaW4gdGhlIDNyZCBwYXJhbWV0ZXIgYW5kIGF0IGxlYXN0CiAgVHJ1NjQsIEFJWCBhbmQgSVJJWCBzZWVtIHRvIGJlIHZlcnkgcGlja3kgYWJvdXQgaXQuCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgYWRkZWQgQ1VSTElORk9fRlRQX0VOVFJZX1BBVEguCgotIFhhdmllciBCb3VjaG91eCBtYWRlIHRoZSBTU0wgY29ubmVjdGlvbiBub24tYmxvY2tpbmcgZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UKICAod2hlbiB1c2luZyBPcGVuU1NMKS4KCi0gVG9yIEFybnRzZW4gZml4ZWQgdGhlIEFJWCBUb29sYm94IFJQTSBzcGVjCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgbGliY3VybCB0byBubyBsb25nZXIgaWdub3JlIEFVVEggZmFpbHVyZXMgYW5kIG5vdyBpdAogIHJlYWN0cyBwcm9wZXJseSBhY2NvcmRpbmcgdG8gdGhlIENVUkxPUFRfRlRQX1NTTCBzZXR0aW5nLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgdHdvIFRGVFAgcHJvYmxlbXM6IEZpeGVkIGEgYnVnIHdoZXJlYnkgYSByZWNlaXZlZCBmaWxlCiAgd2hvc2UgbGVuZ3RoIHdhcyBhIG11bHRpcGxlIG9mIDUxMiBieXRlcyBjb3VsZCBoYXZlIHJhbmRvbSBnYXJiYWdlCiAgYXBwZW5kZWQuIEFsc28sIHN0b3AgcHJvY2Vzc2luZyBURlRQIHBhY2tldHMgd2hpY2ggYXJlIHRvbyBzaG9ydCB0byBiZQogIGxlZ2FsLgoKLSBJbGphIHZhbiBTcHJ1bmRlbCByZXBvcnRlZCBhIHBvc3NpYmxlIGNyYXNoIGluIHRoZSBjdXJsIHRvb2wgd2hlbiB1c2luZwogICJjdXJsIGhvc3R3aXRob3V0c2xhc2ggLWQgZGF0YSAtRyIKClZlcnNpb24gNy4xNS4zICgyMCBNYXJjaCAyMDA2KQoKRGFuaWVsICgyMCBNYXJjaCAyMDA2KQotIFZVTE5FUkFCSUxJVFkgcmVwb3J0ZWQgdG8gdXMgYnkgVWxmIEhhcm5oYW1tYXIuCgogIGxpYmN1cmwgdXNlcyB0aGUgZ2l2ZW4gZmlsZSBwYXJ0IG9mIGEgVEZUUCBVUkwgaW4gYSBtYW5uZXIgdGhhdCBhbGxvd3MgYQogIG1hbGljaW91cyB1c2VyIHRvIG92ZXJmbG93IGEgaGVhcC1iYXNlZCBtZW1vcnkgYnVmZmVyIGR1ZSB0byB0aGUgbGFjayBvZgogIGJvdW5kYXJ5IGNoZWNrLgoKICBUaGlzIG92ZXJmbG93IGhhcHBlbnMgaWYgeW91IHBhc3MgaW4gYSBVUkwgd2l0aCBhIFRGVFAgcHJvdG9jb2wgcHJlZml4CiAgKCJ0ZnRwOi8vIiksIHVzaW5nIGEgdmFsaWQgaG9zdCBhbmQgYSBwYXRoIHBhcnQgdGhhdCBpcyBsb25nZXIgdGhhbiA1MTIKICBieXRlcy4KCiAgVGhlIGFmZmVjdGVkIGZsYXcgY2FuIGJlIHRyaWdnZXJlZCBieSBhIHJlZGlyZWN0LCBpZiBjdXJsL2xpYmN1cmwgaXMgdG9sZCB0bwogIGZvbGxvdyByZWRpcmVjdHMgYW5kIGFuIEhUVFAgc2VydmVyIHBvaW50cyB0aGUgY2xpZW50IHRvIGEgdGZ0cCBVUkwgd2l0aCB0aGUKICBjaGFyYWN0ZXJpc3RpY3MgZGVzY3JpYmVkIGFib3ZlLgoKICBUaGUgQ29tbW9uIFZ1bG5lcmFiaWxpdGllcyBhbmQgRXhwb3N1cmVzIChDVkUpIHByb2plY3QgaGFzIGFzc2lnbmVkIHRoZSBuYW1lCiAgQ1ZFLTIwMDYtMTA2MSB0byB0aGlzIGlzc3VlLgoKRGFuaWVsICgxNiBNYXJjaCAyMDA2KQotIFRvciBBcm50c2VuIHByb3ZpZGVkIGEgUlBNIHNwZWMgZmlsZSBmb3IgQUlYIFRvb2xib3gsIHRoYXQgbm93IGlzIGluY2x1ZGVkCiAgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoMTQgTWFyY2ggMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZDoKCiAgYSBiYWQgU1NMIGVycm9yIG1lc3NhZ2Ugd2hlbiBPcGVuU1NMIGNlcnRpZmljYXRlcyBhcmUgdmVyaWZpZWQgZmluZS4KCiAgYSBtaXNzaW5nIHJldHVybiBjb2RlIGFzc2lnbm1lbnQgaW4gdGhlIEZUUCBjb2RlCgpEYW5pZWwgKDcgTWFyY2ggMjAwNikKLSBNYXJrdXMgS29ldHRlciBmaWxlZCBkZWJpYW4gYnVnIHJlcG9ydCAjMzU1NzE1IHdoaWNoIGlkZW50aWZpZWQgYSBwcm9ibGVtCiAgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBtdWx0aS1wYXJ0IGZvcm1wb3N0cy4gVGhlIGZpeCBmcm9tIEZlYnJ1YXJ5CiAgMjJuZCBjb3VsZCBtYWtlIHRoZSBDdXJsX2RvbmUoKSBmdW5jdGlvbiBnZXQgY2FsbGVkIHR3aWNlIG9uIHRoZSBzYW1lCiAgY29ubmVjdGlvbiBhbmQgaXQgd2FzIG5vdCBkZXNpZ25lZCBmb3IgdGhhdCBhbmQgdGh1cyB0cmllZCB0byBjYWxsIGZyZWUoKSBvbgogIGFuIGFscmVhZHkgZnJlZWQgbWVtb3J5IGFyZWEhCgotIFBldGVyIEhldWNoZXJ0IG1hZGUgc3VyZSB0aGUgQ1VSTEZUUFNTTF9DT05UUk9MIHNldHRpbmcgZm9yIENVUkxPUFRfRlRQX1NTTAogIGlzIHVzZWQgcHJvcGVybHkuCgpEYW5pZWwgKDYgTWFyY2ggMjAwNikKLSBMb3RzIG9mIHVzZXJzIG9uIFdpbmRvd3MgaGF2ZSByZXBvcnRlZCBnZXR0aW5nIHRoZSAiU1NMOiBjb3VsZG4ndCBzZXQKICBjYWxsYmFjayIgZXJyb3IgbWVzc2FnZSBzbyBJJ3ZlIG5vdyBtYWRlIHRoZSBzZXR0aW5nIG9mIHRoYXQgY2FsbGJhY2sgbm90IGJlCiAgYXMgY3JpdGljYWwgYXMgYmVmb3JlLiBUaGUgZnVuY3Rpb24gaXMgb25seSB1c2VkIGZvciBhZGRpdGlvbmFsIGxvZ2dnaW5nLwogIHRyYWNlIGFueXdheSBzbyBhIGZhaWx1cmUganVzdCBtZWFucyBzbGlnaHRseSBsZXNzIGRhdGEuIEl0IHNob3VsZCBzdGlsbCBiZQogIGFibGUgdG8gcHJvY2VlZCBhbmQgY29ubmVjdCBmaW5lIHRvIHRoZSBzZXJ2ZXIuCgpEYW5pZWwgKDQgTWFyY2ggMjAwNikKLSBUaG9tYXMgS2xhdXNuZXIgcHJvdmlkZWQgYSBwYXRjaCB3cml0dGVuIGJ5IFRvZGQgVmllcmxpbmcgaW4gYnVnIHJlcG9ydAogICMxNDQyNDcxIHRoYXQgZml4ZXMgYSBidWlsZCBwcm9ibGVtIG9uIEludGVyaXguCgpEYW5pZWwgKDIgTWFyY2ggMjAwNikKLSBGVFAgdXBsb2FkIHdpdGhvdXQgYSBmaWxlIG5hbWUgcGFydCBpbiB0aGUgVVJMIG5vdyBjYXVzZXMKICBjdXJsX2Vhc3lfcGVyZm9ybSgpIHRvIHJldHVybiBDVVJMRV9VUkxfTUFMRk9STUFULiBQcmV2aW91c2x5IGl0IGFsbG93ZWQgdGhlCiAgdXBsb2FkIGJ1dCBuYW1lZCB0aGUgZmlsZSAiKG5pbCkiICh3aXRob3V0IHRoZSBxdW90ZXMpLiBUZXN0IGNhc2UgNTI0CiAgdmVyaWZpZXMuCgotIEFkZGVkIGEgY2hlY2sgZm9yIGdldHByb3RvYnluYW1lIGluIGNvbmZpZ3VyZSBzbyB0aGF0IGl0J2xsIGJlIHVzZWQsIHRoYW5rcwogIHRvIEdpc2xlIFZhbmVtJ3MgY2hhbmdlIHRoZSBvdGhlciBkYXkuCgpEYW5pZWwgKDI4IEZlYnJ1YXJ5IDIwMDYpCi0gRGFuIEZhbmRyaWNoIHByZXZlbnRlZCBjdXJsIGZyb20gZ2V0dGluZyBzdHVjayBpbiBhbiBlbmRsZXNzIGxvb3AgaW4gY2FzZSB3ZQogIGFyZSBvdXQgb2YgZmlsZSBoYW5kbGVzIHZlcnkgZWFybHkgaW4gY3VybCdzIGNvZGUgd2hlcmUgaXQgbWFrZXMgc3VyZSB0aGF0CiAgMCwgMSBhbmQgMiBhcmVuJ3QgZ29ubmEgYmUgdXNlZCBieSB0aGUgbGliIGZvciB0cmFuc2ZlcnMuCgpEYW5pZWwgKDI3IEZlYnJ1YXJ5IDIwMDYpCi0gTWFydHkgS3VocnQgcG9pbnRlZCBvdXQgdGhhdCB0aGVyZSB3ZXJlIHR3byBWTVMtc3BlY2lmaWMgZmlsZXMgbWlzc2luZyBpbgogIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpWZXJzaW9uIDcuMTUuMiAoMjcgRmVicnVhcnkgMjAwNikKCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwNikKLSBMb3RzIG9mIHdvcmsgYW5kIGFuYWx5c2lzIGJ5ICJ4YnhfX18iIGluIGJ1ZyAjMTQzMTc1MAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDMxNzUwKSBoZWxwZWQgbWUgaWRlbnRpZnkgYW5kIGZpeCB0d28KICBkaWZmZXJlbnQgYnV0IHJlbGF0ZWQgYnVnczoKCiAgMSkgUmVtb3ZpbmcgYW4gZWFzeSBoYW5kbGUgZnJvbSBhIG11bHRpIGhhbmRsZSBiZWZvcmUgdGhlIHRyYW5zZmVyIGlzIGRvbmUKICAgICBjb3VsZCBsZWF2ZSBhIGNvbm5lY3Rpb24gaW4gdGhlIGNvbm5lY3Rpb24gY2FjaGUgZm9yIHRoYXQgaGFuZGxlIHRoYXQgaXMKICAgICBpbiBhIHN0YXRlIHRoYXQgaXNuJ3Qgc3VpdGFibGUgZm9yIHJlLXVzZS4gQSBzdWJzZXF1ZW50IHJlLXVzZSBjb3VsZCB0aGVuCiAgICAgcmVhZCBmcm9tIGEgTlVMTCBwb2ludGVyIGFuZCBzZWdmYXVsdC4KCiAgMikgV2hlbiBhbiBlYXN5IGhhbmRsZSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBtdWx0aSBoYW5kbGUsIHRoZXJlIGNvdWxkIGJlIGFuCiAgICAgb3V0c3RhbmRpbmcgYy1hcmVzIEROUyBuYW1lIHJlc29sdmUgcmVxdWVzdC4gV2hlbiB0aGUgcmVzcG9uc2UgYXJyaXZlZCwKICAgICBpdCBjYXVzZWQgaGF2b2Mgc2luY2UgdGhlIGNvbm5lY3Rpb24gc3RydWN0IGl0ICJiZWxvbmdlZCIgdG8gY291bGQndmUKICAgICBiZWVuIGZyZWVkIGFscmVhZHkuCgogIE5vdyBDdXJsX2RvbmUoKSBpcyBjYWxsZWQgd2hlbiBhbiBlYXN5IGhhbmRsZSBpcyByZW1vdmVkIGZyb20gYSBtdWx0aSBoYW5kbGUKICBwcmUtbWF0dXJlbHkgKHRoYXQgaXMsIGJlZm9yZSB0aGUgdHJhbnNmZXIgd2FzIGNvbXBsdGV0ZWQpLiBDdXJsX2RvbmUoKSBhbHNvCiAgbWFrZXMgc3VyZSB0byBjYW5jZWwgYWxsIChpZiBhbnkpIG91dHN0YW5kaW5nIGMtYXJlcyByZXF1ZXN0cy4KCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwNikKLSBQZXRlciBTdSBhZGRlZCBzdXBwb3J0IGZvciBTT0NLUzQgcHJveGllcy4gRW5hYmxlIHRoaXMgYnkgc2V0dGluZyB0aGUgcHJveHkKICB0eXBlIHRvIHRoZSBhbHJlYWR5IHByb3ZpZGVkIHR5cGUgQ1VSTFBST1hZX1NPQ0tTNC4KCiAgSSBhZGRlZCBhIC0tc29ja3M0IG9wdGlvbiB0aGF0IHdvcmtzIGxpa2UgdGhlIGN1cnJlbnQgLS1zb2NrczUgb3B0aW9uIGJ1dAogIGluc3RlYWQgdXNlIHRoZSBzb2NrczQgcHJvdG9jb2wuCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDYpCi0gU2htdWxpayBSZWdldiBmaXhlZCBhbiBpc3N1ZSB3aXRoIG11bHRpLXBhc3MgYXV0aGVudGljYXRpb24gYW5kIGNvbXByZXNzZWQKICBjb250ZW50IHdoZW4gbGliY3VybCBkaWRuJ3QgaG9ub3IgdGhlIGludGVybmFsIGlnbm9yZWJvZHkgZmxhZy4KCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNikKLSBVbGYgSORybmhhbW1hciBmaXhlZCBhIGZvcm1hdCBzdHJpbmcgKHByaW50ZiBzdHlsZSkgcHJvYmxlbSBpbiB0aGUgTmVnb3RpYXRlCiAgY29kZS4gSXQgc2hvdWxkIGhvd2V2ZXIgbm90IGJlIHRoZSBjYXVzZSBvZiBhbnkgdHJvdWJsZXMuIEhlIGFsc28gZml4ZWQgYQogIGZldyBzaW1pbGFyIHByb2JsZW1zIGluIHRoZSBIVFRQIHRlc3Qgc2VydmVyIGNvZGUuCgpEYW5pZWwgKDE3IEZlYnJ1YXJ5IDIwMDYpCi0gU2htdWxpayBSZWdldiBwcm92aWRlZCBhIGZpeCBmb3IgdGhlIEROUyBjYWNoZSB3aGVuIHVzaW5nIHNob3J0IGxpZmUgdGltZXMsCiAgYXMgcHJldmlvdXNseSBpdCBjb3VsZCBiZSBob2xkaW5nIG9uIHRvIG9sZCBjYWNoZWQgZW50cmllcyBsb25nZXIgdGhhbgogIHJlcXVlc3RlZC4KCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwNikKLSBLYXJsIE1vZXJkZXIgYWRkZWQgdGhlIENVUkxPUFRfQ09OTkVDVF9PTkxZIGFuZCBDVVJMSU5GT19MQVNUU09DS0VUIG9wdGlvbnMKICB0aGF0IGFuIGFwcCBjYW4gdXNlIHRvIGxldCBsaWJjdXJsIG9ubHkgY29ubmVjdCB0byBhIHJlbW90ZSBob3N0IGFuZCB0aGVuCiAgZXh0cmFjdCB0aGUgc29ja2V0IGZyb20gbGliY3VybC4gbGliY3VybCB3aWxsIHRoZW4gbm90IGF0dGVtcHQgdG8gZG8gYW55CiAgdHJhbnNmZXIgYXQgYWxsIGFmdGVyIHRoZSBjb25uZWN0IGlzIGRvbmUuCgotIEtlbnQgQm9vcnR6IGltcHJvdmVkIHRoZSBjb25maWd1cmUgY2hlY2sgZm9yIEdudVRMUyB0byBwcm9wZXJseSBzZXQgTElCUwogIGluc3RlYWQgb2YgTERGTEFHUy4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDA2KQotIFBoaWxpcHBlIFZhdWNoZXIgcHJvdmlkZWQgYSBicmlsbGlhbnQgcGllY2Ugb2YgdGVzdCBjb2RlIHRoYXQgc2hvdyBhIHByb2JsZW0KICB3aXRoIHJlLXVzZWQgRlRQIGNvbm5lY3Rpb25zLiBJZiB0aGUgc2Vjb25kIHJlcXVlc3Qgb24gdGhlIHNhbWUgY29ubmVjdGlvbgogIHdhcyBzZXQgbm90IHRvIGZldGNoIGEgImJvZHkiLCBsaWJjdXJsIGNvdWxkIGdldCBjb25mdXNlZCBhbmQgY29uc2lkZXIgaXQgYW4KICBhdHRlbXB0IHRvIHVzZSBhIGRlYWQgY29ubmVjdGlvbiBhbmQgd291bGQgZ28gYWN0aW5nIG1pZ2h0eSBzdHJhbmdlLgoKRGFuaWVsICgyIEZlYnJ1YXJ5IDIwMDYpCi0gTWFrZSAtLWxpbWl0LXJhdGUgW251bV0gbWVhbiBieXRlcy4gSXQgdXNlZCB0byBiZSB0aGF0IGJ1dCBpdCBicm9rZSBpbiBteQogIGNoYW5nZSBkb25lIGluIE5vdmVtYmVyIDIwMDUuCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwNikKLSBBZGRlZCBDVVJMT1BUX0xPQ0FMUE9SVCBhbmQgQ1VSTE9QVF9MT0NBTFBPUlRSQU5HRSB0byBsaWJjdXJsLiBTZXQgd2l0aCB0aGUKICBjdXJsIHRvb2wgd2l0aCAtLWxvY2FsLXBvcnQuIFBsYWluIGFuZCBzaW1wbHkgc2V0IHRoZSByYW5nZSBvZiBwb3J0cyB0byBiaW5kCiAgdGhlIGxvY2FsIGVuZCBvZiBjb25uZWN0aW9ucyB0by4gSW1wbGVtZW50ZWQgb24gdG8gcG9wdWxhciBkZW1hbmQuCgotIEJhc2VkIG9uIGFuIGVycm9yIHJlcG9ydCBieSBQaGlsaXBwZSBWYXVjaGVyLCB3ZSBubyBsb25nZXIgY291bnQgYSByZXRyaWVkCiAgY29ubmVjdGlvbiBzZXR1cCBhcyBhIGZvbGxvdy1yZWRpcmVjdC4gSXQgdHVybnMgb3V0IDEpIHRoaXMgZmFpbHMgd2hlbiBhIEZUUAogIGNvbm5lY3Rpb24gaXMgcmUtc2V0dXAgYW5kIDIpIGl0IGRvZXMgbWFrZSB0aGUgbWF4LXJlZGlycyBjb3VudGVyIGJlaGF2ZQogIHdyb25nLgoKRGFuaWVsICgyNCBKYW51YXJ5IDIwMDYpCi0gTWljaGFsIE1hcmVrIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIEZUUCB0aGF0IG1ha2VzIGxpYmN1cmwgY29udGludWUgdG8gdHJ5CiAgUEFTViBldmVuIGFmdGVyIEVQU1YgcmV0dXJuZWQgYSBwb3NpdGl2ZSByZXNwb25zZSBjb2RlLCBpZiBsaWJjdXJsIGZhaWxlZCB0bwogIGNvbm5lY3QgdG8gdGhlIHBvcnQgbnVtYmVyIHRoZSBFUFNWIHJlc3BvbnNlIHNhaWQuIE9idmlvdXNseSBzb21lIHBlb3BsZSBhcmUKICBnb2luZyB0aHJvdWdoIHByb3RvY29sLXNlbnNpdGl2ZSBmaXJld2FsbHMgKG9yIHNpbWlsYXIpIHRoYXQgZG9uJ3QKICB1bmRlcnN0YW5kIEVQU1YgYW5kIHRoZW4gdGhleSBkb24ndCBhbGxvdyB0aGUgc2Vjb25kIGNvbm5lY3Rpb24gdW5sZXNzIFBBU1YKICB3YXMgdXNlZC4gVGhpcyBhbHNvIGNhbGxlZCBmb3IgYSBtaW5vciBmaXggb2YgdGVzdCBjYXNlIDIzOC4KCkRhbmllbCAoMjAgSmFudWFyeSAyMDA2KQotIER1YW5lIENhdGhleSB3YXMgb25lIG9mIG91ciBmcmllbmRzIHdobyByZXBvcnRlZCB0aGF0IGN1cmwgLVAgW0lQXQogIChDVVJMT1BUX0ZUUFBPUlQpIGRpZG4ndCB3b3JrIGZvciBpcHY2LWVuYWJlZCBjdXJscyBpZiB0aGUgSVAgd2Fzbid0IGEKICAibmF0aXZlIiBJUCB3aGlsZSBpdCB3b3JrcyBmaW5lIGZvciBpcHY2LWRpc2FibGVkIGJ1aWxkcyEKCiAgSW4gdGhlIHByb2Nlc3Mgb2YgZml4aW5nIHRoaXMsIEkgcmVtb3ZlZCB0aGUgc3VwcG9ydCBmb3IgTFBSVCBzaW5jZSBJIGNhbid0CiAgdGhpbmsgb2YgbWFueSByZWFzb25zIHRvIGtlZXAgZG9pbmcgaXQgYW5kIGFza2luZyBvbiB0aGUgbWFpbGluZyBsaXN0IGRpZG4ndAogIHJldmVhbCBhbnlvbmUgZWxzZSB0aGF0IGNvdWxkIGVpdGhlci4gVGhlIGNvZGUgdGhhdCBzZW5kcyBFUFJUIGFuZCBQT1JUIGlzCiAgbm93IGFsc28gYSBsb3Qgc2ltcGxlciB0aGFuIGJlZm9yZSAoSU1ITykuCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwNikKLSBKb24gVHVybmVyIHBvaW50ZWQgb3V0IHRoYXQgZG9pbmcgLVAgW2hvc3RuYW1lXSAoQ1VSTE9QVF9GVFBQT1JUKSB3aXRoIGN1cmwKICAoYnVpbHQgaXB2NC1vbmx5KSBkaWRuJ3Qgd29yay4KCkRhbmllbCAoMTggSmFudWFyeSAyMDA2KQotIEFzIHJlcG9ydGVkIGluIGJ1ZyAjMTQwODc0MiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQwODc0MiksCiAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY29tcGxhaW5lZCBhYm91dCBhIG1pc3NpbmcgIm1pc3NpbmciIHNjcmlwdCBpZiB5b3UgcmFuCiAgY29uZmlndXJlIHdpdGhpbiBhIHBhdGggd2hvc2UgbmFtZSBpbmNsdWRlZCBvbmUgb3IgbW9yZSBzcGFjZXMuIFRoaXMgaXMgZHVlCiAgdG8gYSBmbGF3IGluIGF1dG9tYWtlICgxLjkuNiBhbmQgZWFybGllcikuIEkndmUgbm93IHdvcmtlZCBhcm91bmQgaXQgYnkKICBpbmNsdWRpbmcgYW4gIm92ZXJsb2FkZWQiIHZlcnNpb24gb2YgdGhlIEFNX01JU1NJTkdfSEFTX1JVTiBzY3JpcHQgdGhhdCdsbAogIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgb25lIGF1dG9tYWtlIHNoaXBzIHdpdGguIFRoaXMga2x1ZGdlIG5lZWRzIHRvIGJlCiAgcmVtb3ZlZCBvbmNlIHdlIGdldCBhbiBhdXRvbWFrZSB2ZXJzaW9uIHdpdGggdGhpcyBwcm9ibGVtIGNvcnJlY3RlZC4KICBQb3NzaWJseSB3ZSdsbCB0aGVuIG5lZWQgdG8gY29udmVydCB0aGlzIGludG8gYSBrbHVkZ2UgZGVwZW5kaW5nIG9uIHdoYXQKICBhdXRvbWFrZSB2ZXJzaW9uIHRoYXQgaXMgdXNlZCBhbmQgdGhhdCBpcyBnb25uYSBiZSBwYWluZnVsIGFuZCBJIGRvbid0IGV2ZW4KICB3YW50IHRvIHRoaW5rIGFib3V0IHRoYXQgbm93Li4uIQoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDYpCi0gRGF2aWQgU2hhdzogSGVyZSBpcyB0aGUgbGF0ZXN0IGxpYmN1cmwubTQgYXV0b2NvbmYgdGVzdHMuIEl0IGlzIHVwZGF0ZWQgd2l0aAogIHRoZSBsYXRlc3QgZmVhdHVyZXMgYW5kIHByb3RvY29scyB0aGF0IGxpYmN1cmwgc3VwcG9ydHMgYW5kIGhhcyBhIG1pbm9yIGZpeAogIHRvIGJldHRlciBkZWFsIHdpdGggdGhlIG9ic2N1cmUgY2FzZSB3aGVyZSBzb21lb25lIGhhcyBtb3JlIHRoYW4gb25lIGxpYmN1cmwKICBpbnN0YWxsZWQgYXQgdGhlIHNhbWUgdGltZS4KCkRhbmllbCAoMTYgSmFudWFyeSAyMDA2KQotIERhdmlkIFNoYXcgZmluYWxseSByZW1vdmVkIGFsbCB0cmFjZXMgb2YgR29waGVyIGFuZCB3ZSBhcmUgbm93IG9mZmljaWFsbHkKICBub3Qgc3VwcG9ydGluZyBpdC4gSXQgaGFzbid0IGJlZW4gZnVuY3Rpb25pbmcgZm9yIHllYXJzIGFueXdheSwgc28gdGhpcyBpcwogIGp1c3QgZmluYWxseSBzdGF0aW5nIHdoYXQgYWxyZWFkeSB3YXMgdHJ1ZS4gQW5kIGEgY2xlYW51cCBhdCB0aGUgc2FtZSB0aW1lLgoKLSBCcnlhbiBIZW5kZXJzb24gdHVybmVkIHRoZSAnaW5pdGlhbGl6ZWQnIHZhcmlhYmxlIGZvciBjdXJsX2dsb2JhbF9pbml0KCkKICBpbnRvIGEgY291bnRlciwgYW5kIHRodXMgeW91IGNhbiBub3cgZG8gbXVsdGlwbGUgY3VybF9nbG9iYWxfaW5pdCgpIGFuZCB5b3UKICBhcmUgdGhlbiBzdXBwb3NlZCB0byBkbyB0aGUgc2FtZSBhbW91bnQgb2YgY2FsbHMgdG8gY3VybF9nbG9iYWxfY2xlYW51cCgpLgogIEJyeWFuIGhhcyBhbHNvIHVwZGF0ZWQgdGhlIGRvY3MgYWNjb3JkaW5nbHkuCgpEYW5pZWwgKDEzIEphbnVhcnkgMjAwNikKLSBBbmRyZXcgQmVuaGFtIGZpeGVkIGEgcmFjZSBjb25kaXRpb24gaW4gdGhlIHRlc3Qgc3VpdGUgdGhhdCBjb3VsZCBjYXVzZSB0aGUKICB0ZXN0IHNjcmlwdCB0byBraWxsIGFsbCBwcm9jZXNzZXMgaW4gdGhlIGN1cnJlbnQgcHJvY2VzcyBncm91cCEKCkRhbmllbCAoMTIgSmFudWFyeSAyMDA2KQotIE1pY2hhZWwgSmFobjoKCiAgRml4ZWQgRlRQX1NLSVBfUEFTVl9JUCBhbmQgRlRQX1VTRV9FUFNWIHRvICJkbyByaWdodCIgd2hlbiB1c2VkIG9uIEZUUCB0aHJ1CiAgSFRUUCBwcm94eS4KCiAgRml4ZWQgUFJPWFlUVU5ORUwgdG8gd29yayBmaW5lIHdoZW4geW91IGRvIGZ0cCB0aHJvdWdoIGEgcHJveHkuICBJdCB3b3VsZAogIHByZXZpb3VzbHkgb3ZlcndyaXRlIGludGVybmFsIG1lbW9yeSBhbmQgY2F1c2UgdW5wcmVkaWN0ZWQgYmVoYXZpb3VyIQoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDYpCi0gSSBkZWNpZGVkIHRvIGRvY3VtZW50IHRoZSAic2VjcmV0IG9wdGlvbiIgaGVyZSBub3csIGFzIEkndmUgcmVjZWl2ZWQgKk5PKgogIGZlZWRiYWNrIGF0IGFsbCBvbiBteSBtYWlsaW5nIGxpc3QgcmVxdWVzdHMgZnJvbSBOb3ZlbWJlciAyMDA1OgoKICBJJ20gbG9va2luZyBmb3IgZmVlZGJhY2sgYW5kIGNvbW1lbnRzLiBJIGFkZGVkIHNvbWUgZXhwZXJpbWVudGFsIGNvZGUgdGhlCiAgb3RoZXIgZGF5LCB0aGF0IGFsbG93cyBhIGxpYmN1cmwgdXNlciB0byBzZWxlY3Qgd2hhdCBtZXRob2QgbGliY3VybCBzaG91bGQKICB1c2UgdG8gcmVhY2ggYSBmaWxlIG9uIGEgRlRQKFMpIHNlcnZlci4KCiAgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSBpbiBDVlMgY29kZSBhbmQgaW4gcmVjZW50IGRhaWx5IHNuYXBzaG90cy4KCiAgTGV0IG1lIGV4cGxhaW4uLi4KCiAgVGhlIGN1cnJlbnQgbmFtZSBmb3IgdGhlIG9wdGlvbiBpcyBDVVJMT1BUX0ZUUF9GSUxFTUVUSE9EICgtLWZ0cC1tZXRob2QgZm9yCiAgdGhlIGNvbW1hbmQgbGluZSB0b29sKSBhbmQgeW91IHNldCBpdCB0byBhIGxvbmcgKHRoZXJlIGFyZSBjdXJyZW5seSBubwogIGRlZmluZXMgZm9yIHRoZSBhcmd1bWVudCB2YWx1ZXMsIGp1c3QgcGxhaW4gbnVtZXJpY2FscykuIFlvdSBjYW4gc2V0IHRocmVlCiAgZGlmZmVyZW50ICJtZXRob2RzIiB0aGF0IGRvIHRoaXM6CgogIDEgbXVsdGljd2QgLSBsaWtlIHRvZGF5LCBjdXJsIHdpbGwgZG8gYSBzaW5nbGUgQ1dEIG9wZXJhdGlvbiBmb3IgZWFjaCBwYXRoCiAgICAgICAgICAgcGFydCBpbiB0aGUgZ2l2ZW4gVVJMLiBGb3IgZGVlcCBoaWVyYXJjaGllcyB0aGlzIG1lYW5zIHZlcnkgbWFueQogICAgICAgICAgIGNvbW1hbmRzLiBUaGlzIGlzIGhvdyBSRkMxNzM4IHNheXMgaXQgc2hvdWxkIGJlIGRvbmUuIFRoaXMgaXMgdGhlCiAgICAgICAgICAgZGVmYXVsdC4KCiAgMiBub2N3ZCAtIG5vIENXRCBhdCBhbGwgaXMgZG9uZSwgY3VybCB3aWxsIGRvIFNJWkUsIFJFVFIsIFNUT1IgZXRjIGFuZCBnaXZlCiAgICAgICAgICAgYSBmdWxsIHBhdGggdG8gdGhlIHNlcnZlci4KCiAgMyBzaW5nbGVjd2QgLSBtYWtlIG9uZSBDV0Qgd2l0aCB0aGUgZnVsbCB0YXJnZXQgZGlyZWN0b3J5IGFuZCB0aGVuIG9wZXJhdGUKICAgICAgICAgICAgb24gdGhlIGZpbGUgIm5vcm1hbGx5Ii4KCiAgKFdpdGggdGhlIGNvbW1hbmQgbGluZSB0b29sIHlvdSBkbyAtLWZ0cC1tZXRob2QgW01FVEhPRF0sIHdoZXJlIFtNRVRIT0RdIGlzCiAgb25lIG9mICJtdWx0aWN3ZCIsICJub2N3ZCIgb3IgInNpbmdsZWN3ZCIuKQoKICBXaGF0IGZlZWRiYWNrIEknbSBpbnRlcmVzdGVkIGluOgoKICAxIC0gRG8gdGhleSB3b3JrIGF0IGFsbD8gRG8geW91IGZpbmQgc2VydmVycyB3aGVyZSBvbmUgb2YgdGhlc2UgZG9uJ3Qgd29yaz8KCiAgMiAtIFdoYXQgd291bGQgcHJvcGVyIG5hbWVzIGZvciB0aGUgb3B0aW9uIGFuZCBpdHMgYXJndW1lbnRzIGJlLCBpZiB3ZQogICAgICBjb25zaWRlciB0aGlzIGZlYXR1cmUgZ29vZCBlbm91Z2ggdG8gZ2V0IGluY2x1ZGVkIGFuZCBkb2N1bWVudGVkIGluCiAgICAgIHVwY29taW5nIHJlbGVhc2VzPwoKICAzIC0gU2hvdWxkIHdlIG1ha2UgbGliY3VybCBhYmxlIHRvICJ3YWxrIHRocm91Z2giIHRoZXNlIG9wdGlvbnMgaW4gY2FzZSBvZgogICAgICAocGF0aCByZWxhdGVkKSBmYWlsdXJlcywgb3Igc2hvdWxkIGl0IGZhaWwgYW5kIGxldCB0aGUgdXNlciByZWRvIGFueQogICAgICBwb3NzaWJsZSByZXRyaWVzPwoKICAoVGhpcyBvcHRpb24gaXMgbm90IGRvY3VtZW50ZWQgaW4gYW55IG1hbiBwYWdlIGp1c3QgeWV0IHNpbmNlIEknbSBub3Qgc3VyZQogIHRoZXNlIG5hbWVzIHdpbGwgYmUgdXNlZCBvciBpZiB0aGUgZnVuY3Rpb25hbGl0eSB3aWxsIGVuZCB1cCBleGFjdGx5IGxpa2UKICB0aGlzLiAgQW5kIGZvciB0aGUgc2FtZSByZWFzb25zIHdlIGhhdmUgbm8gdGVzdCBjYXNlcyBmb3IgdGhlc2UgeWV0LikKCkRhbmllbCAoMTAgSmFudWFyeSAyMDA2KQotIFdoZW4gdXNpbmcgYSBiYWQgcGF0aCBvdmVyIEZUUCwgYXMgaW4gd2hlbiBsaWJjdXJsIGNvdWxkbid0IENXRCBpbnRvIGFsbAogIGdpdmVuIHN1YmRpcnMsIGxpYmN1cmwgd291bGQgc3RpbGwgInJlbWVtYmVyIiB0aGUgZnVsbCBwYXRoIGFzIGlmIGl0IGlzIHRoZQogIGN1cnJlbnQgZGlyZWN0b3J5IGxpYmN1cmwgaXMgaW4gc28gdGhhdCB0aGUgbmV4dCBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdvdWxkCiAgZ2V0IHJlYWxseSBjb25mdXNlZCBpZiBpdCB0cmllZCB0aGUgc2FtZSBwYXRoIGFnYWluIC0gYXMgaXQgd291bGQgbm90IGlzc3VlCiAgYW55IENXRCBjb21tYW5kcyBhdCBhbGwsIGFzc3VtaW5nIGl0IGlzIGFscmVhZHkgaW4gdGhlICJwcm9wZXIiIGRpci4KCiAgU3RhcnRpbmcgbm93LCBhIGZhaWxlZCBDV0QgY29tbWFuZCBzZXRzIGEgZmxhZyB0aGF0IHByZXZlbnRzIHRoZSBwYXRoIHRvIGJlCiAgInJlbWVtYmVyZWQiIGFmdGVyIHJldHVybmluZy4KCkRhbmllbCAoNyBKYW51YXJ5IDIwMDYpCi0gTWljaGFlbCBKYWhuIGZpeGVkIHNvIHRoYXQgdGhlIHNlY29uZCBDT05ORUNUIHdoZW4gZG9pbmcgRlRQIG92ZXIgYSBIVFRQCiAgcHJveHkgYWN0dWFsbHkgdXNlZCBhIG5ldyBjb25uZWN0aW9uIGFuZCBub3Qgc2VudCB0aGUgc2Vjb25kIHJlcXVlc3Qgb24gdGhlCiAgZmlyc3Qgc29ja2V0IQoKRGFuaWVsICg2IEphbnVhcnkgMjAwNikKLSBBbGV4YW5kZXIgTGF6aWMgbWFkZSB0aGUgYnVpbGRjb25mIHJ1biB0aGUgYnVpbGRjb25mIGluIHRoZSBhcmVzIGRpciBpZiB0aGF0CiAgaXMgcHJlc2VudCBpbnN0ZWFkIG9mIHRyeWluZyB0byBtaW1pYyB0aGF0IHNjcmlwdCBpbiBjdXJsJ3MgYnVpbGRjb25mCiAgc2NyaXB0LgoKRGFuaWVsICgzIEphbnVhcnkgMjAwNikKLSBBbmRyZXMgR2FyY2lhIG1hZGUgdGhlIFRGVFAgdGVzdCBzZXJ2ZXIgYnVpbGQgd2l0aCBtaW5ndy4KRGFuaWVsICgxNiBEZWNlbWJlciAyMDA1KQotIEplYW4gSmFjcXVlcyBEcm91aW4gcG9pbnRlZCBvdXQgdGhhdCB5b3UgY291bGQgb25seSBoYXZlIGEgdXNlciBuYW1lIG9yCiAgcGFzc3dvcmQgb2YgMTI3IGJ5dGVzIG9yIGxlc3MgZW1iZWRkZWQgaW4gYSBVUkwsIHdoZXJlIGFjdHVhbGx5IHRoZSBjb2RlCiAgdXNlcyBhIDI1NSBieXRlIGJ1ZmZlciBmb3IgaXQhIE1vZGlmaWVkIG5vdyB0byB1c2UgdGhlIGZ1bGwgYnVmZmVyIHNpemUuCgpEYW5pZWwgKDEyIERlY2VtYmVyIDIwMDUpCi0gRG92IE11cmlrIGNvcnJlY3RlZCB0aGUgSFRUUF9PTkxZIGRlZmluZSB0byBkaXNhYmxlIHRoZSBURlRQIHN1cHBvcnQgcHJvcGVybHkKClZlcnNpb24gNy4xNS4xICg3IERlY2VtYmVyIDIwMDUpCgpEYW5pZWwgKDYgRGVjZW1iZXIgMjAwNSkKLSBGdWxsIHRleHQgaGVyZTogaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2Fkdl8yMDA1MTIwNy5odG1sIFBvaW50ZWQgb3V0IGJ5CiAgU3RlZmFuIEVzc2VyLgoKICBWVUxORVJBQklMSVRZCgogIGxpYmN1cmwncyBVUkwgcGFyc2VyIGZ1bmN0aW9uIGNhbiBvdmVyZmxvdyBhIG1hbGxvY2VkIGJ1ZmZlciBpbiB0d28gd2F5cywgaWYKICBnaXZlbiBhIHRvbyBsb25nIFVSTC4KCiAgVGhlc2Ugb3ZlcmZsb3dzIGhhcHBlbiBpZiB5b3UKIAogIDEgLSBwYXNzIGluIGEgVVJMIHdpdGggbm8gcHJvdG9jb2wgKGxpa2UgImh0dHA6Ly8iKSBwcmVmaXgsIHVzaW5nIG5vIHNsYXNoCiAgICAgIGFuZCB0aGUgc3RyaW5nIGlzIDI1NiBieXRlcyBvciBsb25nZXIuIFRoaXMgbGVhZHMgdG8gYSBzaW5nbGUgemVybyBieXRlCiAgICAgIG92ZXJmbG93IG9mIHRoZSBtYWxsb2NlZCBidWZmZXIuCgogIDIgLSBwYXNzIGluIGEgVVJMIHdpdGggb25seSBhIHF1ZXN0aW9uIG1hcmsgYXMgc2VwYXJhdG9yIChubyBzbGFzaCkgYmV0d2VlbgogICAgICB0aGUgaG9zdCBhbmQgdGhlIHF1ZXJ5IHBhcnQgb2YgdGhlIFVSTC4gVGhpcyBsZWFkcyB0byBhIHNpbmdsZSB6ZXJvIGJ5dGUKICAgICAgb3ZlcmZsb3cgb2YgdGhlIG1hbGxvY2VkIGJ1ZmZlci4KCiAgQm90aCBvdmVyZmxvd3MgY2FuIGJlIG1hZGUgd2l0aCB0aGUgc2FtZSBpbnB1dCBzdHJpbmcsIGxlYWRpbmcgdG8gdHdvIHNpbmdsZQogIHplcm8gYnl0ZSBvdmVyd3JpdGVzLgoKICBUaGUgYWZmZWN0ZWQgZmxhdyBjYW5ub3QgYmUgdHJpZ2dlcmVkIGJ5IGEgcmVkaXJlY3QsIGJ1dCB0aGUgbG9uZyBVUkwgbXVzdAogIGJlIHBhc3NlZCBpbiAiZGlyZWN0bHkiIHRvIGxpYmN1cmwuIEl0IG1ha2VzIHRoaXMgYSAibG9jYWwiIHByb2JsZW0uIE9mCiAgY291cnNlLCBsb3RzIG9mIHByb2dyYW1zIG1heSBzdGlsbCBwYXNzIGluIHVzZXItcHJvdmlkZWQgVVJMcyB0byBsaWJjdXJsCiAgd2l0aG91dCBkb2luZyBtdWNoIHN5bnRheCBjaGVja2luZyBvZiB0aGVpciBvd24sIGFsbG93aW5nIGEgdXNlciB0byBleHBsb2l0CiAgdGhpcyB2dWxuZXJhYmlsaXR5LgoKICBUaGVyZSBpcyBubyBrbm93biBleHBsb2l0IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4KCgpEYW5pZWwgKDIgRGVjZW1iZXIgMjAwNSkKLSBKYW1pZSBOZXd0b24gcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsJ3MgZmlsZTovLyBjb2RlIHdvdWxkIGNsb3NlKCkgYSB6ZXJvCiAgZmlsZSBkZXNjcmlwdG9yIGlmIGdpdmVuIGEgbm9uLWV4aXN0aW5nIGZpbGUuCgpEYW5pZWwgKDI0IE5vdmVtYmVyIDIwMDUpCi0gRG91ZyBLYXVmbWFuIHByb3ZpZGVkIGEgc2V0IG9mIHBhdGNoZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gREpHUFAKICBhZ2FpbiB1c2luZyBjb25maWd1cmUuCgotIFlhbmcgVHNlIHByb3ZpZGVkIGEgd2hvbGUgc2VyaWVzIG9mIHBhdGNoZXMgdG8gY2xlYXIgdXAgY29tcGlsZXIgd2FybmluZ3Mgb24KICBNU1ZDIDYuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDIwMDUpCi0gSSBleHRlbmRlZCBhIHBhdGNoIGZyb20gRGF2aWQgU2hhdyB0byBtYWtlIGxpYmN1cmwgX2Fsd2F5c18gcHJvdmlkZSBhbiBlcnJvcgogIHN0cmluZyBpbiB0aGUgZ2l2ZW4gZXJyb3IgYnVmZmVyIHRvIGFkZHJlc3MgdGhlIGZsYXcgbWVudGlvbiBvbiAyMSBzZXAgMjAwNS4KCkRhbmllbCAoMTYgTm92ZW1iZXIgMjAwNSkKLSBBcHBsaWVkIEFsYmVydCBDaGluJ3MgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgbGliY3VybC5wYyBwa2djb25maWcgZmlsZSBnZXQKICBpbnN0YWxsZWQgb24gJ21ha2UgaW5zdGFsbCcgdGltZS4KCkRhbmllbCAoMTQgTm92ZW1iZXIgMjAwNSkKLSBRdWFnbWlyZSByZXBvcnRlZCB0aGF0IGhlIG5lZWRlZCB0byByYWlzZSBhIE5UTE0gYnVmZmVyIGZvciBTU1BJIHRvIHdvcmsKICBwcm9wZXJseSBmb3IgYSBjYXNlLCBhbmQgc28gd2UgZGlkLiBXZSByYWlzZWQgaXQgZXZlbiBmb3Igbm9uLVNTUEkgYnVpbGRzCiAgYnV0IGl0IHNob3VsZCBub3QgZG8gYW55IGhhcm0uIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzNTY3MTUKCi0gSmFuIEt1bmRlcidzIGRlYmlhbiBidWcgcmVwb3J0CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMzODY4MCBpZGVudGlmaWVkIGEgd2VpcmQKICBlcnJvciBtZXNzYWdlIGZvciB3aGVuIHlvdSB0cnkgdG8gdXBsb2FkIGEgZmlsZSBhbmQgdGhlIHJlcXVlc3RlZCBkaXJlY3RvcnkKICBkb2Vzbid0IGV4aXN0IG9uIHRoZSB0YXJnZXQgc2VydmVyLgoKLSBZYW5nIFRzZSBmaXhlZCBjb21waWxlciB3YXJuaW5ncyBpbiBsaWIvc3NsdXNlLmMgd2l0aCBPcGVuU1NMIDAuOS44IGFuZCBpbgogIGxpYi9tZW1kZWJ1Zy5oIHRoYXQgc2hvd2VkIHVwIGluIGhpcyBtc3ZjIGJ1aWxkcy4KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwNSkKLSBEZWJpYW4gYnVnIHJlcG9ydCAzMzg2ODEgYnkgSmFuIEt1bmRlcjogbWFrZSBjdXJsIGJldHRlciBkZXRlY3QgYW5kIHJlcG9ydAogIGJhZCBsaW1pdC1yYXRlIHVuaXRzOgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMzg2ODEgTm93IGN1cmwgd2lsbCByZXR1cm4KICBlcnJvciBpZiBhIGJhZCB1bml0IGlzIHVzZWQuCgotIFRoYW5rcyB0byB0aGlzIG5pY2Ugc3VtbWFyeSBvZiBwb2xsKCkgaW1wbGVtZW50YXRpb25zOgogIGh0dHA6Ly93d3cuZ3JlZW5lbmQub3JnLnVrL3Jqay8yMDAxLzA2L3BvbGwuaHRtbCBhbmQgZnVydGhlciB0ZXN0cyBieSBFdWdlbmUKICBLb3RseWFyb3YsIHdlIG5vdyBrbm93IHRoYXQgY3lnd2luJ3MgcG9sbCByZXR1cm5zIG9ubHkgUE9MTEhVUCBvbiByZW1vdGUKICBjb25uZWN0aW4gY2xvc3VyZSBzbyB3ZSBjaGVjayBmb3IgdGhhdCBjYXNlICh0b28pIGFuZCByZS1lbmFibGUgcG9sbCBmb3IKICBjeWd3aW4gYnVpbGRzLgoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDA1KQotIEV1Z2VuZSBLb3RseWFyb3YgZm91bmQgb3V0IHRoYXQgY3lnd2luJ3MgcG9sbCgpIGZ1bmN0aW9uIGlzbid0IGRvaW5nIHRoaW5ncwogIHJpZ2h0OiBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA1LTExLzAwNDUuaHRtbCBzbyB3ZSBub3cgZGlzYWJsZQogIHBvbGwoKSBhbmQgdXNlIHNlbGVjdCgpIG9uIGN5Z3dpbiB0b28gKHdlIGFscmVhZHkgZG8gdGhlIHNhbWUgY2hvaWNlIG9uIE1hYwogIE9TIFgpCgotIERpbWEgQmFyc2t5IHBhdGNoZWQgcHJvYmxlbSAjMTM0ODkzMDogdGhlIEdudVRMUyBjb2RlIGNvbXBsZXRlbHkgaWdub3JlZAogIGNsaWVudCBjZXJ0aWZpY2F0ZXMhIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzQ4OTMwKS4KCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwNSkKLSBEYXZpZCBMYW5nIGZpeGVkIElQdjYgc3VwcG9ydCBmb3IgVEZUUCEKCi0gSW50cm9kdWNpbmcgcmFuZ2Ugc3RlcHBpbmcgdG8gdGhlIGN1cmwgZ2xvYmJpbmcgc3VwcG9ydC4gTm93IHlvdSBjYW4gc3BlY2lmeQogIHN0ZXAgY291bnRlciBieSBhZGRpbmcgOltudW1dIHdpdGhpbiB0aGUgYnJhY2tldHMgd2hlbiBzcGVjaWZ5aW5nIGEgcmFuZ2U6CgogICBbMS0xMDA6MTBdCiAgIFthLXo6Ml0KCiAgSWYgbm8gc3RlcCBjb3VudGVyIGlzIHNldCwgaXQgZGVmYXVsdHMgdG8gMSBhcyBiZWZvcmU6CgogICBbMS0xMDBdCiAgIFtkLWhdCgpEYW5pZWwgKDggTm92ZW1iZXIgMjAwNSkKLSBSZW1vdmVkIHRoZSB1c2Ugb2YgQUlfQ0FOT05OQU1FIGluIHRoZSBJUHY2LWVuYWJsZWQgcmVzb2x2ZXIgZnVuY3Rpb25zIHNpbmNlCiAgd2UgcmVhbGx5IGhhdmUgbm8gdXNlIGZvciByZXZlcnNlIGxvb2t1cHMgb2YgdGhlIGFkZHJlc3MuCgogIEkgdHJ1bHkgaG9wZSB0aGVzZSBhcmUgdGhlIGxhc3QgcmV2ZXJzZSBsb29rdXBzIHdlIGhhZCBsaW5nZXJpbmcgaW4gdGhlCiAgY29kZSEKCi0gRG1pdHJ5IEJhcnRzZXZpY2ggZGlzY292ZXJlZCBzb21lIGlzc3VlcyBpbiBjb21wYXRpYmlsdHkgb2YgU1NQSS1lbmFibGVkCiAgdmVyc2lvbiBvZiBsaWJjdXJsIHdpdGggZGlmZmVyZW50IFdpbmRvd3MgdmVyc2lvbnMuIEN1cnJlbnQgdmVyc2lvbiBvZgogIGxpYmN1cmwgaW1wb3J0cyBTU1BJIGZ1bmN0aW9ucyBmcm9tIHNlY3VyMzIuZGxsLiBIb3dldmVyLCB1bmRlciBXaW5kb3dzIE5UCiAgNC4wIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZCBpbiBzZWN1cml0eS5kbGwsIHVuZGVyIFdpbmRvd3MgOXggLSBpbgogIHNlY3VyMzIuZGxsIGFuZCBXaW5kb3dzIDIwMDAgYW5kIFhQIGNvbnRhaW5zIGJvdGggdGhlc2UgRExMcyAoc2VjdXJpdHkuZGxsCiAganVzdCBmb3J3YXJkcyBjYWxscyB0byBzZWN1cjMyLmRsbCkuCgogIERtaXRyeSdzIHBhdGNoIGxvYWRzIHByb3BlciBsaWJyYXJ5IGR5bmFtaWNhbGx5IGRlcGVuZGluZyBvbiBXaW5kb3dzCiAgdmVyc2lvbi4gRnVuY3Rpb24gSW5pdFNlY3VyaXR5SW50ZXJmYWNlKCkgaXMgdXNlZCB0byBvYnRhaW4gcG9pbnRlcnMgdG8gYWxsCiAgb2YgU1NQSSBmdW5jdGlvbiBpbiBvbmUgc3RydWN0dXJlLgoKRGFuaWVsICgzMSBPY3RvYmVyIDIwMDUpCi0gVmlsbW9zIE5lYmVoYWogaW1wcm92ZWQgbGliY3VybCdzIExEQVAgYWJpbGl0aWVzOgoKICBUaGUgTERBUCBjb2RlIGluIGxpYmN1cmwgY2FuJ3QgaGFuZGxlIExEQVAgc2VydmVycyBvZiBMREFQdjMgbm9yIGJpbmFyeQogIGF0dHJpYnV0ZXMgaW4gTERBUCBvYmplY3RzLiBTbywgSSBtYWRlIGEgcXVpY2sgcGF0Y2ggdG8gYWRkcmVzcyB0aGVzZQogIHByb2JsZW1zLgoKICBUaGUgc29sdXRpb24gaXMgc2ltcGxlOiBpZiB3ZSBjb25uZWN0IHRvIGFuIExEQVAgc2VydmVyLCBmaXJzdCB0cnkgTERBUHYzCiAgKHdoaWNoIGlzIHRoZSBwcmVmZXJyZWQgcHJvdG9jb2wgYXMgb2Ygbm93KSBhbmQgdGhlbiBmYWxsIGJhY2sgdG8gTERBUHYyLgogIEluIGNhc2Ugb2YgYmluYXJ5IGF0dHJpYnV0ZXMsIHdlIGZpcnN0IGNvbnZlcnQgdGhlbSB0byBiYXNlNjQsIGp1c3QgbGlrZSB0aGUKICBvcGVubGRhcCBjbGllbnQgZG9lcy4gSXQgdXNlcyBsZGFwX2dldF92YWx1ZXNfbGVuKCkgaW5zdGVhZCBvZgogIGxkYXBfZ2V0X3ZhbHVlcygpIHRvIGJlIGFibGUgdG8gcmV0cmlldmUgYmluYXJ5IGF0dHJpYnV0ZXMgY29ycmVjdGx5LiBJCiAgZGVmaW5lZCB0aGUgbmVjZXNzYXJ5IExEQVAgbWFjcm9zIGluIGxpYi9sZGFwLmMgdG8gYmUgYWJsZSB0byBjb21waWxlCiAgbGliY3VybCB3aXRob3V0IHRoZSBwcmVzZW5jZSBvZiBsaWJsZGFwCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwNSkKLSBOaXMgSm9yZ2Vuc2VuIGZpbGVkIGJ1ZyByZXBvcnQgIzEzMzg2NDgKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMzODY0OCkgd2hpY2ggcmVhbGx5IGlzIG1vcmUgb2YgYQogIGZlYXR1cmUgcmVxdWVzdCwgYnV0IGFueXdheS4gSXQgcG9pbnRlZCBvdXQgdGhhdCAtLW1heC1yZWRpcnMgZGlkIG5vdCBhbGxvdwogIGl0IHRvIGJlIHNldCB0byAwLCB3aGljaCB0aGVuIHdvdWxkIHJldHVybiBhbiBlcnJvciBjb2RlIG9uIHRoZSBmaXJzdAogIExvY2F0aW9uOiBmb3VuZC4gQmFzZWQgb24gTmlzJyBwYXRjaCwgbm93IGxpYmN1cmwgc3VwcG9ydHMgQ1VSTE9QVF9NQVhSRURJUlMKICBzZXQgdG8gMCwgb3IgLTEgZm9yIGluZmluaXR5LiBBZGRlZCB0ZXN0IGNhc2UgMjc0IHRvIHZlcmlmeS4KCi0gdG9tbWlua1thdF1wb3N0LnBsIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzEzMzc3MjMKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMzNzcyMykgdGhhdCBjdXJsIGNvdWxkIG5vdCB1cGxvYWQKICBiaW5hcnkgZGF0YSBmcm9tIHN0ZGluIG9uIFdpbmRvd3MgaWYgdGhlIGRhdGEgY29udGFpbmVkIGNvbnRyb2wtWiAoaGV4IDFhKQogIHNpbmNlIHRoYXQgaXMgdHJlYXRlZCBhcyBlbmQtb2YtZmlsZSB3aGVuIHJlYWQgaW4gdGV4dCBtb2RlLiBHaXNsZSBWYW5lbQogIHBvaW50ZWQgb3V0IHRoZSBmaXgsIGFuZCBJIG1hZGUgYm90aCAtVCBhbmQgLS1kYXRhLWJpbmFyeSB0YWtlIGFkdmFudGFnZSBvZgogIGl0LgoKLSBKYXogRnJlc2ggcG9pbnRlZCBvdXQgdGhhdCBpZiB5b3UgdXNlZCAiLXIgW251bWJlcl0iIGFzIHdhcyB3cm9uZ2x5IGRlc2NyaWJlZAogIGluIHRoZSBtYW4gcGFnZSwgY3VybCB3b3VsZCBzZW5kIGFuIGludmFsaWQgSFRUUCBSYW5nZTogaGVhZGVyLiBUaGUgY29ycmVjdAogIHdheSB3b3VsZCBiZSB0byB1c2UgIi1yIFtudW1iZXJdLSIgb3IgZXZlbiAiLXIgLVtudW1iZXJdIi4gU3RhcnRpbmcgbm93LAogIGN1cmwgd2lsbCB3YXJuIGlmIHRoaXMgaXMgZGlzY292ZXJlZCwgYW5kIGF1dG9tYXRpY2FsbHkgYXBwZW5kIGEgZGFzaCB0byB0aGUKICByYW5nZSBiZWZvcmUgcGFzc2luZyBpdCB0byBsaWJjdXJsLgoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDUpCi0gQW1vbCBQYXR0ZWthciByZXBvcnRlZCBhIGJ1ZyB3aXRoIGdyZWF0IGRldGFpbCBhbmQgYSBmaW5lIGV4YW1wbGUgaW4gYnVnCiAgIzEzMjYzMDYgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMjYzMDYpLiBXaGVuIHVzaW5nIHRoZSBtdWx0aQogIGludGVyZmFjZSBhbmQgY29ubmVjdGluZyB0byBhIGhvc3Qgd2l0aCBtdWx0aXBsZSBJUCBhZGRyZXNzZXMsIGFuZCBvbmUgb2YKICB0aGUgYWRkcmVzc2VzIGZhaWxzIHRvIGNvbm5lY3QgKHRoZSBzZXJ2ZXIgbXVzdCBleGlzdCBhbmQgcmVzcG9uZCwganVzdCBub3QKICBhY2NlcHQgY29ubmVjdGlvbnMpIGxpYmN1cmwgbGVha3MgYSBzb2NrZXQgZGVzY3JpcHRvci4gVGhhbmtzIHRvIHRoZSBmaW5lCiAgcmVwb3J0LCBJIGNvdWxkIGZpbmQgYW5kIGZpeCB0aGlzLgoKRGFuaWVsICgyMiBPY3RvYmVyIDIwMDUpCi0gRGltYSBCYXJza3kgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggR251VExTLWVuYWJsZWQgbGliY3VybCBpbiBidWcgcmVwb3J0CiAgIzEzMzQzMzggKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzQzMzgpLiBXaGVuIHJlYWRpbmcgYW4gU1NMCiAgc3RyZWFtIGZyb20gYSBzZXJ2ZXIgYW5kIHRoZSBzZXJ2ZXIgcmVxdWVzdHMgYSAicmVoYW5kc2hha2UiLCB0aGUgY3VycmVudAogIGNvZGUgc2ltcGx5IHJldHVybnMgdGhpcyBhcyBhbiBlcnJvci4gSSBoYXZlIG5vIGdvb2Qgd2F5IHRvIHRlc3QgdGhpcywgYnV0CiAgSSd2ZSBhZGRlZCBhIGNydWRlIGF0dGVtcHQgb2YgZGVhbGluZyB3aXRoIHRoaXMgc2l0dWF0aW9uIHNsaWdodGx5IGJldHRlciAtCiAgaXQgbWFrZXMgYSBibG9ja2luZyBoYW5kc2hha2UgaWYgdGhpcyBoYXBwZW5zLiBEb25lIGxpa2UgdGhpcyBiZWNhdXNlIGZpeGluZwogIHRoaXMgdGhlICJwcm9wZXIiIHdheSAodGhhdCB3b3VsZCBoYW5kc2hha2UgYXN5bmNocm9ub3VzbHkpIHdpbGwgcmVxdWlyZQogIHF1aXRlIHNvbWUgd29yayBhbmQgSSByZWFsbHkgbmVlZCBhIGdvb2Qgd2F5IHRvIHRlc3QgdGhpcyB0byBkbyBzdWNoIGEKICBjaGFuZ2UuCgpEYW5pZWwgKDIxIE9jdG9iZXIgMjAwNSkKLSAiT2ZlciIgcmVwb3J0ZWQgYSBwcm9ibGVtIHdoZW4gbGliY3VybCByZS11c2VkIGEgY29ubmVjdGlvbiBhbmQgZmFpbGVkIHRvIGRvCiAgaXQsIGl0IGNvdWxkIHRoZW4gYWNjaWRlbnRhbGx5IGFjdHVhbGx5IGNyYXNoLiBQcmVzdW1hYmx5LCB0aGlzIGNvbmNlcm5zIEZUUAogIGNvbm5lY3Rpb25zLiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMzMDMxMAoKLSBUZW1wcmltdXMgaW1wcm92ZWQgdGhlIE1TVkMgbWFrZWZpbGUgc28gdGhhdCB0aGUgc3RhdGljIGRlYnVnIFNTTCBsaWJzIGFyZQogIGxpbmtlZCB0byB0aGUgZXhlY3V0YWJsZSBhbmQgbm90IHRvIHRoZSBsaWJjdXJsZC5saWIKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzI2Njc2CgotIEJyYWRmb3JkIEJydWNlIG1hZGUgdGhlIHdpbmRvd3MgcmVzb2x2ZXIgY29kZSBwcm9wZXJseSByZXR1cm4KICBDVVJMRV9DT1VMRE5UX1JFU09MVkVfUFJPWFkgYW5kIENVUkxFX0NPVUxETlRfUkVTT0xWRV9IT1NUIG9uIHJlc29sdmluZwogIGVycm9ycyAoYXMgZG9jdW1lbnRlZCkuCgpEYW5pZWwgKDIwIE9jdG9iZXIgMjAwNSkKLSBEYXZlIERyaWJpbiBtYWRlIGxpYmN1cmwgdW5kZXJzdGFuZCBhbmQgaGFuZGxlIGNhc2VzIHdoZW4gdGhlIHNlcnZlcgogICh3cm9uZ2x5KSBzZW5kcyAqdHdvKiBXV1ctQXV0aGVudGljYXRlIGhlYWRlcnMgZm9yIERpZ2VzdC4gV2hpbGUgdGhpcyBzaG91bGQKICBuZXZlciBoYXBwZW4gaW4gYSBzYW5lIHdvcmxkLCBsaWJjdXJsIHByZXZpb3VzbHkgZ290IGludG8gYW4gaW5maW5pdGUgbG9vcAogIHdoZW4gdGhpcyBvY2N1cnJlZC4gRGF2ZSBhZGRlZCB0ZXN0IDI3MyB0byB2ZXJpZnkgdGhpcy4KCi0gVGVtcHJpbXVzIGltcHJvdmVkIHRoZSBNU1ZDIG1ha2VmaWxlOiAibWFrZXMgYSBidWlsZCBvcHRpb24gYXZhaWxhYmxlIHNvIGlmCiAgeW91IHNldCBydGxpYmNmZz1zdGF0aWMgZm9yIHRoZSBtYWtlLCB0aGVuIGl0IHdvdWxkIGJ1aWxkIHdpdGggL01ULiBUaGUKICBkZWZhdWx0IGJlaGF2aW91ciBpcyAvTUQgKHRoZSBvcmlnaW5hbCkuIgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMjY2NjUKCkRhbmllbCAoMTQgT2N0b2JlciAyMDA1KQotIFJldmVydGVkIHRoZSBMSUJDVVJMX1ZFUlNJT05fTlVNIGNoYW5nZSBmcm9tIE9jdG9iZXIgNi4gQXMgRGF2ZSBEcmliaW4KICByZXBvcnRlZCwgdGhlIGRlZmluZSBpcyB1c2VkIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBpcyBhc3N1bWVkIHRvIHVzZQogIHRoZSAweFlZWFhaWiBmb3JtYXQuIFRoaXMgbWFkZSAiY3VybC1jb25maWcgLS12ZXJudW0iIGZhaWwgaW4gdGhlIDcuMTUuMAogIHJlbGVhc2UgdmVyc2lvbi4KClZlcnNpb24gNy4xNS4wICgxMyBPY3RvYmVyIDIwMDUpCgpEYW5pZWwgKDEyIE9jdG9iZXIgMjAwNSkKLSBNaWNoYWVsIFN1dHRvbiBvZiBpREVGRU5TRSByZXBvcnRlZCBhbmQgSSBmaXhlZCBhIHNlY3VyaXRmeSBmbGF3IGluIHRoZSBOVExNCiAgY29kZSB0aGF0IHdvdWxkIG92ZXJmbG93IGEgYnVmZmVyIGlmIGdpdmVuIGEgdG9vIGxvbmcgdXNlciBuYW1lIG9yIGRvbWFpbgogIG5hbWUuIFRoaXMgd291bGQgaGFwcGVuIGlmIHlvdSBlbmFibGUgTlRMTSBhdXRoZW50aWNhdGlvbiBhbmQgZWl0aGVyCgogIEEgLSBwYXNzIGluIGEgdXNlciBuYW1lIGFuZCBkb21haW4gbmFtZSB0byBsaWJjdXJsIHRoYXQgdG9nZXRoZXIgYXJlIGxvbmdlcgogICAgICB0aGFuIDE5MiBieXRlcwoKICBCIC0gYWxsb3cgKGxpYiljdXJsIHRvIGZvbGxvdyBIVFRQICJyZWRpcmVjdHMiIChMb2NhdGlvbjogYW5kIHRoZQogICAgICBhcHByb3ByaWF0ZSBIVFRQIDMweCByZXNwb25zZSBjb2RlKSBhbmQgdGhlIG5ldyBVUkwgY29udGFpbnMgYSBVUkwgd2l0aAogICAgICBhIHVzZXIgbmFtZSBhbmQgZG9tYWluIG5hbWUgdGhhdCB0b2dldGhlciBhcmUgbG9uZ2VyIHRoYW4gMTkyIGJ5dGVzCgogIFNlZSBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3Mvc2VjdXJpdHkuaHRtbCBmb3IgZnVydGhlciBkZXRhaWxzIGFuZCB1cGRhdGVzCgpEYW5pZWwgKDUgT2N0b2JlciAyMDA1KQotIERhcnJ5bCBIb3VzZSByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCB1c2luZyAteiB0byBkb3dubG9hZCBmaWxlcyBmcm9tIEZUUC4KICBJdCB0dXJuZWQgb3V0IHRoYXQgaWYgdGhlIGdpdmVuIHRpbWUgc3RhbXAgd2FzIGV4YWN0IHRoZSBzYW1lIGFzIHRoZSByZW1vdGUKICB0aW1lIHN0YW1wLCB0aGUgZmlsZSB3b3VsZCBzdGlsbCB3cm9uZ2x5IGJlIGRvd25sb2FkZWQuIEFkZGVkIHRlc3QgY2FzZSAyNzIKICB0byB2ZXJpZnkuCgpEYW5pZWwgKDQgT2N0b2JlciAyMDA1KQotIERvbWVuaWNvIEFuZHJlb2xpIGZpeGVkIGEgbWFuIHBhZ2UgbWFsZm9ybWF0IGFuZCByZW1vdmVkIG9kZCAoMHhhMCkgYnl0ZXMKICBmcm9tIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKLSBNaWNoYWVsIFdhbGxuZXIgcmVwb3J0ZWQgdGhhdCB0aGUgZGF0ZSBwYXJzZXIgaGFkIHdyb25nIG9mZnNldCBzdG9yZWQgZm9yCiAgdGhlIE1FU1QgYW5kIENFU1QgdGltZSB6b25lcy4KCkRhbmllbCAoMjcgU2VwdGVtYmVyIDIwMDUpCi0gRGF2aWQgWWFuIGZpbGVkIGJ1ZyAjMTI5OTE4MSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTI5OTE4MSkKICB0aGF0IGlkZW50aWZpZWQgYSBzaWxseSBwcm9ibGVtIHdpdGggQ29udGVudC1SYW5nZTogaGVhZGVycyB3aXRoIHRoZSAnYnl0ZXMnCiAga2V5d29yZCB3cml0dGVuIGluIGEgZGlmZmVyZW50IGNhc2UgdGhhbiBhbGwgbG93ZXJjYXNlISBJdCB3b3VsZCBjYXVzZSBhCiAgc2VnZmF1bHQhCgotIFRKIFNhdW5kZXJzIG9mIHRoZSBwcm9mdHBkIHByb2plY3QgaWRlbnRpZmllZCBhbmQgcG9pbnRlZCBvdXQgcHJvYmxlbXMgd2l0aAogIHRoZSBtb2RpZmllZCBGVFBTIG5lZ290aWF0aW9uIGNoYW5nZSBvZiBBdWd1c3QgMTkgMjAwNS4gVGh1cywgd2UgcmV2ZXJ0IHRoZQogIGNoYW5nZSBiYWNrIHRvIHByZS03LjE0LjEgc3RhdHVzLgoKRGFuaWVsICgyMSBTZXB0ZW1iZXIgMjAwNSkKLSBGaXhlZCAiY3V0IG9mZiIgc2VudGVuY2UgaW4gdGhlIGxpYmN1cmwtdHV0b3JpYWwgbWFuIHBhZ2U6CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMyOTMwNQoKLSBDbGFyaWZpZWQgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2Ugd2hhdCB0aGUgZGVmYXVsdAogIENVUkxPUFRfV1JJVEVGVU5DVElPTiBhbmQgQ1VSTE9QVF9XUklURURBVEEgbWVhbjoKICBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzI5MzExCgotIENsYXJpZmllZCBpbiB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSB0aGF0IENVUkxPUFRfRVJST1JCVUZGRVIKICBzb21ldGltZXMgZG9lc24ndCBmaWxsIGluIHRoZSBidWZmZXIgZXZlbiB0aG91Z2ggaXQgaXMgc3VwcG9zZWQgdG86CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMyOTMxMwoKLSBXaGVuIENVUkxFX1VSTF9NQUxGT1JNQVQgaXMgcmV0dXJuZWQgZHVlIHRvIGEgbWlzc2luZyBVUkwsIGl0IG5vdyBoYXMgYW4KICBlcnJvciBzdHJpbmcgc2V0LgoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwNSkKLSBEbWl0cnkgQmFydHNldmljaCBtYWRlIHRoZSBTU1BJIHN1cHBvcnQgd29yayBvbiBXaW5kb3dzIDl4IGFzIHdlbGwuCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDA1KQotIEFkZGVkIGEgVEZUUCBzZXJ2ZXIgdG8gdGhlIHRlc3Qgc3VpdGUgYW5kIG1hZGUgdGhlIHRlc3Qgc3VpdGUgY2FwYWJsZSBvZgogIHVzaW5nIGl0LgoKRGFuaWVsICg3IFNlcHRlbWJlciAyMDA1KQotIEJlbiBNYWRzZW4ncyBkZXRhaWxlZCByZXBvcnRzIHRoYXQgZnVubmlseSBlbm91Z2ggb25seSBvY2N1cnJlZCB3aXRoIGNlcnRhaW4KICBnbGliYyB2ZXJzaW9ucyB0dXJuZWQgb3V0IHRvIGJlIGN1cmwgdXNpbmcgYW4gYWxyZWFkeSBjbG9zZWQgZmlsZSBoYW5kbGUKICBkdXJpbmcgY2VydGFpbiBjb25kaXRpb25zIChsaWtlIHdoZW4gc2F2aW5nIEZUUCBzZXJ2ZXIgImhlYWRlcnMiKS4KCi0gU2NvdHQgRGF2aXMgaGVscGVkIG1lIHRyYWNrIGRvd24gYSBwcm9ibGVtIGluIHRoZSB0ZXN0IEhUVFAgc2VydmVyIHRoYXQgbWFkZQogIHRlc3QgY2FzZSA1NiB3cm9uZ2x5IGZhaWwgYXQgdGltZXMuIEl0IHR1cm5lZCBvdXQgaXQgd2FzIGR1ZSB0byB0aGUgc2VydmVyCiAgZmluZGluZyB0aGUgZW5kIG9mIGEgY2h1bmtlZC1lbmNvZGVkIFBPU1QgdG9vIGVhcmx5LgoKRGFuaWVsICg2IFNlcHRlbWJlciAyMDA1KQotIE5vdyBjdXJsIHdhcm5zIGlmIGFuIHVua25vd24gdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgLXcvLS13cml0ZW91dCBhcmd1bWVudC4KCkRhbmllbCAoNCBTZXB0ZW1iZXIgMjAwNSkKLSBJIGFwcGxpZWQgTmljb2xhcyBGcmFu529pcycgbWFuIHBhZ2UgcGF0Y2ggaGUgcG9zdGVkIHRvIHRoZSBEZWJpYW4gYnVnCiAgdHJhY2tlci4gSXQgY29ycmVjdGVkIHR3byBsaW5lcyB0aGF0IHN0YXJ0ZWQgd2l0aCBhcG9zdHJvcGhlcywgd2hpY2ggaXNuJ3QKICBsZWdhbCBucm9mZiBmb3JtYXQuIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMjY1MTEKCi0gQWRkZWQgLS1mdHAtc2tpcC1wYXN2LWlwIHRvIHRoZSBjb21tYW5kIGxpbmUgdG9vbCwgdGhhdCBzZXRzIHRoZSBuZXcKICBDVVJMT1BUX0ZUUF9TS0lQX1BBU1ZfSVAgb3B0aW9uLiBJdCBtYWtlcyBsaWJjdXJsIHJlLXVzZSB0aGUgY29udHJvbAogIGNvbm5lY3Rpb24ncyBJUCBhZGRyZXNzIHdoZW4gc2V0dGluZyB1cCB0aGUgZGF0YSBjb25uZWN0aW9uIGluc3RlYWQgb2YKICBleHRyYWN0dGluZyB0aGUgSVAgYWRkcmVzcyBmcm9tIHRoZSBQQVNWIHJlc3BvbnNlLiBJdCBoYXMgdHVybmVkIG91dCB0aGlzCiAgZmVhdHVyZSBpcyBmcmVxdWVudGx5IG5lZWRlZCBieSBwZW9wbGUgdG8gY2lyY3VtdmVudCBzaWxseSBzZXJ2ZXJzIGFuZCBzaWxseQogIGZpcmV3YWxscywgZXNwZWNpYWxseSB3aGVuIEZUUFMgaXMgdXNlZCBhbmQgdGhlIFBBU1YgY29tbWFuZC1yZXNwb25zZSBpcwogIHNlbnQgZW5jcnR5cGVkLgoKICBTcG9uc29yZWQgYnkgQ1UqQW5zd2VycwoKRGFuaWVsICgxIFNlcHRlbWJlciAyMDA1KQotIEpvaG4gS2VsbHkgYWRkZWQgVEZUUCBzdXBwb3J0IHRvIGxpYmN1cmwuIEEgYnVuY2ggb2YgbmV3IGVycm9yIGNvZGVzIHdhcwogIGFkZGVkLiBUT0RPOiBhZGQgdGhlbSB0byBkb2NzLiBhZGQgVEZUUCBzZXJ2ZXIgdG8gdGVzdCBzdWl0ZS4gYWRkIFRGVFAgdG8KICBsaXN0IG9mIHByb3RvY29scyB3aGVyZWV2ZXIgdGhvc2UgYXJlIG1lbnRpb25lZC4KClZlcnNpb24gNy4xNC4xICgxIFNlcHRlbWJlciAyMDA1KQoKRGFuaWVsICgyOSBBdWd1c3QgMjAwNSkKLSBLZXZpbiBMdXNzaWVyIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIGN1cmxsaWIuZHNwIGFuZCBob3cgdG8gZml4IGl0LgoKLSBJZ29yIFBvbHlha292IGZpeGVkIGEgcmF0aGVyIG5hc3R5IHByb2JsZW0gd2l0aCB0aGUgdGhyZWFkZWQgbmFtZSByZXNvbHZlcgogIGZvciBXaW5kb3dzLCB0aGF0IGNvdWxkIGxlYWQgdG8gYW4gQWNjZXNzIFZpb2xhdGlvbiB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2UKICB3YXMgdXNlZCBkdWUgdG8gYW4gaXNzdWUgd2l0aCBob3cgdGhlIHJlc29sdmVyIHRocmVhZCB3YXMgYW5kIHdhcyBub3QKICB0ZXJtaW5hdGVkLgoKLSBTaW1vbiBKb3NlZnNzb24gYnJvdWdodCBhIHBhdGNoIHRoYXQgYWxsb3dzIGN1cmwgdG8gZ2V0IGJ1aWx0IHRvIHVzZSBHTlUgR1NTCiAgaW5zdGVhZCBvZiBNSVQvSGVpbWRhbCBmb3IgR1NTIGNhcGFiaWxpdGllcy4KCkRhbmllbCAoMjQgQXVndXN0IDIwMDUpCi0gVG9ieSBQZXRlcnNvbiBhZGRlZCBDVVJMT1BUX0lHTk9SRV9DT05URU5UX0xFTkdUSCB0byB0aGUgbGlicmFyeSwgYWNjZXNzaWJsZQogIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0b29sIHdpdGggLS1pZ25vcmUtY29udGVudC1sZW5ndGguIFRoaXMgd2lsbCBtYWtlIGl0CiAgZWFzaWVyIHRvIGRvd25sb2FkIGZpbGVzIGZyb20gQXBhY2hlIDEueCAoYW5kIHNpbWlsYXIpIHNlcnZlcnMgdGhhdCBhcmUKICBzdGlsbCBoYXZpbmcgcHJvYmxlbXMgc2VydmluZyBmaWxlcyBsYXJnZXIgdGhhbiAyIG9yIDQgR0IuIFdoZW4gdGhpcyBvcHRpb24KICBpcyBlbmFibGVkLCBjdXJsIHdpbGwgc2ltcGx5IGhhdmUgdG8gd2FpdCBmb3IgdGhlIHNlcnZlciB0byBjbG9zZSB0aGUKICBjb25uZWN0aW9uIHRvIHNpZ25hbCBlbmQgb2YgdHJhbnNmZXIuIEkgd3JvdGUgdGVzdCBjYXNlIDI2OSB0aGF0IHJ1bnMgYQogIHNpbXBsZSB0ZXN0IHRvIHZlcmlmeSB0aGF0IHRoaXMgd29ya3MuCgotIChUcnlpbmcgaGFyZCB0byBleGNsdWRlIGVtb3Rpb25zIG5vdy4pIHZhbGdyaW5kIHZlcnNpb24gMyBzdWRkZW5seSByZW5hbWVkCiAgdGhlIC0tbG9nZmlsZSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIC0tbG9nLWZpbGUsIGFuZCB0aHVzIHRoZSB0ZXN0IHNjcmlwdAogIHZhbGdyaW5kIGF1dG9kZXRlY3Rpb24gbm93IGhhcyB5ZXQgYW5vdGhlciB2ZXJzaW9uIGNoZWNrIHRvIGRvIGFuZCB0aGVuIGl0CiAgYWx0ZXJzIHRoZSB2YWxncmluZCBjb21tYW5kIGxpbmUgYWNjb3JkaW5nbHkuCgotIEZpeGVkIENBIGNlcnQgdmVyaWZpY2F0aW9uIHVzaW5nIEdudVRMUyB3aXRoIHRoZSBkZWZhdWx0IGJ1bmRsZSwgd2hpY2gKICBwcmV2aW91c2x5IGZhaWxlZCBkdWUgdG8gR251VExTIG5vdCBhbGxvd2luZyB4NTA5IHYxIENBIGNlcnRzIGJ5IGRlZmF1bHQuCiAgUmFscGggTWl0Y2hlbGwgcmVwb3J0ZWQuCgpEYW5pZWwgKDE5IEF1Z3VzdCAyMDA1KQotIE5vcmJlcnQgTm92b3RueSBoYWQgcHJvYmxlbXMgd2l0aCBGVFBTIGFuZCBoZSBoZWxwZWQgbWUgd29yayBvdXQgYSBwYXRjaAogIHRoYXQgbWFkZSBjdXJsIHJ1biBmaW5lIGluIGhpcyBlbmQuIFRoZSBrZXkgd2FzIHRvIG1ha2Ugc3VyZSB3ZSBkbyB0aGUKICBTU0wvVExTIG5lZ290aWF0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBUQ1AgY29ubmVjdCBpcyBkb25lIGFuZCBub3QgYWZ0ZXIKICBhIGZldyBvdGhlciBjb21tYW5kcyBoYXZlIGJlZW4gc2VudCBsaWtlIHdlIGRpZCBwcmV2aW91c2x5LiBJIGRvbid0IGNvbnNpZGVyCiAgdGhpcyBjaGFuZ2UgbmVjZXNzYXJ5IHRvIG9iZXkgdGhlIHN0YW5kYXJkcywgSSB0aGluayB0aGlzIHNlcnZlciBpcyBwaWNraWVyCiAgdGhhbiB3aGF0IHRoZSBzcGVjcyBhbGxvdyBpdCB0byBiZSwgYnV0IEkgY2FuJ3Qgc2VlIGhvdyB0aGlzIG1vZGlmaWVkCiAgbGliY3VybCBjb2RlIGNhbiBhZGQgYW55IHByb2JsZW1zIHRvIHRob3NlIHdobyBhcmUgaW50ZXJwcmV0aW5nIHRoZQogIHN0YW5kYXJkcyBtb3JlIGxpYmVyYWxseS4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDUpCi0gSmVmZiBQb2hsbWV5ZXIgZm91bmQgb3V0IHRoYXQgaWYgeW91IGFzayBsaWJjdXJsIHRvIGxvYWQgYSBjb29raWVmaWxlICh3aXRoCiAgQ1VSTE9QVF9DT09LSUVGSUxFKSwgYWRkIGEgY29va2llICh3aXRoIENVUkxPUFRfQ09PS0lFTElTVCksIHRlbGwgaXQgdG8KICB3cml0ZSB0aGUgcmVzdWx0IHRvIGEgZ2l2ZW4gY29va2llIGphciBhbmQgdGhlbiBuZXZlciBhY3R1YWxseSBjYWxsCiAgY3VybF9lYXN5X3BlcmZvcm0oKSAtIHRoZSBnaXZlbiBmaWxlKHMpIHRvIHJlYWQgd2FzIG5ldmVyIHJlYWQgYnV0IHRoZQogIG91dHB1dCBmaWxlIHdhcyB3cml0dGVuIGFuZCB0aHVzIGl0IGNhdXNlZCBhICJmdW5ueSIgcmVzdWx0LgoKLSBXaGlsZSBkb2luZyBzb21lIHRlc3RzIGZvciB0aGUgYnVnIGFib3ZlLCBJIG5vdGljZWQgdGhhdCBGaXJlZm94IGdlbmVyYXRlcwogIGxhcmdlIG51bWJlcnMgKGZvciB0aGUgZXhwaXJlIHRpbWUpIGluIHRoZSBjb29raWVzLnR4dCBmaWxlIGFuZCBsaWJjdXJsCiAgZGlkbid0IHRyZWF0IHRoZW0gcHJvcGVybHkuIE5vdyBpdCBkb2VzLgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwNSkKLSBBZGRlZCBtb3JlIHZlcmJvc2UgIndhcm5pbmciIG1lc3NhZ2VzIHRvIHRoZSBjdXJsIGNsaWVudCBmb3IgY2FzZXMgd2hlcmUgaXQKICBmYWlscyB0byBvcGVuL3JlYWQgZmlsZXMgZXRjIHRvIGhlbHAgdXNlcnMgZGlhZ25vc2Ugd2h5IGl0IGRvZXNuJ3QgZG8gd2hhdAogIHlvdSdkIGV4cGVjdCBpdCB0by4gQ29udmVydGVkIGxvdHMgb2Ygb2xkIG1lc3NhZ2VzIHRvIHVzZSB0aGUgbmV3IGdlbmVyaWMKICBmdW5jdGlvbiBJIHdyb3RlIGZvciB0aGlzIHB1cnBvc2UuCgpEYW5pZWwgKDEzIEF1Z3VzdCAyMDA1KQotIEphbWVzIEJ1cnNhIGlkZW50aWZpZWQgYSBsaWJjdXJsIEhUVFAgYnVnIGFuZCBhIGdvb2Qgd2F5IHRvIHJlcGVhdCBpdC4gSWYgYQogIHNpdGUgcmVzcG9uZHMgd2l0aCBiYWQgSFRUUCByZXNwb25zZSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhbnkgaGVhZGVyIGF0IGFsbCwKICBvbmx5IGEgcmVzcG9uc2UgYm9keSwgYW5kIHRoZSB3cml0ZSBjYWxsYmFjayByZXR1cm5zIDAgdG8gYWJvcnQgdGhlCiAgdHJhbnNmZXIsIGl0IGRpZG4ndCBoYXZlIGFueSByZWFsIGVmZmVjdCBidXQgdGhlIHdyaXRlIGNhbGxiYWNrIHdvdWxkIGJlCiAgY2FsbGVkIG9uY2UgbW9yZSBhbnl3YXkuCgpEYW5pZWwgKDEyIEF1Z3VzdCAyMDA1KQotIEJhc2VkIG9uIFJpY2hhcmQgQ2xheXRvbidzIHJlcG9ydHMsIEkgZm91bmQgb3V0IHRoYXQgdXNpbmcgY3VybCAtZCBAZmlsZW5hbWUKICB3aGVuICdmaWxlbmFtZScgd2FzIG5vdCBwb3NzaWJsZSB0byBhY2Nlc3MgbWFkZSBjdXJsIHVzZSBhIEdFVCByZXF1ZXN0CiAgaW5zdGVhZC4KCi0gVGhlIHRpbWUgY29uZGl0aW9uIGlsbGVnYWwgc3ludGF4IHdhcm5pbmcgaXMgbm93IGluaGliaXRlZCBpZiAtcyBpcyB1c2VkLgoKRGFuaWVsICgxMCBBdWd1c3QgMjAwNSkKLSBNYXJpbyBTY2hyb2VkZXIgZm91bmQgb3V0IHRoYXQgb25lIG9mIHRoZSBkZWJ1ZyBjYWxsYmFja3MgY2FsbHMgdGhhdCByZWdhcmRzCiAgU1NMIGRhdGEgd2l0aCB0aGUgQ1VSTElORk9fVEVYVCB0eXBlIGNsYWltZWQgdGhhdCB0aGUgZGF0YSB3YXMgb25lIGJ5dGUKICBsYXJnZXIgdGhhbiBpdCBhY3R1YWxseSBpcywgdGh1cyBmYWxzZWx5IHRlbGxpbmcgdGhlIGFwcGxpY2F0aW9uIHRoYXQgdGhlCiAgdGVybWluYXRpbmcgemVybyB3YXMgcGFydCBvZiB0aGUgZGF0YS4KCkRhbmllbCAoOSBBdWd1c3QgMjAwNSkKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgZml4ZWQgdGhlIG9mZnNldHMgdXNlZCBmb3IgZGF0ZSBwYXJzaW5ncyB3aGVuIHRoZSB0aW1lCiAgem9uZSBuYW1lIG9mIGEgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHdhcyB1c2VkLiBGb3IgZXhhbXBsZSwgUERUIHZzIFBEUy4gVGhpcwogIGZsYXcgd2FzIGludHJvZHVjZWQgd2l0aCB0aGUgbmV3IGRhdGUgcGFyc2VyICgxMSBzZXAgMjAwNCAtIDcuMTIuMikuCiAgRm9ydHVuYXRlbHksIG5vIHdlYiBzZXJ2ZXIgb3IgY29va2llIHN0cmluZyBldGMgc2hvdWxkIGJlIHVzaW5nIHN1Y2ggdGltZQogIHpvbmUgbmFtZXMgdGh1cyBsaW1pdGluZyB0aGUgZWZmZWN0IG9mIHRoaXMgYnVnLgoKRGFuaWVsICg4IEF1Z3VzdCAyMDA1KQotIEpvbiBHcnViYnMgZmlsZWQgYnVnIHJlcG9ydCAjMTI0OTk2MgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjQ5OTYyKSB3aGljaCBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdpdGggTlRMTSBvbiBhIEhUVFAgcHJveHkgaWYgYW4gRlRQIFVSTCB3YXMgZ2l2ZW4uIGxpYmN1cmwgbm93IHByb3Blcmx5CiAgc3dpdGNoZXMgdG8gcHVyZSBIVFRQIGludGVybmFsbHkgd2hlbiBhbiBIVFRQIHByb3h5IGlzIHVzZWQsIGV2ZW4gZm9yIEZUUAogIFVSTHMuIFRoZSBwcm9ibGVtIHdvdWxkIGFsc28gb2NjdXIgd2l0aCBvdGhlciBtdWx0aS1wYXNzIGF1dGggbWV0aG9kcy4KCkRhbmllbCAoNyBBdWd1c3QgMjAwNSkKLSBXaGVuIGN1cmwgaXMgYnVpbHQgd2l0aCBHbnVUTFMsIGN1cmwtY29uZmlnIGRpZG4ndCBpbmNsdWRlICJTU0wiIHdoZW4KICAtLWZlYXR1cmVzIHdhcyB1c2VkLgoKRGFuaWVsICgyOCBKdWx5IDIwMDUpCi0gSWYgYW55IG9mIHRoZSBvcHRpb25zIENVUkxPUFRfSFRUUEdFVCwgQ1VSTE9QVF9QT1NUIGFuZCBDVVJMT1BUX0hUVFBQT1NUIGlzCiAgc2V0IHRvIDEsIENVUkxPUFRfTk9CT0RZIHdpbGwgbm93IGF1dG9tYXRpY2FsbHkgYmUgc2V0IHRvIDAuCgpEYW5pZWwgKDI3IEp1bHkgMjAwNSkKLSBEYW4gRmFuZHJpY2ggY2hhbmdlcyBvdmVyIHRoZSBsYXN0IHdlZWs6IGZpeGVkIG51bWVyb3VzIG1pbm9yIGNvbmZpZ3VyZQogIG9wdGlvbiBwYXJzaW5nIGZsYXdzOiAtLXdpdGhvdXQtZ251dGxzLCAtLXdpdGhvdXQtc3BuZWdvIC0td2l0aG91dC1nc3NhcGkKICBhbmQgLS13aXRob3V0LWtyYjQuIFNwZWxsZml4ZWQgc2V2ZXJhbCBlcnJvciBtZXNzYWdlcy4KCi0gUGV0ZXJpcyBLcnVtaW5zIGFkZGVkIENVUkxPUFRfQ09PS0lFTElTVCBhbmQgQ1VSTElORk9fQ09PS0lFTElTVCwgd2hpY2ggaXMgYQogIHNpbXBsZSBpbnRlcmZhY2UgdG8gZXh0cmFjdGluZyBhbmQgc2V0dGluZyBjb29raWVzIGluIGxpYmN1cmwncyBpbnRlcm5hbAogICJjb29raWUgamFyIi4gU2VlIHRoZSBuZXcgY29va2llX2ludGVyZmFjZS5jIGV4YW1wbGUgY29kZS4KCkRhbmllbCAoMTMgSnVseSAyMDA1KQotIERpZWdvIENhc29ycmFuIHByb3ZpZGVkIHBhdGNoZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gQW1pZ2EgYWdhaW4uCgpEYW5pZWwgKDEyIEp1bHkgMjAwNSkKLSBBZHJpYW4gU2NodXVyIGFkZGVkIHRyYWlsZXIgc3VwcG9ydCBpbiB0aGUgY2h1bmtlZCBlbmNvZGluZyBzdHJlYW0uIFRoZQogIHRyYWlsZXIgaXMgdGhlbiBzZW50IHRvIHRoZSBub3JtYWwgaGVhZGVyIGNhbGxiYWNrL3N0cmVhbS4gSSB3cm90ZSB1cCB0ZXN0CiAgY2FzZSAyNjYgdG8gdmVyaWZ5IHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5LiBEbyBub3RlIHRoYXQgdGVzdCBjYXNlIDM0CiAgY29udGFpbnMgYSBmbGF3ZWQgY2h1bmtlZCBlbmNvZGluZyBzdHJlYW0gdGhhdCBzdGlsbCB3b3JrcyB0aGUgc2FtZS4KCkRhbmllbCAoNSBKdWx5IDIwMDUpCi0gR2lzbGUgVmFuZW0gY2FtZSB1cCB3aXRoIGEgbmljZSBsaXR0bGUgd29yay1hcm91bmQgZm9yIGJ1ZyAjMTIzMDExOAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjMwMTE4KS4gSXQgc2VlbXMgdGhlIFdpbmRvd3MgKE1TVkMpCiAgbGliYyB0aW1lIGZ1bmN0aW9ucyBtYXkgcmV0dXJuIGRhdGEgb25lIGhvdXIgb2ZmIGlmIFRaIGlzIG5vdCBzZXQgYW5kCiAgYXV0b21hdGljIERTVCBhZGp1c3RtZW50IGlzIGVuYWJsZWQuIFRoaXMgbWFkZSBjdXJsX2dldGRhdGUoKSByZXR1cm4gd3JvbmcKICB2YWx1ZSwgYW5kIGl0IGFsc28gY29uY2VybmVkIGludGVybmFsIGNvb2tpZSBleHBpcmF0aW9ucyBldGMuCgpEYW5pZWwgKDQgSnVseSAyMDA1KQotIEFuZHJldyBCdXNobmVsbCBwcm92aWRlZCBlbm91Z2ggaW5mbyBmb3IgbWUgdG8gdGVsbCB0aGF0IHdlIGJhZGx5IG5lZWRlZCB0bwogIGZpeCB0aGUgQ09OTkVDVCBhdXRoZW50aWNhdGlvbiBjb2RlIHdpdGggbXVsdGktcGFzcyBhdXRoIG1ldGhvZHMgKHN1Y2ggYXMKICBOVExNKSBhcyBpdCBkaWRuJ3QgcHJldmlvdXNseSBwcm9wZXJseSBpZ25vcmUgcmVzcG9uc2UtYm9kaWVzIC0gaW4gZmFjdCBpdAogIHN0b3BwZWQgcmVhZGluZyBhZnRlciBhbGwgcmVzcG9uc2UgaGVhZGVycyBoYWQgYmVlbiByZWNlaXZlZC4gVGhpcyBjb3VsZAogIGxlYWQgdG8gbGliY3VybCBzZW5kaW5nIHRoZSBuZXh0IHJlcXVlc3QgYW5kIHJlYWRpbmcgdGhlIGJvZHkgZnJvbSB0aGUgZmlyc3QKICByZXF1ZXN0IGFzIHJlc3BvbnNlIHRvIHRoZSBzZWNvbmQgcmVxdWVzdC4gKEkgYWxzbyByZW5hbWVkIHRoZSBmdW5jdGlvbiwKICB3aGljaCB3YXNuJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGJ1dC4uLikKCiAgVGhlIGJlc3QgZml4IHdvdWxkIHRvIG9uY2UgYW5kIGZvciBhbGwgbWFrZSB0aGUgQ09OTkVDVCBjb2RlIHVzZSB0aGUKICBvcmRpbmFyeSByZXF1ZXN0IHNlbmRpbmcvcmVjZWl2aW5nIGNvZGUsIHRyZWF0aW5nIGl0IGFzIGFueSBvcmRpbmFyeSByZXF1ZXN0CiAgaW5zdGVhZCBvZiB0aGUgc3BlY2lhbC1wdXJwb3NlIGZ1bmN0aW9uIHdlIGhhdmUgbm93LiBJdCBzaG91bGQgbWFrZSBpdAogIGJldHRlciBmb3IgbXVsdGktaW50ZXJmYWNlIHRvby4gQW5kIHBvc3NpYmx5IGxlYWQgdG8gbGVzcyBjb2RlLi4uCgogIEFkZGVkIHRlc3QgY2FzZSAyNjUgZm9yIHRoaXMuIEl0IGRvZXNuJ3Qgd29yayBhcyBhIF9yZWFsbHlfIGdvb2QgdGVzdCBjYXNlCiAgc2luY2UgdGhlIHRlc3QgcHJveHkgaXMgdG9vIHN0dXBpZCwgYnV0IHRoZSB0ZXN0IGNhc2UgaGVscHMgd2hlbiBydW5uaW5nIHRoZQogIGRlYnVnZ2VyIHRvIHZlcmlmeS4KCkRhbmllbCAoMzAgSnVuZSAyMDA1KQotIERhbiBGYW5kcmljaCBpbXByb3ZlZCB0aGUgY29uZmlndXJlIHNjcmlwdCdzIGFiaWxpdHkgdG8gZmlndXJlIG91dCB3aGF0IGtpbmQKICBvZiBzdHJlcnJvcl9yKCkgQVBJIHRoYXQgaXMgdXNlZCB3aGVuIGNyb3NzLWNvbXBpbGluZy4gSWYgX19HTElCX18gaXMKICBkZWZpbmVkLCBpdCBhc3N1bWVzIHRoZSBnbGliYyBBUEkuIElmIG5vdCwgaXQgaXNzdWVzIGEgbm90aWNlIGFzIGJlZm9yZSB0aGF0CiAgdGhlIHVzZXIgbmVlZHMgdG8gbWFudWFsbHkgZWRpdCBsaWIvY29uZmlnLmggZm9yIHRoaXMuCgpEYW5pZWwgKDIzIEp1bmUgMjAwNSkKLSBEYXZpZCBTaGF3J3MgZml4IHRoYXQgdW5pZmllcyBwcm94eSBzdHJpbmcgdHJlYXRtZW50IHNvIHRoYXQgYSBwcm94eSBnaXZlbgogIHdpdGggQ1VSTE9QVF9QUk9YWSBjYW4gdXNlIGEgaHR0cDovLyBwcmVmaXggYW5kIHVzZXIgKyBwYXNzd29yZC4gVGhlIHVzZXIKICBhbmQgcGFzc3dvcmQgZmllbGRzIGFyZSBub3cgYWxzbyBVUkwgZGVjb2RlZCBwcm9wZXJseS4gVGVzdCBjYXNlIDI2NCBhZGRlZAogIHRvIHZlcmlmeS4KCkRhbmllbCAoMjIgSnVuZSAyMDA1KQotIERhdmlkIFNoYXcgdXBkYXRlZCBsaWJjdXJsLm00CgpEYW5pZWwgKDE0IEp1bmUgMjAwNSkKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIHBvdGVudGlhbCB0aHJlYWQgaGFuZGxlIGxlYWsuIEJ1ZyByZXBvcnQgIzEyMTY1MDAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIxNjUwMCkuICBDb21tZW50IGluCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA1LTA2LzAwNTkuaHRtbAoKRGFuaWVsICgxMyBKdW5lIDIwMDUpCi0gTWFkZSBidWlsZGNvbmYgcnVuIGxpYnRvb2xpemUgaW4gdGhlIGFyZXMgZGlyIHRvbyAoaW5zcGlyZWQgYnkgVHVwb25lJ3MKICByZXZlcnRlZCBwYXRjaCkuCgpEYW5pZWwgKDkgSnVuZSAyMDA1KQotIEluY29ycG9yYXRlZCBUdXBvbmUncyBmaW5kdG9vbCBmaXggaW4gYnVpbGRjb25mIChzbGlnaHRseSBlZGl0ZWQpCgotIEluY29ycG9yYXRlZCBUdXBvbmUncyBoZWFkIC1uIGZpeCBpbiBidWlsZGNvbmYuCgpEYW5pZWwgKDggSnVuZSAyMDA1KQotIFJldmVydGVkIFR1cG9uZSdzIHBhdGNoIGFnYWluLCBpdCBicm9rZSBudW1lcm91cyBhdXRvYnVpbGRzLiBMZXQncyBhcHBseSBpdAogIGluIHBpZWNlcywgb25lIGJ5IG9uZSBhbmQgc2VlIHdoYXQgd2UgbmVlZCB0byBhZGp1c3QgdG8gd29yayBhbGwgb3Zlci4KCkRhbmllbCAoNiBKdW5lIDIwMDUpCi0gVHVwb25lIEFsZnJlZG8gZml4ZWQgdGhyZWUgcHJvYmxlbXMgaW4gYnVpbGRjb25mOgoKICAxKSBmaW5kdG9vbCBkb2VzIGxvb2sgcGVyIHRvb2wgaW4gUEFUSCBhbmQgdGhpbmsgLi9wZXJsIGlzIHRoZSBwZXJsCiAgZXhlY3V0YWJsZSwgd2hpbGUgaXMganVzdCBhIGxvY2FsIGRpcmVjdG9yeSAoSSBoYXZlIC4gaW4gdGhlIFBBVEgpCgogIDIpIEkgZ290IHNldmVyYWwgd2FybmluZyBmb3IgaGVhZCAtMSBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBoZWFkIC1uIDEKIAogIDMpIGFyZXMgZGlyZWN0b3J5IGlzIG1pc3Npbmcgc29tZSBmaWxlIChtaXNzaW5nIGlzIG1pc3NpbmcgOi0pICkgYmVjYXVzZQogIGF1dG9tYWtlIGFuZCBmcmllbmRzIGlzIG5vdCBydW4uCgpEYW5pZWwgKDMgSnVuZSAyMDA1KQotIEFkZGVkIGRvY3MvbGliY3VybC9nZXRpbmZvLXRpbWVzLCBiYXNlZCBvbiBmZWVkYmFjayBmcm9tICdFZGknOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvZmVlZGJhY2svZGlzcGxheS5jZ2k/aWQ9MTExNzgzMjU3OTgyOTkmc3VwcG9ydD15ZXMKCi0gQW5kcmVzIEdhcmNpYSBwcm92aWRlZCB5ZXQgYW5vdGhlciB0ZXh0IG1vZGUgcGF0Y2ggZm9yIHNldmVyYWwgdGVzdCBjYXNlcyBzbwogIHRoYXQgdGhleSBkbyB0ZXh0IGNvbXBhcmlzaW9ucyBiZXR0ZXIgb24gV2luZG93cyAobmV3bGluZS13aXNlKS4KCkRhbmllbCAoMSBKdW5lIDIwMDUpCi0gVGhlIGNvbmZpZ3VyZSBjaGVjayBmb3IgYy1hcmVzIG5vdyBhZGRzIHRoZSBjYXJlcyBsaWIgYmVmb3JlIHRoZSBvdGhlciBsaWJzLAogIHRvIG1ha2UgaXQgYnVpbGQgZmluZSB3aXRoIG1pbmd3LiBJbnNwaXJlZCBieSBUdXBvbmUgQWxmcmVkbydzIGJ1ZyByZXBvcnQKICBhbmQgcGF0Y2g6IGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMTI5NDAKCkRhbmllbCAoMzEgTWF5IDIwMDUpCi0gVG9kZCBLdWxlc3phIHJlcG9ydGVkIGEgZmxhdyBpbiB0aGUgcHJveHkgb3B0aW9uLCBzaW5jZSBhIG51bWVyaWNhbCBJUHY2CiAgYWRkcmVzcyB3YXMgbm90IHBvc3NpYmxlIHRvIHVzZS4gSXQgaXMgbm93LCBidXQgcmVxdWlyZXMgaXQgd3JpdHRlbgogIFJGQzI3MzItc3R5bGUsIHdpdGhpbiBicmFja2V0cyAtIHdoaWNoIGluY2lkZW50bHkgaXMgaG93IHlvdSBlbnRlciBudW1lcmljYWwKICBJUHY2IGFkZHJlc3NlcyBpbiBVUkxzLiBUZXN0IGNhc2UgMjYzIGFkZGVkIHRvIHZlcmlmeS4KCkRhbmllbCAoMzAgTWF5IDIwMDUpCi0gRXJpYyBDb29wZXIgcmVwb3J0ZWQgYWJvdXQgYSBwcm9ibGVtIHdpdGggSFRUUCBzZXJ2ZXJzIHRoYXQgcmVzcG9uZHMgd2l0aAogIGJpbmFyeSB6ZXJvZXMgd2l0aGluIHRoZSBoZWFkZXJzLiBUaGV5IGNvbmZ1c2VkIGxpYmN1cmwgdG8gZG8gd3Jvbmcgc28gdGhlCiAgZG93bmxvYWRlZCBoZWFkZXJzIGJlY29tZSBpbmNvbXBsZXRlLiBUaGUgZml4IGlzIG5vdyB2ZXJpZmllZCB3aXRoIHRlc3QgY2FzZQogIDI2Mi4gaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMxMDk0OAoKRGFuaWVsICgyNSBNYXkgMjAwNSkKLSBGaXhlZCBwcm9ibGVtcyB3aXRoIHRoZSB0ZXN0IHN1aXRlLCBhbmQgaW4gcGFydGljdWxhciB0aGUgRlRQIHRlc3QgY2FzZXMKICBzaW5jZSBpdCBwcmV2aW91c2x5IHdhcyBmYWlsaW5nIGV2ZXJ5IG5vdyBhbmQgdGhlbiBpbiBhIG5vbnNlbnNlIG1hbm5lci4KCi0gLS10cmFjZS10aW1lIG5vdyBvdXRwdXRzIHRoZSBmdWxsIG1pY3Jvc2Vjb25kLCBhbGwgNiBkaWdpdHMuCgpEYW5pZWwgKDI0IE1heSAyMDA1KQotIEFuZHJlcyBHYXJjaWEgcHJvdmlkZWQgYSB0ZXh0IG1vZGUgcGF0Y2ggZm9yIHNldmVyYWwgdGVzdCBjYXNlcyBzbyB0aGF0IHRoZXkKICBkbyB0ZXh0IGNvbXBhcmlzaW9ucyBiZXR0ZXIgb24gV2luZG93cyAobmV3bGluZS13aXNlKS4KCi0gQW55IDJ4eCByZXNwb25zZSAoYW5kIG5vdCBqdXN0IDIwMCkgaXMgbm93IGNvbnNpZGVyZWQgYSBmaW5lIHJlc3BvbnNlIHRvCiAgVFlQRSwgYXMgc29tZSBzZXJ2ZXJzIG9idmlvdXNseSBzZW5kcyBhIDIyNiB0aGVyZS4gQWRkZWQgdGVzdCBjYXNlIDI2MSB0bwogIHZlcmlmeS4gQmFzZWQgb24gYSBxdWVzdGlvbi9yZXBvcnQgYnkgR2VvcmcgV2ljaGVyc2tpLgoKRGFuaWVsICgyMCBNYXkgMjAwNSkKLSBJbXByb3ZlZCBydW50ZXN0cy5wbCB0byBhbGxvdyBzdGRvdXQgdGVzdHMgdG8gYmUgbW9kZT10ZXh0IGFzIHdlbGwsIGp1c3QKICBhcyBmaWxlIGNvbXBhcmlzb25zIGFscmVhZHkgc3VwcG9ydHMuIEFkZGVkIHRoaXMgaW5mbyB0byB0aGUgRklMRUZPUk1BVAogIGRvY3MuCgpEYW5pZWwgKDE4IE1heSAyMDA1KQotIEpvaG4gTWNHb3dhbiBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiBidWcgcmVwb3J0ICMxMjA0NDM1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMDQ0MzUpIHdpdGggbWFsZm9ybWVkIFVSTHMgbGlrZQogICJodHRwOi8vc29tZWhvc3Q/ZGF0YSIgYXMgaXQgYWRkZWQgYSBzbGFzaCB0b28gbXVjaCBpbiB0aGUgcmVxdWVzdCAoIkdFVAogIC8/ZGF0YS8iLi4uKS4gQWRkZWQgdGVzdCBjYXNlIDI2MCB0byB2ZXJpZnkuCgotIFRoZSBjb25maWd1cmUgY2hlY2sgZm9yIHN0cmVycm9yX3IoKSBmYWlsZWQgdG8gZGV0ZWN0IHRoZSBwcm9wZXIgQVBJIGF0CiAgdGltZXMsIGxpa2Ugb24gSFAtVVggMTAuMjAuIFRoZW4gbGliL3N0cmVycm9yLmMgYmFkbHkgYXNzdW1lZCB0aGUgZ2xpYmMKICB2ZXJzaW9uIGlmIHRoZSBwb3NpeCBkZWZpbmUgd2Fzbid0IHNldCAoc2luY2UgaXQgX2hhZF8gZm91bmQgYSBzdHJlcnJvcl9yKS4KCkRhbmllbCAoMTYgTWF5IDIwMDUpCi0gVGhlIGdtdGltZV9yKCkgZnVuY3Rpb24gaW4gSFAtVVggMTAuMjAgaXMgYnJva2VuLiBBYm91dCAxMyB0ZXN0IGNhc2VzIGZhaWwKICBkdWUgdG8gdGhpcy4gVGhlcmUncyBub3cgYSBjb25maWd1cmUgY2hlY2sgdGhhdCBhdHRlbXB0cyB0byBkZXRlY3QgdGhlIGJhZAogIGZ1bmN0aW9uIGFuZCBub3QgdXNlIGl0IG9uIHN1Y2ggc3lzdGVtcy4KClZlcnNpb24gNy4xNC4wICgxNiBNYXkgMjAwNSkKCkRhbmllbCAoMTMgTWF5IDIwMDUpCi0gR3JpZ29yeSBFbnRpbiByZXBvcnRlZCB0aGF0IGN1cmwncyBjb25maWd1cmUgZGV0ZWN0cyBhIGZpbmUgcG9sbCgpIGZvciBNYWMKICBPUyBYIDEwLjQgKHdoaWxlIDEwLjMgb3IgbGF0ZXIgZGV0ZWN0ZWQgYSAiYmFkIiBvbmUpLCBidXQgdGhlIGV4ZWN1dGFibGUKICBkb2Vzbid0IHdvcmsgYXMgZ29vZCBhcyBpZiBidWlsdCB3aXRob3V0IHBvbGwoKS4gSSd2ZSBhZGp1c3RlZCB0aGUgY29uZmlndXJlCiAgdG8gYWx3YXlzIHNraXAgdGhlIGZpbmUtcG9sbCgpIHRlc3Qgb24gTWFjIE9TIFggKGRhcndpbikuCgpEYW5pZWwgKDEyIE1heSAyMDA1KQotIFdoZW4gZG9pbmcgYSBzZWNvbmQgcmVxdWVzdCAoYWZ0ZXIgYSBkaXNjb25uZWN0KSB1c2luZyB0aGUgc2FtZSBlYXN5IGhhbmRsZSwKICBvdmVyIGEgcHJveHkgdGhhdCB1c2VzIE5UTE0gYXV0aGVudGljYXRpb24sIGxpYmN1cmwgZmFpbGVkIHRvIHVzZSBOVExNIGFnYWluCiAgcHJvcGVybHkgKHRoZSBhdXRoIG1ldGhvZCB3YXMgYWNjaWRlbnRhbGx5IHJlc2V0IHRvIHRoZSBzYW1lIGFzIGhhZCBiZWVuIHNldAogIGZvciBob3N0IGF1dGgsIHdoaWNoIGRlZmF1bHRzIHRvIEJhc2ljKS4gQnVnIHJlcG9ydCAjMTIwMDY2MQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjAwNjYxKSBpZGVudGlmaWVkIHRoZSB0aGUgcHJvYmxlbSBhbmQKICB0aGUgZml4LgoKLSBJZiAtei8tLXRpbWUtY29uZCBpcyB1c2VkIHdpdGggYW4gaW52YWxpZCBkYXRlIHN5bnRheCwgdGhpcyBpcyBubyBsb25nZXIKICBzaWxlbnRseSBkaXNjYXJkZWQuIEluc3RlYWQgYSBwcm9wZXIgd2FybmluZyBtZXNzYWdlIGlzIGRpcGxheWVkIHRoYXQKICBpbmZvcm1zIGFib3V0IGl0LiBCdXQgaXQgc3RpbGwgY29udGludWVzIHdpdGhvdXQgdGhlIGNvbmRpdGlvbi4KClZlcnNpb24gNy4xNC4wLXByZTIgKDExIE1heSAyMDA1KQoKRGFuaWVsICgxMSBNYXkgMjAwNSkKLSBTdGFydGluZyBub3csIGxpYmN1cmwgc2VuZHMgYSBsaXR0bGUgZGlmZmVyZW50IHNldCBvZiBoZWFkZXJzIGluIGl0cyBkZWZhdWx0CiAgSFRUUCByZXF1ZXN0czoKICAKICBBKSBOb3JtYWwgbm9uLXByb3h5IEhUVFA6CiAgICAtIG5vIG1vcmUgIlByYWdtYTogbm8tY2FjaGUiICh0aGlzIG9ubHkgbWFrZXMgc2Vuc2UgdG8gcHJveGllcykKCiAgQikgTm9uLUNPTk5FQ1QgSFRUUCByZXF1ZXN0IG92ZXIgcHJveHk6CiAgICAtICJQcmFnbWE6IG5vLWNhY2hlIiBpcyB1c2VkIChsaWtlIGJlZm9yZSkKICAgIC0gIlByb3h5LUNvbm5lY3Rpb246IEtlZXAtYWxpdmUiIChmb3Igb2xkZXIgc3R5bGUgMS4wLXByb3hpZXMpCgogIEMpIENPTk5FQ1QgSFRUUCByZXF1ZXN0IG92ZXIgcHJveHk6CiAgICAtICJIb3N0OiBbbmFtZV06W3BvcnRdIgogICAgLSAiUHJveHktQ29ubmVjdGlvbjogS2VlcC1hbGl2ZSIKCiAgVGhlIEEpIGNhc2UgaXMgbW9zdGx5IHRvIHJlZHVjZSB0aGUgZGVmYXVsdCBoZWFkZXIgc2l6ZSBhbmQgcmVtb3ZlIGEKICBwb2ludGxlc3MgaGVhZGVyLgoKICBUaGUgQikgaXMgdG8gYWRkcmVzcyAocmFyZSkgcHJvYmxlbXMgd2l0aCBIVFRQIDEuMCBwcm94aWVzCgogIFRoZSBDKSBoZWFkZXJzIGFyZSBib3RoIHRvIGFkZHJlc3MgKHJhcmUpIHByb2JsZW1zIHdpdGggc29tZSBwcm94aWVzLiBUaGUKICBjb2RlIGluIGxpYmN1cmwgdGhhdCBkZWFscyB3aXRoIENPTk5FQ1QgcmVxdWVzdHMgbmVlZCBhIHJld3JpdGUsIGJ1dCBpdAogIGZlZWxzIGxpa2UgYSB0b28gYmlnIGEgam9iIGZvciBtZSB0byBkbyBub3cuIERldGFpbHMgYXJlIGFkZGVkIGluIHRoZSBjb2RlCiAgY29tbWVudHMgZm9yIG5vdy4KCiAgVXBkYXRlZCBhIGxhcmdlIGFtb3VudCBvZiB0ZXN0IGNhc2VzIHRvIHJlZmxlY3QgdGhlIG5ld3MuCgpEYW5pZWwgKDEwIE1heSAyMDA1KQotIEhhbGYtYmFrZWQgYXR0ZW1wdCB0byBiYWlsIG91dCBpZiBzZWxlY3QoKSByZXR1cm5zIF9vbmx5XyBlcnJvcmZkcyB3aGVuIHRoZQogIHRyYW5zZmVyIGlzIGluIHByb2dyZXNzLiBBbiBhdHRlbXB0IHRvIGZpeCBBbGxhbidzIHByb2JsZW0uIFNlZQogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNS0wNS8wMDczLmh0bWwgYW5kIHRoZSByZXN0IG9mIHRoYXQgdGhyZWFkCiAgZm9yIGRldGFpbHMuCgogIEknbSBzdGlsbCBub3Qgc3VyZSB0aGlzIGlzIHRoZSByaWdodCBmaXgsIGJ1dC4uLgoKVmVyc2lvbiA3LjE0LjAtcHJlMSAoOSBNYXkgMjAwNSkKCkRhbmllbCAoMiBNYXkgMjAwNSkKLSBTb3J0IG9mICJmaXhlZCIgS05PV05fQlVHUyAjNDogY3VybCBub3cgYnVpbGRzIElQdjYgZW5hYmxlZCBvbiBBSVggNC4zLiBBdAogIGxlYXN0IGl0IHNob3VsZCBubyBsb25nZXIgY2F1c2UgYSBjb21waWxlciBlcnJvci4gSG93ZXZlciwgaXQgZG9lcyBub3QgaGF2ZQogIEFJX05VTUVSSUNIT1NUIHNvIHdlIGNhbm5vdCBnZXRhZGRyaW5mbygpIGFueSBudW1lcmljYWwgYWRkcmVzc2VzIHdpdGggaXQKICAod2UgdXNlIHRoYXQgZm9yIEZUUCBQT1JUL0VQUlQpISBTbywgSSBtb2RpZmllZCB0aGUgY29uZmlndXJlIGNoZWNrIHRoYXQKICBjaGVja3MgaWYgdGhlIGdldGFkZHJpbmZvKCkgaXMgd29ya2luZywgdG8gdXNlIEFJX05VTUVSSUNIT1NUIHNpbmNlIHRoZW4KICBpdCdsbCBmYWlsIG9uIEFJWCA0LjMgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBidWlsZCB3aXRoIElQdjYgc3VwcG9ydAogIGRpc2FibGVkLgoKLSBBZGRlZCAtLXRyYWNlLXRpbWUgdGhhdCB3aGVuIHVzZWQgYWRkcyBhIHRpbWUgc3RhbXAgdG8gZWFjaCB0cmFjZSBsaW5lIHRoYXQKICAtLXRyYWNlLCAtLXRyYWNlLWFzY2lpIGFuZCAtLXZlcmJvc2Ugb3V0cHV0LiBJIGFsc28gbWFkZSB0aGUgJz4nIGRpc3BsYXkKICBzZXBhcmF0ZSBlYWNoIGxpbmUgb24gdGhlIGxpbmVmZWVkIHNvIHRoYXQgSFRUUCByZXF1ZXN0cyBldGMgbG9vayBuaWNlciBpbgogIHRoZSAtdiBvdXRwdXQuCgotIE1hZGUgY3VybCByZWNvZ25pemUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBMeW54IChhbmQgb3RoZXJzPykgc3VwcG9ydCBmb3IKICBwb2ludGluZyBvdXQgdGhlIENBIGNlcnQgcGF0aC9maWxlOiBTU0xfQ0VSVF9ESVIgYW5kIFNTTF9DRVJUX0ZJTEUuIElmCiAgQ1VSTF9DQV9CVU5ETEUgaXMgbm90IHNldCwgdGhleSBhcmUgY2hlY2tlZCBhZnRlcndhcmRzLgoKICBMaWtlIGJlZm9yZTogb24gd2luZG93cyBpZiBub25lIG9mIHRoZXNlIGFyZSBzZXQsIGl0IGNoZWNrcyBmb3IgdGhlIGNhIGNlcnQKICBmaWxlIGxpa2UgdGhpczoKCiAgMS4gYXBwbGljYXRpb24ncyBkaXJlY3RvcnkKICAyLiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CiAgMy4gV2luZG93cyBTeXN0ZW0gZGlyZWN0b3J5IChlLmcuIEM6XHdpbmRvd3Ncc3lzdGVtMzIpCiAgNC4gV2luZG93cyBEaXJlY3RvcnkgKGUuZy4gQzpcd2luZG93cykKICA1LiBhbGwgZGlyZWN0b3JpZXMgYWxvbmcgJVBBVEglCgpEYW5pZWwgKDEgTWF5IDIwMDUpCi0gVGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCBub3cgc3RhcnRzIHRlc3Qgc2VydmVycyBieSBkb2luZyBmb3JrKCkgYW5kIGV4ZWMoKQogIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIGFwcHJvYWNoLiBUaGlzIGlzIGxlc3MgY29tcGxpY2F0ZWQgYW5kIHNob3VsZAogIGhvcGVmdWxseSBsZWFkIHRvIGxlc3MgImxlYWtlZCIgc2VydmVycyAoc2VydmVycyB0aGF0IGFyZW4ndCBzdG9wcGVkCiAgcHJvcGVybHkgd2hlbiB0aGUgdGVzdHMgYXJlIHN0b3BwZWQpLgoKLSBBbGV4YW5kZXIgWmh1cmF2bGV2IGZvdW5kIGEgY2FzZSB3aGVuIHlvdSBkaWQgImN1cmwgLUkgW1VSTF0iIGFuZCBpdAogIGNvbXBsYWluZWQgb24gdGhlIGNodW5rZWQgZW5jb2RpbmcsIGV2ZW4gdGhvdWdoIGEgSEVBRCBzaG91bGQgbmV2ZXIgcmV0dXJuIGEKICBib2R5IGFuZCB0aHVzIGl0IGNhbm5vdCBiZSBhIGNodW5rZWQtZW5jb2RpbmcgcHJvYmxlbSEKCkRhbmllbCAoMzAgQXByaWwgMjAwNSkKLSBBbGV4YW5kZXIgWmh1cmF2bGV2IGZvdW5kIG91dCB0aGF0IChsaWIpY3VybCBTSUdTRUdWZWQgd2hlbiB1c2luZwogIC0taW50ZXJmYWNlIG9uIGFuIGFkZHJlc3MgdGhhdCBjYW4ndCBiZSBib3VuZC4KCkRhbmllbCAoMjggQXByaWwgMjAwNSkKLSBXb3JraW5nIG9uIGZpeGluZyB1cCB0ZXN0IGNhc2VzIHRvIG1hcmsgc2VjdGlvbnMgYXMgJ21vZGU9dGV4dCcgZm9yIHRoaW5ncwogIHRoYXQgY3VybCB3cml0ZXMgYXMgdGV4dCBmaWxlcywgc2luY2UgdGhlbiB0aGV5IGNhbiBnZXQgZGlmZmVyZW50IGxpbmUKICBlbmRpbmdzIGRlcGVuZGluZyBvbiBPUy4gQW5kculzIEdhcmPtYSBoZWxwcyBtZSB3b3JrIHRoaXMgb3V0LgoKICBEaWQgbG90cyBvZiBvdGhlciBtaW5vciB0d2Vha3Mgb24gdGhlIHRlc3Qgc2NyaXB0cyB0byB3b3JrIGJldHRlciBhbmQgbW9yZQogIHJlbGlhYmx5IGZpbmQgdGVzdCBzZXJ2ZXJzIGFuZCBhbHNvIGtpbGwgdGVzdCBzZXJ2ZXJzLgoKLSBEYW4gRmFuZHJpY2ggcG9pbnRlZCBvdXQgaG93IHRoZSBydW50ZXN0cy5wbCBzY3JpcHQga2lsbGVkIHRoZSBIVFRQIHNlcnZlcgogIGluc3RlYWQgb2YgdGhlIEhUVFBTIHNlcnZlciB3aGVuIGNsb3NpbmcgaXQgZG93bi4KCkRhbmllbCAoMjcgQXByaWwgMjAwNSkKLSBQYXVsIE1vb3JlIG1hZGUgY3VybCBjaGVjayBmb3IgdGhlIC5jdXJscmMgZmlsZSAoX2N1cmxyYyBvbiB3aW5kb3dzKSBvbiB0d28KICBtb3JlIHBsYWNlcy4gRmlyc3QsIENVUkxfSE9NRSBpcyBhIG5ldyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0IGlzIHVzZWQKICBpbnN0ZWFkIG9mIEhPTUUgaWYgaXQgaXMgc2V0LCB0byBwb2ludCBvdXQgd2hlcmUgdGhlIGRlZmF1bHQgY29uZmlnIGZpbGUKICBsaXZlcy4gSWYgdGhlcmUncyBubyBjb25maWcgZmlsZSBpbiB0aGUgZGlyIHBvaW50ZWQgb3V0IGJ5IG9uZSBvZiB0aGUKICBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHRoZSBXaW5kb3dzIHZlcnNpb24gd2lsbCBpbnN0ZWFkIGNoZWNrIHRoZSBzYW1lCiAgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGN1cmwgaXMgbG9jYXRlZCBpbi4KCkRhbmllbCAoMjYgQXByaWwgMjAwNSkKLSBDb3J5IE5lbHNvbidzIHdvcmsgb24gbnVraW5nIGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gYnVpbGRpbmcgb24geDY0IHdpdGgKICBWUzIwMDUuCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDUpCi0gRnJlZCBOZXcgcmVwb3J0ZWQgYSBidWcgd2hlcmUgd2UgdXNlZCBCYXNpYyBhdXRoIGFuZCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkCiAgaW4gLm5ldHJjLCBhbmQgd2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjogdGhlIHN1YnNlcXVlbnQgcmVxdWVzdHMgZGlkbid0CiAgcHJvcGVybHkgdXNlIHRoZSBhdXRoIGFzIGZvdW5kIGluIHRoZSBuZXRyYyBmaWxlLiBBZGRlZCB0ZXN0IGNhc2UgMjU3IHRvCiAgdmVyaWZ5IG15IGZpeC4KCi0gQmFzZWQgb24gZmVlZGJhY2sgZnJvbSBDb3J5IE5lbHNvbiwgSSBhZGRlZCBzb21lIHByZXByb2Nlc3NvciBtYWdpYyBpbgogICovc2V0dXAuaCBhbmQgKi9jb25maWctd2luMzIuaCB0byBidWlsZCBmaW5lIHdpdGggVlMyMDA1IG9uIHg2NC4KCkRhbmllbCAoMjMgQXByaWwgMjAwNSkKLSBBbGV4IFN1eWtvdiBtYWRlIHRoZSBjdXJsIHRvb2wgbm93IGFzc3VtZSB0aGF0IHVwbG9hZHMgdXNpbmcgSFRUUDovLyBvcgogIEhUVFBTOi8vIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgc2hvdyBvdXRwdXQgYW5kIHRodXMgbW90aXZhdGVzIGEgc3dpdGNoZWQKICBvZmYgcHJvZ3Jlc3MgbWV0ZXIgaWYgdGhlIG91dHB1dCBpcyBzZW50IHRvIHRoZSB0ZXJtaW5hbC4gVGhpcyBtYWtlcyBGVFAKICB1cGxvYWRzIHdpdGhvdXQgJz4nLCAtbyBvciAtTyBzaG93IHRoZSBwcm9ncmVzcyBtZXRlci4KCkRhbmllbCAoMjIgQXByaWwgMjAwNSkKLSBEYXZlIERyaWJpbidzIE1TVkMgbWFrZWZpbGUgZml4OiBzZXQgQ1VSTF9TVEFUSUNMSUIgd2hlbiBpdCBidWlsZHMgc3RhdGljCiAgbGlicmFyeSB2YXJpYW50cy4KCi0gQW5kcmVzIEdhcmNpYSBmaXhlZCBjb25maWd1cmUgdG8gc2V0IHRoZSBwcm9wZXIgZGVmaW5lIHdoZW4gYnVpbGRpbmcgc3RhdGljCiAgbGliY3VybCBvbiB3aW5kb3dzLgoKLSAtLXJldHJ5LWRlbGF5IGRpZG4ndCB3b3JrLgoKRGFuaWVsICgxOCBBcHJpbCAyMDA1KQotIE9saXZpZXIgcmVwb3J0ZWQgdGhhdCBldmVuIHRob3VnaCBoZSB1c2VkIENVUkxPUFRfUE9SVCwgbGliY3VybCBjbGVhcmx5CiAgc3RpbGwgdXNlZCB0aGUgZGVmYXVsdCBwb3J0LiBIZSB3YXMgcmlnaHQuIEkgZml4ZWQgdGhlIHByb2JsZW0gYW5kIGFkZGVkIHRoZQogIHRlc3QgY2FzZXMgNTIxLCA1MjIgYW5kIDUyMyB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gVG9zaGl5dWtpIE1hZXphd2EgcmVwb3J0ZWQgdGhhdCB3aGVuIGRvaW5nIGEgUE9TVCB3aXRoIGEgcmVhZCBjYWxsYmFjaywKICBsaWJjdXJsIGRpZG4ndCBwcm9wZXJseSBzZW5kIGFuIEV4cGVjdDogMTAwLWNvbnRpbnVlIGhlYWRlci4gSXQgZG9lcyBub3cuCgotIEkgY29tbWl0dGVkIGJ5IG1pZyBjaGFuZ2UgaW4gdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRoYXQgbW92ZXMgb3V0IGFsbAogIHNvY2tldC9UQ1AgY29kZSB0byBhIHNlcGFyYXRlIEMgcHJvZ3JhbSBuYW1lZCBzb2NrZmlsdC4gQW5kIGFkZGVkIDQgbmV3CiAgdGVzdCBjYXNlcyBmb3IgRlRQIG92ZXIgSVB2Ni4KCkRhbmllbCAoOCBBcHJpbCAyMDA1KQotIENvcnkgTmVsc29uIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIGEgSFRUUCBzZXJ2ZXIgdGhhdCByZXNwb25kZWQgd2l0aCBhIDMwNAogIHJlc3BvbnNlIGNvbnRhaW5pbmcgYW4gImlsbGVnYWwiIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXIsIHdoaWNoIHdhcyBub3QKICBwcm9wZXJseSBpZ25vcmVkIGJ5IGxpYmN1cmwuIE5vdyBpdCBpcy4gVGVzdCBjYXNlIDI0OSB2ZXJpZmllcy4KCkRhbmllbCAoNyBBcHJpbCAyMDA1KQotIEFkZGVkIGFiaWxpdHkgdG8gYnVpbGQgYW5kIHJ1biB3aXRoIEdudVRMUyBhcyBhbiBhbHRlcm5hdGl2ZSB0byBPcGVuU1NMIGZvcgogIHRoZSBzZWN1cmUgbGF5ZXIuIGNvbmZpZ3VyZSAtLXdpdGgtZ251dGxzIGVuYWJsZXMgd2l0aC4gTm90ZSB0aGF0IHRoZQogIHByZXZpb3VzIE9wZW5TU0wgY2hlY2sgc3RpbGwgaGFzIHByZWZlcmVuY2UgYW5kIGlmIGl0IGZpcnN0IGRldGVjdHMgT3BlblNTTCwKICBpdCB3aWxsIG5vdCBjaGVjayBmb3IgR251VExTLiBZb3UgbWF5IG5lZWQgdG8gZXhwbGljdGx5IGRpYWJsZSBPcGVuU1NMIHdpdGgKICAtLXdpdGhvdXQtc3NsLgoKICBUaGlzIHdvcmsgaGFzIGJlZW4gc3BvbnNvcmVkIGJ5IFRoZSBXcml0dGVuIFdvcmQuCgpEYW5pZWwgKDUgQXByaWwgMjAwNSkKLSBDaHJpc3RvcGhlIExlZ3J5IGZpeGVkIHRoZSBwb3N0LXVwbG9hZCBjaGVjayBmb3IgRlRQIHRvIG5vdCBjb21wbGFpbiBpZiB0aGUKICB1cGxvYWQgd2FzIHNraXBwZWQgZHVlIHRvIGEgdGltZS1jb25kaXRpb24gYXMgc2V0IHdpdGgKICBDVVJMT1BUX1RJTUVDT05ESVRJT04uIEkgYWRkZWQgdGVzdCBjYXNlIDI0NyBhbmQgMjQ4IHRvIHZlcmlmeS4KClZlcnNpb24gNy4xMy4yICg1IEFwcmlsIDIwMDUpCgpEYW5pZWwgKDQgQXByaWwgMjAwNSkKLSBNYXJjZWxvIEp1Y2hlbSBmaXhlZCB0aGUgTVNWQyBtYWtlZmlsZSBmb3IgbGliY3VybAoKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIGNyYXNoIGluIGxpYmN1cmwsIHRoYXQgY291bGQgaGFwcGVuIGlmIHRoZSBlYXN5IGhhbmRsZQogIHdhcyBraWxsZWQgYmVmb3JlIHRoZSB0aHJlYWRpbmcgcmVzb2x2ZXIgKHdpbmRvd3Mgb25seSkgc3RpbGwgaGFkbid0CiAgY29tcGxldGVkLgoKLSBIYXJkZWVwIFNpbmdoIHJlcG9ydGVkIGEgcHJvYmxlbSBkb2luZyBIVFRQIFBPU1Qgd2l0aCBEaWdlc3QuIChJdCB3YXMKICBhY3R1YWxseSBhbHNvIGFmZmVjdGluZyBOVExNIGFuZCBOZWdvdGlhdGUuKSBJdCB0dXJuZWQgb3V0IHRoYXQgaWYgdGhlCiAgc2VydmVyIHJlc3BvbmRlZCB3aXRoIDEwMCBDb250aW51ZSBiZWZvcmUgdGhlIGluaXRpYWwgNDAxIHJlc3BvbnNlLCBsaWJjdXJsCiAgZGlkbid0IHRha2UgY2FyZSBvZiB0aGUgcmVzcG9uc2UgcHJvcGVybHkuIFRlc3QgY2FzZSAyNDUgYW5kIDI0NiBhZGRlZCB0bwogIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgzMCBNYXJjaCAyMDA1KQotIEFuZHJlcyBHYXJjaWEgbW9kaWZpZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gY2hlY2sgZm9yIGxpYmdkaTMyIGJlZm9yZQogIGxpYmNyeXB0bywgdG8gbWFrZSB0aGUgU1NMIGNoZWNrIHdvcmsgZmluZSBvbiBtc3lzL21pbmd3LgoKRGFuaWVsICgyOSBNYXJjaCAyMDA1KQotIFRvbSBNb2VycyBpZGVudGlmaWVkIGEgZmxhdyB3aGVuIHlvdSBzZW50IGEgUE9TVCB3aXRoIERpZ2VzdCBhdXRoZW50aWNhdGlvbiwKICBhcyBpbiB0aGUgZmlyc3QgcmVxdWVzdCB3aGVuIGN1cmwgc2VuZHMgYSBQT1NUIHdpdGggQ29udGVudC1MZW5ndGg6IDAsIGl0CiAgc3RpbGwgZm9yY2libHkgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGJlZm9yZSBkb2luZyB0aGUgbmV4dCBzdGVwIGluIHRoZSBhdXRoCiAgbmVnb3RpYXRpb24uCgotIEplc3BlciBKZW5zZW4gZm91bmQgb3V0IHRoYXQgRlRQLVNTTCBkaWRuJ3Qgd29yayBzaW5jZSBteSBGVFAKICByZXdyaXRlLiBGaXhpbmcgdGhhdCB3YXMgZWFzeSwgYnV0IGl0IGFsc28gcmV2ZWFsZWQgYSBtdWNoIHdvcnNlIHByb2JsZW06CiAgdGhlIEZUUCBzZXJ2ZXIgcmVzcG9uc2UgcmVhZGVyIGZ1bmN0aW9uIGRpZG4ndCBwcm9wZXJseSBkZWFsIHdpdGggcmVhZGluZwogIHJlc3BvbnNlcyBpbiBtdWx0aXBsZSB0aW55IGNodW5rcyBwcm9wZXJseSEgSSBtb2RpZmllZCB0aGUgRlRQIHNlcnZlciB0bwogIGFsbG93IGl0IHRvIHByb2R1Y2Ugc3VjaCBzcGxpdC11cCByZXNwb25zZXMgdG8gbWFrZSBzdXJlIGN1cmwgZGVhbHMgd2l0aAogIHRoZW0gYXMgaXQgc2hvdWxkLgoKLSBCYXNlZCBvbiBBdWd1c3R1cyBTYXVuZGVycycgY29tbWVudHMgYW5kIGZpbmRpbmdzLCB0aGUgSFRUUCBvdXRwdXQgYXV0aAogIGZ1bmN0aW9uIHdhcyBmaXhlZCB0byB1c2UgdGhlIHByb3BlciBwcm94eSBhdXRoZW50aWNhdGlvbiB3aGVuIG11bHRpcGxlIG9uZXMKICBhcmUgYWNjZXB0ZWQuIHRlc3QgMjM5IGFuZCB0ZXN0IDI0MyB3ZXJlIGFkZGVkIHRvIHJlcGVhdCB0aGUgcHJvYmxlbXMgYW5kCiAgdmVyaWZ5IHRoZSBmaXhlcy4KCiAgLS1wcm94eS1hbnlhdXRoIHdhcyBhZGRlZCB0byB0aGUgY3VybCB0b29sCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDUpCi0gVHJ1NjQgYW5kIHNvbWUgSVJJWCBib3hlcyBzZWVtIHRvIG5vdCBsaWtlIHRlc3QgMjM3IGFzIGl0IGlzLiBUaGVpcgogIGluZXRfYWRkcigpIGZ1bmN0aW9ucyBzZWVtcyB0byB1c2UgJjI1NSBvbiBhbGwgbnVtZXJpY2FscyBpbiBhIGlwdjQgZG90dGVkCiAgYWRkcmVzcyB3aGljaCBtYWtlcyBhIGRpZmZlcmVudCBmYWlsdXJlLi4uIE5vdyBJJ3ZlIG1vZGlmaWVkIHRoZSBpcHY0CiAgcmVzb2x2ZSBjb2RlIHRvIHVzZSBpbmV0X3B0b24oKSBpbnN0ZWFkIGluIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGVzZSBzeXN0ZW1zCiAgYmV0dGVyIGRldGVjdCB0aGlzIGFzIGEgYmFkIElQIGFkZHJlc3MgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSB0b2FsbHkgYm9ndXMKICBhZGRyZXNzIHRoYXQgaXMgdGhlbiBwYXNzZWQgb24gYW5kIHVzZWQuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDUpCi0gRGFuIEZhbmRyaWNoIG1hZGUgdGhlIGNvZGUgcHJvcGVybHkgdXNlIHRoZSB1Q2xpYmMncyB2ZXJzaW9uIG9mCiAgaW5ldF9udG9hX3IoKSB3aGVuIGJ1aWx0IHdpdGggaXQuCgotIEFkZGVkIHRlc3QgMjM3IGFuZCAyMzg6IHRlc3QgRVBTViBhbmQgUEFTViByZXNwb25zZSBoYW5kbGluZyB3aGVuIHRoZXkgZ2V0CiAgd2VsbC0gZm9ybWF0ZWQgZGF0YSBiYWNrIGJ1dCB1c2luZyBpbGxlZ2FsIHZhbHVlcy4gSW4gMjM3IFBBU1YgZ2V0cyBhbiBJUAogIGFkZHJlc3MgdGhhdCBpcyB3YXkgYmFkLiBJbiAyMzggRVBTViBnZXRzIGEgcG9ydCB0aGF0IGlzIHdheSBvdXQgb2YgcmFuZ2UuCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDUpCi0gQWRkZWQgYSBmZXcgbWlzc2luZyBmZWF0dXJlcyB0byB0aGUgY3VybC1jb25maWcgLS1mZWF0dXJlcyBsaXN0CgotIE1vZGlmaWVkIHRlc3RjdXJsLnBsIHRvIG5vdyBvZmZlcgogIDEgLSBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgYWxsIGluZm8gaXQgcHJldmlvdXNseSBvbmx5IHJlYWQgZnJvbQogICAgICBmaWxlOiAtLW5hbWUsIC0tZW1haWwsIC0tZGVzYyBhbmQgLS1jb25maWd1cmUKICAyIC0gLS1ub2N2c3VwIG1ha2VzIGl0IG5vdCBhdHRlbXB0IHRvIGRvIGN2cyB1cGRhdGUKICAzIC0gLS1jcm9zc2NvbXBpbGUgaW5mb3JtcyBpdCBhbmQgbWFrZXMgaXQgbm90IGF0dGVtcHQgdGhpbmdzIGl0IGNhbid0IGRvCgotIEZpeGVkIG51bWVyb3VzIHdpbjMyIGNvbXBpbGVyIHdhcm5pbmdzLgoKLSBSZW1vdmVkIHRoZSBsaWIvc2VjdXJpdHkuaCBmaWxlIHNpbmNlIGl0IHNoYWRvd2VkIHRoZSBtaW5ndy93aW4zMiBoZWFkZXIKICB3aXRoIHRoZSBzYW1lIG5hbWUgd2hpY2ggaXMgbmVlZGVkIGZvciBTU1BJIGJ1aWxkcy4gVGhlIGNvbnRlbnRzIG9mIHRoZQogIGZvcm1lciBzZWN1cml0eS5oIGlzIG5vdyBpIGtyYjQuaAoKLSBjb25maWd1cmUgLS1lbmFibGUtc3NwaSBub3cgZW5hYmxlcyBTU1BJIGluIHRoZSBidWlsZC4gSXQgb25seSB3b3JrcyBmb3IKICB3aW5kb3dzIGJ1aWxkcyAoaW5jbHVkaW5nIGNyb3NzLWNvbXBpbGVzIGZvciB3aW5kb3dzKS4KCkRhbmllbCAoMTIgTWFyY2ggMjAwNSkKLSBEYXZpZCBIb3VsZGVyIGFkZGVkIC0tZm9ybS1zdHJpbmcgdGhhdCBhZGRzIHRoYXQgc3RyaW5nIHRvIGEgbXVsdGlwYXJ0CiAgZm9ybXBvc3QgcGFydCwgd2l0aG91dCBzcGVjaWFsIGNoYXJhY3RlcnMgaGF2aW5nIHNwZWNpYWwgbWVhbmluZ3MgZXRjIGxpa2UKICAtLWZvcm0gZmVhdHVyZXMuCgpEYW5pZWwgKDExIE1hcmNoIDIwMDUpCi0gY3VybF92ZXJzaW9uX2luZm8oKSByZXR1cm5zIHRoZSBmZWF0dXJlIGJpdCBDVVJMX1ZFUlNJT05fU1NQSSBpZiBpdCB3YXMKICBidWlsdCB3aXRoIFNTUEkgc3VwcG9ydC4KCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIG1hZGUgaXQgcG9zc2libGUgdG8gYnVpbGQgbGliY3VybCB3aXRoIHRoZQogIFVTRV9XSU5ET1dTX1NTUEkgb24gV2luZG93cywgYW5kIHRoZW4gbGliY3VybCB3aWxsIGJlIGJ1aWx0IHRvIHVzZSB0aGUKICBuYXRpdmUgd2F5IHRvIGRvIE5UTE0uIFNTUEkgYWxzbyBhbGxvd3MgbGliY3VybCB0byBwYXNzIG9uIHRoZSBjdXJyZW50IHVzZXIKICBhbmQgaXRzIHBhc3N3b3JkIGluIHRoZSByZXF1ZXN0LgoKRGFuaWVsICg5IE1hcmNoIDIwMDUpCi0gRGFuIEYgaW1wcm92ZWQgdGhlIFNTTCBsaWIgc2V0dXAgaW4gY29uZmlndXJlLgoKLSBOb2RhayBTb2RhayByZXBvcnRlZCBhIGNyYXNoIHdoZW4gdXNpbmcgYSBTT0NLUzQgcHJveHkuCgotIEplYW4tTWFyYyBSYW5nZXIgcG9pbnRlZCBvdXQgYW4gZW1iYXJhc3NpbmcgZGVidWcgcHJpbnRmKCkgbGVmdG92ZXIgaW4gdGhlCiAgbXVsdGkgaW50ZXJmYWNlIGNvZGUuCgotIEFkanVzdGVkIHRoZSBtYW4gcGFnZSBmb3IgdGhlIGN1cmxfZ2V0ZGF0ZSgpIHJldHVybiB2YWx1ZSBmb3IgZGF0ZXMgYWZ0ZXIKICB5ZWFyIDIwMzguIEZvciAzMiBiaXQgdGltZV90IGl0IHJldHVybnMgMHg3ZmZmZmZmZiBidXQgZm9yIDY0Yml0IHRpbWVfdCBpdAogIHJldHVybnMgZWl0aGVyIHRoZSBjb3JyZWN0IHZhbHVlIG9yIGV2ZW4gLTEgb24gc29tZSBzeXN0ZW1zIHRoYXQgc3RpbGwgc2VlbQogIHRvIG5vdCBkZWFsIHdpdGggdGhpcyBwcm9wZXJseS4gVG9yIEFybnRzZW4gZm91bmQgYSA2NGJpdCBBSVggc3lzdGVtIGZvciB1cwogIHRoYXQgZGlkIHRoZSBsYXR0ZXIuIEd3ZW5vbGUgQmVhdWNoZXNuZSdzIE1hbmRyYWtlIHBhdGNoIHB1dCB0aGUgbGlnaHRzIG9uCiAgdGhpcyBwcm9ibGVtIGluIHRoZSBmaXJzdCBwbGFjZS4KCkRhbmllbCAoOCBNYXJjaCAyMDA1KQotIERvbWluaWNrIE1lZ2xpbyByZXBvcnRlZCB0aGF0IHVzaW5nIENVUkxPUFRfRklMRVRJTUUgd2hlbiB0cmFuc2ZlcnJpbmcgYSBGVFAKICBmaWxlIGdvdCBhIExhc3QtTW9kaWZpZWQ6IGhlYWRlciB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSwgY29ycnVwdGluZyB0aGUKICBhY3R1YWwgZGF0YS4gVGhpcyB3YXMgYmVjYXVzZSBzb21lIGNvbmRpdGlvbnMgZnJvbSB0aGUgcHJldmlvdXMgRlRQIGNvZGUgd2FzCiAgbm90IHByb3Blcmx5IGJyb3VnaHQgaW50byB0aGUgbmV3IEZUUCBjb2RlLiBJIGZpeGVkIGFuZCBJIGFkZGVkIHRlc3QgY2FzZQogIDUyMCB0byB2ZXJpZnkuIChUaGlzIGJ1ZyB3YXMgaW50cm9kdWNlZCBpbiA3LjEzLjEpCgotIERhbiBGYW5kcmljaCBmaXhlZCB0aGUgY29uZmlndXJlIC0td2l0aC16bGliIG9wdGlvbiB0byBhbHdheXMgY29uc2lkZXIgdGhlCiAgZ2l2ZW4gcGF0aCBiZWZvcmUgYW55IHN0YW5kYXJkIHBhdGhzLgoKRGFuaWVsICg2IE1hcmNoIDIwMDUpCi0gUmFuZHkgTWNNdXJjaHkgd2FzIHRoZSBmaXJzdCB0byByZXBvcnQgdGhhdCB2YWxncmluZC5wbSB3YXMgbWlzc2luZyBmcm9tIHRoZQogIHJlbGVhc2UgYXJjaGl2ZSBhbmQgdGh1cyAnbWFrZSB0ZXN0JyBmYWlscy4KCkRhbmllbCAoNSBNYXJjaCAyMDA1KQotIERhbiBGYW5kcmljaCBhZGRlZCBIQVZFX0ZUUlVOQ0FURSB0byBzZXZlcmFsIGNvbmZpZy0qLmggZmlsZXMuCgotIEFkZGVkIHRlc3QgY2FzZSAyMzUgdGhhdCBtYWtlcyBhIHJlc3VtZWQgdXBsb2FkIG9mIGEgZmlsZSB0aGF0IGlzbid0IHByZXNlbnQKICBvbiB0aGUgcmVtb3RlIHNpZGUuIFRoaXMgdGhlbiBjb252ZXJ0cyB0aGUgb3BlcmF0aW9uIHRvIGFuIG9yZGluYXJ5IFNUT1IKICB1cGxvYWQuIFRoaXMgd2FzIHJlcXVlc3RlZC9wb2ludGVkIG91dCBieSBJZ25hY2lvIFZhenF1ZXotQWJyYW1zLgoKICBJdCBhbHNvIHByb3ZlZCAoYW5kIEkgZml4ZWQpIGEgYnVnIGluIHRoZSBuZXdseSByZXdyaXR0ZW4gZnRwIGNvZGUgKGFuZAogIHByZXNlbnQgaW4gdGhlIDcuMTMuMSByZWxlYXNlKSB3aGVuIHRyeWluZyB0byByZXN1bWUgYW4gdXBsb2FkIGFuZCB0aGUKICBzZXJ2ZXJzIHJldHVybnMgYW4gZXJyb3IgdG8gdGhlIFNJWkUgY29tbWFuZC4gbGliY3VybCB0aGVuIGxvb3BzIGFuZCBzZW5kcwogIFNJWkUgY29tbWFuZHMgaW5maW5pdGVseS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIGEgU1NMIHByb2JsZW0gaW50cm9kdWNlZCBvbiBGZWJydWFyeSA5dGggdGhhdCBtYWRlCiAgbGliY3VybCBhdHRlbXB0IHRvIGxvYWQgdGhlIHdob2xlIHJhbmRvbSBmaWxlIHRvIHNlZWQgdGhlIFBSTkcuIFRoaXMgaXMKICByZWFsbHkgYmFkIHNpbmNlIHRoaXMgdHVybnMgb3V0IHRvIGJlIHVzaW5nIC9kZXYvdXJhbmRvbSBhdCB0aW1lcy4uLgoKVmVyc2lvbiA3LjEzLjEgKDQgTWFyY2ggMjAwNSkKCkRhbmllbCAoNCBNYXJjaCAyMDA1KQotIERhdmUgRHJpYmluIG1hZGUgaXQgcG9zc2libGUgdG8gc2V0IENVUkxPUFRfQ09PS0lFRklMRSB0byAiIiB0byBhY3RpdmF0ZQogIHRoZSBjb29raWUgImVuZ2luZSIgd2l0aG91dCBoYXZpbmcgdG8gcHJvdmlkZSBhbiBlbXB0eSBvciBub24tZXhpc3RpbmcgZmlsZS4KCi0gUmVuZSBSZWJlIGZpeGVkIGEgLSMgY3Jhc2ggd2hlbiBtb3JlIGRhdGEgdGhhbiBleHBlY3RlZCB3YXMgcmV0cmlldmVkLgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA1KQotIE5UTE0gYW5kIGZ0cC1rcmI0IGJ1ZmZlciBvdmVyZmxvdyBmaXhlZCwgYXMgcmVwb3J0ZWQgaGVyZToKICBodHRwOi8vd3d3LnNlY3VyaXR5Zm9jdXMuY29tL2FyY2hpdmUvMS8zOTEwNDIgYW5kIHRoZSBDQU4gcmVwb3J0IGhlcmU6CiAgaHR0cDovL2N2ZS5taXRyZS5vcmcvY2dpLWJpbi9jdmVuYW1lLmNnaT9uYW1lPUNBTi0yMDA1LTA0OTAKCiAgSWYgdGhlc2Ugc2VjdXJpdHkgZ3V5cyB3ZXJlIHNlcmlvdXMsIHdlJ2QgYmVlbiBub3RpZmllZCBpbiBhZHZhbmNlIGFuZCB3ZQogIGNvdWxkJ3ZlIHNhdmVkIGEgZmV3IG9mIHlvdSBhIGxpdHRsZSBzdXJwcmlzZSwgYnV0IG5vdyB3ZSB3ZXJlbid0LgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDA1KQotIFJhbHBoIE1pdGNoZWxsIHJlcG9ydGVkIGEgZmxhdyB3aGVuIHlvdSB1c2VkIGEgcHJveHkgd2l0aCBhdXRoLCBhbmQgeW91CiAgcmVxdWVzdGVkIGRhdGEgZnJvbSBhIGhvc3QgYW5kIHRoZW4gZm9sbG93ZWQgYSByZWRpcmVjdCB0byBhbm90aGVyCiAgaG9zdC4gbGliY3VybCB0aGVuIGRpZG4ndCB1c2UgdGhlIHByb3h5LWF1dGggcHJvcGVybHkgaW4gdGhlIHNlY29uZCByZXF1ZXN0LAogIGR1ZSB0byB0aGUgaG9zdC1vbmx5IGNoZWNrIGZvciBvcmlnaW5hbCBob3N0IG5hbWUgd3JvbmdseSBiZWluZyBleHRlbmRlZCB0bwogIHRoZSBwcm94eSBhdXRoIGFzIHdlbGwuIEFkZGVkIHRlc3QgY2FzZSAyMzMgdG8gdmVyaWZ5IHRoZSBmbGF3IGFuZCB0aGF0IHRoZQogIGZpeCByZW1vdmVkIHRoZSBwcm9ibGVtLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA1KQotIE1pa2UgRG9iYnMgcmVwb3J0ZWQgYSBtaW5ndyBidWlsZCBmYWlsdXJlIGR1ZSB0byB0aGUgbGFjayBvZgogIEJVSUxESU5HX0xJQkNVUkwgYmVpbmcgZGVmaW5lZCB3aGVuIGxpYmN1cmwgaXMgYnVpbHQuIE5vdyB0aGlzIGlzIGRlZmluZWQgYnkKICBjb25maWd1cmUgd2hlbiBtaW5ndyBpcyB1c2VkLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA1KQotIERhdmlkIGluIGJ1ZyByZXBvcnQgIzExMjQ1ODggZm91bmQgYW5kIGZpeGVkIGEgc29ja2V0IGxlYWsgd2hlbiBsaWJjdXJsCiAgZGlkbid0IGNsb3NlIHRoZSBzb2NrZXQgcHJvcGVybHkgd2hlbiByZXR1cm5pbmcgZXJyb3IgZHVlIHRvIGZhaWxpbmcKICBsb2NhbGJpbmQKCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNSkKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggSFRUUC1QT1NUaW5nIHVzaW5nICJhbnlhdXRoIgogIHRoYXQgcGlja3MgTlRMTS4gVGhhbmtzIHRvIERhdmlkIEJ5cm9uIGxldHRpbmcgbWUgdGVzdCBOVExNIGFnYWluc3QgaGlzCiAgc2VydmVycywgSSBjb3VsZCBxdWlja2x5IHJlcGVhdCBhbmQgZml4IHRoZSBwcm9ibGVtLiBJdCB0dXJuZWQgb3V0IHRvIGJlOgoKICBXaGVuIGxpYmN1cmwgUE9TVHMgd2l0aG91dCBrbm93aW5nL3VzaW5nIGFuIGF1dGhlbnRpY2F0aW9uIGFuZCBpdCBnZXRzIGJhY2sKICBhIGxpc3Qgb2YgdHlwZXMgZnJvbSB3aGljaCBpdCBwaWNrcyBOVExNLCBpdCBuZWVkcyB0byBlaXRoZXIgY29udGludWUKICBzZW5kaW5nIGl0cyBkYXRhIGlmIGl0IGtlZXBzIHRoZSBjb25uZWN0aW9uIGFsaXZlLCBvciBub3Qgc2VuZCB0aGUgZGF0YSBidXQKICBjbG9zZSB0aGUgY29ubmVjdGlvbi4gVGhlbiBkbyB0aGUgZmlyc3Qgc3RlcCBpbiB0aGUgTlRMTSBhdXRoLiBsaWJjdXJsCiAgZGlkbid0IHNlbmQgdGhlIGRhdGEgbm9yIGNsb3NlIHRoZSBjb25uZWN0aW9uIGJ1dCBzaW1wbHkgcmVhZCB0aGUKICByZXNwb25zZS1ib2R5IGFuZCB0aGVuIHNlbnQgdGhlIGZpcnN0IG5lZ290aWF0aW9uIHN0ZXAuIFdoaWNoIHRoZW4gZmFpbGVkCiAgbWlzZXJhYmx5IG9mIGNvdXJzZS4gVGhlIGZpeGVkIHZlcnNpb24gZm9yY2VzIGEgY29ubmVjdGlvbiBpZiB0aGVyZSBpcyBtb3JlCiAgdGhhbiAyMDAwIGJ5dGVzIGxlZnQgdG8gc2VuZC4KCkRhbmllbCAoMTQgRmVicnVhcnkgMjAwNSkKLSBUaGUgY29uZmlndXJlIHNjcmlwdCBkaWRuJ3QgY2hlY2sgZm9yIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpIHNvIGl0CiAgd2FzIG5ldmVyIHVzZWQuCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDUpCi0gUmVtb3ZlZCBhbGwgdXNlcyBvZiBzdHJmdGltZSgpIHNpbmNlIGl0IHVzZXMgdGhlIGxvY2FsaXNlZCB2ZXJzaW9uIG9mIHRoZQogIHdlZWsgZGF5IG5hbWVzIGFuZCBtb250aCBuYW1lcyBhbmQgc2VydmVycyBkb24ndCBsaWtlIHRoYXQuCgpEYW5pZWwgKDEwIEZlYnJ1YXJ5IDIwMDUpCi0gTm93IHRoZSB0ZXN0IHNjcmlwdCBkaXNhYmxlcyB2YWxncmluZC10ZXN0aW5nIHdoZW4gdGhlIHRlc3Qgc3VpdGUgcnVucyBpZgogIGxpYmN1cmwgaXMgYnVpbHQgc2hhcmVkLiBPdGhlcndpc2UgdmFsZ3JpbmQgb25seSB0ZXN0cyB0aGUgc2hlbGwgdGhhdCBydW5zCiAgdGhlIHdyYXBwZXItc2NyaXB0IG5hbWVkICdjdXJsJyB0aGF0IGlzIGEgZnJvbnQtZW5kIHRvIGN1cmwgaW4gdGhpcyBjYXNlLgogIFRoaXMgc2hvdWxkIGFsc28gZml4IHRoZSBodWdlIGFtb3VudCBvZiByZXBvcnRzIG9mIGZhbHNlIHBvc2l0aXZlcyB3aGVuCiAgdmFsZ3JpbmQgaGFzIGlkZW50aWZpZWQgbGVha3MgaW4gKGJhKXNoIGFuZCBub3QgaW4gY3VybCBhbmQgcGVvcGxlIHJlcG9ydAogIHRoYXQgYXMgY3VybCBidWdzLiBCdWcgcmVwb3J0ICMxMTE2NjcyIGlzIG9uZSBleGFtcGxlLgoKICBBbHNvLCB0aGUgdmFsZ3JpbmQgcmVwb3J0IHBhcnNlciBoYXMgYmVlbiBhZGFwdGVkIHRvIGNoZWNrIHRoYXQgYXQgbGVhc3Qgb25lCiAgb2YgdGhlIHNvdXJjZXMgaW4gYSBzdGFjayBzdHJhY2UgaXMgb25lIG9mIChsaWIpY3VybCdzIHNvdXJjZSBmaWxlcyBvcgogIG90aGVyd2lzZSBpdCB3aWxsIG5vdCBjb25zaWRlciB0aGUgcHJvYmxlbSB0byBjb25jZXJuIChsaWIpY3VybC4KCi0gTWFydHkgS3VocnQgc3RyZWFtbGluZWQgdGhlIFZNUyBidWlsZC4KCkRhbmllbCAoOSBGZWJydWFyeSAyMDA1KQotIERhdmlkIEJ5cm9uIGZpeGVkIGhpcyBTU0wgcHJvYmxlbXMsIGluaXRpYWxseSBtZW50aW9uZWQgaGVyZToKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDUtMDEvMDI0MC5odG1sLiBJdCB0dXJuZWQgb3V0IHdlIGRpZG4ndCB1c2UKICBTU0xfcGVuZGluZygpIGFzIHdlIHNob3VsZC4KCi0gQ29udmVydGVkIGxvdHMgb2YgRlRQIGNvZGUgdG8gYSBzdGF0ZW1hY2hpbmUsIHNvIHRoYXQgdGhlIG11bHRpIGludGVyZmFjZQogIGRvZXNuJ3QgYmxvY2sgd2hpbGUgY29tbXVuaWNhdGluZyBjb21tYW5kcy1yZXNwb25zZXMgd2l0aCBhbiBGVFAgc2VydmVyLgoKICBJJ3ZlIGFkZGVkIGEgY29tbWVudCBsaWtlIEJMT0NLSU5HIGluIHRoZSBjb2RlIG9uIGFsbCBzcG90cyBJIGNvdWxkIGZpbmQKICB3aGVyZSB3ZSBzdGlsbCBoYXZlIGJsb2NraW5nIG9wZXJhdGlvbnMuIFdoZW4gd2UgY2hhbmdlIGN1cmxfZWFzeV9wZXJmb3JtKCkKICB0byB1c2UgdGhlIG11bHRpIGludGVyZmFjZSwgd2UnbGwgYWxzbyBiZSBhYmxlIHRvIHNpbXBsaWZ5IHRoZSBjb2RlIHNpbmNlCiAgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSAiaW50ZXJuYWwgaW50ZXJmYWNlIi4KCiAgV2hpbGUgZG9pbmcgdGhpcywgSSd2ZSBub3cgbWFkZSBDVVJMRV9GVFBfQUNDRVNTX0RFTklFRCBzZXBhcmF0ZSBmcm9tIHRoZQogIG5ldyBDVVJMRV9MT0dJTl9ERU5JRUQuIFRoZSBmaXJzdCBvbmUgaXMgbm93IGFjY2VzcyBkZW5pZWQgdG8gYSBmdW5jdGlvbiwKICBsaWtlIGNoYW5naW5nIGRpcmVjdG9yeSBvciByZXRyaWV2aW5nIGEgZmlsZSwgd2hpbGUgdGhlIHNlY29uZCBtZWFucyB0aGF0IHdlCiAgd2VyZSBkZW5pZWQgbG9naW4uCgogIFRoZSBDVlMgdGFnICdiZWZvcmVfZnRwX3N0YXRlbWFjaGluZScgd2FzIHNldCBqdXN0IGJlZm9yZSB0aGlzIHdlbnQgaW4sIGluCiAgY2FzZSBvZiBmdXR1cmUgbmVlZC4KCi0gR2lzbGUgbWFkZSB0aGUgRElDVCBjb2RlIHNlbmQgQ1JMRiBhbmQgbm90IGp1c3QgTEYgYXMgdGhlIHNwZWMgc2F5cyBzby4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDA1KQotIEdpc2xlIGZpeGVkIHByb2JsZW1zIHdoZW4gbGliY3VybCBydW5zIG91dCBvZiBtZW1vcnksIGFuZCB3b3JrZWQgb24gbWFraW5nCiAgc3VyZSB0aGUgcHJvcGVyIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQgZm9yIHRob3NlIG9jY2F0aW9ucy4KCkRhbmllbCAoNyBGZWJydWFyeSAyMDA1KQotIE1hcnVrbyBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBpbmZsYXRlIGRlY29tcHJlc3NpbmcgZXhhY3RseSA2NEsKICBjb250ZW50cy4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDA1KQotIEVyaWMgVmVyZ25hdWQgZm91bmQgYSB1c2Ugb2YgYW4gdW5pbml0aWFsaXNlZCB2YXJpYWJsZSBpbiB0aGUgZnRwIHdoZW4gZG9pbmcKICBQT1JUIG9uIGlwdjYtZW5hYmxlZCBob3N0cy4KCi0gRGF2aWQgQnlyb24gcG9pbnRlZCBvdXQgd2UgY291bGQgdXNlIEJVRlNJWkUgdG8gcmVhZCBkYXRhIChpbgogIGxpYi90cmFuc2Zlci5jKSBpbnN0ZWFkIG9mIHVzaW5nIEJVRlNJWkUgLTEuCgpWZXJzaW9uIDcuMTMuMCAoMSBGZWJydWFyeSAyMDA1KQoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDUpCi0gQWRkZWQgTGFycyBOaWxzc29uJ3MgaHRtbHRpdGxlLmNjIGV4YW1wbGUKCkRhbmllbCAoMzAgSmFudWFyeSAyMDA1KQotIEZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCB0aGUgRE8gb3BlcmF0aW9uCiAgZmFpbGVkIChhcyBpbiB0ZXN0IGNhc2UgMjA1KS4KCi0gRml4ZWQgYSB2YWxncmluZCB3YXJuaW5nIGZvciBmaWxlOi8vIG9wZXJhdGlvbnMuCgotIEZpeGVkIGEgdmFsZ3JpbmQgcmVwb3J0IGluIHRoZSB1cmwgZ2xvYmJpbmcgY29kZSBmb3IgdGhlIGN1cmwgY29tbWFuZCBsaW5lCiAgdG9vbC4KCi0gQnVnZml4ZWQgdGhlIHBhcnNlciB0aGF0IHNjYW5zIHRoZSB2YWxncmluZCByZXBvcnQgb3V0cHV0cyAoaW4gcnVudGVzdHMucGwpLgogIEkgbm90aWNlZCB0aGF0IGl0IHByZXZpb3VzbHkgZGlkbid0IGRldGVjdCBhbmQgcmVwb3J0IHRoZSAiQ29uZGl0aW9uYWwganVtcAogIG9yIG1vdmUgZGVwZW5kcyBvbiB1bmluaXRpYWxpc2VkIHZhbHVlKHMpIiBlcnJvci4gV2hlbiBJIGZpeGVkIHRoaXMsIEkKICBjYXVnaHQgYSBmZXcgY3VybCBidWdzIHdpdGggaXQuIEFuZCB0aGVuIEkgaGFkIHRvIHNwZW5kIHRpbWUgdG8gbWFrZSB0aGUKICB0ZXN0IHN1aXRlIElHTk9SRSB0aGVzZSBlcnJvcnMgd2hlbiBPcGVuU1NMIGlzIHVzZWQgc2luY2UgaXQgcHJvZHVjZSBtYXNzaXZlCiAgYW1vdW50cyBvZiB2YWxncmluZCB3YXJuaW5ncyAoYnV0IG9ubHkgb2YgdGhlICJDb25kaXRpb25hbC4uLiIga2luZCBpdAogIHNlZW1zKS4gU28sIGlmIGEgdGVzdCB0aGF0IHJlcXVpcmVzIFNTTCBpcyBydW4sIGl0IGlnbm9yZXMgdGhlCiAgIkNvbmRpdGlvbmFsLi4uIiBlcnJvcnMsIGFuZCB5b3UnbGwgZ2V0IGEgInZhbGdyaW5kIFBBUlRJQUwiIG91dHB1dCBpbnN0ZWFkCiAgb2YgInZhbGdyaW5kIE9LIi4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDA1KQotIFVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UsIGFuZCBkb2luZyBhIHJlcXVzdGVkIGEgcmUtdXNlZCBjb25uZWN0aW9uIHRoYXQKICBnZXRzIGNsb3NlZCBqdXN0IGFmdGVyIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQgZmFpbGVkIGFuZCBkaWQgbm90IHJlLWlzc3VlCiAgYSByZXF1ZXN0IG9uIGEgZnJlc2ggcmVjb25uZWN0IGxpa2UgdGhlIGVhc3kgaW50ZXJmYWNlIGRpZC4gTm93IGl0IGRvZXMhCgotIERlZmluZSBDVVJMX01VTFRJRUFTWSB3aGVuIGJ1aWxkaW5nIGxpYmN1cmwgKGxpYi9lYXN5LmMgdG8gYmUgZXhhY3QpLCB0byB1c2UKICBteSBuZXcgY3VybF9lYXN5X3BlcmZvcm0oKSB0aGF0IHVzZXMgdGhlIG11bHRpIGludGVyZmFjZSB0byBydW4gdGhlCiAgcmVxdWVzdC4gSXQgaXMgYSBncmVhdCB0ZXN0YmVkIGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBJIGJlbGlldmUgd2UKICBzaGFsbCBkbyBpdCB0aGlzIHdheSBmb3IgcmVhbCBpbiB0aGUgZnV0dXJlIHdoZW4gd2UgaGF2ZSBhIHN1Y2Nlc3NvciB0bwogIGN1cmxfbXVsdGlfZmRzZXQoKS4gSSd2ZSB1c2VkIHRoaXMgYXBwcm9hY2ggdG8gZGV0ZWN0IGFuZCBmaXggc2V2ZXJhbCBvZiB0aGUKICByZWNlbnQgbXVsdGktaW50ZXJmYWNlcyBpc3N1ZXMuCgotIEFkanVzdGVkIHRoZSBLTk9XTl9CVUdTICMxNyBmaXggYSBiaXQgbW9yZSBzaW5jZSB0aGUgRlRQIGNvZGUgYWxzbyBkaWQgc29tZQogIGJhZCBhc3N1bXB0aW9ucy4KCi0gbXVsdGkgaW50ZXJmYWNlOiB3aGVuIGEgcmVxdWVzdCBpcyBkZW5pZWQgZHVlIHRvICJNYXhpbXVtIHJlZGlyZWN0cwogIGZvbGxvd2VkIiBsaWJjdXJsIGxlYWtlZCB0aGUgbGFzdCBMb2NhdGlvbjogVVJMLgoKLSBDb25uZWN0IGZhaWx1cmVzIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSB3YXMgb2Z0ZW4gcmV0dXJuZWQgYXMgImNvbm5lY3QoKQogIHRpbWVkIG91dCIgZXZlbiB0aG91Z2ggdGhlIHJlYXNvbiB3YXMgZGlmZmVyZW50LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDUpCi0gS05PV05fQlVHUyAjMTcgZml4ZWQuIEEgRE5TIGNhY2hlIGVudHJ5IG1heSBub3QgcmVtYWluIGxvY2tlZCBiZXR3ZWVuIHR3bwogIGN1cmxfZWFzeV9wZXJmb3JtKCkgaW52b2tlcy4gSXQgd2FzIHByZXZpb3VzbHkgdW5sb2NrZWQgYXQgZGlzY29ubmVjdCwgd2hpY2gKICBjb3VsZCBtZWFuIHRoYXQgaXQgcmVtYWluZWQgbG9ja2VkIGJldHdlZW4gbXVsdGlwbGUgdHJhbnNmZXJzLiBUaGUgRE5TIGNhY2hlCiAgbWF5IG5vdCBsaXZlIGFzIGxvbmcgYXMgdGhlIGNvbm5lY3Rpb24gY2FjaGUgZG9lcywgYXMgdGhleSBhcmUgc2VwYXJhdGUuCgogIFRvIGRlYWwgd2l0aCB0aGUgbGFjayBvZiBETlMgKGhvc3QgYWRkcmVzcykgZGF0YSBhdmFpbGFiaWxpdHkgaW4gcmUtdXNlZAogIGNvbm5lY3Rpb25zLCBsaWJjdXJsIG5vdyBrZWVwcyBhIGNvcHkgb2YgdGhlIElQIGFkcmVzcyBhcyBhIHN0cmluZywgdG8gYmUKICBhYmxlIHRvIHNob3cgaXQgZXZlbiBvbiBzdWJzZXF1ZW50IHJlcXVlc3RzIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24uCgogIFRoZSBwcm9ibGVtIGNvdWxkIGJlIG1hZGUgdG8gYXBwZWFyIHdpdGggdGhpcyBzdHVudDoKCiAgMS4gY3JlYXRlIGEgbXVsdGkgaGFuZGxlCiAgMi4gYWRkIGFuIGVhc3kgaGFuZGxlCiAgMy4gZmV0Y2ggYSBVUkwgdGhhdCBpcyBwZXJzaXN0ZW50IChsZWF2ZXMgdGhlIGNvbm5lY3Rpb24gYWxpdmUpCiAgNC4gcmVtb3ZlIHRoZSBlYXN5IGhhbmRsZSBmcm9tIHRoZSBtdWx0aQogIDUuIGtpbGwgdGhlIG11bHRpIGhhbmRsZQogIDYuIGNyZWF0ZSBhIG11bHRpIGhhbmRsZQogIDcuIGFkZCB0aGUgc2FtZSBlYXN5IGhhbmRsZSB0byB0aGUgbmV3IG11bHRpIGhhbmRsZQogIDguIGZldGNoIGEgVVJMIGZyb20gdGhlIHNhbWUgc2VydmVyIGFzIGJlZm9yZSAocmUtdXNpbmcgdGhlIGNvbm5lY3Rpb24pCgotIFN0ZXBoZW4gTW9yZSBwb2ludGVkIG91dCB0aGF0IENVUkxPUFRfRlRQUE9SVCBhbmQgdGhlIC1QIG9wdGlvbiBkaWRuJ3Qgd29yawogIHdoZW4gYnVpbHQgaXB2Ni1lbmFibGVkLiBJJ3ZlIG5vdyBtYWRlIGEgZml4IGZvciBpdC4gV3JpdGluZyB0ZXN0IGNhc2VzIGZvcgogIGN1c3RvbSBwb3J0IGhvc3RzIHR1cm5lZCB0b28gdHJpY2t5IHNvIHVuZm9ydHVuYXRlbHkgdGhlcmUncyBub25lLgoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDUpCi0gSWFuIEZvcmQgYXNrZWQgYWJvdXQgc3VwcG9ydCBmb3IgdGhlIEZUUCBjb21tYW5kIEFDQ1QsIGFuZCBJIGRpc2NvdmVyZWQgaXQKICBpcyBwcmVzZW50IGluIFJGQzk1OS4uLiBzbyBub3cgKGxpYiljdXJsIHN1cHBvcnRzIGl0IGFzIHdlbGwuIC0tZnRwLWFjY291bnQKICBhbmQgQ1VSTE9QVF9GVFBfQUNDT1VOVCBzZXQgdGhlIGFjY291bnQgc3RyaW5nLiAoVGhlIHNlcnZlciBtYXkgYXNrIGZvciBhbgogIGFjY291bnQgc3RyaW5nIGFmdGVyIFBBU1MgaGF2ZSBiZWVuIHNlbnQgYXdheS4gVGhlIGNsaWVudCByZXNwb25kcwogIHdpdGggIkFDQ1QgW2FjY291bnQgc3RyaW5nXSIuKSBBZGRlZCB0ZXN0IGNhc2UgMjI4IGFuZCAyMjkgdG8gdmVyaWZ5IHRoZQogIGZ1bmN0aW9uYWxpdHkuIFVwZGF0ZWQgdGhlIHRlc3QgRlRQIHNlcnZlciB0byBzdXBwb3J0IEFDQ1Qgc29tZXdoYXQuCgotIERhdmlkIFNoYXcgY29udHJpYnV0ZWQgYSBmYWlybHkgY29tcGxldGUgYW5kIGRldGFpbGVkIGF1dG9jb25mIHRlc3QgeW91IGNhbgogIHVzZSB0byBkZXRlY3QgbGliY3VybCBhbmQgc2V0dXAgdmFyaWFibGVzIGZvciB0aGUgcHJvdG9jb2xzIHRoZSBpbnN0YWxsZWQKICBsaWJjdXJsIHN1cHBvcnRzOiBkb2NzL2xpYmN1cmwvbGliY3VybC5tNAoKRGFuaWVsICgyMSBKYW51YXJ5IDIwMDUpCi0gTWFqb3IgRlRQIHRoaXJkIHBhcnR5IHRyYW5zZmVyIG92ZXJoYXVsLgoKICBUaGVzZSBmb3VyIG9wdGlvbnMgYXJlIG5vdyBvYnNvbGV0ZTogQ1VSTE9QVF9TT1VSQ0VfSE9TVCwKICBDVVJMT1BUX1NPVVJDRV9QQVRILCBDVVJMT1BUX1NPVVJDRV9QT1JUICh0aGlzIG9wdGlvbiBkaWRuJ3Qgd29yayBiZWZvcmUpCiAgYW5kIENVUkxPUFRfUEFTVl9IT1NULgoKICBUaGVzZSB0d28gb3B0aW9ucyBhcmUgYWRkZWQ6IENVUkxPUFRfU09VUkNFX1VSTCBhbmQgQ1VSTE9QVF9TT1VSQ0VfUVVPVEUuCgogIFRoZSB0YXJnZXQtc2lkZSBkaWRuJ3QgdXNlIHRoZSBwcm9wZXIgcGF0aCB3aXRoIFJFVFIsIGFuZCB0aHVzIHRoaXMgb25seQogIHdvcmtlZCBjb3JyZWN0bHkgaW4gdGhlIGxvZ2luIHBhdGggKGkuZSB3aXRob3V0IGRvaW5nIGFueSBDV0QpLiBUaGUgc291cmNlLQogIHNpZGUgc3RpbGwgdXNlcyBhIHdyb25nIHBhdGgsIGJ1dCB0aGUgZml4IGZvciB0aGlzIHdpbGwgbmVlZCB0byB3YWl0LiBWZXJpZnkKICB0aGUgZmxhdyBieSB1c2luZyBhIHNvdXJjZSBVUkwgd2l0aCBpbmNsdWRlZCAlWFgtY29kZXMuCgogIE1hZGUgQ1VSTE9QVF9GVFBQT1JUIGNvbnRyb2wgd2VhdGhlciB0aGUgdGFyZ2V0IG9wZXJhdGlvbiBzaG91bGQgdXNlIFBPUlQKICAob3Igbm90KS4gVGhlIG90aGVyIHNpZGUgdGh1cyB1c2VzIHBhc3NpdmUgKFBBU1YpIG1vZGUuCgogIFVwZGF0ZWQgdGhlIGZ0cDNyZHBhcnR5LmMgZXhhbXBsZSBzb3VyY2UgdG8gdXNlIHRoZSB1cGRhdGVkIG9wdGlvbnMuCgogIEFkZGVkIHN1cHBvcnQgZm9yIGEgc2Vjb25kIEZUUCBzZXJ2ZXIgaW4gdGhlIHRlc3Qgc3VpdGUuIE5hbWVkLi4uIGZ0cDIuCiAgQWRkZWQgdGVzdCBjYXNlcyAyMzAsIDIzMSBhbmQgMjMyIGFzIGEgZmV3IGZpcnN0IGJhc2ljIHRlc3RzIG9mIHZlcnkgc2ltcGxlCiAgM3JkIHBhcnR5IHRyYW5zZmVycy4KCiAgQ2hhbmdlZCB0aGUgZGVidWcgb3V0cHV0IHRvIGluY2x1ZGUgJ3RhcmdldCcgYW5kICdzb3VyY2UnIHdoZW4gYSAzcmQgcGFydHkKICBpcyBiZWluZyBtYWRlLCB0byBtYWtlIGl0IGNsZWFyZXIgd2hhdCBjb21tYW5kcy9yZXNwb25zZXMgY2FtZSBvbiB3aGF0CiAgY29ubmVjdGlvbi4KCiAgQWRkZWQgdGhyZWUgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zOiAtLTNwLXVybCwgLS0zcC11c2VyIGFuZCAtLTNwLXF1b3RlLgoKICBEb2N1bWVudGVkIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgdGhlIGN1cmxfZWFzeV9zZXRvcHQgb3B0aW9ucyByZWxhdGVkCiAgdG8gdGhpcmQgcGFydHkgdHJhbnNmZXJzLgoKICAoVGVtcG9yYXJpbHkpIGRpc2FibGVkIHRoZSBhYmlsaXR5IHRvIHJlLXVzZSBhbiBleGlzdGluZyBjb25uZWN0aW9uIGZvciB0aGUKICBzb3VyY2UgY29ubmVjdGlvbi4gVGhpcyBpcyBiZWNhdXNlIGl0IG5lZWRzIHRvIGZvcmNlIGEgbmV3IGluIGNhc2UgdGhlCiAgc291cmNlIGFuZCB0YXJnZXQgaXMgdGhlIHNhbWUgaG9zdCwgYW5kIHRoZSBob3N0IG5hbWUgY2hlY2sgaXMgdHJpY2tpZXIgbm93CiAgd2hlbiB0aGUgc291cmNlIGlzIGlkZW50aWZpZWQgd2l0aCBhIGZ1bGwgVVJMIGluc3RlYWQgb2YgYSBwbGFpbiBob3N0IG5hbWUKICBsaWtlIGJlZm9yZS4KCiAgVE9ETyAoc2hvcnQtdGVybSkgZm9yIDNyZCBwYXJ0eSB0cmFuc2ZlcnM6IHF1b3RlIHN1cHBvcnQuIFRoZSBvcHRpb25zIGFyZQogIHRoZXJlLCB3ZSBuZWVkIHRvIGFkZCB0ZXN0IGNhc2VzIHRvIHZlcmlmeSB0aGVpciBmdW5jdGlvbmFsaXR5LgoKICBUT0RPIChsb25nLXRlcm0pIGZvciAzcmQgcGFydHkgdHJhbnNmZXJzOiBJUHY2IHN1cHBvcnQgKEVQUlQgYW5kIEVQU1YgZXRjKQogIGFuZCBTU0wvVFNMIHN1cHBvcnQuCgpEYW5pZWwgKDIwIEphbnVhcnkgMjAwNSkKLSBQaGlsaXBwZSBIYW1lYXUgZm91bmQgb3V0IHRoYXQgLVEgIitbY29tbWFuZF0iIGRpZG4ndCB3b3JrLCBhbHRob3VnaCBzb21lCiAgY29kZSB3YXMgd3JpdHRlbiBmb3IgaXQuIEkgZml4ZWQgYW5kIGFkZGVkIHRlc3QgY2FzZSAyMjcgdG8gdmVyaWZ5IGl0LgogIFRoZSBjdXJsLjEgbWFuIHBhZ2UgZGlkbid0IG1lbnRpb24gdGhlICcrJyBzbyBJIGFkZGVkIGl0LgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDUpCi0gU3RlcGhhbiBCZXJnbWFubiBtYWRlIGxpYmN1cmwgcmV0dXJuIENVUkxFX1VSTF9NQUxGT1JNQVQgaWYgYW4gRlRQIFVSTAogIGNvbnRhaW5zICUwYSBvciAlMGQgaW4gdGhlIHVzZXIsIHBhc3N3b3JkIG9yIENXRCBwYXJ0cy4gKEEgZnV0dXJlIGZpeCB3b3VsZAogIGluY2x1ZGUgZG9pbmcgaXQgZm9yICUwMCBhcyB3ZWxsIC0gc2VlIEtOT1dOX0JVR1MgZm9yIGRldGFpbHMuKSBUZXN0IGNhc2UKICAyMjUgYW5kIDIyNiB3ZXJlIGFkZGVkIHRvIHZlcmlmeSB0aGlzCgotIFN0ZXBoYW4gQmVyZ21hbm4gcG9pbnRlZCBvdXQgdHdvIGZsYXdzIGluIGxpYmN1cmwgYnVpbHQgd2l0aCBIVFRQIGRpc2FibGVkOgoKICAxKSB0aGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzdGlsbCByZWFkIGFuZCB1c2VkIHRvIHNldCBIVFRQIHByb3h5CgogIDIpIHlvdSBjb3VsZG4ndCBkaXNhYmxlIGh0dHAgcHJveHkgd2l0aCBDVVJMT1BUX1BST1hZIChzaW5jZSB0aGUgb3B0aW9uIHdhcwogICAgIGRpc2FibGVkKS4gVGhpcyBpcyBpbXBvcnRhbnQgc2luY2UgYXBwcyBtYXkgd2FudCB0byBkaXNhYmxlIEhUVFAgcHJveHkKICAgICB3aXRob3V0IGFjdHVhbGx5IGtub3dpbmcgaWYgbGliY3VybCB3YXMgYnVpbHQgdG8gZGlzYWJsZSBIVFRQIG9yIG5vdC4KCiAgQmFzZWQgb24gU3RlcGhhbidzIHBhdGNoLCBib3RoIHRoZXNlIGlzc3VlcyBzaG91bGQgbm93IGJlIGZpeGVkLgoKRGFuaWVsICgxOCBKYW51YXJ5IDIwMDUpCi0gQ29keSBKb25lcycgZW5oYW5jZWQgdmVyc2lvbiBvZiBTYW11ZWwgRO1heiBHYXJj7WEncyBNU1ZDIG1ha2VmaWxlIHBhdGNoIHdhcwogIGFwcGxpZWQuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNSkKLSBBbGV4IGFrYSBXaW5kRWFnbGUgcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGRvaW5nICJjdXJsIC12IGRpY3Rpb25hcnkuY29tIiwgY3VybAogIGFzc3VtZWQgdGhpcyB1c2VkIHRoZSBESUNUIHByb3RvY29sLiBXaGlsZSBndWVzc2luZyBwcm90b2NvbHMgd2lsbCByZW1haW4KICBmdXp6eSwgSSd2ZSBub3cgbWFkZSBzdXJlIHRoYXQgdGhlIGhvc3QgbmFtZXMgbXVzdCBzdGFydCB3aXRoICJbcHJvdG9jb2xdLiIKICBmb3IgdGhlbSB0byBiZSBhIHZhbGlkIGd1ZXNzYWJsZSBuYW1lLiBJIGFsc28gcmVtb3ZlZCAiaHR0cHMiIGFzIGEgcHJlZml4CiAgdGhhdCBpbmRpY2F0ZXMgSFRUUFMsIHNpbmNlIHdlIGhhcmRseSBldmVyIHNlZSBhbnkgaG9zdCBuYW1lcyB1c2luZyB0aGF0LgoKRGFuaWVsICgxMyBKYW51YXJ5IDIwMDUpCi0gSW5zcGlyZWQgYnkgTWFydGlqbiBLb3N0ZXIncyBwYXRjaCBhbmQgZXhhbXBsZSBzb3VyY2UgYXQKICBodHRwOi8vd3d3LmdyZWVuaGlsbHMuY28udWsvbWFrL2dlbnRvby9jdXJsLWVpbnRyLWJ1Zy5jLCBJIG5vdyBtYWRlIHRoZQogIHNlbGVjdCgpIGFuZCBwb2xsKCkgY2FsbHMgcHJvcGVybHkgbG9vcCBpZiB0aGV5IHJldHVybiAtMSBhbmQgZXJybm8gaXMKICBFSU5UUi4gZ2xpYmMgZG9jcyBmb3IgdGhpcyBpcyBmb3VuZCBoZXJlOgogIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJjL21hbnVhbC9odG1sX25vZGUvSW50ZXJydXB0ZWQtUHJpbWl0aXZlcy5odG1sCgogIFRoaXMgbGFzdCBsaW5rIHNheXMgQlNEIGRvZXNuJ3QgaGF2ZSB0aGlzICJlZmZlY3QiLiBXaWxsIHRoZXJlIGJlIGEgcHJvYmxlbQogIGlmIHdlIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5PwoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDUpCi0gRGFuIFRvcm9wIGNsZWFuZWQgdXAgYSBmZXcgbm8gbG9uZ2VyIHVzZWQgdmFyaWFibGVzIGZyb20gRGF2aWQgUGhpbGxpcHMnCiAgc2VsZWN0KCkgb3ZlcmhhdWwgZml4LgoKLSBDeXJpbGwgT3N0ZXJ3YWxkZXIgcG9zdGVkIGEgZGV0YWlsZWQgYW5hbHlzaXMgYWJvdXQgYSBidWcgdGhhdCBvY2N1cnMgd2hlbgogIHVzaW5nIGEgY3VzdG9tIEhvc3Q6IGhlYWRlciBhbmQgY3VybCBmYWlscyB0byBzZW5kIGEgcmVxdWVzdCBvbiBhIHJlLXVzZWQKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gYW5kIHRodXMgY3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGFuZCByZXNlbmRzIGl0LiBJdAogIHRoZW4gc2VudCB0d28gSG9zdDogaGVhZGVycy4gQ3lyaWxsJ3MgYW5hbHlzaXMgd2FzIHBvc3RlZCBoZXJlOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9hcmNoaXZlLTIwMDUtMDEvMDAyMi5odG1sCgotIEJydWNlIE1pdGNoZW5lciBpZGVudGlmaWVkIChidWcgcmVwb3J0ICMxMDk5NjQwKSB0aGUgbmV2ZXItZW5kaW5nIFNPQ0tTNQogIHByb2JsZW0gd2l0aCB0aGUgdmVyc2lvbiBieXRlIGFuZCB0aGUgY2hlY2sgZm9yIGJhZCB2ZXJzaW9ucy4gQnJ1Y2UgaGFzIGxvdHMKICBvZiBjbHVlcyBvbiB0aGlzLCBhbmQgYmFzZWQgb24gaGlzIHN1Z2dlc3Rpb24gSSd2ZSBub3cgcmVtb3ZlZCB0aGUgY2hlY2sgb2YKICB0aGF0IGJ5dGUgc2luY2UgaXQgc2VlbXMgdG8gYmUgYWJsZSB0byBjb250YWluIDEgb3IgNS4KCkRhbmllbCAoMTAgSmFudWFyeSAyMDA1KQotIFBhdmVsIE9yZWhvdiByZXBvcnRlZCBtZW1vcnkgcHJvYmxlbXMgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGluIGJ1ZyByZXBvcnQKICAjMTA5ODg0My4gSW4gc2hvcnQsIGEgc2hhcmVkIEROUyBjYWNoZSB3YXMgc2V0dXAgZm9yIGEgbXVsdGkgaGFuZGxlIGFuZCB3aGVuCiAgdGhlIHNoYXJlZCBjYWNoZSB3YXMgZGVsZXRlZCBiZWZvcmUgdGhlIGluZGl2aWR1YWwgZWFzeSBoYW5kbGVzLCB0aGUgbGF0dGVyCiAgY2xlYW51cHMgY2F1c2VkIHJlYWQvd3JpdGVzIHRvIGFscmVhZHkgZnJlZWQgbWVtb3J5LgoKLSBIemhpanVuIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIFNTTCBjZXJ0aWZpY2F0ZSBjb2RlLCB0aGF0IGxlYWtlZCB0aGUKICByZW1vdGUgY2VydGlmaWNhdGUgbmFtZSB3aGVuIGl0IGRpZG4ndCBtYXRjaCB0aGUgdXNlZCBob3N0IG5hbWUuCgpHaXNsZSAoOCBKYW51YXJ5IDIwMDUpCi0gQWRkZWQgTWFrZWZpbGUuV2F0Y29tIGZpbGVzIChzcmMvbGliKS4gVXBkYXRlZCBNYWtlZmlsZS5kaXN0LgoKRGFuaWVsICg3IEphbnVhcnkgMjAwNSkKLSBJbXByb3ZlZCB0aGUgdGVzdCBzY3JpcHQncyB2YWxncmluZCBsb2cgcGFyc2VyIHRvIGFjdHVhbGx5IHdvcmshIEFsc28gYWRkZWQKICB0aGUgYWJpbGl0eSB0byBkaXNhYmxlIHRoZSBsb2cgc2Nhbm5lciBmb3Igc3BlY2lmaWMgdGVzdCBjYXNlcy4gVGVzdCBjYXNlCiAgNTA5IHJlc3VsdHMgaW4gbnVtZXJvdXMgcHJvYmxlbXMgYW5kIGxlYWtzIGluIE9wZW5TU0wgYW5kIGhhcyB0byBnZXQgaXQKICBkaXNhYmxlZC4KCkRhbmllbCAoNiBKYW51YXJ5IDIwMDUpCi0gRml4ZWQgYSBzaW5nbGUtYnl0ZSByZWFkIG91dCBvZiBib3VuZHMgaW4gdGVzdCBjYXNlIDM5IGluIHRoZSBjdXJsIHRvb2wgY29kZQogIChpLmUgbm90IGluIHRoZSBsaWJyYXJ5KS4KCi0gQnVnIHJlcG9ydCAjMTA5NzAxOSBpZGVudGlmaWVkIGEgcHJvYmxlbSB3aGVuIGRvaW5nIC1kICJkYXRhIiB3aXRoIC1HIGFuZAogIHNlbmRpbmcgaXQgdG8gdHdvIFVSTHMgd2l0aCB7fS4gQWRkZWQgdGVzdCAxOTkgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA1KQotIE1hcnR5IEt1aHJ0IGFkanVzdGVkIGEgVk1TIGJ1aWxkIHNjcmlwdCBzbGlnaHRseQoKLSBLYWkgU29tbWVyZmVsZCBhbmQgR2lzbGUgVmFuZW0gZml4ZWQgbGliY3VybCB0byBidWlsZCB3aXRoIElQdjYgc3VwcG9ydCBvbgogIFdpbjIwMDAuCgpEYW5pZWwgKDIgSmFudWFyeSAyMDA1KQotIEFsZXggTmVibGV0dCB1cGRhdGVkIHRoZSBNU1ZDIG1ha2VmaWxlcyBzbGlnaHRseS4KRGFuaWVsICgyNSBEZWNlbWJlciAyMDA0KQotIFJlbW92ZWQgc3JjL2NvbmZpZy5oLmluIGZyb20gQ1ZTLCBpdCBpcyBub3cgY29waWVkIGZyb20gdGhlIChnZW5lcmF0ZWQpCiAgbGliL2NvbmZpZy5oLmluIGluc3RlYWQsIGFzIHRoZXkgY2FuIHZlcnkgd2VsbCBiZSB0aGUgc2FtZS4gVGhpcyByZW1vdmVzIGEKICAibWFudWFsIGhhc3NsZSIuIFlvdSBtYXkgd2FudCB0byByZS1ydW4gYnVpbGRjb25mIG5vdy4KCi0gV2VybmVyIEtvY2ggZmlsZWQgRGViaWFuIGJ1ZyByZXBvcnQgIzI4Njc5NCwgbWVudGlvbmluZyB0aGF0IGN1cmwgY29udGFpbmVkCiAgbm9uLWZyZWUgKGJ5IERlYmlhbidzIHZpZXcpIHNvdXJjZSBjb2RlLiBUaGlzIHdhcyBBbmd1cyBNYWNrYXkncwogIHNyYy9nZXRwYXNzLmMgc291cmNlIGNvZGUuIEkgdHJpZWQgdG8gY29udGFjdCBoaW0gYWJvdXQgaXQgdG8gcXVpY2tseSBzb2x2ZQogIHRoaXMgaXNzdWUsIGJ1dCBoaXMgZW1haWwgYWRkcmVzc2VzIGJvdW5jZSBhbmQgSSBnb3Qgc29tZSB0aW1lICJvdmVyIiBhbmQKICByZWltcGxlbWVudGVkIHRoZSBmdW5jdGlvbmFsaXR5IG9uY2UgYnJvdWdodCBieSBBbmd1cy4gV2Ugbm8gbG9uZ2VyIHVzZSBhbnkKICBvZiBBbmd1cycgb3JpZ2luYWwgY29kZSBhbmQgdGhlIG5ldyBmdW5jdGlvbiBpcyBtdWNoIHNpbXBsZXIgKElNTykuIElzc3VlCiAgc29sdmVkLgoKRGFuaWVsICgyNCBEZWNlbWJlciAyMDA0KQotIERhdmlkIFNoYXcgYWRkZWQgLS1wcm90b2NvbHMgdG8gY3VybC1jb25maWcsIHNvIHRoYXQgaXQgbm93IGxpc3RzIGFsbAogIHByb3RvY29scyBsaWJjdXJsIHdhcyBidWlsdCB0byBzdXBwb3J0LiAtLWZlYXR1cmUgbm8gbG9uZ2VyIGxpc3RzIGRpc2FibGVkCiAgcHJvdG9jb2xzLgoKRGFuaWVsICgyMyBEZWNlbWJlciAyMDA0KQotIERhdmlkIFNoYXcgZml4ZWQgdGhlIGNvbmZpZ3VyZSAtLWRpc2FibGUtW3Byb3RvY29sXSB2YXJpYWJsZXMgc28gdGhhdAogIGN1cmwtY29uZmlnIC0tZmVhdHVyZSBub3cgd29ya3MgY29ycmVjdGx5IQoKRGFuaWVsICgyMiBEZWNlbWJlciAyMDA0KQotIFJ1bmUgS2xldmVsYW5kIGZpeGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgZm9yIHJlY2VpdmVkIGNvb2tpZXMgd2l0aCB0aGUKICAocmFyZSkgdmVyc2lvbiBhdHRyaWJ1dGUgc2V0LgoKLSBNYXJjaW4gS29uaWNraSBwcm92aWRlZCB0d28gY29uZmlndXJlIGZpeGVzIGFuZCBhIHNvdXJjZSBmaXggdG8gbWFrZSBjdXJsCiAgYnVpbGQgb3V0LW9mLXRoZS1ib3ggb24gQmVPUy4KCkRhbmllbCAoMjEgRGVjZW1iZXIgMjAwNCkKLSBBZGRlZCB0ZXN0IGNhc2UgMjE3IHRoYXQgdmVyaWZpZWQgQ1VSTElORk9fSFRUUF9DT05ORUNUQ09ERSwgYW5kIEkgbWFkZSB0aGUKICAtdyBvcHRpb24gc3VwcG9ydCAnaHR0cF9jb25uZWN0JyB0byBtYWtlIGl0IGVhc2llciB0byB2ZXJpZnkhCgotIEZpeGVkIGxpYi9zZWxlY3QuYyBpbmNsdWRlIG9yZGVyIHRvIGJ1aWxkIGZpbmUgb24gRnJlZUJTRAoKLSBGaXhlZCBmYWlsZigpJ3MgcmV1c2Ugb2YgdGhlIHZhX2xpc3QgdmFyaWFibGUgdGhhdCBjcmFzaGVkIG9uIEZyZWVCU0QuCiAgUG9pbnRlZCBvdXQgYnkgUGV0ZXIgUGVudGNoZXYuCgpWZXJzaW9uIDcuMTIuMyAoMjAgRGVjZW1iZXIgMjAwNCkKCkRhbmllbCAoMTkgRGVjZW1iZXIgMjAwNCkKLSBJIGludmVzdGlnYXRlZCBvdXIgUEtDUzEyIGJ1aWxkIHByb2JsZW0gb24gU29sYXJpcyAyLjcgd2l0aCBPcGVuU1NMIDAuOS43ZSwKICBhbmQgaXQgdHVybmVkIG91dCB0byBiZSB0aGUgZmF1bHQgb2YgdGhlIHpsaWIgMS4xLjQgaGVhZGVycyBkb2luZyBhIHR5cGVkZWYKICBuYW1lZCAnZnJlZV9mdW5jJyBhbmQgdGhlIE9wZW5TU0wgaGVhZGVycyBoYXZlIGEgcHJvdG90eXBlIHRoYXQgdXNlcwogICdmcmVlX2Z1bmMnIGluIG9uZSBvZiBpdHMgYXJndW1lbnRzLiBUaGlzIGlzIHdoeSB0aGUgY29tcGlsZSBlcnJvcnMgb3V0LgoKICBJbiBvdGhlciB3b3Jkcywgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBvcGVuc3NsL3BrY3MxMi5oIGhlYWRlciBiZWZvcmUgdGhlCiAgemxpYi5oIGhlYWRlciBhbmQgaXQgYnVpbGRzIGZpbmUuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgZm9yIHRoaXMKICBmaWxlIGFuZCBpdCB0aGVuIGdldHMgaW5jbHVkZWQgZWFybHkgaW4gbGliL3VybGRhdGEuaC4KCkRhbmllbCAoMTggRGVjZW1iZXIgMjAwNCkKLSBTYW11ZWwgTGlzdG9wYWQgYWRkZWQgc3VwcG9ydCBmb3IgUEtDUzEyIGZvcm1hdHRlZCBjZXJ0aWZpY2F0ZXMuCgotIFNhbXVlbCBMaXN0b3BhZCBmaXhlZCAtRSB0byBzdXBwb3J0ICJDOi9wYXRoIiAod2l0aCBmb3J3YXJkIHNsYXNoKSBhcyB3ZWxsLgoKRGFuaWVsICgxNiBEZWNlbWJlciAyMDA0KQotIEdpc2xlIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIGRpcmVjdG9yeSByZS11c2UgZm9yIEZUUC4KCiAgSSBhZGRlZCB0ZXN0IGNhc2UgMjE1IGFuZCAyMTYgdG8gYmV0dGVyIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gRGluYXIgaW4gYnVnIHJlcG9ydCAjMTA4NjEyMSwgZm91bmQgYSBmaWxlIGhhbmRsZSBsZWFrIHdoZW4gYSBtdWx0aXBhcnQKICBmb3JtcG9zdCAoaW5jbHVkaW5nIGEgZmlsZSB1cGxvYWQgcGFydCkgd2FzIGFib3J0ZWQgYmVmb3JlIHRoZSB3aG9sZSBmaWxlCiAgd2FzIHNlbnQuCgpEYW5pZWwgKDE1IERlY2VtYmVyIDIwMDQpCi0gVG9tIExlZSBmb3VuZCBvdXQgdGhhdCBnbG9iYmluZyBvZiBzdHJpbmdzIHdpdGggYmFja3NsYXNoZXMgZGlkbid0IHdvcmsgYXMKICB5b3UnZCBleHBlY3QuIEJhY2tzbGFzaGVzIGFyZSBzdWNoIGEgY2VudHJhbCBwYXJ0IG9mIHdpbmRvd3MgZmlsZSBuYW1lcyB0aGF0CiAgZm9yY2luZyBiYWNrc2xhc2hlcyB0byBoYXZlIHRvIGJlIGVzY2FwZWQgd2l0aCBiYWNrc2xhc2hlcyBpcyBhIGJpdCB0b28KICBhd2t3YXJkIHRvIHVzZXJzLiBTdGFydGluZyBub3csIHlvdSBvbmx5IG5lZWQgdG8gZXNjYXBlIGdsb2JiaW5nIGNoYXJhY3RlcnMKICBzdWNoIGFzIHRoZSBmaXZlIGxldHRlcnM6ICJbXXt9LCIuIEFkZGVkIHRlc3QgY2FzZSAyMTQgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDE0IERlY2VtYmVyIDIwMDQpCi0gSGFyc2hhbCBQcmFkaGFuIHBhdGNoZWQgYSBIVFRQIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBmbGF3OiBpZiB0aGUgdXNlciBuYW1lCiAgYW5kL29yIHBhc3N3b3JkIHdlcmUgbW9kaWZpZWQgYmV0d2VlbiB0d28gcmVxdWVzdHMgb24gYSBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbiwgdGhlIHNlY29uZCByZXF1ZXN0IHdlcmUgc3RpbGwgbWFkZSB3aXRoIHRoZSBmaXJzdCBzZXR1cCEKCiAgSSBhZGRlZCB0ZXN0IGNhc2UgNTE5IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgxMyBEZWNlbWJlciAyMDA0KQotIEdpc2xlIGFkZGVkIENVUkxJTkZPX1NTTF9FTkdJTkVTIHRvIGN1cmxfZWFzeV9nZXRpbmZvKCkgdG8gYWxsb3cgYW4gYXBwCiAgdG8gbGlzdCBhbGwgYXZhaWxhYmxlIGNyeXB0byBFTkdJTkVTLgoKLSBHaXNsZSBmaXhlZCBidWcgcmVwb3J0ICMxMDgzNTQyLCB3aGljaCBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCByZXN1bWluZwogIGxhcmdlIGZpbGUgKD40R0IpIGZpbGU6Ly8gdHJhbnNmZXJzIG9uIHdpbmRvd3MuCgpEYW5pZWwgKDExIERlY2VtYmVyIDIwMDQpCi0gTWFkZSB0aGUgdGVzdCBzdWl0ZSBIVFRQIHNlcnZlciAoc3dzKSBjYXBhYmxlIG9mIHVzaW5nIElQdjYsIGFuZCB0aGVuCiAgZXh0ZW5kZWQgdGhlIHRlc3QgZW52aXJvbm1lbnQgdG8gc3VwcG9ydCB0aGF0IGFuZCBhbHNvIGFkZGVkIHRocmVlIHRlc3QKICBjYXNlcyAoMjQwLCAyNDEsIDI0MikgdGhhdCBydW4gdGVzdHMgdXNpbmcgSVB2Ni4gVGVzdCAyNDIgdXNlcyBhIFVSTCB0aGF0CiAgZGlkbid0IHdvcmsgYmVmb3JlIHRoZSAxMCBkZWMgZml4IGJ5IEthaSBTb21tZXJmZWxkLgoKLSBNYWRlIGEgZmFpbGVkIGZpbGU6Ly8gcmVzdW1lIG91dHB1dCBhbiBlcnJvciBtZXNzYWdlCgotIENvcnJlY3RlZCB0aGUgQ1VSTEVfQkFEX0RPV05MT0FEX1JFU1VNRSBlcnJvciBtZXNzYWdlIGluIGxpYi9zdHJlcnJvci5jCgotIERhbiBGYW5kcmljaDoKCiAgc2ltcGxpZmllZCBhbmQgY29uc29saWRhdGVkIHRoZSBTU0wgY2hlY2tzIGluIGNvbmZpZ3VyZSBhbmQgdGhlIHVzYWdlIG9mIHRoZQogIGRlZmluZXMgaW4gbGliL3NldHVwLmgKCiAgcHJvdmlkZWQgYSBmaXJzdCBsaWJjdXJsLnBjLmluIGZpbGUgZm9yIHBrZy1jb25maWcgKGJ1dCB0aGUgcmVzdWx0IGlzIG5vdAogIGluc3RhbGxlZCBhbnl3aGVyZSBhdCB0aGlzIHBvaW50KQoKICBleHRlbmRlZCB0aGUgY3Jvc3MgY29tcGlsZSBzZWN0aW9uIGluIHRoZSBkb2NzL0lOU1RBTEwgZmlsZQoKRGFuaWVsICgxMCBEZWNlbWJlciAyMDA0KQotIFdoZW4gcHJvdmlkaW5nIHVzZXIgbmFtZSBpbiB0aGUgVVJMIGFuZCBhIElQdjYtc3R5bGUgSVAtYWRkcmVzcyAobGlrZSBpbgogICJmdHA6Ly91c2VyQFs6OjFdL3RtcCIpLCB0aGUgVVJMIHBhcnNlciBkaWRuJ3QgZ2V0IHRoZSBob3N0IGV4dHJhY3RlZAogIHByb3Blcmx5LiAgUmVwb3J0ZWQgYW5kIGZpeGVkIGJ5IEthaSBTb21tZXJmZWxkLgoKRGFuaWVsICg5IERlY2VtYmVyIDIwMDQpCi0gVG9uIFZvb24gcHJvdmlkZWQgYSBjb25maWd1cmUgZml4IHRoYXQgc2hvdWxkIGZpeCB0aGUgbm90b3Jpb3VzIChtb3N0bHkKICByZXBvcnRlZCBvbiBTb2xhcmlzKSBwcm9ibGVtIHdoZXJlIHRoZSBzaXplX3QgY2hlY2sgZmFpbHMgZHVlIHRvIHRoZSBTU0wKICBsaWJzIGJlaW5nIGZvdW5kIGluIGEgZGlyIG5vdCBzZWFyY2hlZCB0aHJvdWdoIGJ5IHRoZSBydW4tdGltZSBsaW5rZXIuCiAgcGF0Y2gtdHJhY2tlciBlbnRyeSAjMTA4MTcwNy4KCi0gQnJ5YW4gSGVuZGVyc29uIHBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgIzEwODE3ODggdGhhdCB0aGUgY3VybC1jb25maWcKICAtLXZlcm51bSBvdXRwdXQgd2Fzbid0IHplcm8gcHJlZml4ZWQgcHJvcGVybHkgKGFzIGNsYWltZWQgaW4gZG9jdW1lbnRhdGlvbikuCiAgVGhpcyBpcyBmaXhlZCBpbiBtYWtldGd6IG5vdy4KCkRhbmllbCAoOCBEZWNlbWJlciAyMDA0KQotIE1hdHQgVmVlbnN0cmEgdXBkYXRlZCB0aGUgbWFjaC1PIGZyYW1ld29yayBmaWxlcyBmb3IgTWFjIE9TIFguCgotIFJlbmUgQmVybmhhcmR0IGZvdW5kIGFuZCBmaXhlZCBhIGJ1ZmZlciBvdmVycnVuIGluIHRoZSBOVExNIGNvZGUsIHdoZXJlCiAgbGliY3VybCBhbHdheXMgYW5kIHVuY29uZGl0aW9uYWxseSBvdmVyd3JvdGUgYSBzdGFjay1iYXNlZCBhcnJheSB3aXRoIDMgemVybwogIGJ5dGVzLiBUaGlzIGlzIG5vdCBhbiBleHBsb2l0YWJsZSBidWZmZXIgb3ZlcmZsb3cuIE5vIG5lZWQgdG8gZ2V0IGFsYXJtZWQuCgpEYW5pZWwgKDcgRGVjZW1iZXIgMjAwNCkKLSBGaXhlZCBzbyB0aGF0IHRoZSBmaW5hbCBlcnJvciBtZXNzYWdlIGlzIHNlbnQgdG8gdGhlIHZlcmJvc2UgaW5mbyAic3RyZWFtIgogIGV2ZW4gaWYgbm8gZXJyb3JidWZmZXIgaXMgc2V0LgoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoIGFkZGVkIHRoZSAtLWRpc2FibGUtY29va2llcyBvcHRpb24gdG8gY29uZmlndXJlIHRvIGJ1aWxkCiAgbGliY3VybCB3aXRob3V0IGNvb2tpZSBzdXBwb3J0LiBUaGlzIGlzIG1haW5seSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gYnVpbGQgYQogIG1pbmltYWxpc3RpYyBsaWJjdXJsIHdpdGggbm8gY29va2llcyBzdXBwb3J0IGF0IGFsbC4gTGlrZSBmb3IgZW1iZWRkZWQKICBzeXN0ZW1zIG9yIHNpbWlsYXIuCgotIFJpY2hhcmQgQXR0ZXJlciBmaXhlZCBsaWJjdXJsJ3Mgd2F5IG9mIGRlYWxpbmcgd2l0aCB0aGUgRVBTVgogIHJlc3BvbnNlLiBQcmV2aW91c2x5LCBsaWJjdXJsIHdvdWxkIHJlLXJlc29sdmUgdGhlIGhvc3QgbmFtZSB3aXRoIHRoZSBuZXcKICBwb3J0IG51bWJlciBhbmQgYXR0ZW1wdCB0byBjb25uZWN0IHRvIHRoYXQsIHdoaWxlIGl0IHNob3VsZCB1c2UgdGhlIElQIGZyb20KICB0aGUgY29udHJvbCBjaGFubmVsLiBUaGlzIGJ1ZyBtYWRlIGl0IGhhcmQgdG8gRVBTViBmcm9tIGFuIEZUUCBzZXJ2ZXIgd2l0aAogIG11bHRpcGxlIElQIGFkZHJlc3NlcyEKCkRhbmllbCAoMyBEZWNlbWJlciAyMDA0KQotIEJ1ZyByZXBvcnQgIzEwNzgwNjY6IHdoZW4gYSBjaHVua2VkIHRyYW5zZmVyIHdhcyBwcmUtbWF0dXJlbHkgY2xvc2VkIGV4YWN0bHkKICBhdCBhIGNodW5rIGJvdW5kYXJ5IGl0IHdhcyBub3QgY29uc2lkZXJlZCBhbiBlcnJvciBhbmQgdGh1cyB3ZW50IHVubm90aWNlZC4KICBGaXhlZCBieSBNYXVyaWNlIEJhcm51bS4KCiAgQWRkZWQgdGVzdCBjYXNlIDIwNyB0byB2ZXJpZnkuCgpEYW5pZWwgKDIgRGVjZW1iZXIgMjAwNCkKLSBGaXhlZCB0aGUgQ09OTkVDVCBsb29wIHRvIGRlZmF1bHQgdGltZW91dCB0byAzNjAwIHNlY29uZHMuCgogIEFkZGVkIHRlc3QgY2FzZSAyMDYgdGhhdCBtYWtlcyBDT05ORUNUIHdpdGggRGlnZXN0LgoKICBGaXhlZCBhIGZsYXcgdGhhdCBwcmVwZW5kZWQgIihuaWwpIiB0byB0aGUgaW5pdGlhbCBDT05ORUNUIHJxZXVlc3QncyB1c2VyLQogIGFnZW50IGZpZWxkLgoKRGFuaWVsICgzMCBOb3ZlbWJlciAyMDA0KQotIERhbiBGYW5kcmljaCdzIGZpeCBmb3IgbGlieiAxLjEgYW5kICJleHRyYSBmaWVsZCIgdXNhZ2UgaW4gYSBnemlwIHN0cmVhbQoKLSBEYW4gYWxzbyBoZWxwZWQgbWUgd2l0aCBpbnB1dCBkYXRhIHRvIGNyZWF0ZSB0aHJlZSBtb3JlIHRlc3QgY2FzZXMgZm9yIHRoZQogIC0tY29tcHJlc3NlZCBvcHRpb24uCgpEYW5pZWwgKDI5IE5vdmVtYmVyIDIwMDQpCi0gSSBpbXByb3ZlZCB0aGUgdGVzdCBzdWl0ZSB0byBlbmFibGUgYmluYXJ5IGNvbnRlbnRzIGluIHRoZSB0ZXN0cyAoYnkgcHJvdmluZwogIGl0IGJhc2U2NCBlbmNvZGVkKSwgbGlrZSBmb3IgdGVzdGluZyBkZWNvbXByZXNzIGV0Yy4gQWRkZWQgdGVzdCAyMjAgYW5kIDIyMQogIGZvciB0aGlzIHB1cnBvc2UuIFRlc3RzIGNhbiBub3cgYWxzbyBkZXBlbmQgb24gbGlieiB0byBydW4uCgotIEFzIHJlcG9ydGVkIGJ5IFJlaW5vdXQgdmFuIFNjaG91d2VuIGluIE1hbmRyYWtlJ3MgYnVnIHRyYWNrZXIgYnVnIDEyMjg1CiAgKGh0dHA6Ly9xYS5tYW5kcmFrZXNvZnQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMjI4NSksIHdoZW4gY29ubmVjdGluZyB0byBhbgogIElQdjYgaG9zdCB3aXRoIEZUUCwgLS1kaXNhYmxlLWVwc3YgKG9yIC0tZGlzYWJsZS1lcHJ0KSBlZmZlY3RpdmVseSBkaXNhYmxlcwogIHRoZSBhYmlsaXR5IHRvIHRyYW5zZmVyIGEgZmlsZS4gTm93LCB3aGVuIGNvbm5lY3RlZCB0byBhbiBGVFAgc2VydmVyIHdpdGgKICBJUHY2LCB0aGVzZSBGVFAgY29tbWFuZHMgY2FuJ3QgYmUgZGlzYWJsZWQgZXZlbiBpZiBhc2tlZCB0byB3aXRoIHRoZQogIGF2YWlsYWJsZSBsaWJjdXJsIG9wdGlvbnMuCgpEYW5pZWwgKDI2IE5vdmVtYmVyIDIwMDQpCi0gQXMgcmVwb3J0ZWQgaW4gTWFuZHJha2UncyBidWcgdHJhY2tlciBidWcgMTIyODkKICAoaHR0cDovL3FhLm1hbmRyYWtlc29mdC5jb20vc2hvd19idWcuY2dpP2lkPTEyMjg5KSwgY3VybCB3b3VsZCBwcmludCBhCiAgbmV3bGluZSB0byAiZmluaXNoIiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYWZ0ZXIgZWFjaCByZWRpcmVjdCBhbmQgbm90IG9ubHkKICBhZnRlciBhIGNvbXBsZXRlZCB0cmFuc2Zlci4KCkRhbmllbCAoMjUgTm92ZW1iZXIgMjAwNCkKLSBGVFAgaW1wcm92ZW1lbnRzOgoKICBJZiBFUFNWLCBFUFJUIG9yIExQUlQgaXMgdHJpZWQgYW5kIGRvZXNuJ3Qgd29yaywgaXQgd2lsbCBub3QgYmUgcmV0cmllZCBvbgogIHRoZSBzYW1lIHNlcnZlciBhZ2FpbiBldmVuIGlmIGEgZm9sbG93aW5nIHJlcXVlc3QgaXMgbWFkZSB1c2luZyBhIHBlcnNpc3RlbnQKICBjb25uZWN0aW9uLgoKICBJZiBhIHNlY29uZCByZXF1ZXN0IGlzIG1hZGUgdG8gYSBzZXJ2ZXIsIHJlcXVlc3RpbmcgYSBmaWxlIGZyb20gdGhlIHNhbWUKICBkaXJlY3RvcnkgYXMgdGhlIHByZXZpb3VzIHJlcXVlc3Qgb3BlcmF0ZWQgb24sIGxpYmN1cmwgd2lsbCBubyBsb25nZXIgbWFrZQogIHRoYXQgbG9uZyBzZXJpZXMgb2YgQ1dEIGNvbW1hbmRzIGp1c3QgdG8gZW5kIHVwIG9uIHRoZSBzYW1lIHNwb3QuIE5vdGUgdGhhdAogIHRoaXMgaXMgb25seSBmb3IgKmV4YWN0bHkqIHRoZSBzYW1lIGRpci4gVGhlcmUgaXMgc3RpbGwgcm9vbSBmb3IgaW1wcm92ZW1lbnRzCiAgdG8gb3B0aW1pemUgdGhlIENXRC1zZW5kaW5nIHdoZW4gdGhlIGRpcnMgYXJlIG9ubHkgc2xpZ2h0bHkgZGlmZmVyZW50LgoKICBBZGRlZCB0ZXN0IDIxMCwgMjExIGFuZCAyMTIgdG8gdmVyaWZ5IHRoZXNlIGNoYW5nZXMuIEhhZCB0byBpbXByb3ZlIHRoZQogIHRlc3Qgc2NyaXB0IHRvbyBhbmQgYWRkZWQgYSBuZXcgcHJpbWl0aXZlIHRvIHRoZSB0ZXN0IGZpbGUgZm9ybWF0LgoKRGFuaWVsICgyNCBOb3ZlbWJlciAyMDA0KQotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gZGV0ZWN0IHNlbGVjdCBwcm9wZXJseSB3aGVuIHJ1bgogIHdpdGggTXN5cy9NaW5ndyBvbiBXaW5kb3dzLgoKRGFuaWVsICgyMiBOb3ZlbWJlciAyMDA0KQotIE1hZGUgSFRUUCBQVVQgYW5kIFBPU1QgcmVxdWVzdHMgbm8gbG9uZ2VyIHVzZSBIRUFEIHdoZW4gZG9pbmcgbXVsdGktcGFzcwogIGF1dGggbmVnb3RpYXRpb24gKE5UTE0sIERpZ2VzdCBhbmQgTmVnb3RpYXRlKSwgYnV0IGluc3RlYWQgdXNlIHRoZSByZXF1ZXN0CiAga2V5d29yZCAicHJvcGVybHkiLiBEZXRhaWxzIGluIGxpYi9SRUFETUUuaHR0cGF1dGguIFRoaXMgYWxzbyBpbnRyb2R1Y2VzCiAgQ1VSTE9QVF9JT0NUTEZVTkNUSU9OIGFuZCBDVVJMT1BUX0lPQ1RMREFUQSwgdG8gYmUgdXNlZCBieSBhcHBzIHRoYXQgdXNlIHRoZQogICJhbnkiIGF1dGggYWx0ZXJuYXRpdmUgYXMgdGhlbiBsaWJjdXJsIG1heSBuZWVkIHRvIHNlbmQgdGhlIFBVVC9QT1NUIGRhdGEKICBtb3JlIHRoYW4gb25jZSBhbmQgdGh1cyBtYXkgbmVlZCB0byBhc2sgdGhlIGFwcCB0byAicmV3aW5kIiB0aGUgcmVhZCBkYXRhCiAgc3RyZWFtIHRvIHN0YXJ0LgoKICBTZWUgYWxzbyB0aGUgbmV3IGV4YW1wbGUgdXNpbmcgdGhpczogZG9jcy9leGFtcGxlcy9hbnlhdXRocHV0LmMKCi0gRGF2aWQgUGhpbGxpcHMgZW5oYW5jZWQgdGVzdCA1MTguIEkgbWFkZSBpdCBkZXBlbmQgb24gYSAiZmVhdHVyZSIgc28gdGhhdAogIHN5c3RlbXMgd2l0aG91dCBnZXRybGltaXQoKSB3b24ndCBhdHRlbXB0IHRvIHRlc3QgNTE4LiBjb25maWd1cmUgbm93IGNoZWNrcwogIGZvciBnZXRybGltaXQoKSBhbmQgc2V0cmxpbWl0KCkgZm9yIHRoaXMgdGVzdCBjYXNlLgoKRGFuaWVsICgxOCBOb3ZlbWJlciAyMDA0KQotIERhdmlkIFBoaWxsaXBzIGZpeGVkIGxpYmN1cmwgdG8gbm90IGNyYXNoIGFueW1vcmUgd2hlbiBtb3JlIHRoYW4gRkRfU0VUU0laRQogIGZpbGUgZGVzY3JpcHRvcnMgYXJlIGluIHVzZS4gVGVzdCBjYXNlIDUxOCBhZGRlZCB0byB2ZXJpZnkuCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDQpCi0gVG8gdGVzdCBteSBmaXggZm9yIHRoZSBDVVJMSU5GT19SRURJUkVDVF9USU1FIGJ1ZywgSSBhZGRlZCB0aW1lX3JlZGlyZWN0IGFuZAogIG51bV9yZWRpcmVjdHMgc3VwcG9ydCB0byB0aGUgLXcgd3JpdGVvdXQgb3B0aW9uIGZvciB0aGUgY29tbWFuZCBsaW5lIHRvb2wuCgotIFdvamNpZWNoIFp3aWVma2EgZm91bmQgb3V0IHRoYXQgQ1VSTElORk9fUkVESVJFQ1RfVElNRSBkaWRuJ3Qgd29yayBhcwogIGRvY3VtZW50ZWQuCgpEYW5pZWwgKDEyIE5vdmVtYmVyIDIwMDQpCi0gR2lzbGUgVmFuZW0gbW9kaWdpZWQgdGhlIE1TVkMgYW5kIE5ldHdhcmUgbWFrZWZpbGVzIHRvIGJ1aWxkIHdpdGhvdXQKICBsaWJjdXJsLmRlZgoKLSBEYW4gRmFuZHJpY2ggYWRkZWQgdGhlIC0tZGlzYWJsZS1jcnlwdG8tYXV0aCBvcHRpb24gdG8gY29uZmlndXJlIHRvIGFsbG93CiAgbGliY3VybCB0byBidWlsZCB3aXRob3V0IERpZ2VzdCBzdXBwb3J0LiAoSSBmaWd1cmUgaXQgc2hvdWxkIGFsc28gZXhwbGljaXRseQogIGRpc2FibGUgTmVnb3RpYXRlIGFuZCBOVExNLikKCi0gICAgICAgICAgICAgICAgICoqKiBNb2RpZmllZCBCZWhhdmlvdXIgQWxlcnQgKioqCgogIFNldHRpbmcgQ1VSTE9QVF9QT1NURklFTERTIHRvIE5VTEwgd2lsbCBubyBsb25nZXIgZG8gYSBHRVQuCgogIFNldHRpbmcgQ1VSTE9QVF9QT1NURklFTERTIHRvICIiIHdpbGwgc2VuZCBhIHplcm8gYnl0ZSBQT1NUIGFuZCBzZXR0aW5nCiAgQ1VSTE9QVF9QT1NURklFTERTIHRvIE5VTEwgYW5kIENVUkxPUFRfUE9TVEZJRUxEU0laRSB0byB6ZXJvIHdpbGwgYWxzbyBtYWtlCiAgYSB6ZXJvIGJ5dGUgUE9TVC4gQWRkZWQgdGVzdCBjYXNlIDUxNSB0byB2ZXJpZnkgdGhpcy4KCiAgU2V0dGluZyBDVVJMT1BUX0hUVFBQT1NUIHRvIE5VTEwgbWFrZXMgYSB6ZXJvIGJ5dGUgcG9zdC4gQWRkZWQgdGVzdCBjYXNlIDUxNgogIHRvIHZlcmlmeSB0aGlzLgoKICBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgbXVzdCBub3cgYmUgc2V0IHRvIC0xIHRvIHNpZ25hbCAid2UgZG9uJ3Qga25vdyIuCiAgU2V0dGluZyBpdCB0byB6ZXJvIHNpbXBseSBzYXlzIHRoaXMgaXMgYSB6ZXJvIGJ5dGUgUE9TVC4KCiAgV2hlbiBwcm92aWRpbmcgUE9TVCBkYXRhIHdpdGggYSByZWFkIGNhbGxiYWNrLCBzZXR0aW5nIHRoZSBzaXplIHVwIGZyb250CiAgaXMgbm93IG1hZGUgd2l0aCBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgYW5kIG5vdCB3aXRoIENVUkxPUFRfSU5GSUxFU0laRS4KCkRhbmllbCAoMTEgTm92ZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2ggYWRkZWQgLS1kaXNhYmxlLXZlcmJvc2UgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWxsb3cgYnVpbGRzCiAgd2l0aG91dCB2ZXJib3NlIHN0cmluZ3MgaW4gdGhlIGNvZGUsIHRvIHNhdmUgc29tZSAxMktCIHNwYWNlLiBNYWtlcyBzZW5zZQogIG9ubHkgZm9yIHN5c3RlbXMgd2l0aCB2ZXJ5IGxpdHRsZSBtZW1vcnkgcmVzb3VyY2VzLgoKLSBKZWZmIFBoaWxsaXBzIGZvdW5kIG91dCB0aGF0IGEgZGF0ZSBzdHJpbmcgd2l0aCBhIHllYXIgYmV5b25kIDIwMzggY291bGQKICBjcmFzaCB0aGUgbmV3IGRhdGUgcGFyc2VyIG9uIHN5c3RlbXMgd2l0aCAzMmJpdCB0aW1lX3QuIFdlIG5vdyBjaGVjayBmb3IKICB0aGlzIGNhc2UgYW5kIGRlYWwgd2l0aCBpdC4KCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwNCkKLSBJIGluc3RhbGxlZCBIZWltZGFsIG9uIG15IERlYmlhbiBib3ggKHVzaW5nIHRoZSBkZWJpYW4gcGFja2FnZSkgYW5kIG5vdGljZWQKICB0aGF0IGNvbmZpZ3VyZSAtLXdpdGgtZ3NzYXBpIGZhaWxlZCB0byBjcmVhdGUgYSBuaWNlIGJ1aWxkLiBGaXhlZCBub3cuCgpEYW5pZWwgKDkgTm92ZW1iZXIgMjAwNCkKLSBHaXNsZSBWYW5lbSBtYXJrZWQgYWxsIGV4dGVybmFsIGZ1bmN0aW9uIGNhbGxzIHdpdGggQ1VSTF9FWFRFUk4gc28gdGhhdCBub3cKICB0aGUgV2luZG93cywgTmV0d2FyZSBhbmQgb3RoZXIgYnVpbGRzIG5vIGxvbmdlciBuZWVkIGxpYmN1cmwuZGVmIG9yIHNpbWlsYXIKICBmaWxlcy4KCkRhbmllbCAoOCBOb3ZlbWJlciAyMDA0KQotIE1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2hlY2sgZm9yIHRsZC5oIGlmIGxpYmlkbiB3YXMgZGV0ZWN0ZWQsIHNpbmNlCiAgbGliaWRuIDAuMy5YIGRpZG4ndCBoYXZlIHN1Y2ggYSBoZWFkZXIgYW5kIHdlIGRvbid0IHdvcmsgd2l0aCBhbnl0aGluZwogIGJlZm9yZSBsaWJpZG4gMC40LjEgYW55d2F5ISBTdXNlIDkuMSBhcHBhcmVudGx5IHNoaXBzIHdpdGggYSAwLjMuWCB2ZXJzaW9uCiAgb2YgbGliaWRuIHdoaWNoIG1ha2VzIHRoZSBjdXJsIDcuMTIuMiBidWlsZCBmYWlsLiBKZWFuLVBoaWxpcHBlCiAgQmFycmV0dGUtTGFQaWVycmUgaGVscGVkIHBvaW50aW5nIHRoaXMgb3V0LgoKLSBJYW4gR3VsbGl2ZXIgcmVwb3J0ZWQgaW4gZGViaWFuIGJ1ZyByZXBvcnQgIzI3ODY5MTogaWYgY3VybCBpcyBpbnZva2VkIGluIGFuCiAgZW52aXJvbm1lbnQgd2hlcmUgc3RkZXJyIGlzIGNsb3NlZCB0aGUgLXYgb3V0cHV0IHdpbGwgc3RpbGwgYmUgc2VudCB0byBmaWxlCiAgZGVzY3JpcHRvciAyIHdoaWNoIHRoZW4gbWlnaHQgYmUgdGhlIG5ldHdvcmsgc29ja2V0IGhhbmRsZSEgTm93IHdlIGhhdmUgYQogIHdlaXJkIGhhY2sgaW5zdGVhZCB0aGF0IGF0dGVtcHRzIHRvIG1ha2Ugc3VyZSB0aGF0IGZpbGUgZGVzY3JpcHRvciAyIGlzCiAgb3BlbmVkICh3aXRoIGEgY2FsbCB0byBwaXBlKCkpIGJlZm9yZSBsaWJjdXJsIGlzIGNhbGxlZCB0byBkbyB0aGUgdHJhbnNmZXIuCiAgY29uZmlndXJlIG5vdyBjaGVja3MgZm9yIHBpcGUoKSBhbmQgc3lzdGVtcyB3aXRob3V0IHBpcGUgZG9uJ3QgZ2V0IHRoZSB3ZWlyZAogIGhhY2sgZG9uZS4KCkRhbmllbCAoNSBOb3ZlbWJlciAyMDA0KQotIFRpbSBTbmVkZG9uIG1hZGUgbGliY3VybCBzZW5kIG5vIG1vcmUgdGhhbiA2NEsgaW4gYSBzaW5nbGUgZmlyc3QgY2h1bmsgd2hlbgogIGRvaW5nIGEgaHVnZSBQT1NUIG9uIFZNUywgYXMgdGhpcyBpcyBhIHN5c3RlbSBsaW1pdGF0aW9uLiBEZWZhdWx0IG9uIGdlbmVyYWwKICBzeXN0ZW1zIGlzIDEwMEsuCgpEYW5pZWwgKDQgTm92ZW1iZXIgMjAwNCkKLSBBbmRyZXMgR2FyY2lhIG1hZGUgaXQgYnVpbGQgb24gbWluZ3cgYWdhaW5hLCBteSAtLXJldHJ5IGNvZGUgYnJva2UgdGhlIGJ1aWxkLgoKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDQpCi0gQWRkZWQgLS1yZXRyeS1tYXgtdGltZSB0aGF0IGFsbG93cyBhIG1heGltdW0gdGltZSB0aGF0IG1heSBub3QgaGF2ZSBiZWVuCiAgcmVhY2hlZCBmb3IgYSByZXRyeSB0byBiZSBtYWRlLiBJZiBub3Qgc2V0IHRoZXJlIGlzIG5vIG1heGltdW0gdGltZSwgb25seQogIHRoZSBhbW91bnQgb2YgcmV0cmllcyBzZXQgd2l0aCAtLXJldHJ5LgoKLSBQYXVsIE5vbGFuIHByb3ZpZGVkIGEgcGF0Y2ggdG8gbWFrZSBsaWJjdXJsIGJ1aWxkIG5pY2VseSBvbiBXaW5kb3dzIENFLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDQpCi0gV2hlbiBjcm9zcy1jb21waWxpbmcsIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vIGxvbmdlciBhdHRlbXB0cyB0byB1c2UKICBwa2ctY29uZmlnIG9uIHRoZSBidWlsZCBob3N0IGluIG9yZGVyIHRvIGRldGVjdCBPcGVuU1NMIGNvbXBpbGVyIG9wdGlvbnMuCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2g6CgogIEFuIGltcHJvdmVtZW50IHRvIHRoZSBnemlwIGhhbmRsaW5nIG9mIGxpYmN1cmwuIFRoZXJlIHdlcmUgdHdvIHByb2JsZW1zIHdpdGgKICB0aGUgb2xkIHZlcnNpb246IGl0IHdhcyBwb3NzaWJsZSBmb3IgYSBtYWxpY2lvdXMgZ3ppcCBmaWxlIHRvIGNhdXNlIGxpYmN1cmwKICB0byBsZWFrIG1lbW9yeSwgYXMgYSBidWZmZXIgd2FzIG1hbGxvY2VkIHRvIGhvbGQgdGhlIGhlYWRlciBhbmQgbmV2ZXIgZnJlZWQKICBpZiB0aGUgaGVhZGVyIGVuZGVkIHdpdGggbm8gZmlsZSBjb250ZW50cy4gIFRoZSBzZWNvbmQgcHJvYmxlbSBpcyB0aGF0IHRoZQogIDY0IEtpQiBkZWNvbXByZXNzaW9uIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaywgd2hpY2ggY2F1c2VkCiAgdW5leHBlY3RlZGx5IGhpZ2ggc3RhY2sgdXNhZ2UgYW5kIG92ZXJmbG93ZWQgdGhlIHN0YWNrIG9uIHNvbWUgc3lzdGVtcwogIChzb21lb25lIGNvbXBsYWluZWQgYWJvdXQgdGhhdCBpbiB0aGUgbWFpbGluZyBsaXN0IGFib3V0IGEgeWVhciBhZ28pLgoKICBCb3RoIHByb2JsZW1zIGFyZSBmaXhlZCBieSB0aGlzIHBhdGNoLiBUaGUgZmlyc3Qgb25lIGlzIGZpeGVkIHdoZW4gYSByZWNlbnQKICAoMS4yKSB2ZXJzaW9uIG9mIHpsaWIgaXMgdXNlZCwgYXMgaXQgdGFrZXMgY2FyZSBvZiBnemlwIGhlYWRlciBwYXJzaW5nCiAgaXRzZWxmLiAgQSBjaGVjayBmb3IgdGhlIHZlcnNpb24gbnVtYmVyIGlzIGRvbmUgYXQgcnVuLXRpbWUgYW5kIGxpYmN1cmwgdXNlcwogIHRoYXQgZmVhdHVyZSBpZiBpdCdzIHByZXNlbnQuIEkndmUgY3JlYXRlZCBhIGRlZmluZSBPTERfWkxJQl9TVVBQT1JUIHRoYXQKICBjYW4gYmUgY29tbWVudGVkIG91dCB0byBzYXZlIHNvbWUgY29kZSBzcGFjZSBpZiBsaWJjdXJsIGlzIGd1YXJhbnRlZWQgdG8gYmUKICB1c2luZyBhIDEuMiB2ZXJzaW9uIG9mIHpsaWIuCgogIFRoZSBzZWNvbmQgcHJvYmxlbSBpcyBzb2x2ZWQgYnkgZHluYW1pY2FsbHkgYWxsb2NhdGluZyB0aGUgbWVtb3J5IGJ1ZmZlcgogIGluc3RlYWQgb2Ygc3RvcmluZyBpdCBvbiB0aGUgc3RhY2suIFRoZSBhbGxvY2F0aW9uL2ZyZWUgaXMgZG9uZSBmb3IgZXZlcnkKICBpbmNvbWluZyBwYWNrZXQsIHdoaWNoIGlzIHN1Ym9wdGltYWwsIGJ1dCBzaG91bGQgYmUgZHdhcmZlZCBieSB0aGUgYWN0dWFsCiAgZGVjb21wcmVzc2lvbiBjb21wdXRhdGlvbi4KCiAgSSd2ZSBhbHNvIGZhY3RvcmVkIG91dCBzb21lIGNvbW1vbiBjb2RlIGJldHdlZW4gZGVmbGF0ZSBhbmQgZ3ppcCB0byByZWR1Y2UKICB0aGUgY29kZSBmb290cHJpbnQgc29tZXdoYXQuICBJJ3ZlIHRlc3RlZCB0aGUgZ3ppcCBjb2RlIG9uIGEgZmV3IHRlc3QgZmlsZXMKICBhbmQgSSB0cmllZCBkZWZsYXRlIHVzaW5nIHRoZSBmcmVzaG1lYXQubmV0IHNlcnZlciwgYW5kIGl0IGFsbCBsb29rcyBPSy4gSQogIGRpZG4ndCB0cnkgcnVubmluZyBpdCB3aXRoIHZhbGdyaW5kLCBob3dldmVyLgoKLSBBZGRlZCBhIC0tcmV0cnkgb3B0aW9uIHRvIGN1cmwgdGhhdCB0YWtlcyBhIG51bWVyaWNhbCBvcHRpb24gZm9yIHRoZSBudW1iZXIKICBvZiB0aW1lcyB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXRyaWVkLiBJdCBpcyByZXRyaWVkIGlmIGEgdHJhbnNpZW50IGVycm9yCiAgaXMgZGV0ZWN0ZWQgb3IgaWYgYSB0aW1lb3V0IG9jY3VycmVkLiBCeSBkZWZhdWx0LCBpdCB3aWxsIGZpcnN0IHdhaXQgb25lCiAgc2Vjb25kIGJldHdlZW4gdGhlIHJldHJpZXMgYW5kIHRoZW4gZG91YmxlIHRoZSBkZWxheSB0aW1lIGJldHdlZW4gZWFjaCByZXRyeQogIHVudGlsIHRoZSBkZWxheSB0aW1lIGlzIHRlbiBtaW51dGVzIHdoaWNoIHRoZW4gd2lsbCBiZSB0aGUgZGVsYXkgdGltZQogIGJldHdlZW4gYWxsIGZvcnRoY29taW5nIHJldHJpZXMuIFlvdSBjYW4gc2V0IGEgc3RhdGljIGRlbGF5IHRpbWUgd2l0aAogICItLXJldHJ5LWRlbGF5IFtudW1dIiB3aGVyZSBbbnVtXSBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuCiAgZWFjaCByZXRyeS4KCkRhbmllbCAoMjUgT2N0b2JlciAyMDA0KQotIFRvbWFzIFBvc3Bpc2VrIGZpbGVkIGJ1ZyByZXBvcnQgIzEwNTMyODcgdGhhdCBwcm92ZWQgLUMgLSBhbmQgLS1mYWlsIG9uIGEKICBmaWxlIHRoYXQgd2FzIGFscmVhZHkgY29tcGxldGVseSBkb3dubG9hZGVkIGNhdXNlZCBhbiBlcnJvciwgd2hpbGUgaXQKICBkb2Vzbid0IGlmIHlvdSBkb24ndCB1c2UgLS1mYWlsISBJIGFkZGVkIHRlc3QgY2FzZSAxOTQgdG8gdmVyaWZ5IHRoZSBmaXguCiAgR3Jyci4gQ1VSTE9QVF9GQUlMT05FUlJPUiBpcyBub3cgYWRkZWQgdG8gdGhlIGxpc3Qgc3R1ZmYgdG8gcmVtb3ZlIGluCiAgbGliY3VybCB2OCBkdWUgdG8gYWxsIHRoZSBrbHVkZ2VzIG5lZWRlZCB0byBzdXBwb3J0IGl0LgoKLSBNb2h1biBCaXN3YXMgZm91bmQgb3V0IHRoYXQgZm9ybXBvc3RpbmcgYSB6ZXJvLWJ5dGUgZmlsZSBkaWRuJ3Qgd29yayB2ZXJ5CiAgZ29vZC4gSSBmaXhlZC4KCkRhbmllbCAoMTkgT2N0b2JlciAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgaXQgcG9zc2libGUgdG8gbWFrZSBGVFAgM3JkIHBhcnR5IHRyYW5zZmVycwogIHdpdGggYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJlaW5nIHRoZSBzYW1lIGhvc3QuIEl0IGNhbiBiZSB1c2VmdWwgaWYKICB5b3Ugd2FudCB0byBtb3ZlIGEgZmlsZSBvbiBhIHNlcnZlciBvciBzaW1pbGFyLgoKLSBHdWlsbGF1bWUgQXJsdWlzb24gYWRkZWQgQ1VSTElORk9fTlVNX0NPTk5FQ1RTIHRvIGFsbG93IGFuIGFwcCB0byBmaWd1cmUKICBvdXQgaG93IG1hbnkgbmV3IGNvbm5lY3RzIGEgcHJldmlvdXMgdHJhbnNmZXIgcmVxdWlyZWQuCgogIEkgYWRkZWQgJXtudW1fY29ubmVjdHN9IHRvIHRoZSBjdXJsIHRvb2wgYW5kIGFkZGVkIHRlc3QgY2FzZSAxOTIgYW5kIDE5MwogIHRvIHZlcmlmeSB0aGUgbmV3IGNvZGUuCgpEYW5pZWwgKDE4IE9jdG9iZXIgMjAwNCkKLSBQZXRlciBXdWxsaW5nZXIgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHNob3VsZCBjYWxsIHNldGxvY2FsZSgpIHByb3Blcmx5IHRvCiAgaW5pdGlhdGUgdGhlIHNwZWNpZmljIGxhbmd1YWdlIG9wZXJhdGlvbnMsIHRvIG1ha2UgdGhlIElETiBzdHVmZiB3b3JrCiAgYmV0dGVyLgoKVmVyc2lvbiA3LjEyLjIgKDE4IE9jdG9iZXIgMjAwNCkKCkRhbmllbCAoMTYgT2N0b2JlciAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgdGhlIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgb3B0aW9uIHdvcmsKICBmaW5lIGV2ZW4gZm9yIHRoaXJkIHBhcnR5IHRyYW5zZmVycy4KCi0gcnVuZWtsIGF0IG9wb2ludC5jb20gZm91bmQgb3V0IChhbmQgcHJvdmlkZWQgYSBmaXgpIHRoYXQgbGliY3VybCBsZWFrZWQKICBtZW1vcnkgZm9yIGNvb2tpZXMgd2l0aCB0aGUgIm1heC1hZ2UiIGZpZWxkIHNldC4KCkdpc2xlICgxNiBPY3RvYmVyIDIwMDQpCi0gSXNzdWUgNTAgaW4gVE9ETy1SRUxFQVNFOyBBZGRlZCBUcmFpYW4gTmljb2xlc2N1J3MgcGF0Y2hlcyBmb3IgdGhyZWFkZWQKICByZXNvbHZlciBvbiBXaW5kb3dzLiBQbHVnZ2VkIHNvbWUgcG90ZW50aWFsIGhhbmRsZSBhbmQgbWVtb3J5IGxlYWtzLgoKRGFuaWVsICgxNCBPY3RvYmVyIDIwMDQpCi0gRXJpYyBWZXJnbmF1ZCBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgZGlkbid0IHRyZWF0ID8tbGV0dGVycyBpbiB0aGUgdXNlcgogIG5hbWUgYW5kIHBhc3N3b3JkIGZpZWxkcyBwcm9wZXJseSBpbiBVUkxzLCBsaWtlCiAgZnRwOi8vdXM/ZXI6cGFzcz93b3JkQHNpdGUuY29tLy4gQWRkZWQgdGVzdCAxOTEgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwNCkKLSBsaWJjdXJsIG5vdyB1c2VzIFNPX05PU0lHUElQRSBmb3Igc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQgKE1hYyBPUyBYIDEwLjIgb3IKICBsYXRlciBpcyBvbmUpIHRvIGluaGliaXQgdGhlIFNJR1BJUEUgc2lnbmFsIHdoZW4gd3JpdGluZyB0byBhIHNvY2tldCB3aGlsZQogIHRoZSBwZWVyIGRpZXMuIFRoZSBzYW1lIGVmZmVjdCBpcyBwcm92aWRlIGJ5IHRoZSBNU0dfTk9TSUdOQUwgcGFyYW1ldGVyIHRvCiAgc2VuZCgpIG9uIG90aGVyIHN5c3RlbXMuIEFsYW4gUGluc3RlaW4gdmVyaWZpZWQgdGhlIGZpeC4KCkRhbmllbCAoMTAgT2N0b2JlciAyMDA0KQotIFN5c3RlbXMgd2l0aCA2NGJpdCBsb25ncyBubyBsb25nZXIgdXNlIHN0cnRvbGwoKSBvciBvdXIgc3RydG9sbC0gcmVwbGFjZW1lbnQKICB0byBwYXJzZSA2NCBiaXQgbnVtYmVycy4gc3RydG9sKCkgd29ya3MgZmluZS4gQWRkZWQgYSBjb25maWd1cmUgY2hlY2sgdG8KICBkZXRlY3QgaWYgW2NvbnN0YW50XUxMIHdvcmtzIGFuZCBpZiBzbywgdXNlIHRoYXQgaW4gdGhlIHN0cnRvbGwgcmVwbGFjZW1lbnQKICBjb2RlIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVyIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IEFuZHkgQ2VkaWxuaWsuCgpHaXNsZSAoNiBPY3RvYmVyIDIwMDQpCi0gRm9yIFVTRV9MSUJJRE4gYnVpbGRzOiBBZGRlZCBUb3AtTGV2ZWwtRG9tYWluIChUTEQpIGNoZWNrIG9mIGhvc3QtbmFtZQogIHVzZWQgaW4gZml4X2hvc3RuYW1lKCkuIENoZWNrcyBpZiBjaGFyYWN0ZXJzIGluICdob3N0LT5uYW1lJyAoaW5kaXJlY3RseQogIHZpYSAnYWNlX2hvc3RuYW1lJykgYXJlIGxlZ2FsIGFjY29yZGluZyB0byB0aGUgVExEIHRhYmxlcyBpbiBsaWJpZG4uCgpEYW5pZWwgKDYgT2N0b2JlciAyMDA0KQotIENoaWgtQ2h1bmcgQ2hhbmcgcmVwb3J0ZWQgdGhhdCBpZiB5b3UgdXNlIENVUkxPUFRfUkVTVU1FX0ZST00gYW5kIGVuYWJsZWQKICBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCBsaWJjdXJsIHJlcG9ydGVkIGVycm9yIGlmIGEgcmVkaXJlY3QgaGFwcGVuZWQgZXZlbgogIGlmIHRoZSBuZXcgVVJMIHdvdWxkIHByb3ZpZGUgdGhlIHJlc3VtZWQgZmlsZS4gVGVzdCBjYXNlIDE4OCBhZGRlZCB0byB2ZXJpZnkKICB0aGUgZml4ICh0b2dldGhlciB3aXRoIGV4aXN0aW5nIHRlc3QgOTkpLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgYSBjb25maWd1cmUgZmxhdyBmb3Igc3lzdGVtcyB0aGF0IG5lZWQgYm90aCBuc2wgYW5kIHNvY2tldAogIGxpYnMgdG8gdXNlIGdldGhvc3RieW5hbWUoKS4KCi0gUmVtb3ZlZCB0YWJzIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gbG90cyBvZiBzb3VyY2UgZmlsZXMuCgpEYW5pZWwgKDUgT2N0b2JlciAyMDA0KQotIE1hZGUgY29uZmlndXJlIC0td2l0aC1saWJpZG49UEFUSCB0cnkgdGhlIGdpdmVuIFBBVEggYmVmb3JlIHRoZSBkZWZhdWx0CiAgcGF0aHMgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBvdmVycmlkZS4KCi0gSWYgaWRuYV9zdHJlcnJvcigpIGlzIHByZXNlbnQgaW4gbGliaWRuLCB3ZSBjYW4gdXNlIHRoYXQgaW5zdGVhZCBvZiBvdXIKICBpbnRlcm5hbCByZXBsYWNlbWVudC4gVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgYnkgU2ltb24gaW4gbGliaWRuIDAuNS42IGFuZAogIGlzIGRldGVjdGVkIGJ5IGNvbmZpZ3VyZS4KCi0gSXQgc2VlbXMgYmFzZW5hbWUoKSBvbiBJUklYIGlzIGluIHRoZSBsaWJnZW4gbGlicmFyeSBhbmQgc2luY2Ugd2UgZG9uJ3QgdXNlCiAgdGhhdCwgY29uZmlndXJlIGZpbmRzIGxpYmdlbi5oIGJ1dCBub3QgYmFzZW5hbWUgYW5kIHRoZW4gd2UgZ2V0IGEgY29tcGlsZXIKICBlcnJvciBiZWNhdXNlIG91ciBiYXNlbmFtZSgpIHJlcGxhY2VtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHByb3RvIGluCiAgbGliZ2VuLmguIFN0YXJ0aW5nIG5vdywgd2UgZG9uJ3QgaW5jbHVkZSB0aGUgZmlsZSBpZiBiYXNlbmFtZSB3YXNuJ3QgZm91bmQKICBhcyB3ZWxsLgoKRGFuaWVsICg0IE9jdG9iZXIgMjAwNCkKLSBDaHJpcyBmb3VuZCBhIHJhY2UgY29uZGl0aW9uIHJlc3VsdGluZyBpbiBDVVJMRV9DT1VMRE5UX1JFU09MVkVfSE9TVCBhbmQKICBwb3RlbnRpYWwgY3Jhc2gsIGluIHRoZSB3aW5kb3dzIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXIgY29kZS4KCkRhbmllbCAoMyBPY3RvYmVyIDIwMDQpCi0gUmVwbGFjZWQgdGhlIHVzZSBvZiBpc3NwYWNlKCkgaW4gY29va2llLmMgd2l0aCBvdXIgb3duIHZlcnNpb24gaW5zdGVhZCBzaW5jZQogIHdlIGhhdmUgbW9zdCBkYXRhIGFzICdjaGFyIConIGFuZCB0aGF0IG1ha2VzIHVzIHBhc3MgaW4gbmVnYXRpdmUgdmFsdWVzIGlmCiAgdGhlcmUgaXMgOGJpdCBkYXRhIGluIHRoZSBzdHJpbmcuIENoYW5naW5nIHRvIHVuc2lnbmVkIGNhdXNlcyB0b28gbXVjaAogIHdhcm5pbmdzIG9yIHRvbyBtYW55IHJlcXVpcmVkIHR5cGVjYXN0cyB0byB0aGUgbm9ybWFsIHN0cmluZyBmdW5jdGlvbnMuCiAgSGFyc2hhbCBQcmFkaGFuIGlkZW50aWZpZWQgdGhpcyBwcm9ibGVtLgoKRGFuaWVsICgyIE9jdG9iZXIgMjAwNCkKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmb3VuZCBhIGNhc2Ugd2hlcmUgbGliY3VybCBjb3VsZCByZWFkIGFscmVhZHkgZnJlZWQKICBkYXRhIHdoZW4gQ1VSTE9QVF9WRVJCT1NFIGlzIHVzZWQgYW5kIGEgKHZlcnkpIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4gSXQKICBoYXBwZW5lZCB3aGVuIHRoZSBkbnMgY2FjaGUgZW50cnkgZm9yIHRoZSBjb25uZWN0aW9uIHdhcyBwcnVuZWQgd2hpbGUgdGhlCiAgY29ubmVjdGlvbiB3YXMgc3RpbGwgYWxpdmUgYW5kIHRoZW4gYWdhaW4gcmUtdXNlZC4gV2Ugd29ya2VkIHRvZ2V0aGVyIG9uCiAgdGhpcyBmaXguCgotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGNvZGUgdGhhdCBkaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIHdoZW4gdGhlIChsaWJpZG4KICBiYXNlZCkgSUROIGNvbnZlcnNpb24gZmFpbHMuIFRoaXMgaXMgcmVhbGx5IGR1ZSB0byBhIG1pc3Npbmcgc3VpdGFibGUKICBmdW5jdGlvbiBpbiB0aGUgbGliaWRuIEFQSSB0aGF0IEkgaG9wZSB3ZSBjYW4gcmVtb3ZlIG9uY2UgbGliaWRuIGdldHMgYQogIGZ1bmN0aW9uIGxpa2UgdGhpcy4KCkRhbmllbCAoMSBPY3RvYmVyIDIwMDQpCi0gQWxla3NhbmRhciBNaWxpdm9qZXZpYyByZXBvcnRlZCBhIHByb2JsZW0gaW4gdGhlIFJlZGhhdCBidWd6aWxsYSAoc2VlCiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMzQxMzMpIGFuZCBub3QgdG8KICBhbnlvbmUgaW52b2x2ZWQgaW4gdGhlIGN1cmwgcHJvamVjdCEgVGhpcyBoYXBwZW5zIHdoZW4geW91IHRyeSB0byBjdXJsIGEKICBmaWxlIGZyb20gYSBwcm9mdHBkIHNpdGUgdXNpbmcgU1NMLiBJdCBzZWVtcyBwcm9mdHBkIHNlbmRzIGEgc29tZXdoYXQKICB1bm9ydGhvZG94IHJlc3BvbnNlIGNvZGUgKDIzMiBpbnN0ZWFkIG9mIDIzMCkuIEkgcmVsYXhlZCB0aGUgcmVzcG9uc2UgY29kZQogIGNoZWNrIHRvIGRlYWwgd2l0aCB0aGlzIGFuZCBzaW1pbGFyIGNhc2VzLgoKLSBCYXNlZCBvbiBGZWRvciBLYXJwZWxldml0Y2gncyBmb3JtcG9zdCBwYXRoIGJhc2VuYW1lIHBhdGNoLCBmaWxlIHBhcnRzIGluCiAgZm9ybXBvc3RzIG5vIGxvbmdlciBpbmNsdWRlIHRoZSBwYXRoIHBhcnQuIElmIHlvdSBfcmVhbGx5XyB3YW50IHRoZW0sIHlvdQogIG11c3QgcHJvdmlkZSB5b3VyIHByZWZlcnJlZCBmdWxsIGZpbGUgbmFtZSB3aXRoIENVUkxGT1JNX0ZJTEVOQU1FLgoKICBBZGRlZCBkZXRlY3Rpb24gZm9yIGxpYmdlbi5oIGFuZCBiYXNlbmFtZSgpIHRvIGNvbmZpZ3VyZS4gTXkgY3VzdG9tCiAgYmFzZW5hbWUoKSByZXBsYWNlbWVudCBmdW5jdGlvbiBmb3Igc3lzdGVtcyB3aXRob3V0IGl0LCBtaWdodCBiZSBhIGJpdCB0b28KICBuYWl2ZS4uLgoKICBVcGRhdGVkIDYgdGVzdCBjYXNlcyB0byBtYWtlIHRoZW0gd29yayB3aXRoIHRoZSBzdHJpcHBlZCBwYXRocy4KCkRhbmllbCAoMzAgU2VwdGVtYmVyIDIwMDQpCi0gTGFycnkgQ2FtcGJlbGwgYWRkZWQgQ1VSTElORk9fT1NfRVJSTk8gdG8gY3VybF9lYXN5X2dldGluZm8oKSB0aGF0IGFsbG93cyBhbgogIGFwcCB0byByZXRyaWV2ZSB0aGUgZXJybm8gdmFyaWFibGUgYWZ0ZXIgYSAoY29ubmVjdCkgZmFpbHVyZS4gSXQgd2lsbCBtYWtlCiAgc2Vuc2UgdG8gcHJvdmlkZSB0aGlzIGZvciBtb3JlIGZhaWx1cmVzIGluIGEgbW9yZSBnZW5lcmljIHdheSwgYnV0IGxldCdzCiAgc3RhcnQgbGlrZSB0aGlzLgoKLSBH/G50ZXIgS25hdWYgYW5kIENhc2V5IE8nRG9ubmVsbCB3b3JrZWQgb3V0IGFuIGV4dHJhICNpZiBjb25kaXRpb24gZm9yIHRoZQogIGN1cmwvbXVsdGkuaCBoZWFkZXIgdG8gd29yayBiZXR0ZXIgaW4gd2luc29jay11c2luZyBhcHBzLgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIG1hZGUgYnVpbGRjb25mIHJ1biBiZXR0ZXIgb24gTWFjIE9TIFggYnkKICBwcm9wZXJseSB1c2luZyBnbGlidG9vbGl6ZSBpbnN0ZWFkIG9mIHBsYWluIGxpYnRvb2xpemUuIChUaGlzIGlzIG1hZGUgaWYKICBnbGlidG9vbCB3YXMgZm91bmQgYW5kIHVzZWQgaW5zdGVhZCBvZiBwbGFpbiBsaWJ0b29sLikKCkRhbmllbCAoMjkgU2VwdGVtYmVyIDIwMDQpCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZml4ZWQgY3VybF9lYXN5X3Jlc2V0KCkgc28gdGhhdCBpdCBkb2Vzbid0IG1pc3Rha2luZ2x5CiAgZW5hYmxlIHRoZSBwcm9ncmVzcyBtZXRlci4KCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDQpCi0gIk1la29uaWt1bSIgZm91bmQgb3V0IHRoYXQgaWYgeW91IGJ1aWx0IGN1cmwgd2l0aG91dCBTU0wgc3VwcG9ydCwgYWx0aG91Z2gKICB5b3VyIGN1cnJlbnQgU1NMIGluc3RhbGxhdGlvbiBzdXBwb3J0cyBFbmdpbmUsIHRoZSBjb21waWxlIGZhaWxzLgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwNCkKLSBXaGVuIC0td2l0aC1zc2w9UEFUSCBpcyB1c2VkIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0LCBpdCBubyBsb25nZXIgdXNlcwogIHBrZy1jb25maWcgdG8gZmlndXJlIG91dCBleHRyYSBkZXRhaWxzLiBUaGF0IGlzIG5vdyBvbmx5IGRvbmUgaWYgbm8gUEFUSCBpcwogIGluY2x1ZGVkIG9yIGlmIFNTTCBpcyBjaGVja2VkIGZvciBieSBkZWZhdWx0IHdpdGhvdXQgdGhlIC0td2l0aC1zc2wgb3B0aW9uLgoKRGFuaWVsICgyNSBTZXB0ZW1iZXIgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIgcG9pbnRlZCBvdXQgdGhhdCBDVVJMT1BUX1NTTEVOR0lORSBjb3VsZG4ndCBldmVuIGJlIHNldCB0bwogIE5VTEwgd2hlbiBubyBlbmdpbmUgd2FzIHN1cHBvcnRlZC4gSXQgY2FuIG5vdy4KCkRhbmllbCAoMjIgU2VwdGVtYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHRocmVlIHRlc3QgY2FzZXMgdG8gbm8gbG9uZ2VyIHVzZSAibG9jYWxob3N0IiBidXQgaW5zdGVhZAogIHVzZSAiMTI3LjAuMC4xIiB0byBhdm9pZCByZXF1aXJpbmcgdGhhdCBsb2NhbGhvc3QgcmVzb2x2ZXMgbmljZWx5LgoKLSBKZWFuLUNsYXVkZSBDaGF1dmUgZml4ZWQgYW4gTERBUCBjcmFzaCB3aGVuIG1vcmUgdGhhbiBvbmUgcmVjb3JkIHdhcwogIHJldHJpZXZlZC4KCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDQpCi0gQW5kcmVhcyBSaWVrZSBwb2ludGVkIG91dCB0aGF0IHdoZW4gYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIGEgaG9zdCB3aXRob3V0CiAgYSBzZXJ2aWNlIG9uIHRoZSBzcGVjaWZpZWQgcG9ydCwgY3VybF9lYXN5X3BlcmZvcm0oKSBkaWRuJ3QgcHJvcGVybHkgcHJvdmlkZQogIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIENVUkxPUFRfRVJST1JCVUZGRVIgYnVmZmVyLgoKRGFuaWVsICgxNiBTZXB0ZW1iZXIgMjAwNCkKLSBEYW5pZWwgYXQgdG91Y2h0dW5lcyB1c2VzIHRoZSBGVFArU1NMIHNlcnZlciAiQlNERlRQRC1TU0wgZnJvbQogIGh0dHA6Ly9ic2RmdHBkLXNzbC5zYy5ydS8iIHdoaWNoIGFjY29yZGluZ2x5IGRvZXNuJ3QgcHJvcGVybHkgd29yayB3aXRoIGN1cmwKICB3aGVuICJBVVRIIFNTTCIgaXMgaXNzdWVkIChhbHRob3VnaCB0aGUgc2VydmVyIHJlc3BvbmRzIGZpbmUgYW5kIGV2ZXJ5dGhpbmcpCiAgYnV0IHJlcXVpcmVzIHRoYXQgY3VybCBpc3N1ZXMgIkFVVEggVExTIiBpbnN0ZWFkLiBTZWUKICBodHRwOi8vY3VybC5oYXh4LnNlL2ZlZWRiYWNrL2Rpc3BsYXkuY2dpP2lkPTEwOTUxOTQ0OTM3NjAzJnN1cHBvcnQ9eWVzCgogIEludHJvZHVjaW5nIENVUkxPUFRfRlRQU1NMQVVUSCB0aGF0IGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gc2VsZWN0IHdoaWNoCiAgb2YgdGhlIEFVVEggc3RyaW5ncyB0byBhdHRlbXB0IGZpcnN0LgoKLSBBbm9ueW1vdXMgZmlsZWQgYnVnIHJlcG9ydCAjMTAyOTQ3OCB3aGljaCBpZGVudGlmaWVkIGEgYnVnIHdoZW4geW91IDEpIHVzZWQKICBhIFVSTCB3aXRob3V0IHByb3Blcmx5IHNlcGVyYXRpbmcgdGhlIGhvc3QgbmFtZSBhbmQgdGhlIHBhcmFtZXRlcnMgd2l0aCBhCiAgc2xhc2guIDIpIHRoZSBVUkwgaGFkIHBhcmFtZXRlcnMgdG8gdGhlIHJpZ2h0IG9mIGEgPyB0aGF0IGNvbnRhaW5zIGEgc2xhc2gKICAzKSBjdXJsIHdhcyB0b2xkIHRvIGZvbGxvdyBMb2NhdGlvbjpzIDQpIHRoZSByZXF1ZXN0IGdvdCBhIHJlc3BvbnNlIHRoYXQKICBjb250YWluZWQgYSBMb2NhdGlvbjogdG8gcmVkaXJlY3QgdG8gIi9kaXIiLiBjdXJsIHRoZW4gYXBwZW5kZWQgdGhlIG5ldyBwYXRoCiAgb24gdGhlIHdyb25nIHBvc2l0aW9uIG9mIHRoZSBvcmlnaW5hbCBVUkwuCgogIFRlc3QgY2FzZSAxODcgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGF0IHRoaXMgd2FzIGZpeGVkIHByb3Blcmx5LgoKRGFuaWVsICgxMSBTZXB0ZW1iZXIgMjAwNCkKLSBBZGRlZCBwYXJzZWRhdGUuYyB0aGF0IGNvbnRhaW5zIGEgcmV3cml0ZSBvZiB0aGUgZGF0ZSBwYXJzZXIgY3VycmVudGx5CiAgcHJvdmlkZWQgYnkgZ2V0ZGF0ZS55LiBUaGUgbmV3IG9uZSBpcyBNVUNIIHNtYWxsZXIgYW5kIHdpbGwgYWxsb3cgdXMgdG8gcnVuCiAgYXdheSBmcm9tIHRoZSB5YWNjL2Jpc29uIGp1bmdsZS4gSXQgaXMgYWxzbyBzbGlnaHRseSBsYWNraW5nIGluIGZlYXR1cmVzCiAgY29tcGFyZWQgdG8gdGhlIG9sZCBvbmUsIGJ1dCBpdCBzdXBwb3J0cyBwYXJzaW5nIG9mIGFsbCBkYXRlIGZvcm1hdHMgSFRUUAogIGludm9sdmVzIChhbmQgYSBmYWlyIGJ1bmNoIG9mIG90aGVycykuCgpEYW5pZWwgKDEwIFNlcHRlbWJlciAyMDA0KQotIEFzIGZvdW5kIG91dCBieSBKb25hcyBGb3JzbWFuLCBjdXJsIGRpZG4ndCBhbGxvdyAtRiB0byBzZXQgQ29udGVudC1UeXBlIG9uCiAgdGV4dC1wYXJ0cy4gU3RhcnRpbmcgbm93LCB3ZSBjYW4gZG8gLUYgIm5hbWU9ZGFuaWVsO3R5cGU9dGV4dC9leHRyYSIuIEFkZGVkCiAgdGVzdCBjYXNlIDE4NiB0byB2ZXJpZnkuCgotIEJ1ZyByZXBvcnQgIzEwMjU5ODYuIFdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246IHdpdGggYSBjdXN0b20gSG9zdDogaGVhZGVyCiAgcmVwbGFjZW1lbnQsIGN1cmwgb25seSByZXBsYWNlZCB0aGUgSG9zdDogaGVhZGVyIG9uIHRoZSBpbml0aWFsIHJlcXVlc3QKICBhbmQgZGlkbid0IHJlcGxhY2UgaXQgb24gdGhlIGZvbGxvd2luZyBvbmVzLiBUaGlzIHJlc3VsdGVkIGluIHJlcXVlc3RzIHdpdGgKICB0d28gSG9zdDogaGVhZGVycy4KCiAgTm93LCBjdXJsIGNoZWNrcyBpZiB0aGUgbG9jYXRpb24gaXMgb24gdGhlIHNhbWUgaG9zdCBhcyB0aGUgaW5pdGlhbCByZXF1ZXN0CiAgYW5kIHRoZW4gY29udGludWVzIHRvIHJlcGxhY2UgdGhlIEhvc3Q6IGhlYWRlci4gQW5kIHdoZW4gaXQgbW92ZXMgdG8gYW5vdGhlcgogIGhvc3QsIGl0IGRvZXNuJ3QgcmVwbGFjZSB0aGUgSG9zdDogaGVhZGVyIGJ1dCBpdCBhbHNvIGRvZXNuJ3QgbWFrZSB0aGUKICBzZWNvbmQgSG9zdDogaGVhZGVyIGdldCB1c2VkIGluIHRoZSByZXF1ZXN0LgoKICBUaGlzIGNoYW5nZSBpcyB2ZXJpZmllZCBieSB0aGUgdHdvIG5ldyB0ZXN0IGNhc2VzIDE4NCBhbmQgMTg1LgoKRGFuaWVsICg4IFNlcHRlbWJlciAyMDA0KQotIE1vZGlmaWVkIHRoZSB0ZXN0IHN1aXRlIHRvIGJlIGFibGUgdG8gdXNlIGFuZCBydW4gd2l0aCBjdXN0b21pemVkIHBvcnQKICBudW1iZXJzLiBUaGlzIHdhcyBhbHdheXMgaW50ZW5kZWQgYnV0IG5ldmVyIGJlZm9yZSBwb3NzaWJsZS4gTm93IGEgc2ltcGxlCiAgY2hhbmdlIGluIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgY2FuIG1ha2UgYWxsIHRlc3RzIHVzZSBkaWZmZXJlbnQgcG9ydHMuCiAgVGhlIGRlZmF1bHQgcG9ydHMgaW4gdXNlIGZyb20gbm93IG9uIGFyZSA4OTkwIHRvIDg5OTMuCgpEYW5pZWwgKDIgU2VwdGVtYmVyIDIwMDQpCi0gTWlub3IgbW9kaWZpY2F0aW9uIG9mIGFuIFNTTC1yZWxhdGVkIGVycm9yIG1lc3NhZ2UuCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDA0KQotIERhdmlkIFRhcmVuZGFzaCBmb3VuZCBvdXQgdGhhdCBjdXJsX211bHRpX2FkZF9oYW5kbGUoKSByZXR1cm5lZAogIENVUkxNX0NBTExfTVVMVElfUEVSRk9STSBpbnN0ZWFkIG9mIENVUkxNX09LLgoKRGFuaWVsICgzMCBBdWd1c3QgMjAwNCkKLSBNYWtlICJQcm94eS1Db25uZWN0aW9uOiBjbG9zZSIgY2xvc2UgdGhlIGN1cnJlbnQgcHJveHkgY29ubmVjdGlvbiwgYXMgUm9tYW4KICBLb2lmbWFuIGZvdW5kIG91dC4KCkRhbmllbCAoMjQgQXVndXN0IDIwMDQpCi0gRml4ZWQgYSBnZXRkYXRlIHByb2JsZW0gYnkgcG9zdC1yZXBsYWNpbmcgdGhlIGdldGRhdGUuYyBmaWxlIGFmdGVyIHRoZQogIGJpc29uL3lhY2MgcHJvY2VzcyB0byBhZGQgdGhlIGZpeCBIYXJzaGFsIFByYWRoYW4gc3VnZ2VzdGVkLiBUaGUgcHJvYmxlbQogIGNhdXNlZCBhIGNyYXNoIG9uIFdpbmRvd3Mgd2hlbiBwYXJzaW5nIHNvbWUgZGF0ZXMuCgpEYW5pZWwgKDIzIEF1Z3VzdCAyMDA0KQotIFJvbWFuIEtvaWZtYW4gcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIHNlbmQgRXhwZWN0OiAxMDAtY29udGludWUgb24gUE9TVHMKICBldmVuIHdoZW4gdG9sZCB0byB1c2UgSFRUUCAxLjAsIHdoaWNoIGlzIG5vdCBjb3JyZWN0LiBUZXN0IGNhc2UgMTgwIGFuZAogIDE4MSB2ZXJpZnkgdGhpcy4KCi0gQWRkZWQgdGVzdCBjYXNlIDE4MiB0byB2ZXJpZnkgdGhhdCB6ZXJvIGJ5dGUgdHJhbnNmZXJzIGNhbGwgdGhlIGNhbGxiYWNrCiAgcHJvcGVybHkuCgpEYW5pZWwgKDIwIEF1Z3VzdCAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgdGhlIHdyaXRlIGNhbGxiYWNrIGdldCBjYWxsZWQgZXZlbiB3aGVuIGEgemVybwogIGJ5dGUgZmlsZSBpcyBkb3dubG9hZGVkLgoKRGFuaWVsICgxOCBBdWd1c3QgMjAwNCkKLSBMaW5nIFRoaW8gcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGxpYmN1cmwgaXMgYnVpbHQgaXB2Ni1lbmFibGVkLCBpdCBzdGlsbCBkaWQKICByZXZlcnNlIEROUyBsb29rdXBzIHdoZW4gZmVkIHdpdGggYSBudW1lcmljYWwgSVAtYWRkcmVzcyAobGlrZQogIGh0dHA6Ly8xMjcuMC4wLjEvKSwgYWx0aG91Z2ggaXQgZG9lc24ndCB3aGVuIGJ1aWx0IGlwdjYtZGlzYWJsZWQuIGxpYmN1cmwKICBzaG91bGQgbmV2ZXIgZG8gcmV2ZXJzZSBsb29rdXBzLgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwNCkKLSBLamV0aWwgSmFjb2JzZW4gbm90aWNlZCB0aGF0IHdoZW4gdHJhbnNmZXJyaW5nIGEgZmlsZTovLyBVUkwgcG9pbnRpbmcgdG8gYW4KICBlbXB0eSBmaWxlLCBsaWJjdXJsIHdvdWxkIHJldHVybiB3aXRoIHRoZSBmaWxlIHN0aWxsIG9wZW4uCgotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IHBvaW50ZWQgb3V0IHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbmVlZHMgdG8gZGVmaW5lCiAgX1RIUkVBRF9TQUZFIGZvciBBSVggc3lzdGVtcyB0byBtYWtlIGxpYmN1cmwgYnVpbHQgcmVhbGx5IHRocmVhZC1zYWZlLgoKICBBbHNvIGFkZGVkIGEgY2hlY2sgZm9yIHRoZSB4bGMgY29tcGlsZXIgb24gQUlYLCBhbmQgaWYgdGhhdCBpcyBkZXRlY3Qgd2UgdXNlCiAgdGhlIC1xdGhyZWFkZWQgY29tcGlsZXIgb3B0aW9uCgpEYW5pZWwgKDE2IEF1Z3VzdCAyMDA0KQotIGxpYmN1cmwgbm93IGFsbG93cyBhIGN1c3RvbSAiQWNjZXB0LUVuY29kaW5nOiIgaGVhZGVyIG92ZXJyaWRlIHRoZQogIGludGVybmFsbHkgc2V0IG9uZSB0aGF0IGdldHMgc2V0IHdpdGggQ1VSTE9QVF9FTkNPRElORy4gUG9pbnRlZCBvdXQgYnkgQWxleC4KCi0gUm9sYW5kIEtyaWthdmEgZm91bmQgYW5kIGZpeGVkIGEgY29va2llIHByb2JsZW0gd2hlbiB1c2luZyBhIHByb3h5ICh0aGUKICBwYXRoIG1hdGNoaW5nIHdhcyB3cm9uZykuIEkgYWRkZWQgdGVzdCBjYXNlIDE3OSB0byB2ZXJpZnkgdGhhdCB3ZSBub3cgZG8KICByaWdodC4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDQpCi0gQ2FzZXkgTydEb25uZWxsIGZpeGVkIHNvbWUgTVNWQyBtYWtlZmlsZSB0YXJnZXRzIHRvIGxpbmsgcHJvcGVybHkuCgpEYW5pZWwgKDExIEF1Z3VzdCAyMDA0KQotIGNvbmZpZ3VyZSBub3cgZGVmaW5lcyBfWE9QRU5fU09VUkNFIHRvIDUwMCBvbiBzeXN0ZW1zIHRoYXQgbmVlZCBpdCB0byBidWlsZAogIHdhcm5pbmctZnJlZSAodGhlIG9ubHkga25vd24gb25lIHNvIGZhciBpcyBub24tZ2NjIGJ1aWxkcyBvbiA2NGJpdCBTR0kKICBJUklYKS4gKFJldmVydGVkIHRoaXMgY2hhbmdlIGxhdGVyIGFzIGl0IGNhdXNlZCBjb21waWxlciBlcnJvcnMuKQoKLSB0aGUgRlRQIGNvZGUgbm93IGluY2x1ZGVzIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgaW4gdGhlIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGUKICBzZXJ2ZXIgZ2l2ZXMgYmFjayBhIDUzMCBhZnRlciB0aGUgcGFzc3dvcmQgaXMgcHJvdmlkZWQsIGFzIGl0IGlzbid0CiAgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgYSBiYWQgdXNlciBuYW1lIG9yIHBhc3N3b3JkLgoKVmVyc2lvbiA3LjEyLjEgKDEwIEF1Z3VzdCAyMDA0KQoKRGFuaWVsICgxMCBBdWd1c3QgMjAwNCkKLSBJbiBPcGVuU1NMIDAuOS43ZCBhbmQgZWFybGllciwgQVNOMV9TVFJJTkdfdG9fVVRGOCBmYWlscyBpZiB0aGUgaW5wdXQgaXMKICBhbHJlYWR5IFVURi04IGVuY29kZWQuIFRoaXMgbWFkZSB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGZhaWwgaWYgdGhlCiAgcmVtb3RlIHNlcnZlciB1c2VkIGEgY2VydGlmaWNhdGUgd2l0aCB0aGUgbmFtZSBVVEYtOCBlbmNvZGVkLgoKICBXb3JrLWFyb3VuZCBicm91Z2h0IGJ5IEFsZXhpcyBTLiBMLiBDYXJ2YWxoby4KCkRhbmllbCAoOSBBdWd1c3QgMjAwNCkKLSBJIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBrcmI0IHRvIHVzZSAtbGNvbV9lcnIgYXMgd2VsbCwgYXMgSSBzdGFydGVkCiAgdG8gZ2V0IGxpbmsgcHJvYmxlbXMgd2l0aCBpdCB1bmxlc3MgSSBkaWQgdGhhdCBvbiBteSBTb2xhcmlzIDIuNyBib3guIEkKICBkb24ndCB1bmRlcnN0YW5kIHdoeSBJIHN0YXJ0ZWQgdG8gZ2V0IHByb2JsZW1zIHdpdGggdGhpcyBub3chCgpEYW5pZWwgKDUgQXVndXN0IDIwMDQpCi0gRW5yaWNvIFNjaG9seiBmaXhlZCB0aGUgSFRUUC1OZWdvdGlhdGUgc2VydmljZSBuYW1lIHRvIGJlIHVwcGVyY2FzZSBhcwogIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzEwMDQxMDUKCkRhbmllbCAoNCBBdWd1c3QgMjAwNCkKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBhIGZpeCBmb3IgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgY29ubmVjdGluZyB0byBhIGhvc3QKICB1c2luZyBtdWx0aXBsZSBJUCAoYmFkKSBhZGRyZXNzZXMuCgotIER5bGFuIFNhbGlzYnVyeSBtYWRlIGxpYmN1cmwgbm8gbG9uZ2VyIGFjY2VwdCBjb29raWVzIHNldCB0byBhIFRMRCBvbmx5IChpdAogIHByZXZpb3VzbHkgYWxsb3dlZCB0aGF0IG9uIHRoZSBzZXZlbiB0aHJlZS1sZXR0ZXIgZG9tYWlucykuCgpEYW5pZWwgKDMxIEp1bHkgMjAwNCkKLSBKb2VsIENoZW4gcmVwb3J0ZWQgdGhhdCB0aGUgZGlnZXN0IGNvZGUgYXNzdW1lZCBxdW90ZXMgYXJvdW5kIHRoZSBjb250ZW50cyBhCiAgYml0IHRvbyBtdWNoLgoKRGFuaWVsICgyOCBKdWx5IDIwMDQpCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZml4ZWQgdGhlIGhvc3QgbmFtZSB0byBnZXQgc2V0dXAgcHJvcGVybHkgZXZlbiB3aGVuIGEKICBjb25uZWN0aW9uIGlzIHJlLXVzZWQsIHdoZW4gYSBwcm94eSBpcyBpbiB1c2UuIFByZXZpb3VzbHkgdGhlIHdyb25nIEhvc3Q6CiAgaGVhZGVyIGNvdWxkIGdldCBzZW50IHdoZW4gcmUtdXNpbmcgYSBwcm94eSBjb25uZWN0aW9uIHRvIGEgZGlmZmVyZW50IHRhcmdldAogIGhvc3QuCgotIEZpeGVkIEJyaWFuIEFraW5zJyByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIGR1cGxpY2F0ZSBIb3N0OiBoZWFkZXJzIG9uIHJlLXVzZWQKICBjb25uZWN0aW9ucy4gSWYgeW91IGF0dGVtcHRlZCB0byByZXBsYWNlIHRoZSBIb3N0OiBoZWFkZXIgaW4gdGhlIHNlY29uZAogIHJlcXVlc3QsIHlvdSBnb3QgdHdvIHN1Y2ggaGVhZGVycyEKCi0gc3JjL01ha2VmaWxlLmFtIG5vdyBpbmNsdWRlcyB0aGUgTWFrZWZpbGUuaW5jIGZpbGUgdG8gZ2V0IGluZm8gYWJvdXQgZmlsZXMKCkRhbmllbCAoMjYgSnVseSAyMDA0KQotIE1hZGUgImN1cmwgW1VSTF0gLW8gbmFtZSMyIiB3b3JrIGFzIGV4cGVjdGVkLiBJZiB0aGVyZSdzIG5vIGdsb2JiaW5nIGZvciB0aGUKICAjLW51bWJlciwgaXQgd2lsbCBzaW1wbHkgYmUgdXNlZCBhcyAjMiBpbiB0aGUgZmlsZSBuYW1lLgoKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmaXhlZCB0ZXN0aW5nIHdpdGggdmFsZ3JpbmQgMi4xLnggYW5kIGFkZGVkIHR3byBtaXNzaW5nCiAgbmV3bGluZXMgaW4gdGhlIGNvb2tpZSBpbmZvcm1hdGlvbmFscy4KCkRhbmllbCAoMjQgSnVseSAyMDA0KQotIEkgZml4ZWQgdGhlIGF1dG9idWlsZHMgd2l0aCBhcmVzLCBzaW5jZSB0aGV5IG5vdyBuZWVkIHRvIGhhdmUgYnVpbGRjb25mIHJ1bgogIGluIHRoZSBhcmVzIGRpciBiZWZvcmUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaXMgcnVuLgoKLSBBZGRlZCBDYXNleSBPJ0Rvbm5lbGwncyBjdXJsX2Vhc3lfcmVzZXQoKSBmdW5jdGlvbi4gSXQgaGFzIGEgcHJvdG8gaW4KICBjdXJsL2N1cmwuaCBidXQgd2UgaGF2ZSBubyBtYW4gcGFnZSB5ZXQuCgpEYW5pZWwgKDIwIEp1bHkgMjAwNCkKLSBBZGRlZCBidWlsZGNvbmYgYW5kIGJ1aWxkY29uZi5iYXQgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZXMsIHNpbmNlIHRoZXkgYXJlCiAgaGFuZHkgZm9yIHJlYnVpbGRpbmcgY3VybCB3aGVuIHVzaW5nIGEgZGFpbHkgc25hcHNob3QgKGFuZCBub3QgYSBwdXJlIENWUwogIGNoZWNrb3V0KS4KCkRhbmllbCAoMTYgSnVseSAyMDA0KQotIEFzIHN1Z2dlc3RlZCBieSBUb2J5IFBldGVyc29uLCBsaWJjdXJsIG5vdyBpZ25vcmVzIENvbnRlbnQtTGVuZ3RoIGRhdGEgaWYgdGhlCiAgZ2l2ZW4gc2l6ZSBpcyBhIG5lZ2F0aXZlIG51bWJlci4gVGVzdCBjYXNlIDE3OCB2ZXJpZmllcyB0aGlzLgoKRGFuaWVsICgxNCBKdWx5IDIwMDQpCi0gR/xudGVyIEtuYXVmIGhhcyBtYWRlIHRoZSBOZXR3YXJlIGJ1aWxkcyBkbyB3aXRob3V0IHRoZSBjb25maWctbmV0d2FyZS5oCiAgZmlsZXMsIHNvIHRoZXkgYXJlIG5vdyByZW1vdmVkIGZyb20gdGhlIGRpc3QgcGFja2FnZXMuCgotIEf8bnRlciBLbmF1ZiBtYWRlIGN1cmwgYW5kIGxpYmN1cmwgYnVpbGQgd2l0aCBCb3JsYW5kIGFnYWluLgoKLSBBbmRyZXMgR2FyY2lhIGZpeGVkIHRoZSBjb21tb24gdGVzdCA1MDUgZmFpbHVyZXMgb24gd2luZG93cy4KCkRhbmllbCAoNiBKdWx5IDIwMDQpCi0gQW5kculzIEdhcmPtYSBmb3VuZCBvdXQgd2h5IHRoZSB3aW5kb3dzIHRlc3RzIGZhaWxlZCBvbiBmaWxlOi8vICJ1cGxvYWRzIi4KCkRhbmllbCAoMiBKdWx5IDIwMDQpCi0gQW5kculzIEdhcmPtYSByZXBvcnRlZCBhIGN1cmxfc2hhcmVfY2xlYW51cCgpIGNyYXNoIHRoYXQgb2NjdXJzIHdoZW4gbm8KICBsb2NrL3VubG9jayBjYWxsYmFja3MgaGF2ZSBiZWVuIHNldCBhbmQgdGhlIHNoYXJlIGlzIGNsZWFuZWQgdXAuCgpEYW5pZWwgKDEgSnVseSAyMDA0KQotIFdoZW4gdXNpbmcgY3VybCAtLXRyYWNlIG9yIC0tdHJhY2UtYXNjaWksIG5vIHRyYWNlIG1lc3NhZ2VzIHRoYXQgd2VyZSBzZW50CiAgYnkgY3VybF9lYXN5X2NsZWFudXAoKSB3ZXJlIGluY2x1ZGVkIGluIHRoZSB0cmFjZSBmaWxlLiBUaGlzIG1hZGUgdGhlCiAgbWVzc2FnZSAiQ2xvc2luZyBjb25uZWN0aW9uICMwIiBuZXZlciBhcHBlYXIgaW4gdHJhY2UgZHVtcHMuCgpEYW5pZWwgKDMwIEp1bmUgMjAwNCkKLSBOaWVscyB2YW4gVG9uZ2VyZW4gZm91bmQgdGhhdCBzZXR0aW5nIENVUkxPUFRfTk9CT0RZIHRvIFRSVUUgZG9lc24ndCBkaXNhYmxlCiAgYSBwcmV2aW91c2x5IHNldCBQT1NUIHJlcXVlc3QsIG1ha2luZyBhIHZlcnkgb2RkIHJlcXVlc3QgZ2V0IHNlbnQgKHVubGVzcwogIHlvdSBkaXNhYmxlZCB0aGUgUE9TVCkgYSBIRUFEIHJlcXVlc3Qgd2l0aCBhIFBPU1QgcmVxdWVzdC1ib2R5LiBJJ3ZlIG5vdwogIG1hZGUgQ1VSTE9QVF9OT0JPRFkgZW5mb3JjZSBhIHByb3BlciBIRUFELiBBZGRlZCB0ZXN0IGNhc2UgNTE0IGZvciB0aGlzLgoKRGFuaWVsICgyOSBKdW5lIDIwMDQpCi0gR/xudGVyIEtuYXVmIG1hZGUgdGhlIHRlc3RjdXJsLnBsIHNjcmlwdCBjYXBhYmxlIG9mIHVzaW5nIGEgY3VzdG9tIHNldHVwCiAgZmlsZSB0byBlYXNpZXIgcnVuIG11bHRpcGxlIGF1dG9idWlsZHMgb24gdGhlIHNhbWUgc291cmNlIHRyZWUuCgotIEdpc2xlIGZpeGVkIHRoZSBkamdwcCBidWlsZCBhbmQgZml4ZWQgYSBtZW1vcnkgcHJvYmxlbSBpbiBzb21lIG9mIHRoZQogIHJlb3JnZWQgbmFtZSByZXNvbHZlZCBjb2RlLgoKLSBGaXhlZCBjb2RlIHRvIGFsbG93IGNvbm5lY3RzIGRvbmUgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSB0byBhdHRlbXB0IHRoZQogIG5leHQgSVAgd2hlbiBjb25uZWN0aW5nIHRvIGEgaG9zdCB0aGF0IHJlc29sdmVzIHRvIG11bHRpcGxlIElQcyBhbmQgYQogIGNvbm5lY3QgYXR0ZW1wdCBmYWlscy4KCkRhbmllbCAoMjcgSnVuZSAyMDA0KQotIEJhc2VkIG9uIFJvYiBTdGFuemVsJ3MgYnVnIHJlcG9ydCAjOTc5NDgwLCBJIHdyb3RlIGEgY29uZmlndXJlIGNoZWNrIHRoYXQKICBjaGVja3MgaWYgcG9sbCgpIGNhbiBiZSB1c2VkIHRvIHdhaXQgb24gTlVMTCBhcyBvdGhlcndpc2Ugc2VsZWN0KCkgc2hvdWxkIGJlCiAgdXNlZCB0byBkbyBpdC4gVGhlIHNlbGVjdCgpIHVzYWdlIHdhcyBhbHNvIGZpeGVkIGFjY29yZGluZyB0byBoaXMgcmVwb3J0LgoKICBNYWMgT1MgWCAxMC4zIHNheXMgInBvbGwoKSBmdW5jdGlvbmFsaXR5IGZvciBNYWMgT1MgWCBpcyBpbXBsZW1lbnRlZCB2aWEgYW4KICBlbXVsYXRpb24gbGF5ZXIgb24gdG9wIG9mIHNlbGVjdCgpLCBub3QgaW4gdGhlIGtlcm5lbCBkaXJlY3RseS4gSXQgaXMKICByZWNvbW1lbmRlZCB0aGF0IHByb2dyYW1zIHJ1bm5pbmcgdW5kZXIgT1MgWCAxMC4zIHByZWZlciBzZWxlY3QoKSBvdmVyCiAgcG9sbCgpLiBDb25maWd1cmUgc2NyaXB0cyBzaG91bGQgbG9vayBmb3IgdGhlIF9QT0xMX0VNVUxfSF8gZGVmaW5lIChpbnN0ZWFkCiAgb2YgX1BPTExfSF8gb3IgX1NZU19QT0xMX0hfKSBhbmQgYXZvaWQgaW1wbGVtZW50YXRpb25zIHdoZXJlIHBvbGwgaXMgbm90CiAgaW1wbGVtZW50ZWQgaW4gdGhlIGtlcm5lbC4iCgogIFllcywgd2UgY2FuIHByb2JhYmx5IHVzZSBzZWxlY3QoKSBvbiBtb3N0IHBsYXRmb3JtcyBidXQgdG9kYXkgSSBwcmVmZXJlZCB0bwogIGxlYXZlIHRoZSBjb2RlIHVuYWx0ZXJlZC4KCkRhbmllbCAoMjQgSnVuZSAyMDA0KQotIFRoZSBzdGFuZGFyZCBjdXJsX3ZlcnNpb24oKSBzdHJpbmcgbm93IG9ubHkgaW5jbHVkZXMgdmVyc2lvbiBpbmZvIGFib3V0CiAgaW52b2x2ZWQgbGlicmFyaWVzIGFuZCBub3QgYWJvdXQgcGFydGljdWxhciBmZWF0dXJlcy4gVGh1cyBpdCB3aWxsIG5vIGxvbmdlcgogIGluY2x1ZGUgaW5mbyBhYm91dCBpcHY2IG5vciBHU1MuIFRoYXQgaW5mbyBpcyBvZiBjb3Vyc2Ugc3RpbGwgYXZhaWxhYmxlIGluCiAgdGhlIGZlYXR1cmUgYml0bWFzayBjdXJsX3ZlcnNpb25faW5mbygpIG9mZmVycy4KCi0gUmVwbGFjZWQgYWxsIG9jY3VyYW5jZXMgb2Ygc3ByaW50ZigpIHdpdGggc25wcmludGYoKS4gVGhpcyBpcyBtb3N0bHkgYmVjYXVzZQogIGl0IGlzICJBIEdvb2QgVGhpbmciIHJhdGhlciB0aGFuIGFjdHVhbGx5IGZpeGluZyBhbnkga25vd24gcHJvYmxlbS4gVGhpcwogIHdpbGwgaGVscCBwcmV2ZW50aW5nIGZ1dHVyZSBwb3NzaWJsZSBtaXN0YWtlcyB0byBjYXVzZSBidWZmZXIgb3ZlcmZsb3dzLgoKLSBNYWpvciByZW9yZ2FuaXphdGlvbiBpbiB0aGUgaG9zdCByZXNvbHZlIGNvZGUgKGFnYWluKS4gVGhpcyB0aW1lLCBJJ3ZlCiAgbW9kaWZpZWQgdGhlIGNvZGUgdG8gbm93IGFsd2F5cyB1c2UgYSBsaW5rZWQgbGlzdCBvZiBDdXJsX2FkZHJpbmZvIHN0cnVjdHMKICB0byByZXR1cm4gcmVzb2x2ZWQgaW5mbyBpbiwgbm8gbWF0dGVyIHdoYXQgcmVzb2x2ZXIgbWV0aG9kIG9yIHN1cHBvcnQgdGhhdAogIGlzIGF2YWlsYWJsZSBvbiB0aGUgcGxhdGZvcm0uIEl0IG1ha2VzIGl0IGEgbG90IGVhc2llciB0byB3cml0ZSBjb2RlIHRoYXQKICB1c2VzIG9yIGRlcGVuZHMgb24gcmVzb2x2ZWQgZGF0YS4KCiAgSW50ZXJuYWxseSwgdGhpcyBtZWFucyBhbW9uZ3N0IG90aGVyIHRoaW5ncyB0aGF0IHdlIGNhbiBzdG9wIGRvaW5nIHRoZSB3ZWlyZAogICJpbmNyZWFzZSBidWZmZXIgc2l6ZSB1bnRpbCBpdCB3b3JrcyIgdHJpY2sgd2hlbiByZXNvbHZpbmcgaG9zdHMgb24KICBpcHY0LW9ubHkgd2l0aCBnZXRob3N0YnluYW1lX3IoKSwgd2Ugc3VwcG9ydCBzb2NrcyBldmVuIG9uIGxpYmN1cmxzIGJ1aWx0CiAgd2l0aCBpcHY2IGVuYWJsZWQgKGJ1dCBvbmx5IHRvIHNvY2tzIHNlcnZlcnMgdGhhdCByZXNvbHZlIHRvIGFuIGlwdjQKICBhZGRyZXNzKSBhbmQgd2Ugbm8gbG9uZ2VyIGRlZXAtY29weSBvciByZWxvY2F0ZSBob3N0ZW50IHN0cnVjdHMgKHdlIGNyZWF0ZQogIEN1cmxfYWRkcmluZm8gY2hhaW5zIGluc3RlYWQpLgoKICBUaGUgbmV3ICJob3N0ZW50IHRvIEN1cmxfYWRkcmluZm8iIGNvbnZlcnRlciBmdW5jdGlvbiBpcyBuYW1lZCBDdXJsX2hlMmFpKCkKICBhbmQgaXMgc2xpZ2h0bHkgbmFpdmUgYW5kIHNpbXBsZSwgeWV0IEkgYmVsaWV2ZSBpdCBpcyBmdW5jdGlvbmFsIGVub3VnaCB0bwogIHdvcmsgZm9yIGxpYmN1cmwuCgpEYW5pZWwgKDIyIEp1bmUgMjAwNCkKLSBEYXZpZCBDb2hlbiBwb2ludGVkIG91dCB0aGF0IFJGQzIxMDkgc2F5cyBjbGllbnRzIHNob3VsZCBhbGxvdyBjb29raWVzIHRvCiAgY29udGFpbiBsZWFzdCA0MDk2IGJ5dGVzIHdoaWxlIGxpYmN1cmwgb25seSBhbGxvd2VkIDIwNDcuIEkgcmFpc2VkIHRoZSBsaW1pdAogIHRvIDQ5OTkgbm93IGFuZCBtYWRlIHRoZSB1c2VkIGJ1ZmZlciBnZXQgbWFsbG9jKCllZCBpbnN0ZWFkIG9mIHNpbXBseQogIGFsbG9jYXRlZCBvbiBzdGFjayBhcyBiZWZvcmUuIEV4dGVuZGVkIHRlc3QgY2FzZSA0NiB0byBpbmNsdWRlIGEgY29va2llIHdpdGgKICB2ZXJ5IGh1Z2UgY29udGVudCB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gR/xudGVyIEtuYXVmIGZpeGVkIGdldGRhdGUueSB0byByZW1vdmUgYSBmZXcgd2FybmluZ3MuIEkgcmVtb3ZlZCB0aGUKICBpZmRlZidlZCB0ZXN0IHdlIG5ldmVyIGV2ZXIgdXNlIGFueXdheS4KCi0gR2lzbGUgVmFuZW0gZml4ZWQgdGhlIGNlcnRpZmljYXRlIHdpbGRjYXJkIGNoZWNrcyB0byBzdXBwb3J0IGEgJyonLWxldHRlcgogIGFueXdoZXJlIGluIHRoZSB3aWxkY2FyZCBzdHJpbmcsIHN1cHBvcnQgbXVsdGlwbGUgJyonLWxldHRlcnMgaW4gdGhlCiAgd2lsZGNhcmQgYW5kIHRvIGFsbG93IHRoZSAnKictbGV0dGVyIHRvIG1hdGNoIGEgc3RyaW5nIHRoYXQgaW5jbHVkZXMgYSBkb3QuCgpEYW5pZWwgKDIxIEp1bmUgMjAwNCkKLSB0ZXN0Y3VybC5zaCBpcyBub3cgcmVtb3ZlZCBjb21wbGV0ZWx5LCB0ZXN0cy90ZXN0Y3VybC5wbCBpcyB0aGUgc2NyaXB0IHRvCiAgdXNlIHdoZW4gYXV0b2J1aWxkaW5nIGN1cmwhCgotIEtqZXRpbCBKYWNvYnNlbiBicm91Z2h0IG15IGF0dGVudGlvbiB0byB0aGUgZmFjdCB0aGF0IHlvdSBjYW5ub3QgcHJvcGVybHkKICBhYm9ydCBhbiB1cGxvYWQgd2l0aCB0aGUgcmVhZGZ1bmN0aW9uIGNhbGxiYWNrLCBzaW5jZSByZXR1cm5pbmcgMCBvciAtMSBvbmx5CiAgc3RvcHMgdGhlIHVwbG9hZCBhbmQgbGliY3VybCB3aWxsIGNvbnRpbnVlIHdhaXRpbmcgZm9yIGRvd25sb2FkZWQgZGF0YSBhbmQKICB0aGUgc2VydmVyIG9mdGVuIHdhaXRzIGZvciB0aGUgcmVzdCBvZiB0aGUgdXBsb2FkIGRhdGEgdG8gYXJyaXZlLgoKICBUaHVzLCBJJ3ZlIG5vdyBhZGRlZCB0aGUgYWJpbGl0eSBmb3IgcmVhZCBjYWxsYmFja3MgdG8gcmV0dXJuCiAgQ1VSTF9SRUFERlVOQ19BQk9SVCB0byBhYm9ydCBhbiB1cGxvYWQgZnJvbSBhIHJlYWQgY2FsbGJhY2suIFRoaXMgd2lsbCBzdG9wCiAgdGhlIHRyYW5zZmVyIGltbWVkaWF0ZWx5IHdpdGggYSBDVVJMRV9BQk9SVEVEX0JZX0NBTExCQUNLIHJldHVybiBjb2RlLgoKICBUZXN0IGNhc2UgNTEzIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhhdCBpdCB3b3Jrcy4gSSBoYWQgdG8gaW1wcm92ZSB0aGUgdGVzdAogIEhUVFAgc2VydmVyIHRvbyB0byBkdW1wIHRoZSByZXF1ZXN0IHRvIGEgZmlsZSBldmVuIHdoZW4gdGhlIGNsaWVudAogIGRpc2Nvbm5lY3RzIHByZW1hdHVyZWx5LgoKRGFuaWVsICgxOSBKdW5lIDIwMDQpCi0gTHVjYSBBbHRlYXMgcHJvdmlkZWQgYSB0ZXN0IGNhc2Ugd2l0aCBhIGZhaWxpbmcgY3VybCBvcGVyYXRpb246IHdoZW4gd2UgUE9TVAogIHRvIGEgc2l0ZSB3aXRoIC0tZGlnZXN0IChvciBzaW1pbGFyKSBzZXQsIGFuZCB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEgMzAyCiAgTG9jYXRpb246IHRvIHRoZSAiYXV0aHByb2JlIiByZXF1ZXN0LCBpdCB3YXMgbm90IHRyZWF0ZWQgY29ycmVjdGx5LiBXZSBzdGlsbAogIHdpbGwgYmVoYXZlIGJhZGx5IGlmIEZPTExPV0xPQ0FUSU9OIGlzIGVuYWJsZWQgZm9yIHRoaXMgY2FzZSwgYnV0IEknbSBub3QKICBpbiB0aGUgbW9vZCB0byBkaXZlIGludG8gdGhpcyByaWdodCBub3cgYW5kIHdpbGwgbGVhdmUgaXQgYXMtaXMgZm9yIG5vdy4KICBWZXJpZmllZCBteSBmaXggd2l0aCB0ZXN0IGNhc2UgMTc3LgoKRGFuaWVsICgxOCBKdW5lIDIwMDQpCi0gR2lzbGUgVmFuZW0ncyBwYXRjaCB0aGF0IHByb3ZpZGVzIG1vcmUgZGV0YWlscyBmcm9tIHRoZSBTU0wgbGF5ZXJzIChpZiB5b3UKICB1c2UgYW4gT3BlblNTTCB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgaXQpLiBJdCBhbHNvIGludHJvZHVjZXMgdHdvIG5ldyB0eXBlcwogIG9mIGRhdGEgdGhhdCBjYW4gYmUgc2VudCB0byB0aGUgZGVidWcgY2FsbGJhY2s6IENVUkxJTkZPX1NTTF9EQVRBX0lOIGFuZAogIENVUkxJTkZPX1NTTF9EQVRBX09VVC4KCi0gV2l0aCBEYXZpZCBCeXJvbidzIHRlc3Qgc2VydmVyIEkgY291bGQgcmVwZWF0IGhpcyBwcm9ibGVtIGFuZCBtYWtlIHN1cmUgdGhhdAogIFBPU1Rpbmcgb3ZlciBIVFRQUzovLyB3aXRoIE5UTE0gd29ya3MgZmluZSBub3cuIFRoZXJlIHdhcyBhIGdlbmVyYWwgcHJvYmxlbQogIHdpdGggbXVsdGktcGFzcyBhdXRoZW50aWNhdGlvbiB3aXRoIG5vbi1HRVQgb3BlcmF0aW9ucyB3aXRoIENPTk5FQ1QuCgpEYW5pZWwgKDE2IEp1bmUgMjAwNCkKLSBNb2RpZmllZCB0byBrZWVwIHRoZSB1cGxvYWQgYnl0ZSBjb3VudGVyIGluIGFuIGN1cmxfb2ZmX3QsIG5vdCBhbiBpbnQgYXMKICBiZWZvcmUuIDMyYml0cyBpcyBub3QgZW5vdWdoLiBUaGlzIGlzIG1vc3QgbGlrZWx5IHRoZSBidWcgSmVhbi1Mb3VpcyBMZW1haXJlCiAgcmVwb3J0ZWQgdGhhdCBtYWtlcyAyR0IgRlRQIHVwbG9hZHMgdG8gcmVwb3J0IGVycm9yICgidW5hbGlnbmVkIGZpbGUgc2l6ZXMiKQogIHdoZW4gY29tcGxldGVkLgoKRGFuaWVsICgxNSBKdW5lIDIwMDQpCi0gTHVjYSBBbHRlYXMgcmVwb3J0ZWQgYSBwcm9ibGVtIHRoYXQgSSBmaXhlZDogaWYgeW91IGRpZCBhIFBPU1Qgd2l0aAogIENVUkxBVVRIX0RJR0VTVCBzZXQgYnV0IHRoZSBzZXJ2ZXIgZGlkbid0IHJlcXVpcmUgYW55IGF1dGhlbnRpY2F0aW9uLAogIGxpYmN1cmwgd291bGQgcmVwZWF0ZWRseSBzZW5kIEhFQUQgbG90cyBvZiB0aW1lcyB1bnRpbCBpdCBnaXZlcyB1cC4gVGhpcyB3YXMKICBhY3R1YWxseSB0aGUgY2FzZSBmb3IgYWxsIG11bHRpLXBhc3MgYXV0aGVudGljYXRpb25zLiBBZGRlZCB0ZXN0IGNhc2UgMTc0LAogIDE3NSBhbmQgMTc2IHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgxNCBKdW5lIDIwMDQpCi0gTXVsdGlwYXJ0IGZvcm1wb3N0cyB1cGxvYWRpbmcgZmlsZXMgbm8gbG9uZ2VyIGluc2VydHMgdGhlIGZpbGVzIHRoZW1zZWx2ZXMKICBpbnRvIHRoZSBodWdlIHByZWJ1aWx0IGNodW5rLiBUaGlzIGVuYWJsZXMgbGliY3VybCB0byBmb3JtcG9zdCBmaWxlcyB0aGF0IGlzCiAgbGFyZ2VyIHRoYW4gdGhlIGFtb3VudCBvZiBzeXN0ZW0gbWVtb3J5LiBXaGVuIHRoZSBmaWxlIGdpdmVuIGlzIHBhc3NlZCBvbgogIHN0ZGluLCBsaWJjdXJsIHN0aWxsIHVzZXMgdGhlIG9sZCBtZXRob2Qgb2YgcmVhZGluZyB0aGUgZnVsbCBmaWxsIGJlZm9yZSB0aGUKICB1cGxvYWQgdGFrZXMgcGxhY2UuIFRoaXMgYXBwcm9hY2ggd2FzIHNlbGVjdGVkIGluIG9yZGVyIHRvIG5vdCBhbHRlciB0aGUKICBiZWhhdmlvciBmb3IgZXhpc3RpbmcgYXBwbGljYXRpb25zLCBhcyB3aGVuIHVzaW5nIHN0ZGluIGxpYmN1cmwgY2FuJ3Qga25vdwogIHRoZSBzaXplIG9mIHRoZSB1cGxvYWQgYW5kIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcgY2FuIG9ubHkgYmUgdXNlZCBvbgogIEhUVFAgMS4xIHNlcnZlcnMuCgpEYW5pZWwgKDEzIEp1bmUgMjAwNCkKLSBHaXNsZSBmb3VuZCBvdXQgdGhhdCB3ZSBkaWQgd2lsZGNhcmQgY2VydCBuYW1lIGNoZWNrcyB3cm9uZywgc28gdGhhdCBwYXJ0cwogIG9mIHRoZSBjaGVjayB3cm9uZ2x5IHdhcyBjYXNlIHNlbnNpdGl2ZS4KCkRhbmllbCAoMTEgSnVuZSAyMDA0KQotIFRpbSBTbmVkZG9uIGJyb3VnaHQgYSBtaW5vciBWTVMgZml4IHRvIG1ha2UgY3VybCBidWlsZCBwcm9wZXJseSBvbiBoaXMgVk1TCiAgbWFjaGluZS4gSGUgYWxzbyBoYWQgc29tZSBpbnRlcmVzdGluZyBsaWJjdXJsIHBhdGNoZXMuLi4gdGhleSBtaWdodCBiZSBhYmxlCiAgdG8gZG8gaW4gYSBzbGlnaHRseSBuaWNlciB3YXkuIERpc2N1c3Npb25zIGFyZSBpbiBwcm9ncmVzcy4KCkRhbmllbCAoMTAgSnVuZSAyMDA0KQotIEdpc2xlIFZhbmVtIGJyb3VnaHQgY29kZSBjbGVhbnVwc20gYmV0dGVyIHZlcmJvc2Ugb3V0cHV0IGFuZCBiZXR0ZXIgY29ubmVjdAogIHRpbWVvdXQgaGFuZGxpbmcgd2hlbiBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gYSBob3N0IHRoYXQgcmVzb2x2ZXMgdG8KICBtdWx0aXBsZSBJUCBhZGRyZXNzZXMuCgotIFN0ZXZlbiBCYXp5bCBhbmQgU2VzaHViYWJ1IFBhc2FtIHBvaW50ZWQgb3V0IGEgYnVnIG9uIHdpbjMyIHdoZW4gZnJlZWluZyB0aGUKICBwYXRoIGFmdGVyIGEgZmlsZTovLyB0cmFuc2Zlci4KCkRhbmllbCAoOSBKdW5lIDIwMDQpCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgbWFkZSAnY29uZmlndXJlIC0tZGlzYWJsZS1odHRwJyB3b3JrIHRvIGJ1aWxkIGxpYmN1cmwKICB3aXRob3V0IEhUVFAgc3VwcG9ydC4gSSBhZGRlZCBhIG5ldyByZXR1cm4gY29kZSBmb3IgY3VybF9mb3JtYWRkKCkgaW4gY2FzZQogIGxpYmN1cmwgaXMgYnVpbHQgd2l0aCBIVFRQIGRpc2FibGU6IENVUkxfRk9STUFERF9ESVNBQkxFRC4KCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgcG9pbnRlZCBvdXQgYSBtaXNzaW5nIGZpbGUgaW4gdGhlIGdlbmVyYXRlZAogIGN1cmxsaWIuZHNwIGZpbGUsIGFuZCBub3cgcGVvcGxlIGJ1aWxkaW5nIHdpdGggdGhpcyBzaG91bGQgZ2V0IGEgbGliY3VybC5saWIKICBmaWxlIGdlbmVyYXRlZCBhcyBpdCB1c2VkIHRvIGRvIGJlZm9yZSB3ZSBnZW5lcmF0ZWQgdGhpcyBmaWxlLgoKRGFuaWVsICg4IEp1bmUgMjAwNCkKLSBNYXJ0eSBLdWhydCBmaXhlZCBhIG1pbm9yIGJ1aWxkIHByb2JsZW0gZm9yIFZNUy4KCkRhbmllbCAoNyBKdW5lIDIwMDQpCi0gUmV2ZXJ0ZWQgdGhlIGNvbmZpZ3VyZSBjaGVjayBmcm9tIHRoZSA0dGggc2luY2UgaXQgb2J2aW91c2x5IGRpZG4ndCB3b3JrLgogIFJlbWFkZSBpdCBpbiBhIGRpZmZlcmVudCBtYW5uZXIgdGhhdCBob3BlZnVsbHkgd29ya3MgYmV0dGVyLgoKRGFuaWVsICg0IEp1bmUgMjAwNCkKLSBH/G50ZXIgS25hdWYgYnJvdWdodCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIE5ldFdhcmUgYWdhaW4uCgotIE1hZGUgdGhlIGNvbmZpZ3VyZSBjaGVja3MgZm9yIHN0cmVycm9yX3IoKSBub3QgZXhpdCB0aGUgY29uZmlndXJlIHNjcmlwdAogIHdoZW4gYnVpbHQgZm9yIGNyb3NzLWNvbXBpbGluZy4KCkRhbmllbCAoMyBKdW5lIDIwMDQpCi0gQ2hyaXMgR2F1a3JvZ2VyIHBvaW50ZWQgb3V0IHRoYXQgJ21ha2UgdGVzdCcgYXR0ZW1wdHMgdG8gcnVuIHRoZSB0ZXN0cyBldmVuCiAgaWYgY3VybCBpcyBidWlsdCBjcm9zcy1jb21waWxlZC4gSSd2ZSBub3cgbWFkZSBpdCBvdXRwdXQgYSBzaG9ydCBtZXNzYWdlCiAgaW5zdGVhZCwgc2F5aW5nIGl0IGlzbid0IHBvc3NpYmxlIHRvIGRvLgoKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBicm91Z2h0IEZUUCAzcmQgcGFydHkgdHJhbnNmZXIgc3VwcG9ydCB0byBsaWJjdXJsLgogIFlvdSBjYW4gbm93IHVzZSBsaWJjdXJsIHRvIHRyYW5zZmVyIGZpbGVzIGJldHdlZW4gdHdvIHJlbW90ZSBob3N0cyB1c2luZwogIEZUUC4gVGhlcmUgYXJlIGEgYnVuY2ggb2YgbmV3IG9wdGlvbnMgdG8gY29udHJvbCB0aGlzIHdpdGg6CiAgIENVUkxPUFRfU09VUkNFX0hPU1QKICAgQ1VSTE9QVF9TT1VSQ0VfVVNFUlBXRAogICBDVVJMT1BUX1NPVVJDRV9QQVRICiAgIENVUkxPUFRfU09VUkNFX1BPUlQKICAgQ1VSTE9QVF9QQVNWX0hPU1QKICAgQ1VSTE9QVF9TT1VSQ0VfUFJFUVVPVEUKICAgQ1VSTE9QVF9TT1VSQ0VfUE9TVFFVT1RFCgogIChUaGV5IHN0aWxsIHJlbWFpbiB0byBiZSBkb2N1bWVudGVkIHByb3Blcmx5IGluIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbgogIHBhZ2UuKQoKICBXaGVuIHVzaW5nIHRoaXMsIHRoZSBvcmRpbmFyeSBDVVJMT1BUX1VSTCBzcGVjaWZpZXMgdGhlIHRhcmdldCBVUkwsIGFuZCB5b3UKICBzcGVjaWZ5IHRoZSBzb3VyY2UgZGF0YSB3aXRoIHRoZXNlIGFkZGl0aW9uYWwgb3B0aW9ucy4gZnRwM3JkcGFydHkuYyBpcyBhCiAgbmV3IGV4YW1wbGUgc291cmNlIGNvZGUgc2hvd2luZyBob3cgdG8gdXNlIHRoaXMuCgotIFZpbmNlbnQgQnJvbm5lciBmaXhlZCB0aGUgSFRUUCBEaWdlc3QgY29kZSB0byB1c2UgdGhlIHByb3h5IHVzZXIgbmFtZSBhbmQKICBwYXNzd29yZCB3aGVuIGRvaW5nIHByb3h5IGF1dGhlbnRpY2F0aW9uLCBpdCBwcmV2aW91c2x5IGFsd2F5cyB1c2VkIHRoZSBob3N0CiAgdXNlciBuYW1lIGFuZCBwYXNzd29yZCEKCkRhbmllbCAoMiBKdW5lIDIwMDQpCi0gQ1VSTE9QVF9VUExPQUQgYW5kIENVUkxPUFRfUFVUIG5vdyBkbyB0aGUgZXhhY3Qgc2FtZSB0aGluZyBpbnRlcm5hbGx5LCB3aGljaAogIGZpeGVzIHNvbWUgb2xkIGNvbmZ1c2lvbnMgb24gd2hlbiB3aGljaCBvZiB0aGVzZSBzaG91bGQgYmUgdXNlZCBhbmQgd2hhdCB0aGUKICBkaWZmZXJlbmNlcyBhcmUuCgotIEFwcGxpZWQgR2lzbGUncyBmaXhlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSB3aXRoIGxjYy13aW4zMgoKVmVyc2lvbiA3LjEyLjAgKDIgSnVuZSAyMDA0KQoKRGFuaWVsICgxIEp1bmUgMjAwNCkKLSBJIGNsYXJpZmllZCB0aGUgLS1jcmVhdGUtZGlycyBvcHRpb24gc29tZXdoYXQgaW4gdGhlIGN1cmwgbWFuIHBhZ2UuCgotIFJlbmF1ZCBEdWhhdXQgY29ycmVjdGVkIHRoZSBjdXJsX3VuZXNjYXBlIG1hbiBwYWdlLgoKLSBEYXZpZCBCeXJvbiBtb2RpZmllZCBvbmUgb2YgTWFzc2ltaWxpYW5vIFppY2NhcmRpJ3MgcmVjZW50IE1TVkMgbWFrZWZpbGUKICBjaGFuZ2VzIHRvIG5vdyBhZ2FpbiB1c2UgdGhlIG1tIGxpYiBieSBkZWZhdWx0LgoKRGFuaWVsICgyNiBNYXkgMjAwNCkKLSBNb2h1biBCaXN3YXMgYWRkZWQgcmVsZWFzZS16bGliIGFuZCBkZWJ1Zy16bGliIHRhcmdldHMgdG8gdGhlIE1TVkMgbGliY3VybAogIE1ha2VmaWxlCgotIERhdmlkIEJ5cm9uIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIHByb3h5IGF1dGhlbnRpY2F0aW9uIHdoZW4gZG9pbmcgQ09OTkVDVCwKICBsaWtlIHdoZW4gYWNjZXNzaW5nIEhUVFBTIHNpdGVzIHdpaHQgYSBwcm94eS4gVGhpcyBwcm9iYWJseSBicm9rZSB3aGVuIEkKICByZXdyb3RlIHRoZSBhdXRoIHN0dWZmIHJlY2VudGx5LgoKLSBJIGFkZGVkIGZpbGV1cGxvYWQuYyBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5LCBzaG93aW5nIGhvdyBhbiB1cGxvYWQgdG8gYQogIGZpbGU6Ly8gVVJMIGlzIG1hZGUuCgpEYW5pZWwgKDI1IE1heSAyMDA0KQotIE1hc3NpbWlsaWFubyBaaWNjYXJkaSB1cGRhdGVkIHRoZSBNU1ZDIG1ha2VmaWxlcy4KCkRhbmllbCAoMjQgTWF5IDIwMDQpCi0gbGliY3VybCBub3cgc3VwcG9ydHMgInVwbG9hZGluZyIgdG8gZmlsZTovLyBVUkxzLiBUZXN0IDIwNCBhbmQgMjA1IHdlcmUKICBhZGRlZCB0byB2ZXJpZnkuCgotIFNpbW9uIEpvc2Vmc3NvbiBhZGRlZCBhIGlkbl9mcmVlKCkgZnVuY3Rpb24gaW4gbGliaWRuIDAuNC41IGFzIGEgcmVhY3Rpb24gdG8KICBHaXNsZSdzIHByZXZpb3VzIG1haWwuIFdlIG5vdyB1c2UgdGhpcyBmdW5jdGlvbiwgYW5kIHRodXMgd2UgcmVxdWlyZSBsaWJpZG4KICAwLjQuNSBvciBsYXRlci4gTm8gZWFybGllciB2ZXJzaW9uIHdpbGwgZG8uCgotIFJvYmVydCBELiBZb3VuZyByZXBvcnRlZCB0aGF0IENVUkxPUFRfQ09PS0lFRklMRSBhbmQgQ1VSTE9QVF9DT09LSUUgY291bGQKICBub3QgYmUgdXNlZCBib3RoIGluIG9uZSByZXF1ZXN0LiBGaXhlZCBpdCBhbmQgYWRkZWQgdGVzdCBjYXNlIDE3MiB0byB2ZXJpZnkuCgpEYW5pZWwgKDIxIE1heSAyMDA0KQotIFdoaWxlIHRhbGtpbmcgdG8gaG9zdCBhLmIuYywgbGliY3VybCBkaWQgd3JvbmdseSBub3QgYWNjZXB0IGNvb2tpZXMgdGhhdAogIHdlcmUgc2V0IHRvIHRoZSBkb21haW4gLmEuYi5jICh0aGF0IGlzIHdpdGggYSBkb3QgcHJlZml4KS4gVGhpcyBpcyBub3cgZml4ZWQKICBhbmQgdGVzdCBjYXNlIDE3MSB2ZXJpZmllcyBpdC4KCkRhbmllbCAoMjAgTWF5IDIwMDQpCi0gSmVzc2UgTm9sbGVyIHJlcG9ydGVkIHRoYXQgdGhlIHVwbG9hZCBzcGVlZCBpbmZvIHJlcG9ydGVkIGJ5IGxpYmN1cmwgd2FzCiAgd3JvbmcuIFRoZSBzYW1lIHdhcyB0cnVlIGZvciB0aGUgZG93bmxvYWQgc3BlZWQuIEZpeGVkIG5vdy4KCkRhbmllbCAoMTkgTWF5IDIwMDQpCi0gRGF2aWQgQnlyb24gYWRkZWQgdGVzdCBjYXNlIDE3MCAtIHRoaXMgdXNlZCB0byBjcmFzaCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZgogIGN1cmwuCgpEYW5pZWwgKDE3IE1heSAyMDA0KQotIFBldGVyIFN5bHZlc3RlcidzIHBhdGNoIHRoYXQgYWRkcmVzc2VzIHR3byBmbGF3cyBpbiB0aGUgcGVlciBjZXJ0aWZpY2F0ZQogIG5hbWUgdmVyaWZpY2F0aW9uOgogIG8gd2hlbiBtdWx0aXBsZSBjb21tb24gbmFtZXMgYXJlIHVzZWQgKGFzIGluIHRoZSBjdXJsIHRlc3RzKSwgdGhlIGxhc3QgbmFtZQogICAgbmVlZHMgdG8gYmUgc2VsZWN0ZWQuCiAgbyBhbGxvdyBjb21wYXJpbmcgd2l0aCBlbmNvZGVkIHZhbHVlcywgYXQgbGVhc3Qgd2l0aCBCTVAgYW5kIElTTyBsYXRpbjEKICAgIGVuY29kZWQgVDYxc3RyaW5ncy4KCi0gQWxsIDE5MSB0ZXN0IGNhc2VzIHJ1biB0aHJvdWdoIHRoZSB0b3J0dXJlIHRlc3QgT0shICdtYWtlIHRlc3QtdG9ydHVyZScgaXMKICBub3cgYXZhaWxhYmxlIGluIHRoZSByb290IG1ha2VmaWxlIChvbiBjb25maWd1cmUtYmFzZWQgZW52aXJvbm1lbnRzKS4KCkRhbmllbCAoMTQgTWF5IDIwMDQpCi0gV2l0aCBhIHNsaWdodGx5IG1vZGlmaWVkIGZ0cHNlcnZlci5wbCBJJ3ZlIG5vdyBydW4gYWxtb3N0IGFsbCB0ZXN0cyB0aHJvdWdoCiAgd2l0aCBydW50ZXN0cy5wbCAtdC4gVGhpcyBpcyBnb29kbmVzcyEKCi0gU2luY2UgSSBoYXZlIGJlZW4gdW5hYmxlIHRvIGNvbnRhY3QgdGhlIENWUyBhZG1pbnMgZm9yIHNldmVyYWwgbW9udGhzLCBJJ3ZlCiAgZGVjaWRlZCB0aGF0IHRoZSBjdXJyZW50IENWUyBob3N0aW5nIHdhcyBub3QgZ29vZCBlbm91Z2guIEkndmUgbm93IG1vdmVkIHRoZQogIENWUyByZXBvIG9uY2UgYWdhaW4sIHNlZSBSRUFETUUgZm9yIHVwZGF0ZWQgY3ZzIGNoZWNrb3V0IGluc3RydWN0aW9ucy4KCkRhbmllbCAoMTMgTWF5IDIwMDQpCi0gcnVudGVzdHMucGwgLXQgbm93IHJ1bnMgZmluZSBhbGwgdGhlIHdheSB0byB0ZXN0IDEwMC4gSSBiZWxpZXZlIHRlc3QgY2FzZQogIDEwMCBmYWlscyBiZWNhdXNlIG9mIGFuIEZUUCBzZXJ2ZXIgcHJvYmxlbS4KCkRhbmllbCAoMTIgTWF5IDIwMDQpCi0gR2VuZXJhbCBjbGVhbnVwcyBhbGwgb3ZlciB0byBtYWtlIGxpYmN1cmwgc3Vydml2ZSBhbmQgZG8gd2VsbCB3aGVuIGEgbWVtb3J5CiAgZnVuY3Rpb24gcmV0dXJucyBOVUxMLiBydW50ZXN0cy5wbCAtdCBub3cgd29ya3MgZmluZSBmb3IgdGhlIGZpcnN0IDI2IHRlc3QKICBjYXNlcy4KCkRhbmllbCAoMTEgTWF5IDIwMDQpCi0gU2VzaHViYWJ1IFBhc2FtIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIGN1cmxfZ2xvYmFsX2luaXRfbWVtKCkgLQogIGxpa2Ugbm9ybWFsIGN1cmxfZ2xvYmFsX2luaXQoKSBidXQgYWxsb3dzIHRoZSBhcHAgdG8gcmVwbGFjZSBhbGwgbWVtb3J5CiAgZnVuY3Rpb25zIHdpdGggaXRzIG93biBzZXQuIEkgbW9kaWZpZWQgaXQgc2xpZ2h0bHkuCgotIEJhc2VkIG9uIEx1Y2EgQWx0ZWFzJyBjb21tZW50cywgSSBtb2RpZmllZCB0aGUgY3VybGxpYi5kc3AgZ2VuZXJhdGlvbiBjb2RlLgoKRGFuaWVsICgxMCBNYXkgMjAwNCkKLSBHaXNsZSBtYWlsZWQgU2ltb24gSm9zZWZzc29uIChvZiBsaWJpZG4gZmFtZSkgYWJvdXQgdGhlIGJlbmVmaXRzIG9mIGEKICBzZXBhcmF0ZSBmcmVlKCktZnVuY3Rpb24gYnkgdGhhdCBsaWIgdG8gbWFrZSBzdXJlIHRoZSBtZW1vcnkgaXMgZnJlZWQgYnkgdGhlCiAgc2FtZSBtZW1vcnkgc3Vic3lzdGVtIHRoYXQgYWxsb2NhdGVkIGl0LiBIZSByZXNwb25kZWQgcG9zaXRpdmVseSBhbmQgdGhpcwogIHdpbGwgbGlrZWx5IGNhdXNlIHVzIHRvIHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIGxpYmlkbiBhcyBzb29uIGFzIFNpbW9uCiAgcmVsZWFzZXMgb25lIHdpdGggc3VjaCBhIGxpYmlkbl9mcmVlKCkgZnVuY3Rpb24uCgotIEphbWVzIEJ1cnNhIG1hZGUgcnVudGVzdHMucGwncyAtdCBvcHRpb24gd29yayBmb3IgYW55IGdpdmVuIHRlc3QgY2FzZSwgYW5kIEkKICBlZGl0ZWQgdG8gYWxsb3cgLWcgdG9vLiBOb3QgZXZlbiB0ZXN0IGNhc2UgMSB3b3JrZWQuLi4KCi0gTHVjYSBBbHRlYSBtYWRlIHRoZSBuYz0gZmllbGQgbm90IHVzZSBxdW90ZXMgaW4gb3V0Z29pbmcgSFRUUCBEaWdlc3QgaGVhZGVycy4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIHRlc3Qgc2NyaXB0IHRoYXQgbWFkZSBpdCBmYWlsIHRvCiAgcmVjb2duaXplIG91ciBvd24gcnVubmluZyBIVFRQIHNlcnZlci4KCkRhbmllbCAoNyBNYXkgMjAwNCkKLSBKYW1lcyBCdXJzYSBmaXhlZCB0aGUgbWVtYW5hbHl6ZS5wbCBzY3JpcHQgdG8gY29uZGVyIG1hbGxvYygwKSBhcmVhcyBPSyB0bwogIGZyZWUoKSBhbmQgaGUgbWFkZSB0d28gZmFpbGVkLXJlc29sdmUgZXJyb3IgbWVzc2FnZXMgdXNlIHRoZSBuZXcgZGlzcGxheS0KICBuYW1lIGluc3RlYWQgb2YgdGhlIGludGVybmFsbHktdXNlZCBuYW1lLgoKLSBHaXNsZSBWYW5lbSB0cmllZCBjdXJsIHdpdGgKICB3d3cuZXRkb21lbmVuYXZua2FubWFrc2ltYWx0aW5uZWhvbGRlc2Vrc3RpdHJlYm9rc3RhdmVyc2xpa3NvbWRldHRlLmNvbQogIHdoaWNoIGNhdXNlZCBwcm9ibGVtcywgYW5kIEkgZml4ZWQgdGhlIHNpbmdsZSB6ZXJvIGJ5dGUgYnVmZmVyIG92ZXJ3cml0ZQogIHRoYXQgb2NjdXJyZWQgKGR1ZSB0byBhIHN0dXBpZCBwcm90b2NvbCBidWZmZXIgc2l6ZSBhbmQgcGFyc2VyKS4KCi0gTWFkZSB0aGUgbGliL2N1cmxsaWIuZHNwIGZpbGUgZ2V0IGdlbmVyYXRlZCBhdXRvbWF0aWNseSB3aGVuIGEgZGlzdHJpYnV0aW9uCiAgcGFja2FnZSBpcyBtYWRlLCB3aXRoIHRoZSBtc3ZjcHJvai4qIGZpbGVzIGFzIHRlbXBsYXRlcyBhbmQgYWxsCiAgd2luMzItc291cmNlcyBhZGRlZC4gSSB0aGluayB0aGlzIGNhbiBiZSBtYWRlIHRvIHdvcmsgYmV0dGVyIHRoYW4gdGhlIGFsd2F5cwogIGxhZ2dpbmctYmVoaW5kIHByZXZpb3VzIGFwcHJvYWNoLiBJJ20gbm90IHN1cmUgdGhpcyBidWlsZHMgYSB3b3JraW5nIHByb2plY3QKICBmaWxlIHJpZ2h0IG5vdyB0aG91Z2ghCgpEYW5pZWwgKDYgTWF5IDIwMDQpCi0gTWljaGFlbCBCZW5lZGljdCBicm91Z2h0IGEgZml4IHRoYXQgZmlsbHMgaW4gdGhlIGVycm9yYnVmZmVyIHByb3Blcmx5IHdoZW4KICBhcmVzIGZhaWxzIHRvIHJlc29sdmUgYSBuYW1lIGZvciBhIGNhc2Ugbm90IHByZXZpb3VzbHkgZGVhbHQgd2l0aCBsaWtlIHRoaXMuCgpEYW5pZWwgKDUgTWF5IDIwMDQpCi0gSm9lIEhhbHBpbiBmaXhlZCB0aGUgYW5ub3lpbmcgdHlwZWNhc3Qgd2FybmluZyBpbiBsaWIvbGRhcC5jCgotIEdpc2xlIFZhbmVtIGZpeGVzOgogIG8gbWVtZGVidWcgdG8gbm90IGFjY2VzcyBOVUxMIG9uIHNldmVyYWwgcGxhY2VzCiAgbyBsaWJjdXJsLmRlZjsgY3VybF9mb3JtcGFyc2UgaXMgZ29uZS4KICBvIHByb2dyZXNzLmM7IGZpeGVkIHRoZSBwZXJjZW50IHZhbHVlcyBiZWluZyB0cnVuY2VkIHRvIDAuCiAgbyBpZjJpcC4qOyBjb25zdGlmaWVkIHRoZSAnaW50ZXJmYWNlJyBhcmd1bWVudC4KCi0gVG9yIEFybnRzZW4gcmVwb3J0ZWQgdGhhdCBtYW55IG9mIGhpcyBhdXRvYnVpbGRzIGZyb3plIGFuZCBJIGZvdW5kIGFuZCBmaXhlZAogIGEgcHJvYmxlbSBpbnRyb2R1Y2VkIHdpdGggdGhlIEhUVFAgYXV0aCBvdmVyaGF1bCB0aGF0IGNvdWxkIGxlYWQgdG8gYQogIG5ldmVyLWVuZGluZyBpbnRlcm5hbCByZXF1ZXN0LWxvb3AgZHVlIHRvIHVuLWluaXRpYWxpemVkIHZhcmlhYmxlcyEKCi0gUmVtb3ZlZCBzZXZlcmFsIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHZhcmlvdXMgY29tcGlsZXJzL3BsYXRmb3Jtcy4KCkRhbmllbCAoNCBNYXkgMjAwNCkKLSBjdXJsX2Zvcm1wYXJzZSgpIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlicmFyeS4gSXQgaGFzIGJlZW4gbWFya2VkIGFuZAogIG1lbnRpb25lZCBhcyBkZXByZWNhdGVkIGZvciBzZXZlcmFsIHllYXJzLgoKRGFuaWVsICgzIE1heSAyMDA0KQotIFJld3JpdHRlbiBIVFRQIGF1dGhlbnRpY2F0aW9uIGNvZGUuIFRoZSBwcmV2aW91cyBjb2RlIGNvdWxkIG5vdCBwcm9wZXJseQogIGRlYWwgd2l0aCB0aGUgYWRkZWQgdGVzdCBjYXNlcyAxNjcsIDE2OCBhbmQgMTY5LiBJJ3ZlIG5vdyByZXdyaXR0ZW4gdGhlIGNvZGUKICB0byBiZXR0ZXIgc2VwYXJhdGUgaG9zdCBhbmQgcHJveHkgYXV0aGVudGljYXRpb24gYW5kIG5vdCByZS11c2UgdGhlIHNhbWUKICB2YXJpYWJsZXMgYXMgbXVjaCBhcyBiZWZvcmUgYXMgaXQgcHJvdmVkIG5vbiB3b3JraW5nIGluIHRoZSBtb3JlIGludm9sdmVkCiAgY2FzZXMuIEFsbCB0aGUgY3VycmVudCB0ZXN0cyBydW4gT0sgbm93LCBhbmQgc28gZG8gdGhlIG5ldyBvbmVzLiBUaGUgY3VybAogIHRvb2wgZ290IGEgbmV3IG9wdGlvbiBuYW1lZCAtLXByb3h5LWRpZ2VzdCB0byBlbmFibGUgSFRUUCBEaWdlc3QKICBhdXRoZW50aWNhdGlvbiB3aXRoIHRoZSBwcm94eS4gSSBhbHNvIG1hZGUgdGhlIGxpYnJhcnkgc3VwcG9ydCBpdC4KCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgTERBUCBjb2RlIHdvcmsgd2l0aCB3bGRhcDMyLmRsbCBhcyBzdXBwbGllZCB3aXRoCiAgV2luLTk4L01FLzIwMDAvWFAsIHNvIG5vIGV4dHJhIC5kbGxzIGFyZSByZXF1aXJlZCB3aGVuIGN1cmwvbGliY3VybCBpcyB1c2VkCiAgb24gdGhlc2UgV2luZG93cyB2ZXJzaW9ucy4KCkRhbmllbCAoMzAgQXByaWwgMjAwNCkKLSBydW50ZXN0cy5wbCBub3cgc2NhbnMgdGhlIHZhbGdyaW5kIGxvZyBmb3IgdmFsZ3JpbmQtZGV0ZWN0ZWQgbWVtb3J5IGxlYWtzCiAgYWZ0ZXIgZWFjaCB0ZXN0IGNhc2UgaWYgdmFsZ3JpbmQgd2FzIGZvdW5kIGFuZCB1c2VkLgoKLSBJIG1vZGlmaWVkIHRoZSBhcHAtY29kZSBpbiBjdXJsIHRvIGluY2x1ZGUgdGhlIG5ldyBsaWIvY3VybHguaCBhbmQgb25seQogIGFjY2VzcyB0aG9zZSBmdW5jdGlvbnMgdXNpbmcgdGhlIGN1cmx4Xy1wcmVmaXggaW4gcHJlcGFyYXRpb24gZm9yIHRoZSBmdXR1cmUKICByZW1vdmFsIG9mIHNldmVyYWwgY3VybF8tZnVuY3Rpb25zIGZyb20gdGhlIHB1YmxpYyBsaWJjdXJsIEFQSS4KCi0gSW50cm9kdWNlZCBsaWIvY3VybHguaCBhcyBhIHNpbmdsZSBoZWFkZXIgdG8gcHJvdmlkZSB0aGUgY3VybHhfLWZ1bmN0aW9ucwogIHRvIGFwcHMuCgotIEFkZGVkIG5vdGljZXMgaW4gdGhlIG1hbiBwYWdlcyBmb3IgY3VybF9nZXRlbnYsIGN1cmxfbXByaW50ZiwgY3VybF9zdHJlcXVhbAogIGFuZCBjdXJsX3N0cm5lcXVhbCB0aGF0IHRoZXkgYXJlIHN1YmplY3QgZm9yIHJlbW92YWwgaW4gYSBmdXR1cmUgcmVsZWFzZS4KICBTVE9QIFVTSU5HIFRIRVNFIEZVTkNUSU9OUy4KCi0gTWloYWkgSW9uZXNjdSBub3RpY2VkIGhlIGNvdWxkbid0IGRvIGZvcm1wb3N0cyB3aXRoIHdoaXRlc3BhY2UgaW4gdGhlIGZpbGUKICBuYW1lcyBhbmQgeWVzLCBJIGJyb2tlIHRoYXQgb24gQXByaWwgMjMuIFNpZ2guIEkgZml4ZWQgaXQgbm93IGFuZCBhZGRlZAogIHRlc3QgY2FzZSAxNjYgdG8gdmVyaWZ5IGl0LgoKLSBMdWNhIEFsdGVhIHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBsZWZ0IGZyb20gdGhlIERpZ2VzdCBwYXRjaCBvZiB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDI5IEFwcmlsIDIwMDQpCi0gTWFkZSBJRE4gZG9tYWlucyB3b3JrIHdoZW4gc2VuZGluZyByZXF1c3RzIG92ZXIgSFRUUCBwcm94eSBhcyB3ZWxsLiBBZGRlZAogIHRlc3QgY2FzZSAxNjUgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgbmV3IGludGVybmFsIGhvc3QgbmFtZSBzZXR1cCB3aGVuIHJlLXVzaW5nIGNvbm5lY3Rpb25zLgoKLSBKYW1lcyBCdXJzYSBmb3VuZCBvdXQgdGhhdCBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgd2l0aCBhcmVzLWJ1aWx0IGxpYmN1cmwKICBjcmVhdGVkIGEgYmFkIGhhbmRsZSB0aGF0IHdvdWxkIGNyYXNoIGluIHRoZSBmaXJzdCBuYW1lIHJlc29sdmUgYXR0ZW1wdC4gVGhpcwogIGlzIG5vdyBmaXhlZCBhbmQgdGVzdCBjYXNlIDUxMiB3YXMgYWRkZWQgdG8gdmVyaWZ5IGl0LgoKLSBMdWNhIEFsdGVhIHByb3ZpZGVkIGEgbWFqb3IgSFRUUCBEaWdlc3QgY29kZSBmaXggYW5kIGNsZWFudXAuIFdlIG5vdyBmb2xsb3cKICB0aGUgRGlnZXN0IFJGQyBhIGxvdCBiZXR0ZXIuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIFNTTCBjb2RlIHVzZSBFUlJfZXJyb3Jfc3RyaW5nX24oKSB3aGVyZSBhcHBsaWNhYmxlLgoKRGFuaWVsICgyNyBBcHJpbCAyMDA0KQotIEkgcmVtb2RlbGVkIEdpc2xlJ3MgSUROIGNvZGUgc2xpZ2h0bHkgYW5kIG5vdyB3ZSBjb252ZXJ0IGJvdGggdGhlIGhvc3QgbmFtZQogIGFuZCBwcm94eSBuYW1lIHRvIHRoZSBBQ0UgZW5jb2RlZCB2ZXJzaW9uIHRvIHVzZSBpbnRlcm5hbGx5IGZvciByZXNvbHZlcyBhbmQKICBjb29raWVzIGV0Yy4gVGhleSBhcmUgbm93IHVzaW5nIG9uZSAnc3RydWN0IGhvc3RuYW1lJyBlYWNoIHRoYXQga2VlcCBib3RoCiAgdGhlIG9yaWdpbmFsIG5hbWUgYW5kIHRoZSBwb3NzaWJseSBlbmNvZGVkIG5hbWUuIElETiByZXNvbHZlcyB3b3JrIGZvciBtZQogIG5vdyB1c2luZyBpcHY2LCBpcHY0IGFuZCBhcmVzIHJlc29sdmluZy4gRXZlbiBjb29raWVzIG9uIElETiBzaXRlcyBzZWVtIHRvCiAgZG8gcmlnaHQuIEkgZ290IHNvbWUgZmFpbHVyZXMgYXQgZmlyc3Qgd2hlbiBDSEFSU0VUIHdhc24ndCBzZXQgYXQgYWxsIHdoaWNoCiAgY29uZnVzZWQgbGliaWRuIGNvbXBsZXRlbHkgYW5kIGl0IGRlY2lkZWQgYnkgZW5jb2Rpbmcgb2YgY2hvaWNlIHdhcwogICdBTlNJX1gzLjQtMTk2OCcuLi4KCi0gbWFkZSAnY29uZmlndXJlIC0td2l0aG91dC1saWJpZG4nIHdvcmsKCkRhbmllbCAoMjUgQXByaWwgMjAwNCkKLSBGaXhlZCB0aGUgc3JjL2h1Z2VoZWxwLmMgZmlsZSB0byBpbmNsdWRlICJzZXR1cC5oIiBpbnN0ZWFkIG9mICJjb25maWcuaCIgdG8KICBtYWtlIHRoZSBwcm9ibGVtcyB3aXRoIFVTRV9NQU5VQUwgb24gd2luZG93cyBnbyBhd2F5LgoKLSBjb25maWd1cmUgLS13aXRob3V0LXNzbCBjb3VsZCBzdGlsbCB3cm9uZ2x5IGluY2x1ZGUgc29tZSBPcGVuU1NMIGluZm8gaW4gdGhlCiAgTWFrZWZpbGVzIGlmIHBrZy1jb25maWcgaGFkIGluZm8gYWJvdXQgT3BlblNTTC4gQnVnICM5NDE3NjIgcmVwb3J0ZWQgYnkKICBNYXJ0aW4uCgotIFNpbmNlIHdlIGNhbiBub3cgYnVpbGQgYW5kIHVzZSBxdWl0ZSBhIGxhcmdlIHNldCBvZiAzcmQgcGFydHkgbGlicmFyaWVzLCBJCiAgZGVjaWRlZCBJIHdvdWxkIG1ha2UgY29uZmlndXJlIHByb2R1Y2UgYSBzdW1tYXJ5IGF0IHRoZSBlbmQgc2hvd2luZyB3aGF0CiAgbGlicmFyaWVzIGl0IHVzZXMgYW5kIGlmIG5vdCwgd2hhdCBvcHRpb24gdG8gdXNlIHRvIG1ha2UgaXQgdXNlIHRoYXQuIEkgYWxzbwogIGFkZGVkIHNvbWUgb3RoZXIgcmFuZG9tIGluZm8gdGhhdCBpcyBuaWNlIGluIGEgImNvbmZpZ3VyZSBzdW1tYXJ5IiBvdXRwdXQuCgotIEFwcGxpZWQgVG9tbXlUYW0ncyBwYXRjaCB0aGF0IG5vdyBtYWtlIGN1cmwgd29yayB3aXRoIHRlbG5ldCBhbmQgc3RkaW4KICBwcm9wZXJseSBvbiBXaW5kb3dzLgoKLSBUaGUgY2hhbmdlcyBmb3IgdG9kYXkgYmVsb3cgd2VyZSBtYWRlIGJ5IG1lIGFuZCBHaXNsZSBWYW5lbS4KCiAgVGhlIGZpbGUgcHJldmlvdXNseSBrbm93biBhcyBob3N0aXAuYyBoYXMgbm93IHVuZGVyZ29uZSBhIGh1Z2UgY2xlYW51cCBhbmQKICBzcGxpdDoKCiAgaG9zdGlwLmMgZXhwbGFpbmVkCiAgPT09PT09PT09PT09PT09PT09CgogIFRoZSBtYWluIENPTVBJTEUtVElNRSBERUZJTkVTIHRvIGtlZXAgaW4gbWluZCB3aGVuIHJlYWRpbmcgdGhlIGhvc3QqLmMKICBzb3VyY2UgZmlsZSBhcmUgdGhlc2U6CgogIENVUkxSRVNfSVBWNiAtIHRoaXMgaG9zdCBoYXMgZ2V0YWRkcmluZm8oKSBhbmQgZmFtaWx5LCBhbmQgdGh1cyB3ZSB1c2UKICB0aGF0LiBUaGUgaG9zdCBtYXkgbm90IGJlIGFibGUgdG8gcmVzb2x2ZSBJUHY2LCBidXQgd2UgZG9uJ3QgcmVhbGx5IGhhdmUgdG8KICB0YWtlIHRoYXQgaW50byBhY2NvdW50LiBIb3N0cyB0aGF0IGFyZW4ndCBJUHY2LWVuYWJsZWQgaGF2ZSBDVVJMUkVTX0lQVjQKICBkZWZpbmVkLgoKICBDVVJMUkVTX0FSRVMgLSBpcyBkZWZpbmVkIGlmIGxpYmN1cmwgaXMgYnVpbHQgdG8gdXNlIGMtYXJlcyBmb3IgYXN5bmNocm9ub3VzCiAgbmFtZSByZXNvbHZlcy4gSXQgY2Fubm90IGhhdmUgRU5BQkxFX0lQVjYgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lLCBhcwogIGMtYXJlcyBoYXMgbm8gaXB2NiBzdXBwb3J0LiBUaGlzIGNhbiBiZSBXaW5kb3dzIG9yICpuaXguCgogIENVUkxSRVNfVEhSRUFERUQgLSBpcyBkZWZpbmVkIGlmIGxpYmN1cmwgaXMgYnVpbHQgdG8gcnVuIHVuZGVyIChuYXRpdmUpCiAgV2luZG93cywgYW5kIHRoZW4gdGhlIG5hbWUgcmVzb2x2ZSB3aWxsIGJlIGRvbmUgaW4gYSBuZXcgdGhyZWFkLCBhbmQgdGhlCiAgc3VwcG9ydGVkIGFzeW5jaCBBUEkgd2lsbCBiZSB0aGUgc2FtZSBhcyBmb3IgYXJlcy1idWlsZHMuCgogIElmIGFueSBvZiB0aGUgdHdvIHByZXZpb3VzIGFyZSBkZWZpbmVkLCBDVVJMUkVTX0FTWU5DSCBpcyBkZWZpbmVkIHRvby4gSWYKICBsaWJjdXJsIGlzIG5vdCBidWlsdCB0byB1c2UgYW4gYXN5bmNocm9ub3VzIHJlc29sdmVyLCBDVVJMUkVTX1NZTkNIIGlzCiAgZGVmaW5lZC4KCiAgVGhlIGhvc3QqLmMgc291cmNlcyBmaWxlcyBhcmUgc3BsaXQgdXAgbGlrZSB0aGlzOgoKICBob3N0aXAuYyAgIC0gbWV0aG9kLWluZGVwZW5kZW50IHJlc29sdmVyIGZ1bmN0aW9ucyBhbmQgdXRpbGl0eSBmdW5jdGlvbnMKICBob3N0YXN5bi5jIC0gZnVuY3Rpb25zIGZvciBhc3luY2hyb25vdXMgbmFtZSByZXNvbHZlcwogIGhvc3RzeW4uYyAgLSBmdW5jdGlvbnMgZm9yIHN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXMKICBob3N0YXJlcy5jIC0gZnVuY3Rpb25zIGZvciBhcmVzLXVzaW5nIG5hbWUgcmVzb2x2ZXMKICBob3N0dGhyZS5jIC0gZnVuY3Rpb25zIGZvciB0aHJlYWRlZCBuYW1lIHJlc29sdmVzCiAgaG9zdGlwNC5jICAtIGlwdjQtc3BlY2lmaWMgZnVuY3Rpb25zCiAgaG9zdGlwNi5jICAtIGlwdjYtc3BlY2lmaWMgZnVuY3Rpb25zCgogIFRoZSBob3N0aXAuaCBpcyB0aGUgc2luZ2xlIHVuaXRlZCBoZWFkZXIgZmlsZSBmb3IgYWxsIHRoaXMuIEl0IGRlZmluZXMgdGhlCiAgQ1VSTFJFU18qIGRlZmluZXMgYmFzZWQgb24gdGhlIGNvbmZpZyouaCBhbmQgc2V0dXAuaCBkZWZpbmVzLgoKLSBBZGRlZCBmdW5jdGlvbiBoZWFkZXIgY29tbWVudHMgdG8gbWFueSBmdW5jdGlvbnMgaW4gYW4gYXR0ZW1wdCB0byBiZXR0ZXIKICBleHBsYWluIHRoZSBwdXJwb3NlIG9mIHRoZW0gYWxsLgoKLSBjb25maWd1cmUgLS13aXRoLWxpYmlkbiBpcyBub3cgc3VwcG9ydGVkLiBJdCBtYWtlcyB0aGUgY29uZmlndXJlIHNjcmlwdAogIGNoZWNrIGZvciBsaWJpZG4gbGlicyBhbmQgaW5jbHVkZSBmaWxlcyBpbiB0aGUgcHJlZml4IHBhdGggZ2l2ZW4uIElmIHlvdQogIHNheSAtLXdpdGgtbGliaWRuPS91c3IvbG9jYWwsIGl0IHdpbGwgY2hlY2sgZm9yIHRoZSBsaWIgaW4gL3Vzci9sb2NhbC9saWIKICBhbmQgdGhlIGluY2x1ZGVzIGluIC91c3IvbG9jYWwvaW5jbHVkZSBldGMuCgotIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMgYSBzdHJ1Y3QgYWdlZCBDVVJMVkVSU0lPTl9USElSRCBpbmNsdWRpbmcKICBsaWJpZG4gdmVyc2lvbiBpbmZvLiBUaGUgc3RyaW5nIGN1cmxfdmVyc2lvbigpIHJldHVybnMgYWxzbyBpbmNsdWRlcyBsaWJpZG4KICB2ZXJzaW9uIGluZm8sIGlmIGF2YWlsYWJsZS4KClZlcnNpb24gNy4xMS4yICgyNiBBcHJpbCAyMDA0KQoKRGFuaWVsICgyNSBBcHJpbCAyMDA0KQotIEVyd2luIEF1dGhyaWVkIHBvaW50ZWQgb3V0IHRoYXQgY29uZmlndXJlIC0tZGlzYWJsZS1tYW51YWwgZGlkbid0IGRvIHJpZ2h0CiAgaWYgeW91IGFscmVhZHkgaGFkIGEgc3JjL2h1Z2VoZWxwLmMgc291cmNlIGZpbGUgcHJlc2VudCAod2hpY2ggbW9zdCBwZW9wbGUKICBkbyBJIGd1ZXNzKS4gSXQgbm93IHVzZXMgdGhlIFVTRV9NQU5VQUwgZGVmaW5lIHByb3Blcmx5LgoKRGFuaWVsICgyMyBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtIGZvdW5kIGFuZCBmaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4gZG9pbmcgKGZhaWxpbmcpIFdpbmRvd3MKICB0aHJlYWRlZCBuYW1lIHJlc29sdmVzLgoKLSBJIGFsc28gYWRkZWQgdGVzdCBjYXNlIDE2MyBqdXN0IHRvIG1ha2Ugc3VyZSAtRiAidmFyPTxmaWxlIiB3b3JrcyBmaW5lIGFuZAogIGNhbiBwYXNzIG9uIGNoYXJhY3RlcnMgc3VjaCBhcyBuZXdsaW5lcywgY2FycmlhZ2UtcmV0dXJuIGFuZCB0YWJzLgoKLSBXaGVuIHdlIGFkZGVkIHRlc3QgY2FzZSAxNjIgd2l0aG91dCBhZGRpbmcgdGhlIG5lY2Vzc2FyeSByZXF1aXJlbWVudCBmaWVsZAogIGluIHRoZSB0ZXN0IG1ldGEgZGF0YSB3ZSBjb3VsZCBzZWUgdGhhdCBjdXJsIGRpZG4ndCBjb21wbGFpbiBpZiB5b3UgdXNlZAogIC0tcHJveHktbnRsbSBldmVuIGlmIHRoZSB1bmRlcmx5aW5nIGxpYmN1cmwgaXQgdXNlcyBoYXMgbm8gTlRMTSBzdXBwb3J0ISBJCiAgbm93IG1hZGUgaXQgY2hlY2sgdGhpcyBmaXJzdCwgYW5kIGl0IG5vdyBleGlzdHMgd2l0aCBhICJ0aGUgaW5zdGFsbGVkCiAgbGliY3VybCB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIiBtZXNzYWdlIGlmIGl0IGhhcHBlbnMgYWdhaW4uCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDQpCi0gRGF2aWQgQnlyb24gZm91bmQgYW5kIGZpeGVkIGEgc21hbGwgYnVnIHdpdGggdGhlIC0tZmFpbCBhbmQgYXV0aGVudGljYXRpb24KICBzdHVmZiBhZGRlZCBhIGZldyB3ZWVrcyBhZ28uICBUdXJucyBvdXQgdGhhdCBpZiB5b3Ugc3BlY2lmeSAtLXByb3h5LW50bG0gYW5kCiAgY29tbXVuaWNhdGUgd2l0aCBhIHByb3h5IHRoYXQgcmVxdWlyZXMgYmFzaWMgYXV0aGVudGljYXRpb24sIHRoZSBwcm94eQogIHByb3Blcmx5IHJldHVybnMgYSA0MDcsIGJ1dCB0aGUgZmFpbHVyZSBkZXRlY3Rpb24gY29kZSBkb2Vzbid0IHJlYWxpemUgaXQKICBzaG91bGQgZ2l2ZSB1cCwgc28gY3VybCByZXR1cm5zIHdpdGggZXhpdCBjb2RlIDAuIFRlc3QgY2FzZSAxNjIgYWRkZWQgdG8KICB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgotIGFsbG93IG5ld2xpbmVzIGluIHRoZSBjb250ZW50cyB3aGVuIGRvaW5nIC1GICJ2YXI9W2NvbnRlbnRzXSIKICBSb2JlcnQgTWFybG93IHJlcG9ydGVkLgoKLSBJZiBhIHRyYW5zZmVyIGlzIGZvdW5kIG91dCB0byBiZSBvbmx5IHBhcnRpYWwsIGxpYmN1cmwgd2lsbCBub3cgdHJlYXQgdGhhdAogIGFzIGEgcHJvYmxlbSBzZXJpb3VzIGVub3VnaCB0byBza2lwIHRoZSBmaW5hbCBRVUlUIGNvbW1hbmQgYmVmb3JlIGNsb3NpbmcKICB0aGUgY29udHJvbCBjb25uZWN0aW9uLiBUbyBhdm9pZCB0aGUgcmlzayB0aGF0IGl0IHdpbGwgImhhbmciIHdhaXRpbmcgZm9yCiAgdGhlIFFVSVQgcmVzcG9uc2UuIEFkZGVkIHRlc3QgY2FzZSAxNjEgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDIxIEFwcmlsIDIwMDQpCi0gTW9kaWZpZWQgdGhlIGhldXJpc3RpY3MgZm9yIGRlYWxpbmcgd2l0aCB0aGUgdGVzdCAxNjAgc2NlbmFyaW8uIFdoZW4gYQogIGNvbm5lY3Rpb24gaXMgcmUtdXNlZCBhbmQgbm90aGluZyBhdCBhbGwgaXMgcmVjZWl2ZWQgZnJvbSBpdCAoYmVjYXVzZSB0aGUKICBzZXJ2ZXIgY2xvc2VzIHRoZSBjb25uZWN0aW9uKSwgd2Ugd2lsbCBub3cgcmV0cnkgdGhlIHJlcXVlc3Qgb24gYSBmcmVzaCBuZXcKICBjb25uZWN0aW9uLiBUaGUgcHJldmlvdXMgRUNPTk5SRVNFVCBzdHVmZiBmcm9tIEphbnVhcnkgMzAgd2FzIHJlbW92ZWQgYWdhaW4KICBhcyBpdCBkaWRuJ3QgZGV0ZWN0IHRoZSBzaXR1YXRpb24gZ29vZCBlbm91Z2guCgpEYW5pZWwgKDIwIEFwcmlsIDIwMDQpCi0gQWRkZWQgdGVzdCBjYXNlIDE2MCB0byB2ZXJpZnkgdGhhdCBjdXJsIHdvcmtzIGNvcnJlY3RseSB3aGVuIGl0IGdldHMgYQogIGNvbm5lY3Rpb24gcmVzZXQgd2hlbiB0cnlpbmcgdG8gcmUtdXNlIGEgY29ubmVjdGlvbi4gSXQgc2hvdWxkIHRoZW4gc2ltcGx5CiAgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gYW5kIHJlc2VuZCB0aGUgcmVxdWVzdC4KCkRhbmllbCAoMTkgQXByaWwgMjAwNCkKLSBObyBtb3JlIDUxMiBieXRlIGxpbWl0IGZvciBob3N0IG5hbWUgKGluY2x1c2luZyBuYW1lICsgcGFzc3dvcmQpIGluIGxpYmN1cmwuCiAgQW4gYWRkZWQgYm9udXMgaXMgdGhhdCB3ZSB1c2UgbGVzcyBtZW1vcnkgZm9yIHRoZSB0eXBpY2FsIChzaG9ydGVyIFVSTCkKICBjYXNlLgoKLSBDbGVhbmVkIHVwIHRoZSBzb3VyY2VzIHRvIGJldHRlciB1c2UgdGhlIHRlcm1zICdob3N0bmFtZScgYW5kICdwYXRoJwogIGludGVybmFsbHkgd2hlbiByZWZlcnJpbmcgdG8gdGhhdCBkYXRhLiBUaGUgYnVmZmVycyB1c2VkIGZvciBrZWVwIHRoYXQgaW5mbwogIGlzIGNhbGxlZCAnbmFtZWJ1ZmZlcicgYW5kICdwYXRoYnVmZmVyJy4gTXVjaCBlYXNpZXIgdG8gcmVhZCBhbmQgdW5kZXJzdGFuZAogIHRoYW4gdGhlIHByZXZpb3VzIG1lc3MuCgpEYW5pZWwgKDE1IEFwcmlsIDIwMDQpCi0gTW9kaWZpZWQgcnVudGVzdHMucGwgYWdhaW4gdG8gcmVtb3ZlIGFsbCBsb2cgZmlsZXMgaW4gdGhlIGxvZy8gZGlyIGJldHdlZW4KICBlYWNoIHRlc3QsIGFuZCB0aGVuIG1hZGUgLXAgZGlzcGxheSBhbGwgbm9uLXplcm8gYnl0ZSBmaWxlcyBpbiB0aGUgbG9nIGRpci4KICBJdCBzaG91bGQgbWFrZSB0aGF0IGRhdGEgbW9yZSB1c2FibGUgYW5kIGNvbnRhaW4gbGVzcyBydWJiaXNoLgoKLSBmdHBzZXJ2ZXIucGwgbm93IHByb2R1Y2VzIGxvZyBmaWxlcyBtb3JlIHNpbWlsYXIgdG8gaG93IHRoZSBzd3Mgb25lcyBsb29rCiAgYW5kIHRoZXkgbm93IGFsc28gY29udGFpbnMgYSBiaXQgbW9yZSBkZXRhaWxzIHRvIGhlbHAgZGVidWdnaW5nIGZ0cAogIHByb2JsZW1zLgoKLSBSZW1vdmVkIHRoZSBmaXhlZCBtYXhpbXVtIGFtb3VudCBvZiBkaXIgbGV2ZWxzIHRoZSBGVFAgY29kZSBzdXBwb3J0ZWQuCiAgUHJldmlvdXNseSB3ZSBoYWQgYSBmaXhlZCBhcnJheSBmb3IgMTAwIGxldmVscywgbm93IHdlIHNhdmUgc3BhY2UgaW4gZWFjaAogIGhhbmRsZSBieSBhbGxvY2F0aW5nIG9ubHkgZm9yIGEgZmV3IGxldmVsIGJ5IGRlZmF1bHQgYW5kIHRoZW4gZW5sYXJnaW5nIHRoYXQKICBpbiBjYXNlIG9mIG5lZWQgKHdpdGggbm8gbWF4aW11bSBkZXB0aCkuIEFkanVzdGVkIHRlc3QgY2FzZSAxNDIgdG8gdmVyaWZ5CiAgdGhhdCAxNTAgZGlyIGxldmVscyB3b3JrIGZpbmUuICBBbiBhZGRlZCBib251cyBpcyB0aGF0IHdlIHVzZSBsZXNzIG1lbW9yeQogIGZvciB0aGUgdHlwaWNhbCAobm90IHZlcnkgZGVlcCkgY2FzZS4KCkRhbmllbCAoMTQgQXByaWwgMjAwNCkKLSBBc2tpbmcgZm9yIENVUkxfSVBSRVNPTFZFX1Y2IHdoZW4gaXB2NiBhZGRyZXNzZXMgY2FuJ3QgYmUgcmVzb2x2ZWQgd2lsbAogIG5vdyBjYXVzZSB0aGUgcmVzb2x2ZSBmdW5jdGlvbiB0byByZXR1cm4gTlVMTCBpbW1lZGlhdGVseS4gVGhpcyBmbGF3IHdhcwogIHBvaW50ZWQgb3V0IGJ5IEdpc2xlIFZhbmVtLgoKLSBHaXNsZSBWYW5lbSBtYWRlIGN1cmwgLTQvLTYgYWN0dWFsbHkgc2V0IHRoZSBkZXNpcmVkIG9wdGlvbiB0byBsaWJjdXJsLgoKLSBydW50ZXN0cy5wbCBub3cgaGFzIGEgbmV3IG9wdGlvbiAoLXApIHRoYXQgd2lsbCBkaXNwbGF5ICJpbnRlcmVzdGluZyIgbG9nCiAgZmlsZXMgdG8gc3Rkb3V0IGluIGNhc2Ugb2YgYSB0ZXN0IGZhaWx1cmUuIFRoaXMgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGJlCiAgdXNlZCBpbiB0aGUgJ2Z1bGwtdGVzdCcgbWFrZSB0YXJnZXQgdGhhdCBpcyB1c2VkIGJ5IHRoZSBhdXRvYnVpbGQgdGVzdHMsIGFzCiAgd2UgdGhlbiBnZXQgYSBtdWNoIGJldHRlciBjaGFuY2UgdG8gdW5kZXJzdGFuZCAocmVtb3RlKSB0ZXN0IGZhaWx1cmVzIGJhc2VkCiAgb24gYXV0b2J1aWxkIGxvZ3MgYWxvbmUuCgpEYW5pZWwgKDEzIEFwcmlsIDIwMDQpCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgbXVsdGkgaW50ZXJmYWNlIHdvcmsgYWdhaW4gb24gV2luZG93cyBldmVuIHdoZW4gYnVpbHQKICB3aXRob3V0IGFyZXMuIEJlZm9yZSB0aGlzLCBzZWxlY3QoKSB3b3VsZCByZXR1cm4gLTEgZHVyaW5nIHRoZSBuYW1lIHJlc29sdmUKICBwaGFzZSBzaW5jZSBjdXJsX211bHRpX2Zkc2V0KCkgZGlkbid0IHJldHVybiBhbnkgZmRfc2V0IGF0IGFsbCB3aGljaCB3YXNuJ3QKICBhcHByZWNpYXRlZCEKCi0gY3VybF9lYXN5X2R1cGhhbmRsZSgpIG5vdyBkdXBsaWNhdGVzIHRoZSB0Y3Bfbm9kZWxheSBpbmZvIGFzIHdlbGwuCgpEYW5pZWwgKDExIEFwcmlsIDIwMDQpCi0gQXBwbGllZCBEYXZpZCBCeXJvbidzIHBhdGNoIGZvciB0aGUgTVNWQyBsaWJjdXJsIG1ha2VmaWxlIGZvciBidWlsZHMgd2l0aAogIHpsaWIuCgpEYW5pZWwgKDkgQXByaWwgMjAwNCkKLSBEaXJrIE1hbnNrZSBpbXByb3ZlZCB0aGUgdGltZXIgcmVzb2x1dGlvbiBmb3IgQ1VSTElORk9fKl9USU1FLCBpdCBjYW4gbm93CiAgYmUgZG93biB0byB1c2VjIGlmIHRoZSBzeXN0ZW0gc3lwcG9ydHMgaXQuCgpEYW5pZWwgKDcgQXByaWwgMjAwNCkKLSBBIHJlcXVlc3QgdGhhdCBzZW5kcyAiRXhwZWN0OiAxMDAtY29udGludWUiIGFuZCBnZXRzIG5vdGhpbmcgYnV0IGEgc2luZ2xlCiAgMTAwIHJlc3BvbnNlIGJhY2sgd2lsbCBub3cgcmV0dXJuIGEgQ1VSTEVfR09UX05PVEhJTkcuIFRlc3QgMTU4IHZlcmlmaWVzLgoKLSBUaGUgc3RydG9vZmZ0KCkgbWFjcm8gaXMgbm93IG5hbWVkIGN1cmx4X3N0cnRvb2ZmdCgpIHRvIHVzZSB0aGUgY3VybHhfKgogIGFwcHJvYWNoIGZ1bGx5LgoKRGFuaWVsICg2IEFwcmlsIDIwMDQpCi0gR2lzbGUgVmFuZW0ncyBmaXhlZCBidWcgIzkyNzk3OSByZXBvcnRlZCBieSBOYXRoYW4gTydTdWxsaXZhbi4gVGhlIHByb2JsZW0KICBtYWRlIGxpYmN1cmwgb24gV2luZG93cyBsZWFrIGEgc21hbGwgYW1vdW50IG9mIG1lbW9yeSBpbiBlYWNoIG5hbWUgcmVzb2x2ZQogIHdoZW4gbm90IHVzZWQgYXMgYSBETEwuCgotIE5ldyBhdXRoZW50aWNhdGlvbiBjb2RlIGFkZGVkLCBwYXJ0aWN1bGFybHkgbm90aWNhYmxlIHdoZW4gZG9pbmcgUE9TVCBvciBQVVQKICB3aXRoIERpZ2VzdCBvciBOVExNLiBsaWJjdXJsIHdpbGwgbm93IHVzZSBIRUFEIHRvIG5lZ290aWF0ZSB0aGUKICBhdXRoZW50aWNhdGlvbiBhbmQgd2hlbiBkb25lIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBQT1NULiBQcmV2aW91c2x5IGxpYmN1cmwKICBzZW50IFBPU1QgaW1tZWRpYXRlbHkgYW5kIGV4cGVjdGVkIHRoZSBzZXJ2ZXIgdG8gcmVwbHkgYSBmaW5hbCBzdGF0dXMgY29kZQogIHdpdGggYW4gZXJyb3IgYW5kIHRoZW4gbGliY3VybCB3b3VsZCBub3Qgc2VuZCB0aGUgcmVxdWVzdC1ib2R5IGJ1dCBpbnN0ZWFkCiAgc2VuZCB0aGVuIG5leHQgcmVxdWVzdCBpbiB0aGUgc2VxdWVuY2UuCgogIFRoZSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIGR1ZSB0byBJSVM2IGJhcmZpbmcgb24gbGliY3VybCB3aGVuIHdlIGF0dGVtcHQKICB0byBQT1NUIHdpdGggTlRMTSBhdXRoZW50aWNhdGlvbi4gVGhlIHJlYXNvbiBmb3IgdGhlIHByb2JsZW1zIGlzIGZvdW5kIGluCiAgUkZDMjYxNiBzZWN0aW9uIDguMi4zIHJlZ2FyZGluZyBob3cgc2VydmVycyBzaG91bGQgZGVhbCB3aXRoIHRoZSAxMDAKICBjb250aW51ZSByZXF1ZXN0LWhlYWRlcjoKCiAgICAgICAgSWYgaXQgcmVzcG9uZHMgd2l0aCBhIGZpbmFsIHN0YXR1cyBjb2RlLCBpdCBNQVkgY2xvc2UgdGhlIHRyYW5zcG9ydAogICAgICAgIGNvbm5lY3Rpb24gb3IgaXQgTUFZIGNvbnRpbnVlIHRvIHJlYWQgYW5kIGRpc2NhcmQgdGhlIHJlc3Qgb2YgdGhlCiAgICAgICAgcmVxdWVzdC4KCiAgUHJldmlvdXMgdmVyc2lvbnMgb2YgSUlTIGNsZWFybHkgZGlkIGNsb3NlIHRoZSBjb25uZWN0aW9uIGluIHRoaXMgY2FzZSwKICB3aGlsZSB0aGlzIG5ld2VyIHZlcnNpb24gZGVjaWRlZCBpdCBzaG91bGQgInJlYWQgYW5kIGRpc2NhcmQiLiBUaGF0IHdvdWxkJ3ZlCiAgZm9yY2VkIHVzIHRvIHNlbmQgdGhlIHdob2xlIFBPU1QgKG9yIFBVVCkgZGF0YSBvbmx5IHRvIGhhdmUgaXQgZGlzY2FyZGVkIGFuZAogIHRoZW4gYmUgZm9yY2VkIHRvIHNlbmQgaXQgYWdhaW4uIFRvIGF2b2lkIHRoYXQgaHVnZSBwZW5hbGl0eSwgd2Ugc3dpdGNoIHRvCiAgdXNpbmcgSEVBRCB1bnRpbCB3ZSBhcmUgYXV0aGVudGljYXRlZCBhbmQgdGhlbiBzZW5kIHRoZSBQT1NULgoKICBUaGUgb25seSBhY3R1YWwgZHJhd2JhY2sgSSBjYW4gdGhpbmsgb2YgKGV4Y2VwdCBmb3IgdGhlIG9kZCBzaXRlcyB0aGF0IG1pZ2h0CiAgdHJlYXQgSEVBRCBkaWZmZXJlbnRseSB0aGFuIHRoZXkgd291bGQgdHJlYXQgUE9TVC9QVVQgd2hlbiBnaXZlbiB0aGUgc2FtZQogIFVSTCkgaXMgdGhhdCBpZiB5b3UgZG8gUE9TVCB3aXRoIENVUkxBVVRIX0FOWSBzZXQgYW5kIHRoZSBzaXRlIHJlcXVpcmVzIE5PCiAgYXV0aGVudGljYXRpb24sIGxpYmN1cmwgd2lsbCBzdGlsbCB1c2UgYSBIRUFEIGluIGEgZmlyc3Qgcm91bmQgYW5kIHRoZW4gZG8gYQogIFBPU1QuCgogIElmIHlvdSBkbyBhIEhFQUQgb3IgYSBHRVQgb24gYSBzaXRlIHVzaW5nIENVUkxBVVRIX0FOWSwgbGliY3VybCB3aWxsIHNlbmQKICBhbiB1bi1hdXRoZW50aWNhdGVkIHJlcXVlc3QgYXQgb25jZSwgd2hpY2ggdGhlbiBpcyB0aGUgb25seSByZXF1ZXN0IGlmIHRoZQogIHNpdGUgcmVxdWlyZXMgbm8gYXV0aC4KCiAgQWxhbiBQaW5zdGVpbiBoZWxwZWQgbWUgd29yayBvdXQgdGhlIHByb3RvY29sIGRldGFpbHMgYnkgZmlndXJpbmcgb3V0IHdoeQogIGxpYmN1cmwgZmFpbGVkIGFuZCB3aGF0IElJUzYgZXhwZWN0cy4KCi0gVGhlIC0tbGltaXQtcmF0ZSBsb2dpYyB3YXMgY29ycmVjdGVkIGFuZCBub3cgaXQgd29ya3MgYSBsb3QgYmV0dGVyIGZvcgogIGhpZ2hlciBzcGVlZHMsIHN1Y2ggYXMgJzEwbScgb3Igc2ltaWxhci4gUmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjOTMwMjQ5LgoKLSBJbnRyb2R1Y2luZyBjdXJseF90dm5vdygpIGFuZCBjdXJseF90dmRpZmYoKSB1c2luZyB0aGUgbmV3IGN1cmx4XyogZmFzaGlvbi4KICAjaW5jbHVkZSAidGltZXZhbC5oIiBmcm9tIHRoZSBsaWIgZGlyIHRvIGdldCB0aGUgcHJvdG9zIGV0Yy4gIE5vdGUgdGhhdAogIHRoZXNlIGFyZSBOT1QgcGFydCBvZiB0aGUgbGliY3VybCBBUEkuIFRoZSBjdXJsIGFwcCBzaW1wbHkgdXNlcyB0aGUgc2FtZQogIHNvdXJjZSBmaWxlcyBhcyB0aGUgbGlicmFyeSBkb2VzIGFuZCB0aGVyZWZvcmUgdGhlIGZpbGUgbmVlZHMgdG8gYmUgY29tcGlsZWQKICBhbmQgbGlua2VkIHdpdGggY3VybCB0b28sIG5vdCBqdXN0IHdoZW4gY3JlYXRpbmcgbGliY3VybC4KCi0gbGliL3N0cmVycm9yLmMgbm8gbG9uZ2VyIHVzZXMgc3lzX25lcnIgb24gbm9uLXdpbmRvd3MgcGxhdGZvcm1zIHNpbmNlIGl0CiAgaXNuJ3QgcG9ydGFibGUgZW5vdWdoCgpEYW5pZWwgKDIgQXByaWwgMjAwNCkKLSBJbiB0aGUgY3VybF9zdHJucXVhbC4zIG1hbiBwYWdlLCB3ZSBub3cgcHJlcGVuZCB0aGUgbWFuMyBkaXIgdG8gdGhlIGZpbGUKICBuYW1lIHRvIHdvcmsgYmV0dGVyLiBBcyBwb2ludGVkIG91dCBieSBSb2JpbiBLYXkuCgotIEFuZHLpcyBHYXJj7WEgdXBkYXRlZCB0aGUgbWluZ3cgbWFrZWZpbGVzLgoKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIHByb2JsZW0gSSByZWNlbnRseSBhZGRlZCBpbiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgY29kZSB0aGF0CiAgYnJva2Ugc3Vic2Vjb25kIHJlc29sdXRpb24gZm9yIENVUkxJTkZPX1RPVEFMX1RJTUUuIEhlIGFsc28gcG9pbnRlZCBvdXQgYQogIG1pc3Rha2UgaW4gdGhlIGNvZGUgdGhhdCBwcm9kdWNlcyB0aGUgZmluYWwgdXBkYXRlIG9mIHRoZSBwcm9ncmVzcyBtZXRlcgogIHRoYXQgd291bGQgb2Z0ZW4gcHJldmVudCBpdCBmcm9tIGFjdHVhbGx5IGJlaW5nIHVwZGF0ZWQgdGhhdCBmaW5hbCB0aW1lLgoKRGFuaWVsICgxIEFwcmlsIDIwMDQpCi0gRGlyayBNYW5za2UgZml4ZWQgYSBtZW1vcnkgbGVhayB0aGF0IGhhcHBlbmVkIHdoZW4gd2UgdXNlIGFyZXMgZm9yIG5hbWUKICByZXNvbHZlcyBhbmQgZGVjaWRlcyB0byB0aW1lLW91dCBiZWZvcmUgYXJlcyBkb2VzIGl0LiBUaGlzIGZpeCB1c2VzIHRoZQogIGJyYW5kIG5ldyBhcmVzX2NhbmNlbCgpIGZ1bmN0aW9uIHdoaWNoIGlzIG5vdCBwcmVzZW50IGluIGMtYXJlcyAxLjEuMC4KCiAgV2hlbiB0b2xkIHRvIGVuYWJsZSBhcmVzLCB0aGUgY29uZmlndXJlIHNjcmlwdCBub3cgY2hlY2tzIGZvciBwcmVzZW5jZSBvZgogIHRoZSBhcmVzX2NhbmNlbCBmdW5jdGlvbiB0byBhbGVydCB1c2VycyBpZiB0aGV5IGF0dGVtcHQgdG8gdXNlIGEgdG9vIG9sZAogIGMtYXJlcyBsaWJyYXJ5LgoKRGFuaWVsICgzMSBNYXJjaCAyMDA0KQotIFJveSBTaGFuIGZpeGVkIGEgZmxhdyB0aGF0IHByZXZlbnRlZCBhcmVzIG5hbWUgcmVzb2x2ZSB0aW1lb3V0cyB0byBvY2N1ciEKCi0gRGlyayBNYW5za2UgZm91bmQgb3V0IHRoYXQgbGliY3VybCB0aW1lZCBvdXQgd2FpdGluZyBmb3IgcmVzb2x2ZXMgZmFyIHRvbwogIGVhc3kgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCB0byB1c2UgKGMtKWFyZXMgZm9yIG5hbWUgcmVzb2x2aW5nLgoKLSBGdXJ0aGVyIERpZ2VzdCBmaXhpbmcgYW5kIGEgc3VjY2Vzc2Z1bCB0ZXN0IGNhc2UgMTUzIG5vdyBtYWtlcyBtZSBiZWxpZXZlCiAgTWl0eiBXYXJrJ3MgcHJvYmxlbXMgYXJlIGZpeGVkLgoKLSBBbmRyZXMgR2FyY2lhIGZpZ3VyZWQgb3V0IHRoYXQgdGVzdCBjYXNlIDYzLCB3aGlsZSB3b3JraW5nLCBvbmx5IHByb3ZlZCBhCiAgZmxhdyBpbiBsaWJjdXJsJ3MgJ2h0dHBfcHJveHknIHBhcnNlciB3aGVuIGEgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBpcwogIHByb3ZpZGVkLiBUaGUgdXNlciBuYW1lIHdhcyBub3QgZXh0cmFjdGVkIHByb3Blcmx5IChhbmQgJ2h0dHAnIHdhcyBhbHdheXMKICB1c2VkIGFzIHVzZXIgbmFtZSkuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgY29tcGlsZXIgd2FybmluZ3MgaW4gb3VyIGlvY3Rsc29ja2V0KCkgdXNhZ2UuCgpEYW5pZWwgKDMwIE1hcmNoIDIwMDQpCi0gSm9lIEhhbHBpbiBmYWNlZCBwcm9ibGVtcyB3aXRoIHRoZSBnZXRuYW1laW5mbygpIGFyZ3VtZW50IGFpX2ZsYWdzIGFuZCB0aGUKICBwYXJ0aWN1bGFyIGJpdCBuYW1lZCAnTklfV0lUSFNDT1BFSUQnIG9uIFNvbGFyaXMgOSBmb3IgSW50ZWwuICBJJ3ZlIG5vdwogIHdyaXR0ZW4gYSBjb25maWd1cmUgdGVzdCB0aGF0IGNoZWNrcyBmb3IgYSB3b3JraW5nIE5JX1dJVEhTQ09QRUlECiAgaW1wbGVtZW5hdGlvbi4gTm8gY29kZSB1c2VzIHRoZSByZXN1bHQgZnJvbSB0aGlzIHRlc3QgeWV0LCBpdCBpcyBzdGlsbAogIGV4cGVyaW1lbnRhbC4gSmFtZXMgQ2FybHNvbiB3cm90ZSBpbiBjb21wLnVuaXguc29sYXJpczogIkl0J3MgYSBidWcKICAoNTAwNjYyMykgLS0gaXQncyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGRuJ3QgYmUgaW4gdGhlIGhlYWRlciBmaWxlLiIKCi0gSSBwcm92aWRlZCBNaXR6IFdhcmsgd2l0aCBhIGZpcnN0IHBhdGNoIGluIG9yZGVyIHRvIGZpeCBsaWJjdXJsJ3MgcHJvYmxlbXMKICB0byByZS1uZWdvdGlhdGUgRGlnZXN0IGF1dGhlbnRpY2F0aW9uICh3aGVuICdzdGFsZT10cnVlJyBpcyBpbmNsdWRlZCBpbiB0aGUKICByZXNwb25zZSBoZWFkZXIpLgoKLSBSb3kgU2hhbiBkaXNjb3ZlcmVkIHRoYXQgdGhlIG11bHRpIGludGVyZmFjZSBkaWRuJ3QgcHJvcGVybHkgdGltZW91dCBuYW1lCiAgbG9va3VwcyB3aGljaCBjb3VsZCBtYWtlIGhhbmRsZXMgZ2V0IHN0dWNrIGluIHRoYXQgc3RhdGUgYW5kIHRodXMgbmV2ZXIgZ2V0CiAgY29tcGxldGVkLiBJJ3ZlIHByb2R1Y2VkIGEgZmlyc3QgdGVzdCBwYXRjaCB0aGF0IGF0dGVtcHRzIHRvIGNvcnJlY3QgdGhpcy4KCi0gRGF2aWQgQnlyb24ncyBwYXRjaCB3YXMgYXBwcGxpZWQgdG8gbWFrZSBDVVJMT1BUX0ZBSUxPTkVSUk9SIHdvcmsgbmljZWx5CiAgZXZlbiB3aXRoIGF1dGhlbnRjYXRpb25zIHN1Y2ggYXMgTlRMTSBvciBEaWdlc3QgZW5hYmxlZC4gVGVzdCBjYXNlcyAxNTAsIDE1MQogIGFuZCAxNTIgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgpEYW5pZWwgKDI5IE1hcmNoIDIwMDQpCi0gR2lzbGUgVmFuZW0gdXBkYXRlZCBmaWxlcyBmb3IgdGhlIGRqZ3BwL01TLURPUyBidWlsZC4KCi0gQW5kculzIEdhcmPtYSBoZWxwZWQgbWUgd29yayBvdXQgYSBmaXggZm9yIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgdG8gbWFrZQogIHRoZSBmaWxlOi8vIHRlc3RzIHJ1biBmaW5lIHdoZW4gdGVzdGVkIHdpdGggdGhlIG1pbmd3LWJ1aWx0IHZlcnNpb24gb2YgY3VybC4KCi0gRml4ZWQgYW4gaW5jbHVkZSBpc3N1ZSB3aXRoIG5ldGluZXQvdGNwLmggb24gQUlYLCBiYXNlZCBvbiBpbnB1dCBieSBUb3IuCiAgVGhpcyBhbHNvIHJlcXVpcmVkIGEgbWlub3IgZml4IG9mIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKLSBUaGUgcG9zdGl0Mi5jIHNvdXJjZSBleGFtcGxlIHVzZWQgdGhlIHdyb25nIHN0cnVjdCBuYW1lIGZvciB0aGUgcG9zdCBkYXRhLgoKRGFuaWVsICgyNiBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtIGltcHJvdmVkIGlwdjYgc3VwcG9ydCBvbiB3aW5kb3dzIGJ5IG1ha2luZyB0aGUgY3VybCBidWlsZCB0byB1c2UKICB0aGUgY29ycmVjdCBnZXRhZGRyaW5mbygpIGZ1bmN0aW9uLgoKRGFuaWVsICgyNSBNYXJjaCAyMDA0KQotIEl0IHR1cm5lZCBvdXQgdGhhdCBBSVgsIGRlc3BpdGUgaGF2aW5nIGEgInRocmVhZC1zYWZlIGxpYmMiLCBkb2Vzbid0IG9mZmVyCiAgYWxsIHRyYWRpdGlvbmFsIGZ1bmN0aW9ucyB0aHJlYWQtc2FmZS4gVGhpcyBVUkwgaXMgaW5mb3JtYXRpdmUgb24gdGhpcwogIHN1YmplY3Q6CgogICAgaHR0cDovL3B1YmxpYm4uYm91bGRlci5pYm0uY29tL2RvY19saW5rL2VuX1VTL2FfZG9jX2xpYi9haXhwcmdnZC8gXAogICAgZ2VucHJvZ2MvdGhyZWFkX3F1aWNrX3JlZi5odG0KCiAgQXMgYSByZXN1bHQgb2YgdGhpcywgd2Ugbm93IGNoZWNrIGZvciB0aHJlZSAqX3IoKSBmdW5jdGlvbnMgb24gcmVjZW50IEFJWAogIHZlcnNpb25zIGFzIHdlbGwgdGhhdCB0aGUgVVJMIG1lbnRpb25zIGFyZW4ndCB0aHJlYWQtc2FmZSBpbiBBSVggNS4xLgoKLSByZW5hbWVkIGN1cmxfc3RyZXJyb3IuW2NoXSB0byBzdHJlcnJvci5bY2hdCgotIEpvZSBIYWxwaW4gYWRkZWQgQ1VSTE9QVF9UQ1BfTk9ERUxBWSBhbmQgLS10Y3Atbm9kZWxheSB0byBtYWtlIGl0IHBvc3NpYmxlCiAgZm9yIHVzZXJzIHRvIGRpc2FibGUgdGhlIE5hZ2xlIGFsZ29ydGhpbS11c2FnZS4KCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgc29tZSBpbnRlcmVzdGluZyBzdHJlcnJvcl9yKCkga25vd2xlZGdlLiBnbGliYyBoYXMgaXRzCiAgb3duIEFQSSB3aGljaCBkaWZmZXJzIGZyb20gdGhlIFBPU0lYIG9uZS4gRGFuaWVsIGFkanVzdGVkIHRoZSBjb25maWd1cmUKICBzY3JpcHQgdG8gZGV0ZWN0IHRoZSB2ZXJzaW9uIGluIHVzZSwgYW5kIHRoZSBjb2RlIG5vdyB1c2VzIHRoZSBuZXcgZGVmaW5lcwogIGFjY29yZGluZ2x5LgoKLSBGaXhlZCBzb21lIGJ1aWxkIGZsYXdzIHdpdGggdGhlIG5ldyBsaWIvY3VybF9zdHJlcnJvci5jIHNvdXJjZSBmaWxlLgoKRGFuaWVsICgyNCBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgZml4IHRvIHJlcGxhY2UgdGhlIGJhZCB1c2Ugb2Ygc3RyZXJyb3IoKS4gVGhpcyBpbnRyb2R1Y2VzCiAgQ3VybF9zdHJlcnJvcigpIHRoYXQgYXR0ZW1wdHMgdG8gYmUgdGhyZWFkLXNhZmUgX2FuZF8gd29ya3Mgb24gV2luZG93cyB0b28hCgotIFRvciBBcm50c2VuIHNwZWxsLWZpeGVkIGxvdHMgb2YgbGliY3VybCBtYW4gcGFnZXMuCgotIFRvciBBcm50c2VuIG1hZGUgdGVzdGN1cmwucGwgd29yayB3aXRoIG9sZGVyIHBlcmwgNSB2ZXJzaW9ucywgYW5kIERhbmllbAogIG1hZGUgaXQgbm90IHVzZSBjaGRpciAuLiB0byBnbyBiYWNrLCBhcyB0aGF0IGlzbid0IHZlcnkgZ29vZCB3aGVuIHlvdSd2ZQogIHNldHVwIGEgdGVzdGRpciBjb250YWluaW5nIHN5bWxpbmtzLgoKLSBBZGRlZCBhIGNoZWNrIGZvciBzdHJlcnJvcl9yKCkgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgpEYW5pZWwgKDIzIE1hcmNoIDIwMDQpCi0gQWRkZWQgR3JlZyBIZXdnaWxsJ3MgdGVzdGN1cmwucGwgc2NyaXB0IHRvIENWUy4gV2UgaGF2ZSBub3QgbW92ZWQgb3ZlciB0bwogIHVzZSB0aGlzIHNjcmlwdCBmb3IgdGhlIHJlYWwgZGlzdHJpYnV0ZWQgdGVzdGluZyBqdXN0IHlldCwgYnV0IGl0IGlzIG9ubHkKICBhIG1hdHRlciBvZiB0aW1lLgoKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBjb2RlIHRoYXQgbWFrZXMgY3VybCByZXBvcnQgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZQogIGlmIC0taW50ZXJmYWNlIGZhaWxzIG9uIHdpbmRvd3MuCgotIFRoZSByZWd1bGFyIHByb2dyZXNzIG1ldGVyIGlzIG5vdyBmaXhlZCB0byBuZXZlciB3cmFwIGR1ZSB0byBsb25nIGxpbmVzLiBBbGwKICBmaWVsZHMgYXJlIG5vdyBzdGF0aWMgc2l6ZWQuIElmIHRoZSB0aW1lIGluIHRoZSB0aW1lIGZpZWxkcyBnZXQgYSB0aW1lIHZhbHVlCiAgdGhhdCB3b3VsZCByZXByZXNlbnQgYSB0aW1lIHRoYXQgaXMgMTAwIGhvdXJzIG9yIG1vcmUgKGlmIG5vdCwgaXQgcmVtYWlucwogIHVzaW5nIGEgSEg6TU06U1MgZGlzcGxheSksIGl0IHN3aXRjaGVzIGZpcnN0IHRvIGEgIk5OTmQgTk5oIiBkaXNwbGF5IChmb3IKICBkYXlzIGFuZCBob3VycykgYW5kIGlmIHRoYXQgaXNuJ3QgZW5vdWdoIGl0IHN3aXRjaGVzIHRvIGEgIk5OTmQiIGRpc3BsYXkgaWYKICBpdCBpcyBtb3JlIHRoYW4gOTk5IGRheXMuCgogIFNldmVyYWwgb2YgdGhlIGNhbGN1bGF0aW9ucyB3ZXJlIGFsc28gbW92ZWQgdG8gZml4ZWQtcG9pbnQgbWF0aCBpbnN0ZWFkIG9mCiAgdXNpbmcgZG91Ymxlcy4KCkRhbmllbCAoMjIgTWFyY2ggMjAwNCkKLSBHbGVuIE5ha2FtdXJhIG5vdGljZWQgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgZGlkbid0IHdvcmsgYXMgaXQKICB1c2VkIHRvIGRvIGlmIENVUkxPUFRfTk9CT0RZIGlzIHNldCBUUlVFLgoKLSBLZXZpbiBSb3RoIHBhdGNoZWQgdGhlIGN5Z3dpbiBwYWNrYWdlIG1ha2VmaWxlIGFuZCBSRUFETUUgdG8gYWRqdXN0IHRvCiAgbmV3IGN5Z3dpbiBwYWNrYWdpbmcgZ3VpZGVsaW5lcy4KCi0gRW5hYmxlZCAiTlQgcmVzcG9uc2VzIiBpbiB0aGUgTlRMTSBhdXRoZW50aWNhdGlvbi4gRG9pbmcgdGhpcyBzaW1wbHkgbWVhbnMKICB0aGF0IHdlIHByb3ZpZGUgYW4gZXh0cmEgY2h1bmsgb2YgZGF0YSBpbiBlYWNoICJ0eXBlLTMgbWVzc2FnZSIuIFRoZSBvbmx5CiAgcmVhc29uIGZvciBkb2luZyB0aGlzIGlzIHRoYXQgaXQgc2VlbXMgdGhhdCB1c2luZyBvbmx5IHRoZSAiTGFubWFuYWdlciBoYXNoIgogIChhcyB3ZSd2ZSBiZWVuIGRvaW5nIHVudGlsIG5vdykgZG9lc24ndCBzdXBwb3J0IHBhc3N3b3JkcyBsb25nZXIgdGhhbiAxNAogIGNoYXJhY3RlcnMgYW5kIGl0IHR1cm5zIG91dCB0aGVyZSBhcmUgdXNlcnMgb3V0IHRoZXJlIHdobyB3YW50IHRvIHVzZQogIGxpYmN1cmwgYW5kIE5UTE0gd2l0aCBzdWNoIHBhc3N3b3JkcyEgOy0pIFNldmVuIE5UTE0tcmVsYXRlZCB0ZXN0IGNhc2VzIHdlcmUKICB1cGRhdGVkIGFjY29yZGluZ2x5LiBNZW50aW9uZWQgYXMgaXNzdWUgMjkgaW4gVE9ETy1SRUxFQVNFLCBidWcgcmVwb3J0CiAgIzkxNTYwOQoKLSBNb3ZlZCB0aGUgZ2VuZXJhdGVkIGxpYmN1cmwgdmVyc2lvbiBpbmZvIHRvIGEgbmV3IGhlYWRlciBmaWxlLCBuYW1lZAogIGN1cmwvY3VybHZlci5oLiBOb3cgaW50ZXJlc3RlZCBwYXJ0aWVzIGNhbiBpbmNsdWRlIE9OTFkgdmVyc2lvbiBpbmZvLCBzaG91bGQKICBhbnlvbmUgd2FudCB0aGF0IChhbmQgaXQgc2VlbXMgYXQgbGVhc3Qgc29tZSB3aW5kb3dzIHJlc291cmNlIGZpbGVzIHdvdWxkKS4KICBNZW50aW9uZWQgYXMgaXNzdWUgMjcgaW4gVE9ETy1SRUxFQVNFLgoKRGFuaWVsICgyMSBNYXJjaCAyMDA0KQotIEZpeGVkIHRoZSByb290IE1ha2VmaWxlIHRvIHVzZSB0YWJzIGZvciB0aGUgbmV0d2FyZSB0YXJnZXQuIEf8bnRlciBLbmF1ZgogIHBvaW50ZWQgdGhpcyBvdXQuCgotIE1hcnR5IEt1aHJ0J3MgVk1TIGNsZWFudXAKCi0gVGhvbWFzIFNjaHdpbmdlIG1hZGUgYnVpbGRjb25mIHJlY29nbml6ZSBBQ0xPQ0FMX0ZMQUdTIHRvIGludm9rZSBhY2xvY2FsCiAgd2l0aCBwYXJ0aWN1bGFyIHByZS1kZXRlcm1pbmVkIG9wdGlvbnMuCgpWZXJzaW9uIDcuMTEuMSAoMTkgTWFyY2ggMjAwNCkKCkRhbmllbCAoMTggTWFyY2ggMjAwNCkKLSBUb3IgQXJudHNlbiBicm91Z2h0IHNvbWUgaW5mbyBhYm91dCBTR0kgSVJJWDoKCiAgSVJJWCBzdXBwb3J0cyAzIGRpZmZlcmVudCBleGVjdXRhYmxlL29iamVjdCBmb3JtYXRzLCAtMzIsIC1uMzIgYW5kIC02NC4KICAtbjMyIGlzIGRlZmF1bHQgMzItYml0IGZvcm1hdCwgLTMyIGlzIHRoZSAib2xkIiAzMi1iaXQgZm9ybWF0LCBhbmQgLTY0IGlzCiAgdGhlIDY0LWJpdCBmb3JtYXQuICBMaWJyYXJpZXMgZm9yIHRoZSBkaWZmZXJlbnQgZm9ybWF0cyBhcmUgaW4gbGliLCBsaWIzMgogIGFuZCBsaWI2NCByZXNwZWN0aXZlbHkuCgogIFdlJ3ZlIG5vdyBhZGp1c3RlZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBhZGFwdCB0byB0aGlzIHdoZW4gc2Nhbm5pbmcgZm9yCiAgM3JkIHBhcnR5IGxpYnMsIHN1Y2ggYXMgT3BlblNTTC4KCkRhbmllbCAoMTcgTWFyY2ggMjAwNCkKLSBXYXR6IHBvaW50ZWQgb3V0IGEgZmV3IG1pc3NpbmcgZmlsZXMgaW4gdGhlIE1TVkMgcHJvamVjdCBkZXNjcmlwdGlvbiBmaWxlLgoKLSBH/G50ZXIgS25hdWYgYnJvdWdodCBwYXRjaGVzLCBjb2RlIGFuZCBtYWtlZmlsZXMgdG8gYnVpbGQgY3VybCBvbiBOb3ZlbGwKICBOZXRXYXJlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDA0KQotIExvdHMgb2YgbGliY3VybCBtYW4gcGFnZXMgd2VyZSB1cGRhdGVkIHRvIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBtYW4KICBwYWdlcyB0aGUgcmVjb2duaXplZCB3YXkgc28gdGhhdCB0aGV5IGFwcGVhciBhcyBuaWNlIGh5cGVybGlua3MgaW4gdGhlIEhUTUwKICB2ZXJzaW9ucy4KCi0gYnVpbGRjb25mIG5vdyBjaGVja3MgdGhlIG00IHZlcnNpb24gdG9vLCBzaW5jZSBhdXRvY29uZiByZXF1aXJlcyBhIEdOVSBtNAogIHZlcnNpb24gdG8gYnVpbGQgcHJvcGVyIGNvbmZpZ3VyZSBzY3JpcHRzLgoKRGFuaWVsICgxMiBNYXJjaCAyMDA0KQotIEFkZGVkIENVUkxPUFRfUE9TVEZJRUxEU0laRV9MQVJHRSwgdGhlIGxhcmdlIGZpbGUgdmVyc2lvbiBvZgogIENVUkxPUFRfUE9TVEZJRUxEU0laRSB0byBhbGxvdyBQT1NUcyBsYXJnZXIgdGhhbiAyR0IuCgotIERhdmlkIEJ5cm9uIGZpeGVkIGFuIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY2FzZS9jcmFzaC4KCkRhbmllbCAoMTAgTWFyY2ggMjAwNCkKLSBKZWZmIExhd3NvbiBmaXhlZCB0aGUgU1NMIGNvbm5lY3Rpb24gdG8gZGVhbCB3aXRoIHJlY2VpdmVkIHNpZ25hbHMgZHVyaW5nIHRoZQogIGNvbm5lY3QuCgotIENoYW5nZWQgdGhlIE9TIHN0cmluZyBmb3Igd2luMzIgdG8gYmVjb21lICJpMzg2LXBjLXdpbjMyIi4KCkRhbmllbCAoOSBNYXJjaCAyMDA0KQotIENoYW5nZWQgdGhlIGludGVybmFscyB0byB1c2UgY3VybF9zb2NrZXRfdCBmb3Igc29ja2V0IHZhcmlhYmxlIHR5cGUuIFRoaXMKICBzaG91bGQgZW5hYmxlIHVzIHRvIGJ1aWxkIHdpdGggbGVzcyB3YXJuaW5ncyBvbiBXaW5kb3dzLCB3aGVyZSBTT0NLRVQgaXMKICB1c2VkIHdoaWNoIGlzIGFuIHVuc2lnbmVkIGludCwgd2hpbGUgbW9zdCBvdGhlciBwbGF0Zm9ybXMgdXNlIGEgbWVyZSBpbnQuCgotIE1vZGlmaWVkIGxpYi9jb25maWctd2luMzIuaCB0byBidWlsZCBmaW5lIG9uIE1TVkMgYWdhaW4uCgpWZXJzaW9uIDcuMTEuMS1wcmUxICg4IE1hcmNoIDIwMDQpCgpEYW5pZWwgKDggTWFyY2ggMjAwNCkKLSBNaW5vciBmaXggdG8gbWFrZSBjdXJsIENVUkxfVkVSU0lPTl9MQVJHRUZJTEUgaXMgb25seSBzZXQgaWYgY3VybF9vZmZfdCBpcwogIGxhcmdlciB0aGFuIDQgYnl0ZXMuCgpEYW5pZWwgKDQgTWFyY2ggMjAwNCkKLSBJbXByb3ZlZCBQVVQvUE9TVCB3aXRoIE5UTE0vRGlnZXN0IGF1dGhlbnRpY2F0aW9uLCB0aGUgc28gY2FsbGVkIGlzc3VlIDEyLgoKLSBNb2RpZmllZCB0aGUgdGVzdCBIVFRQIHNlcnZlciBhIGxvdCB0byB3b3JrIHdpdGggdGhlIHVwY29taW5nIGNoYW5nZXMgZm9yCiAgUFVUL1BPU1Qgd2l0aCBOVExNL0RpZ2VzdCBhdXRoZW50aWNhdGlvbiAobGlrZSB0ZXN0IGNhc2UgODgpLiBBZGRlZCBBbmRy6XMKICBHYXJj7WEncyB3aW4zMi1jaGFuZ2VzLiBJbXByb3ZlZCB0aGUgbG9nZ2luZy4KCi0gRml4ZWQgdGhlIGZpbGU6LXJlbGF0ZWQgcHJvZ3Jlc3MvZ2V0aW5mbyBzdHVmZiBhIGJpdCBtb3JlLgoKRGFuaWVsICg0IE1hcmNoIDIwMDQpCi0gSSBjb3JyZWN0ZWQgYSBwcm9ibGVtIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSB3aGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOgogIGhlYWRlciBvciB3aGVuIGRvaW5nIG11bHRpcGxlLXJlcXVlc3QgYXV0aGVudGljYXRpb25zLiBBIHN1YnNlcXVlbnQgcmVxdWVzdAogIGNvdWxkIGVycm9uZW91c2x5IHJlLXVzZSBhIHByZXZpb3VzIGNvbm5lY3Rpb24gdGhhdCB3YXMgc2VudCB3aXRoCiAgQ29ubmVjdGlvbjogY2xvc2UuIENocmlzdG9waGVyIFIuIFBhbG1lciByZXBvcnRlZC4KCi0gQW5kculzIEdhcmPtYSBwYXRjaGVkIGN1cmwgdG8gcHJldmVudCB3YXJuaW5ncyB3aGlsZSBjb21waWxpbmcgd2l0aCBtaW5ndywKICBtYWlubHkgYmVjYXVzZSBpdCBpcyBub3cgcG9zc2libGUgdG8gaGF2ZSBib3RoIFdJTjMyIGFuZCBIQVZFX0NPTkZJR19ICiAgZGVmaW5lZC4KCi0gV2hlbiB0cmFuc2ZlcnJpbmcgZmlsZXMgZnJvbSBhIGZpbGU6IFVSTCwgdGhlIHByb2dyZXNzIG1ldGVyIGFuZCBvdGhlcgogIHRyYW5zZmVyIG1ldHJpY3Mgd2VyZSBub3QgdXBkYXRlZCBwcm9wZXJseS4KCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSAidmVyc2lvbiByZXNvdXJjZSIgZmlsZSB0byB0aGUgY3VybCBleGVjdXRhYmxlIGZvcgogIHRoZSB3aW5kb3dzIGJ1aWxkcy4KCkRhbmllbCAoMyBNYXJjaCAyMDA0KQotIERhdmlkIEJ5cm9uJ3Mgd29yayBvbiBtYWtpbmcgbGliY3VybCBvbmx5IHJlcXVpcmUgd2luc29jayAxLjEgb24gV2luZG93cwogIG1hY2hpbmVzLgoKLSBNb3JlIHZhcmlhYmxlIGNsZWFudXBzIGJhc2VkIG9uIGNvbXBpbGVyIHdhcm5pbmdzIGdlbmVyYXRlZCBieSBUb3IgQXJudHNlbidzCiAgYXV0b2J1aWxkcyB3aXRoIE1JUFNQcm8uCgotIEpvZSBIYWxwaW4gaGVscGVkIHVzIGZpeCBzb21lIHBlZGFudGljIGNvbXBpbGVyIHdhcm5pbmdzIG9uIEZyZWVCU0QuCgotIEFwcGxpZWQgVG9tIEJhdGVzJyBwYXRjaCB0byBidWlsZCBvbiBuc3ItdGFuZGVtLW5zay4KCi0gRGFuIEZhbmRyaWNoIGNvcnJlY3RlZCBzb21lIGZsYXdzIGluIHRoZSBjb25maWd1cmUgR1NTIGRldGVjdGlvbi4KCkRhbmllbCAoMiBNYXJjaCAyMDA0KQotIEZpeGVkIHRoZSBsaWJjdXJsIGNvZGUgdG8gdXNlIEZPUk1BVF9PRkZfVCBmb3IgcHJpbnRmKCkgZm9ybWF0dGluZwogIGN1cmxfb2ZmX3QgdHlwZXMgaW50ZXJuYWxseS4KCkRhbmllbCAoMSBNYXJjaCAyMDA0KQotIEFkZGVkIENVUkxfVkVSU0lPTl9MQVJHRUZJTEUgYXMgYSBmZWF0dXJlLWJpdCBpbiB0aGUgY3VybF92ZXJzaW9uX2luZm8oKQogIHJlc3BvbnNlLCB0aGF0IHNpZ25hbHMgaWYgdGhpcyBsaWJjdXJsIHN1cHBvcnRzID4yR0IgZmlsZXMuIGN1cmwgLVYgbm93CiAgb3V0cHV0cyAnTGFyZ2VmaWxlJyBpbiB0aGUgRmVhdHVyZXM6IGZpZWxkIGlmIHRoaXMgaXMgdGhlIGNhc2UuIE1vc3Qgc3lzdGVtcwogIGFyZSBsaWtlbHkgdG8gc3VwcG9ydCB0aGlzLgoKLSBXZSBvZmZlciBhIENVUkxfRk9STUFUX09GRl9UIGRlZmluZSBpbiB0aGUgcHVibGljIGhlYWRlciwgd2hpY2ggY2FuIGJlIHVzZWQKICB0byBwcmludGYoKSBjdXJsX29mZl90IHZhcmlhYmxlcy4gV2UgYWxzbyBtb2RpZmllZCB0aGUgbGliY3VybCBzb3VyY2VzIHRvCiAgdXNlIHRoaXMgZGVmaW5lIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzICVPZCBhcHByb2FjaCAoYWx0aG91Z2ggSSd2ZSBsZWZ0IHRoZQogIE8tZmxhZyBmdW5jdGlvbmFsIGluIHRoZSBjb2RlKS4gVGhpcyBzaG91bGQgYWxzbyBwcmV2ZW50IGNvbXBpbGVycyB0byB3YXJuCiAgb24gdGhlIGhvbWUtZ3Jvd24gb3B0aW9uLgoKLSBGaXhlZCB0aGUgcmVzdW1lLWNoZWNrIGNvZGUgdG8gdGVzdCBmb3IgYSB3b3JraW5nIHJlc3VtZSBhdCB0aGUgZW5kIG9mIHRoZQogIGhlYWRlcnMgYW5kIG5vdCBhdCB0aGUgZmlyc3QgYm9keS1ieXRlLgoKLSBDVVJMT1BUX0ROU19VU0VfR0xPQkFMX0NBQ0hFIGlzIG5vdyBjb25zaWRlcmVkIG9ic29sZXRlLiBTdG9wIHVzaW5nIGl0LiBJZgogIHlvdSBuZWVkIGEgZ2xvYmFsIEROUyBjYWNoZSBmb3Igd2hhdGV2ZXIgcmVhc29uLCB1c2UgdGhlIHNoYXJlIGludGVyZmFjZSBhbmQKICB5b3UnbGwgZ2V0IGEgZ2xvYmFsIGNhY2hlIHRoYXQgd29ya3MgdGhlIHdheSBpdCBzaG91bGQgd29yay4gWW91IGNhbiBldmVuCiAgaGF2ZSBhbnkgbnVtYmVyIG9mIGdsb2JhbCBjYWNoZXMsIGFsbCBhdCB5b3VyIGNvbW1hbmQuIFRoaXMgaXMgbm93IGFsc28KICBtZW50aW9uZWQgaW4gdGhlIGRvY3MuCgotIE1hZGUgdGhlICpwcmludGYgY29kZSBzdXBwb3J0IHRoZSB6LWZsYWcgdG8gZW5hYmxlIHNpemVfdCBwcmludGYoKSBpbiBhCiAgbWFubmVyIHNpbWlsYXIgdG8gaG93IGdsaWJjIGFsbG93cyBpdC4gVG8gbWFrZSBwcmludGZpbmcgb2YgdGhpcyB3b3JrIG9uCiAgcGxhdGZvcm1zIHdpdGggNjRiaXQgc2l6ZV90IGFuZCAzMmJpdCBpbnRzLiBJZiB0aGVyZSBldmVuIGFyZSBhbnkhIDstKQoKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgZGlzY292ZXJlZCB0aGF0IGlmIHlvdSBDVVJMT1BUX0ZSRVNIX0NPTk5FQ1QgYW5kCiAgQ1VSTEFVVEhfTlRMTSAob3IgQ1VSTEFVVEhfQU5ZIGFuZCBsaWJjdXJsIHRoZW4gcGlja2VkIE5UTE0pLCBsaWJjdXJsIHdvdWxkCiAgbG9vcCB3aXRob3V0IHN1Y2NlZWRpbmcgdG8gYXV0aGVudGljYXRlIGR1ZSB0byB0aGUgbmV3IGNvbm5lY3Rpb24gdGhhdCB3YXMKICBtYWRlIGZvciBhbGwgcm91bmQtdHJpcHMgaW4gdGhlIGF1dGhlbnRpY2F0aW9uLiBOb3csIHRoZSBGUkVTSF9DT05ORUNUIGlzCiAgcmVtYWRlIHRvIG9ubHkgbWF0dGVyIGZvciB0aGUgZmlyc3QgY29ubmVjdGlvbiBtYWRlIHdpdGggY3VybF9lYXN5X3BlcmZvcm0oKQogIGFuZCBhbGwgdGhlIHJlc3QgdGhhdCBtaWdodCBmb2xsb3cgZHVlIHRvIEZPTExPV0xPQ0FUSU9OIG9yIEhUVFAKICBhdXRoZW50aWNhdGlvbiBhcmUgbm93IGlnbm9yaW5nIHRoYXQgb3B0aW9uLgoKLSBBZGp1c3RlZCB0aGUgUVVJVCBjb2RlIHNsaWdodGx5IHNpbmNlIGl0IGNvdWxkIGNvcmUtZHVtcC4KCi0gQ29ycmVjdGVkIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0byBwcm92aWRlIGEgY29ycmVjdCBzaXplIHRvIHRoZQogICd2ZXJpZmllZHNlcnZlcicgcmVxdWVzdC4KCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNCkKLSBKb2UgSGFscGluIG1hZGUgdGhlIEZUUCBjb2RlIHNlbmQgUVVJVCBvbiB0aGUgY29udHJvbCBjb25uZWN0aW9uIGJlZm9yZQogIGRpc2Nvbm5lY3RpbmcgdGhlIFRDUCBjb25uZWN0aW9uLiBUaGlzIGlzIHdoYXQgZ29vZC1iZWhhdmluZyBmdHAgY2xpZW50cwogIHNob3VsZCBkby4KCkRhbmllbCAoMjYgRmVicnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbiB1cGRhdGVkIHNldmVyYWwgZmlsZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gTVNWQyA2LiBIZQogIGFsc28gYWRkZWQgdGhlICdidWlsZGNvbmYuYmF0JyB0aGF0IHdvcmtzIGxpa2UgdGhlICdidWlsZGNvbmYgKyBjb25maWd1cmUnCiAgY29tYm8gZG9lcyBvbiB1bml4ZXMuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIG1lbWRlYnVnIHN0dWZmIHN1cHBvcnQgY2FsbG9jKCkgYXMgd2VsbC4KCi0gVG9yIEFybnRzZW4gcG9pbnRlZCBvdXQgdGhhdCB0ZXN0Y3VybC5zaCBuZWVkZWQgdG8gcmVtb3ZlIHRoZSBnZW5lcmF0ZWQKICBmaWxlcyBpbiBvcmRlciB0byBoYXZlIHRoZW0gcmUtZ2VuZXJhdGVkIGluIGVhY2ggYnVpbGQuCgotIEFuZHkgU2VycGEgZm91bmQgb3V0IHRoYXQgdGhlIHNoYXJlIGludGVyZmFjZSBkaWQgbm90IGVuam95IGxpZmUgd2hlbiBub3QKICBoYXZpbmcgdGhlIGxvY2sgYW5kIHVubG9jayBjYWxsYmFja3Mgc2V0LCBldmVuIHRob3VnaCBkb2N1bWVudGVkIHRvIGJlCiAgT0suIEl0IHN0aWxsIGlzIE9LLCBhbmQgbm93IHRoZSBjb2RlIHdvbid0IHNlZ2ZhdWx0IGFueW1vcmUhCgpEYW5pZWwgKDI1IEZlYnJ1YXJ5IDIwMDQpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBHcmVnIEhld2dpbGwgSSBtb2RpZmllZCBob3cgbG9uZyBsb25nIGlzIHVzZWQgaW4gdGhlCiAgbXByaW50ZiBjb2RlLCBhcyB3ZSBjYW4gdXNlIGEgNjRiaXQgdHlwZSB3aXRoIE1TVkMgdGhhdCBpcyBhIGxvbmcgbG9uZwogIGVxdWl2YWxlbnQuIFRoaXMgY29ycmVjdHMgc29tZSB3ZWlyZCBsYXJnZSBmaWxlIGJlaGF2aW9ycyBvbiB3aW5kb3dzLgoKLSBUb3IgQXJudHNlbiBoZWxwZWQgbWUgd29yayBvdXQgLS1lbmFibGUtZGVidWcgdG8gd29yayBiZXR0ZXIgd2l0aCBkaWZmZXJlbnQKICB2ZXJzaW9ucyBvZiB0aGUgZ2NjIGFuZCBpY2MgY29tcGlsZXJzLgoKLSBBZGRlZCBDVVJMT1BUX1NIQVJFIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2UuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDQpCi0gQXBwbGllZCB0aGUgZmluYWwgcGllY2VzIG9mIEdpc2xlIFZhbmVtJ3MgcGF0Y2ggdGhhdCBicmluZ3MgYSB3b3JraW5nIG5hbWUKICByZXNvbHZlIHRpbWVvdXQgdG8gdGhlIHdpbmRvd3MgdmVyc2lvbnMgb2YgY3VybCEKCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbidzIGZpeCB0byBhbGxvdyB0aGUgc3BlZWQtbGltaXQgbG9naWMgd29yayBldmVuIGlmIHlvdSBzZXQKICBsaW1pdC1yYXRlLiBJdCBkb2VzIHdvcmsgb24gdGhlIGV4cGVuc2Ugb2YgdGhlIHJhdGUgbGltaXRlci4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwNCkKLSBjb25maWd1cmUgLS1lbmFibGUtZGVidWcgd2l0aCBnY2Mgbm93IGFsc28gdHJpZXMgdG8gZGV0ZWN0IHRoZSBpY2MgY29tcGlsZXIKICAod2hpY2ggc29tZWhvdyBnZXRzIHRyZWF0ZWQgYXMgaWYgaXQgaXMgYSBnY2MpIHRvIHN0b3AgdXNpbmcgYWxsIHRoZSBnY2MKICBvcHRpb25zIHdpdGggaXQsIGFuZCB3ZSBhbHNvIHByb3ZpZGUgLWlzeXN0ZW0gb3B0aW9ucyBmb3IgZWFjaCBleHRyYSAtSQogIG9wdGlvbiB0aGUgY29uZmlndXJlIHNjcmlwdCBoYXMgZmlndXJlZCBvdXQgKGZvciBPcGVuU1NMLCBrZXJiZXJvcywgemxpYiwKICBIZWltZGFsIGV0YykuIFRoaXMgb2YgY291cnNlIHRvIHByZXZlbnQgd2FybmluZ3Mgb24gaGVhZGVycyB3ZSBkb24ndCBoYXZlCiAgY29udHJvbCBvZi4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwNCkKLSBEb3VnIFBvcnRlciBtYWRlIGxpYmN1cmwgdXNlIHRoZSBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGJlZm9yZSB0aGUKICBnZXRwd3VpZCByZXN1bHRzIHdoZW4gbG9va2luZyBmb3IgLm5ldHJjIGZpbGVzLgoKLSBJZiAnY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnJyBpcyB1c2VkIHdpdGggZ2NjLCBpdCBub3cgY2hlY2tzIHdoaWNoIGdjYwogIHZlcnNpb24gaXQgaXMgYW5kIHVzZXMgYXMgcGlja3kgY29tcGlsZXIgb3B0aW9ucyBhcyBwb3NzaWJsZSBmb3IgdGhlCiAgcGFydGljdWxhciB2ZXJzaW9uLgoKLSBDb2RlIHRoYXQgY2FuIGJlIHVzZWQgaW4gYm90aCB0aGUgbGliIGFuZCBpbiB0aGUgY3VybCBhcHAgaXMgbm93IG1hZGUgdG8gdXNlCiAgdGhlIGN1cmx4XyBwcmVmaXguIFRoZSBmaXJzdCBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUgbGlrZSB0aGlzIGlzIHRoZQogIGN1cmx4X3N0cnRvbGwoKSBmdW5jdGlvbi4gVGhpcyBpcyBtYWRlIHRvIGFsbG93IHRoZSBhcHAgdG8gdXNlIGV4aXN0aW5nIGNvZGUsCiAgYnV0IHdpdGhvdXQgcG9sbHV0aW5nIHRoZSBsaWJjdXJsIEFQSS4gRnVydGhlciBleHBsYW5hdGlvbnMgcG9zdGVkIGhlcmU6CgogICAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA0LTAyLzAyMTUuaHRtbAoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA0KQotIEZpeGVkIGJ1aWxkY29uZiB0byBub3QgdXNlICJ3aGljaCIgYXMgQUlYIGFuZCBUcnU2NCBoYXZlIHdoYXQgaGF2ZSBiZWVuCiAgcmVmZXJyZWQgdG8gYXMgImhvcnJpYmx5IGJyb2tlbiAnd2hpY2gnIHByb2dyYW1zIi4KCi0gTWFkZSBzdXJlIGRucyBjYWNoZSB0aW1lb3V0IHNldCB0byAtMSByZWFsbHkgbWVhbnMgY2FjaGluZyBmb3JldmVyLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA0KQotIE1hZGUgaXQgcG9zc2libHkgdG8gYnVpbGQgYy1hcmVzIHdpdGggdGhlIGxpYmN1cmwgbWVtZGVidWcgc3lzdGVtIHRvIGJldHRlcgogIHRyYWNrIG1lbW9yeS4KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNCkKLSBXaGVuIHVzaW5nIGFyZXMsIHdlIG5vdyBpbml0aWFsaXplIHRoZSBhcmVzICdjaGFubmVsJyBpbiBjdXJsX2Vhc3lfaW5pdCgpCiAgYW5kIHJlLXVzZSB0aGF0IHNhbWUgaGFuZGxlIGR1cmluZyB0aGUgZW50aXJlIGN1cmwgaGFuZGxlJ3MgbGlmZS10aW1lLiBJdAogIGltcHJvdmVzIHBlcmZvcm1hbmNlLgoKLSBGaXhlZCBhIHByb2JsZW0gd2hlbiBkaXNwbGF5aW5nIHZlcmJvc2UgZm9yIGlwdjYtZW5hYmxlZCBsaWJjdXJscyBhbmQKICByZS11c2VkIGNvbm5lY3Rpb25zLiBQcm9ibGVtIHJlcG9ydGVkIGFuZCBmaXggdmVyaWZpZWQgYnkgR3JpZ29yeSBFbnRpbi4KCi0gSmVmZiBMYXdzb24gZml4ZWQgdGhlIHZlcnNpb24tY2hlY2sgaW4gdGhlIFNPQ0tTNSBjb2RlLgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDA0KQotIEZpeGVkIGEgY2FzZSB3aGVyZSBhIGhvc3QgY2FjaGUgZW50cnkgd2FzIG5vdCBmbGFnZ2VkIGluLXVzZSBwcm9wZXJseSB3aGVuIGEKICBjYWNoZWQgZW50cnkgd2FzIHVzZWQuCgotIEFuZHLpcyBHYXJj7WEncyBwYXRjaCB0aGF0IGNoZWNrcyBmb3Igd2lubW0gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2FzCiAgYXBwbGllZC4KCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwNCkKLSBCZW4gR3JlZWFyJ3MgU09fQklORFRPREVWSUNFIHBhdGNoIGZvciB0aGUgYmluZGluZyBvZiB0aGUgbG9jYWwgZW5kIHRvIGEKICBzcGVjaWZpYyBuZXR3b3JrIGludGVyZmFjZS4KCi0gR3JlZyBIZXdnaWxsIGZvdW5kIG91dCB0aGF0IHRoZSB2YXJpYWJsZSBob2xkaW5nICdjb250ZW50bGVuZ3RoJyB3YXNuJ3QgYmlnCiAgZW5vdWdoIHRvIGhvbGQgYSBsYXJnZSBmaWxlIQoKLSBUb3IgQXJudHNlbiBmaXhlZCBhIDY0Yml0LXJlbGF0ZWQgcHJvYmxlbSBpbiBkYXRlLXJlbGF0ZWQgY29kZSBpbiB0aGUgZnRwCiAgZGVwYXJ0bWVudCwgYW5kIHRoZXJlIHdhcyBhbm90aGVyIHBvdGVudGlhbCBwcm9ibGVtIGluIHRoZSBuYW1lIHJlc29sdmUgY29kZQogIHRvby4KCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwNCkKLSBSZW1vdmVkIGEgZmV3IHZhcmlhYmxlcyB0aGF0IHdlcmUgb25seSBzZXQgYnV0IG5ldmVyIHVzZWQsIGFzIHNvbWUgY29tcGlsZXJzCiAgd2FybiBhYm91dCB0aGF0IGFuZCB3ZSBkbyBub3QgbGlrZSBjb21waWxlciB3YXJuaW5ncyEKCi0gUmVtb3ZlZCB0aGUgbmVlZCBmb3Igc3ltbGlua3MgaW4gdGhlIHRlc3RzL2RhdGEgZGlyZWN0b3J5IGlmIGN1cmwgaXMgYnVpbHQKICBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFuZCB0aGUgJ21ha2UgdGVzdCcgaXMgdXNlZC4gVGhpcyB3YXMgZG9uZQogIGJ5IHByb3ZpZGluZyBhICJzb3VyY2UgZGlyIHBhdGgiIHRvIHRoZSBzY3JpcHRzL3NlcnZlcnMuCgotIE5vdywgaWYgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2FuJ3QgZmluZCBhbiBucm9mZiB0b29sIG9yIGFuIG9wdGlvbiB0byBucm9mZgogIHRvIHVzZSB0byBjb252ZXJ0IG1hbiBwYWdlcyB3aXRoLCBpdCB3aWxsIGNvbXBsZXRlbHkgc3dpdGNoIG9mZiB0aGUgYnVpbHQtaW4KICBtYW51YWwuCgotICdjb25maWd1cmUgLS1kaXNhYmxlLW1hbnVhbCcgY29tcGxldGVseSBkaXNhYmxlcyB0aGUgYnVpbHQtaW4gbWFudWFsIGZyb20KICB0aGUgY3VybCBjb21tYW5kIHRvb2wuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgbWlub3Igc291cmNlIGVkaXQsIGFuZCBub3cKICBoZSBoYXMgbWFuYWdlZCB0byBnZXQgbXN5cy9taW5ndyB0byBydW4gY29uZmlndXJlIGFuZCB0aGVuIGJ1aWxkIQoKRGFuaWVsICg5IEZlYnJ1YXJ5IDIwMDQpCi0gVGhlIGRlZmF1bHQgSFRUUCBBY2NlcHQ6IGhlYWRlciB3YXMgbW9kaWZpZWQgdG8gdGhlIG11Y2ggc2ltcGxlcgogICJBY2NlcHQ6ICovKiIuCgotIFAgUiBTY2hhZmZuZXIgdXBkYXRlZCB0aGUgY3VybC1zc2wgc3BlYyBmaWxlIGZvciBSUE1zLgoKLSBEb21pbmljayBNZWdsaW8gYnJvdWdodCBsb3RzIG9mIGRvY3VtZW50YXRpb24gZm9yIHRoZSBzaGFyZSBpbnRlcmZhY2UncyBtYW4KICBwYWdlcyB0aGF0IHdlcmUgcHJldmlvdXNseSBtaXNzaW5nLgoKLSBUb3IgQXJudHNlbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgbGliY3VybCB3b3JrLWFyb3VuZCBhIGJ1ZyBpbiB0aGUKICBBSVg1IGltcGxlbWVudGF0aW9uIG9mIGdldGFkZHJpbmZvKCkuIFRoaXMgbWFrZXMgdGhlIEZUUCBQT1JUIHN0dWZmIHdvcmsgb24KICBpcHY2LWVuYWJsZWQgQUlYIGJ1aWxkcy4KCi0gS2VuIFJhc3RhdHRlciBwcm92aWRlZCBwb3J0YWJpbGl0eSBmaXhlcyBmb3IgdGhlIGN1cmxndGsuYyBleGFtcGxlLCBhbmQgbm93CiAgaXQgcnVucyBvbiB3aW5kb3dzIHdpdGggR1RLIGFzIHdlbGwhCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCBnZXRob3N0YnluYW1lKCkgZmluZSB3aGVuIHJ1bgogIHdpdGggbWluZ3cgb24gd2luZG93cy4KCi0gTW9kaWZpZWQgdGhlIGxkYXAgY29kZSB0byB1c2UgcHJvcGVyIGZ1bmN0aW9uIHBvaW50ZXJzIGFsbCBvdmVyIChpbnN0ZWFkIG9mCiAgbWl4ZWQgZGF0YSBhbmQgZnVuY3Rpb24gcG9pbnRlcnMpIHRvIHdvcmstYXJvdW5kIHRoZSBwaWNreSBNSVBTUHJvIGNvbXBpbGVyCiAgd2FybmluZ3MuCgotIEEgY3VzdG9tIEhvc3Q6IGhlYWRlciBpcyBvbmx5IGNvbnNpZGVyZWQgaWYgdGhlIHJlcXVlc3QgaXMgbm90IG1hZGUgYnkKICBmb2xsb3dpbmcgYSBsb2NhdGlvbi4gQWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBUaW0gQmFrZXIuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNCkKLSBUaGUgbGlieiBwYXJ0IG9mIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBvbmx5IHNldCB0aGUgdHdvIGxpYnotcmVsYXRlZAogIGRlZmluZSBIQVZFX1pMSUJfSCBhbmQgSEFWRV9MSUJaIGlmIGJvdGggdGhlIGxpYiBhbmQgdGhlIGhlYWRlciBpcyBmb3VuZC4KICBJZiBvbmUgaXMgbWlzc2luZywgbm9uZSBvZiB0aGUgZGVmaW5lcyBpcyBzZXQuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIE1pbmd3IG1ha2VmaWxlcy4KCi0gTGVuIEtyYXVzZSByZXBvcnRlZCB0aGF0IGN1cmwgNy45LlggY291bGQgZG8gdXBsb2FkaW5nIGZyb20gc3RkaW4gd2l0aG91dAogIGRvaW5nIGNodW5rZWQgZW5jb2RpbmcsIHdoaWNoIGN1cnJlbnQgY3VybCBjYW5ub3QgZG8gZXZlbiBpZiB5b3UgZGlzYWJsZQogIHRoZSB0cmFuc2Zlci1lbmNvZGluZyBjaHVua2VkIGhlYWRlci4gTm93IGl0IGNhbiBhZ2FpbiwgYW5kIHRlc3QgY2FzZSA5OAogIHZlcmlmaWVzIHRoaXMgZnVuY3Rpb25hbGl0eS4KCi0gVG9yIEFybnRzZW4gZml4ZWQgYSB3ZWlyZCBnZXRhZGRyaW5mbygpIHVzYWdlIGluIHRoZSBGVFAgY29kZSwgcHJldmVudGluZwogIHRoZSBpcHY2LWNvZGUgZm9yIFBPUlQgd29yayBvbiBBSVggNS4yLiBXZSBub3cgYWxzbyBwcm92aWRlIChiZXR0ZXIpIGVycm9yCiAgbWVzc2FnZXMgd2hlbiBiYWlsaW5nIG91dCBpbiB0aGUgdGhhdCBmdW5jdGlvbi4KCi0gVG9yIEFybnRzZW4gbm93IHByb3ZpZGVzIEFJWCBhbmQgSVJJWCAodXNpbmcgZ2NjLCB4bGMgYW5kIHRoZSBNSVBTUHJvCiAgY29tcGlsZXJzKSBhdXRvbWF0ZWQgYnVpbGQgbG9ncyAoaHR0cDovL2N1cmwuaGF4eC5zZS9hdXRvLykgYW5kIHdlJ3ZlIGZpeGVkCiAgbnVtZXJvdXMgbWlub3IgcXVpcmtzIHRvIG1ha2UgbGVzcyB3YXJuaW5ncyBhcHBlYXIuCgpEYW5pZWwgKDQgRmVicnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdpbGFkLCB3ZSBub3cgdXNlIHRoZSBjdXN0b20gdGltZW91dHMgd2hlbiB3YWl0aW5nIGZvciBhCiAgc2VydmVyIHRvIGNvbm5lY3Qgd2hlbiB1c2luZyBGVFAgUE9SVC4gUHJldmlvdXNseSB3ZSBhbHdheXMgd2FpdGVkIDEwCiAgc2Vjb25kcywgbm8gbW9yZSBubyBsZXNzLiBXZSBub3cgYWxzbyBjaGFuZ2VkIHRoZSBkZWZhdWx0IChpZiBubyB0aW1lb3V0IGlzCiAgc2V0KSB0byB3YWl0IDYwIHNlY29uZHMgZm9yIHRoZSBjb25uZWN0IGJlZm9yZSB3ZSBmYWlsLgoKRGFuaWVsICgzIEZlYnJ1YXJ5IDIwMDQpCi0gTW9kaWZpZWQgdG8gbGluayB3aXRoIGMtYXJlcyBpbnN0ZWFkIG9mIGFyZXMuCgpEYW5pZWwgKDIgRmVicnVhcnkgMjAwNCkKLSBBZGRlZCBhIGNvbmZpZ3VyZSB0ZXN0IHRvIGNoZWNrIGZvciB3aGljaCBvcHRpb24gdGhlIChnKW5yb2ZmIHRvb2wgd2FudHMKICB0byBleHRyYWN0IHBsYWluIHRleHQgZnJvbSB0aGUgbWFuIHBhZ2VzLiBUb3IgQXJudHNlbiB0b2xkIHVzIHRoZSBBSVgKICB2ZXJzaW9uIG9mIEdOVSBnbnJvZmYgZG9lc24ndCBzdXBwb3J0IC1tYW4hCgotIEFkZGVkIGFuIHVuZGVmIG9mIGFjY2VwdCBpbiBtZW1kZWJ1Zy5oIHRvIG1ha2UgY3VybCBidWlsZCB3aXRoIC0tZW5hYmxlLWRlYnVnCiAgb24gQUlYIDUuMiB3aGljaCBzZWVtcyB0byBoYXZlIGFjY2VwdCBkZWZpbmVkLiBSZXBvcnRlZCBieSBUb3IgQXJudHNlbi4KCi0gY3VybF92ZXJzaW9uKCkgbm93IGluY2x1ZGVzIGMtYXJlcyB2ZXJzaW9uIGluZm8sIGFuZCBjdXJsX3ZlcnNpb25faW5mbygpIG5vdwogIHJldHVybnMgYSBzdHJ1Y3Qgd2l0aCB2ZXJzaW9uIFNFQ09ORCB0aGF0IGFsc28gaW5jbHVkZXMgdGhhdCBpbmZvLgoKLSBXZSBhcmUgbm93IG9mZmljaWFsbHkgdXNpbmcgYy1hcmVzIGZvciBhc3luY2ggbmFtZSByZXNvbHZlcy4gYy1hcmVzIGlzIHRoZQogIG5ldyBsaWJyYXJ5LCBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgYXJlcyBidXQgd2l0aCBhbiBleHRlbmRlZCBhbmQgc2xpZ2h0bHkKICBtb2RpZmllZCBBUEkuCgotIERpcmsgaW1wcm92ZWQgdGhlIGFyZXMgdGltZW91dCBjb2RlLCBhbmQgbm93IHdlIGFsc28gaW5jbHVkZSB0aGUgYXJlcyBlcnJvcgogIHN0cmluZyB3aGVuIHdlIGZhaWwgdG8gcmVzb2x2ZSBhIG5hbWUuCgotIEFub3RoZXIgdHdlYWsgdG8gbWFrZSB0ZXN0IGNhc2UgOTEgcnVuIGZpbmUuIE5vdyB3ZSBoYXZlIGFub3RoZXIgYml0IG9uIGEKICBjb25uZWN0aW9uIHRoYXQgaXMgc2V0IHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbWFya2VkIGZvciAncmV0cnknLiBUaGF0CiAgbWFrZXMgdGhlIGNvbm5lY3Rpb24gZ2V0IGNsb3NlZCBhbmQgcmUtb3BlbmVkIGFuZCB0aGUgSFRUUC1kb25lIGNvZGUgbXVzdAogIG5vdCBjb21wbGFpbiBvbiB0aGUgZmFjdCB0aGF0IG5vIGRhdGEgd2FzIHJlY2VpdmVkLgoKLSBCYXNlZCBvbiBEaXJrIE1hbnNrZSdzIHBhdGNoLCBJIG1vZGlmaWVkIHRoZSBuYW1lIHJlc29sdmluZyB3aXRoIGFyZXMgdG8KICBmZWF0dXJlIGEgdGltZW91dCBmb3IgcmVhbGx5IHNsb3cgbG9va3Vwcy4gSXQgbm93IGRlZmF1bHRzIHRvIDMwMCBzZWNvbmRzLAogIGJ1dCBpcyBub3cgYWRqdXN0ZWQgdG8gdGhlIENPTk5FQ1RUSU1FT1VUL1RJTU9VRSB0aW1lb3V0cyBpZiBvbmUgb2YgdGhlbQogIGlzIHNldC4KCi0gRml4ZWQgdGhlIGluY2x1c2lvbiBvZiBjYS1idW5kbGUuaCB0byByZWFsbHkgdXNlIHRoZSBvbmUgaW4gdGhlIGJ1aWxkIGRpcgogIGJlZm9yZSB0aGUgb25lIGluIHRoZSBzb3VyY2UgZGlyLiBEb21lbmljbyBBbmRyZW9saSBmb3VuZCBvdXQgYW5kIHJlcG9ydGVkLgoKLSBBZGRlZCB0ZXN0IGNhc2UgOTcsIGEgc2ltcGxlIFBPU1Qgd2l0aCBhIGN1c3RvbSBDb250ZW50LVR5cGUgaGVhZGVyCiAgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgb25lLgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDQpCi0gQWRkZWQgY29kZSB0aGF0IGF0dGVtcHRzIHRvIGZpeCB0aGUgdGVzdCA5MSBmYWlsdXJlLiBBcyBoYXMgYmVlbiBmaWd1cmVkIG91dAogIGJ5IFBhdHJpY2sgU21pdGgsIHRoZSBlcnJvciBoYXBwZW5zIGJlY2F1c2Ugd2UgcmUtdXNlIGEgY29ubmVjdGlvbiB0aGF0IHRoZQogIHNlcnZlciBpcyBqdXN0IGFib3V0IHRvIGNsb3NlIGFuZCB3ZSBldmVuIG1hbmFnZSB0byBzZW5kIGF3YXkgdGhlIHJlcXVlc3QKICB3aXRob3V0IHNlZWluZyBhbiBlcnJvci4gT24gdGhlIGZpcnN0IHJlYWQgYXR0ZW1wdCB3ZSBnZXQgYSBFQ09OTlJFU0VULgogIFN0YXJ0aW5nIG5vdywgd2UgYXR0ZW1wdCB0byBkZXRlY3QgdGhpcyBhbmQgaWYgc28sIHdlIHJldHJ5IHRoZSByZXF1ZXN0IG9uIGEKICBmcmVzaCBjb25uZWN0aW9uLgoKLSBJIGFkZGVkIHRlc3QgY2FzZSA1MTAgd2hpY2ggaXMgYSBjdXN0b20gcHJvZ3JhbSB0aGF0IGRvZXMgYSBQT1NUIHVzaW5nIGEKICByZWFkIGNhbGxiYWNrLCB3aXRoIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcuCgotIEFkanVzdGVkIG9uZSBvZiB0aGUgTVBFL2lYIGNoYW5nZXMgYXMgaXQgbWFkZSB0ZXN0IGNhc2UgNTA0IGZhaWwgYWxsIG92ZXIuCgotIEFkZGVkIC0tc29ja3MgYXMgYSByZWNvZ25pemVkIG9wdGlvbi4gSXQgd29ya3MganVzdCBsaWtlIC0tcHJveHkgYnV0IHNldHMgYQogIFNPQ0tTNSBwcm94eSB0byB1c2UuIFNPQ0tTNSBzdXBwb3J0IGhhcyBiZWVuIGF2YWlsYWJsZSBpbiBsaWJjdXJsIGZvciBhCiAgd2hpbGUsIGp1c3Qgbm90IHByb3ZpZGVkIGJ5IHRoZSBjdXJsIHRvb2wuIFRoaXMgZG9lcyBub3QgY3VycmVudGx5IHdvcmsgZm9yCiAgSVB2Ni1lbmFibGVkIGxpYmN1cmxzLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDQpCi0gU3RhZGxlciBTdGVwaGFuIHBvaW50ZWQgb3V0IHRoYXQgc3JjL2h1Z2VoZWxwLmMgaW5jbHVkZWQgY29uZmlnLmggd2l0aG91dAogIGNoZWNraW5nIHRoZSBkZWZpbmUgaWYgaXRzIHByZXNlbnQuLi4KCi0gS2VuIEhpcnNjaCBwcm92aWRlZCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIHRoZSBNUEUvaVggb3BlcmF0aW5nCiAgc3lzdGVtLgoKLSBEYW4gRmFuZHJpY2ggY29tcGlsZWQgY3VybCB3aXRoIGxvdHMgb2YgYWdncmVzc2l2ZWx5IHBlZGFudGljIGNvbXBpbGVyCiAgb3B0aW9ucyBhbmQgdGh1cyBmb3VuZCBhIGZldyBtaW5vciBlcnJvcnMgYW5kIGRpZCBzb21lIGdlbmVyYWwgY2xlYW51cHMgdG8KICBhdm9pZCB0aGVtLgoKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIGZsYXcgaW4gYXJlcyB0aGF0IHByZXZlbnRlZCBpdCB0byB1c2Ugbm9uLWJsb2NraW5nCiAgc29ja2V0cyBwcm9wZXJseS4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA0KQotIFJpY2hhcmQgQnJhbWFudGUgZml4ZWQgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGVkICJ1cGxvYWRzIiB0byBzZW5kIGEgZmluYWwKICBDUkxGIGNvbWJvIHByb3Blcmx5LgoKRGFuaWVsICgyNyBKYW51YXJ5IDIwMDQpCi0gTWFkZSB0aGUgcmVzcG9uc2UtaGVhZGVycyBkdXJpbmcgYSBDT05ORUNUIHJlcXVlc3QgdG8gYSBwcm94eSBnZXQgcGFzc2VkIG9uCiAgYXMgcmVndWxhciBoZWFkZXJzLCBzbyB0aGV5IGFwcGVhciB3aXRoIC1pLy1JIG9wdGlvbnMgYW5kIHNpbWlsYXIuCgotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR2lzbGUgVmFuZW0sIEkndmUgbWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZGlzcGxheQogIHByb3Blcmx5IHN3aXRjaCB0byBhIEdCLWRpc3BsYXkgd2hlbiBtb3JlIHRoYW4gOTk5OU1CIGhhdmUgYmVlbiB0cmFuc2ZlcmVkLgoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gcG9pbnRlZCBvdXQgYSBjdXJscmMgcGFyc2VyIHByb2JsZW0vY3Jhc2ggd2hlbiBhbiBvcHRpb24gd2l0aCBhCiAgcmVxdWlyZWQgZGlkbid0IGhhdmUgb25lIGFuZCB3YXMgb24gdGhlIGxhc3QgbGluZSBvZiBhIGZpbGUuCgotIE1vcmUgV2luZG93cyBmaXhlcyBmb3IgbGFyZ2UgZmlsZXMuIFdlIG5vdyBidWlsZCBhbmQgbGluayB3aXRoCiAgLi4vbGliL3N0cnRvb2ZmdC5jIGluIHRoZSBhcHAgY29kZSBzaW5jZSBDdXJsX3N0cnRvbGwoKSBpcyBub3QgYSBwcm92aWRlZAogIGxpYmN1cmwgZnVuY3Rpb24uLi4gUGVyaGFwcyB3ZSBzaG91bGQgY29uc2lkZXIgYSAnY29tbW9uJyBkaXIgb3Igc2ltaWxhcgogIHdoZXJlIHdlIHB1dCBzb3VyY2UgY29kZSB1c2VkIGluIGJvdGggdGhlIGxpYiBhbmQgdGhlIGNsaWVudC4gT3IgcGVyaGFwcwogIHdlJ2xsIGp1c3QgbWFrZSB0aGlzIGZ1bmN0aW9uIGF2YWlsYWJsZSBpbiB0aGUgbGlicmFyeS4uLgoKLSBWaW5jZW50IEJyb25uZXIgZm91bmQgb3V0IHRoZSBzb2NrczUgY29kZSBjcmFzaGVkIHdoZW4gbm8gdXNlcm5hbWUgd2FzCiAgc2V0LgoKLSBWaW5jZW50IEJyb25uZXIgc3BvdHRlZCBhIHByb2JsZW0gd2l0aCBwcm94eSB1c2VybmFtZS9wYXNzd29yZCB3aGVuIHJlLXVzaW5nCiAgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uCgotIEZpeGVkIHRoZSBwcm9ncmVzcyBtZXRlciBkaXNwbGF5IGZvciBmaWxlcyBsYXJnZXIgdGhhbiAyXjMxIGJ5dGVzLiBHaXNsZQogIFZhbmVtIHJlcG9ydGVkLgoKRGFuaWVsICgyMiBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gbWFkZSBzdHJ0b2xsKCkgZ2V0IHVzZWQgd2hlbiBjdXJsIGlzIGJ1aWx0IHdpdGggdGhlIG1pbmd3CiAgY29tcGlsZXIuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBjb21wcmVzc2VkIGhlbHAgdGV4dCBjb2RlIHRvIGRpc3BsYXkgcHJvcGVybHkuCgotIFJlbW92ZWQgdGhlICcjZGVmaW5lIEh0dHBQb3N0JyBmcm9tIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUsIGFzIGN1cmxfaHR0cHBvc3QKICBpcyB0aGUgcHJvcGVyIG5hbWUgYW5kIGl0IGhhcyBiZWVuIGZvciBxdWl0ZSBzb21lIHRpbWUgbm93LiBGaXhlcyBhbm90aGVyCiAgbmFtZSBzcGFjZSBwb2xsdXRpb24uCgotIEFkZGVkICdjdXJsX29mZl90JyB0eXBlZGVmIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUsIHRvIGJlIHVzZWQgdG8gcHJvdmlkZQogIGxhcmdlIGZpbGUgc2l6ZXMgdG8gdGhlICpfTEFSR0Ugb3B0aW9ucy4gQWRqdXN0ZWQgdGhlIGNvZGUgYWxsIG92ZXIgdG8gdXNlCiAgdGhpcyB2YXJpYWJsZSB0eXBlIGluc3RlYWQgb2YgJ29mZl90Jy4gVGhpcyBpcyBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlIGxhcmdlCiAgZmlsZSBzdXBwb3J0IHdvcmsgb24gbW9yZSBwbGF0Zm9ybXMuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgdGhlCiAgc2l6ZSBvZiB0aGUgY3VybF9vZmZfdCBpbnN0ZWFkIG9mIHRoZSBwbGFpbiBvZmZfdC4KClZlcnNpb24gNy4xMS4wICgyMiBKYW51YXJ5IDIwMDQpCgpEYW5pZWwgKDIxIEphbnVhcnkgMjAwNCkKLSBSZW1vdmVkIHRoZSBkZWZpbmVzIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUgd2l0aCBUSU1FQ09ORF8gcHJlZml4ZXMuIFRoZXkKICBoYXZlIGJlZW4gb2Jzb2xldGUgc2luY2UgQXByaWwgMjJuZCAyMDAyLCBhbmQgaWYgdGhpcyBjYXVzZXMgYW55b25lIGFueQogIHByb2JsZW1zIG5vdyBpdCBpcyB2ZXJ5IGVhc3kgdG8ganVzdCBhZGQgQ1VSTF8gdG8gdGhlIG5hbWVzLiBUaGlzIGNvcnJlY3RzCiAgdGhpcyBuYW1lIHNwYWNlIHBvbGx1dGlvbi4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA0KQotIERhdmlkIEJ5cm9uIGNsZWFuZWQgdXAgaG93IC0tdHJhY2Ugd2l0aCBubyBvcHRpb24gd2FzIHRyZWF0ZWQsIGFuZCBhbHNvCiAgYXJndW1lbnRzIGluIGEgY29uZmlnIGZpbGUgd2l0aG91dCBhIHJlcXVpcmVkIHBhcmFtZXRlciEKCkRhbmllbCAoMTYgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIGZpeGVkIGEgZmV3IGlzc3VlcyB3aGVyZSBjb21waWxlcnMgd2FybmVkIGFib3V0IHZhcmlhYmxlcwogIHBvc3NpYmx5IGJlaW5nIHVzZWQgdW5hc3NpZ25lZC4KCi0gTWlub3IgSW50ZXJpeCBidWlsZCBwcm9ibGVtIGZpeGVkLgoKRGFuaWVsICgxNSBKYW51YXJ5IDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHNvbWUgbmVjZXNzYXJ5IGVzY2FwaW5nIG5lZWRlZCBpbiB0aGUKICBhY2luY2x1ZGUubTQgZmlsZSB3aGVuIGF1dG9tYWtlIDEuOCBvciBsYXRlciBpcyB1c2VkLgoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDQpCi0gVmluY2VudCBCcm9ubmVyIGZpeGVkIHRoZSBDdXJsX3Jlc29sdigpIHJldHVybiBjb2RlLiBUaGlzIGV4dGVuZHMgdGhlIGZpeAogIFN0ZXZlIEdyZWVuIHByb3ZpZGVkIG9uIGRlY2VtYmVyIDMuLi4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA0KQotIEx1a2UgQ2FsbCBtYWRlIHRoZSB3aW4zMiB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcgZnVuY3Rpb24gc3VwcG9ydAogIGJhY2tzcGFjZS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHRoZSBodWdlaGVscCBzb3VyY2UgZmlsZSB0byBjb250YWluIGJvdGggYSBjb21wcmVzc2VkIGFuZAogIGFuIHVuY29tcHJlc3NlZCB2ZXJzaW9uIGluIHRoZSBkaXN0cmlidXRpb24sIHNvIHRoYXQgbW9yZSBwZW9wbGUgZWFzaWVyIGNhbgogIGJ1aWxkIGN1cmwgd2l0aCB0aGUgY29tcHJlc3NlZCB2ZXJzaW9uLgoKLSBEaWVnbyBDYXNvcnJhbiBicm91Z2h0IGFub3RoZXIgQW1pZ2FPUyBidWlsZCBwYXRjaCBmb3IgbmF0aXZlIEFtaWdhIGJ1aWxkcy4KCi0gTWF0dCBWZWVuc3RyYSB1cGRhdGVkIHRoZSBNYWMgT1MgWCBmcmFtZXdvcmsgZmlsZXMuCgotIEJyaWFuIFIgRHVmZnkgYnJvdWdodCBhIHNlY3Rpb24gdG8gdGhlIElOU1RBTEwgZmlsZSBvbiBob3cgdG8gYnVpbGQgYQogIFNTTC1lbmFibGVkIGN1cmwgdXNpbmcgdGhlIGZyZWUgQm9ybGFuZCBDKysgY29tcGlsZXIuIEhlIGFsc28gdXBkYXRlZCB0aGUKICBCb3JsYW5kIGxpYi9NYWtlZmlsZS5iMzIuCgotIEkgZml4ZWQgdGhlIHRlc3QgY2FzZSA1MDkgd2hpY2ggSSBicm9rZSB5ZXN0ZXJkYXkuIE5vdyB0aGUgbGlidGVzdCBhcmUKICBjb21waWxlZCB3aXRoIGFuIGluY2x1ZGUgcGF0aCB0aGF0IHBvaW50cyB0byB0aGUgbGlicmFyeSdzIHNvdXJjZSBkaXIsIHNvCiAgdGhhdCB0aGUgbGlidGVzdHMgY2FuIGluY2x1ZGUgZmlsZXMgZnJvbSB0aGUgc291cmNlIHRyZWUuIFRoaXMgd2FzIG1hZGUgdG8KICBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgVVNFX1NTTEVBWSBkZWZpbmUgaW4gdGhlIGxpYnJhcnkgdGVzdCBmaWxlcy4KCkRhbmllbCAoMTIgSmFudWFyeSAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBicm91Z2h0IGNvZGUgdGhhdCBub3cgYWxsb3dzIGEgY2FsbGJhY2sgdG8gbW9kaWZpZWQgdGhlIFVSTAogIGV2ZW4gd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIGlzIHVzZWQsIGFuZCB0aGVuIGxpYmN1cmwgd2lsbCBzaW11bGF0ZSBhCiAgImZvbGxvdyBsb2NhdGlvbiIgdG8gdGhhdCBuZXcgVVJMLiBUZXN0IDUwOSB3YXMgYWRkZWQgdG8gdGVzdCB0aGlzIGZlYXR1cmUuCgotIEV4dGVuZGVkIHRoZSB0aW1lIHdlIHJldHJ5IHNlcnZlcnMgaW4gdGhlIHRlc3Qgc2NyaXB0LCBhbmQgSSBhbHNvIG1hZGUgaXQKICByZXRyeSB0aGUgaHR0cHMgYW5kIGZ0cHMgc2VydmVycyBiZWZvcmUgdGhleSBhcmUgY29uc2lkZXJlZCBiYWQuIEkgYmVsaWV2ZQogIHRoZSBwcmV2aW91cyBhcHByb2FjaCBjb3VsZCB0dXJuIHByb2JsZW1hdGljIG9uIHJlYWxseSBzbG93IGhvc3RzLgoKVmVyc2lvbiA3LjExLjAtcHJlMSAoMTIgSmFudWFyeSAyMDA0KQoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDQpCi0gRG9taW5pY2sgTWVnbGlvIHBvaW50ZWQgb3V0IEZUUFMgc2hvdWxkIHVzZSBkZWZhdWx0IHBvcnQgOTkwIGFjY29yZGluZyB0bwogIElBTkEuCgpEYW5pZWwgKDggSmFudWFyeSAyMDA0KQotIEZpeGVkIHRoZSBTUE5FR08gY29uZmlndXJlIGNoZWNrIHRvIG5vdCB1c2UgLVIgb3Igb3RoZXIgbm9uLXBvcnRhYmxlIG9wdGlvbnMKICBpbiB0aGUgTERGTEFHUy4gUmVwb3J0ZWQgYnkgUGllcnJlIGluIGJ1ZyByZXBvcnQgIzg3MjkzMC4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDQpCi0gRGFuIEZhbmRyaWNoIHByb3ZpZGVkIGEgZml4IG9uIG91ciB6bGliIHVzYWdlLgoKLSBEYXZpZCBKIE1leWVyJ3MgcGF0Y2ggdGhhdCBpbnRyb2R1Y2UgbGFyZ2UgZmlsZSBzdXBwb3J0IHRvIGxpYmN1cmwgd2FzCiAgYXBwbGllZC4gTmV3IGN1cmxfZWFzeV9zZXRvcHQgb3B0aW9ucyB0aGF0IGFjY2VwdCAnb2ZmX3QnIGFyZ3VtZW50cyBhcmU6CgogIElORklMRVNJWkVfTEFSR0UKICBSRVNVTUVfRlJPTV9MQVJHRQogIE1BWEZJTEVTSVpFX0xBUkdFCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA0KQotIEJhc2VkIG9uIERvbWluaWNrIE1lZ2xpbydzIGNvbW1lbnRzLCBJIG1hZGUgb3VyIHByaXZhdGUgdmVyc2lvbiBvZgogIGdldHRpbWVvZmRheSgpIGRlY2xhcmVkIHN0YXRpYy4gVGhpcyB3b3VsZCBvdGhlcndpc2UgY29sbGlkZSB3aXRoIHRoZSBzYW1lCiAgZnVuY3Rpb24gaW4gb3RoZXIgbGlicyAobGlrZSBhcmVzIGZvciBleGFtcGxlKS4KCi0gQWRkZWQgRG9taW5pY2sgTWVnbGlvJ3MgZGVzY3JpcHRpb24gb24gaG93IHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCBhcmVzCiAgb24gd2luMzIuCkRhbmllbCAoMTkgRGVjZW1iZXIpCi0gQ1VSTE9QVF9JUFJFU09MVkUgd2FzIG5vdCBwb3NzaWJsZSB0byBzZXQuCgotIEdpc2xlIFZhbmVtIHVwZGF0ZWQgdGhlIGRqZ3BwIGJ1aWxkIGZpbGVzLgoKRGFuaWVsICgxOCBEZWNlbWJlcikKLSBKb2huIE1jR293YW4gcmVwb3J0ZWQgYSByZWRpcmVjdC1wcm9ibGVtIHRoYXQgaGFwcGVuZWQgaWYgYSBzaXRlIHVzZWQgYSBVUkwKICBsaWtlICJ1cmwuY29tP3Zhcj1jb250ZW50IiAod2l0aG91dCBhIHByb3BlciBzbGFzaCkgYW5kIGZyb20gdGhhdCBhZGRyZXNzCiAgcmVkaXJlY3RlZCB0aGUgdXNlci1hZ2VudCB0byBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkuCgotIERhdmlkIEJ5cm9uIG1hZGUgbGliY3VybCBidWlsZCBmaW5lIHdpdGggYm90aCB0aGUgLk5FVCBhbmQgVkM2IHZlcnNpb25zIG9mCiAgTVNWQwoKRGFuaWVsICgxNiBEZWNlbWJlcikKLSBVcGRhdGVkIHRlc3QgNTA2IHNpbmNlIGl0IHN0YXJ0ZWQgdG8gZmFpbCBhZnRlciB0aGUgY2FjaGUgcHJ1bmUgY2hhbmdlCiAgeWVzdGVyZGF5LiBJIGFsc28gY2hhbmdlZCBpdCBzbGlnaHRseSB0byBmZWF0dXJlIGEgY291bnRlciBpbiBlYWNoIGRlYnVnCiAgb3V0cHV0IGZvciBlYXNpZXIgdHJhY2luZy4KCkRhbmllbCAoMTUgRGVjZW1iZXIpCi0gT2xkIEROUyBjYWNoZSBlbnRyaWVzIGFyZSBub3cgb25seSBwcnVuZWQgYWZ0ZXIgY3VybCBpcyBkb25lIHdpdGggYSByZXF1ZXN0LAogIGFuZCBub3QgaW4gdGhlIGFjdHVhbCBuYW1lIHJlc29sdmUgY2FsbC4KCi0gY29ycmVjdGVkIHRoZSAtLWVuYWJsZS1hcmVzIHBhdGNoCgotIEdpdXNlcHBlIEF0dGFyZGkgZm91bmQgYW5kIGZpeGVkIGEgcHJvYmxlbSB3aXRoaW4gbGliY3VybCB0aGF0IHJlLXVzZWQKICBhbHJlYWR5IGZyZWVkIG1lbW9yeS4KCkRhbmllbCAoMTAgRGVjZW1iZXIpCi0gR2lzbGUgVmFuZW0gcmVwb3J0ZWQgdGhhdCB0aGUgZGljdCBzdXBwb3J0IHdhcyBicm9rZW4uIEkgYnJva2UgaXQgZHVyaW5nIG15CiAgZnRwcy1jaGFuZ2VzIG92ZXJoYXVsLiBJJ3ZlIG5vdyBhZGRlZCBhICdjdXJsYXNzZXJ0JyBmdW5jdGlvbiB0aGF0IGNhbiBiZQogIHVzZWQgdG8gdmVyaWZ5IGV4cHJlc3Npb25zLCB0byBwcmV2ZW50IGZ1dHVyZSBlcnJvcnMgb2YgdGhlIHNhbWUKICBraW5kLiBUaGV5J3JlIG9ubHkgcHJlc2VudCBpbiBkZWJ1Zy1idWlsZHMuCgotIERpZWdvIENhc29ycmFuIG1hZGUgY3VybCBhbmQgbGliY3VybCBwb3NzaWJsZSB0byBidWlsZCBuYXRpdmVseSAobm8gbW9yZQogIG5lZWQgZm9yIHRoZSBpeGVtdWwgbGlicmFyeSkgb24gQW1pZ2FPUy4KCi0gRG9taW5pY2sgTWVnbGlvIG1hZGUgY29uZmlndXJlIC0tZW5hYmxlLWFyZXMgc3VwcG9ydCBhIGdpdmVuIHBhdGggdG8gdGhlCiAgaW5zdGFsbGVkIGFyZXMgbGliLCBpbnN0ZWFkIG9mIGFsd2F5cyB1c2luZyBpdCBpbiB0aGUgY3VybCBzb3VyY2UgdHJlZS4KICBUaGlzIGFsc28gZml4ZWQgdGhlIGN1cmwtY29uZmlnIC0tbGlicyBvdXRwdXQuCgotIEVyaWMgUy4gUmF5bW9uZCBwYXRjaGVkIGEgdmVyeSBtaW5vciBtYW4gcGFnZSBmb3JtYXQgZXJyb3IgaW4KICBsaWJjdXJsLWVycm9ycy4zCgpEYW5pZWwgKDggRGVjZW1iZXIpCi0gRml4ZWQgdGhlIGZsYXcgdGhhdCBtYWRlIC1seiBhcHBlYXIgdHdpY2Ugb24gdGhlIGxpbmsgY29tbWFuZCBsaW5lLgoKLSBBZnRlciBjb3JyZXNwb25kZW5jZSB3aXRoIEdpc2xlIFZhbmVtLCBJIGNoYW5nZWQgdGhlICdjb25uZWN0aW9uIGFib3J0ZWQnCiAgZXJyb3IgdGV4dCB3aGVuIHRoZSBGVFAgcmVzcG9uc2UgcmVhZGVyIGZhaWxlZCB0byBtb3JlIHNwZWNpZmljbHkgaWRlbnRpZnkKICB3aGF0IHRoZSBwcm9ibGVtIGlzLgoKLSBCYXNlZCBvbiBhIHBhdGNoIGZyb20gRG9taW5pY2sgTWVnbGlvLCBjdXJsLWNvbmZpZyAtLWZlYXR1cmUgbm93IG91dHB1dHMKICAnQXN5bmNoRE5TJyBhcyBhIGZlYXR1cmUgaWYgbGliY3VybCB3YXMgYnVpbHQgd2l0aCBhcmVzLiBUaGUgZmVhdHVyZSBuYW1lCiAgaXMgdGhlIHNhbWUgdGhhdCAnY3VybCAtVicgb3V0cHV0cywgZm9yIHNpbXBsaWNpdHkuCgpEYW5pZWwgKDMgRGVjZW1iZXIpCi0gTWFydHkgS3VocnQgbWFkZSB0aGUgYnVpbGQgdXAtdG8tZGF0ZSBvbiBWTVMsIGFuZCBtb3ZlZCBtb3N0IG9mIHRoZSBWTVMtCiAgc3BlY2lmaWMgc3R1ZmYgaW4gdGhlIGNsaWVudCBjb2RlIHRvIGEgc2VwYXJhdGUgaGVhZGVyIGZpbGUuCgotIFN0ZXZlIEdyZWVuIGZpeGVkIGEgcmV0dXJuIGNvZGUgYnVnIGluIEN1cmxfcmVzb2x2KCksIHRoYXQgbWFkZSB0aGUgc29ja3M1CiAgY29kZSBmYWlsLgoKLSBzd2Fsa2F1cyBhdCB5YWhvby5jb20gcGF0Y2hlZCBsaWJjdXJsIHRvIGlnbm9yZSBDb250ZW50LUxlbmd0aDogaGVhZGVycwogIHdoZW4gVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQgaXMgdXNlZCwgYXMgbWFuZGF0ZWQgYnkgUkZDMjYxNi4KCkRhbmllbCAoMiBEZWNlbWJlcikKLSAtLWZ0cC1wYXN2IHdhcyBhZGRlZCwgd2hpY2ggc2VydmVzIHRoZSBvbmx5IHB1cnBvc2Ugb2Ygb3ZlcnJpZGluZyBhCiAgcHJldmlvdXNseSBzZXQgLS1mdHBwb3J0IG9wdGlvbi4gU3RhcnRpbmcgbm93LCAtLWZ0cC1wb3J0IGlzIGEgcmVjb2duaXplZAogIGFsaWFzIGZvciAtLWZ0cHBvcnQgZm9yIGNvbnNpc3RlbmN5LgoKLSBHaXVzZXBwZSBBdHRhcmRpIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2hvdWxkIHVzZSBNU0dfTk9TSUdOQUwgd2hlbiB3ZSB1c2UKICBzZW5kKCkgYW5kIHJlY3YoKS4gSSBhZGRlZCBjaGVja3MgZm9yIHRoZSBkZWZpbmUgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kCiAgYWRqdXN0ZWQgdGhlIGNvZGUgYWNjb3JkaW5nbHkuIElmIHRoZSBzeW1ib2wgaXMgcHJlc2VudCwgd2Ugd29uJ3QgYXR0ZW1wdAogIHRvIGlnbm9yZSB0aGUgU0lHUElQRSBzaWduYWwuCgpEYW5pZWwgKDEgRGVjZW1iZXIpCi0gTWF0aGlhcyBBeGVsc3NvbiBzZXQgdXAgYSBic2RmdHBkLXNzbCBzZXJ2ZXIgZm9yIG1lIGFuZCBJIGNvdWxkIG1ha2UgY3VybAogIHJ1biBmaW5lIGFnYWluc3QgaXRzIEZUUFMgaW1wbGVtZW50YXRpb24uIE5vdyB0aGVzZSBGVFBTLXJlbGF0ZWQgdGhpbmdzCiAgd29yazoKICAgbyBleHBsaWNpdCBhbmQgaW1wbGljaXQgRlRQUwogICBvIGFjdGl2ZSAoUE9SVCkgYW5kIHBhc3NpdmUgKFBBU1YpCiAgIG8gdXBsb2FkIGFuZCBkb3dubG9hZAogICBvIHZlcmlmaWVkIGFnYWluc3QgYnNkZnRwZC1zc2wgYW5kIFJhaWRlbkZUUEQKCkRhbmllbCAoMjcgTm92ZW1iZXIpCi0gSmFtZXMgQ2xhbmN5IG1hZGUgdGhlIEJvcmxhbmQgTWFrZWZpbGVzIHVwIHRvIGRhdGUuCgotIE1hcmt1cyBNb2VsbGVyIGltcHJvdmVkIHRoZSBTUE5FR08gZGV0ZWN0aW9uIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKRGFuaWVsICgyNSBOb3ZlbWJlcikKLSBEYXZlIE1heSBmaWxlZCBidWcgcmVwb3J0ICM4NDgzNzEsIGlkZW50aWZ5aW5nIHRoYXQgaWYgeW91J2QgZG8gUE9TVCBvdmVyIGEKICBwcm94eSB0byBhIGh0dHBzIHNlcnZlciwgbGliY3VybCBkaWRuJ3QgUE9TVCBhdCBhbGwsIGl0IGp1c3QgbWFkZSBhIEdFVCEgSXQKICB0dXJuZWQgb3V0IHRvIGJlIGJlY2F1c2UgbGliY3VybCB3cm9uZ2x5IGRpZG4ndCBjb25zaWRlciB0aGUgYXV0aGVudGljYXRpb24KICAibmVnb3RpYXRpb24gcGhhc2UiIHRvIGJlIGNvbXBsZXRlIHlldC4KCiAgSSBhZGRlZCB0ZXN0IGNhc2UgOTUgdG8gdmVyaWZ5IG15IGZpeCBmb3IgdGhpcy4KCkRhbmllbCAoMjQgTm92ZW1iZXIpCi0gVGhhbmtzIHRvIE1hdGhpYXMgQXhlbHNzb24sIEkndmUgYmVlbiBhYmxlIHRvIHdvcmsgb24gRlRQUyBmb3IgbGliY3VybCBhbmQgaXQKICBzZWVtcyB0byB3b3JrIHNvbWV3aGF0IGZpbmUgbm93LgoKICBUaGUgRlRQUyBzdHVmZiBpcyBiYXNlZCBvbiBSRkMyMjI4IGFuZCB0aGUgbXVycmF5LWF1dGgtZnRwLXNzbCBkcmFmdAogICh2ZXJzaW9uIDEyKS4gVGhlcmUgc2VlbXMgdG8gZXhpc3QgcXVpdGUgYSBmZXcgc2VydmVycyB0aGF0IGhhdmUgaW1wbGVtZW50ZWQKICB0aGUgc2VydmVyIHNpZGUgb2YgdGhpcy4KCiAgV2UgY2FuIG5vdyB1c2UgZnRwczovLyBVUkxzIHRvIGV4cGxpY2l0bHkgc3dpdGNoIG9uIFNTTC9UU0wgZm9yIHRoZSBjb250cm9sCiAgY29ubmVjdGlvbiBhbmQgdGhlIGRhdGEgY29ubmVjdGlvbiAoZGVhbGluZyB3aXRoIHR3byBTU0wgY29ubmVjdGlvbnMgZm9yY2VkCiAgbWUgdG8gY2hhbmdlIGEgbG90IG9mIHN0dWZmIGluIGxpYmN1cmwpLgoKICBBbHRlcm5hdGl2ZWx5LCBhbmQgd2hhdCBzZWVtcyB0byBiZSB0aGUgcmVjb21tZW5kZWQgd2F5LCB3ZSBjYW4gc2V0IHRoZSBuZXcKICBvcHRpb24gQ1VSTE9QVF9GVFBfU1NMIHRvIG9uZSBvZiB0aGVzZSB2YWx1ZXM6CgogICAgIENVUkxGVFBTU0xfTk9QRSwgICAtIGRvIG5vdCBhdHRlbXB0IHRvIHVzZSBTU0wKICAgICBDVVJMRlRQU1NMX1RSWSAgICAgLSB0cnkgdXNpbmcgU1NMLCBwcm9jZWVkIGFueXdheSBvdGhlcndpc2UKICAgICBDVVJMRlRQU1NMX0NPTlRST0wgLSBTU0wgZm9yIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gb3IgZmFpbAogICAgIENVUkxGVFBTU0xfQUxMICAgICAtIFNTTCBmb3IgYWxsIGNvbW11bmljYXRpb24gb3IgZmFpbAoKICBBbnkgZmFpbHVyZSB0byBzZXQgdGhlIGRlc2lyZWQgbGV2ZWwgd2lsbCBtYWtlIGxpYmN1cmwgZmFpbCB3aXRoIHRoZSBlcnJvcgogIGNvZGUgQ1VSTEVfRlRQX1NTTF9GQUlMRUQuIFRoaXMgbmV3IG9wdGlvbiBtYWtlcyBhICJub3JtYWwiIGZ0cDovLyB0cmFuc2ZlcgogIGF0dGVtcHQgdG8gYmUgbWFkZSBzZWN1cmVseS4KCiAgSSd2ZSBiZWVuIGFibGUgdG8gbG9naW4gYW5kIGdldCBmaWxlcyAocGFzc2l2ZWx5KSBmcm9tIE1hdGhpYXMnIHNlcnZlciB1c2luZwogIGJvdGggZnRwczovLyBhbmQgQ1VSTE9QVF9GVFBfU1NMLiAoSSd2ZSBtYWRlICdjdXJsJyB1bmRlcnN0YW5kIHRoZSAtLWZ0cC1zc2wKICBvcHRpb24gdGhhdCBzZXRzIENVUkxGVFBTU0xfVFJZLikKCi0gR2F6IElxYmFsIGZpeGVkIGEgcmFuZ2Ugc3RyaW5nIG1lbW9yeSBsZWFrLgoKLSBHaXNsZSBWYW5lbSBmaXhlZCB0aGUgV2luZG93cyBidWlsZHMuCgotIEFkZGVkIHRoZSBuZXcgRlRQU1NMIGRlZmluZXMgaW4gY3VybC9jdXJsLmgKCkRhbmllbCAoMjAgTm92ZW1iZXIpCi0gSm9zaCBLYXBlbGwgZmlsZWQgYnVnIHJlcG9ydCAjODQ1MjQ3IGFzIGhlIGZvdW5kIGFuIGVuZGxlc3MgbG9vcCB3aGVuCiAgZ2V0dGluZyBhIDQwNyBiYWNrIGZyb20gYSBwcm94eSB3aGVuIG5vIHVzZXIrcGFzc3dvcmQgd2FzIGdpdmVuLiBBZGRlZCB0ZXN0CiAgY2FzZSA5NCB0byB2ZXJpZnkgdGhlIGZpeC4KCkRhbmllbCAoMTkgTm92ZW1iZXIpCi0gS2V2aW4gUm90aCBmaXhlZCBhIHByb2dyZXNzLWJhciBwcm9ibGVtIG9uIFdpbmRvd3MuCgotIFdoaWxlIHdvcmtpbmcgd2l0aCBOaWNvbGFzIENyb2lzZXQncyBidWcgcmVwb3J0ICM4NDM3MzksIEkgbm90aWNlZCB0d28gbWlub3IKICBwcm9ibGVtcyByZWxhdGVkIHRvIGZ0cCBwYXJ0aWFsIGRvd25sb2FkczogaWYgYSBwYXJ0aWFsIHRyYW5zZmVyIGlzCiAgZGV0ZWN0ZWQsIHdlIG11c3QgY2xvc2UgdGhlIGNvbm5lY3Rpb24gYXMgd2UgY2Fubm90IGtub3cgaW4gd2hhdCBzdGF0ZSBpdCBpcwogIGFueW1vcmUuIFRoaXMgbG9va3MgbGlrZSBhIFByb0ZUUEQgYnVnOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwMy0xMS8wMDc5Lmh0bWwKCkRhbmllbCAoMTcgTm92ZW1iZXIpCi0gTWFjaWVqIFcuIFJvenlja2kgbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCB1c2UgYSBjYWNoZSB2YXJpYWJsZSBmb3IgdGhlCiAgd3JpdGFibGUgYXJndiB0ZXN0LiBUaGlzIHdheSwgdGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYmV0dGVyIChmb3IKICBjcm9zcy1jb21waWxlcyBldGMpCgpEYW5pZWwgKDE1IE5vdmVtYmVyKQotIE1hdGhpYXMgQXhlbHNzb24gZm91bmQgb3V0IGxpYmN1cmwgc29tZXRpbWVzIGZyZWVkIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUKICB0d2ljZSwgbGVhZGluZyB0byBjcmFzaGVzIQoKRGFuaWVsICgxNCBOb3ZlbWJlcikKLSBTaWRkaGFydGhhIFByYWthc2ggSmFpbiBmb3VuZCBhIGNhc2Ugd2l0aCBhIGJhZCByZXNvbHZlIHRoYXQgd2UgZGlkbid0CiAgcHJvcGVybHkgYmFpbCBvdXQgZnJvbSwgd2hlbiB1c2luZyBhcmVzLgoKRGFuaWVsICgxMyBOb3ZlbWJlcikKLSBEZWZhdWx0IENvbnRlbnQtVHlwZSBmb3IgcGFydHMgaW4gbXVsdGlwYXJ0IGZvcm1wb3N0cyBoYXMgY2hhbmdlZCB0bwogICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLiAgVGhpcyBzZWVtcyBtb3JlIGFwcHJvcHJpYXRlLCBhbmQgSSBiZWxpZXZlCiAgbW96aWxsYSBhbmQgdGhlIGxpa2VzIGRvIHRoaXMuIEluIHRoZSBzYW1lIGFyZWE6IC5odG1sIGZpbGVzIG5vdyBnZXQKICB0ZXh0L2h0bWwgYXMgQ29udGVudC1UeXBlLiAoUG9pbnRlZCBvdXQgaW4gYnVnIHJlcG9ydCAjODM5ODA2KQoKLSBHaXNsZSBWYW5lbSBjb3JyZWN0ZWQgdGhlIC0tcHJvZ3Jlc3MtYmFyIG91dHB1dCBieSBkb2luZyBhIGZsdXNoIG9mIHRoZQogIG91dHB1dCwgd2hpY2ggYXBwYXJlbnRseSBtYWtlcyBpdCBsb29rIGJldHRlciBvbiBhdCBsZWFzdCB3aW5kb3dzLCBidXQKICBwb3NzaWJseSBvdGhlciBwbGF0Zm9ybXMgdG9vLgoKLSBQZXRlciBTeWx2ZXN0ZXIgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gdGhlIGNvbm5lY3QgY29kZSwgd2hpY2ggbWFkZSB0aGUKICBtdWx0aSBpbnRlcmZhY2Ugb24gYSBpcHY2LWVuYWJsZWQgc29sYXJpcyBib3ggZG8gYmFkLiBUZXN0IGNhc2UgNTA0IHRvIGJlCiAgc3BlY2lmaWMuIEkndmUgc3BlbnQgc29tZSB0aW1lIHRvIGNsZWFuLXVwIHRoZSBDdXJsX2Nvbm5lY3Rob3N0KCkgZnVuY3Rpb24KICBub3cgdG8gdXNlIGxlc3MgZHVwbGljYXRlZCBjb2RlIGZvciB0aGUgdHdvIGRpZmZlcmVudCBzZWN0aW9uczogaXB2NiBhbmQKICBpcHY0LgoKRGFuaWVsICgxMSBOb3ZlbWJlcikKLSBBZGRlZCBDVVJMT1BUX05FVFJDX0ZJTEUuIFVzZSB0aGlzIHRvIHRlbGwgbGliY3VybCB3aGljaCBmaWxlIHRvIHVzZSBpbnN0ZWFkCiAgb2YgdHJ5aW5nIHRvIGZpbmQgYSAubmV0cmMgaW4gdGhlIGN1cnJlbnQgdXNlcidzIGhvbWUgZGlyZWN0b3J5LiBUaGUKICBleGlzdGluZyAubmV0cmMgZmlsZSBmaW5kZXIgaXMgc29tZXdoYXQgbmFpdmUgYW5kIGlzIGZhciBmcm9tIHBlcmZlY3Qgb24KICBzZXZlcmFsIHBsYXRmb3JtcyB0aGF0IGFyZW4ndCB1bml4LXN0eWxlLiBJZiB0aGlzIG9wdGlvbiBpc24ndCBzZXQgd2hlbgogIENVUkxPUFRfTkVUUkMgaXMgc2V0LCB0aGUgcHJldmlvdXMgYXBwcm9hY2ggd2lsbCBzdGlsbCBiZSB1c2VkLgoKICBUaGUgY3VycmVudCAubmV0cmMgY2hlY2sgY29kZSBub3cgYWxzbyBzdXBwb3J0IGxvbmdlciB0aGFuIDI1NiBieXRlcyBwYXRoCiAgbmFtZXMuCgpEYW5pZWwgKDEwIE5vdmVtYmVyKQotIEthbmctSmluIExlZSBwb2ludGVkIG91dCB0aGF0IHRoZSBnZW5lcmF0ZWQgY2EtYnVuZGxlLmggZmlsZSBzaG91bGRuJ3QgYmUKICB3cml0dGVuIGluIHRoZSBzb3VyY2UgZGlyIGlmIGEgZGlmZmVyZW50IGJ1aWxkIGRpciBpcyB1c2VkLgoKLSBBZnRlciBT6WJhc3RpZW4gV2lsbGVtaWpucycgYnVnIHJlcG9ydCwgd2Ugbm93IGNoZWNrIHRoZSBzZXBhcmF0b3JzIHByb3Blcmx5CiAgaW4gdGhlIDIyOS1yZXBseSBzZXJ2ZXJzIHJlc3BvbmQgb24gYSBFUFNWIGNvbW1hbmQgYW5kIGJhaWwgb3V0IGJldHRlciBpZgogIHRoZSByZXBseSBzdHJpbmcgaXMgbm90IFJGQzI0MjgtY29tcGxpYW50LgoKRGFuaWVsICg3IE5vdmVtYmVyKQotIEJhc2VkIG9uIEdpc2xlIFZhbmVtJ3MgcGF0Y2gsIEkgbWFkZSBjdXJsIHRyeSBoYXJkZXIgdG8gZ2V0IHRoZSBob21lCiAgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IHVzZXIsIGluIG9yZGVyIHRvIGZpbmQgdGhlIGRlZmF1bHQgLmN1cmxyYyBmaWxlLgogIFdlJ3JlIGFsc28gY29uc2lkZXJpbmcgbW92aW5nIG91dCB0aGUgSE9NRS1kaXIgY29kZSBmcm9tIGxpYmN1cmwsIGFuZAogIGluc3RlYWQgaGF2ZSB0aGUgYXBwIHBhc3MgaW4gdGhlIHBhdGggdG8gdGhlIC5uZXRyYyBmaWxlICh3aGljaCBpcyB0aGUgb25seQogIGxvZ2ljIGxlZnQgaW4gbGliY3VybCB0aGF0IHVzZXMgdGhlIEhPTUUgZGlyKS4gVGhlbiBjdXJsIGNhbiB1c2UgdGhlIGhvbWUKICBkaXIgZm9yIHRoYXQgcHVycG9zZSB0b28uCgotIFJhbHBoIE1pdGNoZWxsJ3MgdXBkYXRlZCB0ZXN0Y3VybC5zaCB0byB0aGUgc2NyaXB0IHRvIHRha2UgYW4gZXhpc3RpbmcKICBkaXJlY3RvcnkgbmFtZSBhbmQgYnVpbGQvcnVuL3Rlc3QgY3VybCBpbiB0aGVyZSBpbnN0ZWFkIG9mIHRyeWluZyB0byB1cGRhdGUKICBmcm9tIENWUy4gVXNpbmcgdGhpcyBhcHByb2FjaCwgdGhlIHNjcmlwdCBjYW4gbm93IGJlIHVzZWQgdG8gdGVzdCBkYWlseQogIHRhcmJhbGxzIGV0Yy4KCi0gR2lzbGUgVmFuZW0gYWRkZWQgYSAicmVzb3VyY2UgZmlsZSIgdG8gdGhlIFdpbmRvd3MgRExMIGJ1aWxkcywgdG8gY29udGFpbgogIGluZm9ybWF0aW9uIHN1Y2ggYXMgdmVyc2lvbiBudW1iZXIsIGxpYnJhcnkgbmFtZSwgY29weXJpZ2h0IGluZm8gZXRjLgoKRGFuaWVsICg2IE5vdmVtYmVyKQotIGN1cmwgY2hlY2tzIGlmIHRoZSBleGlzdGluZyBsaWJjdXJsIHN1cHBvcnRzIHRoaW5ncyBsaWtlIC0tbnRsbSwgLS1uZWdvdGlhdGUKICBhbmQgLS1rcmI0IGFuZCByZXR1cm5zIGVycm9yIGlmIG5vdC4KCi0gSSBhZGRlZCB0aHJlZSBuZXcgZ2xvYmFsIGRlZmluZXMgaW4gdGhlIGN1cmwvY3VybC5oIGhlYWRlcjoKICBMSUJDVVJMX1ZFUlNJT05fTUFKT1IsIExJQkNVUkxfVkVSU0lPTl9NSU5PUiBhbmQgTElCQ1VSTF9WRVJTSU9OX1BBVENILiBUaGV5CiAgYXJlIHRoZSB0aHJlZSBudW1iZXJzIGluIHRoZSBsaWJyYXJ5J3MgdmVyc2lvbiBudW1iZXIsIHNlcGFyYXRlZCBmb3IgZWFzaWVyCiAgdXNhZ2UuICdtYWtldGd6JyB3YXMgdXBkYXRlZCBhY2NvcmRpbmdseSB0byBnZW5lcmF0ZSB0aGVzZSBudW1iZXJzIHByb3Blcmx5CiAgd2hlbiBidWlsZGluZyByZWxlYXNlLWFyY2hpdmVzLgoKLSBVbmluaXRpYWxpemVkIHZhcmlhYmxlIGZpeCwgcmVwb3J0ZWQgYnkgYm90aCBNYXJ0eSBLdWhydCBhbmQgQmVuamFtaW4KICBHZXJhcmQuCgotIE1hdHQgVmVlbnN0cmEgcHJvdmlkZWQgYnVpbGQgZmlsZXMgdG8gYnVpbGQgbGliY3VybCBhcyBhICJmcmFtZXdvcmsiIHVuZGVyCiAgTWFjIE9TIFguIFNlZSB0aGUgbGliL2xpYmN1cmwuZnJhbWV3b3JrLm1ha2UgZm9yIGRldGFpbHMuCgotIFJlbW92ZWQgdGhlIGRlZmluZXMgb2YgVFJVRSBhbmQgRkFMU0UgZnJvbSB0aGUgY3VybC9jdXJsLmggaGVhZGVyIGZpbGUuCiAgVGhleSdyZSBub3QgaW4gb3VyIG5hbWUgc3BhY2Ugc28gd2Ugc2hvdWxkIG5vdCBmaWRkbGUgd2l0aCB0aGVtLgoKRGFuaWVsICg1IE5vdmVtYmVyKQotIFJlcGxhY2VkIHRoZSBtYW4gcGFnZSB0byBIVE1MIGNvbnZlcnRlciBwcm9ncmFtIHdpdGggYSBuZXcgb25lOiByb2ZmaXQuCiAgTWFrZXMgbmljZXIgd2ViIHBhZ2VzLgoKRGFuaWVsICg0IE5vdmVtYmVyKQotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBmaXhlZCB0aGUgTVNWQyBtYWtlZmlsZXMgdG8gbGV0IHRoZW0gYnVpbGQgY3VybCBmaW5lCiAgb24gV2luZG93cy4KCi0gS2V2aW4gUm90aCBjb3JyZWN0ZWQgdGhlIGN5Z3dpbiBwYWNrYWdlIGdlbmVyYXRvciBhbmQgc3BlbGwtZml4ZWQgdGhlCiAgY29tbWVudCBpbiB0aGUgY2EtYnVuZGxlLmggZmlsZS4KClZlcnNpb24gNy4xMC44ICgxIE5vdmVtYmVyIDIwMDMpCgpEYW5pZWwgKDMxIE9jdG9iZXIpCi0gQXNzdW1lIHRoYXQgTURUTSBvbiBhbiBGVFAgc2VydmVyIHJldHVybnMgdGhlIHRpbWVzdGFtcCB1c2luZyB0aGUgVVRDIHRpbWUKICB6b25lLiBUaGlzIGNoYW5nZXMgdGhlIHRpbWUgQ1VSTElORk9fRklMRVRJTUUgcmV0dXJucyBmb3IgYSBnaXZlbiBmaWxlIG92ZXIKICBGVFAsIGFuZCB3aWxsIGNoYW5nZSBleGlzdGluZyB1c2VzIG9mIENVUkxPUFRfVElNRUNPTkRJVElPTi4gSXQgd2lsbCBtYWtlCiAgdGhlIGZ1bmN0aW9uYWxpdHkgbW9yZSBzaW1pbGFyIHRvIGhvdyB0aGUgSFRUUCBvbmUgaXMgYWxyZWFkeSB3b3JraW5nLgoKLSBDb21tYW5kIGxpbmUgb3B0aW9ucyB0aGF0IHRha2UgbnVtZXJpY2FsIHBhcmFtZXRlcnMgKHN1Y2ggYXMgLXksIC1ZLCAtQyBldGMpCiAgbm93IHJlcG9ydCBlcnJvciBhbmQgZXhpdCBpZiB0aGUgcGFyYW1ldGVyIGlzbid0IHRydWx5IGEgbnVtYmVyIGdyZWF0ZXIgdGhhbgogIG9yIGVxdWFsIHRvIHplcm8uIFRoaXMgaGVscHMgdXNlcnMgdG8gbm90aWNlIGJhZCB1c2FnZSBlYXJsaWVyLiBCZWZvcmUsIHdoZW4KICBhIHVzZXIgZm9yZ290IG9yIG1pc3NlZCB0byBhZGQgYSBudW1lcmljYWwgcGFyYW1ldGVyIHRvIGFuIG9wdGlvbiwgdGhlCiAgY29tbWFuZCBsaW5lIHBhcnNlciB3b3VsZCBzaW1wbHkgImVhdCIgdGhlIGZvbGxvd2luZyBvcHRpb24gYW5kIGl0IHdvdWxkCiAgY2F1c2UgZ3JlYXQgY29uZnVzaW9uLgoKRGFuaWVsICgzMCBPY3RvYmVyKQotIERhdmlkIEh1bGwgbWFkZSBsaWJjdXJsIGRlYWwgd2l0aCBOT0JPRFkgYW5kIEhFQURFUiBmb3IgZmlsZTovLyB0aGUgc2FtZSB3YXkKICBpdCBhbHJlYWR5IGRvZXMgZm9yIEZUUDogaXQgcHJvdmlkZXMgSFRUUC1sb29raW5nIGhlYWRlcnMgdGhhdCBwcm92aWRlIGluZm8KICBvbmx5IGFib3V0IHRoZSBmaWxlLCB3aXRob3V0IGRvaW5nIHRoZSBhY3R1YWwgdHJhbnNmZXIuIFRoZSBjdXJsIHRvb2wgdGhlbgogIGxldHMgLS1oZWFkIGRvIHRoaXMuCgpEYW5pZWwgKDI5IE9jdG9iZXIpCi0gcnVudGVzdHMucGwgbm93IGNoZWNrcyBmb3IgYW5kIHVzZSB2YWxncmluZCBpZiBwcmVzZW50LiBJdCB3aWxsIHJlZGlyZWN0IHRoZQogIHZhbGdyaW5kIHJlc3VsdHMgaW4gbG9nL3ZhbGdyaW5kW251bV0gYnV0IGl0IGN1cnJlbnRseSBkb2Vzbid0IHNjYW4gdGhhdAogIGZpbGUgZm9yIGFueSBlcnJvcnMgb3IgYW55dGhpbmcsIHRoYXQgaXMgc3RpbGwgb25seSBtYWRlIG1hbnVhbGx5LgoKLSBEYXZpZCBIdWxsIG1hZGUgdGhlIGZpbGU6IFVSTCBwYXJzZXIgYWxzbyBhY2NlcHQgdGhlIHNvbWV3aGF0IHNsb3BweSBmaWxlCiAgc3ludGF4OiBmaWxlOi9wYXRoLiBJIGFkZGVkIHRlc3QgY2FzZSAyMDMgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDI4IE9jdG9iZXIpCi0gRGFuIEMgdHJhY2tlZCBkb3duIHlldCBhbm90aGVyIHdlaXJkIGJlaGF2aW9yIGluIHRoZSBnbGliYyBnZXRob3N0YnluYW1lX3IoKQogIGZ1bmN0aW9uIGZvciBzb21lIHNwZWNpZmljIHZlcnNpb25zIChyZXBvcnRlZCBvbiAyLjIuNSBhbmQgMi4xLjEpLCBhbmQKICBwcm92aWRlZCBhIGZpeC4gT24gTGludXggbWFjaGluZXMgd2l0aCB0aGVzZSBnbGliYyB2ZXJzaW9ucywgbm9uLWlwdjYKICBidWlsZHMgb2YgbGliY3VybCB3b3VsZCBvZnRlbiBmYWlsIHRvIHJlc29sdmUgcGVyZmVjdGx5IHJlc29sdmFibGUgaG9zdAogIG5hbWVzLgoKRGFuaWVsICgyNiBPY3RvYmVyKQotIEphbWVzIEJ1cnNhIGZvdW5kIG91dCB0aGF0IGN1cmxfbXNucHJpbnRmKCkgY291bGQgd3JpdGUgdGhlIHRyYWlsaW5nCiAgemVyby1ieXRlIG91dHNpZGUgaXRzIGdpdmVuIGJ1ZmZlciBzaXplLiBUaGlzIGNvdWxkIGhhcHBlbiBpZiB5b3UgZ2VuZXJhdGVkCiAgYSB2ZXJ5IGxvbmcgZXJyb3IgbWVzc2FnZSBhcyB0aGVuIGxpYmN1cmwgd291bGQgb3ZlcndyaXRlIHRoZSBFUlJPUkJVRkZFUgogIHdpdGggb25lIGJ5dGUuIFVzaW5nIGEgbm9uLWV4aXN0aW5nIHZlcnkgbG9uZyBsb2NhbCBmaWxlOi8vIG5hbWUgaXMgb25lIGNhc2UKICB0aGF0IGNvdWxkIG1ha2UgdGhpcyBvY2N1ci4KCkRhbmllbCAoMjQgT2N0b2JlcikKLSBEYXZpZCBIdWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzgyOTgyNy4gSXQgaWRlbnRpZmllZCBhIHByb2JsZW0gd2l0aCAtQyAtIGlmCiAgdGhlIGZ1bGwgZmlsZSBhbHJlYWR5IHdhcyBkb3dubG9hZGVkIGFuZCB0aHVzIHRoZSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggYQogIDQxNi4gbGliY3VybCB3b3VsZCB0aGVuIHdyb25nbHkgdXNlIHRoZSBDb250ZW50LUxlbmd0aDogaGVhZGVyIGFuZCBleHBlY3QKICB0aGF0IHNpemUgdG8gZ2V0IHRyYW5zZmVyLCBjYXVzaW5nIGEgImhhbmciIHVudGlsIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZQogIGNvbm5lY3Rpb24gYW5kIHRoZW4gYW4gZXJyb3IgMTggKCJzdGlsbCBOIGJ5dGVzIGRhdGEgbGVmdCBvZiB0aGUgdHJhbnNmZXIiKS4KCiAgTm93IHdlIGRvbid0IHJldHVybiBhbnkgZXJyb3IgYXQgYWxsLCBidXQgSSB0aGluayBsaWJjdXJsIHNob3VsZCBwZXJoYXBzCiAgcmV0dXJuIHNvbWUga2luZCBvZiBpbmZvIHNpbmNlIHRoZSByZXF1ZXN0ZWQgcmFuZ2Ugd2FzIG91dCBvZiB0aGUgc2l6ZSBvZgogIHRoZSBkb2N1bWVudC4KCi0gQmFzZWQgb24gRGF2aWQgSHVsbCdzIGZpeCBpbiBidWcgcmVwb3J0ICM4MDQ1OTksIHdlIG5vdyBjaGVjayBmb3Igc29sYXJpcyBhbmQKICBnY2MgaW4gY29uZmlndXJlIGFuZCBzZXQgdGhlIC1taW1wdXJlLXRleHQgbGluayBmbGFnIGZvciBsaW5raW5nIHRoZSBsaWIKICBiZXR0ZXIuCgotIEkndmUgaW50cm9kdWNlZCBhIC10IG9wdGlvbiB0byB0aGUgcnVudGVzdHMucGwgc2NyaXB0LiBXaXRoIHRoYXQgb3B0aW9uIHNldCwKICB0aGUgc2NyaXB0IHJ1bnMgc3BlY2lhbCAibWVtb3J5IHRvcnR1cmUiIHRlc3RzLiBGb3IgZWFjaCB0ZXN0IGNvbW1hbmQgbGluZQogIGluIHRoYXQgc2VjdGlvbiwgdGhlIHNjcmlwdCBmaXJzdCBydW5zIHRoZSBjb21tYW5kIGxpbmUgYW5kIGNvdW50cyB0aGUgdG90YWwKICBhbW91bnQgb2YgYWxsb2NhdGlvbnMgbWFkZS4gSXQgdGhlbiBydW5zIHRoZSBleGFjdCBzYW1lIGNvbW1hbmQgbGluZSBhZ2FpbiwKICBmb3JjaW5nIGFsbG9jYXRpb24gbnVtYmVyIE4gdG8gZmFpbC4gSXQgd2lsbCB0cnkgZXZlcnkgTiBmcm9tIDEgdG8gdGhlIHRvdGFsCiAgbnVtYmVyIG9mIGFtb3VudHMgbWFkZS4gRm9yIGV2ZXJ5IGludm9rZSwgaXQgY2hlY2tzIHRoYXQgbm8gbWVtb3J5IHdhcwogIGxlYWtlZCBhcyB0aGF0IHdvdWxkIGluZGljYXRlIGEgYmFkIGNsZWFudXAgc29tZXdoZXJlIGluIHRoZSBjb2RlLgoKICBUaGlzIGlzIGp1c3QgYmVnaW5uaW5nIHRvIHdvcmssIGFuZCBJJ3ZlIGFscmVhZHkgbWFkZSBzb21lIGNvcnJlY3Rpb25zIGluCiAgbGliY3VybCBjb2RlLiBXaGVuIHRoaXMgY29kZSB3b3JrcyBzb21ld2hhdCBmaW5lLCBJJ2xsIG1ha2Ugc3VyZSAnbWFrZSB0ZXN0JwogIGluIHRoZSByb290IGRpciB3aWxsIHJ1biB0aGVzZSB0ZXN0cyBhcyB3ZWxsLgoKRGFuaWVsICgyMyBPY3RvYmVyKQotIEdlb3JnIEhvcm4gZml4ZWQgaG93IHRoZSBDQSB2ZXJpZmljYXRpb24gaXMgbWFkZS4gVmVyaWZpY2F0aW9ucyBjYW4gbm93IGJlCiAgbWFkZSB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lIHRoZSByZXN1bHQgb2YgaXQgY2FuIGJlIGlnbm9yZWQuIFRoaXMgYWxzbwogIGFmZmVjdHMgdGhlIGN1cmwgdG9vbCBhcyAtayBjYW4gbm93IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCAtLWNhY2VydCBvcgogIC0tY2FwYXRoLgoKRGFuaWVsICgyMiBPY3RvYmVyKQotIEdpc2xlIFZhbmVtIGZvdW5kIG91dCAtLWRpc2FibGUtZXBydCBkaWRuJ3Qgd29yayBhbmQgcGF0Y2hlZCBpdC4KCi0gVGVzdCBjYXNlIDkxIHdhcyBtb2RpZmllZCBhbmQgY291bGQgbm93IHJlcGVhdCB0aGUgcHJvYmxlbSBLZXZpbiBSb3RoIGhhcwogIHJlcG9ydGVkLCBhbmQgdGhlIGJ1ZyB3YXMgZml4ZWQuCgotIER5bGFuIEVsbGljb3R0IGFkZGVkIHZjLWxpYmN1cmwtc3NsLWRsbCBhcyBhIHRhcmdldCB0byB0aGUgcm9vdCBtYWtlZmlsZQogIHRvIGJ1aWxkIGEgc3RhdGljIGxpYmN1cmwgdGhhdCBsaW5rcyB3aXRoIGEgc2hhcmVkIE9wZW5TU0wgdXNpbmcgTVNWQy4KCkRhbmllbCAoMjEgT2N0b2JlcikKLSBBbmRy6XMgR2FyY+1hIHVwZGF0ZWQgdGhlIG1pbmd3MzIgbWFrZWZpbGVzLgoKVmVyc2lvbiA3LjEwLjgtcHJlNSAoMjEgT2N0b2JlciAyMDAzKQoKRGFuaWVsICgxOSBPY3RvYmVyKQotIEdlb3JnIEhvcm4gbWFkZSBsaWJjdXJsIG91dHB1dCBtb3JlIGluZm8gb24gU1NMIGZhaWx1cmVzIHdoZW4gcmVjZWl2aW5nCiAgZGF0YS4KClZlcnNpb24gNy4xMC44LXByZTQgKDE4IE9jdG9iZXIgMjAwMykKCkRhbmllbCAoMTcgT2N0b2JlcikKLSBEb21pbmljayBNZWdsaW8gaW1wbGVtZW50ZWQgQ1VSTE9QVF9NQVhGSUxFU0laRSBhbmQgLS1tYXgtZmlsZXNpemUuCgotIE1hZGUgbGliY3VybCBzaG93IHZlcmJvc2UgaW5mbyBhYm91dCB3aGF0IGF1dGggdHlwZSBhbmQgdXNlciBuYW1lIHRoYXQgaXMKICBiZWluZyBzZW50IGluIGl0cyBIVFRQIHJlcXVlc3QtaGVhZGVycy4KCkRhbmllbCAoMTYgT2N0b2JlcikKLSBSZW1vdmVkIHN1cHBvcnQgZm9yIENVUkxPUFRfUEFTU1dERlVOQ1RJT04gYW5kIENVUkxPUFRfUEFTU1dEREFUQS4gbGliY3VybAogIG5vIGxvbmdlciBwcm9tcHQgZm9yIHBhc3N3b3JkcyB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy4gUGFzc3dvcmQgcHJvbXB0aW5nCiAgd2FzIGluc3RlYWQgbW92ZWQgdG8gY3VybCwgd2hpY2ggbm93IHByb21wdHMgZm9yIHBhc3N3b3JkIGlmIC11IG9yIC1VIGxhY2sKICBpdC4gVGhpcyBzb2x2ZXMgdGhlIHByb2JsZW0gS2V2aW4gUm90aCByZXBvcnRlZCB3aGVuIGN1cmwgcHJvbXB0ZWQgZm9yCiAgcGFzc3dvcmQgdHdpY2Ugd2hlbiBkb2luZyBOVExNIGF1dGhlbnRpY2F0aW9uLgoKLSBJIHJld3JvdGUgdGhlIFNTTCBzdWJqZWN0QWx0TmFtZSBjaGVjayB0byBhdm9pZCBoYXZpbmcgdG8gcmVseSBvbiBPcGVuTERBUC0KICBsaWNlbnNlZCBkZXJpdmF0ZSBjb2RlLgoKRGFuaWVsICgxNSBPY3RvYmVyKQotIEF2b2lkIGRvaW5nIGdldHNvY2tvcHQoKSBvbiBXaW5kb3dzIHRvIHZlcmlmeSBjb25uZWN0cy4gSXQgc2VlbXMgdGhhdCB0aGlzCiAgaG9ncyBXaW5kb3dzIG1hY2hpbmVzIHdoZW4gbGliY3VybCBpcyBiZWluZyB1c2VkIG11bHRpLXRocmVhZGVkICh3aXRoID4gfjUwCiAgdGhyZWFkcykuIEFuZHJldyBGdWxsZXIgaGVscGVkIHVzIHZlcmlmeSBhbmQgdGVzdCB0aGlzLgoKRGFuaWVsICgxNCBPY3RvYmVyKQotIEtpbW1vIEtpbm51bmVuIGZpeGVkIGEgY3Jhc2ggd2l0aCBkdXBoYW5kbGUoKSB3aGVuIENVUkxERUJVRyBpcyBzZXQuCgotIEdpc2xlIFZhbmVtIG1hZGUgbGliY3VybCBidWlsZCBhbmQgd29yayB3aXRoIElQdjYgb24gV2luZG93cy4KCkRhbmllbCAoMTMgT2N0b2JlcikKLSBHaXVzZXBwZSBBdHRhcmRpIHJlcG9ydGVkIHlldCBhbm90aGVyIHNlZ2ZhdWx0IHdpdGggYXJlcyBhbmQgdGhlIG11bHRpCiAgaW50ZXJmYWNlLiBNZSBmaXhlZC4KCi0gRG9tZW5pY28gQW5kcmVvbGkgcmVtb3ZlZCB0aGUgZXh0cmEgTERGTEFHUyBhc3NpZ25tZW50IGluIGxpYi9NYWtlZmlsZS5hbQogIHRoYXQgd2FzIHJlcG9ydGVkIGFib3V0IGluIHRoZSBkZWJpYW4gYnVnIHJlcG9ydCAjMjEyMDg2LgoKICBEb21lbmljbyBhbHNvIGZpeGVkIHR3byBtYWtlZmlsZXMgd2hlcmUgd2UgdXNlZCAnZ25yb2ZmJyBpbnN0ZWFkIG9mIHRoZSBtb3JlCiAgcG9ydGFibGUgJChOUk9GRikuCgpEYW5pZWwgKDEyIE9jdG9iZXIpCi0gRGlyayBNYW5za2UgbWFkZSB0aGUgc2hhcmUgbG9ja2luZyBhcm91bmQgRE5TIGxvb2t1cHMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvCiAgYWxsb3cgdGhlIHNoYXJlIHN5c3RlbSdzIEROUyBsb29rdXBzIHRvIHJ1biBzb21ld2hhdCBtb3JlCiAgaW5kZXBlbmRlbnQvZmFzdGVyLgoKRGFuaWVsICg5IE9jdG9iZXIpCi0gTGFjaGxhbiBPJ0RlYSBmaXhlZCBhIHJlc3VtZSBwcm9ibGVtOiAiSWYgSSBzZXQgQ1VSTE9QVF9SRVNVTUVfRlJPTSwgcGVyZm9ybQogIGFuIEhUVFAgZG93bmxvYWQsIHRoZW4gcmVzZXQgQ1VSTE9QVF9SRVNVTUVfRlJPTSB0byAwLCB0aGUgbmV4dCBkb3dubG9hZAogIHN0aWxsIGhhcyBhIFJhbmdlIGhlYWRlciB3aXRoIGEgZ2FyYmFnZSB2YWx1ZS4iIGJ1ZyByZXBvcnQgIzgyMDUwMgoKLSBEb21pbmljayBNZWdsaW8gbWFkZSB0aGUgaW5ldF9wdG9uLmMgZmlsZSBidWlsZCBmaW5lIHVzaW5nIE1TVkMuCgotIFRoZSAnc3dzJyB0ZXN0IHN1aXRlIHdlYiBzZXJ2ZXIgbm93ICNpbmNsdWRlIHNldHVwLmggZnJvbSB0aGUgbGliIGRpcmVjdG9yeS4KICBUaGlzIG1ha2VzIGl0IG1vcmUgcG9ydGFibGUgZWFzaWVyLgoKVmVyc2lvbiA3LjEwLjgtcHJlMyAoOCBPY3RvYmVyIDIwMDMpCgpEYW5pZWwgKDggT2N0b2JlcikKLSBGcmFuayBUaWNoZWxlciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgZml4ZXMgaG93IGxpYmN1cmwgY29ubmVjdHMgdG8gbXVsdGlwbGUKICBhZGRyZXNzZXMsIGlmIG9uZSBvZiB0aGVtIGZhaWxzIChpcHY0LWNvZGUpLgoKRGFuaWVsICg3IE9jdG9iZXIpCi0gTmVpbCBEdW5iYXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBsaWJjdXJsIGNoZWNrIFNTTAogIHN1YmplY3RBbHROYW1lcyB3aGVuIG1hdGNoaW5nIGNlcnRzLiBUaGlzIGlzIGFwcGFyZW50bHkgZGV0YWlsZWQgaW4gUkZDMjgxOAogIGFzIHRoZSByaWdodCB0aGluZyB0byBkby4gSSBoYWQgdG8gYWRkIGNvbmZpZ3VyZSBjaGVja3MgZm9yIGluZXRfcHRvbigpIGFuZAogIG91ciBvd24gKHN0cmljdGx5IHNwZWFraW5nLCBjb2RlIGZyb20gQklORCB3cml0dGVuIGJ5IFBhdWwgVml4aWUpIHByb3ZpZGVkCiAgY29kZSBmb3IgdGhlIGZ1bmN0aW9uIGZvciBwbGF0Zm9ybXMgdGhhdCBtaXNzIGl0LgoKLSBIVFRQIFBPU1QgdXNpbmcgdGhlIHJlYWQgY2FsbGJhY2sgZGlkbid0IHdvcmssIGFzIEZsb3JpYW4gU2Nob3BwbWFubgogIHJlcG9ydGVkLgoKRGFuaWVsICg1IE9jdG9iZXIpCi0gU2hhcmVkIHByb3ZpZGVkIGEgZmV3IGZpeGVzIHRvIG1ha2UgbGliY3VybCBidWlsZCBvbiBCZU9TCiAgb3V0LW9mLXRoZS1ib3guIE5ldyBjb2RlIGZvciBCZU9TLXN0eWxlIG5vbi1ibG9ja2luZyBzb2NrZXRzLCBwcm92aWRlZCBieQogIFNoYXJkIGFuZCBKZXJlbXkgRnJpZXNuZXIuIE1vZGlmaWVkIHRoZSBhdXRvY29uZiBjaGVjayBmb3Igbm9uLWJsb2NraW5nCiAgc29ja2V0cyB0byBjaGVjayBmb3IgdGhpcyBraW5kIHRvby4KCkRhbmllbCAoNCBPY3RvYmVyKQotIFZpbmNlbnQgQnJvbm5lciBwb2ludGVkIG91dCB0aGF0IGlmIHlvdSBzZXQgQ1VSTE9QVF9DT09LSUUgZm9yIGEgdHJhbnNmZXIKICBhbmQgdGhlbiBzZXQgaXQgdG8gTlVMTCBpbiBhIHN1YnNlcXVlbnQgb25lLCB0aGUgcHJldmlvdXMgY29va2llIHdhcyBzdGlsbAogIHNlbnQgb2ZmIQoKLSBKb24gVHVybmVyIGZpeGVkIGEgcHJvYmxlbSBsaWJjdXJsIGhhZCB3aGVuIGl0IGZhaWxlZCBvbiBhbiBGVFAgdHJhbnNmZXIgZHVlCiAgdG8gYSBiYWQgcGF0aCwgaXQgd291bGQgY2F1c2UgdGhlIG5leHQgdHJhbnNmZXIgdG8gdXNlIGEgYmFkIHBhdGggYXMgd2VsbC4KCi0gU2lkZGhhcnRoYSBQcmFrYXNoIEphaW4gcHJvdmlkZWQgYSBwYXRjaCB3aXRoIGEgZml4IGZvciBsaWJjdXJsIHdpdGggYXJlcywKICB3aGVuIHdvcmtpbmcgb24gSVAtb25seSBuYW1lcyBhcyB3ZSB0aGVuIGNvdWxkIHJldHVybiAid2FpdCIgc3RhdHVzIHdoZW4gdGhlCiAgbmFtZSBpbiBmYWN0IGFscmVhZHkgd2FzIHJlc29sdmVkLiBJIGVkaXRlZCB0aGUgcGF0Y2ggc2xpZ2h0bHkgdG8gbm90IGV4cG9zZQogIGFzeW5jaCBkZXRhaWxzIHRvIG5vbi1hcmVzIGF3YXJlIHNvdXJjZSBjb2RlLgoKRGFuaWVsICgzIE9jdG9iZXIpCi0gTmVpbCBTcHJpbmcgcG9zdGVkIHRoZSBkZWJpYW4gYnVnIHJlcG9ydCAjMjEzMTgwLCBhbmQgcG9pbnRlZCBvdXQgdGhhdCB1c2luZwogIHRoZSBuYW1lICdhY2Nlc3MnIGluIGEgZnVuY3Rpb24gcHJvdG90eXBlIGlzIG5vdCB2ZXJ5IHdpc2UgYXMgc29tZSBjb21waWxlcnMKICBjb21wbGFpbi4KCi0gUGV0ZXIgU3lsdmVzdGVyIHByb3ZpZGVkIGhpcyBhbmQgSmVhbi1QYXVsIE1lcmxpbidzIGN1cmx4LmMgZXhhbXBsZSBzb3VyY2UKICBjb2RlIHRoYXQgc2hvd3MgaG93IHRoZXkgdXNlIHNzbCBhbmQgY2FsbGJhY2tzLgoKRGFuaWVsICgyIE9jdG9iZXIpCi0gSmFtZXMgTWFjTWlsbGFuJ3MgcGF0Y2ggbWFrZXMgY3VybCBidWlsZCBvbiBRTlggNi4yLnguCgpEYW5pZWwgKDI2IFNlcHRlbWJlcikKLSBNeSBkYXVnaHRlciB3YXMgYm9ybiEKCkRhbmllbCAoMjMgU2VwdGVtYmVyKQotIEFkZGVkIHN1cHBvcnQgZm9yIC00Ly0taXB2NCBhbmQgLTYvLS1pcHY2IHRvIGZvcmNlIG5hbWVzIHRvIHJlc29sdmUgdG8gdGhhdAogIHBhcnRpY3VsYXIgSVAgdmVyc2lvbi4gVGhleSBvbmx5IHdvcmsgZm9yIElQdjYtZW5hYmxlZCBsaWJjdXJscy4KCi0gY3VybCAtViBub3cgb3V0cHV0cyAnU1BORUdPJyBhcyBhIGZlYXR1cmUgaW4gY2FzZSBsaWJjdXJsIHdhcyBidWlsdCB0bwogIHN1cHBvcnQgdGhhdC4KClZlcnNpb24gNy4xMC44LXByZTIgKDIyIFNlcHRlbWJlciAyMDAzKQoKRGFuaWVsICgyMiBTZXB0ZW1iZXIpCi0gR2l1c2VwcGUgQXR0YXJkaSBmb3VuZCBhIHNlZ2ZhdWx0IGluIGxpYmN1cmwgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgd2l0aCBhcmVzIGFuZCBkb2luZyByZXBlYXRlZCBvcGVyYXRpb25zIGFnYWluc3QgYSBub24tcmVzb2x2aW5nIGhvc3QgbmFtZS4KCkRhbmllbCAoMTkgU2VwdGVtYmVyKQotIEFkZGVkIHRoZSBDVVJMT1BUX0lQUkVTT0xWRSBvcHRpb24sIHRoYXQgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHNlbGVjdAogIHdoYXQga2luZCBvZiBJUCBhZGRyZXNzZXMgaGUgd2FudHMgdG8gdXNlIHdoZW4gcmVzb2x2aW5nIGhvc3QgbmFtZXMuIFRoaXMKICBpcyBvbmx5IGludGVyZXN0aW5nIHdoZW4gdXNpbmcgaG9zdCBuYW1lcyB0aGF0IHJlc29sdmUgYWRkcmVzc2VzIHVzaW5nIG1vcmUKICB0aGFuIG9uZSB2ZXJzaW9uIG9mIElQLgoKLSBBcHBsaWVkIE1hcmt1cyBNb2VsbGVyJ3MgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIFNQTkVHTyBzdXBwb3J0IGlmIGxpYmN1cmwKICBpcyBidWlsdCB3aXRoIHRoZSBGQm9wZW5zc2wgbGlicmFyaWVzLiBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zCiAgaW5mbyBvbiBTUE5FR08gYXZhaWxhYmlsaXR5LiBUaGUgcGF0Y2ggYWxzbyBtYWRlIHRoZSBHU1NBUEkgc3R1ZmYgd29yayBmaW5lCiAgd2l0aCB0aGUgTUlUIEdTUy1saWJyYXJ5ICh0aGUgSGVpbWRhbCBvbmUgc3RpbGwgd29ya3MgdG9vKS4KCkRhbmllbCAoMTYgU2VwdGVtYmVyKQotIERvaW5nIFBVVCB3aXRoIC0tZGlnZXN0IGZhaWxlZCwgYXMgcmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjODA1ODUzLgoKLSBVc2luZyAtLWFueWF1dGggdGhhdCBwaWNrZWQgTlRMTSwgYW5kIHRoZW4gYSByZWRpcmVjdCBjbG9zZWQgdGhlIGNvbm5lY3Rpb24KICBhbmQgdG9vayBjdXJsIHRvIGEgc2Vjb25kIE5UTE0gcGFnZSBtYWRlIGN1cmwgZmFpbC4gQnVnIHJlcG9ydCAjODA2MzI4CiAgaWRlbnRpZmllZCB0aGUgcHJvYmxlbSwgdGVzdCBjYXNlIDkwIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhlIGZpeC4KCkRhbmllbCAoMTQgU2VwdGVtYmVyKQotIGNvZGVtYXN0ciBicm91Z2h0IGEgcGF0Y2ggZm9yIGFyZXMgdG8gbWFrZSB0aGUgV2luZG93cyBwb3J0aW9ucyBvZiBpdCB3b3JrCiAgcHJvcGVybHkgb24gTlQ0LiBJIHVwbG9hZGVkIGEgbmV3IGRpZmYgYW5kIHVwZGF0ZWQgdGhlIGRvY3Mgb24gd2hlcmUgdG8gZ2V0CiAgaXQgZXRjLgoKLSBKZWZmIFBvaGxtZXllciB0cmFja2VkIGRvd24gYSB2ZXJ5IGhhcmQtdG8tZmluZCBidWcgd2hlcmUgd2UgcmVtb3ZlZCBhCiAgY2FjaGVkIEROUyBlbnRyeSBldmVuIHRob3VnaCBpdCBtYXkgYmUgaW4gdXNlLCB3aGljaCBjYXVzZWQgInJhbmRvbSIgbWVtb3J5CiAgdG8gZ2V0IG92ZXJ3cml0dGVuIGFuZCB0aHVzICJyYW5kb20iIGNyYXNoZXMuCgpEYW5pZWwgKDEyIFNlcHRlbWJlcikKLSBCYXNlZCBvbiBhIGJ1ZyByZXBvcnQgYnkgRGF2aWQgS2ltZG9uLCBJIG1hZGUgdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCBjbGVhcgogIGFsbCBwb3NzaWJsZSBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVmb3JlIHRoZSB0ZXN0cyBhcmUgcnVuLgoKLSBCeSBkZWZhdWx0LCBlYXN5IGhhbmRsZXMgd2l0aGluIGEgbXVsdGkgaGFuZGxlIG5vdyBzaGFyZSBETlMgY2FjaGUuCgotIFRpbSBCYXJ0bGV5IGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBHU1NORUdPVElBVEUgb3B0aW9uIHdvcmsgZm9yCiAgTWljcm9zb2Z0J3MgIk5lZ290aWF0ZSIgYXV0aGVudGljYXRpb24gYXMgd2VsbC4KCkRhbmllbCAoMTEgU2VwdGVtYmVyKQotIEEgemVyby1sZW5ndGggcHJveHkgc3RyaW5nIGNvbmZ1c2VkIEZUUCB0cmFuc2ZlcnMuCgotIEJqb3JuIFJlZXNlIGZvdW5kIGEgY2FzZSB3aXRoIGFuIHVuaW5pdGlhbGl6ZWQgcG9pbnRlciwgb25seSBwcmVzZW50IHdoZW4KICBidWlsdCBmb3IgYXJlcy4KClZlcnNpb24gNy4xMC44LXByZTEgKDggU2VwdGVtYmVyIDIwMDMpCgpEYW5pZWwgKDcgU2VwdGVtYmVyKQotIEp1cmlqIFNtYWtvdiBmb3VuZCBvdXQgdGhhdCB0aGUgbm9uLU9wZW5TU0wgTUQ1IGNvZGUgd2FzIG5vdCB3b3JraW5nIG9uCiAgQWxwaGEgKG9yIGlhNjQpLiBPbmx5IHRoZSBPcGVuU1NMLXZlcnNpb24gZGlkLiBJIG1hZGUgYSBmaXggSSB0aGluayBjb3JyZWN0cwogIHRoZSBwcm9ibGVtLiAKCkRhbmllbCAoNSBTZXB0ZW1iZXIpCi0gS2V2aW4gRmlzayByZXBvcnRlZCB0aGF0IGNvbmZpZ3VyZSAtLWVuYWJsZS10aHJlYWQgZGlkbid0IHdvcmsuIEkgZml4ZWQuCgotIERlLW1hY3JvZmllZCB0aGUgbGliL2hhc2guYyBzb3VyY2UgY29kZSBzb21ld2hhdC4KCkRhbmllbCAoNCBTZXB0ZW1iZXIpCi0gQ1VSTElORk9fSFRUUEFVVEhfQVZBSUwgYW5kIENVUkxJTkZPX1BST1hZQVVUSF9BVkFJTCBhZGRlZCwgQmFzZWQgb24gSm9lcmcKICBNdWVsbGVyLVRvbGsncyBwYXRjaCwKCkVhcmx5ICg0IFNlcHRlbWJlcikKLSBBZGRlZCBDVVJMT1BUX0ZUUF9SRVNQT05TRV9USU1FT1VUIC0gYWxsb3dzIHVzZXIgdG8gc2V0IHN0cmljdCB0aW1lb3V0CiAgcmVxdWlyZW1lbnRzIG9uIHRoZSBGVFAgc2VydmVyJ3MgYWJpbGl0eSB0byByZXNwb25kIHRvIGluZGl2aWR1YWwgY29tbWFuZHMKICB3aXRob3V0IHBsYWNpbmcgZ2xvYmFsIHJlcXVpcmVtZW50cyBvbiB0cmFuc2ZlciBvciBjb25uZWN0IHRpbWUuICBGaWxlcwogIGFmZmVjdGVkOgogICAgLSBpbmNsdWRlL2N1cmwvY3VybC5oCiAgICAgICAgQWRkZWQgb3B0aW9uIENVUkxPUFRfRlRQX1JFU1BPTlNFX1RJTUVPVVQKICAgIC0gbGliL2Z0cC5jCiAgICAgICAgQWRkZWQgYnJhbmNoIGluc2lkZSBDdXJsX0dldEZUUFJlc3BvbnNlIHRvIGNoZWNrIGZvciAKICAgICAgICBkYXRhLT5zZXQuZnRwX3Jlc3BvbnNlX3RpbWVvdXQKICAgIC0gbGliL3VybC5jCiAgICAgICAgTW9kaWZpZWQgQ3VybF9zZXRvcHQgdG8gcmVjb2duaXplIENVUkxPUFRfRlRQX1JFU1BPTlNFX1RJTUVPVVQKICAgIC0gbGliL3VybGRhdGEuaAogICAgICAgIEFkZGVkIGZ0cF9yZXNwb25zZV90aW1lb3V0IHRvIHN0cnVjdCBVc2VyRGVmaW5lZAoKRGFuaWVsICgzIFNlcHRlbWJlcikKLSBQZXRlciBQZW50Y2hldiBmb3VuZCBhbmQgZml4ZWQgdHdvIHByb2JsZW1zIGluIHRoZSB0ZXN0IHN1aXRlJ3Mgd2ViIHNlcnZlcgogIGNvZGUsIHRoYXQgbWFkZSBpdCBzZWdmYXVsdCBhdCB0aW1lcy4KCi0gSvZyZyBNdWVsbGVyLVRvbGsgaW1wcm92ZWQgdGhlIHByb3h5IHVzZXIrcGFzc3dvcmQgaGFuZGxpbmcsIGVzcGVjaWFsbHkKICB3aGVuIHByb3ZpZGluZyBhIGJsYW5rIHBhc3N3b3JkLgoKRGFuaWVsICgyIFNlcHRlbWJlcikKLSBGaXggZm9yIG1ha2luZyBDT05ORUNUIHRvIHByb3hpZXMgZG8gdGhlIGNvcnJlY3QgbWFnaWMgdG8gYWxsb3cgTlRMTSwgRGlnZXN0CiAgYW5kIHNpbWlsYXIgdG8gd29yay4KCkRhbmllbCAoMSBTZXB0ZW1iZXIpCi0gSGVucmlrIFN0b3JuZXIgbWFkZSBsaWJjdXJsIHdvcmsgZmluZSB3aXRoIE9wZW5MREFQIDIuMS4yMiAoY3VycmVudCkuCgotIEplZmYgUG9obG1leWVyIGFkZGVkIGEgcHJvcGVyIGVycm9yIG1lc3NhZ2UgZm9yIG5vbi1yZXNvbHZpbmcgaG9zdHMgd2hlbgogIHVzaW5nIGFyZXMgZm9yIGxvb2t1cHMuCgpEYW5pZWwgKDI1IEF1Z3VzdCkKLSBKb2huIE1jR293YW4gcmVwb3J0ZWQgdGhhdCBjdXJsIC1rIHN0aWxsIGZhaWxlZCBpZiB0aGUgSFRUUFMgc2VydmVyJ3MgQ04KICBmaWVsZCB3YXNuJ3Qgb2J0YWluYWJsZS4gVGhpcyB3YXMgZHVlIHRvIHRoZSBDVVJMT1BUX1NTTF9WRVJJRllIT1NUIGJlaW5nCiAgc2V0IHRvIDEsIGFuZCBsaWJjdXJsIGZhaWxlZCBpZiB0aGUgQ04gd2FzIG1pc3NpbmcuIFN0YXJ0aW5nIG5vdywgaGF2aW5nIGl0CiAgc2V0IHRvIDEgd2lsbCBzaW1wbHkgb3V0cHV0IGEgd2FybmluZyBpZiBubyBDTiBjb3VsZCBiZSBvYnRhaW5lZCAoYXMgaGF2aW5nCiAgYSBtaXNtYXRjaCBpcyBPSykuCgpEYW5pZWwgKDIxIEF1Z3VzdCkKLSBWaW5jZW50IFNhbmRlcnMgcHJvdmlkZWQgYSBmaXggZm9yIG5hbWUgcmVzb2x2aW5nIHdoZW4gbGlua2VkIHdpdGggdUNsaWJjLgoKRGFuaWVsICgyMCBBdWd1c3QpCi0gR2VyZCB2LiBFZ2lkeSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgbGliY3VybCBzdG9yZSB0aGUgRlRQIHJlc3BvbnNlCiAgY29kZSBmcm9tIGZ0cCBzZXJ2ZXJzLiBVc2luZyBjdXJsX2Vhc3lfZ2V0aW5mbygpIHdpdGggQ1VSTElORk9fSFRUUF9DT0RFCiAgcmV0dXJucyB0aGF0IGRhdGEuIFRoZSBvcHRpb24gaXMgdGhlcmVmb3JlIG5vdyBhbHNvIGtub3duIGFzCiAgQ1VSTElORk9fUkVTUE9OU0VfQ09ERS4KCi0gQW50b2luZSBDYWxhbmRvIGZvdW5kIGEgc2VnZmF1bHQgd2hlbiBkb2luZyBtdWx0aS1wYXJ0L2Zvcm1wb3N0IHVzaW5nCiAgdGhlIG11bHRpIGludGVyZmFjZS4KCi0gQW50b2luZSBDYWxhbmRvIHBvaW50ZWQgb3V0IHRoYXQgY3VybF9tdWx0aV9pbmZvX3JlYWQoKSBkaWRuJ3Qgc2V0IHRoZQogIG1zZ3NfaW5fcXVldWUgdG8gMCBwcm9wZXJseSB3aGVuIHJldHVybmluZyBOVUxMLgoKRGFuaWVsICgxOSBBdWd1c3QpCi0gSSBtYWRlIGN1cmwgc3VwcG9ydCBtdWx0aXBsZSAtVCBvcHRpb25zLCBhcyB3ZWxsIGFzIC1UICJ7ZmlsZTEsZmlsZTJ9IgogIHN0eWxlIGdsb2JiaW5nLiBPbmUgLVQgZm9yIGVhY2ggVVJMIGlzIHN1cHBvcnRlZC4KCi0gSmVmZiBQb2hsbWV5ZXIgZm91bmQgYSBzZWdmYXVsdCB3aGVuIHVzaW5nIGFyZXMtZW5hYmxlZCBsaWJjdXJsIGFuZCB0aGUKICBtdWx0aSBpbnRlcmZhY2Ugd2hlbiB0cnlpbmcgYSBub24tZXhpc3RpbmcgaG9zdCBuYW1lLgoKLSBNYWRlIHRoZSBsaWJjdXJsIHByaW50ZiBjb2RlIHN1cHBvcnQgbG9uZyBsb25ncyBpZiBhdmFpbGFibGUuCgotIExvcmVuIEtpcmtieSBwb2ludGVkIG91dCB0aGF0IHdlIGRpZCBub3QgY2xlYW4gdXAgYWxsIFNTTC1hbGxvY2F0ZWQgbWVtb3J5CiAgaW4gY3VybF9nbG9iYWxfY2xlYW51cCgpLgoKRGFuaWVsICgxNyBBdWd1c3QpCi0gU2V0dGluZyBDVVJMT1BUX1dSSVRFRlVOQ1RJT04gb3IgQ1VSTE9QVF9SRUFERlVOQ1RJT04gdG8gTlVMTCB3aWxsIG5vdyBtYWtlCiAgdGhlbSBnZXQgdGhlIGludGVybmFsIGRlZmF1bHRzIHJlc3RvcmVkLiBQcmV2aW91c2x5IHRoaXMgY291bGQgY2F1c2UgYQogIHNlZ2ZhdWx0LiBXZSBzaG91bGQgYWltIGF0IGhhdmluZyBhbGwgcG9pbnRlci1yZWxhdGVkIG9wdGlvbnMgZ2V0IHJlc3RvcmVkCiAgdG8gZGVmYXVsdC9zYWZlIHZhbHVlcyB3aGVuIHNldCB0byBOVUxMLgoKVmVyc2lvbiA3LjEwLjcgKDE1IEF1Z3VzdCAyMDAzKQoKRGFuaWVsICgxNCBBdWd1c3QpCi0gSSBtb2RpZmllZCB0aGUgbWVtZGVidWcgc3lzdGVtIHRvIHJldHVybiBmYWlsdXJlIG9uIG1lbW9yeSBhbGxvY2F0aW9uCiAgZnVuY3Rpb25zIGFmdGVyIGEgc2V0IGFtb3VudCBvZiBzdWNjZXNzZnVsIG9uZXMuIFRoaXMgZW5hYmxlcyB1cyB0byB0ZXN0CiAgb3V0LW9mLW1lbW9yeSBzaXR1YXRpb25zIGluIGEgY29udHJvbGxlZCBtYW5uZXIgYW5kIHdlIGNhbiBtYWtlIHN1cmUgdGhhdAogIGN1cmwvbGliY3VybCBiZWhhdmVzIGdvb2QgaW4gdGhvc2UuCgogIFRoaXMgbWFkZSBtZSBmaW5kIGFuZCBmaXggc2V2ZXJhbCBzcG90cyB3aGVyZSB3ZSBkaWQgbm90IGNsZWFudXAgcHJvcGVybHkKICB3aGVuIGJhaWxpbmcgb3V0IGR1ZSB0byBlcnJvcnMgKGxvdyBtZW1vcnkpLgoKLSBDb3JyZWN0ZWQgdGVzdCBjYXNlIDc0LiBNYWRlIHVzaW5nIC1vIHdpdGggYmFkICNbbnVtXSBjb2RlcyBjb21wbGFpbiBhbmQKICBiYWlsIG91dC4gTWFkZSAjW251bV0gc3VwcG9ydCBudW1iZXJzIGxhcmdlciB0aGFuIDkgYXMgd2VsbC4gQWRkZWQgdGVzdAogIGNhc2UgODYgZm9yIGEgcHJvcGVyIHJhbmdlIGdsb2JiaW5nIHRlc3QgYXMgd2VsbC4KClZlcnNpb24gNy4xMC43LXByZTQgKDEyIEF1Z3VzdCAyMDAzKQoKRGFuaWVsICgxMiBBdWd1c3QpCi0gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucyBhIGZsYWcgaWYgbGliY3VybCB3YXMgYnVpbHQgd2l0aCBhc3luY2ggRE5TCiAgc3VwcG9ydCwgYW5kIHRoaXMgaXMgbm93IGFsc28gZGlzcGxheWVkIHdpdGggJ2N1cmwgLVYnLgoKLSBBZGRlZCBhIGZldyBuZXcgbWFuIHBhZ2VzIHRvIHRoZSBkb2NzL2xpYmN1cmwgZGlyOiBjdXJsX3NoYXJlX2luaXQsCiAgY3VybF9zaGFyZV9zZXRvcHQsIGN1cmxfc2hhcmVfY2xlYW51cCwgbGliY3VybC1lYXN5IGFuZCBsaWJjdXJsLXNoYXJlLgoKRGFuaWVsICgxMSBBdWd1c3QpCi0gTWlrZSBDaGVyZXBvdiBtYWRlIHRoZSBsb2NhbCBiaW5kaW5nIGNvZGUgd29yayBmb3IgV2luZG93cywgd2hpY2ggbWFrZXMKICB0aGUgb3B0aW9uIENVUkxPUFRfSU5URVJGQUNFIHdvcmsgb24gV2luZG93cyBhcyB3ZWxsLgoKLSBWaW5jZW50IFNhbmRlcnMgdXBkYXRlZCB0aGUgZm9wZW4uYyBleGFtcGxlIGNvZGUgYSBsb3QuCgotIC0tcHJveHktbnRsbSBpcyBub3cgc3VwcG9ydGVkIGJ5IHRoZSBjdXJsIHRvb2wuIEl0IGZvcmNlcyB0aGUgcHJveHkKICBhdXRoZW50aWNhdGlvbiB0byBiZSBtYWRlIHVzaW5nIE5UTE0uIEl0IGRvZXMgbm90IHlldCB3b3JrIGZvciBIVFRQUyBvdmVyCiAgcHJveGllcyAob3Igb3RoZXIgcHJveHktdHVubmVsaW5nIG9wdGlvbnMpLiBUZXN0IGNhc2UgODEgYW5kIDgyIGRvIHNvbWUKICBzaW1wbGUgaW5pdGlhbCBudGxtIHRlc3RpbmcuCgotIEZvdW5kIGFuZCBmaXhlZCBhIG1pbm9yIG1lbW9yeSBsZWFrIG9uIHJlLXVzZWQgY29ubmVjdGlvbnMgd2l0aAogIHByb3h5LWF1dGhlbnRpY2F0aW9uLgoKLSBJIHJlbW92ZWQgLUAgYW5kIC1aIGFzIHZhbGlkIHNob3J0IG9wdGlvbnMuIFRoZXkgd2VyZSB2ZXJ5IHJhcmVseSB1c2VkIChACiAgd2Fzbid0IGV2ZW4gZG9jdW1lbnRlZCkuCgotIFNlcmdlIFNlbWFzaGtvIGludHJvZHVjZWQgQ1VSTE9QVF9QUk9YWUFVVEgsIGFuZCBtYWtlIGl0IHdvcmsgd2hlbiBzZXQgdG8KICBDVVJMQVVUSF9OVExNIGFuZC9vciBDVVJMQVVUSF9CQVNJQy4gVGhlIFBST1hBVVRIIGlzIHNpbWlsYXIgdG8gSFRUUEFVVEgsCiAgYnV0IGlzIGZvciB0aGUgcHJveHkgY29ubmVjdGlvbiBvbmx5LCBhbmQgSFRUUEFVVEggaXMgZm9yIHRoZSByZW1vdGUgaG9zdC4KCi0gRml4ZWQgbG9hZGluZyBvZiBjb29raWVzIHdpdGggYmxhbmsgY29udGVudHMgZnJvbSBhIGNvb2tpZSBqYXIuIEFsc28gbWFkZSB0aGUKICBjb29raWUgZnVuY3Rpb25zIGluZm9ybSBvbiBhZGRlZCBhbmQgc2tpcHBlZCBjb29raWVzIChmb3IgY29va2llIGRlYnVnZ2luZykuCgpWZXJzaW9uIDcuMTAuNy1wcmUzICg4IEF1Z3VzdCAyMDAzKQoKRGFuaWVsICg4IEF1Z3VzdCkKLSBBcHBsaWVkIERhdmlkIEJ5cm9uJ3MgZml4IGZvciBmaWxlOi8vIFVSTHMgd2l0aCBkcml2ZSBsZXR0ZXJzIGluY2x1ZGVkLgoKLSBJIGFkZGVkIHRoZSAtLWZ0cC1jcmVhdGUtZGlycyB0byB0aGUgY2xpZW50IGNvZGUsIHdoaWNoIGFjdGl2YXRlcyBFYXJseSdzCiAgQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUyBvcHRpb24sIGFuZCB3cm90ZSB0ZXN0IGNhc2UgMTQ3IHRvIHZlcmlmeQogIGl0LiBBZGRlZCB0aGUgb3B0aW9uIHRvIHRoZSBjdXJsLjEgbWFuIHBhZ2UgdG9vLiBBZGRlZCB0aGUgb3B0aW9uIHRvIHRoZQogIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZSB0b28uCgpEYW5pZWwgKDcgQXVndXN0KQotIFRlc3QgY2FzZSA2MCBmYWlsZWQgb24gaWE2NCBhbmQgQU1EIE9wdGVyb24uIEZpeGVkIG5vdy4KCi0gRml4ZWQgYSBwcmludGYgcHJvYmxlbSB0aGF0IHJlc3VsdGVkIGluIHVybGdsb2JiaW5nIGJ1Z3MgKGJ1ZyAjMjAzODI3IGluIHRoZQogIGRlYmlhbiBidWcgdHJhY2tlcikuIEFkZGVkIHRlc3QgY2FzZSA3NCB0byB2ZXJpZnkgdGhlIGZpeCBhbmQgdG8gZGlzY292ZXIgaWYKICB0aGlzIGJyZWFrcyBpbiB0aGUgZnV0dXJlLgoKLSAibWFrZSBkaXN0Y2hlY2siIHdvcmtzIGFnYWluLgoKVmVyc2lvbiA3LjEwLjctcHJlMiAoNiBBdWd1c3QgMjAwMykKCkRhbmllbCAoNSBBdWd1c3QpCi0gRHVuY2FuIFdpbGNveCBoZWxwZWQgbWUgdmVyaWZ5IHRoYXQgdGhlIGxhdGVzdCBpbmNhcm5hdGlvbiBvZiBteSBhcmVzIHBhdGNoCiAgYnVpbGRzIGZpbmUgb24gTWFjIE9TIFggKHNlZSB0aGUgbmV3IGxpYi9SRUFETUUuYXJlcykgZmlsZSBmb3IgYWxsIGRldGFpbHMuCgotIFNhbHZhdG9yZSBTb3JyZW50aW5vIGZpbGVkIGJ1ZyByZXBvcnQgIzc4MzExNiBhbmQgRWFybHkgRWhsaW5nZXIgcG9zdGVkIGEKICBidWcgcmVwb3J0IHRvIHRoZSBsaWJjdXJsIGxpc3QsIGJvdGggaWRlbnRpZnlpbmcgYSBwcm9ibGVtIHdpdGggRlRQCiAgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBhbmQgaG93IHRoZSBkaXIgaGllcmFyY2h5IHdhcyBub3QgcHJvcGVybHkgcmVzZXQKICBiZXR3ZWVuIGZpbGVzLgoKLSBEYXZpZCBCeXJvbidzIHRob3VnaHRzIG9uIGEgZml4ZWQgTWFrZWZpbGUgaW4gdGVzdHMvIHdlcmUgYXBwbGllZC4KCi0gSmFuIFN1bmRpbiByZXBvcnRlZCBhIGNhc2Ugd2hlcmUgY3VybCBpZ25vcmVkIGEgY29va2llIHRoYXQgYnJvd3NlcnMgZG9uJ3QsCiAgd2hpY2ggdHVybmVkIHVwIHRvIGJlIGR1ZSB0byB0aGUgbnVtYmVyIG9mIGRvdHMgaW4gdGhlICdkb21haW4nLiBJJ3ZlIG5vdwogIG1hZGUgY3VybCBmb2xsb3cgdGhlIHRoZSBvcmlnaW5hbCBuZXRzY2FwZSBjb29raWUgc3BlYyBsZXNzIHN0cmljdCBvbiB0aGF0CiAgcGFydC4KCkRhbmllbCAoNCBBdWd1c3QpCi0gRGlyayBNYW5za2UgYWRkZWQgY29va2llIHN1cHBvcnQgZm9yIHRoZSBleHBlcmltZW50YWwsIGhpZGRlbiBhbmQgc3RpbGwKICB1bmRvY3VtZW50ZWQgc2hhcmUgZmVhdHVyZSEKCi0gTWFyayBGbGV0Y2hlciBwcm92aWRlZCBhbiBleGNlbGxlbnQgYnVnIHJlcG9ydCB0aGF0IGlkZW50aWZpZWQgYSBwcm9ibGVtCiAgd2l0aCBGT0xMT1dMT0NBVElPTiBhbmQgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZywgYXMgbGliY3VybCB3b3VsZCBub3QKICBwcm9wZXJseSBpZ25vcmUgdGhlIGJvZHkgY29udGVudHMgb2YgM1hYIHJlc3BvbnNlIHRoYXQgaW5jbHVkZWQgdGhlCiAgTG9jYXRpb246IGhlYWRlci4KCkVhcmx5ICg2IEF1Z3VzdCkKLSBBZGRlZCBvcHRpb24gQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUwogICAgVGhpcyBvcHRpb24gd2lsbCBmb3JjZSB0aGUgdGFyZ2V0IGZpbGUncyBwYXRoIHRvIGJlIGNyZWF0ZWQgaWYgaXQKICAgIGRvZXMgbm90IGFscmVhZHkgZXhpc3Qgb24gdGhlIHJlbW90ZSBzeXN0ZW0uCiAKICBGaWxlcyBhZmZlY3RlZDoKICAgIC0gaW5jbHVkZS9jdXJsL2N1cmwuaAogICAgICAgIEFkZGVkIG9wdGlvbiBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICAtIGxpYi9mdHAuYwogICAgICAgIEFkZGVkIGZ1bmN0aW9uIGZ0cF9ta2QsIHdoaWNoIGlzc3VlcyBhIE1LRCBjb21tYW5kCiAgICAgICAgQWRkZWQgZnVuY3Rpb24gZnRwX2ZvcmNlX2N3ZCwgd2hpY2ggYXR0ZW1wdHMgYSBDV0QsCiAgICAgICAgICBhbmQgZG9lcyBhIE1LRCBhbmQgcmV0cmllcyB0aGUgQ1dEIGlmIHRoZSBvcmlnaW5hbCBDV0QKICAgICAgICAgIGZhaWxzCiAgICAgICAgTW9kaWZpZWQgZnRwX3BlcmZvcm0oKSB0byBjYWxsIGl0cyBjaGFuZ2UgZGlyZWN0b3J5IGZ1bmN0aW9uCiAgICAgICAgICB0aHJvdWdoIGEgcG9pbnRlci4gIFRoZSBwb2ludGVyIHBvaW50cyB0byBmdHBfY3dkIGJ5IGRlZmF1bHQsCiAgICAgICAgICBhbmQgaXMgbW9kaWZpZWQgdG8gcG9pbnQgdG8gZnRwX2ZvcmNlX2N3ZCBJRkYKICAgICAgICAgIGRhdGEtPnNldC5mdHBfY3JlYXRlX21pc3NpbmdfZGlycyBpcyBub3QgMC4gICAgICAgIAogICAgLSBsaWIvdXJsLmMKICAgICAgICBNb2RpZmllZCBDdXJsX3NldG9wdCB0byByZWNvZ25pemUgQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUwogICAgLSBsaWIvdXJsZGF0YS5oCiAgICAgICAgQWRkZWQgZnRwX2NyZWF0ZV9taXNzaW5nX2RpcnMgdG8gc3RydWN0IFVzZXJEZWZpbmVkCiAgICAgICAKLSBNaW5vciBCdWdmaXggZm9yIENVUkxPUFRfVElNRUNPTkRJVElPTiB3aXRoIEZUUCAtIGlmIHRoZSBmaWxlIHdhcyBub3QKICBwcmVzZW50IHRvIGRvIHRoZSB0aW1lIGNvbXBhcmlzb24sIGl0IHdvdWxkIGZhaWwuCiAgRmlsZXMgYWZmZWN0ZWQ6CiAgICAtIGxpYi9mdHAuYwogICAgICAgIEluIGZ0cF9wZXJmb3JtKCksIHRoZSBjYWxsIHRvIGZ0cF9nZXRmaWxldGltZSgpIHVzZWQgdG8gYmUgZm9sbG93ZWQKICAgICAgICBieQoJICBpZiAocmVzdWx0KQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIEFuZCB0aGVuIGJ5IHRoZSBjb2RlIHRoYXQgYWN0dWFsbHkgZGlkIHRoZSB0aW1lIGNvbXBhcmlzb24uCiAgICAgICAgVGhlIGNvZGUgdGhhdCBkaWQgdGhlIGNvbXBhcmlzb24gaGFuZGxlZCB0aGUgY2FzZSB3aGVyZSB0aGUgZmlsZXRpbWUKICAgICAgICB3YXMgbm90IGF2YWlsYWJsZSAoYXMgaW5kaWNhdGVkIGJ5IGluZm8uZmlsZXRpbWUgPCAwIG9yIHNldC50aW1ldmFsdWUgCiAgICAgICAgPCAwKSwgc28gSSByZXBsYWNlZCB0aGUgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdCB3aXRoIGEgc3dpdGNoKHJlc3VsdCkKICAgICAgICB0aGF0IGFsbG93cyBDVVJMRV9GVFBfQ09VTEROVF9SRVRSX0ZJTEUgdG8gZmFsbCB0aHJvdWdoIHRvIHRoZSAKICAgICAgICBub3JtYWwgdGltZSBjb21wYXJpc29uLgoKRGFuaWVsICgzIEF1Z3VzdCkKLSBXaGVuIHByb3h5IGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQgaW4gYSBDT05ORUNUIHJlcXVlc3QgKGFzIHVzZWQgZm9yIGFsbCBTU0wKICBjb25uZWN0cyBhbmQgb3RoZXJ3aXNlIGVuZm9yY2VkIHR1bm5lbC10aHJ1LXByb3h5IHJlcXVlc3RzKSwgdGhlIHNhbWUKICBhdXRoZW50aWNhdGlvbiBoZWFkZXIgaXMgYWxzbyB3cm9uZ2x5IHNlbnQgdG8gdGhlIHJlbW90ZSBob3N0LgoKICBUaGlzIGlzIGEgcmF0aGVyIHNpZ25pZmljYW50IGluZm8gbGVhay4gSSd2ZSBmaXhlZCBpdCBub3cgYW5kIG1haWxlZCBhIHBhdGNoCiAgYW5kIHdhcm5pbmcgdG8gdGhlIG1haWxpbmcgbGlzdHMuCgpEYW5pZWwgKDEgQXVndXN0KQotIERhdmlkIEJ5cm9uIHByb3ZpZGVkIGEgcGF0Y2ggdG8gbWFrZSA3LjEwLjYgYnVpbGQgY29ycmVjdGx5IHdpdGggdGhlCiAgY29tcHJlc3NlZCBodWdlaGVscC5jIHNvdXJjZSBmaWxlLgoKVmVyc2lvbiA3LjEwLjctcHJlMSAoMzEgSnVseSAyMDAzKQoKRGFuaWVsICgzMCBKdWx5KQotIEr2cmcgTfxsbGVyLVRvbGsgdXBkYXRlZCB0aGUgVkMgbWFrZWZpbGUuCgotIERhbmllbCBOb2d1ZXJvbCBtYWRlIHRoZSBmdHAgY29kZSBvdXRwdXQgIkFjY2VwdC1SYW5nZXM6IGJ5dGVzIiBpbiBzaW1pbGFyCiAgc3R5bGUgbGlrZSBvdGhlciBmYWtlZCBIVFRQIGhlYWRlcnMgd2hlbiBOT0JPRFkgYW5kIEhFQURFUiBhcmUgdXNlZC4gSQogIHVwZGF0ZWQgdHdvIGNvcnJlc3BvbmRpbmcgdGVzdCBjYXNlcyB0b28uCgotIE1hcnR5IEt1aHJ0IHBvaW50ZWQgb3V0IGEgY29tcGlsYXRpb24gcHJvYmxlbSBvbiBWTVMgZHVlIHRvIG15IGhhdmluZwogIGNoYW5nZWQgYSB0eXBlIGZyb20gbG9uZyB0byB0aW1lX3QsIGFuZCBJJ20gbm93IGNoYW5naW5nIGl0IGJhY2sgdG8gd29yawogIG1vcmUgcG9ydGFibHkuLi4KCiAgSGUgYWxzbyBpbmRpY2F0ZWQgdGhhdCBkaXN0cmlidXRpbmcgdGhlIHNyYy9odWdlaGVscC5jIGluIGEgY29tcHJlc3NlZCBzdGF0ZQogIGxpa2UgSSBhY2NpZGVudGFsbHkgZGlkIG1heSBub3QgYmUgdGhlIHNtYXJ0ZXN0IG1vdmUuLi4gSSd2ZSBub3cgZml4ZWQgdGhlCiAgZGlzdHJpYnV0ZSBwcm9jZWR1cmUgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhbiB1bmNvbXByZXNzZWQgdmVyc2lvbiB3aGVuIEkKICBtYWtlIHJlbGVhc2UgYXJjaGl2ZXMuCgpEYW5pZWwgKDI5IEp1bHkpCi0gR2lzbGUgVmFuZW0gYnJvdWdodCBjaGFuZ2VzIHRvIHRoZSBta2hlbHAgc2NyaXB0IGZvciB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUKICBjb21wcmVzc2VkIGhlbHAgdGV4dCBvbiBzb21lIHBsYXRmb3Jtcy4KClZlcnNpb24gNy4xMC42ICgyOCBKdWx5IDIwMDMpCgpEYW5pZWwgKDI4IEp1bHkpCi0gRnJhbudvaXMgUG9ucyBicm91Z2h0IGEgcGF0Y2ggdGhhdCBvbmNlIGFnYWluIG1hZGUgY3VybCBkZWFsIHdpdGggZnRwIGFuZAogICJkb3VibGUgc2xhc2giIGFzIGluZGljYXRpbmcgdGhlIHJvb3QgZGlyZWN0b3J5LiBJbiB0aGUgUkZDMTczOC1maXggb2YgQXByaWwKICAzMCwgdGhhdCBhYmlsaXR5IHdhcyByZW1vdmVkIChzaW5jZSBpdCBpcyBub3QgdGhlICJyaWdodCIgd2F5KS4gU28sIHN0YXJ0aW5nCiAgbm93IHdlIGNhbiBsaXN0IHRoZSByb290IGRpciBvZiBhbiBmdHAgc2VydmVyIGJvdGggdGhlc2Ugd2F5czoKCiAgICBjdXJsIGZ0cDovL3NlcnZlci5jb20vJTJmICBhcyB3ZWxsIGFzCiAgICBjdXJsIGZ0cDovL3NlcnZlci5jb20vLwoKRGFuaWVsICgyNCBKdWx5KQotIEhlbnJ5IEJsYW5kIHBvaW50ZWQgb3V0IHRoYXQgd2UgaW5jbHVkZWQgc3lzL3Jlc291cmNlLmggd2l0aG91dCBnb29kIHJlYXNvbgogIGluIHNldmVyYWwgc291cmNlIGZpbGVzLiBXaXRob3V0IGl0IGluY2x1ZGVkLCBRTlggYnVpbGRzIGJldHRlci4uLgoKLSBBbmRy6XMgR2FyY+1hIHVwZGF0ZWQgdGhlIG1pbmd3IG1ha2VmaWxlcy4KCkRhbmllbCAoMjMgSnVseSkKLSBUcmFjeSBCb2VocmVyIGV4cGVyaWVuY2VkIEROUyBjYWNoZSBwcm9ibGVtcyBhbmQgZGlkIHNvbWUgbmljZSBkZWJ1Z2dpbmcKICBhbmQgdHJhY2tpbmcgd2hpY2ggbWFkZSBpdCBlYXN5IGZvciBtZSB0byBjb3JyZWN0IHRoZSBwcm9ibGVtIGFuZCBUcmFjeQogIGNvdWxkIHZlcmlmeSB0aGF0IGl0IGRpZCBjdXJlIHRoZSBwcm9ibGVtISBXaGVuIHJlLXVzaW5nIGEgY29ubmVjdGlvbiB3ZQogIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgcmUtdXNlIHRoZSAnY29ubmVjdF9hZGRyJyBzdHJ1Y3QuCgotIERhbmllbCBLb3VyaWwgY29ycmVjdGVkIHRoZSBHU1MtTmVnb3RpYXRlIGNvZGUuCgotIEp1YW4gRi4gQ29kYWdub25lIHByb3ZpZGVkIGZpeGVzIHRvIGFsbG93IGN1cmwgdG8gYnVpbGQgZmluZSBvbiBXaW5kb3dzCiAgYWdhaW4uCgpEYW5pZWwgKDIyIEp1bHkpCi0gRWRpdGVkIHRoZSBjdXJsL2N1cmwuaCBpbmNsdWRlIGZpbGUgdG8gYnVpbGQgb24gV2luZG93cyBwcm9wZXJseS4KCkRhbmllbCAoMjEgSnVseSkKLSBNb3ZlZCB0aGUgcHJveHkgY3JlZGVudGlhbHMgZnJvbSB0aGUgU2Vzc2lvbkhhbmRsZSBzdHJ1Y3QgdG8gdGhlIGNvbm5lY3RkYXRhCiAgc3RydWN0LCB0byBtYWtlIG11bHRpcGxlIHByb3h5IGNvbm5lY3Rpb25zIHdpdGggZGlmZmVyZXJlbnQgdXNlciBuYW1lcyB3b3JrLgoKLSBBZGp1c3RlZCB0aGUgTlRMTSBjb2RlIHRvIHN1cHBvcnQgcHJveHkgZnVuY3Rpb25hbGl0eS4KCi0gTWFkZSB0aGUga3JiNCBzdHVmZiBjb21waWxlIHdpdGggdGhlIHVzZXIrcGFzc3dvcmQgZmllbGRzIG1vdmVkLgoKVmVyc2lvbiA3LjEwLjYtcHJlNCAoMjEgSnVseSAyMDAzKQoKRGFuaWVsICgyMCBKdWx5KQotIERhdmlkIEdhcmRuZXIgcG9pbnRlZCBvdXQgaW4gYnVnIHJlcG9ydCA3NzA3NTUgdGhhdCB1c2luZyB0aGUgRlRQIGNvbW1hbmQKICBDV0Qgd2l0aCBhIGJsYW5rIGFyZ3VtZW50IGlzIGEgYmFkIGlkZWEgYW5kIEkgbWFkZSBsaWJjdXJsIHNraXAgZW1wdHkgcGF0aAogIHNlZ21lbnRzIHN0YXJ0aW5nIG5vdy4KCkRhbmllbCAoMTggSnVseSkKLSBDcmlzIHBvaW50ZWQgb3V0IHRoYXQgbXkgZml4IG9uIEp1bHkgMTZ0aCBkaWRuJ3Qgd29yayBmdWxseS4gSGlzIHBvaW50aW5nCiAgb3V0IHRoaXMgKGFuZCBoaXMgcGF0Y2gpIGFsc28gbWFkZSBtZSByZWFsaXplIHRoYXQgd2UgaGF2ZSBhIHZlcnkgc2ltaWxhcgogIGJ1ZyBpbiB0aGUgRlRQIGNvbm5lY3Rpb24gcmUtdXNlIGNvZGUuIFdlIG11c3Qgc3RvcmUgYSBzZXBhcmF0ZSB1c2VyIGFuZAogIHBhc3N3b3JkIGZpZWxkIGZvciBlYWNoIGNvbm5lY3Rpb24gd2Uga2VlcCAoYXQgbGVhc3QgZm9yIEZUUCBhbmQgSFRUUCtOVExNCiAgY29ubmVjdGlvbnMsIHNvIEkgbWFkZSB1cyBkbyB0aGlzIHVuY29uZGl0aW9uYWxseSkuCgotIFNpbmNlIE5UTE0gYXV0aGVudGljYXRlcyBjb25uZWN0aW9ucyBpbnN0ZWFkIG9mIHNpbmdsZSByZXF1ZXN0cywgSSBoYWQgdG8KICByZS1hcnJhbmdlIGhvdyB3ZSBzdG9yZSB0aGUgTlRMTSBkYXRhIGFuZCBJIGhhZCB0byBpbXByb3ZlIHRoZSB0ZXN0IHN1aXRlIHRvCiAgZmluYWxseSB3b3JrIHByb3Blcmx5IHdpdGggcGVyc2lzdGVuY3kgdG8gbWFrZSB0aGUgTlRMTSB0ZXN0cyBydW4gZmluZQogIGFnYWluLiBUaGlzIGFsc28gZm9yY2VkIG1lIHRvIGhhdmUgdG8gdXBkYXRlIGxvdHMgb2YgSFRUUCB0ZXN0IGNhc2VzLgoKRGFuaWVsICgxNiBKdWx5KQotIENyaXMgQmFpbGlmZidzIGJ1ZyByZXBvcnQgNzY4Mjc1IHBvaW50ZWQgb3V0IHRoYXQgdXNpbmcgQmFzaWMgYXV0aCB3aXRoCiAgd3JvbmcgdXNlcitwYXNzd29yZCBjYXVzZWQgYW4gZW5kbGVzcyBsb29wLiBGaXhlZCBub3cuIEhlIGFsc28gZm91bmQgb3V0IHRoYXQKICB3ZSBkaWRuJ3QgcHJvcGVybHkgYXV0aGVudGljYXRlIGNvbm5lY3Rpb25zIHdpdGggTlRMTS4gRml4ZWQgdG9vLgoKLSBEYW4gV2luc2hpcCBwcm92aWRlZCBmaXhlcyBmb3IgdGhlIE5UTE0gY29kZS4KCkRhbmllbCAoNSBKdWx5KQotIERvdWcgS2F1Zm1hbiBwcm92aWRlZCBhZGRpdGlvbmFsIGZpeGVzIGZvciB0aGUgRE9TIHBvcnQuCgpEYW5pZWwgKDQgSnVseSkKLSBSaWNrIFJpY2hhcmRzb24gcG9pbnRlZCBvdXQgdGhhdCB1c2luZyBzZXR2YnVmKCkgdG8gYWNoaWV2ZSBub24tYnVmZmVyaW5nCiAgb24gb3V0cHV0IGlzIG5vLWdvb2QgZm9yIFNDTyBYZW5peCBhbmQgb3RoZXIgdW5peGVzLiBXZSBzd2l0Y2hlZCBvdmVyIHRvCiAgdXNpbmcgcGxhaW4gZmZsdXNoKCkgaW5zdGVhZC4KCi0gRGFuIEdyYXlzb24gcG9pbnRlZCBvdXQgdGhhdCB3ZSBzZXQgdGhlIENVUkxfQ0FfQlVORExFIHZhcmlhYmxlIHdyb25nbHkgaW4KICB0aGUgY29uZmlndXJlIHNjcmlwdCwgYW5kIEkgaGFkIHRvIGNoYW5nZSBzb21lIGJ1aWxkIHN0dWZmIHRvIG1ha2UgdGhlIG5ldwogIHdheSB3b3JrLgoKLSBQZXRlciBTeWx2ZXN0ZXIncyBwYXRjaCB3YXMgYXBwbGllZCB0aGF0IGludHJvZHVjZXMgdGhlIGZvbGxvd2luZzoKCiAgIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTiB0byBzZXQgYSBjYWxsYmFjayB0aGF0IGdldHMgY2FsbGVkIHdpdGggdGhlCiAgIE9wZW5TU0wncyBzc2xfY3R4IHBvaW50ZXIgcGFzc2VkIGluIGFuZCBhbGxvdyBhIGNhbGxiYWNrIHRvIGFjdCBvbiBpdC4gSWYKICAgYW55dGhpbmcgYnV0IENVUkxFX09LIGlzIHJldHVybmVkLCB0aGF0IHdpbGwgYWxzbyBiZSByZXR1cm5lZCBieSBsaWJjdXJsCiAgIGFsbCB0aGUgd2F5IGJhY2suIElmIHRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgQ1VSTE9QVF9VUkwsIGxpYmN1cmwgd2lsbAogICBkZXRlY3QgdGhpcyBhbmQgaW5zdGVhZCBnbyB1c2UgdGhlIG5ldyBVUkwuCgogICBDVVJMT1BUX1NTTF9DVFhfREFUQSBpcyBhIHBvaW50ZXIgeW91IHNldCB0byBnZXQgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBzZXQKICAgd2l0aCBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT04uCgpEYW5pZWwgKDEgSnVseSkKLSBEYXZpZCBCeXJvbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWxsb3dzIGEgY2xpZW50IHRvIHF1aXQgdGhlIHRlc3Qgc3VpdGUncwogIEhUVFAgc2VydmVyLgoKLSBHaXNsZSBWYW5lbSBmb3VuZCBhbmQgcGF0Y2hlZCBhIGxpYiBoYW5kbGUgbGVhayBpbiB0aGUgbGRhcCBjb2RlLgoKRGFuaWVsICgyNSBKdW5lKQotIE1vcmUgTlRMTS1pbXByb3ZlbWVudHMuIExlc3MgY29kZS4gU21hbGxlciBwYWNrZXRzIGJhY2sgYW5kIGZvcnRoLgoKRGFuaWVsICgyMyBKdW5lKQotIEVyaWMgR2xhc3MgcHJvdmlkZWQgdXMgd2l0aCBhIGJldHRlciBkb2Mgb24gTlRMTSBkZXRhaWxzLCBhbmQgSSBhZGRlZCBtb3JlCiAgY29tbWVudHMgYW5kIGNsYXJpZmllZCB0aGUgY3VycmVudCBjb2RlIG1vcmUuIFVzaW5nIHRoZSBuZXcga25vd2xlZGdlLCB3ZQogIHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgdGhlIE5UTE0gc3R1ZmYgd29yayBldmVuIGJldHRlci4KICBFcmljJ3Mgb3JpZ2luYWwgVVJMOiBodHRwOi8vZGF2ZW5wb3J0LnNvdXJjZWZvcmdlLm5ldC9udGxtLmh0bWwKICBWZXJzaW9uIHN0b3JlZCBhbmQgcHJvdmlkZWQgYXQgY3VybCBzaXRlOiBodHRwOi8vY3VybC5oYXh4LnNlL3JmYy9udGxtLmh0bWwKCi0gRml4ZWQgdGhlIG1pbm9yIGNvbXBpbGUgcHJvYmxlbXMgcHJlMyBoYWQgaWYgYnVpbHQgd2l0aG91dCBHU1NBUEkgYW5kL29yCiAgU1NMLgoKVmVyc2lvbiA3LjEwLjYtcHJlMyAoMTkgSnVuZSAyMDAzKQoKRGFuaWVsICgxOSBKdW5lKQotIE1hZGUgY3VybCB1c2UgY3VybF9mcmVlKCkgb24gbWVtb3J5IHJldHVybmVkIGJ5IGN1cmxfZ2V0ZW52KCksIGFzIHRoaXMKICBzaG91bGQgdGhlb3JldGljbHkgbWFrZSBpdCBwb3NzaWJseSB0byBidWlsZCBhbmQgcnVuIGN1cmwgYW5kIGxpYmN1cmwgd2l0aAogIGRpZmZlcmVudCBtZW1vcnkgYWxsb2NhdGlvbiBzY2hlbWVzIHdpdGggbm8gcHJvYmxlbXMuCgpEYW5pZWwgKDE4IEp1bmUpCi0gSW1wcm92ZWQgdGhlIG1raGVscC5wbCBhIGJpdCBmdXJ0aGVyIHRvIG1ha2UgYSBuaWNlciBodWdlaGVscCB0ZXh0IGFuZCB0bwogIGluY2x1ZGUgYSBiZXR0ZXIgY29tbWVudCBpbiB0aGUgdG9wIGZvciB0aGUgZ3ppcCBjb21wcmVzc2VkIHZlcnNpb24uCgpEYW5pZWwgKDE3IEp1bmUpCi0gQ1VSTE9QVF9IVFRQQVVUSCBpcyBub3cgYSBiaXRtYXNrLCBpbiB3aGljaCB5b3Ugc2V0IHdoaWNoIGF1dGhlbnRpY2F0aW9uCiAgdHlwZShzKSB5b3Ugd2FudCB0byB1c2UuIElmIG1vcmUgdGhhbiBvbmUgaXMgc2V0LCBsaWJjdXJsIHdpbGwgdXNlIG9uZSBvZgogIHRoZSBzZWxlY3RlZCBvbmUgYW5kIHRoZSBvbmUgaXQgY29uc2lkZXJzIGlzIG1vcmUgc2VjdXJlLiBUZXN0IGNhc2UgNjcgYW5kCiAgNjggKGZvciBOVExNKSB3ZXJlIGZpeGVkIGFuZCB3ZSd2ZSByZWR1Y2VkIGEgcm91bmQtdHJpcCBmb3Igc3BlY2lmaWMgLS1udGxtCiAgZmV0Y2hlcywgYW5kIHRlc3QgY2FzZSA2OSBhbmQgNzAgd2VyZSBhZGRlZCBmb3IgdGVzdGluZyBhdXRoZW50aWNhdGlvbgogICJwaWNraW5nIi4gLS1hbnlhdXRoIGlzIHRoZSBuZXcgY29tbWFuZCBsaW5lIHRvb2wgb3B0aW9uLCBhbmQgSSBhbHNvIGFkZGVkCiAgLS1iYXNpYyBmb3IgY29tcGxldGVuZXNzICh0aGF0J3MgdGhlIGRlZmF1bHQgdHlwZSkuCgotIEZpeGVkIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgdG8gdXNlIHRoZSBpbmZvIHByb3ZpZGVkIGJ5IHRoZSBuZXcgY3VybCAtVgogIG91dHB1dC4KCi0gLS1lbmFibGUtZGVidWcgbm93IHNldHMgdGhlIENVUkxERUJVRyBkZWZpbmUgaW5zdGVhZCBvZiBNQUxMT0NERUJVRywgYXMgaXQKICBpcyBtZWFudCB0byBiZSBhIGdlbmVyaWMgZGVidWcgY29uZGl0aW9uYWwuCgotIGN1cmxfdmVyc2lvbl9pbmZvKCkgY2FuIG5vdyByZXR1cm4gQ1VSTF9WRVJTSU9OX0RFQlVHIGFzIGEgZmVhdHVyZSBiaXQsIHRvCiAgaW5kaWNhdGUgdGhhdCB0aGUgbGlicmFyeSB3YXMgYnVpbHQgd2l0aCBDVVJMREVCVUcgc2V0LgoKLSBSYWxwaCBNaXRjaGVsbCBmb3VuZCBvdXQgdGhhdCBzb21lIHdlYiBhcHBsaWNhdGlvbnMgdmVyeSBiYWRseSB1c2VzIHdoaXRlCiAgc3BhY2VzIGluIExvY2F0aW9uOiByZWRpcmVjdHMsIGFuZCBhcHBhcmVudGx5IElFIGlzIGEgYnJvd3NlciAodGhlIG9ubHkKICBvbmU/KSB0aGF0IHN1cHBvcnRzIHRoaXMgYWJvbWluYXRpb24uIEJhc2VkIG9uIFJhbHBoJ3MgcGF0Y2gsIEkgYWRkZWQgY29kZQogIHRoYXQgbm93IGF0dGVtcHRzIHRvIHJlcGxhY2Ugd2hpdGUgc3BhY2VzIHdpdGggdGhlIHByb3BlciAiJTIwIiBvciAiKyIuCiAgVGVzdCBjYXNlIDQwIGFuZCA0MiB3ZXJlIGFkZGVkIHRvIHZlcmlmeSBteSBjaGFuZ2VzLgoKLSBjdXJsIC1WIG5vdyBhbHNvIG91dHB1dHMgYSBsaXN0IG9mIGZlYXR1cmVzIHRoZSBhdmFpbGFibGUgbGlicmFyeSBvZmZlcnMgKGlmCiAgYW55KS4KCi0gVGhlIGN1cmxfdmVyc2lvbigpIHN0cmluZyBub3cgaW5jbHVkZXMgIkdTUyIgaWYgbGliY3VybCBpcyBidWlsdCB3aXRoIEdTU0FQSQogIHN1cHBvcnQuCgotIERhdmlkIE9ycmVsbCByZXBvcnRlZCB0aGF0IGxpYmN1cmwgc3RpbGwgY3Jhc2hlZCB3aGVuIHNlbmRpbmcgSFVHRSByZXF1ZXN0cwogIG92ZXIgSFRUUFMuLi4gSSBmaXhlZC4KClZlcnNpb24gNy4xMC42LXByZTIgKDE2IEp1bmUgMjAwMykKCkRhbmllbCAoMTYgSnVuZSkKLSBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zIGJpdG1hc2tlZCBpbmZvcm1hdGlvbiB3ZWF0aGVyIE5UTE0gYW5kCiAgR1NTTkVHT1RJQVRFIGFyZSBzdXBwb3J0ZWQsIHNpbmNlIGl0IGlzIGRvb21lZCB0byB2YXJ5IG9uIGRpZmZlcmVudAogIGluc3RhbGxhdGlvbnMuCgotIEkgcmVtYWRlIHRoZSBIVFRQIERpZ2VzdCBjb2RlIHRvIHVzZSB0aGUgTUQ1LWNvZGUgcHJvdmlkZWQgYnkgT3BlblNTTCBpZgogIHRoYXQgaXMgcHJlc2VudCwgYW5kIG9ubHkgdXNlIG91ciBvd24gTUQ1LWNvZGUgaWYgaXQgaXNuJ3QuCiAgCkRhbmllbCAoMTMgSnVuZSkKLSBNb3JlIE5UTE0gaGVscCwgZml4ZXMgYW5kIHBhdGNoZXMgZnJvbSBDcmlzIEJhaWxpZmYuCgotIE1hcnR5IEt1aHJ0IGJyb3VnaHQgaW5jbHVkZSBmaXhlcyBmb3IgbWFraW5nIFZNUyBidWlsZHMgd2FybmluZy1mcmVlLgoKRGFuaWVsICgxMiBKdW5lKQotIE5UTE0gYXV0aGVudGljYXRpb24gd29ya3Mgc29tZXdoYXQgYWdhaW5zdCB0aGUgdGVzdCBzZXJ2ZXJzIHByb3ZpZGVkIGJ5CiAgTWF0aGlhcyBBeGVsc3NvbiBhbmQgQ3JpcyBCYWlsaWZmLiBVc2UgYnkgc2V0dGluZyBDVVJMT1BUX0hUVFBBVVRIIHRvCiAgQ1VSTEFVVEhfTlRMTSB0byBsaWJjdXJsLCBvciAtLW50bG0gZm9yIHRoZSBjdXJsIHRvb2wuIFRlc3QgY2FzZSA2NyBhbmQgNjgKICB3ZXJlIGFkZGVkIGZvciB0aGlzLiBOVExNLXN1cHBvcnQgcmVxdWlyZXMgT3BlblNTTC4KCi0gRGFuIEZhbmRyaWNoIHByb3ZpZGVkIGEgcGF0Y2gsIHRoYXQgZ3JhbnRlZCB0aGF0IGd6aXAgYW5kIGxpYnogYXJlIGF2YWlsYWJsZQogIGF0IGJ1aWxkLXRpbWUsIGNvbXByZXNzZXMgdGhlIGh1Z2VoZWxwIHRleHQgaW4gdGhlIGN1cmwgY29tbWFuZCBsaW5lIGFuZAogIHVuY29tcHJlc3NlcyBpdCBhdCByZXF1ZXN0LiBTYXZlcyBzb21lIH42MEsgaW4gdGhlIGZpbmFsIG91dHB1dCBleGVjdXRhYmxlLgoKRGFuaWVsICgxMSBKdW5lKQotIExvbmcgZGF5IG9mIGZpZ2h0aW5nIHRoZSBOVExNIGRlbW9ucy4KCkRhbmllbCAoMTAgSnVuZSkKLSBNb2RpZmllZCBob3cgdG8gc2V0IGF1dGggdHlwZSB0byBsaWJjdXJsLiBOb3cgdXNlIENVUkxPUFRfSFRUUEFVVEggaW5zdGVhZCwKICBhbmQgcGljayBtZXRob2QuIFN1cHBvcnRlZCBvbmVzIGN1cnJlbnRseSBhcmU6CiAgQ1VSTEFVVEhfQkFTSUMgICAgIC0gZGVmYXVsdCBzZWxlY3Rpb24KICBDVVJMQVVUSF9ESUdFU1QgICAgLSBmb3JtZXJseSBDVVJMT1BUX0hUVFBESUdFU1QKICBDVVJMQVVUSF9HU1NORUdPVElBVEUKCi0gRGFuaWVsIEtvdXJpbCBhZGRlZCBIVFRQIEdTUy1OZWdvdGlhdGUgYXV0aGVudGljYXRpb24gc3VwcG9ydCwgYXMgZGVmaW5lZCBpbgogIHRoZSBJRVRGIGRyYWZ0IGRyYWZ0LWJyZXphay1zcG5lZ28taHR0cC0wNC50eHQuIEluIHVzZSBhbHJlYWR5IGJ5IHZhcmlvdXMKICBNaWNyb3NvZnQgd2ViIGFwcGxpY2F0aW9ucy4gLS1uZWdvdGlhdGUgaXMgdGhlIG5ldyBmYW1pbHkgbWVtYmVyLiBUbyB0YWtlCiAgYWR2YW50YWdlIG9mIHRoaXMsIHlvdSBuZWVkIG9uZSBvZiB0aGVzZSBwYWNrYWdlczoKCiAgbyBIZWltZGFsIEtlcmJlcm9zNSAgICAgICAgICAgICAgIGh0dHA6Ly93d3cucGRjLmt0aC5zZS9oZWltZGFsL2hlaW1kYWwuaHRtbAogIG8gR1NTQVBJIGZyb20gR2xvYnVzICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuZ2xvYnVzLm9yZy8KICBvIEdTU0FQSSBsaWJyYXJpZXMgZnJvbSBNSVQgS2VyYmVyb3M1ICBodHRwOi8vd2ViLm1pdC5lZHUva2VyYmVyb3Mvd3d3LwoKLSBBIG1pc3NpbmcgZW5kaW5nIGJyYWNrZXQgKCddJykgd2hpbGUgZG9pbmcgVVJMIGdsb2JiaW5nIGNvdWxkIGxlYWQgdG8gYQogIHNlZ2ZhdWx0LiBXaGlsZSBmaXhpbmcgdGhpcywgSSBhbHNvIGludHJvZHVjZWQgYmV0dGVyIGVycm9yIHJlcG9ydGluZyBpbiB0aGUKICBnbG9iYmluZyBjb2RlLiAoQWxsIHRoaXMgaXMgYXBwbGljYXRpb24gY29kZSBvdXRzaWRlIGxpYmN1cmwuKQoKRGFuaWVsICg2IEp1bmUpCi0gRGF2aWQgT3JyZWxsIGZvdW5kIG91dCB0aGF0IHNlbmRpbmcgYSBodWdlIEdFVCByZXF1ZXN0IG92ZXIgSFRUUFMgY291bGQKICBtYWtlIGxpYmN1cmwgZmFpbCBhbmQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCgpEYW5pZWwgKDIgSnVuZSkKLSBSaWNoYXJkIEJyYW1hbnRlIGZvdW5kIG91dCB0aGF0ICJDb250ZW50LUxlbmd0aDogMCIgd2FzIG5vdCBwcm9wZXJseSB1c2VkIGJ5CiAgbGliY3VybCBpZiB0aGUgcmVzcG9uc2UtaGVhZGVycyBpbmRpY2F0ZWQgdGhhdCB0aGUgY29ubmVjdGlvbiB3b3VsZCBiZQogIGNsb3NlZC4KCi0gRGF2aWQgQnlyb24ncyBwYXRjaCB3YXMgYXBwbGllZCwgdGhhdCBtYWtlcyB0aGUgLS1wcm9ncmVzcy1iYXIgdGFrZSB0aGUKICBsb2NhbCBzaXplIGludG8gYWNjb3VudCB3aGVuIGRvaW5nIHJlc3VtZWQgZG93bmxvYWRzLgoKLSBGZWVkYmFjayBmcm9tIFNlcmdlIFNlbWFzaGtvIG1hZGUgbWUgY2hhbmdlIHRoZSBlcnJvciBtZXNzYWdlIHJldHVybmVkIHdoZW4KICBDVVJMRV9IVFRQX1JFVFVSTkVEX0VSUk9SIGlzIHJldHVybmVkLgoKLSBBbm9ueW1vdXMgaW4gYnVnIHJlcG9ydCAjNzQ1MTIyIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2hvdWxkIHJlYWxseSBiZSB1c2luZwogIFNTTF9DVFhfc2V0X29wdGlvbnMoLi4uIFNTTF9PUF9BTEwpIHRvIHdvcmsgYXJvdW5kIGZsYXdzIGluIGV4aXN0aW5nIFNTTAogIGltcGxlbWVudGF0aW9ucy4KCkRhbmllbCAoMjcgTWF5KQotIEFuZHJlYXMgTGV5IGFuZCBSaWNoIEdyYXkgaGVscGVkIG1lIHBvaW50IG91dCB0aGF0IG5vIHZlcnNpb24gb2YgSFAtVVggaGFzCiAgdGhlIHN5cy9zZWxlY3QuaCBoZWFkZXIgZmlsZSBzbyBpbmNsdWRpbmcgaXQgdW5jb25kaXRpb25hbGx5IGluIGN1cmwvbXVsdGkuaAogIGlzIG5vdCBhIGdvb2QgdGhpbmcuIE5vdyB3ZSBjaGVjayBmb3IgSFBVWCBhbmQgYXZvaWQgdXNpbmcgdGhhdCBoZWFkZXIgb24KICBzdWNoIHN5c3RlbXMuCgotIFJ1ZHkgS29lbnRvIGV4cGVyaWVuY2VkIHByb2JsZW1zIHdpdGggY3VybCdzIHJlY2VudCBoYWJpdCBvZiBQT1NUaW5nIGRhdGEgaW4KICB0d28gc2VwYXJhdGUgc2VuZCgpIGNhbGxzLCBmaXJzdCB0aGUgaGVhZGVycyBhbmQgdGhlbiB0aGUgZGF0YS4gSSd2ZSBub3cKICBtYWRlIGEgZml4IHRoYXQgZm9yIHN0YXRpYyBhbmQga25vd24gY29udGVudCB0aGF0IGlzIGxlc3MgdGhhbiAxMDBLIGluIHNpemUsCiAgZXZlcnl0aGluZyBpcyBub3cgc2VudCBpbiBvbmUgc2luZ2xlIHN5c3RlbSBjYWxsIGFnYWluLiBUaGlzIGlzIGFsc28gYmV0dGVyCiAgZm9yIG5ldHdvcmsgcGVyZm9ybWFuY2UgcmVhc29ucy4KCi0gSSBtb2RpZmllZCB0aGUgbWFpbiBtYWtlZmlsZSB0byBub3QgYnVpbGQgdGhlIHRlc3Qgc3VpdGUgYW5kIGEgZmV3IG90aGVyCiAgdW5uZWNlc3NhcnkgdGhpbmdzIGJ5IGRlZmF1bHQuIE5vdywgdGhlIHRlc3Qgc3VpdGUgaXMgYnVpbHQgd2hlbiAnbWFrZSB0ZXN0JwogIGlzIHJ1bi4gIFRoaXMgcmVkdWNlcyBidWlsZCB0aW1lIGZvciB0aG9zZSB3aG8gZG9uJ3QgY2FyZSBmb3IgdGhlIHRlc3QKICBzdWl0ZSwgYW5kIGl0IGFsc28gcmVkdWNlcyBjb25mdXNpb24gZm9yIHBlb3BsZSB1c2luZyBwbGF0Zm9ybXMgd2hlcmUgdGhlCiAgdGVzdCBzdWl0ZSBidWlsZCBmYWlscyEKCkRhbmllbCAoMjYgTWF5KQotIENocmlzIExld2lzIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgI2lmZGVmcyBpbiBjdXJsL211bHRpLmggZm9yIFdpbmRvd3MsCiAgd2hpY2ggaXMgbm93IGNvcnJlY3RlZC4KCi0gSmlzIEpveSBmb3VuZCBhbm90aGVyIGZsYXcgaW4gdGhlIFNPQ0s1IGNvZGUsIGFzIGxpYmN1cmwgdHJlYXRlZCB0aGUgc29ja3M1CiAgcHJveHkgYSBsaXR0bGUgdG9vIG11Y2ggbGlrZSBhcyBpZiBpdCB3YXMgYSBodHRwIHByb3h5LgoKRGFuaWVsICgyMyBNYXkpCi0gUmljYXJkbyBDYWRpbWUgZm91bmQgYSBzb2NrZXQgbGVhayB3aGVuIGxpc3RpbmcgZGlyZWN0b3JpZXMgd2l0aG91dAogIGNvbnRlbnRzLiBUZXN0IGNhc2VzIDE0NCBhbmQgMTQ1IHdlcmUgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmaXguCgotIFJ1ZHkgS29lbnRvIGZvdW5kIHlldCBhbm90aGVyIHByb2JsZW0gd2hlbiBhIEhUVFAgc2VydmVyIHJldHVybnMgb25seSBhCiAgc2luZ2xlLWxpbmUgb2YgY29udGVudHMgd2l0aG91dCBhbnkgaGVhZGVycyBhdCBhbGwuIGxpYmN1cmwgdGhlbiBmYWlsZWQgdG8KICBjb3VudCB0aGUgZGF0YSwgdGh1cyByZXR1cm5pbmcgZXJyb3IgNTIgIm5vIGNvbnRlbnRzIi4gVGVzdCBjYXNlIDY2IHdhcwogIGFkZGVkIHRvIHZlcmlmeSB0aGF0IHdlIG5vdyBkbyByaWdodC4KClZlcnNpb24gNy4xMC42LXByZTEgKDIzIE1heSAyMDAzKQoKRGFuaWVsICgyMyBNYXkpCi0gSmlzIGluIGJ1ZyByZXBvcnQgIzc0MTg0MSwgZml4ZWQgYSBidWcgaW4gdGhlIFNPQ0tTNSBwcm94eS11c2luZyBjb2RlLgoKRGFuaWVsICgyMiBNYXkpCi0gRGF2aWQgUmVtYWhsIHNldCB1cCBhIHRlc3Qtc2VydmVyIGZvciBtZSBwcm92aWRpbmcgRGlnZXN0IGF1dGhlbnRpY2F0aW9uLAogIGFuZCBJIHdyb3RlIHRoZSBmaXJzdCB3b3JraW5nIGNvZGUgdGhhdCBzdXBwb3J0IGl0LiBUaGUgdGVzdCBzdWl0ZSB3YXMKICBtb2RpZmllZCBzbGlnaHRseSBhcyB3ZWxsIHRvIHdvcmsgYmV0dGVyIGZvciBpdCBhbmQgLS1kaWdlc3Qgd2FzIGFkZGVkIHRvCiAgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIChhbmQgQ1VSTE9QVF9IVFRQRElHRVNUIHRvIHRoZSBsaWJyYXJ5KS4uLiAgUkZDMjYxNwogIGhhcyBhbGwgdGhlIGdvcnkgZGV0YWlscy4KCkRhbmllbCAoMjEgTWF5KQotIERhdmlkIEJhbGF6aWMgcG9pbnRlZCBvdXQgdGhhdCBjdXJsX3VuZXNjYXBlKCkgZGlkbid0IGNoZWNrIHRoYXQgJS1jb2RlcwogIHdlcmUgY29ycmVjdGx5IGZvbGxvd2VkIGJ5IHR3byBoZXhhZGVjaW1hbCBkaWdpdHMgd2hlbiBpdCB1bmVzY2FwZSBzdHJpbmdzLgogIE5vdywgd2UgZG8gdGhlIGNoZWNrIGFuZCBvbmx5ICVYWCBjb2RlcyBhcmUgdW5lc2NhcGVkIGlmIHRoZSBYIGxldHRlcnMgYXJlCiAgaGV4YWRlY2ltYWxzLgoKLSBHaXNsZSBWYW5lbSBtYWRlIGN1cmwgYnVpbGQgd2l0aCBkamdwcCBvbiBET1MuCgotIEdpc2xlIFZhbmVtIGltcHJvdmVkIHRoZSBta2hlbHAucGwgc2NyaXB0IHRvIG1ha2UgYSBuaWNlciBtYW51YWwgdGhhdCBpcwogIHNob3duIHdpdGggY3VybCAtTS4KCkRhbmllbCAoMjAgTWF5KQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGEgZml4IHRoYXQgbWFrZXMgbGliY3VybCBtb3JlIGNvbnNlcnZhdGl2ZSwgbm90CiAgZXhwZWN0aW5nIGhfYWxpYXNlcyBvZiB0aGUgaG9zdGVudCBzdHJ1Y3QgdG8gYWx3YXlzIGJlIG5vbi1OVUxMLgoKRGFuaWVsICgxOSBNYXkpCi0gQXMgcmVxdWVzdGVkIGJ5IE1hcnRpbiBNaWNobG1heXIgaW4gRGViaWFuIGJ1ZyByZXBvcnQgIzE5MzYzMCwgbGliY3VybCBub3cKICBzdXBwb3J0cyB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGluIHRoZSBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIEFkZGVkCiAgdGVzdCBjYXNlIDYzIHRvIHZlcmlmeSB0aGlzLgoKVmVyc2lvbiA3LjEwLjUgKDE5IE1heSAyMDAzKQoKRGFuaWVsICgxNSBNYXkpCi0gQ2hhbmdlZCB0aGUgb3JkZXIgZm9yIHRoZSBpbl9hZGRyX3QgdGVzdGluZywgYXMgJ3Vuc2lnbmVkIGxvbmcnIHNlZW1zIHRvIGJlCiAgYSB2ZXJ5IGNvbW1vbiB0eXBlIGluZXRfYWRkcigpIHJldHVybnMuCgpEYW5pZWwgKDE0IE1heSkKLSBHZW9yZ2UgQ29tbmlub3MgcHJvdmlkZWQgYSBmaXggdGhhdCBjYWxscyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd2hlbiB3YWl0aW5nCiAgZm9yIEZUUCBjb21tYW5kIHJlc3BvbnNlcyB0YWtlID4xIHNlY29uZC4gSXQnbGwgbWFrZSBhcHBsaWNhdGlvbnMgbW9yZQogICJyZXNwb25zaXZlIiBldmVuIHdoZW4gZGVhbGluZyB3aXRoIHZlcnkgc2xvdyBmdHAgc2VydmVycy4KCkRhbmllbCAoMTIgTWF5KQotIEdlb3JnZSBDb21uaW5vcyBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgdXBsb2FkcyBoYWQgdHdvIHF1aXJrczoKICAgbyB3aGVuIHVzaW5nIEZUUCBQT1JUIGNvbW1hbmQsIGl0IHVzZWQgYmxvY2tpbmcgc29ja2V0cyEKICAgbyBpdCBjb3VsZCBsb29wIGEgbG9uZyB0aW1lIHdpdGhvdXQgZG9pbmcgcHJvZ3Jlc3MgbWV0ZXIgdXBkYXRlcwogIEJvdGggaXRlbXMgYXJlIGZpeGVkIG5vdy4KCkRhbmllbCAoOSBNYXkpCi0gRGFuIEZhbmRyaWNoIGNoYW5nZWQgQ1VSTE9QVF9FTkNPRElORyB0byBzZWxlY3QgYWxsIHN1cHBvcnRlZCBlbmNvZGluZ3MgaWYKICBzZXQgdG8gIiIuICBUaGlzIGZyZWVzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGhhdmluZyB0byBrbm93IHdoaWNoIGVuY29kaW5ncwogIHRoZSBsaWJyYXJ5IHN1cHBvcnRzLgoKLSBEYW4gRmFuZHJpY2ggcG9pbnRlZCBvdXQgd2UgaGFkIHRocmVlIHVubmVjZXNzYXJ5IGZpbGVzIGluIENWUyB0aGF0IGlzCiAgZ2VuZXJhdGVkIHdpdGggbGlidG9vbGl6ZSwgc28gdGhleSdyZSBub3cgcmVtb3ZlZCBhbmQgbGlidG9vbGl6ZSBpcyBpbnZva2VkCiAgYWNjb3JkaW5nbHkgaW4gdGhlIGJ1aWxkY29uZiBzY3JpcHQuCgotIEF2ZXJ5IEZheSBmb3VuZCBvdXQgdGhhdCB0aGUgQ1VSTE9QVF9JTlRFUkZBQ0Ugd2F5IG9mIGZpcnN0IGNoZWNraW5nIGlmIHRoZQogIGdpdmVuIG5hbWUgaXMgYSBuZXR3b3JrIGludGVyZmFjZSBnYXZlIGEgcmVhbCBwZXJmb3JtYW5jZSBwZW5hbHR5IG9uIExpbnV4LAogIHNvIG5vdyB3ZSBtb3JlIGFwcHJvcHJpYXRlbHkgZmlyc3QgY2hlY2sgaWYgaXQgaXMgYW4gSVAgbnVtYmVyIGFuZCBpZiBzbwogIHdlIGRvbid0IGNoZWNrIGZvciBhIG5ldHdvcmsgaW50ZXJmYWNlIHdpdGggdGhhdCBuYW1lLgoKLSBDVVJMT1BUX0ZUUF9VU0VfRVBSVCBhZGRlZC4gU2V0IHRoaXMgdG8gRkFMU0UgdG8gZGlzYWJsZSBsaWJjdXJsJ3MgYXR0ZW1wdHMKICB0byB1c2UgRVBSVCBhbmQgTFBSVCBiZWZvcmUgdGhlIHRyYWRpdGlvbmFsIFBPUlQgY29tbWFuZC4gVGhlIGNvbW1hbmQgbGluZQogIHRvb2wgc2V0cyB0aGlzIG9wdGlvbiB3aXRoICctLWRpc2FibGUtZXBydCcuCgpWZXJzaW9uIDcuMTAuNS1wcmUyICg2IE1heSAyMDAzKQoKRGFuaWVsICg2IE1heSkKLSBLZXZpbiBEZWxhZmllbGQgcmVwb3J0ZWQgYW5vdGhlciBjYXNlIHdoZXJlIHdlIGRpZG4ndCBjb3JyZWN0bHkgY2hlY2sgZm9yCiAgRUFHQUlOIGJ1dCBvbmx5IEVXT1VMREJMT0NLLCB3aGljaCBjYXVzZWQgYmFkbmVzcyBvbiBIUFVYLgoKRGFuaWVsICg0IE1heSkKLSBCZW4gR3JlZWFyIG5vdGljZWQgdGhhdCB0aGUgY2hlY2sgZm9yICd3cml0YWJsZSBhcmd2JyBleGl0ZWQgdGhlIGNvbmZpZ3VyZQogIHNjcmlwdCB3aGVuIHJ1biBmb3IgY3Jvc3MtY29tcGlsaW5nLCB3aGljaCB3YXNuJ3QgbmljZS4gTm93IGl0J2xsIGRlZmF1bHQgdG8KICBubyBhbmQgb3V0cHV0IGEgd2FybmluZyBhYm91dCB0aGUgZmFjdCB0aGF0IGl0IHdhcyBub3QgY2hlY2tlZCBmb3IuCgpEYW5pZWwgKDIgTWF5KQotIEFkZGVkIHRlc3QgY2FzZSA2MiBhbmQgZml4ZWQgc29tZSBtb3JlIG9uIHRoZSBjb29raWUgc2VuZGluZyB3aXRoIGEgY3VzdG9tCiAgSG9zdDogaGVhZGVyIHNldC4KCkRhbmllbCAoMSBNYXkpCi0gQW5keSBDZWRpbG5payBmaXhlZCBhIGZldyBjb21waWxlciB3YXJuaW5ncy4KCi0gTWFkZSB0aGUgIlNTTCByZWFkIGVycm9yOiA1IiBlcnJvciBtZXNzYWdlIG1vcmUgdmVyYm9zZSwgYnkgYWRkaW5nIGNvZGUgdGhhdAogIHF1ZXJpZXMgdGhlIE9wZW5TU0wgbGlicmFyeSB0byBmaWxsIGluIHRoZSBlcnJvciBidWZmZXIuCgpEYW5pZWwgKDMwIEFwcikKLSBBZGRlZCBzeXMvc2VsZWN0LmggaW5jbHVkZSBpbiB0aGUgY3VybC9tdWx0aS5oIGZpbGUsIGFmdGVyIGhhdmluZyBiZWVuCiAgcmVtaW5kZWQgYWJvdXQgdGhpcyBieSBSaWNoIEdyYXkuCgotIEkgbWFkZSBlYWNoIHRlc3Qgc2V0IGl0cyBvd24gc2VydmVyIHJlcXVpcmVtZW50cywgdGh1cyBhYmFuZG9uaW5nIHRoZQogIHByZXZpb3VzIHN5c3RlbSB3aGVyZSB0aGUgdGVzdCBudW1iZXIgaW1wbGllZCB3aGF0IHNlcnZlcihzKSB0byB1c2UgZm9yIGEKICBzcGVjaWZpYyB0ZXN0LgoKLSBEYXZpZCBCYWxhemljIG1hZGUgY3VybCBtb3JlIFJGQzE3MzgtY29tcGxpYW50IGZvciBGVFAgVVJMcywgYnkgZml4aW5nIHNvCiAgdGhhdCBsaWJjdXJsIG5vdyB1c2VzIG9uZSBDV0QgY29tbWFuZCBmb3IgZWFjaCBwYXRoIHBhcnQuIEEgYnVuY2ggb2YgdGVzdAogIGNhc2VzIHdlcmUgZml4ZWQgdG8gd29yayBhY2NvcmRpbmdseS4KCi0gQ29va2llIGZpeGVzOgoKICBBLiBTYXZlIGRvbWFpbnMgaW4gamFycyBsaWtlIE1vemlsbGEgZG9lcy4gSXQgbWVhbnMgYWxsIGRvbWFpbnMgc2V0IGluCiAgICAgU2V0LUNvb2tpZTogaGVhZGVycyBhcmUgZG90LXByZWZpeGVkLgogIEIuIFNhdmUgYW5kIHVzZSB0aGUgJ3RhaWxtYXRjaCcgZmllbGQgaW4gdGhlIE1vemlsbGEvTmV0c2NhcGUgY29va2llIGphcnMKICAgICAodGhlIHNlY29uZCBjb2x1bW4pLgogIEMuIFJlamVjdCBjb29raWVzIHVzaW5nIGlsbGVnYWwgZG9tYWlucyBpbiB0aGUgU2V0LUNvb2tpZTogbGluZS4gQ29uY2VybnMKICAgICBib3RoIGRvbWFpbnMgd2l0aCB0b28gZmV3IGRvdHMgb3IgZG9tYWlucyB0aGF0IGFyZSBvdXRzaWRlIHRoZSBjdXJyZW50bHkKICAgICBvcGVyYXRpbmcgc2VydmVyIGhvc3QncyBkb21haW4uCiAgRC4gU2V0IHRoZSBwYXRoIHBhcnQgYnkgZGVmYXVsdCB0byB0aGUgb25lIHVzZWQgaW4gdGhlIHJlcXVlc3QsIGlmIG5vbmUgd2FzCiAgICAgc2V0IGluIHRoZSBTZXQtQ29va2llIGxpbmUuCgogIFRvIG1ha2UgaXRlbSBDIHJlYWxseSBnb29kLCBJIGFsc28gbWFkZSBsaWJjdXJsIG5vdGljZSBjdXN0b20gSG9zdDogaGVhZGVycwogIGFuZCBleHRyYWN0IHRoZSBob3N0IG5hbWUgc2V0IGluIHRoZXJlIGFuZCB1c2UgdGhhdCBhcyB0aGUgaG9zdCBuYW1lIGZvciB0aGUKICBzaXRlIHdlJ3JlIGdldHRpbmcgdGhlIGNvb2tpZXMgZnJvbS4gVGhpcyBhbGxvd3MgdXNlciB0byBzcGVjaWZ5IGEgc2l0ZSdzCiAgSVAtYWRkcmVzcywgYnV0IHN0aWxsIGJlIGFibGUgdG8gcmVjZWl2ZSBhbmQgc2VuZCBpdHMgY29va2llcyBwcm9wZXJseSBpZgogIHlvdSBwcm92aWRlIGEgdmFsaWQgSG9zdDogbmFtZSBmb3IgdGhlIHNpdGUuCgpEYW5pZWwgKDI5IEFwcikKLSBQZXRlciBLb3ZhY3MgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBDVVJMSU5GT19DT05ORUNUX1RJTUUgd29yayBmaW5lCiAgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlICh0b28pLgoKVmVyc2lvbiA3LjEwLjUtcHJlMSAoMjMgQXByIDIwMDMpCgpEYW5pZWwgKDIzIEFwcikKLSBVcGdyYWRlZCB0byBsaWJ0b29sIDEuNS4KCkRhbmllbCAoMjIgQXByKQotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCB0aGF0IGN1cmxfZWFzeV9zZXRvcHQoKSB3aWxsIGFsd2F5cyAod3JvbmdseSkKICByZXR1cm4gQ1VSTEVfT0sgbm8gbWF0dGVyIHdoYXQgaGFwcGVucy4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHNvbWUgZ3ppcCBkZWNvbXByZXNzaW9uIGJ1Z3MgYW5kIGZsYXdzLgoKRGFuaWVsICgxNiBBcHIpCi0gRml4ZWQgbWlub3IgdHlwbyBpbiBtYW4gcGFnZSwgcmVwb3J0ZWQgaW4gdGhlIERlYmlhbiBidWcgdHJhY2tlci4KCkRhbmllbCAoMTUgQXByKQotIEZpeGVkIHNvbWUgRlRQIHRlc3RzIGluIHRoZSB0ZXN0IHN1aXRlIHRoYXQgZmFpbGVkIG9uIG15IFNvbGFyaXMgaG9zdCwgZHVlCiAgdG8gdGhlIGNvbmZpZy5oIG5vdCBiZWluZyBpbmNsdWRlZCBiZWZvcmUgdGhlIHN5c3RlbSBoZWFkZXJzLiBXaGVuIGRvbmUgdGhhdAogIHdheSwgaXQgZGlkIGdldCBhIG1peGVkIHNlbnNlIG9mIGlmIGJpZyBmaWxlcyBhcmUgc3VwcG9ydGVkIG9yIG5vdCBhbmQgdGhlbgogIHN0YXQoKSBhbmQgZnN0YXQoKSAoYXMgdXNlZCBpbiB0ZXN0IGNhc2UgNTA1KSBnb3QgY29uZnVzZWQgYW5kIGZhaWxlZCB0bwogIHJldHVybiBhIHByb3BlciBmaWxlIHNpemUuCgotIEZvcm1wb3N0aW5nIGEgZmlsZSB1c2luZyBhIC5odG1sIHN1ZmZpeCBpcyBub3cgcHJvcGVybHkgc2V0IHRvIENvbnRlbnQtVHlwZTogICAgdGV4dC9odG1sLgoKRGFuaWVsICgxNCBBcHIpCi0gRml4ZWQgdGhlIFNTTCBlcnJvciBoYW5kbGluZyB0byByZXR1cm4gcHJvcGVyIFNTTCBlcnJvciBtZXNzYWdlcyBhZ2FpbiwgdGhleQogIGJyb2tlIGluIDcuMTAuNC4gSSBhbHNvIGF0dGVtcHQgdG8gdHJhY2sgZG93biBDQSBjZXJ0IHByb2JsZW1zIGFuZCB0aGVuCiAgcmV0dXJuIHRoZSBDVVJMRV9TU0xfQ0FDRVJUIGVycm9yIGNvZGUuCgotIFRoZSBjdXJsIHRvb2wgbm93IGludGVyY2VwdHMgdGhlIENVUkxFX1NTTF9DQUNFUlQgZXJyb3IgY29kZSBhbmQgZGlzcGxheXMKICBhIGZhaXJseSBiaWcgYW5kIGV4cGxhbmF0b3J5IGVycm9yIG1lc3NhZ2UuIEtldmluIFJvdGggaGVscGVkIG1lIG91dCB3aXRoCiAgdGhlIHdvcmRpbmcuCgpEYW5pZWwgKDExIEFwcikKLSBOaWMgSGluZXMgcHJvdmlkZWQgYSBzZWNvbmQgcGF0Y2ggZm9yIGd6aXAgZGVjb21wcmVzc2lvbiwgYW5kIGZpeGVkIGEgYnVnCiAgd2hlbiBkZWZsYXRlIG9yIGd6aXAgY29udGVudHMgd2VyZSBkb3dubG9hZGVkIHVzaW5nIGNodW5rZWQgZW5jb2RpbmcuCgotIERhbiBGYW5kcmljaCBtYWRlIGxpYmN1cmwgc3VwcG9ydCBhdXRvbWF0aWMgZGVjb21wcmVzc2lvbiBvZiBnemlwIGNvbnRlbnRzCiAgKGFzIGFuIGFkZGl0aW9uIHRvIHRoZSBwcmV2aW91cyBkZWZsYXRlIHN1cHBvcnQpLgoKLSBJIG1hZGUgdGhlIENXRCBjb21tYW5kIGR1cmluZyBGVFAgc2Vzc2lvbiBjb25zaWRlciBhbGwgMnh5IGNvZGVzIHRvIGJlIE9LCiAgcmVzcG9uc2VzLgoKRGFuaWVsICgxMCBBcHIpCi0gVmxhZCBLcnVwaW4gZml4ZWQgYSBVUkwgcGFyc2luZyBpc3N1ZS4gVVJMcyB0aGF0IHdlcmUgbm90IHVzaW5nIGEgc2xhc2gKICBhZnRlciB0aGUgaG9zdCBuYW1lLCBidXQgc3RpbGwgaGFkICI/IiBhbmQgcGFyYW1ldGVycyBhcHBlbmRlZCwgYXMgaW4KICAiaHR0cDovL2hvc3RuYW1lLmNvbT9mb29iYXI9bW9vIiwgd2VyZSBub3QgcHJvcGVybHkgcGFyc2VkIGJ5IGxpYmN1cmwuCgpEYW5pZWwgKDkgQXByKQotIE1hZGUgQ1VSTE9QVF9USU1FQ09ORElUSU9OIHdvcmsgZm9yIEZUUCB0cmFuc2ZlcnMsIHVzaW5nIHRoZSBzYW1lIHN5bnRheCBhcwogIGZvciBIVFRQLiBUaGlzIHRoZW4gbWFkZSAteiB3b3JrIGZvciBmdHAgdHJhbnNmZXJzIHRvby4gQWRkZWQgdGVzdCBjYXNlIDEzOQogIGFuZCAxNDAgZm9yIHZlcmlmeWluZyB0aGlzLgoKLSBHZXR0aW5nIHRoZSBmaWxlIGRhdGUgb2YgYW4gZnRwIGZpbGUgdXNlZCB0aGUgd3JvbmcgdGltZSB6b25lIHdoZW4KICBkaXNwbGF5ZWQuIEl0IGlzIHN1cHBvc2VkbHkgYWx3YXlzIEdNVC4gQWRkZWQgdGVzdCBjYXNlIDE0MSBmb3IgdGhpcy4KCi0gTWFkZSB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgc3VwcG9ydCBNRFRNLgoKLSBUaGUgZGVmYXVsdCBERUJVR0ZVTkNUSU9OLCBhcyBlbmFibGVkIHdpdGggQ1VSTE9QVF9WRVJCT1NFIG5vdyBvdXRwdXRzCiAgQ1VSTElORk9fSEVBREVSX0lOIGRhdGEgYXMgd2VsbC4gVGhlIG1vc3Qgbm90YWJsZSBlZmZlY3QgZnJvbSB0aGlzIGlzIHRoYXQKICB1c2luZyBjdXJsIC12LCB5b3UgZ2V0IHRvIHNlZSB0aGUgaW5jb21pbmcgImhlYWRlcnMiIGFzIHdlbGwuIFRoaXMgaXMKICBwZXJoYXBzIG1vc3QgdXNlZnVsIHdoZW4gZG9pbmcgZnRwLgoKRGFuaWVsICg4IEFwcikKLSBKYW1lcyBCdXJzYSBmaXhlZCBhIGZsYXcgaW4gdGhlIENvbnRlbnQtVHlwZSBleHRyYWN0aW9uIGNvZGUsIHdoaWNoIG1pc3NlZAogIHRoZSBmaXJzdCBsZXR0ZXIgaWYgbm8gc3BhY2UgZm9sbG93ZWQgdGhlIGNvbG9uLgoKLSBNYWdudXMgTmlsc3NvbiBwb2ludGVkIG91dCB0aGF0IHNoYXJlLmMgd2FzIG1pc3NpbmcgaW4gdGhlIE1TVkMgcHJvamVjdAogIGZpbGUuCgpEYW5pZWwgKDYgQXByKQotIFJ5YW4gV2VhdmVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgQ0EgY2VydCBidW5kbGUgbm90IGdldCBpbnN0YWxsZWQKICBhbnltb3JlIHdoZW4gJ2NvbmZpZ3VyZSAtLXdpdGhvdXQtc3NsJyBoYXMgYmVlbiB1c2VkLgoKRGFuaWVsICg0IEFwcikKLSBNYXJ0aWpuIEJyb2VubGFuZCBmb3VuZCBhbm90aGVyIGNhc2VzIHdoZXJlIGEgc2VydmVyIGFwcGxpY2F0aW9uIGRpZG4ndAogIGxpa2UgdGhlIGJvdW5kYXJ5IHN0cmluZyB1c2VkIGJ5IGN1cmwgd2hlbiBkb2luZyBhIG11bHRpLXBhcnQvZm9ybXBvc3QuIFdlCiAgbW9kaWZpZWQgdGhlIGJvdW5kYXJ5IHN0cmluZyB0byBsb29rIGxpa2UgdGhlIG9uZSBJRSB1c2VzLCBhcyB0aGlzIGlzCiAgcHJvYmFibHkgZ29ubmEgbWFrZSBjdXJsIHdvcmsgd2l0aCBtb3JlIGFwcGxpY2F0aW9ucy4KCkRhbmllbCAoMyBBcHIpCi0gS2V2aW4gUm90aCByZXBvcnRlZCB0aGF0IGEgYnVuY2ggb2YgdGVzdHMgZmFpbHMgb24gY3lnd2luLiBPbmUgc2V0IGZhaWxzCiAgd2hlbiB1c2luZyBwZXJsIDUuOCAoYW5kIHRoZXkgcnVuIGZpbmUgd2l0aCBwZXJsIDUuNiksIGFuZCBhbm90aGVyIHNldAogIGZhaWxlZCBiZWNhdXNlIG9mIGFuIGFydGlmYWN0IGluIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0aGF0IEkKICBjb3JyZWN0ZWQuIEl0IHR1cm5lZCBvdXQgdGhlIEZUUCBzZXJ2ZXIgY29kZSB3YXMgc3RpbGwgaGF2aW5nIGEgZmlsZSBvcGVuZWQKICB3aGlsZSB0aGUgbWFpbiB0ZXN0IHNjcmlwdCByZW1vdmVkIGl0IGFuZCBpbnZva2VkIHRoZSBIVFRQIHNlcnZlciB0aGF0CiAgYXR0ZW1wdGVkIHRvIGNyZWF0ZSB0aGUgc2FtZSBmaWxlIG5hbWUgb2YgdGhlIGZpbGUgdGhlIEZUUCBzZXJ2ZXIga2VwdCBvcGVuLgogIFRoaXMgb3BlcmF0aW9uIHdvcmtzIGZpbmUgb24gdW5peCwgYnV0IG5vdCBvbiBjeWd3aW4uCgpWZXJzaW9uIDcuMTAuNCAoMiBBcHIgMjAwMykKCkRhbmllbCAoMSBBcHIpCi0gQWRkZWQgdGVzdCBjYXNlIDUwNSB0byBleGVyY2lzZSBGVFAgdXBsb2FkIHdpdGggcmVuYW1lIGRvbmUgd2l0aCBsaWJjdXJsLAogIGFuZCBmb3IgdGhhdCBJIGhhZCB0byBleHRlbmQgdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRvIGRlYWwgd2l0aCB0aGUKICBSTkZSIGFuZCBSTlRPIGNvbW1hbmRzLgoKRGFuaWVsICgzMSBNYXIpCi0gRXZlbiBtb3JlIFNTTCBjb25maWcgY2hlY2sgbW9kaWZpY2F0aW9ucyBhZnRlciBSaWNoYXJkJ3MgdGVzdGluZy4KClZlcnNpb24gNy4xMC40LXByZTYgKDMxIE1hciAyMDAzKQoKRGFuaWVsICgzMSBNYXIpCi0gTW9yZSBmaXhlcyBmb3IgdGhlIFNTTCBzZXNzaW9uIElEIGNhY2hlIGNoZWNrcyB3aGVuIFNTTCBjb25maWdzIGFyZSBjaGFuZ2VkCiAgYmV0d2VlbiBjb25uZWN0aW9ucy4gQmFzZWQgb24gdGVzdHMgYW5kIHRhbGtzIHdpdGggUmljaGFyZCBCcmFtYW50ZS4KCi0gR3VpbGxhdW1lIENvdHRlbmNlYXUgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFkZGVkIENVUkxPUFRfVU5SRVNUUklDVEVEX0FVVEguCiAgV2hlbiBlbmFibGVkLCBpdCB3aWxsIHByZXZlbnQgbGliY3VybCBmcm9tIGxpbWl0aW5nIHRvIHdoaWNoIGhvc3QgaXQgc2VuZHMKICB1c2VyK3Bhc3N3b3JkIHRvIHdoZW4gZm9sbG93aW5nIGxvY2F0aW9ucy4gQnkgZGVmYXVsdCwgbGliY3VybCBvbmx5IHNlbmRzCiAgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhlIG9yaWdpbmFsIGhvc3QgdXNlZCBpbiB0aGUgZmlyc3QgVVJMLCBidXQgd2l0aCB0aGlzCiAgb3B0aW9uIHNldCBpdCB3aWxsIHNlbmQgdGhlIGF1dGggaW5mbyB0byBhbGwgaG9zdHMgaXQgZm9sbG93cyBsb2NhdGlvbgogIGhlYWRlcnMgdG8uIFRoZSBuZXcgdG9vbCBjb21tYW5kIGxpbmUgb3B0aW9uIGZvciB0aGlzIGlzIG5hbWVkCiAgIi0tbG9jYXRpb24tdHJ1c3RlZCIuCgotIEZyYW5raWUgRm9uZyByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBsaWJjdXJsIGlmIHlvdSByZS11c2VkIGFuIGVhc3kgaGFuZGxlCiAgd2l0aCBhIHByb3h5LCBhbmQgeW91IGZpcnN0IG1hZGUgYSBodHRwczovLyBjb25uZWN0aW9uIHRvIGEgaG9zdCBhbmQgdGhlbgogIHN3aXRjaGVkIHRvIGEgaHR0cDovLyBvbmUgdG8gdGhlIHNhbWUgaG9zdC4gbGliY3VybCB3b3VsZCB0aGVuIHdyb25nbHkgcmUtdXNlCiAgdGhlIHNhbWUgY29ubmVjdGlvbiBmb3IgaXQgYW5kIGZhaWwgdG8gZ2V0IHRoZSBzZWNvbmQgVVJMIHByb3Blcmx5CgpEYW5pZWwgKDI5IE1hcikKLSBEYW4gU2hlYXJlcidzIGZpeCB0aGF0IG1ha2VzIGN1cmwgY29tcGxhaW4gaWYgaW52b2tlZCB3aXRoIG5vdGhpbmcgYnV0ICJjdXJsCiAgLU8iIHdhcyBhcHBsaWVkLgoKRGFuaWVsICgyNiBNYXIpCi0gQnJ5YW4gS2VtcCB3YXMgZnJpZW5kbHkgZW5vdWdoIHRvIGxlbmQgbWUgYW4gYWNjb3VudCBvbiBoaXMgUmVkaGF0IDkgYm94IGFuZAogIEkgY291bGQgZml4IHRoZSBjb25maWd1cmUgcHJvYmxlbXMgb24gcmVkaGF0IDguMSBhbmQgOSBpbiBubyB0aW1lIHRoYW5rcyB0bwogIHRoaXMuIFRoYW5rcyBhIGJ1bmNoIEJyeWFuIQoKRGFuaWVsICgyNSBNYXIpCi0gUmVuYW1lZCBjb25maWd1cmUuaW4gdG8gY29uZmlndXJlLmFjCgpWZXJzaW9uIDcuMTAuNC1wcmU1ICgyNSBNYXIgMjAwMykKCkRhbmllbCAoMjUgTWFyKQotIFJpY2hhcmQgQnJhbWFudGUgcHJvdmlkZWQgYSBmaXggZm9yIGEgaGFuZGxlIHJlLXVzZSBwcm9ibGVtIHNlZW4gd2hlbiB5b3UKICBjaGFuZ2Ugb3B0aW9ucyBvbiBhbiBTU0wtZW5hYmxlZCBjb25uZWN0aW9uIGJldHdlZW4gcmVxdWVzdHMuIFByZXZpb3VzbHksCiAgY2hhbmdpbmcgcGVlciB2ZXJpZmljYXRpb24gb3IgaG9zdCB2ZXJpZmljYXRpb24gYW5kIHNpbWlsYXIgdGhpbmdzIHdhcyBub3QKICB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBhIGNvbm5lY3Rpb24gd2VyZSBjaGVja2VkIGZvciByZS11c2UgYW5kIHRodXMKICBlbmFibGluZyBzdHJpY3RlciBjaGVjayBiZXR3ZWVuIHJlcXVlc3RzIG9uIGEgcmUtdXNlZCBjb25uZWN0aW9uIG1hZGUgbm8KICBkaWZmZXJlbmNlIGFuZCB0aGUgY29ubmVjdGlvbiB3b3VsZCB0aHVzIGJlIHVzZWQgZXJyb25lb3VzbHkuCgpEYW5pZWwgKDI0IE1hcikKLSBH9nR6IEJhYmluLUViZWxsIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGNhLWJ1bmRsZS5jcnQgZmlsZSBjb250YWluZWQgYQogIGNlcnRpZmljYXRlIGZyb20gVHJ1c3RjZW50ZXIgdGhhdCB3YXMgYSBkZW1vIGNlcnRpZmljYXRlIG9ubHkgdGhhdCB3YXMgbmV2ZXIKICBpbnRlbmRlZCB0byBiZSBwYXJ0IG9mIGEgQ0EgYnVuZGxlLgoKRGFuaWVsICgyMSBNYXIpCi0gTGlmZSBpcyBhIG15c3RlcnkuIFdpdGhpbiBhIHRpbWUgcGVyaW9kIG9mIDE3IGhvdXJzLCBUaW0gUG9wZSBhbmQgTWljaGFlbAogIENodXJjaGlsbCBmaWxlZCBvbmUgYnVnIHJlcG9ydCBlYWNoLCBib3RoIGlkZW50aWZ5aW5nIHByb2JsZW1zIHdpdGggYSBzZWNvbmQKICB0cmFuc2ZlciB3aGVuIGRvaW5nIHBlcnNpc3RlbnQgdHJhbnNmZXJzIHJlLXVzaW5nIGEgY29ubmVjdGlvbi4gVGltJ3Mgb25lIGlzCiAgIzcwNjYyNCwgbGFiZWxlZCAiTXVsdGlwbGUgdXBsb2FkcyBwZXIgaGFuZGxlIGZhaWwiIGFuZCBNaWNoYWVsJ3MgIzcwNzAwMwogICJEb2VzIG5vdCBzZW5kIEF1dGhvcml6YXRpb246IGhlYWRlciB3aGVuIHJldXNpbmcgY29ubmVjdGlvbiIuIEkgY291bGQgdHJhY2sKICBib3RoIGRvd24gdG8gdGhlIHNhbWUgcGllY2Ugb2YgbG9naWMgYW5kIGl0IHR1cm5lZCBvdXQgbGliY3VybCB3YXMgbm90IHVzaW5nCiAgbmV3IHNldHRpbmdzIHByb3Blcmx5IHdoZW4gcmUtdXNpbmcgYW4gZXhpc3RpbmcgY29ubmVjdGlvbi4gVGhpcyBjb25jZXJuZWQKICBib3RoIHVwbG9hZGluZyBhbmQgZG93bmxvYWRpbmcgYW5kIGludm9sdmVkIGV4YWN0bHkgdGhvc2UgcGllY2VzIHRoZXNlIHR3bwogIHJlcG9ydHMgaWRlbnRpZmllZC4gVGhpcyBjb2RlIGhhcyBiZWVuIHRoaXMgZmF1bHR5IHNpbmNlIHRoZSBkYXkgSQogIGludHJvZHVjZWQgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN1cHBvcnQgaW4gbGliY3VybCwgbW9yZSB0aGFuIDIgeWVhcnMgYWdvLgoKRGFuaWVsICgyMCBNYXIgMjAwMykKLSBGaXZlIHllYXIgYW5uaXZlcnNhcnkuIFRvZGF5IGZpdmUgeWVhcnMgYWdvLCB0aGUgZmlyc3QgZXZlciBjdXJsIHJlbGVhc2Ugc2F3CiAgdGhlIGxpZ2h0IG9mIGRheS4KCkRhbmllbCAoMTcgTWFyKQotIEFuZHkgQ2VkaWxuaWsgY29ycmVjdGVkIGZsYXdzIGluIHNvbWUgbGliY3VybCBleGFtcGxlLXVzYWdlIHNvdXJjZXMuCgpEYW5pZWwgKDE2IE1hcikKLSBKdWFuIEYuIENvZGFnbm9uZSByZXBvcnRlZCB0aGF0IHRoZSBmaXggZnJvbSBNYXJjaCAybmQgd2FzIGluY29tcGxldGUuCgotIEFkZGVkIGNvZGUgdG8gdGhlIGNvbmZpZ3VyZS5pbiB0byBjaGVjayBmb3Igc2VsZWN0KCkgYXJndW1lbnQgdHlwZXMuIEkndmUKICBub3QgbWFkZSBhbnkgY29kZSB1c2UgdGhlIHJlc3VsdHMganVzdCB5ZXQgdGhvdWdoLgoKRGFuaWVsICgxNSBNYXIpCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgdHdvIHBhdGNoZXMgdG8gYnVpbGQgYmV0dGVyIG9uIFdpbmRvd3MuCgotIEFkanVzdGVkIHRoZSB0ZXN0IHN1aXRlIGNvZGUgdG8gYmV0dGVyIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZXJ2ZXIocykgcmVxdWlyZWQKICBmb3IgYSBzcGVjaWZpYyB0ZXN0IGlzIHByb3Blcmx5IHN0YXJ0ZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2UgaXMgYXR0ZW1wdGVkLgogIE1hbnkgdGVzdHMgbm93IHJ1biBhIGxvdCBmYXN0ZXIgdGhhbiBiZWZvcmUuCgpEYW5pZWwgKDE0IE1hcikKLSBBbm90aGVyIGNvbmZpZ3VyZS5pbiBhZGp1c3RtZW50IG1hZGUgdGhlIGNvbmZpZ3VyZSBkZXRlY3QgZnVuY3Rpb25zIHByb3Blcmx5CiAgb24gSFBVWCBub3cuCgpEYW5pZWwgKDEzIE1hcikKLSBQaGlsaXBwZSBSYW91bHQgZml4ZWQgcHJlNC1jb21waWxlIHF1aXJrcyBmb3IgRnJlZUJTRC4KClZlcnNpb24gNy4xMC40LXByZTQgKDEzIE1hciAyMDAzKQoKRGFuaWVsICgxMyBNYXIpCi0gQWRkZWQgYSBiYWNrdXAtY2hlY2sgZm9yIGZ1bmN0aW9ucyB0aGF0IGFyZW4ndCBmb3VuZCBieSBBQ19DSEVDS19GVU5DUygpCiAgYXMgSSBiZWxpZXZlIHNvbWUgY2hlY2tzIG9uIEhQVVggbmVlZCB0aGlzLiBBdCBsZWFzdCBzb21lIG9mIHRoZSBpbmZvIGdpdmVuCiAgdG8gdXMgYnkgUmljayBKb25lcyBzZWVtZWQgdG8gaW5kaWNhdGUgdGhpcy4KCkRhbmllbCAoMTIgTWFyKQotIFRob21hcyBUb25pbm8gZm91bmQgb3V0IHRoYXQgaWYgeW91IHVzZWQgdGhlIGN1cmwgdG9vbCB0byBkbyBQVVQgb3BlcmF0aW9ucwogIGFzIGluICdjdXJsIHd3dy5mb28uY29tL2Rpci8gLVQgZmlsZScgYW5kIHRoZSBmaWxlIG5hbWUgaW5jbHVkZWQgZm9yIGV4YW1wbGUKICBzcGFjZSBvciBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgZG9uJ3QgYmVsb25nIGluIFVSTHMsIGN1cmwgZGlkIG5vdCBwcm9wZXJseQogIFVSTCBlbmNvZGUgdGhlbSBiZWZvcmUgdXNpbmcgdGhlbSBpbiB0aGUgVVJMLgoKLSBBZGRlZCBhbiBvcHRpb24gdG8gY29uZmlndXJlIGNhbGxlZCAtLWVuYWJsZS1saWJnY2MgdGhhdCBzaW1wbHkgYWRkcyAtbGdjYwogIHRvIHRoZSBMSUJTIHZhcmlhYmxlLCBhcyB0aGlzIHNlZW1zIHRvIGJlIGEgY29tbW9uIHByb2JsZW0uCgotIEkgbW9kaWZpZWQgdGhlIGNvbmZpZ3VyZS5pbiBmaWxlLCBzbyB0aGF0IHRoZSBoZWFkZXJzIGFyZSBub3cgY2hlY2tlZCBpbiBhbgogIG9yZGVyIG9mICJ2aWFsaXR5Ii4gV2UgbXVzdCBhbHNvIG1ha2Ugc3VyZSB0byB1c2UgdGhlICJkZWZhdWx0IGhlYWRlcnMiCiAgcGFyYW1ldGVyIHRvIEFDX0NIRUNLX0hFQURFUlMoKSBzbyB0aGF0IGhlYWRlcnMgYXJlIGNoZWNrZWQgd2l0aCB0aGUgcHJvcGVyCiAgcHJlcmVxdWlzaXRlcyBpbmNsdWRlZCAoaS5lIGFsbCB0aGUgbWFqb3IgYW5kIGdlbmVyYWxseSBpbXBvcnRhbnQgaGVhZGVyCiAgZmlsZXMgYXJlIGluY2x1ZGVkIHRoZXJlIGJ5IGRlZmF1bHQpLiBUaGlzIG1pZ2h0IGJlIHdoYXQgd2UgbmVlZCBmb3IgdmFyaW91cwogIFN1biwgSFAsIEFJWCBhbmQgVHJ1NjQgc3lzdGVtcyB0byBiZWhhdmUgZ29vZCBhZ2FpbiBvbiB0aGUgaGVhZGVyIGNoZWNrCiAgZnJvbnQuCgotIFJpY2sgSm9uZXMgcG9pbnRlZCBvdXQgYSBmZXcgY29tcGlsZXIgd2FybmluZ3Mgb24gSFAtVVggdGhhdCBJIGFkZHJlc3NlZC4KCi0gSSBtYWRlIHRoZSBjb25maWd1cmUgLS1oZWxwIG91dHB1dCBuaWNlciBieSB1c2luZyBBQ19IRUxQX1NUUklORygpIGEgbG90CiAgbW9yZS4KCkRhbmllbCAoMTEgTWFyKQotIENocmlzdG9waGUgRGVtb3J5IGZpeGVkIHRoZSBzb2NrZXQgc2VuZGluZyBjb2RlIHRvIHdvcmsgYmV0dGVyIG9uIEhQLVVYCiAgd2hlbiBzZW5kaW5nIGRhdGEgdG8gYSBzb2NrZXQgdGhhdCB3b3VsZCBibG9jay4gSXQgdGhlbiByZXR1cm5zIEVBR0FJTiwgbm90CiAgRVdPVUxEQkxPQ0suCgotIFJpY2hhcmQgR29ydG9uIGltcHJvdmVkIHRoZSBzZWVkaW5nIGZ1bmN0aW9uIGZvciBzeXN0ZW1zIHdpdGhvdXQgYSBnb29kCiAgYW5kIHJlbGlhYmxlIHJhbmRvbSBzb3VyY2UuCgotIFJpY2hhcmQgR29ydG9uIGZpeGVkIGEgZmV3IHdhcm5pbmdzIHRoYXQgcG9wcGVkIHVwIHdoZW4geW91IGJ1aWx0IGN1cmwKICB1c2luZyB0aGUgU3VuIGNvbXBpbGVyIG9uIGEgNjRiaXQgU1BBUkMgcGxhdGZvcm0uCgotIE1hcnRpbiBDLiBNYXJ0aW4gZml4ZWQgYSBjYXNlIHdoZXJlIGEgY29ubmVjdCBmYWlsdXJlIHVzaW5nIHRoZSBtdWx0aQogIGludGVyZmFjZSBkaWRuJ3QgcHJvZHVjZSBhIGh1bWFuIHJlYWRhYmxlIGVycm9yIHN0cmluZy4KCkRhbmllbCAoMTAgTWFyKQotIFJldmVydGVkIGx0bWFpbi5zaCBiYWNrIHRvIGxpYnRvb2wgMS40LjIgc3RhdHVzIGFnYWluLCBhcyB0aGUgMS40LjMgdmVyc2lvbgogIGJyb2tlIHRoZSBidWlsZCBvbiBudW1lcm91cyBwbGF0Zm9ybXMuIEl0IHNlZW1zIHRoYXQgbGlidG9vbCAxLjQuMyBwdXRzIHNvbWUKICByZXF1aXJlbWVudHMgb24gd2hhdCB2ZXJzaW9ucyBvZiB0aGUgb3RoZXIgdG9vbHMgKGF1dG9jb25mICsgYXV0b21ha2UpIHRoYXQKICBJIGFtIG5vdCBmYW1pbGlhciB3aXRoIGFuZCB0aHVzIEkgY291bGRuJ3QgZnVsZmlsbCBhdCB0aGlzIHBvaW50LgoKICBZZXMsIHRoaXMgaXMgbW9yZSB0aGFuIG1pbGRseSBmcnVzdHJhdGluZy4KCkRhbmllbCAoNyBNYXIpCi0gUnVuIGxpYnRvb2xpemUgdmVyc2lvbiAxLjQuMy4KClZlcnNpb24gNy4xMC40LXByZTMgKDQgTWFyIDIwMDMpCgpEYW5pZWwgKDMgTWFyKQotIEFkZGVkIHNoYXJlLm9iaiB0byB0aGUgVkM2IGFuZCBCb3JsYW5kIGxpYmN1cmwgbWFrZWZpbGVzLgoKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gZm91bmQgYW5kIGludmVzdGlnYXRlZCBhIHByb2JsZW0gd2l0aCBsaWJjdXJsIG9uIEFJWCwKICBwcmVzdW1hYmx5IG9ubHkgb24gNC4zIG9yIGxhdGVyLiBnZXRob3N0YnluYW1lX3IoKSBpcyBub3QgcmV0dXJuaW5nIGRhdGEKICB0aGF0IGlzIHBvc3NpYmxlIHRvICJrZWVwIiBhbmQgY2FjaGUgdGhlIHdheSBsaWJjdXJsIGRvZXMuIEJ1dCBpbnN0ZWFkIHRoZXNlCiAgdmVyc2lvbnMgb2YgQUlYIHVzZXMgYSBnZXRob3N0YnluYW1lKCkgdGhhdCB3b3JrcyB0aHJlYWQtc2FmZWx5IHdlIGNhbgogIGluc3RlYWQgdXNlIHRoZSBvcmRpbmFyeSBnZXRob3N0YnluYW1lKCkgYW5kIG91ciBwYWNrX2hvc3RlbnQoKSBhcHByb2FjaCB0bwogIGFjaGlldmUgd2hhdCB3ZSB3YW50LiBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgYXR0ZW1wdHMgdG8gZGV0ZWN0IEFJWCA0LjMgb3IKICBsYXRlciB0byBhZGp1c3QgZm9yIHRoaXMuCgpEYW5pZWwgKDIgTWFyKQotIEp1YW4gRi4gQ29kYWdub25lIGZvdW5kIGEgcHJvYmxlbSBpbnRyb2R1Y2VkIGluIDcuMTAuMyB3aGVuIHlvdSBmaXJzdCBkaWQgYQogIFBPU1QgYW5kIHRoZW4gYmFjayB0byBhIEdFVCB1c2luZyB0aGUgc2FtZSBlYXN5IGhhbmRsZS4KCkRhbmllbCAoMjggRmViKQotIFJlbW92ZWQgdGhlIHN0cmVxdWFsIGFuZCBzdHJuZXF1YWwgZGVmaW5lcyBmcm9tIGN1cmwvY3VybC5oIGhlYWRlci4gVGhleQogIHdlcmUgbmV2ZXIgbWVhbnQgZm9yIHRoZSBwdWJsaWMgaGVhZGVyIGFueXdheS4gUGhpbGlwcGUgUmFvdWx0IGJyb3VnaHQgaXQKICB1cC4KCi0gSmFtZXMgQnVyc2EgZml4ZWQgdGhlIFJJU0MgT1MgYnVpbGQuCgpEYW5pZWwgKDI3IEZlYikKLSBBdmVyeSBGYXkgcG9pbnRlZCBvdXQgdGhlIHZlcnkgbWlzbGVhZGluZyBjdXJsX211bHRpX2luZm9fcmVhZCBtYW4gcGFnZSwgYW5kCiAgSSB1cGRhdGVkIGl0IHRvIGJlY29tZSBtb3JlIGFjY3VyYXRlLgoKLSBTYWx2YXRvcmUgU29ycmVudGlubyBmb3VuZCBhIHByb2JsZW0gd2l0aCBGVFAgZG93bmxvYWRpbmcgdGhhdCB0dXJuZWQgb3V0IHRvCiAgYmUgaGlzIEZUUCBzZXJ2ZXIgcmV0dXJuaW5nIHNpemUgemVybyAoMCBieXRlcykgd2hlbiBTSVpFIHdhcyB1c2VkIG9uIGEgZmlsZQogIHdoaWxlIGJlaW5nIGluIEJJTkFSWSBtb2RlLiBXZSBub3cgbWFrZSBhIHNlY29uZCBjaGVjayBmb3IgdGhlIGFjdHVhbCBzaXplCiAgYnkgc2Nhbm5pbmcgdGhlIFJFVFIgcmVwbHkgYW55d2F5LCBldmVuIGlmIHRoZSBTSVpFIGNvbW1hbmQgcmV0dXJuZWQgMC4KCkRhbmllbCAoMjYgRmViKQotIEt5bGUgU2FsbGVlIHJlcG9ydGVkIGEgY2FzZSB3aGVyZSBoZSB3b3VsZCBkbyBhIHRyYW5zZmVyIHRoYXQgZGlkbid0IHVwZGF0ZQogIHRoZSBwcm9ncmVzcyBtZXRlciBwcm9wZXJseS4gSXQgdHVybmVkIG91dCB0byBiZSBhIGNhc2Ugd2hlcmUgbGliY3VybCB3b3VsZAogIGxvb3AgYSBsaXR0bGUgdG9vIGVhZ2VybHkgaW4gdGhlIHRyYW5zZmVyIGxvb3AsIHdoaWNoIGlzbid0IHJlYWxseSBnb29kIGZvcgogIHRoZSBBUElzLCBlc3BlY2lhbGx5IG5vdCB0aGUgbXVsdGkgQVBJLgoKVmVyc2lvbiA3LjEwLjQtcHJlMiAoMjQgRmViIDIwMDMpCgpEYW5pZWwgKDI0IEZlYikKLSBLamV0aWwgSmFjb2JzZW4gZm91bmQgb3V0IHRoYXQgc2V0dGluZyBDVVJMT1BUX01BWENPTk5FQ1RTIHRvIGEgdmFsdWUgaGlnaGVyCiAgdGhhbiA1IGNvdWxkIGNhdXNlIGEgc2VnZmF1bHQuCgotIEkgYmVsaWV2ZSBJIGZpeGVkIHRoZSAnRXhwZWN0OiAxMDAtY29udGludWUnIGJlaGF2aW9yIHRoYXQgaGFzIGJlZW4gYnJva2VuCiAgZm9yIGEgd2hpbGUgKEkgdGhpbmsgc2luY2UgbXkgY2hhbmdlIGRhdGVkIERlYyAxMCAyMDAyKS4gV2hlbiB0aGlzIGhlYWRlciBpcwogIHVzZWQsIGxpYmN1cmwgc2hvdWxkIHdhaXQgZm9yIGEgSFRUUCAxMDAgKG9yIHRpbWVvdXQpIGJlZm9yZSBzZW5kaW5nIHRoZQogIHBvc3QvcHV0IGRhdGEuCgpEYW5pZWwgKDE0IEZlYikKLSBNYXR0aGV3IENsYXJrZSBwcm92aWRlZCBzb21lIGluZm8gd2hhdCB0byBtb2RpZnkgdG8gbWFrZSBjdXJsIGJ1aWxkCiAgZmxhd2xlc3NseSBvbiBBSVggMy4yLjUuCgotIE1hcnRpbiBDLiBNYXJ0aW4gZm91bmQgYW5kIGZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZW4KICBydW5uaW5nIG9uIFdpbmRvd3MgYW5kIHRyeWluZyB0byBjb25uZWN0IHRvIGEgcG9ydCB3aXRob3V0IGEgbGlzdGVuZXIuCgpEYW5pZWwgKDEzIEZlYikKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgZml4ZWQgQ3VybF9iYXNlNjRfZW5jb2RlKCkgdG8gZGVhbCB3aXRoIHplcm9lcyBpbiB0aGUKICBkYXRhIHRvIGVuY29kZS4KCkRhbmllbCAoNCBGZWIpCi0gSmVhbi1QaGlsaXBwZSBhZGRlZCB0aGUgZmlyc3QgY29kZSB0aGF0IGVuYWJsZXMgdGhlICdzaGFyZScgc3lzdGVtLiBUaGlzCiAgc2hvdWxkIG5vdyBlbmFibGUgc2hhcmluZyBvZiBETlMgZGF0YSBiZXR3ZWVuIHR3byBjdXJsIGVhc3kgaGFuZGxlcy4KCi0gSW5jb3Jwb3JhdGVkIE5pY28gQmFnZ3VzJyBmaXhlcyB0byBhZ2FpbiBjb21waWxlIGZsYXdsZXNzbHkgb24gVk1TLgoKLSBKYW1lcyBCdXJzYSBjb3JyZWN0ZWQgYSBiYWQgY29tbWVudCBpbiB0aGUgcHVibGljIGluY2x1ZGUgZmlsZSBjdXJsL211bHRpLmgKCi0gUGV0ZXIgRm9ycmV0IHJlcG9ydGVkIG9uZSBvZiB0aG9zZSBlcnJvcjowMDAwMDAwMCBjYXNlcyBpbiBsaWJjdXJsIGFnYWluCiAgd2hlbiBjb25uZWN0aW5nIHRvIGEgSFRUUFMgc2l0ZSwgYW5kIHRoaXMgdGltZSBJIGRpZCBkaXNjb3ZlciBzb21lIG9kZGl0aWVzCiAgaW4gaG93IGN1cmwgcmVwb3J0cyBTU0wgZXJyb3JzIGJhY2suIEl0IGNvdWxkIG1pc3Mgc2hvd2luZyB0aGUgYWN0dWFsIGVycm9yLgoKVmVyc2lvbiA3LjEwLjQtcHJlMSAoMyBGZWIgMjAwMykKCkRhbmllbCAoMyBGZWIpCi0gUmVtb3ZlZCB0aGluZ3MgaW4gdGhlIGRvY3Mgc2F5aW5nIGNhcGF0aCBkb2Vzbid0IHdvcmsgb24gV2luZG93cywgYXMgSnVsaWFuCiAgTm9ibGUgdG9sZCB1cyBpdCB3b3JrcyBmaW5lLgoKRGFuaWVsICgzMSBKYW4pCi0gS2V2aW4gUm90aCBmaXhlZCB0aGUgemxpYiBidWlsZCBzdHVmZiBpbiB0aGUgTWluZ3czMiBtYWtlZmlsZS4KCkRhbmllbCAoMzAgSmFuKQotIEtldmluIFJvdGggZm91bmQgb3V0IHRoYXQgY3VybCBvbiBXaW5kb3dzIGFsd2F5cyBjaGVja2VkIGZvciB0aGUgQ0EgY2VydAogIGJ1bmRsZSB1c2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHRoZSBwYXRoIHNjYW4sIGV2ZW4gdGhvdWdoCiAgLWsvLS1pbnNlY3VyZSB3YXMgdXNlZC4KCi0gSGFtaXNoIE1hY2tlbnppZSBwb2ludGVkIG91dCB0aGF0IGN1cmwgb25seSBkaWQgc3RyaWN0IGhvc3QgbmFtZSB2ZXJpZnlpbmcKICBpZiBjYXBhdGggb3IgY2FpbmZvIHdhcyB1c2VkLiBOb3cgaXQnbGwgYWx3YXlzIGRvIGl0IHVubGVzcyAtayAvIC0taW5zZWN1cmUKICBpcyB1c2VkIQoKLSBQYXZlbCBDZW5layBwb2ludGVkIG91dCB0aGF0IHRoZSBDb250ZW50LVR5cGUgZXh0cmFjdGlvbiB3YXMgZG9uZSB3cm9uZ2x5CiAgYXMgdGhlIGZ1bGwgc3RyaW5nIHdhcyBub3QgZmV0Y2hlZC4gQWRkZWQgdGVzdCBjYXNlIDU3IHRvIHZlcmlmeSB0aGF0IGN1cmwKICBkb2VzIGl0IHJpZ2h0IG5vdy4KCkRhbmllbCAoMjkgSmFuKQotIEphbWllIFdpbGtpbnNvbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIGN1cmwgYXR0ZW1wdCB0byBjbGVhciBvdXQKICAic2Vuc2l0aXZlIiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBkb24ndCBhcHBlYXIgaW4gcHMgb3V0cHV0cwogIChvbmx5IG9uIHBsYXRmb3JtcyB0aGF0IGFsbG93IHdyaXRpbmcgdG8gYXJndltdKS4KCi0gSm9obiBNY0dvd2FuIGZvdW5kIG91dCB0aGF0IHRoZSBERUJVR0ZVTkNUSU9OIGNvdWxkIGJlIGNhbGxlZCB3aXRoIGJhZAogIGFyZ3VtZW50cyBhbmQgdGh1cyBjYXVzZSB0aGUgLS10cmFjZSBvdXRwdXRzIHRvIGdvIHdyb25nLgoKLSBSZW1vdmVkIGFsbCB0aGUgZW1hY3MgbG9jYWwgdmFyaWFibGVzIGZyb20gYWxsIGZpbGVzLiBNYXRzIExpZGVsbCBwcm92aWRlZAogIHRoZSBuZXcgc2FtcGxlLmVtYWNzIGZpbGUgKGZvciBhIHNhbXBsZSBvZiB3aGF0IHRvIGluY2x1ZGUgaW4geW91ciAuZW1hY3MpCiAgYW5kIHRoZSBjdXJsLXN0eWxlLmVsIHRoYXQgc2V0cyBhIGJldHRlciBjLXN0eWxlIGZvciBlZGl0aW5nIGN1cmwgc291cmNlcy4KCi0gRGF2ZSBIYWxiYWtrZW4gZm91bmQgYSBwcm9ibGVtIHdpdGggRlRQIGRvd25sb2FkcyB0aGF0IGNvdWxkIGFjY2lkZW50bHkKICByZXR1cm4gQ1VSTEVfUEFSVElBTF9GSUxFIHdoZW4gY3VybF9lYXN5X3BlcmZvcm0oKSB3YXMgY2FsbGVkIHdpdGggTk9CT0RZCiAgc2V0IFRSVUUuCgpEYW5pZWwgKDI3IEphbikKLSBUaGUgZm9wZW4uYyBleGFtcGxlIHdhcyBmbGF3ZWQgYXMgTmljayBIdW1mcmV5IG5vdGljZWQsIGFuZCBJIGZpeGVkIGl0IHRvCiAgd29yayBhZ2Fpbi4KCkRhbmllbCAoMjQgSmFuKQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZvdW5kIGFuZCBmaXhlZCBhIG1lbW9yeSBsZWFrICh0aGUgY29udGVudC10eXBlIHN0cmluZykKICB3aGVuIGZvbGxvd2luZyBsb2NhdGlvbnMuCgpEYW5pZWwgKDIyIEphbiAyMDAzKQotIElhbiBXaWxrZXMgYW5kIExlZ29mZiBWaW5jZW50IGJvdGggaW5kZXBlbmRlbnRseSBwcm92aWRlZCBmaXhlcyBmb3IgbWFraW5nCiAgY3VybC9tdWx0aS5oIHdvcmsgcHJvcGVybHkgd2hlbiBjb21waWxlZCB3aXRoIGEgQysrIGNvbXBpbGVyLgoKRGFuaWVsICgyMCBKYW4gMjAwMykKLSBGaXhlZCAnYnVpbGRjb25mJyB0byBjaGVjayB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcmVxdWlyZWQgdG9vbHMgYmVmb3JlCiAgdGhleSdyZSBhY3R1YWxseSB1c2VkLgoKLSBXcm90ZSAndGVzdGN1cmwuc2gnLCBhIHNjcmlwdCB0YXJnZXRlZCBmb3IgYXV0b21hdGljIGFuZCBkaXN0cmlidXRlZCBjdXJsCiAgdGVzdHMgb24gdmFyaW91cyBwbGF0Zm9ybXMuCgotIERhdmlkIFRoaWVsIHBvaW50ZWQgb3V0IHRoYXQgdGhlIC5uZXRyYyBmaWxlIHdhcyBub3QgYmVpbmcgZGVhbHQgd2l0aAogIHByb3Blcmx5IGFueW1vcmUuIEkgYnJva2UgdGhpcyBpbiB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nICJmaXgiLgoKLSBNYXJrdXMgRi5YLkouIE9iZXJodW1lciBwYXRjaGVkIGxpYmN1cmwgdG8gYWxsb2NhdGUgdGhlIHNjcmF0Y2ggYnVmZmVyIG9ubHkKICBvbiBkZW1hbmQgYW5kIHRodXMgd2Ugc2F2ZSAzMktCIGluIGVhY2ggY3VybCBoYW5kbGUgdGhhdCBkb24ndCB1c2UgdGhhdAogIGJ1ZmZlci4gVGhpcyBuZWVkIGFwcGVhcmVkIHdoZW4gc29tZSBwZW9wbGUgc3RhcnRlZCB1c2luZyB0aG91c2FuZHMgb2YKICBzaW11bHRhbmVvdXMgY3VybCBoYW5kbGVzLi4uIDotKQoKRGFuaWVsICgxNiBKYW4gMjAwMykKLSBNYXJrdXMgT2Jlcmh1bWVyIGZpeGVkIGN1cmwtY29uZmlnIC0tY2ZsYWdzIHdoZW4gdGhlIGluY2x1ZGVkaXIgd2FzIG5vdAogIC91c3IvaW5jbHVkZS4KCi0gTWFya3VzIE9iZXJodW1lciBmaXhlZCBDVVJMSU5GT19QUklWQVRFIHRvIHByb3Blcmx5IHJldHVybiBOVUxMIGlmIGl0IHdhcwogIHNldCB0byBOVUxMIQoKVmVyc2lvbiA3LjEwLjMgKDE0IEphbiAyMDAzKQoKRGFuaWVsICgxMCBKYW4gMjAwMykKLSBTdGV2ZSBPbGlwaGFudCBwb2ludGVkIG91dCB0aGF0IHRlc3QgY2FzZSAxMDUgZGlkIG5vdCB3b3JrIGFueW1vcmUgYW5kIHRoaXMKICB3YXMgZHVlIHRvIGEgbWlzc2luZyBmaXggZm9yIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcuCgpWZXJzaW9uIDcuMTAuMy1wcmU2ICgxMCBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBCcnlhbiBLZW1wIHBvaW50ZWQgb3V0IHRoYXQgY3VybCAtdSBjb3VsZCBub3QgcHJvdmlkZSBhIGJsYW5rIHBhc3N3b3JkCiAgd2l0aG91dCBwcm9tcHRpbmcgdGhlIHVzZXIuIEl0IGNhbiBub3cuIC11IHVzZXJuYW1lOiBtYWtlcyB0aGUgcGFzc3dvcmQKICBlbXB0eSwgd2hpbGUgLXUgdXNlcm5hbWUgbWFrZXMgY3VybCBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgcGFzc3dvcmQuCgotIEtqZXRpbCBKYWNvYnNlbiBmb3VuZCBhIHJlbWFpbmluZyBjb25uZWN0IHByb2JsZW0gaW4gdGhlIG11bHRpIGludGVyZmFjZSBvbgogIGlwdjQgc3lzdGVtcyAoTGludXggb25seT8pLCB0aGF0IEkgZml4ZWQgYW5kIEtqZXRpbCB2ZXJpZmllZCB0aGF0IGl0IGZpeGVkCiAgaGlzIHByb2JsZW1zLgoKLSBtZW1hbmFseXplLnBsIG5vdyByZWFkcyBhIGZpbGUgbmFtZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGFuZCBubyBsb25nZXIKICB0YWtlcyB0aGUgZGF0YSBvbiBzdGRpbiBhcyBiZWZvcmUuCgpWZXJzaW9uIDcuMTAuMy1wcmU1ICg5IEphbiAyMDAzKQoKRGFuaWVsICg5IEphbiAyMDAzKQotIEZpeGVkIHRlc3RzL21lbWFuYWx5emUucGwgdG8gd29yayB3aXRoIGZpbGUgbmFtZXMgdGhhdCBjb250YWluIGNvbG9ucyAoYXMgb24KICBXaW5kb3dzKS4KICAKLSBLamV0aWwgSmFjb2JzZW4gcXVpY2tseSBwb2ludGVkIG91dCB0aGF0IGxpYi9zaGFyZS5oIHdhcyBtaXNzaW5nLi4uCgpWZXJzaW9uIDcuMTAuMy1wcmU0ICg5IEphbiAyMDAzKQoKRGFuaWVsICg5IEphbiAyMDAzKQotIFVwZGF0ZWQgbGliL3NoYXJlLmMgcXVpdGUgYSBiaXQgdG8gbWF0Y2ggdGhlIGRlc2lnbiBkb2N1bWVudCBhdAogIGh0dHA6Ly9jdXJsLmhheHguc2UvZGV2L3NoYXJpbmcudHh0IGEgbG90IG1vcmUuCgogIEknbGwgdHJ5IHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnQgc29vbmlzaC4gc2hhcmUuYyBpcyBzdGlsbCBub3QgYWN0dWFsbHkgdXNlZAogIGJ5IGxpYmN1cmwsIGJ1dCB0aGUgQVBJIGlzIHNsb3dseSBnZXR0aW5nIHRoZXJlIGFuZCB3ZSBjYW4gc3RhcnQKICBpbXBsZW1lbnRpbmcgY29kZSB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB0aGlzIHN5c3RlbS4KCkRhbmllbCAoOCBKYW4gMjAwMykKLSBVcGRhdGVkIHNoYXJlIHN0dWZmIGluIGN1cmwvY3VybC5oLCBpbmNsdWRpbmcgZGF0YSB0eXBlcywgc3RydWN0cyBhbmQKICBmdW5jdGlvbiBwcm90b3R5cGVzLiBUaGUgY29ycmVzcG9uZGluZyBmaWxlcyBpbiBsaWIvIHdlcmUgYWxzbyBtb2RpZmllZAogIG9mIGNvdXJzZSB0byByZW1haW4gY29tcGlsYWJsZS4gQmFzZWQgb24gaW5wdXQgZnJvbSBKZWFuLVBoaWxpcHBlIGFuZCBhbHNvCiAgdG8gbWFrZSBpdCBtb3JlIGluIGxpbmUgd2l0aCB0aGUgZGVzaWduIGRvY3VtZW50LgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIHBhdGNoZWQgYSB2ZXJ5IHRyaXZpYWwgbWVtb3J5IGxlYWsgaW4KICBjdXJsX2VzY2FwZSgpIHRoYXQgd291bGQgaGFwcGVuIHdoZW4gcmVhbGxvYygpIHJldHVybnMgTlVMTC4uLgoKLSBNYXR0aGV3IEJsYWluIHByb3ZpZGVkIGZlZWRiYWNrIHRvIG1ha2UgdGhlIC0tY3JlYXRlLWRpcnMgc3R1ZmYgYnVpbGQKICBwcm9wZXJseSBvbiBXaW5kb3dzLgoKLSBGaXhlZCB0aGUgI2luY2x1ZGUgaW4gdGVzdHMvbGlidGVzdC9maXJzdC5jIGFzIExlZ29mZiBWaW5jZW50IHBvaW50ZWQgb3V0LgoKRGFuaWVsICg3IEphbiAyMDAzKQotIFBoaWxpcHBlIFJhb3VsdCBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIGxpYmN1cmwgcHJvcGVybHkgc3VwcG9ydAogIHdpbGRjYXJkIGNoZWNrcyBmb3IgY2VydGlmaWNhdGUgbmFtZXMuCgotIFNpbW9uIExpdSBhZGRlZCBDVVJMT1BUX0hUVFAyMDBBTElBU0VTLCB0byBsZXQgYW4gYXBwbGljYXRpb24gc2V0IG90aGVyCiAgc3RyaW5ncyByZWNvZ25pemVkIGFzICJIVFRQIDIwMCIgdG8gYWxsb3cgaHR0cC1saWtlIHByb3RvY29scyB0byBnZXQKICBkb3dubG9hZGVkIGZpbmUgYnkgY3VybC4KCi0gTm93IHVzaW5nIGF1dG9jb25mIDIuNTcgYW5kIGF1dG9tYWtlIDEuNy4yCgotIERvaW5nICJjdXJsIC1JIGZ0cDovL2RvbWFpbi9ub24tZXhpc3RpbmctZmlsZSIgc3RpbGwgb3V0cHV0ZWQgYSBkYXRlIQogIFdheW5lIEhhaWdoIHJlcG9ydGVkLgoKLSBUaGUgZXJyb3IgbWVzc2FnZSBpcyBub3cgd3JpdHRlbiBwcm9wZXJseSB3aXRoIGEgbmV3bGluZSBpbiB0aGUgLS10cmFjZQogIGZpbGUuCgpEYW5pZWwgKDYgSmFuIDIwMDMpCi0gU3RlcmxpbmcgSHVnaGVzIGZpeGVkIGEgcG9zc2libGUgYnVnOiBwcmV2aW91c2x5LCBpZiB5b3UgY2FsbGVkCiAgY3VybF9lYXN5X3BlcmZvcm0gYW5kIHRoZW4gc2V0IHRoZSBnbG9iYWwgZG5zIGNhY2hlLCB0aGUgZ2xvYmFsIGNhY2hlCiAgd291bGRuJ3QgYmUgdXNlZC4gUG9pbnRlZCBvdXQgYnkgSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZS4KCi0gTWF0dGhldyBCbGFpbidzIGZpeGVkIHRoZSBWQzYgbGliY3VybCBtYWtlZmlsZSB0byBpbmNsdWRlIGJldHRlciBkZWJ1ZyBkYXRhCiAgb24gZGVidWcgYnVpbGRzLgpEYW5pZWwgKDI3IERlYyAyMDAyKQotIFBoaWxpcHBlIFJhb3VsdCByZXBvcnRlZCBhIGJ1ZyB3aXRoIEhUVFBTIGNvbm5lY3Rpb25zIHdoaWNoIEkgZXZpZGVudGx5CiAgYWRkZWQgaW4gbXkgMTkgZGVjIGZpeC4gSSBjb3JyZWN0ZWQgaXQuCgpEYW5pZWwgKDIwIERlYykKLSBJZGVhIGZyb20gdGhlIERlYmlhbiBsYXRlc3QgcGF0Y2g6IHVzZSBBTV9NQUlOVEFJTkVSX01PREUgaW4gdGhlIGNvbmZpZ3VyZQogIHNjcmlwdCB0byBtYWtlIHRoZSBkZWZhdWx0IG1ha2VmaWxlIGxlc3MgY29uZnVzaW5nICJ0byB0aGUgY2FzdWFsCiAgaW5zdGFsbGVyIi4KClZlcnNpb24gNy4xMC4zLXByZTMgKDIwIERlYykKCkRhbmllbCAoMTkgRGVjKQotIE1hdHRoZXcgQmxhaW4gcGF0Y2hlZCB0aGUgQ3VybF9iYXNlNjRfZGVjb2RlKCkgZnVuY3Rpb24uCgotIEV2YW4gSm9yZGFuIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzY1MzAyMiB0aGF0IHRoZSBTU0xfcmVhZCgpIHVzYWdlIHdhcwogIHdyb25nLCBhbmQgaXQgY2VydGFpbmx5IHdhcy4gSXQgY291bGQgbGVhZCB0byBjdXJsIHVzaW5nIHRvbyBtdWNoIENQVSBkdWUgdG8KICBhIHN0dXBpZCBsb29wLgoKRGFuaWVsICgxOCBEZWMpCi0gQXMgc3VnZ2VzdGVkIGJ5IE1hcmd1cyBGcmV1ZGVudGhhbCwgQ1VSTEVfSFRUUF9OT1RfRk9VTkQgd2FzIHJlbmFtZWQgdG8KICBDVVJMRV9IVFRQX1JFVFVSTkVEX0VSUk9SIHNpbmNlIGl0IGlzIHJldHVybmVkIG9uIGFueSA+PSA0MDAgY29kZSB3aGVuCiAgQ1VSTE9QVF9GQUlMT05FUlJPUiBpcyBzZXQuCgpEYW5pZWwgKDE3IERlYykKLSBCdWcgcmVwb3J0ZWQgIzY1MTQ2NCwgcmVwb3J0ZWQgYnkgQ2hyaXN0b3BoZXIgUGFsbWVyLCBwcm92aWRlZCBhbiBleGFtcGxlCiAgc291cmNlIGNvZGUgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSB0aGF0IGhhbmcgd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byBhCiAgcHJveHkgb24gYSBsb2NhbGhvc3QgcG9ydCB3aGVyZSBubyBwcm94eSB3YXMgbGlzdGVuaW5nLiBUaGlzIGJ1ZyB3YXMgbm90CiAgcmVwZWF0YWJsZSBvbiBsaWJjdXJscyB0aGF0IHdlcmUgSVB2Ni1lbmFibGVkLgoKRGFuaWVsICgxNiBEZWMpCi0gQ2hyaXN0b3BoZXIgUGFsbWVyIGFsc28gbm90aWNlZCB3aGF0IFZvanRlY2ggSmFub3RhIGFscmVhZHkgd2FzCiAgZXhwZXJpZW5jaW5nOiBUaGUgYXR0ZW1wdGVkIG5hbWUgcmVzb2x2ZSBmaXggZm9yIGdsaWJjIDIuMi45MyBjYXVzZWQgbGliY3VybAogIHRvIGNyYXNoIHdoZW4gdXNlZCBvbiBzb21lIG9sZGVyIGdsaWJjIHZlcnNpb25zLiBUaGUgcHJvYmxlbSBpcyBvZiBjb3Vyc2UKICB0aGUgc2lsbGluZXNzIG9mIHRoZSAyLjIuOTMuIEkgY29tbWl0dGVkIGEgZml4IHRoYXQgaG9wZWZ1bGx5IHNob3VsZCBtYWtlCiAgdGhlIGJpbmFyeSBydW4gZmluZSBvbiBlaXRoZXIgb25lIG9mIHRoZSB2ZXJzaW9ucywgZXZlbiB0aG91Z2ggdGhlIHNvbHV0aW9uCiAgaXMgbm90IGFzIG5pY2UgYXMgSSdkIGxpa2UgaXQgdG8gYmUuCgpEYW5pZWwgKDEzIERlYykKLSBCdWcgcmVwb3J0ICM2NTE0NjAgYnkgQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIHNob3dlZCB0aGF0IHdoZW4gdXNpbmcgbGliY3VybAogIHRvIGZvciBleGFtcGxlIGdvIG92ZXIgYSBwcm94eSBvbiBsb2NhbGhvc3QsIGl0IHdvdWxkIGF0dGVtcHQgdG8gY29ubmVjdAogIHRocm91Z2ggdGhlIHByb3h5IFRXSUNFLgoKICBJIGFkZGVkIHRlc3QgY2FzZSA1MDMgd2l0aCB3aGljaCBJIG1hbmFnZWQgdG8gcmVwZWF0IHRoaXMgcHJvYmxlbSBhbmQgSQogIGZpeGVkIHRoZSBjb2RlIHRvIG5vdCByZS1hdHRlbXB0IGFueSBjb25uZWN0cyAod2hpY2ggYWxzbyBtYWRlIGl0IGEgbmljZXIKICBmaXggZm9yIHRoZSAjNjUwOTQxIGJ1ZyBtZW50aW9uZWQgYmVsb3cpLgoKICBUaGUgc3dzIHNlcnZlciB3YXMgZXh0ZW5kZWQgdG8gZGVhbCB3aXRoIENPTk5FQ1QgaW4gb3JkZXIgdG8gbWFrZSB0ZXN0CiAgY2FzZSA1MDMgZG8gZ29vZC4KCi0gRXZhbiBKb3JkYW4gcG9zdGVkIGJ1ZyByZXBvcnQgIzY1MDk4OSBhYm91dCBhIG1lbW9yeSBsZWFrIGluIHRoZSBwdWJsaWMga2V5CiAgcmV0cmlldmluZyBjb2RlLiBIZSBwcm92aWRlZCBhIHN1Z2dlc3RlZCBmaXggYW5kIEkgbWVyZWx5IGFwcGxpZWQgaXQhCgotIEJ1ZyByZXBvcnQgIzY1MDk0MSwgcG9zdGVkIGJ5IENocmlzdG9waGVyIFIuIFBhbG1lciBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBhbmQgZ2V0dGluZyBmaWxlOi8vIFVSTHMuIFRoaXMgd2FzIG5vdyBmaXhlZCBhbmQKICB0ZXN0IGNhc2UgNTAyIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMTIgRGVjKQotIFRlc3QgY2FzZSA1MDAgYW5kIDUwMSBhcmUgdGhlIGZpcnN0IGV2ZXIgbGliY3VybCB0ZXN0IGNhc2VzIHRoYXQgcnVuLgoKLSBNYWRlICJjb25maWd1cmUgLS1lbmFibGUtZGVidWciIGN1dCBvZmYgYWxsIC1PKiBvcHRpb25zIHRvIHRoZSBjb21waWxlcgoKLSBGaW5hbGx5IGZpeGVkIHRoZSB0ZXN0IHN1aXRlJ3MgZnRwIHNlcnZlciBzbyB0aGF0IHRlc3QgY2FzZSA0MDIgZG9lc24ndAogIGNhdXNlIHRoZSBmb2xsb3dpbmcgdGVzdCBjYXNlIHRvIGZhaWwgYW55bW9yZSEKCkRhbmllbCAoMTEgRGVjKQotIENVUkxfTUFYX1dSSVRFX1NJWkUgaXMgbm93IGRlY3JlYXNlZCB0byAxNktCIHNpbmNlIGl0IG1ha2VzIHRoZSBXaW5kb3dzCiAgdmVyc2lvbiBwZXJmb3JtIHVwbG9hZHMgbXVjaCBmYXN0ZXIhISEgUkJyYW1hbnRlIGRpZCBsb3RzIG9mIHJlc2VhcmNoIG9uCiAgdGhpcyB0b3BpYy4KCi0gRml4ZWQgdGhlICNpbmNsdWRlIGluIGN1cmwvY3VybC5oIHRvIGluY2x1ZGUgdGhlIG90aGVyIGZpbGVzIG91dHNpZGUgdGhlCiAgZXh0ZXJuICJDIiBzY29wZS4KCkRhbmllbCAoMTAgRGVjKQotIE1vdmVkIGFyb3VuZCBhbmQgYWRkZWQgbW9yZSBsb2dpYzoKCiAgRmlyc3QsIFBPU1QgZGF0YSBpcyBuZXZlciBzZW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QgaGVhZGVycyBpbiB0aGUgaHR0cC5jCiAgY29kZS4gSXQgaXMgYWx3YXlzIHNlbnQgdGhlICJub3JtYWwiIHJlYWQgY2FsbGJhY2sgdGhlbiBzZW5kKCkgd2F5LiBUaGlzIG5vdwogIGVuYWJsZXMgYSBwbGFpbiBIVFRQIFBPU1QgdG8gYmUgc2VudCBjaHVua2VkIGlmIHdlIHdhbnQgdG8uIFRoaXMgYWxzbwogIHJlZHVjZXMgdGhlIHJpc2sgb2YgaGF2aW5nIHZlcnkgYmlnIFBPU1RzIGNhdXNpbmcgcHJvYmxlbXMuCgogIEZ1cnRoZXIsIHNlbmRpbmcgb2ZmIHRoZSBpbml0aWFsIEhUVFAgcmVxdWVzdCBpcyBub3QgZG9uZSB1c2luZyBhIGxvb3AKICBhbnltb3JlLiBJZiBpdCB3YXNuJ3QgYWxsIHNlbnQgb2ZmIGluIHRoZSBmaXJzdCBzZW5kKCksIHRoZSByZXN0IG9mIHRoZQogIHJlcXVlc3QgaXMgc2VudCBvZmYgaW4gdGhlIG5vcm1hbCB0cmFuc2ZlciBzZWxlY3QoKSBsb29wLiBUaGlzIG1ha2VzIHNldmVyYWwKICB0aGluZ3MgcG9zc2libGUsIGJ1dCBtYWlubHkgaXQgbWFrZXMgbGliY3VybCBibG9jayBsZXNzIHdoZW4gdXNlZCBmcm9tIHRoZQogIG11bHRpIGludGVyZmFjZSBhbmQgaXQgYWxzbyByZWR1Y2VzIHRoZSByaXNrIG9mIHByb2JsZW1zIHdpdGggaXNzdWluZyB2ZXJ5CiAgbGFyZ2UgcmVxdWVzdHMuCgpEYW5pZWwgKDkgRGVjKQotIE1vdmVkIHRoZSByZWFkIGNhbGxiYWNrIHBvaW50ZXIgYW5kIGRhdGEgd2l0aGluIHRoZSBzdHJ1Y3RzIHRvIGEgbW9yZQogIHN1aXRhYmxlIHBsYWNlLiBUaGlzIGluIHByZXBhcmF0aW9uIGZvciBhIGJldHRlciBIVFRQLXJlcXVlc3Qgc2VuZGluZyBjb2RlCiAgd2l0aG91dCAoYSBzaWxseSkgbG9vcC4KCi0gVGhlIERvZGRzIGZpeCBzZWVtcyBub3QgdG8gd29yay4KCi0gVm9qdGVjaCBKYW5vdGEgdGVzdHMgcHJvdmVkIHRoYXQgdGhlIHJlc29sdmUgZml4IGZyb20gb2N0IDIxc3QgaXMgbm90IGdvb2QKICBlbm91Z2ggc2luY2Ugb2J2aW91c2x5IG9sZGVyIGdsaWJjcyBtaWdodCByZXR1cm4gRUFHQUlOIHdpdGhvdXQgdGhpcyBtZWFuaW5nCiAgdGhhdCB0aGUgYnVmZmVyIHdhcyB0b28gc21hbGwuCgotIFt0aGUgb3RoZXIgZGF5XSBNYWRlIGxpYmN1cmwgbG9vcCBvbiByZWN2KCkgYW5kIHNlbmQoKSBub3cgdW50aWwgZG9uZSwgYW5kCiAgdGhlbiBnZXQgYmFjayB0byBzZWxlY3QoKS4gUHJldmlvdXNseSBpdCB3ZW50IGJhY2sgdG8gc2VsZWN0KCkgbW9yZSBvZnRlbgogIHdoaWNoIHJlYWxseSB3YXMgYSBzbGlnaHQgb3ZlcmhlYWQuIFRoaXMgd2FzIGR1ZSB0byB0aGUgcmVwb3J0ZWQgcGVyZm9ybWFuY2UKICBwcm9ibGVtcyBvbiBIVFRQIFBVVCBvbiBXaW5kb3dzLiBJIGNvdWxkbid0IHNlZSBhbnkgbm90YWJsZSBkaWZmZXJlbmNlIG9uCiAgTGludXguLi4KClZlcnNpb24gNy4xMC4zLXByZTIgKDQgRGVjIDIwMDIpCgpEYW5pZWwgKDQgRGVjIDIwMDIpCi0gTG90cyBvZiB3b3JrIHdpdGggTWFsY29sbSBEb2RkcyBtYWRlIG1lIGFkZCBhIHRlbXBvcmFyeSBjb2RlIGZpeCB0aGF0IG5vdwogIHNob3J0ZW5zIHRoZSB0aW1lb3V0IHdhaXRpbmcgZm9yIHRoZSAyMjYgb3IgMjUwIGxpbmUgYWZ0ZXIgYSBjb21wbGV0ZWQKICBGVFAgdHJhbnNmZXIuCgogIElmIG5vIGRhdGEgaXMgcmVjZWl2ZWQgd2l0aGluIDYwIHNlY29uZHMsIHRoaXMgaXMgdGFrZW4gYXMgYSBzaWduIG9mIGEgZGVhZAogIGNvbnRyb2wgY29ubmVjdGlvbiBhbmQgd2UgYmFpbCBvdXQuCgpEYW5pZWwgKDMgRGVjIDIwMDIpCi0gUmFscGgncyBidWcgcmVwb3J0ICM2NDQ4NDEgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gd2hpY2ggY3VybCByZXR1cm5lZCBhCiAgdGltZW91dCBlcnJvciBjb2RlIHdoZW4gaW4gZmFjdCB0aGUgcHJvYmxlbSB3YXMgbm90IGEgdGltZW91dC4gVGhlIHByb3BlcgogIGVycm9yIHNob3VsZCBub3cgYmUgcHJvcGFnYXRlZCBiZXR0ZXIgd2hlbiB0aGV5J3JlIGRldGVjdGVkIGluIHRoZSBGVFAKICByZXNwb25zZSByZWFkaW5nIGZ1bmN0aW9uLgoKLSBVcGRhdGVkIHRoZSBCb3JsYW5kIE1ha2VmaWxlcy4KCkRhbmllbCAoMiBEZWMgMjAwMikKLSBOaWNvbGFzIEJlcmxvcXVpbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlZCAtLWNyZWF0ZS1kaXJzIHRvIHRoZQogIGNvbW1hbmQgbGluZSB0b29sLiBXaGVuIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCAtbywgaXQgbGV0cyBjdXJsIGNyZWF0ZQogIFtub24tZXhpc3RpbmddIGRpcmVjdG9yaWVzIHVzZWQgaW4gLW8sIHN1aXRhYmx5IHVzZWQgd2l0aCAjLWNvbWJpbmF0aW9ucwogIHN1Y2ggYXM6CgogICAgIGN1cmwgInd3dy5pbWFnZXMuY29tL3tmbG93ZXJzLGNpdGllcyxwYXJrcyxtb3VudGFpbnN9L3BpY19bMS0xMDBdLmpwZyBcCiAgICAgICAtbyAiZGlyXyMxL3BpYyMyLmpwZyIgLS1jcmVhdGUtZGlycwoKVmVyc2lvbiA3LjEwLjMtcHJlMQoKRGFuaWVsICgyOCBOb3YgMjAwMikKLSBJIHZpc2l0ZWQgTGFycyBOb3JkZ3JlbiBhbmQgaGFkIGEgZ28gd2l0aCBoaXMgcHJvYmxlbSwgd2hpY2ggbGVhZCBtZSB0bwogIGltcGxlbWVudCB0aGlzIGZpeC4gSWYgbGliY3VybCBkZXRlY3RzIHRoZSBhZGRlZCBjdXN0b20gaGVhZGVyCiAgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiwgaXQgd2lsbCBub3cgZW5hYmxlIGEgY2h1bmtlZCB0cmFuc2Zlci4KCiAgQWxzbywgY2h1bmtlZCB0cmFuc2ZlciBkaWRuJ3QgcXVpdGUgd29yayBiZWZvcmUgYnV0IHNlZW1zIHRvIGRvIHNvIG5vdy4KCi0gS2pldGlsIEphY29ic2VuIHBvaW50ZWQgb3V0IHRoYXQgLi9jb25maWd1cmUgLS1kaXNhYmxlLWlwdjYgLS13aXRob3V0LXpsaWIKICBkaWRuJ3Qgd29yayBvbiBhbnkgcGxhdGZvcm0uLi4KCkRhbmllbCAoMjYgTm92IDIwMDIpCi0gRml4ZWQgYSBiYWQgYWRkcmluZm8gZnJlZSBpbiB0aGUgaG9zdGlwLmMgY29kZSwgaGFyZGx5IGV4cG9zZWQgYW55d2hlcmUKCi0gRGFuIEJlY2tlciBmb3VuZCBhbmQgZml4ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBvbiBwZXJzaXN0ZW50IGNvbm5uZWN0aW9ucwogIHVzaW5nIENVUkxPUFRfVVNFUlBXRC4KCkRhbmllbCAoMjIgTm92IDIwMDIpCi0gQmFzZWQgb24gUmFscGggTWl0Y2hlbGwncyBleGNlbGxlbnQgYW5hbHlzaXMgSSBmb3VuZCBhIGJ1ZyBpbiB0aGUgdGVzdCBzdWl0ZQogIHdlYiBzZXJ2ZXIgKHN3cykgd2hpY2ggbm93IGxldHMgdGVzdCBjYXNlIDMwNiBydW4gZmluZSBldmVuIGluIGNvbWJpbmF0aW9uCiAgd2l0aCB0aGUgb3RoZXIgdGVzdCBjYXNlcy4KCi0gSnVhbiBJZ25hY2lvIEhlcnbhcyBmb3VuZCBhIGNyYXNoIGluIHRoZSB2ZXJib3NlIGNvbm5lY3QgbWVzc2FnZSB0aGF0IGlzCiAgdXNlZCBvbiBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLiBUaGlzIGJ1ZyB3YXMgYWRkZWQgaW4gNy4xMC4yIGR1ZSB0byB0aGUKICByZWFycmFuZ2VkIG5hbWUgcmVzb2x2ZSBjb2RlLgoKRGFuaWVsICgyMCBOb3YgMjAwMikKLSBLamV0aWwgSmFjb2JzZW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGludHJvZHVjZXM6CgogICBDVVJMT1BUX1BSSVZBVEUgc3RvcmVzIGEgcHJpdmF0ZSBwb2ludGVyIGluIHRoZSBjdXJsIGhhbmRsZS4KCiAgIENVUkxJTkZPX1BSSVZBVEUgcmV0cmlldmVzIHRoZSBwcml2YXRlIHBvaW50ZXIgZnJvbSB0aGUgY3VybCBoYW5kbGUuCgotIEthcm9sIFBpZXRyemFrIHBvaW50ZWQgb3V0IGhvdyBjdXJsLWNvbmZpZyAtLWNmbGFncyBkaWRuJ3Qgb3V0cHV0IGEgZ29vZAogIGluY2x1ZGUgZGlyIHNvIEkndmUgcmVtb3ZlZCB0aGF0IGZvciBub3cuCgpWZXJzaW9uIDcuMTAuMiAoMTggTm92IDIwMDIpCgpEYW5pZWwgKDExIE5vdiAyMDAyKQotIERhdmUgSGFsYmFra2VuIGFkZGVkIGN1cmxfdmVyc2lvbl9pbmZvIHRvIGxpYi9saWJjdXJsLmRlZiB0byBtYWtlIGxpYmN1cmwKICBwcm9wZXJseSBidWlsZCB3aXRoIE1TVkMgb24gV2luZG93cy4KCkRhbmllbCAoOCBOb3YgMjAwMikKLSBEb2luZyBIVFRQIFBVVCB3aXRob3V0IGEgc3BlY2lmaWVkIGZpbGUgc2l6ZSBub3cgbWFrZXMgbGliY3VybCB1c2UKICBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZC4KCkRhbmllbCAoNyBOb3YgMjAwMikKLSBCdWcgcmVwb3J0ICM2MzQ2MjUgaWRlbnRpZmllZCBob3cgY3VybCByZXR1cm5lZCB0aW1lb3V0IGltbWVkaWF0ZWx5IHdoZW4KICBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUIHdhcyB1c2VkIGFuZCBwcm92aWRlZCBhIGZpeC4KClZlcnNpb24gNy4xMC4yLXByZTQgKDYgTm92IDIwMDIpCgpEYW5pZWwgKDUgTm92IDIwMDIpCi0gTGVoZWwgQmVybmFkdCBmb3VuZCBvdXQgYW5kIGZpeGVkLiBsaWJjdXJsIHNlbnQgZXJyb3IgbWVzc2FnZSB0byB0aGUgZGVidWcKICBvdXRwdXQgd2hlbiBpdCBzdG9yZWQgdGhlIGVycm9yIG1lc3NhZ2UuCgotIEF2ZXJ5IEZheSBmb3VuZCBzb21lIHByb2JsZW1zIHdpdGggdGhlIEROUyBjYWNoZSAod2hlbiB0aGUgY2FjaGUgdGltZSB3YXMKICBzZXQgdG8gMCB3ZSBnb3QgYSBtZW1vcnkgbGVhaywgYnV0IHdoZW4gdGhlIGxlYWsgd2FzIGZpeGVkIGhlIGdvdCBhIGNyYXNoCiAgd2hlbiBoZSB1c2VkIHRoZSBDVVJMT1BUX0lOVEVSRkFDRSB3aXRoIHRoYXQpIHRoYXQgaGFkIG1lIGRvIHNvbWUgcmVhbAogIHJlc3RydWN0dXJpbmcgc28gdGhhdCB3ZSBub3cgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudGVyIGluIHRoZSBkbnMgY2FjaGUKICBlbnRyaWVzIHRvIHByZXZlbnQgYW4gZW50cnkgdG8gZ2V0IGZsdXNoZWQgd2hpbGUgc3RpbGwgYWN0dWFsbHkgaW4gdXNlLgoKICBJIGFsc28gZGV0ZWN0ZWQgdGhhdCB3ZSBwcmV2aW91c2x5IGRpZG4ndCB1cGRhdGUgdGhlIHRpbWUgc3RhbXAgd2hlbiB3ZQogIGV4dHJhY3RlZCBhbiBlbnRyeSBmcm9tIHRoZSBjYWNoZSBzbyB0aGF0IG11c3QndmUgYmVlbiBhIHJlYXNvbiBmb3Igc29tZQogIHZlcnkgd2VpcmQgZG5zIGNhY2hlIGJ1Z3MuCgpWZXJzaW9uIDcuMTAuMi1wcmUzCgpEYW5pZWwgKDMxIE9jdCAyMDAyKQotIERvd25ncmFkZWQgYXV0b21ha2UgdG8gMS42LjMgaW4gYW4gYXR0ZW1wdCB0byBmaXggY3lnd2luIHByb2JsZW1zLiAoSXQKICB0dXJuZWQgb3V0IHRoaXMgZGlkbid0IGhlbHAgdGhvdWdoLikKCi0gRGlzYWJsZSB0aGUgRE5TIGNhY2hlIChieSBzZXR0aW5nIHRoZSB0aW1lb3V0IHRvIDApIG1hZGUgbGliY3VybCBsZWFrCiAgbWVtb3J5LiBBdmVyeSBGYXkgYnJvdWdodCB0aGUgZXhhbXBsZSBjb2RlIHRoYXQgcHJvdmVkIHRoaXMuCgpWZXJzaW9uIDcuMTAuMi1wcmUyCgpEYW5pZWwgKDI4IE9jdCAyMDAyKQotIFVwZ3JhZGVkIHRvIGF1dG9jb25mIDIuNTQgYW5kIGF1dG9tYWtlIDEuNyBvbiB0aGUgcmVsZWFzZS1idWlsZCBob3N0LgoKLSBLZXZpbiBSb3RoIG1hZGUgdGhlIGNvbW1hbmQgbGluZSB0b29sIGNoZWNrIGZvciBhIENVUkxfQ0FfQlVORExFIGVudmlyb25tZW50CiAgdmFyaWFibGUgKGlmIC0tY2FjZXJ0IGlzbid0IHVzZWQpIGFuZCBpZiBub3Qgc2V0LCB0aGUgV2luZG93cyB2ZXJzaW9uIHdpbGwKICBjaGVjayBmb3IgYSBmaWxlIG5hbWVkICJjdXJsLWNhLWJ1bmRsZS5jcnQiIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvciB0aGUKICBkaXJlY3Rvcnkgd2hlcmUgY3VybCBpcyBsb2NhdGVkLiBUaGF0IGZpbGUgaXMgdGhlbiB1c2VkIGFzIENBIHJvb3QgY2VydAogIGJ1bmRsZS4KCi0gQXZlcnkgRmF5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCdzIGNvbmZpZ3VyZSBzY3JpcCBkaWRuJ3QgZ2V0IHJpZ2h0IGlmIHlvdQogIHVzZWQgYXV0b2NvbmYgbmV3ZXIgdGhhbiAyLjUyLiBUaGlzIHdhcyBkdWUgdG8gc29tZSBiYWRseSBxdW90ZWQgY29kZS4KClZlcnNpb24gNy4xMC4yLXByZTEKCkRhbmllbCAoMjMgT2N0IDIwMDIpCi0gRW1pbGlhbm8gSWRhIGNvbmZpcm1lZCB0aGF0IHdlIG5vdyBidWlsZCBwcm9wZXJseSB3aXRoIHRoZSBCb3JsYW5kIEMrKwogIGNvbXBpbGVyIHRvby4gV2UgbmVlZGVkIHlldCBhbm90aGVyIGZpeCBmb3IgdGhlIElTTyBjcHAgY2hlY2sgaW4gdGhlIGN1cmwuaAogIGhlYWRlciBmaWxlLgoKLSBZZXQgYW5vdGhlciBmaXggd2FzIG5lZWRlZCB0byBnZXQgdGhlIEhUVFAgZG93bmxvYWQgd2l0aG91dCBoZWFkZXJzIHRvIHdvcmsuCiAgVGhpcyB0aW1lIGl0IHdhcyBuZWVkZWQgaWYgdGhlIGZpcnN0ICJiZWxpZXZlZCBoZWFkZXIiIHdhcyByZWFkIGFsbCBpbiB0aGUKICBmaXJzdCByZWFkLiBUZXN0IDMwNiBoYXMgbm90IHJ1biBwcm9wZXJseSBzaW5jZSB0aGUgMTF0aCBvY3RvYmVyIGZpeC4KCkRhbmllbCAoMjEgT2N0IDIwMDIpCi0gWnZpIEhhcidFbCBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBjdXJsJ3MgbmFtZSByZXNvbHZpbmcgb24gUmVkaGF0IDgKICBtYWNoaW5lcyAocnVubmluZyBJUHY2IGRpc2FibGVkKS4gTWF0cyBMaWRlbGwgbGV0IG1lIHVzZSBhbiBhY2NvdW50IG9uIGhpcwogIG1hY2hpbmUgYW5kIEkgY291bGQgdmVyaWZ5IHRoYXQgZ2V0aG9zdGJ5bmFtZV9yKCkgaGFzIGJlZW4gY2hhbmdlZCB0byByZXR1cm4KICBFQUdBSU4gaW5zdGVhZCBvZiBFUkFOR0Ugd2hlbiB0aGUgZ2l2ZW4gYnVmZmVyIHNpemUgaXMgdG9vIHNtYWxsLiBUaGlzIGlzCiAgZ2xpYmMgMi4yLjkzLgoKLSBBbGJlcnQgQ2hpbiBoZWxwZWQgbWUgZ2V0IHRoZSAtbm8tdW5kZWZpbmVkIG9wdGlvbiBjb3JyZWN0ZWQgaW4KICBsaWIvTWFrZWZpbGUuYW0gc2luY2UgQ3lnd2luIGJ1aWxkcyB3YW50IGl0IHRoZXJlIHdoaWxlIFNvbGFyaXMgYnVpbGRzIGRvbid0CiAgd2FudCBpdCBwcmVzZW50LiBLZXZpbiBSb3RoIGhlbHBlZCBtZSB0cnkgaXQgb3V0IG9uIGN5Z3dpbi4KICAKLSBOaWtpdGEgU2NobWlkdCBwcm92aWRlZCBhIGJ1ZyBmaXggZm9yIGEgRk9MTE9XTE9DQVRJT04gYnVnIGludHJvZHVjZWQgd2hlbgogIHRoZSAuLi8gc3VwcG9ydCBnb3QgaW4gKDcuMTAuMSkuCgpEYW5pZWwgKDE4IE9jdCAyMDAyKQotIEZhYnJpemlvIEFtbW9sbG8gcG9pbnRlZCBvdXQgYSByZW1haW5pbmcgcHJvYmxlbSB3aXRoIEZPTExPV0xPQ0FUSU9OIGluCiAgdGhlIG11bHRpIGludGVyZmFjZS4KCkRhbmllbCAoMTcgT2N0IDIwMDIpCi0gUmljaGFyZCBDb29wZXIncyBleHBlcmltZW50aW5nIHByb3ZlZCB0aGF0IC1qIChDVVJMT1BUX0NPT0tJRVNFU1NJT04pIGRpZG4ndAogIHdvcmsgcXVpdGUgYXMgc3VwcG9zZWQuIFlvdSBuZWVkZWQgdG8gc2V0IGl0ICpiZWZvcmUqIHlvdSB1c2UKICBDVVJMT1BUX0NPT0tJRUZJTEUsIGFuZCB3ZSBkb250JyB3YW50IHRoYXQga2luZCBvZiBkZXBlbmRlbmNpZXMuCgpEYW5pZWwgKDE1IE9jdCAyMDAyKQotIEFuZHLpcyBHYXJj7WEgcHJvdmlkZWQgY29ycmVjdGlvbnMgZm9yIGVycmF0YXMgaW4gZm91ciBsaWJjdXJsIG1hbiBwYWdlcy4KCkRhbmllbCAoMTMgT2N0IDIwMDIpCi0gU3RhcnRpbmcgbm93LCB3ZSBnZW5lcmF0ZSBhbmQgaW5jbHVkZSBQREYgdmVyc2lvbnMgb2YgYWxsIHRoZSBkb2NzIGluIHRoZQogIHJlbGVhc2UgYXJjaGl2ZXMuCgpEYW5pZWwgKDEyIE9jdCAyMDAyKQotIFRyeWluZyB0byBjb25uZWN0IHRvIGEgaG9zdCBvbiBhIGJhZCBwb3J0IG51bWJlciBjYXVzZWQgdGhlIG11bHRpIGludGVyZmFjZQogIHRvIG5ldmVyIHJldHVybiBmYWlsdXJlIGFuZCBpdCBhcHBlYXJlZCB0byBrZWVwIG9uIHRyeWluZyBmb3JldmVyIChpdCBqdXN0CiAgZGlkbid0IGRvIGFueXRoaW5nKS4KCkRhbmllbCAoMTEgT2N0IDIwMDIpCi0gRG93bmxvYWRpbmcgSFRUUCB3aXRob3V0IGhlYWRlcnMgZGlkbid0IHdvcmsgMTAwJSwgc29tZSBvZiB0aGUgaW5pdGlhbCBkYXRhCiAgZ290IHdyaXR0ZW4gdHdpY2UuIEtldmluIFJvdGggcmVwb3J0ZWQuCgotIEtldmluIFJvdGggZm91bmQgb3V0IHRoZSAiY29uZmlnIGZpbGUiIHBhcnNlciBpbiB0aGUgY2xpZW50IGNvZGUgY291bGQKICBzZWdmYXVsdCwgbGlrZSBpZiBET1MgbmV3bGluZXMgd2VyZSB1c2VkLgoKVmVyc2lvbiA3LjEwLjEgKDExIE9jdCAyMDAyKQoKRGFuaWVsICgxMCBPY3QgMjAwMikKLSBKZWZmIExhd3NvbiBmaXhlZCBhIGZldyBwcm9ibGVtcyB3aXRoIGNvbm5lY3Rpb24gcmUtdXNlIHRoYXQgcmVtYWluZWQgd2hlbgogIHlvdSBzZXQgQ1VSTE9QVF9QUk9YWSB0byAiIi4KCkRhbmllbCAoOSBPY3QgMjAwMikKLSBDcmFpZyBEYXZpc29uIGZvdW5kIGEgdGVycmlibGUgZmxhdyBhbmQgQ3JpcyBCYWlsaWZmIGhlbHBlZCBvdXQgaW4gdGhlCiAgc2VhcmNoLiBHZXR0aW5nIEhUVFAgZGF0YSBmcm9tIHNlcnZlcnMgd2hlbiB0aGUgaGVhZGVycyBhcmUgc3BsaXQgdXAgaW4KICBtdWx0aXBsZSByZWFkcywgY291bGQgY2F1c2UganVuayBkYXRhIHRvIGdldCBpbnNlcnRlZCBhbW9uZyB0aGUgc2F2ZWQKICBoZWFkZXJzLiBUaGlzIG9ubHkgY29uY2VybnMgSFRUUChTKSBoZWFkZXJzLgoKRGFuaWVsICg4IE9jdCAyMDAyKQotIFZpbmNlbnQgUGVucXVlcmMnaCBnYXZlIHVzIHRoZSBnb29kIHN1Z2dlc3Rpb24gdGhhdCB3aGVuIHRoZSBFUlJST1JCVUZGRVIKICBpcyBzZXQgaW50ZXJuYWxseSwgdGhlIGVycm9yIHRleHQgaXMgc2VudCB0byB0aGUgZGVidWcgZnVuY3Rpb24gYXMgd2VsbC4KCi0gSSBmaXhlZCB0aGUgdGVsbmV0IGNvZGUgdG8gdGltZW91dCBwcm9wZXJseSBhcyB0aGUgb3B0aW9uIHRlbGxzIGl0IHRvLiBPbgogIG5vbi13aW5kb3dzIHBsYXRmb3Jtcy4KCkRhbmllbCAoNyBPY3QgMjAwMikKLSBKb2huIENyb3cgcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsLXRoZS1ndWlkZSB3YXNuJ3QgaW5jbHVkZWQgaW4gdGhlIHJlbGVhc2UKICB0YXJiYWxsIQoKLSBLZXZpbiBSb3RoIHBvaW50ZWQgb3V0IHRoYXQgbWFrZSBpbnN0YWxsIGRpZG4ndCBkbyByaWdodCBpZiBidWlsZCBvdXRzaWRlCiAgdGhlIHNvdXJjZSB0cmVlIChjYS1idW5kbGUgd2lzZSkuCgotIEZPTExPV0xPQ0FUSU9OIGJ1Z2ZpeCBmb3IgdGhlIG11bHRpIGludGVyZmFjZQoKRGFuaWVsICg0IE9jdCAyMDAyKQotIEtldmluIFJvdGggZ290IHByb2JsZW1zIHdpdGggaGlzIGN5Z3dpbiBidWlsZCB3aXRoIC1uby11bmRlZmluZWQgd2FzIG5vdAogIHByZXNlbnQgaW4gbGliL01ha2VmaWxlLmFtIHNvIEkgcHV0IGl0IGJhY2sgaW4gdGhlcmUgYWdhaW4uIFRoZSBwb29yIG9uZSB3aG8KICBuZWVkcyB0byByZW1vdmUgaXQgYWdhaW4gbXVzdCB3cml0ZSBhIGNvbmZpZ3VyZSBzY3JpcHQgdG8gZGV0ZWN0IHRoYXQgbmVlZC4KCi0gUmFscGggTWl0Y2hlbGwgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHdhcyBhIGJpdCBuYWl2ZSBhbmQgZGlkbid0IGRlYWwgd2l0aCAuLwogIG9yIC4uLyBzdHVmZiBpbiB0aGUgc3RyaW5nIHBhc3NlZCBiYWNrIGluIGEgTG9jYXRpb246IGhlYWRlciB3aGVuIGZvbGxvd2luZwogIGxvY2F0aW9ucy4KCi0gQWxiZXJ0IENoaW4gaGVscGVkIG1lIHRvIHdvcmsgb3V0IGEgYmV0dGVyIGNvbmZpZ3VyZS5pbiBjaGVjayBmb3IgemxpYiwgYW5kCiAgYm90aCAtLXdpdGhvdXQtemxpYiBhbmQgLXdpdGgtemxpYiBzZWVtIHRvIHdvcmsgcmF0aGVyIHdlbGwgcmlnaHQgbm93LgoKLSBadmkgSGFyJ0VsIGltcHJvdmllZCB0aGUgT3BlblNTTCBFTkdJTkUgY2hlY2sgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8KICBiZWNvbWUgbW9yZSBhY2N1cmF0ZS4KCkRhbmllbCAoMSBPY3QgMjAwMikKLSBEZXRsZWYgU2NobWllciBwb2ludGVkIG91dCB0aGUgbGFjayBvZiBhIC0td2l0aG91dC1saWJ6IG9wdGlvbiB0byBjb25maWd1cmUsCiAgc28gSSBhZGRlZCBvbmUuCgpWZXJzaW9uIDcuMTAgKDEgT2N0IDIwMDIpCgpEYW5pZWwgKDMwIFNlcCAyMDAyKQotIE1vZGlmaWVkIHRoZSBjdXJsX3ZlcnNpb25faW5mbygpIHByb3RvIGFuZCByZXR1cm5lZCBzdHJ1Y3Qgb25jZSBhZ2FpbiwgYW5kCiAgdXBkYXRlZCB0aGUgbWFuIHBhZ2UgYWNjb3JkaW5nbHkuCgotIENyaXMgQmFpbGlmZiBmb3VuZCBvdXQgdGhhdCB0aGUgcHJlLXJlbGVhc2VzIGNyYXNoZWQgb24gbmFtZSBsb29rdXBzIG9uCiAgbmFtZXMgc3VjaCBhcyAiYToiIG9yICJiYXo6IiAob24gTGludXggdmVyc2lvbnMgbm90IGJlaW5nIGlwdjYtZW5hYmxlZCkgZHVlCiAgdG8gc29tZSB3ZWlyZCByZXR1cm4gY29kZXMgZnJvbSBnZXRob3N0YnluYW1lX3IoKS4gSSdsbCBibGFtZSB0aGUgY29tcGxldGUKICBsYWNrIG9mIGRvY3MgaW4gdGhhdCBkZXBhcnRtZW50LiBDcmlzIHByb3ZpZGVkIGEgZml4LCB3aGljaCBJIG1vZGlmaWVkIG9ubHkKICBzbGlnaHRseS4KCkRhbmllbCAoMjcgU2VwIDIwMDIpCi0gQWZ0ZXIgYSBzdWdnZXN0aW9uIGZyb20gQ2hyaXN0aWFuIEt1cnogdG8gRGViaWFuIGN1cmwgcGFja2FnZSBtYWludGFpbmVyCiAgRG9tZW5pY28gQW5kcmVvbGksIEkgbWFkZSBpdCBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGUgcHJveHkgZW52aXJvbm1lbnQKICB2YXJpYWJsZXMgYmV0dGVyLiBOb3csIGJ5IHNldHRpbmcgLXggIiIgeW91IGNhbiBleHBsaWNpdGx5IHRlbGwgbGliY3VybCB0bwogIG5vdCB1c2UgYSBwcm94eSwgbm8gbWF0dGVyIHdoYW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBzYXkuCgpWZXJzaW9uIDcuMTAtcHJlNAoKRGFuaWVsICgyNiBTZXAgMjAwMikKLSBFeHRlbmRlZCBjdXJsX3ZlcnNpb25faW5mbygpIG1vcmUgYW5kIHdyb3RlIGEgbWFuIHBhZ2UgZm9yIGl0LgoKRGFuaWVsICgyNSBTZXAgMjAwMikKLSBsaWJjdXJsIGNvdWxkIGxlYWsgbWVtb3J5IHdoZW4gZG93bmxvYWRpbmcgbXVsdGlwbGUgZmlsZXMgdXNpbmcgaHR0cCByYW5nZXMsCiAgcmVwb3J0ZWQgYW5kIGZpeGVkIGJ5IEplYW4tTHVjIEd1ZXZlbC4KCi0gV2FsdGVyIEouIE1hY2sgcHJvdmlkZWQgY29kZSBhbmQgZG9jcyBmb3IgdGhlIG5ldyBjdXJsX2ZyZWUoKSBmdW5jdGlvbiB0aGF0CiAgc2hhbGwgYmUgdXNlZCB0byBmcmVlIG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCBieSBsaWJjdXJsIGFuZCByZXR1cm5lZCBiYWNrCiAgdG8gdGhlIGFwcGxpY2F0aW9uLCBhcyBjdXJsX2VzY2FwZSgpIGFuZCBjdXJsX3VuZXNjYXBlKCkgZG8uCgotIFlhcnJhbSBTdW5pbCBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlIG11bHRpIGludGVyZmFjZSB3aGVyZSBhIGZhaWxlZAogIGNvbm5lY3Rpb24gZGlkbid0IGNsb3NlIGRvd24gcHJvcGVybHkgYW5kIHRodXMgYSBzZWNvbmQgdHJhbnNmZXIgdXNpbmcgdGhlCiAgc2FtZSBoYW5kbGUgZmFpbGVkLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGEgZmxhdyB0aGF0IG1hZGUgKGFtb25nIG90aGVyIHRoaW5ncykgZGljdC1mZXRjaGVzCiAgcmV0dXJuIGEgcmFuZG9tIHZhbHVlLgoKRGFuaWVsICgyNCBTZXAgMjAwMikKLSBXZXogRnVybG9uZyBicm91Z2h0IGhpcyBpbml0aWFsIHBhdGNoIHRoYXQgaW50cm9kdWNlZCBjdXJsX3ZlcnNpb25faW5mbygpLgogIFdlIG1pZ2h0IG5lZWQgdG8gdHdlYWsgaXQgc29tZXdoYXQgYmVmb3JlIHJlbGVhc2UuCgpEYW5pZWwgKDIwIFNlcCAyMDAyKQotIENyYWlnIE1hcmt3YXJkdCBmaXhlZCBhbm90aGVyIFRydTY0IElQIHJlc29sdmUgcHJvYmxlbS4KCkRhbmllbCAoMTkgU2VwIDIwMDIpCi0gRG9sYm5lZmYgQS5WIGFuZCBTcGlyaWRvbm9mZiBBLlYgbWFkZSB0aGUgZmlsZTovLyBjb2RlIHdvcmsgd2l0aCByZXN1bWVzCiAgaW4gdGhlIHNhbWUgc3R5bGUgb3RoZXIgY29kZSBkb2VzLgoKLSBJbGd1aXogTGF0eXBvdiBmaXhlZCBhIGZsYXcgaW4gdGhlIGNsaWVudCBjb2RlIHdoZW4gZmV0Y2hpbmcgbXVsdGlwbGUgVVJMcwogIGFuZCAtQyAtIHdhcyB1c2VkLiBUaGUgZmlyc3QgZmlsZSdzIHJlc3VtZSBwb3NpdGlvbiB3YXMgdGhlbiBhY2NpZGVudGFsbHkKICByZXVzZWQgb24gYWxsIHRoZSBvdGhlciBmaWxlcyB0b28uCgpEYW5pZWwgKDE4IFNlcCAyMDAyKQotIFRoZSBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2Ugd2FzIGdyZWF0bHkgbW9kaWZpZWQgYW5kIHRoZSBvcHRpb25zIGhhdmUKICBub3cgYmVlbiBncm91cGVkIGluIGxvZ2ljYWwgZ3JvdXBzIHNvIHRoYXQgaXQgc2hvdWxkIGJlIHNvbWV3aGF0IGVhc2llciB0bwogIHJlYWQgaXQgYW5kIGZpbmQgdGhpbmdzIHlvdSBzZWFyY2ggZm9yLgoKRGFuaWVsICgxMyBTZXAgMjAwMikKLSBLZXZpbiBSb3RoIHBpbnBvaW50ZWQgYSBzY2FyeSBmbGF3IGluIGxpYmN1cmwsIHdoZW4gdGhlIEhUVFAgc2VydmVyIGRvZXNuJ3QKICBzZW5kIGFueSBoZWFkZXJzIGJhY2ssIG9ubHkgcmF3IGNvbnRlbnQuIFJpZ2h0LCB0aGF0IGlzIGEgdmlvbGF0aW9uIG9mIHRoZQogIHN0YW5kYXJkIGJ1dCBzdGlsbCBoYXBwZW5zIGF0IHRpbWVzIGFuZCB3ZSBuZWVkIHRvIGRlYWwgd2l0aCBpdC4gVGVzdCBjYXNlCiAgMzA2IHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhhdCB3ZSBkbyByaWdodCBub3cuCgpWZXJzaW9uIDcuMTAtcHJlMwoKRGFuaWVsICgxMSBTZXAgMjAwMikKLSBMdWthc3ogQ3pla2llcmRhIGZvdW5kIG91dCB0aGF0IGN1cmwgZGlkbid0IHNlbmQgYSBjb3JyZWN0IEhUVFAgSG9zdDogaGVhZGVyCiAgd2hlbiB5b3Ugc3BlY2lmaWVkIHRoZSBVUkwgd2l0aCBhbiBJUHY2IElQLWFkZHJlc3MuCgpEYW5pZWwgKDQgU2VwIDIwMDIpCi0gU3ZlbiBOZXVoYXVzIG1hZGUgLS1zaWxlbnQgYmVpbmcgYWNrbm93bGVkZ2VkIGV2ZW4gd2hlbiBtdWx0aXBsZSBVUkxzCiAgd2VyZSB1c2VkLiBJdCB1c2VkIHRvIG91dHB1dCAiWzEvMl06IGh0dHA6Ly9ob3N0L2EuaHRtbC5kZSAtLT4gYS5odG1sLmQiIGV0YwogIGV2ZW4gd2hlbiB0b2xkIHRvIHNodXQgdXAuCgpEYW5pZWwgKDMgU2VwIDIwMDIpCi0gVXBkYXRlZCBhbGwgc291cmNlIGNvZGUgaGVhZGVycyB0byB1c2UgTUlULWxpY2Vuc2UgcmVmZXJlbmNlcyBvbmx5LCBhbmQKICBwb2ludCB0byB0aGUgQ09QWUlORyBmaWxlIGFuZCB0aGUgaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2NvcHlyaWdodC5odG1sCiAgVVJMLiBJJ3ZlIGN1dCBvdXQgYWxsIHJlZmVyZW5jZXMgdG8gTVBMIHRoYXQgSSBjb3VsZCBmaW5kLgoKLSBDb3JlY3RlZCB0aGUgbWFrZWZpbGVzIHRvIG5vdCBhbHdheXMgdXNlIC1seiB3aGVuIGxpbmtpbmcKClZlcnNpb24gNy4xMC1wcmUyCgpEYW5pZWwgKDIgU2VwIDIwMDIpCi0gSmFtZXMgR2FsbGFnaGVyIGFkZGVkIENvbnRlbnQtRW5jb2Rpbmcgc3VwcG9ydCB0byBsaWJjdXJsIHNvIG5vdyBjdXJsIGFuZAogIGxpYmN1cmwtdXNpbmcgYXBwcyBjYW4gcmVxdWVzdCBjb21wcmVzc2VkIGNvbnRlbnRzIHVzaW5nIHRoZSAnZGVmbGF0ZScKICBtZXRob2QuIFNlZSB0aGUgc3BlY2lhbCBmaWxlIGxpYi9SRUFETUUuZW5jb2RpbmcgZm9yIGRldGFpbHMuCgogIGN1cmwgLS1jb21wcmVzc2VkIGlzIG5vdyB1c2VkIHRvIHJlcXVlc3QgY29tcHJlc3NlZCBjb250ZW50cy4KCiAgY3VybC1jb25maWcgLS1mZWF0dXJlIHdpbGwgaW5jbHVkZSAnbGlieicgaWYgdGhpcyBmZWF0dXJlIHdhcyBhcm91bmQgd2hlbgogIHRoZSBsaWJyYXJ5IHdhcyBidWlsdC4KCkRhbmllbCAoMzAgQXVnIDIwMDIpCi0gQXBwbGllZCBhbiBhbm9ueW1vdXMgU09DS1M1LXByb3h5IHBhdGNoLiBOb3QgcHJvcGVybHkgd29ya2luZyBpbiBhbGwKICBzaXR1YXRpb25zIHRob3VnaCwgYXMgYWxsIGdldGFkZHJpbmZvKCktdXNpbmcgbGliY3VybHMgd2lsbCBmYWlsIG9uIHRoaXMuCiAgVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSBzb21ld2hhdCBuYWl2ZSB3YXkgdGhlIGN1cnJlbnQgY29kZSB0cmllcyB0byBleHRyYWN0CiAgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHByb3h5LgoKLSBGaXhlZCB1cCB0aGUgU1NMIGNlcnQgZml4ZXMgZnJvbSB0aGUgb3RoZXIgZGF5IGV2ZW4gbW9yZSBhZnRlciBtb3JlIGlucHV0cwogIGZyb20gQ3Jpcy4gQWRkZWQgdGhyZWUgbmV3IFNTTCBlcnJvciBjb2RlcyB0byBtYWtlIHRoZQogIENVUkxFX1NTTF9DT05ORUNUX0VSUk9SIHNsaWdodGx5IGxlc3Mgb3ZlcmxvYWRlZC4KCkRhbmllbCAoMjcgQXVnIDIwMDIpCi0gQWZ0ZXIgbG90cyBvZiB0YWxrIHdpdGggVG9tIFplcnVjaGEsIE5pY2sgR2ltYnJvbmUgYW5kIENyaXMgQmFpbGlmZiBJCiAgZGVjaWRlZCB0byB0YWxrIHRoZSBib2xkIHBhdGggYW5kIEkgbm93IG1hZGUgbGliY3VybCBkbyBDQSBjZXJ0aWZpY2F0ZQogIHZlcmlmaWNhdGlvbiBieSBkZWZhdWx0LiBUaHVzIGxpYnJhcnkgdXNlcnMgbmVlZCB0byBleHBsaWNpdGx5IHR1cm4gdGhpcyBvZmYKICBpZiB5b3Ugd2FudCB0byBjb25uZWN0IHRvIHNpdGVzIHdpdGhvdXQgcHJvcGVyIGNoZWNraW5nLiBXZSBhbHNvIGluc3RhbGwgYQogIENBIGNlcnQgYnVuZGxlIG9uICdtYWtlIGluc3RhbGwnIG5vdy4KCiAgVGhlIGN1cmwgdG9vbCBub3cgcmVxdWlyZXMgdGhlIC1rLy0taW5zZWN1cmUgb3B0aW9uIGluIG9yZGVyIHRvIGFsbG93CiAgY29ubmVjdGlvbnMgYW5kIG9wZXJhdGlvbnMgb24gU1NMIHNpdGVzIHRoYXQgYXJlbid0IHByb3Blcmx5IHZlcmlmaWVkIHdpdGgKICAtY2FmaWxlIG9yIC0tY2FwYXRoLgoKICBjdXJsLWNvbmZpZyAtLWNhIGRpc3BsYXlzIHRoZSBidWlsdC1pbiBwYXRoIHRvIHRoZSBDQSBjZXJ0IGJ1bmRsZS4KCkRhbmllbCAoMjYgQXVnIDIwMDIpCi0gQW5kcmV3IEZyYW5jaXMgY2xlYW5lZCB1cCBzb21lIGNvZGUgdGhhdCBub3cgY29tcGlsZXMgZmluZSB3aXRob3V0IHRoZSBuZWVkCiAgZm9yIHVnbHkgTVNWQyBwcmFnbWFzLgoKLSBLZWl0aCBNYWNEb25hbGQgZm91bmQgYSBtaW5vciBidWcgaW4gc3JjL21haW4uYyB0aGF0IG1hZGUgaXQgY2xvc2Ugc3RkaW4KICBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgZmlsZSBoYW5kbGUuIEl0IHNob3VsZG4ndCBoYXZlIHJlc3VsdGVkIGluIG11Y2gKICB0cm91YmxlIGFzIG1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMgY2xvc2UgYWxsIGZpbGUgaGFuZGxlcyBvbiBwcm9jZXNzIGV4aXQKICBhbnl3YXkuCgpEYW5pZWwgKDIyIEF1ZyAyMDAyKQotIE1hcmt1cyBPYmVyaHVtZXIgcHJvdmlkZWQgc29tZSBkb2N1bWVudGF0aW9uIGZvciBoaXMgcHJldmlvdXNseSBwcm92aWRlZAogIENVUkxPUFRfTk9TSUdOQUwgZml4LgoKLSBQYXRjaGVkIHRoZSBsaWIvTWFrZWZpbGUuYW0gdG8gaG9wZWZ1bGx5IG5vIGxvbmdlciBjb21wbGFpbiBvbiB1bmRlZmluZWQKICBzeW1ib2xzIHRoYXQgc2VlbWVkIHRvIG9jY3VyIG9uIGJ1aWxkcyB3aXRoIHNoYXJlZCBPcGVuU1NMIGxpYnJhcmllcyBvbgogIFNvbGFyaXMgbGF0ZWx5Li4uCgpEYW5pZWwgKDIwIEF1ZyAyMDAyKQotIEZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIG9uIE1TQ1YrKyBjb21waWxlcy4gV2UncmUgbG9va2luZyBmb3IgaGVscCBoZXJlOgogIHJlbW92ZSB0aGUgcHJhZ21hcyBmcm9tIGxpYi9jb25maWctd2luMzIuaCBhbmQgYWRqdXN0IHRoZSBzb3VyY2VzIHdoZXJlCiAgdGhlIHdhcm5pbmdzIG9jY3VyLiBIaWRpbmcgdGhlbSB3aXRoIHByYWdtYXMgbGlrZSB0aGlzIGlzIG5vdCB0aGUgY29ycmVjdAogIHdheSBvZiBkZWFsaW5nIHdpdGggY29tcGlsZXIgd2FybmluZ3MuCgpEYW5pZWwgKDEzIEF1ZyAyMDAyKQotIFVscmljaCBaYWRvdyBtYWRlIHRoZSBnbG9iYWwgaW5jbHVkZSBmaWxlcyBpbiBjdXJsLyogaW5jbHVkZSB0aGVtc2VsdmVzCiAgdXNpbmcgImN1cmwuaCIgaW5zdGVhZCBvZiA8Y3VybC9jdXJsLmg+IHdoaWNoIHRodXMgYWxsb3dzIHBlb3BsZSB0byBtb3JlCiAgZnJlZWx5IGRlY2lkZSBob3cgdG8gaW5jbHVkZSBjdXJsIGFuZCBob3cgdG8gc2V0dXAgdGhlaXIgaW5jbHVkZSBwYXRocy4KCi0gU3RlcmxpbmcgSHVnaGVzIGFkZGVkIHRoZSBjdXJsX3NoYXJlKiBpbnRlcmZhY2UsIHNvbWV3aGF0IGFzIGRpc2N1c3NlZAogIHByZXZpb3VzbHkuCgotIEr2cm4gSGFydHJvdGggcG9pbnRlZCBvdXQgdGhhdCBwb2xsKCkgd2FzIHVzZWQgaW4gdGhlIHByZTEgc291cmNlIGNvZGUgYW5kCiAgaXQgaXNuJ3QgdmVyeSBwb3J0YWJsZSwgc28gbm93IEkgY2hlY2sgZm9yIGl0IGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZAogIHdvcmsgYXJvdW5kIGl0LgoKVmVyc2lvbiA3LjkuOS1wcmUxCgpEYW5pZWwgKDEyIEF1ZyAyMDAyKQotIEFwcGxpZWQgbXkgaW5pdGlhbCB0YWtlIG9uIG1ha2luZyB0aGUgbXVsdGkgc3R1ZmYgbW9yZSBhc3luY2hyb25vdXMuIENvbm5lY3RzCiAgc2hvdWxkIG5vdyByZXR1cm4gYmFjayB3aXRob3V0ICJoYW5naW5nIiB1bnRpbCBpdCBoYXMgY29ubmVjdGVkIGZvciByZWFsLgogIFRoaXMgc2hvdWxkIGFsc28gYmUgdGhlIGNhc2UgZm9yIEZUUC1QQVNWIGNvbm5lY3RzLgoKRGFuaWVsICg5IEF1ZyAyMDAyKQotIEFwcGxpZWQgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIncyBwYXRjaCB0aGF0IGludHJvZHVjZXMgQ1VSTE9QVF9OT1NJR05BTCwKICB3aGljaCBlZmZlY3RpdmVseSBwcmV2ZW50cyBsaWJjdXJsIGZyb20gZG9pbmcgYW55dGhpbmcgdGhhdCBtYXkgY2F1c2UKICBzaWduYWxzIHRvIGdldCBzZW50LiBUaGlzIGlzIGJhc2ljbHkgZm9yIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucyB0aGF0CiAgbm93IGNhbiB1c2UgdGltZW91dHMgcHJvcGVybHksIHdpdGhvdXQgcmlza2luZyBhbnkgc2lnbmFscyB0byBidXJzdCBpbiBhbmQKICBydWluIHRoZSBwYXJ0eS4KICAKRGFuaWVsICg1IEF1ZyAyMDAyKQotIEx1a2FzeiBDemVraWVyZGEgcmVwb3J0ZWQgdGhhdCBSRkMyNzMyLXN0eWxlIGxpdGVyYWwgSVB2NiBhZGRyZXNzZXMgZGlkbid0CiAgd29yay4gV2hlbiBkaWQgdGhhdCBjb2RlIHZhbmlzaD8gQW55d2F5LCBpdCdzIGJhY2sgYWdhaW4gbm93IGFuZCBzZWVtcyB0bwogIHdvcmshCgotIEpvbmF0YW4gTGFuZGVyIGZvdW5kIG91dCB0aGF0IFBPU1RpbmcgYW4gZW1wdHkgc3RyaW5nIGRpZG4ndCB3b3JrIHdpdGggdGhlCiAgY29tbWFuZCBsaW5lIHRvb2wuCgpEYW5pZWwgKDMgQXVnIDIwMDIpCi0gSvZybiBIYXJ0cm90aCBmaXhlZCB0aGUgbGliY3VybC5kZWYgZmlsZSB0byBidWlsZCB0aGUgd2luZG93cyBETEwgd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgZW5hYmxlZC4KCkRhbmllbCAoMSBBdWcgMjAwMikKLSBUaGUgZnRwIFBPUlQgY29tbWFuZCBub3cgdXNlcyBhIGJldHRlciBkZWZhdWx0IElQIGFkZHJlc3MsIGFzIGl0IHdpbGwKICBleHRyYWN0IGFuZCB1c2UgdGhlIGxvY2FsIElQIGFkZHJlc3MgdXNlZCBieSB0aGUgY29udHJvbCBjb25uZWN0aW9uLgoKLSBNb2RpZmllZCB0aGUgI2luY2x1ZGUgbGluZXMgaW4gY3VybC9tdWx0aS5oIHRvIHdvcmsgYmV0dGVyIG9uIG1vcmUKICBwbGF0Zm9ybXMuCgpEYW5pZWwgKDMxIEp1bCAyMDAyKQotIEF0dGVtcHRlZCBhIGZpeCBmb3IgUmF5IERlR2VubmFybydzIHJlcG9ydGVkIEhQLVVYIGhvc3QgbmFtZSByZXNvbHZlCiAgcHJvYmxlbXMuCgpEYW5pZWwgKDMwIEp1bCAyMDAyKQotIFByaXlhIFJhbWFrcmlzaG5hbiBhbmQgUnlhbiBKb25lcyBjb21waWxlcyBjdXJsL2N1cmwuaCB3aXRoIGEgQysrIGNvbXBpbGVyCiAgYW5kIGRvbid0IGdldCBfX1NURENfXyBkZWZpbmVkLCB3aGljaCByZXF1aXJlZCB1cyB0byBleHRlbmQgdGhlIHByZXByb2Nlc3NvcgogIGNoZWNrIGZvciB0aGUgIyMgb3BlcmF0b3IgdXNhZ2UuCgotIENvcnJlY3QgdGhlIGRlc2NyaXB0aW9uIGZvciBDVVJMT1BUX1BBU1NXREZVTkNUSU9OLCBpZiBzZXQgdG8gTlVMTCB0aGUKICBpbnRlcm5hbCBkZWZhdWx0IGZ1bmN0aW9uIHdpbGwgYmUgcHV0IGJhY2suCgotIGRhbmZ1enogYXQgbWlsay5jb20gZm91bmQgb3V0IHRoYXQgbGliY3VybCBiYWRseSBhc3N1bWVkIGEgc3BhY2UgYWZ0ZXIKICAnU2V0LUNvb2tpZTonIHNvIGlmIGl0IHdhc24ndCBwcmVzZW50LCBpdCBjYXVzZWQgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUKICBjb29raWUgbmFtZSB0byBmYWxsIG9mZiEKCkRhbmllbCAoMjkgSnVsIDIwMDIpCi0gVGhlIHBhc3N3b3JkIHByb21wdCBhc2tpbmcgZm9yIHVzZXIgcGFzc3dvcmQgdXNlZCBzdGRvdXQgYW5kIG5vdyB1c2VzCiAgc3RkZXJyIGluc3RlYWQgdG8gYmV0dGVyIGFsbG93IHJlZGlyZWN0aW5nLiBJdCBhbHNvIGxlYWtlZCBhIGZvcGVuKCkgZmlsZQogIGhhbmRsZSB0aGF0IGlzIG5vdyBmaXhlZC4KCkRhbmllbCAoMjggSnVsIDIwMDIpCi0gSEFWRV9TRVRWQlVGIHdhcyBsZWZ0IG91dCBmcm9tIHNyYy9tYWluLmMgd2hpY2ggbWFkZSAtTiBub3Qgd29yay4gRm91bmQgb3V0CiAgYnkgTSBULgoKRGFuaWVsICgyNiBKdW4gMjAwMikKLSBHbGVuIE5ha2FtdXJhIHNvbHZlZCBhIGNyYXNoIGluIHRoZSBuYW1lIHJlc29sdmluZyBmdW5jdGlvbiBmb3IgSVAtb25seQogIGFkZHJlc3NlcyBvbiBBbHBoYSBMaW51eCAoYXQgbGVhc3QpLgoKLSBULiBCaGFyYXRoIGNvcnJlY3RlZCB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIGludHJvZHVjZWQgaW4gNy45LjguCgpEYW5pZWwgKDIyIEp1biAyMDAyKQotIEFuZHLpcyBHYXJj7WEgcG9pbnRlZCBvdXQgbWFuIHBhZ2UgZXJyb3JzIGluIGN1cmxfZm9ybWFkZC4zLiBJIGZpeGVkLgoKRGFuaWVsICgxOSBKdW4gMjAwMikKLSBDaHJpcyBDb21iZXMgcG9pbnRlZCBvdXQgYSBmbGF3IGluIGN1cmxfZXNjYXBlKCkuIEkgZml4ZWQuIFdlIG5vIGxvbmdlcgogIHRyaWVzIHRvIGdlbmVyYXRlIG5vciBwYXJzZSAnKycgaW4gVVJMcy4gU3BhY2VzIGJlY29tZSAlMjAsIGFuZCBvbmx5ICUtY29kZXMKICBhcmUgdHJhbnNsYXRlZCBieSBjdXJsX3VuZXNjYXBlKCkuCgpEYW5pZWwgKDE1IEp1biAyMDAyKQotIEFkZGVkIC0tbGltaXQtcmF0ZSB0byB0aGUgY3VybCB0b29sLiBBbGxvd3MgdGhlIHVzZXIgdG8gc2V0IGEgbWF4bWltdW0KICB1cHBlciBsaW1pdCB0byBob3cgbXVjaCBiYW5kd2lkdGggdG8gdXNlIGZvciB0cmFuc2ZlcnMuCgotIENVUkxPUFRfQlVGRkVSU0laRSB3YXMgYWRkZWQgdG8gbGliY3VybC4gVGhpcyBzZXRzIGEgcHJlZmVyZWQgc2l6ZSBmb3IgdGhlCiAgcmVjZWl2ZSBidWZmZXIgaW4gbGliY3VybC4gVGhlIG1haW4gcG9pbnQgb2YgdGhpcyB3b3VsZCBiZSB0aGF0IHRoZSB3cml0ZQogIGNhbGxiYWNrIGdldHMgY2FsbGVkIG1vcmUgb2Z0ZW4gYW5kIHdpdGggc21hbGxlciBjaHVua3MuCgpEYW5pZWwgKDE0IEp1biAyMDAyKQotIFlhcnJhbSBTdW5pbCBmb3VuZCBvdXQgdGhhdCB0aGUgU29ja2V0SXNEZWFkKCkgZnVuY3Rpb24gcGVyZm9ybWVkIGEgbG90CiAgZmFzdGVyIG9uIFdpbmRvd3Mgd2hlbiByZW1vdmluZyB0aGUgMSBtaWNyb3NlY29uZCB0aW1lb3V0LgoKLSBIYW5ubyBMLiBLcmFuemhvZmYgZml4ZWQgdGhlIFZDKysgcHJvamVjdCBmaWxlcy4KCi0gVG9tIE1hdHRpc29uIGZvdW5kIG91dCB0aGF0IGZ0cCB0cmFuc2ZlcnMgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGEgbGl0dGxlCiAgdG9vIG9mdGVuLgoKLSBNaWtsb3MgTmVtZXRoIHBvc3RlZCBhIFZDKysgbWFrZWZpbGUgZml4IGFuZCBzb21lIElOU1RBTEwgY29tbWVudHMgb24gaG93CiAgdG8gZGlzYWJsZSBzcGVjaWZpYyBwcm90b2NvbHMgd2hlbiBidWlsZGluZyBmb3IgV2luZG93cy4KClZlcnNpb24gNy45LjgKCkRhbmllbCAoMTMgSnVuIDIwMDIpCi0gVGltZSB0byBsZXQgdGhpcyBiYWJ5IGdvLgoKRGFuaWVsICgxMiBKdW4gMjAwMikKLSBDaHJpcyBDb21iZXMgYWRkZWQgdGhyZWUgbmV3IG9wdGlvbnMgZm9yIGN1cmxfZm9ybWFkZCgpOiBDVVJMRk9STV9CVUZGRVIsCiAgQ1VSTEZPUk1fQlVGRkVSUFRSLCBDVVJMRk9STV9CVUZGRVJMRU5HVEguICBUaGV5IGFyZSB1c2VkIHRvIGNyZWF0ZSBhCiAgbXVsdGlwYXJ0IHRoYXQgYXBwZWFycyBhcyBhIHJlZ3VsYXIgZmlsZSB1cGxvYWQsIGJ1dCB0aGUgZGF0YSBpcyBwcm92aWRlZAogIHdpdGggYSBwb2ludGVyIGFuZCBsZW5ndGguCiAgCi0gTmljbyBCYWdndXMgbWFkZSB0aGUgVk1TIHZlcnNpb24gdXNlIHNpZ3NldGptcCgpIHRvby4KCi0gSvZybiBIYXJ0cm90aCBmaXhlZCB0aGUgbWluZ3czMiBidWlsZCB1c2luZyB0aGUgbW0gbGliLgoKLSBBcHBsaWVkIHBhdGNoZXMgYnkgS3JpcyBLZW5uYXdheSB0aGF0IGNvcnJlY3QgZm9ybWF0IHN0cmluZyBwcm9ibGVtcyBpbgogIGxpYi9mdHAuYyBhbmQgbGliL2xkYXAuYy4KClZlcnNpb24gNy45LjgtcHJlMwoKRGFuaWVsICgxMSBKdW4gMjAwMikKLSBKYW1lcyBDb25lIGJyb3VnaHQgdGhlIGlkZWEgb2YgdXNpbmcgc2lnc2V0am1wKCkgaW4gdGhlIHNpZ25hbCBoYW5kbGVyIHRvCiAgbWFrZSB0aGUgdGltZS1vdXQgb2YgbmFtZSBsb29rdXBzIHRvIHdvcmssIGV2ZW4gd2hlbiB0aGUgdW5kZXJseWluZyBuYW1lCiAgcmVzb2x2ZXIgbGlicmFyeSB0cmFwcyBFSU5UUi4gVGhlIHVzZSBvZiBzaWdzZXRqbXAoKSBhbmQgc2lnbG9uZ2ptcCgpIGZvcgogIHRoaXMgbWF5IGJlIGEgYml0IGRyYXN0aWMsIGFuZCBhbHNvIG5vdCBsaWtlbHkgdG8gZXhpc3Qgb24gYWxsIHBsYXRmb3Jtcy4gIEkKICBhZGRlZCBjYXJlZnVsIGNoZWNraW5nIGZvciB0aGlzIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LCBldmVuIGNoZWNrcyBmb3IgaXQKICBiZWluZyBhIG1hY3JvICh3aGljaCBzZWVtcyB0byBiZSB0aGUgY2FzZSBpbiBmb3IgZXhhbXBsZSBMaW51eCkuCgogIHNpZ3NldGptcCgpIHNlZW1zIHRvIGJlIG1lbnRpb25lZCBpbiB0aGUgU2luZ2xlIFVuaXggc3BlY2lmaWNhdGlvbi4KCi0gTWlrbG9zIE5lbWV0aCBicm91Z2h0IGEgcGF0Y2ggdGhhdCBhbGxvd3MgbGliY3VybCB0byBnZXQgYnVpbHQgd2l0aCBzcGVjaWZpYwogIHByb3RvY29scyBkaXNhYmxlZC4gVGhpcyBpcyBkb25lIGJ5IHJ1bm5pbmcgLi9jb25maWd1cmUKICAtLWRpc2FibGUtW3Byb3RvY29sXS4KCi0gRlRQIHJhbmdlIGRvd25sb2FkcyBjb3VsZCBtYWtlIENVUkxFX0ZUUF9XUklURV9FUlJPUiBnZXQgcmV0dXJuZWQuIFdlIG5vdwogIG1ha2UgcHJlY2F1dGlvbnMgdG8gbm90IHJldHVybiB0aGlzIGZvciByYW5nZSBkb3dubG9hZHMuCgogIEFkZGVkIHRlc3QgY2FzZSAxMzUgdGhhdCBtYWtlcyBhbiBmdHAgcmFuZ2UgZG93bmxvYWQuIEhhZCB0byB0d2VhayB0aGUKICBydW50ZXN0cy5wbCBzY3JpcHQgYSBiaXQgdG9vLgoKLSBCdWcgcmVwb3J0ICM1NjY4MzUgaWRlbnRpZmllZCBhIHN0cmxlbigpIG9uIGEgTlVMTCBwb2ludGVyLiBBZGRlZCBhZGRpdGlvbmFsCiAgY2hlY2sgdG8gcHJldmVudCB0aGlzLgoKRGFuaWVsICgxMCBKdW4gMjAwMikKLSBGb3VuZCBhbmQgY29ycmVjdGVkIGEgY29ubmVjdCBmYWlsdXJlIHByb2JsZW0gdGhhdCBkaWRuJ3QgY3JlYXRlIGEgaHVtYW4KICBlcnJvciB0ZXh0LgoKLSBBZGRlZCBjb2RlIHRvIGNvbXBpbGUgd2l0aCBPcGVuU1NMIDAuOS43LiBCYXNlZCBvbiBwYXRjaCBmcm9tIEphY29iIE1ldXNlcgogIGFuZCBjb21tZW50cyBmcm9tIEf2dHogQmFiaW4tRWJlbGwuCgotIEdhdXRhbSBNYW5pIGZvdW5kIGEgc29ja2V0IGRlc2NyaXB0b3IgbGVhayB0aGF0IGhhcHBlbmVkIHdoZW4gRlRQIHRyYW5zZmVycwogIGZhaWxlZCBhbmQgeW91IHJlaW52b2tlZCBjdXJsX2Vhc3lfcGVyZm9ybSgpLgoKRGFuaWVsICg1IEp1biAyMDAyKQotIEd1c3RhZiBIdWkgY29ycmVjdGVkIGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgpIHNvIHRoYXQgaXQgd29uJ3QgY3Jhc2ggbm8KICBtYXR0ZXIgd2hlbiB5b3UgZGVjaWRlIHRvIHJlbW92ZSB0aGUgQ1VSTCBoYW5kbGUuCgotIEhBVkVfUkFORF9TVEFUVVMgd2FzIGFkZGVkIHRvIGxpYi9jb25maWctd2luMzIuaCBieSBBbmRyZWFzIE9sc3NvbiwgYXMgaXQKICBtYWtlcyB3aW5kb3dzIGJ1aWxkcyBzdG9wIGNvbXBsYWluaW5nIGFib3V0ICJ3ZWFrIHNlZWRpbmciIHdoZW4gaXQgaW4gZmFjdAogIGlzbid0LgoKLSBBbm90aGVyIDY0Yml0IGFyY2hpdGVjdHVyZSBjcmFzaCB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIDcuOS43IHdhcyBub3cKICByZW1vdmVkLCBhcyBidWcgcmVwb3J0ICM1NjQ1ODUgY2xhcmlmaWVkLiBUaGlzIGhhcHBlbmVkIGR1ZSB0byBvdXIgYXR0ZW1wdHMKICB0byBvbmx5IGFsbG9jYXRlIG9ubHkgYXMgbXVjaCBtZW1vcnkgYXMgaXMgYWN0dWFsbHkgbmVlZGVkIGZvciBuYW1lCiAgcmVzb2x2aW5nICh1c2luZyByZWFsbG9jKSB3aGljaCBjYWxsZWQgZm9yIGEgZnVuY3Rpb24gdGhhdCBjb3VsZCAnbW92ZScgYQogIGhvc3RlbnQgc3RydWN0IGluIG1lbW9yeS4KClZlcnNpb24gNy45LjgtcHJlMgoKRGFuaWVsICgzIEp1biAyMDAyKQotIFQuIEJoYXJhdGggZml4ZWQgdGhlIENVUkxJTkZPX1JFRElSRUNUX1RJTUUgdG8gcmV0dXJuIGEgY29ycmVjdCB0aW1lIGFuZAogIG1hZGUgdGhlIENVUkxJTkZPX1JFUVVFU1RfU0laRSByZXR1cm4gdGhlIGNvcnJlY3QgdG90YWwgcmVxdWVzdCBzaXplLiBIZQogIGFsc28gbWFkZSB0aGUgd2luMzIgdGltZXJzIHVzZSBoaWdoZXIgcmVzb2x1dGlvbiB0aGFuIGJlZm9yZS4KCkRhbmllbCAoMjkgTWF5IDIwMDIpCi0gUmVuYXVkIENoYWlsbGF0IG1hZGUgbWUgYXdhcmUgb2YgdGhlIGZhY3QgdGhhdCBsaWJjdXJsIHJldHVybmVkIGFuIGVycm9yIGlmCiAgeW91IHRyaWVkIHRvIGdldCBhbiBlbXB0eSBGVFAgZmlsZS4gVGhpcyBzZWVtZWQgbGlrZSBhIHdyb25nIHRoaW5nIHRvIGRvLCBzbwogIG5vdyBpdCBubyBsb25nZXIgZG9lcyB0aGF0ISBJIGp1c3QgaG9wZSB0aGF0IG5vIG9uZSBidWlsdCBhbnl0aGluZyBmYW5jeQogIHVwb24gdGhpcyB1bmV4cGVjdGVkIGJlaGF2aW9yLi4uCgpEYW5pZWwgKDI4IE1heSAyMDAyKQotIENyaXMgQmFpbGlmZiBicm91Z2h0IENVUkxPUFRfQ0FQQVRIIHRoYXQgd29ya3MgbGlrZSBDVVJMT1BUX0NBSU5GTyBidXQKICBzcGVjaWZpZXMgYSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdpdGggY2VydGlmaWNhdGVzIHJhdGhlciB0aGFuIGEgc2luZ2xlIGZpbGUKICB3aXRoIHRoZW0gYWxsIGNvbmNhdGVuYXRlZC4gLS1jYXBhdGggd2FzIGFkZGVkIHRvIHRoZSBjb21tYW5kIGxpbmUgdG9vbAogIGZvciB0aGUgc2FtZSBmdW5jdGlvbi4KCiAgV2luZG93cyB1c2VycyBuZWVkIHRvIHBheSBhdHRlbnRpb24gdGhhdCB0aGUgZGlyZWN0b3J5IHNob3VsZCBiZSBzZXR1cCB3aXRoCiAgdGhlIGNfcmVoYXNoIHRvb2wgb2YgdGhlIE9wZW5TU0wgcGFja2FnZSwgYW5kIHRoYXQgY3JlYXRlcyBzeW1saW5rcyBieQogIGRlZmF1bHQgdGhhdCBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggYWN0dWFsIGNvcGllcyB0byB3b3JrIG9uIFdpbmRvd3MuCgotIEd1c3RhZiBIdWkgcHJvdmlkZWQgbmV3IGNvZGUgdGhhdCBjaGFuZ2VzIGhvdyBjdXJsX211bHRpX2luZm9fcmVhZCgpCiAgbWVzc2FnZXMgYXJlIHN0b3JlZCwgc28gdGhhdCB0aGV5IGRvbid0IGhhdmUgdG8gYmUga2VwdCBhcm91bmQgZm9yIHRoZSBtdWx0aQogIGhhbmRsZSdzIGVudGlyZSBsaWZlIHRpbWUuIEhlIGFsc28gbWFkZSBpdCByZXR1cm4gZmFpbHVyZSBjb2RlcyBwcm9wZXJseQogIHdoaWNoIGl0IGRpZG4ndCBkbyBiZWZvcmUuCgpEYW5pZWwgKDI3IE1heSAyMDAyKQotIEd1c3RhZiBIdWkgcG9pbnRlZCBvdXQgdGhhdCBydW5uaW5nIGN1cmxfbXVsdGlfcGVyZm9ybSgpIHdpdGhvdXQgZG9pbmcKICBjdXJsX211bHRpX2Zkc2V0KCkgZmlyc3Qgd2FzIG5vdCByZWFsbHkgYSB3b3JraW5nIGNvbWJvLiBJIGFkZGVkIGFuIGludGVybmFsCiAgY2hlY2sgZm9yIHRoaXMgYW5kIGhhdmUgc29tZSBleHRyYSBzZWxlY3QoKSBjb2RlIHdpdGhvdXQgdGltZW91dCB0byBtYWtlIHRoZQogIGxpYnJhcnkgaW50ZXJuYWxzIHdvcmsgaWRlbnRpY2FsbHkgbmV2ZXJ0aGVsZXNzLiBXZSBtaWdodCBuZWVkIHRvIHNvbWVob3cKICBlaXRoZXIgZG9jdW1lbnQgdGhhdCBvbmNlIHlvdSd2ZSB1c2VkIHRoZSAqX2Zkc2V0KCkgeW91IHNob3VsZCByZW1haW4gdXNpbmcKICB0aGVtIGluIHNlbGVjdCgpIG9yIHlvdSBzaG91bGQgYmxhbmsgdGhlbSBzb21laG93IHNvIHRoYXQgbGliY3VybCB3b24ndCBnbwogIGNyYXp5LgoKVmVyc2lvbiA3LjkuOC1wcmUxCgpEYW5pZWwgKDIyIE1heSAyMDAyKQotIEphbWVzIENvbmUgYnJvdWdodCBhbiBleGNlbGxlbnQgcGF0Y2gsIGluY2x1ZGluZyBzZXZlcmFsIHRlc3RzIGFuZCBkb2NzIQogIENVUkxPUFRfTkVUUkMgbm93IHRha2VzIGFuIGVudW0gYXMgYXJndW1lbnQgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgYm9vbGVhbi4KICAtLW5ldHJjLW9wdGlvbmFsIHdhcyBpbnRyb2R1Y2VkIGFzIGFuIGFkZGl0aW9uIHRvIC0tbmV0cmMgdG8gYWxsb3cgdGhlCiAgY29tbWFuZCBsaW5lIGNsaWVudCB0byB0YWtlIHVzZSBvZiBhbGwgdGhhdCBuZXcgbmV0cmMgc3R1ZmYuCgotIEJ1ZyByZXBvcnQgIzU1ODg4OCBzaG93ZWQgYSBjYXNlIHdoZXJlIGxpYmN1cmwgcmUtdXNlZCB0aGUgcHJldmlvdXMgaG9zdAogIG5hbWUgd2hlbiBhIGNvbm5lY3Rpb24gb3ZlciBhIHByb3h5IHdhcyByZS11c2VkIGJ1dCB0byBhIGRpZmZlcmVudCB0YXJnZXQKICBob3N0LgoKRGFuaWVsICgyMSBNYXkgMjAwMikKLSBFZGluIEthZHJpYmFzaWMgaGVscGVkIG1lIHNvcnQgb3V0IGEgcHJvYmxlbSB0byBtYWRlIGxpYmN1cmwgY3Jhc2ggd2hlbgogIHRyeWluZyB0byBIVFRQIFBPU1QgYW4gZW1wdHkgc3RyaW5nLgoKLSBDbGFyaWZpZWQgdGhhdCBKdWVyZ2VuIFdpbGtlIGRvbmF0ZWQgdGhlIG9yaWdpbmFsIHRlc3RzL3NlcnZlci9zd3MuYyBjb2RlLgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIG1hZGUgY3VybF9mb3JtYWRkKCkgcmV0dXJuIGEgdHlwZWRlZiBuYW1lZAogIENVUkxGT1JNY29kZSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyAnaW50JywgYW5kIHRoZSB2YXJpb3VzIHJldHVybiBjb2RlcyBhcmUKICBub3cgZ2xvYmFsbHkgZXhwb3J0ZWQuIEl0IGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gYmV0dGVyIGZpZ3VyZSBvdXQgd2hhdCBnb2VzCiAgd3Jvbmcgd2hlbiBjdXJsX2Zvcm1hZGQoKSByZXR1cm5zIGVycm9ycy4KCkRhbmllbCAoMjAgTWF5IDIwMDIpCi0gUm9sYW5kIFppbW1lcm1hbm4gcG9pbnRlZCBvdXQgdGhhdCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKCkKICBpcyBwcmVmZXJlZCB0byBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlKCkuCgpEYW5pZWwgKDE3IE1heSAyMDAyKQotIEJ1ZyByZXBvcnQgIzU1Njg2OSBwb2ludGVkIG91dCB0aGF0IHNyYy93cml0ZW91dC5jIGRpZG4ndCBjb21waWxlIG9uIGZyZWVic2QKICBhZnRlciBteSBBSVggZml4ZXMgdGhlIG90aGVyIHdlZWsuCgotIEJ1ZyByZXBvcnQgIzU1NjkzMCBwb2ludGVkIG91dCBhIEZyZWVCU0QgY29yZSBkdW1wIGludHJvZHVjZWQgaW4gNy45LjcgaW4KICB0aGUgRE5TIHN0cnVjdCByZWFsbG9jIHN0dWZmLiBBY3R1YWxseSwgdGhpcyBjcmFzaCBjb3VsZCBoYXBwZW4gb24gYWxsCiAgc3lzdGVtcyB0aGF0IG1hZGUgdGhlIHBhY2tfaG9zdGVudCgpIGZ1bmN0aW9uIGdldCBpbnZva2VkLgoKLSBJIHJlbW92ZWQgc2V2ZXJhbCBjb21waWxlciB3YXJuaW5ncyBpbiB0aGUgdGVzdCBzdWl0ZSdzIEhUVFAgc2VydmVyLgoKVmVyc2lvbiA3LjkuNwoKRGFuaWVsICgxMCBNYXkgMjAwMikKLSBLZXZpbiBSb3RoIGFkanVzdGVkIHRoZSAtLXRyYWNlLWFzY2lpIG91dHB1dCBzbGlnaHRseS4KCi0gUGF1bCBIYXJyaW5ndG9uIGZvdW5kIG91dCB0aGF0IHNyYy93cml0ZW91dC5jIG5lZWRlZCBhbiBhZGRpdGlvbmFsIGhlYWRlcgogIGZpbGUgaW5jbHVkZWQgZm9yIEFJWCBidWlsZHMKClZlcnNpb24gNy45LjctcHJlMgoKRGFuaWVsICg3IE1heSAyMDAyKQotIFVwZGF0ZWQgdGhlIG1hbiBwYWdlIHdpdGggLS10cmFjZS1hc2NpaSBhbmQgLWovLS1qdW5rLXNlc3Npb24tY29va2llcy4KCi0gTWFkZSAtLXRyYWNlLWFzY2lpIGRvIHByZXR0eSBtdWNoIHRoZSBzYW1lIGFzIC0tdHJhY2UgYnV0IHdpdGhvdXQgdGhlIGhleAogIHBhcnQgaW4gdGhlIG91dHB1dC4KCi0gQWRkZWQgQ1VSTE9QVF9DT09LSUVTRVNTSU9OIHRoYXQgd2hlbiBlbmFibGVkIG1ha2VzIGxpYmN1cmwgaWdub3JlIHNlc3Npb24KICBjb29raWVzIHJlYWQgZnJvbSBhIGZpbGUuIFRoaXMgb3B0aW9uIGlzIGVuZm9yY2VkIGJ5IHRoZSBjdXJsIGNvbW1hbmQgbGluZQogIHRvb2wgdXNpbmcgdGhlIG5ldyAtai8tLWp1bmstc2Vzc2lvbi1jb29raWVzIG9wdGlvbi4gQWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aAogIEtldmluIFJvdGguIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHVzZSBjdXJsIHRvIGZ1bGx5IGVtdWxhdGUgYSBicm93c2VyJ3MKICBiZWhhdmlvciwgZXZlbiB3aGVuIGl0IGNvbWVzIHRvICJzZXNzaW9uIGNvb2tpZXMiLiBTZXNzaW9uIGNvb2tpZXMgYXJlCiAgY29va2llcyB0aGF0IGEgbm9ybWFsIGJyb3dzZXIgZGlzY2FyZHMgd2hlbiB0aGUgYnJvd3NlciBpcyBzaHV0CiAgZG93bi4gVGhleSdyZSBpZGVudGlmaWVkIGJ5IG5vdCBoYXZpbmcgYW55IGV4cGlyZSBkYXRlL3RpbWUuCgotIFdoZW4gQ1VSTE9QVF9ERUJVR0RBVEEgd2FzIHNldCwgaXQgcnVpbmVkIHRoZSBDVVJMT1BUX1NUREVSUiBzZXR0aW5nIGFuZAogIHRoaXMgd2FzIGRpc2NvdmVyZWQgd2hlbiAtLXRyYWNlIHdhcyBtYWRlIHRvIGNyYXNoLgoKLSBVc2luZyAtdiBhbmQgLS10cmFjZSBhdCB0aGUgc2FtZSB0aW1lIGNvbmZ1c2VkIG1hdHRlcnMuIC12IGlzIG5vdyBwcmV0dHkKICBtdWNoIGlnbm9yZWQgd2hlbiAtLXRyYWNlIG9yIC0tdHJhY2UtYXNjaWkgaXMgdXNlZC4KCi0gTWFkZSAtLXRyYWNlIChhbmQgLS10cmFjZS1hc2NpaSkgc3VwcG9ydCAtIGFzIGZpbGUgbmFtZSB0byBwYXNzIG91dHB1dCB0bwogIHN0ZG91dCBpbnN0ZWFkLiBJdCBtYWtlcyBpdCBjb25zaXN0ZW50IHdpdGggaG93IG90aGVyIG9wdGlvbnMgd29yay4KClZlcnNpb24gNy45LjctcHJlMQoKRGFuaWVsICg2IE1heSAyMDAyKQotIEFkZGVkIG11bHRpLXBvc3QuYyB0byB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5LiBJIGdvdCB0aGUgYmFzaWMgc291cmNlIGZvcgogIHRoaXMgZnJvbSBHdXN0YWYgSHVpLgoKRGFuaWVsICgzIE1heSAyMDAyKQotIENVUkxfTUFYX1dSSVRFX1NJWkUgaXMgbm93IGFuIGV4cG9ydGVkICNkZWZpbmUgaW4gdGhlIGN1cmwvY3VybC5oIGhlYWRlciBhbmQKICBjYW4gYmUgdXNlZCB0byBmaWd1cmUgb3V0IHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIHlvdXIgd3JpdGUgY2FsbGJhY2sgY2FuCiAgZ2V0LgoKLSBDVVJMT1BUX1JFQUREQVRBIGlzIG5vdyBhbiBhbGlhcyBmb3IgQ1VSTE9QVF9JTkZJTEUgYW5kIENVUkxPUFRfV1JJVEVEQVRFIGlzCiAgYW4gYWxpYXMgZm9yIENVUkxPUFRfRklMRS4gVGhlc2UgdHdvIHdlcmUgYWRkZWQgZm9yIGNvbmZvcm1pdHkuIE1vc3Qgb3RoZXIKICBjYWxsYmFjayBmdW5jdGlvbidzIHVzZXJkYXRhIGFyZSBwcm92aWRlZCB3aXRoIG9wdGlvbnMgdXNpbmcgYSBzaW1pbGFyIG5hbWUtCiAgc2NoZW1lLgoKLSBBZGRlZCAiLS10cmFjZSBbZmlsZV0iIHRvIHRoZSBjb21tYW5kIGxpbmUgdG9vbC4gSXQgbWFrZXMgYSB2ZXJ5IGRldGFpbGVkCiAgdHJhY2UgZHVtcCBnZXQgc3RvcmVkLCB3aXRoIGEgZnVsbCBwcm90b2NvbCBkdW1wIHRoYXQgaW5jbHVkZXMgYWxsIHJlY2VpdmVkCiAgYW5kIHRyYW5zbWl0dGVkIGRhdGEuIFRoaXMgY291bGQgYmUgYSB2ZXJ5IGVmZmVjdGl2ZSB0b29sIGZvciBkZWJ1Z2dpbmcgd2hhdAogIGdvZXMgd3JvbmcuIFRoaXMgZHVtcCBpbmNsdWRlcyBldmVyeSBieXRlIHRoZSB3YXkgaXQgaXMgc2VudCB0by9yZWNlaXZlZAogIGZyb20gdGhlIHNlcnZlci4gVGhlIGR1bXAgaXMgdGhlIHBsYWluLXRleHQgdmVyc2lvbiwgc28gU1NMIHRyYW5zZmVycyB3aWxsCiAgc3RpbGwgYmUgcmVhZGFibGUuCgotIEkgZm91bmQgb3V0IHRoYXQgdGhlIERFQlVHRlVOQ1RJT04gd2FzIG5vdCBjYWxsZWQgcHJvcGVybHkgZXZlcnl3aGVyZSBhcyB3ZQogIHdhbnRlZCBpdCB0by4gSSBmaXhlZCBpdC4KCi0gLUQgbm93IHN0b3JlcyBhbGwgaGVhZGVycyB0byB0aGUgc2FtZSBmaWxlIGlmIG11bHRpcGxlIFVSTHMgYXJlIGdpdmVuIG9uIHRoZQogIGNvbW1hbmQgbGluZSEgS2V2aW4gUm90aCBtYWRlIG1lIGF3YXJlIG9mIHRoYXQgaXQgZGlkbid0IGFscmVhZHkgZG8gdGhpcyEKCi0gR3VzdGFmIEh1aSB3cm90ZSBhbiBleGNlbGxlbnQgZm9ybXBvc3QgZXhhbXBsZSB0aGF0IHVzZWQgdGhlIG11bHRpCiAgaW50ZXJmYWNlLiAgVW5mb3J0dW5hdGVseSwgaXQgZGlkbid0IHdvcmsgZHVlIHRvIHNldmVyYWwgYnVncyBpbiBob3cKICB0cmFuc2ZlcnMgd2VyZSBtYWRlIHdoZW4gdGhlIG11bHRpIGludGVyZmFjZSB3YXMgdXNlZC4KCkRhbmllbCAoMiBNYXkgMjAwMikKLSBIYW5ubyBLcmFuemhvZmYgZm91bmQgb3V0IHRoYXQgd2hlbiBkb2luZyBtdWx0aXBsZSB0cmFuc2ZlcnMgb24gdGhlIHNhbWUKICBlYXN5IGhhbmRsZSwgdGhlIHByb2dyZXNzIG1ldGVyIHdvdWxkIHNob3cgYSBiYWQgImN1cnJlbnRseSBkb3dubG9hZGVkCiAgdmFsdWUiIHdoZW4gdGhlIHRyYW5zZmVyIHN0YXJ0cy4KCkRhbmllbCAoMSBNYXkgMjAwMikKLSBBcHBsaWVkIGFub3RoZXIgcGF0Y2ggYnkgSmFja3kgTGFtIHRvIG1ha2UgdGhlIG5hbWUgcmVzb2x2ZSBpbmZvIHJlYWxsb2MoKQogIHN0dWZmIHdvcmsgcHJvcGVybHkuCgpEYW5pZWwgKDI4IEFwcmlsIDIwMDIpCi0gY3VybF9tdWx0aV9pbmZvX3JlYWQoKSBpcyBub3cgaW1wbGVtZW50ZWQhCgpEYW5pZWwgKDI3IEFwcmlsIDIwMDIpCi0gVXBkYXRlZCBCVUdTLCBUT0RPLCBGQVEsIElOU1RBTEwgYW5kIGFkZGVkIEJJTkRJTkdTLgoKLSBJIHRoaW5rIEkgZml4ZWQgdGhlIEROUyBjYWNoZSBwcnVuZSBjcmFjaCBKYWNreSBMYW0gZm91bmQgYW5kIHJlcG9ydGVkLgoKLSBJIGNsZWFuZWQgdXAgdGhlIG5hbWUgcHJlZml4IHN0dWZmIGluIHRoZSBoYXNoIGFuZCBsbGlzdCBtb2R1bGVzLgoKLSBGVFAgcmVzcG9uc2VzIHNob3VsZCBub3cgYmUgYmV0dGVyIG9uIHRpbWluZyBvdXQgcHJvcGVybHkuIFRoZSB0aW1lb3V0IHZhbHVlCiAgaXMgbWF4aW11bSB0aW1lb3V0IGZvciB0aGUgZW50aXJlIHJlcXVlc3Qgb3BlcmF0aW9uLCBidXQgYmVmb3JlIHRoaXMsIHRoZQogIHRpbWVvdXQgd2FzIHVzZWQgYXMgYSBtYXhpbXVtIGFsbG93ZWQgdGltZSBiZXR3ZWVuIHR3byByZWFkcy4uLgoKRGFuaWVsICgyNiBBcHJpbCAyMDAyKQotIEZpeGVkIHRoZSB0ZXN0IHN1aXRlIGh0dHAgc2VydmVyIHRvIG5vdCB1c2Ugc25wcmludGYoKSBhbnltb3JlIGR1ZSB0byBiZXR0ZXIKICBwb3J0YWJpbGl0eS4KCkRhbmllbCAoMjUgQXByaWwgMjAwMikKLSBXaXRoIFN0ZXJsaW5nIEh1Z2hlcycgbmV3IEROUyBwcnVuaW5nLCBKYWNreSBMYW0gYXNrZWQgaWYgdGhpcyB3b3VsZG4ndAogIGNhdXNlIHByb2JsZW1zIHNpbmNlIHRoZSBwcnVuaW5nIGlzIG9ubHkgY2hlY2tpbmcgdGhlIGVudHJ5IHRpbWUsIGFuZCBpdAogIHN1cmUgY291bGQgY2F1c2UgcHJvYmxlbXMuIFRoZXJlZm9yLCBJJ3ZlIG5vdyBhZGRlZCBhbmQgY2hhbmdlZCBjb2RlIHNvIHRoYXQKICB0aGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLiBOb3doZXJlIGluIHRoZSBjb2RlIHdpbGwgYmUgc3RvcmUgbmFtZQogIHJlc29sdmVkIGluZm9ybWF0aW9uIGFyb3VuZCBzbyB0aGF0IGEgc3Vuc2VxdWVudCBETlMgY2FjaGUgcHJ1bmUgc2hvdWxkCiAgY2F1c2UgYSBwcm9ibGVtLiBUaGlzIG9mIGNvdXJzZSBjYWxsZWQgZm9yIHNvbWUgbWlsZCBpbnRlcm5hbCBjaGFuZ2VzLgoKRGFuaWVsICgyMyBBcHJpbCAyMDAyKQotIEltcHJvdmVkIHRoZSAnbm9fcHJveHknIGNoZWNrLCBhcyB1c2luZyBwb3J0IG51bWJlcnMgaW4gdGhlIFVSTCBjb25mdXNlZCBpdAogIHByZXZpb3VzbHkuIFJlcG9ydGVkIGJ5IEVyd2FuIExlZ3JhbmQgaW4gYnVnIHJlcG9ydCAjNTQ3NDg0LgoKLSBUaGUgLS1pbnRlcmZhY2Ugb3B0aW9uIG5vdyB3b3JrcyBldmVuIG9uIElQdjYgZW5hYmxlZCBidWlsZHMuIFJlcG9ydGVkIGJ5CiAgJ3Rob3InLgoKRGFuaWVsICgyMiBBcHJpbCAyMDAyKQotIFRoZSAjZGVmaW5lcyBuYW1lcyBzdGFydGluZyB3aXRoIFRJTUVDT05EIG5vdyBoYXMgQ1VSTF8gcHJlZml4ZXMuIChUaGUgb2xkCiAgbmFtZXMgYXJlIHN0aWxsICNkZWZpbmVkIHRvby4pIFBvaW50ZWQgb3V0IGJ5IFJvYmVydCBPbHNvbi4KCi0gSmFja3kgTGFtIGJyb3VnaHQgY29kZSB0aGF0IGxldHMgdGhlIG5hbWUgcmVzb2x2ZSBmdW5jdGlvbiBvbmx5IHVzZSBhcyBtdWNoCiAgbWVtb3J5IGFzIGl0IGFjdHVhbGx5IG5lZWRzLiBUaGlzIG9ubHkgd29ya3Mgb24gY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcywKICBidXQgaXMgdG90YWxseSB0cmFuc3BhcmFudCB0byBhbGwgdXNlcnMuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDIpCi0gQmpvcm4gUmVlc2UgZml4ZWQgcGFja19ob3N0ZW50IHRvIHdvcmsgcHJvcGVybHkgd2l0aCA2NCBiaXQgcG9pbnRlcnMuCgpEYW5pZWwgKDE4IEFwcmlsIDIwMDIpCi0gU3RlcmxpbmcgSHVnaGVzIGFkZGVkIGNvZGUgdG8gcHJ1bmUgb2xkIEROUyBjYWNoZSBlbnRyaWVzLCBzaW5jZSBKYWNreSBMYW0KICBleHBlcmllbmNlZCB2ZXJ5IGJpZyBjYWNoZXMuCgpEYW5pZWwgKDE3IEFwcmlsIDIwMDIpCi0gRGlyayBNYW5za2UgcGF0Y2hlZCB0aGUgMzAxIHJlc3BvbnNlIHRvIHdvcmsgYWdhaW5zdCB0aGUgUkZDIGJ1dCBtb3JlIGxpa2UKICBjb21tb24gYnJvd3NlcnMgZG8uIElmIGEgUE9TVCBnZXQgYSAzMDEgYmFjaywgaXQnbGwgc3dpdGNoIHRvIEdFVCBpbiB0aGUKICBuZXh0IHJlcXVlc3QgKGlmIGxvY2F0aW9uLWZvbGxvd2luZyBpcyBlbmFibGVkKS4KCkRhbmllbCAoMTYgQXByaWwgMjAwMikKLSBEaXJrIE1hbnNrZSBwb3N0ZWQgYSBwYXRjaCBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSW5nbyBXaWxrZW4gdGhhdCBpbnRyb2R1Y2VkCiAgdHdvIG5ldyBDVVJMSU5GT18qIHZhbHVlczogQ1VSTElORk9fUkVESVJFQ1RfVElNRSBhbmQKICBDVVJMSU5GT19SRURJUkVDVF9DT1VOVC4KCkRhbmllbCAoMTUgQXByaWwgMjAwMikKLSBKb25hdGFuIExhbmRlciBwYXRjaGVkIHRoZSB2ZXJib3NlIHRleHQgJ0Rpc2FibGVzIFBPU1QsIGdvZXMgd2l0aCBHRVQnIHRvCiAgcmVmbGVjdCByZWFsaXR5IGJldHRlciwgbGlrZSB3aGVuIHRoZSBmaXJzdCByZXF1ZXN0IGlzbid0IFBPU1QgYW5kIHdoZW4KICB0aGUgc2Vjb25kIGlzbid0IEdFVC4uLiA6LSkKCi0gQ3JhaWcgRGF2aXNvbiBwb2ludGVkIG91dCB0aGF0IHdoZW4gY3VybF9mb3JtYWRkKClpbmcgYSBmaWxlIHRoYXQgZG9lc24ndAogIGV4aXN0LCBsaWJjdXJsIGRvZXNuJ3QgcmV0dXJuIGVycm9yLiBOb3csIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2lsbCByZXR1cm4KICBDVVJMRV9SRUFEX0VSUk9SIGlmIHRoYXQgaXMgdGhlIGNhc2UuIFRlc3QgNDEgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGlzLgoKVmVyc2lvbiA3LjkuNgoKRGFuaWVsICgxNCBBcHJpbCAyMDAyKQotIERpcmsgTWFuc2tlIGJyb3VnaHQgYSBmaXggdGhhdCBtYWtlcyBsaWJjdXJsIHN0cmlwIG9mZiB3aGl0ZSBzcGFjZXMgZnJvbSB0aGUKICBiZWdpbm5pbmcgb2YgY29va2llIGNvbnRlbnRzLgoKLSBIYWQgdG8gcGF0Y2ggaW5jbHVkZS9jdXJsL2N1cmwuaCBzaW5jZSBNU1ZDIGRvZXNuJ3Qgc2V0IHRoZSBfX1NURENfXyBkZWZpbmUuCiAgTW9vbmVzYW15IHBvaW50ZWQgb3V0IHRoZSBwcm9ibGVtLCBCam9ybiBSZWVzZSB0aGUgc29sdXRpb24uCgpWZXJzaW9uIDcuOS42LXByZTUKCkRhbmllbCAoMTIgQXByaWwgMjAwMikKLSBGaXhlZCB0aGUgVElNRVJfQ09OTkVDVCB0byBiZSBtb3JlIGFjY3VyYXRlIGZvciBGVFAgdHJhbnNmZXJzLiBQcmV2aW91c2x5CiAgRlRQIHRyYW5zZmVycyBnb3QgdGhlICJjb25uZWN0IGRvbmUiIHRpbWUgc2V0IGFmdGVyIHRoZSBpbml0aWFsIEZUUCBjb21tYW5kcwogIGFuZCBub3QgZGlyZWN0bHkgYWZ0ZXIgdGhlIFRDUC9JUCBjb25uZWN0IGFzIGl0IHNob3VsZC4KCiAgSSBhbHNvIG1hZGUgdGhlIHRpbWUgc3RhbXAgZ2V0IHNldCBldmVuIGlmIHRoZSBjb25uZWN0IGl0c2VsZiBmYWlscywgd2hpY2gKICBpdCBkaWRuJ3QgZG8gcHJldmlvdXNseS4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBwcm92aWRlZCBoaXMgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzCiAgQ1VSTE9QVF9ERUJVR0ZVTkNUSU9OIGFuZCBDVVJMT1BUX0RFQlVHREFUQS4gVGhleSBhbGxvdyBhIHByb2dyYW0gdG8gYSBzZXQgYQogIGNhbGxiYWNrIHRvIHJlY2VpdmUgZGVidWcvaW5mb3JtYXRpb24gZGF0YS4gVGhhdCBpbmNsdWRlcyBoZWFkZXJzIGFuZCBkYXRhCiAgdGhhdCBpcyByZWNlaXZlZCBhbmQgc2VudC4gQ1VSTE9QVF9WRVJCT1NFIHN0aWxsIGNvbnRyb2xzIGl0LgoKICBCeSBkZWZhdWx0LCB0aGVyZSBpcyBhbiBpbnRlcm5hbCBkZWJ1Z2Z1bmN0aW9uIHRoYXQgd2lsbCBtYWtlIHRoaW5ncyBsb29rCiAgYW5kIHdvcmsgYXMgYmVmb3JlIGlmIG5vdCBjaGFuZ2VkLgoKRGFuaWVsICgxMCBBcHJpbCAyMDAyKQotIFNlYmFzdGllbiBXaWxsZW1pam5zIGZvdW5kIG91dCB0aGF0IC14IGRpZG4ndCB1c2UgdGhlIGRlZmF1bHQgcG9ydCBudW1iZXIgYXMKICBpcyBkb2N1bWVudGVkLiBJdCBkb2VzIG5vdy4KCi0gbGliY3VybC1lcnJvcnMuMyBpcyBhIG5ldyBtYW4gcGFnZSBhdHRlbXB0aW5nIHRvIGRvY3VtZW50IGFsbCBsaWJjdXJsIGVycm9yCiAgY29kZXMKCi0gQWRkZWQgdHdvIG5ldyBlcnJvciBjb2RlcyBhbmQgY2hhbmdlZCB0aGUgYmVoYXZpb3VyIG9mIHR3byBvbGQgb25lcwogIHNsaWdodGx5OgoKICBDVVJMRV9XUklURV9FUlJPUgogICBUaGlzIGVycm9yIHdhcyByZXR1cm5lZCAqYm90aCogZm9yIGVycm9ycyB0aGF0IG9jY3VyZWQgd2hlbiB3cml0aW5nCiAgIHJlY2VpdmVkIGRhdGEgdG8gYSBsb2NhbCBmaWxlLCBhcyB3ZWxsIGFzIHdoZW4gd2UgZ2V0IHByb2JsZW1zIHdyaXRpbmcgZGF0YQogICB0byBhIHJlbW90ZSBzZXJ2ZXIuIENVUkxFX1NFTkRfRVJST1IgaGFzIG5vdyBiZWVuIGFkZGVkIGZvciB0aGUgbGF0dGVyCiAgIGVycm9yLgoKICBDVVJMRV9SRUFEX0VSUk9SCiAgIFRoaXMgZXJyb3Igd2FzIHNpbWlsYXJseSByZXR1cm5lZCAqYm90aCogZm9yIGVycm9ycyB3aGVuIHJlYWRpbmcgYSBsb2NhbAogICBmaWxlLCBhcyB3ZWxsIGFzIHdoZW4gZ2V0dGluZyBwcm9ibGVtcyB3aGVuIHJlYWRpbmcgbmV0d29yayBkYXRhLgogICBDVVJMRV9SRUNWX0VSUk9SIGhhcyBub3cgYmVlbiBhZGRlZCBmb3IgdGhlIGxhdHRlciBlcnJvci4KCiAoVHdvIHRlc3QgY2FzZXMgd2VyZSBhZGp1c3RlZCBhY2NvcmRpbmdseS4pCgpEYW5pZWwgKDkgQXByaWwgMjAwMikKLSBydW50ZXN0cy5wbCBub3cgc2V0cyB0aGUgSE9NRSB2YXJpYWJsZSBiZWZvcmUgcnVubmluZyBjdXJsLCB0byBwcmV2ZW50IGFueQogIGFjdHVhbCB+Ly5jdXJscmMgZmlsZSB0byBmb29sIHRoZSB0ZXN0cyEKClZlcnNpb24gNy45LjYtcHJlNAoKRGFuaWVsICg4IEFwcmlsIDIwMDIpCi0gTWljaGFlbCBDdXJ0aXMgcHJvdmlkZWQgbmV3IGZ1bmN0aW9uYWxpdHkgZm9yIGN1cmwgb24gc29tZSBwbGF0Zm9ybXMuIFVzaW5nCiAgdGhlIC0tZW52aXJvbm1lbnQgb3B0aW9uLCBjdXJsIHdpbGwgKnNldCogYSBidW5jaCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMKICB0byB2YWx1ZXMuIFRoZSBuYW1lcyBhcmUgdGhlIHNhbWUgb25lcyBhcyBmb3IgdGhlIC13Ly0td3JpdGVvdXQgb3B0aW9uLgoKICBGb3Igbm93LCB0aGlzIG9ubHkgd29ya3Mgb24gdGhlIFJJU0MgT1MgdmVyc2lvbiwgYXMgdGhpcyBmZWF0dXJlIHJlbGllcyBvbgogIGJvdGggT1Mgc3VwcG9ydCBhbmQgdGhhdCBpdCBtYXRjaGVzIE9TIHBhcmFkaWdtcy4KCi0gSmFja3kgTGFtIHByb3ZpZGVkIGEgZml4IGZvciBnZXR0aW5nIGhlYWRlcnMtb25seSB3aGVuIHRoZSByZXBseSBpcyBIVFRQLzEuMAogIGFuZCAzMDQsIEkgZWRpdGVkIGl0IHNsaWdodGx5LgoKRGFuaWVsICg1IEFwcmlsIDIwMDIpCi0gQXMgcmVxdWVzdGVkIGJ5IEpheSBHcmF2ZXMsIHRoZSAnLmN1cmxyYycgZmlsZSAob3IgX2N1cmxyYyBhcyBpdCBpcyBjYWxsZWQKICB3aGVuIHVzZWQgaW4gd2luZG93cyksIGlzIG5vdyBsb2FkZWQgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgdGhlIEhPTUUKICBlbnZpcm9ubWVudCB2YXJpYWJsZSBpc24ndCBzZXQgKG9yIGlmIGl0IGlzIHRvbyBsb25nKS4gSSBhbHNvIGVubGFyZ2VkIHRoZQogIGFycmF5IHVzZWQgdG8gc3RvcmUgdGhlIGZ1bGwgZmlsZSBwYXRoIGluLCB0byA1MTIgYnl0ZXMuCgotIEtldmluIFJvdGggcG9pbnRlZCBvdXQgdG8gbWUgd2h5IHRoZSAiMTkgTWFyY2giIGNoYW5nZSByZWdhcmRpbmcgLUcgYW5kIC1JCiAgd2FzIHN0dXBpZCBhbmQgdGhlIGNoYW5nZSB3YXMgcmV2ZXJ0ZWQuIEFkZGVkIHRlc3QgY2FzZSA0OCB0byB2ZXJpZnkgdGhlCiAgZnVuY3Rpb25hbGl0eS4KClZlcnNpb24gNy45LjYtcHJlMwoKRGFuaWVsICg0IEFwcmlsIDIwMDIpCi0gSm9uYXRhbiBMYW5kZXIgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZXMgY3VybC9jdXJsLmggY29tcGlsZSBuaWNlbHkgb24KICBwcmUtSVNPIGNvbXBpbGVycywgbGlrZSB3aGVuIHVzaW5nIGdjYyAtdHJhZGl0aW9uYWwuCgpEYW5pZWwgKDMgQXByaWwgMjAwMikKLSBKYWNreSBMYW0gaWRlbnRpZmllZCBhIGdsaXRjaCB3aGVuIGdldHRpbmcgaGVhZGVycy1vbmx5LCB3aGVyZSBsaWJjdXJsIHdvdWxkCiAgImhhbmciIDEgc2Vjb25kIGluIHZhaW4gaW4gdGhlIHNlbGVjdCgpIGxvb3AgYmVmb3JlIHJldHVybmluZyBiYWNrLgoKLSBUb3IgQXJudHNlbiBicm91Z2h0IGEgcGF0Y2ggZm9yIG11bHRpcGFydCBmb3JtcG9zdHMuIEl0IHR1cm5lZCBvdXQgdGhhdCB0aGUKICAiQ0dJX0xpdGUgUGVybCBwYWNrYWdlIiBtYWtlcyBzb21lIGJhZCBhc3N1bXB0aW9ucyBvbiB3aGF0IGxldHRlcnMgdGhhdCBtYXkKICBiZSB1c2VkIGluIGJvdW5kYXJ5IHN0cmluZ3MgYW5kIHRodXMgY3VybCBjb3VsZCBjb25mdXNlIGl0IGJ5IGluY2x1ZGluZyAnKycKICBhbmQgJy8nLiBXaGlsZSB0aGlzIGlzIHN0YW5kYXJkcy1jb21wbGlhbnQsIHdlIGNoYW5nZSB0aGUgYmVoYXZpb3IgdG8gd29yawogIHNtb290aGx5IHdpdGggZXhpc3Rpbmcgc29mdHdhcmUgYmFzZWQgb24gdGhhdCBwYWNrYWdlLgoKRGFuaWVsICgyIEFwcmlsIDIwMDIpCi0gR2VyaGFyZCBIZXJyZSBmaWxlZCBidWcgcmVwb3J0ICM1MzYyMzggd2hlcmUgaGUgcG9pbnRlZCBvdXQgYSBjcmFzaCBpbgogIHZlcmJvc2UgRlRQIHBhc3NpdmUgdHJhbnNmZXJzIGZvciBBSVguCgotIENsYXJlbmNlIEdhcmRuZXIgcG9pbnRlZCBvdXQgYSBtaW5vciBmbGF3IGluIGhvdyBsaWJjdXJsIGRpZG4ndCBwcm9wZXJseQogIHRha2UgY2FyZSBvZiBhbGwgZXJyb3JzIHRoYXQgU1NMX3JlYWQoKSBjb3VsZCByZXR1cm4uCgotIEphY2t5IExhbSBmaXhlZCBhIE1BTExPQ0RFQlVHIHByb2JsZW0gaW4gbGliL2dldGluZm8uYwoKRGFuaWVsICgyNyBNYXJjaCAyMDAyKQotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSBjb25uZWN0aW9uIHJlLXVzZSBmdW5jdGlvbiB0aGF0IGRpZG4ndAogIGNoZWNrIHByb3h5IGNvbm5lY3Rpb25zIHByb3Blcmx5IGZvciAiZGVhZG5lc3MiIGJlZm9yZSB0aGV5IHdlcmUgcmUtdXNlZC4KCi0gUGVkcm8gTmV2ZXMgZm91bmQgb3V0IHRoYXQgSFRUUCBQT1NUaW5nIHdpdGggLS1kYXRhLWJpbmFyeSBkaWQgbm90IHByb3Blcmx5CiAgd29yayB1bmRlciBXaW5kb3dzIGFzIHRoZSBmaWxlIHNwZWNpZmllZCB3YXNuJ3QgcmVhZCBmdWxseSBiaW5hcnkhCgpEYW5pZWwgKDI1IE1hcmNoIDIwMDIpCi0gSmFja3kgTGFtIGJyb3VnaHQgYSBmaXggdGhhdCBpbXByb3ZlcyB0cmVhdG1lbnQgb2YgY29va2llcyB1c2luZyBpZGVudGljYWwKICBkb21haW5zIGJ1dCB3aXRoIGxlYWRpbmcgZG90cyBwcm9wZXJseS4KCkRhbmllbCAoMjIgTWFyY2ggMjAwMikKLSBNaWtsb3MgTmVtZXRoIHVwZGF0ZWQgdGhlIHdpbmRvd3Mgc2VjdGlvbiBvZiB0aGUgZG9jcy9JTlNUQUxMIGZpbGUgYW5kIHRoZQogIHdpbmRvd3MgbWFrZWZpbGVzLgoKLSBKb24gRGlsbG9uIHByb3ZpZGVkIHVzIHdpdGggc2V2ZXJhbCBnb29kLWxvb2tpbmcgY3VybCBpbWFnZXMgZm9yCiAgcHJvbW90aW9uLiBWaWV3IHRoZW0gaGVyZSBodHRwOi8vY3VybC5oYXh4LnNlL2ljb25zLmh0bWwKCkRhbmllbCAoMjAgTWFyY2ggMjAwMikKLSBQZXRlciBWZXJoYXMgZm91bmQgb3V0IHRoYXQgQ1JMRiByZXBsYWNlbWVudCBpbiB1cGxvYWRzIHdhcyBub3Qgd29ya2luZy4gSQogIGZpeGVkIGl0LCBhbmQgYWRkZWQgdGVzdCBjYXNlIDEyOCB0aGF0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBUaGUgbGlzdCBmb3JtZXJseSBrbm93biBhcyBjdXJsLW1haW4gaXMgbm93IG5hbWVkIGN1cmwtdXNlcnMgYW5kIGlzIGhvc3RlZAogIGJ5IHNvdXJjZWZvcmdlLiBTdXNiY3JpYmUgdG8gdGhlIG5ldyBsaXN0LCBnZXQgb2ZmIHRoZSBvbGQgb25lLgoKVmVyc2lvbiA3LjkuNi1wcmUyCgpEYW5pZWwgKDE5IE1hcmNoIDIwMDIpCi0gTWFkZSAtRyBhbmQgLUkgb24gdGhlIHNhbWUgY29tbWFuZCBsaW5lIGNhdXNlIGFuIGVycm9yLgoKLSBNb3ZlZCB0aGUgbXVsdGkuaCBmaWxlIHRvIHRoZSAicHVibGljIiBpbmNsdWRlIGRpcmVjdG9yeSBhbmQgbWFkZSBpdCBnZXQKICBpbmNsdWRlZCBieSBjdXJsLmggc28gdGhhdCBubyBleHRyYSBpbmNsdWRlIGZpbGVzIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHVzZQogIGl0LgoKICBBZGRlZCBkb2NzIGFuZCBtYW4gcGFnZXMgZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KICBBZGRlZCB0aGUgdGhyZWUgZXhhbXBsZSBzb3VyY2UgY29kZXMgdG9vLgoKICBOZWNlc3Nhcnkgc3RlcHMgaW4gbXkgY2FtcGFpZ24gdG8gc25lYWsgaW4gdGhlIG11bHRpIGludGVyZmFjZS4uLiA7LSkKCi0gVXBkYXRlZCB0aGUgeWVhciBpbiBhbGwgY29weXJpZ2h0IG5vdGljZXMgaW4gYWxsIEMgYW5kIEggZmlsZXMuCgpEYW5pZWwgKDE4IE1hcmNoIDIwMDIpCi0gVG9tYXMgU3plcGUgZm91bmQgb3V0IHRoYXQgLWQgYW5kIC1HIGRpZG4ndCBtaXggYXMgdGhleSBzaG91bGQuIEkgYnJva2UgdGhpcwogIGluIDcuOS41Li4uIEFkZGVkIHRlc3QgY2FzZSAzMiBmb3IgdGhpcy4KClZlcnNpb24gNy45LjYtcHJlMQoKRGFuaWVsICgxNiBNYXJjaCAyMDAyKQotIFBldGVyIFZlcmhhcyBwb2ludGVkIG91dCB0aGF0IHRoZSBjdXJsX2VzY2FwZSBhbmQgY3VybF91bnNjYXBlIG1hbiBwYWdlcwogIGNvbnRhaW5lZCBmYWN0dWFsIGVycm9ycy4KCi0gQWxiZXJ0IENob3kgZm91bmQgYW5kIGNvcnJlY3RlZCBhIHByb2JsZW0gd2l0aCB0aGUgdmVyYm9zZSBvdXRwdXQgd2hlbiBkb2luZwogIFBBU1YgZnRwIHRyYW5zZmVycy4gSXQgY291bGQgbWFrZSBsaWJjdXJsIGNyYXNoLgoKICBEZXRhaWxzIGluIGJ1ZyByZXBvcnQgIzUzMDU2MjoKICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvP2Z1bmM9ZGV0YWlsJmF0aWQ9MTAwOTc2JmFpZD01MzA1NjImZ3JvdXBfaWQ9OTc2CgpEYW5pZWwgKDE1IE1hcmNoIDIwMDIpCi0gSnVuLWljaGlybyBpdG9qdW4gSGFnaW5vIGZpbGVkIGJ1ZyByZXBvcnQgIzUzMDIwNCB0aGF0IGNsZWFybHkgcG9pbnRlZCBvdXQKICB0aGUgUEZfSU5FVCBmaXggZnJvbSBGZWJydWFyeSAxOSBhcyBhIG5vdC12ZXJ5LWdvb2QgZml4IGFzIGl0IGJyb2tlIElQdjYKICBjYXBhYmlsaXR5ISBUaGF0IHBhdGNoIGlzIG5vdyByZXZlcnRlZC4KCiAgVGhlIHByb2JsZW0gd2l0aCBzbG93IG5hbWUgbG9va3VwcyB3aXRoIGdldGFkZHJpbmZvKCkgb24gbm9uLUlQdjYgZW5hYmxlZAogIGhvc3RzIGFyZSBpbnN0ZWFkIG1hZGUgYnkgZmlyc3QgY2hlY2tpbmcgaWYgdGhlIHN0YWNrIGlzIElQdjYtZW5hYmxlZCBhbmQgaWYKICBub3QsIHRoZSBQRl9JTkVUIGlzIHVzZWQgYW5kIG90aGVyd2lzZSB3ZSBnbyB3aXRoIHRoZSBmdWxsIFBGX1VOU1BFQy4KCi0gVC4gQmhhcmF0aCBwb2ludGVkIG91dCB0aGF0IHdoZW4gd2UgcmV0dXJuIGFuICJlcnJvciIgZnJvbSBhIFdSSVRFRlVOQ1RJT04KICBhcyBkZXNjcmliZWQgaW4gdGhlIG1hbiBwYWdlLCBsaWJjdXJsIGRpZCBub3QgcmV0dXJuIHRoZSBkb2N1bWVudGVkIGVycm9yCiAgY29kZSAoQ1VSTEVfV1JJVEVfRVJST1IpIGJ1dCB3b3VsZCBpbnN0ZWFkIHJldHVybiBDVVJMRV9SRUFEX0VSUk9SLiBUaGlzIGlzCiAgbm93IGNvcnJlY3RlZC4KCkRhbmllbCAoMTQgTWFyY2ggMjAwMikKLSBTZXR0aW5nIENVUkxPUFRfUE9TVCB3aXRob3V0IHNldHRpbmcgQ1VSTE9QVF9QT1NURklFTERTIG5vdyByZWFkIHRoZSBQT1NULQogIGRhdGEgZnJvbSB0aGUgY2FsbGJhY2suCgotIFRoZSBHT1BIRVIgc3VwcG9ydCBzZWVtcyB0byBiZSBicm9rZW4uIEkgZG9uJ3QgdGhpbmsgSSdsbCBldmVuIHN0YXJ0IGZpeGluZwogIGl0IHVudGlsIHNvbWVvbmUgZWxzZSBmaW5kcyBvdXQuLi4gOi0pCgpEYW5pZWwgKDEzIE1hcmNoIDIwMDIpCi0gVHJ5aW5nICdjdXJsIC1JIGZ0cC5zdW5ldC5zZScgb3Igc2ltaWxhciBkaWQgYSBTSVpFIG9uIGEgc2lsbHkgIihuaWwpIgogIHN0cmluZy4gSWYgc3VjaCBhIGZpbGUgd291bGQgYmUgcHJlc2VudCwgY3VybCByZXR1cm5lZCB0aGUgc2l6ZSBvZiBpdCEgTm93CiAgd2UgcHJldmVudCB0aGlzLgoKLSBDdXJsX3NlbmRmKCkgd2FzIGZpeGVkIHRvIGRlYWwgd2l0aCBzaXR1YXRpb24gd2hlcmUgQ3VybF93cml0ZSgpIHdvdWxkJ3ZlCiAgYmxvY2tlZCBhbmQgdGh1cyByZXR1cm4gLTEuCgotIFNldHRpbmcgQ1VSTE9QVF9QUk9HUkVTU0ZVTkNUSU9OIHRvIE5VTEwgbm93IHJlc3RvcmVzIHRoZSBpbnRlcm5hbCBmdW5jdGlvbi4KCi0gQWxsIENVUkxGT1JNXyogb3B0aW9ucyBjYW4gbm93IGJlIHVzZWQgaW4gYSBDVVJMRk9STV9BUlJBWSBleGNlcHQgdGhlCiAgQ1VSTEZPUk1fQVJSQVkgaXRzZWxmLiBUaGlzIHdhcyBuZWNlc3Nhcnkgc2luY2Ugd2UgY291bGRuJ3QgZXhwYW5kIHRoZQogIENVUkxGT1JNXyogbGlzdCBwcm9wcmVseSBhbmQgdW5yZXN0cmljdGVkIHVudGlsIHRoaXMgd2FzIHRoZSBjYXNlLiBJdCB3YXMKICBhbHNvIGEgYml0IHBlY3VsaWFyIHRvIHVzZXJzIHdoeSBzb21lIG9wdGlvbnMgY291bGQgYmUgdXNlZCBpbiBhbiBhcnJheQogIHdoaWxlIG90aGVycyBjb3VsZG4ndC4KCi0gUmVtb3ZlZCBzb21lIHNpbGx5IENSTEYgbGluZXMgdGhhdCBoYWQgYWNjaWRlbnRhbGx5IHNsaXBwZWQgaW50byBzcmMvbWFpbi5jCiAgTmljbyBCYWdndXMgcG9pbnRlZCB0aGVtIG91dCB0byBtZS4KCkRhbmllbCAoMTEgTWFyY2ggMjAwMikKLSBDVVJMRk9STV9GSUxFTkFNRSB3YXMgYWRkZWQuIFRoaXMgY2FuIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgZmlsZSB1cGxvYWQKICBwYXJ0LCB0byBzZXQgdGhlICdmaWxlbmFtZScgZmllbGQgdG8gYSBjdXN0b20gdmFsdWUuIElmIHRoaXMgaXNuJ3QgdXNlZCwKICB0aGUgYWN0dWFsbHkgdXNlZCBmaWxlbmFtZSB3aWxsIGJlIGluY2x1ZGVkIGluc3RlYWQgKGFzIGxpYmN1cmwgYWx3YXlzIGhhcwogIGRvbmUpLiBjdXJsIHdhcyBhZGp1c3RlZCBhY2NvcmRpbmdseSwgYW5kIG5vdyAtRiBhY2NlcHRzIGEgJ2ZpbGVuYW1lPScgZmllbGQKICB0b28sIGFuZCBhbGxvd3MgY29uc3RydWN0cyBzdWNoIGFzOgoKICAgIC1GICduYW1lPUBmaWxlbmFtZTtmaWxlbmFtZT0vZGV2L251bGwnCgogIGFuZCB0aGlzIGNhbiBiZSBjb21iaW5lZCB3aXRoIHR5cGU9IHRvbywgaW4gYSBtYW5uZXIgc2ltaWxhciB0bzoKCiAgIC1GICJmaWxlPUBsb2cvdGVzdDM5LnR4dDtmaWxlbmFtZT1mYWtlcmZpbGU7dHlwZT1tb28vZm9vYmFyIgoKICBUZXN0IGNhc2UgMzkgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGlzIGZ1bmN0aW9uYWxpdHkuCgotIFRoZSBzdHJ1Y3QgZm9ybWVybHkga25vd24gYXMgSHR0cFBvc3QgaXMgbm93IG5hbWVkIGN1cmxfaHR0cHBvc3QgdG8gcHJvcGVybHkKICB1c2UgdGhlIGN1cmwgbmFtZSBzcGFjZS4gSSBhZGRlZCBhICNkZWZpbmUgZm9yIHRoZSBvbGQgbmFtZSB0byBtYWtlIGV4aXN0aW5nCiAgcHJvZ3JhbXMgY29tcGlsZSBldmVuIHdoZW4gdGhpcyBuZXcgaW5jbHVkZSBmaWxlIGlzIHVzZWQuCgpEYW5pZWwgKDggTWFyY2ggMjAwMikKLSBDbGlmZm9yZCBhbHNvIGRpc2NvdmVyZWQgdGhhdCBpZiB0aGUgY2xpZW50IGNvZGUgZmFpbGVkIGVhcmx5LCBhcyB3aGVuIGRvaW5nCiAgImN1cmwgLU8iIG9ubHksIGl0IHdvdWxkIGRvIGZjbG9zZShOVUxMKSB3aGljaCBjYXVzZWQgYSBzZWdtZW50YXRpb24gZmF1bHQKICBvbiBzb21lIHN5c3RlbXMuCgotIENsaWZmb3JkIFdvbGYgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1hZGUgLS1wcm9ncmVzcy1iYXIgd29yayBhZ2Fpbi4KCi0gSSBjbG9zZWQgYnVnIHJlcG9ydCAjNTI3MDMyIGJ5IG1ha2luZyBzdXJlIHRoYXQgd2UgYWRkIGEgbmV3bGluZSBhZnRlciBhCiAgdHJhbnNmZXIgd2hlbiAtLXByb2dyZXNzLWJhciBoYXMgYmVlbiB1c2VkLiBCZWZvcmUsIHdpdGhvdXQgdGhlIG5ld2xpbmUsIGl0CiAgbWFkZSB0aGUgc3Vic2VxdWVudCB0ZXh0IGNvbWUgb3V0IHdyb25nLgoKVmVyc2lvbiA3LjkuNQoKRGFuaWVsICg3IE1hcmNoIDIwMDIpCi0gQWRkZWQgZG9jcy9LTk9XTl9CVUdTIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDYgTWFyY2ggMjAwMikKLSBLZXZpbiBSb3RoIGNvcnJlY3RlZCBhIGZsYXcgaW4gdGhlIGN1cmwgY2xpZW50IGdsb2JiaW5nIGNvZGUgdGhhdCBtYWRlIGl0CiAgbWVzcyB1cCBiYWNrc2xhc2hlcy4gVGhpcyB3YXMgbW9zdCBub3RhYmxlIG9uIHdpbmRvd3MgKGN5Z3dpbikgbWFjaGluZXMgd2hlbgogIHVzaW5nIGZpbGU6Ly8uCgotIEJyYWQgcHJvdmlkZWQgYW5vdGhlciBmaXggZm9yIGJ1aWxkaW5nIG91dHNpZGUgdGhlIHNvdXJjZS10cmVlLgoKLSBSYWxwaCBNaXRjaGVsbCBwYXRjaGVkIGF3YXkgYSBmZXcgY29tcGlsZXIgd2FybmluZ3MgaW4gdGVzdHMvc2VydmVyL3N3cy5jCgpEYW5pZWwgKDUgTWFyY2ggMjAwMikKLSBJIG5vdGljZWQgdGhhdCB0aGUgdHlwZWRlZiBpbiBjdXJsLmggZm9yIHRoZSBwcm9ncmVzcyBjYWxsYmFjayBwcm90b3R5cGUgd2FzCiAgd3JvbmcgYW5kIHRodXMgYXBwbGljYXRpb25zIHRoYXQgdXNlZCBpdCB3b3VsZCBub3QgZ2V0IHRoZSBwcm9wZXIgaW5wdXQKICBkYXRhLiBJdCB1c2VkIHNpemVfdCB3aGVyZSB0aGUgaW1wbGVtZW50YXRpb24gYWN0dWFsbHkgdXNlcyBkb3VibGVzIQoKICBJIHdpc2ggSSBjb3VsZCBibGFtZSBzb21lb25lIGVsc2UsIGJ1dCB0aGlzIHdhcyBteSBmYXVsdC4gQWdhaW4uCgpWZXJzaW9uIDcuOS41LXByZTYKCkRhbmllbCAoNCBNYXJjaCAyMDAyKQotIEN1dCBvZmYgdGhlIGNoYW5nZXMgZG9uZSBkdXJpbmcgMjAwMSBmcm9tIHRoaXMgY2hhbmdlbG9nIGZpbGUgYW5kIHB1dCB0aGVtCiAgaW4gYSBzZXBhcmF0ZSBmaWxlIChDSEFOR0VTLjIwMDEpLCBhdmFpbGFibGUgZnJvbSBDVlMgb2YgY291cnNlLgoKLSBJIHJlbW92ZWQgdGhlIG11bHRpIGRpcmVjdG9yeS4gVGhlIGV4YW1wbGUgc291cmNlcyB3ZXJlIG1vdmVkIHRvIHRoZQogIGRvY3MvZXhhbXBsZXMgZGlyZWN0b3J5IHdoZXJlIHRoZXkgYmVsb25nLgoKLSBXcm90ZSA3IG5ldyBtYW4gcGFnZXMgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9ucyBpbiB0aGUgbmV3IG11bHRpIGludGVyZmFjZS4KICBUaGV5J3JlIGFsbCBzdGlsbCBwcmV0dHkgYmFzaWMsIGJ1dCB3ZSBjYW4gdXNlIHRoZW0gYXMgYSBzdGFydCBhbmQgYWRkIG1vcmUKICBjb250ZW50cyB0byB0aGVtIHdoZW4gd2UgZmlndXJlIG91dCB3aGF0IHRvIHdyaXRlLiBUaGUgbGFyZ2UgYW1vdW50IG9mIG1hbgogIHBhZ2VzIGZvciBsaWJjdXJsIG5vdyBwcmVzZW50IG1hZGUgbWUgZGVjaWRlIHRvIHB1dCB0aGVtIGluIGEgbmV3IHNlcGFyYXRlCiAgc3ViZGlyZWN0b3J5IGluIHRoZSBkb2NzIGRpcmVjdG9yeS4gTmFtZWQgbGliY3VybC4KCi0gR2l1c2VwcGUgQ29yYmVsbGkgcHJvdmlkZWQgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgRVBNIHBhY2thZ2UgbWFuYWdlciwgaXQKICBnZXRzIGdlbmVyYXRlZCBuaWNlbHkgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93LgoKVmVyc2lvbiA3LjkuNS1wcmU1CgpEYW5pZWwgKDEgTWFyY2ggMjAwMikKLSBNb3ZlZCB0aGUgbWVtYW5hbHl6ZS5wbCBzY3JpcHQgaW50byB0aGUgdGVzdHMvIGRpciBhbmQgYWRkZWQgaXQgdG8gdGhlCiAgcmVsZWFzZSBhcmNoaXZlcy4gSXQgd2FzIHByZXZpb3VzbHkgb25seSBwcmVzZW50IGluIHRoZSBDVlMgdHJlZS4KCi0gTW9kaWZpZWQgdGhlIEZlYnJ1YXJ5IDE3dGggSG9zdDogZml4LCBhcyBidWcgcmVwb3J0ICM1MjM3MTggcG9pbnRlZCBvdXQgdGhhdAogIGl0IGNhdXNlZCBjcmFzaGVzIQoKLSBOaWNvIEJhZ2d1cyBhZGRlZCBtb3JlIGVycm9yIGNvZGVzIHRvIHRoZSBWTVMgc3R1ZmYuCgotIFdlc2xleSBMYXh0b24gYnJvdWdodCB0aGUgY29kZSB0aGF0IGludHJvZHVjZWQgdGhlIG5ldyBDVVJMT1BUX1BSRVFVT1RFCiAgb3B0aW9uLiBJdCBpcyBqdXN0IGFub3RoZXIgRlRQIHF1b3RlIG9wdGlvbiB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5CiAgYSBsaXN0IG9mIEZUUCBjb21tYW5kcyB0byBpc3N1ZSAqanVzdCBiZWZvcmUqIHRoZSB0cmFuc2ZlciBjb21tYW5kIChSRVRSIG9yCiAgU1RPUiBldGMpLiBJdCBoYXMgdHVybmVkIHVwIGEgZmV3IHN5c3RlbXMgdGhhdCByZWFsbHkgbmVlZCB0aGlzLgoKICBUaGUgY3VybCBjb21tYW5kIGxpbmUgdG9vbCBjYW4gYWxzbyB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGJ5IHByZWZpeGluZyB0aGUKICBxdW90ZSBjb21tYW5kcyB3aXRoIGEgcGx1cyAoKykgaW4gc2ltaWxhciBzdHlsZSB0aGF0IHBvc3QgdHJhbnNmZXIgcXVvdGUKICBjb21tYW5kcyBhcmUgc3BlY2lmaWVkLgoKICBUaGlzIGlzIG5vdCB5ZXQgZG9jdW1lbnRlZC4gVGhlcmUgaXMgbm8gdGVzdCBjYXNlIGZvciB0aGlzIHlldC4KCkRhbmllbCAoMjggRmVicnVhcnkgMjAwMikKLSBSYWxwaCBNaXRjaGVsbCBtYWRlIHNvbWUgc2VyaW91cyBlZmZvcnRzIGFuZCBwdXQgYSBsb3Qgb2Ygc3dlYXQgaW4gc2V0dGluZwogIHVwIHNjcmlwdHMgYW5kIHRoaW5ncyBmb3IgbWUgdG8gYmUgYWJsZSB0byByZXBlYXQgaGlzIHByb2JsZW1zLCBhbmQgSQogIGZpbmFsbHkgY291bGQuICBJIGZvdW5kIGEgcHJvYmxlbSB3aXRoIHRoZSBoZWFkZXIgYnl0ZSBjb3VudGVyIHRoYXQgd2Fzbid0CiAgaW5jcmVhc2VkIHByb3Blcmx5IGFuZCB0aHVzIHdlIGNvdWxkIHJldHVybiBDVVJMRV9HT1RfTk9USElORyB3aGVuIHdlIGluCiAgZmFjdCBoYWQgcmVjZWl2ZWQgZGF0YS4KCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwMikKLSBJIGhhZCB0byByZXZlcnQgdGhlIG5vbi1zcGFjZSBwYXJzaW5nIGNvb2tpZSBmaXggSSBwb3N0ZWQgdG8gdGhlIG1haWxpbmcKICBsaXN0LiBFeHBpcmUgZGF0ZXMgZG8gaGF2ZSBzcGFjZXMgYW5kIHN0aWxsIG5lZWQgdG8gZ2V0IHBhcnNlZCBwcm9wZXJseSEKICBJbnN0ZWFkIHdlIGp1c3QgaWdub3JlIHRyYWlsaW5nIHdoaXRlIHNwYWNlIGFuZCBpdCBzZWVtcyB0byB3b3JrLi4uCgpEYW5pZWwgKDI2IEZlYnJ1YXJ5IDIwMDIpCi0gTWFkZSB0aGUgY29va2llIHByb3BlcnR5ICdNYXgtQWdlJyB3b3JrLCBqdXN0IHNpbmNlIHdlIGFscmVhZHkgdHJpZWQgdG8KICBzdXBwb3J0IGl0LCBpdCBpcyBiZXR0ZXIgdG8gZG8gaXQgcmlnaHQuIE5vIG9uZSB1c2VzIHRoaXMgYW55d2F5LgoKLSBUaGUgY29va2llIHBhcnNlciBjb3VsZCBjcmFzaCBpZiBhIHJlYWxseSB3ZWlyZCAoaWxsZWdhbCkgY29va2llIGxpbmUgd2FzCiAgcmVjZWl2ZWQuIEkgYWxzbyBtYWRlIGl0IGJldHRlciBkaXNjYXJkIHJlYWxseSBvZGRseSBmb3JtYXR0ZWQgbGluZXMgYmV0dGVyLgoKICBNYWRlIHRoZSBjb29raWUgamFyIHN0b3JlIHRoZSBzZWNvbmQgZmllbGQgZnJvbSB0aGUgbGVmdCB1c2luZyB0aGUgc3ludGF4CiAgdGhhdCBOZXRzY2FwZSBhbmQgTW96aWxsYSBwcm9iYWJseSBsaWtlLiBDdXJsIGl0c2VsZiBpZ25vcmVzIGl0LgoKICBBZGRlZCB0ZXN0IGNhc2UgMzEgZm9yIHRoZXNlIGNhc2VzLgoKICBDbGF5IExvdmVsZXNzJyBlbWFpbCByZWdhcmRpbmcgc29tZSBjb29raWUgaXNzdWVzIHN0YXJ0ZWQgbXkgY2xlYW51cC4KCi0gS2V2aW4gUm90aCBwb2ludGVkIG91dCB0aGF0IG15IGF1dG9tYWtlIGZpZGRsZXMgYnJva2UgdGhlIGFiaWxpdHkgdG8gYnVpbGQKICBvdXRzaWRlIHRoZSBzb3VyY2UtdHJlZSBhbmQgSSBwb3N0ZWQgYSBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0IHRoYXQgYnJpbmdzCiAgdGhpcyBhYmlsaXR5IGJhY2suCgpWZXJzaW9uIDcuOS41LXByZTQKCkRhbmllbCAoMjUgRmVicnVhcnkgMjAwMikKLSBGaWRkbGVkIHdpdGggdGhlIGF1dG9tYWtlIGZpbGVzIHRvIG1ha2UgYWxsIHNvdXJjZSBmaWxlcyBpbiB0aGUgbGliCiAgZGlyZWN0b3J5IG5vdCBoYXZlIC4uL3NyYyBpbiB0aGUgaW5jbHVkZSBwYXRoLCBhbmQgdGhlIHNyYyBzb3VyY2VzIHNob3VsZG4ndAogIGhhdmUgLi4vbGliIQoKLSBBbGwgNzkgdGVzdCBjYXNlcyByYW4gT0sgdW5kZXIgTGludXggYW5kIFNvbGFyaXMgdXNpbmcgdGhlIG5ldyBIVFRQIHNlcnZlcgogIGluIHRoZSB0ZXN0IHN1aXRlLiBUaGUgbmV3IEhUVFAgc2VydmVyIHdhcyBmaXJzdCBkb25hdGVkIGJ5IEdlb3JnIEhvcm4gYW5kCiAgc3Vic2VxdWVudGx5IG1vZGlmaWVkIHRvIHdvcmsgd2l0aCB0aGUgdGVzdCBzdWl0ZS4gSXQgaXMgY3VycmVudGx5IHN0aWxsIG5vdAogIHBvcnRhYmxlIGVub3VnaCB0byBydW4gb24gImFsbCBvdmVyIiBidXQgdGhpcyBpcyBhIHN0YXJ0IGFuZCBJIGNhbiBydW4gYWxsCiAgY3VybCB0ZXN0cyBvbiBteSBtYWNoaW5lcy4gVGhpcyBpcyBhbiBpbXBvcnRhbnQgcmVxdWlyZW1lbnQgZm9yIHRoZSB1cGNvbWluZwogIHB1YmxpYyByZWxlYXNlLgoKLSBVc2luZyAtZCBhbmQgLUkgb24gdGhlIHNhbWUgY29tbWFuZCBsaW5lIG5vdyByZXBvcnRzIGFuIGVycm9yLCBhcyBpdCBpbXBsaWVzCiAgdHdvIGRpZmZlcmVudCBIVFRQIHJlcXVlc3RzIHRoYXQgY2FuJ3QgYmUgbWl4ZWQuCgotIEplZmZyZXkgUG9obG1leWVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWRlIHRoZSAtdy8tLXdyaXRlLW91dCBvcHRpb24KICBzdXBwb3J0ICV7Y29udGVudF90eXBlfSB0byBnZXQgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcmVjZW50IGRvd25sb2FkLgoKLSBLZXZpbiBSb3RoIHJlcG9ydGVkIHRoYXQgcHJlMiBhbmQgcHJlMyBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseSBvbiBjeWd3aW4sCiAgYW5kIHRoaXMgd2FzIGJlY2F1c2UgSSB1c2VkICNpZmRlZiBIQVZFX1dJTlNPQ0tfSCBpbiBsaWIvbXVsdGkuaCB0byBmaWd1cmUKICBvdXQgaWYgd2UgY291bGQgaW5jbHVkZSB3aW5zb2NrLmggd2hpY2ggdHVybnMgb3V0IG5vdCB0byBiZSBhIHdpc2UgY2hvaWNlIHRvCiAgZG8gb24gY3lnd2luIHNpbmNlIGl0IGhhcyB0aGUgZmlsZSBidXQgY2FuJ3QgaW5jbHVkZSBpdCEKCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMikKLSBBZGRlZCBzcmMvY29uZmlnLXZtcy5oIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUuCgotIEZpeGVkIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQgdmFsdWUgYWdhaW4sIHRoZSBjaGFuZ2UgZnJvbSBGZWJydWFyeSAxOCB3YXNuJ3QKICBjb21wbGV0ZS4KClZlcnNpb24gNy45LjUtcHJlMwoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDAyKQotIEtldmluIFJvdGggYW5kIEFuZHLpcyBHYXJj7WEgYm90aCBmb3VuZCBvdXQgdGhhdCBsaWIvY29uZmlnLmguaW4gd2FzIG1pc3NpbmcKICBpbiB0aGUgcHJlLXJlbGVhc2UgYXJjaGl2ZSBhbmQgdGh1cyB0aGUgY29uZmlndXJlIHNjcmlwdCBmYWlsZWQuCgpWZXJzaW9uIDcuOS41LXByZTIKCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwMikKLSBBbmRy6XMgR2FyY+1hIHByb3ZpZGVkIGEgc29sdXRpb24gdG8gYnVnIHJlcG9ydCAjNTE1MjI4LiB0aGUgdG90YWwgdGltZQogIGNvdW50ZXIgd2FzIG5vdCBzZXQgY29ycmVjdGx5IHdoZW4gLUkgd2FzIHVzZWQgZHVyaW5nIHNvbWUgY29uZGl0aW9ucyAoYWxsCiAgaGVhZGVycyB3ZXJlIHJlYWQgaW4gb25lIHNpbmdsZSByZWFkKS4KCi0gTmljbyBCYWdndXMgcHJvdmlkZWQgYSBodWdlIHBhdGNoIHdpdGggbWlub3IgdHdlYWtzIGFsbCBvdmVyIHRvIG1ha2UgY3VybAogIGNvbXBpbGUgbmljZWx5IG9uIFZNUy4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwMikKLSBSaWNrIFJpY2hhcmRzb24gZm91bmQgb3V0IHRoYXQgYnkgcmVwbGFjaW5nIFBGX1VOU1BFQyB3aXRoIFBGX0lORVQgaW4gdGhlCiAgZ2V0YWRkcmluZm8oKSBjYWxscywgaGUgY291bGQgc3BlZWQgdXAgc29tZSBuYW1lIHJlc29sdmluZyBjYWxscyB3aXRoIGFuCiAgb3JkZXIgb2YgbWFnbml0dWRlcyBvbiBoaXMgUmVkaGF0IExpbnV4IDcuMi4KCi0gUGhpbGlwIEdsYWRzdG9uZSBmb3VuZCBhIHNlY29uZCBJTkFERFJfTk9ORSBwcm9ibGVtIHdoZXJlIHdlIHVzZWQgbG9uZwogIGludGVhZCBvZiBpbl9hZGRyX3Qgd2hpY2ggY2F1c2VkIDY0Yml0IHByb2JsZW1vcy4gV2UgcmVhbGx5IHNob3VsZG4ndCBkZWZpbmUKICB0aGF0IG9uIHR3byBkaWZmZXJlbnQgcGxhY2VzLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDAyKQotIFBoaWxpcCBHbGFkc3RvbmUgZm91bmQgYSBwcm9ibGVtIGluIGhvdyBIVFRQIHJlcXVlc3RzIHdlcmUgc2VudCBpZiB0aGUKICByZXF1ZXN0IGNvdWxkbid0IGJlIHNlbnQgYWxsIGF0IG9uY2UuCgotIEVtaWwgZm91bmQgYW5kIGNvcnJlY3RlZCBhIGJhZCBjb25uZWN0aW9uIHRpbWVvdXQgY29tcGFyaXNvbiB0aGF0IG1hZGUgY3VybAogIHVzZSB0aGUgbG9uZ2VzdCBvZiBjb25uZWN0LXRpbWVvdXQgYW5kIHRpbW91dCBhcyBhIHRpbWVvdXQgdmFsdWUsIGluc3RlYWQgb2YKICB0aGUgc2hvcnRlc3QgYXMgaXQgd2FzIHN1cHBvc2VkIHRvIQoKLSBBcm9uIFJvYmVydHMgcHJvdmlkZWQgdXBkYXRlZCBpbmZvcm1hdGlvbiBhYm91dCBMREFQIFVSTCBzeW50YXggdG8gZ28gaW50bwogIHRoZSBtYW51YWwgYXMgYSByZXBsYWNlbWVudCBmb3IgdGhlIG9sZCByZWZlcmVuY2VzLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDAyKQotIFBoaWxpcCBHbGFkc3RvbmUgcG9pbnRlZCBvdXQgdHdvIG1pc3NpbmcgaW5jbHVkZSBmaWxlcyB0aGF0IG1hZGUgY3VybCBjb3JlCiAgZHVtcCBvbiA2NGJpdCBhcmNoaXRlY3R1cmVzLiBXZSBuZWVkIHRvIHBheSBtb3JlIGF0dGVudGlvbiBvbiB0aGVzZSBkZXRhaWxzLgogIEl0IGlzICpsZXRoYWwqIHRvIGZvciBleGFtcGxlIGZvcmdldCB0aGUgbWFsbG9jKCkgcHJvdG90eXBlLCBhcyAnaW50JyBpcwogIDMyYml0IGFuZCBtYWxsb2MoKSBtdXN0IHJldHVybiBhIDY0Yml0IHBvaW50ZXIgb24gdGhlc2UgcGxhdGZvcm1zLgoKLSBHaWFzbGFzIEdlb3JnaW9zIGZpeGVkIGEgcHJvYmxlbSB3aXRoIEhvc3Q6IGhlYWRlcnMgb24gcmVwZWF0ZWQgcmVxdWVzdHMgb24KICB0aGUgc2FtZSBoYW5kbGUgdXNpbmcgYSBwcm94eS4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDAyKQotIEhhbm5vIEwuIEtyYW56aG9mZiBhY2N1cmF0ZWx5IGZvdW5kIG91dCB0aGF0IGRpc2FibGluZyB0aGUgRXhwZWN0OiBoZWFkZXIKICB3aGVuIGRvaW5nIG11bHRpcGFydCBmb3JtcG9zdHMgZGlkbid0IHdvcmsgdmVyeSB3ZWxsLiBJdCBkaXNhYmxlZCBvdGhlcgogIHBhcnRzIG9mIHRoZSByZXF1ZXN0IGhlYWRlciB0b28sIHJlc3VsdGluZyBpbiBhIGJyb2tlbiBoZWFkZXIuIFdoZW4gSSBmaXhlZAogIHRoaXMsIEkgYWxzbyBub3RpY2VkIHRoYXQgdGhlIENvbnRlbnQtVHlwZSB3YXNuJ3QgcG9zc2libGUgdG8gZGlzYWJsZS4gSXQgaXMKICBub3csIGV2ZW4gdGhvdWdoIGl0IHByb2JhYmx5IGlzIHJlYWxseSBzdHVwaWQgdG8gdHJ5IHRvIGRvIHRoaXMgKGJlY2F1c2Ugb2YKICB0aGUgYm91bmRhcnkgc3RyaW5nIHRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlIGludGVybmFsbHkgZ2VuZXJhdGVkIGhlYWRlciwKICB1c2VkIGFzIGZvcm0gcGFydCBzZXBhcmF0b3IuKQoKRGFuaWVsICg3IEZlYnJ1YXJ5IDIwMDIpCi0gSSBtb3ZlZCB0aGUgY29uZmlnKi5oIGZpbGVzIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHRoZSBsaWIvIGRpcmVjdG9yeS4KCi0gSSd2ZSBhZGRlZCB0aGUgbmV3IHRlc3Qgc3VpdGUgSFRUUCBzZXJ2ZXIgdG8gdGhlIENWUyByZXBvc2l0b3J5LCBJdCBzZWVtcyB0bwogIHdvcmsgcHJldHR5IGdvb2Qgbm93LCBidXQgd2UgbXVzdCBtYWtlIGl0IGdldCB1c2VkIGJ5IHRoZSB0ZXN0IHNjcmlwdHMKICBwcm9wZXJseSBhbmQgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGNvbXBpbGVzLCBidWlsZHMgYW5kIHJ1bnMgb24KICBtb3N0IG9wZXJhdGluZyBzeXN0ZW1zLgoKVmVyc2lvbiA3LjkuNS1wcmUxCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwMikKLSBNaWtsb3MgTmVtZXRoIHByb3ZpZGVkIHVwZGF0ZWQgd2luZG93cyBtYWtlZmlsZXMgYW5kIElOU1RBTEwgZG9jcy4KCi0gTXIgTGFycnkgRmFobm9lIGZvdW5kIGEgcHJvYmxlbSB3aXRoIGZvcm1wb3N0cyBhbmQgSSBtYW5hZ2VkIHRvIHRyYWNrIGRvd24KICBhbmQgcGF0Y2ggdGhpcyBidWcuIFRoaXMgd2FzIGFjdHVhbGx5IHR3byBidWdzLCBhcyB0aGUgcG9zdGVkIHNpemUgd2FzIGFsc28KICBzYWlkIHRvIGJlIHR3byBieXRlcyB0b28gbGFyZ2UuCgotIEJyZW50IEJlYXJkc2xleSBmb3VuZCBvdXQgYW5kIGJyb3VnaHQgYSBjb3JyZWN0aW9uIGZvciB0aGUKICBDVVJMSU5GT19DT05URU5UX1RZUEUgcGFyc2VyIHRoYXQgd2FzIG9mZiBvbmUgYnl0ZS4gVGhpcyB3YXMgbXkgZmF1bHQsIEkKICBhY2NpZGVudGFseSBicm9rZSBHaWFzbGFzIEdlb3JnaW9zJyBwYXRjaC4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDAyKQotIEtldmluIFJvdGggZm91bmQgeWV0IGFub3RoZXIgU1NMIGRvd25sb2FkIHByb2JsZW0uCgpWZXJzaW9uIDcuOS40CgotIG5vIGNoYW5nZXMgc2luY2UgcHJlLXJlbGVhc2UKClZlcnNpb24gNy45LjQtcHJlMgoKRGFuaWVsICgzIEZlYnJ1YXJ5IDIwMDIpCi0gRXJpYyBNZWx2aWxsZSBwcm92aWRlZCBhIGZldyBzcGVsbGluZyBjb3JyZWN0aW9ucyBpbiB0aGUgY3VybCBtYW4gcGFnZS4KCkRhbmllbCAoMSBGZWJydWFyeSAyMDAyKQotIEFuZHJlYXMgRGFtbSBjb3JyZWN0ZWQgdGhlIHVuY29uZGl0aW9uYWwgdXNlIG9mIGdtdGltZSgpIGluIGdldGRhdGUsIGl0IG5vdwogIHVzZXMgZ210aW1lX3IoKSBvbiBhbGwgaG9zdHMgdGhhdCBoYXZlIGl0LgoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDIpCi0gQW4gYW5vbnltb3VzIGJ1ZyByZXBvcnQgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gdGhlIEROUyBjYWNoaW5nIHdoaWNoIG1hZGUgaXQKICBzb21ldGltZXMgYWxsb2NhdGUgb25lIGJ5dGUgdG9vIGxpdHRsZSB0byBzdG9yZSB0aGUgY2FjaGUgZW50cnkgaW4uIFRoaXMKICBoYXBwZW5lZCB3aGVuIHRoZSBwb3J0IG51bWJlciBzdGFydGVkIHdpdGggMSEKCi0gQWxiZXJ0IENoaW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGltcHJvdmVzIHRoZSBnZXRob3N0YnluYW1lX3IoKSBjb25maWd1cmUKICBjaGVjayBvbiBIUC1VWCAxMS4wMC4KClZlcnNpb24gNy45LjQtcHJlMQoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDIpCi0gR2VvcmcgSG9ybiBmb3VuZCBhbm90aGVyIHdheSB0aGUgU1NMIHJlYWRpbmcgZmFpbGVkIGR1ZSB0byB0aGUgbm9uLWJsb2NraW5nCiAgc3RhdGUgb2YgdGhlIHNvY2tldHMhIEkgZml4ZWQuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwMikKLSBNdWx0aXBhcnQgZm9ybXBvc3RzIG5vdyBzZW5kIHRoZSBmdWxsIHJlcXVlc3QgcHJvcGVybHksIGluY2x1ZGluZyB0aGUgQ1JMRi4KICBUaGV5IHdlcmUgcHJldmlvdXNseSB0cmVhdGVkIGFzIHBhcnQgb2YgdGhlIHBvc3QgZGF0YS4KCi0gVGhlIHVwbG9hZCBieXRlIGNvdW50ZXIgYnVnZ2VkLgoKLSBULiBCaGFyYXRoIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2VlZCBTU0wgb24gZXZlcnkgY29ubmVjdCwgd2hpY2ggaXMgYSB0aW1lLQogIGNvbnN1bWluZyBvcGVyYXRpb24gdGhhdCBzaG91bGQgb25seSBiZSBuZWVkZWQgdG8gZG8gb25jZS4gV2UgcGF0Y2hlZAogIGxpYmN1cmwgdG8gbm93IG9ubHkgc2VlZCBvbiB0aGUgZmlyc3QgY29ubmVjdCB3aGVuIHVuc2VlZGVkLiBUaGUgc2VlZGVkCiAgc3RhdHVzIGlzIGdsb2JhbCBzbyBpdCdsbCBub3cgb25seSBoYXBwZW4gb25jZSBkdXJpbmcgYSBwcm9ncmFtJ3MgbGlmZSB0aW1lLgoKICBJZiB0aGUgcmFuZG9tX2ZpbGUgb3IgZWdkc29ja2V0IGlzIHNldCwgdGhlIHNlZWQgd2lsbCBiZSByZS1tYWRlIHRob3VnaC4KCi0gR2lhc2xhcyBHZW9yZ2lvcyBpbnRyb2R1Y2VkIENVUkxJTkZPX0NPTlRFTlRfVFlQRSB0aGF0IGxldHMKICBjdXJsX2Vhc3lfZ2V0aW5mbygpIHJlYWQgdGhlIGNvbnRlbnQtdHlwZSBmcm9tIHRoZSBwcmV2aW91cyByZXF1ZXN0LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDIpCi0gS2pldGlsIEphY29ic2VuIGZvdW5kIGEgd2F5IHRvIGNyYXNoIGN1cmwgYW5kIGFmdGVyIG11Y2ggZGVidWdnaW5nLCBpdAogIHR1cm5lZCBvdXQgaXQgd2FzIGEgSVB2NC1saW51eCBvbmx5IHByb2JsZW0gaW50cm9kdWNlZCBpbiA3LjkuMyByZWxhdGVkIHRvCiAgbmFtZSByZXNvbHZpbmcuCgotIEFuZHJlYXMgRGFtbSBwb3N0ZWQgYSBodWdlIHBhdGNoIHRoYXQgbWFkZSB0aGUgY3VybF9nZXRkYXRlKCkgZnVuY3Rpb24gZnVsbHkKICByZWVudHJhbnQhCgotIFN0ZXZlIE1hcnggcG9pbnRlZCBvdXQgdGhhdCB5b3UgY291bGRuJ3QgbWl4IENVUkxPUFRfQ1VTVE9NUkVRVUVTVCB3aXRoCiAgQ1VSTE9QVF9QT1NURklFTERTLiBZb3UgY2FuIG5vdyEKCkRhbmllbCAoMjUgSmFudWFyeSAyMDAyKQotIEtyaXNobmVuZHUgTWFqdW1kYXIgcG9pbnRlZCBvdXQgdGhhdCB0aGUgaGVhZGVyIGxlbmd0aCBjb3VudGVyIHdhcyBub3QgcmVzZXQKICBiZXR3ZWVuIG11bHRpcGxlIHJlcXVlc3RzIG9uIHRoZSBzYW1lIGhhbmRsZS4KCi0gUGVkcm8gTmV2ZXMgcmlnaHRmdWxseSBxdWVzdGlvbmVkIHdoeSBjdXJsIGFsd2F5cyBhcHBlbmQgXHJcbiB0byB0aGUgZGF0YQogIHRoYXQgaXMgc2VudCBpbiBIVFRQIFBPU1QgcmVxdWVzdHMuIFVuZm9ydHVuYXRlbHksIHRoaXMgYnJva2UgdGhlIHRlc3Qgc3VpdGUKICBhcyB0aGUgdGVzdCBIVFRQIHNlcnZlciBpcyBsYW1lIGVub3VnaCBub3QgdG8gZGVhbCB3aXRoIHRoaXMuLi4gOi1PCgotIEZvbGxvd2luZyBMb2NhdGlvbjogaGVhZGVycyB3aGVuIHRoZSBjb25uZWN0aW9uIGRpZG4ndCBjbG9zZSBkaWRuJ3Qgd29yayBhcwogIGxpYmN1cmwgZGlkbid0IHByb3Blcmx5IHN0b3AgcmVhZGluZy4gVGhpcyBwcm9ibGVtIHdhcyBhZGRlZCBpbiA3LjkuMyBkdWUgdG8KICB0aGUgcmVzdHJ1Y3R1cmVkIGludGVybmFscy4gJ0ZyYW5rJyBwb3N0ZWQgYSBidWcgcmVwb3J0IGFib3V0IHRoaXMuCgpEYW5pZWwgKDI0IEphbnVhcnkgMjAwMikKLSBLZXZpbiBSb3RoIHZlcnkgcXVpY2tseSBzcG90dGVkIHRoYXQgd2Ugd3JvbmdseSBpbnN0YWxsZWQgdGhlIGV4YW1wbGUKICBwcm9ncmFtcyB0aGF0IHdlcmUgYnVpbHQgaW4gdGhlIG11bHRpIGRpcmVjdG9yeSwgd2hlbiAnbWFrZSBpbnN0YWxsJyB3YXMKICB1c2VkLiA6LS8KClZlcnNpb24gNy45LjMKCkRhbmllbCAoMjMgSmFudWFyeSAyMDAyKQotIEFuZHLpcyBHYXJj7WEgZm91bmQgYSBwZXJzaXN0YW5jeSBwcm9ibGVtIHdoZW4gZG9pbmcgSFRUUCBIRUFELCB0aGF0IG1hZGUKICBjdXJsICJoYW5nIiB1bnRpbCB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIuIFRoaXMgcHJvYmxlbSBoYXMKICBiZWVuIGludHJvZHVjZWQgaW4gNy45LjMgZHVlIHRvIGludGVybmFsIHJld3JpdGVzLCB0aGlzIHdhcyBub3QgcHJlc2VudCBpbgogIDcuOS4yLgoKVmVyc2lvbiA3LjkuMy1wcmU0CgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwMikKLSBBbnRvbmlvIGZpbGVkIGJ1ZyByZXBvcnQgIzUwNTUxNCBhbmQgcHJvdmlkZWQgYSBmaXghIFdoZW4gZG9pbmcgbXVsdGlwYXJ0CiAgZm9ybXBvc3RzLCBsaWJjdXJsIHdvdWxkIGluY2x1ZGUgYW4gZXJyb3IgdGV4dCBpbiB0aGUgYWN0dWFsIHBvc3QgaWYgYQogIHNwZWNpZmllZCBmaWxlIHdhc24ndCBmb3VuZC4gVGhpcyBpcyBub3QgbGliY3VybCdzIGpvYi4gSW5zdGVhZCB3ZSBhZGQgYW4KICBlbXB0eSBwYXJ0LgoKRGFuaWVsICgxOCBKYW51YXJ5IDIwMDIpCi0gUGxheWVkIGFyb3VuZCB3aXRoIHN0cmljdGVyIGNvbXBpbGVyIHdhcm5pbmdzIGZvciBnY2MgKHdoZW4gLi9jb25maWd1cmUKICAtLWVuYWJsZS1kZWJ1ZyBpcyB1c2VkKSBhbmQgY2hhbmdlZCBzb21lIG1pbm9yIHRoaW5ncyB0byBzdG9wIHRoZSB3YXJuaW5ncy4KCi0gQ29tbWVudGVkIG91dCB0aGUgJ2xvbmcgbG9uZycgYW5kICdsb25nIGRvdWJsZScgY2hlY2tzIGluIGNvbmZpZ3VyZS5pbiwgYXMKICB3ZSBkb24ndCBjdXJyZW50bHkgdXNlIHRoZW0gYW55d2F5IGFuZCB0aGUgY29kZSBpbiBsaWIvbXByaW50Zi5jIHRoYXQgdXNlCiAgdGhlbSBjYXVzZXMgd2FybmluZ3MuCgotIFNhdWwgR29vZCBhbmQgam9uYXRhbiBwb2ludGVkIG91dCBNYWMgT1MgWCBidWlsZCBwcm9ibGVtcyB3aXRoIHByZTMgYW5kIGhvdwogIHRvIGNvcnJlY3QgdGhlbS4gVHdvIGNvbXBpbGVyIHdhcm5pbmdzIHdlcmUgcmVtb3ZlZCBhcyB3ZWxsLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHR3byBtaW5vciBtaW5ndzMyIGJ1aWxkaW5nIHByb2JsZW1zLgoKVmVyc2lvbiA3LjkuMy1wcmUzCgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwMikKLSBkb2NzL2xpYmN1cmwtdGhlLWd1aWRlIGlzIGEgbmV3IHR1dG9yaWFsIGZvciBvdXIgbGliY3VybCBwcm9ncmFtbWluZwogIGZyaWVuZHMuCgotIFJpY2hhcmQgQXJjaGVyIGJyb3VnaHQgYmFjayB0aGUgYWJpbGl0eSB0byBjb21waWxlIGFuZCBidWlsZCB3aXRoIE9wZW5TU0wKICB2ZXJzaW9ucyBiZWZvcmUgMC45LjUuCiAgW2h0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci8/ZnVuYz1kZXRhaWwmYXRpZD0xMDA5NzYmYWlkPTUwNDE2MyZncm91cF9pZD05NzZdCgotIFRoZSBETlMgY2FjaGUgY29kZSBkaWRuJ3QgdGFrZSB0aGUgcG9ydCBudW1iZXIgaW50byBhY2NvdW50LCB3aGljaCBtYWRlIGl0CiAgd29yayByYXRoZXIgYmFkIG9uIElQdjYtZW5hYmxlZCBob3N0cyAoZXNwZWNpYWxseSB3aGVuIGRvaW5nIHBhc3NpdmUKICBGVFApLiBTdGVybGluZyBmaXhlZCBpdC4KCkRhbmllbCAoMTYgSmFudWFyeSAyMDAyKQotIEdlb3JnIEhvcm4gY291bGQgbWFrZSBhIHRyYW5zZmVyIHRpbWUtb3V0IHdpdGhvdXQgZXJyb3IgdGV4dC4gSSBmb3VuZCBpdCBhbmQKICBjb3JyZWN0ZWQgaXQuCgotIFNTTCB3cml0ZXMgZGlkbid0IHdvcmssIHRoZXkgcmV0dXJuIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUgdGhhdCBjYXVzZWQKICBoYXZvYyBhbGwgb3Zlci4gR2VvcmcgSG9ybiBleHBlcmllbmNlZCB0aGlzLgoKLSBLZXZpbiBSb3RoIHBhdGNoZWQgdGhlIGN1cmxfdmVyc2lvbigpIGZ1bmN0aW9uIHRvIHVzZSB0aGUgcHJvcGVyIE9wZW5TU0wKICBmdW5jdGlvbiBmb3IgdmVyc2lvbiBpbmZvcm1hdGlvbi4gVGhpcyB3YXksIGN1cmwgd2lsbCByZXBvcnQgdGhlIHZlcnNpb24gb2YKICB0aGUgU1NMIGxpYnJhcnkgYWN0dWFsbHkgcnVubmluZyByaWdodCBub3csIG5vdCB0aGUgb25lIHRoYXQgaGFkIGl0cyBoZWFkZXJzCiAgaW5zdGFsbGVkIHdoZW4gbGliY3VybCB3YXMgYnVpbHQuIE1haW5seSBpbnRlcnN0aW5nIHdoZW4gcnVubmluZyB3aXRoIHNoYXJlZAogIE9wZW5TU0wgbGlicmFyaWVzLiAgCgpWZXJzaW9uIDcuOS4zLXByZTIKCkRhbmllbCAoMTYgSmFudWFyeSAyMDAyKQotIE1vZmllZCB0aGUgbWFpbiB0cmFuc2ZlciBsb29wIGFuZCByZWxhdGVkIHN0dWZmIHRvIGRlYWwgd2l0aCBub24tYmxvY2tpbmcKICBzb2NrZXRzIGluIHRoZSB1cGxvYWQgc2VjdGlvbi4gV2hpbGUgZG9pbmcgdGhpcywgSSd2ZSBub3cgc2VwYXJhdGVkIHRoZQogIGNvbm5lY3Rpb24gb3JpZW50ZWQgYnVmZmVycyB0byBoYXZlIG9uZSBmb3IgZG93bmxvYWRzIGFuZCBvbmUgZm9yIHVwbG9hZHMKICAoYXMgdHdvIGNhbiBoYXBwZW4gc2ltdWx0YW5lb3VzbHkpLiBJIGFsc28gc2hydW5rIHRoZSBidWZmZXJzIHRvIDIwSwogIGVhY2guIEFzIHdlIGhhdmUgYSBzY3JhdGNoIGJ1ZmZlciB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgdXBsb2FkIGJ1ZmZlciwgd2UKICBhcnJpdmVkIGF0IDgwSyBmb3IgYnVmZmVycyBjb21wYXJlZCB3aXRoIHRoZSBwcmV2aW91cyAxNTBLLgoKLSBBZGRlZCB0aGUgLS1jYyBvcHRpb24gdG8gY3VybC1jb25maWcgY29tbWFuZCBhcyBpdCBlbmFibGVzIHNvIHZlcnkgY29vbAogIG9uZS1saW5lcnMuIEhhdmUgYSBnbyBhIHRoaXMgb25lLCBidWlsZGluZyB0aGUgc2ltcGxlLmMgZXhhbXBsZToKCiAgICAgICAgJCBgY3VybC1jb25maWcgLS1jYyAtLWNmbGFncyAtLWxpYnNgIC1vIGV4YW1wbGUgc2ltcGxlLmMKCkRhbmllbCAoMTQgSmFudWFyeSAyMDAyKQotIEkgbWFkZSBhbGwgc29ja2V0IHJlYWRzIChyZWN2KSBoYW5kbGUgRVdPVUxEQkxPQ0suIEkgaG9wZSBuaWNlbHkuIE5vdyB3ZQogIG9ubHkgbmVlZCB0byBhZGRyZXNzIGFsbCB3cml0ZXMgKHNlbmQpIHRvbyBhbmQgdGhlbiBJJ20gcmVhZHkgZm9yIGFub3RoZXIKICBwcmUtcmVsZWFzZS4uLgoKLSBTdG9uZWQgRWxpcG90IHBhdGNoZWQgdGhlIGluX2FkZHJfdCBjb25maWd1cmUgdGVzdCB0byBtYWtlIGl0IHdvcmsgYmV0dGVyIG9uCiAgbW9yZSBwbGF0Zm9ybXMuCgpEYW5pZWwgKDkgSmFudWFyeSAyMDAyKQotIENyaXMgQmFpbGlmZiBmb3VuZCBvdXQgdGhhdCBmaWxsaW5nIHVwIGN1cmwncyBTU0wgc2Vzc2lvbiBjYWNoZSBjYXVzZWQgYQogIGNyYXNoIQoKLSBQb3N0ZWQgdGhlIGN1cmwgcXVlc3Rpb25uYWlyZSBvbiB0aGUgd2ViIHNpdGUuIElmIHlvdSBoYXZlbid0IHBvc3RlZCB5b3VyCiAgb3BpbmlvbnMgdGhlcmUgeWV0LCBnbyB0aGVyZSBhbmQgZG8gaXQgbm93IHdoaWxlIGl0IGlzIHN0aWxsIHRoZXJlOgoKICAgICAgICBodHRwOi8vY3VybC5oYXh4LnNlL3EvCgotIEdlb3JnIEhvcm4gcXVpY2tseSBmb3VuZCBvdXQgdGhhdCB0aGUgU1NMIHJlYWRpbmcgbm8gbG9uZ2VyIHdvcmtlZCBhcwogIHN1cHBvc2VkIHNpbmNlIHRoZSBzd2l0Y2ggdG8gbm9uLWJsb2NraW5nIHNvY2tldHMuIEkndmUgbWFkZSBhIHF1aWNrIHBhdGNoCiAgKGZvciByZWFkaW5nIG9ubHkpIGJ1dCB3ZSBzaG91bGQgaW1wcm92ZSBpdCBldmVuIGZ1cnRoZXIuCgpWZXJzaW9uIDcuOS4zLXByZTEKCkRhbmllbCAoNyBKYW51YXJ5IDIwMDIpCi0gSSBtYWRlIHRoZSAnYm9vbCcgdHlwZWRlZiB1c2UgYW4gInVuc2lnbmVkIGNoYXIiLiBJdCBtYWtlcyBpdCB0aGUgc2FtZSBvbgogIGFsbCBwbGF0Zm9ybXMsIG5vIG1hdHRlciB3aGF0IHRoZSBwbGF0Zm9ybSB0aGlua3MgdGhlIGRlZmF1bHQgZm9ybWF0IGZvcgogIGNoYXIgaXMuIFRoaXMgd2FzIG5vdGljZWQgc2luY2Ugd2UgbWFkZSBhIHNpbGx5IGNvbXBhcmlzb24gaW52b2x2aW5nIHN1Y2ggYQogIGJvb2wgdmFyaWFibGUsIGFuZCBvbmx5IG9uZSBjb21waWxlci9wbGF0Zm9ybSBjb21iaW5hdGlvbiAob24gRGViaWFuIExpbnV4KQogIGNvbXBsYWluZWQgYWJvdXQgaXQgKHRoYXQgaGFwcGVuZWQgdG8gaGF2ZSBpdHMgY2hhciB1bnNpZ25lZCBieSBkZWZhdWx0KS4KCi0gQnVnIHJlcG9ydCAjNDk1MjkwIGlkZW50aWZpZWQgYSBjb29raWUgcGFyc2luZyBwcm9ibGVtIHRoYXQgd2FzIGNvcnJlY3RlZC4KICBXaGVuIGEgU2V0LUNvb2tpZTogbGluZSBpcyByZWNlaXZlZCB3aXRob3V0IGEgdHJhaWxpbmcgc2VtaWNvbG9uLCBsaWJjdXJsCiAgZGlkbid0IHJlYWQgdGhlIGxhc3QgIm5hbWU9dmFsdWUiIHBhaXIgb2YgdGhlIGxpbmUsIGxlYWRpbmcgdG8gY29uZnVzaW9ucy4uLgoKLSBTdGVybGluZyBjb21taXR0ZWQgaGlzIHVwZGF0ZWQgRE5TIGNhY2hlIGNvZGUuCgotIEkgd29ya2VkIHdpdGggR2VvcmcgSG9ybiBhbmQgY29tbWVudHMgZnJvbSBH9nR6IEJhYmluLUViZWxsIGFuZCBzd2l0Y2hlZAogIGN1cmwncyBzb2NrZXQgb3BlcmF0aW9ucyBjb21wbGV0ZWx5IG92ZXIgdG8gbm9uLWJsb2NraW5nIGZvciB0aGUgZW50aXJlCiAgb3BlcmF0aW9uIChwcmV2aW91c2x5IHdlIHVzZWQgbm9uLWJsb2NraW5nIG9ubHkgZm9yIHRoZSBjb25uZWN0aW9uIHBoYXNlKS4KICBXZSBoYWQgdG8gZG8gdGhpcyB0byBtYWtlIHRoZSBTU0wgY29ubmVjdGlvbiBwaGFzZSB0aW1lb3V0IHByb3Blcmx5IHdpdGhvdXQKICB0aGUgdXNlIG9mIHNpZ25hbHMuIEEgbGl0dGxlIGV4dHJhIGNvZGUgdG8gZGVhbCB3aXRoIHRoaXMgd2FzIGFkZGVkLgoKLSBULiBCaGFyYXRoIHBvaW50ZWQgb3V0IGEgc2xpZ2h0bHkgb2JzY3VyZSBjb29raWUgZW5naW5lIGZsYXcuCgotIFBldGUgU3UgcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIGRpZG4ndCB0cmVhdCBIVFRQIGNvZGUgMjA0IGFzIGl0IHNob3VsZC4KICAyMDQtcmVwbGllcyBuZXZlciBwcm92aWRlcyBhIHJlc3BvbnNlLWJvZHkuIFRoaXMgcmVzdWx0ZWQgaW4gYmFkIHBlcnNpc3RhbnQKICBiZWhhdmlvciB3aGVuIDIwNCB3YXMgcmVjZWl2ZWQuCgpEYW5pZWwgKDUgSmFudWFyeSAyMDAyKQotIFNNIHVwZGF0ZWQgdGhlIFZDKysgbGlicmFyeSBNYWtlZmlsZXMgZm9yIHRoZSBuZXcgc291cmNlIGZpbGVzLgoKRGFuaWVsICg0IEphbnVhcnkgMjAwMikKLSBJIGRpc2NvdmVyZWQgdGhhdCB3ZSB3cm9uZ2x5IHVzZWQgaW5ldF9udG9hKCkgKGluc3RlYWQgb2YgaW5ldF9udG9hX3IoKSBpbgogIHR3byBwbGFjZXMgaW4gdGhlIHNvdXJjZSBjb2RlKS4gT25lIGhhcHBlbmVkIHdpdGggVkVSQk9TRSBzZXQgb24gY29ubmVjdHMsCiAgYW5kIHRoZSBvdGhlciB3aGVuIFZFUkJPU0Ugd2FzIG9uIGFuZCBrcmI0IG92ZXIgbmF0IHdhcyB1c2VkLi4uIEkgaG9uZXN0bHkKICBkb24ndCB0aGluayBhbnlvbmUgaGFzIHN1ZmZlcmVkIGZyb20gdGhlc2UgbWlzdGFrZXMuCgotIEkgcmVwbGFjZWQgYSBsb3Qgb2Ygc2lsbHkgb2NjdXJhbmNlcyBvZiBwcmludGYoKSB0byBpbnN0ZWFkIHVzZSB0aGUgbW9yZQogIGFwcHJvcHJpYXRlIEN1cmxfaW5mb2YoKSBvciBDdXJsX2ZhaWxmKCkuIFRoZSBrcmI0IGFuZCB0ZWxuZXQgY29kZSB3ZXJlCiAgYWZmZWN0ZWQuCgotIFBoaWxpcCBHbGFkc3RvbmUgZm91bmQgYSBmZXcgbW9yZSBwcm9ibGVtcyB3aXRoIDY0LWJpdCBhcmNocyAodGhlIDY0LWJpdAogIHNwYXJjIG9uIHNvbGFyaXMgOCkuCgotIEFmdGVyIGRpc2N1c3Npb25zIG9uIHRoZSBsaWJjdXJsIGxpc3Qgd2l0aCBSYW91bCBDcmlkbGlnLCBJIGp1c3QgbWFkZSBGVFAKICByZXNwb25zZSBsaW5lcyBnZXQgcGFzc2VkIHRvIHRoZSBoZWFkZXIgY2FsbGJhY2sgaWYgc3VjaCBhIG9uZSBpcwogIHJlZ2lzdGVyZWQuIEl0J2xsIG1ha2UgaXQgcG9zc2libGUgZm9yIGFueSBhcHBsaWNhdGlvbiB0byBnZXQgYWxsIHRoZQogIHJlc3BvbnNlcyBhbiBGVFAgc2VydmVyIHNlbmRzIHRvIGxpYmN1cmwuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDAyKQotIFN0ZXJsaW5nIEh1Z2hlcyBicm91Z2h0IGEgZmV3IGJ1Y2tldHMgb2YgY29kZS4gTm93LCBsaWJjdXJsIHdpbGwKICBhdXRvbWF0aWNhbGx5IGNhY2hlIEROUyBsb29rdXBzIGFuZCByZS11c2UgdGhlIHByZXZpb3VzIHJlc3VsdHMgZmlyc3QgaWYgYW55CiAgc3VjaCBpcyBhdmFpbGFibGUuIEl0IGdyZWF0bHkgaW1wcm92ZXMgc3BlZWQgd2hlbiBkb2luZyBtYW55IHJlcGVhdGVkCiAgb3BlcmF0aW9ucyB0byB0aGUgc2FtZSBob3N0LgoKLSBBcyB0aGUgdGVzdCBjYXNlIHVzZXMgLS1pbmNsdWRlIGFuZCB0aGVuIC0taGVhZCwgSSBoYWQgdG8gbW9kaWZ5IHNyYy9tYWluLmMKICB0byBkZWFsIHdpdGggdGhpcyBzaXR1YXRpb24gc2xpZ2h0bHkgYmV0dGVyIHRoYW4gcHJldmlvdXNseS4gV2hlbiBkb25lLCB3ZQogIGhhdmUgMTAwJSBnb29kIHRlc3RzIGFnYWluIGluIHRoZSBtYWluIGJyYW5jaC4KCkRhbmllbCAoMiBKYW51YXJ5IDIwMDIpCi0gTWFkZSB0ZXN0IGNhc2UgMjUgcnVuIGFnYWluIGluIHRoZSBtdWx0aS1kZXYgYnJhbmNoLiBCdXQgaXQgc2VlbXMgdGhhdCB0aGUKICBjaGFuZ2VzIGRvbmUgb24gZGVjLTIwIG1hZGUgdGVzdCBjYXNlIDEwNCBjZWFzZSB0byB3b3JrIChpbiBib3RoIGJyYW5jaGVzKS4KCi0gUGhpbGlwIEdsYWRzdG9uZSBwb2ludGVkIG91dCBhIGZldyBwb3J0YWJpbGl0eSBwcm9ibGVtcyBpbiB0aGUgc291cmNlIGNvZGUKICB0aGF0IGRpZG4ndCBjb21waWxlIG9uIDY0LWJpdCBzcGFyY3MgdXNpbmcgU3VuJ3MgbmF0aXZlIGNvbXBpbGVyLgpEYW5pZWwgKDIwIERlY2VtYmVyIDIwMDEpCi0gQmr2cm4gU3RlbmJlcmcgY2F1Z2h0IGFuIHVucGxlYXNlbnQgKGJ1dCBoYXJkLXRvLWZpbmQpIGJ1ZyB0aGF0IGNvdWxkIGNhdXNlCiAgbGliY3VybCB0byBoYW5nIG9uIHRyYW5zZmVycyBvdmVyIHByb3h5LCB3aGVuIHRoZSBwcm94eSB3YXMgc3BlY2lmaWVkIHdpdGgKICBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSEKCi0gQWRkZWQgY29kZSB0byBtYWtlIGZ0cCBvcGVyYXRpb25zIHRyZWF0IHRoZSBOT19CT0RZIGFuZCBIRUFERVJTIG9wdGlvbnMKICBiZXR0ZXI6CgogICBOT19CT0RZIHNldCBUUlVFIGFuZCBIRUFERVJTIHNldCBUUlVFOgogICAgUmV0dXJuIGEgc2V0IG9mIGhlYWRlcnMgd2l0aCBmaWxlIGluZm8KCiAgIE5PX0JPRFkgc2V0IEZBTFNFCiAgICBUcmFuc2ZlciBkYXRhIGFzIHVzdWFsLCBIRUFERVJTIGlzIGlnbm9yZWQKCiAgIE5PX0JPRFkgc2V0IFRSVUUgYW5kIEhFQURFUlMgc2V0IEZBTFNFCiAgICBEb24ndCB0cmFuc2ZlciBhbnkgZGF0YSwgZG9uJ3QgcmV0dXJuIGFueSBoZWFkZXJzLiBKdXN0IHBlcmZvcm0gdGhlIHNldAogICAgb2YgRlRQIGNvbW1hbmRzLgoKRGFuaWVsICgxNyBEZWNlbWJlciAyMDAxKQotIEf2dHogQmFiaW4tRWJlbGwgZG92ZSBpbnRvIHRoZSBkYXJrIGR1bmdlb25zIG9mIHRoZSBPcGVuU1NMIEVOR0lORSBzdHVmZiBhbmQKICBtYWRlIGxpYmN1cmwgc3VwcG9ydCBpdCEgVGhpcyBhbGxvd3MgbGliY3VybCB0byBkbyBTU0wgY29ubmVjdGlvbnMgd2l0aCB0aGUKICBwcml2YXRlIGtleSBzdG9yZWQgaW4gZXh0ZXJuYWwgaGFyZHdhcmUuCgogIFRvIG1ha2UgdGhpcyBnb29kLCBoZSBoYWQgdG8gYWRkIGEgYnVuY2ggb2YgbmV3IGxpYnJhcnkgb3B0aW9ucyB0aGF0J2xsIGJlCiAgdXNlZnVsIHRvIG90aGVycyBhcyB3ZWxsOgoKICAgQ1VSTE9QVF9TU0xDRVJUVFlQRSAgc2V0IFNTTCBjZXJ0IHR5cGUgKFBFTS9ERVIpCiAgIENVUkxPUFRfU1NMS0VZICAgICAgIHNldCBTU0wgcHJpdmF0ZSBrZXkgKGZpbGUpCiAgIENVUkxPUFRfU1NMS0VZVFlQRTogIHNldCBTU0wga2V5IHR5cGUgKFBFTS9ERVIvRU5HKQogICBDVVJMT1BUX1NTTEtFWVBBU1NXRDogc2V0IHRoZSBwYXNzcGhyYXNlIGZvciB5b3VyIHByaXZhdGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgKENVUkxPUFRfU1NMQ0VSVFBBU1NXRCBpcyBhbiBhbGlhcykKICAgQ1VSTE9QVF9TU0xFTkdJTkU6ICAgc2V0IHRoZSBuYW1lIG9mIHRoZSBjcnlwdG8gZW5naW5lCiAgICAgICAgICAgICAgICAgICAgICAgIChyZXR1cm5zIENVUkxFX1NTTF9FTkdJTkVfTk9URk9VTkQgb24gZXJyb3IpCiAgIENVUkxPUFRfU1NMRU5HSU5FX0RFRkFVTFQ6IHNldCB0aGUgZGVmYXVsdCBlbmdpbmUKCiAgVGhlcmUgYXJlIHR3byBuZXcgZmFpbHVyZSBjb2RlczoKCiAgIENVUkxFX1NTTF9FTkdJTkVfTk9URk9VTkQKICAgQ1VSTEVfU1NMX0VOR0lORV9TRVRGQUlMRUQKCkRhbmllbCAoMTQgRGVjZW1iZXIgMjAwMSkKLSBXZSBoYXZlICJicmFuY2hlZCIgdGhlIHNvdXJjZS10cmVlIGF0IGEgZmV3IHBsYWNlcy4gQ2hlY2tvdXQgdGhlIENWUyBzb3VyY2VzCiAgd2l0aCB0aGUgJ211bHRpLWRldicgbGFiZWwgdG8gZ2V0IHRoZSBsYXRlc3QgbXVsdGkgaW50ZXJmYWNlIGRldmVsb3BtZW50CiAgdHJlZS4gVGhlIGlkZWEgaXMgdG8gb25seSBicmFuY2ggYWZmZWN0ZWQgZmlsZXMgYW5kIHRvIHJlc3RyaWN0IHRoZSBicmFuY2gKICB0byB0aGUgdjggbXVsdGkgaW50ZXJmYWNlIGRldmVsb3BtZW50IG9ubHkuCgogICpOT1RFKiB0aGF0IGlmIHdlIGdldCBidWcgcmVwb3J0cyBhbmQgcGF0Y2hlcyBldGMsIHdlIG1pZ2h0IG5lZWQgdG8gYXBwbHkKICB0aGVtIGluIGJvdGggYnJhbmNoZXMhCgogIFRoZSBtdWx0aS1kZXYgYnJhbmNoIGlzIHdoYXQgd2UgYXJlIGdvbm5hIHVzZSBhcyBtYWluIGJyYW5jaCBpbiB0aGUgZnV0dXJlCiAgaWYgaXQgdHVybnMgb3V0IHN1Y2Nlc3NmdWwuIFRodXMsIHdlIG11c3QgbWFpbnRhaW4gYm90aCBub3cgaW4gY2FzZSB3ZSBuZWVkCiAgdGhlbS4gVGhlIGN1cnJlbnQgbWFpbiBicmFuY2ggd2lsbCBiZSB1c2VkIGlmIHdlIHdhbnQgdG8gcmVsZWFzZSBhIDcuOS4zIG9yCiAgcGVyaGFwcyBhIDcuMTAgcmVsZWFzZSBiZWZvcmUgdmVyc2lvbiA4LiBXaGljaCBpcyB2ZXJ5IGxpa2VseS4KCi0gTWFyY3VzIFdlYnN0ZXIgcHJvdmlkZWQgY29kZSBmb3IgdGhlIG5ldyBDVVJMRk9STV9DT05URU5USEVBREVSIG9wdGlvbiBmb3IKICBjdXJsX2Zvcm1hZGQoKSwgdGhhdCBsZXRzIGFuIGFwcGxpY2F0aW9uIGFkZCBhIHNldCBvZiBoZWFkZXJzIGZvciB0aGF0CiAgcGFydGljdWxhciBwYXJ0IGluIGEgbXVsdGlwYXJ0L2Zvcm0tcG9zdC4gSGUgYWxzbyBwcm92aWRlZCBhIHNlY3Rpb24gdG8gdGhlCiAgbWFuIHBhZ2UgdGhhdCBkZXNjcmliZXMgdGhlIG5ldyBvcHRpb24uCgpEYW5pZWwgKDExIERlY2VtYmVyIDIwMDEpCi0gQmVuIEdyZWVhciBtYWRlIG1lIGF3YXJlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIEN1cmxfZmFpbGYoKSB1c2FnZSBpbnRlcm5hbGx5CiAgd2FzIGEgYml0IHNsb3BweSB3aXRoIGFkZGluZyBuZXdsaW5lcyBvciBub3QgdG8gdGhlIGVycm9yIG1lc3NhZ2VzLiBMZXQncwogIG9uY2UgYW5kIGZvciBhbGwgc2F5IHRoYXQgdGhleSBkbyBub3QgYmVsb25nIHRoZXJlIQoKLSBXaGVuIHVwbG9hZGluZyBmaWxlcyB3aXRoIC1UIHRvIGdpdmUgYSBsb2NhbCBmaWxlIG5hbWUsIGFuZCB5b3UgZW5kIHRoZSBVUkwKICB3aXRoIGEgc2xhc2ggdG8gaGF2ZSB0aGUgbG9jYWwgZmlsZSBuYW1lIHVzZWQgcmVtb3RlIHRvbywgd2Ugbm93IG5vIGxvbmdlcgogIHVzZSB0aGUgbG9jYWwgZGlyZWN0b3J5IGFzIHdlbGwuIE9ubHkgdGhlIGZpbGUgcGFydCBvZiB0aGUgLVQgZmlsZSBuYW1lCiAgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcmlnaHQgb2YgdGhlIHNsYXNoIGluIHRoZSBVUkwuCgpEYW5pZWwgKDcgRGVjZW1iZXIgMjAwMSkKLSBNaWNoYWwgQm9uaW5vIHBvaW50ZWQgb3V0IHRoYXQgRGlnaXRhbCBVbml4IGRvZXNuJ3QgaGF2ZSBnbXRpbWVfciBzbyB0aGUKICBsaW5rIGZhaWxlZC4gQWRkZWQgYSBjb25maWd1cmUgY2hlY2sgYW5kIGNvcnJlY3RlZCBzb3VyY2UgY29kZS4KClZlcnNpb24gNy45LjIKCkRhbmllbCAoNSBEZWNlbWJlciAyMDAxKQotIEpvbiBUcmF2aXMgZm91bmQgb3V0IHRoYXQgaWYgeW91IHVzZWQgbGliY3VybCBhbmQgQ1VSTE9QVF9VUExPQUQgYW5kIHRoZW4KICBvbiB0aGUgc2FtZSBoYW5kbGUgdXNlZCBDVVJMT1BUX0hUVFBHRVQgaXQgd291bGQgc3RpbGwgYXR0ZW1wdCB0byB1cGxvYWQuCiAgSGlzIHN1Z2dlc3RlZCBmaXggd2FzIHBlcmZlY3QuCgpEYW5pZWwgKDQgRGVjZW1iZXIgMjAwMSkKLSBJbmNvcnBvcmF0ZWQgbW9yZSBtYWNvcyBmaXhlcyBhbmQgYWRkZWQgZm91ciBzcGVjaWZpYyBmaWxlcyBpbiBhIG5ldwogIHN1YmRpcmVjdG9yeSBiZWxvdyBzcmMuCgpEYW5pZWwgKDMgRGVjZW1iZXIgMjAwMSkKLSBFcmljIExhdmlnbmUgcmVwb3J0ZWQgdHdvIHByb2JsZW1zOgoKICBGaXJzdCBvbmUgaW4gdGhlIGN1cmxfc3RybmVxdWFsKCkgZnVuY3Rpb24uIEkgdGhpbmsgdGhpcyBwcm9ibGVtIGlzIHJhdGhlcgogIG1hY29zIDkgc3BlY2lmaWMsIGFzIG1vc3QgcGxhdGZvcm0gcHJvdmlkZXMgYSBmdW5jdGlvbiB0byB1c2UgaW5zdGVhZCBvZiB0aGUKICBvbmUgcHJvdmlkZWQgYnkgbGliY3VybC4KCiAgQSBzZWNvbmQsIG1vcmUgaW1wb3J0YW50LCB3YXMgaW4gdGhlIHdheSB3ZSB0YWtlIGNhcmUgb2YgRlRQIHJlc3BvbnNlcy4gVGhlCiAgY29kZSB3b3VsZCByZWFkIGEgbGFyZ2UgY2h1bmsgb2YgZGF0YSBhbmQgc2VhcmNoIGZvciB0aGUgZW5kLW9mLXJlc3BvbnNlCiAgbGluZSB3aXRoaW4gdGhhdCBjaHVuay4gV2hlbiBmb3VuZCwgaXQgd291bGQganVzdCBza2lwIHRoZSByZXN0IG9mIHRoZQogIGRhdGEuIEhvd2V2ZXIsIHdoZW4gdGhlIG5ldHdvcmsgY29ubmVjdGlvbnMgYXJlIHNwZWNpYWwsIG9yIHBlcmhhcHMgdGhlCiAgc2VydmVyIGlzLCB3ZSBjb3VsZCBhY3R1YWxseSBnZXQgbW9yZSB0aGFuIG9uZSByZXNwb25zZSBpbiB0aGF0IGNodW5rIG9mCiAgZGF0YSBzbyB0aGF0IHdoZW4gdGhlIG5leHQgaW52b2tlIHRvIHRoaXMgZnVuY3Rpb24gd2FzIGRvbmUsIHRoZSByZXNwb25zZQogIGhhZCBhbHJlYWR5IGJlZW4gcmVhZCBhbmQgdGhyb3duIGF3YXkuIE5vdywgd2UgY2FjaGUgdGhlIGRhdGEgbm90IHVzZWQgaW4KICBvbmUgY2FsbCwgYXMgaXQgY291bGQgYmUgdXNlZnVsIGluIHRoZSBzdWJzZXF1ZW50IGNhbGwuIFRlc3QgY2FzZSAxMjYgd2FzCiAgYWRkZWQgYW5kIHRoZSB0ZXN0IGZ0cCBzZXJ2ZXIgbW9kaWZpZWQsIHRvIGV4ZXJjaXNlIHRoaXMgcGFydGljdWxhciBjYXNlLgoKVmVyc2lvbiA3LjkuMi1wcmU4CgpEYW5pZWwgKDIgRGVjZW1iZXIgMjAwMSkKLSBCdWcgcmVwb3J0ICM0ODc4MjUgY29ycmVjdGx5IGlkZW50aWZpZWQgYSBwcm9ibGVtIHdoZW4gdXNpbmcgYSBwcm94eSBhbmQKICBmb2xsb3dpbmcgYSByZWRpcmVjdGlvbiBmcm9tIEhUVFAgdG8gSFRUUFMuIGxpYmN1cmwgdGhlbiByZS11c2VkIHRoZSBzYW1lCiAgcHJveHkgY29ubmVjdGlvbiBidXQgd2l0aG91dCBkb2luZyBhIHByb3BlciBIVFRQUyByZXF1ZXN0LgoKLSBGaXhlZCB3aW4zMiBjb21waWxpbmcgcXVpcmtzLgoKVmVyc2lvbiA3LjkuMi1wcmU3CgpEYW5pZWwgKDMwIE5vdmVtYmVyIDIwMDEpCi0gRG9jdW1lbnRlZCAtLWRpc2FibGUtZXBzdiBhbmQgQ1VSTE9QVF9GVFBfVVNFX0VQU1YuCgpEYW5pZWwgKDI5IE5vdmVtYmVyIDIwMDEpCi0gQWRkZWQgLS1kaXNhYmxlLWVwc3YgYXMgYW4gb3B0aW9uLiBXaGVuIHVzZWQsIGN1cmwgd29uJ3QgYXR0ZW1wdCB0byB1c2UgdGhlCiAgRVBTViBjb21tYW5kIHdoZW4gZG9pbmcgcGFzc2l2ZSBGVFAgZG93bmxvYWRzLiBXcm90ZSBhIHRlc3QgY2FzZSBmb3IgaXQuCgotIEVyaWMgcHJvdmlkZWQgYSBmZXcgbW9yZSBmaXhlcyBmb3IgYnVpbGRpbmcgb24gTWFjcy4gSGUgYWxzbyBwb2ludGVkIG91dAogIGEgZmxhdyBpbiB0aGUgc2lnbmFsIGhhbmRsZXIgcmVzdG9yYXRpb24gY29kZS4KCkRhbmllbCAoMjggTm92ZW1iZXIgMjAwMSkKLSBGaWRkbGVkIHdpdGggc29tZSBUcnU2NCBwcm9ibGVtcyByZXBvcnRlZCBieSBEaW1pdHJpcyBTYXJyaXMuIFRoZXkgYXBwZWFyZWQKICBvbmx5IHdoZW4gdXNpbmcgVkVSQk9TRSBmdHAgdHJhbnNmZXJzLiBEbyB3ZSB1c2UgYSB0b28gc21hbGwgYnVmZmVyIGZvcgogIGdldGhvc3RieWFkZHJfcigpLCB3YXMgdGhlIGxhY2sgb2YgdXNpbmcgaW5fYWRkcl90IHdyb25nIG9yIGlzIGl0IHRoYXQgdGhlCiAgaG9zdGVudCBzdHJ1Y3QgbXVzdCBiZSBibGFua2VkIGJlZm9yZSB1c2U/IFdpdGggRGltaXRyaXMgaGVscCBhbmQgdGhlc2UKICBwYXRjaGVzLCB0aGUgcHJvYmxlbXMgc2VlbSB0byBiZSBoaXN0b3J5LgoKLSBDVVJMT1BUX0ZUUF9VU0VfRVBTViB3YXMgYWRkZWQgYW5kIGNhbiBiZSBzZXQgdG8gRkFMU0UgdG8gcHJldmVudCBsaWJjdXJsCiAgZnJvbSB1c2luZyB0aGUgRVBTViBjb21tYW5kIGJlZm9yZSB0cnlpbmcgdGhlIG5vcm1hbCBQQVNWLiBIZWlra2kgS29ycGVsYQogIHBvaW50ZWQgb3V0IHRoYXQgc29tZSBmaXJld2FsbHMgYW5kIHNpbWlsYXIgZG9uJ3QgbGlrZSB0aGUgRVBTViBzbyB3ZSBtdXN0CiAgYmUgYWJsZSB0byBzaHV0IGlmIG9mZiB0byB3b3JrIGV2ZXJ5d2hlcmUuCgotIEkgYWRkZWQgYSBjb25maWd1cmUgY2hlY2sgZm9yICdpbl9hZGRyX3QnIGFuZCBtYWRlIHRoZSBmdHAgY29kZSB1c2UgdGhhdCB0bwogIHJlY2VpdmUgdGhlIGluZXRfYWRkcigpIHJldHVybiBjb2RlIGluLiBXb3JrcyBvbiBTb2xhcmlzIGFuZCBMaW51eCBhdAogIGxlYXN0LiBUaGUgTGludXggbWFuIHBhZ2UgZm9yIGluZXRfYWRkcigpIGRvZXNuJ3QgZXZlbiBtZW50aW9uIGluX2FkZHJfdC4uLgoKLSBBZGp1c3RlZCAoYWxtb3N0KSBhbGwgRlRQIHRlc3RzIHRvIHRoZSBuZXcgY29tbWFuZCBzZXF1ZW5jZS4KCi0gRlRQIGNvbW1hbmQgc2VxdWVuY2UgY2hhbmdlczoKCiAgRVBTViBpcyBub3cgYWx3YXlzIGF0dGVtcHRlZCBiZWZvcmUgUEFTVi4gSXQgaXMgdGhlIGZpbmFsIHRvdWNoIHRvIG1ha2UgSVB2NgogIHBhc3NpdmUgRlRQIGRvd25sb2FkcyB0byB3b3JrLCBidXQgRVBTViBpcyBub3QgcmVzdHJpY3RlZCB0byBJUHY2IGJ1dCB3b3JrcwogIGZpbmUgd2l0aCBJUHY0IHRvbyBvbiB0aGUgc2VydmVycyB0aGF0IHN1cHBvcnQgaXQuCgogIFNJWkUgaXMgbm93IGFsd2F5cyBpc3N1ZWQgYmVmb3JlIFJFVFIuIEl0IG1ha2VzIGN1cmwga25vdyB0aGUgYWN0dWFsCiAgZG93bmxvYWQgc2l6ZSBiZWZvcmUgdGhlIGRvd25sb2FkIHRha2VzIHBsYWNlLCBhcyBpdCBtYWtlcyBpdCBsZXNzIGltcG9ydGFudAogIHRvIGZpbmQgdGhlIHNpemUgc2VudCBpbiBSRVRSIHJlc3BvbnNlcy4gTWFueSBzaXRlcyBkb24ndCBpbmNsdWRlIHRoZSBzaXplCiAgaW4gdGhlcmUuCgogIEJvdGggdGhlc2UgY2hhbmdlcyBtYWRlIGl0IG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIHRlc3Qgc3VpdGUncyBmdHAgc2VydmVyCiAgY29kZSwgYW5kIGFsbCBGVFAgdGVzdCBjYXNlcyBuZWVkIHRvIGJlIGNoZWNrZWQgYW5kIGFkanVzdGVkIQoKRGFuaWVsICgyNyBOb3ZlbWJlciAyMDAxKQotIEhhbnMgU3RlZWdlcnMgcG9pbnRlZCBvdXQgdGhhdCB0aGUgdGVsbmV0IGNvZGUgcmVhZCBmcm9tIHN0ZG91dCwgbm90IHN0ZGluCiAgYXMgaXQgaXMgc3VwcG9zZWQgdG8gZG8hCgpWZXJzaW9uIDcuOS4yLXByZTYKCkRhbmllbCAoMjcgTm92ZW1iZXIgMjAwMSkKLSBFcmljIExhdmlnbmUncyBtaW5vciBjaGFuZ2VzIHRvIGJ1aWxkIG9uIE1hY09TIGJlZm9yZSBPUyBYIHdlcmUgYXBwbGllZC4KCi0gZ3JlZXAgYXQgbWluZHNwcmluZy5jb20gcHJvdmlkZWQgYSBtYWluIGluZGV4Lmh0bWwgcGFnZSBmb3Igb3VyIHJlbGVhc2UKICBhcmNoaXZlIGRvY3MgZGlyZWN0b3J5LiBJdCBqdXN0IGxpbmtzIHRvIGFsbCB0aGUgZXhpc3RpbmcgSFRNTCBmaWxlcywgYnV0CiAgSSB0aGluayBpdCBtYXkgY29tZSB1c2VmdWwgdG8gcGVvcGxlLgoKLSBUaGVyZSdzIG5vdyBzb21lIGluaXRpYWwgY29kZSB0byBzdXBwb3J0IHRoZSBFUFNWIEZUUCBjb21tYW5kLiBUaGF0IHNob3VsZAogIGJlIHVzZWQgdG8gZG8gcGFzc2l2ZSB0cmFuc2ZlcnMgSVB2Ni1zdHlsZS4gVGhlIGNvZGUgaXMgc3RpbGwgI2lmIDAnZWQgaW4KICBsaWIvZnRwLmMgYXMgSSBoYXZlIG5vIElQdjYgZnRwIHNlcnZlciB0byB0ZXN0IHRoaXMgd2l0aC4KCkRhbmllbCAoMjYgTm92ZW1iZXIgMjAwMSkKLSBSb2JlcnQgU2NobGFiYmFjaCBoYWQgcHJvYmxlbXMgdG8gdW5kZXJzdGFuZCBob3cgdG8gZG8gcmVzdW1lZCB0cmFuc2ZlcnMsCiAgYW5kIEkgY2xhcmlmaWVkIHRoZSBtYW4gcGFnZSAtQyBzZWN0aW9uIHNvbWV3aGF0LgoKVmVyc2lvbiA3LjkuMi1wcmU1CgpEYW5pZWwgKDIyIE5vdmVtYmVyIDIwMDEpCi0gQW5kculzIEdhcmPtYSBoZWxwZWQgbWUgb3V0IHRvIHRyYWNrIGRvd24gdGhlIHJvb3RzIG9mIGJ1ZyByZXBvcnQgIzQ3OTUzNywKICB3aGljaCB3YXMgY29uY2VybmluZyBjdXJsIHJldHVybmluZyB0aGUgd3JvbmcgZXJyb3IgY29kZSB3aGVuIGZhaWxpbmcgdG8KICBjb25uZWN0LiBUaGlzIGRpZG4ndCBoYXBwZW4gb24gYWxsIHN5c3RlbXMsIGFuZCBtb3JlIHNwZWNpZmljbHkgSSd2ZSBzbyBmYXIKICBvbmx5IHNlZW4gdGhpcyBoYXBwZW4gb24gSVB2NC1vbmx5IExpbnV4IGhvc3RzLgoKLSBJIGFwcGxpZWQgdGhlIGZpeGVzIGZvciB0aGUgdHdvIGJ1Z3MgRXJpYyBMYXZpZ25lIGZvdW5kIHdoZW4gZG9pbmcgaGlzIE1hY09TCiAgcG9ydC4gQSBtaXNzaW5nIGNvbW1hIGluIGFycGFfdGVsbmV0LmggYW5kIGEgcHJldHR5IHdpbGQgd3JpdGUgaW4gdGhlIEZUUAogIHJlc3BvbnNlIHJlYWRlciBmdW5jdGlvbi4gVGhlIGxhdHRlciB3cml0ZSBpcyBob3dldmVyIGxpa2VseSB0byBvY2N1ciBpbiBvdXIKICBvd24gYnVmZmVyIHVubGVzcyB2ZXJ5IGJpZyBGVFAgc2VydmVyIHJlcGxpZXMgKD4yNUspIGFyZSByZWFkLiBJJ3ZlIG5ldmVyCiAgc2VlbiBzdWNoIGEgcmVwbHkgZXZlciwgc28gSSB0aGluayB0aGlzIGlzIGEgcmVsYXRpdmVseSBtaW5vciByaXNrLgoKRGFuaWVsICgyMSBOb3ZlbWJlciAyMDAxKQotIE1vb25lc2FteSBwcm92aWRlZCBjb2RlIHRvIHByZXZlbnQganVuayBmcm9tIGJlaW5nIG91dHB1dCB3aGVuIGxpYmN1cmwKICByZXR1cm5zIGFuIGVycm9yIGNvZGUgYnV0IG5vIGVycm9yIGRlc2NyaXB0aW9uIGFuZCB0aGF0IGNvcnJlY3RzIGhvdyBtYWtlIGlzCiAgcnVuIGluIHRoZSBNYWtlZmlsZS5kaXN0IGZpbGUgKHRoYXQgYXBwZWFycyBhcyByb290IE1ha2VmaWxlIGluIHJlbGVhc2UKICBhcmNoaXZlcykuCgotIEVyaWMgTGF2aWduZSBtYWlsZWQgbWUgYnVnZml4ZXMgYW5kIHBhdGNoZXMgZm9yIGJ1aWxkaW5nIGxpYmN1cmwgb24gTWFjT1MKICAobm9uLVgpLgoKLSBLZXZpbiBSb3RoIG1vZGlmaWVkIHRoZSBjeWd3aW4gZmlsZXMgb25jZSBhZ2Fpbiwgbm93IHRvIGJ1aWxkIGFnYWluc3QgdGhlCiAgc2hhcmVkIE9wZW5TU0wgRExMcy4KClZlcnNpb24gNy45LjItcHJlNAoKRGFuaWVsICgyMCBOb3ZlbWJlciAyMDAxKQotIEdlb3JnIEhvcm4gYnJvdWdodCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlZCBDVVJMSU5GT19TVEFSVFRSQU5TRkVSX1RJTUUsCiAgY29tcGxldGUgd2l0aCBtYW4gcGFnZSB1cGRhdGVzIQoKRGFuaWVsICgxOSBOb3ZlbWJlciAyMDAxKQotIE1pa2xvcyBOZW1ldGggcHJvdmlkZWQgZGV0YWlscyBlbm91Z2ggdG8gdXBkYXRlIHRoZSBCb3JsYW5kIG1ha2VmaWxlCiAgcHJvcGVybHkuCgotIExhcnMgTSBHdXN0YWZzc29uIGZvdW5kIGEgY2FzZSB3aXRoIGEgYmFkIGZyZWUoKS4gSW4gZmFjdCwgaXQgd2FzIHNvIGJhZCBJJ20KICBhbWF6ZWQgd2UgbmV2ZXIgc2F3IHRoaXMgYmVmb3JlIQoKLSBLZXZpbiBSb3RoIHBhdGNoZWQgdGhlIGN5Z3dpbiBNYWtmaWxlLgoKRGFuaWVsICgxNiBOb3ZlbWJlciAyMDAxKQotIEtsZXZ0c292IFZhZGltIGZpeGVkIGEgYnVnIGluIGhvdyB0aW1lLWNvbmRpdGlvbmFscyB3ZXJlIHNlbnQgd2hlbiBkb2luZwogIEhUVFAuCgpWZXJzaW9uIDcuOS4yLXByZTMKCkRhbmllbCAoMTQgTm92ZW1iZXIgMjAwMSkKLSBTYW11ZWwgTGlzdG9wYWQgcGF0Y2hlZCBhd2F5IHRoZSBwcm9ibGVtIHdpdGggU1NMIHdlIGdvdCB3aGVuIHNvbWVvbmUgY2FsbAogIGN1cmxfZ2xvYmFsX2luaXQoKSA9PiBjdXJsX2dsb2JhbF9jbGVhbnVwKCkgPT4gY3VybF9nbG9iYWxfaW5pdCgpLiBUaGUKICBzZWNvbmQgaW5pdCB3b3VsZCBub3QgInRha2UiIGFuZCBTU0wgd291bGQgYmUgdW51c2FibGUgd2l0aCBjdXJsIGZyb20gdGhhdAogIHBvaW50LiBUaGlzIGRvZXNuJ3QgY2hhbmdlIHRoZSBmYWN0IHRoYXQgY2FsbGluZyB0aGUgZnVuY3Rpb25zIHRoYXQgd2F5IGlzCiAgd3JvbmcuIGN1cmxfZ2xvYmFsX2luaXQoKSBzaG91bGQgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBhbmQgbm90IG1vcmUuCgpEYW5pZWwgKDEzIE5vdmVtYmVyIDIwMDEpCi0gRml4ZWQgc29tZSBtaW5vciB2YXJpYWJsZSB0eXBlIG1peHVwcyBpbiBmdHAuYyB0aGF0IGNhdXNlZCBjb21waWxlciB3YXJuaW5ncwogIG9uIEhQLVVYIDExLjAwLgoKLSBUaGUgRlRQIGZpeCBJIGRpZCB5ZXN0ZXJkYXkgdXNlZCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHRoYXQgY2F1c2VkCiAgc3B1cmlvdXMgZXJyb3JzIHdoZW4gZG9pbmcgRlRQLgoKVmVyc2lvbiA3LjkuMi1wcmUyCgpEYW5pZWwgKDEyIE5vdmVtYmVyIDIwMDEpCi0gUmljYXJkbyBDYWRpbWUgZmVsbCBvdmVyIGEgbXVsdGlwbGUtcmVxdWVzdHMgcHJvYmxlbSB3aGVuIGZpcnN0IGEgRlRQCiAgZGlyZWN0b3J5IGZldGNoIGZhaWxlZCBhbmQgdGhlbiBhIHNlY29uZCByZXF1ZXN0IGlzIG1hZGUgYWZ0ZXIgdGhhdC4gVGhlCiAgc2Vjb25kIHJlcXVlc3QgaGFwcGVuZWQgdG8gZ2V0IHRoZSBGVFAgc2VydmVyIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUKICBwcmV2aW91cyByZXF1ZXN0LCB3aGVuIGl0IGRpZCBpdHMgaW5pdGlhbCBDV0QgY29tbWFuZC4KCi0gQmpvcm4gUmVlc2UgcG9pbnRlZCBvdXQgdGhhdCB3ZSBjb3VsZCBpbXByb3ZlIHRoZSB0aW1lIGRpZmYgZnVuY3Rpb24gdG8KICBwcmV2ZW50IHRydW5jYXRpb24gYSBiaXQuCgotIEthaS1Vd2UgUm9tbWVsIG1hZGUgbWUgYXdhcmUgdGhhdCAtcCAoaHR0cCBwcm94eSB0dW5uZWwpIHNpbGx5IGVub3VnaCBkaWRuJ3QKICB3b3JrIGZvciBwbGFpbiBIVFRQIHJlcXVlc3RzISBTbyBJIG1hZGUgdGhhdCB3b3JrLgoKVmVyc2lvbiA3LjkuMi1wcmUxCgpEYW5pZWwgKDEyIE5vdmVtYmVyIDIwMDEpCi0gUmV3cm90ZSB0aGUgQ3VybF9Db25uZWN0SFRUUFByb3h5VHVubmVsKCkuIEl0IHNob3VsZCBub3cgbm90IG9ubHkgd29yayBhIGxvdAogIGZhc3RlciwgaXQgc2hvdWxkIGFsc28gc3VwcG9ydCBzdWNoICgiYnJva2VuIikgcHJveGllcyB0aGF0IEpvaG4gTGFzawogIHByZXZpb3VzbHkgaGF2ZSByZXBvcnRlZCBwcm9ibGVtcyB3aXRoLiBIaXMgcHJveHkgc2VuZHMgYSB0cmFpbGluZyB6ZXJvIGJ5dGUKICBhZnRlciB0aGUgZW5kIG9mIHRoZSAocHJveHktKSBoZWFkZXJzLiBJJ3ZlIHRlc3RlZCB0aGlzIG15c2VsZiBhbmQgaXQgc2VlbXMKICB0byB3b3JrIG9uIGEgcHJveHkgdGhlIHByZXZpb3VzIHZlcnNpb24gYWxzbyB3b3JrZWQgd2l0aC4uLiEgVGhpcyByZXdyaXRlIGlzCiAgZHVlIHRvIHRoZSBwcm9ibGVtcyBKb2huIExhc2sgcHJldmlvdXNseSBleHBlcmllbmNlZC4KCi0gQW5kculzIEdhcmPtYSBmb3VuZCBvdXQgd2h5IHRoZSAiY3VycmVudCBzcGVlZCIgbWV0ZXIgc29tZXRpbWVzIHNob3dlZCAyMDQ4SwogIGZvciB2ZXJ5IHF1aWNrIHRyYW5zZmVycy4gSXQgdHVybmVkIG91dCB0aGUgInRpbWUgZGlmZiItZnVuY3Rpb24gcmV0dXJuZWQgYQogIHplcm8gbWlsbGlzZWNvbmQgZGlmZi4gV2Ugbm93IGFsd2F5cyBzYXkgaXQgaXMgYXQgbGVhc3Qgb25lIG1pbGxpc2Vjb25kISBJbgogIHJlYWxpdHksIHRoZXNlIHRpbWVycyB2ZXJ5IHJhcmVseSBoYXZlIHRoYXQgZ29vZCByZXNvbHV0aW9uIHNvIGV2ZW4gdGhvdWdoCiAgdGhlIHRpbWUgZGlmZiB3YXMgbG9uZ2VyIHRoYW4gMSBtaWxsaXNlY29uZCwgaXQgd2FzIHJlcG9ydGVkIGFzIG5vIGRpZmYuCgotIEkgYWxzbyBtb2RpZmllZCB0aGUgZ2V0aW5mbygpIGFnYWluIHdoZW4gcmV0dXJuaW5nIHRpbWVzLCBhcyBQYXVsIEhhcnJpbmd0b24KICByZXBvcnRzIHRoYXQgNy45LjEgb25seSByZXR1cm5zIHRpbWVzIHdpdGggMSBzZWNvbmQgYWNjdXJhY3ksIHdoaWNoIGluZGVlZAogIGlzIHdyb25nLgoKRGFuaWVsICg4IE5vdmVtYmVyIDIwMDEpCi0gTWFyY3VzIFdlYnN0ZXIgZm91bmQgb3V0IHRoYXQgY3VybF9mb3JtYWRkKCkgY291bGQgcmVhZCBvbmUgYnl0ZSBvdXRzaWRlIGEKICBidWZmZXIgYm91bmRhcnksIHdoaWNoIHRoZW4gb2YgY291cnNlIGNvdWxkIGxlYWQgdG8gYSBjcmFzaC4gTWFyY3VzIGFsc28KICBncmFjZWZ1bGx5IHByb3ZpZGVkIGEgcGF0Y2ggZm9yIHRoaXMgdGhpcy4KCi0gR2xlbiBTY290dCByYW4gY29uZmlndXJlIG9uIGhpcyBDb2JhbHQgUXViZSBhbmQgaXQgZGlkbid0IGZpZ3VyZSBvdXQgdGhlCiAgY29ycmVjdCB3YXkgb2YgY2FsbGluZyBnZXRob3N0YnluYW1lX3IoKSBhbmQgdGh1cyBmYWlsZWQgdG8gcmVzb2x2ZSBob3N0cy4KICBUaGlzIGlzIHR3byBlcnJvcnM6IGl0IHNob3VsZG4ndCBjb250aW51ZSB0aGUgY29uZmlndXJlIHNjcmlwdCBpZiBpdCBmaW5kcwogIGdldGhvc3RieW5hbWVfcigpIGJ1dCBjYW4ndCBmaWd1cmUgb3V0IGhvdyB0byB1c2UgaXQsIGFuZCBpdCBzaG91bGQgcmVhbGx5CiAgZmlndXJlIG91dCBob3cgdG8gdXNlIGl0IGFzIGl0IHdhcyBydW5uaW5nIExpbnV4IGFuZCB3ZSBrbm93IGhvdyB0aGF0CiAgd29ya3MuLi4KIApEYW5pZWwgKDcgTm92ZW1iZXIgMjAwMSkKLSBkb2NzL1ZFUlNJT05TIGlzIGEgbmV3IGZpbGUgaW4gdGhlIGFyY2hpdmUgdGhhdCBleHBsYWlucyB0aGUgdmVyc2lvbiBudW1iZXIKICBzeXN0ZW0gd2UgdXNlIGluIHRoZSBjdXJsIHByb2plY3QuCgotIERpZCBzb21lIG1vcmUgZml4ZXMgdGhhdCBub3cgbWFrZXMgbGliY3VybCBvbmx5IGlnbm9yZSBzaWduYWxzIGFzIGxvbmcgYXMKICBpdCBuZWVkcyB0bywgYW5kIHRoZW4gcmVzdG9yZSAoaWYgYW55KSBwcmV2aW91cyBzaWduYWwgaGFuZGxlciBhZ2Fpbi4KCkRhbmllbCAoNiBOb3ZlbWJlciAyMDAxKQotIEVucmlrIEJlcmtoYW4gcG9zdGVkIGJ1ZyByZXBvcnQgIzQ3ODc4MCwgaW4gd2hpY2ggaGUgdmVyeSBjb3JyZWN0bHkgcG9pbnRlZAogIG91dCB0d28gYmFkIHRpbWVvdXQgbWF0dGVycyBpbiBsaWJjdXJsOiB3ZSBkaWRuJ3QgcmVzdG9yZSB0aGUgc2lnYWN0aW9uCiAgc3RydWN0ICh0aGUgYWxhcm0gaGFuZGxlciBmb3IgU0lHQUxSTSkgbm9yIGRpZCB3ZSByZXN0b3JlIHRoZSBwcmV2aW91cwogIGFsYXJtKCkgdGltZW91dCB0aGF0IGNvdWxkJ3ZlIGJlZW4gc2V0IGJ5IGEgInBhcmVudCIgcHJvY2VzcyBvciBzaW1pbGFyLgoKLSBLZXZpbiBSb3RoIG1hZGUgdGhlIGN5Z3dpbiBiaW5hcnkgZ2V0IHN0cmlwcGVkIGJlZm9yZSBpbnN0YWxsLgoKRGFuaWVsICg1IE5vdmVtYmVyIDIwMDEpCi0gRGV0bGVmIFNjaG1pZXIgcmVwb3J0ZWQgdGhhdCBjdXJsIGRpZG4ndCBjb21waWxlIHVzaW5nIFNvbGFyaXMgOCB3aXRoIHRoZQogIG5hdGl2ZSBjYyBjb21waWxlci4gSXQgd2FzIGR1ZSB0byBhIGJhZCBmdW5jdGlvbiBwcm90b3R5cGUuIEZpeGVkIG5vdy4KICBVbmZvcnR1bmF0ZWx5LCBJIGNhbid0IGVuYWJsZSB0aGUgLVdzdHJpY3QtcHJvdG90eXBlcyBpbiBteSBkZWJ1ZyBidWlsZHMKICB0aG91Z2gsIGFzIGdjYyB0aGVuIGNvbXBsYWlucyBsaWtlIGNyYXp5IG9uIE9wZW5TU0wgaW5jbHVkZSBmaWxlcy4uLiA6LSgKCi0gSm9obiBMYXNrIHByb3ZpZGVkIFNTTCBvdmVyIEhUVFAgcHJveHkgZml4ZXMuIFRoZXknbGwgbmVlZCBzb21lIHR3ZWFraW5nCiAgdG8gd29yayBvbiBhbGwgcGxhdGZvcm1zLgoKLSBKb2huIExhc2sgYWRkZWQgdGhlIC0xLy0tVExTdjEgb3B0aW9ucyB0aGF0IGZvcmNlcyBTU0wgaW50byB1c2luZyBUTFMKICB2ZXJzaW9uIDEgd2hlbiBzcGVha2luZyBIVFRQUy4KCi0gSm9obiBMYXNrIGJyb3VnaHQgYSBicmFuZCBuZXcgVkMrKyBtYWtlZmlsZSBmb3IgdGhlIGxpYiBkaXJlY3RvcnksIHRoYXQKICB3b3JrcyBhIGxvdCBiZXR0ZXIgdGhhbiB0aGUgcHJldmlvdXMhCgotIFJhbWFuYSBNb2trYXBhdGkgYnJvdWdodCBzb21lIGNsZXZlciBpbnNpZ2h0cyBvbiB0aGUgTERBUCBmYWlsdXJlcyAoYnVnCiAgcmVwb3J0ICM0NzU0MDcpLCBhbmQgaGlzIHN1Z2dlc3RlZCBjaGFuZ2VzIGFyZSBub3cgYXBwbGllZC4KClZlcnNpb24gNy45LjEKCkRhbmllbCAoNCBOb3ZlbWJlciAyMDAxKQotIEkndmUgYWRkZWQgYSBudW1iZXIgb2YgbmV3IHRlc3QgY2FzZXMgdGhlIGxhc3QgZmV3IGRheXMuIEEgZmV3IG9mIHRoZW0gc2luY2UKICBJIGdvdCByZXBvcnRzIHRoYXQgaGludGVkIG9uIHByb2JsZW1zIG9uIHRpbWVvdXRzLCBzbyBJIGFkZGVkIGZvdXIgdGVzdHMKICB3aXRoIHRpbWVvdXRzIGZvciBhbGwgc29ydHMgb2YgcHJvdG9jb2xzIGFuZCBzdHVmZi4gSSBhbHNvIGNhbWUgdG8gdGhpbmsgb2YKICBhIGZldyBvdGhlciBlcnJvciBzY2VuYXJpb3MgdGhhdCB3ZSBjdXJyZW50bHkgZGlkbid0IHRlc3QgcHJvcGVybHksIHNvIEkKICB3cm90ZSB1cCB0ZXN0cyBmb3IgYSBmZXcgb2YgdGhvc2UgdG9vLgoKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDEpCi0gUmVwbGFjZWQgcmVhZCgpIGFuZCB3cml0ZSgpIHdpdGggcmVjdigpIGFuZCBzZW5kKCkgZm9yIHNvY2tldCBvcGVyYXRpb25zCiAgZXZlbiB1bmRlciBub3JtYWwgdW5peGVzLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDEpCi0gV2hlbiBhbiBGVFAgdHJhbnNmZXIgd2FzIGFib3J0ZWQgZHVlIHRvIGEgdGltZW91dCwgaXQgd2Fzbid0IHJlYWxseSBhd2FyZSBvZgogIGhvdyBtYW55IGJ5dGVzIHRoYXQgaGFkIGJlZW4gdHJhbnNmZXJyZWQgYW5kIHRoZSBlcnJvciB0ZXh0IGFsd2F5cyBzYWlkIDAKICBieXRlcy4gSSBtb2RpZmllZCB0aGlzIHRvIG91dHB1dCB0aGUgYWN0dWFsbHkgdHJhbnNmZXJyZWQgYW1vdW50ISA6LSkKCi0gVGhlIEZUUCBmaXhlcyBpbiBwcmU3IGRpZG4ndCBjb21waWxlIG9uIElQdjYgZW5hYmxlZCBob3N0cy4gRG9lcyBub3cuIEkgYWxzbwogIGFkZGVkIG1vcmUgY29tbWVudHMgaW4gdGhlIGxpYi9mdHAuYyBzb3VyY2UgZmlsZS4KCi0gTWlub3IgdXBkYXRlcyB0byB0aGUgRkFRLCBhZGRlZCBhIGJyYW5kIG5ldyBzZWN0aW9uIHRvIHRoZSB3ZWIgc2l0ZSBhYm91dAogIHRoZSBuYW1lIGlzc3VlICh3aG8gb3ducyAiY3VybCI/IHdpbGwgc29tZW9uZSBzdWUgdXM/IGV0YyBldGMpOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbGVnYWwvdGhlbmFtZS5odG1sCgpWZXJzaW9uIDcuOS4xLXByZTcKCkRhbmllbCAoMzEgT2N0b2JlciAyMDAxKQotIFRoZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIHRpbWVycyBhY2NpZGVudGFsbHkgbG9zdCB0aGVpciBzdWJzZWNvbmQgYWNjdXJhY3kgYXMKICB0aGUgY2FsY3VsYXRpb25zIHVzZWQgbG9uZ3MgaW5zdGVhZCBvZiBkb3VibGVzISBQYXVsIEhhcnJpbmd0b24gcmVwb3J0ZWQuCgotIFRoZSBTU0wgU29ja2V0SXNEZWFkKCkgY2hlY2tzIHdlcmVuJ3QgZ29vZCBlbm91Z2ggKGFzIGV4cGVjdGVkIHJlYWxseSksIHNvIEkKICBoYWQgdG8gYWRkIGEgZ2VuZXJpYyBpbnRlcm5hbCB0cnktaXQtb3V0IHN5c3RlbS4gSWYgdGhlIHJlcXVlc3Qgb24gYSByZS11c2VkCiAgY29ubmVjdGlvbiBzZWVtcyB0byBmYWlsLCB0aGVuIHdlIGdvIGJhY2sgYW5kIGdldCBhIG5ldyAoZnJlc2gpIGNvbm5lY3Rpb24KICBhbmQgcmUtdHJpZXMgdGhlIHJlcXVlc3Qgb24gdGhhdCBpbnN0ZWFkLiBJdCBraW5kIG9mIG1ha2VzIHRoZQogIFNvY2tldElzRGVhZCgpIGNoZWNrIG9ic29sZXRlLCBidXQgSSB0aGluayBpdCBpcyBhIHF1aWNrZXIgd2F5IGZvciB0aG9zZQogIGNhc2VzIHdoZXJlIGl0IGFjdHVhbGx5IGRpc2NvdmVycyB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIGRlYWQuCgotIFdoZW4gZml4aW5nIHRoZSBhYm92ZSwgSSBub3RpY2VkIHRoYXQgd2UgZGlkIHF1aXRlIGEgZmV3IHdyaXRlcyB0byBzb2NrZXRzCiAgaW4gbGliY3VybCB3aGVyZSB3ZSBkaWRuJ3QgY2hlY2sgdGhlIHJldHVybiBjb2RlICh0aGF0IGl0IGFjdHVhbGx5IHdvcmtlZCB0bwogIHNlbmQgdGhlIGRhdGEpLiBXaXRoIHRoZSBuZXcgImF0dGVtcHRlZCByZXF1ZXN0IiBzeXN0ZW0gd2UgbXVzdCBkZXRlY3QgdGhvc2UKICBzaXR1YXRpb25zIHNvIEkgd2VudCBvdmVyIGEgYnVuY2ggb2YgZnVuY3Rpb25zLCBjaGFuZ2VkIHJldHVybiB0eXBlcyBhbmQKICBhZGRlZCBjaGVja3MgZm9yIHdoYXQgdGhleSBhY3R1YWxseSByZXR1cm4uCgpWZXJzaW9uIDcuOS4xLXByZTYKCkRhbmllbCAoMzEgT2N0b2JlciAyMDAxKQotIFBhdWwgSGFycmluZ3RvbiBkZXRlY3RlZCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0YW50IFNTTCBjb25uZWN0aW9ucy4gT3IgdG8gYmUKICBtb3JlIGV4YWN0LCB3ZSBkaWRuJ3QgcHJvcGVybHkgZGV0ZWN0IHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzIGRlYWQgYW5kIHRoZW4KICBhIHNlY29uZCBjb25uZWN0aW9uIHdvdWxkIHRyeSB0byByZS11c2UgaXQgd3JvbmdseS4gVGhlIHNvbHV0aW9uIHRvIHRoaXMKICBwcm9ibGVtIGlzIHN0aWxsIG5vdCB2ZXJ5IGNsZWFyIGFuZCBJJ20gd29ya2luZyBvbiBpdC4gT25lIE9wZW5TU0wgaW5zaWRlcgogIHNhaWQgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgaWYgdGhlIFNTTCBjb25uZWN0aW9uIGlzIGFsaXZlIG9yIG5vdCB3aXRob3V0CiAgYWN0dWFsbHkgdHJ5aW5nIGFuIG9wZXJhdGlvbi4KCkRhbmllbCAoMzAgT2N0b2JlciAyMDAxKQotIElmIGEgY29va2llIHdhcyByZWFkIGZyb20gYSBmaWxlLCBpdCBjb3VsZCBhY2NpZGVudGFsbHkgc3RyZHVwKCkgYSBOVUxMCiAgcG9pbnRlci4gUGF1bCBIYXJyaW5ndG9uIHJlcG9ydGVkLiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL2Nvb2tpZS5jLmRpZmY/cjE9MS4yNSZyMj0xLjI2XQoKLSBUaGUgTUFOVUFMIGZpbGUgbm93IGRvY3VtZW50cyAtdCBjb3JyZWN0bHkuIEkgYWxzbyBmaXhlZCB0aGUgLVQgZGVzY3JpcHRpb24KICBpbiB0aGUgY3VybC4xIG1hbiBwYWdlLgoKRGFuaWVsICgyOSBPY3RvYmVyIDIwMDEpCi0gSm9obiBKYW5zc2VuIGZvdW5kIG91dCB0aGF0IGN1cmxfZm9ybWFkZCB3YXMgbWlzc2luZyBpbiB0aGUgbGliY3VybC5kZWYgZmlsZQogIGFuZCB0aGF0IHRoZSBkb2NzIHN0YXRlZCB0aGUgd3JvbmcgcmV0dXJuIHR5cGUgZm9yIHRoZSBmdW5jdGlvbi4KCi0gQW5kculzIEdhcmPtYSBmb3VuZCBhIGJ1ZyB3aXRoIG11bHRpcGxlIGZpbGVzIGluIHRoZSBjdXJsX2Zvcm1hZGQoKSBmdW5jdGlvbiwKICB0aGF0IEkgcmVtb3ZlZCB3aXRoIHRoaXMgcGF0Y2ggW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9mb3JtZGF0YS5jLmRpZmY/cjE9MS4yNSZyMj0xLjI2XS4KCi0gS2V2aW4gUm90aCBicm91Z2h0IGFub3RoZXIgcGF0Y2ggdGhhdCBtb3ZlZCB0aGUgY3lnd2luIHBhY2thZ2UgZmlsZXMgdG8gdGhlCiAgcGFja2FnZXMvV2luMzIvY3lnd2luIGRpcmVjdG9yeS4KCi0gQSBidWcgaW4gdGhlIGNvbm5lY3Rpb24gcmUtdXNlIGxvZ2ljIG1hZGUgcmVwZWF0ZWQgcmVxdWVzdHMgdG8gdGhlIHNhbWUgRlRQCiAgc2VydmVyICh3aGVuIHVzaW5nIG5hbWUrcGFzd29yZCBpbiB0aGUgVVJMKSBzb21ldGltZXMgdXNlIG1vcmUgdGhhbiBvbmUKICBjb25uZWN0aW9uLiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL3VybC5jLmRpZmY/cjE9MS4xNjYmcjI9MS4xNjddCgotIE1vb25lc2FteSB0cmFja2VkIGRvd24gYW5kIGZpeGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBuZXcgNy45LjEgY29ubmVjdAogIGNvZGUuIFRoaXMgY29ycmVjdGVkIHRoZSBlcnJvciBLZXZpbiBSb3RoIHJlcG9ydGVkIG9uIHRoZSA3LjkuMS1wcmU1IHJlbGVhc2UKICAodGVzdCAxOSkuLi4KICBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL2Nvbm5lY3QuYy5kaWZmP3IxPTEuMTMmcjI9MS4xNF0KCkRhbmllbCAoMjYgT2N0b2JlciAyMDAxKQotIEFkZGVkIHRlc3QyOCB3aGljaCB2ZXJpZmllcyB0aGF0ICJMb2NhdGlvbjoiLWZvbGxvd2luZyB3b3JrcyBldmVuIGlmIHRoZQogIGNvbnRlbnRzIGlzIHNlcGFyYXRlZCB3aXRoIG1vcmUgdGhhbiBvbmUgc3BhY2UuCgpEYW5pZWwgKDI1IE9jdG9iZXIgMjAwMSkKLSBSYW1hbmEgTW9ra2FwYXRpIHBvaW50ZWQgb3V0IHRoYXQgTERBUCB0cmFuc2ZlcnMgd291bGQgJ2hhbmcnIGFmdGVyIHRoZQogIGNvcnJlY3QgZGF0YSBoYXMgYmVlbiBvdXRwdXQuCgpWZXJzaW9uIDcuOS4xLXByZTUKCkRhbmllbCAoMjQgT2N0b2JlciAyMDAxKQotIFQuIEJoYXJhdGggZm91bmQgYSBtZW1vcnkgbGVhayBpbiB0aGUgY29va2llIGVuZ2luZS4gV2hlbiB3ZSB1cGRhdGUgYSBjb29raWUKICB0aGF0IHdlIGFscmVhZHkga25ldyBhYm91dCwgd2UgbG9zdCBhIGNodW5rIG9mIG1lbW9yeSBpbiB0aGUgcHJvZ3Jlc3MuLi4gVGhlCiAgYnJhbmQgbmV3IHRlc3QgY2FzZSAyNyBub3cgdGVzdHMgZm9yIHRoaXMgb2NjdXJyZW5jZS4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9jb29raWUuYy5kaWZmP3IxPTEuMjQmcjI9MS4yNV0KCkRhbmllbCAoMjMgT2N0b2JlciAyMDAxKQotIHBhY2tfaG9zdGVudCgpIGRpZG4ndCBwcm9wZXJseSBhbGlnbiBzb21lIHBvaW50ZXJzLCBzbyBhdCBsZWFzdCBTUEFSQyBDUFVzCiAgd291bGQgY29yZS4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9ob3N0aXAuYy5kaWZmP3IxPTEuMzQmcjI9MS4zNV0KCkRhbmllbCAoMjIgT2N0b2JlciAyMDAxKQotIFRvbSBCZW5vaXN0IHJlcG9ydGVkIHRoYXQgdGhpcyBTR0kgSVJJWCBjb21waWxlciBkaWRuJ3QgaGFuZGxlIGluZGVudGVkCiAgcHJlcHJvY2Vzc29yIGluc3RydWN0aW9ucywgc28gdGhleSdyZSBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBjb2RlIQoKLSBBcHBsaWVkIEtldmluIFJvdGgncyBwYXRjaGVzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIGN5Z3dpbiBwYWNrYWdlcyBmcm9tCiAgdGhlIG91dC1vZi10aGUtYm94IGN1cmwgcmVsZWFzZSBhcmNoaXZlcy4KCi0gSSBmb3Jnb3QgdG8gbWVudGlvbiBpdCBiZWxvdywgYnV0IGxpYmN1cmwgbm93IGNsb3NlcyBjb25uZWN0aW9ucyB0aGF0IHJlcG9ydAogIHRyYW5zZmVyIGZhaWx1cmVzLiBVbmNvbmRpdGlvbmFsbHkuIFRoaXMgY291bGQgYmUgbWFkZSBtb3JlIG5pY2VseSBpbiB0aGUKICBmdXR1cmUgaWYgd2Ugc2V0IGEgZmxhZyBvciBzb21ldGhpbmcgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBnb29kIHRvIGJlCiAgdXNlZCBmb3IgdGhlIGVycm9ycyB0aGF0IGtub3cgdGhhdCBmb3IgYSBmYWN0LiBXZSBoYXZlIHRvIGNsb3NlIHRoZQogIGNvbm5lY3Rpb24gZm9yIHRoZSBjYXNlcyB3aGVyZSB3ZSBhYm9ydCBmb3IgZXhhbXBsZSBhIEhUVFAgdHJhbnNmZXIgaW4gdGhlCiAgbWlkZGxlLCBvciBvdGhlcndpc2Ugd2UgbWlnaHQgcmUtdXNlIHRoYXQgY29ubmVjdGlvbiBsYXRlciB3aXRoIGxvdHMgb2YgZGF0YQogIHN0aWxsIGJlaW5nIHNlbnQgdG8gdXMgb24gaXQuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvdHJhbnNmZXIuYy5kaWZmP3IxPTEuNjMmcjI9MS42NF0KCkRhbmllbCAoMTkgT2N0b2JlciAyMDAxKQotIENVUkxFX0dPVF9OT1RISU5HIGlzIG5vdyByZXR1cm5lZCB3aGVuIGEgSFRUUCBzZXJ2ZXIgZG9lc24ndCByZXR1cm4KICBhbnl0aGluZywgbm90IGV2ZW4gYSBoZWFkZXIuIHRlc3QgY2FzZSAzNyB3YXMgYWRkZWQgdG8gdGVzdCBmb3IgdGhpcy4KCi0gVC4gQmhhcmF0aCBtYWRlIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSBwcm9wZXJseSBjbG9uZSB0aGUgY29va2llIHN0YXR1cyBhcwogIHdlbGwuCgpWZXJzaW9uIDcuOS4xLXByZTQKCkRhbmllbCAoMTggT2N0b2JlciAyMDAxKQotIENVUkxPUFRfRkFJTE9ORVJST1IsIHNldCB3aXRoICJjdXJsIC0tZmFpbCIgbm8gbG9uZ2VyIHJldHVybnMgYW4gZXJyb3IgaWYKICB0aGUgSFRUUCByZXR1cm4gY29kZSBpcyBiZWxvdyA0MDAuCgpEYW5pZWwgKDE3IE9jdG9iZXIgMjAwMSkKLSBUaGUgdGVzdCBzdWl0ZSBub3cga2lsbHMgYW55IHJ1bm5pbmcgdGVzdCBodHRwIHNlcnZlciB3aGVuIHlvdSByZS1zdGFydCB0aGUKICB0ZXN0cy4KCi0gV2UgaGFkIHRvIHJlbW92ZSAndXNlIHN0cmljdCcgZnJvbSB0d28gcGVybCBzY3JpcHRzLCBhcyB0aGUgY3lnd2luCiAgYWRqdXN0bWVudHMgZGlkbid0IHBsYXkgbmljZWx5IG90aGVyd2lzZSBmb3Igc29tZSByZWFzb24uIEFueSBwZXJsIHdpemFyZAogIG91dCB0aGVyZSB3aG8gY2FuIHB1dCB0aGUgc2NyaWN0IGJhY2sgYW5kIHN0aWxsIG1ha2UgaXQgcnVuIGdvb2Qgb24gdW5peCBhbmQKICBjeWd3aW4/CgotIEEgcG90ZW50aWFsIG1lbW9yeSBsZWFrIHBvaW50ZWQgb3V0IHRvIHVzIGJ5IFlhbmljayBQZWxsZXRpZXIgd2FzIHJlbW92ZWQuCiAgSXQgd291bGQgb2NjdXIgd2hlbiBhIGh0dHAgZmlsZSB0cmFuc2ZlciBmYWlscy4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi90cmFuc2Zlci5jLmRpZmY/cjE9MS42MCZyMj0xLjYxXQoKLSBUaGUgbWVtb3J5IGRlYnVnZ2luZyBzeXN0ZW0gc2hvdWxkIG5vIGxvbmdlciBkaXNwbGF5IGFueXRoaW5nIHRvIHN0ZGVycgogIGlmIHRoZSBjdXJsX21lbWRlYnVnKCkgaGFzbid0IGJlZW4gdXNlZCB0byBleHBsaWNpdGx5IHNheSBzby4gVGhpcyBtYWtlcyBpdAogIGVhc2llciB0byB1c2UgdGhlIG1lbW9yeSBkZWJ1ZyBzeXN0ZW0gYW5kIHN3aXRjaCB0aGUgbG9nZ2luZyBvbi9vZmYuCgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwMSkKLSBLZXZpbiBSb3RoIHByb3ZpZGVkIGZpeGVzIGZvciBidWlsZGluZyBjdXJsIG5pY2VyIGluIGN5Z3dpbiBlbnZpcm9ubWVudHMuCgpEYW5pZWwgKDEyIE9jdG9iZXIgMjAwMSkKLSBDbGVhbmluZyB1cCB0aGUgcHJvZ3Jlc3MgbWV0ZXIvaW5mbyBjb2RlLiBUaGUgImN1cnJlbnQgc3BlZWQiIGlzIG5vdyBtb3JlCiAgYWNjdXJhdGUgdGhhbiBiZWZvcmUgYXMgd2Ugbm93IHVzZSB0aGUgdHJ1ZSB0aW1lIHNwZW50IGJldHdlZW4gdGhlIG1lYXN1cmVzLAogIGFuZCBub3QganVzdCAiYXNzdW1pbmciIGV2ZXJ5LXNlY29uZC11cGRhdGUgbGlrZSBiZWZvcmUuIFRoZSBvdXRwdXQgc2hvdWxkCiAgbm93IGFsc28gYmUgb2YgdGhlIHNhbWUgd2lkdGggYXQgYWxsIHRpbWVzLCBuZXZlciB0byBzaG93ICJleHRyYSIgemVyb2VzIG9uCiAgdGhlIHJpZ2h0IGVkZ2UuCgotIEFmdGVyIHRhbGtpbmcgYWJvdXQgcG9zc2libGUgTG9jYXRpb246IGJ1Z3Mgb24gdGhlIG1haWxpbmcgbGlzdCwgSSBtb2RpZmllZAogIHRoZSAiYWJzb2x1dGUgVVJMIiBjaGVja2VyIGluIGxpYi90cmFuc2Zlci5jIHRvIGJlIG1vcmUgc3RyaWN0IHdoZW4gY2hlY2tpbmcKICBpZiB0aGUgcmVkaXJlY3RlZCBVUkwgaXMgYWJzb2x1dGUuCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwMSkKLSBLZXZpbiBSb3RoIHByb3ZpZGVkIHBhdGNoZXMgdGhhdCBtYWtlIHRoZSB0ZXN0IHN1aXRlIHJ1biBmaW5lIG9uIFdpbmRvd3MKICAyMDAwIHJ1bm5pbmcgY3lnd2luLgoKRGFuaWVsICgxMCBPY3RvYmVyIDIwMDEpCi0gU2V0dGluZyB0aGUgLWMgb3IgdGhlIENVUkxPUFRfQ09PS0lFSkFSIG9wdGlvbiBub3cgZW5hYmxlcyB0aGUgY29va2llIHBhcnNlci4KICBQcmV2aW91c2x5IC1iIG9yIENVUkxPUFRfQ09PS0lFRklMRSB3YXMgYWxzbyByZXF1aXJlZCBmb3IgdGhlIGphciB0byB3b3JrLgoKVmVyc2lvbiA3LjkuMS1wcmUzCgpEYW5pZWwgKDkgT2N0b2JlciAyMDAxKQotIEFkZGVkIGEgbmV3IG9wdGlvbiB0byB0aGUgY29tbWFuZCBsaW5lIGNsaWVudDogLTAvLS1odHRwMS4wLiBJdCB1c2VzIHRoZSBuZXcKICBsaWJjdXJsIG9wdGlvbiBDVVJMT1BUX0hUVFBfVkVSU0lPTiB0byByZXF1ZXN0IHRoYXQgbGliY3VybCB1c2VzIEhUVFAgMS4wCiAgcmVxdWVzdHMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB2ZXJzaW9uICgxLjEpLiBJdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdQogIHJlYWxseSBNVVNUIGRvIHRoYXQgYmVjYXVzZSBvZiBhIHNpbGx5IHJlbW90ZSBzZXJ2ZXIuCgotIFJlbmFtZWQgdGhlICdUaW1lQ29uZCcgdHlwZWRlZiBpbiBjdXJsL2N1cmwuaCB0byB1c2UgYSAnY3VybF8nIHByZWZpeCBhcwogIGFsbCBwdWJsaWMgY3VybC1zeW1ib2xzIHNob3VsZC4KCi0gbGliY3VybCBub3cgZXhwbGljaXRseSBpZ25vcmVzIHRoZSBTSUdQSVBFIHNpZ25hbC4KCkRhbmllbCAoOCBPY3RvYmVyIDIwMDEpCi0gS2V2aW4gUm90aCdzIGNoYW5nZSB0byB0aGUgY29va2llLWphciBjb21tZW50IChpbiB0aGUgc3RvcmVkIGZpbGUpIHdhcwogIGFwcGxpZWQuCgotIEx1Y2FzIEFkYW1za2kncyBtaW5vciBidWcgaW4gdGhlIGJpbmQgZXJyb3IgY29kZSBmYWlsZigpIHdhcyBmaXhlZC4KCkRhbmllbCAoNSBPY3RvYmVyIDIwMDEpCi0gTW9vbmVzYW15IGZpeGVkIHRoZSBDdXJsX2Nvbm5lY3Rob3N0KCkgZnVuY3Rpb24gdG8gbm90IGdpdmUgY29tcGlsZXIgZXJyb3JzCiAgb24gYSBidW5jaCBvZiBjb21waWxlcnMsIGR1ZSB0byB0aGUgYXJndW1lbnQgbmFtZWQgJ3NvY2tldCcuCgotIE1vb25lc2FteSBhbHNvIHByb3ZpZGVkIHVwZGF0ZWQgVkMrKyBtYWtlZmlsZXMgYW5kIHByb2plY3QgZmlsZXMuCgpWZXJzaW9uIDcuOS4xLXByZTIKCkRhbmllbCAoNCBPY3RvYmVyIDIwMDEpCi0gQWxiZXJ0IENoaW4gcHJvdmlkZWQgYSBjb25maWd1cmUgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgc2NyaXB0IGRldGVjdCBwcm9wZXIKICBnZXRob3N0YnluYW1lX3IoKSBtZXRob2Qgd2l0aG91dCBhY3R1YWxseSBydW5uaW5nIGFueSBjb2RlLCBvbmx5IGNvbXBpbGluZwogIGlzIG5lY2Vzc2FyeS4gVGhpcyBhbHNvIHJlbW92ZXMgdGhlIG5lZWQgb2YgaGF2aW5nIGEgcmVzb2x2aW5nICdsb2NhbGhvc3QnCiAgbmFtZS4KCi0gRm91bmQgYW5kIHJlbW92ZWQgbWVtb3J5IGxlYWthZ2UgKG5hbWUgcmVzb2x2ZSBkYXRhKSBpbiBsaWJjdXJsIG9uCiAgSVB2Ni1lbmFibGVkIGhvc3RzLiBUaGVzZSBjb3VsZCBzbmVhayB0aHJvdWdoIGJlY2F1c2Ugd2UgZGlkbid0IGhhdmUgYW55CiAgcmVzb3VyY2UgdHJhY2luZyBvbiB0aGUgSVB2Ni1yZWxhdGVkIGZ1bmN0aW9ucy4gV2UgZG8gbm93LgoKRGFuaWVsICgzIE9jdG9iZXIgMjAwMSkKLSBLZWl0aCBNY0d1aWdhbiBwYXRjaGVkIGF3YXkgYSAobWFpbmx5IFdpbmRvd3MtKSBwcm9ibGVtIHdpdGggdGhlIG5hbWUKICByZXNvbHZlciBkYXRhIGJlaW5nIGtlcHQgaW4gdGhlIHN0YXRpYyBtZW1vcnkgYXJlYSwgd2hpY2ggaXMgcmVtb3ZlZCB3aGVuIGEKICB0aHJlYWQgaXMga2lsbGVkLiBUaGUgY3VybCBoYW5kbGUgaXRzZWxmIHRob3VnaCBwZXJmZWN0bHkgaGFuZGxlcyBiZWluZwogIHBhc3NlZCBiZXR3ZWVuIHRocmVhZHMuCgotIERpcmsgRWRkZWxidWV0dGVsIHJlcG9ydGVkIGFuIG9kZCBidWcgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIGhpcyBwcm94eSB0aGF0CiAgcmVxdWlyZWQgYW4gQXV0aG9yaXphdGlvbjogaGVhZGVyLiBOb3csIHByb3hpZXMgYXJlIG5vdCBzdXBwb3NlZCB0byByZXF1aXJlCiAgdGhhdCBoZWFkZXIsIHRoYXQgaXMgZm9yIHRydWUgc2VydmVycy4uLgoKLSBJIGFjY2lkZW50YWxseSBydWluZWQgR2VvcmcncyBjdXJsX2Zvcm1hZGQoKS4gVWgsIGJhZCBtZS4gQ29ycmVjdGVkIG5vdy4KClZlcnNpb24gNy45LjEtcHJlMQoKRGFuaWVsICgzIE9jdG9iZXIgMjAwMSkKLSBHZW9yZyBIdWV0dGVuZWdnZXIgb25jZSBhZ2FpbiBtYWRlIGFuIGVmZm9ydCBiZXlvbmQgdGhlIGNhbGwgb2YgZHV0eSBhbmQgbm90CiAgb25seSBpbXByb3ZlZCB0aGUgY3VybF9mb3JtYWRkKCkgZnVuY3Rpb24sIGJ1dCBhbHNvIHRvb2sgY2FyZSBvZiBhZGp1c3RpbmcKICB0aGUgY3VybCBjb21tYW5kIGxpbmUgY2xpZW50IHRvIHVzZSB0aGlzIG5ldyBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZQogIG9ic29sZXRlZCBjdXJsX2Zvcm1wYXJzZS4KCkRhbmllbCAoMiBPY3RvYmVyIDIwMDEpCi0gTWFqb3IgZml4IGluIGhvdyBsaWJjdXJsIGRvZXMgVENQIGNvbm5lY3RzLiBJdCBub3cgZG9lcyBub24tYmxvY2tpbmcKICBjb25uZWN0cyB0byBlbmFibGUgZ29vZCB0aW1lb3V0cyB3aXRob3V0IHNpZ25hbHMsIGFuZCBpdCBub3cgdHJpZXMgYWxsIElQCiAgYWRkcmVzc2VzIGZvciBhbnkgZ2l2ZW4gaG9zdCAoaWYgaXQgcmVzb2x2ZXMgbW9yZSB0aGFuIG9uZSBhbmQgdGhlIGZpcnN0CiAgb25lKHMpIGRvbid0IGNvbm5lY3QpLiBBZGRlZCBhIG5ldyBzb3VyY2UgZmlsZSAnY29ubmVjdC5jJyB0byBkZWFsIHdpdGggYWxsCiAgdGhlIFRDUCBjb25uZWN0IHN0dWZmLgoKLSBXZSBub3cgc3VwcG9ydCBJUHY0LXN0eWxlIElQLWFkZHJlc3NlcyBpbiByZmMyNzMyLWZvcm1hdCwgdG8gYmV0dGVyIHN1cHBvcnQKICBwZW9wbGUgd3JpdGluZyBzY3JpcHRzIHdpdGhvdXQga25vd2luZyB3aGF0IGFkZHJlc3MgdGhlcmUgaXMuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAxKQotIENsZWFudXBzIGluIHRoZSBGVFAgc291cmNlIGNvZGUuIERpdmlkZWQgdGhlIGNvZGUgaW50byBldmVuIG1vcmUgc21hbGxlcgogIGZ1bmN0aW9ucyBhbmQgZ2VuZXJhbGx5IHRyaWVkIHRvIG1ha2UgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gSVB2NCBhbmQgSVB2NgogIGdldCBsZXNzIG5vdGljYWJsZSBpbiB0aGUgc291cmNlcy4KCi0gSWYgdGhlIHJlbW90ZSBmaWxlIHRpbWUgaXMgbm90IHJlYWRhYmxlL2FjY2Vzc2FibGUvdW5kZXJzdG9vZCBieSBsaWJjdXJsLAogIGxpYmN1cmwgbm93IHJldHVybnMgLTEgaW4gdGhlIENVUkxJTkZPX0ZJTEVUSU1FIGRhdGEsIG5vdCAwIGFzIGl0IHByZXZpb3VzbHkKICBkaWQuIFRoaXMgc2hvdWxkIG1ha2UgY3VybCBub3QgdG91Y2ggdGhlIGZpbGUgZGF0YSB1bmxlc3MgdGhlcmUgd2FzIGEga25vd24KICByZW1vdGUgZGF0ZSB3aGVuIC1SIGlzIHVzZWQuCgpEYW5pZWwgKDI3IFNlcHRlbWJlciAyMDAxKQotIFdvcmtpbmcgb24gZ2V0dGluZyBub24tYmxvY2tpbmcgY29ubmVjdHMgd29ya2luZyBwbGF0Zm9ybSBpbmRlcGVuZGVudC4gV2UKICB3aWxsIGFsc28gbWFrZSBjdXJsIHRyeSBhbGwgSVBzIGZvciBhIGdpdmVuIGhvc3QgaWYgdGhlIGZpcnN0IG9uZSBzaG91bGQKICBmYWlsLgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIgMjAwMSkKLSBLZXZpbiBSb3RoIHByb3ZpZGVkIGEgY29va2llIGV4YW1wbGUgdGhhdCBwcm92ZWQgdGhlIGNvb2tpZSBqYXIKICBmdW5jdGlvbmFsaXR5IHdhc24ndCB3b3JraW5nIHByb3Blcmx5LiBJIGFkZGVkIHRlc3QgY2FzZSA0NiBhbmQgbWFkZSBpdAogIHdvcmsuCgpEYW5pZWwgKDI1IFNlcHRlbWJlciAyMDAxKQotIEr2cm4gSGFydHJvdGggdXBkYXRlZCB0aGUgbWluZ3czMiBtYWtlZmlsZXMuCgpWZXJzaW9uIDcuOQoKRGFuaWVsICgyMyBTZXB0ZW1iZXIgMjAwMSkKLSBGb3VuZCBhbmQgcmVtb3ZlZCBhICdzb2NrZXQgbGVhaycgdGhhdCB3b3VsZCBvY2N1ciBvbiBJUHY2IGVuYWJsZWQgaG9zdHMKICB3aGVuIEZUUCBSRVRSIGZhaWxlZC4KCi0gTWFkZSB0aGUgRlRQIHVwbG9hZCB0ZXN0cyBydW4gZmluZSBvbiBtYWNoaW5lcyB3aXRoIElQdjYgZW5hYmxlZC4KClZlcnNpb24gNy45LXByZTgKCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDEpCi0gVm9qdGVjaCBNaW5hcmlrIHNldCB1cCBhIHNwZWNpYWwtcHVycG9zZSB0ZXN0IHNlcnZlciBhbmQgcHJvdmlkZWQgbWUgd2l0aAogIHRlc3QgY2VydGlmaWNhdGVzIGluIG9yZGVyIGZvciBtZSB0byByZXBlYXQgdGhlIGJ1ZyByZXBvcnRzICM0NDAwNjggYW5kCiAgIzQ0MDM3My4gSXQgdHVybmVkIG91dCB3ZSBkaWRuJ3QgY2hlY2sgYWxsIHRoZSBlcnJvciBjb2RlcyBwcm9wZXJseS4gV2UgZG8KICBub3csIGFuZCBjb25uZWN0aW5nIHdpdGggYSB1bmFjY2VwdGFibGUgY2VydGlmaWNhdGUgd2lsbCBtYWtlIGxpYmN1cmwgZmFpbAogIHRvIGNvbm5lY3Qgd2l0aCBhbiBlcnJvciBjb2RlIHJldHVybmVkLgoKLSBSYW1hbmEgTW9ra2FwYXRpIGZvdW5kIGEgY2FzZSB3aGVuIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIGNvZGUgZGlkIHdyb25nLgogIEkgd3JvdGUgYSB0ZXN0IGNhc2UgZm9yIHRoaXMgKDQ1KS4KClZlcnNpb24gNy45LXByZTcKCkRhbmllbCAoMTcgU2VwdGVtYmVyIDIwMDEpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBmaXhlZCB0ZWxuZXQgZm9yIHdpbjMyLiBJdCBtYWtlcyBsaWJjdXJsIHJlcXVpcmUKICB3aW5zb2NrIDIuMC4KClZlcnNpb24gNy45LXByZTYKCi0gbGlidG9vbCAxLjQuMiBpcyBub3cgaW4gdXNlIQoKVmVyc2lvbiA3LjktcHJlNQoKRGFuaWVsICgxNCBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCBhbm90aGVyIDE0IGZ0cCB0ZXN0cy4KCkRhbmllbCAoMTMgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHRvIHRoZSBlYXN5LmggaGVhZGVyIGZpbGUuIEl0IGhhcyBub3cgYmVlbgogIHRlc3RlZCBhbmQgcHJvdmVkIHRvIHdvcmsgaW4gYSByZWFsLXdvcmxkIHRlc3RzIGJ5IFQgQmhhcmF0aC4gV2Ugc3RpbGwgbmVlZAogIHRvIHdyaXRlIHVwIHNvbWUgZG9jcyBmb3IgdGhpcyBmdW5jdGlvbi4KCi0gQWRkZWQgZm91ciBtb3JlIGZ0cCB0ZXN0cyB0byB0aGUgdGVzdCBzdWl0ZS4KCkRhbmllbCAoMTIgU2VwdGVtYmVyIDIwMDEpCi0gQ1VSTE9QVF9TU0xfQ0lQSEVSX0xJU1Qgd2FzIGFkZGVkLCBhbmQgdGhlIGN1cmwgdG9vbCBvcHRpb24gaXMgbmFtZWQKICAtLWNpcGhlcnMuIFVzZSB0aGVtIHRvIHNwZWNpZnkgYSBsaXN0IG9mIGNpcGhlcnMgdG8gdXNlIGluIHRoZSBTU0wKICBjb25uZWN0aW9uLgoKLSBULiBCaGFyYXRoIGZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gbGliY3VybCdzIHdpbmRvd3MgdmVyc2lvbi4gSXQgdHVybmVkIG91dAogIHRvIGJlIHRoZSBuZXcgZHVwaGFuZGxlKCkgdGhhdCBkaWRuJ3QgcXVpdGUgd29yayB5ZXQuCgpWZXJzaW9uIDcuOS1wcmU0CgpEYW5pZWwgKDExIFNlcHRlbWJlciAyMDAxKQotIEFkZGVkIHZlcmJvc2Ugb3V0cHV0IGZvciBTU0wgY29ubmVjdGlvbnMgdGhhdCBvdXRwdXQgdGhlIHNlcnZlcgogIGNlcnRpZmljYXRlJ3Mgc3RhcnQgYW5kIGV4cGlyZSBkYXRlcy4gQXMgc3VnZ2VzdGVkIGJ5IFBhdWwgSGFycmluZ3Rvbi4KCi0gSGVpa2tpIEtvcnBlbGEgZm91bmQgcHJvYmxlbXMgaW4gdGhlIHBlcmwgZnRwIHNlcnZlciB1c2VkIGZvciB0aGUgdGVzdAogIHN1aXRlLCB3aGVuIGhlIHJ1bnMgb24gb24gT3BlbkJTRCB3aXRoIHBlcmwgNS42LiBTb21lIGNoYW5nZXMgaGF2ZSBiZWVuCiAgbWFkZSwgYnV0IG5vdGhpbmcgcmVhbGx5IGNlcnRhaW4uCgotIFQuIEJoYXJhdGggaGFzIGV4cGVyaWVuY2VkIHByb2JsZW1zIHdpdGggbGliY3VybCdzIHN0YWNrIHVzYWdlIG9uIHdpbmRvd3MKICBhbmQgd29ya3Mgb24gcmVkdWNpbmcgaXQuCgpEYW5pZWwgKDEwIFNlcHRlbWJlciAyMDAxKQotIENyaXMgQmFpbGlmZiBmaXhlZCB0aGUgcGVybCBpbnRlcmZhY2UuIEl0IHN0b3BwZWQgd29ya2luZyBzaW5jZSB0aGUgY2hhbmdlZAogIGJlaGF2aW9yIHdpdGggV1JJVEVIRUFERVIgYW5kIE5VTEwgcG9pbnRlcnMuCgotIFRoZSAib3V0cHV0IGNvb2tpZXMiIGZ1bmN0aW9uIGNvdWxkIGR1bXAgY29yZSBpZiBubyBjb29raWVzIHdlcmUgZW5hYmxlZC4KCkRhbmllbCAoNyBTZXB0ZW1iZXIgMjAwMSkKLSBTTSBwb2ludGVkIG91dCB0aGF0IHRoZSBTU0wgY29kZSBkaWRuJ3QgY29tcGlsZSBhbnkgbG9uZ2VyIGlmIFNTTCB3YXMKICBkaXNhYmxlZC4uLiBBbHNvLCB3ZSBuZWVkZWQgdG8gY29ycmVjdCB0aGUgI2luY2x1ZGUgZm9yIHRoZSB1dGltZSBzdHVmZiBvbgogIHdpbmRvd3MuCgpEYW5pZWwgKDYgU2VwdGVtYmVyIDIwMDEpCi0gVC4gQmhhcmF0aCBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlIFNTTCBzZXNzaW9uIGNhY2hlIGNvZGUgdGhhdCBtYWRlIGl0CiAgc29tZXRpbWVzIHJlYWQgZnJvbSBhIE5VTEwgcG9pbnRlci4KClZlcnNpb24gNy45LXByZTMKCkRhbmllbCAoMyBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCB0aGUgLVIvLS1yZW1vdGUtdGltZSBvcHRpb24sIHRoYXQgdXNlcyB0aGUgcmVtb3RlIGZpbGUncyBkYXRlc3RhbXAgdG8KICBzZXQgdGhlIGxvY2FsIGZpbGUncyBkYXRlc3RhbXAuIFRodXMsIHdoZW4geW91IGdldCBhIHJlbW90ZSBmaWxlIHlvdXIgbG9jYWwKICBmaWxlIHdpbGwgZ2V0IHRoZSBzYW1lIHRpbWUgYW5kIGRhdGUuIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgd2hlbiB5b3UgdXNlCiAgLW8gb3IgLU8uCgotIEluc3RhbGxlZCBsaWJ0b29sIDEuNC4xLCBsaWJ0b29saXplZCBhbmQgZXZlcnl0aGluZy4KCkRhbmllbCAoMSBTZXB0ZW1iZXIgMjAwMSkKLSBIZWlra2kgS29ycGVsYSBwb2ludGVkIG91dCB0aGF0IEkgZGlkIG5vdCBzaGlwIHRoZSBwcm9wZXIgbGlidG9vbCBzdHVmZiBpbiAKICB0aGUgcHJlLXJlbGVhc2VzLCBldmVuIHRob3VnaCB0aGF0IHdhcyBteSBpbnRlbnRpb24uIGxpYnRvb2xpemUgaGFzIG5vdwogIGJlZW4gcmUtcnVuLgoKLSBIZWlra2kgYWxzbyBwYXRjaGVkIGF3YXkgdGhlIGJhZCB1c2Ugb2YgJ21ha2UgLUMnIGluIHRoZSB0ZXN0IHN1aXRlCiAgbWFrZWZpbGUuIG1ha2UgLUMgaXMgbm90IHZlcnkgcG9ydGFibGUgYW5kIGlzIG5vdyBiYW5uZWQgZnJvbSBoZXJlLgoKVmVyc2lvbiA3LjktcHJlMgoKRGFuaWVsICgzMSBBdWd1c3QgMjAwMSkKLSBJIGp1c3QgbWFkZSBhIGh1Z2UgaW50ZXJuYWwgc3RydWN0IHJlaGF1bCwgYW5kIGFsbCB0aGUgYmlnIGludGVybmFsbHkgdXNlZAogIHN0cnVjdHMgaGF2ZSBiZWVuIHJlbmFtZWQsIHJlZGVzaWduZWQgYW5kIHN0dWZmIGhhdmUgYmVlbiBtb3ZlZCBhcm91bmQgYSBiaXQKICB0byBtYWtlIHRoZSBzb3VyY2UgZWFzaWVyIHRvIGZvbGxvdywgbW9yZSBsb2dpY2FsbHkgZ3JvdXBlZCBhbmQgdG8gaG9wZWZ1bGx5CiAgZGVjcmVhc2UgZnV0dXJlIGJ1Z3MuIEkgYWxzbyBob3BlIHRoYXQgdGhpcyB3aWxsIG1ha2UgbmV3IGZ1bmN0aW9ucyB0byBnZXQKICBlYXNpZXIgdG8gYWRkLCBhbmQgbWFrZSBpdCBsZXNzIGxpa2VseSB0aGF0IHdlIGhhdmUgYnVncyBsZWZ0IGxpa2UgdGhlIFVSTC0KICBmcmVlIGJ1ZyBmcm9tIEF1Z3VzdCAyMy4KClZlcnNpb24gNy45LXByZTEKCkRhbmllbCAoMjkgQXVndXN0IDIwMDEpCi0gVGhlIG5ldyBjb29raWUgY29kZSBoYXZlIGVuYWJsZWQgdGhlIGJyYW5kIG5ldyAnLWMvLS1jb29raWUtamFyJyBvcHRpb24uIFVzZQogIHRoYXQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIGluIHdoaWNoIHlvdSB3YW50IHRvIGhhdmUgYWxsIGNvb2tpZXMgY3VybAogIGtub3dzIG9mLCBkdW1wZWQgdG8uIEl0J2xsIGJlIHdyaXR0ZW4gdXNpbmcgdGhlIG5ldHNjYXBlIGNvb2tpZSBmb3JtYXQuCgogIFRoaXMgaXMgaW50ZXJuYWxseSBkb25lIHdpdGggdGhlIG5ldyBDVVJMT1BUX0NPT0tJRUpBUiBvcHRpb24gdG8gbGliY3VybCwKICB3aGljaCBpbiB0dXJuIGR1bXBzIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjdXJsX2Vhc3lfY2xlYW51cCgpIGlzIGludm9rZWQuCiAgVGhlcmUgbWlnaHQgYmUgcmVhc29ucyB0byByZS1jb25zaWRlciBteSBjaG9pY2Ugb2YgcHV0dGluZyBpdCB0aGVyZS4gUGVyaGFwcwogIGl0IGlzIGJldHRlciBwbGFjZWQgdG8gZ2V0IGRvbmUganVzdCBiZWZvcmUgKl9wZXJmb3JtKCkgaXMgZG9uZS4gSXQgaXMgYWxsCiAgb2YgY291cnNlIGRlcGVuZGluZyBvbiBob3cgeW91IGd1eXMgd2FudCB0byB1c2UgdGhpcyBmZWF0dXJlLi4uCgotIEFkZGVkIGZ0cHVwbG9hZC5jIGluIHRoZSBzb3VyY2UgZXhhbXBsZXMgc2VjdGlvbiwgYmFzZWQgb24gc291cmNlIGNvZGUgcG9zdGVkCiAgYnkgRXJpY2sgTnV3ZW5kYW0uCgpEYW5pZWwgKDI4IEF1Z3VzdCAyMDAxKQotIE5vdyBydW5uaW5nIGxpYnRvb2wgQ1ZTIGJyYW5jaC0xLTQgdG8gZ2VuZXJhdGUgc3R1ZmYuIFNob3VsZCBmaXggcHJvYmxlbXMKICBvbiBPcGVuQlNEIGFuZCBob3BlZnVsbHkgb24gRnJlZUJTRCBhcyB3ZWxsIQoKLSBHZW9yZyBIdWV0dGVuZWdnZXIgbW9kaWZpZWQgdGhlIGN1cmxfZm9ybWFkZCgpIGZ1bmN0aW9uYWxpdHkgc2xpZ2h0bHksIGFuZAogIGFkZGVkIHN1cHBvcnQgZm9yIGVycm9yIGNvZGUgNDE3IHdoZW4gZG9pbmcgZm9ybSBwb3N0IGFuZCB1c2luZyB0aGUgRXhwZWN0OgogIGhlYWRlci4gR3JlYXQgd29yayEKCi0gTWFkZSBzb21lIHRlc3RzIHdpdGggY2FjaGVkIFNTTCBzZXNzaW9uIElEcywgYW5kIHRoZXkgc2VlbSB0byB3b3JrLiBUaGVyZQogIHNob3VsZCBiZSBhIHNpZ25pZmljYW50IHNwZWVkIGltcHJvdmVtZW50IGluIHRoZSBTU0wgY29ubmVjdGlvbiBwaGFzZSwgYnV0CiAgaW4gbXkgdGlueSB0ZXN0cyBpdCBqdXN0IGlzbid0IHBvc3NpYmxlIHRvIG5vdGljZSBhbnkgZGlmZmVyZW5jZS4gTGlrZSBvdGhlcgogIGNhY2hpbmcgaW4gbGliY3VybCwgeW91IG11c3QgcmV1c2UgdGhlIHNhbWUgaGFuZGxlIGZvciB0aGUgY2FjaGluZyB0byB0YWtlCiAgZWZmZWN0LiBTU0wgc2Vzc2lvbiBJRCBjYWNoaW5nIGlzIGRvbmUgb24gYSBwZXIgaG9zdC1uYW1lIGFuZCBkZXN0aW5hdGlvbgogIHBvcnQgbnVtYmVyIGJhc2lzLgoKICBTZXQgdmVyYm9zZSwgYW5kIHlvdSdsbCBnZXQgaW5mb3JtYXRpb25hbCB0ZXN0cyB3aGVuIGxpYmN1cmwgZGV0ZWN0cyBhbmQKICB1c2VzIGEgcHJldmlvdXMgU1NMIHNlc3Npb24gSUQuCgotIFVwZ3JhZGVkIHRvIGF1dG9tYWtlIDEuNSBvbiBteSBkZXZlbG9wbWVudC9yZWxlYXNlIG1hY2hpbmUuCgpEYW5pZWwgKDI3IEF1Z3VzdCAyMDAxKQotIFNsb3dseSBzdGFydGVkIHdyaXRpbmcgU1NMIHNlc3Npb24gSUQgY2FjaGluZyBjb2RlCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDAxKQotIFQuIEJoYXJhdGggcmVtb3ZlZCBjb21waWxlciB3YXJuaW5ncyBvbiB3aW5kb3dzIGFuZCB1cGRhdGVkIHRoZSBNUyBwcm9qZWN0CiAgZmlsZXMuCgotIEtldmluIFJvdGggcmVwb3J0ZWQgdHdvIGtpbmRzIG9mIGNvbW1hbmQgbGluZSBjb25zdHJ1Y3RzIHdpdGggdGhlIG5ldyAtRyB0aGF0CiAgY3VybCBkaWRuJ3QgcmVhbGx5IGRlYWwgd2l0aCB0aGUgd2F5IG9uZSB3b3VsZCBsaWtlLgoKLSBUaW0gQ29zdGVsbG8gcGF0Y2hlZCBhd2F5IGEgdXNlIG9mIHN0cmNhc2VjbXAoKSBpbiB0aGUgU1NMIGNvZGUuIFdlIGhhdmUgb3VyCiAgb3duIHBvcnRhYmxlIHZlcnNpb24gbmFtZWQgc3RyZXF1YWwoKSB0aGF0IHNob3VsZCBiZSB1c2VkIQoKLSBUaW0gYWxzbyBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIGxpYi9NYWtlZmlsZS52YzYgZmlsZSB0aGF0IG1hZGUgaXQgbWl4CiAgZGVidWcgb2JqZWN0IG1vZHVsZXMgY2F1c2luZyBjb25mdXNpb25zLgoKRGFuaWVsICgyMyBBdWd1c3QgMjAwMSkKLSBULiBCaGFyYXRoIGFjY3VyYXRlbHkgZm91bmQgYSBsaWJjdXJsIGJ1ZyB0aGF0IHdvdWxkIGhhcHBlbiB3aGVuIGRvaW5nIGEKICBzZWNvbmQgaW52b2tlIG9mIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2l0aCBhIG5ldyBVUkwgd2hlbiB0aGUgcHJldmlvdXMgaW52b2tlCiAgZm9sbG93ZWQgYSBMb2NhdGlvbjogaGVhZGVyLgoKLSBTdGFydGVkIHRoZSBpbXByb3ZlbWVudCB3b3JrIG9uIHRoZSBjb29raWUgZW5naW5lOgogIC0gTm93IGtlZXBzIGNvb2tpZXMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGNvb2tpZSBmaWxlCiAgLSBBIHdyaXRlIHRvIHRoZSBwb3NzaWJseSBzdGF0aWMgc3RyaW5nIHdhcyByZW1vdmVkCiAgLSBBZGRlZCBhIGZ1bmN0aW9uIHRoYXQgY2FuIG91dHB1dCBhbGwgY29va2llcwogIC0gTm93IHN1cHBvcnRzIHJlYWRpbmcgbXVsdGlwbGUgY29va2llIGZpbGVzCgotIFN0ZXZlIExob21tZSBjb3JyZWN0ZWQgYSBETEwgbmFtaW5nIGlzc3VlIGluIHRoZSBNU1ZDKysgcHJvamVjdCBmaWxlLgoKLSBTcGxpdCB1cCB0aGUgbW9uc3RlciBmdW5jdGlvbiBpbiBsaWIvZnRwLmMgdG8gdXNlIG1vcmUgc21hbGxpc2ggZnVuY3Rpb25zIHRvCiAgaW5jcmVhc2UgcmVhZGFiaWxpdHkgYW5kIG1haW50YWluYWJpbGl0eS4KCkRhbmllbCAoMjEgQXVndXN0IDIwMDEpCi0gR2VvcmcgSHVldHRlbmVnZ2VyJ3MgYmlnIHBhdGNoIHdhcyBhcHBsaWVkLiBOb3cgd2UgaGF2ZToKICBvICJFeHBlY3Q6IDEwMC1jb250aW51ZSIgc3VwcG9ydC4gV2Ugd2lsbCBmcm9tIG5vdyBvbiBzZW5kIHRoYXQgaGVhZGVyIGluCiAgICBhbGwgcmZjMTg2Ny1wb3N0cywgYXMgdGhhdCBtYWtlcyB1cyBhYm9ydCBtdWNoIGZhc3RlciB3aGVuIHRoZSBzZXJ2ZXIKICAgIHJlamVjdHMgb3VyIFBPU1QuIFBvc3Rpbmcgd2l0aG91dCB0aGUgRXhwZWN0OiBoZWFkZXIgaXMgc3RpbGwgcG9zc2libGUgaW4KICAgIHRoZSBzdGFuZGFyZCByZXBsYWNlLWludGVybmFsLWhlYWRlciBzdHlsZS4KICBvIGN1cmxfZm9ybWFkZCgpIGlzIGEgbmV3IGZvcm1wb3N0IGJ1aWxkaW5nIGZ1bmN0aW9uIHRoYXQgaXMgaW50cm9kdWNlZCB0bwogICAgcmVwbGFjZSB0aGUgbm93IGRlcHJlY2F0ZWQgY3VybF9mb3JtcGFyc2UoKSBmdW5jdGlvbi4gVGhlIGxhdHRlciBmdW5jdGlvbgogICAgd2lsbCBzdGlsbCBoYW5nIGFyb3VuZCBmb3IgYSB3aGlsZSwgYnV0IHRoZSBjdXJsX2Zvcm1hZGQoKSBpcyB0aGUgbmV3IHdheQogICAgYW5kIGNvcnJlY3Qgd2F5IHRvIGJ1aWxkIGZvcm0gcG9zdHMuCiAgbyBEb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGVzZSBjaGFuZ2VzCgogIFRoZXNlIGNoYW5nZXMgYXJlIHJlYXNvbiBlbm91Z2ggdG8gbmFtZSB0aGUgbmV4dCBjdXJsIHJlbGVhc2UgNy45Li4uCgotIFdlIG5vdyBjb252ZXJ0IG1hbiBwYWdlcyB0byBIVE1MIHBhZ2VzIGFuZCBpbmNsdWRlIHRoZW0gaW4gdGhlIHJlbGVhc2UKICBhcmNoaXZlLiBGb3IgdGhlIHBsZWFzdXJlIG9mIGV2ZXJ5b25lIHdpdGhvdXQgbnJvZmYgd2l0aGluIHJlYWNoLgoKLSBBbmRy6XMgR2FyY+1hJ3Mgc3VnZ2VzdGVkIGZsdXNoaW5nIG9mIHRoZSBwcm9ncmVzcyBtZXRlciBvdXRwdXQgc3RyZWFtIHdhcwogIGFkZGVkLiBJdCBzaG91bGQgbWFrZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgbG9vayBiZXR0ZXIgb24gV2luZG93cy4KCi0gVHJveSBFbmdlbCBwb2ludGVkIG91dCBhIG1pc3Rha2UgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdGhhdCBtYWRlIGl0IGZhaWwKICBvbiBtYW55IFJlZCBIYXQgYm94ZXMhCgpEYW5pZWwgKDIwIEF1Z3VzdCAyMDAxKQotIFdlIG5lZWQgYW4gdXBkYXRlZCBsaWJ0b29sIHRvIG1ha2UgYSBiZXR0ZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIE9wZW5CU0QKICBhcyB3ZWxsIGFzIEZyZWVCU0QKClZlcnNpb24gNy44LjEKCkRhbmllbCAoMjAgQXVndXN0IDIwMDEpCi0gQnJhZCBwb2ludGVkIG91dCB0aGF0IHdlIHNoaXAgdHdvIGV4dHJhIGxpYnRvb2wgZmlsZXMgaW4gdGhlIHRhcmJhbGxzIHRoYXQKICB3ZSByZWFsbHkgZG9uJ3QgbmVlZCB0byEgUmVtb3ZpbmcgdGhlbSBtYWtlcyB0aGUgZ3otYXJjaGl2ZSBhYm91dCA2MEsKICBzbWFsbGVyIQoKLSBBbGJlcnQgQ2hpbiBicm91Z2h0IGZpeGVzIGZvciB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBkZXRlY3Qgc29ja2xlbl90CiAgcHJvcGVybHkgYXMgd2VsbCBhcyBtb3ZpbmcgbG90cyBvZiBvdXIgY3VzdG9tIGF1dG9jb25mIG1hY3JvcyB0bwogIGFjaW5jbHVkZS5tNC4KCkRhbmllbCAoMTkgQXVndXN0IDIwMDEpCi0gTW9vbmVzYW15IGltcHJvdmVkIGhpcyAtRyBmZWF0dXJlIGZvciBob3N0IG5hbWVzIG9ubHkgVVJMcy4uLgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwMSkKLSBGaW5hbGx5IGNsZWFuZWQgdXAgdGhlIGtlcmJlcm9zIGNvZGUgdG8gdXNlIEN1cmxfIHByZWZpeGVzIG9uIGFsbCBnbG9iYWwKICBzeW1ib2xzIGFuZCB0byBub3QgdXNlIGdsb2JhbCB2YXJpYWJsZXMuCgpWZXJzaW9uIDcuOC4xLXByZTYKCkRhbmllbCAoMTYgQXVndXN0IDIwMDEpCi0gUy4gTW9vbmVzYW15IGFkZGVkIHRoZSAtRyBvcHRpb24gdG8gY3VybCwgdGhhdCBjb252ZXJ0cyB0aGUgZGF0YSBzcGVjaWZpZWQKICB3aXRoIC1kIHRvIGEgR0VUIHJlcXVlc3QuIERlZmF1bHQgYWN0aW9uIHdoZW4gdXNpbmcgLWQgaXMgUE9TVC4gV2hlbiAtRyBpcwogIHVzZWQsIHRoZSAtZCBzcGVjaWZpZWQgZGF0YSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBVUkwgd2l0aCBhICc/JwogIHNlcGFyYXRvci4gQXMgc3VnZ2VzdGVkIHByZXZpb3VzbHkgYnkgS2V2aW4gUm90aC4KCi0gY3VybC1jb25maWcgLS1saWJzIHNob3VsZCBub3cgZGlzcGxheSBhbGwgbGlua2VyIG9wdGlvbnMgcmVxdWlyZWQgdG8gbGluawogIHdpdGggbGliY3VybC4gSXQgaW5jbHVkZXMgdGhlIHBhdGggYW5kIG9wdGlvbnMgZm9yIGxpYmN1cmwgaXRzZWxmLgogIGN1cmwtY29uZmlnIC0tY2ZsYWdzIGRpc3BsYXlzIHRoZSBjb21waWxlciBvcHRpb24ocykgbmVlZGVkIHRvIGNvbXBpbGUKICBzb3VyY2UgZmlsZXMgdGhhdCB1c2UgbGliY3VybCBmdW5jdGlvbnMuIEJhc2ljYWxseSwgdGhhdCBzZXRzIHRoZSBpbmNsdWRlCiAgcGF0aCBjb3JyZWN0LgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwMSkKLSBBcmthZGl1c3ogTWlza2lld2ljeiBwb2ludGVkIG91dCBhIG1pc3Rha2UgaW4gaG93IElQdjYtc3R5bGUgSVAtYWRkcmVzc2VzCiAgd2VyZSBwYXJzZWQgYW5kIHVzZWQuIChSRkMyNzMyLWZvcm1hdCkKCi0gQnVnICMxMjczMyBvdmVyIG9uIHBocC5uZXQgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gbGliY3VybCB0aGF0IG1hZGUgaXQgY29yZQogIGR1bXAgaWYgeW91IHVzZWQgQ1VSTE9QVF9QT1NUIHdpdGhvdXQgc2V0dGluZyBhbnkgZGF0YSB0byBwb3N0IHdpdGgKICBDVVJMT1BUX1BPU1RGSUVMRFMhIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLiBOb3QgdXNpbmcgQ1VSTE9QVF9QT1NURklFTERTCiAgbm93IGVxdWFscyBzZXR0aW5nIGl0IHRvIG5vIGRhdGEgYXQgYWxsLgoKLSBSYW1hbmEgTW9ra2FwYXRpIHJlcG9ydGVkIHRoYXQgY3VybCB3aXRoICctdyAle2h0dHBfY29kZX0nIGRpZG4ndCB3b3JrCiAgcHJvcGVybHkgd2hlbiB1c2VkIGZvciBtdWx0aXBsZSBVUkxzIG9uIGEgc2luZ2xlIGNvbW1hbmQgbGluZS4gSW5kZWVkLCB0aGUKICB2YXJpYWJsZSB3YXMgbm90IHJlc2V0IGJldHdlZW4gdGhlIHJlcXVlc3RzLiBUaGlzIGlzIG5vdyBmaXhlZC4KCi0gRGF2aWQgSmFtZXMgZml4ZWQgdGhlIEJvcmxhbmQgbWFrZWZpbGUgc28gdGhhdCBsaWJjdXJsIHN0aWxsIGNvbXBpbGVzIGFuZAogIGJ1aWxkcyB3aXRoIHRoYXQgY29tcGlsZXIuCgpEYW5pZWwgKDE0IEF1Z3VzdCAyMDAxKQotIE9vcHMuIEkgcnVpbmVkIE5pY28ncyBzb2NrbGVuX3QgZGVmaW5lIGluIGNvbmZpZy12bXMuaCwgY29ycmVjdGVkIGl0IG5vdy4KCi0gQW4gb2xkZXIgaXRlbSBub3QgbWVudGlvbmVkIGhlcmUgYmVmb3JlOiBDVVJMX0dMT0JBTF9XSU4zMiBpcyBhIGRlZmluZSBmb3IKICB3aW5kb3dzIHVzZXJzIHRvIGN1cmxfZ2xvYmFsX2luaXQoKSwgdGhhdCBtYWtlcyBsaWJjdXJsIGluaXQgdGhlIHdpbnNvY2sKICBzdHVmZi4gSWYgbGliY3VybCBpcyBhbGwgc29ja2V0IHN0dWZmIHlvdSBkbywgdGhlbiBhbGxvd2luZyBpdCB0byBmaWRkbGUKICB3aXRoIHRoaXMgaXMgYSBjb21mb3J0YWJsZSBzaG9ydGN1dCB0byBmYW1lLgoKVmVyc2lvbiA3LjguMS1wcmU1CgpEYW5pZWwgKDE0IEF1Z3VzdCAyMDAxKQotIE5pY28gQmFnZ3VzIHByb3ZpZGVkIG1vcmUgZmVlZGJhY2sgZnJvbSBoaXMgVk1TIHBvcnRpbmcgZWZmb3J0cyBhbmQgYSBmZXcKICBtaW5vciBjaGFuZ2VzIHdlcmUgbmVjZXNzYXJ5LgoKLSBJIG1vZGlmaWVkIGNvbmZpZ3VyZS5pbiBzbyB0aGF0IC0tZW5hYmxlLWRlYnVnIHNldHMgbW9yZSBwaWNreSBnY2Mgb3B0aW9ucy4KICBJIHRoZW4gcmVtb3ZlZCBhbG1vc3QgYWxsIHRoZSBuZXcgd2FybmluZ3MgdGhhdCBhcHBlYXJlZCwgYW5kIGJ5IGRvaW5nIHNvIEkKICBjb3JyZWN0ZWQgdGhlIHNpemVfdC10cmVhdGVkLWFzLXNpZ25lZCBwcm9ibGVtIHRoYXQgaGFzIGJlZW4gZGlzY3Vzc2VkIG9uCiAgdGhlIG1haWxpbmcgbGlzdCBwcmV2aW91c2x5LiBJIGFsc28gcmVtb3ZlZCBhIGJ1bmNoIG9mIHRoZSBqdXN0IHJlY2VudGx5CiAgYWRkZWQgI2lmZGVmIFZNUyBsaW5lcy4KCi0gSSByZW1vdmVkIHRoZSB1c2Ugb2YgYSBnbG9iYWwgdmFyaWFibGUgaW4gdGhlIFNTTCBjb2RlLiBJdCB3YXMgb25jZQogIG5lY2Vzc2FyeSBidXQgaGFzbid0IGJlZW4gbmVlZGVkIHNpbmNlIE9wZW5TU0wgMC45LjQuIFRoZSBvbGQgY29kZSBzaG91bGQKICAoaG9wZWZ1bGx5KSBzdGlsbCB3b3JrIGlmIGxpYmN1cmwgaXMgYnVpbHQgYWdhaW5zdCBhbiBhbmNpZW50IHZlcnNpb24gb2YKICBPcGVuU1NMLgoKRGFuaWVsICgxMyBBdWd1c3QgMjAwMSkKLSBQZXRlciBUb2RkIHBvc3RlZCBhIHBhdGNoIHRoYXQgbm93IGFsbG93cyBub24tZmlsZSByYzE4Njctc3R5bGUgZm9ybSBwb3N0cwogIHRvIGJlIGxhcmdlciB0aGFuIDRLLgoKRGFuaWVsICgxMCBBdWd1c3QgMjAwMSkKLSBTLiBNb29uZXNhbXkgZml4ZWQgYnVncyBmb3IgYnVpbGRpbmcgZGVidWcgYW5kIFNTTCBsaWIgaW4gVkMgbWFrZWZpbGUKCkRhbmllbCAoOSBBdWd1c3QgMjAwMSkKLSBUaGUgcmVkaXJlY3RlZCBlcnJvciBzdHJlYW0gd2FzIGNsb3NlZCBiZWZvcmUgdGhlIGN1cmxfZWFzeV9jbGVhbnVwKCkgY2FsbAogIHdhcyBtYWRlLCBhbmQgd2hlbiBWRVJCT1NFIHdhcyBlbmFibGVkLCB0aGUgY2xlYW51cCBmdW5jdGlvbiB0cmllZCB0byB1c2UKICB0aGUgc3RyZWFtLiBJdCBjb3VsZCBsZWFkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0LiBBbHNvLCB0aGUgc3RyZWFtIHdhcwogIGNsb3NlZCBldmVuIGlmIHdlIGxvb3BlZCB0byBnZXQgbW9yZSBmaWxlcy4gIENvcnJlY3RzIER1c3RpbiBCb3N3ZWxsJ3MgYnVnCiAgcmVwb3J0ICM0NDE2MTAKCi0gTm93IGdlbmVyYXRlcyB0aGUgcmVsZWFzZSBjb25maWd1cmUgc2NyaXB0IHdpdGggYXV0b2NvbmYgMi41MgoKVmVyc2lvbiA3LjguMS1wcmU0CgpEYW5pZWwgKDggQXVndXN0IDIwMDEpCi0gY3VybCAtRSB1c2VzIGEgY29sb24gdG8gc2VwYXJhdGUgYSBmaWxlIG5hbWUgZnJvbSBhIHBhc3NwaHJhc2UuIFRoaXMgdHVybmVkCiAgb3V0IHJlYWxseSBiYWQgZm9yIHRoZSB3aW5kb3dzIHBlb3BsZSB3aG8gd2FudHMgdG8gaW5jbHVkZSBhIGRyaXZlIGxldHRlciBpbgogIHRoZSBmaWxlIG5hbWUgbGlrZSAiYzpcY2VydC5wZW0iLiBUaGVyZSdzIG5vdyBhIHdpbjMyIHdvcmstYXJvdW5kCiAgaW1wbGVtZW50ZWQgdGhhdCB0cmllcyB3b3JrIGFyb3VuZCB0aGF0LCB3aGVuIHRoZSBjb2xvbiBzZWVtcyB0byBiZSB1c2VkIGZvcgogIHRoaXMga2luZCBvZiBjb25zdHJ1Y3QuCgotIFBhdHJpY2sgQmloYW4tRmFvdSBpbnRyb2R1Y2VkIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIHdoaWNoIG1ha2VzIGN1cmwKICB2ZXJpZnkgdGhlIHNlcnZlcidzIENOIGZpZWxkIHdoZW4gdGFsa2luZyBodHRwczovLy4gSWYgLS1jYWNlcnQgaXMgbm90IHVzZWQsCiAgYW55IGZhaWx1cmVzIGluIG1hdGNoaW5nIGlzIG9ubHkgZGlzcGxheWVkIGFzIGluZm9ybWF0aW9uICgtdikuCgpEYW5pZWwgKDcgQXVndXN0IDIwMDEpCi0gV3JvdGUgdXAgbmluZSBtb3JlIHRlc3QgY2FzZXMsIG1vcmUgb3IgbGVzcyBjb252ZXJ0ZWQgZnJvbSB0aGUgZm9ybWVyIHRlc3QKICBzdWl0ZS4KCkRhbmllbCAoNiBBdWd1c3QgMjAwMSkKLSBIZWlra2kgS29ycGVsYSBwb3N0ZWQgYSBwYXRjaCB0aGF0IG1ha2VzICdjdXJsLWNvbmZpZyAtLWxpYnMnIGluY2x1ZGUgdGhlCiAgZGlyZWN0b3J5IGluIHdoaWNoIGxpYmN1cmwgaXRzZWxmIGlzIGluc3RhbGxlZCBpbi4gV2hpbGUgdGhpcyB3YXNuJ3QgbXkKICBpbml0aWFsIGludGVudGlvbiB3aXRoIHRoaXMgb3B0aW9uLCBpdCBtYWtlcyBzZW5zZSBhbmQgbWFrZXMgbGlua2luZyB3aXRoCiAgbGliY3VybCBlYXNpZXIuCgotIFN0ZWZhbiBVbHJpY2ggcG9pbnRlZCBvdXQgdG8gdXMgdGhhdCBvdGhlciB0b29scyBhbmQgbGlicmFyaWVzIHRyZWF0IGZpbGU6Ly8KICBVUkxzIHdpdGggb25seSBvbmUgc2xhc2ggYWZ0ZXIgdGhlIGhvc3QgbmFtZSBzbGlnaGx5IGRpZmZlcmVudCB0aGFuIGxpYmN1cmwKICBkb2VzLiBTaW5jZSBhbGwgdGhlIG90aGVycyBzZWVtIHRvIGFncmVlLCB3ZSBiZXR0ZXIgZm9sbG93IHRoZW0uCgotIE5pY28gQmFnZ3VzIHByb3ZpZGVkIHVzIHdpdGggYSBodWdlIHNldCBvZiBmaXhlcyB0byBtYWtlIGN1cmwgY29tcGlsZSBhbmQKICBidWlsZCB1bmRlciBPcGVuVk1TLgoKVmVyc2lvbiA3LjguMS1wcmUzCgpEYW5pZWwgKDYgQXVndXN0IDIwMDEpCi0gSm9uYXRoYW4gSHNldSBub3RpY2VkIHRoYXQgeW91IGNvdWxkbid0IGdldCBhIGhlYWRlciBjYWxsYmFjayB1bmxlc3MgeW91CiAgc2V0IENVUkxPUFRfV1JJVEVIRUFERVIgdG8gbm9uLU5VTEwsIGV2ZW4gaWYgeW91IGRpZG4ndCBjYXJlIGFib3V0IHRoYXQKICBkYXRhLiBUaGlzIGlzIG5vdyBmaXhlZC4KCkRhbmllbCAoNSBBdWd1c3QgMjAwMSkKLSBTZXJnaW8gQmFsbGVzdHJlcm8gcHJvdmlkZWQgYSBwYXRjaCBmb3IgcmVhZGluZyByZXNwb25zZXMgZnJvbSBOQ1NBIGh0dHBkCiAgMS41Lnggc2VydmVycywgYXMgdGhleSByZXR1cm4gcmVhbGx5IHNjcmV3ZWQgdXAgcmVzcG9uc2UgaGVhZGVycyB3aGVuIGFza2VkCiAgZm9yIHdpdGggSFRUUCAxLjEuCgotIGN1cmxfZXNjYXBlKCkgbm8gbG9uZ2VyIHRyZWF0cyBhbHJlYWR5IGVuY29kZWQgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQKICBzdHJpbmcgZXNwZWNpYWxseS4KCkRhbmllbCAoMyBBdWd1c3QgMjAwMSkKLSBJIHJlcGxhY2VkIHRoZSBmb3JtZXIgbGliL2FycGFfdGVsbmV0LmggZmlsZSB3aXRoIG9uZSBJIHdyb3RlIG15c2VsZiwgdG8KICBhdm9pZCB0aGUgQlNEIGFubm91Y2VtZW50IGNsYXVzZSBvZiB0aGUgbGljZW5zZSBpbiB0aGUgZm9ybWVyIGZpbGUuCgotIEFuZHJldyBGcmFuY2lzIHByb3ZpZGVkIGEgbmV3IHZlcnNpb24gb2YgYmFzZTY0LmMgdG8gd29yayBhcm91bmQgdGhlIGxpY2Vuc2UKICBib2lsZXIgcGxhdGUgdGhhdCBjYW1lIHdpdGggdGhlIHByZXZpb3VzIG9uZS4gSSBwYXRjaGVkIGl0LCBidXQgdGhlIGdsb3J5CiAgc2hvdWxkIGdvIHRvIEFuZHJldyBmb3IgaGlzIGhlYWRzIHVwLgoKLSBUb21hc3ogTGFja2kgbm90aWNlZCB0aGF0IHdoZW4geW91IGRvIHJlcGVhdGVkIHRyYW5zZmVycyB3aXRoIGxpYmN1cmwgeW91CiAgY291bGRuJ3QgYWx3YXlzIHJlbGlhYmx5IGNoYW5nZSBIVFRQIHJlcXVlc3QuIFRoaXMgaGFzIG5vdyBiZWVuIGZpeGVkIGFuZCBhCiAgbmV3IGxpYmN1cmwgb3B0aW9uIHdhcyBhZGRlZDogQ1VSTE9QVF9IVFRQR0VULCB0aGF0IGNhbiBmb3JjZSB0aGUgSFRUUAogIHJlcXVlc3RyIChiYWNrKSB0byBHRVQuCgotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcG9pbnRlZCBvdXQgdGhhdCBodHRwc3NlcnZlci5wbCB3YXNuJ3QgaW5jbHVkZWQgaW4KICByZWxlYXNlIGFyY2hpdmVzLiBJdCBzaG91bGQgYmUgbm93LgoKRGFuaWVsICgyIEF1Z3VzdCAyMDAxKQotIEZyYW5rIEtlZW5leSBwb2ludGVkIG91dCBhIG1hbnVhbCBtaXN0YWtlIGZvciBjZXJ0aWZpY2F0ZSBjb252ZXJ0aW9ucy4KCi0gVG9tYXN6IExhY2tpIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSBpbiB0aGUgdHJhbnNmZXIgbG9vcCB0aGF0IGNvdWxkIG1ha2UgdGhlCiAgc2VsZWN0KCkgbG9vcCB1c2UgZmFyIHRvbyBtdWNoIENQVS4KCi0gUGF3ZWwgQS4gR2FqZGEgcG9pbnRlZCBvdXQgYW4gb3V0cHV0IG1pc3Rha2UgZG9uZSB3aGVuIHVzaW5nIGxpYmN1cmwncwogIHByb2dyZXNzIGNhbGxiYWNrLgoKRGFuaWVsICgyOSBKdW5lIDIwMDEpCi0gTmF2ZWVuIE5vZWwgbm90aWNlZCB0aGF0IHRoZSBCb3JsYW5kIGxpYnJhcnkgbWFrZWZpbGUgd2Fzbid0IHVwZGF0ZWQuCgotIE5pYyBSb2V0cyBicm91Z2h0IGEgZml4IGZvciB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHdoZW4gdXNpbmcgU1NMLgoKRGFuaWVsICgyNyBKdW5lIDIwMDEpCi0gTWFkZSB0aGUgRlRQIHRlc3RzIHJ1biBPSyBldmVuIG9uIG1hY2hpbmVzIHJ1bm5pbmcgY3VybCBJUHY2LWVuYWJsZWQuCgotIFRyb3kgRW5nZWwgY29ycmVjdGVkIHNvbWUgUlBNIHBhY2thZ2UgZGV0YWlscy4KClZlcnNpb24gNy44LjEtcHJlMgoKRGFuaWVsICgyNSBKdW5lIDIwMDEpCi0gQmr2cm4gU3RlbmJlcmcgY29ycmVjdGx5IGlkZW50aWZpZWQgYSBwcm9ibGVtIHRoYXQgb2NjdXJyZWQgd2hlbiBkb3dubG9hZGluZwogIHNldmVyYWwgZmlsZXMgd2l0aCBjdXJsLCBhbmQgdXNpbmcgcmVzdW1lLiBUaGUgZmlyc3QgZmlsZSdzIHJlc3VtZSBpbmRleCB3YXMKICB0aGVuIHVzZWQgZm9yIGFsbCBmaWxlcywgcmVzdWx0aW5nIGluIHdlaXJkIHJlc3VsdHMuLi4KCi0gQW50b24gS2FsbXlrb3YgcHJvdmlkZWQgYSBmaXggdGhhdCBtYWtlcyBjdXJsIHdvcmsgd2l0aCBmb3JtIGZpZWxkIG5hbWVzCiAgd2l0aCBzcGFjZXMgbGlrZSB3aGVuIC1GIGlzIHVzZWQuCgpWZXJzaW9uIDcuOC4xLXByZTEKCkRhbmllbCAoMjAgSnVuZSAyMDAxKQotIE1pa2UgQnl0bmFyIHByb3ZpZGVkIGEgZmluZSByZXBvcnQgdGhhdCBwcm92ZWQgdGhhdCB0aGUgLS13aXRoLXNzbCBvcHRpb24KICBmb3IgY29uZmlndXJlIG5lZWRlZCB0d2Vha2luZy4gSXQgbm8gbG9uZ2VyIHNlYXJjaGVzIHRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzCiAgZm9yIE9wZW5TU0wgbGlicyBvciBkaXJlY3RvcmllcyB3aGVuIGEgc3BlY2lmaWVkIHBhdGggaXMgZ2l2ZW4uCgpEYW5pZWwgKDE5IEp1bmUgMjAwMSkKLSBXaGVuIGFuIEZUUCB0cmFuc2ZlciBpcyBjdXQgb2ZmIGR1cmluZyB0cmFuc2ZlciwgY3VybCBjb3VsZCBwcmVzZW50IGEgdHJ1bHkKICBnYXJiYWdlZCBlcnJvciBtZXNzYWdlIGFuZCBpbiB3b3JzdCBjYXNlIGR1bXAgY29yZS4gVGhhbmtzIHRvIGRldGFpbGVkCiAgcmVwb3J0cyBmcm9tIFNoYXduIFBvdWxzb24gd2UgbmFpbGVkIHRoaXMuCgpEYW5pZWwgKDEyIEp1bmUgMjAwMSkKLSBTYWx2YWRvciBE4XZpbGEgcHJvdmlkZWQgYSBmaXggZm9yIEZUUCByYW5nZSBkb3dubG9hZHMuCgotIEFkZGVkIGEgZmV3IG1vcmUgdGVzdCBjYXNlcyBmcm9tIHRoZSBmb3JtZXIgdGVzdCBzdWl0ZSB0byB0aGUgbmV3IGZpbGUKICBmb3JtYXQuIFdlJ3JlIG5vdyBhdCBhIHRvdGFsIG9mIDI2IHRlc3RzLgoKRGFuaWVsICgxMSBKdW5lIDIwMDEpCi0gbGliY3VybCdzIHZlcnNpb24taW5mbyB3YXMgd3JvbmcsIGFzIG5vdGVkIGJ5IGJvdGggRG9tZW5pY28gQW5kcmVvbGkgYW5kCiAgRGF2aWQgT2Rpbi4KCkRhbmllbCAoNyBKdW5lIDIwMDEpCi0gSvZybiBmaXhlZCB0aGUgY3VybF91bmVzY2FwZSBkdXBsaWNhdGUgZW50cnkgaW4gbGliL2xpYmN1cmwuZGVmCgotIEkgbWFkZSBTU0wgY2VydGlmaWNhdGUgZmFpbHVyZSBtZXNzYWdlcyB0byBiZSBtb3JlIGRldGFpbGVkLgoKVmVyc2lvbiA3LjgKCkRhbmllbCAoNyBKdW5lIDIwMDEpCi0gU0RhdmlsYSBwcm92aWRlZCBhIHJlc3VtZWQgZG93bmxvYWQgZml4LgoKVmVyc2lvbiA3LjgtcHJlNAoKRGFuaWVsICgxIEp1bmUgMjAwMSkKLSBTdGVybGluZyBwcm92aWRlZCBzb21lIG5ldyBQSFAgZXhhbXBsZXMuCgotIENoYW5nZWQgdGhlIENWUyBoaWVyYXJjaHkgYW5kIHRoZSBvbGRlciBjaGVja291dCBpbnN0cnVjdGlvbiBkb2VzIG5vIGxvbmdlcgogIHdvcmsuIFdlIG1vdmVkIHRoZSBlbnRpcmUgc291cmNlIGNvZGUgaW50byBhIENWUyBtb2R1bGUgbmFtZWQgJ2N1cmwnLgoKRGFuaWVsICgzMSBNYXkgMjAwMSkKLSBDVVJMT1BUX01VVEUgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4gSXQgaXMgc3RpbGwgcHJlc2VudCBpbiB0aGUgaW5jbHVkZSBmaWxlCiAgdG8gbm90IGNhdXNlIGNvbXBpbGVyIGVycm9ycyBmb3IgYXBwbGljYXRpb25zIHVzaW5nIGl0LCBidXQgaXQgaXNuJ3QgdXNlZAogIGFueXdoZXJlIGluIHRoZSBsaWJyYXJ5LgoKVmVyc2lvbiA3LjgtcHJlMwoKRGFuaWVsICgzMSBNYXkgMjAwMSkKLSBPbmNlIGFuZCBmb3IgYWxsIGZpeGVkIHRoZSBfUkVFTlRSQU5UIG1lc3MgZm9yIFNvbGFyaXMgY29tcGlsZXMgdG8gcHJlc2VudAogIGxlc3Mgd2FybmluZ3MuCgotIFN0ZXJsaW5nIEh1Z2hlcyB0aXJlbGVzc2x5IHBvaW50cyBvdXQgYW5kIGNvcnJlY3RzIG15IG1pc3Rha2VzLi4uISBTbywKICBjdXJsX2dsb2JhbF9pbml0KCkgbm93IGxldHMgdGhlIGFyZ3VtZW50IGZsYWdzICpTRVQqIHdoYXQgcGFydHMgdG8KICBpbml0LiBDVVJMX0dMT0JBTF9ERUZBVUxUIG1ha2VzIGEgbmljZSBkZWZhdWx0LCBDVVJMX0dMT0JBTF9BTEwgaW5pdHMgYWxsCiAga25vd24gc3Vic3lzdGVtcyBhbmQgQ1VSTF9HTE9CQUxfTk9ORSBpbml0cyBub3RoaW5nIG1vcmUgdGhhbiBhYnNvbHV0ZWx5CiAgbmVjZXNzYXJ5LiBNYW4gcGFnZSB1cGRhdGVkIGFjY29yZGluZ2x5LgoKLSBGaXhlZCB0aGUgc3RydG9rLmggaW5jbHVkZSBmaWxlIGFzIGl0IHdvdWxkbid0IGNvbXBpbGUgb24gYWxsIHBsYXRmb3JtcyEKCkRhbmllbCAoMzAgTWF5IDIwMDEpCi0gTWFkZSBsaWJjdXJsIGJ5IGRlZmF1bHQgYWN0IGFzIGlmIENVUkxPUFRfTVVURSBhbmQgQ1VSTE9QVF9OT1BST0dSRVNTIHdlcmUKICBzZXQgVFJVRS4gU2V0IHRoZW0gdG8gRkFMU0UgdG8gbWFrZSBsaWJjdXJsIG1vcmUgdGFsa2F0aXZlLiBUaGUgKl9NVVRFCiAgb3B0aW9uIGlzIHN1YmplY3QgZm9yIGNvbXBsZXRlIHJlbW92YWwuLi4KClZlcnNpb24gNy44LXByZTIKCkRhbmllbCAoMzAgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIHdyb3RlIGEgbWFrZWZpbGUgZm9yIGJ1aWxkaW5nIFNvbGFyaXMgcGFja2FnZXMuCgotIFN0ZXJsaW5nIEh1Z2hlcyBicm91Z2h0IGZpeGVzIGZvciAnYnVpbGRjb25mJyAodGhlIGJ1aWxkLWZyb20tQ1ZTIHRvb2wpIGFuZAogIHdlIGRpc2N1c3NlZCBhbmQgYWRkZWQgYSBmZXcgQ1VSTF9HTE9CQUxfKiBmbGFncyBpbiBpbmNsdWRlL2N1cmwuaAoKLSBLamV0aWwgSmFjb2JzZW4gcHJpdmF0ZWx5IGFubm91bmNlZCBoaXMgcHl0aG9uIGludGVyZmFjZSB0byBsaWJjdXJsLAogIGF2YWlsYWJsZSBhdCBodHRwOi8vcHljdXJsLnNvdXJjZWZvcmdlLm5ldC8KCkRhbmllbCAoMjkgTWF5IDIwMDEpCi0gU3RlcmxpbmcgSHVnaGVzIGZpeGVkIGEgc3RydG9rKCkgcHJvYmxlbSBpbiBsaWJjdXJsLiBJdCBpcyBub3QgYSB0aHJlYWQtCiAgc2FmZSBmdW5jdGlvbi4gTm93IGNvbmZpZ3VyZSBjaGVja3MgZm9yIGEgdGhyZWFkLXNhZmUgdmVyc2lvbiwgYW5kCiAgbGliL3N0cnRvay5jIG9mZmVycyBvbmUgZm9yIHRoZSBzeXN0ZW1zIHRoYXQgZG9uJ3QgY29tZSB3aXRoIG9uZSBpbmNsdWRlZCEKCi0gTWV0dGd1dCBKYW1hbGxhIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IHRoZSAtIyBwcm9ncmVzcyBiYXIgd2FzIHdyaXR0ZW4KICB0byBzdGRlcnIgZXZlbiB0aG91Z2ggLS1zdGRlcnIgcmVkaXJlY3Rpb24gd2FzIHVzZWQuIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCi0gSSBtb3ZlZCBvdXQgdGhlIGxpc3Qgb2YgY29udHJpYnV0b3JzIGZyb20gdGhlIGN1cmwuMSBtYW4gcGFnZSBhbmQgbWFkZSBhCiAgc2VwYXJhdGUgZG9jcy9USEFOS1MgZmlsZS4gSXQgbWFrZXMgdGhlIGxpc3QgZWFzaWVyIHRvIGZpbmQsIGFuZCBtYWRlIGl0CiAgZWFzaWVyIGZvciBtZSB0byBtYWtlIGEgc2VwYXJhdGUgd2ViIHBhZ2Ugd2l0aCB0aGF0IHNhbWUgaW5mb3JtYXRpb24uCgogIEkgcmVhbGx5IGRvIHdhbnQgYWxsIHlvdSBndXlzIG1lbnRpb25lZCBpbiB0aGVyZSB0byBmZWVsIHlvdSBnZXQgdGhlIGNyZWRpdAogIHlvdSBkZXNlcnZlLgoKLSBsaWIvZWFzeS5jIGRpZG4ndCBjb21waWxlIHByb3Blcmx5IGluIHRoZSA3LjgtcHJlMSBkdWUgdG8gYSBzaWxseSBtaXN0YWtlCgpWZXJzaW9uIDcuOC1wcmUxCgpEYW5pZWwgKDI4IE1heSAyMDAxKQotIGN1cmwtY29uZmlnIG5vdyBzdXBwb3J0cyAnLS12ZXJudW0nIHRoYXQgb3V0cHV0cyBhIHBsYWluIGhleGFkZWNpbWFsIHZlcnNpb24KICBvZiB0aGUgbGliY3VybCB2ZXJzaW9uIG51bWJlciAodXNpbmcgOCBiaXRzIGZvciBlYWNoIDMgbnVtYmVycykuIFZlcnNpb24KICA3LjcuNCBhcHBlYXJzIGFzIDA3MDcwNAoKLSBXcm90ZSBtYW4gcGFnZXMgZm9yIGN1cmxfZ2xvYmFsX2luaXQgYW5kIGN1cmxfZ2xvYmFsX2NsZWFudXAuLi4KCi0gVC4gQmhhcmF0aCBicm91Z2h0IG5ld3MgYWJvdXQgdGhlIHVzYWdlIG9mIHRoZSBPcGVuU1NMIGludGVyZmFjZSB0aGF0IHdhcwogIG5vdCBwcmV2aW91c2x5IHRha2VuIGludG8gY29uc2lkZXJhdGlvbiBhbmQgdGh1cyBjYXVzZWQgbGliY3VybCB0byBsZWFrCiAgbWVtb3J5LiAgVGhlIG9ubHkgc29tZXdoYXQgc2FuZSBhcHByb2FjaCB0byBmaXggdGhpcyBkaWxlbW1hLCBpcyBhZGRpbmcgdHdvCiAgdHdvIG5ldyBmdW5jdGlvbnMgY3VybF9nbG9iYWxfaW5pdCgpIGFuZCBjdXJsX2dsb2JhbF9jbGVhbnVwKCkgdGhhdCBzaG91bGQKICBiZSBjYWxsZWQgKk9OQ0UqIGJ5IHRoZSBhcHBsaWNhdGlvbiB1c2luZyBsaWJjdXJsLiBUaGUgaW5pdCBzaG91bGQgYmUgZG9uZQogIG9ubHkgYXQgc3RhcnR1cCwgbm8gbWF0dGVyIGhvdyBtYW55IHRocmVhZHMgdGhlIGFwcGxpY2F0aW9uIGlzIGdvbm5hIHVzZSwKICBhbmQgdGhlIGNsZWFudXAgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgZmluaXNoZWQgdXNpbmcKICBsaWJjdXJsIGNvbXBsZXRlbHkuCgogICoqKiBVUEdSQURFIE5PVElDRSAqKioKCiAgSWYgeW91IHdyaXRlIGFwcGxpY2F0aW9ucyB1c2luZyBsaWJjdXJsLCB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIHRoZSB0d28KICBmdW5jdGlvbnMgbWVudGlvbmVkIGFib3ZlICEhIQoKICBJIGNhbid0IHNheSBJIHRoaW5rIHRoaXMgaXMgYSB2ZXJ5IGJlYXV0aWZ1bCBzb2x1dGlvbiwgYnV0IGFzIE9wZW5TU0wKICBpbnNpc3RzIG9uIG1ha2luZyBsb3RzIG9mIHN0dWZmIG9uIGEgImdsb2JhbCIgc2NvcGUsIHdlJ3JlIGZvcmNlZCB0byB3YWxrCiAgdGhlIHBhdGggdGhleSBwb2ludCB1cyB0by4KCi0gTW92aW5nIG1vcmUgdGVzdCBjYXNlcyBpbnRvIHRoZSBuZXcgZmlsZSBmb3JtYXQuCgpWZXJzaW9uIDcuNy40LXByZTMKCkRhbmllbCAoMjMgTWF5IDIwMDEpCi0gSW50cm9kdWNlZCBhIG5ldyBmaWxlIGZvcm1hdCBmb3Igc3RvcmluZyB0ZXN0IGNhc2VzLCBhbmQgdGh1cyBJIGhhZCB0bwogIG1vZGlmeSBhbGwgdGhlIHBlcmwgdGVzdCBzY3JpcHRzIGFuZCBtb3JlIChJIGFkZGVkIGEgbmV3IG9uZSkuIEkgaGF2ZSBub3QKICAicG9ydGVkIiBhbGwgdGhlIG9sZCB0ZXN0IGNhc2VzIHRvIHRoZSBuZXcgZm9ybWF0IHlldCwgYnV0IGl0J2xsIGNvbWUuCgogIFRoZSBtYWluIGFkdmFudGFnZSBvZiB0aGlzIG5ldyBmb3JtYXQgaXMgdGhhdCBhbGwgdGVzdCBkYXRhIGZvciBlYWNoIHRlc3QKICBjYXNlIGlzIHN0b3JlZCBpbiBhIHNpbmdsZSBmaWxlLiBJdCBnaXZlcyBhIGJldHRlciBvdmVydmlldyBmb3IgZWFjaCB0ZXN0CiAgY2FzZSBhbmQgYSBsb3QgbGVzcyBmaWxlcy4KCi0gQW5kculzIEdhcmPtYSBicm91Z2h0IGEgZml4IGZvciB0aGUgbmV0c2NhcGUvbW96aWxsYSBjb29raWUgZmlsZSBwYXJzaW5nCiAgZnVuY3Rpb24sIGFzIGl0IHR1cm5zIG91dCBpdCBkb2Vzbid0IGFsd2F5cyBzdG9yZSB0aGUgcGF0aCEKCkRhbmllbCAoMjIgTWF5IDIwMDEpCi0gQXMgd2FzIHJlcG9ydGVkIGFub255bW91c2x5LCB3aGVuIEZBSUxPTkVSUk9SIHdhcyB1c2VkLCB0aGUgaHR0cGNvZGUgd2FzCiAgbm90IHN0b3JlZCBwcm9wZXJseSBhbmQgdGh1cyB3YXNuJ3QgcG9zc2libHkgdG8gcmVhZCBhZnRlciBhIHRyYW5zZmVyIHdpdGgKICB0aGUgY3VybF9lYXN5X2dldGluZm8oKSBmdW5jdGlvbi4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKLSBJbnN0YWxsZWQgYW5kIG1hZGUgdXNlIG9mIHRoZSBmb2xsb3dpbmcgdG9vbCB2ZXJzaW9uczoKICAgIGF1dG9jb25mIDIuNTAKICAgIGxpYnRvb2wgMS40CiAgICBhdXRvbWFrZSAxLjQtcDEKCiAgSSB3b3VsZG4ndCByZWNvbW1lbmQgYW55IGRldmVsb3BlciB0byB0cnkgdG8gZ2VuZXJhdGUgdGhpbmdzIHdpdGggb2xkZXIKICB2ZXJzaW9ucyB0aGFuIHRoZXNlLiBCdWlsZGluZyBmcm9tIENWUyB3aWxsIHByb2JhYmx5IG1vcmUgb3IgbGVzcyByZXF1aXJlCiAgYXQgbGVhc3QgdGhlc2UgdmVyc2lvbnMuCgogIEFzIGEgcmVzdWx0IG9mIHRoaXMsIHRoZSBjb25maWd1cmUgc2NyaXB0IGdyZXcgdG8gbW9yZSB0aGFuIGRvdWJsZSBpdHMKICBwcmV2aW91cyBzaXplIQoKICBBcmthZGl1c3ogTWlza2lld2ljeiBoZWxwZWQgbWUgYnkgcG9pbnRpbmcgb3V0IEkgaGFkIHRvIHJlbW92ZSBteQogIGFjaW5jbHVkZS5tNCBmaWxlIGJlZm9yZSBJIGNvdWxkIGdldCBpdCB3b3JraW5nIQoKRGFuaWVsICgyMSBNYXkgMjAwMSkKLSBJIG1hZGUgZnRwczovLyB3b3JrLiBBZGRlZCB0ZXN0IGNhc2UgNDAwIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUsIGFzIHRoZQogIGZpcnN0IGZ0cHM6Ly8gdGVzdCBjYXNlLiBSZXF1aXJlcyBzdHVubmVsLgoKLSBBbHNvIG1hZGUgdGhlIHRlc3QgY2FzZXMgdGhhdCBydW5zIHNzbCB0ZXN0cyBub3QgcnVuIGlmIGxpYmN1cmwgaXNuJ3QgYnVpbHQKICB3aXRoIHNzbCBzdXBwb3J0LgoKRGFuaWVsICgxOSBNYXkgMjAwMSkKLSBNYWRlIHRoZSBjb25maWd1cmUgbm90IGFkZCBhbnkgZXh0cmEgLUwgTERGTEFHUyBvciAtSSBDUFBGTEFHUyB1bmxlc3MgdGhleQogIGFyZSBhY3R1YWxseSBuZWVkZWQuIEFsYmVydCBDaGluJ3MgYW5kIERvbWVuaWNvIEFuZHJlb2xpJ3Mgc3VnZ2VzdGlvbnMKICBoZWxwZWQgb3V0LgoKVmVyc2lvbiA3LjcuNC1wcmUyCgpEYW5pZWwgKDE4IE1heSAyMDAxKQotIE5pY2VyIGNvbmZpZ3VyZS1jaGVjayBmb3IgdGhlIE9wZW5TU0wgaGVhZGVycywgd2hpY2ggdGhlbiBzZXRzIHRoZSBwcm9wZXIKICB2YXJpYWJsZSB0byBoYXZlIGN1cmwtY29uZmlnIGJlIGdvb2QuIChBbGJlcnQgQ2hpbiBwcm92aWRlZCB0aGUgZml4KQoKLSBGb3Igc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgdGhlaXcgb3duICdzdHJsY2F0KCknIGxpYmN1cmwgcHJvdmlkZXMgaXRzIG93bi4KICBJdCB3YXMgbm93IHJlbmFtZWQgdG8gcHJldmVudCBjb2xsaWRlcyB3aXRoIG90aGVyIGxpYnMuIChBZnRlciBkaXNjdXNzaW9ucwogIHdpdGggU3RlcmxpbmcgSHVnaGVzIGFuZCB0aGUgaW1wbGljYXRpb25zIHRoaXMgaGFkIG9uIFBIUCBidWlsZHMuKQoKRGFuaWVsICgxNyBNYXkgMjAwMSkKLSBDb2xtIEJ1Y2tsZXkgcG9zdGVkIGEgZGV0YWlsZWQgYnVnIHJlcG9ydCBvbiAodGhlIGRlYmlhbml6ZWQpIDcuNy4zLCB0aGF0CiAgdHVybmVkIG91dCB0byBiZSBhIHByb2JsZW0gd2l0aCB0aGUgZGViaWFuLWJ1aWx0IDcuNy4zLXBhY2thZ2UgdGhhdAogIGNvbnRhaW5lZCBmaWxlcyBmcm9tIHRoZSA3LjcuMiByZWxlYXNlIQoKLSBJIGFkZGVkIHRoZSBDVVJMRV9BTFJFQURZX0NPTVBMRVRFIGFnYWluLCBidXQgd2l0aCBhIGZha2UgdmFsdWUsIGp1c3QgdG8KICBtYWtlIHByb2dyYW1zIHRoYXQgdXNlIGl0LCBub3QgZmFpbCB3aGVuIGNvbXBpbGluZyBhZ2FpbnN0IHRoaXMgdmVyc2lvbiBvZgogIGxpYmN1cmwuCgpEYW5pZWwgKDE0IE1heSAyMDAxKQotIFBhd2VsIEEuIEdhamRhIGZpeGVkIGEgcHJvYmxlbSB3aXRoIHJlc3VtZWQgdHJhbnNmZXJzIG9uIHJlLXVzZWQgcGVyc2lzdGVudAogIGNvbm5lY3Rpb25zLgoKVmVyc2lvbiA3LjcuNC1wcmUxCgpEYW5pZWwgKDE0IE1heSAyMDAxKQotIEp1bi1pY2hpcm8gaXRvanVuIEhhZ2lubyBmaXhlZCBGVFAgUE9SVCBmb3IgSVB2Ni1lbmFibGVkIGxpYmN1cmwuCgotIEFkZGVkIHRoZSBmaXJzdCBIVFRQUyB0ZXN0IHRvIHRoZSB0ZXN0IHN1aXRlIGluIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDEyIE1heSAyMDAxKQotIEp1a2thIFBpaGwgc3VnZ2VzdGVkIHRoYXQgaWYgKGxpYiljdXJsIGlzIHRvbGQgdG8gdmVyaWZ5IHRoZSBwZWVyJ3MKICBjZXJ0aWZpY2F0ZSBhbmQgdGhlIHBlZXIgY2FuJ3QgYmUgdmVyaWZpZWQsIGl0IHNob3VsZCBmYWlsIGFuZCByZXR1cm4gYQogIHByb3BlciBlcnJvciBjb2RlLiBJIGFkZGVkIGEgYnJhbmQgbmV3IGVycm9yIGNvZGUgbmFtZWQKICBDVVJMRV9TU0xfUEVFUl9DRVJUSUZJQ0FURSBmb3IgdGhpcyBwdXJwb3NlLgoKRGFuaWVsICgxMSBNYXkgMjAwMSkKLSBBcyB3YXMgZGlzY3Vzc2VkIHdpdGggRnJlZGVyaWMgTGVwaWVkIGEgd2hpbGUgYWdvLCBJIG5vdyBtYWRlIGxpYmN1cmwgbm90CiAgcmV0dXJuIGVycm9yIGV2ZW4gdGhvdWdoIG5vIGRhdGEgd2FzIHRyYW5zZmVyZWQgb24gdXBsb2FkL2Rvd25sb2FkIHJlc3VtZQogIHdoZW4gdGhlIG5vIHRyYW5zZmVyIGlzIG5lZWRlZC4gVGhlIENVUkxFX0FMUkVBRFlfQ09NUExFVEUgZXJyb3Igd2FzIHJlbW92ZWQKICBmcm9tIHRoZSBoZWFkZXIgZmlsZSB0byBtYWtlIGFueSBpbXBsZW1lbmF0b3IgdGhhdCB1c2VzIHRoYXQgdG8gYmUgYXdhcmUgb2YKICB0aGUgZmFjdCB0aGF0IGl0IGNhbid0IGJlIHJldHVybmVkIGFueW1vcmUhCgotIEltcHJvdmVkIGdlbmVyYWwgaGVhZGVyLXBhcnNpbmcgdG8gYmV0dGVyIGFsbG93IHdoaXRlIHNwYWNlcyBhbmQgbW9yZS4KCi0gUm9kbmV5IFNpbW1vbnMgcHJvdmVkIHRoZSBmaXggSSBkaWQgeWVzdGVyZGF5IHdhcyBiYWQgYW5kIEkgaGFkIHRvIHBvc3QKICBhbm90aGVyIG9uZS4KCi0gSW5nbyBXaWxrZW4gcGF0Y2hlZCBhd2F5IHR3byByZWRpcmVjdCBwcm9ibGVtcyBtb3JlIQogIApEYW5pZWwgKDEwIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiBjb3JyZWN0bHkgbm90ZWQgdGhhdCB0aGUgc3BhY2UtYWZ0ZXItaGVhZGVyIHByb2JsZW0gd2l0aAogIExvY2F0aW9uOiBpcyBwcmVzZW50IG9uIHNldmVyYWwgb3RoZXIgcGxhY2VzIGluIHRoZSBsaWJjdXJsIHNvdXJjZXMuCgotIEluZ28gV2lsa2VuIHBhdGNoZWQgYXdheSBhIHByb2JsZW0gbGliY3VybCBoYWQgd2hlbiBmb2xsb3dpbmcgTG9jYXRpb246CiAgaGVhZGVycyB3aXRoIGFuIGV4dHJhIHNwYWNlIGFmdGVyIHRoZSBjb2xvbi4KCi0gUm9kbmV5IFNpbW1vbnMgZm91bmQgb3V0IHRoYXQgbXVsdGlwbGUgRlRQIHRyYW5zZmVycyBkaWQgbm90IHRyZWF0IHJlbGF0aXZlCiAgZGlyZWN0b3JpZXMgY29ycmVjdGx5LgoKRGFuaWVsICg5IE1heSAyMDAxKQotIEdldHRpbmcgYW4gRlRQIGZpbGUgd2l0aCBDVVJMT1BUX05PQk9EWSBzZXQgKG9yIC1JIGZyb20gdGhlIGNvbW1hbmQgbGluZSksCiAgbWFrZXMgY3VybCB1c2UgdGhlIG5vbi1zdGFuZGFyZCBmdHAgY29tbWFuZCAiU0laRSIuIElmIGl0IGZhaWxlZCwgbGliY3VybAogIHJldHVybmVkIGVycm9yLiBTdGFydGluZyBub3csIGl0IGp1c3QgZG9uJ3Qgb3V0cHV0IHRoZSBmaWxlIHNpemUgaW5zdGVhZC4KICBBbm9ueW1vdXMgYnVnIHJlcG9ydC4KCi0gc3R1bm5lbC5wbSB3YXMgYWNjaWRlbnRhbGx5IGxlZnQgb3V0IGZyb20gdGhlIHJlbGVhc2UgYXJjaGl2ZSwgaXQgaXMgbm93CiAgYWRkZWQgKHN0dW5uZWwgaXMgbmVlZGVkIHRvIHJ1biB0aGUgaHR0cHMtdGVzdHMgaW4gdGhlIHRlc3Qgc3VpdGUpCiAgCkRhbmllbCAoNyBNYXkgMjAwMSkKLSBDb3JyZWN0ZWQgdHdvIG1pbm9yIGNvbXBpbGVyIHdhcm5pbmdzIGR1ZSB0byB0aGUgRklMRSAqIHRvIHZvaWQgKiBjb252ZXJzaW9uCiAgdGhhdCBJIG1pc3NlZCBhdCB0d28gcGxhY2VzLiBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgcGF0Y2hlcy4gU2FuZGVyIEdhdGVzCiAgZmlsZWQgYSBidWcgcmVwb3J0IG9uIHRoaXMuCgpWZXJzaW9uIDcuNy4zCgpEYW5pZWwgKDQgTWF5IDIwMDEpCi0gQWxsIGNhbGxiYWNrIGZ1bmN0aW9ucyBub3cgdGFrZSAndm9pZCAqJyBpbnN0ZWFkIG9mICdGSUxFIConLiBUaGlzIGlzIG1hZGUKICB0aGlzIHdheSB0byBtYWtlIGl0IG1vcmUgb2J2aW91cyB0byBwZW9wbGUgdGhhdCBhbnl0aGluZyBjYW4gYmUgcGFzc2VkIHRvCiAgdGhlbSAoYnkgdXNpbmcgdGhlIGFwcm9wcmlhdGUgb3B0aW9uKS4gQWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBTdGVybGluZwogIEh1Z2hlcy4KCkRhbmllbCAoMyBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgZml4ZWQgYSBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nIHByb2JsZW0gd2l0aCBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbiB0aGF0IG1hZGUgbGliY3VybCBmYWlsIGlmIHRoZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gdXNlZCBtaXhlZAogIGNodW5rZWQgYW5kIG5vbi1jaHVua2VkIHRyYW5zZmVycy4KCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIGEgYmFkIHRyZWF0bWVudCBvZiAzMDQtcmVwbGllcywgYXMgdGhleSB3b3VsZCBub3QgYmUKICB0cmVhdGVkIGFzIGNvbnRlbnQtbGVuZ3RoIDAgcmVwbGllcyBidXQgd291bGQgY2F1c2UgYSAiaGFuZyIgdW50aWwgdGhlCiAgc2VydmVyIHRpbWVkLW91dCBhbmQgY2xvc2VkIHRoZSBjb25uZWN0aW9uLgoKLSBCcmFkIEJ1cmRpY2sgZm91bmQgYSBtaW5vciBwcm9ibGVtIGluIHRoZSBkb2NzL2V4YW1wbGVzL01ha2VmaWxlLmFtCgpEYW5pZWwgKDI3IEFwcmlsIDIwMDEpCi0gVXBkYXRlZCB0aGUgSU5URVJBTFMgZG9jdW1lbnQgYWdhaW4uIEl0IHdhcyBsYWdnaW5nIGEgYml0LiBJIHRoaW5rIEkgbWFkZSBpdAogIG1vcmUgZWFzeSB0byBmb2xsb3cgbm93IGFzIHdlbGwuCgotIEJyYWQgQnVyZGljayBmb3VuZCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHdoZW4gY3VybCByZWNlaXZlZAogIGEgIkNvbnRlbnQtTGVuZ3RoOiAwIiBoZWFkZXIuCgotIEdpdXNlcHBlIEQnQW1icm9zaW8gd2FzIGZpcnN0IG91dCB0byByZXBvcnQgdGhhdCBURUxORVQgZG9lc24ndCB3b3JrIGluIGN1cmwKICBjb21waWxlZC9idWlsdCBvbiB3aW4zMi4gSXQgc2VlbXMgdG8gd29yayBmb3IgdW5peGVzIHRob3VnaCEKCi0gRGF2ZSBIYW1pbHRvbiByZXBvcnRlZCB3ZWlyZCBwcm9ibGVtcyB3aXRoIENVUkwvUEhQIHRoYXQgSSByZWFsbHkgY2FuJ3QKICBleHBsYWluIGF0IHRoZSBtb21lbnQuIEknbSBob3Bpbmcgb24gc29tZSBoZWxwIGZyb20gdGhlIFBIUCBjcmV3LgoKRGFuaWVsICgyNiBBcHJpbCAyMDAxKQotIEkgcmV3cm90ZSB0aGUgRlRQIGNvbW1hbmQgcmVzcG9uc2UgZnVuY3Rpb24uIEkgaGFkIHRvIGRvIGl0IHRvIG1ha2UgZnRwcwogIHdvcmssIGFzIHRoZSBPcGVuU1NMIHJlYWQoKS1mdW5jdGlvbiBkaWRuJ3Qgd29yayB0aGUgc2FtZSB3YXkgdGhlIG5vcm1hbAogIHVuaXggcmVhZCgpIGRvZXMsIGJ1dCBpdCB3YXMgYWxzbyBhIGh1Z2UgcGVyZm9ybWFuY2UgYm9vc3QuIFByZXZpb3VzbHkgdGhlCiAgZnVuY3Rpb24gcmVhZCBvbmUgYnl0ZSBhdCBhIHRpbWUsIG5vdyBpdCByZWFkcyB2ZXJ5IGxhcmdlIGNodW5rcywgYW5kIGl0CiAgbWFrZXMgYSBub3RhYmxlIHNwZWVkIGRpZmZlcmVuY2UuCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDEpCi0gQ29ubmVjdGlvbiByZS11c2Ugd2hlbiBub3QgdXNpbmcgYSBwcm94eSBkaWRuJ3Qgd29yayBwcm9wZXJseSBmb3IKICBub24tZGVmYXVsdCBwb3J0IG51bWJlcnMuCgpEYW5pZWwgKDI0IEFwcmlsIDIwMDEpCi0gSSd2ZSBub3RpY2VkIHRoYXQgRlRQUyBkb2Vzbid0IHdvcmsuIFdlIGF0dGVtcHQgdG8gdXNlIHNzbCBldmVuIGZvciB0aGUKICBkYXRhIHRyYW5zZmVyLCB3aGljaCBjYXVzZXMgdGhlIHRyYW5zZmVyIHRvICdoYW5nJy4uLiBXZSBuZWVkIHRvIGZpeCB0aGlzLgoKLSBJbXByb3ZlZCB0aGUgdGVzdCBzdWl0ZSB0byB1c2UgJ3N0dW5uZWwnIHRvIGRvIEhUVFBTIGFuZCBGVFBTIHRlc3Rpbmcgb24KICB0aGUgYWxyZWR5IHdyaXR0ZW4gcGVybCBzZXJ2ZXJzIGVhc2lseS4KCkRhbmllbCAoMjMgQXByaWwgMjAwMSkKLSBUaGUgT3BlblNTTCB2ZXJzaW9uIHN0cmluZyByZWNlbnRseSBtb2RpZmllZCBkaWRuJ3QgemVybyB0ZXJtaW5hdGUgb25lCiAgb2YgdGhlIGdlbmVyYXRlZCBzdHJpbmdzIHByb3Blcmx5LCB3aGljaCBjb3VsZCBsZWFkIHRvIGEgY3Jhc2ggb3Igc2ltcGx5CiAgd2VpcmQgdmVyc2lvbiBzdHJpbmcgb3V0cHV0IQoKVmVyc2lvbiA3LjcuMgoKRGFuaWVsICgyMiBBcHJpbCAyMDAxKQotIFJvc2ltaWxkbyBkYSBTaWx2YSB1cGRhdGVkIHRoZSBNYWtlZmlsZXMgZm9yIEJvcmxhbmQvV2luZG93cy4KCi0gRXJpYyBSYXV0bWFuIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgdGhhdCB3b3VsZAogIGxlYWQgdG8gYnJva2VuIEhvc3Q6IGhlYWRlcnMgaW4gdGhlIHNlY29uZCBIVFRQIHJlcXVlc3QuCgpEYW5pZWwgKDIwIEFwcmlsIDIwMDEpCi0gQWRkZWQgbWFuIHBhZ2VzIGZvciB0aGUgY3VybF9zdHJlcXVhbCgpIGFuZCBjdXJsX21wcmludGYoKSBmYW1pbGllcy4gV3JvdGUKICBhICdsaWJjdXJsIG92ZXJ2aWV3JyBtYW4gcGFnZS4KCi0gU3BlbGwtZml4ZWQgc29tZSBkb2N1bWVudHMuCgotIFMuIE1vb25lc2FteSBjb3JyZWN0ZWQgbWlzdGFrZXMgaW4gdGhlIG1hbiBwYWdlLgoKLSBDcmlzIEJhaWxpZmYgZml4ZWQgdGhlIGN1cmxfc2xpc3RzIG9wdGlvbnMgaW4gdGhlIHBlcmwgaW50ZXJmYWNlLCBwcmVzZW50CiAgc2VwYXJhdGVseSBpbiB0aGUgQ3VybDo6ZWFzeSAxLjEuNCBwYWNrYWdlLgoKRGFuaWVsICgxOSBBcHJpbCAyMDAxKQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcmVtb3ZlZCB0aGUgZGVjaW1hbHMgZnJvbSB0aGUgc2l6ZSB2YXJpYWJsZXMgaW4gdGhlCiAgLS13cml0ZS1vdXQgb3V0cHV0LiBXZSBoYXJkbHkgZXZlciBnZXQgZnJhY3Rpb24gb2YgYnl0ZXMhIDotKQoKVmVyc2lvbiA3LjcuMi1wcmUxCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDEpCgotIEFsYmVydCBDaGluIHByb3ZpZGVkIGEgY29uZmlndXJlIHBhdGNoIGZvciB0aGUgQUNfU1lTX0xBUkdFRklMRSBtYWNyby4KCkRhbmllbCAoMTggQXByaWwgMjAwMSkKLSBJbnB1dCBmcm9tIE1pY2hhZWwgTWVhbGxpbmcgbWFkZSBtZSBhZGQgLS1mZWF0dXJlIHRvIGN1cmwtY29uZmlnLiBJdAogIGRpc3BsYXlzIGEgbGlzdCBvZiBmZWF0dXJlcyB0aGF0IGhhdmUgYmVlbiBidWlsdC1pbiBpbiB0aGUgY3VycmVudAogIGxpYmN1cmwuIFRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGZlYXR1cmVzIHRoYXQgY2FuIGJlIGxpc3RlZCBhcmU6IFNTTCwgS1JCNAogIGFuZCBJUHY2LgoKLSBJIGNvbW1pdHRlZCBDcmlzIGFuZCBHZW9yZydzIHBlcmwgaW50ZXJmYWNlIHdvcmsuIFRoZXkndmUgZ290IGNhbGxiYWNrcwogIHdvcmtpbmcgYW5kIG9wdGlvbnMgdGhhdCByZWNlaXZlcyB0aG9zZSBzbGlzdCBwb2ludGVycy4KCi0gUHVuZWV0IFBhd2FpYSBkZXRlY3RlZCBhIHByb2JsZW0gd2l0aCByZXN1bWVkIGRvd25sb2FkcyB0aGF0IHVzZSBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbnMgYW5kIEkgbWFkZSBhIHJhdGhlciBsYXJnZSB3cml0ZXVwIHRvIGNvcnJlY3QgdGhpcy4gSXQgaXMKICBpbXBvcnRhbnQgdGhhdCBhbGwgc2Vzc2lvbi1kYXRhIGlzIHN0b3JlZCBpbiB0aGUgY29ubmVjdGRhdGEgc3RydWN0IGFuZCBub3QKICBpbiB0aGUgbWFpbiBzdHJ1Y3QgYXMgdGhpcyBwcmV2aW91c2x5IGRpZC4KCkRhbmllbCAoMTcgQXByaWwgMjAwMSkKLSBGcmVkZXJpYyBMZXBpZWQgZml4ZWQgYSBmdHAgcmVzdW1lZCBkb3dubG9hZCBwcm9ibGVtIGFuZCBpbnRyb2R1Y2VkIGEgbmV3CiAgZXJyb3IgY29kZSB0aGF0IGxldHMgYXBwbGljYXRpb25zIGJlIGFibGUgdG8gZGV0ZWN0IHdoZW4gYSByZXN1bWVkIGRvd25sb2FkCiAgYWN0dWFsbHkgZGlkbid0IGRvd25sb2FkIGFueXRoaW5nIHNpbmNlIHRoZSB3aG9sZSBmaWxlIGlzIGFscmVhZHkgcHJlc2VudC4KICBTaG91bGQgdGhpcyByZXR1cm4gT0sgaW5zdGVhZD8KCi0gSSBhZGRlZCAnY3VybC1jb25maWcuaW4nIHRvIHRoZSByb290IGRpciBhbmQgY29uZmlndXJlIHNjcmlwdC4gTm93LCBhCiAgY3VybC1jb25maWcgc2NyaXB0IGlzIG1hZGUgd2hlbiBjdXJsIGlzIGJ1aWx0LiBUaGUgc2NyaXB0IGNhbiBiZSB1c2VkIHRvCiAgZmlndXJlIG91dCBjb21waWxlIHRpbWUgb3B0aW9ucyB1c2VkIHdoZW4gbGliY3VybCB3YXMgYnVpbHQsIHdoaWNoIGluIHR1cm4KICBzaG91bGQgYmUgb3B0aW9ucyBZT1Ugc2hvdWxkIHVzZSB0byBidWlsZCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgbGliY3VybC4KCiAgVGhpcyAqLWNvbmZpZyBzdHlsZSBpcyBub3QgYSBuZXcgaWRlYSwgYnV0IHNvbWV0aGluZyB0aGF0IGhhcyBiZWVuIHVzZWQKICBzdWNjZXNzZnVsbHkgaW4gb3RoZXIgKGxpYnJhcnkgYmFzZWQpIHByb2plY3RzLgoKLSBQaGlsIEthcm4gcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIHdyb25nbHkgZGlkIG5vdCBhbHdheXMgdXNlIEdNVCB0aW1lIHpvbmUKICBmb3IgdGhlIElmLU1vZGlmaWVkLVNpbmNlIHN0eWxlIGhlYWRlcnMuCgotIEdlb3JnIFNjaHdhcnogcG9pbnRlZCBvdXQgYW4gZXh0cmEgbmVlZGVkICNpbmNsdWRlIGZpbGUgbmVlZGVkIGluIHNyYy9tYWluLmMKICBmb3IgY3VybCB0byBidWlsZCBvbiBVbHRyaXguCgpEYW5pZWwgKDExIEFwcmlsIDIwMDEpCi0gQ3JpcyBCYWlsaWZmIHBvaW50ZWQgb3V0IHR3byBwcm9ibGVtcyB0aGF0IEkgY29ycmVjdGVkLiBGaXJzdCwgbGliY3VybCdzIHVzZQogIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBIVFRQX1BST1hZIGluIHVwcGVyY2FzZSBtYXkgYmVjb21lIGEgc2VjdXJpdHkKICBoYXphcmQgd2hlbiBwZW9wbGUgdXNlIGxpYmN1cmwgaW4gYSBzZXJ2ZXIvY2dpIHNpdHVhdGlvbiB3aGVyZSB0aGUgc2VydmVyCiAgc2V0cyB0aGUgSFRUUF8qLXZhcmlhYmxlcyBhY2NvcmRpbmcgdG8gaW5jb21pbmcgaGVhZGVycyBpbiB0aGUgSFRUUAogIHJlcXVlc3QuIFRodXMsIGEgIlByb3h5OiItaGVhZGVyIHdvdWxkIHNldCB0aGF0IGVudmlyb25tZW50IHZhcmlhYmxlIQoKICBUaGVuLCBpbnZva2luZyBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdpdGhvdXQgaGF2aW5nIGFuIFVSTCBzZXQgY2F1c2VkIGEgY3Jhc2guCgotIFMuIE1vb25lc2FteSBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlIGN1cmwgdXNlIG5vbi1ibG9ja2luZyBjb25uZWN0cyBvbgogIHdpbmRvd3Mgd2hlbiBjb25uZWN0aW9uIHRpbWVvdXQgaXMgc2V0LCBhcyBpdCBhbGxvd3Mgd2luZG93cyB1c2VycyB0byBzZXQKICB0aGF0IHRpbWVvdXQhCgotIEhpcm90YWthIE1hdHN1eXVraSB3cm90ZSBhIFJ1YnkgaW50ZXJmYWNlIHRvIGxpYmN1cmwhCgotIENyaXMgQmFpbGlmZiwgRm9ycmVzdCBDYWhvb24gYW5kIEdlb3JnIEhvcm4gd29yayBvbiB0aGUgUGVybCBpbnRlcmZhY2UuCgotIEkndmUgd3JpdHRlbiBhIGZpcnN0IHNob3QgYXQgYSBKYXZhIGludGVyZmFjZSB0byBsaWJjdXJsLiBNYW55IHRoYW5rcyB0bwogIERhbmllbCBNYXJlbGwgZm9yIHRpcmVsZXNzbHkgYW5zd2VyaW5nIHRvIGFsbCBteSBiYXNpYyBKYXZhIHF1ZXN0aW9ucy4gSXQKICB3b3JrcywgYnV0IGl0IGlzIHN0aWxsIHZlcnkgYmFzaWMuCgpEYW5pZWwgKDEwIEFwcmlsIDIwMDEpCi0gVGhlIHByb2dyZXNzIGRpc3BsYXkgY291bGQgZ2V0IHNpbGx5IHdoZW4gZG9pbmcgbXVsdGlwbGUgZmlsZSB0cmFuc2ZlcnMsIGFzCiAgaXQgd2Fzbid0IHByb3Blcmx5IHJlc2V0IGJldHdlZW4gdHJhbnNmZXJzIQoKLSBEaXNjdXNzaW9ucyB3aXRoIENyaXMgQmFpbGlmZiB3aG8gd3JpdGVzIGEgUGVybCBpbnRlcmZhY2UgdG8gbGliY3VybCwgbWFkZQogIG1lIGFkZCBDVVJMT1BUX0hFQURFUkZVTkNUSU9OLiBJdCBjYW4gYmUgdXNlZCB0byBzZXQgYSBzZXBhcmF0ZSBjYWxsYmFjawogIGZ1bmN0aW9uIGZvciB3cml0aW5nIGhlYWRlcnMuIFByZXZpb3VzbHkgeW91IGNvdWxkIG9ubHkgc2V0IGEgZGlmZmVyZW50IEZJTEUKICAqIHdoZW4gaGVhZGVycyBhcmUgd3JpdHRlbiBmcm9tIHdpdGhpbiBsaWJjdXJsLgoKRGFuaWVsICg3IEFwcmlsIDIwMDEpCi0gQW5kculzIEdhcmPtYSBmaXhlZCBhIHByb2JsZW0gaW4gY3VybF9lc2NhcGUoKSBhbmQgcG9pbnRlZCBvdXQgYSBmbGF3IGluCiAgdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2UuCgpEYW5pZWwgKDYgQXByaWwgMjAwMSkKLSBBZGp1c3RlZCB0aGUgdmVyc2lvbiBjb2RlIHRvIHByb3Blcmx5IGRpc3BsYXkgT3BlblNTTCAwLjkuNmEuIFRoZXkgc3VyZQogIGNoYW5nZSB0aGVpciB2ZXJzaW9uIGRlZmluZSBmb3JtYXQgb2Z0ZW4uLi4KCi0gY3VybF9mb3JtZnJlZSgpIG5vdyBhY2NlcHRzIGEgTlVMTCBwb2ludGVyIHdpdGhvdXQgY3Jhc2hpbmchCgpWZXJzaW9uIDcuNy4xCgpEYW5pZWwgKDMgQXByaWwgMjAwMSkKLSBQdW5lZXQgUGF3YWlhIHBvaW50ZWQgb3V0IHR3byBzZXJpb3VzIHByb2JsZW1zLiBMaWJjdXJsIHdvdWxkIGF0dGVtcHQgdG8KICByZWFkIGJhZCBtZW1vcnkgZHVyaW5nIHNpdHVhdGlvbnMgd2hlbiBhbiAoZnRwKSBjb25uZWN0aW9uIGF0dGVtcHQgZmFpbGVkLgogIEFsc28sIHRoZSBsaWIvTWFrZWZpbGUudmM2IHdhcyBjb3JyZWN0ZWQuCgotIE1vcmUgaW52ZXN0aWdhdGlvbnMgaW4gdGhlIExvY2F0aW9uOiBmb2xsb3dpbmcgY29kZSBtYWRlIG1lIHJlYWxpemUgdGhhdAogIGl0IHdhcyBub3QgY2xlYW4gZW5vdWdoIHRvIHdvcmsgdHJhbnNwYXJhbnRseSB3aXRoIHBlcnNpc3RlbnQgYW5kIG5vbi0KICBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLiBJIHRoaW5rIEkndmUgZml4ZWQgaXQgbm93LgoKRGFuaWVsICgyOSBNYXJjaCAyMDAxKQotIEdlb3JnIEhvcm4gbWFpbGVkIG1lIHNvbWUgY29ycmVjdGlvbnMgZm9yIHRoZSBDdXJsOjplYXN5IHBlcmwgaW50ZXJmYWNlLgoKLSBFeHBlcmltZW50YWwgZnRwczovLyBzdXBwb3J0IGFkZGVkLiBJdCBpcyBiYXNpY2FsbHkgRlRQIG92ZXIgU1NMIGZvciB0aGUKICBjb250cm9sIGNvbm5lY3Rpb24uIEl0IHN0aWxsIG1ha2VzIGFsbCBkYXRhIHRyYW5zZmVycyBnb2luZyBvdmVyIHVuZW5jcnlwdGVkCiAgY29ubmVjdGlvbnMuIFJhaW5lciBXZWlrdXNhdCdzIGZ0cGQtc3NsIHNlcnZlciBoYWNrIHN1cHBvcnRzIHRoaXMgYW5kIEkgdXNlZAogIHRoYXQgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKRGFuaWVsICgyNyBNYXJjaCAyMDAxKQotIEd1ZW5vbGUgQmVzY29uIGRpc2NvdmVyZWQgdGhhdCBpZiB5b3Ugc2V0IGEgQ1VSTE9QVF9USU1FT1VUIGFuZCB0aGVuIHRyaWVkCiAgdG8gZ2V0IGEgZmlsZSBmcm9tIGEgc2l0ZSBhbmQgaXQgZmFpbHMsIHRoZSBTSUdBTFJNIHdvdWxkIHN0aWxsIGJlIHNlbnQKICBhZnRlciB0aGUgdGltZW91dC10aW1lLCBxdWl0ZSBpbmV4cGVjdGVkbHkhCgotIEkgYWRkZWQgYW4gZnRwIHRyYW5zZmVyIGV4YW1wbGUgdG8gZG9jcy9leGFtcGxlcy8gYW5kIEkgYWxzbyB3cm90ZSBhIHRpbnkKICBleGFtcGxlIG1ha2VmaWxlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBzdGFydCB3aGVuIGJ1aWxkaW5nIG9uZSBvZiB0aGUKICBleGFtcGxlcy4KClZlcnNpb24gNy43LjEtYmV0YTEKCkRhbmllbCAoMjYgTWFyY2ggMjAwMSkKLSBNb2hhbWVkIExyaGF6aSByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIDcuNi4xIGFuZCBwZXJzaXN0ZW50IEhUVFAvMS4wCiAgY29ubmVjdGlvbnMgKHdoZW4gdGhlIHNlcnZlciByZXBsaWVkIGEgQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSkgYW5kIHRoaXMKICBwcm9ibGVtIHdhcyBub3QgcHJvcGVybHkgZGVhbHQgd2l0aCBpbiA3LjcgZWl0aGVyLiBBIHBhdGNoIHdhcyBwb3N0ZWQgdG8gdGhlCiAgY3VybC1hbmQtcGhwIG1haWxpbmcgbGlzdC4KCkRhbmllbCAoMjQgTWFyY2ggMjAwMSkKLSBDb2xpbiBXYXRzb24gcmVwb3J0ZWQgYWJvdXQgYSBwcm9ibGVtIGFuZCBicm91Z2h0IGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgaXQsCiAgd2hpY2ggd2FzIGFib3V0IHRoZSBtYW4gcGFnZSBhbmQgbGluZXMgc3RhcnRpbmcgd2l0aCBhIHNpbmdsZSBxdW90ZSAoJykgaW4gYQogIHdheSB0aGF0IGducm9mZiBkb2Vzbid0IGxpa2UuCgpEYW5pZWwgKDIzIE1hcmNoIDIwMDEpCi0gUGV0ZXIgQnJheSByZXBvcnRlZCBjb3JyZWN0bHkgdGhhdCB0aGUgcm9vdCBtYWtlZmlsZSB1c2VkIG1ha2UgaW5zdGVhZCBvZgogICQoTUFLRSkgZm9yIHRoZSB0ZXN0IHRhcmdldC4KCi0gQ29ycmVjdGVkIHRoZSBDdXJsOjplYXN5IHBlcmwgaW50ZXJmYWNlIHRvIHVzZSBjdXJsX2Vhc3lfc2V0b3B0KCkgYW5kIG5vdAogIGN1cmxfc2V0b3B0KCkgd2hpY2ggd2FzIHJlbW92ZWQgaW4gNy43IQoKLSBTLiBNb29uZXNhbXkgcHJvdmlkZWQgdXBkYXRlcyBvbiB0aHJlZSBkb2N1bWVudHMgKE1BTlVBTCwgSU5TVEFMTCBhbmQgRkFRKS4KCi0gV2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjosIGxpYmN1cmwgd291bGQgc29tZXRpbWVzIHdyaXRlIHRvIHRoZSBVUkwgc3RyaW5nCiAgaW4gYSB3YXkgaXQgc2hvdWxkbid0LiBBcyB0aGUgcG9pbnRlciBpcyBwYXNzZWQtaW4gdG8gbGliY3VybCBmcm9tIGFuCiAgYXBwbGljYXRpb24sIHdlIGNhbid0IGJlIGFsbG93ZWQgdG8gd3JpdGUgdG8gaXQuIFRoZSBwYXJ0aWN1bGFyIGJ1ZyByZXBvcnQKICBmcm9tICduaycgdGhhdCBicm91Z2h0IHRoaXMgdXAgd2FzIGJlY2F1c2UgaGUgaGFkIGEgcmVhZC1vbmx5IFVSTCB0aGF0IHRoZW4KICBjYXVzZWQgYSBsaWJjdXJsIGNyYXNoIQoKLSBObyBsb25nZXIgcmVhZHMgSEVBRCByZXNwb25zZXMgbG9uZ2VyIHRoYW4gdG8gdGhlIGxhc3QgaGVhZGVyLiBQcmV2aW91c2x5LAogIGN1cmwgd291bGQgcmVhZCB0aGUgZnVsbCByZXBseSBpZiB0aGUgY29ubmVjdGlvbiB3YXMgYSAiY2xvc2UiIG9uZS4KCi0gbGliY3VybCBkaWQgcmUtdXNlIGNvbm5lY3Rpb25zIHdheSB0b28gbXVjaC4gRG9pbmcgImN1cmwKICBodHRwOi8vd3d3LnttaWNyb3NvZnQsaWJtfS5jb20iIHdvdWxkIG1ha2UgaXQgcmUtdXNlIHRoZSBjb25uZWN0aW9uIHdoaWNoCiAgbWFkZSB0aGUgc2Vjb25kIHJlcXVlc3QgcmV0dXJuIHZlcnkgb2RkIHJlc3VsdHMuCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDEpCi0gRWRpbiBLYWRyaWJhc2ljIG1hZGUgbWUgYXdhcmUgdGhhdCBjdXJsIHNob3VsZCBub3QgcmUtc2VuZCBQT1NUIHJlcXVlc3RzCiAgd2hlbiBmb2xsb3dpbmcgMzAyLXJlZGlyZWN0cy4gSSBtYWRlIDMwMiB3b3JrIGxpa2UgMzAzIHdoaWNoIG1lYW5zIGN1cmwgdXNlcwogIEdFVCBpbiB0aGUgZm9sbG93aW5nIHJlcXVlc3QocykuCgotIGxpYmN1cmwgbm93IHJlc2V0IHRoZSAiZm9sbG93ZWQtbG9jYXRpb24iIGNvdW50ZXIgb24gZWFjaCBpbnZva2Ugb2YKICBjdXJsX2Vhc3lfcGVyZm9ybSgpIGFzIGl0IG90aGVyd2lzZSB3b3VsZCBzdW0gdXAgYWxsIHJlZGlyZWN0cyBvbiB0aGUgc2FtZQogIGNvbm5lY3Rpb24gYW5kIHRodXMgY291bGQgcmVhY2ggdGhlIG1heHJlZGlycyBjb3VudGVyIHdyb25nbHkuCgotIEppbSBEcmFzaCBzdWdnZXN0ZWQgY3VybF9lc2NhcGUoKSBzaG91bGQgbm90IHJlLWVuY29kZSB3aGF0IGFscmVhZHkgbG9va3MKICBsaWtlIGFuIGVuY29kZWQgc2VxdWVuY2UgYW5kIEkgdGhpbmsgdGhhdCdzIGEgZmFpciBzdWdnZXN0aW9uLgoKVmVyc2lvbiA3LjcKCkRhbmllbCAoMjIgTWFyY2ggMjAwMSkKLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgZmFpbHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIGdldGhvc3RieW5hbWVfcigpIGlzCiAgZGV0ZWN0ZWQgYnV0IGl0IGNvdWxkbid0IGZpZ3VyZSBvdXQgaG93IHRvIGludm9rZSBpdCAod2hhdCBhbW91bnQgb2YKICBhcmd1bWVudHMgaXQgaXMgc3VwcG9zZWQgdG8gZ2V0KS4gUmVwb3J0cyBmcm9tIEFuZHLpcyBHYXJj7WEgbWFkZSBtZSBhd2FyZQogIG9mIHRoaXMgbmVlZC4KCi0gVGFsa2luZyB3aXRoIEppbSBEcmFzaCBtYWRlIG1lIGZpbmFsbHkgcHV0IHRoZSBjdXJsX2VzY2FwZSBhbmQgY3VybF91bmVzY2FwZQogIGZ1bmN0aW9ucyBpbiB0aGUgY3VybC5oIGluY2x1ZGUgZmlsZSBhbmQgd3JpdGUgbWFuIHBhZ2VzIGZvciB0aGVtLiBUaGUKICBlc2NhcGUgZnVuY3Rpb24gd2FzIG1vZGlmaWVkIHRvIHVzZSB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgdGhlIHVuZXNjYXBlIG9uZQogIGhhZC4KCi0gTm8gYnVnIHJlcG9ydHMgYXQgYWxsIG9uIHRoZSBsYXRlc3QgYmV0YXMuIFJlbGVhc2UgdGltZSBjb21pbmcgdXAuCgpWZXJzaW9uIDcuNy1iZXRhNQoKRGFuaWVsICgxOSBNYXJjaCAyMDAxKQotIEdlb3JnIE90dGluZ2VyIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggdXNpbmcgLUMgdG9nZXRoZXIgd2l0aCAtTCBpbiB0aGUgc2Vuc2UKICB0aGF0IHRoZSAtQyBpbmZvIGdvdCBsb3N0IHdoZW4gaXQgd2FzIHJlZGlyZWN0ZWQuIEkgY291bGQgbm90IHJlcGVhdCB0aGlzCiAgcHJvYmxlbSBvbiB0aGUgNy43IGJyYW5jaCB3aHkgSSBsZWF2ZSB0aGlzIGZvciB0aGUgbW9tZW50LiBUZXN0IGNhc2UgMzkgd2FzCiAgYWRkZWQgdG8gZG8gZXhhY3RseSB0aGlzLCBhbmQgaXQgc2VlbXMgdG8gZG8gcmlnaHQuCgotIENocmlzdGlhbiBSb2JvdHRvbSBSZWlzIHJlcG9ydGVkIGhvdyBoaXMgNy43IGJldGEgZGlkbid0IHN1Y2Nlc3NmdWxseSBkbwogIGZvcm0gcG9zdHMgYXMgZWxlZ2FudGx5IGFzIDcuNi4xIGRpZC4gSW5kZWVkLCB0aGlzIHdhcyBhIGZsYXcgaW4gdGhlIGhlYWRlcgogIGVuZ2luZSwgYXMgSFRUUCAxLjEgaGFzIGludHJvZHVjZWQgYSBuZXcgMTAwICJ0cmFuc2llbnQiIHJldHVybiBjb2RlIGZvciBQVVQKICBhbmQgUE9TVCBvcGVyYXRpb25zIHRoYXQgSSBuZWVkIHRvIGFkZCBzdXBwb3J0IGZvci4gU2VjdGlvbiA4LjIuMyBpbiBSRkMyNjE2CiAgaGFzIGFsbCB0aGUgZGV0YWlscy4gU2VlbXMgdG8gd29yayBub3chCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDEpCi0gQWZ0ZXIgaGF2aW5nIGV4cGVyaWVuY2VkIGFub3RoZXIgbWFjaGluZSBicmVhay1kb3duLCB3ZSdyZSBiYWNrLgoKLSBHZW9yZyBIb3JuJ3MgcGVybCBpbnRlcmZhY2UgQ3VybDo6ZWFzeSBpcyBub3cgaW5jbHVkZWQgaW4gdGhlIGN1cmwgcmVsZWFzZQogIGFyY2hpdmUuIFRoZSBwZXJsLyBkaXJlY3RvcnkgaXMgbm93IHByZXNlbnQuIFBsZWFzZSBoZWxwIG1lIHdpdGggZG9jcywKICBleGFtcGxlcyBhbmQgdXBkYXRlcyB5b3UgdGhpbmsgZml0LgoKLSBNYWRlIGEgbmV3IHBocC8gZGlyZWN0b3J5IGluIHRoZSByZWxlYXNlIGFyY2hpdmUgYW5kIG1vdmVkIHRoZSBQSFAgZXhhbXBsZXMKICBpbnRvIGEgc3ViZGlyZWN0b3J5IGluIHRoZXJlLiBOb3QgbXVjaCBQSFAgaW5mbyB5ZXQsIGJ1dCBJIHBsYW4gdG8uIFBsZWFzZQogIGhlbHAgbWUgaGVyZSBhcyB3ZWxsIQoKLSBNYWRlIGxpYmN1cmwgcmV0dXJuIGVycm9yIGlmIGEgdHJhbnNmZXIgaXMgYWJvcnRlZCBpbiB0aGUgbWlkZGxlIG9mIGEKICAiY2h1bmsiLiBJdCBhY3R1YWxseSBlbmFibGVzIGxpYmN1cmwgdG8gZGlzY292ZXIgcHJlbWF0dXJlIHRyYW5zZmVyIGFib3J0cwogIGV2ZW4gaWYgdGhlIENvbnRlbnQtTGVuZ3RoOiBzaXplIGlzIHVua25vd24uCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDEpCi0gQWRkZWQgLS1jb25uZWN0LXRpbWVvdXQgdG8gY3VybCwgd2hpY2ggc2V0cyB0aGUgbmV3IENVUkxPUFRfQ09OTkVDVFRJTUVPVVQKICBvcHRpb24gaW4gbGliY3VybC4gSXQgbGltaXRzIHRoZSB0aW1lIGN1cmwgaXMgYWxsb3dlZCB0byBzcGVuZCBpbiB0aGUKICBjb25uZWN0aW9uIHBoYXNlLiBUaGlzIGRpZmZlcnMgZnJvbSAtbS8tLW1heC10aW1lIHRoYXQgbGltaXRzIHRoZSBlbnRpcmUKICBmaWxlIHRyYW5zZmVyIG9wZXJhdGlvbi4gUmVxdWVzdGVkIGJ5IExhcnJ5IEZhaG5vZSBhbmQgb3RoZXJzLgoKICBJIGFsc28gdXBkYXRlZCB0aGUgY3VybC4xIGFuZCBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2VzIGFuZCByZW1vdmVkIHRoZQogIGl0ZW0gZnJvbSB0aGUgVE9ETy4KClZlcnNpb24gNy43LWJldGE0CgpEYW5pZWwgKDE0IE1hcmNoIDIwMDEpCi0gTWFkZSBjdXJsIGdyb2sgSVB2NiB3aXRoIEhUVFAgcHJveGllcyBhbmQgZ290IGV2ZXJ5dGhpbmcgdG8gY29tcGlsZSBuaWNlbHkKICBhZ2FpbiB3aGVuIEVOQUJMRV9JUFY2IGlzIHNldC4KCiAgSSBuZWVkIHRvIHJlbWFrZSB0aGluZ3MgaW4gdGhlIHRlc3Qgc3VpdGUuIEkgY2FuJ3QgdGVzdCB0aGUgRlRQIHBhcnRzIHdpdGgKICBjdXJsIGJ1aWx0IGZvciBJUHY2IGFzIGl0IHVzZXMgYSBkaWZmZXJlbnQgc2V0IG9mIEZUUCBjb21tYW5kcyB0aGVuIQoKLSBJIGZlbGwgb250byBhIGJ1ZyByZXBvcnQgb24gcGhwLm5ldCAocG9zdGVkIGJ5IExhcnMgVG9yYmVuIFdpbHNvbikgdGhhdCB3YXMKICBhIHJlcG9ydCBtZWFudCBmb3Igb3VyIHByb2plY3QuIEFueXdheSwgaXQgc2FpZCB0aGUgLm5ldHJjIHBhcnNpbmcgZGlkbid0CiAgd29yayBhcyBzdXBwb3NlZCwgYW5kIGFzIEkgYWdyZWVkIHdpdGggTGFycywgSSBtYWRlIHRoZSBuZXRyYyBwYXJzZXIgdXNlCiAgZ2V0cHd1aWQoKSB0byBmaWd1cmUgb3V0IHRoZSBob21lIGRpcmVjdG9yeSBvZiB0aGUgZWZmZWN0aXZlIHVzZXIgYW5kIHRyeQogIHRoYXQgbmV0cmMuIEl0IHN0aWxsIHVzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEhPTUUgZm9yIHRob3NlIHRoYXQgZG9uJ3QKICBoYXZlIHRoYXQgZnVuY3Rpb24gb3IgaWYgdGhlIHVzZXIgZG9lc24ndCByZXR1cm4gdmFsaWQgcHdkIGluZm8uCgotIEVkaW4gS2FkcmliYWljIHBvc3RlZCBhIGJ1ZyByZXBvcnQgd2hlcmUgaGUgZ290IGEgY3Jhc2ggd2hlbiBhIGZldGNoIHdpdGgKICB1c2VyK3Bhc3N3b3JkIGluIHRoZSBVUkwgZm9sbG93ZWQgYSBMb2NhdGlvbjogdG8gYSBzZWNvbmQgVVJMIChhYnNvbHV0ZSwKICB3aXRob3V0IG5hbWUrcGFzc3dvcmQpLiBUaGlzIGJ1ZyBoYXMgYmVlbiBhcm91bmQgZm9yIGEgbG9uZyB3aGlsZSBhbmQKICBjcmFzaGVzIGR1ZSB0byBhIHJlYWQgYXQgYWRkcmVzcyB6ZXJvLiBGaXhlZCBub3cuIFdyb3RlIHRlc3QgY2FzZSAzOCwgdGhhdAogIHRlc3RzIHRoaXMuCgotIE1vZGlmaWVkIHRoZSB0ZXN0IHN1aXRlJ3MgaHR0cHNlcnZlciBzbGlnaHRseSB0byBhcHBlbmQgYWxsIGNsaWVudCByZXF1ZXN0CiAgZGF0YSB0byBpdHMgbG9nIGZpbGUgc28gdGhhdCB0aGUgdGVzdCBzY3JpcHQgbm93IGJldHRlciBjYW4gdmVyaWZ5IGEgcmFuZ2UKICBvZiByZXF1ZXN0cyBhbmQgbm90IG9ubHkgdGhlIGxhc3Qgb25lLCBhcyBpdCBkaWQgcHJldmlvdXNseS4KCi0gVXBkYXRlZCB0aGUgY3VybCBtYW4gcGFnZSB3aXRoIC0tcmFuZG9tLWZpbGUgYW5kIC0tZWdkLWZpbGUgZGV0YWlscy4KClZlcnNpb24gNy43LWJldGEzCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDEpCi0gQmr2cm4gU3RlbmJlcmcgcHJvdmlkZWQgc2ltaWxhciBmaXhlcyBhcyBK9nJuIGRpZCBhbmQgc29tZSBhZGRpdGlvbmFsIHBhdGNoZXMKICBmb3Igbm9uLVNTTCBjb21waWxlcy4KCi0gSSBpbmNyZWFzZWQgdGhlIGludGVyZmFjZSBudW1iZXIgZm9yIGxpYmN1cmwgYXMgSSd2ZSByZW1vdmVkIHRoZSBsb3cgbGV2ZWwKICBmdW5jdGlvbnMgZnJvbSB0aGUgaW50ZXJmYWNlLiBJIGFsc28gdG9vayB0aGlzIG9wcG9ydHVuaXR5IHRvIHJlbmFtZSB0aGUKICBDdXJsX3N0cmVxdWFsIGZ1bmN0aW9uIHRvIGN1cmxfc3RyZXF1YWwgYW5kIEN1cmxfc3RybmVxdWFsIHRvCiAgY3VybF9zdHJuZXF1YWwsIGFzIHRoZXkncmUgcHVibGljIGxpYmN1cmwgZnVuY3Rpb25zIChldmVuIGlmIHRoZXkncmUgc3RpbGwKICB1bmRvY3VtZW50ZWQpLgoKICBUaGlzIHdpbGwgbWFrZSBvbGRlciBwcm9ncmFtcyBub3QgY2FwYWJsZSBvZiB1c2luZyB0aGUgbmV3IGxpYmN1cmwgd2l0aAogIGp1c3QgYSBkcm9wLWluIHJlcGxhY2VtZW50LgoKLSBK9nJuIEhhcnRyb3RoIHVwZGF0ZWQgc3R1ZmYgZm9yIHdpbjMyIGNvbXBpbGVzOgogIG8gY29uZmlnLXdpbjMyLmggd2FzIGZpeGVkIGZvciBzb2NrbGVuX3QKICBvIGxpYi9zc2x1c2UuYyBoYWQgYSBiYWQgI2VuZGlmIHBsYWNlbWVudAogIG8gbGliL2ZpbGUuYyB3YXMgbWFkZSB0byBjb21waWxlIG9uIHdpbjMyIGFnYWluCiAgbyBsaWIvTWFrZWZpbGUubTMyIHdhcyB1cGRhdGVkIHdpdGggdGhlIG5ldyBmaWxlcwogIG8gbGliL2xpYmN1cmwuZGVmIG1hdGNoZXMgdGhlIGN1cnJlbnQgaW50ZXJmYWNlIHN0YXRlCgpEYW5pZWwgKDEzIE1hcmNoIDIwMDEpCi0gSXQgb25seSB0b29rIGFuIGhvdXIgb3Igc28gYmVmb3JlIEr2cm4gSGFydHJvdGggZm91bmQgYSBwcm9ibGVtIGluIHRoZQogIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcuIEdpdmVuIGhpcyBmaW5lIGV4YW1wbGUtc2l0ZSwgSSBjb3VsZCBlYXNpbHkgc3BvdAogIHRoZSBwcm9ibGVtIGFuZCB3aGVuIEkgcmUtcmVhZCB0aGUgc3BlYyAodGhlIHBhcnQgSSBoYXZlIHBhc3RlZCBpbiB0aGUgdG9wCiAgb2YgdGhlIGh0dHBfY2h1bmtzLmggZmlsZSksIEkgcmVhbGl6ZWQgSSBoYWQgbWFkZSBteSBzdGF0ZS1tYWNoaW5lIHNsaWdodGx5CiAgd3JvbmcgYW5kIGRpZG4ndCBleHBlY3QvaGFuZGxlIHRoZSB0cmFpbGluZyBDUkxGIHRoYXQgY29tZXMgYWZ0ZXIgdGhlIGRhdGEKICBpbiBlYWNoIGNodW5rIChhbmQgdGhvc2UgZXh0cmEgdHdvIGJ5dGVzIHN1cmUgZmVlbCB3YXN0ZWQpLgoKICBIYWQgdG8gbW9kaWZ5IHRlc3QgY2FzZSAzNCB0byBtYXRjaCB0aGlzIGFzIHdlbGwuCgpWZXJzaW9uIDcuNy1iZXRhMgoKRGFuaWVsICgxMyBNYXJjaCAyMDAxKQotIEFkZGVkIHRoZSBwb2xpY3kgc3R1ZmYgdG8gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2UgZm9yIHRoZSB0d28gc3VwcG9ydGVkCiAgcG9saWNpZXMuCgotIEltcGxlbWVudGVkIHNvbWUgc3VwcG9ydCBmb3IgdGhlIENVUkxPUFRfQ0xPU0VQT0xJQ1kgb3B0aW9uLiBUaGUgcG9saWNpZXMKICBDVVJMQ0xPU0VQT0xJQ1lfTEVBU1RfUkVDRU5UTFlfVVNFRCBhbmQgQ1VSTENMT1NFUE9MSUNZX09MREVTVCBhcmUgbm93CiAgc3VwcG9ydGVkLCBhbmQgdGhlICJsZWFzdCByZWNlbnRseSB1c2VkIiBpcyB1c2VkIGFzIGRlZmF1bHQgaWYgbm8gcG9saWN5CiAgaXMgY2hvc2VuLgoKRGFuaWVsICgxMiBNYXJjaCAyMDAxKQotIEFkZGVkIENVUkxPUFRfUkFORE9NX0ZJTEUgYW5kIENVUkxPUFRfRUdEU09DS0VUIHRvIGxpYmN1cmwgZm9yIHNlZWRpbmcgdGhlCiAgU1NMIHJhbmRvbSBlbmdpbmUuIFRoZSByYW5kb20gc2VlZGluZyBzdXBwb3J0IHdhcyBhbHNvIGJyb3VnaHQgdG8gdGhlIGN1cmwKICBjbGllbnQgd2l0aCB0aGUgbmV3IG9wdGlvbnMgLS1yYW5kb20tZmlsZSA8ZmlsZT4gYW5kIC0tZWdkLWZpbGUgPGZpbGU+LiBJCiAgbmVlZCBzb21lIHBlb3BsZSB0byByZWFsbHkgdGVzdCB0aGlzIHRvIGtub3cgdGhleSB3b3JrIGFzIHN1cHBvc2VkLiBSZW1lbWJlcgogIHRoYXQgbGliY3VybCBub3cgaW5mb3JtcyAoaWYgdmVyYm9zZSBpcyBvbikgaWYgdGhlIHJhbmRvbSBzZWVkIGlzIGNvbnNpZGVyZWQKICB3ZWFrIChIVFRQUyBjb25uZWN0aW9ucykuCgotIE1hZGUgdGhlIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcgZW5naW5lIGRldGVjdGVkIGJhZCBmb3JtYXR0ZWQgZGF0YSBsZW5ndGgKICBhbmQgcmV0dXJuIGVycm9yIGlmIHNvICh3ZSBjYW4ndCBwb3NzaWJseSBleHRyYWN0IHNlbnNpYmxlIGRhdGEgaWYgdGhpcyBpcwogIHRoZSBjYXNlKS4gQWRkZWQgYSB0ZXN0IGNhc2UgdGhhdCBkZXRlY3RzIHRoaXMuIE51bWJlciAzNi4gTm93IHRoZXJlIGFyZSA2MAogIHRlc3QgY2FzZXMuCgotIEFkZGVkIDUgbmV3IGxpYmN1cmwgb3B0aW9ucyB0byBjdXJsL2N1cmwuaCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlCiAgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN1cHBvcnQgaW4gbGliY3VybC4gVGhleSdyZSBhbHNvIGRvY3VtZW50ZWQgKGZhaXJseQogIHRob3JvdWdobHkpIGluIHRoZSBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2UuIFRocmVlIG9mIHRoZW0gYXJlIG5vdwogIGltcGxlbWVudGVkLCBhbHRob3VnaCBub3QgcmVhbGx5IHRlc3RlZCBhdCB0aGlzIHBvaW50Li4uIEFueXdheSwgdGhlIG5ldwogIGltcGxlbWVudGVkIG9wdGlvbnMgYXJlIG5hbWVkIENVUkxPUFRfTUFYQ09OTkVDVFMsIENVUkxPUFRfRlJFU0hfQ09OTkVDVCwKICBDVVJMT1BUX0ZPUkJJRF9SRVVTRS4gVGhlIG9uZXMgc3RpbGwgbGVmdCB0byB3cml0ZSBjb2RlIGZvciBhcmU6CiAgQ1VSTE9QVF9DTE9TRVBPTElDWSBhbmQgaXRzIHJlbGF0ZWQgb3B0aW9uIENVUkxPUFRfQ0xPU0VGVU5DVElPTi4KCi0gTWFkZSBjdXJsICh0aGUgYWN0dWFsIGNvbW1hbmQgbGluZSB0b29sKSB1c2UgdGhlIG5ldyBsaWJjdXJsIDcuNyBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbiBzdXBwb3J0IGJ5IHJlLXVzaW5nIHRoZSBzYW1lIGN1cmwgaGFuZGxlIGZvciBldmVyeSBzcGVjaWZpZWQgZmlsZQogIHRyYW5zZmVyIGFuZCBhZnRlciBzb21lIG1vcmUgdGVzdCBjYXNlIHR3ZWFraW5nIHdlIGhhdmUgMTAwJSB0ZXN0IGNhc2UgT0suCiAgSSBtYWRlIHNvbWUgdGVzdCBjYXNlcyByZXR1cm4gSFRUUC8xLjAgbm93IHRvIG1ha2Ugc3VyZSB0aGF0IHdvcmtzIGFzIHdlbGwuCgotIEhhZCB0byBhZGQgJ0Nvbm5lY3Rpb246IGNsb3NlJyB0byB0aGUgaGVhZGVycyBvZiBhIGJ1bmNoIG9mIHRlc3QgY2FzZXMgc28KICB0aGF0IGN1cmwgYmVoYXZlcyAib2xkLXN0eWxlIiBzaW5jZSB0aGUgdGVzdCBodHRwIHNlcnZlciBkb2Vzbid0IGRvIG11bHRpcGxlCiAgY29ubmVjdGlvbnMuLi4gTm93IEkgZ2V0IDEwMCUgdGVzdCBjYXNlIE9LLgoKLSBUaGUgY3VybC5oYXh4LnNlIHNpdGUsIHRoZSBtYWluIGN1cmwgbWFpbGluZyBsaXN0IGFuZCBteSBwZXJzb25hbCBlbWFpbCBhcmUKICBhbGwgZGVhZCB0b2RheSBkdWUgdG8gcG93ZXIgYmxhY2tvdXQgaW4gdGhlIGFyZWEgd2hlcmUgdGhlIG1haW4gc2VydmVycyBhcmUKICBsb2NhdGVkLiBIb3JyaWJsZS4KCi0gSSd2ZSBtYWRlIHBlcnNpc3RhbmNlIHdvcmsgb3ZlciBhIHNxdWlkIEhUVFAgcHJveHkuIEkgZmluZCBpdCBkaXN0dXJiaW5nCiAgdGhhdCBpdCB1c2VzIGhlYWRlcnMgdGhhdCBhcmVuJ3QgcHJlc2VudCBpbiBhbnkgSFRUUCBzdGFuZGFyZCB0aG91Z2gKICAoUHJveHktQ29ubmVjdGlvbjopIGFuZCB0aGF0IG1ha2VzIG1lIGZlZWwgdGhhdCBJJ20gbm93IG9uIHRoZSBlZGdlIG9mIHdoYXQKICB0aGUgc3RhbmRhcmQgYWN0dWFsbHkgZGVmaW5lcy4gSSBuZWVkIHRvIGdldCB0aGlzIGNvZGUgZXhjZXJjaXNlZCBvbiBhIGxvdAogIG9mIGRpZmZlcmVudCBIVFRQIHByb3hpZXMgYmVmb3JlIEkgZmVlbCBzYWZlLgoKICBOb3cgSSdtIGZhY2luZyB0aGUgcHJvYmxlbSB3aXRoIG15IHRlc3Qgc3VpdGUgc2VydmVycyAoYm90aCBGVFAgYW5kIEhUVFApCiAgbm90IHN1cHBvcnRpbmcgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBhbmQgbGliY3VybCBpcyBkb2luZyB0aGVtIG5vdy4gSSBoYXZlCiAgdG8gZml4IHRoZSB0ZXN0IHNlcnZlcnMgdG8gZ2V0IGFsbCB0aGUgdGVzdCBjYXNlcyBkbyBPSy4KCkRhbmllbCAoOCBNYXJjaCAyMDAxKQotIEd1ZW5vbGUgQmVzY29uIHJlcG9ydGVkIHRoYXQgbGliY3VybCBkaWQgb3V0cHV0IGVycm9ycyB0byBzdGRlcnIgZXZlbiBpZgogIE1VVEUgYW5kIE5PUFJPR1JFU1Mgd2FzIHNldC4gSXQgdHVybmVkIG91dCB0byBiZSBhIGJ1ZyBhbmQgaGFwcGVucyBpZgogIHRoZXJlJ3MgYW4gZXJyb3IgYW5kIG5vIEVSUk9SQlVGRkVSIGlzIHNldC4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKVmVyc2lvbiA3LjctYmV0YTEKCkRhbmllbCAoOCBNYXJjaCAyMDAxKQotICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCIgaXMgbm8gbG9uZ2VyIGFueSB0cm91YmxlIGZvciBsaWJjdXJsLiBJJ3ZlCiAgYWRkZWQgdHdvIHNvdXJjZSBmaWxlcyBhbmQgSSd2ZSBydW4gc29tZSB0ZXN0IGRvd25sb2FkcyB0aGF0IGxvb2sgZmluZS4KCi0gSFRUUCBIRUFEIHdvcmtzIHRvbywgZXZlbiBvbiAxLjEgc2VydmVycy4KCkRhbmllbCAoNSBNYXJjaCAyMDAxKQotIFRoZSBjdXJyZW50IDU3IHRlc3QgY2FzZXMgbm93IHBhc3MgT0suIEl0IHdvdWxkIHN1Z2dlc3QgdGhhdCBsaWJjdXJsIHdvcmtzCiAgdXNpbmcgdGhlIG9sZC1zdHlsZSB3aXRoIG9uZSBjb25uZWN0aW9uIHBlciBoYW5kbGUuIFRoZSB0ZXN0IHN1aXRlIGRvZXNuJ3QKICBoYW5kbGUgbXVsdGlwbGUgY29ubmVjdGlvbnMgeWV0IHNvIHRoZXJlIGFyZSBubyB0ZXN0IGNhc2VzIGZvciB0aGlzLgoKLSBJIHBhdGNoZWQgdGhlIHRlbG5ldC5jIGhlYXZpbHkgdG8gbm90IHVzZSBhbnkgZ2xvYmFsIHZhcmlhYmxlcyBhbnltb3JlLiBJdAogIHNob3VsZCBtYWtlIGl0IGEgbG90IG5pY2VyIGxpYnJhcnktd2lzZS4KCi0gVGhlIGZpbGU6Ly8gc3VwcG9ydCB3YXMgbW9kaWZpZWQgc2xpZ2h0bHkgdG8gdXNlIHRoZSBpbnRlcm5hbCBjb25uZWN0LWZpcnN0LQogIHRoZW4tZG8gYXBwcm9hY2guCgpEYW5pZWwgKDQgTWFyY2ggMjAwMSkKLSBNb3JlIGJ1Z3MgZXJhc2VkLgoKVmVyc2lvbiA3LjctYWxwaGEyCgpEYW5pZWwgKDQgTWFyY2ggMjAwMSkKLSBOb3csIHRoZXJlJ3MgZXZlbiBhIGJhc2ljIGNoZWNrIHRoYXQgYSByZS11c2VkIGNvbm5lY3Rpb24gaXMgc3RpbGwgYWxpdmUKICBiZWZvcmUgaXQgaXMgYXNzdW1lZCBzby4gQSBmZXcgZmlyc3QgdGVzdHMgaGF2ZSBwcm92ZW4gdGhhdCBsaWJjdXJsIHdpbGwKICB0aGVuIHJlLWNvbm5lY3QgaW5zdGVhZCBvZiByZS11c2UgdGhlIGRlYWQgY29ubmVjdGlvbiEKCkRhbmllbCAoMiBNYXJjaCAyMDAxKQotIE5vdyB0aGV5IHdvcmsgaW50ZXJtaXhlZCBhcyB3ZWxsLiBNYWpvciBjb29sbmVzcyEKCi0gTW9yZSBmaWRkbGluZyBhcm91bmQsIG15ICd0aW55JyBjbGllbnQgSSBoYXZlIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG5vdyBoYXMKICBwcm92ZWQgdG8gZG93bmxvYWQgYm90aCBGVFAgYW5kIEhUVFAgd2l0aCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLiBUaGV5IGRvCiAgbm90IHdvcmsgaW50ZXJtaXhlZCB5ZXQgdGhvdWdoLgoKRGFuaWVsICgxIE1hcmNoIDIwMDEpCi0gV2lsZnJlZG8gU2FuY2hleiBwb2ludGVkIG91dCBhIG1pbm9yIHNwZWxsaW5nIG1pc3Rha2UgaW4gYSBtYW4gcGFnZSBhbmQgdGhhdAogIGN1cmxfc2xpc3RfYXBwZW5kKCkgc2hvdWxkIHRha2UgYSBjb25zdCBjaGFyICogYXMgc2Vjb25kIGFyZ3VtZW50LiBJdCBkb2VzCiAgbm93LgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDAxKQotIFRoZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHN0YXJ0IHRvIGxvb2sgZ29vZCBmb3IgSFRUUC4gT24gYSBzdWJzZXF1ZW50CiAgcmVxdWVzdCwgaXQgc2VlbXMgdGhhdCBsaWJjdXJsIG5vdyBjYW4gcGljayBhbiBhbHJlYWR5IGV4aXN0aW5nIGNvbm5lY3Rpb24KICBpZiBhIHN1aXRhYmxlIG9uZSBleGlzdHMsIG9yIGl0IG9wZW5zIGEgbmV3IG9uZS4KCi0gRG91Z2xhcyBSLiBIb3JuZXIgbWFpbGVkIG1lIGNvcnJlY3Rpb25zIHRvIHRoZSBjdXJsX2Zvcm1wYXJzZSgpIG1hbiBwYWdlCiAgdGhhdCBJIGFwcGxpZWQuCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDEpCi0gQWRkZWQgdGhlIGRvY3MvZXhhbXBsZXMvd2luMzJzb2NrZXRzLmMgZmlsZSBmb3Igb3VyIHdpbmRvd3MgZnJpZW5kcy4KCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBwcm92aWRlZCBicmFuZCBuZXcgVEVMTkVUIGZ1bmN0aW9uYWxpdHkgYW5kCiAgaW1wcm92ZW1lbnRzOgoKICAqIE5lZ290aWF0aW9uIGlzIG5vdyBwYXNzaXZlLiBDdXJsIGRvZXMgbm90IG5lZ290aWF0ZSB1bnRpbCB0aGUgcGVlciBkb2VzLgogICogUG9zc2liaWxpdHkgdG8gc2V0IG5lZ290aWF0aW9uIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZSwgY3VycmVudGx5IG9ubHkKICAgIFhESVNQTE9DLCBUVFlQRSBhbmQgTkVXX0VOVklST04gKGNhbGxlZCBORVdfRU5WKS4KICAqIE5vdyBzZW5kcyB0aGUgVVNFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiB0aGUgLXUgc3dpdGNoIGlzIHVzZWQuCiAgKiBVc2UgLXQgdG8gc2V0IHRlbG5ldCBvcHRpb25zIChMaW51cyBldmVuIHVwZGF0ZWQgdGhlIG1hbiBwYWdlLCBhd2Vzb21lISkKCi0gSGF2ZW4ndCBkb25lIHRoaXMgYmlnIGNoYW5nZXMgdG8gY3VybCBmb3IgYSB3aGlsZS4gTW92ZWQgYXJvdW5kIGEgbG90IG9mCiAgc3RydWN0IGZpZWxkcyBhbmQgc3R1ZmYgdG8gbWFrZSBtdWx0aXBsZSBjb25uZWN0aW9ucyBnZXQgY29ubmVjdGlvbiBzcGVjaWZpYwogIGRhdGEgaW4gc2VwYXJhdGUgc3RydWN0cyBzbyB0aGF0IHRoZXkgY2FuIGNvLWV4aXN0IGluIGEgbmljZSB3YXkuIFNlZSB0aGUKICBtYWlsaW5nIGxpc3RzIGZvciBkaXNjdXNzaW9ucyBhcm91bmQgaG93IHRoaXMgaXMgZ29ubmEgYmUgaW1wbGVtZW50ZWQuIERvY3MKICBhbmQgbW9yZSB3aWxsIGZvbGxvdy4KCiAgU3R1ZGllZCB0aGUgSFRUUCBSRkMgdG8gZmluZCBvdXQgYmV0dGVyIGhvdyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHNob3VsZAogIHdvcmsuIFNlZW1zIGNvb2wgZW5vdWdoLgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDAxKQotIEJvYiBTY2hhZGVyIGJyb3VnaHQgbWUgdHdvIGZpbGVzIHRoYXQgaGVscCBzZXQgdXAgYSBNUyBWQysrIGxpYmN1cmwgcHJvamVjdAogIGVhc2llci4gSGUgYWxzbyBwcm92aWRlZCBtZSB3aXRoIGFuIHVwLXRvLWRhdGUgbGliY3VybC5kZWYgZmlsZS4KCi0gSSBtb3ZlZCBhIGJ1bmNoIG9mIHByb3RvdHlwZXMgZnJvbSB0aGUgcHVibGljIDxjdXJsL2N1cmwuaD4gZmlsZSB0byB0aGUKICBsaWJyYXJ5IHByaXZhdGUgdXJsZGF0YS5oLiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHVwY29taW5nIGNoYW5nZXMuIFRoZQogIGxvdyBsZXZlbCBpbnRlcmZhY2UgaXMgbm8gbG9uZ2VyIGJlaW5nIHBsYW5uZWQgdG8gYmVjb21lIHJlYWxpdHkuCgpEYW5pZWwgKDE1IEZlYnJ1YXJ5IDIwMDEpCi0gQ1VSTE9QVF9QT1NUIGlzIG5vdCByZXF1aXJlZCBhbnltb3JlLiBKdXN0IHNldHRpbmcgdGhlIFBPU1Qgc3RyaW5nIHdpdGgKICBDVVJMT1BUX1BPU1RGSUVMRFMgd2lsbCBzd2l0Y2ggb24gdGhlIEhUVFAgUE9TVC4gTW9zdCBvdGhlciB0aGluZ3MgaW4KICBsaWJjdXJsIGFscmVhZHkgd29ya3MgdGhpcyB3YXksIGkuZSB0aGV5IHJlcXVpcmUgb25seSB0aGUgcGFyYW1ldGVyIHRvCiAgc3dpdGNoIG9uIGEgZmVhdHVyZSBzbyBJIHRoaW5rIHRoaXMgd29ya3Mgd2VsbCB3aXRoIHRoZSByZXN0LiBTZXR0aW5nIGEgTlVMTAogIHN0cmluZyBzd2l0Y2hlcyBvZmYgdGhlIFBPU1QgYWdhaW4uCgotIEV4Y2VsbGVudCBzdWdnZXN0aW9ucyBmcm9tIFJpY2ggR3JheSwgUmljayBKb25lcywgSm9oYW4gTmlsc3NvbiBhbmQgQmpvcm4KICBSZWVzZSBoZWxwZWQgbWUgZGVmaW5lIGEgd2F5IGhvdyB0byBpbmNvcnBvcmF0ZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGludG8KICBsaWJjdXJsIGluIGEgdmVyeSBzbW9vdGggd2F5LiBJZiBkb25lIHJpZ2h0LCBubyBjaGFuZ2UgbWF5IGhhdmUgdG8gYmUgbWFkZQogIHRvIG9sZGVyIHByb2dyYW1zIGFuZCB0aGV5IHdpbGwganVzdCBzdGFydCB1c2luZyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHdoZW4KICBhcHBsaWNhYmxlIQoKRGFuaWVsICgxMyBGZWJydWFyeSAyMDAxKQotIENoYW5nZWQgdGhlIHdvcmQgJ3RpbWVvdXRlZCcgdG8gJ3RpbWVkIG91dCcgaW4gdHdvIGRpZmZlcmVudCBlcnJvciBtZXNzYWdlcy4KICBTdWdnZXN0ZWQgYnkgTGFycnkgRmFobm9lLgoKVmVyc2lvbiA3LjYuMQoKRGFuaWVsICg5IEZlYnJ1YXJ5IDIwMDEpCi0gRnJhbmsgUmVpZCBhbmQgQ2FpbiBIb3B3b29kIHByb3ZpZGVkIGluZm9ybWF0aW9uIGFuZCByZXNlYXJjaCBhcm91bmQgYSBIVFRQUwogIFBVVC91cGxvYWQgcHJvYmxlbSB3ZSBzZWVtIHRvIGhhdmUuIE5vIHNvbHV0aW9uIGZvdW5kIHlldC4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDAxKQotIEFuIGludGVyZXN0aW5nIGRpc2N1c3Npb24gaXMgaG93IHRvIHNwZWNpZnkgYW4gZW1wdHkgcGFzc3dvcmQgd2l0aG91dCBoYXZpbmcKICBjdXJsIGFzayBmb3IgaXQgaW50ZXJhY3RpdmVseT8gVGhlIGN1cnJlbnQgaW1wbG1lbnRhdGlvbiB0YWtlcyBhbiBlbXB0eQogIHBhc3N3b3JkIGFzIGEgcmVxdWVzdCBmb3IgYSBwYXNzd29yZCBwcm9tcHQuIEhvd2V2ZXIsIEkgc3RpbGwgd2FudCB0bwogIHN1cHBvcnQgYSBibGFuayB1c2VyIGZpZWxkLiBUaHVzLCB0b2RheSBpZiB5b3UgZW50ZXIgIi11IDoiICh3aXRob3V0IHVzZXIKICBhbmQgcGFzc3dvcmQpIGN1cmwgd2lsbCBwcm9tcHQgZm9yIHRoZSBwYXNzd29yZC4gVHJpY2t5LiBIb3cgd291bGQgeW91CiAgc3BlY2lmeSB5b3Ugd2FudCB0aGUgcHJvbXB0IG90aGVyd2lzZT8KCi0gTWFkZSB0aGUgbmV0cmMgcGFyc2UgcmVzdWx0IHBvc3NpYmxlIHRvIHVzZSBmb3Igb3RoZXIgcHJvdG9jb2xzIHRoYW4gRlRQIGFuZAogIEhUVFAgKHN1Y2ggYXMgdGhlIHVwY29taW5nIFRFTE5FVCBmaXhlcykuCgotIFRoZSBwcmV2aW91c2x5IG1lbnRpb25lZCAiTVNWQysrIHByb2JsZW1zIiB0dXJuZWQgb3V0IHRvIGJlIGEgbm9uLWlzc3VlLgoKLSBBZGRlZCBhIEhUVFAgZmlsZSB1cGxvYWQgY29kZSBleGFtcGxlIGluIHRoZSBkb2NzL2V4YW1wbGVzLyBzZWN0aW9uIG9uCiAgcmVxdWVzdC4KCi0gQWRqdXN0ZWQgdGhlIEZUUCByZXNwb25zZSBmaXggc2xpZ2h0bHkuCgpWZXJzaW9uIDcuNi4xLXByZTMKCkRhbmllbCAoNyBGZWJydWFyeSAyMDAxKQotIFMuIE1vb25lc2FteSBmb3VuZCBhIGZsYXcgaW4gdGhlIHJlc3BvbnNlIHJlYWRpbmcgZnVuY3Rpb24gZm9yIEZUUCB0aGF0CiAgY291bGQgbWFrZSBsaWJjdXJsIG5vdCBnZXQgb3V0IG9mIHRoZSBsb29wIHByb3Blcmx5IHdoZW4gaXQgc2hvdWxkLCBpZgogIGxpYmN1cmwgZ290IC0xIHJldHVybmVkIHdoZW4gcmVhZGluZyB0aGUgc29ja2V0LgoKLSBJIGZvdW5kIGEgc2ltaWxhciBtaXN0YWtlIGluIGh0dHAuYyB3aGVuIHVzaW5nIGEgcHJveHkgYW5kIHJlYWRpbmcgdGhlCiAgcmVzdWx0cyBmcm9tIHRoZSBwcm94eSBjb25uZWN0aW9uLgoKRGFuaWVsICg2IEZlYnJ1YXJ5IDIwMDEpCi0gUy4gTW9vbmVzYW15IHBvaW50ZWQgb3V0IHRoYXQgdGhlIFZDIG1ha2VmaWxlIGluIHNyYy8gbmVlZGVkIHRoZSBsaWJwYXRoIHNldAogIGZvciB0aGUgZGVidWcgYnVpbGQgdG8gd29yay4KCi0gRGFuaWVsIEdlaHJpZ2VyIHN0ZXBwZWQgaW4gdG8gYXNzaXN0IHdpdGggdGhlIFZDKysgc3R1ZmYgUm9iZXJ0IFdlYXZlcgogIGJyb3VnaHQgdXAgeWVzdGVyZGF5LgoKRGFuaWVsICg1IEZlYnJ1YXJ5IDIwMDEpCi0gSnVuLWljaGlybyBpdG9qdW4gSGFnaW5vIGJyb3VnaHQgYSBiaWcgcGF0Y2ggdGhhdCBicmluZ3MgSVB2Ni1hd2FyZW5lc3MgdG8KICBhIGJ1bmNoIG9mIGRpZmZlcmVudCBhcmVhcyB3aXRoaW4gbGliY3VybC4KCi0gUm9iZXJ0IFdlYXZlciB0b2xkIG1lIGFib3V0IHRoZSBwcm9ibGVtcyB0aGUgTVMgVkMrKyA2LjAgY29tcGlsZXIgaGFzIHdpdGgKICB0aGUgJ3N0YXRpYycga2V5d29yZCBvbiBhIG51bWJlciBvZiBsaWJjdXJsIGZ1bmN0aW9ucy4gSSBtaWdodCBuZWVkIHRvIGFkZCBhCiAgcGF0Y2ggdGhhdCByZWRlZmluZXMgc3RhdGljIHdoZW4gbGliY3VybCBpcyBjb21waWxlZCB3aXRoIHRoYXQgY29tcGlsZXIuCiAgSG93IGRvIEkga25vdyB3aGVuIFZDKysgY29tcGlsZXMsIGFueW9uZT8KCkRhbmllbCAoNCBGZWJydWFyeSAyMDAxKQotIGN1cmxfZ2V0aW5mbygpIHdhcyBleHRlbmRlZCB3aXRoIHR3byBuZXcgb3B0aW9uczoKICBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBhbmQgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfVVBMT0FELiBUaGV5CiAgcmV0dXJuIHRoZSBmdWxsIGFzc3VtZWQgY29udGVudCBsZW5ndGggb2YgdGhlIHRyYW5zZmVyIGluIHRoZSBnaXZlbgogIGRpcmVjdGlvbi4gVGhlIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIHdpbGwgYmUgdGhlIENvbnRlbnQtTGVuZ3RoOgogIHNpemUgb2YgYSBIVFRQIGRvd25sb2FkLiBBZGRlZCBkZXNjcmlwdGlvbnMgdG8gdGhlIG1hbiBwYWdlIGFzIHdlbGwuIFRoaXMKICB3YXMgZG9uZSBhZnRlciBkaXNjdXNzaW9ucyB3aXRoIEJvYiBTY2hhZGVyLgoKRGFuaWVsICgzIEZlYnJ1YXJ5IDIwMDEpCi0gSW5nbyBSYWxmIEJsdW0gcHJvdmlkZWQgYW5vdGhlciBmaXggdGhhdCBtYWtlcyBjdXJsIGJ1aWxkIHVuZGVyIHRoZSBtb3JlCiAgcmVjZW50IGN5Z3dpbiBpbnN0YWxsYXRpb25zLiBJdCBzZWVtcyB0aGV5J3ZlIGNoYW5nZWQgdGhlIHByZXNldCBkZWZpbmVzIHRvCiAgbm90IGluY2x1ZGUgV0lOMzIgYW55bW9yZS4KClZlcnNpb24gNy42LjEtcHJlMgoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDEpCi0gQ3VybF9yZWFkKCkgYW5kIGN1cmxfcmVhZCgpIG5vdyByZXR1cm4gYSBzc2l6ZV90IGZvciB0aGUgc2l6ZSwgYXMgaXQgaGFkIHRvCiAgYmUgYWJsZSB0byByZXR1cm4gLTEuIFRoZSB0ZWxuZXQgc3VwcG9ydCBjcmFzaGVkIGR1ZSB0byB0aGlzIGFuZCB0aGVyZSB3YXMgYQogIHBvc3NpYmlsaXR5IHRvIHdlaXJkIGJlaGF2aW9yIGFsbCBvdmVyLiBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIGhlbHBlZCBtZQogIGZpbmQgdGhpcy4KCi0gQWRkZWQgYSBjb25maWd1cmUuaW4gY2hlY2sgZm9yIGEgd29ya2luZyBnZXRhZGRyaW5mbygpIGlmIElQdjYgaXMgcmVxdWVzdGVkLgogIEkgYWxzbyBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZlYXR1cmUgLS1lbmFibGUtZGVidWcgd2hpY2ggc2V0cyBhIGNvdXBsZQogIG9mIGNvbXBpbGVyIG9wdGlvbnMgd2hlbiB1c2VkLiBJdCBhc3N1bWVzIGdjYy4KCkRhbmllbCAoMzAgSmFudWFyeSAyMDAxKQotIEkgZmluYWxseSB0b29rIGEgc3RhYiBhdCB0aGUgbG9uZy10ZXJtIEZJWE1FIGl0ZW0gSSd2ZSBoYWQgb24gbXlzZWxmLCBhbmQKICBub3cgbGliY3VybCB3aWxsIHByb3Blcmx5IHdvcmsgd2hlbiBkb2luZyBhIEhUVFAgcmFuZ2UtcmVxdWVzdCB0aGF0IGZvbGxvd3MKICBhIExvY2F0aW9uOi4gUHJldmlvdXNseSB0aGF0IHdvdWxkIG1ha2UgbGliY3VybCBmYWlsIHNheWluZyB0aGF0IHRoZSBzZXJ2ZXIKICBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCByYW5nZSByZXF1ZXN0cy4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDAxKQotIEkgYWRkZWQgYSB0ZXN0IGNhc2UgZm9yIHRoZSBIVFRQIFBVVCByZXN1bWUgdGhpbmcgKHRlc3QgY2FzZSAzMykuCgpWZXJzaW9uIDcuNi4xLXByZTEKCkRhbmllbCAoMjkgSmFudWFyeSAyMDAxKQotIFlldCBhbm90aGVyIENvbnRlbnQtUmFuZ2UgY2hhbmdlLiBPayBub3c/IEJvYiBTY2hhZGVyIGNoZWNrcyBmcm9tIGhpcyBlbmQgCiAgYW5kIGl0IHdvcmtzIGZvciBoaW0uCgpEYW5pZWwgKDI3IEphbnVhcnkgMjAwMSkKLSBTbyB0aGUgSFRUUCBQVVQgcmVzdW1lIGZpeCB3YXNuJ3QgZ29vZC4gVGhlcmUgc2hvdWxkIGFwcGVhcmFudGx5IGJlIGEKICBDb250ZW50LVJhbmdlIGhlYWRlciB3aGVuIHJlc3VtaW5nIGEgUFVULgoKLSBJIG5vdGljZWQgSSBicm9rZSB0aGUgZG93bmxvYWQtY2hlY2sgdGhhdCB2ZXJpZmllcyB0aGF0IGEgcmVzdW1lZCBIVFRQCiAgZG93bmxvYWQgaXMgYWN0dWFsbHkgcmVzdW1lZC4gSXQgZ290IGJyb2tlIGJlY2F1c2UgbXkgbmV3ICdodHRwcmVxJyBmaWVsZAogIGluIHRoZSBtYWluIGN1cmwgc3RydWN0LiBJIHNob3VsZCBnZXQgc2xhcHBlZC4gSSBhZGRlZCBhIHRlc3QgY2FzZSBmb3IKICB0aGlzIG5vdywgc28gSSB3b24ndCBiZSBhYmxlIHRvIHJ1aW4gdGhpcyBhZ2FpbiB3aXRob3V0IG5vdGljaW5nLgoKLSBBZGRlZCBhIHRlc3QgY2FzZSBmb3IgY29udGVudC1sZW5ndGggdmVyaWZ5aW5nIHdoZW4gZG93bmxvYWRpbmcgSFRUUC4KCi0gTWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgdGl0bGUgc2F5IGlmIHRoZSB0cmFuc2ZlciBpcyBiZWluZyB0cmFuc2ZlcmVkLiBJdAogIG1ha2VzIHRoZSBvdXRwdXQgc2xpZ2h0bHkgYmV0dGVyIGZvciByZXN1bWVzLgoKLSBXaGVuIGRlYWxpbmcgd2l0aCBMb2NhdGlvbjogYW5kIEhUVFAgcmV0dXJuIGNvZGVzLCBsaWJjdXJsIHdpbGwgbm90IGF0dGVtcHQKICB0byBmb2xsb3cgdGhlIHNwaXJpdCBvZiBSRkMyNjE2IGJldHRlci4gSXQgbWVhbnMgdGhhdCB3aGVuIFBPU1RpbmcgdG8gYQogIFVSTCB0aGF0IGlzIGJlaW5nIGZvbGxvd2luZyB0byBhIHNlY29uZCBwbGFjZSwgdGhlIHN0YW5kYXJkIHdpbGwganVkZ2Ugb24KICB3aGF0IHRvIGRvLiBBbGwgSFRUUCBjb2RlcyBleGNlcHQgMzAzIGFuZCAzMDUgd2lsbCBjYXVzZSBjdXJsIHRvIG1ha2UgYQogIHNlY29uZCBQT1NUIG9wZXJhdGlvbi4gMzAzIHdpbGwgbWFrZSBhIEdFVCBhbmQgMzA1IGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgoKICBJIGFsc28gd3JvdGUgdHdvIHRlc3QgY2FzZXMgZm9yIHRoaXMgUE9TVC9HRVQvTG9jYXRpb24gc3R1ZmYuCgpWZXJzaW9uIDcuNgoKRGFuaWVsICgyNiBKYW51YXJ5IDIwMDEpCi0gTG90cyBvZiBtYWlscyBiYWNrIGFuZCBmb3J0aCB3aXRoIEJvYiBTY2hhZGVyIGZpbmFsbHkgbWFkZSBtZSBhZGQgYSBzbWFsbAogIHBpZWNlIG9mIGNvZGUgaW4gdGhlIEhUVFAgZW5naW5lIHNvIHRoYXQgSFRUUCB1cGxvYWQgcmVzdW1lIHdvcmtzLiBZb3UgY2FuCiAgbm93IGRvIGFuIG9wZXJhdGlvbiBsaWtlICdjdXJsIC1UIGZpbGUgLUMgPG9mZnNldD4gPFVSTD4nIGFuZCBjdXJsIHdpbGwgUFVUCiAgdGhlIGVuZGluZyBwYXJ0IG9mIHRoZSBmaWxlIHN0YXJ0aW5nIGF0IGdpdmVuIG9mZmV0IHRvIHRoZSBzcGVjaWZpZWQgVVJMLgoKVmVyc2lvbiA3LjYtcHJlNAoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDEpCi0gSSB0b29rIGhvbGQgb2YgUmljayBKb25lcycgcXVlc3Rpb24gd2h5IHdlIGRvbid0IHVzZSByZWN2KCkgYW5kIHNlbmQoKSBmb3IKICByZWFkaW5nL3dyaXRpbmcgdG8gdGhlIHNvY2tldHMgYW5kIEkndmUgbm93IG1vZGlmaWVkIHRoZSBzcmVhZCgpIGFuZAogIHN3cml0ZSgpIG1hY3JvcyB0byB1c2UgdGhlbSBpbnN0ZWFkLiBJZiBub3RoaW5nIGVsc2UsIHRoZXkgY291bGQgYmUgdGVzdGVkCiAgaW4gdGhlIG5leHQgYmV0YS1yb3VuZCBjb21pbmcgcmlnaHQgdXAuCgotIEplZmYgTW9ycm93IGZvdW5kIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwncyB1c2FnZSBvZiBTU0xfcmVhZCgpIGFuZCBzdXBwbGllZAogIGhpcyByZXNlYXJjaCByZXN1bHRzIGluIGhvdyB0byBmaXggdGhpcy4gSXQgdHVybnMgb3V0IHdlIGhhdmUgdG8gaW52b2tlIHRoZQogIGZ1bmN0aW9uIHNldmVyYWwgdGltZXMgaW4gc29tZSBjYXNlcy4gVGhlIHNhbWUgZ29lcyBmb3IgdGhlIFNTTF93cml0ZSgpLgoKICBJIG1hZGUgc29tZSByYXRoZXIgZHJhc3RpYyBjaGFuZ2VzIGFsbCBvdmVyIGxpYmN1cmwgdG8gbWFrZSBhbGwgd3JpdGVzIGFuZAogIHJlYWRzIGdldCBkb25lIG9uIG9uZSBzaW5nbGUgcGxhY2Ugc28gdGhhdCB0aGlzIHJlcGVhdGVkLWF0dGVtcHRzIHRoaW5nCiAgd291bGQgb25seSBoYXZlIHRvIGJlIGltcGxlbWVudGVkIGF0IG9uZSBwb2ludC4KCi0gUmljayBKb25lcyBzcG90dGVkIHRoYXQgdGhlICd0b3RhbCB0aW1lJyBjb3VudGVyIHJlYWxseSBkaWRuJ3QgbWVhc3VyZSB0aGUKICB0b3RhbCB0aW1lIHZlcnkgYWNjdXJhdGUgb24gc3Vic2Vjb25kIGxldmVscy4KCi0gSm9oYW4gTmlsc3NvbiBwb2ludGVkIG91dCB0aGUgbmVlZCB0byBtb3JlIGNsZWFybHkgc3BlY2lmeSB0aGF0IHRoZSB0aW1lb3V0CiAgdmFsdWUgeW91IHNldCBmb3IgYSBkb3dubG9hZCBpcyBmb3IgdGhlICplbnRpcmUqIGRvd25sb2FkLiBUaGVyZSdzIGN1cnJlbnRseQogIG5vIG9wdGlvbiBhdmFpbGFibGUgdGhhdCBzZXRzIGEgdGltZW91dCBmb3IgdGhlIGNvbm5lY3Rpb24gcGhhc2Ugb25seS4KCkRhbmllbCAoMjQgSmFudWFyeSAyMDAxKQotIEluZ28gUmFsZiBCbHVtIHN1Ym1pdHRlZCBhIHNlcmllcyBvZiBwYXRjaGVzIHJlcXVpcmVkIHRvIGdldCBjdXJsIHRvIGNvbXBpbGUKICBwcm9wZXJseSB3aXRoIGN5Z3dpbi4KCi0gUm9iZXJ0IFdlYXZlciBwb3N0ZWQgYSBmaXggZm9yIHRoZSB3aW4zMiBzZWN0aW9uIG9mIHRoZSBjdXJsX2dldGVudigpIGNvZGUKICB0aGF0IGNvcnJlY3RlZCBhIHBvdGVudGlhbCBtZW1vcnkgbGVhay4KCi0gQWRkZWQgY29tbWVudHMgaW4gYSBmZXcgZmlsZXMgaW4gYSBzdWRkZW4gYXR0ZW1wdCB0byBtYWtlIHRoZSBzb3VyY2VzIG1vcmUKICBlYXN5IHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQhCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwMSkKLSBBZGRlZCBzaW1wbGUgSVB2NiBkZXRlY3Rpb24gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIG1hZGUgdGhlIHZlcnNpb24KICBzdHJpbmcgYWRkICdpcHY2JyB0byB0aGUgZW5hYmxlIHNlY3Rpb24gaW4gdGhhdCBjYXNlLiBFTkFCTEVfSVBWNiB3aWxsIGJlCiAgc2V0IGlmIGN1cmwgaXMgY29tcGlsZWQgd2l0aCBJUHY2IHN1cHBvcnQgZW5hYmxlZC4KCi0gQWRkZWQgYSBwYXJzZXIgZm9yIElQdjYtc3R5bGUgc3BlY2lmaWVkIElQLWFkZHJlc3NlcyBpbiBhIFVSTC4gVGh1cywgd2hlbgogIElQdjYgZ2V0cyBlbmFibGVkIHNvb24sIHdlIGNhbiB1c2UgVVJMcyBsaWtlICdbMDo6MV06ODAnLi4uCgotIE1hZGUgdGhlIFVSTCBnbG9iYmluZyBpbiB0aGUgY2xpZW50IHBvc3NpYmxlIHRvIGZhaWwgc2lsZW50bHkgaWYgdGhlcmUncyBhbgogIGVycm9yIGluIHRoZSBnbG9iYmluZy4gSXQgbWFrZXMgaXQgYWxtb3N0IGludHVpdGl2ZSwgc28gd2hlbiB5b3UgZG9uJ3QKICBmb2xsb3cgdGhlIHN5bnRheCBydWxlcywgZ2xvYmJpbmcgaXMgc2ltcGx5IHN3aXRjaGVkIG9mZiBhbmQgdGhlIHJhdyBzdHJpbmcKICBpcyB1c2VkIGluc3RlYWQuCgogIEkgc3RpbGwgdGhpbmsgd2UnbGwgZ2V0IHByb2JsZW1zIHdpdGggSVB2Ni1zdHlsZSBJUC1hZGRyZXNzZXMgd2hlbiB3ZSAqd2FudCoKICBnbG9iYmluZyBvbiBwYXJ0cyBvZiB0aGUgVVJMIGFzIHRoZSBpbml0aWFsIHBhcnQgb2YgdGhlIFVSTCB3aWxsIGZvciBzdXJlCiAgc2VyaW91c2x5IGNvbmZ1c2UgdGhlIGdsb2JiZXIuCgpEYW5pZWwgKDIyIEphbnVhcnkgMjAwMSkKLSBCavZybiBTdGVuYmVyZyBzdXBwbGllZCBhIHByb2dyZXNzIG1ldGVyIHBhdGNoIHRoYXQgbWFrZXMgaXQgbG9vayBiZXR0ZXIgZXZlbgogIGR1cmluZyBzbG93IHN0YXJ0cy4gUHJldmlvdXNseSBpdCBtYWRlIHNvbWUgc2lsbHkgYXNzdW1wdGlvbnMuLi4KCi0gQWRkZWQgdHdvIEZUUCB0ZXN0cyBmb3IgLVEgYW5kIC1RIC0gc3R1ZmYgc2luY2UgaXQgd2FzIGJlaW5nIGRpc2N1c3NlZCBvbgogIHRoZSBtYWlsaW5nIGxpc3QuIEhhZCB0byBjb3JyZWN0IHRoZSBmdHBzZXJ2ZXIucGwgdG9vIGFzIGl0IGJ1Z2dlZCBzbGlnaHRseS4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDAxKQotIE1hZGUgdGhlIExvY2F0aW9uOiBwYXJzZXJzIGRlYWwgd2l0aCBhbnktbGVuZ3RoIFVSTHMuIFRodXMgSSByZW1vdmVkIHRoZSBsYXN0CiAgY29kZSB0aGF0IHJlc3RyaWN0cyB0aGUgbGVuZ3RoIG9mIFVSTHMgdGhhdCBjdXJsIHN1cHBvcnRzLgoKLSBBZGRlZCBhIC0tZ2xvYm9mZiB0ZXN0IGNhc2UgKCMyOCkgYW5kIGl0IHF1aWNrbHkgaWRlbnRpZmllZCBhIG1lbW9yeSBwcm9ibGVtCiAgaW4gc3JjL21haW4uYyB0aGF0IEkgdG9vayBjYXJlIG9mLgoKVmVyc2lvbiA3LjYtcHJlMwoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDEpCi0gTWFkZSB0aGUgdHdvIGZvcm1lciBmaWxlcyBsaWIvZG93bmxvYWQuYyBhbmQgbGliL2hpZ2hsZXZlbC5jIGJlY29tZSB0aGUgbmV3CiAgbGliL3RyYW5zZmVyLmMgd2hpY2ggbWFrZXMgbW9yZSBzZW5zZS4gSSBhbHNvIGRpZCB0aGUgcmVuYW1lIGZyb20gVHJhbnNmZXIoKQogIHRvIEN1cmxfVHJhbnNmZXIoKSBpbiB0aGUgb3RoZXIgc291cmNlIGZpbGVzIHRoYXQgdXNlIHRoZSB0cmFuc2ZlciBmdW5jdGlvbgogIGluIHRoZSBzcGlyaXQgb2YgdXNpbmcgQ3VybF8gcHJlZml4IGZvciBsaWJyYXJ5LXNjb3BlZCBnbG9iYWwgc3ltYm9scy4KCkRhbmllbCAoMTEgSmFudWFyeSAyMDAxKQotIEFkZGVkIC1nLy0tZ2xvYm9mZiB0aGF0IHN3aXRjaGVzIE9GRiB0aGUgVVJMIGdsb2JiaW5nIGFuZCB0aHVzIGVuYWJsZXMge31bXQogIGxldHRlcnMgdG8gYmUgcGFydCBvZiB0aGUgVVJMLiBEbyBub3RlIHRoYXQgUkZDMjM5NiBzZWN0aW9uIDIuNC4zIGV4cGxpY2l0bHkKICBtZW50aW9uIHRoZXNlIGxldHRlcnMgdG8gYmUgZXNjYXBlZC4gVGhpcyB3YXMgcG9zdGVkIGFzIGEgZmVhdHVyZSByZXF1ZXN0IGJ5CiAgSm9yZ2UgR3V0aWVycmV6IGFuZCBhcyBhIGJ1ZyBieSBUZXJyeS4KCi0gU2hvcnQgb3B0aW9ucyB0byBjdXJsIHRoYXQgcmVxdWlyZXMgcGFyYW1ldGVycyBjYW4gbm93IGJlIHNwZWNpZmllZCB3aXRob3V0CiAgaGF2aW5nIHRoZSBvcHRpb24gYW5kIGl0cyBwYXJhbWV0ZXIgc3BhY2Ugc2VwYXJhdGVkLiAtb2ZpbGUgd29ya3MgYXMgZ29vZCBhcwogIC1vIGZpbGUuIC1tMjAgaXMgZXF1YWwgdG8gLW0gMjAuIERvIG5vdGUgdGhhdCB0aGlzIGdvZXMgZm9yIHNpbmdsZS1sZXR0ZXIKICBvcHRpb25zIG9ubHksIHZlcmJvc2UgLS1sb25nLXN0eWxlIG9wdGlvbnMgc3RpbGwgbXVzdCBiZSBzZXBhcmF0ZWQgd2l0aAogIHNwYWNlIGZyb20gdGhlaXIgcGFyYW1ldGVycy4KCkRhbmllbCAoOCBKYW51YXJ5IDIwMDEpCi0gRnJhbmNpcyBEYWdlbmFpcyByZXBvcnRlZCB0aGF0IHRoZSBTQ08gY29tcGlsZXIgc3RpbGwgZmFpbHMgd2hlbiBjb21waWxpbmcKICBjdXJsIGR1ZSB0byB0aGF0IGdldHBhc3NfcigpIHByb3RvdHlwZS4gSSd2ZSBub3cgcHV0IGl0IGFyb3VuZCAjaWZuZGVmCiAgSEFWRV9HRVRQQVNTX1IgaW4gYW4gYXR0ZW1wdCB0byBwbGVhc2UgdGhlIFNDTyBzeXN0ZW1zLgoKLSBNYWRlIHNvbWUgbWlub3IgY29ycmVjdGlvbnMgdG8gZ2V0IHRoZSBjbGllbnQgdG8gY2xlYW51cCBwcm9wZXJseSBhbmQgSSBtYWRlCiAgdGhlIHNlcGFyYXRvciB3b3JrIGFnYWluIHdoZW4gZ2V0dGluZyBtdWx0aXBsZSBnbG9iYmVkIFVSTHMgdG8gc3Rkb3V0LgoKLSBXb3JrZWQgd2l0aCBMb2ljIERhY2hhcnkgdG8gZ2V0IHRoZSBtYWtlIGRpc3QgYW5kIG1ha2UgZGlzdGNoZWNrIHdvcmsKICBjb3JyZWN0bHkuIFRoZSAnbWFrZXRneicgc2NyaXB0IGlzIG5vdyB1c2luZyB0aGUgYXV0b21ha2UgZ2VuZXJhdGVkICdtYWtlCiAgZGlzdCcgd2hlbiBjcmVhdGluZyByZWxlYXNlIGFyY2hpdmVzLiBMb2ljIHN1Y2Nlc3NmdWxseSBtYWRlICdtYWtlIHJwbXMnCiAgYXV0b21hdGljYWxseSBidWlsZCBSUE1zIQoKTG9pYyBEYWNoYXJ5ICg2IEphbnVhcnkgMjAwMSkKLSBBdXRvbWF0ZWQgZ2VuZXJhdGlvbiBvZiBycG0gcGFja2FnZXMsIG5vIG5lZWQgdG8gYmUgcm9vdC4KCi0gbWFrZSBkaXN0Y2hlY2sgZ2VuZXJhdGVzIGEgcHJvcGVyIGRpc3RyaWJ1dGlvbiAoRVhUUkFfRElTVAogIGluIGFsbCBNYWtlZmlsZS5hbSBtb2RpZmllZCB0byBtYXRjaCBGSUxFUykuCgpEYW5pZWwgKDUgSmFudWFyeSAyMDAxKQotIEh1Z2UgY2xpZW50LXNpZGUgaGFjazogbm93IG11bHRpcGxlIFVSTHMgYXJlIHN1cHBvcnRlZC4gQW55IG51bWJlciBvZiBVUkxzCiAgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhleSdsbCBhbGwgYmUgZG93bmxvYWRlZC4gVGhlcmUKICBtdXN0IGJlIGEgY29ycmVzcG9uZGluZyAtbyBvciAtTyBmb3IgZWFjaCBVUkwgb3IgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvCiAgc3Rkb3V0LiBUaGlzIG5lZWRzIG1vcmUgdGVzdGluZywgdGltZSB0byByZWxlYXNlIGEgNy42LXByZSBwYWNrYWdlLgoKLSBUaGUga3JiNCBzdXBwb3J0IHdhcyBicm9rZW4gaW4gdGhlIHJlbGVhc2UuIEZpeGVkIG5vdy4KCi0gSHVnZSBpbnRlcm5hbCBzeW1ib2wgcmVuYW1lIG9wZXJhdGlvbi4gQWxsIG5vbi1zdGF0aWMgYnV0IHN0aWxsIGxpYi1pbnRlcm5hbAogIHN5bWJvbHMgc2hvdWxkIG5vdyBiZSBwcmVmaXhlZCB3aXRoICdDdXJsXycgdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGggb3RoZXIKICBsaWJzLiBBbGwgcHVibGljIHN5bWJvbHMgc2hvdWxkIGJlIHByZWZpeGVkIHdpdGggJ2N1cmxfJyBhbmQgdGhlIHJlc3Qgc2hvdWxkCiAgYmUgc3RhdGljIGFuZCB0aHVzIGludmlzaWJsZSB0byB0aGUgb3V0c2lkZSB3b3JsZC4gSSB1cGRhdGVkIHRoZSBJTlRFUk5BTFMKICBkb2N1bWVudCB0byBzYXkgdGhpcyBhcyB3ZWxsLgoKVmVyc2lvbiA3LjUuMgoKRGFuaWVsICg0IEphbnVhcnkgMjAwMSkKLSBBcyBLZXZpbiBQIFJvdGggc3VnZ2VzdGVkLCBJJ3ZlIGFkZGVkIHRleHQgdG8gdGhlIG1hbiBwYWdlIGZvciBldmVyeSBjb21tYW5kCiAgbGluZSBvcHRpb24gYW5kIHdoYXQgaGFwcGVucyB3aGVuIHlvdSBzcGVjaWZ5IHRoYXQgb3B0aW9uIG1vcmUgdGhhbgogIG9uY2UuIFRoYXQgaGFzbid0IGJlZW4gZXhhY3RseSBjcnlzdGFsIGNsZWFyIGJlZm9yZS4KCi0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBwb3NzaWJsZSB0byBydW4gZnJvbSBvdXRzaWRlIHRoZSBzb3VyY2UtdHJlZS4gRm9yCiAgb2RkIHJlYXNvbnMgSSBjYW4ndCBidWlsZCBjdXJsIHByb3Blcmx5IG91dHNpZGUgdGhvdWdoLiBJdCBoYXMgdG8gZG8gd2l0aAogIGN1cmwncyBkZXBlbmRlbmNpZXMgb24gbGliY3VybC4uLgoKLSBDdXQgb2ZmIGFsbCBvbGRlciAoZGF0ZWQgMTk5OSBhbmQgZWFybGllcikgQ0hBTkdFUyBlbnRyaWVzIGZyb20gdGhpcyBmaWxlLgogIFRoZSBvbGRlciBwaWVjZSBpcyBuYW1lZCBDSEFOR0VTLjAgYW5kIGlzIGFkZGVkIHRvIHRoZSBDVlMgcmVwb3NpdG9yeSBpbgogIGNhc2UgYW55b25lIHdvdWxkIG5lZWQgaXQuCgotIEkgYWRkZWQgYW5vdGhlciBmaWxlICdDVlMtSU5GTycgdG8gdGhlIENWUy4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKICBmaWxlcyBpbiB0aGUgQ1ZTIHRoYXQgYXJlbid0IGluY2x1ZGVkIGluIHJlbGVhc2UgYXJjaGl2ZXMgYW5kIGhvdyB0byBidWlsZAogIGN1cmwgd2hlbiB5b3UgZ2V0IHRoZSBzb3VyY2VzIG9mZiBDVlMuCgotIFVwZGF0ZWQgQ09OVFJJQlVURSBhbmQgRkFRIGR1ZSB0byB0aGUgbmV3IGxpY2Vuc2UuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDAxKQotIFJlbmFtZWQgUkVBRE1FLmxpYmN1cmwgdG8gTElCQ1VSTAoKLSBDaGFuZ2VkIGhlYWRlcnMgaW4gYWxsIHNvdXJjZXMgZmlsZXMgdG8gdGhlIG5ldyBkdWFsIGxpY2Vuc2UgY29uY2VwdCBvZgogIGN1cmw6IHVzZSB0aGUgTUlUL1ggZGVyaXZhdGUgbGljZW5zZSAqb3IqIE1QTC4gVGhlIExFR0FMIGZpbGUgd2FzIHVwZGF0ZWQKICBhY2NvcmRpbmdseSBhbmQgdGhlIE1QTCAxLjEgYW5kIE1JVC9YIGRlcml2YXRlIGxpY2Vuc2VzIGFyZSBub3cgcGFydCBvZiB0aGUKICByZWxlYXNlIGFyY2hpdmUuCkRhbmllbCAoMzAgRGVjZW1iZXIgMjAwMCkKLSBNYWRlIGFsbCBGVFAgY29tbWFuZHMgZ2V0IHNlbnQgd2l0aCB0aGUgdHJhaWxpbmcgQ1JMRiBpbiBvbmUgc2luZ2xlIHdyaXRlKCkKICBhcyBzcGxpdHRpbmcgdGhlbSB1cCBzZWVtcyB0byBjb25mdXNlIGF0IGxlYXN0IHNvbWUgZmlyZXdhbGxzIChGVy0xIGJlaW5nCiAgb25lIG1ham9yKS4KCkRhbmllbCAoMTkgRGVjZW1iZXIgMjAwMCkKLSBBZGRlZCBmaWxlIGRlc3JjaXB0b3IgYW5kIEZJTEUgaGFuZGxlIGxlYWsgZGV0ZWN0aW9uIHRvIHRoZSBtZW1kZWJ1ZyBzeXN0ZW0KICBhbmQgdGh1cyBJIGZvdW5kIGFuZCByZW1vdmVkIGEgZmlsZSBkZXNjcmlwdG9yIGxlYWthZ2UgaW4gdGhlIGZ0cCBwYXJ0cwogIHRoYXQgaGFwcGVuZWQgd2hlbiB5b3UgZGlkIFBPUlRlZCBkb3dubG9hZHMuCgotIEFkZGVkIGFuIGluY2x1ZGUgPHN0ZGlvLmg+IGluIDxjdXJsL2N1cmwuaD4gc2luY2UgaXQgdXNlcyBGSUxFICouCgpEYW5pZWwgKDEyIERlY2VtYmVyIDIwMDApCi0gTXVsdGlwbGUgVVJMIGRvd25sb2FkcyB3aXRoIC1PIHdhcyBzdGlsbCBidWdnaW5nLiBOb3QgYW55bW9yZSBJIHRoaW5rIG9yCiAgaG9wZSwgb3IgYXQgbGVhc3QgSSd2ZSB0cmllZC4uLiA6LU8KCi0gRnJhbmNvaXMgUGV0aXRqZWFuIGZpeGVkIGFub3RoZXIgLU8gcHJvYmxlbQoKVmVyc2lvbiA3LjUuMQoKRGFuaWVsICgxMSBEZWNlbWJlciAyMDAwKQotIENsZWFuZWQgdXAgYSBmZXcgb2YgdGhlIG1ha2VmaWxlcyB0byB1c2UgdW5peC1zdHlsZSBuZXdsaW5lcyBvbmx5LiBBcyBLZXZpbgogIFAgUm90aCBmb3VuZCBvdXQsIGF0IGxlYXN0IG9uZSBDVlMgY2xpZW50IGJlaGF2ZWQgd3JvbmdseSB3aGVuIGl0IGZvdW5kCiAgZGlmZmVyZW50IG5ld2xpbmUgY29udmVudGlvbnMgd2l0aGluIHRoZSBzYW1lIGZpbGUuCgotIEFsYmVydCBDaGluLUEtWW91bmcgY29ycmVjdGVkIHRoZSBMREZMQUdTIHVzZSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3IKICB0aGUgU1NMIHN0dWZmLgoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDApCi0gTWFzc2ltbyBTcXVpbGxhY2UgY29ycmVjdGx5IGRlc2NyaWJlZCBob3cgbGliY3VybCBjb3VsZCB1c2Ugc2Vzc2lvbiBpZHMgd2hlbgogIGRvaW5nIFNTTCBjb25uZWN0aW9ucy4KCi0gSmFtZXMgR3JpZmZpdGhzIGZvdW5kIG91dCB0aGF0IGN1cmwgd291bGQgY3Jhc2ggaWYgdGhlIGZpbGUgeW91IHNwZWNpZnkgd2l0aAogIC1vIGlzIHNob3J0ZXIgdGhhbiB0aGUgVVJMISBUaGlzIHRvb2sgc29tZSBob3VycyB0byBmdWxseSBodW50IGRvd24sIGJ1dCBpdAogIGlzIGZpeGVkIG5vdy4KCkRhbmllbCAoNSBEZWNlbWJlciAyMDAwKQotIEphZXBpbCBLaW0gc2VudCB1cyBtYWtlZmlsZXMgdGhhdCBidWlsZCBjdXJsIHVzaW5nIHRoZSBmcmVlIHdpbmRvd3MgYm9ybGFuZAogIGNvbXBpbGVyLiBUaGUgcm9vdCBtYWtlZmlsZSBub3cgYWNjZXB0cyAnbWFrZSBib3JsYW5kJyB0byBidWlsZCBjdXJsIHdpdGgKICB0aGF0IGNvbXBpbGVyLgoKLSBTdGVmYW4gUmFkbWFuIHBvaW50ZWQgb3V0IHRoYXQgdGhlIHRlc3QgbWFrZWZpbGVzIGRpZG4ndCB1c2UgdGhlIFBFUkwKICB2YXJpYWJsZSB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0cyBmaWd1cmUgb3V0LiBBY3R1YWxseSwgeW91IHN0aWxsIG5lZWQKICBwZXJsIGluIHRoZSBwYXRoIGZvciB0aGUgdGVzdCBzdWl0ZSB0byBydW4gb2suCgotIFJpY2ggR3JheSBmb3VuZCBudW1lcm91cyBwb3J0YWJpbGl0eSBwcm9ibGVtczoKICAqIFRoZSBTQ08gY29tcGlsZXIgZ290IGFuIGVycm9yIG9uIHRoZSBnZXRwYXNzX3IoKSBwcm90b3R5cGUgaW4gZ2V0cGFzcy5oCiAgICBzaW5jZSB0aGUgY3VybCBvbmUgZGlmZmVyZWQgZnJvbSB0aGUgU0NPIG9uZQogICogVGhlIEhQVVggY29tcGlsZXIgZ290IGFuIGVycm9yIGJlY2F1c2Ugb2YgaG93IGN1cmwgZGlkIHRoZSBzaWdhY3Rpb24KICAgIHN0dWZmIGFuZCB1c2VkIGEgZGVmaW5lIEhQVVggZG9lc24ndCBoYXZlIChvciBuZWVkKS4KICAqIEEgZmV3IG1vcmUgcHJvYmxlbXMgcmVtYWluIHRvIGJlIHJlc2VhcmNoZWQuCgotIFBhdWwgSGFycmluZ3RvbiBleHBlcmllbmNlZCBhIGNvcmUgZHVtcCB1c2luZyBodHRwcy4gTm90IG11Y2ggZGV0YWlscyB5ZXQuCgpEYW5pZWwgKDQgRGVjZW1iZXIgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGZpeGVkIGEgcHJvYmxlbSB3aXRoIG11bHRpcGxlIFVSTHMgYW5kIC1vLy1PLgoKVmVyc2lvbiA3LjUKCkRhbmllbCAoMSBEZWNlbWJlciAyMDAwKQotIENyYWlnIERhdmlzb24gZ2F2ZSB1cyBoaXMgdXBkYXRlcyBvbiB0aGUgVkMrKyBtYWtlZmlsZXMsIHNvIG5vdyBjdXJsIHNob3VsZAogIGJ1aWxkIGZpbmUgd2l0aCB0aGUgTWljcm9zb2Z0IGNvbXBpbGVyIG9uIHdpbmRvd3MgdG9vLgoKLSBGaXhlZCB0aGUgbGliY3VybCB2ZXJzaW9uaW5nIHNvIHRoYXQgd2UgZG9uJ3QgcnVpbiBvbGQgcHJvZ3JhbXMgd2hlbgogIHJlbGVhc2luZyBuZXcgc2hhcmVkIGxpYnJhcnkgaW50ZXJmYWNlcy4KCkRhbmllbCAoMzAgTm92ZW1iZXIgMjAwMCkKLSBSZW5hbWVkIGRvY3MvUkVBRE1FLmN1cmwgdG8gZG9jcy9NQU5VQUwgdG8gYmV0dGVyIHJlZmxlY3Qgd2hhdCB0aGUgZG9jdW1lbnQKICBhY3R1YWxseSBjb250YWlucy4KCkRhbmllbCAoMjkgTm92ZW1iZXIgMjAwMCkKLSBJIHJlbW92ZWQgYSBidW5jaCBvZiAnI2lmIDAnIHNlY3Rpb25zIGZyb20gdGhlIGNvZGUuIFRoZXkgb25seSBtYWtlIHRoaW5ncwogIGhhcmRlciB0byBmb2xsb3cuIEFmdGVyIGFsbCwgd2UgZG8gaGF2ZSBhbGwgb2xkZXIgdmVyc2lvbnMgaW4gdGhlIENWUy4KClZlcnNpb24gNy41LXByZTUKCkRhbmllbCAoMjggTm92ZW1iZXIgMjAwMCkKLSBJIGZpbGxlZCBpbiBtb3JlIGVycm9yIGNvZGVzIGluIHRoZSBtYW4gcGFnZSBlcnJvciBjb2RlIGxpc3QgdGhhdCBoYWQgYmVlbgogIGxhZ2dpbmcuCgotIEphbWVzIEdyaWZmaXRocyBtYWlsZWQgbWUgYSBmaW5lIHBhdGNoIHRoYXQgaW50cm9kdWNlcyB0aGUgQ1VSTE9QVF9NQVhSRURJUlMKICBsaWJjdXJsIG9wdGlvbi4gV2hlbiB1c2VkLCBpdCdsbCBwcmV2ZW50IGxvY2F0aW9uIGZvbGxvd2luZyBtb3JlIHRoYW4gdGhlCiAgc2V0IG51bWJlciBvZiB0aW1lcy4gSXQgaXMgdXNlZnVsIHRvIGJyZWFrIG91dCBvZiBlbmRsZXNzIHJlZGlyZWN0LWxvb3BzLgoKRGFuaWVsICgyNyBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHR3byB0ZXN0IGNhc2VzIGZvciBmaWxlOi8vLgoKRGFuaWVsICgyMiBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHRoZSBsaWJjdXJsIENVUkxPUFRfRklMRVRJTUUgc2V0b3B0LCB3aGVuIHNldCBpdCB0cmllcyB0byBnZXQgdGhlCiAgbW9kaWZpZWQgdGltZSBvZiB0aGUgcmVtb3RlIGRvY3VtZW50LiBUaGlzIGlzIGEgc3BlY2lhbCBvcHRpb24gc2luY2UgaXQKICBpbnZvbHZlcyBhbiBleHRyYSBzZXQgb2YgY29tbWFuZHMgb24gRlRQIHNlcnZlcnMuIChVc2luZyB0aGUgTURUTSBjb21tYW5kCiAgd2hpY2ggaXMgbm90IGluIHRoZSBSRkM5NTkpCgogIGN1cmxfZWFzeV9nZXRpbmZvKCkgZ290IGEgY29ycmVzcG9uZGluZyBDVVJMSU5GT19GSUxFVElNRSB0byBnZXQgdGhlIHRpbWUKICBhZnRlciBhIHRyYW5zZmVyLiBJdCdsbCByZXR1cm4gYSB6ZXJvIGlmIENVUkxPUFRfRklMRVRJTUUgd2Fzbid0IHVzZWQgb3IgaWYKICB0aGUgdGltZSB3YXNuJ3QgcG9zc2libGUgdG8gZ2V0LgoKICAtLWhlYWQvLUkgdXNlZCBvbiBhIEZUUCBzZXJ2ZXIgd2lsbCBub3cgcHJlc2VudCBhICdMYXN0LU1vZGlmaWVkOicgaGVhZGVyCiAgaWYgY3VybCBjb3VsZCBnZXQgdGhlIHRpbWUgb2YgdGhlIHNwZWNpZmllZCBmaWxlLgoKLSBBZGRlZCB0aGUgb3B0aW9uICctLWNhY2VydCBbZmlsZV0nIHRvIGN1cmwsIHdoaWNoIGFsbG93cyBhIHNwZWNpZmllZCBQRU0KICBmaWxlIHRvIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBwZWVyJ3MgY2VydGlmaWNhdGUgd2hlbiBkb2luZyBIVFRQUwogIGNvbm5lY3Rpb25zLiBUaGlzIGhhcyBiZWVuIHJlcXVlc3RlZCwgcmF0aGVyIHJlY2VudGx5IGJ5IEh1bGthIEJvaHVzbGF2IGJ1dAogIG90aGVycyBoYXZlIGFza2VkIGZvciBpdCBiZWZvcmUgYXMgd2VsbC4KCkRhbmllbCAoMjEgTm92ZW1iZXIgMjAwMCkKLSBOdW1lcm91cyBmaXhlcyB0aGUgdGVzdCBzdWl0ZSBoYXMgYnJvdWdodCBpbnRvIHRoZSBkYXlsaWdodDoKCiAgICogY3VybF91bmVzY2FwZSgpIGNvdWxkIHJldHVybiBhIHRvbyBsb25nIHN0cmluZwogICAqIG9uIGZ0cCB0cmFuc2ZlciBmYWlsdXJlcywgdGhlcmUgY291bGQgYmUgbWVtb3J5IGxlYWtzCiAgICogZnRwIENXRCBjb3VsZCB1c2UgYmFkIGRpcmVjdG9yeSBuYW1lcwogICAqIG1lbWRlYnVnIG5vdyB1c2VzIHRoZSBtcHJpbnRmKCkgcm91dGluZXMgZm9yIGJldHRlciBwb3J0YWJpbGl0eQogICAqIGZyZWUoTlVMTCkgcmVtb3ZlZCB3aGVuIGRvaW5nIHJlc3VtZWQgdHJhbnNmZXJzCgotIEFkZGVkIGEgYnVuY2ggb2YgdGVzdCBjYXNlcyBmb3IgRlRQLgoKLSBHZW5lcmFsIGNsZWFudXBzIHRvIG1ha2UgbGVzcyB3YXJuaW5ncyB3aXRoIGdjYyAtV2FsbCAtcGVkYW50aWMuCgotIEkgbWFkZSB0aGUgdGVzdHMvZnRwc2VydmVyLnBsIHdvcmsgd2l0aCB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZ0cAogIG9wZXJhdGlvbnMuIFBPUlQsIFBBU1YsIFJFVFIsIFNUT1IsIExJU1QsIFNJWkUsIFVTRVIsIFBBU1MgYWxsIHdvcmsgbm93LiBOb3cKICBhbGwgSSBoYXZlIHRvIGRvIGlzIGludGVncmF0ZSB0aGUgZnRwIHNlcnZlciBkb2luZ3MgaW4gdGhlIHJ1bnRlc3RzLnBsCiAgc2NyaXB0IHNvIHRoYXQgZnRwIHRlc3RzIGNhbiBiZSBydW4gdGhlIHNhbWUgd2F5IGh0dHAgdGVzdHMgYWxyZWFkeSBydW4uCgpEYW5pZWwgKDIwIE5vdmVtYmVyIDIwMDApCi0gTWFkZSBsaWJjdXJsIGNhcGFibGUgb2YgZGVhbGluZyB3aXRoIGFueS1sZW5ndGggVVJMcy4gVGhlIGZvcm1lciBsaW1pdCBvZgogIDQwOTYgYnl0ZXMgd2FzIGEgYml0IGFubm95aW5nIHdoZW4gcGVvcGxlIHdhbnRlZCB0byB1c2UgY3VybCB0byByZWFsbHkgbWFrZQogIGxpZmUgdG91Z2ggb24gYSB3ZWIgc2VydmVyLiBOb3csIHRoZSBjb21tYW5kIGxpbmUgbGltaXQgaXMgdGhlIG1vc3QgYW5ub3lpbmcKICBidXQgdGhhdCBjYW4gYmUgY2lyY3VtdmVudGVkIGJ5IHVzaW5nIGEgY29uZmlnIGZpbGUuCgogIE5PVEU6IHRoZXJlIGlzIHN0aWxsIGEgNDA5Ni1ieXRlIGxpbWl0IG9uIFVSTHMgZXh0cmFjdGVkIGZyb20gTG9jYXRpb246CiAgaGVhZGVycy4KCi0gQ29ycmVjdGVkIHRoZSBzcGVsbGluZyBvZiAncmVzb2x2ZScgaW4gdHdvIGVycm9yIG1lc3NhZ2VzLgoKLSBBbGV4YW5kZXIgS291cmFrb3MgcG9zdGVkIGEgYnVnIHJlcG9ydCBhbmQgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBpdCEgSXQKICB0dXJuZWQgb3V0IHRoYXQgbHlueCBhbmQgd2dldCBzdXBwb3J0IGxvd2VyY2FzZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcwogIHdoZXJlIGN1cmwgb25seSBsb29rZWQgZm9yIHRoZSB1cHBlcmNhc2UgdmVyc2lvbnMuIE5vdyBjdXJsIHdpbGwgdXNlIHRoZQogIGxvd2VyY2FzZSB2ZXJzaW9ucyBpZiB0aGV5IGV4aXN0LCBidXQgaWYgdGhleSBkb24ndCwgaXQnbGwgdXNlIHRoZSB1cHBlcmNhc2UKICB2ZXJzaW9ucy4KCkRhbmllbCAoMTcgTm92ZW1iZXIgMjAwMCkKLSBjdXJsX2Zvcm1mcmVlKCkgd2FzIGFkZGVkLiBIb3cgY29tZSBubyBvbmUgbWlzc2VkIHRoYXQgb25lIGJlZm9yZT8gSSByYW4gdGhlCiAgdGVzdCBzdWl0ZSB3aXRoIHRoZSBtYWxsb2MgZGVidWcgZW5hYmxlZCBhbmQgZ290IGxvdHMgb2YgIm5pY2UiIHdhcm5pbmdzIG9uCiAgbWVtb3J5IGxlYWtzLiBUaGUgbW9zdCBzZXJpb3VzIG9uZSB3YXMgdGhpcy4gVGhlcmUgd2VyZSBhbHNvIGxlYWtzIGluIHRoZQogIGNvb2tpZSBoYW5kbGluZywgYW5kIGEgZmV3IGVycm9ycyB3aGVuIGN1cmwgZmFpbGVkIHRvIGNvbm5lY3QgYW5kIHNpbWlsYXIKICB0aGluZ3MuIE1vcmUgdGVzdHMgY2FzZXMgd2VyZSBhZGRlZCB0byBjb3ZlciB1cCBhbmQgdG8gdmVyaWZ5IHRoYXQgdGhlc2UKICBwcm9ibGVtcyBoYXZlIGJlZW4gcmVtb3ZlZC4KCi0gTXVjaG8gdXBkYXRlZCBjb25maWcgZmlsZSBwYXJzZXIgKEknbSBkZWFkIHRpcmVkIG9mIGFsbCB0aGUgYnVnIHJlcG9ydHMgYW5kCiAgd2VpcmQgYmVoYXZpb3VyIEkgZ2V0IG9uIHRoZSBmb3JtZXIgb25lKS4gSXQgd29ya3Mgc2xpZ2h0bHkgZGlmZmVyZW50bHkgbm93LAogIGFsdGhvdWdoIEkgZG91YnQgbWFueSBwZW9wbGUgd2lsbCBub3RpY2UgdGhlIGRpZmZlcmVuY2VzLiBUaGUgbWFpbgogIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCBpZiB5b3UgdXNlIG9wdGlvbnMgdGhhdCByZXF1aXJlIHBhcmFtZXRlcnMsIHRoZXkgbXVzdAogIGJvdGggYmUgc3BlY2lmaWVkIG9uIHRoZSBzYW1lIGxpbmUuIFdpdGggdGhpcyBuZXcgcGFyc2VyLCB5b3UgY2FuIGFsc28KICBzcGVjaWZ5IGxvbmcgb3B0aW9ucyB3aXRob3V0ICctLScgYW5kIHlvdSBtYXkgc2VwYXJhdGUgb3B0aW9ucyBhbmQKICBwYXJhbWV0ZXJzIHdpdGggOiBvciA9LiBJdCBtYWtlcyBhIGNvbmZpZyBmaWxlIGxpbmUgY291bGQgbG9vayBsaWtlOgoKICAgICAgICB1c2VyLWFnZW50ID0gImZvb2JhciBhbmQgc29tZXRoaW5nIgoKICBQYXJhbWV0ZXJzIHdpdGhpbiBxdW90ZXMgbWF5IGNvbnRhaW4gc3BhY2VzLiBXaXRob3V0IHF1b3RlcywgdGhleSdyZQogIGV4cGVjdGVkIHRvIGJlIGEgc2luZ2xlIG5vbi1zcGFjZSB3b3JkLgoKICBIYWQgdG8gcGF0Y2ggdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBwYXJzZXIgYSBsaXR0bGUgdG8gbWFrZSB0aGlzIHdvcmsuCgotIEFkZGVkIC0tdXJsIGFzIGFuIG9wdGlvbiB0byBhbGxvdyB0aGUgVVJMIHRvIGJlIHNwZWNpZmllZCB0aGlzIHdheS4gSXQgbWFrZXMKICB3YXkgbmljZXIgY29uZmlnIGZpbGVzLiBUaGUgcHJldmlvdXMgd2F5IG9mIHNwZWNpZnlpbmcgVVJMcyBpbiB0aGUgY29uZmlnCiAgZmlsZSBkb2Vzbid0IHdvcmsgYW55bW9yZS4KCkRhbmllbCAoMTUgTm92ZW1iZXIgMjAwMCkKLSBVc2luZyBjZXJ0YWluIGNoYXJhY3RlcnMgaW4gdXNlcm5hbWVzIG9yIHBhc3N3b3JkcyBmb3IgSFRUUCBhdXRoZW50aWNhdGlvbgogIGZhaWxlZC4gVGhpcyB3YXMgZHVlIHRvIHRoZSBtcHJpbnRmKCkgdGhhdCBoYWQgYSBzaWxseSBjaGVjayBmb3IgbGV0dGVycywKICBhbmQgaWYgdGhleSB3ZXJlbid0IGlzcHJpbnQoKSB0aGV5IHdlcmVuJ3Qgb3V0cHV0ZWQgImFzLWlzIi4gVGhpcyBjYXVzZWQKICBwYXNzd29yZHMgYW5kIHVzZXJuYW1lcyB1c2luZyAnpycgKGZvciBleGFtcGxlKSB0byBmYWlsLgoKVmVyc2lvbiA3LjQuMgoKRGFuaWVsICgxNSBOb3ZlbWJlciAyMDAwKQotICd0ZXN0cy9ydW50ZXN0cy5wbCcgbm93IHNvcnRzIHRoZSB0ZXN0IGNhc2VzIHByb3Blcmx5IHdoZW4gJ2FsbCcgaXMgdXNlZC4KCkRhbmllbCAoMTQgTm92ZW1iZXIgMjAwMCkKLSBJIGZlbGwgb3ZlciB0aGUgZHJhZnQtaWV0Zi1mdHBleHQtbWxzdC0xMi50eHQgSW50ZXJuZXQgRHJhZnQgdGl0bGVkCiAgIkV4dGVuc2lvbnMgdG8gRlRQIiB0aGF0IGNvbnRhaW5zIGEgZGVmaW5lZCB3YXkgaG93IHRoZSBmdHAgY29tbWFuZCBTSVpFCiAgY291bGQgYmUgYXNzdW1lZCB0byB3b3JrLgoKLSBMYXVyZW50IFBhcGllciBwb3N0ZWQgYSBidWcgcmVwb3J0IGFib3V0IHVzaW5nICItQyAtIiBhbmQgRlRQIHVwbG9hZGluZyBhCiAgZmlsZSB0aGF0IGlzbid0IHByc2VudCBvbiB0aGUgc2VydmVyLiBUaGUgc2VydmVyIG1pZ2h0IHRoZW4gcmV0dXJuIGEgNTUwIGFuZAogIGN1cmwgd2lsbCBmYWlsLiBTaG91bGQgaXQgaW5zdGVhZCBhcyBMYXVyZW50IFBhcGllciBzdWdnZXN0cywgc3RhcnQKICB1cGxvYWRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIGFzIGEgbm9ybWFsIHVwbG9hZD8KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwMCkKLSBGaXhlZCBhIGNyYXNoIHdpdGggdGhlIGZvbGxvd2xvY2F0aW9uIGNvdW50ZXIuCgotIFdoaWxlIHdyaXRpbmcgdGVzdCBjYXNlcyBmb3IgdGhlIHRlc3Qgc3VpdGUsIEkgZGlzY292ZXJlZCBhbiBvbGQgbGltaXRhdGlvbgogIHRoYXQgcHJldmVudGVkIC1vIGFuZCAtVCB0byBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUuIEkgcmVtb3ZlZCB0aGlzCiAgaW1tZWRpYXRlbHkgYXMgdGhpcyBoYXMgbm8gcmVsZXZhbmNlIGluIHRoZSBjdXJyZW50IGxpYmN1cmwuCiAgCi0gQ2hyaXMgRmFoZXJ0eSBmaXhlZCBhIGZyZWUtdHdpY2UgcHJvYmxlbSBpbiBsaWIvZmlsZS5jCgotIEkgZml4ZWQgdGhlIHBlcmwgaHR0cCBzZXJ2ZXIgcHJvYmxlbSBpbiB0aGUgdGVzdCBzdWl0ZS4KClZlcnNpb24gNy40LjIgcHJlNAoKRGFuaWVsICgxMCBOb3ZlbWJlciAyMDAwKQotIEkndmUgKGZpbmFsbHkpIHN0YXJ0ZWQgd29ya2luZyBvbiB0aGUgY3VybCB0ZXN0IHN1aXRlLiBJdCBpcyBpbiB0aGUgbmV3CiAgdGVzdHMvIGRpcmVjdG9yeS4gSXQgcmVxdWlyZXMgc2ggYW5kIHBlcmwuIFRoZXJlJ3MgYSBUQ1Agc2VydmVyIGluIHBlcmwgYW5kCiAgbW9zdCBvZiB0aGUgb3RoZXIgc3R1ZmYgcnVubmluZyBhIHByZXR0eSBzaW1wbGUgc2hlbGwgc2NyaXB0LgoKICBJJ3ZlIG9ubHkgbWFkZSBmb3VyIHRlc3QgY2FzZXMgc28gZmFyLCBidXQgaXQgcHJvdmVzIHRoZSBzeXN0ZW0gY2FuIHdvcmsuCgotIExhdXJlbnQgUGFwaWVyIG5vdGljZWQgdGhhdCBjdXJsIGRpZG4ndCBzZXQgVFlQRSB3aGVuIGRvaW5nIC0taGVhZCBjaGVja3MKICBmb3Igc2l6ZXMgb24gRlRQIHNlcnZlcnMuIFNvbWUgc2VydmVycyBzZWVtIHRvIHJldHVybiBkaWZmZXJlbnQgc2l6ZXMKICBkZXBlbmRpbmcgb24gd2hldGhlciBBU0NJSSBvciBCSU5BUlkgaXMgdXNlZCEKCi0gTGF1cmVudCBQYXBpZXIgZGV0ZWN0ZWQgdGhhdCBpZiB5b3UgYXBwZW5kZWQgYSBGVFAgdXBsb2FkIGFuZCBldmVyeXRoaW5nIHdhcwogIGFscmVhZHkgdXBsb2FkZWQsIGN1cmwgd291bGQgaGFuZy4KCi0gQW5ndXMgTWFja2F5J3MgZ2V0cGFzc19yKCkgaW4gbGliL2dldHBhc3MuYyBpcyBub3cgY29tcGxpYW50IHdpdGggdGhlCiAgZ2V0cGFzc19yKCkgZnVuY3Rpb24gaXQgc2VlbXMgc29tZSBzeXN0ZW1zIGFjdHVhbGx5IGhhdmUuCiAgCi0gVmVua2F0YXJhbWFuYSBNb2trYXBhdGkgZGV0ZWN0ZWQgYSBidWcgaW4gdGhlIGNvb2tpZSBwYXJzZXIgYW5kIGNvcnJlY3RlZAogIGl0LiAgSWYgdGhlIGNvb2tpZSB3YXMgc2V0IGZvciB0aGUgZnVsbCBob3N0IG5hbWUgKGRvbWFpbj1mdWxsLmhvc3QuY29tKSwKICB0aGUgY29va2llIHdhcyBuZXZlciBzZW50IGJhY2sgYmVjYXVzZSBvZiBhIGZhdWx0eSBsZW5ndGggY29tcGFyaXNvbiBiZXR3ZWVuCiAgdGhlIHNldCBkb21haW4gbGVuZ3RoIGFuZCB0aGUgY3VycmVudCBob3N0IG5hbWUuCgpEYW5pZWwgKDkgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbHNvY2tldCAoT1MvMiBzZWVtcyB0byBuZWVkCiAgaXQpLiBBZGRlZCBhIGNoZWNrIGZvciBSU0FnbHVlL3JzYXJlZiBmb3IgdGhlIGNhc2VzIHdoZXJlIGxpYmNyeXB0byBpcyBmb3VuZAogIGJ1dCBsaWJzc2wgaXNuJ3QuIEkgaGF2ZW4ndCB2ZXJpZmllZCB0aGlzIGZpeCB5ZXQgdGhvdWdoLCBhcyBJIGhhdmUgbm8KICBzeXN0ZW0gdGhhdCByZXF1aXJlcyB0aG9zZSBsaWJzIHRvIGJ1aWxkLgogIApWZXJzaW9uIDcuNC4yIHByZTMKCkRhbmllbCAoNyBOb3ZlbWJlciAyMDAwKQotIFJlbW92ZWQgcGVycm9yKCkgb3V0cHV0cyBmcm9tIGdldHBhc3MuYy4gQW5ndXMgTWFja2F5IGFsc28gYWdyZWVkIHRvIGEKICBzbGlnaHRseSBtb2RpZmllZCBsaWNlbnNlIG9mIHRoZSBnZXRwYXNzLmMgZmlsZSBhcyB0aGUgcHJvdG90eXBlIHdhcyBjaGFuZ2VkLgoKRGFuaWVsICg2IE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgcG9zc2liaWxpdHkgdG8gc2V0IGEgcGFzc3dvcmQgY2FsbGJhY2sgdG8gdXNlIGluc3RlYWQgb2YgdGhlIGJ1aWx0LWluLgogIFRoZXkncmUgY29udHJvbGVkIHdpdGggY3VybF9lYXN5X3NldG9wdCgpIG9mIGNvdXJzZSwgdGhlIHRhZ3MgYXJlCiAgQ1VSTE9QVF9QQVNTV0RGVU5DVElPTiBhbmQgQ1VSTE9QVF9QQVNTV0REQVRBLgoKLSBVc2VkIFQuIEJoYXJhdGgncyB0aGlua2luZyBhbmQgZml4ZWQgdGhlIHRpbWVycyB0aGF0IHNob3dlZCB0ZXJyaWJseSB3cm9uZwogIHRpbWVzIHdoZW4gbG9jYXRpb246IGhlYWRlcnMgd2VyZSBmb2xsb3dlZC4KCi0gRW1tYW51ZWwgVHljaG9uIGRpc2NvdmVyZWQgdGhhdCBjdXJsIGRpZG4ndCByZWFsbHkgbGlrZSB1c2VyIG5hbWVzIG9ubHkgaW4KICB0aGUgVVJMLiBJIGNvcnJlY3RlZCB0aGlzIGFuZCBJIGFsc28gZml4ZWQgdGhlIHNpbmNlIGxvbmcgbGl2aW5nIHByb2JsZW0KICB3aXRoIFVSTCBlbmNvZGVkIHVzZXIgbmFtZXMgYW5kIHBhc3N3b3JkcyBpbiB0aGUgVVJMcy4gVGhleSBzaG91bGQgd29yayBub3cuCiAgCkRhbmllbCAoMiBOb3ZlbWJlciAyMDAwKQotIFdoZW4gSSBhZGRlZCAtLWludGVyZmFjZSwgdGhlIG5ldyBlcnJvciBjb2RlIHRoYXQgd2FzIGFkZGVkIHdpdGggaXQgd2FzCiAgaW5zZXJ0ZWQgaW4gdGhlIHdyb25nIHBsYWNlIGFuZCB0aHVzIGFsbCBlcnJvciBjb2RlcyBmcm9tIDM1IGFuZCB1cHdhcmRzIGdvdAogIGluY3JlYXNlZCBvbmUgc3RlcC4gVGhpcyBpcyBub3cgY29ycmVjdGVkLCB3ZSdyZSBiYWNrIGF0IHRoZSBwcmV2aW91cwogIG51bWJlcnMuIEFsbCBuZXcgZXhpdCBjb2RlcyBzaG91bGQgYmUgYWRkZWQgYXQgdGhlIGVuZC4KCkRhbmllbCAoMSBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIGEgY2hlY2sgZm9yIHNpZ25hbCgpIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHNvIHRoYXQgaWYgc2lnYWN0aW9uKCkKICBpc24ndCBwcmVzZW50LCB3ZSBjYW4gdXNlIHNpZ25hbCgpIGluc3RlYWQuCgotIEknbSBoYXZpbmcgYSBsaWNlbnNlIGRpc2N1c3Npb24gZ29pbmcgb24gcHJpdmF0ZWx5LiBUaGUgaXNzdWUgaXMgeWV0IGFnYWluCiAgR1BMLWxpY2Vuc2VkIHByb2dyYW1zIHRoYXQgaGF2ZSBwcm9ibGVtcyB3aXRoIE1QTC4gSSBhbSBsZWFuaW5nIHRvd2FyZHMKICBtYWtpbmcgYSBraW5kIG9mIGR1YWwtbGljZW5zZSB0aGF0IHdpbGwgc29sdmUgdGhpcyBvbmNlIGFuZCBmb3IgYWxsLi4uCgpEYW5pZWwgKDMxIE9jdG9iZXIgMjAwMCkKLSBBZGRlZCB0aGUgcGFja2FnZXMvIGRpcmVjdG9yeS4gSSBpbnRlbmQgdG8gbGV0IHRoaXMgY29udGFpbiBzb21lIGRvY3MgYW5kCiAgdGVtcGxhdGVzIG9uIGhvdyB0byBnZW5lcmF0ZSBjdXN0b20tZm9ybWF0IHBhY2thZ2VzIGZvciB2YXJpb3VzIHBsYXRmb3Jtcy4KICBJJ3ZlIG5vdyByZW1vdmVkIHRoZSBSUE0gcmVsYXRlZCBjdXJsLnNwZWMgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSByb290LgoKRGFuaWVsICgzMCBPY3RvYmVyIDIwMDApCi0gVC4gQmhhcmF0aCBicm91Z2h0IGEgc2V0IG9mIHBhdGNoZXMgdGhhdCBicmluZyBuZXcgZnVuY3Rpb25hbGl0eSB0bwogIGN1cmxfZWFzeV9nZXRpbmZvKCkgYW5kIGN1cmxfZWFzeV9zZXRvcHQoKS4gTm93IHlvdSBjYW4gcmVxdWVzdCBwZWVyCiAgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHdpdGggdGhlICpzZXRvcHQoKSBDVVJMT1BUX1NTTF9WRVJJRllQRUVSIG9wdGlvbgogIGFuZCB0aGVuIHVzZSB0aGUgQ1VSTE9QVF9DQUlORk8gdG8gc2V0IHRoZSBjZXJ0aWZpY2F0ZSB0byB2ZXJpZnkgdGhlIHJlbW90ZQogIHBlZXIgYWdhaW5zdC4gQWZ0ZXIgYW4gc3VjaCBhbiBvcGVyYXRpb24gd2l0aCBhIHZlcmlmaWNhdGlvbiByZXF1ZXN0LCB0aGUKICAqX2dldGluZm8oKSBvcHRpb24gQ1VSTElORk9fU1NMX1ZFUklGWVJFU1VMVCB3aWxsIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dAogIHdoZXRoZXIgdGhlIHZlcmlmaWNhdGlvbiBzdWNjZWVkZWQgb3Igbm90LiAgCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwMCkKLSBHZW9yZyBIb3JuIGJyb3VnaHQgdXMgYSBzcGxlbmRpZCBwYXRjaCB0aGF0IHNvbHZlcyB0aGUgbG9uZy1zdGFuZGluZwogIGFubm95aW5nIHByb2JsZW0gd2l0aCB0aW1lb3V0cyB0aGF0IG1hZGUgY3VybCBleGl0IHdpdGggc2lsbHkgZXhpdCBjb2RlcwogICh3aGljaCBhcyBiZWVuIGNvbW1lbnRlZCBvdXQgbGF0ZWx5KS4gVGhpcyBzb2x1dGlvbiBpcyBzaWdhY3Rpb24oKSBiYXNlZCBhbmQKICBvZiBjb3Vyc2UgdGhlbiBvbmx5IHdvcmtzIGZvciB1bml4ZXMgKGFuZCBvbmx5IHRob3NlIHVuaXhlcyB0aGF0IGFjdHVhbGx5CiAgaGF2ZSB0aGUgc2lnYWN0aW9uKCkgZnVuY3Rpb24pLgoKRGFuaWVsICgyNiBPY3RvYmVyIDIwMDApCi0gQmr2cm4gU3RlbmJlcmcgc3VwcGxpZWQgYSBwYXRjaCB0aGF0IGZpeGVkIHRoZSBmbGF3IG1lbnRpb25lZCBieSBLZXZpbiBSb3RoCiAgdGhhdCBtYWRlIHRoZSBwYXNzd29yZCBnZXQgZWNob2VkIHdoZW4gcHJvbXB0ZWQgZm9yIGludGVyYWN0aXZlbHkuIFRoZQogIGdldHBhc3MoKSBmdW5jdGlvbiAobm93IGtub3duIGFzIG15X2dldHBhc3MoKSkgd2FzIGFsc28gZml4ZWQgdG8gbm90IHVzZSBhbnkKICBzdGF0aWMgYnVmZmVycy4gVGhpcyBhbHNvIG1lYW5zIHdlIGNhbm5vdCB1c2UgdGhlICJzdGFuZGFyZCIgZ2V0cGFzcygpCiAgZnVuY3Rpb24gZXZlbiBmb3IgdGhvc2Ugc3lzdGVtcyB0aGF0IGhhdmUgaXQsIHNpbmNlIGl0IGlzbid0IHRocmVhZC1zYWZlLgogIAotIEtldmluIFJvdGggZm91bmQgb3V0IHRoYXQgaWYgeW91J2Qgd3JpdGUgYSBjb25maWcgZmlsZSB3aXRoICctdiB1cmwnLCB0aGUKICB1cmwgd291bGQgbm90IGJlIHVzZWQgYXMgImRlZmF1bHQgVVJMIiBhcyBkb2N1bWVudGVkLCBhbHRob3VnaCBpZiB5b3Ugd3JvdGUKICBpdCAndXJsIC12JyBpdCB3b3JrZWQhIFRoaXMgaGFzIGJlZW4gY29ycmVjdGVkIG5vdy4KCi0gS2V2aW4gUm90aCdzIGlkZWEgb2YgdXNpbmcgbXVsdGlwbGUgLWQgb3B0aW9ucyBvbiB0aGUgc2FtZSBjb21tYW5kIGxpbmUgd2FzCiAganVzdCBicmlsbGlhbnQsIGFuZCBJIGNvdWxkbid0IHJlYWxseSB0aGluayBvZiBhbnkgcmVhc29uIHdoeSB3ZSBzaG91bGRuJ3QKICBzdXBwb3J0IGl0ISBUaGUgYXBwZW5kIGZ1bmN0aW9uIGFsd2F5cyBhcHBlbmQgJyYnIGFuZCB0aGVuIHRoZSBuZXcgLWQKICBjaHVuay4gVGhpcyBlbmFibGVzIGNvbnN0cnVjdHMgbGlrZSB0aGUgZm9sbG93aW5nOgoKICAgICAgICBjdXJsIC1kIG5hbWU9ZGFuaWVsIC1kIGFnZT11bmtub3duIGZvb2JhcnNpdGUuY29tCgpEYW5pZWwgKDI0IE9jdG9iZXIgMjAwMCkKLSBJIGZpeGVkIHRoZSBsaWIvbWVtZGVidWcuYyBzb3VyY2Ugc28gdGhhdCBpdCBjb21waWxlcyBvbiBMaW51eCBhbmQgb3RoZXIKICBzeXN0ZW1zLiBJdCB3aWxsIGJlIHVzZWZ1bCBvbmUgZGF5IHdoZW4gc29tZW9uZSBlbHNlIGJ1dCBtZSB3YW50cyB0byBydW4gdGhlCiAgbWVtb3J5IGRlYnVnZ2luZyBzeXN0ZW0uCgpEYW5pZWwgKDIzIE9jdG9iZXIgMjAwMCkKLSBJIG1vZGlmaWVkIHRoZSBtYWtldGd6IGFuZCBjb25maWd1cmUgc2NyaXB0cywgc28gdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdAogIHdpbGwgZmV0Y2ggdGhlIHZlcnNpb24gbnVtYmVyIGZyb20gdGhlIGluY2x1ZGUvY3VybC9jdXJsLmggaGVhZGVyIGZpbGVzLCBhbmQKICB0aGVuIHRoZSBtYWtldGd6IGRvZXNuJ3QgaGF2ZSB0byByZWJ1aWxkIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoZW4gSSBidWlsZAogIHJlbGVhc2UtYXJjaGl2ZXMuCgotIEJq9nJuIFN0ZW5iZXJnIGFuZCBMaW51cyBOaWVsc2VuIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IGN1cmwgd2FzIHNpbGx5CiAgZW5vdWdoIHRvIG5vdCBhbGxvdyBALWxldHRlcnMgaW4gcGFzc3dvcmRzIHdoZW4gdGhleSB3ZXJlIHNwZWNpZmllZCB3aXRoIHRoZQogIC11IG9yIC1VIGZsYWdzIChDVVJMT1BUX1VTRVJQV0QgYW5kIENVUkxPUFRfUFJPWFlVU0VSUFdEKS4gVGhpcyBhbHNvCiAgc3VnZ2VzdHMgdGhhdCBjdXJsIHByb2JhYmx5IHNob3VsZCB1cmwtZGVjb2RlIHRoZSBwYXNzd29yZCBwaWVjZSBvZiBhbiBVUkwKICBzbyB0aGF0IHlvdSBjb3VsZCBwYXNzIGFuIGVuY29kZWQgQC1sZXR0ZXIgdGhlcmUuLi4KICAKRGFuaWVsICgyMCBPY3RvYmVyIDIwMDApCi0gWWV0IGFub3RoZXIgaHR0cCBzZXJ2ZXIgYmFyZmVkIG9uIGN1cmwncyByZXF1ZXN0IHRoYXQgaW5jbHVkZSB0aGUgcG9ydAogIG51bWJlciBpbiB0aGUgSG9zdDogaGVhZGVyIGFsd2F5cy4gSSBub3cgb25seSBpbmNsdWRlIHRoZSBwb3J0IG51bWJlciBpZiBpdAogIGlzbid0IHRoZSBkZWZhdWx0ICg4MCBmb3IgSFRUUCwgNDQzIGZvciBIVFRQUykuIHd3dy5wZXJsLmNvbSB0dXJuZWQgb3V0IHRvCiAgcnVuIG9uZSBvZiB0aG9zZSBuYXN0eSBzZXJ2ZXJzLgoKLSBUaGUgUEhQNCBtb2R1bGUgZm9yIGN1cmwgaGFkIHByb2JsZW1zIHdpdGggcmVmZXJlciB0aGF0IHNlZW1zIHRvIGhhdmUgYmVlbgogIGNvcnJlY3RlZCBqdXN0IHllc3RlcmRheS4gKFN0ZXJsaW5nIEh1Z2hlcyBvZiB0aGUgUEhQIHRlYW0gY29uZmlybWVkIHRoaXMpCgpEYW5pZWwgKDE3IE9jdG9iZXIgMjAwMCkKLSBWbGFkaW1pciBPYmxvbW92IHJlcG9ydGVkIHRoYXQgdGhlIC1ZIGFuZCAteSBvcHRpb25zIGRpZG4ndCB3b3JrLiBUaGV5CiAgZGlkbid0IHdvcmsgZm9yIG1lIGVpdGhlci4gVGhpcyBvbmNlIGFnYWluIHByb3ZlcyB3ZSBzaG91bGQgaGF2ZSB0aGF0IHRlc3QKICBzdWl0ZS4uLgogIAotIEkgZmluYWxseSBjaGFuZ2VkIHRoZSBlcnJvciBtZXNzYWdlIGxpYmN1cmwgcmV0dXJucyBpZiB5b3UgdHJ5IGEgaHR0cHM6Ly8KICBVUkwgd2hlbiB0aGUgbGlicmFyeSB3YXNuJ3QgYnVpbGQgd2l0aCBTU0wgZW5hYmxlZC4gSXQgd2lsbCBub3cgcmV0dXJuIHRoaXMKICBlcnJvcjoKICAgICAgICAibGliY3VybCB3YXMgYnVpbHQgd2l0aCBTU0wgZGlzYWJsZWQsIGh0dHBzOiBub3Qgc3VwcG9ydGVkISIKCiAgSSByZWFsbHkgaG9wZSBpdCB3aWxsIG1ha2UgaXQgYSBiaXQgY2xlYXJlciB0byB1c2VycyB3aGVyZSB0aGUgYWN0dWFsCiAgcHJvYmxlbSBsaWVzLgoKVmVyc2lvbiA3LjQuMQoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDApCi0gSSBmb3Jnb3QgdG8gcmVtb3ZlIHNvbWUgb2YgdGhlIG1hbGxvYyBkZWJ1ZyBkZWZpbmVzIGZyb20gdGhlIG1ha2VmaWxlcyBpbgogIHRoZSByZWxlYXNlIGFyY2hpdmUgKG9mIGNvdXJzZSkuCgpWZXJzaW9uIDcuNAoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDApCi0gVGhlIGJ1ZmZlciBvdmVyZmxvdyBtZW50aW9uZWQgYmVsb3cgd2FzIHBvc3RlZCB0byBidWd0cmFxIG9uIEZyaWRheSAxM3RoLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDApCi0gQ29saW4gUm9iZXJ0IFBoaXBwcyBlbGVnYW50bHkgY29ycmVjdGVkIGEgYnVmZmVyIG92ZXJmbG93LiBJdCBjb3VsZCBiZSB1c2VkCiAgYnkgYW4gZXZpbCBmdHAgc2VydmVyIHRvIGNyYXNoIGN1cmwuIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgb2YgcmVwbGFjaW5nIGEKICBmZXcgb3RoZXIgc3ByaW50ZigpcyBpbnRvIHNucHJpbnRmKClzIGFzIHdlbGwuCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwMCkKLSBGb3VuZCBzb21lIG1vcmUgbWVtb3J5IGxlYWtzLiBUaGlzIG5ldyBzaW1wbGUgbWVtb3J5IGRlYnVnZ2VyIGhhcyB0dXJuZWQgb3V0CiAgcmVhbGx5IHVzZWZ1bCEKClZlcnNpb24gNy40IHByZTYKCkRhbmllbCAoOSBPY3RvYmVyIDIwMDApCi0gRmxvcmlhbiBLb2VuaWcgcG9pbnRlZCBvdXQgdGhhdCB0aGUgYm9vbCB0eXBlZGVmIGluIHRoZSBjdXJsL2N1cmwuaCBpbmNsdWRlCiAgZmlsZSB3YXMgYnJlYWtpbmcgUEhQIDQuMC4zIGNvbXBpbGluZy4gVGhlIGJvb2wgdHlwZWRlZiBpcyBub3QgdXNlZCBpbiB0aGUKICBwdWJsaWMgaW50ZXJmYWNlIGFuZCB3YXMgd3JvbmdseSBpbnNlcnRlZCBpbiB0aGF0IGhlYWRlciBmaWxlLgoKLSBK9nJnIEhhcnRyb3RoIGNvcnJlY3RlZCBhIG1pbm9yIG1lbW9yeSBsZWFrIGluIHRoZSBzcmMvdXJsZ2xvYi5jIHN0dWZmLiBJdAogIGRpZG4ndCBoYXJtIGFueW9uZSBzaW5jZSB0aGUgbWVtb3J5IGlzIGZyZWUoKWVkIG9uIGV4aXQgYW55d2F5LgoKLSBDb3JyZWN0ZWQgdGhlIHNyYy9tYWluLmMuIFdlIHVzZSB0aGUgX01QUklOVEZfUkVQTEFDRSAjZGVmaW5lIHRvIHVzZSBvdXIKICBsaWJjdXJsLXByaW50ZigpIGZ1bmN0aW9ucy4gVGhpcyBnaXZlcyB1cyBzbnByaW50ZigpIGV0IGFsIG9uIGFsbAogIHBsYXRmb3Jtcy4gSSBjb252ZXJ0ZWQgdGhlIGFsbG9jYXRlZCB1c2VyYWdlbnQgc3RyaW5nIHRvIG9uZSB0aGF0IHVzZXMgYQogIGxvY2FsIGJ1ZmZlci4KCi0gSSd2ZSBzZXQgYW4gI2lmIDAgc2VjdGlvbiBhcm91bmQgdGhlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyCiAgZ2VuZXJhdGVkIGluIGxpYi9mb3JtZGF0YS5jLiBUaGlzIHdpbGwgaG9wZWZ1bGx5IG1ha2UgY3VybCBkbyBtb3JlCiAgUEhQLWZyaWVuZGx5IG11bHRpLXBhcnQgcG9zdHMuCgpWZXJzaW9uIDcuNCBwcmU1CgpEYW5pZWwgKDkgT2N0b2JlciAyMDAwKQotIE5pY28gQmFnZ3VzIGZvdW5kIG91dCB0aGF0IGN1cmwncyBhYmlsaXR5IHRvIGZvcmNlIGEgQVNDSUkgZG93bmxvYWQgd2hlbgogIHVzaW5nIEZUUCB3YXMgbm8gbG9uZ2VyIHdvcmtpbmchIEkgY29ycmVjdGVkIHRoaXMuIFRoaXMgcHJvYmxlbSB3YXMgcHJvYmFibHkKICBpbnRyb2R1Y2VkIHdoZW4gSSByZWRlc2lnbmVkIGxpYmN1cmwgZm9yIHZlcnNpb24gNy4KCi0gR2VvcmcgSG9ybiBwcm92aWRlZCBhIHNvdXJjZSBleGFtcGxlIHRoYXQgcHJvdmVkIGEgbWVtb3J5IGxlYWsgaW4gbGliY3VybC4KICBJIGFkZGVkIHNpbXBsZSBtZW1vcnkgZGVidWdnaW5nIGZhY2lsaXRpZXMgYW5kIG5vdyB3ZSBjYW4gbWFrZSBsaWJjdXJsIGxvZwogIGFsbCBtZW1vcnkgZmlkZGxpbmcgZnVuY3Rpb25zLiBBbiBhZGRpdGlvbmFsIHBlcmwgc2NyaXB0IGlzIHVzZWQgdG8gYW5hbHl6ZQogIHRoZSBvdXRwdXQgbG9nZmlsZSBhbmQgdG8gbWF0Y2ggbWFsbG9jKClzIHdpdGggZnJlZSgpcyBldGMuIFRoZSBtZW1vcnkgbGVhawogIEdlb3JnIGZvdW5kIHR1cm5lZCBvdXQgdG8gYmUgdGhlIG1haW4gY29va2llIHN0cnVjdCB0aGF0IGNvb2tpZV9jbGVhbnVwKCkKICBkaWRuJ3QgZnJlZSEgVGhlIHBlcmwgc2NyaXB0IGlzIG5hbWVkIG1lbWFuYWx5emUucGwgYW5kIGl0IGlzIGF2YWlsYWJsZSBpbgogIHRoZSBDVlMgcmVzcG9zaXRvcnksIG5vdCBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICg4IE9jdG9iZXIgMjAwMCkKLSBHZW9yZyBIb3JuIGZvdW5kIGEgR2V0SG9zdCgpIHByb2JsZW0uIEl0IHR1cm5lZCBvdXQgaXQgbmV2ZXIgYXNzaWduZWQgdGhlCiAgcG9pbnRlciBpbiB0aGUgdGhpcmQgYXJndW1lbnQgcHJvcGVybHkhIFRoaXMgY291bGQgbWFrZSBhIGNyYXNoLCBvciBhdCBiZXN0CiAgYSBtZW1vcnkgbGVhayEKClZlcnNpb24gNy40IHByZTQKCkRhbmllbCAoNiBPY3RvYmVyIDIwMDApCi0gSXMgdGhlIC1GIHBvc3QgZm9sbG93aW5nIHRoZSBSRkMgMTg2NyBzcGVjPyBXZSBoYWQgdGhpcyBkaWN1c3Npb24gb24gdGhlCiAgbWFpbGluZyBsaXN0IHNpbmNlIGl0IGFwcGVhcnMgY3VybCBjYW4ndCBwb3N0IC1GIGZvcm0gcG9zdHMgdG8gYSBQSFAKICByZWNlaXZlci4uLiBJJ3ZlIGJlZW4gaW4gdG91Y2ggd2l0aCB0aGUgUEhQIGRldmVsb3BlcnMgYWJvdXQgdGhpcy4KCi0gRG9tZW5pY28gQW5kcmVvbGkgZm91bmQgb3V0IHRoYXQgdGhlIGxvbmcgb3B0aW9uICctLXByb3h5JyB3YXNuJ3Qgd29ya2luZwogIGFueW1vcmUhIFRoZSBvcHRpb24gcGFyc2VyIGdvdCBjb25mdXNlZCB3aGVuIEkgYWRkZWQgdGhlIC0tcHJveHl0dW5uZWwgZm9yCiAgNy4zLiBUaGlzIHdhcyBpbmRlZWQgYSB2ZXJ5IG9sZCBmbGF3IHRoYXQgaGFzbid0IHR1cm5lZCB1cCB1bnRpbCBub3cuLi4KCi0gSvZybiBIYXJ0cm90aCBwcm92aWRlZCBwYXRjaGVzLCB1cGRhdGVkIG1ha2VmaWxlcyBhbmQgdHdvIG5ldyBmaWxlcyBmb3IgRExMCiAgc3R1ZmYgb24gd2luMzIuIEhlIGFsc28gcG9pbnRlZCBvdXQgdGhhdCBsaWIgc291cmNlIGZpbGVzIHdlcmUgY29tcGlsZWQgd2l0aAogIC1JLi4vc3JjIHdoaWNoIGlzbid0IG9ubHkgd3JvbmcgYnV0IHBsYWluIHN0dXBpZCEKCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIGZpeGVkIGEgcHJvYmxlbSB3aXRoIEhUVFAgcmVzdW1lLiBDdXJsIHByZXZpb3VzbHkgdXNlZAogIGEgbG9jYWwgdmFyaWFibGUgYmFkbHksIHRoYXQgY291bGQgbGVhZCB0byBjcmFzaGVzLgoKVmVyc2lvbiA3LjQgcHJlMwoKRGFuaWVsICg0IE9jdG9iZXIgMjAwMCkKLSBNb3JlIGRvY3Mgd3JpdHRlbi4gVGhlIGN1cmxfZWFzeV9nZXRpbmZvLjMgbWFuIHBhZ2UgaXMgbm93IHByZXR0eSBhY2N1cmF0ZSwKICBhcyBpcyB0aGUgLXcgc2VjdGlvbiBpbiBjdXJsLjEuIEkgYWRkZWQgdHdvIG9wdGlvbnMgdG8gZW5hYmxlIHRoZSB1c2VyIHRvCiAgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWNlaXZlZCBoZWFkZXJzJyBzaXplIGFuZCB0aGUgc2l6ZSBvZiB0aGUgSFRUUAogIHJlcXVlc3QuIFQuIEJoYXJhdGggcmVxdWVzdGVkIHRoZW0uCiAgCkRhbmllbCAoMyBPY3RvYmVyIDIwMDApCi0gQ29ycmVjdGVkIGEgc2V2ZXIgZnJlZSgpIGJlZm9yZSB1c2UgaW4gdGhlIG5ldyBhZGRfYnVmZmVyX3NlbmQoKSEgOy0pCgpWZXJzaW9uIDcuNCBwcmUyCgpEYW5pZWwgKDMgT2N0b2JlciAyMDAwKQotIEphc29uIFMuIFByaWViZSBzZW50IG1lIHBhdGNoZXMgdGhhdCBjaGFuZ2VkIHRoZSB3YXkgY3VybCBpc3N1ZXMgSFRUUAogIHJlcXVlc3RzLiBUaGUgZW50aXJlIHJlcXVlc3QgaXMgbm93IGlzc3VlZCBpbiBvbmUgc2luZ2xlIHNob3QuIEl0IGRpZG4ndCBkbwogIHRoaXMgcHJldmlvdXNseSwgYW5kIGl0IGhhcyB0dXJuZWQgb3V0IHRoYXQgc2luY2UgdGhlIGNvbW1vbiBicm93c2VycyBkbyBpdAogIHRoaXMgd2F5LCBzb21lIHNpdGVzIGhhdmUgdHVybmVkIG91dCB0byB3b3JrIHdpdGggYnJvd3NlcnMgYnV0IG5vdCB3aXRoCiAgY3VybCEgQWx0aG91Z2ggdGhpcyBpcyBub3QgYSBjbGllbnQtc2lkZSBwcm9ibGVtLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8KICBmdWxseSBlbXVsYXRlIGJyb3dzZXJzLCBhbmQgdGh1cyB3ZSBoYXZlIG5vdyBhZGp1c3RlZCB0aGUgbmV0d29ya2luZyBsYXllcgogIHRvIHNsaWdodGx5IG1vcmUgYXBwZWFyIGFzIGEgYnJvd3Nlci4gSSBhZGp1c3RlZCBKYXNvbidzIHBhdGNoLCB0aGUgZmF1bHRzCiAgYXJlIHByb2JhYmx5IG1pbmUuCgpEYW5pZWwgKDIgT2N0b2JlciAyMDAwKQotIEFueW9uZSB3aG8gZXZlciB1cGxvYWRlZCBkYXRhIHdpdGggY3VybCBvbiBhIHNsb3cgbGluayBoYXMgbm90aWNlZCB0aGF0IHRoZQogIHByb2dlc3MgbWV0ZXIgaXMgdXBkYXRlZCB2ZXJ5IGluZnJlcXVlbnRseS4gVGhhdCBpcyBkdWUgdG8gdGhlIGxhcmdlIGJ1ZmZlcgogIHNpemUgY3VybCBpcyB1c2luZy4gSXQgcmVhZHMgNTBLYiBhbmQgc2VuZHMgaXQsIHVwZGF0ZXMgdGhlIHByb2dyZXNzIG1ldGVyCiAgYW5kIGxvb3BzLiA1MEtiIGlzIHZlcnkgbXVjaCBvbiBhIHNsb3cgbGluaywgYWx0aG91Z2ggaXQgaXMgcHJldHR5IG5lYXQgdG8KICB1c2Ugb24gYSBmYXN0IG9uZS4KCiAgSSd2ZSBub3cgbWFkZSBhbiBhZGp1c3RtZW50IHRoYXQgbWFrZXMgY3VybCB1c2UgYSAyS2IgYnVmZmVyIGZvciB1cGxvYWRzIHRvCiAgc3RhcnQgd2l0aC4gSWYgY3VybCdzIGF2ZXJhZ2UgdXBsb2FkIHNwZWVkIGlzIGZhc3RlciB0aGFuIGJ1ZmZlciBzaXplIGJ5dGVzCiAgcGVyIHNlY29uZCwgY3VybCB3aWxsIGluY3JlYXNlIHRoZSB1c2VkIGJ1ZmZlciBzaXplIHVwIHRvIG1heCA1MEtiLiBJdAogIHNob3VsZCBtYWtlIHRoZSBwcm9ncmVzcyBtZXRlciB3b3JrIGJldHRlci4KICAKVmVyc2lvbiA3LjQgcHJlMQoKRGFuaWVsICgyOSBTZXB0ZW1iZXIgMjAwMCkKLSBSaXBwZWQgb3V0IHRoZSAtdyBzdHVmZiBmcm9tIHRoZSBsaWJyYXJ5IGFuZCBwdXQgaW4gdGhlIGN1cmwgdG9vbC4gSXQgZ2V0cwogIGFsbCB0aGUgcmVsZXZhbnQgaW5mbyBmcm9tIHRoZSBsaWJyYXJ5IHVzaW5nIHRoZSBuZXcgY3VybF9lYXN5X2dldGluZm8oKQogIGZ1bmN0aW9uLgoKLSBicmFkIGF0IG9wZW5ic2Qub3JnIG1haWxlZCBtZSBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIG15IGtlcmJlcm9zIG1pc3Rha2UgYW5kCiAgcmVtb3ZlZCBhIGNvbXBpbGVyIHdhcm5pbmcgZnJvbSBob3N0aXAuYyB0aGF0IE9wZW5CU0QgcGVvcGxlIGdldC4KCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDApCi0gT2YgY291cnNlIChJIHNob3VsZCBwcm9iYWJseSBnZXQgcHVuaXNoZWQgc29tZWhvdykgSSBkaWRuJ3QgcHJvcGVybHkgY29ycmVjdAogIHRoZSAjaW5jbHVkZSBsaW5lcyBmb3IgdGhlIGJhc2U2NCBzdHVmZiBpbiB0aGUga2VyYmVyb3Mgc291cmNlcyBpbiB0aGUganVzdAogIHJlbGVhc2VkIDcuMyBwYWNrYWdlLiBUaGV5IHN0aWxsIGluY2x1ZGUgdGhlICpfa3JiLmggZmlsZXMhIE5vdywgdGhlIGVycm9yCiAgaXMgc29vbyB2ZXJ5IGVhc3kgdG8gc3BvdCBhbmQgZml4IHNvIEkgd29uJ3QgYm90aGVyIHdpdGggYSBxdWljayBidWcgZml4CiAgcmVsZWFzZS4gSSdsbCBwb3N0IGEgcGF0Y2ggd2hlbmV2ZXIgb25lIGlzIG5lZWRlZCBpbnN0ZWFkLiBJdCdsbCBiZQogIGF2YWlsYWJsZSBpbiB0aGUgQ1ZTIGluIGEgZmV3IG1pbnV0ZXMgYW55d2F5LgoKVmVyc2lvbiA3LjMKCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDApCi0gUmVtb3ZlZCB0aGUgYmFzZTY0X2tyYi5bY2hdIGZpbGVzLiBUaGV5J3ZlIG5vdyByZXBsYWNlZCB0aGUgZm9ybWVyCiAgYmFzZTY0LltjaF0gZmlsZXMuCgpEYW5pZWwgKDI2IFNlcHRlbWJlciAyMDAwKQotIFVwZGF0ZWQgc29tZSBkb2NzLgoKLSBJIGNoYW5nZWQgdGhlIE9wZW5TU0wgZml4IHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBhcyB3ZWxsLiBUaGUgcG9zdGVkCiAgcGF0Y2ggd2FzIG9ubHkgd29ya2luZyB3aXRoIDAuOS42IGFuZCBubyBvbGRlciBvbmVzLgogIApWZXJzaW9uIDcuMy1wcmU4CgpEYW5pZWwgKDI1IFNlcHRlbWJlciAyMDAwKQotIEVyZG11dCBQZmVpZmVyIGluZm9ybWVkIHVzIHRoYXQgY3VybCBkaWRuJ3QgYnVpbGQgd2l0aCBPcGVuU1NMIDAuOS42IGFuZAogIHNob3dlZCB1cyB3aGF0IG5lZWRlZCB0byBnZXQgcGF0Y2hlZCBpbiBvcmRlciB0byBtYWtlIGl0IGJ1aWxkIHByb3Blcmx5CiAgYWdhaW4uCgotIERpcmsgS3J1c2NoZXdza2kgZm91bmQgYSBidWcgaW4gdGhlIGNvb2tpZSBwYXJzZXIuIEkgbWFkZSBhbiBhbHRlcm5hdGl2ZQogIGFwcHJvYWNoIHRvIHRoZSBzb2x1dGlvbiBEaXJrIGhpbXNlbGYgc3VnZ2VzdGVkLiBUaGUgYnVnIG1hZGUgYSBjb29raWUKICBoZWFkZXIgdGhhdCBkaWRuJ3QgZW5kIHdpdGggYSB0cmFpbGluZyBzZW1pY29sb24gdG8gbm90IGdldCBwYXJzZWQuCgotIEkndmUgbWFya2VkIC1jIGFuZCAtdCBkZXByZWNhdGVkIG5vdy4gSWYgeW91IHVzZSBhbnkgb2YgdGhlbSwgY3VybCB3aWxsIHRlbGwKICB5b3UgdG8gdXNlICItQyAtIiBvciAiLVQgLSIgaW5zdGVhZC4gSSBkb24ndCB0aGluayBvY2N1cHlpbmcgdHdvIGxldHRlcnMgZm9yCiAgbmVhcmx5IGlkZW50aWNhbCBmdW5jdGlvbnMgaXMgZ29vZCB1c2UuIEFsc28sIC1UIC0ga2luZCBvZiBmb2xsb3dzIHRoZSBjdXJsCiAgdHJhZGl0aW9uIG9mIHVzaW5nIC0gZm9yIHN0ZGluIHdoZXJlIGEgZmlsZSBuYW1lIGlzIGV4cGVjdGVkLgoKRGFuaWVsICgyMyBTZXB0ZW1iZXIgMjAwMCkKLSBNYXJ0aW4gSGVkZW5mYWxrIHByb3ZpZGVkIHRoZSBwYXRjaCB0aGF0IGZpbmFsbHkgbWFkZSB0aGUga3JiNCBmdHAgdXBsb2FkCiAgd29yayEKCkRhbmllbCAoMjEgU2VwdGVtYmVyIDIwMDApCi0gVGhlIGtlcmJlcm9zIGNvZGUgaXMgbm90IHF1aXRlIHRocmVhZC1zYWZlIHlldC4gVGhlcmUgYXJlIGEgZmV3IG1vcmUgZ2xvYmFscwogIHRoYXQgbmVlZCB0byBiZSB0YWtlIGNhcmUgb2YuIExldCdzIGdldCB0aGUgdXBsb2FkIHdvcmtpbmcgZmlyc3QhCgpEYW5pZWwgKDIwIFNlcHRlbWJlciAyMDAwKQotIFJpY2hhcmQgUHJlc2NvdHQgc29sdmVkIGFub3RoZXIgbmFtZSBsb29rdXAgYnVmZmVyIHNpemUgcHJvYmxlbS4gSSB0b29rIHRoaXMKICBvcHBvcnR1bml0eSB0byByZXdyaXRlIHRoZSBHZXRIb3N0KCkgZnVuY3Rpb24uIFdpdGggdGhlc2UgbGFyZ2UgYnVmZmVyCiAgc2l6ZXMsIEkgdGhpbmsga2VlcGluZyB0aGVtIGFzIGxvY2FsIGFycmF5cyBxdWlja2x5IHR1cm4gdWdseS4gSSBub3cgdXNlCiAgbWFsbG9jKCkgdG8gZ2V0IHRoZSBidWZmZXIgbWVtb3J5LiBUaGFua3MgdG8gdGhpcywgSSBub3cgY2FuIHJlYWxsb2MoKSB0byBhCiAgbGFyZ2UgYnVmZmVyIGluIGNhc2Ugb2YgZGVtYW5kIChlcnJubyA9PSBFUkFOR0UpIGluIGNhc2UgYSBzb2x1dGlvbiBsaWtlCiAgdGhhdCB3b3VsZCBiZWNvbWUgbmVjZXNzYXJ5LiBJIHN0aWxsIHdhbnQgdG8gYXZvaWQgdGhhdCBraW5kIG9mIG5hc3RpbmVzcy4KCi0gVHJpZWQgdG8gY29tcGlsZSBhbmQgcnVuIGN1cmwgb24gTGludXggZm9yIGFscGhhIGFuZCBGcmVlQlNEIGZvciBhbHBoYS4gV2VudAogIGFzIHNtb290aCBhcyBpdCBjb3VsZC4KCi0gQWRkZWQgYSBkb2NzL2V4YW1wbGVzIGRpcmVjdG9yeSB3aXRoIHR3byB0aW55IGV4YW1wbGUgc291cmNlcyB0aGF0IHNob3cgaG93CiAgdG8gdXNlIGxpYmN1cmwuIEkgaG9wZSB1c2VycyB3aWxsIHN1cHBseSBtZSB3aXRoIG1vcmUgdXNlZnVsIGV4YW1wbGVzCiAgZnVydGhlciBvbi4KCi0gQXBwbGllZCBhIHBhdGNoIGJ5IEr2cm4gSGFydHJvdGggdG8gbm8gbG9uZ2VyIHVzZSB0aGUgd29yZCAnaW50ZWZhY2UnIGluIHRoZQogIGNvbmZpZyBzdHJ1Y3QgaW4gdGhlIHNyYy9tYWluLmMgZmlsZSBzaW5jZSBjZXJ0YWluIGNvbXBpbGVycyBoYXZlIHRoYXQgd29yZAogICJyZXNlcnZlcmVkIi4gIEkgZmlndXJlIHRoYXQgaXMgc29tZSBraW5kIG9mIEMrKyBkZWNlYXNlLgoKLSBVcGRhdGVkIHRoZSBjdXJsLjEgbWFuIHBhZ2Ugd2l0aCAtLWludGVyZmFjZSBhbmQgLS1rcmI0LgoKLSBNb2RpZmllZCB0aGUgYmFzZTY0RW5jb2RlKCkgZnVuY3Rpb24gdG8gd29yayBsaWtlIHRoZSBrZXJiZXJvcyBvbmUsIHNvIHRoYXQKICBJIGNvdWxkIHJlbW92ZSB0aGUgdXNlIG9mIHRoYXQuIFRoZXJlIGlzIG5vIG5lZWQgZm9yICp0d28qIGJhc2U2NCBlbmNvZGluZwogIGZ1bmN0aW9ucyEgOy0pCgpWZXJzaW9uIDcuM3ByZTUKCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDApCi0gVGhlIGtlcmJlcm9zNC1sYXllciBzb3VyY2UgY29kZSB0aGF0IGlzIG11Y2ggImluZmx1ZW5jZWQiIGJ5IHRoZSBvcmlnaW5hbAogIGtyYjQgc291cmNlIGNvZGUsIHRocm91Z2ggeWFmYyBpbnRvIGN1cmwsIHdhcyB1c2luZyBxdWl0ZSBhIGxvdCBvZiBnbG9iYWwKICB2YXJpYWJsZXMuIGxpYmN1cmwgY2FuJ3Qgd29yayBwcm9wZXJseSB3aXRoIGdsb2JhbHMgbGlrZSB0aGF0IHdoeSBJIGhhZCB0bwogIGNsZWFuIHVwIGFsbW9zdCBldmVyeSBmdW5jdGlvbiBpbiB0aGUgbmV3IHNlY3VyaXR5LmMgdG8gbWFrZSB0aGVtIHVzZQogIGNvbm5lY3Rpb24gc3BlY2lmaWMgdmFyaWFibGVzIGluc3RlYWQgb2YgdGhlIGdsb2JhbHMuIEkganVzdCBob3BlIEkgZGlkbid0CiAgZGVzdHJveSBhbnl0aGluZyBub3cuLi4gOi0pIGNvbmZpZ3VyZSB1cGRhdGVkLCB2ZXJzaW9uIHN0cmluZyBub3cgcmVmbGVjdHMKICBrcmI0IGJ1aWx0LWluLiBJdCBhbG1vc3Qgd29ya3Mgbm93LiBPbmx5IHVwbG9hZHMgYXJlIHN0aWxsIGJlaW5nIG5hdWdodHkuCgpWZXJzaW9uIDcuM3ByZTMKCkRhbmllbCAoMTggU2VwdGVtYmVyIDIwMDApCi0gTWFydGluIEhlZGVuZmFsayBzdXBwbGllZCBhIG1ham9yIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBrcmI0LWZ0cCBzdXBwb3J0IHRvCiAgY3VybC4gTWFydGluIGlzIHRoZSBwcmltYXJ5IGF1dGhvciBvZiB0aGUgZnRwIGNsaWVudCBuYW1lZCB5YWZjIGFuZCBoZSBkaWQKICBub3QgaGVzaXRhdGUgdG8gaGVscCB1cyBpbXBsZW1lbnQgdGhpcyB3aGVuIEkgYXNrZWQgaGltLiBNYW55IGFuZCBzaW5jZXJlCiAgdGhhbmtzIHRvIGEgc3BsZW5kaWQgZWZmb3J0LiBJdCBkaWRuJ3QgZXZlbiB0YWtlIG1hbnkgaG91cnMhCgotIFN0ZXBoZW4gS2ljayBzdXBwbGllZCBhIGJpZyBwYXRjaCB0aGF0IGludHJvZHVjZXMgdGhlIC0taW50ZXJmYWNlIGZsYWcgdG8KICB0aGUgY3VybCB0b29sIGFuZCBDVVJMT1BUX0lOVEVSRkFDRSBmb3IgbGliY3VybC4gSXQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGFuCiAgb3V0Z29pbmcgaW50ZXJmYWNlIHRvIHVzZSBmb3IgeW91ciByZXF1ZXN0LiBUaGlzIG1heSBub3Qgd29yayBvbiBhbGwKICBwbGF0Zm9ybXMuIFRoaXMgbmVlZHMgdGVzdGluZy4KCi0gUmljaGFyZCBQcmVzY290dCBub3RpY2VkIHRoYXQgY3VybCBvbiBUcnU2NCB1bml4IGNvdWxkIGNvcmUgZHVtcGVkIGlmIHRoZQogIG5hbWUgZGlkbid0IHJlc29sdmUgcHJvcGVybHkuIFRoaXMgd2FzIGR1ZSB0byB0aGUgR2V0SG9zdCgpIGZ1bmN0aW9uIG5vdAogIHJldHVybmluZyBhbiBlcnJvciBldmVuIHRob3VnaCBpdCBmYWlsZWQgb24gc29tZSBwbGF0Zm9ybXMhCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDAwKQotIFVwZGF0ZWQgYWxsIHNvcnRzIG9mIGRvY3VtZW50cyBpbiByZWdhcmRzIHRvIHRoZSBuZXcgcHJveHl0dW5uZWwgc3VwcG9ydC4KClZlcnNpb24gNy4zcHJlMgoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBLYWktVXdlIFJvbW1lbCBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIGh0dHBwcm94eXR1bm5lbCBzdHVmZiBmb3IgZnRwLgogIEFkanVzdGVkIGl0LiBBZGRlZCBiZXR0ZXIgaW5mbyBtZXNzYWdlIHdoZW4gc2V0dGluZyB1cCB0aGUgdHVubmVsIGFuZCB0aGUKICBwYXN2IG1lc3NhZ2Ugd2hlbiBkb2luZyB0aGUgc2Vjb25kIGNvbm5lY3QuCiAgClZlcnNpb24gNy4zcHJlMQoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBsaWJjdXJsIG5vdyBhbGxvd3MgImh0dHBwcm94eXR1bm5lbCIgdG8gYW4gYXJiaXRyYXJ5IGhvc3QgYW5kIHBvcnQgbmFtZS4gVGhlCiAgc2Vjb25kIGNvbm5lY3Rpb24gb24gZnRwIG5lZWRlZCB0aGF0LgoKLSBUaGVBcnRPZkhUVFBTY3JpcHRpbmcgd2FzIGNvcnJlY3RlZCBhbGwgb3Zlci4gSSBib3RoIHR5cGUgYW5kIHNwZWxsIHJlYWxseQogIGJhZCBhdCB0aW1lcyEKICAKRGFuaWVsICgxNCBTZXB0ZW1iZXIgMjAwMCkKLSAtcC8tLXByb3h5dHVubmVsIHdhcyBhZGRlZCB0byAnY3VybCcuIEl0IHVzZXMgdGhlIG5ldwogIENVUkxPUFRfSFRUUFBST1hZVFVOTkVMIGxpYmN1cmwgb3B0aW9uIHRoYXQgYWxsb3dzICJhbnkiIHByb3RvY29sIHRvIHR1bm5lbAogIHRocm91Z2ggdGhlIHNwZWNpZmllZCBodHRwIHByb3h5LiBBdCB0aGUgbW9tZW50LCB0aGlzIHNob3VsZCB3b3JrIHdpdGggZnRwLgoKRGFuaWVsICgxMyBTZXB0ZW1iZXIgMjAwMCkKLSBKb2NoZW4gU2NoYWV1YmxlIGZvdW5kIHRoYXQgZmlsZTovLyBkaWRuJ3Qgd29yayBhcyBleHBlY3RlZC4gQ29ycmVjdGVkIHRoaXMKICBhbmQgbWFpbGVkIHRoZSBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0LgoKRGFuaWVsICg3IFNlcHRlbWJlciAyMDAwKQotIEkgY2hhbmdlZCB0aGUgI2RlZmluZSBUKCkgaW4gY3VybC5oIHNpbmNlIGl0IHR1cm5lZCBvdXQgaXQgd2Fzbid0IHJlYWxseQogIGEgZ29vZCBzeW1ib2wgdG8gdXNlICh3aGVuIHlvdSBjb21waWxlZCBQSFAgd2l0aCBjdXJsIGFzIGEgbW9kdWxlLCB0aGF0CiAgZGVmaW5lIGNvbGxpZGVkIHdpdGggc29tZSBJTUFQIGRlZmluZSBvciBzb21ldGhpbmcpLiBUaGlzIHdhcyBwb3N0ZWQgdG8gdGhlCiAgUEhQIGJ1ZyB0cmFja2VyLgoKLSBJIGFkZGVkIGV4dGVybiAiQyIgc3R1ZmYgaW4gdHdvIGhlYWRlciBmaWxlcyB0byBiZXR0ZXIgYWxsb3cgbGliY3VybCB1c2FnZQogIGluIEMrKyBzb3JjZXMuIERpc2N1c3Npb25zIG9uIHRoZSBsaWJjdXJsIGxpc3Qgd2l0aCBEYW5ueSBIb3Jzd2VsbCBsZWFkIHRvCiAgdGhpcy4KClZlcnNpb24gNy4yLjEKCkRhbmllbCAoMzEgQXVndXN0IDIwMDApCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCAqYWdhaW4qIGFuZCBub3cgaXQgc2VlbXMgdG8KICBkZXRlY3QgTGludXggbmFtZSByZXNvbHZpbmcgcHJvcGVybHkhIChoZWFyZCB0aGF0IGJlZm9yZT8pCgotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBwb2ludGVkIG91dCB0aGF0IGRvd25sb2FkaW5nIGEgZmlsZSBjb250YWluaW5nIHRoZQogIGxldHRlciAnKycgZnJvbSBhbiBmdHAgc2VydmVyIGRpZG4ndCB3b3JrLiBJdCBkaWQgd29yayBmcm9tIEhUVFAgdGhvdWdoIGFuZAogIHRoZSByZWFzb24gd2FzIG15IGxhbWUgVVJMIGRlY29kZXIuCgotIEkgaGFwcGVuZWQgdG8gbm90aWNlIHRoYXQgLUkgZGlkbid0IGF0IGFsbCB3b3JrIG9uIGZ0cCBhbnltb3JlLiBJIGNvcnJlY3RlZAogIHRoYXQuCgpWZXJzaW9uIDcuMgoKRGFuaWVsICgzMCBBdWd1c3QgMjAwMCkKLSBVbmRlcnN0YW5kaW5nIEFJWCBpcyBhIGhhcmQgdGFzay4gSSBiZWxpZXZlIEknbGwgbmV2ZXIgZmlndXJlIG91dCB3aHkgdGhleQogIHNvbHZlIHRoaW5ncyBzbyBkaWZmZXJlbnRseSBmcm9tIHRoZSBvdGhlciB1bml4ZXMuIE5vdywgSSdtIGxlZnQgd2l0aCB0aGUKICBBSVggNC4zIHJ1bi10aW1lIHdhcm5pbmdzIGFib3V0IGR1cGxpY2F0ZSBzeW1ib2xzIHRoYXQgYWNjb3JkaW5nIHRvIHRoaXMKICBhcnRpY2xlIChodHRwOi8vd3d3Lmdlb2NyYXdsZXIuY29tL2FyY2hpdmVzLzMvNDA1LzE5OTkvOS8wLzI1OTM0MjgvKSBpcyBhCiAgbGlidG9vbCBmbGF3LiBJIHRyaWVkIHRoZSBtZW50aW9uZWQgcGF0Y2gsIGFsdGhvdWdoIHRoYXQgc3RvcHMgdGhlIGxpbmtpbmcKICBjb21wbGV0ZWx5LgoKICBTbywgaWYgSSBzZWxlY3QgdG8gaWdub3JlIHRoZSBsZCB3YXJuaW5ncyB0aGVyZSBhcmUgY29tcGlsZXIgd2FybmluZ3MgdGhhdAogIGZpbGwgdGhlIHNjcmVlbiBwcmV0dHkgYmFkIHdoZW4gY3VybCBjb21waWxlcy4gSXQgdHVybnMgb3V0IHRoYXQgaWYgSSB3YW50CiAgdG8gJyNpbmNsdWRlIDxhcnBhL2luZXQuaD4nLCBJIGNhbiBnZXQgdGlkIG9mIHRoZSB3YXJuaW5ncyBieSBpbmNsdWRlIHRoZQogIGZvbGxvd2luZyB0aHJlZSBpbmNsdWRlIGZpbGVzIGJlZm9yZSB0aGF0IG9uZToKCiAgICAgICAgI2luY2x1ZGUgPG5ldC9pZl9kbC5oPgogICAgICAgICNpbmNsdWRlIDxzeXMvbWJ1Zi5oPgogICAgICAgICNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CgogIE5vdywgaXMgaXQgcmVhbGx5IHNhbmUgdG8gYWRkIHRob3NlIGluY2x1ZGUgZmlsZXMgYmVmb3JlIGFycGEvaW5ldC5oIGluIGFsbAogIHRoZSBzb3VyY2UgZmlsZXMgdGhhdCBpbmNsdWRlIGl0PwoKICBUaGFua3MgdG8gQWxiZXJ0IENoaW4tQS1Zb3VuZyBhdCB0aGV3cml0dGVud29yZC5jb20gd2hvIGdhdmUgbWUgdGhlIEFJWAogIGxvZ2luIHRvIHRyeSBldmVyeXRoaW5nIG9uLgoKRGFuaWVsICgyNCBBdWd1c3QgMjAwMCkKLSBKYW4gU2NobWlkdCBzdXBwbGllZCB1cyBhIG5ldyBWQzYgbWFrZWZpbGUgZm9yIFdpbmRvd3MgYXMgdGhlIHByZXZpb3VzIG9uZQogIHdhcyBub3QgdXAgdG8gZGF0ZSBidXQgbGFja2VkIHNldmVyYWwgb2JqZWN0IGZpbGVzLgoKLSBNb3JlIHdvcmsgb24gdGhlIG5hbWluZy4KCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBwcm92aWRlZCBhIGNvbmZpZ3VyZS1jaGVjayBmb3IgbGFyZ2UgZmlsZSBzdXBwb3J0LCBhcwogIHNvbWUgc3lzdGVtcyBzZWVtIHRvIG5lZWQgdGhhdCBmb3IgdGhlbSB0byB3b3JrLiBIYWQgdG8gY2hhbmdlIHRoZSBwb3NpdGlvbgogIGZvciB0aGUgY29uZmlnLmggaW5jbHVkZSBmaWxlIGluIGV2ZXJ5IC5jIGZpbGUgaW4gdGhlIGxpYmN1cmwgZGlyLi4uCgotIEFzIHN1Z2dlc3RlZCBvbiB0aGUgbWFpbGluZyBsaXN0IChieSBUcm95IEVuZ2VsKSwgSSBkaWQgdXNlIGEgLS1kYXRhLWJpbmFyeQogIG9wdGlvbiBpbnN0ZWFkIG9mIHRoZSBtZXNzeSB3YXkgSSd2ZSBsZWZ0IGRlc2NyaWJlZCBiZWxvdy4gSXQgc2VlbXMgdG8KICB3b3JrLiBUaGUgbGliY3VybCBmaXggcmVtYWluZWQgdGhlIHNhbWUgYXMgeWVzdGVyZGF5LgoKRGFuaWVsICgyMyBBdWd1c3QgMjAwMCkKLSBCYWNrIG9uIHRoZSAtZCBzdHJpcHBpbmcgbmV3bGluZXMgdGhpbmcuIFRoZSAncGxhaW4gcG9zdCcgdGhpbmcgd2FzIGFkZGVkCiAgd2hlbiBJIGhhZCBubyB0aG91Z2h0IG9mIHRoYXQgb25lIGNvdWxkIGFjdHVhbGx5IHBvc3QgYmluYXJ5IGRhdGEgd2l0aAogIGl0LiBOb3csIEkgaGF2ZSB0byBhZGQgdGhpcyBmdW5jdGlvbmFsaXR5IGluIGEgZ3JhY2VmdWwgbWFubmVyIGFuZCBJIHRoaW5rCiAgSSd2ZSBtYW5hZ2VkIHRvIGNvbWUgdXAgd2l0aCBhIHdheTogJy1kIEBmaWxlO2JpbmFyeScgd2lsbCB0aHVzIHBvc3QgdGhlCiAgZmlsZSBiaW5hcnksIGV4YWN0bHkgYXMgaXRzIGNvbnRlbnRzIGFyZS4gSXQgaXMgaW1wbGVtZW50ZWQgd2l0aCBhIG5ldwogICpzZXRvcHQoKSBvcHRpb24gKENVUkxPUFRfUE9TVEZJRUxEU0laRSkgdG8gc2V0IHRoZSBwb3N0ZmllbGQgc2l6ZSwgc2luY2UKICBsaWJjdXJsIGNhbid0IHN0cmxlbigpIHRoZSBkYXRhIGluIHRoZXNlIGNhc2VzLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIG1hZGUgc29tZSB2ZXJ5IHNlcmlvdXMgZWZmb3J0cyBhbmQgYWxsIHRoZSBuYW1lCiAgcmVzb2x2aW5nIHByb2JsZW1zIHNlZW0gdG8gaGF2ZSBiZWVuIHNvcnRlZCBvdXQgbm93IG9uIGFsbCB0aGUgcGxhdGZvcm1zCiAgdGhhdCBwcmV2aW91c2x5IHNob3dlZCB0aGVtLiBJJ2xsIG1ha2UgYW5vdGhlciByZWxlYXNlIG5vdyBhbnlkYXkgYmVjYXVzZSBvZgogIHRoaXMuCgotIFRoZSBGQVEgd2FzIG11Y2ggZW5oYW5jZWQgd2hlbiBpdCBjb21lcyB0byB0aGUgbGljZW5zaW5nIGlzc3VlcyB0aGFua3MgdG8KICBCam9ybiBSZWVzZS4KCkRhbmllbCAoMjEgQXVndXN0IDIwMDApCi0gUmljayBXZWx5a29jaHkgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdoZW4geW91IHVzZSAtZCB0byBwb3N0IGFuZCB5b3Ugd2FudCB0bwogIGtlZXAgdGhlIG5ld2xpbmVzLCBhcyBjdXJsIHN0cmlwcyB0aGVtIG9mZiBhcyBhIGJvbnVzIGJlZm9yZSBwb3N0aW5nLi4uCiAgVGhpcyBuZWVkcyB0byBiZSBhZGRyZXNzZWQuCgpWZXJzaW9uIDcuMS4xCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAwKQotIEdvdCBtb3JlIHBlb3BsZSBpbnZvbHZlZCBpbiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgbWVzcy4gQ2FvbGFuIE1jTmFtYXJhIHNlbnQKICBtZSBjb25maWd1cmUtY29kZSB0aGF0IHR1cm5lZCBvdXQgdG8gYmUgdmVyeSBzaW1pbGFyIHRvIG15IGV4aXN0aW5nIHRlc3RzCiAgd2hpY2ggb25seSBtYWtlIG1lIG1vcmUgc3VyZSBJJ20gb24gdGhlIHJpZ2h0IHBhdGguIEkgY2hhbmdlZCB0aGUgb3JkZXIgb2YKICB0aGUgdGVzdHMgc2xpZ2h0bHksIGFzIGl0IHNlZW1zIHRoYXQgc29tZSBjb21waWxlcnMgZG9uJ3QgeWVsbCBlcnJvciBpZiBhCiAgZnVuY3Rpb24gaXMgdXNlZCB3aXRoIHRvbyBtYW55IHBhcmFtZXRlcnMuIFRodXMsIHRoZSBmaXJzdCB0ZXN0ZWQgZnVuY3Rpb24KICB3aWxsIHNlZW0gb2suLi4gTGV0J3MgaG9wZSBtb3JlIGNvbXBpbGVycyB0aGluayBvZiB0b28tZmV3IHBhcmFtZXRlcnMgYXMgYmFkCiAgbWFubmVycywgYXMgd2UncmUgbm93IHRyeWluZyB0aGUgZnVuY3Rpb25zIGluIHRoYXQgb3JkZXI7IGZld2VyIGZpcnN0LiBJCiAgc2hvdWxkIGFsc28gYWRkIHRoYXQgTGFycyBIZWNraW5nIG1haWxlZCBtZSBhbmQgdm9sdW50ZWVyZWQgdG8gcnVuIHRlc3RzIG9uCiAgYSBmZXcgb2RkIHN5c3RlbXMuIENvYWxhbiBpcyBrZWVwaW5nIGhpcyB3b3JrIG92ZXIgYXQKICBodHRwOi8vd3d3LmNzbi51bC5pZS9+Y2FvbGFuL3B1YmxpbmsvZ2V0aG9zdGJ5bmFtZV9yLy4gTWlnaHQgYmUgaGFuZHkgaW4gdGhlCiAgZnV0dXJlIGFzIHdlbGwuCgpEYW5pZWwgKDE4IEF1Z3VzdCAyMDAwKQotIEkgbm90aWNlZCBJIGhhZG4ndCBpbmNyZWFzZWQgdGhlIG5hbWUgbG9va3VwIGJ1ZmZlciBpbiBsaWIvZnRwLmMuIEkgZG9uJ3QKICB0aGluayB0aGlzIGlzIHRoZSByZWFzb24gZm9yIHRoZSBjb250aW51ZWQgdHJvdWJsZSB0aG91Z2guCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDAwKQotIEZyZWQgTm96IGNvcnJlY3RlZCBteSBzdHVwaWQgbWlzdGFrZXMgaW4gdGhlIGdldGhvc3RieW5hbWVfcigpIGZsdWZmLiBJdAogIHNob3VsZCBhZmZlY3Qgc29tZSBBSVgsIERpZ2l0YWwgVW5peCBhbmQgSFBVWCAxMCBzeXN0ZW1zLgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwMCkKLSBNYXRoaWV1IExlZ2FyZSBjb21waWxlZCBhbmQgYnVpbGQgNy4xIHdpdGhvdXQgZXJyb3JzIG9uIGJvdGggQUlYIDQuMiBhcyB3ZWxsCiAgYXMgQUlYIDQuMy4gTm93IHdoeSBkaWQgcHJvYmxlbXMgb2NjdXIgYmVmb3JlPwoKLSBGcmVkIE5veiByZXBvcnRlZCBhIC13Ly0td3JpdGUtb3V0IGJ1ZyB0aGF0IGNhdXNlZCBpdCB0byBtYWxmdW5jdGlvbiB3aGVuCiAgdXNlZCBjb21iaW5lZCB3aXRoIG11bHRpcGxlIFVSTCByZXRyaWV2YWxlcy4gQWxsIGJ1dCB0aGUgZmlyc3QgZGlzcGxheSBnb3QKICBzY3Jld2VkIHVwIQoKRGFuaWVsICgxMSBBdWd1c3QgMjAwMCkKLSBKYXNvbiBQcmllYmUgYW5kIGFuIGFub255bW91cyBmcmllbmQgZm91bmQgc29tZSBob3N0IG5hbWVzIHRoZSBMaW51eCB2ZXJzaW9uCiAgb2YgY3VybCBjb3VsZCBub3QgcmVzb2x2ZS4gSXQgdHVybmVkIG91dCB0aGUgYnVmZmVyIHVzZWQgdG8gcmV0cmlldmUgdGhhdAogIGluZm9ybWF0aW9uIHdhcyB0b28gc21hbGwuIEZpeGVkLiBPbmUgY291bGQgYXJndWUgYWJvdXQgdGhlIHVzZWZ1bG5lc3Mgb2YKICBub3QgaGF2aW5nIHRoZSBzbGlnaHRlc3QgdHJhY2Ugb2YgYSBtYW4gcGFnZSBmb3IgZ2V0aG9zdGJ5bmFtZV9yKCkgb24gbXkKICBMaW51eCBSZWRoYXQgaW5zdGFsbGF0aW9uLi4uCgpEYW5pZWwgKDEwIEF1Z3VzdCAyMDAwKQotIEJhbGFqaSBTIFJhbyB3YXMgZmlyc3QgaW4gbGluZSB0byBub3RlIHRoZSBtaXNzaW5nIHBvc3NpYmlsaXR5IHRvIHJlcGxhY2UKICB0aGUgQ29udGVudC1UeXBlOiBhbmQgQ29udGVudC1MZW5ndGg6IGhlYWRlcnMgd2hlbiBkb2luZyAtZCBwb3N0cy4gSSBhZGRlZAogIHRoZSBwb3NzaWJpbGl0eSBqdXN0IG5vdy4gSXQgc2VlbXMgc29tZSBwZW9wbGUgd2FudHMgdG8gZG8gc3RhbmRhcmQgcG9zdHMKICB1c2luZyBjdXN0b20gQ29udGVudC1UeXBlcy4KCkRhbmllbCAoOCBBdWd1c3QgMjAwMCkKLSBNaWtlIERvd2VsbCBjb3JyZWN0bHkgZGlzY292ZXJlZCB0aGF0IGN1cmwgZGlkIG5vdCBhcHByb3ZlIG9mIFVSTHMgd2l0aCBubwogIHVzZXIgbmFtZSBidXQgcGFzc3dvcmQuIEFzIGluICdodHRwOi8vOmZvb0BoYXh4LnNlJy4gSSBjb3JyZWN0ZWQgdGhpcy4KClZlcnNpb24gNy4xCgpEYW5pZWwgKDcgQXVndXN0IDIwMDApCi0gTXkgQUlYIDQgZml4IGRvZXMgbm90IHdvcmsuIEkgbmVlZCBoZWxwIGZyb20gYSBBSVggNCBoYWNrZXIuCgotIEkgYWRkZWQgbXkgbmV3IGRvY3VtZW50IGluIHRoZSBkb2NzIGRpcmVjdG9yeS4gSXQgaXMgYWltZWQgdG8gYmVjb21lIGEgc29ydAogIG9mIHR1dG9yaWFsIG9uIGhvdyB0byBkbyBIVFRQIHNjcmlwdGluZyB3aXRoIGN1cmwuCgpEYW5pZWwgKDQgQXVndXN0IDIwMDApCi0gV29ya2luZyB3aXRoIFJpY2ggR3JheSBvbiBjb21waWxpbmcgY3VybCBmb3IgbG90cyBvZiBkaWZmZXJlbnQgcGxhdGZvcm1zLgogIE15IGZpeCBmb3IgQUlYIDMuMiB3YXMgbm90IGdvb2QgZW5vdWdoIGFuZCB3YXMgc2xpZ2h0bHkgY2hhbmdlZCwgSSBoYWQgdG8KICBtb3ZlIGFuIGluY2x1ZGUgZmlsZSBiZWZvcmUgYW5vdGhlciwgYXMgaXMgbm93IGRlc2NyaWJlZCBpbiB0aGUgc291cmNlLgoKICBBSVggNC4yICg0Llg/KSBoYXMgZGlmZmVyZW50IGdldGhvc3RieW5hbWVfcigpIGFuZCBnZXRob3N0YnlhZGRyX3IoKQogIGZ1bmN0aW9ucyB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGRpZG4ndCBjaGVjayBmb3IgYW5kIHRodXMgdGhlIGNvbXBpbGUKICBicm9rZSB3aXRoIGFuIGVycm9yLiBJIGhhdmUgbm93IGNoYW5nZWQgdGhlIGdldGhvc3RieW5hbWVfcigpIGNoZWNrIGluIHRoZQogIGNvbmZpZ3VyZSBmaWxlIHRvIHN1cHBvcnQgYWxsIHRocmVlIHZlcnNpb25zIG9mIGJvdGggdGhlc2UgZnVuY3Rpb25zLiBNeQogIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyB0aGUgQUlYLXN0eWxlIGlzIHRob3VnaCBub3QgeWV0IHZlcmlmaWVkIGFuZCBJIG1heQogIGdldCBwcm9ibGVtcyB0byBmaXggaXQgaWYgaXQgdHVybnMgb3V0IHRvIGJ1ZyBzaW5jZSBJIGRvbid0IGhhdmUgYWNjZXNzIHRvCiAgYW55IHN5c3RlbSB1c2luZyB0aGF0LgoKICBGb3IgcHJvYmxlbXMgbGlrZSB0aGF0LCBJIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYWxsb3cgLS1kaXNhYmxlLXRocmVhZAogIHRvIGNvbXBsZXRlbHkgc3dpdGNoIG9mZiB0aGUgY2hlY2sgZm9yIHRocmVhZHNhZmUgdmVyc2lvbnMgb2YgYSBmZXcKICBmdW5jdGlvbnMgYW5kIHRodXMgZ28gd2l0aCB0aGUgImdvb2Qgb2xkIHZlcnNpb25zIiB0aGF0IHRlbmQgdG8gd29yawogIGFsdGhvdWdoIHdpbGwgYnJlYWsgdGhyZWFkLXNhZmVuZXNzIGZvciBsaWJjdXJsLiBNb3N0IHBlb3BsZSB3b24ndCB1c2UKICBsaWJjdXJsIGZvciBvdGhlciB0aGluZ3MgdGhhbiBjdXJsIHRob3VnaCwgYW5kIGN1cmwgZG9lc24ndCBuZWVkIGEKICB0aHJlYWQtc2FmZSBsaWIuCgotIFdvcmtpbmcgb24gbXkgYmlnIHR1dG9yaWFsIGFib3V0IEhUVFAgc2NyaXB0aW5nIHdpdGggY3VybC4KCkRhbmllbCAoMSBBdWd1c3QgMjAwMCkKLSBSaWNoIEdyYXkgc3BvdHRlZCBhIHByb2JsZW0gaW4gc3JjL3NldHVwLmggY2F1c2VkIGJ5IGEgI2RlZmluZSBzdHJlcXVhbCgpCiAgdGhhdCB3YXMganVzdCBhIGxlZnQtb3ZlciBmcm9tIHBhc3NlZCB0aW1lcy4gVGhlIHN0cmVxdWFsKCkgaXMgbm93IGEgdHJ1ZQogIGZ1bmN0aW9uIHN1cHBsaWVkIGJ5IGxpYmN1cmwgZm9yIGEgcG9ydGFibGUgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcKICBjb21wYXJpc29uLiBJIGFkZGVkIHRoZSBwcm90b3R5cGVzIGluIGluY2x1ZGUvY3VybC5oIGFuZCByZW1vdmVkIHRoZQogIG5vdyBvYnNvbGV0ZSAjZGVmaW5lLgoKLSBJZ29yIEtocmlzdG9waG9yb3YgbWFkZSBhIGZpeCB0byBhbGxvdyByZXN1bWVkIGRvd25sb2FkIGZyb20gU3VuJ3MKICBKYXZhV2ViU2VydmVyLzEuMS4xLiBJdCBzZWVtcyB0aGF0IHRoZWlyIHNlcnZlciBzZW5kcyBiYWQgQ29udGVudC1SYW5nZQogIGhlYWRlcnMuCgotIFRoZSBtYWtlZmlsZXMgZm9yY2VkIGEgc3RhdGljIGxpYnJhcnkgYnVpbGQsIHdoaWNoIGlzIGJhZCBzaW5jZSB3ZSBub3cgdXNlCiAgbGlidG9vbCBhbmQgdGh1cyBoYXZlIGV4Y2VsbGVudCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0ISBBbGJlcnQgQ2hpbi1BLVlvdW5nCiAgZm91bmQgb3V0LgoKVmVyc2lvbiA3LjAuMTFiZXRhCgpEYW5pZWwgKDEgQXVndXN0IDIwMDApCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBwb2ludGVkIG91dCB0aGF0ICdtYWtlIGluc3RhbGwnIGRpZCBub3QgcHJvcGVybHkgY3JlYXRlCiAgdGhlIGhlYWRlciBpbmNsdWRlIGRpcmVjdG9yeSwgd2h5IGl0IGZhaWxlZCB0byBpbnN0YWxsIHRoZSBoZWFkZXIgZmlsZXMgYXMKICBpdCBzaG91bGQuIEF1dG9tYWtlIGlzbid0IHJlYWxseSBlcXVpcHBlZCB0byBkZWFsIHdpdGggc3ViZGlyZWN0b3JpZXMKICB3aXRob3V0IE1ha2VmaWxlcyBpbiBhbnkgbmljZSB3YXkuIEkgaGFkIHRvIHJ1biBhaGVhZCBhbmQgYWRkIE1ha2VmaWxlcyBpbgogIGJvdGggaW5jbHVkZSBhbmQgaW5jbHVkZS9jdXJsIGJlZm9yZSBJIG1hbmFnZWQgdG8gY3JlYXRlIGEgdG9wLWxldmVsCiAgbWFrZWZpbGUgdGhhdCBzdWNjZWVkcyBpbiBpbnN0YWxsIGV2ZXJ5dGhpbmcgcHJvcGVybHkhCgotIE9rLCBubyBtb3JlICJmZWF0dXJlcyIgYWRkZWQgbm93LiBMZXQncyBqdXN0IHZlcmlmeSB0aGF0IHRoZXJlJ3Mgbm8gbWFqb3IKICBmbGF3cyBhZGRlZCBub3cuCgpEYW5pZWwgKDMxIEp1bHkgMjAwMCkKLSBCb3RoIEplZmYgU2NoYXNueSBhbmQgS2V0aWwgRnJveW4gYXNrZWQgbWUgaG93IHRvIHRlbGwgY3VybCBub3QgdG8gc2VuZCBvbmUKICBvZiB0aG9zZSBpbnRlcm5hbGx5IGdlbmVyYXRlZCBoZWFkZXJzLiBUaGV5IGRpZG4ndCBzZXR0bGUgd2l0aCB0aGUgYmxhbmsKICBvbmVzIHlvdSBjb3VsZCB0ZWxsIGN1cmwgdG8gdXNlLiBJIHJld3JvdGUgdGhlIGhlYWRlci1yZXBsYWNlIHN0dWZmIGEKICBsaXR0bGUuIE5vdywgaWYgeW91IHJlcGxhY2UgYW4gaW50ZXJuYWwgaGVhZGVyIHdpdGggeW91ciBvd24gYW5kIHRoYXQgbmV3CiAgb25lIGlzIGEgYmxhbmsgaGVhZGVyIHlvdSB3aWxsIG9ubHkgcmVtb3ZlIHRoZSBpbnRlcm5hbCBvbmUgYW5kIG5vdCBnZXQgYW55CiAgYmxhbmsuIEkgY291bGRuJ3QgZmlndXJlIG91dCBhbnkgY2FzZSB3aGVuIHlvdSB3YW50IHRoYXQgYmxhbmsgaGVhZGVyLgoKRGFuaWVsICgyOSBKdWx5IDIwMDApCi0gSXQgc3RydWNrIG1lIHRoYXQgdGhlIGxpYiB1c2VkIGxvY2FsdGltZSgpIHdoaWNoIGlzIG5vdCB0aHJlYWQtc2FmZSwgc28gbm93CiAgSSB1c2UgbG9jYWx0aW1lX3IoKSBpbiB0aGUgc3lzdGVtcyB0aGF0IGhhcyBpdC4KCi0gSSB3ZW50IHRocm91Z2ggdGhpcyBlbnRpcmUgZG9jdW1lbnQgYW5kIHJlbW92ZWQgYWxsIGVtYWlsIGFkZHJlc3NlcyBhbmQgbGVmdAogIG5hbWVzIG9ubHkuIEkndmUgcmVhbGx5IG1hZGUgYW4gZWZmb3J0IHRvIGFsd2F5cyBub3RlIHdobyBicm91Z2h0IGJlIGJ1ZwogIHJlcG9ydHMgb3IgZml4ZXMsIGJ1dCBtb3JlIGFuZCBtb3JlIHBlb3BsZSBhc2sgbWUgdG8gcmVtb3ZlIHRoZSBlbWFpbAogIGFkZHJlc3NlcyBzaW5jZSB0aGV5IGJlY29tZSB2aWN0aW1zIGZvciBzcGFtcyB0aGlzIHdheS4gR29yZG9uIEJlYXRvbiBnb3QgbWUKICB3b3JraW5nIG9uIHRoaXMuCgpEYW5pZWwgKDI3IEp1bHkgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGZvdW5kIG91dCB0aGF0IHdoZW4geW91IHNwZWNpZmllZCBhIEhUVFAgcHJveHkgaW4gYW4KICBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgdXNlZCAtTCwgY3VybCBmYWlsZWQgaW4gdGhlIHNlY29uZCBmZXRjaC4gSQogIGNvcnJlY3RlZCB0aGlzIHByb2JsZW0gYW5kIHBvc3RlZCBhIHBhdGNoIHRvIHRoZSBsaXN0LiBObyBuZWVkIGZvciBhbiBleHRyYQogIGJldGEgcmVsZWFzZSBqdXN0IGZvciB0aGlzLgoKVmVyc2lvbiA3LjAuMTBiZXRhCgpEYW5pZWwgKDI3IEp1bHkgMjAwMCkKLSBTbywgbGlidG9vbCByZXBsYWNlZCB0d28gb2YgbXkgZmlsZXMgd2l0aCBzeW1ib2xpYyBsaW5rcyBhbmQgSSBmb3Jnb3QgdG8gYWRkCiAgdGhlIHR3byBuZXcgbGlidG9vbCBmaWxlcyB0byB0aGUgcmVsZWFzZSBhcmNoaXZlIChhbmQgdGhleSB3ZXJlIGFkZGVkIGFzCiAgc3ltbGlua3MgYXMgd2VsbCEpIFRoaXMgb2YgY291cnNlIGxlYWQgdG8gdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBmYWlsZWQKICBvbiA3LjAuOS4uLgoKVmVyc2lvbiA3LjAuOWJldGEKCkRhbmllbCAoMjUgSnVseSAyMDAwKQotIEtyaXN0aWFuIEv2aG50b3BwIDxrcmlzIGF0IGtvZWhudG9wcC5kZT4gYnJvdWdodCBhIGZpeCB0aGF0IG1ha2VzIGxpYmN1cmwKICBsaWJ0b29saWZpZWQsIGp1c3QgYXMgd2UndmUgd2FudGVkIGZvciBhIHdoaWxlIG5vdy4gSGUgYWxzbyBtYWRlIHRoZQogIHJlY2VudGx5IGFkZGVkIG1hbiBwYWdlcyBnZXQgaW5zdGFsbGVkIHByb3Blcmx5IG9uICdtYWtlIGluc3RhbGwnIGFuZCBzb21lCiAgb3RoZXIgbmljZSBjbGVhbnVwcy4KCi0gSW4gYSBkaXNjdXNzaW9uIHdpdGggRWV0dSBPamFuZW4gaXQgc3RydWNrIG1lIHRoYXQgaWYgd2UgdXNlIGN1cmwgdG8gZ2V0IGEKICBwYWdlIHVzaW5nIGEgcGFzc3dvcmQsIGFuZCB0aGF0IHBhZ2UgdGhlbiBzZW5kcyBhIExvY2F0aW9uOiB0byBhbm90aGVyCiAgc2VydmVyIHRoYXQgY3VybCBmb2xsb3dzLCBjdXJsIHdpbGwgc2VuZCB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGF0CiAgc2VydmVyIGFzIHdlbGwuCgogIE5vdywgSSdsbCBuZXZlciBiZSBhYmxlIHRvIG1ha2UgY3VybCBkbyBMb2NhdGlvbjogZm9sbG93aW5nIGFsbCB0aGF0IHBlcmZlY3QKICBhbmQgeW91J3JlIGFsbCBzb29uZXIgb3IgbGF0ZXIgcmVxdWlyZWQgdG8gd3JpdGUgYSBzY3JpcHQgdG8gZG8gc2V2ZXJhbAogIGZldGNoZXMgd2hlbiB5b3UncmUgZG9pbmcgYWR2YW5jZWQgc3R1ZmYsIGJ1dCBub3cgSSd2ZSBtb2RpZmllZCBjdXJsIHRvIGF0CiAgbGVhc3QgKm9ubHkqIHNlbmQgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhlIG9yaWdpbmFsIHNlcnZlci4gV2hpY2gKICBtZWFucyB0aGF0IGlmIGdldCBhIHBhZ2UgZnJvbSBzZXJ2ZXIgQSB3aXRoIGEgcGFzc3dvcmQsIHRoYXQgZm9yd2FyZHMgY3VybAogIHRvIHNlcnZlciBCLCBjdXJsIHdvbid0IHVzZSB0aGUgcGFzc3dvcmQgdGhlcmUuIElmIHNlcnZlciBCIHRoZW4gZm9yd2FyZHMKICBjdXJsIGJhY2sgdG8gc2VydmVyIEEgYWdhaW4sIHRoZSBwYXNzd29yZCB3aWxsIGJlIHVzZWQgYWdhaW4uCgogIFRoaXMgaXMgbm90IGEgcGVyZmVjdCBpbXBsZW1lbnRhdGlvbiwgYXMgaW4gYSBicm93c2VyIGNhc2UgaXQgd291bGQgb25seSB1c2UKICB0aGUgcGFzc3dvcmQgaWYgdGhlIGxlZnQtcHJlZml4IG9mIHRoZSBmaXJzdCBwYXRoIGlzIHRoZSBzYW1lLiBJIGp1c3QgdGhpbmsKICB0aGF0IHRoaXMgZml4IHByZXZlbnRzIGEgc29tZXdoYXQgbHVya3kgInNlY3VyaXR5IGhvbGUiLgoKICBBcyBhIHNpZGUtbm90ZSBpbiB0aGlzIHN1YmplY3Q6IEhUVFAgcGFzc3dvcmRzIGFyZSBzZW50IGluIGNsZWFydGV4dCBhbmQKICB3aWxsIG5ldmVyIGJlIGNvbnNpZGVyZWQgdG8gYmUgc2FmZSBvciBzZWN1cmUuIFVzZSBIVFRQUyBmb3IgdGhhdC4KCi0gQXMgZGlzY3Vzc2VkIG9uIHRoZSBtYWlsaW5nIGxpc3QsIEkgY29udmVydGVkIHRoZSBGVFAgcmVzcG9uc2UgcmVhZGluZwogIGZ1bmN0aW9uIGludG8gdXNpbmcgc2VsZWN0KCkgd2hpY2ggdGhlbiBhbGxvd3MgdGltZW91dHMgKGV2ZW4gdW5kZXIgd2luMzIhKQogIGlmIHRoZSBjb21tYW5kLXJlcGx5IHNlc3Npb24gZ2V0cyB0b28gc2xvdyBvciBkaWVzIGNvbXBsZXRlbHkuIEkgbWFkZSBhCiAgZGVmYXVsdCB0aW1lb3V0IG9uIDM2MDAgc2Vjb25kcyB1bmxlc3MgYW55dGhpbmcgZWxzZSBpcyBzcGVjaWZpZWQsIHNpbmNlIEkKICBkb24ndCB0aGluayBhbnlvbmUgd2FudHMgdG8gd2FpdCBtb3JlIHRoYW4gdGhhdCBmb3IgYSBzaW5nbGUgY2hhcmFjdGVyIHRvCiAgZ2V0IHJlY2VpdmVkLi4uCgotIFRvcnN0ZW4gRm9lcnRzY2ggPHRvcnN0ZW4uZm9lcnRzY2ggYXQgZ214Lm5ldD4gYnJvdWdodCBhIHNldCBvZiBmaXhlcyBmb3IKICB0aGUgcmZjMTg2NyBmb3JtIHBvc3RzLiBIZSBpbnRyb2R1Y2VkICduYW1lPTxmaWxlJyB3aGljaCBicmluZ3MgYSBtZWFucyB0bwogIHN1dXBseSB2ZXJ5IGxhcmdlIHRleHQgY2h1bmtzIHJlYWQgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBuYW1lLiBJdCBkaWZmZXJzIGZyb20KICAnbmFtZT1AZmlsZScgaW4gdGhlIHdheSB0aGF0IHRoaXMgbGF0dGVyIHRoaW5nIGlzIG1hcmtlZCBpbiB0aGUgdXBsb2FkZWQKICBjb250ZW50cyBhcyBhIGZpbGUgdXBsb2FkLCB3aGlsZSB0aGUgZmlyc3QgaXMganVzdCB0ZXh0IChhcyBpbiBhIGlucHV0IG9yCiAgdGV4dGFyZWEgZmllbGQpLiBUb3JzdGVuIGFsc28gY29ycmVjdGVkIGEgYnVnIHRoYXQgd291bGQgaGFwcGVuIGlmIHlvdSB1c2VkCiAgJXMgb3Igc2ltaWxhciBpbiBhIC1GIGZpbGUgbmFtZS4KCi0gQXMgZGlzY292ZXJlZCBieSBOaWNvIEJhZ2d1cyA8Tmljby5CYWdndXMgYXQgbWFpbC5pbmcubmw+LCB3aGVuIHRyYW5zZmVycmluZwogIGZpbGVzIHRvL2Zyb20gRlRQIHVzaW5nIHR5cGUgQVNDSUkgY3VybCBzaG91bGQgbm90IGV4cGVjdCB0aGUgdHJhbnNmZXIgdG8gYmUKICB0aGUgZXhhY3Qgc2l6ZSByZXBvcnRlZCBieSB0aGUgc2VydmVyIGFzIHRoZSBmaWxlIHNpemUuIFNpbmNlIEFTQ0lJIG1heSB2ZXJ5CiAgd2VsbCBtZWFuIHRoYXQgdGhlIGNvbnRlbnQgaXMgdHJhbnNsYXRlZCB3aGlsZSB0cmFuc2ZlcmVkLCB0aGUgZmluYWwgc2l6ZQogIG1heSB2ZXJ5IHdlbGwgZGlmZmVyLiBUaGVyZWZvciwgY3VybCBub3cgaWdub3JlcyB0aGUgZmlsZSBzaXplIHdoZW4gZG9pbmcKICBBU0NJSSB0cmFuc2ZlcnMgaW4gRlRQLgoKRGFuaWVsICgyNCBKdWx5IDIwMDApCi0gQWRkZWQgQ1VSTE9QVF9QUk9YWVBPUlQgdG8gdGhlIGN1cmxfZWFzeV9zZXRvcHQoKSBjYWxsIHRvIGFsbG93IHRoZSBwcm94eQogIHBvcnQgbnVtYmVyIHRvIGJlIHNldCBzZXBhcmF0ZWx5IGZyb20gdGhlIHByb3h5IGhvc3QgbmFtZS4KCi0gQW5kcmV3IDxhbmRyZXcgYXQgdWdoLm5ldC5hdT4gcG9pbnRlZCBvdXQgYSBuZXRyYyBtYW51YWwgYnVnLgoKLSBUaGUgRlRQIHRyYW5zZmVyIGNvZGUgbm93IGFjY2VwdHMgYSAyNTAtY29kZSBhcyB3ZWxsIGFzIHRoZSBwcmV2aW91c2x5CiAgYWNjZXB0ZWQgMjI2LCBhZnRlciBhIHN1Y2Nlc3NmdWwgZmlsZSB0cmFuc2Zlci4gTW9oYW4gPG1uYWlyIGF0CiAgZXZlcmdyZWVuLWZ1bmRzLmNvbT4gcG9pbnRlZCB0aGlzIG91dC4KCi0gVGhlIGNoZWNrIGZvciAqYm90aCogbnNsIGFuZCBzb2NrZXQgd2FzIG5ldmVyIGFkZGVkIGluIHRoZSB2NyBjb25maWd1cmUuaW4KICB3aGVuIEkgbW92ZWQgdGhlIG1haW4gYnJhbmNoLiBJIHJlLWFkZGVkIHRoYXQgY2hlY2sgdG8gY29uZmlndXJlLmluLiBUaGlzIHdhcwogIGRpc2NvdmVyZWQgYnkgUmljaCBHcmF5LgoKLSBIb3dhcmQsIEJsYWlzZSA8QmxhaXNlLkhvd2FyZCBhdCBmYWN0aXZhLmNvbT4gcG9pbnRlZCBvdXQgYSBtaXNzaW5nIGZyZWUoKSBpbgogIGN1cmxfZGlzY29ubmVjdCgpIHdoaWNoIG9mIGNvdXJzZSBtZWFudCBsaWJjdXJsIGF0ZSBtZW1vcnkuCgotIEJyaWFuIEUuIEdhbGxldyBub3RlZCB0aGF0IHRoZSBIVFRQICdIb3N0OicgaGVhZGVyIGN1cmwgc2VudCBkaWQgbm90CiAgcHJvcGVybHkgaW5jbHVkZSB0aGUgcG9ydCBudW1iZXIgaWYgbm9uLWRlZmF1bHQgcG9ydHMgd2VyZSB1c2VkLiBUaGlzIHNob3VsZAogIG5vdyBoYXZlIGJlZW4gZml4ZWQuCgotIEhUVFAgY29ubmVjdCBlcnJvcnMgbm93IHJldHVybiBlcnJvcnMgZWFybGllci4gVGhpcyB3YXMgbW9zdCBub3RhYmx5IGNhdXNpbmcKICBwcm9ibGVtcyB3aGVuIHRoZSBIVFRQUyBjZXJ0aWZpY2F0ZSBoYWQgcHJvYmxlbXMgYW5kIGxhdGVyIGNhdXNlZCBhIGNyYXNoLgogIE1hbnkgdGhhbmtzIHRvIEdyZWdvcnkgTmljaG9sbHMgPGduaWNob2xscyBhdCBsZXZlbDguY29tPiBmb3IgZGlzY292ZXJpbmcKICBhbmQgc3VnZ2VzdGluZyBhIGZpeC4uLgoKRGFuaWVsICgyMSBKdW5lIDIwMDApCi0gQWZ0ZXIgYSAiYnVnIHJlcG9ydCIgSSByZWNlaXZlZCB3aGVyZSB0aGUgdXNlciB3YXMgdXNpbmcgYm90aCAtRiBhbmQgLUkgaW4gYQogIEhUVFAgcmVxdWVzdCAoaXQgc2V2ZXJseSBjb25mdXNlZCB0aGUgbGlicmFyeSBJIHNob3VsZCBhZGQpLCBJIGFkZGVkIHNvbWUKICBjaGVja3MgdG8gc3JjL21haW4uYyB0aGF0IHByZXZlbnRzIHNldHRpbmcgbW9yZSB0aGFuIG9uZSBIVFRQIHJlcXVlc3QKICBjb21tYW5kLCBubyBtYXR0ZXIgd2hhdCB0aGUgdXNlciB3YW50cyEgOy0pCgpWZXJzaW9uIDcuMC44YmV0YQoKRGFuaWVsICgyMCBKdW5lIDIwMDApCi0gSSBkaWQgYSBtYWpvciByZXBsYWNlIGluIG1hbnkgZmlsZXMgdG8gdXNlIHRoZSBuZXcgY3VybCBkb21haW4gaGF4eC5zZQogIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIG9uZS4KCi0gQXMgRWV0dSBPamFuZW4gc3VnZ2VzdGVkLCBJIGZpbmFsbHkgdG9vayB0aGUgc3RlcCBhbmQgbm93IGxpYmN1cmwgbm8gbG9uZ2VyCiAgbWFrZXMgYSBQT1NUIGFmdGVyIGl0IGhhcyBmb2xsb3dlZCBhIGxvY2F0aW9uLiBXaGVuIHRoZSBpbml0aWFsIFBPU1QgaGFzCiAgYmVlbiBkb25lLCBpdCdsbCB0dXJuZWQgaW50byBhIEdFVCBmb3IgdGhlIGZ1cnRoZXIgcmVxdWVzdHMuIFRoaXMgaXMgb25seQogIGludGVyZXN0aW5nIHdoZW4gdXNpbmcgLUwvLS1sb2NhdGlvbiAqYW5kKiBkb2luZyBhIFBPU1QgYXQgdGhlIHNhbWUgdGltZS4KCiAgV2hpbGUgbWVzc2luZyB3aXRoIHRoaXMsIEkgYWRkZWQgYW5vdGhlciB3ZWlyZCBmZWF0dXJlIEkgY2FsbCAnYXV0bwogIHJlZmVyZXInLiBJZiB5b3UgYXBwZW5kICc7YXV0bycgdG8gdGhlIHJpZ2h0IG9mIGEgZ2l2ZW4gcmVmZXJlciBzdHJpbmcgKG9yCiAgb25seSB1c2UgdGhhdCBzdHJpbmcgYXMgcmVmZXJlciksIGxpYmN1cmwgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUKICBwcmV2aW91ZCBVUkwgYXMgcmVmZXJlZCB3aGVuIGl0IGZvbGxvd3MgYSBMb2NhdGlvbjogYW5kIGdldHMgYSBzdWNjZWVkaW5nCiAgZG9jdW1lbnQuCgotIE15IGhlcm8gUmljaCBHcmF5IGZvdW5kIHRoZSB2ZXJ5IG9ic2N1cmUgRlRQIGJ1ZyB0aGF0IGhhcHBlbmVkIHRvIGhpbSBvbmx5CiAgd2hlbiBwYXNzaW5nIHRocm91Z2ggYSBwYXJ0aWN1bGFyIGZpcmV3YWxsIGFuZCB1c2luZyB0aGUgUE9SVCBjb21tYW5kLiBJdAogIHR1cm5lZCBvdXQgdGhhdCBQT1JUIHdhcyB0aGUgb25seSBjb21tYW5kIGluIHRoZSBsaWIvZnRwLmMgc291cmNlIHRoYXQKICBkaWRuJ3Qgc2VuZCBhIHByb3BlciBcclxuIHNlcXVlbmNlIGJ1dCBpbnN0ZWFkIHVzZWQgdGhlIGZhdWx0eSBcbiB3aGljaCBhcwogIGl0IHNlZW1lZCBpcyBzdXBwb3J0ZWQgYnkgbW9zdCBtYWpvciBmdHAgc2VydmVycy4uLiA6LU8KClZlcnNpb24gNy4wLjdiZXRhCgpEYW5pZWwgKDE2IEp1bmUgMjAwMCkKLSBJIGhhZCBhdm9pZGVkIHRoaXMgbG9uZyBlbm91Z2ggbm93LCBzbyBJIG1vdmVkIHRoZSBhbHRlcm5hdGl2ZSBwcm9ncmVzcyBiYXIKICBzdHVmZiBmcm9tIHRoZSBsaWIgYW5kIGFkZGVkIGl0IHRvIHRoZSBjbGllbnQgY29kZS4gVGhpcyBpcyBub3cgdXNpbmcgdGhlCiAgcmVjZW50bHkgYWRkZWQgcHJvZ3Jlc3MgY2FsbGJhY2sgYW5kIGl0IHNlZW1zIHRvIHdvcmsgcHJldHR5IG11Y2ggbGlrZQogIGJlZm9yZS4gU2luY2UgaXQgaXMgb25seSBvbmUgcHJvZ3Jlc3MgYmFyIGFuZCB5b3UgYW5kIGRvd25sb2FkIGFuZCB1cGxvYWQgYXQKICB0aGUgc2FtZSB0aW1lLCB0aGlzIGJhciBzaG93cyB0aGUgY29tYmluZWQgcHJvZ3Jlc3Mgb2YgYm90aCBkaXJlY3Rpb25zLiBUaGlzCiAgY29kZSB3YXMganVzdCBwb3J0ZWQgZnJvbSB0aGUgb2xkIHBsYWNlIHRvIHRoaXMsIExhcnMgaXMgc3RpbGwgb3VyIHNhdmlvdXIhCiAgOy0pIFRoaXMgYWxzbyBtYWRlIHRoZSBkb2N1bWVudGF0aW9uIG1vcmUgYWNjdXJhdGUgc2luY2UgSSBuZXZlciByZW1vdmVkCiAgdGhpcyBmdW5jdGlvbiBmcm9tIGFueSBkb2NzISBBbHRob3VnaCBJIG5vdyByZW1vdmVkIHRoZSBDVVJMT1BUX1BST0dSRVNTTU9ERQogIGZyb20gdGhlIGxpYnJhcnkgc2luY2UgdGhlIGxpYiBoYXMgb25seSBvbmUgaW50ZXJuYWwgcHJvZ3Jlc3MgbWV0ZXIgYW5kIGl0CiAgd2lsbCBuZXZlciBnZXQgYW5vdGhlci4gSXQgaXMgYWx0aG91Z2ggbGlrZWx5IHRoYXQgdGhlIGludGVybmFsIG9uZSBhbHNvCiAgd2lsbCBiZSBtb3ZlZCB0byB0aGUgY2xpZW50IGNvZGUgaW4gdGhlIGZ1dHVyZSAod2hlbiBJIGhhdmUgb3RoZXIgbWVhbnMgb2YKICBnZXR0aW5nIHRoZSB3cml0ZW91dCBkYXRhIGFuZCBtb3ZlIHRoYXQgdG9vIHRvIHRoZSBjbGllbnQpLgoKLSBJIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvIHZlcmlmeSB0aGF0IHN0YW5kYXJkIHByb2dyZXNzIG1ldGVyIHdvcmtzIGFuZCBJCiAgZm91bmQgb3V0IGl0IGRpZG4ndCBnZXQgaW5pdGVkIHByb3Blcmx5LiBHcnJyLiBJIGNvcnJlY3RlZCB0aGF0IGFzIHdlbGwuCgpEYW5pZWwgKDE1IEp1bmUgMjAwMCkKLSBJIHRob3VnaHQgSSdkIGJldHRlciB2ZXJpZnkgdGhhdCB0aGUgLUYgb3B0aW9uIHN0aWxsIHdvcmtzIGluIHY3IGFuZCBvZgogIGNvdXJzZSBpdCBkaWRuJ3QuLi4gOi0vIEFueXdheSwgSSBoYWQgdGhlIHByb2JsZW1zIEkgY291bGQgZGlzY292ZXIKICBjb3JyZWN0ZWQuIEFib3V0IG9uZSBtb250aCBvZiBiZXRhIHRlc3RpbmcgYW5kIG5vdCBhIHNpbmdsZSBwZXJzb24gaGFzIHVzZWQKICB0aGlzIGZlYXR1cmUgd2l0aCB2Nz8KCi0gQmr2cm4gY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgdGhlIC0tcHJvZ3Jlc3MtYmFyIHN0aWxsIGRvZXNuJ3Qgd29yayBpbgogIHY3LiBIbS4KCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIFRpbSBUYXNzb25pcyBkaXNjb3ZlcmVkIHRoYXQgY3VybCA3IGRpZG4ndCBoYW5kbGUgbm9ybWFsIGh0dHAgUE9TVCBhcyBpdAogIHNob3VsZC4gSSBjb3JyZWN0ZWQgdGhpcy4KClZlcnNpb24gNy4wLjZiZXRhCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBCavZybiBTdGVuYmVyZyBwb2ludGVkIG91dCBzZXZlcmFsIHByb2JsZW1zIChyZWxhdGVkIHRvIHdpbjMyIGNvbXBpbGluZyk6CiAgbGliL3N0cmVxdWFsLmMgaGFkIGEgYmFkICNpZmRlZiBmb3Igb25lIG9mIHRoZSBzdHJpbmcgY29tcGFyaXNvbnMgKHdpbjMyKQogIHNyYy9tYWluLmMgaGFkIHNldmVyYWwgbWlub3IgcHJvYmxlbXMKICBsaWIvbWFrZWZpbGUubTMyIGhhZCBnZXRwYXNzLltjb10gdHdpY2UKICBzcmMvY29uZmlnLXdpbjMyLmggbGFja2VkIHRoZSBIQVZFX0ZDTlRMX0ggZGVmaW5lCiAgYm90aCBjb25maWctd2luMzIuaCBmaWxlcyBub3cgb25seSBzZXQgdGhlIEhBVkVfVU5JU1REX0ggZGVmaW5lIGlmIHRoZQogIGRlZmluZSBNSU5HVzMyIGlzIHNldCwgYW5kIEkgbW9kaWZpZWQgc3JjL21ha2VmaWxlLm0zMiBhbmQgbGliL21ha2VmaWxlLm0zMgogIHRvIHNldCBpdC4KClZlcnNpb24gNy4wLjViZXRhCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBBcHBsaWVkIEx1b25nIERpbmggRHVuZydzIGNvbW1lbnRzIGFib3V0IGEgZmV3IHdpbjMyIGNvbXBpbGUgcHJvYmxlbXMuCgotIEFwcGxpZWQgQmr2cm4gU3RlbmJlcmcncyBzdWdnZXN0ZWQgZml4IHRoYXQgdHVybnMgdGhlIHdpbjMyIHN0ZG91dCB0bwogIGJpbmFyeS4gSXQgd29uJ3QgZG8gaXQgaWYgdGhlIC1CIC8gLS11c2UtYXNjaWkgb3B0aW9uIGlzIHVzZWQuIFRoYXQgb3B0aW9uCiAgaXMgbm93IGFuIGV4dGVuZGVkIHZlcnNpb24gb2YgdGhlIHByZXZpb3VzIC1CIC8tLWZ0cC0tYXNjaWkuIFRoZSBmbGFnIHdhcwogIGFscmVhZHkgaW4gdXNlIGJlIHRoZSBsZGFwIGFzIHdlbGwgc28gdGhlIG5ldyBuYW1lIGZpdHMgcHJldHR5IGdvb2QuIFRoZQogIGxpYmN5cmwgQ1VSTE9QVF9UUkFOU0ZFUlRFWFQgd2FzIGFsc28gaW50cm9kdWNlZCBhcyBhbiBhbGlhcyB0byB0aGUgbm93CiAgb2Jzb2xldGUgQ1VSTE9QVF9GVFBBU0NJSS4gQ2FuJ3QgdmVyaWZ5IHRoaXMgZml4IG15c2VsZiBhcyBJIGhhdmUgbm8gd2luMzIKICBjb21waWxlciBhcm91bmQuCgpEYW5pZWwgKDEzIEp1bmUgMjAwMCkKLSBMdW9uZyBEaW5oIER1bmcgPGR1bmcgYXQgc2NoLmJtZS5odT4gZm91bmQgYSBwcm9ibGVtIGluIGN1cmxfZWFzeV9jbGVhbnVwKCkKICBzaW5jZSBpdCBmcmVlKCllZCB0aGUgbWFpbiBjdXJsIHN0cnVjdCAqdHdpY2UqLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgpEYW5pZWwgKDkgSnVuZSAyMDAwKQotIFVwZGF0ZWQgdGhlIFJFU09VUkNFUyBmaWxlLCBhZGRlZCBhIFJFQURNRS53aW4zMiBmaWxlLgoKRGFuaWVsICg4IEp1bmUgMjAwMCkKLSBTbyBJIGZpbmFsbHkgYWRkZWQgdGhlIHByb2dyZXNzIGNhbGxiYWNrIHRvIHRoZSAqc2V0b3B0KCkgb3B0aW9ucyBhbmQgaXQKICBzaG91bGQgd29yayBub3cuIEkgZG9uJ3QgaGF2ZSB0aGUgZW5lcmd5IHRvIHdyaXRlIGFueSB0ZXN0IHByb2dyYW0gZm9yIGl0CiAgcmlnaHQgbm93LgotIE1hZGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHR5cGVkZWZzIHB1YmxpYyBpbiBjdXJsL2N1cmwuaCBmb3IgY29tZm9ydC4gSnVzdAogIGluIGNhc2UgYW55b25lIHdhbm5hIGZpZGRsZSB3aXRoIHN1Y2ggcG9pbnRlcnMuCi0gVXBkYXRlZCB0aGUgY3VybF9lYXN5X3NldG9wdCgpIG1hbiBwYWdlIGFjY29yZGluZ2x5LgoKVmVyc2lvbiA3LjAuNGJldGEKCkRhbmllbCAoMiBKdW5lIDIwMDApCi0gSSBub3RpY2VkIHRoYXQgd2hlbiBkb2luZyBMb2NhdGlvbjogZm9sbG93aW5nLCB3ZSBsb3N0IGN1c3RvbSBoZWFkZXJzIGluIGFsbAogIGJ1dCB0aGUgZmlyc3QgcmVxdWVzdC4KLSBSZW1vdmVkIHRoZSAnSHR0cFBvc3QnIHN0cnVjdCBhbmQgbW92ZWQgdGhlIGhlYWRlciBzdHVmZiB0byB0aGUgbW9yZSBnZW5lcmljCiAgY3VybF9zbGlzdC4KLSBBZGRlZCBzb21lIGJldHRlciBzbGlzdC1jbGVhbnVwcyBpbiBzcmMvbWFpbi5jCgpWZXJzaW9uIDcuMC4zYmV0YQoKRGFuaWVsICgzMSBNYXkgMjAwMCkKLSBTbyBJIGRpc2NvdmVyZWQgdGhhdCBJIHJlbGVhc2VkIHRoZSA3LjAuMmJldGEgd2l0aG91dCBpdCBiZWluZyBhYmxlIHRvCiAgY29tcGlsZSB1bmRlciBMaW51eC4gZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIGdldGhvc3RieWFkZHJfcigpIHR1cm5lZCBvdXQgdG8KICBmZWF0dXJlIGEgZGlmZmVyZW50IGFtb3VudCBvZiBhcmd1bWVudHMgb24gZGlmZmVyZW50IHN5c3RlbXMgc28gSSBoYWQgdG8gYWRkCiAgYSBjb25maWd1cmUgY2hlY2sgZm9yIHRoaXMgYW5kIGFkanVzdCB0aGUgY29kZSBzbGlnaHRseS4KClZlcnNpb24gNy4wLjJiZXRhCgpEYW5pZWwgKDI5IE1heSAyMDAwKQotIENvcnJlY3RlZCB0aGUgYml0cy4qIGFzc2lnbm1lbnRzIHdoZW4gdXNpbmcgQ1VSTE9QVCBvcHRpb25zIHRoYXQgb25seQogIHRvZ2dsZXMgb25lIG9mIHRob3NlIGJpdHMuCgotIEFwcGxpZWQgdGhlIGh1Z2UgcGF0Y2hlcyBmcm9tIERhdmlkIExlQmxhbmMgPGRsZWJsYW5jIGF0IHFueC5jb20+IHRoYXQgYWRkCiAgdXNhZ2Ugb2YgdGhlIGdldGhvc3RieW5hbWVfcigpIGFuZCBzaW1pbGFyIGZ1bmN0aW9ucyBpbiBjYXNlIHRoZXkncmUgYXJvdW5kLAogIHNpbmNlIHRoYXQgbWFrZSBsaWJjdXJsIG11Y2ggYmV0dGVyIHRocmVhZHNhZmUgaW4gbWFueSBzeXN0ZW1zIChzdWNoIGFzCiAgc29sYXJpcykuIEkgYWRkZWQgdGhlIGNoZWNrcyBmb3IgdGhlc2UgZnVuY3Rpb25zIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKICBJIGNhbid0IGV4cGxhaW4gd2h5LCBidXQgdGhlIGluZXRfbnRvYV9yKCkgZnVuY3Rpb24gZGlkIG5vdCBhcHBlYXIgaW4gbXkKICBTb2xhcmlzIGluY2x1ZGUgZmlsZXMsIEkgaGFkIHRvIGFkZCBteSBvd24gaW5jbHVkZSBmaWxlIGZvciB0aGlzIGZvciBub3cuCgpEYW5pZWwgKDIyIE1heSAyMDAwKQotIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBmaXhlcyB0byBtYWtlIHRoZSB3aW4zMiB2ZXJzaW9uIGNvbXBpbGUgcHJvcGVybHkgYXMKICB3ZWxsIGFzIGEgcmVuYW1lIG9mIHRoZSAnaW50ZXJmYWNlJyBmaWVsZCBpbiB0aGUgdXJsZGF0YSBzdHJ1Y3QsIGFzIGl0IHNlZW1zCiAgdG8gYmUgcmVzZXJ2ZWQgaW4gc29tZSBnY2MgdmVyc2lvbnMhCgotIFJpY2ggR3JheSBzdHJ1Y2sgYmFjayB3aXRoIHlldCBzb21lIHBvcnRhYmlsaXR5IHJlcG9ydHMuIERhdGEgR2VuZXJhbCBERy9VWAogIG5lZWRlZCBhIGxpdHRsZSBmaXggaW4gbGliL2xkYXAuYyBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgUlRMRF9HTE9CQUwgZGVmaW5lZC4KICBNb3JlIGZpeGVzIGFyZSBleHBlY3RlZCBhcyBhIHJlc3VsdCBvZiBSaWNoaWVzIHZlcnkgaGVscGZ1bCB3b3JrLgoKVmVyc2lvbiA3LjAuMWJldGEKCkRhbmllbCAoMjEgTWF5IDIwMDApCi0gVXBkYXRlZCBsb3RzIG9mICNkZWZpbmVzLCBlbnVtcyBhbmQgdmFyaWFibGUgdHlwZSBuYW1lcyBpbiB0aGUgbGlicmFyeS4gTm8KICBtb3JlIHdlaXJkIFVSRyBvciBVUkxUQUcgcHJlZml4ZXMuIEFsbCB0eXBlcyBhbmQgbmFtZXMgc2hvdWxkIGJlIGN1cmwtCiAgcHJlZml4ZWQgdG8gYXZvaWQgbmFtZSBzcGFjZSBjbGFzaGVzLiBUaGUgRkxBR1MtcGFyYW1ldGVyIHRvIHRoZSBmb3JtZXIKICBjdXJsX3VybGdldCgpIGhhcyBiZWVuIGNvbnZlcnRlZCBpbnRvIGEgYnVuY2ggb2YgZmxhZ3MgdG8gdXNlIGluIHNlcGFyYXRlCiAgc2V0b3B0IGNhbGxzLiBJJ20gc3RpbGwgZm9jdXNpbmcgb24gdGhlIGVhc3ktaW50ZXJmYWNlLCBhcyB0aGUgY3VybCB0b29sIGlzCiAgbm93IHVzaW5nIHRoYXQuCgotIEJqb3JuIFJlZXNlIGhhcyBwcm92aWRlZCBtZSB3aXRoIGFuIGFzeW5jaHJvbm91cyBuYW1lIHJlc29sdmVyIHRoYXQgSSBwbGFuCiAgdG8gdXNlIGluIHVwY29taW5nIHZlcnNpb25zIG9mIGN1cmwgdG8gYmUgYWJsZSB0byBncmFjZWZ1bGx5IHRpbWVvdXQgbmFtZQogIGxvb2t1cHMuCgpWZXJzaW9uIDcuMGJldGEKCkRhbmllbCAoMTggTWF5IDIwMDApCi0gSW50cm9kdWNlZCBMSUJDVVJMX1ZFUlNJT05fTlVNIHRvIHRoZSBjdXJsLmggaW5jbHVkZSBmaWxlIHRvIGJldHRlciBhbGxvdwogIHNvdXJjZSBjb2RlcyB0byBiZSBkZXBlbmRlbnQgb24gdGhlIGxpYiB2ZXJzaW9uLiBUaGlzIGRlZmluZSBpcyBub3cgc2V0IHRvCiAgYSBkZXhhZGVjaW1hbCBudW1iZXIsIHdpdGggOCBiaXRzIGVhY2ggZm9yIG1ham9yIG51bWJlciwgbWlub3IgbnVtYmVyIGFuZAogIHBhdGNoIG51bWJlci4gSW4gb3RoZXIgd29yZHMsIHZlcnNpb24gMS4yLjMgd291bGQgbWFrZSBpdCAweDAxMDIwMy4gSXQgYWxzbwogIG1ha2VzIGEgbGFyZ2VyIG51bWJlciBhIG5ld2VyIHZlcnNpb24uCgpEYW5pZWwgKDE3IE1heSAyMDAwKQotIE1hcnRpbiBLYW1tZXJob2ZlciBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgc2V2ZXJhbCBmbGF3cyBpbiB0aGUgRlRQIHJhbmdlCiAgb3B0aW9uLiBJIGNvcnJlY3RlZCB0aGVtLgotIFJlbW92ZWQgdGhlIHdpbjMyIHdpbnNvY2sgaW5pdCBjcmFwIGZyb20gdGhlIGxpYiB0byB0aGUgc3JjL21haW4uYyBmaWxlCiAgaW4gdGhlIGFwcGxpY2F0aW9uIGluc3RlYWQuIFRoZXkgY2FuJ3QgYmUgaW4gdGhlIGxpYiwgZXNwZWNpYWxseSBub3QgZm9yCiAgbXVsdGl0aHJlYWRlZCBwdXJwb3Nlcy4KCkRhbmllbCAoMTYgTWF5IDIwMDApCi0gUmV3cm90ZSB0aGUgc3JjL21haW4uYyBzb3VyY2UgdG8gdXNlIHRoZSBuZXcgZWFzeS1pbnRlcmZhY2UgdG8gbGliY3VybCA3LgogIFRoZXJlIGlzIHN0aWxsIG1vcmUgd29yayB0byBkbywgYnV0IHRoZSBmaXJzdCBzdGVwIGlzIG5vdyB0YWtlbi4KICA8Y3VybC9lYXN5Lmg+IGlzIHRoZSBpbmNsdWRlIGZpbGUgdG8gdXNlLgoKRGFuaWVsICgxNCBNYXkgMjAwMCkKLSBGVFAgVVJMcyBhcmUgbm93IHRyZWF0ZWQgc2xpZ2h0bHkgZGlmZmVyZW50LCBtb3JlIGFjY29yZGluZyB0byBSRkMgMTczOC4KLSBGVFAgc2Vzc2lvbnMgYXJlIG5vdyBwZXJmb3JtZWQgZGlmZmVyZW50bHksIHdpdGggQ1dEIGNvbW1hbmRzIHRvIGNoYW5nZQogIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIFJFVFIvU1RPUi9MSVNUIHdpdGggdGhlIGZ1bGwgcGF0aC4gRGlzY3Vzc2lvbnMgd2l0aAogIFJpY2ggR3JheSBtYWRlIG1lIG5vdGljZSB0aGVzZSBwcm9ibGVtcy4KLSBKYW5uZSBKb2hhbnNzb24gZGlzY292ZXJlZCBhbmQgY29ycmVjdGVkIGEgYnVmZmVyIG92ZXJmbG93IGluIHRoZQogIHNyYy91c3JnbG9iLmMgZmlsZS4KLSBJIGhhZCB0byBhZGQgYSBsaWIvc3RyZXF1YWwuYyBmaWxlIGZvciBkb2luZyBjYXNlIGluc2Vuc2l0aXZlIHN0cmluZwogIGNvbXBhcmVzIG9uIGFsbCBwbGF0Zm9ybXMuCgpEYW5pZWwgKDggTWF5IDIwMDApOgotIEJlZW4gd29ya2luZyBsb3RzIG9uIHRoZSBuZXcgbGliLgotIFRvZ2V0aGVyIHdpdGggUmljaCBHcmF5LCBJJ3ZlIHRyaWVkIHRvIGFkanVzdCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB3b3JrCiAgYmV0dGVyIG9uIHRoZSBOQ1IgTVAtUkFTIFVuaXguCgpEYW5pZWwgKDIgTWF5IDIwMDApOgotIEFsYmVydCBDaGluLUEtWW91bmcgcG9pbnRlZCBvdXQgdGhhdCBJIGhhZCBhIGZldyB0b28gbWFueSBpbnN0cnVjdGlvbnMgaW4KICBjb25maWd1cmUuaW4gdGhhdCBkaWRuJ3QgZG8gYW55IGdvb2QuCgpEYW5pZWwgKDI0IEFwcmlsIDIwMDApOgotIEFkZGVkIGEgbmV3IHBhcmFncmFwaCB0byB0aGUgRkFRIGFib3V0IHdoYXQgdG8gZG8gd2hlbiBjb25maWd1cmUgY2FuJ3QKICBmaW5kIE9wZW5TU0wgZXZlbiB0aG91Z2ggaXQgaXMgaW5zdGFsbGVkLiBTdXBwbGllZCBieSBCb2IgQWxsaXNvbgoKRGFuaWVsICgxMiBBcHJpbCAyMDAwKToKLSBTdGFydGVkIG1lc3NpbmcgYXJvdW5kIGJpZy10aW1lIHRvIGNvbnZlcnQgdGhlIG9sZCBsaWJyYXJ5IGludGVyZmFjZSB0byBhCiAgYmV0dGVyIG9uZS4uLgoKRGFuaWVsICg4IEFwcmlsIDIwMDApOgotIE1hZGUgdGhlIHByb2dyZXNzIGJhciBsb29rIGJldHRlciBmb3IgZmlsZSBzaXplcyBiZXR3ZWVuIDk5OTkga2lsb2J5dGVzCiAgYW5kIDEwMCBtZWdhYnl0ZXMuIFRoZXkncmUgbm93IGRpc3BsYXllZCBYWC5YTS4KLSBJIGFsc28gbm90aWNlZCB0aGF0IGZ0cCBmZXRjaGVzIHRocm91Z2ggSFRUUCBwcm94aWVzIGRpZG4ndCBhZGQgdGhlIHVzZXIKICBhZ2VudCBzdHJpbmcuIEl0IGRvZXMgbm93LgotIEhhYmliaWUgPGhhYmliaWUgYXQgTWFpbGFuZE5ld3MuY29tPiBzdXBwbGllZCBhIHByZXR0eSBnb29kIHdheSB0byBidWlsZCBSUE1zCiAgb24gYSBMaW51eCBtYWNoaW5lLiBJdCBzdGlsbCBhKSByZXF1aXJlcyBtZSB0byBiZSByb290IHRvIGRvIGl0LCBiKSBsZWF2ZXMKICB0aGUgcnBtIHBhY2thZ2VzIGxheWluZyBhdCBzb21lIG9kZCBwbGFjZSBvbiBteSBkaXNrIGMpIGRvZXNuJ3Qgd29yayB0bwogIGJ1aWxkIHRoZSBzc2wgdmVyc2lvbiBvZiBjdXJsIHNpbmNlIEkgZGlkbid0IGluc3RhbGwgb3BlbnNzbCBmcm9tIGFuIHJwbQogIHBhY2thZ2Ugc28gbm93IHRoZSBycG0gY3JhcCB0aGlua3MgSSBkb24ndCBoYXZlIG9wZW5zc2wgYW5kIHJlZnVzZXMgdG8gYnVpbGQKICBhIHBhY2thZ2UgdGhhdCBkZXBlbmRzIG9uIHNzbC4uLiBEaWQgSSBtZW50aW9uIEkgZG9uJ3QgZ2V0IGFsb25nIHdpdGggUlBNPwotIE9uY2UgYWdhaW4gSSByZWNlaXZlZCBhIGJ1ZyByZXBvcnQgYWJvdXQgYXV0b2NvbmYgbm90IHNldHRpbmcgLUwgcHJpb3IgdG8gLWwKICBvbiB0aGUgY29tbWFuZCBsaW5lIHdoZW4gY2hlY2tpbmcgZm9yIGxpYnMuIEluIHRoaXMgY2FzZSBpdCBtYWRlIHRoZSBuYXRpdmUKICBjYyBjb21waWxlciBvbiBTb2xhcmlzIDcgdG8gZmFpbCB0aGUgT3BlblNTTCBjaGVjay4gVGhpcyBoYXMgcHJldmlvdXNseSBiZWVuCiAgcmVwb3J0ZWQgdG8gY2F1c2UgcHJvYmxlbXMgb24gSFAtVVggYW5kIGlzIGEga25vd24gZmxhdyBpbiBhdXRvY29uZiAyLjEzLiBJdAogIGlzIGEgcGl0eSB0aGVyZSdzIG5vIG5ld2VyIHJlbGVhc2UgYXJvdW5kLi4uCgpEYW5pZWwgKDQgQXByaWwgMjAwMCk6Ci0gTWFyY28gRy4gU2FsdmFnbm8gc3VwcGxpZWQgbWUgd2l0aCB0d28gZml4ZXMgdGhhdAogIGFwcGVhcmFudGx5IG1ha2VzIHRoZSBPUy8yIHBvcnQgd29yayBiZXR0ZXIgd2l0aCBtdWx0aXBsZSBVUkxzLgoKRGFuaWVsICgyIEFwcmlsIDIwMDApOgotIEFub3RoZXIgTG9jYXRpb246IGZpeC4gVGhpcyB0aW1lLCB3aGVuIGN1cmwgY29ubmVjdGVkIHRvIGEgcG9ydCBhbmQgdGhlbgogIGZvbGxvd2VkIGEgbG9jYXRpb24gd2l0aCBhbiBhYnNvbHV0ZSBVUkwgdG8gYW5vdGhlciBwb3J0LCBpdCBtaXNiZWhhdmVkLgoKRGFuaWVsICgyNyBNYXJjaCAyMDAwKToKLSBILiBEYXBobmUgTHVvbmcgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHdhcyB3cm9uZ2x5CiAgbWVzc2luZyB1cCB0aGUgcHJveHkgc3RyaW5nIHdoZW4gZmV0Y2hpbmcgYSBkb2N1bWVudCB0aHJvdWdoIGEgaHR0cCBwcm94eSwKICB3aGljaCBzY3Jld2VkIHVwIG11bHRpcGxlIGZldGNoZXMgc3VjaCBhcyBpbiBsb2NhdGlvbjogZm9sbG93aW5ncy4KCkRhbmllbCAoMjMgTWFyY2ggMjAwMCk6Ci0gTWFyY28gRy4gU2FsdmFnbm8gY29ycmVjdGVkIG15IGJhZGx5IGFwcGxpZWQgcGF0Y2ggaGUKICBhY3R1YWxseSBhbHJlYWR5IHRvbGQgbWUgYWJvdXQhCgotIEguIERhcGhuZSBMdW9uZyBicm91Z2h0IG1lIGEgZml4IHRoYXQgbm93IG1ha2VzIGN1cmwKICBpZ25vcmUgc2VsZWN0KCkgZXJyb3JzIGluIHRoZSBkb3dubG9hZCBpZiBlcnJubyBpcyBFSU5UUiwgd2hpY2ggdHVybnMgb3V0IHRvCiAgaGFwcGVuIGV2ZXJ5IG5vdyBhbmQgdGhlbiB3aGVuIHVzaW5nIGxpYmN1cmwgbXVsdGktdGhyZWFkZWQuLi4KCkRhbmllbCAoMjIgTWFyY2ggMjAwMCk6Ci0gV2hhbSBCYW5nIHN1cHBsaWVkIGEgY291cGxlIG9mIHdpbjMyIGZpeGVzLiBIQVZFX1VOQU1FCiAgd2FzIGFjY2lkZW50YWxseSAjZGVmaW5lZCBpbiBjb25maWctd2luMzIuaCwgd2hpY2ggaXQgc2hvdWxkbid0IGhhdmUgYmVlbi4KICBUaGUgSEFWRV9VTklTVERfSCBpcyBub3QgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyB3aXRoIHRoZSBNYWtlZmlsZS52YzYKICBtYWtlZmlsZSBmb3IgTVMgVkMrKy4KCkRhbmllbCAoMjEgTWFyY2ggMjAwMCk6Ci0gSSByZW1vdmVkIHRoZSBBQ19QUk9HX0lOU1RBTEwgbWFjcm8gZnJvbSBjb25maWd1cmUuaW4sIHNpbmNlIGl0IGFwcGVhcnMgdGhhdAogIG9uZSBvZiB0aGUgQU1fKiBtYWNyb3Mgc2VhcmNoZXMgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCBhbHJlYWR5LiBKYW5uZQogIEpvaGFuc3NvbiBtYWRlIG1lIGF3YXJlIG9mIHRoaXMuCgpWZXJzaW9uIDYuNS4yCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDApOgotIFBhdWwgSGFycmluZ3RvbiBxdWlja2x5IHBvaW50ZWQgb3V0IHRvIG1lIHRoYXQgNi41LjEKICBjcmFzaGVzIGhhcmQuIEkgdXBsb2FkIDYuNS4yIG5vdyBhcyBxdWlja2x5IGFzIHBvc3NpYmxlISBUaGUgcHJvYmxlbSB3YXMKICB0aGUgLUQgYWRqdXN0bWVudHMgaW4gc3JjL21haW4uYy4KClZlcnNpb24gNi41LjEKCkRhbmllbCAoMjAgTWFyY2ggMjAwMCk6Ci0gQW4gYW5vbnltb3VzIHBvc3Qgb24gc291cmNlZm9yZ2UgY29ycmVjdGx5IHBvaW50ZWQgb3V0IGEgcG9zc2libGUgYnVmZmVyCiAgb3ZlcmZsb3cgaW4gdGhlIGN1cmxfdW5lc2NhcGUoKSBmdW5jdGlvbiBmb3IgVVJMIGNvbnZlcnNpb25zLiBUaGUgbWFpbgogIHByb2JsZW0gd2l0aCB0aGlzIGJ1ZyBpcyB0aGF0IHRoZSBmdHAgZG93bmxvYWQgdXNlcyB0aGF0IGZ1bmN0aW9uIGFuZCB0aGlzCiAgc2luZ2xlLSBieXRlIG92ZXJmbG93IGNvdWxkIGxlYWQgdG8gdmVyeSBvZGQgYnVncyAoYXMgb25lIHJlcG9ydGVkIGJ5IEphbm5lCiAgSm9oYW5zc29uKS4KCkRhbmllbCAoMTkgTWFyY2ggMjAwMCk6Ci0gTWFyY28gRy4gU2FsdmFnbm8gc3VwcGxpZWQgbWUgd2l0aCBhIHNlcmllcyBvZiBwYXRjaGVzCiAgdGhhdCBub3cgYWxsb3dzIGN1cmwgdG8gZ2V0IGNvbXBpbGVkIG9uIE9TLzIuIEl0IGV2ZW4gaW5jbHVkZXMgYSBzZWN0aW9uIGluCiAgdGhlIElOU1RBTEwgZmlsZS4gVmVyeSBuaWNlIGpvYiEKCkRhbmllbCAoMTcgTWFyY2ggMjAwMCk6Ci0gV2hhbSBCYW5nIHN1cHBsaWVkIGEgcGF0Y2ggZm9yIHRoZSBsaWIvTWFrZWZpbGUudmM2CiAgZmlsZS4gV2Ugc3RpbGwgbmVlZCBzb21lIGZpeGVzIGZvciB0aGUgY29uZmlnLXdpbjMyLmggc2luY2UgaXQgYXBwZWFycyB0aGF0CiAgVkMrKyBhbmQgbWluZ3czMiBoYXZlIGRpZmZlcmVudCBvcGluaW9ucyBhYm91dCAoYXQgbGVhc3QpIHVuaXN0ZC5oJ3MKICBleGlzdGVuY2UuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDApOgotIEkgbW9kaWZpZWQgdGhlIC1ELy0tZHVtcC1oZWFkZXIgd29ya2luZ3Mgc28gdGhhdCBpdCBkb2Vzbid0IHdyaXRlIGFueXRoaW5nCiAgdG8gdGhlIGZpbGUgdW50aWwgaXQgbmVlZHMgdG8uIFRoaXMgd2F5LCB5b3UgY2FuIGFjdHVhbGx5IHVzZSAtYiBhbmQgLUQKICBvbiB0aGUgc2FtZSBmaWxlIGlmIHlvdSB3YW50IHJlcGVhdGVkIGludm9rZXMgdG8gc3RvcmUgYW5kIHJlYWQgdGhlIGNvb2tpZXMKICBpbiB0aGF0IG9uZSBzaW5nbGUgZmlsZS4KCi0gUG9rZWQgYXJvdW5kIGluIGxvdHMgb2YgdGV4dHMuIEFkZGVkIHRoZSBCVUdTIGZpbGUgZm9yIGJ1ZyByZXBvcnRpbmcgc3R1ZmYuCiAgQWRkZWQgdGhlIGNsYXNzaWMgSFRUUCBQT1NUIHF1ZXN0aW9uIHRvIHRoZSBGQVEsIHJlbW92ZWQgc29tZSAjaWZkZWYgV0lOMzIKICBzdHVmZiBmcm9tIHRoZSBzb3VyY2VzICh0aGV5J3JlIGNvdmVyZWQgYnkgdGhlIGNvbmZpZy13aW4zMi5oIG5vdykuCgotIFBhc2NhbCBHYXVkZXR0ZSBmaXhlZCBhIG1pc3NpbmcgbGRhcC5jIHByb2JsZW0gaW4gdGhlCiAgTWFrZWZpbGUudmM2IGZpbGUuIEhlIGFsc28gYWRkcmVzc2VkIGEgcHJvYmxlbSBpbiBzcmMvY29uZmlnLXdpbjMyLmguCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDApOgotIFBhdWwgSGFycmluZ3RvbiBwb2ludGVkIG91dCB0aGF0IHRoZSAnaHR0cF9jb2RlJyB2YXJpYWJsZSBpbiB0aGUgLXcgb3V0cHV0CiAgd2FzIG5ldmVyIHdyaXR0ZW4uIEkgZml4ZWQgaXQgbm93LgoKLSBKYW5uZSBKb2hhbnNzb24gcmVwb3J0ZWQgdGhlIGNvbXBsYWludHMgdGhhdCBPcGVuQlNEIGRvZXMKICB3aGVuIGdldGRhdGUuYyAjaW5jbHVkZXMgbWFsbG9jLmguIEl0IGNsYWltcyBzdGRsaWIuaCBzaG91bGQgYmUgaW5jbHVkZWQKICBpbnN0ZWFkLiBJIGFkZGVkICNpZmRlZiBIQVZFX01BTExPQ19IIGNvZGUgaW4gZ2V0ZGF0ZS55IGFuZCB0d28gY2hlY2tzIGluCiAgdGhlIGNvbmZpZ3VyZS5pbiBmb3IgbWFsbG9jLmggYW5kIHN0ZGxpYi5oLgoKVmVyc2lvbiA2LjUKCkRhbmllbCAoMTMgTWFyY2ggMjAwMCk6Ci0gPGN1cmwgYXQgc3BhbS53b2x2ZXNiYW5lLm5ldD4gcG9pbnRlZCBvdXQgdGhhdCB0aGUgd2F5IGN1cmwgc2VudCBjb29raWVzIGluIGEKICBzaW5nbGUgbGluZSB3YXNuJ3QgZW5qb3llZCBieSBJSVM0LjAgc2VydmVycy4gSW4gbXkgdmlldywgdGhhdCBpcyBub3Qgd2hhdAogIHRoZSBzdGFuZGFyZHMgc2F5LCBidXQgSSBhZGRlZCBhIHdoaXRlIHNwYWNlIGJldHdlZW4gdGhlIG5hbWUvdmFsdWUgcGFpcnMgdG8KICBwZXJoYXBzIG1ha2UgdGhlbSB3b3JrIGJldHRlci4KCi0gQWRkZWQgdGhlIHBlcmwgY2hlY2sgYmFjayBpbiB0aGUgY29uZmlndXJlLmluIGFnYWluIHNpbmNlIHRoZSBta2hlbHAucGwKICBzY3JpcHQgbmVlZHMgaXQhCgotIE1hZGUgc29tZSBiZWF1dGlmaWNhdGlvbnMgaW4gdGhlIGN1cmwgbWFuIHBhZ2UuCgpEYW5pZWwgKDMgTWFyY2ggMjAwMCk6Ci0gSvZybiBoZWxwZWQgbWUgdXBkYXRlIHRoZSBjb25maWctd2luMzIuaCBmaWxlcyB3aXRoIEhBVkVfU0VUVkJVRiBhbmQKICBIQVZFX1NUUkRVUC4KCkRhbmllbCAoMyBNYXJjaCAyMDAwKToKLSBVcGxvYWRlZCB0aGUgNi41cHJlMiBwYWNrYWdlLgoKRGFuaWVsICgyIE1hcmNoIDIwMDApOgotIFJlbW92ZWQgdGhlIHBlcmwtcHJvZ3JhbXMgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLCB0aGV5IG5ldmVyIG1hZGUgbWFueSBwZW9wbGUKICBoYXBweSBhbmQgSSdsbCBzdGlsbCBrZWVwIHRoZW0gYXZhaWxhYmxlIG9uIHRoZSB3ZWIuCgotIEFkZGVkIHRoZSAtdyBhbmQgLU4gc3R1ZmYgdG8gdGhlIG1hbiBwYWdlLiBEb2N1bWVudGVkIHRoZSBuZXcgcHJvZ3Jlc3MgbWV0ZXIKICBkaXNwbGF5IGluIFJFQURNRS5jdXJsLgoKLSBK9nJuIEhhcnRyb3RoLCBDaHJpcyA8Y2JheWxpc3MgYXQgY3NjLmNvbWU+IGFuZCBVbGYKICBN9mxsZXIgZnJvbSB0aGUgb3BlbnNzbCBkZXZlbG9wbWVudCB0ZWFtIGhlbHBlZCBicmluZ2luZyBtZSB0aGUgZGV0YWlscyBmb3IKICBmaXhpbmcgYW4gT3BlblNTTCB1c2FnZSBmbGF3LiBJdCBiZWNhbWUgYXBwYXJlbnQgd2hlbiB0aGV5IHJlbGVhc2VkIG9wZW5zc2wKICAwLjkuNSBzaW5jZSB0aGF0IGJhcmZlZCBvbiBjdXJsJ3MgYmFkIGJlaGF2aW9yIChub3Qgc2VlZGluZyBhIHJhbmRvbSBudW1iZXIKICB0aGluZykuCgotIFlldCBhbm90aGVyIG9wdGlvbjogLU4vLS1uby1idWZmZXIgZGlzYWJsZXMgYnVmZmVyaW5nIGluIHRoZSBvdXRwdXQgc3RyZWFtLgogIFByb2JhYmx5IG1vc3QgdXNlZnVsIGZvciB2ZXJ5IHNsb3cgdHJhbnNmZXJzIHdoZW4geW91IHJlYWxseSB3YW50IHRvIGdldAogIGV2ZXJ5IGJ5dGUgY3VybCByZWNlaXZlcyB3aXRoaW4gc29tZSBwcmVmZXJyZWQgdGltZS4gQW5kcmV3IDx0bXIgYXQgZ2NpLm5ldD4KICBzdWdnZXN0ZWQgdGhpcy4KCi0gRGFtaWVuIEFkYW50IG1haWxlZCBtZSBoaXMgZml4ZXMgZm9yIG1ha2luZyBjdXJsIGNvbXBpbGUgb24gVWx0cml4LgoKRGFuaWVsICgyNCBGZWJydWFyeSAyMDAwKToKLSBBcHBsaWVkIEr2cm4gSGFydHJvdGgncyBmaXhlcyBmb3IgY29uZmlnLXdpbjMyLmggYW5kIGxpYi9NYWtlZmlsZS53MzIuCgogIEkgc2hvdWxkIGFsc28gbWFrZSBhIG5vdGUgaGVyZSwgaWYgbm90aGluZyBlbHNlIHRvIG15c2VsZiwgdGhhdCB3aGVuIHVzaW5nCiAgdGhlICUtc3ludGF4IGZvciB2YXJpYWJsZXMgaW4gRE9TIGNvbW1hbmQgcHJvbXB0cywgeW91IG11c3QgdXNlIHR3byAlLQogIGxldHRlcnMgZm9yIGVhY2ggb25lIHNpbmNlIHRoYXQgaXMgYW4gZXNjYXBlIGxldHRlciB0aGVyZSEgTWF5YmUgSSBzaG91bGQKICB1c2UgYW5vdGhlciBsZXR0ZXIgaW5zdGVhZCEKCi0gQWRkZWQgbW9yZSB2YXJpYWJsZXMgdG8gLXc6CgogICdodHRwX2NvZGUnCiAgJ3RpbWVfbmFtZWxvb2t1cCcKICAndGltZV9jb25uZWN0JwogICd0aW1lX3ByZXRyYW5zZmVyJwogICd1cmxfZWZmZWN0aXZlJwoKLSBNYWRlIC13QGZpbGVuYW1lIHJlYWQgdGhlIHN5bnRheCBmcm9tIGEgZmlsZSBhbmQgLXdALSByZWFkcyB0aGUgc3ludGF4IGZyb20KICBzdGRpbiBpbiB0aGUgZ29vZCBvbGQgInN0YW5kYXJkIiBjdXJsIHdheS4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMCk6Ci0gUmVsZWFzZWQgYSA2LjVwcmUxIHZlcnNpb24gdG8gZ2V0IHNvbWUgdGVzdCBhbmQgdXNlciBmZWVkYmFjay4KCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwMCk6CgotIEkgYWRkZWQgdGhlIC13Ly0td3JpdGUtb3V0IGZsYWcgYW5kIHNvbWUgdmFyaWFibGVzIHRvIGdvIHdpdGggaXQuIC13IGlzIGEKICBzaW5nbGUgc3RyaW5nLCB3aGF0ZXZlciB5b3UgZW50ZXIgdGhlcmUgd2lsbCBiZSB3cml0dGVuIG91dCB3aGVuIGN1cmwgaGFzCiAgY29tcGxldGVkIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0LiBUaGVyZSBhcmUgc29tZSB2YXJpYWJsZSBzdWJzdGl0dXRpb25zIGFuZAogIHRoZXkgYXJlIHNwZWNpZmllZCBhcyAnJXt2YXJpYWJsZX0nICh3aXRob3V0IHRoZSBxdW90ZXMpLiBWYXJpYWJsZXMgdGhhdAogIGV4aXN0IGFzIG9mIHRoaXMgbW9tZW50IGFyZToKCiAgICAgICAgdG90YWxfdGltZSAgICAgLSB0b3RhbCB0cmFuc2ZlciB0aW1lIGluIHNlY29uZHMgKHdpdGggMiBkZWNpbWFscykKICAgICAgICBzaXplX2Rvd25sb2FkICAtIHRvdGFsIGRvd25sb2FkZWQgYW1vdW50IG9mIGJ5dGVzCiAgICAgICAgc2l6ZV91cGxvYWQgICAgLSB0b3RhbCB1cGxvYWRlZCBhbW91bnQgb2YgYnl0ZXMKICAgICAgICBzcGVlZF9kb3dubG9hZCAtIHRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBlbnRpcmUgZG93bmxvYWQKICAgICAgICBzcGVlZF91cGxvYWQgICAtIHRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBlbnRpcmUgdXBsb2FkCgogIEkgd2lsbCBvZiBjb3Vyc2UgYWRkIG1vcmUgdmFyaWFibGVzLCBidXQgSSBuZWVkIGlucHV0IG9uIHRoZXNlIGFuZCBvdGhlcnMuCgotIEl0IHN0cnVjayBtZSB0aGF0IHRoZSAtIyBwcm9ncmVzcyBiYXIgd2lsbCBiZSBoYXJkIHRvIGp1c3QgYXBwbHkgb24gdGhlIG5ldwogIHByb2dyZXNzIGJhciBjb25jZXB0LiBJIG5lZWQgc29tZSBmZWVkYmFjayBvbiB0aGlzIGJlZm9yZSB0aGF0J2xsIGdldCByZS0KICBpbnRyb2R1Y2VkISA6LS8KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwMCk6Ci0gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIHNvbWUgZml4ZXMgZm9yIHRoZSBwcm9ncmVzcyBtZXRlciBhbmQgSSBjb250aW51ZWQKICB3b3JraW5nIG9uIGl0LiBJdCBzZWVtcyB0byB3b3JrIGZvciBodHRwIGRvd25sb2FkLCBodHRwIHBvc3QsIGZ0cCBkb3dubG9hZAogIGFuZCBmdHAgdXBsb2FkLiBJdCBzaG91bGQgYmUgYSBwcmV0dHkgZ29vZCB0ZXN0IGl0IHdvcmtzIGdlbmVyYWxseSBnb29kLgoKLSBTdGlsbCBuZWVkIHRvIGFkZCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIGludG8gdGhlIG5ldyBzdHlsZSBwcm9ncmVzcyBpbnRlcmZhY2UuCgotIEdvbm5hIGhhdmUgYSBnbyBhdCBteSBuZXcgb3V0cHV0IG9wdGlvbiBwYXJhbWV0ZXIgbmV4dC4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwMCk6Ci0gVGhlIHByb2dyZXNzIG1ldGVyIHN0dWZmIGlzIHNsb3dseSB0YWtpbmcgcGxhY2UuIFRoZXJlJ3MgbW9yZSBsZWZ0IGJlZm9yZSBpdAogIGlzIHdvcmtpbmcgb2sgYW5kIGV2ZXJ5dGhpbmcgaXMgdGVzdGVkLCBidXQgd2UncmUgcmVhY2hpbmcgdGhlcmUuIFNsb3dseSEKCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwMCk6Ci0gUGF1bCBNYXJxdWlzIGZpeGVkIHRoZSBjb25maWcgZmlsZSBwYXJzaW5nIG9mIGN1cmwgdG8KICBkZWFsIHdpdGggYW55LWxlbmd0aCBsaW5lcywgcmVtb3ZpbmcgdGhlIHByZXZpb3VzIGxpbWl0IG9mIDRLLgoKLSBFZXR1IE9qYW5lbidzIHN1Z2dlc3Rpb24gb2Ygc3VwcG9ydGluZyB0aGUgQC1zdHlsZSBmb3IgLWIKICBpcyBpbXBsZW1lbnRlZC4gTm93IC1iQDxmaWxlbmFtZT4gd29ya3MgYXMgd2VsbCBhcyB0aGUgb2xkIHN0eWxlLiAtYkAtIGFsc28KICBzaW1pbGFybHkgcmVhZHMgdGhlIGNvb2tpZXMgZnJvbSBzdGRpbi4KCi0gUmVtaW5kZXI6IC1EIHNob3VsZCBub3Qgd3JpdGUgdG8gdGhlIGZpbGUgdW50aWwgaXQgbmVlZHMgdG8sIGluIHRoZSBzYW1lIHdheQogIC1vIGRvZXMuIFRoYXQgd291bGQgZW5hYmxlIGN1cmwgdG8gdXNlIC1iIGFuZCAtRCBvbiB0aGUgc2FtZSBmaWxlLi4uCgotIEVsbGlzIFByaXRjaGFyZCBtYWRlIGdldGRhdGUueSB3b3JrIGZvciBNYWNPUyBYLgoKLSBQYXVsIEhhcnJpbmd0b24gaGVscGVkIG1lIG91dCBmaW5kaW5nIHRoZSBjcmFzaCBpbiB0aGUKICBjb29raWUgcGFyc2VyLiBIZSBhbHNvIHBvaW50ZWQgb3V0IGN1cmwncyBoYWJpdCBvZiBzZW5kaW5nIGVtcHR5IGNvb2tpZXMgdG8KICB0aGUgc2VydmVyLgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDApOgogLSBSb24gWmFwcCBjb3JyZWN0ZWQgYSBwcm9ibGVtIGluIHNyYy91cmxnbG9iLmMgdGhhdAogICBwcmV2ZW50ZWQgY3VybCBmcm9tIGdldHRpbmcgY29tcGlsZWQgb24gc3Vub3MgNC4gVGhlIHByb2JsZW0gaGFkIHRvIGRvCiAgIHdpdGggdGhlIGRpZmZlcmVuY2UgaW4gc3ByaW50ZigpIHJldHVybiBjb2RlIHR5cGVzLgoKIC0gVHJhbnNmZXIoKSBzaG91bGQgbm93IGJlIGFibGUgdG8gZG93bmxvYWQgYW5kIHVwbG9hZCBzaW11bHRhbmVvdXNseS4gTGV0J3MKICAgZG8gc29tZSBwcm9ncmVzcyBtZXRlciBmaXhlcyBsYXRlciB0aGlzIHdlZWsuCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMCk6CiAtIFBhdWwgSGFycmluZ3RvbiBmb3VuZCBhbm90aGVyIGNvcmUgZHVtcCBpbiB0aGUgY29va2llCiAgIHBhcnNlci4gQ3VybCBkb2Vzbid0IHByb3Blcmx5IHJlY29nbml6ZSB0aGUgJ3ZlcnNpb24nIGtleXdvcmQgYW5kIEkgdGhpbmsKICAgdGhhdCBpcyB3aGF0IGNhdXNlZCB0aGlzLiBJIG5lZWQgdG8gcmVmcmVzaCBzb21lIHNwZWNzIG9uIGNvb2tpZXMgYW5kIHNlZQogICB3aGF0IGVsc2UgY3VybCBsYWNrcyB0byBpbXByb3ZlIHRoaXMgYSBiaXQgbW9yZSBvbmNlIGFuZCBmb3IgYWxsLgoKICAgUkZDIDIxMDkgY2xlYXJseSBzcGVjaWZpZXMgaG93IGNvb2tpZXMgc2hvdWxkIGJlIGRlYWx0IHdpdGggd2hlbiB0aGV5IGFyZQogICBjb21wbGlhbnQgd2l0aCB0aGF0IHNwZWMuIEkgZG9uJ3QgdGhpbmsgbWFueSBzZXJ2ZXJzIGFyZSB0aG91Z2guLi4KCiAtIE1hcmsgVy4gRWljaGluIGZvdW5kIHRoYXQgd2hpbGUgY3VybCBpcyB1cGxvYWRpbmcgYSBmb3JtCiAgIHRvIGEgd2ViIHNpdGUsIGl0IGRvZXNuJ3QgcmVhZCBpbmNvbWluZyBkYXRhIHdoeSBpdCdsbCBoYW5nIGFmdGVyIGEgd2hpbGUKICAgc2luY2UgdGhlIHNvY2tldCAicGlwZSIgYmVjb21lcyBmdWxsLgoKICAgSXQgdG9vayBtZSB0d28gaG91cnMgdG8gcmV3cml0ZSBEb3dubG9hZCgpIGFuZCBVcGxvYWQoKSBpbnRvIHRoZSBuZXcKICAgc2luZ2xlIGZ1bmN0aW9uIFRyYW5zZmVyKCkuIEl0IGV2ZW4gc2VlbXMgdG8gd29yayEgTW9yZSB0ZXN0aW5nIGlzIHJlcXVpcmVkCiAgIG9mIGNvdXJzZS4uLiBJIHNob3VsZCBnZXQgdGhlIGhlYWRlci1zZW5kaW5nIHRvZ2V0aGVyIGluIGEga2luZCBvZiBxdWV1ZQogICBhbmQgbGV0IHRoZW0gZ2V0ICJ1cGxvYWRlZCIgaW4gVHJhbnNmZXIoKSBhcyB3ZWxsLgoKIC0gWmhpYmlhbyBXdSBwb2ludGVkIG91dCBhIGN1cmwgYnVnIGluIHRoZSBsb2NhdGlvbjogYXJlYSwKICAgYWx0aG91Z2ggSSBkaWQgbm90IGdldCBhIHJlcHJvZHVjaWJsZSB3YXkgdG8gZG8gdGhpcyB3aHkgSSBoYXZlIHRvIHdhaXQKICAgd2l0aCBmaXhpbmcgYW55dGhpbmcuCgogLSBCb2IgU2NoYWRlciBzdWdnZXN0ZWQgSSBzaG91bGQgaW1wbGVtZW50IHJlc3VtZQogICBzdXBwb3J0IGZvciB0aGUgSFRUUCBQVVQgb3BlcmF0aW9uLCBhbmQgYXMgSSB0aGluayBpdCBpcyBhIHZhbGlkIHN1Z2dlc3Rpb24KICAgSSdsbCB3b3JrIG9uIGl0LgoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDApOgogLSBNIFRyYXZpcyBPYmVuaGF1cyBwb2ludGVkIG91dCBhIG1hbnVhbCBtaXh1cCB3aXRoIC15IGFuZCAtWSB0aGF0IHdhcwogICBjb3JyZWN0ZWQuCgogLSBKZW5zIFNjaGxldXNlbmVyIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB0byBjb21waWxlCiAgIGN1cmwgb24gQUlYIDQuMS40IGFuZCBnYXZlIG1lIGEgc29sdXRpb24uIFRoaXMgcHJvYmxlbSB3YXMgYWxyZWFkeSBmaXhlZAogICBieSBK9nJuJ3MgcmVjZW50ICNpbmNsdWRlIG1vZGlmaWNhdGlvbnMhCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwMCk6CiAtIE9za2FyIExpbGplYmxhZCBwb2ludGVkIG91dCBhbmQgY29ycmVjdGVkIGEgcHJvYmxlbQogICBpbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBzeXN0ZW0gdGhhdCBtYWRlIGN1cmwgZm9sbG93aW5nIGEgbG9jYXRpb246IHRvIGEKICAgZGlmZmVyZW50IHByb3RvY29sIHRvIGZhaWwuCgogICBBdCBKYW51YXJ5IDMxc3QgSSByZS1jb25zaWRlcmVkIHRoaXMgZml4IGFuZCB0aGUgc3Vycm91bmRpbmcgc291cmNlIGNvZGUuIEkKICAgY291bGQgbm90IHJlYWxseSBzZWUgdGhhdCB0aGUgcGF0Y2ggZGlkIGFueSBkaWZmZXJlbmNlLCB3aHkgSSByZW1vdmVkIGl0CiAgIGFnYWluIGZvciBmdXJ0aGVyIHJlc2VhcmNoIGFuZCBkZWJ1Z2dpbmcuIChJdCBkaXNhYmxlZCBsb2NhdGlvbjogZm9sbG93aW5nCiAgIG9uIHNlcnZlciBub3QgcnVubmluZyBvbiBkZWZhdWx0IHBvcnRzLikKCiAtIEr2cm4gSGFydHJvdGggYnJvdWdodCBhIGZpeCB0aGF0IG9uY2UgYWdhaW4KICAgbWFkZSBpdCBwb3NzaWJsZSB0byBzZWxlY3QgcHJvZ3Jlc3MgYmFyLgoKIC0gSvZybiBhbHNvIGZpeGVkIGEgZmV3IGluY2x1ZGUgcHJvYmxlbXMuCgpWZXJzaW9uIDYuNAoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDApOgogLSBCYXNlZCBvbiBzdWdnZXN0aW9ucyBmcm9tIEJq9nJuIFN0ZW5iZXJnLCBJIG1hZGUgdGhlCiAgIHByb2dyZXNzIGRlYWwgYmV0dGVyIHdpdGggbGFyZ2VyIGZpbGVzIGFuZCBhZGRlZCBhICJUaW1lIiBmaWVsZCB3aGljaCBzaG93cwogICB0aGUgdGltZSBzcGVudCBvbiB0aGUgZG93bmxvYWQgc28gZmFyLgogLSBJJ20gbm93IHVzaW5nIHRoZSBDVlMgcmVwb3NpdG9yeSBvbiBzb3VyY2Vmb3JnZS5uZXQsIHdoaWNoIGFsc28gYWxsb3dzIHdlYgogICBicm93c2luZy4gU2VlIGh0dHA6Ly9jdXJsLmhheHgubnUuCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwMCk6CiAtIFJlbnVtYmVyZWQgc29tZSBlbnVtcyBpbiBjdXJsL2N1cmwuaCBzaW5jZSB0YWcgbnVtYmVyIDM1IHdhcyB1c2VkIHR3aWNlIQogLSBBZGRlZCAicG9zdHF1b3RlIiBzdXBwb3J0IHRvIHRoZSBmdHAgc2VjdGlvbiB0aGF0IGVuYWJsZXMgcG9zdC1mdHAtdHJhbnNmZXIKICAgcXVvdGUgY29tbWFuZHMuCiAtIE5vdyBtYWRlIHRoZSAtUS8tLXF1b3RlIHBhcmFtZXRlciByZWNvZ25pemUgJy0nIGFzIGEgcHJlZml4LCB3aGljaCBtZWFucwogICB0aGF0IGNvbW1hbmQgd2lsbCBiZSBpc3N1ZWQgQUZURVIgYSBzdWNjZXNzZnVsIGZ0cCB0cmFuc2Zlci4gVGhpcyBjYW4gb2YKICAgY291cnNlIGJlIHVzZWQgdG8gZGVsZXRlIG9yIHJlbmFtZSBhIGZpbGUgYWZ0ZXIgaXQgaGFzIGJlZW4gdXBsb2FkZWQgb3IKICAgZG93bmxvYWRlZC4gVXNlIHlvdXIgaW1hZ2luYXRpb24hIDstKQogLSBTaW5jZSBJIGRvIHRoZSBtYWluIGRldmVsb3BtZW50IG9uIHNvbGFyaXMgMi42IG5vdywgSSBoYWQgdG8gZG93bmxvYWQgYW5kCiAgIGluc3RhbGwgR05VIGdyb2ZmIHRvIGdlbmVyYXRlIHRoZSBodWdlaGVscC5jIGZpbGUuIFRoZSBzb2xhcmlzIG5yb2ZmIGNvcmVzCiAgIG9uIHRoZSBtYW4gcGFnZSEgU28sIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNvbGFyaXMgY29uZmlndXJlIHNjcmlwdCBmaW5kIGEKICAgYmV0dGVyIHJlc3VsdCBJIG1hZGUgZ25yb2ZmIGdldCBjaGVja2VkIHByaW9yIHRvIHRoZSByZWd1bGFyIG5yb2ZmLgogLSBBZGRlZCBhbGwgdGhlIGN1cmwgZXhpdCBjb2RlcyB0byB0aGUgbWFuIHBhZ2UuCiAtIEppbSBHYWxsYWdoZXIgcHJvcGVybHkgdHJhY2tlZCBkb3duIGEgYnVnIGluIGF1dG9jb25mCiAgIDIuMTMuIFRoZSBBQ19DSEVDS19MSUIoKSBtYWNybyB3cm9uZ2Z1bGx5IHVzZXMgdGhlIC1sIGZsYWcgYmVmb3JlIHRoZSAtTAogICBmbGFnIHRvICdsZCcgd2hpY2ggY2F1c2VzIHRoZSBIUC1VWCAxMC4yMCBmbGF2b3VyIHRvIGZhaWwgb24gYWxsIGxpYmNoZWNrcwogICBhbmQgdGhlcmVmb3JlIHlvdSBjYW4ndCBtYWtlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZpbmQgdGhlIG9wZW5zc2wgbGlicyEKCkRhbmllbCAoMjggRGVjZW1iZXIgMTk5OSk6CiAtIFRpbSBWZXJob2V2ZW4gY29ycmVjdGx5IGlkZW50aWZpZWQgdGhhdCBjdXJsCiAgIGRvZXNuJ3Qgc3VwcG9ydCBVUkwgZm9ybWF0dGVkIGZpbGUgbmFtZXMgd2hlbiBnZXR0aW5nIGZ0cC4gTm93LCB0aGVyZSdzIGEKICAgcHJvYmxlbSB3aXRoIGdldHRpbmcgdmVyeSB3ZWlyZCBmaWxlIG5hbWVzIG9mZiBGVFAgc2VydmVycy4gUkZDIDk1OSBkZWZpbmVzCiAgIHRoYXQgdGhlIGZpbGUgbmFtZSBzeW50YXggdG8gdXNlIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBpbiB0aGUgbmF0aXZlIE9TIG9mCiAgIHRoZSBzZXJ2ZXIuIFNpbmNlIHdlIGRvbid0IGtub3cgdGhlIHBlZXIgc2VydmVyIHN5c3RlbSB3ZSBjdXJyZW50bHkganVzdAogICB0cmFuc2xhdGUgdGhlIFVSTCBzeW50YXggaW50byBwbGFpbiBsZXR0ZXJzLiBJdCBpcyBzdGlsbCBiZXR0ZXIgYW5kIHdpdGgKICAgdGhlIHNvbGFyaXMgMi42LXN1cHBsaWVkIGZ0cCBzZXJ2ZXIgaXQgd29ya3Mgd2l0aCBzcGFjZXMgaW4gdGhlIGZpbGUgbmFtZXMuCgpEYW5pZWwgKDI3IERlY2VtYmVyIDE5OTkpOgogLSBXaGVuIGN1cmwgcGFyc2VkIGNvb2tpZXMgc3RyYWlnaHQgb2ZmIGEgcmVtb3RlIHNpdGUsIGl0IGNvcnJ1cHRlZCB0aGUgaW5wdXQKICAgZGF0YSwgd2hpY2gsIGlmIHRoZSBkb3dubG9hZGVkIGhlYWRlcnMgd2VyZSBzdG9yZWQgbWFkZSB2ZXJ5IG9kZCBjaGFyYWN0ZXJzCiAgIGluIHRoZSBzYXZlZCBkYXRhLiBDb3JyZWN0bHkgaWRlbnRpZmllZCBhbmQgcmVwb3J0ZWQgYnkgUGF1bCBIYXJyaW5ndG9uLgoKRGFuaWVsICgxMyBEZWNlbWJlciAxOTk5KToKIC0gR2VuZXJhbCBjbGVhbnVwcyBpbiB0aGUgbGlicmFyeSBpbnRlcmZhY2UuIFRoZXJlIGhhZCBiZWVuIHNvbWUgYmFkIGtsdWRnZXMKICAgYWRkZWQgZHVyaW5nIHRpbWVzIG9mIHN0cmVzcyBhbmQgSSBkaWQgbXkgYmVzdCB0byBjbGVhbiB0aGVtIG9mZi4gSXQgd2FzCiAgIGJvdGggcmVnYXJkaW5nIHRoZSBsaWIgQVBJIGFzIHdlbGwgYXMgaW5jbHVkZSBmaWxlIGNvbmZ1c2lvbnMuCgpEYW5pZWwgKDMgRGVjZW1iZXIgMTk5OSk6CiAtIEEgc21hbGwgLS1zdGRlcnIgYnVnIHdhcyByZXBvcnRlZCBieSBFZXR1IE9qYW5lbi4uLgoKIC0gd2hvIGFsc28gYnJvdWdodCB0aGUgc3VnZ2VzdGlvbiBvZiBleHRlbmRpbmcgdGhlIC1YIGZsYWcgdG8gZnRwIGxpc3QgYXMKICAgd2VsbC4gU28sIG5vdyBpdCBpcyBhbmQgdGhlIGxvbmcgb3B0aW9uIGlzIG5vdyAtLXJlcXVlc3QgaW5zdGVhZC4gSXQgaXMKICAgb25seSBmb3IgZnRwIGxpc3QgZm9yIG5vdyAoYW5kIHRoZSBmb3JtZXIgaHR0cCBzdHVmZiB0b28gb2YgY291cnNlKS4KCkxhcnMgSi4gQWFzICgyNCBOb3ZlbWJlciAxOTk5KToKIC0gUGF0Y2hlZCBjdXJsIHRvIGNvbXBpbGUgYW5kIGJ1aWxkIHVuZGVyIEJlT1MuIERvZXNuJ3Qgd29yayB5ZXQgdGhvdWdoIQoKIC0gQ29ycmVjdGVkIHRoZSBNYWtlZmlsZS5hbSBmaWxlcyB0byBhbGxvdyBwdXR0aW5nIG9iamVjdCBmaWxlcyBpbgogICBkaWZmZXJlbnQgZGlyZWN0b3JpZXMgdGhhbiB0aGUgc291cmNlcy4KClZlcnNpb24gNi4zLjEKCkRhbmllbCAoMjMgTm92ZW1iZXIgMTk5OSk6CiAtIEkndmUgaGFkIHRoaXMgbWFqb3IgZGlzayBjcmFzaC4gTXkgZ29vZCBvbGQgdHJ1c3Qtd29ydGh5IHNvdXJjZSBkaXNrIGRpZWQKICAgYWxvbmcgd2l0aCB0aGUgbWFjaGluZSB0aGF0IGhvc3RlZCBpdC4gVGhhbmsgZ29vZG5lc3MgbW9zdCBvZiBhbGwgdGhlCiAgIHRoaW5ncyBJJ3ZlIGRvbmUgYXJlIGVpdGhlciBiYWNrZWQgdXAgZWxzZXdoZXJlIG9yIHN0b3JlZCBpbiB0aGlzIENWUwogICBzZXJ2ZXIhCgogLSBNaWNoYWVsIFMuIFN0ZXVlciBwb2ludGVkIG91dCBhIGJ1ZyBpbiB0aGUgLUYgaGFuZGxpbmcKICAgdGhhdCBtYWRlIGN1cmwgaGFuZyBpZiB5b3UgcG9zdGVkIGFuIGVtcHR5IHZhcmlhYmxlIHN1Y2ggYXMgJy1GIG5hbWU9Jy4gSXQKICAgd2FzIG9uZSBvZiB0aG9zZSBvbGQgYnVncyB0aGF0IG5ldmVyIGhhdmUgd29ya2VkIHByb3Blcmx5Li4uCgogLSBKYXNvbiBCYWlldHRvIHBvaW50ZWQgb3V0IGEgZ2VuZXJhbCBmbGF3IGluIHRoZSBIVFRQCiAgIGRvd25sb2FkLiBDdXJsIGRpZG4ndCBjb21wbGFpbiBpZiBpdCB3YXMgcHJlbWF0dXJlbHkgYWJvcnRlZCBiZWZvcmUgdGhlCiAgIGVudGlyZSBkb3dubG9hZCB3YXMgY29tcGxldGVkLiBJdCBkb2VzIG5vdy4KCkRhbmllbCAoMTkgTm92ZW1iZXIgMTk5OSk6CiAtIENocmlzIE1hbHRieSB2ZXJ5IGFjY3VyYXRlbHkgY3JpdGljaXplZCB0aGUgbGFjayBvZgogICByZXR1cm4gY29kZSBjaGVja3Mgb24gdGhlIGZ3cml0ZSgpIGNhbGxzLiBJIGRpZCBhIHRob3JvdWdoIGNoZWNrIGZvciBhbGwKICAgb2NjdXJyZW5jZXMgYW5kIGNvcnJlY3RlZCB0aGlzLgoKRGFuaWVsICgxNyBOb3ZlbWJlciAxOTk5KToKIC0gUGF1bCBIYXJyaW5ndG9uIHBvaW50ZWQgb3V0IHRoYXQgdGhlIC1tLy0tbWF4LXRpbWUgb3B0aW9uCiAgIGRvZXNuJ3Qgd29yayBmb3IgdGhlIHNsb3cgc3lzdGVtIGNhbGxzIGxpa2UgZ2V0aG9zdGJ5bmFtZSgpLi4uIEkgZG9uJ3QgaGF2ZQogICBhbnkgZ29vZCBmaXggeWV0LCBqdXN0IGEgc2xpZ2h0bHkgbGVzcyBiYWQgb25lIHRoYXQgbWFrZXMgY3VybCBleGl0IGhhcmQKICAgd2hlbiB0aGUgdGltZW91dCBpcyByZWFjaGVkLgoKIC0gQmpvcm4gUmVlc2UgaGVscGVkIG1lIHBvaW50IG91dCBhIHBvc3NpYmxlIHByb2JsZW0gdGhhdCBtaWdodCBiZSB0aGUgcmVhc29uCiAgIHdoeSBUaG9tYXMgSHVyc3QgZXhwZXJpZW5jZSBwcm9ibGVtcyBpbiBoaXMgQW1pZ2EgdmVyc2lvbi4KCiBEYW5pZWwgKDEyIE5vdmVtYmVyIDE5OTkpOgogLSBJIGZvdW5kIGEgY3Jhc2ggaW4gdGhlIG5ldyBjb29raWUgZmlsZSBwYXJzZXIuIEl0IGNyYXNoZWQgd2hlbiB5b3UgZ2F2ZQogICBhIHBsYWluIGh0dHAgaGVhZGVyIGZpbGUgYXMgaW5wdXQuLi4KClZlcnNpb24gNi4zCgogRGFuaWVsICgxMCBOb3ZlbWJlciAxOTk5KToKIC0gSSBraW5kIG9mIGZvdW5kIG91dCB0aGF0IHRoZSBIVFRQIHRpbWUtY29uZGl0aW9uYWwgR0VUcyAoLXopIGFyZW4ndCBhbHdheXMKICAgcmVzcGVjdGVkIGJ5IHRoZSB3ZWIgc2VydmVyIGFuZCB0aGUgZG9jdW1lbnQgaXMgdGhlcmVmb3JlIHNlbnQgaW4gd2hvbGUKICAgYWdhaW4sIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVlc3RlZCBjb25kaXRpb24uIEFmdGVyIHJlYWRpbmcKICAgc2VjdGlvbiAxMy4zLjQgb2YgUkZDIDI2MTYsIEkgdGhpbmsgSSdtIGRvaW5nIHRoZSByaWdodCB0aGluZyBub3cgd2hlbiBJIGRvCiAgIG15IG93biBjaGVjayBhcyB3ZWxsLiBJZiBjdXJsIHRoaW5rcyB0aGUgY29uZGl0aW9uIGlzbid0IG1ldCwgdGhlIHRyYW5zZmVyCiAgIGlzIGFib3J0ZWQgcHJlbWF0dXJlbHkgKGFmdGVyIGFsbCB0aGUgaGVhZGVycyBoYXZlIGJlZW4gcmVjZWl2ZWQpLgoKIC0gQWZ0ZXIgY29tbWVudHMgZnJvbSBSb2JlcnQgTGluZGVuIEkgYWxzbyByZXdyb3RlIHNvbWUgcGFydHMgb2YgdGhlIG1hbiBwYWdlCiAgIHRvIGJldHRlciBkZXNjcmliZSBob3cgdGhlIC1GIHdvcmtzLgoKIC0gTWljaGFlbCBBbnRpIHB1dCB1cCBhIG5ldyBjdXJsIGRvd25sb2FkIG1pcnJvciBpbgogICBDaGluYTogIGh0dHA6Ly93d3cucHNob3dpbmcuY29tL2N1cmwvCgogLSBJIGFkZGVkIHRoZSBsaXN0IG9mIGRvd25sb2FkIG1pcnJvcnMgdG8gdGhlIFJFQURNRSBmaWxlCgogLSBJIGRpZCBhZGQgbW9yZSBleHBsYW5hdGlvbnMgdG8gdGhlIG1hbiBwYWdlCgogRGFuaWVsICg4IE5vdmVtYmVyIDE5OTkpOgogLSBJIG1hZGUgdGhlIC1iLy0tY29va2llIG9wdGlvbiBjYXBhYmxlIG9mIHJlYWRpbmcgbmV0c2NhcGUgZm9ybWF0dGVkIGNvb2tpZQogICBmaWxlcyBhcyB3ZWxsIGFzIG5vcm1hbCBodHRwLWhlYWRlciBmaWxlcy4gSXQgc2hvdWxkIGJlIGFibGUgdG8KICAgdHJhbnNwYXJlbnRseSBmaWd1cmUgb3V0IHdoYXQga2luZCBvZiBmaWxlIGl0IGdvdCBhcyBpbnB1dC4KCiBEYW5pZWwgKDI5IE9jdG9iZXIgMTk5OSk6CiAtIEFub3RoZXIgb25lIG9mIFNlYmFzdGlhYW4gdmFuIEVyaydzIGlkZWFzICh0aGF0IGhhcyBiZWVuIHJlcXVlc3RlZCBiZWZvcmUKICAgYnV0IEkgc2VlbSB0byBoYXZlIGZvcmdvdHRlbiB3aG8gaXQgd2FzKSwgaXMgdG8gYWRkIHN1cHBvcnQgZm9yIHJhbmdlcyBpbgogICBGVFAgZG93bmxvYWRzLiBBcyB1c3VhbCwgb25lIHJlcXVlc3QgaXMganVzdCBhIHJlcXVlc3QsIHdoZW4gdGhleSdyZSB0d28KICAgaXQgaXMgYSBkZW1hbmQuIEkndmUgYWRkZWQgc2ltcGxlIHN1cHBvcnQgZm9yIFgtWSBzdHlsZSBmZXRjaGVzLiBYIGhhcyB0bwogICBiZSB0aGUgbG93ZXIgbnVtYmVyLCB0aG91Z2ggeW91IG1heSBvbWl0IG9uZSBvZiB0aGUgbnVtYmVycy4gVXNlIHRoZSAtci8KICAgLS1yYW5nZSBzd2l0Y2ggKHByZXZpb3VzbHkgSFRUUC1vbmx5KS4KCiAtIFNlYmFzdGlhYW4gdmFuIEVyayBzdWdnZXN0ZWQgdGhhdCBjdXJsIHNob3VsZCBiZQogICBhYmxlIHRvIHNob3cgdGhlIGZpbGUgc2l6ZSBvZiBhIHNwZWNpZmllZCBmaWxlLiBJIHRoaW5rIHRoaXMgaXMgYSBzcGxlbmRpZAogICBpZGVhIGFuZCB0aGUgLUkgZmxhZyBpcyBub3cgd29ya2luZyBmb3IgRlRQLiBJdCBkaXNwbGF5cyB0aGUgZmlsZSBzaXplIGluCiAgIHRoaXMgbWFubmVyOgogICAgICAgIENvbnRlbnQtTGVuZ3RoOiBYWFhYCiAgIEFzIGl0IHJlc2VtYmxlcyBub3JtYWwgaGVhZGVycywgYW5kIGxlYXZlcyB1cyB0aGUgb3Bwb3J0dW5pdHkgdG8gYWRkIG1vcmUKICAgaW5mbyBpbiB0aGF0IGRpc3BsYXkgaWYgd2UgY2FuIGNvbWUgdXAgd2l0aCBtb3JlIGluIHRoZSBmdXR1cmUhIEl0IGFsc28KICAgbWFrZXMgc2Vuc2Ugc2luY2UgaWYgeW91IGFjY2VzcyBmdHAgdGhyb3VnaCBhIEhUVFAgcHJveHksIHlvdSdkIGdldCB0aGUKICAgZmlsZSBzaXplIHRoZSBzYW1lIHdheS4KCiAgIEkgY2hhbmdlZCB0aGUgb3JkZXIgb2YgdGhlIFFVT1RFIGNvbW1hbmQgZXhlY3V0aW9ucy4gVGhleSdyZSBub3cgZXhlY3V0ZWQKICAganVzdCBhZnRlciB0aGUgbG9naW4gYW5kIGJlZm9yZSBhbnkgb3RoZXIgY29tbWFuZC4gSSBtYWRlIHRoaXMgdG8gZW5hYmxlCiAgIHF1b3RlIGNvbW1hbmRzIHRvIHJ1biBiZWZvcmUgdGhlIC1JIHN0dWZmIGlzIGRvbmUgdG9vLgoKIC0gSSBmb3VuZCBvdXQgdGhhdCAtRC8tLWR1bXAtaGVhZGVyIGFuZCAtVi8tLXZlcnNpb24gd2VyZW4ndCBkb2N1bWVudGVkIGluCiAgIHRoZSBtYW4gcGFnZS4KCiAtIE1hbnkgSFRUUC8xLjEgc2VydmVycyBkbyBub3Qgc3VwcG9ydCByYW5nZXMuIERvbid0IGFzayBtZSB3aHkuIEkgZGlkIGFkZAogICBzb21lIHRleHQgYWJvdXQgdGhpcyBpbiB0aGUgbWFuIHBhZ2UgZm9yIHRoZSByYW5nZSBvcHRpb24uIFRoZSB0aHJlYWQgaW4KICAgdGhlIG1haWxpbmcgbGlzdCB0aGF0IHN0YXJ0ZWQgdGhpcyB3YXMgaW5pdGlhdGVkIGJ5IE1pY2hhZWwgQW50aS4KCiAtIEkgZ2V0IHJlcG9ydHMgYWJvdXQgbnJvZmYgY3Jhc2hlcyBvbiBzb2xhcmlzIDIuNisgd2hlbiBkaXNwbGF5aW5nIHRoZSBjdXJsCiAgIG1hbiBwYWdlLiBTd2l0Y2ggdG8gZ25yb2ZmIGluc3RlYWQsIGl0IGlzIHJlcG9ydGVkIHRvIHdvcmsoISkuIEFkYW0gQmFyY2xheQogICByZXBvcnRlZCBhbmQgYnJvdWdodCB0aGUgc3VnZ2VzdGlvbi4KCiAtIEluIGEgZGlhbG9ndWUgd2l0aCBKb2hhbm5lcyBHLiBLcmlzdGluc3NvbiB3ZSBjYW1lCiAgIHVwIHdpdGggdGhlIGlkZWEgdG8gbGV0IC1ILy0taGVhZGVyIHNwZWNpZmllZCBoZWFkZXJzIHJlcGxhY2UgdGhlCiAgIGludGVybmFsbHkgZ2VuZXJhdGVkIGhlYWRlcnMsIGlmIHlvdSBoYXBwZW5lZCB0byBzZWxlY3QgdG8gYWRkIGEgaGVhZGVyCiAgIHRoYXQgY3VybCBub3JtYWxseSB1c2VzIGJ5IGl0c2VsZi4gVGhlIGFkdmFudGFnZSB3aXRoIHRoaXMgaXMgbm90IGVudGlyZWx5CiAgIG9idmlvdXMsIGJ1dCBpbiBKb2hhbm5lcycgY2FzZSBpdCBtZWFucyB0aGF0IGhlIGNhbiB1c2UgYW5vdGhlciBIb3N0OiB0aGFuCiAgIHRoZSBvbmUgY3VybCB3b3VsZCBzZXQuCgogRGFuaWVsICgyNyBPY3RvYmVyIDE5OTkpOgogLSBKb25na2kgU3V3YW5kaSBicm91Z2h0IGEgbmljZSBwYXRjaCBmb3IgKHlldCBhbm90aGVyKSBjcmFzaCB3aGVuIGZvbGxvd2luZwogICBhIGxvY2F0aW9uOi4gVGhpcyB0aW1lIHlvdSBoYWQgdG8gZm9sbG93IGEgaHR0cHM6Ly8gc2VydmVyJ3MgcmVkaXJlY3QgdG8KICAgZ2V0IHRoZSBjb3JlLgoKVmVyc2lvbiA2LjIKCiBEYW5pZWwgKDIxIE9jdG9iZXIgMTk5OSk6CiAtIEkgdGhpbmsgSSBtYW5hZ2VkIHRvIHJlbW92ZSB0aGUgc3VzcGljaW91cyAobmlsKSB0aGF0IGhhcyBiZWVuIHNlZW4ganVzdAogICBiZWZvcmUgdGhlICJIb3N0OiIgaW4gSFRUUCByZXF1ZXN0cyB3aGVuIC12IHdhcyB1c2VkLgogLSBJIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBmb2xsb3dlZCBhIGxvY2F0aW9uOiB3aGVuIHVzaW5nIGEgcHJveHksIHdpdGhvdXQKICAgaGF2aW5nIHNwZWNpZmllZCBodHRwOi8vIGluIHRoZSBVUkwsIHRoZSBwcm90b2NvbCBwYXJ0IHdhcyBhZGRlZCBvbmNlIGFnYWluCiAgIHdoZW4gbW92aW5nIHRvIHRoZSBuZXh0IFVSTCEgKFRoZSBwcm90b2NvbCBwYXJ0IGhhcyB0byBiZSBhZGRlZCB0byB0aGUKICAgVVJMIHdoZW4gZ29pbmcgdGhyb3VnaCBhIHByb3h5IHNpbmNlIGl0IGhhcyBubyBwcm90b2NvbC1ndWVzc2luZyBzeXN0ZW0KICAgc3VjaCBhcyBjdXJsIGhhcy4pCiAtIEJlbmphbWluIFJpdGNleSByZXBvcnRlZCBhIGNvcmUgZHVtcCB1bmRlciBzb2xhcmlzIDIuNgogICB3aXRoIE9wZW5TU0wgMC45LjQuIEl0IHR1cm5lZCBvdXQgdGhpcyB3YXMgZHVlIHRvIGEgYmFkIGZyZWUoKSBpbiBtYWluLmMKICAgdGhhdCBvY2N1cnJlZCBhZnRlciB0aGUgZG93bmxvYWQgd2FzIGRvbmUgYW5kIGNvbXBsZXRlZC4KIC0gQmVuamFtaW4gZm91bmQgZnRwIGRvd25sb2FkcyB0byBzaG93IHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBkb3dubG9hZCBtZXRlcgogICB0byBnZXQgd3JpdHRlbiB0d2ljZSwgYW5kIEkgcmVtb3ZlZCB0aGF0IHByb2JsZW0uIEl0IHdhcyBpbnRyb2R1Y2VkIHdpdGgKICAgdGhlIG11bHRpcGxlIFVSTCBzdXBwb3J0LgogLSBEYW4gWml0dGVyIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IGN1cmwgNi4xIGFuZCBlYXJsaWVyIHZlcnNpb25zIGRpZG4ndAogICBob25vciBSRkMgMjYxNiBjaGFwdGVyIDQgc2VjdGlvbiAyLCAiTWVzc2FnZSBIZWFkZXJzIjogIi4uLkZpZWxkIG5hbWVzIGFyZQogICBjYXNlLWluc2Vuc2l0aXZlLi4uIiAgSFRUUCBoZWFkZXIgcGFyc2luZyBhc3N1bWVkIGEgY2VydGFpbiBjYXNpbmcuIERhbgogICBhbHNvIHByb3ZpZGVkIG1lIHdpdGggYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCB0aGlzLCB3aGljaCBJIHRvb2sgdGhlIGxpYmVydHkKICAgb2YgZWRpdGluZyBzbGlnaHRseS4KIC0gRGFuIFppdHRlciBhbHNvIHByb3ZpZGVkIGEgbmljZSBwYXRjaCBmb3IgY29uZmlnLmd1ZXNzIHRvIGJldHRlciByZWNvZ25pemUKICAgdGhlIE1hYyBPUyBYCiAtIERhbiBhbHNvIGNvcnJlY3RlZCBhIG1pbm9yIHByb2JsZW0gaW4gdGhlIGxpYi9NYWtlZmlsZSB0aGF0IGNhdXNlZCBsaW5raW5nCiAgIHRvIGZhaWwgb24gT1MgWC4KCiBEYW5pZWwgKDE5IE9jdG9iZXIgMTk5OSk6CiAtIExlbiBNYXJpbmFjY2lvIGNhbWUgdXAgd2l0aCBzb21lIHByb2JsZW1zIHdpdGggY3VybC4gIFNpbmNlIFdpbmRvd3MgaGFzIGEKICAgY3JpcHBsZWQgc2hlbGwsIGl0IGNhbid0IHJlZGlyZWN0IHN0ZGVyciBhbmQgdGhhdCBjYXVzZXMgdHJvdWJsZS4gSSBhZGRlZAogICAtLXN0ZGVyciB0b2RheSB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gcmVkaXJlY3QgdGhlIHN0ZGVyciBzdHJlYW0gdG8gYQogICBmaWxlIG9yIHN0ZG91dC4KCiBEYW5pZWwgKDE4IE9jdG9iZXIgMTk5OSk6CiAtIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyB1bmRlcnN0YW5kcyB0aGUgJy0td2l0aG91dC1zc2wnIGZsYWcsIHdoaWNoIG5vdwogICB0b3RhbGx5IGRpc2FibGUgU1NML2h0dHBzIHN1cHBvcnQuIFByZXZpb3VzbHkgaXQgd2Fzbid0IHBvc3NpYmxlIHRvIGZvcmNlCiAgIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGxlYXZlIFNTTCBhbG9uZS4gVGhlIHByZXZpb3VzIGZ1bmN0aW9uYWxpdHkgaGFzCiAgIGJlZW4gcmV0YWluZWQuIFRyb3kgRW5nZWwgaGVscGVkIHRlc3QgdGhpcyBuZXcgb25lLgoKVmVyc2lvbiA2LjEgKE9jdG9iZXIgMTcgMTk5OSkKCiBEYW5pZWwgKDE3IE9jdG9iZXIgMTk5OSk6CiAtIEkgaWZkZWYnZWQgb3IgY29tbWVudGVkIGFsbCB0aGUgemxpYiBzdHVmZiBpbiB0aGUgc291cmNlcyBhbmQgY29uZmlndXJlCiAgIHNjcmlwdC4gSXQgdHVybmVkIG91dCB3ZSBuZWVkZWQgdG8gbW9jayBtb3JlIHdpdGggemxpYiB0aGFuIEkgaW5pdGlhbGx5CiAgIHRob3VnaHQsIHRvIG1ha2UgaXQgY2FwYWJsZSBvZiBkb3dubG9hZGluZyBjb21wcmVzc2VkIEhUVFAgZG9jdW1lbnRzIGFuZAogICB1bmNvbXByZXNzIHRoZW0gb24gdGhlIGZseS4gSSBkaWRuJ3QgbWVhbiB0aGUgemxpYiBwYXJ0cyBvZiBjdXJsIHRvIGJlY29tZQogICBtb3JlIHRoYW4gbWlub3Igc28gdGhpcyBtZWFucyBJIGhhbHQgdGhlIHpsaWIgZXhwZWRpdGlvbiBmb3Igbm93IGFuZCB3YWl0CiAgIHVudGlsIHNvbWVvbmUgZWl0aGVyIHdyaXRlcyB0aGUgY29kZSBvciB6bGliIGdldHMgdXBkYXRlZCBhbmQgYmV0dGVyCiAgIGFkanVzdGVkIGZvciB0aGlzIGtpbmQgb2YgdXNhZ2UuICBJIHdvbid0IGdldCBpbnRvIGRldGFpbHMgaGVyZSwgYnV0IGEKICAgc2hvcnQgYSBzdW1tYXJ5IGlzIHN1aXRhYmxlOgogICAtIHpsaWIgY2FuJ3QgYXV0b21hdGljYWxseSBkZXRlY3Qgd2hldGhlciB0byB1c2UgemxpYiBvciBnemlwCiAgICAgZGVjb21wcmVzc2lvbiBtZXRob2RzLgogICAtIHpsaWIgaXMgdmVyeSBuZWF0IGZvciByZWFkaW5nIGd6aXBwZWQgZmlsZXMgZnJvbSBhIGZpbGUgZGVzY3JpcHRvciwKICAgICBhbHRob3VnaCBub3QgYXMgbmljZSBmb3IgcmVhZGluZyBidWZmZXItYmFzZWQgZGF0YSBzdWNoIGFzIHdlIHdvdWxkCiAgICAgd2FudCBpdC4KICAgLSB0aGVyZSBhcmUgc3RpbGwgc29tZSBwcm9ibGVtcyB3aXRoIHRoZSB3aW4zMiB2ZXJzaW9uIHdoZW4gcmVhZGluZyBmcm9tCiAgICAgYSBmaWxlIGRlc2NyaXB0b3IgaWYgdGhhdCBpcyBhIHNvY2tldAoKIERhbmllbCAoMTQgT2N0b2JlciAxOTk5KToKIC0gTW92ZWQgdGhlIChleHRlcm5hbCkgaW5jbHVkZSBmaWxlcyBmb3IgbGliY3VybCBpbnRvIGEgc3ViZGlyZWN0b3J5IG5hbWVkCiAgIGN1cmwgYW5kIGFkanVzdGVkIGFsbCAjaW5jbHVkZSBsaW5lcyB0byB1c2UgPGN1cmwvWFhYWD4gdG8gbWFpbnRhaW4gYQogICBiZXR0ZXIgbmFtZSBzcGFjZSBhbmQgY29udHJvbCBvZiB0aGUgaGVhZGVycy4gVGhpcyBoYXMgYmVlbiByZXF1ZXN0ZWQuCgogRGFuaWVsICgxMiBPY3RvYmVyIDE5OTkpOgogLSBJIG1vZGlmaWVkIHRoZSAnbWFrZXRneicgc2NyaXB0IHRvIHBlcmZvcm0gYSAnbWFrZScgdG9vIGJlZm9yZSBhIHJlbGVhc2UKICAgYXJjaGl2ZSBpcyBwdXQgdG9nZXRoZXIgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIHRoZSB0aW1lIHN0YW1wcyBiZXR0ZXIgYW5kCiAgIGhvcGVmdWxseSBhdm9pZCB0aGUgZG91YmxlIGNvbmZpZ3VyZS1ydW5uaW5nIHRoYXQgdXNlIHRvIG9jY3VyLgoKIERhbmllbCAoMTEgT2N0b2JlciAxOTk5KToKIC0gQXBwbGllZCBK9nJuJ3MgcGF0Y2hlcyB0aGF0IGZpeGVzIHpsaWIgZm9yIG1pbmd3MzIgY29tcGlsZXMgYXMgd2VsbCBhcwogICBzb21lIG90aGVyIG1pc3NpbmcgemxpYiAjaWZkZWYgYW5kIG1vcmUgdGV4dCBvbiB0aGUgbXVsdGlwbGUgVVJMIGRvY3MgaW4KICAgdGhlIG1hbiBwYWdlLgoKVmVyc2lvbiA2LjFiZXRhCgogRGFuaWVsICg2IE9jdG9iZXIgMTk5OSk6CiAtIERvdWdsYXMgRS4gV2Vnc2NoZWlkIHNlbnQgbWUgYSBwYXRjaCB0aGF0IG1hZGUgdGhlIGV4YWN0IHNhbWUgdGhpbmcgYXMgSQogICBqdXN0IG1hZGU6IHRoZSAtZCBzd2l0Y2ggaXMgbm93IGNhcGFibGUgb2YgcmVhZGluZyBwb3N0IGRhdGEgZnJvbSBhIG5hbWVkCiAgIGZpbGUgb3Igc3RkaW4uICBVc2UgaXQgc2ltaWxhcmx5IHRvIHRoZSAtRi4gVG8gcmVhZCB0aGUgcG9zdCBkYXRhIGZyb20gYQogICBnaXZlbiBmaWxlOgoKICAgICAgICBjdXJsIC1kIEBwYXRoL3RvL2ZpbGVuYW1lIHd3dy5wb3N0c2l0ZS5jb20KCiAgIG9yIGxldCBjdXJsIHJlYWQgaXQgb3V0IGZyb20gc3RkaW46CgogICAgICAgIGN1cmwgLWQgQC0gd3d3LnBvc3RpdC5jb20KCiBK9nJuIEhhcnRyb3RoICgzIE9jdG9iZXIgMTk5OSk6CiAtIEJyb3VnaHQgc29tZSBtb3JlIHBhdGNoZXMgZm9yIG11bHRpcGxlIFVSTCBmdW5jdGlvbmFsaXR5LiBUaGUgTUlNRQogICBzZXBhcmF0aW9uIGlkZWFzIGFyZSBhbG1vc3Qgc2NyYXBwZWQgbm93LCBhbmQgYSBjdXN0b20gc2VwYXJhdG9yIGlzIGJlaW5nCiAgIHVzZWQgaW5zdGVhZC4gVGhpcyBpcyBzdGlsbCBjb21waWxlLXRpbWUgImZsYWdnZWQiLgoKIERhbmllbAogLSBVcGRhdGVkIGN1cmwuMSB3aXRoIG11bHRpcGxlIFVSTCBpbmZvLgoKIERhbmllbCAoMzAgU2VwdGVtYmVyIDE5OTkpOgogLSBGZWxpeCB2b24gTGVpdG5lciBicm91Z2h0IG9wZW5zc2wtY2hlY2sgZml4ZXMgZm9yIGNvbmZpZ3VyZS5pbiB0byB3b3JrCiAgIG91dC1vZi10aGUtYm94IHdoZW4gdGhlIG9wZW5zc2wgZmlsZXMgYXJlIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtIGRlZmF1bHQKICAgZGlycy4KCiBEYW5pZWwgKDI4IFNlcHRlbWJlciAxOTk5KQogLSBBZGRlZCBsaWJ6IGZ1bmN0aW9uYWxpdHkuIFRoaXMgc2hvdWxkIGVuYWJsZSBkZWNvbXByZXNzaW5nIGd6aXAsIGNvbXByZXNzCiAgIG9yIGRlZmxhdGUgZW5jb2RpbmcgSFRUUCBkb2N1bWVudHMuIEl0IGFsc28gbWFrZXMgY3VybCBzZW5kIGFuIGFjY2VwdCB0aGF0CiAgIGl0IGFjY2VwdHMgdGhhdCBraW5kIG9mIGVuY29kaW5nLiBDb21wcmVzc2VkIGNvbnRlbnRzIHVzdWFsbHkgc2hvcnRlbnMKICAgZG93bmxvYWQgdGltZS4gSSAqbmVlZCogc29tZW9uZSB0byB0ZWxsIG1lIGEgc2l0ZSB0aGF0IHVzZXMgY29tcHJlc3NlZCBIVFRQCiAgIGRvY3VtZW50cyBzbyB0aGF0IEkgY2FuIHRlc3QgdGhpcyBvdXQgcHJvcGVybHkuCgogLSBBcyBhIHJlc3VsdCBvZiB0aGUgYWRkaW5nIG9mIHpsaWIgYXdhcmVuZXNzLCBJIGNoYW5nZWQgdGhlIHZlcnNpb24gc3RyaW5nCiAgIGEgbGl0dGxlLiBJIHBsYW4gdG8gYWRkIG9wZW5sZGFwIHZlcnNpb24gcmVwb3J0aW5nIGluIHRoZXJlIHRvby4KCiBEYW5pZWwgKDE3IFNlcHRlbWJlciAxOTk5KQogLSBNYWRlIHRoZSAtRiBvcHRpb24gYWxsb3cgc3RkaW4gd2hlbiBzcGVjaWZ5aW5nIGZpbGVzLiBCeSB1c2luZyAnLScgaW5zdGVhZAogICBvZiBmaWxlIG5hbWUsIHRoZSBkYXRhIHdpbGwgYmUgcmVhZCBmcm9tIHN0ZGluLgoKVmVyc2lvbiA2LjAgKFNlcHRlbWJlciAxNCAxOTk5KQoKIERhbmllbCAoMTMgU2VwdGVtYmVyIDE5OTkpCiAtIEFkZGVkIC1YLy0taHR0cC1yZXF1ZXN0IDxyZXF1ZXN0PiB0byBlbmFibGUgYW55IEhUVFAgY29tbWFuZCB0byBiZSBzZW50LgogICBEbyBub3QgdGhhdCB5b3VyIHNlcnZlciBoYXMgdG8gc3VwcG9ydCB0aGUgZXhhY3Qgc3RyaW5nIHlvdSBlbnRlci4gVGhpcwogICBzaG91bGQgcG9zc2libHkgYSBzdHJpbmcgbGlrZSBERUxFVEUgb3IgVFJBQ0UuCgogLSBBcHBsaWVkIERvdWdsYXMnIG1pbmd3MzItZml4ZXMgZm9yIHRoZSBtYWtlZmlsZXMuCgogRGFuaWVsICgxMCBTZXB0ZW1iZXIgMTk5OSkKIC0gRG91Z2xhcyBFLiBXZWdzY2hlaWQgcG9pbnRlZCBvdXQgYSBwcm9ibGVtLiBDdXJsIGRpZG4ndCBjaGVjayB0aGUgRlRQCiAgIHNlcnZlcnMgcmV0dXJuIGNvZGUgcHJvcGVybHkgYWZ0ZXIgdGhlIC0tcXVvdGUgY29tbWFuZHMgd2VyZSBpc3N1ZWQuIEl0CiAgIHRvb2sgYW55dGhpbmcgbm9uIDIwMCBhcyBhbiBlcnJvciwgd2hlbiBhbGwgMlhYIGNvZGVzIHNob3VsZCBiZSBhY2NlcHRlZCBhcwogICBPSy4KCiAtIFNlbmRpbmcgY29va2llcyB0byB0aGUgc2FtZSBzaXRlIGluIG11bHRpcGxlIGxpbmVzIGxpa2UgY3VybCB1c2VkIHRvIGRvCiAgIHR1cm5lZCBvdXQgdG8gYmUgYmFkIGFuZCBicmVha2luZyB0aGUgY29va2llIHNwZWNzLiBDdXJsIG5vdyBzZW5kcyBhbGwKICAgY29va2llcyBvbiBhIHNpbmdsZSBDb29raWU6IGxpbmUuIEN1cmwgaXMgbm90IHlldCBSRkMgMjEwOSBjb21wbGlhbnQsIGJ1dCBJCiAgIGRvdWJ0IHRoYXQgbWFueSBzZXJ2ZXJzIGRvIHVzZSB0aGF0IHN5bnRheCAoeWV0KS4KCiBEYW5pZWwgKDggU2VwdGVtYmVyIDE5OTkpCiAtIEr2cm4gaGVscGVkIG1lIG1ha2Ugc3VyZSBpdCBzdGlsbCBjb21waWxlcyBuaWNlbHkgd2l0aCBtaW5ndzMyIHVuZGVyIHdpbjMyLgoKIERhbmllbCAoNyBTZXB0ZW1iZXIgMTk5OSkKIC0gRlRQIHVwbG9hZCB0aHJvdWdoIHByb3h5IGlzIG5vdyB0dXJuZWQgaW50byBhIEhUVFAgUFVULiBSZXF1ZXN0ZWQgYnkKICAgU3RlZmFuIEthbnRoYWsuCgogLSBBZGRlZCB0aGUgbGRhcCBmaWxlcyB0byB0aGUgLm0zMiBtYWtlZmlsZS4KCiBEYW5pZWwgKDMgU2VwdGVtYmVyIDE5OTkpCiAtIE1hZGUgY29va2llIG1hdGNoaW5nIHdvcmsgd2hpbGUgdXNpbmcgSFRUUCBwcm94eS4KCiBCam9ybiBSZWVzZSAoMzEgQXVndXN0IDE5OTkpCiAtIFBhc3NlZCBoaXMgbGRhcDovLyBwYXRjaC4gTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgdGhlIG9wZW5sZGFwIHNoYXJlZAogICBsaWJyYXJ5IHRvIGJlIGluc3RhbGxlZCBhbmQgdGhhdCBMRF9MSUJSQVJZX1BBVEggcG9pbnRzIHRvIHRoZQogICBkaXJlY3Rvcnkgd2hlcmUgdGhlIGxpYiB3aWxsIGJlIGZvdW5kIHdoZW4gY3VybCBpcyBydW4gd2l0aCBhCiAgIGxkYXA6Ly8gVVJMLgoKIEr2cm4gSGFydHJvdGggKDMxIEF1Z3VzdCAxOTk5KQogLSBNYWRlIHRoZSBNaW5ndzMyIG1ha2VmaWxlcyBpbnRvIHNpbmdsZSBmaWxlcy4KIC0gTWFkZSBmaWxlOi8vIHdvcmsgZm9yIFdpbjMyLiBUaGUgc2FtZSBjb2RlIGlzIG5vdyB1c2VkIGZvciB1bml4IGFzIHdlbGwgZm9yCiAgIHBlcmZvcm1hbmNlIHJlYXNvbnMuCgogRG91Z2xhcyBFLiBXZWdzY2hlaWQgKDMwIEF1Z3VzdCAxOTk5KQogLSBQYXRjaGVkIHRoZSBNaW5ndzMyIG1ha2VmaWxlcyBmb3IgU1NMIGJ1aWxkcy4KCiBNYXR0aGV3IENsYXJrZSAoMzAgQXVndXN0IDE5OTkpCiAtIE1hZGUgYSBjb29sIHBhdGNoIGZvciBjb25maWd1cmUuaW4gdG8gYWxsb3cgLS13aXRoLXNzbCB0byBzcGVjaWZ5IHRoZQogICByb290IGRpciBvZiB0aGUgb3BlbnNzbCBpbnN0YWxsYXRpb24sIGFzIGluCgogICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1zc2w9L3Vzci9zc2xfaGVyZQoKIC0gQ29ycmVjdGVkIHRoZSAncmVjb25mJyBzY3JpcHQgdG8gd29yayBiZXR0ZXIgd2l0aCBzb21lIHNoZWxscy4KCiBK9nJuIEhhcnRyb3RoICgyNiBBdWd1c3QgMTk5OSkKIC0gRml4ZWQgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGluIGxpYi8gYW5kIGNvcnJlY3RlZCB0aGUgZmlsZS5jIGZvciB3aW4zMgogICBjb21waWxlcy4KClZlcnNpb24gNS4xMQoKIERhbmllbCAoMjUgQXVndXN0IDE5OTkpCiAtIEpvaG4gV2Vpc21pbGxlciBwb2ludGVkIG91dCBhIGJ1ZyBpbiB0aGUgaGVhZGVyLWxpbmUKICAgcmVhbGxvYygpIHN5c3RlbSBpbiBkb3dubG9hZC5jLgoKIC0gSSBhZGRlZCBsaWIvZmlsZS5bY2hdIHRvIG9mZmVyIGEgZmlyc3QsIHNpbXBsZSwgZmlsZTovLyBzdXBwb3J0LiBJdAogICBwcm9iYWJseSB3b24ndCBkbyBtdWNoIGdvb2Qgb24gd2luMzIgc3lzdGVtIGF0IHRoaXMgcG9pbnQsIGJ1dCBJIHNlZSBpdAogICBhcyBhIHN0YXJ0LgoKIC0gTWFkZSB0aGUgcmVsZWFzZSBhcmNoaXZlcyBnZXQgYSBNYWtlZmlsZSBpbiB0aGUgcm9vdCBkaXIsIHdoaWNoIGNhbiBiZQogICB1c2VkIHRvIHN0YXJ0IHRoZSBjb21waWxpbmcvYnVpbGRpbmcgcHJvY2VzcyBlYXNpZXIuIEkgaGF2ZW4ndCByZWFsbHkKICAgY2hhbmdlZCBhbnkgSU5TVEFMTCB0ZXh0IHlldCwgSSB3YW50ZWQgdG8gZ2V0IHNvbWUgZmVlZC1iYWNrIG9uIHRoaXMKICAgZmlyc3QuCgogRGFuaWVsICgxNyBBdWd1c3QgMTk5OSkKIC0gQW5vdGhlciBMb2NhdGlvbjogYnVnLiBDdXJsIGRpZG4ndCBkbyBwcm9wZXIgcmVsYXRpdmUgbG9jYXRpb25zIGlmIHRoZQogICBvcmlnaW5hbCBVUkwgaGFkIGNnaS1wYXJhbWV0ZXJzIHRoYXQgY29udGFpbmVkIGEgc2xhc2guIE51c3UncyBwYWdlCiAgIGFnYWluLgoKIC0gQ29ycmVjdGVkIHRoZSBOT19QUk9YWSB1c2FnZS4gSXQgaXMgYSBsaXN0IG9mIHN1YnN0cmluZ3MgdGhhdCBpZiBvbmUgb2YKICAgdGhlbSBtYXRjaGVzIHRoZSB0YWlsIG9mIHRoZSBob3N0IG5hbWUgaXQgc2hvdWxkIGNvbm5lY3QgdG8sIGN1cmwgc2hvdWxkCiAgIG5vdCB1c2UgYSBwcm94eSB0byBjb25uZWN0IHRoZXJlLiBQb2ludGVkIG91dCB0byBtZSBieSBEb3VnbGFzCiAgIEUuIFdlZ3NjaGVpZC4gIEkgYWxzbyBjaGFuZ2VkIHRoZSBSRUFETUUgdGV4dCBhIGxpdHRsZSByZWdhcmRpbmcgdGhpcy4KCiBEYW5pZWwgKDE2IEF1Z3VzdCAxOTk5KQogLSBGaXhlZCBhIG1lbW9yeSBidWcgd2l0aCBodHRwLXNlcnZlcnMgdGhhdCBzZW50IExvY2F0aW9uOiB0byBhIExvY2F0aW9uOgogICBwYWdlLiBOdXN1J3MgcGFnZSBzaG93ZWQgdGhpcyB0b28uCgogLSBNYWRlIGNvb2tpZXMgd29yayBhIGxvdCBiZXR0ZXIuIFNldHRpbmcgdGhlIHNhbWUgY29va2llIG5hbWUgc2V2ZXJhbCB0aW1lcwogICB1c2VkIHRvIGFkZCBtb3JlIGNvb2tpZXMgaW5zdGVhZCBvZiByZXBsYWNpbmcgdGhlIGZvcm1lciBvbmUgd2hpY2ggaXQKICAgc2hvdWxkJ3ZlLiBOdXN1IDxudXMgYXQgaW50ZXJnb3JqLnJvPiBicm91Z2h0IG1lIGFuIFVSTCB0aGF0IG1hZGUgdGhpcwogICBwYWluZnVsbHkgdmlzaWJsZS4uLgoKIFRyb3kgKDE1IEF1Z3VzdCAxOTk5KQogLSBCcm91Z2h0IG5ldyAuc3BlYyBmaWxlcyBhcyB3ZWxsIGFzIGEgcGF0Y2ggZm9yIGNvbmZpZ3VyZS5pbiB0aGF0IGxldHMgdGhlCiAgIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCB0aGUgb3BlbnNzbCBmaWxlcyBiZXR0ZXIsIGV2ZW4gd2hlbiB0aGUgaW5jbHVkZQogICBmaWxlcyBhcmUgaW4gL3Vzci9pbmNsdWRlL29wZW5zc2wKClZlcnNpb24gNS4xMAoKIERhbmllbCAoMTMgQXVndXN0IDE5OTkpCiAtIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKCkgaGFzIGJlZW4gbW9kaWZpZWQgaW4gdGhlIDAuOS40IHZlcnNpb24gb2YKICAgT3BlblNTTC4gTm93IHdoeSBjb3VsZG4ndCB0aGV5IHNpbXBseSBhZGQgYSAqbmV3KiBmdW5jdGlvbiBpbnN0ZWFkIG9mCiAgIG1vZGlmeWluZyB0aGUgcGFyYW1ldGVycyBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIGZ1bmN0aW9uPyBUaGlzIHdheSwgd2UgZ2V0CiAgIGEgY29tcGlsZXIgd2FybmluZyBpZiBjb21waWxpbmcgd2l0aCAwLjkuNCBidXQgbm90IHdpdGggZWFybGllci4gU28sIEkgaGFkCiAgIHRvIGNvbWUgdXAgd2l0aCBhICNpZiBjb25zdHJ1Y3Rpb24gdGhhdCBkZWFscyB3aXRoIHRoaXMuLi4KCiAtIE1hZGUgY3VybCBvdXRwdXQgdGhlIFNTTCB2ZXJzaW9uIG51bWJlciBnZXQgZGlzcGxheWVkIHByb3Blcmx5IHdpdGggMC45LjQuCgogVHJveSAoMTIgQXVndXN0IDE5OTkpCiAtIEFkZGVkIE1pbmdXMzIgKEdDQy0yLjk1KSBzdXBwb3J0IHVuZGVyIFdpbjMyLiBUaGUgSU5TVEFMTCBmaWxlIHdhcyBhbHNvCiAgIGEgYml0IHJlYXJyYW5nZWQuCiAKIERhbmllbCAoMTIgQXVndXN0IDE5OTkpCiAtIEkgaGFkIHRvIGNvcHkgYSBnb29kIDxhcnBhL3RlbG5ldC5oPiBpbmNsdWRlIGZpbGUgaW50byB0aGUgY3VybCBzb3VyY2UKICAgdHJlZSB0byBlbmFibGUgdGhlIHNpbGx5IHdpbjMyIHN5c3RlbXMgdG8gY29tcGlsZS4gVGhlIGRpc3RyaWJ1dGlvbiByaWdodHMKICAgYWxsb3dzIHVzIHRvIGRvIHRoYXQgYXMgbG9uZyBhcyB0aGUgZmlsZSByZW1haW5zIHVubW9kaWZpZWQuCgogLSBJIGNvcnJlY3RlZCBhIGZldyBtaW5vciB0aGluZ3MgdGhhdCBtYWRlIHRoZSBjb21waWxlciBjb21wbGFpbiB3aGVuCiAgIC1XYWxsIC1wZWRhbnRpYyB3YXMgdXNlZC4KCiAtIEknbSBtb3ZpbmcgdGhlIG9mZmljaWFsIGN1cmwgd2ViIHBhZ2UgdG8gaHR0cDovL2N1cmwuaGF4eC5udS4gSSB0aGluayBpdAogICB3aWxsIG1ha2UgaXQgZWFzaWVyIHRvIHJlbWVtYmVyIGFzIGl0IGlzIGEgbG90IHNob3J0ZXIgYW5kIGxlc3MgY3J5cHRpYy4KICAgVGhlIG9sZCBvbmUgc3RpbGwgd29ya3MgYW5kIHNob3dzIHRoZSBzYW1lIGluZm8uCgogRGFuaWVsICgxMSBBdWd1c3QgMTk5OSkKIC0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBtYWlsZWQgbWUgYW5vdGhlciBjb3JyZWN0aW9uIGZvciBOUk9GRiBpbiB0aGUKICAgY29uZmlndXJlLmluIHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgYmV0dGVyIGZvciBJUklYIHVzZXJzLgoKIERhbmllbCAoMTAgQXVndXN0IDE5OTkpCiAtIEFsYmVydCBDaGluLUEtWW91bmcgaGVscGVkIG1lIHdpdGggc29tZSBzdHVwaWQgTWFrZWZpbGUgdGhpbmdzLCBhcyB3ZWxsIGFzCiAgIHNvbWUgZmlkZGxpbmcgd2l0aCB0aGUgZ2V0ZGF0ZS5jIHN0dWZmIHRoYXQgaGUgaGFkIHByb2JsZW1zIHdpdGggdW5kZXIKICAgSFAtVVggdjEwLiBnZXRkYXRlLnkgd2lsbCBub3cgYmUgY29tcGlsZWQgaW50byBnZXRkYXRlLmMgaWYgdGhlIGFwcHJvcHJpYXRlCiAgIHlhY2Mgb3IgYmlzb24gaXMgZm91bmQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuIFNpbmNlIHRoaXMgaXMgc2xpZ2h0bHkgbmV3LAogICB3ZSBuZWVkIHRvIHRlc3QgdGhlIG91dHB1dCBnZXRkYXRlLmMgd2l0aCB3aW4zMiBzeXN0ZW1zIHRvIG1ha2Ugc3VyZSBpdAogICBzdGlsbCBjb21waWxlcyB0aGVyZS4KCiBEYW5pZWwgKDUgQXVndXN0IDE5OTkpCiAtIEkndmUganVzdCBzZXR1cCBhIG5ldyBtYWlsaW5nIGxpc3Qgd2l0aCB0aGUgaW50ZW50aW9uIHRvIGtlZXAgZGlzY3Vzc2lvbnMKICAgYXJvdW5kIGxpYmN1cmwgZGV2ZWxvcG1lbnQgaW4gaXQuIEkgbWFpbmx5IGV4cGVjdCBpdCB0byBiZSBmb3IgdGhvdWdodHMgYW5kCiAgIGJyYWluc3Rvcm1pbmcgYXJvdW5kIGEgIm5leHQgZ2VuZXJhdGlvbiIgbGlicmFyeSwgcmF0aGVyIHRoYW4gbml0cGlja2luZwogICBhYm91dCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvciBkZXRhaWxzIGluIHRoZSBjdXJyZW50IGxpYmN1cmwuCgogICBUbyBqb2luIG91ciBoYXBweSBidW5jaCBvZiBmdXR1cmUtbG9va2luZyBnZWVrcywgZW50ZXIgJ3N1YnNjcmliZQogICA8YWRkcmVzcz4nIGluIHRoZSBib2R5IG9mIGEgbWFpbCBhbmQgc2VuZCBpdCB0bwogICBsaWJjdXJsLXJlcXVlc3RAbGlzdHNlcnYuZnRzLmZyb250ZWMuc2UuICBDdXJsIGJ1ZyByZXBvcnRzLCB0aGUgdXN1YWwgY3VybAogICB0YWxrIGFuZCBldmVyeXRoaW5nIGVsc2Ugc2hvdWxkIHN0aWxsIGJlIGtlcHQgaW4gdGhpcyBtYWlsaW5nIGxpc3QuIEkndmUKICAgc3RhcnRlZCB0byBhcmNoaXZlIHRoaXMgbWFpbGluZyBsaXN0IGFuZCBoYXZlIHB1dCB0aGUgbGliY3VybCB3ZWIgcGFnZSBhdAogICB3d3cuZnRzLmZyb250ZWMuc2UvfmRhc3QvbGliY3VybC8uCgogLSBTdGVmYW4gS2FudGhhayBjb250YWN0ZWQgbWUgcmVnYXJkaW5nIGEgZmV3IHByb2JsZW1zIGluIHRoZSBjb25maWd1cmUKICAgc2NyaXB0IHdoaWNoIGhlIGRpc2NvdmVyZWQgd2hlbiB0cnlpbmcgdG8gbWFrZSBjdXJsIGNvbXBpbGUgYW5kIGJ1aWxkIHVuZGVyCiAgIFNpZW1lbnMgU0lOSVgtWiBWNS40MkIyMDA0IQoKIC0gTWFyY3VzIEtsZWluIHZlcnkgYWNjdXJhdGVseSBpbmZvcm1lZCBtZSB0aGF0IHNyYy92ZXJzaW9uLmggd2FzIG5vdCBwcmVzZW50CiAgIGluIHRoZSBDVlMgcmVwb3NpdG9yeS4gT2gsIGhvdyBzaWxseS4uLgoKIC0gTGludXMgTmllbHNlbiByZXdyb3RlIHRoZSB0ZWxuZXQ6Ly8gcGFydCBhbmQgbm93IGN1cmwgb2ZmZXJzIGxpbWl0ZWQgdGVsbmV0CiAgIHN1cHBvcnQuIElmIHlvdSBydW4gY3VybCBsaWtlICdjdXJsIHRlbG5ldDovL2hvc3QnIHlvdSdsbCBnZXQgYWxsIG91dHB1dCBvbgogICB0aGUgc2NyZWVuIGFuZCBjdXJsIHdpbGwgcmVhZCBpbnB1dCBmcm9tIHN0ZGluLiBZb3UnbGwgYmUgYWJsZSB0byBsb2dpbiBhbmQKICAgcnVuIGNvbW1hbmRzIGV0YywgYnV0IHNpbmNlIHRoZSBvdXRwdXQgaXMgYnVmZmVyZWQsIGV4cGVjdCB0byBnZXQgYSBsaXR0bGUKICAgd2VpcmQgb3V0cHV0LgoKICAgVGhpcyBpcyBzdGlsbCBpbiBpdHMgaW5mYW5jeSBhbmQgaXQgbWlnaHQgZ2V0IGNoYW5nZWQuIFdlIG5lZWQgeW91cgogICBmZWVkLWJhY2sgYW5kIGlucHV0IGluIGhvdyB0aGlzIGlzIGJlc3QgZG9uZS4KCiAgIFdJTjMyIE5PVEU6IEkgYmV0IHdlJ2xsIGdldCBwcm9ibGVtcyB3aGVuIHRyeWluZyB0byBjb21waWxlIHRoZSBjdXJyZW50CiAgIGxpYi90ZWxuZXQuYyBvbiB3aW4zMiwgYnV0IEkgdGhpbmsgd2UgY2FuIHNvcnQgdGhlbSBvdXQgaW4gdGltZS4KCiAtIERhdmlkIFNhbmRlcnNvbiByZXBvcnRlZCB0aGF0IEZPUkNFX0FMTE9DQV9IIG9yIEhBVkVfQUxMT0NBX0ggbXVzdCBiZQogICBkZWZpbmVkIGZvciBnZXRkYXRlLmMgdG8gY29tcGlsZSBwcm9wZXJseSBvbiBIUC1VWCAxMS4wLiBJIHVwZGF0ZWQgdGhlCiAgIGNvbmZpZ3VyZSBzY3JpcHQgdG8gY2hlY2sgZm9yIGFsbG9jYS5oIHdoaWNoIHNob3VsZCBtYWtlIGl0LgoKIERhbmllbCAoNCBBdWd1c3QgMTk5OSkKIC0gSSBmaW5hbGx5IGdvdCB0byB1bmRlcnN0YW5kIE1hcmN1cyBLbGVpbidzIGZ0cCBkb3dubG9hZCByZXN1bWUgcHJvYmxlbSwKICAgd2hpY2ggdHVybnMgb3V0IHRvIGJlIGR1ZSB0byBkaWZmZXJlbnQgb3V0cHV0cyBmcm9tIGRpZmZlcmVudCBmdHAKICAgc2VydmVycy4gSXQgbWFrZXMgZnRwIGRvd25sb2FkIHJlc3VtaW5nIGEgbGl0dGxlIHRyaWNraWVyLCBidXQgSSd2ZSBtYWRlCiAgIHNvbWUgbW9kaWZpY2F0aW9ucyBJIHJlYWxseSBiZWxpZXZlIHdpbGwgd29yayBmb3IgbW9zdCBmdHAgc2VydmVycyBhbmQgSSBkbwogICBob3BlIHlvdSByZXBvcnQgaWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCB0aGlzIQoKIC0gQWRkZWQgdGV4dCBhYm91dCBmaWxlIHRyYW5zZmVyIHJlc3VtaW5nIHRvIFJFQURNRS5jdXJsLgoKIERhbmllbCAoMiBBdWd1c3QgMTk5OSkKIC0gQXBwbGllZCBhIHByb2dyZXNzLWJhciBwYXRjaCBmcm9tIExhcnMgSi4gQWFzLiBJdCBvZmZlcnMKICAgYSBuZXcgc3R5bGVkIHByb2dyZXNzIGJhciBlbmFibGVkIHdpdGggLSMvLS1wcm9ncmVzcy1iYXIuIAoKIFQuIFlhbWFkYSA8dGFpIGF0IGltYXN5Lm9yLmpwPiAoMzAgSnVseSAxOTk5KQogLSBJdCBicmVha3Mgd2l0aCBzZWdmYXVsdCB3aGVuIDEpIGN1cmwgaXMgdXNpbmcgLm5ldHJjIHRvIG9idGFpbgogICB1c2VybmFtZS9wYXNzd29yZCAob3B0aW9uICctbicpLCBhbmQgMikgaXMgYXV0b21hdGljYWxseSByZWRpcmVjdGVkIHRvCiAgIGFub3RoZXIgbG9jYXRpb24gKG9wdGlvbiAnLUwnKS4KCiAgIFRoZXJlIGlzIGEgc21hbGwgYnVnIGluIGxpYi91cmwuYyAoYmxvY2sgc3RhcnRpbmcgZnJvbSBsaW5lIDY0MSksIHdoaWNoCiAgIHRyaWVzIHRvIHRha2Ugb3V0IHVzZXJuYW1lL3Bhc3N3b3JkIGZyb20gdXNlci0gc3VwcGxpZWQgY29tbWFuZC1saW5lCiAgIGFyZ3VtZW50ICgnLXUnIG9wdGlvbikuIFRoaXMgYmxvY2sgaXMgbmV2ZXIgZXhlY3V0ZWQgb24gZmlyc3QgYXR0ZW1wdCBzaW5jZQogICBDT05GX1VTRVJQV0QgYml0IGlzbid0IHNldCBhdCBmaXJzdCwgYnV0IGN1cmwgbGF0ZXIgdHVybnMgaXQgb24gd2hlbiBpdAogICBjaGVja3MgZm9yIENPTkZfTkVUUkMgYml0LiBTbyB3aGVuIGN1cmwgdHJpZXMgdG8gcmVkbyBldmVyeXRoaW5nIGR1ZSB0bwogICByZWRpcmVjdGlvbiwgaXQgc2VnZmF1bHRzIHRyeWluZyB0byBhY2Nlc3MgKmRhdGEtPnVzZXJwd2QuCgpWZXJzaW9uIDUuOS4xCgogRGFuaWVsICgzMCBKdWx5IDE5OTkpCiAtIFN0ZXZlIFdhbGNoIHBvaW50ZWQgb3V0IHRoYXQgdGhlcmUgaXMgYSBtZW1vcnkgbGVhayBpbiB0aGUgZm9ybWRhdGEKICAgZnVuY3Rpb25zLiBJIGFkZGVkIGEgRm9ybUZyZWUoKSBmdW5jdGlvbiB0aGF0IGlzIG5vdyB1c2VkIGFuZCBzdXBwb3NlZCB0bwogICBjb3JyZWN0IHRoaXMgZmxhdy4KCiAtIE1hcmsgV290dG9uIHJlcG9ydGVkOgogICAnY3VybCAtTCBodHRwczovL3d3dy5jd2EuY29tLmF1LycgY29yZSBkdW1wcy4gIEkgbWFuYWdlZCB0byBjdXJlIHRoaXMgYnkKICAgY29ycmVjdGluZyB0aGUgY2xlYW51cCBwcm9jZWR1cmUuIFRoZSBidWcgc2VlbXMgdG8gYmUgZ29uZSB3aXRoIG15IE9wZW5TU0wKICAgMC45LjJiLCBhbHRob3VnaCBzdGlsbCBvY2N1cnMgd2hlbiBJIHJ1biB0aGUgfjEwMCB5ZWFycyBvbGQgU1NMZWF5IDAuOC4wLiBJCiAgIGRvbid0IGtub3cgd2hldGhlciBpdCBpcyBjdXJsIG9yIFNTTGVheSB0aGF0IGlzIHRvIGJsYW1lIGZvciB0aGF0LgoKIC0gTWFyY3VzIEtsZWluOgogICBSZXBvcnRlZCBhbiBGVFAgdXBsb2FkIHJlc3VtZSBidWcgdGhhdCBJIHJlYWxseSBjYW4ndCByZXBlYXQgbm9yIHVuZGVyc3RhbmQuCiAgIEkgbGVhdmUgaXQgaGVyZSBzbyB0aGF0IGl0IHdvbid0IGJlIGZvcmdvdHRlbi4KCiBEYW5pZWwgKDI5IEp1bHkgMTk5OSkKIC0gQ29zdHlhIFNodWx5dXBpbiBzdWdnZXN0ZWQgc3VwcG9ydCBmb3IgbG9uZ2VyIFVSTHMgd2hlbiBmb2xsb3dpbmcgTG9jYXRpb246CiAgIGFuZCBJIGNvdWxkIG9ubHkgYWdyZWUgYW5kIGZpeCBpdCEKCiAtIExlaWdoIFB1cmRpZSBmb3VuZCBhIHByb2JsZW0gaW4gdGhlIHVwbG9hZC9QT1NUIGRlcGFydG1lbnQuIEl0IHR1cm5lZCBvdXQKICAgdGhhdCBodHRwLmMgYWNjaWRlbnRhbHkgY2xlYXJlZCB0aGUgcG9pbnRlciBpbnN0ZWFkIG9mIHRoZSBieXRlIGNvdW50ZXIKICAgd2hlbiBzdXBwb3NlZCB0by4KCiAtIENvc3R5YSBTaHVseXVwaW4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggcG9ydCBudW1iZXJzIGFuZCBMb2NhdGlvbjouIElmCiAgIHlvdSBoYWQgYSBzZXJ2ZXIgYXQgYSBub24tc3RhbmRhcmQgcG9ydCB0aGF0IHJlZGlyZWN0ZWQgdG8gYW4gVVJMIHVzaW5nIGEKICAgc3RhbmRhcmQgcG9ydCBudW1iZXIsIGN1cmwgc3RpbGwgdXNlZCB0aGF0IGZpcnN0IHBvcnQgbnVtYmVyLgoKIC0gUmFscGggQmVja21hbm4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdoZW4gdXNpbmcgYm90aCBDT05GX0ZPTExPV0xPQ0FUSU9OCiAgIGFuZCBDT05GX0ZBSUxPTkVSUk9SIHNpbXVsdGFuZW91c2x5LiBTaW5jZSB0aGUgQ09ORl9GQUlMT05FUlJPUiBleGl0cyBvbgogICB0aGUgMzAyLWNvZGUgdGhhdCB0aGUgZm9sbG93IGxvY2F0aW9uIGhlYWRlciBvdXRwdXRzIGl0IHdpbGwgbmV2ZXIgc2hvdyBhbnkKICAgaHRtbCBvbiBsb2NhdGlvbjogcGFnZXMuIEkgaGF2ZSBub3cgbWFkZSBpdCBsb29rIGZvciA+PTQwMCBjb2RlcyBpZgogICBDT05GX0ZPTExPV0xPQ0FUSU9OIGlzIHNldC4KCiAtICdzdHJ1Y3Qgc2xpc3QnIGlzIG5vdyByZW5hbWVkIHRvICdzdHJ1Y3QgY3VybF9zbGlzdCcgKGFzIHN1Z2dlc3RlZCBieSBSYWxwaAogICBCZWNrbWFubikuCgogLSBKb3NodWEgU3dpbmsgYW5kIFJpY2sgV2VseWtvY2h5IHdlcmUgdGhlIGZpcnN0IHRvIHBvaW50IG91dCB0byBtZSB0aGF0IHRoZQogICBsYXRlc3QgT3BlblNTTCBwYWNrYWdlIG5vdyBoYXZlIG1vdmVkIHRoZSBzdGFuZGFyZCBpbmNsdWRlIHBhdGguIEl0IGlzIG5vdwogICBpbiAvdXNyL2xvY2FsL3NzbC9pbmNsdWRlL29wZW5zc2wgYW5kIEkgaGF2ZSBub3cgbW9kaWZpZWQgdGhlIC0tZW5hYmxlLXNzbAogICBvcHRpb24gZm9yIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHVzZSB0aGF0IGFzIHRoZSBwcmltYXJ5IHBhdGgsIGFuZCBJCiAgIGxlYXZlIHRoZSBmb3JtZXIgcGF0aCB0b28gdG8gd29yayB3aXRoIG9sZGVyIHBhY2thZ2VzIG9mIE9wZW5TU0wgdG9vLgoKIERhbmllbCAoOSBKdW5lIDE5OTkpCiAtIEkgZmluYWxseSB1bmRlcnN0b29kIHRoZSBJUklYIHByb2JsZW0gYW5kIG5vdyBpdCBzZWVtIHRvIGNvbXBpbGUgb24gaXQhCiAgIEkgYW0gZ29ubmEgcmVtb3ZlIHRob3NlICNkZWZpbmUgc3RyY2FzZWNtcCgpIHRoaW5ncyBvbmNlIGFuZCBmb3IgYWxsIG5vdy4KCiBEYW5pZWwgKDQgSnVuZSAxOTk5KQogLSBJIGFkanVzdGVkIHRoZSBGVFAgcmVwbHkgMjI3IHBhcnNlciB0byBtYWtlIHRoZSBQQVNWIGNvbW1hbmQgd29yayBiZXR0ZXIKICAgd2l0aCBtb3JlIGZ0cCBzZXJ2ZXJzLiBBcHBlYXJhbnRseSB0aGUgUm94ZW4gQ2hhbGxhbmdlciBzZXJ2ZXIgcmVwbGllZAogICBzb21ldGhpbmcgY3VybCA1LjkgY291bGQgZGVhbCB3aXRoISA6LSggUmVwb3J0ZWQgYnkgQXNobGV5IFJlaWQtTW9udGFuYXJvCiAgIGFuZCBNYXJrIEJ1dGxlciBicm91Z2h0IGEgc29sdXRpb24gZm9yIGl0LgoKIERhbmllbCAoMjYgTWF5IDE5OTkpCiAtIFJlYXJyYW5nZWQuIFJFQURNRSBpcyBuZXcsIHRoZSBvbGQgb25lIGlzIG5vdyBSRUFETUUuY3VybCBhbmQgSSBhZGRlZCBhCiAgIFJFQURNRS5saWJjdXJsIHdpdGggdGV4dCBJIGdvdCBmcm9tIFJhbHBoIEJlY2ttYW5uLgoKIC0gSSBhbHNvIHVwZGF0ZWQgdGhlIElOU1RBTEwgdGV4dC4KCiBEYW5pZWwgKDI1IE1heSAxOTk5KQogLSBEYXZpZCBKb25hdGhhbiBMb3dza3kgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCBkaWRuJ3QgcHJvcGVybHkgZGVhbAogICB3aXRoIGZvcm0gcG9zdGluZyB3aGVyZSB0aGUgdmFyaWFibGUgc2hvdWxkbid0IGhhdmUgYW55IGNvbnRlbnQsIGFzIGluIGN1cmwKICAgLUYgImZvcm09IiB3d3cuc2l0ZS5jb20uIEl0IHdhcyBub3cgZml4ZWQuCgpWZXJzaW9uIDUuOSAoTWF5IDIyIDE5OTkpCgogRGFuaWVsICgyMiBNYXkgMTk5OSkKIC0gSSd2ZSBnb3QgYSBidWcgcmVwb3J0IGZyb20gQWFyb24gU2NhcmlzYnJpY2sgaW4gd2hpY2ggaGUgc3RhdGVzIGhlIGhhcyBzb21lCiAgIHByb2JsZW1zIHdpdGggLUwgdW5kZXIgRnJlZUJTRCAzLjAuIEkgaGF2ZSBwcmV2aW91c2x5IGdvdCBhbm90aGVyIGJ1ZwogICByZXBvcnQgZnJvbSBTdGVmYW4gR3JldGhlciB3aGljaCBwb2ludHMgYXQgYW4gZXJyb3Igd2l0aCBzaW1pbGFyIHN5bXB0aG9tcwogICB3aGVuIHVzaW5nIHdpbjMyLiBJIG1hZGUgdGhlIGFsbG9jYXRpb24gb2YgdGhlIG5ldyB1cmwgc3RyaW5nIGEgYml0IGZhc3RlcgogICBhbmQgZGlmZmVyZW50LCBkb24ndCBrbm93IGlmIGl0IGFjdHVhbGx5IGltcHJvdmVzIGFueXRoaW5nIHRob3VnaC4uLgoKIERhbmllbCAoMjAgTWF5IDE5OTkpCiAtIE1hZGUgdGhlIGNvb2tpZSBwYXJzZXIgZGVhbCB3aXRoIENSTEYgbmV3bGluZXMgdG9vLgoKIERhbmllbCAoMTkgTWF5IDE5OTkpCiAtIERvd25sb2FkKCkgZGlkbid0IHByb3Blcmx5IGRlYWwgd2l0aCBmYWlsaW5nIHJldHVybiBjb2RlcyBmcm9tIHRoZSBzcmVhZCgpCiAgIGZ1bmN0aW9uLiBBZGFtIENveW5lIGZvdW5kIHRoZSBwcm9ibGVtIGluIHRoZSB3aW4zMiB2ZXJzaW9uLCBhbmQgVHJveSBFbmdlbAogICBoZWxwZWQgbWUgb3V0IGlzb2xhdGluZyBpdC4KCiBEYW5pZWwgKDE2IE1heSAxOTk5KQogLSBSaWNoYXJkIEFkYW1zIHBvaW50ZWQgb3V0IGEgYnVnIEkgaW50cm9kdWNlZCBpbiA1LjguIC0tZHVtcC1oZWFkZXIgZG9lc24ndAogICB3b3JrIGFueW1vcmUhIDotLyBJIGZpeGVkIGl0IG5vdy4KCiAtIEFmdGVyIGEgc3VnZ2VzdGlvbiBieSBKb3NodWEgU3dpbmsgSSBhZGRlZCAtUyAvIC0tc2hvdy1lcnJvciB0byBmb3JjZSBjdXJsCiAgIHRvIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2UgaW4gY2FzZSBvZiBhbiBlcnJvciwgZXZlbiBpZiAtcy8tLXNpbGVudCB3YXMKICAgdXNlZC4KCiBEYW5pZWwgKDEwIE1heSAxOTk5KQogLSBJIG1vdmVkIHRoZSBzdHVmZiBjb25jZXJuaW5nIEhUVFAsIERJQ1QgYW5kIFRFTE5FVCBpdCB0aGVpciBvd24gc291cmNlCiAgIGZpbGVzIG5vdy4gSXQgaXMgYSBiZWdpbm5pbmcgb24gbXkgY2xlYW4tdXAgb2YgdGhlIHNvdXJjZXMgdG8gbWFrZSB0aGVtCiAgIGxheWVyIGFsbCB0aG9zZSBwcm90b2NvbHMgYmV0dGVyIHRvIGVuYWJsZSBtb3JlIHRvIGJlIGFkZGVkIGVhc2llciBpbiB0aGUKICAgZnV0dXJlIQoKIC0gTGVvbiBCcmVlZHQgc2VudCBtZSBzb21lIGZpbGVzIEkndmUgbm90IHB1dCBpbnRvIHRoZSBtYWluIGN1cmwKICAgYXJjaGl2ZS4gVGhleSdyZSBmb3IgY3JlYXRpbmcgdGhlIERlYmlhbiBwYWNrYWdlIHRoaW5naWUuIEhlIGFsc28gc2VudCBtZSBhCiAgIGRlYmlhbiBwYWNrYWdlIHRoYXQgSSd2ZSBtYWRlIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYXQgdGhlIHdlYiBwYWdlCgogRGFuaWVsICg5IE1heSAxOTk5KQogLSBNYWRlIGl0IGNvbXBpbGUgb24gY3lnd2luIHRvby4KCiBUcm95IEVuZ2VsICg3IE1heSAxOTk5KQogLSBCcm91Z2h0IGEgc2VyaWVzIG9mIHBhdGNoZXMgdG8gYWxsb3cgY3VybCB0byBjb21waWxlIHNtb290aGx5IG9uIE1TVkMrKyA2CiAgIGFnYWluIQoKIERhbmllbCAoNiBNYXkgMTk5OSkKIC0gSSBjaGFuZ2VkIHRoZSAjaWZkZWYgSEFWRV9TVFJGVElNRSBwbGFjZW1lbnQgZm9yIHRoZSAteiBjb2RlIHNvIHRoYXQgaXQKICAgd2lsbCBiZSBlYXNpZXIgdG8gZGlzY292ZXIgc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgdGhhdCBmdW5jdGlvbiBhbmQgdGh1cwogICBjYW4ndCB1c2UgLXogc3VjY2Vzc2Z1bGx5LiBNYWRlIHRoZSBzdHJmdGltZSgpIGdldCB1c2VkIGlmIFdJTjMyIGlzIGRlZmluZWQKICAgdG9vLgoKVmVyc2lvbiA1LjgKCiBEYW5pZWwgKDUgTWF5IDE5OTkpCiAtIEkndmUgaGFkIGl0IHdpdGggdGhpcyBhdXRvY29uZi9hdXRvbWFrZSBtZXNzLiBJdCBzZWVtcyB0byB3b3JrIGFsbHJpZ2h0CiAgIGZvciBtb3N0IHBlb3BsZSB3aG8gZG9uJ3QgaGF2ZSBhdXRvbWFrZSBpbnN0YWxsZWQsIGJ1dCBmb3IgdGhvc2Ugd2hvIGhhdmUKICAgdGhlcmUgYXJlIHByb2JsZW1zIGFsbCBvdmVyLgoKICAgSSd2ZSBnb3QgbGlrZSBmaXZlIGRpZmZlcmVudCBidWcgcmVwb3J0cyBvbiB0aGlzIG9ubHkgdGhlIGxhc3QKICAgd2Vlay4uLiBDbGF1ZGlvIE5ldmVzIGFuZCBGZWRlcmljbyBCaWFuY2hpIGFuZCByb290IDxkdWdnZXJqMDAxIGF0CiAgIGhhd2FpaS5yci5jb20+IGFyZSBzb21lIG9mIHRoZW0gcmVwb3J0aW5nIHRoaXMuCgogICBDdXJyZW50bHksIEkgaGF2ZSBubyByZWFsbHkgZ29vZCBmaXggc2luY2UgSSB3YW50IHRvIHVzZSBhdXRvbWFrZSBteXNlbGYgdG8KICAgZ2VuZXJhdGUgdGhlIE1ha2VmaWxlLmluIGZpbGVzLiBJJ3ZlIGZvdW5kIG91dCB0aGF0IHRoZSBAU0hFTExALXByb2JsZW1zCiAgIGNhbiBvZnRlbiBiZSBmaXhlZCBieSBtYW51YWxseSBpbnZva2luZyAnYXV0b21ha2UnIGluIHRoZSBhcmNoaXZlIHJvb3QKICAgYmVmb3JlIHlvdSBydW4gLi9jb25maWd1cmUuLi4gSSd2ZSBoYWNrZWQgbXkgbWFrZXRneiBzY3JpcHQgbm93IHRvIGZpZGRsZQogICBhIGJpdCB3aXRoIHRoaXMgYW5kIG15IHRlc3RzIHNlZW0gdG8gd29yayBiZXR0ZXIgdGhhbiBiZWZvcmUgYXQgbGVhc3QhCgogRGFuaWVsICg0IE1heSAxOTk5KQogLSBta2hlbHAucGwgaGFzIGJlZW4gZG9pbmcgYmFkbHkgbGF0ZWx5LiBJIGNvcnJlY3RlZCBhIGNhc2UgcHJvYmxlbSBpbgogICB0aGUgcmVnZXhlcy4KCiAtIEkndmUgbm93IHJlbWFkZSB0aGUgLW8gb3B0aW9uIHRvIG5vdCB0b3VjaCB0aGUgZmlsZSB1bmxlc3MgaXQgbmVlZHMgdG8uCiAgIEkgaGFkIHRvIGRvIHRoaXMgdG8gbWFrZSAteiBvcHRpb24gcmVhbGx5IGZpbmUsIHNpbmNlIG5vdyB5b3UgY2FuIG1ha2UgYQogICBjdXJsIGZldGNoIGFuZCB1c2UgYSBsb2NhbCBjb3B5J3MgdGltZSB3aGVuIGRvd25sb2FkaW5nIHRvIHRoYXQgZmlsZSwgYXMKICAgaW46CgogICAgICAgIGN1cmwgLXogZHVtcCAtbyBkdW1wIHJlbW90ZS5zaXRlLmNvbS9maWxlLmh0bWwKCiAgIFRoaXMgd2lsbCBvbmx5IGdldCB0aGUgZmlsZSBpZiB0aGUgcmVtb3RlIG9uZSBpcyBuZXdlciB0aGFuIHRoZSBsb2NhbC4KICAgSSdtIGF3YXJlIHRoYXQgdGhpcyBhbHRlcnMgcHJldmlvdXMgYmVoYXZpb3VyIGEgbGl0dGxlLiBTb21lIHNjcmlwdHMgb3V0CiAgIHRoZXJlIG1heSBkZXBlbmQgb24gdGhhdCB0aGUgZmlsZSBpcyBhbHdheXMgdG91Y2hlZC4uLgoKIC0gQ29ycmVjdGVkIGEgYnVnIGluIHRoZSBTU0x2Mi92MyBzZWxlY3Rpb24uCgogLSBGZWxpeCB2b24gTGVpdG5lciByZXF1ZXN0ZWQgdGhhdCBjdXJsIHNob3VsZCBiZSBhYmxlIHRvIHNlbmQKICAgIklmLU1vZGlmaWVkLVNpbmNlIiBoZWFkZXJzLCB3aGljaCBpbmRlZWQgaXMgYSBmYWlyIGlkZWEuICBJIGltcGxlbWVudGVkIGl0CiAgIHJpZ2h0IGF3YXkhIFRyeSAteiA8ZXhwcmVzc2lvbj4gd2hlcmUgZXhwcmVzc2lvbiBpcyBhIGZ1bGwgR05VIGRhdGUKICAgZXhwcmVzc2lvbiBvciBhIGZpbGUgbmFtZSB0byBnZXQgdGhlIGRhdGUgZnJvbSEKCiBTdGVwaGFuIExhZ2VyaG9sbSAoMzAgQXByIDE5OTkpCiAtIFBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIHRoZSBzcmMvTWFrZWZpbGUgZm9yIEZyZWVCU0QuIFRoZSBSTSB2YXJpYWJsZQogICBpc24ndCBzZXQgYW5kIGNhdXNlcyB0aGUgbWFrZSB0byBmYWlsLgoKIERhbmllbCAoMjYgQXByaWwgMTk5OSkKIC0gQW0gSSBzaWxseSBvciB3aGF0PyBJcnZpbmcgV29sZmUgcG9pbnRlZCBvdXQgdG8gbWUgdGhhdCB0aGUgY3VybCB2ZXJzaW9uCiAgIG51bWJlciB3YXMgbm90IHNldCBwcm9wZXJseS4gSGFzbid0IGJlZW4gc2luY2UgNS42LiBUaGlzIHdhcyBkdWUgdG8gYSBidWcKICAgaW4gbXkgbWFrZXRneiBzY3JpcHQhCgogRGF2aWQgRXJpa3Nzb24gKDI1IEFwciAxOTk5KQogLSBGb3VuZCBhIGJ1ZyBpbiBjb29raWVzLmMgdGhhdCBtYWRlIGl0IGNyYXNoIGF0IHRpbWVzLgoKVmVyc2lvbiA1LjcuMQoKIERvdWcgS2F1Zm1hbiAoMjMgQXByIDE5OTkpCiAtIEJyb3VnaHQgdHdvIHN1bm9zIDQgZml4ZXMuIE9uZSBvZiB0aGVtIGJlaW5nIHRoZSBob3N0aXAuYyBmaXggbWVudGlvbmVkCiAgIGJlbG93IGFuZCB0aGUgb3RoZXIgb25lIGEgY29ycmVjdGlvbiBpbiBpbmNsdWRlL3N0ZGNoZWFkZXJzLmgKCiAtIEFkZGVkIGEgcGFyYWdyYXBoIGFib3V0IGNvbXBpbGluZyB3aXRoIHRoZSBVUy12ZXJzaW9uIG9mIG9wZW5zc2wgdG8gdGhlCiAgIElOU1RBTEwgZmlsZS4KCiBEYW5pZWwKIC0gTmV3IG1haWxpbmcgbGlzdCBhZGRyZXNzLiBJbmZvIHVwZGF0ZWQgb24gdGhlIHdlYiBwYWdlIGFzIHdlbGwgYXMgaW4gdGhlCiAgIFJFQURNRSBmaWxlCgogR3JlZyBPbnVmZXIgKDIwIEFwciAxOTk5KQogLSBob3N0aXAuYyBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseSBvbiBTdW5PUyA1LjUuMS4KICAgSXQgbmVlZHMgYW4gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKVmVyc2lvbiA1LjcKCiBEYW5pZWwgKEFwciAyMCAxOTk5KQogLSBEZWNpZGVkIHRvIHVwbG9hZCBhIG5vbi1iZXRhIHZlcnNpb24gcmlnaHQgbm93IQoKIC0gTWFkZSBjdXJsIHN1cHBvcnQgYW55LWxlbmd0aCBIVFRQIGhlYWRlcnMuIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaXMgbm93CiAgIHNpbXBseSBlbmxhcmdlZCBldmVyeSB0aW1lIGl0IHR1cm5zIG91dCB0byBiZSB0b28gc21hbGwhCgogLSBBZGRlZCB0aGUgRkFRIGZpbGUgdG8gdGhlIGFyY2hpdmUuIFN0aWxsIGEgYml0IHNtYWxsaXNoLCBidXQgaXQgaXMgYQogICBzdGFydC4KCiBFcmljIFRoZWxpbiAoMTUgQXByIDE5OTkpCiAtIE1hZGUgLUQgYWNjZXB0ICctJyBpbnN0ZWFkIG9mIGZpbGVuYW1lIHRvIHdyaXRlIHRvIHN0ZG91dC4KClZlcnNpb24gNS42LjNiZXRhCgogRGFuaWVsIChBcHIgMTIgMTk5OSkKCiAtIENoYW5nZWQgdHdvICNpZmRlZiBXSU4zMiB0byBiZXR0ZXIgI2lmZGVmIDxlcnJvcmNvZGU+IHdoZW4gY29ubmVjdCgpaW5nCiAgIGluIHVybC5jIGFuZCBmdHAuYy4gTWFrZXMgY3lnd2luMzIgZGVhbCB3aXRoIHRoZW0gYmV0dGVyIHRvby4gV2Ugc2hvdWxkCiAgIHRyeSB0byBnZXQgc29tZSBkZWNlbnQgd2luMzItcmVwbGFjZW1lbnQgdGhlcmUuIEFueW9uZT8KCiAtIFRoZSBvbGQgLTMvLS1jcmxmIG9wdGlvbiBpcyBub3cgT05MWSAtLWNybGYhCgogLSBJIGNoYW5nZWQgdGhlICJTU0wgZml4IiB0byBhIG1vcmUgbGFtZSBvbmUsIGJ1dCB0aGF0IGRvZXNuJ3QgcmVtb3ZlIGFzCiAgIG11Y2ggZnVuY3Rpb25hbGl0eS4gTm93IEkndmUgZW5hYmxlZCB0aGUgbGliIHRvIHNlbGVjdCB3aGF0IFNTTCB2ZXJzaW9uIGl0CiAgIHNob3VsZCB0cnkgZmlyc3QuIEFwcGVhcmFudGx5IHNvbWUgb2xkZXIgU1NMLXNlcnZlcnMgZG9uJ3QgbGlrZSB3aGVuIHlvdQogICB0YWxrIHYzIHdpdGggdGhlbSBzbyB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIGZvcmNlIGN1cmwgdG8gdGFsayB2MiBmcm9tIHRoZQogICBzdGFydC4gVGhlIGZpeCBkYXRlZCBBcHJpbCA2IGFuZCBwb3N0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCBmb3JjZWQgY3VybCB0bwogICB1c2UgdjIgYXQgYWxsIHRpbWVzIHVzaW5nIGEgbW9kZXJuIE9wZW5TU0wgdmVyc2lvbiwgYnV0IHdlIGRvbid0IHJlYWxseQogICB3YW50IHN1Y2ggYSBjcmlwcGxlZCBzb2x1dGlvbi4KIAogLSBNYXJjIEJvdWNoZXIgc2VudCBtZSBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGEgbWF0aCBlcnJvciBmb3IgdGhlCiAgICJDdXJyLlNwZWVkIiBwcm9ncmVzcyBtZXRlci4KCiAtIEVyaWMgVGhlbGluIHNlbnQgbWUgYSBwYXRjaCB0aGF0IGVuYWJsZXMgJy1LIC0nIHRvIHJlYWQgYSBjb25maWcgZmlsZSBmcm9tCiAgIHN0ZGluLgoKIC0gSSBmb3VuZCBvdXQgd2UgZGlkbid0IGNsb3NlIHRoZSBmaWxlIHByb3Blcmx5IGJlZm9yZSBzbyBJIGFkZGVkIGl0IQoKIERhbmllbCAoQXByIDkgMTk5OSkKIC0gWXUgWGluIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIGZ0cCBkb3dubG9hZCByZXN1bWUuICBJdCBkaWRuJ3Qgd29yayBhdAogICBhbGwhIDstTwoKIERhbmllbCAoQXByIDYgMTk5OSkKIC0gQ29ycmVjdGVkIHRoZSB2ZXJzaW9uIHN0cmluZyBwYXJ0IGdlbmVyYXRlZCBmb3IgdGhlIFNTTCB2ZXJzaW9uLgoKIC0gSSBmb3VuZCBhIHdheSB0byBtYWtlIHNvbWUgb3RoZXIgU1NMIHBhZ2Ugd29yayB3aXRoIG9wZW5zc2wgMC45LjErIHRoYXQKICAgcHJldmlvdXNseSBkaWRuJ3QgKHNzbGVheSAwLjguMCB3b3JrcyB3aXRoIGl0IHRob3VnaCEpLiBUcnlpbmcgdG8gZ2V0CiAgIHNvbWUgcmVhbCBpbmZvIGZyb20gdGhlIE9wZW5TU0wgZ3V5cyB0byBzZWUgaG93IEkgc2hvdWxkIGRvIHRvIGJlaGF2ZSB0aGUKICAgYmVzdCB3YXkuIFNTTGVheSAwLjguMCBzaG91bGRuJ3QgYmUgdGhhdCBtdWNoIGluIHVzZSBhbnl3YXkgdGhlc2UgZGF5cyEKClZlcnNpb24gNS42LjJiZXRhCgogRGFuaWVsIChBcHIgNCAxOTk5KQogLSBGaW5hbGx5IGhhdmUgY3VybCBtb3JlIGNvb2tpZSAiYXdhcmUiLiBOb3cgcmVhZCBjYXJlZnVsbHkuIFRoaXMgaXMgaG93CiAgIGl0IHdvcmtzLgogICBUbyBtYWtlIGN1cmwgcmVhZCBjb29raWVzIGZyb20gYW4gYWxyZWFkeSBleGlzdGluZyBmaWxlLCBpbiBwbGFpbiBoZWFkZXItCiAgIGZvcm1hdCAobGlrZSBmcm9tIHRoZSBoZWFkZXJzIG9mIGEgcHJldmlvdXMgZmV0Y2gpIGludm9rZSBjdXJsIHdpdGggdGhlCiAgIC1iIGZsYWcgbGlrZToKCiAgICAgICAgY3VybCAtYiBmaWxlIGh0dHA6Ly9zaXRlL2Zvby5odG1sCgogICBDdXJsIHdpbGwgdGhlbiB1c2UgYWxsIGNvb2tpZXMgaXQgZmluZHMgbWF0Y2hpbmcuIFRoZSBvbGQgc3R5bGUgdGhhdCBzZXRzCiAgIGEgc2luZ2xlIGNvb2tpZSB3aXRoIC1iIGlzIHN0aWxsIHN1cHBvcnRlZCBhbmQgaXMgdXNlZCBpZiB0aGUgc3RyaW5nCiAgIGZvbGxvd2luZyAtYiBpbmNsdWRlcyBhICc9JyBsZXR0ZXIsIGFzIGluICItYiBuYW1lPWRhbmllbCIuCgogICBUbyBtYWtlIGN1cmwgcmVhZCB0aGUgY29va2llcyBzZW50IGluIGNvbWJpbmF0aW9uIHdpdGggYSBsb2NhdGlvbjogKHdoaWNoCiAgIHNpdGVzIG9mdGVuIGRvKSBwb2ludCBjdXJsIHRvIHJlYWQgYSBub24tZXhpc3RpbmcgZmlsZSBhdCBmaXJzdCAoaS5lCiAgIHRvIHN0YXJ0IHdpdGggbm8gZXhpc3RpbmcgY29va2llcyksIGxpa2U6CgogICAgICAgIGN1cmwgLWIgbm93aGVyZSBodHRwOi8vc2l0ZS9zZXRjb29raWVhbmRyZWxvY2F0ZS5odG1sCgogLSBBZGRlZCBhIHBhcmFncmFwaCBpbiB0aGUgVE9ETyBmaWxlIGFib3V0IHRoZSBTU0wgcHJvYmxlbXMgcmVjZW50bHkKICAgcmVwb3J0ZWQuIEV2aWRlbnRseSwgc29tZSBraW5kIG9mIFNTTC1wcm9ibGVtIGN1cmwgbWF5IG5lZWQgdG8gYWRkcmVzcy4KCiAtIEJldHRlciAiTG9jYXRpb246IiBmb2xsb3dpbmcuCgogRG91Z2xhcyBFLiBXZWdzY2hlaWQgKFR1ZSwgMzAgTWFyIDE5OTkpCiAtIEEgc3Vic2Vjb25kIGRpc3BsYXkgcGF0Y2guCgogRGFuaWVsIChNYXIgMTQgMTk5OSkKIC0gSSd2ZSBzZXBhcmF0ZWQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGxpYmN1cmwgYW5kIGN1cmwgbm93LiBUbyBtYWtlCiAgIHRoaW5ncyBhIGxpdHRsZSBlYXNpZXIsIEkgZGVjaWRlZCB0byBzdGFydCB0aGUgY3VybCBudW1iZXJpbmcgZnJvbQogICA1LjYgYW5kIHRoZSBmb3JtZXIgdmVyc2lvbiBudW1iZXIga25vd24gYXMgImN1cmwiIGlzIG5vdyB0aGUgb25lCiAgIHNldCBmb3IgbGliY3VybC4KCiAtIFJlbW92ZWQgdGhlICdlbmFibGUtbm8tcGFzcycgZnJvbSBjb25maWd1cmUsIEkgZG91YnQgYW55b25lIHdhbnRlZAogICB0aGF0LgoKIC0gTWFkZSBsb3RzIG9mIHRpbnkgYWRqdXN0bWVudHMgdG8gY29tcGlsZSBzbW9vdGhseSB3aXRoIGN5Z3dpbiB1bmRlcgogICB3aW4zMi4gSXQncyBhIGtpbGxlciBmb3IgcG9ydGluZyB0aGlzIHRvIHdpbjMyLCBieWUgYnllIFZDKyshIDstKQogICBDb21waWxlcyBhbmQgYnVpbGRzIG91dC1vZi10aGUtYm94IG5vdy4gU2VlIHRoZSBuZXcgd29yZGluZ3MgaW4KICAgSU5TVEFMTCBmb3IgZGV0YWlscy4KCiAtIEJlZ2lubmluZyBleHBlcmltZW50cyB3aXRoIGRvd25sb2FkaW5nIG11bHRpcGxlIGRvY3VtZW50IGZyb20gYSBodHRwCiAgIHNlcnZlciB3aGlsZSByZW1haW5pbmcgY29ubmVjdGVkLgoKVmVyc2lvbiA1LjZiZXRhCgogRGFuaWVsIChNYXIgMTMgMTk5OSkKIC0gU2luY2UgSSd2ZSBjaGFuZ2VkIHNvIG11Y2gsIEkgdGhvdWdodCBJJ2QganVzdCBnbyBhaGVhZCBhbmQgaW1wbGVtZW50IHRoZQogICBzdWdnZXN0aW9uIGZyb20gRG91Z2xhcyBFLiBXZWdzY2hlaWQuIC1EIG9yIC0tZHVtcC1oZWFkZXIgaXMgbm93IHN0b3JpbmcKICAgSFRUUCBoZWFkZXJzIHNlcGFyYXRlbHkgaW4gdGhlIHNwZWNpZmllZCBmaWxlLgoKIC0gQWRkZWQgbmV3IHRleHQgdG8gSU5TVEFMTCBvbiB3aGF0IHRvIGRvIHRvIGJ1aWxkIHRoaXMgb24gd2luMzIgbm93LgoKIC0gQWFhcmdoLiBJIGhhZCB0byB0YWtlIGEgc3RlcCBiYWNrIGFuZCBwcmVmaXggdGhlIHNoYXJlZCAjaW5jbHVkZSBmaWxlcwogICBpbiB0aGUgc291cmNlcyB3aXRoICIuLi9pbmNsdWRlLyIgdG8gcGxlYXNlIFZDKysuLi4KCiBEYW5pZWwgKE1hciAxMiAxOTk5KQogLSBTcGxpdCB0aGUgdXJsLmMgc291cmNlIGludG8gbWFueSB0aW55IHNvdXJjZXMgZm9yIGJldHRlciByZWFkYWJpbGl0eQogICBhbmQgc21hbGxlciBzaXplLgoKIERhbmllbCAoTWFyIDExIDE5OTkpCiAtIFN0YXJ0ZWQgdG8gY2hhbmdlIHN0dWZmIGZvciBhIG1vdmUgdG8gbWFrZSBsaWJjdXJsIGFuZCBhIG1vcmUgc2VwYXJhdGUKICAgY3VybCBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhlIGxpYmN1cmwuIE1hZGUgdGhlIGxpYmN1cmwgc291cmNlcyBpbnRvCiAgIHRoZSBuZXcgbGliIGRpcmVjdG9yeSB3aGlsZSB0aGUgY3VybCBhcHBsaWNhdGlvbiB3aWxsIHJlbWFpbiBpbiBzcmMgYXMKICAgYmVmb3JlLiBOZXcgbWFrZWZpbGVzLCBhZGp1c3RlZCBjb25maWd1cmUgc2NyaXB0IGFuZCBzby4KCiAgIGxpYmN1cmwuYSBidWlsdCBxdWlja2x5IGFuZCBlYXNpbHkuIEkgYmV0dGVyIG1ha2UgYSBiZXR0ZXIgaW50ZXJmYWNlIHRvCiAgIHRoZSBsaWIgZnVuY3Rpb25zIHRob3VnaC4KCiAgIFRoZSBuZXcgcm9vdCBkaXIgaW5jbHVkZS8gaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0aGUgcHVibGljIGluZm9ybWF0aW9uCiAgIGFib3V0IHRoZSBuZXcgbGliY3VybC4gSXQgaXMgYSBsaXR0bGUgdWdseSBzbyBmYXIgOi0pCgoKIERhbmllbCAoTWFyIDEgMTk5OSkKIC0gVG9kZCBLYXVmbWFubiBzZW50IG1lIGEgZ29vZCBsaW5rIHRvIE5ldHNjYXBlJ3MgY29va2llIHNwZWMgYXMgd2VsbCBhcyB0aGUKICAgaW5mbyB0aGF0IFJGQyAyMTA5IHNwZWNpZmllcyBob3cgdG8gdXNlIHRoZW0uICBUaGUgbGluayBpcyBub3cgaW4gdGhlCiAgIFJFQURNRSBhbmQgdGhlIFJGQyBpbiB0aGUgUkVTT1VSQ0VTLgoKIERhbmllbCAoRmViIDIzIDE5OTkpCiAtIEZpbmFsbHkgbWFkZSBjb25maWd1cmUgYWNjZXB0IC0td2l0aC1zc2wgdG8gbG9vayBmb3IgU1NMIGxpYnMgYW5kIGluY2x1ZGVzCiAgIGluIHRoZSAic3RhbmRhcmQiIHBsYWNlIC91c3IvbG9jYWwvc3NsLi4uCgogRGFuaWVsIChGZWIgMjIgMTk5OSkKIC0gVmVyaWZpZWQgdGhhdCBjdXJsIGxpbmtlZCBmaW5lIHdpdGggT3BlblNTTCAwLjkuMWMgd2hpY2ggc2VlbXMgdG8gYmUKICAgdGhlIG1vc3QgcmVjZW50LgoKIEhlbnJpIEdvbWV6IChGcmkgRmViICA1IDE5OTkpCiAtIFNlbnQgaW4gYW4gdXBkYXRlZCBjdXJsLXNzbC5zcGVjLiBJIHN0aWxsIG1pc3MgdGhlIHNjcmlwdCB0aGF0IGJ1aWxkcyBhbgogICBSUE0gYXV0b21hdGljYWxseS4uLgoKVmVyc2lvbiA1LjUuMQoKIE1hcmsgQnV0bGVyICgyNyBKYW4gMTk5OSkKIC0gQ29ycmVjdGVkIHByb2JsZW1zIGluIERvd25sb2FkKCkuCgogRGFuaXRlbCBTdGVuYmVyZyAoMjUgSmFuIDE5OTkpCiAtIEplcmVtaWUgUGV0aXQgcG9pbnRlZCBvdXQgYSBmZXcgZmxhd3MgaW4gdGhlIHNvdXJjZSB0aGF0IHByZXZlbnRlZCBpdCBmcm9tCiAgIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhlIG5hdGl2ZSBjb21waWxlciB1bmRlciBEaWdpdGFsIFVuaXggdjQuMGQuCgpWZXJzaW9uIDUuNQoKIERhbmllbCBTdGVuYmVyZyAoMTUgSmFuIDE5OTkpCiAtIEFkZGVkIEJqb3JucyBzbWFsbCB0ZXh0IHRvIHRoZSBSRUFETUUgYWJvdXQgdGhlIERJQ1QgcHJvdG9jb2wuCgogRGFuaWVsIFN0ZW5iZXJnICgxMSBKYW4gMTk5OSkKIC0gPGpzd2luayBhdCBzb2Z0Y29tLm5ldD4gcmVwb3J0ZWQgYWJvdXQgdGhlIHdpbjMyLXZlcnNpb2luOiAiRG9lc24ndCB1c2UKICAgQUxMX1BST1hZIGVudmlyb25tZW50IHZhcmlhYmxlIi4gVHVybmVkIG91dCB0byBiZSBiZWNhdXNlIG9mIHRoZSBzdGF0aWMtCiAgIGJ1ZmZlciBuYXR1cmUgb2YgdGhlIHdpbjMyIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbGxzIQoKIEJqb3JuIFJlZXNlICgxMCBKYW4gMTk5OSkKIC0gSSBoYXZlIGF0dGFjaGVkIGEgc2ltcGxlIGFkZGl0aW9uIGZvciB0aGUgRElDVCBwcm90b2NvbCAoUkZDIDIyMjkpLgogICBJdCBwZXJmb3JtcyBkaWN0aW9uYXJ5IGxvb2t1cHMuIFRoZSBvdXRwdXQgc3RpbGwgbmVlZHMgdG8gYmUgYmV0dGVyCiAgIGZvcm1hdHRlZC4KCiAgIFRvIHRlc3QgaXQgdHJ5ICh0aGUgZXhhY3QgZm9ybWF0LCBhbmQgbW9yZSBleGFtcGxlcyBhcmUgZGVzY3JpYmVkIGluCiAgIHRoZSBSRkMpCgogICAgICAgIGRpY3Q6Ly9kaWN0Lm9yZy9tOmhlbGxvCiAgICAgICAgZGljdDovL2RpY3Qub3JnL206aGVsbG86OnNvdW5kZXgKCgogVmljZW50ZSBHYXJjaWEgKDEwIEphbiAxOTk5KQogLSBDb3JyZWN0ZWQgdGhlIHByb2dyZXNzIG1ldGVyIGZvciBmaWxlcyBsYXJnZXIgdGhhbiAyME1CLgoKIERhbmllbCBTdGVuYmVyZyAoNyBKYW4gMTk5OSkKIC0gQ29ycmVjdGVkIHRoZSAtdCBhbmQgLVQgaGVscCB0ZXh0cy4gVGhleSBjbGFpbWVkIHRvIGJlIEZUUCBvbmx5LgoKVmVyc2lvbiA1LjQKCiBEYW5pZWwgU3RlbmJlcmcKICg3IEphbiAxOTk5KQogLSBJcnZpbmcgV29sZmUgcmVwb3J0ZWQgdGhhdCBjdXJsIC1zIGRpZG4ndCBhbHdheXMgc3VwcmVzcyB0aGUgcHJvZ3Jlc3MKICAgcmVwb3J0aW5nLiBJdCB3YXMgdGhlIGZvcm0gcG9zdCB0aGF0IGF1dG9hbXRpY2FsbHkgYWx3YXlzIHN3aXRjaGVkIGl0IG9uCiAgIGFnYWluLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQhCgogKDQgSmFuIDE5OTkpCiAtIEFuZHJlYXMgS29zdHlya2Egc3VnZ2VzdGVkIEknZCBhZGQgUFVUIGFuZCBoZSBoZWxwZWQgbWUgb3V0IHRvIHRlc3QgaXQuIElmCiAgIHlvdSB1c2UgLXQgb3IgLVQgbm93IG9uIGEgaHR0cCBvciBodHRwcyBzZXJ2ZXIsIFBVVCB3aWxsIGJlIHVzZWQgZm9yIGZpbGUKICAgdXBsb2FkLgoKICAgSSByZW1vdmVkIHRoZSBmb3JtZXIgdXNlIG9mIC1UIHdpdGggSFRUUC4gSSBkb3VidCBhbnlvbmUgZXZlciByZWFsbHkgdXNlZAogICB0aGF0LgoKICg0IEphbiAxOTk5KQogLSBFcmlrIEphY29ic2VuIGZvdW5kIGEgd2lkdGggYnVnIGluIHRoZSBtcHJpbnRmKCkgZnVuY3Rpb24uICBJIGNvcnJlY3RlZCBpdAogICBub3cuCgogKDQgSmFuIDE5OTkpCiAtIEFzIEpvaG4gVi4gQ2hvdyBwb2ludGVkIG91dCB0byBtZSwgY3VybCBhY2NlcHRlZCB2ZXJ5IGxpbWl0ZWQgVVJMIHNpemVzLiBJdAogICBzaG91bGQgbm93IGFjY2VwdCBwYXRoIHBhcnRzIHRoYXQgYXJlIHVwIHRvIGF0IGxlYXN0IDQwOTYgYnl0ZXMuCgogLSBTb21laG93IEkgc2NyZXdlZCB1cCB3aGVuIGFwcGx5aW5nIHRoZSBBSVggZml4IGZyb20gR2lsYmVydCBSYW1pcmV6LCBzbwogICBJIHJlZGlkIHRoYXQgbm93LgoKVmVyc2lvbiA1LjNhICh3aW4zMiBvbmx5KQoKIFRyb3kgRW5nZWwKIC0gQ29ycmVjdGVkIGEgd2luMzIgYnVnIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBwYXJ0LgoKVmVyc2lvbiA1LjMKCiBHaWxiZXJ0IFJhbWlyZXogSnIuICgyMSBEZWMgMTk5OCkKIC0gSSBoYXZlIGltcGxlbWVudGVkIHRoZSAicXVvdGUiIGZ1bmN0aW9uIG9mIEZUUCBjbGllbnRzLiBJdCBhbGxvd3MgeW91IHRvCiAgIHNlbmQgYXJiaXRyYXJ5IGNvbW1hbmRzIHRvIHRoZSByZW1vdGUgRlRQIHNlcnZlci4gSSBjaG9zZSB0aGUgLVEvLS1xdW90ZQogICBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgoKICAgWW91IGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgcXVvdGVkIHN0cmluZywgYW5kIGN1cmwgd2lsbCBhcHBseSB0aGVtIGluCiAgIG9yZGVyLiAgVGhpcyBpcyB3aGF0IEkgdXNlIGZvciBteSBNVlMgdXBsb2FkOgoKICBjdXJsIC1CIC0tY3JsZiAtUSAic2l0ZSBscmVjbD04MCIgLVEgInNpdGUgYmxrPTgwMDAiIC1UIGZpbGUgZnRwOi8vb3MzOTAvdGVzdAoKICAgQ3VybCB3aWxsIHNlbmQgdGhlIHR3byBxdW90ZWQgInNpdGUiIGNvbW1hbmRzIGluIHRoZSBwcm9wZXIgb3JkZXIuCgogLSBNYWRlIGl0IGNvbXBpbGUgc21vb3RobHkgb24gQUlYLgoKIEdpbGJlcnQgUmFtaXJleiBKci4gKDE4IERlYyAxOTk4KQogLSBCcm91Z2h0IGFuIE1WUyBwYXRjaDogLTMvLS1tdnMsIGZvciBmdHAgdXBsb2FkIHRvIHRoZSBNVlMgZnRwIHNlcnZlci4KCiBUcm95IEVuZ2VsICgxNyBEZWMgMTk5OCkKIC0gQnJvdWdodCBhIGNvcnJlY3Rpb24gdGhhdCBmaXhlcyB0aGUgd2luMzIgY3VybCBidWcuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIEEgYnVnLCBwb2ludGVkIG91dCB0byBtZSBieSBEciBILiBULiBMZXVuZywgY2F1c2VkIGN1cmwgdG8gY3Jhc2ggb24gdGhlIC1BCiAgIGZsYWcgb24gY2VydGFpbiBzeXN0ZW1zLiBBY3R1YWxseSwgYWxsIHN5c3RlbXMgc2hvdWxkJ3ZlIQoKIC0gQWRkZWQgYSBmZXcgZGVmaW5lcyB0byBtYWtlIGRpcmVjdG9yaWVzL2ZpbGUgbmFtZXMgZ2V0IGJ1aWxkIG5pY2VyICh3aXRoIF8KICAgaW5zdGVhZCBvZiAuIGFuZCBcIGluc3RlYWQgb2YgLyBpbiB3aW4zMikuCgogLSBzdGV2ZSA8ZmlzayBhdCBwb2xhci5ib3dkb2luLmVkdT4gcmVwb3J0ZWQgYSB3ZWlyZCBidWcgdGhhdCBvY2N1cmVkIGlmIHRoZQogICBmdHAgc2VydmVyIHJlc3BvbnNlIGxpbmUgaGFkIGEgcGFyZW50aGVzaXMgb24gdGhlIGxpbmUgYmVmb3JlIHRoZSAoc2l6ZSkKICAgaW5mby4gSSBob3BlIGl0IHdvcmtzIGJldHRlciBub3chCgpWZXJzaW9uIDUuMi4xCgogU3RldmVuIEcuIEpvaG5zb24gKERlYyAxNCwgMTk5OCkKIC0gQnJvdWdodCBhIGZpeCB0aGF0IGNvcnJlY3RlZCBhIGNyYXNoIGluIDUuMiBkdWUgdG8gYmFkIHRyZWF0bWVudCBvZiB0aGUKICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLgoKVmVyc2lvbiA1LjIKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxNCwgMTk5OCkKIC0gUmV3cm90ZSB0aGUgbWtoZWxwIHNjcmlwdCBhbmQgbm93LCB0aGUgbWtoZWxwLnBsIHNjcmlwdCBnZW5lcmF0ZXMgdGhlCiAgIGh1Z2VoZWxwLmMgZmlsZSBmcm9tIHRoZSBSRUFETUUgKmFuZCogdGhlIG1hbiBwYWdlIGZpbGUgY3VybC4xLiBCeSB1c2luZwogICBib3RoIGZpbGVzLCBJIG5vIGxvbmdlciBuZWVkIHRvIGhhdmUgZG91YmxlIGluZm9ybWF0aW9uIGluIGJvdGggdGhlIG1hbgogICBwYWdlIGFuZCB0aGUgUkVBRE1FIGFzIHdlbGwuIFNvLCB3aW4zMi11c2VycyB3aWxsIG9ubHkgaGF2ZSB0aGUgaHVnZWhlbHAuYwogICBmaWxlIGZvciBhbGwgaW5mbywgYnV0IHRoZW4sIHRoZXkgZG93bmxvYWQgdGhlIHBsYWluIGJpbmFyeSBtb3N0IHRpbWVzCiAgIGFueXdheS4KCiAtIGdjYzIuOC4xIHdpdGggdGhlIC1XYWxsIGZsYWcgY29tcGxhaW50cyBhIGxvdCBvbiBzdWJzY3JpcHQgaGFzIHR5cGUgYGNoYXInCiAgIGlmIEkgZG9uJ3QgZXhwbGljaXRseSB0eXBlY2FzdCB0aGUgYXJndW1lbnQgdG8gaXNkaWdpdCgpIG9yIGlzc3BhY2UoKSB0bwogICBpbnQuIFNvIEkgZGlkIHRvIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhhdCB0b28uCgogLSBBZGRlZCBjaGVja3MgZm9yICdsb25nIGRvdWJsZScgYW5kICdsb25nIGxvbmcnIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LiBJCiAgIG5lZWQgdGhvc2UgZm9yIHRoZSBtcHJpbnRmLmMgc291cmNlIHRvIGNvbXBpbGUgd2VsbCBvbiBub24gbG9uZyBsb25nCiAgIGNvbWZvcm1pbmcgc3lzdGVtcyEKClZlcnNpb24gNS4xIChub3QgcHVibGljbHkgcmVsZWFzZWQpCgogRGFuaWVsIFN0ZW5iZXJnIChEZWMgMTAsIDE5OTgpCiAtIEkgZ290IGEgcmVxdWVzdCBmb3IgYSBwcmUtY29tcGlsZWQgTlQgQWxwaGEgdmVyc2lvbi4gQW55b25lPwoKIC0gQWRkZWQgTHlueC9DRVJOIHd3dyBsaWIgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGUgc3VwcG9ydC4gVGhhdCBtZWFucyBjdXJsCiAgIG5vdyByZWFkcyBhbmQgdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CgoJSFRUUF9QUk9YWSwgSFRUUFNfUFJPWFksIEZUUF9QUk9YWSwgR09QSEVSX1BST1hZCgogICBUaGV5IHNob3VsZCBiZSBzZXQgZm9yIHByb3RvY29sLXNwZWNpZmljIHByb3hpZXMuIEdlbmVyYWwgcHJveHkgc2hvdWxkIGJlCiAgIHNldCB3aXRoCgkKCUFMTF9QUk9YWQoKICAgQW5kIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgaG9zdCBuYW1lcyB0aGF0IHNob3VsZG4ndCBnbyB0aHJvdWdoIGFueQogICBwcm94eSBpcyBzZXQgaW4gKG9ubHkgYW4gYXN0ZXJpc2ssICcqJyBtYXRjaGVzIGFsbCBob3N0cykuCgoJTk9fUFJPWFkKCiAgIFRoZSB1c2FnZSBvZiB0aGUgLXgvLS1wcm94eSBmbGFnIG92ZXJyaWRlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgoKIC0gUHJveHkgY2FuIG5vdyBiZSBzcGVjaWZpZWQgd2l0aCBhIHByb2NvdG9sOi8vIHByZWZpeC4KCiAtIFdyb3RlIHRoZSBjdXJsLjEgbWFuIHBhZ2UuCgogLSBJbnRyb2R1Y2VkIGEgd2hvbGUgbmV3IGR5bmFtaWMgYnVmZmVyIHN5c3RlbSBmb3IgYWxsIHNwcmludGYoKXMuIEl0IGlzCiAgIGJhc2VkIG9uIHRoZSAqcHJpbnRmKCkgcGFja2FnZSBieSB5b3VycyB0cnVseSBhbmQgQmpvcm4gUmVlc2UuIEhvcGVmdWxseSwKICAgdGhlcmUgYXJlbid0IHRoYXQgbWFueSBidWZmZXIgb3ZlcmZsb3cgcmlza3MgbGVmdCBub3cuCgogLSBBaCwgSSBzaG91bGQgbWVudGlvbiBJJ3ZlIGNvbXBpbGVkIGFuZCBidWlsdCBjdXJsIHN1Y2Nlc3NmdWxseSB1bmRlcgogICBzb2xhcmlzIDIuNiB3aXRoIGdjYyBub3csIGdjYyAyLjcuMiB3b24ndCB3b3JrIGJ1dCAyLjguMSBkaWQgb2suCgogT3JlbiBUaXJvc2ggKERlYyAzLCAxOTk4KQogLSBCcm91Z2h0IHR3byAuc3BlYyBmaWxlcywgdG8gdXNlIHdoZW4gY3JlYXRpbmcgKExpbnV4KSBSZWRoYXQgc3R5bGUgUlBNCiAgIHBhY2thZ2VzLiBUaGV5J3JlIG5hbWVkIGN1cmwuc3BlYyBhbmQgY3VybC1zc2wuc3BlYy4KCiBUcm95IEVuZ2VsCiAtIFN1cHBsaWVkIHRoZSBzcmMvTWFrZWZpbGUudmM2IGZvciBlYXN5IGNvbXBpbGluZyB3aXRoIFZDKysgdW5kZXIgV2luMzIuCgpWZXJzaW9uIDUuMAoKIERhbmllbCBTdGVuYmVyZyAoRGVjIDEsIDE5OTgpCiAtIE5vdCBhIHNpbmdsZSBidWcgcmVwb3J0IGluIGFnZXMuCiAtIENvcnJlY3RlZCBnZXRwYXNzLmMgYW5kIG1haW4uYyB0byBjb21waWxlIHdhcm5pbmcgYW5kIGVycm9yIGZyZWUgd2l0aCB0aGUKICAgV2luMzIgVkMrKyBjcmFwLgoKVmVyc2lvbiA1LjAgYmV0YSAyNAoKIERhbmllbCBTdGVuYmVyZyAoTm92IDIwLCAxOTk4KQoKIEhPVyBUTyBCVUlMRCBBIFJFTEVBU0UgQVJDSElWRToKCiAqIFByZS1yZXF1aXNpdGUgc29mdHdhcmU6CiAgIFdoYXQJCSAgICAgVG8gYnVpbGQgd2hhdCAgICAgICAgICAgICBSZWFkcyBkYXRhIGZyb20KICAgPT09PSAgICAgICAgICAgICAgPT09PT09PT09PT09PSAgICAgICAgICAgICA9PT09PT09PT09PT09PT0KICAgR05VIGF1dG9tYWtlICAgICAgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQgICBjb25maWd1cmUuaW4KICAgICBHTlUgbWFrZSgxKSAgICAgIC0gIiAtCiAgICAgR05VIGdjYygxKSAgICAgICAtICIgLQogICBHTlUgYXV0b2NvbmYgICAgICBjb25maWd1cmUgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZS5pbgogICBHTlUgYXV0b2hlYWRlcigyKSBjb25maWcuaC5pbgkgICAgICAgY29uZmlndXJlLmluLCBhY2NvbmZpZy5oCgogKiBNYWtlIHN1cmUgYWxsIGZpbGVzIHRoYXQgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIGFyY2hpdmUgYXJlIHB1dCBpbiBGSUxFUy4KCiAqIFJ1biAnLi9tYWtldGd6JyBhbmQgZW50ZXIgdmVyc2lvbiBudW1iZXIgb2YgdGhlIG5ldyB0byBiZWNvbWUgYXJjaGl2ZS4KCiAgIG1ha2V0Z3ogZG9lczoKCiAgIC0gRW50ZXJzIHRoZSBuZXdseSBjcmVhdGVkIHZlcnNpb24gbnVtYmVyIGluIHVybC5oLgogICAtIChJZiB5b3UgZG9uJ3QgaGF2ZSBhdXRvbWFrZSwgdGhpcyBzY3JpcHQgd2lsbCB3YXJuIGFib3V0IHRoYXQsIGJ1dCB1bmxlc3MKICAgICB5b3UgaGF2ZSBjaGFuZ2VkIHRoZSBNYWtlZmlsZS5hbSBmaWxlcywgdGhhdCBpcyBub3RoaW5nIHRvIGNhcmUgYWJvdXQuKQogICAgIElmIHlvdSBoYXZlIGl0LCBpdCdsbCBydW4gaXQuCiAgIC0gSWYgeW91IGhhdmUgYXV0b2NvbmYsIHRoZSBjb25maWd1cmUuaW4gd2lsbCBiZSBlZGl0ZWQgdG8gZ2V0IHRoZSBuZXdseQogICAgIGNyZWF0ZWQgdmVyc2lvbiBudW1iZXIgYW5kIGF1dG9jb25mIHdpbGwgYmUgcnVuLgogICAtIENyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5IG5hbWVkIGN1cmwtPHZlcnNpb24+LiAoQWN0dWFsbHksIGl0IHVzZXMgdGhlIGJhc2UKICAgICBuYW1lIG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB1cCB0byB0aGUgZmlyc3QgJy0nLikKICAgLSBDb3BpZXMgYWxsIGZpbGVzIG1lbnRpb25lZCBpbiBGSUxFUyB0byB0aGUgbmV3IGRpcmVjdG9yeS4gU2F2aW5nCiAgICAgcGVybWlzc2lvbnMgYW5kIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCiAgIC0gVXNlcyB0YXIgdG8gY3JlYXRlIGFuIGFyY2hpdmUgb2YgaXQgYWxsLCBuYW1lZCBjdXJsLTx2ZXJzaW9uPi50YXIuZ3oKICAgLSBnemlwcyB0aGUgYXJjaGl2ZQogICAtIFJlbW92ZXMgdGhlIG5ldyBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudHMuCgogKiBXaGVuIGRvbmUsIHlvdSBoYXZlIGFuIGFyY2hpdmUgc3RvcmVkIGluIHlvdXIgZGlyZWN0b3J5IG5hbWVkCiAgIGN1cmwtPHZlcnNpb24+LnRhci5nei4KCiAgIERvbmUhCgogICAoMSkgVGhleSdyZSByZXF1aXJlZCB0byBtYWtlIGF1dG9tYWtlIHJ1biBwcm9wZXJseS4KICAgKDIpIEl0IGlzIGRpc3RyaWJ1dGVkIGFzIGEgcGFydCBvZiB0aGUgR05VIGF1dG9jb25mIGFyY2hpdmUuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTgsIDE5OTgpCiAtIEkgY2hhbmdlZCB0aGUgVEFHLXN5c3RlbS4gSWYgeW91IGV2ZXIgdXNlZCB1cmxnZXQoKSBmcm9tIHRoaXMgcGFja2FnZSBpbgogICBhbm90aGVyIHByb2R1Y3QsIHlvdSBuZWVkIHRvIHJlY29tcGlsZSB3aXRoIHRoZSBuZXcgaGVhZGVycy4gSSBkaWQgdGhpcwogICBuZXcgc3R1ZmYgdG8gYmV0dGVyIGRlYWwgd2l0aCBkaWZmZXJlbnQgY29tcGlsZXJzIGFuZCBzeXN0ZW0gd2l0aCBkaWZmZXJlbnQKICAgdmFyaWFibGUgc2l6ZXMuIEkgdGhpbmsgaXQgbWFrZXMgaXQgYSBsaXR0bGUgbW9yZSBwb3J0YWJsZS4gVGhpcyBwcm92ZXMKICAgdG8gY29tcGlsZSB3YXJuaW5nIGZyZWUgd2l0aCB0aGUgcHJvYmxlbWF0aWMgSVJJWCBjb21waWxlciEKIC0gV2luMzIgY29tcGlsZWQgd2l0aCBhIHNpbGx5IGVycm9yLiBDb3JyZWN0ZWQgbm93LgogLSBCcmlhbiBDaGFwbGluIHJlcG9ydGVkIHlldCBhbm90aGVyIHByb2JsZW0gaW4KICAgbXVsdGlsaW5lIEZUUCByZXNwb25zZXMuIEkndmUgdHJpZWQgdG8gY29ycmVjdCBpdC4gSSBtYWlsZWQgaGltIGEgbmV3CiAgIHZlcnNpb24gYW5kIEkgaG9wZSBoZSBnZXRzIGJhY2sgc29vbiB3aXRoIHBvc2l0aXZlIGZlZWRiYWNrIQogLSBJbXByb3ZlZCB0aGUgJ21ha2V0Z3onIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdHJlZSB3aGljaCBpdCBtYWtlcwogICBhbiBhcmNoaXZlIGZyb20gaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgcmVuYW1pbmcgb2YgdGhlIGN1cnJlbnQgb25lLgogLSBNYWlsaW5nIGxpc3Qgb3BlbmVkIChzZWUgUkVBRE1FKS4KIC0gTWFkZSAtdiBtb3JlIHZlcmJvc2Ugb24gdGhlIFBBU1Ygc2VjdGlvbiBvZiBmdHAgdHJhbnNmZXJzLiBOb3cgaXQgdGVsbHMKICAgaG9zdCBuYW1lIGFuZCBJUCBvZiB0aGUgbmV3IGhvc3QgKGFuZCBwb3J0IG51bWJlcikuIEkgYWxzbyBhZGRlZCBhIHNlY3Rpb24KICAgYWJvdXQgUE9SVCB2cyBQQVNWIGluIHRoZSBSRUFETUUuCgpWZXJzaW9uIDUuMCBiZXRhIDIxCgogQW5ndXMgTWFja2F5IChOb3YgMTUsIDE5OTgpCiAtIEludHJvZHVjZWQgYXV0b21ha2Ugc3R1ZmYuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTMsIDE5OTgpCiAtIEp1c3QgbWFkZSBhIHN1Y2Nlc3NmdWwgR0VUIG9mIGEgZG9jdW1lbnQgZnJvbSBhbiBTU0wtc2VydmVyIHVzaW5nIG15IG93bgogICBwcml2YXRlIGNlcnRpZmljYXRlIGZvciBhdXRoZW50aWNhdGlvbiEgVGhlIGNlcnRpZmljYXRlIGhhcyB0byBiZSBpbiBQRU0KICAgZm9ybWF0LiBZb3UgZG8gdGhhdCB0aGUgZWFzaWVzdCB3YXkgKGFsdGhvdWdoIG5vdCAqdGhhdCogZWFzeSkgYnkKICAgZG93bmxvYWRpbmcgdGhlIFNTTHllYXkgUEtDUyMxMi1wYXRjaCBieSBEciBTdGVwaGVuIE4uIEhlbnNvbiBmcm9tIGhpcyBzaXRlCiAgIGF0OiBodHRwOi8vd3d3LmRyaC1jb25zdWx0YW5jeS5kZW1vbi5jby51ay8uIFVzaW5nIGhpcyB0b29sLCB5b3UgY2FuCiAgIGNvbnZlcnQgYW55IG1vZGVybiBOZXRzY2FwZSBvciAoZXZlbikgTVNJRSBjZXJ0aWZpY2F0ZSB0byBQRU0tZm9ybWF0LiAgVXNlCiAgIGl0IHdpdGggJ2N1cmwgLUUgPGNlcnRpZmljYXRlOnBhc3N3b3JkPiBodHRwczovL3NpdGUuY29tJy4gIElmIHRoaXMgaXNuJ3QgYQogICBjb29sIGZlYXR1cmUsIHRoZW4gSSBkb24ndCBrbm93IHdoYXQgY29vbCBmZWF0dXJlcyBsb29rIGxpa2UhIDstKQogLSBXb3JraW5nIHNsb3dseSBvbiB0ZWxuZXQgY29ubmVjdGlvbnMuICNkZWZpbmUgVFJZX1RFTE5FVCB0byB0cnkgaXQgb3V0LgogICAoY3VybCAtdSB1c2VyOnBhc3N3ZCAidGVsbmV0Oi8vaG9zdC5jb20vY2F0IC5sb2dpbiIgaXMgb25lIGV4YW1wbGUpIEkgZG8KICAgaGF2ZSBwcm9ibGVtIHRvIGRlZmluZSBob3cgaXQgc2hvdWxkIHdvcmsuIFRoZSBwcmltZSBwdXJwb3NlIGZvciB0aGlzIG11c3QKICAgYmUgdG8gZ2V0ICg4Yml0IGNsZWFuKSBmaWxlcyB2aWEgdGVsbmV0LCBhbmQgaXQgcmVhbGx5IGlzbid0IHRoYXQgZWFzeSB0bwogICBnZXQgZmlsZXMgdGhpcyB3YXkuIFN0aWxsIGhhdmluZyBwcm9ibGVtcyB3aXRoIFxuIGJlaW5nIGNvbnZlcnRlZCB0byBcclxuLgoKIEFuZ3VzIE1hY2theSAoTm92IDEyLCAxOTk4KQogLSBDb3JyZWN0ZWQgYW5vdGhlciBidWcgaW4gdGhlIGxvbmcgcGFyYW1ldGVyIG5hbWUgcGFyc2VyLgogLSBNb2RpZmllZCBnZXRwYXNzLmMgKE5PVEU6IHNlZSB0aGUgc3BlY2lhbCBsaWNlbnNpbmcgaW4gdGhlIHRvcCBvZiB0aGF0CiAgIHNvdXJjZSBmaWxlKS4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMiwgMTk5OCkKIC0gV2UgbWF5IGhhdmUgcmVtb3ZlZCB0aGUgc2lsbHkgd2FybmluZ3MgZnJvbSB1cmwuYyB3aGVuIGNvbXBpbGVkIHVuZGVyIElSSVguCiAgIFRoYW5rcyBhZ2FpbiB0byBCam9ybiBSZWVzZSBhbmQgTWFydGluIFN0YWFlbC4KIC0gV3JvdGUgZm9ybWZpbmQucGwgd2hpY2ggaXMgYSBuZXcgcGVybCBzY3JpcHQgaW50ZW5kZWQgdG8gaGVscCB5b3UgZmluZCBvdXQKICAgaG93IGEgRk9STSBzdWJtaXNzaW9uIHNob3VsZCBiZSBkb25lLiBUaGlzIG5lZWRzIGEgbGl0dGxlIG1vcmUgd29yayB0byBnZXQKICAgcmVhbGx5IGdvb2QuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTEsIDE5OTgpCiAtIE1hZGUgdGhlIEhUVFAgaGVhZGVyLWNoZWNrZXIgYWNjZXB0IHdoaXRlIHNwYWNlcyBiZWZvcmUgdGhlIEhUVFAvMS4/IGxpbmUuCiAgIEFwcGVhcmFudGx5IHNvbWUgcHJveGllcy9zaXRlcyBhZGQgc3VjaCBhdCB0aW1lcyAobXkgdGVzdCBwcm94eSBkaWQgd2hlbiBJCiAgIGRvd25sb2FkZWQgYSBnb3BoZXIgcGFnZSB3aXRoIGl0KSEKIC0gTW92ZWQgdGhlIGZvcm1lciAtaCB0byAtTSBhbmQgbWFkZSAtaCBzaG93IHRoZSBzaG9ydCBoZWxwIHRleHQgaW5zdGVhZC4gSQogICBoYWQgdG8gZW5hYmxlIGEgZm9yY2VkIGhlbHAgdGV4dCBvcHRpb24uIE5vdyBhbiBldmVuIHNob3J0ZXIgaGVscCB0ZXh0IHdpbGwKICAgYmUgcHJlc2VudGVkIHdoZW4gYW4gdW5rbm93biBvcHRpb24gYW5kIHNpbWlsYXIsIGlzIHVzZWQuCiAtIHN0ZGNoZWFkZXJzLmggZGlkbid0IHdvcmsgd2l0aCBJUklYIDYuNCBuYXRpdmUgY2MgY29tcGlsZXIuIEkgaG9wZSBteQogICBjaGFuZ2VzIGRvbid0IG1ha2Ugb3RoZXIgdmVyc2lvbnMgZ28gbnV0cyBpbnN0ZWFkLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDEwLCAxOTk4KQogLSBBZGRlZCBhIHdlaXJkIGNoZWNrIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGNoZWNrIGZvciB0aGUgc2lsbHkgQUlYCiAgIHdhcm5pbmdzIGFib3V0IG15ICNkZWZpbmUgc3RyY2FzZWNtcCgpIHN0dWZmLiBJIGRvIHRoYXQgZGVmaW5lIHRvIHByZXZlbnQKICAgbWUgYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB0byBhY2NpZGVudGFseSB1c2UgdGhhdCBmdW5jdGlvbiBuYW1lIGluc3RlYWQKICAgb2Ygc3RyZXF1YWwoKS4uLgogLSBJIGJ1Z2ZpeGVkIEFuZ3VzJ3MgZ2V0cGFzcy5jIHZlcnkgbGl0dGxlLgogLSBGaXhlZCB0aGUgdmVyYm9zZSBmbGFnIG5hbWVzIHRvIGdldG9wdC1zdHlsZSwgaS5lICdjdXJsIC0tbG9jJyB3aWxsIGJlCiAgIHN1ZmZpY2llbnQgaW5zdGVhZCBvZiAtLWxvY2F0aW9uIGFzICJsb2MiIGlzIGEgdW5pcXVlIHByZWZpeC4gQWxzbywgYW55dGhpbmcKICAgYWZ0ZXIgYSAnLS0nIGlzIHRyZWF0ZWQgYXMgYW4gVVJMLiBTbyBpZiB5b3UgZG8gaGF2ZSBhIGhvc3Qgd2l0aCBhIHdlZWVpcmQKICAgbmFtZSB5b3UgY2FuIGRvICdjdXJsIC0tIC1ob3N0LmNvbScuCiAtIEFub3RoZXIgZ2V0b3B0LWFkanVzdDsgY3VybCBub3cgYWNjZXB0cyBmbGFncyBhZnRlciB0aGUgVVJMIG9uIHRoZSBjb21tYW5kCiAgIGxpbmUuICdjdXJsIHd3dy5mb28uY29tIC1PJyBpcyBwZXJmZWN0bHkgdmFsaWQuCiAtIENvcnJlY3RlZCB0aGUgLmN1cmxyYyBwYXJzZXIgc28gdGhhdCBzdHJ0b2soKSBpcyBubyBsb25nZXIgdXNlZCBhbmQgSQogICBiZWxpZXZlIGl0IHdvcmtzIGJldHRlci4gRXZlbiBVUkxzIGNhbiBiZSBzcGVjaWZpZWQgaW4gaXQgbm93LgoKIEFuZ3VzIE1hY2theSAoTm92IDksIDE5OTgpCiAtIFJlcGxhY2VkIGdldHBhc3MuYyB3aXRoIGEgbmV3bHkgd3JpdHRlbiBvbmUsIG5vdCB1bmRlciBHUEwgbGljZW5zZQogLSBDaGFuZ2VkIE9TIHRvIGEgI2RlZmluZSBpbiBjb25maWcuaCBpbnN0ZWFkIG9mIGNvbXBpbGVyIGZsYWcKIC0gTWFrZWZpbGUgbm93IHVzZXMgLURIQVZFX0NPTkZJR19ICgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgOSwgMTk5OCkKIC0gT2ssIEkgZXhwYW5kZWQgdGhlIHRnei10YXJnZXQgdG8gdXBkYXRlIHRoZSB2ZXJzaW9uIHN0cmluZyBvbiBlYWNoIG9jY2F0aW9uCiAgIEkgYnVpbGQgYSByZWxlYXNlIGFyY2hpdmUhCiAtIEkgcmVhY3RlZCBvbiBBbmd1cyBNYWNrYXkncyBpbml0aWF0aXZlIGFuZCByZW1hZGUgdGhlIHBhcmFtZXRlciBwYXJzZXIgdG8KICAgYmUgbW9yZSBnZXRvcHQgY29tcGxpYW50LiBDdXJsIG5vdyBzdXBwb3J0cyAibWVyZ2VkIiBmbGFncyBhcyBpbiAKCWN1cmwgLWxzdiBmdHAuc2l0ZS5jb20KICAgRG8gbm90ZSB0aGF0IEkgaGFkIHRvIG1vdmUgdGhyZWUgc2hvcnQtbmFtZXMgb2YgdGhlIG9wdGlvbnMuIFBhcmFtZXRlcnMKICAgdGhhdCBuZWVkcyBhbiBhZGRpdGlvbmFsIHN0cmluZyBzdWNoIGFzIC14IG11c3QgYmUgc3RhbmQtYWxvbmUgb3IgdGhlCiAgIGxhc3QgaW4gYSBtZXJnZWQgc2VxdWVuY2U6CgljdXJsIC1sc3ggbXktcHJveHkgZnRwLnNpdGUuY29tCiAgIGlzIG9rLCBidXQgdXNpbmcgdGhlIGZsYWdzIGluIGEgZGlmZmVyZW50IG9yZGVyIGxpa2UgJy1seHMnIHdvdWxkIGNhdXNlCiAgIHVuZXhwZWN0ZWQgcmVzdWx0cyAoYXMgdGhlICdzJyBvcHRpb24gd291bGQgYmUgc2tpcHBlZCkuCiAtIEkndmUgY2hhbmdlZCB0aGUgaGVhZGVycyBpbiBhbGwgZmlsZXMgdGhhdCBhcmUgc3ViamVjdCB0byB0aGUgTW96UEwKICAgbGljZW5zZSwgYXMgdGhleSBhcmUgc3VwcG9zZWQgdG8gbG9vayBsaWtlIHdoZW4gY29uZm9ybWluZy4KIC0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBtYWtlIHRoZSBjb25maWcuaC4gVGhlIGZvcm1lciBjb25maWcuaCBpcyBub3cKICAgc2V0dXAuaC4KIC0gVGhlIFJFU09VUkNFUyBhbmQgVE9ETyBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGFyY2hpdmUuCgogQW5ndXMgTWFja2F5IChOb3YgNSwgMTk5OCkKIC0gRml4ZWQgZ2V0cGFzcy5jIGFuZCB2YXJpb3VzIGNvbmZpZ3VyZSBzdHVmZgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDMsIDE5OTgpCiAtIFVzZSAtSC8tLWhlYWRlciBmb3IgY3VzdG9tIEhUVFAtaGVhZGVycy4gTGV0cyB5b3UgcGFzcyBvbiB5b3VyIG93bgogICBzcGVjaWZpZWQgaGVhZGVycyB0byB0aGUgcmVtb3RlIHNlcnZlci4gSSB3b3VsZG4ndCByZWNvbW1lbmQgdHJ5aW5nIHRvIHVzZQogICBhIGhlYWRlciB3aXRoIGEgZGVmaW5lZCB1c2FnZSBhY2NvcmRpbmcgdG8gc3RhbmRhcmRzLiBVc2UgdGhpcyBmbGFnIG9uY2UKICAgZm9yIGV2ZXJ5IGN1c3RvbSBoZWFkZXIgeW91IHdhbnQgdG8gYWRkLgogLSBVc2UgLUIvLS1mdHAtYXNjaWkgdG8gZm9yY2UgZnRwIHRvIHVzZSBBU0NJSSBtb2RlIHdoZW4gdHJhbnNmZXJpbmcgZmlsZXMuCiAtIENvcnJlY3RlZCB0aGUgJ2dldGxpbmtzLnBsJyBzY3JpcHQsIEkgYWNjaWRlbnRhbGx5IGxlZnQgbXkgc2lsbHkgcHJveHkKICAgdXNhZ2UgaW4gdGhlcmUhIFNpbmNlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIC5jdXJscmMgZmlsZSwgaXQgaXMgZWFzaWVyIHRvCiAgIHdyaXRlIHNjcmlwdHMgdGhhdCB1c2UgY3VybCBzaW5jZSBwcm94aWVzIGFuZCBzdHVmZiBzaG91bGQgYmUgaW4gdGhlCiAgIC5jdXJscmMgZmlsZSBhbnl3YXkuCiAtIEludHJvZHVjaW5nIHRoZSBuZXcgLUYgZmxhZyBmb3IgSFRUUCBQT1NULiBJdCBzdXBwb3J0cyBtdWx0aXBhcnQvZm9ybS1kYXRhCiAgIHdoaWNoIG1lYW5zIGl0IGlzIGdvbm5hIGJlIHBvc3NpYmxlIHRvIHVwbG9hZCBmaWxlcyBldGMgdGhyb3VnaCBIVFRQIFBPU1QuCiAgIFNoaXJheiBLYW5nYSBhc2tlZCBmb3IgdGhlIGZlYXR1cmUgYW5kIG15IGJyb3RoZXIsCiAgIEJq9nJuIFN0ZW5iZXJnIGhlbHBlZCBtZSBkZXNpZ24gdGhlIHVzZXIKICAgaW50ZXJmYWNlIGZvciB0aGlzIGJlYXN0LiAgVGhpcyBmZWF0dXJlIHJlcXVpcmVzIHF1aXRlIHNvbWUgZG9jcywKICAgc2luY2UgaXQgaGFzIHR1cm5lZCBvdXQgbm90IG9ubHkgcXVpdGUgY2FwYWJsZSwgYnV0IGFsc28gY29tcGxpY2F0ZWQhIDotKQogLSBBIG5vdGUgaGVyZSwgc2luY2UgSSd2ZSByZWNlaXZlZCBtYWlsIGFib3V0IGl0LiBTU0xlYXkgdmVyc2lvbnMgcHJpb3IgdG8KICAgMC44IHdpbGwgKm5vdCogd29yayB3aXRoIGN1cmwhCiAtIFdpbCBMYW5nZm9yZCByZXBvcnRlZCBhIGJ1ZyB0aGF0IG9jY3VycmVkIHNpbmNlIGN1cmwKICAgZGlkIG5vdCBwcm9wZXJseSB1c2UgQ1JMRiB3aGVuIGlzc3VpbmcgZnRwIGNvbW1hbmRzLiBJIGZpeGVkIGl0LgogLSBSZWFycmFuZ2VkIHRoZSBvcmRlciBjb25maWcgZmlsZXMgYXJlIHJlYWQuIC5jdXJscmMgaXMgbm93ICphbHdheXMqIHJlYWQKICAgZmlyc3QgYW5kIGJlZm9yZSB0aGUgY29tbWFuZCBsaW5lIGZsYWdzLiAtSyBjb25maWcgZmlsZXMgdGhlbiBhY3QgYXMKICAgYWRkaXRpb25hbCBjb25maWcgaXRlbXMuCiAtIFVzZSAtcSBBUyBUSEUgRklSU1QgT1BUSU9OIHNwZWNpZmllZCB0byBwcmV2ZW50IC5jdXJscmMgZnJvbSBiZWluZyByZWFkLgogLSBZb3UgY2FuIG5vdyBkaXNhYmxlIGEgcHJveHkgYnkgdXNpbmcgLXggIiIuIFVzZWZ1bCBpZiB0aGUgLmN1cmxyYyBmaWxlCiAgIHNwZWNpZmllcyBhIHByb3h5IGFuZCB5b3Ugd2FubmEgZmV0Y2ggc29tZXRoaW5nIHdpdGhvdXQgZ29pbmcgdGhyb3VnaAogICB0aGF0LgogLSBJJ20gdGhpbmtpbmcgb2YgZHJvcHBpbmcgdGhlIC1wIHN1cHBvcnQuIEl0cyByZWFsbHkgbm90IHVzZWZ1bCBzaW5jZSBwb3J0cwogICBjb3VsZCAoYW5kIHNob3VsZD8pIGJlIHNwZWNpZmllZCBhcyA6PHBvcnQ+IGFwcGVuZGVkIG9uIHRoZSBob3N0IG5hbWUKICAgaW5zdGVhZCwgYm90aCBpbiBVUkxzIGFuZCB0byBwcm94eSBob3N0IG5hbWVzLgogLSBNYXJ0aW4gU3RhYWVsIHJlcG9ydHMgY3VybCAtTCBidWdzIHVuZGVyIFdpbmRvd3MgTlQKICAgKHRlc3Qgd2l0aCBVUkwgaHR0cDovL2NvbWUudG8vc2NzZGUpLiBUaGlzIGJ1ZyBpcyBub3QgcHJlc2VudCBpbiB0aGlzCiAgIHZlcnNpb24gYW55bW9yZS4KIC0gQWRkZWQgc3VwcG9ydCBmb3IgdGhlIHdlaXJkIEZUUCBVUkwgdHlwZT0gdGhpbmcuIFlvdSBjYW4gZG93bmxvYWQgYSBmaWxlCiAgIHVzaW5nIEFTQ0lJIHRyYW5zZmVyIGJ5IGFwcGVuZGluZyAiO3R5cGU9QSIgdG8gdGhlIHJpZ2h0IG9mIGl0LiBPdGhlcgogICBhdmFpbGFibGUgdHlwZXMgYXJlIHR5cGU9RCBmb3IgZGlyLWxpc3QgKE5MU1QpIGFuZCB0eXBlPUkgZm9yIGJpbmFyeQogICB0cmFuc2Zlci4gSSBjYW4ndCBzYXkgSSd2ZSBldmVyIHNlZW4gYW55b25lIHVzZSB0aGlzIGtpbmQgb2YgVVJMIHRob3VnaCEKICAgOi0pCiAtIFRyb3kgRW5nZWwgcG9pbnRlZCBvdXQgYSBidWcgaW4gbXkgZ2V0ZW52KCJIT01FIikKICAgdXNhZ2UgZm9yIHdpbjMyIHN5c3RlbXMuIEkgaW50cm9kdWNlIGdldGVudi5jIHRvIGJldHRlciBjb3BlIHdpdGgKICAgdGhpcy4gTXIgRW5nZWwgaGVscHMgbWUgd2l0aCB0aGUgZGV0YWlscyBhcm91bmQgdGhhdC4uLgogLSBBIGxpdHRsZSBub3RlIHRvIG15c2VsZiBhbmQgb3RoZXJzLCBJIHNob3VsZCBtYWtlIHRoZSB3aW4zMi1iaW5hcnkgYnVpbHQKICAgd2l0aCBTU0wgc3VwcG9ydC4uLgogLSBSeWFuIE5lbHNvbiBzZW50IG1lIGNvbW1lbnRzIGFib3V0IGJ1aWxkaW5nIGN1cmwKICAgd2l0aCBTU0wgdW5kZXIgRnJlZUJTRC4gU2VlIHRoZSBNYWtlZmlsZSBmb3IgZGV0YWlscy4gVXNpbmcgdGhlIGNvbmZpZ3VyZQogICBzY3JpcHQsIGl0IHNob3VsZCB3b3JrIGJldHRlciBhbmQgYXV0b21hdGljYWxseSBub3cuLi4KIC0gQ2xlYW5lZCB1cCBpbiB0aGUgcG9ydCBudW1iZXIgbWVzcyBpbiB0aGUgc291cmNlLiBObyBsb25nZXIgc3RvcmVzIGFuZCB1c2VzCiAgIHByb3h5IHBvcnQgbnVtYmVyIHNlcGFyYXRlIGZyb20gbm9ybWFsIHBvcnQgbnVtYmVyLgogLSAnY29uZmlndXJlJyBzY3JpcHQgd29ya2luZy4gQ29uZmlybWVkIGNvbXBpbGVzIG9uOgogICAgSG9zdCAgICAgICAgIFNTTCAgQ29tcGlsZXIKICAgIFN1bk9TIDUuNSAgICBubyAgIGdjYwogICAgU3VuT1MgNS41LjEgIHllcyAgZ2NjCiAgICBTdW5PUyA1LjYgICAgbm8gICBjYyAgKHdpdGggZ2NjLCBpdCBoYXMgdGhlICJnY2MgaW5jbHVkZSBmaWxlcyIgcHJvYmxlbSkKICAgIFN1bk9TIDQuMS4zICBubyAgIGdjYyAod2l0aG91dCBBTlNJIEMgaGVhZGVycykKICAgIFN1bk9TIDQuMS4yICBubyAgIGdjYyAobmF0aXZlIGNvbXBpbGVyIGZhaWxlZCkKICAgIExpbnV4IDIuMC4xOCBubyAgIGdjYwogICAgTGludXggMi4wLjMyIHllcyAgZ2NjCiAgICBMaW51eCAyLjAuMzUgbm8gICBnY2MgKHdpdGggZ2xpYmMpCiAgICBJUklYIDYuMiAgICAgbm8gICBnY2MgKGNjIGNvbXBpbGVzIGdlbmVyYXRlIGEgZmV3IHdhcm5pbmdzKQogICAgSVJJWCA2LjQgICAgIG5vICAgY2MgIChnZW5lcmF0ZWQgd2FybmluZ3MgdGhvdWdoKQogICAgV2luMzIgICAgICAgIG5vICAgQm9ybGFuZAogICAgT1NGNC4wCSBubyAgID8KCiAtIE9vb3BzLiBUaGUgNWJldGEgKGFuZCA0LjEwKSB1bmRlciB3aW4zMiBmYWlsZWQgaWYgdGhlIEhPTUUgdmFyaWFibGUgd2Fzbid0CiAgIHNldC4KIC0gV2hlbiB1c2luZyBhIHByb3h5LCBjdXJsIG5vdyBndWVzc2VzIGFuZCB1c2VzIHRoZSBwcm90b2NvbCBwYXJ0IGluIGNhc2VzCiAgIGxpa2U6CgljdXJsIC14IHByb3h5OjgwIHd3dy5zaXRlLmNvbQogICBQcm94aWVzIG5vcm1hbGx5IGdvIG51dHMgdW5sZXNzIGh0dHA6Ly8gaXMgcHJlcGVuZGVkIHRvIHRoZSBob3N0IG5hbWUsIHNvCiAgIGlmIGN1cmwgaXMgdXNlZCBsaWtlIHRoaXMsIGl0IGd1ZXNzZXMgcHJvdG9jb2wgYW5kIGFwcGVuZHMgdGhlIHByb3RvY29sCiAgIHN0cmluZyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcHJveHkuIEl0IGFscmVhZHkgZGlkIHRoaXMgd2hlbiB1c2VkCiAgIHdpdGhvdXQgcHJveHkuCiAtIEJldHRlciBwb3J0IHVzYWdlIHdpdGggU1NMIHRocm91Z2ggcHJveHkgbm93LiBJZiB5b3Ugc3BlY2lmaWVkIGEgZGlmZmVyZW50CiAgIGh0dHBzLXBvcnQgd2hlbiBhY2Nlc3NpbmcgdGhyb3VnaCBhIHByb3h5LCBpdCBkaWRuJ3QgdXNlIHRoYXQgbnVtYmVyCiAgIGNvcnJlY3RseS4gSSBhbHNvIHJld3JvdGUgdGhlIGNvZGUgdGhhdCBwYXJzZXMgdGhlIHN0dWZmIHJlYWQgZnJvbSB0aGUKICAgcHJveHkgd2hlbiB5b3Ugd2FubmEgY29ubmVjdCB0aHJvdWdoIGl0IHdpdGggU1NMLgogLSBCam9ybiBSZWVzZSBoZWxwZWQgbWUgd29yayBhcm91bmQgb25lIG9mIHRoZSBjb21waWxlcgogICB3YXJuaW5ncyBvbiBJUklYIG5hdGl2ZSBjYyBjb21waWxlcy4KClZlcnNpb24gNC4xMCAoT2N0IDI2LCAxOTk4KQogRGFuaWVsIFN0ZW5iZXJnCiAtIEpvaG4gQS4gQnJpc3RvciBzdWdnZXN0ZWQgYSBjb25maWcgZmlsZSBzd2l0Y2gsCiAgIGFuZCBzaW5jZSBJJ3ZlIGJlZW4gaGF2aW5nIHRoYXQgaWRlYSBraW5kIG9mIGluIHRoZSBiYWNrZ3JvdW5kIGZvciBhIGxvbmcKICAgdGltZSBJIHJld3JvdGUgdGhlIHBhcmFtZXRlciBwYXJzaW5nIGZ1bmN0aW9uIGEgbGl0dGxlIGFuZCBub3cgSSBpbnRyb2R1Y2UKICAgdGhlIC1LLy0tY29uZmlnIGZsYWcuIEkgYWxzbyBtYWRlIGN1cmwgKmFsd2F5cyogKHVubGVzcyAtSyBpcyB1c2VkKSB0cnkgdG8KICAgbG9hZCB0aGUgLmN1cmxyYyBmaWxlIGZvciBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4gVGhlIHN5bnRheCBmb3IgdGhlCiAgIGNvbmZpZyBmaWxlIGlzIHRoZSBzdGFuZGFyZCBjb21tYW5kIGxpbmUgYXJndW1lbnQgc3R5bGUuIERldGFpbHMgaW4gJ2N1cmwKICAgLWgnIG9yIHRoZSBSRUFETUUuCiAtIEkgcmVtb3ZlZCB0aGUgLWsgb3B0aW9uLiBLZWVwLWFsaXZlIGlzbid0IHJlYWxseSBhbnl0aGluZyBhbnlvbmUgd291bGQKICAgd2FudCB0byBlbmFibGUgd2l0aCBjdXJsIGFueXdheS4KIC0gTWFydGluIFN0YWFlbCBoZWxwZWQgbWUgYWRkIHRoZSAnaXJpeCcgdGFyZ2V0LiBOb3cKICAgIm1ha2UgaXJpeCIgc2hvdWxkIGJ1aWxkIGN1cmwgc3VjY2Vzc2Z1bGx5IG9uIG5vbi1nY2MgU0dJIG1hY2hpbmVzLgogLSBTaW5nbGUgc3dpdGNoZXMgbm93IHRvZ2dsZSBiZWhhdmlvdXJzLiBJLmUgaWYgeW91IHVzZSAtdiAtdiB0aGUgc2Vjb25kCiAgIHdpbGwgc3dpdGNoIG9mZiB0aGUgdmVyYm9zZSBtb2RlIHRoZSBmaXJzdCBvbmUgZW5hYmxlZC4gVGhpcyBpcyBzbyB0aGF0CiAgIHlvdSBjYW4gZGlzYWJsZSBhIGRlZmF1bHQgc2V0dGluZyBhIC5jdXJscmMgZmlsZSBlbmFibGVzIGV0Yy4KClZlcnNpb24gNC45IChPY3QgNywgMTk5OCkKIERhbmllbCBTdGVuYmVyZwogLSBNYXJ0aW4gU3RhYWVsIHN1Z2dlc3RlZCBjdXJsIHdvdWxkIHN1cHBvcnQgY29va2llcy4KICAgSSBhZGRlZCAtYi8tLWNvb2tpZSB0byBlbmFibGUgZnJlZS10ZXh0IGNvb2tpZSBkYXRhIHRvIGJlIHBhc3NlZC4gVGhlcmUncwogICBhbHNvIGEgbGl0dGxlIGJsdXJiIGFib3V0IGdlbmVyYWwgY29va2llIHN0dWZmIGluIHRoZSBSRUFETUUvaGVscCB0ZXh0LgogLSBkbWggPGRtaCBhdCBqZXQuZXM+IHN1Z2dlc3RlZCBIVFRQIHJlc3VtZSBjYXBhYmlsaXRpZXMuIEFsdGhvdWdoIHlvdSBjb3VsZAogICBtYW51YWxseSBnZXQgY3VybCB0byByZXN1bWUgSFRUUCBkb2N1bWVudHMsIEkgbWFkZSB0aGUgLWMgcmVzdW1lIGZsYWcgd29yawogICBmb3IgSFRUUCB0b28gKHVubGVzcyAtciBpcyB1c2VkIHRvbywgd2hpY2ggd291bGQgYmUgdmVyeSBvZGQgYW55d2F5KS4KIC0gQWRkZWQgY2hlY2tsaW5rcy5wbCB0byB0aGUgYXJjaGl2ZS4gSXQgaXMgYSBzdGlsbCBleHBlcmltZW50YWwgcGVybCBzY3JpcHQKICAgdGhhdCBjaGVja3MgYWxsIGxpbmtzIG9mIGEgd2ViIHBhZ2UgYnkgdXNpbmcgY3VybC4KIC0gUmVhcnJhbmdlZCB0aGUgYXJjaGl2ZSBoaWVyYXJjaHkgYSBsaXR0bGUuIEJ1aWxkIHRoZSBleGVjdXRhYmxlIGluIHRoZQogICBzcmMvIGRpciBmcm9tIG5vdyBvbiEKIC0gVmVyc2lvbiA0LjkgYW5kIGhlcmVhZnRlciwgaXMgbm8gbG9uZ2VyIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgbGljZW5zZS4KICAgSSBoYXZlIG5vdyB1cGRhdGVkIHRoZSBMRUdBTCBmaWxlIGV0YyBhbmQgbm93IHRoaXMgaXMgcmVsZWFzZWQgdXNpbmcgdGhlCiAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgdG8gYXZvaWQgdGhlIHBsYWd1ZSBrbm93biBhcyAidGhlIEdQTCB2aXJ1cyIuIFlvdQogICBtdXN0IG1ha2UgdGhlIHNvdXJjZSBhdmFpbGFibGUgaWYgeW91IGRlY2lkZSB0byBjaGFuZ2UgYW5kL29yIHJlZGlzdHJpYnV0ZQogICBjdXJsLCBidXQgaWYgeW91IGRlY2lkZSB0byB1c2UgY3VybCB3aXRoaW4gc29tZXRoaW5nIGVsc2UgeW91IGRvIG5vdCBuZWVkCiAgIHRvIG9mZmVyIHRoZSB3b3JsZCB0aGUgc291cmNlIHRvIHRoYXQgdG9vLgogLSBDdXJsIGRpZCBub3QgbGlrZSBIVFRQIHNlcnZlcnMgdGhhdCBzZW50IG5vIGhlYWRlcnMgYXQgYWxsIG9uIGEgR0VUCiAgIHJlcXVlc3QuICBJdCBpcyBhIHZpb2xhdGlvbiBvZiBSRkMyMDY4IGJ1dCBhcHBlYXJhbnRseSBzb21lIHNlcnZlcnMgZG8KICAgdGhhdCBhbnl3YXkuICBUaGFua3MgdG8gR29yZG9uIEJlYXRvbiBmb3IgdGhlIHJlcG9ydCEKIC0gLUwvLS1sb2NhdGlvbiB3YXMgYWRkZWQgYWZ0ZXIgYSBzdWdnZXN0aW9uIGZyb20gTWFydGluIFN0YWFlbC4gVGhpcyBtYWtlcwogICBjdXJsIEFUVEVNUFQgdG8gZm9sbG93IHRoZSBMb2NhdGlvbjogcmVkaXJlY3QgaWYgb25lIGlzIHByZXNlbnQgaW4gdGhlIEhUVFAKICAgaGVhZGVycy4gSWYgLWkgb3IgLUkgaXMgdXNlZCB3aXRoIHRoaXMgZmxhZywgeW91IHdpbGwgc2VlIGhlYWRlcnMgZnJvbSBhbGwKICAgc2l0ZXMgdGhlIExvY2F0aW9uOiBwb2ludHMgdG8uIERvIG5vdGUgdGhhdCB0aGUgZmlyc3Qgc2VydmVyIGNhbiBwb2ludCB0byBhCiAgIHNlY29uZCB0aGF0IHBvaW50cyB0byBhIHRoaXJkIGV0Yy4gSXQgc2VlbXMgdGhlIExvY2F0aW9uOiBwYXJhbWV0ZXIgKHNhaWQKICAgdG8gYmUgYW4gQWJzb2x1dGVVUkkgaW4gUkZDMjA2OCkgaXNuJ3QgYWx3YXlzIGFic29sdXRlLi4gOi0vIEFueXdheSwgSSd2ZQogICBtYWRlIGN1cmwgQVRURU1QVCB0byBkbyB0aGUgYmVzdCBpdCBjYW4gdG8gZGVhbCB3aXRoIHRoZSByZWFsaXR5LgogLSBBZGRlZCBnZXRsaW5rcy5wbCB0byB0aGUgYXJjaGl2ZS4gZ2V0bGlua3MucGwgc2VsZWN0aXZlbHkgZG93bmxvYWRzCiAgIGZpbGVzIHRoYXQgYSB3ZWIgcGFnZSBsaW5rcyB0by4KClZlcnNpb24gNC44LjQKIERhbmllbCBTdGVuYmVyZwogLSBBcyBKdWxpYW4gUm9tZXJvIE5pZXRvIHJlcG9ydGVkLCBjdXJsIHJlcG9ydGVkIHdyb25nIHZlcnNpb24gbnVtYmVyLgogLSBBcyBUZWVtdSBZbGktRWxzaWxhIHBvaW50ZWQgb3V0LCB0aGUgd2luMzIgdmVyc2lvbiBvZiA0LjggKGFuZCBwcm9iYWJseSBhbGwKICAgb3RoZXIgdmVyc2lvbnMgZm9yIHdpbjMyKSBkaWRuJ3Qgd29yayB3aXRoIGJpbmFyeSBmaWxlcyBzaW5jZSBJJ20gdG9vIHVzZWQKICAgdG8gdGhlIFVOSVggc3R5bGUgZm9wZW4oKSB3aGVyZSBiaW5hcnkgYW5kIHRleHQgZG9uJ3QgZGlmZmVyLi4uCiAtIFJhbHBoIEJlY2ttYW5uIGJyb3VnaHQgbWUgc29tZSBjaGFuZ2VzIHRoYXQgbGV0cyBjdXJsIGNvbXBpbGUgZXJyb3IgYW5kCiAgIHdhcm5pbmcgZnJlZSB3aXRoIC1XYWxsIC1wZWRhbnRpYyB3aXRoIGcrKy4gSSBhbHNvIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvCiAgIGNsZWFuIG9mZiBzb21lIHVudXNlZCB2YXJpYWJsZXMgYW5kIHNpbWlsYXIuCiAtIFJhbHBoIEJlY2ttYW5uIG1hZGUgbWUgYXdhcmUgb2YgYSByZWFsbHkgb2RkIGJ1ZyBub3cgY29ycmVjdGVkLiBXaGVuIGN1cmwKICAgcmVhZCBhIHNldCBvZiBoZWFkZXJzIGZyb20gYSBIVFRQIHNlcnZlciwgZGl2aWRlZCBpbnRvIG1vcmUgdGhhbiBvbmUgcmVhZAogICBhbmQgdGhlIGZpcnN0IHJlYWQgc2hvd2VkIGEgZnVsbCBsaW5lICpleGFjdGx5KiAoaS5lIGVuZGluZyB3aXRoIGEKICAgbmV3bGluZSksIGN1cmwgZGlkIG5vdCBiZWhhdmUgd2VsbC4KClZlcnNpb24gNC44LjMKIERhbmllbCBTdGVuYmVyZwogLSBJIHdhcyB0b28gcXVpY2sgdG8gcmVsZWFzZSA0LjguMiB3aXRoIHRvbyBsaXR0bGUgdGVzdGluZy4gT25lIG9mIHRoZQogICBjaGFuZ2VzIGlzIG5vdyByZXZlcnRlZCBzbGlnaHRseSB0byB0aGUgNC44LjEgd2F5IHNpbmNlIDQuOC4yIGNvdWxkbid0CiAgIHVwbG9hZCBmaWxlcy4gSSBzdGlsbCB0aGluayBib3RoIHByb2JsZW1zIGNvcnJlY3RlZCBpbiA0LjguMiByZW1haW4KICAgY29ycmVjdGVkLiAgUmVwb3J0ZWQgYnkgSnVsaWFuIFJvbWVybyBOaWV0by4KClZlcnNpb24gNC44LjIKIERhbmllbCBTdGVuYmVyZwogLSBCZXJuaGFyZCBJc2VsYm9ybiByZXBvcnRlZCB0d28gRlRQIHByb3RvY29sIGVycm9ycyBjdXJsIGRpZC4gVGhleSdyZSBub3cKICAgY29ycmVjdGVkLiBCb3RoIGFwcGVhcmVkIHdoZW4gZ2V0dGluZyBmaWxlcyBmcm9tIGEgTVMgRlRQIHNlcnZlciEgOi0pCgpWZXJzaW9uIDQuOC4xCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgYSBsYXN0IHVwZGF0ZSBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd2hlbiB0aGUgdHJhbnNmZXIgaXMgZG9uZS4gVGhlCiAgIGZpbmFsIG91dHB1dCBvbiB0aGUgc2NyZWVuIGRpZG4ndCBoYXZlIHRvIGJlIHRoZSBmaW5hbCBzaXplIHRyYW5zZmVyZWQKICAgd2hpY2ggbWFkZSBpdCBzb21ldGltZXMgbG9vayBvZGQuCiAtIFRoYW5rcyB0byBEYXZpZCBMb25nIEkgZ290IHJpZCBvZiBhIHNpbGx5IGJ1ZyB0aGF0IGhhcHBlbmVkIGlmIGEgSFRUUC1wYWdlCiAgIGhhZCBub3RoaW5nIGJ1dCBoZWFkZXIuIEFwcGVhcmFudGx5IFNvbGFyaXMgZGVhbHMgd2l0aCBuZWdhdGl2ZSBzaXplcyBpbgogICBmd3JpdGUoKSBjYWxscyBhIGxvdCBiZXR0ZXIgdGhhbiBMaW51eCBkb2VzLi4uID1CLV0KClZlcnNpb24gNC44IChBdWcgMzEsIDE5OTgpCiBEYW5pZWwgU3RlbmJlcmcKIC0gQ29udGludWUgRlRQIGZpbGUgdHJhbnNmZXIuIC1jIGlzIHRoZSBzd2l0Y2guIE5vdGUgdGhhdCB5b3UgbmVlZCB0bwogICBzcGVjaWZ5IGEgZmlsZSBuYW1lIGlmIHlvdSB3YW5uYSByZXN1bWUgYSBkb3dubG9hZCAoeW91IGNhbid0IHJlc3VtZSBhCiAgIGRvd25sb2FkIHNlbnQgdG8gc3Rkb3V0KS4gUmVzdW1pbmcgdXBsb2FkIG1heSBiZSBsaW1pdGVkIGJ5IHRoZSBzZXJ2ZXIKICAgc2luY2UgY3VybCBpcyB0aGVuIHVzaW5nIHRoZSBub24tUkZDOTU5IGNvbW1hbmQgU0laRSB0byBnZXQgdGhlIHNpemUgb2YKICAgdGhlIHRhcmdldCBmaWxlIGJlZm9yZSB1cGxvYWQgYmVnaW5zICh0byBmaWd1cmUgb3V0IHdoaWNoIG9mZnNldCB0bwogICB1c2UpLiBVc2UgLUMgdG8gc3BlY2lmeSB0aGUgb2Zmc2V0IHlvdXJzZWxmISAtQyBpcyBoYW5keSBpZiB5b3UncmUgZG9pbmcKICAgdGhlIG91dHB1dCB0byBzb21ldGhpbmcgZWxzZSBidXQgYSBwbGFpbiBmaWxlIG9yIHdoZW4geW91IGp1c3Qgd2FudCB0byBnZXQKICAgdGhlIGVuZCBvZiBhIGZpbGUuCiAtIHJlY3Vyc2l2ZWZ0cGdldC5wbCBub3cgZmVhdHVyZXMgYSBtYXhpbXVtIHJlY3Vyc2l2ZSBsZXZlbCBhcmd1bWVudC4KClZlcnNpb24gNC43CiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgc3VwcG9ydCB0byBhYm9ydCBhIGRvd25sb2FkIGlmIHRoZSBzcGVlZCBpcyBiZWxvdyBhIGNlcnRhaW4gYW1vdW50CiAgIChzcGVlZC1saW1pdCkgYnl0ZXMgcGVyIHNlY29uZCBmb3IgYSBjZXJ0YWluIChzcGVlZC10aW1lKSB0aW1lLgogLSBXcm90ZSBhIHBlcmwgc2NyaXB0ICdyZWN1cnNpdmVmdHBnZXQucGwnIHRvIHJlY3Vyc2l2ZWx5IHVzZSBjdXJsIHRvIGdldCBhCiAgIHdob2xlIGZ0cCBkaXJlY3RvcnkgdHJlZS4gSXQgaXMgbWVhbnQgYXMgYW4gZXhhbXBsZSBvZiBob3cgY3VybCBjYW4gYmUKICAgdXNlZC4gIEkgYWdyZWUgaXQgaXNuJ3QgdGhlIHdpc2VzdCB0aGluZyB0byBkbyB0byBtYWtlIGEgc2VwYXJhdGUgbmV3CiAgIGNvbm5lY3Rpb24gZm9yIGVhY2ggZmlsZSBhbmQgZGlyZWN0b3J5IGZvciB0aGlzLgoKVmVyc2lvbiA0LjYKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBhIGZpcnN0IGF0dGVtcHQgdG8gb3B0aW9uYWxseSBwYXJzZSB0aGUgLm5ldHJjIGZpbGUgZm9yIGxvZ2luIHVzZXIKICAgYW5kIHBhc3N3b3JkLiBJZiB1c2VkIHdpdGggaHR0cCwgaXQgZW5hYmxlcyB1c2VyIGF1dGhlbnRpY2F0aW9uLiAtbiBpcwogICB0aGUgbmV3IHN3aXRjaC4KIC0gUmVtb3ZlZCB0aGUgZXh0cmEgbmV3bGluZXMgb24gdGhlIGRlZmF1bHQgdXNlci1hZ2VudCBzdHJpbmcuCiAtIENvcnJlY3RlZCB0aGUgbWlzc2luZyBmdHAgdXBsb2FkIGVycm9yIG1lc3NhZ2VzIHdoZW4gaXQgZmFpbGVkIHdpdGhvdXQgdGhlCiAgIHZlcmJvc2UgZmxhZyBzZXQuIEdhcnkgVy4gU3dlYXJpbmdlbiBmb3VuZCBpdC4KIC0gTm93IHVzaW5nIGFsYXJtKCkgdG8gZW5hYmxlIHNlY29uZC1wcmVjaXNpb24gdGltZW91dCBldmVuIG9uIHRoZSBuYW1lCiAgIHJlc29sdmluZy9jb25uZWN0aW5nIHBoYXNlLiBUaGUgdGltZW91dCBpcyBhbHRob3VnaCByZXNldCBhZnRlciB0aGF0IGZpcnN0CiAgIHNlcXVlbmNlLiAoVGhpcyBzaG91bGQgYmUgY29ycmVjdGVkLikgR2FyeSBXLiBTd2VhcmluZ2VuIHJlcG9ydGVkLgogLSBOb3cgc3BlbGxzICJVbmtub3duIiBwcm9wZXJseSwgYXMgaW4gIlVua25vd24gb3B0aW9uICd6JyIuLi4gOi0pCiAtIEFkZGVkIGJ1ZyByZXBvcnQgZW1haWwgYWRkcmVzcyBpbiB0aGUgUkVBRE1FLgogLSBBZGRlZCBhICJjdXJyZW50IHNwZWVkIiBmaWVsZCB0byB0aGUgcHJvZ3Jlc3MgbWV0ZXIuIEl0IHNob3dzIHRoZSBhdmVyYWdlCiAgIHNwZWVkIHRoZSBsYXN0IDUgc2Vjb25kcy4gVGhlIG90aGVyIHNwZWVkIGZpZWxkIHNob3dzIHRoZSBhdmVyYWdlIHNwZWVkIG9mCiAgIHRoZSBlbnRpcmUgdHJhbnNmZXIgc28gZmFyLgoKVmVyc2lvbiA0LjUuMQogTGluYXMgVmVwc3RhcwogLSBTU0wgdGhyb3VnaCBwcm94eSBmaXgKIC0gQWRkZWQgLUEgdG8gYWxsb3cgVXNlci1BZ2VudDogY2hhbmdlcwoKIERhbmllbCBTdGVuYmVyZyAKIC0gTWFkZSB0aGUgLUEgd29yayB3aGVuIFNTTC10aHJvdWdoLXByb3h5LgoKVmVyc2lvbiA0LjUKIExpbmFzIFZlcHN0YXMKIC0gTW9yZSBTU0wgY29ycmVjdGlvbnMKIC0gSSd2ZSBhZGRlZCBhIHBvcnQgdG8gQUlYLgogLSBydW5uaW5nIFNTTCB0aHJvdWdoIGEgcHJveHkgY2F1c2VzIGEgY2h1bmsgb2YgY29kZSB0byBiZSBleGVjdXRyZWQgdHdpY2UuCiAgIG9uZSBvZiB0aG9zZSBibG9ja3MgbmVlZHMgdG8gYmUgZGVsZXRlZC4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFkZSAtaSBhbmQgLUkgd29yayBhZ2FpbgoKVmVyc2lvbiA0LjQKIExpbmFzIFZlcHN0YXMKIC0gLXggY2FuIG5vdyBhbHNvIHNwZWNpZnkgcHJveHlwb3J0IHdoZW4gdXNlZCBhcyBpbiAncHJveHlob3N0OnByb3h5cG9ydCcKIC0gU1NMIGZpeGVzCgpWZXJzaW9uIDQuMwogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkanVzdGVkIHRvIGNvbXBpbGUgdW5kZXIgd2luMzIgKFZpc3VhbEMrKyA1KS4gVGhlIC1QIHN3aXRjaCBkb2VzIG5vdAogICBzdXBwb3J0IG5ldHdvcmsgaW50ZXJmYWNlIG5hbWVzIGluIHdpbjMyLiBJIGNvdWxkbid0IGZpZ3VyZSBvdXQgaG93IQoKVmVyc2lvbiA0LjIKIExpbmFzIFZlcHN0YXMgLyBTYW1wbyBLZWxsb21ha2kKIC0gQWRkZWQgU1NMIC8gU1NMZWF5IHN1cHBvcnQgKGh0dHBzOi8vKQogLSBBZGRlZCB0aGUgLVQgdXNhZ2UgZm9yIEhUVFAgUE9TVC4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gQnVnZml4ZWQgdGhlIFNTTCBpbXBsZW1lbnRhdGlvbi4KIC0gTWFkZSAtUCBhIGxvdCBiZXR0ZXIgdG8gdXNlIG90aGVyIElQIGFkZHJlc3Nlcy4gSXQgbm93IGFjY2VwdHMgYSBmb2xsb3dpbmcKICAgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIGVpdGhlcgogICAgICAgIGludGVyZmFjZSAtIGkuZSAiZXRoMCIgdG8gc3BlY2lmeSB3aGljaCBpbnRlcmZhY2UncyBJUCBhZGRyZXNzIHlvdQogICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gdXNlCiAgICAgICAgSVAgYWRkcmVzcyAtIGkuZSAiMTkyLjE2OC4xMC4xIiB0byBzcGVjaWZ5IGV4YWN0IElQIG51bWJlcgogICAgICAgIGhvc3QgbmFtZSAtIGkuZSAibXkuaG9zdC5kb21haW4iIHRvIHNwZWNpZnkgbWFjaGluZQogICAgICAgICItIiAgICAgICAtIChhbnkgc2luZ2xlLWxldHRlciBzdHJpbmcpIHRvIG1ha2UgaXQgcGljayB0aGUgbWFjaGluZSdzCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdAogLSBUaGUgTWFrZWZpbGUgaXMgbm93IHJlYWR5IHRvIGNvbXBpbGUgZm9yIHNvbGFyaXMsIHN1bm9zNCBhbmQgbGludXggcmlnaHQKICAgb3V0IG9mIHRoZSBib3guCiAtIEJldHRlciBnZW5lcmF0ZWQgdmVyc2lvbiBzdHJpbmcgc2VlbiB3aXRoICdjdXJsIC1WJwoKVmVyc2lvbiA0LjEKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgSVAgbnVtYmVyIHJldHVybmVkIGJ5IHRoZSBmdHAgc2VydmVyIGFzIGEgcmVwbHkgdG8gUEFTViBkb2VzIG5vIGxvbmdlcgogICBoYXZlIHRvIEROUyByZXNvbHZlLiBJbiBmYWN0LCBubyBJUC1udW1iZXItb25seSBhZGRyZXNzZXMgaGF2ZSB0byBhbnltb3JlLgogLSBCaW5kcyBiZXR0ZXIgdG8gYXZhaWxhYmxlIHBvcnQgd2hlbiAtUCBpcyB1c2VkLgogLSBOb3cgTElTVHMgLi8gaW5zdGVhZCBvZiAvIHdoZW4gdXNlZCBhcyBpbiBmdHA6Ly9mdHAuZnVuZXQuZmkvLiBUaGUgcmVhc29uCiAgIGZvciB0aGlzIGlzIHRoYXQgZXhhY3RseSB0aGF0IHNpdGUsIGZ0cC5mdW5ldC5maSwgZG9lcyBub3QgYWxsb3cgTElTVCAvCiAgIHdoaWxlIExJU1QgLi8gaXMgZmluZS4gQW55IG9iamVjdGlvbnM/CgpWZXJzaW9uIDQgKDE5OTgtMDMtMjApCiBEYW5pZWwgU3RlbmJlcmcKIC0gSSB0b29rIGFub3RoZXIgaHVnZSBzdGVwIGFuZCBjaGFuZ2VkIGJvdGggdmVyc2lvbiBudW1iZXIgYW5kIHByb2plY3QgbmFtZSEKICAgVGhlIHJlYXNvbiBmb3IgdGhlIG5ldyBuYW1lIGlzIHRoYXQgdGhlcmUgYXJlIGp1c3Qgb25lIHRvbyBtYW55IHByb2dyYW1zCiAgIG5hbWVkIHVybGdldCBhbHJlYWR5IGFuZCB0aGlzIHByb2dyYW0gYWxyZWFkeSBjYW4gYSBsb3QgbW9yZSB0aGFuIG1lcmVseQogICBnZXR0aW5nIFVSTHMsIGFuZCB0aGUgcmVhc29uIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgaXMgdGhhdCBJIGRpZCBhZGQgdGhlCiAgIHByZXR0eSBiaWcgY2hhbmdlIGluIC1QIGFuZCBzaW5jZSBJIGNoYW5nZWQgbmFtZSBJIHdhbnRlZCB0byBzdGFydCB3aXRoCiAgIHNvbWV0aGluZyBmcmVzaCEKIC0gVGhlIC0tc3R5bGUgZmxhZ3MgYXJlIHdvcmtpbmcgYmV0dGVyIG5vdy4KIC0gTGlzdGluZyBkaXJlY3RvcmllcyB3aXRoIEZUUCBvZnRlbiByZXBvcnRlZCB0aGF0IHRoZSBmaWxlIHRyYW5zZmVyIHdhcwogICBpbmNvbXBsZXRlLiBXcm9uZyBhc3N1bXB0aW9ucyB3ZXJlIHRvbyBjb21tb24gZm9yIGRpcmVjdG9yaWVzLCB3aHkgbm8KICAgc2l6ZSB3aWxsIGJlIGF0dGVtcHRlZCB0byBnZXQgY29tcGFyZWQgb24gdGhlbSBmcm9tIG5vdyBvbi4KIC0gSW1wbGVtZW50ZWQgdGhlIC1QIGZsYWcgdGhhdCBsZXQncyB0aGUgZnRwIGNvbnRyb2wgaXNzdWUgYSBQT1JUIGNvbW1hbmQKICAgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgUEFTVi4KIC0gLWEgZm9yIGFwcGVuZGluZyBGVFAgdXBsb2FkcyB3b3Jrcy4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVmVyc2lvbiAzLjEyICgxNCBNYXJjaCAxOTk4KQogRGFuaWVsIFN0ZW5iZXJnCiAtIEVuZC1vZi1oZWFkZXIgdHJhY2tpbmcgc3RpbGwgbGFja2VkIHN1cHBvcnQgZm9yIFxyXG4gb3IganVzdCBcbiBhdCB0aGUKICAgZW5kIG9mIHRoZSBsYXN0IGhlYWRlciBsaW5lLgogU2VyZ2lvIEJhcnJlc2kKIC0gQWRkZWQgUFJPWFkgYXV0aGVudGljYXRpb24uCiBSYWZhZWwgU2FndWxhCiAtIEZpeGVkIHNvbWUgbGl0dGxlIGJ1Z3MuCgpWZXJzaW9uIDMuMTEKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgaGVhZGVyIHBhcnNpbmcgd2FzIHN0aWxsIG5vdCBjb3JyZWN0IHNpbmNlIHRoZSAzLjIgbW9kaWZpY2F0aW9uLi4uCgpWZXJzaW9uIDMuMTAKIERhbmllbCBTdGVuYmVyZwogLSAzLjcgYW5kIDMuOSB3ZXJlIHNpbXVsdGFuZW91c2x5IGRldmVsb3BlZCBhbmQgbWVyZ2VkIGludG8gdGhpcyB2ZXJzaW9uLgogLSBGVFAgdXBsb2FkIGRpZCBub3Qgd29yayBjb3JyZWN0bHkgc2luY2UgMy4yLgoKVmVyc2lvbiAzLjkKIFJhZmFlbCBTYWd1bGEKIC0gQWRkZWQgdGhlICItZSA8dXJsPiAvIC0tcmVmZXJlciA8dXJsPiIgb3B0aW9uIHdoZXJlIHdlIGNhbiBzcGVjaWZ5CiAgIHRoZSByZWZlcmVyIHBhZ2UuIE9idmlvdXNseSwgdGhpcyBpcyBuZWNlc3Nhcnkgb25seSB0byBmb29sIHRoZQogICBzZXJ2ZXIsIGJ1dC4uLgoKVmVyc2lvbiAzLjcKIERhbmllbCBTdGVuYmVyZwogLSBOb3cgY2hlY2tzIHRoZSBsYXN0IGVycm9yIGNvZGUgc2VudCBmcm9tIHRoZSBmdHAgc2VydmVyIGFmdGVyIGEgZmlsZSBoYXMKICAgYmVlbiByZWNlaXZlZCBvciB1cGxvYWRlZC4gV2Fzbid0IGRvbmUgcHJldmlvdXNseS4KIC0gV2hlbiAndXJsZ2V0IDxob3N0PicgaXMgdXNlZCB3aXRob3V0IGEgJ3Byb3RvY29sOi8vJyBmaXJzdCBpbiB0aGUgaG9zdCBwYXJ0LAogICBpdCBub3cgY2hlY2tzIGZvciBob3N0IG5hbWVzIHN0YXJ0aW5nIHdpdGggZnRwIG9yIGdvcGhlciBhbmQgaWYgaXQgZG9lcywKICAgaXQgdXNlcyB0aGF0IHByb3RvY29sIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiBodHRwLgoKVmVyc2lvbiAzLjYKIERhbmllbCBTdGVuYmVyZwogLSBTaWxseSBtaXN0YWtlIG1hZGUgdGhlIFBPU1QgYnVnLiBUaGlzIGhhcyBub3cgYWxzbyBiZWVuIHRlc3RlZCB0byB3b3JrIHdpdGgKICAgcHJveHkuCgpWZXJzaW9uIDMuNQogRGFuaWVsIFN0ZW5iZXJnCiAtIEhpZ2hseSBpbnNwaXJlZCBieSBSYWZhZWwgU2FndWxhJ3MgY2hhbmdlcyB0byB0aGUgMy4xIHRoYXQgYWRkZWQgYW4gYWxtb3N0CiAgIGZ1bmN0aW9uYWwgUE9TVCwgSSBhcHBsaWVkIGhpcyBjaGFuZ2VzIGludG8gdGhpcyB2ZXJzaW9uIGFuZCBtYWRlIHRoZW0gd29yay4KICAgKEl0IHNlZW1zIFBPU1QgcmVxdWlyZXMgdGhlIENvbnRlbnQtVHlwZSBhbmQgQ29udGVudC1MZW5ndGggaGVhZGVycy4pIEl0IGlzCiAgIG5vdyB1c2FibGUgd2l0aCB0aGUgLWQgc3dpdGNoLgoKVmVyc2lvbiAzLjMgLSAzLjQKIFBhc3NlZCB0byBhdm9pZCBjb25mdXNpb25zCgpWZXJzaW9uIDMuMgogRGFuaWVsIFN0ZW5iZXJnCiAtIE1ham9yIHJld3JpdGUgb2YgdHdvIGNydWNpYWwgcGFydHMgb2YgdGhpcyBjb2RlOiB1cGxvYWQgYW5kIGRvd25sb2FkLgogICBUaGV5IGFyZSBib3RoIG5vdyB1c2luZyBhIHNlbGVjdCgpIHN3aXRjaCwgdGhhdCBhbGxvd3MgbXVjaCBiZXR0ZXIKICAgcHJvZ3Jlc3MgbWV0ZXIgYW5kIHRpbWUgY29udHJvbC4gCiAtIGFsYXJtKCkgdXNhZ2UgcmVtb3ZlZCBjb21wbGV0ZWx5CiAtIEZUUCBnZXQgY2FuIG5vdyBsaXN0IGRpcmVjdG9yeSBjb250ZW50cyBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSBzbGFzaCAnLycuCiAgIFVybGdldCBvbiBhIGZ0cC1wYXRoIHRoYXQgZG9lc24ndCBlbmQgd2l0aCBhIHNsYXNoIG1lYW5zIHVybGdldCB3aWxsCiAgIGF0dGVtcHQgZ2V0dGluZyBpdCBhcyBhIGZpbGUgbmFtZS4KIC0gRlRQIGRpcmVjdG9yeSB2aWV3IHN1cHBvcnRzIC1sIGZvciAibGlzdC1vbmx5IiB3aGljaCBsaXN0cyB0aGUgZmlsZSBuYW1lcwogICBvbmx5LgogLSBBbGwgb3BlcmF0aW9ucyBzdXBwb3J0IC1tIGZvciBtYXggdGltZSB1c2FnZSBpbiBzZWNvbmRzIGFsbG93ZWQuCiAtIEZUUCB1cGxvYWQgbm93IGFsbG93cyB0aGUgc2l6ZSBvZiB0aGUgdXBsb2FkZWQgZmlsZSB0byBiZSBwcm92aWRlZCwgYW5kCiAgIHRodXMgaXQgY2FuIGJldHRlciBjaGVjayBpdCBhY3R1YWxseSB1cGxvYWRlZCB0aGUgd2hvbGUgZmlsZS4gSXQgYWxzbwogICBtYWtlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZm9yIHVwbG9hZHMgbXVjaCBiZXR0ZXIhCiAtIE1hZGUgdGhlIHBhcmFtZXRlciBwYXJzaW5nIGZhaWwgaW4gY2FzZXMgbGlrZSAndXJsZ2V0IC1yIDkwMCcgd2hpY2gKICAgcHJldmlvdXNseSB0cmllZCB0byBjb25uZWN0IHRvIHRoZSBob3N0IG5hbWVkICc5MDAnLgoKVmVyc2lvbiAzLjEKIEtqZWxsIEVyaWNzb24KIC0gUG9pbnRlZCBvdXQgaG93IHRvIGNvcnJlY3QgdGhlIDMgd2FybmluZ3MgaW4gd2luMzItY29tcGlsZXMuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIFJlbW92ZWQgYWxsIGNhbGxzIHRvIGV4aXQoKS4KIC0gTWFkZSB0aGUgc2hvcnQgaGVscCB0ZXh0IGdldCB3cml0dGVuIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyci4KIC0gTWFkZSB0aGlzIGZpbGUgaW5zdGVhZCBvZiBrZWVwaW5nIHRoZXNlIGNvbW1lbnRzIGluIHRoZSBzb3VyY2UuCiAtIE1hZGUgdHdvIGNhbGxiYWNrIGhvb2tzLCB0aGF0IGVuYWJsZSBleHRlcm5hbCBwcm9ncmFtcyB0byB1c2UgdXJsZ2V0KCkKICAgZWFzaWVyIGFuZCB0byBncmFiIHRoZSBvdXRwdXQvb2ZmZXIgdGhlIGlucHV0IGVhc2llci4KIC0gSXQgaXMgZXZpZGVudCB0aGF0IFdpbjMyLWNvbXBpbGVzIGFyZSBwYWluZnVsLiBJIHdhdGNoZWQgdGhlIG91dHB1dCBmcm9tCiAgIHRoZSBCb3JsYW5kIEMrKyB2NSBhbmQgaXQgd2FzIGF3ZnVsLiBKdXN0IGlnbm9yZSBhbGwgdGhvc2Ugd2FybmluZ3MuCgpWZXJzaW9uIDMuMAogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIEZUUCB1cGxvYWQgY2FwYWJpbGl0aWVzLiBUaGUgbmFtZSB1cmxnZXQgZ2V0cyBhIGJpdCBzaWxseSBub3cKICAgd2hlbiB3ZSBjYW4gcHV0IHRvby4uLiA9KQogLSBSZXN0cnVjdHVyZWQgdGhlIHNvdXJjZSBxdWl0ZSBhIGxvdC4KICAgQ2hhbmdlZCB0aGUgdXJsZ2V0KCkgaW50ZXJmYWNlLiBUaGlzIHdheSwgd2Ugd2lsbCBzdXJ2aXZlIGNoYW5nZXMgbXVjaAogICBiZXR0ZXIuIE5ldyBmZWF0dXJlcyBjYW4gY29tZSBhbmQgb2xkIGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgdXMgbmVlZGluZwogICB0byBjaGFuZ2UgdGhlIGludGVyZmFjZS4gSSd2ZSB3cml0dGVuIGEgc21hbGwgZXhwbGFuYXRpb24gaW4gdXJsZ2V0LmgKICAgdGhhdCBleHBsYWlucyBpdC4KIC0gTmV3IGZsYWdzIGluY2x1ZGUgLXQsIC1ULCAtTyBhbmQgLWguIFRoZSAtaCB0ZXh0IGlzIGdlbmVyYXRlZCBieSB0aGUgbmV3CiAgIG1raGVscCBzY3JpcHQuCgpWZXJzaW9uIDIuOQogUmVtY28gdmFuIEhvb2ZmCiAtIEFkZGVkIGEgZml4IHRvIG1ha2UgaXQgY29tcGlsZSBzbW9vdGhseSBvbiBBbWlnYSB1c2luZyB0aGUgU0FTL0MKICAgY29tcGlsZXIuCiAgCiBEYW5pZWwgU3RlbmJlcmcKIC0gQmVsaWV2ZSBpdCBvciBub3QsIGJ1dCB0aGUgU1RVUElEIE5vdmVsbCB3ZWIgc2VydmVyIHNlZW1zIHRvIHJlcXVpcmUKICAgdGhhdCB0aGUgSG9zdDoga2V5d29yZCBpcyB1c2VkLCBzbyB3ZWxsIEkgdXNlIGl0IGFuZCBJIChyZS1pbnRyb2R1Y2UpIHRoZQogICB1cmxnZXQgVXNlci1BZ2VudDouIEkgc3RpbGwgaGF2ZSB0byBjaGVjayB0aGF0IHRoaXMgSG9zdDogdXNhZ2Ugd29ya3Mgd2l0aAogICBwcm94aWVzLi4uICdIb3N0OicgaXMgcmVxdWlyZWQgZm9yIEhUVFAvMS4xIEdFVCBhY2NvcmRpbmcgdG8gUkZDMjA2OC4KClZlcnNpb24gMi44CiBSYWZhZWwgU2FndWxhCiAtIHNvbWUgbGl0dGxlIG1vZGlmaWNhdGlvbnMKClZlcnNpb24gMi43CiBEYW5pZWwgU3RlbmJlcmcKIC0gUmVtb3ZlZCB0aGUgLWwgb3B0aW9uIGFuZCBpbnRyb2R1Y2VkIHRoZSAtZiBvcHRpb24gaW5zdGVhZC4gTm93IEknbGwKICAgcmV3cml0ZSB0aGUgZm9ybWVyIC1sIGtsdWRnZSBpbiBhbiBleHRlcm5hbCBzY3JpcHQgdGhhdCdsbCB1c2UgdXJsZ2V0IHRvCiAgIGZldGNoIG11bHRpcGFydCBmaWxlcyBsaWtlIHRoYXQuCiAtICctZicgaXMgaW50cm9kdWNlZCwgaXQgbWVhbnMgRmFpbCB3aXRob3V0IG91dHB1dCBpbiBjYXNlIG9mIEhUVFAgc2VydmVyCiAgIGVycm9ycyAocmV0dXJuIGNvZGUgPj0zMDApLgogLSBBZGRlZCBzdXBwb3J0IGZvciAtciwgcmFuZ2VzLiBTcGVjaWZ5IHdoaWNoIHBhcnQgb2YgYSBkb2N1bWVudCB5b3UgCiAgIHdhbnQsIGFuZCBvbmx5IHRoYXQgcGFydCBpcyByZXR1cm5lZC4gT25seSB3aXRoIEhUVFAvMS4xLXNlcnZlcnMuCiAtIFNwbGl0IHVwIHRoZSBzb3VyY2UgaW4gMyBwYXJ0cy4gTm93IGFsbCBwdXJlIFVSTCBmdW5jdGlvbnMgYXJlIGluCiAgIHVybGdldC5jIGFuZCBzdHVmZiB0aGF0IGRlYWxzIHdpdGggdGhlIHN0YW5kLWFsb25lIHByb2dyYW0gaXMgaW4gbWFpbi5jLgogLSBJIHRvb2sgYSBmZXcgbWludXRlcyBhbmQgd3JvdGUgYW4gZW1icnlvIG9mIGEgUkVBRE1FIGZpbGUgdG8gZXhwbGFpbgogICBhIGZldyB0aGluZ3MuCgpWZXJzaW9uIDIuNgogRGFuaWVsIFN0ZW5iZXJnCiAtIE1hZGUgdGhlIC1sIChsb29wKSB0aGluZyB1c2UgdGhlIG5ldyBDT05GX0ZBSUxPTkVSUk9SIHdoaWNoIG1ha2VzCiAgIHVybGdldCgpIHJldHVybiBlcnJvciBjb2RlIGlmIG5vbi1zdWNjZXNzZnVsLiBJdCBhbHNvIHdvbid0IG91dHB1dCBhbnl0aGluZwogICB0aGVuLiBOb3cgZmluYWxseSByZW1vdmVkIHRoZSBIVFRQIDEuMCBhbmQgZXJyb3IgNDA0IGRlcGVuZGVuY2llcy4KIC0gQWRkZWQgLUkgd2hpY2ggdXNlcyB0aGUgSEVBRCByZXF1ZXN0IHRvIGdldCB0aGUgaGVhZGVyIG9ubHkgZnJvbSBhCiAgIGh0dHAtc2VydmVyLgoKVmVyc2lvbiAyLjUKIFJhZmFlbCBTYWd1bGEKIC0gTWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgdXNlIEhISDpNTTpTUyBpbnN0ZWFkIG9mIG9ubHkgc2Vjb25kcy4KClZlcnNpb24gMi40CiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgcHJvZ3Jlc3MgbWV0ZXIuIEl0IGFwcGVhcnMgd2hlbiBkb3dubG9hZGluZyA+IEJVRkZFUiBTSVpFIGFuZAogICBtdXRlIGlzIG5vdCBzZWxlY3RlZC4gSSBmb3VuZCBvdXQgdGhhdCB3aGVuIGRvd25sb2FkaW5nIGxhcmdlIGZpbGVzIGZyb20KICAgcmVhbGx5IHJlYWxseSBzbG93IHNpdGVzLCBpdCBpcyBkZXNpcmFibGUgdG8ga25vdyB0aGUgc3RhdHVzIG9mIHRoZQogICBkb3dubG9hZC4gRG8gbm90ZSB0aGF0IHNvbWUgZG93bmxvYWRzIGFyZSBkb25lIHVuYXdhcmluZyBvZiB0aGUgc2l6ZSwgd2hpY2gKICAgbWFrZXMgdGhlIHByb2dyZXNzIG1ldGVyIGxlc3MgdGhyaWxsaW5nIDspIElmIHRoZSBvdXRwdXQgaXMgc2VudCB0byBhIHR0eSwKICAgdGhlIHByb2dyZXNzIG1ldGVyIGlzIHNodXQgb2ZmLgogLSBJbmNyZWFzZWQgYnVmZmVyIHNpemUgdXNlZCBmb3IgcmVhZGluZy4KIC0gQWRkZWQgbGVuZ3RoIGNoZWNrcyBpbiB0aGUgdXNlcitwYXNzd2QgcGFyc2luZy4KIC0gTWFkZSBpdCBncm9rIHVzZXIrcGFzc3dkIGZvciBIVFRQIGZldGNoZXMuIFRoZSB0cmljayBpcyB0byBiYXNlNjQKICAgZW5jb2RlIHRoZSB1c2VyK3Bhc3N3ZCBhbmQgc2VuZCBhbiBleHRyYSBoZWFkZXIgbGluZS4gUmVhZCBjaGFwdGVyIDExLjEgaW4KICAgUkZDMjA2OCBmb3IgZGV0YWlscy4gSSBhZGRlZCBpdCB0byBiZSB1c2VkIGp1c3QgbGlrZSB0aGUgZnRwIG9uZS4gIFRvIGdldCBhCiAgIGh0dHAgZG9jdW1lbnQgZnJvbSBhIHBsYWNlIHRoYXQgcmVxdWlyZXMgdXNlciBhbmQgcGFzc3dvcmQsIHVzZSBhbiBVUkwKICAgbGlrZToKCiAgICAgICAgaHR0cDovL3VzZXI6cGFzc3dkQHd3dy5zaXRlLnRvLmxlYWNoL2RvYy5odG1sCgogICBJIGFsc28gYWRkZWQgdGhlIC11IGZsYWcsIHNpbmNlIFdIRU4gVVNJTkcgQSBQUk9YWSBZT1UgQ0FOJ1QgU1BFQ0lGWSBUSEUKICAgVVNFUiBBTkQgUEFTU1dPUkQgV0lUSCBIVFRQIExJS0UgVEhBVC4gVGhlIC11IGZsYWcgd29ya3MgZm9yIGZ0cCB0b28sIGJ1dAogICBub3QgaWYgdXNlZCB3aXRoIHByb3h5LiBUbyBkbyB0aGUgc2FtZSBhcyB0aGUgYWJvdmUgb25lLCB5b3UgY2FuIGludm9rZToKCiAgICAgICAgdXJsZ2V0IC11IHVzZXI6cGFzc3dkIGh0dHA6Ly93d3cuc2l0ZS50by5sZWFjaC9kb2MuaHRtbAoKVmVyc2lvbiAyLjMKIFJhZmFlbCBTYWd1bGEKIC0gQWRkZWQgIi1vIiBvcHRpb24gKG91dHB1dCBmaWxlKQogLSBBZGRlZCBVUkdfSFRUUF9OT1RfRk9VTkQgcmV0dXJuIGNvZGUuCiAgIChEYW5pZWwncyBub3RlOikKICAgUGVyaGFwcyB3ZSBzaG91bGQgZGV0ZWN0IGFsbCBraW5kcyBvZiBlcnJvcnMgYW5kIGluc3RlYWQgb2Ygd3JpdGluZyB0aGF0CiAgIGN1c3RvbSBzdHJpbmcgZm9yIHRoZSBwYXJ0aWN1bGFyIDQwNC1lcnJvciwgdXNlIHRoZSBlcnJvciB0ZXh0IHdlIGFjdHVhbGx5CiAgIGdldCBmcm9tIHRoZSBzZXJ2ZXIuIFNlZSBmdXJ0aGVyIGRldGFpbHMgaW4gUkZDMjA2OCAoSFRUUCAxLjEKICAgZGVmaW5pdGlvbikuIFRoZSBjdXJyZW50IHdheSBhbHNvIHJlbGllcyBvbiBhIEhUVFAvMS4wIHJlcGx5LCB3aGljaCBuZXdlcgogICBzZXJ2ZXJzIG1pZ2h0IG5vdCBkby4KIC0gTG9vcGluZyBtb2RlICgiLWwiIG9wdGlvbikuIEl0J3MgZWFzaWVyIHRvIGdldCB2YXJpb3VzIHNwbGl0IGZpbGVzLgogICAoRGFuaWVsJ3Mgbm90ZTopCiAgIFVzZSBpdCBsaWtlICd1cmxnZXQgLWwgMSBodHRwOi8vZnJvbS50aGlzLnNpdGUvZmlsZSVkLmh0bWwnLCB3aGljaCB3aWxsCiAgIG1ha2UgdXJsZ2V0IHRvIGF0dGVtcHQgdG8gZmV0Y2ggYWxsIGZpbGVzIG5hbWVkIGZpbGUxLmh0bWwsIGZpbGUyLmh0bWwgZXRjCiAgIHVudGlsIG5vIG1vcmUgZmlsZXMgYXJlIGZvdW5kLiBUaGlzIGlzIG9ubHkgYSBtb2RpZmljYXRpb24gb2YgdGhlCiAgIFNUQU5EX0FMT05FIHBhcnQsIG5vdGhpbmcgaW4gdGhlIHVybGdldCgpIGZ1bmN0aW9uIHdhcyBtb2RmaWZpZWQgZm9yIHRoaXMuCiBEYW5pZWwgU3RlbmJlcmcKIC0gQ2hhbmdlZCB0aGUgLWggdG8gYmUgLWkgaW5zdGVhZC4gLWggc2hvdWxkIGJlIHByZXNlcnZlZCB0byBoZWxwIHVzZS4KIC0gQmpvcm4gUmVlc2UgaW5kaWNhdGVkIHRoYXQgQm9ybGFuZCBfbWlnaHRfIHVzZSAnX1dJTjMyJyBpbnN0ZWFkIG9mIHRoZQogICBWQysrIFdJTjMyIGRlZmluZSBhbmQgdGhlcmVmb3JlIEkgYWRkZWQgYSBsaXR0bGUgZml4IGZvciB0aGF0LgoKVmVyc2lvbiAyLjIKIEpvaGFuIEFuZGVyc3NvbgogLSBUaGUgdXJsZ2V0IGZ1bmN0aW9uIGRpZG4ndCBzZXQgdGhlIHBhdGggdG8gdXJsIHdoZW4gdXNpbmcgcHJveHkuCiAtIEZpeGVkIGJ1ZyB3aXRoIElNQyBwcm94eS4gTm93IHVzaW5nIChhbG1vc3QpIGNvbXBsZXRlIEdFVCBjb21tYW5kLgogIAogRGFuaWVsIFN0ZW5iZXJnCiAtIE1hZGUgaXQgY29tcGlsZSBvbiBTb2xhcmlzLiBIYWQgdG8gcmVvcmdhbml6ZSB0aGUgaW5jbHVkZXMgYSBiaXQuCiAgIChzbyBXaW4zMiwgTGludXgsIFN1bk9TIDQgYW5kIFNvbGFyaXMgMiBjb21waWxlIGZpbmUuKQogLSBNYWRlIEpvaGFuJ3Mga2VlcGFsaXZlIGtleXdvcmQgb3B0aW9uYWwgd2l0aCB0aGUgLWsgZmxhZyAoc2luY2UgaXQKICAgbWFrZXMgYSBsb3Qgb2YgdXJsZ2V0cyB0YWtlIGEgbG90IGxvbmdlciB0aW1lKS4KIC0gTWFkZSBhICctaCcgc3dpdGNoIGluIGNhc2UgeW91IHdhbnQgdGhlIEhUVFAtaGVhZGVyIGluIHRoZSBvdXRwdXQuCgpWZXJzaW9uIDIuMQogRGFuaWVsIFN0ZW5iZXJnIGFuZCBLamVsbCBFcmljc29uCiAtIFdpbjMyLWNvbXBpbGFibGUKIC0gTm8gbW9yZSBnbG9iYWwgdmFyaWFibGVzCiAtIE11dGUgb3B0aW9uIChubyBvdXRwdXQgYXQgYWxsIHRvIHN0ZGVycikKIC0gRnVsbCByYW5nZSBvZiByZXR1cm4gY29kZXMgZnJvbSB1cmxnZXQoKSwgd2hpY2ggaXMgbm93IHdyaXR0ZW4gdG8gYmUgYQogICBmdW5jdGlvbiBmb3IgZWFzeS10by11c2UgaW4gW290aGVyXSBwcm9ncmFtcy4KIC0gRGVmaW5lIFNUQU5EX0FMT05FIHRvIGNvbXBpbGUgdGhlIHN0YW5kIGFsb25lIHVybGdldCBwcm9ncmFtCiAtIE5vdyBjb21waWxlcyB3aXRoIGdjYyBvcHRpb25zIC1hbnNpIC1XYWxsIC1wZWRhbnRpYyA7KQoKVmVyc2lvbiAyLjAKIC0gSW50cm9kdWNpbmcgZnRwIEdFVCBzdXBwb3J0LiBUaGUgRlRQIFVSTCB0eXBlIGlzIHJlY29nbml6ZWQgYW5kIHVzZWQuCiAtIFJlbmFtZWQgdGhlIHByb2plY3QgdG8gJ3VybGdldCcuCiAtIFN1cHBvcnRzIHRoZSB1c2VyK3Bhc3N3ZCBpbiB0aGUgRlRQIFVSTCAob3RoZXJ3aXNlIGl0IHRyaWVzIGFub255bW91cwogICBsb2dpbiB3aXRoIGEgd2VpcmQgZW1haWwgYWRkcmVzcyBhcyBwYXNzd29yZCkuCgpWZXJzaW9uIDEuNQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBza2lwX2hlYWRlcigpIGNyYXAgbWVzc2VkIGl0IHVwIGJpZy10aW1lLiBCeSBzaW1wbHkgcmVtb3ZpbmcgdGhhdAogICBvbmUgd2UgY2FuIGFsbCBvZiBhIHN1ZGRlbiBkb3dubG9hZCBhbnl0aGluZyA7KQogLSBObyBsb25nZXIgcmVxdWlyZXMgYSB0cmFpbGluZyBzbGFzaCBvbiB0aGUgVVJMcy4KIC0gSWYgdGhlIGdpdmVuIFVSTCBpc24ndCBwcmVmaXhlZCB3aXRoICdodHRwOi8vJywgSFRUUCBpcyBhc3N1bWVkIGFuZAogICBnaXZlbiBhIHRyeSEKIC0gJ3ZvaWQgbWFpbigpJyBpcyBoaXN0b3J5LgoKVmVyc2lvbiAxLjQKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgZ29waGVyIHNvdXJjZSB1c2VkIHRoZSBwcGF0aCB2YXJpYWJsZSBpbnN0ZWFkIG9mIHBhdGggd2hpY2ggY291bGQKICAgbGVhZCB0byBkaXNhc3Rlci4KClZlcnNpb24gMS4zCiBEYW5pZWwgU3RlbmJlcmcKIC0gV2VsbCwgSSBhZGRlZCBhIGxhbWUgdGV4dCBhYm91dCB0aGUgdGltZSBpdCB0b29rIHRvIGdldCB0aGUgZGF0YS4gSSBhbHNvCiAgIGZvdWdodCBhZ2FpbnN0IEpvaGFuIHRvIHByZXZlbnQgaGlzIC1mIG9wdGlvbiAodG8gc3BlY2lmeSBhIGZpbGUgbmFtZQogICB0aGF0IHNob3VsZCBiZSB3cml0dGVuIGluc3RlYWQgb2Ygc3Rkb3V0KSEgPSkKIC0gTWFkZSBpdCB3cml0ZSAnY29ubmVjdGlvbiByZWZ1c2VkJyBmb3IgdGhhdCBwYXJ0aWN1bGFyIGNvbm5lY3QoKQogICBwcm9ibGVtLgogLSBSZW51bWJlcmVkIHRoZSB2ZXJzaW9uLiBMZXQncyBub3QgbWFrZSBzaWxseSAxLjAuWCB2ZXJzaW9ucywgdGhpcyBpcwogICBhIHBsYWluIDEuMyBpbnN0ZWFkLgoKVmVyc2lvbiAxLjIKIEpvaGFuIEFuZGVyc3NvbgogLSBEaXNjb3ZlcmVkIGFuZCBmaXhlZCB0aGUgcHJvYmxlbSB3aXRoIGdldHRpbmcgYmluYXJ5IGZpbGVzLiBwdXRzKCkgaXMKICAgbm93IHJlcGxhY2VkIHdpdGggZndyaXRlKCkuIChEYW5pZWwncyBub3RlOiB0aGlzIGFsc28gZml4ZWQgdGhlIGJ1ZmZlcgogICBvdmVyd3JpdGUgcHJvYmxlbSBJIGZvdW5kIGluIHRoZSBwcmV2aW91cyB2ZXJzaW9uLikKCiBSYWZhZWwgU2FndWxhCiAtIExldCAiLXAiIGJlZm9yZSAiLXgiLgoKIERhbmllbCBTdGVuYmVyZwogLSBCdWdmaXhlZCB0aGUgcHJveHkgdXNhZ2UuIEl0IHNob3VsZCAqTk9UKiB1c2Ugbm9yIHN0cmlwIHRoZSBwb3J0IG51bWJlcgogICBmcm9tIHRoZSBVUkwgYnV0IHNpbXBseSBwYXNzIHRoYXQgaW5mb3JtYXRpb24gdG8gdGhlIHByb3h5LiBUaGlzIGFsc28KICAgbWFkZSB0aGUgdXNlci9wYXNzd29yZCBmaWVsZHMgcG9zc2libGUgdG8gdXNlIGluIHByb3h5IFtmdHAtXSBVUkxzLgogICAobGlrZSBpbiBmdHA6Ly91c2VyOnBhc3N3b3JkQGZ0cC5teS5zaXRlOjgwMjEvUkVBRE1FKQoKIEpvaGFuIEFuZGVyc3NvbgogLSBJbXBsZW1lbnRlZCBIVFRQIHByb3h5IHN1cHBvcnQuCiAtIFJlY2VpdmUgYnl0ZSBjb3VudGVyIGFkZGVkLgoKIEJqb3JuIFJlZXNlCiAtIEltcGxlbWVudGVkIFVSTHMgKGFuZCBza2lwcGVkIHRoZSBvbGQgc3ludGF4KS4KIC0gT3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3Rkb3V0LCBzbyB0byBhY2hpZXZlIHRoZSBhYm92ZSBleGFtcGxlLCBkbzoKICAgaHR0cGdldCBodHRwOi8vMTQzLjU0LjEwLjYvaW5mb19sb2dvLmdpZiA+IHRlc3QuZ2lmCgpWZXJzaW9uIDEuMQogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkanVzdGVkIGl0IHNsaWdodGx5IHRvIGFjY2VwdCBuYW1lZCBob3N0cyBvbiB0aGUgY29tbWFuZCBsaW5lLiBXZQogICB3b3VsZG4ndCB3YW5uYSB1c2UgSVAgbnVtYmVycyBmb3IgdGhlIHJlc3Qgb2Ygb3VyIGxpZmVzLCB3b3VsZCB3ZT8KClZlcnNpb24gMS4wCiAgUmFmYWVsIFNhZ3VsYQogIC0gV3JvdGUgdGhlIGluaXRpYWwgaHR0cGdldCwgd2hpY2ggc3RhcnRlZCBhbGwgdGhpcyEK