ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKVmVyc2lvbiA3LjE5LjIgKDEzIE5vdmVtYmVyIDIwMDgpCgpNaWNoYWwgTWFyZWsgKDEzIE5vdiAyMDA4KQotIEZpeGVkIGEgcG90ZW50aWFsIGRhdGEgbG9zcyBpbiBDdXJsX2NsaWVudF93cml0ZSgpIHdoZW4gdGhlIHRyYW5zZmVyIGlzCiAgcGF1c2VkLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBOb3YgMjAwOCkKLSBSYWluZXIgQ2FuYXZhbiBmaWxlZCBidWcgIzIyNTU2MjcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjI1NTYyNykgd2hpY2ggcG9pbnRlZCBvdXQgdGhhdCBhCiAgcHJvZ3JhbSB1c2luZyBsaWJjdXJsJ3MgbXVsdGkgaW50ZXJmYWNlIHRvIGRvd25sb2FkIGEgSFRUUFMgcGFnZSB3aXRoIGEKICBsaWJjdXJsIGJ1aWx0IHBvd2VyZWQgYnkgT3BlblNTTCwgd291bGQgZWFzaWx5IGdldCBzaWxseSBhbmQgaW5zdGVhZCBoYW5kCiAgb3ZlciBTU0wgZGV0YWlscyBhcyBkYXRhIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBIVFRQIGhlYWRlcnMgYW5kIGJvZHkuIFRoaXMKICBoYXBwZW5lZCBiZWNhdXNlIGxpYmN1cmwgd291bGQgY29uc2lkZXIgdGhlIGNvbm5lY3Rpb24gaGFuZHNoYWtlIGRvbmUgdG9vCiAgZWFybHkuIFRoaXMgcHJvYmxlbSB3YXMgaW50cm9kdWNlZCBhdCBTZXB0ZW1iZXIgMjJuZCAyMDA4IHdpdGggbXkgZml4IG9mIHRoZQogIGJ1ZyAjMjEwNzM3NwoKICBUaGUgY29ycmVjdCBmaXggaXMgbm93IGluc3RlYWQgZG9uZSB3aXRoaW4gdGhlIEdudVRMUy1oYW5kbGluZyBjb2RlLCBhcyBib3RoCiAgdGhlIE9wZW5TU0wgYW5kIHRoZSBOU1MgY29kZSBhbHJlYWR5IGRlYWwgd2l0aCB0aGlzIHNpdHVhdGlvbiBpbiBzaW1pbGFyCiAgZmFzaGlvbi4gSSBhZGRlZCB0ZXN0IGNhc2UgNTYwIGluIGFuIGF0dGVtcHQgdG8gdmVyaWZ5IHRoaXMgZml4LCBidXQKICB1bmZvcnR1bmF0ZWx5IGl0IGRpZG4ndCB0cmlnZ2VyIGl0IGV2ZW4gYmVmb3JlIHRoaXMgZml4IQoKWWFuZyBUc2UgKDExIE5vdiAyMDA4KQotIFJlbGF0ZWQgd2l0aCBidWcgIzIyMzA1MzUgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIyMzA1MzUpCiAgRGFuaWVsIEZhbmRyaWNoIG5vdGljZWQgdGhhdCBjdXJsX2FkZHJpbmZvIHdhcyBhbHNvIG1pc3NpbmcgaW4gdGhlIGJ1aWxkCiAgcHJvY2VzcyBvZiBvdGhlciBmb3VyIG5vbi1jb25maWd1cmUgcGxhdGZvcm1zLiBBZGRlZCBub3cuCgpEYW5pZWwgRmFuZHJpY2ggKDcgTm92IDIwMDgpCi0gVGhlIGdldGlmYWRkcnMoKSB2ZXJzaW9uIG9mIEN1cmxfaWYyaXAoKSBjcmFzaGVkIHdoZW4gdXNlZCBvbiBhIExpbnV4CiAgc3lzdGVtIHdpdGggYSBURVFMIGxvYWQtYmFsYW5jaW5nIGRldmljZSBjb25maWd1cmVkLCB3aGljaCBkb2Vzbid0CiAgaGF2ZSBhbiBhZGRyZXNzLiAgVGhhbmtzIHRvIEFkYW0gU2FtcHNvbiBmb3Igc3BvdHRpbmcgdGhpcyAoYnVnICMyMjM0OTIzKS4KCllhbmcgVHNlICg2IE5vdiAyMDA4KQotIE1lcmdlZCBleGlzdGluZyBJUHY0IGFuZCBJUHY2IEN1cmxfaXAyYWRkciBmdW5jdGlvbnMgaW50byBhIHNpbmdsZSBvbmUKICB3aGljaCBub3cgYWxzbyB0YWtlcyBhIHByb3RvY29sIGFkZHJlc3MgZmFtaWx5IGFyZ3VtZW50LgoKLSBCdWcgIzIyMzA1MzUgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIyMzA1MzUpIHBvaW50ZWQgb3V0IGEKICBwcm9ibGVtIHdpdGggTVNWQyA2IG1ha2VmaWxlIHRoYXQgY2F1c2VkIGEgYnVpbGQgZmFpbHVyZS4gSXQgd2FzIG5vdGVkIHRoYXQKICB0aGUgY3VybF9hZGRyaW5mby5vYmogcmVmZXJlbmNlIHdhcyBtaXNzaW5nLiBJIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvIHNvcnQKICB0aGUgbGlzdCBpbiB3aGljaCB0aGlzIHdhcyBtaXNzaW5nLiBJc3N1ZSBzdWJtaXR0ZWQgYnkgSm9obiBXaWxraW5zb24uCgpWZXJzaW9uIDcuMTkuMSAoNSBOb3ZlbWJlciAyMDA4KQoKRGFuaWVsIFN0ZW5iZXJnICg0IE5vdiAyMDA4KQotIENVUkxJTkZPX0ZJTEVUSU1FIG5vdyB3b3JrcyBmb3IgZmlsZTovLyB0cmFuc2ZlcnMgYXMgd2VsbAoKRGFuaWVsIFN0ZW5iZXJnICgzIE5vdiAyMDA4KQotIEJ1ZyAjMjIxODQ4MCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjIxODQ4MCkgcG9pbnRlZCBvdXQgYQogIHByb2JsZW0gd2l0aCBteSBDVVJMSU5GT19QUklNQVJZX0lQIGZpeCBmcm9tIE9jdG9iZXIgN3RoIHRoYXQgY2F1c2VkIGEgTlVMTAogIHBvaW50ZXIgcmVhZC4gSSBhbHNvIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvIGNsZWFuIHVwIHRoaXMgbG9naWMgKHN0b3Jpbmcgb2YKICB0aGUgY29ubmVjdGlvbidzIElQIGFkZHJlc3MpIHNvbWV3aGF0IGFzIHdlIGhhZCBpdCBzdG9yZWQgaW4gdHdvIGRpZmZlcmVudAogIHBsYWNlcyBhbmQgd2F5cyBwcmV2aW91c2x5IGFuZCB0aGV5IGFyZSBub3cgdW5pZmllZC4KCllhbmcgVHNlICgzIE5vdiAyMDA4KQotIEZpeCB1bmRlcnNpemVkIElQdjYgYWRkcmVzcyBpbnRlcm5hbCBidWZmZXIuIElQdjYgYWRkcmVzcyBzdHJpbmdzIGxvbmdlcgogIHRoYW4gMzUgY2hhcmFjdGVycyB3b3VsZCBiZSB0cnVuY2F0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDIgTm92IDIwMDgpCi0gRGFuaWVsIEpvaG5zb24gcmVwb3J0ZWQgYW5kIGZpeGVkOgoKICBXaGVuIGMtYXJlcyBpc24ndCBlbmFibGVkLCBsaWJjdXJsIGJ5IGRlZmF1bHQgY2FsbHMgZ2V0YWRkcmluZm8gd2l0aCBmYW1pbHkKICBzZXQgdG8gUEZfVU5TUEVDIHdoaWNoIGNhdXNlcyBnZXRhZGRyaW5mbyB0byByZXR1cm4gYWxsIGF2YWlsYWJsZSBhZGRyZXNzZXMsCiAgYm90aCBJUHY0IGFuZCBJUHY2LiBMaWJjdXJsIHRoZW4gdHJpZXMgZWFjaCBvbmUgdW50aWwgaXQgY2FuIGNvbm5lY3QuIElmIHRoZQogIG5ldCBjb25uZWN0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBJUHY2LCBsaWJjdXJsIGNhbiBzdGlsbCBmYWxsIGJhY2sgdG8gSVB2NC4KCiAgSG93ZXZlciwgc2luY2UgYy1hcmVzIGRvZXNuJ3Qgc3VwcG9ydCBQRl9VTlNQRUMsIHdoZW4gaXQncyB1c2VkIGl0IGRlZmF1bHRzCiAgdG8gdXNpbmcgZmFtaWx5PVBGX0lORVQ2IGFuZCB0aGVyZWZvcmUgb25seSByZXR1cm5zIElQdjYgYWRkcmVzc2VzIHdoZW4gQUFBQQogIHJlY29yZHMgYXJlIGF2YWlsYWJsZSwgZXZlbiBpZiBJUHY0IGFkZHJlc3NlcyBhcmUgYWxzbyBhdmFpbGFibGUuIFRoZSBlZmZlY3QKICBpcyB0aGF0IHNpbmNlIG15IElTUCBkb2Vzbid0IGRvIElQdjYsIGxpYmN1cmwgY2FuJ3QgY29ubmVjdCBhdCBhbGwgdG8gYSBzaXRlCiAgdGhhdCBoYXMgQUFBQSByZWNvcmRzLiBJdCB3aWxsIHdvcmsgaWYgSSBleHBsaWNpdGx5IHVzZSBDVVJMX0lQUkVTT0xWRV9WNCBvcgogIC0taXB2NCB3aXRoIHRoZSBjdXJsIHRvb2wuIEkgZGlzY292ZXJlZCB0aGlzIHdoZW4gY3VybCB3b3VsZCBmYWlsIHRvIGNvbm5lY3QKICB0byBzZWVtaW5nbHkgcmFuZG9tIHNpdGVzLiBJdCB0dXJucyBvdXQgdGhleSB3ZXJlbid0IHJhbmRvbSwgdGhleSB3ZXJlIHNpdGVzCiAgd2l0aCBBQUFBIHJlY29yZHMuCgogIFNvIG5vdyBsaWJjdXJsIGRlZmF1bHRzIHRvIFBGX0lORVQuLi4gdW50aWwgYy1hcmVzIGhhcyBiZWVuIHRvdWdodCB0byBvZmZlcgogIGJvdGguCgpZYW5nIFRzZSAoMzEgT2N0IDIwMDgpCi0gVGVzdHMgNTU4IGFuZCA1NTkgYXJlIHN0YWJpbGl6ZWQuIFRoZXNlIHR3byB0ZXN0cyB3ZXJlIGluaXRpYWxseSBpbnRyb2R1Y2VkCiAgdG8gYWlkIGluIHRoZSBsb2NhdGlvbiBvZiBhIHNlZy1mYXVsdCB3aGljaCB3YXMgb25seSB0cmlnZ2VyZWQgb24gbm9uLWRlYnVnCiAgYnVpbGRzIGRvbmUgd2l0aCB0aGUgaWNjIDkuMSBJbnRlbCBjb21waWxlci4gVGVzdCA1NTggZG9lcyBub3QgdHJpZ2dlciB0aGUKICBwcm9ibGVtLCBidXQgdGVzdCA1NTkgZG9lcyB0cmlnZ2VyIGl0LiBBcyBvZiB0b2RheSwgaXQgaXNuJ3QgeWV0IGFic29sdXRlbHkKICBjbGVhciBpZiBpdCBpcyBhIGNvbXBpbGVyIG9wdGltaXplciBpc3N1ZSBvciBhIG1lbW9yeSBjb3JydXB0aW9uIG9uZS4KCllhbmcgVHNlICgzMCBPY3QgMjAwOCkKLSBVc2Ugb3VyIEN1cmxfYWRkcmluZm8gc3RydWN0dXJlIGRlZmluaXRpb24gdG8gaGFuZGxlIGFkZHJlc3MgaW5mbyBkYXRhIGV2ZW4KICB3aGVuIGEgc3lzdGVtIGFkZHJpbmZvIHN0cnVjdCBpcyBhdmFpbGFibGUuIFByb3ZpZGUgYW5kIHVzZSBhIHdyYXBwZXIgYXJvdW5kCiAgc3lzdGVtcyBnZXRhZGRyaW5mbyBmdW5jdGlvbiwgQ3VybF9nZXRhZGRyaW5mb19leCB3aGljaCByZXR1cm5zIGEgcG9pbnRlciB0bwogIGEgbGlzdCBvZiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgQ3VybF9hZGRyaW5mbyBzdHJ1Y3RzLgoKICBDb25maWd1cmUgd2lsbCBjaGVjayBmcmVlYWRkcmluZm8gYW5kIGdldGFkZHJpbmZvIGZ1bmN0aW9ucyBhbmQgZGVmaW5lCiAgcHJlcHJvY2Vzc29yIHN5bWJvbHMgSEFWRV9GUkVFQUREUklORk8gYW5kIEhBVkVfR0VUQUREUklORk8gd2hlbiBhcHByb3ByaWF0ZS4KCkRhbmllbCBGYW5kcmljaCAoMjkgT2N0IDIwMDgpCi0gRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgYSBmZXcgYnl0ZXMgb2YgZ2FyYmFnZSB0byBiZSBzZW50IGFmdGVyIGEKICBjdXJsX2Vhc3lfcGF1c2UoKSBkdXJpbmcgYSBjaHVua3kgdXBsb2FkLiBSZXBvcnRlZCBieSBTdGV2ZSBSb3Nrb3dza2kuCgpEYW5pZWwgRmFuZHJpY2ggKDI4IE9jdCAyMDA4KQotIENoYW5nZWQgdGhlICJyZXNvbHZlIiB0ZXN0IHByZWNoZWNrIHByb2dyYW0gdG8gdmVyaWZ5IHRoYXQgYW4gSVB2NiBzb2NrZXQKICBjYW4gYmUgY3JlYXRlZCBiZWZvcmUgcmVzb2x2aW5nIHRoZSBJUHY2IG5hbWUuICBJbiB0aGUgY29udGV4dCBvZiBydW5uaW5nCiAgYSB0ZXN0LCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcnVuIGFuIElQdjYgdGVzdCB3aGVuIGEgaG9zdCBpcyByZXNvbHZhYmxlCiAgYnV0IElQdjYgaXNuJ3QgdXNhYmxlLiAgVGhpcyBzaG91bGQgZml4IGZhaWx1cmVzIG9mIHRlc3QgMTA4NSBvbiBob3N0cyB3aXRoCiAgbGlicmFyeSBhbmQgRE5TIHN1cHBvcnQgZm9yIElQdjYgYnV0IHdoZXJlIGFjdHVhbCB1c2Ugb2YgSVB2NiBoYXMgYmVlbgogIGFkbWluaXN0cmF0aXZlbHkgZGlzYWJsZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDI0IE9jdCAyMDA4KQotIEFkZGVkIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB6bGliIGFuZCBPcGVuU1NMIG9uIFN5bWJpYW4gT1MuCgpEYW5pZWwgRmFuZHJpY2ggKDIxIE9jdCAyMDA4KQotIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCBTRlRQIHJhbmdlIHN1cHBvcnQgdG8gZml4IHRlc3QgY2FzZXMgNjM0IHRocm91Z2gKICA2MzcuCgpEYW5pZWwgRmFuZHJpY2ggKDE3IE9jdCAyMDA4KQotIEZpeGVkIGEgY29tcGlsZSBlcnJvciByZXBvcnRlZCBieSBBbGJlcnQgQ2hpbiBvbiBBSVggYW5kIElSSVggd2hlbiB1c2luZwogIEdUTFMuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IE9jdCAyMDA4KQotIElnb3IgTm92b3NlbHRzZXYgYWRkZWQgQ1VSTE9QVF9QUk9YWVVTRVIgYW5kIENVUkxPUFRfUFJPWFlQQVNTV09SRCB0aGF0IHRoZW4KICBtYWtlIENVUkxPUFRfUFJPWFlVU0VSUFdEIHNvcnQgb2YgZGVwcmVjYXRlZC4gVGhlIHByaW1hcnkgbW90aXZlIGZvciBhZGRpbmcKICB0aGVzZSBuZXcgb3B0aW9ucyBpcyB0aGF0IHRoZXkgaGF2ZSBubyBwcm9ibGVtcyB3aXRoIHRoZSBjb2xvbiBzZXBhcmF0b3IKICB0aGF0IHRoZSBDVVJMT1BUX1BST1hZVVNFUlBXRCBvcHRpb24gZG9lcy4KCkRhbmllbCBTdGVuYmVyZyAoMTUgT2N0IDIwMDgpCi0gUGFzY2FsIFRlcmphbiBmaWxlZCBidWcgIzIxNTQ2MjcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjE1NDYyNykgd2hpY2ggcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsCiAgdXNlcyBzdHJjYXNlY21wKCkgaW4gbXVsdGlwbGUgcGxhY2VzIHdoZXJlIGl0IGNhdXNlcyBmYWlsdXJlcyB3aGVuIHRoZQogIFR1cmtpc2ggbG9jYWxlIGlzIHVzZWQuIFRoaXMgaXMgYmVjYXVzZSAnaScgYW5kICdJJyBpc24ndCB0aGUgc2FtZSBsZXR0ZXIgc28KICBzdHJjYXNlY21wKCkgb24gdGhvc2UgbGV0dGVycyBhcmUgZGlmZmVyZW50IGluIFR1cmtpc2ggdGhhbiBpbiBFbmdsaXNoIChvcgogIGp1c3QgYWJvdXQgYWxsIG90aGVyIGxhbmd1YWdlcykuIEkgdGh1cyBpbnRyb2R1Y2VkIGEgdG90YWxseSBuZXcgaW50ZXJuYWwKICBmdW5jdGlvbiBpbiBsaWJjdXJsIChjYWxsZWQgQ3VybF9yYXdfZXF1YWwpIGZvciBkb2luZyBjYXNlIGluc2VudGl2ZQogIGNvbXBhcmlzb25zIGZvciBlbmdsaXNoLShhc2NpaT8pIHN0eWxlIHN0cmluZ3MgdGhhdCB0aHVzIHdpbGwgbWFrZSAiZmlsZSIKICBhbmQgIkZJTEUiIG1hdGNoIGV2ZW4gaWYgdGhlIFR1cmtpc2ggbG9jYWxlIGlzIHNlbGVjdGVkLgoKRGFuaWVsIEZhbmRyaWNoICgxNSBPY3QgMjAwOCkKLSBBIDxwcmVjaGVjaz4gY29tbWFuZCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgZmFpbGVkIGlmIGl0IHJldHVybnMgYSBub24temVybwogIHJldHVybiBjb2RlLiAgVGhpcyB3YXksIGlmIHRoZSBwcmVjaGVjayBjb21tYW5kIGNhbid0IGJlIHJ1biBhdCBhbGwgZm9yCiAgd2hhdGV2ZXIgcmVhc29uLCBpdCdzIHRyZWF0ZWQgYXMgYSBwcmVjaGVjayBmYWlsdXJlIHdoaWNoIGNhdXNlcyB0aGUKICB0ZXN0IHRvIGJlIHNraXBwZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDE1IE9jdCAyMDA4KQotIEpvaG4gV2lsa2luc29uIGZpbGVkIGJ1ZyAjMjE1NTQ5NgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTU1NDk2KSBwb2ludGluZyBvdXQgYW4gZXJyb3IgY2FzZQogIHdpdGhvdXQgYSBwcm9wZXIgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4gV2hlbiBhIHJlYWQgY2FsbGJhY2sgcmV0dXJucwogIGEgdG9vIGxhcmdlIHZhbHVlIChsaWtlIHdoZW4gdHJ5aW5nIHRvIHJldHVybiBhIG5lZ2F0aXZlIG51bWJlcikgaXQgd291bGQKICB0cmlnZ2VyIGFuZCB0aGUgZ2VuZXJpYyBlcnJvciBtZXNzYWdlIHRoZW4gbWFrZXMgdGhlIHByb3BsZW0gc2xpZ2h0bHkKICBkaWZmZXJlbnQgdG8gdHJhY2sgZG93bi4gSSd2ZSBhZGRlZCBhbiBlcnJvciBtZXNzYWdlIGZvciB0aGlzIG5vdy4KCkRhbmllbCBGYW5kcmljaCAoOSBPY3QgMjAwOCkKLSBGaXhlZCB0aGUgLS1pbnRlcmZhY2Ugb3B0aW9uIHRvIHdvcmsgd2l0aCBJUHY2IGNvbm5lY3Rpb25zIG9uIGdsaWJjCiAgc3lzdGVtcyBzdXBwb3J0aW5nIGdldGlmYWRkcnMoKS4gQWxzbyBmaXhlZCBhIHByb2JsZW0gd2hlcmUgYW4gSVB2NgogIGFkZHJlc3MgY291bGQgYmUgY2hvc2VuIGluc3RlYWQgb2YgYW4gSVB2NCBvbmUgZm9yIC0taW50ZXJmYWNlIHdoZW4gaXQKICBpbnZvbHZlZCBhIG5hbWUgbG9va3VwLgoKRGFuaWVsIEZhbmRyaWNoICg4IE9jdCAyMDA4KQotIEFkZGVkIHRlc3RzIDEwODIgdGhyb3VnaCAxMDg1IHRvIHRlc3Qgc3ltYm9saWMgLS1pbnRlcmZhY2UgcGFyYW1ldGVycwoKLSBBZGRlZCB0ZXN0cyA2MzMgdGhyb3VnaCA2MzcgdG8gdGVzdCB0aGUgbmV3IGZpbGUgcmFuZ2Ugc3VwcG9ydCBmb3IgU0ZUUC4KICBBbGwgYnV0IHRoZSBmaXJzdCB0ZXN0IGNhdXNlIGFuIGluZmluaXRlIGxvb3Agb3Igb3RoZXIgZmFpbHVyZSBhbmQgc28KICBhcmUgYWRkZWQgdG8gRElTQUJMRUQuCgpEYW5pZWwgU3RlbmJlcmcgKDggT2N0IDIwMDgpCi0gSm9obiBXaWxraW5zb24gZmlsZWQgYnVnICMyMTUyMjcwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIxNTIyNzApIHdoaWNoIGlkZW50aWZpZWQgYW5kIGZpeGVkIGEKICBDVVJMSU5GT19SRURJUkVDVF9VUkwgbWVtb3J5IGxlYWsgYW5kIGFuIGFkZGl0aW9uYWwgd3JvbmctZG9pbmc6CgogIEFueSBzdWJzZXF1ZW50IHRyYW5zZmVyIHdpdGggYSByZWRpcmVjdCBsZWFrcyBtZW1vcnksIGV2ZW50dWFsbHkgY3Jhc2hpbmcKICB0aGUgcHJvY2VzcyBwb3RlbnRpYWxseS4KCiAgQW55IHN1YnNlcXVlbnQgdHJhbnNmZXIgV0lUSE9VVCBhIHJlZGlyZWN0IGNhdXNlcyB0aGUgbW9zdCByZWNlbnQgcmVkaXJlY3QKICB0aGF0IERJRCBvY2N1ciBvbiBzb21lIHByZXZpb3VzIHRyYW5zZmVyIHRvIHN0aWxsIGJlIHJlcG9ydGVkLgoKLSBJZ29yIE5vdm9zZWx0c2V2IGZpbGVkIGJ1ZyAjMjExMTYxMwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTExNjEzKSB0aGF0IGV2ZW50dWFsbHkgaWRlbnRpZmllZCBhCiAgZmxhdyBpbiBob3cgdGhlIG11bHRpX3NvY2tldCBpbnRlcmZhY2UgaW4gc29tZSBjYXNlcyBtaXNzZWQgdG8gY2FsbCB0aGUKICB0aW1lb3V0IGNhbGxiYWNrIHdoZW4gZWFzeSBpbnRlcmZhY2VzIGFyZSByZW1vdmVkIGFuZCBhZGRlZCB3aXRoaW4gdGhlIHNhbWUKICBtaWxsaXNlY29uZC4KCi0gSWdvciBOb3Zvc2VsdHNldiBicm91Z2h0IGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIHR3byBuZXcgb3B0aW9ucyB0bwogIGN1cmxfZWFzeV9zZXRvcHQ6IENVUkxPUFRfVVNFUk5BTUUgYW5kIENVUkxPUFRfUEFTU1dPUkQgdGhhdCBzb3J0IG9mCiAgZGVwcmVjYXRlcyB0aGUgZ29vZCBvbGQgQ1VSTE9QVF9VU0VSUFdEIHNpbmNlIHRoZXkgYWxsb3cgYXBwbGljYXRpb25zIHRvIHNldAogIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGluZGVwZW5kZW50bHkgYW5kIHBlcmhhcHMgbW9yZSBpbXBvcnRhbnRseSBhbGxvdwogIGJvdGggdG8gY29udGFpbiBjb2xvbihzKSB3aGljaCBDVVJMT1BUX1VTRVJQV0QgZG9lc24ndCBmdWxseSBzdXBwb3J0LgoKRGFuaWVsIEZhbmRyaWNoICg3IE9jdCAyMDA4KQotIENoYW5nZWQgdGhlIGhhbmRsaW5nIG9mIHJlYWQvd3JpdGUgZXJyb3JzIGluIEN1cmxfcGVyZm9ybSgpIHRvIGFsbG93IGEKICBhIGZyZXNoIGNvbm5lY3Rpb24gdG8gYmUgbWFkZSBpbiBzdWNoIGNhc2VzIGFuZCB0aGUgcmVxdWVzdCByZXRyYW5zbWl0dGVkLgogIFRoaXMgc2hvdWxkIGZpeCB0ZXN0IGNhc2UgMTYwLiAgQWRkZWQgdGVzdCBjYXNlIDEwNzkgaW4gYW4gYXR0ZW1wdCB0bwogIHRlc3QgYSBzaW1pbGFyIGNvbm5lY3Rpb24gZHJvcHBpbmcgc2NlbmFyaW8sIGJ1dCBhcyBhIHJhY2UgY29uZGl0aW9uLCBpdCdzCiAgaGFyZCB0byB0ZXN0IHJlbGlhYmx5LgoKLSBDcmVhdGVkIHRlc3QgY2FzZXMgMTA4MCBhbmQgMTA4MSB0byByZXByb2R1Y2UgYSBwcm9ibGVtIG9mCiAgQ1VSTElORk9fUkVESVJFQ1RfVVJMIGxlYWtpbmcgbWVtb3J5IGFuZCByZXR1cm5pbmcgaW5jb3JyZWN0IHJlc3VsdHMgd2hlbgogIHR3byBVUkxzIGFyZSByZXF1ZXN0ZWQuIFJlcG9ydGVkIGJ5IHZtcGRlbW8gaW4gYnVnICMyMTUyMjcwCgpEYW5pZWwgU3RlbmJlcmcgKDcgT2N0IDIwMDgpCi0gRml4ZWQgQ1VSTElORk9fUFJJTUFSWV9JUDogV2hlbiBsaWJjdXJsIGNyZWF0ZWQgYSBjb25uZWN0aW9uIHRvIGhvc3QgQSB0aGVuCiAgdGhlIGFwcCByZS11c2VkIHRoZSBoYW5kbGUgdG8gZG8gYSBjb25uZWN0aW9uIHRvIGhvc3QgQiBhbmQgdGhlbiBhZ2FpbgogIHJlLXVzZWQgdGhlIGhhbmRsZSB0byBob3N0IEEsIGl0IHdvdWxkIG5vdCB1cGRhdGUgdGhlIGluZm8gd2l0aCBob3N0IEEncyBJUAogIGFkZHJlc3MgKGR1ZSB0byB0aGUgY29ubmVjdGlvbiBiZWluZyByZS11c2VkKSBidXQgaXQgd291bGQgaW5zdGVhZCByZXBvcnQKICB0aGUgaW5mbyBmcm9tIGhvc3QgQi4KCllhbmcgVHNlICg3IE9jdCAyMDA4KQotIEFkZGVkIC0tZW5hYmxlLW9wdGltaXplIGNvbmZpZ3VyZSBvcHRpb24gdG8gZW5hYmxlIGFuZCBkaXNhYmxlIGNvbXBpbGVyCiAgb3B0aW1pemF0aW9ucyB0byBhbGxvdyBkZWNvdXBsZWQgc2V0dGluZyBmcm9tIC0tZW5hYmxlLWRlYnVnLgoKWWFuZyBUc2UgKDIgT2N0IDIwMDgpCi0gQWRkZWQgLS1lbmFibGUtd2FybmluZ3MgY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUgYW5kIGRpc2FibGUgc3RyaWN0CiAgY29tcGlsZXIgd2FybmluZ3MgdG8gYWxsb3cgZGVjb3VwbGVkIHNldHRpbmcgZnJvbSAtLWVuYWJsZS1kZWJ1Zy4KCiAgcnVudGVzdHMucGwgd2lsbCBub3cgcnVuIHdpdGggcGlja3kgY29tcGlsZXIgd2FybmluZ3MgZW5hYmxlZCB1bmxlc3MKICBleHBsaWNpdGx5IGRpc2FibGVkLgogIApEYW5pZWwgRmFuZHJpY2ggKDEgT2N0IDIwMDgpCi0gIm1ha2UgY2xlYW4iIG5vdyBjbGVhbnMgb3V0IHRoZSBkb2NzIGFuZCB0ZXN0cyBkaXJlY3RvcmllcywgdG9vLgoKRGFuaWVsIFN0ZW5iZXJnICgzMCBTZXAgMjAwOCkKLSBUaGUgbGliY3VybCBGVFAgY29kZSBub3cgcmV0dXJucyBDVVJMRV9SRU1PVEVfRklMRV9OT1RfRk9VTkQgZXJyb3Igd2hlbiBTSVpFCiAgZ2V0cyBhIDU1MCByZXNwb25zZSBiYWNrIGZvciB0aGUgY2FzZXMgd2hlcmUgYSBkb3dubG9hZCAob3IgTk9CT0RZKSBpcwogIHdhbnRlZC4gSXQgc3RpbGwgYWxsb3dzIGEgNTUwIGFzIHJlc3BvbnNlIGlmIHRoZSBTSVpFIGlzIHVzZWQgYXMgcGFydCBvZiBhbgogIHVwbG9hZCBwcm9jZXNzIChsaWtlIGlmIHJlc3VtaW5nIGFuIHVwbG9hZCBpcyByZXF1ZXN0ZWQgYW5kIHRoZSBmaWxlIGlzbid0CiAgdGhlcmUgYmVmb3JlIHRoZSB1cGxvYWQpLiBJIGFsc28gbW9kaWZpZWQgdGhlIEZUUCB0ZXN0IHNlcnZlciBhbmQgYSBmZXcgdGVzdAogIGNhc2VzIGFjY29yZGluZ2x5IHRvIG1hdGNoIHRoaXMgbW9kaWZpZWQgYmVoYXZpb3IuCgpEYW5pZWwgU3RlbmJlcmcgKDI5IFNlcCAyMDA4KQotIERhbmllbCBFZ2dlciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWxsb3dzIHlvdSB0byBkaXNhYmxlIHByb3h5IHN1cHBvcnQgaW4KICBsaWJjdXJsIHRvIHNvbWV3aGF0IHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgYmluYXJ5LiBSdW4gY29uZmlndXJlCiAgLS1kaXNhYmxlLXByb3h5LgogIApEYW5pZWwgRmFuZHJpY2ggKDI5IFNlcCAyMDA4KQotIE1vdmVkIGFsbCBzaWduYWwtYmFzZWQgbmFtZSByZXNvbHV0aW9uIHRpbWVvdXQgaGFuZGxpbmcgaW50byBhIHNpbmdsZSBuZXcKICBDdXJsX3Jlc29sdl90aW1lb3V0IGZ1bmN0aW9uIHRvIHJlZHVjZSBjb3VwbGluZy4KCkRhbmllbCBTdGVuYmVyZyAoMjkgU2VwIDIwMDgpCi0gSWFuIEx5bmFnaCBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIENVUkxPUFRfUkFOR0Ugd29yayBmaW5lIGZvciBTRlRQCiAgZG93bmxvYWRzIQoKLSBNYXhpbSBJdmFub3YgZmlsZWQgYnVnIHJlcG9ydCAjMjEwNzgwMwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTA3ODAzKSAibm8gQ1VSTElORk9fUkVESVJFQ1RfVVJMIGluCiAgbXVsdGkgbW9kZSIgdG9nZXRoZXIgd2l0aCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIHByb2JsZW0uCiAgCkRhbmllbCBTdGVuYmVyZyAoMjUgU2VwIDIwMDgpCi0gRW1hbnVlbGUgQm92aXNpbyBzdWJtaXR0ZWQgYnVnIHJlcG9ydCAjMjEyNjQzNS4gV2UgZml4ZWQgdGhlIEhUVFAgRGlnZXN0CiAgYXV0aCBjb2RlIHRvIG5vdCBiZWhhdmUgYmFkbHkgd2hlbiBnZXR0aW5nIGEgYmxhbmsgcmVhbG0gd2l0aAogIHJlYWxtPSIiLiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTI2NDM1CgpEYW5pZWwgRmFuZHJpY2ggKDIzIFNlcCAyMDA4KQotIE1ha2Ugc3VyZSBub3QgdG8gZGVyZWZlcmVuY2UgdGhlIHdyb25nIFVybFN0YXRlIHByb3RvIHVuaW9uIG1lbWJlciB3aGVuCiAgc3dpdGNoaW5nIGZyb20gb25lIHByb3RvY29sIHRvIGFub3RoZXIgaW4gYSBzaW5nbGUgcmVxdWVzdCAoZS5nLgogIHJlZGlyZWN0aW5nIGZyb20gSFRUUCB0byBGVFAgYXMgaW4gdGVzdCAxMDU1KSBieSByZXNldHRpbmcKICBzdGF0ZS5leHBlY3QxMDBoZWFkZXIgYmVmb3JlIGV2ZXJ5IHJlcXVlc3QuCgpEYW5pZWwgU3RlbmJlcmcgKDIzIFNlcCAyMDA4KQotIEludHJvZHVjaW5nIEphbWllIExva2llcidzIGZ1bmN0aW9uIGZvciBkYXRlIHRvIGVwb2NoIGNvbnZlcnNpb24gdXNlZCBpbiB0aGUKICBkYXRlIHBhcnNlciBmdW5jdGlvbi4gVGhpcyBtYWtlcyBvdXIgZnVuY3Rpb24gbGVzcyBkZXBlbmRlbnQgb24gc3lzdGVtLQogIHByb3ZpZGVkIGZ1bmN0aW9ucyBhbmQgaW5zdGVhZCB3ZSBkbyBhbGwgdGhlIG1hZ2ljIG91cnNlbHZlcy4gV2UgYWxzbyBubwogIGxvbmdlciBkZXBlbmQgb24gdGhlIFRaIGVudmlyb25tZW50IHZhcmlhYmxlLiBTd2l0Y2hpbmcgdG8gb3VyIG93biBjb252ZXJ0ZXIKICBoYXMgc29tZSBzaWRlLWVmZmVjdCBhbmQgdGhleSBhcmUgbm90ZWQgaGVyZSBmb3IgZnV0dXJlIHJlZmVyZW5jZSAodGFrZW4KICBmcm9tIGEgbWFpbCBieSBtciBMb2tpZXIpOgoKICB0aW1lX3QgaXMgbm90IG1lYXN1cmVkIGluIHNlY29uZHMgaW4gdGhlIEFOU0kgQyBzdGFuZGFyZCAtIG9yIGV2ZW4gY291bnRlZAogIHVuaWZvcm1seSAtIHdlaXJkIHBsYXRmb3JtcyBjYW4gdXNlIG90aGVyIG51bWVyaWMgcmVwcmVzZW50YXRpb25zIG9mIGRhdGVzCiAgaW4gdGltZV90IC0gaGVuY2UgdGhlIGRpZmZ0aW1lKCkgZnVuY3Rpb24uCgogIE9uIFBPU0lYIHRpbWVfdCBpcyBtZWFzdXJlZCBpbiBVVEMgc2Vjb25kcywgd2hpY2ggbWVhbnMgbm90IGluY2x1ZGluZyBsZWFwCiAgc2Vjb25kcy4gIEJ1dCBpdCdzIG1lbnRpb25lZCBpbiBhIGZldyBwbGFjZXMgdGhhdCBzb21lIG9sZCBQT1NJWC1pc2gKICBlbnZpcm9ubWVudHMgaW5jbHVkZSBsZWFwIHNlY29uZHMgaW4gdGhlaXIgdGltZV90IGNvdW50cy4uLgoKICBJJ20gcHJldHR5IHN1cmUgW3RoZSBuZXcgaW1wbGVtZW50YXRpb24gaXNdIGNvcnJlY3Qgb24gYW55dGhpbmcgdHJ1bHkgUE9TSVguCiAgQW5kIGl0J3Mgb2J2aW91c2x5IGEgbG90IGxlc3MgZGVwZW5kZW50IG9uIHBsYXRmb3JtIHF1aXJrcyBhbmQgY29ybmVyIGNhc2VzCiAgaW4gbWFueSB3YXlzIHRoYW4gdGhlIG1rdGltZSgpIHZlcnNpb24uCgotIFJvYiBDcml0dGVuZGVuIGJyb3VnaHQgYSBwYXRjaCB0byAiYWRkIHNvbWUgbG9ja2luZyBmb3IgdGhyZWFkLXNhZmV0eSB0byBOU1MKICBpbXBsZW1lbnRhdGlvbiIuCgpEYW5pZWwgU3RlbmJlcmcgKDIyIFNlcCAyMDA4KQotIE1hZGUgdGhlIFNPQ0tTIGNvZGUgdXNlIHRoZSBuZXcgQ3VybF9yZWFkX3BsYWluKCkgZnVuY3Rpb24gdG8gZml4IHRoZSBidWcKICBNYXJrdXMgTW9lbGxlciByZXBvcnRlZDogaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2FyY2hpdmUtMjAwOC0wOS8wMDE2Lmh0bWwKCi0gcmVjdigpIGVycm9ycyBvdGhlciB0aGFuIHRob3NlIGVxdWFsIHRvIEVBR0FJTiBub3cgY2F1c2UgcHJvcGVyCiAgQ1VSTEVfUkVDVl9FUlJPUiB0byBnZXQgcmV0dXJuZWQuIFRoaXMgbWFkZSB0ZXN0IGNhc2UgMTYwIGZhaWwgc28gSSd2ZSBub3cKICBkaXNhYmxlZCBpdCB1bnRpbCB3ZSBjYW4gZmlndXJlIG91dCBhbm90aGVyIHdheSB0byBleGVyY2lzZSB0aGF0IGxvZ2ljLgoKLSBNaWNoYWVsIEdvZmZpb3VsIGZpbGVkIGJ1ZyByZXBvcnQgIzIxMDczNzcgIlByb2JsZW0gd2l0aCBtdWx0aSArIEdudVRMUyArCiAgcHJveHkiIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTA3Mzc3KSB0aGF0IHNob3dlZCBob3cgYSBtdWx0aQogIGludGVyZmFjZSB1c2luZyBwcm9ncmFtIGRpZG4ndCB3b3JrIHdoZW4gYnVpbHQgd2l0aCBHbnVUTFMgYW5kIGEgQ09OTkVDVAogIHJlcXVlc3Qgd2FzIGRvbmUgb3ZlciBhIHByb3h5IChiYXNpY2FsbHkgdGVzdCA1MDIgb3ZlciBhIHByb3h5IHRvIGEgSFRUUFMKICBzaXRlKS4gSXQgdHVybmVkIG91dCB0aGUgc3NsIGNvbm5lY3QgZnVuY3Rpb24gd291bGQgZ2V0IGNhbGxlZCB0d2ljZSB3aGljaAogIGNhdXNlZCB0aGUgc2Vjb25kIGNhbGwgdG8gZmFpbC4KCkRhbmllbCBGYW5kcmljaCAoMjIgU2VwIDIwMDgpCi0gRml4ZWQgdGVzdCA1MzkgdG8gaGFuZGxlIGFuIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uIHRoYXQgc2hvd3MgdXAgbm93CiAgdGhhdCBtZW1kZWJ1Zy5oIGlzIGluY2x1ZGVkIGluIHRoZSB0ZXN0IHByb2dyYW1zLgoKWWFuZyBUc2UgKDIwIFNlcCAyMDA4KQotIEZpeCByZWdyZXNzaW9uIGluIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggYWZmZWN0ZWQgT3BlblNTTCBidWlsZHMgb24gTVNZUy4KCllhbmcgVHNlICgxOSBTZXAgMjAwOCkKLSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgYXZhaWxhYmlsaXR5IG9mIHRoZSBhbGFybSgpIGZ1bmN0aW9uLgoKRGFuaWVsIEZhbmRyaWNoICgxOCBTZXAgMjAwOCkKLSBEb24ndCBib3RoZXIgdG8gaW5zdGFsbCBhIFNJR0FMUk0gaGFuZGxlciB1bmxlc3MgYWxhcm0oKSBpcyBhdmFpbGFibGUuCiAgQWxzbywgbGVhdmUgdGhlIGV4aXN0aW5nIFNJR0FMUk0gaGFuZGxlciBhbG9uZSBpZiB0aGUgdGltZW91dCBpcyB0b28gc21hbGwKICB0byBoYW5kbGUuCgpEYW5pZWwgRmFuZHJpY2ggKDE3IFNlcCAyMDA4KQotIFJlbW92ZWQgcmVmZXJlbmNlIHRvIGN1cmwtY2EtYnVuZGxlLmNydCBpbiB0aGUgaG9zdCB2ZXJpZmljYXRpb24gZmFpbHVyZQogIGVycm9yIG1lc3NhZ2UuCgpZYW5nIFRzZSAoMTcgU2VwIDIwMDgpCi0gSW1wcm92ZSBjb25maWd1cmUgZGV0ZWN0aW9uIG9mIGdldGhvc3RuYW1lKCksIGxvY2FsdGltZV9yKCksIHN0cnN0cigpLAogIGdldHNlcnZieXBvcnRfcigpLCBnZXRob3N0YnlhZGRyX3IoKSBhbmQgZ2V0aG9zdGJ5bmFtZV9yKCkuCgpZYW5nIFRzZSAoMTQgU2VwIDIwMDgpCi0gSW1wcm92ZSBjb25maWd1cmUgZGV0ZWN0aW9uIG9mIHN0cmNhc2VjbXAoKSwgc3RyY2FzZXN0cigpLCBzdHJjbXBpKCksCiAgc3RyaWNtcCgpLCBzdHJsY2F0KCksIHN0cm5jYXNlY21wKCksIHN0cm5jbXBpKCkgYW5kIHN0cm5pY21wKCkuCgpZYW5nIFRzZSAoMTMgU2VwIDIwMDgpCi0gRGlzYWJsZSB0cmFja2luZyBvZiBmZG9wZW4oKSBjYWxscyBpbiB0aGUgbG93LWxldmVsIG1lbW9yeSBsZWFrIHRyYWNraW5nCiAgY29kZSB3aGVuIGZkb3BlbigpIGlzIG5vdCBhdmFpbGFibGUsIHRvIGF2b2lkIGNvbXBpbGVyIGVycm9yLgoKWWFuZyBUc2UgKDEyIFNlcCAyMDA4KQotIEZ1cnRoZXIgYWRqdXN0IGRldGVjdGlvbiBvZiBzdHJlcnJvcl9yKCkgaW4gdGhlIGNvbmZpZ3VyZSBwcm9jZXNzLCBhbmQKICBlbnN1cmUgdGhhdCBlcnJubyBpcyBub3QgbW9kaWZpZWQgaW5zaWRlIEN1cmxfc3RyZXJyb3IoKS4KCllhbmcgVHNlICgxMCBTZXAgMjAwOCkKLSBJbXByb3ZlIGRldGVjdGlvbiBvZiBnbXRpbWVfcigpLCBzdHJ0b2xsKCksIHNpZ2FjdGlvbigpLCBzdHJ0b2tfcigpLAogIHN0cmR1cCgpIGFuZCBmdHJ1bmNhdGUoKSBpbiB0aGUgY29uZmlndXJlIHByb2Nlc3MuCgpEYW5pZWwgRmFuZHJpY2ggKDkgU2VwIDIwMDgpCi0gTWlrZSBSZXZpIGRpc2NvdmVyZWQgc29tZSBzd2FwcGVkIHNwZWVkIHN3aXRjaGVzIGRvY3VtZW50ZWQgaW4gdGhlIGN1cmwgbWFuCiAgcGFnZS4KCi0gQ2hlY2tlZCBpbiBzb21lIGRvY3VtZW50YXRpb24gYW5kIGNvZGUgaW1wcm92ZW1lbnRzIGFuZCBmaXhlcyB0aGF0IEkKICBkaXNjb3ZlcmVkIGluIHRoZSBGcmVlQlNEIHBvcnRzIHN5c3RlbS4KCkRhbmllbCBTdGVuYmVyZyAoOCBTZXAgMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luIHBhdGNoZWQgYSBwcm9ibGVtOiBJIGhhdmUgZm91bmQgYnVnIGluIHBpcGVsaW5pbmcgdGhyb3VnaAogIHByb3h5LiBJIGhhdmUgYSB0cmFuc3BhcmVudCBwcm94eS4gV2hlbiBydW5uaW5nIHdpdGggaHR0cF9wcm94eSBlbnZpcm9ubWVudAogIHZhcmlhYmxlIG5vdCBzZXQgbXkgdGVzdCBjb21wbGV0ZXMgZmluZSAoaXQgZ29lcyB0aHJvdWdoIHRyYW5zcGFyZW50CiAgcHJveHkpLiBXaGVuIEkgc2V0IGh0dHBfcHJveHkgdmFyaWFibGUgbXkgdGVzdCBoYW5ncyBhZnRlciB0aGUgZmlyc3QKICBkb3dubG9hZGVkIGlzIGNvbXBsZXRlLiBMb29rcyBsaWtlIHRoZSBzZWNvbmQgaGFuZGxlIG5ldmVyIGdldHMgb3V0IGZyb20KICBXQUlURE8gc3RhdGUuCgogIFRoZSBmaXg6IEl0IG1ha2VzIGNoZWNrUGVuZFBpcGVsaW5lIG1vdmUgMSBoYW5kbGVyIGZyb20gcGVuZCBwaXBlIHRvIHNlbmQKICBwaXBlIGlmIHBpcGVsaW5pbmcgaXMgbm90IHN1cHBvcnRlZCBieSBzZXJ2ZXIgYnV0IHRoZXJlIGFyZSBubyBoYW5kbGVzIGluCiAgc2VuZCBhbmQgcmVjdiBwaXBlcy4KCi0gU3RlZmFuIEtyYXVzZSBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgd291bGQgd3JvbmdseSBzZW5kIGF3YXkgY29va2llcyB0bwogIHNpdGVzIGluIGNhc2VzIHdoZXJlIHRoZSBjb29raWUgY2xlYXJseSBoYXMgYSB2ZXJ5IG9sZCBleHBpcnkgZGF0ZS4gVGhlCiAgY29uZGl0aW9uIHdhcyBzaW1wbHkgdGhhdCBsaWJjdXJsJ3MgZGF0ZSBwYXJzZXIgd291bGQgZmFpbCB0byBjb252ZXJ0IHRoZQogIGRhdGUgYW5kIGl0IHdvdWxkIHRoZW4gY291bnQgYXMgYSAodGltZWQtYmFzZWQpIG1hdGNoLiBTdGFydGluZyBub3csIGEKICBtaXNzZWQgZGF0ZSBkdWUgdG8gYW4gdW5zdXBwb3J0ZWQgZGF0ZSBmb3JtYXQgb3IgZGF0ZSByYW5nZSB3aWxsIG5vdyBjYXVzZQogIHRoZSBjb29raWUgdG8gbm90IG1hdGNoLgoKRGFuaWVsIEZhbmRyaWNoICg1IFNlcCAyMDA4KQotIEltcHJvdmVkIHRoZSBsb2dpYyB0aGF0IGRlY2lkZXMgd2hldGhlciB0byB1c2UgSFRUUCAxLjEgZmVhdHVyZXMgb3Igbm90IGluIGEKICByZXF1ZXN0LiAgU2V0dGluZyBhIHNwZWNpZmljIHZlcnNpb24gd2l0aCBDVVJMT1BUX0hUVFBfVkVSU0lPTiBvdmVycmlkZXMKICBhbGwgb3RoZXIgY2hlY2tzLCBidXQgb3RoZXJ3aXNlLCBhIDEuMCByZXF1ZXN0IHdpbGwgYmUgbWFkZSBpZiB0aGUgc2VydmVyCiAgaXMga25vd24gdG8gc3VwcG9ydCBvbmx5IDEuMCBiZWNhdXNlIGl0IHByZXZpb3VzbHkgcmVzcG9uZGVkIHNvIGFuZCB0aGUKICBjb25uZWN0aW9uIHdhcyBrZXB0IGFsaXZlLCBvciBhIHJlc3BvbnNlIHRvIGEgcHJldmlvdXMgcmVxdWVzdCBvbiB0aGlzIGhhbmRsZQogIGNhbWUgYmFjayBhcyAxLjAuIFRoZSBsYXR0ZXIgY291bGQgdGFrZSBwbGFjZSBpbiBjYXNlcyBsaWtlIHJlZGlyZWN0aW9uIG9yCiAgYXV0aGVudGljYXRpb24gd2hlcmUgc2V2ZXJhbCByZXF1ZXN0cyBoYXZlIHRvIGJlIG1hZGUgYmVmb3JlIHRoZSBvcGVyYXRpb24KICBpcyBjb21wbGV0ZS4gIElmIGFueSBvbmUgb2YgdGhlIHNlcnZlcnMgaW4gYSByZWRpcmVjdGlvbiBjaGFpbiBzdXBwb3J0cyBvbmx5CiAgMS4wLCB0aGVuIHJlbWFpbmluZyByZXF1ZXN0cyB3aWxsIGJlIHNlbnQgaW4gMS4wIG1vZGUuCgotIERldGVjdCBjYXNlcyB3aGVyZSBhbiB1cGxvYWQgbXVzdCBiZSBzZW50IGNodW5rZWQgYW5kIHRoZSBzZXJ2ZXIgc3VwcG9ydHMKICBvbmx5IEhUVFAgMS4wIGFuZCByZXR1cm4gQ1VSTEVfVVBMT0FEX0ZBSUxFRC4KCkRhbmllbCBTdGVuYmVyZyAoNSBTZXAgMjAwOCkKLSBNYXJ0aW4gRHJhc2FyIHByb3ZpZGVkIHRoZSBDVVJMT1BUX1BPU1RSRURJUiBwYXRjaC4gSXQgcmVuYW1lcwogIENVUkxPUFRfUE9TVDMwMSAoYnV0IGFkZHMgYSBkZWZpbmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB5b3Ugd2hvCiAgZG9uJ3QgZGVmaW5lIENVUkxfTk9fT0xESUVTKS4gVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBub3cgYWxzbyBjaGFuZ2UgdGhlCiAgbGliY3VybCBiZWhhdmlvciBmb3IgYSBIVFRQIHJlc3BvbnNlIDMwMiBhZnRlciBhIFBPU1QgdG8gbm90IHVzZSBHRVQgaW4gdGhlCiAgc3Vic2VxdWVudCByZXF1ZXN0ICh3aGVuIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gaXMgZW5hYmxlZCkuIEkgZWRpdGVkIHRoZQogIHBhdGNoIHNvbWV3aGF0IGJlZm9yZSBjb21taXQuIFRoZSBjdXJsIHRvb2wgZ290IGEgbWF0Y2hpbmcgLS1wb3N0MzAyCiAgb3B0aW9uLiBUZXN0IGNhc2UgMTA3NiB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMuCgotIEludHJvZHVjaW5nIENVUkxPUFRfQ0VSVElORk8gYW5kIHRoZSBjb3JyZXNwb25kaW5nIENVUkxJTkZPX0NFUlRJTkZPLiBCeQogIGVuYWJsaW5nIHRoaXMgZmVhdHVyZSB3aXRoIENVUkxPUFRfQ0VSVElORk8gZm9yIGEgcmVxdWVzdCB1c2luZyBTU0wgKEhUVFBTCiAgb3IgRlRQUyksIGxpYmN1cmwgd2lsbCBnYXRoZXIgbG90cyBvZiBzZXJ2ZXIgY2VydGlmaWNhdGUgaW5mbyBhbmQgdGhhdCBpbmZvCiAgY2FuIHRoZW4gZ2V0IGV4dHJhY3RlZCBieSBhIGNsaWVudCBhZnRlciB0aGUgcmVxdWVzdCBoYXMgY29tcGxldGVkIHdpdGgKICBjdXJsX2Vhc3lfZ2V0aW5mbygpJ3MgQ1VSTElORk9fQ0VSVElORk8gb3B0aW9uLiBMaW51cyBOaWVsc2VuIEZlbHR6aW5nCiAgaGVscGVkIG1lIHRlc3QgYW5kIHNtb290aGVuIG91dCB0aGlzIGZlYXR1cmUuCgogIFVuZm9ydHVuYXRlbHksIHRoaXMgZmVhdHVyZSBjdXJyZW50bHkgb25seSB3b3JrcyB3aXRoIGxpYmN1cmwgYnVpbHQgdG8gdXNlCiAgT3BlblNTTC4KCiAgVGhpcyBmZWF0dXJlIHdhcyBzcG9uc29yZWQgYnkgbmV0d29ya2luZzRhbGwuY29tIC0gdGhhbmtzIQoKLSBEbWl0cml5IFNlcmdleWV2IHBvaW50ZWQgb3V0IHRoYXQgY3VybF9lYXN5X3BhdXNlKCkgZGlkbid0IHVucGF1c2UgcHJvcGVybHkKICBkdXJpbmcgY2VydGFpbiBjb25kaXRpb25zLiBJIGFsc28gY2hhbmdlZCB0aGlzIGNvZGUgdG8gdXNlIHJlYWxsb2MoKSBiYXNlZAogIG9uIERhbmllbCBGYW5kcmljaCdzIHN1Z2dlc3Rpb24uCgpHdWVudGVyIEtuYXVmICg0IFNlcCAyMDA4KQotIE1pbmdXMzIgbm9uLWNvbmZpZ3VyZSBidWlsZHMgYXJlIG5vdyBsYXJnZWZpbGUgZmVhdHVyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCiAgTmV0V2FyZSBMSUJDIGJ1aWxkcyBhcmUgYWxzbyBub3cgbGFyZ2VmaWxlIGZlYXR1cmUgZW5hYmxlZCBieSBkZWZhdWx0LgoKWWFuZyBUc2UgKDQgU2VwIDIwMDgpCi0gU2V2ZXJhbCBmaXhlcyByZWxhdGVkIHdpdGggcHJpbnQgZm9ybWF0dGluZyBzdHJpbmcgZGlyZWN0aXZlcy4KCkRhbmllbCBGYW5kcmljaCAoMyBTZXAgMjAwOCkKLSBTZWFyY2ggZm9yIHRoZSBGcmVlQlNEIENBIGNlcnQgZmlsZSAvdXNyL2xvY2FsL3NoYXJlL2NlcnRzL2NhLXJvb3QuY3J0CgpEYW5pZWwgRmFuZHJpY2ggKDIgU2VwIDIwMDgpCi0gRml4ZWQgYW4gb3V0IG9mIG1lbW9yeSBwcm9ibGVtIHRoYXQgY2F1c2VkIHRvcnR1cmUgdGVzdCBmYWlsdXJlcyBpbiB0ZXN0cwogIDcwNiBhbmQgNzA3LgoKRGFuaWVsIFN0ZW5iZXJnICgyIFNlcCAyMDA4KQotIEtlaXRoIE1vayBhZGRlZCBzdXBwb3J0ZWRfcHJvdG9jb2xzIGFuZCBzdXBwb3J0ZWRfZmVhdHVyZXMgdG8gdGhlIHBrZy1jb25maWcKICBmaWxlIGZvciBsaWJjdXJsLCBhbmQgd2hpbGUgZG9pbmcgdGhhdCBmaXggaGUgdW5pZmllZCB3aXRoIGN1cmwtY29uZmlnLmluCiAgaG93IHRoZSBzdXBwb3J0ZWQgcHJvdG9jb2xzIGFuZCBmZWF0dXJlcyBhcmUgZXh0cmFjdGVkIGFuZCB1c2VkLCBzbyBib3RoIHRob3NlCiAgdG9vbHMgc2hvdWxkIG5vdyBhbHdheXMgYmUgc3luY2VkLgoKVmVyc2lvbiA3LjE5LjAgKDEgU2VwdGVtYmVyIDIwMDgpCgpEYW5pZWwgRmFuZHJpY2ggKDI5IEF1ZyAyMDA4KQotIEFkZGVkIHRlc3RzIDEwNzEgdGhyb3VnaCAxMDc0IHRvIHRlc3QgYXV0b21hdGljIGRvd25ncmFkaW5nIGZyb20gSFRUUCAxLjEKICB0byBIVFRQIDEuMCB1cG9uIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIEhUVFAgc2VydmVyLiAgVGVzdHMgMTA3MgogIGFuZCAxMDczIGFyZSBzaW1pbGFyIHRvIHRlc3QgMTA2OSBpbiB0aGF0IHRoZXkgaW52b2x2ZSB0aGUgaW1wb3NzaWJsZQogIHNjZW5hcmlvIG9mIHNlbmRpbmcgY2h1bmtlZCBkYXRhIHRvIGEgSFRUUCAxLjAgc2VydmVyLiAgQWxsIHRoZXNlIGZhaWwKICBhbmQgYXJlIGFkZGVkIHRvIERJU0FCTEVELgoKLSBBZGRlZCB0ZXN0IDEwNzUgdG8gdGVzdCAtLWFueWF1dGggd2l0aCBCYXNpYyBhdXRoZW50aWNhdGlvbi4KCkRhbmllbCBTdGVuYmVyZyAoMjkgQXVnIDIwMDgpCi0gV2hlbiBsaWJjdXJsIHdhcyBkb2luZyBhIEhUVFAgUE9TVCBhbmQgdGhlIHNlcnZlciB3b3VsZCByZXNwb25kIHdpdGgKICAiQ29ubmVjdGlvbjogY2xvc2UiIGFuZCBhY3R1YWxseSBjbG9zZSB0aGUgY29ubmVjdGlvbiBhZnRlciB0aGUKICByZXNwb25zZS1ib2R5LCBsaWJjdXJsIGNvdWxkIHN0aWxsIGhhdmUgb3V0c3RhbmRpbmcgZGF0YSB0byBzZW5kIGFuZCBpdAogIHdvdWxkIG5vdCBwcm9wZXJseSBub3RpY2UgdGhpcyBhbmQgc3RvcCBzZW5kaW5nLiBUaGlzIGNhdXNlZCB3ZWlyZG5lc3MgYW5kCiAgc2FkIGZhY2VzLiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDgwMjIyCgogIE5vdGUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgcmVhc29ucyB0byBjb25zaWRlciBsaWJjdXJsJ3MgYmVoYXZpb3Igd2hlbgogIGdldHRpbmcgYSA+PSA0MDAgcmVzcG9uc2UgY29kZSB3aGlsZSBzZW5kaW5nIGRhdGEsIGFzIENyYWlnIFBlcnJhcycgbm90ZQogICJodHRwIHVwbG9hZDogaG93IHRvIHN0b3Agb24gZXJyb3IiIHNwZWNpZmllczoKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA4LTA4LzAxMzguaHRtbAoKRGFuaWVsIFN0ZW5iZXJnICgyOCBBdWcgMjAwOCkKLSBEZW5nbWlud2VuIHJlcG9ydGVkIHRoYXQgbGliY3VybCB3b3VsZCBsb2NrIGEgKGNvb2tpZSkgc2hhcmUgdHdpY2UgKHdpdGhvdXQKICBhbiB1bmxvY2sgaW4gYmV0d2VlbikgZm9yIGEgY2VydGFpbiBjYXNlIGFuZCB0aGF0IGluIGZhY3Qgd29ya3Mgd2hlbiB1c2luZwogIHJlZ3VsYXIgd2luZG93cyBtdXRleGVzIGJ1dCBub3Qgd2l0aCBwdGhyZWFkcychIExvY2tzIHNob3VsZCBvZiBjb3Vyc2Ugbm90CiAgZ2V0IGxvY2tlZCBhZ2FpbiBzbyB0aGlzIGlzIG5vdyBmaXhlZC4KICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDgvMDQyMi5odG1sCgotIEknbSBhYmFuZG9uaW5nIHRoZSBzeXN0ZW0gd2l0aCB0aGUgd2ViIHNpdGUgbWlycm9ycyAoYnV0IGtlZXBpbmcgZG93bmxvYWQKICBmaWxlcyBiaW5nIG1pcnJvcmVkKSBhbmQgdGh1cyBJJ3ZlIGNoYW5nZWQgdGhlIFVSTCBpbiB0aGUgY29va2llamFyIGhlYWRlcgogIHRvIG5vIGxvbmdlciB1c2UgY3VybG0uaGF4eC5zZSBidXQgaW5zdGVhZCB1c2UgdGhlIG1haW4gc2l0ZSBjdXJsLmhheHguc2UKCkRhbmllbCBGYW5kcmljaCAoMjcgQXVnIDIwMDgpCi0gRml4ZWQgdGVzdCBjYXNlIDEwNjUgYnkgY2hhbmdpbmcgdGhlIGhhbmRsaW5nIG9mIENVUkxPUFRfVVBMT0FEIHRvIHNldAogIHRoZSBIVFRQIG1ldGhvZCB0byBHRVQgKG9yIEhFQUQpIHdoZW4gZ2l2ZW4gYSB2YWx1ZSBvZiAwLgoKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwNjggYW5kIDEwNjkgdG8gdGVzdCBhIHNpbXBsZSBIVFRQIFBVVCBmcm9tIHN0ZGluLiAgVGVzdAogIGNhc2UgMTA2OSBmYWlscyBpbiBhIHNpbWlsYXIgbWFubmVyIHRvIHRlc3QgMTA2NSBzbyBpcyBhZGRlZCB0byBESVNBQkxFRC4KCllhbmcgVHNlICgyNyBBdWcgMjAwOCkKLSBGaXggZ2VuZXJhdGlvbiBvZiBNUyBWQzYgLmRzcCBmaWxlIHRvIG1ha2UgaXQgc3VwcG9ydCBjb21waWxhdGlvbiBvZiBlaXRoZXIKICBkeW5hbWljIChETEwpIG9yIHN0YXRpYyAoTElCKSBsaWJjdXJsIGxpYnJhcmllcyBpbiBkZWJ1ZyBhbmQgcmVsZWFzZSBtb2Rlcy4KCkRhbmllbCBGYW5kcmljaCAoMjYgQXVnIDIwMDgpCi0gRml4ZWQgb3V0IG9mIG1lbW9yeSBwcm9ibGVtcyB0aGF0IGNhdXNlZCB0b3J0dXJlIHRlc3QgZmFpbHVyZXMgaW4gdGVzdHMKICAxMDIxIGFuZCAxMDY3LgoKWWFuZyBUc2UgKDI2IEF1ZyAyMDA4KQotIEFkZGVkIGNoZWNrIGFuZCBzeW1ib2wgZGVmaW5pdGlvbiBmb3IgV0lOMzIgZmlsZSBBUEkgdXNhZ2UgaW4gY29uZmlndXJlLAogIHN1cHBvcnRpbmcgY29uZmlndXJlJ3MgLS1kaXNhYmxlLWxhcmdlZmlsZSBvcHRpb24gZm9yIFdJTjMyIHRhcmdldHMgYWxzby4KCi0gTm9uLWNvbmZpZ3VyZSBzeXN0ZW1zIHdoaWNoIGRvIG5vdCB1c2UgY29uZmlnLXdpbjMyLmggY29uZmlndXJhdGlvbiBmaWxlLAogIGFuZCB3YW50IHRvIHVzZSB0aGUgV0lOMzIgZmlsZSBBUEksIG11c3QgZGVmaW5lIFVTRV9XSU4zMl9MQVJHRV9GSUxFUyBvcgogIFVTRV9XSU4zMl9TTUFMTF9GSUxFUyBhcyBhcHByb3ByaWF0ZSBpbiB0aGVpciBvd24gY29uZmlndXJhdGlvbiBmaWxlcy4KCkRhbmllbCBTdGVuYmVyZyAoMjMgQXVnIDIwMDgpCi0gUnVubmluZyAnbWFrZSBjYS1maXJlZm94JyBpbiB0aGUgcm9vdCBidWlsZCBkaXIgd2lsbCBub3cgcnVuIHRoZSBuZXcKICBmaXJlZm94LWRiMnBlbS5zaCBjb252ZXJzaW9uIHNjcmlwdCB0aGF0IGNvbnZlcnRzIGEgbG9jYWwgRmlyZWZveCBkYiBvZiBjYQogIGNlcnRzIGludG8gUEVNIGZvcm1hdCwgc3VpdGFibGUgZm9yIHVzZSB3aXRoIGEgT3BlblNTTCBvciBHbnVUTFMgYnVpbHQKICBsaWJjdXJsLgoKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBmaXhlZCBhIGJ1ZyB3aGVuIGRvaW5nIHByb3h5IENPTk5FQ1Qgd2l0aCB0aGUgbXVsdGkKICBpbnRlcmZhY2UsIGFuZCB0aGUgcHJveHkgd291bGQgc2VuZCBDb25uZWN0aW9uOiBjbG9zZSBkdXJpbmcgdGhlCiAgYXV0aGVudGljYXRpb24gcGhhc2UuICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDY5MDQ3CgpEYW5pZWwgRmFuZHJpY2ggKDIyIEF1ZyAyMDA4KQotIEZpeGVkIGEgcHJvYmxlbSB3aGVuIC0tZHVtcC1oZWFkZXIgLSB3YXMgZ2l2ZW4gd2l0aCBtb3JlIHRoYW4gb25lIFVSTCwKICB3aGljaCBjYXVzZWQgYW4gZXJyb3Igd2hlbiB0aGUgc2Vjb25kIGhlYWRlciB3YXMgZHVtcGVkIGR1ZSB0byBzdGRvdXQKICBiZWluZyBjbG9zZWQuICBBZGRlZCB0ZXN0IGNhc2UgMTA2NiB0byB2ZXJpZnkuICBBbHNvIGZpeGVkIGEgcG90ZW50aWFsCiAgcHJvYmxlbSB3aGVyZSBhIGNsb3NlZCBmaWxlIGRlc2NyaXB0b3IgbWlnaHQgYmUgdXNlZCBmb3IgYW4gdXBsb2FkCiAgd2hlbiBtb3JlIHRoYW4gb25lIFVSTCBpcyBnaXZlbi4KCllhbmcgVHNlICgyMiBBdWcgMjAwOCkKLSBJbXByb3ZlZCBsaWJjdXJsJ3MgaW50ZXJuYWwgY3VybF9tKnByaW50ZigpIGZ1bmN0aW9ucyBpbnRlZ3JhbCBkYXRhIHR5cGUKICBzaXplIGFuZCBzaWduZWRuZXNzIGhhbmRsaW5nLgoKLSBJbnRlcm5hbCBhZGp1c3RtZW50cyB0byBiZXR0ZXIgc2VsZWN0L2RpZmZlcmVudGlhdGUgd2hlbiBsYXJnZS9zbWFsbCBmaWxlCiAgc3VwcG9ydCBpcyBwcm92aWRlZCB1c2luZyBXSU4zMiBmdW5jdGlvbnMgZGlyZWN0bHkuCgpEYW5pZWwgRmFuZHJpY2ggKDIwIEF1ZyAyMDA4KQotIEFkZGVkIGFuIGVkaXRlZCB2ZXJzaW9uIG9mIFZpbmNlbnQgTGUgTm9ybWFuZCdzIGRvY3VtZW50YXRpb24gb2YgU0ZUUCBxdW90ZQogIGNvbW1hbmRzIHRvIHRoZSBtYW4gcGFnZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIEF1ZyAyMDA4KQotIFBoaWwgUGVsbG91Y2hvdWQgcG9pbnRlZCBvdXQgdGhhdCB0aGUgd2luZG93cyB2ZXJzaW9uIG9mIGxpYmN1cmwgaGFkIGEKICBtZW1vcnkgbGVhayBiZWNhdXNlIGl0IG5ldmVyIGNhbGxlZCB0aGUgT3BlblNTTCBmdW5jdGlvbgogIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCkgYXMgaXQgd2FzIHN1cHBvc2VkIHRvLiBUaGlzIHdhcyBiZWNhdXNlIG9mIGEKICBtaXNzaW5nIGRlZmluZSBpbiBjb25maWctd2luMzIuaCEKCkdpc2xlIFZhbmVtICgxOCBBdWcgMjAwOCkKLSBVcGRhdGVkIGxpYi9NYWtlZmlsZS5XYXRjb20gd2l0aCB0aGUgb3B0aW9uIHRvIHVzZSBjLWFyZXMgKFVTRV9BUkVTPTEpLgoKWWFuZyBUc2UgKDE4IEF1ZyAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZSA1NTcgdG8gdmVyaWZ5IGxpYmN1cmwncyBpbnRlcm5hbCBjdXJsX20qcHJpbnRmKCkgZnVuY3Rpb25zCiAgZm9ybWF0dGluZyBmdW5jdGlvbmFsaXR5IHdoZW4gaGFuZGxpbmcgc2lnbmVkIGFuZCB1bnNpZ25lZCBsb25ncywgYXMgd2VsbCBhcwogIG91ciBjdXJsX29mZl90IGRhdGEgdHlwZS4KCllhbmcgVHNlICgxNyBBdWcgMjAwOCkKLSBPcGVuU1NsIGVuYWJsZWQgTmV0V2FyZSBidWlsZHMgYXJlIGNoYW5nZWQgdG8gdXNlIHRoZSAnb3BlbnNzbCcgc3ViZGlyZWN0b3J5CiAgd2hlbiBpbmNsdWRpbmcgdGhlIE9wZW5TU0wgaGVhZGVyIGZpbGVzLiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5nLCB0aGlzCiAgcHJldmVudHMgdGhlIHVuZGVzaXJlZCBpbmNsdXNpb24gb2YgaGVhZGVyIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aG9zZQogIG9mIE9wZW5TU0wgYnV0IHdoaWNoIGRvIG5vdCBiZWxvbmcgdG8gdGhlIE9wZW5TU0wgcGFja2FnZS4gVGhlIHZpc2libGUgY2hhbmdlCiAgZnJvbSBwcmV2aW91c2x5IHJlbGVhc2VkIGxpYmN1cmwgdmVyc2lvbnMgaXMgdGhhdCBub3cgT3BlblNTbCBlbmFibGVkIE5ldFdhcmUKICBidWlsZHMgYWxzbyBkZWZpbmUgVVNFX09QRU5TU0wgaW4gY29uZmlnIGZpbGVzLCBhbmQgdGhhdCBPcGVuU1NMIGhlYWRlciBmaWxlcwogIG11c3QgYmUgbG9jYXRlZCBpbiBhIHN1YmRpcmVjdG9yeSBuYW1lZCAnb3BlbnNzbCcuCgpZYW5nIFRzZSAoMTYgQXVnIDIwMDgpCi0gTGlicmFyeSBpbnRlcm5hbCBvbmx5IEMgcHJlcHJvY2Vzc29yIG1hY3JvcyBGT1JNQVRfT0ZGX1QgYW5kIEZPUk1BVF9PRkZfVFUKICByZW1haW4gaW4gdXNlIGFzIGludGVybmFsIGN1cmxfb2ZmX3QgcHJpbnQgZm9ybWF0dGluZyBzdHJpbmdzIGZvciB0aGUgaW50ZXJuYWwKICAqcHJpbnRmIGZ1bmN0aW9ucyB3aGljaCBzdGlsbCBjYW5ub3QgaGFuZGxlIHByaW50IGZvcm1hdHRpbmcgc3RyaW5nIGRpcmVjdGl2ZXMKICBzdWNoIGFzICJJNjRkIiwgIkk2NHUiLCBhbmQgb3RoZXJzIGF2YWlsYWJsZSBvbiBNU1ZDLCBNaW5HVywgSW50ZWwncyBJQ0MsIGFuZAogIG90aGVyIERPUy9XaW5kb3dzIGNvbXBpbGVycy4KCkRhbmllbCBGYW5kcmljaCAoMTUgQXVnIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlIDEwNjMgdG8gdGVzdCBpbnZhbGlkIGxvbmcgZmlsZSByYW5nZXMgd2l0aCBmaWxlOiBVUkxzIGFuZAogIDEwNjQgdG8gdGVzdCBtdWx0aXBsZSBodHRwIFBVVHMuCgotIEFkZGVkIHRlc3QgY2FzZSAxMDY1IHRvIHRlc3QgYSBQVVQgd2l0aCBhIHNpbmdsZSBmaWxlIGJ1dCB0d28gVVJMcy4gVGhpcwogIHdhcyBkaXNjb3ZlcmVkIHRvIGJlIHByb2JsZW1hdGljIHdoaWxlIGludmVzdGlnYXRpbmcgYW4gaW5jaWRlbnQgcmVwb3J0ZWQgYnkKICBWb24gYmFjayBpbiBNYXkuICBjdXJsIGluIHRoaXMgY2FzZSBkb2Vzbid0IGluY2x1ZGUgYSBDb250ZW50LUxlbmd0aDogb3IKICBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCBoZWFkZXIgd2hpY2ggaXMgaWxsZWdhbC4gVGhpcyB0ZXN0IGNhc2UgaXMKICBhZGRlZCB0byBESVNBQkxFRCB1bnRpbCBhIHNvbHV0aW9uIGlzIGZvdW5kLgoKWWFuZyBUc2UgKDE1IEF1ZyAyMDA4KQotIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyB1c2VkIGludGVybmFsbHkgYW5kIGVxdWFsbHkgYXZhaWxhYmxlIGV4dGVybmFsbHkgd2hpY2gKICBhaWQgaW4gdGhlIHVzZSBvZiB0aGUgY3VybF9vZmZfdCBkYXRhIHR5cGUgYXJlIG5hbWVkOiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9ULAogIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVLCBDVVJMX1NJWkVPRl9DVVJMX09GRl9ULCBDVVJMX1NVRkZJWF9DVVJMX09GRl9ULAogIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVLCBDVVJMX09GRl9UX0MgYW5kIENVUkxfT0ZGX1RVX0MuCgpZYW5nIFRzZSAoMTMgQXVnIDIwMDgpCi0gVGhlIHNpemUgb2YgbG9uZyBpcyBhIGJ1aWxkIHRpbWUgY2hhcmFjdGVyaXN0aWMgYW5kIGFzIHN1Y2ggaXQgaXMgbm93IHJlY29yZGVkCiAgaW4gY3VybGJ1aWxkLmggYXMgQ1VSTF9TSVpFT0ZfTE9ORy4gRGVmaW5pdGlvbiBub3cgZG9uZSBmcm9tIGNvbmZpZ3VyZSBwcm9jZXNzCiAgYW5kIGluIENWUyBjdXJsYnVpbGQuaC5kaXN0IGZvciBub24tY29uZmlndXJlIHN5c3RlbXMuCgpEYW5pZWwgRmFuZHJpY2ggKDEyIEF1ZyAyMDA4KQotIEZpeGVkIGEgYnVmZmVyIG92ZXJmbG93IHByb2JsZW0gaW4gQ3VybF9wcm94eUNPTk5FQ1QgdGhhdCBjb3VsZCBvY2N1cgogIHdoZW4gYSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggbG9uZyBoZWFkZXJzIGFuZCBkYXRhLiAgTHVja2lseSwgdGhlIGJ1ZmZlcgogIG92ZXJmbG93ZWQgaW50byBhbm90aGVyIHVudXNlZCBidWZmZXIsIHNvIG5vIGFjdHVhbCBoYXJtIHdhcyBkb25lLgogIEFkZGVkIHRlc3QgY2FzZXMgMTA2MCBhbmQgMTA2MSB0byB2ZXJpZnkuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIEF1ZyAyMDA4KQotIEFuZHkgVHNvdWxhZHplIGZpeGVkIHJ1bnRlc3RzLnBsIHRvIG5vdCBhdHRlbXB0IHRvIGV4ZWN1dGUgdGhlIHN0dW5uZWwKICBfZGlyZWN0b3J5XyBpZiB0aGF0IGhhcHBlbmVkIHRvIGFwcGVhciBpbiB0aGUgcGF0aCEKCllhbmcgVHNlICgxMiBBdWcgMjAwOCkKLSBBZGRlZCBtYWNyb3MgZm9yIG1pbmltdW0td2lkdGggc2lnbmVkIGFuZCB1bnNpZ25lZCBjdXJsX29mZl90IGludGVnZXIKICBjb25zdGFudHMgQ1VSTF9PRkZfVF9DIGFuZCBDVVJMX09GRl9UVV9DLiBUaGUgY2xldmVyIGRvdWJsZSBoZWxwZXIgbWFjcm8KICB1c2VkIGludGVybmFsbHkgdG8gcHJvdmlkZSBpdHMgZnVuY3Rpb25hbGl0eSBpcyB0aGFua3MgdG8gTGFycyBOaWxzc29uLgoKRGFuaWVsIEZhbmRyaWNoICgxMSBBdWcgMjAwOCkKLSBGaXhlZCBhIGJvdW5kYXJ5IGNvbmRpdGlvbiBlcnJvciBpbiBmdHBfcmVhZHJlc3AoKSB3aGVyZWJ5IGEgbm9uLXRlcm1pbmFsCiAgbGluZSBvZiBhIG11bHRpbGluZSBGVFAgcmVzcG9uc2Ugd2hvc2UgbGFzdCBieXRlIGxhbmRlZCBleGFjdGx5IGF0IHRoZSBlbmQKICBvZiB0aGUgQlVGU0laRS1sZW5ndGggYnVmZmVyIHdvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIHRlcm1pbmFsIHJlc3BvbnNlCiAgbGluZS4gIFRoZSBmb2xsb3dpbmcgcmVzcG9uc2UgY29kZSByZWFkIGluIHdvdWxkIHRoZW4gYWN0dWFsbHkgYmUgdGhlCiAgZW5kIG9mIHRoZSBwcmV2aW91cyByZXNwb25zZSBsaW5lLCBhbmQgYWxsIHJlc3BvbnNlcyBmcm9tIHRoZW4gb24gd291bGQKICBjb3JyZXNwb25kIHRvIHRoZSB3cm9uZyBjb21tYW5kLiBUZXN0IGNhc2UgMTA2MiB2ZXJpZmllcyB0aGlzLgoKLSBTdG9wIGNsb3NpbmcgYSBuZXZlci1vcGVuZWQgZnRwIHNvY2tldC4KCkRhbmllbCBTdGVuYmVyZyAoMTEgQXVnIDIwMDgpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZmlsZWQgYnVnIHJlcG9ydCAjMjA0MjQzMAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDQyNDMwKSB3aXRoIGEgcGF0Y2guICJOVExNIFdpbmRvd3MKICBTU1BJIGNvZGUgaXMgbm90IHRocmVhZCBzYWZlIi4gVGhpcyB3YXMgZHVlIHRvIGxpYmN1cmwgdXNpbmcgc3RhdGljCiAgdmFyaWFibGVzIHRvIHRlbGwgd2V0aGVyIHRvIGxvYWQgdGhlIG5lY2Vzc2FyeSBTU1BJIERMTCwgYnV0IG5vdyB0aGUgbG9hZGluZwogIGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBtb3JlIHN1aXRhYmxlIGN1cmxfZ2xvYmFsX2luaXQoKSBjYWxsLgoKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBmaWxlZCBidWcgcmVwb3J0ICMyMDQyNDQwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIwNDI0NDApIHdpdGggYSBwYXRjaC4gSGUgaWRlbnRpZmllZCBhCiAgcHJvYmxlbSB3aGVuIHVzaW5nIE5UTE0gb3ZlciBhIHByb3h5IGJ1dCB0aGUgZW5kLXBvaW50IGRvZXMgQmFzaWMsIGFuZCB0aGVuCiAgbGliY3VybCB3b3VsZCBkbyB3cm9uZyB3aGVuIHRoZSBob3N0IHNlbnQgIkNvbm5lY3Rpb246IGNsb3NlIiBhcyB0aGUgcHJveHkncwogIE5UTE0gc3RhdGUgd2FzIGVycm9uZW91c2x5IGNsZWFyZWQuCgpZYW5nIFRzZSAoMTEgQXVnIDIwMDgpCi0gQWRkZWQgbWlzc2luZyBzaWduZWQgYW5kIHVuc2lnbmVkIGN1cmxfb2ZmX3QgaW50ZWdlciBjb25zdGFudCBzdWZmaXhlcyBmb3IKICBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgdXNlLiBDVVJMX1NVRkZJWF9DVVJMX09GRl9ULCBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVS4KCkRhbmllbCBGYW5kcmljaCAoNyBBdWcgMjAwOCkKLSBGaXhlZCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGluIG11bHRpX3J1bnNpbmdsZSgpIHRoYXQgY291bGQgY2F1c2UgYQogIHJlcXVlc3QgdG8gcHJlbWF0dXJlbHkgZW5kLgoKLSBBZGRlZCB0ZXN0MTA1OSB0byB0ZXN0IHRoZSBGVFAgcHJveHkgdHVubmVsIHByb2JsZW0gZml4ZWQgSnVseSAxMS4KCllhbmcgVHNlICg3IEF1ZyAyMDA4KQotIEFkZGVkIGN1cmxidWlsZC5oIGFuZCBjdXJscnVsZXMuaCBoZWFkZXIgZmlsZXMgdG8gbGliY3VybCdzIHB1YmxpYyBoZWFkZXJzLgogIEZpbGUgY3VybGJ1aWxkLmggaXMgYSBnZW5lcmF0ZWQgZmlsZSBvbiBjb25maWd1cmUtY2FwYWJsZSBzeXN0ZW1zLiBUaGlzIGlzCiAgYSBmaXJzdCBzdGVwIHRvd2FyZHMgY29uZmlndXJlLWJhc2VkIGluZm8gaW4gcHVibGljIGhlYWRlcnMuIEN1cnJlbnRseSBvbmx5CiAgdXNlZCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIGEgY3VybF9vZmZfdCBkYXRhIHR5cGUgd2hpY2ggaXMgbm90IGdhdGVkIHRvCiAgb2ZmX3QuIEZ1cnRoZXIgZGV0YWlscyBhcmUgZG9jdW1lbnRlZCBpbnNpZGUgdGhlc2UgbWVudGlvbmVkIGhlYWRlciBmaWxlcy4KCi0gRml4IENVUkxfQ0hFQ0tfREVGIHNvIHRoYXQgd2hlbiB0aGUgZXhwYW5zaW9uIG9mIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sCiAgcmVzdWx0cyBpbiBhIHNldCBvZiBkb3VibGUtcXVvdGVkIHN0cmluZ3MsIHRoaXMgbWFjcm8gd2lsbCBub3cgcmV0dXJuIGFuCiAgZXhwYW5zaW9uIHdoaWNoIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGRvdWJsZS1xdW90ZWQgc3RyaW5nIGFzIHRoZSByZXN1bHQgb2YKICBjb25jYXRlbmF0aW5nIGFsbCBvZiB0aGVtLgoKLSBTa2lwIGRhdGEgdHlwZSBjaGVjayBpbiBET19DVVJMX09GRl9UX0NIRUNLIG1hY3JvIHdoZW4gYXJndW1lbnQgaXMgZW1wdHkuCgotIEFkanVzdGVkIHRlc3RjdXJsLnBsIHRvIGNvcHkgY2hlY2tlZCBvdXQgY3VybGJ1aWxkLmguZGlzdCBhcyBjdXJsYnVpbGQuaAogIGZvciBub24tY29uZmlndXJlIHRhcmdldHMgd2hlbiB0aGUgaG9zdCBzeXN0ZW0gZG9lc24ndCBydW4gYnVpbGRjb25mLmJhdC4KCi0gUHJldmVudCBidWlsZGNvbmYgZnJvbSByZW1vdmluZyAnTWFrZWZpbGUnIGFuZCAnbWlzc2luZycgZmlsZXMuIFRoaXMgd291bGQKICBibG93IGF3YXkgb3VyIENWUyBjaGVja2VkIGZpbGVzICdtaXNzaW5nJyBhbmQgJ2hpcGVyL01ha2VmaWxlJy4KCi0gUmVtb3ZlIGFkanVzdG1lbnQgZG9uZSB0byB0ZXN0Y3VybC5wbCB0byB2ZXJpZnkgaWYgY2hhbmdlIGludHJvZHVjZWQgYnkKICBHdWVudGVyIEtuYXVmIGluIGxpYi9NYWtlZmlsZS5uZXR3YXJlIGlzIGVub3VnaCB0byBnZXQgdGhlIG5ldHdhcmUgYXV0b2J1aWxkcwogIGdvaW5nIGFnYWluLgoKWWFuZyBUc2UgKDUgQXVnIDIwMDgpCi0gQ2hhbmdlcyBkb25lIHRvIGJ1aWxkY29uZiBzY3JpcHQuIFZhbGlkYXRlIHRoYXQgYXV0b200dGUgYW5kIGF1dG9jb25mLCBhcwogIHdlbGwgYXMgYWNsb2NhbCBhbmQgYXV0b21ha2UsIHZlcnNpb25zIG1hdGNoLiBJbXByb3ZlIHJlbW92YWwgb2YgcHJldmlvdXMKICBydW4gZ2VuZXJhdGVkIGZpbGVzLiBSZW1vdmUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIG9mIGFjbG9jYWwgb24gU29sYXJpcy4KCkRhbmllbCBTdGVuYmVyZyAoNSBBdWcgMjAwOCkKLSBZZWhvc2h1YSBIZXJzaGJlcmcgZm91bmQgYSBwcm9ibGVtIHRoYXQgd291bGQgbWFrZSBsaWJjdXJsIHJlLXVzZSBhCiAgY29ubmVjdGlvbiB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgZXZlbiBpZiBhIHByZXZpb3VzIHVzZSBvZiBpdCBjYXVzZWQgYQogIENVUkxFX1BFRVJfRkFJTEVEX1ZFUklGSUNBVElPTiB0byBnZXQgcmV0dXJuZWQuIEkgbm93IG1ha2Ugc3VyZSB0aGF0IGZhaWxlZAogIFNTTCBjb25uZWN0aW9ucyBwcm9wZXJseSBjbG9zZSB0aGUgY29ubmVjdGlvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDQgQXVnIDIwMDgpCi0gVGVzdCBjYXNlcyAxMDUxLCAxMDUyIGFuZCAxMDU1IHdlcmUgYWRkZWQgYnkgRGFuaWVsIEZhbmRyaWNoIG9uIEp1bHkgMzAgYW5kCiAgcHJvdmVkIGhvdyBQVVQgYW5kIFBPU1Qgd2l0aCBhIHJlZGlyZWN0IGNvdWxkIGxlYWQgdG8gYSAiaGFuZyIgZHVlIHRvIHRoZQogIGRhdGEgc3RyZWFtIG5vdCBiZWluZyByZXdvdW5kIHByb3Blcmx5IHdoZW4gaXQgaGFkIHRvIGluIG9yZGVyIHRvIGdldCBzZW50CiAgcHJvcGVybHkgKGFnYWluKSB0byB0aGUgc3Vic2VxdWVudCBVUkwuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0aGVzZSB0ZXN0CiAgY2FzZXMgYXJlIG5vIGxvbmdlciBkaXNhYmxlZC4KCllhbmcgVHNlICg0IEF1ZyAyMDA4KQotIEF1dG9jb25mIDIuNjIgaGFzIGNoYW5nZWQgdGhlIGJlaGF2aW91ciBvZiB0aGUgQUNfQUlYIG1hY3JvIHdoaWNoIHdlIHVzZS4KICBQcmlvciB2ZXJzaW9ucyBvZiBhdXRvY29uZiBkZWZpbmVkIF9BTExfU09VUkNFIGlmIF9BSVggd2FzIGRlZmluZWQuIDIuNjIKICB2ZXJzaW9uIG9mIEFDX0FJWCBkZWZpbmVzIF9BTExfU09VUkNFIGFuZCBvdGhlciBmb3VyIHByZXByb2Nlc3NvciBzeW1ib2xzCiAgbm8gbWF0dGVyIGlmIHRoZSBzeXN0ZW0gaXMgQUlYIG9yIG5vdC4gVG8ga2VlcCB0aGUgdHJhZGl0aW9uYWwgYmVoYXZpb3VyLAogIGFuZCBhbiB1bmlmb3JtIG9uZSBhY3Jvc3MgYXV0b2NvbmYgdmVyc2lvbnMgQUNfQUlYIGlzIHJlcGxhY2VkIHdpdGggb3VyCiAgb3duIGludGVybmFsIG1hY3JvIENVUkxfQ0hFQ0tfQUlYX0FMTF9TT1VSQ0UuCgpEYW5pZWwgU3RlbmJlcmcgKDQgQXVnIDIwMDgpCi0gVGVzdCBjYXNlIDEwNDEgKGFkZGVkIGJ5IERhbmllbCBGYW5kcmljaCBKdWx5IDE0dGgpIHByb3ZlZCBhIGJ1ZyB3aGVyZSBQVVQKICB3aXRoIC1DIC0gc2VudCBnYXJiYWdlIGluIHRoZSBDb250ZW50LVJhbmdlOiBoZWFkZXIuIEkgZml4ZWQgdGhpcyBwcm9ibGVtIGJ5CiAgbWFraW5nIHN1cmUgbGliY3VybCBhbHdheXMgc2V0cyB0aGUgc2l6ZSBvZiB0aGUgX2VudGlyZV8gdXBsb2FkIGlmIGFuIGFwcAogIGF0dGVtcHMgdG8gZG8gcmVzdW1lZCB1cGxvYWRzIHNpbmNlIGxpYmN1cmwgc2ltcGx5IGNhbm5vdCBrbm93IHRoZSBzaXplIG9mCiAgd2hhdCBpcyBjdXJyZW50bHkgYXQgdGhlIHNlcnZlciBlbmQuIFRlc3QgMTA0MSBpcyBubyBsb25nZXIgZGlzYWJsZWQuCgpZYW5nIFRzZSAoMiBBdWcgMjAwOCkKLSBObyBsb25nZXIgdGVzdCBhdmFpbGFiaWxpdHkgb2YgdGhlIGdkaTMyIGxpYnJhcnksIG5vciB1c2UgaXQgZm9yIGxpbmtpbmcsIGV2ZW4KICB3aGVuIHdlIGhhdmUgYmVlbiBkb2luZyB0aGlzIHNpbmNlIHJldmlzaW9uIDEuNDcgb2YgY29uZmlndXJlLmFjIDQgeWVhcnMgYW5kCiAgNSBtb250aHMgYWdvIHdoZW4gY3Jvc3MtY29tcGlsaW5nIGEgV2luZG93cyB0YXJnZXQuIFdlIGFjdHVhbGx5IGRvbid0IHVzZSBhbnkKICBmdW5jdGlvbiBmcm9tIHRoZSBXaW5kb3dzIEdESSAoR3JhcGhpY3MgRGV2aWNlIEludGVyZmFjZSkgcmVsYXRlZCB3aXRoIGRyYXdpbmcKICBvciBncmFwaGljcy1yZWxhdGVkIG9wZXJhdGlvbnMuCgpEYW5pZWwgRmFuZHJpY2ggKDEgQXVnIDIwMDgpCi0gQWRkZWQgc3VwcG9ydCBmb3IgLS1hcHBlbmQgb24gU0ZUUCB1cGxvYWRzLiBVbmZvcnR1bmF0ZWx5LCBPcGVuU1NIIGRvZXNuJ3QKICBzdXBwb3J0IHRoaXMgc28gaXQgZ29lcyB1bnRlc3RlZC4KCllhbmcgVHNlICgxIEF1ZyAyMDA4KQotIENvbmZpZ3VyZSBwcm9jZXNzIG5vdyBjaGVja3MgaWYgdGhlIHByZXByb2Nlc3NvciBfUkVFTlRSQU5UIHN5bWJvbCBpcyBhbHJlYWR5CiAgZGVmaW5lZC4gSWYgaXQgaXNuJ3QgY3VycmVudGx5IGRlZmluZWQgYSBzZXQgb2YgY2hlY2tzIGFyZSBwZXJmb3JtZWQgdG8gdGVzdAogIGlmIGl0cyBkZWZpbml0aW9uIGlzIHJlcXVpcmVkIHRvIG1ha2UgdmlzaWJsZSB0byB0aGUgY29tcGlsZXIgYSBzZXQgb2YgKl9yCiAgZnVuY3Rpb25zLiBGaW5hbGx5LCBpZiBfUkVFTlRSQU5UIGlzIGFscmVhZHkgZGVmaW5lZCBvciBuZWVkZWQgaXQgdGFrZXMgY2FyZQogIG9mIG1ha2luZyBhZGp1c3RtZW50cyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgaXQgaXMgZGVmaW5lZCBlcXVhbGx5IGZvciB0aGUKICBjb25maWd1cmUgcHJvY2VzcyB0ZXN0cyBhbmQgZ2VuZXJhdGVkIGNvbmZpZyBmaWxlLgoKLSBSZW1vdmVkIGRlZmluaXRpb24gb2YgQ1VSTF9DSEVDS19XT1JLSU5HX1JFU09MVkVSIGZyb20gYWNpbmNsdWRlLm00IGl0IGhhcwogIG5vdCBiZWVuIGluIHVzZSBzaW5jZSByZXZpc2lvbiAxLjgxIG9mIGNvbmZpZ3VyZS5pbiA2IHllYXJzLCA5IG1vbnRocyBhZ28uCgpEYW5pZWwgRmFuZHJpY2ggKDMxIEp1bCAyMDA4KQotIEZpeGVkIHBhcnNpbmcgb2YgYW4gSVB2NiBwcm94eSBhZGRyZXNzIHRvIHN1cHBvcnQgYSBzY29wZSBpZGVudGlmaWVyLAogIGFzIHdlbGwgYXMgSVB2NCBhZGRyZXNzZXMgaW4gSVB2NiBmb3JtYXQuIEFsc28sIGJldHRlciBoYW5kbGUgdGhlIGNhc2UKICBvZiBhIG1hbGZvcm1hdHRlZCBJUHY2IGFkZHJlc3MgKGF2b2lkIGVtcHR5IGFuZCBOVUxMIHN0cmluZ3MpLgoKLSBGaXhlZCBhIHByb2JsZW0gd2l0aCBhbnkgRlRQIFVSTCBvciBhbnkgVVJMcyBjb250YWluaW5nIGFuIElQdjYgYWRkcmVzcwogIGJlaW5nIG1hbmdsZWQgd2hlbiBwYXNzZWQgdG8gcHJveGllcyB3aGVuIENVUkxPUFRfUE9SVCBpcyBhbHNvIHNldAogIChyZXBvcnRlZCBieSBQcmFtb2QgU2hhcm1hKS4KCi0gVXNlciBuYW1lcyBlbWJlZGRlZCBpbiBwcm94eSBVUkxzIHdpdGhvdXQgYSBwYXNzd29yZCB3ZXJlIHBhcnNlZAogIGluY29ycmVjdGx5LS10aGUgaG9zdCBuYW1lIGlzIHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgdXNlciBuYW1lIGFuZCB0aGUKICBwb3J0IG51bWJlciBiZWNvbWVzIHRoZSBwYXNzd29yZC4gIFRoaXMgY2FuIGJlIG9ic2VydmVkIGluIHRlc3QgMjc5CiAgKHdhcyBLTk9XTl9JU1NVRSAjNTQpLgoKRGFuaWVsIFN0ZW5iZXJnICgzMCBKdWwgMjAwOCkKLSBQaGlsIEJsdW5kZWxsIGFkZGVkIHRoZSBDVVJMT1BUX0FERFJFU1NfU0NPUEUgb3B0aW9uLCBhcyB3ZWxsIGFzIGFkanVzdGVkCiAgdGhlIFVSTCBwYXJzZXIgdG8gYWxsb3cgbnVtZXJpY2FsIElQdjYtYWRkcmVzc2VzIHRvIGJlIHNwZWNpZmllZCB3aXRoIHRoZQogIHNjb3BlIGdpdmVuLCBhcyBwZXIgUkZDNDAwNyAtIHdpdGggYSBwZXJjZW50IGxldHRlciB0aGF0IGl0c2VsZiBuZWVkcyB0byBiZQogIFVSTCBlc2NhcGVkLiBGb3IgZXhhbXBsZSwgZm9yIGFuIGFkZHJlc3Mgb2YgZmU4MDo6MTIzNCUxIHRoZSBIVFRQIFVSTCBpczoKICAiaHR0cDovL1tmZTgwOjoxMjM0JTI1MV0vIgoKLSBQSFAncyBidWcgcmVwb3J0ICM0MzE1OCAoaHR0cDovL2J1Z3MucGhwLm5ldC9idWcucGhwP2lkPTQzMTU4KSBpZGVudGlmaWVzIGEKICB0cnVlIGJ1ZyBpbiBsaWJjdXJsIGJ1aWx0IHdpdGggT3BlblNTTC4gSXQgbWFkZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIG1vcmUgb3IKICBsZXNzIGFsd2F5cyByZXR1cm4gMCBmb3IgQ1VSTElORk9fU1NMX1ZFUklGWVJFU1VMVCBiZWNhdXNlIHRoZSBmdW5jdGlvbiB0aGF0CiAgd291bGQgc2V0IGl0IHRvIHNvbWV0aGluZyBub24temVybyB3b3VsZCByZXR1cm4gYmVmb3JlIHRoZSBhc3NpZ24gaW4gYWxtb3N0CiAgYWxsIGVycm9yIGNhc2VzLiBUaGUgaW50ZXJuYWwgdmFyaWFibGUgaXMgbm93IHNldCB0byBub24temVybyBmcm9tIHRoZSBzdGFydAogIG9mIHRoZSBmdW5jdGlvbiBvbmx5IHRvIGdldCBjbGVhcmVkIGxhdGVyIG9uIGlmIHRoaW5ncyB3b3JrIG91dCBmaW5lLgoKLSBNYWRlIHRoZSBjdXJsIHRvb2wncyAtdyBvcHRpb24gc3VwcG9ydCB0aGUgJXtzc2xfdmVyaWZ5X3Jlc3VsdH0gdmFyaWFibGUKCkRhbmllbCBGYW5kcmljaCAoMzAgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDUyIHRocm91Z2ggMTA1NSB0byB0ZXN0IHVwbG9hZGluZyBkYXRhIGZyb20gZmlsZXMKICBkdXJpbmcgcmVkaXJlY3RzLiAgVGVzdCBjYXNlcyAxMDUyIGFuZCAxMDU1IHNob3cgcHJvYmxlbXMgKG1heWJlIHRoZSBzYW1lCiAgcm9vdCBjYXVzZSBhcyAxMDUxKSBhbmQgYXJlIGRpc2FibGVkLgoKLSBGaXhlZCBhIGNvdXBsZSBvZiBidWZmZXIgb3ZlcmZsb3dzIGluIHRoZSBNUy1ET1MgcG9ydCBvZiB0aGUgY3VybCB0b29sLgoKRGFuaWVsIEZhbmRyaWNoICgyOSBKdWwgMjAwOCkKLSBGaXhlZCAtLXVzZS1hc2NpaSB0byBwcm9wZXJseSBjb252ZXJ0IHRleHQgZmlsZXMgb24gU3ltYmlhbiBPUywgTVMtRE9TCiAgYW5kIE9TLzIuCgotIEFkZGVkIHRlc3QgY2FzZSAxMDUxIHRvIHRlc3QgTG9jYXRpb246IGZvbGxvd2luZyB3aXRoIFBVVCwgYXMgcmVwb3J0ZWQKICBieSBCZW4gU3V0Y2xpZmZlLiAgVGhlIHRlc3Qgd2hlbiBydW4gbWFudWFsbHkgc2hvd3MgYSBwcm9ibGVtIGluIGN1cmwKICBzbyBpdCdzIGRpc2FibGVkLgoKRGFuaWVsIEZhbmRyaWNoICgyOCBKdWwgMjAwOCkKLSBGaXhlZCBkaXNwbGF5IG9mIHRoZSBpbnRlcmZhY2UgYmluZCBhZGRyZXNzIGluIHRoZSB0cmFjZSBvdXRwdXQgd2hlbiBpdCdzCiAgYW4gSVB2NiBhZGRyZXNzLgoKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwNDUgdGhyb3VnaCAxMDQ5IGFzIHNpbXBsZSB0ZXN0cyBvZiAtLWludGVyZmFjZSB1c2luZyB0aGUKICBsb2NhbGhvc3QgaW50ZXJmYWNlLgoKLSBBZGRlZCB0ZXN0IGNhc2UgMTA1MCB0byB0ZXN0IC0tZnRwLXBvcnQgd2l0aCBhbiBJUHY2IGFkZHJlc3MKCkRhbmllbCBTdGVuYmVyZyAoMjYgSnVsIDIwMDgpCi0gRGF2aWQgQmF1IGZpbGVkIGJ1ZyByZXBvcnQgIzIwMjYyNDAgIkNVUkxfUkVBREZVTkNfUEFVU0UgbGVhZHMgdG8gYnVmZmVyCiAgb3ZlcnJ1biIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIwMjYyNDApIGlkZW50aWZ5aW5nIHR3bwogIHByb2JsZW1zLCBhbmQgcHJvdmlkaW5nIHRoZSBmaXggZm9yIHRoZW06CgogIC0gQ1VSTF9SRUFERlVOQ19QQVVTRSBkaWQgaW4gZmFjdCBub3QgcGF1c2UgdGhlIF9zZW5kaW5nXyBvZiBkYXRhIHRoYXQgaXQgaXMKICAgIGRlc2lnbmVkIGZvciBidXQgcGF1c2VkIF9yZWNlaXZpbmdfIG9mIGRhdGEhCgogIC0gbGliY3VybCBkaWRuJ3QgaW50ZXJuYWxseSBzZXQgdGhlIHJlYWQgY291bnRlciB0byB6ZXJvIHdoZW4gdGhpcyByZXR1cm4KICAgIGNvZGUgd2FzIGRldGVjdGVkLCB3aGljaCB3b3VsZCBwb3RlbnRpYWxseSBsZWFkIHRvIGp1bmsgZ2V0dGluZyBzZW50IHRvCiAgICB0aGUgc2VydmVyLgoKRGFuaWVsIEZhbmRyaWNoICgyNiBKdWwgMjAwOCkKLSBBZGRlZCB0ZXN0IDEwNDQgdG8gdGVzdCBsYXJnZSBmaWxlIHN1cHBvcnQgaW4gZnRwIHdpdGggLUkuCgotIEVsaW1pbmF0ZSBhIHVubmVjZXNzYXJ5IHNvY2tldCBjcmVhdGlvbiBpbiBDdXJsX2dldGFkZHJpbmZvIGZvciBhbiBJUHY0CiAgYWRkcmVzcyBpbiBhbiBJUHY2IGNhcGFibGUgbGliY3VybC4KCi0gQWRkZWQgZmVhdHVyZSBpbiBydW50ZXN0cy5wbCB0byBzZWxlY3QgdGVzdHMgYmFzZWQgb24ga2V5IHdvcmQuCgpEYW5pZWwgRmFuZHJpY2ggKDIzIEp1bCAyMDA4KQotIENoYW5nZWQgdGhlIGxvbmcgbG9nZmlsZSBlbGlzaW9uIGNvZGUgaW4gcnVudGVzdHMucGwgdG8gcHJvcGVybHkgaGFuZGxlCiAgbGluZXMgZW5kaW5nIGluIFxyLgoKLSBDaGFuZ2VkIHJlZmVyZW5jZXMgdG8gVFJVRSBhbmQgRkFMU0UgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2UgdG8KICAxIGFuZCB6ZXJvLCByZXNwZWN0aXZlbHksIHNpbmNlIFRSVUUgYW5kIEZBTFNFIGFyZW4ndCBwYXJ0IG9mIHRoZQogIGxpYmN1cmwgQVBJLgoKRGFuaWVsIFN0ZW5iZXJnICgyMyBKdWwgMjAwOCkKLSBJIHdlbnQgb3ZlciB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSBhbmQgcmVwbGFjZWQgbW9zdCByZWZlcmVuY2VzIHRvCiAgbm9uLXplcm8gd2l0aCB0aGUgZml4ZWQgdmFsdWUgb2YgMS4gV2Ugc2hvdWxkIHN0cml2ZSBhdCBtYWtpbmcgb3B0aW9ucwogIHN1cHBvcnQgJzEnIGZvciBlbmFibGluZyB0aGVtIG1lbnRpb25lZCBleHBsaWNpdGx5LCBhcyB0aGF0IHRoZW4gd2lsbCBhbGxvdwogIHVzIGZvciB0byBleHRlbmQgdGhlbSBpbiB0aGUgZnV0dXJlIHdpdGhvdXQgYnJlYWtpbmcgb2xkZXIgcHJvZ3JhbXMuCgogIFBvc3NpYmx5IHdlIHNob3VsZCBldmVuIGludHJvZHVjZSBhIGZhbmN5IGRlZmluZSB0byB1c2UgaW5zdGVhZCBvZiAnMScgYWxsCiAgb3Zlci4uLgoKWWFuZyBUc2UgKDIxIEp1bCAyMDA4KQotIFVzZSB0aGUgc3JlYWRmcm9tKCkgd3JhcHBlciB0byByZXBsYWNlIHJlY3Zmcm9tKCkgaW4gb3VyIGNvZGUuCgpZYW5nIFRzZSAoMjAgSnVsIDIwMDgpCi0gd2hlbiByZWN2ZnJvbSBwcm90b3R5cGUgdXNlcyBhIHZvaWQgcG9pbnRlciBmb3IgYXJndW1lbnRzIDIsIDUgb3IgNiB0aGlzIHdpbGwKICBub3cgY2F1c2UgdGhlIGRlZmluaXRpb24sIGFzIGFwcHJvcHJpYXRlLCBvZiBSRUNWRlJPTV9UWVBFX0FSRzJfSVNfVk9JRCwKICBSRUNWRlJPTV9UWVBFX0FSRzVfSVNfVk9JRCBvciBSRUNWRlJPTV9UWVBFX0FSRzZfSVNfVk9JRC4KCllhbmcgVHNlICgxNyBKdWwgMjAwOCkKLSBSRUNWRlJPTV9UWVBFX0FSRzIsIFJFQ1ZGUk9NX1RZUEVfQVJHNSBhbmQgUkVDVkZST01fVFlQRV9BUkc2IGFyZSBub3cgZGVmaW5lZAogIHRvIHRoZSBkYXRhIHR5cGUgcG9pbnRlZCBieSBpdHMgcmVzcGVjdGl2ZSBhcmd1bWVudCBhbmQgbm90IHRoZSBwb2ludGVyIHR5cGUuCgpZYW5nIFRzZSAoMTYgSnVsIDIwMDgpCi0gQ29uZmlndXJlIHByb2Nlc3Mgbm93IGNoZWNrcyBhdmFpbGFiaWxpdHkgb2YgcmVjdmZyb20oKSBzb2NrZXQgZnVuY3Rpb24gYW5kCiAgZmluZHMgb3V0IGl0cyByZXR1cm4gdHlwZSBhbmQgdGhlIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIEFkZGVkIGRlZmluaXRpb25zCiAgZm9yIG5vbi1jb25maWd1cmUgc3lzdGVtcyBjb25maWcgZmlsZXMsIGFuZCBpbnRyb2R1Y2VkIG1hY3JvIHNyZWFkZnJvbSB3aGljaAogIHdpbGwgYmUgdXNlZCBvbiB1ZHAgc29ja2V0cyBhcyBhIHJlY3Zmcm9tKCkgd3JhcHBlci4KCllhbmcgVHNlICgxNSBKdWwgMjAwOCkKLSBBZGRlZCBkZXNjcmlwdGlvbi9jb21tZW50IHRvIGluY2x1ZGUgcGF0aHMgdXNlZCBpbiBzZXZlcmFsIE1ha2VmaWxlLmFtIGZpbGVzLgogIEFkZGVkIGF1dG9tYWtlIG9wdGlvbiBub3N0ZGluYyB0byB0ZXN0IHNlcnZlcnMgbWFrZWZpbGUgYW5kIG1vZGlmaWVkIGxpYmN1cmwKICBleHRlcm5hbCBoZWFkZXJzIGluY2x1ZGUgcGF0aCBmb3IgbGlidGVzdCBwcm9ncmFtcy4KCkRhbmllbCBGYW5kcmljaCAoMTQgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdDEwNDAgdGhyb3VnaCB0ZXN0MTA0MyB0byB0ZXN0IC1DIC0gb24gSFRUUC4gVGVzdCAxMDQxIGZhaWxlZCBzbwogIGl0J3MgYWRkZWQgdG8gRElTQUJMRUQuCgpZYW5nIFRzZSAoMTQgSnVsIDIwMDgpCi0gSFRUUF9PTkxZIGRlZmluaXRpb24gY2hlY2sgaW4gbGliL3NldHVwLmggaXMgbm93IGRvbmUgb25jZSB0aGF0IGNvbmZpZ3VyYXRpb24KICBmaWxlIGhhcyBiZWVuIGluY2x1ZGVkLiBJbiB0aGlzIHdheSBpZiBzeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGUgY29uZmlnIGZpbGUKICBpdCB3aWxsIG5vIGxvbmdlciBiZSBpZ25vcmVkLiAgUmVtb3ZlZCBpbmNsdXNpb24gb2YgcmVtYWluaW5nIHN5c3RlbSBoZWFkZXIKICBmaWxlcyBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZXMuIE1vdmVkIF9SRUVOVFJBTlQgZGVmaW5pdGlvbiB1cC9lYXJsaWVyIGluCiAgbGliL3NldHVwLmgKCllhbmcgVHNlICgxMSBKdWwgMjAwOCkKLSBBZGRlZCBtaXNzaW5nIG11bHRpcGxlIGhlYWRlciBpbmNsdXNpb24gcHJldmVudGlvbiBkZWZpbml0aW9uIGZvciBoZWFkZXIKICBmaWxlIGNvbnRlbnRfZW5jb2RpbmcuaAoKRGFuaWVsIEZhbmRyaWNoICgxMSBKdWwgMjAwOCkKLSBGaXhlZCB0ZXN0IDU1MyB0byBwYXNzIHRoZSB0b3J0dXJlIHRlc3QuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEp1bCAyMDA4KQotIERhbmllbCBGYW5kcmljaCBmb3VuZCBvdXQgd2UgZGlkbid0IHBhc3Mgb24gdGhlIHVzZXItYWdlbnQgcHJvcGVybHkgd2hlbgogIGRvaW5nICJwcm94eS10dW5uZWxzIiB3aXRoIG5vbi1IVFRQIHByb3RvdG9scyBhbmQgdGhhdCB3YXMgc2ltcGx5IGJlY2F1c2UKICB0aGUgY29kZSBhc3N1bWVkIHRoZSB1c2VyLWFnZW50IHdhcyBvbmx5IG5lZWRlZCBmb3IgSFRUUC4KCkRhbmllbCBGYW5kcmljaCAoMTAgSnVsIDIwMDgpCi0gQ2hhbmdlZCBzbGlnaHRseSB0aGUgU0ZUUCBxdW90ZSBjb21tYW5kcyBjaG1vZCwgY2hvd24gYW5kIGNoZ3JwIHRvIG9ubHkKICBzZXQgdGhlIGF0dHJpYnV0ZSB0aGF0IGhhcyBjaGFuZ2VkIGluc3RlYWQgb2YgYWxsIHBvc3NpYmxlIG9uZXMuIEhvcGVmdWxseSwKICB0aGlzIHdpbGwgc29sdmUgdGhlICJQZXJtaXNzaW9uIGRlbmllZCIgcHJvYmxlbSB0aGF0IE5hZ2FyYWphbiBTcmVlbml2YXNhbgogIHJlcG9ydGVkIHdoZW4gc2V0dGluZyBzb21lIG1vZGVzLCBidXQgcmVnYXJkbGVzcywgaXQgc2F2ZXMgYSBwcm90b2NvbAogIHJvdW5kIHRyaXAgaW4gdGhlIGNobW9kIGNhc2UuCgotIEFkZGVkIHRlc3QgY2FzZXMgMTAzOCBhbmQgMTAzOSB0byB0ZXN0IEFkcmlhbiBLcmVoZXIncyByZXBvcnQgdGhhdCBmdHAKICB1cGxvYWRzIHdpdGggLUMgLSBkaWRuJ3QgcmVzdW1lIHByb3Blcmx5LCBidXQgdGhlIHRlc3RzIHBhc3MuCgpZYW5nIFRzZSAoMTAgSnVsIDIwMDgpCi0gUGV0ZXIgTGFtYmVyZyBmaWxlZCBidWcgcmVwb3J0ICMyMDE1MTI2OiAicG9sbCBnaXZlcyBXU0FFSU5WQUwgd2hlbiBQT0xMUFJJCiAgaXMgc2V0IGluIGZkc2V0LmV2ZW50cyIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIwMTUxMjYpIHdoaWNoCiAgZXhhY3RseSBwaW5wb2ludGVkIHRoZSBwcm9ibGVtIG9ubHkgdHJpZ2dlcmVkIG9uIFdpbmRvd3MgVmlzdGEsIHByb3ZpZGVkCiAgcmVmZXJlbmNlIHRvIGRvY3MgYW5kIGFsc28gYSBmaXguIFRoZXJlIGlzIG11Y2ggd29yayBiZWhpbmQgUGV0ZXIgTGFtYmVyZydzCiAgZXhjZWxsZW50IGJ1ZyByZXBvcnQuIFRoYW5rIFlvdSEKCkRhbmllbCBGYW5kcmljaCAoOSBKdWwgMjAwOCkKLSBBZGRlZCB0ZXN0cyAxMDM2IGFuZCAxMDM3IHRvIHZlcmlmeSByZXN1bWVkIGZ0cCBkb3dubG9hZHMgd2l0aCAtQyAtCgpEYW5pZWwgU3RlbmJlcmcgKDkgSnVsIDIwMDgpCi0gQW5kcmVhcyBTY2h1bGRlaSBpbXByb3ZlZCBQaGlsIEJsdW5kZWxsJ3MgcGF0Y2ggZm9yIElQdjYgdXNpbmcgYy1hcmVzLCBhbmQgSQogIGVkaXRlZCBpdCBzbGlnaHRseS4gTm93IHlvdSBzaG91bGQgYmUgYWJsZSB0byB1c2UgSVB2NiBhZGRyZXNzZXMgZmluZSBldmVuCiAgd2l0aCBsaWJjdXJsIGJ1aWx0IHRvIHVzZSBjLWFyZXMuCgpEYW5pZWwgRmFuZHJpY2ggKDkgSnVsIDIwMDgpCi0gRml4ZWQgYW4gT09NIGhhbmRsaW5nIHByb2JsZW0gdGhhdCBjYXVzZSB0ZXN0IDExIHRvIGZhaWwgdGhlIHRvcnR1cmUgdGVzdC4KCkRhbmllbCBGYW5kcmljaCAoOCBKdWwgMjAwOCkKLSBGaXhlZCB0ZXN0IDU1NCB0byBwYXNzIHRoZSB0b3J0dXJlIHRlc3QuCgpEYW5pZWwgRmFuZHJpY2ggKDcgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDM0ICYgMTAzNSB0byB0ZXN0IElETiBuYW1lIGNvbnZlcnNpb24gZmFpbHVyZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDcgSnVsIDIwMDgpCi0gU2NvdHQgQmFycmV0dCBwcm92aWRlZCBhIHRlc3QgY2FzZSBmb3IgYSBzZWdmYXVsdCBpbiB0aGUgRlRQIGNvZGUgYW5kIHRoZQogIGZpeCBmb3IgaXQuIEl0IG9jY3VyZWQgd2hlbiB5b3UgZGlkIGEgRlRQIHRyYW5zZmVyIHVzaW5nCiAgQ1VSTEZUUE1FVEhPRF9TSU5HTEVDV0QgYW5kIHRoZW4gZGlkIGFub3RoZXIgb25lIG9uIHRoZSBzYW1lIGVhc3kgaGFuZGxlIGJ1dAogIHN3aXRjaGVkIHRvIENVUkxGVFBNRVRIT0RfTk9DV0QuIER1ZSB0byB0aGUgImRpciBkZXB0aCIgdmFyaWFibGUgbm90IGJlaW5nCiAgY2xlYXJlZCBwcm9wZXJseS4gIFNjb3R0J3MgdGVzdCBjYXNlIGlzIG5vdyBrbm93biBhcyB0ZXN0IDUzOSBhbmQgaXQKICB2ZXJpZmllcyB0aGUgZml4LgoKRGFuaWVsIFN0ZW5iZXJnICgzIEp1bCAyMDA4KQotIFBoaWwgQmx1bmRlbGwgcHJvdmlkZWQgYSBmaXggZm9yIGxpYmN1cmwncyB0cmVhdG1lbnQgb2YgdW5leHBlY3RlZCAxeHgKICByZXNwb25zZSBjb2Rlcy4gUHJldmlvdXNseSBsaWJjdXJsIHdvdWxkIGhhbmcgb24gc3VjaCBvY2N1cmFuY2VzLiBJIGFkZGVkCiAgdGVzdCBjYXNlIDEwMzMgdG8gdmVyaWZ5LgoKLSBJbnRyb2N1ZGluZyBhIG5ldyB0aW1lc3RhbXAgZm9yIGN1cmxfZWFzeV9nZXRpbmZvKCk6CiAgQ1VSTElORk9fQVBQQ09OTkVDVF9USU1FLiBUaGlzIGlzIHNldCB3aXRoIHRoZSAiYXBwbGljYXRpb24gbGF5ZXIiCiAgaGFuZHNoYWtlL2Nvbm5lY3Rpb24gaXMgY29tcGxldGVkLiBXaGljaCB0eXBpY2FsbHkgaXMgU1NMLCBUTFMgb3IgU1NIIGFuZCBieQogIHVzaW5nIHRoaXMgeW91IGNhbiBmaWd1cmUgb3V0IHRoZSBhcHBsaWNhdGlvbiBsYXllcidzIG93biBjb25uZWN0IHRpbWUuIFlvdQogIGNhbiBleHRyYWN0IHRoZSB0aW1lIHN0YW1wIHVzaW5nIGN1cmwncyAtdyBvcHRpb24gYW5kIHRoZSBuZXcgdmFyaWFibGUgbmFtZWQKICAndGltZV9hcHBjb25uZWN0Jy4gVGhpcyBmZWF0dXJlIHdhcyBzcG9uc29yZWQgYnkgTGVubnkgUmFjaGl0c2t5IGF0IE5ldVN0YXIuCgpEYW5pZWwgRmFuZHJpY2ggKDIgSnVsIDIwMDgpCi0gU3VwcG9ydCBPcGVuIFdhdGNvbSBDIG9uIExpbnV4IChhcyB3ZWxsIGFzIFdpbmRvd3MpLgoKWWFuZyBUc2UgKDIgSnVsIDIwMDgpCi0gVGhlIHByZXZpb3VzbHkgY29tbWl0dGVkIGZpeCBmb3IgYnVnIHJlcG9ydCAjMTk5OTE4MSBwcmV2ZW50ZWQgdXNpbmcgdGhlCiAgbW9ub3RvbmljIGNsb2NrIG9uIGFueSBzeXN0ZW0gd2l0aG91dCBhbiBhbHdheXMgc3VwcG9ydGVkIFBPU0lYIGNvbXBsaWFudAogIGltcGxlbWVudGF0aW9uLiBOb3cgdGhlIFBPU0lYIGNvbXBsaWFudCBjb25maWd1cmF0aW9uIGNoZWNrIGlzIHJlbW92ZWQgYW5kCiAgd2lsbCBmYWxsYmFjayB0byBnZXR0aW1lb2ZkYXkgd2hlbiB0aGUgbW9ub3RvbmljIGNsb2NrIGlzIHVuYXZhaWxhYmxlIGF0CiAgcnVuLXRpbWUuCgotIFRoZSBjb25maWd1cmUgcHJvY2VzcyB3aWxsIG5vdyBoYWx0IHdoZW4gc2VkLCBncmVwLCBlZ3JlcCBvciBhciBwcm9ncmFtcwogIGNhbiBub3QgYmUgZm91bmQgYW1vbmcgdGhlIGRpcmVjdG9yaWVzIGluIFBBVEggdmFyaWFibGUuCgpEYW5pZWwgU3RlbmJlcmcgKDEgSnVsIDIwMDgpCi0gUm9sbGFuZCBEdWRlbWFpbmUgcHJvdmlkZWQgZml4ZXMgdG8gZ2V0IGxpYmN1cmwgdG8gYnVpbGQgZm9yIHRoZSBJTlRFR1JJVFkKICBvcGVyYXRpbmcgc3lzdGVtLgoKRGFuaWVsIFN0ZW5iZXJnICgzMCBKdW4gMjAwOCkKLSBNYWRlIHRoZSBpbnRlcm5hbCBwcmludGYoKSBzdXBwb3J0ICVsbHUgcHJvcGVybHkgdG8gcHJpbnQgdW5zaWduZWQgbG9uZyBsb25ncy4KCi0gU3RlcGhlbiBDb2xseWVyIGFuZCBUb3IgQXJudHNlbiBoZWxwZWQgaWRlbnRpZnkgYSBmbGF3IGluIHRoZSByYW5nZSBjb2RlCiAgd2hpY2ggb3V0cHV0IHRoZSByYW5nZSB1c2luZyBhIHNpZ25lZCB2YXJpYWJsZSB3aGVyZSBpdCBzaG91bGQgcmF0aGVyIHVzZQogIHVuc2lnbmVkLgoKWWFuZyBUc2UgKDI5IEp1biAyMDA4KQotIEpvaG4gTGlnaHRzZXkgZmlsZWQgYnVnIHJlcG9ydCAjMTk5OTE4MTogIkNMT0NLX01PTk9UT05JQyBhbHdheXMgZmFpbHMgb24KICBzb21lIHN5c3RlbXMiIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTk5MTgxKS4gVGhlIHByb2JsZW0gd2FzCiAgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBkaWQgbm90IHVzZSB0aGUgX1BPU0lYX01PTk9UT05JQ19DTE9DSyBmZWF0dXJlIHRlc3QKICBtYWNybyB3aGVuIGNoZWNraW5nIG1vbm90b25pYyBjbG9jayBhdmFpbGFiaWxpdHkuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0aGUKICBtb25vdG9uaWMgY2xvY2sgd2lsbCBub3QgYmUgdXNlZCB1bmxlc3MgdGhlIGZlYXR1cmUgdGVzdCBtYWNybyBpcyBkZWZpbmVkCiAgd2l0aCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvIGluZGljYXRpbmcgYWx3YXlzIHN1cHBvcnRlZC4KCkRhbmllbCBGYW5kcmljaCAoMjUgSnVuIDIwMDgpCi0gSG9ub3VyIC0tc3RkZXJyIHdpdGggdGhlIC12IG9wdGlvbi4KCi0gRml4ZWQgYSBmaWxlIGhhbmRsZSBsZWFrIGluIHRoZSBjb21tYW5kIGxpbmUgY2xpZW50IGlmIG1vcmUgdGhhbiBvbmUKICAtLXN0ZGVyciBvcHRpb24gd2FzIGdpdmVuLgoKRGFuaWVsIFN0ZW5iZXJnICgyMiBKdW4gMjAwOCkKLSBFZHVhcmQgQmxvY2ggZmlsZWQgdGhlIGRlYmlhbiBidWcgcmVwb3J0ICM0ODc1NjcKICAoaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQ4NzU2NykgcG9pbnRpbmcgb3V0IHRoYXQKICBsaWJjdXJsIHVzZWQgQ29udGVudC1SYW5nZTogaW5zdGVhZCBvZiBSYW5nZSB3aGVuIGRvaW5nIGEgcmFuZ2UgcmVxdWVzdCB3aXRoCiAgLS1oZWFkIChDVVJMT1BUX05PQk9EWSkuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0ZXN0IGNhc2UgMTAzMiB3YXMgYWRkZWQgdG8KICB2ZXJpZnkuCiAgCkRhbmllbCBGYW5kcmljaCAoMjEgSnVuIDIwMDgpCi0gU3RvcHBlZCB1c2luZyByYW5nZXMgaW4gc2NhbmYgY2hhcmFjdGVyIHNlcXVlbmNlcyAoZS5nLiAlW2Etel0pIHNpbmNlIHRoYXQKICBpcyBub3QgQU5TSSBDLCBqdXN0IGEgY29tbW9uIGV4dGVuc2lvbi4gIFRoaXMgY2F1c2VkIHByb2JsZW1zIG9uCiAgYXQgbGVhc3QgT3BlbiBXYXRjb20gQy4KCllhbmcgVHNlICgyMCBKdW4gMjAwOCkKLSBNb2RpZmllZCBjb25maWd1cmF0aW9uIHNjcmlwdCB0byBhY3R1YWxseSB2ZXJpZnkgaWYgdGhlIGNvbXBpbGVyIGlzIGdvb2QKICBlbm91Z2ggYXQgZGV0ZWN0aW5nIGNvbXBpbGF0aW9uIGVycm9ycyBvciBhdCBsZWFzdCBpdCBoYXMgYmVlbiBwcm9wZXJseQogIGNvbmZpZ3VyZWQgdG8gZG8gc28uIENvbmZpZ3VyYXRpb24gaGVhdmlseSBkZXBlbmRzIG9uIHRoaXMgY2FwYWJpbGl0eSwgc28KICBpZiB0aGlzIGNvbXBpbGVyIHNhbml0eSBjaGVjayBmYWlscyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzIHdpbGwgbm93IGZhaWwuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIEp1biAyMDA4KQotIFBoaWwgUGVsbG91Y2hvdWQgZm91bmQgYSBjYXNlIHdoZXJlIGxpYmN1cmwgYnVpbHQgd2l0aCBOU1MgZmFpbGVkIHRvCiAgaGFuZHNoYWtlIHdpdGggYSBTU0x2MiBzZXJ2ZXIsIGFuZCBpdCB0dXJuZWQgb3V0IHRvIGJlIGJlY2F1c2UgaXQgZGlkbid0CiAgcmVjb2duaXplIHRoZSBjaXBoZXIgbmFtZWQgInJjNC1tZDUiLiBJbiBvdXIgbGlzdCB0aGF0IGNpcGhlciB3YXMgbmFtZWQKICBwbGFpbmx5ICJyYzQiLiBJJ3ZlIG5vdyBhZGRlZCByYzQtbWQ1IHRvIHdvcmsgYXMgYW4gYWxpYXMgYXMgUGhpbCByZXBvcnRlZAogIHRoYXQgaXQgbWFkZSB0aGluZ3Mgd29yayBmb3IgaGltIGFnYWluLgoKLSBIYW5zLUp1cmdlbiBNYXkgcG9pbnRlZCBvdXQgdGhhdCB0cnlpbmcgU0NQIG9yIFNGVFAgb3ZlciBhIFNPQ0tTIHByb3h5CiAgY3Jhc2hlZCBsaWJjdXJsLiBUaGlzIGlzIG5vdyBhZGRyZXNzZWQgYnkgbWFraW5nIHN1cmUgd2UgdXNlICJwbGFpbiBzZW5kIgogIGludGVybmFsbHkgd2hlbiBkb2luZyB0aGUgc29ja3MgaGFuZHNoYWtlIGluc3RlYWQgb2YgdGhlIEN1cmxfd3JpdGUoKQogIGZ1bmN0aW9uIHdoaWNoIGlzIGRlc2lnbmVkIHRvIHVzZSB0aGUgInRhcmdldCIgcHJvdG9jb2wuIFRoYXQncyB0aGVuIFNDUCBvcgogIFNGVFAgaW4gdGhpcyBjYXNlLiBJIGFsc28gdG9vayB0aGUgb3Bwb3J0dW5pdHkgYW5kIGNsZWFuZWQgdXAgc29tZSBzc2gtCiAgcmVsYXRlZCAjaWZkZWZzIGluIHRoZSBjb2RlIGZvciByZWFkYWJpbGl0eS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgSnVuIDIwMDgpCi0gQ2hyaXN0b3BoZXIgUGFsb3cgZml4ZWQgYSBjdXJsX211bHRpX3NvY2tldCgpIGlzc3VlIHdoaWNoIHByZXZpb3VzbHkgY2F1c2VkCiAgbGliY3VybCB0byBub3QgdGVsbCB0aGUgYXBwIHByb3Blcmx5IHdoZW4gYSBzb2NrZXQgd2FzIGNsb3NlZCAod2hlbiB0aGUgbmFtZQogIHJlc29sdmUgZG9uZSBieSBjLWFyZXMgaXMgY29tcGxldGVkKSBhbmQgdGhlbiBpbW1lZGlhdGVseSByZS1jcmVhdGVkIGFuZCBwdXQKICB0byB1c2UgYWdhaW4gKGZvciB0aGUgYWN0dWFsIGNvbm5lY3Rpb24pLiBTaW5jZSB0aGUgY2xvc3VyZSB3aWxsIG1ha2UgdGhlCiAgIndhdGNoIHN0YXR1cyIgZ2V0IGxvc3QgaW4gc2V2ZXJhbCBldmVudC1iYXNlZCBzeXN0ZW1zIGxpYmN1cmwgd2lsbCBuZWVkIHRvCiAgdGVsbCB0aGUgYXBwIGFib3V0IHRoaXMgY2xvc2UvcmUtY3JlYXRlIGNhc2UuCgotIERlbmdtaW53ZW4gZm91bmQgYSBidWcgaW4gdGhlIGNvbm5lY3Rpb24gcmUtdXNlIGZ1bmN0aW9uIHdoZW4gdXNpbmcgdGhlCiAgbXVsdGkgaW50ZXJmYWNlIHdpdGggcGlwZWxpbmluZyBlbmFibGVkIGFzIGl0IHdvdWxkIHdyb25nbHkgY2hlY2sgZm9yLAogIGRldGVjdCBhbmQgY2xvc2UgImRlYWQgY29ubmVjdGlvbnMiIGV2ZW4gdGhvdWdoIHRoYXQgY29ubmVjdGlvbiB3YXMgYWxyZWFkeQogIGluIHVzZSEKCkRhbmllbCBGYW5kcmljaCAoMTggSnVuIDIwMDgpCi0gQWRkZWQgU1NIIGZhaWx1cmUgdGVzdCBjYXNlcyA2MjgtNjMyCgotIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGNvbW1hbmQtbGluZSB0b29sIHRoYXQgY2F1c2VkIGEgdmFsZ3JpbmQgZXJyb3IuCgpEYW5pZWwgU3RlbmJlcmcgKDE4IEp1biAyMDA4KQotIFJvYiBDcml0dGVuZGVuIGJyb3VnaHQgYSBmaXggZm9yIHRoZSBOU1MgbGF5ZXIgdGhhdCBtYWtlcyBsaWJjdXJsIG5vIGxvbmdlcgogIGFsd2F5cyBmaXJlIHVwIGEgbmV3IGNvbm5lY3Rpb24gcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGV4aXN0aW5nIG9uZSB3aGVuIHRoZQogIG11bHRpIGludGVyZmFjZSBpcyB1c2VkLiBPcmlnaW5hbCBidWcgcmVwb3J0OgogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDUwMTQwCgpZYW5nIFRzZSAoMTggSnVuIDIwMDgpCi0gSW50ZXJuYWwgY29uZmlndXJlIHNjcmlwdCBpbXByb3ZlbWVudC4gTm8gbG9uZ2VyIGJyZWFrIG91dCBvZiBzaGVsbCAiZm9yIgogIHN0YXRlbWVudHMgZnJvbSBpbnNpZGUgQUNfRk9PX0lGRUxTRSBtYWNyb3MsIG90aGVyd2lzZSB0ZW1wb3JhcnkgbWFjcm8gZmlsZXMKICBhcmUgbm90IHByb3Blcmx5IHJlbW92ZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDEyIEp1biAyMDA4KQotIEZpeGVkIGN1cmwtY29uZmlnIC0tY2Egd2hpY2ggd2Fzbid0IGJlaW5nIGV4cG9ydGVkIGJ5IGNvbmZpZ3VyZS4KCkRhbmllbCBTdGVuYmVyZyAoMTEgSnVuIDIwMDgpCi0gSSBkaWQgYSBjbGVhbnVwIG9mIHRoZSBpbnRlcm5hbCBnZW5lcmljIFNTTCBsYXllciBhbmQgaG93IHRoZSB2YXJpb3VzIFNTTAogIGxpYnJhcmllcyBhcmUgc3VwcG9ydGVkLiBTdGFydGluZyBub3csIGVhY2ggdW5kZXJseWluZyBTU0wgbGlicmFyeSBzdXBwb3J0CiAgY29kZSBkb2VzIGEgc2V0IG9mIGRlZmluZXMgZm9yIHRoZSAxNiBmdW5jdGlvbnMgdGhlIGdlbmVyaWMgbGF5ZXIgKHNzbGdlbi5jKQogIHVzZXMgKGFsbCB0aGVzZSBuZXcgZnVuY3Rpb24gZGVmaW5lcyB1c2UgdGhlIHByZWZpeCAiY3VybHNzbF8iKS4gVGhpcwogIGdyZWF0bHkgc2ltcGxpZmllZCB0aGUgZ2VuZXJpYyBsYXllciBpbiByZWFkYWJpbGl0eSBieSBpbnZvbHZpbmcgbXVjaCBsZXNzCiAgI2lmZGVmcyBhbmQgb3RoZXIgcHJlcHJvY2Vzc29yIHN0dWZmIGFuZCBzaG91bGQgbWFrZSBpdCBlYXNpZXIgZm9yIHBlb3BsZSB0bwogIG1ha2UgbGliY3VybCB3b3JrIHdpdGggbmV3IFNTTCBsaWJyYXJpZXMuCgogIEhvcGVmdWxseSBJIGNhbiBsYXRlciBvbiBkb2N1bWVudCB0aGVzZSAxNiBmdW5jdGlvbnMgc29tZXdoYXQgYXMgd2VsbC4KCiAgSSBhbHNvIG1hZGUgbW9zdCBvZiB0aGUgaW50ZXJuYWwgU1NMLWRlcGVuZGVudCBmdW5jdGlvbnMgKHVzaW5nIEN1cmxfc3NsXwogIHByZWZpeCkgI2RlZmluZWQgdG8gbm90aGluZyB3aGVuIG5vIFNTTCBzdXBwb3J0IGlzIHJlcXVlc3RlZCAtIHByZXZpb3VzbHkKICB0aGV5IHdvdWxkIHVubmVjZXNzYXJpbHkgY2FsbCBtb3N0bHkgZW1wdHkgZnVuY3Rpb25zLgoKICBJJ3ZlIGJ1aWx0IGxpYmN1cmwgd2l0aCBPcGVuU1NMIGFuZCBHbnVUTFMgYW5kIHdpdGhvdXQgU1NMIHRvIHRlc3QgdGhpcyBhbmQKICBJJ3ZlIGFsc28gdHJpZWQgYnVpbGRpbmcgd2l0aCBOU1MgYnV0IHRoZSBOU1Mgc3VwcG9ydCBpcyBhIG15c3RlcnkgdG8gbWUgYW5kCiAgSSBmYWlsZWQgdG8gYnVpbGQgbGliY3VybCB3aXRoIHRoZSBOU1MgbGlicmFyaWVzIEkgaGF2ZSBpbnN0YWxsZWQuIFdlIHJlYWxseQogIHNob3VsZCBBKSBpbXByb3ZlIG91ciBjb25maWd1cmUgc2NyaXB0IHRvIGRldGVjdCB1bnN1aXRhYmxlIE5TUyB2ZXJzaW9ucwogIGFscmVhZHkgYXQgY29uZmlndXJlIHRpbWUgYW5kIEIpIGRvY3VtZW50IG91ciByZXF1aXJlbWVudHMgYmV0dGVyIGZvciB0aGUKICBTU0wgbGlicmFyaWVzLgoKRGFuaWVsIFN0ZW5iZXJnICgxMCBKdW4gMjAwOCkKLSBJIG1hZGUgdGhlIE9wZW5TU0wgY29kZSBidWlsZCBhZ2FpbiB3aXRoIE9wZW5TU0wgMC45LjYuIFRoZSBDUkxGSUxFCiAgZnVuY3Rpb25hbGl0eSBraWxsZWQgaXQgZHVlIHRvIGl0cyB1bmNvbmRpdGlvbmFsIHVzZSBvZgogIFg1MDlfU1RPUkVfc2V0X2ZsYWdzLi4uCgpEYW5pZWwgU3RlbmJlcmcgKDggSnVuIDIwMDgpCi0gRHVlIHRvIHRoZSB0aHJlZSBuZXcgbGliY3VybCBjaGFuZ2VzIGFuZCB0aGUgbWFzc2l2ZSBjb21tYW5kIGxpbmUgb3B0aW9uCiAgY2hhbmdlIEkgZGVjaWRlZCB3ZSdsbCBtYXJrIGl0IGJ5IGJ1bXBpbmcgdGhlIG5leHQgcmVsZWFzZSBudW1iZXIgdG8gNy4xOS4wIQoKLSBjdXJsIHRoZSB0b29sIG5vdyBkZWFscyB3aXRoIGl0cyBjb21tYW5kIGxpbmUgb3B0aW9ucyBzb21ld2hhdCBkaWZmZXJlbnRseSEKICBBbGwgYm9vbGVhbiBvcHRpb25zIChzdWNoIGFzIC1PLCAtSSwgLXYgZXRjKSwgYm90aCBzaG9ydCBhbmQgbG9uZyB2ZXJzaW9ucywKICBub3cgYWx3YXlzIHN3aXRjaCBvbi9lbmFibGUgdGhlIG9wdGlvbiBuYW1lZC4gVXNpbmcgdGhlIHNhbWUgb3B0aW9uIG11bHRpcGxlCiAgdGltZXMgdGh1cyBtYWtlIG5vIGRpZmZlcmVuY2UuIFRvIHN3aXRjaCBvZmYgb25lIG9mIHRob3NlIG9wdGlvbnMsIHlvdSBuZWVkCiAgdG8gdXNlIHRoZSBsb25nIHZlcnNpb24gb2YgdGhlIG9wdGlvbiBhbmQgdHlwZSAtLW5vLU9QVElPTi4gTGlrZSB0byBkaXNhYmxlCiAgdmVyYm9zZSBtb2RlIHlvdSB1c2UgLS1uby12ZXJib3NlIQoKLSBBZGRlZCAtLXJlbW90ZS1uYW1lLWFsbCB0byBjdXJsLCB3aGljaCBpZiB1c2VkIGNoYW5nZXMgdGhlIGRlZmF1bHQgZm9yIGFsbAogIGdpdmVuIFVSTHMgdG8gYmUgZGVhbHQgd2l0aCBhcyBpZiAtTyBpcyB1c2VkLiBTbyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoYXQKICBmb3IgYSBzcGVjaWZpYyBVUkwgYWZ0ZXIgLS1yZW1vdGUtbmFtZS1hbGwgaGFzIGJlZW4gdXNlZCwgeW91IG11c2UgdXNlIC1vIC0KICBvciAtLW5vLXJlbW90ZS1uYW1lLgoKRGFuaWVsIFN0ZW5iZXJnICg2IEp1biAyMDA4KQotIEF4ZWwgVGlsbGVxdWluIGFuZCBBcm5hdWQgRWJhbGFyZCBhZGRlZCBzdXBwb3J0IGZvciBDVVJMT1BUX0lTU1VFUkNFUlQsIGZvcgogIE9wZW5TU0wsIE5TUyBhbmQgR251VExTLWJ1aWx0IGxpYmN1cmxzLgoKLSBBeGVsIFRpbGxlcXVpbiBhbmQgQXJuYXVkIEViYWxhcmQgYWRkZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9DUkxGSUxFLCBmb3IKICBPcGVuU1NMLCBOU1MgYW5kIEdudVRMUy1idWlsdCBsaWJjdXJscy4KCi0gQWRkZWQgQ1VSTElORk9fUFJJTUFSWV9JUCBhcyBhIG5ldyBpbmZvcm1hdGlvbiByZXRyaWV2YWJsZSB3aXRoCiAgY3VybF9lYXN5X2dldGluZm8uIEl0IHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIHdpdGggdGhlIG1vc3QgcmVjZW50bHkKICB1c2VkIElQIGFkZHJlc3MuIE1vZGlmaWVkIHRlc3QgY2FzZSA1MDAgdG8gYWxzbyB2ZXJpZnkgdGhpcyBmZWF0dXJlLiBUaGUKICBpbXBsZW1lbnRpbmcgb2YgdGhpcyBmZWF0dXJlIHdhcyBzcG9uc29yZWQgYnkgTGVubnkgUmFjaGl0c2t5IGF0IE5ldVN0YXIuCgpWZXJzaW9uIDcuMTguMiAoNCBKdW5lIDIwMDgpCgpEYW5pZWwgRmFuZHJpY2ggKDMgSnVuIDIwMDgpCi0gRml4ZWQgYSBwcm9ibGVtIHdoZXJlIHRlbG5ldCBkYXRhIHdvdWxkIGJlIGxvc3QgaWYgYW4gRVdPVUxEQkxPQ0sKICBjb25kaXRpb24gd2VyZSBlbmNvdW50ZXJlZC4KCk1hcnR5IEt1aHJ0ICgxIEp1biAyMDA4KQotIFVwZGF0ZWQgbWFpbi5jIHRvIHJldHVybiBDVVJMRV9PSyBpZiBQQVJBTV9IRUxQX1JFUVVFU1RFRCB3YXMgcmV0dXJuZWQKICBmcm9tIGdldHBhcmFtZXRlciBpbnN0ZWFkIG9mIENVUkxFX0ZBSUxFRF9JTklULiAgTm8gcG9pbnQgaW4gcmV0dXJuaW5nCiAgYW4gZXJyb3IgaWYgLS1oZWxwIG9yIC0tdmVyc2lvbiB3ZXJlIHJlcXVlc3RlZC4KCkRhbmllbCBTdGVuYmVyZyAoMjggTWF5IDIwMDgpCi0gRW1pbCBSb21hbnVzIGZvdW5kIGEgcHJvYmxlbSBhbmQgaGVscGVkIG1lIHJlcGVhdCBpdC4gSXQgb2NjdXJlZCB3aGVuIHVzaW5nCiAgdGhlIGN1cmxfbXVsdGlfc29ja2V0KCkgQVBJIHdpdGggSFRUUCBwaXBlbGluaW5nIGVuYWJsZWQgYW5kIGNvdWxkIGxlYWQgdG8KICB0aGUgcGlwZWxpbmUgYmFzaWNhbGx5IHN0YWxsaW5nIGZvciBhIHZlcnkgbG9uZyBwZXJpb2Qgb2YgdGltZSB1bnRpbCBpdCB0b29rCiAgb2ZmIGFnYWluLgoKLSBKZWZmIFdlYmVyIHJlcG9ydGVkIG1lbW9yeSBsZWFrcyB3aXRoIGFib3J0ZWQgU0NQIGFuZCBTRlRQIHRyYW5zZmVycyBhbmQKICBwcm92aWRlZCBleGNlbGxlbnQgcmVwZWF0IHJlY2lwZXMuIEkgZml4ZWQgdGhlIGNhc2VzIEkgbWFuYWdlZCB0byByZXByb2R1Y2UKICBidXQgSmVmZiBzdGlsbCBnb3Qgc29tZSAoU0NQKSBwcm9ibGVtcyBldmVuIGFmdGVyIHRoZXNlIGZpeGVzOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOC0wNS8wMzQyLmh0bWwKCkRhbmllbCBTdGVuYmVyZyAoMjYgTWF5IDIwMDgpCi0gQnVnIHJlcG9ydCAjMTk3MzM1MiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTk3MzM1MikgaWRlbnRpZmllZAogIGhvdyB0aGUgSFRUUCByZWRpcmVjdCBmb2xsb3dpbmcgY29kZSBkaWRuJ3QgcHJvcGVybHkgZm9sbG93IHRvIGEgbmV3IFVSTCBpZgogIHRoZSBuZXcgdXJsIHdhcyBidXQgYSBxdWVyeSBzdHJpbmcgc3VjaCBhcyAiTG9jYXRpb246ID9tb289Zm9vIi4gVGVzdCBjYXNlCiAgMTAzMSB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMgZml4LgoKLSBBbmRyZWFzIEZhZXJiZXIgYW5kIFNjb3R0IE1jQ3JlYXJ5IG1hZGUgKGxpYiljdXJsIGJ1aWxkIGZvciB0aGUgSGFpa3UgT1MuIAoKWWFuZyBUc2UgKDI2IE1heSAyMDA4KQotIERhdmlkIFJvc2Vuc3RyYXVjaCByZXBvcnRlZCB0aGF0IGhlYWRlciBmaWxlcyBzcG5lZ29oZWxwLmggYW5kCiAgb3BlbnNzbC9vYmplY3RzLmggd2VyZSBuZWVkZWQgdG8gY29tcGlsZSBTUE5FR08gc3VwcG9ydC4KCkRhbmllbCBGYW5kcmljaCAoMjIgTWF5IDIwMDgpCi0gTWFkZSBzdXJlIHRvIHBhc3MgbG9uZ3MgaW4gdG8gY3VybF9lYXN5X3NldG9wdCB3aGVyZSBuZWNlc3NhcnkgaW4gdGhlCiAgZXhhbXBsZSBwcm9ncmFtcyBhbmQgbGlidGVzdCBjb2RlLgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBNYXkgMjAwOCkKLSBXaGVuIHRyeWluZyB0byByZXBlYXQgYSBtdWx0aSBpbnRlcmZhY2UgcHJvYmxlbSBJIGZlbGwgb3ZlciBhIGZldyBtdWx0aQogIGludGVyZmFjZSBwcm9ibGVtczoKCiAgbyB3aXRoIHBpcGVsaW5pbmcgZGlzYWJsZWQsIHRoZSBzdGF0ZSBzaG91bGQgbmV2ZXIgYmUgc2V0IHRvIFdBSVRETyBidXQKICAgIHJhdGhlciBnbyBzdHJhaWdodCB0byBETwoKICBvIHdlIGhhZCBtdWx0aXBsZSBzdGF0ZXMgZm9yIHdoaWNoIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiByZXR1cm5lZCBubyBzb2NrZXQKICAgIGF0IGFsbCB0byB3YWl0IGZvciwgd2l0aCB0aGUgZWZmZWN0IHRoYXQgbGliY3VybCBjYWxscyB0aGUgc29ja2V0IGNhbGxiYWNrCiAgICAod2hlbiBjdXJsX211bHRpX3NvY2tldCgpIGlzIHVzZWQpIHdpdGggUkVNT1ZFIHByZW1hdHVyZWx5IChhcyBpdCB3b3VsZCBiZQogICAgYWRkZWQgYWdhaW4gd2l0aGluIHZlcnkgc2hvcnRseSkKCiAgbyB3aGVuIGluIERPIGFuZCBET0lORyBzdGF0ZXMsIHRoZSBIVFRQIGFuZCBIVFRQUyBwcm90b2NvbCBoYW5kbGVyIGZ1bmN0aW9ucwogICAgZGlkbid0IHJldHVybiB0aGF0IHRoZSBzb2NrZXQgc2hvdWxkIGJlIHdhaXRlZCBmb3Igd3JpdGluZywgYnV0IGluc3RlYWQgaXQKICAgIHdhcyB0cmVhdGVkIGFzIGlmIG5vIHNvY2tldCB3YXMgbmVlZGluZyBtb25pdG9yaW5nIHNvIGFnYWluIFJFTU9WRSB3YXMKICAgIGNhbGxlZCBwcmVtYXR1cmVseS4KCkRhbmllbCBTdGVuYmVyZyAoMTMgTWF5IDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlIDU1NiB0aGF0IHVzZXMgY3VybF9lYXN5X3NlbmQoKSBhbmQgY3VybF9lYXN5X3JlY3YoKQoKRGFuaWVsIFN0ZW5iZXJnICg5IE1heSAyMDA4KQotIEludHJvZHVjaW5nIGN1cmxfZWFzeV9zZW5kKCkgYW5kIGN1cmxfZWFzeV9yZWN2KCkuIFRoZXkgY2FuIGJlIHVzZWQgdG8gc2VuZAogIGFuZCByZWNlaXZlIGRhdGEgb3ZlciBhIGNvbm5lY3Rpb24gcHJldmlvdXNseSBzZXR1cCB3aXRoIGN1cmxfZWFzeV9wZXJmb3JtKCkKICBhbmQgaXRzIENVUkxPUFRfQ09OTkVDVF9PTkxZIG9wdGlvbi4gVGhlIHNlbmRyZWN2LmMgZXhhbXBsZSB3YXMgYWRkZWQgdG8KICBzaG93IGhvdyB0aGV5IGNhbiBiZSB1c2VkLgoKWWFuZyBUc2UgKDkgTWF5IDIwMDgpCi0gSW50ZXJuYWwgdGltZSBkaWZmZXJlbmNlcyBub3cgdXNlIG1vbm90b25pYyB0aW1lIHNvdXJjZSBpZiBhdmFpbGFibGUuCiAgVGhpcyBhbHNvIGltcGxpZXMgdGhlIHJlbW92YWwgb2YgdGhlIHdpbm1tLmxpYiBkZXBlbmRlbmN5IGZvciBXSU4zMi4KCkRhbmllbCBTdGVuYmVyZyAoOSBNYXkgMjAwOCkKLSBTdGVmYW4gS3JhdXNlIHJlcG9ydGVkIGEgYnVzeS1sb29waW5nIGNhc2Ugd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgYW5kIGRvaW5nIENPTk5FQ1QgdG8gYSBwcm94eS4gVGhlIGFwcCB3b3VsZCB0aGVuIGJ1c3ktbG9vcCB1bnRpbCB0aGUgcHJveHkKICBjb21wbGV0ZWQgaXRzIHJlc3BvbnNlLgoKTWljaGFsIE1hcmVrICg5IE1heSAyMDA4KQotIE1ha2UgQ3VybF93cml0ZSBhbmQgaXQncyBjYWxsZWVzIGFjY2VwdCBhIGNvbnN0IHBvaW50ZXIsIGluIHByZXBhcmF0aW9uCiAgb2YgdGV0ZXRlc3QncyBwYXRjaCBmb3IgY3VybF9lYXN5X3NlbmQoKQoKRGFuaWVsIFN0ZW5iZXJnICg3IE1heSAyMDA4KQotIExpYW0gSGVhbHkgZmlsZWQgdGhlIGRlYmlhbiBidWcgcmVwb3J0ICM0ODAwNDQKICAoaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQ4MDA0NCkgaWRlbnRpZnlpbmcgYQogIHNlZ2ZhdWx0IHdoZW4gdXNpbmcga3JiNSBmdHAsIGJ1dCB0aGUga3JiNCBjb2RlIGhhZCB0aGUgc2FtZSBwcm9ibGVtLgoKWWFuZyBUc2UgKDcgTWF5IDIwMDgpCi0gQ2hyaXN0b3BoZXIgUGFsb3cgcHJvdmlkZWQgdGhlIHBhdGNoIChlZGl0ZWQgYnkgbWUpIHRoYXQgaW50cm9kdWNlcyB0aGUKICB1c2Ugb2YgbWljcm9zZWNvbmQgcmVzb2x1dGlvbiBrZXlzIGZvciBpbnRlcm5hbCBzcGxheSB0cmVlcy4KCkRhbmllbCBTdGVuYmVyZyAoNCBNYXkgMjAwOCkKLSBZdXJpeSBTb3NvdiBwb2ludGVkIG91dCBhIGNvbmZpZ3VyZSBmaXggZm9yIGRldGVjdGluZyBjLWFyZXMgd2hlbiB0aGF0IGlzCiAgYnVpbHQgZGVidWctZW5hYmxlZC4KCkRhbmllbCBTdGVuYmVyZyAoMyBNYXkgMjAwOCkKLSBCZW4gVmFuIEhvZiBmaWxlZCBidWcgcmVwb3J0ICMxOTQ1MjQwOiAibGliY3VybCBzb21ldGltZXMgc2VuZHMgYm9keSB0d2ljZQogIHdoZW4gdXNpbmcgQ1VSTF9BVVRIX0FOWSIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE5NDUyNDApLgogIFRoZSBwcm9ibGVtIHdhcyB0aGF0IHdoZW4gbGliY3VybCByZXdvdW5kIGEgc3RyZWFtIG1lYW50IGZvciB1cGxvYWQgd2hlbiBpdAogIHdvdWxkIHByZXBhcmUgZm9yIGEgc2Vjb25kIHJlcXVlc3QsIGl0IGNvdWxkIGFjY2lkZW50YWxseSBjb250aW51ZSB0aGUKICBzZW5kaW5nIG9mIHRoZSByZXdvdW5kIGRhdGEgb24gdGhlIGZpcnN0IHJlcXVlc3QgaW5zdGVhZCBvZiBvbiB0aGUgc2Vjb25kLgogIEJlbiBhbHNvIHByb3ZpZGVkIHRlc3QgY2FzZSAxMDMwIHRoYXQgdmVyaWZpZXMgdGhpcyBmaXguCgpEYW5pZWwgU3RlbmJlcmcgKDMgTWF5IDIwMDgpCi0gSmVhbi1GcmFuY29pcyBCZXJ0cmFuZCByZXBvcnRlZCBhIGxpYmN1cmwgY3Jhc2ggd2l0aCBDVVJMT1BUX1RDUF9OT0RFTEFZCiAgc2luY2UgbGliY3VybCB1c2VkIGdldHByb3RvYnluYW1lKCkgYW5kIHRoYXQgaXNuJ3QgdGhyZWFkLXNhZmUuIFdlIG5vdwogIHN3aXRjaGVkIHRvIHVzZSBJUFBST1RPX1RDUCB1bmNvbmRpdGlvbmFsbHksIGJ1dCBwZXJoYXBzIHRoZSBwcm9wZXIgZml4IGlzCiAgdG8gZGV0ZWN0IHRoZSB0aHJlYWQtc2FmZSB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBhbmQgdXNlIHRoYXQuCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTA1LzAwMTEuaHRtbAoKRGFuaWVsIFN0ZW5iZXJnICgxIE1heSAyMDA4KQotIEJhcnQgV2hpdGVsZXkgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1hZGUgbGliY3VybCB3b3JrIHByb3Blcmx5IHdoZW4gYW4gYXBwCiAgdXNlcyB0aGUgQ1VSTE9QVF9PUEVOU09DS0VURlVOQ1RJT04gY2FsbGJhY2sgdG8gY3JlYXRlIGEgdW5peCBkb21haW4gc29ja2V0CiAgdG8gYSBodHRwIHNlcnZlci4KCkRhbmllbCBTdGVuYmVyZyAoMjkgQXByIDIwMDgpCi0gVG8gbWFrZSBpdCBlYXNpZXIgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgbG90cyBvZiBtYWdpYyBzdHVmZiBkb25lIG9uCiAgcmVkaXJlY3Rpb25zIGFuZCB0aHVzIGNhbm5vdCB1c2UgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiBlYXNpbHksIHdlIG5vdwogIGludHJvZHVjZSB0aGUgbmV3IENVUkxJTkZPX1JFRElSRUNUX1VSTCBvcHRpb24gdGhhdCBsZXRzIGFwcGxpY2F0aW9ucwogIGV4dHJhY3QgdGhlIFVSTCBsaWJjdXJsIHdvdWxkJ3ZlIHJlZGlyZWN0ZWQgdG8gaWYgaXQgaGFkIGJlZW4gdG9sZCB0by4gVGhpcwogIHRoZW4gZW5hYmxlcyB0aGUgYXBwbGljYXRpb24gdG8gY29udGludWUgdG8gdGhhdCBVUkwgYXMgaXQgdGhpbmtzIGlzCiAgc3VpdGFibGUsIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWltcGxlbWVudCB0aGUgbWFnaWMgb2YgY3JlYXRpbmcgdGhlIG5ldyBVUkwKICBmcm9tIHRoZSBMb2NhdGlvbjogaGVhZGVyIGV0Yy4gVGVzdCAxMDI5IHZlcmlmaWVzIGl0LgoKWWFuZyBUc2UgKDI5IEFwciAyMDA4KQotIEltcHJvdmVkIGVhc3kgaW50ZXJmYWNlIHJlc29sdmluZyB0aW1lb3V0IGhhbmRsaW5nIGluIGMtYXJlcyBlbmFibGVkIGJ1aWxkcwoKRGFuaWVsIEZhbmRyaWNoICgyOCBBcHIgMjAwOCkKLSBBZGRlZCB0ZXN0IDEwMjggdG8gdGVzdCBhbiBIVFRQIHJlZGlyZWN0IHRvIGEgRlRQIFVSTC4KCkRhbmllbCBTdGVuYmVyZyAoMjggQXByIDIwMDgpCi0gTm9yYmVydCBGcmVzZSBmaWxlZCBidWcgcmVwb3J0ICMxOTUxNTg4OiAiUHJvYmxlbSB3aXRoIGN1cmxmdHBmcyBhbmQKICBsaWJjdXJsIiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTk1MTU4OCkgd2hpY2ggc2VlbXMgdG8gYmUgYW4KICBpZGVudGljYWwgcmVwb3J0IHRvIHdoYXQgRGVuaXMgR29sb3ZhbiByZXBvcnRlZCBpbgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOC0wMi8wMTA4Lmh0bWwgVGhlIEZUUCBjb2RlIGRpZG4ndCByZXNldCB0aGUKICB1c2VyL3Bhc3N3b3JkIHBvaW50ZXJzIHByb3Blcmx5IGV2ZW4gdGhvdWdoIHRoZXJlIG1pZ2h0J3ZlIGJlZW4gYSBuZXcKICBzdHJ1Y3QvY2Nvbm5lY3Rpb24gZ2V0dGluZyB1c2VkLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBBcHIgMjAwOCkKLSBSZXZlcnRlZCBiYWNrIHRvIHVzZSBhdXRvbWFrZSAxLjkuNiBpbiB0aGUgbmV4dCByZWxlYXNlIChmcm9tIGF1dG9tYWtlCiAgMS4xMC4xKSBzaW5jZSBpdCAqc3RpbGwqIHN1ZmZlcnMgZnJvbSBTb2xhcmlzLXJlbGF0ZWQgYnVncy4gT3VyIHByZXZpb3VzCiAgYXV0b21ha2UgMS4xMCBwcm9ibGVtIHdhcyByZXBvcnRlZCBpbiBidWcgIzE3MDEzNjAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcwMTM2MCkgYW5kIHRoaXMgcmVjZW50IHByb2JsZW0gd2FzCiAgYnVnICMxOTQ0ODI1IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTQ0ODI1KS4gSSBoYXZlIG5vdAogIHBlcnNvbmFsbHkgYXBwcm9hY2hlZCB0aGUgYXV0b21ha2UgdGVhbSBhYm91dCBlaXRoZXIgb25lIG9mIHRoZXNlIGJ1dCBJCiAgZmlndXJlIHdlIG5lZWQgYSBTb2xhcmlzIDEwIGd1eSB0byBkbyBpdCEKICAKWWFuZyBUc2UgKDI1IEFwciAyMDA4KQotIEFkZGVkICd0aW1lb3V0JyBhbmQgJ2RlbGF5JyBhdHRyaWJ1dGVzIHN1cHBvcnQgZm9yIHRoZSB0ZXN0IGhhcm5lc3MKICA8Y29tbWFuZD4gc3Vic2VjdGlvbi4KCkRhbmllbCBGYW5kcmljaCAoMjQgQXByIDIwMDgpCi0gTWFkZSAtLXN0ZGVyciBhYmxlIHRvIHJlZGlyZWN0IGFsbCBzdGRlcnIgbWVzc2FnZXMuCgpZYW5nIFRzZSAoMjMgQXByIDIwMDgpCi0gSW1wcm92ZSBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiB0ZXN0IGhhcm5lc3MgcnVudGVzdHMucGwgc2NyaXB0CiAgYW5kIHRlc3QgaGFybmVzcyBzZXJ2ZXJzIHRvIG1pbmltaXplIHJpc2sgb2YgZmFsc2UgdGVzdCBmYWlsdXJlcy4KCkRhbmllbCBGYW5kcmljaCAoMjIgQXByIDIwMDgpCi0gQWRkZWQgc3VwcG9ydCBmb3IgcnVubmluZyBvbiBTeW1iaWFuIE9TLgoKRGFuaWVsIEZhbmRyaWNoICgxOCBBcHIgMjAwOCkKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwMjYgYW5kIDEwMjcgdG8gZG8gc29tZSBydWRpbWVudGFyeSB0ZXN0cyBvbiB0aGUgLS1tYW51YWwKICBhbmQgLS1oZWxwIG9wdGlvbnMuCgpNaWNoYWwgTWFyZWsgKDE0IEFwciAyMDA4KQotIGFsbG93IGRpc2FibGluZyB0aGUgdHlwZWNoZWNrZXIgYnkgZGVmaW5pbmcgQ1VSTF9ESVNBQkxFX1RZUEVDSEVDSywgYXMKICBkaXNjdXNzZWQgaW4gaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTA0LzAyOTEuaHRtbAoKRGFuaWVsIFN0ZW5iZXJnICgxNCBBcHIgMjAwOCkKLSBTdGVmYW4gS3JhdXNlIHJlcG9ydGVkIGEgY2FzZSB3aGVyZSB0aGUgT3BlblNTTCBoYW5kc2hha2UgcGhhc2Ugd2Fzbid0CiAgcHJvcGVybHkgYWNrbm93bGVkZ2luZyB0aGUgdGltZW91dCB2YWx1ZXMsIGxpa2UgaWYgeW91IHB1bGxlZCB0aGUgbmV0d29yawogIHBsdWcgaW4gdGhlIG1pZHN0IG9mIGl0LgoKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZpeGVkIGEgc2Vjb25kIGNhc2Ugb2Ygbm90IGNoZWNraW5nIHRoZSBtYWxsb2MoKQogIHJldHVybiBjb2RlIGluIHRoZSBOZWdvdGlhdGUgY29kZS4KCi0gU2FuZG9yIEZlbGRpIHJlcG9ydGVkIGJ1ZyAjMTk0MjAyMgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTQyMDIyKSBwb2ludGluZyBvdXQgYSBtaXN0YWtlIGluIHRoZQogIGxpYi9NYWtlZmlsZS52Y1s2OF0gbWFrZWZpbGVzJyByZWxlYXNlLXNzbC1kbGwgdGFyZ2V0LgoKLSBCcm9jayBOb2xhbmQgcmVwb3J0ZWQgdGhhdCBjdXJsIGJlaGF2ZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHdoaWNoIG9yZGVyCiAgeW91IHVzZWQgLWkgYW5kIC1JLgoKRGFuaWVsIFN0ZW5iZXJnICgxMiBBcHIgMjAwOCkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZvdW5kIGFuZCBmaXhlZCBhIGNhc2Ugd2hlcmUgbWFsbG9jKCkgd2FzIGNhbGxlZCBidXQKICB3YXMgbm90IGNoZWNrZWQgZm9yIGEgTlVMTCByZXR1cm4sIGluIHRoZSBOZWdvdGlhdGUgY29kZS4KCkRhbmllbCBGYW5kcmljaCAoOSBBcHIgMjAwOCkKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwMjQgJiAxMDI1IHRvIHRlc3QgYSBzY2VuYXJpbyBzaW1pbGFyIHRvIHRoZSBvbmUgcmVwb3J0ZWQKICBieSBCZW4gQ29tYmVlIHdoZXJlIGxpYmN1cmwgd291bGQgc2VuZCB0aGUgd3JvbmcgY29va2llIHRvIGEgcmVkaXJlY3RlZAogIHNlcnZlci4gIGxpYmN1cmwgd2FzIGRvaW5nIHRoZSByaWdodCB0aGluZyBpbiB0aGVzZSB0ZXN0IGNhc2VzLgoKTWljaGFsIE1hcmVrICg3IEFwciAyMDA4KQotIEZpeCB0aGUgTUlUIC8gSGVpbWRhbCBjaGVjayBmb3IgZ29vZDoKICBEZWZpbmUgSEFWRV9HU1NNSVQgaWYgPGdzc2FwaS97Z3NzYXBpLmgsZ3NzYXBpX2dlbmVyaWMuaCxnc3NhcGlfa3JiNS5ofT4gYXJlCiAgYXZhaWxhYmxlLCBvdGhlcndpc2UgZGVmaW5lIEhBVkVfR1NTSEVJTURBTCBpZiA8Z3NzYXBpLmg+IGlzIGF2YWlsYWJsZS4KICAKICBPbmx5IGRlZmluZSBHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSB0byBnc3NfbnRfc2VydmljZV9uYW1lIGlmCiAgR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UgaXNuJ3QgZGVjbGFyZWQgYnkgdGhlIGdzc2FwaSBoZWFkZXJzLiBUaGlzIHNob3VsZAogIGF2b2lkIGJyZWFrYWdlIGluIGNhc2Ugd2Ugd3JvbmdseSByZWNvZ25pemUgSGVpbWRhbCBhcyBNSVQgYWdhaW4uCgpEYW5pZWwgU3RlbmJlcmcgKDUgQXByIDIwMDgpCi0gQWxleGV5IFNpbWFrIGZpeGVkIGN1cmxfZWFzeV9yZXNldCgpIHRvIHJlc2V0IHRoZSBtYXggcmVkaXJlY3QgbGltaXQgcHJvcGVybHkKCi0gQmFzZWQgb24gdGhlIERlYmlhbiBidWcgcmVwb3J0ICM0NzQyMjQgdGhhdCBjb21wbGFpbmVkIGFib3V0IHRoZSBGVFAgZXJyb3IKICBtZXNzYWdlIHdoZW4gbGliY3VybCBkb2Vzbid0IGdldCBhIDIyMCBiYWNrIGltbWVkaWF0ZWx5IG9uIGNvbm5lY3QsIEkgbm93CiAgY2hhbmdlZCBpdCB0byBiZSBtb3JlIHNwZWNpZmljIG9uIHdoYXQgdGhlIHByb2JsZW0gaXMuIEFsc28gd29ydGggbm90aWNpbmc6CiAgd2hpbGUgdGhlIGJ1ZyByZXBvcnQgY29udGFpbnMgYW4gZXhhbXBsZSB3aGVyZSB0aGUgcmVzcG9uc2UgaXM6CgogICAgNDIxIFRoZXJlIGFyZSB0b28gbWFueSBjb25uZWN0ZWQgdXNlcnMsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIKCiAgd2UgY2Fubm90IGFzc3VtZSB0aGF0IHRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYWx3YXlzIGJlIHRoaXMgcmVhZGFibGUgbm9yCiAgdGhhdCBpdCBmaXRzIHdpdGhpbiBhIHBhcnRpY3VsYXIgYm91bmRhcnkgZXRjLgoKRGFuaWVsIEZhbmRyaWNoICgzIEFwciAyMDA4KQotIEFkZGVkIHRlc3Q2MjcgdG8gdGVzdCBTRlRQIHdpdGggQ1VSTE9QVF9OT0JPRFkKCkRhbmllbCBTdGVuYmVyZyAoMyBBcHIgMjAwOCkKLSBTZXR0aW5nIENVUkxPUFRfTk9CT0RZIHRvIEZBTFNFIHdpbGwgbm93IHN3aXRjaCB0aGUgSFRUUCByZXF1ZXN0IG1ldGhvZCB0bwogIEdFVCBzaW1wbHkgYmVjYXVzZSBwcmV2aW91c2x5IHdoZW4geW91IHNldCBDVVJMT1BUX05PQk9EWSB0byBUUlVFIGZpcnN0IGFuZAogIHRoZW4gRkFMU0UgeW91J2QgZW5kIHVwIGluIGEgYnJva2VuIHN0YXRlIHdoZXJlIGEgSFRUUCByZXF1ZXN0IHdvdWxkIGRvIGEKICBIRUFEIGJ5IHN0aWxsIGFjdCBhIGxvdCBsaWtlIGZvciBhIEdFVCBhbmQgaGFuZyB3YWl0aW5nIGZvciB0aGUgY29udGVudCBldGMuCgotIFNjb3R0IEJhcnJldHQgYWRkZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9OT0JPRFkgb3ZlciBTRlRQCgpEYW5pZWwgRmFuZHJpY2ggKDMgQXByIDIwMDgpCi0gTWFkZSBzdXJlIHRoYXQgY3VybF9nbG9iYWxfaW5pdCBpcyBjYWxsZWQgaW4gYWxsIHRoZSBtdWx0aXRocmVhZGVkCiAgZXhhbXBsZSBwcm9ncmFtcy4KCk1pY2hhbCBNYXJlayAoMzEgTWFyIDIwMDgpCi0gUmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGNhLWJ1bmRsZS5oIGZpbGUuIFRoZSB2ZXJiYXRpbSB2YWx1ZSBvZiAkY2EgYW5kCiAgJGNhcGF0aCBpcyBrbm93biB0byBjb25maWd1cmUsIHNvIGl0IGNhbiBiZSBkZWZpbmVkIGluIGNvbmZpZy5oIGluc3RlYWQuCgpEYW5pZWwgU3RlbmJlcmcgKDMxIE1hciAyMDA4KQotIEFkZGVkIENVUkxGT1JNX1NUUkVBTSBhcyBhIHN1cHBvcnRlZCBvcHRpb24gdG8gY3VybF9mb3JtYWRkKCkgdG8gYWxsb3cgYW4KICBhcHBsaWNhdGlvbiB0byBwcm92aWRlIGRhdGEgZm9yIGEgbXVsdGlwYXJ0IHdpdGggdGhlIHJlYWQgY2FsbGJhY2suIE5vdGUKICB0aGF0IHRoZSBzaXplIG5lZWRzIHRvIGJlIHByb3ZpZGVkIHdpdGggQ1VSTEZPUk1fQ09OVEVOVFNMRU5HVEggd2hlbiB0aGUKICBzdHJlYW0gb3B0aW9uIGlzIHVzZWQuIFRoaXMgZmVhdHVyZSBpcyB2ZXJpZmllZCBieSB0aGUgbmV3IHRlc3QgY2FzZQogIDU1NC4gVGhpcyBmZWF0dXJlIHdhcyBzcG9uc29yZWQgYnkgWHBvbmF1dC4KCkRhbmllbCBGYW5kcmljaCAoMzAgTWFyIDIwMDgpCi0gQ2hhbmdlZCB0aGUgbWFrZWZpbGUgc28gdGhlIGRvYy9leGFtcGxlcy8gcHJvZ3JhbXMgYXJlIG5ldmVyIGJ1aWx0IGluIGEKICBub3JtYWwgYnVpbGQvaW5zdGFsbCAob25seSB3aXRoIHRoZSAnbWFrZSBjaGVjaycgdGFyZ2V0KSwgc28gdGhhdCBhCiAgYnVpbGQgZmFpbHVyZSBpbiB0aGUgZXhhbXBsZXMgaXNuJ3QgZmF0YWwuCgpWZXJzaW9uIDcuMTguMSAoMzAgTWFyY2ggMjAwOCkKCkRhbmllbCBTdGVuYmVyZyAoMjggTWFyIDIwMDgpCi0gU3RlcGhlbiBDb2xseWVyIHBvaW50ZWQgb3V0IHRoYXQgY29uZmlndXJlIC0td2l0aC1saWJzc2gyIHdpdGhvdXQgYSBnaXZlbgogIHBhdGggZGlkbid0IHdvcmsgcHJvcGVybHkuCgpEYW5pZWwgU3RlbmJlcmcgKDI3IE1hciAyMDA4KQotIEFzIGZvdW5kIG91dCBhbmQgcmVwb3J0ZWQgYnkgRGFuIFBldGl0dCwgbGliY3VybCBkaWRuJ3Qgc2hvdyBwcm9ncmVzcy9jYWxsCiAgdGhlIHByb2dyZXNzIGNhbGxiYWNrIGZvciB0aGUgZmlyc3QgKHBvdGVudGlhbGx5IGh1Z2UpIHBpZWNlIG9mIGJvZHkgZGF0YQogIHNlbnQgdG9nZXRoZXIgd2l0aCB0aGUgUE9TVCByZXF1ZXN0IGhlYWRlcnMgaW4gdGhlIGluaXRpYWwgc2VuZCgpLgoKRGFuaWVsIFN0ZW5iZXJnICgyNSBNYXIgMjAwOCkKLSBNYWRlIHNldHRpbmcgdGhlIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTiBvcHRpb24gcmV0dXJuIGEgZmFpbHVyZSBpbiBjYXNlCiAgbGliY3VybCB3YXNuJ3QgYnVpbHQgdG8gdXNlIE9wZW5TU0wgYXMgdGhhdCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgdGhpcwogIG9wdGlvbiB0byBmdW5jdGlvbiEKCkRhbmllbCBTdGVuYmVyZyAoMjIgTWFyIDIwMDgpCi0gRml4ZWQgdGhlIHByb2JsZW0gd2l0aCBkb2luZyBhIHplcm8gYnl0ZSBTQ1AgdHJhbnNmZXIsIHZlcmlmaWVkIHdpdGggdGVzdAogIGNhc2UgNjE3ICh3aGljaCB3YXMgYWRkZWQgYnkgRGFuaWVsIEZhbmRyaWNoIDUgTWFyIDIwMDgpLgoKRGFuaWVsIEZhbmRyaWNoICgyMCBNYXIgMjAwOCkKLSBGaXhlZCBhIHByb2JsZW0gd2hlcmUgY3VybC1jb25maWcgLS1wcm90b2NvbHMgY291bGQgZXJyb25lb3VzbHkgc2hvdyBMREFQUwogIHN1cHBvcnQgd2hlbiBjdXJsIGRpZG4ndCBldmVuIGhhdmUgcmVndWxhciBMREFQIHN1cHBvcnQuICBJdCBsb29rcyBsaWtlCiAgdGhpcyBjb3VsZCBoYXBwZW4gd2hlbiB0aGUgLS1lbmFibGUtbGRhcHMgY29uZmlndXJlIHN3aXRjaCBpcyBnaXZlbiBidXQKICBjb25maWd1cmUgY291bGRuJ3QgZmluZCB0aGUgTERBUCBoZWFkZXJzIG9yIGxpYnJhcmllcy4KCk1pY2hhbCBNYXJlayAoMjAgTWFyIDIwMDgpCi0gQWRkZWQgLS13aXRoLWNhLXBhdGg9RElSRUNUT1JZIGNvbmZpZ3VyZSBvcHRpb24gdG8gdXNlIGFuIG9wZW5TU0wgQ0FwYXRoIGJ5CiAgZGVmYXVsdCBpbnN0ZWFkIG9mIGEgY2EgYnVuZGxlLiBUaGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGFsc28gbG9vayBmb3IgYQogIGNhIHBhdGggaWYgbm8gY2EgYnVuZGxlIGlzIGZvdW5kIGFuZCBubyBvcHRpb24gZ2l2ZW4uCgotIEZpeGVkIGRldGVjdGlvbiBvZiBwcmV2aW91c2x5IGluc3RhbGxlZCBjdXJsLWNhLWJ1bmRsZS5jcnQKCkRhbmllbCBGYW5kcmljaCAoMTggTWFyIDIwMDgpCi0gQWRkZWQgdGVzdCA2MjYgdG8gcmVwcm9kdWNlIGFuIGluZmluaXRlIGxvb3Agd2hlbiBnaXZlbiBhbiBpbnZhbGlkCiAgU0ZUUCBxdW90ZSBjb21tYW5kIHJlcG9ydGVkIGJ5IFZpbmNlbnQgTGUgTm9ybWFuZCwgYW5kIGZpeGVkIGl0LgoKTWljaGFsIE1hcmVrICgxOCBNYXIgMjAwOCkKLSBBZGRlZCBjdXJsX2Vhc3lfZ2V0aW5mbyB0eXBlY2hlY2tlci4KCi0gQWRkZWQgbWFjcm9zIGZvciBjdXJsX3NoYXJlX3NldG9wdCBhbmQgY3VybF9tdWx0aV9zZXRvcHQgdG8gY2hlY2sgYXQgbGVhc3QKICB0aGUgY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzLgoKRGFuaWVsIEZhbmRyaWNoICgxMyBNYXIgMjAwOCkKLSBBZGRlZCB0ZXN0cyA2MjItNjI1IHRvIHRlc3QgU0ZUUC9TQ1AgdXBsb2Fkcy4gVGVzdCA2MjUgd2FzIGFuIGF0dGVtcHQgdG8KICByZXByb2R1Y2UgdGhlIC0tZnRwLWNyZWF0ZS1kaXJzIHByb2JsZW0gcmVwb3J0ZWQgYnkgQnJpYW4gVWxtLCBidXQgdGhhdAogIHNlZW1zIHRvIG5lZWQgYSBjYWxsIGN1cmxfZWFzeV9yZXNldCgpIHdoaWNoIHRoaXMgdGVzdCBjYXNlIGRvZXNuJ3QgZG8uCgpEYW5pZWwgU3RlbmJlcmcgKDEzIE1hciAyMDA4KQotIEJyaWFuIFVsbSBmaWd1cmVkIG91dCB0aGF0IGlmIHlvdSBkaWQgYW4gU0ZUUCB1cGxvYWQgd2l0aAogIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgdG8gY3JlYXRlIGEgZGlyZWN0b3J5LCBhbmQgdGhlbiByZS11c2VkIHRoZQogIGhhbmRsZSBhbmQgdXBsb2FkZWQgYW5vdGhlciBmaWxlIHRvIGFub3RoZXIgZGlyZWN0b3J5IHRoYXQgbmVlZGVkIHRvIGJlCiAgY3JlYXRlZCwgdGhlIHNlY29uZCB1cGxvYWQgd291bGQgZmFpbC4gQW5vdGhlciBjYXNlIG9mIGEgc3RhdGUgdmFyaWFibGUgdGhhdAogIHdhc24ndCBwcm9wZXJseSByZXNldCBiZXR3ZWVuIHJlcXVlc3RzLgoKLSBJIHJld3JvdGUgdGhlIDEwMC1jb250aW51ZSBjb2RlIHRvIHVzZSBhIHNpbmdsZSBzdGF0ZSB2YXJpYWJsZSBpbnN0ZWFkIG9mCiAgdGhlIHByZXZpb3VzIHR3byBvbmVzLiBJIHRoaW5rIGl0IG1hZGUgdGhlIGxvZ2ljIHNvbWV3aGF0IGNsZWFyZXIuCgpEYW5pZWwgU3RlbmJlcmcgKDExIE1hciAyMDA4KQotIERtaXRyeSBQb3BvdiBmaWxlZCBidWcgcmVwb3J0ICMxOTExMDY5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE5MTEwNjkpIHRoYXQgaWRlbnRpZmllZCBhIHJhY2UKICBjb25kaXRpb24gaW4gdGhlIG5hbWUgcmVzb2x2ZXIgY29kZSB3aGVuIHRoZSBETlMgY2FjaGUgaXMgc2hhcmVkIGJldHdlZW4KICBtdWx0aXBsZSBlYXN5IGhhbmRsZXMsIGVhY2ggcnVubmluZyBpbiBzaW11bHRhbmVvdXMgdGhyZWFkcyB0aGF0IGNvdWxkIGNhdXNlCiAgY3Jhc2hlcy4KCi0gQWRkZWQgYSBtYWNybyBmb3IgY3VybF9lYXN5X3NldG9wdCgpIHRoYXQgYWNjZXB0cyB0aHJlZSBhcmd1bWVudHMgYW5kIHNpbXBseQogIGRvZXMgbm90aGluZyB3aXRoIHRoZW0sIGp1c3QgdG8gbWFrZSBzdXJlIGxpYmN1cmwgdXNlcnMgYWx3YXlzIHVzZSB0aHJlZQogIGFyZ3VtZW50cyB0byB0aGlzIGZ1bmN0aW9uLiBEdWUgdG8gaXRzIHVzZSBvZiAuLi4gZm9yIHRoZSB0aGlyZCBhcmd1bWVudCwgaXQKICBpcyBvdGhlcndpc2UgaGFyZCB0byBkZXRlY3QgYWJ1c2UuCgpNaWNoYWwgTWFyZWsgKDExIE1hciAyMDA4KQotIEFkZGVkIGEgdHlwZSBjaGVja2luZyBtYWNybyBmb3IgY3VybF9lYXN5X3NldG9wdCgpLCBuZWVkcyBnY2MtNC4zIGFuZCBvbmx5CiAgd29ya3MgaW4gQyBtb2RlIGF0bSAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTAyLzAyNjcuaHRtbCAsCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTAyLzAyOTIuaHRtbCApCgpEYW5pZWwgRmFuZHJpY2ggKDEwIE1hciAyMDA4KQotIEFkZGVkIHRlc3RzIDYxOC02MjEgdG8gdGVzdCBTRlRQL1NDUCB0cmFuc2ZlcnMgb2YgbW9yZSB0aGFuIG9uZSBmaWxlCiAgKHRlc3QgNjIwIHRlc3RzIHRoZSBqdXN0LWZpeGVkIHByb2JsZW0gcmVwb3J0ZWQgYnkgQnJpYW4gVWxtKS4KCkRhbmllbCBTdGVuYmVyZyAoOSBNYXIgMjAwOCkKLSBCcmlhbiBVbG0gcmVwb3J0ZWQgYSBjcmFzaCB3aGVuIGRvaW5nIGEgc2Vjb25kIFNGVFAgdHJhbnNmZXIgb24gYSByZS11c2VkCiAgZWFzeSBoYW5kbGUgaWYgY3VybF9lYXN5X3Jlc2V0KCkgd2FzIHVzZWQgYmV0d2VlbiB0aGVtLiBJIGZpeGVkIGl0IGFuZCBCcmlhbgogIHZlcmlmaWVkIHRoYXQgaXQgY3VyZWQgaGlzIHByb2JsZW0uCgotIEJyaWFuIFVsbSByZXBvcnRlZCB0aGF0IGlmIHlvdSBmaXJzdCB0cmllZCB0byBkb3dubG9hZCBhIG5vbi1leGlzdGluZyBTRlRQCiAgZmlsZSBhbmQgdGhlbiBmZXRjaGVkIGFuIGV4aXN0aW5nIG9uZSBhbmQgcmUtdXNlZCB0aGUgaGFuZGxlLCBsaWJjdXJsIHdvdWxkCiAgc3RpbGwgcmVwb3J0IHRoZSBzZWNvbmQgb25lIGFzIG5vbi1leGlzdGluZyBhcyB3ZWxsISBJIGZpeGVkIGl0IGFuZCBCcmlhbgogIHZlcmlmaWVkIHRoYXQgaXQgY3VyZWQgaGlzIHByb2JsZW0uCgpNaWNoYWwgTWFyZWsgKDYgTWFyIDIwMDgpCi0gRml4IHRoZSBnc3NhcGkgY29uZmlndXJlIGNoZWNrIHRvIGRldGVjdCBuZXdlciBNSVQgS2VyYmVyb3MgKHBhdGNoIGJ5CiAgTWljaGFlbCBDYWxtZXIpCgpZYW5nIFRzZSAoNiBNYXIgMjAwOCkKLSBGaXggcmVncmVzc2lvbiBvbiBDdXJsX3NvY2tldF9yZWFkeSgpIGFuZCBDdXJsX3BvbGwoKSBzbyB0aGF0IHRoZXNlIHdpbGwKICBhZ2FpbiBmYWlsIG9uIHNlbGVjdC9wb2xsIGVycm9ycyBkaWZmZXJlbnQgdGhhbiBFSU5UUi4KCkRhbmllbCBGYW5kcmljaCAoNSBNYXIgMjAwOCkKLSBGaXhlZCB0aGUgdGVzdCBoYXJuZXNzIHNvIGl0IHdpbGwgd3JpdGUgb3V0IHplcm8tbGVuZ3RoIGRhdGEgZmlsZXMuCgotIEFkZGVkIHRlc3RzIDYxNiBhbmQgNjE3IHRvIHNlZSBob3cgU0ZUUCBhbmQgU0NQIGNvcGUgd2l0aCB6ZXJvLWxlbmd0aAogIGZpbGVzLCBhcyBxdWVzdGlvbmVkIGJ5IE1pa2UgUHJvdHRzLiBTRlRQIGRvZXMgZm9yIG1lIGJ1dCBTQ1AgZG9lc24ndAogIHNvIHRlc3QgNjE3IGlzIGRpc2FibGVkIGZvciBub3cuCgpEYW5pZWwgUyAoNCBNYXIgMjAwOCkKLSBNaWtlIFByb3R0cyBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlcyByZXN1bWVkIHRyYW5zZmVycyB3b3JrIHdpdGggU0ZUUC4KCkRhbmllbCBTICgxIE1hciAyMDA4KQotIEFuYXRvbGkgVHVibWFuIGZvdW5kIGFuZCBmaXhlZCBhIGNyYXNoIHdpdGggTmVnb3RpYXRlIGF1dGhlbnRpY2F0aW9uIHVzZWQgb24KICBhIHJlLXVzZWQgY29ubmVjdGlvbiB3aGVyZSBib3RoIHJlcXVlc3RzIHVzZWQgTmVnb3RpYXRlLgoKR3VlbnRlciBLbmF1ZiAoMjYgRmViIDIwMDgpCi0gS2FzcGFyIEJyYW5kIHByb3ZpZGVkIGEgcGF0Y2ggdG8gc3VwcG9ydCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIChSRkMgNDM2NikuCgpEYW5pZWwgUyAoMjUgRmViIDIwMDgpCi0gS2FzcGFyIEJyYW5kIG1hZGUgR251VExTLWJ1aWx0IGxpYmN1cmwgcHJvcGVybHkgYWNrbm93bGVkZ2UgdGhlIG9wdGlvbiB0aGF0CiAgZm9yY2VzIGl0IHRvIHByZWZlciBTU0x2My4KCkRhbmllbCBTICgyMyBGZWIgMjAwOCkKLSBTYW0gTGlzdG9wYWQgcHJvdmlkZWQgYSBwYXRjaCBpbiBmZWF0dXJlLXJlcXVlc3QgIzE5MDAwMTQKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy9mZWF0dXJlLmNnaT9pZD0xOTAwMDE0IHRoYXQgbWFrZXMgbGliY3VybCAoYnVpbHQgdG8KICB1c2UgT3BlblNTTCkgc3VwcG9ydCBhIGZ1bGwgY2hhaW4gb2YgY2VydGlmaWNhdGVzIGluIGEgZ2l2ZW4gUEtDUzEyCiAgY2VydGlmaWNhdGUuCgpEYW5pZWwgUyAoMjIgRmViIDIwMDgpCi0gR2VvcmcgTGlwcGl0c2NoIG1hZGUgdGhlIHNyYy9NYWtlZmlsZS52YzYgbWFrZWZpbGUgdXNlIHRoZSBzYW1lIG1lbW9yeSBtb2RlbAogIG9wdGlvbnMgYXMgdGhlIGxpYi9NYWtlZmlsZS52YzYgYWxyZWFkeSBkaWQuCgpEYW5pZWwgUyAoMjEgRmViIDIwMDgpCi0gWm1leSBQZXRyb2ZmIGZvdW5kIGEgY3Jhc2ggd2hlbiBsaWJjdXJsIGFjY2Vzc2VkIGEgTlVMTCBwb2ludGVyLCB3aGljaAogIGhhcHBlbmVkIGlmIHlvdSBzZXQgdGhlIGNvbm5lY3Rpb24gY2FjaGUgc2l6ZSB0byAxIGFuZCBmb3IgZXhhbXBsZSBmYWlsZWQgdG8KICBsb2dpbiB0byBhbiBGVFAgc2l0ZS4gQnVnIHJlcG9ydCAjMTg5NjY5OAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODk2Njk4KQoKRGFuaWVsIFMgKDIwIEZlYiAyMDA4KQotIEZpeGVkIHRlc3QgY2FzZSA0MDUgdG8gbm90IGZhaWwgd2hlbiBsaWJjdXJsIGlzIGJ1aWx0IHdpdGggR251VExTCgotIEJhc2VkIG9uIGluaXRpYWwgd29yayBkb25lIGJ5IEdhdXRhbSBLYWNocm9vIHRvIGFkZHJlc3MgYSBidWcsIHdlIG5vdyBrZWVwCiAgYmV0dGVyIGNvbnRyb2wgYXQgdGhlIGV4YWN0IHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uJ3MgU1NMIHN0YXR1cyBzbyB0aGF0IHdlCiAga25vdyBleGFjdGx5IHdoZW4gaXQgaGFzIGNvbXBsZXRlZCB0aGUgU1NMIG5lZ290aWF0aW9uIG9yIG5vdCBzbyB0aGF0IHRoZXJlCiAgd29uJ3QgYmUgYWNjaWRlbnRhbCByZS11c2VzIG9mIGNvbm5lY3Rpb25zIHRoYXQgYXJlIHdyb25nbHkgYmVsaWV2ZWQgdG8gYmUKICBpbiBTU0wtY29tcGxldGVkLW5lZ290aWF0ZSBzdGF0ZS4KCi0gV2Ugbm8gbG9uZ2VyIHN1cHBvcnQgc2V0dGluZyB0aGUgQ1VSTE9QVF9VUkwgb3B0aW9uIGZyb20gaW5zaWRlIGEgY2FsbGJhY2sKICBzdWNoIGFzIHRoZSBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT04gb25lIHRyZWF0IHRoYXQgYXMgaWYgaXQgd2FzIGEgTG9jYXRpb246CiAgZm9sbG93aW5nLiBUaGUgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIHRoaXMgZmVhdHVyZSB3YXMgZG9uZSBmb3IgNy4xMS4wLCBidXQKICB0aGlzIGNvZGUgYW5kIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gYnJva2VuIHNpbmNlIGFib3V0IDcuMTUuNCAoTWFyY2ggMjAwNikKICB3aXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygbm9uLWJsb2NraW5nIE9wZW5TU0wgImNvbm5lY3RzIi4KCiAgSXQgd2FzIGEgaGFjayB0byBiZWdpbiB3aXRoIGFuZCBzaW5jZSBpdCBkb2Vzbid0IHdvcmsgYW5kIGhhc24ndCB3b3JrZWQKICBjb3JyZWN0bHkgZm9yIGEgbG9uZyB0aW1lIGFuZCBub2JvZHkgaGFzIGV2ZW4gbm90aWNlZCwgSSBjb25zaWRlciBpdCBhIHZlcnkKICBzdWl0YWJsZSBzdWJqZWN0IGZvciBwbGFpbiByZW1vdmFsLiBBbmQgc28gaXQgd2FzIGRvbmUuCgpHdWVudGVyIEtuYXVmICgxOSBGZWIgMjAwOCkKLSBXZSBkbyBubyBsb25nZXIgc3VwcG9ydCBTU0x2MiBieSBkZWZhdWx0IHNpbmNlIGl0IGhhcyBrbm93biBmbGF3cy4KICBLYXNwYXIgQnJhbmQgcHJvdmlkZWQgYSBwYXRjaCBmb3IgYWxsIHN1cHBvcnRlZCBTU0wgdG9vbGtpdHMuCiAKRGFuaWVsIEZhbmRyaWNoICgxOSBGZWIgMjAwOCkKLSBBZGRlZCB0ZXN0MzA5IHRvIHRlc3QgSFRUUCByZWRpcmVjdCB0byBIVFRQUyBVUkwKCkRhbmllbCBTICgxOCBGZWIgMjAwOCkKLSBXZSdyZSBubyBsb25nZXIgcHJvdmlkaW5nIGEgdmVyeSBvbGQgY2EtYnVuZGxlIGluIHRoZSBjdXJsIHRhcmJhbGwuIFlvdSBjYW4KICBnZXQgYSBmcmVzaCBvbmUgZG93bmxvYWRlZCBhbmQgY3JlYXRlZCB3aXRoICdtYWtlIGNhLWJ1bmRsZScgb3IgeW91IGNhbiBnZXQKICBvbmUgZnJvbSBoZXJlID0+IGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9jYWV4dHJhY3QuaHRtbCBpZiB5b3Ugd2FudCBhIGZyZXNoCiAgbmV3IG9uZSBleHRyYWN0ZWQgZnJvbSBNb3ppbGxhJ3MgcmVjZW50IGxpc3Qgb2YgY2EgY2VydHMuCgogIFRoZSBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1jYS1idW5kbGUgbm93IGxldHMgeW91IHNwZWNpZnkgd2hhdCBmaWxlIHRvIHVzZQogIGFzIGRlZmF1bHQgY2EgYnVuZGxlIGZvciB5b3VyIGJ1aWxkLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgY29uZmlndXJlIHNjcmlwdAogIHdpbGwgY2hlY2sgYSBmZXcga25vd24gc3RhbmRhcmQgcGxhY2VzIGZvciBhIGdsb2JhbCBjYSBjZXJ0IHRvIHVzZS4KCkRhbmllbCBTICgxNyBGZWIgMjAwOCkKLSBKZXJvbWUgTXVmZmF0LU1lcmlkb2wgaGVscGVkIG1lIGZpeCBDdXJsX2RvbmUoKSB0byBjbG9zZSB0aGUgY3VycmVudAogIGNvbm5lY3Rpb24gYnkgZm9yY2Ugd2hlbiBpdCB3YXMgY2FsbGVkIGJlZm9yZSB0aGUgZW50aXJlIHJlcXVlc3QgaXMKICBjb21wbGV0ZWQsIHNpbXBseSBiZWNhdXNlIHdlIGNhbid0IGtub3cgaWYgdGhlIGNvbm5lY3Rpb24gcmVhbGx5IGNhbiBiZQogIHJlLXVzZWQgc2FmZWx5IGF0IHRoYXQgcG9pbnQuCgotIEJhc2VkIG9uIHRoZSBzYW1lIGRlYnVnZ2luZyBsb2dpYywgSSd2ZSBhbHNvIG1hZGUgQ3VybF9odHRwX2RvbmUoKSBub3QKICByZXR1cm4gQ1VSTEVfR09UX05PVEhJTkcgaWYgY2FsbGVkICJwcmVtYXR1cmVseSIuIFRoaXMgc2hvdWxkIGhhdmUgbm8gcmVhbAogIGVmZmVjdCB0byBhbnl0aGluZyBidXQgdGhlIGNvZGUgbWFrZXMgbW9yZSBzZW5zZSBsaWtlIHRoaXMuCiAgCkRhbmllbCBTICgxNSBGZWIgMjAwOCkKLSBNYWRlIHRoZSBnbnV0bHMgY29kZSBwYXRoIG5vdCBldmVuIHRyeSB0byBnZXQgdGhlIHNlcnZlciBjZXJ0IGlmIG5vIHBlZXIKICB2ZXJpZmljYXRpb24gaXMgcmVxdWVzdGVkLiBQcmV2aW91c2x5IGl0IHdvdWxkIGV2ZW4gcmV0dXJuIGZhaWx1cmUgaWYgZ251dGxzCiAgZmFpbGVkIHRvIGdldCB0aGUgc2VydmVyIGNlcnQgZXZlbiB0aG91Z2ggbm8gdmVyaWZpY2F0aW9uIHdhcyBhc2tlZCBmb3IuCiAgUHVibGljIHNlcnZlciBzaG93aW5nIHRoZSBwcm9ibGVtOiBodHRwczovL3d3dy5uZXQyMjIuY2Fpc3NlLWVwYXJnbmUuZnIKCi0gRml4IG15IEN1cmxfdGltZWxlZnQoKSBsZWZ0b3ZlciBtaXN0YWtlIGluIHRoZSBnbnV0bHMgY29kZQoKLSBQb295YW4gTWNTcG9ycmFuIGZvdW5kIGFuZCBmaXhlZCBhIGZsYXcgd2hlcmUgeW91IGZpcnN0IHdvdWxkIGRvIGEgbm9ybWFsCiAgaHR0cCByZXF1ZXN0IGFuZCB0aGVuIHlvdSdkIHJldXNlIHRoZSBoYW5kbGUgYW5kIHJlcGxhY2UgdGhlIEFjY2VwdDogaGVhZGVyLAogIGFzIHRoZW4gbGliY3VybCB3b3VsZCBzZW5kIHR3byBBY2NlcHQ6IGhlYWRlcnMhCgpEYW5pZWwgUyAoMTEgRmViIDIwMDgpCi0gWWFuZyBUc2UgcG9pbnRlZCBvdXQgYSBmZXcgcmVtYWluaW5nIHF1aXJrcyBmcm9tIG15IHRpbWVvdXQgcmVmYWN0b3JpbmcgZnJvbQogIEZlYiA3IHRoYXQgZGlkbid0IGFib3J0IHByb3Blcmx5IG9uIHRpbWVvdXRzLiBUaGVzZSBhcmUgYWN0dWFsbHkgb2xkCiAgcHJvYmxlbXMgYnV0IG5vdyB0aGV5IHNob3VsZCBiZSBmaXhlZC4KCllhbmcgVHNlICgxMCBGZWIgMjAwOCkKLSBCdWcgcmVwb3J0ICMxODg4OTMyIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODg4OTMyKSBwb2ludHMgb3V0CiAgYW5kIHByb3ZpZGVzIHRlc3QgcHJvZ3JhbSB0aGF0IGRlbW9uc3RyYXRlcyB0aGF0IGxpYmN1cmwgbWlnaHQgbm90IHNldCBlcnJvcgogIGRlc2NyaXB0aW9uIG1lc3NhZ2UgZm9yIGVycm9yIENVUkxFX0NPVUxETlRfUkVTT0xWRV9IT1NUIGZvciBXaW5kb3dzIHRocmVhZGVkCiAgbmFtZSByZXNvbHZlciBidWlsZHMuIEZpeGVkIG5vdy4KCkRhbmllbCBGYW5kcmljaCAoOCBGZWIgMjAwOCkKLSBBZGRlZCBrZXkgd29yZHMgdG8gYWxsIFNTTC11c2luZyB0ZXN0cyBzbyB0aGV5IGNhbiBiZSBza2lwcGVkIGlmIG5lY2Vzc2FyeS4KICBSZW1vdmVkIGEgZmV3IHVubmVjZXNzYXJ5IHJlcXVpcmVzIFNTTCBzdGF0ZW1lbnRzLgoKRGFuaWVsIFMgKDggRmViIDIwMDgpCi0gTWlrZSBIb21tZXkgZmlsZWQgYW5kIGZpeGVkIGJ1ZyByZXBvcnQgIzE4ODk4NTYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg4OTg1Nik6IFdoZW4gdXNpbmcgdGhlIGdudXRscyBzc2wKICBsYXllciwgY2xlYW5pbmctdXAgYW5kIHJlaW5pdGlhbGl6aW5nIGN1cmwgZW5kcyB1cCB3aXRoIGh0dHBzIHJlcXVlc3RzCiAgZmFpbGluZyB3aXRoICJBU04xIHBhcnNlcjogRWxlbWVudCB3YXMgbm90IGZvdW5kIiBlcnJvcnMuIE9idmlvdXNseSBhCiAgcmVncmVzc2lvbiBhZGRlZCBpbiA3LjE2LjMuCgpZYW5nIFRzZSAoOCBGZWIgMjAwOCkKLSBJbXByb3ZlZCB0ZXN0IGhhcm5lc3MgU0NQL1NGVFAgc3RhcnQgdXAgc2VydmVyIHZlcmlmaWNhdGlvbiwgZG9pbmcgYSByZWFsCiAgY29ubmVjdGlvbiB0byB0aGUgc2Z0cCBzZXJ2ZXIsIGF1dGhlbnRpY2F0aW5nIGFuZCBydW5uaW5nIGEgc2ltcGxlIHNmdHAKICBwd2QgY29tbWFuZCB1c2luZyB0aGUgdGVzdCBoYXJuZXNzIGdlbmVyYXRlZCBjb25maWd1cmF0aW9uIGFuZCBrZXkgZmlsZXMuCgpEYW5pZWwgUyAoOCBGZWIgMjAwOCkKLSBH/G50ZXIgS25hdWYgYWRkZWQgbGliL21rLWNhLWJ1bmRsZS5wbCB3aGljaCBnZXRzIHRoZSBGaXJlZm94IGNhIGJ1bmRsZSBhbmQKICBjcmVhdGVzIGEgc3VpdGFibGUgY2EtYnVuZGxlLmNydCBmaWxlIGluIFBFTSBmb3JtYXQgZm9yIHVzZSB3aXRoIGN1cmwuIFRoZQogIHJlY29tbWVuZGVkIHdheSB0byBydW4gaXQgaXMgdG8gdXNlICdtYWtlIGNhLWJ1bmRsZScgaW4gdGhlIGJ1aWxkIHRyZWUgcm9vdC4KCkRhbmllbCBGYW5kcmljaCAoNyBGZWIgMjAwOCkKLSBBZGRlZCB0ZXN0cyAxMDIyIGFuZCAxMDIzIHRvIHZhbGlkYXRlIG91dHB1dCBvZiBjdXJsLWNvbmZpZyAtLXZlcnNpb24gYW5kCiAgLS12ZXJudW0KCkRhbmllbCBTICg3IEZlYiAyMDA4KQotIFJlZmFjdG9yZWQgYSBsb3Qgb2YgdGltZW91dCBjb2RlIGludG8gYSBmZXcgZnVuY3Rpb25zIGluIGFuIGF0dGVtcHQgdG8gbWFrZQogIHRoZW0gYWxsIHVzZSB0aGUgc2FtZSAoaG9wZWZ1bGx5IGNvcnJlY3QpIGxvZ2ljIHRvIG1ha2UgaXQgbGVzcyBlcnJvci1wcm9uZQogIGFuZCBlYXNpZXIgdG8gaW50cm9kdWNlIGxpYnJhcnktd2lkZSB3aGVyZSBpdCBzaG91bGQgYmUgdXNlZC4KCllhbmcgVHNlICg2IEZlYiAyMDA4KQotIEZpeCBhbiBpc3N1ZSBpbiBzdHJkdXAgcmVwbGFjZW1lbnQgZnVuY3Rpb24gd2hlbiBkZWFsaW5nIHdpdGggYWJzb2x1dGVseQogIGh1Z2Ugc3RyaW5ncy4gT25seSBzeXN0ZW1zIHdpdGhvdXQgYSBzdGFuZGFyZCBzdHJkdXAgd291bGQgYmUgYWZmZWN0ZWQuCgpEYW5pZWwgUyAoMyBGZWIgMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luIGNsZWFuZWQgdXAgdGhlIHBpcGVsaW5pbmcgY29kZSBhbmQgcmVtb3ZlZCB0aGUgbmVlZCBmb3IgYW5kCiAgdXNlIG9mIHRoZSAiaXNfaW5fcGlwZWxpbmUiIHN0cnVjdCBmaWVsZC4KCi0gSSB3cm90ZSB1cCBhbmQgYWRkZWQgdGhlIHRocmVhZGVkLXNzbC5jIGV4YW1wbGUgc291cmNlIGNvZGUgdGhhdCBzaG93cyBob3cKICB0byBkbyBtdWx0aS10aHJlYWRlZCBkb3dubG9hZHMgb2YgSFRUUFMgZmlsZXMgd2l0aCBhIGxpYmN1cmwgdGhhdCBpcyBidWlsdAogIHdpdGggT3BlblNTTC4gSXQgdXNlcyBwdGhyZWFkcyBmb3IgdGhlIHRocmVhZGluZy4KCkRhbmllbCBTICgzMSBKYW4gMjAwOCkKLSBOaWtsYXMgQW5nZWJyYW5kIG1hZGUgdGhlIGNvb2tpZSBzdXBwb3J0IGluIGxpYmN1cmwgcHJvcGVybHkgZGVhbCB3aXRoIHRoZQogICJIdHRwT25seSIgZmVhdHVyZSBpbnRyb2R1Y2VkIGJ5IE1pY3Jvc29mdCBhbmQgYXBwYXJlbnRseSBhbHNvIHN1cHBvcnRlZCBieQogIEZpcmVmb3g6IGh0dHA6Ly9tc2RuMi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzMwNDYuYXNweCAuIEh0dHBPbmx5CiAgaXMgbm93IHN1cHBvcnRlZCB3aGVuIHJlY2VpdmVkIGZyb20gc2VydmVycyBpbiBIVFRQIGhlYWRlcnMsIHdoZW4gd3JpdHRlbiB0bwogIGNvb2tpZSBqYXJzIGFuZCB3aGVuIHJlYWQgZnJvbSBleGlzdGluZyBjb29raWUgamFycy4KCiAgSSBtb2RpZmllZCB0ZXN0IGNhc2UgMzEgYW5kIDQ2IHRvIGFsc28gZG8gc29tZSBiYXNpYyBIdHRwT25seSB0ZXN0aW5nLgoKLSBEbWl0cnkgS3Vyb2Noa2luIG1vdmVkIHNldmVyYWwgc3RydWN0IGZpZWxkcyBmcm9tIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3QgdG8KICB0aGUgU2luZ2xlUmVxdWVzdCBvbmUgdG8gbWFrZSBwaXBlbGluaW5nIGJldHRlci4gSXQgaXMgYSBiaXQgdHJpY2t5IHRvIGtlZXAKICB0aGVtIGluIHRoZSByaWdodCBwbGFjZSwgdG8ga2VlcCB0aGluZ3MgcmVsYXRlZCB0byB0aGUgYWN0dWFsIHJlcXVlc3Qgb3IgdG8KICB0aGUgYWN0dWFsIGNvbm5lY3Rpb24gaW4gdGhlIHJpZ2h0IHBsYWNlLgoKRGFuaWVsIFMgKDI5IEphbiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW4gZml4ZWQgQ3VybF9kb25lKCkgZm9yIHBpcGVsaW5pbmcsIGFzIGl0IGNvdWxkIHByZXZpb3VzbHkKICBjcmFzaCEKCi0gTWljaGFsIE1hcmVrIGZpeGVkIG1pbm9yIG1pc3Rha2UgaW4gdGVzdCBjYXNlIDU1MyB0aGF0IHByZXZlbnRlZCBpdCBmcm9tCiAgd29ya2luZyBvbiBvdGhlciBJUC1hZGRyZXNzZXMgb3IgcG9ydCBudW1iZXJzLgoKVmVyc2lvbiA3LjE4LjAgKDI4IEphbnVhcnkgMjAwOCkKCkRhbmllbCBTICgyNyBKYW4gMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luOiBJbiAicmVhbCB3b3JsZCIgdGVzdGluZyBJIGZvdW5kIG1vcmUgYnVncyBpbgogIHBpcGVsaW5pbmcuIEJyb2tlbiBjb25uZWN0aW9uIGlzIG5vdCByZXN0b3JlZCBhbmQgd2UgZ2V0IGludG8gaW5maW5pdGUKICBsb29wLiBJdCBoYXBwZW5zIGJlY2F1c2Ugb2Ygd3JvbmcgaXNfaW5fcGlwZWxpbmUgdmFsdWVzLgoKRGFuaWVsIFMgKDI2IEphbiAyMDA4KQotIEtldmluIFJlZWQgZmlsZWQgYnVnIHJlcG9ydCAjMTg3OTM3NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODc5Mzc1KSB3aGljaCBkZXNjcmliZXMgaG93IGxpYmN1cmwKICBnb3QgbG9zdCBpbiB0aGlzIHNjZW5hcmlvOiBwcm94eSB0dW5uZWwgKG9yIEhUVFBTIG92ZXIgcHJveHkpLCBhc2sgdG8gZG8gYW55CiAgcHJveHkgYXV0aGVudGljYXRpb24gYW5kIHRoZSBwcm94eSByZXBsaWVzIHdpdGggYW4gYXV0aCAobGlrZSBOVExNKSBhbmQgdGhlbgogIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBhZnRlciB0aGF0IGluaXRpYWwgaW5mb3JtYXRpb25hbCByZXNwb25zZS4KCiAgbGliY3VybCB3b3VsZCBub3QgcHJvcGVybHkgcmUtaW5pdGlhbGl6ZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgcHJveHkgYW5kCiAgY29udGludWUgdGhlIGF1dGggbmVnb3RpYXRpb24gbGlrZSBzdXBwb3NlZC4gSXQgZG9lcyBub3cgaG93ZXZlciwgYXMgaXQgd2lsbAogIG5vdyBkZXRlY3QgaWYgb25lIG9yIG1vcmUgYXV0aGVudGljYXRpb24gbWV0aG9kcyB3ZXJlIGF2YWlsYWJsZSBhbmQgYXNrZWQKICBmb3IsIGFuZCB3aWxsIHRodXMgcmV0cnkgdGhlIGNvbm5lY3Rpb24gYW5kIGNvbnRpbnVlIGZyb20gdGhlcmUuCgotIEkgbWFkZSB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgZ2V0IGNhbGxlZCBwcm9wZXJseSBkdXJpbmcgcHJveHkgQ09OTkVDVC4KCkRhbmllbCBTICgyMyBKYW4gMjAwOCkKLSBJZ29yIEZyYW5jaHVrIHBvaW50ZWQgb3V0IHRoYXQgQ1VSTE9QVF9DT09LSUVMSVNUIHNldCB0byAiQUxMIiBsZWFrZWQKICBtZW1vcnksIGFuZCBzbyBkaWQgIlNFU1MiLiBGaXhlZCBub3cuCgpZYW5nIFRzZSAoMjIgSmFuIDIwMDgpCi0gQ2hlY2sgcG9sbC5oIGF0IGNvbmZpZ3VyYXRpb24gdGltZSwgYW5kIHVzZSBpdCB3aGVuIHN5cy9wb2xsLmggdW5hdmFpbGFibGUKCkRhbmllbCBTICgyMiBKYW4gMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luIHJlbW92ZWQgdGhlIGNhbmNlbGxlZCBzdGF0ZSBmb3IgcGlwZWxpbmluZywgYXMgd2UgYWdyZWVkCiAgdGhhdCBpdCBpcyBiYWQgYW55d2F5LiBTdGFydGluZyBub3csIHJlbW92aW5nIGEgaGFuZGxlIHRoYXQgaXMgaW4gdXNlZCBpbiBhCiAgcGlwZWxpbmUgd2lsbCBicmVhayB0aGUgcGlwZWxpbmUgLSBpdCdsbCBiZSBzZXQgYmFjayB1cCBhZ2FpbiBidXQgc3RpbGwuLi4KCllhbmcgVHNlICgyMSBKYW4gMjAwOCkKLSBEaXNhYmxlIGxkYXAgc3VwcG9ydCBmb3IgY3lnd2luIGJ1aWxkcywgc2luY2UgaXQgYnJlYWtzIHdob2xlIGJ1aWxkIHByb2Nlc3MuCiAgRml4aW5nIGl0IHdpbGwgYWZmZWN0IG90aGVyIHBsYXRmb3Jtcywgc28gaXQgaXMgcG9zdHBvbmVkIGZvciBhbm90aGVyIHJlbGVhc2UuCgpEYW5pZWwgUyAoMTggSmFuIDIwMDgpCi0gTGF1IEhhbmcgS2luIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZW4gZG9pbmcKICBDT05ORUNUIG92ZXIgYSBwcm94eS4gY3VybF9tdWx0aV9mZHNldCgpIGRpZG4ndCByZXBvcnQgYmFjayB0aGUgc29ja2V0CiAgcHJvcGVybHkgZHVyaW5nIHRoYXQgc3RhdGUsIGR1ZSB0byBhIG1pc3NpbmcgY2FzZSBpbiB0aGUgc3dpdGNoIGluIHRoZQogIG11bHRpX2dldHNvY2soKSBmdW5jdGlvbi4KCllhbmcgVHNlICgxNyBKYW4gMjAwOCkKLSBEb24ndCBhYm9ydCB0ZXN0cyA1MTggYW5kIDUzNyB3aGVuIHVuYWJsZSB0byByYWlzZSB0aGUgb3Blbi1maWxlIHNvZnQgbGltaXQuCgpEYW5pZWwgUyAoMTYgSmFuIDIwMDgpCi0gTmF0aGFuIENvdWx0ZXIncyBwYXRjaCB0aGF0IG1ha2VzIHJ1bnRlc3RzLnBsIHJlc3BlY3QgdGhlIFBBVEggd2hlbiBmaWd1cmluZwogIG91dCB3aGF0IHZhbGdyaW5kIHRvIHJ1bi4KCllhbmcgVHNlICgxNiBKYW4gMjAwOCkKLSBJbXByb3ZlZCBoYW5kbGluZyBvZiBvdXQgb2YgbWVtb3J5IGluIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB0aGF0IGFmZWN0ZWQKICBkYXRhIHVybCBlbmNvZGVkIEhUVFAgUE9TVHMgd2hlbiByZWFkaW5nIGl0IGZyb20gYSBmaWxlLgoKRGFuaWVsIFMgKDE2IEphbiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW4gd29ya2VkIGEgbG90IG9uIGltcHJvdmluZyB0aGUgSFRUUCBQaXBlbGluaW5nIHN1cHBvcnQgdGhhdAogIHByZXZpb3VzbHkgaGFkIGEgbnVtYmVyIG9mIGZsYXdzLCBwZXJoYXBzIG1vc3Qgbm90YWJseSB3aGVuIGFuIGFwcGxpY2F0aW9uCiAgZmlyZWQgdXAgTiB0cmFuc2ZlcnMgYXQgb25jZSBhcyB0aGVuIHRoZXkgd291bGRuJ3QgcGlwZWxpbmUgYXQgYWxsIHRoYXQKICBuaWNlbHkgYXMgYW55b25lIHdvdWxkIHRoaW5rLi4uIFRlc3QgY2FzZSA1MzAgd2FzIGFsc28gdXBkYXRlZCB0byB0YWtlIHRoZQogIGltcHJvdmVkIGZ1bmN0aW9uYWxpdHkgaW50byBhY2NvdW50LgoKLSBDYWxscyB0byBDdXJsX2ZhaWxmKCkgYXJlIG5vdCBzdXBwb3NlZCB0byBwcm92aWRlIGEgdHJhaWxpbmcgbmV3bGluZSBhcyB0aGUKICBmdW5jdGlvbiBpdHNlbGYgYWRkcyB0aGF0LiBGaXhlZCBvbiA1MCBvciBzb21ldGhpbmcgc3RyaW5ncyEKCkRhbmllbCBTICgxNSBKYW4gMjAwOCkKLSBJIG1hZGUgdGhlIHRvcnR1cmUgdGVzdCBvbiB0ZXN0IDUzMCBnbyB0aHJvdWdoLiBUaGlzIHdhcyBhY3R1YWxseSBkdWUgdG8KICBzaWxseSBjb2RlIGxlZnQgZnJvbSB3aGVuIHdlIHN3aXRjaGVkIHRvIGxldCB0aGUgbXVsdGkgaGFuZGxlICJob2xkIiB0aGUgZG5zCiAgY2FjaGUgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLi4uIE9mIGNvdXJzZSB0aGlzIG9ubHkgdHJpZ2dlcmVkIHdoZW4gYQogIGNlcnRhaW4gZnVuY3Rpb24gY2FsbCByZXR1cm5lZCBlcnJvciBhdCB0aGUgY29ycmVjdCBtb21lbnQuCgpEYW5pZWwgUyAoMTQgSmFuIDIwMDgpCi0gSm9lIE1hbGlja2kgZmlsZWQgYnVnIHJlcG9ydCAjMTg3MTI2OQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODcxMjY5KSBhbmQgd2UgY291bGQgZml4IGhpcyBoYW5nLQogIHByb2JsZW0gdGhhdCBvY2N1cnJlZCB3aGVuIGRvaW5nIGEgbGFyZ2UgSFRUUCBQT1NUIHJlcXVlc3Qgd2l0aCB0aGUKICByZXNwb25zZS1ib2R5IHJlYWQgZnJvbSBhIGNhbGxiYWNrLgoKRGFuaWVsIFMgKDEyIEphbiAyMDA4KQotIEkgcmUtYXJyYW5nZWQgdGhlIGN1cmwgLS1oZWxwIG91dHB1dC4gQWxsIHRoZSBvcHRpb25zIGFyZSBub3cgc29ydGVkIG9uCiAgdGhlaXIgbG9uZyBvcHRpb24gbmFtZXMgYW5kIGFsbCBkZXNjcmlwdGlvbnMgYXJlIG9uZS1saW5lcnMuCgotIEVyaWMgTGFuZGVzIHByb3ZpZGVkIHRoZSBwYXRjaCAoZWRpdGVkIGJ5IG1lKSB0aGF0IGludHJvZHVjZXMgdGhlCiAgLS1rZWVwYWxpdmUtdGltZSB0byBjdXJsIHRvIHNldCB0aGUga2VlcGFsaXZlIHByb2JlIGludGVydmFsLiBJIGFsc28gdG9vawogIHRoZSBvcHBvcnR1bml0eSB0byByZW5hbWUgdGhlIHJlY2VudGx5IGFkZGVkIG5vLWtlZXAtYWxpdmUgb3B0aW9uIHRvCiAgbm8ta2VlcGFsaXZlIHRvIGtlZXAgYSBjb25zaXN0ZW50IG5hbWluZyBhbmQgdG8gYXZvaWQgZ2V0dGluZyB0d28gZGFzaGVzIGluCiAgdGhlc2Ugb3B0aW9uIG5hbWVzLiBFcmljIGFsc28gcHJvdmlkZWQgYW4gdXBkYXRlIHRvIHRoZSBtYW4gcGFnZSBmb3IgdGhlIG5ldwogIG9wdGlvbi4KCkRhbmllbCBTICgxMSBKYW4gMjAwOCkKLSBEYW5pZWwgRWdnZXIgbWFkZSBDVVJMT1BUX1JBTkdFIHdvcmsgb24gZmlsZTovLyBVUkxzIHRoZSB2ZXJ5IHNhbWUgd2F5IGl0CiAgYWxyZWFkeSB3b3JrZWQgZm9yIEZUUDovLyBVUkxzLgoKLSBJIG1hZGUgdGhlIGN1cmwgdG9vbCBzd2l0Y2ggZnJvbSB1c2luZyBDVVJMT1BUX0lPQ1RMRlVOQ1RJT04gdG8gbm93IHVzZSB0aGUKICBzcGFua2luZyBuZXcgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gc2ltcGx5IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBpbXByb3ZlZAogIHBlcmZvcm1hbmNlIGZvciB0aGUgdXBsb2FkIHJlc3VtZSBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0byB1cGxvYWQgdGhlIGxhc3QKICBmZXcgYnl0ZXMgb2YgYSB2ZXJ5IGxhcmdlIGZpbGUuIFRvIGltcGxlbWVudCB0aGlzIGRlY2VudGx5LCBJIGhhZCB0byBzd2l0Y2gKICB0aGUgY2xpZW50IGNvZGUgZm9yIHVwbG9hZGluZyBmcm9tIGZvcGVuKCkvZnJlYWQoKSB0byBwbGFpbiBvcGVuKCkvcmVhZCgpIHNvCiAgdGhhdCB3ZSBjYW4gdXNlIGxzZWVrKCkgdG8gZG8gPjMyYml0IHNlZWtzIChhcyBmc2VlaygpIGRvZXNuJ3QgYWxsb3cgdGhhdCkKICBvbiBzeXN0ZW1zIHRoYXQgb2ZmZXIgc3VwcG9ydCBmb3IgdGhhdC4KCkRhbmllbCBTICgxMCBKYW4gMjAwOCkKLSBNaWNoYWwgTWFyZWsgbWFkZSBjdXJsLWNvbmZpZyAtLWxpYnMgbm90IGluY2x1ZGUgL3Vzci9saWI2NCBpbiB0aGUgb3V0cHV0CiAgKGl0IGFscmVhZHkgYmVmb3JlIHNraXBwZWQgL3Vzci9saWIpLiAgL3Vzci9saWI2NCBpcyB0aGUgZGVmYXVsdCBsaWJyYXJ5CiAgZGlyZWN0b3J5IG9uIG1hbnkgNjRiaXQgc3lzdGVtcyBhbmQgaXQncyB1bmxpa2VseSB0aGF0IGFueW9uZSB3b3VsZCB1c2UgdGhlCiAgcGF0aCBwcml2YXRlbHkgb24gc3lzdGVtcyB3aGVyZSBpdCdzIG5vdC4KCi0gR2VvcmcgTGlwcGl0c2NoIGJyb3VnaHQgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gYW5kIENVUkxPUFRfU0VFS0RBVEEgdG8gYWxsb3cKICBsaWJjdXJsIHRvIHNlZWsgaW4gYSBnaXZlbiBpbnB1dCBzdHJlYW0uIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCB3aGVuCiAgZG9pbmcgdXBsb2FkIHJlc3VtZXMgd2hlbiB0aGVyZSdzIGFscmVhZHkgYSBodWdlIHBhcnQgb2YgdGhlIGZpbGUgcHJlc2VudAogIHJlbW90ZWx5LiBCZWZvcmUsIGFuZCBzdGlsbCBpZiB0aGlzIGNhbGxiYWNrIGlzbid0IHVzZWQsIGxpYmN1cmwgd2lsbCByZWFkCiAgYW5kIHRocm91Z2ggYXdheSB0aGUgZW50aXJlIGZpbGUgdXAgdG8gdGhlIHBvaW50IHRvIHdoZXJlIHRoZSByZXN1bWluZwogIGJlZ2lucyAod2hpY2ggb2YgY291cnNlIGNhbiBiZSBhIHNsb3cgb3BlcmVyYXRpb24gZGVwZW5kaW5nIG9uIGZpbGUgc2l6ZSwKICBJL08gYmFuZHdpZHRoIGFuZCBtb3JlKS4gVGhpcyBuZXcgZnVuY3Rpb24gd2lsbCBhbHNvIGJlIHByZWZlcnJlZCB0byBnZXQKICB1c2VkIGluc3RlYWQgb2YgdGhlIENVUkxPUFRfSU9DVExGVU5DVElPTiBmb3Igc2Vla2luZyBiYWNrIGluIGEgc3RyZWFtIHdoZW4KICBkb2luZyBtdWx0aS1zdGFnZSBIVFRQIGF1dGggd2l0aCBQT1NUL1BVVC4KCi0gTmlraXRpbnNraXQgRG1pdHJpeSBmaWxlZCBidWcgcmVwb3J0ICMxODY4MjU1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NjgyNTUpIHdpdGggYSBwYXRjaC4gSXQgaWRlbnRpZmllcwogIGFuZCBmaXhlcyBhIHByb2JsZW0gd2l0aCBwYXJzaW5nIFdXVy1BdXRoZW50aWNhdGU6IGhlYWRlcnMgd2l0aCBhZGRpdGlvbmFsCiAgc3BhY2VzIGluIHRoZSBsaW5lIHRoYXQgdGhlIHBhcnNlciB3YXNuJ3Qgd3JpdHRlbiB0byBkZWFsIHdpdGguCgpEYW5pZWwgUyAoOCBKYW4gMjAwOCkKLSBJbnRyb2R1Y2luZyBjdXJsX2Vhc3lfcGF1c2UoKSBhbmQgbmV3IG1hZ2ljIHJldHVybiBjb2RlcyBmb3IgYm90aCB0aGUgcmVhZAogIGFuZCB0aGUgd3JpdGUgY2FsbGJhY2tzIHRoYXQgbm93IGNhbiBtYWtlIGEgY29ubmVjdGlvbidzIHJlYWRpbmcgYW5kL29yCiAgd3JpdGluZyBnZXQgcGF1c2VkLgoKRGFuaWVsIFMgKDYgSmFuIDIwMDgpCi0gSmVmZiBKb2huc29uIGZpbGVkIGJ1ZyByZXBvcnQgIzE4NjMxNzEKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg2MzE3MSkgd2hlcmUgaGUgcG9pbnRlZCBvdXQgdGhhdAogIGxpYmN1cmwncyBkYXRlIHBhcnNlciBkaWRuJ3QgYWNjZXB0IGEgKzEzMDAgdGltZSB6b25lIHdoaWNoIGFjdHVhbGx5IGlzIHVzZWQKICBmYWlybHkgb2Z0ZW4gKGxpa2UgTmV3IFplYWxhbmQncyBEYWlsaWdodCBTYXZpbmdzIFRpbWUpLCBzbyBJIG1vZGlmaWVkIHRoZQogIHBhcnNlciB0byBub3cgYWNjZXB0IHVwIHRvIGFuZCBpbmNsdWRpbmcgLTE0MDAgdG8gKzE0MDAuCgpEYW5pZWwgUyAoNSBKYW4gMjAwOCkKLSBCYXNlZCBvbiBmdXJ0aGVyIGRpc2N1c3Npb24gb24gY3VybC1saWJyYXJ5LCBJIHJldmVydGVkIHllc3RlcmRheSdzIFNPQ0tTNQogIGNvZGUgdG8gaW5zdGVhZCBpbnRyb2R1Y2Ugc3VwcG9ydCBmb3IgYSBuZXcgcHJveHkgdHlwZSBjYWxsZWQKICBDVVJMUFJPWFlfU09DS1M1X0hPU1ROQU1FIHRoYXQgaXMgdXNlZCB0byBzZW5kIHRoZSBob3N0IG5hbWUgdG8gdGhlIHByb3h5CiAgaW5zdGVhZCBvZiBJUCBhZGRyZXNzIGFuZCB0aGVyZSdzIHRodXMgbm8gbG9uZ2VyIGFueSBuZWVkIGZvciBhIG5ldwogIGN1cmxfZWFzeV9zZXRvcHQoKSBvcHRpb24uCgogIFRoZSBkZWZhdWx0IFNPQ0tTNSBwcm94eSBpcyBhZ2FpbiBiYWNrIHRvIHNlbmRpbmcgdGhlIElQIGFkZHJlc3MgdG8gdGhlCiAgcHJveHkuICBUaGUgbmV3IGN1cmwgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgZW5hYmxpbmcgc2VuZGluZyBob3N0IG5hbWUgdG8gYQogIFNPQ0tTNSBwcm94eSBpcyBub3cgLS1zb2NrczUtaG9zdG5hbWUuCgpEYW5pZWwgUyAoNCBKYW4gMjAwOCkKLSBCYXNlZCBvbiBNYXhpbSBQZXJlbmVzZW5rbydzIHBhdGNoLCB3ZSBub3cgZG8gU09DS1M1IG9wZXJhdGlvbnMgYW5kIGxldCB0aGUKICBwcm94eSBkbyB0aGUgaG9zdCBuYW1lIHJlc29sdmluZyBhbmQgb25seSBpZiAtLXNvY2tzNWlwIChvcgogIENVUkxPUFRfU09DS1M1X1JFU09MVkVfTE9DQUwpIGlzIHVzZWQgd2UgcmVzb2x2ZSB0aGUgaG9zdCBuYW1lIGxvY2FsbHkgYW5kCiAgcGFzcyBvbiB0aGUgSVAgYWRkcmVzcyBvbmx5IHRvIHRoZSBwcm94eS4KCllhbmcgVHNlICgzIEphbiAyMDA4KQotIE1vZGlmaWVkIHRlc3QgaGFybmVzcyB0byBhbGxvdyBTQ1AsIFNGVFAgYW5kIFNPQ0tTNCB0ZXN0cyB0byBydW4gd2l0aAogIE9wZW5TU0ggMi45LjksIFN1blNTSCAxLjAgb3IgbGF0ZXIgdmVyc2lvbnMuIFNPQ0tTNSB0ZXN0cyBuZWVkIE9wZW5TU0gKICAzLjcsIFN1blNTSCAxLjAgb3IgbGF0ZXIuCgpEYW5pZWwgUyAoMiBKYW4gMjAwOCkKLSBJIGZpeGVkIHR3byBjYXNlcyBvZiBtaXNzaW5nIHJldHVybiBjb2RlIGNoZWNrcyB3aGVuIGhhbmRsaW5nIGNodW5rZWQKICBkZWNvZGluZyB3aGVyZSBhIHdyaXRlIGVycm9yIChvciBhYm9ydCByZXR1cm4gZnJvbSBhIGNhbGxiYWNrKSBkaWRuJ3Qgc3RvcAogIGxpYmN1cmwncyBwcm9jZXNzaW5nLgoKLSBJIHJlbW92ZWQgdGhlIHNvY2tsZW5fdCB1c2UgZnJvbSB0aGUgcHVibGljIGN1cmwvY3VybC5oIGhlYWRlciBhbmQgaW5zdGVhZAogIG1hZGUgaXQgYW4gdW5zaWduZWQgaW50LiBUaGUgdHlwZSB3YXMgb25seSB1c2VkIGluIHRoZSBjdXJsX3NvY2thZGRyIHN0cnVjdAogIGRlZmluaXRpb24gKG9ubHkgdXNlZCBieSB0aGUgY3VybF9vcGVuc29ja2V0X2NhbGxiYWNrKS4gT24gYWxsIHBsYXRmb3JtcyBJCiAgY291bGQgZmluZCBpbmZvcm1hdGlvbiBhYm91dCwgc29ja2xlbl90IGlzIDMyIHVuc2lnbmVkIGJpdHMgbGFyZ2Ugc28gSSBkb24ndAogIHRoaW5rIHRoaXMgd2lsbCBicmVhayB0aGUgQVBJIG9yIEFCSS4gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyBvZgogIGNvdXJzZSBmb3IgYWxsIHRoZSBwbGF0Zm9ybXMgdGhhdCBkb24ndCBoYXZlIGEgc29ja2xlbl90IGRlZmluaXRpb24gaW4gdGhlaXIKICBoZWFkZXJzIHRvIGJ1aWxkIGZpbmUgYWdhaW4uIFByb3ZpZGluZyBvdXIgb3duIGNvbmZpZ3VyZSBtYWdpYyBhbmQgY3VzdG9tCiAgZGVmaW5pdGlvbiBvZiBzb2NrbGVuX3Qgb24gdGhvc2Ugc3lzdGVtcyBwcm92ZWQgdG8gd29yayBidXQgd2FzIGEgbG90IG9mCiAgY3J1ZnQsIGNvZGUgYW5kIGV4dHJhIG1hZ2ljIG5lZWRlZCAtIHdoZW4gdGhpcyB2ZXJ5IHNtYWxsIGNoYW5nZSBvZiB0eXBlCiAgc2VlbXMgaGFybWxlc3MgYW5kIHN0aWxsIHNvbHZlcyB0aGUgbWlzc2luZyBzb2NrbGVuX3QgcHJvYmxlbS4KCi0gUmljaGFyZCBBdHRlcmVyIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGFkZGVkIHN1cHBvcnQgZm9yIFNPQ0tTNGEgcHJveGllcywKICB3aGljaCBpcyBhbiBpbm9mZmljaWFsIFBST1hZNCB2YXJpYW50IHRoYXQgc2VuZHMgdGhlIGhvc3RuYW1lIHRvIHRoZSBwcm94eQogIGluc3RlYWQgb2YgdGhlIHJlc29sdmVkIGFkZHJlc3MgKHdoaWNoIGlzIGFscmVhZHkgc3VwcG9ydGVkIGJ5IFNPQ0tTNSkuCiAgLS1zb2NrczRhIGlzIHRoZSBjdXJsIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIGl0IGFuZCBDVVJMT1BUX1BST1hZVFlQRSBjYW4KICBub3cgYmUgc2V0IHRvIENVUkxQUk9YWV9TT0NLUzRBIGFzIHdlbGwuCgpEYW5pZWwgUyAoMSBKYW4gMjAwOCkKLSBNb2h1biBCaXN3YXMgcG9pbnRlZCBvdXQgdGhhdCAtLWxpYmN1cmwgZ2VuZXJhdGVkIGEgc291cmNlIGNvZGUgd2l0aCBhbiBpbnQKICBmdW5jdGlvbiBidXQgd2l0aG91dCBhIHJldHVybiBzdGF0ZW1lbnQuIFdoaWxlIGZpeGluZyB0aGF0LCBJIGFsc28gdG9vayBjYXJlCiAgYWJvdXQgYWRkaW5nIHNvbWUgYmV0dGVyIGNvbW1lbnRzIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuCgo=