ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDAxKQotIFZvanRlY2ggTWluYXJpayBzZXQgdXAgYSBzcGVjaWFsLXB1cnBvc2UgdGVzdCBzZXJ2ZXIgYW5kIHByb3ZpZGVkIG1lIHdpdGgKICB0ZXN0IGNlcnRpZmljYXRlcyBpbiBvcmRlciBmb3IgbWUgdG8gcmVwZWF0IHRoZSBidWcgcmVwb3J0cyAjNDQwMDY4IGFuZAogICM0NDAzNzMuIEl0IHR1cm5lZCBvdXQgd2UgZGlkbid0IGNoZWNrIGFsbCB0aGUgZXJyb3IgY29kZXMgcHJvcGVybHkuIFdlIGRvCiAgbm93LCBhbmQgY29ubmVjdGluZyB3aXRoIGEgdW5hY2NlcHRhYmxlIGNlcnRpZmljYXRlIHdpbGwgbWFrZSBsaWJjdXJsIGZhaWwKICB0byBjb25uZWN0IHdpdGggYW4gZXJyb3IgY29kZSByZXR1cm5lZC4KCi0gUmFtYW5hIE1va2thcGF0aSBmb3VuZCBhIGNhc2Ugd2hlbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBjb2RlIGRpZCB3cm9uZy4KICBJIHdyb3RlIGEgdGVzdCBjYXNlIGZvciB0aGlzICg0NSkuCgpWZXJzaW9uIDcuOS1wcmU3CgpEYW5pZWwgKDE3IFNlcHRlbWJlciAyMDAxKQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgZml4ZWQgdGVsbmV0IGZvciB3aW4zMi4gSXQgbWFrZXMgbGliY3VybCByZXF1aXJlCiAgd2luc29jayAyLjAuCgpWZXJzaW9uIDcuOS1wcmU2CgotIGxpYnRvb2wgMS40LjIgaXMgbm93IGluIHVzZSEKClZlcnNpb24gNy45LXByZTUKCkRhbmllbCAoMTQgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgYW5vdGhlciAxNCBmdHAgdGVzdHMuCgpEYW5pZWwgKDEzIFNlcHRlbWJlciAyMDAxKQotIEFkZGVkIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB0byB0aGUgZWFzeS5oIGhlYWRlciBmaWxlLiBJdCBoYXMgbm93IGJlZW4KICB0ZXN0ZWQgYW5kIHByb3ZlZCB0byB3b3JrIGluIGEgcmVhbC13b3JsZCB0ZXN0cyBieSBUIEJoYXJhdGguIFdlIHN0aWxsIG5lZWQKICB0byB3cml0ZSB1cCBzb21lIGRvY3MgZm9yIHRoaXMgZnVuY3Rpb24uCgotIEFkZGVkIGZvdXIgbW9yZSBmdHAgdGVzdHMgdG8gdGhlIHRlc3Qgc3VpdGUuCgpEYW5pZWwgKDEyIFNlcHRlbWJlciAyMDAxKQotIENVUkxPUFRfU1NMX0NJUEhFUl9MSVNUIHdhcyBhZGRlZCwgYW5kIHRoZSBjdXJsIHRvb2wgb3B0aW9uIGlzIG5hbWVkCiAgLS1jaXBoZXJzLiBVc2UgdGhlbSB0byBzcGVjaWZ5IGEgbGlzdCBvZiBjaXBoZXJzIHRvIHVzZSBpbiB0aGUgU1NMCiAgY29ubmVjdGlvbi4KCi0gVC4gQmhhcmF0aCBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIGxpYmN1cmwncyB3aW5kb3dzIHZlcnNpb24uIEl0IHR1cm5lZCBvdXQKICB0byBiZSB0aGUgbmV3IGR1cGhhbmRsZSgpIHRoYXQgZGlkbid0IHF1aXRlIHdvcmsgeWV0LgoKVmVyc2lvbiA3LjktcHJlNAoKRGFuaWVsICgxMSBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCB2ZXJib3NlIG91dHB1dCBmb3IgU1NMIGNvbm5lY3Rpb25zIHRoYXQgb3V0cHV0IHRoZSBzZXJ2ZXIKICBjZXJ0aWZpY2F0ZSdzIHN0YXJ0IGFuZCBleHBpcmUgZGF0ZXMuIEFzIHN1Z2dlc3RlZCBieSBQYXVsIEhhcnJpbmd0b24uCgotIEhlaWtraSBLb3JwZWxhIGZvdW5kIHByb2JsZW1zIGluIHRoZSBwZXJsIGZ0cCBzZXJ2ZXIgdXNlZCBmb3IgdGhlIHRlc3QKICBzdWl0ZSwgd2hlbiBoZSBydW5zIG9uIG9uIE9wZW5CU0Qgd2l0aCBwZXJsIDUuNi4gU29tZSBjaGFuZ2VzIGhhdmUgYmVlbgogIG1hZGUsIGJ1dCBub3RoaW5nIHJlYWxseSBjZXJ0YWluLgoKLSBULiBCaGFyYXRoIGhhcyBleHBlcmllbmNlZCBwcm9ibGVtcyB3aXRoIGxpYmN1cmwncyBzdGFjayB1c2FnZSBvbiB3aW5kb3dzCiAgYW5kIHdvcmtzIG9uIHJlZHVjaW5nIGl0LgoKRGFuaWVsICgxMCBTZXB0ZW1iZXIgMjAwMSkKLSBDcmlzIEJhaWxpZmYgZml4ZWQgdGhlIHBlcmwgaW50ZXJmYWNlLiBJdCBzdG9wcGVkIHdvcmtpbmcgc2luY2UgdGhlIGNoYW5nZWQKICBiZWhhdmlvciB3aXRoIFdSSVRFSEVBREVSIGFuZCBOVUxMIHBvaW50ZXJzLgoKLSBUaGUgIm91dHB1dCBjb29raWVzIiBmdW5jdGlvbiBjb3VsZCBkdW1wIGNvcmUgaWYgbm8gY29va2llcyB3ZXJlIGVuYWJsZWQuCgpEYW5pZWwgKDcgU2VwdGVtYmVyIDIwMDEpCi0gU00gcG9pbnRlZCBvdXQgdGhhdCB0aGUgU1NMIGNvZGUgZGlkbid0IGNvbXBpbGUgYW55IGxvbmdlciBpZiBTU0wgd2FzCiAgZGlzYWJsZWQuLi4gQWxzbywgd2UgbmVlZGVkIHRvIGNvcnJlY3QgdGhlICNpbmNsdWRlIGZvciB0aGUgdXRpbWUgc3R1ZmYgb24KICB3aW5kb3dzLgoKRGFuaWVsICg2IFNlcHRlbWJlciAyMDAxKQotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSBTU0wgc2Vzc2lvbiBjYWNoZSBjb2RlIHRoYXQgbWFkZSBpdAogIHNvbWV0aW1lcyByZWFkIGZyb20gYSBOVUxMIHBvaW50ZXIuCgpWZXJzaW9uIDcuOS1wcmUzCgpEYW5pZWwgKDMgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgdGhlIC1SLy0tcmVtb3RlLXRpbWUgb3B0aW9uLCB0aGF0IHVzZXMgdGhlIHJlbW90ZSBmaWxlJ3MgZGF0ZXN0YW1wIHRvCiAgc2V0IHRoZSBsb2NhbCBmaWxlJ3MgZGF0ZXN0YW1wLiBUaHVzLCB3aGVuIHlvdSBnZXQgYSByZW1vdGUgZmlsZSB5b3VyIGxvY2FsCiAgZmlsZSB3aWxsIGdldCB0aGUgc2FtZSB0aW1lIGFuZCBkYXRlLiBOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIHdoZW4geW91IHVzZQogIC1vIG9yIC1PLgoKLSBJbnN0YWxsZWQgbGlidG9vbCAxLjQuMSwgbGlidG9vbGl6ZWQgYW5kIGV2ZXJ5dGhpbmcuCgpEYW5pZWwgKDEgU2VwdGVtYmVyIDIwMDEpCi0gSGVpa2tpIEtvcnBlbGEgcG9pbnRlZCBvdXQgdGhhdCBJIGRpZCBub3Qgc2hpcCB0aGUgcHJvcGVyIGxpYnRvb2wgc3R1ZmYgaW4gCiAgdGhlIHByZS1yZWxlYXNlcywgZXZlbiB0aG91Z2ggdGhhdCB3YXMgbXkgaW50ZW50aW9uLiBsaWJ0b29saXplIGhhcyBub3cKICBiZWVuIHJlLXJ1bi4KCi0gSGVpa2tpIGFsc28gcGF0Y2hlZCBhd2F5IHRoZSBiYWQgdXNlIG9mICdtYWtlIC1DJyBpbiB0aGUgdGVzdCBzdWl0ZQogIG1ha2VmaWxlLiBtYWtlIC1DIGlzIG5vdCB2ZXJ5IHBvcnRhYmxlIGFuZCBpcyBub3cgYmFubmVkIGZyb20gaGVyZS4KClZlcnNpb24gNy45LXByZTIKCkRhbmllbCAoMzEgQXVndXN0IDIwMDEpCi0gSSBqdXN0IG1hZGUgYSBodWdlIGludGVybmFsIHN0cnVjdCByZWhhdWwsIGFuZCBhbGwgdGhlIGJpZyBpbnRlcm5hbGx5IHVzZWQKICBzdHJ1Y3RzIGhhdmUgYmVlbiByZW5hbWVkLCByZWRlc2lnbmVkIGFuZCBzdHVmZiBoYXZlIGJlZW4gbW92ZWQgYXJvdW5kIGEgYml0CiAgdG8gbWFrZSB0aGUgc291cmNlIGVhc2llciB0byBmb2xsb3csIG1vcmUgbG9naWNhbGx5IGdyb3VwZWQgYW5kIHRvIGhvcGVmdWxseQogIGRlY3JlYXNlIGZ1dHVyZSBidWdzLiBJIGFsc28gaG9wZSB0aGF0IHRoaXMgd2lsbCBtYWtlIG5ldyBmdW5jdGlvbnMgdG8gZ2V0CiAgZWFzaWVyIHRvIGFkZCwgYW5kIG1ha2UgaXQgbGVzcyBsaWtlbHkgdGhhdCB3ZSBoYXZlIGJ1Z3MgbGVmdCBsaWtlIHRoZSBVUkwtCiAgZnJlZSBidWcgZnJvbSBBdWd1c3QgMjMuCgpWZXJzaW9uIDcuOS1wcmUxCgpEYW5pZWwgKDI5IEF1Z3VzdCAyMDAxKQotIFRoZSBuZXcgY29va2llIGNvZGUgaGF2ZSBlbmFibGVkIHRoZSBicmFuZCBuZXcgJy1jLy0tY29va2llLWphcicgb3B0aW9uLiBVc2UKICB0aGF0IHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBpbiB3aGljaCB5b3Ugd2FudCB0byBoYXZlIGFsbCBjb29raWVzIGN1cmwKICBrbm93cyBvZiwgZHVtcGVkIHRvLiBJdCdsbCBiZSB3cml0dGVuIHVzaW5nIHRoZSBuZXRzY2FwZSBjb29raWUgZm9ybWF0LgoKICBUaGlzIGlzIGludGVybmFsbHkgZG9uZSB3aXRoIHRoZSBuZXcgQ1VSTE9QVF9DT09LSUVKQVIgb3B0aW9uIHRvIGxpYmN1cmwsCiAgd2hpY2ggaW4gdHVybiBkdW1wcyB0aGlzIGluZm9ybWF0aW9uIHdoZW4gY3VybF9lYXN5X2NsZWFudXAoKSBpcyBpbnZva2VkLgogIFRoZXJlIG1pZ2h0IGJlIHJlYXNvbnMgdG8gcmUtY29uc2lkZXIgbXkgY2hvaWNlIG9mIHB1dHRpbmcgaXQgdGhlcmUuIFBlcmhhcHMKICBpdCBpcyBiZXR0ZXIgcGxhY2VkIHRvIGdldCBkb25lIGp1c3QgYmVmb3JlICpfcGVyZm9ybSgpIGlzIGRvbmUuIEl0IGlzIGFsbAogIG9mIGNvdXJzZSBkZXBlbmRpbmcgb24gaG93IHlvdSBndXlzIHdhbnQgdG8gdXNlIHRoaXMgZmVhdHVyZS4uLgoKLSBBZGRlZCBmdHB1cGxvYWQuYyBpbiB0aGUgc291cmNlIGV4YW1wbGVzIHNlY3Rpb24sIGJhc2VkIG9uIHNvdXJjZSBjb2RlIHBvc3RlZAogIGJ5IEVyaWNrIE51d2VuZGFtLgoKRGFuaWVsICgyOCBBdWd1c3QgMjAwMSkKLSBOb3cgcnVubmluZyBsaWJ0b29sIENWUyBicmFuY2gtMS00IHRvIGdlbmVyYXRlIHN0dWZmLiBTaG91bGQgZml4IHByb2JsZW1zCiAgb24gT3BlbkJTRCBhbmQgaG9wZWZ1bGx5IG9uIEZyZWVCU0QgYXMgd2VsbCEKCi0gR2VvcmcgSHVldHRlbmVnZ2VyIG1vZGlmaWVkIHRoZSBjdXJsX2Zvcm1hZGQoKSBmdW5jdGlvbmFsaXR5IHNsaWdodGx5LCBhbmQKICBhZGRlZCBzdXBwb3J0IGZvciBlcnJvciBjb2RlIDQxNyB3aGVuIGRvaW5nIGZvcm0gcG9zdCBhbmQgdXNpbmcgdGhlIEV4cGVjdDoKICBoZWFkZXIuIEdyZWF0IHdvcmshCgotIE1hZGUgc29tZSB0ZXN0cyB3aXRoIGNhY2hlZCBTU0wgc2Vzc2lvbiBJRHMsIGFuZCB0aGV5IHNlZW0gdG8gd29yay4gVGhlcmUKICBzaG91bGQgYmUgYSBzaWduaWZpY2FudCBzcGVlZCBpbXByb3ZlbWVudCBpbiB0aGUgU1NMIGNvbm5lY3Rpb24gcGhhc2UsIGJ1dAogIGluIG15IHRpbnkgdGVzdHMgaXQganVzdCBpc24ndCBwb3NzaWJsZSB0byBub3RpY2UgYW55IGRpZmZlcmVuY2UuIExpa2Ugb3RoZXIKICBjYWNoaW5nIGluIGxpYmN1cmwsIHlvdSBtdXN0IHJldXNlIHRoZSBzYW1lIGhhbmRsZSBmb3IgdGhlIGNhY2hpbmcgdG8gdGFrZQogIGVmZmVjdC4gU1NMIHNlc3Npb24gSUQgY2FjaGluZyBpcyBkb25lIG9uIGEgcGVyIGhvc3QtbmFtZSBhbmQgZGVzdGluYXRpb24KICBwb3J0IG51bWJlciBiYXNpcy4KCiAgU2V0IHZlcmJvc2UsIGFuZCB5b3UnbGwgZ2V0IGluZm9ybWF0aW9uYWwgdGVzdHMgd2hlbiBsaWJjdXJsIGRldGVjdHMgYW5kCiAgdXNlcyBhIHByZXZpb3VzIFNTTCBzZXNzaW9uIElELgoKLSBVcGdyYWRlZCB0byBhdXRvbWFrZSAxLjUgb24gbXkgZGV2ZWxvcG1lbnQvcmVsZWFzZSBtYWNoaW5lLgoKRGFuaWVsICgyNyBBdWd1c3QgMjAwMSkKLSBTbG93bHkgc3RhcnRlZCB3cml0aW5nIFNTTCBzZXNzaW9uIElEIGNhY2hpbmcgY29kZQoKRGFuaWVsICgyNCBBdWd1c3QgMjAwMSkKLSBULiBCaGFyYXRoIHJlbW92ZWQgY29tcGlsZXIgd2FybmluZ3Mgb24gd2luZG93cyBhbmQgdXBkYXRlZCB0aGUgTVMgcHJvamVjdAogIGZpbGVzLgoKLSBLZXZpbiBSb3RoIHJlcG9ydGVkIHR3byBraW5kcyBvZiBjb21tYW5kIGxpbmUgY29uc3RydWN0cyB3aXRoIHRoZSBuZXcgLUcgdGhhdAogIGN1cmwgZGlkbid0IHJlYWxseSBkZWFsIHdpdGggdGhlIHdheSBvbmUgd291bGQgbGlrZS4KCi0gVGltIENvc3RlbGxvIHBhdGNoZWQgYXdheSBhIHVzZSBvZiBzdHJjYXNlY21wKCkgaW4gdGhlIFNTTCBjb2RlLiBXZSBoYXZlIG91cgogIG93biBwb3J0YWJsZSB2ZXJzaW9uIG5hbWVkIHN0cmVxdWFsKCkgdGhhdCBzaG91bGQgYmUgdXNlZCEKCi0gVGltIGFsc28gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIGluIHRoZSBsaWIvTWFrZWZpbGUudmM2IGZpbGUgdGhhdCBtYWRlIGl0IG1peAogIGRlYnVnIG9iamVjdCBtb2R1bGVzIGNhdXNpbmcgY29uZnVzaW9ucy4KCkRhbmllbCAoMjMgQXVndXN0IDIwMDEpCi0gVC4gQmhhcmF0aCBhY2N1cmF0ZWx5IGZvdW5kIGEgbGliY3VybCBidWcgdGhhdCB3b3VsZCBoYXBwZW4gd2hlbiBkb2luZyBhCiAgc2Vjb25kIGludm9rZSBvZiBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdpdGggYSBuZXcgVVJMIHdoZW4gdGhlIHByZXZpb3VzIGludm9rZQogIGZvbGxvd2VkIGEgTG9jYXRpb246IGhlYWRlci4KCi0gU3RhcnRlZCB0aGUgaW1wcm92ZW1lbnQgd29yayBvbiB0aGUgY29va2llIGVuZ2luZToKICAtIE5vdyBrZWVwcyBjb29raWVzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBjb29raWUgZmlsZQogIC0gQSB3cml0ZSB0byB0aGUgcG9zc2libHkgc3RhdGljIHN0cmluZyB3YXMgcmVtb3ZlZAogIC0gQWRkZWQgYSBmdW5jdGlvbiB0aGF0IGNhbiBvdXRwdXQgYWxsIGNvb2tpZXMKICAtIE5vdyBzdXBwb3J0cyByZWFkaW5nIG11bHRpcGxlIGNvb2tpZSBmaWxlcwoKLSBTdGV2ZSBMaG9tbWUgY29ycmVjdGVkIGEgRExMIG5hbWluZyBpc3N1ZSBpbiB0aGUgTVNWQysrIHByb2plY3QgZmlsZS4KCi0gU3BsaXQgdXAgdGhlIG1vbnN0ZXIgZnVuY3Rpb24gaW4gbGliL2Z0cC5jIHRvIHVzZSBtb3JlIHNtYWxsaXNoIGZ1bmN0aW9ucyB0bwogIGluY3JlYXNlIHJlYWRhYmlsaXR5IGFuZCBtYWludGFpbmFiaWxpdHkuCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAxKQotIEdlb3JnIEh1ZXR0ZW5lZ2dlcidzIGJpZyBwYXRjaCB3YXMgYXBwbGllZC4gTm93IHdlIGhhdmU6CiAgbyAiRXhwZWN0OiAxMDAtY29udGludWUiIHN1cHBvcnQuIFdlIHdpbGwgZnJvbSBub3cgb24gc2VuZCB0aGF0IGhlYWRlciBpbgogICAgYWxsIHJmYzE4NjctcG9zdHMsIGFzIHRoYXQgbWFrZXMgdXMgYWJvcnQgbXVjaCBmYXN0ZXIgd2hlbiB0aGUgc2VydmVyCiAgICByZWplY3RzIG91ciBQT1NULiBQb3N0aW5nIHdpdGhvdXQgdGhlIEV4cGVjdDogaGVhZGVyIGlzIHN0aWxsIHBvc3NpYmxlIGluCiAgICB0aGUgc3RhbmRhcmQgcmVwbGFjZS1pbnRlcm5hbC1oZWFkZXIgc3R5bGUuCiAgbyBjdXJsX2Zvcm1hZGQoKSBpcyBhIG5ldyBmb3JtcG9zdCBidWlsZGluZyBmdW5jdGlvbiB0aGF0IGlzIGludHJvZHVjZWQgdG8KICAgIHJlcGxhY2UgdGhlIG5vdyBkZXByZWNhdGVkIGN1cmxfZm9ybXBhcnNlKCkgZnVuY3Rpb24uIFRoZSBsYXR0ZXIgZnVuY3Rpb24KICAgIHdpbGwgc3RpbGwgaGFuZyBhcm91bmQgZm9yIGEgd2hpbGUsIGJ1dCB0aGUgY3VybF9mb3JtYWRkKCkgaXMgdGhlIG5ldyB3YXkKICAgIGFuZCBjb3JyZWN0IHdheSB0byBidWlsZCBmb3JtIHBvc3RzLgogIG8gRG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlc2UgY2hhbmdlcwoKICBUaGVzZSBjaGFuZ2VzIGFyZSByZWFzb24gZW5vdWdoIHRvIG5hbWUgdGhlIG5leHQgY3VybCByZWxlYXNlIDcuOS4uLgoKLSBXZSBub3cgY29udmVydCBtYW4gcGFnZXMgdG8gSFRNTCBwYWdlcyBhbmQgaW5jbHVkZSB0aGVtIGluIHRoZSByZWxlYXNlCiAgYXJjaGl2ZS4gRm9yIHRoZSBwbGVhc3VyZSBvZiBldmVyeW9uZSB3aXRob3V0IG5yb2ZmIHdpdGhpbiByZWFjaC4KCi0gQW5kculzIEdhcmPtYSdzIHN1Z2dlc3RlZCBmbHVzaGluZyBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgb3V0cHV0IHN0cmVhbSB3YXMKICBhZGRlZC4gSXQgc2hvdWxkIG1ha2UgdGhlIHByb2dyZXNzIG1ldGVyIGxvb2sgYmV0dGVyIG9uIFdpbmRvd3MuCgotIFRyb3kgRW5nZWwgcG9pbnRlZCBvdXQgYSBtaXN0YWtlIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHRoYXQgbWFkZSBpdCBmYWlsCiAgb24gbWFueSBSZWQgSGF0IGJveGVzIQoKRGFuaWVsICgyMCBBdWd1c3QgMjAwMSkKLSBXZSBuZWVkIGFuIHVwZGF0ZWQgbGlidG9vbCB0byBtYWtlIGEgYmV0dGVyIGJ1aWxkIGVudmlyb25tZW50IGZvciBPcGVuQlNECiAgYXMgd2VsbCBhcyBGcmVlQlNECgpWZXJzaW9uIDcuOC4xCgpEYW5pZWwgKDIwIEF1Z3VzdCAyMDAxKQotIEJyYWQgcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaGlwIHR3byBleHRyYSBsaWJ0b29sIGZpbGVzIGluIHRoZSB0YXJiYWxscyB0aGF0CiAgd2UgcmVhbGx5IGRvbid0IG5lZWQgdG8hIFJlbW92aW5nIHRoZW0gbWFrZXMgdGhlIGd6LWFyY2hpdmUgYWJvdXQgNjBLCiAgc21hbGxlciEKCi0gQWxiZXJ0IENoaW4gYnJvdWdodCBmaXhlcyBmb3IgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gZGV0ZWN0IHNvY2tsZW5fdAogIHByb3Blcmx5IGFzIHdlbGwgYXMgbW92aW5nIGxvdHMgb2Ygb3VyIGN1c3RvbSBhdXRvY29uZiBtYWNyb3MgdG8KICBhY2luY2x1ZGUubTQuCgpEYW5pZWwgKDE5IEF1Z3VzdCAyMDAxKQotIE1vb25lc2FteSBpbXByb3ZlZCBoaXMgLUcgZmVhdHVyZSBmb3IgaG9zdCBuYW1lcyBvbmx5IFVSTHMuLi4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDEpCi0gRmluYWxseSBjbGVhbmVkIHVwIHRoZSBrZXJiZXJvcyBjb2RlIHRvIHVzZSBDdXJsXyBwcmVmaXhlcyBvbiBhbGwgZ2xvYmFsCiAgc3ltYm9scyBhbmQgdG8gbm90IHVzZSBnbG9iYWwgdmFyaWFibGVzLgoKVmVyc2lvbiA3LjguMS1wcmU2CgpEYW5pZWwgKDE2IEF1Z3VzdCAyMDAxKQotIFMuIE1vb25lc2FteSBhZGRlZCB0aGUgLUcgb3B0aW9uIHRvIGN1cmwsIHRoYXQgY29udmVydHMgdGhlIGRhdGEgc3BlY2lmaWVkCiAgd2l0aCAtZCB0byBhIEdFVCByZXF1ZXN0LiBEZWZhdWx0IGFjdGlvbiB3aGVuIHVzaW5nIC1kIGlzIFBPU1QuIFdoZW4gLUcgaXMKICB1c2VkLCB0aGUgLWQgc3BlY2lmaWVkIGRhdGEgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgVVJMIHdpdGggYSAnPycKICBzZXBhcmF0b3IuIEFzIHN1Z2dlc3RlZCBwcmV2aW91c2x5IGJ5IEtldmluIFJvdGguCgotIGN1cmwtY29uZmlnIC0tbGlicyBzaG91bGQgbm93IGRpc3BsYXkgYWxsIGxpbmtlciBvcHRpb25zIHJlcXVpcmVkIHRvIGxpbmsKICB3aXRoIGxpYmN1cmwuIEl0IGluY2x1ZGVzIHRoZSBwYXRoIGFuZCBvcHRpb25zIGZvciBsaWJjdXJsIGl0c2VsZi4KICBjdXJsLWNvbmZpZyAtLWNmbGFncyBkaXNwbGF5cyB0aGUgY29tcGlsZXIgb3B0aW9uKHMpIG5lZWRlZCB0byBjb21waWxlCiAgc291cmNlIGZpbGVzIHRoYXQgdXNlIGxpYmN1cmwgZnVuY3Rpb25zLiBCYXNpY2FsbHksIHRoYXQgc2V0cyB0aGUgaW5jbHVkZQogIHBhdGggY29ycmVjdC4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDEpCi0gQXJrYWRpdXN6IE1pc2tpZXdpY3ogcG9pbnRlZCBvdXQgYSBtaXN0YWtlIGluIGhvdyBJUHY2LXN0eWxlIElQLWFkZHJlc3NlcwogIHdlcmUgcGFyc2VkIGFuZCB1c2VkLiAoUkZDMjczMi1mb3JtYXQpCgotIEJ1ZyAjMTI3MzMgb3ZlciBvbiBwaHAubmV0IGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIGxpYmN1cmwgdGhhdCBtYWRlIGl0IGNvcmUKICBkdW1wIGlmIHlvdSB1c2VkIENVUkxPUFRfUE9TVCB3aXRob3V0IHNldHRpbmcgYW55IGRhdGEgdG8gcG9zdCB3aXRoCiAgQ1VSTE9QVF9QT1NURklFTERTISBUaGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZS4gTm90IHVzaW5nIENVUkxPUFRfUE9TVEZJRUxEUwogIG5vdyBlcXVhbHMgc2V0dGluZyBpdCB0byBubyBkYXRhIGF0IGFsbC4KCi0gUmFtYW5hIE1va2thcGF0aSByZXBvcnRlZCB0aGF0IGN1cmwgd2l0aCAnLXcgJXtodHRwX2NvZGV9JyBkaWRuJ3Qgd29yawogIHByb3Blcmx5IHdoZW4gdXNlZCBmb3IgbXVsdGlwbGUgVVJMcyBvbiBhIHNpbmdsZSBjb21tYW5kIGxpbmUuIEluZGVlZCwgdGhlCiAgdmFyaWFibGUgd2FzIG5vdCByZXNldCBiZXR3ZWVuIHRoZSByZXF1ZXN0cy4gVGhpcyBpcyBub3cgZml4ZWQuCgotIERhdmlkIEphbWVzIGZpeGVkIHRoZSBCb3JsYW5kIG1ha2VmaWxlIHNvIHRoYXQgbGliY3VybCBzdGlsbCBjb21waWxlcyBhbmQKICBidWlsZHMgd2l0aCB0aGF0IGNvbXBpbGVyLgoKRGFuaWVsICgxNCBBdWd1c3QgMjAwMSkKLSBPb3BzLiBJIHJ1aW5lZCBOaWNvJ3Mgc29ja2xlbl90IGRlZmluZSBpbiBjb25maWctdm1zLmgsIGNvcnJlY3RlZCBpdCBub3cuCgotIEFuIG9sZGVyIGl0ZW0gbm90IG1lbnRpb25lZCBoZXJlIGJlZm9yZTogQ1VSTF9HTE9CQUxfV0lOMzIgaXMgYSBkZWZpbmUgZm9yCiAgd2luZG93cyB1c2VycyB0byBjdXJsX2dsb2JhbF9pbml0KCksIHRoYXQgbWFrZXMgbGliY3VybCBpbml0IHRoZSB3aW5zb2NrCiAgc3R1ZmYuIElmIGxpYmN1cmwgaXMgYWxsIHNvY2tldCBzdHVmZiB5b3UgZG8sIHRoZW4gYWxsb3dpbmcgaXQgdG8gZmlkZGxlCiAgd2l0aCB0aGlzIGlzIGEgY29tZm9ydGFibGUgc2hvcnRjdXQgdG8gZmFtZS4KClZlcnNpb24gNy44LjEtcHJlNQoKRGFuaWVsICgxNCBBdWd1c3QgMjAwMSkKLSBOaWNvIEJhZ2d1cyBwcm92aWRlZCBtb3JlIGZlZWRiYWNrIGZyb20gaGlzIFZNUyBwb3J0aW5nIGVmZm9ydHMgYW5kIGEgZmV3CiAgbWlub3IgY2hhbmdlcyB3ZXJlIG5lY2Vzc2FyeS4KCi0gSSBtb2RpZmllZCBjb25maWd1cmUuaW4gc28gdGhhdCAtLWVuYWJsZS1kZWJ1ZyBzZXRzIG1vcmUgcGlja3kgZ2NjIG9wdGlvbnMuCiAgSSB0aGVuIHJlbW92ZWQgYWxtb3N0IGFsbCB0aGUgbmV3IHdhcm5pbmdzIHRoYXQgYXBwZWFyZWQsIGFuZCBieSBkb2luZyBzbyBJCiAgY29ycmVjdGVkIHRoZSBzaXplX3QtdHJlYXRlZC1hcy1zaWduZWQgcHJvYmxlbSB0aGF0IGhhcyBiZWVuIGRpc2N1c3NlZCBvbgogIHRoZSBtYWlsaW5nIGxpc3QgcHJldmlvdXNseS4gSSBhbHNvIHJlbW92ZWQgYSBidW5jaCBvZiB0aGUganVzdCByZWNlbnRseQogIGFkZGVkICNpZmRlZiBWTVMgbGluZXMuCgotIEkgcmVtb3ZlZCB0aGUgdXNlIG9mIGEgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSBTU0wgY29kZS4gSXQgd2FzIG9uY2UKICBuZWNlc3NhcnkgYnV0IGhhc24ndCBiZWVuIG5lZWRlZCBzaW5jZSBPcGVuU1NMIDAuOS40LiBUaGUgb2xkIGNvZGUgc2hvdWxkCiAgKGhvcGVmdWxseSkgc3RpbGwgd29yayBpZiBsaWJjdXJsIGlzIGJ1aWx0IGFnYWluc3QgYW4gYW5jaWVudCB2ZXJzaW9uIG9mCiAgT3BlblNTTC4KCkRhbmllbCAoMTMgQXVndXN0IDIwMDEpCi0gUGV0ZXIgVG9kZCBwb3N0ZWQgYSBwYXRjaCB0aGF0IG5vdyBhbGxvd3Mgbm9uLWZpbGUgcmMxODY3LXN0eWxlIGZvcm0gcG9zdHMKICB0byBiZSBsYXJnZXIgdGhhbiA0Sy4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDEpCi0gUy4gTW9vbmVzYW15IGZpeGVkIGJ1Z3MgZm9yIGJ1aWxkaW5nIGRlYnVnIGFuZCBTU0wgbGliIGluIFZDIG1ha2VmaWxlCgpEYW5pZWwgKDkgQXVndXN0IDIwMDEpCi0gVGhlIHJlZGlyZWN0ZWQgZXJyb3Igc3RyZWFtIHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjdXJsX2Vhc3lfY2xlYW51cCgpIGNhbGwKICB3YXMgbWFkZSwgYW5kIHdoZW4gVkVSQk9TRSB3YXMgZW5hYmxlZCwgdGhlIGNsZWFudXAgZnVuY3Rpb24gdHJpZWQgdG8gdXNlCiAgdGhlIHN0cmVhbS4gSXQgY291bGQgbGVhZCB0byBhIHNlZ21lbnRhdGlvbiBmYXVsdC4gQWxzbywgdGhlIHN0cmVhbSB3YXMKICBjbG9zZWQgZXZlbiBpZiB3ZSBsb29wZWQgdG8gZ2V0IG1vcmUgZmlsZXMuICBDb3JyZWN0cyBEdXN0aW4gQm9zd2VsbCdzIGJ1ZwogIHJlcG9ydCAjNDQxNjEwCgotIE5vdyBnZW5lcmF0ZXMgdGhlIHJlbGVhc2UgY29uZmlndXJlIHNjcmlwdCB3aXRoIGF1dG9jb25mIDIuNTIKClZlcnNpb24gNy44LjEtcHJlNAoKRGFuaWVsICg4IEF1Z3VzdCAyMDAxKQotIGN1cmwgLUUgdXNlcyBhIGNvbG9uIHRvIHNlcGFyYXRlIGEgZmlsZSBuYW1lIGZyb20gYSBwYXNzcGhyYXNlLiBUaGlzIHR1cm5lZAogIG91dCByZWFsbHkgYmFkIGZvciB0aGUgd2luZG93cyBwZW9wbGUgd2hvIHdhbnRzIHRvIGluY2x1ZGUgYSBkcml2ZSBsZXR0ZXIgaW4KICB0aGUgZmlsZSBuYW1lIGxpa2UgImM6XGNlcnQucGVtIi4gVGhlcmUncyBub3cgYSB3aW4zMiB3b3JrLWFyb3VuZAogIGltcGxlbWVudGVkIHRoYXQgdHJpZXMgd29yayBhcm91bmQgdGhhdCwgd2hlbiB0aGUgY29sb24gc2VlbXMgdG8gYmUgdXNlZCBmb3IKICB0aGlzIGtpbmQgb2YgY29uc3RydWN0LgoKLSBQYXRyaWNrIEJpaGFuLUZhb3UgaW50cm9kdWNlZCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCB3aGljaCBtYWtlcyBjdXJsCiAgdmVyaWZ5IHRoZSBzZXJ2ZXIncyBDTiBmaWVsZCB3aGVuIHRhbGtpbmcgaHR0cHM6Ly8uIElmIC0tY2FjZXJ0IGlzIG5vdCB1c2VkLAogIGFueSBmYWlsdXJlcyBpbiBtYXRjaGluZyBpcyBvbmx5IGRpc3BsYXllZCBhcyBpbmZvcm1hdGlvbiAoLXYpLgoKRGFuaWVsICg3IEF1Z3VzdCAyMDAxKQotIFdyb3RlIHVwIG5pbmUgbW9yZSB0ZXN0IGNhc2VzLCBtb3JlIG9yIGxlc3MgY29udmVydGVkIGZyb20gdGhlIGZvcm1lciB0ZXN0CiAgc3VpdGUuCgpEYW5pZWwgKDYgQXVndXN0IDIwMDEpCi0gSGVpa2tpIEtvcnBlbGEgcG9zdGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyAnY3VybC1jb25maWcgLS1saWJzJyBpbmNsdWRlIHRoZQogIGRpcmVjdG9yeSBpbiB3aGljaCBsaWJjdXJsIGl0c2VsZiBpcyBpbnN0YWxsZWQgaW4uIFdoaWxlIHRoaXMgd2Fzbid0IG15CiAgaW5pdGlhbCBpbnRlbnRpb24gd2l0aCB0aGlzIG9wdGlvbiwgaXQgbWFrZXMgc2Vuc2UgYW5kIG1ha2VzIGxpbmtpbmcgd2l0aAogIGxpYmN1cmwgZWFzaWVyLgoKLSBTdGVmYW4gVWxyaWNoIHBvaW50ZWQgb3V0IHRvIHVzIHRoYXQgb3RoZXIgdG9vbHMgYW5kIGxpYnJhcmllcyB0cmVhdCBmaWxlOi8vCiAgVVJMcyB3aXRoIG9ubHkgb25lIHNsYXNoIGFmdGVyIHRoZSBob3N0IG5hbWUgc2xpZ2hseSBkaWZmZXJlbnQgdGhhbiBsaWJjdXJsCiAgZG9lcy4gU2luY2UgYWxsIHRoZSBvdGhlcnMgc2VlbSB0byBhZ3JlZSwgd2UgYmV0dGVyIGZvbGxvdyB0aGVtLgoKLSBOaWNvIEJhZ2d1cyBwcm92aWRlZCB1cyB3aXRoIGEgaHVnZSBzZXQgb2YgZml4ZXMgdG8gbWFrZSBjdXJsIGNvbXBpbGUgYW5kCiAgYnVpbGQgdW5kZXIgT3BlblZNUy4KClZlcnNpb24gNy44LjEtcHJlMwoKRGFuaWVsICg2IEF1Z3VzdCAyMDAxKQotIEpvbmF0aGFuIEhzZXUgbm90aWNlZCB0aGF0IHlvdSBjb3VsZG4ndCBnZXQgYSBoZWFkZXIgY2FsbGJhY2sgdW5sZXNzIHlvdQogIHNldCBDVVJMT1BUX1dSSVRFSEVBREVSIHRvIG5vbi1OVUxMLCBldmVuIGlmIHlvdSBkaWRuJ3QgY2FyZSBhYm91dCB0aGF0CiAgZGF0YS4gVGhpcyBpcyBub3cgZml4ZWQuCgpEYW5pZWwgKDUgQXVndXN0IDIwMDEpCi0gU2VyZ2lvIEJhbGxlc3RyZXJvIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIHJlYWRpbmcgcmVzcG9uc2VzIGZyb20gTkNTQSBodHRwZAogIDEuNS54IHNlcnZlcnMsIGFzIHRoZXkgcmV0dXJuIHJlYWxseSBzY3Jld2VkIHVwIHJlc3BvbnNlIGhlYWRlcnMgd2hlbiBhc2tlZAogIGZvciB3aXRoIEhUVFAgMS4xLgoKLSBjdXJsX2VzY2FwZSgpIG5vIGxvbmdlciB0cmVhdHMgYWxyZWFkeSBlbmNvZGVkIGNoYXJhY3RlcnMgaW4gdGhlIGlucHV0CiAgc3RyaW5nIGVzcGVjaWFsbHkuCgpEYW5pZWwgKDMgQXVndXN0IDIwMDEpCi0gSSByZXBsYWNlZCB0aGUgZm9ybWVyIGxpYi9hcnBhX3RlbG5ldC5oIGZpbGUgd2l0aCBvbmUgSSB3cm90ZSBteXNlbGYsIHRvCiAgYXZvaWQgdGhlIEJTRCBhbm5vdWNlbWVudCBjbGF1c2Ugb2YgdGhlIGxpY2Vuc2UgaW4gdGhlIGZvcm1lciBmaWxlLgoKLSBBbmRyZXcgRnJhbmNpcyBwcm92aWRlZCBhIG5ldyB2ZXJzaW9uIG9mIGJhc2U2NC5jIHRvIHdvcmsgYXJvdW5kIHRoZSBsaWNlbnNlCiAgYm9pbGVyIHBsYXRlIHRoYXQgY2FtZSB3aXRoIHRoZSBwcmV2aW91cyBvbmUuIEkgcGF0Y2hlZCBpdCwgYnV0IHRoZSBnbG9yeQogIHNob3VsZCBnbyB0byBBbmRyZXcgZm9yIGhpcyBoZWFkcyB1cC4KCi0gVG9tYXN6IExhY2tpIG5vdGljZWQgdGhhdCB3aGVuIHlvdSBkbyByZXBlYXRlZCB0cmFuc2ZlcnMgd2l0aCBsaWJjdXJsIHlvdQogIGNvdWxkbid0IGFsd2F5cyByZWxpYWJseSBjaGFuZ2UgSFRUUCByZXF1ZXN0LiBUaGlzIGhhcyBub3cgYmVlbiBmaXhlZCBhbmQgYQogIG5ldyBsaWJjdXJsIG9wdGlvbiB3YXMgYWRkZWQ6IENVUkxPUFRfSFRUUEdFVCwgdGhhdCBjYW4gZm9yY2UgdGhlIEhUVFAKICByZXF1ZXN0ciAoYmFjaykgdG8gR0VULgoKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHBvaW50ZWQgb3V0IHRoYXQgaHR0cHNzZXJ2ZXIucGwgd2Fzbid0IGluY2x1ZGVkIGluCiAgcmVsZWFzZSBhcmNoaXZlcy4gSXQgc2hvdWxkIGJlIG5vdy4KCkRhbmllbCAoMiBBdWd1c3QgMjAwMSkKLSBGcmFuayBLZWVuZXkgcG9pbnRlZCBvdXQgYSBtYW51YWwgbWlzdGFrZSBmb3IgY2VydGlmaWNhdGUgY29udmVydGlvbnMuCgotIFRvbWFzeiBMYWNraSBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIHRyYW5zZmVyIGxvb3AgdGhhdCBjb3VsZCBtYWtlIHRoZQogIHNlbGVjdCgpIGxvb3AgdXNlIGZhciB0b28gbXVjaCBDUFUuCgotIFBhd2VsIEEuIEdhamRhIHBvaW50ZWQgb3V0IGFuIG91dHB1dCBtaXN0YWtlIGRvbmUgd2hlbiB1c2luZyBsaWJjdXJsJ3MKICBwcm9ncmVzcyBjYWxsYmFjay4KCkRhbmllbCAoMjkgSnVuZSAyMDAxKQotIE5hdmVlbiBOb2VsIG5vdGljZWQgdGhhdCB0aGUgQm9ybGFuZCBsaWJyYXJ5IG1ha2VmaWxlIHdhc24ndCB1cGRhdGVkLgoKLSBOaWMgUm9ldHMgYnJvdWdodCBhIGZpeCBmb3IgdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiB3aGVuIHVzaW5nIFNTTC4KCkRhbmllbCAoMjcgSnVuZSAyMDAxKQotIE1hZGUgdGhlIEZUUCB0ZXN0cyBydW4gT0sgZXZlbiBvbiBtYWNoaW5lcyBydW5uaW5nIGN1cmwgSVB2Ni1lbmFibGVkLgoKLSBUcm95IEVuZ2VsIGNvcnJlY3RlZCBzb21lIFJQTSBwYWNrYWdlIGRldGFpbHMuCgpWZXJzaW9uIDcuOC4xLXByZTIKCkRhbmllbCAoMjUgSnVuZSAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIGNvcnJlY3RseSBpZGVudGlmaWVkIGEgcHJvYmxlbSB0aGF0IG9jY3VycmVkIHdoZW4gZG93bmxvYWRpbmcKICBzZXZlcmFsIGZpbGVzIHdpdGggY3VybCwgYW5kIHVzaW5nIHJlc3VtZS4gVGhlIGZpcnN0IGZpbGUncyByZXN1bWUgaW5kZXggd2FzCiAgdGhlbiB1c2VkIGZvciBhbGwgZmlsZXMsIHJlc3VsdGluZyBpbiB3ZWlyZCByZXN1bHRzLi4uCgotIEFudG9uIEthbG15a292IHByb3ZpZGVkIGEgZml4IHRoYXQgbWFrZXMgY3VybCB3b3JrIHdpdGggZm9ybSBmaWVsZCBuYW1lcwogIHdpdGggc3BhY2VzIGxpa2Ugd2hlbiAtRiBpcyB1c2VkLgoKVmVyc2lvbiA3LjguMS1wcmUxCgpEYW5pZWwgKDIwIEp1bmUgMjAwMSkKLSBNaWtlIEJ5dG5hciBwcm92aWRlZCBhIGZpbmUgcmVwb3J0IHRoYXQgcHJvdmVkIHRoYXQgdGhlIC0td2l0aC1zc2wgb3B0aW9uCiAgZm9yIGNvbmZpZ3VyZSBuZWVkZWQgdHdlYWtpbmcuIEl0IG5vIGxvbmdlciBzZWFyY2hlcyB0aGUgZGVmYXVsdCBkaXJlY3RvcmllcwogIGZvciBPcGVuU1NMIGxpYnMgb3IgZGlyZWN0b3JpZXMgd2hlbiBhIHNwZWNpZmllZCBwYXRoIGlzIGdpdmVuLgoKRGFuaWVsICgxOSBKdW5lIDIwMDEpCi0gV2hlbiBhbiBGVFAgdHJhbnNmZXIgaXMgY3V0IG9mZiBkdXJpbmcgdHJhbnNmZXIsIGN1cmwgY291bGQgcHJlc2VudCBhIHRydWx5CiAgZ2FyYmFnZWQgZXJyb3IgbWVzc2FnZSBhbmQgaW4gd29yc3QgY2FzZSBkdW1wIGNvcmUuIFRoYW5rcyB0byBkZXRhaWxlZAogIHJlcG9ydHMgZnJvbSBTaGF3biBQb3Vsc29uIHdlIG5haWxlZCB0aGlzLgoKRGFuaWVsICgxMiBKdW5lIDIwMDEpCi0gU2FsdmFkb3IgROF2aWxhIHByb3ZpZGVkIGEgZml4IGZvciBGVFAgcmFuZ2UgZG93bmxvYWRzLgoKLSBBZGRlZCBhIGZldyBtb3JlIHRlc3QgY2FzZXMgZnJvbSB0aGUgZm9ybWVyIHRlc3Qgc3VpdGUgdG8gdGhlIG5ldyBmaWxlCiAgZm9ybWF0LiBXZSdyZSBub3cgYXQgYSB0b3RhbCBvZiAyNiB0ZXN0cy4KCkRhbmllbCAoMTEgSnVuZSAyMDAxKQotIGxpYmN1cmwncyB2ZXJzaW9uLWluZm8gd2FzIHdyb25nLCBhcyBub3RlZCBieSBib3RoIERvbWVuaWNvIEFuZHJlb2xpIGFuZAogIERhdmlkIE9kaW4uCgpEYW5pZWwgKDcgSnVuZSAyMDAxKQotIEr2cm4gZml4ZWQgdGhlIGN1cmxfdW5lc2NhcGUgZHVwbGljYXRlIGVudHJ5IGluIGxpYi9saWJjdXJsLmRlZgoKLSBJIG1hZGUgU1NMIGNlcnRpZmljYXRlIGZhaWx1cmUgbWVzc2FnZXMgdG8gYmUgbW9yZSBkZXRhaWxlZC4KClZlcnNpb24gNy44CgpEYW5pZWwgKDcgSnVuZSAyMDAxKQotIFNEYXZpbGEgcHJvdmlkZWQgYSByZXN1bWVkIGRvd25sb2FkIGZpeC4KClZlcnNpb24gNy44LXByZTQKCkRhbmllbCAoMSBKdW5lIDIwMDEpCi0gU3RlcmxpbmcgcHJvdmlkZWQgc29tZSBuZXcgUEhQIGV4YW1wbGVzLgoKLSBDaGFuZ2VkIHRoZSBDVlMgaGllcmFyY2h5IGFuZCB0aGUgb2xkZXIgY2hlY2tvdXQgaW5zdHJ1Y3Rpb24gZG9lcyBubyBsb25nZXIKICB3b3JrLiBXZSBtb3ZlZCB0aGUgZW50aXJlIHNvdXJjZSBjb2RlIGludG8gYSBDVlMgbW9kdWxlIG5hbWVkICdjdXJsJy4KCkRhbmllbCAoMzEgTWF5IDIwMDEpCi0gQ1VSTE9QVF9NVVRFIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuIEl0IGlzIHN0aWxsIHByZXNlbnQgaW4gdGhlIGluY2x1ZGUgZmlsZQogIHRvIG5vdCBjYXVzZSBjb21waWxlciBlcnJvcnMgZm9yIGFwcGxpY2F0aW9ucyB1c2luZyBpdCwgYnV0IGl0IGlzbid0IHVzZWQKICBhbnl3aGVyZSBpbiB0aGUgbGlicmFyeS4KClZlcnNpb24gNy44LXByZTMKCkRhbmllbCAoMzEgTWF5IDIwMDEpCi0gT25jZSBhbmQgZm9yIGFsbCBmaXhlZCB0aGUgX1JFRU5UUkFOVCBtZXNzIGZvciBTb2xhcmlzIGNvbXBpbGVzIHRvIHByZXNlbnQKICBsZXNzIHdhcm5pbmdzLgoKLSBTdGVybGluZyBIdWdoZXMgdGlyZWxlc3NseSBwb2ludHMgb3V0IGFuZCBjb3JyZWN0cyBteSBtaXN0YWtlcy4uLiEgU28sCiAgY3VybF9nbG9iYWxfaW5pdCgpIG5vdyBsZXRzIHRoZSBhcmd1bWVudCBmbGFncyAqU0VUKiB3aGF0IHBhcnRzIHRvCiAgaW5pdC4gQ1VSTF9HTE9CQUxfREVGQVVMVCBtYWtlcyBhIG5pY2UgZGVmYXVsdCwgQ1VSTF9HTE9CQUxfQUxMIGluaXRzIGFsbAogIGtub3duIHN1YnN5c3RlbXMgYW5kIENVUkxfR0xPQkFMX05PTkUgaW5pdHMgbm90aGluZyBtb3JlIHRoYW4gYWJzb2x1dGVseQogIG5lY2Vzc2FyeS4gTWFuIHBhZ2UgdXBkYXRlZCBhY2NvcmRpbmdseS4KCi0gRml4ZWQgdGhlIHN0cnRvay5oIGluY2x1ZGUgZmlsZSBhcyBpdCB3b3VsZG4ndCBjb21waWxlIG9uIGFsbCBwbGF0Zm9ybXMhCgpEYW5pZWwgKDMwIE1heSAyMDAxKQotIE1hZGUgbGliY3VybCBieSBkZWZhdWx0IGFjdCBhcyBpZiBDVVJMT1BUX01VVEUgYW5kIENVUkxPUFRfTk9QUk9HUkVTUyB3ZXJlCiAgc2V0IFRSVUUuIFNldCB0aGVtIHRvIEZBTFNFIHRvIG1ha2UgbGliY3VybCBtb3JlIHRhbGthdGl2ZS4gVGhlICpfTVVURQogIG9wdGlvbiBpcyBzdWJqZWN0IGZvciBjb21wbGV0ZSByZW1vdmFsLi4uCgpWZXJzaW9uIDcuOC1wcmUyCgpEYW5pZWwgKDMwIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiB3cm90ZSBhIG1ha2VmaWxlIGZvciBidWlsZGluZyBTb2xhcmlzIHBhY2thZ2VzLgoKLSBTdGVybGluZyBIdWdoZXMgYnJvdWdodCBmaXhlcyBmb3IgJ2J1aWxkY29uZicgKHRoZSBidWlsZC1mcm9tLUNWUyB0b29sKSBhbmQKICB3ZSBkaXNjdXNzZWQgYW5kIGFkZGVkIGEgZmV3IENVUkxfR0xPQkFMXyogZmxhZ3MgaW4gaW5jbHVkZS9jdXJsLmgKCi0gS2pldGlsIEphY29ic2VuIHByaXZhdGVseSBhbm5vdW5jZWQgaGlzIHB5dGhvbiBpbnRlcmZhY2UgdG8gbGliY3VybCwKICBhdmFpbGFibGUgYXQgaHR0cDovL3B5Y3VybC5zb3VyY2Vmb3JnZS5uZXQvCgpEYW5pZWwgKDI5IE1heSAyMDAxKQotIFN0ZXJsaW5nIEh1Z2hlcyBmaXhlZCBhIHN0cnRvaygpIHByb2JsZW0gaW4gbGliY3VybC4gSXQgaXMgbm90IGEgdGhyZWFkLQogIHNhZmUgZnVuY3Rpb24uIE5vdyBjb25maWd1cmUgY2hlY2tzIGZvciBhIHRocmVhZC1zYWZlIHZlcnNpb24sIGFuZAogIGxpYi9zdHJ0b2suYyBvZmZlcnMgb25lIGZvciB0aGUgc3lzdGVtcyB0aGF0IGRvbid0IGNvbWUgd2l0aCBvbmUgaW5jbHVkZWQhCgotIE1ldHRndXQgSmFtYWxsYSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIHdhcyB3cml0dGVuCiAgdG8gc3RkZXJyIGV2ZW4gdGhvdWdoIC0tc3RkZXJyIHJlZGlyZWN0aW9uIHdhcyB1c2VkLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgotIEkgbW92ZWQgb3V0IHRoZSBsaXN0IG9mIGNvbnRyaWJ1dG9ycyBmcm9tIHRoZSBjdXJsLjEgbWFuIHBhZ2UgYW5kIG1hZGUgYQogIHNlcGFyYXRlIGRvY3MvVEhBTktTIGZpbGUuIEl0IG1ha2VzIHRoZSBsaXN0IGVhc2llciB0byBmaW5kLCBhbmQgbWFkZSBpdAogIGVhc2llciBmb3IgbWUgdG8gbWFrZSBhIHNlcGFyYXRlIHdlYiBwYWdlIHdpdGggdGhhdCBzYW1lIGluZm9ybWF0aW9uLgoKICBJIHJlYWxseSBkbyB3YW50IGFsbCB5b3UgZ3V5cyBtZW50aW9uZWQgaW4gdGhlcmUgdG8gZmVlbCB5b3UgZ2V0IHRoZSBjcmVkaXQKICB5b3UgZGVzZXJ2ZS4KCi0gbGliL2Vhc3kuYyBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseSBpbiB0aGUgNy44LXByZTEgZHVlIHRvIGEgc2lsbHkgbWlzdGFrZQoKVmVyc2lvbiA3LjgtcHJlMQoKRGFuaWVsICgyOCBNYXkgMjAwMSkKLSBjdXJsLWNvbmZpZyBub3cgc3VwcG9ydHMgJy0tdmVybnVtJyB0aGF0IG91dHB1dHMgYSBwbGFpbiBoZXhhZGVjaW1hbCB2ZXJzaW9uCiAgb2YgdGhlIGxpYmN1cmwgdmVyc2lvbiBudW1iZXIgKHVzaW5nIDggYml0cyBmb3IgZWFjaCAzIG51bWJlcnMpLiBWZXJzaW9uCiAgNy43LjQgYXBwZWFycyBhcyAwNzA3MDQKCi0gV3JvdGUgbWFuIHBhZ2VzIGZvciBjdXJsX2dsb2JhbF9pbml0IGFuZCBjdXJsX2dsb2JhbF9jbGVhbnVwLi4uCgotIFQuIEJoYXJhdGggYnJvdWdodCBuZXdzIGFib3V0IHRoZSB1c2FnZSBvZiB0aGUgT3BlblNTTCBpbnRlcmZhY2UgdGhhdCB3YXMKICBub3QgcHJldmlvdXNseSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24gYW5kIHRodXMgY2F1c2VkIGxpYmN1cmwgdG8gbGVhawogIG1lbW9yeS4gIFRoZSBvbmx5IHNvbWV3aGF0IHNhbmUgYXBwcm9hY2ggdG8gZml4IHRoaXMgZGlsZW1tYSwgaXMgYWRkaW5nIHR3bwogIHR3byBuZXcgZnVuY3Rpb25zIGN1cmxfZ2xvYmFsX2luaXQoKSBhbmQgY3VybF9nbG9iYWxfY2xlYW51cCgpIHRoYXQgc2hvdWxkCiAgYmUgY2FsbGVkICpPTkNFKiBieSB0aGUgYXBwbGljYXRpb24gdXNpbmcgbGliY3VybC4gVGhlIGluaXQgc2hvdWxkIGJlIGRvbmUKICBvbmx5IGF0IHN0YXJ0dXAsIG5vIG1hdHRlciBob3cgbWFueSB0aHJlYWRzIHRoZSBhcHBsaWNhdGlvbiBpcyBnb25uYSB1c2UsCiAgYW5kIHRoZSBjbGVhbnVwIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaGFzIGZpbmlzaGVkIHVzaW5nCiAgbGliY3VybCBjb21wbGV0ZWx5LgoKICAqKiogVVBHUkFERSBOT1RJQ0UgKioqCgogIElmIHlvdSB3cml0ZSBhcHBsaWNhdGlvbnMgdXNpbmcgbGliY3VybCwgeW91IHJlYWxseSB3YW50IHRvIHVzZSB0aGUgdHdvCiAgZnVuY3Rpb25zIG1lbnRpb25lZCBhYm92ZSAhISEKCiAgSSBjYW4ndCBzYXkgSSB0aGluayB0aGlzIGlzIGEgdmVyeSBiZWF1dGlmdWwgc29sdXRpb24sIGJ1dCBhcyBPcGVuU1NMCiAgaW5zaXN0cyBvbiBtYWtpbmcgbG90cyBvZiBzdHVmZiBvbiBhICJnbG9iYWwiIHNjb3BlLCB3ZSdyZSBmb3JjZWQgdG8gd2FsawogIHRoZSBwYXRoIHRoZXkgcG9pbnQgdXMgdG8uCgotIE1vdmluZyBtb3JlIHRlc3QgY2FzZXMgaW50byB0aGUgbmV3IGZpbGUgZm9ybWF0LgoKVmVyc2lvbiA3LjcuNC1wcmUzCgpEYW5pZWwgKDIzIE1heSAyMDAxKQotIEludHJvZHVjZWQgYSBuZXcgZmlsZSBmb3JtYXQgZm9yIHN0b3JpbmcgdGVzdCBjYXNlcywgYW5kIHRodXMgSSBoYWQgdG8KICBtb2RpZnkgYWxsIHRoZSBwZXJsIHRlc3Qgc2NyaXB0cyBhbmQgbW9yZSAoSSBhZGRlZCBhIG5ldyBvbmUpLiBJIGhhdmUgbm90CiAgInBvcnRlZCIgYWxsIHRoZSBvbGQgdGVzdCBjYXNlcyB0byB0aGUgbmV3IGZvcm1hdCB5ZXQsIGJ1dCBpdCdsbCBjb21lLgoKICBUaGUgbWFpbiBhZHZhbnRhZ2Ugb2YgdGhpcyBuZXcgZm9ybWF0IGlzIHRoYXQgYWxsIHRlc3QgZGF0YSBmb3IgZWFjaCB0ZXN0CiAgY2FzZSBpcyBzdG9yZWQgaW4gYSBzaW5nbGUgZmlsZS4gSXQgZ2l2ZXMgYSBiZXR0ZXIgb3ZlcnZpZXcgZm9yIGVhY2ggdGVzdAogIGNhc2UgYW5kIGEgbG90IGxlc3MgZmlsZXMuCgotIEFuZHLpcyBHYXJj7WEgYnJvdWdodCBhIGZpeCBmb3IgdGhlIG5ldHNjYXBlL21vemlsbGEgY29va2llIGZpbGUgcGFyc2luZwogIGZ1bmN0aW9uLCBhcyBpdCB0dXJucyBvdXQgaXQgZG9lc24ndCBhbHdheXMgc3RvcmUgdGhlIHBhdGghCgpEYW5pZWwgKDIyIE1heSAyMDAxKQotIEFzIHdhcyByZXBvcnRlZCBhbm9ueW1vdXNseSwgd2hlbiBGQUlMT05FUlJPUiB3YXMgdXNlZCwgdGhlIGh0dHBjb2RlIHdhcwogIG5vdCBzdG9yZWQgcHJvcGVybHkgYW5kIHRodXMgd2Fzbid0IHBvc3NpYmx5IHRvIHJlYWQgYWZ0ZXIgYSB0cmFuc2ZlciB3aXRoCiAgdGhlIGN1cmxfZWFzeV9nZXRpbmZvKCkgZnVuY3Rpb24uIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCi0gSW5zdGFsbGVkIGFuZCBtYWRlIHVzZSBvZiB0aGUgZm9sbG93aW5nIHRvb2wgdmVyc2lvbnM6CiAgICBhdXRvY29uZiAyLjUwCiAgICBsaWJ0b29sIDEuNAogICAgYXV0b21ha2UgMS40LXAxCgogIEkgd291bGRuJ3QgcmVjb21tZW5kIGFueSBkZXZlbG9wZXIgdG8gdHJ5IHRvIGdlbmVyYXRlIHRoaW5ncyB3aXRoIG9sZGVyCiAgdmVyc2lvbnMgdGhhbiB0aGVzZS4gQnVpbGRpbmcgZnJvbSBDVlMgd2lsbCBwcm9iYWJseSBtb3JlIG9yIGxlc3MgcmVxdWlyZQogIGF0IGxlYXN0IHRoZXNlIHZlcnNpb25zLgoKICBBcyBhIHJlc3VsdCBvZiB0aGlzLCB0aGUgY29uZmlndXJlIHNjcmlwdCBncmV3IHRvIG1vcmUgdGhhbiBkb3VibGUgaXRzCiAgcHJldmlvdXMgc2l6ZSEKCiAgQXJrYWRpdXN6IE1pc2tpZXdpY3ogaGVscGVkIG1lIGJ5IHBvaW50aW5nIG91dCBJIGhhZCB0byByZW1vdmUgbXkKICBhY2luY2x1ZGUubTQgZmlsZSBiZWZvcmUgSSBjb3VsZCBnZXQgaXQgd29ya2luZyEKCkRhbmllbCAoMjEgTWF5IDIwMDEpCi0gSSBtYWRlIGZ0cHM6Ly8gd29yay4gQWRkZWQgdGVzdCBjYXNlIDQwMCB0byB0aGUgcmVsZWFzZSBhcmNoaXZlLCBhcyB0aGUKICBmaXJzdCBmdHBzOi8vIHRlc3QgY2FzZS4gUmVxdWlyZXMgc3R1bm5lbC4KCi0gQWxzbyBtYWRlIHRoZSB0ZXN0IGNhc2VzIHRoYXQgcnVucyBzc2wgdGVzdHMgbm90IHJ1biBpZiBsaWJjdXJsIGlzbid0IGJ1aWx0CiAgd2l0aCBzc2wgc3VwcG9ydC4KCkRhbmllbCAoMTkgTWF5IDIwMDEpCi0gTWFkZSB0aGUgY29uZmlndXJlIG5vdCBhZGQgYW55IGV4dHJhIC1MIExERkxBR1Mgb3IgLUkgQ1BQRkxBR1MgdW5sZXNzIHRoZXkKICBhcmUgYWN0dWFsbHkgbmVlZGVkLiBBbGJlcnQgQ2hpbidzIGFuZCBEb21lbmljbyBBbmRyZW9saSdzIHN1Z2dlc3Rpb25zCiAgaGVscGVkIG91dC4KClZlcnNpb24gNy43LjQtcHJlMgoKRGFuaWVsICgxOCBNYXkgMjAwMSkKLSBOaWNlciBjb25maWd1cmUtY2hlY2sgZm9yIHRoZSBPcGVuU1NMIGhlYWRlcnMsIHdoaWNoIHRoZW4gc2V0cyB0aGUgcHJvcGVyCiAgdmFyaWFibGUgdG8gaGF2ZSBjdXJsLWNvbmZpZyBiZSBnb29kLiAoQWxiZXJ0IENoaW4gcHJvdmlkZWQgdGhlIGZpeCkKCi0gRm9yIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIHRoZWl3IG93biAnc3RybGNhdCgpJyBsaWJjdXJsIHByb3ZpZGVzIGl0cyBvd24uCiAgSXQgd2FzIG5vdyByZW5hbWVkIHRvIHByZXZlbnQgY29sbGlkZXMgd2l0aCBvdGhlciBsaWJzLiAoQWZ0ZXIgZGlzY3Vzc2lvbnMKICB3aXRoIFN0ZXJsaW5nIEh1Z2hlcyBhbmQgdGhlIGltcGxpY2F0aW9ucyB0aGlzIGhhZCBvbiBQSFAgYnVpbGRzLikKCkRhbmllbCAoMTcgTWF5IDIwMDEpCi0gQ29sbSBCdWNrbGV5IHBvc3RlZCBhIGRldGFpbGVkIGJ1ZyByZXBvcnQgb24gKHRoZSBkZWJpYW5pemVkKSA3LjcuMywgdGhhdAogIHR1cm5lZCBvdXQgdG8gYmUgYSBwcm9ibGVtIHdpdGggdGhlIGRlYmlhbi1idWlsdCA3LjcuMy1wYWNrYWdlIHRoYXQKICBjb250YWluZWQgZmlsZXMgZnJvbSB0aGUgNy43LjIgcmVsZWFzZSEKCi0gSSBhZGRlZCB0aGUgQ1VSTEVfQUxSRUFEWV9DT01QTEVURSBhZ2FpbiwgYnV0IHdpdGggYSBmYWtlIHZhbHVlLCBqdXN0IHRvCiAgbWFrZSBwcm9ncmFtcyB0aGF0IHVzZSBpdCwgbm90IGZhaWwgd2hlbiBjb21waWxpbmcgYWdhaW5zdCB0aGlzIHZlcnNpb24gb2YKICBsaWJjdXJsLgoKRGFuaWVsICgxNCBNYXkgMjAwMSkKLSBQYXdlbCBBLiBHYWpkYSBmaXhlZCBhIHByb2JsZW0gd2l0aCByZXN1bWVkIHRyYW5zZmVycyBvbiByZS11c2VkIHBlcnNpc3RlbnQKICBjb25uZWN0aW9ucy4KClZlcnNpb24gNy43LjQtcHJlMQoKRGFuaWVsICgxNCBNYXkgMjAwMSkKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gZml4ZWQgRlRQIFBPUlQgZm9yIElQdjYtZW5hYmxlZCBsaWJjdXJsLgoKLSBBZGRlZCB0aGUgZmlyc3QgSFRUUFMgdGVzdCB0byB0aGUgdGVzdCBzdWl0ZSBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICgxMiBNYXkgMjAwMSkKLSBKdWtrYSBQaWhsIHN1Z2dlc3RlZCB0aGF0IGlmIChsaWIpY3VybCBpcyB0b2xkIHRvIHZlcmlmeSB0aGUgcGVlcidzCiAgY2VydGlmaWNhdGUgYW5kIHRoZSBwZWVyIGNhbid0IGJlIHZlcmlmaWVkLCBpdCBzaG91bGQgZmFpbCBhbmQgcmV0dXJuIGEKICBwcm9wZXIgZXJyb3IgY29kZS4gSSBhZGRlZCBhIGJyYW5kIG5ldyBlcnJvciBjb2RlIG5hbWVkCiAgQ1VSTEVfU1NMX1BFRVJfQ0VSVElGSUNBVEUgZm9yIHRoaXMgcHVycG9zZS4KCkRhbmllbCAoMTEgTWF5IDIwMDEpCi0gQXMgd2FzIGRpc2N1c3NlZCB3aXRoIEZyZWRlcmljIExlcGllZCBhIHdoaWxlIGFnbywgSSBub3cgbWFkZSBsaWJjdXJsIG5vdAogIHJldHVybiBlcnJvciBldmVuIHRob3VnaCBubyBkYXRhIHdhcyB0cmFuc2ZlcmVkIG9uIHVwbG9hZC9kb3dubG9hZCByZXN1bWUKICB3aGVuIHRoZSBubyB0cmFuc2ZlciBpcyBuZWVkZWQuIFRoZSBDVVJMRV9BTFJFQURZX0NPTVBMRVRFIGVycm9yIHdhcyByZW1vdmVkCiAgZnJvbSB0aGUgaGVhZGVyIGZpbGUgdG8gbWFrZSBhbnkgaW1wbGVtZW5hdG9yIHRoYXQgdXNlcyB0aGF0IHRvIGJlIGF3YXJlIG9mCiAgdGhlIGZhY3QgdGhhdCBpdCBjYW4ndCBiZSByZXR1cm5lZCBhbnltb3JlIQoKLSBJbXByb3ZlZCBnZW5lcmFsIGhlYWRlci1wYXJzaW5nIHRvIGJldHRlciBhbGxvdyB3aGl0ZSBzcGFjZXMgYW5kIG1vcmUuCgotIFJvZG5leSBTaW1tb25zIHByb3ZlZCB0aGUgZml4IEkgZGlkIHllc3RlcmRheSB3YXMgYmFkIGFuZCBJIGhhZCB0byBwb3N0CiAgYW5vdGhlciBvbmUuCgotIEluZ28gV2lsa2VuIHBhdGNoZWQgYXdheSB0d28gcmVkaXJlY3QgcHJvYmxlbXMgbW9yZSEKICAKRGFuaWVsICgxMCBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgY29ycmVjdGx5IG5vdGVkIHRoYXQgdGhlIHNwYWNlLWFmdGVyLWhlYWRlciBwcm9ibGVtIHdpdGgKICBMb2NhdGlvbjogaXMgcHJlc2VudCBvbiBzZXZlcmFsIG90aGVyIHBsYWNlcyBpbiB0aGUgbGliY3VybCBzb3VyY2VzLgoKLSBJbmdvIFdpbGtlbiBwYXRjaGVkIGF3YXkgYSBwcm9ibGVtIGxpYmN1cmwgaGFkIHdoZW4gZm9sbG93aW5nIExvY2F0aW9uOgogIGhlYWRlcnMgd2l0aCBhbiBleHRyYSBzcGFjZSBhZnRlciB0aGUgY29sb24uCgotIFJvZG5leSBTaW1tb25zIGZvdW5kIG91dCB0aGF0IG11bHRpcGxlIEZUUCB0cmFuc2ZlcnMgZGlkIG5vdCB0cmVhdCByZWxhdGl2ZQogIGRpcmVjdG9yaWVzIGNvcnJlY3RseS4KCkRhbmllbCAoOSBNYXkgMjAwMSkKLSBHZXR0aW5nIGFuIEZUUCBmaWxlIHdpdGggQ1VSTE9QVF9OT0JPRFkgc2V0IChvciAtSSBmcm9tIHRoZSBjb21tYW5kIGxpbmUpLAogIG1ha2VzIGN1cmwgdXNlIHRoZSBub24tc3RhbmRhcmQgZnRwIGNvbW1hbmQgIlNJWkUiLiBJZiBpdCBmYWlsZWQsIGxpYmN1cmwKICByZXR1cm5lZCBlcnJvci4gU3RhcnRpbmcgbm93LCBpdCBqdXN0IGRvbid0IG91dHB1dCB0aGUgZmlsZSBzaXplIGluc3RlYWQuCiAgQW5vbnltb3VzIGJ1ZyByZXBvcnQuCgotIHN0dW5uZWwucG0gd2FzIGFjY2lkZW50YWxseSBsZWZ0IG91dCBmcm9tIHRoZSByZWxlYXNlIGFyY2hpdmUsIGl0IGlzIG5vdwogIGFkZGVkIChzdHVubmVsIGlzIG5lZWRlZCB0byBydW4gdGhlIGh0dHBzLXRlc3RzIGluIHRoZSB0ZXN0IHN1aXRlKQogIApEYW5pZWwgKDcgTWF5IDIwMDEpCi0gQ29ycmVjdGVkIHR3byBtaW5vciBjb21waWxlciB3YXJuaW5ncyBkdWUgdG8gdGhlIEZJTEUgKiB0byB2b2lkICogY29udmVyc2lvbgogIHRoYXQgSSBtaXNzZWQgYXQgdHdvIHBsYWNlcy4gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIHBhdGNoZXMuIFNhbmRlciBHYXRlcwogIGZpbGVkIGEgYnVnIHJlcG9ydCBvbiB0aGlzLgoKVmVyc2lvbiA3LjcuMwoKRGFuaWVsICg0IE1heSAyMDAxKQotIEFsbCBjYWxsYmFjayBmdW5jdGlvbnMgbm93IHRha2UgJ3ZvaWQgKicgaW5zdGVhZCBvZiAnRklMRSAqJy4gVGhpcyBpcyBtYWRlCiAgdGhpcyB3YXkgdG8gbWFrZSBpdCBtb3JlIG9idmlvdXMgdG8gcGVvcGxlIHRoYXQgYW55dGhpbmcgY2FuIGJlIHBhc3NlZCB0bwogIHRoZW0gKGJ5IHVzaW5nIHRoZSBhcHJvcHJpYXRlIG9wdGlvbikuIEFmdGVyIGRpc2N1c3Npb25zIHdpdGggU3RlcmxpbmcKICBIdWdoZXMuCgpEYW5pZWwgKDMgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIGEgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBwcm9ibGVtIHdpdGggcGVyc2lzdGVudAogIGNvbm5lY3Rpb24gdGhhdCBtYWRlIGxpYmN1cmwgZmFpbCBpZiB0aGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHVzZWQgbWl4ZWQKICBjaHVua2VkIGFuZCBub24tY2h1bmtlZCB0cmFuc2ZlcnMuCgotIENyaXMgQmFpbGlmZiBmaXhlZCBhIGJhZCB0cmVhdG1lbnQgb2YgMzA0LXJlcGxpZXMsIGFzIHRoZXkgd291bGQgbm90IGJlCiAgdHJlYXRlZCBhcyBjb250ZW50LWxlbmd0aCAwIHJlcGxpZXMgYnV0IHdvdWxkIGNhdXNlIGEgImhhbmciIHVudGlsIHRoZQogIHNlcnZlciB0aW1lZC1vdXQgYW5kIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4KCi0gQnJhZCBCdXJkaWNrIGZvdW5kIGEgbWlub3IgcHJvYmxlbSBpbiB0aGUgZG9jcy9leGFtcGxlcy9NYWtlZmlsZS5hbQoKRGFuaWVsICgyNyBBcHJpbCAyMDAxKQotIFVwZGF0ZWQgdGhlIElOVEVSQUxTIGRvY3VtZW50IGFnYWluLiBJdCB3YXMgbGFnZ2luZyBhIGJpdC4gSSB0aGluayBJIG1hZGUgaXQKICBtb3JlIGVhc3kgdG8gZm9sbG93IG5vdyBhcyB3ZWxsLgoKLSBCcmFkIEJ1cmRpY2sgZm91bmQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aGVuIGN1cmwgcmVjZWl2ZWQKICBhICJDb250ZW50LUxlbmd0aDogMCIgaGVhZGVyLgoKLSBHaXVzZXBwZSBEJ0FtYnJvc2lvIHdhcyBmaXJzdCBvdXQgdG8gcmVwb3J0IHRoYXQgVEVMTkVUIGRvZXNuJ3Qgd29yayBpbiBjdXJsCiAgY29tcGlsZWQvYnVpbHQgb24gd2luMzIuIEl0IHNlZW1zIHRvIHdvcmsgZm9yIHVuaXhlcyB0aG91Z2ghCgotIERhdmUgSGFtaWx0b24gcmVwb3J0ZWQgd2VpcmQgcHJvYmxlbXMgd2l0aCBDVVJML1BIUCB0aGF0IEkgcmVhbGx5IGNhbid0CiAgZXhwbGFpbiBhdCB0aGUgbW9tZW50LiBJJ20gaG9waW5nIG9uIHNvbWUgaGVscCBmcm9tIHRoZSBQSFAgY3Jldy4KCkRhbmllbCAoMjYgQXByaWwgMjAwMSkKLSBJIHJld3JvdGUgdGhlIEZUUCBjb21tYW5kIHJlc3BvbnNlIGZ1bmN0aW9uLiBJIGhhZCB0byBkbyBpdCB0byBtYWtlIGZ0cHMKICB3b3JrLCBhcyB0aGUgT3BlblNTTCByZWFkKCktZnVuY3Rpb24gZGlkbid0IHdvcmsgdGhlIHNhbWUgd2F5IHRoZSBub3JtYWwKICB1bml4IHJlYWQoKSBkb2VzLCBidXQgaXQgd2FzIGFsc28gYSBodWdlIHBlcmZvcm1hbmNlIGJvb3N0LiBQcmV2aW91c2x5IHRoZQogIGZ1bmN0aW9uIHJlYWQgb25lIGJ5dGUgYXQgYSB0aW1lLCBub3cgaXQgcmVhZHMgdmVyeSBsYXJnZSBjaHVua3MsIGFuZCBpdAogIG1ha2VzIGEgbm90YWJsZSBzcGVlZCBkaWZmZXJlbmNlLgoKRGFuaWVsICgyNSBBcHJpbCAyMDAxKQotIENvbm5lY3Rpb24gcmUtdXNlIHdoZW4gbm90IHVzaW5nIGEgcHJveHkgZGlkbid0IHdvcmsgcHJvcGVybHkgZm9yCiAgbm9uLWRlZmF1bHQgcG9ydCBudW1iZXJzLgoKRGFuaWVsICgyNCBBcHJpbCAyMDAxKQotIEkndmUgbm90aWNlZCB0aGF0IEZUUFMgZG9lc24ndCB3b3JrLiBXZSBhdHRlbXB0IHRvIHVzZSBzc2wgZXZlbiBmb3IgdGhlCiAgZGF0YSB0cmFuc2Zlciwgd2hpY2ggY2F1c2VzIHRoZSB0cmFuc2ZlciB0byAnaGFuZycuLi4gV2UgbmVlZCB0byBmaXggdGhpcy4KCi0gSW1wcm92ZWQgdGhlIHRlc3Qgc3VpdGUgdG8gdXNlICdzdHVubmVsJyB0byBkbyBIVFRQUyBhbmQgRlRQUyB0ZXN0aW5nIG9uCiAgdGhlIGFscmVkeSB3cml0dGVuIHBlcmwgc2VydmVycyBlYXNpbHkuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDEpCi0gVGhlIE9wZW5TU0wgdmVyc2lvbiBzdHJpbmcgcmVjZW50bHkgbW9kaWZpZWQgZGlkbid0IHplcm8gdGVybWluYXRlIG9uZQogIG9mIHRoZSBnZW5lcmF0ZWQgc3RyaW5ncyBwcm9wZXJseSwgd2hpY2ggY291bGQgbGVhZCB0byBhIGNyYXNoIG9yIHNpbXBseQogIHdlaXJkIHZlcnNpb24gc3RyaW5nIG91dHB1dCEKClZlcnNpb24gNy43LjIKCkRhbmllbCAoMjIgQXByaWwgMjAwMSkKLSBSb3NpbWlsZG8gZGEgU2lsdmEgdXBkYXRlZCB0aGUgTWFrZWZpbGVzIGZvciBCb3JsYW5kL1dpbmRvd3MuCgotIEVyaWMgUmF1dG1hbiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHRoYXQgd291bGQKICBsZWFkIHRvIGJyb2tlbiBIb3N0OiBoZWFkZXJzIGluIHRoZSBzZWNvbmQgSFRUUCByZXF1ZXN0LgoKRGFuaWVsICgyMCBBcHJpbCAyMDAxKQotIEFkZGVkIG1hbiBwYWdlcyBmb3IgdGhlIGN1cmxfc3RyZXF1YWwoKSBhbmQgY3VybF9tcHJpbnRmKCkgZmFtaWxpZXMuIFdyb3RlCiAgYSAnbGliY3VybCBvdmVydmlldycgbWFuIHBhZ2UuCgotIFNwZWxsLWZpeGVkIHNvbWUgZG9jdW1lbnRzLgoKLSBTLiBNb29uZXNhbXkgY29ycmVjdGVkIG1pc3Rha2VzIGluIHRoZSBtYW4gcGFnZS4KCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIHRoZSBjdXJsX3NsaXN0cyBvcHRpb25zIGluIHRoZSBwZXJsIGludGVyZmFjZSwgcHJlc2VudAogIHNlcGFyYXRlbHkgaW4gdGhlIEN1cmw6OmVhc3kgMS4xLjQgcGFja2FnZS4KCkRhbmllbCAoMTkgQXByaWwgMjAwMSkKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHJlbW92ZWQgdGhlIGRlY2ltYWxzIGZyb20gdGhlIHNpemUgdmFyaWFibGVzIGluIHRoZQogIC0td3JpdGUtb3V0IG91dHB1dC4gV2UgaGFyZGx5IGV2ZXIgZ2V0IGZyYWN0aW9uIG9mIGJ5dGVzISA6LSkKClZlcnNpb24gNy43LjItcHJlMQoKRGFuaWVsICgxOSBBcHJpbCAyMDAxKQoKLSBBbGJlcnQgQ2hpbiBwcm92aWRlZCBhIGNvbmZpZ3VyZSBwYXRjaCBmb3IgdGhlIEFDX1NZU19MQVJHRUZJTEUgbWFjcm8uCgpEYW5pZWwgKDE4IEFwcmlsIDIwMDEpCi0gSW5wdXQgZnJvbSBNaWNoYWVsIE1lYWxsaW5nIG1hZGUgbWUgYWRkIC0tZmVhdHVyZSB0byBjdXJsLWNvbmZpZy4gSXQKICBkaXNwbGF5cyBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhhdCBoYXZlIGJlZW4gYnVpbHQtaW4gaW4gdGhlIGN1cnJlbnQKICBsaWJjdXJsLiBUaGUgY3VycmVudGx5IGF2YWlsYWJsZSBmZWF0dXJlcyB0aGF0IGNhbiBiZSBsaXN0ZWQgYXJlOiBTU0wsIEtSQjQKICBhbmQgSVB2Ni4KCi0gSSBjb21taXR0ZWQgQ3JpcyBhbmQgR2VvcmcncyBwZXJsIGludGVyZmFjZSB3b3JrLiBUaGV5J3ZlIGdvdCBjYWxsYmFja3MKICB3b3JraW5nIGFuZCBvcHRpb25zIHRoYXQgcmVjZWl2ZXMgdGhvc2Ugc2xpc3QgcG9pbnRlcnMuCgotIFB1bmVldCBQYXdhaWEgZGV0ZWN0ZWQgYSBwcm9ibGVtIHdpdGggcmVzdW1lZCBkb3dubG9hZHMgdGhhdCB1c2UgcGVyc2lzdGVudAogIGNvbm5lY3Rpb25zIGFuZCBJIG1hZGUgYSByYXRoZXIgbGFyZ2Ugd3JpdGV1cCB0byBjb3JyZWN0IHRoaXMuIEl0IGlzCiAgaW1wb3J0YW50IHRoYXQgYWxsIHNlc3Npb24tZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGNvbm5lY3RkYXRhIHN0cnVjdCBhbmQgbm90CiAgaW4gdGhlIG1haW4gc3RydWN0IGFzIHRoaXMgcHJldmlvdXNseSBkaWQuCgpEYW5pZWwgKDE3IEFwcmlsIDIwMDEpCi0gRnJlZGVyaWMgTGVwaWVkIGZpeGVkIGEgZnRwIHJlc3VtZWQgZG93bmxvYWQgcHJvYmxlbSBhbmQgaW50cm9kdWNlZCBhIG5ldwogIGVycm9yIGNvZGUgdGhhdCBsZXRzIGFwcGxpY2F0aW9ucyBiZSBhYmxlIHRvIGRldGVjdCB3aGVuIGEgcmVzdW1lZCBkb3dubG9hZAogIGFjdHVhbGx5IGRpZG4ndCBkb3dubG9hZCBhbnl0aGluZyBzaW5jZSB0aGUgd2hvbGUgZmlsZSBpcyBhbHJlYWR5IHByZXNlbnQuCiAgU2hvdWxkIHRoaXMgcmV0dXJuIE9LIGluc3RlYWQ/CgotIEkgYWRkZWQgJ2N1cmwtY29uZmlnLmluJyB0byB0aGUgcm9vdCBkaXIgYW5kIGNvbmZpZ3VyZSBzY3JpcHQuIE5vdywgYQogIGN1cmwtY29uZmlnIHNjcmlwdCBpcyBtYWRlIHdoZW4gY3VybCBpcyBidWlsdC4gVGhlIHNjcmlwdCBjYW4gYmUgdXNlZCB0bwogIGZpZ3VyZSBvdXQgY29tcGlsZSB0aW1lIG9wdGlvbnMgdXNlZCB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0LCB3aGljaCBpbiB0dXJuCiAgc2hvdWxkIGJlIG9wdGlvbnMgWU9VIHNob3VsZCB1c2UgdG8gYnVpbGQgYXBwbGljYXRpb25zIHRoYXQgdXNlIGxpYmN1cmwuCgogIFRoaXMgKi1jb25maWcgc3R5bGUgaXMgbm90IGEgbmV3IGlkZWEsIGJ1dCBzb21ldGhpbmcgdGhhdCBoYXMgYmVlbiB1c2VkCiAgc3VjY2Vzc2Z1bGx5IGluIG90aGVyIChsaWJyYXJ5IGJhc2VkKSBwcm9qZWN0cy4KCi0gUGhpbCBLYXJuIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB3cm9uZ2x5IGRpZCBub3QgYWx3YXlzIHVzZSBHTVQgdGltZSB6b25lCiAgZm9yIHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBzdHlsZSBoZWFkZXJzLgoKLSBHZW9yZyBTY2h3YXJ6IHBvaW50ZWQgb3V0IGFuIGV4dHJhIG5lZWRlZCAjaW5jbHVkZSBmaWxlIG5lZWRlZCBpbiBzcmMvbWFpbi5jCiAgZm9yIGN1cmwgdG8gYnVpbGQgb24gVWx0cml4LgoKRGFuaWVsICgxMSBBcHJpbCAyMDAxKQotIENyaXMgQmFpbGlmZiBwb2ludGVkIG91dCB0d28gcHJvYmxlbXMgdGhhdCBJIGNvcnJlY3RlZC4gRmlyc3QsIGxpYmN1cmwncyB1c2UKICBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgSFRUUF9QUk9YWSBpbiB1cHBlcmNhc2UgbWF5IGJlY29tZSBhIHNlY3VyaXR5CiAgaGF6YXJkIHdoZW4gcGVvcGxlIHVzZSBsaWJjdXJsIGluIGEgc2VydmVyL2NnaSBzaXR1YXRpb24gd2hlcmUgdGhlIHNlcnZlcgogIHNldHMgdGhlIEhUVFBfKi12YXJpYWJsZXMgYWNjb3JkaW5nIHRvIGluY29taW5nIGhlYWRlcnMgaW4gdGhlIEhUVFAKICByZXF1ZXN0LiBUaHVzLCBhICJQcm94eToiLWhlYWRlciB3b3VsZCBzZXQgdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZSEKCiAgVGhlbiwgaW52b2tpbmcgY3VybF9lYXN5X3BlcmZvcm0oKSB3aXRob3V0IGhhdmluZyBhbiBVUkwgc2V0IGNhdXNlZCBhIGNyYXNoLgoKLSBTLiBNb29uZXNhbXkgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZSBjdXJsIHVzZSBub24tYmxvY2tpbmcgY29ubmVjdHMgb24KICB3aW5kb3dzIHdoZW4gY29ubmVjdGlvbiB0aW1lb3V0IGlzIHNldCwgYXMgaXQgYWxsb3dzIHdpbmRvd3MgdXNlcnMgdG8gc2V0CiAgdGhhdCB0aW1lb3V0IQoKLSBIaXJvdGFrYSBNYXRzdXl1a2kgd3JvdGUgYSBSdWJ5IGludGVyZmFjZSB0byBsaWJjdXJsIQoKLSBDcmlzIEJhaWxpZmYsIEZvcnJlc3QgQ2Fob29uIGFuZCBHZW9yZyBIb3JuIHdvcmsgb24gdGhlIFBlcmwgaW50ZXJmYWNlLgoKLSBJJ3ZlIHdyaXR0ZW4gYSBmaXJzdCBzaG90IGF0IGEgSmF2YSBpbnRlcmZhY2UgdG8gbGliY3VybC4gTWFueSB0aGFua3MgdG8KICBEYW5pZWwgTWFyZWxsIGZvciB0aXJlbGVzc2x5IGFuc3dlcmluZyB0byBhbGwgbXkgYmFzaWMgSmF2YSBxdWVzdGlvbnMuIEl0CiAgd29ya3MsIGJ1dCBpdCBpcyBzdGlsbCB2ZXJ5IGJhc2ljLgoKRGFuaWVsICgxMCBBcHJpbCAyMDAxKQotIFRoZSBwcm9ncmVzcyBkaXNwbGF5IGNvdWxkIGdldCBzaWxseSB3aGVuIGRvaW5nIG11bHRpcGxlIGZpbGUgdHJhbnNmZXJzLCBhcwogIGl0IHdhc24ndCBwcm9wZXJseSByZXNldCBiZXR3ZWVuIHRyYW5zZmVycyEKCi0gRGlzY3Vzc2lvbnMgd2l0aCBDcmlzIEJhaWxpZmYgd2hvIHdyaXRlcyBhIFBlcmwgaW50ZXJmYWNlIHRvIGxpYmN1cmwsIG1hZGUKICBtZSBhZGQgQ1VSTE9QVF9IRUFERVJGVU5DVElPTi4gSXQgY2FuIGJlIHVzZWQgdG8gc2V0IGEgc2VwYXJhdGUgY2FsbGJhY2sKICBmdW5jdGlvbiBmb3Igd3JpdGluZyBoZWFkZXJzLiBQcmV2aW91c2x5IHlvdSBjb3VsZCBvbmx5IHNldCBhIGRpZmZlcmVudCBGSUxFCiAgKiB3aGVuIGhlYWRlcnMgYXJlIHdyaXR0ZW4gZnJvbSB3aXRoaW4gbGliY3VybC4KCkRhbmllbCAoNyBBcHJpbCAyMDAxKQotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBwcm9ibGVtIGluIGN1cmxfZXNjYXBlKCkgYW5kIHBvaW50ZWQgb3V0IGEgZmxhdyBpbgogIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlLgoKRGFuaWVsICg2IEFwcmlsIDIwMDEpCi0gQWRqdXN0ZWQgdGhlIHZlcnNpb24gY29kZSB0byBwcm9wZXJseSBkaXNwbGF5IE9wZW5TU0wgMC45LjZhLiBUaGV5IHN1cmUKICBjaGFuZ2UgdGhlaXIgdmVyc2lvbiBkZWZpbmUgZm9ybWF0IG9mdGVuLi4uCgotIGN1cmxfZm9ybWZyZWUoKSBub3cgYWNjZXB0cyBhIE5VTEwgcG9pbnRlciB3aXRob3V0IGNyYXNoaW5nIQoKVmVyc2lvbiA3LjcuMQoKRGFuaWVsICgzIEFwcmlsIDIwMDEpCi0gUHVuZWV0IFBhd2FpYSBwb2ludGVkIG91dCB0d28gc2VyaW91cyBwcm9ibGVtcy4gTGliY3VybCB3b3VsZCBhdHRlbXB0IHRvCiAgcmVhZCBiYWQgbWVtb3J5IGR1cmluZyBzaXR1YXRpb25zIHdoZW4gYW4gKGZ0cCkgY29ubmVjdGlvbiBhdHRlbXB0IGZhaWxlZC4KICBBbHNvLCB0aGUgbGliL01ha2VmaWxlLnZjNiB3YXMgY29ycmVjdGVkLgoKLSBNb3JlIGludmVzdGlnYXRpb25zIGluIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIGNvZGUgbWFkZSBtZSByZWFsaXplIHRoYXQKICBpdCB3YXMgbm90IGNsZWFuIGVub3VnaCB0byB3b3JrIHRyYW5zcGFyYW50bHkgd2l0aCBwZXJzaXN0ZW50IGFuZCBub24tCiAgcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gSSB0aGluayBJJ3ZlIGZpeGVkIGl0IG5vdy4KCkRhbmllbCAoMjkgTWFyY2ggMjAwMSkKLSBHZW9yZyBIb3JuIG1haWxlZCBtZSBzb21lIGNvcnJlY3Rpb25zIGZvciB0aGUgQ3VybDo6ZWFzeSBwZXJsIGludGVyZmFjZS4KCi0gRXhwZXJpbWVudGFsIGZ0cHM6Ly8gc3VwcG9ydCBhZGRlZC4gSXQgaXMgYmFzaWNhbGx5IEZUUCBvdmVyIFNTTCBmb3IgdGhlCiAgY29udHJvbCBjb25uZWN0aW9uLiBJdCBzdGlsbCBtYWtlcyBhbGwgZGF0YSB0cmFuc2ZlcnMgZ29pbmcgb3ZlciB1bmVuY3J5cHRlZAogIGNvbm5lY3Rpb25zLiBSYWluZXIgV2Vpa3VzYXQncyBmdHBkLXNzbCBzZXJ2ZXIgaGFjayBzdXBwb3J0cyB0aGlzIGFuZCBJIHVzZWQKICB0aGF0IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCkRhbmllbCAoMjcgTWFyY2ggMjAwMSkKLSBHdWVub2xlIEJlc2NvbiBkaXNjb3ZlcmVkIHRoYXQgaWYgeW91IHNldCBhIENVUkxPUFRfVElNRU9VVCBhbmQgdGhlbiB0cmllZAogIHRvIGdldCBhIGZpbGUgZnJvbSBhIHNpdGUgYW5kIGl0IGZhaWxzLCB0aGUgU0lHQUxSTSB3b3VsZCBzdGlsbCBiZSBzZW50CiAgYWZ0ZXIgdGhlIHRpbWVvdXQtdGltZSwgcXVpdGUgaW5leHBlY3RlZGx5IQoKLSBJIGFkZGVkIGFuIGZ0cCB0cmFuc2ZlciBleGFtcGxlIHRvIGRvY3MvZXhhbXBsZXMvIGFuZCBJIGFsc28gd3JvdGUgYSB0aW55CiAgZXhhbXBsZSBtYWtlZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc3RhcnQgd2hlbiBidWlsZGluZyBvbmUgb2YgdGhlCiAgZXhhbXBsZXMuCgpWZXJzaW9uIDcuNy4xLWJldGExCgpEYW5pZWwgKDI2IE1hcmNoIDIwMDEpCi0gTW9oYW1lZCBMcmhhemkgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCA3LjYuMSBhbmQgcGVyc2lzdGVudCBIVFRQLzEuMAogIGNvbm5lY3Rpb25zICh3aGVuIHRoZSBzZXJ2ZXIgcmVwbGllZCBhIENvbm5lY3Rpb246IEtlZXAtQWxpdmUpIGFuZCB0aGlzCiAgcHJvYmxlbSB3YXMgbm90IHByb3Blcmx5IGRlYWx0IHdpdGggaW4gNy43IGVpdGhlci4gQSBwYXRjaCB3YXMgcG9zdGVkIHRvIHRoZQogIGN1cmwtYW5kLXBocCBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgKDI0IE1hcmNoIDIwMDEpCi0gQ29saW4gV2F0c29uIHJlcG9ydGVkIGFib3V0IGEgcHJvYmxlbSBhbmQgYnJvdWdodCBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGl0LAogIHdoaWNoIHdhcyBhYm91dCB0aGUgbWFuIHBhZ2UgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgcXVvdGUgKCcpIGluIGEKICB3YXkgdGhhdCBnbnJvZmYgZG9lc24ndCBsaWtlLgoKRGFuaWVsICgyMyBNYXJjaCAyMDAxKQotIFBldGVyIEJyYXkgcmVwb3J0ZWQgY29ycmVjdGx5IHRoYXQgdGhlIHJvb3QgbWFrZWZpbGUgdXNlZCBtYWtlIGluc3RlYWQgb2YKICAkKE1BS0UpIGZvciB0aGUgdGVzdCB0YXJnZXQuCgotIENvcnJlY3RlZCB0aGUgQ3VybDo6ZWFzeSBwZXJsIGludGVyZmFjZSB0byB1c2UgY3VybF9lYXN5X3NldG9wdCgpIGFuZCBub3QKICBjdXJsX3NldG9wdCgpIHdoaWNoIHdhcyByZW1vdmVkIGluIDcuNyEKCi0gUy4gTW9vbmVzYW15IHByb3ZpZGVkIHVwZGF0ZXMgb24gdGhyZWUgZG9jdW1lbnRzIChNQU5VQUwsIElOU1RBTEwgYW5kIEZBUSkuCgotIFdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246LCBsaWJjdXJsIHdvdWxkIHNvbWV0aW1lcyB3cml0ZSB0byB0aGUgVVJMIHN0cmluZwogIGluIGEgd2F5IGl0IHNob3VsZG4ndC4gQXMgdGhlIHBvaW50ZXIgaXMgcGFzc2VkLWluIHRvIGxpYmN1cmwgZnJvbSBhbgogIGFwcGxpY2F0aW9uLCB3ZSBjYW4ndCBiZSBhbGxvd2VkIHRvIHdyaXRlIHRvIGl0LiBUaGUgcGFydGljdWxhciBidWcgcmVwb3J0CiAgZnJvbSAnbmsnIHRoYXQgYnJvdWdodCB0aGlzIHVwIHdhcyBiZWNhdXNlIGhlIGhhZCBhIHJlYWQtb25seSBVUkwgdGhhdCB0aGVuCiAgY2F1c2VkIGEgbGliY3VybCBjcmFzaCEKCi0gTm8gbG9uZ2VyIHJlYWRzIEhFQUQgcmVzcG9uc2VzIGxvbmdlciB0aGFuIHRvIHRoZSBsYXN0IGhlYWRlci4gUHJldmlvdXNseSwKICBjdXJsIHdvdWxkIHJlYWQgdGhlIGZ1bGwgcmVwbHkgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGEgImNsb3NlIiBvbmUuCgotIGxpYmN1cmwgZGlkIHJlLXVzZSBjb25uZWN0aW9ucyB3YXkgdG9vIG11Y2guIERvaW5nICJjdXJsCiAgaHR0cDovL3d3dy57bWljcm9zb2Z0LGlibX0uY29tIiB3b3VsZCBtYWtlIGl0IHJlLXVzZSB0aGUgY29ubmVjdGlvbiB3aGljaAogIG1hZGUgdGhlIHNlY29uZCByZXF1ZXN0IHJldHVybiB2ZXJ5IG9kZCByZXN1bHRzLgoKRGFuaWVsICgyMiBNYXJjaCAyMDAxKQotIEVkaW4gS2FkcmliYXNpYyBtYWRlIG1lIGF3YXJlIHRoYXQgY3VybCBzaG91bGQgbm90IHJlLXNlbmQgUE9TVCByZXF1ZXN0cwogIHdoZW4gZm9sbG93aW5nIDMwMi1yZWRpcmVjdHMuIEkgbWFkZSAzMDIgd29yayBsaWtlIDMwMyB3aGljaCBtZWFucyBjdXJsIHVzZXMKICBHRVQgaW4gdGhlIGZvbGxvd2luZyByZXF1ZXN0KHMpLgoKLSBsaWJjdXJsIG5vdyByZXNldCB0aGUgImZvbGxvd2VkLWxvY2F0aW9uIiBjb3VudGVyIG9uIGVhY2ggaW52b2tlIG9mCiAgY3VybF9lYXN5X3BlcmZvcm0oKSBhcyBpdCBvdGhlcndpc2Ugd291bGQgc3VtIHVwIGFsbCByZWRpcmVjdHMgb24gdGhlIHNhbWUKICBjb25uZWN0aW9uIGFuZCB0aHVzIGNvdWxkIHJlYWNoIHRoZSBtYXhyZWRpcnMgY291bnRlciB3cm9uZ2x5LgoKLSBKaW0gRHJhc2ggc3VnZ2VzdGVkIGN1cmxfZXNjYXBlKCkgc2hvdWxkIG5vdCByZS1lbmNvZGUgd2hhdCBhbHJlYWR5IGxvb2tzCiAgbGlrZSBhbiBlbmNvZGVkIHNlcXVlbmNlIGFuZCBJIHRoaW5rIHRoYXQncyBhIGZhaXIgc3VnZ2VzdGlvbi4KClZlcnNpb24gNy43CgpEYW5pZWwgKDIyIE1hcmNoIDIwMDEpCi0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGZhaWxzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBnZXRob3N0YnluYW1lX3IoKSBpcwogIGRldGVjdGVkIGJ1dCBpdCBjb3VsZG4ndCBmaWd1cmUgb3V0IGhvdyB0byBpbnZva2UgaXQgKHdoYXQgYW1vdW50IG9mCiAgYXJndW1lbnRzIGl0IGlzIHN1cHBvc2VkIHRvIGdldCkuIFJlcG9ydHMgZnJvbSBBbmRy6XMgR2FyY+1hIG1hZGUgbWUgYXdhcmUKICBvZiB0aGlzIG5lZWQuCgotIFRhbGtpbmcgd2l0aCBKaW0gRHJhc2ggbWFkZSBtZSBmaW5hbGx5IHB1dCB0aGUgY3VybF9lc2NhcGUgYW5kIGN1cmxfdW5lc2NhcGUKICBmdW5jdGlvbnMgaW4gdGhlIGN1cmwuaCBpbmNsdWRlIGZpbGUgYW5kIHdyaXRlIG1hbiBwYWdlcyBmb3IgdGhlbS4gVGhlCiAgZXNjYXBlIGZ1bmN0aW9uIHdhcyBtb2RpZmllZCB0byB1c2UgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZSB1bmVzY2FwZSBvbmUKICBoYWQuCgotIE5vIGJ1ZyByZXBvcnRzIGF0IGFsbCBvbiB0aGUgbGF0ZXN0IGJldGFzLiBSZWxlYXNlIHRpbWUgY29taW5nIHVwLgoKVmVyc2lvbiA3LjctYmV0YTUKCkRhbmllbCAoMTkgTWFyY2ggMjAwMSkKLSBHZW9yZyBPdHRpbmdlciByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIHVzaW5nIC1DIHRvZ2V0aGVyIHdpdGggLUwgaW4gdGhlIHNlbnNlCiAgdGhhdCB0aGUgLUMgaW5mbyBnb3QgbG9zdCB3aGVuIGl0IHdhcyByZWRpcmVjdGVkLiBJIGNvdWxkIG5vdCByZXBlYXQgdGhpcwogIHByb2JsZW0gb24gdGhlIDcuNyBicmFuY2ggd2h5IEkgbGVhdmUgdGhpcyBmb3IgdGhlIG1vbWVudC4gVGVzdCBjYXNlIDM5IHdhcwogIGFkZGVkIHRvIGRvIGV4YWN0bHkgdGhpcywgYW5kIGl0IHNlZW1zIHRvIGRvIHJpZ2h0LgoKLSBDaHJpc3RpYW4gUm9ib3R0b20gUmVpcyByZXBvcnRlZCBob3cgaGlzIDcuNyBiZXRhIGRpZG4ndCBzdWNjZXNzZnVsbHkgZG8KICBmb3JtIHBvc3RzIGFzIGVsZWdhbnRseSBhcyA3LjYuMSBkaWQuIEluZGVlZCwgdGhpcyB3YXMgYSBmbGF3IGluIHRoZSBoZWFkZXIKICBlbmdpbmUsIGFzIEhUVFAgMS4xIGhhcyBpbnRyb2R1Y2VkIGEgbmV3IDEwMCAidHJhbnNpZW50IiByZXR1cm4gY29kZSBmb3IgUFVUCiAgYW5kIFBPU1Qgb3BlcmF0aW9ucyB0aGF0IEkgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IuIFNlY3Rpb24gOC4yLjMgaW4gUkZDMjYxNgogIGhhcyBhbGwgdGhlIGRldGFpbHMuIFNlZW1zIHRvIHdvcmsgbm93IQoKRGFuaWVsICgxNiBNYXJjaCAyMDAxKQotIEFmdGVyIGhhdmluZyBleHBlcmllbmNlZCBhbm90aGVyIG1hY2hpbmUgYnJlYWstZG93biwgd2UncmUgYmFjay4KCi0gR2VvcmcgSG9ybidzIHBlcmwgaW50ZXJmYWNlIEN1cmw6OmVhc3kgaXMgbm93IGluY2x1ZGVkIGluIHRoZSBjdXJsIHJlbGVhc2UKICBhcmNoaXZlLiBUaGUgcGVybC8gZGlyZWN0b3J5IGlzIG5vdyBwcmVzZW50LiBQbGVhc2UgaGVscCBtZSB3aXRoIGRvY3MsCiAgZXhhbXBsZXMgYW5kIHVwZGF0ZXMgeW91IHRoaW5rIGZpdC4KCi0gTWFkZSBhIG5ldyBwaHAvIGRpcmVjdG9yeSBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlIGFuZCBtb3ZlZCB0aGUgUEhQIGV4YW1wbGVzCiAgaW50byBhIHN1YmRpcmVjdG9yeSBpbiB0aGVyZS4gTm90IG11Y2ggUEhQIGluZm8geWV0LCBidXQgSSBwbGFuIHRvLiBQbGVhc2UKICBoZWxwIG1lIGhlcmUgYXMgd2VsbCEKCi0gTWFkZSBsaWJjdXJsIHJldHVybiBlcnJvciBpZiBhIHRyYW5zZmVyIGlzIGFib3J0ZWQgaW4gdGhlIG1pZGRsZSBvZiBhCiAgImNodW5rIi4gSXQgYWN0dWFsbHkgZW5hYmxlcyBsaWJjdXJsIHRvIGRpc2NvdmVyIHByZW1hdHVyZSB0cmFuc2ZlciBhYm9ydHMKICBldmVuIGlmIHRoZSBDb250ZW50LUxlbmd0aDogc2l6ZSBpcyB1bmtub3duLgoKRGFuaWVsICgxNSBNYXJjaCAyMDAxKQotIEFkZGVkIC0tY29ubmVjdC10aW1lb3V0IHRvIGN1cmwsIHdoaWNoIHNldHMgdGhlIG5ldyBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUCiAgb3B0aW9uIGluIGxpYmN1cmwuIEl0IGxpbWl0cyB0aGUgdGltZSBjdXJsIGlzIGFsbG93ZWQgdG8gc3BlbmQgaW4gdGhlCiAgY29ubmVjdGlvbiBwaGFzZS4gVGhpcyBkaWZmZXJzIGZyb20gLW0vLS1tYXgtdGltZSB0aGF0IGxpbWl0cyB0aGUgZW50aXJlCiAgZmlsZSB0cmFuc2ZlciBvcGVyYXRpb24uIFJlcXVlc3RlZCBieSBMYXJyeSBGYWhub2UgYW5kIG90aGVycy4KCiAgSSBhbHNvIHVwZGF0ZWQgdGhlIGN1cmwuMSBhbmQgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlcyBhbmQgcmVtb3ZlZCB0aGUKICBpdGVtIGZyb20gdGhlIFRPRE8uCgpWZXJzaW9uIDcuNy1iZXRhNAoKRGFuaWVsICgxNCBNYXJjaCAyMDAxKQotIE1hZGUgY3VybCBncm9rIElQdjYgd2l0aCBIVFRQIHByb3hpZXMgYW5kIGdvdCBldmVyeXRoaW5nIHRvIGNvbXBpbGUgbmljZWx5CiAgYWdhaW4gd2hlbiBFTkFCTEVfSVBWNiBpcyBzZXQuCgogIEkgbmVlZCB0byByZW1ha2UgdGhpbmdzIGluIHRoZSB0ZXN0IHN1aXRlLiBJIGNhbid0IHRlc3QgdGhlIEZUUCBwYXJ0cyB3aXRoCiAgY3VybCBidWlsdCBmb3IgSVB2NiBhcyBpdCB1c2VzIGEgZGlmZmVyZW50IHNldCBvZiBGVFAgY29tbWFuZHMgdGhlbiEKCi0gSSBmZWxsIG9udG8gYSBidWcgcmVwb3J0IG9uIHBocC5uZXQgKHBvc3RlZCBieSBMYXJzIFRvcmJlbiBXaWxzb24pIHRoYXQgd2FzCiAgYSByZXBvcnQgbWVhbnQgZm9yIG91ciBwcm9qZWN0LiBBbnl3YXksIGl0IHNhaWQgdGhlIC5uZXRyYyBwYXJzaW5nIGRpZG4ndAogIHdvcmsgYXMgc3VwcG9zZWQsIGFuZCBhcyBJIGFncmVlZCB3aXRoIExhcnMsIEkgbWFkZSB0aGUgbmV0cmMgcGFyc2VyIHVzZQogIGdldHB3dWlkKCkgdG8gZmlndXJlIG91dCB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIGVmZmVjdGl2ZSB1c2VyIGFuZCB0cnkKICB0aGF0IG5ldHJjLiBJdCBzdGlsbCB1c2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBIT01FIGZvciB0aG9zZSB0aGF0IGRvbid0CiAgaGF2ZSB0aGF0IGZ1bmN0aW9uIG9yIGlmIHRoZSB1c2VyIGRvZXNuJ3QgcmV0dXJuIHZhbGlkIHB3ZCBpbmZvLgoKLSBFZGluIEthZHJpYmFpYyBwb3N0ZWQgYSBidWcgcmVwb3J0IHdoZXJlIGhlIGdvdCBhIGNyYXNoIHdoZW4gYSBmZXRjaCB3aXRoCiAgdXNlcitwYXNzd29yZCBpbiB0aGUgVVJMIGZvbGxvd2VkIGEgTG9jYXRpb246IHRvIGEgc2Vjb25kIFVSTCAoYWJzb2x1dGUsCiAgd2l0aG91dCBuYW1lK3Bhc3N3b3JkKS4gVGhpcyBidWcgaGFzIGJlZW4gYXJvdW5kIGZvciBhIGxvbmcgd2hpbGUgYW5kCiAgY3Jhc2hlcyBkdWUgdG8gYSByZWFkIGF0IGFkZHJlc3MgemVyby4gRml4ZWQgbm93LiBXcm90ZSB0ZXN0IGNhc2UgMzgsIHRoYXQKICB0ZXN0cyB0aGlzLgoKLSBNb2RpZmllZCB0aGUgdGVzdCBzdWl0ZSdzIGh0dHBzZXJ2ZXIgc2xpZ2h0bHkgdG8gYXBwZW5kIGFsbCBjbGllbnQgcmVxdWVzdAogIGRhdGEgdG8gaXRzIGxvZyBmaWxlIHNvIHRoYXQgdGhlIHRlc3Qgc2NyaXB0IG5vdyBiZXR0ZXIgY2FuIHZlcmlmeSBhIHJhbmdlCiAgb2YgcmVxdWVzdHMgYW5kIG5vdCBvbmx5IHRoZSBsYXN0IG9uZSwgYXMgaXQgZGlkIHByZXZpb3VzbHkuCgotIFVwZGF0ZWQgdGhlIGN1cmwgbWFuIHBhZ2Ugd2l0aCAtLXJhbmRvbS1maWxlIGFuZCAtLWVnZC1maWxlIGRldGFpbHMuCgpWZXJzaW9uIDcuNy1iZXRhMwoKRGFuaWVsICgxNCBNYXJjaCAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIHByb3ZpZGVkIHNpbWlsYXIgZml4ZXMgYXMgSvZybiBkaWQgYW5kIHNvbWUgYWRkaXRpb25hbCBwYXRjaGVzCiAgZm9yIG5vbi1TU0wgY29tcGlsZXMuCgotIEkgaW5jcmVhc2VkIHRoZSBpbnRlcmZhY2UgbnVtYmVyIGZvciBsaWJjdXJsIGFzIEkndmUgcmVtb3ZlZCB0aGUgbG93IGxldmVsCiAgZnVuY3Rpb25zIGZyb20gdGhlIGludGVyZmFjZS4gSSBhbHNvIHRvb2sgdGhpcyBvcHBvcnR1bml0eSB0byByZW5hbWUgdGhlCiAgQ3VybF9zdHJlcXVhbCBmdW5jdGlvbiB0byBjdXJsX3N0cmVxdWFsIGFuZCBDdXJsX3N0cm5lcXVhbCB0bwogIGN1cmxfc3RybmVxdWFsLCBhcyB0aGV5J3JlIHB1YmxpYyBsaWJjdXJsIGZ1bmN0aW9ucyAoZXZlbiBpZiB0aGV5J3JlIHN0aWxsCiAgdW5kb2N1bWVudGVkKS4KCiAgVGhpcyB3aWxsIG1ha2Ugb2xkZXIgcHJvZ3JhbXMgbm90IGNhcGFibGUgb2YgdXNpbmcgdGhlIG5ldyBsaWJjdXJsIHdpdGgKICBqdXN0IGEgZHJvcC1pbiByZXBsYWNlbWVudC4KCi0gSvZybiBIYXJ0cm90aCB1cGRhdGVkIHN0dWZmIGZvciB3aW4zMiBjb21waWxlczoKICBvIGNvbmZpZy13aW4zMi5oIHdhcyBmaXhlZCBmb3Igc29ja2xlbl90CiAgbyBsaWIvc3NsdXNlLmMgaGFkIGEgYmFkICNlbmRpZiBwbGFjZW1lbnQKICBvIGxpYi9maWxlLmMgd2FzIG1hZGUgdG8gY29tcGlsZSBvbiB3aW4zMiBhZ2FpbgogIG8gbGliL01ha2VmaWxlLm0zMiB3YXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcgZmlsZXMKICBvIGxpYi9saWJjdXJsLmRlZiBtYXRjaGVzIHRoZSBjdXJyZW50IGludGVyZmFjZSBzdGF0ZQoKRGFuaWVsICgxMyBNYXJjaCAyMDAxKQotIEl0IG9ubHkgdG9vayBhbiBob3VyIG9yIHNvIGJlZm9yZSBK9nJuIEhhcnRyb3RoIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUKICBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLiBHaXZlbiBoaXMgZmluZSBleGFtcGxlLXNpdGUsIEkgY291bGQgZWFzaWx5IHNwb3QKICB0aGUgcHJvYmxlbSBhbmQgd2hlbiBJIHJlLXJlYWQgdGhlIHNwZWMgKHRoZSBwYXJ0IEkgaGF2ZSBwYXN0ZWQgaW4gdGhlIHRvcAogIG9mIHRoZSBodHRwX2NodW5rcy5oIGZpbGUpLCBJIHJlYWxpemVkIEkgaGFkIG1hZGUgbXkgc3RhdGUtbWFjaGluZSBzbGlnaHRseQogIHdyb25nIGFuZCBkaWRuJ3QgZXhwZWN0L2hhbmRsZSB0aGUgdHJhaWxpbmcgQ1JMRiB0aGF0IGNvbWVzIGFmdGVyIHRoZSBkYXRhCiAgaW4gZWFjaCBjaHVuayAoYW5kIHRob3NlIGV4dHJhIHR3byBieXRlcyBzdXJlIGZlZWwgd2FzdGVkKS4KCiAgSGFkIHRvIG1vZGlmeSB0ZXN0IGNhc2UgMzQgdG8gbWF0Y2ggdGhpcyBhcyB3ZWxsLgoKVmVyc2lvbiA3LjctYmV0YTIKCkRhbmllbCAoMTMgTWFyY2ggMjAwMSkKLSBBZGRlZCB0aGUgcG9saWN5IHN0dWZmIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIGZvciB0aGUgdHdvIHN1cHBvcnRlZAogIHBvbGljaWVzLgoKLSBJbXBsZW1lbnRlZCBzb21lIHN1cHBvcnQgZm9yIHRoZSBDVVJMT1BUX0NMT1NFUE9MSUNZIG9wdGlvbi4gVGhlIHBvbGljaWVzCiAgQ1VSTENMT1NFUE9MSUNZX0xFQVNUX1JFQ0VOVExZX1VTRUQgYW5kIENVUkxDTE9TRVBPTElDWV9PTERFU1QgYXJlIG5vdwogIHN1cHBvcnRlZCwgYW5kIHRoZSAibGVhc3QgcmVjZW50bHkgdXNlZCIgaXMgdXNlZCBhcyBkZWZhdWx0IGlmIG5vIHBvbGljeQogIGlzIGNob3Nlbi4KCkRhbmllbCAoMTIgTWFyY2ggMjAwMSkKLSBBZGRlZCBDVVJMT1BUX1JBTkRPTV9GSUxFIGFuZCBDVVJMT1BUX0VHRFNPQ0tFVCB0byBsaWJjdXJsIGZvciBzZWVkaW5nIHRoZQogIFNTTCByYW5kb20gZW5naW5lLiBUaGUgcmFuZG9tIHNlZWRpbmcgc3VwcG9ydCB3YXMgYWxzbyBicm91Z2h0IHRvIHRoZSBjdXJsCiAgY2xpZW50IHdpdGggdGhlIG5ldyBvcHRpb25zIC0tcmFuZG9tLWZpbGUgPGZpbGU+IGFuZCAtLWVnZC1maWxlIDxmaWxlPi4gSQogIG5lZWQgc29tZSBwZW9wbGUgdG8gcmVhbGx5IHRlc3QgdGhpcyB0byBrbm93IHRoZXkgd29yayBhcyBzdXBwb3NlZC4gUmVtZW1iZXIKICB0aGF0IGxpYmN1cmwgbm93IGluZm9ybXMgKGlmIHZlcmJvc2UgaXMgb24pIGlmIHRoZSByYW5kb20gc2VlZCBpcyBjb25zaWRlcmVkCiAgd2VhayAoSFRUUFMgY29ubmVjdGlvbnMpLgoKLSBNYWRlIHRoZSBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nIGVuZ2luZSBkZXRlY3RlZCBiYWQgZm9ybWF0dGVkIGRhdGEgbGVuZ3RoCiAgYW5kIHJldHVybiBlcnJvciBpZiBzbyAod2UgY2FuJ3QgcG9zc2libHkgZXh0cmFjdCBzZW5zaWJsZSBkYXRhIGlmIHRoaXMgaXMKICB0aGUgY2FzZSkuIEFkZGVkIGEgdGVzdCBjYXNlIHRoYXQgZGV0ZWN0cyB0aGlzLiBOdW1iZXIgMzYuIE5vdyB0aGVyZSBhcmUgNjAKICB0ZXN0IGNhc2VzLgoKLSBBZGRlZCA1IG5ldyBsaWJjdXJsIG9wdGlvbnMgdG8gY3VybC9jdXJsLmggdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZQogIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdXBwb3J0IGluIGxpYmN1cmwuIFRoZXkncmUgYWxzbyBkb2N1bWVudGVkIChmYWlybHkKICB0aG9yb3VnaGx5KSBpbiB0aGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlLiBUaHJlZSBvZiB0aGVtIGFyZSBub3cKICBpbXBsZW1lbnRlZCwgYWx0aG91Z2ggbm90IHJlYWxseSB0ZXN0ZWQgYXQgdGhpcyBwb2ludC4uLiBBbnl3YXksIHRoZSBuZXcKICBpbXBsZW1lbnRlZCBvcHRpb25zIGFyZSBuYW1lZCBDVVJMT1BUX01BWENPTk5FQ1RTLCBDVVJMT1BUX0ZSRVNIX0NPTk5FQ1QsCiAgQ1VSTE9QVF9GT1JCSURfUkVVU0UuIFRoZSBvbmVzIHN0aWxsIGxlZnQgdG8gd3JpdGUgY29kZSBmb3IgYXJlOgogIENVUkxPUFRfQ0xPU0VQT0xJQ1kgYW5kIGl0cyByZWxhdGVkIG9wdGlvbiBDVVJMT1BUX0NMT1NFRlVOQ1RJT04uCgotIE1hZGUgY3VybCAodGhlIGFjdHVhbCBjb21tYW5kIGxpbmUgdG9vbCkgdXNlIHRoZSBuZXcgbGliY3VybCA3LjcgcGVyc2lzdGVudAogIGNvbm5lY3Rpb24gc3VwcG9ydCBieSByZS11c2luZyB0aGUgc2FtZSBjdXJsIGhhbmRsZSBmb3IgZXZlcnkgc3BlY2lmaWVkIGZpbGUKICB0cmFuc2ZlciBhbmQgYWZ0ZXIgc29tZSBtb3JlIHRlc3QgY2FzZSB0d2Vha2luZyB3ZSBoYXZlIDEwMCUgdGVzdCBjYXNlIE9LLgogIEkgbWFkZSBzb21lIHRlc3QgY2FzZXMgcmV0dXJuIEhUVFAvMS4wIG5vdyB0byBtYWtlIHN1cmUgdGhhdCB3b3JrcyBhcyB3ZWxsLgoKLSBIYWQgdG8gYWRkICdDb25uZWN0aW9uOiBjbG9zZScgdG8gdGhlIGhlYWRlcnMgb2YgYSBidW5jaCBvZiB0ZXN0IGNhc2VzIHNvCiAgdGhhdCBjdXJsIGJlaGF2ZXMgIm9sZC1zdHlsZSIgc2luY2UgdGhlIHRlc3QgaHR0cCBzZXJ2ZXIgZG9lc24ndCBkbyBtdWx0aXBsZQogIGNvbm5lY3Rpb25zLi4uIE5vdyBJIGdldCAxMDAlIHRlc3QgY2FzZSBPSy4KCi0gVGhlIGN1cmwuaGF4eC5zZSBzaXRlLCB0aGUgbWFpbiBjdXJsIG1haWxpbmcgbGlzdCBhbmQgbXkgcGVyc29uYWwgZW1haWwgYXJlCiAgYWxsIGRlYWQgdG9kYXkgZHVlIHRvIHBvd2VyIGJsYWNrb3V0IGluIHRoZSBhcmVhIHdoZXJlIHRoZSBtYWluIHNlcnZlcnMgYXJlCiAgbG9jYXRlZC4gSG9ycmlibGUuCgotIEkndmUgbWFkZSBwZXJzaXN0YW5jZSB3b3JrIG92ZXIgYSBzcXVpZCBIVFRQIHByb3h5LiBJIGZpbmQgaXQgZGlzdHVyYmluZwogIHRoYXQgaXQgdXNlcyBoZWFkZXJzIHRoYXQgYXJlbid0IHByZXNlbnQgaW4gYW55IEhUVFAgc3RhbmRhcmQgdGhvdWdoCiAgKFByb3h5LUNvbm5lY3Rpb246KSBhbmQgdGhhdCBtYWtlcyBtZSBmZWVsIHRoYXQgSSdtIG5vdyBvbiB0aGUgZWRnZSBvZiB3aGF0CiAgdGhlIHN0YW5kYXJkIGFjdHVhbGx5IGRlZmluZXMuIEkgbmVlZCB0byBnZXQgdGhpcyBjb2RlIGV4Y2VyY2lzZWQgb24gYSBsb3QKICBvZiBkaWZmZXJlbnQgSFRUUCBwcm94aWVzIGJlZm9yZSBJIGZlZWwgc2FmZS4KCiAgTm93IEknbSBmYWNpbmcgdGhlIHByb2JsZW0gd2l0aCBteSB0ZXN0IHN1aXRlIHNlcnZlcnMgKGJvdGggRlRQIGFuZCBIVFRQKQogIG5vdCBzdXBwb3J0aW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIGxpYmN1cmwgaXMgZG9pbmcgdGhlbSBub3cuIEkgaGF2ZQogIHRvIGZpeCB0aGUgdGVzdCBzZXJ2ZXJzIHRvIGdldCBhbGwgdGhlIHRlc3QgY2FzZXMgZG8gT0suCgpEYW5pZWwgKDggTWFyY2ggMjAwMSkKLSBHdWVub2xlIEJlc2NvbiByZXBvcnRlZCB0aGF0IGxpYmN1cmwgZGlkIG91dHB1dCBlcnJvcnMgdG8gc3RkZXJyIGV2ZW4gaWYKICBNVVRFIGFuZCBOT1BST0dSRVNTIHdhcyBzZXQuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYSBidWcgYW5kIGhhcHBlbnMgaWYKICB0aGVyZSdzIGFuIGVycm9yIGFuZCBubyBFUlJPUkJVRkZFUiBpcyBzZXQuIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KClZlcnNpb24gNy43LWJldGExCgpEYW5pZWwgKDggTWFyY2ggMjAwMSkKLSAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiIGlzIG5vIGxvbmdlciBhbnkgdHJvdWJsZSBmb3IgbGliY3VybC4gSSd2ZQogIGFkZGVkIHR3byBzb3VyY2UgZmlsZXMgYW5kIEkndmUgcnVuIHNvbWUgdGVzdCBkb3dubG9hZHMgdGhhdCBsb29rIGZpbmUuCgotIEhUVFAgSEVBRCB3b3JrcyB0b28sIGV2ZW4gb24gMS4xIHNlcnZlcnMuCgpEYW5pZWwgKDUgTWFyY2ggMjAwMSkKLSBUaGUgY3VycmVudCA1NyB0ZXN0IGNhc2VzIG5vdyBwYXNzIE9LLiBJdCB3b3VsZCBzdWdnZXN0IHRoYXQgbGliY3VybCB3b3JrcwogIHVzaW5nIHRoZSBvbGQtc3R5bGUgd2l0aCBvbmUgY29ubmVjdGlvbiBwZXIgaGFuZGxlLiBUaGUgdGVzdCBzdWl0ZSBkb2Vzbid0CiAgaGFuZGxlIG11bHRpcGxlIGNvbm5lY3Rpb25zIHlldCBzbyB0aGVyZSBhcmUgbm8gdGVzdCBjYXNlcyBmb3IgdGhpcy4KCi0gSSBwYXRjaGVkIHRoZSB0ZWxuZXQuYyBoZWF2aWx5IHRvIG5vdCB1c2UgYW55IGdsb2JhbCB2YXJpYWJsZXMgYW55bW9yZS4gSXQKICBzaG91bGQgbWFrZSBpdCBhIGxvdCBuaWNlciBsaWJyYXJ5LXdpc2UuCgotIFRoZSBmaWxlOi8vIHN1cHBvcnQgd2FzIG1vZGlmaWVkIHNsaWdodGx5IHRvIHVzZSB0aGUgaW50ZXJuYWwgY29ubmVjdC1maXJzdC0KICB0aGVuLWRvIGFwcHJvYWNoLgoKRGFuaWVsICg0IE1hcmNoIDIwMDEpCi0gTW9yZSBidWdzIGVyYXNlZC4KClZlcnNpb24gNy43LWFscGhhMgoKRGFuaWVsICg0IE1hcmNoIDIwMDEpCi0gTm93LCB0aGVyZSdzIGV2ZW4gYSBiYXNpYyBjaGVjayB0aGF0IGEgcmUtdXNlZCBjb25uZWN0aW9uIGlzIHN0aWxsIGFsaXZlCiAgYmVmb3JlIGl0IGlzIGFzc3VtZWQgc28uIEEgZmV3IGZpcnN0IHRlc3RzIGhhdmUgcHJvdmVuIHRoYXQgbGliY3VybCB3aWxsCiAgdGhlbiByZS1jb25uZWN0IGluc3RlYWQgb2YgcmUtdXNlIHRoZSBkZWFkIGNvbm5lY3Rpb24hCgpEYW5pZWwgKDIgTWFyY2ggMjAwMSkKLSBOb3cgdGhleSB3b3JrIGludGVybWl4ZWQgYXMgd2VsbC4gTWFqb3IgY29vbG5lc3MhCgotIE1vcmUgZmlkZGxpbmcgYXJvdW5kLCBteSAndGlueScgY2xpZW50IEkgaGF2ZSBmb3IgdGVzdGluZyBwdXJwb3NlcyBub3cgaGFzCiAgcHJvdmVkIHRvIGRvd25sb2FkIGJvdGggRlRQIGFuZCBIVFRQIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gVGhleSBkbwogIG5vdCB3b3JrIGludGVybWl4ZWQgeWV0IHRob3VnaC4KCkRhbmllbCAoMSBNYXJjaCAyMDAxKQotIFdpbGZyZWRvIFNhbmNoZXogcG9pbnRlZCBvdXQgYSBtaW5vciBzcGVsbGluZyBtaXN0YWtlIGluIGEgbWFuIHBhZ2UgYW5kIHRoYXQKICBjdXJsX3NsaXN0X2FwcGVuZCgpIHNob3VsZCB0YWtlIGEgY29uc3QgY2hhciAqIGFzIHNlY29uZCBhcmd1bWVudC4gSXQgZG9lcwogIG5vdy4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMSkKLSBUaGUgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBzdGFydCB0byBsb29rIGdvb2QgZm9yIEhUVFAuIE9uIGEgc3Vic2VxdWVudAogIHJlcXVlc3QsIGl0IHNlZW1zIHRoYXQgbGliY3VybCBub3cgY2FuIHBpY2sgYW4gYWxyZWFkeSBleGlzdGluZyBjb25uZWN0aW9uCiAgaWYgYSBzdWl0YWJsZSBvbmUgZXhpc3RzLCBvciBpdCBvcGVucyBhIG5ldyBvbmUuCgotIERvdWdsYXMgUi4gSG9ybmVyIG1haWxlZCBtZSBjb3JyZWN0aW9ucyB0byB0aGUgY3VybF9mb3JtcGFyc2UoKSBtYW4gcGFnZQogIHRoYXQgSSBhcHBsaWVkLgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDAxKQotIEFkZGVkIHRoZSBkb2NzL2V4YW1wbGVzL3dpbjMyc29ja2V0cy5jIGZpbGUgZm9yIG91ciB3aW5kb3dzIGZyaWVuZHMuCgotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcHJvdmlkZWQgYnJhbmQgbmV3IFRFTE5FVCBmdW5jdGlvbmFsaXR5IGFuZAogIGltcHJvdmVtZW50czoKCiAgKiBOZWdvdGlhdGlvbiBpcyBub3cgcGFzc2l2ZS4gQ3VybCBkb2VzIG5vdCBuZWdvdGlhdGUgdW50aWwgdGhlIHBlZXIgZG9lcy4KICAqIFBvc3NpYmlsaXR5IHRvIHNldCBuZWdvdGlhdGlvbiBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUsIGN1cnJlbnRseSBvbmx5CiAgICBYRElTUExPQywgVFRZUEUgYW5kIE5FV19FTlZJUk9OIChjYWxsZWQgTkVXX0VOVikuCiAgKiBOb3cgc2VuZHMgdGhlIFVTRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgdGhlIC11IHN3aXRjaCBpcyB1c2VkLgogICogVXNlIC10IHRvIHNldCB0ZWxuZXQgb3B0aW9ucyAoTGludXMgZXZlbiB1cGRhdGVkIHRoZSBtYW4gcGFnZSwgYXdlc29tZSEpCgotIEhhdmVuJ3QgZG9uZSB0aGlzIGJpZyBjaGFuZ2VzIHRvIGN1cmwgZm9yIGEgd2hpbGUuIE1vdmVkIGFyb3VuZCBhIGxvdCBvZgogIHN0cnVjdCBmaWVsZHMgYW5kIHN0dWZmIHRvIG1ha2UgbXVsdGlwbGUgY29ubmVjdGlvbnMgZ2V0IGNvbm5lY3Rpb24gc3BlY2lmaWMKICBkYXRhIGluIHNlcGFyYXRlIHN0cnVjdHMgc28gdGhhdCB0aGV5IGNhbiBjby1leGlzdCBpbiBhIG5pY2Ugd2F5LiBTZWUgdGhlCiAgbWFpbGluZyBsaXN0cyBmb3IgZGlzY3Vzc2lvbnMgYXJvdW5kIGhvdyB0aGlzIGlzIGdvbm5hIGJlIGltcGxlbWVudGVkLiBEb2NzCiAgYW5kIG1vcmUgd2lsbCBmb2xsb3cuCgogIFN0dWRpZWQgdGhlIEhUVFAgUkZDIHRvIGZpbmQgb3V0IGJldHRlciBob3cgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBzaG91bGQKICB3b3JrLiBTZWVtcyBjb29sIGVub3VnaC4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwMSkKLSBCb2IgU2NoYWRlciBicm91Z2h0IG1lIHR3byBmaWxlcyB0aGF0IGhlbHAgc2V0IHVwIGEgTVMgVkMrKyBsaWJjdXJsIHByb2plY3QKICBlYXNpZXIuIEhlIGFsc28gcHJvdmlkZWQgbWUgd2l0aCBhbiB1cC10by1kYXRlIGxpYmN1cmwuZGVmIGZpbGUuCgotIEkgbW92ZWQgYSBidW5jaCBvZiBwcm90b3R5cGVzIGZyb20gdGhlIHB1YmxpYyA8Y3VybC9jdXJsLmg+IGZpbGUgdG8gdGhlCiAgbGlicmFyeSBwcml2YXRlIHVybGRhdGEuaC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSB1cGNvbWluZyBjaGFuZ2VzLiBUaGUKICBsb3cgbGV2ZWwgaW50ZXJmYWNlIGlzIG5vIGxvbmdlciBiZWluZyBwbGFubmVkIHRvIGJlY29tZSByZWFsaXR5LgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDAxKQotIENVUkxPUFRfUE9TVCBpcyBub3QgcmVxdWlyZWQgYW55bW9yZS4gSnVzdCBzZXR0aW5nIHRoZSBQT1NUIHN0cmluZyB3aXRoCiAgQ1VSTE9QVF9QT1NURklFTERTIHdpbGwgc3dpdGNoIG9uIHRoZSBIVFRQIFBPU1QuIE1vc3Qgb3RoZXIgdGhpbmdzIGluCiAgbGliY3VybCBhbHJlYWR5IHdvcmtzIHRoaXMgd2F5LCBpLmUgdGhleSByZXF1aXJlIG9ubHkgdGhlIHBhcmFtZXRlciB0bwogIHN3aXRjaCBvbiBhIGZlYXR1cmUgc28gSSB0aGluayB0aGlzIHdvcmtzIHdlbGwgd2l0aCB0aGUgcmVzdC4gU2V0dGluZyBhIE5VTEwKICBzdHJpbmcgc3dpdGNoZXMgb2ZmIHRoZSBQT1NUIGFnYWluLgoKLSBFeGNlbGxlbnQgc3VnZ2VzdGlvbnMgZnJvbSBSaWNoIEdyYXksIFJpY2sgSm9uZXMsIEpvaGFuIE5pbHNzb24gYW5kIEJqb3JuCiAgUmVlc2UgaGVscGVkIG1lIGRlZmluZSBhIHdheSBob3cgdG8gaW5jb3Jwb3JhdGUgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBpbnRvCiAgbGliY3VybCBpbiBhIHZlcnkgc21vb3RoIHdheS4gSWYgZG9uZSByaWdodCwgbm8gY2hhbmdlIG1heSBoYXZlIHRvIGJlIG1hZGUKICB0byBvbGRlciBwcm9ncmFtcyBhbmQgdGhleSB3aWxsIGp1c3Qgc3RhcnQgdXNpbmcgcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aGVuCiAgYXBwbGljYWJsZSEKCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwMSkKLSBDaGFuZ2VkIHRoZSB3b3JkICd0aW1lb3V0ZWQnIHRvICd0aW1lZCBvdXQnIGluIHR3byBkaWZmZXJlbnQgZXJyb3IgbWVzc2FnZXMuCiAgU3VnZ2VzdGVkIGJ5IExhcnJ5IEZhaG5vZS4KClZlcnNpb24gNy42LjEKCkRhbmllbCAoOSBGZWJydWFyeSAyMDAxKQotIEZyYW5rIFJlaWQgYW5kIENhaW4gSG9wd29vZCBwcm92aWRlZCBpbmZvcm1hdGlvbiBhbmQgcmVzZWFyY2ggYXJvdW5kIGEgSFRUUFMKICBQVVQvdXBsb2FkIHByb2JsZW0gd2Ugc2VlbSB0byBoYXZlLiBObyBzb2x1dGlvbiBmb3VuZCB5ZXQuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMSkKLSBBbiBpbnRlcmVzdGluZyBkaXNjdXNzaW9uIGlzIGhvdyB0byBzcGVjaWZ5IGFuIGVtcHR5IHBhc3N3b3JkIHdpdGhvdXQgaGF2aW5nCiAgY3VybCBhc2sgZm9yIGl0IGludGVyYWN0aXZlbHk/IFRoZSBjdXJyZW50IGltcGxtZW50YXRpb24gdGFrZXMgYW4gZW1wdHkKICBwYXNzd29yZCBhcyBhIHJlcXVlc3QgZm9yIGEgcGFzc3dvcmQgcHJvbXB0LiBIb3dldmVyLCBJIHN0aWxsIHdhbnQgdG8KICBzdXBwb3J0IGEgYmxhbmsgdXNlciBmaWVsZC4gVGh1cywgdG9kYXkgaWYgeW91IGVudGVyICItdSA6IiAod2l0aG91dCB1c2VyCiAgYW5kIHBhc3N3b3JkKSBjdXJsIHdpbGwgcHJvbXB0IGZvciB0aGUgcGFzc3dvcmQuIFRyaWNreS4gSG93IHdvdWxkIHlvdQogIHNwZWNpZnkgeW91IHdhbnQgdGhlIHByb21wdCBvdGhlcndpc2U/CgotIE1hZGUgdGhlIG5ldHJjIHBhcnNlIHJlc3VsdCBwb3NzaWJsZSB0byB1c2UgZm9yIG90aGVyIHByb3RvY29scyB0aGFuIEZUUCBhbmQKICBIVFRQIChzdWNoIGFzIHRoZSB1cGNvbWluZyBURUxORVQgZml4ZXMpLgoKLSBUaGUgcHJldmlvdXNseSBtZW50aW9uZWQgIk1TVkMrKyBwcm9ibGVtcyIgdHVybmVkIG91dCB0byBiZSBhIG5vbi1pc3N1ZS4KCi0gQWRkZWQgYSBIVFRQIGZpbGUgdXBsb2FkIGNvZGUgZXhhbXBsZSBpbiB0aGUgZG9jcy9leGFtcGxlcy8gc2VjdGlvbiBvbgogIHJlcXVlc3QuCgotIEFkanVzdGVkIHRoZSBGVFAgcmVzcG9uc2UgZml4IHNsaWdodGx5LgoKVmVyc2lvbiA3LjYuMS1wcmUzCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwMSkKLSBTLiBNb29uZXNhbXkgZm91bmQgYSBmbGF3IGluIHRoZSByZXNwb25zZSByZWFkaW5nIGZ1bmN0aW9uIGZvciBGVFAgdGhhdAogIGNvdWxkIG1ha2UgbGliY3VybCBub3QgZ2V0IG91dCBvZiB0aGUgbG9vcCBwcm9wZXJseSB3aGVuIGl0IHNob3VsZCwgaWYKICBsaWJjdXJsIGdvdCAtMSByZXR1cm5lZCB3aGVuIHJlYWRpbmcgdGhlIHNvY2tldC4KCi0gSSBmb3VuZCBhIHNpbWlsYXIgbWlzdGFrZSBpbiBodHRwLmMgd2hlbiB1c2luZyBhIHByb3h5IGFuZCByZWFkaW5nIHRoZQogIHJlc3VsdHMgZnJvbSB0aGUgcHJveHkgY29ubmVjdGlvbi4KCkRhbmllbCAoNiBGZWJydWFyeSAyMDAxKQotIFMuIE1vb25lc2FteSBwb2ludGVkIG91dCB0aGF0IHRoZSBWQyBtYWtlZmlsZSBpbiBzcmMvIG5lZWRlZCB0aGUgbGlicGF0aCBzZXQKICBmb3IgdGhlIGRlYnVnIGJ1aWxkIHRvIHdvcmsuCgotIERhbmllbCBHZWhyaWdlciBzdGVwcGVkIGluIHRvIGFzc2lzdCB3aXRoIHRoZSBWQysrIHN0dWZmIFJvYmVydCBXZWF2ZXIKICBicm91Z2h0IHVwIHllc3RlcmRheS4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDAxKQotIEp1bi1pY2hpcm8gaXRvanVuIEhhZ2lubyBicm91Z2h0IGEgYmlnIHBhdGNoIHRoYXQgYnJpbmdzIElQdjYtYXdhcmVuZXNzIHRvCiAgYSBidW5jaCBvZiBkaWZmZXJlbnQgYXJlYXMgd2l0aGluIGxpYmN1cmwuCgotIFJvYmVydCBXZWF2ZXIgdG9sZCBtZSBhYm91dCB0aGUgcHJvYmxlbXMgdGhlIE1TIFZDKysgNi4wIGNvbXBpbGVyIGhhcyB3aXRoCiAgdGhlICdzdGF0aWMnIGtleXdvcmQgb24gYSBudW1iZXIgb2YgbGliY3VybCBmdW5jdGlvbnMuIEkgbWlnaHQgbmVlZCB0byBhZGQgYQogIHBhdGNoIHRoYXQgcmVkZWZpbmVzIHN0YXRpYyB3aGVuIGxpYmN1cmwgaXMgY29tcGlsZWQgd2l0aCB0aGF0IGNvbXBpbGVyLgogIEhvdyBkbyBJIGtub3cgd2hlbiBWQysrIGNvbXBpbGVzLCBhbnlvbmU/CgpEYW5pZWwgKDQgRmVicnVhcnkgMjAwMSkKLSBjdXJsX2dldGluZm8oKSB3YXMgZXh0ZW5kZWQgd2l0aCB0d28gbmV3IG9wdGlvbnM6CiAgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgYW5kIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX1VQTE9BRC4gVGhleQogIHJldHVybiB0aGUgZnVsbCBhc3N1bWVkIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSB0cmFuc2ZlciBpbiB0aGUgZ2l2ZW4KICBkaXJlY3Rpb24uIFRoZSBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCB3aWxsIGJlIHRoZSBDb250ZW50LUxlbmd0aDoKICBzaXplIG9mIGEgSFRUUCBkb3dubG9hZC4gQWRkZWQgZGVzY3JpcHRpb25zIHRvIHRoZSBtYW4gcGFnZSBhcyB3ZWxsLiBUaGlzCiAgd2FzIGRvbmUgYWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBCb2IgU2NoYWRlci4KCkRhbmllbCAoMyBGZWJydWFyeSAyMDAxKQotIEluZ28gUmFsZiBCbHVtIHByb3ZpZGVkIGFub3RoZXIgZml4IHRoYXQgbWFrZXMgY3VybCBidWlsZCB1bmRlciB0aGUgbW9yZQogIHJlY2VudCBjeWd3aW4gaW5zdGFsbGF0aW9ucy4gSXQgc2VlbXMgdGhleSd2ZSBjaGFuZ2VkIHRoZSBwcmVzZXQgZGVmaW5lcyB0bwogIG5vdCBpbmNsdWRlIFdJTjMyIGFueW1vcmUuCgpWZXJzaW9uIDcuNi4xLXByZTIKCkRhbmllbCAoMzEgSmFudWFyeSAyMDAxKQotIEN1cmxfcmVhZCgpIGFuZCBjdXJsX3JlYWQoKSBub3cgcmV0dXJuIGEgc3NpemVfdCBmb3IgdGhlIHNpemUsIGFzIGl0IGhhZCB0bwogIGJlIGFibGUgdG8gcmV0dXJuIC0xLiBUaGUgdGVsbmV0IHN1cHBvcnQgY3Jhc2hlZCBkdWUgdG8gdGhpcyBhbmQgdGhlcmUgd2FzIGEKICBwb3NzaWJpbGl0eSB0byB3ZWlyZCBiZWhhdmlvciBhbGwgb3Zlci4gTGludXMgTmllbHNlbiBGZWx0emluZyBoZWxwZWQgbWUKICBmaW5kIHRoaXMuCgotIEFkZGVkIGEgY29uZmlndXJlLmluIGNoZWNrIGZvciBhIHdvcmtpbmcgZ2V0YWRkcmluZm8oKSBpZiBJUHY2IGlzIHJlcXVlc3RlZC4KICBJIGFsc28gbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmZWF0dXJlIC0tZW5hYmxlLWRlYnVnIHdoaWNoIHNldHMgYSBjb3VwbGUKICBvZiBjb21waWxlciBvcHRpb25zIHdoZW4gdXNlZC4gSXQgYXNzdW1lcyBnY2MuCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwMSkKLSBJIGZpbmFsbHkgdG9vayBhIHN0YWIgYXQgdGhlIGxvbmctdGVybSBGSVhNRSBpdGVtIEkndmUgaGFkIG9uIG15c2VsZiwgYW5kCiAgbm93IGxpYmN1cmwgd2lsbCBwcm9wZXJseSB3b3JrIHdoZW4gZG9pbmcgYSBIVFRQIHJhbmdlLXJlcXVlc3QgdGhhdCBmb2xsb3dzCiAgYSBMb2NhdGlvbjouIFByZXZpb3VzbHkgdGhhdCB3b3VsZCBtYWtlIGxpYmN1cmwgZmFpbCBzYXlpbmcgdGhhdCB0aGUgc2VydmVyCiAgZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgcmFuZ2UgcmVxdWVzdHMuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwMSkKLSBJIGFkZGVkIGEgdGVzdCBjYXNlIGZvciB0aGUgSFRUUCBQVVQgcmVzdW1lIHRoaW5nICh0ZXN0IGNhc2UgMzMpLgoKVmVyc2lvbiA3LjYuMS1wcmUxCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwMSkKLSBZZXQgYW5vdGhlciBDb250ZW50LVJhbmdlIGNoYW5nZS4gT2sgbm93PyBCb2IgU2NoYWRlciBjaGVja3MgZnJvbSBoaXMgZW5kIAogIGFuZCBpdCB3b3JrcyBmb3IgaGltLgoKRGFuaWVsICgyNyBKYW51YXJ5IDIwMDEpCi0gU28gdGhlIEhUVFAgUFVUIHJlc3VtZSBmaXggd2Fzbid0IGdvb2QuIFRoZXJlIHNob3VsZCBhcHBlYXJhbnRseSBiZSBhCiAgQ29udGVudC1SYW5nZSBoZWFkZXIgd2hlbiByZXN1bWluZyBhIFBVVC4KCi0gSSBub3RpY2VkIEkgYnJva2UgdGhlIGRvd25sb2FkLWNoZWNrIHRoYXQgdmVyaWZpZXMgdGhhdCBhIHJlc3VtZWQgSFRUUAogIGRvd25sb2FkIGlzIGFjdHVhbGx5IHJlc3VtZWQuIEl0IGdvdCBicm9rZSBiZWNhdXNlIG15IG5ldyAnaHR0cHJlcScgZmllbGQKICBpbiB0aGUgbWFpbiBjdXJsIHN0cnVjdC4gSSBzaG91bGQgZ2V0IHNsYXBwZWQuIEkgYWRkZWQgYSB0ZXN0IGNhc2UgZm9yCiAgdGhpcyBub3csIHNvIEkgd29uJ3QgYmUgYWJsZSB0byBydWluIHRoaXMgYWdhaW4gd2l0aG91dCBub3RpY2luZy4KCi0gQWRkZWQgYSB0ZXN0IGNhc2UgZm9yIGNvbnRlbnQtbGVuZ3RoIHZlcmlmeWluZyB3aGVuIGRvd25sb2FkaW5nIEhUVFAuCgotIE1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIHRpdGxlIHNheSBpZiB0aGUgdHJhbnNmZXIgaXMgYmVpbmcgdHJhbnNmZXJlZC4gSXQKICBtYWtlcyB0aGUgb3V0cHV0IHNsaWdodGx5IGJldHRlciBmb3IgcmVzdW1lcy4KCi0gV2hlbiBkZWFsaW5nIHdpdGggTG9jYXRpb246IGFuZCBIVFRQIHJldHVybiBjb2RlcywgbGliY3VybCB3aWxsIG5vdCBhdHRlbXB0CiAgdG8gZm9sbG93IHRoZSBzcGlyaXQgb2YgUkZDMjYxNiBiZXR0ZXIuIEl0IG1lYW5zIHRoYXQgd2hlbiBQT1NUaW5nIHRvIGEKICBVUkwgdGhhdCBpcyBiZWluZyBmb2xsb3dpbmcgdG8gYSBzZWNvbmQgcGxhY2UsIHRoZSBzdGFuZGFyZCB3aWxsIGp1ZGdlIG9uCiAgd2hhdCB0byBkby4gQWxsIEhUVFAgY29kZXMgZXhjZXB0IDMwMyBhbmQgMzA1IHdpbGwgY2F1c2UgY3VybCB0byBtYWtlIGEKICBzZWNvbmQgUE9TVCBvcGVyYXRpb24uIDMwMyB3aWxsIG1ha2UgYSBHRVQgYW5kIDMwNSBpcyBub3QgeWV0IHN1cHBvcnRlZC4KCiAgSSBhbHNvIHdyb3RlIHR3byB0ZXN0IGNhc2VzIGZvciB0aGlzIFBPU1QvR0VUL0xvY2F0aW9uIHN0dWZmLgoKVmVyc2lvbiA3LjYKCkRhbmllbCAoMjYgSmFudWFyeSAyMDAxKQotIExvdHMgb2YgbWFpbHMgYmFjayBhbmQgZm9ydGggd2l0aCBCb2IgU2NoYWRlciBmaW5hbGx5IG1hZGUgbWUgYWRkIGEgc21hbGwKICBwaWVjZSBvZiBjb2RlIGluIHRoZSBIVFRQIGVuZ2luZSBzbyB0aGF0IEhUVFAgdXBsb2FkIHJlc3VtZSB3b3Jrcy4gWW91IGNhbgogIG5vdyBkbyBhbiBvcGVyYXRpb24gbGlrZSAnY3VybCAtVCBmaWxlIC1DIDxvZmZzZXQ+IDxVUkw+JyBhbmQgY3VybCB3aWxsIFBVVAogIHRoZSBlbmRpbmcgcGFydCBvZiB0aGUgZmlsZSBzdGFydGluZyBhdCBnaXZlbiBvZmZldCB0byB0aGUgc3BlY2lmaWVkIFVSTC4KClZlcnNpb24gNy42LXByZTQKCkRhbmllbCAoMjUgSmFudWFyeSAyMDAxKQotIEkgdG9vayBob2xkIG9mIFJpY2sgSm9uZXMnIHF1ZXN0aW9uIHdoeSB3ZSBkb24ndCB1c2UgcmVjdigpIGFuZCBzZW5kKCkgZm9yCiAgcmVhZGluZy93cml0aW5nIHRvIHRoZSBzb2NrZXRzIGFuZCBJJ3ZlIG5vdyBtb2RpZmllZCB0aGUgc3JlYWQoKSBhbmQKICBzd3JpdGUoKSBtYWNyb3MgdG8gdXNlIHRoZW0gaW5zdGVhZC4gSWYgbm90aGluZyBlbHNlLCB0aGV5IGNvdWxkIGJlIHRlc3RlZAogIGluIHRoZSBuZXh0IGJldGEtcm91bmQgY29taW5nIHJpZ2h0IHVwLgoKLSBKZWZmIE1vcnJvdyBmb3VuZCBhIHByb2JsZW0gd2l0aCBsaWJjdXJsJ3MgdXNhZ2Ugb2YgU1NMX3JlYWQoKSBhbmQgc3VwcGxpZWQKICBoaXMgcmVzZWFyY2ggcmVzdWx0cyBpbiBob3cgdG8gZml4IHRoaXMuIEl0IHR1cm5zIG91dCB3ZSBoYXZlIHRvIGludm9rZSB0aGUKICBmdW5jdGlvbiBzZXZlcmFsIHRpbWVzIGluIHNvbWUgY2FzZXMuIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBTU0xfd3JpdGUoKS4KCiAgSSBtYWRlIHNvbWUgcmF0aGVyIGRyYXN0aWMgY2hhbmdlcyBhbGwgb3ZlciBsaWJjdXJsIHRvIG1ha2UgYWxsIHdyaXRlcyBhbmQKICByZWFkcyBnZXQgZG9uZSBvbiBvbmUgc2luZ2xlIHBsYWNlIHNvIHRoYXQgdGhpcyByZXBlYXRlZC1hdHRlbXB0cyB0aGluZwogIHdvdWxkIG9ubHkgaGF2ZSB0byBiZSBpbXBsZW1lbnRlZCBhdCBvbmUgcG9pbnQuCgotIFJpY2sgSm9uZXMgc3BvdHRlZCB0aGF0IHRoZSAndG90YWwgdGltZScgY291bnRlciByZWFsbHkgZGlkbid0IG1lYXN1cmUgdGhlCiAgdG90YWwgdGltZSB2ZXJ5IGFjY3VyYXRlIG9uIHN1YnNlY29uZCBsZXZlbHMuCgotIEpvaGFuIE5pbHNzb24gcG9pbnRlZCBvdXQgdGhlIG5lZWQgdG8gbW9yZSBjbGVhcmx5IHNwZWNpZnkgdGhhdCB0aGUgdGltZW91dAogIHZhbHVlIHlvdSBzZXQgZm9yIGEgZG93bmxvYWQgaXMgZm9yIHRoZSAqZW50aXJlKiBkb3dubG9hZC4gVGhlcmUncyBjdXJyZW50bHkKICBubyBvcHRpb24gYXZhaWxhYmxlIHRoYXQgc2V0cyBhIHRpbWVvdXQgZm9yIHRoZSBjb25uZWN0aW9uIHBoYXNlIG9ubHkuCgpEYW5pZWwgKDI0IEphbnVhcnkgMjAwMSkKLSBJbmdvIFJhbGYgQmx1bSBzdWJtaXR0ZWQgYSBzZXJpZXMgb2YgcGF0Y2hlcyByZXF1aXJlZCB0byBnZXQgY3VybCB0byBjb21waWxlCiAgcHJvcGVybHkgd2l0aCBjeWd3aW4uCgotIFJvYmVydCBXZWF2ZXIgcG9zdGVkIGEgZml4IGZvciB0aGUgd2luMzIgc2VjdGlvbiBvZiB0aGUgY3VybF9nZXRlbnYoKSBjb2RlCiAgdGhhdCBjb3JyZWN0ZWQgYSBwb3RlbnRpYWwgbWVtb3J5IGxlYWsuCgotIEFkZGVkIGNvbW1lbnRzIGluIGEgZmV3IGZpbGVzIGluIGEgc3VkZGVuIGF0dGVtcHQgdG8gbWFrZSB0aGUgc291cmNlcyBtb3JlCiAgZWFzeSB0byByZWFkIGFuZCB1bmRlcnN0YW5kIQoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDEpCi0gQWRkZWQgc2ltcGxlIElQdjYgZGV0ZWN0aW9uIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBtYWRlIHRoZSB2ZXJzaW9uCiAgc3RyaW5nIGFkZCAnaXB2NicgdG8gdGhlIGVuYWJsZSBzZWN0aW9uIGluIHRoYXQgY2FzZS4gRU5BQkxFX0lQVjYgd2lsbCBiZQogIHNldCBpZiBjdXJsIGlzIGNvbXBpbGVkIHdpdGggSVB2NiBzdXBwb3J0IGVuYWJsZWQuCgotIEFkZGVkIGEgcGFyc2VyIGZvciBJUHY2LXN0eWxlIHNwZWNpZmllZCBJUC1hZGRyZXNzZXMgaW4gYSBVUkwuIFRodXMsIHdoZW4KICBJUHY2IGdldHMgZW5hYmxlZCBzb29uLCB3ZSBjYW4gdXNlIFVSTHMgbGlrZSAnWzA6OjFdOjgwJy4uLgoKLSBNYWRlIHRoZSBVUkwgZ2xvYmJpbmcgaW4gdGhlIGNsaWVudCBwb3NzaWJsZSB0byBmYWlsIHNpbGVudGx5IGlmIHRoZXJlJ3MgYW4KICBlcnJvciBpbiB0aGUgZ2xvYmJpbmcuIEl0IG1ha2VzIGl0IGFsbW9zdCBpbnR1aXRpdmUsIHNvIHdoZW4geW91IGRvbid0CiAgZm9sbG93IHRoZSBzeW50YXggcnVsZXMsIGdsb2JiaW5nIGlzIHNpbXBseSBzd2l0Y2hlZCBvZmYgYW5kIHRoZSByYXcgc3RyaW5nCiAgaXMgdXNlZCBpbnN0ZWFkLgoKICBJIHN0aWxsIHRoaW5rIHdlJ2xsIGdldCBwcm9ibGVtcyB3aXRoIElQdjYtc3R5bGUgSVAtYWRkcmVzc2VzIHdoZW4gd2UgKndhbnQqCiAgZ2xvYmJpbmcgb24gcGFydHMgb2YgdGhlIFVSTCBhcyB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoZSBVUkwgd2lsbCBmb3Igc3VyZQogIHNlcmlvdXNseSBjb25mdXNlIHRoZSBnbG9iYmVyLgoKRGFuaWVsICgyMiBKYW51YXJ5IDIwMDEpCi0gQmr2cm4gU3RlbmJlcmcgc3VwcGxpZWQgYSBwcm9ncmVzcyBtZXRlciBwYXRjaCB0aGF0IG1ha2VzIGl0IGxvb2sgYmV0dGVyIGV2ZW4KICBkdXJpbmcgc2xvdyBzdGFydHMuIFByZXZpb3VzbHkgaXQgbWFkZSBzb21lIHNpbGx5IGFzc3VtcHRpb25zLi4uCgotIEFkZGVkIHR3byBGVFAgdGVzdHMgZm9yIC1RIGFuZCAtUSAtIHN0dWZmIHNpbmNlIGl0IHdhcyBiZWluZyBkaXNjdXNzZWQgb24KICB0aGUgbWFpbGluZyBsaXN0LiBIYWQgdG8gY29ycmVjdCB0aGUgZnRwc2VydmVyLnBsIHRvbyBhcyBpdCBidWdnZWQgc2xpZ2h0bHkuCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwMSkKLSBNYWRlIHRoZSBMb2NhdGlvbjogcGFyc2VycyBkZWFsIHdpdGggYW55LWxlbmd0aCBVUkxzLiBUaHVzIEkgcmVtb3ZlZCB0aGUgbGFzdAogIGNvZGUgdGhhdCByZXN0cmljdHMgdGhlIGxlbmd0aCBvZiBVUkxzIHRoYXQgY3VybCBzdXBwb3J0cy4KCi0gQWRkZWQgYSAtLWdsb2JvZmYgdGVzdCBjYXNlICgjMjgpIGFuZCBpdCBxdWlja2x5IGlkZW50aWZpZWQgYSBtZW1vcnkgcHJvYmxlbQogIGluIHNyYy9tYWluLmMgdGhhdCBJIHRvb2sgY2FyZSBvZi4KClZlcnNpb24gNy42LXByZTMKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAxKQotIE1hZGUgdGhlIHR3byBmb3JtZXIgZmlsZXMgbGliL2Rvd25sb2FkLmMgYW5kIGxpYi9oaWdobGV2ZWwuYyBiZWNvbWUgdGhlIG5ldwogIGxpYi90cmFuc2Zlci5jIHdoaWNoIG1ha2VzIG1vcmUgc2Vuc2UuIEkgYWxzbyBkaWQgdGhlIHJlbmFtZSBmcm9tIFRyYW5zZmVyKCkKICB0byBDdXJsX1RyYW5zZmVyKCkgaW4gdGhlIG90aGVyIHNvdXJjZSBmaWxlcyB0aGF0IHVzZSB0aGUgdHJhbnNmZXIgZnVuY3Rpb24KICBpbiB0aGUgc3Bpcml0IG9mIHVzaW5nIEN1cmxfIHByZWZpeCBmb3IgbGlicmFyeS1zY29wZWQgZ2xvYmFsIHN5bWJvbHMuCgpEYW5pZWwgKDExIEphbnVhcnkgMjAwMSkKLSBBZGRlZCAtZy8tLWdsb2JvZmYgdGhhdCBzd2l0Y2hlcyBPRkYgdGhlIFVSTCBnbG9iYmluZyBhbmQgdGh1cyBlbmFibGVzIHt9W10KICBsZXR0ZXJzIHRvIGJlIHBhcnQgb2YgdGhlIFVSTC4gRG8gbm90ZSB0aGF0IFJGQzIzOTYgc2VjdGlvbiAyLjQuMyBleHBsaWNpdGx5CiAgbWVudGlvbiB0aGVzZSBsZXR0ZXJzIHRvIGJlIGVzY2FwZWQuIFRoaXMgd2FzIHBvc3RlZCBhcyBhIGZlYXR1cmUgcmVxdWVzdCBieQogIEpvcmdlIEd1dGllcnJleiBhbmQgYXMgYSBidWcgYnkgVGVycnkuCgotIFNob3J0IG9wdGlvbnMgdG8gY3VybCB0aGF0IHJlcXVpcmVzIHBhcmFtZXRlcnMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgd2l0aG91dAogIGhhdmluZyB0aGUgb3B0aW9uIGFuZCBpdHMgcGFyYW1ldGVyIHNwYWNlIHNlcGFyYXRlZC4gLW9maWxlIHdvcmtzIGFzIGdvb2QgYXMKICAtbyBmaWxlLiAtbTIwIGlzIGVxdWFsIHRvIC1tIDIwLiBEbyBub3RlIHRoYXQgdGhpcyBnb2VzIGZvciBzaW5nbGUtbGV0dGVyCiAgb3B0aW9ucyBvbmx5LCB2ZXJib3NlIC0tbG9uZy1zdHlsZSBvcHRpb25zIHN0aWxsIG11c3QgYmUgc2VwYXJhdGVkIHdpdGgKICBzcGFjZSBmcm9tIHRoZWlyIHBhcmFtZXRlcnMuCgpEYW5pZWwgKDggSmFudWFyeSAyMDAxKQotIEZyYW5jaXMgRGFnZW5haXMgcmVwb3J0ZWQgdGhhdCB0aGUgU0NPIGNvbXBpbGVyIHN0aWxsIGZhaWxzIHdoZW4gY29tcGlsaW5nCiAgY3VybCBkdWUgdG8gdGhhdCBnZXRwYXNzX3IoKSBwcm90b3R5cGUuIEkndmUgbm93IHB1dCBpdCBhcm91bmQgI2lmbmRlZgogIEhBVkVfR0VUUEFTU19SIGluIGFuIGF0dGVtcHQgdG8gcGxlYXNlIHRoZSBTQ08gc3lzdGVtcy4KCi0gTWFkZSBzb21lIG1pbm9yIGNvcnJlY3Rpb25zIHRvIGdldCB0aGUgY2xpZW50IHRvIGNsZWFudXAgcHJvcGVybHkgYW5kIEkgbWFkZQogIHRoZSBzZXBhcmF0b3Igd29yayBhZ2FpbiB3aGVuIGdldHRpbmcgbXVsdGlwbGUgZ2xvYmJlZCBVUkxzIHRvIHN0ZG91dC4KCi0gV29ya2VkIHdpdGggTG9pYyBEYWNoYXJ5IHRvIGdldCB0aGUgbWFrZSBkaXN0IGFuZCBtYWtlIGRpc3RjaGVjayB3b3JrCiAgY29ycmVjdGx5LiBUaGUgJ21ha2V0Z3onIHNjcmlwdCBpcyBub3cgdXNpbmcgdGhlIGF1dG9tYWtlIGdlbmVyYXRlZCAnbWFrZQogIGRpc3QnIHdoZW4gY3JlYXRpbmcgcmVsZWFzZSBhcmNoaXZlcy4gTG9pYyBzdWNjZXNzZnVsbHkgbWFkZSAnbWFrZSBycG1zJwogIGF1dG9tYXRpY2FsbHkgYnVpbGQgUlBNcyEKCkxvaWMgRGFjaGFyeSAoNiBKYW51YXJ5IDIwMDEpCi0gQXV0b21hdGVkIGdlbmVyYXRpb24gb2YgcnBtIHBhY2thZ2VzLCBubyBuZWVkIHRvIGJlIHJvb3QuCgotIG1ha2UgZGlzdGNoZWNrIGdlbmVyYXRlcyBhIHByb3BlciBkaXN0cmlidXRpb24gKEVYVFJBX0RJU1QKICBpbiBhbGwgTWFrZWZpbGUuYW0gbW9kaWZpZWQgdG8gbWF0Y2ggRklMRVMpLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwMSkKLSBIdWdlIGNsaWVudC1zaWRlIGhhY2s6IG5vdyBtdWx0aXBsZSBVUkxzIGFyZSBzdXBwb3J0ZWQuIEFueSBudW1iZXIgb2YgVVJMcwogIGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHRoZXknbGwgYWxsIGJlIGRvd25sb2FkZWQuIFRoZXJlCiAgbXVzdCBiZSBhIGNvcnJlc3BvbmRpbmcgLW8gb3IgLU8gZm9yIGVhY2ggVVJMIG9yIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiB0bwogIHN0ZG91dC4gVGhpcyBuZWVkcyBtb3JlIHRlc3RpbmcsIHRpbWUgdG8gcmVsZWFzZSBhIDcuNi1wcmUgcGFja2FnZS4KCi0gVGhlIGtyYjQgc3VwcG9ydCB3YXMgYnJva2VuIGluIHRoZSByZWxlYXNlLiBGaXhlZCBub3cuCgotIEh1Z2UgaW50ZXJuYWwgc3ltYm9sIHJlbmFtZSBvcGVyYXRpb24uIEFsbCBub24tc3RhdGljIGJ1dCBzdGlsbCBsaWItaW50ZXJuYWwKICBzeW1ib2xzIHNob3VsZCBub3cgYmUgcHJlZml4ZWQgd2l0aCAnQ3VybF8nIHRvIHByZXZlbnQgY29sbGlzaW9ucyB3aXRoIG90aGVyCiAgbGlicy4gQWxsIHB1YmxpYyBzeW1ib2xzIHNob3VsZCBiZSBwcmVmaXhlZCB3aXRoICdjdXJsXycgYW5kIHRoZSByZXN0IHNob3VsZAogIGJlIHN0YXRpYyBhbmQgdGh1cyBpbnZpc2libGUgdG8gdGhlIG91dHNpZGUgd29ybGQuIEkgdXBkYXRlZCB0aGUgSU5URVJOQUxTCiAgZG9jdW1lbnQgdG8gc2F5IHRoaXMgYXMgd2VsbC4KClZlcnNpb24gNy41LjIKCkRhbmllbCAoNCBKYW51YXJ5IDIwMDEpCi0gQXMgS2V2aW4gUCBSb3RoIHN1Z2dlc3RlZCwgSSd2ZSBhZGRlZCB0ZXh0IHRvIHRoZSBtYW4gcGFnZSBmb3IgZXZlcnkgY29tbWFuZAogIGxpbmUgb3B0aW9uIGFuZCB3aGF0IGhhcHBlbnMgd2hlbiB5b3Ugc3BlY2lmeSB0aGF0IG9wdGlvbiBtb3JlIHRoYW4KICBvbmNlLiBUaGF0IGhhc24ndCBiZWVuIGV4YWN0bHkgY3J5c3RhbCBjbGVhciBiZWZvcmUuCgotIE1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgcG9zc2libGUgdG8gcnVuIGZyb20gb3V0c2lkZSB0aGUgc291cmNlLXRyZWUuIEZvcgogIG9kZCByZWFzb25zIEkgY2FuJ3QgYnVpbGQgY3VybCBwcm9wZXJseSBvdXRzaWRlIHRob3VnaC4gSXQgaGFzIHRvIGRvIHdpdGgKICBjdXJsJ3MgZGVwZW5kZW5jaWVzIG9uIGxpYmN1cmwuLi4KCi0gQ3V0IG9mZiBhbGwgb2xkZXIgKGRhdGVkIDE5OTkgYW5kIGVhcmxpZXIpIENIQU5HRVMgZW50cmllcyBmcm9tIHRoaXMgZmlsZS4KICBUaGUgb2xkZXIgcGllY2UgaXMgbmFtZWQgQ0hBTkdFUy4wIGFuZCBpcyBhZGRlZCB0byB0aGUgQ1ZTIHJlcG9zaXRvcnkgaW4KICBjYXNlIGFueW9uZSB3b3VsZCBuZWVkIGl0LgoKLSBJIGFkZGVkIGFub3RoZXIgZmlsZSAnQ1ZTLUlORk8nIHRvIHRoZSBDVlMuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0CiAgZmlsZXMgaW4gdGhlIENWUyB0aGF0IGFyZW4ndCBpbmNsdWRlZCBpbiByZWxlYXNlIGFyY2hpdmVzIGFuZCBob3cgdG8gYnVpbGQKICBjdXJsIHdoZW4geW91IGdldCB0aGUgc291cmNlcyBvZmYgQ1ZTLgoKLSBVcGRhdGVkIENPTlRSSUJVVEUgYW5kIEZBUSBkdWUgdG8gdGhlIG5ldyBsaWNlbnNlLgoKRGFuaWVsICgzIEphbnVhcnkgMjAwMSkKLSBSZW5hbWVkIFJFQURNRS5saWJjdXJsIHRvIExJQkNVUkwKCi0gQ2hhbmdlZCBoZWFkZXJzIGluIGFsbCBzb3VyY2VzIGZpbGVzIHRvIHRoZSBuZXcgZHVhbCBsaWNlbnNlIGNvbmNlcHQgb2YKICBjdXJsOiB1c2UgdGhlIE1JVC9YIGRlcml2YXRlIGxpY2Vuc2UgKm9yKiBNUEwuIFRoZSBMRUdBTCBmaWxlIHdhcyB1cGRhdGVkCiAgYWNjb3JkaW5nbHkgYW5kIHRoZSBNUEwgMS4xIGFuZCBNSVQvWCBkZXJpdmF0ZSBsaWNlbnNlcyBhcmUgbm93IHBhcnQgb2YgdGhlCiAgcmVsZWFzZSBhcmNoaXZlLgo=