ZGlmZiAtLWdpdCBhL0tFWVMgYi9LRVlTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODY4M2M4Li4wMDAwMDAwCi0tLSBhL0tFWVMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi1UaGlzIGZpbGUgY29udGFpbnMgdGhlIFBHUCBrZXlzIG9mIHZhcmlvdXMgWGFsYW4gZGV2ZWxvcGVycy4KLVBsZWFzZSBkb24ndCB1c2UgdGhlbSBmb3IgZW1haWwgdW5sZXNzIHlvdSBoYXZlIHRvLiBUaGVpciBtYWluCi1wdXJwb3NlIGlzIGNvZGUgc2lnbmluZy4KLQotWGFsYW4gdXNlcnM6IHBncCA8IEtFWVMKLVhhbGFuIGRldmVsb3BlcnM6IHBncCAta3hhIDx5b3VyIG5hbWU+IGFuZCBhcHBlbmQgaXQgdG8gdGhpcyBmaWxlLgotCi0KLVR5cGUgQml0cy9LZXlJRCAgICBEYXRlICAgICAgIFVzZXIgSUQKLXB1YiAgMTAyNC8zMEEyMUQ1NSAxOTk5LzExLzA0IFNoYW5lIEN1cmN1cnUgPHNoYW5lX2N1cmN1cnVAbG90dXMuY29tPgotCi0tLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KLVZlcnNpb246IFBHUCBQZXJzb25hbCBQcml2YWN5IDYuNS4zCi0KLW1RR2lCRGdoak5JUkJBRFhCNFVZNFlmWjJEbWJTdXNobHpQWkNrWTAwaURQVUIrR2tXNkZRaGduR0NMWm92Z3kKLUZoQ25Dc0tkTjF4eUhGcS9OczNQVjNIUHJNR3hGS2dWT2ZSdXhSRWJGOENvWEFhL3UwcVIxV29BbStybHlDOWwKLU9Wc0hkWHh5T3BaOGU0U1BHbmU4TFFZWndyMnErTHNIaVhPWmt0a2FCbzh1YThGNEVKWWtCTUZoWlFDZy80SXcKLWpYbWZwdDY2MUVzc21mOGQwNWNNZEFjRUFMMHIrUHJGeENtclU4T2srcjc0K2VxeWNseFZiaURiT2Y3VWVmNk4KLWZFSm1DNWloWDdwOGs4ZUVmMlhlcGVBbzZOMGdkT3hZVlhWd2NvUkNtcVB5N1NTZzFqblhxS09uQTg3eWx2MTYKLWxPaUo1V1VraVZYOTZXT1dFc2JiWUt1Z2dtV2VETCs2aUZjOWhwNm9FUDJzZi9nZUM4QUVBRUhUUGZuZUp6cG8KLTN6MjhBLzlpWDQxcjRLMGlSeDVlSUp1MktVcmpkcFB4aG4wSlBlOWR6Mlh6V1pJY2lOZWtpK1RocmNhckVqOWgKLWxtZnZjR0xpZlhiUWZYdUZpZDNidE1zQlJJOGRxQWJiWG15ZnZDWVlTSERPa1hFbW9NVzY2QVdmZUY0aGdmSEYKLVNBNWxtY3BING10SFU2OXVDMCtjdllsUlJPUCtIYWVPZXBZYnJpQSs5QTlRcTRNQVc3UW5VMmhoYm1VZ1EzVnkKLVkzVnlkU0E4YzJoaGJtVmZZM1Z5WTNWeWRVQnNiM1IxY3k1amIyMCtpUUJPQkJBUkFnQU9CUUk0SVl6U0JBc0QKLUFnRUNHUUVBQ2drUU11d1hXVENpSFZYUUlRQ2cxUTFNS2tXeWdJc0RHQU9oaVBhTTA5cFRkbFVBbmlUZUNrb08KLUkwKzJJZ0QvTnRxbkdEYVN2TkRuaVFCR0JCQVJBZ0FHQlFJNHFaay9BQW9KRUZIclB2RlhkbHJ5VmJJQW9PL2UKLWd0aTFlc2dSSTZHRXJJaElDZzNJb2N0ZkFLRGxwdzZOV3EvV1R4azFBYTBwTi8xYjZmbUQ1TGtDRFFRNElZelMKLUVBZ0E5a0pYdHdoL0NCZHlvcnJXcVVMekJlajVVeEU1VDdieGJybExPQ0RhQWFkV294VHBqMEJWODlBSHhzdEQKLXFaU3Q5MHhraGtuNERJTzlaZWtYMUtIVFVQajFXVi9jZGxKUFBUMk4yODZaNFZlU1djMzl1SzUwVDhYOGRyeUQKLXhVY3dZYzU4eVdiL0ZmbTcvWkZleHdHcTAxdWVqYUNsY2pyVUd2Qy9SZ0JZSytYMGlQMVlUa25ielNDMG5lU1IKLUJ6WnJNMnc0RFVVZEQzeUlzeHg4V3kyTzl2UEpJOEJEOEtWYkdJMk91MVdNdUYwNDB6VDlmQmRYUTZNZEdHemUKLU15RXN0U3IvUE9HeEtVQVlFWTE4aEtjS2N0YUd4QU1aeUFjcGVzcVZETm1XbjZ2UUNsQ2JBa2JUQ0QxbXBGMUIKLW41eDh2WWxMSWhrbXVxdWlYc05WNlRJTE93QUNBZ2dBenUvUU9idXlrTEd3UExDb1NRRUtmZU5TR1BPcjd3SzIKLVhTcDhjOERTMUIyanJWTDRvSCtQWWI2d1ZoY05kMytYdDQrUC9CZmxsZW1SVTgwR0Q2dC9SSG9URVpoSWhwLzMKLThlckJMSmZMUHFGRFlkaktmMzBFTU1qRldJaGVjZzlRblpTWFUyZjdFSjI0TCsvdm5vdGpBejZoWmZKdmpiMWIKLTF0WDNQUTFXMmUrbFRGaFN6MVJZU0t4NG1zRWNlejNaMHdWYWxOcVdsZXQzdDc4Y0NaUlQ0ZlBPa3lNNEM3RmIKLXRLNmNzdkZVWGtJZnUzcWd4NGFWazhIVUl3WGtIWkQyVzdYaUZTUGhNdGdjUGVVQWIzQUllWUpzL2lxUDRINE4KLTRvSjhCNnRYeG1wRG0zUDg1UGhDNGdKT0ZVVGhuWktHa0x0V3dkVWFnbzhYU0tCNVZVQS9VSWtBUmdRWUVRSUEKLUJnVUNPQ0dNMGdBS0NSQXk3QmRaTUtJZFZYUytBS0RoeUp3eDA0OCtjN0FUSU5TR2Y2SXhpWFF5WVFDZzQ2cEoKLS9mYzBIVldVdkhmamlvRFJhTFFVSXY4PQotPXV0L00KLS0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KLQotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi1WZXJzaW9uOiBQR1AgNi41LjgKLQotbVFHaUJEbmpUVU1SQkFER3ppN3kxWGlUdHkvSFoxUWhSUXhNa3lmN0pEL0U1ZEdYQ1ZMUm9TUVY5L2hkS1B0RgotT0d6alpRdDZEc3NQbmlzZ3JXNmhTTEVzOEdyWktIQ1pFNno4aDVZZWtnK1dKVHMzSzBMTkozWC90U3RWZS9mVQotRGFyTE03dTBxd3Rjc2FJU1dGTVJveTF4YnJ4QmtwRkJlTmtEK0ZSVWs4c1hUVlhvT0d2bTNGdy84d0NnLytwZwotWTdYRDZaSUEwbS9DeHJ4Uit4VEJyaThEL1JrNC81cnpzVDQyQUltSndBd2VKaWR6bG1tdldjREdqWm9sRHhySAotVGxWcElYRmpHRkpCajl0ZzFYeiszL3c5ekt5azkwMGdjd2xIVTd1ejI4eFB5bGlzaGdkOER5QWIvZW5TWHNFeQotTkMxRWFneXBBYk1wRWhUQWRCYVVOUGI2dDh5T1gzZEhVa2k1eXVaK1ByeU95S1dUYWlIeWhITHdKNXZaaTl4bQotbysvWkJBQ3FqVXFBTDI3Sk9DMXF3MXpyV0NRUXpFSkllSUlkR0ZFR29NQmlGQzQyNXZoLzFkSkExTFVJQ0hTWgotYlp2ZzdWbHZBTUVyblpiL0ljVng0TFg0UjhVZXJnaDBFLzRYaTZrclRZWnZEdUk0Um1QNUpuLzdJYUsyYzI3SQotbEN4N0kwaGo0Q1FJV1ZJRVZDREFHakprOUUzOFZhaEpZSHlTSHpqTWRoWFNqVGJxVzdRblRHOTBkWE40YzJ3ZwotVkdWaGJTQThURzkwZFhONGMyeGZWR1ZoYlVCc2IzUjFjeTVqYjIwK2lRQk9CQkFSQWdBT0JRSTU0MDFEQkFzRAotQWdFQ0dRRUFDZ2tRR2JuQmkyUkN3OXlWWndDZ2p4Qy9pZTUvR2hQTFp5UWhNU1F2SnVESlA4a0FuMTdVTmZOLwotdFJ0RmZjSkRyTmNDN1AyMXV0K1Z1UUlOQkRualRVTVFDQUQyUWxlM0NIOElGM0tpdXRhcFF2TUY2UGxURVRsUAotdHZGdXVVczRJTm9CcDFhakZPbVBRRlh6MEFmR3kwT3BsSzMzVEdTR1NmZ01nNzFsNlJmVW9kTlErUFZaWDl4MgotVWs4OVBZM2J6cG5oVjVKWnpmMjRyblJQeGZ4MnZJUEZSekJoem56Slp2OFYrYnY5a1Y3SEFhclRXNTZOb0tWeQotT3RRYThMOUdBRmdyNWZTSS9WaE9TZHZOSUxTZDVKRUhObXN6YkRnTlJSMFBmSWl6SEh4YkxZNzI4OGtqd0VQdwotcFZzWWpZNjdWWXk0WFRqVE5QMThGMWREb3gwWWJONHpJU3kxS3Y4ODRiRXBRQmdSalh5RXB3cHkxb2JFQXhuSQotQnlsNnlwVU0yWmFmcTlBS1VKc0NSdE1JUFdha1hVR2ZuSHk5aVVzaUdTYTZxNkpldzFYcE1nczdBQUlDQi85ZwotNWFSNm1XYnZhWkF3Ti9JRndJQzljZDU0Y0RBVzZwdm93bzYvZ2tnTGZ3VUxJN2lHUjhqckhIczlyU3U5NjhmVgotM0w3eXMzcEZMUjkzLzIybUpSMUluVHArcVFkVW50Y25oNWZ3YkFkOVo4Tm9NMlFFdVk0YzdjVmpvYmF6T2dQZgotQzZYWmtTMUMzdEhjdlVlZHpSOGttZjFoaVJ0SUxXVzJwRjdBOUpiSkIzUkhjdUJ1dDNjUzNlTUUyK3MrZENTbAotU3VnWkt5VkZ1aURvS081OVREN09Jbjlkd2lwVmhYN1VnRzB1TERsWnpDZDlkSExzcmxyNzVMRHhJWnlpaWZEQgotMW9hK3hNNXNtRllFcXV4KzNsZi9VTkdocHhjYUdESk0wOVVVcE9Wdjh5VnorRlpRaWxaN0J1MFhLdm5qMXA5MQotWUZWQWlRdlFIaWp5YStrTXk2TUNpUUJHQkJnUkFnQUdCUUk1NDAxREFBb0pFQm01d1l0a1FzUGNQbFVBb05rbQotZk1CMEhMNzFoNVFZZkIvTlJKdXBXc1dVQUtDaTJVRVRxOWN3QTdRdHVNeVExY2p2a0ExbW5RPT0KLT1sTloyCi0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0KZGlmZiAtLWdpdCBhL0xpY2Vuc2UgYi9MaWNlbnNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTE1NmE2Li4wMDAwMDAwCi0tLSBhL0xpY2Vuc2UKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDdmMzY3Li4wMDAwMDAwCi0tLSBhL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTWFrZWZpbGUgZm9yIHhtbC14YWxhbiwgYW4gWFNMVCBQcm9jZXNzb3IKLSMKLSMgUGxlYXNlIG5vdGUgdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9ucyEKLSMgIC0gU2VlIG1ha2UuaW5jbHVkZSBmb3Igc3lzdGVtIHRvb2xzIGRlZmluaXRpb25zLiBXZSBhc3N1bWUKLSMgICAgdGhhdCBlYWNoIG9mIHRoZXNlIHRvb2xzIGFyZSBvbiB0aGUgcGF0aCBhbmQgcHJvcGVybHkgc2V0dXAuCi0jICAKLSMgIC0gVXNlIEdOVSBtYWtlIG9yIGFuIGVxdWl2YWxlbnQuICBPbiBXaW4zMiwgeW91IGNhbiBzZWUKLSMgICAgaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9jeWd3aW4gZm9yIGEgcG9ydC4gCi0jICAKLSMgIC0gV2l0aCBKREsgMS4xLjdCIG9yIGVhcmxpZXIsIGEgJ21ha2UgYWxsJyBtYXkgZmFpbCB0aGUgZmlyc3QKLSMgICAgdGltZS4gVHJ5IHJ1bm5pbmcgaXQgYWdhaW4gdHdpY2UsIGFuZCBldmVyeXRoaW5nIHNob3VsZCB3b3JrLgotIyAgICBOb3RlIHRoYXQgd2hlbiB1c2luZyBKREsgMS4yLngsIGl0IGFsbCB3b3JrcyBmaW5lLiBXZSdsbCB3b3JrIG9uIGl0LgotIyAgCi0jICAtIE5vdGUgdGhlIHNldmVyYWwgYXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIGlmIHdlJ3JlIG9uIFdpblhYIG9yIFVuaXg6Ci0jICAgIGlmZXEgKCwkKGZpbmRzdHJpbmcgdXNyLCQoUEFUSCkpKQotIyAgICBGZWVsIGZyZWUgdG8gbW9kaWZ5IHRvIHdvcmsgZm9yIHlvdXIgbWFjaGluZSwgYW5kIHN1Z2dlc3QgYSBiZXR0ZXIKLSMgICAgd2F5IHRvIGNyZWF0ZSBhIHBsYXRmb3JtLWluZGVwZW5kZW50IG1ha2VmaWxlLgotIyAgCi0jICAtIFRoZSBkb2NzIGRpcmVjdG9yeSBjdXJyZW50bHkgcmVxdWlyZXMgamF2YWRvYyBmcm9tIHRoZSBKREsgMS4yLngKLSMgICAgWW91IG1heSBuZWVkIHRvIGVkaXQgbWFrZS5pbmNsdWRlICdKQVZBRE9DMTInIGZvciB5b3VyIHN5c3RlbS4KLSMKLSMgIC0gWWVzLCB3ZSBwbGFuIHRvIG1vdmUgdG8gYW4gJ0FudCcgYmFzZWQgbWFrZSBzeXN0ZW0gc29vbgotIyAgICAoQW50IGlzIGZyb20gamFrYXJ0YS5hcGFjaGUub3JnIGFuZCBpcyBhIEphdmEtYmFzZWQgbWFrZSkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgbWFrZS5pbmNsdWRlCi0KLVNVQkRJUlMgPSBzcmMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTWFpbiB0YXJnZXRzIGRlZmluaXRpb25zCi0jCi0jIE5vdGUgdGhhdCBtYWtlLmluY2x1ZGUgYWxzbyBkZWZpbmVzIGNvbW1vbiB0YXJnZXRzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYWxsOiBtYWtlc3ViZGlycyBqYXJzIG1ha2VzYW1wbGVzIG1ha2Vkb2NzCi0KLWJ1aWxkOiBtYWtlc3ViZGlycyBqYXJzCi0jIFRvIGNoYW5nZSBkZWJ1Zy9yZWxlYXNlIG9wdGlvbnMsIHNlZSBtYWtlLmluY2x1ZGUgZm9yIEpBVkFERUJVRyBmbGFnCi0KLSMgQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIG1vZHVsZQotZGlzdDogbWFrZWRpc3QKLQotZG9jczogbWFrZWRvY3MKLQotc2FtcGxlczogbWFrZXNhbXBsZXMKLQotamFyczogbWFrZXN1YmRpcnMgJChKQVJOQU1FKQotCi1jb21wYXQ6IG1ha2Vjb21wYXQgY29tcGF0amFycwotCi1QUk9QUEFUSCA9IG9yZyQoUEFUSFNFUClhcGFjaGUkKFBBVEhTRVApeGFsYW4kKFBBVEhTRVApcmVzCi0kKEpBUk5BTUUpOjoKLQktbWtkaXIgc3JjLyQoQ0xBU1NfRElSKS9NRVRBLUlORjsKLQktbWtkaXIgc3JjLyQoQ0xBU1NfRElSKS9NRVRBLUlORi9zZXJ2aWNlczsKLQkkKENQKSBzcmMvJChQUk9QUEFUSCkvKi5wcm9wZXJ0aWVzIHNyYy8kKENMQVNTX0RJUikvJChQUk9QUEFUSCkvLjsgXAotCSQoQ1ApIHNyYy9vcmcvYXBhY2hlL3NlcmlhbGl6ZS8qLnByb3BlcnRpZXMgc3JjLyQoQ0xBU1NfRElSKS9vcmcvYXBhY2hlL3NlcmlhbGl6ZS8uOyBcCi0JJChDUFIpIHNyYy9NRVRBLUlORi8qIHNyYy8kKENMQVNTX0RJUikvTUVUQS1JTkYvLjsgXAotCWVjaG8gLW4gIkphcnJpbmcgLi4vYmluLyRAIC4uICI7IFwKLQljZCBzcmMvJChDTEFTU19ESVIpOyAkKEpBUikgJChKQVJGTEFHUykgLi4vLi4vYmluLyRAIE1FVEEtSU5GIGphdmF4IG9yZzsgXAotCWVjaG8gImRvbmUiCi0KLWNvbXBhdGphcnM6Ci0JZWNobyAtbiAiSmFycmluZyAuLi9iaW4vJEAgLi4gIjsgXAotCWNkIHNyYy8kKENMQVNTX0RJUik7ICQoSkFSKSAkKEpBUkZMQUdTKSAuLi8uLi9iaW4vJEAuamFyIG9yZy9hcGFjaGUveGFsYW4veHNsdCBvcmcvYXBhY2hlL3hhbGFuL3hwYXRoOyBcCi0JZWNobyAiZG9uZSIKLQotIyBOb3RlOiBXaGVuIG1ha2luZyBkaXN0LCBjb3B5IHRoZSBidWlsdCBkb2NzIHVwIG9uZSBsZXZlbAotIyBOb3RlOiBDcmVhdGUgYm90aCBhIHN1cGVyLWphciBhbmQgYSB0YXIuZ3ogYXJjaGl2ZQotRElTVERJUiAgPSAkKFBST0RVQ1RfTkFNRSkkKFZFUlNJT04pCi0uUEhPTlk6IG1ha2VkaXN0Ci1tYWtlZGlzdDoKLQllY2hvIFByZXBhcmUgY3JlYXRpbmcgJChESVNUX05BTUUpCi0JLW1rZGlyICQoRElTVERJUikKLQkkKENQKSAqICQoRElTVERJUik7XAotCSQoQ1BSKSB4ZG9jcyAkKERJU1RESVIpO1wKLQkkKENQUikgc2FtcGxlcyAkKERJU1RESVIpO1wKLQkkKENQUikgc3JjICQoRElTVERJUik7XAotCSQoQ1BSKSBidWlsZC9kb2NzICQoRElTVERJUik7XAotCWVjaG8gQ3JlYXRlICQoSkFSRElTVE5BTUUpO1wKLQkkKEpBUikgLWNmICQoSkFSRElTVE5BTUUpICQoRElTVERJUik7XAotCWVjaG8gQ3JlYXRlICQoVEFSRElTVE5BTUUpO1wKLQkkKFRBUkdaKSAkKFRBUkRJU1ROQU1FKSAkKERJU1RESVIpO1wKLQllY2hvIENyZWF0ZSAkKFpJUERJU1ROQU1FKTtcCi0JJChKQVIpIC1jTWYgJChaSVBESVNUTkFNRSkgJChESVNURElSKTtcCi0JZWNobyBEb25lIGNyZWF0aW5nICQoSkFSRElTVE5BTUUpIGV0Yy4sIHlvdSBzaG91bGQgc2lnbiB0aGlzIHdpdGggUEdQIGJlZm9yZSBwb3N0aW5nCi0KLSMgU3Vic2lkaWFyeSB0YXJnZXRzIGFyZSBkZWZpbmVkIGluIG1ha2UuaW5jbHVkZQotY2xlYW46OiBjbGVhbnN1YmRpcnMgY2xlYW5kb2NzIGNsZWFuc2FtcGxlcwotCi1jb21wYXRjbGVhbjo6IGNsZWFuY29tcGF0Ci0KZGlmZiAtLWdpdCBhL2Jpbi9hbnQuamFyIGIvYmluL2FudC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZWZhYjMuLjAwMDAwMDAKLS0tIGEvYmluL2FudC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4vYW50UnVuIGIvYmluL2FudFJ1bgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhMThmMS4uMDAwMDAwMAotLS0gYS9iaW4vYW50UnVuCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgQXJnczogRElSIGNvbW1hbmQKLWNkICIkMSIKLUNNRD0iJDIiCi1zaGlmdAotc2hpZnQKLQotZXhlYyAkQ01EICIkQCIKZGlmZiAtLWdpdCBhL2Jpbi9hbnRSdW4uYmF0IGIvYmluL2FudFJ1bi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxNmNiNjAuLjAwMDAwMDAKLS0tIGEvYmluL2FudFJ1bi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1AZWNobyBvZmYKLQotIyBDaGFuZ2UgZHJpdmUgYW5kIGRpcmVjdG9yeSB0byAlMSAoV2luOVggb25seSBmb3IgTlQvMksgdXNlICJjZCAvZCIpCi1jZCAlMQotJTFcCi1zZXQgQU5UX1JVTl9DTUQ9JTIKLXNoaWZ0Ci1zaGlmdAotCi1zZXQgUEFSQU1TPQotOmxvb3AKLWlmICIiJTEgPT0gIiIgZ290byBydW5Db21tYW5kCi1zZXQgUEFSQU1TPSVQQVJBTVMlICUxCi1zaGlmdAotZ290byBsb29wCi0KLTpydW5Db21tYW5kCi1yZW0gZWNobyAlQU5UX1JVTl9DTUQlICVQQVJBTVMlCi0lQU5UX1JVTl9DTUQlICVQQVJBTVMlCi0KZGlmZiAtLWdpdCBhL2Jpbi9ic2YuamFyIGIvYmluL2JzZi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MDM2YzEuLjAwMDAwMDAKLS0tIGEvYmluL2JzZi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4vc3R5bGVib29rLTEuMC1iM194YWxhbi0yLmphciBiL2Jpbi9zdHlsZWJvb2stMS4wLWIzX3hhbGFuLTIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjY0MGU5Li4wMDAwMDAwCi0tLSBhL2Jpbi9zdHlsZWJvb2stMS4wLWIzX3hhbGFuLTIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYmluL3hhbGFuMmpkb2MuamFyIGIvYmluL3hhbGFuMmpkb2MuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODRiNDdiLi4wMDAwMDAwCi0tLSBhL2Jpbi94YWxhbjJqZG9jLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ZXJjZXMuamFyIGIvYmluL3hlcmNlcy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2QxOGEuLjAwMDAwMDAKLS0tIGEvYmluL3hlcmNlcy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idWlsZC5iYXQgYi9idWlsZC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjOTFiOWQuLjAwMDAwMDAKLS0tIGEvYnVpbGQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotQGVjaG8gb2ZmCi1yZW0gUHJlcmVxdWlzaXRlczogdXNlciBtdXN0IHNldCBKQVZBX0hPTUUKLWlmICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBlcnJvcgotZWNoby4KLWVjaG8gWGFsYW4tSiAyLnggQnVpbGQKLWVjaG8gLS0tLS0tLS0tLS0tLQotCi1yZW0gRGVmYXVsdCBBTlRfSE9NRSBpZiBub3Qgc2V0Ci1zZXQgU0FWRUFOVEhPTUU9JUFOVF9IT01FJQotaWYgIiVBTlRfSE9NRSUiID09ICIiIHNldCBBTlRfSE9NRT0uCi0KLXJlbSBUaGlzIGF1dG9tYXRpY2FsbHkgYWRkcyBzeXN0ZW0gY2xhc3NlcyB0byBDTEFTU1BBVEgKLXNldCBTQVZFQ1A9JUNMQVNTUEFUSCUKLWlmIGV4aXN0ICIlSkFWQV9IT01FJVxsaWJcdG9vbHMuamFyIiBzZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOyVKQVZBX0hPTUUlXGxpYlx0b29scy5qYXIKLWlmIGV4aXN0ICIlSkFWQV9IT01FJVxsaWJcY2xhc3Nlcy56aXAiIHNldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7JUpBVkFfSE9NRSVcbGliXGNsYXNzZXMuemlwCi0KLXJlbSBEZWZhdWx0IGxvY2F0aW9ucyBvZiBqYXJzIHdlIGRlcGVuZCBvbiAKLXNldCBBTlQ9YmluXGFudC5qYXIKLXNldCBYRVJDRVM9YmluXHhlcmNlcy5qYXIKLXNldCBCU0Y9YmluXGJzZi5qYXIKLXNldCBCU0ZFTkdJTkVTPWJpblxic2ZlbmdpbmVzLmphcgotc2V0IERPQ0dFTkVSQVRPUj1iaW5cc3R5bGVib29rLTEuMC1iM194YWxhbi0yLmphcgotc2V0IERPQ0xFVD1iaW5ceGFsYW5qZG9jLmphcgotCi1yZW0gRE9DTEVUIG11c3QgYmUgb24gc3lzdGVtIENMQVNTUEFUSCBmb3IgamF2YWRvY3MgdGFzayB0byB3b3JrLiBKdXN0IGluY2x1ZGluZyBpdCBpbgotcmVtIC1jbGFzc3BhdGggYXJnIGZvciBqYXZhIG9yIGphdmFkb2MgY2FsbCBkb2Vzbid0IHdvcmsuLi4uCi1yZW0gc2V0IENMQVNTUEFUSD0lQU5UJTslWEVSQ0VTJTslQlNGJTslQlNGRU5HSU5FUyU7JURPQ0dFTkVSQVRPUiU7JURPQ0xFVCU7JUNMQVNTUEFUSCUKLXNldCBDTEFTU1BBVEg9JUFOVCU7JVhFUkNFUyU7JURPQ0dFTkVSQVRPUiU7JURPQ0xFVCU7JUNMQVNTUEFUSCUKLWVjaG8uCi1lY2hvIEJ1aWxkaW5nIHdpdGggY2xhc3NwYXRoICVDTEFTU1BBVEglCi1lY2hvIFN0YXJ0aW5nIEFudC4uLgotCi1yZW0gVGVtcG9yYXJpbHksIHVwIHRoZSAtbXggbWVtb3J5IHNpbmNlIHdlIGNvbXBpbGUgYSByZWFsbHkgYmlnIGdsb2Igb2YgZmlsZXMKLWVjaG8gJUpBVkFfSE9NRSVcYmluXGphdmEuZXhlIC1teDY0bSAtRGFudC5ob21lPSIlQU5UX0hPTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbiAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQotIiVKQVZBX0hPTUUlXGJpblxqYXZhLmV4ZSIgLW14NjRtIC1EYW50LmhvbWU9IiVBTlRfSE9NRSUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5Ci0KLWdvdG8gZW5kCi0KLTplcnJvcgotCi1lY2hvICJFUlJPUjogSkFWQV9IT01FIG5vdCBmb3VuZCBpbiB5b3VyIGVudmlyb25tZW50LiIKLWVjaG8uCi1lY2hvICJQbGVhc2UsIHNldCB0aGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG1hdGNoIHRoZSIKLWVjaG8gInJvb3QgZGlyZWN0b3J5IG9mIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSB5b3Ugd2FudCB0byB1c2UuIgotCi06ZW5kCi1yZW0gQ2xlYW51cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLXNldCBDTEFTU1BBVEg9JVNBVkVDUCUKLXNldCBTQVZFQ1A9Ci1zZXQgQU5UX0hPTUU9JVNBVkVBTlRIT01FJQotc2V0IFNBVkVBTlRIT01FPQotc2V0IFhFUkNFUz0KLXNldCBCU0Y9Ci1zZXQgQlNGRU5HSU5FUz0KLXNldCBET0NMRVQ9Ci1zZXQgQU5UPQpkaWZmIC0tZ2l0IGEvYnVpbGQuc2ggYi9idWlsZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzk0OTUwMS4uMDAwMDAwMAotLS0gYS9idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMhL2Jpbi9zaAotIwlOYW1lOiAgIGJ1aWxkLnNoCi0jCUF1dGhvcjogU2hhbmUgQ3VyY3VydQotCi1lY2hvICJidWlsZC5zaCBiZWdpbm5pbmcuLi4iCi0KLWlmIFsgIiRKQVZBX0hPTUUiID0gIiIgXSA7IHRoZW4KLSAgICBlY2hvICJZb3UgbXVzdCBzZXQgSkFWQV9IT01FLCBzb3JyeTsgYWxzbyBKREsgMS4xeCBhZGQgY2xhc3Nlcy56aXAgdG8gQ0xBU1NQQVRIISIKLSAgICBleGl0IDEKLWZpCi0KLSMgRGVmYXVsdCB0byBVTklYLXN0eWxlIHBhdGhpbmcKLUNMUEFUSFNFUD06Ci0jIGlmIHdlJ3JlIG9uIGEgV2luZG93cyBib3ggbWFrZSBpdCA7Ci11bmFtZSB8IGdyZXAgV0lOICYmIENMUEFUSFNFUD1cOwotCi0jIFVwZGF0ZSBTRVJWTEVUIHRvIHBvaW50IHRvIEpBUiBjb250YWluaW5nIGphdmF4LnNlcnZsZXQgYW5kIGphdmF4LnNlcnZsZXQuaHR0cAotIyAgICBwYWNrYWdlczsgYWx0ZXJuYXRlbHkgaW5jbHVkZSB0aGlzIGluIHRoZSBjbGFzc3BhdGggeW91cnNlbGYKLVNFUlZMRVQ9L2pzd2RrLTEuMC4xL2xpYi9zZXJ2bGV0LmphcgotCi0jIERlZmF1bHQgbG9jYXRpb25zIGZvciBlYWNoIG9mIG91ciBqYXJzOyBjaGFuZ2UgYXMgbmVlZGVkCi1CSU5ESVI9Li9iaW4KLUFOVD0kQklORElSL2FudC5qYXIKLVRPT0xTX0pBUj0kSkFWQV9IT01FL2xpYi90b29scy5qYXIKLVhFUkNFUz0kQklORElSL3hlcmNlcy5qYXIKLUJTRj0kQklORElSL2JzZi5qYXIKLUJTRkVOR0lORVM9JEJJTkRJUi9ic2ZlbmdpbmVzLmphcgotRE9DR0VORVJBVE9SPSRCSU5ESVIvc3R5bGVib29rLTEuMC1iM194YWxhbi0yLmphcgotRE9DTEVUPSRCSU5ESVIveGFsYW5qZG9jLmphcgotCi0jIE1ha2Ugc3VyZSB0aGlzIGNsYXNzcGF0aCBzY2hlbWUgd29ya3MuIEkuZS4sIGNhbiBqYXZhZG9jIGZpbmQgeGFsYW5qZG9jLlN0YW5kYXJkPwotVEVNUF9DUD0iJEFOVCR7Q0xQQVRIU0VQfSRUT09MU19KQVIke0NMUEFUSFNFUH0kWEVSQ0VTJHtDTFBBVEhTRVB9JEJTRiR7Q0xQQVRIU0VQfSRCU0ZFTkdJTkVTJHtDTFBBVEhTRVB9JERPQ0dFTkVSQVRPUiR7Q0xQQVRIU0VQfSRET0NMRVQke0NMUEFUSFNFUH0kQ0xBU1NQQVRIIgotCi1lY2hvICJTdGFydGluZyBBbnQgd2l0aCB0YXJnZXRzOiAkQCIKLWVjaG8gIiAgICAgICAgLi4ud2l0aCBjbGFzc3BhdGg6ICRURU1QX0NQIgotCi0iJEpBVkFfSE9NRSIvYmluL2phdmEgLURhbnQuaG9tZT0uIC1jbGFzc3BhdGggIiRURU1QX0NQIiBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluICRACi0KLWVjaG8gImJ1aWxkLnNoIGNvbXBsZXRlISIKLQotCi0KZGlmZiAtLWdpdCBhL2J1aWxkLnhtbCBiL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhMjM3YS4uMDAwMDAwMAotLS0gYS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICBCdWlsZCBmaWxlIGZvciBYYWxhbi1KIDIueCAtIGZvciB1c2Ugd2l0aCB0aGUgSmFrYXJ0YSBBbnQgamF2YSBidWlsZCB0b29sCi0gICAKLVNldHVwIGluc3RydWN0aW9uczogCi0gICBCZWZvcmUgcnVubmluZyBhbiBBbnQgYnVpbGQsIHlvdSBtdXN0Ci0gICAKLSAgICAgLSBzZXQgdGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgSkRLIHJvb3QgZGlyZWN0b3J5Ci0gICAgIC0gVG8gYnVpbGQgJ3NlcnZsZXQnIHNhbXBsZTogSW5jbHVkZSBTZXJ2bGV0IFNESyBpbiB5b3VyIGNsYXNzcGF0aAotICAgICAtIFRvIGJ1aWxkIGRvY3MvamF2YWRvY3M6IHVzZSBKREsgMS4yLnggb3IgaGlnaGVyCi0gICAgIAotICAgCi1CdWlsZCBJbnN0cnVjdGlvbnM6ICAgCi0gICBUbyBidWlsZCwgcnVuCi0gICAgIGJ1aWxkLmJhdCAod2luMzIpIG9yIGJ1aWxkLnNoICh1bml4KSAtIG9wdGlvbmFsbHkgd2l0aCBhIHRhcmdldCBhcmcgYXMgaW5kaWNhdGVkIGJlbG93IC0KLSAgIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhpcyBmaWxlIGlzIGxvY2F0ZWQuCi0gICAKLSAgIFRoZSBiYXRjaC9zaGVsbCBmaWxlIHNldHMgdXAgeW91ciBjbGFzc3BhdGggYW5kIGNhbGxzIGphdmEgb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbgotICAgCi1CdWlsZCB0YXJnZXRzCi0gICAgVGhpcyBidWlsZCBmaWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgdGFyZ2V0czoKLSAgICAtIGNvbXBpbGUgIGNvbXBpbGVzIFhhbGFuLUogaW4gLi9idWlsZC9jbGFzc2VzLgotICAgIC0gamFyICAgICAgY3JlYXRlcyAuL2J1aWxkL3hhbGFuLmphciBbdGhlIGRlZmF1bHQgdGFyZ2V0XQotICAgIC0gc2FtcGxlcyAgY29tcGlsZXMgc2FtcGxlcyBhbmQgcHV0cyBjbGFzc2VzIGluIC4vYnVpbGQveGFsYW54YW1wbGVzLmphcgotICAgIC0gc2VydmxldCBjb21waWxlcyBzYW1wbGUgc2VydmxldHMgYW5kIHB1dHMgY2xhc3NlcyBpbiAuL2J1aWxkL3hhbGFuc2VydmxldC5qYXIKLSAgICAtIGRvY3MgICAgIGdlbmVyYXRlcyB0aGUgaHVtYW4td3JpdHRlbiBkb2N1bWVudGF0aW9uIGluIC4vYnVpbGQvZG9jcwotICAgIC0gamF2YWRvY3MgW29yIGFwaWRvY3NdIGdlbmVyYXRlcyB0aGUgQVBJIGRvY3VtZW50YXRpb24gaW4gLi9idWlsZC9kb2NzL2FwaWRvY3MKLSAgICAtIGNvbXBhdC5qYXIgY29tcGlsZXMgY29tcGF0aWJpbGl0eSB0cmVlIGFuZCBjcmVhdGVzIC4vYnVpbGQveGFsYW5qMWNvbXBhdC5qYXIKLSAgICAtIGNvbXBhdC5hcGlkb2NzIGdlbmVyYXRlcyBqYXZhZG9jIGZvciB0aGUgY29tcGF0aWJpbGl0eSBqYXIKLSAgICAtIGNsZWFuICAgIHB1cmdlcyB0aGUgYnVpbGQgdHJlZS4KLSAgICAtIGRpc3QgICAgIGNyZWF0ZXMgYSBjb21wbGV0ZSBkaXN0cmlidXRpb24gaW4gLi94YWxhbi1qX3hfeF94Ci0gICAgLSBhdXRvKiAgICB0YXJnZXRzIHVzZWQgYnkgYXV0b21hdGVkIGJ1aWxkIHByb2dyYW1zLCB3aXRob3V0IGRlcGVuZGVuY2llcwotICAgIC0gbWluaXRlc3QgY29tcGlsZSBhbmQgcnVuIHRoZSBtaW5pdGVzdCBpbiB4bWwteGFsYW5cdGVzdAotICAgIC0gY29uZnRlc3QgY29tcGlsZSBhbmQgcnVuIHRoZSBjb25mdGVzdCBpbiB4bWwteGFsYW5cdGVzdAotICAgIC0gc21va2V0ZXN0IHJ1biBhIHByZS1jaGVja2luIHNtb2tldGVzdCAoNSB0byAxMCBtaW51dGVzKS4KLSAgICAtIHByaW50LmRvY3MgY3JlYXRlIFBERiBkb2N1bWVudGF0aW9uIChyZXF1aXJlcyBmb3AuamFyIGFuZCB3M2MuamFyKS4KLSAgICAgICAgCi1JZiB5b3UgYnVpbGQgYSB0YXJnZXQgdGhhdCBkZXBlbmRzIG9uIG90aGVyIHRhcmdldHMsIHRob3NlIG90aGVyIHRhcmdldHMgYXJlIGNyZWF0ZWQgaW4gCi10aGUgY29ycmVjdCBvcmRlci4KLQotQXV0aG9yczoKLSAgU2hhbmUgQ3VyY3VydSA8c2hhbmVfY3VyY3VydUBsb3R1cy5jb20+Ci0gIERvbiBMZXNsaWUgPGRvbmFsZF9sZXNsaWVAbG90dXMuY29tPgotCi1Db3B5cmlnaHQ6Ci0gIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgCi0gIC0gTXVjaCBvZiB0aGlzIGZpbGUgc3RvbGVuIGZyb20gU3RlZmFubydzIHhtbC14ZXJjZXMgYnVpbGQueG1sICAKLSAgCi0gICAkSWQkCi0gICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cHJvamVjdCBuYW1lPSJYYWxhbiIgZGVmYXVsdD0iamFyIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIERlZmluZXMgdmFyaWFibGVzIHVzZWQgYnkgdGhlIG90aGVyIHRhcmdldHMgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIyXzBfMSIvPgotICA8cHJvcGVydHkgbmFtZT0ibmFtZSIgdmFsdWU9InhhbGFuIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJOYW1lIiB2YWx1ZT0iWGFsYW4tSmF2YSIvPgotICA8cHJvcGVydHkgbmFtZT0ieWVhciIgdmFsdWU9IjIwMDAiLz4KLQotCi0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgdmFsdWU9ImNsYXNzaWMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImRlYnVnIiB2YWx1ZT0ib2ZmIi8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9Im1maW5mLmRpciIgdmFsdWU9Ii4vc3JjL01FVEEtSU5GIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iLi9zcmMiLz4KLSAgPHByb3BlcnR5IG5hbWU9InhwYXRoLnJlbGRpciIgdmFsdWU9Im9yZy9hcGFjaGUveHBhdGgiLz4KLSAgPHByb3BlcnR5IG5hbWU9InhhbGFuLnJlbGRpciIgdmFsdWU9Im9yZy9hcGFjaGUveGFsYW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRyYXgucmVsZGlyIiB2YWx1ZT0iamF2YXgveG1sL3RyYW5zZm9ybSIvPgotICA8cHJvcGVydHkgbmFtZT0ic2VyaWFsaXplLnJlbGRpciIgdmFsdWU9Im9yZy9hcGFjaGUvc2VyaWFsaXplIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzZXJpYWxpemVyLnJlbGRpciIgdmFsdWU9Im9yZy9hcGFjaGUveGFsYW4vc2VyaWFsaXplIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXhwLnJlbGRpciIgdmFsdWU9ImphdmF4L3htbC9wYXJzZXJzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzYXgucmVsZGlyIiB2YWx1ZT0ib3JnL3htbC9zYXgiLz4KLSAgPHByb3BlcnR5IG5hbWU9InczYy5yZWxkaXIiIHZhbHVlPSJvcmcvdzNjIi8+ICAgIAotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iLi9idWlsZCIvPgotICA8IS0tIFdoZXJlIHdlIHB1dCB0aGUgeGFsYW4uamFyIHdlIGNvbXBpbGUgYnkgZGVmYXVsdCAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnhhbGFuLmphciIgdmFsdWU9IiR7YnVpbGQuZGlyfS94YWxhbi5qYXIiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMiIHZhbHVlPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZG9jcyIgdmFsdWU9IiR7YnVpbGQuZGlyfS9kb2NzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5zYW1wbGVzIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L3NhbXBsZXMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmFwaWRvY3MiIHZhbHVlPSIke2J1aWxkLmRvY3N9L2FwaWRvY3MiLz4KLSAgCi0gIDwhLS0gWGFsYW4tSjEgY29tcGF0YWJpbGl0eSBzdHVmZi4gIC0tPgotICA8cHJvcGVydHkgbmFtZT0iY29tcGF0LmphciIgdmFsdWU9InhhbGFuajFjb21wYXQuamFyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJjb21wYXQuc3JjLmRpciIgdmFsdWU9Ii4vY29tcGF0X3NyYyIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGF0LmNsYXNzZXMiIHZhbHVlPSIke2J1aWxkLmRpcn0vY29tcGF0X2NsYXNzZXMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBhdC5qYXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vJHtjb21wYXQuamFyfSIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGF0LmFwaWRvY3MiIHZhbHVlPSIke2J1aWxkLmRvY3N9L2NvbXBhdF9hcGlkb2NzIi8+ICAgICAgICAKLQotICA8IS0tIFJlZmVyZW5jZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSB0ZXN0IHNvdXJjZSBjb2RlIGFyZWEuIC0tPgotICA8cHJvcGVydHkgbmFtZT0idGVzdHMuZGlyIiB2YWx1ZT0iLi4vdGVzdC9qYXZhLyIvPgotICA8cHJvcGVydHkgbmFtZT0ic2FtcGxlcy5kaXIiIHZhbHVlPSIuL3NhbXBsZXMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJpbi5kaXIiIHZhbHVlPSIuL2JpbiIvPgotICA8cHJvcGVydHkgbmFtZT0ieGVyY2VzLmphciIgdmFsdWU9IiR7YmluLmRpcn0veGVyY2VzLmphciIvPgotICA8cHJvcGVydHkgbmFtZT0iYnNmLmphciIgdmFsdWU9IiR7YmluLmRpcn0vYnNmLmphciIvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmZpbGUiIHZhbHVlPSIke25hbWV9LWpfJHt2ZXJzaW9ufSIvPgotICA8cHJvcGVydHkgbmFtZT0iZGlzdC5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vJHtkaXN0LmZpbGV9Ii8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9Inhkb2NzLmRpciIgdmFsdWU9Ii4veGRvY3MiLz4KLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24uZmlsZSIgdmFsdWU9Im9yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yL1hTTFByb2Nlc3NvclZlcnNpb24uamF2YSIvPgotICA8cHJvcGVydHkgbmFtZT0ieGRvY3MuYm9vayIgdmFsdWU9IiR7eGRvY3MuZGlyfS9zb3VyY2VzL3hhbGFuLWpsb2NhbC54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9Inhkb2NzLnN0eWxlIiB2YWx1ZT0iJHt4ZG9jcy5kaXJ9L3N0eWxlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ4YWxhbm9ubHktc3R5bGVkb2NzIgotICAgICAgICAgICAgdmFsdWU9ImR0ZC94c2wtaHRtbDQwcy5kdGQsZHRkL3NwZWMuZHRkLHN0eWxlc2hlZXRzL3BhdHRlcm5zLnhzbCxzdHlsZXNoZWV0cy9ub3RpY2UueHNsLHN0eWxlc2hlZXRzL3NwZWMueHNsLHN0eWxlc2hlZXRzL2RvbmUueHNsLGxvYWRlcmRlc2lnbi54bWwsc3R5bGVzaGVldHMvZGVzaWduMnByb2plY3QueHNsLHN0eWxlc2hlZXRzL2Rlc2lnbmRvYzJodG1sLnhzbCxzdHlsZXNoZWV0cy94bWwyZm8ueHNsIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkb2MuZ2VuZXJhdG9yIiB2YWx1ZT0ib3JnLmFwYWNoZS5zdHlsZWJvb2suU3R5bGVCb29rIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkb2MuZ2VuZXJhdG9yLnN0eWxldGFyZ3oiIHZhbHVlPSIke3hkb2NzLmRpcn0veG1sLXNpdGUtc3R5bGUudGFyLmd6Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkb2MuZ2VuZXJhdG9yLnN0eWxldGFyIiB2YWx1ZT0iJHt4ZG9jcy5kaXJ9L3htbC1zaXRlLXN0eWxlLnRhciIvPgotICAKLSAgPHByb3BlcnR5IG5hbWU9InNpdGUucm9vdCIgdmFsdWU9Ii4veG1sLXNpdGUiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNpdGUuZGlyIiB2YWx1ZT0iJHtzaXRlLnJvb3R9L3RhcmdldC94YWxhbi1qIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzaXRlLmJvb2siIHZhbHVlPSIke3hkb2NzLmRpcn0vc291cmNlcy94YWxhbi1qc2l0ZS54bWwiLz4KLQotICA8cHJvcGVydHkgbmFtZT0idGVzdC5sb2dnaW5nTGV2ZWwiIHZhbHVlPSI1Ii8+Ci0gIDwhLS0gVGhlIGV4Y2x1ZGVkIGxyZSB0ZXN0cyBhcmUgYXQgaXNzdWUgb3IgYXJlIG5ldyBidWdzLCBhbmQgc2hvdWxkIGJlIAotICAgICAgIGluY2x1ZGVkIGFzIHNvb24gYXMgdGhleSBhcmUgcmVzb2x2ZWQuICAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QuZXhjbHVkZXMiIHZhbHVlPSJpbXBpbmNsMTIueHNsO2xyZTAyLnhzbDtscmUwMy54c2w7bHJlMDcueHNsO2xyZTEwLnhzbDtscmUxMi54c2w7bHJlMjEueHNsIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmVtYmVkZGVkIiB2YWx1ZT0iZW1iZWQwMS54c2w7ZW1iZWQwMi54c2w7ZW1iZWQwNy54c2wiLz4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gUHJlcGFyZXMgdGhlIHhkb2NzL3N0eWxlIGFuZCB0aGUgYnVpbGQgZGlyZWN0b3JpZXMgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9InByZXBhcmUiPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICA8IS0tIE5vdGUgdGhhdCBhbGwgdGVzdGluZy1yZWxhdGVkIHRhcmdldHMgKm11c3QqIGRlcGVuZCBvbiAKLSAgICAgICAgIHRoaXMgdGFyZ2V0LCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdG8gZ2V0IAotICAgICAgICAgdGhlIHRlc3RzLWF2YWlsYWJsZSBwcm9wZXJ0eSBzZXQgZm9yIHRoZW0uCi0gICAgLS0+Ci0gICAgPGF2YWlsYWJsZSBmaWxlPSIke3Rlc3RzLmRpcn0iIHByb3BlcnR5PSJ0ZXN0cy1hdmFpbGFibGUiIC8+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InByZXBhcmUuZG9jcyIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgPGd1bnppcCBzcmM9IiR7ZG9jLmdlbmVyYXRvci5zdHlsZXRhcmd6fSIvPgotICAgIDx1bnRhciBzcmM9IiR7ZG9jLmdlbmVyYXRvci5zdHlsZXRhcn0iIGRlc3Q9IiR7eGRvY3MuZGlyfSIvPgotICAgICAgICA8ZGVsZXRlIGZpbGU9IiR7ZG9jLmdlbmVyYXRvci5zdHlsZXRhcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRvY3N9Ii8+IDwhLS0gdHJhbnNmb3JtIHRvZG8ueG1sIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiBidWlsZC9kb2NzIC0tPgotICAgIDxqYXZhIGZvcms9InllcyIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhhbGFuLnhzbHQuUHJvY2VzcyIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC5kaXJ9LyR4YWxhbi5qYXIiPgotICAgICAgPGFyZyBsaW5lPSItaW4gdG9kby54bWwgLXhzbCB0b2RvLnhzbCAtb3V0ICR7YnVpbGQuZG9jc30vdG9kby5odG1sIi8+Ci0gICAgPC9qYXZhPiAKLSAgICA8IS0tIFdlIHVzZSBhIE5vdGVzIGFnZW50IHRvIGV4dHJhY3QgWGFsYW4tSmF2YSAyIGNvbW1pdHMgZnJvbSBvdXIgdGVhbSBkYXRhYmFzZSBpbnRvIGNvbW1pdHMueG1sLiAgVGhlIGZvbGxvd2luZyBvcGVyYXRpb24gCi0gICAgdHJhbnNmb3JtcyBjb21taXRzLnhtbCAoanVzdCBpbmNsdWRpbmcgc291cmNlIGNvZGUgY29tbWl0cykgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbiB4ZG9jcy9zb3VyY2VzL3hhbGFuIGZvciBpbmNsdXNpb24gaW4gdGhlIAotICAgIHJlYWRtZS54bWwgLS0+ICAgICAgCi0gICAgPGphdmEgZm9yaz0ieWVzIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIiBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLmRpcn0vJHhhbGFuLmphciI+Ci0gICAgICA8YXJnIGxpbmU9Ii1pbiBjb21taXRzLnhtbCAteHNsICR7eGRvY3Muc3R5bGV9L3N0eWxlc2hlZXRzL2RvbmUueHNsIC1vdXQgJHt4ZG9jcy5kaXJ9L3NvdXJjZXMveGFsYW4vRE9ORSIvPgotICAgIDwvamF2YT4KLSAgICA8IS0tIEdlbmVyYXRlIHRoZSBYYWxhbi1KMiBkZXNpZ24gZG9jdW1lbnQgLS0+Ci0gICAgPGphdmEgZm9yaz0ieWVzIiBjbGFzc25hbWU9IiR7ZG9jLmdlbmVyYXRvcn0iCi0gICAgICAgICAgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC5kaXJ9L3hhbGFuLmphciI+IAotICAgICAgICAgIDxhcmcgbGluZT0ibG9hZGVyQ29uZmlnPXNiazovc3R5bGUvbG9hZGVyZGVzaWduLnhtbCB0YXJnZXREaXJlY3Rvcnk9Li9idWlsZC9kb2NzL2Rlc2lnbi8KLSAgICAgICAgICAgICAgICAgICAgIC4veGRvY3Mvc291cmNlcy94YWxhbmRlc2lnbi54bWwgLi94ZG9jcy9zdHlsZSIvPgotICAgIDwvamF2YT4KLSAgICAgICAgICAgCi0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5hcGlkb2NzfSIvPgotICA8L3RhcmdldD4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ29weSBvdmVyIHRoZSBzb3VyY2UgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSBXZSdyZSBjdXJyZW50bHkgc2tpcHBpbmcgdGhpcyBzdGVwLCBzaW5jZSBpdCBzZWVtcyBleHRyYW5lb3VzIGlmCi0gICAgICAgeW91J3JlIG5vdCBnb2luZyB0byBiZSB1c2luZyB0aGUgZmlsdGVyaW5nIHN0dWZmLiAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBDb21waWxlcyB0aGUgc291cmNlIHRyZWUgLSB4cGF0aCAoaW5kZXBlbmRlbnQgeHBhdGggZW5naW5lKSAgICAgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gTm90ZTogU3RpbGwgdG9vIG1hbnkgY3Jvc3MtZGVwZW5kZW5jaWVzIHRvIGRvIHRoaXMgc2VwYXJhdGVseSAtLT4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLnhwYXRoIiBkZXBlbmRzPSJwcmVwYXJlIj4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9LyR7eHBhdGgucmVsZGlyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENvbXBpbGVzIHRoZSBzb3VyY2UgdHJlZSAtIHhhbGFuICh0aGUgcHJvY2Vzc29yKSAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBOb3RlOiBTdGlsbCB0b28gbWFueSBjcm9zcy1kZXBlbmRlbmNpZXMgdG8gZG8gdGhpcyBzZXBhcmF0ZWx5IC0tPgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUueGFsYW4iIGRlcGVuZHM9ImNvbXBpbGUueHBhdGgiPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0vJHt4YWxhbi5yZWxkaXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICA8L3RhcmdldD4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ29tcGlsZSBlbnRpcmUgc291cmNlIHRyZWUgLSBleGNlcHQgWGFsYW4tSiAxIGNvbXBhdGFiaWxpdHkgY2xhc3NlcyAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9InByZXBhcmUiCi0gICAgZGVzY3JpcHRpb249IkNvbXBpbGUgWGFsYW4gdGhlIG5vcm1hbCB3YXkiID4KLSAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlIGVudGlyZSBzb3VyY2UgdHJlZSBhbmQgY29weSAucHJvcGVydGllcyBhbmQgLnJlcyBmaWxlcyB0byBidWlsZCB0cmVlLiIvPgotICAgIDwhLS0gTm90ZTogc3BsaXQgY29tcGlsZSBpbnRvIHNlcGFyYXRlIGphdmFjIHN0ZXBzIHRvIGF2b2lkIEpESyAxLjEuOCBidWcgcmVwb3J0ZWQgYXQ6Ci0gICAgICAgICBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDA0MzUwOC5odG1sCi0gICAgICAgICB3aGljaCBjYXVzZXMgYW4gZXJyb3IgbGlrZToKLSAgICAgICAgIFtqYXZhY10gRTpcYnVpbGRzXHhtbC14YWxhblxqYXZhXHNyY1xvcmdcYXBhY2hlXHhhbGFuXHRlbXBsYXRlc1xFbGVtVGVtcGxhdGUuamF2YToxMDg6IEN5Y2xpYyBjbGFzcyBpbmhlcml0YW5jZSBvciBzY29waW5nLgotICAgIC0tPiAKLSAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIKLSAgICAgICAgICAgaW5jbHVkZXM9ImphdmF4LyoqLyouamF2YSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCi0gICAgICAgICAgIGluY2x1ZGVzPSJvcmcvdzNjLyoqLyouamF2YSxvcmcvdzNjLyoqLyouamF2YSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCi0gICAgICAgICAgIGluY2x1ZGVzPSJvcmcvYXBhY2hlL3htbC8qKi8qLmphdmEsb3JnL2FwYWNoZS94cGF0aC8qKi8qLmphdmEiCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IgotICAgICAgICAgICBpbmNsdWRlcz0ib3JnL2FwYWNoZS94YWxhbi8qKi8qLmphdmEiCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8qLnByb3BlcnRpZXMsKiovKi5yZXMsKiovamF2YXgueG1sLnBhcnNlcnMuKiwqKi9qYXZheC54bWwudHJhbnNmb3JtLioiLz4KLSAgICAgICAgPC9jb3B5PiAgCi0gIDwvdGFyZ2V0PgotICAgIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ29tcGlsZXMgb3RoZXIgc291cmNlIHRyZWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUudHJheCIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgCi0gICAgICAgICAgIGluY2x1ZGVzPSIke3RyYXgucmVsZGlyfS8qKiIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuc2VyaWFsaXplIiBkZXBlbmRzPSJwcmVwYXJlIj4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIKLSAgICAgICAgICAgaW5jbHVkZXM9IiR7c2VyaWFsaXplLnJlbGRpcn0vKioiIAotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5zYXgiIGRlcGVuZHM9InByZXBhcmUiPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0vJHtzYXgucmVsZGlyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIAotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlLnczYyIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfS8ke3czYy5yZWxkaXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuamF4cCIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfS8ke2pheHAucmVsZGlyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIAotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ3JlYXRlcyB0aGUgeGFsYW4gSkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSIKLSAgICBkZXNjcmlwdGlvbj0iSmFyIHVwIHhhbGFuLmphciIgPgotICAgIDxqYXIgamFyZmlsZT0iJHtidWlsZC54YWxhbi5qYXJ9IiBtYW5pZmVzdD0ic3JjXE1BTklGRVNULk1GIiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ii8+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9InBhY2thZ2UiIGRlcGVuZHM9ImphciI+Ci0gICAgPCEtLSBPSywgd2hhdCBhcmUgdGhlICdBcGFjaGUtc3RhbmRhcmQnIG5hbWVzIGZvciB2YXJpb3VzIHRhcmdldHM/IC0tPgotICAgIDxlY2hvIG1lc3NhZ2U9InBhY2thZ2UgaXMgYW4gYWxpYXMgZm9yIGphciIvPiAgCi0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENyZWF0ZXMgdGhlIFhhbGFuLUoxIGNvbXBhdGFiaWxpdHkgSkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJjb21wYXQuamFyIiBkZXBlbmRzPSJqYXIiPgotICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUgYW5kIEpBUiBYYWxhbi1KIDEgY29tcGFiaWxpdHkgQVBJLiIvPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY29tcGF0LmNsYXNzZXN9Ii8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtjb21wYXQuc3JjLmRpcn0iIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQueGFsYW4uamFyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY29tcGF0LmNsYXNzZXN9IgotICAgICAgICAgICBpbmNsdWRlcz0iKiovKi5qYXZhIgotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jb21wYXQuY2xhc3Nlc30iPgotICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb21wYXQuc3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8qLnByb3BlcnRpZXMsKiovKi5yZXMiLz4KLSAgICA8L2NvcHk+ICAKLSAgICA8amFyIGphcmZpbGU9IiR7YnVpbGQuY29tcGF0Lmphcn0iIG1hbmlmZXN0PSJzcmNcTUFOSUZFU1QuTUYiIGJhc2VkaXI9IiR7YnVpbGQuY29tcGF0LmNsYXNzZXN9Ii8+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImNvbXBhdC5wYWNrYWdlIiBkZXBlbmRzPSJjb21wYXQuamFyIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJjb21wYXQucGFja2FnZSBpcyBhbiBhbGlhcyBmb3IgY29tcGF0LmphciIvPiAgCi0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENyZWF0ZXMgdGhlIFhhbGFuLUoxIGNvbXBhdGFiaWxpdHkgamF2YWRvYyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJjb21wYXQuamF2YWRvY3MiIGRlcGVuZHM9ImphciI+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jb21wYXQuYXBpZG9jc30iLz4KLSAgICA8amF2YWRvYwotICAgICAgICAgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iCi0gICAgICAgICBwdWJsaWM9InRydWUiCi0gICAgICAgICBzb3VyY2VwYXRoPSIke2NvbXBhdC5zcmMuZGlyfSIKLSAgICAgICAgIG92ZXJ2aWV3PSIke2NvbXBhdC5zcmMuZGlyfS9jb21wYXRPdmVydmlldy5odG1sIiAgICAgICAgIAotICAgICAgICAgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLnhhbGFuLnhzbHQsb3JnLmFwYWNoZS54YWxhbi54cGF0aCxvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbCIKLSAgICAgICAgIGF1dGhvcj0idHJ1ZSIKLSAgICAgICAgIHZlcnNpb249InRydWUiCi0gICAgICAgICB1c2U9InRydWUiCi0gICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNvbXBhdC5hcGlkb2NzfSIKLSAgICAgICAgIHdpbmRvd3RpdGxlPSJYYWxhbi1KYXZhIDEgQ29tcGF0YWJpbGl0eSIgCi0gICAgICAgICBkb2N0aXRsZT0iWGFsYW4tSmF2YSAxIENvbXBhdGFiaWxpdHkiCi0gICAgICAgICBib3R0b209IkNvcHlyaWdodCAmIzE2OTsgJHt5ZWFyfSBBcGFjaGUgWE1MIFByb2plY3QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICA8L2phdmFkb2M+Ci0gIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iY29tcGF0LmFwaWRvY3MiIGRlcGVuZHM9ImNvbXBhdC5qYXZhZG9jcyI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iY29tcGF0LmFwaWRvY3MgaXMgYW4gYWxpYXMgZm9yIGNvbXBhdC5qYXZhZG9jcyIvPiAgCi0gIDwvdGFyZ2V0PgotICAgIAotCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBDb21waWxlcyB0aGUgc2FtcGxlcyAoc2VydmxldCBleGNsdWRlZCkgYW5kIGphcnMgdGhlIGNsYXNzIGZpbGVzICAgIC0tPiAgCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJzYW1wbGVzIiBkZXBlbmRzPSJqYXIiCi0gICAgZGVzY3JpcHRpb249IkNvbXBpbGUgYW5kIGphciB0aGUgc2FtcGxlcyAoZXhjZXB0IHNlcnZsZXQpIiA+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImV4Y2x1ZGUiIHZhbHVlPSIqLnhtbCwqLnhzbCwqLnR4dCwqLmh0bWwsKi5wcm9wZXJ0aWVzLCoub3V0Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5zYW1wbGVzfSIvPgotICAgIDwhLS0gU2luY2UgdGhlIHNhbXBsZXMgYXJlIHBhY2thZ2VsZXNzLCB0aGV5IG11c3QgYmUgY29tcGlsZWQgc2VwYXJhdGVseS4gLS0+ICAgCi0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzLmRpcn0vU2ltcGxlVHJhbnNmb3JtIiBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLnhhbGFuLmphcn0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLnNhbXBsZXN9IiAgZXhjbHVkZXM9IiR7ZXhjbHVkZX0iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c2FtcGxlcy5kaXJ9L1VzZVN0eWxlc2hlZXRQSSIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9IiAgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuc2FtcGxlc30iICBleGNsdWRlcz0iJHtleGNsdWRlfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzLmRpcn0vVXNlU3R5bGVzaGVldFBhcmFtIiBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLnhhbGFuLmphcn0iCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuc2FtcGxlc30iICBleGNsdWRlcz0iJHtleGNsdWRlfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+ICAgICAgICAgICAKLSAgICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXMuZGlyfS9TQVgyU0FYIiBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLnhhbGFuLmphcn0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLnNhbXBsZXN9IiAgZXhjbHVkZXM9IiR7ZXhjbHVkZX0iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPiAgICAgICAgICAgCi0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzLmRpcn0vRE9NMkRPTSIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5zYW1wbGVzfSIgIGV4Y2x1ZGVzPSIke2V4Y2x1ZGV9IgotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXMuZGlyfS9QaXBlIiBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLnhhbGFuLmphcn0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLnNhbXBsZXN9IiAgZXhjbHVkZXM9IiR7ZXhjbHVkZX0iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPiAgICAgICAgICAgCi0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzLmRpcn0vVXNlWE1MRmlsdGVycyIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5zYW1wbGVzfSIgIGV4Y2x1ZGVzPSIke2V4Y2x1ZGV9IgotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXMuZGlyfS9UcmFjZSIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9IiAgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuc2FtcGxlc30iICBleGNsdWRlcz0iJHtleGNsdWRlfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXMuZGlyfS9BcHBseVhQYXRoIiBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLnhhbGFuLmphcn0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLnNhbXBsZXN9IiBleGNsdWRlcz0iJHtleGNsdWRlfSIgCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzLmRpcn0vdHJheCIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5zYW1wbGVzfSIgZXhjbHVkZXM9IiR7ZXhjbHVkZX0iIAotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgIDxqYXZhYyBzcmNkaXI9IiR7c2FtcGxlcy5kaXJ9L2V4dGVuc2lvbnMiIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQueGFsYW4uamFyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuc2FtcGxlc30iIGV4Y2x1ZGVzPSIke2V4Y2x1ZGV9IiAKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+IAotICAgIDxqYXIgamFyZmlsZT0iJHtidWlsZC5kaXJ9L3hhbGFuc2FtcGxlcy5qYXIiIGJhc2VkaXI9IiR7YnVpbGQuc2FtcGxlc30iCi0gICAgICAgICBpbmNsdWRlcz0iKi5jbGFzcyIvPgotICAgICAgICAgICAgICAgICAgIAotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBDb21waWxlcyB0aGUgc2FtcGxlIHNlcnZsZXQgYW5kIGphcnMgdGhlIGNsYXNzIGZpbGVzLiAgICAgICAgICAgICAgICAtLT4gIAotICA8IS0tIFRoZSBqYXZheC5zZXJ2bGV0IGFuZCBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZXMgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tIG11c3QgYmUgb24gdGhlIGNsYXNzcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gPHRhcmdldCBuYW1lPSJzZXJ2bGV0IiBkZXBlbmRzPSJqYXIiCi0gICAgZGVzY3JpcHRpb249IkNvbXBpbGUgYW5kIGphciB0aGUgc2VydmxldCBzYW1wbGVzIiA+Ci0gICAgIDxlY2hvIG1lc3NhZ2U9IlRvIGNvbXBpbGUgdGhlIHNhbXBsZSBzZXJ2bGV0cywgamF2YXguc2VydmxldCBhbmQgamF2YXguc2VydmxldC5odHRwIG11c3QgYmUgb24gdGhlIGNsYXNzcGF0aCIvPiAgIAotICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnNhbXBsZXN9L3NlcnZsZXQiLz4KLSAgICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzLmRpcn0vc2VydmxldCIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5zYW1wbGVzfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5zYW1wbGVzfS9zZXJ2bGV0Ij4KLSAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c2FtcGxlcy5kaXJ9L3NlcnZsZXQiIAotICAgICAgICAgICAgICAgIGluY2x1ZGVzPSJtZWRpYS5wcm9wZXJ0aWVzLGRlZmF1bHQueHNsLGRlZmF1bHQyLnhzbCIvPgotICAgICAgICA8L2NvcHk+ICAJCSAgICAgICAgIAotICAgIDxqYXIgamFyZmlsZT0iJHtidWlsZC5kaXJ9L3hhbGFuc2VydmxldC5qYXIiIAotICAgICAgICAgYmFzZWRpcj0iJHtidWlsZC5zYW1wbGVzfSIgCi0gICAgICAgICBpbmNsdWRlcz0ic2VydmxldC8qKiIvPgotIDwvdGFyZ2V0PgotIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gR2VuZXJhdGUgSFRNTCBkb2NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9ImRvY3MiIGRlcGVuZHM9ImphcixwcmVwYXJlLmRvY3MsYXV0b2RvY3MiCi0gICAgZGVzY3JpcHRpb249IkJ1aWxkIHRoZSBmcmFtZXdvcmsgZG9jdW1lbnRhdGlvbiAob3ZlcnZpZXcsIHJlYWRtZSwgZXRjLikiID4KLSAgICA8ZWNobyBtZXNzYWdlPSJkb2NzIGlzIGh1bWFuLXVzYWJsZSB0YXJnZXQgd2l0aCBkZXBlbmRlbmNpZXMiLz4gIAotICA8L3RhcmdldD4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iYXV0b2RvY3MiPgotICAgIDxlY2hvIG1lc3NhZ2U9ImF1dG9kb2NzIGlzIGZvciBhdXRvbWF0ZWQgYnVpbGQgcHJvY2Vzcywgd2l0aG91dCBkZXBlbmRlbmNpZXMiLz4gICAKLSAgICA8amF2YSBmb3JrPSJ5ZXMiIGNsYXNzbmFtZT0iJHtkb2MuZ2VuZXJhdG9yfSIgY2xhc3NwYXRoPSIke2phdmEuY2xhc3MucGF0aH06JHtidWlsZC54YWxhbi5qYXJ9Ij4KLSAgICAgICA8YXJnIGxpbmU9InRhcmdldERpcmVjdG9yeT0ke2J1aWxkLmRvY3N9ICR7eGRvY3MuYm9va30gJHt4ZG9jcy5zdHlsZX0iLz4KLSAgICAgICAgPC9qYXZhPgkgCi0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENyZWF0ZXMgdGhlIEFQSSBkb2N1bWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jcyIgZGVwZW5kcz0icHJlcGFyZS5kb2NzLGF1dG9qYXZhZG9jcyIKLSAgICBkZXNjcmlwdGlvbj0iQnVpbGQgdGhlIEphdmFkb2NzIGZvciBYYWxhbiBzb3VyY2VzIiA+Ci0gICAgPGVjaG8gbWVzc2FnZT0iamF2YWRvY3MgaXMgaHVtYW4tdXNhYmxlIHRhcmdldCB3aXRoIGRlcGVuZGVuY2llcyIvPiAgCi0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iYXV0b2phdmFkb2NzIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJhdXRvamF2YWRvY3MgaXMgZm9yIGF1dG9tYXRlZCBidWlsZCBwcm9jZXNzLCB3aXRob3V0IGRlcGVuZGVuY2llcyIvPgotICAgIAotICAgIDwhLS0gZ2VuZXJhdGUgdHJheC5odG1sLCBhIFRSYVggb3ZlcnZpZXcgZG9jdW1lbnQsIGFuZCBhIHBhY2thZ2UuaHRtbCBmb3IgZWFjaCB0cmF4IHBhY2thZ2UKLSAgICAgICAgICh0aGUgbGF0dGVyIGFyZSBnZW5lcmF0ZWQgd2l0aCB0aGUgdGhlIFJlZGlyZWN0IGV4dGVuc2lvbiAtLT4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmFwaWRvY3N9L2phdmF4L3htbC90cmFuc2Zvcm0iLz4gICAgICAgICAKLSAgICA8amF2YSBmb3JrPSJ5ZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MiIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQueGFsYW4uamFyfSI+Ci0gICAgICA8YXJnIGxpbmU9Ii1pbiAke3hkb2NzLmRpcn0vc291cmNlcy90cmF4L3RyYXgueG1sCi0gICAgICAgICAgICAgICAgIC1wYXJhbSBwYWNrYWdlLXJvb3QgJy4uLy4uLy4uL3NyYy8nCi0gICAgICAgICAgICAgICAgIC14c2wgJHt4ZG9jcy5zdHlsZX0vc3R5bGVzaGVldHMvc3BlYy54c2wgCi0gICAgICAgICAgICAgICAgIC1vdXQgJHtidWlsZC5hcGlkb2NzfS9qYXZheC94bWwvdHJhbnNmb3JtL3RyYXguaHRtbCIvPgotICAgIDwvamF2YT4gICAKLSAgICAKLSAgICA8IS0tIEFudCAxLjIgaWdub3JlcyBkZXN0ZGlyIGFyZyBpZiBkb2NsZXQgaXMgc2V0LCBzbyBtdXN0IHNlbmQgdG8gZG9jbGV0IGluIGRvY2xldCBzdWJlbGVtZW50LS0+Ci0gICAgPGphdmFkb2MKLSAgICAgICAgIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IgotICAgICAgICAgcHVibGljPSJ0cnVlIgotICAgICAgICAgc291cmNlcGF0aD0iJHtzcmMuZGlyfSIKLSAgICAgICAgIG92ZXJ2aWV3PSIke3NyYy5kaXJ9L2phdmFkb2NPdmVydmlldy5odG1sIgotICAgICAgICAgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLiosb3JnLnhtbC4qLG9yZy53M2MuKixqYXZheC54bWwuKiIKLSAgICAgICAgIGF1dGhvcj0idHJ1ZSIKLSAgICAgICAgIHZlcnNpb249InRydWUiCi0gICAgICAgICB1c2U9InRydWUiCi0gICAgICAgICB3aW5kb3d0aXRsZT0iJHtOYW1lfSAyIiAKLSAgICAgICAgIGRvY3RpdGxlPSIke05hbWV9IDIiCi0gICAgICAgICBib3R0b209IkNvcHlyaWdodCAmIzE2OTsgJHt5ZWFyfSBBcGFjaGUgWE1MIFByb2plY3QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIj4KLSAgICAgICAgICA8ZG9jbGV0IG5hbWU9InhhbGFuamRvYy5TdGFuZGFyZCIgcGF0aD0iJHtiaW4uZGlyfS94YWxhbjJqZG9jLmphciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iLWQiIHZhbHVlPSIke2J1aWxkLmFwaWRvY3N9Ii8+Ci0gICAgICAgICAgPC9kb2NsZXQ+Ci0gICAgICAgICAgPGdyb3VwIHRpdGxlPSJUcmFuc2Zvcm1hdGlvbnMgQVBJIGZvciBYTUwgKFRyQVgpIiBwYWNrYWdlcz0iamF2YXgueG1sLnRyYW5zZm9ybSoiLz4KLSAgICAgICAgICA8Z3JvdXAgdGl0bGU9IkphdmEgQVBJIGZvciBYTUwgUGFyc2luZyIgcGFja2FnZXM9ImphdmF4LnhtbC5wYXJzZXJzIi8+Ci0gICAgICAgICAgPGdyb3VwIHRpdGxlPSJYYWxhbiBDb3JlIgotICAgICAgICAgICAgICAgICBwYWNrYWdlcz0ib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3I6b3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXM6b3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lciIvPgotICAgICAgICAgIDxncm91cCB0aXRsZT0iWFBhdGgiIHBhY2thZ2VzPSJvcmcuYXBhY2hlLnhwYXRoKiIvPgotICAgICAgICAgIDxncm91cCB0aXRsZT0iVXRpbGl0aWVzIiBwYWNrYWdlcz0ib3JnLmFwYWNoZS54bWwudXRpbHMqIi8+Ci0gICAgICAgICAgPGdyb3VwIHRpdGxlPSJYYWxhbiBPdGhlciIgcGFja2FnZXM9Im9yZy5hcGFjaGUueGFsYW4uY2xpZW50Om9yZzpvcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnM6b3JnLmFwYWNoZS54YWxhbi5yZXM6b3JnLmFwYWNoZS54YWxhbi5zdHJlZTpvcmcuYXBhY2hlLnhhbGFuLnRyYWNlOm9yZy5hcGFjaGUueGFsYW4ueHNsdCIvPgotICAgICAgICAgIDxncm91cCB0aXRsZT0iWGFsYW4gRXh0ZW5zaW9ucyIgcGFja2FnZXM9Im9yZy5hcGFjaGUueGFsYW4ubGliKiIvPgotICAgICAgICAgIDxncm91cCB0aXRsZT0iU2VyaWFsaXplcnMiIHBhY2thZ2VzPSJvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZSIvPgotICAgICAgICAgIDxncm91cCB0aXRsZT0iU0FYIDIiIHBhY2thZ2VzPSJvcmcueG1sLnNheCoiLz4KLSAgICAgICAgICA8Z3JvdXAgdGl0bGU9IkRPTSAyIiBwYWNrYWdlcz0ib3JnLnczYy5kb20qIi8+Ci0gICAgPC9qYXZhZG9jPgotICAgIAotICA8L3RhcmdldD4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ2xlYW5zIGV2ZXJ5dGhpbmc6IGJ1aWxkIHRyZWUsIHNpdGUgdHJlZSwgc3R5bGUgZG9jcyBpbiAgICAgICAgICAgICAtLT4KLSAgPCEtLSAgICAgICAgIC0gYnVpbGQgdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tICAgICAgICAgLSBkaXN0cmlidXRpb24gdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gICAgICAgICAtIHNpdGUgdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAgICAgICAgIC0gc3R5bGUgZG9jcyBleHBhbmRlZCBmcm9tIHhtbC1zaXRlLXN0eWxlLnRhci5nei4gICAgICAgICAgIC0tPgotICA8IS0tICAgICAgICAgICAoTVVTVCB1cGRhdGUgY29udGVudHMgb2YgJHt4YWxhbm9ubHktc3R5bGVkb2NzfSAgICAgICAgICAgLS0+Ci0gIDwhLS0gICAgICAgICAgICBpZiBjaGFuZ2UgY29udGVudHMgb2YgeG1sLXNpdGUtc3R5bGUudGFyLmd6KSAgICAgICAgICAgICAtLT4KLSAgPCEtLSAgICAgICAgIC0gSmF2YWRvYyBvdmVydmlldyBhbmQgcGFja3FhZ2UtbGV2ZWwgaHRtbCBkb2NzIHBsYWNlZCAgICAgIC0tPgotICA8IS0tICAgICAgICAgICBpbiB0aGUgc291cmNlIHRyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIKLSAgICBkZXNjcmlwdGlvbj0iQ2xlYW4gdXAgdGhlIGJ1aWxkIiA+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgIDxkZWxldGUgZGlyPSIke3NpdGUucm9vdH0iLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3hkb2NzLnN0eWxlfSIgZXhjbHVkZXM9IiR7eGFsYW5vbmx5LXN0eWxlZG9jc30iLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBDcmVhdGVzIHRoZSBkaXN0cmlidXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iamFyLGRvY3MsamF2YWRvY3Msc2FtcGxlcyxzZXJ2bGV0LGNvbXBhdC5qYXIsY29tcGF0LmphdmFkb2NzLGF1dG9kaXN0IgotICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSAuemlwLy50YXIuZ3ogZGlzdHJpYnV0aW9uIG1vZHVsZSIgPgotICAgIDxlY2hvIG1lc3NhZ2U9ImRpc3QgaXMgaHVtYW4tdXNlYWJsZSB0YXJnZXQgZm9yIGRpc3RyaWJ1dGlvbiwgd2l0aCBhbGwgZGVwZW5kZW5jaWVzIi8+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9ImF1dG9kaXN0Ij4KLSAgICA8ZWNobyBtZXNzYWdlPSJhdXRvZGlzdCBpcyBmb3IgYXV0b21hdGVkIGJ1aWxkIHByb2Nlc3Nlcywgd2l0aG91dCBkZXBlbmRlbmNpZXMiLz4KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5kaXJ9L2JpbiIvPiAgICAKLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZGlyfS9zcmMiLz4KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZGlyfS9jb21wYXRfc3JjIi8+ICAgIAotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5kaXJ9L3hkb2NzIi8+Ci0gICAgPG1rZGlyIGRpcj0iJHtkaXN0LmRpcn0vZG9jcyIvPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5kaXJ9L2RvY3MvYXBpZG9jcyIvPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5kaXJ9L2RvY3MvY29tcGF0X2FwaWRvY3MiLz4gICAgCi0gICAgPG1rZGlyIGRpcj0iJHtkaXN0LmRpcn0vc2FtcGxlcyIvPgotICAgICAgICAKLSAgICAgICAgPCEtLSBDb3B5IGJpbiBkaXJlY3RvcnkgLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC5kaXJ9L2JpbiI+Ci0gICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jpbi5kaXJ9Ii8+Ci0gICAgICAgIDwvY29weT4gIAotCi0gICAgPCEtLSBDb3B5IHNvdXJjZXMgYW5kIHNvdXJjZSBkb2N1bWVudGF0aW9uIC0tPgotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuZGlyfS9zcmMiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ii8+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuZGlyfS9jb21wYXRfc3JjIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb21wYXQuc3JjLmRpcn0iLz4KLSAgICA8L2NvcHk+ICAgIAotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuZGlyfS94ZG9jcyI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7eGRvY3MuZGlyfSIvPgotICAgIDwvY29weT4KLSAgICAKLSAgICA8IS0tIENvcHkgYnVpbHQgZG9jdW1lbnRhdGlvbiBhbmQgamF2YWRvYywgYW5kIHNhbXBsZXMgc3JjIGFuZCBqYXJzIC0tPgotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuZGlyfS9kb2NzIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kb2NzfSIvPgotICAgIDwvY29weT4gIAotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuZGlyfS9zYW1wbGVzIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtzYW1wbGVzLmRpcn0iLz4KLSAgICA8L2NvcHk+ICAgCi0gICAgPGNvcHkgZmlsZT0iJHtidWlsZC5kaXJ9L3hhbGFuc2FtcGxlcy5qYXIiIHRvZGlyPSIke2Rpc3QuZGlyfS9iaW4iLz4KLSAgICA8Y29weSBmaWxlPSIke2J1aWxkLmRpcn0veGFsYW5zZXJ2bGV0LmphciIgdG9kaXI9IiR7ZGlzdC5kaXJ9L2JpbiIvPgotCi0gICAgPCEtLSBDb3B5IHhhbGFuIGphciBhbmQgY29tcGFiaWxpdHkgaW50byB0aGUgYmluIGRpcmVjdG9yeSAoc3ViamVjdCB0byBjaGFuZ2UpIC0tPgotICAgIDxjb3B5IGZpbGU9IiR7YnVpbGQueGFsYW4uamFyfSIgdG9kaXI9IiR7ZGlzdC5kaXJ9L2JpbiIvPgotICAgIDxjb3B5IGZpbGU9IiR7YnVpbGQuY29tcGF0Lmphcn0iIHRvZGlyPSIke2Rpc3QuZGlyfS9iaW4iLz4gICAgCi0KLSAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LmRpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0icmVhZG1lLmh0bWwsS0VZUyxMaWNlbnNlLGJ1aWxkLnhtbCxidWlsZC5zaCxidWlsZC5iYXQsdG9kby54bWwsdG9kby54c2wsY29tbWl0cy54bWwiLz4KLSAgICA8L2NvcHk+Ci0gICAgICAgICAgCi0gICAgPHppcCB6aXBmaWxlPSIke2J1aWxkLmRpcn0vJHtkaXN0LmZpbGV9LnppcCIgYmFzZWRpcj0iJHtidWlsZC5kaXJ9IiBpbmNsdWRlcz0iJHtkaXN0LmZpbGV9LyoqIi8+Ci0gICAgPHRhciB0YXJmaWxlPSIke2J1aWxkLmRpcn0vJHtkaXN0LmZpbGV9LnRhciIgYmFzZWRpcj0iJHtidWlsZC5kaXJ9IiBpbmNsdWRlcz0iJHtkaXN0LmZpbGV9LyoqIi8+Ci0gICAgPGd6aXAgc3JjPSIke2J1aWxkLmRpcn0vJHtkaXN0LmZpbGV9LnRhciIgemlwZmlsZT0iJHtidWlsZC5kaXJ9LyR7ZGlzdC5maWxlfS50YXIuZ3oiLz4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ3JlYXRlcyB0aGUgZG9jdW1lbnRhdGlvbiB0cmVlIGZvciB0aGUgb3JnLmFwYWNoZS54bWwgd2Vic2l0ZSAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9InNpdGUiIGRlcGVuZHM9InByZXBhcmUuZG9jcyI+Ci0gCi0gICAgPG1rZGlyIGRpcj0iJHtzaXRlLmRpcn0vYXBpZG9jcyIvPgotICAgIDxta2RpciBkaXI9IiR7c2l0ZS5kaXJ9L2NvbXBhdF9hcGlkb2NzIi8+Ci0gICAgPG1rZGlyIGRpcj0iJHtzaXRlLmRpcn0vZGVzaWduIi8+Ci0gICAgPGphdmEgZm9yaz0ieWVzIiBjbGFzc25hbWU9IiR7ZG9jLmdlbmVyYXRvcn0iIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQuZGlyfS8keGFsYW4uamFyIj4gCi0gICAgICAgPGFyZyBsaW5lPSJ0YXJnZXREaXJlY3Rvcnk9JHtzaXRlLmRpcn0gJHtzaXRlLmJvb2t9ICR7eGRvY3Muc3R5bGV9Ii8+Ci0gICAgICAgIDwvamF2YT4KLQotICAgICAgICA8IS0tIHB1dCB0b2RvLmh0bWwgaW4gdGhlIHNpdGUgZGlyZWN0b3J5IC0tPiAgICAgCi0gICAgPGNvcHkgZmlsZT0iJHtidWlsZC5kb2NzfS90b2RvLmh0bWwiIHRvZGlyPSIke3NpdGUuZGlyfSIvPgotICAgICA8IS0tIHB1dCB4YWxhbiBkZXNpZ24gZG9jIGluIHRoZSBzaXRlIGRlc2lnbiBzdWJkaXIgLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7c2l0ZS5kaXJ9L2Rlc2lnbiI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZG9jc30vZGVzaWduIi8+Ci0gICAgPC9jb3B5PiAgCi0gICAgPCEtLSBwdXQgaW4gdGhlIGphdmFkb2MgLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7c2l0ZS5kaXJ9L2FwaWRvY3MiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmFwaWRvY3N9Ii8+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke3NpdGUuZGlyfS9jb21wYXRfYXBpZG9jcyI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuY29tcGF0LmFwaWRvY3N9Ii8+Ci0gICAgPC9jb3B5PiAgCi0gICAgICAKLSAgPC90YXJnZXQ+Ci0gICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENvbXBpbGVzIGFuZCBydW5zIHRoZSBtaW5pdGVzdCBmcm9tIHhtbC14YWxhblx0ZXN0LCBpZiBwcmVzZW50ICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHBhdGggaWQ9Im1pbml0ZXN0LmNsYXNzLnBhdGgiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4ZXJjZXMuamFyfSIgLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQueGFsYW4uamFyfSIgLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnNmLmphcn0iIC8+Ci0gICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KLSAgPC9wYXRoPgotCi0gIDwhLS0gUmVmZXJlbmNlIGZyb20gdGhlIHRlc3RpbmcgZGlyZWN0b3J5IGJhY2sgdG8gb3VyIGRpcmVjdG9yeSwgCi0gICAgICAgdXNlZCB3aGVuIGNhbGxpbmcgdGVzdGluZyB0YXJnZXRzIHRvIHNldCB0aGUgY2xhc3NwYXRoIGZvciAKLSAgICAgICB0aGUgdGVzdHMgdG8gaW5jbHVkZSBqYXJzIHdlIGp1c3QgY29tcGlsZWQuCi0gIC0tPgotICA8cHJvcGVydHkgbmFtZT0idGVzdHMuYmFja3JlZiIgdmFsdWU9Ii4uLy4uL2phdmEvIi8+Ci0KLSAgPHRhcmdldCBuYW1lPSJtaW5pdGVzdCIgZGVwZW5kcz0icHJlcGFyZSxqYXIsbWluaXRlc3QtcnVuLHRlc3RzLW5vdC1hdmFpbGFibGUiIAotICAgIGRlc2NyaXB0aW9uPSJSdW4gdGhlIE1pbml0ZXN0IGZyb20geG1sLXhhbGFuL3Rlc3QvamF2YSIgPgotICAgIDwhLS0gVGhpcyB0YXJnZXQgZXhwbGljaXRseSBkZXBlbmRzIG9uIHRoZSBqYXIgdGFyZ2V0LCBzaW5jZSAKLSAgICAgICAgIHdpdGhvdXQgeGFsYW4uamFyIHRoZSB0ZXN0cyB3b24ndCBjb21waWxlL3J1bi4KLSAgICAgICAgIFdlIHRoZW4gY2FsbCB0aGUgd29ya2VyIHRhcmdldCBtaW5pdGVzdC1ydW4gdG8gZG8gCi0gICAgICAgICB0aGUgd29yayBvZiBydW5uaW5nIHRoZSBtaW5pdGVzdC4KLSAgICAgICAgIFdlIGZpbmFsbHkgY2FsbCBhIGhlbHBlciB0YXJnZXQgdGVzdHMtbm90LWF2YWlsYWJsZSAKLSAgICAgICAgIHRvIG5vdGlmeSB1c2VycyB0aGF0IHRoZXkgbmVlZCB0byBjaGVja291dCB0aGUgdGVzdHMgCi0gICAgICAgICBleHBsaWNpdGx5IGZyb20gQ1ZTIC0gYnV0IHRoaXMgb25seSBydW5zIGlmIG5lZWRlZC4KLSAgICAtLT4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0ibWluaXRlc3QtcnVuIiBpZj0idGVzdHMtYXZhaWxhYmxlIiBkZXBlbmRzPSJwcmVwYXJlIiA+Ci0gICAgPGVjaG8gbWVzc2FnZT0iIFttaW5pdGVzdF0gQ2FsbGluZyAke3Rlc3RzLmRpcn1idWlsZC54bWwgbm93IHRvIHJ1biBtaW5pdGVzdC54YWxhbjIiIC8+Ci0gICAgPGFudCBkaXI9IiR7dGVzdHMuZGlyfSIgYW50ZmlsZT0iYnVpbGQueG1sIiB0YXJnZXQ9Im1pbml0ZXN0LnhhbGFuMiIgPgotICAgICAgPCEtLSBTZXQgdGhlIGJlbG93IHRlc3R4c2wuamFyLm5hbWUgc28gdGhhdCBpdCB3aWxsIGNyZWF0ZSAKLSAgICAgICAgICAgbWluaXRlc3QuamFyIGluc3RlYWQgb2YgdGVzdHhzbC5qYXI7IHdlIG9ubHkgZG8gdGhpcyBoZXJlIAotICAgICAgICAgICBzaW5jZSB0aGlzIGlzIGEgY29tbW9ubHktY2FsbGVkIGRldmVsb3BlciB0YXJnZXQsIGFuZCBpdCdzIAotICAgICAgICAgICBnb29kIHRvIGRpZmZlcmVudGlhdGUgdGhpcyBqYXIgZnJvbSB0aGUgcmVndWxhciB0ZXN0aW5nIGphciAKLSAgICAgICAgICAgKHdoaWNoIGhhcyBtYW55IG1vcmUgdGVzdCBjbGFzc2VzIGluIGl0KS4KLSAgICAgIC0tPgotICAgICAgPHByb3BlcnR5IG5hbWU9InRlc3R4c2wuamFyLm5hbWUiIHZhbHVlPSJtaW5pdGVzdC5qYXIiIC8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icHJlcGVuZC5jbGFzcy5wYXRoIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3Rlc3RzLmJhY2tyZWZ9JHt4ZXJjZXMuamFyfToke3Rlc3RzLmJhY2tyZWZ9JHtidWlsZC54YWxhbi5qYXJ9OiR7dGVzdHMuYmFja3JlZn0ke2JzZi5qYXJ9IiAvPgotICAgIDwhLS0gV2h5IGRvZXNuJ3QgdGhlIGZvbGxvd2luZyByZWZpZCB3b3JrPyBJIGdldCBhbiBlcnJvciByZWZlcmVuY2luZyBpdC4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcmVwZW5kLmNsYXNzLnBhdGgiIHJlZmlkPSJtaW5pdGVzdC5jbGFzcy5wYXRoIiAvPgotICAgIC0tPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIENhbGxlZCBmcm9tIHZhcmlvdXMgdGVzdGluZyB0YXJnZXRzIGlmIHRoZSB0ZXN0IGRpciBkb2Vzbid0IGV4aXN0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0cy1ub3QtYXZhaWxhYmxlIiB1bmxlc3M9InRlc3RzLWF2YWlsYWJsZSIgPgotICAgIDxlY2hvIG1lc3NhZ2U9IiBbdGVzdHNdIFRoZSB0ZXN0cyBkbyBub3Qgc2VlbSB0byBiZSBwcmVzZW50ISIgLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIgW3Rlc3RzXSBZb3UgbXVzdCBoYXZlIGNoZWNrZWQgb3V0IGZyb20gQ1ZTIHRvIHJ1biB0aGUgdGVzdHMsIiAvPgotICAgIDxlY2hvIG1lc3NhZ2U9IiBbdGVzdHNdICAgaXQgaXMgbm90IGluY2x1ZGVkIGluIGJpbmFyeSBkaXN0cmlidXRpb25zLiIgLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIgW3Rlc3RzXSBTZWUgaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuLWovdGVzdC8gZm9yIG1vcmUgaW5mby4iIC8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENvbXBpbGVzIGFuZCBydW5zIHRoZSBjb25mb3JtYW5jZSB0ZXN0IGZyb20geG1sLXhhbGFuXHRlc3QsIGlmIHByZXNlbnQgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIFdlIHNob3VsZCBoYXZlIGEgZHVwbGljYXRlIG9mIG1pbml0ZXN0LmNsYXNzLnBhdGggdGhhdAotICAgICAgIGluIHRoZSBmdXR1cmUgdGhpcyBtYXkgbmVlZCB0byBpbmNsdWRlIHJlZmVyZW5jZXMgdG8gZGlycyAKLSAgICAgICB3aGVyZSBKYXZhLWJhc2VkIGV4dGVuc2lvbiB0ZXN0cyBrZWVwIHRoZWlyIC5jbGFzc2VzLgotICAtLT4KLQotICA8dGFyZ2V0IG5hbWU9ImNvbmZ0ZXN0IiBkZXBlbmRzPSJwcmVwYXJlLGphcixjb25mdGVzdC1ydW4sdGVzdHMtbm90LWF2YWlsYWJsZSIgCi0gICAgZGVzY3JpcHRpb249IlJ1biB0aGUgQ29uZm9ybWFuY2VUZXN0IGZyb20geG1sLXhhbGFuL3Rlc3QvamF2YSIgPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJjb25mdGVzdC1ydW4iIGlmPSJ0ZXN0cy1hdmFpbGFibGUiIGRlcGVuZHM9InByZXBhcmUiID4KLSAgICA8ZWNobyBtZXNzYWdlPSIgW2NvbmZ0ZXN0XSBDYWxsaW5nICR7dGVzdHMuZGlyfWJ1aWxkLnhtbCBub3cgdG8gcnVuIGNvbmZ0ZXN0LnhhbGFuMiIgLz4KLSAgICA8YW50IGRpcj0iJHt0ZXN0cy5kaXJ9IiBhbnRmaWxlPSJidWlsZC54bWwiIHRhcmdldD0iY29uZnRlc3QueGFsYW4yIiA+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0idGVzdHhzbC5qYXIubmFtZSIgdmFsdWU9ImNvbmZ0ZXN0LmphciIgLz4gCi0gICAgICA8IS0tIFNldCBuYW1lIGFib3ZlIHNvIHRoYXQgaXQgd2lsbCBjcmVhdGUgY29uZnRlc3QuamFyIGluc3RlYWQgCi0gICAgICAgICAgIG9mIHRlc3R4c2wuamFyIC0gYnV0LCBzaW5jZSB0aGUgIkNvbmZvcm1hbmNlVGVzdCIgZGVwZW5kcyAKLSAgICAgICAgICAgb24gc28gbWFueSB0ZXN0aW5nIGNsYXNzZXMsIGl0IG1heSBub3QgYmUgd29ydGggY2FsbGluZyAKLSAgICAgICAgICAgdGhpcyBhIGRpZmZlcmVudCBuYW1lIGZyb20gdGhlIGRlZmF1bHQgJ3Rlc3R4c2wuamFyJy4gIEl0IAotICAgICAgICAgICBkb2VzIHJlZHVjZSBjb25mdXNpb24sIGhvd2V2ZXIsIGZvciBwZW9wbGUgd2hvIGJ1aWxkIGFuZCAKLSAgICAgICAgICAgcnVuIHRoZSB0ZXN0cyBkaXJlY3RseSBmcm9tIHRoZSB0ZXN0aW5nIGRpcmVjdG9yeSwgaW5zdGVhZCAKLSAgICAgICAgICAgb2YgZG9pbmcgaXQgZnJvbSB0aGlzIGRpcmVjdG9yeS4KLSAgICAgIC0tPgotICAgICAgPHByb3BlcnR5IG5hbWU9InByZXBlbmQuY2xhc3MucGF0aCIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHt0ZXN0cy5iYWNrcmVmfSR7eGVyY2VzLmphcn06JHt0ZXN0cy5iYWNrcmVmfSR7YnVpbGQueGFsYW4uamFyfToke3Rlc3RzLmJhY2tyZWZ9JHtic2YuamFyfSIgLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ29tcGlsZXMgYW5kIHJ1bnMgdGhlIHNtb2tlIHRlc3QgZnJvbSB4bWwteGFsYW5cdGVzdCwgaWYgcHJlc2VudCAgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic21va2V0ZXN0IiBkZXBlbmRzPSJwcmVwYXJlLGphcixzbW9rZXRlc3QtcnVuLHRlc3RzLW5vdC1hdmFpbGFibGUiIAotICAgIGRlc2NyaXB0aW9uPSJSdW4gdGhlIHNtb2tlIHRlc3QgLSB0byBiZSBkZWZpbmVkLiIgPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJzbW9rZXRlc3QtcnVuIiBpZj0idGVzdHMtYXZhaWxhYmxlIiBkZXBlbmRzPSJwcmVwYXJlIiA+Ci0gICAgPGFudCBkaXI9IiR7dGVzdHMuZGlyfSIgYW50ZmlsZT0iYnVpbGQueG1sIiB0YXJnZXQ9InNtb2tldGVzdC14YWxhbjIiID4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcmVwZW5kLmNsYXNzLnBhdGgiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7dGVzdHMuYmFja3JlZn0ke3hlcmNlcy5qYXJ9OiR7dGVzdHMuYmFja3JlZn0ke2J1aWxkLnhhbGFuLmphcn06JHt0ZXN0cy5iYWNrcmVmfSR7YnNmLmphcn0iIC8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENyZWF0ZXMgdGhlIHRvZG8gbGlzdCBmb3IgdGhlIG9yZy5hcGFjaGUueG1sIHdlYnNpdGUgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJ0b2RvIj4KLSAgICA8amF2YSBmb3JrPSJ5ZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MiIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQuZGlyfS8keGFsYW4uamFyIj4KLSAgICAgIDxhcmcgbGluZT0iLWluIHRvZG8ueG1sIC14c2wgdG9kby54c2wgLW91dCB0b2RvLmh0bWwiLz4KLSAgICA8L2phdmE+ICAgCi0gIDwvdGFyZ2V0PiAgCi0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENyZWF0ZXMgdGhlIHhhbGFuIGRlc2lnbiBkb2N1bWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9InhhbGFuLWoyLWRlc2lnbiI+Ci0gICAgPGphdmEgZm9yaz0ieWVzIiBjbGFzc25hbWU9IiR7ZG9jLmdlbmVyYXRvcn0iIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQuZGlyfS94YWxhbi5qYXIiPiAKLSAgICAgIDxhcmcgbGluZT0ibG9hZGVyQ29uZmlnPXNiazovc3R5bGUvbG9hZGVyZGVzaWduLnhtbCB0YXJnZXREaXJlY3Rvcnk9JHtidWlsZC5kaXJ9L2RvY3MvZGVzaWduLwotICAgICAgJHt4ZG9jcy5kaXJ9L3NvdXJjZXMveGFsYW5kZXNpZ24ueG1sICR7eGRvY3Muc3R5bGV9Ii8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBVc2UgRk9QIHRvIGNyZWF0ZSBwcmVsaW1pbmFyeSBwcmludCAocGRmKSBkb2MgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tIE5vdGU6IGZvcC5qYXIgYW5kIHhtbC5qYXIgKGZyb20geG1sLWZvcCkgbXVzdCBiZSBvbiBjbGFzc3BhdGggICAgICAgLS0+Ci0KLSAgPCEtLSBUaGlzIGlzIFZFUlkgcHJlbGltaW5hcnksIG5vdCB5ZXQgZm9yIGluY2x1c2lvbiBpbiBkaXN0cmlidXRpb24gICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPCEtLUNvbGxhdGUgdGhlIHhtbCBzb3VyY2VzIGludG8gYSBzaW5nbGUgeG1sIHNvdXJjZSB3aXRoIGEgbGl0bGUgZXh0cmEgc3RydWN0dXJlIC0tPgotICA8dGFyZ2V0IG5hbWU9InByaW50LmRvY3MiIGRlcGVuZHM9InByZXBhcmUuZG9jcyI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iZm9wLmphciBhbmQgeG1sLmphciBtdXN0IGJlIG9uIHRoZSBjbGFzc3BhdGgiLz4KLSAgICA8amF2YSBmb3JrPSJ5ZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MiCi0gICAgICBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLmRpcn0veGFsYW4uamFyIj4KLSAgICAgIDxhcmcgbGluZT0iLXhzbCAke3hkb2NzLmRpcn0vc291cmNlcy94YWxhbi1jb2xsYXRlLnhzbCAKLSAgICAgICAgICAgICAgICAgLW91dCAke3hkb2NzLmRpcn0vc291cmNlcy94YWxhbi94YWxhbi1jb2xsYXRlLnhtbCIvPgotICAgIDwvamF2YT4KLSAgICAKLSAgICA8IS0tIFRyYW5zZm9ybSBjb2xsYXRpb24gaW50byBGb3JtYXR0aW5nIE9iamVjdHMgCi0gICAgICAgICAod2l0aCBhIGxpdHRsZSB3b3JrIG9uIGxpbmtzIGFsb25nIHRoZSB3YXkpIC0tPiAgICAKLSAgICA8amF2YSBmb3JrPSJ5ZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MiCi0gICAgICBjbGFzc3BhdGg9IiR7amF2YS5jbGFzcy5wYXRofToke2J1aWxkLmRpcn0veGFsYW4uamFyIj4KLSAgICAgIDxhcmcgbGluZT0iLWluICAke3hkb2NzLmRpcn0vc291cmNlcy94YWxhbi94YWxhbi1jb2xsYXRlLnhtbAotICAgICAgICAgICAgICAgICAtcGFyYW0gcmVzb3VyY2VGaWxlICcuLi8uLi9zb3VyY2VzL3hhbGFuL3Jlc291cmNlcy54bWwnCi0gICAgICAgICAgICAgICAgIC1wYXJhbSBwcm9qZWN0ICR7TmFtZX0gICAgICAKLSAgICAgICAgICAgICAgICAgLXhzbCAke3hkb2NzLnN0eWxlfS9zdHlsZXNoZWV0cy94bWwyZm8ueHNsIAotICAgICAgICAgICAgICAgICAtb3V0ICR7YnVpbGQuZG9jc30veGFsYW4tY29sbGF0ZS5mbyIvPgotICAgIDwvamF2YT4KLSAgICAKLSAgICA8IS0tIFVzZSBGT1AgdG8gZ2VuZXJhdGUgYSBwZGYgZmlsZSAtLT4KLSAgICA8amF2YSBmb3JrPSJ5ZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5mb3AuYXBwcy5Db21tYW5kTGluZSIKLSAgICAgIGNsYXNzcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9OiR7YnVpbGQuZGlyfS94YWxhbi5qYXI6JHtiaW4uZGlyfS9mb3AuamFyOiR7YmluLmRpcn0vdzNjLmphciI+Ci0gICAgICA8YXJnIGxpbmU9IiR7YnVpbGQuZG9jc30veGFsYW4tY29sbGF0ZS5mbyBidWlsZC9kb2NzL3hhbGFuLnBkZiIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPiAgCi0gICA8IS0tIGZvciBkZXZlbG9wZXJzIG9ubHk7IGNvbXBpbGVzIHhhbGFuLWoxIHNhbXBsZXMgd2l0aCBjb21wYXQgamFyIGFuZCB4YWxhbi1qMiB4YWxhbi5qYXItLT4KLSAgIDx0YXJnZXQgbmFtZT0iY29tcGF0LnNhbXBsZXMiIGRlc2NyaXB0aW9uPSJDb21waWxlIFhhbGFuSjEgc2FtcGxlcyIgPgotICAgICA8cHJvcGVydHkgbmFtZT0iZXhjbHVkZSIgdmFsdWU9IioueG1sLCoueHNsLCoudHh0LCouaHRtbC4qLnByb3BlcnRpZXMiLz4KLSAgICAgPHByb3BlcnR5IG5hbWU9InNhbXBsZXNqMS5kaXIiIHZhbHVlPSIveG1sLXhhbGFuL3NhbXBsZXMiLz4KLSAgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBhdC5zYW1wbGVzIiB2YWx1ZT0iLi9idWlsZC9jb21wYXRfc2FtcGxlcyIvPgotICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNvbXBhdC5zYW1wbGVzfSIvPiAgICAgCi0KLSAgICA8IS0tbmVlZCB0byB1c2UgdGhlIFhhbGFuSjIgWFBhdGhBUEksIHNvIGNhbm5vdCBjb21waWxlIEFwcGx5WFBhdGggYXMgaXMgLS0+ICAgCi0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzajEuZGlyfS9QaXBlIiBjbGFzc3BhdGg9IiR7YnVpbGQuY29tcGF0Lmphcn06JHtidWlsZC54YWxhbi5qYXJ9OiR7amF2YS5jbGFzcy5wYXRofSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9IiAgZXhjbHVkZXM9IiR7ZXhjbHVkZX0iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPiAKLSAgICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXNqMS5kaXJ9L1NpbXBsZVRyYW5zZm9ybSIgY2xhc3NwYXRoPSIke2J1aWxkLmNvbXBhdC5qYXJ9OiR7YnVpbGQueGFsYW4uamFyfToke2phdmEuY2xhc3MucGF0aH0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNvbXBhdC5zYW1wbGVzfSIgIGV4Y2x1ZGVzPSIke2V4Y2x1ZGV9IgotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXNqMS5kaXJ9L1RyYW5zZm9ybVRvRG9tIiBjbGFzc3BhdGg9IiR7YnVpbGQuY29tcGF0Lmphcn06JHtidWlsZC54YWxhbi5qYXJ9OiR7amF2YS5jbGFzcy5wYXRofSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9IiAgZXhjbHVkZXM9IiR7ZXhjbHVkZX0iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c2FtcGxlc2oxLmRpcn0vUHVyZVNBWCIgY2xhc3NwYXRoPSIke2J1aWxkLmNvbXBhdC5qYXJ9OiR7YnVpbGQueGFsYW4uamFyfToke2phdmEuY2xhc3MucGF0aH0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNvbXBhdC5zYW1wbGVzfSIgIGV4Y2x1ZGVzPSIke2V4Y2x1ZGV9IgotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLz4gICAgICAgICAgCi0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzajEuZGlyfS9Vc2VTdHlsZXNoZWV0UGFyYW0iIGNsYXNzcGF0aD0iJHtidWlsZC5jb21wYXQuamFyfToke2J1aWxkLnhhbGFuLmphcn06JHtqYXZhLmNsYXNzLnBhdGh9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jb21wYXQuc2FtcGxlc30iICBleGNsdWRlcz0iJHtleGNsdWRlfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzYW1wbGVzajEuZGlyfS9TZXJ2bGV0IiBjbGFzc3BhdGg9IiR7YnVpbGQuY29tcGF0Lmphcn06JHtidWlsZC54YWxhbi5qYXJ9OiR7amF2YS5jbGFzcy5wYXRofSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9IiBleGNsdWRlcz0iJHtleGNsdWRlfSIKLSAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9Ii8+Ci0gICAgPGphciAgIGphcmZpbGU9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9L3hhbGFuamNvbXBhdHNhbXBsZXMuamFyIiBiYXNlZGlyPSIke2J1aWxkLmNvbXBhdC5zYW1wbGVzfSIKLSAgICAgICAgICAgIGluY2x1ZGVzPSIqLmNsYXNzIi8+IAotICAgICA8IS0tcHV0IHRoZSBzZXJ2bGV0IGluIGEgc2VwYXJhdGUgamFyIC0tPgotICAgICA8amF2YWMgc3JjZGlyPSIke3NhbXBsZXNqMS5kaXJ9L1NlcnZsZXQiIGNsYXNzcGF0aD0iJHtidWlsZC5jb21wYXQuamFyfToke2J1aWxkLnhhbGFuLmphcn06JHtqYXZhLmNsYXNzLnBhdGh9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jb21wYXQuc2FtcGxlc30iCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvPgotICAgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9L3NlcnZsZXQiPgotICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzYW1wbGVzajEuZGlyfS9TZXJ2bGV0IiAKLSAgICAgICAgICAgICAgICBpbmNsdWRlcz0ibWVkaWEucHJvcGVydGllcyxkZWZhdWx0LnhzbCxkZWZhdWx0Mi54c2wiLz4KLSAgICAgICAgPC9jb3B5PiAgCQkgICAgICAgICAKLSAgICA8amFyIGphcmZpbGU9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9L3hhbGFuY29tcGF0c2VydmxldC5qYXIiIGJhc2VkaXI9IiR7YnVpbGQuY29tcGF0LnNhbXBsZXN9IgotICAgICAgICAgaW5jbHVkZXM9InNlcnZsZXQvKioiLz4KLSA8L3RhcmdldD4KLSAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbW1pdHMueG1sIGIvY29tbWl0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2U4ZjQuLjAwMDAwMDAKLS0tIGEvY29tbWl0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxDb21taXRzPgotPENvbW1pdCBjYXRlZ29yeT0iY29yZSI+Ci08V2hvPmNvc3RpbkBhcGFjaGUub3JnPC9XaG8+Ci08RGF0ZUNvbW1pdHRlZD4wMy8xNi8yMDAxPC9EYXRlQ29tbWl0dGVkPgotPE1vZGlmaWVkPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yIFN0eWxlc2hlZXRIYW5kbGVyLmphdmEKLSBqYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoIEV4cHJlc3Npb24uamF2YSBYUGF0aC5qYXZhCi0gWFBhdGhDb250ZXh0LmphdmEKLSBqYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2NvbXBpbGVyIENvbXBpbGVyLmphdmEKLSBYUGF0aFBhcnNlci5qYXZhPC9Nb2RpZmllZD4KLTxMb2c+UmVuYW1lZCAiYXNzZXJ0KCkiIHRvICJhc3NlcnRpb24oKSIuCi0KLSBBc3NlcnQgY2FuIGJlIGEga2V5d29yZCwgYW5kIGJyYWtlIHRoZSBjb21waWxhdGlvbi48L0xvZz4KLTwvQ29tbWl0PgotPENvbW1pdCBjYXRlZ29yeT0iY29yZSI+Ci08V2hvPm1taWR5QGFwYWNoZS5vcmc8L1dobz4KLTxEYXRlQ29tbWl0dGVkPjAzLzE5LzIwMDE8L0RhdGVDb21taXR0ZWQ+Ci08TW9kaWZpZWQ+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lciBLZXlXYWxrZXIuamF2YTwvTW9kaWZpZWQ+Ci08TG9nPlRocm93IGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGtleSBuYW1lIGluIGEga2V5IGZ1bmN0aW9uIHdhcyBub3QgZGVmaW5lZDwvTG9nPgotPC9Db21taXQ+Ci08Q29tbWl0IGNhdGVnb3J5PSJjb3JlIj4KLTxXaG8+amtlc3NlbG1AYXBhY2hlLm9yZzwvV2hvPgotPERhdGVDb21taXR0ZWQ+MDMvMjAvMjAwMTwvRGF0ZUNvbW1pdHRlZD4KLTxNb2RpZmllZD5qYXZhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscyBGYXN0U3RyaW5nQnVmZmVyLmphdmE8L01vZGlmaWVkPgotPExvZz5SZXdvcmtlZCAiY2h1bmsgZ3Jvd3RoIiBhbGdvcml0aG0gYWdhaW4uIEdyb3dpbmcgbW9kZSBub3QKLSB5ZXQgYWRlcXVhdGVseSB0ZXN0ZWQsIGJ1dCBmaXhlZC1zaXplIG1vZGUgKHdoaWNoIGlzIHdoYXQgWGFsYW4KLSBpcyBjdXJyZW50bHkgdXNpbmcpIGlzIHNpbXBsZXIgY29kZSBhbmQgc2hvd3MgaW1wcm92ZWQgcGVyZm9ybWFuY2UuPC9Mb2c+Ci08L0NvbW1pdD4KLTxDb21taXQgY2F0ZWdvcnk9ImNvcmUiPgotPFdobz5jdXJjdXJ1QGFwYWNoZS5vcmc8L1dobz4KLTxEYXRlQ29tbWl0dGVkPjAzLzIwLzIwMDE8L0RhdGVDb21taXR0ZWQ+Ci08QWRkZWQ+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IEVudmlyb25tZW50Q2hlY2suamF2YTwvQWRkZWQ+Ci08TG9nPlV0aWxpdHkgY2xhc3MgdG8gY2hlY2sgeW91ciBKVk0gZW52aXJvbm1lbnQgZm9yIGNvbW1vbiBwcm9ibGVtczwvTG9nPgotPC9Db21taXQ+Ci08Q29tbWl0IGNhdGVnb3J5PSJjb21wYXQiPgotPFdobz5qa2Vzc2VsbUBhcGFjaGUub3JnPC9XaG8+Ci08RGF0ZUNvbW1pdHRlZD4wMy8yMC8yMDAxPC9EYXRlQ29tbWl0dGVkPgotPE1vZGlmaWVkPmphdmEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoIFhOdW1iZXIuamF2YTwvTW9kaWZpZWQ+Ci08TG9nPkRvdWJsZS1zZW1pY29sb24gZml4ZWQgc28gSGVucmkncyBjb21waWxlciBzdG9wcyBjb21wbGFpbmluZyBhYm91dCBhbiAKLXVucmVhY2hhYmxlIHN0YXRlbWVudC4gJmx0O2dyaW4vJmd0OzwvTG9nPgotPC9Db21taXQ+Ci08L0NvbW1pdHM+CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL2NvbXBhdE92ZXJ2aWV3Lmh0bWwgYi9jb21wYXRfc3JjL2NvbXBhdE92ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNjQ4MTcuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9jb21wYXRPdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPEhUTUw+PEhFQUQ+PC9IRUFEPjxCT0RZPgotICAgIDxQPlRoaXMgY29tcGF0aWJpbGl0eSBBUEkgc3VwcG9ydHMgbGltaXRlZCB1c2Ugb2YgdGhlIFhhbGFuLUphdmEgMSBBUEkgaW4gdGhlIFhhbGFuLUphdmEgMiBlbnZpcm9ubWVudC4gRm9yIHRoZSBYYWxhbi1KYXZhIDIgQVBJLCBzZWUgPEEgaHJlZj0iLi4vYXBpZG9jcy9pbmRleC5odG1sIiB0YXJnZXQ9Il90b3AiPlhhbGFuLUphdmEgMiBBUEk8L0E+LjwvUD4KLSAgCi0gICAgIDxQPjxCPkJhc2ljIHByb2NlZHVyZSBmb3IgcGVyZm9ybWluZyB0cmFuc2Zvcm1hdGlvbnM6PC9CPjwvUD4KLSAgICA8T0w+Ci0gICAgICA8TEk+VXNlIG9uZSBvZiB0aGUge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yRmFjdG9yeX0gc3RhdGljIGdldFByb2Nlc3NvciBtZXRob2RzIHRvCi0gICAgICBpbnN0YW50aWF0ZSBhbiB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3J9LjxCUj48QlI+Ci0gICAgICAgVGhlIFhTTFQgYW5kIFhQYXRoIGVuZ2luZXMgYXJlIGluZGVwZW5kZW50IGZyb20gYW55IGdpdmVuIERPTSBvciBYTUwgaW1wbGVtZW50YXRpb24uIEFsbCBwYXJzZXItZGVwZW5kZW50Ci0gICAgICAgY2FsbHMgYXJlIGZ1bm5lbGVkIHRocm91Z2ggdGhlIHtAbGluayBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5YTUxQYXJzZXJMaWFpc29ufS48QlI+PEJSPjwvTEk+ICAgICAKLSAgICAgICA8TEk+U2V0IHVwIHtAbGluayBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVElucHV0U291cmNlfSBvYmplY3RzIGZvciB0aGUgWE1MIGlucHV0IGFuZCBYU0wgc3R5bGVzaGVldC4gCi0gICAgICAgWW91IGNhbiB1c2UgYSBmaWxlIG5hbWUgb3IgVVJMLCBjaGFyYWN0ZXIgc3RyZWFtLCBieXRlIHN0cmVhbSwgb3IgU0FYIGlucHV0IHN0cmVhbSB0byBpbnN0YW50aWF0ZSBhbgotICAgICAgIFhTTFRJbnB1dFNvdXJjZSBvYmplY3QuPEJSPjxCUj4KLSAgICAgICBJZiB0aGUgWE1MIGRvY3VtZW50IGNvbnRhaW5zIGEgc3R5bGVzaGVldCBQcm9jZXNzaW5nIEluc3RydWN0aW9uIChQSSksIHlvdSBkbyBub3QgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZQotICAgICAgIFhTTFRJbnB1dFNvdXJjZSBvYmplY3QgZm9yIGFuIFhTTCBzdHlsZXNoZWV0LjxCUj48QlI+Ci0gICAgICAgPEI+Tm90ZTo8L0I+IEZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSB3aXRoIGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9ucywgdXNlIHRoZSBYU0xUUHJvY2Vzc29yCi0gICAgICAgcHJvY2Vzc1N0eWxlc2hlZXQgbWV0aG9kIHRvIGNvbXBpbGUgdGhlIFhTTCBzdHlsZXNoZWV0LiBUaGUgcmVzdWx0IGlzIGEgCi0gICAgICAge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5TdHlsZXNoZWV0Um9vdH0gb2JqZWN0IHdpdGggaXRzIG93biBwcm9jZXNzKCkgbWV0aG9kIGZvciBwZXJmb3JtaW5nIHRyYW5zZm9ybWF0aW9ucy4KLSAgICAgICAgQ29tcGlsaW5nIHRoZSBzdHlsZXNoZWV0IGlzIGFsc28gdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gdGhlCi0gICAgICAgc3R5bGVzaGVldCBiZWZvcmUgdGhlIHRyYW5zZm9ybWF0aW9uIG9jY3Vycy4gWW91IGFsc28gbXVzdCBjb21waWxlIHRoZSBzdHlsZXNoZWV0IGlmIHlvdSBhcmUgdXNpbmcgdGhlCi0gICAgICAgIFhTTFRQcm9jZXNzb3IgYXMgYSBTQVggZG9jdW1lbnQgaGFuZGxlci48QlI+PEJSPjwvTEk+Ci0gICAgICAgPExJPlNldCB1cCBhbiB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRSZXN1bHRUYXJnZXR9IGZvciB0aGUgdHJhbnNmb3JtYXRpb24gb3V0cHV0LiBZb3UgY2FuIHVzZSBhCi0gICAgICAgZmlsZSBuYW1lIG9yIFVSTCwgY2hhcmFjdGVyIHN0cmVhbSwgYnl0ZSBzdHJlYW0sIG9yIFNBWCBkb2N1bWVudCBoYW5kbGVyIHRvIGluc3RhbnRpYXRlIGFuIFhTTFRSZXN1bHRUYXJnZXQKLSAgICAgICBvYmplY3QuPEJSPjxCUj48L0xJPgotICAgICAgIDxMST5Vc2UgdGhlIFhTTFRQcm9jZXNzb3Igb3IgKGlmIHlvdSBoYXZlIGNvbXBpbGVkIHRoZSBzdHlsZXNoZWV0KSB0aGUoQGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlN0eWxlc2hlZXRSb290fQotICAgICAgIHByb2Nlc3MgbWV0aG9kIHRvIHBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uLjxCUj48QlI+Ci0gICAgICAgIFhhbGFuLUphdmEgaXMgdGhyZWFkLXNhZmUgZm9yIG9uZSBpbnN0YW5jZSBwZXIgdGhyZWFkLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBzYW1lIGluc3RhbmNlIG9mIFhTTFRQcm9jZXNzb3IgdG8KLSAgICAgICAgIHBlcmZvcm0gbW9yZSB0aGFuIG9uZSB0cmFuc2Zvcm1hdGlvbiwgY2FsbCB0aGUgcmVzZXQgbWV0aG9kIGJldHdlZW4gdHJhbnNmb3JtYXRpb25zLjwvTEk+Ci0gICAgPC9PTD4KLSAgPC9CT0RZPjwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWEJvb2xlYW4uamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YQm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTM5NWJiLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YQm9vbGVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHBhdGg7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIFhQYXRoIGJvb2xlYW4gb2JqZWN0LCBhbmQgaXMgY2FwYWJsZSBvZiAKLSAqIGNvbnZlcnRpbmcgdGhlIGJvb2xlYW4gdG8gb3RoZXIgdHlwZXMsIHN1Y2ggYXMgYSBzdHJpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBYQm9vbGVhbiBleHRlbmRzIFhPYmplY3QKLXsKLSAgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhCb29sZWFuIG1feGJvb2xlYW47Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0IGEgWEJvb2xlYW4gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhCb29sZWFuKGJvb2xlYW4gYikKLSAgewotICAgIHN1cGVyKCk7IAotICAgICBtX3hib29sZWFuID0gbmV3IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YQm9vbGVhbihiKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlbGwgdGhhdCB0aGlzIGlzIGEgQ0xBU1NfQk9PTEVBTi4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gbV94Ym9vbGVhbi5nZXRUeXBlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHaXZlbiBhIHJlcXVlc3QgdHlwZSwgcmV0dXJuIHRoZSBlcXVpdmFsZW50IHN0cmluZy4gCi0gICAqIEZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKCkgLy8gUFI6RE1BTjRNQko0RCBTdWJtaXR0ZWQgYnk6PGdhcnlwQGZpcnN0ZWNoLmNvbT4gY2hhbmdlIHRvIHByb3RlY3RlZAotICB7Ci0gICAgcmV0dXJuIG1feGJvb2xlYW4uZ2V0VHlwZVN0cmluZygpOwotICB9Ci0gIAotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBudW0oKQotICB7Ci0gICAgcmV0dXJuIG1feGJvb2xlYW4ubnVtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgYm9vbGVhbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGJvb2woKQotICB7Ci0gICAgcmV0dXJuIG1feGJvb2xlYW4uYm9vbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgc3RyKCkKLSAgewotICAgIHJldHVybiBtX3hib29sZWFuLnN0cigpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIGEgamF2YSBvYmplY3QgdGhhdCdzIGNsb3NlcyB0byB0aGUgcmVwcmVzZW5hdGlvbiAKLSAgICogdGhhdCBzaG91bGQgYmUgaGFuZGVkIHRvIGFuIGV4dGVuc2lvbi4KLSAgICovCi0gIHB1YmxpYyBPYmplY3Qgb2JqZWN0KCkKLSAgewotICAgIHJldHVybiBtX3hib29sZWFuLm9iamVjdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlbGwgaWYgdHdvIG9iamVjdHMgYXJlIGZ1bmN0aW9uYWxseSBlcXVhbC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhYT2JqZWN0IG9iajIpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiwgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7ICAgIAotICAgIHJldHVybiBtX3hib29sZWFuLmVxdWFscyhvYmoyKTsKLSAgfQotICAKLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YQm9vbGVhblN0YXRpYy5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL1hCb29sZWFuU3RhdGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Mzk2ODcuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL1hCb29sZWFuU3RhdGljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAqIFRoaXMgY2xhc3MgZG9lc24ndCBoYXZlIGFueSBYUGF0aFN1cHBvcnQsIHNvIG92ZXJyaWRlIAotICogd2hhdGV2ZXIgdG8gZW5zdXJlIGl0IHdvcmtzIE9LLgotICovCi1wdWJsaWMgY2xhc3MgWEJvb2xlYW5TdGF0aWMgZXh0ZW5kcyBYQm9vbGVhbgotewotICBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWEJvb2xlYW5TdGF0aWMgbV94Ym9vbGVhbjsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBYTm9kZVNldCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWEJvb2xlYW5TdGF0aWMoYm9vbGVhbiBiKQotICB7Ci0gICAgc3VwZXIoYik7IAotICAgIG1feGJvb2xlYW4gPSBuZXcgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhCb29sZWFuU3RhdGljKGIpOwotICB9IAotICAKLSAgLyoqCi0gICAqIFRlbGwgaWYgdHdvIG9iamVjdHMgYXJlIGZ1bmN0aW9uYWxseSBlcXVhbC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhYT2JqZWN0IG9iajIpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiwgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG1feGJvb2xlYW4uZXF1YWxzKG9iajIpOwotICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL1hOb2RlU2V0LmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWE5vZGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5ZmZlZS4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWE5vZGVTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOwotaW1wb3J0IGphdmEudGV4dC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5Ob2RlU2V0OwotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gWFBhdGggbm9kZXNldCBvYmplY3QsIGFuZCBpcyBjYXBhYmxlIG9mIAotICogY29udmVydGluZyB0aGUgbm9kZXNldCB0byBvdGhlciB0eXBlcywgc3VjaCBhcyBhIHN0cmluZy4KLSAqLwotcHVibGljIGNsYXNzIFhOb2RlU2V0IGV4dGVuZHMgWE9iamVjdCAgCi17Ci0gIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YTm9kZVNldCBtX3hub2Rlc2V0OwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIFhOb2RlU2V0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYTm9kZVNldChOb2RlTGlzdCB2YWwpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIG1feG5vZGVzZXQgPSBuZXcgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOb2RlU2V0KG5ldyBOb2RlSXRlcmF0b3JXcmFwcGVyKHZhbCkpIDsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhbiBlbXB0eSBYTm9kZVNldCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWE5vZGVTZXQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBtX3hub2Rlc2V0ID0gbmV3IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YTm9kZVNldCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIFhOb2RlU2V0IG9iamVjdCBmb3Igb25lIG5vZGUuCi0gICAqLwotICBwdWJsaWMgWE5vZGVTZXQoTm9kZSBuKQotICB7Ci0gICAgc3VwZXIobik7IAotICAgIG1feG5vZGVzZXQgPSBuZXcgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOb2RlU2V0KG4pOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIFRlbGwgdGhhdCB0aGlzIGlzIGEgQ0xBU1NfTk9ERVNFVC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gbV94bm9kZXNldC5nZXRUeXBlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHaXZlbiBhIHJlcXVlc3QgdHlwZSwgcmV0dXJuIHRoZSBlcXVpdmFsZW50IHN0cmluZy4gCi0gICAqIEZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKCkgLy8gUFI6RE1BTjRNQko0RCBTdWJtaXR0ZWQgYnk6PGdhcnlwQGZpcnN0ZWNoLmNvbT4gY2hhbmdlIHRvIHByb3RlY3RlZAotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQuZ2V0VHlwZVN0cmluZygpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzdHJpbmcgY29udmVyc2lvbiBmcm9tIGEgc2luZ2xlIG5vZGUuCi0gICAqLwotICBkb3VibGUgZ2V0TnVtYmVyRnJvbU5vZGUoTm9kZSBuKQotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQuZ2V0TnVtYmVyRnJvbU5vZGUobik7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBudW0oKQotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQubnVtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgYm9vbGVhbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGJvb2woKQotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQuYm9vbCgpOwotICB9Ci0gIAotCi0gIC8qKgotICAgKiBHZXQgdGhlIHN0cmluZyBjb252ZXJzaW9uIGZyb20gYSBzaW5nbGUgbm9kZS4KLSAgICovCi0gIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nRnJvbU5vZGUoTm9kZSBuKQotICB7Ci0gICAgcmV0dXJuIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YTm9kZVNldC5nZXRTdHJpbmdGcm9tTm9kZShuKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cigpCi0gIHsKLSAgICByZXR1cm4gbV94bm9kZXNldC5zdHIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoWFBhdGhTdXBwb3J0IHN1cHBvcnQpCi0gIHsgICAgCi0gICAgcmV0dXJuIG1feG5vZGVzZXQucnRyZWUoKFhQYXRoQ29udGV4dCkgc3VwcG9ydCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSByZXN1bHQgdHJlZSBmcmFnbWVudC4KLSAgICoKLSAgICogQHBhcmFtIHN1cHBvcnQgVGhlIFhQYXRoIGNvbnRleHQgdG8gdXNlIGZvciB0aGUgY29udmVyc2lvbiAKLSAgICoKLSAgICogQHJldHVybiB0aGUgbm9kZXNldCBhcyBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoWFBhdGhDb250ZXh0IHN1cHBvcnQpCi0gIHsKLSAgICByZXR1cm4gbV94bm9kZXNldC5ydHJlZShzdXBwb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBub2RlbGlzdC4KLSAgICovCi0gIHB1YmxpYyBOb2RlSXRlcmF0b3Igbm9kZXNldCgpCi0gIHsKLSAgICByZXR1cm4gbV94bm9kZXNldC5ub2Rlc2V0KCk7Ci0gIH0gIAotCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBub2RlbGlzdC4KLSAgICovCi0gIHB1YmxpYyBOb2RlU2V0IG11dGFibGVOb2Rlc2V0KCkKLSAgewotICAgcmV0dXJuIG1feG5vZGVzZXQubXV0YWJsZU5vZGVzZXQoKTsKLSAgfSAgCi0gIAotICAvKioKLSAgICogVGVsbCBpZiBvbmUgb2JqZWN0IGlzIGxlc3MgdGhhbiB0aGUgb3RoZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBsZXNzVGhhbihYT2JqZWN0IG9iajIpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiwgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQubGVzc1RoYW4ob2JqMik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZWxsIGlmIG9uZSBvYmplY3QgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBvdGhlci4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGxlc3NUaGFuT3JFcXVhbChYT2JqZWN0IG9iajIpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiwgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQubGVzc1RoYW5PckVxdWFsKG9iajIpOwotICB9Ci0gIAotICAvKioKLSAgICogVGVsbCBpZiBvbmUgb2JqZWN0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgb3RoZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBncmVhdGVyVGhhbihYT2JqZWN0IG9iajIpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiwgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQuZ3JlYXRlclRoYW4ob2JqMik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZWxsIGlmIG9uZSBvYmplY3QgaXMgZ3JlYXRlciB0aGFuIHRoZSBvdGhlci4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdyZWF0ZXJUaGFuT3JFcXVhbChYT2JqZWN0IG9iajIpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiwgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG1feG5vZGVzZXQuZ3JlYXRlclRoYW5PckVxdWFsKG9iajIpOwotICB9ICAgCi0gIAotICAvKioKLSAgICogVGVsbCBpZiB0d28gb2JqZWN0cyBhcmUgZnVuY3Rpb25hbGx5IGVxdWFsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFhPYmplY3Qgb2JqMikKLSAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uLCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbV94bm9kZXNldC5lcXVhbHMob2JqMik7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIFRlbGwgaWYgdHdvIG9iamVjdHMgYXJlIGZ1bmN0aW9uYWxseSBub3QgZXF1YWwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBub3RFcXVhbHMoWE9iamVjdCBvYmoyKQotICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24sIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBtX3hub2Rlc2V0Lm5vdEVxdWFscyhvYmoyKTsKLSAgfSAgCi0gCi0gc3RhdGljIGNsYXNzIE5vZGVJdGVyYXRvcldyYXBwZXIgaW1wbGVtZW50cyBOb2RlSXRlcmF0b3IKLSAgewotCi0gICAgLyoqIFBvc2l0aW9uIG9mIG5leHQgbm9kZSAgICAgICAgICAqLwotICAgIHByaXZhdGUgaW50IG1fcG9zID0gMDsKLQotICAgIC8qKiBEb2N1bWVudCBmcmFnbWVudCBpbnN0YW5jZSB0aGlzIHdpbGwgd3JhcCAgICAgICAgICovCi0gICAgcHJpdmF0ZSBOb2RlTGlzdCBtX2xpc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBOb2RlSXRlcmF0b3JXcmFwcGVyCi0gICAgICoKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZiBEb2N1bWVudCBmcmFnbWVudCBpbnN0YW5jZSB0aGlzIHdpbGwgd3JhcAotICAgICAqLwotICAgIE5vZGVJdGVyYXRvcldyYXBwZXIoTm9kZUxpc3QgbGlzdCkKLSAgICB7Ci0gICAgICBtX2xpc3QgPSBsaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBUaGUgcm9vdCBub2RlIG9mIHRoZSBJdGVyYXRvciwgYXMgc3BlY2lmaWVkIHdoZW4gaXQgd2FzIGNyZWF0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSBnZXRSb290KCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhpcyBhdHRyaWJ1dGUgZGV0ZXJtaW5lcyB3aGljaCBub2RlIHR5cGVzIGFyZSBwcmVzZW50ZWQgdmlhIHRoZQotICAgICAqIGl0ZXJhdG9yLiBUaGUgYXZhaWxhYmxlIHNldCBvZiBjb25zdGFudHMgaXMgZGVmaW5lZCBpbiB0aGUKLSAgICAgKiA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEFsbCBub2RlIHR5cGVzCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRXaGF0VG9TaG93KCkKLSAgICB7Ci0gICAgICByZXR1cm4gTm9kZUZpbHRlci5TSE9XX0FMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIGZpbHRlciB1c2VkIHRvIHNjcmVlbiBub2Rlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBOb2RlRmlsdGVyIGdldEZpbHRlcigpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFRoZSB2YWx1ZSBvZiB0aGlzIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjaGlsZHJlbiBvZiBlbnRpdHkKLSAgICAgKiByZWZlcmVuY2Ugbm9kZXMgYXJlIHZpc2libGUgdG8gdGhlIGl0ZXJhdG9yLiBJZiBmYWxzZSwgdGhleSB3aWxsIGJlCi0gICAgICogc2tpcHBlZCBvdmVyLgotICAgICAqIDxicj4gVG8gcHJvZHVjZSBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzIGVudGl0eSByZWZlcmVuY2VzCi0gICAgICogZXhwYW5kZWQgYW5kIGRvZXMgbm90IGV4cG9zZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGl0c2VsZiwgdXNlIHRoZQotICAgICAqIHdoYXRUb1Nob3cgZmxhZ3MgdG8gaGlkZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGFuZCBzZXQKLSAgICAgKiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzIHRvIHRydWUgd2hlbiBjcmVhdGluZyB0aGUgaXRlcmF0b3IuIFRvIHByb2R1Y2UKLSAgICAgKiBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzIGVudGl0eSByZWZlcmVuY2Ugbm9kZXMgYnV0IG5vIGVudGl0eQotICAgICAqIGV4cGFuc2lvbiwgdXNlIHRoZSB3aGF0VG9TaG93IGZsYWdzIHRvIHNob3cgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZQotICAgICAqIGFuZCBzZXQgZXhwYW5kRW50aXR5UmVmZXJlbmNlcyB0byBmYWxzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBuZXh0IG5vZGUgaW4gdGhlIHNldCBhbmQgYWR2YW5jZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotICAgICAqIGl0ZXJhdG9yIGluIHRoZSBzZXQuIEFmdGVyIGEgTm9kZUl0ZXJhdG9yIGlzIGNyZWF0ZWQsIHRoZSBmaXJzdCBjYWxsCi0gICAgICogdG8gbmV4dE5vZGUoKSByZXR1cm5zIHRoZSBmaXJzdCBub2RlIGluIHRoZSBzZXQuCi0gICAgICogQHJldHVybiAgVGhlIG5leHQgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZCBvdmVyLCBvcgotICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbiB0aGF0IHNldC4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgotICAgICAqICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZQotICAgICAqICAgPGNvZGU+ZGV0YWNoPC9jb2RlPiBtZXRob2Qgd2FzIGludm9rZWQuCi0gICAgICovCi0gICAgcHVibGljIE5vZGUgbmV4dE5vZGUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uCi0gICAgewotCi0gICAgICBpZiAobV9wb3MgPCBtX2xpc3QuZ2V0TGVuZ3RoKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBtX2xpc3QuaXRlbShtX3BvcysrKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIHNldCBhbmQgbW92ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotICAgICAqIGl0ZXJhdG9yIGJhY2t3YXJkcyBpbiB0aGUgc2V0LgotICAgICAqIEByZXR1cm4gIFRoZSBwcmV2aW91cyA8Y29kZT5Ob2RlPC9jb2RlPiBpbiB0aGUgc2V0IGJlaW5nIGl0ZXJhdGVkIG92ZXIsCi0gICAgICogICBvcjxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBtb3JlIG1lbWJlcnMgaW4gdGhhdCBzZXQuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24KLSAgICAgKiAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUKLSAgICAgKiAgIDxjb2RlPmRldGFjaDwvY29kZT4gbWV0aG9kIHdhcyBpbnZva2VkLgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIHByZXZpb3VzTm9kZSgpIHRocm93cyBET01FeGNlcHRpb24KLSAgICB7Ci0KLSAgICAgIGlmIChtX3BvcyA+MCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbGlzdC5pdGVtKG1fcG9zLTEpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRGV0YWNoZXMgdGhlIGl0ZXJhdG9yIGZyb20gdGhlIHNldCB3aGljaCBpdCBpdGVyYXRlZCBvdmVyLCByZWxlYXNpbmcKLSAgICAgKiBhbnkgY29tcHV0YXRpb25hbCByZXNvdXJjZXMgYW5kIHBsYWNpbmcgdGhlIGl0ZXJhdG9yIGluIHRoZSBJTlZBTElECi0gICAgICogc3RhdGUuIEFmdGVyPGNvZGU+ZGV0YWNoPC9jb2RlPiBoYXMgYmVlbiBpbnZva2VkLCBjYWxscyB0bwotICAgICAqIDxjb2RlPm5leHROb2RlPC9jb2RlPiBvcjxjb2RlPnByZXZpb3VzTm9kZTwvY29kZT4gd2lsbCByYWlzZSB0aGUKLSAgICAgKiBleGNlcHRpb24gSU5WQUxJRF9TVEFURV9FUlIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGV0YWNoKCl7fQotICB9Ci0gIAotCi19CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWE51bGwuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YTnVsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzNhNjU4Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YTnVsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHBhdGg7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIFhQYXRoIG51bGwgb2JqZWN0LCBhbmQgaXMgY2FwYWJsZSBvZiAKLSAqIGNvbnZlcnRpbmcgdGhlIG51bGwgdG8gb3RoZXIgdHlwZXMsIHN1Y2ggYXMgYSBzdHJpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTnVsbCBleHRlbmRzIFhPYmplY3QKLXsKLSAgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOdWxsIG1feG51bGw7Ci0gIC8qKgotICAgKiBDcmVhdGUgYW4gWE9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYTnVsbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIG1feG51bGwgPSBuZXcgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOdWxsKCkgOwotICB9Ci0gIAotICAvKioKLSAgICogVGVsbCB3aGF0IGtpbmQgb2YgY2xhc3MgdGhpcyBpcy4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gbV94bnVsbC5nZXRUeXBlKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSByZXF1ZXN0IHR5cGUsIHJldHVybiB0aGUgZXF1aXZhbGVudCBzdHJpbmcuIAotICAgKiBGb3IgZGlhZ25vc3RpYyBwdXJwb3Nlcy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZygpIC8vIFBSOkRNQU40TUJKNEQgU3VibWl0dGVkIGJ5OjxnYXJ5cEBmaXJzdGVjaC5jb20+IGNoYW5nZSB0byBwcm90ZWN0ZWQKLSAgewotICAgIHJldHVybiBtX3hudWxsLmdldFR5cGVTdHJpbmcoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgbnVtKCkKLSAgewotICAgIHJldHVybiBtX3hudWxsLm51bSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIGJvb2xlYW4uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBib29sKCkKLSAgewotICAgIHJldHVybiBtX3hudWxsLmJvb2woKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cigpCi0gIHsKLSAgICByZXR1cm4gbV94bnVsbC5zdHIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoWFBhdGhTdXBwb3J0IHN1cHBvcnQpCi0gIHsKLSAgICByZXR1cm4gbV94bnVsbC5ydHJlZSgoWFBhdGhDb250ZXh0KXN1cHBvcnQpOwotICB9Ci0gIAotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgcmVzdWx0IHRyZWUgZnJhZ21lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBzdXBwb3J0IFhQYXRoIGNvbnRleHQgdG8gdXNlIGZvciB0aGUgY29udmVyc2lvbgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgYXMgYSByZXN1bHQgdHJlZSBmcmFnbWVudC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudEZyYWdtZW50IHJ0cmVlKFhQYXRoQ29udGV4dCBzdXBwb3J0KQotICB7Ci0gICAgcmV0dXJuIG1feG51bGwucnRyZWUoc3VwcG9ydCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBub2RlbGlzdC4KLSAgICovCi0gIHB1YmxpYyBOb2RlSXRlcmF0b3Igbm9kZXNldCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi0gICAKLSAgLyoqCi0gICAqIFRlbGwgaWYgdHdvIG9iamVjdHMgYXJlIGZ1bmN0aW9uYWxseSBlcXVhbC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhYT2JqZWN0IG9iajIpCi0gIHsKLSAgICByZXR1cm4gbV94bnVsbC5lcXVhbHMob2JqMik7Ci0gIH0KLQotICAKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YTnVtYmVyLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWE51bWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjhlMjg2Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7Ci0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBYUGF0aCBudW1iZXIsIGFuZCBpcyBjYXBhYmxlIG9mIAotICogY29udmVydGluZyB0aGUgbnVtYmVyIHRvIG90aGVyIHR5cGVzLCBzdWNoIGFzIGEgc3RyaW5nLgotICovCi1wdWJsaWMgY2xhc3MgWE51bWJlciBleHRlbmRzIFhPYmplY3QKLXsKLSAgCi0gIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YTnVtYmVyIG1feG51bWJlcjsKLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIFhOb2RlU2V0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYTnVtYmVyKGRvdWJsZSBkKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBtX3hudW1iZXIgPSBuZXcgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOdW1iZXIoZCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZWxsIHRoYXQgdGhpcyBpcyBhIENMQVNTX05VTUJFUi4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gbV94bnVtYmVyLmdldFR5cGUoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdpdmVuIGEgcmVxdWVzdCB0eXBlLCByZXR1cm4gdGhlIGVxdWl2YWxlbnQgc3RyaW5nLiAKLSAgICogRm9yIGRpYWdub3N0aWMgcHVycG9zZXMuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVTdHJpbmcoKSAvLyBQUjpETUFONE1CSjREIFN1Ym1pdHRlZCBieTo8Z2FyeXBAZmlyc3RlY2guY29tPiBjaGFuZ2UgdG8gcHJvdGVjdGVkCi0gIHsKLSAgICByZXR1cm4gbV94bnVtYmVyLmdldFR5cGVTdHJpbmcoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgbnVtKCkKLSAgewotICAgIHJldHVybiBtX3hudW1iZXIubnVtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgYm9vbGVhbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGJvb2woKQotICB7Ci0gICAgcmV0dXJuIG1feG51bWJlci5ib29sKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cigpCi0gIHsKLSAgICByZXR1cm4gbV94bnVtYmVyLnN0cigpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIGEgamF2YSBvYmplY3QgdGhhdCdzIGNsb3NlcyB0byB0aGUgcmVwcmVzZW5hdGlvbiAKLSAgICogdGhhdCBzaG91bGQgYmUgaGFuZGVkIHRvIGFuIGV4dGVuc2lvbi4KLSAgICovCi0gIHB1YmxpYyBPYmplY3Qgb2JqZWN0KCkKLSAgewotICAgIHJldHVybiBtX3hudW1iZXIub2JqZWN0KCk7Ci0gIH0KLQotICAvKioKLSAgICogVGVsbCBpZiB0d28gb2JqZWN0cyBhcmUgZnVuY3Rpb25hbGx5IGVxdWFsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFhPYmplY3Qgb2JqMikKLSAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uLCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbV94bnVtYmVyLmVxdWFscyhvYmoyKTsKLSAgfQotICAKLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YT2JqZWN0LmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGNiMzNlLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHBhdGg7Ci0KLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIFhQYXRoIG9iamVjdCwgYW5kIGlzIGNhcGFibGUgb2YgCi0gKiBjb252ZXJ0aW5nIHRoZSBvYmplY3QgdG8gdmFyaW91cyB0eXBlcywgc3VjaCBhcyBhIHN0cmluZy4KLSAqIFRoaXMgY2xhc3MgYWN0cyBhcyB0aGUgYmFzZSBjbGFzcyB0byBvdGhlciBYUGF0aCB0eXBlIG9iamVjdHMsIAotICogc3VjaCBhcyBYU3RyaW5nLCBhbmQgcHJvdmlkZXMgcG9seW1vcnBoaWMgY2FzdGluZyBjYXBhYmlsaXRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYT2JqZWN0IGV4dGVuZHMgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3QKLXsKLSAgCi0gIAotICAvKioKLSAgICogQ3JlYXRlIGFuIFhPYmplY3QuCi0gICAqLwotICBwdWJsaWMgWE9iamVjdCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBYT2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhPYmplY3QoT2JqZWN0IG9iaikKLSAgewotICAgIHN1cGVyKG9iaik7Ci0gIH0gICAKLQotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL1hQYXRoU3VwcG9ydC5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL1hQYXRoU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTk4NzA4Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YUGF0aFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotCi0KLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KLSAqIFByb3ZpZGVzIGJhc2ljIHN1cHBvcnQgZm9yIGluZGVwZW5kZW50IHVzZSBvZiBYUGF0aC4gIFRoaXMgaW50ZXJmYWNlIAotICogaXMgdXNlZCBpbiBvcmRlciB0aGF0IHRoZXJlIG1heSBiZSBsb29zZSBjb3VwbGluZyBiZXR3ZWVuIHRoZSAKLSAqIFhQYXRoIHBhY2thZ2UgYW5kIHRoZSBzdXBwb3J0IHNlcnZpY2VzLCBzdWNoIGFzIHRoZSB2YXJpYWJsZSBzdG9yZSwgCi0gKiBwYXJzZXIgc2VydmljZXMsIERPTSBpbXBsZW1lbnRhdGlvbiwgZXRjLiAgTW9zdCBpZiBhbGwgaW1wbGVtZW50YXRpb25zCi0gKiBvZiB0aGlzIHNob3VsZCBkZXJpdmUgZnJvbSBYUGF0aFN1cHBvcnREZWZhdWx0IChoZW5jZSwgaXQgc2hvdWxkIAotICogcHJvYmFibHkgYmUgYW4gYWJzdHJhY3QgY2xhc3MgaW5zdGVhZCBvZiBhbiBpbnRlcmZhY2UpLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhQYXRoU3VwcG9ydCBleHRlbmRzIG9yZy5hcGFjaGUueGFsYW4uZXh0ZW5zaW9ucy5FeHByZXNzaW9uQ29udGV4dAotewotICAKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YUGF0aFN1cHBvcnREZWZhdWx0LmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWFBhdGhTdXBwb3J0RGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjkxZDE5Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YUGF0aFN1cHBvcnREZWZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotCi0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImFkdmFuY2VkIi8+Ci0gKiBEZWZhdWx0IGNsYXNzIGZvciBleGVjdXRpb24gY29udGV4dCB3aGVuIFhQYXRoIGlzIHVzZWQgYnkgaXRzZWxmLiBNYW55IAotICogb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGNsYXNzIG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpbiBvcmRlciB0byAKLSAqIHBlcmZvcm0gY29ycmVjdCBleGVjdXRpb24gb2YgdGhlIFhQYXRoIChmb3IgaW5zdGFuY2UsIHZhcmlhYmxlIAotICogZXhlY3V0aW9uKS4gIFRoaXMgY2xhc3Mgd2lsbCBsaWtlbHkgZXZlbnR1YWxseSByZXBsYWNlIFhNTFBhcnNlckxpYWlzb25zLgotICovCi1wdWJsaWMgY2xhc3MgWFBhdGhTdXBwb3J0RGVmYXVsdCBleHRlbmRzIG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0IGltcGxlbWVudHMgWFBhdGhTdXBwb3J0IAotewotICAKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YUlRyZWVGcmFnLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWFJUcmVlRnJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDhjZjE4Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YUlRyZWVGcmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBYUGF0aCByZXN1bHQgdHJlZSBmcmFnbWVudCBvYmplY3QsIGFuZCBpcyBjYXBhYmxlIG9mIAotICogY29udmVydGluZyB0aGUgUlRGIHRvIG90aGVyIHR5cGVzLCBzdWNoIGFzIGEgc3RyaW5nLgotICovCi1wdWJsaWMgY2xhc3MgWFJUcmVlRnJhZyBleHRlbmRzIFhPYmplY3QgCi17IAotICAKLSAgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhSVHJlZUZyYWcgbV94cnRyZWVmcmFnOwotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBYT2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhSVHJlZUZyYWcoRG9jdW1lbnRGcmFnbWVudCBmcmFnKQotICB7Ci0gICAgc3VwZXIoZnJhZyk7Ci0gICAgbV94cnRyZWVmcmFnID0gbmV3IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YUlRyZWVGcmFnKGZyYWcpOyAKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlbGwgd2hhdCBraW5kIG9mIGNsYXNzIHRoaXMgaXMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIG1feHJ0cmVlZnJhZy5nZXRUeXBlKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSByZXF1ZXN0IHR5cGUsIHJldHVybiB0aGUgZXF1aXZhbGVudCBzdHJpbmcuIAotICAgKiBGb3IgZGlhZ25vc3RpYyBwdXJwb3Nlcy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZygpIC8vIFBSOkRNQU40TUJKNEQgU3VibWl0dGVkIGJ5OjxnYXJ5cEBmaXJzdGVjaC5jb20+IGNoYW5nZSB0byBwcm90ZWN0ZWQKLSAgewotICAgIHJldHVybiBtX3hydHJlZWZyYWcuZ2V0VHlwZVN0cmluZygpOwotICB9Ci0gIAotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBudW0oKQotICB7ICAgIAotICAgIHJldHVybiBtX3hydHJlZWZyYWcubnVtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgYm9vbGVhbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGJvb2woKQotICB7Ci0gICAgcmV0dXJuIG1feHJ0cmVlZnJhZy5ib29sKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBzdHIoKQotICB7Ci0gICAgcmV0dXJuIG1feHJ0cmVlZnJhZy5zdHIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoKQotICB7Ci0gICAgcmV0dXJuIG1feHJ0cmVlZnJhZy5ydHJlZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgbm9kZWxpc3QuIChzcGVjaWFsIGZ1bmN0aW9uKS4KLSAgICovCi0gIHB1YmxpYyBOb2RlTGlzdCBjb252ZXJ0VG9Ob2Rlc2V0KCkKLSAgewotICAgIHJldHVybiBtX3hydHJlZWZyYWcuY29udmVydFRvTm9kZXNldCgpOwotICB9ICAKLSAgCi0gIC8qKgotICAgKiBUZWxsIGlmIHR3byBvYmplY3RzIGFyZSBmdW5jdGlvbmFsbHkgZXF1YWwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE9iamVjdCBvYmoyKQotICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24sIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgeyAgIAotICAgICAgcmV0dXJuIG1feHJ0cmVlZnJhZy5lcXVhbHMob2JqMik7ICAgIAotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YU3RyaW5nLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgvWFN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDJkYzZlLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgIAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoOwotCi0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7Ci0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gWFBhdGggc3RyaW5nIG9iamVjdCwgYW5kIGlzIGNhcGFibGUgb2YgCi0gKiBjb252ZXJ0aW5nIHRoZSBzdHJpbmcgdG8gb3RoZXIgdHlwZXMsIHN1Y2ggYXMgYSBudW1iZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU3RyaW5nIGV4dGVuZHMgWE9iamVjdAotewotICAKLSAgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhTdHJpbmcgbV94c3RyaW5nOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIFhTdHJpbmcgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhTdHJpbmcoU3RyaW5nIHZhbCkKLSAgewotICAgIHN1cGVyKHZhbCk7Ci0gICAgbV94c3RyaW5nID0gbmV3IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YU3RyaW5nKHZhbCk7Ci0gIH0KLSAgCi0gICAvKioKLSAgICogVGVsbCB0aGF0IHRoaXMgaXMgYSBDTEFTU19TVFJJTkcuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIG1feHN0cmluZy5nZXRUeXBlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHaXZlbiBhIHJlcXVlc3QgdHlwZSwgcmV0dXJuIHRoZSBlcXVpdmFsZW50IHN0cmluZy4gCi0gICAqIEZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKCkgLy8gUFI6RE1BTjRNQko0RCBTdWJtaXR0ZWQgYnk6PGdhcnlwQGZpcnN0ZWNoLmNvbT4gY2hhbmdlIHRvIHByb3RlY3RlZAotICB7Ci0gICAgcmV0dXJuIG1feHN0cmluZy5nZXRUeXBlU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDYXN0IGEgc3RyaW5nIHRvIGEgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBkb3VibGUgY2FzdFRvTnVtKFN0cmluZyBzKQotICB7ICAKLSAgICByZXR1cm4gb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhTdHJpbmcuY2FzdFRvTnVtKHMpOyAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgbnVtKCkKLSAgewotICAgIHJldHVybiBtX3hzdHJpbmcubnVtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgYm9vbGVhbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGJvb2woKQotICB7Ci0gICAgcmV0dXJuIG1feHN0cmluZy5ib29sKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBzdHIoKQotICB7Ci0gICAgcmV0dXJuIG1feHN0cmluZy5zdHIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoWFBhdGhTdXBwb3J0IHN1cHBvcnQpCi0gIHsgICAgCi0gICAgcmV0dXJuIG1feHN0cmluZy5ydHJlZSgoWFBhdGhDb250ZXh0KXN1cHBvcnQpOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKgotICAgKiBAcGFyYW0gc3VwcG9ydCBYcGF0aCBjb250ZXh0IHRvIHVzZSBmb3IgdGhlIGNvbnZlcnNpb24gCi0gICAqCi0gICAqIEByZXR1cm4gQSBkb2N1bWVudCBmcmFnbWVudCB3aXRoIHRoaXMgc3RyaW5nIGFzIGEgY2hpbGQgbm9kZQotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoWFBhdGhDb250ZXh0IHN1cHBvcnQpCi0gIHsgICAgICAKLSAgICByZXR1cm4gbV94c3RyaW5nLnJ0cmVlKHN1cHBvcnQpOwotICB9Ci0gIAotICAvKioKLSAgICogVGVsbCBpZiB0d28gb2JqZWN0cyBhcmUgZnVuY3Rpb25hbGx5IGVxdWFsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFhPYmplY3Qgb2JqMikKLSAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uLCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbV94c3RyaW5nLmVxdWFscyhvYmoyKTsKLSAgfQotCi0gIAotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3BhY2thZ2UuaHRtbCBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTU1ZGEuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPEhUTUw+PEhFQUQ+PC9IRUFEPjxCT0RZPgotICAgICA8UD5JbmZyYXN0cnVjdHVyZSBmb3IgcHJvY2Vzc2luZyBYUEFUSCBleHByZXNzaW9uczwvUD4KLSAgIAotICAgICA8UD48L1A+Ci0gICA8L0JPRFk+PC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94ZG9tL1hlcmNlc0xpYWlzb24uamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94ZG9tL1hlcmNlc0xpYWlzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyMjc5Ni4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveGRvbS9YZXJjZXNMaWFpc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueGRvbTsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS4qOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5yZXMuWFBBVEhFcnJvclJlc291cmNlczsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnJlcy5YU0xNZXNzYWdlczsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLQotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBQcm92aWRlcyBYU0xUUHJvY2Vzc29yIGFuIGludGVyZmFjZSB0byB0aGUgWGVyY2VzIFhNTCBwYXJzZXIuICBUaGlzIAotICogbGlhaXNvbiBzaG91bGQgYmUgdXNlZCBpZiBYZXJjZXMgRE9NIG5vZGVzIGFyZSBiZWluZyBwcm9jZXNzIGFzIAotICogdGhlIHNvdXJjZSB0cmVlIG9yIGFzIHRoZSByZXN1bHQgdHJlZS4KLSAqIEBzZWUgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3IKLSAqIEBzZWUgb3JnLmFwYWNoZS54bWwucGFyc2VycwotICovCi1wdWJsaWMgY2xhc3MgWGVyY2VzTGlhaXNvbiBleHRlbmRzIFhNTFBhcnNlckxpYWlzb25EZWZhdWx0IC8vaW1wbGVtZW50cyBYUGF0aFN1cHBvcnQKLXsKLSAgLyoqCi0gICAqIFJldHVybiBhIHN0cmluZyBzdWl0aWJsZSBmb3IgdGVsbGluZyB0aGUgdXNlciB3aGF0IHBhcnNlciBpcyBiZWluZyB1c2VkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXJzZXJEZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIlhNTDRKIFZlcnNpb24gIisgZ2V0WE1MNEpWZXJzaW9uU3RyaW5nKCk7Ci0gIH0KLQotCXByaXZhdGUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyIG1fZXJyb3JIYW5kbGVyOwotICAvKioKLSAgICogQ29uc3RydWN0b3IgdGhhdCB0YWtlcyBTQVggRXJyb3JIYW5kbGVyIGFzIGFuIGFyZ3VtZW50LiBUaGUgZXJyb3IgaGFuZGxlcgotICAgKiBpcyByZWdpc3RlcmVkIHdpdGggdGhlIFhNTCBQYXJzZXIuIEFueSBYTUwtcmVsYXRlZCBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZAotICAgKiB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiB1c2luZyB0aGlzIGVycm9yIGhhbmRsZXIuCi0gICAqCi0gICAqIEBwYXJhbQllcnJvckhhbmRsZXIgU0FYIEVycm9ySGFuZGxlciBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBYZXJjZXNMaWFpc29uKG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpCi0gIHsKLSAgICBtX2Vycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2UuCi0gICAqCi0gIHB1YmxpYyBYZXJjZXNMaWFpc29uKFhQYXRoRW52U3VwcG9ydCBlbnZTdXBwb3J0KQotICB7Ci0gICAgbV9lbnZTdXBwb3J0ID0gZW52U3VwcG9ydDsKLSAgfSovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBYZXJjZXNMaWFpc29uKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBDaGVjayBub2RlIHRvIHNlZSBpZiBpdCBtYXRjaGVzIHRoaXMgbGlhaXNvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNoZWNrTm9kZShOb2RlIG5vZGUpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gIHsKLSAgICBpZighKG5vZGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhlcmNlcy5kb20uTm9kZUltcGwpKQotICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKFhTTE1lc3NhZ2VzLmNyZWF0ZVhQQVRITWVzc2FnZShYUEFUSEVycm9yUmVzb3VyY2VzLkVSX1hFUkNFU19DQU5OT1RfSEFORExFX05PREVTLCBuZXcgT2JqZWN0W117KChPYmplY3Qpbm9kZSkuZ2V0Q2xhc3MoKX0pKTsgLy8iWGVyY2VzTGlhaXNvbiBjYW4gbm90IGhhbmRsZSBub2RlcyBvZiB0eXBlIgotICAgICAgICAvLysoKE9iamVjdClub2RlKS5nZXRDbGFzcygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgc3VwcG9ydAotICAgKiB0aGUgU0FYIERvY3VtZW50SGFuZGxlciBpbnRlcmZhY2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NBWCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogR2V0IFhlcmNlcyB2ZXJzaW9uIGZpZWxkLi4uIHdlIGhhdmUgdG8gZG8gdGhpcyAnY2F1c2UKLSAgICogdGhlICJwdWJsaWMgc3RhdGljIGZpbmFsIiBmaWVsZHMgc2VlbSB0byBnZXQgYm91bmQKLSAgICogYXQgY29tcGlsZSB0aW1lIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldFhNTDRKVmVyc2lvblN0cmluZygpCi0gIHsKLSAgICAvLyByZXR1cm4gVmVyc2lvbi5mVmVyc2lvbjsKLSAgICBTdHJpbmcgdmVyc2lvbiA9ICIiOwotICAgIHRyeQotICAgIHsKLSAgICAgIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIHZlcnNpb25GaWVsZCA9IFZlcnNpb24uY2xhc3MuZ2V0RmllbGQoImZWZXJzaW9uIik7Ci0gICAgICB2ZXJzaW9uID0gKFN0cmluZyl2ZXJzaW9uRmllbGQuZ2V0KG51bGwpOwotICAgIH0KLSAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiB2ZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBHZXQgb25lIG9mIHRoZSBYZXJjZXMgdmVyc2lvbiBudW1iZXJzLi4uCi0gICAqIHdlIGhhdmUgdG8gZG8gdGhpcyAnY2F1c2UgdGhlICJwdWJsaWMgc3RhdGljIGZpbmFsIgotICAgKiBmaWVsZHMgc2VlbSB0byBnZXQgYm91bmQgYXQgY29tcGlsZSB0aW1lIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgaW50IGdldFhNTDRKVmVyc2lvbk51bShpbnQgZmllbGQpCi0gIHsKLSAgICBpbnQgdmVyc2lvbk51bSA9IDA7Ci0gICAgU3RyaW5nIHZlciA9IGdldFhNTDRKVmVyc2lvblN0cmluZygpOwotICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZlciwgIiAuIik7Ci0gICAgZm9yKGludCBpID0gMDsgdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyB0b2sgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICBpZihmaWVsZCA9PSBpKQotICAgICAgewotICAgICAgICB2ZXJzaW9uTnVtID0gSW50ZWdlci5wYXJzZUludCh0b2spOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdmVyc2lvbk51bTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBvb2wgdGhlIERPTSBwYXJzZXJzIGZvciByZXVzZS4KLSAgICoKLSAgcHJpdmF0ZSBPYmplY3RQb29sIG1fZG9tUGFyc2VyUG9vbCA9IG5ldyBPYmplY3RQb29sKERPTVBhcnNlci5jbGFzcyk7Ci0gIAotICAvKioKLSAgICogUG9vbCB0aGUgU0FYIHBhcnNlcnMgZm9yIHJldXNlLgotICAgKgotICBwcml2YXRlIE9iamVjdFBvb2wgbV9zYXhQYXJzZXJQb29sID0gbmV3IE9iamVjdFBvb2woU0FYUGFyc2VyLmNsYXNzKTsKLSAKLSAgLyoqCi0gICAqIENvdW50IHRoZSBwYXJzZXMgc2luY2UgdGhlIGxhc3QgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgR0MgZXZlcnkgCi0gICAqIDEwIHBhcnNlcyBvciBzby4gIChUaGlzIG1pZ2h0IGJlIGEgYmFkIGlkZWEsIGJ1dCBpdCBzZWVtcyB0byAKLSAgICogaGVscC4uLikKLSAgICoKLSAgcHJvdGVjdGVkIGludCBtX3BhcnNlQ291bnRTaW5jZUdDID0gMDsKLSovCi0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBQYXJzZSBhbiBYTUwgZG9jdW1lbnQuCi0gICAqCi0gICAqIDxwPlRoZSBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGluc3RydWN0IHRoZSBTQVggcGFyc2VyCi0gICAqIHRvIGJlZ2luIHBhcnNpbmcgYW4gWE1MIGRvY3VtZW50IGZyb20gYW55IHZhbGlkIGlucHV0Ci0gICAqIHNvdXJjZSAoYSBjaGFyYWN0ZXIgc3RyZWFtLCBhIGJ5dGUgc3RyZWFtLCBvciBhIFVSSSkuPC9wPgotICAgKgotICAgKiA8cD5BcHBsaWNhdGlvbnMgbWF5IG5vdCBpbnZva2UgdGhpcyBtZXRob2Qgd2hpbGUgYSBwYXJzZSBpcyBpbgotICAgKiBwcm9ncmVzcyAodGhleSBzaG91bGQgY3JlYXRlIGEgbmV3IFBhcnNlciBpbnN0ZWFkIGZvciBlYWNoCi0gICAqIGFkZGl0aW9uYWwgWE1MIGRvY3VtZW50KS4gIE9uY2UgYSBwYXJzZSBpcyBjb21wbGV0ZSwgYW4KLSAgICogYXBwbGljYXRpb24gbWF5IHJldXNlIHRoZSBzYW1lIFBhcnNlciBvYmplY3QsIHBvc3NpYmx5IHdpdGggYQotICAgKiBkaWZmZXJlbnQgaW5wdXQgc291cmNlLjwvcD4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZSBUaGUgaW5wdXQgc291cmNlIGZvciB0aGUgdG9wLWxldmVsIG9mIHRoZQotICAgKiAgICAgICAgWE1MIGRvY3VtZW50LgotICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKLSAgICogICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KLSAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uIEFuIElPIGV4Y2VwdGlvbiBmcm9tIHRoZSBwYXJzZXIsCi0gICAqICAgICAgICAgICAgcG9zc2libHkgZnJvbSBhIGJ5dGUgc3RyZWFtIG9yIGNoYXJhY3RlciBzdHJlYW0KLSAgICogICAgICAgICAgICBzdXBwbGllZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICAqIEBzZWUgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UKLSAgICogQHNlZSAjcGFyc2UoamF2YS5sYW5nLlN0cmluZykKLSAgICogQHNlZSAjc2V0RW50aXR5UmVzb2x2ZXIKLSAgICogQHNlZSAjc2V0RFRESGFuZGxlcgotICAgKiBAc2VlICNzZXREb2N1bWVudEhhbmRsZXIKLSAgICogQHNlZSAjc2V0RXJyb3JIYW5kbGVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZSAoSW5wdXRTb3VyY2Ugc291cmNlKQotICAgIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gIHsKLSAgIHRyeQotICAgIHsKLQotICAgICAgLy8gSSBndWVzcyBJIHNob3VsZCB1c2UgSkFYUCBmYWN0b3J5IGhlcmUuLi4gd2hlbiBpdCdzIGxlZ2FsLgotICAgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5ET01QYXJzZXIgcGFyc2VyIAotICAgICAgLy8gID0gbmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRE9NUGFyc2VyKCk7Ci0gICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJ1aWxkZXJGYWN0b3J5ID0KLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICBidWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsgICAgICAKLQotICAgICAgRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJaWYgKG1fZXJyb3JIYW5kbGVyID09IG51bGwpCi0JCQkJcGFyc2VyLnNldEVycm9ySGFuZGxlcihuZXcgb3JnLmFwYWNoZS54bWwudXRpbHMuRGVmYXVsdEVycm9ySGFuZGxlcigpKTsKLQkJCWVsc2UKLQkJCQlwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKG1fZXJyb3JIYW5kbGVyKTsKLQotICAgICAgLy8gaWYobnVsbCAhPSBtX2VudGl0eVJlc29sdmVyKQotICAgICAgLy8gewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJTZXR0aW5nIHRoZSBlbnRpdHkgcmVzb2x2ZXIuIik7Ci0gICAgICAvLyAgcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKG1fZW50aXR5UmVzb2x2ZXIpOwotICAgICAgLy8gfQotICAgICAgc2V0RG9jdW1lbnQocGFyc2VyLnBhcnNlKHNvdXJjZSkpOwotICAgIH0KLSAgICBjYXRjaCAob3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHNlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihzZSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24ocGNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oaW9lKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNvcHlGcm9tT3RoZXJMaWFpc29uKFhNTFBhcnNlckxpYWlzb25EZWZhdWx0IGZyb20pCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgLy9zdXBlci5jb3B5RnJvbU90aGVyTGlhaXNvbihmcm9tKTsKLSAgICBpZihudWxsICE9IGZyb20pIC8vIGRlZmVuc2l2ZQotICAgIHsKLSAgICAgIGlmKGZyb20gaW5zdGFuY2VvZiBYZXJjZXNMaWFpc29uKQotICAgICAgICB0aGlzLm1fdXNlRE9NMmdldE5hbWVzcGFjZVVSSSA9ICgoWGVyY2VzTGlhaXNvbilmcm9tKS5tX3VzZURPTTJnZXROYW1lc3BhY2VVUkk7Ci0gICAgfQotIH0KLQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gZW1wdHkgRE9NIERvY3VtZW50LiAgTWFpbmx5IHVzZWQgZm9yIGNyZWF0aW5nIGFuCi0gICAqIG91dHB1dCBkb2N1bWVudC4gIEltcGxlbWVudGF0aW9uIG9mIFhNTFBhcnNlckxpYWlzb24KLSAgICogaW50ZXJmYWNlIG1ldGhvZC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpCi0gIHsKLSAgICBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsIGRvYyA9IG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsKCk7Ci0gICAgcmV0dXJuIGRvYzsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhbiBJRCwgcmV0dXJuIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEJ5SUQoU3RyaW5nIGlkLCBEb2N1bWVudCBkb2MpCi0gIHsKLSAgICByZXR1cm4gKChEb2N1bWVudEltcGwpZG9jKS5nZXRJZGVudGlmaWVyKGlkKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZWxsIGlmIHRoZSBub2RlIGlzIGlnbm9yYWJsZSB3aGl0ZXNwYWNlLgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGVXaGl0ZXNwYWNlKFRleHQgbm9kZSkKLSAgewotICAgIGJvb2xlYW4gaXNJZ25vcmFibGU7Ci0gICAgaWYoIG5vZGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhlcmNlcy5kb20uVGV4dEltcGwpCi0gICAgewotICAgICAgaXNJZ25vcmFibGUgPSAoKG9yZy5hcGFjaGUueGVyY2VzLmRvbS5UZXh0SW1wbClub2RlKS5pc0lnbm9yYWJsZVdoaXRlc3BhY2UoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlzSWdub3JhYmxlID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBpc0lnbm9yYWJsZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbV91c2VET00yZ2V0TmFtZXNwYWNlVVJJID0gdHJ1ZTsKLSAgCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciBvciBub3QgZ2V0TmFtZXNwYWNlT2ZOb2RlIHNob3VsZCB1c2UgdGhlIFhlcmNlcy9ET00yCi0gICAqIGdldE5hbWVzcGFjZVVSSS4gIFRoaXMgaGFzIHRvIGJlIHNldCB0byB0cnVlIGlmIHRoZSAKLSAgICogaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMgaXMgc2V0IHRvIGZhbHNlLCBvciBpZiAKLSAgICogdGhlIHRyZWUgaXMgbXV0YXRlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVzZURPTTJnZXROYW1lc3BhY2VVUkkoYm9vbGVhbiBiKQotICB7Ci0gICAgbV91c2VET00yZ2V0TmFtZXNwYWNlVVJJID0gYjsKLSAgfQotCi0gIAotICAvKioKLSAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG5vZGUuICBDYWxscyBvcmcuYXBhY2hlLnhlcmNlcy5kb20uTm9kZUltcGwncwotICAgKiBnZXROYW1lc3BhY2VVUkkoKSBpZiBzZXRVc2VET00yZ2V0TmFtZXNwYWNlVVJJKHRydWUpIGhhcyBiZWVuIGNhbGxlZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlT2ZOb2RlKE5vZGUgbikKLSAgewotICAgIHJldHVybihtX3VzZURPTTJnZXROYW1lc3BhY2VVUkkpID8KLSAgICAgICAgICAoKG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Ob2RlSW1wbCluKS5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgIDogc3VwZXIuZ2V0TmFtZXNwYWNlT2ZOb2RlKG4pOwotICB9Ci0gIAotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGdpdmVuIG5vZGUuCi0gICovCi0gIC8vIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lT2ZOb2RlKE5vZGUgbikKLSAgLy8gewotICAvLyAgIHJldHVybiAoKG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Ob2RlSW1wbCluKS5nZXRMb2NhbE5hbWUoKTsKLSAgLy8gfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGVsZW1lbnQgbmFtZSB3aXRoIHRoZSBuYW1lc3BhY2UgZXhwYW5kZWQuCi0gICovCi0gIC8vIHB1YmxpYyBTdHJpbmcgZ2V0RXhwYW5kZWRFbGVtZW50TmFtZShFbGVtZW50IGVsZW0pCi0gIC8vIHsKLSAgLy8gIFN0cmluZyBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2VPZk5vZGUoZWxlbSk7Ci0gIC8vICAgcmV0dXJuIChudWxsICE9IG5hbWVzcGFjZSkgPyBuYW1lc3BhY2UrIjoiKyBnZXRMb2NhbE5hbWVPZk5vZGUoZWxlbSkKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0TG9jYWxOYW1lT2ZOb2RlKGVsZW0pOwotICAvLyB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG5hbWUgd2l0aCB0aGUgbmFtZXNwYWNlIGV4cGFuZGVkLgotICAqLwotICAvLyBwdWJsaWMgU3RyaW5nIGdldEV4cGFuZGVkQXR0cmlidXRlTmFtZShBdHRyIGF0dHIpCi0gIC8vIHsKLSAgLy8gIFN0cmluZyBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2VPZk5vZGUoYXR0cik7Ci0gIC8vICAgcmV0dXJuIChudWxsICE9IG5hbWVzcGFjZSkgPyBuYW1lc3BhY2UrIjoiKyBnZXRMb2NhbE5hbWVPZk5vZGUoYXR0cikKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRMb2NhbE5hbWVPZk5vZGUoYXR0cik7Ci0gIC8vIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBwYXJlbnQgb2YgYSBub2RlLgotICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0UGFyZW50T2ZOb2RlKE5vZGUgbm9kZSkKLSAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIChOb2RlLkFUVFJJQlVURV9OT0RFID09IG5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgICAgICAgPyAoKEF0dHIpbm9kZSkuZ2V0T3duZXJFbGVtZW50KCkgOiBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9Gb3JtYXR0ZXJUb0RPTS5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9Gb3JtYXR0ZXJUb0RPTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzFlMjVhLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvRm9ybWF0dGVyVG9ET00uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSAgCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZS5TZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXJGYWN0b3J5OwotLy9pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLkJhc2VNYXJrdXBTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLkRPTVNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplclRvWE1MOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogVGhpcyBjbGFzcyB0YWtlcyBTQVggZXZlbnRzIChpbiBhZGRpdGlvbiB0byBzb21lIGV4dHJhIGV2ZW50cyAKLSAqIHRoYXQgU0FYIGRvZXNuJ3QgaGFuZGxlIHlldCkgYW5kIGFkZHMgdGhlIHJlc3VsdCB0byBhIGRvY3VtZW50IAotICogb3IgZG9jdW1lbnQgZnJhZ21lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtYXR0ZXJUb0RPTSBleHRlbmRzIFBhcnNlckFkYXB0ZXIKLXsgCi0gIERPTVNlcmlhbGl6ZXIgbV9zZXJpYWxpemVyOwotICAgIAotICAvKioKLSAgICogRm9ybWF0dGVyVG9ET00gaW5zdGFuY2UgY29uc3RydWN0b3IuLi4gaXQgd2lsbCBhZGQgdGhlIERPTSBub2RlcyAKLSAgICogdG8gdGhlIGRvY3VtZW50IGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIEZvcm1hdHRlclRvRE9NKERvY3VtZW50IGRvYywgRWxlbWVudCBlbGVtKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7Ci0gICAgdHJ5ewotICAgICAgbV9zZXJpYWxpemVyID0gKG5ldyBTZXJpYWxpemVyVG9YTUwoKSkuYXNET01TZXJpYWxpemVyKCk7Ci0gICAgICB0aGlzLnNldENvbnRlbnRIYW5kbGVyKChTZXJpYWxpemVyVG9YTUwpbV9zZXJpYWxpemVyKTsKLSAgICB9Ci0gICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gaW9lKQotICAgIHt9Ci0gIH0KLQotICAvKioKLSAgICogRm9ybWF0dGVyVG9ET00gaW5zdGFuY2UgY29uc3RydWN0b3IuLi4gaXQgd2lsbCBhZGQgdGhlIERPTSBub2RlcyAKLSAgICogdG8gdGhlIGRvY3VtZW50IGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIEZvcm1hdHRlclRvRE9NKERvY3VtZW50IGRvYywgRG9jdW1lbnRGcmFnbWVudCBkb2NGcmFnKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7IAotICAgIHRyeXsKLSAgICAgIG1fc2VyaWFsaXplciA9IChuZXcgU2VyaWFsaXplclRvWE1MKCkpLmFzRE9NU2VyaWFsaXplcigpOwotICAgICAgdGhpcy5zZXRDb250ZW50SGFuZGxlcigoU2VyaWFsaXplclRvWE1MKW1fc2VyaWFsaXplcik7Ci0gICAgfQotICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGlvZSkKLSAgICB7fQotICB9Ci0KLSAgLyoqCi0gICAqIEZvcm1hdHRlclRvRE9NIGluc3RhbmNlIGNvbnN0cnVjdG9yLi4uIGl0IHdpbGwgYWRkIHRoZSBET00gbm9kZXMgCi0gICAqIHRvIHRoZSBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBGb3JtYXR0ZXJUb0RPTShEb2N1bWVudCBkb2MpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICB0cnl7Ci0gICAgICBtX3NlcmlhbGl6ZXIgPSAobmV3IFNlcmlhbGl6ZXJUb1hNTCgpKS5hc0RPTVNlcmlhbGl6ZXIoKTsKLSAgICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIoKFNlcmlhbGl6ZXJUb1hNTCltX3NlcmlhbGl6ZXIpOwotICAgIH0KLSAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBpb2UpCi0gICAge30KLSAgfQotICAKLSAgcHVibGljIFNlcmlhbGl6ZXJUb1hNTCBnZXRTZXJpYWxpemVyT2JqZWN0KCkKLSAgewotICAgIHJldHVybiAoU2VyaWFsaXplclRvWE1MKW1fc2VyaWFsaXplcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL0Zvcm1hdHRlclRvSFRNTC5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9Gb3JtYXR0ZXJUb0hUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2MjFiMi4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL0Zvcm1hdHRlclRvSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZS5TZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXJUb0hUTUw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5QYXJzZXJBZGFwdGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLS8vaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5PdXRwdXRGb3JtYXQ7Ci0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KLSAqIEZvcm1hdHRlclRvSFRNTCBmb3JtYXRzIFNBWC1zdHlsZSBldmVudHMgaW50byBYTUwuCi0gKiBXYXJuaW5nOiB0aGlzIGNsYXNzIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIFhlcmNlcyBTZXJpYWxpemVyIGNsYXNzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtYXR0ZXJUb0hUTUwgZXh0ZW5kcyBQYXJzZXJBZGFwdGVyCi17IAotICAKLSAgU2VyaWFsaXplclRvSFRNTCBtX3NlcmlhbGl6ZXI7Ci0gIAotICBwdWJsaWMgRm9ybWF0dGVyVG9IVE1MKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICBtX3NlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplclRvSFRNTCgpOwotICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIobV9zZXJpYWxpemVyKTsgIAotICB9Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IgdXNpbmcgYSB3cml0ZXIuCi0gICAqIEBwYXJhbSB3cml0ZXIgICAgICAgIFRoZSBjaGFyYWN0ZXIgb3V0cHV0IHN0cmVhbSB0byB1c2UuCi0gICAqLwotICBwdWJsaWMgRm9ybWF0dGVyVG9IVE1MKFdyaXRlciB3cml0ZXIpIHRocm93cyBTQVhFeGNlcHRpb24gIAotICB7Ci0gICAgc3VwZXIobmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCkpOwotICAgIG1fc2VyaWFsaXplciA9IG5ldyBTZXJpYWxpemVyVG9IVE1MKCk7Ci0gICAgbV9zZXJpYWxpemVyLnNldFdyaXRlcih3cml0ZXIpOwotICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIobV9zZXJpYWxpemVyKTsgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB1c2luZyBhbiBvdXRwdXQgc3RyZWFtLCBhbmQgYSBzaW1wbGUgT3V0cHV0Rm9ybWF0LgotICAgKiBAcGFyYW0gd3JpdGVyICAgICAgICBUaGUgY2hhcmFjdGVyIG91dHB1dCBzdHJlYW0gdG8gdXNlLgotICAgKi8KLSAgcHVibGljIEZvcm1hdHRlclRvSFRNTChqYXZhLmlvLk91dHB1dFN0cmVhbSBvcykgIAotICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7Ci0gICAgbV9zZXJpYWxpemVyID0gbmV3IFNlcmlhbGl6ZXJUb0hUTUwoKTsKLSAgICBtX3NlcmlhbGl6ZXIuc2V0T3V0cHV0U3RyZWFtKG9zKTsKLSAgICB0aGlzLnNldENvbnRlbnRIYW5kbGVyKG1fc2VyaWFsaXplcik7Ci0gICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB1c2luZyBhIHdyaXRlci4KLSAgICogQHBhcmFtIHdyaXRlciAgICAgICAgVGhlIGNoYXJhY3RlciBvdXRwdXQgc3RyZWFtIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyBGb3JtYXR0ZXJUb0hUTUwoRm9ybWF0dGVyVG9YTUwgeG1sTGlzdGVuZXIpIHRocm93cyBTQVhFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7Ci0gICAgbV9zZXJpYWxpemVyID0gbmV3IFNlcmlhbGl6ZXJUb0hUTUwoKTsKLSAgICBtX3NlcmlhbGl6ZXIuQ29weUZyb20oeG1sTGlzdGVuZXIubV9zZXJpYWxpemVyKTsKLSAgICB0aGlzLnNldENvbnRlbnRIYW5kbGVyKG1fc2VyaWFsaXplcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZXJpYWxpemVyVG9IVE1MIGdldFNlcmlhbGl6ZXJPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG1fc2VyaWFsaXplcjsKLSAgfQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9Gb3JtYXR0ZXJUb1RleHQuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvRm9ybWF0dGVyVG9UZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOTI2NzkuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9Gb3JtYXR0ZXJUb1RleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplclRvVGV4dDsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlBhcnNlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBUaGlzIGNsYXNzIHRha2VzIFNBWCBldmVudHMgKGluIGFkZGl0aW9uIHRvIHNvbWUgZXh0cmEgZXZlbnRzIAotICogdGhhdCBTQVggZG9lc24ndCBoYW5kbGUgeWV0KSBhbmQgcHJvZHVjZXMgc2ltcGxlIHRleHQgb25seS4KLSAqIFdhcm5pbmc6IHRoaXMgY2xhc3Mgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgWGVyY2VzIFNlcmlhbGl6ZXIgY2xhc3Nlcy4KLSAqLwotcHVibGljIGNsYXNzIEZvcm1hdHRlclRvVGV4dCBleHRlbmRzIFBhcnNlckFkYXB0ZXIKLXsKLSAgCi0gIHByaXZhdGUgU2VyaWFsaXplclRvVGV4dCBtX3NlcmlhbGl6ZXI7Ci0gIC8qKgotICAgKiBGb3JtYXR0ZXJUb1RleHQgaW5zdGFuY2UgY29uc3RydWN0b3IuLi4gaXQgd2lsbCBhZGQgdGhlIERPTSBub2RlcyAKLSAgICogdG8gdGhlIGRvY3VtZW50IGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIEZvcm1hdHRlclRvVGV4dChXcml0ZXIgcHcpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICBtX3NlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplclRvVGV4dCgpOyAKLSAgICBtX3NlcmlhbGl6ZXIuc2V0V3JpdGVyKHB3KTsKLSAgICB0aGlzLnNldENvbnRlbnRIYW5kbGVyKG1fc2VyaWFsaXplcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZXJpYWxpemVyVG9UZXh0IGdldFNlcmlhbGl6ZXJPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG1fc2VyaWFsaXplcjsKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvRm9ybWF0dGVyVG9YTUwuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvRm9ybWF0dGVyVG9YTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwZDAzMi4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL0Zvcm1hdHRlclRvWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgIAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplclRvWE1MOwotLy9pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLkJhc2VNYXJrdXBTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLk1ldGhvZDsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlBhcnNlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KLSAqIEZvcm1hdHRlclRvWE1MIGZvcm1hdHMgU0FYLXN0eWxlIGV2ZW50cyBpbnRvIFhNTC4KLSAqIFdhcm5pbmc6IHRoaXMgY2xhc3Mgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgWGVyY2VzIFNlcmlhbGl6ZXIgY2xhc3Nlcy4KLSAqLwotcHVibGljIGNsYXNzIEZvcm1hdHRlclRvWE1MIGV4dGVuZHMgUGFyc2VyQWRhcHRlcgotewotICBTZXJpYWxpemVyVG9YTUwgbV9zZXJpYWxpemVyOwotICAKLSAgcHVibGljIEZvcm1hdHRlclRvWE1MKCkKLSAgewotICAgIHN1cGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICBtX3NlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplclRvWE1MKCk7Ci0gICAgdGhpcy5zZXRDb250ZW50SGFuZGxlcihtX3NlcmlhbGl6ZXIpOwotICAgIC8vc3VwZXIoIG5ldyBPdXRwdXRGb3JtYXQoIE1ldGhvZC5YTUwsIG51bGwsIGZhbHNlICkgKTsgICAgIAotICB9Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IgdXNpbmcgYSB3cml0ZXIuCi0gICAqIEBwYXJhbSB3cml0ZXIgICAgICAgIFRoZSBjaGFyYWN0ZXIgb3V0cHV0IHN0cmVhbSB0byB1c2UuCi0gICAqLwotICBwdWJsaWMgRm9ybWF0dGVyVG9YTUwoV3JpdGVyIHdyaXRlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICBtX3NlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplclRvWE1MKCk7Ci0gICAvLyBzdXBlciggZm9ybWF0ICE9IG51bGwgPyBmb3JtYXQgOiBuZXcgT3V0cHV0Rm9ybWF0KCBNZXRob2QuWE1MLCBudWxsLCBmYWxzZSApICk7Ci0gICAgLy9fZm9ybWF0LnNldE1ldGhvZCggTWV0aG9kLlhNTCApOwotICAgIG1fc2VyaWFsaXplci5zZXRXcml0ZXIoIHdyaXRlciApOwotICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIobV9zZXJpYWxpemVyKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIHVzaW5nIGFuIG91dHB1dCBzdHJlYW0sIGFuZCBhIHNpbXBsZSBPdXRwdXRGb3JtYXQuCi0gICAqIEBwYXJhbSB3cml0ZXIgICAgICAgIFRoZSBjaGFyYWN0ZXIgb3V0cHV0IHN0cmVhbSB0byB1c2UuCi0gICAqLwotICBwdWJsaWMgRm9ybWF0dGVyVG9YTUwoamF2YS5pby5PdXRwdXRTdHJlYW0gb3MpIAotICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uICwgU0FYRXhjZXB0aW9uIAotICB7Ci0gICAgc3VwZXIobmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCkpOwotICAgIG1fc2VyaWFsaXplciA9IG5ldyBTZXJpYWxpemVyVG9YTUwoKTsKLSAgICAvL3N1cGVyKCBmb3JtYXQgIT0gbnVsbCA/IGZvcm1hdCA6IG5ldyBPdXRwdXRGb3JtYXQoIE1ldGhvZC5YTUwsIG51bGwsIGZhbHNlICkgKTsKLSAgICAvL19mb3JtYXQuc2V0TWV0aG9kKCBNZXRob2QuWE1MICk7Ci0gICAgbV9zZXJpYWxpemVyLnNldE91dHB1dFN0cmVhbSggb3MgKTsKLSAgICB0aGlzLnNldENvbnRlbnRIYW5kbGVyKG1fc2VyaWFsaXplcik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB1c2luZyBhIHdyaXRlci4KLSAgICogQHBhcmFtIHdyaXRlciAgICAgICAgVGhlIGNoYXJhY3RlciBvdXRwdXQgc3RyZWFtIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyBGb3JtYXR0ZXJUb1hNTChGb3JtYXR0ZXJUb1hNTCB4bWxMaXN0ZW5lcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICBtX3NlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplclRvWE1MKCk7Ci0gICAgbV9zZXJpYWxpemVyLkNvcHlGcm9tKHhtbExpc3RlbmVyLm1fc2VyaWFsaXplcik7Ci0gICAgLy9zdXBlciggbmV3IE91dHB1dEZvcm1hdCggTWV0aG9kLlhNTCwgbnVsbCwgZmFsc2UgKSApOwotICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIobV9zZXJpYWxpemVyKTsKLSAgfQotICAKLSAgcHVibGljIFNlcmlhbGl6ZXJUb1hNTCBnZXRTZXJpYWxpemVyT2JqZWN0KCkKLSAgewotICAgIHJldHVybiBtX3NlcmlhbGl6ZXI7Ci0gIH0KLSAgCi0KLX0gIC8vVG9YTUxTdHJpbmdWaXNpdG9yCmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL1Byb2JsZW1MaXN0ZW5lci5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9Qcm9ibGVtTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmNDEzNy4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL1Byb2JsZW1MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdGhhdCB0aGUgWFNMIHByb2Nlc3NvciBjYWxscyB3aGVuIGl0IAotICogaGFzIGEgcHJvYmxlbSBvZiBzb21lIGtpbmQsIGVpdGhlciBhbiBlcnJvciBvciBhIHdhcm5pbmcuCi0gKiBVc2VycyBzaG91bGQgYXNzIHRoZSBYU0xURW5naW5lSW1wbCBjbGFzcyB0byBzZXRQcm9ibGVtTGlzdGVuZXIKLSAqIGlmIHRoZXkgd2lzaCBhbiBvYmplY3QgaW5zdGFuY2UgdG8gYmUgY2FsbGVkIHdoZW4gYSBwcm9ibGVtCi0gKiBldmVudCBvY2N1cnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvYmxlbUxpc3RlbmVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgICAgV0FSTklORyAgICAgICAgID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCAgICBFUlJPUiAgICAgICAgICAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0ICAgIE1FU1NBR0UgICAgICAgICA9IDM7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCAgICBYTUxQQVJTRVIgICAgICAgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0ICAgIFhTTFBST0NFU1NPUiAgICA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgICAgUVVFUllFTkdJTkUgICAgID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCAgICBYUEFUSFBST0NFU1NPUiAgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0ICAgIFhQQVRIUEFSU0VSICA9IDU7Ci0KLSAgLyoqCi0gICAqIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBwcm9ibGVtIGV2ZW50IG9jY3Vycy4KLSAgICogCi0gICAqIEBwYXJhbSAgIHdoZXJlICAgICAgICAgICAgIEVpdGhlciBhbmQgWE1MUEFSU0VSLCBYU0xQUk9DRVNTT1IsIG9yIFFVRVJZRU5HSU5FLgotICAgKiBAcGFyYW0gICBjbGFzc2lmaWNhdGlvbiAgICBFaXRoZXIgRVJST1Igb3IgV0FSTklORy4KLSAgICogQHBhcmFtICAgc3R5bGVOb2RlICAgICAgICAgVGhlIHN0eWxlIHRyZWUgbm9kZSB3aGVyZSB0aGUgcHJvYmxlbQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZC4gIE1heSBiZSBudWxsLgotICAgKiBAcGFyYW0gICBzb3VyY2VOb2RlICAgICAgICBUaGUgc291cmNlIHRyZWUgbm9kZSB3aGVyZSB0aGUgcHJvYmxlbQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZC4gIE1heSBiZSBudWxsLgotICAgKiBAcGFyYW0gICBtc2cgICAgICAgICAgICAgICBBIHN0cmluZyBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlIHByb2JsZW0uCi0gICAqIEBwYXJhbSAgIGxpbmVObyAgICAgICAgICAgIFRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgcHJvYmxlbSBvY2N1cnJlZCwgIAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBrbm93bi4gTWF5IGJlIHplcm8uCi0gICAqIEBwYXJhbSAgIGNoYXJPZmZzZXQgICAgICAgIFRoZSBjaGFyYWN0ZXIgb2Zmc2V0IHdoZXJlIHRoZSBwcm9ibGVtLCAgCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkIGlmIGl0IGlzIGtub3duLiBNYXkgYmUgemVyby4KLSAgICogCi0gICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIHJldHVybiBpcyBhbiBFUlJPUiwgaW4gd2hpY2ggY2FzZQotICAgKiAgICAgICAgICBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uICBPdGhlcndpc2UgdGhlIHByb2Nlc3NvciB3aWxsIAotICAgKiAgICAgICAgICBjb250aW51ZSB0byBwcm9jZXNzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvYmxlbShzaG9ydCB3aGVyZSwgc2hvcnQgY2xhc3NpZmljYXRpb24sIAotICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc3R5bGVOb2RlLCBOb2RlIHNvdXJjZU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2csIFN0cmluZyBpZCwgaW50IGxpbmVObywgaW50IGNoYXJPZmZzZXQpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiAgOwotICAKLSAgLyoqCi0gICAqIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIGlzc3VlIGEgbWVzc2FnZS4KLSAgICogQHBhcmFtICAgbXNnICAgICAgICAgICAgICAgQSBzdHJpbmcgbWVzc2FnZSB0byBvdXRwdXQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBtZXNzYWdlKFN0cmluZyBtc2cpOwotCi19CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL1Byb2JsZW1MaXN0ZW5lckRlZmF1bHQuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvUHJvYmxlbUxpc3RlbmVyRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmMzOTI3Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvUHJvYmxlbUxpc3RlbmVyRGVmYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRoYXQgdGhlIFhTTCBwcm9jZXNzb3IgY2FsbHMgd2hlbiBpdCAKLSAqIGhhcyBhIHByb2JsZW0gb2Ygc29tZSBraW5kLCBlaXRoZXIgYW4gZXJyb3Igb3IgYSB3YXJuaW5nLgotICogVXNlcnMgc2hvdWxkIGFzcyB0aGUgWFNMVEVuZ2luZUltcGwgY2xhc3MgdG8gc2V0UHJvYmxlbUxpc3RlbmVyCi0gKiBpZiB0aGV5IHdpc2ggYW4gb2JqZWN0IGluc3RhbmNlIHRvIGJlIGNhbGxlZCB3aGVuIGEgcHJvYmxlbQotICogZXZlbnQgb2NjdXJzLgotICovCi1wdWJsaWMgY2xhc3MgUHJvYmxlbUxpc3RlbmVyRGVmYXVsdCBleHRlbmRzIG9yZy5hcGFjaGUueG1sLnV0aWxzLkRlZmF1bHRFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBQcm9ibGVtTGlzdGVuZXIgCi17Ci0gIC8vRXJyb3JIYW5kbGVyIG1fZXJyb3JIYW5kbGVyID0gbnVsbDsKLSAgUHJvYmxlbUxpc3RlbmVyIG1fcHJvYmxlbUxpc3RlbmVyID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBQcm9ibGVtTGlzdGVuZXJEZWZhdWx0KCkKLSAgewotICAgIHN1cGVyKCk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgUHJvYmxlbUxpc3RlbmVyRGVmYXVsdChQcm9ibGVtTGlzdGVuZXIgbCkKLSAgeyAKLSAgICAvL21fZXJyb3JIYW5kbGVyID0gaGFuZGxlcjsKLSAgICBtX3Byb2JsZW1MaXN0ZW5lciA9IGw7Ci0gIH0KLSAgLyoKLSAgcHVibGljIHZvaWQgc2V0RXJyb3JIYW5kbGVyIChFcnJvckhhbmRsZXIgaGFuZGxlcikKLSAgewotICAgIG1fZXJyb3JIYW5kbGVyID0gaGFuZGxlcjsKLSAgfQotICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9ibGVtTGlzdGVuZXIgKFByb2JsZW1MaXN0ZW5lciBsKQotICB7Ci0gICAgbV9wcm9ibGVtTGlzdGVuZXIgPSBsOwotICB9Ci0gIAotICBwdWJsaWMgRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlciAoKQotICB7Ci0gICAgcmV0dXJuIHRoaXM7IC8vIG1fZXJyb3JIYW5kbGVyOwotICB9Ci0gIAotICBwdWJsaWMgUHJvYmxlbUxpc3RlbmVyIGdldFByb2JsZW1MaXN0ZW5lciAoKQotICB7Ci0gICAgaWYgKG1fcHJvYmxlbUxpc3RlbmVyICE9IG51bGwpCi0gICAgICByZXR1cm4gbV9wcm9ibGVtTGlzdGVuZXI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBGdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBpc3N1ZSBhIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSAgIG1zZyAgICAgICAgICAgICAgIEEgc3RyaW5nIG1lc3NhZ2UgdG8gb3V0cHV0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gbWVzc2FnZShTdHJpbmcgbXNnKQotICB7Ci0gICAgICBpZiAobV9wcm9ibGVtTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgbV9wcm9ibGVtTGlzdGVuZXIubWVzc2FnZShtc2cpOwotICAgICAgc3luY2hyb25pemVkICh0aGlzKQotICAgICAgeyAgCi0gICAgICAgIG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKCAgU3lzdGVtLmVyciwgdHJ1ZSApLnByaW50bG4oIG1zZyApOwotICAgICAgfSAKLSAgIAotICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGtub3cgdGhpcyBpcyBhbiBlcnJvciAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcHJvYmxlbShzaG9ydCB3aGVyZSwgc2hvcnQgY2xhc3NpZmljYXRpb24sIAotICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc3R5bGVOb2RlLCBOb2RlIHNvdXJjZU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2csIFN0cmluZyBpZCwgaW50IGxpbmVObywgaW50IGNoYXJPZmZzZXQpCi0gIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gICAKLSAgewotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciAhPSBudWxsKQotICAgICAgcmV0dXJuIG1fcHJvYmxlbUxpc3RlbmVyLnByb2JsZW0od2hlcmUsIGNsYXNzaWZpY2F0aW9uLCBzdHlsZU5vZGUsIHNvdXJjZU5vZGUsIG1zZywgaWQsIGxpbmVObywgY2hhck9mZnNldCk7Ci0gICAgZWxzZQotICAgIHsgIAotICAgICAgdGhpcy5lcnJvcihuZXcgU0FYUGFyc2VFeGNlcHRpb24obXNnLCBudWxsLCBpZCwgbGluZU5vLCBjaGFyT2Zmc2V0KSk7Ci0gICAgICByZXR1cm4gZmFsc2U7ICAgCi0gICAgfQotICB9IAotICAKLSAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciA9PSBudWxsKQotICAgIHsKLSAgICAgIHN1cGVyLndhcm5pbmcoZXhjZXB0aW9uKTsgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZHRocm93ID0gbV9wcm9ibGVtTGlzdGVuZXIucHJvYmxlbShYU0xQUk9DRVNTT1IsIFdBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRDb2x1bW5OdW1iZXIoKSk7IAotICAgICAgaWYgKHNob3VsZHRocm93KQotICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciA9PSBudWxsKQotICAgIHsKLSAgICAgIHN1cGVyLmVycm9yKGV4Y2VwdGlvbik7ICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGR0aHJvdyA9IG1fcHJvYmxlbUxpc3RlbmVyLnByb2JsZW0oWFNMUFJPQ0VTU09SLCBFUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldFN5c3RlbUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCksICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpKTsgCi0gICAgICBpZiAoc2hvdWxkdGhyb3cpCi0gICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAobV9wcm9ibGVtTGlzdGVuZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdXBlci5mYXRhbEVycm9yKGV4Y2VwdGlvbik7ICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGR0aHJvdyA9IG1fcHJvYmxlbUxpc3RlbmVyLnByb2JsZW0oWFNMUFJPQ0VTU09SLCBFUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldFN5c3RlbUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCksICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpKTsgCi0gICAgICBpZiAoc2hvdWxkdGhyb3cpCi0gICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHdhcm5pbmcoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgewotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciA9PSBudWxsKQotICAgIHsKLSAgICAgIHN1cGVyLndhcm5pbmcoZXhjZXB0aW9uKTsgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZHRocm93ID0gdHJ1ZTsKLSAgICAgIHRyeXsKLSAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBleGNlcHRpb24uZ2V0TG9jYXRvcigpOwotICAgICAgICBpZiAobG9jYXRvciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2hvdWxkdGhyb3cgPSBtX3Byb2JsZW1MaXN0ZW5lci5wcm9ibGVtKFhTTFBST0NFU1NPUiwgV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRTeXN0ZW1JZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yLmdldExpbmVOdW1iZXIoKSwgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIAotICAgICAgICB7Ci0gICAgICAgICAgc2hvdWxkdGhyb3cgPSBtX3Byb2JsZW1MaXN0ZW5lci5wcm9ibGVtKFhTTFBST0NFU1NPUiwgTUVTU0FHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKHNlKTsKLSAgICAgIH0KLSAgICAgIGlmIChzaG91bGR0aHJvdykKLSAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlcnJvcihUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKG1fcHJvYmxlbUxpc3RlbmVyID09IG51bGwpCi0gICAgewotICAgICAgc3VwZXIuZXJyb3IoZXhjZXB0aW9uKTsgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZHRocm93ID0gdHJ1ZTsKLSAgICAgIHRyeXsKLSAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBleGNlcHRpb24uZ2V0TG9jYXRvcigpOwotICAgICAgICBpZiAobG9jYXRvciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2hvdWxkdGhyb3cgPSBtX3Byb2JsZW1MaXN0ZW5lci5wcm9ibGVtKFhTTFBST0NFU1NPUiwgRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IuZ2V0U3lzdGVtSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCksICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIHNob3VsZHRocm93ID0gbV9wcm9ibGVtTGlzdGVuZXIucHJvYmxlbShYU0xQUk9DRVNTT1IsIEVSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oc2UpOwotICAgICAgfQotICAgICAgaWYgKHNob3VsZHRocm93KQotICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgewotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciA9PSBudWxsKQotICAgIHsKLSAgICAgIHN1cGVyLmZhdGFsRXJyb3IoZXhjZXB0aW9uKTsgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZHRocm93ID0gdHJ1ZTsKLSAgICAgIHRyeXsKLSAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBleGNlcHRpb24uZ2V0TG9jYXRvcigpOwotICAgICAgICBpZiAobG9jYXRvciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2hvdWxkdGhyb3cgPSBtX3Byb2JsZW1MaXN0ZW5lci5wcm9ibGVtKFhTTFBST0NFU1NPUiwgRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IuZ2V0U3lzdGVtSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCksICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIHNob3VsZHRocm93ID0gbV9wcm9ibGVtTGlzdGVuZXIucHJvYmxlbShYU0xQUk9DRVNTT1IsIEVSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oc2UpOwotICAgICAgfQotICAgICAgaWYgKHNob3VsZHRocm93KQotICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLSAgLyoKLSAgcHJpdmF0ZSBjbGFzcyBNZXNzYWdlTWdyIGV4dGVuZHMgb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5Nc2dNZ3IgCi0gIHsKLSAgICB2b2lkIE1lc3NhZ2VNZ3IoKQotICAgIHt9Ci0gIH0qLwotCi19CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL1RyZWVXYWxrZXIuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvVHJlZVdhbGtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGNiZmI2Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvVHJlZVdhbGtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xIAotICogCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuQXR0TGlzdDsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KLSAqIFRoaXMgY2xhc3MgZG9lcyBhIHByZS1vcmRlciB3YWxrIG9mIHRoZSBET00gdHJlZSwgY2FsbGluZyB0aGUgRm9ybWF0dGVyTGlzdGVuZXIKLSAqIGludGVyZmFjZSBhcyBpdCBnb2VzLgotICovCi1wdWJsaWMgY2xhc3MgVHJlZVdhbGtlciAvL2V4dGVuZHMgb3JnLmFwYWNoZS54bWwudXRpbHMuVHJlZVdhbGtlcgotewotICAKLSAgb3JnLmFwYWNoZS54bWwudXRpbHMuVHJlZVdhbGtlciBtX3dhbGtlcjsgCi0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSAgIGZvcm1hdHRlckxpc3RlbmVyIFRoZSBpbXBsZW1lbnRpb24gb2YgdGhlIAotICAgKiBGb3JtYXR0ZXJMaXN0ZW5lciBvcGVyYXRpb24gKHRvWE1MU3RyaW5nLCBkaWdlc3QsIC4uLikKLSAgICovCi0gIHB1YmxpYyBUcmVlV2Fsa2VyKERvY3VtZW50SGFuZGxlciBmb3JtYXR0ZXJMaXN0ZW5lcikgCi0gIHsKLSAgICBpZihmb3JtYXR0ZXJMaXN0ZW5lciBpbnN0YW5jZW9mIEZvcm1hdHRlclRvWE1MKQotICAgICAgbV93YWxrZXIgPSBuZXcgb3JnLmFwYWNoZS54bWwudXRpbHMuVHJlZVdhbGtlcigoKEZvcm1hdHRlclRvWE1MKWZvcm1hdHRlckxpc3RlbmVyKS5nZXRTZXJpYWxpemVyT2JqZWN0KCksIG5ldyBvcmcuYXBhY2hlLnhwYXRoLkRPTTJIZWxwZXIoKSk7Ci0gICAgLy9zdXBlcihmb3JtYXR0ZXJMaXN0ZW5lcik7Ci0gIH0gCi0gCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBub24tcmVjdXJzaXZlIHN0eWxlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoTm9kZSBwb3MpIHRocm93cyBTQVhFeGNlcHRpb24gCi0gIHsKLSAgICBtX3dhbGtlci50cmF2ZXJzZShwb3MpOwotICB9Ci0gIAotICAvKioKLSAgICogUGVyZm9ybSBhIHByZS1vcmRlciB0cmF2ZXJzYWwgbm9uLXJlY3Vyc2l2ZSBzdHlsZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKE5vZGUgcG9zLCBOb2RlIHRvcCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIG1fd2Fsa2VyLnRyYXZlcnNlKHBvcywgdG9wKTsKLSAgfQotICAKLSAgCi0gIAotfSAgLy9UcmVlV2Fsa2VyCmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL1hNTFBhcnNlckxpYWlzb24uamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvWE1MUGFyc2VyTGlhaXNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI3MDhmLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvWE1MUGFyc2VyTGlhaXNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgIAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5ET00ySGVscGVyOwotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdGhhdCB0aGUgWFNMIHByb2Nlc3NvciBjYWxscyB3aGVuIGl0IAotICogaGFzIGEgcHJvYmxlbSBvZiBzb21lIGtpbmQsIGVpdGhlciBhbiBlcnJvciBvciBhIHdhcm5pbmcuCi0gKiBVc2VycyBzaG91bGQgYXNzIHRoZSBYU0xURW5naW5lSW1wbCBjbGFzcyB0byBzZXRQcm9ibGVtTGlzdGVuZXIKLSAqIGlmIHRoZXkgd2lzaCBhbiBvYmplY3QgaW5zdGFuY2UgdG8gYmUgY2FsbGVkIHdoZW4gYSBwcm9ibGVtCi0gKiBldmVudCBvY2N1cnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxQYXJzZXJMaWFpc29uIGV4dGVuZHMgRE9NMkhlbHBlcgotewotICAKLQotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9YTUxQYXJzZXJMaWFpc29uRGVmYXVsdC5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hwYXRoL3htbC9YTUxQYXJzZXJMaWFpc29uRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2EyMzlmLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvWE1MUGFyc2VyTGlhaXNvbkRlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWw7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC4qOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5YTUxQYXJzZXJMaWFpc29uOwotCi0vKioKLSAqIEEgY2xhc3MgdGhhdCBoYW5kbGVzIGludGVyZmFjaW5nIElCTSdzIFhNTDRKMiB0byB0aGUgCi0gKiBMb3R1cyBYU0wgUHJvY2Vzc29yLgotICovCi1wdWJsaWMgY2xhc3MgWE1MUGFyc2VyTGlhaXNvbkRlZmF1bHQgZXh0ZW5kcyBYTUxQYXJzZXJMaWFpc29uIAotewotICAKLX0KLQotCmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sL3BhY2thZ2UuaHRtbCBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2VlN2QxLi4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94cGF0aC94bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPEhUTUw+PEhFQUQ+PC9IRUFEPjxCT0RZPgotICAgICA8UD5JbmZyYXN0cnVjdHVyZSBmb3Igd29ya2luZyB3aXRoIGFuIFhNTCBwYXJzZXIuPC9QPgotICAgCi0gICAgICA8UD5BbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLlhNTFBhcnNlckxpYWlzb259IGludGVyZmFjZSBwcm92aWRlcyBhIGxpYWlzb24KLSAgICAgYmV0d2VlbiB0aGUgWFNMVCBwcm9jZXNzb3IgYW5kIGFuIFhNTCBwYXJzZXIuIFVubGVzcyB5b3Ugc3BlY2lmeSBhbiBYTUwgcGFyc2VyIGFuZCB5b3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiAKLSAgICAgdGhlIFhNTFBhcnNlckxpYWlzb24gaW50ZXJmYWNlLCBYYWxhbi1KYXZhIHVzZXMgdGhlIAotICAgICB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuWE1MUGFyc2VyTGlhaXNvbkRlZmF1bHR9OjwvUD4KLSAgICAgPFA+VGhpcyBwYWNrYWdlIGFsc28gaW5jbHVkZXMgZm91ciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIDxBIGhyZWY9Imh0dHA6Ly93d3cubWVnZ2luc29uLmNvbS9TQVgvc2F4Lmh0bWwiIHRhcmdldD0iX3RvcCI+U0FYPC9BPiA8QSBocmVmPSJodHRwOi8vd3d3Lm1lZ2dpbnNvbi5jb20vU0FYL2phdmFkb2Mvb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyLmh0bWwjX3RvcCIgdGFyZ2V0PSJfdG9wIj5vcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXI8L0E+IGludGVyZmFjZTo8L1A+Ci0gICAgIDxVTD4KLSAgICAgPExJPntAbGluayBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5Gb3JtYXR0ZXJUb0RPTX08L0xJPgotICAgICA8TEk+e0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLkZvcm1hdHRlclRvWE1MfTwvTEk+Ci0gICAgIDxMST57QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuRm9ybWF0dGVyVG9IVE1MfSAoYW4gZXh0ZW5zaW9uIG9mIEZvcm1hdHRlclRvWE1MKTwvTEk+Ci0gICAgIDxMST57QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuRm9ybWF0dGVyVG9UZXh0fTwvTEk+Ci0gICAgIDwvVUw+Ci0gICA8L0JPRFk+PC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXQuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5ODQ2NC4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9TdHlsZXNoZWV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54c2x0OwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIGJhc2Ugc3R5bGVzaGVldCBvciBhbgotICogImltcG9ydCIgc3R5bGVzaGVldDsgImluY2x1ZGUiIHN0eWxlc2hlZXRzIGFyZQotICogY29tYmluZWQgd2l0aCB0aGUgaW5jbHVkaW5nIHN0eWxlc2hlZXQuCi0gKiBBdCB0aGUgbW9tZW50IHRoZXNlIHN0eWxlc2hlZXRzIGNhbiBub3QgYmUgcmV1c2VkIHdpdGhpbiB0aGUKLSAqIHN0eWxlc2hlZXQgdHJlZSBvciBiZXR3ZWVuIHRyZWVzLiAgVGhpcyBuZWVkcyB0byBiZSBmaXhlZAotICogaW4gdGhlIGZ1dHVyZS4KLSAqLwotcHVibGljIGNsYXNzIFN0eWxlc2hlZXQgIGV4dGVuZHMgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldAoteyAKLQkKLQkgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBhIFN0eWxlc2hlZXQgbmVlZHMgYSBEb2N1bWVudC4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXQoU3R5bGVzaGVldFJvb3Qgcm9vdCwKLSAgICAgICAgICAgICAgICAgICAgWFNMVEVuZ2luZUltcGwgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZUlkZW50aWZpZXIpCi0gICAgdGhyb3dzIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotICAgICAgICAgICBGaWxlTm90Rm91bmRFeGNlcHRpb24sCi0gICAgICAgICAgIElPRXhjZXB0aW9uLAotICAgICAgICAgICBTQVhFeGNlcHRpb24KLSAgewotCQlzdXBlcihyb290LmdldE9iamVjdCgpKTsgICAgCi0gIH0KLQkKLQkvKioKLSAgICogQ29uc3RydWN0b3IgdXNpbmcgYW4gb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3QuCi0gICAqIAotICAgKiBAcGFyYW0gcyBhbiBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0IG9iamVjdAotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXQob3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldCBzKSAgICAKLSAgeyAKLQkJc3VwZXIocyk7Ci0gICAgICAgCi0gIH0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXRIYW5kbGVyLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9TdHlsZXNoZWV0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDBmYjM1Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgIAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54c2x0OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0OyAKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KLSAqIEluaXRpYWxpemVzIGFuZCBwcm9jZXNzZXMgYSBzdHlsZXNoZWV0IHZpYSBTQVggZXZlbnRzLgotICogSWYgeW91IG5lZWQgdG8gYWx0ZXIgdGhlIGNvZGUgaW4gaGVyZSwKLSAqIGl0IGlzIG5vdCBmb3IgdGhlIGZhaW50LW9mLWhlYXJ0LCBkdWUgdG8gdGhlIHN0YXRlIHRyYWNraW5nCi0gKiB0aGF0IGhhcyB0byBiZSBkb25lIGR1ZSB0byB0aGUgU0FYIGV2ZW50IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVzaGVldEhhbmRsZXIgZXh0ZW5kcyBQYXJzZXJBZGFwdGVyCi0gIAotewotICAKLSAgLyoqCi0gICAqIEluc3RhbmNlIGNvbnN0cnVjdG9yLi4uIAotICAgKiBAcGFyYW0gcHJvY2Vzc29yICBUaGUgWFNMVFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbi4KLSAgICogQHBhcmFtIHN0eWxlc2hlZXQgVGhlIHJvb3Qgc3R5bGVzaGVldC4KLSAgICogICAgCi0gICAqLwotICBwdWJsaWMgU3R5bGVzaGVldEhhbmRsZXIoWFNMVEVuZ2luZUltcGwgcHJvY2Vzc29yLCBTdHlsZXNoZWV0IHN0eWxlc2hlZXRUcmVlKSAgICAKLSAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIAotICAgICAgc3VwZXIobmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCkpOwotICAgICAgLy90cnl7Ci0gICAgICBvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5TdHlsZXNoZWV0SGFuZGxlciBoYW5kbGVyID0gCi0gICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuU3R5bGVzaGVldEhhbmRsZXIocHJvY2Vzc29yLmdldFRyYW5zZm9ybWVyRmFjdG9yeSgpKTsKLSAgICAgIGhhbmRsZXIucHVzaFN0eWxlc2hlZXQoc3R5bGVzaGVldFRyZWUpOwotICAgICAgdGhpcy5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKLSAgICAvL30KLSAgICAvL2NhdGNoIChqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpCi0gICAgLy97fQotICB9IAotICAKLSAgLyoqCi0gICAqIEluc3RhbmNlIGNvbnN0cnVjdG9yLi4uIAotICAgKiBAcGFyYW0gcHJvY2Vzc29yICBUaGUgWFNMVFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbi4KLSAgICogQHBhcmFtIHN0eWxlc2hlZXQgVGhlIHJvb3Qgc3R5bGVzaGVldC4gCi0gICAqIEBleGNlcHRpb24gVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uICAKLSAgICovCi0gIHB1YmxpYyBTdHlsZXNoZWV0SGFuZGxlcihYU0xURW5naW5lSW1wbCBwcm9jZXNzb3IsIFN0eWxlc2hlZXRSb290IHN0eWxlc2hlZXRUcmVlKSAgICAKLSAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIC8vdHJ5ewotICAgICAgc3VwZXIobmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCkpOwotICAgICAgb3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuU3R5bGVzaGVldEhhbmRsZXIgaGFuZGxlciA9IAotICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlN0eWxlc2hlZXRIYW5kbGVyKHByb2Nlc3Nvci5nZXRUcmFuc2Zvcm1lckZhY3RvcnkoKSk7Ci0gICAgICBoYW5kbGVyLnB1c2hTdHlsZXNoZWV0KHN0eWxlc2hlZXRUcmVlLmdldE9iamVjdCgpKTsKLSAgICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgLy99Ci0gICAgLy9jYXRjaCAoamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgIC8ve30KLSAgfSAKLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvU3R5bGVzaGVldFJvb3QuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXRSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MmMzMWEuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvU3R5bGVzaGVldFJvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSAgCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuT3V0cHV0UHJvcGVydGllczsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuRm9ybWF0dGVyVG9YTUw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuRm9ybWF0dGVyVG9IVE1MOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLkZvcm1hdHRlclRvVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5Gb3JtYXR0ZXJUb0RPTTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnJlcy5YU0xURXJyb3JSZXNvdXJjZXM7Ci0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4gCi0gKiBCaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgYSBzdHlsZXNoZWV0IC0tIHVzZSB0aGUge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yfSBQcm9jZXNzU3R5bGVzaGVldAotICogbWV0aG9kIHRvIGNyZWF0ZSBhIFN0eWxlc2hlZXRSb290IGFuZCBpbXByb3ZlIHBlcmZvcm1hbmNlIGZvciBhIHN0eWxlc2hlZXQgcGVyZm9ybWluZyBtdWx0aXBsZSB0cmFuc2Zvcm1hdGlvbnMuCi0gKiBBbHNvIHJlcXVpcmVkIGZvciBYU0xUUHJvY2Vzc29yIHRvIGZ1bmN0aW9uIGFzIFNBWCBEb2N1bWVudEhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZXNoZWV0Um9vdCBleHRlbmRzIFN0eWxlc2hlZXQKLXsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIG1fbGlhaXNvbkNsYXNzVXNlZFRvQ3JlYXRlID0gbnVsbDsKLSAgcHJpdmF0ZSBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdCBtX3NSb290T2JqZWN0OwotICAKLSAgLyoqCi0gICAqIFVzZXMgYW4gWFNMIHN0eWxlc2hlZXQgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBwcm9jZXNzb3IgIFRoZSBYU0xUUHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLgotICAgKiBAcGFyYW0gYmFzZUlkZW50aWZpZXIgVGhlIGZpbGUgbmFtZSBvciBVUkwgZm9yIHRoZSBYU0wgc3R5bGVzaGVldC4KLSAgICogQGV4Y2VwdGlvbiBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGhyb3duIAotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXRSb290KFhTTFRFbmdpbmVJbXBsIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlSWRlbnRpZmllcikKLSAgICB0aHJvd3MgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsgCi0JCXN1cGVyKG51bGwpOwotICAgIG1fc1Jvb3RPYmplY3QgPSBuZXcgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3QocHJvY2Vzc29yLmdldFRyYW5zZm9ybWVyRmFjdG9yeSgpLmdldEVycm9yTGlzdGVuZXIoKSk7IAotICAgIGlmIChwcm9jZXNzb3IuZ2V0WE1MUHJvY2Vzc29yTGlhaXNvbigpIT0gbnVsbCkKLSAgICAgIG1fbGlhaXNvbkNsYXNzVXNlZFRvQ3JlYXRlID0gKChPYmplY3QpcHJvY2Vzc29yLmdldFhNTFByb2Nlc3NvckxpYWlzb24oKSkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgCi0gIH0gIAotCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIHVzaW5nIGFuIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRSb290LgotICAgKiAKLSAgICogQHBhcmFtIHMgYW4gb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3Qgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgU3R5bGVzaGVldFJvb3Qob3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3QgcykgICAgCi0gIHsgCi0JCXN1cGVyKG51bGwpOwotICAgIG1fc1Jvb3RPYmplY3QgPSBzOyAgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRSb290IG9iamVjdAotICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdHlsZXNoZWV0IHJvb3QuCi0gICAqICAKLSAgICogQHJldHVybiBhbiBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdCBvYmplY3QKLSAgICovCi0gIHB1YmxpYyBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdCBnZXRPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG1fc1Jvb3RPYmplY3Q7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIFRyYW5zZm9ybSB0aGUgWE1MIHNvdXJjZSB0cmVlIGFuZCBwbGFjZSB0aGUgb3V0cHV0IGluIHRoZSByZXN1bHQgdHJlZSB0YXJnZXQuCi0gICAqIFRoaXMgbWV0aG9kIHVzZXMgYSBuZXcgWFNMVFByb2Nlc3NvciBpbnN0YW5jZSB0byB0cmFjayB0aGUgcnVubmluZyBzdGF0ZS4KLSAgICogQHBhcmFtIHhtbFNvdXJjZSAgVGhlIFhNTCBpbnB1dCBzb3VyY2UgdHJlZS4KLSAgICogQHBhcmFtIG91dHB1dFRhcmdldCBUaGUgb3V0cHV0IHJlc3VsdCB0cmVlLgotICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yI3Byb2Nlc3Mob3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZSwgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZSwgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRSZXN1bHRUYXJnZXQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcm9jZXNzKCBYU0xUSW5wdXRTb3VyY2UgeG1sU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBYU0xUUmVzdWx0VGFyZ2V0IG91dHB1dFRhcmdldCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLAotICAgICAgICAgICBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgSU9FeGNlcHRpb24KLSAgewotICAgIFhTTFRQcm9jZXNzb3IgaXByb2Nlc3NvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCAhPSBtX2xpYWlzb25DbGFzc1VzZWRUb0NyZWF0ZSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhTTFRQcm9jZXNzb3JGYWN0b3J5KCkuZ2V0UHJvY2Vzc29yVXNpbmdMaWFpc29uTmFtZShtX2xpYWlzb25DbGFzc1VzZWRUb0NyZWF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFhTTFRQcm9jZXNzb3JGYWN0b3J5KCkuZ2V0UHJvY2Vzc29yKCk7Ci0gICAgcHJvY2VzcyhpcHJvY2Vzc29yLCBpcHJvY2Vzc29yLmdldFNvdXJjZVRyZWVGcm9tSW5wdXQoeG1sU291cmNlKSwgb3V0cHV0VGFyZ2V0KTsKLSAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBjb3VudGVycyBtYWRlOiAiKwotICAgIC8vICAgICAgICAgICAgICAgICAgICgoWFNMVEVuZ2luZUltcGwpaXByb2Nlc3NvcikuZ2V0Q291bnRlcnNUYWJsZSgpLm1fY291bnRlcnNNYWRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFuc2Zvcm0gdGhlIFhNTCBzb3VyY2UgdHJlZSBhbmQgcGxhY2UgdGhlIG91dHB1dCBpbiB0aGUgcmVzdWx0IHRyZWUgdGFyZ2V0LgotICAgKiBVc2UgdGhpcyB2ZXJzaW9uIG9mIHRoZSBTdHlsZXNoZWV0Um9vdCBwcm9jZXNzKCkgbWV0aG9kIGlmIHlvdSBoYXZlIHVzZWQgYW4KLSAgICogWFNMVFByb2Nlc3NvciBvYmplY3QgdG8gc2V0IGEgc3R5bGVzaGVldCBwYXJhbWV0ZXIuIFRoYXQgb2JqZWN0IGlzIG5vdyB0aGUgaXByb2Nlc3NvciBwYXJhbWV0ZXIuCi0gICAqIEBwYXJhbSBpcHJvY2Vzc29yICBUaGUgWFNMVFByb2Nlc3NvciB0aGF0IHdpbGwgdHJhY2sgdGhlIHJ1bm5pbmcgc3RhdGUuCi0gICAqIEBwYXJhbSB4bWxTb3VyY2UgIFRoZSBYTUwgaW5wdXQgc291cmNlIHRyZWUuCi0gICAqIEBwYXJhbSBvdXRwdXRUYXJnZXQgVGhlIG91dHB1dCByZXN1bHQgdHJlZS4KLSAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24KLSAgICogQHNlZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVFByb2Nlc3NvciNwcm9jZXNzKG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUSW5wdXRTb3VyY2UsIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUSW5wdXRTb3VyY2UsIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUmVzdWx0VGFyZ2V0KQotICAgKi8KLSAgcHVibGljIHZvaWQgcHJvY2VzcyggWFNMVFByb2Nlc3NvciBpcHJvY2Vzc29yLCBYU0xUSW5wdXRTb3VyY2UgeG1sU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBYU0xUUmVzdWx0VGFyZ2V0IG91dHB1dFRhcmdldCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLAotICAgICAgICAgICBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgSU9FeGNlcHRpb24KLSAgewotICAgIHByb2Nlc3MoaXByb2Nlc3NvciwgaXByb2Nlc3Nvci5nZXRTb3VyY2VUcmVlRnJvbUlucHV0KHhtbFNvdXJjZSksIG91dHB1dFRhcmdldCk7Ci0gIH0KLQotICAvKioKLSAgICogVHJhbnNmb3JtIHRoZSBYTUwgc291cmNlIHRyZWUgKGEgRE9NIE5vZGUpIGFuZCBwbGFjZSB0aGUgb3V0cHV0IGluIHRoZSByZXN1bHQgdHJlZSB0YXJnZXQuCi0gICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QuIFlvdSBjYW4gYWxzbyB1c2UgYSBET00gTm9kZSB0byBpbnN0YW50aWF0ZSBhbiBYU0xUSW5wdXRTb3VyY2Ugb2JqZWN0LAotICAgKiBhbmQgY2FsbCB7QGxpbmsgI3Byb2Nlc3Mob3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3IsIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUSW5wdXRTb3VyY2UsIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUmVzdWx0VGFyZ2V0KX0gb3IKLSAgICoge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yI3Byb2Nlc3Mob3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZSwgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZSwgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRSZXN1bHRUYXJnZXQpfS4KLSAgICogQHBhcmFtIGlwcm9jZXNzb3IgIFRoZSBwcm9jZXNzb3IgdGhhdCB3aWxsIHRyYWNrIHRoZSBydW5uaW5nIHN0YXRlLgotICAgKiBAcGFyYW0gc291cmNlVHJlZSAgVGhlIGlucHV0IHNvdXJjZSB0cmVlIGluIHRoZSBmb3JtIG9mIGEgRE9NIE5vZGUuCi0gICAqIEBwYXJhbSBvdXRwdXRUYXJnZXQgVGhlIG91dHB1dCByZXN1bHQgdHJlZS4KLSAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3MoIFhTTFRQcm9jZXNzb3IgaXByb2Nlc3NvciwgTm9kZSBzb3VyY2VUcmVlLAotICAgICAgICAgICAgICAgICAgICAgICBYU0xUUmVzdWx0VGFyZ2V0IG91dHB1dFRhcmdldCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLAotICAgICAgICAgICBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgSU9FeGNlcHRpb24KLSAgewotICAgIFhTTFRFbmdpbmVJbXBsIHByb2Nlc3NvciA9IChYU0xURW5naW5lSW1wbClpcHJvY2Vzc29yOyAvLyBUT0RPOiBDaGVjayBmb3IgY2xhc3MgY2FzdCBleGNlcHRpb24KLQkJLy9jaGVja0luaXQocHJvY2Vzc29yKTsKLSAgICBzeW5jaHJvbml6ZWQocHJvY2Vzc29yKQotICAgIHsKLSAgICAgIC8vcHJvY2Vzc29yLnN3aXRjaExpYWlzb25zSWZOZWVkZWQoc291cmNlVHJlZSwgb3V0cHV0VGFyZ2V0LmdldE5vZGUoKSk7Ci0KLSAgICAgIHByb2Nlc3Nvci5zZXRTdHlsZXNoZWV0KHRoaXMpOwotCi0gICAgICBPdXRwdXRTdHJlYW0gb3N0cmVhbSA9IG51bGw7Ci0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBEb3VibGUtY2hlY2sgdGhlIG5vZGUgdG8gbWFrZSBzdXJlIGl0IG1hdGNoZXMgdGhlIHByb2Nlc3NvciBsaWFpc29uLgotICAgICAgICAvL3Byb2Nlc3Nvci5nZXRYTUxQcm9jZXNzb3JMaWFpc29uKCkuY2hlY2tOb2RlKHNvdXJjZVRyZWUpOwotCi0gICAgICAgIC8vIE5lZWRzIHdvcms6IFdlIGhhdmUgdG8gcHV0IHRoZSBleHRlbnNpb24gbmFtZXNwYWNlcwotICAgICAgICAvLyBpbnRvIHRoZSBsaWFpc29uJ3MgdGFibGUuICBXZSB3b3VsZG4ndCBoYXZlIHRvIGRvIHRoaXMKLSAgICAgICAgLy8gaWYgdGhlIHN0eWxlc2hlZXQgaGFuZGxlZCBpdCdzIG93biBleHRlbnNpb25zLCB3aGljaAotICAgICAgICAvLyBJJ2xsIGZpeCBvbiBhIGxhdGVyIGRhdGUuCi0gIC8qICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1fZXh0ZW5zaW9uTmFtZXNwYWNlcy5rZXlzKCk7Ci0gICAgICAgIHdoaWxlKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHV0dGluZyBleHQgbmFtZXNwYWNlOiAiK2tleSk7Ci0gICAgICAgICAgcHJvY2Vzc29yLmdldEV4ZWNDb250ZXh0KCkuYWRkRXh0ZW5zaW9uTmFtZXNwYWNlICgoU3RyaW5nKWtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFeHRlbnNpb25GdW5jdGlvbkhhbmRsZXIpbV9leHRlbnNpb25OYW1lc3BhY2VzLmdldChrZXkpKTsKLSAgICAgICAgfSovCi0KLSAgICAgICAgLy8gRmluZCB0aGUgcm9vdCBwYXR0ZXJuIGluIHRoZSBYU0wuCi0gICAgICAgIEVsZW1UZW1wbGF0ZSByb290UnVsZSA9IG1fc1Jvb3RPYmplY3QuZ2V0VGVtcGxhdGVDb21wb3NlZChwcm9jZXNzb3IuZ2V0VHJhbnNmb3JtZXIoKS5nZXRYUGF0aENvbnRleHQoKSwgc291cmNlVHJlZSwgbnVsbCwgLTEsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZmluZFRlbXBsYXRlKHByb2Nlc3Nvciwgc291cmNlVHJlZSwgc291cmNlVHJlZSk7Ci0KLSAgICAgICAgaWYobnVsbCA9PSByb290UnVsZSkKLSAgICAgICAgewotICAgICAgICAgIHJvb3RSdWxlID0gbV9zUm9vdE9iamVjdC5nZXREZWZhdWx0Um9vdFJ1bGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIERvY3VtZW50SGFuZGxlciBkb2NIYW5kbGVyID0gb3V0cHV0VGFyZ2V0LmdldERvY3VtZW50SGFuZGxlcigpOwotCi0gICAgICAgIE91dHB1dEZvcm1hdCBmb3JtYXR0ZXIgPSBnZXRPdXRwdXRGb3JtYXQoKTsKLQotICAgICAgICBpZihudWxsICE9IG91dHB1dFRhcmdldC5nZXRFbmNvZGluZygpKQotICAgICAgICAgIGZvcm1hdHRlci5zZXRFbmNvZGluZyhvdXRwdXRUYXJnZXQuZ2V0RW5jb2RpbmcoKSk7Ci0KLSAgICAgICAgaWYobnVsbCAhPSBkb2NIYW5kbGVyKQotICAgICAgICB7Ci0gICAgICAgICAgcHJvY2Vzc29yLnNldERvY3VtZW50SGFuZGxlcihkb2NIYW5kbGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG51bGwgIT0gb3V0cHV0VGFyZ2V0LmdldEJ5dGVTdHJlYW0oKSkKLSAgICAgICAgewotICAgICAgICAgLyogaWYgKCEocHJvY2Vzc29yLmdldFhNTFByb2Nlc3NvckxpYWlzb24oKS4uZ2V0SW5kZW50KCkgPCAwKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIHRvIGdldCBhcm91bmQgZGlmZmVyZW5jZXMgYmV0d2VlbiBYYWxhbiBhbmQgWGVyY2VzLgotICAgICAgICAgICAgLy8gWGFsYW4gdXNlcyAtMSBhcyBkZWZhdWx0IGZvciBubyBpbmRlbnRpbmcsIFhlcmNlcyB1c2VzIDAuCi0gICAgICAgICAgICAvLyBTbyB3ZSBqdXN0IGJ1bXAgdXAgdGhlIGluZGVudCB2YWx1ZSBoZXJlIGJlY2F1c2Ugd2Ugd2lsbAotICAgICAgICAgICAgLy8gc3VidHJhY3QgZnJvbSBpdCBhdCBvdXRwdXQgdGltZSAoRm9ybWF0dGVyVG9YTUwuaW5pdCgpKTsKLSAgICAgICAgICAgIGZvcm1hdHRlci5zZXRJbmRlbnQocHJvY2Vzc29yLm1fcGFyc2VyTGlhaXNvbi5nZXRJbmRlbnQoKSArIDEpOwotICAgICAgICAgIH0qLwotICAgICAgICAgIHByb2Nlc3Nvci5zZXREb2N1bWVudEhhbmRsZXIobWFrZVNBWFNlcmlhbGl6ZXIob3V0cHV0VGFyZ2V0LmdldEJ5dGVTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobnVsbCAhPSBvdXRwdXRUYXJnZXQuZ2V0Q2hhcmFjdGVyU3RyZWFtKCkpCi0gICAgICAgIHsKLSAgICAgICAgLyogIGlmICghKHByb2Nlc3Nvci5tX3BhcnNlckxpYWlzb24uZ2V0SW5kZW50KCkgPCAwKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3JtYXR0ZXIuc2V0SW5kZW50KHByb2Nlc3Nvci5tX3BhcnNlckxpYWlzb24uZ2V0SW5kZW50KCkgKyAxKTsKLSAgICAgICAgICB9Ki8KLSAgICAgICAgICBwcm9jZXNzb3Iuc2V0RG9jdW1lbnRIYW5kbGVyKG1ha2VTQVhTZXJpYWxpemVyKG91dHB1dFRhcmdldC5nZXRDaGFyYWN0ZXJTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobnVsbCAhPSBvdXRwdXRUYXJnZXQuZ2V0RmlsZU5hbWUoKSkKLSAgICAgICAgewotICAgICAgICAgIC8qaWYgKCEocHJvY2Vzc29yLm1fcGFyc2VyTGlhaXNvbi5nZXRJbmRlbnQoKSA8IDApKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvcm1hdHRlci5zZXRJbmRlbnQocHJvY2Vzc29yLm1fcGFyc2VyTGlhaXNvbi5nZXRJbmRlbnQoKSArIDEpOwotICAgICAgICAgIH0qLwotICAgICAgICAgIG9zdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRUYXJnZXQuZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICAgICAgcHJvY2Vzc29yLnNldERvY3VtZW50SGFuZGxlciggbWFrZVNBWFNlcmlhbGl6ZXIob3N0cmVhbSwgZm9ybWF0dGVyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihudWxsICE9IG91dHB1dFRhcmdldC5nZXROb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBQYXJzZXJBZGFwdGVyIGhhbmRsZXIgPSBuZXcgUGFyc2VyQWRhcHRlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7Ci0gICAgICAgICAgLy8gUGF0Y2ggZnJvbSBDb3N0aW4gTWFub2xhY2hlCi0vLyAgICAgICAgICBpZiggIm9yZy5hcGFjaGUueGFsYW4ueHBhdGguZHRtLkRUTUxpYWlzb24iLmVxdWFscyggcHJvY2Vzc29yLmdldFhNTFByb2Nlc3NvckxpYWlzb24oKS5nZXRDbGFzcygpLmdldE5hbWUoKSkpCi0vLyAgICAgICAgICAgIHByb2Nlc3Nvci5lcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJfQ0FOVF9VU0VfRFRNX0ZPUl9PVVRQVVQpOyAvL0Nhbid0IHVzZSBhIERUTUxpYWlzb24gZm9yIGFuIG91dHB1dCBET00gbm9kZS4uLiBwYXNzIGEgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54ZG9tLlhlcmNlc0xpYWlzb24gaW5zdGVhZCEiKTsKLSAgICAgICAgICAKLSAgICAgICAgICBzd2l0Y2gob3V0cHV0VGFyZ2V0LmdldE5vZGUoKS5nZXROb2RlVHlwZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERTogICAgICAgICAgICAKLSAgICAgICAgICAgIGhhbmRsZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IEZvcm1hdHRlclRvRE9NKChEb2N1bWVudClvdXRwdXRUYXJnZXQuZ2V0Tm9kZSgpKS5nZXRTZXJpYWxpemVyT2JqZWN0KCkpOwotICAgICAgICAgICAgcHJvY2Vzc29yLnNldERvY3VtZW50SGFuZGxlcihoYW5kbGVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgotICAgICAgICAgICAgaGFuZGxlci5zZXRDb250ZW50SGFuZGxlcihuZXcgRm9ybWF0dGVyVG9ET00ob3V0cHV0VGFyZ2V0LmdldE5vZGUoKS5nZXRPd25lckRvY3VtZW50KCksIC8vIFBSOkRNQU40TTZQSzUgU3VibWl0dGVkIGJ5Ojxia0B2aWFlLmRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEb2N1bWVudEZyYWdtZW50KW91dHB1dFRhcmdldC5nZXROb2RlKCkpLmdldFNlcmlhbGl6ZXJPYmplY3QoKSk7Ci0gICAgICAgICAgICBwcm9jZXNzb3Iuc2V0RG9jdW1lbnRIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLSAgICAgICAgICAgIGhhbmRsZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IEZvcm1hdHRlclRvRE9NKG91dHB1dFRhcmdldC5nZXROb2RlKCkuZ2V0T3duZXJEb2N1bWVudCgpLCAvLyBQUjpETUFONE02UEs1IFN1Ym1pdHRlZCBieTo8YmtAdmlhZS5kZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRWxlbWVudClvdXRwdXRUYXJnZXQuZ2V0Tm9kZSgpKS5nZXRTZXJpYWxpemVyT2JqZWN0KCkpOwotICAgICAgICAgICAgcHJvY2Vzc29yLnNldERvY3VtZW50SGFuZGxlcihoYW5kbGVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtX3NSb290T2JqZWN0LmVycm9yKFhTTFRFcnJvclJlc291cmNlcy5FUl9DQU5fT05MWV9PVVRQVVRfVE9fRUxFTUVOVCk7IC8vIkNhbiBvbmx5IG91dHB1dCB0byBhbiBFbGVtZW50LCBEb2N1bWVudEZyYWdtZW50LCBEb2N1bWVudCwgb3IgUHJpbnRXcml0ZXIuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFBhcnNlckFkYXB0ZXIgaGFuZGxlciA9IG5ldyBQYXJzZXJBZGFwdGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICAgICAgICBvdXRwdXRUYXJnZXQuc2V0Tm9kZShwcm9jZXNzb3IuZ2V0WE1MUHJvY2Vzc29yTGlhaXNvbigpLmNyZWF0ZURvY3VtZW50KCkpOwotICAgICAgICAgIGhhbmRsZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IEZvcm1hdHRlclRvRE9NKChEb2N1bWVudClvdXRwdXRUYXJnZXQuZ2V0Tm9kZSgpKS5nZXRTZXJpYWxpemVyT2JqZWN0KCkpOwotICAgICAgICAgIHByb2Nlc3Nvci5zZXREb2N1bWVudEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICAgIH0KLQotICAgICAgIC8vIHByb2Nlc3Nvci5yZXNldEN1cnJlbnRTdGF0ZShzb3VyY2VUcmVlKTsKLSAgICAgICAvLyBwcm9jZXNzb3IubV9yb290RG9jID0gc291cmNlVHJlZTsKLQotICAgICAgICBpZihudWxsICE9IHByb2Nlc3Nvci5tX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBwcm9jZXNzb3IuZGlhZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICBwcm9jZXNzb3IuZGlhZygiVHJhbnNmb3JtaW5nLi4uIik7Ci0gICAgICAgICAgcHJvY2Vzc29yLnB1c2hUaW1lKHNvdXJjZVRyZWUpOwotICAgICAgICB9Ci0KLSAgICAgICAvLyBwcm9jZXNzb3IuZ2V0VmFyU3RhY2soKS5wdXNoQ29udGV4dE1hcmtlcigpOwotICAgICAgLy8gIHRyeQotICAgICAgLy8gIHsKLSAgICAgIC8vICAgIHByb2Nlc3Nvci5yZXNvbHZlVG9wTGV2ZWxQYXJhbXMoKTsKLSAgICAgIC8vICB9Ci0gICAgICAvLyAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAvLyAgewotICAgICAgLy8gICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihYU0xNZXNzYWdlcy5jcmVhdGVNZXNzYWdlKFhTTFRFcnJvclJlc291cmNlcy5FUl9QUk9DRVNTX0VSUk9SLCBudWxsKSwgZSk7IC8vIlN0eWxlc2hlZXRSb290LnByb2Nlc3MgZXJyb3IiLCBlKTsKLSAgICAgIC8vICB9Ci0KLSAgICAgICAgcHJvY2Vzc29yLmdldFRyYW5zZm9ybWVyKCkuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKS5zdGFydERvY3VtZW50KCk7Ci0KLSAgICAgICAgLy8gT3V0cHV0IHRoZSBhY3Rpb24gb2YgdGhlIGZvdW5kIHJvb3QgcnVsZS4gIEFsbCBwcm9jZXNzaW5nCi0gICAgICAgIC8vIG9jY3VycyBmcm9tIGhlcmUuICBidWlsZFJlc3VsdEZyb21UZW1wbGF0ZSBpcyBoaWdobHkgcmVjdXJzaXZlLgotICAgICAgICByb290UnVsZS5leGVjdXRlKHByb2Nlc3Nvci5nZXRUcmFuc2Zvcm1lcigpLCBzb3VyY2VUcmVlLCBudWxsKTsKLQotICAgICAgICAgcHJvY2Vzc29yLmdldFRyYW5zZm9ybWVyKCkuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKS5lbmREb2N1bWVudCgpOwotCi0gICAgICAgIC8vIFJlc2V0IHRoZSB0b3AtbGV2ZWwgcGFyYW1zIGZvciB0aGUgbmV4dCByb3VuZC4KLSAgICAgICAgLy8gcHJvY2Vzc29yLm1fdG9wTGV2ZWxQYXJhbXMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAgICAgaWYobnVsbCAhPSBwcm9jZXNzb3IubV9kaWFnbm9zdGljc1ByaW50V3JpdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgcHJvY2Vzc29yLmRpc3BsYXlEdXJhdGlvbigidHJhbnNmb3JtIiwgc291cmNlVHJlZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHRlKTsKLSAgICAgIH0gIAotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBpZiAobnVsbCAhPSBvc3RyZWFtKQotICAgICAgICB7Ci0gICAgICAgICAgb3N0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgY29tcGF0aWJsZSBTQVggc2VyaWFsaXplciBmb3IgdGhlIHNwZWNpZmllZCB3cml0ZXIKLSAgICogYW5kIG91dHB1dCBmb3JtYXQuIElmIHRoZSBvdXRwdXQgZm9ybWF0IGlzIG1pc3NpbmcsIHRoZSBkZWZhdWx0Ci0gICAqIGlzIGFuIFhNTCBmb3JtYXQgd2l0aCBVVEY4IGVuY29kaW5nLgotICAgKgotICAgKiBAcGFyYW0gd3JpdGVyIFRoZSB3cml0ZXIKLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgb3V0cHV0IGZvcm1hdAotICAgKiBAcmV0dXJuIEEgY29tcGF0aWJsZSBTQVggc2VyaWFsaXplcgotICAgKi8KLSAgcHVibGljIERvY3VtZW50SGFuZGxlciBtYWtlU0FYU2VyaWFsaXplciggV3JpdGVyIHdyaXRlciwgT3V0cHV0Rm9ybWF0IGZvcm1hdCApCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gCi0gIHsKLSAgICBEb2N1bWVudEhhbmRsZXIgaGFuZGxlcjsKLSAgICBpZiAoIGZvcm1hdCA9PSBudWxsICkKLSAgICB7Ci0gICAgICBmb3JtYXQgPSBuZXcgT3V0cHV0Rm9ybWF0KCAieG1sIiwgIlVURi04IiwgZmFsc2UgKTsKLSAgICAgIGhhbmRsZXIgPSBudWxsOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIGhhbmRsZXIgPSBuZXcgUGFyc2VyQWRhcHRlcihuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKSk7Ci0gICAgICBPdXRwdXRQcm9wZXJ0aWVzIHByb3BzID0gbV9zUm9vdE9iamVjdC5nZXRPdXRwdXRDb21wb3NlZCgpOwotICAgICAgCi0gICAgICBpZiAoIGZvcm1hdC5nZXRNZXRob2QoKS5lcXVhbHNJZ25vcmVDYXNlKCAiaHRtbCIgKSApCi0gICAgICB7Ci0gICAgICAgIEZvcm1hdHRlclRvSFRNTCBzZXJpYWxpemVyID0gbmV3IEZvcm1hdHRlclRvSFRNTCh3cml0ZXIpOwotICAgICAgICBzZXJpYWxpemVyLmdldFNlcmlhbGl6ZXJPYmplY3QoKS5zZXRPdXRwdXRGb3JtYXQocHJvcHMuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgKChQYXJzZXJBZGFwdGVyKWhhbmRsZXIpLnNldENvbnRlbnRIYW5kbGVyKHNlcmlhbGl6ZXIuZ2V0U2VyaWFsaXplck9iamVjdCgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBmb3JtYXQuZ2V0TWV0aG9kKCkuZXF1YWxzSWdub3JlQ2FzZSggInhtbCIgKSApCi0gICAgICB7Ci0gICAgICAgIEZvcm1hdHRlclRvWE1MIHNlcmlhbGl6ZXIgPSBuZXcgRm9ybWF0dGVyVG9YTUwod3JpdGVyKTsKLSAgICAgICAgc2VyaWFsaXplci5nZXRTZXJpYWxpemVyT2JqZWN0KCkuc2V0T3V0cHV0Rm9ybWF0KHByb3BzLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICgoUGFyc2VyQWRhcHRlciloYW5kbGVyKS5zZXRDb250ZW50SGFuZGxlcihzZXJpYWxpemVyLmdldFNlcmlhbGl6ZXJPYmplY3QoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggZm9ybWF0LmdldE1ldGhvZCgpLmVxdWFsc0lnbm9yZUNhc2UoICJ0ZXh0IiApICkKLSAgICAgIHsKLSAgICAgICAgRm9ybWF0dGVyVG9UZXh0IHNlcmlhbGl6ZXIgPSBuZXcgRm9ybWF0dGVyVG9UZXh0KHdyaXRlcik7IAotICAgICAgICAoKFBhcnNlckFkYXB0ZXIpaGFuZGxlcikuc2V0Q29udGVudEhhbmRsZXIoc2VyaWFsaXplci5nZXRTZXJpYWxpemVyT2JqZWN0KCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBoYW5kbGVyID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYobnVsbCA9PSBoYW5kbGVyKQotICAgIHsKLSAgICAgIFN0cmluZyBtZXRob2QgPSBmb3JtYXQuZ2V0TWV0aG9kKCk7Ci0gICAgICBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuU2VyaWFsaXplckZhY3RvcnkgZmFjdG9yeSA9IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5TZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyRmFjdG9yeShtZXRob2QpOwotICAgICAgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLlNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IGZhY3RvcnkubWFrZVNlcmlhbGl6ZXIod3JpdGVyLCBmb3JtYXQpOwotICAgICAgaGFuZGxlciA9IHNlcmlhbGl6ZXIuYXNEb2N1bWVudEhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaGFuZGxlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBjb21wYXRpYmxlIFNBWCBzZXJpYWxpemVyIGZvciB0aGUgc3BlY2lmaWVkIG91dHB1dCBzdHJlYW0KLSAgICogYW5kIG91dHB1dCBmb3JtYXQuIElmIHRoZSBvdXRwdXQgZm9ybWF0IGlzIG1pc3NpbmcsIHRoZSBkZWZhdWx0Ci0gICAqIGlzIGFuIFhNTCBmb3JtYXQgd2l0aCBVVEY4IGVuY29kaW5nLgotICAgKgotICAgKiBAcGFyYW0gb3N0cmVhbSBUaGUgb3V0cHV0IHN0cmVhbS4KLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgb3V0cHV0IGZvcm1hdAotICAgKiBAcmV0dXJuIEEgY29tcGF0aWJsZSBTQVggc2VyaWFsaXplcgotICAgKi8KLSAgcHVibGljIERvY3VtZW50SGFuZGxlciBtYWtlU0FYU2VyaWFsaXplciggT3V0cHV0U3RyZWFtIG9zdHJlYW0sIE91dHB1dEZvcm1hdCBmb3JtYXQgKQotICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBEb2N1bWVudEhhbmRsZXIgaGFuZGxlcjsKLSAgICBPdXRwdXRQcm9wZXJ0aWVzIHByb3BzOwotICAgICAgICAKLSAgICBpZiAoIGZvcm1hdCA9PSBudWxsICkKLSAgICB7Ci0gICAgICBwcm9wcyA9IG5ldyBPdXRwdXRQcm9wZXJ0aWVzKCk7Ci0gICAgICBoYW5kbGVyID0gbnVsbDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgCi0gICAgICBoYW5kbGVyID0gbmV3IFBhcnNlckFkYXB0ZXIobmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCkpOwotICAgICAgcHJvcHMgPSBtX3NSb290T2JqZWN0LmdldE91dHB1dENvbXBvc2VkKCk7Ci0gICAgICBpZiAoIGZvcm1hdC5nZXRNZXRob2QoKS5lcXVhbHNJZ25vcmVDYXNlKCAiaHRtbCIgKSApCi0gICAgICB7Ci0gICAgICAgIEZvcm1hdHRlclRvSFRNTCBzZXJpYWxpemVyID0gbmV3IEZvcm1hdHRlclRvSFRNTChvc3RyZWFtKTsKLSAgICAgICAgc2VyaWFsaXplci5nZXRTZXJpYWxpemVyT2JqZWN0KCkuc2V0T3V0cHV0Rm9ybWF0KHByb3BzLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICgoUGFyc2VyQWRhcHRlciloYW5kbGVyKS5zZXRDb250ZW50SGFuZGxlcihzZXJpYWxpemVyLmdldFNlcmlhbGl6ZXJPYmplY3QoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggZm9ybWF0LmdldE1ldGhvZCgpLmVxdWFsc0lnbm9yZUNhc2UoICJ4bWwiICkgKQotICAgICAgewotICAgICAgICBGb3JtYXR0ZXJUb1hNTCBzZXJpYWxpemVyID0gbmV3IEZvcm1hdHRlclRvWE1MKG9zdHJlYW0pOwotICAgICAgICBzZXJpYWxpemVyLmdldFNlcmlhbGl6ZXJPYmplY3QoKS5zZXRPdXRwdXRGb3JtYXQocHJvcHMuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgKChQYXJzZXJBZGFwdGVyKWhhbmRsZXIpLnNldENvbnRlbnRIYW5kbGVyKHNlcmlhbGl6ZXIuZ2V0U2VyaWFsaXplck9iamVjdCgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBmb3JtYXQuZ2V0TWV0aG9kKCkuZXF1YWxzSWdub3JlQ2FzZSggInRleHQiICkgKQotICAgICAgewotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBmb3JtYXQuZ2V0RW5jb2RpbmcoKTsKLSAgICAgICAgaWYobnVsbCA9PSBlbmNvZGluZykKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IChudWxsICE9IGVuY29kaW5nKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLkVuY29kaW5ncy5jb252ZXJ0SmF2YTJNaW1lRW5jb2RpbmcoIGVuY29kaW5nICkgOiAiQVNDSUkiOwotICAgICAgICAgICAgaWYobnVsbCA9PSBlbmNvZGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZW5jb2RpbmcgPSAiQVNDSUkiOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBzZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9ICJBU0NJSSI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy90aGlzLm1fZW5jb2RpbmcgPSAgIGVuY29kaW5nOwotCi0gICAgICAgIFN0cmluZyBqYXZhRW5jb2RpbmcgPSBvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZS5FbmNvZGluZ3MuY29udmVydE1pbWUySmF2YUVuY29kaW5nKGVuY29kaW5nKTsKLQotICAgICAgICBXcml0ZXIgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG9zdHJlYW0sIGphdmFFbmNvZGluZyApOwotICAgICAgICAoKFBhcnNlckFkYXB0ZXIpaGFuZGxlcikuc2V0Q29udGVudEhhbmRsZXIobmV3IEZvcm1hdHRlclRvVGV4dCh3KS5nZXRTZXJpYWxpemVyT2JqZWN0KCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGZvcm1hdC5nZXRNZXRob2QoKS5lcXVhbHNJZ25vcmVDYXNlKCAieGh0bWwiICkgKQotICAgICAgewotICAgICAgICBoYW5kbGVyID0gbmV3IFhNTFNlcmlhbGl6ZXIob3N0cmVhbSwgZm9ybWF0KTsKLSAgICAgICAgLy9oYW5kbGVyID0gU2VyaWFsaXplci5tYWtlU0FYU2VyaWFsaXplcihvc3RyZWFtLCBmb3JtYXQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBoYW5kbGVyID0gbmV3IFhNTFNlcmlhbGl6ZXIob3N0cmVhbSwgZm9ybWF0KTsKLSAgICAgICAgLy9oYW5kbGVyID0gU2VyaWFsaXplci5tYWtlU0FYU2VyaWFsaXplcihvc3RyZWFtLCBmb3JtYXQpOwotICAgICAgfQotICAgIH0KLSAgICBpZihudWxsID09IGhhbmRsZXIpCi0gICAgewotICAgICAgU3RyaW5nIG1ldGhvZCA9IHByb3BzLmdldFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9EKTsKLSAgICAgIG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5TZXJpYWxpemVyRmFjdG9yeSBmYWN0b3J5ID0gb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLlNlcmlhbGl6ZXJGYWN0b3J5LmdldFNlcmlhbGl6ZXJGYWN0b3J5KG1ldGhvZCk7Ci0gICAgICBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuU2VyaWFsaXplciBzZXJpYWxpemVyID0gZmFjdG9yeS5tYWtlU2VyaWFsaXplcihvc3RyZWFtLCBmb3JtYXQpOwotICAgICAgaGFuZGxlciA9IHNlcmlhbGl6ZXIuYXNEb2N1bWVudEhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaGFuZGxlcjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgY29tcGF0aWJsZSBTQVggc2VyaWFsaXplciBmb3IgdGhlIHNwZWNpZmllZCBvdXRwdXQgc3RyZWFtCi0gICAqIGFuZCBvdXRwdXQgZm9ybWF0LiBJZiB0aGUgb3V0cHV0IGZvcm1hdCBpcyBtaXNzaW5nLCB0aGUgZGVmYXVsdAotICAgKiBpcyBhbiBYTUwgZm9ybWF0IHdpdGggVVRGOCBlbmNvZGluZy4KLSAgICoKLSAgICogQHBhcmFtIG9zdHJlYW0gVGhlIG91dHB1dCBzdHJlYW0uCi0gICAqIEByZXR1cm4gQSBjb21wYXRpYmxlIFNBWCBzZXJpYWxpemVyCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnRIYW5kbGVyIGdldFNBWFNlcmlhbGl6ZXIoIE91dHB1dFN0cmVhbSBvc3RyZWFtICkKLSAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbgotICB7Ci0gICByZXR1cm4gbWFrZVNBWFNlcmlhbGl6ZXIob3N0cmVhbSwgZ2V0T3V0cHV0Rm9ybWF0KCkpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGEgbmV3IE91dHB1dEZvcm1hdCBvYmplY3QgYWNjb3JkaW5nIHRvIHRoZSB4c2w6b3V0cHV0IGF0dHJpYnV0ZXMuCi0gICAqLwotICBwdWJsaWMgT3V0cHV0Rm9ybWF0IGdldE91dHB1dEZvcm1hdCgpCi0gIHsKLSAgICBPdXRwdXRQcm9wZXJ0aWVzIG91dHB1dEZvcm1hdCA9IG1fc1Jvb3RPYmplY3QuZ2V0T3V0cHV0Q29tcG9zZWQoKTsKLSAgICBpZiAob3V0cHV0Rm9ybWF0ID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBPdXRwdXRGb3JtYXQgZm9ybWF0dGVyID0gbmV3IE91dHB1dEZvcm1hdChvdXRwdXRGb3JtYXQuZ2V0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdC5nZXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRQcm9wZXJ0aWVzLmdldEJvb2xlYW5Qcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgb3V0cHV0Rm9ybWF0LmdldFByb3BlcnRpZXMoKSkpOwotICAgIGZvcm1hdHRlci5zZXREb2N0eXBlKG91dHB1dEZvcm1hdC5nZXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfUFVCTElDKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LmdldFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9TWVNURU0pKTsKLSAgICBmb3JtYXR0ZXIuc2V0T21pdFhNTERlY2xhcmF0aW9uKE91dHB1dFByb3BlcnRpZXMuZ2V0Qm9vbGVhblByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sIG91dHB1dEZvcm1hdC5nZXRQcm9wZXJ0aWVzKCkpKTsKLSAgICBmb3JtYXR0ZXIuc2V0U3RhbmRhbG9uZShPdXRwdXRQcm9wZXJ0aWVzLmdldEJvb2xlYW5Qcm9wZXJ0eShPdXRwdXRLZXlzLlNUQU5EQUxPTkUsIG91dHB1dEZvcm1hdC5nZXRQcm9wZXJ0aWVzKCkpKTsKLSAgICBmb3JtYXR0ZXIuc2V0TWVkaWFUeXBlKG91dHB1dEZvcm1hdC5nZXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FRElBX1RZUEUpKTsKLSAgICBmb3JtYXR0ZXIuc2V0VmVyc2lvbihvdXRwdXRGb3JtYXQuZ2V0UHJvcGVydHkoT3V0cHV0S2V5cy5WRVJTSU9OKSk7Ci0gICAgLy8gVGhpcyBpcyB0byBnZXQgYXJvdW5kIGRpZmZlcmVuY2VzIGJldHdlZW4gWGFsYW4gYW5kIFhlcmNlcy4KLSAgICAvLyBYYWxhbiB1c2VzIC0xIGFzIGRlZmF1bHQgZm9yIG5vIGluZGVudGluZywgWGVyY2VzIHVzZXMgMC4KLSAgICAvLyBTbyB3ZSBqdXN0IGJ1bXAgdXAgdGhlIGluZGVudCB2YWx1ZSBoZXJlIGJlY2F1c2Ugd2Ugd2lsbAotICAgIC8vIHN1YnRyYWN0IGZyb20gaXQgYXQgb3V0cHV0IHRpbWUgKEZvcm1hdHRlclRvWE1MLmluaXQoKSk7Ci0gICAvLyBpZiAoZ2V0T3V0cHV0SW5kZW50KCkpCi0gICAvLyAgIGZvcm1hdHRlci5zZXRJbmRlbnQoZm9ybWF0dGVyLmdldEluZGVudCgpKzEpOwotCi0gICAgCi0gICAgcmV0dXJuIGZvcm1hdHRlcjsKLSAgfQotICAKLSAgLyoqIAotICAgKiBHZXQgdGhlIGVuY29kaW5nIHN0cmluZyB0aGF0IHdhcyBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlc2hlZXQuIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRFbmNvZGluZygpCi0gIHsKLSAgICByZXR1cm4gbV9zUm9vdE9iamVjdC5nZXRPdXRwdXRDb21wb3NlZCgpLmdldFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcpOwotICB9Ci0KLSAgLyoqIAotICAgKiBHZXQgdGhlIG1lZGlhLXR5cGUgc3RyaW5nIHRoYXQgd2FzIHNwZWNpZmllZCBpbiB0aGUgc3R5bGVzaGVldC4gCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dE1lZGlhVHlwZSgpIAotICB7IAotICAgIHJldHVybiBtX3NSb290T2JqZWN0LmdldE91dHB1dENvbXBvc2VkKCkuZ2V0UHJvcGVydHkoT3V0cHV0S2V5cy5NRURJQV9UWVBFKTsgCi0gIH0KLSAgCi0gIC8qKiAKLSAgICogR2V0IHRoZSBvdXRwdXQgbWV0aG9kIHRoYXQgd2FzIHNwZWNpZmllZCBpbiB0aGUgc3R5bGVzaGVldC4gCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dE1ldGhvZCgpIAotICB7IAotICAgIHJldHVybiBtX3NSb290T2JqZWN0LmdldE91dHB1dENvbXBvc2VkKCkuZ2V0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QpOyAKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgYmFzZSBpZGVudGlmaWVyIHdpdGggd2hpY2ggdGhpcyBzdHlsZXNoZWV0IGlzIGFzc29jaWF0ZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEJhc2VJZGVudGlmaWVyKCkKLSAgewotICAgIHJldHVybiBtX3NSb290T2JqZWN0LmdldEJhc2VJZGVudGlmaWVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBiYXNlIGlkZW50aWZpZXIgd2l0aCB3aGljaCB0aGlzIHN0eWxlc2hlZXQgaXMgYXNzb2NpYXRlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEJhc2VJZGVudGlmaWVyKFN0cmluZyBiYXNlSWRlbnQpCi0gIHsKLSAgICBtX3NSb290T2JqZWN0LnNldEhyZWYoYmFzZUlkZW50KTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXRTcGVjLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9TdHlsZXNoZWV0U3BlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTVkODM3Li4wMDAwMDAwCi0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1N0eWxlc2hlZXRTcGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHNsdDsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhIHN0eWxlc2hlZXQgCi0gKiBzcGVjaWZpY2F0aW9uIHZpYSB4bWwtc3R5bGVzaGVldCBpbiBhbiBYTUwgZG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZXNoZWV0U3BlYyBleHRlbmRzIFN0cmVhbVNvdXJjZQotewotICBTdHJpbmcgdHlwZTsgLy8gQ0RBVEEgI1JFUVVJUkVECi0gIFN0cmluZyB0aXRsZTsgLy8gQ0RBVEEgI0lNUExJRUQKLSAgU3RyaW5nIG1lZGlhOyAvLyBDREFUQSAjSU1QTElFRAotICBTdHJpbmcgZW5jb2Rpbmc7IC8vIENEQVRBICNJTVBMSUVECi0gIGJvb2xlYW4gYWx0ZXJuYXRlOyAvLyAoeWVzfG5vKSAibm8iCi0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgU3R5bGVzaGVldFNwZWMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXRTcGVjKFN0cmluZyBocmVmLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHRpdGxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZWRpYSwgYm9vbGVhbiBhbHRlcm5hdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcpCi0gIHsKLSAgICB0aGlzLnNldFN5c3RlbUlkKGhyZWYpOwotICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB0aGlzLm1lZGlhID0gbWVkaWE7Ci0gICAgdGhpcy5hbHRlcm5hdGUgPSBhbHRlcm5hdGU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGVuY29kaW5nIG9mIHRoZSBzdHlsZXNoZWV0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyAgICAgICBnZXRFbmNvZGluZygpCi0gIHsKLSAgICByZXR1cm4gZW5jb2Rpbmc7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB0eXBlIG9mIHRoZSBzdHlsZXNoZWV0LCBpLmUuICJ0ZXh0L3hzbCIuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nICAgICAgIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHRpdGxlIG9mIHRoZSBlbGVtZW50IChpbiBvdGhlciB3b3JkcywgdGhlIAotICAgKiBpdGVtIHRvIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBhZ2VudCkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nICAgICAgIGdldFRpdGxlKCkKLSAgewotICAgIHJldHVybiB0aXRsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbWVkaWEgYXR0cmlidXRlIG9mIHRoZSBzdHlsZXNoZWV0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyAgICAgICBnZXRNZWRpYSgpCi0gIHsKLSAgICByZXR1cm4gbWVkaWE7Ci0gIH0KLSAgLyoqCi0gICAqIEdldCB3aGV0aGVyIG9yIG5vdCB0aGUgc3R5bGVzaGVldCBpcyBzcGVjaWZpZWQgYXMgCi0gICAqIGFuIGFsdGVybmF0ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuICAgIGdldElzQWx0ZXJuYXRlKCkKLSAgewotICAgIHJldHVybiBhbHRlcm5hdGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFByb2Nlc3NvckNvbnRleHQuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFByb2Nlc3NvckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhMjI5NC4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9YU0xQcm9jZXNzb3JDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSAgCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGw7Ci0KLS8vIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuKjsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogQ2FwdHVyZXMgcHJvY2Vzc29yIGNvbnRleHQgdG8gYmUKLSAqIHBhc3NlZCB0byBhbiBleHRlbnNpb24gZWxlbWVudC4KLSAqCi0gKiBAYXV0aG9yIFNhbmppdmEgV2VlcmF3YXJhbmEgKHNhbmppdmFAd2F0c29uLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xQcm9jZXNzb3JDb250ZXh0IGV4dGVuZHMgb3JnLmFwYWNoZS54YWxhbi5leHRlbnNpb25zLlhTTFByb2Nlc3NvckNvbnRleHQKLXsgCi0gIHB1YmxpYyBYU0xQcm9jZXNzb3JDb250ZXh0IChYU0xURW5naW5lSW1wbCBwcm9jZXNzb3IsCi0JCQkgICAgICBTdHlsZXNoZWV0IHN0eWxlc2hlZXRUcmVlLAotCQkJICAgICAgTm9kZSBzb3VyY2VUcmVlLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpIAotICAgIAotICB7Ci0gICAgc3VwZXIoKFRyYW5zZm9ybWVySW1wbCkocHJvY2Vzc29yLmdldFRyYW5zZm9ybWVyKCkpLAotICAgICAgICAgIHN0eWxlc2hlZXRUcmVlLCAKLSAgICAgICAgICBzb3VyY2VUcmVlLCBzb3VyY2VOb2RlLCBtb2RlKTsKLSAgfQotCi0gIAotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvWFNMVEVuZ2luZUltcGwuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFRFbmdpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDA1MTEuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvWFNMVEVuZ2luZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MjYgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgIAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54c2x0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC4qOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguY29tcGlsZXIuWFBhdGhQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5jb21waWxlci5Db21waWxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLlhPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC5YU3RyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGguWE5vZGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC5YQm9vbGVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLlhOdW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC5YTnVsbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuKjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlBhcnNlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLlhNTFNlcmlhbGl6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UZW1wbGF0ZXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLkVycm9yTGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldDsKLS8vaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRSb290OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLlhNTFBhcnNlckxpYWlzb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuUHJvYmxlbUxpc3RlbmVyRGVmYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5Qcm9ibGVtTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldENvbXBvc2VkOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuVHJhbnNmb3JtZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlN0eWxlc2hlZXRIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGw7Ci0vL2ltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5Qcm9jZXNzb3JTdHlsZXNoZWV0OwotLy9pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54c2x0LlN0eWxlc2hlZXRTcGVjOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnJlcy5YU0xURXJyb3JSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5yZXMuWFNMTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUHJlZml4UmVzb2x2ZXJEZWZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlRyZWVXYWxrZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuRGVmYXVsdEVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnN0cmVlLlNvdXJjZVRyZWVIYW5kbGVyOwotCi0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImFkdmFuY2VkIi8+Ci0gKiBUaGUgWGFsYW4gd29ya2hvcnNlIC0tIENvbGxhYm9yYXRlcyB3aXRoIHRoZSBYTUwgcGFyc2VyIGxpYWlzb24sIHRoZSBET00sCi0gKiBhbmQgdGhlIFhQYXRoIGVuZ2luZSwgdG8gdHJhbnNmb3JtIGEgc291cmNlIHRyZWUgb2Ygbm9kZXMgaW50byBhIHJlc3VsdCB0cmVlCi0gKiBhY2NvcmRpbmcgdG8gaW5zdHJ1Y3Rpb25zIGFuZCB0ZW1wbGF0ZXMgc3BlY2lmaWVkIGJ5IGEgc3R5bGVzaGVldCB0cmVlLgotICogV2Ugc3VnZ2VzdCB5b3UgdXNlIG9uZSBvZiB0aGUKLSAqIHN0YXRpYyBYU0xUUHJvY2Vzc29yRmFjdG9yeSBnZXRQcm9jZXNzb3IoKSBtZXRob2RzIHRvIGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IKLSAqIGFuZCByZXR1cm4gYW4gaW50ZXJmYWNlIHRoYXQgZ3JlYXRseSBzaW1wbGlmaWVzIHRoZSBwcm9jZXNzIG9mIG1hbmlwdWxhdGluZwotICogWFNMVEVuZ2luZUltcGwuCi0gKgotICogPHA+VGhlIG1ldGhvZHMgPGNvZGU+cHJvY2VzcyguLi4pPC9jb2RlPiBhcmUgdGhlIHByaW1hcnkgcHVibGljIGVudHJ5IHBvaW50cy4KLSAqIFRoZSBiZXN0IHdheSB0byBwZXJmb3JtIHRyYW5zZm9ybWF0aW9ucyBpcyB0byB1c2UgdGhlCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3IjcHJvY2VzcyhvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVElucHV0U291cmNlLCBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVElucHV0U291cmNlLCBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVFJlc3VsdFRhcmdldCl9IG1ldGhvZCwKLSAqIGJ1dCB5b3UgbWF5IHVzZSBhbnkgb2YgcHJvY2VzcyBtZXRob2RzIGRlZmluZWQgaW4gWFNMVEVuZ2luZUltcGwuPC9wPgotICogCi0gKiA8cD5QbGVhc2Ugbm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgbm90IHNhZmUgcGVyIGluc3RhbmNlIG92ZXIgbXVsdGlwbGUgCi0gKiB0aHJlYWRzLiAgSWYgeW91IGFyZSBpbiBhIG11bHRpdGhyZWFkZWQgZW52aXJvbm1lbnQsIHlvdSBzaG91bGQgCi0gKiBrZWVwIGEgcG9vbCBvZiB0aGVzZSBvYmplY3RzLCBvciBjcmVhdGUgYSBuZXcgb25lIGVhY2ggdGltZS4gIEluIGEgCi0gKiBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50LCB0aGUgcmlnaHQgd2F5IHRvIGRvIHRoaW5ncyBpcyB0byBjcmVhdGUgYSAKLSAqIFN0eWxlc2hlZXRSb290IHZpYSBwcm9jZXNzU3R5bGVzaGVldCwgYW5kIHRoZW4gcmV1c2UgdGhpcyBvYmplY3QgCi0gKiBvdmVyIG11bHRpcGxlIHRocmVhZHMuPC9wPgotICoKLSAqIDxwPklmIHlvdSByZXVzZSB0aGUgcHJvY2Vzc29yIGluc3RhbmNlLCB5b3Ugc2hvdWxkIGNhbGwgcmVzZXQoKSBiZXR3ZWVuIHRyYW5zZm9ybWF0aW9ucy48L3A+Ci0gKiBAc2VlIFhTTFRQcm9jZXNzb3JGYWN0b3J5Ci0gKiBAc2VlIFhTTFRQcm9jZXNzb3IKLSAqLwotcHVibGljIGNsYXNzIFhTTFRFbmdpbmVJbXBsIGltcGxlbWVudHMgIFhTTFRQcm9jZXNzb3IKLXsKLSAgLy9wcml2YXRlIFByb2Nlc3NvciBtX3Byb2Nlc3NvcjsKLSAgcHJpdmF0ZSBUcmFuc2Zvcm1lckZhY3RvcnkgbV90ZmFjdG9yeTsKLSAgcHJpdmF0ZSBUcmFuc2Zvcm1lckltcGwgbV90cmFuc2Zvcm1lckltcGw7Ci0gIHByaXZhdGUgRE9NMkhlbHBlciBtX2xpYWlzb247Ci0gIHByaXZhdGUgU3RyaW5nIG1fb3V0cHV0RmlsZU5hbWU7Ci0gIHByaXZhdGUgRG9jdW1lbnRIYW5kbGVyIG1fZG9jdW1lbnRIYW5kbGVyID0gbnVsbDsKLSAgcHJpdmF0ZSBQcm9ibGVtTGlzdGVuZXJEZWZhdWx0IG1fcHJvYmxlbUxpc3RlbmVyOwotICBwcml2YXRlIEhhc2h0YWJsZSBtX3N0eWxlc2hlZXRQYXJhbXM7Ci0gIFN0eWxlc2hlZXRSb290IG1fc3R5bGVzaGVldFJvb3QgPSBudWxsOwotICAKLSAgVmVjdG9yIG1fZXZhbExpc3QgPSBudWxsOwotICBib29sZWFuIG1fbmVlZFRvRXZhbCA9IGZhbHNlOwotICAKLSAgLyoKLSAgKiBJZiB0aGlzIGlzIHRydWUsIHRoZW4gdGhlIGRpYWcgZnVuY3Rpb24gd2lsbAotICAqIGJlIGNhbGxlZC4KLSAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIG1fdHJhY2VUZW1wbGF0ZUNoaWxkcmVuID0gZmFsc2U7Ci0KLSAgLyoKLSAgKiBJZiB0aGlzIGlzIHRydWUsIHRoZW4gdGhlIHNpbXBsZSB0cmFjaW5nIG9mIHRlbXBsYXRlcwotICAqIHdpbGwgYmUgcGVyZm9ybWVkLgotICAqLwotICBwcml2YXRlIGJvb2xlYW4gbV90cmFjZVRlbXBsYXRlcyA9IGZhbHNlOwotICAKLSAgLyoKLSAgKiBJZiB0aGlzIGlzIHRydWUsIHRoZW4gZGlhZ25vc3RpY3Mgb2YgZWFjaCBzZWxlY3QKLSAgKiB3aWxsIGJlIHBlcmZvcm1lZC4KLSAgKi8KLSAgYm9vbGVhbiBtX3RyYWNlU2VsZWN0cyA9IGZhbHNlOwotCi0gIC8qCi0gICogQSBzdHJlYW0gdG8gcHJpbnQgZGlhZ25vc3RpY3MgdG8uCi0gICovCi0gIGphdmEuaW8uUHJpbnRXcml0ZXIgbV9kaWFnbm9zdGljc1ByaW50V3JpdGVyID0gbnVsbDsKLQotICAvKiBGb3IgZGlhZ25vc3RpY3MgKi8KLSAgSGFzaHRhYmxlIG1fZHVyYXRpb25zVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIAotICAvKioKLSAgICogQSBYU0xNZXNzYWdlcyBpbnN0YW5jZSBjYXBhYmxlIG9mIHByb2R1Y2luZyB1c2VyIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgWFNMTWVzc2FnZXMgbV9YU0xNZXNzYWdlcyA9IG5ldyBYU0xNZXNzYWdlcygpOwotICAKLSAgICAKLSAvKioKLSAgICogQ29uc3RydWN0IGFuIFhTTFQgcHJvY2Vzc29yIHRoYXQgdXNlcyB0aGUgZGVmYXVsdCBEVE0gKERvY3VtZW50IFRhYmxlIE1vZGVsKSBsaWFpc29uCi0gICAqIGFuZCBYTUwgcGFyc2VyLiBBcyBhIGdlbmVyYWwgcnVsZSwgeW91IHNob3VsZCB1c2UgWFNMVFByb2Nlc3NvckZhY3RvcnkgdG8gY3JlYXRlIGFuCi0gICAqIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYW5kIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBpbnN0YW5jZSB2aWEgdGhlIFhTTFRQcm9jZXNzb3IgaW50ZXJmYWNlLgotICAgKgotICAgKiBAc2VlIFhTTFRQcm9jZXNzb3JGYWN0b3J5Ci0gICAqIEBzZWUgWFNMVFByb2Nlc3NvcgotICAgKi8KLSAgcHJvdGVjdGVkIFhTTFRFbmdpbmVJbXBsKCkKLSAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCi0gIHsgICAgCi0gICAgbV90ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIG1fcHJvYmxlbUxpc3RlbmVyID0gbmV3IFByb2JsZW1MaXN0ZW5lckRlZmF1bHQoKTsKLSAgICAvL21fbGlhaXNvbiA9ICAoRE9NMkhlbHBlciljcmVhdGVMaWFpc29uKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0IGFuIFhTTFQgcHJvY2Vzc29yIHRoYXQgdXNlcyB0aGUgdGhlIGdpdmVuIHBhcnNlciBsaWFpc29uLgotICAgKiBBcyBhIGdlbmVyYWwgcnVsZSwgeW91IHNob3VsZCB1c2UgWFNMVFByb2Nlc3NvckZhY3RvcnkgdG8gY3JlYXRlIGFuCi0gICAqIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYW5kIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBpbnN0YW5jZSB2aWEgdGhlIFhTTFRQcm9jZXNzb3IgaW50ZXJmYWNlLgotICAgKgotICAgKiBAc2VlIFhTTFRQcm9jZXNzb3JGYWN0b3J5Ci0gICAqIEBzZWUgWFNMVFByb2Nlc3NvcgotICAgKi8KLSAgcHVibGljIFhTTFRFbmdpbmVJbXBsKFN0cmluZyBsaWFpc29uQ2xhc3NOYW1lKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24gCi0gIHsgICAKLSAgICBtX3RmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgbV9wcm9ibGVtTGlzdGVuZXIgPSBuZXcgUHJvYmxlbUxpc3RlbmVyRGVmYXVsdCgpOwotICAgIAotICAgIHRyeSAKLSAgICAgIHsKLSAgICAgICAgbV9saWFpc29uID0gIChET00ySGVscGVyKShDbGFzcy5mb3JOYW1lKGxpYWlzb25DbGFzc05hbWUpLm5ld0luc3RhbmNlKCkpOwotICAgICAgICAvL29yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0IHhjdHh0ID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLmdldFhQYXRoQ29udGV4dCgpOwotCi0gICAgICAgIC8veGN0eHQuc2V0RE9NSGVscGVyKG1fbGlhaXNvbik7ICAgICAgICAKLSAgICAgIH0gCi0gICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMSkgCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIlhNTCBMaWFpc29uIGNsYXNzICIgKyBsaWFpc29uQ2xhc3NOYW1lICsKLSAgICAgICAgICAiIHNwZWNpZmllZCBidXQgbm90IGZvdW5kIiwgZTEpOwotICAgICAgfSAKLSAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUyKSAKLSAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJYTUwgTGlhaXNvbiBjbGFzcyAiICsgbGlhaXNvbkNsYXNzTmFtZSArCi0gICAgICAgICAgICAiIGZvdW5kIGJ1dCBjYW5ub3QgYmUgbG9hZGVkIiwgZTIpOwotICAgICAgfSAKLSAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUzKSAKLSAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJYTUwgTGlhaXNvbiBjbGFzcyAiICsgbGlhaXNvbkNsYXNzTmFtZSArCi0gICAgICAgICAgICAiIGxvYWRlZCBidXQgY2Fubm90IGJlIGluc3RhbnRpYXRlZCAobm8gZW1wdHkgcHVibGljIGNvbnN0cnVjdG9yPykiLAotICAgICAgICAgICAgZTMpOwotICAgICAgfSAKLSAgICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZTQpIAotICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIlhNTCBMaWFpc29uIGNsYXNzICIgKyBsaWFpc29uQ2xhc3NOYW1lICsKLSAgICAgICAgICAgICIgZG9lcyBub3QgaW1wbGVtZW50IERPTTJIZWxwZXIiLCBlNCk7Ci0gICAgICB9Ci0gICAKLSAgfQotICAgIAotICAgIAotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYW4gWFNMIHByb2Nlc3NvciB0aGF0IHVzZXMgdGhlIHRoZSBnaXZlbiBwYXJzZXIgbGlhaXNvbi4KLSAgICogQXMgYSBnZW5lcmFsIHJ1bGUsIHlvdSBzaG91bGQgdXNlIFhTTFRQcm9jZXNzb3JGYWN0b3J5IHRvIGNyZWF0ZSBhbgotICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGFjY2VzcyB0byB0aGUgaW5zdGFuY2UgdmlhIHRoZSBYU0xUUHJvY2Vzc29yIGludGVyZmFjZS4KLSAgICoKLSAgICogQHBhcmFtIFhNTFBhcnNlckxpYWlzb24gQSBsaWFpc29uIHRvIGFuIFhNTCBwYXJzZXIuCi0gICAqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuWE1MUGFyc2VyTGlhaXNvbgotICAgKiBAc2VlIFhTTFRQcm9jZXNzb3JGYWN0b3J5Ci0gICAqIEBzZWUgWFNMVFByb2Nlc3NvcgotICAgKi8KLSAgcHVibGljIFhTTFRFbmdpbmVJbXBsKFhNTFBhcnNlckxpYWlzb24gcGFyc2VyTGlhaXNvbikKLSAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBtX3RmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgbV9wcm9ibGVtTGlzdGVuZXIgPSBuZXcgUHJvYmxlbUxpc3RlbmVyRGVmYXVsdCgpOwotICAgIAotICAgIG1fbGlhaXNvbiA9ICAoRE9NMkhlbHBlcilwYXJzZXJMaWFpc29uOwotICAgLy8gb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQgeGN0eHQgPSB0aGlzLmdldFRyYW5zZm9ybWVyKCkuZ2V0WFBhdGhDb250ZXh0KCk7Ci0KLSAgICAvL3hjdHh0LnNldERPTUhlbHBlcihtX2xpYWlzb24pOyAgICAKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYW4gWFNMVCBwcm9jZXNzb3IgdGhhdCBjYW4gY2FsbCBiYWNrIHRvIHRoZSBYTUwgcGFyc2VyLCBpbiBvcmRlciB0byBoYW5kbGUKLSAgICogaW5jbHVkZWQgZmlsZXMgYW5kIHRoZSBsaWtlLgotICAgKgotICAgKiBAcGFyYW0gWE1MUGFyc2VyTGlhaXNvbiBBIGxpYWlzb24gdG8gYW4gWE1MIHBhcnNlci4KLSAgICoKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5YTUxQYXJzZXJMaWFpc29uCi0gICAqIEBzZWUgWFNMVFByb2Nlc3NvckZhY3RvcnkKLSAgICogQHNlZSBYU0xUUHJvY2Vzc29yCi0gICAqLwotICBYU0xURW5naW5lSW1wbChYTUxQYXJzZXJMaWFpc29uIHBhcnNlckxpYWlzb24sIFhQYXRoRmFjdG9yeSB4cGF0aEZhY3RvcnkpICAgIAotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgeyAgIAotICAgIG1fdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBtX3Byb2JsZW1MaXN0ZW5lciA9IG5ldyBQcm9ibGVtTGlzdGVuZXJEZWZhdWx0KCk7Ci0gICAgCi0gICAgbV9saWFpc29uID0gIChET00ySGVscGVyKXBhcnNlckxpYWlzb247Ci0gICAvLyBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dCB4Y3R4dCA9IHRoaXMuZ2V0VHJhbnNmb3JtZXIoKS5nZXRYUGF0aENvbnRleHQoKTsKLQotICAgIC8veGN0eHQuc2V0RE9NSGVscGVyKG1fbGlhaXNvbik7ICAgIAotICB9Ci0gIAotICAvKiogCi0gICAqIEdldCBhIExpYWlzb24gY2xhc3MKLSAgICovCi0gIHB1YmxpYyBYTUxQYXJzZXJMaWFpc29uIGNyZWF0ZUxpYWlzb24oKQotICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuWE1MUGFyc2VyTGlhaXNvbkRlZmF1bHQoKTsgICAgCi0gIH0KLSAKLSAgLyoqCi0gICAqIFJlc2V0IHRoZSBzdGF0ZS4gIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIGEgcHJvY2VzcygpIGNhbGwKLSAgICogaXMgaW52b2tlZCwgaWYgdGhlIHByb2Nlc3NvciBpcyB0byBiZSB1c2VkIGFnYWluLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXQoKQotICB7Ci0gICAgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwpCi0gICAgICBtX3RyYW5zZm9ybWVySW1wbC5yZXNldCgpOyAKLSAgICBtX3N0eWxlc2hlZXRQYXJhbXMgPSBudWxsOwotICB9Ci0gIAotIAotCi0gIC8qKgotICAgKiBUcmFuc2Zvcm0gdGhlIHNvdXJjZSB0cmVlIHRvIHRoZSBvdXRwdXQgaW4gdGhlIGdpdmVuCi0gICAqIHJlc3VsdCB0cmVlIHRhcmdldC4gQXMgYSBnZW5lcmFsIHJ1bGUsIHdlIHJlY29tbWVuZCB5b3UgdXNlIHRoZQotICAgKiB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3IjcHJvY2VzcyhvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVElucHV0U291cmNlLCBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVElucHV0U291cmNlLCBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVFJlc3VsdFRhcmdldCl9IG1ldGhvZC4KLSAgICogQHBhcmFtIGlucHV0U291cmNlICBUaGUgaW5wdXQgc291cmNlLgotICAgKiBAcGFyYW0gc3R5bGVzaGVldFNvdXJjZSAgVGhlIHN0eWxlc2hlZXQgc291cmNlLiAgTWF5IGJlIG51bGwgaWYgc291cmNlIGhhcyBhIHhtbC1zdHlsZXNoZWV0IFBJLgotICAgKiBAcGFyYW0gb3V0cHV0VGFyZ2V0IFRoZSBvdXRwdXQgc291cmNlIHRyZWUuCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWE1MUGFyc2VyTGlhaXNvbiBkZWNpZGUKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3MoIFhTTFRJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgWFNMVElucHV0U291cmNlIHN0eWxlc2hlZXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIFhTTFRSZXN1bHRUYXJnZXQgb3V0cHV0VGFyZ2V0KQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIEJvb2xlYW4gdG90YWxUaW1lSUQgPSBuZXcgQm9vbGVhbih0cnVlKTsKLSAgICAgIHB1c2hUaW1lKHRvdGFsVGltZUlEKTsKLSAgICAgIE5vZGUgc291cmNlVHJlZSA9IG51bGw7Ci0gICAgICAKLSAgICAgIFRlbXBsYXRlcyB0ZW1wbGF0ZXMgPSBudWxsOwotICAgICAgaWYgKG1fbmVlZFRvRXZhbCkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICAgICAgaWYgKG51bGwgIT0gc3R5bGVzaGVldFNvdXJjZSkKLSAgICAgICAgewotICAgICAgICAgIFNvdXJjZSBzc1NvdXJjZSA9IHN0eWxlc2hlZXRTb3VyY2UuZ2V0U291cmNlT2JqZWN0KCk7Ci0gICAgICAgICAgaWYoc3NTb3VyY2UgaW5zdGFuY2VvZiBET01Tb3VyY2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgbm9kZSA9ICgoRE9NU291cmNlKXNzU291cmNlKS5nZXROb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChudWxsID09IG5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBub2RlID0gbmV3IERPTTJIZWxwZXIoKS5jcmVhdGVEb2N1bWVudCgpIDsgCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPCBtX2V2YWxMaXN0LnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW1fZXZhbExpc3QuZWxlbWVudEF0KGkpOwotICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gKFN0cmluZyltX3N0eWxlc2hlZXRQYXJhbXMuZ2V0KG5hbWUpOwotICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YT2JqZWN0IHZhbCA9IG9yZy5hcGFjaGUueHBhdGguWFBhdGhBUEkuZXZhbChub2RlLCBleHByZXNzaW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbV9zdHlsZXNoZWV0UGFyYW1zLnB1dChuYW1lLCB2YWwpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaChUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHRlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9uZWVkVG9FdmFsID0gZmFsc2U7Ci0gICAgICAgIG1fZXZhbExpc3QgPSBudWxsOwotICAgICAgfQotICAgICAgCi0gICAgICBzb3VyY2VUcmVlID0gZ2V0U291cmNlVHJlZUZyb21JbnB1dChpbnB1dFNvdXJjZSk7Ci0gICAgICAKLSAgICAgIGlmKG51bGwgIT0gc3R5bGVzaGVldFNvdXJjZSkKLSAgICAgIHsKLSAgICAgICAgdHJ5ewotICAgICAgICB0ZW1wbGF0ZXMgPSBtX3RmYWN0b3J5Lm5ld1RlbXBsYXRlcyhzdHlsZXNoZWV0U291cmNlLmdldFNvdXJjZU9iamVjdCgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHRjZSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGNlKTsKLSAgICAgICAgfSAgCi0gICAgICAgIAotICAgICAgfSAgICAgIAotICAgICAgZWxzZSBpZiggbnVsbCAhPSBpbnB1dFNvdXJjZSkKLSAgICAgIHsgCi0gICAgICAgIGlmKG51bGwgIT0gc291cmNlVHJlZSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBzdHlsZXNoZWV0VVJJID0gbnVsbDsKLSAgICAgICAgICBTdGFjayBocmVmcyA9IG5ldyBTdGFjaygpOwotICAgICAgICAgIGZvcihOb2RlIGNoaWxkPXNvdXJjZVRyZWUuZ2V0Rmlyc3RDaGlsZCgpOyBudWxsICE9IGNoaWxkOyBjaGlsZD1jaGlsZC5nZXROZXh0U2libGluZygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFID09IGNoaWxkLmdldE5vZGVUeXBlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pY2hpbGQ7Ci0gICAgICAgICAgICAgIGlmKHBpLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ4bWwtc3R5bGVzaGVldCIpCi0gICAgICAgICAgICAgICAgIHx8IHBpLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ4bWw6c3R5bGVzaGVldCIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc09LID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwaS5nZXROb2RlVmFsdWUoKSwgIiBcdD0iKTsKLSAgICAgICAgICAgICAgICB3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmKHRva2VuaXplci5uZXh0VG9rZW4oKS5lcXVhbHMoInR5cGUiKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVWYWwgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVWYWwgPSB0eXBlVmFsLnN1YnN0cmluZygxLCB0eXBlVmFsLmxlbmd0aCgpLTEpOwotICAgICAgICAgICAgICAgICAgICBpZighdHlwZVZhbC5lcXVhbHMoInRleHQveHNsIikgJiYgIXR5cGVWYWwuZXF1YWxzKCJ0ZXh0L3htbCIpICYmICF0eXBlVmFsLmVxdWFscygiYXBwbGljYXRpb24veG1sK3hzbHQiKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGlzT0sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGlzT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwaS5nZXROb2RlVmFsdWUoKSwgIiBcdD0iKTsKLSAgICAgICAgICAgICAgICAgIHdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRva2VuaXplci5uZXh0VG9rZW4oKS5lcXVhbHMoImhyZWYiKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIHN0eWxlc2hlZXRVUkkgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgc3R5bGVzaGVldFVSSSA9IHN0eWxlc2hlZXRVUkkuc3Vic3RyaW5nKDEsIHN0eWxlc2hlZXRVUkkubGVuZ3RoKCktMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgaHJlZnMucHVzaChzdHlsZXNoZWV0VVJJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IC8vIGVuZCBmb3IoaW50IGkgPSAwOyBpIDwgbk5vZGVzOyBpKyspCi0gICAgICAgICAgYm9vbGVhbiBpc1Jvb3QgPSB0cnVlOwotICAgICAgICAgIFN0eWxlc2hlZXQgcHJldlN0eWxlc2hlZXQgPSBudWxsOwotICAgICAgICAgIHdoaWxlKCFocmVmcy5pc0VtcHR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3R5bGVzaGVldCBzdHlsZXNoZWV0ID0gZ2V0U3R5bGVzaGVldEZyb21QSVVSTCgoU3RyaW5nKWhyZWZzLnBvcCgpLCBzb3VyY2VUcmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCAhPSBpbnB1dFNvdXJjZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dFNvdXJjZS5nZXRTeXN0ZW1JZCgpIDogbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSb290KTsKLSAgICAgICAgICAgIGlmKGZhbHNlID09IGlzUm9vdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJldlN0eWxlc2hlZXQuc2V0SW1wb3J0KChTdHlsZXNoZWV0Q29tcG9zZWQpc3R5bGVzaGVldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmV2U3R5bGVzaGVldCA9IHN0eWxlc2hlZXQ7Ci0gICAgICAgICAgICBpc1Jvb3QgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBlcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJfTk9fSU5QVVRfU1RZTEVTSEVFVCk7IC8vIlN0eWxlc2hlZXQgaW5wdXQgd2FzIG5vdCBzcGVjaWZpZWQhIik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgCi0gICAgICBpZihudWxsID09IHRlbXBsYXRlcykKLSAgICAgIHsKLSAgICAgICAgaWYgKG1fc3R5bGVzaGVldFJvb3QgIT0gbnVsbCkKLSAgICAgICAgICB0ZW1wbGF0ZXMgPSBtX3N0eWxlc2hlZXRSb290LmdldE9iamVjdCgpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsgIAotICAgICAgICAgIGVycm9yKFhTTFRFcnJvclJlc291cmNlcy5FUl9GQUlMRURfUFJPQ0VTU19TVFlMRVNIRUVUKTsgLy8iRmFpbGVkIHRvIHByb2Nlc3Mgc3R5bGVzaGVldCEiKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gIAotICAgICAgfQotCi0gICAgICBpZihudWxsICE9IHRlbXBsYXRlcykKLSAgICAgIHsKLSAgICAgICAgdHJ5ewotICAgICAgICAgIG1fdHJhbnNmb3JtZXJJbXBsID0gKFRyYW5zZm9ybWVySW1wbCl0ZW1wbGF0ZXMubmV3VHJhbnNmb3JtZXIoKTsgCi0gICAgICAgICAgaWYgKG1fcHJvYmxlbUxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5zZXRFcnJvckxpc3RlbmVyKG1fcHJvYmxlbUxpc3RlbmVyKTsKLSAgICAgICAgICBpZiAobV9saWFpc29uICE9IG51bGwpCi0gICAgICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRYUGF0aENvbnRleHQoKS5zZXRET01IZWxwZXIobV9saWFpc29uKTsKLSAgIAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0Y2UpOwotICAgICAgICB9ICAKLSAgICAgICAgCi0gICAgICAgIGlmIChtX3N0eWxlc2hlZXRQYXJhbXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBtX3N0eWxlc2hlZXRQYXJhbXMua2V5cygpOwotICAgICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtX3N0eWxlc2hlZXRQYXJhbXMuZ2V0KG5hbWUpOyAKLSAgICAgICAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLnNldFBhcmFtZXRlcihuYW1lLCBudWxsLCB2YWx1ZSk7Ci0gICAgICAgICAgfSAKLSAgICAgICAgfSAgCi0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgbV90cmFuc2Zvcm1lckltcGwudHJhbnNmb3JtKG5ldyBET01Tb3VyY2Uoc291cmNlVHJlZSksCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dFRhcmdldC5nZXRSZXN1bHRPYmplY3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0ZSk7Ci0gICAgICAgIH0gIAotICAgICAgICBpZihudWxsICE9IG1fZGlhZ25vc3RpY3NQcmludFdyaXRlcikKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlEdXJhdGlvbigiVG90YWwgdGltZSIsIHRvdGFsVGltZUlEKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKQotICAgIHsKLSAgICAgIGVycm9yKFhTTFRFcnJvclJlc291cmNlcy5FUlJPUjAwMDAsIG5ldyBPYmplY3RbXSB7bXVlLmdldE1lc3NhZ2UoKX0sIG11ZSk7Ci0gICAgICAvLyB0aHJvdyBzZTsKLSAgICB9Ci0gICAgY2F0Y2goRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpCi0gICAgewotICAgICAgZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSUk9SMDAwMCwgbmV3IE9iamVjdFtdIHtmbmZlLmdldE1lc3NhZ2UoKX0sIGZuZmUpOwotICAgICAgLy8gdGhyb3cgc2U7Ci0gICAgfQotICAgIGNhdGNoKElPRXhjZXB0aW9uIGlvZSkKLSAgICB7Ci0gICAgICBlcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJST1IwMDAwLCBuZXcgT2JqZWN0W10ge2lvZS5nZXRNZXNzYWdlKCl9LCBpb2UpOwotICAgICAgLy8gdGhyb3cgc2U7Ci0gICAgfQotICAgIGNhdGNoKFNBWEV4Y2VwdGlvbiBzZSkKLSAgICB7Ci0gICAgICBlcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJfU0FYX0VYQ0VQVElPTiwgc2UpOyAvLyJTQVggRXhjZXB0aW9uIiwgc2UpOwotICAgICAgLy8gdGhyb3cgc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEJvdHRsZW5lY2sgdGhlIGNyZWF0aW9uIG9mIHRoZSBzdHlsZXNoZWV0IGZvciBkZXJpdmF0aW9uIHB1cnBvc2VzLgotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXRSb290IGNyZWF0ZVN0eWxlc2hlZXRSb290KFN0cmluZyBiYXNlSWRlbnRpZmllcikKLSAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sCi0gICAgICAgICAgIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KLSAgewotICAgIHRyeXsKLSAgICAgIGlmIChiYXNlSWRlbnRpZmllciA9PSBudWxsKQotICAgICAgICByZXR1cm4gbmV3IFN0eWxlc2hlZXRSb290KHRoaXMsIGJhc2VJZGVudGlmaWVyKTsgCi0gICAgICAKLSAgICAgIFNvdXJjZSBpblNvdXJjZSA9IG5ldyBYU0xUSW5wdXRTb3VyY2UoYmFzZUlkZW50aWZpZXIpLmdldFNvdXJjZU9iamVjdCgpOwotICAgICAgVGVtcGxhdGVzIHRlbXBsYXRlcyA9IG1fdGZhY3RvcnkubmV3VGVtcGxhdGVzKGluU291cmNlKTsKLSAgICAgIFN0eWxlc2hlZXRSb290IHN0eWxlc2hlZXQgPSBuZXcgU3R5bGVzaGVldFJvb3QoKG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRSb290KXRlbXBsYXRlcyk7ICAgICAgCi0gICAgICByZXR1cm4gc3R5bGVzaGVldDsgICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0Y2UpOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEJvdHRsZW5lY2sgdGhlIGNyZWF0aW9uIG9mIHRoZSBzdHlsZXNoZWV0IGZvciBkZXJpdmF0aW9uIHB1cnBvc2VzLgotICAgKi8KLSAgU3R5bGVzaGVldFJvb3QgY3JlYXRlU3R5bGVzaGVldFJvb3QoU3RyaW5nIGJhc2VJZGVudGlmaWVyLCBYU0xUSW5wdXRTb3VyY2Ugc291cmNlKQotICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5ewotICAgICAgU291cmNlIGluU291cmNlID0gc291cmNlLmdldFNvdXJjZU9iamVjdCgpOwotICAgICAgVGVtcGxhdGVzIHRlbXBsYXRlcyA9IG1fdGZhY3RvcnkubmV3VGVtcGxhdGVzKGluU291cmNlKTsKLSAgICAgIFN0eWxlc2hlZXRSb290IHN0eWxlc2hlZXQgPSBuZXcgU3R5bGVzaGVldFJvb3QoKG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRSb290KXRlbXBsYXRlcyk7ICAgICAgCi0gICAgICByZXR1cm4gc3R5bGVzaGVldDsgICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0Y2UpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhIFVSSSB0byBhbiBYU0wgc3R5bGVzaGVldCwKLSAgICogQ29tcGlsZSB0aGUgc3R5bGVzaGVldCBpbnRvIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgotICAgKiBUaGlzIGNhbGxzIHJlc2V0KCkgYmVmb3JlIHByb2Nlc3NpbmcgaWYgdGhlIHN0eWxlc2hlZXQgcm9vdCBoYXMgYmVlbiBzZXQKLSAgICogdG8gbm9uLW51bGwuCi0gICAqIEBwYXJhbSB4bWxkb2NVUkxTdHJpbmcgIFRoZSBVUkwgdG8gdGhlIGlucHV0IFhNTCBkb2N1bWVudC4KLSAgICogQHJldHVybiBUaGUgY29tcGlsZWQgc3R5bGVzaGVldCBvYmplY3QuCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWE1MUGFyc2VyTGlhaXNvbiBkZWNpZGUKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyBTdHlsZXNoZWV0Um9vdCBwcm9jZXNzU3R5bGVzaGVldChYU0xUSW5wdXRTb3VyY2Ugc3R5bGVzaGVldFNvdXJjZSkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICB0cnl7Ci0gICAgICBpZihudWxsICE9ICgoVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCltX3RmYWN0b3J5KS5uZXdUZW1wbGF0ZXNIYW5kbGVyKCkuZ2V0VGVtcGxhdGVzKCkpCi0gICAgICAgIHJlc2V0KCk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGNlKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgeHNsSWRlbnRpZmllciA9ICgobnVsbCA9PSBzdHlsZXNoZWV0U291cmNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsID09IHN0eWxlc2hlZXRTb3VyY2UuZ2V0U3lzdGVtSWQoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJJbnB1dCBYU0wiIDogc3R5bGVzaGVldFNvdXJjZS5nZXRTeXN0ZW1JZCgpOwotCi0gICAgLy8gSW4gY2FzZSB3ZSBoYXZlIGEgZnJhZ21lbnQgaWRlbnRpZmllciwgZ28gYWhlYWQgYW5kCi0gICAgLy8gdHJ5IGFuZCBwYXJzZSB0aGUgWE1MIGhlcmUuCi0gICAgbV9zdHlsZXNoZWV0Um9vdCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU3R5bGVzaGVldEhhbmRsZXIgc3R5bGVzaGVldFByb2Nlc3NvcgotICAgICAgICAgID0gbmV3IFN0eWxlc2hlZXRIYW5kbGVyKChUcmFuc2Zvcm1lckZhY3RvcnlJbXBsKW1fdGZhY3RvcnkpOyAvL3RoaXMsIG1fc3R5bGVzaGVldFJvb3QpOyAKLSAgICAgICAgCi0gICAgICBTb3VyY2Ugc3NTb3VyY2UgPSBzdHlsZXNoZWV0U291cmNlLmdldFNvdXJjZU9iamVjdCgpOwotICAgICAgaWYoc3NTb3VyY2UgaW5zdGFuY2VvZiBET01Tb3VyY2UpCi0gICAgICB7Ci0gICAgICAgIGlmKCgoRE9NU291cmNlKXNzU291cmNlKS5nZXROb2RlKCkgaW5zdGFuY2VvZiBTdHlsZXNoZWV0Um9vdCkKLSAgICAgICAgewotICAgICAgICAgIG1fc3R5bGVzaGVldFJvb3QgPSAoU3R5bGVzaGVldFJvb3QpKChET01Tb3VyY2Upc3NTb3VyY2UpLmdldE5vZGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzdHlsZXNoZWV0UHJvY2Vzc29yLnNldFN5c3RlbUlkKHN0eWxlc2hlZXRTb3VyY2UuZ2V0U3lzdGVtSWQoKSk7Ci0gICAgICAgICAgVHJlZVdhbGtlciB0dyA9IG5ldyBUcmVlV2Fsa2VyKHN0eWxlc2hlZXRQcm9jZXNzb3IsIG5ldyBvcmcuYXBhY2hlLnhwYXRoLkRPTTJIZWxwZXIoKSk7Ci0gICAgICAgICAgdHcudHJhdmVyc2UoKChET01Tb3VyY2Upc3NTb3VyY2UpLmdldE5vZGUoKSk7Ci0gICAgICAgICAgbV9zdHlsZXNoZWV0Um9vdCA9IG5ldyBTdHlsZXNoZWV0Um9vdChzdHlsZXNoZWV0UHJvY2Vzc29yLmdldFN0eWxlc2hlZXRSb290KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JCQkJaWYobnVsbCAhPSBtX2xpYWlzb24pCi0gICAgICAgIHsKLSAgICAgICAgIC8vIERPTTJIZWxwZXIgbGlhaXNvbiA9ICAoRE9NMkhlbHBlcikoQ2xhc3MuZm9yTmFtZShsaWFpc29uQ2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpKTsKLSAgICAgICAgICBtX2xpYWlzb24ucGFyc2UoU0FYU291cmNlLnNvdXJjZVRvSW5wdXRTb3VyY2Uoc3NTb3VyY2UpKTsKLQkJCQkJRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UobV9saWFpc29uLmdldERvY3VtZW50KCkpOwotCQkJCQlUZW1wbGF0ZXMgdGVtcGxhdGVzID0gbV90ZmFjdG9yeS5uZXdUZW1wbGF0ZXMoc291cmNlKTsKLQkJCQkJbV9zdHlsZXNoZWV0Um9vdCA9IG5ldyBTdHlsZXNoZWV0Um9vdCgKLQkJCQkJCQkJCQkJCQkJCQkob3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3QpdGVtcGxhdGVzKTsJCQkJCQkJCQkJCQkJCQkJIAotICAgICAgICB9ICAKLQkJCQllbHNlCi0JCQkJewotCQkJCQltX3N0eWxlc2hlZXRSb290ID0gY3JlYXRlU3R5bGVzaGVldFJvb3Qoc3R5bGVzaGVldFNvdXJjZS5nZXRTeXN0ZW1JZCgpLCBzdHlsZXNoZWV0U291cmNlKTsKLQkJCQl9Ci0gICAgICAgIGFkZFRyYWNlTGlzdGVuZXJzVG9TdHlsZXNoZWV0KCk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgc3R5bGVzaGVldFByb2Nlc3Nvci5wdXNoU3R5bGVzaGVldChtX3N0eWxlc2hlZXRSb290LmdldE9iamVjdCgpKTsgICAgICAKLSAgICAgICAgZGlhZygiPT09PT09PT09IFBhcnNpbmcgIit4c2xJZGVudGlmaWVyKyIgPT09PT09PT09PSIpOwotICAgICAgICBwdXNoVGltZSh4c2xJZGVudGlmaWVyKTsKLSAgICAgICAgLy9TdHJpbmcgbGlhaXNvbkNsYXNzTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS54YWxhbi5zb3VyY2UubGlhaXNvbiIpOwotCi0gICAgICAgIAotICAgICAgICBpZihudWxsICE9IG1fZGlhZ25vc3RpY3NQcmludFdyaXRlcikKLSAgICAgICAgICBkaXNwbGF5RHVyYXRpb24oIlBhcnNlIG9mICIreHNsSWRlbnRpZmllciwgeHNsSWRlbnRpZmllcik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGVycm9yKFhTTFRFcnJvclJlc291cmNlcy5FUl9DT1VMRE5UX1BBUlNFX0RPQywgbmV3IE9iamVjdFtdIHt4c2xJZGVudGlmaWVyfSwgZSk7IC8vIkNvdWxkIG5vdCBwYXJzZSAiK3hzbElkZW50aWZpZXIrIiBkb2N1bWVudCEiLCBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fc3R5bGVzaGVldFJvb3Q7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSBVUkkgdG8gYW4gWFNMIHN0eWxlc2hlZXQsCi0gICAqIENvbXBpbGUgdGhlIHN0eWxlc2hlZXQgaW50byBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KLSAgICogVGhpcyBjYWxscyByZXNldCgpIGJlZm9yZSBwcm9jZXNzaW5nIGlmIHRoZSBzdHlsZXNoZWV0IHJvb3QgaGFzIGJlZW4gc2V0Ci0gICAqIHRvIG5vbi1udWxsLgotICAgKiBAcGFyYW0geG1sZG9jVVJMU3RyaW5nICBUaGUgVVJMIHRvIHRoZSBpbnB1dCBYTUwgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gVGhlIGNvbXBpbGVkIHN0eWxlc2hlZXQgb2JqZWN0LgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgU3R5bGVzaGVldFJvb3QgcHJvY2Vzc1N0eWxlc2hlZXQoU3RyaW5nIHhzbGRvY1VSTFN0cmluZykKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBYU0xUSW5wdXRTb3VyY2UgaW5wdXQgPSBuZXcgWFNMVElucHV0U291cmNlKGdldFVSTEZyb21TdHJpbmcoeHNsZG9jVVJMU3RyaW5nLCBudWxsKS50b1N0cmluZygpKTsKLSAgICAgIHJldHVybiBwcm9jZXNzU3R5bGVzaGVldChpbnB1dCk7Ci0gICAgfQotICAgIGNhdGNoKFNBWEV4Y2VwdGlvbiBzZSkKLSAgICB7Ci0gICAgICBlcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJfUFJPQ0VTU1NUWUxFU0hFRVRfTk9UX1NVQ0NFU1NGVUwsIHNlKTsgLy8icHJvY2Vzc1N0eWxlc2hlZXQgbm90IHN1Y2Nlc2Z1bGwhIiwgc2UpOwotICAgICAgcmV0dXJuIG51bGw7IC8vIHNodXQgdXAgY29tcGlsZXIKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBzdHlsZXNoZWV0IGZvciB0aGlzIHByb2Nlc3Nvci4gIElmIHRoaXMgaXMgc2V0LCB0aGVuIHRoZQotICAgKiBwcm9jZXNzIGNhbGxzIHRoYXQgdGFrZSBvbmx5IHRoZSBpbnB1dCAueG1sIHdpbGwgdXNlCi0gICAqIHRoaXMgaW5zdGVhZCBvZiBsb29raW5nIGZvciBhIHN0eWxlc2hlZXQgUEkuICBBbHNvLAotICAgKiBzZXR0aW5nIHRoZSBzdHlsZXNoZWV0IGlzIG5lZWRlZCBpZiB5b3UgYXJlIGdvaW5nCi0gICAqIHRvIHVzZSB0aGUgcHJvY2Vzc29yIGFzIGEgU0FYIERvY3VtZW50SGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0eWxlc2hlZXQoU3R5bGVzaGVldFJvb3Qgc3R5bGVzaGVldFJvb3QpCi0gIHsKLSAgICBtX3N0eWxlc2hlZXRSb290ID0gc3R5bGVzaGVldFJvb3Q7Ci0gICAgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3Qgc3IgPSBzdHlsZXNoZWV0Um9vdC5nZXRPYmplY3QoKTsKLSAgICBpZiAobV90cmFuc2Zvcm1lckltcGwgPT0gbnVsbCkKLSAgICAgIG1fdHJhbnNmb3JtZXJJbXBsID0gKFRyYW5zZm9ybWVySW1wbClzci5uZXdUcmFuc2Zvcm1lcigpOwotICAgIG1fdHJhbnNmb3JtZXJJbXBsLnNldFN0eWxlc2hlZXQoc3IpOwotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciAhPSBudWxsKQotICAgICAgbV90cmFuc2Zvcm1lckltcGwuc2V0RXJyb3JMaXN0ZW5lcihtX3Byb2JsZW1MaXN0ZW5lcik7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IHN0eWxlc2hlZXQgZm9yIHRoaXMgcHJvY2Vzc29yLgotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXRSb290IGdldFN0eWxlc2hlZXQoKSAgICAKLSAgewotICAgIHJldHVybiBtX3N0eWxlc2hlZXRSb290OwotICB9Ci0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBHZXQgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgZG9jdW1lbnQsIGlmIGl0IHdhcyBzZXQuCi0gICAqIFRoaXMgaXMgZm9yIHVzZSBieSBtdWx0aXBsZSBvdXRwdXQgZG9jdW1lbnRzLCB0byBkZXRlcm1pbmUKLSAgICogdGhlIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgb3V0cHV0IGRvY3VtZW50LiAgSXQgbmVlZHMgdG8KLSAgICogYmUgc2V0IGJ5IHRoZSBjYWxsZXIuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dEZpbGVOYW1lKCkKLSAgewotICAgIHJldHVybiBtX291dHB1dEZpbGVOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBTZXQgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgZG9jdW1lbnQuCi0gICAqIFRoaXMgaXMgZm9yIHVzZSBieSBtdWx0aXBsZSBvdXRwdXQgZG9jdW1lbnRzLCB0byBkZXRlcm1pbmUKLSAgICogdGhlIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgb3V0cHV0IGRvY3VtZW50LiAgSXQgbmVlZHMgdG8KLSAgICogYmUgc2V0IGJ5IHRoZSBjYWxsZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLSAgICBtX291dHB1dEZpbGVOYW1lID0gZmlsZW5hbWU7Ci0gIH0KLQotICAKLQotICAvKioKLSAgICogR2l2ZW4gYW4gaW5wdXQgc291cmNlLCBnZXQgdGhlIHNvdXJjZSB0cmVlLgotICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0U291cmNlVHJlZUZyb21JbnB1dChYU0xUSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgotICB7Ci0gICAgTm9kZSBzb3VyY2VUcmVlID0gbnVsbDsKLSAgICBTdHJpbmcgeG1sSWRlbnRpZmllciA9ICgobnVsbCA9PSBpbnB1dFNvdXJjZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBpbnB1dFNvdXJjZS5nZXRTeXN0ZW1JZCgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIklucHV0IFhNTCIgOiBpbnB1dFNvdXJjZS5nZXRTeXN0ZW1JZCgpOwotICAgIAotICAgIFNvdXJjZSBpU291cmNlID0gaW5wdXRTb3VyY2UuZ2V0U291cmNlT2JqZWN0KCk7IAotCi0gICAgaWYoaVNvdXJjZSBpbnN0YW5jZW9mIERPTVNvdXJjZSkKLSAgICB7Ci0gICAgICAvL2lmKGdldFhNTFByb2Nlc3NvckxpYWlzb24oKSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUueGFsYW4ueHBhdGguZHRtLkRUTUxpYWlzb24pCi0gICAgICAgLy8gZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSX0NBTlRfVVNFX0RUTV9GT1JfSU5QVVQpOwotCi0gICAgICBzb3VyY2VUcmVlID0gKChET01Tb3VyY2UpaVNvdXJjZSkuZ2V0Tm9kZSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gSW4gY2FzZSB3ZSBoYXZlIGEgZnJhZ21lbnQgaWRlbnRpZmllciwgZ28gYWhlYWQgYW5kCi0gICAgICAvLyB0cnkgYW5kIHBhcnNlIHRoZSBYTUwgaGVyZS4KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBkaWFnKCI9PT09PT09PT0gUGFyc2luZyAiK3htbElkZW50aWZpZXIrIiA9PT09PT09PT09Iik7Ci0gICAgICAgIHB1c2hUaW1lKHhtbElkZW50aWZpZXIpOwotICAgICAgICAKLSAgICAgICAgLy9TdHJpbmcgbGlhaXNvbkNsYXNzTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS54YWxhbi5zb3VyY2UubGlhaXNvbiIpOwotCi0gICAgICAgIGlmKG51bGwgIT0gbV9saWFpc29uKQotICAgICAgICB7Ci0gICAgICAgICAgLy9ET00ySGVscGVyIGxpYWlzb24gPSAgKERPTTJIZWxwZXIpKENsYXNzLmZvck5hbWUobGlhaXNvbkNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKSk7Ci0gICAgICAgICAgbV9saWFpc29uLnBhcnNlKFNBWFNvdXJjZS5zb3VyY2VUb0lucHV0U291cmNlKGlTb3VyY2UpKTsKLSAgICAgICAgICBpZihudWxsICE9IG1fZGlhZ25vc3RpY3NQcmludFdyaXRlcikKLSAgICAgICAgICAgIGRpc3BsYXlEdXJhdGlvbigiUGFyc2Ugb2YgIit4bWxJZGVudGlmaWVyLCB4bWxJZGVudGlmaWVyKTsKLSAgICAgICAgICBzb3VyY2VUcmVlID0gbV9saWFpc29uLmdldERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAgICAgCi0gICAgICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7ICAgICAgICAKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaChTQVhFeGNlcHRpb24gc2UpCi0gICAgICAgICAgewotICAgICAgICAgIC8vIFdoYXQgY2FuIHdlIGRvPwotICAgICAgICAgIC8vIFRPRE86IFVzZXIgZGlhZ25vc3RpY3MuCi0gICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAvLyBHZXQgdGhlIGlucHV0IGNvbnRlbnQgaGFuZGxlciwgd2hpY2ggd2lsbCBoYW5kbGUgdGhlIAotICAgICAgICAgIC8vIHBhcnNlIGV2ZW50cyBhbmQgY3JlYXRlIHRoZSBzb3VyY2UgdHJlZS4gICAgICAgICAgCi0gICAgICAgICAgLy9TdHlsZXNoZWV0SGFuZGxlciBpbnB1dEhhbmRsZXIgPSAoU3R5bGVzaGVldEhhbmRsZXIpbV9wcm9jZXNzb3IuZ2V0VGVtcGxhdGVzQnVpbGRlcigpOwotICAgICAgICAgIC8vcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKCBpbnB1dEhhbmRsZXIgKTsKLSAgICAgICAgICAKLSAgICAgICAgICBTb3VyY2VUcmVlSGFuZGxlciBoYW5kbGVyID0gbmV3IFNvdXJjZVRyZWVIYW5kbGVyKCk7Ci0gICAgICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgaGFuZGxlcik7Ci0gICAgICAgIAotICAgICAgICAgIC8vIEtpY2sgb2ZmIHRoZSBwYXJzZS4gIFdoZW4gdGhlIENvbnRlbnRIYW5kbGVyIGdldHMgCi0gICAgICAgICAgLy8gdGhlIHN0YXJ0RG9jdW1lbnQgZXZlbnQsIGl0IHdpbGwgY2FsbCB0cmFuc2Zvcm1Ob2RlKCBub2RlICkuCi0gICAgICAgICAgcmVhZGVyLnBhcnNlKCBTQVhTb3VyY2Uuc291cmNlVG9JbnB1dFNvdXJjZShpU291cmNlKSk7Ci0gICAgICAgICAgc291cmNlVHJlZSA9IGhhbmRsZXIuZ2V0Um9vdCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gVW53cmFwIGV4Y2VwdGlvbgotICAgICAgICBpZigoZSBpbnN0YW5jZW9mIFNBWEV4Y2VwdGlvbikgJiYgKG51bGwgIT0gKChTQVhFeGNlcHRpb24pZSkuZ2V0RXhjZXB0aW9uKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gKChTQVhFeGNlcHRpb24pZSkuZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgZSA9ICgoU0FYRXhjZXB0aW9uKWUpLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHNvdXJjZVRyZWUgPSBudWxsOyAvLyBzaHV0dXAgY29tcGlsZXIKLSAgICAgICAgZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSX0NPVUxETlRfUEFSU0VfRE9DLCBuZXcgT2JqZWN0W10ge3htbElkZW50aWZpZXJ9LCBlKTsgLy8iQ291bGQgbm90IHBhcnNlICIreG1sSWRlbnRpZmllcisiIGRvY3VtZW50ISIsIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzb3VyY2VUcmVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBTdHlsZXNoZWV0IGZyb20gUEkgVVJMCi0gICAqIAotICAgKiBAcGFyYW0geHNsVVJMU3RyaW5nIGEgdmFsaWQgVVJJIHRvIGFuIFhTTCBzdHlsZXNoZWV0LgotICAgKiBAcGFyYW0gZnJhZ2Jhc2UgRG9jdW1lbnQgZnJhZ21lbnQgTm9kZS4KLSAgICogQHBhcmFtIHhtbEJhc2VJZGVudCBCYXNlIFVSSSB0byByZXNvbHZlIHN0eWxlc2hlZXQgVVJMIAotICAgKiBAcGFyYW0gaXNSb290IEZsYWcgaW5kaWNhdGluZyBpZiByb290IG5vZGUKLSAgICovCi0gIFN0eWxlc2hlZXQgZ2V0U3R5bGVzaGVldEZyb21QSVVSTChTdHJpbmcgeHNsVVJMU3RyaW5nLCBOb2RlIGZyYWdCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHhtbEJhc2VJZGVudCwgYm9vbGVhbiBpc1Jvb3QpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiwKLSAgICBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLAotICAgIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHlsZXNoZWV0IHN0eWxlc2hlZXQgPSBudWxsOwotICAgIFN0cmluZ1tdIHN0cmluZ0hvbGRlciA9Ci0gICAgewotICAgICAgbnVsbH07Ci0gICAgeHNsVVJMU3RyaW5nID0geHNsVVJMU3RyaW5nLnRyaW0oKTsKLSAgICBpbnQgZnJhZ0luZGV4ID0geHNsVVJMU3RyaW5nLmluZGV4T2YoJyMnKTsKLSAgICBTdHJpbmcgZnJhZ0lEID0gbnVsbDsKLSAgICBEb2N1bWVudCBzdHlsZXNoZWV0RG9jOwotICAgIGlmKGZyYWdJbmRleCA9PSAwKQotICAgIHsKLSAgICAgIGRpYWcoIkxvY2F0aW5nIHN0eWxlc2hlZXQgZnJvbSBmcmFnbWVudCBpZGVudGlmaWVyLi4uIik7Ci0gICAgICBmcmFnSUQgPSB4c2xVUkxTdHJpbmcuc3Vic3RyaW5nKDEpOwotICAgICAgCi0gICAgICAvLyBUcnkgYSBidW5jaCBvZiByZWFsbHkgdWdseSBzdHVmZiB0byBmaW5kIHRoZSBmcmFnbWVudC4KLSAgICAgIC8vIFdoYXQncyB0aGUgcmlnaHQgd2F5IHRvIGRvIHRoaXM/Ci0KLSAgICAgIC8vIENyZWF0ZSBhIFhQYXRoIHBhcnNlci4KLSAgICAgIFhQYXRoUGFyc2VyIHBhcnNlciA9IG5ldyBYUGF0aFBhcnNlcigoRXJyb3JMaXN0ZW5lciltX3Byb2JsZW1MaXN0ZW5lci5nZXRFcnJvckhhbmRsZXIoKSwgbnVsbCk7Ci0gICAgICBYUGF0aENvbnRleHQgeHBhdGhDb250ZXh0ID0gbmV3IFhQYXRoQ29udGV4dCgpOwotICAgICAgUHJlZml4UmVzb2x2ZXJEZWZhdWx0IG5zTm9kZSA9IG5ldyBQcmVmaXhSZXNvbHZlckRlZmF1bHQoZnJhZ0Jhc2UpOyAvL3hwYXRoQ29udGV4dC5nZXROYW1lc3BhY2VDb250ZXh0KCk7Ci0KLSAgICAgIE5vZGVJdGVyYXRvciBubCA9IG51bGw7Ci0gICAgICAvLyBDcmVhdGUgdGhlIFhQYXRoIG9iamVjdC4KLSAgICAgIHRyeXsKLSAgICAgIFhQYXRoIHhwYXRoID0gbmV3IFhQYXRoKGZyYWdJRCwgbnVsbCwgbnNOb2RlLCBYUGF0aC5NQVRDSCk7Ci0gICAgICBDb21waWxlciBjb21waWxlciA9IG5ldyBDb21waWxlcigpOwotICAgICAgLy8gUGFyc2UgdGhlIHhwYXRoCi0gICAgICBwYXJzZXIuaW5pdFhQYXRoKGNvbXBpbGVyLCAiaWQoIitmcmFnSUQrIikiLCBuc05vZGUpOwotICAgICAgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3QgeG9iaiA9IHhwYXRoLmV4ZWN1dGUoeHBhdGhDb250ZXh0LCBmcmFnQmFzZSwgbnNOb2RlKTsKLQotICAgICAgbmwgPSB4b2JqLm5vZGVzZXQoKTsKLSAgICAgIGlmKG5sLm5leHROb2RlKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8geG9iaiA9IFN0eWxlc2hlZXQuZXZhbFhQYXRoU3RyKGdldEV4ZWNDb250ZXh0KCksICIvLypbQGlkPSciK2ZyYWdJRCsiJ10iLCBmcmFnQmFzZSwgbnNOb2RlKTsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBYUGF0aCBvYmplY3QuCi0gICAgICAgIHhwYXRoID0gbmV3IFhQYXRoKGZyYWdJRCwgbnVsbCwgbnNOb2RlLCBYUGF0aC5NQVRDSCk7Ci0KLSAgICAgICAgLy8gUGFyc2UgdGhlIHhwYXRoCi0gICAgICAgIHBhcnNlci5pbml0WFBhdGgoY29tcGlsZXIsICIvLypbQGlkPSciK2ZyYWdJRCsiJ10iLCBuc05vZGUpOwotICAgICAgICB4b2JqID0geHBhdGguZXhlY3V0ZSh4cGF0aENvbnRleHQsIGZyYWdCYXNlLCBuc05vZGUpOwotCi0gICAgICAgIG5sID0geG9iai5ub2Rlc2V0KCk7Ci0gICAgICAgIGlmKG5sLm5leHROb2RlKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIHhvYmogPSBTdHlsZXNoZWV0LmV2YWxYUGF0aFN0cihnZXRFeGVjQ29udGV4dCgpLCAiLy8qW0BuYW1lPSciK2ZyYWdJRCsiJ10iLCBmcmFnQmFzZSwgbnNOb2RlKTsKLSAgICAgICAgICAvLyBDcmVhdGUgdGhlIFhQYXRoIG9iamVjdC4KLSAgICAgICAgICB4cGF0aCA9IG5ldyBYUGF0aChmcmFnSUQsIG51bGwsIG5zTm9kZSwgWFBhdGguTUFUQ0gpOwotCi0gICAgICAgICAgLy8gUGFyc2UgdGhlIHhwYXRoCi0gICAgICAgICAgcGFyc2VyLmluaXRYUGF0aChjb21waWxlciwgIi8vKltAbmFtZT0nIitmcmFnSUQrIiddIiwgbnNOb2RlKTsKLSAgICAgICAgICB4b2JqID0geHBhdGguZXhlY3V0ZSh4cGF0aENvbnRleHQsIGZyYWdCYXNlLCBuc05vZGUpOwotICAgICAgICAgIG5sID0geG9iai5ub2Rlc2V0KCk7Ci0gICAgICAgICAgaWYobmwubmV4dE5vZGUoKSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFdlbGwsIGhlbGwsIG1heWJlIGl0J3MgYW4gWFBhdGguLi4KLSAgICAgICAgICAgIC8vIHhvYmogPSBTdHlsZXNoZWV0LmV2YWxYUGF0aFN0cihnZXRFeGVjQ29udGV4dCgpLCBmcmFnSUQsIGZyYWdCYXNlLCBuc05vZGUpOwotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBYUGF0aCBvYmplY3QuCi0gICAgICAgICAgICAvLygoU3R5bGVzaGVldEhhbmRsZXIpKCBtX3Byb2Nlc3Nvci5nZXRUZW1wbGF0ZXNCdWlsZGVyKCkpKS5nZXRMb2NhdG9yKCkKLSAgICAgICAgICAgIHhwYXRoID0gbmV3IFhQYXRoKGZyYWdJRCwgbnVsbCwgbnNOb2RlLCBYUGF0aC5NQVRDSCk7Ci0KLSAgICAgICAgICAgIC8vIFBhcnNlIHRoZSB4cGF0aAotICAgICAgICAgICAgcGFyc2VyLmluaXRYUGF0aChjb21waWxlciwgZnJhZ0lELCBuc05vZGUpOwotICAgICAgICAgICAgeG9iaiA9IHhwYXRoLmV4ZWN1dGUoeHBhdGhDb250ZXh0LCBmcmFnQmFzZSwgbnNOb2RlKTsKLSAgICAgICAgICAgIG5sID0geG9iai5ub2Rlc2V0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gdGUpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGUpOwotICAgICAgfQotICAgICAgaWYobmwubmV4dE5vZGUoKSA9PSBudWxsKQotICAgICAgewotICAgICAgICBlcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJfQ09VTEROVF9GSU5EX0ZSQUdNRU5ULCBuZXcgT2JqZWN0W10ge2ZyYWdJRH0pOyAvLyJDb3VsZCBub3QgZmluZCBmcmFnbWVudDogIitmcmFnSUQpOwotICAgICAgfQotICAgICAgLy8gVXNlIHByZXZpb3VzIGJlY2F1c2UgdGhlIHByZXZpb3VzIGNhbGwgbW92ZWQgdGhlIHBvaW50ZXIuCi0gICAgICAvLyBvciBzaG91bGQgd2UgdXNlIGdldFJvb3Q/PwotICAgICAgTm9kZSBmcmFnID0gbmwucHJldmlvdXNOb2RlKCk7IC8vLml0ZW0oMCk7Ci0KLSAgICAgIGlmKE5vZGUuRUxFTUVOVF9OT0RFID09IGZyYWcuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgcHVzaFRpbWUoZnJhZyk7Ci0gICAgICAgIGlmKGlzUm9vdCkKLSAgICAgICAgewotICAgICAgICAgIG1fc3R5bGVzaGVldFJvb3QgPSBjcmVhdGVTdHlsZXNoZWV0Um9vdChzdHJpbmdIb2xkZXJbMF0pOwotICAgICAgICAgIHN0eWxlc2hlZXQgPSBtX3N0eWxlc2hlZXRSb290LmdldE9iamVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vc3R5bGVzaGVldCA9IG5ldyBTdHlsZXNoZWV0KG1fc3R5bGVzaGVldFJvb3QpOwotICAgICAgICAgIC8vIHN0eWxlc2hlZXQgPSAoKFN0eWxlc2hlZXRIYW5kbGVyKShtX3Byb2Nlc3Nvci5nZXRUZW1wbGF0ZXNCdWlsZGVyKCkpKS5nZXRTdHlsZXNoZWV0Um9vdCgpOwotICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgWFNMVElucHV0U291cmNlKGZyYWdJRCkuZ2V0U291cmNlT2JqZWN0KCk7IAotICAgICAgICAgICAgVGVtcGxhdGVzIHRlbXBsYXRlcyA9IG1fdGZhY3RvcnkubmV3VGVtcGxhdGVzKHNvdXJjZSk7Ci0gICAgICAgICAgICBzdHlsZXNoZWV0ID0gKG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRSb290KXRlbXBsYXRlczsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0Y2UpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhZGRUcmFjZUxpc3RlbmVyc1RvU3R5bGVzaGVldCgpOwotCi0gICAgICAgIHRyeXsKLSAgICAgICAgU3R5bGVzaGVldEhhbmRsZXIgc3R5bGVzaGVldFByb2Nlc3NvcgotICAgICAgICAgID0gbmV3IFN0eWxlc2hlZXRIYW5kbGVyKChUcmFuc2Zvcm1lckZhY3RvcnlJbXBsKW1fdGZhY3RvcnkpOwotICAgICAgICAgICAKLSAgICAgICAgc3R5bGVzaGVldFByb2Nlc3Nvci5wdXNoU3R5bGVzaGVldChzdHlsZXNoZWV0KTsKLSAgICAgICAgVHJlZVdhbGtlciB0dyA9IG5ldyBUcmVlV2Fsa2VyKHN0eWxlc2hlZXRQcm9jZXNzb3IsIG5ldyBvcmcuYXBhY2hlLnhwYXRoLkRPTTJIZWxwZXIoKSk7Ci0gICAgICAgIHR3LnRyYXZlcnNlKGZyYWcpOwotCi0gICAgICAgIGRpc3BsYXlEdXJhdGlvbigiU2V0dXAgb2YgIit4c2xVUkxTdHJpbmcsIGZyYWcpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0Y2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHN0eWxlc2hlZXREb2MgPSBudWxsOwotICAgICAgICBlcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJfTk9ERV9OT1RfRUxFTUVOVCwgbmV3IE9iamVjdFtdIHtmcmFnSUR9KTsgLy8iTm9kZSBwb2ludGVkIHRvIGJ5IGZyYWdtZW50IGlkZW50aWZpZXIgd2FzIG5vdCBhbiBlbGVtZW50OiAiK2ZyYWdJRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBUT0RPOiBVc2UgUmVhZGVyIGhlcmU/PwotICAgICAgLy8gaG1tbS4uIGZvciBub3cgSSdsbCByZWx5IG9uIHRoZSBYTUwgcGFyc2VyIHRvIGhhbmRsZQotICAgICAgLy8gZnJhZ21lbnQgVVJMcy4KLSAgICAgIGRpYWcoWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZShYU0xURXJyb3JSZXNvdXJjZXMuV0dfUEFSU0lOR19BTkRfUFJFUEFSSU5HLCBuZXcgT2JqZWN0W10ge3hzbFVSTFN0cmluZ30pKTsgLy8iPT09PT09PT09IFBhcnNpbmcgYW5kIHByZXBhcmluZyAiK3hzbFVSTFN0cmluZysiID09PT09PT09PT0iKTsKLSAgICAgIHB1c2hUaW1lKHhzbFVSTFN0cmluZyk7Ci0KLQkJCVVSTCB4c2xVUkwgPSBnZXRVUkxGcm9tU3RyaW5nKHhzbFVSTFN0cmluZywgeG1sQmFzZUlkZW50KTsKLQotICAgICAgWFNMVElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IFhTTFRJbnB1dFNvdXJjZSh4c2xVUkwudG9TdHJpbmcoKSk7Ci0gICAgICAKLQkJCWlmKGlzUm9vdCkKLQkJCXsJCQkJCi0JCQkJaWYobnVsbCAhPSBtX2xpYWlzb24pCi0JCQkJewotCQkJCQl0cnl7Ci0JCQkJCQltX2xpYWlzb24ucGFyc2UoU0FYU291cmNlLnNvdXJjZVRvSW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UuZ2V0U291cmNlT2JqZWN0KCkpKTsKLQkJCQkJCURPTVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKG1fbGlhaXNvbi5nZXREb2N1bWVudCgpKTsKLQkJCQkJCVRlbXBsYXRlcyB0ZW1wbGF0ZXMgPSBtX3RmYWN0b3J5Lm5ld1RlbXBsYXRlcyhzb3VyY2UpOwotCQkJCQkJbV9zdHlsZXNoZWV0Um9vdCA9IG5ldyBTdHlsZXNoZWV0Um9vdCgKLQkJCQkJCQkJCQkJCQkJCQkJCShvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdCl0ZW1wbGF0ZXMpOwotCQkJCQl9CQkJCQkKLQkJCQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRjZSkKLQkJCQkJewotCQkJCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0Y2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCW1fc3R5bGVzaGVldFJvb3QgPSBjcmVhdGVTdHlsZXNoZWV0Um9vdCh4c2xVUkxTdHJpbmcpOwotCQkJCX0KLQkJCQlzdHlsZXNoZWV0ID0gbV9zdHlsZXNoZWV0Um9vdC5nZXRPYmplY3QoKTsKLQkJCX0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3R5bGVzaGVldCA9IG5ldyBTdHlsZXNoZWV0KG1fc3R5bGVzaGVldFJvb3QuZ2V0T2JqZWN0KCkpOwotICAgICAgfQotICAgICAgYWRkVHJhY2VMaXN0ZW5lcnNUb1N0eWxlc2hlZXQoKTsKLQotICAgICAgdHJ5ewotICAgICAgb3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuU3R5bGVzaGVldEhhbmRsZXIgc3R5bGVzaGVldFByb2Nlc3NvcgotICAgICAgICA9IG5ldyBTdHlsZXNoZWV0SGFuZGxlcigoVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCltX3RmYWN0b3J5KTsgLy90aGlzLCBzdHlsZXNoZWV0KTsgCi0gICAgICBzdHlsZXNoZWV0UHJvY2Vzc29yLnB1c2hTdHlsZXNoZWV0KHN0eWxlc2hlZXQpOwotICAgICAgICAgLy8gbmV3IFN0eWxlc2hlZXRIYW5kbGVyKHRoaXMsIHN0eWxlc2hlZXQpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGNlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgIAotICAgICAgLy9tX3BhcnNlckxpYWlzb24uc2V0RG9jdW1lbnRIYW5kbGVyKHN0eWxlc2hlZXRQcm9jZXNzb3IpOwotICAgICAgLy9tX3BhcnNlckxpYWlzb24ucGFyc2UoaW5wdXRTb3VyY2UpOwotCi0gICAgICBkaXNwbGF5RHVyYXRpb24oIlBhcnNpbmcgYW5kIGluaXQgb2YgIit4c2xVUkxTdHJpbmcsIHhzbFVSTFN0cmluZyk7Ci0gICAgfQotICAgIHJldHVybiBzdHlsZXNoZWV0OwotICB9Ci0KLSAgICAgICAgCi0gIC8qKgotICAgKiBUYWtlIGEgdXNlciBzdHJpbmcgYW5kIHRyeSBhbmQgcGFyc2UgWE1MLCBhbmQgYWxzbyByZXR1cm4gCi0gICAqIHRoZSB1cmwuCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWFBhdGhDb250ZXh0IGRlY2lkZSAKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJMIGdldFVSTEZyb21TdHJpbmcoU3RyaW5nIHVybFN0cmluZywgU3RyaW5nIGJhc2UpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKLSAgewotICAgIFN0cmluZyBvcmlnVVJMU3RyaW5nID0gdXJsU3RyaW5nOwotICAgIFN0cmluZyBvcmlnQmFzZSA9IGJhc2U7Ci0gICAgCi0gICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRVUkxGcm9tU3RyaW5nIC0gdXJsU3RyaW5nOiAiK3VybFN0cmluZysiLCBiYXNlOiAiK2Jhc2UpOwotICAgIE9iamVjdCBkb2M7Ci0gICAgVVJMIHVybCA9IG51bGw7Ci0gICAgaW50IGZpbGVTdGFydFR5cGUgPSAwOwotICAgIHRyeQotICAgIHsKLSAgICAgIAotICAgICAgaWYobnVsbCAhPSBiYXNlKQotICAgICAgewotICAgICAgICBpZihiYXNlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiZmlsZTovIikpCi0gICAgICAgIHsKLSAgICAgICAgICBmaWxlU3RhcnRUeXBlID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGJhc2UudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJmaWxlOiIpKQotICAgICAgICB7Ci0gICAgICAgICAgZmlsZVN0YXJ0VHlwZSA9IDI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgYm9vbGVhbiBpc0Fic29sdXRlVVJMOwotICAgICAgCi0gICAgICAvLyBGcm9tIGh0dHA6Ly93d3cuaWNzLnVjaS5lZHUvcHViL2lldGYvdXJpL3JmYzE2MzAudHh0Ci0gICAgICAvLyBBIHBhcnRpYWwgZm9ybSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGFuIGFic29sdXRlIGZvcm0gaW4gdGhhdCB0aGUKLSAgICAgIC8vIGxhdHRlciBtdXN0IGhhdmUgYSBjb2xvbiBhbmQgdGhhdCBjb2xvbiBtdXN0IG9jY3VyIGJlZm9yZSBhbnkgc2xhc2gKLSAgICAgIC8vIGNoYXJhY3RlcnMuIFN5c3RlbXMgbm90IHJlcXVpcmluZyBwYXJ0aWFsIGZvcm1zIHNob3VsZCBub3QgdXNlIGFueQotICAgICAgLy8gdW5lbmNvZGVkIHNsYXNoZXMgaW4gdGhlaXIgbmFtaW5nIHNjaGVtZXMuICBJZiB0aGV5IGRvLCBhYnNvbHV0ZSBVUklzCi0gICAgICAvLyB3aWxsIHN0aWxsIHdvcmssIGJ1dCBjb25mdXNpb24gbWF5IHJlc3VsdC4KLSAgICAgIGludCBpbmRleE9mQ29sb24gPSB1cmxTdHJpbmcuaW5kZXhPZignOicpOwotICAgICAgaW50IGluZGV4T2ZTbGFzaCA9IHVybFN0cmluZy5pbmRleE9mKCcvJyk7Ci0gICAgICBpZigoaW5kZXhPZkNvbG9uICE9IC0xKSAmJiAoaW5kZXhPZlNsYXNoICE9IC0xKSAmJiAoaW5kZXhPZkNvbG9uIDwgaW5kZXhPZlNsYXNoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlIHVybCAob3IgZmlsZW5hbWUsIGZvciB0aGF0IG1hdHRlcikgaXMgYWJzb2x1dGUuCi0gICAgICAgIGlzQWJzb2x1dGVVUkwgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpc0Fic29sdXRlVVJMID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmKGlzQWJzb2x1dGVVUkwgfHwgKG51bGwgPT0gYmFzZSkgfHwgKGJhc2UubGVuZ3RoKCkgPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIHRyeSAKLSAgICAgICAgewotICAgICAgICAgIHVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHt9Ci0gICAgICB9Ci0gICAgICAvLyBUaGUgSmF2YSBVUkwgaGFuZGxpbmcgZG9lc24ndCBzZWVtIHRvIGhhbmRsZSByZWxhdGl2ZSBmaWxlIG5hbWVzLgotICAgICAgZWxzZSBpZighKCh1cmxTdHJpbmcuY2hhckF0KDApID09ICcuJykgfHwgKGZpbGVTdGFydFR5cGUgPiAwKSkpCi0gICAgICB7Ci0gICAgICAgIHRyeSAKLSAgICAgICAgewotICAgICAgICAgIFVSTCBiYXNlVXJsID0gbmV3IFVSTChiYXNlKTsKLSAgICAgICAgICB1cmwgPSBuZXcgVVJMKGJhc2VVcmwsIHVybFN0cmluZyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSAKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmKG51bGwgPT0gdXJsKQotICAgICAgewotICAgICAgICAvLyBUaGVuIHdlJ3JlIGdvaW5nIHRvIHRyeSBhbmQgbWFrZSBhIGZpbGUgVVJMIGJlbG93LCBzbyBzdHJpcCAKLSAgICAgICAgLy8gb2ZmIHRoZSBwcm90b2NvbCBoZWFkZXIuCi0gICAgICAgIGlmKHVybFN0cmluZy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImZpbGU6LyIpKQotICAgICAgICB7Ci0gICAgICAgICAgdXJsU3RyaW5nID0gdXJsU3RyaW5nLnN1YnN0cmluZyg2KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHVybFN0cmluZy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImZpbGU6IikpCi0gICAgICAgIHsKLSAgICAgICAgICB1cmxTdHJpbmcgPSB1cmxTdHJpbmcuc3Vic3RyaW5nKDUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmKChudWxsID09IHVybCkgJiYgKChudWxsID09IGJhc2UpIHx8IChmaWxlU3RhcnRUeXBlID4gMCkpKQotICAgICAgewotICAgICAgICBpZigxID09IGZpbGVTdGFydFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZihudWxsICE9IGJhc2UpCi0gICAgICAgICAgICBiYXNlID0gYmFzZS5zdWJzdHJpbmcoNik7Ci0gICAgICAgICAgZmlsZVN0YXJ0VHlwZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZigyID09IGZpbGVTdGFydFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZihudWxsICE9IGJhc2UpCi0gICAgICAgICAgICBiYXNlID0gYmFzZS5zdWJzdHJpbmcoNSk7Ci0gICAgICAgICAgZmlsZVN0YXJ0VHlwZSA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHVybFN0cmluZyk7Ci0gICAgICAgIAotICAgICAgICBpZighZi5pc0Fic29sdXRlKCkgJiYgKG51bGwgIT0gYmFzZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBTdHJpbmcgZGlyID0gZi5pc0RpcmVjdG9yeSgpID8gZi5nZXRBYnNvbHV0ZVBhdGgoKSA6IGYuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcmVidWlsdFVybFN0cmluZyAoMSk6ICIrYmFzZSk7Ci0gICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYmFzZSwgIlxcLyIpOwotICAgICAgICAgIFN0cmluZyBmaXhlZEJhc2UgPSBudWxsOwotICAgICAgICAgIHdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgaWYgKG51bGwgPT0gZml4ZWRCYXNlKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gVGhhbmtzIHRvIFJpY2sgTWFkZHkgZm9yIHRoZSBidWcgZml4IGZvciBVTklYIGhlcmUuCi0gICAgICAgICAgICAgIGlmIChiYXNlLmNoYXJBdCgwKSA9PSAnXFwnIHx8IGJhc2UuY2hhckF0KDApID09ICcvJykgCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaXhlZEJhc2UgPSBGaWxlLnNlcGFyYXRvciArIHRva2VuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaXhlZEJhc2UgPSB0b2tlbjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZml4ZWRCYXNlKz0gRmlsZS5zZXBhcmF0b3IgKyB0b2tlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJyZWJ1aWx0VXJsU3RyaW5nICgxKTogIitmaXhlZEJhc2UpOwotICAgICAgICAgIGYgPSBuZXcgRmlsZShmaXhlZEJhc2UpOwotICAgICAgICAgIFN0cmluZyBkaXIgPSBmLmlzRGlyZWN0b3J5KCkgPyBmLmdldEFic29sdXRlUGF0aCgpIDogZi5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImRpcjogIitkaXIpOwotICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigidXJsU3RyaW5nOiAiK3VybFN0cmluZyk7Ci0gICAgICAgICAgLy8gZiA9IG5ldyBGaWxlKGRpciwgdXJsU3RyaW5nKTsKLSAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImYgKDEpOiAiK2YudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgLy8gdXJsU3RyaW5nID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICBmID0gbmV3IEZpbGUodXJsU3RyaW5nKTsgCi0gICAgICAgICAgYm9vbGVhbiBpc0Fic29sdXRlID0gIGYuaXNBYnNvbHV0ZSgpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAodXJsU3RyaW5nLmNoYXJBdCggMCApID09ICdcXCcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh1cmxTdHJpbmcuY2hhckF0KCAwICkgPT0gJy8nKTsKLSAgICAgICAgICBpZighaXNBYnNvbHV0ZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBHZXR0aW5nIG1vcmUgYW5kIG1vcmUgdWdseS4uLgotICAgICAgICAgICAgaWYoZGlyLmNoYXJBdCggZGlyLmxlbmd0aCgpLTEgKSAhPSBGaWxlLnNlcGFyYXRvci5jaGFyQXQoMCkgJiYgCi0gICAgICAgICAgICAgICB1cmxTdHJpbmcuY2hhckF0KCAwICkgIT0gRmlsZS5zZXBhcmF0b3IuY2hhckF0KDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1cmxTdHJpbmcgPSBkaXIgKyBGaWxlLnNlcGFyYXRvciArIHVybFN0cmluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdXJsU3RyaW5nID0gZGlyICsgdXJsU3RyaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByZWJ1aWx0VXJsU3RyaW5nICgyKTogIit1cmxTdHJpbmcpOwotICAgICAgICAgICAgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih1cmxTdHJpbmcsICJcXC8iKTsKLSAgICAgICAgICAgIFN0cmluZyByZWJ1aWx0VXJsU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgaWYgKG51bGwgPT0gcmVidWlsdFVybFN0cmluZykgCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUaGFua3MgdG8gUmljayBNYWRkeSBmb3IgdGhlIGJ1ZyBmaXggZm9yIFVOSVggaGVyZS4KLSAgICAgICAgICAgICAgICBpZiAodXJsU3RyaW5nLmNoYXJBdCgwKSA9PSAnXFwnIHx8IHVybFN0cmluZy5jaGFyQXQoMCkgPT0gJy8nKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWJ1aWx0VXJsU3RyaW5nID0gRmlsZS5zZXBhcmF0b3IgKyB0b2tlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWJ1aWx0VXJsU3RyaW5nID0gdG9rZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWJ1aWx0VXJsU3RyaW5nKz0gRmlsZS5zZXBhcmF0b3IgKyB0b2tlbjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJyZWJ1aWx0VXJsU3RyaW5nICgyKTogIityZWJ1aWx0VXJsU3RyaW5nKTsKLSAgICAgICAgICAgIGlmKG51bGwgIT0gcmVidWlsdFVybFN0cmluZykKLSAgICAgICAgICAgICAgdXJsU3RyaW5nID0gcmVidWlsdFVybFN0cmluZzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJmaWxlU3RhcnRUeXBlOiAiK2ZpbGVTdGFydFR5cGUpOwotICAgICAgICAgIGlmKDEgPT0gZmlsZVN0YXJ0VHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodXJsU3RyaW5nLmNoYXJBdCgwKSA9PSAnLycpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1cmxTdHJpbmcgPSAiZmlsZTovLyIrdXJsU3RyaW5nOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1cmxTdHJpbmcgPSAiZmlsZTovIit1cmxTdHJpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYoMiA9PSBmaWxlU3RhcnRUeXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVybFN0cmluZyA9ICJmaWxlOiIrdXJsU3RyaW5nOwotICAgICAgICAgIH0KLSAgICAgICAgICB0cnkgCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaW5hbCBiZWZvcmUgdHJ5OiAiK3VybFN0cmluZyk7Ci0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB0cnlpbmcgdG8gbWFrZSBVUkwgZnJvbSAiK3VybFN0cmluZyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZihudWxsID09IHVybCkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlIHN1biBqYXZhIFZNIGRvZXNuJ3QgZG8gdGhpcyBjb3JyZWN0bHksIGJ1dCBJJ2xsIAotICAgICAgICAvLyB0cnkgaXQgaGVyZSBhcyBhIHNlY29uZC10by1sYXN0IHJlc29ydC4KLSAgICAgICAgaWYoKG51bGwgIT0gb3JpZ0Jhc2UpICYmIChvcmlnQmFzZS5sZW5ndGgoKSA+IDApKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5IAotICAgICAgICAgIHsKLSAgICAgICAgICAgIFVSTCBiYXNlVVJMID0gbmV3IFVSTChvcmlnQmFzZSk7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeWluZyB0byBtYWtlIFVSTCBmcm9tICIrb3JpZ0Jhc2UrIiBhbmQgIitvcmlnVVJMU3RyaW5nKTsKLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoYmFzZVVSTCwgb3JpZ1VSTFN0cmluZyk7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2Nlc3MhIE5ldyBVUkwgaXM6ICIrdXJsLnRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgdHJ5aW5nIHRvIG1ha2UgVVJMIGZyb20gIitvcmlnQmFzZSsiIGFuZCAiK29yaWdVUkxTdHJpbmcpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYobnVsbCA9PSB1cmwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkgCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGxhc3RQYXJ0OwotICAgICAgICAgICAgaWYobnVsbCAhPSBvcmlnQmFzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRmlsZSBiYXNlRmlsZSA9IG5ldyBGaWxlKG9yaWdCYXNlKTsKLSAgICAgICAgICAgICAgaWYoYmFzZUZpbGUuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhc3RQYXJ0ID0gbmV3IEZpbGUoYmFzZUZpbGUsIHVybFN0cmluZykuZ2V0QWJzb2x1dGVQYXRoICgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnREaXIgPSBiYXNlRmlsZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICBsYXN0UGFydCA9IG5ldyBGaWxlKHBhcmVudERpciwgdXJsU3RyaW5nKS5nZXRBYnNvbHV0ZVBhdGggKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbGFzdFBhcnQgPSBuZXcgRmlsZSAodXJsU3RyaW5nKS5nZXRBYnNvbHV0ZVBhdGggKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBIYWNrCi0gICAgICAgICAgICAvLyBpZigobGFzdFBhcnQuY2hhckF0KDApID09ICcvJykgJiYgKGxhc3RQYXJ0LmNoYXJBdCgyKSA9PSAnOicpKQotICAgICAgICAgICAgLy8gICBsYXN0UGFydCA9IGxhc3RQYXJ0LnN1YnN0cmluZygxLCBsYXN0UGFydC5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgZnVsbHBhdGg7Ci0gICAgICAgICAgICBpZiAobGFzdFBhcnQuY2hhckF0KDApID09ICdcXCcgfHwgbGFzdFBhcnQuY2hhckF0KDApID09ICcvJykgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZ1bGxwYXRoID0gImZpbGU6Ly8iICsgbGFzdFBhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZ1bGxwYXRoID0gImZpbGU6IiArIGxhc3RQYXJ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXJsID0gbmV3IFVSTChmdWxscGF0aCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTIpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSB1cmwgZm9yOiAiICsgdXJsU3RyaW5nLCBlMiApOyAKLSAgICAgICAgICAgICAgLy9YU0xNZXNzYWdlcy5jcmVhdGVYUEFUSE1lc3NhZ2UoWFBBVEhFcnJvclJlc291cmNlcy5FUl9DQU5OT1RfQ1JFQVRFX1VSTCwgbmV3IE9iamVjdFtde3VybFN0cmluZ30pLGUyKTsgLy8iQ2Fubm90IGNyZWF0ZSB1cmwgZm9yOiAiICsgdXJsU3RyaW5nLCBlMiApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBzZSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgdXJsID0gbmV3IFVSTCgiaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvIitqYXZhLmxhbmcuTWF0aC5yYW5kb20oKSk7IC8vIGR1bW15Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUyKQotICAgICAgewotICAgICAgICAvLyBJIGdpdmUgdXAKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJ1cmw6ICIrdXJsLnRvU3RyaW5nKCkpOwotICAgIHJldHVybiB1cmw7Ci0gIH0KLQotICAgLyoqCi0gICAqIEFkZCBhIHRyYWNlIGxpc3RlbmVyIGZvciB0aGUgcHVycG9zZXMgb2YgZGVidWdnaW5nIGFuZCBkaWFnbm9zaXMuCi0gICAqIEBwYXJhbSB0bCBUcmFjZSBsaXN0ZW5lciB0byBiZSBhZGRlZC4KLSAgICovCi0gIHZvaWQgYWRkVHJhY2VMaXN0ZW5lcnNUb1N0eWxlc2hlZXQoKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIC8qdHJ5Ci0gICAgewotICAgICAgVHJhY2VNYW5hZ2VyIHRtID0gbV90cmFuc2Zvcm1lckltcGwuZ2V0VHJhY2VNYW5hZ2VyKCk7Ci0gICAgICBpZih0bS5oYXNUcmFjZUxpc3RlbmVycykKLSAgICAgIHsKLSAgICAgICAgaW50IG5MaXN0ZW5lcnMgPSB0bS5zaXplKCk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuTGlzdGVuZXJzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBUcmFjZUxpc3RlbmVyIHRsID0gKFRyYWNlTGlzdGVuZXIpbV90cmFjZUxpc3RlbmVycy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgaWYobnVsbCAhPSBtX3N0eWxlc2hlZXRSb290KQotICAgICAgICAgICAgbV9zdHlsZXNoZWV0Um9vdC5hZGRUcmFjZUxpc3RlbmVyKHRsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaChUb29NYW55TGlzdGVuZXJzRXhjZXB0aW9uIHRtbGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihYU0xNZXNzYWdlcy5jcmVhdGVNZXNzYWdlKFhTTFRFcnJvclJlc291cmNlcy5FUl9UT09fTUFOWV9MSVNURU5FUlMsIG51bGwpLHRtbGUgKTsgLy8iYWRkVHJhY2VMaXN0ZW5lcnNUb1N0eWxlc2hlZXQgLSBUb29NYW55TGlzdGVuZXJzRXhjZXB0aW9uIiwgdG1sZSk7Ci0gICAgfSovCi0gIH0KLSAgCi0gIC8qKgotICAgKiBXYXJuIHRoZSB1c2VyIG9mIGFuIHByb2JsZW0uCi0gICAqIFRoaXMgaXMgcHVibGljIGZvciBhY2Nlc3MgYnkgZXh0ZW5zaW9ucy4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbWVzc2FnZShTdHJpbmcgbXNnKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIG1lc3NhZ2UobnVsbCwgbnVsbCwgbXNnKTsKLSAgfQotCi0KLQotICAvKioKLSAgICogV2FybiB0aGUgdXNlciBvZiBhbiBwcm9ibGVtLgotICAgKiBUaGlzIGlzIHB1YmxpYyBmb3IgYWNjZXNzIGJ5IGV4dGVuc2lvbnMuCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWE1MUGFyc2VyTGlhaXNvbiBkZWNpZGUKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIG1lc3NhZ2UoTm9kZSBzdHlsZU5vZGUsIE5vZGUgc291cmNlTm9kZSwgU3RyaW5nIG1zZykKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBtX3Byb2JsZW1MaXN0ZW5lci5tZXNzYWdlKG1zZyk7Ci0gIH0KLQotICAvKioKLSAgICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImludGVybmFsIi8+Ci0gICAqIFdhcm4gdGhlIHVzZXIgb2YgYW4gcHJvYmxlbS4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgd2FybihpbnQgbXNnKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIHdhcm4obnVsbCwgbnVsbCwgbXNnLCBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogV2FybiB0aGUgdXNlciBvZiBhbiBwcm9ibGVtLgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3YXJuKGludCBtc2csIE9iamVjdFtdIGFyZ3MpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgd2FybihudWxsLCBudWxsLCBtc2csIGFyZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBXYXJuIHRoZSB1c2VyIG9mIGFuIHByb2JsZW0uCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWE1MUGFyc2VyTGlhaXNvbiBkZWNpZGUKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdhcm4oTm9kZSBzdHlsZU5vZGUsIE5vZGUgc291cmNlTm9kZSwgaW50IG1zZykKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICB3YXJuKHN0eWxlTm9kZSwgc291cmNlTm9kZSwgbXNnLCBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogV2FybiB0aGUgdXNlciBvZiBhbiBwcm9ibGVtLgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3YXJuKE5vZGUgc3R5bGVOb2RlLCBOb2RlIHNvdXJjZU5vZGUsIGludCBtc2csIE9iamVjdCBhcmdzW10pCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgRXhjZXB0aW9uIGUgPSBudWxsOwotICAgIFN0cmluZyBmbXNnID0gbV9YU0xNZXNzYWdlcy5jcmVhdGVXYXJuaW5nKG1zZywgYXJncyk7Ci0gICAgU291cmNlTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKLSAgICB0cnl7Ci0gICAgIGxvY2F0b3IgPSAoKFN0eWxlc2hlZXRIYW5kbGVyKSgoKFRyYW5zZm9ybWVyRmFjdG9yeUltcGwpdGhpcy5tX3RmYWN0b3J5KS5uZXdUZW1wbGF0ZXNIYW5kbGVyKCkpKS5nZXRMb2NhdG9yKCk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gdGNlKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgRGVmYXVsdEVycm9ySGFuZGxlciBoYW5kbGVyOwotICAgIGlmIChtX3Byb2JsZW1MaXN0ZW5lciA9PSBudWxsKQotICAgICAgaGFuZGxlciA9IChEZWZhdWx0RXJyb3JIYW5kbGVyKW1fdGZhY3RvcnkuZ2V0RXJyb3JMaXN0ZW5lcigpOwotICAgIGVsc2UKLSAgICAgIGhhbmRsZXIgPSAoRGVmYXVsdEVycm9ySGFuZGxlciltX3Byb2JsZW1MaXN0ZW5lci5nZXRFcnJvckhhbmRsZXIoKTsKLSAgICBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZSA9IChudWxsID09IGUpID8gbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGZtc2csIGxvY2F0b3IpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihmbXNnLCBsb2NhdG9yLCBlKTsKLSAgICBpZihudWxsICE9IGhhbmRsZXIpCi0gICAgewotICAgICAgdHJ5ewotICAgICAgaGFuZGxlci53YXJuaW5nKHRlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZTIpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGUyKTsKLSAgICAgIH0gCi0gICAgfQotICAgIGVsc2UKLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBUZWxsIHRoZSB1c2VyIG9mIGFuIGVycm9yLCBhbmQgcHJvYmFibHkgdGhyb3cgYW4KLSAgICogZXhjZXB0aW9uLgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgbXNnKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIEV4Y2VwdGlvbiBlID0gbnVsbDsKLSAgICBTb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotICAgIHRyeXsKLSAgICBsb2NhdG9yID0gKChTdHlsZXNoZWV0SGFuZGxlcikoKChUcmFuc2Zvcm1lckZhY3RvcnlJbXBsKXRoaXMubV90ZmFjdG9yeSkubmV3VGVtcGxhdGVzSGFuZGxlcigpKSkuZ2V0TG9jYXRvcigpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHRjZSkKLSAgICB7Ci0gICAgfQotICAgIERlZmF1bHRFcnJvckhhbmRsZXIgaGFuZGxlcjsKLSAgICBpZiAobV9wcm9ibGVtTGlzdGVuZXIgPT0gbnVsbCkKLSAgICAgIGhhbmRsZXIgPSAoRGVmYXVsdEVycm9ySGFuZGxlciltX3RmYWN0b3J5LmdldEVycm9yTGlzdGVuZXIoKTsKLSAgICBlbHNlCi0gICAgICBoYW5kbGVyID0gKERlZmF1bHRFcnJvckhhbmRsZXIpbV9wcm9ibGVtTGlzdGVuZXIuZ2V0RXJyb3JIYW5kbGVyKCk7Ci0gICAgVHJhbnNmb3JtZXJFeGNlcHRpb24gdGUgPSAobnVsbCA9PSBlKSA/IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihtc2csIGxvY2F0b3IpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihtc2csIGxvY2F0b3IsIGUpOwotICAgIGlmKG51bGwgIT0gaGFuZGxlcikKLSAgICB7ICAKLSAgICAgIHRyeXsKLSAgICAgIGhhbmRsZXIuZmF0YWxFcnJvcih0ZSk7Ci0gICAgfQotICAgICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlMikKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0ZTIpOwotICAgICAgfSAKLSAgICB9Ci0gICAgZWxzZQotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImludGVybmFsIi8+Ci0gICAqIFRlbGwgdGhlIHVzZXIgb2YgYW4gZXJyb3IsIGFuZCBwcm9iYWJseSB0aHJvdyBhbgotICAgKiBleGNlcHRpb24uCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWE1MUGFyc2VyTGlhaXNvbiBkZWNpZGUKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVycm9yKGludCBtc2cpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgZXJyb3IobnVsbCwgbnVsbCwgbXNnLCBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogVGVsbCB0aGUgdXNlciBvZiBhbiBlcnJvciwgYW5kIHByb2JhYmx5IHRocm93IGFuCi0gICAqIGV4Y2VwdGlvbi4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXJyb3IoaW50IG1zZywgT2JqZWN0W10gYXJncykKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBlcnJvcihudWxsLCBudWxsLCBtc2csIGFyZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBUZWxsIHRoZSB1c2VyIG9mIGFuIGVycm9yLCBhbmQgcHJvYmFibHkgdGhyb3cgYW4KLSAgICogZXhjZXB0aW9uLgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcnJvcihpbnQgbXNnLCBFeGNlcHRpb24gZSkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBlcnJvcihtc2csIG51bGwsIGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBUZWxsIHRoZSB1c2VyIG9mIGFuIGVycm9yLCBhbmQgcHJvYmFibHkgdGhyb3cgYW4KLSAgICogZXhjZXB0aW9uLgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcnJvcihpbnQgbXNnLCBPYmplY3QgYXJnc1tdLCBFeGNlcHRpb24gZSkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZm1zZyA9IG1fWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZShtc2csIGFyZ3MpOwotICAgIFNvdXJjZUxvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0gICAgdHJ5ewotICAgICAgbG9jYXRvciA9ICgoU3R5bGVzaGVldEhhbmRsZXIpKCgoVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCl0aGlzLm1fdGZhY3RvcnkpLm5ld1RlbXBsYXRlc0hhbmRsZXIoKSkpLmdldExvY2F0b3IoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpCi0gICAgewotICAgIH0KLSAgICBEZWZhdWx0RXJyb3JIYW5kbGVyIGhhbmRsZXI7Ci0gICAgaWYgKG1fcHJvYmxlbUxpc3RlbmVyID09IG51bGwpCi0gICAgICBoYW5kbGVyID0gKERlZmF1bHRFcnJvckhhbmRsZXIpbV90ZmFjdG9yeS5nZXRFcnJvckxpc3RlbmVyKCk7Ci0gICAgZWxzZQotICAgICAgaGFuZGxlciA9IChEZWZhdWx0RXJyb3JIYW5kbGVyKW1fcHJvYmxlbUxpc3RlbmVyLmdldEVycm9ySGFuZGxlcigpOwotICAgIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlID0gKG51bGwgPT0gZSkgPyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oZm1zZywgbG9jYXRvcikgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGZtc2csIGxvY2F0b3IsIGUpOwotICAgIGlmKG51bGwgIT0gaGFuZGxlcikKLSAgICB7Ci0gICAgICB0cnl7Ci0gICAgICBoYW5kbGVyLmZhdGFsRXJyb3IodGUpOwotICAgIH0KLSAgICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZTIpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGUyKTsKLSAgICAgIH0gCi0gICAgfQotICAgIGVsc2UKLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGUpOwotICB9Ci0KLSAgLyoqCi0gICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgKiBUZWxsIHRoZSB1c2VyIG9mIGFuIGVycm9yLCBhbmQgcHJvYmFibHkgdGhyb3cgYW4KLSAgICogZXhjZXB0aW9uLgotICAgKiBAZXhjZXB0aW9uIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgYW5kIFhNTFBhcnNlckxpYWlzb24gZGVjaWRlCi0gICAqIHRoZSBlcnJvciBjb25kaXRpb24gaXMgc2V2ZXJlIGVub3VnaCB0byBoYWx0IHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcnJvcihOb2RlIHN0eWxlTm9kZSwgTm9kZSBzb3VyY2VOb2RlLCBpbnQgbXNnKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGVycm9yKHN0eWxlTm9kZSwgc291cmNlTm9kZSwgbXNnLCBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogVGVsbCB0aGUgdXNlciBvZiBhbiBlcnJvciwgYW5kIHByb2JhYmx5IHRocm93IGFuCi0gICAqIGV4Y2VwdGlvbi4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXJyb3IoTm9kZSBzdHlsZU5vZGUsIE5vZGUgc291cmNlTm9kZSwgaW50IG1zZywgT2JqZWN0IGFyZ3NbXSkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgU3RyaW5nIGZtc2cgPSBtX1hTTE1lc3NhZ2VzLmNyZWF0ZU1lc3NhZ2UobXNnLCBhcmdzKTsKLSAgICBTb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotICAgIHRyeXsKLSAgICAgbG9jYXRvciA9ICgoU3R5bGVzaGVldEhhbmRsZXIpKCgoVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCl0aGlzLm1fdGZhY3RvcnkpLm5ld1RlbXBsYXRlc0hhbmRsZXIoKSkpLmdldExvY2F0b3IoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpCi0gICAgewotICAgIH0KLSAgICBEZWZhdWx0RXJyb3JIYW5kbGVyIGhhbmRsZXI7Ci0gICAgaWYgKG1fcHJvYmxlbUxpc3RlbmVyID09IG51bGwpCi0gICAgICBoYW5kbGVyID0gKERlZmF1bHRFcnJvckhhbmRsZXIpbV90ZmFjdG9yeS5nZXRFcnJvckxpc3RlbmVyKCk7Ci0gICAgZWxzZQotICAgICAgaGFuZGxlciA9IChEZWZhdWx0RXJyb3JIYW5kbGVyKW1fcHJvYmxlbUxpc3RlbmVyLmdldEVycm9ySGFuZGxlcigpOwotICAgIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlID0gKG51bGwgPT0gZSkgPyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oZm1zZywgbG9jYXRvcikgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGZtc2csIGxvY2F0b3IsIGUpOwotICAgIGlmKG51bGwgIT0gaGFuZGxlcikKLSAgICB7ICAKLSAgICAgIHRyeXsKLSAgICAgICBoYW5kbGVyLmZhdGFsRXJyb3IodGUpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlMikKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0ZTIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHRlKTsKLSAgICAKLSAgIAotICB9Ci0gIAotICAvKioKLSAgICogTWFyayB0aGUgdGltZSwgc28gdGhhdCBkaXNwbGF5RHVyYXRpb24gY2FuIGxhdGVyCi0gICAqIGRpc3BsYXkgdGhlIGVsYXBzZS4KLSAgICovCi0gIHZvaWQgcHVzaFRpbWUoT2JqZWN0IGtleSkKLSAgewotICAgIGlmKG51bGwgIT0ga2V5KQotICAgIHsKLSAgICAgIG1fZHVyYXRpb25zVGFibGUucHV0KGtleSwgbmV3IExvbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZHVyYXRpb24gc2luY2UgcHVzaFRpbWUgd2FzIGNhbGxlZCwKLSAgICogaW4gbWlsbGlzZWNvbmRzLgotICAgKi8KLSAgbG9uZyBwb3BEdXJhdGlvbihPYmplY3Qga2V5KQotICB7Ci0gICAgbG9uZyBtaWxsaXNlY29uZHNEdXJhdGlvbiA9IDA7Ci0gICAgaWYobnVsbCAhPSBrZXkpCi0gICAgewotICAgICAgbG9uZyBzdGFydCA9ICgoTG9uZyltX2R1cmF0aW9uc1RhYmxlLmdldChrZXkpKS5sb25nVmFsdWUoKTsKLSAgICAgIGxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgbWlsbGlzZWNvbmRzRHVyYXRpb24gPSBzdG9wIC0gc3RhcnQ7Ci0gICAgICBtX2R1cmF0aW9uc1RhYmxlLnJlbW92ZShrZXkpOwotICAgIH0KLSAgICByZXR1cm4gbWlsbGlzZWNvbmRzRHVyYXRpb247Ci0gIH0KLSAgCi0gICAvKioKLSAgICogRGlzcGxheSB0aGUgZHVyYXRpb24gc2luY2UgcHVzaFRpbWUgd2FzIGNhbGxlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGRpc3BsYXlEdXJhdGlvbihTdHJpbmcgaW5mbywgT2JqZWN0IGtleSkKLSAgewotICAgIGxvbmcgbWlsbGlzZWNvbmRzRHVyYXRpb24gPSAwOwotICAgIGlmKG51bGwgIT0ga2V5KQotICAgIHsKLSAgICAgIGxvbmcgc3RhcnQgPSAoKExvbmcpbV9kdXJhdGlvbnNUYWJsZS5nZXQoa2V5KSkubG9uZ1ZhbHVlKCk7Ci0gICAgICBsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIG1pbGxpc2Vjb25kc0R1cmF0aW9uID0gc3RvcCAtIHN0YXJ0OwotICAgICAgaWYobnVsbCAhPSBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIpCi0gICAgICB7Ci0gICAgICAgIG1fZGlhZ25vc3RpY3NQcmludFdyaXRlci5wcmludGxuKGluZm8gKyAiIHRvb2sgIiArIG1pbGxpc2Vjb25kc0R1cmF0aW9uICsgIiBtaWxsaXNlY29uZHMiKTsKLSAgICAgIH0KLSAgICAgIG1fZHVyYXRpb25zVGFibGUucmVtb3ZlKGtleSk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogSWYgdGhpcyBpcyBzZXQsIGRpYWdub3N0aWNzIHdpbGwgYmUKLSAgICogd3JpdHRlbiB0byB0aGUgbV9kaWFnbm9zdGljc1ByaW50V3JpdGVyIHN0cmVhbS4gSWYKLSAgICogdGhlIHZhbHVlIGlzIG51bGwsIHRoZW4gZGlhZ25vc3RpY3Mgd2lsbCBiZSB0dXJuZWQKLSAgICogb2ZmLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGlhZ25vc3RpY3NPdXRwdXQoamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0KQotICB7Ci0gICAgc2V0RGlhZ25vc3RpY3NPdXRwdXQobmV3IFByaW50V3JpdGVyKG91dCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgc2V0LCBkaWFnbm9zdGljcyB3aWxsIGJlCi0gICAqIHdyaXR0ZW4gdG8gdGhlIG1fZGlhZ25vc3RpY3NQcmludFdyaXRlciBzdHJlYW0uIElmCi0gICAqIHRoZSB2YWx1ZSBpcyBudWxsLCB0aGVuIGRpYWdub3N0aWNzIHdpbGwgYmUgdHVybmVkCi0gICAqIG9mZi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERpYWdub3N0aWNzT3V0cHV0KGphdmEuaW8uUHJpbnRXcml0ZXIgcHcpCi0gIHsKLSAgICBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIgPSBwdzsKLSAgIC8qIGlmKGdldFByb2JsZW1MaXN0ZW5lcigpIGluc3RhbmNlb2YgUHJvYmxlbUxpc3RlbmVyRGVmYXVsdCkKLSAgICB7Ci0gICAgICAoKFByb2JsZW1MaXN0ZW5lckRlZmF1bHQpZ2V0UHJvYmxlbUxpc3RlbmVyKCkpLnNldERpYWdub3N0aWNzT3V0cHV0KHB3KTsKLSAgICB9Ki8KLSAgfQotCi0gIC8qKgotICAgKiBCb3R0bGVuZWNrIG91dHB1dCBvZiBkaWFnbm9zdGljcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGRpYWcoU3RyaW5nIHMpCi0gIHsKLSAgICBpZihudWxsICE9IG1fZGlhZ25vc3RpY3NQcmludFdyaXRlcikKLSAgICB7Ci0gICAgICBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIucHJpbnRsbihzKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZSwgc2ltcGxlIHRyYWNlcyBvZgotICAgKiB0ZW1wbGF0ZSBjYWxscyBhcmUgbWFkZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRyYWNlVGVtcGxhdGVzKGJvb2xlYW4gYikKLSAgewotICAgIG1fdHJhY2VUZW1wbGF0ZXMgPSBiOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIHNpbXBsZSB0cmFjZXMgb2YKLSAgICogdGVtcGxhdGUgY2FsbHMgYXJlIG1hZGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUcmFjZVNlbGVjdChib29sZWFuIGIpCi0gIHsKLSAgICBtX3RyYWNlU2VsZWN0cyA9IGI7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZSwgZGVidWcgZGlhZ25vc3RpY3MgYWJvdXQKLSAgICogdGVtcGxhdGUgY2hpbGRyZW4gYXMgdGhleSBhcmUgYmVpbmcgY29uc3RydWN0ZWQKLSAgICogd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIKLSAgICogc3RyZWFtLiAgZGlhZ25vc2VUZW1wbGF0ZUNoaWxkcmVuIGlzIGZhbHNlIGJ5Ci0gICAqIGRlZmF1bHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUcmFjZVRlbXBsYXRlQ2hpbGRyZW4oYm9vbGVhbiBiKQotICB7Ci0gICAgbV90cmFjZVRlbXBsYXRlQ2hpbGRyZW4gPSBiOwotICB9Ci0gIAotICAvLwotICAvLyBMZXhpY2FsIGhhbmRsZXIgaW50ZXJmYWNlCi0gIC8vCi0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgdGhlIHN0YXJ0IG9mIERURCBkZWNsYXJhdGlvbnMsIGlmIGFueS4KLSAgICAgKgotICAgICAqIDxwPkFueSBkZWNsYXJhdGlvbnMgYXJlIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGludGVybmFsIHN1YnNldAotICAgICAqIHVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJ5IGEge0BsaW5rICNzdGFydEVudGl0eSBzdGFydEVudGl0eX0KLSAgICAgKiBldmVudC48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHN0YXJ0L2VuZERURCBldmVudHMgd2lsbCBhcHBlYXIgd2l0aGluCi0gICAgICogdGhlIHN0YXJ0L2VuZERvY3VtZW50IGV2ZW50cyBmcm9tIENvbnRlbnRIYW5kbGVyIGFuZAotICAgICAqIGJlZm9yZSB0aGUgZmlyc3Qgc3RhcnRFbGVtZW50IGV2ZW50LjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBkb2N1bWVudCB0eXBlIG5hbWUuCi0gICAgICogQHBhcmFtIHB1YmxpY0lkIFRoZSBkZWNsYXJlZCBwdWJsaWMgaWRlbnRpZmllciBmb3IgdGhlCi0gICAgICogICAgICAgIGV4dGVybmFsIERURCBzdWJzZXQsIG9yIG51bGwgaWYgbm9uZSB3YXMgZGVjbGFyZWQuCi0gICAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBkZWNsYXJlZCBzeXN0ZW0gaWRlbnRpZmllciBmb3IgdGhlCi0gICAgICogICAgICAgIGV4dGVybmFsIERURCBzdWJzZXQsIG9yIG51bGwgaWYgbm9uZSB3YXMgZGVjbGFyZWQuCi0gICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbgotICAgICAqICAgICAgICAgICAgZXhjZXB0aW9uLgotICAgICAqIEBzZWUgI2VuZERURAotICAgICAqIEBzZWUgI3N0YXJ0RW50aXR5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnREVEQgKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwgJiYgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRMZXhpY2FsSGFuZGxlcigpICE9IG51bGwpCi0gICAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0TGV4aWNhbEhhbmRsZXIoKS5zdGFydERURChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0IHRoZSBlbmQgb2YgRFREIGRlY2xhcmF0aW9ucy4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotICAgICAqIEBzZWUgI3N0YXJ0RFRECi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRFREICgpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsICYmIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0TGV4aWNhbEhhbmRsZXIoKSAhPSBudWxsKQotICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dExleGljYWxIYW5kbGVyKCkuZW5kRFREKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5IChTdHJpbmcgbmFtZSkKLQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwgJiYgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRMZXhpY2FsSGFuZGxlcigpICE9IG51bGwpCi0gICAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0TGV4aWNhbEhhbmRsZXIoKS5zdGFydEVudGl0eSAobmFtZSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgdGhlIGVuZCBvZiBhbiBlbnRpdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgZW5kaW5nLgotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotICAgICAqIEBzZWUgI3N0YXJ0RW50aXR5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRW50aXR5IChTdHJpbmcgbmFtZSkKLQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICBpZiAobV90cmFuc2Zvcm1lckltcGwgIT0gbnVsbCAmJiBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dExleGljYWxIYW5kbGVyKCkgIT0gbnVsbCkKLSAgICAgICAgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRMZXhpY2FsSGFuZGxlcigpLmVuZEVudGl0eSAobmFtZSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgdGhlIHN0YXJ0IG9mIGEgQ0RBVEEgc2VjdGlvbi4KLSAgICAgKgotICAgICAqIDxwPlRoZSBjb250ZW50cyBvZiB0aGUgQ0RBVEEgc2VjdGlvbiB3aWxsIGJlIHJlcG9ydGVkIHRocm91Z2gKLSAgICAgKiB0aGUgcmVndWxhciB7QGxpbmsgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjY2hhcmFjdGVycwotICAgICAqIGNoYXJhY3RlcnN9IGV2ZW50LjwvcD4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotICAgICAqIEBzZWUgI2VuZENEQVRBCi0gICAgICovCi0gICAgcHVibGljICB2b2lkIHN0YXJ0Q0RBVEEgKCkKLQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgeyAKLSAgICAgIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsICYmIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0TGV4aWNhbEhhbmRsZXIoKSAhPSBudWxsKQotICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dExleGljYWxIYW5kbGVyKCkuc3RhcnRDREFUQSgpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0IHRoZSBlbmQgb2YgYSBDREFUQSBzZWN0aW9uLgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0gICAgICogQHNlZSAjc3RhcnRDREFUQQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZENEQVRBICgpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsICYmIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0TGV4aWNhbEhhbmRsZXIoKSAhPSBudWxsKQotICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dExleGljYWxIYW5kbGVyKCkuZW5kQ0RBVEEoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCBhbiBYTUwgY29tbWVudCBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiA8cD5UaGlzIGNhbGxiYWNrIHdpbGwgYmUgdXNlZCBmb3IgY29tbWVudHMgaW5zaWRlIG9yIG91dHNpZGUgdGhlCi0gICAgICogZG9jdW1lbnQgZWxlbWVudCwgaW5jbHVkaW5nIGNvbW1lbnRzIGluIHRoZSBleHRlcm5hbCBEVEQKLSAgICAgKiBzdWJzZXQgKGlmIHJlYWQpLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjaCBBbiBhcnJheSBob2xkaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBjb21tZW50LgotICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnRpbmcgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZSBmcm9tIHRoZSBhcnJheS4KLSAgICAgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgIHZvaWQgY29tbWVudCAoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwgJiYgbV90cmFuc2Zvcm1lckltcGwuZ2V0SW5wdXRMZXhpY2FsSGFuZGxlcigpICE9IG51bGwpCi0gICAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0TGV4aWNhbEhhbmRsZXIoKS5jb21tZW50IChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgfQotICAgIAotICAgIC8vIERvY3VtZW50SGFuZGxlciBpbnRlcmZhY2UKLSAgICAKLSAgICAgICAgLyoqCi0gICAgICogUmVjZWl2ZSBhbiBvYmplY3QgZm9yIGxvY2F0aW5nIHRoZSBvcmlnaW4gb2YgU0FYIGRvY3VtZW50IGV2ZW50cy4KLSAgICAgKgotICAgICAqIDxwPlNBWCBwYXJzZXJzIGFyZSBzdHJvbmdseSBlbmNvdXJhZ2VkICh0aG91Z2ggbm90IGFic29sdXRlbHkKLSAgICAgKiByZXF1aXJlZCkgdG8gc3VwcGx5IGEgbG9jYXRvcjogaWYgaXQgZG9lcyBzbywgaXQgbXVzdCBzdXBwbHkKLSAgICAgKiB0aGUgbG9jYXRvciB0byB0aGUgYXBwbGljYXRpb24gYnkgaW52b2tpbmcgdGhpcyBtZXRob2QgYmVmb3JlCi0gICAgICogaW52b2tpbmcgYW55IG9mIHRoZSBvdGhlciBtZXRob2RzIGluIHRoZSBEb2N1bWVudEhhbmRsZXIKLSAgICAgKiBpbnRlcmZhY2UuPC9wPgotICAgICAqCi0gICAgICogPHA+VGhlIGxvY2F0b3IgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBkZXRlcm1pbmUgdGhlIGVuZAotICAgICAqIHBvc2l0aW9uIG9mIGFueSBkb2N1bWVudC1yZWxhdGVkIGV2ZW50LCBldmVuIGlmIHRoZSBwYXJzZXIgaXMKLSAgICAgKiBub3QgcmVwb3J0aW5nIGFuIGVycm9yLiAgVHlwaWNhbGx5LCB0aGUgYXBwbGljYXRpb24gd2lsbAotICAgICAqIHVzZSB0aGlzIGluZm9ybWF0aW9uIGZvciByZXBvcnRpbmcgaXRzIG93biBlcnJvcnMgKHN1Y2ggYXMKLSAgICAgKiBjaGFyYWN0ZXIgY29udGVudCB0aGF0IGRvZXMgbm90IG1hdGNoIGFuIGFwcGxpY2F0aW9uJ3MKLSAgICAgKiBidXNpbmVzcyBydWxlcykuICBUaGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgdGhlIGxvY2F0b3IKLSAgICAgKiBpcyBwcm9iYWJseSBub3Qgc3VmZmljaWVudCBmb3IgdXNlIHdpdGggYSBzZWFyY2ggZW5naW5lLjwvcD4KLSAgICAgKgotICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgbG9jYXRvciB3aWxsIHJldHVybiBjb3JyZWN0IGluZm9ybWF0aW9uIG9ubHkKLSAgICAgKiBkdXJpbmcgdGhlIGludm9jYXRpb24gb2YgdGhlIGV2ZW50cyBpbiB0aGlzIGludGVyZmFjZS4gIFRoZQotICAgICAqIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgYXQgYW55IG90aGVyIHRpbWUuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGxvY2F0b3IgQW4gb2JqZWN0IHRoYXQgY2FuIHJldHVybiB0aGUgbG9jYXRpb24gb2YKLSAgICAgKiAgICAgICAgICAgICAgICBhbnkgU0FYIGRvY3VtZW50IGV2ZW50LgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguTG9jYXRvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvciAoTG9jYXRvciBsb2NhdG9yKQotICAgIHt9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiBhIGRvY3VtZW50LgotICAgICAqCi0gICAgICogPHA+VGhlIFNBWCBwYXJzZXIgd2lsbCBpbnZva2UgdGhpcyBtZXRob2Qgb25seSBvbmNlLCBiZWZvcmUgYW55Ci0gICAgICogb3RoZXIgbWV0aG9kcyBpbiB0aGlzIGludGVyZmFjZSBvciBpbiBEVERIYW5kbGVyIChleGNlcHQgZm9yCi0gICAgICogc2V0RG9jdW1lbnRMb2NhdG9yKS48L3A+Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKLSAgICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQgKCkKLQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKG1fZG9jdW1lbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgIG1fZG9jdW1lbnRIYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgIGVsc2UgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwpCi0gICAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0Q29udGVudEhhbmRsZXIoKS5zdGFydERvY3VtZW50KCk7Ci0gICAgICAvL21fdHJhbnNmb3JtZXJJbXBsLmdldFJlc3VsdFRyZWVIYW5kbGVyKCkuc3RhcnREb2N1bWVudCgpOwotICAgICAgCi0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBlbmQgb2YgYSBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIDxwPlRoZSBTQVggcGFyc2VyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG9ubHkgb25jZSwgYW5kIGl0IHdpbGwKLSAgICAgKiBiZSB0aGUgbGFzdCBtZXRob2QgaW52b2tlZCBkdXJpbmcgdGhlIHBhcnNlLiAgVGhlIHBhcnNlciBzaGFsbAotICAgICAqIG5vdCBpbnZva2UgdGhpcyBtZXRob2QgdW50aWwgaXQgaGFzIGVpdGhlciBhYmFuZG9uZWQgcGFyc2luZwotICAgICAqIChiZWNhdXNlIG9mIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IpIG9yIHJlYWNoZWQgdGhlIGVuZCBvZgotICAgICAqIGlucHV0LjwvcD4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQotICAgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQgKCkKLQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKG1fZG9jdW1lbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgIG1fZG9jdW1lbnRIYW5kbGVyLmVuZERvY3VtZW50KCk7Ci0gICAgICBlbHNlIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsKQotICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dENvbnRlbnRIYW5kbGVyKCkuZW5kRG9jdW1lbnQoKTsKLSAgICAgIC8vbV90cmFuc2Zvcm1lckltcGwuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKS5lbmREb2N1bWVudCgpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIGFuIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiA8cD5UaGUgUGFyc2VyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkKLSAgICAgKiBlbGVtZW50IGluIHRoZSBYTUwgZG9jdW1lbnQ7IHRoZXJlIHdpbGwgYmUgYSBjb3JyZXNwb25kaW5nCi0gICAgICogZW5kRWxlbWVudCgpIGV2ZW50IGZvciBldmVyeSBzdGFydEVsZW1lbnQoKSBldmVudCAoZXZlbiB3aGVuIHRoZQotICAgICAqIGVsZW1lbnQgaXMgZW1wdHkpLiBBbGwgb2YgdGhlIGVsZW1lbnQncyBjb250ZW50IHdpbGwgYmUKLSAgICAgKiByZXBvcnRlZCwgaW4gb3JkZXIsIGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZyBlbmRFbGVtZW50KCkKLSAgICAgKiBldmVudC48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5JZiB0aGUgZWxlbWVudCBuYW1lIGhhcyBhIG5hbWVzcGFjZSBwcmVmaXgsIHRoZSBwcmVmaXggd2lsbAotICAgICAqIHN0aWxsIGJlIGF0dGFjaGVkLiAgTm90ZSB0aGF0IHRoZSBhdHRyaWJ1dGUgbGlzdCBwcm92aWRlZCB3aWxsCi0gICAgICogY29udGFpbiBvbmx5IGF0dHJpYnV0ZXMgd2l0aCBleHBsaWNpdCB2YWx1ZXMgKHNwZWNpZmllZCBvcgotICAgICAqIGRlZmF1bHRlZCk6ICNJTVBMSUVEIGF0dHJpYnV0ZXMgd2lsbCBiZSBvbWl0dGVkLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBlbGVtZW50IHR5cGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gYXR0cyBUaGUgYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCwgaWYgYW55LgotICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQotICAgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCi0gICAgICogQHNlZSAjZW5kRWxlbWVudAotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdCAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQgKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVMaXN0IGF0dHMpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChtX2RvY3VtZW50SGFuZGxlciA9PSBudWxsKSAgICAgICAKLSAgICAgIHsgCi0gICAgICAgIG1fZG9jdW1lbnRIYW5kbGVyID0gbmV3IFBhcnNlckFkYXB0ZXIobmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCkpOwotICAgICAgICBpZiAobV90cmFuc2Zvcm1lckltcGwgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgKChQYXJzZXJBZGFwdGVyKW1fZG9jdW1lbnRIYW5kbGVyKS5zZXRDb250ZW50SGFuZGxlcihtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dENvbnRlbnRIYW5kbGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8qIGVsc2UgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgKQotICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dENvbnRlbnRIYW5kbGVyKCkuc3RhcnRFbGVtZW50KG51bGwsIG5hbWUsIG5hbWUsIChBdHRyaWJ1dGVzKWF0dHMpOwotICAgICAgICAvL2dldFJlc3VsdFRyZWVIYW5kbGVyKCkuc3RhcnRFbGVtZW50KG51bGwsIG5hbWUsIG5hbWUsIChBdHRyaWJ1dGVzKWF0dHMpOwotICAgICAgICBlbHNlCi0gICAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0Q29udGVudEhhbmRsZXIoKS5zdGFydEVsZW1lbnQobmFtZS5zdWJzdHJpbmcoMCxpbmRleCksIG5hbWUuc3Vic3RyaW5nKGluZGV4KzEpLCBuYW1lLCAoQXR0cmlidXRlcylhdHRzKTsgICAgICAgIAotICAgICAgICAvL21fdHJhbnNmb3JtZXJJbXBsLmdldFJlc3VsdFRyZWVIYW5kbGVyKCkuc3RhcnRFbGVtZW50KG5hbWUuc3Vic3RyaW5nKDAsaW5kZXgpLCBuYW1lLnN1YnN0cmluZyhpbmRleCsxKSwgbmFtZSwgKEF0dHJpYnV0ZXMpYXR0cyk7Ci0gICAgICAgICovIAotICAgICAgfSAKLSAgICAgIG1fZG9jdW1lbnRIYW5kbGVyLnN0YXJ0RWxlbWVudChuYW1lLCBhdHRzKTsKLSAgICB9ICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGVuZCBvZiBhbiBlbGVtZW50LgotICAgICAqCi0gICAgICogPHA+VGhlIFNBWCBwYXJzZXIgd2lsbCBpbnZva2UgdGhpcyBtZXRob2QgYXQgdGhlIGVuZCBvZiBldmVyeQotICAgICAqIGVsZW1lbnQgaW4gdGhlIFhNTCBkb2N1bWVudDsgdGhlcmUgd2lsbCBiZSBhIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBzdGFydEVsZW1lbnQoKSBldmVudCBmb3IgZXZlcnkgZW5kRWxlbWVudCgpIGV2ZW50IChldmVuIHdoZW4gdGhlCi0gICAgICogZWxlbWVudCBpcyBlbXB0eSkuPC9wPgotICAgICAqCi0gICAgICogPHA+SWYgdGhlIGVsZW1lbnQgbmFtZSBoYXMgYSBuYW1lc3BhY2UgcHJlZml4LCB0aGUgcHJlZml4IHdpbGwKLSAgICAgKiBzdGlsbCBiZSBhdHRhY2hlZCB0byB0aGUgbmFtZS48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZWxlbWVudCB0eXBlIG5hbWUKLSAgICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKLSAgICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQgKFN0cmluZyBuYW1lKQotCXRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAobV9kb2N1bWVudEhhbmRsZXIgPT0gbnVsbCkgICAgICAgIAotICAgICAgeyAgICAgICAgIAotICAgICAgICBtX2RvY3VtZW50SGFuZGxlciA9IG5ldyBQYXJzZXJBZGFwdGVyKG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpKTsKLSAgICAgICAgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFBhcnNlckFkYXB0ZXIpbV9kb2N1bWVudEhhbmRsZXIpLnNldENvbnRlbnRIYW5kbGVyKG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0Q29udGVudEhhbmRsZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgLyogZWxzZSBpZiAobV90cmFuc2Zvcm1lckltcGwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgKQotICAgICAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0Q29udGVudEhhbmRsZXIoKS5lbmRFbGVtZW50KG51bGwsIG5hbWUsIG5hbWUpOwotICAgICAgICAgIC8vbV90cmFuc2Zvcm1lckltcGwuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKS5lbmRFbGVtZW50KG51bGwsIG5hbWUsIG5hbWUpOyAgICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dENvbnRlbnRIYW5kbGVyKCkuZW5kRWxlbWVudChuYW1lLnN1YnN0cmluZygwLGluZGV4KSwgbmFtZS5zdWJzdHJpbmcoaW5kZXgrMSksIG5hbWUpOwotICAgICAgICAgIC8vbV90cmFuc2Zvcm1lckltcGwuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKS5lbmRFbGVtZW50KG5hbWUuc3Vic3RyaW5nKDAsaW5kZXgpLCBuYW1lLnN1YnN0cmluZyhpbmRleCsxKSwgbmFtZSk7Ci0gICAgICAgICovCi0gICAgICB9IAotICAgICAgbV9kb2N1bWVudEhhbmRsZXIuZW5kRWxlbWVudChuYW1lKTsgICAgICAKLSAgICB9ICAgICAKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBjaGFyYWN0ZXIgZGF0YS4KLSAgICAgKgotICAgICAqIDxwPlRoZSBQYXJzZXIgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvIHJlcG9ydCBlYWNoIGNodW5rIG9mCi0gICAgICogY2hhcmFjdGVyIGRhdGEuICBTQVggcGFyc2VycyBtYXkgcmV0dXJuIGFsbCBjb250aWd1b3VzIGNoYXJhY3RlcgotICAgICAqIGRhdGEgaW4gYSBzaW5nbGUgY2h1bmssIG9yIHRoZXkgbWF5IHNwbGl0IGl0IGludG8gc2V2ZXJhbAotICAgICAqIGNodW5rczsgaG93ZXZlciwgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzIGluIGFueSBzaW5nbGUgZXZlbnQKLSAgICAgKiBtdXN0IGNvbWUgZnJvbSB0aGUgc2FtZSBleHRlcm5hbCBlbnRpdHksIHNvIHRoYXQgdGhlIExvY2F0b3IKLSAgICAgKiBwcm92aWRlcyB1c2VmdWwgaW5mb3JtYXRpb24uPC9wPgotICAgICAqCi0gICAgICogPHA+VGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGF0dGVtcHQgdG8gcmVhZCBmcm9tIHRoZSBhcnJheQotICAgICAqIG91dHNpZGUgb2YgdGhlIHNwZWNpZmllZCByYW5nZS48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5Ob3RlIHRoYXQgc29tZSBwYXJzZXJzIHdpbGwgcmVwb3J0IHdoaXRlc3BhY2UgdXNpbmcgdGhlCi0gICAgICogaWdub3JhYmxlV2hpdGVzcGFjZSgpIG1ldGhvZCByYXRoZXIgdGhhbiB0aGlzIG9uZSAodmFsaWRhdGluZwotICAgICAqIHBhcnNlcnMgbXVzdCBkbyBzbykuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNoIFRoZSBjaGFyYWN0ZXJzIGZyb20gdGhlIFhNTCBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkIGZyb20gdGhlIGFycmF5LgotICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQotICAgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCi0gICAgICogQHNlZSAjaWdub3JhYmxlV2hpdGVzcGFjZSAKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkxvY2F0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzIChjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKG1fZG9jdW1lbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgIG1fZG9jdW1lbnRIYW5kbGVyLmNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgZWxzZSBpZiAobV90cmFuc2Zvcm1lckltcGwgIT0gbnVsbCkKLSAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLmdldElucHV0Q29udGVudEhhbmRsZXIoKS5jaGFyYWN0ZXJzKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIC8vbV90cmFuc2Zvcm1lckltcGwuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKS5jaGFyYWN0ZXJzKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICB9ICAKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBpZ25vcmFibGUgd2hpdGVzcGFjZSBpbiBlbGVtZW50IGNvbnRlbnQuCi0gICAgICoKLSAgICAgKiA8cD5WYWxpZGF0aW5nIFBhcnNlcnMgbXVzdCB1c2UgdGhpcyBtZXRob2QgdG8gcmVwb3J0IGVhY2ggY2h1bmsKLSAgICAgKiBvZiBpZ25vcmFibGUgd2hpdGVzcGFjZSAoc2VlIHRoZSBXM0MgWE1MIDEuMCByZWNvbW1lbmRhdGlvbiwKLSAgICAgKiBzZWN0aW9uIDIuMTApOiBub24tdmFsaWRhdGluZyBwYXJzZXJzIG1heSBhbHNvIHVzZSB0aGlzIG1ldGhvZAotICAgICAqIGlmIHRoZXkgYXJlIGNhcGFibGUgb2YgcGFyc2luZyBhbmQgdXNpbmcgY29udGVudCBtb2RlbHMuPC9wPgotICAgICAqCi0gICAgICogPHA+U0FYIHBhcnNlcnMgbWF5IHJldHVybiBhbGwgY29udGlndW91cyB3aGl0ZXNwYWNlIGluIGEgc2luZ2xlCi0gICAgICogY2h1bmssIG9yIHRoZXkgbWF5IHNwbGl0IGl0IGludG8gc2V2ZXJhbCBjaHVua3M7IGhvd2V2ZXIsIGFsbCBvZgotICAgICAqIHRoZSBjaGFyYWN0ZXJzIGluIGFueSBzaW5nbGUgZXZlbnQgbXVzdCBjb21lIGZyb20gdGhlIHNhbWUKLSAgICAgKiBleHRlcm5hbCBlbnRpdHksIHNvIHRoYXQgdGhlIExvY2F0b3IgcHJvdmlkZXMgdXNlZnVsCi0gICAgICogaW5mb3JtYXRpb24uPC9wPgotICAgICAqCi0gICAgICogPHA+VGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGF0dGVtcHQgdG8gcmVhZCBmcm9tIHRoZSBhcnJheQotICAgICAqIG91dHNpZGUgb2YgdGhlIHNwZWNpZmllZCByYW5nZS48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY2ggVGhlIGNoYXJhY3RlcnMgZnJvbSB0aGUgWE1MIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQgZnJvbSB0aGUgYXJyYXkuCi0gICAgICogQGV4Y2VwdGlvbiBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5Ci0gICAgICogICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KLSAgICAgKiBAc2VlICNjaGFyYWN0ZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSAoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChtX2RvY3VtZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBtX2RvY3VtZW50SGFuZGxlci5pZ25vcmFibGVXaGl0ZXNwYWNlKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIGVsc2UgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwpCi0gICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dENvbnRlbnRIYW5kbGVyKCkuaWdub3JhYmxlV2hpdGVzcGFjZShjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICAvL21fdHJhbnNmb3JtZXJJbXBsLmdldFJlc3VsdFRyZWVIYW5kbGVyKCkuaWdub3JhYmxlV2hpdGVzcGFjZShjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLSAgICAgKgotICAgICAqIDxwPlRoZSBQYXJzZXIgd2lsbCBpbnZva2UgdGhpcyBtZXRob2Qgb25jZSBmb3IgZWFjaCBwcm9jZXNzaW5nCi0gICAgICogaW5zdHJ1Y3Rpb24gZm91bmQ6IG5vdGUgdGhhdCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBtYXkgb2NjdXIKLSAgICAgKiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIG1haW4gZG9jdW1lbnQgZWxlbWVudC48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5BIFNBWCBwYXJzZXIgc2hvdWxkIG5ldmVyIHJlcG9ydCBhbiBYTUwgZGVjbGFyYXRpb24gKFhNTCAxLjAsCi0gICAgICogc2VjdGlvbiAyLjgpIG9yIGEgdGV4dCBkZWNsYXJhdGlvbiAoWE1MIDEuMCwgc2VjdGlvbiA0LjMuMSkKLSAgICAgKiB1c2luZyB0aGlzIG1ldGhvZC48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldC4KLSAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBkYXRhLCBvciBudWxsIGlmCi0gICAgICogICAgICAgIG5vbmUgd2FzIHN1cHBsaWVkLgotICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQotICAgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljICB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbiAoU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpCi0JdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChtX2RvY3VtZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBtX2RvY3VtZW50SGFuZGxlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkYXRhKTsKLSAgICAgIGVsc2UgaWYgKG1fdHJhbnNmb3JtZXJJbXBsICE9IG51bGwpCi0gICAgICBtX3RyYW5zZm9ybWVySW1wbC5nZXRJbnB1dENvbnRlbnRIYW5kbGVyKCkucHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSk7Ci0gICAgICAvL21fdHJhbnNmb3JtZXJJbXBsLmdldFJlc3VsdFRyZWVIYW5kbGVyKCkucHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSk7Ci0gICAgfQotICAgIAotICAgIC8vIEltcGxlbWVudCBYU0xUUHJvY2Vzc29yCi0gICAgCi0gICAgLyoqCi0gICAqIFNldCB0aGUgb3V0cHV0IHN0cmVhbS4gUmVxdWlyZWQgd2hlbiB0aGUgWFNMVFByb2Nlc3NvciBpcyBiZWluZyB1c2VkCi0gICAqIGFzIGEgU0FYIERvY3VtZW50SGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSBvcykKLSAgewotICAgIFNvdXJjZVRyZWVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgU291cmNlVHJlZUhhbmRsZXIobV90cmFuc2Zvcm1lckltcGwpOwotICAgIGhhbmRsZXIuc2V0UmVzdWx0KG5ldyBTdHJlYW1SZXN1bHQob3MpKTsgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBYU3RyaW5nLgotICAgKiBAcGFyYW0gcyBBIHZhbGlkIHN0cmluZy4KLSAgICogQHJldHVybiBBbiBYU3RyaW5nIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYU3RyaW5nIGNyZWF0ZVhTdHJpbmcoU3RyaW5nIHMpCi0gIHsKLSAgICByZXR1cm4gbmV3IFhTdHJpbmcocyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIFhPYmplY3QuCi0gICAqIEBwYXJhbSBvIEFueSBqYXZhIG9iamVjdC4KLSAgICogQHJldHVybiBBbiBYT2JqZWN0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYT2JqZWN0IGNyZWF0ZVhPYmplY3QoT2JqZWN0IG8pCi0gIHsKLSAgICByZXR1cm4gbmV3IFhPYmplY3Qobyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIFhOdW1iZXIuCi0gICAqIEBwYXJhbSBkIEFueSBkb3VibGUgbnVtYmVyLgotICAgKiBAcmV0dXJuIEFuIFhOdW1iZXIgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhOdW1iZXIgY3JlYXRlWE51bWJlcihkb3VibGUgZCkKLSAgewotICAgIHJldHVybiBuZXcgWE51bWJlcihkKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gWEJvb2xlYW4uCi0gICAqIEBwYXJhbSBiIGJvb2xlYW4gdmFsdWUuCi0gICAqIEByZXR1cm4gQW4gWEJvb2xlYW4gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhCb29sZWFuIGNyZWF0ZVhCb29sZWFuKGJvb2xlYW4gYikKLSAgewotICAgIHJldHVybiBuZXcgWEJvb2xlYW4oYik7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIFhOb2RlU2V0LgotICAgKiBAcGFyYW0gbmwgQSBOb2RlTGlzdCBvYmplY3QuCi0gICAqIEByZXR1cm4gQW4gWE5vZGVTZXQgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhOb2RlU2V0IGNyZWF0ZVhOb2RlU2V0KE5vZGVMaXN0IG5sKQotICB7Ci0gICAgcmV0dXJuIG5ldyBYTm9kZVNldChubCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIFhOb2RlU2V0IGZyb20gYSBub2RlLgotICAgKiBAcGFyYW0gbiBBIERPTSBub2RlLgotICAgKiBAcmV0dXJuIEFuIFhOb2RlU2V0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYTm9kZVNldCBjcmVhdGVYTm9kZVNldChOb2RlIG4pCi0gIHsKLSAgICByZXR1cm4gbmV3IFhOb2RlU2V0KG4pOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBYTnVsbC4KLSAgICogQHJldHVybiBBbiBYTnVsbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWE51bGwgY3JlYXRlWE51bGwoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBYTnVsbCgpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBYTUxQYXJzZXJMaWFpc29uIHRoYXQgdGhpcyBwcm9jZXNzb3IgdXNlcy4KLSAgICovCi0gIHB1YmxpYyBYTUxQYXJzZXJMaWFpc29uIGdldFhNTFByb2Nlc3NvckxpYWlzb24oKQotICB7Ci0gICAgcmV0dXJuIChYTUxQYXJzZXJMaWFpc29uKW1fbGlhaXNvbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHByZWZlcnJlZCBzdHlsZXNoZWV0IGZvciB0aGUgWFNMVElucHV0U291cmNlIFhNTCBkb2N1bWVudCwKLSAgICogYXMgaWRlbnRpZmllZCBieSB0aGUgeG1sLXN0eWxlc2hlZXQgUEksIGFuZCBtYXRjaGluZyB0aGUgbWVkaWEgYW5kCi0gICAqIGNoYXJzZXQgY3JpdGVyaWEuIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldC8iPgotICAgKiBBc3NvY2lhdGluZyBTdHlsZSBTaGVldHMgd2l0aCBYTUwgZG9jdW1lbnRzPC9hPi4KLSAgICogRG9lcyBub3QgeWV0IGhhbmRsZSB0aGUgTElOSyBSRUw9InN0eWxlc2hlZXQiIHN5bnRheC4KLSAgICoKLSAgICogQHBhcmFtIG1lZGlhIFRoZSBtZWRpYSBhdHRyaWJ1dGUgdG8gYmUgbWF0Y2hlZC4gIE1heSBiZSBudWxsLCBpbiB3aGljaAotICAgKiAgICAgICAgICAgICAgY2FzZSB0aGUgcHJlZmVyZWQgc3R5bGVzaGVldCB3aWxsIGJlIHVzZWQgKGkuZS4sIGFsdGVybmF0ZSA9IG5vKS4KLSAgICogQHBhcmFtIHRpdGxlIFRoZSB2YWx1ZSBvZiB0aGUgdGl0bGUgYXR0cmlidXRlIHRvIG1hdGNoLiAgTWF5IGJlIG51bGwuCi0gICAqIEBwYXJhbSBjaGFyc2V0IFRoZSB2YWx1ZSBvZiB0aGUgY2hhcnNldCBhdHRyaWJ1dGUgdG8gbWF0Y2guICBNYXkgYmUgbnVsbC4KLSAgICogQHJldHVybnMgU3R5bGVzaGVldFNwZWMgZXh0ZW5kcyBYU0xUSW5wdXRTb3VyY2UgZXh0ZWRucyBTQVggSW5wdXRTb3VyY2U7IHRoZSByZXR1cm4gdmFsdWUKLSAgICogY2FuIGJlIHBhc3NlZCB0byB0aGUgcHJvY2Vzc1N0eWxlc2hlZXQgbWV0aG9kLgotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXRTcGVjIGdldEFzc29jaWF0ZWRTdHlsZXNoZWV0KFhTTFRJbnB1dFNvdXJjZSBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVkaWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2hhcnNldCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICAvKklucHV0U291cmNlW11pbiA9IG1fcHJvY2Vzc29yLmdldEFzc29jaWF0ZWRTdHlsZXNoZWV0cyhzb3VyY2UsIG1lZGlhLCBudWxsLCBjaGFyc2V0KTsKLSAgICBpZiAoaW4ubGVuZ3RoID4wKQotICAgICAgcmV0dXJuIChTdHlsZXNoZWV0U3BlYylpblswXTsKLSAgICBlbHNlIAotICAgICAgcmV0dXJuIG51bGw7ICovCi0gICAgdHJ5ewotICAgIFNvdXJjZSBzID0gbV90ZmFjdG9yeS5nZXRBc3NvY2lhdGVkU3R5bGVzaGVldChzb3VyY2UuZ2V0U291cmNlT2JqZWN0KCksIG1lZGlhLCBudWxsLCBjaGFyc2V0KTsKLSAgICByZXR1cm4gKFN0eWxlc2hlZXRTcGVjKXM7IAotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHRjZSkgCi0gICAgewotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0Y2UpOyAKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEgbGlzdCBvZiBzdHlsZXNoZWV0IHNwZWNpZmljYXRpb25zIGZvciB0aGUgWFNMVElucHV0U291cmNlIFhNTCBkb2N1bWVudCwKLSAgICogYXMgaWRlbnRpZmllZCBieSB0aGUgeG1sLXN0eWxlc2hlZXQgUEksIGFuZCBtYXRjaGluZyB0aGUgbWVkaWEgYW5kCi0gICAqIGNoYXJzZXQgY3JpdGVyaWEuIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldC8iPgotICAgKiBBc3NvY2lhdGluZyBTdHlsZSBTaGVldHMgd2l0aCBYTUwgZG9jdW1lbnRzPC9hPi4KLSAgICogRG9lcyBub3QgeWV0IGhhbmRsZSB0aGUgTElOSyBSRUw9InN0eWxlc2hlZXQiIHN5bnRheC4KLSAgICoKLSAgICogQHBhcmFtIG1lZGlhIFRoZSBtZWRpYSBhdHRyaWJ1dGUgdG8gYmUgbWF0Y2hlZC4gIE1heSBiZSBudWxsLCBpbiB3aGljaAotICAgKiAgICAgICAgICAgICAgY2FzZSB0aGUgcHJlZmVyZWQgc3R5bGVzaGVldCB3aWxsIGJlIHVzZWQgKGkuZS4sIGFsdGVybmF0ZSA9IG5vKS4KLSAgICogQHBhcmFtIHRpdGxlIFRoZSB2YWx1ZSBvZiB0aGUgdGl0bGUgYXR0cmlidXRlIHRvIG1hdGNoLiAgTWF5IGJlIG51bGwuCi0gICAqIEBwYXJhbSBjaGFyc2V0IFRoZSB2YWx1ZSBvZiB0aGUgY2hhcnNldCBhdHRyaWJ1dGUgdG8gbWF0Y2guICBNYXkgYmUgbnVsbC4KLSAgICogQHJldHVybnMgbGlzdCBvZiBTdHlsZXNoZWV0U3BlY3MgKGV4dGVuZCBYU0xUSW5wdXRTb3VyY2VzIGV4dGVuZCBTQVggSW5wdXRTb3VyY2VzOyBhCi0gICAqIGxpc3QgbWVtYmVyIG1heSBiZSBwYXNzc2VkIHRvIHRoZSBwcm9jZXNzU3R5bGVzaGVldCBtZXRob2QuCi0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldEFzc29jaWF0ZWRTdHlsZXNoZWV0cyhYU0xUSW5wdXRTb3VyY2Ugc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lZGlhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5ewotICAgICAgU291cmNlIHMgPSBtX3RmYWN0b3J5LmdldEFzc29jaWF0ZWRTdHlsZXNoZWV0KHNvdXJjZS5nZXRTb3VyY2VPYmplY3QoKSwgbWVkaWEsIG51bGwsIGNoYXJzZXQpOwotICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAvL2ZvciAoaW50IGkgPSAwOyBpPCBpbi5sZW5ndGg7IGkrKykKLSAgICAgIHYuYWRkRWxlbWVudCgoU3R5bGVzaGVldFNwZWMpcyk7Ci0gICAgICByZXR1cm4gdjsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0Y2UpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBTdWJtaXQgYSB0b3AtbGV2ZWwgc3R5bGVzaGVldCBwYXJhbWV0ZXIuICBUaGlzIHZhbHVlIGNhbgotICAgKiBiZSBldmFsdWF0ZWQgaW4gdGhlIHN0eWxlc2hlZXQgdmlhIHhzbDpwYXJhbS12YXJpYWJsZS4KLSAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgcGFyYW0uCi0gICAqIEBwYXJhbSB2YWx1ZSBBbiBYT2JqZWN0IHRoYXQgd2lsbCBiZSB1c2VkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3R5bGVzaGVldFBhcmFtKFN0cmluZyBrZXksIFhPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBzZXRQYXJhbWV0ZXIoa2V5LCB2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGEgdG9wLWxldmVsIHN0eWxlc2hlZXQgcGFyYW1ldGVyLiAgVGhpcyB2YWx1ZSBjYW4KLSAgICogYmUgZXZhbHVhdGVkIHZpYSB4c2w6cGFyYW0tdmFyaWFibGUuICBOb3RlIHRoYXQgdGhlIHZhbHVlCi0gICAqIHBhc3NlZCBpcyBhbiBleHByZXNzaW9uLCBhbmQgbm90IGEgc3RyaW5nLiAgVGhpcyBtZWFucyB0aGF0Ci0gICAqIHNldFN0eWxlc2hlZXRQYXJhbSgiZm9vIiwgImhlbGxvIik7IHdpbGwgbG9vayBmb3IgdGhlCi0gICAqIGVsZW1lbnQgImhlbGxvIi4gIElmIHlvdSB3YW50IHRvIHBhc3MgYSBzdHJpbmcsIHlvdSdsbAotICAgKiBuZWVkIHRvIHB1dCBxdW90ZXMgYXJvdW5kIGl0OgotICAgKiBzZXRTdHlsZXNoZWV0UGFyYW0oImZvbyIsICInaGVsbG8nIik7IHdpbGwgbG9vayBmb3IgdGhlCi0gICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHBhcmFtLgotICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBBbiBleHByZXNzaW9uIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdHlsZXNoZWV0UGFyYW0oU3RyaW5nIGtleSwgU3RyaW5nIGV4cHJlc3Npb24pCi0gIHsgICAgCi0gICAgaWYgKG1fZXZhbExpc3QgPT0gbnVsbCkKLSAgICAgIG1fZXZhbExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKCFtX2V2YWxMaXN0LmNvbnRhaW5zKGtleSkpCi0gICAgICBtX2V2YWxMaXN0LmFkZEVsZW1lbnQoa2V5KTsKLSAgICBzZXRQYXJhbWV0ZXIoa2V5LCBleHByZXNzaW9uKTsKLSAgICBtX25lZWRUb0V2YWwgPSB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IGEgdG9wLWxldmVsIHN0eWxlc2hlZXQgcGFyYW1ldGVyLiAgVGhpcyB2YWx1ZSBjYW4KLSAgICogYmUgZXZhbHVhdGVkIHZpYSB4c2w6cGFyYW0tdmFyaWFibGUuICBOb3RlIHRoYXQgdGhlIHZhbHVlCi0gICAqIHBhc3NlZCBpcyBhbiBleHByZXNzaW9uLCBhbmQgbm90IGEgc3RyaW5nLiAgVGhpcyBtZWFucyB0aGF0Ci0gICAqIHNldFN0eWxlc2hlZXRQYXJhbSgiZm9vIiwgImhlbGxvIik7IHdpbGwgbG9vayBmb3IgdGhlCi0gICAqIGVsZW1lbnQgImhlbGxvIi4gIElmIHlvdSB3YW50IHRvIHBhc3MgYSBzdHJpbmcsIHlvdSdsbAotICAgKiBuZWVkIHRvIHB1dCBxdW90ZXMgYXJvdW5kIGl0OgotICAgKiBzZXRTdHlsZXNoZWV0UGFyYW0oImZvbyIsICInaGVsbG8nIik7IHdpbGwgbG9vayBmb3IgdGhlCi0gICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHBhcmFtLgotICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBBbiBleHByZXNzaW9uIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXIoU3RyaW5nIGtleSwgIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmIChtX3N0eWxlc2hlZXRQYXJhbXMgPT0gbnVsbCkKLSAgICAgIG1fc3R5bGVzaGVldFBhcmFtcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBtX3N0eWxlc2hlZXRQYXJhbXMucHV0KGtleSwgdmFsdWUpOyAKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgRm9ybWF0dGVyTGlzdGVuZXIgKFNBWCBEb2N1bWVudEhhbmRsZXIpLCBvciBudWxsIGlmIG5vbmUgaGFzIGJlZW4gc2V0LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50SGFuZGxlciBnZXRGb3JtYXR0ZXJMaXN0ZW5lcigpCi0gIHsKLSAgICByZXR1cm4gbV9kb2N1bWVudEhhbmRsZXI7Ci0gICAgCi0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBGb3JtYXR0ZXJMaXN0ZW5lciAodGhlIFNBWCBEb2N1bWVudEhhbmRsZXIpLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Rm9ybWF0dGVyTGlzdGVuZXIoRG9jdW1lbnRIYW5kbGVyIGZsaXN0ZW5lcikKLSAgewotICAgIG1fZG9jdW1lbnRIYW5kbGVyID0gZmxpc3RlbmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBTQVggRG9jdW1lbnRIYW5kbGVyICh0aGUgc2FtZSBvYmplY3QgYXMgdGhlIEZvcm1hdHRlckxpc3RlbmVyKSwgb3IgbnVsbCBpZiBub25lIGhhcyBiZWVuIHNldC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudEhhbmRsZXIgZ2V0RG9jdW1lbnRIYW5kbGVyKCkKLSAgewotICAgIHJldHVybiBtX2RvY3VtZW50SGFuZGxlcjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGN1cnJlbnQgU0FYIERvY3VtZW50SGFuZGxlciAodGhlIHNhbWUKLSAgICogb2JqZWN0IGFzIHRoZSBGb3JtYXR0ZXJMaXN0ZW5lcikuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudEhhbmRsZXIoRG9jdW1lbnRIYW5kbGVyIGxpc3RlbmVyKQotICB7Ci0gICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgUGFyc2VyQWRhcHRlcikgICAgICAKLSAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLnNldENvbnRlbnRIYW5kbGVyKCgoUGFyc2VyQWRhcHRlcilsaXN0ZW5lcikuZ2V0Q29udGVudEhhbmRsZXIoKSk7Ci0gICAgZWxzZSBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBYU0xURW5naW5lSW1wbCkKLSAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLnNldENvbnRlbnRIYW5kbGVyKCgoWFNMVEVuZ2luZUltcGwpbGlzdGVuZXIpLmdldFRyYW5zZm9ybWVyKCkuZ2V0Q29udGVudEhhbmRsZXIoKSk7Ci0gICAgZWxzZSBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBYTUxTZXJpYWxpemVyKQotICAgIHsKLSAgICAgIHRyeXsKLSAgICAgICAgbV90cmFuc2Zvcm1lckltcGwuc2V0Q29udGVudEhhbmRsZXIoKChYTUxTZXJpYWxpemVyKWxpc3RlbmVyKS5hc0NvbnRlbnRIYW5kbGVyKCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLSAgICAgIHt9Ci0gICAgfQotICAgIG1fZG9jdW1lbnRIYW5kbGVyID0gbGlzdGVuZXI7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgdHJhY2UgbGlzdGVuZXIgZm9yIHRoZSBwdXJwb3NlcyBvZiBkZWJ1Z2dpbmcgYW5kIGRpYWdub3Npcy4KLSAgICogQHBhcmFtIHRsIFRyYWNlIGxpc3RlbmVyIHRvIGJlIGFkZGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVHJhY2VMaXN0ZW5lcihUcmFjZUxpc3RlbmVyIHRsKQotICAgIHRocm93cyBUb29NYW55TGlzdGVuZXJzRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAobV90cmFuc2Zvcm1lckltcGwgIT0gbnVsbCkKLSAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLmdldFRyYWNlTWFuYWdlcigpLmFkZFRyYWNlTGlzdGVuZXIodGwpOwotICB9Ci0gIAotICAvKioKLSAgICogSWYgc2V0IHRvIHRydWUgKHRoZSBkZWZhdWx0KSwgcGF0dGVybiBjb25mbGljdCB3YXJuaW5ncyBhcmUgbm90IHByaW50ZWQgdG8gdGhlIGRpYWdub3N0aWNzIHN0cmVhbS4KLSAgICogQHBhcmFtIGIgdHJ1ZSBpZiBjb25mbGljdCB3YXJuaW5ncyBzaG91bGQgYmUgc3VwcHJlc3NlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFF1aWV0Q29uZmxpY3RXYXJuaW5ncyhib29sZWFuIGIpCi0gIHsKLSAgICBpZiAobV90cmFuc2Zvcm1lckltcGwgIT0gbnVsbCkKLSAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLnNldFF1aWV0Q29uZmxpY3RXYXJuaW5ncyhiKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgYSB0cmFjZSBsaXN0ZW5lci4KLSAgICogQHBhcmFtIHRsIFRyYWNlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmVUcmFjZUxpc3RlbmVyKFRyYWNlTGlzdGVuZXIgdGwpCi0gIHsKLSAgICBpZiAobV90cmFuc2Zvcm1lckltcGwgIT0gbnVsbCkKLSAgICAgIG1fdHJhbnNmb3JtZXJJbXBsLmdldFRyYWNlTWFuYWdlcigpLnJlbW92ZVRyYWNlTGlzdGVuZXIodGwpOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBwcm9ibGVtIGxpc3RlbmVyIHByb3BlcnR5LgotICAgKiBUaGUgWFNMIGNsYXNzIGNhbiBoYXZlIGEgc2luZ2xlIGxpc3RlbmVyIHRvIGJlIGluZm9ybWVkCi0gICAqIG9mIGVycm9ycyBhbmQgd2FybmluZ3MuIFRoZSBwcm9ibGVtIGxpc3RlbmVyIG5vcm1hbGx5IGNvbnRyb2xzIHdoZXRoZXIgYW4gZXhjZXB0aW9uCi0gICAqIGlzIHRocm93biBvciBub3QgKG9yIHRoZSBwcm9ibGVtIGxpc3RlbmVycyBjYW4gdGhyb3cgaXRzIG93biBSdW50aW1lRXhjZXB0aW9uKS4KLSAgICogQHBhcmFtIGwgQSBQcm9ibGVtTGlzdGVuZXIgaW50ZXJmYWNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvYmxlbUxpc3RlbmVyKFByb2JsZW1MaXN0ZW5lciBsKQotICB7Ci0gICAgaWYgKGwgaW5zdGFuY2VvZiBQcm9ibGVtTGlzdGVuZXJEZWZhdWx0KQotICAgICAgbV9wcm9ibGVtTGlzdGVuZXIgPSAoUHJvYmxlbUxpc3RlbmVyRGVmYXVsdClsOwotICAgIGVsc2UKLSAgICAgIG1fcHJvYmxlbUxpc3RlbmVyID0gbmV3IFByb2JsZW1MaXN0ZW5lckRlZmF1bHQobCk7IAotICAgIGlmIChtX3RyYW5zZm9ybWVySW1wbCAhPSBudWxsKQotICAgICAgbV90cmFuc2Zvcm1lckltcGwuc2V0RXJyb3JMaXN0ZW5lcihtX3Byb2JsZW1MaXN0ZW5lcik7Ci0gICAgbV90ZmFjdG9yeS5zZXRFcnJvckxpc3RlbmVyKG1fcHJvYmxlbUxpc3RlbmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHByb2JsZW0gbGlzdGVuZXIgcHJvcGVydHkuCi0gICAqIFRoZSBYU0wgY2xhc3MgY2FuIGhhdmUgYSBzaW5nbGUgbGlzdGVuZXIgdG8gYmUgaW5mb3JtZWQKLSAgICogb2YgZXJyb3JzIGFuZCB3YXJuaW5ncy4gVGhlIHByb2JsZW0gbGlzdGVuZXIgbm9ybWFsbHkgY29udHJvbHMgd2hldGhlciBhbiBleGNlcHRpb24KLSAgICogaXMgdGhyb3duIG9yIG5vdCAob3IgdGhlIHByb2JsZW0gbGlzdGVuZXIgY2FuIHRocm93IGl0cyBvd24gUnVudGltZUV4Y2VwdGlvbikuCi0gICAqIEByZXR1cm4gQSBQcm9ibGVtTGlzdGVuZXIgaW50ZXJmYWNlLgotICAgKi8KLSAgcHVibGljIFByb2JsZW1MaXN0ZW5lciBnZXRQcm9ibGVtTGlzdGVuZXIoKQotICB7Ci0gICAgaWYgKG1fcHJvYmxlbUxpc3RlbmVyLmdldFByb2JsZW1MaXN0ZW5lcigpICE9IG51bGwpCi0gICAgICByZXR1cm4gbV9wcm9ibGVtTGlzdGVuZXIuZ2V0UHJvYmxlbUxpc3RlbmVyKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG1fcHJvYmxlbUxpc3RlbmVyOwotICB9Ci0gIAotICBwdWJsaWMgVHJhbnNmb3JtZXJJbXBsIGdldFRyYW5zZm9ybWVyKCkKLSAgewotICAgIHJldHVybiBtX3RyYW5zZm9ybWVySW1wbDsgIAotICAgIC8vcmV0dXJuIChTdHlsZXNoZWV0UHJvY2Vzc29yKW1fcHJvY2Vzc29yOwotICB9ICAKLQotICBwdWJsaWMgVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCBnZXRUcmFuc2Zvcm1lckZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIChUcmFuc2Zvcm1lckZhY3RvcnlJbXBsKW1fdGZhY3Rvcnk7ICAgIAotICB9IAotCi0gIAotfSAvLyBlbmQgWFNMVEVuZ2luZUltcGwgY2xhc3MKZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFRJbnB1dFNvdXJjZS5qYXZhIGIvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvWFNMVElucHV0U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZTQ3Y2IuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvWFNMVElucHV0U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgIAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54c2x0OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogUmVwcmVzZW50cyBhbiBYTUwgc291cmNlIGRvY3VtZW50IG9yIFhTTCBzdHlsZXNoZWV0LgotICogVXNlIFhTTFRJbnB1dFNvdXJjZSBvYmplY3RzIHRvIHByb3ZpZGUgaW5wdXQgdG8gdGhlIFhTTFRQcm9jZXNzb3IgcHJvY2VzcygpIG1ldGhvZAotICogZm9yIGEgdHJhbnNmb3JtYXRpb24uIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgU0FYIGlucHV0IHNvdXJjZSB0byBoYW5kbGUKLSAqIERPTSBub2RlcyBhcyBpbnB1dCBhcyB3ZWxsIGFzIGZpbGVzLCBjaGFyYWN0ZXIgc3RyZWFtcywgYnl0ZSBzdHJlYW1zIGFuZCBTQVggRG9jdW1lbnRIYW5kbGVycy4KLSAqCi0gKiBAc2VlIFhTTFRQcm9jZXNzb3IjcHJvY2VzcyhYU0xUSW5wdXRTb3VyY2UsIFhTTFRJbnB1dFNvdXJjZSwgWFNMVFJlc3VsdFRhcmdldCkKLSAqLwotcHVibGljIGNsYXNzIFhTTFRJbnB1dFNvdXJjZSAvL2V4dGVuZHMgU0FYU291cmNlIAotewotICAKLSAgcHJpdmF0ZSBTdHJlYW1Tb3VyY2Ugc3RyZWFtU291cmNlID0gbnVsbDsKLSAgcHJpdmF0ZSBTQVhTb3VyY2Ugc2F4U291cmNlID0gbnVsbDsKLSAgcHJpdmF0ZSBET01Tb3VyY2UgZG9tU291cmNlID0gbnVsbDsKLSAgCi0gIC8qKgotICAgICogWmVyby1hcmd1bWVudCBkZWZhdWx0IGNvbnN0cnVjdG9yIC0tIEJlZm9yZSB5b3UgY2FuIHVzZSB0aGUgbmV3IFhTTFRJbnB1dFNvdXJjZSBvYmplY3QgaW4gYSB0cmFuc2Zvcm1hdGlvbiwKLSAgICAqIHlvdSBtdXN0IGRlZmluZSB0aGUgZG9jdW1lbnQgc291cmNlIHdpdGggc2V0U3lzdGVtSWQoKSwgc2V0Tm9kZSgpLCBzZXRJbnB1dFN0cmVhbSgpLCBvciBzZXRDaGFyYWN0ZXJTdHJlYW0oKS4KLSAgICAqCi0gICAgKiBAc2VlICNzZXRTeXN0ZW1JZChTdHJpbmcpCi0gICAgKiBAc2VlICNzZXROb2RlKE5vZGUpCi0gICAgKiBAc2VlICNzZXRJbnB1dFN0cmVhbQotICAgICogQHNlZSAjc2V0Q2hhcmFjdGVyU3RyZWFtCi0gICAgKiBAc2VlICNzZXRFbmNvZGluZyhTdHJpbmcpCi0gICAgKi8KLSAgcHVibGljIFhTTFRJbnB1dFNvdXJjZSAoKQotICB7Ci0gICAgc2F4U291cmNlID0gbmV3IFNBWFNvdXJjZSgpOwotICB9Ci0KLSAgLyoqCi0gICAgKiBDcmVhdGUgYSBuZXcgaW5wdXQgc291cmNlIHdpdGggYSBzeXN0ZW0gaWRlbnRpZmllciAoZm9yIGEgVVJMIG9yIGZpbGUgbmFtZSkgLS0KLSAgICAqIHRoZSBlcXVpdmFsZW50IG9mIGNyZWF0aW5nIGFuIGlucHV0IHNvdXJjZSB3aXRoIHRoZSB6ZXJvLWFyZ3VtZW50Ci0gICAgKiBjb25zdHJ1Y3RvciBhbmQgc2V0dGluZyB0aGUgbmV3IG9iamVjdCdzIFN5c3RlbUlkIHByb3BlcnR5LgotCi0gICAgKiBJZiB0aGUgc3lzdGVtIGlkZW50aWZpZXIgaXMgYSBVUkwsIGl0IG11c3QgYmUgZnVsbHkgcmVzb2x2ZWQuCi0gICAgKgotICAgICogSWYgdGhlIHN5c3RlbSBpZGVudGlmaWVyIGlzIGEgVVJMLCBpdCBtdXN0IGJlIGZ1bGx5IHJlc29sdmVkLgotICAgICoKLSAgICAqIEBwYXJhbSBzeXN0ZW1JZCBUaGUgc3lzdGVtIGlkZW50aWZpZXIgKFVSSSkuCi0gICAgKiBAc2VlICNzZXRTeXN0ZW1JZChTdHJpbmcpCi0gICAgKiBAc2VlICNzZXROb2RlKE5vZGUpCi0gICAgKiBAc2VlICNzZXRJbnB1dFN0cmVhbQotICAgICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotICAgICogQHNlZSAjc2V0Q2hhcmFjdGVyU3RyZWFtCi0gICAgKi8KLSAgcHVibGljIFhTTFRJbnB1dFNvdXJjZSAoU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgc2F4U291cmNlID0gbmV3IFNBWFNvdXJjZSgpOwotICAgIHRoaXMuc2V0U3lzdGVtSWQoc3lzdGVtSWQpOwotICB9Ci0KLQotICAvKioKLSAgICAqIENyZWF0ZSBhIG5ldyBpbnB1dCBzb3VyY2Ugd2l0aCBhIGJ5dGUgc3RyZWFtIC0tIHRoZSBlcXVpdmFsZW50IG9mIGNyZWF0aW5nIGFuIGlucHV0IHNvdXJjZQotICAgICogd2l0aCB0aGUgemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvciBhbmQgc2V0dGluZyB0aGUgbmV3IG9iamVjdCdzIEJ5dGVTdHJlYW0gcHJvcGVydHkuCi0gICAgKgotICAgICogQHBhcmFtIGJ5dGVTdHJlYW0gVGhlIHJhdyBieXRlIHN0cmVhbSBjb250YWluaW5nIHRoZSBkb2N1bWVudC4KLSAgICAqIEBzZWUgI3NldElucHV0U3RyZWFtCi0gICAgKiBAc2VlICNzZXRTeXN0ZW1JZChTdHJpbmcpCi0gICAgKiBAc2VlICNzZXROb2RlKE5vZGUpCi0gICAgKiBAc2VlICNzZXRFbmNvZGluZyhTdHJpbmcpCi0gICAgKiBAc2VlICNzZXRDaGFyYWN0ZXJTdHJlYW0KLSAgICAqLwotICBwdWJsaWMgWFNMVElucHV0U291cmNlIChJbnB1dFN0cmVhbSBieXRlU3RyZWFtKQotICB7Ci0gICAgc3RyZWFtU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSgpOwotICAgIHN0cmVhbVNvdXJjZS5zZXRJbnB1dFN0cmVhbShieXRlU3RyZWFtKTsKLSAgfQotCi0gIC8qKgotICAgICogQ3JlYXRlIGEgbmV3IGlucHV0IHNvdXJjZSB3aXRoIGEgY2hhcmFjdGVyIHN0cmVhbSAtLSB0aGUgZXF1aXZhbGVudCBvZiBjcmVhdGluZyBhbiBpbnB1dCBzb3VyY2UKLSAgICAqIHdpdGggdGhlIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IgYW5kIHNldHRpbmcgdGhlIG5ldyBvYmplY3QncyBDaGFyYWN0ZXJTdHJlYW0gcHJvcGVydHkuCi0gICAgKiA8cD5UaGUgY2hhcmFjdGVyIHN0cmVhbSBzaGFsbCBub3QgaW5jbHVkZSBhIGJ5dGUgb3JkZXIgbWFyay48L3A+Ci0gICAgKgotICAgICogQHBhcmFtIGNoYXJhY3RlclN0cmVhbSBUaGUgY2hhcmFjdGVyIHN0cmVhbSBjb250YWluaW5nIHRoZSBkb2N1bWVudC4KLSAgICAqIEBzZWUgI3NldENoYXJhY3RlclN0cmVhbQotICAgICogQHNlZSAjc2V0SW5wdXRTdHJlYW0KLSAgICAqIEBzZWUgI3NldFN5c3RlbUlkKFN0cmluZykKLSAgICAqIEBzZWUgI3NldE5vZGUoTm9kZSkKLSAgICAqIEBzZWUgI3NldEVuY29kaW5nKFN0cmluZykKLSAgICAqLwotICBwdWJsaWMgWFNMVElucHV0U291cmNlIChSZWFkZXIgY2hhcmFjdGVyU3RyZWFtKQotICB7Ci0gICAgc3RyZWFtU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSgpOwotICAgIHN0cmVhbVNvdXJjZS5zZXRSZWFkZXIoY2hhcmFjdGVyU3RyZWFtKTsKLSAgfQotCi0gIC8qKgotICAgICogQ3JlYXRlIGEgbmV3IGlucHV0IHNvdXJjZSB3aXRoIGEgRE9NIE5vZGUgLS0gdGhlIGVxdWl2YWxlbnQgb2YgY3JlYXRpbmcgYW4gaW5wdXQgc291cmNlCi0gICAgKiB3aXRoIHRoZSB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yIGFuZCBzZXR0aW5nIHRoZSBuZXcgb2JqZWN0J3MgTm9kZSBwcm9wZXJ0eS4KLSAgICAqCi0gICAgKiBAcGFyYW0gbm9kZSBUaGUgRE9NIE5vZGUgY29udGFpbmluZyB0aGUgZG9jdW1lbnQuCi0gICAgKiBAc2VlICNzZXROb2RlKE5vZGUpCi0gICAgKiBAc2VlICNzZXRDaGFyYWN0ZXJTdHJlYW0KLSAgICAqIEBzZWUgI3NldElucHV0U3RyZWFtCi0gICAgKiBAc2VlICNzZXRTeXN0ZW1JZChTdHJpbmcpCi0gICAgKiBAc2VlICNzZXRFbmNvZGluZyhTdHJpbmcpCi0gICAgKi8KLSAgcHVibGljIFhTTFRJbnB1dFNvdXJjZSAoTm9kZSBub2RlKQotICB7Ci0gICAgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZSgpOwotICAgIGRvbVNvdXJjZS5zZXROb2RlKG5vZGUpOwotICB9Ci0KLSAgLyoqCi0gICAgKiBDcmVhdGUgYSBuZXcgWFNMVElucHV0U291cmNlIHNvdXJjZSBmcm9tIGEgU0FYIGlucHV0IHNvdXJjZS4KLSAgICAqIFRoaXMgb3BlcmF0aW9uIHNldHMgdGhlIEJ5dGVTdHJlYW0sIENoYXJhY3RlclN0cmVhbSwgU3lzdGVtSWQsIFB1YmxpY0lELCBhbmQgRW5jb2RpbmcgcHJvcGVydGllcy4KLSAgICAqCi0gICAqIEBwYXJhbSBpc291cmNlIFRoZSBTQVggaW5wdXQgc291cmNlLgotICAgICogQHNlZSAjc2V0Q2hhcmFjdGVyU3RyZWFtCi0gICAgKiBAc2VlICNzZXRJbnB1dFN0cmVhbQotICAgICogQHNlZSAjc2V0U3lzdGVtSWQoU3RyaW5nKQotICAgICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotICAgICogQHNlZSAjc2V0Tm9kZShOb2RlKQotICAgICovCi0gIHB1YmxpYyBYU0xUSW5wdXRTb3VyY2UgKElucHV0U291cmNlIGlzb3VyY2UpCi0gIHsKLSAgICBzYXhTb3VyY2UgPSBuZXcgU0FYU291cmNlKCk7Ci0gICAgc2F4U291cmNlLnNldElucHV0U291cmNlKGlzb3VyY2UpOwotICAgIC8vc2F4U291cmNlLnNldFhNTFJlYWRlcihpc291cmNlLmdldENoYXJhY3RlclN0cmVhbSgpKTsKLSAgICB0aGlzLnNldEVuY29kaW5nKGlzb3VyY2UuZ2V0RW5jb2RpbmcoKSk7Ci0gICAgdGhpcy5zZXRTeXN0ZW1JZChpc291cmNlLmdldFN5c3RlbUlkKCkpOwotICB9Ci0KLSAgLyoqCi0gICAgKiBTZXQgdGhlIERPTSBOb2RlIGZvciB0aGlzIGlucHV0IHNvdXJjZS4KLSAgICAqCi0gICAgKiBAcGFyYW0gbm9kZSBUaGUgRE9NIG5vZGUgY29udGFpbmluZyB0aGUKLSAgICAqICAgICAgICBYTUwgZG9jdW1lbnQgb3IgWFNMIHN0eWxlc2hlZXQuCi0gICAgKiBAc2VlICNYU0xUSW5wdXRTb3VyY2UoTm9kZSkKLSAgICAqIEBzZWUgI2dldENoYXJhY3RlclN0cmVhbSgpICAgICogCi0gICAgKiBAc2VlIGphdmEuaW8uUmVhZGVyCi0gICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Tm9kZSAoTm9kZSBub2RlKQotICB7Ci0gICAgaWYgKGRvbVNvdXJjZSA9PSBudWxsKQotICAgICAgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZSgpOwotICAgIGRvbVNvdXJjZS5zZXROb2RlKG5vZGUpOwotICB9Ci0KLSAgLyoqCi0gICAgKiBHZXQgdGhlIERPTSBOb2RlIGZvciB0aGlzIGlucHV0IHNvdXJjZS4KLSAgICAqCi0gICAgKiBAcmV0dXJuIFRoZSBET00gbm9kZSBjb250YWluaW5nIHRoZSBkb2N1bWVudCwgb3IgbnVsbCBpZiBub25lIHdhcyBzdXBwbGllZC4KLSAgICAqIEBzZWUgI1hTTFRJbnB1dFNvdXJjZShOb2RlKQotICAgICogQHNlZSAjc2V0Tm9kZShOb2RlKQotICAgICovCi0gIHB1YmxpYyBOb2RlIGdldE5vZGUgKCkKLSAgewotICAgIGlmIChkb21Tb3VyY2UgIT0gbnVsbCkKLSAgICAgIHJldHVybiBkb21Tb3VyY2UuZ2V0Tm9kZSgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgCi0gIAotICAgLyoqIAotICAgICAqIFNldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nLCBpZiBrbm93bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSBlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIGFjY2VwdGFibGUgZm9yIGFuCi0gICAgICogWE1MIGVuY29kaW5nIGRlY2xhcmF0aW9uIChzZWUgc2VjdGlvbiA0LjMuMyBvZiB0aGUgWE1MIDEuMAotICAgICAqIHJlY29tbWVuZGF0aW9uKS48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IHdoZW4gdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVzIGEKLSAgICAgKiBjaGFyYWN0ZXIgc3RyZWFtLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmNvZGluZyBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcuCi0gICAgICogQHNlZSAjc2V0U3lzdGVtSWQKLSAgICAgKiBAc2VlICNnZXRFbmNvZGluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nIChTdHJpbmcgZW5jb2RpbmcpCi0gICAgewotCXRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgZm9yIGEgYnl0ZSBzdHJlYW0gb3IgVVJJLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZW5jb2RpbmcsIG9yIG51bGwgaWYgbm9uZSB3YXMgc3VwcGxpZWQuCi0gICAgICogQHNlZSAjZ2V0U3lzdGVtSWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nICgpCi0gICAgewotCXJldHVybiBlbmNvZGluZzsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOwotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2hhcmFjdGVyIHN0cmVhbSBmb3IgdGhpcyBpbnB1dCBzb3VyY2UuCi0gICAgICoKLSAgICAgKiA8cD5JZiB0aGVyZSBpcyBhIGNoYXJhY3RlciBzdHJlYW0gc3BlY2lmaWVkLCB0aGUgU0FYIHBhcnNlcgotICAgICAqIHdpbGwgaWdub3JlIGFueSBieXRlIHN0cmVhbSBhbmQgd2lsbCBub3QgYXR0ZW1wdCB0byBvcGVuCi0gICAgICogYSBVUkkgY29ubmVjdGlvbiB0byB0aGUgc3lzdGVtIGlkZW50aWZpZXIuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNoYXJhY3RlclN0cmVhbSBUaGUgY2hhcmFjdGVyIHN0cmVhbSBjb250YWluaW5nIHRoZQotICAgICAqICAgICAgICBYTUwgZG9jdW1lbnQgb3Igb3RoZXIgZW50aXR5LgotICAgICAqIEBzZWUgamF2YS5pby5SZWFkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJTdHJlYW0gKFJlYWRlciBjaGFyYWN0ZXJTdHJlYW0pCi0gICAgewotICAgICAgaWYgKHN0cmVhbVNvdXJjZSA9PSBudWxsKQotCSAgICAgIHN0cmVhbVNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoKTsKLSAgICAgIHN0cmVhbVNvdXJjZS5zZXRSZWFkZXIoY2hhcmFjdGVyU3RyZWFtKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgc3RyZWFtIGZvciB0aGlzIGlucHV0IHNvdXJjZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNoYXJhY3RlciBzdHJlYW0sIG9yIG51bGwgaWYgbm9uZSB3YXMgc3VwcGxpZWQuCi0gICAgICovCi0gICAgcHVibGljIFJlYWRlciBnZXRDaGFyYWN0ZXJTdHJlYW0gKCkKLSAgICB7Ci0gICAgICBpZiAoc3RyZWFtU291cmNlICE9IG51bGwpCi0gICAgICAgIHJldHVybiBzdHJlYW1Tb3VyY2UuZ2V0UmVhZGVyKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGJhc2UgSUQgKFVSTCBvciBzeXN0ZW0gSUQpIGZyb20gd2hlcmUgVVJMcwotICAgICAqIHdpbGwgYmUgcmVzb2x2ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZUlEIEJhc2UgVVJMIGZvciB0aGlzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBiYXNlSUQpIAotICAgIHsKLSAgICAgIHRoaXMuYmFzZUlEID0gYmFzZUlEOwotICAgICAgCi0gICAgICBpZiAoc2F4U291cmNlICE9IG51bGwpCi0gICAgICAgIHNheFNvdXJjZS5zZXRTeXN0ZW1JZChiYXNlSUQpOwotICAgICAgZWxzZSBpZiAoZG9tU291cmNlICE9IG51bGwpCi0gICAgICAgIGRvbVNvdXJjZS5zZXRTeXN0ZW1JZChiYXNlSUQpOwotICAgICAgZWxzZSBpZiAoc3RyZWFtU291cmNlICE9IG51bGwpCi0gICAgICAgIHN0cmVhbVNvdXJjZS5zZXRTeXN0ZW1JZChiYXNlSUQpOyAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYmFzZSBJRCAoVVJMIG9yIHN5c3RlbSBJRCkgZnJvbSB3aGVyZSBVUkxzCi0gICAgICogd2lsbCBiZSByZXNvbHZlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQmFzZSBVUkwgZm9yIHRoaXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUlEOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBiYXNlSUQgPSBudWxsOwotCi0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBieXRlIHN0cmVhbSB0byBiZSB1c2VkIGFzIGlucHV0LiAgTm9ybWFsbHksCi0gICAgICogYSBzdHJlYW0gc2hvdWxkIGJlIHVzZWQgcmF0aGVyIHRoYW4gYSByZWFkZXIsIHNvIHRoYXQKLSAgICAgKiB0aGUgWE1MIHBhcnNlciBjYW4gcmVzb2x2ZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgc3BlY2lmaWVkCi0gICAgICogYnkgdGhlIFhNTCBkZWNsYXJhdGlvbi4KLSAgICAgKgotICAgICAqIDxwPklmIHRoaXMgU291cmNlIG9iamVjdCBpcyB1c2VkIHRvIHByb2Nlc3MgYSBzdHlsZXNoZWV0LCBub3JtYWxseQotICAgICAqIHNldFN5c3RlbUlkIHNob3VsZCBhbHNvIGJlIGNhbGxlZCwgc28gdGhhdCByZWxhdGl2ZSBVUkwgcmVmZXJlbmNlcwotICAgICAqIGNhbiBiZSByZXNvbHZlZC48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gQSB2YWxpZCBJbnB1dFN0cmVhbSByZWZlcmVuY2UgdG8gYW4gWE1MIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgCi0gICAgewotICAgICAgaWYgKHN0cmVhbVNvdXJjZSA9PSBudWxsKQotICAgICAgICBzdHJlYW1Tb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKCk7Ci0gICAgICBzdHJlYW1Tb3VyY2Uuc2V0SW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYnl0ZSBzdHJlYW0gdGhhdCB3YXMgc2V0IHdpdGggc2V0SW5wdXRTdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBieXRlIHN0cmVhbSB0aGF0IHdhcyBzZXQgd2l0aCBzZXRJbnB1dFN0cmVhbSwgb3IgbnVsbAotICAgICAqIGlmIHNldEJ5dGVTdHJlYW0gb3IgdGhlIEJ5dGVTdHJlYW0gY29uc3RydWN0b3Igd2FzIG5vdCBjYWxsZWQuCi0gICAgICovCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgewotICAgICAgaWYgKHN0cmVhbVNvdXJjZSAhPSBudWxsKQotICAgICAgICByZXR1cm4gc3RyZWFtU291cmNlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAgLyoqCi0gICAgICogR2V0IHRoZSBSZXN1bHQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFhTTFRSZXN1bHRUYXJnZXQgb2JqZWN0IC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIFJlc3VsdCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgWFNMVFJlc3VsdFRhcmdldCBvYmplY3QKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgU291cmNlIGdldFNvdXJjZU9iamVjdCgpIAotICAgIHsKLSAgICAgIGlmIChzdHJlYW1Tb3VyY2UgIT0gbnVsbCkgICAgICAgIAotICAgICAgICByZXR1cm4gc3RyZWFtU291cmNlOwotICAgICAgZWxzZSBpZiAoZG9tU291cmNlICE9IG51bGwpCi0gICAgICAgIHJldHVybiBkb21Tb3VyY2U7Ci0gICAgICBlbHNlIAotICAgICAgICByZXR1cm4gc2F4U291cmNlOwotICAgIH0gCi19CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9YU0xUUHJvY2Vzc29yLmphdmEgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9YU0xUUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZTVjYzUuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvWFNMVFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICAKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4ueHNsdDsKLQotaW1wb3J0IGphdmEudXRpbC5Ub29NYW55TGlzdGVuZXJzRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLlhPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54cGF0aC5YTm9kZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLlhCb29sZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGguWE51bWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLlhOdWxsOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGguWFN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5YTUxQYXJzZXJMaWFpc29uOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHBhdGgueG1sLlByb2JsZW1MaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXQ7Ci0vL2ltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0Um9vdDsKLS8vaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHNsdC5TdHlsZXNoZWV0U3BlYzsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLio7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi0vKioKLSAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+Ci0gKiBUaGUgdHJhbnNmb3JtYXRpb24gcHJvY2Vzc29yIC0tIHVzZSB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRQcm9jZXNzb3JGYWN0b3J5fSB0byBpbnN0YW50aWF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS4KLSAqIEl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiAoWFNMVEVuZ2luZUltcGwpLAotICogY29sbGFib3JhdGluZyB3aXRoIGEgWE1MUGFyc2VyTGlhaXNvbiwgdGhlIERPTSwKLSAqIGFuZCB0aGUgWFBhdGggZW5naW5lLCB0byB0cmFuc2Zvcm0gYSBzb3VyY2UgdHJlZQotICogb2Ygbm9kZXMgaW50byBhIHJlc3VsdCB0cmVlIGFjY29yZGluZyB0byBpbnN0cnVjdGlvbnMKLSAqIGFuZCB0ZW1wbGF0ZXMgc3BlY2lmaWVkIGJ5IGEgc3R5bGVzaGVldCB0cmVlLgotICogVXNlIHRoZSA8Y29kZT5wcm9jZXNzKC4uLik8L2NvZGU+IGFyZSB0aGUgcHJpbWFyeQotICogcHVibGljIGVudHJ5IHBvaW50cy4KLSAqCi0gKiBMb29rIGF0IHRoZSBQcm9jZXNzIGNsYXNzIG1haW4oKSBtZXRob2QgZm9yCi0gKiBmb3IgYW4gYWR2YW5jZWQgdXNhZ2UgZXhhbXBsZS4KLSAqCi0gKiA8cD5JZiB5b3UgcmV1c2UgdGhlIHByb2Nlc3NvciBpbnN0YW5jZSwgeW91IHNob3VsZCBjYWxsIHJlc2V0KCkgYmV0d2VlbiB0cmFuc2Zvcm1hdGlvbnMuPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhTTFRQcm9jZXNzb3IgZXh0ZW5kcyBEb2N1bWVudEhhbmRsZXIsIExleGljYWxIYW5kbGVyCi17Ci0gIC8qKgotICAgKiBVc2UgdGhlIFhTTCBzdHlsZXNoZWV0IHRvIHRyYW5zZm9ybSB0aGUgWE1MIGlucHV0LCBwbGFjaW5nIHRoZSByZXN1bHQgaW4gdGhlIHJlc3VsdCB0cmVlLgotICAgKiBAcGFyYW0geG1sU291cmNlICBUaGUgWE1MIGlucHV0IHRvIGJlIHRyYW5zZm9ybWVkLgotICAgKiBAcGFyYW0geHNsU3R5bGVzaGVldCAgVGhlIFhTTCBzdHlsZXNoZWV0IHRvIGJlIHVzZWQgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbi4gIE1heSBiZSBudWxsIGlmIFhNTCBpbnB1dAotICAgKiBoYXMgYW4gWFNMIHN0eWxlc2hlZXQgUEkuCi0gICAqIEBwYXJhbSByZXN1bHRUcmVlIFRoZSB0cmVlIHdoZXJlIHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIHBsYWNlZC4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJvY2VzcyggWFNMVElucHV0U291cmNlIHhtbFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgWFNMVElucHV0U291cmNlIHhzbFN0eWxlc2hlZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIFhTTFRSZXN1bHRUYXJnZXQgcmVzdWx0VHJlZSkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBDb21waWxlIHRoZSBYU0wgc3R5bGVzaGVldCByZXByZXNlbnRlZCBieSBhbiBYU0xUSW5wdXRTb3VyY2Ugb2JqZWN0IGludG8gYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24sCi0gICAqIGFuZCB1c2UgaXQgdG8gc2V0IHRoZSBYU0xUUHJvY2Vzc29yIFN0eWxlc2hlZXQgcHJvcGVydHkuCi0gICAqIFRoaXMgb3BlcmF0aW9uIGlzIHJlcXVpcmVkIGlmIHRoZSBYU0xUUHJvY2Vzc29yIGlzIHRvIGZ1bmN0aW9uIGFzIGEKLSAgICogU0FYIERvY3VtZW50SGFuZGxlci4KLSAgICogSWYgdGhlIFN0eWxlc2hlZXQgcHJvcGVydHkgaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gbm9uLW51bGwsIHRoaXMgb3BlcmF0aW9uCi0gICAqIGNhbGxzIHJlc2V0KCkgYmVmb3JlIGEgdHJhbnNmb3JtYXRpb24gaXMgcGVyZm9ybWVkLgotICAgKgotICAgKiBAcGFyYW0gc3R5bGVzaGVldFNvdXJjZSAgVGhlIFhTTCBzdHlsZXNoZWV0LgotICAgKiBAcmV0dXJuIFRoZSBjb21waWxlZCBzdHlsZXNoZWV0IG9iamVjdC4KLSAgICogQGV4Y2VwdGlvbiBYU0xQcm9jZXNzb3JFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY3RpdmUgUHJvYmxlbUxpc3RlbmVyIGFuZCBYTUxQYXJzZXJMaWFpc29uIGRlY2lkZQotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXRSb290IHByb2Nlc3NTdHlsZXNoZWV0KFhTTFRJbnB1dFNvdXJjZSBzdHlsZXNoZWV0U291cmNlKQotICAgIHRocm93cyBTQVhFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgVVJMIHRvIChvciBmaWxlIG5hbWUgb2YpIGFuIFhTTCBzdHlsZXNoZWV0LAotICAgKiBDb21waWxlIHRoZSBzdHlsZXNoZWV0IGludG8gYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24sIGFuZCB1c2UgaXQgdG8KLSAgICogc2V0IHRoZSBYU0xUUHJvY2Vzc29yIFN0eWxlc2hlZXQgcHJvcGVydHkuCi0gICAqIFRoaXMgb3BlcmF0aW9uIGlzIHJlcXVpcmVkIGlmIHRoZSBYU0xUUHJvY2Vzc29yIGlzIHRvIGZ1bmN0aW9uIGFzIGEKLSAgICogU0FYIERvY3VtZW50SGFuZGxlci4KLSAgICogSWYgdGhlIFN0eWxlc2hlZXQgcHJvcGVydHkgaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gbm9uLW51bGwsIHRoaXMgb3BlcmF0aW9uCi0gICAqIGNhbGxzIHJlc2V0KCkgYmVmb3JlIGEgdHJhbnNmb3JtYXRpb24gaXMgcGVyZm9ybWVkLgotICAgKgotICAgKiBAcGFyYW0geHNsZG9jVVJMU3RyaW5nICBUaGUgVVJMIHRvIHRoZSBYU0wgc3R5bGVzaGVldC4KLSAgICogQHJldHVybiBUaGUgY29tcGlsZWQgc3R5bGVzaGVldCBvYmplY3QuCi0gICAqIEBleGNlcHRpb24gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWN0aXZlIFByb2JsZW1MaXN0ZW5lciBhbmQgWE1MUGFyc2VyTGlhaXNvbiBkZWNpZGUKLSAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyBTdHlsZXNoZWV0Um9vdCBwcm9jZXNzU3R5bGVzaGVldChTdHJpbmcgeHNsZG9jVVJMU3RyaW5nKQotICAgIHRocm93cyBTQVhFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgb3V0cHV0IHN0cmVhbS4gUmVxdWlyZWQgd2hlbiB0aGUgWFNMVFByb2Nlc3NvciBpcyBiZWluZyB1c2VkCi0gICAqIGFzIGEgU0FYIERvY3VtZW50SGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSBvcyk7Ci0KLSAgLyoqCi0gICAqIFJlc2V0IHRoZSBYU0xUUHJvY2Vzc29yIHN0YXRlLiAgTXVzdCBiZSB1c2VkIGFmdGVyIGEgcHJvY2VzcygpIGNhbGwKLSAgICogaWYgdGhlIFhTTFRQcm9jZXNzb3IgaW5zdGFuY2UgaXMgdG8gYmUgdXNlZCBhZ2Fpbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgRE9NIE5vZGUgZnJvbSB0aGUgWFNMVElucHV0U291cmNlIG9iamVjdC4gUmV0dXJucyBudWxsIGlmIHRoZSBYU0xUSW5wdXRTb3VyY2UKLSAgICogb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gYSBOb2RlIChpdCBtYXksIGZvciBleGFtcGxlLCBjb250YWluIGFuIGlucHV0IHN0cmVhbSkuCi0gICAqLwotICBwdWJsaWMgTm9kZSBnZXRTb3VyY2VUcmVlRnJvbUlucHV0KFhTTFRJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSkKLSAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBVc2UgYSBjb21waWxlZCBzdHlsZXNoZWV0IHRvIHNldCB0aGUgU3R5bGVzaGVldCBwcm9wZXJ0eSBmb3IgdGhpcyBwcm9jZXNzb3IuCi0gICAqIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIHRoZSBwcm9jZXNzIG1ldGhvZCB1c2VzIHRoaXMgc3R5bGVzaGVldCByYXRoZXIgdGhhbgotICAgKiBsb29raW5nIGZvciBhIHN0eWxlc2hlZXQgUEkgaWYgdGhlIHN0eWxlc2hlZXQgcGFyYW1ldGVyIGlzIG51bGwuICBBbHNvIHJlcXVpcmVkCi0gICAqIGlmIHlvdSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBYU0xUUHJvY2Vzc29yIGFzIGEgU0FYIERvY3VtZW50SGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0eWxlc2hlZXQoU3R5bGVzaGVldFJvb3Qgc3R5bGVzaGVldFJvb3QpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgU3R5bGVzaGVldCBzZXR0aW5nIGZvciB0aGlzIFhTTFRQcm9jZXNzb3IuCi0gICAqLwotICBwdWJsaWMgU3R5bGVzaGVldFJvb3QgZ2V0U3R5bGVzaGVldCgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIFhNTFBhcnNlckxpYWlzb24gdGhhdCB0aGlzIHByb2Nlc3NvciB1c2VzLgotICAgKi8KLSAgcHVibGljIFhNTFBhcnNlckxpYWlzb24gZ2V0WE1MUHJvY2Vzc29yTGlhaXNvbigpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIHByZWZlcnJlZCBzdHlsZXNoZWV0IGZvciB0aGUgWFNMVElucHV0U291cmNlIFhNTCBkb2N1bWVudCwKLSAgICogYXMgaWRlbnRpZmllZCBieSB0aGUgeG1sLXN0eWxlc2hlZXQgUEksIGFuZCBtYXRjaGluZyB0aGUgbWVkaWEgYW5kCi0gICAqIGNoYXJzZXQgY3JpdGVyaWEuIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldC8iPgotICAgKiBBc3NvY2lhdGluZyBTdHlsZSBTaGVldHMgd2l0aCBYTUwgZG9jdW1lbnRzPC9hPi4KLSAgICogRG9lcyBub3QgeWV0IGhhbmRsZSB0aGUgTElOSyBSRUw9InN0eWxlc2hlZXQiIHN5bnRheC4KLSAgICoKLSAgICogQHBhcmFtIG1lZGlhIFRoZSBtZWRpYSBhdHRyaWJ1dGUgdG8gYmUgbWF0Y2hlZC4gIE1heSBiZSBudWxsLCBpbiB3aGljaAotICAgKiAgICAgICAgICAgICAgY2FzZSB0aGUgcHJlZmVyZWQgc3R5bGVzaGVldCB3aWxsIGJlIHVzZWQgKGkuZS4sIGFsdGVybmF0ZSA9IG5vKS4KLSAgICogQHBhcmFtIHRpdGxlIFRoZSB2YWx1ZSBvZiB0aGUgdGl0bGUgYXR0cmlidXRlIHRvIG1hdGNoLiAgTWF5IGJlIG51bGwuCi0gICAqIEBwYXJhbSBjaGFyc2V0IFRoZSB2YWx1ZSBvZiB0aGUgY2hhcnNldCBhdHRyaWJ1dGUgdG8gbWF0Y2guICBNYXkgYmUgbnVsbC4KLSAgICogQHJldHVybnMgU3R5bGVzaGVldFNwZWMgZXh0ZW5kcyBYU0xUSW5wdXRTb3VyY2UgZXh0ZW5kcyBTQVggSW5wdXRTb3VyY2U7IHRoZSByZXR1cm4gdmFsdWUKLSAgICogY2FuIGJlIHBhc3NlZCB0byB0aGUgcHJvY2Vzc1N0eWxlc2hlZXQgbWV0aG9kLgotICAgKi8KLSAgcHVibGljIFN0eWxlc2hlZXRTcGVjIGdldEFzc29jaWF0ZWRTdHlsZXNoZWV0KFhTTFRJbnB1dFNvdXJjZSBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVkaWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2hhcnNldCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBHZXQgYSBsaXN0IG9mIHN0eWxlc2hlZXQgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBYU0xUSW5wdXRTb3VyY2UgWE1MIGRvY3VtZW50LAotICAgKiBhcyBpZGVudGlmaWVkIGJ5IHRoZSB4bWwtc3R5bGVzaGVldCBQSSwgYW5kIG1hdGNoaW5nIHRoZSBtZWRpYSBhbmQKLSAgICogY2hhcnNldCBjcml0ZXJpYS4gU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0LyI+Ci0gICAqIEFzc29jaWF0aW5nIFN0eWxlIFNoZWV0cyB3aXRoIFhNTCBkb2N1bWVudHM8L2E+LgotICAgKiBEb2VzIG5vdCB5ZXQgaGFuZGxlIHRoZSBMSU5LIFJFTD0ic3R5bGVzaGVldCIgc3ludGF4LgotICAgKgotICAgKiBAcGFyYW0gbWVkaWEgVGhlIG1lZGlhIGF0dHJpYnV0ZSB0byBiZSBtYXRjaGVkLiAgTWF5IGJlIG51bGwsIGluIHdoaWNoCi0gICAqICAgICAgICAgICAgICBjYXNlIHRoZSBwcmVmZXJlZCBzdHlsZXNoZWV0IHdpbGwgYmUgdXNlZCAoaS5lLiwgYWx0ZXJuYXRlID0gbm8pLgotICAgKiBAcGFyYW0gdGl0bGUgVGhlIHZhbHVlIG9mIHRoZSB0aXRsZSBhdHRyaWJ1dGUgdG8gbWF0Y2guICBNYXkgYmUgbnVsbC4KLSAgICogQHBhcmFtIGNoYXJzZXQgVGhlIHZhbHVlIG9mIHRoZSBjaGFyc2V0IGF0dHJpYnV0ZSB0byBtYXRjaC4gIE1heSBiZSBudWxsLgotICAgKiBAcmV0dXJucyBsaXN0IG9mIFN0eWxlc2hlZXRTcGVjcyAoZXh0ZW5kIFhTTFRJbnB1dFNvdXJjZXMgZXh0ZW5kIFNBWCBJbnB1dFNvdXJjZXM7IGEKLSAgICogbGlzdCBtZW1iZXIgbWF5IGJlIHBhc3NzZWQgdG8gdGhlIHByb2Nlc3NTdHlsZXNoZWV0IG1ldGhvZC4KLSAgICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0QXNzb2NpYXRlZFN0eWxlc2hlZXRzKFhTTFRJbnB1dFNvdXJjZSBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVkaWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2hhcnNldCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uOwotCi0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBYU3RyaW5nLgotICAgKiBAcGFyYW0gcyBBIHZhbGlkIHN0cmluZy4KLSAgICogQHJldHVybiBBbiBYU3RyaW5nIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYU3RyaW5nIGNyZWF0ZVhTdHJpbmcoU3RyaW5nIHMpOwotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gWE9iamVjdC4KLSAgICogQHBhcmFtIG8gQW55IGphdmEgb2JqZWN0LgotICAgKiBAcmV0dXJuIEFuIFhPYmplY3Qgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhPYmplY3QgY3JlYXRlWE9iamVjdChPYmplY3Qgbyk7Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBYTnVtYmVyLgotICAgKiBAcGFyYW0gZCBBbnkgZG91YmxlIG51bWJlci4KLSAgICogQHJldHVybiBBbiBYTnVtYmVyIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYTnVtYmVyIGNyZWF0ZVhOdW1iZXIoZG91YmxlIGQpOwotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gWEJvb2xlYW4uCi0gICAqIEBwYXJhbSBiIGJvb2xlYW4gdmFsdWUuCi0gICAqIEByZXR1cm4gQW4gWEJvb2xlYW4gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFhCb29sZWFuIGNyZWF0ZVhCb29sZWFuKGJvb2xlYW4gYik7Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBYTm9kZVNldC4KLSAgICogQHBhcmFtIG5sIEEgTm9kZUxpc3Qgb2JqZWN0LgotICAgKiBAcmV0dXJuIEFuIFhOb2RlU2V0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYTm9kZVNldCBjcmVhdGVYTm9kZVNldChOb2RlTGlzdCBubCk7Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBYTm9kZVNldCBmcm9tIGEgbm9kZS4KLSAgICogQHBhcmFtIG4gQSBET00gbm9kZS4KLSAgICogQHJldHVybiBBbiBYTm9kZVNldCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgWE5vZGVTZXQgY3JlYXRlWE5vZGVTZXQoTm9kZSBuKTsKLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIFhOdWxsLgotICAgKiBAcmV0dXJuIEFuIFhOdWxsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBYTnVsbCBjcmVhdGVYTnVsbCgpOwotCi0gIC8qKgotICAgKiBTdWJtaXQgYSB0b3AtbGV2ZWwgc3R5bGVzaGVldCBwYXJhbWV0ZXIuICBUaGlzIHZhbHVlIGNhbgotICAgKiBiZSBldmFsdWF0ZWQgaW4gdGhlIHN0eWxlc2hlZXQgdmlhIHhzbDpwYXJhbS12YXJpYWJsZS4KLSAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgcGFyYW0uCi0gICAqIEBwYXJhbSB2YWx1ZSBBbiBYT2JqZWN0IHRoYXQgd2lsbCBiZSB1c2VkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3R5bGVzaGVldFBhcmFtKFN0cmluZyBrZXksIFhPYmplY3QgdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXQgYSB0b3AtbGV2ZWwgc3R5bGVzaGVldCBwYXJhbWV0ZXIuICBUaGlzIHZhbHVlIGNhbgotICAgKiBiZSBldmFsdWF0ZWQgdmlhIHhzbDpwYXJhbS12YXJpYWJsZS4gIE5vdGUgdGhhdCB0aGUgdmFsdWUKLSAgICogcGFzc2VkIGlzIGFuIGV4cHJlc3Npb24sIGFuZCBub3QgYSBzdHJpbmcuICBUaGlzIG1lYW5zIHRoYXQKLSAgICogc2V0U3R5bGVzaGVldFBhcmFtKCJmb28iLCAiaGVsbG8iKTsgd2lsbCBsb29rIGZvciB0aGUKLSAgICogZWxlbWVudCAiaGVsbG8iLiAgSWYgeW91IHdhbnQgdG8gcGFzcyBhIHN0cmluZywgeW91J2xsCi0gICAqIG5lZWQgdG8gcHV0IHF1b3RlcyBhcm91bmQgaXQ6Ci0gICAqIHNldFN0eWxlc2hlZXRQYXJhbSgiZm9vIiwgIidoZWxsbyciKTsgd2lsbCBsb29rIGZvciB0aGUKLSAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgcGFyYW0uCi0gICAqIEBwYXJhbSBleHByZXNzaW9uIEFuIGV4cHJlc3Npb24gdGhhdCB3aWxsIGJlIGV2YWx1YXRlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0eWxlc2hlZXRQYXJhbShTdHJpbmcga2V5LCBTdHJpbmcgZXhwcmVzc2lvbik7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBGb3JtYXR0ZXJMaXN0ZW5lciAoU0FYIERvY3VtZW50SGFuZGxlciksIG9yIG51bGwgaWYgbm9uZSBoYXMgYmVlbiBzZXQuCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnRIYW5kbGVyIGdldEZvcm1hdHRlckxpc3RlbmVyKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgRm9ybWF0dGVyTGlzdGVuZXIgKHRoZSBTQVggRG9jdW1lbnRIYW5kbGVyKS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZvcm1hdHRlckxpc3RlbmVyKERvY3VtZW50SGFuZGxlciBmbGlzdGVuZXIpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgU0FYIERvY3VtZW50SGFuZGxlciAodGhlIHNhbWUgb2JqZWN0IGFzIHRoZSBGb3JtYXR0ZXJMaXN0ZW5lciksIG9yIG51bGwgaWYgbm9uZSBoYXMgYmVlbiBzZXQuCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnRIYW5kbGVyIGdldERvY3VtZW50SGFuZGxlcigpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIGN1cnJlbnQgU0FYIERvY3VtZW50SGFuZGxlciAodGhlIHNhbWUKLSAgICogb2JqZWN0IGFzIHRoZSBGb3JtYXR0ZXJMaXN0ZW5lcikuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudEhhbmRsZXIoRG9jdW1lbnRIYW5kbGVyIGxpc3RlbmVyKTsKLQotICAvKioKLSAgICogQWRkIGEgdHJhY2UgbGlzdGVuZXIgZm9yIHRoZSBwdXJwb3NlcyBvZiBkZWJ1Z2dpbmcgYW5kIGRpYWdub3Npcy4KLSAgICogQHBhcmFtIHRsIFRyYWNlIGxpc3RlbmVyIHRvIGJlIGFkZGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVHJhY2VMaXN0ZW5lcihUcmFjZUxpc3RlbmVyIHRsKQotICAgIHRocm93cyBUb29NYW55TGlzdGVuZXJzRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGVtcGxhdGUgY2FsbHMgYXJlIHRyYWNlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRyYWNlVGVtcGxhdGVzKGJvb2xlYW4gYik7Ci0KLSAgLyoqCi0gICAqIElmIHNldCB0byB0cnVlLCBzZWxlY3Rpb24gZXZlbnRzIGFyZSB0cmFjZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUcmFjZVNlbGVjdChib29sZWFuIGIpOwotCi0gIC8qKgotICAgKiBJZiBzZXQgdG8gdHJ1ZSAodGhlIGRlZmF1bHQgaXMgZmFsc2UpLCBhcyB0ZW1wbGF0ZSBjaGlsZHJlbiBhcmUgYmVpbmcgY29uc3RydWN0ZWQsIGRlYnVnIGRpYWdub3N0aWNzCi0gICAqIGFyZSB3cml0dGVuIHRvIHRoZSBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIKLSAgICogc3RyZWFtLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHJhY2VUZW1wbGF0ZUNoaWxkcmVuKGJvb2xlYW4gYik7Ci0KLSAgLyoqCi0gICAqIElmIHNldCB0byB0cnVlICh0aGUgZGVmYXVsdCksIHBhdHRlcm4gY29uZmxpY3Qgd2FybmluZ3MgYXJlIG5vdCBwcmludGVkIHRvIHRoZSBkaWFnbm9zdGljcyBzdHJlYW0uCi0gICAqIEBwYXJhbSBiIHRydWUgaWYgY29uZmxpY3Qgd2FybmluZ3Mgc2hvdWxkIGJlIHN1cHByZXNzZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRRdWlldENvbmZsaWN0V2FybmluZ3MoYm9vbGVhbiBiKTsKLQotICAvKioKLSAgICogUmVtb3ZlIGEgdHJhY2UgbGlzdGVuZXIuCi0gICAqIEBwYXJhbSB0bCBUcmFjZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlVHJhY2VMaXN0ZW5lcihUcmFjZUxpc3RlbmVyIHRsKTsKLQotICAvKioKLSAgICogSWYgc2V0LCBkaWFnbm9zdGljcyB3aWxsIGJlCi0gICAqIHdyaXR0ZW4gdG8gdGhlIG1fZGlhZ25vc3RpY3NQcmludFdyaXRlciBzdHJlYW0uIElmCi0gICAqIG51bGwsIGRpYWdub3N0aWNzIGFyZSB0dXJuZWQgb2ZmLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBjYWxscwotICAgKiB7QGxpbmsgI3NldERpYWdub3N0aWNzT3V0cHV0KGphdmEuaW8uUHJpbnRXcml0ZXIpfS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERpYWdub3N0aWNzT3V0cHV0KGphdmEuaW8uT3V0cHV0U3RyZWFtIG91dCk7Ci0KLSAgLyoqCi0gICAqIElmIHNldCwgZGlhZ25vc3RpY3Mgd2lsbCBiZQotICAgKiB3cml0dGVuIHRvIHRoZSBtX2RpYWdub3N0aWNzUHJpbnRXcml0ZXIgc3RyZWFtLiBJZgotICAgKiBudWxsLCBkaWFnbm9zdGljcyBhcmUgdHVybmVkIG9mZi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERpYWdub3N0aWNzT3V0cHV0KGphdmEuaW8uUHJpbnRXcml0ZXIgcHcpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIHByb2JsZW0gbGlzdGVuZXIgcHJvcGVydHkuCi0gICAqIFRoZSBYU0wgY2xhc3MgY2FuIGhhdmUgYSBzaW5nbGUgbGlzdGVuZXIgdG8gYmUgaW5mb3JtZWQKLSAgICogb2YgZXJyb3JzIGFuZCB3YXJuaW5ncy4gVGhlIHByb2JsZW0gbGlzdGVuZXIgbm9ybWFsbHkgY29udHJvbHMgd2hldGhlciBhbiBleGNlcHRpb24KLSAgICogaXMgdGhyb3duIG9yIG5vdCAob3IgdGhlIHByb2JsZW0gbGlzdGVuZXJzIGNhbiB0aHJvdyBpdHMgb3duIFJ1bnRpbWVFeGNlcHRpb24pLgotICAgKiBAcGFyYW0gbCBBIFByb2JsZW1MaXN0ZW5lciBpbnRlcmZhY2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9ibGVtTGlzdGVuZXIoUHJvYmxlbUxpc3RlbmVyIGwpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIHByb2JsZW0gbGlzdGVuZXIgcHJvcGVydHkuCi0gICAqIFRoZSBYU0wgY2xhc3MgY2FuIGhhdmUgYSBzaW5nbGUgbGlzdGVuZXIgdG8gYmUgaW5mb3JtZWQKLSAgICogb2YgZXJyb3JzIGFuZCB3YXJuaW5ncy4gVGhlIHByb2JsZW0gbGlzdGVuZXIgbm9ybWFsbHkgY29udHJvbHMgd2hldGhlciBhbiBleGNlcHRpb24KLSAgICogaXMgdGhyb3duIG9yIG5vdCAob3IgdGhlIHByb2JsZW0gbGlzdGVuZXIgY2FuIHRocm93IGl0cyBvd24gUnVudGltZUV4Y2VwdGlvbikuCi0gICAqIEByZXR1cm4gQSBQcm9ibGVtTGlzdGVuZXIgaW50ZXJmYWNlLgotICAgKi8KLSAgcHVibGljIFByb2JsZW1MaXN0ZW5lciBnZXRQcm9ibGVtTGlzdGVuZXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvWFNMVFByb2Nlc3NvckZhY3RvcnkuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFRQcm9jZXNzb3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTUwMjguLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvWFNMVFByb2Nlc3NvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSAgCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5YTUxQYXJzZXJMaWFpc29uOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhGYWN0b3J5OwotLy9pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Qcm9jZXNzb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UZW1wbGF0ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuVHJlZVdhbGtlcjsKLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogTWFudWZhY3R1cmVzIHRoZSBwcm9jZXNzb3IgZm9yIHBlcmZvcm1pbmcgdHJhbnNmb3JtYXRpb25zLiBVc2Ugb25lIG9mIHRoZSBzdGF0aWMgZ2V0UHJvY2Vzc29yIG1ldGhvZHMKLSAqIHRvIGNyZWF0ZSBhbiBYU0xUUHJvY2Vzc29yIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFhTTFRQcm9jZXNzb3JGYWN0b3J5Ci17Ci0gIC8qKgotICAgKiBHZXQgYSBuZXcgWFNMVFByb2Nlc3Nvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgWFNMVFByb2Nlc3NvciBnZXRQcm9jZXNzb3IoKQotICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KLSAgewotICAgIC8vUHJvY2Vzc29yIHByb2Nlc3NvciA9IFByb2Nlc3Nvci5uZXdJbnN0YW5jZSgieHNsdCIpOyAKLSAgICByZXR1cm4gbmV3IFhTTFRFbmdpbmVJbXBsKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEgbmV3IFhTTFRQcm9jZXNzb3IgKHBhcnNlckxpYWlzb25DbGFzc05hbWUgbm8gbG9uZ3JlIHVzZWQpLgotICAgKiAqCi0gICAqIEBzZWUgI2dldFByb2Nlc3NvcigpCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54YWxhbi54cGF0aC54bWwuWE1MUGFyc2VyTGlhaXNvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYU0xUUHJvY2Vzc29yIGdldFByb2Nlc3NvclVzaW5nTGlhaXNvbk5hbWUoU3RyaW5nIHBhcnNlckxpYWlzb25DbGFzc05hbWUpCi0gICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgotICB7Ci0gICAgLy9yZXR1cm4gbmV3IFhTTFRFbmdpbmVJbXBsKHBhcnNlckxpYWlzb25DbGFzc05hbWUpOwotICAgIC8vUHJvY2Vzc29yIHByb2Nlc3NvciA9IFByb2Nlc3Nvci5uZXdJbnN0YW5jZSgieHNsdCIpOyAKLSAgICByZXR1cm4gbmV3IFhTTFRFbmdpbmVJbXBsKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEgbmV3IFhTTFRQcm9jZXNzb3IgKFhNTFBhcnNlckxpYWlzb24gbm8gbG9uZ2VyIHVzZWQpLgotICAgKgotICAgKiBAcGFyYW0gcGFyc2VyTGlhaXNvbiB0aGUgWE1MUGFyc2VyTGlhaXNvbiBzZXQgdXAgdG8gaW50ZXJhY3Qgd2l0aCBhIGdpdmVuIFhNTCBwYXJzZXIuCi0gICAqIEByZXR1cm4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFhTTFRQcm9jZXNzb3IgaW50ZXJmYWNlIHdpdGggd2hpY2ggeW91IGNhbiBwZXJmb3JtIHRyYW5zZm9ybWF0aW9ucy4KLSAgICoKLSAgICogQHNlZSAjZ2V0UHJvY2Vzc29yKCkKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5YTUxQYXJzZXJMaWFpc29uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFhTTFRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKFhNTFBhcnNlckxpYWlzb24gcGFyc2VyTGlhaXNvbikKLSAgewotICAgIC8vcmV0dXJuIG5ldyBYU0xURW5naW5lSW1wbChwYXJzZXJMaWFpc29uKTsKLSAgICB0cnl7Ci0gICAgICAvL1Byb2Nlc3NvciBwcm9jZXNzb3IgPSBQcm9jZXNzb3IubmV3SW5zdGFuY2UoInhzbHQiKTsgCi0gICAgICByZXR1cm4gbmV3IFhTTFRFbmdpbmVJbXBsKCk7Ci0gICAgfQotICAgLyogY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSovCi0gICAgY2F0Y2ggKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBuZXcgWFNMVFByb2Nlc3NvciAoWE1MUGFyc2VyTGlhaXNvbiBhbmQgWFBhdGhGYWN0b3J5IG5vIGxvbmdlciB1c2VkKS4KLSAgICoKLSAgICogQHBhcmFtIHBhcnNlckxpYWlzb24gdGhlIFhNTFBhcnNlckxpYWlzb24gc2V0IHVwIHRvIGludGVyYWN0IHdpdGggYSBnaXZlbiBYTUwgcGFyc2VyLgotICAgKiBAcGFyYW0geHBhdGhGYWN0b3J5IEEgY3VzdG9tIFhQYXRoRmFjdG9yeS4KLSAgICogQHJldHVybiBBbiBpbXBsZW50YXRpb24gb2YgdGhlIFhTTFRQcm9jZXNzb3IgaW50ZXJmYWNlIHdpdGggd2hpY2ggeW91Ci0gICAqIGNhbiBwZXJmb3JtIHRyYW5zZm9ybWF0aW9ucy4KLSAgICoKLSAgICogQHNlZSAjZ2V0UHJvY2Vzc29yKCkKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoLnhtbC5YTUxQYXJzZXJMaWFpc29uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFhTTFRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKFhNTFBhcnNlckxpYWlzb24gcGFyc2VyTGlhaXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFBhdGhGYWN0b3J5IHhwYXRoRmFjdG9yeSkKLSAgewotICAgIC8vcmV0dXJuIG5ldyBYU0xURW5naW5lSW1wbChwYXJzZXJMaWFpc29uLCB4cGF0aEZhY3RvcnkpOwotICAgIHRyeXsKLSAgICAgIC8vUHJvY2Vzc29yIHByb2Nlc3NvciA9IFByb2Nlc3Nvci5uZXdJbnN0YW5jZSgieHNsdCIpOyAKLSAgICAgIHJldHVybiBuZXcgWFNMVEVuZ2luZUltcGwoKTsKLSAgICB9Ci0gIC8qICBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0qLwotICAgIGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFRSZXN1bHRUYXJnZXQuamF2YSBiL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFRSZXN1bHRUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4ZTM5OC4uMDAwMDAwMAotLS0gYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9YU0xUUmVzdWx0VGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgIAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54c2x0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlBhcnNlckFkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ7Ci0KLQotLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogQ29udGFpbnMgdGhlIHJlc3VsdCBvZiBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgeW91IHBlcmZvcm0gd2l0aCB0aGUKLSAqIFhTTFRQcm9jZXNzb3IgcHJvY2VzcygpIG1ldGhvZCBvciBvbmUgb2YgdGhlIFN0eWxlc2hlZXRSb290IHByb2Nlc3MoKSBtZXRob2RzLgotICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdG8gcHJvdmlkZSB0aGUgcHJvY2VzcygpIG1ldGhvZCBhIGNvbnRhaW5lcgotICogZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQgdHJlZS4KLSAqIFlvdSBjYW4gdXNlIGEgZmlsZSBuYW1lIG9yIFVSTCwgY2hhcmFjdGVyIHN0cmVhbSwgYnl0ZSBzdHJlYW0sIERPTSBOb2RlLCBvciBTQVggRG9jdW1lbnRIYW5kbGVyCi0gKiB0byBpbnN0YW50aWF0ZSBhbiBYU0xUUmVzdWx0VGFyZ2V0IG9iamVjdC4KLSAqCi0gKiBAc2VlIFhTTFRQcm9jZXNzb3IjcHJvY2VzcyhYU0xUSW5wdXRTb3VyY2UsIFhTTFRJbnB1dFNvdXJjZSwgWFNMVFJlc3VsdFRhcmdldCkKLSAqIEBzZWUgU3R5bGVzaGVldFJvb3QKLSAqLwotcHVibGljIGNsYXNzIFhTTFRSZXN1bHRUYXJnZXQgLy9pbXBsZW1lbnRzIFJlc3VsdCAvL2V4dGVuZHMgU3RyZWFtUmVzdWx0Ci17Ci0gIAotICBwcml2YXRlIFN0cmVhbVJlc3VsdCBzciA9IG51bGw7Ci0gIHByaXZhdGUgU0FYUmVzdWx0IHNheFJlc3VsdCA9IG51bGw7Ci0gIHByaXZhdGUgRE9NUmVzdWx0IGRyID0gbnVsbDsKLSAgCi0gIAotICAvKioKLSAgICAqIFplcm8tYXJndW1lbnQgZGVmYXVsdCBjb25zdHJ1Y3RvciAgLS0gQmVmb3JlIHlvdSBjYW4gdXNlIHRoZSBuZXcgWFNMVFJlc3VsdFRhcmdldCBvYmplY3QgaW4gYSB0cmFuc2Zvcm1hdGlvbiwKLSAgICAqIHlvdSBtdXN0IGRlZmluZSB0aGUgb3V0cHV0IGNvbnRhaW5lciBieSBzZXR0aW5nIGl0cyBGaWxlTmFtZSwgQ2hhcmFjdGVyU3RyZWEsIEJ5dGVTdHJlYW0sIG9yIE5vZGUgcHJvcGVydHkuCi0gICAgKgotICAgICogQHNlZSAjc2V0RmlsZU5hbWUoU3RyaW5nKQotICAgICogQHNlZSAjc2V0Q2hhcmFjdGVyU3RyZWFtKFdyaXRlcikKLSAgICAqIEBzZWUgI3NldEJ5dGVTdHJlYW0oT3V0cHV0U3RyZWFtKQotICAgICogQHNlZSAjc2V0Tm9kZShOb2RlKQotICAgICogQHNlZSAjc2V0RG9jdW1lbnRIYW5kbGVyKERvY3VtZW50SGFuZGxlcikKLSAgICAqIEBzZWUgI3NldEVuY29kaW5nKFN0cmluZykKLSAgICAqLwotICBwdWJsaWMgWFNMVFJlc3VsdFRhcmdldCAoKQotICB7Ci0gICAgIHNyID0gbmV3IFN0cmVhbVJlc3VsdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBvdXRwdXQgdGFyZ2V0IHdpdGggYSBmaWxlIG5hbWUgLS0gdGhlIGVxdWl2YWxlbnQgb2YgY3JlYXRpbmcgYW4gb3V0cHV0IHRhcmdldAotICAgKiB3aXRoIHRoZSB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yIGFuZCBzZXR0aW5nIHRoZSBuZXcgb2JqZWN0J3MgRmlsZU5hbWUgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBmaWxlTmFtZSBJZGVudGlmaWVzIHRoZSBmaWxlIHRoYXQgd2lsbCBjb250YWluIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQgKG11c3QgYmUgYSB2YWxpZCBzeXN0ZW0gZmlsZSBuYW1lKS4KLSAgICoKLSAgICogQHNlZSAjc2V0RmlsZU5hbWUoU3RyaW5nKQotICAgKiBAc2VlICNzZXRDaGFyYWN0ZXJTdHJlYW0oV3JpdGVyKQotICAgKiBAc2VlICNzZXRCeXRlU3RyZWFtKE91dHB1dFN0cmVhbSkKLSAgICogQHNlZSAjc2V0Tm9kZShOb2RlKQotICAgKiBAc2VlICNzZXREb2N1bWVudEhhbmRsZXIoRG9jdW1lbnRIYW5kbGVyKQotICAgKiBAc2VlICNzZXRFbmNvZGluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgWFNMVFJlc3VsdFRhcmdldCAoU3RyaW5nIGZpbGVOYW1lKSAvLyBGaWxlPwotICB7Ci0gICAgc3IgPSBuZXcgU3RyZWFtUmVzdWx0KCk7Ci0gICAgc3Iuc2V0U3lzdGVtSWQoZmlsZU5hbWUpOwotICB9Ci0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IG91dHB1dCB0YXJnZXQgd2l0aCBhIGJ5dGUgc3RyZWFtIC0tIHRoZSBlcXVpdmFsZW50IG9mIGNyZWF0aW5nIGFuIG91dHB1dCB0YXJnZXQKLSAgICogd2l0aCB0aGUgemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvciBhbmQgc2V0dGluZyB0aGUgbmV3IG9iamVjdCdzIEJ5dGVTdHJlYW0gcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlU3RyZWFtIFRoZSByYXcgYnl0ZSBzdHJlYW0gdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdC4KLSAgICoKLSAgICogQHNlZSAjc2V0Qnl0ZVN0cmVhbShPdXRwdXRTdHJlYW0pCi0gICAqIEBzZWUgI3NldEZpbGVOYW1lKFN0cmluZykKLSAgICogQHNlZSAjc2V0Q2hhcmFjdGVyU3RyZWFtKFdyaXRlcikKLSAgICogQHNlZSAjc2V0Tm9kZShOb2RlKQotICAgKiBAc2VlICNzZXREb2N1bWVudEhhbmRsZXIoRG9jdW1lbnRIYW5kbGVyKQotICAgKiBAc2VlICNzZXRFbmNvZGluZyhTdHJpbmcpCi0gICAqLwotCi0gIHB1YmxpYyBYU0xUUmVzdWx0VGFyZ2V0IChPdXRwdXRTdHJlYW0gYnl0ZVN0cmVhbSkKLSAgewotICAgIHNyID0gbmV3IFN0cmVhbVJlc3VsdCgpOwotICAgIHNyLnNldE91dHB1dFN0cmVhbShieXRlU3RyZWFtKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBvdXRwdXQgdGFyZ2V0IHdpdGggYSBjaGFyYWN0ZXIgc3RyZWFtIC0tIHRoZSBlcXVpdmFsZW50IG9mIGNyZWF0aW5nIGFuIG91dHB1dCB0YXJnZXQKLSAgICogd2l0aCB0aGUgemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvciBhbmQgc2V0dGluZyB0aGUgbmV3IG9iamVjdCdzIENoYXJhY3RlclN0cmVhbSBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGNoYXJhY3RlclN0cmVhbSBUaGUgY2hhcmFjdGVyIHN0cmVhbSB3aGVyZSB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0IGlzIHdyaXR0ZW4uCi0gICAqCi0gICAqIEBzZWUgI3NldENoYXJhY3RlclN0cmVhbShXcml0ZXIpCi0gICAqIEBzZWUgI3NldEJ5dGVTdHJlYW0oT3V0cHV0U3RyZWFtKQotICAgKiBAc2VlICNzZXRGaWxlTmFtZShTdHJpbmcpCi0gICAqIEBzZWUgI3NldE5vZGUoTm9kZSkKLSAgICogQHNlZSAjc2V0RG9jdW1lbnRIYW5kbGVyKERvY3VtZW50SGFuZGxlcikKLSAgICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFhTTFRSZXN1bHRUYXJnZXQgKFdyaXRlciBjaGFyYWN0ZXJTdHJlYW0pCi0gIHsKLSAgICBzciA9IG5ldyBTdHJlYW1SZXN1bHQoKTsKLSAgICBzci5zZXRXcml0ZXIoY2hhcmFjdGVyU3RyZWFtKTsKLSAgfSAgICAKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IG91dHB1dCB0YXJnZXQgd2l0aCBhIERPTSBOb2RlIC0tIHRoZSBlcXVpdmFsZW50IG9mIGNyZWF0aW5nIGFuIG91dHB1dCB0YXJnZXQKLSAgICogd2l0aCB0aGUgemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvciBhbmQgc2V0dGluZyB0aGUgbmV3IG9iamVjdCdzIE5vZGUgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBub2RlIFRoZSBET00gTm9kZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0LgotICAgKgotICAqIEBzZWUgI3NldE5vZGUoTm9kZSkKLSAgICogQHNlZSAjc2V0Q2hhcmFjdGVyU3RyZWFtKFdyaXRlcikKLSAgICogQHNlZSAjc2V0Qnl0ZVN0cmVhbShPdXRwdXRTdHJlYW0pCi0gICAqIEBzZWUgI3NldEZpbGVOYW1lKFN0cmluZykKLSAgICogQHNlZSAjc2V0RG9jdW1lbnRIYW5kbGVyKERvY3VtZW50SGFuZGxlcikKLSAgICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFhTTFRSZXN1bHRUYXJnZXQgKE5vZGUgbikKLSAgewotICAgIGRyID0gbmV3IERPTVJlc3VsdCgpOwotICAgIGRyLnNldE5vZGUobik7Ci0gIH0gICAgCi0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBvdXRwdXQgdGFyZ2V0IHdpdGggYSBTQVggRG9jdW1lbnQgaGFuZGxlciwgd2hpY2gKLSAgICogd2lsbCBoYW5kbGUgcmVzdWx0IGV2ZW50cyAtLSB0aGUgZXF1aXZhbGVudCBvZiBjcmVhdGluZyBhbiBvdXRwdXQgdGFyZ2V0IHdpdGggdGhlCi0gICAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IgYW5kIHNldHRpbmcgdGhlIG5ldyBvYmplY3QncyBEb2N5dW1lbnRIYW5kbGVyIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgU0FYIERvY3VtZW50IGhhbmRsZXIgdG8gd2hpY2ggdGhlIHJlc3VsdCBpcyB3cml0dGVuLgotICAgKgotICAqIEBzZWUgI3NldERvY3VtZW50SGFuZGxlcihEb2N1bWVudEhhbmRsZXIpCi0gICAqIEBzZWUgI3NldE5vZGUoTm9kZSkKLSAgICogQHNlZSAjc2V0Q2hhcmFjdGVyU3RyZWFtKFdyaXRlcikKLSAgICogQHNlZSAjc2V0Qnl0ZVN0cmVhbShPdXRwdXRTdHJlYW0pCi0gICAqIEBzZWUgI3NldEZpbGVOYW1lKFN0cmluZykKLSAgICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFhTTFRSZXN1bHRUYXJnZXQoRG9jdW1lbnRIYW5kbGVyIGhhbmRsZXIpCi0gIHsgCi0gICAgU0FYUmVzdWx0IHNheFJlc3VsdCA9IG5ldyBTQVhSZXN1bHQoKTsgICAgCi0gICAgc2V0RG9jdW1lbnRIYW5kbGVyKGhhbmRsZXIpOwotICB9Ci0gICAgCi0KLSAgLyoqCi0gICAqIFNldCB0aGUgZmlsZSBuYW1lIG9yIFVSTCB3aGVyZSB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0IHdpbGwgYmUgd3JpdHRlbi4KLSAgICoKLSAgICogQHBhcmFtIGZpbGVOYW1lIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBhcyBhIHN0cmluZy4KLSAgICoKLSAgICogQHNlZSAjWFNMVFJlc3VsdFRhcmdldChTdHJpbmcpCi0gICAqIEBzZWUgI2dldEZpbGVOYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZSAoU3RyaW5nIGZpbGVOYW1lKSAvLyBGaWxlPwotICB7Ci0gICAgaWYgKHNyID09IG51bGwpCi0gICAgICBzciA9IG5ldyBTdHJlYW1SZXN1bHQoKTsKLSAgICBzci5zZXRTeXN0ZW1JZChmaWxlTmFtZSk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGZpbGUgbmFtZSB3aGVyZSB0aGUgcmVzdWx0cyBhcmUgb3Igd2lsbCBiZSB3cml0dGVuLCBvciBudWxsIGlmIG5vbmUgd2FzIHN1cHBsaWVkLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBmaWxlIG5hbWUgb3IgVVJMLgotICAgKgotICAgKiBAc2VlICNYU0xUUmVzdWx0VGFyZ2V0KFN0cmluZykKLSAgICogQHNlZSAjc2V0RmlsZU5hbWUoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSAoKQotICB7Ci0gICAgaWYgKHNyICE9IG51bGwpCi0gICAgICByZXR1cm4gc3IuZ2V0U3lzdGVtSWQoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfSAKLQotCi0KLSAgLyoqCi0gICAqIFNldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nLCBpZiBrbm93bi4KLSAgICoKLSAgICogQHBhcmFtIGVuY29kaW5nIFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyAoU3RyaW5nIGVuY29kaW5nKQotICB7Ci0gICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdGhhdCB3YXMgdXNlZC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgZW5jb2RpbmcsIG9yIG51bGwgaWYgbm9uZSB3YXMgc3VwcGxpZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nICgpCi0gIHsKLSAgICByZXR1cm4gZW5jb2Rpbmc7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nOwotCi0KLSAgLyoqCi0gICAqIFNldCBhIFNBWCBEb2N1bWVudEhhbmRsZXIgdG8gcHJvY2VzcyB0aGUgcmVzdWx0IHRyZWUgZXZlbnRzLgotICAgKiBZb3UgY2FuIHByb2Nlc3MgZXZlbnRzIGFzIHRoZXkgb2NjdXIKLSAgICogcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGJlIGNvbXBsZXRlZC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIFNBWCBEb2N1bWVudEhhbmRsZXIgdG8gcHJvY2VzcyByZXN1bHQgdHJlZSBldmVudHMuCi0gICAqCi0gICAqIEBzZWUgI1hTTFRSZXN1bHRUYXJnZXQoRG9jdW1lbnRIYW5kbGVyKQotICAgKiBAc2VlICNnZXREb2N1bWVudEhhbmRsZXIoKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRIYW5kbGVyIChEb2N1bWVudEhhbmRsZXIgaGFuZGxlcikKLSAgewotICAgIHRoaXMuZm9ybWF0dGVyTGlzdGVuZXIgPSBoYW5kbGVyOwotICAgIGlmIChoYW5kbGVyIGluc3RhbmNlb2YgUGFyc2VyQWRhcHRlcikKLSAgICB7Ci0gICAgICBpZiAoc2F4UmVzdWx0ID09IG51bGwpCi0gICAgICAgIHNheFJlc3VsdCA9IG5ldyBTQVhSZXN1bHQoKTsKLSAgICAgIHNheFJlc3VsdC5zZXRIYW5kbGVyKCgoUGFyc2VyQWRhcHRlciloYW5kbGVyKS5nZXRDb250ZW50SGFuZGxlcigpKTsKLSAgICB9ICAKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIFNBWCBEb2N1bWVudEhhbmRsZXIgdGhhdCBwcm9jZXNzZXMgdGhlIHJlc3VsdCB0cmVlIGV2ZW50cy4KLSAgICogWW91IGNhbiB1c2UgdGhlIERvY3VtZW50SGFuZGxlciB0byBwcm9jZXNzIGV2ZW50cyBhcyB0aGV5IG9jY3VyCi0gICAqIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBiZSBjb21wbGV0ZWQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIFNBWCBEb2N1bWVudEhhbmRsZXIgdGhhdCBwcm9jZXNzZXMgcmVzdWx0IHRyZWUgZXZlbnRzLgotICAgKgotICAgKiBAc2VlICNYU0xUUmVzdWx0VGFyZ2V0KERvY3VtZW50SGFuZGxlcikKLSAgICogQHNlZSAjc2V0RG9jdW1lbnRIYW5kbGVyKERvY3VtZW50SGFuZGxlcikKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudEhhbmRsZXIgZ2V0RG9jdW1lbnRIYW5kbGVyICgpCi0gIHsKLSAgICByZXR1cm4gZm9ybWF0dGVyTGlzdGVuZXI7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRG9jdW1lbnRIYW5kbGVyIGZvcm1hdHRlckxpc3RlbmVyID0gbnVsbDsKLSAgCi0gIC8qKgotICAgICAqIFNldCB0aGUgbm9kZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgcmVzdWx0IERPTSB0cmVlLiAgSW4gcHJhY3RpY2UsCi0gICAgICogdGhlIG5vZGUgc2hvdWxkIGJlIGEge0BsaW5rIG9yZy53M2MuZG9tLkRvY3VtZW50fSBub2RlLAotICAgICAqIGEge0BsaW5rIG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnR9IG5vZGUsIG9yIGEKLSAgICAgKiB7QGxpbmsgb3JnLnczYy5kb20uRWxlbWVudH0gbm9kZS4gIEluIG90aGVyIHdvcmRzLCBhIG5vZGUKLSAgICAgKiB0aGF0IGFjY2VwdHMgY2hpbGRyZW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byB3aGljaCB0aGUgdHJhbnNmb3JtYXRpb24KLSAgICAgKiB3aWxsIGJlIGFwcGVuZGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBub2RlKSB7Ci0gICAgICBpZiAoZHIgPT0gbnVsbCkKLSAgICAgICAgZHIgPSBuZXcgRE9NUmVzdWx0KCk7Ci0gICAgICBkci5zZXROb2RlKG5vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbm9kZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgcmVzdWx0IERPTSB0cmVlLgotICAgICAqIElmIG5vIG5vZGUgd2FzIHNldCB2aWEgc2V0Tm9kZSwgdGhlIG5vZGUgd2lsbCBiZQotICAgICAqIHNldCBieSB0aGUgdHJhbnNmb3JtYXRpb24sIGFuZCBtYXkgYmUgb2J0YWluZWQgZnJvbQotICAgICAqIHRoaXMgbWV0aG9kIG9uY2UgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIGNvbXBsZXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbm9kZSB0byB3aGljaCB0aGUgdHJhbnNmb3JtYXRpb24KLSAgICAgKiB3aWxsIGJlIGFwcGVuZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0gICAgICBpZiAoZHIgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIGRyLmdldE5vZGUoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotIC8qKgotICAgKiBTZXQgdGhlIGJ5dGUgc3RyZWFtIHRvIGNvbnRhaW4gdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdC4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVTdHJlYW0gQSBieXRlIHN0cmVhbSB0aGF0IHdpbGwgY29udGFpbiB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0LgotICAgKgotICAgKiBAc2VlICNYU0xUUmVzdWx0VGFyZ2V0KE91dHB1dFN0cmVhbSkKLSAgICogQHNlZSAjc2V0Qnl0ZVN0cmVhbShPdXRwdXRTdHJlYW0pCi0gICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJ5dGVTdHJlYW0oT3V0cHV0U3RyZWFtIGJ5dGVTdHJtKSB7Ci0gICAgICAgIGlmIChzciA9PSBudWxsKQotICAgICAgICAgIHNyID0gbmV3IFN0cmVhbVJlc3VsdCgpOwotICAgICAgICBzci5zZXRPdXRwdXRTdHJlYW0oYnl0ZVN0cm0pOwotICAgIH0KLQotIC8qKgotICAgKiBHZXQgdGhlIGJ5dGUgc3RyZWFtIHRoYXQgY29udGFpbnMgb3Igd2lsbCBjb250YWluIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGJ5dGUgc3RyZWFtLCBvciBudWxsIGlmIG5vbmUgd2FzIHN1cHBsaWVkLgotICAgKgotICAgKiBAc2VlICNYU0xUUmVzdWx0VGFyZ2V0KE91dHB1dFN0cmVhbSkKLSAgICogQHNlZSAjc2V0Qnl0ZVN0cmVhbShPdXRwdXRTdHJlYW0pCi0gICAqLwotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0Qnl0ZVN0cmVhbSgpIHsKLSAgICAgIGlmIChzciAhPSBudWxsKQotICAgICAgICByZXR1cm4gc3IuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHN5c3RlbSBpZGVudGlmaWVyIGZvciB0aGlzIFJlc3VsdC4KLSAgICAgKgotICAgICAqIDxwPklmIHRoZSBSZXN1bHQgaXMgbm90IHRvIGJlIHdyaXR0ZW4gdG8gYSBmaWxlLCB0aGUgc3lzdGVtIGlkZW50aWZpZXIgaXMgb3B0aW9uYWwuCi0gICAgICogVGhlIGFwcGxpY2F0aW9uIG1heSBzdGlsbCB3YW50IHRvIHByb3ZpZGUgb25lLCBob3dldmVyLCBmb3IgdXNlIGluIGVycm9yIG1lc3NhZ2VzCi0gICAgICogYW5kIHdhcm5pbmdzLCBvciB0byByZXNvbHZlIHJlbGF0aXZlIG91dHB1dCBpZGVudGlmaWVycy48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIHN5c3RlbSBpZGVudGlmaWVyIGFzIGEgVVJJIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzdGVtSUQpCi0gICAgewotICAgICAgaWYgKHNyICE9IG51bGwpCi0gICAgICAgIHNyLnNldFN5c3RlbUlkKHN5c3RlbUlEKTsKLSAgICAgIGVsc2UgaWYgKGRyICE9IG51bGwpCi0gICAgICAgIGRyLnNldFN5c3RlbUlkKHN5c3RlbUlEKTsKLSAgICAgIGVsc2UgaWYgKHNheFJlc3VsdCAhPSBudWxsKQotICAgICAgICBzYXhSZXN1bHQuc2V0U3lzdGVtSWQoc3lzdGVtSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3lzdGVtIGlkZW50aWZpZXIgdGhhdCB3YXMgc2V0IHdpdGggc2V0U3lzdGVtSWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzeXN0ZW0gaWRlbnRpZmllciB0aGF0IHdhcyBzZXQgd2l0aCBzZXRTeXN0ZW1JZCwKLSAgICAgKiBvciBudWxsIGlmIHNldFN5c3RlbUlkIHdhcyBub3QgY2FsbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKQotICAgIHsKLSAgICAgIGlmIChzciAhPSBudWxsKQotICAgICAgICByZXR1cm4gc3IuZ2V0U3lzdGVtSWQoKTsKLSAgICAgIGVsc2UgaWYgKGRyICE9IG51bGwpCi0gICAgICAgIGRyLmdldFN5c3RlbUlkKCk7Ci0gICAgICBlbHNlIGlmIChzYXhSZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgc2F4UmVzdWx0LmdldFN5c3RlbUlkKCk7Ci0gICAgICAKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAgLyoqCi0gICAgICogU2V0IHRoZSB3cml0ZXIgdGhhdCBpcyB0byByZWNlaXZlIHRoZSByZXN1bHQuICBOb3JtYWxseSwKLSAgICAgKiBhIHN0cmVhbSBzaG91bGQgYmUgdXNlZCByYXRoZXIgdGhhbiBhIHdyaXRlciwgc28gdGhhdAotICAgICAqIHRoZSB0cmFuc2Zvcm1lciBtYXkgdXNlIGluc3RydWN0aW9ucyBjb250YWluZWQgaW4gdGhlCi0gICAgICogdHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zIHRvIGNvbnRyb2wgdGhlIGVuY29kaW5nLiAgSG93ZXZlciwKLSAgICAgKiB0aGVyZSBhcmUgdGltZXMgd2hlbiBpdCBpcyB1c2VmdWwgdG8gd3JpdGUgdG8gYSB3cml0ZXIsCi0gICAgICogc3VjaCBhcyB3aGVuIHVzaW5nIGEgU3RyaW5nV3JpdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlciAgQSB2YWxpZCBXcml0ZXIgcmVmZXJlbmNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlclN0cmVhbShXcml0ZXIgd3JpdGVyKSB7ICAgICAgCi0gICAgICBpZiAoc3IgPT0gbnVsbCkKLSAgICAgICAgc3IgPSBuZXcgU3RyZWFtUmVzdWx0KCk7Ci0gICAgICBzci5zZXRXcml0ZXIod3JpdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNoYXJhY3RlciBzdHJlYW0gdGhhdCB3YXMgc2V0IHdpdGggc2V0V3JpdGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY2hhcmFjdGVyIHN0cmVhbSB0aGF0IHdhcyBzZXQgd2l0aCBzZXRXcml0ZXIsIG9yIG51bGwKLSAgICAgKiBpZiBzZXRXcml0ZXIgb3IgdGhlIFdyaXRlciBjb25zdHJ1Y3RvciB3YXMgbm90IGNhbGxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgV3JpdGVyIGdldENoYXJhY3RlclN0cmVhbSgpIHsKLSAgICAgIGlmIChzciAhPSBudWxsKQotICAgICAgICByZXR1cm4gc3IuZ2V0V3JpdGVyKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgCi0gIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgUmVzdWx0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBYU0xUUmVzdWx0VGFyZ2V0IG9iamVjdCAuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBSZXN1bHQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFhTTFRSZXN1bHRUYXJnZXQgb2JqZWN0Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFJlc3VsdCBnZXRSZXN1bHRPYmplY3QoKSAKLSAgICB7Ci0gICAgICBpZiAoc3IgIT0gbnVsbCkgICAgICAgIAotICAgICAgICByZXR1cm4gc3I7Ci0gICAgICBlbHNlIGlmIChkciAhPSBudWxsKQotICAgICAgICByZXR1cm4gZHI7Ci0gICAgICBlbHNlIAotICAgICAgICByZXR1cm4gc2F4UmVzdWx0OwotICAgIH0gCi0gICAgCi19CmRpZmYgLS1naXQgYS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9wYWNrYWdlLmh0bWwgYi9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTM5ZjIuLjAwMDAwMDAKLS0tIGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPEhUTUw+PEhFQUQ+PC9IRUFEPjxCT0RZPgotICAgICA8UD48Qj5UaGUgbWFpbiBYYWxhbi1KYXZhIDEgY29tcGF0YWJpbGl0eSBwYWNrYWdlPC9CPiAtLSBmYWNpbGl0aWVzIGZvciBzZXR0aW5nIHVwIGFuZCBwZXJmb3JtaW5nIFhTTCB0cmFuc2Zvcm1hdGlvbnMuPC9QPgotICAgCi0gICAgIDxQPlVzZSBvbmUgb2YgdGhlIHtAbGluayBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVFByb2Nlc3NvckZhY3Rvcnl9IHN0YXRpYyBnZXRQcm9jZXNzb3IgbWV0aG9kcyB0bwotICAgICAgaW5zdGFudGlhdGUgYW4ge0BsaW5rIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xUUHJvY2Vzc29yfS4gVGhlIFhTTFRQcm9jZXNzb3IgaW50ZXJmYWNlIGRlZmluZXMgdGhlIAotICAgICAgWFNMVCBwcm9jZXNzb3IgQVBJLiBZb3Ugc2hvdWxkIG5ldmVyIG5lZWQgdG8gY2FsbCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiAKLSAgICAgICh7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRFbmdpbmVJbXBsfSkgZGlyZWN0bHkuPC9QPgotICAgICAgCi0gICAgICA8UD5JbnN0YW50aWF0ZSB7QGxpbmsgb3JnLmFwYWNoZS54YWxhbi54c2x0LlhTTFRJbnB1dFNvdXJjZX0gb2JqZWN0cyBmb3IgdGhlIFhNTCBpbnB1dCBhbmQgdGhlIFhTTAotICAgICAgc3R5bGVzaGVldCwgYW5kIGFuIHtAbGluayBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVFJlc3VsdFRhcmdldH0gb2JqZWN0IGZvciB0aGUgdHJhbnNmb3JtYXRpb24gb3V0cHV0LiAKLSAgICAgIFlvdSBtYXkgY29uc3RydWN0IHRoZXNlIG9iamVjdHMgd2l0aCBhIHZhcmlldHkgb2YgY29udGFpbmVycy9mb3JtYXRzLCBpbmNsdWRpbmcgZmlsZXMgb3IgVVJMcywgY2hhcmFjdGVyCi0gICAgICBzdHJlYW1zLGJ5dGUgc3RyZWFtcywgU0FYIGlucHV0IHN0cmVhbXMgb3IgZG9jdW1lbnQgaGFuZGxlcnMsIGFuZCBhIERPTSB0cmVlLjwvUD4KLSAgICAgIDxQPkFzIGEgZ2VuZXJhbCBydWxlLCB1c2UgdGhlIFhTTFRQcm9jZXNzb3IgcHJvY2VzcyBtZXRob2QgdG8gcGVyZm9ybSBhIHRyYW5zZm9ybWF0aW9uLCB0aGVyZWJ5IGZpbGxpbmcgdGhlCi0gICAgICBYU0xUUmVzdWx0VGFyZ2V0IG9iamVjdC4gRm9yIHJlcGVhdGVkIHRyYW5zZm9ybWF0aW9ucywgdG8gZ2F0aGVyIGluZm9ybWF0aW9uIGZyb20gdGhlIHN0eWxlc2hlZXQgYmVmb3JlIHlvdQotICAgICAgcGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24sIG9yIHRvIHNldCB1cCB0aGUgcHJvY2Vzc29yIHRvIGZ1bmN0aW9uIGFzIGEgU0FYIGRvY3VtZW50IGhhbmRsZXIsIHVzZSB0aGUKLSAgICAgICBYU0xUUHJvY2Vzc29yIHByb2Nlc3NTdHlsZXNoZWV0IG1ldGhvZCB0byBjb21waWxlIHRoZSBYU0wgc3R5bGVzaGVldCwgd2hpY2ggcmV0dXJucyBhIAotICAgICAgIHtAbGluayBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuU3R5bGVzaGVldFJvb3R9IG9iamVjdCB3aXRoIGl0cyBvd24gcHJvY2VzcyBtZXRob2QuPC9QPgotICAgPC9CT0RZPjwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYWtlLmluY2x1ZGUgYi9tYWtlLmluY2x1ZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NzFjZTkuLjAwMDAwMDAKLS0tIGEvbWFrZS5pbmNsdWRlCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvbW1vbiB2YXJpYWJsZXMgYW5kIHRhcmdldHMgZm9yIFhQYXRoIGFuZCB4c2x0NGoKLSMKLSMgU2VlIE1ha2VmaWxlIGZvciBpbXBvcnRhbnQgZW52aXJvbm1lbnQgbm90ZXMKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFByb2plY3Qtc3BlY2lmaWMgdmFyaWFibGVzIGFuZCBydWxlcwotIwotIyBZb3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGVkaXQgdGhlc2UKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1KQVZBWCA9IC5qYXZhCi1DTEFTU1ggPSAuY2xhc3MKLUpBUlggID0gLmphcgotVEFSWCAgPSAudGFyLmd6Ci1aSVBYICA9IC56aXAKLU9CSlMgID0gJChTUkNTOiUuamF2YT0lLmNsYXNzKQotCi0jIEEgc2ltcGxlIG1hcmtlciBmaWxlIGNyZWF0ZWQgdG8gc2hvdyBsYXN0IGNvbXBpbGUgdGltZQotIyBOb3RlIHN1YmRpcmVjdG9yaWVzIG1heSByZXNldCB0aGUgbmFtZSEKLVNJTkNFX0ZJTEUgICAgICAgPSBzaW5jZS5sYXN0Ci0KLSMgUmVsYXRpdmUgZGlyZWN0b3J5ICh1c3VhbGx5IGZyb20gLi9zcmMvLikgd2hlcmUgY2xhc3MgZmlsZXMgYXJlIHRvIGdvCi1DTEFTU19ESVIgICAgICAgID0gY2xhc3NlcwotCi1DVVJSRU5UX0RJUiAgICAgID0gLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCdWlsZC1zcGVjaWZpYyB0b29scyBhbmQgZmxhZ3MgZGVmaW5pdGlvbnMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QUk9EVUNUX05BTUUgOj0geGFsYW4KLVZFUlNJT04gICAgICA9IF8xXzFfRDAxCi1KQVJOQU1FICAgICAgPSAkKFBST0RVQ1RfTkFNRSkkKEpBUlgpCi1KQVJESVNUTkFNRSAgPSAkKFBST0RVQ1RfTkFNRSktaiQoVkVSU0lPTikkKEpBUlgpCi1UQVJESVNUTkFNRSAgPSAkKFBST0RVQ1RfTkFNRSktaiQoVkVSU0lPTikkKFRBUlgpCi1aSVBESVNUTkFNRSAgPSAkKFBST0RVQ1RfTkFNRSktaiQoVkVSU0lPTikkKFpJUFgpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVudmlyb25tZW50LXNwZWNpZmljIHRvb2xzIGFuZCBmbGFncyBkZWZpbml0aW9ucwotIwotIyBZb3UgbWF5IG5lZWQgdG8gZWRpdCB0aGVzZSBpZiB5b3UncmUgbm90IHVzaW5nCi0jIGEgc3RhbmRhcmQgSkRLIG9yIHRoZSB0b29scyBhcmVuJ3Qgb24gdGhlIHBhdGguCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBSZWZlcmVuY2VzIHRvIGRlZmF1bHQgdG9vbHMKLUpBVkEgICAgICAgPSBqYXZhCi1KQVZBQyAgICAgID0gamF2YWMKLUpBVkFET0MgICAgPSBqYXZhZG9jCi1KQVIgICAgICAgID0gamFyCi0jIFJlZmVyZW5jZXMgdG8gSkRLIDEuMi1vbmx5IHRvb2xzOyByZXF1aXJlZCBmb3IgeGRvY3MgYnVpbGQKLSMgV2hpbGUgdGhlIGNvZGUgY29tcGlsZXMgdW5kZXIgMS4xLjggb3IgMS4yLjIsIHRoZSBkb2NzIHJlcXVpcmUgMS4yLjIKLSMgVGh1cywgeW91IGNhbiBpbnN0YWxsIGJvdGggSkRLJ3MsIHNldCAxLjEuOCB1cCBhcyBkZWZhdWx0LAotIyB0aGVuIGNhbGwgdXMgbGlrZSAnbWFrZSAtZiBNYWtlZmlsZSBKQVZBQzEyPWM6L2pkazEyMi9iaW4vamF2YWMuZXhlIC4uLicKLSMgICAgVGhpcyBzaG91bGQgY29tcGlsZSB0aGUgc291cmNlcyB3aXRoIDEuMS44LCBidXQgdGhlIGRvYyB3aXRoIDEuMi4yCi1KQVZBMTIgICAgID0gamF2YQotSkFWQUMxMiAgICA9IGphdmFjCi1KQVZBRE9DMTIgID0gamF2YWRvYwotCi0jIFNldHRpbmcgZmxhZ3MgZm9yIHZhcmlvdXMgdG9vbHMKLSMgWW91IGNhbiBvdmVycmlkZSB0aGVzZSBvbiB0aGUgbWFrZSBjb21tYW5kIGxpbmUgYXMgd2VsbAotIyAgICBDYWxsIHVzIGxpa2UgJ21ha2UgLWYgTWFrZWZpbGUgSkFWQURFQlVHPS1nOm5vbmUgLi4uJwotSkFWQURFQlVHICAgPSAtZwotIyBKQVZBREVCVUcgICA9IC1nOm5vbmUgLU8KLUpBVkFERVNURElSID0gLWQgJChDTEFTU19ESVIpCi1KQVZBQ0ZMQUdTICA9ICQoSkFWQURFQlVHKSAkKEpBVkFERVNURElSKQotSkFSRkxBR1MgICAgPSBNY2YwCi0KLSMgUmVmZXJlbmNlcyB0byBvdGhlciB0b29scwotUk0gICAgICAgICA9IHJtIC1mCi1STS1SRiAgICAgID0gcm0gLXJmCi1DUCAgICAgICAgID0gY3AgLWYKLUNQUiAgICAgICAgPSBjcCAtUnZmCi1VUERJUiAgICAgIDo9IC4uCi0KLSMgUmVmZXJlbmNlcyB0byBzdGFuZGFyZCBVTklYIG9yIEN5Z3dpbiB0YXIgdXRpbGl0eSwgZmlsdGVyaW5nIHRocm91Z2ggZ3ppcAotVEFSR1ogICAgICA9IHRhciBjdnpmCi1VTlRBUkdaICAgICAgPSB0YXIgeHZ6ZiAKLQotIyBEZWNpZGUgaWYgd2UncmUgb24gdW5peCBvciBET1MKLWlmZXEgKCwkKGZpbmRzdHJpbmcgdXNyLCQoUEFUSCkpKQotIyBET1MKLVBBVEhTRVAgOj0gXFwKLUNMUEFUSFNFUCA6PSA7Ci1lbHNlIAotIyBVTklYCi1QQVRIU0VQIDo9IC8KLUNMUEFUSFNFUCA6PSA6Ci1lbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBNYWluIHRhcmdldHMgZGVmaW5pdGlvbnMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0uUEhPTlk6IG1ha2VhbGwKLW1ha2VhbGw6IGFsbAotCi0uUEhPTlk6IGNsZWFuCi1jbGVhbjo6Ci0JJChSTSkgKi5jbGFzcyAkKEpBUk5BTUUpICp+ICouYmFrICoubyAqLm9iaiAqLmRsbCAkKFNJTkNFX0ZJTEUpCi0KLS5QSE9OWTogbWFrZXN1YmRpcnMKLW1ha2VzdWJkaXJzOgotCUBmb3IgaSBpbiAkKFNVQkRJUlMpIDsgXAotCWRvIFwKLQkoY2QgJCRpOyBlY2hvIG1ha2luZyB4cGF0aCBlbmdpbmUgaW4gIiQoQ1VSUkVOVF9ESVIpLyQkaS4uLiI7IFwKLQkkKE1BS0UpIENVUlJFTlRfRElSPSQoQ1VSUkVOVF9ESVIpLyQkaSAkKE1GTEFHUykgLWYgbWFrZXhwYXRoNGogSkFWQUNGTEFHUz0iJChKQVZBQ0ZMQUdTKSIgYWxsKTsgXAotCShjZCAkJGk7IGVjaG8gbWFraW5nIHhzbHQgZW5naW5lIGluICIkKENVUlJFTlRfRElSKS8kJGkuLi4iOyBcCi0JJChNQUtFKSBDVVJSRU5UX0RJUj0kKENVUlJFTlRfRElSKS8kJGkgJChNRkxBR1MpIC1mIG1ha2V4c2x0NGogSkFWQUNGTEFHUz0iJChKQVZBQ0ZMQUdTKSIgYWxsKTsgXAotCWRvbmUKLQotLlBIT05ZOiBtYWtlY29tcGF0Ci1tYWtlY29tcGF0OgotCUBmb3IgaSBpbiAkKFNVQkRJUlMpIDsgXAotCWRvIFwKLQkoY2QgJCRpOyBlY2hvIG1ha2luZyBjb21wYXQgZW5naW5lIGluICIkKENVUlJFTlRfRElSKS8kJGkuLi4iO3B3ZDsgXAotCSQoTUFLRSkgQ1VSUkVOVF9ESVI9JChDVVJSRU5UX0RJUikvJCRpICQoTUZMQUdTKSAtZiBtYWtlY29tcGF0IEpBVkFDRkxBR1M9IiQoSkFWQUNGTEFHUykiIGFsbCk7IFwKLQlkb25lCi0KLS5QSE9OWTogbWFrZWRvY3MKLW1ha2Vkb2NzOgotCUBmb3IgaSBpbiB4ZG9jcyA7IFwKLQlkbyBcCi0JKGNkICQkaTsgZWNobyBtYWtpbmcgeC1kb2NzIGluICIkKENVUlJFTlRfRElSKS8kJGkuLi4iOyBcCi0JJChNQUtFKSBDVVJSRU5UX0RJUj0kKENVUlJFTlRfRElSKS8kJGkgJChNRkxBR1MpIC1mIE1ha2VmaWxlIGFsbCk7IFwKLQlkb25lCi0KLS5QSE9OWTogbWFrZXNhbXBsZXMKLW1ha2VzYW1wbGVzOgotCUBmb3IgaSBpbiBzYW1wbGVzIDsgXAotCWRvIFwKLQkoY2QgJCRpOyBlY2hvIG1ha2luZyBzYW1wbGVzIGluICIkKENVUlJFTlRfRElSKS8kJGkuLi4iOyBcCi0JJChNQUtFKSBDVVJSRU5UX0RJUj0kKENVUlJFTlRfRElSKS8kJGkgJChNRkxBR1MpIC1mIE1ha2VmaWxlIGFsbCk7IFwKLQlkb25lCi0KLS5QSE9OWTogY2xlYW5zdWJkaXJzIAotY2xlYW5zdWJkaXJzOgotCS1AZm9yIGkgaW4gJChTVUJESVJTKSA7IFwKLQlkbyBcCi0JKGNkICQkaTsgZWNobyBjbGVhbmluZyBpbiAiJChDVVJSRU5UX0RJUikvJCRpLi4uIjsgXAotCSQoTUFLRSkgQ1VSUkVOVF9ESVI9JChDVVJSRU5UX0RJUikvJCRpIC1mIG1ha2V4cGF0aDRqICQoTUZMQUdTKSBjbGVhbik7IFwKLQkoY2QgJCRpOyBlY2hvIGNsZWFuaW5nIGluICIkKENVUlJFTlRfRElSKS8kJGkuLi4iOyBcCi0JJChNQUtFKSBDVVJSRU5UX0RJUj0kKENVUlJFTlRfRElSKS8kJGkgLWYgbWFrZXhzbHQ0aiAkKE1GTEFHUykgY2xlYW4pOyBcCi0JZG9uZQotCi0uUEhPTlk6IGNsZWFuY29tcGF0Ci1jbGVhbmNvbXBhdDoKLQktQGZvciBpIGluICQoU1VCRElSUykgOyBcCi0JZG8gXAotCShjZCAkJGk7IGVjaG8gY2xlYW5pbmcgaW4gIiQoQ1VSUkVOVF9ESVIpLyQkaS4uLiI7IFwKLQkkKE1BS0UpIENVUlJFTlRfRElSPSQoQ1VSUkVOVF9ESVIpLyQkaSAtZiBtYWtlY29tcGF0ICQoTUZMQUdTKSBjbGVhbik7IFwKLQlkb25lCi0KLS5QSE9OWTogY2xlYW5kb2NzCi1jbGVhbmRvY3M6Ci0JQGZvciBpIGluIHhkb2NzIDsgXAotCWRvIFwKLQkoY2QgJCRpOyBlY2hvIGNsZWFuaW5nIHVwIHgtZG9jcyAiJChDVVJSRU5UX0RJUikvJCRpLi4uIjsgXAotCSQoTUFLRSkgQ1VSUkVOVF9ESVI9JChDVVJSRU5UX0RJUikvJCRpICQoTUZMQUdTKSAtZiBNYWtlZmlsZSBjbGVhbik7IFwKLQlkb25lCi0KLS5QSE9OWTogY2xlYW5zYW1wbGVzCi1jbGVhbnNhbXBsZXM6Ci0JQGZvciBpIGluIHNhbXBsZXMgOyBcCi0JZG8gXAotCShjZCAkJGk7IGVjaG8gY2xlYW5pbmcgdXAgc2FtcGxlcyAiJChDVVJSRU5UX0RJUikvJCRpLi4uIjsgXAotCSQoTUFLRSkgQ1VSUkVOVF9ESVI9JChDVVJSRU5UX0RJUikvJCRpICQoTUZMQUdTKSAtZiBNYWtlZmlsZSBjbGVhbik7IFwKLQlkb25lCi0KLSMgRW5kIG9mIGZpbGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYWtlLmluY2x1ZGUyIGIvbWFrZS5pbmNsdWRlMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiODY2Zi4uMDAwMDAwMAotLS0gYS9tYWtlLmluY2x1ZGUyCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29tbW9uIGRlZmluaXRpb25zIGFuZCBtYWluICdjb21waWxlJyBydWxlIGZvciB4cGF0aCBhbmQgeHNsdC4KLSMKLSMgU2VlIE1ha2VmaWxlIGZvciBpbXBvcnRhbnQgZW52aXJvbm1lbnQgbm90ZXMKLSMgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIE5vdGUgdGhpcyBpcyBzZXBhcmF0ZSBmcm9tIHRoZSB2YXJpYWJsZSBpbiBtYWtlLmluY2x1ZGUKLUNMQVNTRVNESVIgPSBjbGFzc2VzCi0KLSMgQWRkIG90aGVyIHJlcXVpcmVkIGRpcnMgdG8gdGhlIGNsYXNzcGF0aAotWE1MNEpfQ0xBU1NQQVRIIDo9IC4uJChQQVRIU0VQKS4uJChQQVRIU0VQKS4uJChQQVRIU0VQKXhtbC14ZXJjZXMkKFBBVEhTRVApamF2YSQoUEFUSFNFUCliaW4kKFBBVEhTRVApeGVyY2VzLmphcgotQlNGX0NMQVNTUEFUSCA6PSAuLiQoUEFUSFNFUCliaW4kKFBBVEhTRVApYnNmLmphcgotIyBBZGQgLiAoY3VycmVudCBkaXIpIHRvIGVuZCBvZiBjbGFzc3BhdGggdG8gaGVscCAxLjEueCBjb21waWxlcnMgZmluZCBhbGwgdGhlIHNvdXJjZSBmaWxlcywgdGhhbmtzIHRvIFNlYW4gVGltbQotRVhUUkFfQ0xBU1NQQVRIIDo9ICQoWE1MNEpfQ0xBU1NQQVRIKSQoQ0xQQVRIU0VQKSQoQlNGX0NMQVNTUEFUSCkkKENMUEFUSFNFUCkkKENMQVNTRVNESVIpJChDTFBBVEhTRVApJChDTEFTU1BBVEgpJChDTFBBVEhTRVApLgotCi1zaW5jZWxhc3Q6ICQoU0lOQ0VfRklMRSkKLSQoU0lOQ0VfRklMRSk6ICQoU1JDUykKLQktbWtkaXIgJChDTEFTU0VTRElSKQotCSQoSkFWQUMpICQoSkFWQUNGTEFHUykgLWNsYXNzcGF0aCAiJChFWFRSQV9DTEFTU1BBVEgpIiAkPwotCXRvdWNoICQoU0lOQ0VfRklMRSkKLQotCmRpZmYgLS1naXQgYS9yZWFkbWUuaHRtbCBiL3JlYWRtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWU0OGFkLi4wMDAwMDAwCi0tLSBhL3JlYWRtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCi0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+Ci08L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08bWV0YSBjb250ZW50PSIwOyBVUkw9ZG9jcy93aGF0c25ldy5odG1sIiBodHRwLWVxdWl2PSJSZWZyZXNoIj4KLSAgICAgIFJlZGlyZWN0aW5nIHRvIDxhIGhyZWY9ImRvY3Mvd2hhdHNuZXcuaHRtbCI+V2hhdCdzIE5ldyBpbiBYYWxhbl9KYXZhIDI8L2E+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCi0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLQotCi0KLSAgICAgICAgICAgIAotICAgCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9SRUFETUUuaHRtbCBiL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML1JFQURNRS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGI1ODRkLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML1JFQURNRS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+PC90aXRsZT5YYWxhbiBTYW1wbGUgQXBwbGV0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSIjODA4MDgwIiB0ZXh0PSIjZmZmZmZmIj4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZD48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIwIiB2c3BhY2U9IjAiIGFsaWduPSJsZWZ0IiBzcmM9InJhYmJpdHdob3JuLmpwZyI+PC90ZD4KLSAgICAgIDx0ZD48aDI+Jm5ic3A7UnVubmluZyB0aGUgWGFsYW4gc2FtcGxlIGFwcGxldHM8L2gyPjwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPGhyPgotICA8dWw+Ci0gIDxsaT5hcHBsZXRYTUx0b0hUTUwuaHRtbCB0cmFuc2Zvcm1zIFhNTCBpbnRvIEhUTUwsIGFuZCBkaXNwbGF5cyB0aGUgWE1MIGRvY3VtZW50IGFuZCBYU0wgc3R5bGVzaGVldCBhcyB3ZWxsIGFzIHRoZSBIVE1MIHRyYW5zZm9ybWF0aW9uIHJlc3VsdC48YnIvPjxici8+PC9saT4KLSAgPGxpPmdldC10b2RvLWxpc3QuaHRtbCB1c2VzIHRvZG8ueHNsIHRvIHRyYW5zZm9ybSB0b2RvLnhtbCBhbmQgZGlzcGxheSB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0LiBUaGUgWE1MIHNvdXJjZSBpcyBhIHNuYXBzaG90IG9mIHRvZG8ueG1sIGluIHRoZSB4bWwteGFsYW4gQ1ZTIHJlcG9zaXRvcnksIGFuIG9uZ29pbmcgbGlzdCBvZiB0YXNrcyBhbmQgdGFzayBjb21wbGV0aW9ucyBmb3IgdGhlIFhhbGFuLUphdmEgMiBkZXZlbG9wbWVudCBwcm9qZWN0LjwvbGk+Ci0gIDxwPkJvdGggYXBwbGV0cyBsb29rIGZvciB4YWxhbi5qYXIgYW5kIHhlcmNlcy5qYXIgaW4gdGhlIGJpbiBkaXJlY3RvcnkuIElmIHRoZSBKQVIgZmlsZXMgYXJlIGVsc2V3aGVyZSwgeW91IG11c3QgbW92ZSB0aGVtIG9yIGFkanVzdCB0aGUgYXBwbGV0IGFyY2hpdmUgc2V0dGluZyBpbiBjbGllbnQuaHRtbCBhbmQgZ2V0LXRvZG8tbGlzdC5odG1sLjwvcD4KLTwvdWw+Ci08cD5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNhbXBsZXMgKHdoYXQgdGhleSBpbGx1c3RyYXRlIGFuZCBob3cgdG8gcnVuIHRoZW0pLCBzZWUgPGEgaHJlZj0iLi4vLi4vZG9jcy9zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+LjwvcD4KLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9hcHBsZXRYTUx0b0hUTUwuaHRtbCBiL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML2FwcGxldFhNTHRvSFRNTC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFhOTAwLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML2FwcGxldFhNTHRvSFRNTC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+VXNpbmcgYW4gYXBwbGV0IHRvIHBlcmZvcm0gWFNMIHRyYW5zZm9ybWF0aW9uczwvdGl0bGU+Ci08L2hlYWQ+Ci0gIDxGUkFNRVNFVCBST1dTPSIxMjUsKiIgPgotICAgIDxGUkFNRSBOQU1FPSJwcm9jZXNzb3IiIFNSQz0iY2xpZW50Lmh0bWwiIFNDUk9MTElORz0iYXV0byIgPgotICAgICAgPGZyYW1lc2V0IGNvbHM9IjMzJSwgMzMlLCAqIj4KLSAgICAgICAgPEZSQU1FIE5BTUU9InRhcmdldEFyZWEwIiBTUkM9InRhcmdldC5odG1sIiA+Ci0gICAgICAgIDxGUkFNRSBOQU1FPSJ0YXJnZXRBcmVhMSIgU1JDPSJ0YXJnZXQuaHRtbCIgPgotICAgICAgICA8RlJBTUUgTkFNRT0idGFyZ2V0QXJlYTIiIFNSQz0idGFyZ2V0Lmh0bWwiID4gICAgICAgIAotICAgICAgPC9mcmFtZXNldD4KLSAgPC9GUkFNRVNFVD4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvY2xpZW50Lmh0bWwgYi9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9jbGllbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhNDM4Mi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9jbGllbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci0gIDxoZWFkPgotCSAgPHRpdGxlPlVudGl0bGVkPC90aXRsZT4KLSAgPC9oZWFkPgotICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotICAgIAotICAgIGZ1bmN0aW9uIHdyaXRlU291cmNlKHNvdXJjZVN0cmluZykKLSAgICB7Ci0KLSAgICAgIHZhciBlc2NTdHJpbmc9ZG9jdW1lbnQueHNsQ29udHJvbC5lc2NhcGVTdHJpbmcoc291cmNlU3RyaW5nKTsKLSAgICAgIHZhciB0aXRsZT0iWE1MIFNvdXJjZSBEb2MiOwotICAgICAgdmFyIGRvYz10b3AuZnJhbWVzWzFdLmRvY3VtZW50OyAgICAgIAotICAgICAgZG9jLm9wZW4oKTsKLSAgICAgIGRvYy53cml0ZSgiPGgzPiIgKyB0aXRsZSArICI8L2gzPiIpOwotICAgICAgZG9jLndyaXRlKCI8UFJFPiIpOwotICAgICAgZG9jLndyaXRlKGVzY1N0cmluZyk7Ci0gICAgICBkb2Mud3JpdGUoIjwvUFJFPiIpOwotICAgICAgZG9jLmNsb3NlKCk7ICAgIAotICAgIH0KLSAgCi0gICAgZnVuY3Rpb24gd3JpdGVTdHlsZXNoZWV0KHN0eWxlU3RyaW5nKQotICAgIHsKLSAgICAgIHZhciBlc2NTdHJpbmc9ZG9jdW1lbnQueHNsQ29udHJvbC5lc2NhcGVTdHJpbmcoc3R5bGVTdHJpbmcpOwotICAgICAgdmFyIHRpdGxlPSJYU0wgU3R5bGVzaGVldCI7Ci0gICAgICB2YXIgZG9jPXRvcC5mcmFtZXNbMl0uZG9jdW1lbnQ7ICAgICAgICAgIAotICAgICAgZG9jLm9wZW4oKTsKLSAgICAgIGRvYy53cml0ZSgiPGgzPiIgKyB0aXRsZSArICI8L2gzPiIpOwotICAgICAgZG9jLndyaXRlKCI8UFJFPiIpOwotICAgICAgZG9jLndyaXRlKGVzY1N0cmluZyk7Ci0gICAgICBkb2Mud3JpdGUoIjwvUFJFPiIpOwotICAgICAgZG9jLmNsb3NlKCk7ICAgICAKLSAgICB9IAotCi0gICAgZnVuY3Rpb24gd3JpdGVUYXJnZXQodGFyZ2V0U3RyaW5nKQotICAgIHsKLSAgICAgIHZhciBkb2M9dG9wLmZyYW1lc1szXS5kb2N1bWVudDsKLSAgICAgIGRvYy5vcGVuKCk7Ci0gICAgICB2YXIgdGl0bGU9IkhUTUwgT3V0cHV0IjsgICAgICAKLSAgICAgIGRvYy53cml0ZSgiPGgzPiIgKyB0aXRsZSArICI8L2gzPiIpOwotICAgICAgaWYgKGRvY3VtZW50LnhtbFRyYW5zZm9ybS5kaXNwbGF5TW9kZVswXS5jaGVja2VkKSAvL2Rpc3BsYXkgSFRNTAotICAgICAgewotICAgICAgICBkb2Mud3JpdGUodGFyZ2V0U3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgLy8gZGlzcGxheSBzb3VyY2UKLSAgICAgIHsKLSAgICAgICAgdmFyIGVzY1N0cmluZz1kb2N1bWVudC54c2xDb250cm9sLmVzY2FwZVN0cmluZyh0YXJnZXRTdHJpbmcpOwotICAgICAgICBkb2Mud3JpdGUoIjxQUkU+Iik7Ci0gICAgICAgIGRvYy53cml0ZShlc2NTdHJpbmcpOwotICAgICAgICBkb2Mud3JpdGUoIjwvUFJFPiIpOwotICAgICAgfQotICAgICAgZG9jLmNsb3NlKCk7ICAgIAotICAgIH0KLSAgCi0gICAgZnVuY3Rpb24gY2xlYXJGcmFtZXMoKQotICAgIHsKLSAgICAgIGRvY3VtZW50LnhzbENvbnRyb2wuZnJlZUNhY2hlKCk7Ci0gICAgICBmb3IgKGk9MTsgaTw0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgdmFyIGRvYz10b3AuZnJhbWVzW2ldLmRvY3VtZW50OwotICAgICAgICBkb2Mub3BlbigpOwotICAgICAgICBkb2MuY2xlYXIoKTsKLSAgICAgICAgZG9jLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIAotICAgIGZ1bmN0aW9uIHRyYW5zZm9ybSgpCi0gICAgeyAgCi0gICAgICBjbGVhckZyYW1lcygpOwotICAgICAgdmFyIHhtbFNvdXJjZT1kb2N1bWVudC54bWxUcmFuc2Zvcm0ueG1sU291cmNlTGlzdC5vcHRpb25zW2RvY3VtZW50LnhtbFRyYW5zZm9ybS54bWxTb3VyY2VMaXN0LnNlbGVjdGVkSW5kZXhdLnZhbHVlOwotICAgICAgZG9jdW1lbnQueHNsQ29udHJvbC5zZXREb2N1bWVudFVSTCh4bWxTb3VyY2UpOwotICAgICAgdmFyIHNvdXJjZVN0cmluZz1kb2N1bWVudC54c2xDb250cm9sLmdldFNvdXJjZVRyZWVBc1RleHQoKTsKLSAgICAgIHZhciBzdHlsZVN0cmluZz1kb2N1bWVudC54c2xDb250cm9sLmdldFN0eWxlVHJlZUFzVGV4dCgpOwotICAgICAgdmFyIHRhcmdldFN0cmluZz1kb2N1bWVudC54c2xDb250cm9sLmdldEh0bWxUZXh0KCk7ICAgICAgCi0gICAgICB3cml0ZVNvdXJjZShzb3VyY2VTdHJpbmcpOwotICAgICAgd3JpdGVTdHlsZXNoZWV0KHN0eWxlU3RyaW5nKTsKLSAgICAgIHdyaXRlVGFyZ2V0KHRhcmdldFN0cmluZyk7Ci0gICAgfQotICA8L3NjcmlwdD4KLSAgPGJvZHkgb25Mb2FkPSJjbGVhckZyYW1lcygpOyIgYmdjb2xvcj0iIzgwODA4MCIgdGV4dD0iI2ZmZmZmZiI+Ci0gICAgPGZvcm0gbmFtZT0ieG1sVHJhbnNmb3JtIiBhY3Rpb249IiIgbWV0aG9kPSJQT1NUIj4KLSAgICAgIDxoMj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIwIiB2c3BhY2U9IjAiIGFsaWduPSJsZWZ0IiBzcmM9InJhYmJpdHdob3JuLmpwZyI+Jm5ic3A7VHJhbnNmb3JtIFhNTCBEb2N1bWVudDwvaDI+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgd2lkdGg9IjUwIj48L3RkPgotICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxpPkRvY3VtZW50IHRvIHRyYW5zZm9ybTwvaT48L3RkPgotICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxpPkRpc3BsYXkgb3V0cHV0IGFzPC9pPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPgotICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJ4bWxTb3VyY2VMaXN0Ij4KLSAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ieGFsYW5BcHBsZXRzLnhtbCIgc2VsZWN0ZWQ+Jm5ic3A7eGFsYW5BcHBsZXRzLnhtbCZuYnNwOwotICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJmb28tczEueG1sIj4mbmJzcDtmb28tczEueG1sJm5ic3A7Ci0gICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iZGlzcGxheU1vZGUiIGNoZWNrZWQ+SFRNTCZuYnNwOyZuYnNwOwotICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJkaXNwbGF5TW9kZSI+SFRNTCBTb3VyY2UKLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIG5hbWU9InRyYW5zZm9ybUJ1dHRvbiIgdmFsdWU9IlRyYW5zZm9ybSIgCi0gICAgICAgICAgICBvbkNsaWNrPSJ0cmFuc2Zvcm0oKTsiPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvZm9ybT4KLSAgICA8IS0tIEJlIHN1cmUgeW91IGhhdmUgYXBwbGV0IGFyY2hpdmUgYXR0cmlidXRlIHNldAotICAgICAgICAgc28gdGhlIGFwcGxldCBjYW4gZmluZCB4YWxhbi5qYXIgYW5kIHhlcmNlcy5qYXIgLS0+ICAKLSAgICA8YXBwbGV0ICAKLSAgICAgIG5hbWU9InhzbENvbnRyb2wiCi0gICAgICBjb2RlPSJvcmcuYXBhY2hlLnhhbGFuLmNsaWVudC5YU0xUUHJvY2Vzc29yQXBwbGV0LmNsYXNzIgotICAgICAgYXJjaGl2ZT0iLi4vLi4vYmluL3hhbGFuLmphciwuLi8uLi9iaW4veGVyY2VzLmphciIKLSAgICAgIGhlaWdodD0iMCIKLSAgICAgIHdpZHRoIjAiPgotICAgICAgPHBhcmFtIG5hbWU9ImRvY3VtZW50VVJMIiB2YWx1ZT0ieGFsYW5BcHBsZXRzLnhtbCIvPiAgPCEtLWRlZmF1bHQgc2V0dGluZy0tPgotICAgICAgPHBhcmFtIG5hbWU9InN0eWxlVVJMIiB2YWx1ZT0iczFUb0hUTUwueHNsIi8+IDwhLS1kb2Vzbid0IGNoYW5nZS0tPgotICAgIDwvYXBwbGV0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9mb28tczEueG1sIGIvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvZm9vLXMxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjZTAzMy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9mb28tczEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxzMSB0aXRsZT0iczEgZm9vIj4KLSAgPHMyIHRpdGxlPSJGb28iPgotICAgIDxwPkhlbGxvPC9wPgotICA8L3MyPgotPC9zMT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9nZXQtdG9kby1saXN0Lmh0bWwgYi9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9nZXQtdG9kby1saXN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZDkwNzMuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvZ2V0LXRvZG8tbGlzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotICA8aGVhZD4KLQk8dGl0bGU+WGFsYW4tSmF2YSAyICJ0byBkbyIgbGlzdDwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0gCi0gICAgZnVuY3Rpb24gdHJhbnNmb3JtKCkKLSAgICB7IAotICAgICAgdmFyIHRvZG9saXN0ID0geHNsQ29udHJvbC5nZXRIdG1sVGV4dCgpOwotICAgICAgZG9jdW1lbnQud3JpdGUodG9kb2xpc3QpOwotICAgIH0KLSAgPC9zY3JpcHQ+Ci0gIDxib2R5IG9uTG9hZD0idHJhbnNmb3JtKCk7Ij4KLSAgICA8YXBwbGV0ICAKLSAgICAgIG5hbWU9InhzbENvbnRyb2wiCi0gICAgICBjb2RlPSJvcmcuYXBhY2hlLnhhbGFuLmNsaWVudC5YU0xUUHJvY2Vzc29yQXBwbGV0LmNsYXNzIgotICAgICAgYXJjaGl2ZT0iLi4vLi4vYmluL3hhbGFuLmphciwuLi8uLi9iaW4veGVyY2VzLmphciIKLSAgICAgIGhlaWdodD0iMCIKLSAgICAgIHdpZHRoPSIwIj4KLSAgICAgIDxwYXJhbSBuYW1lPSJkb2N1bWVudFVSTCIgdmFsdWU9Ii4uLy4uL3RvZG8ueG1sIi8+IAotICAgICAgPHBhcmFtIG5hbWU9InN0eWxlVVJMIiB2YWx1ZT0iLi4vLi4vdG9kby54c2wiLz4KLSAgICA8L2FwcGxldD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvbHRzMzYxMWJlYWMuanBnIGIvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvbHRzMzYxMWJlYWMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjQ5MTQ5Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML2x0czM2MTFiZWFjLmpwZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML3JhYmJpdHdob3JuLmpwZyBiL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML3JhYmJpdHdob3JuLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0NGEzOC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9yYWJiaXR3aG9ybi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9zMVRvSFRNTC54c2wgYi9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC9zMVRvSFRNTC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MDVlNmYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvczFUb0hUTUwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiLz4KLSAgICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzMSI+Ci0gICAgPGh0bWw+Ci0gICAgICA8aGVhZD48dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPjwvdGl0bGU+PC9oZWFkPgotICAgICAgPGJvZHkgIGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InMyIi8+Ci0gICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzMiI+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjMDA2Njk5Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iKzEiPgotICAgICAgICAgICAgPGI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPjwvYj4KLSAgICAgICAgICA8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDxici8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InAiPgotICAgIDxwPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L3A+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im5vdGUiPgotICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHdpZHRoPSIyMCI+JiMxNjA7PC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiM4OGFhY2MiPgotICAgICAgICAgIDxmb250IHNpemU9Ii0xIj48aT5OT1RFOiA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9pPjwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSIyMCI+JiMxNjA7PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ1bCI+Ci0gICAgPHVsPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L3VsPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJvbCI+Ci0gICAgPG9sPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L29sPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Imdsb3NzIj4KLSAgICA8ZGw+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvZGw+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAgPCEtLSA8dGVybT4gY29udGFpbnMgYSBzaW5nbGUtd29yZCwgbXVsdGktd29yZCBvciBzeW1ib2xpYyAKLSAgICAgICBkZXNpZ25hdGlvbiB3aGljaCBpcyByZWdhcmRlZCBhcyBhIHRlY2huaWNhbCB0ZXJtLiAtLT4gCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlcm0iPgotICAgIDxkZm4+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvZGZuPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJsYWJlbCIgcHJpb3JpdHk9IjEiPgotICAgIDxkdD48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9kdD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaXRlbSIgcHJpb3JpdHk9IjIiPgotICAgIDxkZD4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L2RkPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0YWJsZSI+Ci0gICAgPHAgYWxpZ249ImNlbnRlciI+PHRhYmxlIGJvcmRlcj0iMCI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGFibGU+PC9wPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzb3VyY2UiPgotICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHdpZHRoPSIyMCI+JiMxNjA7PC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiM4OGFhY2MiPjxwcmU+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvcHJlPjwvdGQ+Ci0gICAgICAgIDx0ZCB3aWR0aD0iMjAiPiYjMTYwOzwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxpIj4KLSAgICA8bGk+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvbGk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRyIj4KLSAgICA8dHI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdHI+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRoIj4KLSAgICA8dGQgYmdjb2xvcj0iIzAwNjY5OSIgYWxpZ249ImNlbnRlciI+Ci0gICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiI+PGI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvYj48L2ZvbnQ+Ci0gICAgPC90ZD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGQiPgotICAgIDx0ZCBiZ2NvbG9yPSIjODhhYWNjIj48eHNsOmFwcGx5LXRlbXBsYXRlcy8+JiMxNjA7PC90ZD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idG4iPgotICAgIDx0ZD4mIzE2MDs8L3RkPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJlbSI+Ci0gICAgPGI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvYj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icmVmIj4KLSAgICA8aT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9pPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb2RlIj4KLSAgICA8Y29kZT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9jb2RlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJiciI+Ci0gICAgPGJyLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJqdW1wIj4KLSAgICA8YSBocmVmPSJ7QGhyZWZ9IiB0YXJnZXQ9Il90b3AiPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+Ci0gIDwveHNsOnRlbXBsYXRlPiAgCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYW5jaG9yIj4KLSAgICA8YSBuYW1lPSJ7QGlkfSI+IDwvYT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaW1nIj4KLSAgICA8aW1nIHNyYz0ie0BzcmN9IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCIgdnNwYWNlPSI0IiBoc3BhY2U9IjQiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwcGxldFhNTHRvSFRNTC90YXJnZXQuaHRtbCBiL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML3RhcmdldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTg1NDVjLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML3RhcmdldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci0gIDxoZWFkPgotICAgIDx0aXRsZT5VbnRpdGxlZDwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPGJvZHk+Jm5ic3A7PC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwveGFsYW5BcHBsZXRzLnhtbCBiL3NhbXBsZXMvQXBwbGV0WE1MdG9IVE1ML3hhbGFuQXBwbGV0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODZmYzEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwveGFsYW5BcHBsZXRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTxzMSB0aXRsZT0iQWJvdXQgWGFsYW4gQXBwbGV0cyI+Ci0gIDxzMiB0aXRsZT0iVHJhbnNmb3JtaW5nIFhNTCB0byBIVE1MIGluIGFuIEFwcGxldCI+Ci0gICAgPG9sPiAKLSAgICAgIDxsaT4KLSAgICAgICAgPHA+SW5jbHVkZQotICAgICAgICBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuY2xpZW50LlhTTFRQcm9jZXNzb3JBcHBsZXQKLSAgICAgICAgaW4gYW4gSFRNTCBjbGllbnQuPC9wPgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgPHA+U3BlY2lmeSB0aGUgWE1MIHNvdXJjZSBkb2N1bWVudCBhbmQgWFNMCi0gICAgICAgIHN0eWxlc2hlZXQuPC9wPgotICAgICAgICA8cD5Zb3UgY2FuIHVzZSB0aGUgRG9jdW1lbnRVUkwgYW5kIFN0eWxlVVJMIFBBUkFNIHRhZ3MgCi0gICAgICAgIG9yIHRoZSBzZXREb2N1bWVudFVSTCgpIGFuZCBzZXRTdHlsZVVSTCgpIG1ldGhvZHMuIAotICAgICAgICBJZiB0aGUgWE1MIGRvY3VtZW50IGNvbnRhaW5zIGEgc3R5bGVzaGVldCBQcm9jZXNzaW5nCi0gICAgICAgIEluc3RydWN0aW9uIChQSSksIHlvdSBkbyBub3QgbmVlZCB0byBzcGVjaWZ5IGFuIFhTTAotICAgICAgICBzdHlsZXNoZWV0LjwvcD4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIDxwPkNhbGwgdGhlIGdldEh0bWxUZXh0KCkgbWV0aG9kLCB3aGljaCBwZXJmb3JtcwotICAgICAgICB0aGUgdHJhbnNmb3JtYXRpb24gYW5kIHJldHVybnMgdGhlIG5ldyBkb2N1bWVudCBhcyBhCi0gICAgICAgIFN0cmluZy48L3A+Ci0gICAgICA8L2xpPgotICAgIDwvb2w+Ci0gIDwvczI+Ci08L3MxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBwbHlYUGF0aC9BcHBseVhQYXRoLmphdmEgYi9zYW1wbGVzL0FwcGx5WFBhdGgvQXBwbHlYUGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTYzNWYyLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBwbHlYUGF0aC9BcHBseVhQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0vLyBUaGlzIGZpbGUgdXNlcyA0IHNwYWNlIGluZGVudHMsIG5vIHRhYnMuCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkRPTVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQVBJOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlRyZWVXYWxrZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuRE9NQnVpbGRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLy8gSW1wb3J0ZWQgSkFWQSBBUEkgZm9yIFhNTCBQYXJzaW5nIDEuMCBjbGFzc2VzCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsgCi0KLS8vIEltcG9ydGVkIFNlcmlhbGl6ZXIgY2xhc3NlcwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLio7Ci0KLS8qKgotICogIFZlcnkgYmFzaWMgdXRpbGl0eSBmb3IgYXBwbHlpbmcgYW4gWFBhdGggZXB4cmVzc2lvbiB0byBhbiB4bWwgZmlsZSBhbmQgcHJpbnRpbmcgaW5mb3JtYXRpb24KLSAvICBhYm91dCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBYUGF0aCBvYmplY3QgYW5kIHRoZSBub2RlcyBpdCBmaW5kcy4KLSAqICBUYWtlcyAyIGFyZ3VtZW50czoKLSAqICAgICAoMSkgYW4geG1sIGZpbGVuYW1lCi0gKiAgICAgKDIpIGFuIFhQYXRoIGV4cHJlc3Npb24gdG8gYXBwbHkgdG8gdGhlIGZpbGUKLSAqICBFeGFtcGxlczoKLSAqICAgICBqYXZhIEFwcGx5WFBhdGggZm9vLnhtbCAvCi0gKiAgICAgamF2YSBBcHBseVhQYXRoIGZvby54bWwgL2RvYy9uYW1lWzFdL0BsYXN0Ci0gKiBAc2VlIFhQYXRoQVBJCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBseVhQYXRoCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIHhwYXRoID0gbnVsbDsKLQotICAvKiogUHJvY2VzcyBpbnB1dCBhcmdzIGFuZCBleGVjdXRlIHRoZSBYUGF0aC4gICovCi0gIHB1YmxpYyB2b2lkIGRvTWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGZpbGVuYW1lID0gYXJnc1swXTsKLSAgICB4cGF0aCA9IGFyZ3NbMV07Ci0KLSAgICBpZiAoKGZpbGVuYW1lICE9IG51bGwpICYmIChmaWxlbmFtZS5sZW5ndGgoKSA+IDApCi0gICAgICAgICYmICh4cGF0aCAhPSBudWxsKSAmJiAoeHBhdGgubGVuZ3RoKCkgPiAwKSkKLSAgICB7Ci0gICAgICAvLyBUZWxsIHRoYXQgd2UncmUgbG9hZGluZyBjbGFzc2VzIGFuZCBwYXJzaW5nLCBzbyB0aGUgdGltZSBpdCAKLSAgICAgIC8vIHRha2VzIHRvIGRvIHRoaXMgZG9lc24ndCBnZXQgY29uZnVzZWQgd2l0aCB0aGUgdGltZSB0byBkbyAKLSAgICAgIC8vIHRoZSBhY3R1YWwgcXVlcnkgYW5kIHNlcmlhbGl6YXRpb24uCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRpbmcgY2xhc3NlcywgcGFyc2luZyAiK2ZpbGVuYW1lKyIsIGFuZCBzZXR0aW5nIHVwIHNlcmlhbGl6ZXIiKTsKLSAgICAgIAotICAgICAgLy8gU2V0IHVwIGEgRE9NIHRyZWUgdG8gcXVlcnkuCi0gICAgICBJbnB1dFNvdXJjZSBpbiA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKSk7Ci0gICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgRG9jdW1lbnQgZG9jID0gZGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UoaW4pOwotICAgICAgCi0gICAgICAvLyBTZXQgdXAgYW4gaWRlbnRpdHkgdHJhbnNmb3JtZXIgdG8gdXNlIGFzIHNlcmlhbGl6ZXIuCi0gICAgICBUcmFuc2Zvcm1lciBzZXJpYWxpemVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgInllcyIpOwotCi0gICAgICAvLyBVc2UgdGhlIHNpbXBsZSBYUGF0aCBBUEkgdG8gc2VsZWN0IGEgbm9kZUl0ZXJhdG9yLgotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJRdWVyeWluZyBET00gdXNpbmcgIit4cGF0aCk7Ci0gICAgICBOb2RlSXRlcmF0b3IgbmwgPSBYUGF0aEFQSS5zZWxlY3ROb2RlSXRlcmF0b3IoZG9jLCB4cGF0aCk7Ci0KLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgZm91bmQgbm9kZXMgdG8gU3lzdGVtLm91dC4KLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPG91dHB1dD4iKTsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgTm9kZSBuOwotICAgICAgd2hpbGUgKChuID0gbmwubmV4dE5vZGUoKSkhPSBudWxsKQotICAgICAgeyAgICAgICAgIAotICAgICAgICBzZXJpYWxpemVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKG4pLCBuZXcgU3RyZWFtUmVzdWx0KFN5c3RlbS5vdXQpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICB9Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjwvb3V0cHV0PiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCYWQgaW5wdXQgYXJnczogIiArIGZpbGVuYW1lICsgIiwgIiArIHhwYXRoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKiBNYWluIG1ldGhvZCB0byBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykKLSAgICB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoYXJncy5sZW5ndGggIT0gMikKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImphdmEgQXBwbHlYUGF0aCBmaWxlbmFtZS54bWwgeHBhdGhcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJSZWFkcyBmaWxlbmFtZS54bWwgYW5kIGFwcGxpZXMgdGhlIHhwYXRoOyBwcmludHMgdGhlIG5vZGVsaXN0IGZvdW5kLiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgICAgCi0gICAgQXBwbHlYUGF0aCBhcHAgPSBuZXcgQXBwbHlYUGF0aCgpOwotICAgIGFwcC5kb01haW4oYXJncyk7Ci0gIH0JCi0gIAotfSAvLyBlbmQgb2YgY2xhc3MgQXBwbHlYUGF0aAotCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwcGx5WFBhdGgvZm9vLnhtbCBiL3NhbXBsZXMvQXBwbHlYUGF0aC9mb28ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDIzNzA4Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBwbHlYUGF0aC9mb28ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08ZG9jPgotICA8bmFtZSBmaXJzdD0iRGF2aWQiIGxhc3Q9Ik1hcnN0b24iLz4KLSAgPG5hbWUgZmlyc3Q9IkRhdmlkIiBsYXN0PSJCZXJ0b25pIi8+Ci0gIDxuYW1lIGZpcnN0PSJEb25hbGQiIGxhc3Q9Ikxlc2xpZSIvPgotICA8bmFtZSBmaXJzdD0iRW1pbHkiIGxhc3Q9IkZhcm1lciIvPgotICA8bmFtZSBmaXJzdD0iSm9zZXBoIiBsYXN0PSJLZXNzZWxtYW4iLz4KLSAgPG5hbWUgZmlyc3Q9Ik15cmlhbSIgbGFzdD0iTWlkeSIvPgotICA8bmFtZSBmaXJzdD0iUGF1bCIgbGFzdD0iRGljayIvPgotICA8bmFtZSBmaXJzdD0iU3RlcGhlbiIgbGFzdD0iQXVyaWVtbWEiLz4KLSAgPG5hbWUgZmlyc3Q9IlNjb3R0IiBsYXN0PSJCb2FnIi8+Ci0gIDxuYW1lIGZpcnN0PSJTaGFuZSIgbGFzdD0iQ3VyY3VydSIvPgotPC9kb2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcHBseVhQYXRoL3JlYWRtZS5odG1sIGIvc2FtcGxlcy9BcHBseVhQYXRoL3JlYWRtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg5MzZmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBwbHlYUGF0aC9yZWFkbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPlhhbGFuIFNhbXBsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDI+WGFsYW4gU2FtcGxlczwvaDI+Ci08cD5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNhbXBsZXMgKHdoYXQgdGhleSBpbGx1c3RyYXRlIGFuZCBob3cgdG8gcnVuIHRoZW0pLCBzZWUgPGEgaHJlZj0iLi4vLi4vZG9jcy9zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+LjwvcD4KLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0RPTTJET00vRE9NMkRPTS5qYXZhIGIvc2FtcGxlcy9ET00yRE9NL0RPTTJET00uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThjMzI2OS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0RPTTJET00vRE9NMkRPTS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vLyBJbXBvcnRlZCBUcmFYIGNsYXNzZXMKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0OwotCi0vLyBJbXBvcnRlZCBqYXZhLmlvIGNsYXNzZXMKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0vLyBJbXBvcnRlZCBTQVggY2xhc3NlcwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLy8gSW1wb3J0ZWQgRE9NIGNsYXNzZXMKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vLyBJbXBvcnRlZCBTZXJpYWxpemVyIGNsYXNzZXMKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZS5TZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuT3V0cHV0UHJvcGVydGllczsKLQotLy8gSW1wb3J0ZWQgSkFWQSBBUEkgZm9yIFhNTCBQYXJzaW5nIGNsYXNzZXMKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOyAKLQotICAvKioKLSAgICogU2hvdyBob3cgdG8gdHJhbnNmb3JtIGEgRE9NIHRyZWUgaW50byBhbm90aGVyIERPTSB0cmVlLiAgCi0gICAqIFRoaXMgdXNlcyB0aGUgamF2YXgueG1sLnBhcnNlcnMgdG8gcGFyc2UgYm90aCBhbiBYU0wgZmlsZSAKLSAgICogYW5kIHRoZSBYTUwgZmlsZSBpbnRvIGEgRE9NLCBhbmQgY3JlYXRlIGFuIG91dHB1dCBET00uCi0gICAqLwotcHVibGljIGNsYXNzIERPTTJET00KLXsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sCi0gICAgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgeyAgICAKLQkgIFRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgaWYodEZhY3RvcnkuZ2V0RmVhdHVyZShET01Tb3VyY2UuRkVBVFVSRSkgJiYgdEZhY3RvcnkuZ2V0RmVhdHVyZShET01SZXN1bHQuRkVBVFVSRSkpCi0gICAgewotICAgICAgLy9JbnN0YW50aWF0ZSBhIERvY3VtZW50QnVpbGRlckZhY3RvcnkuCi0gICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAvLyBBbmQgc2V0TmFtZXNwYWNlQXdhcmUsIHdoaWNoIGlzIHJlcXVpcmVkIHdoZW4gcGFyc2luZyB4c2wgZmlsZXMKLSAgICAgIGRGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgCi0gICAgICAvL1VzZSB0aGUgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSB0byBjcmVhdGUgYSBEb2N1bWVudEJ1aWxkZXIuCi0gICAgICBEb2N1bWVudEJ1aWxkZXIgZEJ1aWxkZXIgPSBkRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgIAotICAgICAgLy9Vc2UgdGhlIERvY3VtZW50QnVpbGRlciB0byBwYXJzZSB0aGUgWFNMIHN0eWxlc2hlZXQuCi0gICAgICBEb2N1bWVudCB4c2xEb2MgPSBkQnVpbGRlci5wYXJzZSgiYmlyZHMueHNsIik7Ci0KLSAgICAgIC8vIFVzZSB0aGUgRE9NIERvY3VtZW50IHRvIGRlZmluZSBhIERPTVNvdXJjZSBvYmplY3QuCi0gICAgICBET01Tb3VyY2UgeHNsRG9tU291cmNlID0gbmV3IERPTVNvdXJjZSh4c2xEb2MpOwotCi0gICAgICAvLyBTZXQgdGhlIHN5c3RlbUlkOiBub3RlIHRoaXMgaXMgYWN0dWFsbHkgYSBVUkwsIG5vdCBhIGxvY2FsIGZpbGVuYW1lCi0gICAgICB4c2xEb21Tb3VyY2Uuc2V0U3lzdGVtSWQoImJpcmRzLnhzbCIpOwotCi0gICAgICAvLyBQcm9jZXNzIHRoZSBzdHlsZXNoZWV0IERPTVNvdXJjZSBhbmQgZ2VuZXJhdGUgYSBUcmFuc2Zvcm1lci4KLSAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsRG9tU291cmNlKTsKLQotICAgICAgLy9Vc2UgdGhlIERvY3VtZW50QnVpbGRlciB0byBwYXJzZSB0aGUgWE1MIGlucHV0LgotICAgICAgRG9jdW1lbnQgeG1sRG9jID0gZEJ1aWxkZXIucGFyc2UoImJpcmRzLnhtbCIpOwotICAgICAgCi0gICAgICAvLyBVc2UgdGhlIERPTSBEb2N1bWVudCB0byBkZWZpbmUgYSBET01Tb3VyY2Ugb2JqZWN0LgotICAgICAgRE9NU291cmNlIHhtbERvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoeG1sRG9jKTsKLSAgICAgIAotICAgICAgLy8gU2V0IHRoZSBiYXNlIFVSSSBmb3IgdGhlIERPTVNvdXJjZSBzbyBhbnkgcmVsYXRpdmUgVVJJcyBpdCBjb250YWlucyBjYW4KLSAgICAgIC8vIGJlIHJlc29sdmVkLgotICAgICAgeG1sRG9tU291cmNlLnNldFN5c3RlbUlkKCJiaXJkcy54bWwiKTsKLSAgICAgIAotICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IERPTVJlc3VsdCBmb3IgdGhlIFJlc3VsdC4KLSAgICAgIERPTVJlc3VsdCBkb21SZXN1bHQgPSBuZXcgRE9NUmVzdWx0KCk7Ci0gIAotICAJICAvLyBQZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbiwgcGxhY2luZyB0aGUgb3V0cHV0IGluIHRoZSBET01SZXN1bHQuCi0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oeG1sRG9tU291cmNlLCBkb21SZXN1bHQpOwotCSAgCi0JICAgIC8vSW5zdGFudGlhdGUgYW4gWGFsYW4gWE1MIHNlcmlhbGl6ZXIgYW5kIHVzZSBpdCB0byBzZXJpYWxpemUgdGhlIG91dHB1dCBET00gdG8gU3lzdGVtLm91dAotCSAgICAvLyB1c2luZyBhIGRlZmF1bHQgb3V0cHV0IGZvcm1hdC4KLSAgICAgIFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IFNlcmlhbGl6ZXJGYWN0b3J5LmdldFNlcmlhbGl6ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE91dHB1dFByb3BlcnRpZXMuZ2V0RGVmYXVsdE1ldGhvZFByb3BlcnRpZXMoInhtbCIpKTsKLSAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0U3RyZWFtKFN5c3RlbS5vdXQpOwotICAgICAgc2VyaWFsaXplci5hc0RPTVNlcmlhbGl6ZXIoKS5zZXJpYWxpemUoZG9tUmVzdWx0LmdldE5vZGUoKSk7Ci0JfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJET00gbm9kZSBwcm9jZXNzaW5nIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL0RPTTJET00vYmlyZHMueG1sIGIvc2FtcGxlcy9ET00yRE9NL2JpcmRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyNzY0Mi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0RPTTJET00vYmlyZHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Q2xhc3M+Ci08T3JkZXIgTmFtZT0iVElOQU1JRk9STUVTIj4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJUSU5BTUlEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJUaW5hbXVzIG1ham9yIj4gIEdyZWF0IFRpbmFtb3UuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJOb3Rob2NlcmN1cyI+SGlnaGxhbmQgVGluYW1vdS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkNyeXB0dXJlbGx1cyBzb3VpIj5MaXR0bGUgVGluYW1vdS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkNyeXB0dXJlbGx1cyBjaW5uYW1vbWV1cyI+VGhpY2tldCBUaW5hbW91LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQ3J5cHR1cmVsbHVzIGJvdWNhcmRpIj5TbGF0eS1icmVhc3RlZCBUaW5hbW91LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQ3J5cHR1cmVsbHVzIGtlcnJpYWUiPkNob2NvIFRpbmFtb3UuPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICA8L09yZGVyPgotPE9yZGVyIE5hbWU9IkdBVklJRk9STUVTIj4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJHQVZJSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkdhdmlhIHN0ZWxsYXRhIj5SZWQtdGhyb2F0ZWQgTG9vbi48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkdhdmlhIGFyY3RpY2EiPkFyY3RpYyBMb29uLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iR2F2aWEgcGFjaWZpY2EiPlBhY2lmaWMgTG9vbi48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkdhdmlhIGltbWVyIj5Db21tb24gTG9vbi48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkdhdmlhIGFkYW1zaWkiPlllbGxvdy1iaWxsZWQgTG9vbi48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgIDwvT3JkZXI+Ci0KLQotPE9yZGVyIE5hbWU9IlBPRElDSVBFRElGT1JNRVMiPgotICAgICAgICA8RmFtaWx5IE5hbWU9IlBPRElDSVBFRElEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJUYWNoeWJhcHR1cyBkb21pbmljdXMiPkxlYXN0IEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUG9kaWx5bWJ1cyBwb2RpY2VwcyI+UGllZC1iaWxsZWQgR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSIiPkF0aXRsYW4gR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSIiPkhvcm5lZCBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IiI+UmVkLW5lY2tlZCBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IiI+RWFyZWQgR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSIiPldlc3Rlcm4gR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSIiPkNsYXJrJ3MgR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSIiLz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgPC9PcmRlcj4KLQotCi08T3JkZXIgTmFtZT0iUFJPQ0VMTEFSSUlGT1JNRVMiPgotICAgICAgICA8RmFtaWx5IE5hbWU9IkRJT01FREVJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iVGhhbGFzc2FyY2hlIGNobG9yb3JoeW5jaG9zIj5ZZWxsb3ctbm9zZWQgQWxiYXRyb3NzLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlRoYWxhc3NhcmNoZSBjYXV0YSI+U2h5IEFsYmF0cm9zcy4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJUaGFsYXNzYXJjaGUgbWVsYW5vcGhyaXMiPkJsYWNrLWJyb3dlZCBBbGJhdHJvc3MuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhvZWJldHJpYSBwYWxwZWJyYXRhIj5MaWdodC1tYW50bGVkIEFsYmF0cm9zcy4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJEaW9tZWRlYSBleHVsYW5zIj5XYW5kZXJpbmcgQWxiYXRyb3NzLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBob2ViYXN0cmlhIGltbXV0YWJpbGlzIj5MYXlzYW4gQWxiYXRyb3NzLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhvZWJhc3RyaWEgbmlncmlwZXMiPkJsYWNrLWZvb3RlZCBBbGJhdHJvc3MuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaG9lYmFzdHJpYSBhbGJhdHJ1cyI+U2hvcnQtdGFpbGVkIEFsYmF0cm9zcy4gKE4pPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJQUk9DRUxMQVJJSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkZ1bG1hcnVzIGdsYWNpYWxpcyI+Tm9ydGhlcm4gRnVsbWFyLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBuZWdsZWN0YSI+S2VybWFkZWMgUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgYXJtaW5qb25pYW5hIj5IZXJhbGQgUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgdWx0aW1hIj5NdXJwaHkncyBQZXRyZWwuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBpbmV4cGVjdGF0YSI+TW90dGxlZCBQZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBjYWhvdyI+QmVybXVkYSBQZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGhhc2l0YXRhIj5CbGFjay1jYXBwZWQgUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBleHRlcm5hIj5KdWFuIEZlcm5hbmRleiBQZXRyZWwuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBwaGFlb3B5Z2lhIj5EYXJrLXJ1bXBlZCBQZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGNlcnZpY2FsaXMiPldoaXRlLW5lY2tlZCBQZXRyZWwuIChIKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBoeXBvbGV1Y2EiPkJvbmluIFBldHJlbC4gKEgpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIG5pZ3JpcGVubmlzIj5CbGFjay13aW5nZWQgUGV0cmVsLiAoSCwgQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgY29va2lpIj5Db29rJ3MgUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgbG9uZ2lyb3N0cmlzIj5TdGVqbmVnZXIncyBQZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQnVsd2VyaWEgYnVsd2VyaWkiPkJ1bHdlcidzIFBldHJlbC4gKEgpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJCdWx3ZXJpYSBmYWxsYXgiPkpvdWFuaW4ncyBQZXRyZWwuIChILCBBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHJvY2VsbGFyaWEgcGFya2luc29uaSI+UGFya2luc29uJ3MgUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkNhbG9uZWN0cmlzIGxldWNvbWVsYXMiPlN0cmVha2VkIFNoZWFyd2F0ZXIuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQ2Fsb25lY3RyaXMgZGlvbWVkZWEiPkNvcnkncyBTaGVhcndhdGVyLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGNyZWF0b3B1cyI+UGluay1mb290ZWQgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBjYXJuZWlwZXMiPkZsZXNoLWZvb3RlZCBTaGVhcndhdGVyLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGdyYXZpcyI+R3JlYXRlciBTaGVhcndhdGVyLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIHBhY2lmaWN1cyI+V2VkZ2UtdGFpbGVkIFNoZWFyd2F0ZXIuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBidWxsZXJpIj5CdWxsZXIncyBTaGVhcndhdGVyLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGdyaXNldXMiPlNvb3R5IFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgdGVudWlyb3N0cmlzIj5TaG9ydC10YWlsZWQgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBuYXRpdml0YXRpcyI+Q2hyaXN0bWFzIFNoZWFyd2F0ZXIuIChIKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgcHVmZmludXMiPk1hbnggU2hlYXJ3YXRlci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGF1cmljdWxhcmlzIj5Ub3duc2VuZCdzIFNoZWFyd2F0ZXIuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBvcGlzdGhvbWVsYXMiPkJsYWNrLXZlbnRlZCBTaGVhcndhdGVyLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgbGhlcm1pbmllcmkiPkF1ZHVib24ncyBTaGVhcndhdGVyLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgYXNzaW1pbGlzIj5MaXR0bGUgU2hlYXJ3YXRlci4gKEEpPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJIWURST0JBVElEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbml0ZXMgb2NlYW5pY3VzIj5XaWxzb24ncyBTdG9ybS1QZXRyZWwuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGVsYWdvZHJvbWEgbWFyaW5hIj5XaGl0ZS1mYWNlZCBTdG9ybS1QZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iSHlkcm9iYXRlcyBwZWxhZ2ljdXMiPkV1cm9wZWFuIFN0b3JtLVBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBmdXJjYXRhIj5Gb3JrLXRhaWxlZCBTdG9ybS1QZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBsZXVjb3Job2EiPkxlYWNoJ3MgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgaG9tb2Nocm9hIj5Bc2h5IFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIGNhc3RybyI+QmFuZC1ydW1wZWQgU3Rvcm0tUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIHRldGh5cyI+V2VkZ2UtcnVtcGVkIFN0b3JtLVBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBtZWxhbmlhIj5CbGFjayBTdG9ybS1QZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBtYWNyb2RhY3R5bGEiPkd1YWRhbHVwZSBTdG9ybS1QZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBtYXJraGFtaSI+TWFya2hhbSdzIFN0b3JtLVBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSB0cmlzdHJhbWkiPlRyaXN0cmFtJ3MgU3Rvcm0tUGV0cmVsLiAoSCk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIG1pY3Jvc29tYSI+TGVhc3QgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgPC9PcmRlcj4KLQotPE9yZGVyIE5hbWU9IlBFTEVDQU5JRk9STUVTIj4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJQSEFFVEhPTlRJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhZXRob24gbGVwdHVydXMiPldoaXRlLXRhaWxlZCBUcm9waWNiaXJkLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhZXRob24gYWV0aGVyZXVzIj5SZWQtYmlsbGVkIFRyb3BpY2JpcmQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFldGhvbiBydWJyaWNhdWRhIj5SZWQtdGFpbGVkIFRyb3BpY2JpcmQuPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJTVUxJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iU3VsYSBkYWN0eWxhdHJhIj5NYXNrZWQgQm9vYnkuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJTdWxhIG5lYm91eGlpIj5CbHVlLWZvb3RlZCBCb29ieS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlN1bGEgdmFyaWVnYXRhIj5QZXJ1dmlhbiBCb29ieS4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJTdWxhIGxldWNvZ2FzdGVyIj5Ccm93biBCb29ieS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlN1bGEgc3VsYSI+UmVkLWZvb3RlZCBCb29ieS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik1vcnVzIGJhc3NhbnVzIj5Ob3J0aGVybiBHYW5uZXQuPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJQRUxFQ0FOSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBlbGVjYW51cyBlcnl0aHJvcmh5bmNob3MiPkFtZXJpY2FuIFdoaXRlIFBlbGljYW4uPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQZWxlY2FudXMgb2NjaWRlbnRhbGlzIj5Ccm93biBQZWxpY2FuLjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iUEhBTEFDUk9DT1JBQ0lEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IHBlbmljaWxsYXR1cyI+QnJhbmR0J3MgQ29ybW9yYW50LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhbGFjcm9jb3JheCBicmFzaWxpYW51cyI+TmVvdHJvcGljIENvcm1vcmFudC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggYXVyaXR1cyI+RG91YmxlLWNyZXN0ZWQgQ29ybW9yYW50LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhbGFjcm9jb3JheCBjYXJibyI+R3JlYXQgQ29ybW9yYW50LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhbGFjcm9jb3JheCB1cmlsZSI+UmVkLWZhY2VkIENvcm1vcmFudC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggcGVsYWdpY3VzIj5QZWxhZ2ljIENvcm1vcmFudC48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IkFOSElOR0lEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJBbmhpbmdhIGFuaGluZ2EiPkFuaGluZ2EuPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJGUkVHQVRJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iRnJlZ2F0YSBtYWduaWZpY2VucyI+TWFnbmlmaWNlbnQgRnJpZ2F0ZWJpcmQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJGcmVnYXRhIG1pbm9yIj5HcmVhdCBGcmlnYXRlYmlyZC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkZyZWdhdGEgYXJpZWwiPkxlc3NlciBGcmlnYXRlYmlyZC4gKEEpPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICA8L09yZGVyPgotPC9DbGFzcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvRE9NMkRPTS9iaXJkcy54c2wgYi9zYW1wbGVzL0RPTTJET00vYmlyZHMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDZmOGUxLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvRE9NMkRPTS9iaXJkcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiBpbmRlbnQ9InllcyIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJDbGFzcyI+Ci08QmlyZEluZm8+Ci0JPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJPcmRlciIvPgotPC9CaXJkSW5mbz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJPcmRlciI+Ci1PcmRlciBpczogIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJATmFtZSIvPgotCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iRmFtaWx5Ii8+PHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJGYW1pbHkiPgotCUZhbWlseSBpczogIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJATmFtZSIvPgotCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iU3BlY2llcyB8IFN1YkZhbWlseSB8IHRleHQoKSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IlN1YkZhbWlseSI+Ci0JCVN1YkZhbWlseSBpcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQE5hbWUiLz4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IlNwZWNpZXMgfCB0ZXh0KCkiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJTcGVjaWVzIj4KLQk8eHNsOmNob29zZT4KLQkgIDx4c2w6d2hlbiB0ZXN0PSJuYW1lKC4uKT0nU3ViRmFtaWx5JyI+Ci0JCTx4c2w6dGV4dD4JPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFNjaWVudGlmaWNfTmFtZSIvPgotCSAgPC94c2w6d2hlbj4KLQkgIDx4c2w6b3RoZXJ3aXNlPgotCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFNjaWVudGlmaWNfTmFtZSIvPgotCSAgPC94c2w6b3RoZXJ3aXNlPgotCTwveHNsOmNob29zZT4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9ET00yRE9NL3JlYWRtZS5odG1sIGIvc2FtcGxlcy9ET00yRE9NL3JlYWRtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg5MzZmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvRE9NMkRPTS9yZWFkbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPlhhbGFuIFNhbXBsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDI+WGFsYW4gU2FtcGxlczwvaDI+Ci08cD5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNhbXBsZXMgKHdoYXQgdGhleSBpbGx1c3RyYXRlIGFuZCBob3cgdG8gcnVuIHRoZW0pLCBzZWUgPGEgaHJlZj0iLi4vLi4vZG9jcy9zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+LjwvcD4KLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1BpcGUvUGlwZS5qYXZhIGIvc2FtcGxlcy9QaXBlL1BpcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlMjVkYS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1BpcGUvUGlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vLyBJbXBvcnRlZCBUcmFYIGNsYXNzZXMKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhUcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0OwotCi0vLyBJbXBvcnRlZCBTQVggY2xhc3NlcwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5QYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5QYXJzZXJBZGFwdGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi0vLyBJbXBvcnRlZCBET00gY2xhc3NlcwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIEltcG9ydGVkIFNlcmlhbGl6ZXIgY2xhc3NlcwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLlNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuT3V0cHV0UHJvcGVydGllczsKLQotLy8gSW1wb3J0ZWQgSkFWQSBBUEkgZm9yIFhNTCBQYXJzaW5nIDEuMCBjbGFzc2VzCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsgCi0KLS8vIEltcG9ydGVkIGphdmEuaW8gY2xhc3NlcwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuVHJhbnNmb3JtZXJJbXBsOwotCi0gIC8qKgotICAgKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGNoYWluIGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9ucyBieQotICAgKiBwaXBpbmcgU0FYIGV2ZW50cyBmcm9tIG9uZSBUcmFuc2Zvcm1lciB0byBhbm90aGVyLiBFYWNoIFRyYW5zZm9ybWVyCi0gICAqIG9wZXJhdGVzIGFzIGEgU0FYMiBYTUxGaWx0ZXIvWE1MUmVhZGVyLgotICAgKi8KLXB1YmxpYyBjbGFzcyBQaXBlCi17Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLQl0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgCi0gICAgICAgICBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uCSAgIAotCXsKLSAgICAvLyBJbnN0YW50aWF0ZSAgYSBUcmFuc2Zvcm1lckZhY3RvcnkuCi0gIAlUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IHN1cHBvcnRzIFRoZSB1c2UgdWYgU0FYU291cmNlIAotICAgIC8vIGFuZCBTQVhSZXN1bHQKLSAgICBpZiAodEZhY3RvcnkuZ2V0RmVhdHVyZShTQVhTb3VyY2UuRkVBVFVSRSkgJiYgdEZhY3RvcnkuZ2V0RmVhdHVyZShTQVhSZXN1bHQuRkVBVFVSRSkpCi0gICAgeyAKLSAgICAgIC8vIENhc3QgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSB0byBTQVhUcmFuc2Zvcm1lckZhY3RvcnkuCi0gICAgICBTQVhUcmFuc2Zvcm1lckZhY3Rvcnkgc2F4VEZhY3RvcnkgPSAoKFNBWFRyYW5zZm9ybWVyRmFjdG9yeSkgdEZhY3RvcnkpOwkgIAotICAgICAgLy8gQ3JlYXRlIGEgVHJhbnNmb3JtZXJIYW5kbGVyIGZvciBlYWNoIHN0eWxlc2hlZXQuCi0gICAgICBUcmFuc2Zvcm1lckhhbmRsZXIgdEhhbmRsZXIxID0gc2F4VEZhY3RvcnkubmV3VHJhbnNmb3JtZXJIYW5kbGVyKG5ldyBTdHJlYW1Tb3VyY2UoImZvbzEueHNsIikpOwotICAgICAgVHJhbnNmb3JtZXJIYW5kbGVyIHRIYW5kbGVyMiA9IHNheFRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVySGFuZGxlcihuZXcgU3RyZWFtU291cmNlKCJmb28yLnhzbCIpKTsKLSAgICAgIFRyYW5zZm9ybWVySGFuZGxlciB0SGFuZGxlcjMgPSBzYXhURmFjdG9yeS5uZXdUcmFuc2Zvcm1lckhhbmRsZXIobmV3IFN0cmVhbVNvdXJjZSgiZm9vMy54c2wiKSk7Ci0gICAgCi0gICAgICAvLyBDcmVhdGUgYW4gWE1MUmVhZGVyLgotCSAgICBYTUxSZWFkZXIgcmVhZGVyID0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKLSAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0SGFuZGxlcjEpOwotICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCB0SGFuZGxlcjEpOwotCi0gICAgICB0SGFuZGxlcjEuc2V0UmVzdWx0KG5ldyBTQVhSZXN1bHQodEhhbmRsZXIyKSk7Ci0gICAgICB0SGFuZGxlcjIuc2V0UmVzdWx0KG5ldyBTQVhSZXN1bHQodEhhbmRsZXIzKSk7Ci0KLSAgICAgIC8vIHRyYW5zZm9ybWVyMyBvdXRwdXRzIFNBWCBldmVudHMgdG8gdGhlIHNlcmlhbGl6ZXIuCi0gICAgICBTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBTZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPdXRwdXRQcm9wZXJ0aWVzLmdldERlZmF1bHRNZXRob2RQcm9wZXJ0aWVzKCJ4bWwiKSk7ICAgICAgICAKLSAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0U3RyZWFtKFN5c3RlbS5vdXQpOwotICAgICAgdEhhbmRsZXIzLnNldFJlc3VsdChuZXcgU0FYUmVzdWx0KHNlcmlhbGl6ZXIuYXNDb250ZW50SGFuZGxlcigpKSk7Ci0KLQkgICAgLy8gUGFyc2UgdGhlIFhNTCBpbnB1dCBkb2N1bWVudC4gVGhlIGlucHV0IENvbnRlbnRIYW5kbGVyIGFuZCBvdXRwdXQgQ29udGVudEhhbmRsZXIKLSAgICAgIC8vIHdvcmsgaW4gc2VwYXJhdGUgdGhyZWFkcyB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZS4gICAKLSAgICAgIHJlYWRlci5wYXJzZSgiZm9vLnhtbCIpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvUGlwZS9mb28ueG1sIGIvc2FtcGxlcy9QaXBlL2Zvby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOWY3OWIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9QaXBlL2Zvby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGRvYz5IZWxsbzwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvUGlwZS9mb28xLnhzbCBiL3NhbXBsZXMvUGlwZS9mb28xLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhOGQ1ZS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1BpcGUvZm9vMS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jIj4KLSAgICA8b3V0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9vdXQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvUGlwZS9mb28yLnhzbCBiL3NhbXBsZXMvUGlwZS9mb28yLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjZDE5Ny4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1BpcGUvZm9vMi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ib3V0Ij4KLSAgICA8b3V0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+IC4uLmdvb2QgdG8gc2VlIHlvdSBhZ2FpbiE8L291dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9QaXBlL2ZvbzMueHNsIGIvc2FtcGxlcy9QaXBlL2ZvbzMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2NmYWE2Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvUGlwZS9mb28zLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+IAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJvdXQiPgotICAgIDxvdXQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4gLi4uYW5kIGdvb2RieSE8L291dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9QaXBlL3JlYWRtZS5odG1sIGIvc2FtcGxlcy9QaXBlL3JlYWRtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg5MzZmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvUGlwZS9yZWFkbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPlhhbGFuIFNhbXBsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDI+WGFsYW4gU2FtcGxlczwvaDI+Ci08cD5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNhbXBsZXMgKHdoYXQgdGhleSBpbGx1c3RyYXRlIGFuZCBob3cgdG8gcnVuIHRoZW0pLCBzZWUgPGEgaHJlZj0iLi4vLi4vZG9jcy9zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+LjwvcD4KLQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NBWDJTQVgvU0FYMlNBWC5qYXZhIGIvc2FtcGxlcy9TQVgyU0FYL1NBWDJTQVguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyMDhhYi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NBWDJTQVgvU0FYMlNBWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLQotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLS8qKgotICogIFJlcGxpY2F0ZSB0aGUgU2ltcGxlVHJhbnNmb3JtIHNhbXBsZSwgZXhwbGljaXRseSB1c2luZyB0aGUgU0FYIG1vZGVsIHRvIGhhbmRsZSB0aGUKLSAqICBzdHlsZXNoZWV0LCB0aGUgWE1MIGlucHV0LCBhbmQgdGhlIHRyYW5zZm9ybWF0aW9uLgotICovCi0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVGVtcGxhdGVzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5UZW1wbGF0ZXNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjsgICAgICAgICAgICAgIAotCi1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5PdXRwdXRQcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFNBWDJTQVgKLXsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLQl0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgCi0gICAgICAgICBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uCSAgIAotCXsKLQotICAgIC8vIEluc3RhbnRpYXRlIGEgVHJhbnNmb3JtZXJGYWN0b3J5LgotICAJVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSBzdXBwb3J0cyBUaGUgdXNlIG9mIFNBWFNvdXJjZSAKLSAgICAvLyBhbmQgU0FYUmVzdWx0Ci0gICAgaWYgKHRGYWN0b3J5LmdldEZlYXR1cmUoU0FYU291cmNlLkZFQVRVUkUpICYmIHRGYWN0b3J5LmdldEZlYXR1cmUoU0FYUmVzdWx0LkZFQVRVUkUpKQotICAgIHsgCi0gICAgICAvLyBDYXN0IHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkuCi0gICAgICBTQVhUcmFuc2Zvcm1lckZhY3Rvcnkgc2F4VEZhY3RvcnkgPSAoKFNBWFRyYW5zZm9ybWVyRmFjdG9yeSkgdEZhY3RvcnkpOwotICAgICAgLy8gQ3JlYXRlIGEgQ29udGVudEhhbmRsZXIgdG8gaGFuZGxlIHBhcnNpbmcgb2YgdGhlIHN0eWxlc2hlZXQuCi0gICAgICBUZW1wbGF0ZXNIYW5kbGVyIHRlbXBsYXRlc0hhbmRsZXIgPSBzYXhURmFjdG9yeS5uZXdUZW1wbGF0ZXNIYW5kbGVyKCk7Ci0KLSAgICAgIC8vIENyZWF0ZSBhbiBYTUxSZWFkZXIgYW5kIHNldCBpdHMgQ29udGVudEhhbmRsZXIuCi0gICAgICBYTUxSZWFkZXIgcmVhZGVyID0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKLSAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0ZW1wbGF0ZXNIYW5kbGVyKTsKLSAgICAKLSAgICAgIC8vIFBhcnNlIHRoZSBzdHlsZXNoZWV0LiAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICByZWFkZXIucGFyc2UoImJpcmRzLnhzbCIpOwotCi0gICAgICAvL0dldCB0aGUgVGVtcGxhdGVzIG9iamVjdCBmcm9tIHRoZSBDb250ZW50SGFuZGxlci4KLSAgICAgIFRlbXBsYXRlcyB0ZW1wbGF0ZXMgPSB0ZW1wbGF0ZXNIYW5kbGVyLmdldFRlbXBsYXRlcygpOwotICAgICAgLy8gQ3JlYXRlIGEgQ29udGVudEhhbmRsZXIgdG8gaGFuZGxlIHBhcnNpbmcgb2YgdGhlIFhNTCBzb3VyY2UuICAKLSAgICAgIFRyYW5zZm9ybWVySGFuZGxlciBoYW5kbGVyIAotICAgICAgICA9IHNheFRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVySGFuZGxlcih0ZW1wbGF0ZXMpOwotICAgICAgLy8gUmVzZXQgdGhlIFhNTFJlYWRlcidzIENvbnRlbnRIYW5kbGVyLgotICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOyAgCi0KLSAgICAgIC8vIFNldCB0aGUgQ29udGVudEhhbmRsZXIgdG8gYWxzbyBmdW5jdGlvbiBhcyBhIExleGljYWxIYW5kbGVyLCB3aGljaAotICAgICAgLy8gaW5jbHVkZXMgImxleGljYWwiIGV2ZW50cyAoZS5nLiwgY29tbWVudHMgYW5kIENEQVRBKS4gCi0gICAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIGhhbmRsZXIpOwotICAgICAgCi0gICAJICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJiaXJkcy5vdXQiKTsKLSAgICAgIAotICAgICAgU2VyaWFsaXplciBzZXJpYWxpemVyID0gU2VyaWFsaXplckZhY3RvcnkuZ2V0U2VyaWFsaXplcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE91dHB1dFByb3BlcnRpZXMuZ2V0RGVmYXVsdE1ldGhvZFByb3BlcnRpZXMoInhtbCIpKTsKLSAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0U3RyZWFtKGZvcyk7Ci0gICAKLSAgICAgIAotICAgICAgLy8gU2V0IHRoZSByZXN1bHQgaGFuZGxpbmcgdG8gYmUgYSBzZXJpYWxpemF0aW9uIHRvIHRoZSBmaWxlIG91dHB1dCBzdHJlYW0uCi0gICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFNBWFJlc3VsdChzZXJpYWxpemVyLmFzQ29udGVudEhhbmRsZXIoKSk7Ci0gICAgICBoYW5kbGVyLnNldFJlc3VsdChyZXN1bHQpOwotICAgICAgCi0gICAgICAvLyBQYXJzZSB0aGUgWE1MIGlucHV0IGRvY3VtZW50LgotICAgICAgcmVhZGVyLnBhcnNlKCJiaXJkcy54bWwiKTsKLSAgICAgIAotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKiogVGhlIHJlc3VsdCBpcyBpbiBiaXJkcy5vdXQgKioqKioqKioqKioqKiIpOwkKLSAgICB9CQotICAgIGVsc2UKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIFRyYW5zZm9ybWVyRmFjdG9yeSBkb2VzIG5vdCBzdXBwb3J0IFNBWCBpbnB1dCBhbmQgU0FYIG91dHB1dCIpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TQVgyU0FYL2JpcmRzLnhtbCBiL3NhbXBsZXMvU0FYMlNBWC9iaXJkcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjc2NDIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TQVgyU0FYL2JpcmRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPENsYXNzPgotPE9yZGVyIE5hbWU9IlRJTkFNSUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iVElOQU1JREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iVGluYW11cyBtYWpvciI+ICBHcmVhdCBUaW5hbW91LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iTm90aG9jZXJjdXMiPkhpZ2hsYW5kIFRpbmFtb3UuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDcnlwdHVyZWxsdXMgc291aSI+TGl0dGxlIFRpbmFtb3UuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDcnlwdHVyZWxsdXMgY2lubmFtb21ldXMiPlRoaWNrZXQgVGluYW1vdS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkNyeXB0dXJlbGx1cyBib3VjYXJkaSI+U2xhdHktYnJlYXN0ZWQgVGluYW1vdS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkNyeXB0dXJlbGx1cyBrZXJyaWFlIj5DaG9jbyBUaW5hbW91LjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgPC9PcmRlcj4KLTxPcmRlciBOYW1lPSJHQVZJSUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iR0FWSUlEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBzdGVsbGF0YSI+UmVkLXRocm9hdGVkIExvb24uPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBhcmN0aWNhIj5BcmN0aWMgTG9vbi48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkdhdmlhIHBhY2lmaWNhIj5QYWNpZmljIExvb24uPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBpbW1lciI+Q29tbW9uIExvb24uPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBhZGFtc2lpIj5ZZWxsb3ctYmlsbGVkIExvb24uPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICA8L09yZGVyPgotCi0KLTxPcmRlciBOYW1lPSJQT0RJQ0lQRURJRk9STUVTIj4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJQT0RJQ0lQRURJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iVGFjaHliYXB0dXMgZG9taW5pY3VzIj5MZWFzdCBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBvZGlseW1idXMgcG9kaWNlcHMiPlBpZWQtYmlsbGVkIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5BdGl0bGFuIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5Ib3JuZWQgR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSIiPlJlZC1uZWNrZWQgR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSIiPkVhcmVkIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5XZXN0ZXJuIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5DbGFyaydzIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIi8+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgIDwvT3JkZXI+Ci0KLQotPE9yZGVyIE5hbWU9IlBST0NFTExBUklJRk9STUVTIj4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJESU9NRURFSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlRoYWxhc3NhcmNoZSBjaGxvcm9yaHluY2hvcyI+WWVsbG93LW5vc2VkIEFsYmF0cm9zcy4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJUaGFsYXNzYXJjaGUgY2F1dGEiPlNoeSBBbGJhdHJvc3MuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iVGhhbGFzc2FyY2hlIG1lbGFub3BocmlzIj5CbGFjay1icm93ZWQgQWxiYXRyb3NzLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBob2ViZXRyaWEgcGFscGVicmF0YSI+TGlnaHQtbWFudGxlZCBBbGJhdHJvc3MuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iRGlvbWVkZWEgZXh1bGFucyI+V2FuZGVyaW5nIEFsYmF0cm9zcy4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaG9lYmFzdHJpYSBpbW11dGFiaWxpcyI+TGF5c2FuIEFsYmF0cm9zcy48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBob2ViYXN0cmlhIG5pZ3JpcGVzIj5CbGFjay1mb290ZWQgQWxiYXRyb3NzLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhvZWJhc3RyaWEgYWxiYXRydXMiPlNob3J0LXRhaWxlZCBBbGJhdHJvc3MuIChOKTwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iUFJPQ0VMTEFSSUlEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJGdWxtYXJ1cyBnbGFjaWFsaXMiPk5vcnRoZXJuIEZ1bG1hci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgbmVnbGVjdGEiPktlcm1hZGVjIFBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGFybWluam9uaWFuYSI+SGVyYWxkIFBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIHVsdGltYSI+TXVycGh5J3MgUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgaW5leHBlY3RhdGEiPk1vdHRsZWQgUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgY2Fob3ciPkJlcm11ZGEgUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBoYXNpdGF0YSI+QmxhY2stY2FwcGVkIFBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgZXh0ZXJuYSI+SnVhbiBGZXJuYW5kZXogUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgcGhhZW9weWdpYSI+RGFyay1ydW1wZWQgUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBjZXJ2aWNhbGlzIj5XaGl0ZS1uZWNrZWQgUGV0cmVsLiAoSCk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgaHlwb2xldWNhIj5Cb25pbiBQZXRyZWwuIChIKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBuaWdyaXBlbm5pcyI+QmxhY2std2luZ2VkIFBldHJlbC4gKEgsIEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGNvb2tpaSI+Q29vaydzIFBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGxvbmdpcm9zdHJpcyI+U3Rlam5lZ2VyJ3MgUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkJ1bHdlcmlhIGJ1bHdlcmlpIj5CdWx3ZXIncyBQZXRyZWwuIChIKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQnVsd2VyaWEgZmFsbGF4Ij5Kb3VhbmluJ3MgUGV0cmVsLiAoSCwgQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlByb2NlbGxhcmlhIHBhcmtpbnNvbmkiPlBhcmtpbnNvbidzIFBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDYWxvbmVjdHJpcyBsZXVjb21lbGFzIj5TdHJlYWtlZCBTaGVhcndhdGVyLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkNhbG9uZWN0cmlzIGRpb21lZGVhIj5Db3J5J3MgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBjcmVhdG9wdXMiPlBpbmstZm9vdGVkIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgY2FybmVpcGVzIj5GbGVzaC1mb290ZWQgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBncmF2aXMiPkdyZWF0ZXIgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBwYWNpZmljdXMiPldlZGdlLXRhaWxlZCBTaGVhcndhdGVyLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgYnVsbGVyaSI+QnVsbGVyJ3MgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBncmlzZXVzIj5Tb290eSBTaGVhcndhdGVyLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIHRlbnVpcm9zdHJpcyI+U2hvcnQtdGFpbGVkIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgbmF0aXZpdGF0aXMiPkNocmlzdG1hcyBTaGVhcndhdGVyLiAoSCk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIHB1ZmZpbnVzIj5NYW54IFNoZWFyd2F0ZXIuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBhdXJpY3VsYXJpcyI+VG93bnNlbmQncyBTaGVhcndhdGVyLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgb3Bpc3Rob21lbGFzIj5CbGFjay12ZW50ZWQgU2hlYXJ3YXRlci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGxoZXJtaW5pZXJpIj5BdWR1Ym9uJ3MgU2hlYXJ3YXRlci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGFzc2ltaWxpcyI+TGl0dGxlIFNoZWFyd2F0ZXIuIChBKTwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iSFlEUk9CQVRJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5pdGVzIG9jZWFuaWN1cyI+V2lsc29uJ3MgU3Rvcm0tUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBlbGFnb2Ryb21hIG1hcmluYSI+V2hpdGUtZmFjZWQgU3Rvcm0tUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ikh5ZHJvYmF0ZXMgcGVsYWdpY3VzIj5FdXJvcGVhbiBTdG9ybS1QZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgZnVyY2F0YSI+Rm9yay10YWlsZWQgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbGV1Y29yaG9hIj5MZWFjaCdzIFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIGhvbW9jaHJvYSI+QXNoeSBTdG9ybS1QZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBjYXN0cm8iPkJhbmQtcnVtcGVkIFN0b3JtLVBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSB0ZXRoeXMiPldlZGdlLXJ1bXBlZCBTdG9ybS1QZXRyZWwuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbWVsYW5pYSI+QmxhY2sgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbWFjcm9kYWN0eWxhIj5HdWFkYWx1cGUgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbWFya2hhbWkiPk1hcmtoYW0ncyBTdG9ybS1QZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgdHJpc3RyYW1pIj5UcmlzdHJhbSdzIFN0b3JtLVBldHJlbC4gKEgpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBtaWNyb3NvbWEiPkxlYXN0IFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgIDwvT3JkZXI+Ci0KLTxPcmRlciBOYW1lPSJQRUxFQ0FOSUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iUEhBRVRIT05USURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWV0aG9uIGxlcHR1cnVzIj5XaGl0ZS10YWlsZWQgVHJvcGljYmlyZC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWV0aG9uIGFldGhlcmV1cyI+UmVkLWJpbGxlZCBUcm9waWNiaXJkLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhZXRob24gcnVicmljYXVkYSI+UmVkLXRhaWxlZCBUcm9waWNiaXJkLjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iU1VMSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlN1bGEgZGFjdHlsYXRyYSI+TWFza2VkIEJvb2J5LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iU3VsYSBuZWJvdXhpaSI+Qmx1ZS1mb290ZWQgQm9vYnkuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJTdWxhIHZhcmllZ2F0YSI+UGVydXZpYW4gQm9vYnkuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iU3VsYSBsZXVjb2dhc3RlciI+QnJvd24gQm9vYnkuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJTdWxhIHN1bGEiPlJlZC1mb290ZWQgQm9vYnkuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJNb3J1cyBiYXNzYW51cyI+Tm9ydGhlcm4gR2FubmV0LjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iUEVMRUNBTklEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQZWxlY2FudXMgZXJ5dGhyb3JoeW5jaG9zIj5BbWVyaWNhbiBXaGl0ZSBQZWxpY2FuLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGVsZWNhbnVzIG9jY2lkZW50YWxpcyI+QnJvd24gUGVsaWNhbi48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IlBIQUxBQ1JPQ09SQUNJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhbGFjcm9jb3JheCBwZW5pY2lsbGF0dXMiPkJyYW5kdCdzIENvcm1vcmFudC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggYnJhc2lsaWFudXMiPk5lb3Ryb3BpYyBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IGF1cml0dXMiPkRvdWJsZS1jcmVzdGVkIENvcm1vcmFudC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggY2FyYm8iPkdyZWF0IENvcm1vcmFudC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggdXJpbGUiPlJlZC1mYWNlZCBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IHBlbGFnaWN1cyI+UGVsYWdpYyBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJBTkhJTkdJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQW5oaW5nYSBhbmhpbmdhIj5BbmhpbmdhLjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iRlJFR0FUSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkZyZWdhdGEgbWFnbmlmaWNlbnMiPk1hZ25pZmljZW50IEZyaWdhdGViaXJkLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iRnJlZ2F0YSBtaW5vciI+R3JlYXQgRnJpZ2F0ZWJpcmQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJGcmVnYXRhIGFyaWVsIj5MZXNzZXIgRnJpZ2F0ZWJpcmQuIChBKTwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgPC9PcmRlcj4KLTwvQ2xhc3M+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NBWDJTQVgvYmlyZHMueHNsIGIvc2FtcGxlcy9TQVgyU0FYL2JpcmRzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ2ZjhlMS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NBWDJTQVgvYmlyZHMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+IAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQ2xhc3MiPgotPEJpcmRJbmZvPgotCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iT3JkZXIiLz4KLTwvQmlyZEluZm8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iT3JkZXIiPgotT3JkZXIgaXM6ICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQE5hbWUiLz4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkZhbWlseSIvPjx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iRmFtaWx5Ij4KLQlGYW1pbHkgaXM6ICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQE5hbWUiLz4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IlNwZWNpZXMgfCBTdWJGYW1pbHkgfCB0ZXh0KCkiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJTdWJGYW1pbHkiPgotCQlTdWJGYW1pbHkgaXMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBOYW1lIi8+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJTcGVjaWVzIHwgdGV4dCgpIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iU3BlY2llcyI+Ci0JPHhzbDpjaG9vc2U+Ci0JICA8eHNsOndoZW4gdGVzdD0ibmFtZSguLik9J1N1YkZhbWlseSciPgotCQk8eHNsOnRleHQ+CTwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBTY2llbnRpZmljX05hbWUiLz4KLQkgIDwveHNsOndoZW4+Ci0JICA8eHNsOm90aGVyd2lzZT4KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBTY2llbnRpZmljX05hbWUiLz4KLQkgIDwveHNsOm90aGVyd2lzZT4KLQk8L3hzbDpjaG9vc2U+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU0FYMlNBWC9mb28ueG1sIGIvc2FtcGxlcy9TQVgyU0FYL2Zvby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOWY3OWIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TQVgyU0FYL2Zvby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGRvYz5IZWxsbzwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvU0FYMlNBWC9mb28ueHNsIGIvc2FtcGxlcy9TQVgyU0FYL2Zvby54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYThkNWUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TQVgyU0FYL2Zvby54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jIj4KLSAgICA8b3V0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9vdXQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL0Nvbm5lY3Rpb25Qb29scy5odG0gYi9zYW1wbGVzL1NRTEV4dGVuc2lvbi9Db25uZWN0aW9uUG9vbHMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjZlNzQ2Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL0Nvbm5lY3Rpb25Qb29scy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT5TUUwgRXh0ZW5zaW9uOyBEQiBDb25uZWN0aW9uIFBvb2xzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGhyIC8+Ci08aDI+T3ZlcnZpZXc8L2gyPiAKLTxociAvPgotPHA+Ci0gICBEYXRhYmFzZSBjb25uZWN0aW9uIHBvb2xzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgWGFsYW4gU1FMIEV4dGVuc2lvbiAKLSAgIGZvciB0d28gcmVhc29ucy4gCi08b2w+Ci0gPGxpPkEgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnQgd2hlcmUgY29uc2VjdXRpdmUgdHJhbnNmb3JtYXRpb24gY2FuIHJldXNlZAotIGRhdGFic2UgY29ubmVjdGlvbnMgd2l0aG91dCByZWFsbG9jYXRpbmcgcmVzb3VyY2VzIGZyb20gdGhlIEpEQkMgRHJpdmVyLiAKLSA8L2xpPgotIDxsaT5BIG1ldGhvZCB0byBzaGFyZSBkYXRhYnNlIGNvbm5lY3Rpb25zIGNyZWF0ZWQgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlCi0gWGFsYW4gWFNMVCBwcm9jZXNzIHdpdGggdGhlIHN0eWxlc2hlZXRzIHRoYXQgdXNlIHRoZSBTUUwgZXh0ZW5zaW9ucwotIDxsaT4KLTwvb2w+Ci08L3A+Ci0KLSA8aHIgLz4gCi0gPGgyPlJlcXVpcm1lbnRzPC9oMj4KLSA8aHIgLz4KLSA8cD4KLSA8REw+Ci0gIDxEVD48aT5OYW1lZCBDb25uZWN0aW9uIFBvb2xzPC9pPjwvRFQ+Ci0gICA8REQ+Q29ubmVjdGlvbiBQb29scyB3aWxsIGJlIHJlZmVyZWQgdG8gYnkgbmFtZSB0byBwcm92aWRlIGEgbGlua2FnZSB0bwotICAgY29ubmVjdGlvbiBwb29scyBjcmVhdGVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZSBYYWxhbiBQcm9jZXNzb3IuIE5hbWVkCi0gICBDb25uZWN0aW9uIFBvb2xzIHdpbGwgYWxzbyBwcm92aWRlIGEgbWVjaGluc2ltIHRvIHN1cHBvcnQgbm9uLW5hdGl2ZQotICAgY29ubmVjdGlvbiB1c2VkIGluIEpEQkMgMS4wIGFuZCBKTkRJIHJlZmVyZW5jZXMgaW4gSkRCQyAyLjAKLSAgIDwvREQ+Ci0gIDxEVD48aT5CYWNrd2FyZHMgQ29tcGF0aWJpbGl0eTwvaT48RFQ+Ci0gICA8REQ+SWYgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb24gbWVjaGluc2ltIGlzIHVzZWQgKGNvbnN0cnVjdG9ycyBpbgotICAgWENvbm5lY3Rpb24pLCBjcnJlYXRlIGEgY29ubmVjdGlvbiBwb29sIG9uIGl0cyBiZWhhbGYuIFRoZSBuYW1lIG9mIHRoZSAKLSAgIGNvbm5lY3RvbiBwb29sIHdpbGwgYmUgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIERyaXZlciBuYW1lLCBEQiBVUkwsIAotICAgVXNlciBuYW1lIGFuZCBwYXNzd29yZC4KLSAgIDwvREQ+Ci0gIDxEVD48aT5Db25uZWN0aW9uIFBvb2wgV3JhcHBwZXJzPC9pPjxEVD4KLSAgIDxERD5JbXBsZW1lbnQgYSBjb25uZWN0aW9uIHBvb2wgaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyB0aGUgcmVxdWlyZWQKLSAgIGJlYWh2b2l1ciBmb3IgY29ubmVjdGlvbiBwb29scy4gVGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSB1c2VkIHRvIGFkYXB0Ci0gICBvdGhlciBjb25uZWN0aW9uIG1lY2hpbnNpbXMgdG8gdGhlIFhhbGFuIFNRTCBFeHRlbnNpb25zCi0gICA8L0REPgotICA8RFQ+PGk+TWluaW1hbCBEZXBlbmRhbmNpZXM8L2k+PC9EVD4KLSAgIDxERD5UaGUgU1FMIEV4dGVuc2lvbiB3aWxsIGltcGxlbWVudCBhIG1pbmltYWwgZGVmYXVsdCBjb25uZWN0aW9uIHBvb2wgCi0gICBtZWNoaW5pc20uIFRoaXMgd2lsbCByZWR1Y2UgdGhlIGRlcGVuZGFuY3kgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHRvIAotICAgYnVpbGQgYW5kIHVzZSB0aGUgWGFsYW4gU1FMIFByb2Nlc3Nvci4gT3RoZXIgd3JhcHBlcnMgY2FuIGJlIHdyaXR0ZW4KLSAgIHRvIGFkYXB0IHRoaXJkIHBhcnR5IGNvbm5lY3Rpb24gcG9vbHMgdG8gdGhlIHByb2Nlc3Nvci4gQSBzYW1wbGUgb2YgdGhlCi0gICBBcGFjaGUgVHVyYmluZSBwcm9qZWN0IGlzIHBsYW5uZWQgYXMgYSBzYW1wbGUgZm9yIHRoZSBwcm9qZWN0LgotICAgPC9ERD4KLSAgPC9ETD4KLSA8L3A+Ci0KLSA8aHIgLz4KLSA8aDI+RXhhbXBsZXMgb2YgVXNlPC9oMj4KLSA8aHIgLz4KLSA8VUw+Ci0gPGxpPkVzdGFibGlzaGluZyBhIGJhc2ljIGNvbm5lY3Rpb248L2xpPjxiciAvPgotIDxjb2RlPiBTb21lIGNvZGUgdGV4dDwvY29kZT4KLSA8bGk+RXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiBieSBzdXBwbGl5aW5nIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uCi0gICAgIGluIHRoZSBYTUwgPC9saT48YnIgLz4KLSA8Y29kZT4gU29tZSBjb2RlIHRleHQ8L2NvZGU+Ci0gPGxpPlVzaW5nIGEgY29ubmVjY3Rpb24gdGhhdCBoYXMgYmVlbiBlc3RhYmxpc2hlZCBvdXRzaWRlIHRoZSBYYWxhbgotICAgICBQcm9jZXNzb3I8L2xpPjxiciAvPgotIDxjb2RlPiBTb21lIGNvZGUgdGV4dDwvY29kZT4KLSA8L1VMPgotICAKLSA8aHIgLz4KLSA8aDI+U1FMIFJlc3VsdHM8L2gyPgotIDxociAvPgotCi0gPGhyIC8+Ci0gPGgyPkVycm9yIENvbnRyb2w8L2gyPgotIDxociAvPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL1JFQURNRSBiL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3ZDMwMi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1TYW1wbGVzCi0gU3RhdGljIGxvZ2luLCBTdGF0aWMgUXVlcnkKLSBMb2dpbiB3aXRoIFhNTCBEYXRhLCBTdGF0aWMgUXVlcnkKLSBMb2dpbiB3aXRoIEV4dCBQYXJhbSwgU3RhdGljIFF1ZXJ5Ci0gTG9naW4gd2l0aCBFeHQgUG9vbCwgU3RhdGljIFF1ZXJ5Ci0gCi0gTG9naW4gd2l0aCBYTUwgRGF0YSxQUXVlcnkgLSBUeXBlIHdpdGggZGF0YSwgRGF0YSBpbiBYTUwKLSBMb2dpbiB3aXRoIFhNTCBEYXRhLCBQUXVlcnkgLSBUeXBlIHdpdGggcXVlcnksIERhdGEgaW4gWE1MCi0gCi0gTG9naW4gd2l0aCBYTUwgRGF0YSwgUFF1ZXJ5IC0gVHlwZSB3aXRoIHF1ZXJ5LCBEYXRhIEV4dCBQYXJhbQotIAotIFRvIERvLAotICBTaW5nbGUgWENvbm5lY3Rpb24gY29uc3RydWN0b3IKLSAgTWFrZSBhIGNvbm5lY3QgbWV0aG9kIHRoYXQgcmV0dXJucyBhIE5vZGVJdGVyYXRvcgotICBDcmVhdGUgYSBFeGNlcHRpb24gdGhhdCB3aWxsIHNlcmlhbmx6ZSBpdHNlbGYgYXMgYSBzdHJlZSBOb2RlCi0gIAotIERvY3MKLSAgSG93IHRvIENvbm5lY3QKLSAgSG93IHRvIGV4ZWN1dGUgYSBxdWVyeQotIAotIAotIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vYmFzaWMtY29ubmVjdGlvbi9kYmluZm8ueG1sIGIvc2FtcGxlcy9TUUxFeHRlbnNpb24vYmFzaWMtY29ubmVjdGlvbi9kYmluZm8ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTdkMjVmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2Jhc2ljLWNvbm5lY3Rpb24vZGJpbmZvLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTxkYnRlc3Q+Ci0gPGRlc2NyaXB0aW9uPlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBtYWtlIGEgY29ubmVjdGlvbiB0byB0aGUgREJNUzwvZGVzY3JpcHRpb24+Ci0KLSA8REJJTkZPPgotICAgPGRiZHJpdmVyPmNvbS5zeWJhc2UuamRiYzIuamRiYy5TeWJEcml2ZXI8L2RiZHJpdmVyPgotICAgPGRidXJsPmpkYmM6c3liYXNlOlRkczpsb2NhbGhvc3Q6NTAwMC9zbWFydDkxMTwvZGJ1cmw+Ci0gICA8dXNlcj5zYTwvdXNlcj4KLSAgIDxwYXNzd29yZC8+Ci0gPC9EQklORk8+Ci0gCi0KLTwvZGJ0ZXN0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vYmFzaWMtY29ubmVjdGlvbi9kYnRlc3QtY2luZm8ueHNsIGIvc2FtcGxlcy9TUUxFeHRlbnNpb24vYmFzaWMtY29ubmVjdGlvbi9kYnRlc3QtY2luZm8ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Q1YzI2Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2Jhc2ljLWNvbm5lY3Rpb24vZGJ0ZXN0LWNpbmZvLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiCi0gICAgICAgICAgICAgICAgeG1sbnM6c3FsPSIvb3JnLmFwYWNoZS54YWxhbi5saWIuc3FsLlhDb25uZWN0aW9uIgotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJzcWwiPgotICA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icXVlcnkiIHNlbGVjdD0iJnF1b3Q7U0VMRUNUIEZpcnN0TmFtZSwgTGFzdE5hbWUsIFN0cmVldDEsIENpdHksIFppcCAgRlJPTSBBY2NvdW50IHdoZXJlIEFjY3RJRD0nMjAxOTAwMTAxMCcmcXVvdDsiLz4KLSAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPCEtLSAxLiBNYWtlIHRoZSBjb25uZWN0aW9uIC0tPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iY2luZm8iIHNlbGVjdD0iLy9EQklORk8iIC8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJhY2NvdW50cyIKLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0nc3FsOm5ldygkY2luZm8pJy8+Ci0gICAgPEhUTUw+Ci0gICAgICA8SEVBRD4KLSAgICAgIDwvSEVBRD4KLSAgICAgIDxCT0RZPgotICAgICAgICA8VEFCTEUgYm9yZGVyPSIxIj4KLSAgICAgICAgPCEtLTIuIEV4ZWN1dGUgdGhlIHF1ZXJ5IC0tPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRhYmxlIiBzZWxlY3Q9J3NxbDpxdWVyeSgkYWNjb3VudHMsICRxdWVyeSknLz4KLSAgICAgICAgICA8VFI+Ci0gICAgICAgICAgPCEtLSBHZXQgY29sdW1uLWxhYmVsIGF0dHJpYnV0ZSBmcm9tIGVhY2ggY29sdW1uLWhlYWRlci0tPgotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkdGFibGUvcm93LXNldC9jb2x1bW4taGVhZGVyIj4KLSAgICAgICAgICAgIDxUSD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbHVtbi1sYWJlbCIvPjwvVEg+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgPC9UUj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiR0YWJsZS9yb3ctc2V0L3JvdyIvPgotICAgICAgICAgIDx4c2w6dGV4dD4mIzEwOzwveHNsOnRleHQ+Ci0gICAgICAgIDwvVEFCTEU+Ci0gICAgICA8L0JPRFk+Ci0gICAgPC9IVE1MPiAKLSAgICA8IS0tIDMuIENsb3NlIHRoZSBjb25uZWN0aW9uIC0tPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzcWw6Y2xvc2UoJGFjY291bnRzKSIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJyb3ciPgotICAgICAgICA8VFI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjb2wiLz4KLSAgICAgICAgPC9UUj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29sIj4KLSAgICA8VEQ+Ci0gICAgICA8IS0tIEhlcmUgaXMgdGhlIGNvbHVtbiBkYXRhIC0tPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPgotICAgIDwvVEQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vYmFzaWMtY29ubmVjdGlvbi9kYnRlc3QueHNsIGIvc2FtcGxlcy9TUUxFeHRlbnNpb24vYmFzaWMtY29ubmVjdGlvbi9kYnRlc3QueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmM2ZGI1Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2Jhc2ljLWNvbm5lY3Rpb24vZGJ0ZXN0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiCi0gICAgICAgICAgICAgICAgeG1sbnM6c3FsPSJvcmcuYXBhY2hlLnhhbGFuLmxpYi5zcWwuWENvbm5lY3Rpb24iCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InNxbCI+Ci0gIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJxdWVyeSIgc2VsZWN0PSImcXVvdDtTRUxFQ1QgRmlyc3ROYW1lLCBMYXN0TmFtZSwgU3RyZWV0MSwgQ2l0eSwgWmlwICBGUk9NIEFjY291bnQgd2hlcmUgQWNjdElEPScyMDE5MDAyMDEwJyZxdW90OyIvPgotIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8IS0tIDEuIE1ha2UgdGhlIGNvbm5lY3Rpb24gLS0+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJhY2NvdW50cyIKLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0ic3FsOm5ldygnY29tLnN5YmFzZS5qZGJjMi5qZGJjLlN5YkRyaXZlcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqZGJjOnN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAvc21hcnQ5MTEnLCAnc2EnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJykiLz4KLSAgICA8SFRNTD4KLSAgICAgIDxIRUFEPgotICAgICAgPC9IRUFEPgotICAgICAgPEJPRFk+Ci0gICAgICAgIDxUQUJMRSBib3JkZXI9IjEiPgotICAgICAgICA8IS0tMi4gRXhlY3V0ZSB0aGUgcXVlcnkgLS0+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGFibGUiIHNlbGVjdD0nc3FsOnF1ZXJ5KCRhY2NvdW50cywgJHF1ZXJ5KScvPgotICAgICAgICAgIDxUUj4KLSAgICAgICAgICA8IS0tIEdldCBjb2x1bW4tbGFiZWwgYXR0cmlidXRlIGZyb20gZWFjaCBjb2x1bW4taGVhZGVyLS0+Ci0gICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0YWJsZS9yb3ctc2V0L2NvbHVtbi1oZWFkZXIiPgotICAgICAgICAgICAgPFRIPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29sdW1uLWxhYmVsIi8+PC9USD4KLSAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICA8L1RSPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJHRhYmxlL3Jvdy1zZXQvcm93Ii8+Ci0gICAgICAgICAgPHhzbDp0ZXh0PiYjMTA7PC94c2w6dGV4dD4KLSAgICAgICAgPC9UQUJMRT4KLSAgICAgIDwvQk9EWT4KLSAgICA8L0hUTUw+IAotICAgIDwhLS0gMy4gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gLS0+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InNxbDpjbG9zZSgkYWNjb3VudHMpIi8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InJvdyI+Ci0gICAgICAgIDxUUj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNvbCIvPgotICAgICAgICA8L1RSPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb2wiPgotICAgIDxURD4KLSAgICAgIDwhLS0gSGVyZSBpcyB0aGUgY29sdW1uIGRhdGEgLS0+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+Ci0gICAgPC9URD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9leHQtY29ubmVjdGlvbi9FeHRlcm5hbENvbm5lY3Rpb24uamF2YSBiL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2V4dC1jb25uZWN0aW9uL0V4dGVybmFsQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWExMDhkLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2V4dC1jb25uZWN0aW9uL0V4dGVybmFsQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhTTFQ0SiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLS8vIEltcG9ydGVkIFRyYVggY2xhc3NlcwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5saWIuc3FsLkRlZmF1bHRDb25uZWN0aW9uUG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLmxpYi5zcWwuWENvbm5lY3Rpb25Qb29sTWFuYWdlcjsKLQotCi0vLyBJbXBvcnRlZCBqYXZhIGNsYXNzZXMKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiAgVXNlIHRoZSBUcmFYIGludGVyZmFjZSB0byBwZXJmb3JtIGEgdHJhbnNmb3JtYXRpb24gaW4gdGhlIHNpbXBsZXN0IG1hbm5lciBwb3NzaWJsZQotICogICgzIHN0YXRlbWVudHMpLgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxDb25uZWN0aW9uCi17Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0KLSAgLy8gQ3JlYXRlIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2Ugc2VydmVyCi0gIC8vIFVwIHRoZSBjb25uZWN0aW9uIHBvb2wgY291bnQgZm9yIHRlc3RpbmcKLSAgRGVmYXVsdENvbm5lY3Rpb25Qb29sIGNwID0gbmV3IERlZmF1bHRDb25uZWN0aW9uUG9vbCgpOwotICBjcC5zZXREcml2ZXIoImNvbS5zeWJhc2UuamRiYzIuamRiYy5TeWJEcml2ZXIiKTsKLSAgY3Auc2V0VVJMKCJqZGJjOnN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAvc21hcnQ5MTEiKTsKLSAgY3Auc2V0VXNlcigic2EiKTsKLSAgY3Auc2V0UGFzc3dvcmQoIiIpOwotICBjcC5zZXRNaW5Db25uZWN0aW9ucygxMCk7Ci0gIGNwLnNldEFjdGl2ZSh0cnVlKTsKLQotICAvLyBOb3cgbGV0J3MgcmVnaXN0ZXIgb3VyIGNvbm5lY3Rpb24gcG9vbCBzbyB3ZSBjYW4gdXNlCi0gIC8vIGluIGEgc3R5bGVzaGVldAotICBYQ29ubmVjdGlvblBvb2xNYW5hZ2VyIHBtID0gbmV3IFhDb25uZWN0aW9uUG9vbE1hbmFnZXIoKTsKLSAgcG0ucmVnaXN0ZXJQb29sKCJzeWJhc2UiLCBjcCk7Ci0KLQotICAvLyBVc2UgdGhlIHN0YXRpYyBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKSBtZXRob2QgdG8gaW5zdGFudGlhdGUKLSAgLy8gYSBUcmFuc2Zvcm1lckZhY3RvcnkuIFRoZSBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeQotICAvLyBzeXN0ZW0gcHJvcGVydHkgc2V0dGluZyBkZXRlcm1pbmVzIHRoZSBhY3R1YWwgY2xhc3MgdG8gaW5zdGFudGlhdGUgLS0KLSAgLy8gb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGwuCi0JVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLQkvLyBVc2UgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSB0byBpbnN0YW50aWF0ZSBhIFRyYW5zZm9ybWVyIHRoYXQgd2lsbCB3b3JrIHdpdGgKLQkvLyB0aGUgc3R5bGVzaGVldCB5b3Ugc3BlY2lmeS4gVGhpcyBtZXRob2QgY2FsbCBhbHNvIHByb2Nlc3NlcyB0aGUgc3R5bGVzaGVldAotICAvLyBpbnRvIGEgY29tcGlsZWQgVGVtcGxhdGVzIG9iamVjdC4KLQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKAotICAgICAgICBuZXcgU3RyZWFtU291cmNlKCJkYnRlc3QueHNsIikpOwotCi0JLy8gVXNlIHRoZSBUcmFuc2Zvcm1lciB0byBhcHBseSB0aGUgYXNzb2NpYXRlZCBUZW1wbGF0ZXMgb2JqZWN0IHRvIGFuIFhNTCBkb2N1bWVudAotCS8vIChmb28ueG1sKSBhbmQgd3JpdGUgdGhlIG91dHB1dCB0byBhIGZpbGUgKGZvby5vdXQpLgotCXRyYW5zZm9ybWVyLnRyYW5zZm9ybSgKLSAgICAgICAgbmV3IFN0cmVhbVNvdXJjZSgiZGJ0ZXN0LnhtbCIpLAotICAgICAgICBuZXcgU3RyZWFtUmVzdWx0KG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJkYnRlc3Qub3V0IikpKTsKLQotCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKiBUaGUgcmVzdWx0IGlzIGluIGRidGVzdC5vdXQgKioqKioqKioqKioqKiIpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vZXh0LWNvbm5lY3Rpb24vZGJ0ZXN0Lm91dCBiL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2V4dC1jb25uZWN0aW9uL2RidGVzdC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MTRkY2EuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vZXh0LWNvbm5lY3Rpb24vZGJ0ZXN0Lm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTxIVE1MPgotPEhFQUQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L0hFQUQ+Ci08Qk9EWT4KLTxUQUJMRSBib3JkZXI9IjEiPgotPFRSPgotPFRIPkZpcnN0TmFtZTwvVEg+PFRIPkxhc3ROYW1lPC9USD48VEg+U3RyZWV0MTwvVEg+PFRIPkNpdHk8L1RIPjxUSD5aaXA8L1RIPgotPC9UUj4KLTxUUj4KLTxURD48L1REPjxURD48L1REPjxURD48L1REPjxURD48L1REPjxURD48L1REPgotPC9UUj4KLTxUUj4KLTxURD5MYXdyZW5jZSAgICAgICAgICAgICAgICAgICAgICA8L1REPjxURD5Gcmllc2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1REPjxURD40MDEwIFNhbnRhIFJvc2EgQXZlICAgICAgICAgICAgICAgICAgICAgPC9URD48VEQ+VHVsYXJlICAgICAgICAgICAgICAgICAgICAgICAgPC9URD48VEQ+OTIzMTM8L1REPgotPC9UUj4KLQotPC9UQUJMRT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2V4dC1jb25uZWN0aW9uL2RidGVzdC54bWwgYi9zYW1wbGVzL1NRTEV4dGVuc2lvbi9leHQtY29ubmVjdGlvbi9kYnRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTdkMjVmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2V4dC1jb25uZWN0aW9uL2RidGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08ZGJ0ZXN0PgotIDxkZXNjcmlwdGlvbj5UaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gbWFrZSBhIGNvbm5lY3Rpb24gdG8gdGhlIERCTVM8L2Rlc2NyaXB0aW9uPgotCi0gPERCSU5GTz4KLSAgIDxkYmRyaXZlcj5jb20uc3liYXNlLmpkYmMyLmpkYmMuU3liRHJpdmVyPC9kYmRyaXZlcj4KLSAgIDxkYnVybD5qZGJjOnN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAvc21hcnQ5MTE8L2RidXJsPgotICAgPHVzZXI+c2E8L3VzZXI+Ci0gICA8cGFzc3dvcmQvPgotIDwvREJJTkZPPgotIAotCi08L2RidGVzdD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2V4dC1jb25uZWN0aW9uL2RidGVzdC54c2wgYi9zYW1wbGVzL1NRTEV4dGVuc2lvbi9leHQtY29ubmVjdGlvbi9kYnRlc3QueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGQ3MTc5Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL2V4dC1jb25uZWN0aW9uL2RidGVzdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zOnNxbD0ib3JnLmFwYWNoZS54YWxhbi5saWIuc3FsLlhDb25uZWN0aW9uIgotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJzcWwiPgotICA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icXVlcnkiIHNlbGVjdD0iJnF1b3Q7U0VMRUNUIEZpcnN0TmFtZSwgTGFzdE5hbWUsIFN0cmVldDEsIENpdHksIFppcCAgRlJPTSBBY2NvdW50IHdoZXJlIEFjY3RJRD0nMjAxOTk5MDAwMCcmcXVvdDsiLz4KLSAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPCEtLSAxLiBNYWtlIHRoZSBjb25uZWN0aW9uIC0tPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYWNjb3VudHMiCi0gICAgICAgICAgICAgICAgICBzZWxlY3Q9InNxbDpuZXcoJ3N5YmFzZScpIi8+Ci0gICAgPEhUTUw+Ci0gICAgICA8SEVBRD4KLSAgICAgIDwvSEVBRD4KLSAgICAgIDxCT0RZPgotICAgICAgICA8VEFCTEUgYm9yZGVyPSIxIj4KLSAgICAgICAgPCEtLTIuIEV4ZWN1dGUgdGhlIHF1ZXJ5IC0tPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRhYmxlIiBzZWxlY3Q9J3NxbDpxdWVyeSgkYWNjb3VudHMsICRxdWVyeSknLz4KLSAgICAgICAgICA8VFI+Ci0gICAgICAgICAgPCEtLSBHZXQgY29sdW1uLWxhYmVsIGF0dHJpYnV0ZSBmcm9tIGVhY2ggY29sdW1uLWhlYWRlci0tPgotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkdGFibGUvcm93LXNldC9jb2x1bW4taGVhZGVyIj4KLSAgICAgICAgICAgIDxUSD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbHVtbi1sYWJlbCIvPjwvVEg+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgPC9UUj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiR0YWJsZS9yb3ctc2V0L3JvdyIvPgotICAgICAgICAgIDx4c2w6dGV4dD4mIzEwOzwveHNsOnRleHQ+Ci0gICAgICAgIDwvVEFCTEU+Ci0gICAgICA8L0JPRFk+Ci0gICAgPC9IVE1MPiAKLSAgICA8IS0tIDMuIENsb3NlIHRoZSBjb25uZWN0aW9uIC0tPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzcWw6Y2xvc2UoJGFjY291bnRzKSIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJyb3ciPgotICAgICAgICA8VFI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjb2wiLz4KLSAgICAgICAgPC9UUj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29sIj4KLSAgICA8VEQ+Ci0gICAgICA8IS0tIEhlcmUgaXMgdGhlIGNvbHVtbiBkYXRhIC0tPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPgotICAgIDwvVEQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vcHF1ZXJ5L2RiaW5mby54bWwgYi9zYW1wbGVzL1NRTEV4dGVuc2lvbi9wcXVlcnkvZGJpbmZvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkMWMxYS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9wcXVlcnkvZGJpbmZvLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTxYTUxTVE9SRT4KLQotIDxRVUVSWT4KLSAgIDxBQ0NUSUQ+MjAxOTk5MDAwMDwvQUNDVElEPgotIDwvUVVFUlk+Ci0gIAotIDxEQklORk8+Ci0gICA8ZGJkcml2ZXI+Y29tLnN5YmFzZS5qZGJjMi5qZGJjLlN5YkRyaXZlcjwvZGJkcml2ZXI+Ci0gICA8ZGJ1cmw+amRiYzpzeWJhc2U6VGRzOmxvY2FsaG9zdDo1MDAwL3NtYXJ0OTExPC9kYnVybD4KLSAgIDx1c2VyPnNhPC91c2VyPgotICAgPHBhc3N3b3JkLz4KLSA8L0RCSU5GTz4KLQotPC9YTUxTVE9SRT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL3BxdWVyeS9kYnRlc3QtcHF1ZXJ5LnhzbCBiL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL3BxdWVyeS9kYnRlc3QtcHF1ZXJ5LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjOThkYy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9wcXVlcnkvZGJ0ZXN0LXBxdWVyeS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zOnNxbD0iL29yZy5hcGFjaGUueGFsYW4ubGliLnNxbC5YQ29ubmVjdGlvbiIKLSAgICAgICAgICAgICAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0ic3FsIj4KLSAgPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIvPgotICA8eHNsOnBhcmFtIG5hbWU9InExIiBzZWxlY3Q9IiZxdW90O1NFTEVDVCBGaXJzdE5hbWUsIExhc3ROYW1lLCBTdHJlZXQxLCBDaXR5LCBaaXAgIEZST00gQWNjb3VudCB3aGVyZSBBY2N0SUQ9ID8gJnF1b3Q7Ii8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icTF0eXBlIiBzZWxlY3Q9InN0cmluZyIvPgotIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8IS0tIDEuIE1ha2UgdGhlIGNvbm5lY3Rpb24gLS0+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJjaW5mbyIgc2VsZWN0PSIvL0RCSU5GTyIgLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFjY291bnRzIgotICAgICAgICAgICAgICAgICAgc2VsZWN0PSdzcWw6bmV3KCRjaW5mbyknLz4KLSAgICA8SFRNTD4KLSAgICAgIDxIRUFEPgotICAgICAgPC9IRUFEPgotICAgICAgPEJPRFk+Ci0gICAgICAgIDxUQUJMRSBib3JkZXI9IjEiPgotICAgICAgICA8IS0tMi4gRXhlY3V0ZSB0aGUgcXVlcnkgLS0+Ci0JPHhzbDpwYXJhbSBuYW1lPSJxMXBhcmFtIiBzZWxlY3Q9Ii8vUVVFUlkiIC8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZm9vIiBzZWxlY3Q9J3NxbDphZGRQYXJhbWV0ZXJGcm9tRWxlbWVudCgkYWNjb3VudHMsICRxMXBhcmFtKScgLz4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9InRhYmxlIiBzZWxlY3Q9J3NxbDpwcXVlcnkoJGFjY291bnRzLCAkcTEsICRxMXR5cGUpJy8+Ci0gICAgICAgICAgPFRSPgotICAgICAgICAgIDwhLS0gR2V0IGNvbHVtbi1sYWJlbCBhdHRyaWJ1dGUgZnJvbSBlYWNoIGNvbHVtbi1oZWFkZXItLT4KLSAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRhYmxlL3Jvdy1zZXQvY29sdW1uLWhlYWRlciI+Ci0gICAgICAgICAgICA8VEg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb2x1bW4tbGFiZWwiLz48L1RIPgotICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkdGFibGUvcm93LXNldC9yb3ciLz4KLSAgICAgICAgICA8eHNsOnRleHQ+JiMxMDs8L3hzbDp0ZXh0PgotICAgICAgICA8L1RBQkxFPgotICAgICAgPC9CT0RZPgotICAgIDwvSFRNTD4gCi0gICAgPCEtLSAzLiBDbG9zZSB0aGUgY29ubmVjdGlvbiAtLT4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3FsOmNsb3NlKCRhY2NvdW50cykiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icm93Ij4KLSAgICAgICAgPFRSPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iY29sIi8+Ci0gICAgICAgIDwvVFI+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbCI+Ci0gICAgPFREPgotICAgICAgPCEtLSBIZXJlIGlzIHRoZSBjb2x1bW4gZGF0YSAtLT4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz4KLSAgICA8L1REPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL3Nob3ctZXJyb3IvZGJpbmZvLnhtbCBiL3NhbXBsZXMvU1FMRXh0ZW5zaW9uL3Nob3ctZXJyb3IvZGJpbmZvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjMmRkYS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9zaG93LWVycm9yL2RiaW5mby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08WE1MU1RPUkU+Ci0KLSA8VVNFUlBST0ZJTEU+Ci0gIDxVU0VSTkFNRT5nZW50aWpvPC9VU0VSTkFNRT4KLSAgPFBBU1NXRD5kcm93c3NhcDwvUEFTU1dEPgotIDwvVVNFUlBST0ZJTEU+Ci0KLSA8UVVFUlk+Ci0gICA8QUNDVElEPjIwMTk5OTAwMDA8L0FDQ1RJRD4KLSA8L1FVRVJZPgotICAKLSA8REJJTkZPPgotICAgPGRiZHJpdmVyPmNvbS5zeWJhc2UuamRiYzIuamRiYy5TeWJEcml2ZXI8L2RiZHJpdmVyPgotICAgPGRidXJsPmpkYmM6c3liYXNlOlRkczpsb2NhbGhvc3Q6NTAwMC9zbWFydDkxMTwvZGJ1cmw+Ci0gICA8dXNlcj5zYTwvdXNlcj4KLSAgIDxwYXNzd29yZC8+Ci0gPC9EQklORk8+Ci0KLTwvWE1MU1RPUkU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NRTEV4dGVuc2lvbi9zaG93LWVycm9yL2RidGVzdC54c2wgYi9zYW1wbGVzL1NRTEV4dGVuc2lvbi9zaG93LWVycm9yL2RidGVzdC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MTNhMDguLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TUUxFeHRlbnNpb24vc2hvdy1lcnJvci9kYnRlc3QueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICAgICB4bWxuczpzcWw9Ii9vcmcuYXBhY2hlLnhhbGFuLmxpYi5zcWwuWENvbm5lY3Rpb24iCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InNxbCI+Ci0gIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJxdWVyeSIgc2VsZWN0PSImcXVvdDtTRUxFQyBGaXJzdE5hbWUsIExhc3ROYW1lLCBTdHJlZXQxLCBDaXR5LCBaaXAgIEZST00gQWNjb3VudCB3aGVyZSBBY2N0SUQ9JzIwMTk5OTAwMDAnJnF1b3Q7Ii8+Ci0gCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDwhLS0gMS4gTWFrZSB0aGUgY29ubmVjdGlvbiAtLT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFjY291bnRzIgotICAgICAgICAgICAgICAgICAgc2VsZWN0PSJzcWw6bmV3KCdjb20uc3liYXNlLmpkYmMyLmpkYmMuU3liRHJpdmVyJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2pkYmM6c3liYXNlOlRkczpsb2NhbGhvc3Q6NTAwMC9zbWFydDkxMScsICdzYScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycpIi8+Ci0gICAgPCEtLTIuIEV4ZWN1dGUgdGhlIHF1ZXJ5IC0tPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGFibGUiIHNlbGVjdD0nc3FsOnF1ZXJ5KCRhY2NvdW50cywgJHF1ZXJ5KScvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIAotICAgCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJHRhYmxlL3Jvdy1zZXQiIC8+Ci0gCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiR0YWJsZS9leHQtZXJyb3IiIC8+Ci0gICAgCi0gICAgPCEtLSAzLiBDbG9zZSB0aGUgY29ubmVjdGlvbiAtLT4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3FsOmNsb3NlKCRhY2NvdW50cykiLz4KLQotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJyb3ctc2V0Ij4KLSAgICAKLSAgICA8SFRNTD4KLSAgICAgIDxIRUFEPgotICAgICAgPC9IRUFEPgotICAgICAgPEJPRFk+Ci0gICAgICAgIDxUQUJMRSBib3JkZXI9IjEiPgotICAgICAgICAgIDxUUj4KLSAgICAgICAgICA8IS0tIEdldCBjb2x1bW4tbGFiZWwgYXR0cmlidXRlIGZyb20gZWFjaCBjb2x1bW4taGVhZGVyLS0+Ci0gICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InJvdy1zZXQvY29sdW1uLWhlYWRlciI+Ci0gICAgICAgICAgICA8VEg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb2x1bW4tbGFiZWwiLz48L1RIPgotICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIvcm93LXNldC9yb3ciLz4KLSAgICAgICAgICA8eHNsOnRleHQ+JiMxMDs8L3hzbDp0ZXh0PgotICAgICAgICA8L1RBQkxFPgotICAgICAgPC9CT0RZPgotICAgIDwvSFRNTD4gCi0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InJvdyI+Ci0gICAgICAgIDxUUj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNvbCIvPgotICAgICAgICA8L1RSPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb2wiPgotICAgIDxURD4KLSAgICAgIDwhLS0gSGVyZSBpcyB0aGUgY29sdW1uIGRhdGEgLS0+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+Ci0gICAgPC9URD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9leHQtZXJyb3IiPgotICAgIDx4c2w6dGV4dD5Xb29wcywgYW4gZXJyb3Igb2NjdXJlZDogPC94c2w6dGV4dD4KLSAgCTx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9TaW1wbGVUcmFuc2Zvcm0uamF2YSBiL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL1NpbXBsZVRyYW5zZm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ2YTI1Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL1NpbXBsZVRyYW5zZm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWFNMVDRKIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotLy8gSW1wb3J0ZWQgVHJhWCBjbGFzc2VzCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLQotLy8gSW1wb3J0ZWQgamF2YSBjbGFzc2VzCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogIFVzZSB0aGUgVHJhWCBpbnRlcmZhY2UgdG8gcGVyZm9ybSBhIHRyYW5zZm9ybWF0aW9uIGluIHRoZSBzaW1wbGVzdCBtYW5uZXIgcG9zc2libGUKLSAqICAoMyBzdGF0ZW1lbnRzKS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVRyYW5zZm9ybQotewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIAotICAgICAgICAgICBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsgIAotICAvLyBVc2UgdGhlIHN0YXRpYyBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKSBtZXRob2QgdG8gaW5zdGFudGlhdGUgCi0gIC8vIGEgVHJhbnNmb3JtZXJGYWN0b3J5LiBUaGUgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkgCi0gIC8vIHN5c3RlbSBwcm9wZXJ0eSBzZXR0aW5nIGRldGVybWluZXMgdGhlIGFjdHVhbCBjbGFzcyB0byBpbnN0YW50aWF0ZSAtLQotICAvLyBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlRyYW5zZm9ybWVySW1wbC4KLQlUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkKLQkvLyBVc2UgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSB0byBpbnN0YW50aWF0ZSBhIFRyYW5zZm9ybWVyIHRoYXQgd2lsbCB3b3JrIHdpdGggIAotCS8vIHRoZSBzdHlsZXNoZWV0IHlvdSBzcGVjaWZ5LiBUaGlzIG1ldGhvZCBjYWxsIGFsc28gcHJvY2Vzc2VzIHRoZSBzdHlsZXNoZWV0Ci0gIC8vIGludG8gYSBjb21waWxlZCBUZW1wbGF0ZXMgb2JqZWN0LgotCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIobmV3IFN0cmVhbVNvdXJjZSgiYmlyZHMueHNsIikpOwotCi0JLy8gVXNlIHRoZSBUcmFuc2Zvcm1lciB0byBhcHBseSB0aGUgYXNzb2NpYXRlZCBUZW1wbGF0ZXMgb2JqZWN0IHRvIGFuIFhNTCBkb2N1bWVudAotCS8vIChmb28ueG1sKSBhbmQgd3JpdGUgdGhlIG91dHB1dCB0byBhIGZpbGUgKGZvby5vdXQpLgotCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKCJiaXJkcy54bWwiKSwgbmV3IFN0cmVhbVJlc3VsdChuZXcgRmlsZU91dHB1dFN0cmVhbSgiYmlyZHMub3V0IikpKTsKLQkKLQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKiogVGhlIHJlc3VsdCBpcyBpbiBiaXJkcy5vdXQgKioqKioqKioqKioqKiIpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TaW1wbGVUcmFuc2Zvcm0vYmlyZHMueG1sIGIvc2FtcGxlcy9TaW1wbGVUcmFuc2Zvcm0vYmlyZHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDI3NjQyLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL2JpcmRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPENsYXNzPgotPE9yZGVyIE5hbWU9IlRJTkFNSUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iVElOQU1JREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iVGluYW11cyBtYWpvciI+ICBHcmVhdCBUaW5hbW91LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iTm90aG9jZXJjdXMiPkhpZ2hsYW5kIFRpbmFtb3UuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDcnlwdHVyZWxsdXMgc291aSI+TGl0dGxlIFRpbmFtb3UuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDcnlwdHVyZWxsdXMgY2lubmFtb21ldXMiPlRoaWNrZXQgVGluYW1vdS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkNyeXB0dXJlbGx1cyBib3VjYXJkaSI+U2xhdHktYnJlYXN0ZWQgVGluYW1vdS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkNyeXB0dXJlbGx1cyBrZXJyaWFlIj5DaG9jbyBUaW5hbW91LjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgPC9PcmRlcj4KLTxPcmRlciBOYW1lPSJHQVZJSUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iR0FWSUlEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBzdGVsbGF0YSI+UmVkLXRocm9hdGVkIExvb24uPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBhcmN0aWNhIj5BcmN0aWMgTG9vbi48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkdhdmlhIHBhY2lmaWNhIj5QYWNpZmljIExvb24uPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBpbW1lciI+Q29tbW9uIExvb24uPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJHYXZpYSBhZGFtc2lpIj5ZZWxsb3ctYmlsbGVkIExvb24uPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICA8L09yZGVyPgotCi0KLTxPcmRlciBOYW1lPSJQT0RJQ0lQRURJRk9STUVTIj4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJQT0RJQ0lQRURJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iVGFjaHliYXB0dXMgZG9taW5pY3VzIj5MZWFzdCBHcmViZS48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBvZGlseW1idXMgcG9kaWNlcHMiPlBpZWQtYmlsbGVkIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5BdGl0bGFuIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5Ib3JuZWQgR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSIiPlJlZC1uZWNrZWQgR3JlYmUuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSIiPkVhcmVkIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5XZXN0ZXJuIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIj5DbGFyaydzIEdyZWJlLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iIi8+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgIDwvT3JkZXI+Ci0KLQotPE9yZGVyIE5hbWU9IlBST0NFTExBUklJRk9STUVTIj4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJESU9NRURFSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlRoYWxhc3NhcmNoZSBjaGxvcm9yaHluY2hvcyI+WWVsbG93LW5vc2VkIEFsYmF0cm9zcy4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJUaGFsYXNzYXJjaGUgY2F1dGEiPlNoeSBBbGJhdHJvc3MuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iVGhhbGFzc2FyY2hlIG1lbGFub3BocmlzIj5CbGFjay1icm93ZWQgQWxiYXRyb3NzLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBob2ViZXRyaWEgcGFscGVicmF0YSI+TGlnaHQtbWFudGxlZCBBbGJhdHJvc3MuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iRGlvbWVkZWEgZXh1bGFucyI+V2FuZGVyaW5nIEFsYmF0cm9zcy4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaG9lYmFzdHJpYSBpbW11dGFiaWxpcyI+TGF5c2FuIEFsYmF0cm9zcy48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBob2ViYXN0cmlhIG5pZ3JpcGVzIj5CbGFjay1mb290ZWQgQWxiYXRyb3NzLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhvZWJhc3RyaWEgYWxiYXRydXMiPlNob3J0LXRhaWxlZCBBbGJhdHJvc3MuIChOKTwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iUFJPQ0VMTEFSSUlEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJGdWxtYXJ1cyBnbGFjaWFsaXMiPk5vcnRoZXJuIEZ1bG1hci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgbmVnbGVjdGEiPktlcm1hZGVjIFBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGFybWluam9uaWFuYSI+SGVyYWxkIFBldHJlbC4gKEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIHVsdGltYSI+TXVycGh5J3MgUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgaW5leHBlY3RhdGEiPk1vdHRsZWQgUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgY2Fob3ciPkJlcm11ZGEgUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBoYXNpdGF0YSI+QmxhY2stY2FwcGVkIFBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgZXh0ZXJuYSI+SnVhbiBGZXJuYW5kZXogUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgcGhhZW9weWdpYSI+RGFyay1ydW1wZWQgUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBjZXJ2aWNhbGlzIj5XaGl0ZS1uZWNrZWQgUGV0cmVsLiAoSCk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB0ZXJvZHJvbWEgaHlwb2xldWNhIj5Cb25pbiBQZXRyZWwuIChIKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHRlcm9kcm9tYSBuaWdyaXBlbm5pcyI+QmxhY2std2luZ2VkIFBldHJlbC4gKEgsIEEpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGNvb2tpaSI+Q29vaydzIFBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdGVyb2Ryb21hIGxvbmdpcm9zdHJpcyI+U3Rlam5lZ2VyJ3MgUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkJ1bHdlcmlhIGJ1bHdlcmlpIj5CdWx3ZXIncyBQZXRyZWwuIChIKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQnVsd2VyaWEgZmFsbGF4Ij5Kb3VhbmluJ3MgUGV0cmVsLiAoSCwgQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlByb2NlbGxhcmlhIHBhcmtpbnNvbmkiPlBhcmtpbnNvbidzIFBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJDYWxvbmVjdHJpcyBsZXVjb21lbGFzIj5TdHJlYWtlZCBTaGVhcndhdGVyLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkNhbG9uZWN0cmlzIGRpb21lZGVhIj5Db3J5J3MgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBjcmVhdG9wdXMiPlBpbmstZm9vdGVkIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgY2FybmVpcGVzIj5GbGVzaC1mb290ZWQgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBncmF2aXMiPkdyZWF0ZXIgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBwYWNpZmljdXMiPldlZGdlLXRhaWxlZCBTaGVhcndhdGVyLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgYnVsbGVyaSI+QnVsbGVyJ3MgU2hlYXJ3YXRlci4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBncmlzZXVzIj5Tb290eSBTaGVhcndhdGVyLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIHRlbnVpcm9zdHJpcyI+U2hvcnQtdGFpbGVkIFNoZWFyd2F0ZXIuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgbmF0aXZpdGF0aXMiPkNocmlzdG1hcyBTaGVhcndhdGVyLiAoSCk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIHB1ZmZpbnVzIj5NYW54IFNoZWFyd2F0ZXIuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQdWZmaW51cyBhdXJpY3VsYXJpcyI+VG93bnNlbmQncyBTaGVhcndhdGVyLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUHVmZmludXMgb3Bpc3Rob21lbGFzIj5CbGFjay12ZW50ZWQgU2hlYXJ3YXRlci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGxoZXJtaW5pZXJpIj5BdWR1Ym9uJ3MgU2hlYXJ3YXRlci48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlB1ZmZpbnVzIGFzc2ltaWxpcyI+TGl0dGxlIFNoZWFyd2F0ZXIuIChBKTwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iSFlEUk9CQVRJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5pdGVzIG9jZWFuaWN1cyI+V2lsc29uJ3MgU3Rvcm0tUGV0cmVsLiAoTik8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBlbGFnb2Ryb21hIG1hcmluYSI+V2hpdGUtZmFjZWQgU3Rvcm0tUGV0cmVsLiAoQSk8L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ikh5ZHJvYmF0ZXMgcGVsYWdpY3VzIj5FdXJvcGVhbiBTdG9ybS1QZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgZnVyY2F0YSI+Rm9yay10YWlsZWQgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbGV1Y29yaG9hIj5MZWFjaCdzIFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9Ik9jZWFub2Ryb21hIGhvbW9jaHJvYSI+QXNoeSBTdG9ybS1QZXRyZWwuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBjYXN0cm8iPkJhbmQtcnVtcGVkIFN0b3JtLVBldHJlbC4gKE4pPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSB0ZXRoeXMiPldlZGdlLXJ1bXBlZCBTdG9ybS1QZXRyZWwuIChOKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbWVsYW5pYSI+QmxhY2sgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbWFjcm9kYWN0eWxhIj5HdWFkYWx1cGUgU3Rvcm0tUGV0cmVsLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgbWFya2hhbWkiPk1hcmtoYW0ncyBTdG9ybS1QZXRyZWwuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iT2NlYW5vZHJvbWEgdHJpc3RyYW1pIj5UcmlzdHJhbSdzIFN0b3JtLVBldHJlbC4gKEgpPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJPY2Vhbm9kcm9tYSBtaWNyb3NvbWEiPkxlYXN0IFN0b3JtLVBldHJlbC48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgIDwvT3JkZXI+Ci0KLTxPcmRlciBOYW1lPSJQRUxFQ0FOSUZPUk1FUyI+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iUEhBRVRIT05USURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWV0aG9uIGxlcHR1cnVzIj5XaGl0ZS10YWlsZWQgVHJvcGljYmlyZC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWV0aG9uIGFldGhlcmV1cyI+UmVkLWJpbGxlZCBUcm9waWNiaXJkLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhZXRob24gcnVicmljYXVkYSI+UmVkLXRhaWxlZCBUcm9waWNiaXJkLjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iU1VMSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlN1bGEgZGFjdHlsYXRyYSI+TWFza2VkIEJvb2J5LjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iU3VsYSBuZWJvdXhpaSI+Qmx1ZS1mb290ZWQgQm9vYnkuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJTdWxhIHZhcmllZ2F0YSI+UGVydXZpYW4gQm9vYnkuIChBKTwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iU3VsYSBsZXVjb2dhc3RlciI+QnJvd24gQm9vYnkuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJTdWxhIHN1bGEiPlJlZC1mb290ZWQgQm9vYnkuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJNb3J1cyBiYXNzYW51cyI+Tm9ydGhlcm4gR2FubmV0LjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iUEVMRUNBTklEQUUiPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQZWxlY2FudXMgZXJ5dGhyb3JoeW5jaG9zIj5BbWVyaWNhbiBXaGl0ZSBQZWxpY2FuLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGVsZWNhbnVzIG9jY2lkZW50YWxpcyI+QnJvd24gUGVsaWNhbi48L1NwZWNpZXM+Ci0gICAgICAgIDwvRmFtaWx5PgotICAgICAgICA8RmFtaWx5IE5hbWU9IlBIQUxBQ1JPQ09SQUNJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iUGhhbGFjcm9jb3JheCBwZW5pY2lsbGF0dXMiPkJyYW5kdCdzIENvcm1vcmFudC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggYnJhc2lsaWFudXMiPk5lb3Ryb3BpYyBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IGF1cml0dXMiPkRvdWJsZS1jcmVzdGVkIENvcm1vcmFudC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggY2FyYm8iPkdyZWF0IENvcm1vcmFudC48L1NwZWNpZXM+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IlBoYWxhY3JvY29yYXggdXJpbGUiPlJlZC1mYWNlZCBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJQaGFsYWNyb2NvcmF4IHBlbGFnaWN1cyI+UGVsYWdpYyBDb3Jtb3JhbnQuPC9TcGVjaWVzPgotICAgICAgICA8L0ZhbWlseT4KLSAgICAgICAgPEZhbWlseSBOYW1lPSJBTkhJTkdJREFFIj4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iQW5oaW5nYSBhbmhpbmdhIj5BbmhpbmdhLjwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgICAgIDxGYW1pbHkgTmFtZT0iRlJFR0FUSURBRSI+Ci0gICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9IkZyZWdhdGEgbWFnbmlmaWNlbnMiPk1hZ25pZmljZW50IEZyaWdhdGViaXJkLjwvU3BlY2llcz4KLSAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT0iRnJlZ2F0YSBtaW5vciI+R3JlYXQgRnJpZ2F0ZWJpcmQuPC9TcGVjaWVzPgotICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPSJGcmVnYXRhIGFyaWVsIj5MZXNzZXIgRnJpZ2F0ZWJpcmQuIChBKTwvU3BlY2llcz4KLSAgICAgICAgPC9GYW1pbHk+Ci0gICAgPC9PcmRlcj4KLTwvQ2xhc3M+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9iaXJkcy54c2wgYi9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9iaXJkcy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNmY4ZTEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TaW1wbGVUcmFuc2Zvcm0vYmlyZHMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+IAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQ2xhc3MiPgotPEJpcmRJbmZvPgotCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iT3JkZXIiLz4KLTwvQmlyZEluZm8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iT3JkZXIiPgotT3JkZXIgaXM6ICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQE5hbWUiLz4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkZhbWlseSIvPjx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iRmFtaWx5Ij4KLQlGYW1pbHkgaXM6ICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQE5hbWUiLz4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IlNwZWNpZXMgfCBTdWJGYW1pbHkgfCB0ZXh0KCkiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJTdWJGYW1pbHkiPgotCQlTdWJGYW1pbHkgaXMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBOYW1lIi8+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJTcGVjaWVzIHwgdGV4dCgpIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iU3BlY2llcyI+Ci0JPHhzbDpjaG9vc2U+Ci0JICA8eHNsOndoZW4gdGVzdD0ibmFtZSguLik9J1N1YkZhbWlseSciPgotCQk8eHNsOnRleHQ+CTwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBTY2llbnRpZmljX05hbWUiLz4KLQkgIDwveHNsOndoZW4+Ci0JICA8eHNsOm90aGVyd2lzZT4KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBTY2llbnRpZmljX05hbWUiLz4KLQkgIDwveHNsOm90aGVyd2lzZT4KLQk8L3hzbDpjaG9vc2U+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL2Zvby54bWwgYi9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9mb28ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTlmNzliLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL2Zvby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGRvYz5IZWxsbzwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL2Zvby54c2wgYi9zYW1wbGVzL1NpbXBsZVRyYW5zZm9ybS9mb28ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGE4ZDVlLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL2Zvby54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jIj4KLSAgICA8b3V0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9vdXQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtL3JlYWRtZS5odG1sIGIvc2FtcGxlcy9TaW1wbGVUcmFuc2Zvcm0vcmVhZG1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODkzNmYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9TaW1wbGVUcmFuc2Zvcm0vcmVhZG1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT5YYWxhbiBTYW1wbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgyPlhhbGFuIFNhbXBsZXM8L2gyPgotPHA+Rm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzICh3aGF0IHRoZXkgaWxsdXN0cmF0ZSBhbmQgaG93IHRvIHJ1biB0aGVtKSwgc2VlIDxhIGhyZWY9Ii4uLy4uL2RvY3Mvc2FtcGxlcy5odG1sIj5TYW1wbGVzPC9hPi48L3A+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9UcmFjZS9UcmFjZS5qYXZhIGIvc2FtcGxlcy9UcmFjZS9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDU5ZTRiLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvVHJhY2UvVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5UcmFjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5QcmludFRyYWNlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRyYWNlCi17CQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykKLQkgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCAKLQkJCSBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLAotCQkJIGphdmEudXRpbC5Ub29NYW55TGlzdGVuZXJzRXhjZXB0aW9uLCAKLQkJCSBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24JCQkgCi0gIHsKLSAgICAvLyBTZXQgdXAgYSBQcmludFRyYWNlTGlzdGVuZXIgb2JqZWN0IHRvIHByaW50IHRvIGEgZmlsZS4KLSAgICBqYXZhLmlvLkZpbGVXcml0ZXIgZncgPSBuZXcgamF2YS5pby5GaWxlV3JpdGVyKCJldmVudHMubG9nIik7ICAKLSAgICBqYXZhLmlvLlByaW50V3JpdGVyIHB3ID0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIoZncsIHRydWUpOwotICAgIFByaW50VHJhY2VMaXN0ZW5lciBwdGwgPSBuZXcgUHJpbnRUcmFjZUxpc3RlbmVyKHB3KTsKLQotICAgIC8vIFByaW50IGluZm9ybWF0aW9uIGFzIGVhY2ggbm9kZSBpcyAnZXhlY3V0ZWQnIGluIHRoZSBzdHlsZXNoZWV0LgotICAgIHB0bC5tX3RyYWNlRWxlbWVudHMgPSB0cnVlOwotICAgIC8vIFByaW50IGluZm9ybWF0aW9uIGFmdGVyIGVhY2ggcmVzdWx0LXRyZWUgZ2VuZXJhdGlvbiBldmVudC4KLSAgICBwdGwubV90cmFjZUdlbmVyYXRpb24gPSB0cnVlOwotICAgIC8vIFByaW50IGluZm9ybWF0aW9uIGFmdGVyIGVhY2ggc2VsZWN0aW9uIGV2ZW50LgotICAgIHB0bC5tX3RyYWNlU2VsZWN0aW9uID0gdHJ1ZTsKLSAgICAvLyBQcmludCBpbmZvcm1hdGlvbiB3aGVuZXZlciBhIHRlbXBsYXRlIGlzIGludm9rZWQuCi0gICAgcHRsLm1fdHJhY2VUZW1wbGF0ZXMgPSB0cnVlOwotCi0gICAgLy8gU2V0IHVwIHRoZSB0cmFuc2Zvcm1hdGlvbiAgICAKLSAgIAlUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKG5ldyBTdHJlYW1Tb3VyY2UoImZvby54c2wiKSk7Ci0KLSAgICAvLyBDYXN0IHRoZSBUcmFuc2Zvcm1lciBvYmplY3QgdG8gVHJhbnNmb3JtZXJJbXBsLgotICAgIGlmICh0cmFuc2Zvcm1lciBpbnN0YW5jZW9mIFRyYW5zZm9ybWVySW1wbCkgCi0JICB7Ci0gICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXJJbXBsID0gKFRyYW5zZm9ybWVySW1wbCl0cmFuc2Zvcm1lcjsKLSAgICAgIC8vIFJlZ2lzdGVyIHRoZSBUcmFjZUxpc3RlbmVyIHdpdGggYSBUcmFjZU1hbmFnZXIgYXNzb2NpYXRlZCAKLSAgICAgIC8vIHdpdGggdGhlIFRyYW5zZm9ybWVySW1wbC4KLSAgICAgIFRyYWNlTWFuYWdlciB0ck1nciA9IHRyYW5zZm9ybWVySW1wbC5nZXRUcmFjZU1hbmFnZXIoKTsKLSAgICAgIHRyTWdyLmFkZFRyYWNlTGlzdGVuZXIocHRsKTsKLSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy8gUGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24gLS1wcmludGluZyBpbmZvcm1hdGlvbiB0bwotICAgICAgLy8gdGhlIGV2ZW50cyBsb2cgZHVyaW5nIHRoZSBwcm9jZXNzLgotICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtCi0gICAgICAgICAgICAgICAgICAgICAgICAgKCBuZXcgU3RyZWFtU291cmNlKCJmb28ueG1sIiksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChuZXcgamF2YS5pby5GaWxlV3JpdGVyKCJmb28ub3V0IikpICk7Ci0gICAgfQotICAgIC8vIENsb3NlIHRoZSBQcmludFdyaXRlciBhbmQgRmlsZVdyaXRlci4KLSAgICBwdy5jbG9zZSgpOwotICAgIGZ3LmNsb3NlKCk7Ci0gICAJU3lzdGVtLm91dC5wcmludGxuKCIqKlRoZSBvdXRwdXQgaXMgaW4gZm9vLm91dDsgdGhlIGxvZyBpcyBpbiBldmVudHMubG9nICoqKioiKTsJCi0gICAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1RyYWNlL2Zvby54bWwgYi9zYW1wbGVzL1RyYWNlL2Zvby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNzJlMTUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9UcmFjZS9mb28ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPHVwbG9hZD4KLSAgPGRheT4KLSAgICA8ZG93PnR1ZTwvZG93PgotICAgIDxvcmRlcj4KLSAgICAgIDxsaW5lPgotICAgICAgICAgPHByb2R1Y3Q+QmVsdDwvcHJvZHVjdD4KLSAgICAgICAgIDxwcmljZT41LjU0PC9wcmljZT4KLSAgICAgIDwvbGluZT4KLSAgICA8L29yZGVyPgotICA8L2RheT4KLSAgPGRheT4KLSAgICA8ZG93PndlZDwvZG93PgotICA8L2RheT4KLSAgPGRheT4KLSAgICA8ZG93PnRodTwvZG93PgotICAgIDxvcmRlcj4KLSAgICAgIDxsaW5lPgotICAgICAgICAgPHByb2R1Y3Q+Qm9vdHM8L3Byb2R1Y3Q+Ci0gICAgICAgICA8cHJpY2U+OS4yMzwvcHJpY2U+Ci0gICAgICA8L2xpbmU+Ci0gICAgPC9vcmRlcj4KLSAgPC9kYXk+Ci0gIDxkYXk+Ci0gICAgPGRvdz5mcmk8L2Rvdz4KLSAgICA8b3JkZXI+Ci0gICAgPC9vcmRlcj4KLSAgICA8b3JkZXI+Ci0gICAgPC9vcmRlcj4KLSAgPC9kYXk+Ci0gIDxkYXk+Ci0gICAgPGRvdz5zYXQ8L2Rvdz4KLSAgICA8b3JkZXI+Ci0gICAgICA8bGluZT4KLSAgICAgICAgIDxwcm9kdWN0PkphY2tldDwvcHJvZHVjdD4KLSAgICAgICAgIDxwcmljZT45Ljg0PC9wcmljZT4KLSAgICAgIDwvbGluZT4KLSAgICA8L29yZGVyPgotICA8L2RheT4KLSAgPGRheT4KLSAgICA8ZG93Pm1vbjwvZG93PgotICAgIDxvcmRlcj4KLSAgICA8L29yZGVyPgotICAgIDxvcmRlcj4KLSAgICAgIDxsaW5lPgotICAgICAgICAgPHByb2R1Y3Q+VGllPC9wcm9kdWN0PgotICAgICAgICAgPHByaWNlPjUuMzc8L3ByaWNlPgotICAgICAgPC9saW5lPgotICAgIDwvb3JkZXI+Ci0gIDwvZGF5PgotICA8ZGF5PgotICAgIDxkb3c+dHVlPC9kb3c+Ci0gIDwvZGF5PgotICA8ZGF5PgotICAgIDxkb3c+d2VkPC9kb3c+Ci0gICAgPG9yZGVyPgotICAgIDwvb3JkZXI+Ci0gIDwvZGF5PgotICA8ZGF5PgotICAgIDxkb3c+dGh1PC9kb3c+Ci0gICAgPG9yZGVyPgotICAgICAgPGxpbmU+Ci0gICAgICAgICA8cHJvZHVjdD5PdmVyYWxsczwvcHJvZHVjdD4KLSAgICAgICAgIDxwcmljZT4zLjE2PC9wcmljZT4KLSAgICAgIDwvbGluZT4KLSAgICA8L29yZGVyPgotICA8L2RheT4KLTwvdXBsb2FkPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9UcmFjZS9mb28ueHNsIGIvc2FtcGxlcy9UcmFjZS9mb28ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc1ZWU3Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvVHJhY2UvZm9vLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldAotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLSAgPCEtLSBGaWxlTmFtZTogbWlzYy1ldmFucyAtLT4KLSAgPCEtLSBEb2N1bWVudDogaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCAtLT4KLSAgPCEtLSBEb2NWZXJzaW9uOiAxOTk5MTExNiAtLT4KLSAgPCEtLSBQdXJwb3NlOiBDT1BZIG9mIHBlcmYgdGVzdDsiQSBQcmFjdGljYWwgU3VnZ2VzdGlvbiBmb3IgWFNMVCBQZXJmb3JtYW5jZSBJbXByb3ZlbWVudCIgYnkgQ2xhcmsgRXZhbnMuIC0tPgotCi0gICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRheS1saXN0IiAKLSAgICAgc2VsZWN0PSIvL2Rvd1tub3QoLj1mb2xsb3dpbmc6OmRvdyldIiAvPgotCi0gICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb2R1Y3QtbGlzdCIgCi0gICAgICAgICAgICBzZWxlY3Q9Ii8vcHJvZHVjdFtub3QoLj1mb2xsb3dpbmc6OnByb2R1Y3QpXSIgLz4KLSAgICAgCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJteS10ZXN0Ij48YT48Yi8+PC9hPjwveHNsOnZhcmlhYmxlPgotICA8aHRtbD4KLSAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSIkbXktdGVzdCIvPgotICAgIDxib2R5PgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48L3RkPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRheS1saXN0Ij4KLSAgICAgICAgICA8eHNsOnNvcnQgb3JkZXI9ImFzY2VuZGluZyIgc2VsZWN0PSIuIiAvPgotICAgICAgICAgIDx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvdGg+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgPC90cj4KLSAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcHJvZHVjdC1saXN0Ij4KLSAgICAgICAgPHhzbDpzb3J0ICAgIG9yZGVyPSJhc2NlbmRpbmciIHNlbGVjdD0iLiIgLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9kdWN0IiBzZWxlY3Q9Ii4iIC8+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb2R1Y3QiIC8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRheS1saXN0Ij4KLSAgICAgICAgICAgIDx4c2w6c29ydCBvcmRlcj0iYXNjZW5kaW5nIiBzZWxlY3Q9Ii4iIC8+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRheSIgc2VsZWN0PSIuIiAvPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIAotICAgICAgICAgICAgIHNlbGVjdD0ic3VtKC8vcHJpY2VbLi4vcHJvZHVjdD0kcHJvZHVjdF1bLi4vLi4vLi4vZG93PSRkYXldKSIKLS8+IC4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiAKLSAgICAgICAgICAgICAgc2VsZWN0PSJzdW0oLy9wcmljZVsuLi9wcm9kdWN0PSRwcm9kdWN0XSkiIC8+IC4KLSAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PjwvdGQ+Ci0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZGF5LWxpc3QiPgotICAgICAgICAgIDx4c2w6c29ydCAgICBvcmRlcj0iYXNjZW5kaW5nIiBzZWxlY3Q9Ii4iIC8+Ci0gICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJkYXkiIHNlbGVjdD0iLiIgLz4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIAotICAgICAgICAgICAgICBzZWxlY3Q9InN1bSgvL3ByaWNlWy4uLy4uLy4uL2Rvdz0kZGF5XSkiIC8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKC8vcHJpY2UpIiAvPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDwvYm9keT4KLSAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UEkvVXNlU3R5bGVzaGVldFBJLmphdmEgYi9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQSS9Vc2VTdHlsZXNoZWV0UEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEwYzcxNC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQSS9Vc2VTdHlsZXNoZWV0UEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vLyBJbXBvcnRlZCBUcmFYIGNsYXNzZXMKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotLy8gSW1wb3J0ZWQgamF2YS5pbyBjbGFzc2VzCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CQotCi1wdWJsaWMgY2xhc3MgVXNlU3R5bGVzaGVldFBJCi17Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0JICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCXsKLQkgIFN0cmluZyBtZWRpYT0gbnVsbCAsIHRpdGxlID0gbnVsbCwgY2hhcnNldCA9IG51bGw7Ci0JICB0cnkKLQkgIHsJCi0gICAgCVRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgU291cmNlIHN0eWxlc2hlZXQgPSB0RmFjdG9yeS5nZXRBc3NvY2lhdGVkU3R5bGVzaGVldAotICAgICAgICAobmV3IFN0cmVhbVNvdXJjZSgiZm9vWC54bWwiKSxtZWRpYSwgdGl0bGUsIGNoYXJzZXQpOwotICAgICAgCi0gICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHN0eWxlc2hlZXQpOwotICAgICAgICAKLQkJICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBTdHJlYW1Tb3VyY2UoImZvb1gueG1sIiksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtUmVzdWx0KG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oImZvby5vdXQiKSkpOwotICAgICAgIAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqIFRoZSByZXN1bHQgaXMgaW4gZm9vLm91dCAqKioqKioqKioqKioqIik7Ci0gICAgICAgCi0JICB9Ci0gIAkgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgIHsKLQkgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQkgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UEkvZm9vLnhzbCBiL3NhbXBsZXMvVXNlU3R5bGVzaGVldFBJL2Zvby54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYThkNWUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UEkvZm9vLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+IAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MiPgotICAgIDxvdXQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L291dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UEkvZm9vWC54bWwgYi9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQSS9mb29YLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q0Yjc0My4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQSS9mb29YLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSJmb28ueHNsIj8+Ci08ZG9jPkhlbGxvPC9kb2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UGFyYW0vVXNlU3R5bGVzaGVldFBhcmFtLmphdmEgYi9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQYXJhbS9Vc2VTdHlsZXNoZWV0UGFyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiM2M5MS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQYXJhbS9Vc2VTdHlsZXNoZWV0UGFyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYU0xUNEoiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLS8vIEltcG9ydGVkIFRyYVggY2xhc3NlcwotLy8gSW1wb3J0ZWQgVHJhWCBjbGFzc2VzCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLS8vIEltcG9ydGVkIFNBWCBjbGFzc2VzCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vLyBJbXBvcnRlZCBqYXZhIGNsYXNzZXMKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBVc2UgY29tbWFuZC1saW5lIGlucHV0IGFzIGEgc3R5bGVzaGVldCBwYXJhbWV0ZXIuCi0gICAqLwotCi1wdWJsaWMgY2xhc3MgVXNlU3R5bGVzaGVldFBhcmFtCi17Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0JdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIAotICAgICAgICAgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgkgICAKLQl7Ci0gICAgaWYoYXJncy5sZW5ndGggIT0gMSkKLSAgICB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlBsZWFzZSBwYXNzIG9uZSBzdHJpbmcgdG8gdGhpcyBwcm9ncmFtIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAJLy8gR2V0IHRoZSBwYXJhbWV0ZXIgdmFsdWUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICAgIFN0cmluZyBwYXJhbVZhbHVlID0gYXJnc1swXTsKLQkKLSAgIAlUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKG5ldyBTdHJlYW1Tb3VyY2UoImZvby54c2wiKSk7Ci0KLQkvLyBTZXQgdGhlIHBhcmFtZXRlci4gSSBjYW4ndCBnZXQgbm9uLW51bGwgbmFtZXNwYWNlcyB0byB3b3JrISEKLSAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoInBhcmFtMSIsCS8qIHBhcmFtZXRlciBuYW1lICovCi0gICAgICAgICAgICAgICAJCQkJCQkJIHBhcmFtVmFsdWUgLyogcGFyYW1ldGVyIHZhbHVlICovICk7Ci0gICAgCi0gICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBTdHJlYW1Tb3VyY2UoImZvby54bWwiKSwgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0gIH0gICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQYXJhbS9mb28ueG1sIGIvc2FtcGxlcy9Vc2VTdHlsZXNoZWV0UGFyYW0vZm9vLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjMzJiNS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQYXJhbS9mb28ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxkb2M+SGVsbG88L2RvYz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvVXNlU3R5bGVzaGVldFBhcmFtL2Zvby54c2wgYi9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQYXJhbS9mb28ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWUxOWRjLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvVXNlU3R5bGVzaGVldFBhcmFtL2Zvby54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDpwYXJhbSBuYW1lPSJwYXJhbTEiIHNlbGVjdD0iJ2RlZmF1bHQgdmFsdWUnIi8+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+Ci0gICAgPG91dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmFtMSIvPjwvb3V0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1VzZVN0eWxlc2hlZXRQYXJhbS9yZWFkbWUuaHRtbCBiL3NhbXBsZXMvVXNlU3R5bGVzaGVldFBhcmFtL3JlYWRtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg5MzZmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvVXNlU3R5bGVzaGVldFBhcmFtL3JlYWRtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+WGFsYW4gU2FtcGxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMj5YYWxhbiBTYW1wbGVzPC9oMj4KLTxwPkZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2FtcGxlcyAod2hhdCB0aGV5IGlsbHVzdHJhdGUgYW5kIGhvdyB0byBydW4gdGhlbSksIHNlZSA8YSBocmVmPSIuLi8uLi9kb2NzL3NhbXBsZXMuaHRtbCI+U2FtcGxlczwvYT4uPC9wPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvVXNlWE1MRmlsdGVycy9Vc2VYTUxGaWx0ZXJzLmphdmEgYi9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvVXNlWE1MRmlsdGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmU3OGZkLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvVXNlWE1MRmlsdGVycy9Vc2VYTUxGaWx0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLS8vIEltcG9ydGVkIFRyYVggY2xhc3NlcwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UZW1wbGF0ZXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRlbXBsYXRlc0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyOyAgICAgICAgICAgICAgCi0KLS8vIEltcG9ydGVkIFNBWCBjbGFzc2VzCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlBhcnNlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlBhcnNlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxGaWx0ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci0KLS8vIEltcG9ydGVkIERPTSBjbGFzc2VzCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy8gSW1wb3J0ZWQgU2VyaWFsaXplciBjbGFzc2VzCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZS5TZXJpYWxpemVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5PdXRwdXRQcm9wZXJ0aWVzOwotCi0vLyBJbXBvcnRlZCBKQVZBIEFQSSBmb3IgWE1MIFBhcnNpbmcgY2xhc3NlcwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247IAotCi0vLyBJbXBvcnRlZCBqYXZhLmlvIGNsYXNzZXMKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gY2hhaW4gYSBzZXJpZXMgb2YgdHJhbnNmb3JtYXRpb25zIGJ5Ci0gICAqIHBpcGluZyBTQVggZXZlbnRzIGZyb20gb25lIFRyYW5zZm9ybWVyIHRvIGFub3RoZXIuIEVhY2ggVHJhbnNmb3JtZXIKLSAgICogb3BlcmF0ZXMgYXMgYSBTQVgyIFhNTEZpbHRlci9YTUxSZWFkZXIuCi0gICAqLwotcHVibGljIGNsYXNzIFVzZVhNTEZpbHRlcnMKLXsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLQl0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgCi0gICAgICAgICBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uCSAgIAotCXsKLSAgICAvLyBJbnN0YW50aWF0ZSAgYSBUcmFuc2Zvcm1lckZhY3RvcnkuCi0gIAlUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IHN1cHBvcnRzIFRoZSB1c2UgdWYgU0FYU291cmNlIAotICAgIC8vIGFuZCBTQVhSZXN1bHQKLSAgICBpZiAodEZhY3RvcnkuZ2V0RmVhdHVyZShTQVhTb3VyY2UuRkVBVFVSRSkgJiYgdEZhY3RvcnkuZ2V0RmVhdHVyZShTQVhSZXN1bHQuRkVBVFVSRSkpCi0gICAgeyAKLSAgICAgIC8vIENhc3QgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSB0byBTQVhUcmFuc2Zvcm1lckZhY3RvcnkuCi0gICAgICBTQVhUcmFuc2Zvcm1lckZhY3Rvcnkgc2F4VEZhY3RvcnkgPSAoKFNBWFRyYW5zZm9ybWVyRmFjdG9yeSkgdEZhY3RvcnkpOwotICAJICAvLyBDcmVhdGUgYW4gWE1MRmlsdGVyIGZvciBlYWNoIHN0eWxlc2hlZXQuCi0gICAgICBYTUxGaWx0ZXIgeG1sRmlsdGVyMSA9IHNheFRGYWN0b3J5Lm5ld1hNTEZpbHRlcihuZXcgU3RyZWFtU291cmNlKCJmb28xLnhzbCIpKTsKLSAgICAgIFhNTEZpbHRlciB4bWxGaWx0ZXIyID0gc2F4VEZhY3RvcnkubmV3WE1MRmlsdGVyKG5ldyBTdHJlYW1Tb3VyY2UoImZvbzIueHNsIikpOwotICAgICAgWE1MRmlsdGVyIHhtbEZpbHRlcjMgPSBzYXhURmFjdG9yeS5uZXdYTUxGaWx0ZXIobmV3IFN0cmVhbVNvdXJjZSgiZm9vMy54c2wiKSk7Ci0gICAgCi0gICAgICAvLyBDcmVhdGUgYW4gWE1MUmVhZGVyLgotCSAgICBYTUxSZWFkZXIgcmVhZGVyID0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKLSAgICAKLSAgICAgIC8vIHhtbEZpbHRlcjEgdXNlcyB0aGUgWE1MUmVhZGVyIGFzIGl0cyByZWFkZXIuCi0gICAgICB4bWxGaWx0ZXIxLnNldFBhcmVudChyZWFkZXIpOwotICAgIAotICAgICAgLy8geG1sRmlsdGVyMiB1c2VzIHhtbEZpbHRlcjEgYXMgaXRzIHJlYWRlci4KLSAgICAgIHhtbEZpbHRlcjIuc2V0UGFyZW50KHhtbEZpbHRlcjEpOwotICAgIAotICAgICAgLy8geG1sRmlsdGVyMyB1c2VzIHhtbEZpbHRlcjIgYXMgaXRzIHJlYWRlci4KLSAgICAgIHhtbEZpbHRlcjMuc2V0UGFyZW50KHhtbEZpbHRlcjIpOwotICAgIAotICAgICAgLy8geG1sRmlsdGVyMyBvdXRwdXRzIFNBWCBldmVudHMgdG8gdGhlIHNlcmlhbGl6ZXIuCi0gICAgICBTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBTZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPdXRwdXRQcm9wZXJ0aWVzLmdldERlZmF1bHRNZXRob2RQcm9wZXJ0aWVzKCJ4bWwiKSk7ICAgICAgICAKLSAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0U3RyZWFtKFN5c3RlbS5vdXQpOwotICAgICAgeG1sRmlsdGVyMy5zZXRDb250ZW50SGFuZGxlcihzZXJpYWxpemVyLmFzQ29udGVudEhhbmRsZXIoKSk7Ci0KLSAgCSAgLy8gUGVyZm9ybSB0aGUgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9ucyBhcyBmb2xsb3dzOgotCSAgICAvLyAgIC0gdHJhbnNmb3JtZXIzIGdldHMgaXRzIHBhcmVudCAodHJhbnNmb3JtZXIyKSBhcyB0aGUgWE1MUmVhZGVyL1hNTEZpbHRlcgotCSAgICAvLyAgICAgYW5kIGNhbGxzIHRyYW5zZm9ybWVyMi5wYXJzZShuZXcgSW5wdXRTb3VyY2UoImZvby54bWwiKSkuCi0gICAgICAvLyAgIC0gdHJhbnNmb3JtZXIyIGdldHMgaXRzIHBhcmVudCAodHJhbnNmb3JtZXIxKSBhcyB0aGUgWE1MUmVhZGVyL1hNTEZpbHRlcgotCSAgICAvLyAgICAgYW5kIGNhbGxzIHRyYW5zZm9ybWVyMS5wYXJzZShuZXcgSW5wdXRTb3VyY2UoImZvby54bWwiKSkuIAotICAgICAgLy8gICAtIHRyYW5zZm9ybWVyMSBnZXRzIGl0cyBwYXJlbnQgKHJlYWRlciwgYSBTQVhQYXJzZXIpIGFzIHRoZSBYTUxSZWFkZXIgCi0gICAgICAvLyAgICAgYW5kIGNhbGxzIHJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoImZvby54bWwiKSkuCi0JICAgIC8vICAgLSByZWFkZXIgcGFyc2VzIHRoZSBYTUwgZG9jdW1lbnQgYW5kIHNlbmRzIHRoZSBTQVggcGFyc2UgZXZlbnRzIHRvIHRyYW5zZm9ybWVyMSwgCi0JICAgIC8vICAgICB3aGljaCBwZXJmb3JtcyB0cmFuc2Zvcm1hdGlvbiAxIGFuZCBzZW5kcyB0aGUgb3V0cHV0IHRvIHRyYW5zZm9ybWVyMi4KLSAgCSAgLy8gICAtIHRyYW5zZm9ybWVyMiBwYXJzZXMgdGhlIHRyYW5zZm9ybWF0aW9uIDEgb3V0cHV0LCBwZXJmb3JtcyB0cmFuc2Zvcm1hdGlvbiAyLCBhbmQgCi0JICAgIC8vICAgICBzZW5kcyB0aGUgb3V0cHV0IHRvIHRyYW5zZm9ybWVyMy4KLQkgICAgLy8gICAtIHRyYW5zZm9ybWVyMyBwYXJzZXMgdGhlIHRyYW5zZm9ybWF0aW9uIDIgb3V0cHV0LCBwZXJmb3JtcyB0cmFuc2Zvcm1hdGlvbiAzLAotICAJICAvLyAgICAgYW5kIHNlbmRzIHRoZSBvdXRwdXQgdG8gdGhlIHNlcmlhbGl6ZXIuCi0gICAgICB4bWxGaWx0ZXIzLnBhcnNlKG5ldyBJbnB1dFNvdXJjZSgiZm9vLnhtbCIpKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvZm9vLnhtbCBiL3NhbXBsZXMvVXNlWE1MRmlsdGVycy9mb28ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTlmNzliLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvVXNlWE1MRmlsdGVycy9mb28ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxkb2M+SGVsbG88L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvZm9vMS54c2wgYi9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvZm9vMS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYThkNWUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Vc2VYTUxGaWx0ZXJzL2ZvbzEueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+Ci0gICAgPG91dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvb3V0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvZm9vMi54c2wgYi9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvZm9vMi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3Y2QxOTcuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Vc2VYTUxGaWx0ZXJzL2ZvbzIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im91dCI+Ci0gICAgPG91dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPiAuLi5nb29kIHRvIHNlZSB5b3UgYWdhaW4hPC9vdXQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvVXNlWE1MRmlsdGVycy9mb28zLnhzbCBiL3NhbXBsZXMvVXNlWE1MRmlsdGVycy9mb28zLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjZmFhNi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvZm9vMy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ib3V0Ij4KLSAgICA8b3V0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+IC4uLmFuZCBnb29kYnkhPC9vdXQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvVXNlWE1MRmlsdGVycy9yZWFkbWUuaHRtbCBiL3NhbXBsZXMvVXNlWE1MRmlsdGVycy9yZWFkbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4OTM2Zi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL1VzZVhNTEZpbHRlcnMvcmVhZG1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT5YYWxhbiBTYW1wbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgyPlhhbGFuIFNhbXBsZXM8L2gyPgotPHA+Rm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzICh3aGF0IHRoZXkgaWxsdXN0cmF0ZSBhbmQgaG93IHRvIHJ1biB0aGVtKSwgc2VlIDxhIGhyZWY9Ii4uLy4uL2RvY3Mvc2FtcGxlcy5odG1sIj5TYW1wbGVzPC9hPi48L3A+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zLzEtcmVkaXIueG1sIGIvc2FtcGxlcy9leHRlbnNpb25zLzEtcmVkaXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTlmMDVhLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy8xLXJlZGlyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTxkb2M+Ci0gIDxmb28gZmlsZT0iMS1yZWRpci5vdXQiPgotICAgIFRlc3RpbmcgUmVkaXJlY3QgZXh0ZW5zaW9uOgotICAgIDxiYXI+QSBmb28gc3ViZWxlbWVudCB0ZXh0IG5vZGU8L2Jhcj4KLSAgPC9mb28+Ci0gIDxtYWluPgotICAgIEV2ZXJ5dGhpbmcgZWxzZQotICA8L21haW4+ICAKLTwvZG9jPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zLzEtcmVkaXIueHNsIGIvc2FtcGxlcy9leHRlbnNpb25zLzEtcmVkaXIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2U2OWMyLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy8xLXJlZGlyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgIHhtbG5zOnJlZGlyZWN0PSJvcmcuYXBhY2hlLnhhbGFuLmxpYi5SZWRpcmVjdCIKLSAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0icmVkaXJlY3QiPgotCi0gIDxseHNsdDpjb21wb25lbnQgcHJlZml4PSJyZWRpcmVjdCIgZWxlbWVudHM9IndyaXRlIG9wZW4gY2xvc2UiIGZ1bmN0aW9ucz0iIj4KLSAgICA8bHhzbHQ6c2NyaXB0IGxhbmc9ImphdmFjbGFzcyIgc3JjPSJvcmcuYXBhY2hlLnhhbGFuLmxpYi5SZWRpcmVjdCIvPgotICA8L2x4c2x0OmNvbXBvbmVudD4gIAotICAgIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8c3RhbmRhcmQtb3V0PgotICAgICAgU3RhbmRhcmQgb3V0cHV0OgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwvc3RhbmRhcmQtb3V0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8IS0tIG5vdCByZWRpcmVjdGVkIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MvbWFpbiI+Ci0gICAgPG1haW4+Ci0gICAgLS0gbG9vayBpbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL2RvYy9mb28vQGZpbGUiLz4gZm9yIHRoZSByZWRpcmVjdGVkIG91dHB1dCAtLQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwvbWFpbj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIHJlZGlyZWN0ZWQgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYy9mb28iPgotICAgIDwhLS0gZ2V0IHJlZGlyZWN0IGZpbGUgbmFtZSBmcm9tIFhNTCBpbnB1dCAtLT4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgc2VsZWN0PSJAZmlsZSI+Ci0gICAgICA8Zm9vLW91dD4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgPC9mb28tb3V0PgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwhLS0gcmVkaXJlY3RlZCAoZnJvbSB0aGUgeHNsOmFwcGx5LXRlbXBsYXRlcyBhYm92ZS4gSS5lLiwgYmFyIGlzIGluIC9kb2MvZm9vIC0tPiAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImJhciI+Ci0gICAgPGZvb2Jhci1vdXQ+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC9mb29iYXItb3V0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zLzItYmFzaWNKc2NyaXB0LnhtbCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy8yLWJhc2ljSnNjcmlwdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNjZjYTEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zLzItYmFzaWNKc2NyaXB0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08ZG9jPgotICA8ZGVhZGxpbmUgbnVtZGF5cz0iMiIvPgotPC9kb2M+ICAKLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvMi1iYXNpY0pzY3JpcHQueHNsIGIvc2FtcGxlcy9leHRlbnNpb25zLzItYmFzaWNKc2NyaXB0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxOWNmNy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvMi1iYXNpY0pzY3JpcHQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tTmFtZXNwYWNlcyBhcmUgZ2xvYmFsIGlmIHlvdSBzZXQgdGhlbSBpbiB0aGUgc3R5bGVzaGVldCBlbGVtZW50LS0+Ci08eHNsOnN0eWxlc2hlZXQgCi0gICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIAotICAgIHZlcnNpb249IjEuMCIgICAKLSAgICB4bWxuczpseHNsdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCi0gICAgeG1sbnM6bXktZXh0PSJleHQyIgotICAgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJteS1leHQiPgotICAgIAotICA8IS0tVGhlIGNvbXBvbmVudCBhbmQgaXRzIHNjcmlwdCBhcmUgaW4gdGhlIGx4c2x0IG5hbWVzcGFjZSBhbmQgZGVmaW5lIHRoZSBpbXBsZW1lbnRhdGlvbi0tPgotICA8bHhzbHQ6Y29tcG9uZW50IHByZWZpeD0ibXktZXh0IiBlbGVtZW50cz0idGltZWxhcHNlIiBmdW5jdGlvbnM9ImdldGRhdGUiPgotICAgIDxseHNsdDpzY3JpcHQgbGFuZz0iamF2YXNjcmlwdCI+Ci0gICAgICB2YXIgbXVsdGlwbGllcj0xOwotICAgICAgLy8gRXh0ZW5zaW9uIGVsZW1lbnQgaW1wbGVtZW50YXRpb25zIGFsd2F5cyB0YWtlIHR3byBhcmd1bWVudHMuIFRoZSBmaXJzdAotICAgICAgLy8gYXJndW1lbnQgaXMgdGhlIFhTTCBQcm9jZXNzb3IgY29udGV4dDsgdGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgZWxlbWVudC4KLSAgICAgIGZ1bmN0aW9uIHRpbWVsYXBzZSh4c2xQcm9jZXNzb3JDb250ZXh0LCBlbGVtKQotICAgICAgewotICAgICAgICBtdWx0aXBsaWVyPXBhcnNlSW50KGVsZW0uZ2V0QXR0cmlidXRlKCJtdWx0aXBsaWVyIikpOwotICAgICAgICAvLyBUaGUgZWxlbWVudCByZXR1cm4gdmFsdWUgaXMgcGxhY2VkIGluIHRoZSByZXN1bHQgdHJlZS4KLSAgICAgICAgLy8gSWYgeW91IGRvIG5vdCB3YW50IGEgcmV0dXJuIHZhbHVlLCByZXR1cm4gbnVsbC4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICBmdW5jdGlvbiBnZXRkYXRlKG51bWRheXMpCi0gICAgICB7Ci0gICAgICAgIHZhciBkID0gbmV3IERhdGUoKTsKLSAgICAgICAgZC5zZXREYXRlKGQuZ2V0RGF0ZSgpICsgcGFyc2VJbnQobnVtZGF5cyptdWx0aXBsaWVyKSk7Ci0gICAgICAgIHJldHVybiBkLnRvTG9jYWxlU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgPC9seHNsdDpzY3JpcHQ+Ci0gIDwvbHhzbHQ6Y29tcG9uZW50PgotICAgICAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRlYWRsaW5lIj4KLSAgICA8cD48bXktZXh0OnRpbWVsYXBzZSBtdWx0aXBsaWVyPSIyIi8+V2UgaGF2ZSByZWNlaXZlZCB5b3VyIGVucXVpcnkgYW5kIHdpbGwgCi0gICAgICByZXNwb25kIGJ5IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJteS1leHQ6Z2V0ZGF0ZShzdHJpbmcoQG51bWRheXMpKSIvPjwvcD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zLzMtamF2YS1uYW1lc3BhY2UueG1sIGIvc2FtcGxlcy9leHRlbnNpb25zLzMtamF2YS1uYW1lc3BhY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjJlYjQ0Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy8zLWphdmEtbmFtZXNwYWNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+IAotPGRvYz4KLSAgIDxkYXRlCi0gICAgeWVhcj0iMjAwMSIgbW9udGg9IjUiIGRheT0iMjciCi0gICAgZm9ybWF0PSJFRUVFLCBNTU0gZGQsIHl5eXkiLz4KLTwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy8zLWphdmEtbmFtZXNwYWNlLnhzbCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy8zLWphdmEtbmFtZXNwYWNlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDViNmU1OS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvMy1qYXZhLW5hbWVzcGFjZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPgotICAgICAgICAgICAgICAgIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii9kb2MvZGF0ZSIvPiAKLSAgPC94c2w6dGVtcGxhdGU+Ci0gCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGUiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ieWVhciIgc2VsZWN0PSJzdHJpbmcoQHllYXIpIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtb250aCIgc2VsZWN0PSJzdHJpbmcoQG1vbnRoKSIvPiAKLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRheSIgc2VsZWN0PSJzdHJpbmcoQGRheSkiLz4gICAgICAgICAgCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmb3JtYXQiIHNlbGVjdD0ic3RyaW5nKEBmb3JtYXQpIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmb3JtYXR0ZXIiICAgICAgIAotICAgICAgICAgc2VsZWN0PSJqYXZhOmphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0Lm5ldygkZm9ybWF0KSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZGF0ZSIgCi0gICAgICAgICBzZWxlY3Q9ImphdmE6SW50RGF0ZS5nZXREYXRlKCR5ZWFyLCRtb250aCwkZGF5KSIvPgotICAgIDxwPkRhdGU6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJqYXZhOmZvcm1hdCgkZm9ybWF0dGVyLCAkZGF0ZSkiLz48L3A+Ci0gIDwveHNsOnRlbXBsYXRlPgotIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy80LW51bWxpc3RKYXZhLnhzbCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy80LW51bWxpc3RKYXZhLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmOTkyNC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvNC1udW1saXN0SmF2YS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgICAgICAgICAgICAgIHhtbG5zOmNvdW50ZXI9Ik15Q291bnRlciIKLSAgICAgICAgICAgICAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0iY291bnRlciIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPgotCi0KLSAgPGx4c2x0OmNvbXBvbmVudCBwcmVmaXg9ImNvdW50ZXIiCi0gICAgICAgICAgICAgICAgICAgZWxlbWVudHM9ImluaXQgaW5jciIgZnVuY3Rpb25zPSJyZWFkIj4KLSAgICA8bHhzbHQ6c2NyaXB0IGxhbmc9ImphdmFjbGFzcyIgc3JjPSJNeUNvdW50ZXIiLz4KLSAgPC9seHNsdDpjb21wb25lbnQ+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPEhUTUw+Ci0gICAgICA8SDE+SmF2YSBFeGFtcGxlPC9IMT4KLSAgICAgIDxjb3VudGVyOmluaXQgbmFtZT0iaW5kZXgiIHZhbHVlPSIxIi8+Ci0gICAgICA8cD5IZXJlIGFyZSB0aGUgbmFtZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGJ5IGxhc3QgbmFtZTo8L3A+Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZG9jL25hbWUiPgotICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbGFzdCIvPgotICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAZmlyc3QiLz4KLSAgICAgICAgPHA+Ci0gICAgICAgIDx4c2w6dGV4dD5bPC94c2w6dGV4dD4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50ZXI6cmVhZCgnaW5kZXgnKSIvPgotICAgICAgICA8eHNsOnRleHQ+XS4gPC94c2w6dGV4dD4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYXN0Ii8+Ci0gICAgICAgIDx4c2w6dGV4dD4sIDwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmlyc3QiLz4KLSAgICAgICAgPC9wPgotICAgICAgICA8Y291bnRlcjppbmNyIG5hbWU9ImluZGV4Ii8+Ci0gICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8L0hUTUw+Ci0gIDwveHNsOnRlbXBsYXRlPgotIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy81LW51bWxpc3RKc2NyaXB0LnhzbCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy81LW51bWxpc3RKc2NyaXB0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzNTFjYi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvNS1udW1saXN0SnNjcmlwdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgICAgICAgICAgICAgIHhtbG5zOmNvdW50ZXI9Ik15Q291bnRlciIKLSAgICAgICAgICAgICAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0iY291bnRlciIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPgotCi0gIDxseHNsdDpjb21wb25lbnQgcHJlZml4PSJjb3VudGVyIgotICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzPSJpbml0IGluY3IiIGZ1bmN0aW9ucz0icmVhZCI+Ci0gICAgPGx4c2x0OnNjcmlwdCBsYW5nPSJqYXZhc2NyaXB0Ij4KLSAgICAgIHZhciBjb3VudGVycyA9IG5ldyBBcnJheSgpOwotCi0gICAgICBmdW5jdGlvbiBpbml0ICh4c2xwcm9jLCBlbGVtKSB7Ci0gICAgICAgIG5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZSAoIm5hbWUiKTsKLSAgICAgICAgdmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZSAoInZhbHVlIikpOwotICAgICAgICBjb3VudGVyc1tuYW1lXSA9IHZhbHVlOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLQotICAgICAgZnVuY3Rpb24gcmVhZCAobmFtZSkgewotICAgICAgICByZXR1cm4gIiIgKyAoY291bnRlcnNbbmFtZV0pOwotICAgICAgfQotCi0gICAgICBmdW5jdGlvbiBpbmNyICh4c2xwcm9jLCBlbGVtKQotICAgICAgewotICAgICAgICBuYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUgKCJuYW1lIik7Ci0gICAgICAgIGNvdW50ZXJzW25hbWVdKys7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIDwvbHhzbHQ6c2NyaXB0PgotICA8L2x4c2x0OmNvbXBvbmVudD4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8SFRNTD4KLSAgICAgIDxIMT5KYXZhU2NyaXB0IEV4YW1wbGUuPC9IMT4KLSAgICAgIDxjb3VudGVyOmluaXQgbmFtZT0iaW5kZXgiIHZhbHVlPSIxIi8+Ci0gICAgICA8cD5IZXJlIGFyZSB0aGUgbmFtZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGJ5IGxhc3QgbmFtZTo8L3A+Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZG9jL25hbWUiPgotICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbGFzdCIvPgotICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAZmlyc3QiLz4KLSAgICAgICAgPHA+Ci0gICAgICAgIDx4c2w6dGV4dD5bPC94c2w6dGV4dD4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50ZXI6cmVhZCgnaW5kZXgnKSIvPgotICAgICAgICA8eHNsOnRleHQ+XS4gPC94c2w6dGV4dD4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYXN0Ii8+Ci0gICAgICAgIDx4c2w6dGV4dD4sIDwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmlyc3QiLz4KLSAgICAgICAgPC9wPgotICAgICAgICA8Y291bnRlcjppbmNyIG5hbWU9ImluZGV4Ii8+Ci0gICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8L0hUTUw+Ci0gIDwveHNsOnRlbXBsYXRlPgotIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy82LXNxbGxpYi1pbnN0YW50ZGIueHNsIGIvc2FtcGxlcy9leHRlbnNpb25zLzYtc3FsbGliLWluc3RhbnRkYi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNTM1OWQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zLzYtc3FsbGliLWluc3RhbnRkYi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiCi0gICAgICAgICAgICAgICAgeG1sbnM6c3FsPSJvcmcuYXBhY2hlLnhhbGFuLmxpYi5zcWwuWENvbm5lY3Rpb24iCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InNxbCI+Ci0gIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJxdWVyeSIgc2VsZWN0PSInU0VMRUNUICogRlJPTSBpbXBvcnQxJyIvPgotIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8IS0tIDEuIE1ha2UgdGhlIGNvbm5lY3Rpb24gLS0+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9kdWN0cyIKLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0ic3FsOm5ldygnb3JnLmVuaHlkcmEuaW5zdGFudGRiLmpkYmMuaWRiRHJpdmVyJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2pkYmM6aWRiOi4vaW5zdGFudGRiL3NhbXBsZS5wcnAnKSIvPgotICAgIDxIVE1MPgotICAgICAgPEhFQUQ+Ci0gICAgICA8L0hFQUQ+Ci0gICAgICA8Qk9EWT4KLSAgICAgICAgPFRBQkxFIGJvcmRlcj0iMSI+Ci0gICAgICAgIDwhLS0yLiBFeGVjdXRlIHRoZSBxdWVyeSAtLT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YWJsZSIgc2VsZWN0PSdzcWw6cXVlcnkoJHByb2R1Y3RzLCAkcXVlcnkpJy8+Ci0gICAgICAgICAgPFRSPgotICAgICAgICAgIDwhLS0gR2V0IGNvbHVtbi1sYWJlbCBhdHRyaWJ1dGUgZnJvbSBlYWNoIGNvbHVtbi1oZWFkZXItLT4KLSAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRhYmxlL3Jvdy1zZXQvY29sdW1uLWhlYWRlciI+Ci0gICAgICAgICAgICA8VEg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb2x1bW4tbGFiZWwiLz48L1RIPgotICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkdGFibGUvcm93LXNldC9yb3ciLz4KLSAgICAgICAgICA8eHNsOnRleHQ+JiMxMDs8L3hzbDp0ZXh0PgotICAgICAgICA8L1RBQkxFPgotICAgICAgPC9CT0RZPgotICAgIDwvSFRNTD4gCi0gICAgPCEtLSAzLiBDbG9zZSB0aGUgY29ubmVjdGlvbiAtLT4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3FsOmNsb3NlKCRwcm9kdWN0cykiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icm93Ij4KLSAgICAgICAgPFRSPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iY29sIi8+Ci0gICAgICAgIDwvVFI+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbCI+Ci0gICAgPFREPgotICAgICAgPCEtLSBIZXJlIGlzIHRoZSBjb2x1bW4gZGF0YSAtLT4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz4KLSAgICA8L1REPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvSW50RGF0ZS5qYXZhIGIvc2FtcGxlcy9leHRlbnNpb25zL0ludERhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5YzZjMy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvSW50RGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi1wdWJsaWMgY2xhc3MgSW50RGF0ZQotewotICBwdWJsaWMgc3RhdGljIERhdGUgZ2V0RGF0ZShTdHJpbmcgeWVhciwgU3RyaW5nIG1vbnRoLCBTdHJpbmcgZGF5KQotICAgIHsKLSAgICAgIC8vIERhdGUoaW50LCBpbnQsIGludCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgc28gdXNlIENhbGVuZGFyIHRvCi0gICAgICAvLyBzZXQgdGhlIHllYXIsIG1vbnRoLCBhbmQgZGF5LgotICAgICAgQ2FsZW5kYXIgYyA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAvLyBDb252ZXJ0IGVhY2ggYXJndW1lbnQgdG8gaW50LgotICAgICAgYy5zZXQoSW50ZWdlci5wYXJzZUludCh5ZWFyKSxJbnRlZ2VyLnBhcnNlSW50KG1vbnRoKSxJbnRlZ2VyLnBhcnNlSW50KGRheSkpOwotICAgICAgcmV0dXJuIGMuZ2V0VGltZSgpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zL015Q291bnRlci5qYXZhIGIvc2FtcGxlcy9leHRlbnNpb25zL015Q291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjVmNTRhLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9NeUNvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBNeUNvdW50ZXIgewotICBzdGF0aWMgSGFzaHRhYmxlIGNvdW50ZXJzID0gbmV3IEhhc2h0YWJsZSAoKTsKLQotCi0gIHB1YmxpYyB2b2lkIGluaXQob3JnLmFwYWNoZS54YWxhbi5leHRlbnNpb25zLlhTTFByb2Nlc3NvckNvbnRleHQgY29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBlbGVtKSAKLSAgewotICAgIFN0cmluZyBuYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICBTdHJpbmcgdmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKLSAgICBpbnQgdmFsOwotICAgIHRyeSAKLSAgICB7Ci0gICAgICB2YWwgPSBJbnRlZ2VyLnBhcnNlSW50ICh2YWx1ZSk7Ci0gICAgfSAKLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIAotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlICgpOwotICAgICAgdmFsID0gMDsKLSAgICB9Ci0gICAgY291bnRlcnMucHV0IChuYW1lLCBuZXcgSW50ZWdlciAodmFsKSk7Ci0gIH0KLQotICBwdWJsaWMgaW50IHJlYWQoU3RyaW5nIG5hbWUpIAotICB7IAotICAgIEludGVnZXIgY3ZhbCA9IChJbnRlZ2VyKWNvdW50ZXJzLmdldChuYW1lKTsKLSAgICByZXR1cm4gKGN2YWwgPT0gbnVsbCkgPyAwIDogY3ZhbC5pbnRWYWx1ZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5jcihvcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnMuWFNMUHJvY2Vzc29yQ29udGV4dCBjb250ZXh0LCAgCi0gICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBlbGVtKSB7Ci0gICAgU3RyaW5nIG5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIEludGVnZXIgY3ZhbCA9IChJbnRlZ2VyKSBjb3VudGVycy5nZXQobmFtZSk7Ci0gICAgaW50IG52YWwgPSAoY3ZhbCA9PSBudWxsKSA/IDAgOiAoY3ZhbC5pbnRWYWx1ZSAoKSArIDEpOwotICAgIGNvdW50ZXJzLnB1dCAobmFtZSwgbmV3IEludGVnZXIgKG52YWwpKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvaWRiLmphciBiL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvaWRiLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwMTgzMy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL2lkYi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3NhbXBsZS5wcnAgYi9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3NhbXBsZS5wcnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNWIyNDYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi9zYW1wbGUucHJwCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSEKLSEgQkFTSUMgUFJPUEVSVElFUwotIQotIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0hCi0hIFBhdGggd2hlcmUgaW5kZXggdGFibGVzIGFyZSBoZWxkLiBDYW4gYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgCi0hIHRvIHRoZSBwcm9wZXJ0aWVzIGZpbGUuIERlZmF1bHRzIHRvIHRhYmxlUGF0aC4KLSEKLSFpbmRleFBhdGg9Li9pbmRleGVzCi0hCi0hIFBhdGggd2hlcmUgc3lzdGVtIHRhYmxlcyBhcmUgaGVsZC4gQ2FuIGJlIGFic29sdXRlIG9yIHJlbGF0aXZlIHRvIAotISB0aGUgcHJvcGVydGllcyBmaWxlLiBEZWZhdWx0cyB0byB0YWJsZVBhdGguCi0hCi0hc3lzdGVtUGF0aD0uL3N5c3RlbQotIQotISBQYXRoIHdoZXJlIGRhdGFiYXNlIHRhYmxlcyBhcmUgaGVsZC4gQ2FuIGJlIGFic29sdXRlIG9yIHJlbGF0aXZlIAotISB0byB0aGUgcHJvcGVydGllcyBmaWxlLiBEZWZhdWx0cyB0byAiY3VycmVudCIgZGlyZWN0b3J5LgotIQotdGFibGVQYXRoPS4vdGFibGVzCi0hCi0hIFBhdGggd2hlcmUgcmVzdWx0cyBzZXQgdGFibGVzIGFyZSBoZWxkLiBDYW4gYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgCi0hIHRvIHRoZSBwcm9wZXJ0aWVzIGZpbGUuIERlZmF1bHRzIHRvIHRhYmxlUGF0aC4KLSEKLSF0bXBQYXRoPS4vdG1wCi0hCi0hIE5vbi16ZXJvIG1lYW5zIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgcHJvcGVydGllcyBmaWxlLiAKLSEgRGVmYXVsdCBpcyBhYnNvbHV0ZSBwYXRocyBmb3IgZmlsZXMuCi0hCi1yZWxhdGl2ZVRvUHJvcGVydGllcz0xCi0hCi0hIEFsdGVybmF0aXZlIHBhcnRpdGlvbnMgY2FuIGJlIGRlZmluZWQgc28gdGhhdCB0YWJsZXMgY2FuIGJlIHBsYWNlZAotISBpbiBtdWx0aXBsZSBsb2NhdGlvbnMuIEVhY2ggcGFydGl0aW9uIGlzIG51bWJlcmVkOiAxLCAyLCAzLC4uLiBUYWJsZXMKLSEgY2FuIGJlIGNyZWF0ZWQgb24gcGFydGl0aW9ucyB1c2luZyB0aGUgc3ludGF4IAotIQotISAgIENSRUFURSBUQUJMRSA8bmFtZT4gT04gUEFSVElUSU9OIDxudW1iZXI+Li4uCi0hCi0hIFRoZSBwYXJ0aXRpb24gY291bnQgaGFzIHRvIGJlIHN1cHBsaWVkLgotIQotIXBhcnRpdGlvbkNvdW50PTIKLSEKLSEgVGhlIGxvY2F0aW9ucyBvZiBlYWNoIHBhcnRpdGlvbiBtdXN0IGJlIHN1cHBsaWVkLiBUaGVzZSBhcmUgYWx3YXlzCi0hIGFic29sdXRlIHBhdGggbmFtZXMuCi0hCi0hcGFydGl0aW9uMT1kOi9wZXRlcwotIXBhcnRpdGlvbjI9YzovdGVtcAotCi0KLSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSEKLSEgVFVOSU5HIFBST1BFUlRJRVMKLSEKLSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIQotISBUaGUgYW1vdW50IG9mIGVhY2ggY29sdW1uIHRvIGNhY2hlLCBleHByZXNzZWQgZWl0aGVyIGFzIGFuIGFic29sdXRlIAotISBudW1iZXIgb2Ygcm93cyBvciBhcyBhIHBlcmNlbnRhZ2UgZmlndXJlLiBEZWZhdWx0cyB0byAyNTYgb3IgMTAgcmVzcGVjdGl2ZWx5LgotIQotISBUaGlzIHZhbHVlIGFwcGxpZXMgb25seSB3aGVuIHRhYmxlcyBhcmUgZmlyc3QgY3JlYXRlZC4gSXQgaGFzIG5vIGVmZmVjdAotISB3aGVuIGEgdGFibGUgaXMgYmVpbmcgcmUtb3BlbmVkLgotIQotY2FjaGVBbW91bnQ9NTEyCi0hCi0hIENBQ0hFX1JPV1MgTXVzdCBiZSBvbmUgb2YgQ0FDSEVfUk9XUyBvciBDQUNIRV9QRVJDRU5ULiBEZXRlcm1pbmVzIHdoZXRoZXIgCi0hIHRvIGNhY2hlIGNvbHVtbnMgaW4gdGFibGVzIGJhc2VkIG9uIGFuIGFic29sdXRlIG51bWJlciBvZiByb3dzLCBvciB0aGUgCi0hIHBlcmNlbnRhZ2UgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlLiAKLSEKLSEgVGhpcyB2YWx1ZSBhcHBsaWVzIG9ubHkgd2hlbiB0YWJsZXMgYXJlIGZpcnN0IGNyZWF0ZWQuIEl0IGhhcyBubyBlZmZlY3QKLSEgd2hlbiBhIHRhYmxlIGlzIGJlaW5nIHJlLW9wZW5lZC4KLSEKLWNhY2hlQ29uZGl0aW9uPUNBQ0hFX1JPV1MKLSEKLSEgVGhlIGFtb3VudCBvZiB0aGUgc3lzdGVtIHRhYmxlcyB0byBiZSBjYWNoZWQuIERlZmF1bHRzIHRvIDEwMC4KLSEKLSEgVGhpcyB2YWx1ZSBhcHBsaWVzIG9ubHkgd2hlbiB0YWJsZXMgYXJlIGZpcnN0IGNyZWF0ZWQuIEl0IGhhcyBubyBlZmZlY3QKLSEgd2hlbiBhIHRhYmxlIGlzIGJlaW5nIHJlLW9wZW5lZC4KLSEKLSFzeXN0ZW1DYWNoZVNpemU9MTAKLSEKLSEgU2ltaWxhciB0byBjYWNoZUNvbmRpdGlvbiwgYnV0IGFwcGxpZXMgb25seSB0byB0aGUgc3lzdGVtIHRhYmxlcy4KLSEKLSEgVGhpcyB2YWx1ZSBhcHBsaWVzIG9ubHkgd2hlbiB0YWJsZXMgYXJlIGZpcnN0IGNyZWF0ZWQuIEl0IGhhcyBubyBlZmZlY3QKLSEgd2hlbiBhIHRhYmxlIGlzIGJlaW5nIHJlLW9wZW5lZC4KLSEKLSFzeXN0ZW1DYWNoZUNvbmRpdGlvbj1DQUNIRV9ST1dTCi0hCi0hIFRoZSBwZXJjZW50YWdlIGNhY2hlIGhpdCBpbXByb3ZlbWVudCByZXF1aXJlZCBpbiBvcmRlciB0byBtb3ZlIHRoZSAKLSEgY2FjaGUgdG8gYSBuZXcgbG9jYXRpb24gaW4gYSBjb2x1bW4uIAotIQotISAoQ3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCkuCi0hCi1jYWNoZVJlc2V0UGVyY2VudD0xMAotIQotISBOb24temVybyBtZWFucyB0aGF0IGRhdGFiYXNlIGNoYW5nZXMgZG8gbm90IGdldCB3cml0dGVuIHRvIHRoZSAKLSEgZGF0YWJhc2UgaW1tZWRpYXRlbHkuIFNlZSB0dW5pbmcuaHRtbC4gCi0hCi1mYXN0VXBkYXRlPTAKLSEKLSEgUGVyY2VudGFnZSBvZiBmcmVlIHNwYWNlIGluIGFuIGluZGV4IHRoYXQgbXVzdCBiZSBwcmVzZW50IGJlZm9yZSAKLSEgdGhlIGluZGV4IHJlb3JnYW5pc2VzIGl0c2VsZi4gSGlnaCB2YWx1ZXMgbWVhbnMgZnJlcXVlbnQgaW5kZXgKLSEgcmVvcmdhbmlzYXRpb24uIExvdyB2YWx1ZXMgbWVhbnMgc2xvdyBpbmRleCBpbnNlcnRzLgotIQotaW5kZXhMb2FkPTUKLSEKLSEgVGhlIG51bWJlciBvZiBjYWNoZSBtaXNzZXMgdG8gaW5jbHVkZSBpbiBjYWxjdWxhdGlvbnMgb2YgdGhlIG5leHQgCi0hIGJhc2UgZm9yIHRoZSBjYWNoZS4gCi0hCi0hIChDdXJyZW50bHkgbm90IGltcGxlbWVudGVkKS4KLSEKLW1pc3Nlc0luQ2FjaGVTdGF0cz0xMDAKLSEKLSEgTm9uLXplcm8gbWVhbnMgdGhhdCByZXN1bHRzIHNldHMgZ2V0IGluc3RhbnRpYXRlZCBvbiBkaXNrLiBCeSBkZWZhdWx0Ci0hIEluc3RhbnREQiBob2xkcyByZXN1bHRzIHNldHMgZW10aXJlbHkgaW4gbWVtb3J5IChhcGFydCBmcm9tIEJpbmFyeQotISBjb2x1bW5zKS4gRm9yIGxhcmdlIHJlc3VsdHMgc2V0cyB0aGlzIGNhbiBiZSBhIHByb2JsZW0uIFRoaXMgcHJvcGVydHkKLSEgZm9yY2VzIGFsbCByZXN1bHRzIHNldHMgdG8gYmUgaGVsZCBvbiBkaXNrLgotIQotcmVzdWx0c09uRGlzaz0wCi0hCi0hIFNpbWlsYXIgdG8gY2FjaGVDb25kaXRpb24gYnV0IGFwcGxpZXMgb25seSB0byBkaXNrIGJhc2VkCi0hIHJlc3VsdHMgc2V0cy4gRGVmYXVsdCBpcyBDQUNIRV9ST1dTLgotIQotcmVzdWx0c1NldENhY2hlPUNBQ0hFX1JPV1MKLSEKLSEgU2ltaWxhciB0byBjYWNoZUFtb3VudCBidXQgYXBwbGllcyBvbmx5IHRvIGRpc2sgYmFzZWQKLSEgcmVzdWx0cyBzZXRzLiBEZWZhdWx0IGlzIDEwMC4KLSEKLXJlc3VsdHNTZXRDYWNoZUFtb3VudD0xMDAKLSEKLSEgTnVtYmVyIG9mIHJvd3MgdG8gcmVhZCBpbnRvIHRoZSBkaXNrIHJlYWQgYWhlYWQgYnVmZmVyLiAKLSEgUmVjb21tZW5kZWQgdG8gYmUgc2V0IHNvbWV3aGVyZSBhcm91bmQgMTI4IHRvIDI1Ni4gCi0hIERlZmF1bHQgaXMgMjAuCi0hCi1yb3dDYWNoZVNpemU9MTI4Ci0hCi0hIFRoZSByZWFkIGFoZWFkIGJ1ZmZlciBpcyBlZmZlY3RpdmUgYXQgc3BlZWRpbmcgdXAgZnVsbAotISB0YWJsZSBzY2Fucy4gSG93ZXZlciBmb3IgaW5kZXhlZCBsb29rdXBzIG9yIG11bHRpcGxlCi0hIHNpbXVsdGFuZW91cyBzY2FucyBpdCBpcyBiZXR0ZXIgdG8gcmVhZCBhIHNpbmdsZSByb3cgYXQKLSEgYSB0aW1lLiBFYWNoIHRhYmxlIGhvbGRzIGEgc21hbGwgbnVtYmVyIG9mIHNpbmdsZSByb3cKLSEgYnVmZmVycyB0byBpbXByb3ZlIHN1Y2ggb3BlcmF0aW9ucy4gRGVmYXVsdCBpcyA4LgotIQotIXNpbmdsZVJvd0NvdW50PTQKLSEKLSEgU29tZXRpbWVzIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciBjYW4gYmUgaGVsZCBieSBhIHNpbmdsZQotISB0aHJlYWQgZXZlbiB0aG91Z2ggaXQgaXMgbm90IHJldHJpZXZlaW5nIG1hbnkgdmFsdWVzIGZyb20gaXQuCi0hIElmIHRvbyBtYW55IGxvb2t1cHMgcmV0cmlldmUgZGF0YSBmcm9tIHRoZSBzaW5nbGUgcm93Ci0hIGJ1ZmZlcnMgdGhlbiBpdCBpcyBiZXR0ZXIgdG8gZmx1c2ggdGhlIGxvb2sgYWhlYWQgYnVmZmVyIGFuZAotISBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgcmUtdXNlLiBEZWZhdWx0IGlzIDEyOC4KLSEKLSFmbHVzaEFmdGVyQ2FjaGVNaXNzZXM9NjQKLSEKLSEgTnVtYmVyIG9mIHJvd3MgdG8gcmVhZCBhaGVhZCBmb3Igc3lzdGVtIHRhYmxlcy4gQnkgZGVmYXVsdAotISBzeXN0ZW0gdGFibGVzIGNhY2hlIGV2ZXJ5dGhpbmcsIHNvIGl0IGlzIHdhc3RlZnVsIHRvIGhhdmUgbGFyZ2UKLSEgcmVhZCBhaGVhZCBidWZmZXJzIHNpbmNlIHRoZXkgd2lsbCB2ZXJ5IHJhcmVseSBiZSB1c2VkLiBUaGlzCi0hIGFsbG93cyB0aGUgc2l6ZSBvZiB0aGUgc3lzdGVtIHJlYWQgYWhlYWQgYnVmZmVycyB0byBiZSByZWR1Y2VkCi0hIGlmIG5lY2Vzc2FyeS4gRGVmYXVsdHMgdG8gcm93Q2FjaGVTaXplLgotIQotIXN5c3RlbVJvd3M9MjAKLSEKLSEgVGhlIGNvbnRyb2wgY29sdW1uIGluIGFsbCB0YWJsZXMgbm9ybWFsbHkgaGFzIGEgbGFyZ2UgY2FjaGUKLSEgc2luY2UgdGhpcyBzcGVlZHMgdXAgYWxsIG9wZXJhdGlvbiBvbiB0aGF0IHRhYmxlLiBUaGlzIGNhbiBiZQotISB2YXJpZWQgdG8gZWl0aGVyIGltcHJvdmUgcGVyZm9ybWFuY2Ugb3IgdG8gcmVkdWNlIHNwYWNlLgotISBkZWZhdWx0IGlzIDgxOTIuCi0hCi0hIFRoaXMgdmFsdWUgYXBwbGllcyBvbmx5IHdoZW4gdGFibGVzIGFyZSBmaXJzdCBjcmVhdGVkLiBJdCBoYXMgbm8gZWZmZWN0Ci0hIHdoZW4gYSB0YWJsZSBpcyBiZWluZyByZS1vcGVuZWQuCi0hCi0hY29udHJvbENvbENhY2hlU2l6ZT01MTIKLSEKLSEgQnkgZGVmYXVsdCwgSW5zdGFudERCIG9ubHkgZG9lcyBhIGN1cnNvcnkgc2VhcmNoIGZvciBkZWxldGVkIHJvd3MgZHVyaW5nIAotISBVUERBVEUgc3RhdGVtZW50cy4gU2V0dGluZyBzZWFyY2hEZWxldGVzPTEgY2F1c2VzIG1vcmUgZGV0YWlsZWQgc2VhcmNoZXMgCi0hIGZvciBkZWxldGVkIHJvd3MuIFRoaXMgc2xvd3MgZG93biBVUERBVEUgZXhlY3V0aW9ucywgYnV0IHJldWx0cyBpbiBtb3JlIAotISBjb21wYWN0IHRhYmxlcy4gIERlZmF1bHQgaXMgMC4KLSEKLXNlYXJjaERlbGV0ZXM9MAotIQotISBUaGUgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcywgYmV0d2VlbiBjaGVja3MgZm9yIHN0YXRlbWVudCBleGVjdXRpb24KLSEgdGltZW91dHMuIERlZmF1bHQgaXMgNTAwMC4KLSEKLSF0aW1lckNoZWNrPTUwMDAKLQotIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIQotISBMT0dHSU5HIEFORCBERUJVR0dJTkcgUFJPUEVSVElFUwotIQotIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0hCi0hIE5vbi16ZXJvIG1lYW5zIGluY2x1ZGUgU1FMIHN0YXRlbWVudHMgaW4gdGhlIGV4cG9ydCBmaWxlLiAKLSEKLWV4cG9ydFNRTD0wCi0hCi0hIE5vbi16ZXJvIG1lYW5zIHRyYWNlIG91dHB1dCBhbHNvIGRpcmVjdGVkIHRvIGNvbnNvbGUuIAotISBEZWZhdWx0cyB0byAwLgotIQotdHJhY2VDb25zb2xlPTEKLSEKLSEgUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB3aGVyZSBleHBvcnRpbmcgYW5kIHRyYWNpbmcgZ29lcy4KLSEKLXRyYWNlRmlsZT0uL3RyYWNlLmxvZwotIQotISBCaXRtYXAgb2YgdmFyaW91cyBpdGVtcyB0aGF0IGNhbiBiZSB0cmFjZWQuIFNlZSBkZWJ1Zy5odG1sLiAKLSEgRGVmYXVsdHMgdG8gMC4KLSEKLXRyYWNlTGV2ZWw9MgotCi0hLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0hCi0hIFRSQU5TQUNUSU9OIEFORCBSRUNPVkVSWSBQUk9QRVJUSUVTCi0hCi0hLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSEKLSEgMCBtZWFucyBkbyBub3QgcGVyZm9ybSByZWNvdmVyeSBvbiBzdGFydHVwLgotISAxIG1lYW5zIHBlcmZvcm0gYXV0b21hdGljIHJlY292ZXJ5Ci0hIDIgKGRlZmF1bHQpIG1lYW5zIHByb21wdCB0aGUgdXNlciB1c2luZyBzdGFuZGFyZCBpbiAKLSEKLXJlY292ZXJ5UG9saWN5PTIKLSEKLSEgU2V0cyB0aGUgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gam91cm5hbGxpbmcuIFNlZSB0cmFucy5odG1sLgotISBEZWZhdWx0cyB0byAxLgotIQotISAwIC0gTm8gam91cm5hbGxpbmcgdGFrZXMgcGxhY2UuCi0hIDEgLSBOb3JtYWwgam91cm5hbGxpbmcgKGRlZmF1bHQpLgotISAyIC0gRnVsbCBqb3VybmFsbGluZy4KLSEKLXRyYW5zTGV2ZWw9MQotIQotISBXaGVuIGRvaW5nIGFuIGltcG9ydCwgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHJvd3MgaW1wb3J0ZWQgCi0hIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLiBSZWNvbW1lbmRlZCB2YWx1ZSA4MTkyLgotISBkZWZhdWx0cyB0byAxMDAuCi0hCi10cmFuc0ltcG9ydHM9MTAwCi0KLSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSEKLSEgREFURSwgVElNRSBBTkQgQ1VSUkVOQ1kgUFJPUEVSVElFUwotIQotIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0hCi0hIE51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgZGVjaW1hbCBwb2ludCBpbiBjdXJyZW5jeSBvdXRwdXRzLiBEZWZhdWx0cyB0byAyLgotIQotY3VycmVuY3lEZWNpbWFsPTIKLSEKLSEgQ3VycmVuY3kgc3ltYm9sIHVzZWQgaW4gY3VycmVuY3kgb3V0cHV0cy4gRGVmYXVsdHMgdG8gJC4KLSEKLWN1cnJlbmN5U3ltYm9sPSQKLSEKLSEgRGVmYXVsdCBmb3JtYXQgZm9yIGRhdGUgY29sdW1ucy4gRGVmYXVsdHMgdG8gInl5eXktbW0tZGQiLgotIQotZGF0ZUZvcm1hdD15eXl5LW1tLWRkCi0hCi0hIERlZmF1bHQgZm9ybWF0IGZvciB0aW1lc3RhbXAgY29sdW1ucy4gRGVmYXVsdHMgdG8gInl5eXktbW0tZGQgaGg6bW06c3MubGxsIi4KLSEKLWRhdGVUaW1lRm9ybWF0PXl5eXktbW0tZGQgaGg6bW06c3MubGxsCi0hCi0hIElmIHNldCwgdGhlbiBhbGwgdHdvIGRpZ2l0IGRhdGVzIGxlc3MgdGhhbiBpdHMgdmFsdWUgYXJlIGludGVycHJldGVkIAotISBhcyAyMXN0IGNlbnR1cnkgZGF0ZXMuIAotIQotIW1pbGxlbml1bUJvdW5kYXJ5PTUwCi0hCi0hIFNldCB0byAxIGNhdXNlcyB0aGUgZGF0ZSBzdHJpbmcgIm5vdyIgdG8gc3RvcmUgYSBmdWxsIHRpbWVzdGFtcC4gCi0hIERlZmF1bHQgaXMgdG8gc3RvcmUgb25seSB0aGUgZGF0ZSBmb3IgZmllbGRzIHdpdGggbm93IGhvdXIgaW4gdGhlIAotISBmb3JtYXQgc3RyaW5nLgotIQotbm93TWVhbnNUaW1lPTAKLQotIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIQotISBTVFJJTkcgSEFORExJTkcgUFJPUEVSVElFUwotIQotIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0hCi0hIElmIHNldCB0byAxIHRoZW4gU3RyaW5nIGhhc2hlcyB1c2UgdGhlIEpESyBPYmplY3QuaGFzaENvZGUoKSBmdW5jdGlvbi4KLSEgQnkgZGVmYXVsdCwgdXNlcyBJbnN0YW50REIncyBTdHJpbmcgaGFzaGluZy4KLSEKLWFsdFN0cmluZ0hhc2hpbmc9MAotIQotISBTZXQgdG8gMSB0byBjYXVzZSBMSUtFIGNsYXVzZXMgdG8gYWx3YXlzIHBlcmZvcm0gY2FzZSBpbnNlbnNpdGl2ZSAKLSEgY29tcGFyaXNvbnMuIAotIQotbGlrZUlnbm9yZUNhc2U9MAotIQotISBTYW1lIGFzIFNFVCBMSVRFUkFMIFNUUklDVF9PTi4gUHJldmVudHMgc3RyaW5nIGxpdGVyYWxzIGJlaW5nIGludGVycHJldGVkCi0hIGFzIGNvbHVtbiBuYW1lcyBvciBudW1iZXJzLiBEZWZhdWx0IGlzIDAuCi0hCi1zdHJpY3RMaXRlcmFscz0wCi0hCi0hIFNldCB0aGlzIHZhbHVlIHRvIDEgKG9uZSkgaWYgeW91IHdvdWxkIGxpa2UgUHJlcGFyZWRTdGF0ZW1lbnQuc2V0U3RyaW5nKCkKLSEgdG8gaWdub3JlICJcIiAoYmFja3NsYXNoKSBjaGFyYWN0ZXJzIHdoZW4gcHJvY2Vlc2luZyBzdHJpbmcgY29uc3RhbnRzLgotISBXaGVuIHNldCwgSW5zdGFudERCIHdpbGwgbm90IGF0dGVtcHQgdG8gaW50ZXJwcmV0IFwgYXMgdGhlIHN0YXJ0IG9mIGFuCi0hIGVzY2FwZSBzZXF1ZW5jZS4gRGVmYXVsdCBpcyAwLgotIQotIXByZXBhcmVJZ25vcmVzRXNjYXBlcz0xCi0KLSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSEKLSEgTUlTQ0VMTEFORU9VUyBQUk9QRVJUSUVTCi0hCi0hLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSEKLSEgQWxsb3dzIHNlbGVjdGVkIEluc3RhbnREQiBrZXl3b3JkcyB0byBiZSB1bi1yZXNlcnZlZC4gCi0hIGUuZy4gaWdub3JlS2V5d29yZHM9dXJsLHF1b3RlIHdvdWxkIGFsbG93IHRoZSBrZXl3b3JkcyAKLSEgdXJsIGFuZCBxdW90ZSB0byBiZSB1c2VkIGFzIHRhYmxlIG9yIGNvbHVtbiBuYW1lcy4gCi0hCi0hIFRoaXMgZmFjaWxpeSBpcyBwcm92aWRlZCBmb3IgY29tcGF0YXRiaWxpdHkgcmVhc29ucyBvbmx5LgotISBJdCdzIHVzZSBpcyBub3QgcmVjb21tZW5kZWQgQU5EIElTIE5PVCBTVVBQT1JURUQuCi0hCi0haWdub3JlS2V5d29yZHMKLSEKLSEgTm9uLXplcm8gbWVhbnMgZGF0YWJhc2UgaXMgb3BlbmVkIGluIHJlYWQgb25seSBtb2RlLgotIQotcmVhZE9ubHk9MApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvJGRiJHR5cGVzLnRibCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzLyRkYiR0eXBlcy50YmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzgxOTIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvJGRiJHR5cGVzLnRibAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL2ltcG9ydDEudGJsIGIvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvaW1wb3J0MS50YmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMjA4NzEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvaW1wb3J0MS50YmwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUkZGIkQ29scyRwS2V5LnRibCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL3NhbXBsZSRkYiRDb2xzJHBLZXkudGJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjM5ODJhLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL3NhbXBsZSRkYiRDb2xzJHBLZXkudGJsCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvc2FtcGxlJGRiJENvbHMudGJsIGIvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvc2FtcGxlJGRiJENvbHMudGJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDkyZDAxLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL3NhbXBsZSRkYiRDb2xzLnRibAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL3NhbXBsZSRkYiRJbmRleGVzLnRibCBiL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL3NhbXBsZSRkYiRJbmRleGVzLnRibApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhMTUxNy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUkZGIkSW5kZXhlcy50YmwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUkZGIkVGFibGVzJHBLZXkudGJsIGIvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvc2FtcGxlJGRiJFRhYmxlcyRwS2V5LnRibApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmMGMwOS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUkZGIkVGFibGVzJHBLZXkudGJsCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9leHRlbnNpb25zL2luc3RhbnRkYi90YWJsZXMvc2FtcGxlJGRiJFRhYmxlcy50YmwgYi9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUkZGIkVGFibGVzLnRibApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0MTk0ZC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUkZGIkVGFibGVzLnRibAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL3NhbXBsZS5qcmwgYi9zYW1wbGVzL2V4dGVuc2lvbnMvaW5zdGFudGRiL3RhYmxlcy9zYW1wbGUuanJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGJlZjRmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIvdGFibGVzL3NhbXBsZS5qcmwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvbnVtbGlzdC54bWwgYi9zYW1wbGVzL2V4dGVuc2lvbnMvbnVtbGlzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZDQxYzIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zL251bWxpc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08ZG9jPgotICA8bmFtZSBmaXJzdD0iU2Fuaml2YSIgbGFzdD0iV2VlcmF3YXJhbmEiLz4KLSAgPG5hbWUgZmlyc3Q9Ikpvc2VwaCIgbGFzdD0iS2Vzc2VsbWFuIi8+Ci0gIDxuYW1lIGZpcnN0PSJTdGVwaGVuIiBsYXN0PSJBdXJpZW1tYSIvPgotICA8bmFtZSBmaXJzdD0iSWdvciIgbGFzdD0iQmVsYWtvdnNraXkiLz4gICAgCi0gIDxuYW1lIGZpcnN0PSJEYXZpZCIgbGFzdD0iTWFyc3RvbiIvPgotICA8bmFtZSBmaXJzdD0iRGF2aWQiIGxhc3Q9IkJlcnRvbmkiLz4KLSAgPG5hbWUgZmlyc3Q9IkRvbmFsZCIgbGFzdD0iTGVzbGllIi8+Ci0gIDxuYW1lIGZpcnN0PSJFbWlseSIgbGFzdD0iRmFybWVyIi8+Ci0gIDxuYW1lIGZpcnN0PSJNeXJpYW0iIGxhc3Q9Ik1pZHkiLz4KLSAgPG5hbWUgZmlyc3Q9IlBhdWwiIGxhc3Q9IkRpY2siLz4KLSAgPG5hbWUgZmlyc3Q9IlNjb3R0IiBsYXN0PSJCb2FnIi8+Ci0gIDxuYW1lIGZpcnN0PSJTaGFuZSIgbGFzdD0iQ3VyY3VydSIvPgotICA8bmFtZSBmaXJzdD0iTWFyY2lhIiBsYXN0PSJIb2ZmbWFuIi8+Ci0gIDxuYW1lIGZpcnN0PSJOb2FoIiBsYXN0PSJNZW5kZWxzb2huIi8+Ci0gIDxuYW1lIGZpcnN0PSJBbGV4IiBsYXN0PSJNb3Jyb3ciLz4gICAgCi08L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V4dGVuc2lvbnMvcmVhZG1lLmh0bWwgYi9zYW1wbGVzL2V4dGVuc2lvbnMvcmVhZG1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODkzNmYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9leHRlbnNpb25zL3JlYWRtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+WGFsYW4gU2FtcGxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMj5YYWxhbiBTYW1wbGVzPC9oMj4KLTxwPkZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2FtcGxlcyAod2hhdCB0aGV5IGlsbHVzdHJhdGUgYW5kIGhvdyB0byBydW4gdGhlbSksIHNlZSA8YSBocmVmPSIuLi8uLi9kb2NzL3NhbXBsZXMuaHRtbCI+U2FtcGxlczwvYT4uPC9wPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvc2VydmxldC9BcHBseVhTTFQuamF2YSBiL3NhbXBsZXMvc2VydmxldC9BcHBseVhTTFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyZTMyNi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3NlcnZsZXQvQXBwbHlYU0xULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIHNlcnZsZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXguc2VydmxldC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3Q7Ci0vLyBTQVgyIEltcG9ydHMKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS4qOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuVHJhbnNmb3JtZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc3RyZWUuU291cmNlVHJlZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGw7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEFwcGx5WFNMVCBzdXBwbGllcyB0aGUgYmFzaWMKLSAqIGZ1bmN0aW9ucyBmb3IgdHJhbnNmb3JtaW5nIFhNTCBkYXRhIHVzaW5nIFhTTCBzdHlsZXNoZWV0cy4KLSAqCi0gKiBAYXV0aG9yIFNwZW5jZXIgU2hlcGFyZCAoc3NoZXBhcmRAdXMuaWJtLmNvbSkKLSAqIEBhdXRob3IgUi4gQWRhbSBLaW5nIChyYWtAdXMuaWJtLmNvbSkKLSAqIEBhdXRob3IgVG9tIFJvd2UgKHRyb3dlQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIERvbiBMZXNsaWUgKGRvbmFsZF9sZXNsaWVAbG90dXMuY29tKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcHVibGljIGNsYXNzIEFwcGx5WFNMVCBleHRlbmRzIEh0dHBTZXJ2bGV0Ci17Ci0KLSAgLyoqCi0gICAqIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoaXMgY2xhc3MuCi0gICAqIDxwPlJlcXVlc3QtdGltZSB2YWx1ZXMgb3ZlcnJpZGUgaW5pdC10aW1lIHZhbHVlcyB3aGljaCBvdmVycmlkZSBjbGFzcyBkZWZhdWx0cy48L3A+Ci0gICAqIEBzZWUgI2luaXQKLSAgICogQHNlcmlhbAotICAgKi8KLSAgcHJvdGVjdGVkIEFwcGx5WFNMVFByb3BlcnRpZXMgb3VyRGVmYXVsdFBhcmFtZXRlcnMgPSBudWxsOwotCi0gIC8qKgotICAgKiBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzIGZvciB0aGUgU3lzdGVtLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU9MID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0gIC8qKgotICAgKiBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmaWxlIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGZvciB0aGUgU3lzdGVtLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRlMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0KLSAgIC8qKgotICAgKiBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBmb3IgcHJvcGVydGllcyBmaWxlcy4gU2VlIGluaXQoKS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJPT1QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInNlcnZlci5yb290Iik7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENVUlJFTlRESVI7Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemUgb3BlcmF0aW9uYWwgcGFyYW1ldGVycyBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgotICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24KLSAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIE5ldmVyIHRocm93bgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykKLSAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuaW5pdChjb25maWcpOwotICAgIC8vIElmIHRoZSBzZXJ2ZXIucm9vdCBwcm9wZXJ0eSAtLXNlZSBhYm92ZS0tIGlzIG51bGwsIHVzZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Ci0gICAgLy8gYXMgZGVmYXVsdCBsb2NhdGlvbiBmb3IgbWVkaWEucHJvcGVydGllcy4KLSAgICBpZiAoUk9PVCAhPSBudWxsKQotICAgICAgQ1VSUkVOVERJUj0gUk9PVCArIEZTICsgInNlcnZsZXRzIiArIEZTOwotICAgIGVsc2UKLSAgICAgIENVUlJFTlRESVIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikrIEZTOwotICAgIAotCXNldERlZmF1bHRQYXJhbWV0ZXJzKGNvbmZpZyk7Ci0JCi0gICAgc2V0TWVkaWFQcm9wcyhjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigibWVkaWFVUkwiKSk7CQotICB9Ci0gIAotIC8qKgotICAgKiBTZXRzIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgZm9yIHRoZSBzZXJ2bGV0IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uCi0gICAqIEFsc28gc2V0cyByZXF1aXJlZCBzeXN0ZW0gcHJvcGVydGllcyB1bnRpbCB3ZSBmaWd1cmUgb3V0IHdoeSBzZXJ2bGV0IAotICAgKiBzb21ldGltZXNzIGZhaWxzIHRvIHJlYWQgcHJvcGVydGllcyBmcm9tIHByb3BlcnRpZXMgZmlsZXMuCi0gICAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFBhcmFtZXRlcnMoU2VydmxldENvbmZpZyBjb25maWcpCi0gIHsKLSAgICBvdXJEZWZhdWx0UGFyYW1ldGVycyA9IG5ldyBEZWZhdWx0QXBwbHlYU0xUUHJvcGVydGllcyhjb25maWcpOwotICB9Ci0gIAotICAvKioKLSAgICoJTG9hZHMgdGhlIG1lZGlhIHByb3BlcnRpZXMgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIHN0cmluZy4KLSAgICogQHBhcmFtIG1lZGlhVVJMc3RyaW5nIExvY2F0aW9uIG9mIHRoZSBtZWRpYSBwcm9wZXJ0aWVzIGZpbGUuICBDYW4gYmUgZWl0aGVyIGEgZnVsbCBVUkwgb3IgYSBwYXRoIHJlbGF0aXZlCi0gICAqIHRvIHRoZSBTeXN0ZW0ncyBzZXJ2ZXIucm9vdCAvc2VydmxldHMgZGlyZWN0b3J5LiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbnVsbCwKLSAgICogc2VydmVyLnJvb3Qvc2VydmxldHMvbWVkaWEucHJvcGVydGllcyB3aWxsIGJlIHVzZWQuCi0gICAqIEBzZWUgQXBwbHlYU0wjQ1VSUkVOVERJUgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0TWVkaWFQcm9wcyhTdHJpbmcgbWVkaWFVUkxzdHJpbmcpCi0gIHsKLSAgICBpZiAobWVkaWFVUkxzdHJpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICB1cmwgPSBuZXcgVVJMKG1lZGlhVVJMc3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlMSkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsIENVUlJFTlRESVIgKyBtZWRpYVVSTHN0cmluZyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUyKQotICAgICAgICB7Ci0gICAgICAgICAgd3JpdGVMb2coIlVuYWJsZSB0byBmaW5kIHRoZSBtZWRpYSBwcm9wZXJ0aWVzIGZpbGUgYmFzZWQgb24gcGFyYW1ldGVyICdtZWRpYVVSTCcgPSAiCi0gICAgICAgICAgICAgICAgICAgKyBtZWRpYVVSTHN0cmluZywgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19BQ0NFUFRFRCwgbXVlMik7Ci0gICAgICAgICAgdXJsID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHVybCAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIG91ck1lZGlhUHJvcHMgPSBuZXcgT3JkZXJlZFByb3BzKHVybC5vcGVuU3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UxKQotICAgICAgICB7Ci0gICAgICAgICAgd3JpdGVMb2coIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBvcGVuaW5nIG1lZGlhIHByb3BlcnRpZXMgZmlsZTogIiArIG1lZGlhVVJMc3RyaW5nICsKLSAgICAgICAgICAgICAgICAgICAiLiAgTWVkaWEgdGFibGUgbWF5IGJlIGludmFsaWQuIiwgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19BQ0NFUFRFRCwgaW9lMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyBkZWZhdWx0UHJvcCA9IENVUlJFTlRESVIgKyAibWVkaWEucHJvcGVydGllcyI7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgb3VyTWVkaWFQcm9wcyA9IG5ldyBPcmRlcmVkUHJvcHMobmV3IEZpbGVJbnB1dFN0cmVhbShkZWZhdWx0UHJvcCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZTIpCi0gICAgICB7Ci0gICAgICAgIHdyaXRlTG9nKCJEZWZhdWx0IG1lZGlhIHByb3BlcnRpZXMgZmlsZSAiICsgZGVmYXVsdFByb3AgKyAiIG5vdCBmb3VuZC4iLAotICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0FDQ0VQVEVELCBpb2UyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE1lZGlhKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgcmV0dXJuIG91ck1lZGlhUHJvcHMuZ2V0VmFsdWUocmVxdWVzdC5nZXRIZWFkZXIoSEVBREVSX05BTUUpKTsKLSAgfQotICAKLSAgLy8gZG9Qb3N0IHJlbW92ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMgZHVlIHRvIHRoZSBwb3NzaWJpbGl0eSBvZiBzZW5kaW5nCi0gIC8vIHVuc2VjdXJlIFhNTCBhbmQgWFNMIFhTTFRJbnB1dFNvdXJjZXMgdGhyb3VnaCB0aGUgcmVxdWVzdCBpbnB1dCBzdHJlYW0KLQotICAvKioKLSAgICogSFRUUCBHZXQgbWV0aG9kIHBhc3NlZCBvbiB0byBwcm9jZXNzKCkuCi0gICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0Ci0gICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UKLSAgICogQHNlZSAjcHJvY2VzcwotICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gTmV2ZXIgdGhyb3duCi0gICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gTmV2ZXIgdGhyb3duCi0gICAqLwotICBwdWJsaWMgdm9pZCBkb0dldCAoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewkKLSAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgcHJvY2Vzcyh0RmFjdG9yeSwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIENvb3JkaW5hdGVzIGFwcGx5aW5nIGFuIFhTTCBzdHlsZXNoZWV0IHRvIFhNTCBkYXRhIHVzaW5nIG9wZXJhdGlvbmFsIHBhcmFtZXRlcnMuCi0gICAqIDxwPklmIHN1Y2Nlc3NmdWxseSBhcHBsaWVkLCB0aGUgcmVzdWx0IHRyZWUgd2lsbCBiZSBzdHJlYW1lZCB0byB0aGUgcmVzcG9uc2Ugb2JqZWN0Ci0gICAqIGFuZCB0aGUgY29udGVudCB0eXBlIHNldCBhY2NvcmRpbmcgdG8gdGhlIFhTTCBzdHlsZXNoZWV0J3MgJmx0O3hzbDpvdXRwdXQ+IGVsZW1lbnQocykuPC9wPgotICAgKiA8cD5JZiB0aGVyZSBpcyBhIHByb2JsZW0gaW4gcGFyc2luZyB0aGUgWE1ML1hTTCBvciBpZiB0aGVyZSBpcyBhIHByb2JsZW0gaW4gYXBwbHlpbmcKLSAgICogdGhlIFhTTCB0byB0aGUgWE1MLCBhbiBleGNlcHRpb24gd2lsbCBiZSBzdHJlYW1lZCB0byB0aGUgcmVzcG9uc2Ugb2JqZWN0LiAgVGhlIGRldGFpbAotICAgKiBvZiB0aGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIG9iamVjdCB3aWxsIGRlcGVuZCBvbiB3aGV0aGVyIHdlJ3JlCi0gICAqIHJ1bm5pbmcgaW4gZGVidWcgbW9kZSBvciBub3QuPC9wPgotICAgKiBAcGFyYW0gcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uIG9mIFRSYVggcHJvY2Vzc29yCi0gICAqIEBwYXJhbSByZXF1ZXN0ICBNYXkgY29udGFpbiBpbmZvcm1hdGlvbiByZWxldmFudCB0byBjcmVhdGluZyBYTUwgYW5kIFhTTCBYU0xUSW5wdXRTb3VyY2UncwotICAgKiBAcGFyYW0gcmVzcG9uc2UgV2hlcmUgdG8gd3JpdGUgdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdAotICAgKiBAc2VlICNnZXREb2N1bWVudAotICAgKiBAc2VlICNnZXRTdHlsZXNoZWV0Ci0gICAqIEBzZWUgI2dldENvbnRlbnRUeXBlCi0gICAqIEBzZWUgI2Rpc3BsYXlFeGNlcHRpb24KLSAgICogQHNlZSAjc2V0U3R5bGVzaGVldFBhcmFtcwotICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gTmV2ZXIgdGhyb3duCi0gICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gTmV2ZXIgdGhyb3duCi0gICAqLwotICAKLSAgcHVibGljIHZvaWQgcHJvY2VzcyhUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnksIAotCQkJCQkgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCi0gICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gZGVidWcgPSBvdXJEZWZhdWx0UGFyYW1ldGVycy5pc0RlYnVnKHJlcXVlc3QpOwotCi0gICAgbG9uZyB0aW1lID0gMDsKLSAgICBpZiAoZGVidWcpCi0gICAgICB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAvLyBMaXN0ZW5lciB0byBiZSB1c2VkIGZvciBhbGwgcmVwb3J0aW5nCi0gICAgQXBwbHlYU0xUTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQXBwbHlYU0xUTGlzdGVuZXIoKTsKLQlsaXN0ZW5lci5vdXQucHJpbnRsbigiZGVidWcgaXMgIiArIGRlYnVnKTsKLQotICAgIFN0cmVhbVNvdXJjZSB4bWxTb3VyY2UgPSBudWxsOwotCVN0cmVhbVNvdXJjZSB4c2xTb3VyY2UgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICgoeG1sU291cmNlID0gZ2V0RG9jdW1lbnQocmVxdWVzdCwgbGlzdGVuZXIpKSA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXBwbHlYU0xURXhjZXB0aW9uKCJnZXREb2N1bWVudCgpIHJldHVybmVkIG51bGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLlNDX05PVF9GT1VORCk7Ci0gICAgfQotICAgIGNhdGNoIChBcHBseVhTTFRFeGNlcHRpb24gYXhlKQotICAgIHsKLSAgICAgIGF4ZS5hcHBlbmRNZXNzYWdlKEVPTCArICJnZXREb2N1bWVudCgpIHJlc3VsdGVkIGluIEFwcGx5WFNMVEV4Y2VwdGlvbiIgKyBFT0wKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbGlzdGVuZXIuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIGlmIChkZWJ1Zykgd3JpdGVMb2coYXhlKTsKLSAgICAgIGRpc3BsYXlFeGNlcHRpb24ocmVzcG9uc2UsIGF4ZSwgZGVidWcpOwotICAgICAgeG1sU291cmNlID0gbnVsbDsKLSAgICB9Ci0gICAgLy8gY3JlYXRpbmcgWFNMIFN0eWxlc2hlZXQKLSAgICBpZiAoeG1sU291cmNlICE9IG51bGwpCi0JewotICAgICAgdHJ5Ci0gICAgICB7Ci0JICAgIGlmICgoeHNsU291cmNlID0gZ2V0U3R5bGVzaGVldCh0RmFjdG9yeSwgcmVxdWVzdCwgeG1sU291cmNlLCBsaXN0ZW5lcikpID09IG51bGwpCi0JCXsKLSAgICAgICAgICB0aHJvdyBuZXcgQXBwbHlYU0xURXhjZXB0aW9uKCJnZXRTdHlsZXNoZWV0KCkgcmV0dXJuZWQgbnVsbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLlNDX05PVF9GT1VORCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRm9yIHRpbWUgYmVpbmcsIG11c3QgInJlc2V0IiB4bWxTb3VyY2UgYWZ0ZXIgZXh0cmFjdGluZyBzdHlsZXNoZWV0IFBJCi0JCXhtbFNvdXJjZSA9IGdldERvY3VtZW50KHJlcXVlc3QsIGxpc3RlbmVyKTsgCi0gICAgICB9Ci0gICAgICBjYXRjaCAoQXBwbHlYU0xURXhjZXB0aW9uIGF4ZSkKLSAgICAgIHsKLSAgICAgICAgYXhlLmFwcGVuZE1lc3NhZ2UoRU9MICsgImdldFN0eWxlc2hlZXQoKSByZXN1bHRlZCBpbiBBcHBseVhTTFRFeGNlcHRpb24iICsgRU9MCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsgbGlzdGVuZXIuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgaWYgKGRlYnVnKSB3cml0ZUxvZyhheGUpOwotICAgICAgICBkaXNwbGF5RXhjZXB0aW9uKHJlc3BvbnNlLCBheGUsIGRlYnVnKTsKLSAgICAgICAgeHNsU291cmNlID0gbnVsbDsKLSAgICAgIH0KLSAgICAvLyBwZXJmb3JtIFRyYW5zZm9ybWF0aW9uCi0JICAKLSAgICBpZiAoKHhtbFNvdXJjZSAhPSBudWxsKSAmJiAoeHNsU291cmNlICE9IG51bGwpKQotICAgIHsKLQkgIHRyeQotCSAgewotICAgICAgICBsaXN0ZW5lci5vdXQucHJpbnRsbigiUGVyZm9ybWluZyB0cmFuc2Zvcm1hdGlvbi4uLiIpOwotCQkKLSAgICAgICAgVGVtcGxhdGVzIHRlbXBsYXRlcyA9IHRGYWN0b3J5Lm5ld1RlbXBsYXRlcyh4c2xTb3VyY2UpOwotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRlbXBsYXRlcy5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gbnVsbDsKLQkJCSAgICAgIGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUodGVtcGxhdGVzKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKTsKLSAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOwotCi0JCQkgICAgICBpZiAodHJhbnNmb3JtZXIgaW5zdGFuY2VvZiBUcmFuc2Zvcm1lckltcGwpCi0JCQkgICAgICB7Ci0JCQkgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lckltcGwgPSAoVHJhbnNmb3JtZXJJbXBsKXRyYW5zZm9ybWVyOwotICAgICAgICAgICAgICB0cmFuc2Zvcm1lckltcGwuc2V0UXVpZXRDb25mbGljdFdhcm5pbmdzKG91ckRlZmF1bHRQYXJhbWV0ZXJzLmlzTm9DVyhyZXF1ZXN0KSk7Ci0JCQkgICAgICB9Ci0JCQkKLQkJCSAgICAgIHNldFN0eWxlc2hlZXRQYXJhbXModHJhbnNmb3JtZXIsIHJlcXVlc3QpOwkJCQotCSAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oeG1sU291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKSk7Ci0JCQkKLQkJCSAgICAgIGlmIChkZWJ1ZykgICAgICAgICAgICAgIAotICAgICAgICAgICAgICB3cml0ZUxvZyhsaXN0ZW5lci5nZXRNZXNzYWdlKCksIHJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGMpCi0gICAgICAgICAgewotICAgICAgICAgICAgQXBwbHlYU0xURXhjZXB0aW9uIGF4ZSA9IG5ldyBBcHBseVhTTFRFeGNlcHRpb24KLQkJCQkgICAgICAgICAgICAgICAgICAgICAoIkV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgVHJhbnNmb3JtYXRpb246IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBFT0wgKyBsaXN0ZW5lci5nZXRNZXNzYWdlKCkgKyBFT0wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXhjLmdldE1lc3NhZ2UoKSwgCi0JCQkJCQkJCQkgICAgICAgICAgICAgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgICAgIGlmIChkZWJ1Zykgd3JpdGVMb2coYXhlKTsKLSAgICAgICAgICAgIGRpc3BsYXlFeGNlcHRpb24ocmVzcG9uc2UsIGF4ZSwgZGVidWcpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgewotICAgICAgICAgICAgLy8gdHJhbnNmb3JtZXIucmVzZXQoKTsKLSAgICAgICAgICB9IC8vIGVuZCBvZiB0cnkgLi4uIGNhdGNoIC4uLiBmaW5hbGx5Ci0JCX0KLQkgIH0KLSAgICAgIGNhdGNoICgvKm9yZy54bWwuc2F4LlNBWCovRXhjZXB0aW9uIHNheEV4YykKLSAgICAgIHsKLSAgICAgICAgQXBwbHlYU0xURXhjZXB0aW9uIGF4ZSA9IG5ldyBBcHBseVhTTFRFeGNlcHRpb24KLQkJCSAgICAgICAgICAgICAgICAgICAgICgiRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBjdG9yL1RyYW5zZm9ybWF0aW9uOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRU9MICsgbGlzdGVuZXIuZ2V0TWVzc2FnZSgpICsgRU9MCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNheEV4Yy5nZXRNZXNzYWdlKCksIAotCQkJICAgICAgICAgICAgICAgIAkJCQkJICBzYXhFeGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgaWYgKGRlYnVnKSB3cml0ZUxvZyhheGUpOwotICAgICAgICBkaXNwbGF5RXhjZXB0aW9uKHJlc3BvbnNlLCBheGUsIGRlYnVnKTsKLSAgICAgIH0gLy8gZW5kIG9mIG5ldyB0cnkgLi4uIGNhdGNoCi0gICAgfSAvLyBlbmQgb2YgaWYoKHN0eWxlc2hlZXRSb290ICE9IG51bGwpIC4uLgotICAgIGlmIChkZWJ1ZykKLSAgICB7Ci0gICAgICB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lOwotICAgICAgd3JpdGVMb2coIiAgTm8gQ29uZmxpY3QgV2FybmluZ3MgPSAiICsgb3VyRGVmYXVsdFBhcmFtZXRlcnMuaXNOb0NXKHJlcXVlc3QpICsKLSAgICAgICAgICAgICAgICIgIFRyYW5zZm9ybWF0aW9uIHRpbWU6ICIgKyB0aW1lICsgIiBtcyIsIHJlc3BvbnNlLlNDX09LKTsKLSAgICB9Ci0gIH0KLSAgfSAgCi0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gWE1MIFhTTFRJbnB1dFNvdXJjZSBET00uICBBdHRlbXB0cyB3aWxsIGJlIG1ha2UgdG8gY3JlYXRlIHRoZSBET00gZnJvbSB0aGUgZm9sbG93aW5nCi0gICAqIHNvdXJjZXM6Ci0gICAqIDxvbD4KLSAgICogPGxpPkEgcmVsYXRpdmUgVVJMIHNwZWNpZmllZCBpbiB0aGUgSFRUUCByZXF1ZXN0J3MgcGF0aCBpbmZvcm1hdGlvbi4gVGhpcyBjYXBhYmlsaXR5IGlzIGludGVuZGVkCi0gICAqIGZvciB1c2UgYnkgPGI+c2VydmxldCBlbmdpbmVzIHRoYXQgbWFwPC9iPiBzb21lIG9yIGFsbCBYTUwgZGF0YSB0byBiZSBwcm9jZXNzZWQgYXQgdGhlIHNlcnZlci48L2xpPgotICAgKiA8bGk+QSBVUkwgc3BlY2lmaWVkIGluIHRoZSBIVFRQIHJlcXVlc3QncyA8Y29kZT5VUkw9PC9jb2RlPiBwYXJhbWV0ZXIuICBUaGlzIGNhcGFiaWxpdHkKLSAgICogaXMgaW50ZW5kZWQgZm9yIDxiPmNsaWVudHMgd2lzaGluZyB0byBzZWxlY3RpdmVseSBwcm9jZXNzPC9iPiBYTUwgZGF0YSBhdCB0aGUgc2VydmVyLiAgRm9yCi0gICAqIHNlY3VyaXR5IHJlYXNvbnMsIHRoaXMgVVJMIHdpbGwgYmUgZm9yY2VkIHRvIHRoZSBsb2NhbCBJUCBob3N0LjwvbGk+Ci0gICAqIDxsaT5UaGUgSFRUUCByZXF1ZXN0J3MgWE1MIGlucHV0IHN0cmVhbS4gVGhpcyBjYXBhYmlsaXR5IGlzIGludGVuZGVkIGZvciB1c2UgYnkgY2hhaW5lZCBzZXJ2bGV0cy48L2xpPgotICAgKiA8L29sPgotICAgKiBAcGFyYW0gcmVxdWVzdCBNYXkgY29udGFpbiBvciBwb2ludCB0byB0aGUgWE1MIFhTTFRJbnB1dFNvdXJjZQotICAgKiBAcGFyYW0gbGlzdGVuZXIgVG8gcmVjb3JkIGRldGFpbGVkIHBhcnNpbmcgbWVzc2FnZXMgZm9yIHBvc3NpYmxlIHJldHVybiB0byByZXF1ZXN0b3IKLSAgICogQHJldHVybiBYTUwgWFNMVElucHV0U291cmNlIERPTSwgb3IgbnVsbCBpZiB0aGUgWFNMVElucHV0U291cmNlIGNvdWxkIG5vdCBiZSBwYXJzZWQKLSAgICogQGV4Y2VwdGlvbiBBcHBseVhTTFRFeGNlcHRpb24gVGhyb3duIGlmIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgaGFuZGxpbmcgcmVxdWVzdAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmVhbVNvdXJjZSBnZXREb2N1bWVudChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBseVhTTFRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB0aHJvd3MgQXBwbHlYU0xURXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgeG1sVVJMID0gbnVsbDsKLSAgICAgIC8vIGRvY3VtZW50IGZyb20gUGF0aEluZm8KLSAgICAgIGlmICgoeG1sVVJMID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0ZW5lci5vdXQucHJpbnRsbigiUGFyc2luZyBYTUwgRG9jdW1lbnQgZnJvbSBQYXRoSW5mbzogIiArIHhtbFVSTCk7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKG5ldyBVUkwoImh0dHAiLCAoKERlZmF1bHRBcHBseVhTTFRQcm9wZXJ0aWVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXJEZWZhdWx0UGFyYW1ldGVycykuZ2V0TG9jYWxIb3N0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFVSTC5yZXBsYWNlKCdcXCcsICcvJykpLm9wZW5TdHJlYW0oKSk7CQkKLSAgICAgIH0KLSAgICAgIC8vIGRvY3VtZW50IGZyb20gUmVxdWVzdCBwYXJhbWV0ZXIKLSAgICAgIGlmICgoeG1sVVJMID0gb3VyRGVmYXVsdFBhcmFtZXRlcnMuZ2V0WE1MdXJsKHJlcXVlc3QpKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0ZW5lci5vdXQucHJpbnRsbigiUGFyc2luZyBYTUwgRG9jdW1lbnQgZnJvbSByZXF1ZXN0IHBhcmFtZXRlcjogIiArIHhtbFVSTCk7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKG5ldyBVUkwoeG1sVVJMKS5vcGVuU3RyZWFtKCkpOwotICAgICAgfQotICAgICAgLy8gZG9jdW1lbnQgZnJvbSBjaGFpbgotICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gcmVxdWVzdC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgaWYgKChjb250ZW50VHlwZSAhPSBudWxsKSAmJiBjb250ZW50VHlwZS5zdGFydHNXaXRoKCJ0ZXh0L3htbCIpKQotICAgICAgewotICAgICAgICBsaXN0ZW5lci5vdXQucHJpbnRsbigiUGFyc2luZyBYTUwgRG9jdW1lbnQgZnJvbSByZXF1ZXN0IGNoYWluIik7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IEFwcGx5WFNMVEV4Y2VwdGlvbihpb2UsIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBBcHBseVhTTFRFeGNlcHRpb24oZSwgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgVGVtcGxhdGVzIChTdHlsZXNoZWV0Um9vdCkgb2JqZWN0LiAgQXR0ZW1wdHMgd2lsbCBiZSBtYWtlIHRvIGNyZWF0ZSB0aGUgU3R5bGVzaGVldCAKLSAgICogZnJvbSB0aGUgZm9sbG93aW5nc291cmNlczoKLSAgICogPG9sPgotICAgKiA8bGk+QSBVUkwgc3BlY2lmaWVkIGluIHRoZSBIVFRQIHJlcXVlc3QncyA8Y29kZT54c2xVUkw9PC9jb2RlPiBwYXJhbWV0ZXIuICBUaGlzIGNhcGFiaWxpdHkKLSAgICogaXMgaW50ZW5kZWQgZm9yIGNsaWVudHMgd2lzaGluZyB0byBzZWxlY3RpdmVseSBvdmVycmlkZSB0aGUgc2VydmVyIGFsZ29yaXRobSBmb3IgYXBwbHlpbmcgWFNMCi0gICAqIHN0eWxlc2hlZXRzLiAgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHRoaXMgVVJMIHdpbGwgYmUgZm9yY2VkIHRvIHRoZSBsb2NhbCBJUCBob3N0LjwvbGk+Ci0gICAqIDxsaT5YTUwgYXNzb2NpYXRpb24uICBYTUwgZG9jdW1lbnRzIG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gb25lIG9yIG1vcmUgc3R5bGVzaGVldHMgdXNpbmcKLSAgICogPGEgSFJFRj0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9QUi14bWwtc3R5bGVzaGVldC0xOTk5MDExNCI+dGhpczwvYT4gVzNDIHByb3Bvc2VkIHJlY29tbWVuZGF0aW9uLgotICAgKiBJZiB0aGUgWE1MIGRvY3VtZW50IGRvZXMgY29udGFpbiBzdWNoIHJlZmVyZW5jZXMsIGEgYmVzdCBtYXRjaCB3aWxsIGJlIGNob3NlbiBiYXNlZCBvbiB0aGUgYnJvd3NlcgotICAgKiB0eXBlIG1ha2luZyB0aGUgcmVxdWVzdCBhbmQgdGhlIGRlZmF1bHQgYXNzb2NpYXRpb24uICBUaGlzIGNhcGFiaWxpdHkgZW5hYmxlcyByZWxhdGlvbnNoaXBzIHRvIGJlCi0gICAqIGRlZmluZWQgYmV0d2VlbiBjbGllbnQgY2FwYWJpbGl0aWVzIGFuZCBzdHlsZXNoZWV0cyBjYXBhYmxlIG9mIGFjdGluZyBvbiB0aGVzZSBjYXBhYmlsaXRpZXMuPC9saT4KLSAgICogPGxpPkEgY29uZmlndXJlZCBkZWZhdWx0IHN0eWxlc2hlZXQgVVJMPC9saT4KLSAgICogPC9vbD4KLSAgICogQHBhcmFtIHJlcXVlc3QgTWF5IGNvbnRhaW4gb3IgcG9pbnQgdG8gdGhlIFhTTCBYU0xUSW5wdXRTb3VyY2UKLSAgICogQHBhcmFtIHhtbFNvdXJjZSAgTWF5IHBvaW50IHRvIHRoZSBYU0wgWFNMVElucHV0U291cmNlCi0gICAqIEBwYXJhbSBsaXN0ZW5lciBUbyByZWNvcmQgZGV0YWlsZWQgcGFyc2luZyBtZXNzYWdlcyBmb3IgcG9zc2libGUgcmV0dXJuIHRvIHJlcXVlc3RvcgotICAgKiBAcmV0dXJuIFhTTCBYU0xUSW5wdXRTb3VyY2UsIG9yIG51bGwgaWYgdGhlIHJlcXVlc3QgY291bGQgbm90IGJlIHBhcnNlZAotICAgKiBAc2VlICNtYWtlRG9jdW1lbnQKLSAgICogQHNlZSAjZ2V0TWVkaWEKLSAgICogQHNlZSAjU1RZTEVTSEVFVF9BVFRSSUJVVEUKLSAgICogQHNlZSAjZ2V0WFNMVVJMZnJvbURvYwotICAgKiBAc2VlICN0b0FjY2VwdExhbmd1YWdlQ29ubmVjdGlvbgotICAgKiBAZXhjZXB0aW9uIEFwcGx5WFNMVEV4Y2VwdGlvbiBUaHJvd24gaWYgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBoYW5kbGluZyByZXF1ZXN0Ci0gICAqLwotICBwcm90ZWN0ZWQgU3RyZWFtU291cmNlIGdldFN0eWxlc2hlZXQoVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5LAotCQkJCSAgIAkJICAJCQkgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVNvdXJjZSB4bWxTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBseVhTTFRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB0aHJvd3MgQXBwbHlYU0xURXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvL3N0eWxlc2hlZXQgVVJMIGZyb20gcmVxdWVzdAotICAgICAgU3RyaW5nIHhzbFVSTCA9ICgoRGVmYXVsdEFwcGx5WFNMVFByb3BlcnRpZXMpIG91ckRlZmF1bHRQYXJhbWV0ZXJzKS5nZXRYU0xSZXF1ZXN0VVJMKHJlcXVlc3QpOwotCi0gICAgICBpZiAoeHNsVVJMICE9IG51bGwpCi0gICAgICAgIGxpc3RlbmVyLm91dC5wcmludGxuKCJQYXJzaW5nIFhTTCBTdHlsZXNoZWV0IERvY3VtZW50IGZyb20gcmVxdWVzdCBwYXJhbWV0ZXI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB4c2xVUkwpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBmaW5kIHN0eWxlc2hlZXQgZnJvbSBYTUwgRG9jdW1lbnQsIE1lZGlhIHRhZyBwcmVmZXJlbmNlCi0gICAgICAgIGlmICh4bWxTb3VyY2UgIT0gbnVsbCl7Ci0gICAgICAgICAgbGlzdGVuZXIub3V0LnByaW50bG4oImNhbGxpbmcgZ2V0WFNMVVJMZnJvbURvYyBhbmQgZ2V0TWVkaWEgIiArIGdldE1lZGlhKHJlcXVlc3QpICk7Ci0gICAgICAgICAgeHNsVVJMID0gZ2V0WFNMVVJMZnJvbURvYyh4bWxTb3VyY2UsIFNUWUxFU0hFRVRfQVRUUklCVVRFLCBnZXRNZWRpYShyZXF1ZXN0KSwgdEZhY3RvcnkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh4c2xVUkwgIT0gbnVsbCkKLSAgICAgICAgICBsaXN0ZW5lci5vdXQucHJpbnRsbigiUGFyc2luZyBYU0wgU3R5bGVzaGVldCBEb2N1bWVudCBmcm9tIFhNTCBEb2N1bWVudCB0YWc6ICIgKyB4c2xVUkwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBEZWZhdWx0Ci0gICAgICAgICAgaWYgKCh4c2xVUkwgPSBvdXJEZWZhdWx0UGFyYW1ldGVycy5nZXRYU0x1cmwobnVsbCkpICE9IG51bGwpCi0gICAgICAgICAgICBsaXN0ZW5lci5vdXQucHJpbnRsbigiUGFyc2luZyBYU0wgU3R5bGVzaGVldCBEb2N1bWVudCBmcm9tIGNvbmZpZ3VyYXRpb246ICIgKyB4c2xVUkwpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2UoeHNsVVJMKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgQXBwbHlYU0xURXhjZXB0aW9uKGlvZSwgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IEFwcGx5WFNMVEV4Y2VwdGlvbihlLCBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3BvbnNlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgYnkgdGhlIG1lZGlhLXR5cGUgYW5kIGVuY29kaW5nIGF0dHJpYnV0ZXMgb2YKLSAgICogdGhlICZsdDt4c2w6b3V0cHV0PiBlbGVtZW50KHMpIG9mIHRoZSBzdHlsZXNoZWV0LgotICAgKiBAcGFyYW0geHNsU291cmNlUm9vdCBYU0wgU3R5bGVzaGVldCB0byBiZSBleGFtaW5lZCBmb3IgJmx0O3hzbDpvdXRwdXQ+IGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIFRoZSByZXNwb25zZSBjb250ZW50IHR5cGUgKE1JTUUgdHlwZSBhbmQgY2hhcnNldCkgb2YgdGhlIHN0eWxlc2hlZXQgb3V0cHV0Ci0gICAqIEBzZWUgI3Byb2Nlc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoVGVtcGxhdGVzIHRlbXBsYXRlcykKLSAgewotICAgIFByb3BlcnRpZXMgb3Byb3BzID0gdGVtcGxhdGVzLmdldE91dHB1dFByb3BlcnRpZXMoKTsKLSAgICBTdHJpbmcgZW5jb2RpbmcgPSBvcHJvcHMuZ2V0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORyk7ICAKLSAgICAgICAgICBTdHJpbmcgbWVkaWEgPSBvcHJvcHMuZ2V0UHJvcGVydHkoT3V0cHV0S2V5cy5NRURJQV9UWVBFKTsKLSAgICAgICAgICBpZiAobWVkaWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIG1lZGlhICsgIjsgY2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0gICAgICByZXR1cm4gbWVkaWE7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kID0gb3Byb3BzLmdldFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9EKTsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZXF1YWxzKCJodG1sIikpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAidGV4dC9odG1sIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKG1ldGhvZC5lcXVhbHMoInRleHQiKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0ZXh0L3BsYWluIjsKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAidGV4dC94bWwiOwotICAgICAgICAgIH0KLSAgfSAgCi0gIAotCi0gIC8qKgotICAgKiBEZWZpbmVzIGFuZCBzZXRzIHNlbGVjdCB0b3AtbGV2ZWwgWFNMIHN0eWxlc2hlZXQgdmFyaWFibGVzIGZyb20gdGhlIEhUVFAgcmVxdWVzdCwgd2hpY2gKLSAgICogY2FuIGJlIGV2YWx1YXRlZCB1c2luZyAmbHQ7eHNsOnBhcmFtLXZhcmlhYmxlJmd0Oy4gIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHdpbGwgYmUKLSAgICogYXV0b21hdGljYWxseSBzZXQ6Ci0gICAqIDxkbD4KLSAgICogPGR0PjxpPlBhcmFtZXRlck5hbWU8L2k+PC9kdD4KLSAgICogPGRkPkVhY2ggbm9uLXJlc2VydmVkIHJlcXVlc3QgcGFyYW1ldGVyIHJldHVybmVkIGZyb20gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpLiAgSWYgYQotICAgKiAgICAgcGFyYW1ldGVyIGNvbnRhaW5zIG1vcmUgdGhhbiBhIHNpbmdsZSB2YWx1ZSwgb25seSB0aGUgZmlyc3QgdmFsdWUgaXMgYXZhaWxhYmxlLjwvZGQ+Ci0gICAqIDxkdD5zZXJ2bGV0LVJlbW90ZUFkZHI8L2R0PgotICAgKiA8ZGQ+Q29udGFpbnMgU3RyaW5nIG91dHB1dCBmcm9tIHJlcXVlc3QuZ2V0UmVtb3RlQWRkcigpLCB3aGljaCBpcyB0aGUgSVAgYWRkcmVzcwotICAgKiAgICAgb2YgdGhlIGNsaWVudCBtYWNoaW5lLjwvZGQ+Ci0gICAqIDxkdD5zZXJ2bGV0LVJlbW90ZUhvc3Q8L2R0PgotICAgKiA8ZGQ+Q29udGFpbnMgU3RyaW5nIG91dHB1dCBmcm9tIHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpLCB3aGljaCBpcyB0aGUgaG9zdCBuYW1lCi0gICAqICAgICBvZiB0aGUgY2xpZW50IG1hY2hpbmUuPC9kZD4KLSAgICogPGR0PnNlcnZsZXQtUmVtb3RlVXNlcjwvZHQ+Ci0gICAqIDxkZD5Db250YWlucyBTdHJpbmcgb3V0cHV0IGZyb20gcmVxdWVzdC5nZXRSZW1vdGVVc2VyKCksIHdoaWNoIHdhcyB0aGUgdXNlciBuYW1lCi0gICAqICAgICBhY2NlcHRlZCBieSB0aGUgc2VydmVyIHRvIGdyYW50IGFjY2VzcyB0byB0aGlzIHNlcnZsZXQuPC9kZD4KLSAgICogPGR0PnNlcnZsZXQtUmVxdWVzdDwvZHQ+Ci0gICAqIDxkZD5Db250YWlucyB0aGUgcmVxdWVzdCBvYmplY3QuPC9kZD4KLSAgICogPC9kbD4KLSAgICogQHBhcmFtIHhzbHByb2Nlc3NvciBXaGVyZSB0byByZWdpc3RlciBwYXJhbWV0ZXJzIHRvIGJlIHNldAotICAgKiBAcGFyYW0gcmVxdWVzdCBQcm92aWRlcyBhY2Nlc3MgdG8gYWxsIG1lYW5pbmdmdWwgcGFyYW1ldGVycyB0byBzZXQKLSAgICogQHNlZSAjcHJvY2VzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3R5bGVzaGVldFBhcmFtcyhUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBwYXJhbU5hbWVzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgIHdoaWxlIChwYXJhbU5hbWVzLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSAoU3RyaW5nKSBwYXJhbU5hbWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nW10gcGFyYW1WYWxzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1OYW1lKTsKLSAgICAgICAgaWYgKHBhcmFtVmFscyAhPSBudWxsKQotICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKHBhcmFtTmFtZSwgbmV3IFhTdHJpbmcocGFyYW1WYWxzWzBdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICB0cnkKLSAgICB7Ci0gICAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoInNlcnZsZXQtUmVtb3RlQWRkciIsIG5ldyBYU3RyaW5nKHJlcXVlc3QuZ2V0UmVtb3RlQWRkcigpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICB0cnkKLSAgICB7Ci0gICAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoInNlcnZsZXQtUmVtb3RlSG9zdCIsIG5ldyBYU3RyaW5nKHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICB0cnkKLSAgICB7Ci0gICAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoInNlcnZsZXQtUmVtb3RlVXNlciIsIG5ldyBYU3RyaW5nKHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHRvIHRoZSBzZXJ2bGV0IGxvZzoKLSAgICogPG9sPgotICAgKiA8bGk+SFRUUCBzdGF0dXMgY29kZTwvbGk+Ci0gICAqIDxsaT5NZXNzYWdlPC9saT4KLSAgICogPGxpPlN0YWNrIHRyYWNlPC9saT4KLSAgICogPC9vbD4KLSAgICogQHBhcmFtIGF4ZSBDb250YWlucyB2YWxpZCBIVFRQIHN0YXR1cyBjb2RlLCBtZXNzYWdlLCBhbmQgc3RhY2sgdHJhY2UgKG9wdGlvbmFsKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVMb2coQXBwbHlYU0xURXhjZXB0aW9uIGF4ZSkKLSAgewotICAgIHdyaXRlTG9nKGF4ZS5nZXRNZXNzYWdlKCksIGF4ZS5nZXRTdGF0dXNDb2RlKCksIGF4ZS5nZXRFeGNlcHRpb24oKSk7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gdG8gdGhlIHNlcnZsZXQgbG9nOgotICAgKiA8b2w+Ci0gICAqIDxsaT5IVFRQIHN0YXR1cyBjb2RlPC9saT4KLSAgICogPGxpPk1lc3NhZ2U8L2xpPgotICAgKiA8bGk+U3RhY2sgdHJhY2U8L2xpPgotICAgKiA8L29sPgotICAgKiBAcGFyYW0gbXNnIE1lc3NhZ2UgdG8gYmUgbG9nZ2VkCi0gICAqIEBwYXJhbSBzdGF0dXNDb2RlIFZhbGlkIHN0YXR1cyBjb2RlIGZyb20gamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UKLSAgICogQHBhcmFtIHQgVXNlZCB0byBnZW5lcmF0ZSBzdGFjayB0cmFjZSAobWF5IGJlID1udWxsIHRvIHN1cHByZXNzIHN0YWNrIHRyYWNlKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVMb2coU3RyaW5nIG1zZywgaW50IHN0YXR1c0NvZGUsIFRocm93YWJsZSB0KQotICB7Ci0gICAgaWYgKHQgPT0gbnVsbCkKLSAgICAgIHdyaXRlTG9nKG1zZywgc3RhdHVzQ29kZSk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihieXRlcywgdHJ1ZSk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBpcyAiICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICB0LnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOwotICAgICAgbG9nKCJIVFRQIFN0YXR1cyBDb2RlOiAiICsgc3RhdHVzQ29kZSArICIgLSAiICsgbXNnICsgRU9MICsgYnl0ZXMudG9TdHJpbmcoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHRvIHRoZSBzZXJ2bGV0IGxvZzoKLSAgICogPG9sPgotICAgKiA8bGk+SFRUUCBzdGF0dXMgY29kZTwvbGk+Ci0gICAqIDxsaT5NZXNzYWdlPC9saT4KLSAgICogPC9vbD4KLSAgICogQHBhcmFtIG1zZyBNZXNzYWdlIHRvIGJlIGxvZ2dlZAotICAgKiBAcGFyYW0gc3RhdHVzQ29kZSBWYWxpZCBzdGF0dXMgY29kZSBmcm9tIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUxvZyhTdHJpbmcgbXNnLCBpbnQgc3RhdHVzQ29kZSkKLSAgewotICAgIGxvZygiSFRUUCBTdGF0dXMgQ29kZTogIiArIHN0YXR1c0NvZGUgKyAiIC0gIiArIG1zZyk7Ci0gIH0KLQotICAvKioKLSAgICogSW52b2tlcyByZXNwb25zZS5zZW5kRXJyb3Igc2V0dGluZyBhbiBIVFRQIHN0YXR1cyBjb2RlIGFuZCBvcHRpb25hbGx5IGFuIGVycm9yIG1lc3NhZ2UKLSAgICogYXMgYW4gSFRNTCBwYWdlLgotICAgKiA8cD5JZiBydW5uaW5nIGluIGRlYnVnIG1vZGUsIGFsc28gdHJ5IHRvIHJldHVybiBhIHN0YWNrIHRyYWNlIG9mIHRoZSBleGNlcHRpb24gYW5kCi0gICAqIGFuZCB4bWwveHNsIHByb2Nlc3NvciBtZXNzYWdlcy48L3A+Ci0gICAqIEBwYXJhbSByZXNwb25zZSBXaGVyZSB0byBzdHJlYW0gdGhlIGV4Y2VwdGlvbiB0bwotICAgKiBAcGFyYW0geHNlIFRoZSB3cmFwcGVyIHdoaWNoIGNvbnRhaW5zIHRoZSBleGNlcHRpb24gYW5kIGl0cyBIVFRQIHN0YXR1cyBjb2RlCi0gICAqIEBwYXJhbSBkZWJ1ZyBJbmRpY2F0ZXMgd2hldGhlciB0byBpbmNsdWRlIHN0YWNrIHRyYWNlLCBldGMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5RXhjZXB0aW9uKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIEFwcGx5WFNMVEV4Y2VwdGlvbiB4c2UsIGJvb2xlYW4gZGVidWcpCi0gIHsKLSAgICBTdHJpbmcgbWVzZyA9IHhzZS5nZXRNZXNzYWdlKCk7Ci0gICAgaWYgKG1lc2cgPT0gbnVsbCkKLSAgICAgIG1lc2cgPSAiIjsKLSAgICBlbHNlIG1lc2cgPSAiPEI+IiArIG1lc2cgKyAiPC9CPiI7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWVzZywgRU9MKTsKLSAgICBTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKQotICAgICAgc3RyQnVmLmFwcGVuZCh0b2tlbnMubmV4dFRva2VuKCkgKyBFT0wgKyAiPEJSPiIpOwotICAgIG1lc2cgPSBzdHJCdWYudG9TdHJpbmcoKTsKLSAgICBpZiAoZGVidWcpCi0gICAgewotICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVzID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGJ5dGVzLCB0cnVlKTsKLSAgICAgIHhzZS5nZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2Uod3JpdGVyKTsKLSAgICAgIG1lc2cgKz0gIiA8UFJFPiAiICsgYnl0ZXMudG9TdHJpbmcoKSArICIgPC9QUkU+ICI7Ci0gICAgfQotICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXNwb25zZS5zZW5kRXJyb3IoeHNlLmdldFN0YXR1c0NvZGUoKSwgbWVzZyk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJT0V4Y2VwdGlvbiBpcyBvY2N1cnJpbmcgd2hlbiBzZW5kRXJyb3IgaXMgY2FsbGVkIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIE1hcHBpbmcgb2YgSFRUUCByZXF1ZXN0J3MgdXNlci1BZ2VudCB2YWx1ZXMgdG8gc3R5bGVzaGVldCBtZWRpYT0gdmFsdWVzLgotICAgKiA8cD5UaGlzIG1hcHBpbmcgaXMgZGVmaW5lZCBieSBhIGZpbGUgcG9pbnRlZCB0byBieSB0aGUgb3BlcmF0aW9uYWwgcGFyYW1ldGVyICJtZWRpYVVSTCIgd2hpY2ggY2FuCi0gICAqICBlaXRoZXIgY29udGFpbiBhIGZ1bGwgVVJMIG9yIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgU3lzdGVtJ3Mgc2VydmVyLnJvb3QgL3NlcnZsZXRzIGRpcmVjdG9yeS48L3A+Ci0gICAqIEBzZWUgI3NldE1lZGlhUHJvcHMKLSAgICogQHNlZSAjZ2V0TWVkaWEKLSAgICogQHNlcmlhbAotICAgKi8KLSAgcHJvdGVjdGVkIE9yZGVyZWRQcm9wcyBvdXJNZWRpYVByb3BzID0gbnVsbDsKLQotICAvKioKLSAgICogUmV0dXJucyBhIGNvbm5lY3Rpb24gd2hpY2ggcmVzcGVjdHMgdGhlIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXIgb2YgdGhlIEhUVFAgcmVxdWVzdC4gIFRoaXMKLSAgICogaXMgdXNlZnVsIHdoZW4gWFNMIGZpbGVzIGFyZSBpbnRlcm5hdGlvbmFsaXplZCBmb3IgdXNlIHdpdGggV2ViIHNlcnZlcnMgd2hpY2ggcmVzcGVjdCB0aGlzCi0gICAqIGhlYWRlci4KLSAgICogPHA+Rm9yIGV4YW1wbGUsIEFwYWNoZSAxLjMuNiBtYXkgYmUgY29uZmlndXJlZCBmb3IgbXVsdGl2aWV3cy4gIFVuZGVyIHRoaXMgY29uZmlndXJhdGlvbiwKLSAgICogcmVxdWVzdHMgZm9yIGh0dHA6Ly9teWhvc3QvaW5kZXguaHRtbCB3b3VsZCByZXR1cm4gaHR0cDovL215aG9zdC9pbmRleC5odG1sLmZyIHRvIEZyZW5jaCBicm93c2VycwotICAgKiBhbmQgaHR0cDovL215aG9zdC9pbmRleC5odG1sLmVuIHRvIEVuZ2xpc2ggYnJvd3NlcnMuPC9wPgotICAgKiBAcGFyYW0gdXJsIExvY2F0aW9uIHRvIGNvbm5lY3QgdG8KLSAgICogQHBhcmFtIHJlcXVlc3QgQ291bGQgY29udGFpbiBhbiBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyCi0gICAqIEByZXR1cm4gQW4gQWNjZXB0LUxhbmd1YWdlLWVuYWJsZWQgVVJMIGNvbm5lY3Rpb24KLSAgICogQHNlZSAjZ2V0U3R5bGVzaGVldAotICAgKi8KLSAgcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gdG9BY2NlcHRMYW5ndWFnZUNvbm5lY3Rpb24oVVJMIHVybCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgVVJMQ29ubmVjdGlvbiB0ZW1wQ29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgIHRlbXBDb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0LUxhbmd1YWdlIiwgcmVxdWVzdC5nZXRIZWFkZXIoIkFjY2VwdC1MYW5ndWFnZSIpKTsKLSAgICByZXR1cm4gdGVtcENvbm5lY3Rpb247Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBYU0wgc3R5bGVzaGVldCBVUkwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgWE1MIGRvY3VtZW50LiAgSWYgbXVsdGlwbGUgWFNMCi0gICAqIHN0eWxlc2hlZXRzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIFhNTCBkb2N1bWVudCwgcHJlZmVyZW5jZSB3aWxsIGJlIGdpdmVuIHRvIHRoZSBzdHlsZXNoZWV0Ci0gICAqIHdoaWNoIGNvbnRhaW5zIGFuIGF0dHJpYnV0ZSBuYW1lL3ZhbHVlIHBhaXIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZU5hbWUKLSAgICogYW5kIGF0dHJpYnV0ZVZhbHVlLgotICAgKiBAcGFyYW0geG1sU291cmNlIFhNTCBYU0xUSW5wdXRTb3VyY2UgdG8gYmUgc2VhcmNoZWQgZm9yIGFzc29jaWF0ZWQgWFNMIHN0eWxlc2hlZXRzCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lICBBdHRyaWJ1dGUgbmFtZSB0byBwcm92aWRlIHByZWZlcmVudGlhbCBtYXRjaGluZwotICAgKiBAcGFyYW0gYXR0cmlidXRlVmFsdWUgQXR0cmlidXRlIHZhbHVlIHRvIHByb3ZpZGUgcHJlZmVyZW50aWFsIG1hdGNoaW5nCi0gICAqIEByZXR1cm4gVGhlIHByZWZlcnJlZCBYU0wgc3R5bGVzaGVldCBVUkwsIG9yIG51bGwgaWYgbm8gWFNMIHN0eWxlc2hlZXQgYXNzb2NpYXRpb24gaXMgZm91bmQKLSAgICogQHNlZSAjZ2V0U3R5bGVzaGVldAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0WFNMVVJMZnJvbURvYyhTdHJlYW1Tb3VyY2UgeG1sU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkpCi0gIHsKLSAgICBTdHJpbmcgdGVtcFVSTCA9IG51bGwsIHJldHVyblVSTCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotCSAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICBOb2RlIHNvdXJjZVRyZWUgPSBkb2NCdWlsZGVyLnBhcnNlKHhtbFNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgIGZvcihOb2RlIGNoaWxkPXNvdXJjZVRyZWUuZ2V0Rmlyc3RDaGlsZCgpOyBudWxsICE9IGNoaWxkOyBjaGlsZD1jaGlsZC5nZXROZXh0U2libGluZygpKQotICAgICAgewotICAgICAgICBpZihOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA9PSBjaGlsZC5nZXROb2RlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiljaGlsZDsKLSAgICAgICAgICBpZihwaS5nZXROb2RlTmFtZSgpLmVxdWFscygieG1sLXN0eWxlc2hlZXQiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQSUEgcGlhID0gbmV3IFBJQShwaSk7Ci0gICAgICAgICAgICBpZigidGV4dC94c2wiLmVxdWFscyhwaWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0ZW1wVVJMID0gcGlhLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwotICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gcGlhLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgICAgICAgaWYgKChhdHRyaWJ1dGUgIT0gbnVsbCkgJiYgKGF0dHJpYnV0ZS5pbmRleE9mKGF0dHJpYnV0ZVZhbHVlKSA+IC0xKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdGVtcFVSTDsKLSAgICAgICAgICAgICAgaWYgKCEieWVzIi5lcXVhbHMocGlhLmdldEF0dHJpYnV0ZSgiYWx0ZXJuYXRlIikpKQotICAgICAgICAgICAgICAgIHJldHVyblVSTCA9IHRlbXBVUkw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBzYXhFeGMpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuVVJMOwotICB9ICAKLQotIC8qKgotICAgKiBUaGUgYXR0cmlidXRlIG5hbWUgaW4gdGhlIDw/eG1sLXN0eWxlc2hlZXQ+IHRhZyB1c2VkIGluIHN0eWxlc2hlZXQgc2VsZWN0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVTSEVFVF9BVFRSSUJVVEUgPSAibWVkaWEiOwotCi0gIC8qKgotICAgKglUaGUgSFRUUCBIZWFkZXIgdXNlZCBmb3IgbWF0Y2hpbmcgdGhlIFN0eWxlc2hlZXQgYXR0cmlidXRlIHZpYSB0aGUKLSAgICogbWVkaWEgcHJvcGVydGllcyBmaWxlIHNlbGVjdGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX05BTUUgPSAidXNlci1BZ2VudCI7Ci19Ci0KLS8qKgotICogIFN0b3JlcyB0aGUga2V5cyBhbmQgdmFsdWVzIGZyb20gYSBmaWxlIChzaW1pbGFyIHRvIGEgcHJvcGVydGllcyBmaWxlKSBhbmQKLSAqICBjYW4gcmV0dXJuIHRoZSBmaXJzdCB2YWx1ZSB3aGljaCBoYXMgYSBrZXkgY29udGFpbmVkIGluIGl0cyBzdHJpbmcuCi0gKiAgRmlsZSBjYW4gaGF2ZSBjb21tZW50IGxpbmVzIHN0YXJ0aW5nIHdpdGggJyMiIGFuZCBmb3IgZWFjaCBsaW5lIHRoZSBlbnRyaWVzIGFyZQotICogIHNlcGFyYXRlZCBieSB0YWJzIGFuZCAnPScgY2hhci4KLSAqLwotY2xhc3MgT3JkZXJlZFByb3BzCi17Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgS2V5IGFuZCBWYWx1ZXMgYXMgYW4gYXJyYXkgb2YgU3RyaW5ncwotICAgKi8KLSAgcHJpdmF0ZSBWZWN0b3IgYXR0VmVjID0gbmV3IFZlY3RvcigxNSk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gU3RyZWFtIGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgZmlsZS4KLSAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJlYWQgZnJvbSBzdHJlYW0KLSAgICovCi0gIE9yZGVyZWRQcm9wcyhJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEJ1ZmZlcmVkUmVhZGVyIGlucHV0ICA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pKTsKLSAgICBTdHJpbmcgY3VycmVudExpbmUsIEtleSA9IG51bGw7Ci0gICAgU3RyaW5nVG9rZW5pemVyIGN1cnJlbnRUb2tlbnM7Ci0gICAgd2hpbGUgKChjdXJyZW50TGluZSA9IGlucHV0LnJlYWRMaW5lKCkpICE9IG51bGwpCi0gICAgewotICAgICAgY3VycmVudFRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY3VycmVudExpbmUsICI9XHRcclxuIik7Ci0gICAgICBpZiAoY3VycmVudFRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIEtleSA9IGN1cnJlbnRUb2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgaWYgKChLZXkgIT0gbnVsbCkgJiYgIUtleS5zdGFydHNXaXRoKCIjIikgJiYgY3VycmVudFRva2Vucy5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0ZW1wW10gPSBuZXcgU3RyaW5nWzJdOwotICAgICAgICB0ZW1wWzBdID0gS2V5OyB0ZW1wWzFdID0gY3VycmVudFRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICAgIGF0dFZlYy5hZGRFbGVtZW50KHRlbXApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBLZXkgbGlzdCBhbmQgcmV0dXJucyB0aGUgZmlyc3QgdmFsdWUgZm9yIHdob3NlCi0gICAqIGtleSB0aGUgZ2l2ZW4gc3RyaW5nIGNvbnRhaW5zLiAgUmV0dXJucyAidW5rbm93biIgaWYgbm8ga2V5IGlzIGNvbnRhaW5lZAotICAgKiBpbiB0aGUgc3RyaW5nLgotICAgKiBAcGFyYW0gcyBTdHJpbmcgYmVpbmcgc2VhcmNoZWQgZm9yIGEga2V5LgotICAgKiBAcmV0dXJuIFZhbHVlIGZvciBrZXkgZm91bmQgaW4gc3RyaW5nLCBvdGhlcndpc2UgInVua25vd24iCi0gICAqLwotICBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIHMpCi0gIHsKLSAgICBpbnQgaSwgaiA9IGF0dFZlYy5zaXplKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgdGVtcFtdID0gKFN0cmluZ1tdKSBhdHRWZWMuZWxlbWVudEF0KGkpOwotICAgICAgaWYgKHMuaW5kZXhPZih0ZW1wWzBdKSA+IC0xKQotICAgICAgICByZXR1cm4gdGVtcFsxXTsKLSAgICB9Ci0gICAgcmV0dXJuICJ1bmtub3duIjsKLSAgfQotfQotCi0vKioKLSAqIFBhcnNlcyBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24ncyAoUEkpIGF0dHJpYnV0ZXMgZm9yIGVhc3kgcmV0cmlldmFsLgotICovCi1jbGFzcyBQSUEKLXsKLQotICBwcml2YXRlIEhhc2h0YWJsZSBwaUF0dHJpYnV0ZXMgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIHBpIFRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHdob3NlIGF0dHJpYnV0ZXMgYXJlIHRvIGJlIHBhcnNlZAotICAgKi8KLSAgUElBKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSkKLSAgewotICAgIHBpQXR0cmlidXRlcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwaS5nZXROb2RlVmFsdWUoKSwgIj1cIiIpOwotICAgIHdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgcGlBdHRyaWJ1dGVzLnB1dCh0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpLCB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB2YWx1ZSBvZiBzcGVjaWZpZWQgYXR0cmlidXRlLgotICAgKiAgQHBhcmFtIG5hbWUgQXR0cmlidXRlIG5hbWUKLSAgICogIEByZXR1cm4gQXR0cmlidXRlIHZhbHVlLCBvciBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgbmFtZSBkb2VzIG5vdCBleGlzdAotICAgKi8KLSAgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAoU3RyaW5nKSBwaUF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotICB9ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL3NlcnZsZXQvQXBwbHlYU0xURXhjZXB0aW9uLmphdmEgYi9zYW1wbGVzL3NlcnZsZXQvQXBwbHlYU0xURXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2M2M2YTEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9zZXJ2bGV0L0FwcGx5WFNMVEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogV3JhcHBlciBmb3IgZXhjZXB0aW9ucyBvY2N1cnJpbmcgZHVyaW5nIGFwcGx5IFhTTCBwcm9jZXNzaW5nLiAgCi0gKiBBbGxvd3MgZm9yIGV4Y2VwdGlvbnMgdG8gYmUgcmV0dXJuZWQgd2l0aCBhbiBhc3NvY2lhdGVkIEhUVFAgU3RhdHVzIENvZGUuCi0gKgotICogQGF1dGhvciBTcGVuY2VyIFNoZXBhcmQgKHNzaGVwYXJkQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIFIuIEFkYW0gS2luZyAocmFrQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIFRvbSBSb3dlICh0cm93ZUB1cy5pYm0uY29tKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugc2VydmxldDsKLQotcHVibGljIGNsYXNzIEFwcGx5WFNMVEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgICogRXhjZXB0aW9uIE1lc3NhZ2UuCi0gICAgICAqIEBzZXJpYWwKLSAgICAgICovIAotICAgIHByaXZhdGUgU3RyaW5nIG15TWVzc2FnZSA9ICIiOwotCi0gICAgLyoqCi0gICAgICAqIEhUVFAgU3RhdHVzIENvZGUuIERlZmF1bHQ9IGludGVybmFsIHNlcnZlciBlcnJvci4KLSAgICAgICogQHNlcmlhbAotICAgICAgKi8KLSAgICBwcml2YXRlIGludCAgbXlIdHRwU3RhdHVzQ29kZSA9IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsgCi0KLSAgICAvKioKLSAgICAgICogV3JhcHBlZCBleGNlcHRpb24KLSAgICAgICogQHNlcmlhbAotICAgICAgKi8KLSAgICBwcml2YXRlIEV4Y2VwdGlvbiBteUV4Y2VwdGlvbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgICogQ29uc3RydWN0b3IgZm9yIGV4Y2VwdGlvbiB3aXRoIG5vIGFkZGl0aW9uYWwgZGV0YWlsLgotICAgICAgKi8KLSAgICBwdWJsaWMgQXBwbHlYU0xURXhjZXB0aW9uKCkgCi0gICAgeyAKLSAgICAgICAgc3VwZXIoKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIENvbnN0cnVjdG9yIGZvciBleGNlcHRpb24gd2l0aCBtZXNzYWdlLgotICAgICAgKiBAcGFyYW0gcyBFeGNlcHRpb24gbWVzc2FnZQotICAgICAgKi8KLSAgICBwdWJsaWMgQXBwbHlYU0xURXhjZXB0aW9uKFN0cmluZyBzKSAKLSAgICB7IAotICAgICAgICBzdXBlcigpOyAKLQlteU1lc3NhZ2UgPSBzOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgZXhjZXB0aW9uIHdpdGggSFRUUCBzdGF0dXMgY29kZS4KLSAgICAgICogQHBhcmFtIGhzYyBWYWxpZCBzdGF0dXMgY29kZSBmcm9tIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlCi0gICAgICAqLwotICAgIHB1YmxpYyBBcHBseVhTTFRFeGNlcHRpb24oaW50IGhzYykgCi0gICAgewotCXN1cGVyKCk7Ci0JbXlIdHRwU3RhdHVzQ29kZSA9IGhzYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogQ29uc3RydWN0b3IgZm9yIGV4Y2VwdGlvbiB3aXRoIG1lc3NhZ2UgYW5kIEhUVFAgc3RhdHVzIGNvZGUuCi0gICAgICAqIEBwYXJhbSBzIEV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAqIEBwYXJhbSBoc2MgVmFsaWQgc3RhdHVzIGNvZGUgZnJvbSBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZQotICAgICAgKi8KLSAgICBwdWJsaWMgQXBwbHlYU0xURXhjZXB0aW9uKFN0cmluZyBzLCBpbnQgaHNjKQotICAgIHsKLQlzdXBlcigpOwotCW15SHR0cFN0YXR1c0NvZGUgPSBoc2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIENvbnN0cnVjdG9yIGZvciBleGNlcHRpb24uCi0gICAgICAqIEBwYXJhbSBlIEV4Y2VwdGlvbiB0byBiZSB3cmFwcGVkLgotICAgICAgKi8KLSAgICBwdWJsaWMgQXBwbHlYU0xURXhjZXB0aW9uKEV4Y2VwdGlvbiBlKQotICAgIHsKLQlzdXBlcigpOwotCW15TWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCW15RXhjZXB0aW9uID0gZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogQ29uc3RydWN0b3IgZm9yIHBhc3NlZCBleGNlcHRpb24gd2l0aCBtZXNzYWdlLgotICAgICAgKiBAcGFyYW0gcyBFeGNlcHRpb24gbWVzc2FnZQotICAgICAgKiBAcGFyYW0gZSBFeGNlcHRpb24gdG8gYmUgd3JhcHBlZC4KLSAgICAgICovCi0gICAgcHVibGljIEFwcGx5WFNMVEV4Y2VwdGlvbiAoU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKQotICAgIHsKLQlzdXBlcigpOwotCW15TWVzc2FnZSA9IHM7Ci0JbXlFeGNlcHRpb24gPSBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgcGFzc2VkIGV4Y2VwdGlvbiB3aXRoIEhUVFAgc3RhdHVzIGNvZGUuCi0gICAgICAqIEBwYXJhbSBlIEV4Y2VwdGlvbiB0byBiZSB3cmFwcGVkLgotICAgICAgKiBAcGFyYW0gaHNjIFZhbGlkIHN0YXR1cyBjb2RlIGZyb20gamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UKLSAgICAgICovCi0gICAgcHVibGljIEFwcGx5WFNMVEV4Y2VwdGlvbihFeGNlcHRpb24gZSwgaW50IGhzYykKLSAgICB7Ci0Jc3VwZXIoKTsKLQlteU1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLQlteUV4Y2VwdGlvbiA9IGU7Ci0JbXlIdHRwU3RhdHVzQ29kZSA9IGhzYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogQ29uc3RydWN0b3IgZm9yIHBhc3NlZCBleGNlcHRpb24gd2l0aCBIVFRQIHN0YXR1cyBjb2RlIGFuZCBtZXNzYWdlLgotICAgICAgKiBAcGFyYW0gcyBFeGNlcHRpb24gbWVzc2FnZQotICAgICAgKiBAcGFyYW0gZSBFeGNlcHRpb24gdG8gYmUgd3JhcHBlZC4KLSAgICAgICogQHBhcmFtIGhzYyBWYWxpZCBzdGF0dXMgY29kZSBmcm9tIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlCi0gICAgICAqLwotICAgIHB1YmxpYyBBcHBseVhTTFRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlLCBpbnQgaHNjKQotICAgIHsKLQlzdXBlcigpOwotCW15TWVzc2FnZSA9IHM7Ci0JbXlFeGNlcHRpb24gPSBlOwotCW15SHR0cFN0YXR1c0NvZGUgPSBoc2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIFJldHVybnMgZXhjZXB0aW9uIG1lc3NhZ2UuCi0gICAgICAqIEByZXR1cm4gZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKLSAgICB7Ci0JcmV0dXJuIG15TWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogQXBwZW5kcyBzdHJpbmcgdG8gZXhjZXB0aW9uIG1lc3NhZ2UuCi0gICAgICAqIEBwYXJhbSBzIFN0cmluZyB0byBiZSBhZGRlZCB0byBtZXNzYWdlCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZE1lc3NhZ2UoU3RyaW5nIHMpCi0gICAgewotCW15TWVzc2FnZSArPSBzOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBSZXR1cm5zIHRoZSB3cmFwcGVkIGV4Y2VwdGlvbi4KLSAgICAgICogQHJldHVybiBXcmFwcGVkIGV4Y2VwdGlvbgotICAgICAgKi8KLSAgICBwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpCi0gICAgewotCXJldHVybiBteUV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogUmV0dXJucyB0aGUgSFRUUCBzdGF0dXMgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KLSAgICAgICogQHJldHVybiBWYWxpZCBzdGF0dXMgY29kZSBmcm9tIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlCi0gICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpCi0gICAgewotCXJldHVybiBteUh0dHBTdGF0dXNDb2RlOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zZXJ2bGV0L0FwcGx5WFNMVExpc3RlbmVyLmphdmEgYi9zYW1wbGVzL3NlcnZsZXQvQXBwbHlYU0xUTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU0NmUyNi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3NlcnZsZXQvQXBwbHlYU0xUTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugc2VydmxldDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLkRlZmF1bHRFcnJvckhhbmRsZXI7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQXBwbHlYU0xUTGlzdGVuZXIgcHJvdmlkZXMgYSBidWZmZXJlZCBsaXN0ZW5lciBlc3NlbnRpYWwgZm9yIGNhcHR1cmluZywgYW5kIHRoZW4gc3Vic2VxdWVudGx5Ci0gKiByZXBvcnRpbmcsIFhNTCBhbmQgWFNMIHByb2Nlc3NvciBtZXNzYWdlcyB3aGljaCBtYXkgYmUgb2YgdXNlIGluIGRlYnVnZ2luZyBYTUwrWFNMIHByb2Nlc3NlZCBhdAotICogdGhlIHNlcnZlci4KLSAqCi0gKiBAYXV0aG9yIFNwZW5jZXIgU2hlcGFyZCAoc3NoZXBhcmRAdXMuaWJtLmNvbSkKLSAqIEBhdXRob3IgUi4gQWRhbSBLaW5nIChyYWtAdXMuaWJtLmNvbSkKLSAqIEBhdXRob3IgVG9tIFJvd2UgKHRyb3dlQHVzLmlibS5jb20pCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wdWJsaWMgY2xhc3MgQXBwbHlYU0xUTGlzdGVuZXIgZXh0ZW5kcyBEZWZhdWx0RXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyCi17Ci0KLSAgICAvKioKLSAgICAgICogT3V0cHV0IHN0cmVhbQotICAgICAgKi8KLSAgICBwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAvKioKLSAgICAgICogQnVmZmVyZWQgb3V0cHV0IHN0cmVhbQotICAgICAgKi8KLSAgICBwdWJsaWMgUHJpbnRXcml0ZXIgb3V0ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgICovCi0gICAgcHVibGljIEFwcGx5WFNMVExpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dFN0cmVhbSksIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBhIHdhcm5pbmcuCi0gICAgICAqCi0gICAgICAqIEBwYXJhbSBzcGUgVGhlIHdhcm5pbmcgaW5mb3JtYXRpb24gZW5jYXBzdWxhdGVkIGluIGEgU0FYIHBhcnNlIGV4Y2VwdGlvbi4KLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpCi0gICAgewotCW91dC5wcmludGxuKCJQYXJzZXIgV2FybmluZzogIiArIHNwZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBhIHJlY292ZXJhYmxlIGVycm9yLgotICAgICAgKgotICAgICAgKiBAcGFyYW0gc3BlIFRoZSBlcnJvciBpbmZvcm1hdGlvbiBlbmNhcHN1bGF0ZWQgaW4gYSBTQVggcGFyc2UgZXhjZXB0aW9uLgotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpCi0gICAgewotCW91dC5wcmludGxuKCJQYXJzZXIgRXJyb3I6ICIgKyBzcGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgYSBub24tcmVjb3ZlcmFibGUgZXJyb3IuCi0gICAgICAqCi0gICAgICAqIEBwYXJhbSBzcGUgVGhlIGVycm9yIGluZm9ybWF0aW9uIGVuY2Fwc3VsYXRlZCBpbiBhIFNBWCBwYXJzZSBleGNlcHRpb24uCi0gICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIEFsd2F5cyB0aHJvd24KLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLQlvdXQucHJpbnRsbigiUGFyc2VyIEZhdGFsIEVycm9yOiAiICsgc3BlLmdldE1lc3NhZ2UoKSk7Ci0JdGhyb3cgc3BlOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBSZXR1cm5zIHRoZSBidWZmZXJlZCBwcm9jZXNzaW5nIG1lc3NhZ2UocykuCi0gICAgICAqIEByZXR1cm4gQnVmZmVyZWQgcHJvY2Vzc2luZyBtZXNzYWdlKHMpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpCi0gICAgewotCXJldHVybiBvdXRTdHJlYW0udG9TdHJpbmcoKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvc2VydmxldC9BcHBseVhTTFRQcm9wZXJ0aWVzLmphdmEgYi9zYW1wbGVzL3NlcnZsZXQvQXBwbHlYU0xUUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWUwZWQ0Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2VydmxldC9BcHBseVhTTFRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1wYWNrYWdlIHNlcnZsZXQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogQXBwbHlYU0xUUHJvcGVydGllcyBjb250YWlucyBvcGVyYXRpb25hbCBwYXJhbWV0ZXJzIGZvciBBcHBseVhTTFQgYmFzZWQgCi0gKiBvbiBwcm9ncmFtIGRlZmF1bHRzIGFuZCBjb25maWd1cmF0aW9uLiAgCi0gKiA8cD5UaGlzIGNsYXNzIGlzIGFsc28gdXNlZCB0byByZXR1cm4gdmFsdWVzIGZvciByZXF1ZXN0LXRpbWUgcGFyYW1ldGVycy48L3A+Ci0gKgotICogQGF1dGhvciBTcGVuY2VyIFNoZXBhcmQgKHNzaGVwYXJkQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIFIuIEFkYW0gS2luZyAocmFrQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIFRvbSBSb3dlICh0cm93ZUB1cy5pYm0uY29tKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcHVibGljIGNsYXNzIEFwcGx5WFNMVFByb3BlcnRpZXMgewotCi0gICAgLyoqCi0gICAgICAqIFByb2dyYW0gZGVmYXVsdCBmb3IgcGFyYW1ldGVyICJVUkwiCi0gICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfVVJMOwotCi0gICAgLyoqCi0gICAgICAqIFByb2dyYW0gZGVmYXVsdCBmb3IgcGFyYW1ldGVyICJ4c2xVUkwiCi0gICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfeHNsVVJMOwotICAgIAotICAgIC8qKgotICAgICAgKiBQcm9ncmFtIGRlZmF1bHQgZm9yIHBhcmFtZXRlciAiZGVidWciCi0gICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBERUZBVUxUX2RlYnVnOwotCi0gICAgLyoqCi0gICAgICAqIFByb2dyYW0gZGVmYXVsdCBmb3IgcGFyYW1ldGVyICJub0NvbmZsaWN0V2FybmluZ3MiCi0gICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBERUZBVUxUX25vQ1c7Ci0gICAgCi0gICAgLyoqCi0gICAgICAqIENvbnN0cnVjdG9yIHRvIHVzZSBwcm9ncmFtIGRlZmF1bHRzLgotICAgICAgKi8KLSAgICBwdWJsaWMgQXBwbHlYU0xUUHJvcGVydGllcygpIAotICAgIHsKLQlERUZBVUxUX1VSTCA9IG51bGw7Ci0JREVGQVVMVF94c2xVUkwgPSBudWxsOwotCURFRkFVTFRfZGVidWcgPSBmYWxzZTsKLQlERUZBVUxUX25vQ1cgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogQ29uc3RydWN0b3IgdG8gdXNlIHRvIG92ZXJyaWRlIHByb2dyYW0gZGVmYXVsdHMuCi0gICAgICAqIEBwYXJhbSBjb25maWcgU2VydmxldCBjb25maWd1cmF0aW9uCi0gICAgICAqLwotICAgIHB1YmxpYyBBcHBseVhTTFRQcm9wZXJ0aWVzKFNlcnZsZXRDb25maWcgY29uZmlnKQotICAgIHsKLQlTdHJpbmcgeG0gPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiVVJMIiksCi0JICAgICAgIHh1ID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoInhzbFVSTCIpLAotCSAgICAgICBkYiA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJkZWJ1ZyIpLAotCSAgICAgICBjdyA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJub0NvbmZsaWN0V2FybmluZ3MiKTsKLQkgICAgICAgCi0JaWYgKHhtICE9IG51bGwpIERFRkFVTFRfVVJMID0geG07Ci0JZWxzZSBERUZBVUxUX1VSTCA9IG51bGw7Ci0JaWYgKHh1ICE9IG51bGwpIERFRkFVTFRfeHNsVVJMID0geHU7Ci0JZWxzZSBERUZBVUxUX3hzbFVSTCA9IG51bGw7Ci0JaWYgKGRiICE9IG51bGwpIERFRkFVTFRfZGVidWcgPSBuZXcgQm9vbGVhbihkYikuYm9vbGVhblZhbHVlKCk7Ci0JZWxzZSBERUZBVUxUX2RlYnVnID0gZmFsc2U7Ci0JaWYgKGN3ICE9IG51bGwpIERFRkFVTFRfbm9DVyA9IG5ldyBCb29sZWFuKGN3KS5ib29sZWFuVmFsdWUoKTsKLQllbHNlIERFRkFVTFRfbm9DVyA9IGZhbHNlOwotICAgIH0KLSAgIAotICAgIC8qKgotICAgICAgKiBHaXZlbiBhIHBhcmFtZXRlciBuYW1lLCByZXR1cm5zIHRoZSBIVFRQIHJlcXVlc3QncyBTdHJpbmcgdmFsdWU7IAotICAgICAgKiBpZiBub3QgcHJlc2VudCBpbiByZXF1ZXN0LCByZXR1cm5zIGRlZmF1bHQgU3RyaW5nIHZhbHVlLgotICAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGNoZWNrIGZvciBkZWZhdWx0IG92ZXJyaWRlCi0gICAgICAqIEBwYXJhbSBwYXJhbSBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgbmFtZWQgcGFyYW1ldGVyCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFBhcm1TdHJpbmcoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBwYXJhbSkKLSAgICB7Ci0JaWYgKHJlcXVlc3QgIT0gbnVsbCkgeyAKLQkgICAgU3RyaW5nW10gcGFyYW1WYWxzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW0pOyAKLQkgICAgaWYgKHBhcmFtVmFscyAhPSBudWxsKSAKLQkJcmV0dXJuIHBhcmFtVmFsc1swXTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZyBmb3IgIlVSTCIuCi0gICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3QgdG8gY2hlY2sgZm9yIHBhcmFtZXRlciB2YWx1ZQotICAgICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBmb3IgIlVSTCIKLSAgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gV2lsbCBub3QgYmUgdGhyb3duCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WE1MdXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICB7Ci0JU3RyaW5nIHRlbXAgPSBnZXRSZXF1ZXN0UGFybVN0cmluZyhyZXF1ZXN0LCAiVVJMIik7Ci0JaWYgKHRlbXAgIT0gbnVsbCkKLQkgICAgcmV0dXJuIHRlbXA7Ci0JcmV0dXJuIERFRkFVTFRfVVJMOwotICAgIH0gICAgIAotICAgIAotICAgIC8qKgotICAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yICJ4c2xVUkwiLgotICAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGNoZWNrIGZvciBwYXJhbWV0ZXIgdmFsdWUKLSAgICAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgZm9yICJ4c2xVUkwiCi0gICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIFdpbGwgbm90IGJlIHRocm93bgotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhTTHVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgeyAgCi0JU3RyaW5nIHRlbXAgPSBnZXRSZXF1ZXN0UGFybVN0cmluZyhyZXF1ZXN0LCAieHNsVVJMIik7Ci0JaWYgKHRlbXAgIT0gbnVsbCkKLQkgICAgcmV0dXJuIHRlbXA7Ci0JcmV0dXJuIERFRkFVTFRfeHNsVVJMOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5nIGZvciAiZGVidWciLgotICAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGNoZWNrIGZvciBwYXJhbWV0ZXIgdmFsdWUKLSAgICAgICogQHJldHVybiBCb29sZWFuIHZhbHVlIGZvciAiZGVidWciCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVidWcoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgewotCVN0cmluZyB0ZW1wID0gZ2V0UmVxdWVzdFBhcm1TdHJpbmcocmVxdWVzdCwgImRlYnVnIik7Ci0JaWYgKHRlbXAgIT0gbnVsbCkKLQkgICAgcmV0dXJuIG5ldyBCb29sZWFuKHRlbXApLmJvb2xlYW5WYWx1ZSgpOwotCXJldHVybiBERUZBVUxUX2RlYnVnOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yICJub0NvbmZsaWN0V2FybmluZ3MiLgotICAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGNoZWNrIGZvciBwYXJhbWV0ZXIgdmFsdWUKLSAgICAgICogQHJldHVybiBCb29sZWFuIHZhbHVlIGZvciAibm9Db25mbGljdFdhcm5pbmdzIgotICAgICAgKi8KLSAgICBib29sZWFuIGlzTm9DVyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgICB7Ci0JU3RyaW5nIHRlbXAgPSBnZXRSZXF1ZXN0UGFybVN0cmluZyhyZXF1ZXN0LCAibm9Db25mbGljdFdhcm5pbmdzIik7Ci0JaWYgKHRlbXAgIT0gbnVsbCkKLQkgICAgcmV0dXJuIG5ldyBCb29sZWFuKHRlbXApLmJvb2xlYW5WYWx1ZSgpOwotCXJldHVybiBERUZBVUxUX25vQ1c7Ci0gICAgfSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL3NlcnZsZXQvRGVmYXVsdEFwcGx5WFNMVFByb3BlcnRpZXMuamF2YSBiL3NhbXBsZXMvc2VydmxldC9EZWZhdWx0QXBwbHlYU0xUUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmRiOTY3Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2VydmxldC9EZWZhdWx0QXBwbHlYU0xUUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBzZXJ2bGV0OwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lio7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogRGVmYXVsdEFwcGx5WFNMVFByb3BlcnRpZXMgY29udGFpbnMgb3BlcmF0aW9uYWwgcGFyYW1ldGVycyBmb3IgRGVmYXVsdEFwcGx5WFNMVCBiYXNlZCAKLSAqIG9uIHByb2dyYW0gZGVmYXVsdHMgYW5kIGNvbmZpZ3VyYXRpb24uICAKLSAqIDxwPlRoaXMgY2xhc3MgaXMgYWxzbyB1c2VkIHRvIHJldHVybiB2YWx1ZXMgZm9yIHJlcXVlc3QtdGltZSBwYXJhbWV0ZXJzLjwvcD4KLSAqCi0gKiBAYXV0aG9yIFNwZW5jZXIgU2hlcGFyZCAoc3NoZXBhcmRAdXMuaWJtLmNvbSkKLSAqIEBhdXRob3IgUi4gQWRhbSBLaW5nIChyYWtAdXMuaWJtLmNvbSkKLSAqIEBhdXRob3IgVG9tIFJvd2UgKHRyb3dlQHVzLmlibS5jb20pCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFwcGx5WFNMVFByb3BlcnRpZXMgZXh0ZW5kcyBBcHBseVhTTFRQcm9wZXJ0aWVzIHsKLSAgICAKLSAgICAvKioKLSAgICAgICogUHJvZ3JhbSBkZWZhdWx0IGZvciBwYXJhbWV0ZXIgImNhdGFsb2ciLgotICAgICAgKiBAc2VlICNnZXRDYXRhbG9nCi0gICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfY2F0YWxvZzsKLQotICAgIC8qKgotICAgICAgKiBIb3N0IHVzZWQgZm9yIGxvY2FsIGNvbnRleHQgY29tcGFyaXNvbnMuCi0gICAgICAqIEBzZWUgI2dldExvY2FsSG9zdAotICAgICAgKiBAc2VlICNzZXRMb2NhbEhvc3QKLSAgICAgICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBTdHJpbmcgbG9jYWxIb3N0ID0gbnVsbDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXJ2ZXIgcG9ydC4gVXNlZCBpbiB0b1NhZmVVUkwoKSAtLSBmaXggc3VibWl0dGVkIGJ5IFJpdGVzaCBLdW1hci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBwb3J0ID0wOwotCi0gICAgLyoqCi0gICAgICAqIENvbnN0cnVjdG9yIHRvIHVzZSBwcm9ncmFtIGRlZmF1bHRzLgotICAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdEFwcGx5WFNMVFByb3BlcnRpZXMoKQotICAgIHsKLQlzdXBlcigpOwotCURFRkFVTFRfY2F0YWxvZyA9IG51bGw7Ci0Jc2V0TG9jYWxIb3N0KCk7Ci0JLy8gc2V0U3lzdGVtUHJvcGVydGllcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBDb25zdHJ1Y3RvciB0byB1c2UgdG8gb3ZlcnJpZGUgcHJvZ3JhbSBkZWZhdWx0cy4KLSAgICAgICogQHBhcmFtIGNvbmZpZyBTZXJ2bGV0IGNvbmZpZ3VyYXRpb24KLSAgICAgICogQHNlZSAjc2V0TG9jYWxIb3N0Ci0gICAgICAqLwotICAgIHB1YmxpYyBEZWZhdWx0QXBwbHlYU0xUUHJvcGVydGllcyhTZXJ2bGV0Q29uZmlnIGNvbmZpZykKLSAgICB7Ci0JICAgIHN1cGVyKGNvbmZpZyk7Ci0JICAgIFN0cmluZyBjYXQgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiY2F0YWxvZyIpOwotCSAgICBpZiAoY2F0ICE9IG51bGwpIERFRkFVTFRfY2F0YWxvZyA9IGNhdDsKLQkgICAgZWxzZSBERUZBVUxUX2NhdGFsb2cgPSBudWxsOwotCSAgICBzZXRMb2NhbEhvc3QoKTsKLQkgICAgc2V0U3lzdGVtUHJvcGVydGllcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBsb2NhbCBJUCBob3N0IG5hbWU7IHRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGNvbnN0cmFpbiB1bnRydXN0ZWQgCi0gICAgICAqIFhNTCBkb2N1bWVudCBhbmQgWFNMIHN0eWxlc2hlZXQgVVJMcyB0byB0aGlzIHRydXN0ZWQgaG9zdC4KLSAgICAgICogQHNlZSAjZ2V0TG9jYWxIb3N0Ci0gICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldExvY2FsSG9zdCgpCi0gICAgewotCSAgICB0cnkgCi0JICAgIHsgCi0JICAgICAgICBsb2NhbEhvc3QgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpOwotCSAgICB9IAotCSAgICBjYXRjaCAoRXhjZXB0aW9uIHVoZSkgCi0JICAgIHsKLQkgICAgICBsb2NhbEhvc3QgPSBudWxsOwotCSAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdHJ1c3RlZCBJUCBob3N0LgotICAgICAgKiBAcmV0dXJuIE5hbWUgb2YgdHJ1c3RlZCBob3N0Ci0gICAgICAqIEBzZWUgI3NldExvY2FsSG9zdAotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsSG9zdCgpCi0gICAgewotCSAgICByZXR1cm4gbG9jYWxIb3N0OwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBSZXR1cm5zIGEgVVJMIHdoaWNoIGlzIGNvbnN0cmFpbmVkIHRvIGEgdHJ1c3RlZCBJUCBob3N0LgotICAgICAgKiBAcGFyYW0geFVSTCBVUkwgb3IgZmlsZSBwYXRoIHRvIGJlIG1hZGUgc2FmZSAKLSAgICAgICogQHJldHVybiBTYWZlIFVSTAotICAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBUaHJvd24gd2hlbiB4VVJMIGlzIG5vdCBhIHZhbGlkIFVSTAotICAgICAgKiBAc2VlICNzZXRMb2NhbEhvc3QKLSAgICAgICogQHNlZSAjZ2V0TG9jYWxIb3N0Ci0gICAgICAqLwotICAgIHB1YmxpYyBVUkwgdG9TYWZlVVJMKFN0cmluZyB4VVJMLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgewotICAgICAgLy8gRml4IHN1Ym1pdHRlZCBieSBSaXRlc2ggS3VtYXIuIFBvcnQgaXMgaW5jbHVkZWQgaW4gY29uc3RydWN0aW9uIG9mIFVSTCB0aGF0IGlzIHJldHVybmVkLgotICAgICAgaWYgKHBvcnQgPT0gMCkKLSAgICAgICAgcG9ydCA9IHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpOwotICAgICAgCi0JICAgIGlmICh4VVJMID09IG51bGwpCi0JICAgICAgcmV0dXJuIG51bGw7Ci0KLQkgICAgaWYgKHhVUkwuc3RhcnRzV2l0aCgiLyIpKSAKLSAgICAgIHsKLQkgICAgICB0cnkgCi0gICAgICAgIHsKLQkJICAgICAgcmV0dXJuIG5ldyBVUkwoImh0dHAiLCBsb2NhbEhvc3QsIHBvcnQsIHhVUkwpOwotCSAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIAotICAgICAgICB7Ci0JICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCJ0b1NhZmVVUkwoKTogIiArIHhVUkwgKyAKLQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRpZCBub3QgbWFwIHRvIGxvY2FsIik7Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIFVSTCB0ZW1wVVJMID0gbnVsbDsKLQkgICAgdHJ5IAotICAgICAgeyAKLQkgICAgICB0ZW1wVVJMID0gbmV3IFVSTCh4VVJMKTsKLQkgICAgfSAKLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSAKLSAgICAgIHsKLQkgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCJ0b1NhZmVVUkwoKTogIiArIHhVUkwgKyAKLQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBub3QgYSB2YWxpZCBVUkwiKTsgCi0JICAgIH0KLQkgICAgdHJ5IAotICAgICAgeyAKLQkgICAgICByZXR1cm4gbmV3IFVSTCh0ZW1wVVJMLmdldFByb3RvY29sKCksIGxvY2FsSG9zdCwgCi0JCQkgICAgICAgICAgICAgICAgIHBvcnQsIHRlbXBVUkwuZ2V0RmlsZSgpKTsKLQkgICAgfSAKLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSAKLSAgICAgIHsKLQkgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCJ0b1NhZmVVUkwoKTogIiArIHhVUkwgKyAKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgIiBjb3VsZCBub3QgYmUgY29udmVydGVkIHRvIGxvY2FsIGhvc3QiKTsKLQkgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAgKglSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29uc3RyYWluZWQgVVJMIGZvciB0aGUgWE1MIGRvY3VtZW50LgotICAgICAgKiBJZiB0aGVyZSBpcyBubyByZXF1ZXN0IHBhcmFtZXRlciBmb3IgdGhlIFhNTCBkb2N1bWVudCwgcmV0dXJuIHRoZSBjb25maWd1cmVkIGRlZmF1bHQuCi0gICAgICAqIEBwYXJhbSByZXF1ZXN0IE1heSBjb250YWluIGFuIFhNTCBkb2N1bWVudCBVUkwgcGFyYW1ldGVyCi0gICAgICAqIEByZXR1cm4gU3RyaW5nIGZvcm0gb2YgWE1MIFVSTAotICAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBUaHJvd24gd2hlbiByZXF1ZXN0IFVSTCBpcyBub3QgYSB2YWxpZCBVUkwgb3IgcGF0aAotICAgICAgKiBAc2VlICN0b1NhZmVVUkwKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRYTUx1cmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgIHsKLQkgICAgVVJMIHVybCA9IHRvU2FmZVVSTChnZXRSZXF1ZXN0UGFybVN0cmluZyhyZXF1ZXN0LCAiVVJMIikscmVxdWVzdCk7Ci0JICAgIGlmICh1cmwgPT0gbnVsbCkKLQkgICAgICByZXR1cm4gc3VwZXIuZ2V0WE1MdXJsKG51bGwpOwotCSAgICByZXR1cm4gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb25zdHJhaW5lZCBVUkwgZm9yIHRoZSBYU0wgc3R5bGVzaGVldCAKLSAgICAgICogZnJvbSB0aGUgcmVxdWVzdC4KLSAgICAgICogQHBhcmFtIHJlcXVlc3QgTWF5IGNvbnRhaW4gYW4gWFNMIHN0eWxlc2hlZXQgVVJMIHBhcmFtZXRlcgotICAgICAgKiBAcmV0dXJuIFN0cmluZyBmb3JtIG9mIHJlcXVlc3QgWFNMIFVSTCwgb3IgbnVsbCBpZiByZXF1ZXN0IGNvbnRhaW5zIG5vIHhzbFVSTCBwYXJhbWV0ZXIKLSAgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gVGhyb3duIHdoZW4gcmVxdWVzdCBVUkwgaXMgbm90IGEgdmFsaWQgVVJMIG9yIHBhdGgKLSAgICAgICogQHNlZSAjdG9TYWZlVVJMCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WFNMUmVxdWVzdFVSTChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgewotCSAgICBVUkwgdXJsID0gdG9TYWZlVVJMKGdldFJlcXVlc3RQYXJtU3RyaW5nKHJlcXVlc3QsICJ4c2xVUkwiKSxyZXF1ZXN0KTsKLQkgICAgaWYgKHVybCA9PSBudWxsKQotCSAgICAgICAgcmV0dXJuIG51bGw7Ci0JICAgIHJldHVybiB1cmwudG9FeHRlcm5hbEZvcm0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbnN0cmFpbmVkIHJlcXVlc3QgVVJMIGZvciB0aGUgWFNMIHN0eWxlc2hlZXQuCi0gICAgICAqIElmIHRoZXJlIGlzIG5vIHJlcXVlc3QgcGFyYW1ldGVyIGZvciB0aGUgWFNMIHN0eWxlc2hlZXQsIHJldHVybiB0aGUgY29uZmlndXJlZCBkZWZhdWx0LgotICAgICAgKiBAcGFyYW0gcmVxdWVzdCBNYXkgY29udGFpbiBhbiBYU0wgc3R5bGVzaGVldCBVUkwgcGFyYW1ldGVyCi0gICAgICAqIEByZXR1cm4gU3RyaW5nIGZvcm0gb2YgWFNMIFVSTAotICAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBUaHJvd24gd2hlbiByZXF1ZXN0IFVSTCBpcyBub3QgYSB2YWxpZCBVUkwgb3IgcGF0aAotICAgICAgKiBAc2VlICN0b1NhZmVVUkwKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRYU0x1cmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgIHsKLQkgICAgU3RyaW5nIHJlcVVSTCA9IGdldFhTTFJlcXVlc3RVUkwocmVxdWVzdCk7Ci0JICAgIGlmIChyZXFVUkwgIT0gbnVsbCkKLQkgICAgICAgIHJldHVybiByZXFVUkw7Ci0JICAgIHJldHVybiBzdXBlci5nZXRYU0x1cmwobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICAqIFJldHVybnMgVVJMcyBmb3IgYWxsIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2NpbC5vcmcvfmNvd2FuL1hNTC9YQ2F0YWxvZy5odG1sIj5YQ2F0YWxvZ3M8L2E+IAotICAgICAgKiB0aGF0IGFyZSB0byBiZSB1c2VkIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QuICBDYXRhbG9ncyBhcmUgdXNlZCB0byByZXNvbHZlIFhNTCBwdWJsaWMgaWRlbnRpZmllcnMKLSAgICAgICogaW50byBzeXN0ZW0gaWRlbnRpZmllcnMuCi0gICAgICAqIDxwPkEgc2luZ2xlIFhDYXRhbG9nIGNhbiBiZSBjb25maWd1cmVkIGFzIGEgZGVmYXVsdCwKLSAgICAgICogYnV0IG11bHRpcGxlIFhDYXRhbG9ncyBjYW4gYmUgc3BlY2lmaWVkIGF0IHJlcXVlc3QgdGltZSB0byBhdWdtZW50IHRoZSBjb25maWd1cmVkIGRlZmF1bHQuCi0gICAgICAqIEBwYXJhbSByZXF1ZXN0IE1heSBjb250YWluIG9uZSBvciBtb3JlIFhDYXRhbG9nIHBhcmFtZXRlcnMKLSAgICAgICogQHJldHVybiBBcnJheSBvZiBzdHJpbmdzIGZvciBhbGwgY2F0YWxvZyBVUkxzCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDYXRhbG9nKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICAgIHsKLQkgICAgU3RyaW5nIHRlbXBbXSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKCJjYXRhbG9nIik7Ci0JICAgIGlmIChERUZBVUxUX2NhdGFsb2cgPT0gbnVsbCkKLQkgICAgICAgIHJldHVybiB0ZW1wOwotCSAgICBpZiAodGVtcCA9PSBudWxsKSAKLSAgICAgIHsKLQkgICAgICBTdHJpbmcgZGVmYXVsdEFycmF5W10gPSBuZXcgU3RyaW5nIFsxXTsKLQkgICAgICBkZWZhdWx0QXJyYXlbMF0gPSBERUZBVUxUX2NhdGFsb2c7Ci0JICAgICAgcmV0dXJuIGRlZmF1bHRBcnJheTsKLQkgICAgfQotCSAgICBpbnQgaSwgbGVuID0gdGVtcC5sZW5ndGggKyAxOwotCSAgICBTdHJpbmcgbmV3Q2F0YWxvZ3NbXSA9IG5ldyBTdHJpbmdbbGVuXTsKLQkgICAgbmV3Q2F0YWxvZ3NbMF0gPSBERUZBVUxUX2NhdGFsb2c7Ci0JICAgIGZvciAoaT0xOyBpIDwgbGVuOyBpKyspIAotICAgICAgewotCSAgICAgIG5ld0NhdGFsb2dzW2ldID0gdGVtcFtpLTFdOwotCSAgICB9Ci0JICAgIHJldHVybiBuZXdDYXRhbG9nczsKLSAgICB9Ci0JCi0JIC8qKgotICAgKiBJIHRoaW5rIHdlIG5vIGxvbmdlciBuZWVkIHRoaXMuIFNldHMgdGhlIDMgamF4cCBjb3JlIHN5c3RlbSBwcm9wZXJ0aWVzLgotICAgKi8JCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U3lzdGVtUHJvcGVydGllcygpCi0JewotCSAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcHMucHV0KCJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSIsIAotICAgICAgICAgICAgICAib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCIpOwotICAgIHByb3BzLnB1dCgiamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSIsIAotICAgICAgICAgICAgICAib3JnLmFwYWNoZS54ZXJjZXMuamF4cC5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5SW1wbCIpOwotICAgIHByb3BzLnB1dCgiamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeSIsIAotICAgICAgICAgICAgICAib3JnLmFwYWNoZS54ZXJjZXMuamF4cC5TQVhQYXJzZXJGYWN0b3J5SW1wbCIpOwotICAgIAotICAgICAgUHJvcGVydGllcyBzeXN0ZW1Qcm9wcyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICBFbnVtZXJhdGlvbiBwcm9wRW51bSA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgIHdoaWxlKHByb3BFbnVtLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcHJvcCA9IChTdHJpbmcpcHJvcEVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgaWYoIXN5c3RlbVByb3BzLmNvbnRhaW5zS2V5KHByb3ApKQotICAgICAgICAgIHN5c3RlbVByb3BzLnB1dChwcm9wLCBwcm9wcy5nZXRQcm9wZXJ0eShwcm9wKSk7Ci0gICAgICB9Ci0gICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhzeXN0ZW1Qcm9wcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3NlcnZsZXQvU2ltcGxlWFNMVFNlcnZsZXQuamF2YSBiL3NhbXBsZXMvc2VydmxldC9TaW1wbGVYU0xUU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2MwODIyLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2VydmxldC9TaW1wbGVYU0xUU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBzZXJ2bGV0OwotCi1pbXBvcnQgamF2YXguc2VydmxldC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLS8qCi0gKiBUaGlzIHNhbXBsZSBhcHBsaWVzIHRoZSB0b2RvLnhzbCBzdHlsZXNoZWV0IHRvIHRoZQotICogdG9kby54bWwgWE1MIGRvY3VtZW50LCBhbmQgcmV0dXJucyB0aGUgdHJhbnNmb3JtYXRpb24KLSAqIG91dHB1dCAoSFRNTCkgdG8gdGhlIGNsaWVudCBicm93c2VyLgotICoKLSAqIElNUE9SVEFOVDogRm9yIHRoaXMgdG8gd29yaywgeW91IG11c3QgcGxhY2UgdG9kby54c2wgYW5kIHRvZG8ueG1sIAotICogaW4gdGhlIHNlcnZsZXQgcm9vdCBkaXJlY3RvcnkgZm9yIGRvY3VtZW50cy4KLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIFNpbXBsZVhTTFRTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgewotCi0gIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5pbml0KGNvbmZpZyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0dldCAoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gT3V0cHV0IGdvZXMgaW4gdGhlIHJlc3BvbnNlIHN0cmVhbS4KLSAgICBQcmludFdyaXRlciBvdXQgPSBuZXcgUHJpbnRXcml0ZXIgKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAvLyBUaGUgc2VydmxldCByZXR1cm5zIEhUTUwuCi0gICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOyAgICAKLSAgICB0cnkKLSAgICB7CQotICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAvLyBHZXQgdGhlIFhNTCBpbnB1dCBkb2N1bWVudCBhbmQgdGhlIHN0eWxlc2hlZXQuCi0gICAgICBTb3VyY2UgeG1sU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgVVJMKCJmaWxlOnRvZG8ueG1sIikub3BlblN0cmVhbSgpKTsKLSAgICAgIFNvdXJjZSB4c2xTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBVUkwoImZpbGU6dG9kby54c2wiKS5vcGVuU3RyZWFtKCkpOwotICAgICAgLy8gR2VuZXJhdGUgdGhlIHRyYW5zZm9ybWVyLgotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0RmFjdG9yeS5uZXdUcmFuc2Zvcm1lcih4c2xTb3VyY2UpOwotICAgICAgLy8gUGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24sIHNlbmRpbmcgdGhlIG91dHB1dCB0byB0aGUgcmVzcG9uc2UuCi0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oeG1sU291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KG91dCkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgb3V0LndyaXRlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKG91dCk7ICAgIAotICAgIH0KLSAgICBvdXQuY2xvc2UoKTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvc2VydmxldC9Vc2VTdHlsZXNoZWV0UGFyYW1TZXJ2bGV0LmphdmEgYi9zYW1wbGVzL3NlcnZsZXQvVXNlU3R5bGVzaGVldFBhcmFtU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzg0MGJiLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2VydmxldC9Vc2VTdHlsZXNoZWV0UGFyYW1TZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0KLS8qCi1TaW1wbGUgU2VydmxldCBFeGFtcGxlIHVzaW5nIGEgc3R5bGVzaGVldCBwYXJhbWV0ZXIKLSAqLwotcGFja2FnZSBzZXJ2bGV0OwotLy8gSW1wb3J0ZWQgVHJhWCBjbGFzc2VzCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLS8vIEltcG9ydGVkIFNBWCBjbGFzc2VzCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vLyBJbXBvcnRlZCBqYXZhLmlvIGFuZCBqYXZheC5zZXJ2bGV0IGNsYXNzZXMKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YXguc2VydmxldC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotCi1wdWJsaWMgY2xhc3MgVXNlU3R5bGVzaGVldFBhcmFtU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKLQkKLQlQcmludFdyaXRlciBvdXQ7Ci0JU3RyaW5nIHhzbEZpbGUsIHhtbEZpbGUsIHBhcmFtVmFsdWU7Ci0JcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0JCQl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmVzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKLQkJCW91dCA9IHJlcy5nZXRXcml0ZXIoKTsKLQotICAgICAgcGFyYW1WYWx1ZSA9IHJlcS5nZXRQYXJhbWV0ZXIoIlBWQUwiKTsKLQkJCXhtbEZpbGUgICAgPSByZXEuZ2V0UGFyYW1ldGVyKCJYTUwiKTsKLQkJCXhzbEZpbGUgICAgPSByZXEuZ2V0UGFyYW1ldGVyKCJYU0wiKTsKLSAJCWlmIChwYXJhbVZhbHVlID09IG51bGwpIHsKLQkJCW91dC5wcmludGxuKAotCQkJIjxoMT5ObyBpbnB1dCBmb3IgcGFyYW1WYWx1ZTwvaDE+Iik7Ci0JCQlyZXR1cm47Ci0JCX0KLSAJCWlmICggeG1sRmlsZSA9PSBudWxsKSB7Ci0JCQlvdXQucHJpbnRsbigKLQkJCSI8aDE+Tm8gaW5wdXQgZm9yIHhtbEZpbGU8L2gxPiIpOwotCQkJcmV0dXJuOwotCQl9CQotCQlpZiAoIHhzbEZpbGUgPT0gbnVsbCkgewotCQkJb3V0LnByaW50bG4oCi0JCQkiPGgxPk5vIGlucHV0IGZvciB4c2xGaWxlPC9oMT4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPQotCQkJVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0KLQkJCXRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKG5ldyBTdHJlYW1Tb3VyY2UoeHNsRmlsZSkpOwotCi0gICAgLy8gU2V0IHRoZSBzdHlsZXNoZWV0IHBhcmFtZXRlciAobmFtZWQgcGFyYW0xKS4KLQkJCXRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcigicGFyYW0xIiwgcGFyYW1WYWx1ZSk7Ci0gICAgLy8gUGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24uCi0JCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IFN0cmVhbVNvdXJjZSh4bWxGaWxlKSwKLQkJCQkJICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChvdXQpKTsKLQkJfQkJCi0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsJCQkKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTeXN0ZW0uZXhpdCgtMSk7Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKG91dCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3NlcnZsZXQvWFNMVFNlcnZsZXRXaXRoUGFyYW1zLmphdmEgYi9zYW1wbGVzL3NlcnZsZXQvWFNMVFNlcnZsZXRXaXRoUGFyYW1zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZTczZjkuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9zZXJ2bGV0L1hTTFRTZXJ2bGV0V2l0aFBhcmFtcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBzZXJ2bGV0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi0vKgotICogVGhpcyBzYW1wbGUgdGFrZXMgaW5wdXQgcGFyYW1ldGVycyBpbiB0aGUgcmVxdWVzdCBVUkw6IGEgVVJMCi0gKiBwYXJhbWV0ZXIgZm9yIHRoZSBYTUwgaW5wdXQsIGFuIHhzbFVSTCBwYXJhbWV0ZXIgZm9yIHRoZSBzdHlsZXNoZWV0LAotICogYW5kIG9wdGlvbmFsIHN0eWxlc2hlZXQgcGFyYW1ldGVycy4KLSAqIFRvIHJ1biB0aGUgZXF1aXZhbGVudCBvZiBTaW1wbGVzdFhTTFNlcnZsZXQgKHdpdGggdGhlIGRvY3VtZW50cyBpbiB0aGUKLSAqIHNlcnZsZXQgZG9jdW1lbnQgcm9vdCBkaXJlY3RvcnkpLCB0aGUgcmVxdWVzdCBVUkwgaXMKLSAqIGh0dHA6Ly88c2VydmVyL3NlcnZsZXRwYXRoPnNlcnZsZXQuU2ltcGxlWFNMU2VydmxldD9VUkw9ZmlsZTp0b2RvLnhtbCZ4c2xVUkw9ZmlsZTp0b2RvLnhzbAotICoKLSAqIFVzaW5nIGEgc3R5bGVzaGVldCBQcm9jZXNzaW5nIEluc3RydWN0aW9uOgotICogSWYgdGhlIFhNTCBkb2N1bWVudCBpbmNsdWRlcyBhIHN0eWxlc2hlZXQgUEkgdGhhdCB5b3Ugd2FudCB0byB1c2UsIAotICogb21pdCB0aGUgeHNsVVJMIHBhcmFtZXRlci4KLSAqCi0gKiBTZW5kaW5nIHN0eWxlc2hlZXQgcGFyYW1ldGVyczogCi0gKiBJZiwgZm9yIGV4YW1wbGUsIGEgc2VydmxldCB0YWtlcyBhIHN0eWxlc2hlZXQgcGFyYW1ldGVyIG5hbWVkIHBhcmFtMQotICogcGFyYW0xIHRoYXQgeW91IHdhbnQgdG8gc2V0IHRvIGZvbywgaW5jbHVkZSBwYXJhbTE9Zm9vIGluIHRoZSBVUkwuCi0gKi8KLQotcHVibGljIGNsYXNzIFhTTFRTZXJ2bGV0V2l0aFBhcmFtcyBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKLQotICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuaW5pdChjb25maWcpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9HZXQgKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLSAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIE91dHB1dCBnb2VzIGluIHRoZSByZXNwb25zZSBzdHJlYW0uCi0gICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyIChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgLy8gVGhpcyBzZXJ2bGV0IGlzIGludGVuZGVkIHRvIHJldHVybiBIVE1MLgotICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsgICAgCi0gICAgdHJ5Ci0gICAgewkKLSAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgLy8gR2V0IHBhcmFtcyBmcm9tIFVSTC4KLSAgICAgIFN0cmluZyB4bWwgPSBnZXRSZXF1ZXN0UGFyYW0ocmVxdWVzdCwgIlVSTCIpOwotICAgICAgU3RyaW5nIHhzbCA9IGdldFJlcXVlc3RQYXJhbShyZXF1ZXN0LCAieHNsVVJMIik7Ci0gICAgICBTb3VyY2UgeG1sU291cmNlID0gbnVsbDsKLSAgICAgIFNvdXJjZSB4c2xTb3VyY2UgPSBudWxsOwotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBudWxsOwotICAgICAgLy8gR2V0IHRoZSBYTUwgaW5wdXQgZG9jdW1lbnQuCi0gICAgICBpZiAoeG1sICE9IG51bGwgJiYgeG1sLmxlbmd0aCgpPiAwKQotICAgICAgICB4bWxTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBVUkwoeG1sKS5vcGVuU3RyZWFtKCkpOwotICAgICAgLy8gR2V0IHRoZSBzdHlsZXNoZWV0LgotICAgICAgaWYgKHhzbCAhPSBudWxsICYmIHhzbC5sZW5ndGgoKT4gMCkKLSAgICAgICAgeHNsU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgVVJMKHhzbCkub3BlblN0cmVhbSgpKTsKLSAgICAgIGlmICh4bWxTb3VyY2UgIT0gbnVsbCkgLy8gV2UgaGF2ZSBhbiBYTUwgaW5wdXQgZG9jdW1lbnQuCi0gICAgICB7Ci0gICAgICAgIGlmICh4c2xTb3VyY2UgPT0gbnVsbCkgLy8gSWYgbm8gc3R5bGVzaGVldCwgbG9vayBmb3IgUEkgaW4gWE1MIGlucHV0IGRvY3VtZW50LgotICAgICAgICB7Ci0gICAgIAkgICAgU3RyaW5nIG1lZGlhPSBudWxsICwgdGl0bGUgPSBudWxsLCBjaGFyc2V0ID0gbnVsbDsKLSAgICAgICAgICB4c2xTb3VyY2UgPSB0RmFjdG9yeS5nZXRBc3NvY2lhdGVkU3R5bGVzaGVldCh4bWxTb3VyY2UsbWVkaWEsIHRpdGxlLCBjaGFyc2V0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoeHNsU291cmNlICE9IG51bGwpIC8vIE5vdyBkbyB3ZSBoYXZlIGEgc3R5bGVzaGVldD8KLSAgICAgICAgewotICAgICAgICAgIHRyYW5zZm9ybWVyID0gdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsU291cmNlKTsKLSAgICAgICAgICBzZXRQYXJhbWV0ZXJzKHRyYW5zZm9ybWVyLCByZXF1ZXN0KTsgLy8gU2V0IHN0eWxlc2hlZXQgcGFyYW1zLgotICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh4bWxTb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3V0KSk7IC8vIFBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uLgotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBvdXQud3JpdGUoIk5vIFN0eWxlc2hlZXQhIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIG91dC53cml0ZSgiTm8gWE1MIElucHV0IERvY3VtZW50ISIpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgb3V0LndyaXRlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKG91dCk7ICAgIAotICAgIH0KLSAgICBvdXQuY2xvc2UoKTsKLSAgfQotICAKLSAgLy8gR2V0IHBhcmFtZXRlcnMgZnJvbSB0aGUgcmVxdWVzdCBVUkwuCi0gIFN0cmluZyBnZXRSZXF1ZXN0UGFyYW0oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBwYXJhbSkKLSAgewotCSAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgCi0gICAgeyAKLQkgICAgU3RyaW5nIHBhcmFtVmFsID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIocGFyYW0pOyAKLQkJICByZXR1cm4gcGFyYW1WYWw7Ci0JICB9Ci0JICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLy8gU2V0IHN0eWxlc2hlZXQgcGFyYW1ldGVycyBmcm9tIHRoZSByZXF1ZXN0IFVSTC4KLSAgdm9pZCBzZXRQYXJhbWV0ZXJzKFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIEVudW1lcmF0aW9uIHBhcmFtTmFtZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7Ci0gICAgd2hpbGUgKHBhcmFtTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IChTdHJpbmcpIHBhcmFtTmFtZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBTdHJpbmcgcGFyYW1WYWwgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihwYXJhbU5hbWUpOwotICAgICAgICBpZiAocGFyYW1WYWwgIT0gbnVsbCkKLSAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIocGFyYW1OYW1lLCBwYXJhbVZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zZXJ2bGV0L2RlZmF1bHQueHNsIGIvc2FtcGxlcy9zZXJ2bGV0L2RlZmF1bHQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWE4NWUwLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2VydmxldC9kZWZhdWx0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICBEZWZhdWx0IFhTTCBzdHlsZXNoZWV0IGZvciB1c2UgYnkgY29tLmxvdHVzLnhzbC5zZXJ2ZXIjRGVmYXVsdEFwcGx5WFNMLiAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgVGhpcyBzdHlsZXNoZWV0IG1pbWljcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBJRSB3aGVuIFhNTCBkYXRhIGlzIGRpc3BsYXllZCAgLS0+Ci08IS0tICB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBYU0wgc3R5bGVzaGVldC4gIFRoaXMgc3R5bGVzaGVldCB1c2VzIEphdmFTY3JpcHQgICAgICAtLT4KLTwhLS0gIHRvIGFjY29tbW9kYXRlIG5vZGUgZXhwYW5zaW9uIGFuZCBjb250cmFjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLSAgICAgICAgICAgICAgICAKLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJubyIvPgotPHhzbDpzdHJpcC1zcGFjZSBlbGVtZW50cz0iKiIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgPEhUTUw+Ci0gICAgPEhFQUQ+Ci0gICAgICA8U1RZTEUgdHlwZT0idGV4dC9jc3MiPgotICAgICAgICBCT0RZIHtmb250Ongtc21hbGwgJ1ZlcmRhbmEnOyBtYXJnaW4tcmlnaHQ6MS41ZW19Ci0gICAgICA8IS0tIGNvbnRhaW5lciBmb3IgZXhwYW5kaW5nL2NvbGxhcHNpbmcgY29udGVudCAtLT4KLSAgICAgICAgLmMgIHtjdXJzb3I6aGFuZH0KLSAgICAgIDwhLS0gYnV0dG9uIC0gY29udGFpbnMgKy8tL25ic3AgLS0+Ci0gICAgICAgIC5iICB7Y29sb3I6cmVkOyBmb250LWZhbWlseTonQ291cmllciBOZXcnOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZX0KLSAgICAgIDwhLS0gZWxlbWVudCBjb250YWluZXIgLS0+Ci0gICAgICAgIC5lICB7bWFyZ2luLWxlZnQ6MWVtOyB0ZXh0LWluZGVudDotMWVtOyBtYXJnaW4tcmlnaHQ6MWVtfQotICAgICAgPCEtLSBjb21tZW50IG9yIGNkYXRhIC0tPgotICAgICAgICAuayAge21hcmdpbi1sZWZ0OjFlbTsgdGV4dC1pbmRlbnQ6LTFlbTsgbWFyZ2luLXJpZ2h0OjFlbX0KLSAgICAgIDwhLS0gdGFnIC0tPgotICAgICAgICAudCAge2NvbG9yOiM5OTAwMDB9Ci0gICAgICA8IS0tIHRhZyBpbiB4c2wgbmFtZXNwYWNlIC0tPgotICAgICAgICAueHQge2NvbG9yOiM5OTAwOTl9Ci0gICAgICA8IS0tIGF0dHJpYnV0ZSBpbiB4bWwgb3IgeG1sbnMgbmFtZXNwYWNlIC0tPgotICAgICAgICAubnMge2NvbG9yOnJlZH0KLSAgICAgIDwhLS0gbWFya3VwIGNoYXJhY3RlcnMgLS0+Ci0gICAgICAgIC5tICB7Y29sb3I6Ymx1ZX0KLSAgICAgIDwhLS0gdGV4dCBub2RlIC0tPgotICAgICAgICAudHgge2ZvbnQtd2VpZ2h0OmJvbGR9Ci0gICAgICA8IS0tIG11bHRpLWxpbmUgKGJsb2NrKSBjZGF0YSAtLT4KLSAgICAgICAgLmRiIHt0ZXh0LWluZGVudDowcHg7IG1hcmdpbi1sZWZ0OjFlbTsgbWFyZ2luLXRvcDowcHg7IG1hcmdpbi1ib3R0b206MHB4OwotICAgICAgICAgICAgIHBhZGRpbmctbGVmdDouM2VtOyBib3JkZXItbGVmdDoxcHggc29saWQgI0NDQ0NDQzsgZm9udDpzbWFsbCBDb3VyaWVyfQotICAgICAgPCEtLSBzaW5nbGUtbGluZSAoaW5saW5lKSBjZGF0YSAtLT4KLSAgICAgICAgLmRpIHtmb250OnNtYWxsIENvdXJpZXJ9Ci0gICAgICA8IS0tIERPQ1RZUEUgZGVjbGFyYXRpb24gLS0+Ci0gICAgICAgIC5kICB7Y29sb3I6Ymx1ZX0KLSAgICAgIDwhLS0gcGkgLS0+Ci0gICAgICAgIC5waSB7Y29sb3I6Ymx1ZX0KLSAgICAgIDwhLS0gbXVsdGktbGluZSAoYmxvY2spIGNvbW1lbnQgLS0+Ci0gICAgICAgIC5jYiB7dGV4dC1pbmRlbnQ6MHB4OyBtYXJnaW4tbGVmdDoxZW07IG1hcmdpbi10b3A6MHB4OyBtYXJnaW4tYm90dG9tOjBweDsKLSAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6LjNlbTsgZm9udDpzbWFsbCBDb3VyaWVyOyBjb2xvcjojODg4ODg4fQotICAgICAgPCEtLSBzaW5nbGUtbGluZSAoaW5saW5lKSBjb21tZW50IC0tPgotICAgICAgICAuY2kge2ZvbnQ6c21hbGwgQ291cmllcjsgY29sb3I6Izg4ODg4OH0KLSAgICAgICAgUFJFIHttYXJnaW46MHB4OyBkaXNwbGF5OmlubGluZX0KLSAgICAgIDwvU1RZTEU+Ci0KLSAgICAgIDxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48eHNsOmNvbW1lbnQ+PCFbQ0RBVEFbCi0gICAgICAgIC8vIERldGVjdCBhbmQgc3dpdGNoIHRoZSBkaXNwbGF5IG9mIENEQVRBIGFuZCBjb21tZW50cyBmcm9tIGFuIGlubGluZSB2aWV3Ci0gICAgICAgIC8vICB0byBhIGJsb2NrIHZpZXcgaWYgdGhlIGNvbW1lbnQgb3IgQ0RBVEEgaXMgbXVsdGktbGluZS4KLSAgICAgICAgZnVuY3Rpb24gZihlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaWYgdGhpcyBlbGVtZW50IGlzIGFuIGlubGluZSBjb21tZW50LCBhbmQgY29udGFpbnMgbW9yZSB0aGFuIGEgc2luZ2xlCi0gICAgICAgICAgLy8gIGxpbmUsIHR1cm4gaXQgaW50byBhIGJsb2NrIGNvbW1lbnQuCi0gICAgICAgICAgaWYgKGUuY2xhc3NOYW1lID09ICJjaSIpIHsKLSAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKDApLmlubmVyVGV4dC5pbmRleE9mKCJcbiIpID4gMCkKLSAgICAgICAgICAgICAgZml4KGUsICJjYiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICAvLyBpZiB0aGlzIGVsZW1lbnQgaXMgYW4gaW5saW5lIGNkYXRhLCBhbmQgY29udGFpbnMgbW9yZSB0aGFuIGEgc2luZ2xlCi0gICAgICAgICAgLy8gIGxpbmUsIHR1cm4gaXQgaW50byBhIGJsb2NrIGNkYXRhLgotICAgICAgICAgIGlmIChlLmNsYXNzTmFtZSA9PSAiZGkiKSB7Ci0gICAgICAgICAgICBpZiAoZS5jaGlsZHJlbigwKS5pbm5lclRleHQuaW5kZXhPZigiXG4iKSA+IDApCi0gICAgICAgICAgICAgIGZpeChlLCAiZGIiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBpZCBzaW5jZSB3ZSBvbmx5IHVzZWQgaXQgZm9yIGNsZWFudXAKLSAgICAgICAgICBlLmlkID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEZpeCB1cCB0aGUgZWxlbWVudCBhcyBhICJibG9jayIgZGlzcGxheSBhbmQgZW5hYmxlIGV4cGFuZC9jb2xsYXBzZSBvbiBpdAotICAgICAgICBmdW5jdGlvbiBmaXgoZSwgY2wpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGNsYXNzIG5hbWUgYW5kIGRpc3BsYXkgdmFsdWUKLSAgICAgICAgICBlLmNsYXNzTmFtZSA9IGNsOwotICAgICAgICAgIGUuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gbWFyayB0aGUgY29tbWVudCBvciBjZGF0YSBkaXNwbGF5IGFzIGEgZXhwYW5kYWJsZSBjb250YWluZXIKLSAgICAgICAgICBqID0gZS5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKDApOwotICAgICAgICAgIGouY2xhc3NOYW1lID0gImMiOwotCi0gICAgICAgICAgLy8gZmluZCB0aGUgKy8tIHN5bWJvbCBhbmQgbWFrZSBpdCB2aXNpYmxlIC0gdGhlIGR1bW15IGxpbmsgZW5hYmxlcyB0YWJiaW5nCi0gICAgICAgICAgayA9IGouY2hpbGRyZW4oMCk7Ci0gICAgICAgICAgay5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwotICAgICAgICAgIGsuaHJlZiA9ICIjIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoYW5nZSB0aGUgKy8tIHN5bWJvbCBhbmQgaGlkZSB0aGUgY2hpbGRyZW4uICBUaGlzIGZ1bmN0aW9uIHdvcmtzIG9uICJlbGVtZW50IgotICAgICAgICAvLyAgZGlzcGxheXMKLSAgICAgICAgZnVuY3Rpb24gY2goZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGZpbmQgdGhlICsvLSBzeW1ib2wKLSAgICAgICAgICBtYXJrID0gZS5jaGlsZHJlbigwKS5jaGlsZHJlbigwKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBpZiBpdCBpcyBhbHJlYWR5IGNvbGxhcHNlZCwgZXhwYW5kIGl0IGJ5IHNob3dpbmcgdGhlIGNoaWxkcmVuCi0gICAgICAgICAgaWYgKG1hcmsuaW5uZXJUZXh0ID09ICIrIikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXJrLmlubmVyVGV4dCA9ICItIjsKLSAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgZS5jaGlsZHJlbihpKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gaWYgaXQgaXMgZXhwYW5kZWQsIGNvbGxhcHNlIGl0IGJ5IGhpZGluZyB0aGUgY2hpbGRyZW4KLSAgICAgICAgICBlbHNlIGlmIChtYXJrLmlubmVyVGV4dCA9PSAiLSIpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWFyay5pbm5lclRleHQgPSAiKyI7Ci0gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgIGUuY2hpbGRyZW4oaSkuc3R5bGUuZGlzcGxheT0ibm9uZSI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDaGFuZ2UgdGhlICsvLSBzeW1ib2wgYW5kIGhpZGUgdGhlIGNoaWxkcmVuLiAgVGhpcyBmdW5jdGlvbiB3b3JrIG9uICJjb21tZW50IgotICAgICAgICAvLyAgYW5kICJjZGF0YSIgZGlzcGxheXMKLSAgICAgICAgZnVuY3Rpb24gY2gyKGUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBmaW5kIHRoZSArLy0gc3ltYm9sLCBhbmQgdGhlICJQUkUiIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgY29udGVudAotICAgICAgICAgIG1hcmsgPSBlLmNoaWxkcmVuKDApLmNoaWxkcmVuKDApOwotICAgICAgICAgIGNvbnRlbnRzID0gZS5jaGlsZHJlbigxKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBpZiBpdCBpcyBhbHJlYWR5IGNvbGxhcHNlZCwgZXhwYW5kIGl0IGJ5IHNob3dpbmcgdGhlIGNoaWxkcmVuCi0gICAgICAgICAgaWYgKG1hcmsuaW5uZXJUZXh0ID09ICIrIikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXJrLmlubmVyVGV4dCA9ICItIjsKLSAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIGNvcnJlY3QgImJsb2NrIi8iaW5saW5lIiBkaXNwbGF5IHR5cGUgdG8gdGhlIFBSRQotICAgICAgICAgICAgaWYgKGNvbnRlbnRzLmNsYXNzTmFtZSA9PSAiZGIiIHx8IGNvbnRlbnRzLmNsYXNzTmFtZSA9PSAiY2IiKQotICAgICAgICAgICAgICBjb250ZW50cy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKLSAgICAgICAgICAgIGVsc2UgY29udGVudHMuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICAvLyBpZiBpdCBpcyBleHBhbmRlZCwgY29sbGFwc2UgaXQgYnkgaGlkaW5nIHRoZSBjaGlsZHJlbgotICAgICAgICAgIGVsc2UgaWYgKG1hcmsuaW5uZXJUZXh0ID09ICItIikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXJrLmlubmVyVGV4dCA9ICIrIjsKLSAgICAgICAgICAgIGNvbnRlbnRzLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBIYW5kbGUgYSBtb3VzZSBjbGljawotICAgICAgICBmdW5jdGlvbiBjbCgpCi0gICAgICAgIHsKLSAgICAgICAgICBlID0gd2luZG93LmV2ZW50LnNyY0VsZW1lbnQ7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGFyZSBoYW5kbGluZyBjbGlja3MgdXBvbiBleHBhbmRhYmxlIGNvbnRhaW5lciBlbGVtZW50cwotICAgICAgICAgIGlmIChlLmNsYXNzTmFtZSAhPSAiYyIpCi0gICAgICAgICAgewotICAgICAgICAgICAgZSA9IGUucGFyZW50RWxlbWVudDsKLSAgICAgICAgICAgIGlmIChlLmNsYXNzTmFtZSAhPSAiYyIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZSA9IGUucGFyZW50RWxlbWVudDsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBjYWxsIHRoZSBjb3JyZWN0IGZ1bnRpb24gdG8gY2hhbmdlIHRoZSBjb2xsYXBzZS9leHBhbmQgc3RhdGUgYW5kIGRpc3BsYXkKLSAgICAgICAgICBpZiAoZS5jbGFzc05hbWUgPT0gImUiKQotICAgICAgICAgICAgY2goZSk7Ci0gICAgICAgICAgaWYgKGUuY2xhc3NOYW1lID09ICJrIikKLSAgICAgICAgICAgIGNoMihlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRXJhc2UgYm9ndXMgbGluayBpbmZvIGZyb20gdGhlIHN0YXR1cyB3aW5kb3cKLSAgICAgICAgZnVuY3Rpb24gaCgpCi0gICAgICAgIHsKLSAgICAgICAgICB3aW5kb3cuc3RhdHVzPSIgIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB0aGUgb25jbGljayBoYW5kbGVyCi0gICAgICAgIGRvY3VtZW50Lm9uY2xpY2sgPSBjbDsKLSAgICAgICAgCi0gICAgICBdXT4vLzwveHNsOmNvbW1lbnQ+PC9TQ1JJUFQ+Ci0gICAgPC9IRUFEPgotCi0gICAgPEJPRFkgY2xhc3M9InN0Ij48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9CT0RZPgotCi0gIDwvSFRNTD4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFRlbXBsYXRlcyBmb3IgZWFjaCBub2RlIHR5cGUgZm9sbG93cy4gIFRoZSBvdXRwdXQgb2YgZWFjaCB0ZW1wbGF0ZSBoYXMgYSBzaW1pbGFyIHN0cnVjdHVyZQotICB0byBlbmFibGUgc2NyaXB0IHRvIHdhbGsgdGhlIHJlc3VsdCB0cmVlIGVhc2lseSBmb3IgaGFuZGxpbmcgdXNlciBpbnRlcmFjdGlvbi4gLS0+Ci0gIAotPCEtLSBUZW1wbGF0ZSBmb3IgcGlzIG5vdCBoYW5kbGVkIGVsc2V3aGVyZSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSI+Ci0gIDxESVYgY2xhc3M9ImUiPgotICA8U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPgotICA8U1BBTiBjbGFzcz0ibSI+Jmx0Oz88L1NQQU4+PFNQQU4gY2xhc3M9InBpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvU1BBTj48U1BBTiBjbGFzcz0ibSI+PyZndDs8L1NQQU4+Ci0gIDwvRElWPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gVGVtcGxhdGUgZm9yIHRoZSBYTUwgZGVjbGFyYXRpb24uICBOZWVkIGEgc2VwYXJhdGUgdGVtcGxhdGUgYmVjYXVzZSB0aGUgcHNldWRvLWF0dHJpYnV0ZXMKLSAgICBhcmUgYWN0dWFsbHkgZXhwb3NlZCBhcyBhdHRyaWJ1dGVzIGluc3RlYWQgb2YganVzdCBlbGVtZW50IGNvbnRlbnQsIGFzIGluIG90aGVyIHBpcyAKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oJ3htbCcpIj4KLSAgPERJViBjbGFzcz0iZSI+Ci0gIDxTUEFOIGNsYXNzPSJiIj4mIzE2MDs8L1NQQU4+Ci0gIDxTUEFOIGNsYXNzPSJtIj4mbHQ7PzwvU1BBTj48U1BBTiBjbGFzcz0icGkiPnhtbCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iQCoiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PSI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPiIgPC94c2w6Zm9yLWVhY2g+PC9TUEFOPjxTUEFOIGNsYXNzPSJtIj4/Jmd0OzwvU1BBTj4KLSAgPC9ESVY+Ci08L3hzbDp0ZW1wbGF0ZT4KLS0tPgotCi08IS0tIFRlbXBsYXRlIGZvciBhdHRyaWJ1dGVzIG5vdCBoYW5kbGVkIGVsc2V3aGVyZSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqIj48U1BBTiBjbGFzcz0idCI+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjxTUEFOIGNsYXNzPSJtIj49IjwvU1BBTj48Qj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvQj48U1BBTiBjbGFzcz0ibSI+IjwvU1BBTj48L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBUZW1wbGF0ZSBmb3IgYXR0cmlidXRlcyBpbiB0aGUgeG1sbnMgb3IgeG1sIG5hbWVzcGFjZQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQHhtbG5zOip8QHhtbG5zfEB4bWw6KiI+PFNQQU4gY2xhc3M9Im5zIj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+PFNQQU4gY2xhc3M9Im0iPj0iPC9TUEFOPjxCIGNsYXNzPSJucyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L0I+PFNQQU4gY2xhc3M9Im0iPiI8L1NQQU4+PC94c2w6dGVtcGxhdGU+Ci0tLT4KLQotPCEtLSBUZW1wbGF0ZSBmb3IgdGV4dCBub2RlcyAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSI+Ci0gIDx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSJuYW1lKC4pID0gJyNjZGF0YS1zZWN0aW9uJyI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNkYXRhIi8+PC94c2w6d2hlbj4KLSAgPHhzbDpvdGhlcndpc2U+PERJViBjbGFzcz0iZSI+Ci0gIDxTUEFOIGNsYXNzPSJiIj4mIzE2MDs8L1NQQU4+Ci0gIDxTUEFOIGNsYXNzPSJ0eCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L1NQQU4+Ci0gIDwvRElWPjwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+Ci08L3hzbDp0ZW1wbGF0ZT4KLSAgCi08IS0tIFRlbXBsYXRlIGZvciBjb21tZW50IG5vZGVzIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29tbWVudCgpIj4KLSAgPERJViBjbGFzcz0iayI+Ci0gIDxTUEFOPjxBIGNsYXNzPSJiIiBvbmNsaWNrPSJyZXR1cm4gZmFsc2UiIG9uZm9jdXM9ImgoKSIgU1RZTEU9InZpc2liaWxpdHk6aGlkZGVuIj4tPC9BPiA8U1BBTiBjbGFzcz0ibSI+Jmx0OyEtLTwvU1BBTj48L1NQQU4+Ci0gIDxTUEFOIGlkPSJjbGVhbiIgY2xhc3M9ImNpIj48UFJFPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9QUkU+PC9TUEFOPgotICA8U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPiA8U1BBTiBjbGFzcz0ibSI+LS0mZ3Q7PC9TUEFOPgotICA8U0NSSVBUPmYoY2xlYW4pOzwvU0NSSVBUPjwvRElWPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gVGVtcGxhdGUgZm9yIGNkYXRhIG5vZGVzIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjZGF0YSI+Ci0gIDxESVYgY2xhc3M9ImsiPgotICA8U1BBTj48QSBjbGFzcz0iYiIgb25jbGljaz0icmV0dXJuIGZhbHNlIiBvbmZvY3VzPSJoKCkiIFNUWUxFPSJ2aXNpYmlsaXR5OmhpZGRlbiI+LTwvQT4gPFNQQU4gY2xhc3M9Im0iPiZsdDshW0NEQVRBWzwvU1BBTj48L1NQQU4+Ci0gIDxTUEFOIGlkPSJjbGVhbiIgY2xhc3M9ImRpIj48UFJFPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9QUkU+PC9TUEFOPgotICA8U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPiA8U1BBTiBjbGFzcz0ibSI+XV0mZ3Q7PC9TUEFOPgotICA8U0NSSVBUPmYoY2xlYW4pOzwvU0NSSVBUPjwvRElWPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gVGVtcGxhdGUgZm9yIGVsZW1lbnRzIG5vdCBoYW5kbGVkIGVsc2V3aGVyZSAobGVhZiBub2RlcykgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSIqIj4KLSAgPERJViBjbGFzcz0iZSI+PERJViBTVFlMRT0ibWFyZ2luLWxlZnQ6MWVtO3RleHQtaW5kZW50Oi0yZW0iPgotICA8U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPgotICA8U1BBTiBjbGFzcz0ibSI+Jmx0OzwvU1BBTj48U1BBTiBjbGFzcz0idCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+IDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz48U1BBTiBjbGFzcz0ibSI+IC8mZ3Q7PC9TUEFOPgotICA8L0RJVj48L0RJVj4KLTwveHNsOnRlbXBsYXRlPgotICAKLTwhLS0gVGVtcGxhdGUgZm9yIGVsZW1lbnRzIHdpdGggY29tbWVudCwgcGkgYW5kL29yIGNkYXRhIGNoaWxkcmVuCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIqW2NvbW1lbnQoKSBvciBwcm9jZXNzaW5nLWluc3RydWN0aW9uKCkgb3IgY2RhdGEoKV0iPgotICA8RElWIGNsYXNzPSJlIj4KLSAgPERJViBjbGFzcz0iYyI+PEEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIGZhbHNlIiBvbmZvY3VzPSJoKCkiIGNsYXNzPSJiIj4tPC9BPiA8U1BBTiBjbGFzcz0ibSI+Jmx0OzwvU1BBTj48U1BBTj48eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+PHhzbDppZiB0ZXN0PSJ4c2w6KiI+eDwveHNsOmlmPnQ8L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKiIvPiA8U1BBTiBjbGFzcz0ibSI+Jmd0OzwvU1BBTj48L0RJVj4KLSAgPERJVj48eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDxESVY+PFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj4gPFNQQU4gY2xhc3M9Im0iPiZsdDsvPC9TUEFOPjxTUEFOPjx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj48eHNsOmlmIHRlc3Q9InhzbDoqIj54PC94c2w6aWY+dDwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPjwvU1BBTj48U1BBTiBjbGFzcz0ibSI+Jmd0OzwvU1BBTj48L0RJVj4KLSAgPC9ESVY+PC9ESVY+Ci08L3hzbDp0ZW1wbGF0ZT4gLS0+Ci0KLTwhLS0gVGVtcGxhdGUgZm9yIGVsZW1lbnRzIHdpdGggb25seSB0ZXh0IGNoaWxkcmVuIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKlt0ZXh0KCkgYW5kIG5vdChjb21tZW50KCkgb3IgcHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpIG9yICopXSI+Ci0gIDxESVYgY2xhc3M9ImUiPjxESVYgU1RZTEU9Im1hcmdpbi1sZWZ0OjFlbTt0ZXh0LWluZGVudDotMmVtIj4KLSAgPFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj4gPFNQQU4gY2xhc3M9Im0iPiZsdDs8L1NQQU4+PFNQQU4gY2xhc3M9InQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz4KLSAgPFNQQU4gY2xhc3M9Im0iPiZndDs8L1NQQU4+PFNQQU4gY2xhc3M9InR4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvU1BBTj48U1BBTiBjbGFzcz0ibSI+Jmx0Oy88L1NQQU4+PFNQQU4gY2xhc3M9InQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjxTUEFOIGNsYXNzPSJtIj4mZ3Q7PC9TUEFOPgotICA8L0RJVj48L0RJVj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFRlbXBsYXRlIGZvciBlbGVtZW50cyB3aXRoIGVsZW1lbnQgY2hpbGRyZW4gLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSIqWypdIj4KLSAgPERJViBjbGFzcz0iZSI+Ci0gIDxESVYgY2xhc3M9ImMiIFNUWUxFPSJtYXJnaW4tbGVmdDoxZW07dGV4dC1pbmRlbnQ6LTJlbSI+PEEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIGZhbHNlIiBvbmZvY3VzPSJoKCkiIGNsYXNzPSJiIj4tPC9BPiA8U1BBTiBjbGFzcz0ibSI+Jmx0OzwvU1BBTj48U1BBTiBjbGFzcz0idCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKiIvPjxTUEFOIGNsYXNzPSJtIj4mZ3Q7PC9TUEFOPjwvRElWPgotICA8RElWPjx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPERJVj48U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPjxTUEFOIGNsYXNzPSJtIj4mbHQ7LzwvU1BBTj48U1BBTiBjbGFzcz0idCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+PFNQQU4gY2xhc3M9Im0iPiZndDs8L1NQQU4+PC9ESVY+Ci0gIDwvRElWPjwvRElWPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zZXJ2bGV0L2RlZmF1bHQyLnhzbCBiL3NhbXBsZXMvc2VydmxldC9kZWZhdWx0Mi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTlmM2YuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9zZXJ2bGV0L2RlZmF1bHQyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICBEZWZhdWx0IFhTTCBzdHlsZXNoZWV0IGZvciB1c2UgYnkgY29tLmxvdHVzLnhzbC5zZXJ2ZXIjRGVmYXVsdEFwcGx5WFNMLiAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgVGhpcyBzdHlsZXNoZWV0IG1pbWljcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBJRSB3aGVuIFhNTCBkYXRhIGlzIGRpc3BsYXllZCAgLS0+Ci08IS0tICB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBYU0wgc3R5bGVzaGVldC4gIFRoaXMgc3R5bGVzaGVldCB1c2VzIG5vIEphdmFTY3JpcHQgICAtLT4KLTwhLS0gIGFuZCBkaXNwbGF5cyBhbGwgbm9kZXMgYXMgZnVsbHkgZXhwYW5kZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLSAgICAgICAgICAgICAgICAKLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJubyIvPgotPHhzbDpzdHJpcC1zcGFjZSBlbGVtZW50cz0iKiIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgPEhUTUw+Ci0gICAgPEhFQUQ+Ci0gICAgICA8U1RZTEUgdHlwZT0idGV4dC9jc3MiPgotICAgICAgICBCT0RZIHtmb250Ongtc21hbGwgJ1ZlcmRhbmEnOyBtYXJnaW4tcmlnaHQ6MS41ZW19Ci0gICAgICA8IS0tIGNvbnRhaW5lciBmb3IgZXhwYW5kaW5nL2NvbGxhcHNpbmcgY29udGVudCAtLT4KLSAgICAgICAgLmMgIHtjdXJzb3I6aGFuZH0KLSAgICAgIDwhLS0gYnV0dG9uIC0gY29udGFpbnMgKy8tL25ic3AgLS0+Ci0gICAgICAgIC5iICB7Y29sb3I6cmVkOyBmb250LWZhbWlseTonQ291cmllciBOZXcnOyBmb250LXdlaWdodDpib2xkOyB0ZXh0LWRlY29yYXRpb246bm9uZX0KLSAgICAgIDwhLS0gZWxlbWVudCBjb250YWluZXIgLS0+Ci0gICAgICAgIC5lICB7bWFyZ2luLWxlZnQ6MWVtOyB0ZXh0LWluZGVudDotMWVtOyBtYXJnaW4tcmlnaHQ6MWVtfQotICAgICAgPCEtLSBjb21tZW50IG9yIGNkYXRhIC0tPgotICAgICAgICAuayAge21hcmdpbi1sZWZ0OjFlbTsgdGV4dC1pbmRlbnQ6LTFlbTsgbWFyZ2luLXJpZ2h0OjFlbX0KLSAgICAgIDwhLS0gdGFnIC0tPgotICAgICAgICAudCAge2NvbG9yOiM5OTAwMDB9Ci0gICAgICA8IS0tIHRhZyBpbiB4c2wgbmFtZXNwYWNlIC0tPgotICAgICAgICAueHQge2NvbG9yOiM5OTAwOTl9Ci0gICAgICA8IS0tIGF0dHJpYnV0ZSBpbiB4bWwgb3IgeG1sbnMgbmFtZXNwYWNlIC0tPgotICAgICAgICAubnMge2NvbG9yOnJlZH0KLSAgICAgIDwhLS0gbWFya3VwIGNoYXJhY3RlcnMgLS0+Ci0gICAgICAgIC5tICB7Y29sb3I6Ymx1ZX0KLSAgICAgIDwhLS0gdGV4dCBub2RlIC0tPgotICAgICAgICAudHgge2ZvbnQtd2VpZ2h0OmJvbGR9Ci0gICAgICA8IS0tIG11bHRpLWxpbmUgKGJsb2NrKSBjZGF0YSAtLT4KLSAgICAgICAgLmRiIHt0ZXh0LWluZGVudDowcHg7IG1hcmdpbi1sZWZ0OjFlbTsgbWFyZ2luLXRvcDowcHg7IG1hcmdpbi1ib3R0b206MHB4OwotICAgICAgICAgICAgIHBhZGRpbmctbGVmdDouM2VtOyBib3JkZXItbGVmdDoxcHggc29saWQgI0NDQ0NDQzsgZm9udDpzbWFsbCBDb3VyaWVyfQotICAgICAgPCEtLSBzaW5nbGUtbGluZSAoaW5saW5lKSBjZGF0YSAtLT4KLSAgICAgICAgLmRpIHtmb250OnNtYWxsIENvdXJpZXJ9Ci0gICAgICA8IS0tIERPQ1RZUEUgZGVjbGFyYXRpb24gLS0+Ci0gICAgICAgIC5kICB7Y29sb3I6Ymx1ZX0KLSAgICAgIDwhLS0gcGkgLS0+Ci0gICAgICAgIC5waSB7Y29sb3I6Ymx1ZX0KLSAgICAgIDwhLS0gbXVsdGktbGluZSAoYmxvY2spIGNvbW1lbnQgLS0+Ci0gICAgICAgIC5jYiB7dGV4dC1pbmRlbnQ6MHB4OyBtYXJnaW4tbGVmdDoxZW07IG1hcmdpbi10b3A6MHB4OyBtYXJnaW4tYm90dG9tOjBweDsKLSAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6LjNlbTsgZm9udDpzbWFsbCBDb3VyaWVyOyBjb2xvcjojODg4ODg4fQotICAgICAgPCEtLSBzaW5nbGUtbGluZSAoaW5saW5lKSBjb21tZW50IC0tPgotICAgICAgICAuY2kge2ZvbnQ6c21hbGwgQ291cmllcjsgY29sb3I6Izg4ODg4OH0KLSAgICAgICAgUFJFIHttYXJnaW46MHB4OyBkaXNwbGF5OmlubGluZX0KLSAgICAgIDwvU1RZTEU+Ci0gICAgPC9IRUFEPgotCi0gICAgPEJPRFkgY2xhc3M9InN0Ij48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9CT0RZPgotCi0gIDwvSFRNTD4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFRlbXBsYXRlcyBmb3IgZWFjaCBub2RlIHR5cGUgZm9sbG93cy4gIFRoZSBvdXRwdXQgb2YgZWFjaCB0ZW1wbGF0ZSBoYXMgYSBzaW1pbGFyIHN0cnVjdHVyZQotICB0byBlbmFibGUgc2NyaXB0IHRvIHdhbGsgdGhlIHJlc3VsdCB0cmVlIGVhc2lseSBmb3IgaGFuZGxpbmcgdXNlciBpbnRlcmFjdGlvbi4gLS0+Ci0gIAotPCEtLSBUZW1wbGF0ZSBmb3IgcGlzIG5vdCBoYW5kbGVkIGVsc2V3aGVyZSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSI+Ci0gIDxESVYgY2xhc3M9ImUiPgotICA8U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPgotICA8U1BBTiBjbGFzcz0ibSI+Jmx0Oz88L1NQQU4+PFNQQU4gY2xhc3M9InBpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvU1BBTj48U1BBTiBjbGFzcz0ibSI+PyZndDs8L1NQQU4+Ci0gIDwvRElWPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gVGVtcGxhdGUgZm9yIHRoZSBYTUwgZGVjbGFyYXRpb24uICBOZWVkIGEgc2VwYXJhdGUgdGVtcGxhdGUgYmVjYXVzZSB0aGUgcHNldWRvLWF0dHJpYnV0ZXMKLSAgICBhcmUgYWN0dWFsbHkgZXhwb3NlZCBhcyBhdHRyaWJ1dGVzIGluc3RlYWQgb2YganVzdCBlbGVtZW50IGNvbnRlbnQsIGFzIGluIG90aGVyIHBpcyAKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oJ3htbCcpIj4KLSAgPERJViBjbGFzcz0iZSI+Ci0gIDxTUEFOIGNsYXNzPSJiIj4mIzE2MDs8L1NQQU4+Ci0gIDxTUEFOIGNsYXNzPSJtIj4mbHQ7PzwvU1BBTj48U1BBTiBjbGFzcz0icGkiPnhtbCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iQCoiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PSI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPiIgPC94c2w6Zm9yLWVhY2g+PC9TUEFOPjxTUEFOIGNsYXNzPSJtIj4/Jmd0OzwvU1BBTj4KLSAgPC9ESVY+Ci08L3hzbDp0ZW1wbGF0ZT4KLS0tPgotCi08IS0tIFRlbXBsYXRlIGZvciBhdHRyaWJ1dGVzIG5vdCBoYW5kbGVkIGVsc2V3aGVyZSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqIj48U1BBTiBjbGFzcz0idCI+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjxTUEFOIGNsYXNzPSJtIj49IjwvU1BBTj48Qj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvQj48U1BBTiBjbGFzcz0ibSI+IjwvU1BBTj48L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBUZW1wbGF0ZSBmb3IgYXR0cmlidXRlcyBpbiB0aGUgeG1sbnMgb3IgeG1sIG5hbWVzcGFjZQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQHhtbG5zOip8QHhtbG5zfEB4bWw6KiI+PFNQQU4gY2xhc3M9Im5zIj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+PFNQQU4gY2xhc3M9Im0iPj0iPC9TUEFOPjxCIGNsYXNzPSJucyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L0I+PFNQQU4gY2xhc3M9Im0iPiI8L1NQQU4+PC94c2w6dGVtcGxhdGU+Ci0tLT4KLQotPCEtLSBUZW1wbGF0ZSBmb3IgdGV4dCBub2RlcyAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSI+Ci0gIDx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSJuYW1lKC4pID0gJyNjZGF0YS1zZWN0aW9uJyI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNkYXRhIi8+PC94c2w6d2hlbj4KLSAgPHhzbDpvdGhlcndpc2U+PERJViBjbGFzcz0iZSI+Ci0gIDxTUEFOIGNsYXNzPSJiIj4mIzE2MDs8L1NQQU4+Ci0gIDxTUEFOIGNsYXNzPSJ0eCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L1NQQU4+Ci0gIDwvRElWPjwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+Ci08L3hzbDp0ZW1wbGF0ZT4KLSAgCi08IS0tIFRlbXBsYXRlIGZvciBjb21tZW50IG5vZGVzIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29tbWVudCgpIj4KLSAgPERJViBjbGFzcz0iayI+Ci0gIDxTUEFOPjxTUEFOIGNsYXNzPSJiIiBTVFlMRT0idmlzaWJpbGl0eTpoaWRkZW4iPi08L1NQQU4+IDxTUEFOIGNsYXNzPSJtIj4mbHQ7IS0tPC9TUEFOPjwvU1BBTj4KLSAgPFNQQU4gY2xhc3M9ImNiIj48UFJFPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9QUkU+PC9TUEFOPgotICA8U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPiA8U1BBTiBjbGFzcz0ibSI+LS0mZ3Q7PC9TUEFOPgotICA8L0RJVj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFRlbXBsYXRlIGZvciBjZGF0YSBub2RlcyAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iY2RhdGEiPgotICA8RElWIGNsYXNzPSJrIj4KLSAgPFNQQU4+PFNQQU4gY2xhc3M9ImIiIFNUWUxFPSJ2aXNpYmlsaXR5OmhpZGRlbiI+LTwvU1BBTj4gPFNQQU4gY2xhc3M9Im0iPiZsdDshW0NEQVRBWzwvU1BBTj48L1NQQU4+Ci0gIDxTUEFOIGNsYXNzPSJkYiI+PFBSRT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvUFJFPjwvU1BBTj4KLSAgPFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj4gPFNQQU4gY2xhc3M9Im0iPl1dJmd0OzwvU1BBTj4KLSAgPC9ESVY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBUZW1wbGF0ZSBmb3IgZWxlbWVudHMgbm90IGhhbmRsZWQgZWxzZXdoZXJlIChsZWFmIG5vZGVzKSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IioiPgotICA8RElWIGNsYXNzPSJlIj48RElWIFNUWUxFPSJtYXJnaW4tbGVmdDoxZW07dGV4dC1pbmRlbnQ6LTJlbSI+Ci0gIDxTUEFOIGNsYXNzPSJiIj4mIzE2MDs8L1NQQU4+Ci0gIDxTUEFOIGNsYXNzPSJtIj4mbHQ7PC9TUEFOPjxTUEFOIGNsYXNzPSJ0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPjwvU1BBTj4gPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKiIvPjxTUEFOIGNsYXNzPSJtIj4gLyZndDs8L1NQQU4+Ci0gIDwvRElWPjwvRElWPgotPC94c2w6dGVtcGxhdGU+Ci0gIAotPCEtLSBUZW1wbGF0ZSBmb3IgZWxlbWVudHMgd2l0aCBjb21tZW50LCBwaSBhbmQvb3IgY2RhdGEgY2hpbGRyZW4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IipbY29tbWVudCgpIG9yIHByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSBvciBjZGF0YSgpXSI+Ci0gIDxESVYgY2xhc3M9ImUiPgotICA8RElWIGNsYXNzPSJjIj48QSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gZmFsc2UiIG9uZm9jdXM9ImgoKSIgY2xhc3M9ImIiPi08L0E+IDxTUEFOIGNsYXNzPSJtIj4mbHQ7PC9TUEFOPjxTUEFOPjx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj48eHNsOmlmIHRlc3Q9InhzbDoqIj54PC94c2w6aWY+dDwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPjwvU1BBTj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIi8+IDxTUEFOIGNsYXNzPSJtIj4mZ3Q7PC9TUEFOPjwvRElWPgotICA8RElWPjx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPERJVj48U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPiA8U1BBTiBjbGFzcz0ibSI+Jmx0Oy88L1NQQU4+PFNQQU4+PHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPjx4c2w6aWYgdGVzdD0ieHNsOioiPng8L3hzbDppZj50PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8+PC9TUEFOPjxTUEFOIGNsYXNzPSJtIj4mZ3Q7PC9TUEFOPjwvRElWPgotICA8L0RJVj48L0RJVj4KLTwveHNsOnRlbXBsYXRlPiAtLT4KLQotPCEtLSBUZW1wbGF0ZSBmb3IgZWxlbWVudHMgd2l0aCBvbmx5IHRleHQgY2hpbGRyZW4gLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSIqW3RleHQoKSBhbmQgbm90KGNvbW1lbnQoKSBvciBwcm9jZXNzaW5nLWluc3RydWN0aW9uKCkgb3IgKildIj4KLSAgPERJViBjbGFzcz0iZSI+PERJViBTVFlMRT0ibWFyZ2luLWxlZnQ6MWVtO3RleHQtaW5kZW50Oi0yZW0iPgotICA8U1BBTiBjbGFzcz0iYiI+JiMxNjA7PC9TUEFOPiA8U1BBTiBjbGFzcz0ibSI+Jmx0OzwvU1BBTj48U1BBTiBjbGFzcz0idCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKiIvPgotICA8U1BBTiBjbGFzcz0ibSI+Jmd0OzwvU1BBTj48U1BBTiBjbGFzcz0idHgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9TUEFOPjxTUEFOIGNsYXNzPSJtIj4mbHQ7LzwvU1BBTj48U1BBTiBjbGFzcz0idCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+PFNQQU4gY2xhc3M9Im0iPiZndDs8L1NQQU4+Ci0gIDwvRElWPjwvRElWPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gVGVtcGxhdGUgZm9yIGVsZW1lbnRzIHdpdGggZWxlbWVudCBjaGlsZHJlbiAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IipbKl0iPgotICA8RElWIGNsYXNzPSJlIj4KLSAgPERJViBjbGFzcz0iYyIgU1RZTEU9Im1hcmdpbi1sZWZ0OjFlbTt0ZXh0LWluZGVudDotMmVtIj48U1BBTiBjbGFzcz0iYiI+LTwvU1BBTj48U1BBTiBjbGFzcz0ibSI+Jmx0OzwvU1BBTj48U1BBTiBjbGFzcz0idCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoLikiLz48L1NQQU4+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKiIvPiA8U1BBTiBjbGFzcz0ibSI+Jmd0OzwvU1BBTj48L0RJVj4KLSAgPERJVj48eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDxESVY+PFNQQU4gY2xhc3M9ImIiPiYjMTYwOzwvU1BBTj4gPFNQQU4gY2xhc3M9Im0iPiZsdDsvPC9TUEFOPjxTUEFOIGNsYXNzPSJ0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPjwvU1BBTj48U1BBTiBjbGFzcz0ibSI+Jmd0OzwvU1BBTj48L0RJVj4KLSAgPC9ESVY+PC9ESVY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL3NlcnZsZXQvZm9vcGFyYW0ueG1sIGIvc2FtcGxlcy9zZXJ2bGV0L2Zvb3BhcmFtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjMzJiNS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3NlcnZsZXQvZm9vcGFyYW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxkb2M+SGVsbG88L2RvYz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvc2VydmxldC9mb29wYXJhbS54c2wgYi9zYW1wbGVzL3NlcnZsZXQvZm9vcGFyYW0ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjY5MWQxLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2VydmxldC9mb29wYXJhbS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDpwYXJhbSBuYW1lPSJwYXJhbTEiIHNlbGVjdD0iJ2RlZmF1bHQgdmFsdWUnIi8+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+Ci0gICAgPGh0bWw+PGJvZHk+PHA+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJhbTEiLz48L3A+PC9ib2R5PjwvaHRtbD4KLSAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zZXJ2bGV0L21lZGlhLnByb3BlcnRpZXMgYi9zYW1wbGVzL3NlcnZsZXQvbWVkaWEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIzY2Y0NS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3NlcnZsZXQvbWVkaWEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMgVGhpcyBwcm9wZXJ0eSBmaWxlIGlzIHVzZWQgYnkgY29tLmxvdHVzLnhzbC5zZXJ2ZXIuRGVmYXVsdEFwcGx5WFNMLgotIwotIyBFYWNoIGxpbmUgYmVsb3cgc3BlY2lmaWVzIGEgbWFwcGluZyBydWxlIGJldHdlZW4gYSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIEhUVFAgcmVxdWVzdCdzIHVzZXItQWdlbnQgCi0jIGZpZWxkIGFuZCBhIHZhbHVlIHRvIGJlIHNjYW5uZWQgZm9yIGluIFhTTCBzdHlsZXNoZWV0KHMpIGFzc29jaWF0ZWQgd2l0aCB0aGUgWE1MIGRhdGEuIFRoaXMgbWFwcGluZyAKLSMgZW5hYmxlcyByZWxhdGlvbnNoaXBzIHRvIGJlIGRlZmluZWQgYmV0d2VlbiBjbGllbnQgY2FwYWJpbGl0aWVzIGFuZCBzdHlsZXNoZWV0cyBjYXBhYmxlIG9mIGFjdGluZyAKLSMgb24gdGhlc2UgY2FwYWJpbGl0aWVzLgotIwotIyBUaGUgcnVsZXMgZGVmaW5lZCBiZWxvdyBhcmUgb3JkZXItc2lnbmlmaWNhbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIGZpcnN0IHJ1bGUgaXMgdW5zdWNjZXNzZnVsLAotIyB0aGUgc2Vjb25kIHJ1bGUgd2lsbCBiZSB0cmllZCwgZXRjLiAgVGhlIG1lZGlhIHZhbHVlICJ1bmtub3duIiB3aWxsIGJlIHVzZWQgd2hlbiBubyBydWxlcyBhcmUKLSMgc2F0aXNmaWVkLgotIwotIyBFeGFtcGxlOiAKLSMKLSMgTWFwcGluZyBydWxlcyBvZi4uLgotIwotIyAgIE1TSUU9ZXhwbG9yZXIKLSMgICBNU1BJRT1wb2NrZXRleHBsb3JlcgotIwotIyAuLi5hbmQgWE1MIGRhdGEgdGhhdCBjb250YWlucyBYU0wgc3R5bGVzaGVldCBhc3NvY2lhdGlvbnMgb2YuLi4KLSMKLSMgPD94bWwtc3R5bGVzaGVldCAgICAgICAgICAgICAgICAgbWVkaWE9ImV4cGxvcmVyIiAgICAgICBocmVmPSJhbGxkYXRhLnhzbCIgIHR5cGU9InRleHQveHNsIj8+Ci0jIDw/eG1sLXN0eWxlc2hlZXQgYWx0ZXJuYXRlPSJ5ZXMiIG1lZGlhPSJwb2NrZXRleHBsb3JlciIgaHJlZj0ic29tZWRhdGEueHNsIiB0eXBlPSJ0ZXh0L3hzbCI/PgotIwotIyAuLi5hbmQgYW4gSFRUUCByZXF1ZXN0IHRoYXQgY29udGFpbnMgYSB1c2VyLUFnZW50IHZhbHVlIG9mLi4uCi0jICAgIAotIyAgIGZvbyBNU1BJRSBiYXIKLSMKLSMgLi4ud2lsbCBhcHBseSB0aGUgWFNMIHN0eWxlc2hlZXQgc29tZWRhdGEueHNsLgotIwotTVNJRT1leHBsb3JlcgotTVNQSUU9cG9ja2V0ZXhwbG9yZXIKLUhhbmRIVFRQPWhhbmR3ZWIKLU1vemlsbGE9bmV0c2NhcGUKLUx5bng9bHlueAotT3BlcmE9b3BlcmEKLUphdmE9amF2YQotQXZhbnRHbz1hdmFudGdvCi1Ob2tpYT1ub2tpYQotVVAuQnJvd3Nlcj11cAotRG9Db01vPWltb2RlCmRpZmYgLS1naXQgYS9zYW1wbGVzL3NlcnZsZXQvcmVhZG1lLmh0bWwgYi9zYW1wbGVzL3NlcnZsZXQvcmVhZG1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODkzNmYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9zZXJ2bGV0L3JlYWRtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+WGFsYW4gU2FtcGxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMj5YYWxhbiBTYW1wbGVzPC9oMj4KLTxwPkZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2FtcGxlcyAod2hhdCB0aGV5IGlsbHVzdHJhdGUgYW5kIGhvdyB0byBydW4gdGhlbSksIHNlZSA8YSBocmVmPSIuLi8uLi9kb2NzL3NhbXBsZXMuaHRtbCI+U2FtcGxlczwvYT4uPC9wPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJheC9FeGFtcGxlQ29udGVudEhhbmRsZXIuamF2YSBiL3NhbXBsZXMvdHJheC9FeGFtcGxlQ29udGVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzMDhmNC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RyYXgvRXhhbXBsZUNvbnRlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLQotcHVibGljIGNsYXNzIEV4YW1wbGVDb250ZW50SGFuZGxlciBpbXBsZW1lbnRzIENvbnRlbnRIYW5kbGVyCi17Ci0gIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvciAoTG9jYXRvciBsb2NhdG9yKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJzZXREb2N1bWVudExvY2F0b3IiKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCAoKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3RhcnREb2N1bWVudCIpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJlbmREb2N1bWVudCIpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcgKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpCi0gICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJzdGFydFByZWZpeE1hcHBpbmc6ICIrcHJlZml4KyIsICIrdXJpKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZyAoU3RyaW5nIHByZWZpeCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVuZFByZWZpeE1hcHBpbmc6ICIrcHJlZml4KTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50IChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnQoInN0YXJ0RWxlbWVudDogIituYW1lc3BhY2VVUkkrIiwgIituYW1lc3BhY2VVUkkrCi0gICAgICAgICAgICAgICAgICAgICAgICIsICIrcU5hbWUpOwotICAgIGludCBuID0gYXR0cy5nZXRMZW5ndGgoKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIithdHRzLmdldFFOYW1lKGkpKTsKLSAgICB9Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgZW5kRWxlbWVudCAoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZW5kRWxlbWVudDogIituYW1lc3BhY2VVUkkrIiwgIituYW1lc3BhY2VVUkkrCi0gICAgICAgICAgICAgICAgICAgICAgICIsICIrcU5hbWUpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzIChjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCAobGVuZ3RoID4gMzApID8gMzAgOiBsZW5ndGgpOwotICAgIGlmKGxlbmd0aCA+IDMwKQotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaGFyYWN0ZXJzOiBcIiIrcysiXCIuLi4iKTsKLSAgICBlbHNlCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNoYXJhY3RlcnM6IFwiIitzKyJcIiIpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlIChjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oImlnbm9yYWJsZVdoaXRlc3BhY2UiKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uIChTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oInByb2Nlc3NpbmdJbnN0cnVjdGlvbjogIit0YXJnZXQrIiwgIit0YXJnZXQpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5IChTdHJpbmcgbmFtZSkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNraXBwZWRFbnRpdHk6ICIrbmFtZSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmF4L0V4YW1wbGVzLmphdmEgYi9zYW1wbGVzL3RyYXgvRXhhbXBsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlZmVjYy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RyYXgvRXhhbXBsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4MCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLio7Ci0KLS8vIE5lZWRlZCBqYXZhIGNsYXNzZXMKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vLyBOZWVkZWQgU0FYIGNsYXNzZXMKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguUGFyc2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTFJlYWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTEZpbHRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyOwotCi0vLyBOZWVkZWQgRE9NIGNsYXNzZXMKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vLyBOZWVkZWQgSkFYUCBjbGFzc2VzCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsgICAgLy8gZG1sCi0KLS8qKgotICogU29tZSBleGFtcGxlcyB0byBzaG93IGhvdyB0aGUgU2ltcGxlIEFQSSBmb3IgVHJhbnNmb3JtYXRpb25zCi0gKiBjb3VsZCBiZSB1c2VkLgotICogCi0gKiBYYWxhbiBEZXZlbG9wZXJzOiBwbGVhc2Ugc2VlIAotICogeG1sLXhhbGFuL3Rlc3QvamF2YS9zcmMvb3JnL2FwYWNoZS9xZXRlc3QvdHJheC9FeGFtcGxlc1Rlc3QuamF2YQotICogd2hlbiB1cGRhdGluZyB0aGlzIGZpbGUsIGFuZCB1cGRhdGUgdGhhdCB0ZXN0IGZpbGUgYXMgd2VsbC4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzY290dF9ib2FnQGxvdHVzLmNvbSI+U2NvdHQgQm9hZzwvYT4KLSAqLwotcHVibGljIGNsYXNzIEV4YW1wbGVzCi17Ci0gIC8qKgotICAgKiBNZXRob2QgbWFpbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkKLSAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG49PT09IGV4YW1wbGVTaW1wbGUgPT09PSIpOwotICAgIHRyeSB7Ci0gICAgICAgIGV4YW1wbGVTaW1wbGUxKCJ4bWwvZm9vLnhtbCIsICJ4c2wvZm9vLnhzbCIpOwotICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgCi0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCk7Ci0gICAgfSAKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG49PT09IGV4YW1wbGVTaW1wbGUyID09PT0iKTsKLSAgICB0cnkgewotICAgICAgICBleGFtcGxlU2ltcGxlMigieG1sL2Zvby54bWwiLCAieHNsL2Zvby54c2wiKTsKLSAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7IAotICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXgpOwotICAgIH0gCi0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuPT09PSBleGFtcGxlRnJvbVN0cmVhbSA9PT09Iik7Ci0gICAgdHJ5IHsKLSAgICAgICAgZXhhbXBsZUZyb21TdHJlYW0oInhtbC9mb28ueG1sIiwgInhzbC9mb28ueHNsIik7Ci0gICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAKLSAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4KTsKLSAgICB9IAotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbj09PT0gZXhhbXBsZUZyb21SZWFkZXIgPT09PSIpOwotICAgIHRyeSB7Ci0gICAgICAgIGV4YW1wbGVGcm9tUmVhZGVyKCJ4bWwvZm9vLnhtbCIsICJ4c2wvZm9vLnhzbCIpOwotICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgCi0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCk7Ci0gICAgfSAKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG49PT09IGV4YW1wbGVVc2VUZW1wbGF0ZXNPYmogPT09PSIpOwotICAgIHRyeSB7Ci0gICAgICAgIGV4YW1wbGVVc2VUZW1wbGF0ZXNPYmooInhtbC9mb28ueG1sIiwgInhtbC9iYXoueG1sIiwgInhzbC9mb28ueHNsIik7Ci0gICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAKLSAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4KTsKLSAgICB9IAotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbj09PT0gZXhhbXBsZUNvbnRlbnRIYW5kbGVyVG9Db250ZW50SGFuZGxlciA9PT09Iik7Ci0gICAgdHJ5IHsKLSAgICAgICAgZXhhbXBsZUNvbnRlbnRIYW5kbGVyVG9Db250ZW50SGFuZGxlcigieG1sL2Zvby54bWwiLCAieHNsL2Zvby54c2wiKTsKLSAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7IAotICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXgpOwotICAgIH0gCi0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuPT09PSBleGFtcGxlWE1MUmVhZGVyID09PT0iKTsKLSAgICB0cnkgewotICAgICAgICBleGFtcGxlWE1MUmVhZGVyKCJ4bWwvZm9vLnhtbCIsICJ4c2wvZm9vLnhzbCIpOwotICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgCi0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCk7Ci0gICAgfSAKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG49PT09IGV4YW1wbGVYTUxGaWx0ZXIgPT09PSIpOwotICAgIHRyeSB7Ci0gICAgICAgIGV4YW1wbGVYTUxGaWx0ZXIoInhtbC9mb28ueG1sIiwgInhzbC9mb28ueHNsIik7Ci0gICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAKLSAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4KTsKLSAgICB9IAotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbj09PT0gZXhhbXBsZVhNTEZpbHRlckNoYWluID09PT0iKTsKLSAgICB0cnkgewotICAgICAgICBleGFtcGxlWE1MRmlsdGVyQ2hhaW4oInhtbC9mb28ueG1sIiwgInhzbC9mb28ueHNsIiwgInhzbC9mb28yLnhzbCIsICJ4c2wvZm9vMy54c2wiKTsKLSAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7IAotICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXgpOwotICAgIH0gCi0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuPT09PSBleGFtcGxlRE9NMkRPTSA9PT09Iik7Ci0gICAgdHJ5IHsKLSAgICAgICAgZXhhbXBsZURPTTJET00oInhtbC9mb28ueG1sIiwgInhzbC9mb28ueHNsIik7Ci0gICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAKLSAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4KTsKLSAgICB9IAotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbj09PT0gZXhhbXBsZVBhcmFtID09PT0iKTsKLSAgICB0cnkgewotICAgICAgICBleGFtcGxlUGFyYW0oInhtbC9mb28ueG1sIiwgInhzbC9mb28ueHNsIik7Ci0gICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAKLSAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4KTsKLSAgICB9IAotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbj09PT0gZXhhbXBsZVRyYW5zZm9ybWVyUmV1c2UgPT09PSIpOwotICAgIHRyeSB7Ci0gICAgICAgIGV4YW1wbGVUcmFuc2Zvcm1lclJldXNlKCJ4bWwvZm9vLnhtbCIsICJ4c2wvZm9vLnhzbCIpOwotICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgCi0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCk7Ci0gICAgfSAKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG49PT09IGV4YW1wbGVPdXRwdXRQcm9wZXJ0aWVzID09PT0iKTsKLSAgICB0cnkgewotICAgICAgICBleGFtcGxlT3V0cHV0UHJvcGVydGllcygieG1sL2Zvby54bWwiLCAieHNsL2Zvby54c2wiKTsKLSAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7IAotICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXgpOwotICAgIH0gCi0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuPT09PSBleGFtcGxlVXNlQXNzb2NpYXRlZCA9PT09Iik7Ci0gICAgdHJ5IHsKLSAgICAgICAgZXhhbXBsZVVzZUFzc29jaWF0ZWQoInhtbC9mb28ueG1sIik7Ci0gICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAKLSAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4KTsKLSAgICB9IAotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbj09PT0gZXhhbXBsZUNvbnRlbnRIYW5kbGVyMkRPTSA9PT09Iik7Ci0gICAgdHJ5IHsKLSAgICAgICAgZXhhbXBsZUNvbnRlbnRIYW5kbGVyMkRPTSgieG1sL2Zvby54bWwiLCAieHNsL2Zvby54c2wiKTsKLSAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7IAotICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXgpOwotICAgIH0gCi0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuPT09PSBleGFtcGxlQXNTZXJpYWxpemVyID09PT0iKTsKLSAgICB0cnkgewotICAgICAgICBleGFtcGxlQXNTZXJpYWxpemVyKCJ4bWwvZm9vLnhtbCIsICJ4c2wvZm9vLnhzbCIpOwotICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgCi0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCk7Ci0gICAgfSAKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG49PT09IGV4YW1wbGVDb250ZW50SGFuZGxlcjJET00gPT09PSIpOwotICAgIHRyeSB7Ci0gICAgICAgIGV4YW1wbGVDb250ZW50SGFuZGxlcjJET00oInhtbC9mb28ueG1sIiwgInhzbC9mb28ueHNsIik7Ci0gICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeyAKLSAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4KTsKLSAgICB9IAotCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcbj09PT0gZG9uZSEgPT09PSIpOwotICB9Ci0gIAotICAvKioKLSAgICogU2hvdyB0aGUgc2ltcGxlc3QgcG9zc2libGUgdHJhbnNmb3JtYXRpb24gZnJvbSBzeXN0ZW0gaWQgCi0gICAqIHRvIG91dHB1dCBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZXhhbXBsZVNpbXBsZTEoU3RyaW5nIHNvdXJjZUlELCBTdHJpbmcgeHNsSUQpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSBhIHRyYW5zZm9ybSBmYWN0b3J5IGluc3RhbmNlLgotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIHRyYW5zZm9ybWVyIGZvciB0aGUgc3R5bGVzaGVldC4KLSAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciAKLSAgICAgID0gdGZhY3RvcnkubmV3VHJhbnNmb3JtZXIobmV3IFN0cmVhbVNvdXJjZSh4c2xJRCkpOwotICAgIAotICAgIC8vIFRyYW5zZm9ybSB0aGUgc291cmNlIFhNTCB0byBTeXN0ZW0ub3V0LgotICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSggbmV3IFN0cmVhbVNvdXJjZShzb3VyY2VJRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtUmVzdWx0KFN5c3RlbS5vdXQpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNob3cgdGhlIHNpbXBsZXN0IHBvc3NpYmxlIHRyYW5zZm9ybWF0aW9uIGZyb20gRmlsZSAKLSAgICogdG8gYSBGaWxlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVTaW1wbGUyKFN0cmluZyBzb3VyY2VJRCwgU3RyaW5nIHhzbElEKQotICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgYSB0cmFuc2Zvcm0gZmFjdG9yeSBpbnN0YW5jZS4KLSAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSB0cmFuc2Zvcm1lciBmb3IgdGhlIHN0eWxlc2hlZXQuCi0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgCi0gICAgICA9IHRmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKG5ldyBTdHJlYW1Tb3VyY2UoeHNsSUQpKTsKLSAgICAKLSAgICAvLyBUcmFuc2Zvcm0gdGhlIHNvdXJjZSBYTUwgdG8gU3lzdGVtLm91dC4KLSAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oIG5ldyBTdHJlYW1Tb3VyY2UobmV3IEZpbGUoc291cmNlSUQpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGUoImZvby5vdXQiKSkpOwotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBTaG93IHNpbXBsZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGlucHV0IHN0cmVhbSB0byBvdXRwdXQgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVGcm9tU3RyZWFtKFN0cmluZyBzb3VyY2VJRCwgU3RyaW5nIHhzbElEKQotICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLAotICAgICAgICAgICBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSBhIHRyYW5zZm9ybSBmYWN0b3J5IGluc3RhbmNlLgotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgSW5wdXRTdHJlYW0geHNsSVMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHhzbElEKSk7Ci0gICAgU3RyZWFtU291cmNlIHhzbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoeHNsSVMpOwotICAgIC8vIE5vdGUgdGhhdCBpZiB3ZSBkb24ndCBkbyB0aGlzLCByZWxhdGl2ZSBVUkxzIGNhbiBub3QgYmUgcmVzb2x2ZWQgY29ycmVjdGx5IQotICAgIHhzbFNvdXJjZS5zZXRTeXN0ZW1JZCh4c2xJRCk7Ci0KLSAgICAvLyBDcmVhdGUgYSB0cmFuc2Zvcm1lciBmb3IgdGhlIHN0eWxlc2hlZXQuCi0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0ZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcih4c2xTb3VyY2UpOwotICAgIAotICAgIElucHV0U3RyZWFtIHhtbElTID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2VJRCkpOwotICAgIFN0cmVhbVNvdXJjZSB4bWxTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhtbElTKTsKLSAgICAvLyBOb3RlIHRoYXQgaWYgd2UgZG9uJ3QgZG8gdGhpcywgcmVsYXRpdmUgVVJMcyBjYW4gbm90IGJlIHJlc29sdmVkIGNvcnJlY3RseSEKLSAgICB4bWxTb3VyY2Uuc2V0U3lzdGVtSWQoc291cmNlSUQpOwotICAgIAotICAgIC8vIFRyYW5zZm9ybSB0aGUgc291cmNlIFhNTCB0byBTeXN0ZW0ub3V0LgotICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSggeG1sU291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KFN5c3RlbS5vdXQpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNob3cgc2ltcGxlIHRyYW5zZm9ybWF0aW9uIGZyb20gcmVhZGVyIHRvIG91dHB1dCBzdHJlYW0uICBJbiBnZW5lcmFsIAotICAgKiB0aGlzIHVzZSBjYXNlIGlzIGRpc2NvdXJhZ2VkLCBzaW5jZSB0aGUgWE1MIGVuY29kaW5nIGNhbiBub3QgYmUgCi0gICAqIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBleGFtcGxlRnJvbVJlYWRlcihTdHJpbmcgc291cmNlSUQsIFN0cmluZyB4c2xJRCkKLSAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgYSB0cmFuc2Zvcm0gZmFjdG9yeSBpbnN0YW5jZS4KLSAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIC8vIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UgdGhlIFhNTCBlbmNvZGluZyBjYW4gbm90IGJlIHByb2Nlc3NlZCEKLSAgICBSZWFkZXIgeHNsUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHhzbElEKSk7Ci0gICAgU3RyZWFtU291cmNlIHhzbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoeHNsUmVhZGVyKTsKLSAgICAvLyBOb3RlIHRoYXQgaWYgd2UgZG9uJ3QgZG8gdGhpcywgcmVsYXRpdmUgVVJMcyBjYW4gbm90IGJlIHJlc29sdmVkIGNvcnJlY3RseSEKLSAgICB4c2xTb3VyY2Uuc2V0U3lzdGVtSWQoeHNsSUQpOwotCi0gICAgLy8gQ3JlYXRlIGEgdHJhbnNmb3JtZXIgZm9yIHRoZSBzdHlsZXNoZWV0LgotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsU291cmNlKTsKLSAgICAKLSAgICAvLyBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlIHRoZSBYTUwgZW5jb2RpbmcgY2FuIG5vdCBiZSBwcm9jZXNzZWQhCi0gICAgUmVhZGVyIHhtbFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihzb3VyY2VJRCkpOwotICAgIFN0cmVhbVNvdXJjZSB4bWxTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhtbFJlYWRlcik7Ci0gICAgLy8gTm90ZSB0aGF0IGlmIHdlIGRvbid0IGRvIHRoaXMsIHJlbGF0aXZlIFVSTHMgY2FuIG5vdCBiZSByZXNvbHZlZCBjb3JyZWN0bHkhCi0gICAgeG1sU291cmNlLnNldFN5c3RlbUlkKHNvdXJjZUlEKTsKLSAgICAKLSAgICAvLyBUcmFuc2Zvcm0gdGhlIHNvdXJjZSBYTUwgdG8gU3lzdGVtLm91dC4KLSAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oIHhtbFNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0gIH0KLQotCi0gCi0gIC8qKgotICAgKiBTaG93IHRoZSBzaW1wbGVzdCBwb3NzaWJsZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIHN5c3RlbSBpZCB0byBvdXRwdXQgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVVc2VUZW1wbGF0ZXNPYmooU3RyaW5nIHNvdXJjZUlEMSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlSUQyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB4c2xJRCkKLSAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0KLSAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSB0ZW1wbGF0ZXMgb2JqZWN0LCB3aGljaCBpcyB0aGUgcHJvY2Vzc2VkLCAKLSAgICAvLyB0aHJlYWQtc2FmZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3R5bGVzaGVldC4KLSAgICBUZW1wbGF0ZXMgdGVtcGxhdGVzID0gdGZhY3RvcnkubmV3VGVtcGxhdGVzKG5ldyBTdHJlYW1Tb3VyY2UoeHNsSUQpKTsKLQotICAgIC8vIElsbHVzdHJhdGUgdGhlIGZhY3QgdGhhdCB5b3UgY2FuIG1ha2UgbXVsdGlwbGUgdHJhbnNmb3JtZXJzIAotICAgIC8vIGZyb20gdGhlIHNhbWUgdGVtcGxhdGUuCi0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIxID0gdGVtcGxhdGVzLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIyID0gdGVtcGxhdGVzLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuLS0tLS0gdHJhbnNmb3JtIG9mICIrc291cmNlSUQxKyIgLS0tLS0iKTsKLSAgICAKLSAgICB0cmFuc2Zvcm1lcjEudHJhbnNmb3JtKG5ldyBTdHJlYW1Tb3VyY2Uoc291cmNlSUQxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuLS0tLS0gdHJhbnNmb3JtIG9mICIrc291cmNlSUQyKyIgLS0tLS0iKTsKLSAgICAKLSAgICB0cmFuc2Zvcm1lcjIudHJhbnNmb3JtKG5ldyBTdHJlYW1Tb3VyY2Uoc291cmNlSUQyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0gIH0KLSAgCi0KLQotICAvKioKLSAgICogU2hvdyB0aGUgVHJhbnNmb3JtZXIgdXNpbmcgU0FYIGV2ZW50cyBpbiBhbmQgU0FYIGV2ZW50cyBvdXQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZXhhbXBsZUNvbnRlbnRIYW5kbGVyVG9Db250ZW50SGFuZGxlcihTdHJpbmcgc291cmNlSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgeHNsSUQpCi0gICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCAKLSAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCAKLSAgICAgICAgICAgICAgICAgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAvLyBEb2VzIHRoaXMgZmFjdG9yeSBzdXBwb3J0IFNBWCBmZWF0dXJlcz8KLSAgICBpZiAodGZhY3RvcnkuZ2V0RmVhdHVyZShTQVhTb3VyY2UuRkVBVFVSRSkpCi0gICAgewotICAgICAgLy8gSWYgc28sIHdlIGNhbiBzYWZlbHkgY2FzdC4KLSAgICAgIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSBzdGZhY3RvcnkgPSAoKFNBWFRyYW5zZm9ybWVyRmFjdG9yeSkgdGZhY3RvcnkpOwotICAgICAgCi0gICAgICAvLyBBIFRyYW5zZm9ybWVySGFuZGxlciBpcyBhIENvbnRlbnRIYW5kbGVyIHRoYXQgd2lsbCBsaXN0ZW4gZm9yIAotICAgICAgLy8gU0FYIGV2ZW50cywgYW5kIHRyYW5zZm9ybSB0aGVtIHRvIHRoZSByZXN1bHQuCi0gICAgICBUcmFuc2Zvcm1lckhhbmRsZXIgaGFuZGxlciAKLSAgICAgICAgPSBzdGZhY3RvcnkubmV3VHJhbnNmb3JtZXJIYW5kbGVyKG5ldyBTdHJlYW1Tb3VyY2UoeHNsSUQpKTsKLQotICAgICAgLy8gU2V0IHRoZSByZXN1bHQgaGFuZGxpbmcgdG8gYmUgYSBzZXJpYWxpemF0aW9uIHRvIFN5c3RlbS5vdXQuCi0gICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFNBWFJlc3VsdChuZXcgRXhhbXBsZUNvbnRlbnRIYW5kbGVyKCkpOwotICAgICAgaGFuZGxlci5zZXRSZXN1bHQocmVzdWx0KTsKLSAgICAgIAotICAgICAgLy8gQ3JlYXRlIGEgcmVhZGVyLCBhbmQgc2V0IGl0J3MgY29udGVudCBoYW5kbGVyIHRvIGJlIHRoZSBUcmFuc2Zvcm1lckhhbmRsZXIuCi0gICAgICBYTUxSZWFkZXIgcmVhZGVyPW51bGw7Ci0KLSAgICAgIC8vIFVzZSBKQVhQMS4xICggaWYgcG9zc2libGUgKQotICAgICAgdHJ5IHsKLQkgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeT0KLQkgICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKCB0cnVlICk7Ci0JICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIgamF4cFBhcnNlcj0KLQkgICAgICBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCSAgcmVhZGVyPWpheHBQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JICAKLSAgICAgIH0gY2F0Y2goIGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXggKSB7Ci0JICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKCBleCApOwotICAgICAgfSBjYXRjaCggamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBleDEgKSB7Ci0JICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKCBleDEudG9TdHJpbmcoKSApOwotICAgICAgfSBjYXRjaCggTm9TdWNoTWV0aG9kRXJyb3IgZXgyICkgewotICAgICAgfQotICAgICAgaWYoIHJlYWRlcj09bnVsbCApIHJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7Ci0gICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICAKLSAgICAgIC8vIEl0J3MgYSBnb29kIGlkZWEgZm9yIHRoZSBwYXJzZXIgdG8gc2VuZCBsZXhpY2FsIGV2ZW50cy4KLSAgICAgIC8vIFRoZSBUcmFuc2Zvcm1lckhhbmRsZXIgaXMgYWxzbyBhIExleGljYWxIYW5kbGVyLgotICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCBoYW5kbGVyKTsKLSAgICAgIAotICAgICAgLy8gUGFyc2UgdGhlIHNvdXJjZSBYTUwsIGFuZCBzZW5kIHRoZSBwYXJzZSBldmVudHMgdG8gdGhlIFRyYW5zZm9ybWVySGFuZGxlci4KLSAgICAgIHJlYWRlci5wYXJzZShzb3VyY2VJRCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICJDYW4ndCBkbyBleGFtcGxlQ29udGVudEhhbmRsZXJUb0NvbnRlbnRIYW5kbGVyIGJlY2F1c2UgdGZhY3RvcnkgaXMgbm90IGEgU0FYVHJhbnNmb3JtZXJGYWN0b3J5Iik7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogU2hvdyB0aGUgVHJhbnNmb3JtZXIgYXMgYSBTQVgyIFhNTFJlYWRlci4gIEFuIFhNTEZpbHRlciBvYnRhaW5lZCAKLSAgICogZnJvbSBuZXdYTUxGaWx0ZXIgc2hvdWxkIGFjdCBhcyBhIHRyYW5zZm9ybWluZyBYTUxSZWFkZXIgaWYgc2V0UGFyZW50IGlzIG5vdAotICAgKiBjYWxsZWQuICBJbnRlcm5hbGx5LCBhbiBYTUxSZWFkZXIgaXMgY3JlYXRlZCBhcyB0aGUgcGFyZW50IGZvciB0aGUgWE1MRmlsdGVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVYTUxSZWFkZXIoU3RyaW5nIHNvdXJjZUlELCBTdHJpbmcgeHNsSUQpCi0gICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gICAgLy8gLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBpZih0ZmFjdG9yeS5nZXRGZWF0dXJlKFNBWFNvdXJjZS5GRUFUVVJFKSkKLSAgICB7Ci0gICAgICBYTUxSZWFkZXIgcmVhZGVyIAotICAgICAgICA9ICgoU0FYVHJhbnNmb3JtZXJGYWN0b3J5KSB0ZmFjdG9yeSkubmV3WE1MRmlsdGVyKG5ldyBTdHJlYW1Tb3VyY2UoeHNsSUQpKTsKLSAgICAgIAotICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBFeGFtcGxlQ29udGVudEhhbmRsZXIoKSk7Ci0KLSAgICAgIHJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2Uoc291cmNlSUQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZmFjdG9yeSBkb2VzIG5vdCBzdXBwb3J0IFNBWCBmZWF0dXJlcyEiKTsKLSAgfQotCi0gIC8qKgotICAgKiBTaG93IHRoZSBUcmFuc2Zvcm1lciBhcyBhIHNpbXBsZSBYTUxGaWx0ZXIuICBUaGlzIGlzIHByZXR0eSBzaW1pbGFyCi0gICAqIHRvIGV4YW1wbGVYTUxSZWFkZXIsIGV4Y2VwdCB0aGF0IGhlcmUgdGhlIHBhcmVudCBYTUxSZWFkZXIgaXMgY3JlYXRlZCAKLSAgICogYnkgdGhlIGNhbGxlciwgaW5zdGVhZCBvZiBhdXRvbWF0aWNhbGx5IHdpdGhpbiB0aGUgWE1MRmlsdGVyLiAgVGhpcyAKLSAgICogZ2l2ZXMgdGhlIGNhbGxlciBtb3JlIGRpcmVjdCBjb250cm9sIG92ZXIgdGhlIHBhcmVudCByZWFkZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZXhhbXBsZVhNTEZpbHRlcihTdHJpbmcgc291cmNlSUQsIFN0cmluZyB4c2xJRCkKLSAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiAgICAvLyAsIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgWE1MUmVhZGVyIHJlYWRlcj1udWxsOwotICAgIAotICAgIC8vIFVzZSBKQVhQMS4xICggaWYgcG9zc2libGUgKQotICAgIHRyeSB7Ci0JamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5PQotCSAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKCB0cnVlICk7Ci0JICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIgamF4cFBhcnNlcj0KLQkgICAgZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQlyZWFkZXI9amF4cFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLQkKLSAgICB9IGNhdGNoKCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4ICkgewotCXRocm93IG5ldyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24oIGV4ICk7Ci0gICAgfSBjYXRjaCggamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBleDEgKSB7Ci0JdGhyb3cgbmV3IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiggZXgxLnRvU3RyaW5nKCkgKTsKLSAgICB9IGNhdGNoKCBOb1N1Y2hNZXRob2RFcnJvciBleDIgKSB7Ci0gICAgfQotICAgIGlmKCByZWFkZXI9PW51bGwgKSByZWFkZXIgPSBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOwotICAgIC8vIFRoZSB0cmFuc2Zvcm1lciB3aWxsIHVzZSBhIFNBWCBwYXJzZXIgYXMgaXQncyByZWFkZXIuICAgIAotICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgRXhhbXBsZUNvbnRlbnRIYW5kbGVyKCkpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL2R5bmFtaWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gc2UpCi0gICAgewotCi0gICAgICAvLyBXaGF0IGNhbiB3ZSBkbz8KLSAgICAgIC8vIFRPRE86IFVzZXIgZGlhZ25vc3RpY3MuCi0gICAgfQotCi0gICAgWE1MRmlsdGVyIGZpbHRlciAKLSAgICAgID0gKChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpIHRmYWN0b3J5KS5uZXdYTUxGaWx0ZXIobmV3IFN0cmVhbVNvdXJjZSh4c2xJRCkpOwotCi0gICAgZmlsdGVyLnNldFBhcmVudChyZWFkZXIpOwotCi0gICAgLy8gTm93LCB3aGVuIHlvdSBjYWxsIHRyYW5zZm9ybWVyLnBhcnNlLCBpdCB3aWxsIHNldCBpdHNlbGYgYXMgCi0gICAgLy8gdGhlIGNvbnRlbnQgaGFuZGxlciBmb3IgdGhlIHBhcnNlciBvYmplY3QgKGl0J3MgInBhcmVudCIpLCBhbmQgCi0gICAgLy8gd2lsbCB0aGVuIGNhbGwgdGhlIHBhcnNlIG1ldGhvZCBvbiB0aGUgcGFyc2VyLgotICAgIGZpbHRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2Uoc291cmNlSUQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGNoYWluIGV2ZW50cyBmcm9tIG9uZSBUcmFuc2Zvcm1lcgotICAgKiB0byBhbm90aGVyIHRyYW5zZm9ybWVyLCB1c2luZyB0aGUgVHJhbnNmb3JtZXIgYXMgYQotICAgKiBTQVgyIFhNTEZpbHRlci9YTUxSZWFkZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZXhhbXBsZVhNTEZpbHRlckNoYWluKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3VyY2VJRCwgU3RyaW5nIHhzbElEXzEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB4c2xJRF8yLCBTdHJpbmcgeHNsSURfMykKLSAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgCi0gICAgVGVtcGxhdGVzIHN0eWxlc2hlZXQxID0gdGZhY3RvcnkubmV3VGVtcGxhdGVzKG5ldyBTdHJlYW1Tb3VyY2UoeHNsSURfMSkpOwotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyMSA9IHN0eWxlc2hlZXQxLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgCi0gICAgIC8vIElmIG9uZSBzdWNjZXNzLCBhc3N1bWUgYWxsIHdpbGwgc3VjY2VlZC4KLSAgICBpZiAodGZhY3RvcnkuZ2V0RmVhdHVyZShTQVhTb3VyY2UuRkVBVFVSRSkpCi0gICAgewotICAgICAgU0FYVHJhbnNmb3JtZXJGYWN0b3J5IHN0ZiA9IChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpdGZhY3Rvcnk7Ci0gICAgICBYTUxSZWFkZXIgcmVhZGVyPW51bGw7Ci0KLSAgICAgIC8vIFVzZSBKQVhQMS4xICggaWYgcG9zc2libGUgKQotICAgICAgdHJ5IHsKLQkgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeT0KLQkgICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKCB0cnVlICk7Ci0JICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIgamF4cFBhcnNlcj0KLQkgICAgICBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCSAgcmVhZGVyPWpheHBQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JICAKLSAgICAgIH0gY2F0Y2goIGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXggKSB7Ci0JICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKCBleCApOwotICAgICAgfSBjYXRjaCggamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBleDEgKSB7Ci0JICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKCBleDEudG9TdHJpbmcoKSApOwotICAgICAgfSBjYXRjaCggTm9TdWNoTWV0aG9kRXJyb3IgZXgyICkgewotICAgICAgfQotICAgICAgaWYoIHJlYWRlcj09bnVsbCApIHJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7Ci0KLSAgICAgIFhNTEZpbHRlciBmaWx0ZXIxID0gc3RmLm5ld1hNTEZpbHRlcihuZXcgU3RyZWFtU291cmNlKHhzbElEXzEpKTsKLSAgICAgIFhNTEZpbHRlciBmaWx0ZXIyID0gc3RmLm5ld1hNTEZpbHRlcihuZXcgU3RyZWFtU291cmNlKHhzbElEXzIpKTsKLSAgICAgIFhNTEZpbHRlciBmaWx0ZXIzID0gc3RmLm5ld1hNTEZpbHRlcihuZXcgU3RyZWFtU291cmNlKHhzbElEXzMpKTsKLQotICAgICAgaWYgKG51bGwgIT0gZmlsdGVyMSkgLy8gSWYgb25lIHN1Y2Nlc3MsIGFzc3VtZSBhbGwgd2VyZSBzdWNjZXNzLgotICAgICAgewotICAgICAgICAvLyB0cmFuc2Zvcm1lcjEgd2lsbCB1c2UgYSBTQVggcGFyc2VyIGFzIGl0J3MgcmVhZGVyLiAgICAKLSAgICAgICAgZmlsdGVyMS5zZXRQYXJlbnQocmVhZGVyKTsKLQotICAgICAgICAvLyB0cmFuc2Zvcm1lcjIgd2lsbCB1c2UgdHJhbnNmb3JtZXIxIGFzIGl0J3MgcmVhZGVyLgotICAgICAgICBmaWx0ZXIyLnNldFBhcmVudChmaWx0ZXIxKTsKLQotICAgICAgICAvLyB0cmFuc2Zvcm0zIHdpbGwgdXNlIHRyYW5zZm9ybTIgYXMgaXQncyByZWFkZXIuCi0gICAgICAgIGZpbHRlcjMuc2V0UGFyZW50KGZpbHRlcjIpOwotCi0gICAgICAgIGZpbHRlcjMuc2V0Q29udGVudEhhbmRsZXIobmV3IEV4YW1wbGVDb250ZW50SGFuZGxlcigpKTsKLSAgICAgICAgLy8gZmlsdGVyMy5zZXRDb250ZW50SGFuZGxlcihuZXcgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcigpKTsKLQotICAgICAgICAvLyBOb3csIHdoZW4geW91IGNhbGwgdHJhbnNmb3JtZXIzIHRvIHBhcnNlLCBpdCB3aWxsIHNldCAgCi0gICAgICAgIC8vIGl0c2VsZiBhcyB0aGUgQ29udGVudEhhbmRsZXIgZm9yIHRyYW5zZm9ybTIsIGFuZCAKLSAgICAgICAgLy8gY2FsbCB0cmFuc2Zvcm0yLnBhcnNlLCB3aGljaCB3aWxsIHNldCBpdHNlbGYgYXMgdGhlIAotICAgICAgICAvLyBjb250ZW50IGhhbmRsZXIgZm9yIHRyYW5zZm9ybTEsIGFuZCBjYWxsIHRyYW5zZm9ybTEucGFyc2UsIAotICAgICAgICAvLyB3aGljaCB3aWxsIHNldCBpdHNlbGYgYXMgdGhlIGNvbnRlbnQgbGlzdGVuZXIgZm9yIHRoZSAKLSAgICAgICAgLy8gU0FYIHBhcnNlciwgYW5kIGNhbGwgcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZSgieG1sL2Zvby54bWwiKSkuCi0gICAgICAgIGZpbHRlcjMucGFyc2UobmV3IElucHV0U291cmNlKHNvdXJjZUlEKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBkbyBleGFtcGxlWE1MRmlsdGVyIGJlY2F1c2UgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZmFjdG9yeSBkb2Vzbid0IHN1cHBvcnQgYXNYTUxGaWx0ZXIoKSIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBkbyBleGFtcGxlWE1MRmlsdGVyIGJlY2F1c2UgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAidGZhY3RvcnkgaXMgbm90IGEgU0FYVHJhbnNmb3JtZXJGYWN0b3J5Iik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNob3cgaG93IHRvIHRyYW5zZm9ybSBhIERPTSB0cmVlIGludG8gYW5vdGhlciBET00gdHJlZS4KLSAgICogVGhpcyB1c2VzIHRoZSBqYXZheC54bWwucGFyc2VycyB0byBwYXJzZSBhbiBYTUwgZmlsZSBpbnRvIGEKLSAgICogRE9NLCBhbmQgY3JlYXRlIGFuIG91dHB1dCBET00uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE5vZGUgZXhhbXBsZURPTTJET00oU3RyaW5nIHNvdXJjZUlELCBTdHJpbmcgeHNsSUQpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCi0gICAgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICBpZiAodGZhY3RvcnkuZ2V0RmVhdHVyZShET01Tb3VyY2UuRkVBVFVSRSkpCi0gICAgewotICAgICAgVGVtcGxhdGVzIHRlbXBsYXRlczsKLQotICAgICAgewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRmYWN0b3J5ID0KLSAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGRmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBvdXROb2RlID0gZG9jQnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgICBOb2RlIGRvYyA9IGRvY0J1aWxkZXIucGFyc2UobmV3IElucHV0U291cmNlKHhzbElEKSk7Ci0gCi0gICAgICAgIERPTVNvdXJjZSBkc291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotICAgICAgICAvLyBJZiB3ZSBkb24ndCBkbyB0aGlzLCB0aGUgdHJhbnNmb3JtZXIgd29uJ3Qga25vdyBob3cgdG8gCi0gICAgICAgIC8vIHJlc29sdmUgcmVsYXRpdmUgVVJMcyBpbiB0aGUgc3R5bGVzaGVldC4KLSAgICAgICAgZHNvdXJjZS5zZXRTeXN0ZW1JZCh4c2xJRCk7Ci0KLSAgICAgICAgdGVtcGxhdGVzID0gdGZhY3RvcnkubmV3VGVtcGxhdGVzKGRzb3VyY2UpOwotICAgICAgfQotCi0gICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRlbXBsYXRlcy5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBvdXROb2RlID0gZG9jQnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgTm9kZSBkb2MgPSBkb2NCdWlsZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShzb3VyY2VJRCkpOwotCi0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2MpLCBuZXcgRE9NUmVzdWx0KG91dE5vZGUpKTsKLSAgICAgIAotICAgICAgVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IHRmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICBzZXJpYWxpemVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKG91dE5vZGUpLCBuZXcgU3RyZWFtUmVzdWx0KFN5c3RlbS5vdXQpKTsKLQotICAgICAgcmV0dXJuIG91dE5vZGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXgKLSAgICAgICAgLlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiRE9NIG5vZGUgcHJvY2Vzc2luZyBub3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLSAgfSAKLQotICAvKioKLSAgICogVGhpcyBzaG93cyBob3cgdG8gc2V0IGEgcGFyYW1ldGVyIGZvciB1c2UgYnkgdGhlIHRlbXBsYXRlcy4gVXNlIAotICAgKiB0d28gdHJhbnNmb3JtZXJzIHRvIHNob3cgdGhhdCBkaWZmZXJlbnQgcGFyYW1ldGVycyBtYXkgYmUgc2V0IAotICAgKiBvbiBkaWZmZXJlbnQgdHJhbnNmb3JtZXJzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVQYXJhbShTdHJpbmcgc291cmNlSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB4c2xJRCkKLSAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgVGVtcGxhdGVzIHRlbXBsYXRlcyA9IHRmYWN0b3J5Lm5ld1RlbXBsYXRlcyhuZXcgU3RyZWFtU291cmNlKHhzbElEKSk7Ci0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIxID0gdGVtcGxhdGVzLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIyID0gdGVtcGxhdGVzLm5ld1RyYW5zZm9ybWVyKCk7Ci0KLSAgICB0cmFuc2Zvcm1lcjEuc2V0UGFyYW1ldGVyKCJhLXBhcmFtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWxsbyB0byB5b3UhIik7Ci0gICAgdHJhbnNmb3JtZXIxLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKHNvdXJjZUlEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG49PT09PT09PT0iKTsKLSAgICAKLSAgICB0cmFuc2Zvcm1lcjIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLSAgICB0cmFuc2Zvcm1lcjIudHJhbnNmb3JtKG5ldyBTdHJlYW1Tb3VyY2Uoc291cmNlSUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTaG93IHRoZSB0aGF0IGEgdHJhbnNmb3JtZXIgY2FuIGJlIHJldXNlZCwgYW5kIHNob3cgcmVzZXR0aW5nIAotICAgKiBhIHBhcmFtZXRlciBvbiB0aGUgdHJhbnNmb3JtZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZXhhbXBsZVRyYW5zZm9ybWVyUmV1c2UoU3RyaW5nIHNvdXJjZUlELCBTdHJpbmcgeHNsSUQpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSBhIHRyYW5zZm9ybSBmYWN0b3J5IGluc3RhbmNlLgotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIHRyYW5zZm9ybWVyIGZvciB0aGUgc3R5bGVzaGVldC4KLSAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciAKLSAgICAgID0gdGZhY3RvcnkubmV3VHJhbnNmb3JtZXIobmV3IFN0cmVhbVNvdXJjZSh4c2xJRCkpOwotICAgIAotICAgIHRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcigiYS1wYXJhbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVsbG8gdG8geW91ISIpOwotICAgIAotICAgIC8vIFRyYW5zZm9ybSB0aGUgc291cmNlIFhNTCB0byBTeXN0ZW0ub3V0LgotICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSggbmV3IFN0cmVhbVNvdXJjZShzb3VyY2VJRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtUmVzdWx0KFN5c3RlbS5vdXQpKTsKLQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG49PT09PT09PT1cbiIpOwotCi0gICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCJhLXBhcmFtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWxsbyB0byBtZSEiKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotCi0gICAgLy8gVHJhbnNmb3JtIHRoZSBzb3VyY2UgWE1MIHRvIFN5c3RlbS5vdXQuCi0gICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKCBuZXcgU3RyZWFtU291cmNlKHNvdXJjZUlEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNob3cgaG93IHRvIG92ZXJyaWRlIG91dHB1dCBwcm9wZXJ0aWVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVPdXRwdXRQcm9wZXJ0aWVzKFN0cmluZyBzb3VyY2VJRCwgU3RyaW5nIHhzbElEKQotICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLQotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIFRlbXBsYXRlcyB0ZW1wbGF0ZXMgPSB0ZmFjdG9yeS5uZXdUZW1wbGF0ZXMobmV3IFN0cmVhbVNvdXJjZSh4c2xJRCkpOwotICAgIFByb3BlcnRpZXMgb3Byb3BzID0gdGVtcGxhdGVzLmdldE91dHB1dFByb3BlcnRpZXMoKTsKLQotICAgIG9wcm9wcy5wdXQoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLQotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdGVtcGxhdGVzLm5ld1RyYW5zZm9ybWVyKCk7Ci0KLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0aWVzKG9wcm9wcyk7Ci0gICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBTdHJlYW1Tb3VyY2Uoc291cmNlSUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtUmVzdWx0KFN5c3RlbS5vdXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBTaG93IGhvdyB0byBnZXQgc3R5bGVzaGVldHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KLSAgICogeG1sIGRvY3VtZW50IHZpYSB0aGUgeG1sLXN0eWxlc2hlZXQgUEkgKHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldC8pLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVVc2VBc3NvY2lhdGVkKFN0cmluZyBzb3VyY2VJRCkKLSAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAvLyBUaGUgRE9NIHRmYWN0b3J5IHdpbGwgaGF2ZSBpdCdzIG93biB3YXksIGJhc2VkIG9uIERPTTIsIAotICAgIC8vIG9mIGdldHRpbmcgYXNzb2NpYXRlZCBzdHlsZXNoZWV0cy4KLSAgICBpZiAodGZhY3RvcnkgaW5zdGFuY2VvZiBTQVhUcmFuc2Zvcm1lckZhY3RvcnkpCi0gICAgewotICAgICAgU0FYVHJhbnNmb3JtZXJGYWN0b3J5IHN0ZiA9ICgoU0FYVHJhbnNmb3JtZXJGYWN0b3J5KSB0ZmFjdG9yeSk7Ci0gICAgICBTb3VyY2Ugc291cmNlcyA9Ci0gICAgICAgIHN0Zi5nZXRBc3NvY2lhdGVkU3R5bGVzaGVldChuZXcgU3RyZWFtU291cmNlKHNvdXJjZUlEKSwKLSAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLQotICAgICAgaWYobnVsbCAhPSBzb3VyY2VzKQotICAgICAgewotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHNvdXJjZXMpOwotCi0gICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKHNvdXJjZUlEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbid0IGZpbmQgdGhlIGFzc29jaWF0ZWQgc3R5bGVzaGVldCEiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTaG93IHRoZSBUcmFuc2Zvcm1lciB1c2luZyBTQVggZXZlbnRzIGluIGFuZCBET00gbm9kZXMgb3V0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVDb250ZW50SGFuZGxlcjJET00oU3RyaW5nIHNvdXJjZUlELCBTdHJpbmcgeHNsSUQpCi0gICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgLy8gTWFrZSBzdXJlIHRoZSB0cmFuc2Zvcm1lciBmYWN0b3J5IHdlIG9idGFpbmVkIHN1cHBvcnRzIGJvdGgKLSAgICAvLyBET00gYW5kIFNBWC4KLSAgICBpZiAodGZhY3RvcnkuZ2V0RmVhdHVyZShTQVhTb3VyY2UuRkVBVFVSRSkKLSAgICAgICAgJiYgdGZhY3RvcnkuZ2V0RmVhdHVyZShET01Tb3VyY2UuRkVBVFVSRSkpCi0gICAgewotICAgICAgLy8gV2UgY2FuIG5vdyBzYWZlbHkgY2FzdCB0byBhIFNBWFRyYW5zZm9ybWVyRmFjdG9yeS4KLSAgICAgIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSBzZmFjdG9yeSA9IChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpIHRmYWN0b3J5OwotICAgICAgCi0gICAgICAvLyBDcmVhdGUgYW4gRG9jdW1lbnQgbm9kZSBhcyB0aGUgcm9vdCBmb3IgdGhlIG91dHB1dC4KLSAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGZhY3RvcnkgCi0gICAgICAgID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY0J1aWxkZXIgPSBkZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IG91dE5vZGUgPSBkb2NCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgICAKLSAgICAgIC8vIENyZWF0ZSBhIENvbnRlbnRIYW5kbGVyIHRoYXQgY2FuIGxpc3RvbiB0byBTQVggZXZlbnRzIAotICAgICAgLy8gYW5kIHRyYW5zZm9ybSB0aGUgb3V0cHV0IHRvIERPTSBub2Rlcy4KLSAgICAgIFRyYW5zZm9ybWVySGFuZGxlciBoYW5kbGVyIAotICAgICAgICA9IHNmYWN0b3J5Lm5ld1RyYW5zZm9ybWVySGFuZGxlcihuZXcgU3RyZWFtU291cmNlKHhzbElEKSk7Ci0gICAgICBoYW5kbGVyLnNldFJlc3VsdChuZXcgRE9NUmVzdWx0KG91dE5vZGUpKTsKLSAgICAgIAotICAgICAgLy8gQ3JlYXRlIGEgcmVhZGVyIGFuZCBzZXQgaXQncyBDb250ZW50SGFuZGxlciB0byBiZSB0aGUgCi0gICAgICAvLyB0cmFuc2Zvcm1lci4KLSAgICAgIFhNTFJlYWRlciByZWFkZXI9bnVsbDsKLQotICAgICAgLy8gVXNlIEpBWFAxLjEgKCBpZiBwb3NzaWJsZSApCi0gICAgICB0cnkgewotCSAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5PQotCSAgICAgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUoIHRydWUgKTsKLQkgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciBqYXhwUGFyc2VyPQotCSAgICAgIGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JICByZWFkZXI9amF4cFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLQkgIAotICAgICAgfSBjYXRjaCggamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleCApIHsKLQkgIHRocm93IG5ldyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24oIGV4ICk7Ci0gICAgICB9IGNhdGNoKCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGV4MSApIHsKLQkgIHRocm93IG5ldyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24oIGV4MS50b1N0cmluZygpICk7Ci0gICAgICB9IGNhdGNoKCBOb1N1Y2hNZXRob2RFcnJvciBleDIgKSB7Ci0gICAgICB9Ci0gICAgICBpZiggcmVhZGVyPT1udWxsICkgcmVhZGVyPSBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOwotICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIpOwotICAgICAgCi0gICAgICAvLyBTZW5kIHRoZSBTQVggZXZlbnRzIGZyb20gdGhlIHBhcnNlciB0byB0aGUgdHJhbnNmb3JtZXIsCi0gICAgICAvLyBhbmQgdGh1cyB0byB0aGUgRE9NIHRyZWUuCi0gICAgICByZWFkZXIucGFyc2Uoc291cmNlSUQpOwotICAgICAgCi0gICAgICAvLyBTZXJpYWxpemUgdGhlIG5vZGUgZm9yIGRpYWdub3Npcy4KLSAgICAgIGV4YW1wbGVTZXJpYWxpemVOb2RlKG91dE5vZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAiQ2FuJ3QgZG8gZXhhbXBsZUNvbnRlbnRIYW5kbGVyVG9Db250ZW50SGFuZGxlciBiZWNhdXNlIHRmYWN0b3J5IGlzIG5vdCBhIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSIpOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIFNlcmlhbGl6ZSBhIG5vZGUgdG8gU3lzdGVtLm91dC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBleGFtcGxlU2VyaWFsaXplTm9kZShOb2RlIG5vZGUpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCi0gICAgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7IAotICAgIAotICAgIC8vIFRoaXMgY3JlYXRlcyBhIHRyYW5zZm9ybWVyIHRoYXQgZG9lcyBhIHNpbXBsZSBpZGVudGl0eSB0cmFuc2Zvcm0sIAotICAgIC8vIGFuZCB0aHVzIGNhbiBiZSB1c2VkIGZvciBhbGwgaW50ZW50cyBhbmQgcHVycG9zZXMgYXMgYSBzZXJpYWxpemVyLgotICAgIFRyYW5zZm9ybWVyIHNlcmlhbGl6ZXIgPSB0ZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotICAgIAotICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLSAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJ5ZXMiKTsKLSAgICBzZXJpYWxpemVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKG5vZGUpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtUmVzdWx0KFN5c3RlbS5vdXQpKTsKLSAgfSAgCi0gIAotICAvKioKLSAgICogQSBmdWxsZXIgZXhhbXBsZSBzaG93aW5nIGhvdyB0aGUgVHJBWCBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgCi0gICAqIHRvIHNlcmlhbGl6ZSBhIERPTSB0cmVlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGV4YW1wbGVBc1NlcmlhbGl6ZXIoU3RyaW5nIHNvdXJjZUlELCBTdHJpbmcgeHNsSUQpCi0gICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCi0gICAgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IG91dE5vZGUgPSBkb2NCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgTm9kZSBkb2MgPSBkb2NCdWlsZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShzb3VyY2VJRCkpOwotCi0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7IAotICAgIAotICAgIC8vIFRoaXMgY3JlYXRlcyBhIHRyYW5zZm9ybWVyIHRoYXQgZG9lcyBhIHNpbXBsZSBpZGVudGl0eSB0cmFuc2Zvcm0sIAotICAgIC8vIGFuZCB0aHVzIGNhbiBiZSB1c2VkIGZvciBhbGwgaW50ZW50cyBhbmQgcHVycG9zZXMgYXMgYSBzZXJpYWxpemVyLgotICAgIFRyYW5zZm9ybWVyIHNlcmlhbGl6ZXIgPSB0ZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotICAgIAotICAgIFByb3BlcnRpZXMgb3Byb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICBvcHJvcHMucHV0KCJtZXRob2QiLCAiaHRtbCIpOwotICAgIG9wcm9wcy5wdXQoImluZGVudC1hbW91bnQiLCAiMiIpOwotICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydGllcyhvcHJvcHMpOwotICAgIHNlcmlhbGl6ZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7Ci0gIH0KLSAgCi0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCAgaGFuZGxlRXhjZXB0aW9uKCBFeGNlcHRpb24gZXggKSB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJFWENFUFRJT046ICIgKTsKLSAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAKLSAgICBpZiggZXggaW5zdGFuY2VvZiBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJuYWwgZXhjZXB0aW9uOiAiICk7Ci0gICAgICBUaHJvd2FibGUgZXgxPSgoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKWV4KS5nZXRFeGNlcHRpb24oKTsKLSAgICAgIGV4MS5wcmludFN0YWNrVHJhY2UoKTsKLQotICAgICAgaWYoIGV4MSBpbnN0YW5jZW9mIFNBWEV4Y2VwdGlvbiApIHsKLQkgIEV4Y2VwdGlvbiBleDI9KChTQVhFeGNlcHRpb24pZXgxKS5nZXRFeGNlcHRpb24oKTsKLQkgIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJuYWwgc3ViLWV4Y2VwdGlvbjogIiApOwotCSAgZXgyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3RyYXgveG1sL2Jhei54bWwgYi9zYW1wbGVzL3RyYXgveG1sL2Jhei54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllY2Y0NzMuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90cmF4L3htbC9iYXoueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTxmb286ZG9jdW1lbnQgCi0JCSAgeG1sbnM6Zm9vPSJodHRwOi8vYXBhY2hlLm9yZy9mb28iCi0JCSAgeG1sbnM6YmFyPSJodHRwOi8vYXBhY2hlLm9yZy9iYXIiPgotPGJhcjplbGVtZW50Pk15QmF6PC9iYXI6ZWxlbWVudD4KLTwvZm9vOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJheC94bWwvZm9vLnhtbCBiL3NhbXBsZXMvdHJheC94bWwvZm9vLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1OTdhYi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RyYXgveG1sL2Zvby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3hzbC9mb28ueHNsIj8+Ci08Zm9vOmRvY3VtZW50IAotCQkgIHhtbG5zOmZvbz0iaHR0cDovL2FwYWNoZS5vcmcvZm9vIgotCQkgIHhtbG5zOmJhcj0iaHR0cDovL2FwYWNoZS5vcmcvYmFyIgotCQkgIGZpbGUtbmFtZT0idGVzdCIKLSAgICAgICAgIGZpbGUtcGF0aD0id29yayIKLQkJICBjcmVhdGlvbi1kYXRlPSI5NzEyNTU2OTIwNzgiPgotPGJhcjplbGVtZW50Pk15QmFyPC9iYXI6ZWxlbWVudD4KLTwvZm9vOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJheC94bWwvc3ViZGlyMS9mb28yLnhtbCBiL3NhbXBsZXMvdHJheC94bWwvc3ViZGlyMS9mb28yLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwOGFlNC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RyYXgveG1sL3N1YmRpcjEvZm9vMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPGRvYz50ZXh0IGluIGZvbzIueG1sPC9kb2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmF4L3htbC9zdWJkaXIxL3N1YmRpcjIvZm9vMy54bWwgYi9zYW1wbGVzL3RyYXgveG1sL3N1YmRpcjEvc3ViZGlyMi9mb28zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkYTFmMC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RyYXgveG1sL3N1YmRpcjEvc3ViZGlyMi9mb28zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08ZG9jPnRleHQgaW4gZm9vMy54bWw8L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL3RyYXgveHNsL2Jhei54c2wgYi9zYW1wbGVzL3RyYXgveHNsL2Jhei54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODQzYjMuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90cmF4L3hzbC9iYXoueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IAotICAgICAgeG1sbnM6eHNsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0nIHZlcnNpb249JzEuMCc+Ci0gICAgCi0gIDwhLS0gc2FtZSBhcyBmb28ueHNsIGJ1dCBkb2Vzbid0IGluY2x1ZGUgdGhlIHBhcmFtIGJlY2F1c2Ugb2YgYSBidWcgLS0+ICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPG91dD4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L291dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gICAgICAKLSAgPHhzbDp0ZW1wbGF0ZSAKLSAgICAgIG1hdGNoPSJAKnwqfHRleHQoKXxwcm9jZXNzaW5nLWluc3RydWN0aW9uKCkiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIAotICAgICAgICAgc2VsZWN0PSJAKnwqfHRleHQoKXxwcm9jZXNzaW5nLWluc3RydWN0aW9uKCkiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmF4L3hzbC9mb28ueHNsIGIvc2FtcGxlcy90cmF4L3hzbC9mb28ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTNiOTQ1Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdHJheC94c2wvZm9vLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCAKLSAgICAgIHhtbG5zOnhzbD0naHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJyB2ZXJzaW9uPScxLjAnCi0gICAgICB4bWxuczpiYXI9Imh0dHA6Ly9hcGFjaGUub3JnL2JhciIKLSAgICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJiYXIiPgotICAgICAgCi0gIDx4c2w6aW5jbHVkZSBocmVmPSJpbmMxL2luYzEueHNsIi8+Ci0gICAgICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJhLXBhcmFtIj5kZWZhdWx0IHBhcmFtIHZhbHVlPC94c2w6cGFyYW0+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJiYXI6ZWxlbWVudCI+Ci0gICAgPGJhcj4KLSAgICAgIDxwYXJhbS12YWw+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYS1wYXJhbSIvPjx4c2w6dGV4dD4sIDwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbXktdmFyIi8+Ci0gICAgICA8L3BhcmFtLXZhbD4KLSAgICAgIDxkYXRhPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2RhdGE+Ci0gICAgPC9iYXI+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAgICAgCi0gIDx4c2w6dGVtcGxhdGUgCi0gICAgICBtYXRjaD0iQCp8Knx0ZXh0KCl8cHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAKLSAgICAgICAgIHNlbGVjdD0iQCp8Knx0ZXh0KCl8cHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJheC94c2wvZm9vMi54c2wgYi9zYW1wbGVzL3RyYXgveHNsL2ZvbzIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRmNWYwLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdHJheC94c2wvZm9vMi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4gCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICAgICB4bWxuczpiYXI9Imh0dHA6Ly9hcGFjaGUub3JnL2JhciI+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJiYXIiPgotICAgIDxvdXQ+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotICAgIDwvb3V0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSI+Ci0gIDwveHNsOnRlbXBsYXRlPiAgCi0gCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmF4L3hzbC9mb28zLnhzbCBiL3NhbXBsZXMvdHJheC94c2wvZm9vMy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYmY0MmEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90cmF4L3hzbC9mb28zLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im91dCI+Ci0gICAgPG91dD4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L291dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0KCkiPgotICAgIDxzb21lLXRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L3NvbWUtdGV4dD4KLSAgPC94c2w6dGVtcGxhdGU+ICAKLSAgIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJheC94c2wvaW5jMS9pbmMxLnhzbCBiL3NhbXBsZXMvdHJheC94c2wvaW5jMS9pbmMxLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlYmIyNS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RyYXgveHNsL2luYzEvaW5jMS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCAKLSAgICAgIHhtbG5zOnhzbD0naHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJyB2ZXJzaW9uPScxLjAnPgotICAgICAgCi0gIDx4c2w6aW5jbHVkZSBocmVmPSJpbmMyL2luYzIueHNsIi8+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL3RyYXgveHNsL2luYzEvaW5jMi9pbmMyLnhzbCBiL3NhbXBsZXMvdHJheC94c2wvaW5jMS9pbmMyL2luYzIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjcyOGViLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdHJheC94c2wvaW5jMS9pbmMyL2luYzIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgCi0gICAgICB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybScgdmVyc2lvbj0nMS4wJz4KLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJteS12YXIiIHNlbGVjdD0iJ3RleHQgZnJvbSBteS12YXIgaW4gaW5jMi54c2wnIi8+Ci08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9Db21wb3NlRFRNLmphdmEgYi9zcmMvQ29tcG9zZURUTS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjM3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvQ29tcG9zZURUTS5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKioKKyAqIEEgc2ltcGxlIHRlc3RjYXNlIHVzZWQgdG8gdGVzdCBEVE0KKyAqICAgLSBjb25zdHJ1Y3QgYSBEVE0gZG9jdW1lbnQKKyAqICAgLSBzZXQgRFRNU3RyaW5nUG9vbCBwb2ludGVycworICogICAtIGNyZWF0ZSBlbGVtZW50IGFuZCB0ZXh0IG5vZGVzIHdpdGggZGVmYXVsdCBhcHBlbmQKKyAqICAgLSBkdW1wIHRoZSBjb250ZW50IG9mIHRoZSBEVE0gZG9jdW1lbnQgY3JlYXRlZAorICoKKyAqIFJld3JpdHRlbiB0byBjcmVhdGUgdGhlIGRvY3VtZW50IHZpYSBhIHNpbXVsYXRlZCBTQVgyIHN0cmVhbSByYXRoZXIgdGhhbgorICogdXNpbmcgImludGVybmFsIiBEVE0gaW50ZXJmYWNlcy4KKyAqCisgKjxQPlN0YXR1cyAtIHdvcmsgaW4gcHJvZ3Jlc3M8L3A+CisgKi8KK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uQ3VzdG9tU3RyaW5nUG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1Eb2N1bWVudEltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTVN0cmluZ1Bvb2w7CisKK3B1YmxpYyBjbGFzcyBDb21wb3NlRFRNIHsKKwlEVE1Eb2N1bWVudEltcGwgbmV3RG9jOworCisgICAgICAgIC8vICVSRVZJRVclIEp1c3RpZnkgd2h5IEN1c3RvbVN0cmluZ1Bvb2wgcmF0aGVyIHRoYW4gRFRNU3RyaW5nUG9vbC4KKyAgICAgICAgLy8gKFNlZSAlUkVWSUVXJSBpc3N1ZSBpbiBDdXN0b21TdHJpbmdQb29sJ3MgY29tbWVudHMuKQorCURUTVN0cmluZ1Bvb2wgc3ltYm9sVGFibGUgPSBuZXcgQ3VzdG9tU3RyaW5nUG9vbCgpOworCisJcHVibGljIENvbXBvc2VEVE0oKSB7fTsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKKwkJLy90cnkgeworCQlDb21wb3NlRFRNIGNkdG0gPSBuZXcgQ29tcG9zZURUTSgpOworCQljZHRtLmNvbnN0cnVjdERvYygpOworCisJCWNkdG0ubmV3RG9jLnNldE5zTmFtZVRhYmxlKGNkdG0uc3ltYm9sVGFibGUpOworCQljZHRtLm5ld0RvYy5zZXRMb2NhbE5hbWVUYWJsZShjZHRtLnN5bWJvbFRhYmxlKTsKKwkJY2R0bS5uZXdEb2Muc2V0UHJlZml4TmFtZVRhYmxlKGNkdG0uc3ltYm9sVGFibGUpOworCQljZHRtLmNvbXBvc2VEb2MoKTsKKworCQljZHRtLnRyZWVEdW1wKCk7CisJCS8qfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIkRPTUNvbXBvc2U6OkV4Y2VwdGlvbjogIiArIGUpOworCQl9Ki8KKwl9CisKKwlwdWJsaWMgdm9pZCBwcmludE5vZGUoaW50IG5vZGVIYW5kbGUsIGphdmEuaW8uUHJpbnRXcml0ZXIgcHcpCisJeworCQlwdy5wcmludCgiTm9kZSAiICsgbm9kZUhhbmRsZSArIiApICIpOworCQlpbnQgdHlwZSA9IG5ld0RvYy5nZXROb2RlVHlwZShub2RlSGFuZGxlKTsKKwkJcHcucHJpbnQoIlt0eXBlOiAiKyB0eXBlICsiICgiKTsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBEVE0uQVRUUklCVVRFX05PREU6IHB3LnByaW50KCJBVFRSSUJVVEVfTk9ERSIpOyBicmVhazsKKwkJY2FzZSBEVE0uQ0RBVEFfU0VDVElPTl9OT0RFOiBwdy5wcmludCgiQ0RBVEFfU0VDVElPTl9OT0RFIik7IGJyZWFrOworCQljYXNlIERUTS5DT01NRU5UX05PREU6IHB3LnByaW50KCJDT01NRU5UX05PREUiKTsgYnJlYWs7CisJCWNhc2UgRFRNLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6IHB3LnByaW50KCJET0NVTUVOVF9GUkFHTUVOVF9OT0RFIik7IGJyZWFrOworCQljYXNlIERUTS5ET0NVTUVOVF9OT0RFOiBwdy5wcmludCgiRE9DVU1FTlRfTk9ERSIpOyBicmVhazsKKwkJY2FzZSBEVE0uRE9DVU1FTlRfVFlQRV9OT0RFOiBwdy5wcmludCgiRE9DVU1FTlRfVFlQRV9OT0RFIik7IGJyZWFrOworCQljYXNlIERUTS5FTEVNRU5UX05PREU6IHB3LnByaW50KCJFTEVNRU5UX05PREUiKTsgYnJlYWs7CisJCWNhc2UgRFRNLkVOVElUWV9OT0RFOiBwdy5wcmludCgiRU5USVRZX05PREUiKTsgYnJlYWs7CisJCWNhc2UgRFRNLkVOVElUWV9SRUZFUkVOQ0VfTk9ERTogcHcucHJpbnQoIkVOVElUWV9SRUZFUkVOQ0VfTk9ERSIpOyBicmVhazsKKwkJY2FzZSBEVE0uTk9UQVRJT05fTk9ERTogcHcucHJpbnQoIk5PVEFUSU9OX05PREUiKTsgYnJlYWs7CisJCWNhc2UgRFRNLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTogcHcucHJpbnQoIlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSIpOyBicmVhazsKKwkJY2FzZSBEVE0uVEVYVF9OT0RFOiBwdy5wcmludCgiVEVYVF9OT0RFIik7IGJyZWFrOworCQlkZWZhdWx0OiBwdy5wcmludCgiPz8/Iik7CisJCX0KKwkJcHcucHJpbnQoIildIik7CisJCXB3LnByaW50KCJbbm9kZSBuYW1lOiAiICsgbmV3RG9jLmdldE5vZGVOYW1lKG5vZGVIYW5kbGUpKyJdIik7CisJCXB3LnByaW50KCJbbm9kZSB2YWx1ZTogIiArIG5ld0RvYy5nZXROb2RlVmFsdWUobm9kZUhhbmRsZSkrIl0iKTsKKwkJcHcucHJpbnRsbigiIik7CisJfQorCisJLy8gaW5zdGFudGlhdGUgYSBEVE0gZG9jdW1lbnQKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3REb2MoKSB7CisKKwkJbmV3RG9jID0gbmV3IERUTURvY3VtZW50SW1wbCgwKTsKKworCX0KKworCS8vIGNvbXBvc2UgYSBQdXJjaGFzZU9yZGVyIGRvY3VtZW50CisJcHVibGljIHZvaWQgY29tcG9zZURvYygpIHsKKwkJaW50IHJvb3QsIGgsIGMxLCBjMiwgYzMsIGM0LCBjMV90ZXh0LCBjMl90ZXh0LCBjM190ZXh0LCBjNF90ZXh0OworCQlTdHJpbmcgdGV4dDsKKwkJCisJCXRyeSAKKwkJICB7CisJCSAgICAKKwkJICAgIG5ld0RvYy5zdGFydERvY3VtZW50KCk7CisKKwkJICAgIG5ld0RvYy5zdGFydEVsZW1lbnQobnVsbCwiUHVyY2hhc2VPcmRlckxpc3QiLCJQdXJjaGFzZU9yZGVyTGlzdCIsIG51bGwpOworCQkgICAgLy8gcm9vdC5jcmVhdGVBdHRyaWJ1dGUoInZlcnNpb24iLCAiMS4xIikpOworCisJCSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKworCQkgICAgICBuZXdEb2Muc3RhcnRFbGVtZW50KG51bGwsIlB1cmNoYXNlT3JkZXIiLCJQdXJjaGFzZU9yZGVyIiwgbnVsbCk7CisKKwkJICAgICAgbmV3RG9jLnN0YXJ0RWxlbWVudChudWxsLCJJdGVtIiwiSXRlbSIsIG51bGwpOworCQkgICAgICAvLyBjMS5jcmVhdGVBdHRyaWJ1dGUoKTsKKwkJICAgICAgdGV4dD0iQmFza2V0YmFsbCIgKyAiIC0gIiArIGk7CisJCSAgICAgIG5ld0RvYy5jaGFyYWN0ZXJzKHRleHQudG9DaGFyQXJyYXkoKSwwLHRleHQubGVuZ3RoKCkpOworCQkgICAgICBuZXdEb2MuZW5kRWxlbWVudChudWxsLCAiSXRlbSIsICJJdGVtIik7CisKKwkJICAgICAgbmV3RG9jLnN0YXJ0RWxlbWVudChudWxsLCJEZXNjcmlwdGlvbiIsIkRlc2NyaXB0aW9uIiwgbnVsbCk7CisJCSAgICAgIC8vIGMyLmNyZWF0ZUF0dHJpYnV0ZSgpOworCQkgICAgICB0ZXh0PSJQcm9mZXNzaW9uYWwgTGVhdGhlciBNaWNoYWVsIEpvcmRhbiBTaWduYXR1cmVkIEJhc2tldGJhbGwiOworCQkgICAgICBuZXdEb2MuY2hhcmFjdGVycyh0ZXh0LnRvQ2hhckFycmF5KCksMCx0ZXh0Lmxlbmd0aCgpKTsKKwkJICAgICAgbmV3RG9jLmVuZEVsZW1lbnQobnVsbCwgIkRlc2NyaXB0aW9uIiwgIkRlc2NyaXB0aW9uIik7CisKKwkJICAgICAgbmV3RG9jLnN0YXJ0RWxlbWVudChudWxsLCJVbml0UHJpY2UiLCJVbml0UHJpY2UiLCBudWxsKTsKKwkJICAgICAgdGV4dD0iJDEyLjk5IjsKKwkJICAgICAgbmV3RG9jLmNoYXJhY3RlcnModGV4dC50b0NoYXJBcnJheSgpLDAsdGV4dC5sZW5ndGgoKSk7CisJCSAgICAgIG5ld0RvYy5lbmRFbGVtZW50KG51bGwsICJVbml0UHJpY2UiLCAiVW5pdFByaWNlIik7CisKKwkJICAgICAgbmV3RG9jLnN0YXJ0RWxlbWVudChudWxsLCJRdWFudGl0eSIsIlF1YW50aXR5IiwgbnVsbCk7CisJCSAgICAgIHRleHQ9IjUwIjsKKwkJICAgICAgbmV3RG9jLmNoYXJhY3RlcnModGV4dC50b0NoYXJBcnJheSgpLDAsdGV4dC5sZW5ndGgoKSk7CisJCSAgICAgIG5ld0RvYy5lbmRFbGVtZW50KG51bGwsICJRdWFudGl0eSIsICJRdWFudGl0eSIpOworCisJCSAgICAgIG5ld0RvYy5lbmRFbGVtZW50KG51bGwsICJQdXJjaGFzZU9yZGVyIiwgIlB1cmNoYXNlT3JkZXIiKTsKKwkJICAgIH0KKworCQkgICAgbmV3RG9jLmVuZEVsZW1lbnQobnVsbCwgIlB1cmNoYXNlT3JkZXJMaXN0IiwgIlB1cmNoYXNlT3JkZXJMaXN0Iik7CisKKwkJICAgIG5ld0RvYy5lbmREb2N1bWVudCgpOworCQkgIH0KKwkJY2F0Y2gob3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIGUpCisJCSAgeworCQkgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJICB9CisJfQorCisJLy8gdHJhdmVyc2UgdGhlIFB1cmNoYXNlT3JkZXIgZG9jdW1lbnQgYW5kIHByaW50IG91dCB0aGUgY29udGVudAorCXB1YmxpYyB2b2lkIHRyZWVEdW1wKCkKKwl7CisJCWludCByb290LCBub2RlLCBub2RlX2NoaWxkLCBub2RlX3NpYmxpbmcsIG5vZGVfbmFtZSwgbm9kZV92YWx1ZSwgbm9kZV90eXBlOworIAorCQlqYXZhLmlvLlByaW50V3JpdGVyIHB3cnQgPSBudWxsOworCQl0cnkgeworCQkJamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSgiZHRtVHJlZUR1bXAudHh0Iik7CisJCQlwd3J0ID0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIob3MpOworCisJCQlyb290ID0gbmV3RG9jLmdldERvY3VtZW50Um9vdCgpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmludCBvdXQgdGhlIGRvY3VtZW50IHJvb3QgZWxlbWVudCIpOworCQkJcHJpbnROb2RlKHJvb3QsIHB3cnQpOworCisJCQkvLyByb290IGhhcyBjaGlsZHJlbgorCQkJaWYgKG5ld0RvYy5oYXNDaGlsZE5vZGVzKHJvb3QpKSB7CisJCQkJLy8gdHJhdmVyc2UgdGhyb3VnaCBhbGwgY2hpbGRyZW4gb2YgdGhlIHJvb3QKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByaW50IG91dCBmaXJzdCBnZW5lcmF0aW9uIGNoaWxkcmVuIik7CisJCQkJbm9kZSA9IG5ld0RvYy5nZXRGaXJzdENoaWxkKHJvb3QpOworCQkJCW5vZGVfc2libGluZyA9IG5vZGU7CisJCQkJaW50IGk9IDE7CisJCQkJd2hpbGUgKG5vZGVfc2libGluZyAhPSAtMSkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNoaWxkICIgKyBpICsgIiBpczoiKTsKKwkJCQkJcHJpbnROb2RlKG5vZGVfc2libGluZywgcHdydCk7CisJCQkJCW5vZGVfc2libGluZyA9IG5ld0RvYy5nZXROZXh0U2libGluZyhub2RlX3NpYmxpbmcpOworCQkJCQlpKys7CisJCQkJfQorCQkJCS8vIHRyYXZlcnNlIHRocm91Z2ggYWxsIGRlc2NlbmRhbnQgb2YgdGhlIHJvb3QsIGRvIHRoaXMgbGF0ZXIgYWZ0ZXIgbW9yZSBnZW5lcmF0aW9ucworCQkJCS8vIG9mIGNoaWxkcmVuIGFyZSBhZGRlZCB0byB0aGUgcm9vdAorCQkJfQorCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGlvZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgZHVtcCBEVE0iKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXB3cnQuY2xvc2UoKTsKKwkJfQorCX0KKworfQorCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL0V4dGVuc2lvbkhhbmRsZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2V4dGVuc2lvbnMvRXh0ZW5zaW9uSGFuZGxlci5qYXZhCmluZGV4IDdlNDQ0NjIuLjdjMTEyNDAgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2V4dGVuc2lvbnMvRXh0ZW5zaW9uSGFuZGxlci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2V4dGVuc2lvbnMvRXh0ZW5zaW9uSGFuZGxlci5qYXZhCkBAIC02Nyw2ICs2Nyw3IEBACiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuRWxlbVRlbXBsYXRlRWxlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5RTmFtZTsKIAogLy8gVGVtcD8/CkBAIC0yMTYsNyArMjE3LDYgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiAgICAgICAgICBpZiBwYXJzaW5nIHRyb3VibGUKICAgICovCiAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2Nlc3NFbGVtZW50KAotICAgIFN0cmluZyBsb2NhbFBhcnQsIEVsZW1lbnQgZWxlbWVudCwgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLAotICAgICAgU3R5bGVzaGVldCBzdHlsZXNoZWV0VHJlZSwgTm9kZSBzb3VyY2VUcmVlLCBOb2RlIHNvdXJjZU5vZGUsCi0gICAgICAgIFFOYW1lIG1vZGUsIE9iamVjdCBtZXRob2RLZXkpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisgICAgU3RyaW5nIGxvY2FsUGFydCwgRWxlbVRlbXBsYXRlRWxlbWVudCBlbGVtZW50LCBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsCisgICAgICBTdHlsZXNoZWV0IHN0eWxlc2hlZXRUcmVlLCBPYmplY3QgbWV0aG9kS2V5KSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vZXh0ZW5zaW9ucy9FeHRlbnNpb25IYW5kbGVyR2VuZXJhbC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vZXh0ZW5zaW9ucy9FeHRlbnNpb25IYW5kbGVyR2VuZXJhbC5qYXZhCmluZGV4IDUwZDY5ODAuLjZkYWI4MmEgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2V4dGVuc2lvbnMvRXh0ZW5zaW9uSGFuZGxlckdlbmVyYWwuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL0V4dGVuc2lvbkhhbmRsZXJHZW5lcmFsLmphdmEKQEAgLTYxLDExICs2MSwxMyBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlRyYW5zZm9ybWVySW1wbDsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5TdHlsZXNoZWV0OworaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1UZW1wbGF0ZUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUU5hbWU7CiAKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwpAQCAtMzQ1LDMwICszNDcsMzMgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiAgICAgICAgICBpZiBwYXJzaW5nIHRyb3VibGUKICAgICovCiAgIHB1YmxpYyB2b2lkIHByb2Nlc3NFbGVtZW50KAotICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQsIEVsZW1lbnQgZWxlbWVudCwgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBTdHlsZXNoZWV0IHN0eWxlc2hlZXRUcmVlLCBOb2RlIHNvdXJjZVRyZWUsIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSwgT2JqZWN0IG1ldGhvZEtleSkKKyAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0LCBFbGVtVGVtcGxhdGVFbGVtZW50IGVsZW1lbnQsIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgCisgICAgICAgICAgU3R5bGVzaGVldCBzdHlsZXNoZWV0VHJlZSwgT2JqZWN0IG1ldGhvZEtleSkKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KICAgewogCiAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgWFNMUHJvY2Vzc29yQ29udGV4dCB4cGMgPSBuZXcgWFNMUHJvY2Vzc29yQ29udGV4dCh0cmFuc2Zvcm1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzaGVldFRyZWUsIHNvdXJjZVRyZWUsIHNvdXJjZU5vZGUsIG1vZGUpOworICAgIFhTTFByb2Nlc3NvckNvbnRleHQgeHBjID0gbmV3IFhTTFByb2Nlc3NvckNvbnRleHQodHJhbnNmb3JtZXIsIHN0eWxlc2hlZXRUcmVlKTsKIAotICAgIHRyeQorICAgIC8vICVEVEJEJQorLy8gICAgdHJ5CiAgICAgewogICAgICAgVmVjdG9yIGFyZ3YgPSBuZXcgVmVjdG9yKDIpOwogCiAgICAgICBhcmd2LmFkZEVsZW1lbnQoeHBjKTsKICAgICAgIGFyZ3YuYWRkRWxlbWVudChlbGVtZW50KTsKIAotICAgICAgcmVzdWx0ID0gY2FsbEZ1bmN0aW9uKGxvY2FsUGFydCwgYXJndiwgbWV0aG9kS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpKTsKKyAgICAgIC8vICVEVEJEJSBUaGlzIHdhbnRzIGFuIEV4cHJlc3Npb25Db250ZXh0LgorLy8gICAgICByZXN1bHQgPSBjYWxsRnVuY3Rpb24obG9jYWxQYXJ0LCBhcmd2LCBtZXRob2RLZXksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKSk7CiAgICAgfQotICAgIGNhdGNoIChYUGF0aFByb2Nlc3NvckV4Y2VwdGlvbiBlKQotICAgIHsKLQotICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UgKCk7Ci0gICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgIH0KKyAgICAvLyAlRFRCRCUKKy8vICAgIGNhdGNoIChYUGF0aFByb2Nlc3NvckV4Y2VwdGlvbiBlKQorLy8gICAgeworLy8KKy8vICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UgKCk7CisvLyAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisvLyAgICB9CiAKICAgICBpZiAocmVzdWx0ICE9IG51bGwpCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vZXh0ZW5zaW9ucy9FeHRlbnNpb25IYW5kbGVySmF2YUNsYXNzLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL0V4dGVuc2lvbkhhbmRsZXJKYXZhQ2xhc3MuamF2YQppbmRleCBmMjBiM2E2Li42N2VmZmQzIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL0V4dGVuc2lvbkhhbmRsZXJKYXZhQ2xhc3MuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL0V4dGVuc2lvbkhhbmRsZXJKYXZhQ2xhc3MuamF2YQpAQCAtNjQsMTAgKzY0LDExIEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGw7CiBpbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtVGVtcGxhdGVFbGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlFOYW1lOwogCiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3Q7CkBAIC0zNzksMTIgKzM4MCw5IEBACiAgICAqLwogCiAgIHB1YmxpYyB2b2lkIHByb2Nlc3NFbGVtZW50KFN0cmluZyBsb2NhbFBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbVRlbXBsYXRlRWxlbWVudCBlbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlc2hlZXQgc3R5bGVzaGVldFRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgc291cmNlVHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBzb3VyY2VOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0aG9kS2V5KQogICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KICAgewpAQCAtNDA4LDEwICs0MDYsNyBAQAogICAgIH0KIAogICAgIFhTTFByb2Nlc3NvckNvbnRleHQgeHBjID0gbmV3IFhTTFByb2Nlc3NvckNvbnRleHQodHJhbnNmb3JtZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzaGVldFRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VUcmVlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXNoZWV0VHJlZSk7CiAKICAgICB0cnkKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL0V4dGVuc2lvbkhhbmRsZXJKYXZhUGFja2FnZS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vZXh0ZW5zaW9ucy9FeHRlbnNpb25IYW5kbGVySmF2YVBhY2thZ2UuamF2YQppbmRleCA1MDUwZDRlLi40M2U4ZDEwIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL0V4dGVuc2lvbkhhbmRsZXJKYXZhUGFja2FnZS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2V4dGVuc2lvbnMvRXh0ZW5zaW9uSGFuZGxlckphdmFQYWNrYWdlLmphdmEKQEAgLTY0LDEwICs2NCwxNCBAQAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKKwogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuVHJhbnNmb3JtZXJJbXBsOwogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuRWxlbVRlbXBsYXRlRWxlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5RTmFtZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YT2JqZWN0OwpAQCAtNDExLDEyICs0MTUsOSBAQAogICAgKi8KIAogICBwdWJsaWMgdm9pZCBwcm9jZXNzRWxlbWVudCAoU3RyaW5nIGxvY2FsUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlc2hlZXQgc3R5bGVzaGVldFRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHNvdXJjZVRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHNvdXJjZU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGhvZEtleSkKICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uCiAgIHsKQEAgLTQ1NCwxMCArNDU1LDcgQEAKICAgICB9CiAKICAgICBYU0xQcm9jZXNzb3JDb250ZXh0IHhwYyA9IG5ldyBYU0xQcm9jZXNzb3JDb250ZXh0KHRyYW5zZm9ybWVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlc2hlZXRUcmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlVHJlZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzaGVldFRyZWUpOwogCiAgICAgdHJ5CiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vZXh0ZW5zaW9ucy9FeHRlbnNpb25zVGFibGUuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2V4dGVuc2lvbnMvRXh0ZW5zaW9uc1RhYmxlLmphdmEKaW5kZXggOTUyOTdjZC4uMmE5ZGUyNyAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vZXh0ZW5zaW9ucy9FeHRlbnNpb25zVGFibGUuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL0V4dGVuc2lvbnNUYWJsZS5qYXZhCkBAIC0yMjYsNyArMjI2LDggQEAKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgT2JqZWN0IGV4dEZ1bmN0aW9uKAotICAgICAgICAgIFN0cmluZyBucywgU3RyaW5nIGZ1bmNOYW1lLCBWZWN0b3IgYXJnVmVjLCBPYmplY3QgbWV0aG9kS2V5LCBFeHByZXNzaW9uQ29udGV4dCBleHByQ29udGV4dCkKKyAgICAgICAgICBTdHJpbmcgbnMsIFN0cmluZyBmdW5jTmFtZSwgVmVjdG9yIGFyZ1ZlYywgT2JqZWN0IG1ldGhvZEtleSwgCisgICAgICAgICAgRXhwcmVzc2lvbkNvbnRleHQgZXhwckNvbnRleHQpCiAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2V4dGVuc2lvbnMvTWV0aG9kUmVzb2x2ZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2V4dGVuc2lvbnMvTWV0aG9kUmVzb2x2ZXIuamF2YQppbmRleCBhZTlmYjBiLi5hOTdhNjNkIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL01ldGhvZFJlc29sdmVyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vZXh0ZW5zaW9ucy9NZXRob2RSZXNvbHZlci5qYXZhCkBAIC03MzIsMTYgKzczMiwxOCBAQAogICAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiAoKFhSVHJlZUZyYWcpIHhvYmopLmFzTm9kZUl0ZXJhdG9yKCk7CiAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGphdmFDbGFzcyA9PSBOb2RlTGlzdC5jbGFzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKChYUlRyZWVGcmFnKSB4b2JqKS5jb252ZXJ0VG9Ob2Rlc2V0KCk7Ci0gICAgICAgICAgfQorICAgICAgICAgIC8vICVEVEJEJQorLy8gICAgICAgICAgZWxzZSBpZiAoamF2YUNsYXNzID09IE5vZGVMaXN0LmNsYXNzKQorLy8gICAgICAgICAgeworLy8gICAgICAgICAgICByZXR1cm4gKChYUlRyZWVGcmFnKSB4b2JqKS5jb252ZXJ0VG9Ob2Rlc2V0KCk7CisvLyAgICAgICAgICB9CiAgICAgICAgICAgLy8gU2FtZSBjb21tZW50IGFzIGFib3ZlCiAgICAgICAgICAgLy8gZWxzZSBpZihOb2RlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oamF2YUNsYXNzKSkKLSAgICAgICAgICBlbHNlIGlmKGphdmFDbGFzcyA9PSBOb2RlLmNsYXNzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB4b2JqLnJ0cmVlKCkuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgIH0KKyAgICAgICAgICAvLyAlRFRCRCUKKy8vICAgICAgICAgIGVsc2UgaWYoamF2YUNsYXNzID09IE5vZGUuY2xhc3MpCisvLyAgICAgICAgICB7CisvLyAgICAgICAgICAgIHJldHVybiB4b2JqLnJ0cmVlKCkuZ2V0Rmlyc3RDaGlsZCgpOworLy8gICAgICAgICAgfQogICAgICAgICAgIGVsc2UgaWYoamF2YUNsYXNzID09IGphdmEubGFuZy5TdHJpbmcuY2xhc3MpCiAgICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHhvYmouc3RyKCk7CkBAIC03NTQsMTQgKzc1NiwxNSBAQAogICAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0RG91YmxlVG9OdW1iZXIoeG9iai5udW0oKSwgamF2YUNsYXNzKTsKICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQgPSB4b2JqLnJ0cmVlKCkuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgaWYoamF2YUNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2hpbGQuZ2V0Q2xhc3MoKSkpCi0gICAgICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfQorICAgICAgICAgIC8vICVEVEJEJQorLy8gICAgICAgICAgZWxzZQorLy8gICAgICAgICAgeworLy8gICAgICAgICAgICBOb2RlIGNoaWxkID0geG9iai5ydHJlZSgpLmdldEZpcnN0Q2hpbGQoKTsKKy8vICAgICAgICAgICAgaWYoamF2YUNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2hpbGQuZ2V0Q2xhc3MoKSkpCisvLyAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkOworLy8gICAgICAgICAgICBlbHNlCisvLyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisvLyAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gYnJlYWs7IFVucmVhY2hhYmxlCiAgICAgICAgIApAQCAtNzkwLDggKzc5Myw5IEBACiAgICAgICAgICAgewogICAgICAgICAgICAgLy8gWGFsYW4gZW5zdXJlcyB0aGF0IG5vZGVzZXQoKSBhbHdheXMgcmV0dXJucyBhbgogICAgICAgICAgICAgLy8gaXRlcmF0b3IgcG9zaXRpb25lZCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAgICAgICAgTm9kZUl0ZXJhdG9yIG5pID0geG9iai5ub2Rlc2V0KCk7Ci0gICAgICAgICAgICByZXR1cm4gbmkubmV4dE5vZGUoKTsgLy8gbWF5IGJlIG51bGwuCisgICAgICAgICAgICAvLyAlRFRCRCUKKy8vICAgICAgICAgICAgTm9kZUl0ZXJhdG9yIG5pID0geG9iai5ub2Rlc2V0KCk7CisvLyAgICAgICAgICAgIHJldHVybiBuaS5uZXh0Tm9kZSgpOyAvLyBtYXkgYmUgbnVsbC4KICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZSBpZihqYXZhQ2xhc3MgPT0gamF2YS5sYW5nLlN0cmluZy5jbGFzcykKICAgICAgICAgICB7CkBAIC04MDUsMTQgKzgwOSwxNSBAQAogICAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0RG91YmxlVG9OdW1iZXIoeG9iai5udW0oKSwgamF2YUNsYXNzKTsKICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQgPSB4b2JqLm5vZGVzZXQoKS5uZXh0Tm9kZSgpOwotICAgICAgICAgICAgaWYoamF2YUNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2hpbGQuZ2V0Q2xhc3MoKSkpCi0gICAgICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfQorICAgICAgICAgIC8vICVEVEJEJQorLy8gICAgICAgICAgZWxzZQorLy8gICAgICAgICAgeworLy8gICAgICAgICAgICBOb2RlIGNoaWxkID0geG9iai5ub2Rlc2V0KCkubmV4dE5vZGUoKTsKKy8vICAgICAgICAgICAgaWYoamF2YUNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2hpbGQuZ2V0Q2xhc3MoKSkpCisvLyAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkOworLy8gICAgICAgICAgICBlbHNlCisvLyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisvLyAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gYnJlYWs7IFVucmVhY2hhYmxlCiAgICAgICAgIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vZXh0ZW5zaW9ucy9YU0xQcm9jZXNzb3JDb250ZXh0LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL1hTTFByb2Nlc3NvckNvbnRleHQuamF2YQppbmRleCA5MzM4ZTljLi5iOGRmMTg4IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL1hTTFByb2Nlc3NvckNvbnRleHQuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL1hTTFByb2Nlc3NvckNvbnRleHQuamF2YQpAQCAtNTYsOSArNTYsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuVHJhbnNmb3JtZXJJbXBsOwogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuUmVzdWx0VHJlZUhhbmRsZXI7CkBAIC03NSw2ICs3Nyw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOb2RlU2V0OwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0OwogCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKKwogLy8gaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHNsdC4qOwogCiAvKioKQEAgLTk3LDE1ICsxMDEsMTYgQEAKICAgICogQHBhcmFtIG1vZGUgdGhlIGN1cnJlbnQgbW9kZSBiZWluZyBleGVjdXRlZC4KICAgICovCiAgIHB1YmxpYyBYU0xQcm9jZXNzb3JDb250ZXh0KFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVzaGVldCBzdHlsZXNoZWV0VHJlZSwgTm9kZSBzb3VyY2VUcmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlc2hlZXQgc3R5bGVzaGVldFRyZWUpCiAgIHsKIAogICAgIHRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKICAgICB0aGlzLnN0eWxlc2hlZXRUcmVlID0gc3R5bGVzaGVldFRyZWU7Ci0gICAgdGhpcy5tb2RlID0gbW9kZTsKLSAgICB0aGlzLnNvdXJjZVRyZWUgPSBzb3VyY2VUcmVlOwotICAgIHRoaXMuc291cmNlTm9kZSA9IHNvdXJjZU5vZGU7CisgICAgLy8gJVRCRCUKKyAgICBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dCB4Y3R4dCA9IHRyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpOworICAgIHRoaXMubW9kZSA9IHRyYW5zZm9ybWVyLmdldE1vZGUoKTsKKyAgICB0aGlzLnNvdXJjZU5vZGUgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOworICAgIHRoaXMuc291cmNlVHJlZSA9IHhjdHh0LmdldERUTSh0aGlzLnNvdXJjZU5vZGUpOwogICB9CiAKICAgLyoqIEFuIGluc3RhbmNlIG9mIGEgdHJhbnNmb3JtZXIgICAgICAgICAgKi8KQEAgLTEzNSwyOSArMTQwLDI5IEBACiAgIH0KIAogICAvKiogIFRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZSBiZWluZyBleGVjdXRlZC4gICAgICAgICovCi0gIHByaXZhdGUgTm9kZSBzb3VyY2VUcmVlOworICBwcml2YXRlIG9yZy5hcGFjaGUueG1sLmR0bS5EVE0gc291cmNlVHJlZTsKIAogICAvKioKICAgICogR2V0IHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZSBiZWluZyBleGVjdXRlZC4KICAgICoKICAgICogQHJldHVybiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUgYmVpbmcgZXhlY3V0ZWQuCiAgICAqLwotICBwdWJsaWMgTm9kZSBnZXRTb3VyY2VUcmVlKCkKKyAgcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0U291cmNlVHJlZSgpCiAgIHsKLSAgICByZXR1cm4gc291cmNlVHJlZTsKKyAgICByZXR1cm4gc291cmNlVHJlZS5nZXROb2RlKHNvdXJjZVRyZWUuZ2V0RG9jdW1lbnQoKSk7CiAgIH0KIAogICAvKiogdGhlIGN1cnJlbnQgY29udGV4dCBub2RlLiAgICAgICAgICAqLwotICBwcml2YXRlIE5vZGUgc291cmNlTm9kZTsKKyAgcHJpdmF0ZSBpbnQgc291cmNlTm9kZTsKIAogICAvKioKICAgICogR2V0IHRoZSBjdXJyZW50IGNvbnRleHQgbm9kZS4KICAgICoKICAgICogQHJldHVybiB0aGUgY3VycmVudCBjb250ZXh0IG5vZGUuCiAgICAqLwotICBwdWJsaWMgTm9kZSBnZXRDb250ZXh0Tm9kZSgpCisgIHB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldENvbnRleHROb2RlKCkKICAgewotICAgIHJldHVybiBzb3VyY2VOb2RlOworICAgIHJldHVybiBzb3VyY2VUcmVlLmdldE5vZGUoc291cmNlTm9kZSk7CiAgIH0KIAogICAvKiogdGhlIGN1cnJlbnQgbW9kZSBiZWluZyBleGVjdXRlZC4gICAgICAgICAqLwpAQCAtMjE3LDE4ICsyMjIsMTkgQEAKICAgICAgIHsKICAgICAgICAgdmFsdWUgPSBuZXcgWE51bWJlcigoKERvdWJsZSkgb2JqKS5kb3VibGVWYWx1ZSgpKTsKICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpCi0gICAgICB7Ci0gICAgICAgIHZhbHVlID0gbmV3IFhSVHJlZUZyYWcoKERvY3VtZW50RnJhZ21lbnQpIG9iaik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBOb2RlKQotICAgICAgewotICAgICAgICB2YWx1ZSA9IG5ldyBYTm9kZVNldCgoTm9kZSkgb2JqKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGVJdGVyYXRvcikKLSAgICAgIHsKLSAgICAgICAgdmFsdWUgPSBuZXcgWE5vZGVTZXQoKE5vZGVJdGVyYXRvcikgb2JqKTsKLSAgICAgIH0KKyAgICAgIC8vICVURE0lCisvLyAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpCisvLyAgICAgIHsKKy8vICAgICAgICB2YWx1ZSA9IG5ldyBYUlRyZWVGcmFnKChEb2N1bWVudEZyYWdtZW50KSBvYmopOworLy8gICAgICB9CisvLyAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpCisvLyAgICAgIHsKKy8vICAgICAgICB2YWx1ZSA9IG5ldyBYTm9kZVNldCgoTm9kZSkgb2JqKTsKKy8vICAgICAgfQorLy8gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBOb2RlSXRlcmF0b3IpCisvLyAgICAgIHsKKy8vICAgICAgICB2YWx1ZSA9IG5ldyBYTm9kZVNldCgoTm9kZUl0ZXJhdG9yKSBvYmopOworLy8gICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgIHZhbHVlID0gbmV3IFhTdHJpbmcob2JqLnRvU3RyaW5nKCkpOwpAQCAtMjQ2LDQ1ICsyNTIsNDggQEAKIAogICAgICAgICBydHJlZUhhbmRsZXIuY2hhcmFjdGVycyhzLnRvQ2hhckFycmF5KCksIDAsIHMubGVuZ3RoKCkpOwogICAgICAgICBicmVhazsKKwogICAgICAgY2FzZSBYT2JqZWN0LkNMQVNTX05PREVTRVQgOiAgLy8gU3lzdGVtLm91dC5wcmludGxuKHZhbHVlKTsKLSAgICAgICAgTm9kZUl0ZXJhdG9yIG5sID0gdmFsdWUubm9kZXNldCgpOwotICAgICAgICBOb2RlIHBvczsKKyAgICAgICAgRFRNSXRlcmF0b3IgbmwgPSB2YWx1ZS5ub2Rlc2V0KCk7CisgICAgICAgIAorICAgICAgICBpbnQgcG9zOwogCi0gICAgICAgIHdoaWxlIChudWxsICE9IChwb3MgPSBubC5uZXh0Tm9kZSgpKSkKKyAgICAgICAgd2hpbGUgKERUTS5OVUxMICE9IChwb3MgPSBubC5uZXh0Tm9kZSgpKSkKICAgICAgICAgewotICAgICAgICAgIE5vZGUgdG9wID0gcG9zOworICAgICAgICAgIERUTSBkdG0gPSBubC5nZXREVE0ocG9zKTsKKyAgICAgICAgICBpbnQgdG9wID0gcG9zOwogCi0gICAgICAgICAgd2hpbGUgKG51bGwgIT0gcG9zKQorICAgICAgICAgIHdoaWxlIChEVE0uTlVMTCAhPSBwb3MpCiAgICAgICAgICAgewogICAgICAgICAgICAgcnRyZWVIYW5kbGVyLmZsdXNoUGVuZGluZygpOwogICAgICAgICAgICAgcnRyZWVIYW5kbGVyLmNsb25lVG9SZXN1bHRUcmVlKHBvcywgdHJ1ZSk7CiAKLSAgICAgICAgICAgIE5vZGUgbmV4dE5vZGUgPSBwb3MuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgaW50IG5leHROb2RlID0gZHRtLmdldEZpcnN0Q2hpbGQocG9zKTsKIAotICAgICAgICAgICAgd2hpbGUgKG51bGwgPT0gbmV4dE5vZGUpCisgICAgICAgICAgICB3aGlsZSAoRFRNLk5VTEwgPT0gbmV4dE5vZGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChOb2RlLkVMRU1FTlRfTk9ERSA9PSBwb3MuZ2V0Tm9kZVR5cGUoKSkKKyAgICAgICAgICAgICAgaWYgKERUTS5FTEVNRU5UX05PREUgPT0gZHRtLmdldE5vZGVUeXBlKHBvcykpCiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBydHJlZUhhbmRsZXIuZW5kRWxlbWVudCgiIiwgIiIsIHBvcy5nZXROb2RlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBydHJlZUhhbmRsZXIuZW5kRWxlbWVudCgiIiwgIiIsIGR0bS5nZXROb2RlTmFtZShwb3MpKTsKICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgIGlmICh0b3AgPT0gcG9zKQogICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgIG5leHROb2RlID0gcG9zLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICAgIG5leHROb2RlID0gZHRtLmdldE5leHRTaWJsaW5nKHBvcyk7CiAKLSAgICAgICAgICAgICAgaWYgKG51bGwgPT0gbmV4dE5vZGUpCisgICAgICAgICAgICAgIGlmIChEVE0uTlVMTCA9PSBuZXh0Tm9kZSkKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvcyA9IHBvcy5nZXRQYXJlbnROb2RlKCk7CisgICAgICAgICAgICAgICAgcG9zID0gZHRtLmdldFBhcmVudChwb3MpOwogCiAgICAgICAgICAgICAgICAgaWYgKHRvcCA9PSBwb3MpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IHBvcy5nZXROb2RlVHlwZSgpKQorICAgICAgICAgICAgICAgICAgaWYgKERUTS5FTEVNRU5UX05PREUgPT0gZHRtLmdldE5vZGVUeXBlKHBvcykpCiAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJ0cmVlSGFuZGxlci5lbmRFbGVtZW50KCIiLCAiIiwgcG9zLmdldE5vZGVOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBydHJlZUhhbmRsZXIuZW5kRWxlbWVudCgiIiwgIiIsIGR0bS5nZXROb2RlTmFtZShwb3MpKTsKICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgbmV4dE5vZGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgbmV4dE5vZGUgPSBEVE0uTlVMTDsKIAogICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vbGliL0V4dGVuc2lvbnMuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9FeHRlbnNpb25zLmphdmEKaW5kZXggZmE2YmQwMS4uZGY4NTIzYiAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vbGliL0V4dGVuc2lvbnMuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi9saWIvRXh0ZW5zaW9ucy5qYXZhCkBAIC04OSwyMzQgKzg5LDIzNCBAQAogCiAgIHByaXZhdGUgRXh0ZW5zaW9ucygpIHt9CS8vIE1ha2Ugc3VyZSBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCiAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIGFuIGV4dGVuc2lvbiB0aGF0IGltcGxlbWVudHMgYXMgYSBYYWxhbiBleHRlbnNpb24KLSAgICogdGhlIG5vZGUtc2V0IGZ1bmN0aW9uIGFsc28gZm91bmQgaW4geHQgYW5kIHNheG9uLgotICAgKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBSZXN1bHQgVHJlZSBGcmFnbWVudCwgdGhlbiA8Y29kZT5ub2Rlc2V0PC9jb2RlPgotICAgKiByZXR1cm5zIGEgbm9kZS1zZXQgY29uc2lzdGluZyBvZiBhIHNpbmdsZSByb290IG5vZGUgYXMgZGVzY3JpYmVkIGluCi0gICAqIHNlY3Rpb24gMTEuMSBvZiB0aGUgWFNMVCAxLjAgUmVjb21tZW5kYXRpb24uICBJZiB0aGUgYXJndW1lbnQgaXMgYSAKLSAgICogbm9kZS1zZXQsIDxjb2RlPm5vZGVzZXQ8L2NvZGU+IHJldHVybnMgYSBub2RlLXNldC4gIElmIHRoZSBhcmd1bWVudAotICAgKiBpcyBhIHN0cmluZywgbnVtYmVyLCBvciBib29sZWFuLCB0aGVuIDxjb2RlPm5vZGVzZXQ8L2NvZGU+IHJldHVybnMKLSAgICogYSBub2RlLXNldCBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIHJvb3Qgbm9kZSB3aXRoIGEgc2luZ2xlIHRleHQgbm9kZQotICAgKiBjaGlsZCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgWFBhdGggc3RyaW5nKCkgZnVuY3Rpb24gb24gdGhlIAotICAgKiBwYXNzZWQgcGFyYW1ldGVyLiAgSWYgdGhlIGFyZ3VtZW50IGlzIGFueXRoaW5nIGVsc2UsIHRoZW4gYSBub2RlLXNldAotICAgKiBpcyByZXR1cm5lZCBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIHJvb3Qgbm9kZSB3aXRoIGEgc2luZ2xlIHRleHQgbm9kZQotICAgKiBjaGlsZCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgamF2YSA8Y29kZT50b1N0cmluZygpPC9jb2RlPgotICAgKiBtZXRob2Qgb24gdGhlIHBhc3NlZCBhcmd1bWVudC4KLSAgICogTW9zdCBvZiB0aGUKLSAgICogYWN0dWFsIHdvcmsgaGVyZSBpcyBkb25lIGluIDxjb2RlPk1ldGhvZFJlc29sdmVyPC9jb2RlPiBhbmQKLSAgICogPGNvZGU+WFJUcmVlRnJhZzwvY29kZT4uCi0gICAqIEBwYXJhbSBteVByb2Nlc3NvciBDb250ZXh0IHBhc3NlZCBieSB0aGUgZXh0ZW5zaW9uIHByb2Nlc3NvcgotICAgKiBAcGFyYW0gcnRmIEFyZ3VtZW50IGluIHRoZSBzdHlsZXNoZWV0IHRvIHRoZSBub2Rlc2V0IGV4dGVuc2lvbiBmdW5jdGlvbgotICAgKi8KLQotICBwdWJsaWMgc3RhdGljIE5vZGVTZXQgbm9kZXNldChFeHByZXNzaW9uQ29udGV4dCBteVByb2Nlc3NvciwgT2JqZWN0IHJ0ZikgewotCi0gICAgU3RyaW5nIHRleHROb2RlVmFsdWU7Ci0KLSAgICBpZiAocnRmIGluc3RhbmNlb2YgTm9kZUl0ZXJhdG9yKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgTm9kZVNldCgoTm9kZUl0ZXJhdG9yKSBydGYpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKHJ0ZiBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgdGV4dE5vZGVWYWx1ZSA9IChTdHJpbmcpIHJ0ZjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJ0ZiBpbnN0YW5jZW9mIEJvb2xlYW4pCi0gICAgICB7Ci0gICAgICAgIHRleHROb2RlVmFsdWUgPSBuZXcgWEJvb2xlYW4oKChCb29sZWFuKSBydGYpLmJvb2xlYW5WYWx1ZSgpKS5zdHIoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJ0ZiBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgIHsKLSAgICAgICAgdGV4dE5vZGVWYWx1ZSA9IG5ldyBYTnVtYmVyKCgoRG91YmxlKSBydGYpLmRvdWJsZVZhbHVlKCkpLnN0cigpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0ZXh0Tm9kZVZhbHVlID0gcnRmLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBEb2N1bWVudCBteURvYyA9IG15UHJvY2Vzc29yLmdldENvbnRleHROb2RlKCkuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgVGV4dCB0ZXh0Tm9kZSA9IG15RG9jLmNyZWF0ZVRleHROb2RlKHRleHROb2RlVmFsdWUpOwotICAgICAgRG9jdW1lbnRGcmFnbWVudCBkb2NGcmFnID0gbXlEb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwotICAgICAgZG9jRnJhZy5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICByZXR1cm4gbmV3IE5vZGVTZXQoZG9jRnJhZyk7Ci0gICAgfQotICB9Ci0gIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBvZiB0d28gbm9kZS1zZXRzLgotCSAqIEBwYXJhbSBuMSBOb2RlSXRlcmF0b3IgZm9yIGZpcnN0IG5vZGUtc2V0Ci0JICogQHBhcmFtIG5pMiBOb2RlSXRlcmF0b3IgZm9yIHNlY29uZCBub2RlLXNldAotCSAqIEByZXR1cm4gYSBOb2RlU2V0IGNvbnRhaW5pbmcgdGhlIG5vZGVzIGluIG5pMSB0aGF0IGFyZSBhbHNvCi0JICogaW4gbmkyCi0JICovCQotCXB1YmxpYyBzdGF0aWMgTm9kZVNldCBpbnRlcnNlY3Rpb24oTm9kZUl0ZXJhdG9yIG5pMSwgTm9kZUl0ZXJhdG9yIG5pMikKLQkJCXRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCi0JewotCQlOb2RlU2V0IG5zMSA9IG5ldyBOb2RlU2V0KG5pMSk7Ci0JCU5vZGVTZXQgbnMyID0gbmV3IE5vZGVTZXQobmkyKTsKLQkJTm9kZVNldCBpbnRlcj0gbmV3IE5vZGVTZXQoKTsKLQkJaW50ZXIuc2V0U2hvdWxkQ2FjaGVOb2Rlcyh0cnVlKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgbnMxLmdldExlbmd0aCgpOyBpKyspCi0JCXsKLQkJCU5vZGUgbiA9IG5zMS5lbGVtZW50QXQoaSk7Ci0JCQlpZihuczIuY29udGFpbnMobikpCi0JCQkJaW50ZXIuYWRkRWxlbWVudChuKTsKLQkJfQotCQlyZXR1cm4gaW50ZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gbm9kZS1zZXRzLgotCSAqIEBwYXJhbSBuMSBOb2RlSXRlcmF0b3IgZm9yIGZpcnN0IG5vZGUtc2V0Ci0JICogQHBhcmFtIG5pMiBOb2RlSXRlcmF0b3IgZm9yIHNlY29uZCBub2RlLXNldAotCSAqIEByZXR1cm4gYSBOb2RlU2V0IGNvbnRhaW5pbmcgdGhlIG5vZGVzIGluIG5pMSB0aGF0IGFyZSBub3QKLQkgKiBpbiBuaTIKLQkgKi8JCi0JcHVibGljIHN0YXRpYyBOb2RlU2V0IGRpZmZlcmVuY2UoTm9kZUl0ZXJhdG9yIG5pMSwgTm9kZUl0ZXJhdG9yIG5pMikKLQkJCXRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCQotCXsKLQkJTm9kZVNldCBuczEgPSBuZXcgTm9kZVNldChuaTEpOwotCQlOb2RlU2V0IG5zMiA9IG5ldyBOb2RlU2V0KG5pMik7Ci0JCS8vIE5vZGVTZXQgaW50ZXI9IG5ldyBOb2RlU2V0KCk7Ci0JCU5vZGVTZXQgZGlmZiA9IG5ldyBOb2RlU2V0KCk7Ci0JCWRpZmYuc2V0U2hvdWxkQ2FjaGVOb2Rlcyh0cnVlKTsJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5zMS5nZXRMZW5ndGgoKTsgaSsrKQotCQl7Ci0JCQlOb2RlIG4gPSBuczEuZWxlbWVudEF0KGkpOwotCQkJaWYoIW5zMi5jb250YWlucyhuKSkKLQkJCQlkaWZmLmFkZEVsZW1lbnQobik7Ci0JCX0KLQkJcmV0dXJuIGRpZmY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBub2RlLXNldCBjb250YWluaW5nIGRpc3RpbmN0IHN0cmluZyB2YWx1ZXMuCi0JICogQHBhcmFtIG5pIE5vZGVJdGVyYXRvciBmb3Igbm9kZS1zZXQKLQkgKiBAcmV0dXJuIGEgTm9kZVNldCB3aXRoIG5vZGVzIGZyb20gbmkgY29udGFpbmluZyBkaXN0aW5jdCBzdHJpbmcgdmFsdWVzLiAKLQkgKiBJbiBvdGhlciB3b3JkcywgaWYgbW9yZSB0aGFuIG9uZSBub2RlIGluIG5pIGNvbnRhaW5zIHRoZSBzYW1lIHN0cmluZyB2YWx1ZSwgCi0JICogb25seSBpbmNsdWRlIHRoZSBmaXJzdCBzdWNoIG5vZGUgZm91bmQuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgTm9kZVNldCBkaXN0aW5jdChOb2RlSXRlcmF0b3IgbmkpCi0JCQl0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgkKLQl7Ci0JCU5vZGVTZXQgbnMgPSBuZXcgTm9kZVNldChuaSk7Ci0JCU5vZGVTZXQgZGlzdCA9IG5ldyBOb2RlU2V0KCk7Ci0JCWRpc3Quc2V0U2hvdWxkQ2FjaGVOb2Rlcyh0cnVlKTsJCQotCQlIYXNodGFibGUgc3RyaW5nVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnMuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJewotCQkJTm9kZSBuID0gbnMuZWxlbWVudEF0KGkpOwotICAgICAgU3RyaW5nIGtleSA9IERPTUhlbHBlci5nZXROb2RlRGF0YShuKTsKLSAgICAgIGlmICghc3RyaW5nVGFibGUuY29udGFpbnNLZXkoa2V5KSkKLQkJCXsKLSAgICAgICAgc3RyaW5nVGFibGUucHV0KGtleSwgbik7Ci0gICAgICAgIGRpc3QuYWRkRWxlbWVudChuKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgb2YgYm90aCBub2RlLXNldHMgY29udGFpbiB0aGUgc2FtZSBzZXQgb2Ygbm9kZXMuCi0JICogQHBhcmFtIG4xIE5vZGVJdGVyYXRvciBmb3IgZmlyc3Qgbm9kZS1zZXQKLQkgKiBAcGFyYW0gbmkyIE5vZGVJdGVyYXRvciBmb3Igc2Vjb25kIG5vZGUtc2V0Ci0JICogQHJldHVybiB0cnVlIGlmIG5pMSBhbmQgbmkyIGNvbnRhaW4gZXhhY3RseSB0aGUgc2FtZSBzZXQgb2Ygbm9kZXMuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNTYW1lTm9kZXMoTm9kZUl0ZXJhdG9yIG5pMSwgTm9kZUl0ZXJhdG9yIG5pMikKLQl7Ci0JCU5vZGVTZXQgbnMxID0gbmV3IE5vZGVTZXQobmkxKTsKLQkJTm9kZVNldCBuczIgPSBuZXcgTm9kZVNldChuaTIpOwkJCi0JCWlmIChuczEuZ2V0TGVuZ3RoKCkgIT0gbnMyLmdldExlbmd0aCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5zMS5nZXRMZW5ndGgoKTsgaSsrKQotCQl7Ci0JCQlOb2RlIG4gPSBuczEuZWxlbWVudEF0KGkpOwotCQkJaWYoIW5zMi5jb250YWlucyhuKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfSAgCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgYXJndW1lbnQgYXMgYSBzdHJpbmcgY29udGFpbmluZwotICAgKiBhbiBYUGF0aCBleHByZXNzaW9uLiAgVXNlZCB3aGVyZSB0aGUgWFBhdGggZXhwcmVzc2lvbiBpcyBub3Qga25vd24gdW50aWwKLSAgICogcnVuLXRpbWUuICBUaGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXMgaWYgdGhlIHJ1bi10aW1lIHZhbHVlIG9mIHRoZQotICAgKiBhcmd1bWVudCBhcHBlYXJlZCBpbiBwbGFjZSBvZiB0aGUgZXZhbHVhdGUgZnVuY3Rpb24gY2FsbCBhdCBjb21waWxlIHRpbWUuCi0JICogQHBhcmFtIG15Q29udGV4dCBhbiA8Y29kZT5FeHByZXNzaW9uQ29udGV4dDwvY29kZT4gcGFzc2VkIGluIGJ5IHRoZQotICAgKiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBtZWNoYW5pc20uICBUaGlzIG11c3QgYmUgYW4gWFBhdGhDb250ZXh0LgotCSAqIEBwYXJhbSB4cGF0aEV4dHIgVGhlIFhQYXRoIGV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkLgotCSAqIEByZXR1cm4gdGhlIFhPYmplY3QgcmVzdWx0aW5nIGZyb20gZXZhbHVhdGluZyB0aGUgWFBhdGgKLQkgKi8JCi0JcHVibGljIHN0YXRpYyBYT2JqZWN0IGV2YWx1YXRlKEV4cHJlc3Npb25Db250ZXh0IG15Q29udGV4dCwgU3RyaW5nIHhwYXRoRXhwcikKLSAgICAgICAgICAgICAgICAgIHRocm93cyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIEV4Y2VwdGlvbgotCXsKLSAgICBpZiAobXlDb250ZXh0IGluc3RhbmNlb2YgWFBhdGhDb250ZXh0KQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBYUGF0aENvbnRleHQgeGN0eHQgPSAoWFBhdGhDb250ZXh0KSBteUNvbnRleHQ7Ci0gICAgICAgIFhQYXRoIGR5bmFtaWNYUGF0aCA9IG5ldyBYUGF0aCh4cGF0aEV4cHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGN0eHQuZ2V0U0FYTG9jYXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjdHh0LmdldE5hbWVzcGFjZUNvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUGF0aC5TRUxFQ1QpOwotICAgICAgICByZXR1cm4gZHluYW1pY1hQYXRoLmV4ZWN1dGUoeGN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUNvbnRleHQuZ2V0Q29udGV4dE5vZGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjdHh0LmdldE5hbWVzcGFjZUNvbnRleHQoKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHRocm93IG5ldyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIkludmFsaWQgY29udGV4dCBwYXNzZWQgdG8gZXZhbHVhdGUgIiArIG15Q29udGV4dCk7Ci0JfSAgCi0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTm9kZVNldCBjb250YWluaW5nIG9uZSB0ZXh0IG5vZGUgZm9yIGVhY2ggdG9rZW4gaW4gdGhlIGZpcnN0IGFyZ3VtZW50LgotICAgKiBEZWxpbWl0ZXJzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHNlY29uZCBhcmd1bWVudC4KLSAgICogVG9rZW5zIGFyZSBkZXRlcm1pbmVkIGJ5IGEgY2FsbCB0byA8Y29kZT5TdHJpbmdUb2tlbml6ZXI8L2NvZGU+LgotICAgKiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gZW1wdHkgc3RyaW5nIG9yIGNvbnRhaW5zIG9ubHkgZGVsaW1pdGVycywgdGhlIHJlc3VsdAotICAgKiB3aWxsIGJlIGFuIGVtcHR5IE5vZGVTZXQuCi0gICAqIENvbnRyaWJ1dGVkIHRvIFhhbGFuSjEgYnkgPGEgaHJlZj0ibWFpbHRvOmJlbm9pdC5jZXJyaW5hQHdyaXRlbWUuY29tIj5CZW5vaXQgQ2VycmluYTwvYT4uICAKLQkgKiBAcGFyYW0gbXlDb250ZXh0IGFuIDxjb2RlPkV4cHJlc3Npb25Db250ZXh0PC9jb2RlPiBwYXNzZWQgaW4gYnkgdGhlCi0gICAqICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIG1lY2hhbmlzbS4gIFRoaXMgbXVzdCBiZSBhbiBYUGF0aENvbnRleHQuCi0JICogQHBhcmFtIHRvVG9rZW5pemUgVGhlIHN0cmluZyB0byBiZSBzcGxpdCBpbnRvIHRleHQgdG9rZW5zLgotICAgKiBAcGFyYW0gZGVsaW1zIFRoZSBkZWxpbWl0ZXJzIHRvIHVzZS4KLQkgKiBAcmV0dXJuIGEgTm9kZVNldCBhcyBkZXNjcmliZWQgYWJvdmUuCi0gICAqCi0JICovCQotCXB1YmxpYyBzdGF0aWMgTm9kZVNldCB0b2tlbml6ZShFeHByZXNzaW9uQ29udGV4dCBteUNvbnRleHQsIFN0cmluZyB0b1Rva2VuaXplLCBTdHJpbmcgZGVsaW1zKQotCXsKLSAgICBEb2N1bWVudCBsRG9jID0gbXlDb250ZXh0LmdldENvbnRleHROb2RlKCkuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIFN0cmluZ1Rva2VuaXplciBsVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0b1Rva2VuaXplLCBkZWxpbXMpOwotICAgIE5vZGVTZXQgcmVzdWx0U2V0ID0gbmV3IE5vZGVTZXQoKTsKLSAgICB3aGlsZSAobFRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgcmVzdWx0U2V0LmFkZE5vZGUobERvYy5jcmVhdGVUZXh0Tm9kZShsVG9rZW5pemVyLm5leHRUb2tlbigpKSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHRTZXQ7Ci19ICAKLQotCS8qKgotCSAqIFJldHVybnMgYSBOb2RlU2V0IGNvbnRhaW5pbmcgb25lIHRleHQgbm9kZSBmb3IgZWFjaCB0b2tlbiBpbiB0aGUgZmlyc3QgYXJndW1lbnQuCi0gICAqIERlbGltaXRlcnMgYXJlIHdoaXRlc3BhY2UuICBUaGF0IGlzLCB0aGUgZGVsaW1pdGVycyB0aGF0IGFyZSB1c2VkIGFyZSB0YWIgKCYjeDA5KSwKLSAgICogbGluZWZlZWQgKCYjeDBBKSwgcmV0dXJuICgmI3gwRCksIGFuZCBzcGFjZSAoJiN4MjApLgotICAgKiBUb2tlbnMgYXJlIGRldGVybWluZWQgYnkgYSBjYWxsIHRvIDxjb2RlPlN0cmluZ1Rva2VuaXplcjwvY29kZT4uCi0gICAqIElmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbiBlbXB0eSBzdHJpbmcgb3IgY29udGFpbnMgb25seSBkZWxpbWl0ZXJzLCB0aGUgcmVzdWx0Ci0gICAqIHdpbGwgYmUgYW4gZW1wdHkgTm9kZVNldC4KLSAgICogQ29udHJpYnV0ZWQgdG8gWGFsYW5KMSBieSA8YSBocmVmPSJtYWlsdG86YmVub2l0LmNlcnJpbmFAd3JpdGVtZS5jb20iPkJlbm9pdCBDZXJyaW5hPC9hPi4gIAotCSAqIEBwYXJhbSBteUNvbnRleHQgYW4gPGNvZGU+RXhwcmVzc2lvbkNvbnRleHQ8L2NvZGU+IHBhc3NlZCBpbiBieSB0aGUKLSAgICogICAgICAgICAgICAgICAgICBleHRlbnNpb24gbWVjaGFuaXNtLiAgVGhpcyBtdXN0IGJlIGFuIFhQYXRoQ29udGV4dC4KLQkgKiBAcGFyYW0gdG9Ub2tlbml6ZSBUaGUgc3RyaW5nIHRvIGJlIHNwbGl0IGludG8gdGV4dCB0b2tlbnMuCi0JICogQHJldHVybiBhIE5vZGVTZXQgYXMgZGVzY3JpYmVkIGFib3ZlLgotICAgKgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIE5vZGVTZXQgdG9rZW5pemUoRXhwcmVzc2lvbkNvbnRleHQgbXlDb250ZXh0LCBTdHJpbmcgdG9Ub2tlbml6ZSkKLQl7Ci0gICAgcmV0dXJuIHRva2VuaXplKG15Q29udGV4dCwgdG9Ub2tlbml6ZSwgIiBcdFxuXHIiKTsKLSAgfSAgCisvLyAgLyoqCisvLyAgICogVGhpcyBtZXRob2QgaXMgYW4gZXh0ZW5zaW9uIHRoYXQgaW1wbGVtZW50cyBhcyBhIFhhbGFuIGV4dGVuc2lvbgorLy8gICAqIHRoZSBub2RlLXNldCBmdW5jdGlvbiBhbHNvIGZvdW5kIGluIHh0IGFuZCBzYXhvbi4KKy8vICAgKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBSZXN1bHQgVHJlZSBGcmFnbWVudCwgdGhlbiA8Y29kZT5ub2Rlc2V0PC9jb2RlPgorLy8gICAqIHJldHVybnMgYSBub2RlLXNldCBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIHJvb3Qgbm9kZSBhcyBkZXNjcmliZWQgaW4KKy8vICAgKiBzZWN0aW9uIDExLjEgb2YgdGhlIFhTTFQgMS4wIFJlY29tbWVuZGF0aW9uLiAgSWYgdGhlIGFyZ3VtZW50IGlzIGEgCisvLyAgICogbm9kZS1zZXQsIDxjb2RlPm5vZGVzZXQ8L2NvZGU+IHJldHVybnMgYSBub2RlLXNldC4gIElmIHRoZSBhcmd1bWVudAorLy8gICAqIGlzIGEgc3RyaW5nLCBudW1iZXIsIG9yIGJvb2xlYW4sIHRoZW4gPGNvZGU+bm9kZXNldDwvY29kZT4gcmV0dXJucworLy8gICAqIGEgbm9kZS1zZXQgY29uc2lzdGluZyBvZiBhIHNpbmdsZSByb290IG5vZGUgd2l0aCBhIHNpbmdsZSB0ZXh0IG5vZGUKKy8vICAgKiBjaGlsZCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgWFBhdGggc3RyaW5nKCkgZnVuY3Rpb24gb24gdGhlIAorLy8gICAqIHBhc3NlZCBwYXJhbWV0ZXIuICBJZiB0aGUgYXJndW1lbnQgaXMgYW55dGhpbmcgZWxzZSwgdGhlbiBhIG5vZGUtc2V0CisvLyAgICogaXMgcmV0dXJuZWQgY29uc2lzdGluZyBvZiBhIHNpbmdsZSByb290IG5vZGUgd2l0aCBhIHNpbmdsZSB0ZXh0IG5vZGUKKy8vICAgKiBjaGlsZCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgamF2YSA8Y29kZT50b1N0cmluZygpPC9jb2RlPgorLy8gICAqIG1ldGhvZCBvbiB0aGUgcGFzc2VkIGFyZ3VtZW50LgorLy8gICAqIE1vc3Qgb2YgdGhlCisvLyAgICogYWN0dWFsIHdvcmsgaGVyZSBpcyBkb25lIGluIDxjb2RlPk1ldGhvZFJlc29sdmVyPC9jb2RlPiBhbmQKKy8vICAgKiA8Y29kZT5YUlRyZWVGcmFnPC9jb2RlPi4KKy8vICAgKiBAcGFyYW0gbXlQcm9jZXNzb3IgQ29udGV4dCBwYXNzZWQgYnkgdGhlIGV4dGVuc2lvbiBwcm9jZXNzb3IKKy8vICAgKiBAcGFyYW0gcnRmIEFyZ3VtZW50IGluIHRoZSBzdHlsZXNoZWV0IHRvIHRoZSBub2Rlc2V0IGV4dGVuc2lvbiBmdW5jdGlvbgorLy8gICAqLworLy8KKy8vICBwdWJsaWMgc3RhdGljIE5vZGVTZXQgbm9kZXNldChFeHByZXNzaW9uQ29udGV4dCBteVByb2Nlc3NvciwgT2JqZWN0IHJ0ZikgeworLy8KKy8vICAgIFN0cmluZyB0ZXh0Tm9kZVZhbHVlOworLy8KKy8vICAgIGlmIChydGYgaW5zdGFuY2VvZiBOb2RlSXRlcmF0b3IpCisvLyAgICB7CisvLyAgICAgIHJldHVybiBuZXcgTm9kZVNldCgoTm9kZUl0ZXJhdG9yKSBydGYpOworLy8gICAgfQorLy8gICAgZWxzZQorLy8gICAgeworLy8gICAgICBpZiAocnRmIGluc3RhbmNlb2YgU3RyaW5nKQorLy8gICAgICB7CisvLyAgICAgICAgdGV4dE5vZGVWYWx1ZSA9IChTdHJpbmcpIHJ0ZjsKKy8vICAgICAgfQorLy8gICAgICBlbHNlIGlmIChydGYgaW5zdGFuY2VvZiBCb29sZWFuKQorLy8gICAgICB7CisvLyAgICAgICAgdGV4dE5vZGVWYWx1ZSA9IG5ldyBYQm9vbGVhbigoKEJvb2xlYW4pIHJ0ZikuYm9vbGVhblZhbHVlKCkpLnN0cigpOworLy8gICAgICB9CisvLyAgICAgIGVsc2UgaWYgKHJ0ZiBpbnN0YW5jZW9mIERvdWJsZSkKKy8vICAgICAgeworLy8gICAgICAgIHRleHROb2RlVmFsdWUgPSBuZXcgWE51bWJlcigoKERvdWJsZSkgcnRmKS5kb3VibGVWYWx1ZSgpKS5zdHIoKTsKKy8vICAgICAgfQorLy8gICAgICBlbHNlCisvLyAgICAgIHsKKy8vICAgICAgICB0ZXh0Tm9kZVZhbHVlID0gcnRmLnRvU3RyaW5nKCk7CisvLyAgICAgIH0KKy8vICAgICAgRG9jdW1lbnQgbXlEb2MgPSBteVByb2Nlc3Nvci5nZXRDb250ZXh0Tm9kZSgpLmdldE93bmVyRG9jdW1lbnQoKTsKKy8vICAgICAgVGV4dCB0ZXh0Tm9kZSA9IG15RG9jLmNyZWF0ZVRleHROb2RlKHRleHROb2RlVmFsdWUpOworLy8gICAgICBEb2N1bWVudEZyYWdtZW50IGRvY0ZyYWcgPSBteURvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisvLyAgICAgIGRvY0ZyYWcuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOworLy8gICAgICByZXR1cm4gbmV3IE5vZGVTZXQoZG9jRnJhZyk7CisvLyAgICB9CisvLyAgfQorLy8gIAorLy8JLyoqCisvLwkgKiBSZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIG5vZGUtc2V0cy4KKy8vCSAqIEBwYXJhbSBuMSBOb2RlSXRlcmF0b3IgZm9yIGZpcnN0IG5vZGUtc2V0CisvLwkgKiBAcGFyYW0gbmkyIE5vZGVJdGVyYXRvciBmb3Igc2Vjb25kIG5vZGUtc2V0CisvLwkgKiBAcmV0dXJuIGEgTm9kZVNldCBjb250YWluaW5nIHRoZSBub2RlcyBpbiBuaTEgdGhhdCBhcmUgYWxzbworLy8JICogaW4gbmkyCisvLwkgKi8JCisvLwlwdWJsaWMgc3RhdGljIE5vZGVTZXQgaW50ZXJzZWN0aW9uKE5vZGVJdGVyYXRvciBuaTEsIE5vZGVJdGVyYXRvciBuaTIpCisvLwkJCXRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCisvLwl7CisvLwkJTm9kZVNldCBuczEgPSBuZXcgTm9kZVNldChuaTEpOworLy8JCU5vZGVTZXQgbnMyID0gbmV3IE5vZGVTZXQobmkyKTsKKy8vCQlOb2RlU2V0IGludGVyPSBuZXcgTm9kZVNldCgpOworLy8JCWludGVyLnNldFNob3VsZENhY2hlTm9kZXModHJ1ZSk7CisvLwkJZm9yIChpbnQgaT0wOyBpIDwgbnMxLmdldExlbmd0aCgpOyBpKyspCisvLwkJeworLy8JCQlOb2RlIG4gPSBuczEuZWxlbWVudEF0KGkpOworLy8JCQlpZihuczIuY29udGFpbnMobikpCisvLwkJCQlpbnRlci5hZGRFbGVtZW50KG4pOworLy8JCX0KKy8vCQlyZXR1cm4gaW50ZXI7CisvLwl9CisvLwkKKy8vCS8qKgorLy8JICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBub2RlLXNldHMuCisvLwkgKiBAcGFyYW0gbjEgTm9kZUl0ZXJhdG9yIGZvciBmaXJzdCBub2RlLXNldAorLy8JICogQHBhcmFtIG5pMiBOb2RlSXRlcmF0b3IgZm9yIHNlY29uZCBub2RlLXNldAorLy8JICogQHJldHVybiBhIE5vZGVTZXQgY29udGFpbmluZyB0aGUgbm9kZXMgaW4gbmkxIHRoYXQgYXJlIG5vdAorLy8JICogaW4gbmkyCisvLwkgKi8JCisvLwlwdWJsaWMgc3RhdGljIE5vZGVTZXQgZGlmZmVyZW5jZShOb2RlSXRlcmF0b3IgbmkxLCBOb2RlSXRlcmF0b3IgbmkyKQorLy8JCQl0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgkKKy8vCXsKKy8vCQlOb2RlU2V0IG5zMSA9IG5ldyBOb2RlU2V0KG5pMSk7CisvLwkJTm9kZVNldCBuczIgPSBuZXcgTm9kZVNldChuaTIpOworLy8JCS8vIE5vZGVTZXQgaW50ZXI9IG5ldyBOb2RlU2V0KCk7CisvLwkJTm9kZVNldCBkaWZmID0gbmV3IE5vZGVTZXQoKTsKKy8vCQlkaWZmLnNldFNob3VsZENhY2hlTm9kZXModHJ1ZSk7CQkKKy8vCQlmb3IgKGludCBpID0gMDsgaSA8IG5zMS5nZXRMZW5ndGgoKTsgaSsrKQorLy8JCXsKKy8vCQkJTm9kZSBuID0gbnMxLmVsZW1lbnRBdChpKTsKKy8vCQkJaWYoIW5zMi5jb250YWlucyhuKSkKKy8vCQkJCWRpZmYuYWRkRWxlbWVudChuKTsKKy8vCQl9CisvLwkJcmV0dXJuIGRpZmY7CisvLwl9CisvLworLy8JLyoqCisvLwkgKiBSZXR1cm5zIG5vZGUtc2V0IGNvbnRhaW5pbmcgZGlzdGluY3Qgc3RyaW5nIHZhbHVlcy4KKy8vCSAqIEBwYXJhbSBuaSBOb2RlSXRlcmF0b3IgZm9yIG5vZGUtc2V0CisvLwkgKiBAcmV0dXJuIGEgTm9kZVNldCB3aXRoIG5vZGVzIGZyb20gbmkgY29udGFpbmluZyBkaXN0aW5jdCBzdHJpbmcgdmFsdWVzLiAKKy8vCSAqIEluIG90aGVyIHdvcmRzLCBpZiBtb3JlIHRoYW4gb25lIG5vZGUgaW4gbmkgY29udGFpbnMgdGhlIHNhbWUgc3RyaW5nIHZhbHVlLCAKKy8vCSAqIG9ubHkgaW5jbHVkZSB0aGUgZmlyc3Qgc3VjaCBub2RlIGZvdW5kLgorLy8JICovCQorLy8JcHVibGljIHN0YXRpYyBOb2RlU2V0IGRpc3RpbmN0KE5vZGVJdGVyYXRvciBuaSkKKy8vCQkJdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24JCisvLwl7CisvLwkJTm9kZVNldCBucyA9IG5ldyBOb2RlU2V0KG5pKTsKKy8vCQlOb2RlU2V0IGRpc3QgPSBuZXcgTm9kZVNldCgpOworLy8JCWRpc3Quc2V0U2hvdWxkQ2FjaGVOb2Rlcyh0cnVlKTsJCQorLy8JCUhhc2h0YWJsZSBzdHJpbmdUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKKy8vCQlmb3IgKGludCBpID0gMDsgaSA8IG5zLmdldExlbmd0aCgpOyBpKyspCisvLwkJeworLy8JCQlOb2RlIG4gPSBucy5lbGVtZW50QXQoaSk7CisvLyAgICAgIFN0cmluZyBrZXkgPSBET01IZWxwZXIuZ2V0Tm9kZURhdGEobik7CisvLyAgICAgIGlmICghc3RyaW5nVGFibGUuY29udGFpbnNLZXkoa2V5KSkKKy8vCQkJeworLy8gICAgICAgIHN0cmluZ1RhYmxlLnB1dChrZXksIG4pOworLy8gICAgICAgIGRpc3QuYWRkRWxlbWVudChuKTsKKy8vCQkJfQorLy8JCX0KKy8vCQlyZXR1cm4gZGlzdDsKKy8vCX0KKy8vCisvLwkvKioKKy8vCSAqIFJldHVybnMgdHJ1ZSBvZiBib3RoIG5vZGUtc2V0cyBjb250YWluIHRoZSBzYW1lIHNldCBvZiBub2Rlcy4KKy8vCSAqIEBwYXJhbSBuMSBOb2RlSXRlcmF0b3IgZm9yIGZpcnN0IG5vZGUtc2V0CisvLwkgKiBAcGFyYW0gbmkyIE5vZGVJdGVyYXRvciBmb3Igc2Vjb25kIG5vZGUtc2V0CisvLwkgKiBAcmV0dXJuIHRydWUgaWYgbmkxIGFuZCBuaTIgY29udGFpbiBleGFjdGx5IHRoZSBzYW1lIHNldCBvZiBub2Rlcy4KKy8vCSAqLwkKKy8vCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNTYW1lTm9kZXMoTm9kZUl0ZXJhdG9yIG5pMSwgTm9kZUl0ZXJhdG9yIG5pMikKKy8vCXsKKy8vCQlOb2RlU2V0IG5zMSA9IG5ldyBOb2RlU2V0KG5pMSk7CisvLwkJTm9kZVNldCBuczIgPSBuZXcgTm9kZVNldChuaTIpOwkJCisvLwkJaWYgKG5zMS5nZXRMZW5ndGgoKSAhPSBuczIuZ2V0TGVuZ3RoKCkpCisvLwkJCXJldHVybiBmYWxzZTsKKy8vCQlmb3IgKGludCBpID0gMDsgaSA8IG5zMS5nZXRMZW5ndGgoKTsgaSsrKQorLy8JCXsKKy8vCQkJTm9kZSBuID0gbnMxLmVsZW1lbnRBdChpKTsKKy8vCQkJaWYoIW5zMi5jb250YWlucyhuKSkKKy8vCQkJCXJldHVybiBmYWxzZTsKKy8vCQl9CisvLwkJcmV0dXJuIHRydWU7CisvLwl9ICAKKy8vCisvLwkvKioKKy8vCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBhcmd1bWVudCBhcyBhIHN0cmluZyBjb250YWluaW5nCisvLyAgICogYW4gWFBhdGggZXhwcmVzc2lvbi4gIFVzZWQgd2hlcmUgdGhlIFhQYXRoIGV4cHJlc3Npb24gaXMgbm90IGtub3duIHVudGlsCisvLyAgICogcnVuLXRpbWUuICBUaGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXMgaWYgdGhlIHJ1bi10aW1lIHZhbHVlIG9mIHRoZQorLy8gICAqIGFyZ3VtZW50IGFwcGVhcmVkIGluIHBsYWNlIG9mIHRoZSBldmFsdWF0ZSBmdW5jdGlvbiBjYWxsIGF0IGNvbXBpbGUgdGltZS4KKy8vCSAqIEBwYXJhbSBteUNvbnRleHQgYW4gPGNvZGU+RXhwcmVzc2lvbkNvbnRleHQ8L2NvZGU+IHBhc3NlZCBpbiBieSB0aGUKKy8vICAgKiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBtZWNoYW5pc20uICBUaGlzIG11c3QgYmUgYW4gWFBhdGhDb250ZXh0LgorLy8JICogQHBhcmFtIHhwYXRoRXh0ciBUaGUgWFBhdGggZXhwcmVzc2lvbiB0byBiZSBldmFsdWF0ZWQuCisvLwkgKiBAcmV0dXJuIHRoZSBYT2JqZWN0IHJlc3VsdGluZyBmcm9tIGV2YWx1YXRpbmcgdGhlIFhQYXRoCisvLwkgKi8JCisvLwlwdWJsaWMgc3RhdGljIFhPYmplY3QgZXZhbHVhdGUoRXhwcmVzc2lvbkNvbnRleHQgbXlDb250ZXh0LCBTdHJpbmcgeHBhdGhFeHByKQorLy8gICAgICAgICAgICAgICAgICB0aHJvd3MgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBFeGNlcHRpb24KKy8vCXsKKy8vICAgIGlmIChteUNvbnRleHQgaW5zdGFuY2VvZiBYUGF0aENvbnRleHQpCisvLyAgICB7CisvLyAgICAgIHRyeQorLy8gICAgICB7CisvLyAgICAgICAgWFBhdGhDb250ZXh0IHhjdHh0ID0gKFhQYXRoQ29udGV4dCkgbXlDb250ZXh0OworLy8gICAgICAgIFhQYXRoIGR5bmFtaWNYUGF0aCA9IG5ldyBYUGF0aCh4cGF0aEV4cHIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y3R4dC5nZXRTQVhMb2NhdG9yKCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y3R4dC5nZXROYW1lc3BhY2VDb250ZXh0KCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUGF0aC5TRUxFQ1QpOworLy8gICAgICAgIHJldHVybiBkeW5hbWljWFBhdGguZXhlY3V0ZSh4Y3R4dCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlDb250ZXh0LmdldENvbnRleHROb2RlKCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjdHh0LmdldE5hbWVzcGFjZUNvbnRleHQoKSk7CisvLyAgICAgIH0KKy8vICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorLy8gICAgICB7CisvLyAgICAgICAgdGhyb3cgZTsKKy8vICAgICAgfQorLy8gICAgfQorLy8gICAgZWxzZQorLy8gICAgICB0aHJvdyBuZXcgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJJbnZhbGlkIGNvbnRleHQgcGFzc2VkIHRvIGV2YWx1YXRlICIgKyBteUNvbnRleHQpOworLy8JfSAgCisvLworLy8JLyoqCisvLwkgKiBSZXR1cm5zIGEgTm9kZVNldCBjb250YWluaW5nIG9uZSB0ZXh0IG5vZGUgZm9yIGVhY2ggdG9rZW4gaW4gdGhlIGZpcnN0IGFyZ3VtZW50LgorLy8gICAqIERlbGltaXRlcnMgYXJlIHNwZWNpZmllZCBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50LgorLy8gICAqIFRva2VucyBhcmUgZGV0ZXJtaW5lZCBieSBhIGNhbGwgdG8gPGNvZGU+U3RyaW5nVG9rZW5pemVyPC9jb2RlPi4KKy8vICAgKiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gZW1wdHkgc3RyaW5nIG9yIGNvbnRhaW5zIG9ubHkgZGVsaW1pdGVycywgdGhlIHJlc3VsdAorLy8gICAqIHdpbGwgYmUgYW4gZW1wdHkgTm9kZVNldC4KKy8vICAgKiBDb250cmlidXRlZCB0byBYYWxhbkoxIGJ5IDxhIGhyZWY9Im1haWx0bzpiZW5vaXQuY2VycmluYUB3cml0ZW1lLmNvbSI+QmVub2l0IENlcnJpbmE8L2E+LiAgCisvLwkgKiBAcGFyYW0gbXlDb250ZXh0IGFuIDxjb2RlPkV4cHJlc3Npb25Db250ZXh0PC9jb2RlPiBwYXNzZWQgaW4gYnkgdGhlCisvLyAgICogICAgICAgICAgICAgICAgICBleHRlbnNpb24gbWVjaGFuaXNtLiAgVGhpcyBtdXN0IGJlIGFuIFhQYXRoQ29udGV4dC4KKy8vCSAqIEBwYXJhbSB0b1Rva2VuaXplIFRoZSBzdHJpbmcgdG8gYmUgc3BsaXQgaW50byB0ZXh0IHRva2Vucy4KKy8vICAgKiBAcGFyYW0gZGVsaW1zIFRoZSBkZWxpbWl0ZXJzIHRvIHVzZS4KKy8vCSAqIEByZXR1cm4gYSBOb2RlU2V0IGFzIGRlc2NyaWJlZCBhYm92ZS4KKy8vICAgKgorLy8JICovCQorLy8JcHVibGljIHN0YXRpYyBOb2RlU2V0IHRva2VuaXplKEV4cHJlc3Npb25Db250ZXh0IG15Q29udGV4dCwgU3RyaW5nIHRvVG9rZW5pemUsIFN0cmluZyBkZWxpbXMpCisvLwl7CisvLyAgICBEb2N1bWVudCBsRG9jID0gbXlDb250ZXh0LmdldENvbnRleHROb2RlKCkuZ2V0T3duZXJEb2N1bWVudCgpOworLy8gICAgU3RyaW5nVG9rZW5pemVyIGxUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRvVG9rZW5pemUsIGRlbGltcyk7CisvLyAgICBOb2RlU2V0IHJlc3VsdFNldCA9IG5ldyBOb2RlU2V0KCk7CisvLyAgICB3aGlsZSAobFRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCisvLyAgICB7CisvLyAgICAgIHJlc3VsdFNldC5hZGROb2RlKGxEb2MuY3JlYXRlVGV4dE5vZGUobFRva2VuaXplci5uZXh0VG9rZW4oKSkpOworLy8gICAgfQorLy8gICAgcmV0dXJuIHJlc3VsdFNldDsKKy8vfSAgCisvLworLy8JLyoqCisvLwkgKiBSZXR1cm5zIGEgTm9kZVNldCBjb250YWluaW5nIG9uZSB0ZXh0IG5vZGUgZm9yIGVhY2ggdG9rZW4gaW4gdGhlIGZpcnN0IGFyZ3VtZW50LgorLy8gICAqIERlbGltaXRlcnMgYXJlIHdoaXRlc3BhY2UuICBUaGF0IGlzLCB0aGUgZGVsaW1pdGVycyB0aGF0IGFyZSB1c2VkIGFyZSB0YWIgKCYjeDA5KSwKKy8vICAgKiBsaW5lZmVlZCAoJiN4MEEpLCByZXR1cm4gKCYjeDBEKSwgYW5kIHNwYWNlICgmI3gyMCkuCisvLyAgICogVG9rZW5zIGFyZSBkZXRlcm1pbmVkIGJ5IGEgY2FsbCB0byA8Y29kZT5TdHJpbmdUb2tlbml6ZXI8L2NvZGU+LgorLy8gICAqIElmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbiBlbXB0eSBzdHJpbmcgb3IgY29udGFpbnMgb25seSBkZWxpbWl0ZXJzLCB0aGUgcmVzdWx0CisvLyAgICogd2lsbCBiZSBhbiBlbXB0eSBOb2RlU2V0LgorLy8gICAqIENvbnRyaWJ1dGVkIHRvIFhhbGFuSjEgYnkgPGEgaHJlZj0ibWFpbHRvOmJlbm9pdC5jZXJyaW5hQHdyaXRlbWUuY29tIj5CZW5vaXQgQ2VycmluYTwvYT4uICAKKy8vCSAqIEBwYXJhbSBteUNvbnRleHQgYW4gPGNvZGU+RXhwcmVzc2lvbkNvbnRleHQ8L2NvZGU+IHBhc3NlZCBpbiBieSB0aGUKKy8vICAgKiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBtZWNoYW5pc20uICBUaGlzIG11c3QgYmUgYW4gWFBhdGhDb250ZXh0LgorLy8JICogQHBhcmFtIHRvVG9rZW5pemUgVGhlIHN0cmluZyB0byBiZSBzcGxpdCBpbnRvIHRleHQgdG9rZW5zLgorLy8JICogQHJldHVybiBhIE5vZGVTZXQgYXMgZGVzY3JpYmVkIGFib3ZlLgorLy8gICAqCisvLwkgKi8JCisvLwlwdWJsaWMgc3RhdGljIE5vZGVTZXQgdG9rZW5pemUoRXhwcmVzc2lvbkNvbnRleHQgbXlDb250ZXh0LCBTdHJpbmcgdG9Ub2tlbml6ZSkKKy8vCXsKKy8vICAgIHJldHVybiB0b2tlbml6ZShteUNvbnRleHQsIHRvVG9rZW5pemUsICIgXHRcblxyIik7CisvLyAgfSAgCiAKIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9SZWRpcmVjdC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vbGliL1JlZGlyZWN0LmphdmEKaW5kZXggZjM0ODU4ZC4uMjU2MTllZSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vbGliL1JlZGlyZWN0LmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vbGliL1JlZGlyZWN0LmphdmEKQEAgLTc1LDYgKzc1LDggQEAKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwogCitpbXBvcnQgb3JnLnczYy5kb20uKjsKKwogLyoqCiAgKiBJbXBsZW1lbnRzIHRocmVlIGV4dGVuc2lvbiBlbGVtZW50cyB0byBhbGxvdyBhbiBYU0xUIHRyYW5zZm9ybWF0aW9uIHRvCiAgKiByZWRpcmVjdCBpdHMgb3V0cHV0IHRvIG11bHRpcGxlIG91dHB1dCBmaWxlcy4KQEAgLTM2Myw3ICszNjUsNyBAQAogICAgICAgLy8gUmVzdWx0IHdhcyBzdXBwbGllZCwgdGhlIGZpbGVuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZG9jdW1lbnQuCiAgICAgICAvLyBXaGVuIHRyYW5zZm9ybWluZyB3aXRoIGEgU0FYUmVzdWx0IG9yIERPTVJlc3VsdCwgY2FsbAogICAgICAgLy8gVHJhbnNmb3JtZXJJbXBsLnNldE91dHB1dFRhcmdldCgpIHRvIHNldCB0aGUgZGVzaXJlZCBSZXN1bHQgYmFzZS4KLS8vICAgICAgU3RyaW5nIGJhc2UgPSB1cmxUb0ZpbGVOYW1lKGVsZW0uZ2V0U3R5bGVzaGVldCgpLmdldFN5c3RlbUlkKCkpOworICAvLyAgICAgIFN0cmluZyBiYXNlID0gdXJsVG9GaWxlTmFtZShlbGVtLmdldFN0eWxlc2hlZXQoKS5nZXRTeXN0ZW1JZCgpKTsKIAogICAgICAgUmVzdWx0IG91dHB1dFRhcmdldCA9IHRyYW5zZm9ybWVyLmdldE91dHB1dFRhcmdldCgpOwogICAgICAgaWYgKCAobnVsbCAhPSBvdXRwdXRUYXJnZXQpICYmICgoYmFzZSA9IG91dHB1dFRhcmdldC5nZXRTeXN0ZW1JZCgpKSAhPSBudWxsKSApIHsKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9zcWwvRXh0ZW5zaW9uRXJyb3IuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9zcWwvRXh0ZW5zaW9uRXJyb3IuamF2YQppbmRleCA3MDhhZDYwLi42YmY3ZTBlIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9saWIvc3FsL0V4dGVuc2lvbkVycm9yLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vbGliL3NxbC9FeHRlbnNpb25FcnJvci5qYXZhCkBAIC03MCw3ICs3MCw2IEBACiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwogCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zdHJlZS5Eb2N1bWVudEltcGw7CiBpbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CiBpbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vbGliL3NxbC9YQ29ubmVjdGlvbi5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vbGliL3NxbC9YQ29ubmVjdGlvbi5qYXZhCmluZGV4IGU0MzczNjcuLmE4NWU5ODMgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9zcWwvWENvbm5lY3Rpb24uamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi9saWIvc3FsL1hDb25uZWN0aW9uLmphdmEKQEAgLTcyLDggKzcyLDYgQEAKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zdHJlZS5FbGVtZW50SW1wbDsKLQogLyoqCiAgKiBBbiBYU0xUIGV4dGVuc2lvbiB0aGF0IGFsbG93cyBhIHN0eWxlc2hlZXQgdG8KICAqIGFjY2VzcyBKREJDIGRhdGEuIEZyb20gdGhlIHN0eWxlc2hlZXQgcGVyc3BlY3RpdmUsCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9wcm9jZXNzb3IvQ29tcGlsaW5nU3R5bGVzaGVldEhhbmRsZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3Nvci9Db21waWxpbmdTdHlsZXNoZWV0SGFuZGxlci5qYXZhCmluZGV4IDFmYmI4YjMuLjRhMThkZDQgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3Nvci9Db21waWxpbmdTdHlsZXNoZWV0SGFuZGxlci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3Nvci9Db21waWxpbmdTdHlsZXNoZWV0SGFuZGxlci5qYXZhCkBAIC0xMDcsMTIgKzEwNywxMiBAQAogcHVibGljIGNsYXNzIENvbXBpbGluZ1N0eWxlc2hlZXRIYW5kbGVyCiAgIGV4dGVuZHMgU3R5bGVzaGVldEhhbmRsZXIKIHsKLQkvKiogQ29uc3RhbnRzIGZvciB0aGUgIm1heXRocm93IiBmaWVsZCAoZ2F0ZXMgd2hldGhlciBjYXRjaAotCSAqIHN0YXRlbWVudHMgYXJlIGdlbmVyYXRlZCk6Ci0JICovCi0JZmluYWwgaW50IE1BWV9USFJPV19TQVhfRVhDRVBUSU9OPTB4MDE7Ci0JCi0JCisgICAgICAgIC8qKiBDb25zdGFudHMgZm9yIHRoZSAibWF5dGhyb3ciIGZpZWxkIChnYXRlcyB3aGV0aGVyIGNhdGNoCisgICAgICAgICAqIHN0YXRlbWVudHMgYXJlIGdlbmVyYXRlZCk6CisgICAgICAgICAqLworICAgICAgICBmaW5hbCBpbnQgTUFZX1RIUk9XX1NBWF9FWENFUFRJT049MHgwMTsKKyAgICAgICAgCisgICAgICAgIAogICAvKioKICAgICogQ3JlYXRlIGEgU3R5bGVzaGVldEhhbmRsZXIgb2JqZWN0LCBjcmVhdGluZyBhIHJvb3Qgc3R5bGVzaGVldCAKICAgICogYXMgdGhlIHRhcmdldC4KQEAgLTEzNyw2MyArMTM3LDYzIEBACiAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50ICgpCiAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgogICB7Ci0JICAKKyAgICAgICAgICAKIC8vICAgIHRyeQogLy8gICAgewotCSAgCi0JICAvLyBQZXJmb3JtIG5vcm1hbCBlbmQtb2YtcGFyc2Ugb3BlcmF0aW9ucyAtLSBpbiBwYXJ0aWN1bGFyLCAKLQkgIC8vIHRoZSAiY29tcG9zaXRpb24iIHByb2Nlc3Mgd2hpY2ggcGVyZm9ybXMgZGF0YSBnYXRoZXJpbmcKLQkgIC8vIGFuZCBvcHRpbWl6YXRpb24gb2YgdGhlIGludGVycHJldGFibGUgdHJlZS4KKyAgICAgICAgICAKKyAgICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBlbmQtb2YtcGFyc2Ugb3BlcmF0aW9ucyAtLSBpbiBwYXJ0aWN1bGFyLCAKKyAgICAgICAgICAvLyB0aGUgImNvbXBvc2l0aW9uIiBwcm9jZXNzIHdoaWNoIHBlcmZvcm1zIGRhdGEgZ2F0aGVyaW5nCisgICAgICAgICAgLy8gYW5kIG9wdGltaXphdGlvbiBvZiB0aGUgaW50ZXJwcmV0YWJsZSB0cmVlLgogICAgICAgc3VwZXIuZW5kRG9jdW1lbnQoKTsKICAgICAgIAogICAgICAgaWYoaXNTdHlsZXNoZWV0UGFyc2luZ0NvbXBsZXRlKCkpCiAgICAgICB7ICAgIAogICAgICAgICBTdHlsZXNoZWV0IGN1cnJlbnQ9Z2V0U3R5bGVzaGVldCgpOwogCi0JCS8vIFJlY29yZCB0aGUgVGVtcGxhdGVzIGFzIHdlIGNvbXBpbGUgdGhlbTsgdGhpcyBsaXN0IGdldHMKLQkJLy8gcGFzc2VkIGludG8gdGhlICJidW5kbGluZyIgY29kZSB0byBjb3B5IHRoZWlyIGV4Y3V0YWJsZSBjb2RlCi0JCS8vIGludG8gdGhlIC54c2IgZmlsZS4KLQkJLy8gVE9ETzogQ2FuIHdlIGp1c3QgdXNlIHRoZSBTdHlsZXNoZWV0Um9vdCdzIGxpc3Q/CisgICAgICAgICAgICAgICAgLy8gUmVjb3JkIHRoZSBUZW1wbGF0ZXMgYXMgd2UgY29tcGlsZSB0aGVtOyB0aGlzIGxpc3QgZ2V0cworICAgICAgICAgICAgICAgIC8vIHBhc3NlZCBpbnRvIHRoZSAiYnVuZGxpbmciIGNvZGUgdG8gY29weSB0aGVpciBleGN1dGFibGUgY29kZQorICAgICAgICAgICAgICAgIC8vIGludG8gdGhlIC54c2IgZmlsZS4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBDYW4gd2UganVzdCB1c2UgdGhlIFN0eWxlc2hlZXRSb290J3MgbGlzdD8KICAgICAgICAgVmVjdG9yIGNvbXBpbGVkVGVtcGxhdGVzPW5ldyBWZWN0b3IoKTsKIAotCQkvLyBjYWNoZSB0aGUgdHlwZWNhc3QKKyAgICAgICAgICAgICAgICAvLyBjYWNoZSB0aGUgdHlwZWNhc3QKICAgICAgICAgU3R5bGVzaGVldFJvb3Qgcm9vdD0oU3R5bGVzaGVldFJvb3QpZ2V0U3R5bGVzaGVldFJvb3QoKTsKICAgICAgICAgCi0JCS8vIEZvciBhbGwgdGVtcGxhdGVzIHVzZWQgaW4gdGhpcyBzdHlsZXNoZWV0IChpbmNsdWRpbmcKLQkJLy8gdGhvc2UgZnJvbSBpbXBvcnRlZCBhbmQgaW5jbHVkZWQgc3R5bGVzaGVldHMpLCAKLQkJLy8gY29tcGlsZSB0byBKYXZhLiAoVGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQKLQkJLy8gQ29tcG9zZWRTdHlsZXNoZWV0IHByb2Nlc3NpbmcgaGFzIGFscmVhZHkgZ2F0aGVyZWQKLQkJLy8gdGhlc2UgYW5kIHJlY29uY2lsZWQgY29uZmxpY3RzLikKLQkJCi0JCS8vIE5ldyBUZW1wbGF0ZUxpc3QgYmVpbmcgZ2VuZXJhdGVkCi0JCW9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlRlbXBsYXRlTGlzdCBuZXdUbCAKLQkJCT0gbmV3IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlRlbXBsYXRlTGlzdCgpOwotCQkvLyBJdGVyYXRlIG92ZXIgY29udGVudHMgb2Ygb2xkIFRlbXBsYXRlTGlzdAotCQlvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5UZW1wbGF0ZUxpc3QuVGVtcGxhdGVXYWxrZXIgdHcKLQkJCT1yb290LmdldFRlbXBsYXRlTGlzdENvbXBvc2VkKCkuZ2V0V2Fsa2VyKCk7Ci0JCQotCQkvLyBTY2FuIGFsbCB0ZW1wbGF0ZXMgaW4gb2xkIGxpc3QsIGNvbXBpbGUsIGluc2VydCBpbnRvIG5ldwotCQlFbGVtVGVtcGxhdGUgZXQ7Ci0JCXdoaWxlICggbnVsbCAhPSAoZXQgPSB0dy5uZXh0KCkpICkKLQkJewotCQkJRWxlbVRlbXBsYXRlIGN0ID0gY29tcGlsZVRlbXBsYXRlKGV0KTsKLQkJCQotCQkJLy8gSWYgY29tcGlsYXRpb24gc3VjY2VlZHMsIHVzZSBpdDsgZWxzZSBmYWxsIGJhY2sgb24gaW50ZXJwCi0JCQluZXdUbC5zZXRUZW1wbGF0ZSggKGN0IT1udWxsKSA/IGN0IDogZXQpOwotCQl9Ci0JCS8vIFBvc3Rwcm9jZXNzL3JlY29uY2lsZSBsaXN0Ci0JCW5ld1RsLmNvbXBvc2UoKTsKLQkJLy8gQW5kIG1ha2UgaXQgYWN0aXZlCi0JCXJvb3Quc2V0VGVtcGxhdGVMaXN0Q29tcG9zZWQobmV3VGwpOworICAgICAgICAgICAgICAgIC8vIEZvciBhbGwgdGVtcGxhdGVzIHVzZWQgaW4gdGhpcyBzdHlsZXNoZWV0IChpbmNsdWRpbmcKKyAgICAgICAgICAgICAgICAvLyB0aG9zZSBmcm9tIGltcG9ydGVkIGFuZCBpbmNsdWRlZCBzdHlsZXNoZWV0cyksIAorICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdG8gSmF2YS4gKFRha2VzIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0CisgICAgICAgICAgICAgICAgLy8gQ29tcG9zZWRTdHlsZXNoZWV0IHByb2Nlc3NpbmcgaGFzIGFscmVhZHkgZ2F0aGVyZWQKKyAgICAgICAgICAgICAgICAvLyB0aGVzZSBhbmQgcmVjb25jaWxlZCBjb25mbGljdHMuKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIE5ldyBUZW1wbGF0ZUxpc3QgYmVpbmcgZ2VuZXJhdGVkCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuVGVtcGxhdGVMaXN0IG5ld1RsIAorICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuVGVtcGxhdGVMaXN0KCk7CisgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGNvbnRlbnRzIG9mIG9sZCBUZW1wbGF0ZUxpc3QKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5UZW1wbGF0ZUxpc3QuVGVtcGxhdGVXYWxrZXIgdHcKKyAgICAgICAgICAgICAgICAgICAgICAgID1yb290LmdldFRlbXBsYXRlTGlzdENvbXBvc2VkKCkuZ2V0V2Fsa2VyKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gU2NhbiBhbGwgdGVtcGxhdGVzIGluIG9sZCBsaXN0LCBjb21waWxlLCBpbnNlcnQgaW50byBuZXcKKyAgICAgICAgICAgICAgICBFbGVtVGVtcGxhdGUgZXQ7CisgICAgICAgICAgICAgICAgd2hpbGUgKCBudWxsICE9IChldCA9IHR3Lm5leHQoKSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1UZW1wbGF0ZSBjdCA9IGNvbXBpbGVUZW1wbGF0ZShldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGNvbXBpbGF0aW9uIHN1Y2NlZWRzLCB1c2UgaXQ7IGVsc2UgZmFsbCBiYWNrIG9uIGludGVycAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGwuc2V0VGVtcGxhdGUoIChjdCE9bnVsbCkgPyBjdCA6IGV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gUG9zdHByb2Nlc3MvcmVjb25jaWxlIGxpc3QKKyAgICAgICAgICAgICAgICBuZXdUbC5jb21wb3NlKCk7CisgICAgICAgICAgICAgICAgLy8gQW5kIG1ha2UgaXQgYWN0aXZlCisgICAgICAgICAgICAgICAgcm9vdC5zZXRUZW1wbGF0ZUxpc3RDb21wb3NlZChuZXdUbCk7CiAKLQkJLy8gVE9ETzogVGhlb3JldGljYWxseSwgd2UgY2FuIG5vdyBkaXNjYXJkIGltcG9ydHMvaW5jbHVkZXMKLQkJLy8gLS0gdGhleSdyZSBubyBsb25nZXIgcG9pbnRpbmcgYXQgdGhlIHJpZ2h0IEVsZW1UZW1wbGF0ZXMKLQkJLy8gYW55d2F5LiBUaGVyZSdzIGRpc2N1c3Npb24gb2YgZG9pbmcgc28gaW4gYW55IGNhc2Ugd2hlbgotCQkvLyB0aGV5IGFyZW4ndCBuZWVkZWQgZm9yIHRvb2xpbmcgc3VwcG9ydC4gQWx3YXlzIGRvIGl0IGhlcmUsCi0JCS8vIGxlYXZlIGl0IHRvIGJlIGhhbmRsZWQgdGhlcmUsIG9yIG90aGVyPworICAgICAgICAgICAgICAgIC8vIFRPRE86IFRoZW9yZXRpY2FsbHksIHdlIGNhbiBub3cgZGlzY2FyZCBpbXBvcnRzL2luY2x1ZGVzCisgICAgICAgICAgICAgICAgLy8gLS0gdGhleSdyZSBubyBsb25nZXIgcG9pbnRpbmcgYXQgdGhlIHJpZ2h0IEVsZW1UZW1wbGF0ZXMKKyAgICAgICAgICAgICAgICAvLyBhbnl3YXkuIFRoZXJlJ3MgZGlzY3Vzc2lvbiBvZiBkb2luZyBzbyBpbiBhbnkgY2FzZSB3aGVuCisgICAgICAgICAgICAgICAgLy8gdGhleSBhcmVuJ3QgbmVlZGVkIGZvciB0b29saW5nIHN1cHBvcnQuIEFsd2F5cyBkbyBpdCBoZXJlLAorICAgICAgICAgICAgICAgIC8vIGxlYXZlIGl0IHRvIGJlIGhhbmRsZWQgdGhlcmUsIG9yIG90aGVyPwogCiAvKioqKioqIE9MRCBBUFBST0FDSAotCQlpbnQgbkltcG9ydHMgPSByb290LmdldEdsb2JhbEltcG9ydENvdW50KCk7CisgICAgICAgICAgICAgICAgaW50IG5JbXBvcnRzID0gcm9vdC5nZXRHbG9iYWxJbXBvcnRDb3VudCgpOwogICAgICAgICBmb3IoaW50IGltcCA9IDA7IGltcCA8IG5JbXBvcnRzOyBpbXArKykKICAgICAgICAgewogICAgICAgICAgIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLlN0eWxlc2hlZXRDb21wb3NlZApAQCAtMjM1LDE2ICsyMzUsMTYgQEAKICAgICAgICAgcm9vdC5yZWNvbXBvc2VUZW1wbGF0ZXModHJ1ZSk7IAogICoqKioqKiBPTEQgQVBQUk9BQ0ggKi8KIAotCQkvLyBUT0RPOiBUaGVvcmV0aWNhbGx5LCB3ZSBubyBsb25nZXIgbmVlZCB0aGUgSW1wb3J0ZWQgdHJlZXMuCi0JCS8vIEVsaW1pbmF0aW5nIHRoZW0gd291bGQgc2F2ZSBzb21lIGJ5dGVzIGluIG1lbW9yeSBhbmQgaW4gdGhlCi0JCS8vIC54c2IgYnVuZGxlIGZpbGUuIChUaGV5IHNob3VsZCBiZSBuZWVkZWQgb25seSBmb3IgdG9vbGluZyAKLQkJLy8gc3VwcG9ydCwgd2hpY2ggZG9lc24ndCBzZWVtIHRvIGFwcGx5IHRvIGNvbXBpbGVkIG9wZXJhdGlvbi4pCi0JCS8vIFRyeSB0aGF0IF9BRlRFUl8gdGhlIGNvbXBpbGUgbG9vcCBoYXMgYmVlbiByZXZpdmVkIQotCQkKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBUaGVvcmV0aWNhbGx5LCB3ZSBubyBsb25nZXIgbmVlZCB0aGUgSW1wb3J0ZWQgdHJlZXMuCisgICAgICAgICAgICAgICAgLy8gRWxpbWluYXRpbmcgdGhlbSB3b3VsZCBzYXZlIHNvbWUgYnl0ZXMgaW4gbWVtb3J5IGFuZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAvLyAueHNiIGJ1bmRsZSBmaWxlLiAoVGhleSBzaG91bGQgYmUgbmVlZGVkIG9ubHkgZm9yIHRvb2xpbmcgCisgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCwgd2hpY2ggZG9lc24ndCBzZWVtIHRvIGFwcGx5IHRvIGNvbXBpbGVkIG9wZXJhdGlvbi4pCisgICAgICAgICAgICAgICAgLy8gVHJ5IHRoYXQgX0FGVEVSXyB0aGUgY29tcGlsZSBsb29wIGhhcyBiZWVuIHJldml2ZWQhCisgICAgICAgICAgICAgICAgCiAgICAgICAgIC8vIFRPRE86IFNob3VsZCBidW5kbGluZyBvY2N1ciBlbHNld2hlcmUgb3IgYmUgb3B0aW9uYWw/CiAgICAgICAgIENvbXBpbGVkU3R5bGVzaGVldEJ1bmRsZS5jcmVhdGVCdW5kbGUocm9vdCxjb21waWxlZFRlbXBsYXRlcyk7CiAgICAgICB9Ci0JICAKKyAgICAgICAgICAKIC8vICAgIH0KIC8vICAgIGNhdGNoKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKQogLy8gICAgewpAQCAtMzk0LDggKzM5NCw4IEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8vIENvbXBpbGUgdGhlIG5ldyBqYXZhIGNsYXNzLiBOb3RlIHRoYXQgYW55IGV4aXN0aW5nIGNsYXNzCi0JCS8vIGJ5IHRoZSBzYW1lIG5hbWUgd2lsbCBiZSB3YWxrZWQgdXBvbi4uLiB3aGljaCBpcyB3aHkgSSdtCi0JCS8vIGdvaW5nIHRvIHRoZSB0cm91YmxlIG9mIGdlbmVyYXRpbmcgdW5pcXVlIGNsYXNzbmFtZXMuCisgICAgICAgICAgICAgICAgLy8gYnkgdGhlIHNhbWUgbmFtZSB3aWxsIGJlIHdhbGtlZCB1cG9uLi4uIHdoaWNoIGlzIHdoeSBJJ20KKyAgICAgICAgICAgICAgICAvLyBnb2luZyB0byB0aGUgdHJvdWJsZSBvZiBnZW5lcmF0aW5nIHVuaXF1ZSBjbGFzc25hbWVzLgogICAgICAgICAvLyBUT0RPOiAqKioqKiBJU1NVRTogV2hlcmUgd3JpdGUgb3V0IHRoZSBjbGFzcz8gUGFyYW1ldGVyaXplLgogICAgICAgICAvLyBOZWVkcyB0byBiZSBzb21ld2hlcmUgb24gdGhlIGNsYXNzcGF0aCwgb3Igd2UgbmVlZCBhIGNsYXNzbG9hZGVyLgogICAgICAgICBDbGFzcyByZWFsY2xhc3M9Y29tcGlsZVN5bnRoZXRpY0NsYXNzKHRDbGFzcywiLiIpOwpAQCAtNDQwLDE4ICs0NDAsMTggQEAKICAgCiAgIGludCBjb21waWxlRWxlbVRlbXBsYXRlRWxlbWVudChFbGVtVGVtcGxhdGVFbGVtZW50IGtpZCxTdHJpbmdCdWZmZXIgYm9keSxWZWN0b3IgaW50ZXJwcmV0VmVjdG9yKQogICB7Ci0JaW50IG1heXRocm93PTA7ICAKKyAgICAgICAgaW50IG1heXRocm93PTA7ICAKICAgICArK3VuaXF1ZVZhclN1ZmZpeDsgLy8gTWFpbnRhaW4gdW5pcXVlIHZhcmlhYmxlIG5hbWluZwogICAgICAgCiAgICAgICAgIHN3aXRjaChraWQuZ2V0WFNMVG9rZW4oKSkKICAgICAgICAgewogICAgICAgICBjYXNlIENvbnN0YW50cy5FTEVNTkFNRV9MSVRFUkFMUkVTVUxUOgotCQkJbWF5dGhyb3c9Y29tcGlsZUVsZW1MaXRlcmFsUmVzdWx0KChFbGVtTGl0ZXJhbFJlc3VsdClraWQsYm9keSxpbnRlcnByZXRWZWN0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgbWF5dGhyb3c9Y29tcGlsZUVsZW1MaXRlcmFsUmVzdWx0KChFbGVtTGl0ZXJhbFJlc3VsdClraWQsYm9keSxpbnRlcnByZXRWZWN0b3IpOwogICAgICAgICAgICAgYnJlYWs7CiAKLQkvLyBUT0RPOiAqKioqKiBSZWRpcmVjdGlvbiBvZiBhdHRyIHZhbHVlIG5vdCB3b3JraW5nIHlldC4KLQkvLyBUT0RPOiAqKioqKiBBdHRycyBzaG91bGQgYmUgcHJlcHJvY2Vzc2VkIChTQVgtb3JkZXJlZCkKLQkvL2Nhc2UgQ29uc3RhbnRzLkVMRU1OQU1FX0FUVFJJQlVURToKKyAgICAgICAgLy8gVE9ETzogKioqKiogUmVkaXJlY3Rpb24gb2YgYXR0ciB2YWx1ZSBub3Qgd29ya2luZyB5ZXQuCisgICAgICAgIC8vIFRPRE86ICoqKioqIEF0dHJzIHNob3VsZCBiZSBwcmVwcm9jZXNzZWQgKFNBWC1vcmRlcmVkKQorICAgICAgICAvL2Nhc2UgQ29uc3RhbnRzLkVMRU1OQU1FX0FUVFJJQlVURToKICAgICAgICAgLy8gICAgY29tcGlsZUVsZW1BdHRyaWJ1dGUoKEVsZW1BdHRyaWJ1dGUpa2lkLGJvZHksaW50ZXJwcmV0VmVjdG9yKTsKICAgICAgICAgLy8gICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgCkBAIC00NjYsMTQgKzQ2NiwxNCBAQAogICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotCQkKLQkJcmV0dXJuIG1heXRocm93OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiBtYXl0aHJvdzsKICAgfSAgCiAgIAogICBpbnQgY29tcGlsZUVsZW1MaXRlcmFsUmVzdWx0KEVsZW1MaXRlcmFsUmVzdWx0IGVsZSxTdHJpbmdCdWZmZXIgYm9keSxWZWN0b3IgaW50ZXJwcmV0VmVjdG9yKQogICB7Ci0JaW50IG1heXRocm93PTA7Ci0JCisgICAgICAgIGludCBtYXl0aHJvdz0wOworICAgICAgICAKICAgICArK3VuaXF1ZVZhclN1ZmZpeDsgLy8gTWFpbnRhaW4gdW5pcXVlIHZhcmlhYmxlIG5hbWluZwogICAgICAgCiAgICAgYm9keS5hcHBlbmQoInJoYW5kbGVyLnN0YXJ0RWxlbWVudChcIiIKQEAgLTUzMiwxMyArNTMyLDE0IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gTGl0ZXJhbCB2YWx1ZSwgY2FuIGZ1bGx5IHJlc29sdmUgYXQgY29tcGlsZSB0aW1lLgogICAgICAgICAgICAgICAgIC8vIEV4Y2VwdGlvbiB3b24ndCBiZSB0aHJvd24sIGJ1dCB3ZSd2ZSBnb3R0YSBjYXRjaAotICAgICAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICAgICAgYXZ0VmFsdWVFeHByZXNzaW9uPW1ha2VRdW90ZWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBhdnQuZXZhbHVhdGUobnVsbCxudWxsLG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIH1jYXRjaChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAvLyAlWFRCRCUgPz8KKy8vICAgICAgICAgICAgICAgICAgICBhdnRWYWx1ZUV4cHJlc3Npb249bWFrZVF1b3RlZFN0cmluZygKKy8vICAgICAgICAgICAgICAgICAgICAgICAgYXZ0LmV2YWx1YXRlKG51bGwsbnVsbCxudWxsKQorLy8gICAgICAgICAgICAgICAgICAgICAgICApOworLy8gICAgICAgICAgICAgICAgfWNhdGNoKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpCisvLyAgICAgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CkBAIC01NzMsOCArNTc0LDggQEAKICAgICAvLyBQcm9jZXNzIGNoaWxkcmVuCiAgICAgLy8gVE9ETzoqKioqKiAiUHJvY2VzcyBtX2V4dGVuc2lvbkVsZW1lbnRQcmVmaXhlcyAmJiBtX2F0dHJpYnV0ZVNldHNOYW1lcyIKIAotCS8vIFRPRE86IFNob3VsZCBtYXl0aHJvdyBiZSBwYXNzZWQgb3V0d2FyZCwgdW53aW5kaW5nIHRyeS9jYXRjaD8KLQkvLyBtYXl0aHJvdyAhPQorICAgICAgICAvLyBUT0RPOiBTaG91bGQgbWF5dGhyb3cgYmUgcGFzc2VkIG91dHdhcmQsIHVud2luZGluZyB0cnkvY2F0Y2g/CisgICAgICAgIC8vIG1heXRocm93ICE9CiAgICAgY29tcGlsZUNoaWxkVGVtcGxhdGVzKGVsZSxib2R5LGludGVycHJldFZlY3Rvcik7CiAKICAgICAvLyBDbG9zZSB0aGUgcGF0aWVudApAQCAtNTg0LDggKzU4NSw4IEBACiAgICAgICAgICAgICAgICAgK2VsZS5nZXRSYXdOYW1lKCkrIlwiKTtcbiIpOwogICAgIGlmKG5ld05TbGV2ZWwpCiAgICAgICAgIGJvZHkuYXBwZW5kKCJuc1N1cHBvcnQucG9wQ29udGV4dCgpO1xuIik7Ci0JCi0JcmV0dXJuIG1heXRocm93IHwgTUFZX1RIUk9XX1NBWF9FWENFUFRJT047CisgICAgICAgIAorICAgICAgICByZXR1cm4gbWF5dGhyb3cgfCBNQVlfVEhST1dfU0FYX0VYQ0VQVElPTjsKICAgfQogCiAgIC8vIERldGVjdCBhbmQgcmVwb3J0IEF0dHJpYnV0ZVNldCBsb29wcy4KQEAgLTYzMCwxMyArNjMxLDE0IEBACiAKICAgICAgICAgICAgICAgICAvLyBSZWN1cnNlLCBzaW5jZSBhdHRyc2V0cyBjYW4gcmVmZXJlbmNlIGF0dHJzZXRzCiAgICAgICAgICAgICAgICAgY29tcGlsZVVzZUF0dHJTZXQoYXR0clNldCxib2R5LGludGVycHJldFZlY3Rvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBFbGVtQXR0cmlidXRlIGF0dHIgPSAoRWxlbUF0dHJpYnV0ZSlhdHRyU2V0LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgICAgICB3aGlsZShudWxsICE9IGF0dHIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb21waWxlRWxlbVRlbXBsYXRlRWxlbWVudChhdHRyLGJvZHksaW50ZXJwcmV0VmVjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0ciA9IChFbGVtQXR0cmlidXRlKWF0dHIuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vICVYVEJEJSAgICAKKy8vICAgICAgICAgICAgICAgIEVsZW1BdHRyaWJ1dGUgYXR0ciA9IChFbGVtQXR0cmlidXRlKWF0dHJTZXQuZ2V0Rmlyc3RDaGlsZCgpOworLy8gICAgICAgICAgICAgICAgd2hpbGUobnVsbCAhPSBhdHRyKQorLy8gICAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVFbGVtVGVtcGxhdGVFbGVtZW50KGF0dHIsYm9keSxpbnRlcnByZXRWZWN0b3IpOworLy8gICAgICAgICAgICAgICAgICAgIGF0dHIgPSAoRWxlbUF0dHJpYnV0ZSlhdHRyLmdldE5leHRTaWJsaW5nKCk7CisvLyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGF0dHJTZXRTdGFjay5wb3AoKTsKICAgICAgICAgICAgIH0KQEAgLTY0NywxOCArNjQ5LDE5IEBACiAgIFN0cmluZyBjb21waWxlQVZUdmFsdWUob3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuQVZUIGF2dCxTdHJpbmdCdWZmZXIgYm9keSxWZWN0b3IgaW50ZXJwcmV0VmVjdG9yKQogICB7CiAgICAgICAvLyBMaXRlcmFsIHN0cmluZyBpcyBlYXN5IC0tIGV4Y2VwdCBmb3IgcG90ZW50aWFsIG9mICIgd2l0aGluICIiLgotICAgICAgaWYoYXZ0LmlzQ29udGV4dEluc2Vuc2l0aXZlKCkpCi0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1ha2VRdW90ZWRTdHJpbmcoYXZ0LmV2YWx1YXRlKG51bGwsbnVsbCxudWxsKSk7Ci0gICAgICAgICAgfSBjYXRjaChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGFyaXNlCi0gICAgICAgICAgICAgIFN0cmluZyBzPSI+VU5FWFBFQ1RFRCBFUlJPUiBldmFsdWF0aW5nIGNvbnRleHQtaW5zZW5zaXRpdmUgQVZUPCI7Ci0gICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzKTsKLSAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgcmV0dXJuICJcIiIrcysnIic7Ci0gICAgICAgICAgfQorICAgICAgLy8gJVhUQkQlCisvLyAgICAgIGlmKGF2dC5pc0NvbnRleHRJbnNlbnNpdGl2ZSgpKQorLy8gICAgICAgICAgdHJ5CisvLyAgICAgICAgICB7CisvLyAgICAgICAgICAgIHJldHVybiBtYWtlUXVvdGVkU3RyaW5nKGF2dC5ldmFsdWF0ZShudWxsLG51bGwsbnVsbCkpOworLy8gICAgICAgICAgfSBjYXRjaChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQorLy8gICAgICAgICAgeworLy8gICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBhcmlzZQorLy8gICAgICAgICAgICAgIFN0cmluZyBzPSI+VU5FWFBFQ1RFRCBFUlJPUiBldmFsdWF0aW5nIGNvbnRleHQtaW5zZW5zaXRpdmUgQVZUPCI7CisvLyAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHMpOworLy8gICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisvLyAgICAgICAgICAgICAgcmV0dXJuICJcIiIrcysnIic7CisvLyAgICAgICAgICB9CiAgICAgICAKICAgICAgIC8vIE90aGVyd2lzZSBubyBjb21waWxhdGlvbiB5ZXQsIGp1c3QgcmVmZXJlbmNlIGFuZCByZXR1cm4gZXhwcmVzc2lvbi4KICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyBfbm90XyBjb2RlLWdlbiBkaXJlY3RseSBpbnRvIHRoZSBib2R5LCBkdWUgdG8KQEAgLTY2OCw4ICs2NzEsOCBAQAogICAgICAgaW50ZXJwcmV0VmVjdG9yLmFkZEVsZW1lbnQoYXZ0KTsKICAgICAgIHJldHVybiAKICAgICAgICAgICAiKCAoKG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkFWVCltX2ludGVycHJldEFycmF5WyIKLQkJICArb2Zmc2V0Ci0JCSAgKyJdKS5ldmFsdWF0ZSh0cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKSxzb3VyY2VOb2RlLHRoaXMsbmV3IFN0cmluZ0J1ZmZlcigpKSApIgorICAgICAgICAgICAgICAgICAgK29mZnNldAorICAgICAgICAgICAgICAgICAgKyJdKS5ldmFsdWF0ZSh0cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKSxzb3VyY2VOb2RlLHRoaXMsbmV3IFN0cmluZ0J1ZmZlcigpKSApIgogICAgICAgICAgIDsKICAgfQogICAKQEAgLTg2Niw3ICs4NjksNyBAQAogICB2b2lkIGNvbXBpbGVDaGlsZFRlbXBsYXRlcyhFbGVtVGVtcGxhdGVFbGVtZW50IHNvdXJjZSxTdHJpbmdCdWZmZXIgYm9keSxWZWN0b3IgaW50ZXJwcmV0VmVjdG9yKQogICB7ICAgICAgCiAgICAgaW50IG1heXRocm93PTA7Ci0JCisgICAgICAgIAogICAgICsrdW5pcXVlVmFyU3VmZml4OyAvLyBNYWludGFpbiB1bmlxdWUgdmFyaWFibGUgbmFtaW5nCiAgICAgICAKICAgICAvLyBJZiBubyBraWRzLCBubyBjb2RlIGdlbi4KQEAgLTg5NiwyNSArODk5LDI1IEBACiAgICAgICAgICAga2lkIT1udWxsOwogICAgICAgICAgIGtpZD1raWQuZ2V0TmV4dFNpYmxpbmdFbGVtKCkpCiAgICAgICAgICB7Ci0JCQkvL1RPRE86IE5FRUQgRVFVSVZBTEVOVD8gVGhpcyBOb2RlIGlzIEdvaW5nIEF3YXkuLi4KLQkJCS8vIGJvZHkuYXBwZW5kKCJ0cmFuc2Zvcm1lci5wdXNoRWxlbVRlbXBsYXRlRWxlbWVudChraWQpO1xuIik7Ci0JCSAgCi0JCQltYXl0aHJvd3w9Y29tcGlsZUVsZW1UZW1wbGF0ZUVsZW1lbnQoa2lkLGJvZHksaW50ZXJwcmV0VmVjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogTkVFRCBFUVVJVkFMRU5UPyBUaGlzIE5vZGUgaXMgR29pbmcgQXdheS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm9keS5hcHBlbmQoInRyYW5zZm9ybWVyLnB1c2hFbGVtVGVtcGxhdGVFbGVtZW50KGtpZCk7XG4iKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgbWF5dGhyb3d8PWNvbXBpbGVFbGVtVGVtcGxhdGVFbGVtZW50KGtpZCxib2R5LGludGVycHJldFZlY3Rvcik7CiAKLQkJCS8vVE9ETzogTkVFRCBFUVVJVkFMRU5UPyBUaGlzIE5vZGUgaXMgR29pbmcgQXdheS4uLgotCQkJLy8gYm9keS5hcHBlbmQoInRyYW5zZm9ybWVyLnBvcEVsZW1UZW1wbGF0ZUVsZW1lbnQoa2lkKTtcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBORUVEIEVRVUlWQUxFTlQ/IFRoaXMgTm9kZSBpcyBHb2luZyBBd2F5Li4uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBib2R5LmFwcGVuZCgidHJhbnNmb3JtZXIucG9wRWxlbVRlbXBsYXRlRWxlbWVudChraWQpO1xuIik7CiAgICAgICAgICB9CiAKLQkgIC8vIEVuZCB0aGUgY2xhc3Mgd3JhcHBlci4gCi0JICAvLyBUT0RPOiBTaG91bGQgIm1heXRocm93IiBiZSByZXR1cm5lZCBhbmQgcHJvY2Vzc2VkIEAgb3V0ZXJtb3N0IGNvbXBpbGU/Ci0JICBib2R5LmFwcGVuZCgiXG5cbn1cbiIpOwotCSAgaWYoMCE9KG1heXRocm93ICYgTUFZX1RIUk9XX1NBWF9FWENFUFRJT04pKQotCQlib2R5LmFwcGVuZCgiY2F0Y2gob3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHNlKSB7XG4iCi0JCQkJCSsiICB0aHJvdyBuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbihzZSk7XG4iCi0JCQkJCSsifVxuIgotCQkJCQkpOworICAgICAgICAgIC8vIEVuZCB0aGUgY2xhc3Mgd3JhcHBlci4gCisgICAgICAgICAgLy8gVE9ETzogU2hvdWxkICJtYXl0aHJvdyIgYmUgcmV0dXJuZWQgYW5kIHByb2Nlc3NlZCBAIG91dGVybW9zdCBjb21waWxlPworICAgICAgICAgIGJvZHkuYXBwZW5kKCJcblxufVxuIik7CisgICAgICAgICAgaWYoMCE9KG1heXRocm93ICYgTUFZX1RIUk9XX1NBWF9FWENFUFRJT04pKQorICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKCJjYXRjaChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gc2UpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiAgdGhyb3cgbmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24oc2UpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsifVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICBib2R5LmFwcGVuZCgKLQkJImZpbmFsbHkge1xuIgorICAgICAgICAgICAgICAgICJmaW5hbGx5IHtcbiIKICAgICAgICAgKyIgIHhjdHh0LnNldFNBWExvY2F0b3IoIitzYXZlZExvY2F0b3JOYW1lKyIpO1xuIgogICAgICAgICArIiAgLy8gUG9wIGFsbCB0aGUgdmFyaWFibGVzIGluIHRoaXMgZWxlbWVudCBmcmFtZS5cbiIKICAgICAgICAgKyIgICIrdmFyc3RhY2tOYW1lKyIucG9wRWxlbUZyYW1lKCk7XG4iCkBAIC05ODMsMTMgKzk4NiwxMyBAQAogICAgIC8vIFRyeSB0byBwaWNrIHVwIHRoZSBzYW1lIGNsYXNzcGF0aCB3ZSdyZSBleGVjdXRpbmcgdW5kZXIuIFRoYXQKICAgICAvLyBvdWdodCB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcgaW4gWGFsYW4gYW5kIHRoZSBzdGFuZGFyZCBsaWJyYXJpZXMuCiAgICAgU3RyaW5nIGNsYXNzcGF0aD1TeXN0ZW0uZ2V0UHJvcGVydHkgKCJqYXZhLmNsYXNzLnBhdGgiKTsKLQkKKyAgICAgICAgCiAgICAgLy8gSWYgY29tcGlsaW5nIHdpdGggdGhlIC1nIHN3aXRjaCAoSmF2YSBkZWJ1Z2dpbmcpLCB3ZSBzaG91bGQgcmV0YWluIAogICAgIC8vIHRoZSBKYXZhIHNvdXJjZSBjb2RlIHRvIHN1cHBvcnQgZGVidWdnaW5nIGludG8gdGhlIHN5bnRoZXNpemVkIGNsYXNzLgogICAgIC8vIFNvbWUgYWRkaXRpb25hbCBkaWFnbm9zdGljcyBhcmUgYWxzbyB0dXJuZWQgb24gYXMgYSBzaWRlIGVmZmVjdC4KICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHBsYWNlIHRvIHB1dCB0aGUgZGVidWdnaW5nIGNvbnRyb2wuIFByb3BlcnR5PyBQYXJtPwogICAgIFN0cmluZyBqYXZhY19vcHRpb25zPQotCVN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuQ29tcGlsaW5nU3R5bGVzaGVldEhhbmRsZXIub3B0aW9ucyIsIiIpOworICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLkNvbXBpbGluZ1N0eWxlc2hlZXRIYW5kbGVyLm9wdGlvbnMiLCIiKTsKICAgICBib29sZWFuIGRlYnVnPShqYXZhY19vcHRpb25zLmluZGV4T2YoIi1nIik+PTApOwogCiAgICAgLy8gUnVuIHRoZSBjb21waWxhdGlvbi4gRW5jYXBzdWxhdGVzIHRoZSBmYWxsYmFja3MgYW5kCkBAIC0xMDc4LDggKzEwODEsOCBAQAogICAgIGxvbmcgdGVtcGxhdGVOdW1iZXI7CiAgICAgc3luY2hyb25pemVkKHRoaXMpCiAgICAgeyAgIC8vIEF0b21pYyBnZXQtbmV4dC1jb3VudCAtLSBsYXN0LWRpdGNoIHByb3RlY3Rpb24gYWdhaW5zdAotCQkvLyB0aGUgcmlzayBvZiBtdWx0aXBsZSB0aHJlYWRzIHRyeWluZyB0byBwcm9jZXNzIHRoZSBzYW1lCi0JCS8vIHN0eWxlc2hlZXQgYXQgdGhlIHNhbWUgaW5zdGFudCBvbiB0aGUgc2FtZSBtYWNoaW5lLgorICAgICAgICAgICAgICAgIC8vIHRoZSByaXNrIG9mIG11bHRpcGxlIHRocmVhZHMgdHJ5aW5nIHRvIHByb2Nlc3MgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAvLyBzdHlsZXNoZWV0IGF0IHRoZSBzYW1lIGluc3RhbnQgb24gdGhlIHNhbWUgbWFjaGluZS4KICAgICAgICAgdGVtcGxhdGVOdW1iZXIgPSArK3RlbXBsYXRlQ291bnRlcjsKICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9wcm9jZXNzb3IvVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yL1RyYW5zZm9ybWVyRmFjdG9yeUltcGwuamF2YQppbmRleCBkZWI2YTM5Li5kYWJkMDdmIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9wcm9jZXNzb3IvVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3Nvci9UcmFuc2Zvcm1lckZhY3RvcnlJbXBsLmphdmEKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAKLSAgICAgICAgICBpcyA9IFByb2Nlc3MuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlKTsKKyAgICAgICAgICBpcyA9IFRyYW5zZm9ybWVyRmFjdG9yeUltcGwuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlKTsKIAogICAgICAgICAgIC8vIGdldCBhIGJ1ZmZlcmVkIHZlcnNpb24KICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlzKTsKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3N0cmVlL1BhcmVudC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vc3RyZWUvUGFyZW50LmphdmEKaW5kZXggYzdmZjNmMi4uZjUzYTU3ZiAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vc3RyZWUvUGFyZW50LmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vc3RyZWUvUGFyZW50LmphdmEKQEAgLTM2MCw0OSArMzYwLDYgQEAKIAogICAgIG1fbGFzdCA9IGNoaWxkOwogCi0gICAgLy8gZ2V0RG9jdW1lbnRJbXBsKCkuZ2V0TGV2ZWxJbmRleGVyKCkuaW5zZXJ0Tm9kZShjaGlsZCk7Ci0gICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IGNoaWxkLmdldE5vZGVUeXBlKCkpCi0gICAgewotICAgICAgU291cmNlVHJlZUhhbmRsZXIgc2ggPSBkb2MuZ2V0U291cmNlVHJlZUhhbmRsZXIoKTsKLQotICAgICAgaWYgKChudWxsICE9IHNoKSAmJiBzaC5tX3Nob3VsZENoZWNrV2hpdGVzcGFjZSkKLSAgICAgIHsKLSAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyID0gc2guZ2V0VHJhbnNmb3JtZXJJbXBsKCk7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gdHJhbnNmb3JtZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHlsZXNoZWV0Um9vdCBzdHlsZXNoZWV0ID0gdHJhbnNmb3JtZXIuZ2V0U3R5bGVzaGVldCgpOwotCi0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbSA9IChFbGVtZW50SW1wbCkgY2hpbGQ7Ci0gICAgICAgICAgICBpZihudWxsID09IGRvYy5tX3hwYXRoQ29udGV4dCkKLSAgICAgICAgICAgICAgZG9jLm1feHBhdGhDb250ZXh0ID0gbmV3IG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0KGRvYyk7Ci0gICAgICAgICAgICBXaGl0ZVNwYWNlSW5mbyBpbmZvID0KLSAgICAgICAgICAgICAgc3R5bGVzaGVldC5nZXRXaGl0ZVNwYWNlSW5mbyhkb2MubV94cGF0aENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSk7Ci0gICAgICAgICAgICBib29sZWFuIHNob3VsZFN0cmlwOwotCi0gICAgICAgICAgICBpZiAobnVsbCA9PSBpbmZvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzaG91bGRTdHJpcCA9IHNoLmdldFNob3VsZFN0cmlwV2hpdGVzcGFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzaG91bGRTdHJpcCA9IGluZm8uZ2V0U2hvdWxkU3RyaXBTcGFjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzaC5zZXRTaG91bGRTdHJpcFdoaXRlc3BhY2Uoc2hvdWxkU3RyaXApOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gc2UpCi0gICAgICAgICAgewotCi0gICAgICAgICAgICAvLyBUT0RPOiBEaWFnbm9zdGljcwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQogICAgIHJldHVybiBuZXdDaGlsZDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zdHJlZS9Tb3VyY2VUcmVlSGFuZGxlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vc3RyZWUvU291cmNlVHJlZUhhbmRsZXIuamF2YQppbmRleCBlMmZkMmUyLi5lZmFjY2M2IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zdHJlZS9Tb3VyY2VUcmVlSGFuZGxlci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3N0cmVlL1NvdXJjZVRyZWVIYW5kbGVyLmphdmEKQEAgLTY0LDYgKzY0LDggQEAKIAogaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwogCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5ET01CdWlsZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTENoYXJhY3RlclJlY29nbml6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuQm9vbFN0YWNrOwpAQCAtOTIsNiArOTQsNyBAQAogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLkVycm9yTGlzdGVuZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwogCiAKIC8qKgpAQCAtMTEwLDkgKzExMyw5IEBACiAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciBUaGUgdHJhbnNmb3JtZXIgdGhpcyB3aWxsIHVzZSB0byB0cmFuc2Zvcm0gYQogICAgKiBzb3VyY2UgdHJlZSBpbnRvIGEgcmVzdWx0IHRyZWUuCiAgICAqLwotICBwdWJsaWMgU291cmNlVHJlZUhhbmRsZXIoVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyKQorICBwdWJsaWMgU291cmNlVHJlZUhhbmRsZXIoVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBTdHJpbmcgYmFzZVN5c3RlbUlEKQogICB7Ci0gICAgdGhpcyh0cmFuc2Zvcm1lciwgZmFsc2UpOworICAgIHRoaXModHJhbnNmb3JtZXIsIGZhbHNlLCBiYXNlU3lzdGVtSUQpOwogICB9CiAKICAgLyoqCkBAIC0xMjIsNyArMTI1LDggQEAKICAgICogQHBhcmFtIHRyYW5zZm9ybWVyIFRoZSB0cmFuc2Zvcm1lciB0aGlzIHdpbGwgdXNlIHRvIHRyYW5zZm9ybSBhCiAgICAqIHNvdXJjZSB0cmVlIGludG8gYSByZXN1bHQgdHJlZS4KICAgICovCi0gIHB1YmxpYyBTb3VyY2VUcmVlSGFuZGxlcihUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIGJvb2xlYW4gZG9GcmFnbWVudCkKKyAgcHVibGljIFNvdXJjZVRyZWVIYW5kbGVyKFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgYm9vbGVhbiBkb0ZyYWdtZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlU3lzdGVtSUQpCiAgIHsKIC8vICAgIG1faWQgPSBtX2lkQ291bnQrKzsKICAgICBtX3RyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7CkBAIC0xMzEsNiArMTM1LDggQEAKIAogICAgIHhjdHh0LnNldERPTUhlbHBlcihuZXcgU3RyZWVET01IZWxwZXIoKSk7CiAgICAgCisgICAgRFRNTWFuYWdlciBtZ3IgPSBtX3RyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpLmdldERUTU1hbmFnZXIoKTsKKyAgICBEVE0gZHRtOwogICAgIGlmKGRvRnJhZ21lbnQpCiAgICAgewogICAgICAgbV9yb290ID0gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKDEwMjQpOwpAQCAtMTQwLDYgKzE0Niw0MSBAQAogICAgIHsKICAgICAgIG1fcm9vdCA9IG5ldyBEb2N1bWVudEltcGwodGhpcyk7CiAgICAgfQorICAgIERPTVNvdXJjZSBkcyA9IG5ldyBET01Tb3VyY2UobV9yb290LCBiYXNlU3lzdGVtSUQpOworICAgIGR0bSA9IG1nci5nZXREVE0oZHMsIGZhbHNlLCB0cmFuc2Zvcm1lciwgZmFsc2UpOworICAgIAorICAgIG1fRFRNcm9vdCA9IGR0bS5nZXREb2N1bWVudCgpOworCisgICAgbV9pbml0ZWRSb290ID0gZmFsc2U7CisgICAgbV9zaG91bGRDaGVja1doaXRlc3BhY2UgPQorICAgICAgdHJhbnNmb3JtZXIuZ2V0U3R5bGVzaGVldCgpLnNob3VsZENoZWNrV2hpdGVzcGFjZSgpOworICB9CisgIAorICAvKioKKyAgICogQ3JlYXRlIGEgU291cmNlVHJlZUhhbmRsZXIgdGhhdCB3aWxsIHN0YXJ0IGEgdHJhbnNmb3JtYXRpb24gYXMKKyAgICogc29vbiBhcyBhIHN0YXJ0RG9jdW1lbnQgb2NjdXJzLgorICAgKgorICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgVGhlIHRyYW5zZm9ybWVyIHRoaXMgd2lsbCB1c2UgdG8gdHJhbnNmb3JtIGEKKyAgICogc291cmNlIHRyZWUgaW50byBhIHJlc3VsdCB0cmVlLgorICAgKi8KKyAgcHVibGljIFNvdXJjZVRyZWVIYW5kbGVyKFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgRFRNTWFuYWdlciBkdG0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb0ZyYWdtZW50KQorICB7CisvLyAgICBtX2lkID0gbV9pZENvdW50Kys7CisgICAgbV90cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOworCisgICAgWFBhdGhDb250ZXh0IHhjdHh0ID0gdHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCk7CisgICAgeGN0eHQuc2V0RE9NSGVscGVyKG5ldyBTdHJlZURPTUhlbHBlcigpKTsKKyAgICAKKyAgICAgaWYoZG9GcmFnbWVudCkKKyAgICB7CisgICAgICBtX3Jvb3QgPSBuZXcgRG9jdW1lbnRGcmFnbWVudEltcGwoMTAyNCk7CisgICAgICBtX2RvY0ZyYWcgPSAoRG9jdW1lbnRGcmFnbWVudEltcGwpbV9yb290OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbV9yb290ID0gbmV3IERvY3VtZW50SW1wbCh0aGlzKTsKKyAgICB9CiAKICAgICBtX2luaXRlZFJvb3QgPSBmYWxzZTsKICAgICBtX3Nob3VsZENoZWNrV2hpdGVzcGFjZSA9CkBAIC0xNzEsNiArMjEyLDIxIEBACiAgIC8qKiBUaGUgcm9vdCBvZiB0aGUgc291cmNlIGRvY3VtZW50ICAgICAgICAgICovCiAgIHByaXZhdGUgRG9jSW1wbCBtX3Jvb3Q7CiAKKyAgLyoqIFRoZSBEVE0gcm9vdCBmb3IgdGhlIERUTTJET00gKiovCisgIHByaXZhdGUgaW50IG1fRFRNcm9vdDsKKyAgCisgIC8qKiBHZXQgdGhlIERUTSByb290IGZvciB0aGUgRFRNMkRPTSAqKi8KKyAgcHVibGljIGludCBnZXREVE1Sb290KCkKKyAgeworICAgIHJldHVybiBtX0RUTXJvb3Q7CisgIH0KKworICAvKiogU2V0IHRoZSBEVE0gcm9vdCBmb3IgdGhlIERUTTJET00gKiovCisgIHB1YmxpYyB2b2lkIHNldERUTVJvb3QoaW50IHJvb3QpCisgIHsKKyAgICByb290ID0gbV9EVE1yb290OworICB9CisKICAgLyoqIElmIHRoaXMgaXMgbm9uLW51bGwsIHRoZSBmcmFnbWVudCB3aGVyZSB0aGUgbm9kZXMgd2lsbCBiZSBhZGRlZC4gKi8KICAgcHJpdmF0ZSBEb2N1bWVudEZyYWdtZW50IG1fZG9jRnJhZzsKIApAQCAtNDAzLDEwICs0NTksNyBAQAogICAgICAgICAgIH0KICAgICAgICAgfSAKICAgICAgICAgCi0gICAgICAgIGlmKG51bGwgIT0gbV9kb2NGcmFnKQotICAgICAgICAgIG1fdHJhbnNmb3JtZXIuc2V0U291cmNlVHJlZURvY0ZvclRocmVhZChtX2RvY0ZyYWcpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbV90cmFuc2Zvcm1lci5zZXRTb3VyY2VUcmVlRG9jRm9yVGhyZWFkKG1fcm9vdCk7CisgICAgICAgIG1fdHJhbnNmb3JtZXIuc2V0U291cmNlVHJlZURvY0ZvclRocmVhZChtX0RUTXJvb3QpOwogCiAgICAgICAgIFRocmVhZCB0ID0gbV90cmFuc2Zvcm1lci5jcmVhdGVUcmFuc2Zvcm1UaHJlYWQoKTsKIApAQCAtNDE0LDcgKzQ2Nyw3IEBACiAKICAgICAgICAgaW50IGNwcmlvcml0eSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0UHJpb3JpdHkoKTsKIAotICAgICAgICAvLyB0LnNldFByaW9yaXR5KGNwcmlvcml0eS0xKTsKKyAgICAgICAgdC5zZXRQcmlvcml0eShjcHJpb3JpdHktMSk7CiAgICAgICAgIHQuc2V0UHJpb3JpdHkoY3ByaW9yaXR5KTsKICAgICAgICAgdC5zdGFydCgpOwogICAgICAgfQpAQCAtNDUwLDcgKzUwMyw3IEBACiAgICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgbV90cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKG1fcm9vdCk7CisgICAgICAgICAgbV90cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKG1fRFRNcm9vdCk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2goVHJhbnNmb3JtZXJFeGNlcHRpb24gdGUpCiAgICAgICAgIHsKQEAgLTEwMDksNyArMTA2Miw3IEBACiAgICAgCiAgICAgbV9pbnB1dFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFzZUlEKTsKICAgICAKLSAgICBzdG0ucHV0RG9jdW1lbnRJbkNhY2hlKG1fcm9vdCwgbV9pbnB1dFNvdXJjZSk7CisgICAgc3RtLnB1dERvY3VtZW50SW5DYWNoZShtX0RUTXJvb3QsIG1faW5wdXRTb3VyY2UpOwogICB9CiAgIAogICAvKioKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3N0cmVlL1N0cmVlRE9NQnVpbGRlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vc3RyZWUvU3RyZWVET01CdWlsZGVyLmphdmEKaW5kZXggZDAyZTZjYi4uYmI1ODlhOCAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vc3RyZWUvU3RyZWVET01CdWlsZGVyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vc3RyZWUvU3RyZWVET01CdWlsZGVyLmphdmEKQEAgLTIxNyw3ICsyMTcsNiBAQAogICAgIH0KICAgICAKICAgICBhcHBlbmQoZWxlbSk7Ci0KICAgICBtX2VsZW1TdGFjay5wdXNoKGVsZW0pOwogCiAgICAgbV9jdXJyZW50Tm9kZSA9IGVsZW07CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zdHJlZS9TdHJlZURUTU1hbmFnZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3N0cmVlL1N0cmVlRFRNTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YWUwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi9zdHJlZS9TdHJlZURUTU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCisgKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0CisgKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKKyAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi5zdHJlZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1NYW5hZ2VyRGVmYXVsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNV1NGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5kb20yZHRtLkRPTTJEVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuU3lzdGVtSURSZXNvbHZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlRyYW5zZm9ybWVySW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlNvdXJjZVRyZWVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0OworCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUHJlZml4UmVzb2x2ZXI7CisKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZUxvY2F0b3I7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CisKKy8qKgorICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImludGVybmFsIi8+CisgKiBORUVEU0RPQyBDbGFzcyBTdHJlZURUTU1hbmFnZXIgPG5lZWRzLWNvbW1lbnQvPgorICovCitwdWJsaWMgY2xhc3MgU3RyZWVEVE1NYW5hZ2VyIGV4dGVuZHMgRFRNTWFuYWdlckRlZmF1bHQKK3sKKworICAvKioKKyAgICogR2V0IGFuIGluc3RhbmNlIG9mIGEgRFRNLCBsb2FkZWQgd2l0aCB0aGUgY29udGVudCBmcm9tIHRoZQorICAgKiBzcGVjaWZpZWQgc291cmNlLiAgSWYgdGhlIHVuaXF1ZSBmbGFnIGlzIHRydWUsIGEgbmV3IGluc3RhbmNlIHdpbGwKKyAgICogYWx3YXlzIGJlIHJldHVybmVkLiAgT3RoZXJ3aXNlIGl0IGlzIHVwIHRvIHRoZSBEVE1NYW5hZ2VyIHRvIHJldHVybiBhCisgICAqIG5ldyBpbnN0YW5jZSBvciBhbiBpbnN0YW5jZSB0aGF0IGl0IGFscmVhZHkgY3JlYXRlZCBhbmQgbWF5IGJlIGJlaW5nIHVzZWQKKyAgICogYnkgc29tZW9uZSBlbHNlLgorICAgKiAoSSB0aGluayBtb3JlIHBhcmFtZXRlcnMgd2lsbCBuZWVkIHRvIGJlIGFkZGVkIGZvciBlcnJvciBoYW5kbGluZywgYW5kIGVudGl0eQorICAgKiByZXNvbHV0aW9uKS4KKyAgICoKKyAgICogQHBhcmFtIHNvdXJjZSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc291cmNlIG9iamVjdC4KKyAgICogQHBhcmFtIHVuaXF1ZSB0cnVlIGlmIHRoZSByZXR1cm5lZCBEVE0gbXVzdCBiZSB1bmlxdWUsIHByb2JhYmx5IGJlY2F1c2UgaXQKKyAgICogaXMgZ29pbmcgdG8gYmUgbXV0YXRlZC4KKyAgICogQHBhcmFtIHdoaXRlU3BhY2VGaWx0ZXIgRW5hYmxlcyBmaWx0ZXJpbmcgb2Ygd2hpdGVzcGFjZSBub2RlcywgYW5kIG1heQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBudWxsLgorICAgKgorICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgRFRNIHJlZmVyZW5jZS4KKyAgICovCisgIHB1YmxpYyBEVE0gZ2V0RFRNKFNvdXJjZSBzb3VyY2UsIGJvb2xlYW4gdW5pcXVlLAorICAgICAgICAgICAgICAgICAgICBEVE1XU0ZpbHRlciB3aGl0ZVNwYWNlRmlsdGVyKQorICB7CisKKyAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkluIFN0cmVlRFRNTWFuYWdlciIpOworICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBET01Tb3VyY2UpCisgICAgeworICAgICAgcmV0dXJuIHN1cGVyLmdldERUTShzb3VyY2UsIHVuaXF1ZSwgd2hpdGVTcGFjZUZpbHRlciwgZmFsc2UpOworICAgIH0KKyAgICBlbHNlIGlmICh3aGl0ZVNwYWNlRmlsdGVyIGluc3RhbmNlb2YgVHJhbnNmb3JtZXJJbXBsKQorICAgIHsKKyAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciA9IChUcmFuc2Zvcm1lckltcGwpIHdoaXRlU3BhY2VGaWx0ZXI7CisgICAgICBYUGF0aENvbnRleHQgeGN0eHQgPSB0cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKTsKKyAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBnZXRYTUxSZWFkZXIoc291cmNlLCB4Y3R4dC5nZXRTQVhMb2NhdG9yKCkpOworCisgICAgICAvLyBHZXQgdGhlIGlucHV0IGNvbnRlbnQgaGFuZGxlciwgd2hpY2ggd2lsbCBoYW5kbGUgdGhlIAorICAgICAgLy8gcGFyc2UgZXZlbnRzIGFuZCBjcmVhdGUgdGhlIHNvdXJjZSB0cmVlLiAKKyAgICAgIC8vIENvbnRlbnRIYW5kbGVyIGlucHV0SGFuZGxlciA9IHRyYW5zZm9ybWVyLmdldElucHV0Q29udGVudEhhbmRsZXIoKTsKKyAgICAgIC8vIFNvdXJjZVRyZWVIYW5kbGVyIHN0aCA9IG5ldyBTb3VyY2VUcmVlSGFuZGxlcih0cmFuc2Zvcm1lciwgdGhpcywgZmFsc2UpOworICAgICAgLy8gc3RoLnNldFVzZU11bHRpVGhyZWFkaW5nKHRydWUpOworICAgICAgU291cmNlVHJlZUhhbmRsZXIgc3RoID0gbmV3IFNvdXJjZVRyZWVIYW5kbGVyKCk7CisgICAgICBzdGguc2V0VXNlTXVsdGlUaHJlYWRpbmcoZmFsc2UpOworICAgICAgCisgICAgICAvLyB0cmFuc2Zvcm1lci5zZXRJc1RyYW5zZm9ybURvbmUoZmFsc2UpOworICAgICAgSW5wdXRTb3VyY2UgeG1sU291cmNlID0gU0FYU291cmNlLnNvdXJjZVRvSW5wdXRTb3VyY2Uoc291cmNlKTsKKworICAgICAgU3RyaW5nIHVybE9mU291cmNlID0geG1sU291cmNlLmdldFN5c3RlbUlkKCk7CisKKyAgICAgIGlmIChudWxsICE9IHVybE9mU291cmNlKQorICAgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgIHVybE9mU291cmNlID0gU3lzdGVtSURSZXNvbHZlci5nZXRBYnNvbHV0ZVVSSSh1cmxPZlNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisKKyAgICAgICAgICAvLyAlUkVWSUVXJSBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gc2VuZCBhIHdhcm5pbmc/CisgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYW4gbm90IGFic29sdXRpemUgVVJMOiAiICsgdXJsT2ZTb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgeG1sU291cmNlLnNldFN5c3RlbUlkKHVybE9mU291cmNlKTsKKyAgICAgIH0KKworICAgICAgaW50IGRvY3VtZW50SUQgPSBtX2R0bXMuc2l6ZSgpIDw8IDIwOworICAgICAgRE9NU291cmNlIGRzID0gbmV3IERPTVNvdXJjZShzdGguZ2V0Um9vdCgpLCB4bWxTb3VyY2UuZ2V0U3lzdGVtSWQoKSk7CisgICAgICBEVE0gZHRtID0gbmV3IERPTTJEVE0odGhpcywgZHMsIGRvY3VtZW50SUQsIHdoaXRlU3BhY2VGaWx0ZXIsIAorICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YTUxTdHJpbmdGYWN0b3J5SW1wbC5nZXRGYWN0b3J5KCkpOworICAgICAgaW50IGRvYyA9IHN0aC5nZXREVE1Sb290KCk7CisgICAgICBtX2R0bXMuYWRkKGR0bSk7CisgICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoc3RoKTsKKworICAgICAgaWYgKHN0aCBpbnN0YW5jZW9mIG9yZy54bWwuc2F4LkRUREhhbmRsZXIpCisgICAgICAgIHJlYWRlci5zZXREVERIYW5kbGVyKHN0aCk7CisKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGgpOworICAgICAgfQorICAgICAgY2F0Y2ggKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzbnJlKXt9CisKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICByZWFkZXIuc2V0UHJvcGVydHkoCisgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2RlY2xhcmF0aW9uLWhhbmRsZXIiLCBzdGgpOworICAgICAgfQorICAgICAgY2F0Y2ggKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzZSl7fQorCisgICAgICB0cnkKKyAgICAgIHsKKyAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvaGFuZGxlcnMvTGV4aWNhbEhhbmRsZXIiLCBzdGgpOworICAgICAgfQorICAgICAgY2F0Y2ggKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzZSl7fQorCisgICAgICB0cnkKKyAgICAgIHsKKyAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvaGFuZGxlcnMvRGVjbEhhbmRsZXIiLCBzdGgpOworICAgICAgfQorICAgICAgY2F0Y2ggKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzZSl7fQorCisgICAgICAvLyBTZXQgdGhlIHJlYWRlciBmb3IgY2xvbmluZyBwdXJwb3Nlcy4KKyAgICAgIC8vIHRyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpLnNldFByaW1hcnlSZWFkZXIocmVhZGVyKTsKKyAgICAgIC8vIHRyYW5zZm9ybWVyLnNldEV4Y2VwdGlvblRocm93bihudWxsKTsKKyAgICAgIAorICAgICAgc3RoLnNldElucHV0U291cmNlKHNvdXJjZSk7CisKKyAgICAgIGlmIChEVE0uTlVMTCAhPSBkb2MpCisgICAgICB7CisgICAgICAgIFNvdXJjZVRyZWVNYW5hZ2VyIHN0bSA9CisgICAgICAgICAgdHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCkuZ2V0U291cmNlVHJlZU1hbmFnZXIoKTsKKworICAgICAgICAvLyBzdG0ucHV0RG9jdW1lbnRJbkNhY2hlKGRvYywgc291cmNlKTsKKyAgICAgICAgLy8gdHJhbnNmb3JtZXIuc2V0WE1MU291cmNlKHNvdXJjZSk7CisKKyAgICAgICAgaWYgKG51bGwgPT0geG1sU291cmNlKQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZDogIiArIHNvdXJjZSk7CisgICAgICAgIH0KKworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgcmVhZGVyLnBhcnNlKHhtbFNvdXJjZSk7CisKKyAgICAgICAgICByZXR1cm4gZHRtOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQ6ICIgKyBzb3VyY2UpOworICAgIH0KKworICAgIHJldHVybiBudWxsOworCisgIH0KKworICAvKioKKyAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgU0FYMiBwYXJzZXIgdG8gdXNlIHdpdGggdGhlIElucHV0U291cmNlCisgICAqIG9idGFpbmVkIGZyb20gdGhpcyBVUkkuCisgICAqIEl0IG1heSByZXR1cm4gbnVsbCBpZiBhbnkgU0FYMi1jb25mb3JtYW50IFhNTCBwYXJzZXIgY2FuIGJlIHVzZWQsCisgICAqIG9yIGlmIGdldElucHV0U291cmNlKCkgd2lsbCBhbHNvIHJldHVybiBudWxsLiBUaGUgcGFyc2VyIG11c3QKKyAgICogYmUgZnJlZSBmb3IgdXNlIChpLmUuCisgICAqIG5vdCBjdXJyZW50bHkgaW4gdXNlIGZvciBhbm90aGVyIHBhcnNlKCkuCisgICAqCisgICAqIEBwYXJhbSBpbnB1dFNvdXJjZSBUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgVVJJUmVzb2x2ZXIuCisgICAqIEByZXR1cm5zIGEgU0FYMiBYTUxSZWFkZXIgdG8gdXNlIHRvIHJlc29sdmUgdGhlIGlucHV0U291cmNlIGFyZ3VtZW50LgorICAgKiBAcGFyYW0gbG9jYXRvciBUaGUgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIGNhbGxlciwgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuCisgICAqCisgICAqIEByZXR1cm4gbm9uLW51bGwgWE1MUmVhZGVyIHJlZmVyZW5jZSByZWFkeSB0byBwYXJzZS4KKyAgICovCisgIHB1YmxpYyBYTUxSZWFkZXIgZ2V0WE1MUmVhZGVyKFNvdXJjZSBpbnB1dFNvdXJjZSwgU291cmNlTG9jYXRvciBsb2NhdG9yKQorICB7CisKKyAgICB0cnkKKyAgICB7CisgICAgICBYTUxSZWFkZXIgcmVhZGVyID0gKGlucHV0U291cmNlIGluc3RhbmNlb2YgU0FYU291cmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgID8gKChTQVhTb3VyY2UpIGlucHV0U291cmNlKS5nZXRYTUxSZWFkZXIoKSA6IG51bGw7CisKKyAgICAgIGlmIChudWxsID09IHJlYWRlcikKKyAgICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPQorICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciBqYXhwUGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKKworICAgICAgICAgIHJlYWRlciA9IGpheHBQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBleDEpCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKGV4MS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZXgyKXt9CisgICAgICAgIGNhdGNoIChBYnN0cmFjdE1ldGhvZEVycm9yIGFtZSl7fQorCisgICAgICAgIGlmIChudWxsID09IHJlYWRlcikKKyAgICAgICAgICByZWFkZXIgPSBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOworICAgICAgfQorCisgICAgICB0cnkKKyAgICAgIHsKKyAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL2R5bmFtaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gc2UpCisgICAgICB7CisKKyAgICAgICAgLy8gV2hhdCBjYW4gd2UgZG8/CisgICAgICAgIC8vIFRPRE86IFVzZXIgZGlhZ25vc3RpY3MuCisgICAgICB9CisKKyAgICAgIHJldHVybiByZWFkZXI7CisgICAgfQorICAgIGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gc2UpCisgICAgeworICAgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihzZS5nZXRNZXNzYWdlKCksIGxvY2F0b3IsIHNlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9BVlQuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9BVlQuamF2YQppbmRleCA1NjljYzA2Li42NGNhMWI0IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvQVZULmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0FWVC5qYXZhCkBAIC01Niw3ICs1Niw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CkBAIC00OTgsNyArNDk4LDcgQEAKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgU3RyaW5nIGV2YWx1YXRlKAotICAgICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCwgTm9kZSBjb250ZXh0LCBvcmcuYXBhY2hlLnhtbC51dGlscy5QcmVmaXhSZXNvbHZlciBuc05vZGUpCisgICAgICAgICAgWFBhdGhDb250ZXh0IHhjdHh0LCBpbnQgY29udGV4dCwgb3JnLmFwYWNoZS54bWwudXRpbHMuUHJlZml4UmVzb2x2ZXIgbnNOb2RlKQogICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvQVZUUGFydC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0FWVFBhcnQuamF2YQppbmRleCAxZGI4ODcyLi40ZjhiODc5IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvQVZUUGFydC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9BVlRQYXJ0LmphdmEKQEAgLTU2LDcgKzU2LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLio7CisvL2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5GYXN0U3RyaW5nQnVmZmVyOwpAQCAtOTQsNyArOTUsNyBAQAogICAgKiBAdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGV2YWx1YXRlKAotICAgIFhQYXRoQ29udGV4dCB4Y3R4dCwgRmFzdFN0cmluZ0J1ZmZlciBidWYsIE5vZGUgY29udGV4dCwKKyAgICBYUGF0aENvbnRleHQgeGN0eHQsIEZhc3RTdHJpbmdCdWZmZXIgYnVmLCBpbnQgY29udGV4dCwKICAgICAgIG9yZy5hcGFjaGUueG1sLnV0aWxzLlByZWZpeFJlc29sdmVyIG5zTm9kZSkKICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9BVlRQYXJ0U2ltcGxlLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvQVZUUGFydFNpbXBsZS5qYXZhCmluZGV4IDJhMDQ1OWEuLmQ1NjI1ZmIgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9BVlRQYXJ0U2ltcGxlLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0FWVFBhcnRTaW1wbGUuamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLio7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5GYXN0U3RyaW5nQnVmZmVyOwpAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAqIEBwYXJhbSBOb2RlTGlzdCBUaGUgY3VycmVudCBDb250ZXh0IE5vZGUgTGlzdC4KICAgICovCiAgIHB1YmxpYyB2b2lkIGV2YWx1YXRlKFhQYXRoQ29udGV4dCB4Y3R4dCwgRmFzdFN0cmluZ0J1ZmZlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgIE5vZGUgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUueG1sLnV0aWxzLlByZWZpeFJlc29sdmVyIG5zTm9kZSkKICAgewogICAgIGJ1Zi5hcHBlbmQobV92YWwpOwpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0FWVFBhcnRYUGF0aC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0FWVFBhcnRYUGF0aC5qYXZhCmluZGV4IDk3YmM3MTguLjgzN2FlMDggMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9BVlRQYXJ0WFBhdGguamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvQVZUUGFydFhQYXRoLmphdmEKQEAgLTYyLDcgKzYyLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLmNvbXBpbGVyLlhQYXRoUGFyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLkZhc3RTdHJpbmdCdWZmZXI7CiAKLWltcG9ydCBvcmcudzNjLmRvbS4qOworLy9pbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiAvKioKICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgpAQCAtMTUwLDcgKzE1MSw3IEBACiAgICAqIEB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZXZhbHVhdGUoCi0gICAgICAgICAgWFBhdGhDb250ZXh0IHhjdHh0LCBGYXN0U3RyaW5nQnVmZmVyIGJ1ZiwgTm9kZSBjb250ZXh0LCBvcmcuYXBhY2hlLnhtbC51dGlscy5QcmVmaXhSZXNvbHZlciBuc05vZGUpCisgICAgICAgICAgWFBhdGhDb250ZXh0IHhjdHh0LCBGYXN0U3RyaW5nQnVmZmVyIGJ1ZiwgaW50IGNvbnRleHQsIG9yZy5hcGFjaGUueG1sLnV0aWxzLlByZWZpeFJlc29sdmVyIG5zTm9kZSkKICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIApAQCAtMTU4LDcgKzE1OSw3IEBACiAKICAgICBpZiAobnVsbCAhPSB4b2JqKQogICAgIHsKLSAgICAgIGJ1Zi5hcHBlbmQoeG9iai5zdHIoKSk7CisgICAgICB4b2JqLmFwcGVuZFRvRnNiKGJ1Zik7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUFwcGx5SW1wb3J0LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUFwcGx5SW1wb3J0LmphdmEKaW5kZXggYmUwZmNkMC4uNDUzNzQzZSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1BcHBseUltcG9ydC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQXBwbHlJbXBvcnQuamF2YQpAQCAtNTYsOCArNTYsOSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwogCkBAIC0xMDcsNyArMTA4LDcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZXhlY3V0ZSgKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCkBAIC0xMTgsMTQgKzExOSwxNSBAQAogICAgIH0KIAogICAgIGlmIChUcmFuc2Zvcm1lckltcGwuU19ERUJVRykKLSAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHNvdXJjZU5vZGUsIG1vZGUsIHRoaXMpOworICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQodGhpcyk7CiAKLSAgICBpZiAobnVsbCAhPSBzb3VyY2VOb2RlKQorICAgIGludCBzb3VyY2VOb2RlID0gdHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCkuZ2V0Q3VycmVudE5vZGUoKTsKKyAgICBpZiAoRFRNLk5VTEwgIT0gc291cmNlTm9kZSkKICAgICB7CiAKICAgICAgIC8vIFRoaXMgd2lsbCBoYXZlIHRvIGNoYW5nZSB0byBjdXJyZW50IHRlbXBsYXRlLCAod2hpY2ggd2lsbCBoYXZlIAogICAgICAgLy8gdG8gYmUgdGhlIHRvcCBvZiBhIGN1cnJlbnQgdGVtcGxhdGUgc3RhY2spLgotICAgICAgdHJhbnNmb3JtZXIuYXBwbHlUZW1wbGF0ZVRvTm9kZSh0aGlzLCBudWxsLCBzb3VyY2VOb2RlLCBtb2RlKTsKKyAgICAgIHRyYW5zZm9ybWVyLmFwcGx5VGVtcGxhdGVUb05vZGUodGhpcywgbnVsbCwgc291cmNlTm9kZSk7CiAgICAgfQogICAgIGVsc2UgIC8vIGlmKG51bGwgPT0gc291cmNlTm9kZSkKICAgICB7CkBAIC0xNDEsMTAgKzE0Myw4IEBACiAgICAqIEBwYXJhbSBuZXdDaGlsZCBOZXcgZWxlbWVudCB0byBhcHBlbmQgdG8gdGhpcyBlbGVtZW50J3MgY2hpbGRyZW4gbGlzdAogICAgKgogICAgKiBAcmV0dXJuIG51bGwsIHhzbDphcHBseS1JbXBvcnRzIGNhbm5vdCBoYXZlIGNoaWxkcmVuIAotICAgKgotICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbgorICBwdWJsaWMgRWxlbVRlbXBsYXRlRWxlbWVudCBhcHBlbmRDaGlsZChFbGVtVGVtcGxhdGVFbGVtZW50IG5ld0NoaWxkKQogICB7CiAKICAgICBlcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJfQ0FOTk9UX0FERCwKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQXBwbHlUZW1wbGF0ZXMuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQXBwbHlUZW1wbGF0ZXMuamF2YQppbmRleCA4NmExZDBhLi5mYmQ1MzViIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUFwcGx5VGVtcGxhdGVzLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1BcHBseVRlbXBsYXRlcy5qYXZhCkBAIC01Niw3ICs1Niw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS4qOworLy9pbXBvcnQgb3JnLnczYy5kb20uKjsKIAogaW1wb3J0IG9yZy54bWwuc2F4Lio7CiAKQEAgLTE3MCwzNiArMTcwLDQ3IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAogICAgIHRyYW5zZm9ybWVyLnB1c2hDdXJyZW50VGVtcGxhdGVSdWxlSXNOdWxsKGZhbHNlKTsKIAorICAgIGJvb2xlYW4gcHVzaE1vZGUgPSBmYWxzZTsKKyAgICAKICAgICB0cnkKICAgICB7CiAgICAgICBpZiAoVHJhbnNmb3JtZXJJbXBsLlNfREVCVUcpCi0gICAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHNvdXJjZU5vZGUsIG1vZGUsIHRoaXMpOwotCi0gICAgICBpZiAobnVsbCAhPSBzb3VyY2VOb2RlKQotICAgICAgewotCisgICAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHRoaXMpOworICAgICAgICAKKyAgICAgICAgLy8gJVJFVklFVyUgRG8gd2UgbmVlZCB0aGlzIGNoZWNrPz8KKy8vICAgICAgaWYgKG51bGwgIT0gc291cmNlTm9kZSkKKy8vICAgICAgeworICAgICAgICAgIAogICAgICAgICAvLyBib29sZWFuIG5lZWRUb1R1cm5PZmZJbmZpbml0ZUxvb3BDaGVjayA9IGZhbHNlOworICAgICAgICBRTmFtZSBtb2RlID0gdHJhbnNmb3JtZXIuZ2V0TW9kZSgpOwogICAgICAgICBpZiAoIW1faXNEZWZhdWx0VGVtcGxhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICBtb2RlID0gbV9tb2RlOworICAgICAgICAgIGlmKCgobnVsbCA9PSBtb2RlKSAmJiAobnVsbCAhPSBtX21vZGUpICkgfHwKKyAgICAgICAgICAgICAgKChudWxsICE9IG1vZGUpICYmICFtb2RlLmVxdWFscyhtX21vZGUpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoTW9kZSA9IHRydWU7CisgICAgICAgICAgICB0cmFuc2Zvcm1lci5wdXNoTW9kZShtX21vZGUpOworICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHRyYW5zZm9ybVNlbGVjdGVkTm9kZXModHJhbnNmb3JtZXIsIHNvdXJjZU5vZGUsIG51bGwsIG1vZGUpOwotICAgICAgfQotICAgICAgZWxzZSAgLy8gaWYobnVsbCA9PSBzb3VyY2VOb2RlKQotICAgICAgewotICAgICAgICB0cmFuc2Zvcm1lci5nZXRNc2dNZ3IoKS5lcnJvcih0aGlzLAotICAgICAgICAgIFhTTFRFcnJvclJlc291cmNlcy5FUl9OVUxMX1NPVVJDRU5PREVfSEFORExFQVBQTFlURU1QTEFURVMpOyAgLy8ic291cmNlTm9kZSBpcyBudWxsIGluIGhhbmRsZUFwcGx5VGVtcGxhdGVzSW5zdHJ1Y3Rpb24hIik7Ci0gICAgICB9CisgICAgICAgIHRyYW5zZm9ybVNlbGVjdGVkTm9kZXModHJhbnNmb3JtZXIsIG51bGwpOworLy8gICAgICB9CisvLyAgICAgIGVsc2UgIC8vIGlmKG51bGwgPT0gc291cmNlTm9kZSkKKy8vICAgICAgeworLy8gICAgICAgIHRyYW5zZm9ybWVyLmdldE1zZ01ncigpLmVycm9yKHRoaXMsCisvLyAgICAgICAgICBYU0xURXJyb3JSZXNvdXJjZXMuRVJfTlVMTF9TT1VSQ0VOT0RFX0hBTkRMRUFQUExZVEVNUExBVEVTKTsgIC8vInNvdXJjZU5vZGUgaXMgbnVsbCBpbiBoYW5kbGVBcHBseVRlbXBsYXRlc0luc3RydWN0aW9uISIpOworLy8gICAgICB9CiAgICAgfQogICAgIGZpbmFsbHkKICAgICB7CisgICAgICBpZihwdXNoTW9kZSkKKyAgICAgICAgdHJhbnNmb3JtZXIucG9wTW9kZSgpOwogICAgICAgdHJhbnNmb3JtZXIucG9wQ3VycmVudFRlbXBsYXRlUnVsZUlzTnVsbCgpOwogICAgIH0KICAgfQpAQCAtMjMxLDcgKzI0Miw3IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIGludCBwdXNoUGFyYW1zKAotICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgWFBhdGhDb250ZXh0IHhjdHh0LCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBYUGF0aENvbnRleHQgeGN0eHQpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCkBAIC0yNDAsOCArMjUxLDggQEAKICAgICAKICAgICBpZiAobnVsbCAhPSBtX3BhcmFtRWxlbXMpCiAgICAgeyAgCi0gICAgICB0cmFuc2Zvcm1lci5wdXNoUGFyYW1zKHhjdHh0LCB0aGlzLCBzb3VyY2VOb2RlLCBtb2RlKTsKLSAgICAgfSAgCisgICAgICB0cmFuc2Zvcm1lci5wdXNoUGFyYW1zKHhjdHh0LCB0aGlzKTsKKyAgICB9ICAKICAgICBlbHNlCiAgICAgICB2YXJzLnB1c2hDb250ZXh0TWFya2VyKCk7CiAgICAgCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUF0dHJpYnV0ZS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1BdHRyaWJ1dGUuamF2YQppbmRleCAxZjk4YmJiLi5lMzZiODg4IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUF0dHJpYnV0ZS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQXR0cmlidXRlLmphdmEKQEAgLTU2LDggKzU2LDkgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKIApAQCAtMTE4LDcgKzExOSw3IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKICAgICBSZXN1bHRUcmVlSGFuZGxlciByaGFuZGxlciA9IHRyYW5zZm9ybWVyLmdldFJlc3VsdFRyZWVIYW5kbGVyKCk7CkBAIC0xMjksOSArMTMwLDEwIEBACiAgICAgewogICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0cmFjZSBldmVudCBpcyBzZW50LgogICAgICAgaWYgKFRyYW5zZm9ybWVySW1wbC5TX0RFQlVHKQotICAgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudChzb3VyY2VOb2RlLCBtb2RlLCB0aGlzKTsKKyAgICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQodGhpcyk7CiAKICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCA9IHRyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpOworICAgICAgaW50IHNvdXJjZU5vZGUgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOwogICAgICAgU3RyaW5nIGF0dHJOYW1lID0gbV9uYW1lX2F2dC5ldmFsdWF0ZSh4Y3R4dCwgc291cmNlTm9kZSwgdGhpcyk7CiAgICAgICB0cmFuc2Zvcm1lci5nZXRNc2dNZ3IoKS53YXJuKHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTTFRFcnJvclJlc291cmNlcy5XR19JTExFR0FMX0FUVFJJQlVURSwKQEAgLTE0Miw3ICsxNDQsNyBAQAogICAgICAgLy8gd2Fybih0ZW1wbGF0ZUNoaWxkLCBzb3VyY2VOb2RlLCAiVHJ5aW5nIHRvIGFkZCBhdHRyaWJ1dGUgYWZ0ZXIgZWxlbWVudCBjaGlsZCBoYXMgYmVlbiBhZGRlZCwgaWdub3JpbmcuLi4iKTsKICAgICB9CiAgICAgCi0gICAgc3VwZXIuZXhlY3V0ZSh0cmFuc2Zvcm1lciwgc291cmNlTm9kZSwgbW9kZSk7CisgICAgc3VwZXIuZXhlY3V0ZSh0cmFuc2Zvcm1lcik7CiAgICAgCiAgIH0KICAgCkBAIC0yMTEsNyArMjEzLDcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgdm9pZCBjb25zdHJ1Y3ROb2RlKAotICAgICAgICAgIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5vZGVOYW1lc3BhY2UsIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlKQorICAgICAgICAgIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5vZGVOYW1lc3BhY2UsIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lcikKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKQEAgLTIyOSw3ICsyMzEsNyBAQAogICAgICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihzZSk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIFN0cmluZyB2YWwgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ub1N0cmluZyh0aGlzLCBzb3VyY2VOb2RlLCBtb2RlKTsKKyAgICAgIFN0cmluZyB2YWwgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ub1N0cmluZyh0aGlzKTsKICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBRTmFtZS5nZXRMb2NhbFBhcnQobm9kZU5hbWUpOwogICAgICAgcmhhbmRsZXIuYWRkQXR0cmlidXRlKG5vZGVOYW1lc3BhY2UsIGxvY2FsTmFtZSwgbm9kZU5hbWUsICJDREFUQSIsIHZhbCk7CiAgICAgfQpAQCAtMjUxLDcgKzI1Myw3IEBACiAgICAqCiAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHB1YmxpYyBFbGVtVGVtcGxhdGVFbGVtZW50IGFwcGVuZENoaWxkKEVsZW1UZW1wbGF0ZUVsZW1lbnQgbmV3Q2hpbGQpCiAgIHsKIAogICAgIGludCB0eXBlID0gKChFbGVtVGVtcGxhdGVFbGVtZW50KSBuZXdDaGlsZCkuZ2V0WFNMVG9rZW4oKTsKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQXR0cmlidXRlU2V0LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUF0dHJpYnV0ZVNldC5qYXZhCmluZGV4IGExZjYyMTguLmQzOWZlMzUgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQXR0cmlidXRlU2V0LmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1BdHRyaWJ1dGVTZXQuamF2YQpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIApAQCAtMTU2LDE1ICsxNTYsMTUgQEAKICAgICB9CiAKICAgICB0cmFuc2Zvcm1lci5wdXNoRWxlbUF0dHJpYnV0ZVNldCh0aGlzKTsKLSAgICBzdXBlci5leGVjdXRlKHRyYW5zZm9ybWVyLCBzb3VyY2VOb2RlLCBtb2RlKTsKKyAgICBzdXBlci5leGVjdXRlKHRyYW5zZm9ybWVyKTsKIAotICAgIEVsZW1BdHRyaWJ1dGUgYXR0ciA9IChFbGVtQXR0cmlidXRlKSBnZXRGaXJzdENoaWxkKCk7CisgICAgRWxlbUF0dHJpYnV0ZSBhdHRyID0gKEVsZW1BdHRyaWJ1dGUpIGdldEZpcnN0Q2hpbGRFbGVtKCk7CiAKICAgICB3aGlsZSAobnVsbCAhPSBhdHRyKQogICAgIHsKLSAgICAgIGF0dHIuZXhlY3V0ZSh0cmFuc2Zvcm1lciwgc291cmNlTm9kZSwgbW9kZSk7CisgICAgICBhdHRyLmV4ZWN1dGUodHJhbnNmb3JtZXIpOwogCi0gICAgICBhdHRyID0gKEVsZW1BdHRyaWJ1dGUpIGF0dHIuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgIGF0dHIgPSAoRWxlbUF0dHJpYnV0ZSkgYXR0ci5nZXROZXh0U2libGluZ0VsZW0oKTsKICAgICB9CiAKICAgICB0cmFuc2Zvcm1lci5wb3BFbGVtQXR0cmlidXRlU2V0KCk7CkBAIC0xODQsNyArMTg0LDcgQEAKICAgICoKICAgICogQHRocm93cyBET01FeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbmV3Q2hpbGQpIHRocm93cyBET01FeGNlcHRpb24KKyAgcHVibGljIEVsZW1UZW1wbGF0ZUVsZW1lbnQgYXBwZW5kQ2hpbGRFbGVtKEVsZW1UZW1wbGF0ZUVsZW1lbnQgbmV3Q2hpbGQpCiAgIHsKIAogICAgIGludCB0eXBlID0gKChFbGVtVGVtcGxhdGVFbGVtZW50KSBuZXdDaGlsZCkuZ2V0WFNMVG9rZW4oKTsKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQ2FsbFRlbXBsYXRlLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUNhbGxUZW1wbGF0ZS5qYXZhCmluZGV4IDZjN2MwODguLmQzYmEyNzEgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQ2FsbFRlbXBsYXRlLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1DYWxsVGVtcGxhdGUuamF2YQpAQCAtMTcwLDEyICsxNzAsMTIgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZXhlY3V0ZSgKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCiAgICAgaWYgKFRyYW5zZm9ybWVySW1wbC5TX0RFQlVHKQotICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQoc291cmNlTm9kZSwgbW9kZSwgdGhpcyk7CisgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudCh0aGlzKTsKIAogICAgIGlmIChudWxsICE9IG1fdGVtcGxhdGUpCiAgICAgewpAQCAtMTg1LDcgKzE4NSw3IEBACiAgICAgICBpbnQgc2F2ZWRTZWFyY2hTdGFydCA9IHZhcnMuZ2V0U2VhcmNoU3RhcnQoKTsKIAogICAgICAgaWYgKG51bGwgIT0gbV9wYXJhbUVsZW1zKQotICAgICAgICB0cmFuc2Zvcm1lci5wdXNoUGFyYW1zKHhjdHh0LCB0aGlzLCBzb3VyY2VOb2RlLCBtb2RlKTsKKyAgICAgICAgdHJhbnNmb3JtZXIucHVzaFBhcmFtcyh4Y3R4dCwgdGhpcyk7CiAgICAgICBlbHNlCiAgICAgICAgIHZhcnMucHVzaENvbnRleHRNYXJrZXIoKTsKICAgICAgIApAQCAtMTk5LDcgKzE5OSw3IEBACiAKICAgICAgICAgLy8gdGVtcGxhdGUuZXhlY3V0ZUNoaWxkVGVtcGxhdGVzKHRyYW5zZm9ybWVyLCBzb3VyY2VOb2RlLCBtb2RlLCB0cnVlKTsKICAgICAgICAgdHJhbnNmb3JtZXIucHVzaEVsZW1UZW1wbGF0ZUVsZW1lbnQobV90ZW1wbGF0ZSk7Ci0gICAgICAgIG1fdGVtcGxhdGUuZXhlY3V0ZSh0cmFuc2Zvcm1lciwgc291cmNlTm9kZSwgbW9kZSk7CisgICAgICAgIG1fdGVtcGxhdGUuZXhlY3V0ZSh0cmFuc2Zvcm1lcik7CiAgICAgICB9CiAgICAgICBmaW5hbGx5CiAgICAgICB7CkBAIC0yNjksNyArMjY5LDcgQEAKICAgICoKICAgICogQHRocm93cyBET01FeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbmV3Q2hpbGQpIHRocm93cyBET01FeGNlcHRpb24KKyAgcHVibGljIEVsZW1UZW1wbGF0ZUVsZW1lbnQgYXBwZW5kQ2hpbGQoRWxlbVRlbXBsYXRlRWxlbWVudCBuZXdDaGlsZCkKICAgewogCiAgICAgaW50IHR5cGUgPSAoKEVsZW1UZW1wbGF0ZUVsZW1lbnQpIG5ld0NoaWxkKS5nZXRYU0xUb2tlbigpOwpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1DaG9vc2UuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQ2hvb3NlLmphdmEKaW5kZXggNmNhMjAwOS4uOGE3YjIyNSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1DaG9vc2UuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUNob29zZS5qYXZhCkBAIC01Niw3ICs1Niw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS4qOworLy9pbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguKjsKIApAQCAtMTE5LDEyICsxMjAsMTIgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZXhlY3V0ZSgKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCiAgICAgaWYgKFRyYW5zZm9ybWVySW1wbC5TX0RFQlVHKQotICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQoc291cmNlTm9kZSwgbW9kZSwgdGhpcyk7CisgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudCh0aGlzKTsKIAogICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKIApAQCAtMTQwLDYgKzE0MSw4IEBACiAgICAgICAgIEVsZW1XaGVuIHdoZW4gPSAoRWxlbVdoZW4pIGNoaWxkRWxlbTsKIAogICAgICAgICAvLyBtdXN0IGJlIHhzbDp3aGVuCisgICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCA9IHRyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpOworICAgICAgICBpbnQgc291cmNlTm9kZSA9IHhjdHh0LmdldEN1cnJlbnROb2RlKCk7CiAgICAgICAgIFhPYmplY3QgdGVzdCA9IHdoZW4uZ2V0VGVzdCgpLmV4ZWN1dGUodHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZSwgdGhpcyk7CiAKQEAgLTE0OSw3ICsxNTIsNyBAQAogCiAgICAgICAgIGlmICgobnVsbCAhPSB0ZXN0KSAmJiB0ZXN0LmJvb2woKSkKICAgICAgICAgewotICAgICAgICAgIHRyYW5zZm9ybWVyLmV4ZWN1dGVDaGlsZFRlbXBsYXRlcyh3aGVuLCBzb3VyY2VOb2RlLCBtb2RlLCB0cnVlKTsKKyAgICAgICAgICB0cmFuc2Zvcm1lci5leGVjdXRlQ2hpbGRUZW1wbGF0ZXMod2hlbiwgdHJ1ZSk7CiAKICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTE1OSw3ICsxNjIsNyBAQAogICAgICAgICBmb3VuZCA9IHRydWU7CiAKICAgICAgICAgLy8geHNsOm90aGVyd2lzZSAgICAgICAgICAgICAgICAKLSAgICAgICAgdHJhbnNmb3JtZXIuZXhlY3V0ZUNoaWxkVGVtcGxhdGVzKGNoaWxkRWxlbSwgc291cmNlTm9kZSwgbW9kZSwgdHJ1ZSk7CisgICAgICAgIHRyYW5zZm9ybWVyLmV4ZWN1dGVDaGlsZFRlbXBsYXRlcyhjaGlsZEVsZW0sIHRydWUpOwogCiAgICAgICAgIHJldHVybjsKICAgICAgIH0KQEAgLTE3OSw3ICsxODIsNyBAQAogICAgKgogICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbgorICBwdWJsaWMgRWxlbVRlbXBsYXRlRWxlbWVudCBhcHBlbmRDaGlsZChFbGVtVGVtcGxhdGVFbGVtZW50IG5ld0NoaWxkKQogICB7CiAKICAgICBpbnQgdHlwZSA9ICgoRWxlbVRlbXBsYXRlRWxlbWVudCkgbmV3Q2hpbGQpLmdldFhTTFRva2VuKCk7CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUNvbW1lbnQuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQ29tbWVudC5qYXZhCmluZGV4IGZjMWU3Y2QuLjE5NmY4YWIgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQ29tbWVudC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQ29tbWVudC5qYXZhCkBAIC01Niw3ICs1Niw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS4qOworLy9pbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguKjsKIApAQCAtMTExLDEzICsxMTIsMTMgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZXhlY3V0ZSgKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogICAgIHRyeQogICAgIHsKICAgICAgIGlmIChUcmFuc2Zvcm1lckltcGwuU19ERUJVRykKLSAgICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQoc291cmNlTm9kZSwgbW9kZSwgdGhpcyk7CisgICAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHRoaXMpOwogCiAgICAgICAvLyBOb3RlIHRoZSBjb250ZW50IG1vZGVsIGlzOgogICAgICAgLy8gPCFFTlRJVFkgJSBpbnN0cnVjdGlvbnMgIgpAQCAtMTI3LDcgKzEyOCw3IEBACiAgICAgICAvLyB8IHhzbDplbGVtZW50CiAgICAgICAvLyB8IHhzbDphdHRyaWJ1dGUKICAgICAgIC8vICI+Ci0gICAgICBTdHJpbmcgZGF0YSA9IHRyYW5zZm9ybWVyLnRyYW5zZm9ybVRvU3RyaW5nKHRoaXMsIHNvdXJjZU5vZGUsIG1vZGUpOworICAgICAgU3RyaW5nIGRhdGEgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ub1N0cmluZyh0aGlzKTsKIAogICAgICAgdHJhbnNmb3JtZXIuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKS5jb21tZW50KGRhdGEpOwogICAgIH0KQEAgLTE0Niw3ICsxNDcsNyBAQAogICAgKgogICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbgorICBwdWJsaWMgRWxlbVRlbXBsYXRlRWxlbWVudCBhcHBlbmRDaGlsZChFbGVtVGVtcGxhdGVFbGVtZW50IG5ld0NoaWxkKQogICB7CiAKICAgICBpbnQgdHlwZSA9ICgoRWxlbVRlbXBsYXRlRWxlbWVudCkgbmV3Q2hpbGQpLmdldFhTTFRva2VuKCk7CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUNvcHkuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQ29weS5qYXZhCmluZGV4IDUzY2E3OWIuLmRlZDc5OGYgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQ29weS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQ29weS5qYXZhCkBAIC01Niw3ICs1Niw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS4qOworLy9pbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguKjsKIApAQCAtMTMwLDQ2ICsxMzEsNDcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZXhlY3V0ZSgKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogICAgIHRyeQogICAgIHsKLSAgICAgIHNob3J0IG5vZGVUeXBlID0gc291cmNlTm9kZS5nZXROb2RlVHlwZSgpOworICAgICAgWFBhdGhDb250ZXh0IHhjdHh0ID0gdHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCk7CisgICAgICBpbnQgc291cmNlTm9kZSA9IHhjdHh0LmdldEN1cnJlbnROb2RlKCk7CisgICAgICBEVE0gZHRtID0geGN0eHQuZ2V0RFRNKHNvdXJjZU5vZGUpOworICAgICAgc2hvcnQgbm9kZVR5cGUgPSBkdG0uZ2V0Tm9kZVR5cGUoc291cmNlTm9kZSk7CiAKLSAgICAgIGlmICgoTm9kZS5ET0NVTUVOVF9OT0RFICE9IG5vZGVUeXBlKSAmJiAoTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICE9IG5vZGVUeXBlKSkKKyAgICAgIGlmICgoRFRNLkRPQ1VNRU5UX05PREUgIT0gbm9kZVR5cGUpICYmIChEVE0uRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAhPSBub2RlVHlwZSkpCiAgICAgICB7CiAgICAgICAgIFJlc3VsdFRyZWVIYW5kbGVyIHJ0aGFuZGxlciA9IHRyYW5zZm9ybWVyLmdldFJlc3VsdFRyZWVIYW5kbGVyKCk7CiAKICAgICAgICAgLy8gVE9ETzogUHJvY2VzcyB0aGUgdXNlLWF0dHJpYnV0ZS1zZXRzIHN0dWZmCiAgICAgICAgIHJ0aGFuZGxlci5jbG9uZVRvUmVzdWx0VHJlZShzb3VyY2VOb2RlLCBmYWxzZSk7CiAKLSAgICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IG5vZGVUeXBlKQorICAgICAgICBpZiAoRFRNLkVMRU1FTlRfTk9ERSA9PSBub2RlVHlwZSkKICAgICAgICAgewotICAgICAgICAgIHN1cGVyLmV4ZWN1dGUodHJhbnNmb3JtZXIsIHNvdXJjZU5vZGUsIG1vZGUpOworICAgICAgICAgIHN1cGVyLmV4ZWN1dGUodHJhbnNmb3JtZXIpOwogICAgICAgICAgIHJ0aGFuZGxlci5wcm9jZXNzTlNEZWNscyhzb3VyY2VOb2RlKTsKLSAgICAgICAgICB0cmFuc2Zvcm1lci5leGVjdXRlQ2hpbGRUZW1wbGF0ZXModGhpcywgc291cmNlTm9kZSwgbW9kZSwgdHJ1ZSk7CisgICAgICAgICAgdHJhbnNmb3JtZXIuZXhlY3V0ZUNoaWxkVGVtcGxhdGVzKHRoaXMsIHRydWUpOwogICAgICAgICAgIAotICAgICAgICAgIERPTUhlbHBlciBkaGVscGVyID0gdHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCkuZ2V0RE9NSGVscGVyKCk7Ci0gICAgICAgICAgU3RyaW5nIG5zID0gZGhlbHBlci5nZXROYW1lc3BhY2VPZk5vZGUoc291cmNlTm9kZSk7Ci0gICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IGRoZWxwZXIuZ2V0TG9jYWxOYW1lT2ZOb2RlKHNvdXJjZU5vZGUpOworICAgICAgICAgIFN0cmluZyBucyA9IGR0bS5nZXROYW1lc3BhY2VVUkkoc291cmNlTm9kZSk7CisgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IGR0bS5nZXRMb2NhbE5hbWUoc291cmNlTm9kZSk7CiAgICAgICAgICAgdHJhbnNmb3JtZXIuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKS5lbmRFbGVtZW50KG5zLCBsb2NhbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGUuZ2V0Tm9kZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0bS5nZXROb2RlTmFtZShzb3VyY2VOb2RlKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgaWYgKFRyYW5zZm9ybWVySW1wbC5TX0RFQlVHKQotICAgICAgICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQoc291cmNlTm9kZSwgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQodGhpcyk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgaWYgKFRyYW5zZm9ybWVySW1wbC5TX0RFQlVHKQotICAgICAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHNvdXJjZU5vZGUsIG1vZGUsIHRoaXMpOworICAgICAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHRoaXMpOwogCi0gICAgICAgIHN1cGVyLmV4ZWN1dGUodHJhbnNmb3JtZXIsIHNvdXJjZU5vZGUsIG1vZGUpOwotICAgICAgICB0cmFuc2Zvcm1lci5leGVjdXRlQ2hpbGRUZW1wbGF0ZXModGhpcywgc291cmNlTm9kZSwgbW9kZSwgdHJ1ZSk7CisgICAgICAgIHN1cGVyLmV4ZWN1dGUodHJhbnNmb3JtZXIpOworICAgICAgICB0cmFuc2Zvcm1lci5leGVjdXRlQ2hpbGRUZW1wbGF0ZXModGhpcywgdHJ1ZSk7CiAgICAgICB9CiAgICAgfQogICAgIGNhdGNoKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzZSkKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQ29weU9mLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUNvcHlPZi5qYXZhCmluZGV4IDVlNmEwOGYuLmQ2YzBkZjEgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtQ29weU9mLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1Db3B5T2YuamF2YQpAQCAtNTYsOCArNTYsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLio7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1UcmVlV2Fsa2VyOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguKjsKIApAQCAtMTQ2LDE2ICsxNDksMTcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZXhlY3V0ZSgKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCiAgICAgdHJ5CiAgICAgewogICAgICAgaWYgKFRyYW5zZm9ybWVySW1wbC5TX0RFQlVHKQotICAgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudChzb3VyY2VOb2RlLCBtb2RlLCB0aGlzKTsKKyAgICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQodGhpcyk7CiAKICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCA9IHRyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpOworICAgICAgaW50IHNvdXJjZU5vZGUgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOwogICAgICAgWE9iamVjdCB2YWx1ZSA9IG1fc2VsZWN0RXhwcmVzc2lvbi5leGVjdXRlKHhjdHh0LCBzb3VyY2VOb2RlLCB0aGlzKTsKIAogICAgICAgaWYgKFRyYW5zZm9ybWVySW1wbC5TX0RFQlVHKQpAQCAtMTgxLDMwICsxODUsMzAgQEAKICAgICAgICAgY2FzZSBYT2JqZWN0LkNMQVNTX05PREVTRVQgOgogCiAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKHZhbHVlKTsKLSAgICAgICAgICBOb2RlSXRlcmF0b3IgbmwgPSB2YWx1ZS5ub2Rlc2V0KCk7CisgICAgICAgICAgRFRNSXRlcmF0b3IgbmwgPSB2YWx1ZS5ub2Rlc2V0KCk7CiAKICAgICAgICAgICAvLyBDb3B5IHRoZSB0cmVlLgotICAgICAgICAgIG9yZy5hcGFjaGUueG1sLnV0aWxzLlRyZWVXYWxrZXIgdHcgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyZWVXYWxrZXIyUmVzdWx0KHRyYW5zZm9ybWVyLCBoYW5kbGVyKTsKLSAgICAgICAgICBOb2RlIHBvczsKKyAgICAgICAgICBEVE1UcmVlV2Fsa2VyIHR3ID0gbmV3IFRyZWVXYWxrZXIyUmVzdWx0KHRyYW5zZm9ybWVyLCBoYW5kbGVyKTsKKyAgICAgICAgICBpbnQgcG9zOwogCi0gICAgICAgICAgd2hpbGUgKG51bGwgIT0gKHBvcyA9IG5sLm5leHROb2RlKCkpKQorICAgICAgICAgIHdoaWxlIChEVE0uTlVMTCAhPSAocG9zID0gbmwubmV4dE5vZGUoKSkpCiAgICAgICAgICAgewotICAgICAgICAgICAgc2hvcnQgdCA9IHBvcy5nZXROb2RlVHlwZSgpOworICAgICAgICAgICAgRFRNIGR0bSA9IHhjdHh0LmdldERUTU1hbmFnZXIoKS5nZXREVE0ocG9zKTsKKyAgICAgICAgICAgIHNob3J0IHQgPSBkdG0uZ2V0Tm9kZVR5cGUocG9zKTsKIAogICAgICAgICAgICAgLy8gSWYgd2UganVzdCBjb3B5IHRoZSB3aG9sZSBkb2N1bWVudCwgYSBzdGFydERvYyBhbmQgZW5kRG9jIGdldCAKICAgICAgICAgICAgIC8vIGdlbmVyYXRlZCwgc28gd2UgbmVlZCB0byBvbmx5IHdhbGsgdGhlIGNoaWxkIG5vZGVzLgotICAgICAgICAgICAgaWYgKHQgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQorICAgICAgICAgICAgaWYgKHQgPT0gRFRNLkRPQ1VNRU5UX05PREUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZvciAoTm9kZSBjaGlsZCA9IHBvcy5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKQorICAgICAgICAgICAgICBmb3IgKGludCBjaGlsZCA9IGR0bS5nZXRGaXJzdENoaWxkKHBvcyk7IGNoaWxkICE9IERUTS5OVUxMOworICAgICAgICAgICAgICAgICAgIGNoaWxkID0gZHRtLmdldE5leHRTaWJsaW5nKGNoaWxkKSkKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHR3LnRyYXZlcnNlKGNoaWxkKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodCA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQorICAgICAgICAgICAgZWxzZSBpZiAodCA9PSBEVE0uQVRUUklCVVRFX05PREUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZXIuYWRkQXR0cmlidXRlKChBdHRyKSBwb3MpOworICAgICAgICAgICAgICBoYW5kbGVyLmFkZEF0dHJpYnV0ZShwb3MpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewpAQCAtMjE4LDYgKzIyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCkpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAKICAgICAgICAgICBzID0gdmFsdWUuc3RyKCk7CiAKICAgICAgICAgICBoYW5kbGVyLmNoYXJhY3RlcnMocy50b0NoYXJBcnJheSgpLCAwLCBzLmxlbmd0aCgpKTsKQEAgLTIzOCwxMCArMjQzLDggQEAKICAgICogQHBhcmFtIG5ld0NoaWxkIENoaWxkIHRvIGFkZCB0byB0aGlzIG5vZGUncyBjaGlsZCBsaXN0CiAgICAqCiAgICAqIEByZXR1cm4gQ2hpbGQganVzdCBhZGRlZCB0byBjaGlsZCBsaXN0Ci0gICAqCi0gICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHB1YmxpYyBFbGVtVGVtcGxhdGVFbGVtZW50IGFwcGVuZENoaWxkKEVsZW1UZW1wbGF0ZUVsZW1lbnQgbmV3Q2hpbGQpCiAgIHsKIAogICAgIGVycm9yKFhTTFRFcnJvclJlc291cmNlcy5FUl9DQU5OT1RfQURELApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1FbGVtZW50LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUVsZW1lbnQuamF2YQppbmRleCAxNjY5NjQ3Li45NzRiYjhjIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUVsZW1lbnQuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUVsZW1lbnQuamF2YQpAQCAtNTYsNyArNTYsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogaW1wb3J0IG9yZy54bWwuc2F4Lio7CiAKQEAgLTI1NiwxMiArMjU3LDEzIEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAogICAgIFJlc3VsdFRyZWVIYW5kbGVyIHJoYW5kbGVyID0gdHJhbnNmb3JtZXIuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKTsKICAgICBYUGF0aENvbnRleHQgeGN0eHQgPSB0cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKTsKKyAgICBpbnQgc291cmNlTm9kZSA9IHhjdHh0LmdldEN1cnJlbnROb2RlKCk7CiAgICAgU3RyaW5nIG5vZGVOYW1lID0gbV9uYW1lX2F2dC5ldmFsdWF0ZSh4Y3R4dCwgc291cmNlTm9kZSwgdGhpcyk7CiAKICAgICAvLyBtYWtlIHN1cmUgdGhhdCBpZiBhIHByZWZpeCBpcyBzcGVjaWZpZWQgb24gdGhlIGF0dHJpYnV0ZSBuYW1lLCBpdCBpcyB2YWxpZApAQCAtMjc1LDEwICsyNzcsMTEgQEAKICAgICBpZiAoKG51bGwgIT0gbm9kZU5hbWUpIC8qICYmIChpbmRleE9mTlNTZXAgPj0gMCkgKi8pCiAgICAgewogICAgICAgcHJlZml4ID0gKGluZGV4T2ZOU1NlcCA+IDApID8gbm9kZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4T2ZOU1NlcCkgOiAiIjsKLQorICAgICAgCiAgICAgICAvLyBDYXRjaCB0aGUgZXhjZXB0aW9uIHRoaXMgbWF5IGNhdXNlLiBXZSBkb24ndCB3YW50IHRvIHN0b3AgcHJvY2Vzc2luZy4KICAgICAgIHRyeQogICAgICAgeworICAgICAgICAvLyBNYXliZSB0ZW1wb3JhcnksIHVudGlsIEkgZ2V0IHRoaXMgd29ya2VkIG91dC4gIHRlc3Q6IGF4ZXM1OQogICAgICAgICBub2RlTmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlRm9yUHJlZml4KHByZWZpeCk7CiAKICAgICAgICAgaWYgKG51bGwgPT0gbm9kZU5hbWVzcGFjZSAmJiBpbmRleE9mTlNTZXAgPD0gMCkKQEAgLTM1MSw4ICszNTQsNyBAQAogICAgICAgfQogICAgIH0KIAotICAgIGNvbnN0cnVjdE5vZGUobm9kZU5hbWUsIHByZWZpeCwgbm9kZU5hbWVzcGFjZSwgdHJhbnNmb3JtZXIsIHNvdXJjZU5vZGUsCi0gICAgICAgICAgICAgICAgICBtb2RlKTsKKyAgICBjb25zdHJ1Y3ROb2RlKG5vZGVOYW1lLCBwcmVmaXgsIG5vZGVOYW1lc3BhY2UsIHRyYW5zZm9ybWVyKTsKICAgfQogICAKICAgLyoqCkBAIC0zNjksNyArMzcxLDcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgdm9pZCBjb25zdHJ1Y3ROb2RlKAotICAgICAgICAgIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5vZGVOYW1lc3BhY2UsIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlKQorICAgICAgICAgIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5vZGVOYW1lc3BhY2UsIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lcikKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKQEAgLTM5NSwxMCArMzk3LDkgQEAKICAgICAgIGJvb2xlYW4gc2hvdWxkQWRkQXR0cnMgPSAobnVsbCAhPSBub2RlTmFtZSk7CiAKICAgICAgIGlmIChzaG91bGRBZGRBdHRycykKLSAgICAgICAgc3VwZXIuZXhlY3V0ZSh0cmFuc2Zvcm1lciwgc291cmNlTm9kZSwgbW9kZSk7CisgICAgICAgIHN1cGVyLmV4ZWN1dGUodHJhbnNmb3JtZXIpOwogCi0gICAgICB0cmFuc2Zvcm1lci5leGVjdXRlQ2hpbGRUZW1wbGF0ZXModGhpcywgc291cmNlTm9kZSwgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBZGRBdHRycyk7CisgICAgICB0cmFuc2Zvcm1lci5leGVjdXRlQ2hpbGRUZW1wbGF0ZXModGhpcywgc2hvdWxkQWRkQXR0cnMpOwogCiAgICAgICAvLyBOb3cgZW5kIHRoZSBlbGVtZW50IGlmIG5hbWUgd2FzIHZhbGlkCiAgICAgICBpZiAobnVsbCAhPSBub2RlTmFtZSkKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtRXh0ZW5zaW9uQ2FsbC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1FeHRlbnNpb25DYWxsLmphdmEKaW5kZXggZDUwMDE4Yy4uZjIyNzE2OSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1FeHRlbnNpb25DYWxsLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1FeHRlbnNpb25DYWxsLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC4qOwogCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLio7CiAKIGltcG9ydCBvcmcueG1sLnNheC4qOwogaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuKjsKQEAgLTgxLDYgKzgxLDggQEAKIAogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworCiAvKioKICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgogICogSW1wbGVtZW50IGFuIGV4dGVuc2lvbiBlbGVtZW50LgpAQCAtMjM4LDcgKzI0MCw3IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVGYWxsYmFja3MoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKICAgICBmb3IgKEVsZW1UZW1wbGF0ZUVsZW1lbnQgY2hpbGQgPSBtX2ZpcnN0Q2hpbGQ7IGNoaWxkICE9IG51bGw7CkBAIC0yNDksNyArMjUxLDcgQEAKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICB0cmFuc2Zvcm1lci5wdXNoRWxlbVRlbXBsYXRlRWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgKChFbGVtRmFsbGJhY2spIGNoaWxkKS5leGVjdXRlRmFsbGJhY2sodHJhbnNmb3JtZXIsIHNvdXJjZU5vZGUsIG1vZGUpOworICAgICAgICAgICgoRWxlbUZhbGxiYWNrKSBjaGlsZCkuZXhlY3V0ZUZhbGxiYWNrKHRyYW5zZm9ybWVyKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbGx5CiAgICAgICAgIHsKQEAgLTI3MSw3ICsyNzMsNyBAQAogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgdm9pZCBleGVjdXRlKAotICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlKQorICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lcikKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKQEAgLTI5NCw3ICsyOTYsNyBAQAogICAgICAgICAgIGV0YWJsZS5hZGRFeHRlbnNpb25OYW1lc3BhY2UobV9leHRucywgbnNoKTsKICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgZXhlY3V0ZUZhbGxiYWNrcyh0cmFuc2Zvcm1lciwgc291cmNlTm9kZSwgbW9kZSk7CisgICAgICAgICAgZXhlY3V0ZUZhbGxiYWNrcyh0cmFuc2Zvcm1lcik7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTMwMyw4ICszMDUsNyBAQAogICAgICAgdHJ5CiAgICAgICB7CiAgICAgICAgIG5zaC5wcm9jZXNzRWxlbWVudCh0aGlzLmdldExvY2FsTmFtZSgpLCB0aGlzLCB0cmFuc2Zvcm1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0eWxlc2hlZXQoKSwgc291cmNlTm9kZS5nZXRPd25lckRvY3VtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlLCBtb2RlLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0eWxlc2hlZXQoKSwgdGhpcyk7CiAgICAgICB9CiAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICB7CkBAIC0zNDQsNyArMzQ1LDcgQEAKICAgICAgICAgICB0cmFuc2Zvcm1lci5nZXRFcnJvckxpc3RlbmVyKCkuZXJyb3IodGUpOyAvLyA/PwogCiAgICAgICAgIGV4ZWN1dGVGYWxsYmFja3MoCi0gICAgICAgICAgdHJhbnNmb3JtZXIsIHNvdXJjZU5vZGUsIG1vZGUpOworICAgICAgICAgIHRyYW5zZm9ybWVyKTsKICAgICAgIH0KICAgICB9CiAgICAgY2F0Y2gob3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHNlKQpAQCAtMzg3LDcgKzM4OCw3IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKAotICAgICAgICAgIFN0cmluZyByYXdOYW1lLCBOb2RlIHNvdXJjZU5vZGUsIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lcikKKyAgICAgICAgICBTdHJpbmcgcmF3TmFtZSwgb3JnLnczYy5kb20uTm9kZSBzb3VyY2VOb2RlLCBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCkBAIC0zOTcsOSArMzk4LDEyIEBACiAgICAgewogICAgICAgWFBhdGhDb250ZXh0IHhjdHh0ID0gdHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCk7CiAKLSAgICAgIHJldHVybiBhdnQuZXZhbHVhdGUoeGN0eHQsIHNvdXJjZU5vZGUsIHRoaXMpOworICAgICAgcmV0dXJuIGF2dC5ldmFsdWF0ZSh4Y3R4dCwgCisgICAgICAgICAgICB4Y3R4dC5nZXREVE1IYW5kbGVGcm9tTm9kZShzb3VyY2VOb2RlKSwgCisgICAgICAgICAgICB0aGlzKTsKICAgICB9CiAKICAgICByZXR1cm4gbnVsbDsKICAgfQorICAKIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtRmFsbGJhY2suamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtRmFsbGJhY2suamF2YQppbmRleCA1YTc4MmMyLi40Y2Q2NjkxIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUZhbGxiYWNrLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1GYWxsYmFjay5qYXZhCkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZXhlY3V0ZSgKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogICB9CkBAIC0xMzQsNyArMTM0LDcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZXhlY3V0ZUZhbGxiYWNrKAotICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlKQorICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lcikKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKQEAgLTE0MiwxMCArMTQyLDkgQEAKICAgICB7CiAKICAgICAgIGlmIChUcmFuc2Zvcm1lckltcGwuU19ERUJVRykKLSAgICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQoc291cmNlTm9kZSwgbW9kZSwKLSAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQodGhpcyk7CiAKLSAgICAgIHRyYW5zZm9ybWVyLmV4ZWN1dGVDaGlsZFRlbXBsYXRlcyh0aGlzLCBzb3VyY2VOb2RlLCBtb2RlLCB0cnVlKTsKKyAgICAgIHRyYW5zZm9ybWVyLmV4ZWN1dGVDaGlsZFRlbXBsYXRlcyh0aGlzLCB0cnVlKTsKIAogICAgIH0KICAgICBlbHNlCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUZvckVhY2guamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtRm9yRWFjaC5qYXZhCmluZGV4IDdjMTdlMWYuLjg5OWIzZmYgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtRm9yRWFjaC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtRm9yRWFjaC5qYXZhCkBAIC01Niw4ICs1NiwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworLy9pbXBvcnQgb3JnLnczYy5kb20uKjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKIAogaW1wb3J0IG9yZy54bWwuc2F4Lio7CiAKQEAgLTc0LDcgKzc3LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLk5vZGVTb3J0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5SZXN1bHRUcmVlSGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlN0YWNrR3VhcmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zdHJlZS5TYXhFdmVudERpc3BhdGNoOwogCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yOwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CkBAIC0yMDYsMTUgKzIwOCwxMiBAQAogICAvKioKICAgICogRXhlY3V0ZSB0aGUgeHNsOmZvci1lYWNoIHRyYW5zZm9ybWF0aW9uIAogICAgKgotICAgKgogICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgbm9uLW51bGwgcmVmZXJlbmNlIHRvIHRoZSB0aGUgY3VycmVudCB0cmFuc2Zvcm0tdGltZSBzdGF0ZS4KLSAgICogQHBhcmFtIHNvdXJjZU5vZGUgbm9uLW51bGwgcmVmZXJlbmNlIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0I2R0LWN1cnJlbnQtbm9kZSI+Y3VycmVudCBzb3VyY2Ugbm9kZTwvYT4uCi0gICAqIEBwYXJhbSBtb2RlIHJlZmVyZW5jZSwgd2hpY2ggbWF5IGJlIG51bGwsIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0I21vZGVzIj5jdXJyZW50IG1vZGU8L2E+LgogICAgKgogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgdm9pZCBleGVjdXRlKAotICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlKQorICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lcikKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKQEAgLTIyMyw5ICsyMjIsOSBAQAogICAgIHRyeQogICAgIHsKICAgICAgIGlmIChUcmFuc2Zvcm1lckltcGwuU19ERUJVRykKLSAgICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQoc291cmNlTm9kZSwgbW9kZSwgdGhpcyk7CisgICAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHRoaXMpOwogCi0gICAgICB0cmFuc2Zvcm1TZWxlY3RlZE5vZGVzKHRyYW5zZm9ybWVyLCBzb3VyY2VOb2RlLCB0aGlzLCBtb2RlKTsKKyAgICAgIHRyYW5zZm9ybVNlbGVjdGVkTm9kZXModHJhbnNmb3JtZXIsIHRoaXMpOwogICAgIH0KICAgICBmaW5hbGx5CiAgICAgewpAQCAtMjU2LDM1ICsyNTUsMjIgQEAKICAgICoKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHJvdGVjdGVkIE5vZGVJdGVyYXRvciBzb3J0Tm9kZXMoCi0gICAgICAgICAgWFBhdGhDb250ZXh0IHhjdHh0LCBWZWN0b3Iga2V5cywgTm9kZUl0ZXJhdG9yIHNvdXJjZU5vZGVzKQorICBwcm90ZWN0ZWQgRFRNSXRlcmF0b3Igc29ydE5vZGVzKAorICAgICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCwgVmVjdG9yIGtleXMsIERUTUl0ZXJhdG9yIHNvdXJjZU5vZGVzKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAogICAgIE5vZGVTb3J0ZXIgc29ydGVyID0gbmV3IE5vZGVTb3J0ZXIoeGN0eHQpOwotICAgIE5vZGVTZXQgbm9kZUxpc3Q7CisgICAgCisgICAgc291cmNlTm9kZXMuc2V0U2hvdWxkQ2FjaGVOb2Rlcyh0cnVlKTsKKyAgICBzb3VyY2VOb2Rlcy5ydW5UbygtMSk7CiAKLSAgICBpZiAoc291cmNlTm9kZXMgaW5zdGFuY2VvZiBOb2RlU2V0KQotICAgIHsKLSAgICAgIG5vZGVMaXN0ID0gKChOb2RlU2V0KSBzb3VyY2VOb2Rlcyk7Ci0KLSAgICAgIG5vZGVMaXN0LnNldFNob3VsZENhY2hlTm9kZXModHJ1ZSk7Ci0gICAgICBub2RlTGlzdC5ydW5UbygtMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBub2RlTGlzdCA9IG5ldyBOb2RlU2V0KHNvdXJjZU5vZGVzKTsKLSAgICAgIHNvdXJjZU5vZGVzID0gbm9kZUxpc3Q7Ci0KLSAgICAgICgoQ29udGV4dE5vZGVMaXN0KSBzb3VyY2VOb2Rlcykuc2V0Q3VycmVudFBvcygwKTsKLSAgICB9Ci0KLSAgICB4Y3R4dC5wdXNoQ29udGV4dE5vZGVMaXN0KChDb250ZXh0Tm9kZUxpc3QpIHNvdXJjZU5vZGVzKTsKKyAgICB4Y3R4dC5wdXNoQ29udGV4dE5vZGVMaXN0KHNvdXJjZU5vZGVzKTsKIAogICAgIHRyeQogICAgIHsKLSAgICAgIHNvcnRlci5zb3J0KG5vZGVMaXN0LCBrZXlzLCB4Y3R4dCk7Ci0gICAgICBub2RlTGlzdC5zZXRDdXJyZW50UG9zKDApOworICAgICAgc29ydGVyLnNvcnQoc291cmNlTm9kZXMsIGtleXMsIHhjdHh0KTsKKyAgICAgIHNvdXJjZU5vZGVzLnNldEN1cnJlbnRQb3MoMCk7CiAgICAgfQogICAgIGZpbmFsbHkKICAgICB7CkBAIC0zMjEsNyArMzA3LDcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgaW50IHB1c2hQYXJhbXMoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBYUGF0aENvbnRleHQgeGN0eHQsIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIFhQYXRoQ29udGV4dCB4Y3R4dCkKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKQEAgLTM1OSwyNSArMzQ1LDEzIEBACiAgICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgogICAgKiBQZXJmb3JtIGEgcXVlcnkgaWYgbmVlZGVkLCBhbmQgY2FsbCB0cmFuc2Zvcm1Ob2RlIGZvciBlYWNoIGNoaWxkLgogICAgKgotICAgKgogICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgbm9uLW51bGwgcmVmZXJlbmNlIHRvIHRoZSB0aGUgY3VycmVudCB0cmFuc2Zvcm0tdGltZSBzdGF0ZS4KLSAgICogQHBhcmFtIHNvdXJjZU5vZGUgbm9uLW51bGwgcmVmZXJlbmNlIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0I2R0LWN1cnJlbnQtbm9kZSI+Y3VycmVudCBzb3VyY2Ugbm9kZTwvYT4uCi0gICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gVGhyb3duIGluIGEgdmFyaWV0eSBvZiBjaXJjdW1zdGFuY2VzLgotICAgKiBAcGFyYW0gc3R5bGVzaGVldFRyZWUgVGhlIG93bmluZyBzdHlsZXNoZWV0IHRyZWUuCi0gICAqIEBwYXJhbSB4c2xJbnN0cnVjdGlvbiBUaGUgc3R5bGVzaGVldCBlbGVtZW50IGNvbnRleHQgKGRlcHJpY2F0ZWQgLS0gSSBkbwotICAgKiAgICAgIG5vdCB0aGluayB3ZSBuZWVkIHRoaXMpLgogICAgKiBAcGFyYW0gdGVtcGxhdGUgVGhlIG93bmluZyB0ZW1wbGF0ZSBjb250ZXh0LgotICAgKiBAcGFyYW0gc291cmNlTm9kZUNvbnRleHQgVGhlIGN1cnJlbnQgc291cmNlIG5vZGUgY29udGV4dC4KLSAgICogQHBhcmFtIG1vZGUgVGhlIGN1cnJlbnQgbW9kZS4KLSAgICogQHBhcmFtIHNlbGVjdFBhdHRlcm4gVGhlIFhQYXRoIHdpdGggd2hpY2ggdG8gcGVyZm9ybSB0aGUgc2VsZWN0aW9uLgotICAgKiBAcGFyYW0geHNsVG9rZW4gVGhlIGN1cnJlbnQgWFNMVCBpbnN0cnVjdGlvbiAoZGVwcmljYXRlZCAtLSBJIGRvIG5vdAotICAgKiAgICAgdGhpbmsgd2Ugd2FudCB0aGlzKS4KLSAgICogQHBhcmFtIHRjb250ZXh0IFRoZSBUcmFuc2Zvcm1lckltcGwgY29udGV4dC4KLSAgICogQHBhcmFtIHNlbGVjdFN0YWNrRnJhbWVJbmRleCBUaGUgc3RhY2sgZnJhbWUgY29udGV4dCBmb3IgZXhlY3V0aW5nIHRoZQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBzdGF0ZW1lbnQuCisgICAqIAorICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIFRocm93biBpbiBhIHZhcmlldHkgb2YgY2lyY3Vtc3RhbmNlcy4KICAgICovCiAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybVNlbGVjdGVkTm9kZXMoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUsIEVsZW1UZW1wbGF0ZUVsZW1lbnQgdGVtcGxhdGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBFbGVtVGVtcGxhdGVFbGVtZW50IHRlbXBsYXRlKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKICAgICB0cnkKQEAgLTM4NSw2ICszNTksNyBAQAogICAgICAgYm9vbGVhbiByZGVidWcgPSBUcmFuc2Zvcm1lckltcGwuU19ERUJVRzsKICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCA9IHRyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpOwogICAgICAgWFBhdGggc2VsZWN0UGF0dGVybiA9IGdldFNlbGVjdE9yRGVmYXVsdCgpOworICAgICAgaW50IHNvdXJjZU5vZGUgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOwogICAgICAgWE9iamVjdCBzZWxlY3RSZXN1bHQgPSBzZWxlY3RQYXR0ZXJuLmV4ZWN1dGUoeGN0eHQsIHNvdXJjZU5vZGUsIHRoaXMpOwogICAgICAgCiAgICAgICBpZiAocmRlYnVnKQpAQCAtMzkyLDcgKzM2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0Iiwgc2VsZWN0UGF0dGVybiwgc2VsZWN0UmVzdWx0KTsKICAgICAgIAogICAgICAgVmVjdG9yIGtleXMgPSB0cmFuc2Zvcm1lci5wcm9jZXNzU29ydEtleXModGhpcywgc291cmNlTm9kZSk7Ci0gICAgICBOb2RlSXRlcmF0b3Igc291cmNlTm9kZXMgPSBzZWxlY3RSZXN1bHQubm9kZXNldCgpOworICAgICAgRFRNSXRlcmF0b3Igc291cmNlTm9kZXMgPSBzZWxlY3RSZXN1bHQubm9kZXNldCgpOwogCiAgICAgICAvLyBTb3J0IGlmIHdlIG5lZWQgdG8uCiAgICAgICBpZiAobnVsbCAhPSBrZXlzKQpAQCAtNDAxLDE0ICszNzYsMTQgQEAKICAgICAgIC8vIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvbmx5IHJlbGV2YW50IGZvciBFbGVtQXBwbHlUZW1wbGF0ZXMuCiAgICAgICAvLyBUaGlzIHZhbHVlIG5lZWRzIHRvIGJlIHBhc3NlZCB0byBwb3BQYXJhbXMgd2hpY2ggd2lsbAogICAgICAgLy8gcmVzdG9yZSBpdCBpbiB0aGUgdmFyaWFibGUgc3RhY2suCi0gICAgICBpbnQgc2F2ZWRTZWFyY2hTdGFydCA9IHB1c2hQYXJhbXModHJhbnNmb3JtZXIsIHhjdHh0LCBzb3VyY2VOb2RlLCBtb2RlKTsKKyAgICAgIGludCBzYXZlZFNlYXJjaFN0YXJ0ID0gcHVzaFBhcmFtcyh0cmFuc2Zvcm1lciwgeGN0eHQpOwogCiAgICAgICAvLyBQdXNoIHRoZSBDb250ZXh0Tm9kZUxpc3Qgb24gYSBzdGFjaywgc28gdGhhdCBzZWxlY3Q9InBvc2l0aW9uKCkiCiAgICAgICAvLyBhbmQgdGhlIGxpa2Ugd2lsbCB3b3JrLgogICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJwdXNoaW5nIGNvbnRleHQgbm9kZSBsaXN0Li4uIik7CiAgICAgICBTb3VyY2VMb2NhdG9yIHNhdmVkTG9jYXRvciA9IHhjdHh0LmdldFNBWExvY2F0b3IoKTsKIAotICAgICAgeGN0eHQucHVzaENvbnRleHROb2RlTGlzdCgoQ29udGV4dE5vZGVMaXN0KSBzb3VyY2VOb2Rlcyk7CisgICAgICB4Y3R4dC5wdXNoQ29udGV4dE5vZGVMaXN0KHNvdXJjZU5vZGVzKTsKICAgICAgIHRyYW5zZm9ybWVyLnB1c2hFbGVtVGVtcGxhdGVFbGVtZW50KG51bGwpOwogCiAgICAgICBSZXN1bHRUcmVlSGFuZGxlciBydGggPSB0cmFuc2Zvcm1lci5nZXRSZXN1bHRUcmVlSGFuZGxlcigpOwpAQCAtNDIzLDM4ICszOTgsMzQgQEAKICAgICAgIAogICAgICAgdHJ5CiAgICAgICB7Ci0gICAgICAgIE5vZGUgY2hpbGQ7CisgICAgICAgIGludCBjaGlsZDsKIAotICAgICAgICB3aGlsZSAobnVsbCAhPSAoY2hpbGQgPSBzb3VyY2VOb2Rlcy5uZXh0Tm9kZSgpKSkKKyAgICAgICAgd2hpbGUgKERUTS5OVUxMICE9IChjaGlsZCA9IHNvdXJjZU5vZGVzLm5leHROb2RlKCkpKQogICAgICAgICB7CisgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJjaGlsZDogIitjaGlsZCk7CisgICAgICAgICAgRFRNIGR0bSA9IHhjdHh0LmdldERUTShjaGlsZCk7CiAgICAgICAgICAgaWYgKG5lZWRUb0ZpbmRUZW1wbGF0ZSkKICAgICAgICAgICB7CisgICAgICAgICAgICBRTmFtZSBtb2RlID0gdHJhbnNmb3JtZXIuZ2V0TW9kZSgpOworICAgICAgICAgICAgCiAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRsLmdldFRlbXBsYXRlKHhjdHh0LCBjaGlsZCwgbW9kZSwgLTEsIHF1aWV0KTsKIAogICAgICAgICAgICAgLy8gSWYgdGhhdCBkaWRuJ3QgbG9jYXRlIGEgbm9kZSwgZmFsbCBiYWNrIHRvIGEgZGVmYXVsdCB0ZW1wbGF0ZSBydWxlLgogICAgICAgICAgICAgLy8gU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjYnVpbHQtaW4tcnVsZS4KICAgICAgICAgICAgIGlmIChudWxsID09IHRlbXBsYXRlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBzd2l0Y2ggKGNoaWxkLmdldE5vZGVUeXBlKCkpCisgICAgICAgICAgICAgIHN3aXRjaCAoZHRtLmdldE5vZGVUeXBlKGNoaWxkKSkKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA6Ci0gICAgICAgICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgorICAgICAgICAgICAgICBjYXNlIERUTS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFIDoKKyAgICAgICAgICAgICAgY2FzZSBEVE0uRUxFTUVOVF9OT0RFIDoKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHNyb290LmdldERlZmF1bHRSdWxlKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICAgICAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotICAgICAgICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNTdXBwb3J0ZWQoU2F4RXZlbnREaXNwYXRjaC5TVVBQT1JUU0lOVEVSRkFDRSwgIjEuMCIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICgoU2F4RXZlbnREaXNwYXRjaCkgY2hpbGQpLmRpc3BhdGNoQ2hhcmFjdGVyc0V2ZW50KHJ0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YSA9IGNoaWxkLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgcnRoLmNoYXJhY3RlcnMoZGF0YS50b0NoYXJBcnJheSgpLCAwLCBkYXRhLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNhc2UgRFRNLkFUVFJJQlVURV9OT0RFIDoKKyAgICAgICAgICAgICAgY2FzZSBEVE0uQ0RBVEFfU0VDVElPTl9OT0RFIDoKKyAgICAgICAgICAgICAgY2FzZSBEVE0uVEVYVF9OT0RFIDoKKyAgICAgICAgICAgICAgICBkdG0uZGlzcGF0Y2hDaGFyYWN0ZXJzRXZlbnRzKGNoaWxkLCBydGgpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6CisgICAgICAgICAgICAgIGNhc2UgRFRNLkRPQ1VNRU5UX05PREUgOgogICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gc3Jvb3QuZ2V0RGVmYXVsdFJvb3RSdWxlKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgIGRlZmF1bHQgOgpAQCAtNDgwLDEzICs0NTEsMTMgQEAKIAogICAgICAgICAgICAgLy8gRmlyZSBhIHRyYWNlIGV2ZW50IGZvciB0aGUgdGVtcGxhdGUuCiAgICAgICAgICAgICBpZiAocmRlYnVnKQotICAgICAgICAgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudChjaGlsZCwgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUpOworICAgICAgICAgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudCh0ZW1wbGF0ZSk7CiAKICAgICAgICAgICAgIC8vIEFuZCBleGVjdXRlIHRoZSBjaGlsZCB0ZW1wbGF0ZXMuCi0gICAgICAgICAgICBpZiAodGVtcGxhdGUuaXNDb21waWxlZFRlbXBsYXRlKCkpCi0gICAgICAgICAgICAgIHRlbXBsYXRlLmV4ZWN1dGUodHJhbnNmb3JtZXIsIGNoaWxkLCBtb2RlKTsKLSAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vICVYVEJEJSA/Pz8KKy8vICAgICAgICAgICAgaWYgKHRlbXBsYXRlLmlzQ29tcGlsZWRUZW1wbGF0ZSgpKQorLy8gICAgICAgICAgICAgIHRlbXBsYXRlLmV4ZWN1dGUodHJhbnNmb3JtZXIsIGNoaWxkLCBtb2RlKTsKKy8vICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewogCiAgICAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRlbXBsYXRlLCBjYWxsaW5nIGV4ZWN1dGUgb24gCkBAIC00OTYsNyArNDY3LDcgQEAKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHhjdHh0LnNldFNBWExvY2F0b3IodCk7CiAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0Q3VycmVudEVsZW1lbnQodCk7Ci0gICAgICAgICAgICAgICAgdC5leGVjdXRlKHRyYW5zZm9ybWVyLCBjaGlsZCwgbW9kZSk7CisgICAgICAgICAgICAgICAgdC5leGVjdXRlKHRyYW5zZm9ybWVyKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVNYXJrUGFyYW1zKHhjdHh0KTsKQEAgLTUzOSwxMCArNTEwLDggQEAKICAgICogQHBhcmFtIG5ld0NoaWxkIENoaWxkIHRvIGFkZCB0byBjaGlsZCBsaXN0CiAgICAqCiAgICAqIEByZXR1cm4gQ2hpbGQganVzdCBhZGRlZCB0byBjaGlsZCBsaXN0Ci0gICAqCi0gICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHB1YmxpYyBFbGVtVGVtcGxhdGVFbGVtZW50IGFwcGVuZENoaWxkKEVsZW1UZW1wbGF0ZUVsZW1lbnQgbmV3Q2hpbGQpCiAgIHsKIAogICAgIGludCB0eXBlID0gKChFbGVtVGVtcGxhdGVFbGVtZW50KSBuZXdDaGlsZCkuZ2V0WFNMVG9rZW4oKTsKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtSWYuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtSWYuamF2YQppbmRleCAyZTkzNDNkLi5hMGJiNjllIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUlmLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1JZi5qYXZhCkBAIC01Niw3ICs1Niw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS4qOworLy9pbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguKjsKIApAQCAtMTQ3LDIzICsxNDgsMjQgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZXhlY3V0ZSgKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCiAgICAgaWYgKFRyYW5zZm9ybWVySW1wbC5TX0RFQlVHKQotICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQoc291cmNlTm9kZSwgbW9kZSwgdGhpcyk7CisgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudCh0aGlzKTsKIAogICAgIFhQYXRoQ29udGV4dCB4Y3R4dCA9IHRyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpOworICAgIAorICAgIGludCBzb3VyY2VOb2RlID0geGN0eHQuZ2V0Q3VycmVudE5vZGUoKTsKICAgICBYT2JqZWN0IHRlc3QgPSBtX3Rlc3QuZXhlY3V0ZSh4Y3R4dCwgc291cmNlTm9kZSwgdGhpcyk7Ci0KICAgICBpZiAoVHJhbnNmb3JtZXJJbXBsLlNfREVCVUcpCiAgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlU2VsZWN0ZWRFdmVudChzb3VyY2VOb2RlLCB0aGlzLAogICAgICAgICAgICAgICAidGVzdCIsIG1fdGVzdCwgdGVzdCk7CiAKICAgICBpZiAodGVzdC5ib29sKCkpCiAgICAgewotICAgICAgdHJhbnNmb3JtZXIuZXhlY3V0ZUNoaWxkVGVtcGxhdGVzKHRoaXMsIHNvdXJjZU5vZGUsIG1vZGUsIHRydWUpOworICAgICAgdHJhbnNmb3JtZXIuZXhlY3V0ZUNoaWxkVGVtcGxhdGVzKHRoaXMsIHRydWUpOwogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1MaXRlcmFsUmVzdWx0LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUxpdGVyYWxSZXN1bHQuamF2YQppbmRleCAwMmUwZDRiLi45Mzg4NDQyIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUxpdGVyYWxSZXN1bHQuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbUxpdGVyYWxSZXN1bHQuamF2YQpAQCAtNTYsNyArNTYsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogaW1wb3J0IG9yZy54bWwuc2F4Lio7CiBpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy4qOwpAQCAtNTg5LDcgKzU5MCw3IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIApAQCAtNjA1LDcgKzYwNiw3IEBACiAgICAgICB7CiAKICAgICAgICAgLy8gUHJvY2VzcyBhbnkgcG9zc2libGUgYXR0cmlidXRlcyBmcm9tIHhzbDp1c2UtYXR0cmlidXRlLXNldHMgZmlyc3QKLSAgICAgICAgc3VwZXIuZXhlY3V0ZSh0cmFuc2Zvcm1lciwgc291cmNlTm9kZSwgbW9kZSk7CisgICAgICAgIHN1cGVyLmV4ZWN1dGUodHJhbnNmb3JtZXIpOwogCiAgICAgICAgIC8veHNsOnZlcnNpb24sIGV4Y2x1ZGVSZXN1bHRQcmVmaXhlcz8/PwogICAgICAgICAvLyBQcm9jZXNzIHRoZSBsaXN0IG9mIGF2dHMgbmV4dApAQCAtNjE3LDYgKzYxOCw3IEBACiAgICAgICAgICAgewogICAgICAgICAgICAgQVZUIGF2dCA9IChBVlQpIG1fYXZ0cy5lbGVtZW50QXQoaSk7CiAgICAgICAgICAgICBYUGF0aENvbnRleHQgeGN0eHQgPSB0cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKTsKKyAgICAgICAgICAgIGludCBzb3VyY2VOb2RlID0geGN0eHQuZ2V0Q3VycmVudE5vZGUoKTsKICAgICAgICAgICAgIFN0cmluZyBzdHJpbmdlZFZhbHVlID0gYXZ0LmV2YWx1YXRlKHhjdHh0LCBzb3VyY2VOb2RlLCB0aGlzKTsKIAogICAgICAgICAgICAgaWYgKG51bGwgIT0gc3RyaW5nZWRWYWx1ZSkKQEAgLTYzNCw3ICs2MzYsNyBAQAogCiAgICAgICAgIC8vIE5vdyBwcm9jZXNzIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhpcyBzdWJ0cmVlCiAgICAgICAgIC8vIFRPRE86IFByb2Nlc3MgbV9leHRlbnNpb25FbGVtZW50UHJlZml4ZXMgJiYgbV9hdHRyaWJ1dGVTZXRzTmFtZXMKLSAgICAgICAgdHJhbnNmb3JtZXIuZXhlY3V0ZUNoaWxkVGVtcGxhdGVzKHRoaXMsIHNvdXJjZU5vZGUsIG1vZGUsIHRydWUpOworICAgICAgICB0cmFuc2Zvcm1lci5leGVjdXRlQ2hpbGRUZW1wbGF0ZXModGhpcywgdHJ1ZSk7CiAgICAgICB9CiAgICAgICBmaW5hbGx5CiAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbU1lc3NhZ2UuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtTWVzc2FnZS5qYXZhCmluZGV4IGU4ZGIyYTAuLjQ3NDkyYWMgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtTWVzc2FnZS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtTWVzc2FnZS5qYXZhCkBAIC01Niw3ICs1Niw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS4qOworLy9pbXBvcnQgb3JnLnczYy5kb20uKjsKIAogaW1wb3J0IG9yZy54bWwuc2F4Lio7CiAKQEAgLTE1MiwxNCArMTUyLDE0IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAogICAgIGlmIChUcmFuc2Zvcm1lckltcGwuU19ERUJVRykKLSAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHNvdXJjZU5vZGUsIG1vZGUsIHRoaXMpOworICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQodGhpcyk7CiAKLSAgICBTdHJpbmcgZGF0YSA9IHRyYW5zZm9ybWVyLnRyYW5zZm9ybVRvU3RyaW5nKHRoaXMsIHNvdXJjZU5vZGUsIG1vZGUpOworICAgIFN0cmluZyBkYXRhID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtVG9TdHJpbmcodGhpcyk7CiAKICAgICB0cmFuc2Zvcm1lci5nZXRNc2dNZ3IoKS5tZXNzYWdlKHRoaXMsIGRhdGEsIG1fdGVybWluYXRlKTsKICAgICAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtTnVtYmVyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbU51bWJlci5qYXZhCmluZGV4IDFmNjc0OTUuLjFiMTJjOTUgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtTnVtYmVyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1OdW1iZXIuamF2YQpAQCAtNTgsOCArNTgsMTAgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLnJlcy5YUmVzb3VyY2VCdW5kbGU7CiAKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS4qOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKIAogaW1wb3J0IG9yZy54bWwuc2F4Lio7CiAKQEAgLTUwOCwxMyArNTEwLDE0IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAogICAgIGlmIChUcmFuc2Zvcm1lckltcGwuU19ERUJVRykKLSAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHNvdXJjZU5vZGUsIG1vZGUsIHRoaXMpOworICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQodGhpcyk7CiAKKyAgICBpbnQgc291cmNlTm9kZSA9IHRyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpLmdldEN1cnJlbnROb2RlKCk7CiAgICAgU3RyaW5nIGNvdW50U3RyaW5nID0gZ2V0Q291bnRTdHJpbmcodHJhbnNmb3JtZXIsIHNvdXJjZU5vZGUpOwogCiAgICAgdHJ5CkBAIC01MzcsNyArNTQwLDcgQEAKICAgICoKICAgICogQHRocm93cyBET01FeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbmV3Q2hpbGQpIHRocm93cyBET01FeGNlcHRpb24KKyAgcHVibGljIEVsZW1UZW1wbGF0ZUVsZW1lbnQgYXBwZW5kQ2hpbGQoRWxlbVRlbXBsYXRlRWxlbWVudCBuZXdDaGlsZCkKICAgewogCiAgICAgZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSX0NBTk5PVF9BREQsCkBAIC01NjQsMTIgKzU2NywxMyBAQAogICAgKgogICAgKiBAdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCi0gIE5vZGUgZmluZEFuY2VzdG9yKAotICAgICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCwgWFBhdGggZnJvbU1hdGNoUGF0dGVybiwgWFBhdGggY291bnRNYXRjaFBhdHRlcm4sIE5vZGUgY29udGV4dCwgRWxlbWVudCBuYW1lc3BhY2VDb250ZXh0KQorICBpbnQgZmluZEFuY2VzdG9yKAorICAgICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCwgWFBhdGggZnJvbU1hdGNoUGF0dGVybiwgWFBhdGggY291bnRNYXRjaFBhdHRlcm4sIAorICAgICAgICAgIGludCBjb250ZXh0LCBFbGVtTnVtYmVyIG5hbWVzcGFjZUNvbnRleHQpCiAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7Ci0KLSAgICB3aGlsZSAobnVsbCAhPSBjb250ZXh0KQorICAgIERUTSBkdG0gPSB4Y3R4dC5nZXREVE0oY29udGV4dCk7CisgICAgd2hpbGUgKERUTS5OVUxMICE9IGNvbnRleHQpCiAgICAgewogICAgICAgaWYgKG51bGwgIT0gZnJvbU1hdGNoUGF0dGVybikKICAgICAgIHsKQEAgLTU5MSw3ICs1OTUsNyBAQAogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGNvbnRleHQgPSB4Y3R4dC5nZXRET01IZWxwZXIoKS5nZXRQYXJlbnRPZk5vZGUoY29udGV4dCk7CisgICAgICBjb250ZXh0ID0gZHRtLmdldFBhcmVudChjb250ZXh0KTsKICAgICB9CiAKICAgICByZXR1cm4gY29udGV4dDsKQEAgLTYxMywxOSArNjE3LDIwIEBACiAgICAqCiAgICAqIEB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHJpdmF0ZSBOb2RlIGZpbmRQcmVjZWRpbmdPckFuY2VzdG9yT3JTZWxmKAotICAgICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCwgWFBhdGggZnJvbU1hdGNoUGF0dGVybiwgWFBhdGggY291bnRNYXRjaFBhdHRlcm4sIE5vZGUgY29udGV4dCwgRWxlbWVudCBuYW1lc3BhY2VDb250ZXh0KQorICBwcml2YXRlIGludCBmaW5kUHJlY2VkaW5nT3JBbmNlc3Rvck9yU2VsZigKKyAgICAgICAgICBYUGF0aENvbnRleHQgeGN0eHQsIFhQYXRoIGZyb21NYXRjaFBhdHRlcm4sIFhQYXRoIGNvdW50TWF0Y2hQYXR0ZXJuLCAKKyAgICAgICAgICBpbnQgY29udGV4dCwgRWxlbU51bWJlciBuYW1lc3BhY2VDb250ZXh0KQogICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewotCi0gICAgd2hpbGUgKG51bGwgIT0gY29udGV4dCkKKyAgICBEVE0gZHRtID0geGN0eHQuZ2V0RFRNKGNvbnRleHQpOworICAgIHdoaWxlIChEVE0uTlVMTCAhPSBjb250ZXh0KQogICAgIHsKICAgICAgIGlmIChudWxsICE9IGZyb21NYXRjaFBhdHRlcm4pCiAgICAgICB7CiAgICAgICAgIGlmIChmcm9tTWF0Y2hQYXR0ZXJuLmdldE1hdGNoU2NvcmUoeGN0eHQsIGNvbnRleHQpCiAgICAgICAgICAgICAgICAgIT0gWFBhdGguTUFUQ0hfU0NPUkVfTk9ORSkKICAgICAgICAgewotICAgICAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAgICAgIGNvbnRleHQgPSBEVE0uTlVMTDsKIAogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC02NDAsMTkgKzY0NSwxOSBAQAogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIE5vZGUgcHJldlNpYmxpbmcgPSBjb250ZXh0LmdldFByZXZpb3VzU2libGluZygpOworICAgICAgaW50IHByZXZTaWJsaW5nID0gZHRtLmdldFByZXZpb3VzU2libGluZyhjb250ZXh0KTsKIAotICAgICAgaWYgKG51bGwgPT0gcHJldlNpYmxpbmcpCisgICAgICBpZiAoRFRNLk5VTEwgPT0gcHJldlNpYmxpbmcpCiAgICAgICB7Ci0gICAgICAgIGNvbnRleHQgPSB4Y3R4dC5nZXRET01IZWxwZXIoKS5nZXRQYXJlbnRPZk5vZGUoY29udGV4dCk7CisgICAgICAgIGNvbnRleHQgPSBkdG0uZ2V0UGFyZW50KGNvbnRleHQpOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewogCiAgICAgICAgIC8vIE5vdyBnbyBkb3duIHRoZSBjaGFpbiBvZiBjaGlsZHJlbiBvZiB0aGlzIHNpYmxpbmcgCi0gICAgICAgIGNvbnRleHQgPSBwcmV2U2libGluZy5nZXRMYXN0Q2hpbGQoKTsKKyAgICAgICAgY29udGV4dCA9IGR0bS5nZXRMYXN0Q2hpbGQocHJldlNpYmxpbmcpOwogCi0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCisgICAgICAgIGlmIChjb250ZXh0ID09IERUTS5OVUxMKQogICAgICAgICAgIGNvbnRleHQgPSBwcmV2U2libGluZzsKICAgICAgIH0KICAgICB9CkBAIC02NzAsNDggKzY3NSw0OCBAQAogICAgKgogICAgKiBAdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCi0gIFhQYXRoIGdldENvdW50TWF0Y2hQYXR0ZXJuKFhQYXRoQ29udGV4dCBzdXBwb3J0LCBOb2RlIGNvbnRleHROb2RlKQorICBYUGF0aCBnZXRDb3VudE1hdGNoUGF0dGVybihYUGF0aENvbnRleHQgc3VwcG9ydCwgaW50IGNvbnRleHROb2RlKQogICAgICAgICAgIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAogICAgIFhQYXRoIGNvdW50TWF0Y2hQYXR0ZXJuID0gbV9jb3VudE1hdGNoUGF0dGVybjsKLQorICAgIERUTSBkdG0gPSBzdXBwb3J0LmdldERUTShjb250ZXh0Tm9kZSk7CiAgICAgaWYgKG51bGwgPT0gY291bnRNYXRjaFBhdHRlcm4pCiAgICAgewotICAgICAgc3dpdGNoIChjb250ZXh0Tm9kZS5nZXROb2RlVHlwZSgpKQorICAgICAgc3dpdGNoIChkdG0uZ2V0Tm9kZVR5cGUoY29udGV4dE5vZGUpKQogICAgICAgewotICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6CisgICAgICBjYXNlIERUTS5FTEVNRU5UX05PREUgOgogCiAgICAgICAgIC8vIGNvdW50TWF0Y2hQYXR0ZXJuID0gbV9zdHlsZXNoZWV0LmNyZWF0ZU1hdGNoUGF0dGVybihjb250ZXh0Tm9kZS5nZXROb2RlTmFtZSgpLCB0aGlzKTsKLSAgICAgICAgY291bnRNYXRjaFBhdHRlcm4gPSBuZXcgWFBhdGgoY29udGV4dE5vZGUuZ2V0Tm9kZU5hbWUoKSwgdGhpcywgdGhpcywKKyAgICAgICAgY291bnRNYXRjaFBhdHRlcm4gPSBuZXcgWFBhdGgoZHRtLmdldE5vZGVOYW1lKGNvbnRleHROb2RlKSwgdGhpcywgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFBhdGguTUFUQ0gsIHN1cHBvcnQuZ2V0RXJyb3JMaXN0ZW5lcigpKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgorICAgICAgY2FzZSBEVE0uQVRUUklCVVRFX05PREUgOgogCiAgICAgICAgIC8vIGNvdW50TWF0Y2hQYXR0ZXJuID0gbV9zdHlsZXNoZWV0LmNyZWF0ZU1hdGNoUGF0dGVybigiQCIrY29udGV4dE5vZGUuZ2V0Tm9kZU5hbWUoKSwgdGhpcyk7Ci0gICAgICAgIGNvdW50TWF0Y2hQYXR0ZXJuID0gbmV3IFhQYXRoKCJAIiArIGNvbnRleHROb2RlLmdldE5vZGVOYW1lKCksIHRoaXMsCisgICAgICAgIGNvdW50TWF0Y2hQYXR0ZXJuID0gbmV3IFhQYXRoKCJAIiArIGR0bS5nZXROb2RlTmFtZShjb250ZXh0Tm9kZSksIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIFhQYXRoLk1BVENILCBzdXBwb3J0LmdldEVycm9yTGlzdGVuZXIoKSk7CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKKyAgICAgIGNhc2UgRFRNLkNEQVRBX1NFQ1RJT05fTk9ERSA6CisgICAgICBjYXNlIERUTS5URVhUX05PREUgOgogCiAgICAgICAgIC8vIGNvdW50TWF0Y2hQYXR0ZXJuID0gbV9zdHlsZXNoZWV0LmNyZWF0ZU1hdGNoUGF0dGVybigidGV4dCgpIiwgdGhpcyk7CiAgICAgICAgIGNvdW50TWF0Y2hQYXR0ZXJuID0gbmV3IFhQYXRoKCJ0ZXh0KCkiLCB0aGlzLCB0aGlzLCBYUGF0aC5NQVRDSCwgc3VwcG9ydC5nZXRFcnJvckxpc3RlbmVyKCkpOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREUgOgorICAgICAgY2FzZSBEVE0uQ09NTUVOVF9OT0RFIDoKIAogICAgICAgICAvLyBjb3VudE1hdGNoUGF0dGVybiA9IG1fc3R5bGVzaGVldC5jcmVhdGVNYXRjaFBhdHRlcm4oImNvbW1lbnQoKSIsIHRoaXMpOwogICAgICAgICBjb3VudE1hdGNoUGF0dGVybiA9IG5ldyBYUGF0aCgiY29tbWVudCgpIiwgdGhpcywgdGhpcywgWFBhdGguTUFUQ0gsIHN1cHBvcnQuZ2V0RXJyb3JMaXN0ZW5lcigpKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6CisgICAgICBjYXNlIERUTS5ET0NVTUVOVF9OT0RFIDoKIAogICAgICAgICAvLyBjb3VudE1hdGNoUGF0dGVybiA9IG1fc3R5bGVzaGVldC5jcmVhdGVNYXRjaFBhdHRlcm4oIi8iLCB0aGlzKTsKICAgICAgICAgY291bnRNYXRjaFBhdHRlcm4gPSBuZXcgWFBhdGgoIi8iLCB0aGlzLCB0aGlzLCBYUGF0aC5NQVRDSCwgc3VwcG9ydC5nZXRFcnJvckxpc3RlbmVyKCkpOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgorICAgICAgY2FzZSBEVE0uUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKIAogICAgICAgICAvLyBjb3VudE1hdGNoUGF0dGVybiA9IG1fc3R5bGVzaGVldC5jcmVhdGVNYXRjaFBhdHRlcm4oInBpKCIrY29udGV4dE5vZGUuZ2V0Tm9kZU5hbWUoKSsiKSIsIHRoaXMpOwotICAgICAgICBjb3VudE1hdGNoUGF0dGVybiA9IG5ldyBYUGF0aCgicGkoIiArIGNvbnRleHROb2RlLmdldE5vZGVOYW1lKCkKKyAgICAgICAgY291bnRNYXRjaFBhdHRlcm4gPSBuZXcgWFBhdGgoInBpKCIgKyBkdG0uZ2V0Tm9kZU5hbWUoY29udGV4dE5vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikiLCB0aGlzLCB0aGlzLCBYUGF0aC5NQVRDSCwgc3VwcG9ydC5nZXRFcnJvckxpc3RlbmVyKCkpOwogICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQgOgpAQCAtNzMyLDcgKzczNyw3IEBACiAgICAqCiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCi0gIFN0cmluZyBnZXRDb3VudFN0cmluZyhUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIE5vZGUgc291cmNlTm9kZSkKKyAgU3RyaW5nIGdldENvdW50U3RyaW5nKFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgaW50IHNvdXJjZU5vZGUpCiAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIApAQCAtNzY4LDcgKzc3Myw3IEBACiAKICAgICAgICAgICBmb3IgKGludCBpID0gbGFzdEluZGV4OyBpID49IDA7IGktLSkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBOb2RlIHRhcmdldCA9IGFuY2VzdG9ycy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBpbnQgdGFyZ2V0ID0gYW5jZXN0b3JzLmVsZW1lbnRBdChpKTsKIAogICAgICAgICAgICAgbGlzdFtsYXN0SW5kZXggLSBpXSA9IGN0YWJsZS5jb3VudE5vZGUoeGN0eHQsIHRoaXMsIHRhcmdldCk7CiAgICAgICAgICAgfQpAQCAtNzkwLDExICs3OTUsMTIgQEAKICAgICoKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0UHJldmlvdXNOb2RlKFhQYXRoQ29udGV4dCB4Y3R4dCwgTm9kZSBwb3MpCisgIHB1YmxpYyBpbnQgZ2V0UHJldmlvdXNOb2RlKFhQYXRoQ29udGV4dCB4Y3R4dCwgaW50IHBvcykKICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCiAgICAgWFBhdGggY291bnRNYXRjaFBhdHRlcm4gPSBnZXRDb3VudE1hdGNoUGF0dGVybih4Y3R4dCwgcG9zKTsKKyAgICBEVE0gZHRtID0geGN0eHQuZ2V0RFRNKHBvcyk7CiAKICAgICBpZiAoQ29uc3RhbnRzLk5VTUJFUkxFVkVMX0FOWSA9PSBtX2xldmVsKQogICAgIHsKQEAgLTgwMywyMiArODA5LDIzIEBACiAgICAgICAvLyBEbyBhIGJhY2t3YXJkcyBkb2N1bWVudC1vcmRlciB3YWxrICd0aWxsIGEgbm9kZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgCiAgICAgICAvLyB0aGUgJ2Zyb20nIHBhdHRlcm4sIG9yIGEgbm9kZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlICdjb3VudCcgcGF0dGVybiwgCiAgICAgICAvLyBvciB0aGUgdG9wIG9mIHRoZSB0cmVlIGlzIGZvdW5kLgotICAgICAgd2hpbGUgKG51bGwgIT0gcG9zKQorICAgICAgd2hpbGUgKERUTS5OVUxMICE9IHBvcykKICAgICAgIHsKIAogICAgICAgICAvLyBHZXQgdGhlIHByZXZpb3VzIHNpYmxpbmcsIGlmIHRoZXJlIGlzIG5vIHByZXZpb3VzIHNpYmxpbmcsIAogICAgICAgICAvLyB0aGVuIGNvdW50IHRoZSBwYXJlbnQsIGJ1dCBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHNpYmxpbmcsIAogICAgICAgICAvLyBkaXZlIGRvd24gdG8gdGhlIGxvd2VzdCByaWdodC1oYW5kIChsYXN0KSBjaGlsZCBvZiB0aGF0IHNpYmxpbmcuCi0gICAgICAgIE5vZGUgbmV4dCA9IHBvcy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKKyAgICAgICAgaW50IG5leHQgPSBkdG0uZ2V0UHJldmlvdXNTaWJsaW5nKHBvcyk7CiAKLSAgICAgICAgaWYgKG51bGwgPT0gbmV4dCkKKyAgICAgICAgaWYgKERUTS5OVUxMID09IG5leHQpCiAgICAgICAgIHsKLSAgICAgICAgICBuZXh0ID0gcG9zLmdldFBhcmVudE5vZGUoKTsKKyAgICAgICAgICBuZXh0ID0gZHRtLmdldFBhcmVudChwb3MpOwogCi0gICAgICAgICAgaWYgKChudWxsICE9IG5leHQpICYmICgoKChudWxsICE9IGZyb21NYXRjaFBhdHRlcm4pICYmIChmcm9tTWF0Y2hQYXR0ZXJuLmdldE1hdGNoU2NvcmUoCi0gICAgICAgICAgICAgICAgICB4Y3R4dCwgbmV4dCkgIT0gWFBhdGguTUFUQ0hfU0NPUkVfTk9ORSkpKSB8fCAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkpKQorICAgICAgICAgIGlmICgoRFRNLk5VTEwgIT0gbmV4dCkgJiYgKCgoKG51bGwgIT0gZnJvbU1hdGNoUGF0dGVybikgJiYgKGZyb21NYXRjaFBhdHRlcm4uZ2V0TWF0Y2hTY29yZSgKKyAgICAgICAgICAgICAgICAgIHhjdHh0LCBuZXh0KSAhPSBYUGF0aC5NQVRDSF9TQ09SRV9OT05FKSkpIAorICAgICAgICAgICAgICB8fCAoZHRtLmdldE5vZGVUeXBlKG5leHQpID09IERUTS5ET0NVTUVOVF9OT0RFKSkpCiAgICAgICAgICAgewotICAgICAgICAgICAgcG9zID0gbnVsbDsgIC8vIHJldHVybiBudWxsIGZyb20gZnVuY3Rpb24uCisgICAgICAgICAgICBwb3MgPSBEVE0uTlVMTDsgIC8vIHJldHVybiBudWxsIGZyb20gZnVuY3Rpb24uCiAKICAgICAgICAgICAgIGJyZWFrOyAgLy8gZnJvbSB3aGlsZSBsb29wCiAgICAgICAgICAgfQpAQCAtODI3LDIwICs4MzQsMjAgQEAKICAgICAgICAgewogCiAgICAgICAgICAgLy8gZGl2ZSBkb3duIHRvIHRoZSBsb3dlc3QgcmlnaHQgY2hpbGQuCi0gICAgICAgICAgTm9kZSBjaGlsZCA9IG5leHQ7CisgICAgICAgICAgaW50IGNoaWxkID0gbmV4dDsKIAotICAgICAgICAgIHdoaWxlIChudWxsICE9IGNoaWxkKQorICAgICAgICAgIHdoaWxlIChEVE0uTlVMTCAhPSBjaGlsZCkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGlsZCA9IG5leHQuZ2V0TGFzdENoaWxkKCk7CisgICAgICAgICAgICBjaGlsZCA9IGR0bS5nZXRMYXN0Q2hpbGQobmV4dCk7CiAKLSAgICAgICAgICAgIGlmIChudWxsICE9IGNoaWxkKQorICAgICAgICAgICAgaWYgKERUTS5OVUxMICE9IGNoaWxkKQogICAgICAgICAgICAgICBuZXh0ID0gY2hpbGQ7CiAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcG9zID0gbmV4dDsKIAotICAgICAgICBpZiAoKG51bGwgIT0gcG9zKQorICAgICAgICBpZiAoKERUTS5OVUxMICE9IHBvcykKICAgICAgICAgICAgICAgICAmJiAoKG51bGwgPT0gY291bnRNYXRjaFBhdHRlcm4pCiAgICAgICAgICAgICAgICAgICAgIHx8IChjb3VudE1hdGNoUGF0dGVybi5nZXRNYXRjaFNjb3JlKHhjdHh0LCBwb3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAhPSBYUGF0aC5NQVRDSF9TQ09SRV9OT05FKSkpCkBAIC04NTEsMTEgKzg1OCwxMSBAQAogICAgIH0KICAgICBlbHNlICAvLyBOVU1CRVJMRVZFTF9NVUxUSSBvciBOVU1CRVJMRVZFTF9TSU5HTEUKICAgICB7Ci0gICAgICB3aGlsZSAobnVsbCAhPSBwb3MpCisgICAgICB3aGlsZSAoRFRNLk5VTEwgIT0gcG9zKQogICAgICAgewotICAgICAgICBwb3MgPSBwb3MuZ2V0UHJldmlvdXNTaWJsaW5nKCk7CisgICAgICAgIHBvcyA9IGR0bS5nZXRQcmV2aW91c1NpYmxpbmcocG9zKTsKIAotICAgICAgICBpZiAoKG51bGwgIT0gcG9zKQorICAgICAgICBpZiAoKERUTS5OVUxMICE9IHBvcykKICAgICAgICAgICAgICAgICAmJiAoKG51bGwgPT0gY291bnRNYXRjaFBhdHRlcm4pCiAgICAgICAgICAgICAgICAgICAgIHx8IChjb3VudE1hdGNoUGF0dGVybi5nZXRNYXRjaFNjb3JlKHhjdHh0LCBwb3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAhPSBYUGF0aC5NQVRDSF9TQ09SRV9OT05FKSkpCkBAIC04NzgsMTEgKzg4NSwxMSBAQAogICAgKgogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgTm9kZSBnZXRUYXJnZXROb2RlKFhQYXRoQ29udGV4dCB4Y3R4dCwgTm9kZSBzb3VyY2VOb2RlKQorICBwdWJsaWMgaW50IGdldFRhcmdldE5vZGUoWFBhdGhDb250ZXh0IHhjdHh0LCBpbnQgc291cmNlTm9kZSkKICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCi0gICAgTm9kZSB0YXJnZXQgPSBudWxsOworICAgIGludCB0YXJnZXQgPSBEVE0uTlVMTDsKICAgICBYUGF0aCBjb3VudE1hdGNoUGF0dGVybiA9IGdldENvdW50TWF0Y2hQYXR0ZXJuKHhjdHh0LCBzb3VyY2VOb2RlKTsKIAogICAgIGlmIChDb25zdGFudHMuTlVNQkVSTEVWRUxfQU5ZID09IG1fbGV2ZWwpCkBAIC05MTYsMTQgKzkyMywxNSBAQAogICAgKiBAdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIE5vZGVWZWN0b3IgZ2V0TWF0Y2hpbmdBbmNlc3RvcnMoCi0gICAgICAgICAgWFBhdGhDb250ZXh0IHhjdHh0LCBOb2RlIG5vZGUsIGJvb2xlYW4gc3RvcEF0Rmlyc3RGb3VuZCkKKyAgICAgICAgICBYUGF0aENvbnRleHQgeGN0eHQsIGludCBub2RlLCBib29sZWFuIHN0b3BBdEZpcnN0Rm91bmQpCiAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKICAgICBOb2RlU2V0IGFuY2VzdG9ycyA9IG5ldyBOb2RlU2V0KCk7CiAgICAgWFBhdGggY291bnRNYXRjaFBhdHRlcm4gPSBnZXRDb3VudE1hdGNoUGF0dGVybih4Y3R4dCwgbm9kZSk7CisgICAgRFRNIGR0bSA9IHhjdHh0LmdldERUTShub2RlKTsKIAotICAgIHdoaWxlIChudWxsICE9IG5vZGUpCisgICAgd2hpbGUgKERUTS5OVUxMICE9IG5vZGUpCiAgICAgewogICAgICAgaWYgKChudWxsICE9IG1fZnJvbU1hdGNoUGF0dGVybikKICAgICAgICAgICAgICAgJiYgKG1fZnJvbU1hdGNoUGF0dGVybi5nZXRNYXRjaFNjb3JlKHhjdHh0LCBub2RlKQpAQCAtOTUzLDcgKzk2MSw3IEBACiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKLSAgICAgIG5vZGUgPSB4Y3R4dC5nZXRET01IZWxwZXIoKS5nZXRQYXJlbnRPZk5vZGUobm9kZSk7CisgICAgICBub2RlID0gZHRtLmdldFBhcmVudChub2RlKTsKICAgICB9CiAKICAgICByZXR1cm4gYW5jZXN0b3JzOwpAQCAtOTcwLDcgKzk3OCw3IEBACiAgICAqCiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCi0gIExvY2FsZSBnZXRMb2NhbGUoVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIGNvbnRleHROb2RlKQorICBMb2NhbGUgZ2V0TG9jYWxlKFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgaW50IGNvbnRleHROb2RlKQogICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKQEAgLTk5Miw5ICsxMDAwLDEwIEBACiAgICAgICAgIC8vTG9jYWxlLmdldERlZmF1bHQoKS5nZXREaXNwbGF5Q291bnRyeSgpKTsKICAgICAgICAgaWYgKG51bGwgPT0gbG9jYWxlKQogICAgICAgICB7Ci0gICAgICAgICAgdHJhbnNmb3JtZXIuZ2V0TXNnTWdyKCkud2Fybih0aGlzLCBudWxsLCBjb250ZXh0Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTTFRFcnJvclJlc291cmNlcy5XR19MT0NBTEVfTk9UX0ZPVU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBsYW5nVmFsdWUgfSk7ICAvLyJXYXJuaW5nOiBDb3VsZCBub3QgZmluZCBsb2NhbGUgZm9yIHhtbDpsYW5nPSIrbGFuZ1ZhbHVlKTsKKyAgICAgICAgICAvLyAlRFRCRCUKKy8vICAgICAgICAgIHRyYW5zZm9ybWVyLmdldE1zZ01ncigpLndhcm4odGhpcywgbnVsbCwgY29udGV4dE5vZGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTTFRFcnJvclJlc291cmNlcy5XR19MT0NBTEVfTk9UX0ZPVU5ELAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGxhbmdWYWx1ZSB9KTsgIC8vIldhcm5pbmc6IENvdWxkIG5vdCBmaW5kIGxvY2FsZSBmb3IgeG1sOmxhbmc9IitsYW5nVmFsdWUpOwogCiAgICAgICAgICAgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKICAgICAgICAgfQpAQCAtMTAxOSw3ICsxMDI4LDcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHJpdmF0ZSBEZWNpbWFsRm9ybWF0IGdldE51bWJlckZvcm1hdHRlcigKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIE5vZGUgY29udGV4dE5vZGUpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgaW50IGNvbnRleHROb2RlKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogICAgIC8vIFBhdGNoIGZyb20gU3RldmVuIFNlcm9ja2kKICAgICAvLyBNYXliZSB3ZSByZWFsbHkgd2FudCB0byBkbyB0aGUgY2xvbmUgaW4gZ2V0TG9jYWxlKCkgYW5kIHJldHVybiAgCkBAIC0xMDc4LDcgKzEwODcsNyBAQAogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwogICBTdHJpbmcgZm9ybWF0TnVtYmVyTGlzdCgKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIGludFtdIGxpc3QsIE5vZGUgY29udGV4dE5vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBpbnRbXSBsaXN0LCBpbnQgY29udGV4dE5vZGUpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCkBAIC0xMjM1LDcgKzEyNDQsNyBAQAogICAgKiBAdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHByaXZhdGUgdm9pZCBnZXRGb3JtYXR0ZWROdW1iZXIoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIGNvbnRleHROb2RlLCAKKyAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIGludCBjb250ZXh0Tm9kZSwgCiAgICAgICAgICAgY2hhciBudW1iZXJUeXBlLCBpbnQgbnVtYmVyV2lkdGgsIGludCBsaXN0RWxlbWVudCwgCiAgICAgICAgICAgRmFzdFN0cmluZ0J1ZmZlciBmb3JtYXR0ZWROdW1iZXIpCiAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1QSS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1QSS5qYXZhCmluZGV4IDQ3ODUxMDAuLjc0ODA2MjQgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtUEkuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVBJLmphdmEKQEAgLTU2LDcgKzU2LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLio7CisvL2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIGltcG9ydCBvcmcueG1sLnNheC4qOwogCkBAIC0xNDcsMTkgKzE0OCwyMSBAQAogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgdm9pZCBleGVjdXRlKAotICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlKQorICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lcikKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKICAgICBpZiAoVHJhbnNmb3JtZXJJbXBsLlNfREVCVUcpCi0gICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudChzb3VyY2VOb2RlLCBtb2RlLCB0aGlzKTsKKyAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHRoaXMpOwogCi0gICAgU3RyaW5nIHBpTmFtZSA9IG1fbmFtZV9hdHYuZXZhbHVhdGUodHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZSwgdGhpcyk7CisgICAgWFBhdGhDb250ZXh0IHhjdHh0ID0gdHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCk7CisgICAgaW50IHNvdXJjZU5vZGUgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOworICAgIFN0cmluZyBwaU5hbWUgPSBtX25hbWVfYXR2LmV2YWx1YXRlKHhjdHh0LCBzb3VyY2VOb2RlLCB0aGlzKTsKIAogICAgIGlmIChwaU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgieG1sIikpCiAgICAgewotICAgICAgZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSX1BST0NFU1NJTkdJTlNUUlVDVElPTl9OQU1FX0NBTlRfQkVfWE1MKTsgIC8vInByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24gbmFtZSBjYW4gbm90IGJlICd4bWwnIik7CisgICAgICAvLyAlRFRCRCUKKy8vICAgICAgZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSX1BST0NFU1NJTkdJTlNUUlVDVElPTl9OQU1FX0NBTlRfQkVfWE1MKTsgIC8vInByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24gbmFtZSBjYW4gbm90IGJlICd4bWwnIik7CiAgICAgfQogICAgIGVsc2UgaWYgKCFpc1ZhbGlkTkNOYW1lKHBpTmFtZSkpCiAgICAgewpAQCAtMTc1LDcgKzE3OCw3IEBACiAgICAgLy8gfCB4c2w6ZWxlbWVudAogICAgIC8vIHwgeHNsOmF0dHJpYnV0ZQogICAgIC8vICI+Ci0gICAgU3RyaW5nIGRhdGEgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ub1N0cmluZyh0aGlzLCBzb3VyY2VOb2RlLCBtb2RlKTsKKyAgICBTdHJpbmcgZGF0YSA9IHRyYW5zZm9ybWVyLnRyYW5zZm9ybVRvU3RyaW5nKHRoaXMpOwogCiAgICAgdHJ5CiAgICAgewpAQCAtMTk2LDcgKzE5OSw3IEBACiAgICAqCiAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHB1YmxpYyBFbGVtVGVtcGxhdGVFbGVtZW50IGFwcGVuZENoaWxkKEVsZW1UZW1wbGF0ZUVsZW1lbnQgbmV3Q2hpbGQpCiAgIHsKIAogICAgIGludCB0eXBlID0gKChFbGVtVGVtcGxhdGVFbGVtZW50KSBuZXdDaGlsZCkuZ2V0WFNMVG9rZW4oKTsKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtUGFyYW0uamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtUGFyYW0uamF2YQppbmRleCA1YzVjYmQ1Li5iNjNiZTFmIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVBhcmFtLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1QYXJhbS5qYXZhCkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZXhlY3V0ZSgKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCkBAIC0xNDUsMTMgKzE0NSwxMyBAQAogCiAgICAgaWYgKG51bGwgPT0gYXJnKQogICAgIHsKLSAgICAgIHN1cGVyLmV4ZWN1dGUodHJhbnNmb3JtZXIsIHNvdXJjZU5vZGUsIG1vZGUpOworICAgICAgc3VwZXIuZXhlY3V0ZSh0cmFuc2Zvcm1lcik7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICBhcmcuc2V0SXNWaXNpYmxlKHRydWUpOwogICAgICAgaWYgKFRyYW5zZm9ybWVySW1wbC5TX0RFQlVHKQotICAgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudChzb3VyY2VOb2RlLCBtb2RlLCB0aGlzKTsKKyAgICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQodGhpcyk7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVRlbXBsYXRlLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVRlbXBsYXRlLmphdmEKaW5kZXggYWM2OWRjNS4uODliOGYyOCAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1UZW1wbGF0ZS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVGVtcGxhdGUuamF2YQpAQCAtMzY4LDI1ICszNjgsMjUgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZXhlY3V0ZSgKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewotCiAgICAgaWYgKFRyYW5zZm9ybWVySW1wbC5TX0RFQlVHKQotICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQoc291cmNlTm9kZSwgbW9kZSwgdGhpcyk7CisgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudCh0aGlzKTsKIAotICAgIGlmIChudWxsICE9IHNvdXJjZU5vZGUpCi0gICAgewotICAgICAgdHJhbnNmb3JtZXIuZXhlY3V0ZUNoaWxkVGVtcGxhdGVzKHRoaXMsIHNvdXJjZU5vZGUsIG1vZGUsIHRydWUpOwotICAgIH0KLSAgICBlbHNlICAvLyBpZihudWxsID09IHNvdXJjZU5vZGUpCi0gICAgewotICAgICAgdHJhbnNmb3JtZXIuZ2V0TXNnTWdyKCkuZXJyb3IodGhpcywKLSAgICAgICAgdGhpcywgc291cmNlTm9kZSwKLSAgICAgICAgWFNMVEVycm9yUmVzb3VyY2VzLkVSX05VTExfU09VUkNFTk9ERV9IQU5ETEVBUFBMWVRFTVBMQVRFUyk7Ci0KLSAgICAgIC8vInNvdXJjZU5vZGUgaXMgbnVsbCBpbiBoYW5kbGVBcHBseVRlbXBsYXRlc0luc3RydWN0aW9uISIpOwotICAgIH0KKyAgICAgIC8vICVSRVZJRVclIGNvbW1lbnRpbmcgb3V0IG9mIHRoZSBjb2RlIGJlbG93LgorLy8gICAgaWYgKG51bGwgIT0gc291cmNlTm9kZSkKKy8vICAgIHsKKyAgICAgIHRyYW5zZm9ybWVyLmV4ZWN1dGVDaGlsZFRlbXBsYXRlcyh0aGlzLCB0cnVlKTsKKy8vICAgIH0KKy8vICAgIGVsc2UgIC8vIGlmKG51bGwgPT0gc291cmNlTm9kZSkKKy8vICAgIHsKKy8vICAgICAgdHJhbnNmb3JtZXIuZ2V0TXNnTWdyKCkuZXJyb3IodGhpcywKKy8vICAgICAgICB0aGlzLCBzb3VyY2VOb2RlLAorLy8gICAgICAgIFhTTFRFcnJvclJlc291cmNlcy5FUl9OVUxMX1NPVVJDRU5PREVfSEFORExFQVBQTFlURU1QTEFURVMpOworLy8KKy8vICAgICAgLy8ic291cmNlTm9kZSBpcyBudWxsIGluIGhhbmRsZUFwcGx5VGVtcGxhdGVzSW5zdHJ1Y3Rpb24hIik7CisvLyAgICB9CiAgIH0KIAogICAvKioKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVGVtcGxhdGVFbGVtZW50LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVRlbXBsYXRlRWxlbWVudC5qYXZhCmluZGV4IDE1ZWFkZWMuLjUwYWU3MDIgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVGVtcGxhdGVFbGVtZW50LmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1UZW1wbGF0ZUVsZW1lbnQuamF2YQpAQCAtODIsMTAgKzgyLDExIEBACiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yOwogCiAvLyBET00gSW1wb3J0cwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworLy9pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworLy9pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogLy8gU0FYIEltcG9ydHMKIGltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwpAQCAtMTc1LDcgKzE3Niw3IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gaWYgYW55IGNoZWNrZWQgZXhjZXB0aW9uIG9jY3Vycy4KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9ue30KIAogICAvKioKQEAgLTI4Myw2ICsyODQsMTggQEAKICAgfQogICAKICAgLyoqCisgICAqIFRocm93IGFuIGVycm9yLgorICAgKgorICAgKiBAcGFyYW0gbXNnIE1lc3NhZ2UgY29kZSBmb3IgdGhlIGVycm9yCisgICAqLworICBwdWJsaWMgdm9pZCBlcnJvcihpbnQgbXNnKQorICB7CisgICAgZXJyb3IoCisgICAgICBYU0xNZXNzYWdlcy5jcmVhdGVNZXNzYWdlKAorICAgICAgICBYU0xURXJyb3JSZXNvdXJjZXMuRVJfRUxFTVRFTVBMQVRFRUxFTV9FUlIsIG51bGwpKTsKKyAgfQorICAKKyAgLyoqCiAgICAqIFRocm93IGEgdGVtcGxhdGUgZWxlbWVudCBydW50aW1lIGVycm9yLiAgKE5vdGU6IHNob3VsZCB3ZSB0aHJvdyBhIFRyYW5zZm9ybWVyRXhjZXB0aW9uIGluc3RlYWQ/KQogICAgKgogICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIHRoZSBlcnJvciB0aGF0IG9jY3VyZWQuCkBAIC0yOTUsNiArMzA4LDQ1IEBACiAgIAogCiAgIC8vIEltcGxlbWVudGVkIERPTSBFbGVtZW50IG1ldGhvZHMuCisvLyAlRFRCRCUKKy8vICAvKioKKy8vICAgKiBBZGQgYSBjaGlsZCB0byB0aGUgY2hpbGQgbGlzdC4KKy8vICAgKiBOT1RFOiBUaGlzIHByZXN1bWVzIHRoZSBjaGlsZCBkaWQgbm90IHByZXZpb3VzbHkgaGF2ZSBhIHBhcmVudC4KKy8vICAgKiBNYWtpbmcgdGhhdCBhc3N1bXB0aW9uIG1ha2VzIHRoaXMgYSBsZXNzIGV4cGVuc2l2ZSBvcGVyYXRpb24gLS0gYnV0CisvLyAgICogcmVxdWlyZXMgdGhhdCBpZiB5b3UgKmRvKiB3YW50IHRvIHJlcGFyZW50IGEgbm9kZSwgeW91IHVzZSByZW1vdmVDaGlsZCgpCisvLyAgICogZmlyc3QgdG8gcmVtb3ZlIGl0IGZyb20gaXRzIHByZXZpb3VzIGNvbnRleHQuIEZhaWxpbmcgdG8gZG8gc28gd2lsbAorLy8gICAqIGRhbWFnZSB0aGUgdHJlZS4KKy8vICAgKgorLy8gICAqIEBwYXJhbSBuZXdDaGlsZCBDaGlsZCB0byBiZSBhZGRlZCB0byBjaGlsZCBsaXN0CisvLyAgICoKKy8vICAgKiBAcmV0dXJuIENoaWxkIGp1c3QgYWRkZWQgdG8gdGhlIGNoaWxkIGxpc3QKKy8vICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorLy8gICAqLworLy8gIHB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbmV3Q2hpbGQpIHRocm93cyBET01FeGNlcHRpb24KKy8vICB7CisvLworLy8gICAgaWYgKG51bGwgPT0gbmV3Q2hpbGQpCisvLyAgICB7CisvLyAgICAgIGVycm9yKFhTTFRFcnJvclJlc291cmNlcy5FUl9OVUxMX0NISUxELCBudWxsKTsgIC8vIlRyeWluZyB0byBhZGQgYSBudWxsIGNoaWxkISIpOworLy8gICAgfQorLy8KKy8vICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgZWxlbSA9IChFbGVtVGVtcGxhdGVFbGVtZW50KSBuZXdDaGlsZDsKKy8vCisvLyAgICBpZiAobnVsbCA9PSBtX2ZpcnN0Q2hpbGQpCisvLyAgICB7CisvLyAgICAgIG1fZmlyc3RDaGlsZCA9IGVsZW07CisvLyAgICB9CisvLyAgICBlbHNlCisvLyAgICB7CisvLyAgICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgbGFzdCA9IChFbGVtVGVtcGxhdGVFbGVtZW50KSBnZXRMYXN0Q2hpbGQoKTsKKy8vCisvLyAgICAgIGxhc3QubV9uZXh0U2libGluZyA9IGVsZW07CisvLyAgICB9CisvLworLy8gICAgZWxlbS5tX3BhcmVudE5vZGUgPSB0aGlzOworLy8KKy8vICAgIHJldHVybiBuZXdDaGlsZDsKKy8vICB9CiAKICAgLyoqCiAgICAqIEFkZCBhIGNoaWxkIHRvIHRoZSBjaGlsZCBsaXN0LgpAQCAtMzA3LDM0ICszNTksMzIgQEAKICAgICogQHBhcmFtIG5ld0NoaWxkIENoaWxkIHRvIGJlIGFkZGVkIHRvIGNoaWxkIGxpc3QKICAgICoKICAgICogQHJldHVybiBDaGlsZCBqdXN0IGFkZGVkIHRvIHRoZSBjaGlsZCBsaXN0Ci0gICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHB1YmxpYyBFbGVtVGVtcGxhdGVFbGVtZW50IGFwcGVuZENoaWxkKEVsZW1UZW1wbGF0ZUVsZW1lbnQgZWxlbSkKICAgewogCi0gICAgaWYgKG51bGwgPT0gbmV3Q2hpbGQpCisgICAgaWYgKG51bGwgPT0gZWxlbSkKICAgICB7CiAgICAgICBlcnJvcihYU0xURXJyb3JSZXNvdXJjZXMuRVJfTlVMTF9DSElMRCwgbnVsbCk7ICAvLyJUcnlpbmcgdG8gYWRkIGEgbnVsbCBjaGlsZCEiKTsKICAgICB9CiAKLSAgICBFbGVtVGVtcGxhdGVFbGVtZW50IGVsZW0gPSAoRWxlbVRlbXBsYXRlRWxlbWVudCkgbmV3Q2hpbGQ7Ci0KICAgICBpZiAobnVsbCA9PSBtX2ZpcnN0Q2hpbGQpCiAgICAgewogICAgICAgbV9maXJzdENoaWxkID0gZWxlbTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgbGFzdCA9IChFbGVtVGVtcGxhdGVFbGVtZW50KSBnZXRMYXN0Q2hpbGQoKTsKKyAgICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgbGFzdCA9IGdldExhc3RDaGlsZEVsZW0oKTsKIAogICAgICAgbGFzdC5tX25leHRTaWJsaW5nID0gZWxlbTsKICAgICB9CiAKICAgICBlbGVtLm1fcGFyZW50Tm9kZSA9IHRoaXM7CiAKLSAgICByZXR1cm4gbmV3Q2hpbGQ7CisgICAgcmV0dXJuIGVsZW07CiAgIH0KIAorCiAgIC8qKgogICAgKiBUZWxsIGlmIHRoZXJlIGFyZSBjaGlsZCBub2Rlcy4KICAgICoKQEAgLTM1MiwxOCArNDAyLDE5IEBACiAgICAqLwogICBwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKQogICB7Ci0gICAgcmV0dXJuIE5vZGUuRUxFTUVOVF9OT0RFOworICAgIHJldHVybiBvcmcudzNjLmRvbS5Ob2RlLkVMRU1FTlRfTk9ERTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG5vZGVsaXN0IChzYW1lIHJlZmVyZW5jZSkuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG5vZGVsaXN0IGNvbnRhaW5pbmcgdGhlIGNoaWxkIG5vZGVzICh0aGlzKQotICAgKi8KLSAgcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKQotICB7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KKyAgLy8gJURUQkQlCisvLyAgLyoqCisvLyAgICogUmV0dXJuIHRoZSBub2RlbGlzdCAoc2FtZSByZWZlcmVuY2UpLgorLy8gICAqCisvLyAgICogQHJldHVybiBUaGUgbm9kZWxpc3QgY29udGFpbmluZyB0aGUgY2hpbGQgbm9kZXMgKHRoaXMpCisvLyAgICovCisvLyAgcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKQorLy8gIHsKKy8vICAgIHJldHVybiB0aGlzOworLy8gIH0KIAogICAvKioKICAgICogUmVtb3ZlIGEgY2hpbGQuCkBAIC0zNzgsMTAgKzQyOSw4IEBACiAgICAqCiAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgY2hpbGQsIG9yIG51bGwgaWYgdGhlIHNwZWNpZmllZAogICAgKiBub2RlIHdhcyBub3QgYSBjaGlsZCBvZiB0aGlzIGVsZW1lbnQuCi0gICAqCi0gICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgTm9kZSByZW1vdmVDaGlsZChFbGVtVGVtcGxhdGVFbGVtZW50IGNoaWxkRVRFKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHB1YmxpYyBFbGVtVGVtcGxhdGVFbGVtZW50IHJlbW92ZUNoaWxkKEVsZW1UZW1wbGF0ZUVsZW1lbnQgY2hpbGRFVEUpCiAgIHsKIAogICAgIGlmIChjaGlsZEVURSA9PSBudWxsIHx8IGNoaWxkRVRFLm1fcGFyZW50Tm9kZSAhPSB0aGlzKQpAQCAtMzkyLDggKzQ0MSw3IEBACiAgICAgICBtX2ZpcnN0Q2hpbGQgPSBjaGlsZEVURS5tX25leHRTaWJsaW5nOwogICAgIGVsc2UKICAgICB7Ci0gICAgICBFbGVtVGVtcGxhdGVFbGVtZW50IHByZXYgPQotICAgICAgICAoRWxlbVRlbXBsYXRlRWxlbWVudCkgKGNoaWxkRVRFLmdldFByZXZpb3VzU2libGluZygpKTsKKyAgICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgcHJldiA9IGNoaWxkRVRFLmdldFByZXZpb3VzU2libGluZ0VsZW0oKTsKIAogICAgICAgcHJldi5tX25leHRTaWJsaW5nID0gY2hpbGRFVEUubV9uZXh0U2libGluZzsKICAgICB9CkBAIC00MDUsNiArNDUzLDQ3IEBACiAgICAgcmV0dXJuIGNoaWxkRVRFOwogICB9CiAKKyAgLy8gJURUQkQlCisvLyAgLyoqCisvLyAgICogUmVwbGFjZSB0aGUgb2xkIGNoaWxkIHdpdGggYSBuZXcgY2hpbGQuCisvLyAgICoKKy8vICAgKiBAcGFyYW0gbmV3Q2hpbGQgTmV3IGNoaWxkIHRvIHJlcGxhY2Ugd2l0aAorLy8gICAqIEBwYXJhbSBvbGRDaGlsZCBPbGQgY2hpbGQgdG8gYmUgcmVwbGFjZWQKKy8vICAgKgorLy8gICAqIEByZXR1cm4gVGhlIG5ldyBjaGlsZAorLy8gICAqCisvLyAgICogQHRocm93cyBET01FeGNlcHRpb24KKy8vICAgKi8KKy8vICBwdWJsaWMgTm9kZSByZXBsYWNlQ2hpbGQoTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbgorLy8gIHsKKy8vCisvLyAgICBpZiAob2xkQ2hpbGQgPT0gbnVsbCB8fCBvbGRDaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gdGhpcykKKy8vICAgICAgcmV0dXJuIG51bGw7CisvLworLy8gICAgRWxlbVRlbXBsYXRlRWxlbWVudCBuZXdDaGlsZEVsZW0gPSAoKEVsZW1UZW1wbGF0ZUVsZW1lbnQpIG5ld0NoaWxkKTsKKy8vICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgb2xkQ2hpbGRFbGVtID0gKChFbGVtVGVtcGxhdGVFbGVtZW50KSBvbGRDaGlsZCk7CisvLworLy8gICAgLy8gRml4IHVwIHByZXZpb3VzIHNpYmxpbmcuCisvLyAgICBFbGVtVGVtcGxhdGVFbGVtZW50IHByZXYgPQorLy8gICAgICAoRWxlbVRlbXBsYXRlRWxlbWVudCkgb2xkQ2hpbGRFbGVtLmdldFByZXZpb3VzU2libGluZygpOworLy8KKy8vICAgIGlmIChudWxsICE9IHByZXYpCisvLyAgICAgIHByZXYubV9uZXh0U2libGluZyA9IG5ld0NoaWxkRWxlbTsKKy8vCisvLyAgICAvLyBGaXggdXAgcGFyZW50ICh0aGlzKQorLy8gICAgaWYgKG1fZmlyc3RDaGlsZCA9PSBvbGRDaGlsZEVsZW0pCisvLyAgICAgIG1fZmlyc3RDaGlsZCA9IG5ld0NoaWxkRWxlbTsKKy8vCisvLyAgICBuZXdDaGlsZEVsZW0ubV9wYXJlbnROb2RlID0gdGhpczsKKy8vICAgIG9sZENoaWxkRWxlbS5tX3BhcmVudE5vZGUgPSBudWxsOworLy8gICAgbmV3Q2hpbGRFbGVtLm1fbmV4dFNpYmxpbmcgPSBvbGRDaGlsZEVsZW0ubV9uZXh0U2libGluZzsKKy8vICAgIG9sZENoaWxkRWxlbS5tX25leHRTaWJsaW5nID0gbnVsbDsKKy8vCisvLyAgICAvLyBuZXdDaGlsZEVsZW0ubV9zdHlsZXNoZWV0ID0gb2xkQ2hpbGRFbGVtLm1fc3R5bGVzaGVldDsKKy8vICAgIC8vIG9sZENoaWxkRWxlbS5tX3N0eWxlc2hlZXQgPSBudWxsOworLy8gICAgcmV0dXJuIG5ld0NoaWxkRWxlbTsKKy8vICB9CisKICAgLyoqCiAgICAqIFJlcGxhY2UgdGhlIG9sZCBjaGlsZCB3aXRoIGEgbmV3IGNoaWxkLgogICAgKgpAQCAtNDE1LDE4ICs1MDQsMTYgQEAKICAgICoKICAgICogQHRocm93cyBET01FeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyBOb2RlIHJlcGxhY2VDaGlsZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHB1YmxpYyBFbGVtVGVtcGxhdGVFbGVtZW50IHJlcGxhY2VDaGlsZChFbGVtVGVtcGxhdGVFbGVtZW50IG5ld0NoaWxkRWxlbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtVGVtcGxhdGVFbGVtZW50IG9sZENoaWxkRWxlbSkKICAgewogCi0gICAgaWYgKG9sZENoaWxkID09IG51bGwgfHwgb2xkQ2hpbGQuZ2V0UGFyZW50Tm9kZSgpICE9IHRoaXMpCisgICAgaWYgKG9sZENoaWxkRWxlbSA9PSBudWxsIHx8IG9sZENoaWxkRWxlbS5nZXRQYXJlbnRFbGVtKCkgIT0gdGhpcykKICAgICAgIHJldHVybiBudWxsOwogCi0gICAgRWxlbVRlbXBsYXRlRWxlbWVudCBuZXdDaGlsZEVsZW0gPSAoKEVsZW1UZW1wbGF0ZUVsZW1lbnQpIG5ld0NoaWxkKTsKLSAgICBFbGVtVGVtcGxhdGVFbGVtZW50IG9sZENoaWxkRWxlbSA9ICgoRWxlbVRlbXBsYXRlRWxlbWVudCkgb2xkQ2hpbGQpOwotCiAgICAgLy8gRml4IHVwIHByZXZpb3VzIHNpYmxpbmcuCiAgICAgRWxlbVRlbXBsYXRlRWxlbWVudCBwcmV2ID0KLSAgICAgIChFbGVtVGVtcGxhdGVFbGVtZW50KSBvbGRDaGlsZEVsZW0uZ2V0UHJldmlvdXNTaWJsaW5nKCk7CisgICAgICBvbGRDaGlsZEVsZW0uZ2V0UHJldmlvdXNTaWJsaW5nRWxlbSgpOwogCiAgICAgaWYgKG51bGwgIT0gcHJldikKICAgICAgIHByZXYubV9uZXh0U2libGluZyA9IG5ld0NoaWxkRWxlbTsKQEAgLTQ2NywzOCArNTU0LDQwIEBACiAgICAgcmV0dXJuIGNvdW50OwogICB9ICAvLyBnZXRMZW5ndGgoKTppbnQKIAotICAvKioKLSAgICogTm9kZUxpc3QgbWV0aG9kOiBSZXR1cm4gdGhlIE50aCBpbW1lZGlhdGUgY2hpbGQgb2YgdGhpcyBub2RlLCBvcgotICAgKiBudWxsIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLgotICAgKgotICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgY2hpbGQgdG8gZmluZAotICAgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGU6IHRoZSBjaGlsZCBub2RlIGF0IGdpdmVuIGluZGV4Ci0gICAqLwotICBwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkKLSAgeworICAvLyAlVERCJQorLy8gIC8qKgorLy8gICAqIE5vZGVMaXN0IG1ldGhvZDogUmV0dXJuIHRoZSBOdGggaW1tZWRpYXRlIGNoaWxkIG9mIHRoaXMgbm9kZSwgb3IKKy8vICAgKiBudWxsIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLgorLy8gICAqCisvLyAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIGNoaWxkIHRvIGZpbmQKKy8vICAgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGU6IHRoZSBjaGlsZCBub2RlIGF0IGdpdmVuIGluZGV4CisvLyAgICovCisvLyAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpCisvLyAgeworLy8KKy8vICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZ2V0Q2hpbGROb2RlcyBjYWxsIHN5bmNocm9uaXplZAorLy8gICAgLy8gdGhlIGNoaWxkcmVuLiBUaGVyZWZvcmUsIHdlIGNhbiBhY2Nlc3MgdGhlIGZpcnN0IGNoaWxkCisvLyAgICAvLyByZWZlcmVuY2UgZGlyZWN0bHkuCisvLyAgICBFbGVtVGVtcGxhdGVFbGVtZW50IG5vZGUgPSBtX2ZpcnN0Q2hpbGQ7CisvLworLy8gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleCAmJiBub2RlICE9IG51bGw7IGkrKykKKy8vICAgIHsKKy8vICAgICAgbm9kZSA9IG5vZGUubV9uZXh0U2libGluZzsKKy8vICAgIH0KKy8vCisvLyAgICByZXR1cm4gbm9kZTsKKy8vICB9ICAvLyBpdGVtKGludCk6Tm9kZQogCi0gICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBnZXRDaGlsZE5vZGVzIGNhbGwgc3luY2hyb25pemVkCi0gICAgLy8gdGhlIGNoaWxkcmVuLiBUaGVyZWZvcmUsIHdlIGNhbiBhY2Nlc3MgdGhlIGZpcnN0IGNoaWxkCi0gICAgLy8gcmVmZXJlbmNlIGRpcmVjdGx5LgotICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgbm9kZSA9IG1fZmlyc3RDaGlsZDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXggJiYgbm9kZSAhPSBudWxsOyBpKyspCi0gICAgewotICAgICAgbm9kZSA9IG5vZGUubV9uZXh0U2libGluZzsKLSAgICB9Ci0KLSAgICByZXR1cm4gbm9kZTsKLSAgfSAgLy8gaXRlbShpbnQpOk5vZGUKLQotICAvKioKLSAgICogR2V0IHRoZSBzdHlsZXNoZWV0IG93bmVyLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBzdHlsZXNoZWV0IG93bmVyCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0U3R5bGVzaGVldCgpOwotICB9CisgIC8vICVEVEJEJQorLy8gIC8qKgorLy8gICAqIEdldCB0aGUgc3R5bGVzaGVldCBvd25lci4KKy8vICAgKgorLy8gICAqIEByZXR1cm4gVGhlIHN0eWxlc2hlZXQgb3duZXIKKy8vICAgKi8KKy8vICBwdWJsaWMgRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpCisvLyAgeworLy8gICAgcmV0dXJuIGdldFN0eWxlc2hlZXQoKTsKKy8vICB9CiAKICAgLyoqCiAgICAqIFJldHVybiB0aGUgZWxlbWVudCBuYW1lLgpAQCAtNzM0LDYgKzgyMywxMCBAQAogICAgKi8KICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VGb3JQcmVmaXgoU3RyaW5nIHByZWZpeCkKICAgeworLy8gICAgaWYgKG51bGwgIT0gcHJlZml4ICYmIHByZWZpeC5lcXVhbHMoInhtbG5zIikpCisvLyAgICB7CisvLyAgICAgIHJldHVybiBDb25zdGFudHMuU19YTUxOQU1FU1BBQ0VVUkk7CisvLyAgICB9CiAKICAgICBWZWN0b3IgbnNEZWNscyA9IG1fZGVjbGFyZWRQcmVmaXhlczsKIApAQCAtODg1LDcgKzk3OCw3IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgRWxlbVRlbXBsYXRlRWxlbWVudCBwYXJlbnQgPSAoRWxlbVRlbXBsYXRlRWxlbWVudCkgdGhpcy5nZXRQYXJlbnROb2RlKCk7CisgICAgRWxlbVRlbXBsYXRlRWxlbWVudCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudE5vZGVFbGVtKCk7CiAKICAgICBpZiAobnVsbCAhPSBwYXJlbnQpCiAgICAgewpAQCAtMTAzOSwxNSArMTEzMiwxNiBAQAogICAgKi8KICAgcHJvdGVjdGVkIEVsZW1UZW1wbGF0ZUVsZW1lbnQgbV9wYXJlbnROb2RlOwogCi0gIC8qKgotICAgKiBHZXQgdGhlIHBhcmVudCBhcyBhIE5vZGUuCi0gICAqCi0gICAqIEByZXR1cm4gVGhpcyBub2RlJ3MgcGFyZW50IG5vZGUKLSAgICovCi0gIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIG1fcGFyZW50Tm9kZTsKLSAgfQorICAvLyAlRFRCRCUKKy8vICAvKioKKy8vICAgKiBHZXQgdGhlIHBhcmVudCBhcyBhIE5vZGUuCisvLyAgICoKKy8vICAgKiBAcmV0dXJuIFRoaXMgbm9kZSdzIHBhcmVudCBub2RlCisvLyAgICovCisvLyAgcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpCisvLyAgeworLy8gICAgcmV0dXJuIG1fcGFyZW50Tm9kZTsKKy8vICB9CiAKICAgLyoqCiAgICAqIEdldCB0aGUgcGFyZW50IGFzIGFuIEVsZW1UZW1wbGF0ZUVsZW1lbnQuCkBAIC0xMDY1LDE1ICsxMTU5LDQyIEBACiAgICAqLwogICBFbGVtVGVtcGxhdGVFbGVtZW50IG1fbmV4dFNpYmxpbmc7CiAKLSAgLyoqCi0gICAqIEdldCB0aGUgbmV4dCBzaWJsaW5nIChhcyBhIE5vZGUpIG9yIHJldHVybiBudWxsLgotICAgKgotICAgKiBAcmV0dXJuIHRoaXMgbm9kZSdzIG5leHQgc2libGluZyBvciBudWxsCi0gICAqLwotICBwdWJsaWMgTm9kZSBnZXROZXh0U2libGluZygpCi0gIHsKLSAgICByZXR1cm4gbV9uZXh0U2libGluZzsKLSAgfQorICAvLyAlRFRCRCUKKy8vICAvKioKKy8vICAgKiBHZXQgdGhlIG5leHQgc2libGluZyAoYXMgYSBOb2RlKSBvciByZXR1cm4gbnVsbC4KKy8vICAgKgorLy8gICAqIEByZXR1cm4gdGhpcyBub2RlJ3MgbmV4dCBzaWJsaW5nIG9yIG51bGwKKy8vICAgKi8KKy8vICBwdWJsaWMgTm9kZSBnZXROZXh0U2libGluZygpCisvLyAgeworLy8gICAgcmV0dXJuIG1fbmV4dFNpYmxpbmc7CisvLyAgfQorCisgIC8vICVEVEJEJQorLy8gIC8qKgorLy8gICAqIEdldCB0aGUgcHJldmlvdXMgc2libGluZyAoYXMgYSBOb2RlKSBvciByZXR1cm4gbnVsbC4KKy8vICAgKiBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgZXhwZW5zaXZlIGlmIHRoZSBwYXJlbnQgaGFzIG1hbnkga2lkczsKKy8vICAgKiB3ZSBhY2NlcHQgdGhhdCBwcmljZSBpbiBleGNoYW5nZSBmb3IgYXZvaWRpbmcgdGhlIHByZXYgcG9pbnRlcgorLy8gICAqIFRPRE86IElmIHdlIHdlcmUgc3VyZSBwYXJlbnRzIGFuZCBzaWJzIGFyZSBhbHdheXMgRWxlbVRlbXBsYXRlRWxlbWVudHMsCisvLyAgICogd2UgY291bGQgaGl0IHRoZSBmaWVsZHMgZGlyZWN0bHkgcmF0aGVyIHRoYW4gdGhydSBhY2Nlc3NvcnMuCisvLyAgICoKKy8vICAgKiBAcmV0dXJuIFRoaXMgbm9kZSdzIHByZXZpb3VzIHNpYmxpbmcgb3IgbnVsbAorLy8gICAqLworLy8gIHB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpCisvLyAgeworLy8KKy8vICAgIE5vZGUgd2Fsa2VyID0gZ2V0UGFyZW50Tm9kZSgpLCBwcmV2ID0gbnVsbDsKKy8vCisvLyAgICBpZiAod2Fsa2VyICE9IG51bGwpCisvLyAgICAgIGZvciAod2Fsa2VyID0gd2Fsa2VyLmdldEZpcnN0Q2hpbGQoKTsgd2Fsa2VyICE9IG51bGw7CisvLyAgICAgICAgICAgICAgcHJldiA9IHdhbGtlciwgd2Fsa2VyID0gd2Fsa2VyLmdldE5leHRTaWJsaW5nKCkpCisvLyAgICAgIHsKKy8vICAgICAgICBpZiAod2Fsa2VyID09IHRoaXMpCisvLyAgICAgICAgICByZXR1cm4gcHJldjsKKy8vICAgICAgfQorLy8KKy8vICAgIHJldHVybiBudWxsOworLy8gIH0KIAogICAvKioKICAgICogR2V0IHRoZSBwcmV2aW91cyBzaWJsaW5nIChhcyBhIE5vZGUpIG9yIHJldHVybiBudWxsLgpAQCAtMTA4NCwxNCArMTIwNSwxNSBAQAogICAgKgogICAgKiBAcmV0dXJuIFRoaXMgbm9kZSdzIHByZXZpb3VzIHNpYmxpbmcgb3IgbnVsbAogICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0UHJldmlvdXNTaWJsaW5nKCkKKyAgcHVibGljIEVsZW1UZW1wbGF0ZUVsZW1lbnQgZ2V0UHJldmlvdXNTaWJsaW5nRWxlbSgpCiAgIHsKIAotICAgIE5vZGUgd2Fsa2VyID0gZ2V0UGFyZW50Tm9kZSgpLCBwcmV2ID0gbnVsbDsKKyAgICBFbGVtVGVtcGxhdGVFbGVtZW50IHdhbGtlciA9IGdldFBhcmVudE5vZGVFbGVtKCk7CisgICAgRWxlbVRlbXBsYXRlRWxlbWVudCBwcmV2ID0gbnVsbDsKIAogICAgIGlmICh3YWxrZXIgIT0gbnVsbCkKLSAgICAgIGZvciAod2Fsa2VyID0gd2Fsa2VyLmdldEZpcnN0Q2hpbGQoKTsgd2Fsa2VyICE9IG51bGw7Ci0gICAgICAgICAgICAgIHByZXYgPSB3YWxrZXIsIHdhbGtlciA9IHdhbGtlci5nZXROZXh0U2libGluZygpKQorICAgICAgZm9yICh3YWxrZXIgPSB3YWxrZXIuZ2V0Rmlyc3RDaGlsZEVsZW0oKTsgd2Fsa2VyICE9IG51bGw7CisgICAgICAgICAgICAgIHByZXYgPSB3YWxrZXIsIHdhbGtlciA9IHdhbGtlci5nZXROZXh0U2libGluZ0VsZW0oKSkKICAgICAgIHsKICAgICAgICAgaWYgKHdhbGtlciA9PSB0aGlzKQogICAgICAgICAgIHJldHVybiBwcmV2OwpAQCAtMTEwMCw2ICsxMjIyLDcgQEAKICAgICByZXR1cm4gbnVsbDsKICAgfQogCisKICAgLyoqCiAgICAqIEdldCB0aGUgbmV4dCBzaWJsaW5nIChhcyBhIEVsZW1UZW1wbGF0ZUVsZW1lbnQpIG9yIHJldHVybiBudWxsLgogICAgKgpAQCAtMTEwOSw2ICsxMjMyLDE3IEBACiAgIHsKICAgICByZXR1cm4gbV9uZXh0U2libGluZzsKICAgfQorICAKKyAgLyoqCisgICAqIEdldCB0aGUgcGFyZW50IGVsZW1lbnQuCisgICAqCisgICAqIEByZXR1cm4gVGhpcyBub2RlJ3MgbmV4dCBwYXJlbnQgKGFzIGEgRWxlbVRlbXBsYXRlRWxlbWVudCkgb3IgbnVsbCAKKyAgICovCisgIHB1YmxpYyBFbGVtVGVtcGxhdGVFbGVtZW50IGdldFBhcmVudE5vZGVFbGVtKCkKKyAgeworICAgIHJldHVybiBtX3BhcmVudE5vZGU7CisgIH0KKwogCiAgIC8qKgogICAgKiBGaXJzdCBjaGlsZC4KQEAgLTExMTYsMTUgKzEyNTAsMTYgQEAKICAgICovCiAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgbV9maXJzdENoaWxkOwogCi0gIC8qKgotICAgKiBHZXQgdGhlIGZpcnN0IGNoaWxkIGFzIGEgTm9kZS4KLSAgICoKLSAgICogQHJldHVybiBUaGlzIG5vZGUncyBmaXJzdCBjaGlsZCBvciBudWxsCi0gICAqLwotICBwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkKLSAgewotICAgIHJldHVybiBtX2ZpcnN0Q2hpbGQ7Ci0gIH0KKyAgLy8gJURUQkQlCisvLyAgLyoqCisvLyAgICogR2V0IHRoZSBmaXJzdCBjaGlsZCBhcyBhIE5vZGUuCisvLyAgICoKKy8vICAgKiBAcmV0dXJuIFRoaXMgbm9kZSdzIGZpcnN0IGNoaWxkIG9yIG51bGwKKy8vICAgKi8KKy8vICBwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkKKy8vICB7CisvLyAgICByZXR1cm4gbV9maXJzdENoaWxkOworLy8gIH0KIAogICAvKioKICAgICogR2V0IHRoZSBmaXJzdCBjaGlsZCBhcyBhIEVsZW1UZW1wbGF0ZUVsZW1lbnQuCkBAIC0xMTM2LDEyICsxMjcxLDMyIEBACiAgICAgcmV0dXJuIG1fZmlyc3RDaGlsZDsKICAgfQogCisgIC8vICVEVEJEJQorLy8gIC8qKgorLy8gICAqIEdldCB0aGUgbGFzdCBjaGlsZC4KKy8vICAgKgorLy8gICAqIEByZXR1cm4gVGhpcyBub2RlJ3MgbGFzdCBjaGlsZAorLy8gICAqLworLy8gIHB1YmxpYyBOb2RlIGdldExhc3RDaGlsZCgpCisvLyAgeworLy8KKy8vICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgbGFzdENoaWxkID0gbnVsbDsKKy8vCisvLyAgICBmb3IgKEVsZW1UZW1wbGF0ZUVsZW1lbnQgbm9kZSA9IG1fZmlyc3RDaGlsZDsgbm9kZSAhPSBudWxsOworLy8gICAgICAgICAgICBub2RlID0gbm9kZS5tX25leHRTaWJsaW5nKQorLy8gICAgeworLy8gICAgICBsYXN0Q2hpbGQgPSBub2RlOworLy8gICAgfQorLy8KKy8vICAgIHJldHVybiBsYXN0Q2hpbGQ7CisvLyAgfQorCiAgIC8qKgogICAgKiBHZXQgdGhlIGxhc3QgY2hpbGQuCiAgICAqCiAgICAqIEByZXR1cm4gVGhpcyBub2RlJ3MgbGFzdCBjaGlsZAogICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkKKyAgcHVibGljIEVsZW1UZW1wbGF0ZUVsZW1lbnQgZ2V0TGFzdENoaWxkRWxlbSgpCiAgIHsKIAogICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgbGFzdENoaWxkID0gbnVsbDsKQEAgLTExNTUsOCArMTMxMCw5IEBACiAgICAgcmV0dXJuIGxhc3RDaGlsZDsKICAgfQogCisKICAgLyoqIERPTSBiYWNrcG9pbnRlciB0aGF0IHRoaXMgZWxlbWVudCBvcmlnaW5hdGVkIGZyb20uICAgICAgICAgICovCi0gIHRyYW5zaWVudCBwcml2YXRlIE5vZGUgbV9ET01CYWNrUG9pbnRlcjsKKyAgdHJhbnNpZW50IHByaXZhdGUgb3JnLnczYy5kb20uTm9kZSBtX0RPTUJhY2tQb2ludGVyOwogCiAgIC8qKgogICAgKiBJZiB0aGlzIHN0eWxlc2hlZXQgd2FzIGNyZWF0ZWQgZnJvbSBhIERPTSwgZ2V0IHRoZQpAQCAtMTE2NSw3ICsxMzIxLDcgQEAKICAgICoKICAgICogQHJldHVybiBET00gYmFja3BvaW50ZXIgdGhhdCB0aGlzIGVsZW1lbnQgb3JpZ2luYXRlZCBmcm9tIG9yIG51bGwuCiAgICAqLwotICBwdWJsaWMgTm9kZSBnZXRET01CYWNrUG9pbnRlcigpCisgIHB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldERPTUJhY2tQb2ludGVyKCkKICAgewogICAgIHJldHVybiBtX0RPTUJhY2tQb2ludGVyOwogICB9CkBAIC0xMTc3LDcgKzEzMzMsNyBAQAogICAgKgogICAgKiBAcGFyYW0gbiBET00gYmFja3BvaW50ZXIgdGhhdCB0aGlzIGVsZW1lbnQgb3JpZ2luYXRlZCBmcm9tLgogICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RE9NQmFja1BvaW50ZXIoTm9kZSBuKQorICBwdWJsaWMgdm9pZCBzZXRET01CYWNrUG9pbnRlcihvcmcudzNjLmRvbS5Ob2RlIG4pCiAgIHsKICAgICBtX0RPTUJhY2tQb2ludGVyID0gbjsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1UZXh0LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVRleHQuamF2YQppbmRleCBkNzg5ZmFkLi4zMGQ0MzViIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVRleHQuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVRleHQuamF2YQpAQCAtNTYsNyArNTYsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogaW1wb3J0IG9yZy54bWwuc2F4Lio7CiAKQEAgLTE3MCw3ICsxNzEsNyBAQAogICAgKgogICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbgorICBwdWJsaWMgRWxlbVRlbXBsYXRlRWxlbWVudCBhcHBlbmRDaGlsZChFbGVtVGVtcGxhdGVFbGVtZW50IG5ld0NoaWxkKQogICB7CiAKICAgICBpbnQgdHlwZSA9ICgoRWxlbVRlbXBsYXRlRWxlbWVudCkgbmV3Q2hpbGQpLmdldFhTTFRva2VuKCk7CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVRleHRMaXRlcmFsLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVRleHRMaXRlcmFsLmphdmEKaW5kZXggZmIwMjQ2Yy4uOTdhYjlkOSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1UZXh0TGl0ZXJhbC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVGV4dExpdGVyYWwuamF2YQpAQCAtNTYsOCArNTYsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQorLy9pbXBvcnQgb3JnLnczYy5kb20uKjsKKyAKIGltcG9ydCBvcmcueG1sLnNheC4qOwogCiBpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUU5hbWU7CkBAIC0yMTYsMTMgKzIxNiwxMyBAQAogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgdm9pZCBleGVjdXRlKAotICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlKQorICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lcikKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAgICAgdHJ5CiAgICAgewogICAgICAgaWYgKFRyYW5zZm9ybWVySW1wbC5TX0RFQlVHKQotICAgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudChzb3VyY2VOb2RlLCBtb2RlLCB0aGlzKTsKKyAgICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQodGhpcyk7CiAKICAgICAgIFJlc3VsdFRyZWVIYW5kbGVyIHJ0aCA9IHRyYW5zZm9ybWVyLmdldFJlc3VsdFRyZWVIYW5kbGVyKCk7CiAgICAgICBpZiAobV9kaXNhYmxlT3V0cHV0RXNjYXBpbmcpCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVVua25vd24uamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVW5rbm93bi5qYXZhCmluZGV4IGEyMTdlOGIuLjEyMjVjNjEgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVW5rbm93bi5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVW5rbm93bi5qYXZhCkBAIC05Niw2ICs5Niw2IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9ue30KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVXNlLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVVzZS5qYXZhCmluZGV4IDBjZmJkMmUuLmY4NjljZGUgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVXNlLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1Vc2UuamF2YQpAQCAtNTgsNyArNTgsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CiAKQEAgLTE2MCw3ICsxNjAsNyBAQAogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwogICBwcml2YXRlIHZvaWQgYXBwbHlBdHRyU2V0cygKLSAgICAgICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIsIFN0eWxlc2hlZXRSb290IHN0eWxlc2hlZXQsIFFOYW1lIGF0dHJpYnV0ZVNldHNOYW1lc1tdLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBTdHlsZXNoZWV0Um9vdCBzdHlsZXNoZWV0LCBRTmFtZSBhdHRyaWJ1dGVTZXRzTmFtZXNbXSkKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKQEAgLTE4Miw3ICsxODIsNyBAQAogICAgICAgICAgICAgRWxlbUF0dHJpYnV0ZVNldCBhdHRyU2V0ID0KICAgICAgICAgICAgICAgKEVsZW1BdHRyaWJ1dGVTZXQpIGF0dHJTZXRzLmVsZW1lbnRBdChrKTsKIAotICAgICAgICAgICAgYXR0clNldC5leGVjdXRlKHRyYW5zZm9ybWVyLCBzb3VyY2VOb2RlLCBtb2RlKTsKKyAgICAgICAgICAgIGF0dHJTZXQuZXhlY3V0ZSh0cmFuc2Zvcm1lcik7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CkBAIC0yMDcsMTcgKzIwNywxNiBAQAogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgdm9pZCBleGVjdXRlKAotICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlKQorICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lcikKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7Ci0KICAgICBpZiAoVHJhbnNmb3JtZXJJbXBsLlNfREVCVUcpCi0gICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudChzb3VyY2VOb2RlLCBtb2RlLCB0aGlzKTsKKyAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHRoaXMpOwogCiAgICAgaWYgKG51bGwgIT0gbV9hdHRyaWJ1dGVTZXRzTmFtZXMpCiAgICAgewogICAgICAgYXBwbHlBdHRyU2V0cyh0cmFuc2Zvcm1lciwgZ2V0U3R5bGVzaGVldFJvb3QoKSwKLSAgICAgICAgICAgICAgICAgICAgbV9hdHRyaWJ1dGVTZXRzTmFtZXMsIHNvdXJjZU5vZGUsIG1vZGUpOworICAgICAgICAgICAgICAgICAgICBtX2F0dHJpYnV0ZVNldHNOYW1lcyk7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVZhbHVlT2YuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVmFsdWVPZi5qYXZhCmluZGV4IDA4ZDM4YTkuLmRmNTc1M2EgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVmFsdWVPZi5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVmFsdWVPZi5qYXZhCkBAIC01Niw3ICs1Niw5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS4qOworLy9pbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKIAogaW1wb3J0IG9yZy54bWwuc2F4Lio7CiAKQEAgLTY1LDEzICs2NywxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YT2JqZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YTm9kZVNldDsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlFOYW1lOwogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ucmVzLlhTTFRFcnJvclJlc291cmNlczsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlRyYW5zZm9ybWVySW1wbDsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlJlc3VsdFRyZWVIYW5kbGVyOwogCitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUU5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MU3RyaW5nOworCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnN0cmVlLlNheEV2ZW50RGlzcGF0Y2g7CiAKIC8qKgogICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImFkdmFuY2VkIi8+CkBAIC0yMjcsMTYgKzIzMCwxOCBAQAogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgdm9pZCBleGVjdXRlKAotICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlKQorICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lcikKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKICAgICB0cnkKICAgICB7CiAgICAgICBpZiAoVHJhbnNmb3JtZXJJbXBsLlNfREVCVUcpCi0gICAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHNvdXJjZU5vZGUsIG1vZGUsIHRoaXMpOworICAgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlVHJhY2VFdmVudCh0aGlzKTsKIAotICAgICAgTm9kZSBjaGlsZDsKKyAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCA9IHRyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpOworICAgICAgaW50IHNvdXJjZU5vZGUgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOworICAgICAgaW50IGNoaWxkOwogICAgICAgWE9iamVjdCB2YWx1ZTsKICAgICAgIAogICAgICAgLy8gT3B0aW1pemUgZm9yICIuIgpAQCAtMjUxLDQyICsyNTYsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlLCB0aGlzKTsKICAgICAgICAgaWYodmFsdWUuZ2V0VHlwZSgpID09IFhPYmplY3QuQ0xBU1NfTk9ERVNFVCkKICAgICAgICAgewotICAgICAgICAgIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3IgaXRlcmF0b3IgPSB2YWx1ZS5ub2Rlc2V0KCk7CisgICAgICAgICAgRFRNSXRlcmF0b3IgaXRlcmF0b3IgPSB2YWx1ZS5ub2Rlc2V0KCk7CiAgICAgICAgICAgY2hpbGQgPSBpdGVyYXRvci5uZXh0Tm9kZSgpOwotICAgICAgICAgIGlmKG51bGwgPT0gY2hpbGQpCisgICAgICAgICAgaWYoRFRNLk5VTEwgPT0gY2hpbGQpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgIGNoaWxkID0gbnVsbDsKKyAgICAgICAgICBjaGlsZCA9IERUTS5OVUxMOwogICAgICAgICBpZiAoVHJhbnNmb3JtZXJJbXBsLlNfREVCVUcpCiAgICAgICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVNlbGVjdGVkRXZlbnQoc291cmNlTm9kZSwgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IiwgbV9zZWxlY3RFeHByZXNzaW9uLCB2YWx1ZSk7CiAgICAgICB9CiAgICAgICAgICAKLSAgICAgIFN0cmluZyBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYobnVsbCAhPSBjaGlsZCkKKyAgICAgIFhNTFN0cmluZyBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgaWYoRFRNLk5VTEwgIT0gY2hpbGQpCiAgICAgICB7Ci0gICAgICAgIGlmIChjaGlsZC5pc1N1cHBvcnRlZChTYXhFdmVudERpc3BhdGNoLlNVUFBPUlRTSU5URVJGQUNFLCAiMS4wIikpCisgICAgICAgIERUTSBkdG0gPSB4Y3R4dC5nZXREVE0oY2hpbGQpOworICAgICAgICBSZXN1bHRUcmVlSGFuZGxlciBydGggPSB0cmFuc2Zvcm1lci5nZXRSZXN1bHRUcmVlSGFuZGxlcigpOworICAgICAgICBpZiAobV9kaXNhYmxlT3V0cHV0RXNjYXBpbmcpCiAgICAgICAgIHsKLSAgICAgICAgICBpZiAobV9kaXNhYmxlT3V0cHV0RXNjYXBpbmcpCi0gICAgICAgICAgewotICAgICAgICAgICAgUmVzdWx0VHJlZUhhbmRsZXIgcnRoID0gdHJhbnNmb3JtZXIuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKTsKLSAgICAgICAgICAgIHJ0aC5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQuUElfRElTQUJMRV9PVVRQVVRfRVNDQVBJTkcsICIiKTsKLSAgICAgICAgICAgICgoU2F4RXZlbnREaXNwYXRjaCkgY2hpbGQpLmRpc3BhdGNoQ2hhcmFjdGVyc0V2ZW50KHJ0aCk7Ci0gICAgICAgICAgICBydGgucHJvY2Vzc2luZ0luc3RydWN0aW9uKGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0LlBJX0VOQUJMRV9PVVRQVVRfRVNDQVBJTkcsICIiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgKChTYXhFdmVudERpc3BhdGNoKSBjaGlsZCkuZGlzcGF0Y2hDaGFyYWN0ZXJzRXZlbnQodHJhbnNmb3JtZXIuZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKSk7Ci0gICAgICAgICAgcmV0dXJuOworICAgICAgICAgIHJ0aC5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQuUElfRElTQUJMRV9PVVRQVVRfRVNDQVBJTkcsICIiKTsKKyAgICAgICAgICBkdG0uZGlzcGF0Y2hDaGFyYWN0ZXJzRXZlbnRzKGNoaWxkLCBydGgpOworICAgICAgICAgIHJ0aC5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQuUElfRU5BQkxFX09VVFBVVF9FU0NBUElORywgIiIpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHMgPSBYTm9kZVNldC5nZXRTdHJpbmdGcm9tTm9kZShjaGlsZCk7Ci0gICAgICAgIH0KKyAgICAgICAgICBkdG0uZGlzcGF0Y2hDaGFyYWN0ZXJzRXZlbnRzKGNoaWxkLCBydGgpOworICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgICBlbHNlCi0gICAgICAgIHMgPSB2YWx1ZS5zdHIoKTsKLQorICAgICAgeworICAgICAgICBzID0gdmFsdWUueHN0cigpOworICAgICAgfQogICAgICAgCiAgICAgICBpbnQgbGVuID0gKG51bGwgIT0gcykgPyBzLmxlbmd0aCgpIDogMDsKICAgICAgIGlmKGxlbiA+IDApCkBAIC0yOTYsMTEgKzI5NiwxMSBAQAogICAgICAgICBpZiAobV9kaXNhYmxlT3V0cHV0RXNjYXBpbmcpCiAgICAgICAgIHsKICAgICAgICAgICBydGgucHJvY2Vzc2luZ0luc3RydWN0aW9uKGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0LlBJX0RJU0FCTEVfT1VUUFVUX0VTQ0FQSU5HLCAiIik7Ci0gICAgICAgICAgcnRoLmNoYXJhY3RlcnMocy50b0NoYXJBcnJheSgpLCAwLCBsZW4pOworICAgICAgICAgIHMuZGlzcGF0Y2hDaGFyYWN0ZXJzRXZlbnRzKHJ0aCk7CiAgICAgICAgICAgcnRoLnByb2Nlc3NpbmdJbnN0cnVjdGlvbihqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdC5QSV9FTkFCTEVfT1VUUFVUX0VTQ0FQSU5HLCAiIik7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgIHJ0aC5jaGFyYWN0ZXJzKHMudG9DaGFyQXJyYXkoKSwgMCwgbGVuKTsKKyAgICAgICAgICBzLmRpc3BhdGNoQ2hhcmFjdGVyc0V2ZW50cyhydGgpOwogICAgICAgfQogICAgIH0KICAgICBjYXRjaChTQVhFeGNlcHRpb24gc2UpCkBAIC0zMTgsNyArMzE4LDcgQEAKICAgICoKICAgICogQHRocm93cyBET01FeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbmV3Q2hpbGQpIHRocm93cyBET01FeGNlcHRpb24KKyAgcHVibGljIEVsZW1UZW1wbGF0ZUVsZW1lbnQgYXBwZW5kQ2hpbGQoRWxlbVRlbXBsYXRlRWxlbWVudCBuZXdDaGlsZCkKICAgewogCiAgICAgZXJyb3IoWFNMVEVycm9yUmVzb3VyY2VzLkVSX0NBTk5PVF9BREQsCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVZhcmlhYmxlLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVZhcmlhYmxlLmphdmEKaW5kZXggODVlYjUwMS4uNTNjMjE4YyAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1WYXJpYWJsZS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVmFyaWFibGUuamF2YQpAQCAtNTYsNyArNTYsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogaW1wb3J0IG9yZy54bWwuc2F4Lio7CiAKQEAgLTI0NSwxMyArMjQ2LDE0IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoCi0gICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUsIFFOYW1lIG1vZGUpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyKQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAogICAgIGlmIChUcmFuc2Zvcm1lckltcGwuU19ERUJVRykKLSAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVUcmFjZUV2ZW50KHNvdXJjZU5vZGUsIG1vZGUsIHRoaXMpOworICAgICAgdHJhbnNmb3JtZXIuZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQodGhpcyk7CiAKKyAgICBpbnQgc291cmNlTm9kZSA9IHRyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpLmdldEN1cnJlbnROb2RlKCk7CiAgICAgWE9iamVjdCB2YXIgPSBnZXRWYWx1ZSh0cmFuc2Zvcm1lciwgc291cmNlTm9kZSk7CiAKICAgICB0cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKS5nZXRWYXJTdGFjaygpLnB1c2hWYXJpYWJsZShtX3FuYW1lLCB2YXIpOwpAQCAtMjY3LDMzICsyNjksMzggQEAKICAgICoKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIFhPYmplY3QgZ2V0VmFsdWUoVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBOb2RlIHNvdXJjZU5vZGUpCisgIHB1YmxpYyBYT2JqZWN0IGdldFZhbHVlKFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgaW50IHNvdXJjZU5vZGUpCiAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAogICAgIFhPYmplY3QgdmFyOworICAgIFhQYXRoQ29udGV4dCB4Y3R4dCA9IHRyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpOworICAgIHhjdHh0LnB1c2hDdXJyZW50Tm9kZShzb3VyY2VOb2RlKTsKIAotICAgIGlmIChudWxsICE9IG1fc2VsZWN0UGF0dGVybikKKyAgICB0cnkKICAgICB7Ci0gICAgICBYUGF0aENvbnRleHQgeGN0eHQgPSB0cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKTsKLQotICAgICAgdmFyID0gbV9zZWxlY3RQYXR0ZXJuLmV4ZWN1dGUoeGN0eHQsIHNvdXJjZU5vZGUsIHRoaXMpOwotICAgICAgaWYoVHJhbnNmb3JtZXJJbXBsLlNfREVCVUcpCi0gICAgICAgIHRyYW5zZm9ybWVyLmdldFRyYWNlTWFuYWdlcigpLmZpcmVTZWxlY3RlZEV2ZW50KHNvdXJjZU5vZGUsIHRoaXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IiwgbV9zZWxlY3RQYXR0ZXJuLCB2YXIpOworICAgICAgaWYgKG51bGwgIT0gbV9zZWxlY3RQYXR0ZXJuKQorICAgICAgeyAKKyAgICAgICAgdmFyID0gbV9zZWxlY3RQYXR0ZXJuLmV4ZWN1dGUoeGN0eHQsIHNvdXJjZU5vZGUsIHRoaXMpOworICAgICAgICBpZihUcmFuc2Zvcm1lckltcGwuU19ERUJVRykKKyAgICAgICAgICB0cmFuc2Zvcm1lci5nZXRUcmFjZU1hbmFnZXIoKS5maXJlU2VsZWN0ZWRFdmVudChzb3VyY2VOb2RlLCB0aGlzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IiwgbV9zZWxlY3RQYXR0ZXJuLCB2YXIpOworICAgICAgfQorICAgICAgZWxzZSBpZiAobnVsbCA9PSBnZXRGaXJzdENoaWxkRWxlbSgpKQorICAgICAgeworICAgICAgICB2YXIgPSBYU3RyaW5nLkVNUFRZU1RSSU5HOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAKKyAgICAgICAgLy8gVXNlIHJlc3VsdCB0cmVlIGZyYWdtZW50CisgICAgICAgIGludCBkZiA9IHRyYW5zZm9ybWVyLnRyYW5zZm9ybVRvUlRGKHRoaXMpOworICAgICAgICB2YXIgPSBuZXcgWFJUcmVlRnJhZyhkZiwgeGN0eHQpOworICAgICAgfQogICAgIH0KLSAgICBlbHNlIGlmIChudWxsID09IGdldEZpcnN0Q2hpbGQoKSkKKyAgICBmaW5hbGx5CiAgICAgewotICAgICAgdmFyID0gWFN0cmluZy5FTVBUWVNUUklORzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQotICAgICAgLy8gVXNlIHJlc3VsdCB0cmVlIGZyYWdtZW50Ci0gICAgICBEb2N1bWVudEZyYWdtZW50IGRmID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtVG9SVEYodGhpcywgc291cmNlTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICB2YXIgPSBuZXcgWFJUcmVlRnJhZyhkZik7CisgICAgICB4Y3R4dC5wb3BDdXJyZW50Tm9kZSgpOwogICAgIH0KIAogICAgIHJldHVybiB2YXI7CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRnVuY0RvY3VtZW50LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRnVuY0RvY3VtZW50LmphdmEKaW5kZXggYWI5NzA2NS4uNDliMzk2ZSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0Z1bmNEb2N1bWVudC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9GdW5jRG9jdW1lbnQuamF2YQpAQCAtNjIsOSArNjIsOSBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNTWFuYWdlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguTm9kZVNldDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLmZ1bmN0aW9ucy5GdW5jdGlvbjsKQEAgLTc0LDcgKzc0LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE5vZGVTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLkRPTUhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlNvdXJjZVRyZWVNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKQEAgLTg5LDkgKzg4LDExIEBACiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZUxvY2F0b3I7CiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5FcnJvckxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlNBWFNvdXJjZUxvY2F0b3I7CiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5TQVhTb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKKwogLyoqCiAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KICAqIEV4ZWN1dGUgdGhlIERvYygpIGZ1bmN0aW9uLgpAQCAtMTIxLDkgKzEyMiwxMCBAQAogICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCkgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCi0gICAgTm9kZSBjb250ZXh0ID0geGN0eHQuZ2V0Q3VycmVudE5vZGUoKTsKLSAgICBEb2N1bWVudCBkb2NDb250ZXh0ID0gKE5vZGUuRE9DVU1FTlRfTk9ERSA9PSBjb250ZXh0LmdldE5vZGVUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gKERvY3VtZW50KSBjb250ZXh0IDogY29udGV4dC5nZXRPd25lckRvY3VtZW50KCk7CisgICAgaW50IGNvbnRleHQgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOworICAgIERUTSBkdG0gPSB4Y3R4dC5nZXREVE0oY29udGV4dCk7CisgICAgCisgICAgaW50IGRvY0NvbnRleHQgPSBkdG0uZ2V0RG9jdW1lbnQoKTsKICAgICBYT2JqZWN0IGFyZyA9IChYT2JqZWN0KSB0aGlzLmdldEFyZzAoKS5leGVjdXRlKHhjdHh0KTsKICAgICBTdHJpbmcgYmFzZSA9ICIiOwogICAgIEV4cHJlc3Npb24gYXJnMUV4cHIgPSB0aGlzLmdldEFyZzEoKTsKQEAgLTEzOSwyNSArMTQxLDI2IEBACiAKICAgICAgIGlmIChYT2JqZWN0LkNMQVNTX05PREVTRVQgPT0gYXJnMi5nZXRUeXBlKCkpCiAgICAgICB7Ci0gICAgICAgIE5vZGUgYmFzZU5vZGUgPSBhcmcyLm5vZGVzZXQoKS5uZXh0Tm9kZSgpOworICAgICAgICBpbnQgYmFzZU5vZGUgPSBhcmcyLm5vZGVzZXQoKS5uZXh0Tm9kZSgpOwogCi0gICAgICAgIGlmIChiYXNlTm9kZSA9PSBudWxsKQorICAgICAgICBpZiAoYmFzZU5vZGUgPT0gRFRNLk5VTEwpCiAgICAgICAgICAgd2Fybih4Y3R4dCwgWFNMVEVycm9yUmVzb3VyY2VzLldHX0VNUFRZX1NFQ09ORF9BUkcsIG51bGwpOworICAgICAgICAKKyAgICAgICAgRFRNIGJhc2VEVE0gPSB4Y3R4dC5nZXREVE0oYmFzZU5vZGUpOworICAgICAgICBiYXNlID0gYmFzZURUTS5nZXREb2N1bWVudEJhc2VVUkkoKTsKIAotICAgICAgICBEb2N1bWVudCBiYXNlRG9jID0gKGJhc2VOb2RlID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChOb2RlLkRPQ1VNRU5UX05PREUgPT0gYmFzZU5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKERvY3VtZW50KSBiYXNlTm9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiYXNlTm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCi0gICAgICAgIGlmIChiYXNlRG9jID09IG51bGwgfHwgYmFzZURvYyBpbnN0YW5jZW9mIFN0eWxlc2hlZXQpCi0gICAgICAgIHsKLQotICAgICAgICAgIC8vIGJhc2UgPSAoKFN0eWxlc2hlZXQpYmFzZURvYykuZ2V0QmFzZUlkZW50aWZpZXIoKTsKLSAgICAgICAgICBiYXNlID0geGN0eHQuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldEJhc2VJZGVudGlmaWVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGJhc2UgPSB4Y3R4dC5nZXRTb3VyY2VUcmVlTWFuYWdlcigpLmZpbmRVUklGcm9tRG9jKGJhc2VEb2MpOworICAgICAgICAvLyAlUkVWSUVXJSBUaGlzIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHByb2JsZW0gd2l0aCB0aGUgY29uZm9ybWFuY2UKKyAgICAgICAgLy8gc3VpdGUsIGJ1dCBtYXliZSBpdCdzIGp1c3Qgbm90IGRvaW5nIGEgZ29vZCB0ZXN0PworLy8gICAgICAgIGludCBiYXNlRG9jID0gYmFzZURUTS5nZXREb2N1bWVudCgpOworLy8KKy8vICAgICAgICBpZiAoYmFzZURvYyA9PSBEVE0uTlVMTCAvKiB8fCBiYXNlRG9jIGluc3RhbmNlb2YgU3R5bGVzaGVldCAgLS0+V2hhdCB0byBkbz8/ICovKQorLy8gICAgICAgIHsKKy8vCisvLyAgICAgICAgICAvLyBiYXNlID0gKChTdHlsZXNoZWV0KWJhc2VEb2MpLmdldEJhc2VJZGVudGlmaWVyKCk7CisvLyAgICAgICAgICBiYXNlID0geGN0eHQuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldEJhc2VJZGVudGlmaWVyKCk7CisvLyAgICAgICAgfQorLy8gICAgICAgIGVsc2UKKy8vICAgICAgICAgIGJhc2UgPSB4Y3R4dC5nZXRTb3VyY2VUcmVlTWFuYWdlcigpLmZpbmRVUklGcm9tRG9jKGJhc2VEb2MpOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewpAQCAtMTc5LDIxICsxODIsMjEgQEAKICAgICAgIGJhc2UgPSB4Y3R4dC5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0QmFzZUlkZW50aWZpZXIoKTsKICAgICB9CiAKLSAgICBYTm9kZVNldCBub2RlcyA9IG5ldyBYTm9kZVNldCgpOworICAgIFhOb2RlU2V0IG5vZGVzID0gbmV3IFhOb2RlU2V0KHhjdHh0LmdldERUTU1hbmFnZXIoKSk7CiAgICAgTm9kZVNldCBtbmwgPSBub2Rlcy5tdXRhYmxlTm9kZXNldCgpOwotICAgIE5vZGVJdGVyYXRvciBpdGVyYXRvciA9IChYT2JqZWN0LkNMQVNTX05PREVTRVQgPT0gYXJnLmdldFR5cGUoKSkKKyAgICBEVE1JdGVyYXRvciBpdGVyYXRvciA9IChYT2JqZWN0LkNMQVNTX05PREVTRVQgPT0gYXJnLmdldFR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFyZy5ub2Rlc2V0KCkgOiBudWxsOwotICAgIE5vZGUgcG9zID0gbnVsbDsKKyAgICBpbnQgcG9zID0gRFRNLk5VTEw7CiAKLSAgICB3aGlsZSAoKG51bGwgPT0gaXRlcmF0b3IpIHx8IChudWxsICE9IChwb3MgPSBpdGVyYXRvci5uZXh0Tm9kZSgpKSkpCisgICAgd2hpbGUgKChudWxsID09IGl0ZXJhdG9yKSB8fCAoRFRNLk5VTEwgIT0gKHBvcyA9IGl0ZXJhdG9yLm5leHROb2RlKCkpKSkKICAgICB7Ci0gICAgICBTdHJpbmcgcmVmID0gKG51bGwgIT0gaXRlcmF0b3IpCi0gICAgICAgICAgICAgICAgICAgPyBET01IZWxwZXIuZ2V0Tm9kZURhdGEocG9zKSA6IGFyZy5zdHIoKTsKKyAgICAgIFhNTFN0cmluZyByZWYgPSAobnVsbCAhPSBpdGVyYXRvcikKKyAgICAgICAgICAgICAgICAgICA/IHhjdHh0LmdldERUTShwb3MpLmdldFN0cmluZ1ZhbHVlKHBvcykgOiBhcmcueHN0cigpOwogCiAgICAgICBpZiAobnVsbCA9PSByZWYpCiAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICBpZiAobnVsbCA9PSBkb2NDb250ZXh0KQorICAgICAgaWYgKERUTS5OVUxMID09IGRvY0NvbnRleHQpCiAgICAgICB7CiAgICAgICAgIGVycm9yKHhjdHh0LCBYU0xURXJyb3JSZXNvdXJjZXMuRVJfTk9fQ09OVEVYVF9PV05FUkRPQywgbnVsbCk7ICAvLyJjb250ZXh0IGRvZXMgbm90IGhhdmUgYW4gb3duZXIgZG9jdW1lbnQhIik7CiAgICAgICB9CkBAIC0yMTUsMTggKzIxOCwxOSBAQAogICAgICAgICBiYXNlID0gbnVsbDsKICAgICAgIH0KIAotICAgICAgTm9kZSBuZXdEb2MgPSBnZXREb2MoeGN0eHQsIGNvbnRleHQsIHJlZiwgYmFzZSk7CisgICAgICBpbnQgbmV3RG9jID0gZ2V0RG9jKHhjdHh0LCBjb250ZXh0LCByZWYudG9TdHJpbmcoKSwgYmFzZSk7CiAKICAgICAgIC8vIG5vZGVzLm11dGFibGVOb2Rlc2V0KCkuYWRkTm9kZShuZXdEb2MpOyAgCi0gICAgICBpZiAobnVsbCAhPSBuZXdEb2MpCisgICAgICBpZiAoRFRNLk5VTEwgIT0gbmV3RG9jKQogICAgICAgewotCiAgICAgICAgIC8vIFRPRE86IG1ubC5hZGROb2RlSW5Eb2NPcmRlcihuZXdEb2MsIHRydWUsIHhjdHh0KTsgPz8KICAgICAgICAgaWYgKCFtbmwuY29udGFpbnMobmV3RG9jKSkKKyAgICAgICAgewogICAgICAgICAgIG1ubC5hZGRFbGVtZW50KG5ld0RvYyk7CisgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgaWYgKG51bGwgPT0gaXRlcmF0b3IgfHwgbmV3RG9jID09IG51bGwpCisgICAgICBpZiAobnVsbCA9PSBpdGVyYXRvciB8fCBuZXdEb2MgPT0gRFRNLk5VTEwpCiAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjQ2LDE0ICsyNTAsMTQgQEAKICAgICoKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBOb2RlIGdldERvYyhYUGF0aENvbnRleHQgeGN0eHQsIE5vZGUgY29udGV4dCwgU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2UpCisgIGludCBnZXREb2MoWFBhdGhDb250ZXh0IHhjdHh0LCBpbnQgY29udGV4dCwgU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2UpCiAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCiAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJiYXNlOiAiK2Jhc2UrIiwgdXJpOiAiK3VyaSk7CiAgICAgU291cmNlVHJlZU1hbmFnZXIgdHJlZU1nciA9IHhjdHh0LmdldFNvdXJjZVRyZWVNYW5hZ2VyKCk7CiAgICAgCi0gICAgTm9kZSBuZXdEb2M7CisgICAgaW50IG5ld0RvYzsKICAgICB0cnkKICAgICB7CiAgICAgICBTb3VyY2Ugc291cmNlID0gdHJlZU1nci5yZXNvbHZlVVJJKGJhc2UsIHVyaSwgeGN0eHQuZ2V0U0FYTG9jYXRvcigpKTsKQEAgLTI2OSw3ICsyNzMsNyBAQAogICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKHRlKTsKICAgICB9CiAKLSAgICBpZiAobnVsbCAhPSBuZXdEb2MpCisgICAgaWYgKERUTS5OVUxMICE9IG5ld0RvYykKICAgICAgIHJldHVybiBuZXdEb2M7CiAKICAgICAvLyBJZiB0aGUgdXJpIGxlbmd0aCBpcyB6ZXJvLCBnZXQgdGhlIHVyaSBvZiB0aGUgc3R5bGVzaGVldC4KQEAgLTI4Miw3ICsyODYsNyBAQAogICAgIHsKICAgICAgIGlmICgobnVsbCAhPSB1cmkpICYmICh1cmkudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApKQogICAgICAgewotICAgICAgICBuZXdEb2MgPSB0cmVlTWdyLmdldFNvdXJjZVRyZWUoYmFzZSwgdXJpLCB4Y3R4dC5nZXRTQVhMb2NhdG9yKCkpOworICAgICAgICBuZXdEb2MgPSB0cmVlTWdyLmdldFNvdXJjZVRyZWUoYmFzZSwgdXJpLCB4Y3R4dC5nZXRTQVhMb2NhdG9yKCksIHhjdHh0KTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5ld0RvYzogIisoKERvY3VtZW50KW5ld0RvYykuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKSk7CiAgICAgICB9CkBAIC0yOTQsNyArMjk4LDcgQEAKICAgICB7CiAKICAgICAgIC8vIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIG5ld0RvYyA9IG51bGw7CisgICAgICBuZXdEb2MgPSBEVE0uTlVMTDsKIAogICAgICAgLy8gcGF0aC53YXJuKFhTTFRFcnJvclJlc291cmNlcy5XR19FTkNPRElOR19OT1RfU1VQUE9SVEVEX1VTSU5HX0pBVkEsIG5ldyBPYmplY3RbXXsoKGJhc2UgPT0gbnVsbCkgPyAiIiA6IGJhc2UgKSt1cml9KTsgLy8iQ2FuIG5vdCBsb2FkIHJlcXVlc3RlZCBkb2M6ICIrKChiYXNlID09IG51bGwpID8gIiIgOiBiYXNlICkrdXJpKTsKICAgICAgIHdoaWxlICh0aHJvd2FibGUKQEAgLTM1OSw3ICszNjMsNyBAQAogICAgICAgZGlhZ25vc3RpY3NTdHJpbmcgPSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpOyAvL3N3LnRvU3RyaW5nKCk7CiAgICAgfQogCi0gICAgaWYgKG51bGwgPT0gbmV3RG9jKQorICAgIGlmIChEVE0uTlVMTCA9PSBuZXdEb2MpCiAgICAgewogCiAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIndoYXQ/OiAiK2Jhc2UrIiwgdXJpOiAiK3VyaSk7CkBAIC0zNzYsNyArMzgwLDcgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLQorICAgICAgLy8gJVJFVklFVyUKICAgICAgIC8vIFRCRDogV2hhdCB0byBkbyBhYm91dCBYTG9jYXRvcj8KICAgICAgIC8vIHhjdHh0LmdldFNvdXJjZVRyZWVNYW5hZ2VyKCkuYXNzb2NpYXRlWExvY2F0b3JUb05vZGUobmV3RG9jLCB1cmwsIG51bGwpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9GdW5jS2V5LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRnVuY0tleS5qYXZhCmluZGV4IDQ1NTZmYmMuLmViMDRiMzMgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9GdW5jS2V5LmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0Z1bmNLZXkuamF2YQpAQCAtNjQsNyArNjQsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOb2RlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguRE9NSGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguYXhlcy5Mb2NQYXRoSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5heGVzLlVuaW9uUGF0aEl0ZXJhdG9yOwpAQCAtNzQsMTAgKzczLDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5yZXMuWFBBVEhFcnJvclJlc291cmNlczsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKIAogLyoqCiAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KQEAgLTEwMywxMSArMTAyLDExIEBACiAgICAgLy8gVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyID0gKFRyYW5zZm9ybWVySW1wbCl4Y3R4dDsKICAgICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXIgPSAoVHJhbnNmb3JtZXJJbXBsKSB4Y3R4dC5nZXRPd25lck9iamVjdCgpOwogICAgIFhOb2RlU2V0IG5vZGVzID0gbnVsbDsKLSAgICBOb2RlIGNvbnRleHQgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOwotICAgIERvY3VtZW50IGRvY0NvbnRleHQgPSAoTm9kZS5ET0NVTUVOVF9OT0RFID09IGNvbnRleHQuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoRG9jdW1lbnQpIGNvbnRleHQgOiBjb250ZXh0LmdldE93bmVyRG9jdW1lbnQoKTsKKyAgICBpbnQgY29udGV4dCA9IHhjdHh0LmdldEN1cnJlbnROb2RlKCk7CisgICAgRFRNIGR0bSA9IHhjdHh0LmdldERUTShjb250ZXh0KTsKKyAgICBpbnQgZG9jQ29udGV4dCA9IGR0bS5nZXREb2N1bWVudCgpOwogCi0gICAgaWYgKG51bGwgPT0gZG9jQ29udGV4dCkKKyAgICBpZiAoRFRNLk5VTEwgPT0gZG9jQ29udGV4dCkKICAgICB7CiAKICAgICAgIC8vIHBhdGguZXJyb3IoY29udGV4dCwgWFBBVEhFcnJvclJlc291cmNlcy5FUl9DT05URVhUX0hBU19OT19PV05FUkRPQyk7IC8vImNvbnRleHQgZG9lcyBub3QgaGF2ZSBhbiBvd25lciBkb2N1bWVudCEiKTsKQEAgLTEyMiwxMyArMTIxLDE0IEBACiAgICAgaWYgKGFyZ0lzTm9kZVNldCkKICAgICB7CiAgICAgICBIYXNodGFibGUgdXNlZHJlZnMgPSBudWxsOwotICAgICAgTm9kZUl0ZXJhdG9yIG5pID0gYXJnLm5vZGVzZXQoKTsKLSAgICAgIE5vZGUgcG9zOworICAgICAgRFRNSXRlcmF0b3IgbmkgPSBhcmcubm9kZXNldCgpOworICAgICAgaW50IHBvczsKICAgICAgIFVuaW9uUGF0aEl0ZXJhdG9yIHVwaSA9IG5ldyBVbmlvblBhdGhJdGVyYXRvcigpOwogCi0gICAgICB3aGlsZSAobnVsbCAhPSAocG9zID0gbmkubmV4dE5vZGUoKSkpCisgICAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKHBvcyA9IG5pLm5leHROb2RlKCkpKQogICAgICAgewotICAgICAgICBTdHJpbmcgcmVmID0gRE9NSGVscGVyLmdldE5vZGVEYXRhKHBvcyk7CisgICAgICAgIGR0bSA9IHhjdHh0LmdldERUTShwb3MpOworICAgICAgICBYTUxTdHJpbmcgcmVmID0gZHRtLmdldFN0cmluZ1ZhbHVlKHBvcyk7CiAKICAgICAgICAgaWYgKG51bGwgPT0gcmVmKQogICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTY4LDcgKzE2OCw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBTdHJpbmcgcmVmID0gYXJnLnN0cigpOworICAgICAgWE1MU3RyaW5nIHJlZiA9IGFyZy54c3RyKCk7CiAgICAgICBMb2NQYXRoSXRlcmF0b3IgbmwgPSBrbWdyLmdldE5vZGVTZXRCeUtleSh4Y3R4dCwgZG9jQ29udGV4dCwga2V5bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjdHh0LmdldE5hbWVzcGFjZUNvbnRleHQoKSk7CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvU3R5bGVzaGVldC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL1N0eWxlc2hlZXQuamF2YQppbmRleCBjYTAxMDI3Li44NjY1YTc4IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvU3R5bGVzaGVldC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9TdHlsZXNoZWV0LmphdmEKQEAgLTc0LDggKzc0LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoOwogCiAvLyBET00gSW1wb3J0cwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogLy8gU0FYMiBJbXBvcnRzCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKQEAgLTEyNyw3ICsxMjgsNyBAQAogICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0I3NlY3Rpb24tU3R5bGVzaGVldC1TdHJ1Y3R1cmUiPnNlY3Rpb24tU3R5bGVzaGVldC1TdHJ1Y3R1cmUgaW4gWFNMVCBTcGVjaWZpY2F0aW9uPC9hPgogICovCiBwdWJsaWMgY2xhc3MgU3R5bGVzaGVldCBleHRlbmRzIEVsZW1UZW1wbGF0ZUVsZW1lbnQKLSAgICAgICAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgRG9jdW1lbnQKKyAgICAgICAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSAvKiAsIERvY3VtZW50ICovCiB7CiAKICAgLyoqCkBAIC0xMzUxLDcgKzEzNTIsNyBAQAogICAgKi8KICAgcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkKICAgewotICAgIHJldHVybiBOb2RlLkRPQ1VNRU5UX05PREU7CisgICAgcmV0dXJuIERUTS5ET0NVTUVOVF9OT0RFOwogICB9CiAKICAgLyoqCkBAIC0xMzk0LDcgKzEzOTUsNyBAQAogICAgIGlmIChudWxsID09IG1fdGVtcGxhdGVzKQogICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogCi0gICAgcmVwbGFjZUNoaWxkKHYsIChOb2RlKSBtX3RlbXBsYXRlcy5lbGVtZW50QXQoaSkpOworICAgIHJlcGxhY2VDaGlsZCh2LCAoRWxlbVRlbXBsYXRlRWxlbWVudCltX3RlbXBsYXRlcy5lbGVtZW50QXQoaSkpOwogICAgIG1fdGVtcGxhdGVzLnNldEVsZW1lbnRBdCh2LCBpKTsKICAgICB2LnNldFN0eWxlc2hlZXQodGhpcyk7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9TdHlsZXNoZWV0Um9vdC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL1N0eWxlc2hlZXRSb290LmphdmEKaW5kZXggZjY4Mzk3Ni4uNTZjODgyNyAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL1N0eWxlc2hlZXRSb290LmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL1N0eWxlc2hlZXRSb290LmphdmEKQEAgLTU2LDcgKzU2LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLio7CisvLyBpbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiBpbXBvcnQgamF2YS51dGlsLio7CiAKQEAgLTY5OCw3ICs2OTksNyBAQAogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgRWxlbVRlbXBsYXRlIGdldFRlbXBsYXRlQ29tcG9zZWQoWFBhdGhDb250ZXh0IHhjdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSB0YXJnZXROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldE5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heEltcG9ydExldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBxdWlldENvbmZsaWN0V2FybmluZ3MpCkBAIC04MjAsNyArODIxLDcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIFdoaXRlU3BhY2VJbmZvIGdldFdoaXRlU3BhY2VJbmZvKAotICAgICAgICAgIFhQYXRoQ29udGV4dCBzdXBwb3J0LCBFbGVtZW50IHRhcmdldEVsZW1lbnQpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorICAgICAgICAgIFhQYXRoQ29udGV4dCBzdXBwb3J0LCBpbnQgdGFyZ2V0RWxlbWVudCkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAogICAgIGlmIChudWxsICE9IG1fd2hpdGVTcGFjZUluZm9MaXN0KQpAQCAtODQyLDIyICs4NDMsMjMgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIGJvb2xlYW4gc2hvdWxkU3RyaXBXaGl0ZVNwYWNlKAotICAgICAgICAgIFhQYXRoQ29udGV4dCBzdXBwb3J0LCBFbGVtZW50IHRhcmdldEVsZW1lbnQpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorICAgICAgICAgIFhQYXRoQ29udGV4dCBzdXBwb3J0LCBpbnQgdGFyZ2V0RWxlbWVudCkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKICAgICBpZiAobnVsbCAhPSBtX3doaXRlU3BhY2VJbmZvTGlzdCkKICAgICB7Ci0gICAgICB3aGlsZShudWxsICE9IHRhcmdldEVsZW1lbnQpCisgICAgICB3aGlsZShEVE0uTlVMTCAhPSB0YXJnZXRFbGVtZW50KQogICAgICAgewogICAgICAgICBXaGl0ZVNwYWNlSW5mbyBpbmZvID0gKFdoaXRlU3BhY2VJbmZvKSBtX3doaXRlU3BhY2VJbmZvTGlzdC5nZXRUZW1wbGF0ZShzdXBwb3J0LAogICAgICAgICAgICAgICAgIHRhcmdldEVsZW1lbnQsIG51bGwsIC0xLCBmYWxzZSk7CiAgICAgICAgIGlmKG51bGwgIT0gaW5mbykKICAgICAgICAgICByZXR1cm4gaW5mby5nZXRTaG91bGRTdHJpcFNwYWNlKCk7Ci0gICAgICAgICAgCi0gICAgICAgIE5vZGUgcGFyZW50ID0gdGFyZ2V0RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmKG51bGwgIT0gcGFyZW50ICYmIE5vZGUuRUxFTUVOVF9OT0RFID09IHBhcmVudC5nZXROb2RlVHlwZSgpKQotICAgICAgICAgIHRhcmdldEVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnQ7CisgICAgICAgIAorICAgICAgICBEVE0gZHRtID0gc3VwcG9ydC5nZXREVE0odGFyZ2V0RWxlbWVudCk7CisgICAgICAgIGludCBwYXJlbnQgPSBkdG0uZ2V0UGFyZW50KHRhcmdldEVsZW1lbnQpOworICAgICAgICBpZihEVE0uTlVMTCAhPSBwYXJlbnQgJiYgRFRNLkVMRU1FTlRfTk9ERSA9PSBkdG0uZ2V0Tm9kZVR5cGUocGFyZW50KSkKKyAgICAgICAgICB0YXJnZXRFbGVtZW50ID0gcGFyZW50OwogICAgICAgICBlbHNlCi0gICAgICAgICAgdGFyZ2V0RWxlbWVudCA9IG51bGw7CisgICAgICAgICAgdGFyZ2V0RWxlbWVudCA9IERUTS5OVUxMOwogICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvVGVtcGxhdGVMaXN0LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvVGVtcGxhdGVMaXN0LmphdmEKaW5kZXggZjZhNGM5Zi4uMDg2OWJlYyAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL1RlbXBsYXRlTGlzdC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9UZW1wbGF0ZUxpc3QuamF2YQpAQCAtNjIsNyArNjIsOCBAQAogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKIApAQCAtNDU3LDQzICs0NTgsNDQgQEAKICAgICogQHJldHVybiBUaGUgaGVhZCBvZiBhIGxpbmtlZCBsaXN0IHRoYXQgY29udGFpbnMgYWxsIHBvc3NpYmxlIG1hdGNoIHBhdHRlcm4gdG8gCiAgICAqIHRlbXBsYXRlIGFzc29jaWF0aW9ucy4KICAgICovCi0gIHB1YmxpYyBUZW1wbGF0ZVN1YlBhdHRlcm5Bc3NvY2lhdGlvbiBnZXRIZWFkKFhQYXRoQ29udGV4dCB4Y3R4dCwgTm9kZSB0YXJnZXROb2RlKQorICBwdWJsaWMgVGVtcGxhdGVTdWJQYXR0ZXJuQXNzb2NpYXRpb24gZ2V0SGVhZChYUGF0aENvbnRleHQgeGN0eHQsIGludCB0YXJnZXROb2RlKQogICB7CiAKLSAgICBzaG9ydCB0YXJnZXROb2RlVHlwZSA9IHRhcmdldE5vZGUuZ2V0Tm9kZVR5cGUoKTsKKyAgICBEVE0gZHRtID0geGN0eHQuZ2V0RFRNKHRhcmdldE5vZGUpOworICAgIHNob3J0IHRhcmdldE5vZGVUeXBlID0gZHRtLmdldE5vZGVUeXBlKHRhcmdldE5vZGUpOwogICAgIFRlbXBsYXRlU3ViUGF0dGVybkFzc29jaWF0aW9uIGhlYWQ7CiAKICAgICBzd2l0Y2ggKHRhcmdldE5vZGVUeXBlKQogICAgIHsKLSAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLSAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgorICAgIGNhc2UgRFRNLkVMRU1FTlRfTk9ERSA6CisgICAgY2FzZSBEVE0uQVRUUklCVVRFX05PREUgOgogICAgICAgaGVhZCA9IChUZW1wbGF0ZVN1YlBhdHRlcm5Bc3NvY2lhdGlvbikgbV9wYXR0ZXJuVGFibGUuZ2V0KAotICAgICAgICB4Y3R4dC5nZXRET01IZWxwZXIoKS5nZXRMb2NhbE5hbWVPZk5vZGUodGFyZ2V0Tm9kZSkpOworICAgICAgICBkdG0uZ2V0TG9jYWxOYW1lKHRhcmdldE5vZGUpKTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgorICAgIGNhc2UgRFRNLlRFWFRfTk9ERSA6CisgICAgY2FzZSBEVE0uQ0RBVEFfU0VDVElPTl9OT0RFIDoKICAgICAgIGhlYWQgPSBtX3RleHRQYXR0ZXJuczsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotICAgIGNhc2UgTm9kZS5FTlRJVFlfTk9ERSA6CisgICAgY2FzZSBEVE0uRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKKyAgICBjYXNlIERUTS5FTlRJVFlfTk9ERSA6CiAgICAgICBoZWFkID0gKFRlbXBsYXRlU3ViUGF0dGVybkFzc29jaWF0aW9uKSBtX3BhdHRlcm5UYWJsZS5nZXQoCi0gICAgICAgIHRhcmdldE5vZGUuZ2V0Tm9kZU5hbWUoKSk7CisgICAgICAgIGR0bS5nZXROb2RlTmFtZSh0YXJnZXROb2RlKSk7IC8vICVSRVZJRVclIEkgdGhpbmsgdGhpcyBpcyByaWdodAogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6CisgICAgY2FzZSBEVE0uUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKICAgICAgIGhlYWQgPSAoVGVtcGxhdGVTdWJQYXR0ZXJuQXNzb2NpYXRpb24pIG1fcGF0dGVyblRhYmxlLmdldCgKLSAgICAgICAgeGN0eHQuZ2V0RE9NSGVscGVyKCkuZ2V0TG9jYWxOYW1lT2ZOb2RlKHRhcmdldE5vZGUpKTsKKyAgICAgICAgZHRtLmdldExvY2FsTmFtZSh0YXJnZXROb2RlKSk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKKyAgICBjYXNlIERUTS5DT01NRU5UX05PREUgOgogICAgICAgaGVhZCA9IG1fY29tbWVudFBhdHRlcm5zOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOgotICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFIDoKKyAgICBjYXNlIERUTS5ET0NVTUVOVF9OT0RFIDoKKyAgICBjYXNlIERUTS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFIDoKICAgICAgIGhlYWQgPSBtX2RvY1BhdHRlcm5zOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOb2RlLk5PVEFUSU9OX05PREUgOgorICAgIGNhc2UgRFRNLk5PVEFUSU9OX05PREUgOgogICAgIGRlZmF1bHQgOgogICAgICAgaGVhZCA9IChUZW1wbGF0ZVN1YlBhdHRlcm5Bc3NvY2lhdGlvbikgbV9wYXR0ZXJuVGFibGUuZ2V0KAotICAgICAgICB0YXJnZXROb2RlLmdldE5vZGVOYW1lKCkpOworICAgICAgICBkdG0uZ2V0Tm9kZU5hbWUodGFyZ2V0Tm9kZSkpOyAvLyAlUkVWSUVXJSBJIHRoaW5rIHRoaXMgaXMgcmlnaHQKICAgICB9CiAKICAgICByZXR1cm4gKG51bGwgPT0gaGVhZCkgPyBtX3dpbGRDYXJkUGF0dGVybnMgOiBoZWFkOwpAQCAtNTE4LDcgKzUyMCw3IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyBFbGVtVGVtcGxhdGUgZ2V0VGVtcGxhdGUoWFBhdGhDb250ZXh0IHhjdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHRhcmdldE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXROb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4SW1wb3J0TGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcXVpZXRDb25mbGljdFdhcm5pbmdzKQpAQCAtNTg1LDcgKzU4Nyw3IEBACiAgICAqIEBwYXJhbSBtb2RlIHJlZmVyZW5jZSwgd2hpY2ggbWF5IGJlIG51bGwsIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0I21vZGVzIj5jdXJyZW50IG1vZGU8L2E+LgogICAgKi8KICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29uZmxpY3RzKFRlbXBsYXRlU3ViUGF0dGVybkFzc29jaWF0aW9uIGhlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUGF0aENvbnRleHQgeGN0eHQsIE5vZGUgdGFyZ2V0Tm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCwgaW50IHRhcmdldE5vZGUsIFFOYW1lIG1vZGUpCiAgIHsKIAogICAgIC8vIFRPRE86IENoZWNrIGZvciBjb25mbGljdHMuCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvVGVtcGxhdGVTdWJQYXR0ZXJuQXNzb2NpYXRpb24uamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9UZW1wbGF0ZVN1YlBhdHRlcm5Bc3NvY2lhdGlvbi5qYXZhCmluZGV4IGFlZWU1YTYuLjIyODM3ZjEgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9UZW1wbGF0ZVN1YlBhdHRlcm5Bc3NvY2lhdGlvbi5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9UZW1wbGF0ZVN1YlBhdHRlcm5Bc3NvY2lhdGlvbi5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKIApAQCAtMTg1LDcgKzE4NSw3IEBACiAgICAqCiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoWFBhdGhDb250ZXh0IHhjdHh0LCBOb2RlIHRhcmdldE5vZGUsIFFOYW1lIG1vZGUpCisgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoWFBhdGhDb250ZXh0IHhjdHh0LCBpbnQgdGFyZ2V0Tm9kZSwgUU5hbWUgbW9kZSkKICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvWFVucmVzb2x2ZWRWYXJpYWJsZS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL1hVbnJlc29sdmVkVmFyaWFibGUuamF2YQppbmRleCBmM2NkNmJkLi5iYjJiM2NjIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvWFVucmVzb2x2ZWRWYXJpYWJsZS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9YVW5yZXNvbHZlZFZhcmlhYmxlLmphdmEKQEAgLTY2LDggKzY2LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlRyYW5zZm9ybWVySW1wbDsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnJlcy5YU0xNZXNzYWdlczsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnJlcy5YU0xURXJyb3JSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogLyoqCiAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhvbGRzIHVudG8gYSB2YXJpYWJsZSB1bnRpbCAKQEAgLTc3LDcgKzc4LDcgQEAKIHB1YmxpYyBjbGFzcyBYVW5yZXNvbHZlZFZhcmlhYmxlIGV4dGVuZHMgWE9iamVjdAogeyAgCiAgIC8qKiBUaGUgbm9kZSBjb250ZXh0IGZvciBleGVjdXRpb24uICovCi0gIHRyYW5zaWVudCBwcml2YXRlIE5vZGUgbV9jb250ZXh0OworICB0cmFuc2llbnQgcHJpdmF0ZSBpbnQgbV9jb250ZXh0OwogICAKICAgLyoqIFRoZSB0cmFuc2Zvcm1lciBjb250ZXh0IGZvciBleGVjdXRpb24uICovCiAgIHRyYW5zaWVudCBwcml2YXRlIFRyYW5zZm9ybWVySW1wbCBtX3RyYW5zZm9ybWVyOwpAQCAtMTE2LDcgKzExNyw3IEBACiAgICAqIGVuZHMsIGkuZS4gYXQgdGhlIHBvaW50IHdlIHNob3VsZCB0ZXJtaW5hdGUgdGhlIHNlYXJjaC4KICAgICogQHBhcmFtIGlzR2xvYmFsIHRydWUgaWYgdGhpcyBpcyBhIGdsb2JhbCB2YXJpYWJsZS4KICAgICovCi0gIHB1YmxpYyBYVW5yZXNvbHZlZFZhcmlhYmxlKEVsZW1WYXJpYWJsZSBvYmosIE5vZGUgc291cmNlTm9kZSwgCisgIHB1YmxpYyBYVW5yZXNvbHZlZFZhcmlhYmxlKEVsZW1WYXJpYWJsZSBvYmosIGludCBzb3VyY2VOb2RlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFyU3RhY2tQb3MsIGludCB2YXJTdGFja0NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNHbG9iYWwpCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFjZS9QcmludFRyYWNlTGlzdGVuZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYWNlL1ByaW50VHJhY2VMaXN0ZW5lci5qYXZhCmluZGV4IGIxYmQ5OGEuLjBiZDJkNzMgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYWNlL1ByaW50VHJhY2VMaXN0ZW5lci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYWNlL1ByaW50VHJhY2VMaXN0ZW5lci5qYXZhCkBAIC0xODYsNyArMTg2LDcgQEAKICAgICAgICAgLy8gWW91IG1heSBub3QgaGF2ZSBsaW5lIG51bWJlcnMgaWYgdGhlIHNlbGVjdGlvbiBpcyBvY2N1cmluZyBmcm9tIGEKICAgICAgICAgLy8gZGVmYXVsdCB0ZW1wbGF0ZS4KICAgICAgICAgRWxlbVRlbXBsYXRlRWxlbWVudCBwYXJlbnQgPQotICAgICAgICAgIChFbGVtVGVtcGxhdGVFbGVtZW50KSBldGUuZ2V0UGFyZW50Tm9kZSgpOworICAgICAgICAgIChFbGVtVGVtcGxhdGVFbGVtZW50KSBldGUuZ2V0UGFyZW50RWxlbSgpOwogCiAgICAgICAgIGlmIChwYXJlbnQgPT0gZXRlLmdldFN0eWxlc2hlZXRSb290KCkuZ2V0RGVmYXVsdFJvb3RSdWxlKCkpCiAgICAgICAgIHsKQEAgLTIxNSwzNiArMjE1LDM2IEBACiAgICAgICBpZiAoZXYubV9zZWxlY3Rpb24uZ2V0VHlwZSgpID09IGV2Lm1fc2VsZWN0aW9uLkNMQVNTX05PREVTRVQpCiAgICAgICB7CiAgICAgICAgIG1fcHcucHJpbnRsbigpOwotCi0gICAgICAgIE5vZGVJdGVyYXRvciBubCA9IGV2Lm1fc2VsZWN0aW9uLm5vZGVzZXQoKTsKLSAgICAgICAgaWYobmwgaW5zdGFuY2VvZiBDb250ZXh0Tm9kZUxpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBubCA9ICgoQ29udGV4dE5vZGVMaXN0KW5sKS5jbG9uZVdpdGhSZXNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjbnNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1fcHcucHJpbnRsbigiICAgICBbQ2FuJ3QgdHJhY2Ugbm9kZWxpc3QgYmVjYXVzZSBpdCBpdCB0aHJldyBhIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uXSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBOb2RlIHBvcyA9IG5sLm5leHROb2RlKCk7Ci0KLSAgICAgICAgICBpZiAobnVsbCA9PSBwb3MpCi0gICAgICAgICAgewotICAgICAgICAgICAgbV9wdy5wcmludGxuKCIgICAgIFtlbXB0eSBub2RlIGxpc3RdIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAobnVsbCAhPSBwb3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1fcHcucHJpbnRsbigiICAgICAiICsgcG9zKTsKLQotICAgICAgICAgICAgICBwb3MgPSBubC5uZXh0Tm9kZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCisgICAgICAgIC8vICVEVEJEJQorLy8gICAgICAgIE5vZGVJdGVyYXRvciBubCA9IGV2Lm1fc2VsZWN0aW9uLm5vZGVzZXQoKTsKKy8vICAgICAgICBpZihubCBpbnN0YW5jZW9mIENvbnRleHROb2RlTGlzdCkKKy8vICAgICAgICB7CisvLyAgICAgICAgICB0cnkKKy8vICAgICAgICAgIHsKKy8vICAgICAgICAgICAgbmwgPSAoKENvbnRleHROb2RlTGlzdClubCkuY2xvbmVXaXRoUmVzZXQoKTsKKy8vICAgICAgICAgIH0KKy8vICAgICAgICAgIGNhdGNoKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNuc2UpUworLy8gICAgICAgICAgeworLy8gICAgICAgICAgICBtX3B3LnByaW50bG4oIiAgICAgW0Nhbid0IHRyYWNlIG5vZGVsaXN0IGJlY2F1c2UgaXQgaXQgdGhyZXcgYSBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbl0iKTsKKy8vICAgICAgICAgICAgcmV0dXJuOworLy8gICAgICAgICAgfQorLy8gICAgICAgICAgTm9kZSBwb3MgPSBubC5uZXh0Tm9kZSgpOworLy8KKy8vICAgICAgICAgIGlmIChudWxsID09IHBvcykKKy8vICAgICAgICAgIHsKKy8vICAgICAgICAgICAgbV9wdy5wcmludGxuKCIgICAgIFtlbXB0eSBub2RlIGxpc3RdIik7CisvLyAgICAgICAgICB9CisvLyAgICAgICAgICBlbHNlCisvLyAgICAgICAgICB7CisvLyAgICAgICAgICAgIHdoaWxlIChudWxsICE9IHBvcykKKy8vICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgIG1fcHcucHJpbnRsbigiICAgICAiICsgcG9zKTsKKy8vCisvLyAgICAgICAgICAgICAgcG9zID0gbmwubmV4dE5vZGUoKTsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgICAgfQorLy8gICAgICAgIH0KKy8vICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIG1fcHcucHJpbnRsbigiICAgICBbQ2FuJ3QgdHJhY2Ugbm9kZWxpc3QgYmVjYXVzZSBpdCBpc24ndCBhIENvbnRleHROb2RlTGlzdF0iKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhY2UvVHJhY2VNYW5hZ2VyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFjZS9UcmFjZU1hbmFnZXIuamF2YQppbmRleCAxZGFiNDlkLi5hZDc1NjhiIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFjZS9UcmFjZU1hbmFnZXIuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFjZS9UcmFjZU1hbmFnZXIuamF2YQpAQCAtMTYyLDE1ICsxNjIsMTUgQEAKICAgICogQHBhcmFtIG1vZGUgVGVtcGxhdGUgbW9kZQogICAgKiBAcGFyYW0gc3R5bGVOb2RlIFN0eWxlc2hlZXQgdGVtcGxhdGUgbm9kZQogICAgKi8KLSAgcHVibGljIHZvaWQgZmlyZVRyYWNlRXZlbnQoTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtVGVtcGxhdGVFbGVtZW50IHN0eWxlTm9kZSkKKyAgcHVibGljIHZvaWQgZmlyZVRyYWNlRXZlbnQoRWxlbVRlbXBsYXRlRWxlbWVudCBzdHlsZU5vZGUpCiAgIHsKIAotICAgIGlmIChoYXNUcmFjZUxpc3RlbmVycygpKQotICAgIHsKLSAgICAgIGZpcmVUcmFjZUV2ZW50KG5ldyBUcmFjZXJFdmVudChtX3RyYW5zZm9ybWVyLCBzb3VyY2VOb2RlLCBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlTm9kZSkpOwotICAgIH0KKyAgLy8gJURUQkQlCisvLyAgICBpZiAoaGFzVHJhY2VMaXN0ZW5lcnMoKSkKKy8vICAgIHsKKy8vICAgICAgZmlyZVRyYWNlRXZlbnQobmV3IFRyYWNlckV2ZW50KG1fdHJhbnNmb3JtZXIsIHNvdXJjZU5vZGUsIG1vZGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZU5vZGUpKTsKKy8vICAgIH0KICAgfQogCiAgIC8qKgpAQCAtMjA2LDE0ICsyMDYsMTUgQEAKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgdm9pZCBmaXJlU2VsZWN0ZWRFdmVudCgKLSAgICAgICAgICBOb2RlIHNvdXJjZU5vZGUsIEVsZW1UZW1wbGF0ZUVsZW1lbnQgc3R5bGVOb2RlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgWFBhdGggeHBhdGgsIFhPYmplY3Qgc2VsZWN0aW9uKQorICAgICAgICAgIGludCBzb3VyY2VOb2RlLCBFbGVtVGVtcGxhdGVFbGVtZW50IHN0eWxlTm9kZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFhQYXRoIHhwYXRoLCBYT2JqZWN0IHNlbGVjdGlvbikKICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAotICAgIGlmIChoYXNUcmFjZUxpc3RlbmVycygpKQotICAgICAgZmlyZVNlbGVjdGVkRXZlbnQobmV3IFNlbGVjdGlvbkV2ZW50KG1fdHJhbnNmb3JtZXIsIHNvdXJjZU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVOb2RlLCBhdHRyaWJ1dGVOYW1lLCB4cGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24pKTsKKyAgLy8gJURUQkQlCisvLyAgICBpZiAoaGFzVHJhY2VMaXN0ZW5lcnMoKSkKKy8vICAgICAgZmlyZVNlbGVjdGVkRXZlbnQobmV3IFNlbGVjdGlvbkV2ZW50KG1fdHJhbnNmb3JtZXIsIHNvdXJjZU5vZGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZU5vZGUsIGF0dHJpYnV0ZU5hbWUsIHhwYXRoLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uKSk7CiAgIH0KIAogICAvKioKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0Nsb25lclRvUmVzdWx0VHJlZS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvQ2xvbmVyVG9SZXN1bHRUcmVlLmphdmEKaW5kZXggMzIxZTBkMi4uMWE5MDAyMyAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvQ2xvbmVyVG9SZXN1bHRUcmVlLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvQ2xvbmVyVG9SZXN1bHRUcmVlLmphdmEKQEAgLTU4LDEzICs1OCwxMCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldDsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmc7CiAKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwogaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CkBAIC0xMTIsOTQgKzEwOSwyNyBAQAogICAgKiAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIHZvaWQgY2xvbmVUb1Jlc3VsdFRyZWUoTm9kZSBub2RlLCBib29sZWFuIHNob3VsZENsb25lQXR0cmlidXRlcykKKyAgcHVibGljIHZvaWQgY2xvbmVUb1Jlc3VsdFRyZWUoaW50IG5vZGUsIGJvb2xlYW4gc2hvdWxkQ2xvbmVBdHRyaWJ1dGVzKQogICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKICAgICB0cnkKICAgICB7Ci0gICAgICBib29sZWFuIHN0cmlwV2hpdGVTcGFjZSA9IGZhbHNlOwogICAgICAgWFBhdGhDb250ZXh0IHhjdHh0ID0gbV90cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKTsKLSAgICAgIERPTUhlbHBlciBkaGVscGVyID0geGN0eHQuZ2V0RE9NSGVscGVyKCk7CisgICAgICBEVE0gZHRtID0geGN0eHQuZ2V0RFRNKG5vZGUpOwogCi0gICAgICBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkKKyAgICAgIHN3aXRjaCAoZHRtLmdldE5vZGVUeXBlKG5vZGUpKQogICAgICAgewotICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBUZXh0IHR4ID0gKFRleHQpIG5vZGU7Ci0gICAgICAgICAgU3RyaW5nIGRhdGEgPSBudWxsOwotCi0gICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJzdHJpcFdoaXRlU3BhY2UgPSAiK3N0cmlwV2hpdGVTcGFjZSsiLCAiK3R4LmdldERhdGEoKSk7Ci0gICAgICAgICAgaWYgKHN0cmlwV2hpdGVTcGFjZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWRoZWxwZXIuaXNJZ25vcmFibGVXaGl0ZXNwYWNlKHR4KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGF0YSA9IHR4LmdldERhdGEoKTsKLQotICAgICAgICAgICAgICBpZiAoKG51bGwgIT0gZGF0YSkgJiYgKDAgPT0gZGF0YS50cmltKCkubGVuZ3RoKCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG51bGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLSAgICAgICAgICAgIGlmIChudWxsICE9IHBhcmVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKE5vZGUuRE9DVU1FTlRfTk9ERSAhPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRhdGEgPSB0eC5nZXREYXRhKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKG51bGwgIT0gZGF0YSkgJiYgKDAgPT0gZGF0YS5sZW5ndGgoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZGF0YSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRhdGEgPSB0eC5nZXREYXRhKCk7Ci0KLSAgICAgICAgICAgICAgaWYgKChudWxsICE9IGRhdGEpICYmICgwID09IGRhdGEubGVuZ3RoKCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG51bGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAobnVsbCAhPSBkYXRhKQotICAgICAgICAgIHsKLQotICAgICAgICAgICAgLy8gVE9ETzogSGFjayBhcm91bmQgdGhlIGlzc3VlIG9mIGNvbW1lbnRzIG5leHQgdG8gbGl0ZXJhbHMuCi0gICAgICAgICAgICAvLyBUaGlzIHdvdWxkIGJlLCB3aGVuIGEgY29tbWVudCBpcyBwcmVzZW50LCB0aGUgd2hpdGVzcGFjZQotICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIGNvbW1lbnQgbXVzdCBiZSBhZGRlZCB0byB0aGUgbGl0ZXJhbC4gIFRoZQotICAgICAgICAgICAgLy8gcGFyc2VyIHNob3VsZCBkbyB0aGlzLCBidXQgWE1MNEogZG9lc24ndCBzZWVtIHRvLgotICAgICAgICAgICAgLy8gPGZvbz5zb21lIGxpdCB0ZXh0Ci0gICAgICAgICAgICAvLyAgICAgPCEtLSBjb21tZW50IC0tPgotICAgICAgICAgICAgLy8gICAgIDwvZm9vPgotICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIG5leHQgc2libGluZ3Mgd2hpbGUgdGhleSBhcmUgY29tbWVudHMsIHRoZW4sCi0gICAgICAgICAgICAvLyBpZiB0aGUgbm9kZSBhZnRlciB0aGF0IGlzIGEgaWdub3JhYmxlIHRleHQgbm9kZSwgYXBwZW5kCi0gICAgICAgICAgICAvLyBpdCB0byB0aGUgdGV4dCBub2RlIGp1c3QgYWRkZWQuCi0gICAgICAgICAgICBpZiAoZGhlbHBlci5pc0lnbm9yYWJsZVdoaXRlc3BhY2UodHgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtX3J0aC5pZ25vcmFibGVXaGl0ZXNwYWNlKGRhdGEudG9DaGFyQXJyYXkoKSwgMCwgZGF0YS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1fcnRoLmNoYXJhY3RlcnMoZGF0YS50b0NoYXJBcnJheSgpLCAwLCBkYXRhLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIGNhc2UgRFRNLlRFWFRfTk9ERSA6CisgICAgICAgIGR0bS5kaXNwYXRjaENoYXJhY3RlcnNFdmVudHMobm9kZSwgbV9ydGgpOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFIDoKLSAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKKyAgICAgIGNhc2UgRFRNLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgOgorICAgICAgY2FzZSBEVE0uRE9DVU1FTlRfTk9ERSA6CiAKICAgICAgICAgLy8gQ2FuJ3QgY2xvbmUgYSBkb2N1bWVudCwgYnV0IHJlZnJhaW4gZnJvbSB0aHJvd2luZyBhbiBlcnJvcgogICAgICAgICAvLyBzbyB0aGF0IGNvcHktb2Ygd2lsbCB3b3JrCiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6CisgICAgICBjYXNlIERUTS5FTEVNRU5UX05PREUgOgogICAgICAgICB7CiAgICAgICAgICAgQXR0cmlidXRlcyBhdHRzOwogCkBAIC0yMDksNTYgKzEzOSwzOSBAQAogICAgICAgICAgICAgbV9ydGgucHJvY2Vzc05TRGVjbHMobm9kZSk7CiAgICAgICAgICAgfQogCi0gICAgICAgICAgU3RyaW5nIG5zID0gZGhlbHBlci5nZXROYW1lc3BhY2VPZk5vZGUobm9kZSk7Ci0gICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IGRoZWxwZXIuZ2V0TG9jYWxOYW1lT2ZOb2RlKG5vZGUpOworICAgICAgICAgIFN0cmluZyBucyA9IGR0bS5nZXROYW1lc3BhY2VVUkkobm9kZSk7CisgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IGR0bS5nZXRMb2NhbE5hbWUobm9kZSk7CiAKLSAgICAgICAgICBtX3J0aC5zdGFydEVsZW1lbnQobnMsIGxvY2FsTmFtZSwgbm9kZS5nZXROb2RlTmFtZSgpLCBudWxsKTsKKyAgICAgICAgICBtX3J0aC5zdGFydEVsZW1lbnQobnMsIGxvY2FsTmFtZSwgZHRtLmdldE5vZGVOYW1lWChub2RlKSwgbnVsbCk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgIG1fcnRoLnN0YXJ0Q0RBVEEoKTsKLQotICAgICAgICAgIFN0cmluZyBkYXRhID0gKChDREFUQVNlY3Rpb24pIG5vZGUpLmdldERhdGEoKTsKLQotICAgICAgICAgIG1fcnRoLmNoYXJhY3RlcnMoZGF0YS50b0NoYXJBcnJheSgpLCAwLCBkYXRhLmxlbmd0aCgpKTsKLSAgICAgICAgICBtX3J0aC5lbmRDREFUQSgpOwotICAgICAgICB9CisgICAgICBjYXNlIERUTS5DREFUQV9TRUNUSU9OX05PREUgOgorICAgICAgICBtX3J0aC5zdGFydENEQVRBKCk7ICAgICAgICAgIAorICAgICAgICBkdG0uZGlzcGF0Y2hDaGFyYWN0ZXJzRXZlbnRzKG5vZGUsIG1fcnRoKTsKKyAgICAgICAgbV9ydGguZW5kQ0RBVEEoKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1fcnRoLmlzRGVmaW5lZE5TRGVjbCgoQXR0cikgbm9kZSkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIFN0cmluZyBucyA9IGRoZWxwZXIuZ2V0TmFtZXNwYWNlT2ZOb2RlKG5vZGUpOwotICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBkaGVscGVyLmdldExvY2FsTmFtZU9mTm9kZShub2RlKTsKLQotICAgICAgICAgIG1fcnRoLmFkZEF0dHJpYnV0ZShucywgbG9jYWxOYW1lLCBub2RlLmdldE5vZGVOYW1lKCksICJDREFUQSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQXR0cikgbm9kZSkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KKyAgICAgIGNhc2UgRFRNLkFUVFJJQlVURV9OT0RFIDoKKyAgICAgICAgbV9ydGguYWRkQXR0cmlidXRlKG5vZGUpOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotICAgICAgICB7Ci0gICAgICAgICAgbV9ydGguY29tbWVudCgoKENvbW1lbnQpIG5vZGUpLmdldERhdGEoKSk7Ci0gICAgICAgIH0KKyAgICAgIGNhc2UgRFRNLkNPTU1FTlRfTk9ERSA6CisgICAgICAgIFhNTFN0cmluZyB4c3RyID0gZHRtLmdldFN0cmluZ1ZhbHVlIChub2RlKTsKKyAgICAgICAgeHN0ci5kaXNwYXRjaEFzQ29tbWVudChtX3J0aCk7CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBFbnRpdHlSZWZlcmVuY2UgZXIgPSAoRW50aXR5UmVmZXJlbmNlKSBub2RlOwotCi0gICAgICAgICAgbV9ydGguZW50aXR5UmVmZXJlbmNlKGVyLmdldE5vZGVOYW1lKCkpOwotICAgICAgICB9CisgICAgICBjYXNlIERUTS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgorICAgICAgICBtX3J0aC5lbnRpdHlSZWZlcmVuY2UoZHRtLmdldE5vZGVOYW1lWChub2RlKSk7CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6CisgICAgICBjYXNlIERUTS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgogICAgICAgICB7Ci0gICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZTsKLQotICAgICAgICAgIG1fcnRoLnByb2Nlc3NpbmdJbnN0cnVjdGlvbihwaS5nZXRUYXJnZXQoKSwgcGkuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAvLyAlUkVWSUVXJSBJcyB0aGUgbm9kZSBuYW1lIHRoZSBzYW1lIGFzIHRoZSAidGFyZ2V0Ij8KKyAgICAgICAgICBtX3J0aC5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oZHRtLmdldE5vZGVOYW1lWChub2RlKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0bS5nZXROb2RlVmFsdWUobm9kZSkpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIG1fdHJhbnNmb3JtZXIuZ2V0TXNnTWdyKCkuZXJyb3IobnVsbCwgWFNMVEVycm9yUmVzb3VyY2VzLkVSX0NBTlRfQ1JFQVRFX0lURU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBub2RlLmdldE5vZGVOYW1lKCkgfSk7ICAvLyJDYW4gbm90IGNyZWF0ZSBpdGVtIGluIHJlc3VsdCB0cmVlOiAiK25vZGUuZ2V0Tm9kZU5hbWUoKSk7CisgICAgICAgIC8vIkNhbiBub3QgY3JlYXRlIGl0ZW0gaW4gcmVzdWx0IHRyZWU6ICIrbm9kZS5nZXROb2RlTmFtZSgpKTsKKyAgICAgICAgbV90cmFuc2Zvcm1lci5nZXRNc2dNZ3IoKS5lcnJvcihudWxsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBYU0xURXJyb3JSZXNvdXJjZXMuRVJfQ0FOVF9DUkVBVEVfSVRFTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGR0bS5nZXROb2RlTmFtZShub2RlKSB9KTsgIAogICAgICAgfQogICAgIH0KICAgICBjYXRjaChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gc2UpCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9Db3VudGVyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9Db3VudGVyLmphdmEKaW5kZXggZWUyNTk2YS4uYjNiZDk5MyAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvQ291bnRlci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0NvdW50ZXIuamF2YQpAQCAtNTYsNyArNTYsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXI7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiBpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuTm9kZVZlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLk5vZGVTZXQ7ICAvLyBmb3IgaXNOb2RlQWZ0ZXIgc3VwcG9ydApAQCAtMTAyLDcgKzEwMyw3IEBACiAgICAqIGZpbmQgYSBjb3VudGVyIGlmIHRoZSBub2RlIGJlaW5nIGNvdW50ZWQgaXMgbm90IGltbWVkaWF0bHkKICAgICogZm91bmQgaW4gdGhlIG1fY291bnROb2RlcyB2ZWN0b3IuCiAgICAqLwotICBOb2RlIG1fZnJvbU5vZGUgPSBudWxsOworICBpbnQgbV9mcm9tTm9kZSA9IERUTS5OVUxMOwogCiAgIC8qKgogICAgKiBUaGUgb3duaW5nIHhzbDpudW1iZXIgZWxlbWVudC4KQEAgLTE1MSw3ICsxNTIsNyBAQAogICAgKiAKICAgICogQHJldHVybiBUaGUgY291bnQgb2YgdGhlIG5vZGUsIG9yIC0xIGlmIG5vdCBmb3VuZC4KICAgICovCi0gIGludCBnZXRQcmV2aW91c2x5Q291bnRlZChYUGF0aENvbnRleHQgc3VwcG9ydCwgTm9kZSBub2RlKQorICBpbnQgZ2V0UHJldmlvdXNseUNvdW50ZWQoWFBhdGhDb250ZXh0IHN1cHBvcnQsIGludCBub2RlKQogICB7CiAKICAgICBpbnQgbiA9IG1fY291bnROb2Rlcy5zaXplKCk7CkBAIC0xNjAsOSArMTYxLDkgQEAKIAogICAgIGZvciAoaW50IGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgewotICAgICAgTm9kZSBjb3VudGVkTm9kZSA9IChOb2RlKSBtX2NvdW50Tm9kZXMuZWxlbWVudEF0KGkpOworICAgICAgaW50IGNvdW50ZWROb2RlID0gbV9jb3VudE5vZGVzLmVsZW1lbnRBdChpKTsKIAotICAgICAgaWYgKG5vZGUuZXF1YWxzKGNvdW50ZWROb2RlKSkKKyAgICAgIGlmIChub2RlID09IGNvdW50ZWROb2RlKQogICAgICAgewogCiAgICAgICAgIC8vIFNpbmNlIHRoZSBsaXN0IGlzIGluIGJhY2t3YXJkcyBvcmRlciwgdGhlIGNvdW50IGlzIApAQCAtMTcxLDEwICsxNzIsMTIgQEAKIAogICAgICAgICBicmVhazsKICAgICAgIH0KKyAgICAgIAorICAgICAgRFRNIGR0bSA9IHN1cHBvcnQuZ2V0RFRNKGNvdW50ZWROb2RlKTsKIAogICAgICAgLy8gVHJ5IHRvIHNlZSBpZiB0aGUgZ2l2ZW4gbm9kZSBmYWxscyBhZnRlciB0aGUgY291bnRlZCBub2RlLi4uCiAgICAgICAvLyBpZiBpdCBkb2VzLCBkb24ndCBrZWVwIHNlYXJjaGluZyBiYWNrd2FyZHMuCi0gICAgICBpZiAoc3VwcG9ydC5nZXRET01IZWxwZXIoKS5pc05vZGVBZnRlcihjb3VudGVkTm9kZSwgbm9kZSkpCisgICAgICBpZiAoZHRtLmlzTm9kZUFmdGVyKGNvdW50ZWROb2RlLCBub2RlKSkKICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0xODYsMTEgKzE4OSwxMSBAQAogICAgKgogICAgKiBAcmV0dXJuIHRoZSBsYXN0IG5vZGUgaW4gdGhlIGxpc3QuCiAgICAqLwotICBOb2RlIGdldExhc3QoKQorICBpbnQgZ2V0TGFzdCgpCiAgIHsKIAogICAgIGludCBzaXplID0gbV9jb3VudE5vZGVzLnNpemUoKTsKIAotICAgIHJldHVybiAoc2l6ZSA+IDApID8gbV9jb3VudE5vZGVzLmVsZW1lbnRBdChzaXplIC0gMSkgOiBudWxsOworICAgIHJldHVybiAoc2l6ZSA+IDApID8gbV9jb3VudE5vZGVzLmVsZW1lbnRBdChzaXplIC0gMSkgOiBEVE0uTlVMTDsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvQ291bnRlcnNUYWJsZS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvQ291bnRlcnNUYWJsZS5qYXZhCmluZGV4IDI2NGU3MDkuLmViYTA4MzggMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0NvdW50ZXJzVGFibGUuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9Db3VudGVyc1RhYmxlLmphdmEKQEAgLTU5LDcgKzU5LDggQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKIApAQCAtMTYwLDcgKzE2MSw3IEBACiAgICAqCiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyBpbnQgY291bnROb2RlKFhQYXRoQ29udGV4dCBzdXBwb3J0LCBFbGVtTnVtYmVyIG51bWJlckVsZW0sIE5vZGUgbm9kZSkKKyAgcHVibGljIGludCBjb3VudE5vZGUoWFBhdGhDb250ZXh0IHN1cHBvcnQsIEVsZW1OdW1iZXIgbnVtYmVyRWxlbSwgaW50IG5vZGUpCiAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIApAQCAtMTcwLDkgKzE3MSw5IEBACiAKICAgICAvLyBYUGF0aCBjb3VudE1hdGNoUGF0dGVybiA9IG51bWJlckVsZW0uZ2V0Q291bnRNYXRjaFBhdHRlcm4oc3VwcG9ydCwgbm9kZSk7CiAgICAgLy8gWFBhdGggZnJvbU1hdGNoUGF0dGVybiA9IG51bWJlckVsZW0ubV9mcm9tTWF0Y2hQYXR0ZXJuOwotICAgIE5vZGUgdGFyZ2V0ID0gbnVtYmVyRWxlbS5nZXRUYXJnZXROb2RlKHN1cHBvcnQsIG5vZGUpOworICAgIGludCB0YXJnZXQgPSBudW1iZXJFbGVtLmdldFRhcmdldE5vZGUoc3VwcG9ydCwgbm9kZSk7CiAKLSAgICBpZiAobnVsbCAhPSB0YXJnZXQpCisgICAgaWYgKERUTS5OVUxMICE9IHRhcmdldCkKICAgICB7CiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudGVyczsgaSsrKQogICAgICAgewpAQCAtMTkyLDcgKzE5Myw3IEBACiAgICAgICAvLyB0aGUgYmFja3dhcmRzIGxpc3QgKG1fbmV3Rm91bmQpIHRvIHRoZSBmb3J3YXJkcyBsaXN0IChjb3VudGVyLm1fY291bnROb2RlcykuCiAgICAgICBjb3VudCA9IDA7CiAKLSAgICAgIGZvciAoOyBudWxsICE9IHRhcmdldDsKKyAgICAgIGZvciAoOyBEVE0uTlVMTCAhPSB0YXJnZXQ7CiAgICAgICAgICAgICAgIHRhcmdldCA9IG51bWJlckVsZW0uZ2V0UHJldmlvdXNOb2RlKHN1cHBvcnQsIHRhcmdldCkpCiAgICAgICB7CiAKQEAgLTIwNyw4ICsyMDgsOCBAQAogICAgICAgICAgICAgaW50IGNhY2hlTGVuID0gY291bnRlci5tX2NvdW50Tm9kZXMuc2l6ZSgpOwogCiAgICAgICAgICAgICBpZiAoKGNhY2hlTGVuID4gMCkKLSAgICAgICAgICAgICAgICAgICAgJiYgY291bnRlci5tX2NvdW50Tm9kZXMuZWxlbWVudEF0KGNhY2hlTGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEpLmVxdWFscyh0YXJnZXQpKQorICAgICAgICAgICAgICAgICAgICAmJiAoY291bnRlci5tX2NvdW50Tm9kZXMuZWxlbWVudEF0KGNhY2hlTGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEpID09IHRhcmdldCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIGNvdW50ICs9IChjYWNoZUxlbiArIGNvdW50ZXIubV9jb3VudE5vZGVzU3RhcnRDb3VudCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0tleUl0ZXJhdG9yLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9LZXlJdGVyYXRvci5qYXZhCmluZGV4IDdiMzJlZWEuLjUwZmIxZjUgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0tleUl0ZXJhdG9yLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvS2V5SXRlcmF0b3IuamF2YQpAQCAtNjAsNiArNjAsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5heGVzLkxvY1BhdGhJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5QcmVmaXhSZXNvbHZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUU5hbWU7CiBpbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuS2V5RGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7CkBAIC02NywxMSArNjgsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworLy9pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwogCkBAIC0xMzUsNyArMTM3LDcgQEAKICAgICogQHBhcmFtIGtleURlY2xhcmF0aW9ucyBUaGUga2V5IGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBzdHlsZXNoZWV0IAogICAgKiBAcGFyYW0geGN0eHQgVGhlIFhQYXRoIHJ1bnRpbWUgc3RhdGUKICAgICovCi0gIHB1YmxpYyBLZXlJdGVyYXRvcihOb2RlIGRvYywgUHJlZml4UmVzb2x2ZXIgbnNjb250ZXh0LCBRTmFtZSBuYW1lLAorICBwdWJsaWMgS2V5SXRlcmF0b3IoaW50IGRvYywgUHJlZml4UmVzb2x2ZXIgbnNjb250ZXh0LCBRTmFtZSBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgVmVjdG9yIGtleURlY2xhcmF0aW9ucywgWFBhdGhDb250ZXh0IHhjdHh0KQogICB7CiAKQEAgLTE1NywxNSArMTU5LDEzIEBACiAgICAqIAogICAgKiBAcmV0dXJuICBUaGUgbmV4dCA8Y29kZT5Ob2RlPC9jb2RlPiBpbiB0aGUgc2V0IGJlaW5nIGl0ZXJhdGVkIG92ZXIsIG9yCiAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbiB0aGF0IHNldC4KLSAgICoKLSAgICogQHRocm93cyBET01FeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyBOb2RlIG5leHROb2RlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbgorICBwdWJsaWMgaW50IG5leHROb2RlKCkKICAgewogCiAgICAgLy8gSWYgdGhlIGNhY2hlIGlzIG9uLCBhbmQgdGhlIG5vZGUgaGFzIGFscmVhZHkgYmVlbiBmb3VuZCwgdGhlbiAKICAgICAvLyBqdXN0IHJldHVybiBmcm9tIHRoZSBsaXN0LgotICAgIE5vZGUgbiA9IHN1cGVyLm5leHROb2RlKCk7CisgICAgaW50IG4gPSBzdXBlci5uZXh0Tm9kZSgpOwogCiAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCItLT4gIisoKG51bGwgPT0gbikgPyAibnVsbCIgOiBuLmdldE5vZGVOYW1lKCkpKTsKICAgICByZXR1cm4gbjsKQEAgLTE3NywxNSArMTc3LDE1IEBACiAgICAqCiAgICAqIEBwYXJhbSBsb29rdXBLZXkgdmFsdWUgb2YgdGhlIGtleSB0byBsb29rIGZvcgogICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9va3VwS2V5KFN0cmluZyBsb29rdXBLZXkpCisgIHB1YmxpYyB2b2lkIHNldExvb2t1cEtleShYTUxTdHJpbmcgbG9va3VwS2V5KQogICB7CiAKICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNldExvb2t1cEtleSAtIGxvb2t1cEtleTogIitsb29rdXBLZXkpOwogICAgICgoS2V5V2Fsa2VyKSBtX2ZpcnN0V2Fsa2VyKS5tX2xvb2t1cEtleSA9IGxvb2t1cEtleTsKIAotICAgIG1fZmlyc3RXYWxrZXIuc2V0Um9vdCgKLSAgICAgICh0aGlzLmdldENvbnRleHQoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLSAgICAgID8gdGhpcy5nZXRDb250ZXh0KCkgOiB0aGlzLmdldENvbnRleHQoKS5nZXRPd25lckRvY3VtZW50KCkpOworICAgIGludCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworICAgIERUTSBkdG0gPSB0aGlzLmdldERUTShjb250ZXh0KTsKKyAgICBtX2ZpcnN0V2Fsa2VyLnNldFJvb3QoZHRtLmdldERvY3VtZW50KCkpOwogICAgIHRoaXMuc2V0TGFzdFVzZWRXYWxrZXIobV9maXJzdFdhbGtlcik7CiAgICAgdGhpcy5zZXROZXh0UG9zaXRpb24oMCk7CiAgIH0KQEAgLTIwOCw3ICsyMDgsNyBAQAogICAgKiBAcGFyYW0gcmVmIEtleSB2YWx1ZShyZWYpKGZyb20ga2V5IHVzZSBmaWVsZCkKICAgICogQHBhcmFtIG5vZGUgTm9kZSBtYXRjaGluZyB0aGF0IHJlZiAKICAgICovCi0gIHZvaWQgYWRkUmVmTm9kZShTdHJpbmcgcmVmLCBOb2RlIG5vZGUpCisgIHZvaWQgYWRkUmVmTm9kZShYTUxTdHJpbmcgcmVmLCBpbnQgbm9kZSkKICAgewogICAgIG1fa2V5VGFibGUuYWRkUmVmTm9kZShyZWYsIG5vZGUpOwogICB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9LZXlNYW5hZ2VyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9LZXlNYW5hZ2VyLmphdmEKaW5kZXggZTRhMTU0OC4uM2EyMTdmZCAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvS2V5TWFuYWdlci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0tleU1hbmFnZXIuamF2YQpAQCAtNTgsMTIgKzU4LDE0IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiBpbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuRWxlbVRlbXBsYXRlRWxlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5RTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5QcmVmaXhSZXNvbHZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5heGVzLkxvY1BhdGhJdGVyYXRvcjsKIApAQCAtOTMsNyArOTUsNyBAQAogICAgKiBAdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyBMb2NQYXRoSXRlcmF0b3IgZ2V0Tm9kZVNldEJ5S2V5KAotICAgICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCwgTm9kZSBkb2MsIFFOYW1lIG5hbWUsIFN0cmluZyByZWYsIFByZWZpeFJlc29sdmVyIG5zY29udGV4dCkKKyAgICAgICAgICBYUGF0aENvbnRleHQgeGN0eHQsIGludCBkb2MsIFFOYW1lIG5hbWUsIFhNTFN0cmluZyByZWYsIFByZWZpeFJlc29sdmVyIG5zY29udGV4dCkKICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvS2V5UmVmSXRlcmF0b3IuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0tleVJlZkl0ZXJhdG9yLmphdmEKaW5kZXggNjFiZTdlMy4uNGJhZDY0YSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvS2V5UmVmSXRlcmF0b3IuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9LZXlSZWZJdGVyYXRvci5qYXZhCkBAIC02MCwxMiArNjAsMTUgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguYXhlcy5Mb2NQYXRoSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUU5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MU3RyaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLktleURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguTm9kZVNldDsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKIAogLyoqCiAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KQEAgLTgzLDcgKzg2LDcgQEAKICAgCiAgIC8qKiBVc2UgZmllbGQgb2Yga2V5IGZ1bmN0aW9uLgogICAgKiAgQHNlcmlhbCAgICAgICAgICovCi0gIHByaXZhdGUgU3RyaW5nIG1fbG9va3VwS2V5OyAgCisgIHByaXZhdGUgWE1MU3RyaW5nIG1fbG9va3VwS2V5OyAgCiAgIAogICAvKiogTWFpbiBLZXkgaXRlcmF0b3IgZm9yIHRoaXMgaXRlcmF0b3IuCiAgICAqICBAc2VyaWFsICAgICovCkBAIC0xMDksNyArMTEyLDcgQEAKICAgICogQHBhcmFtIHJlZiBLZXkgdmFsdWUgdG8gbWF0Y2gKICAgICogQHBhcmFtIGtpIFRoZSBtYWluIGtleSBpdGVyYXRvciB1c2VkIHRvIHdhbGsgdGhlIHNvdXJjZSB0cmVlIAogICAgKi8KLSAgcHVibGljIEtleVJlZkl0ZXJhdG9yKFN0cmluZyByZWYsIEtleUl0ZXJhdG9yIGtpKQorICBwdWJsaWMgS2V5UmVmSXRlcmF0b3IoWE1MU3RyaW5nIHJlZiwgS2V5SXRlcmF0b3Iga2kpCiAgIHsKIAogICAgIHN1cGVyKGtpLmdldFByZWZpeFJlc29sdmVyKCkpOwpAQCAtMTI4LDE2ICsxMzEsMTIgQEAKICAgICogCiAgICAqIEByZXR1cm4gIFRoZSBuZXh0IDxjb2RlPk5vZGU8L2NvZGU+IGluIHRoZSBzZXQgYmVpbmcgaXRlcmF0ZWQgb3Zlciwgb3IKICAgICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBtZW1iZXJzIGluIHRoYXQgc2V0LgotICAgKiAKLSAgICogQHRocm93cyBET01FeGNlcHRpb24KLSAgICogICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlCi0gICAqICAgPGNvZGU+ZGV0YWNoPC9jb2RlPiBtZXRob2Qgd2FzIGludm9rZWQuCiAgICAqLwotICBwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpIHRocm93cyBET01FeGNlcHRpb24KKyAgcHVibGljIGludCBuZXh0Tm9kZSgpCiAgIHsKIAogICAgaWYgKG1fZm91bmRMYXN0KQotICAgICAgcmV0dXJuIG51bGw7CisgICAgICByZXR1cm4gRFRNLk5VTEw7CiAgICAgCiAgICAgLy8gSWYgdGhlIGNhY2hlIGlzIG9uLCBhbmQgdGhlIG5vZGUgaGFzIGFscmVhZHkgYmVlbiBmb3VuZCwgdGhlbiAKICAgICAvLyBqdXN0IHJldHVybiBmcm9tIHRoZSBsaXN0LgpAQCAtMTUwLDIxICsxNDksMjEgQEAKICAgICBpZiAoKG51bGwgIT0gbV9jYWNoZWROb2RlcykKICAgICAgICAgICAgICYmIChtX25leHQgPCBtX2NhY2hlZE5vZGVzLnNpemUoKSkpICAgICAgICAKICAgICB7Ci0gICAgICBOb2RlIG5leHQgPSBtX2NhY2hlZE5vZGVzLmVsZW1lbnRBdChtX25leHQpOyAKKyAgICAgIGludCBuZXh0ID0gbV9jYWNoZWROb2Rlcy5lbGVtZW50QXQobV9uZXh0KTsgCiAgICAgICB0aGlzLnNldEN1cnJlbnRQb3MoKyttX25leHQpOyAKICAgICAgIG1fbGFzdEZldGNoZWQgPSBuZXh0OwogICAgICAgCiAgICAgICByZXR1cm4gbmV4dDsKICAgICB9ICAgIAogCi0gICAgTm9kZSBuZXh0ID0gbnVsbDsgICAgICAgCisgICAgaW50IG5leHQgPSBEVE0uTlVMTDsgICAgICAgCiAgICAgaWYgKCBtX2tpLmdldExvb2tGb3JNb3JlTm9kZXMoKSkgCiAgICAgewogICAgICAgKChLZXlXYWxrZXIpbV9raS5nZXRGaXJzdFdhbGtlcigpKS5tX2xvb2t1cEtleSA9IG1fbG9va3VwS2V5OwogICAgICAgbmV4dCA9IG1fa2kubmV4dE5vZGUoKTsgICAgICAgIAogICAgIH0KICAgICAKLSAgICBpZiAobnVsbCAhPSBuZXh0KQorICAgIGlmIChEVE0uTlVMTCAhPSBuZXh0KQogICAgIHsgIAogICAgICAgbV9sYXN0RmV0Y2hlZCA9IG5leHQ7CiAgICAgICB0aGlzLnNldEN1cnJlbnRQb3MoKyttX25leHQpOwpAQCAtMTczLDggKzE3Miw4IEBACiAgICAgZWxzZQogICAgICAgbV9mb3VuZExhc3QgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAKICAgICAKLSAgICBtX2xhc3RGZXRjaGVkID0gbnVsbDsKLSAgICByZXR1cm4gbnVsbDsKKyAgICBtX2xhc3RGZXRjaGVkID0gRFRNLk5VTEw7CisgICAgcmV0dXJuIERUTS5OVUxMOwogICB9CiAgIAogICAvKioKQEAgLTIyNSw3ICsyMjQsNyBAQAogICAgKgogICAgKiBAcGFyYW0gbm9kZSBOb2RlIHRvIGFkZCB0byBjYWNoZWQgbm9kZXMKICAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE5vZGUoTm9kZSBub2RlKSAKKyAgcHVibGljIHZvaWQgYWRkTm9kZShpbnQgbm9kZSkgCiAgIHsKICAgICBOb2RlU2V0IG1fY2FjaGVkTm9kZXMgPSBnZXRDYWNoZWROb2RlcygpOwogICAgIGlmIChudWxsICE9IG1fY2FjaGVkTm9kZXMpCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9LZXlUYWJsZS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvS2V5VGFibGUuamF2YQppbmRleCA2ZmU2NTVkLi5iYWU5YzNlIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9LZXlUYWJsZS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0tleVRhYmxlLmphdmEKQEAgLTU2LDEwICs1NiwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXI7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworLy9pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwpAQCAtNjksMTEgKzcwLDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5ET01IZWxwZXI7CisvL2ltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLkRPTUhlbHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5RTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5LZXlEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5QcmVmaXhSZXNvbHZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5heGVzLkxvY1BhdGhJdGVyYXRvcjsKIAogLy8gaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uZHRtLio7CkBAIC05Miw3ICs5NCw3IEBACiAgICAqIFRoZSBkb2N1bWVudCBrZXkuICBUaGlzIHRhYmxlIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBjb250ZXh0cwogICAgKiB3aG9zZSBEb2N1bWVudCByb290cyBtYXRjaCB0aGlzIGtleS4KICAgICovCi0gIHByaXZhdGUgTm9kZSBtX2RvY0tleTsKKyAgcHJpdmF0ZSBpbnQgbV9kb2NLZXk7CiAKICAgLyoqCiAgICAqIEdldCB0aGUgZG9jdW1lbnQgcm9vdCBtYXRjaGluZyB0aGlzIGtleS4gIApAQCAtMTAwLDcgKzEwMiw3IEBACiAgICAqCiAgICAqIEByZXR1cm4gdGhlIGRvY3VtZW50IHJvb3QgbWF0Y2hpbmcgdGhpcyBrZXkKICAgICovCi0gIHB1YmxpYyBOb2RlIGdldERvY0tleSgpCisgIHB1YmxpYyBpbnQgZ2V0RG9jS2V5KCkKICAgewogICAgIHJldHVybiBtX2RvY0tleTsKICAgfQpAQCAtMTMxLDcgKzEzMyw3IEBACiAgICAqIEB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIEtleVRhYmxlKAotICAgICAgICAgIE5vZGUgZG9jLCBQcmVmaXhSZXNvbHZlciBuc2NvbnRleHQsIFFOYW1lIG5hbWUsIFZlY3RvciBrZXlEZWNsYXJhdGlvbnMsIFhQYXRoQ29udGV4dCB4bWxMaWFpc29uKQorICAgICAgICAgIGludCBkb2MsIFByZWZpeFJlc29sdmVyIG5zY29udGV4dCwgUU5hbWUgbmFtZSwgVmVjdG9yIGtleURlY2xhcmF0aW9ucywgWFBhdGhDb250ZXh0IHhtbExpYWlzb24pCiAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKQEAgLTE1MCw3ICsxNTIsNyBAQAogICAgKiBpZiB0aGUgaWRlbnRpZmllciBpcyBub3QgZm91bmQsIGl0IHdpbGwgcmV0dXJuIG51bGwsCiAgICAqIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBhIExvY1BhdGhJdGVyYXRvciBpbnN0YW5jZS4KICAgICovCi0gIHB1YmxpYyBMb2NQYXRoSXRlcmF0b3IgZ2V0Tm9kZVNldEJ5S2V5KFFOYW1lIG5hbWUsIFN0cmluZyByZWYpCisgIHB1YmxpYyBMb2NQYXRoSXRlcmF0b3IgZ2V0Tm9kZVNldEJ5S2V5KFFOYW1lIG5hbWUsIFhNTFN0cmluZyByZWYpCiAgIHsKIAogICAgIEtleUl0ZXJhdG9yIGtpOwpAQCAtMTkwLDcgKzE5Miw3IEBACiAgICAgICAgIHJlZnNUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKICAgICAgIAogICAgICAgLy8gaW5pdGlhbGl6ZSB3YWxrZXIgb25seSBvbmNlIQotICAgICAgaWYgKG1fa2V5SXRlci5nZXRGaXJzdFdhbGtlcigpLmdldFJvb3QoKSA9PSBudWxsKQorICAgICAgaWYgKG1fa2V5SXRlci5nZXRGaXJzdFdhbGtlcigpLmdldFJvb3QoKSA9PSBEVE0uTlVMTCkKICAgICAgICAgbV9rZXlJdGVyLnNldExvb2t1cEtleShyZWYpOwogICAgICAgZWxzZQogICAgICAgICAoKEtleVdhbGtlciltX2tleUl0ZXIuZ2V0Rmlyc3RXYWxrZXIoKSkubV9sb29rdXBLZXkgPSByZWY7CkBAIC0yMjAsNyArMjIyLDcgQEAKICAgICogQHBhcmFtIHJlZiBLZXkgcmVmKGZyb20ga2V5IHVzZSBmaWVsZCkKICAgICogQHBhcmFtIG5vZGUgTm9kZSBtYXRjaGluZyB0aGF0IHJlZiAKICAgICovCi0gIHZvaWQgYWRkUmVmTm9kZShTdHJpbmcgcmVmLCBOb2RlIG5vZGUpCisgIHZvaWQgYWRkUmVmTm9kZShYTUxTdHJpbmcgcmVmLCBpbnQgbm9kZSkKICAgewogICAgIEtleVJlZkl0ZXJhdG9yIGtpUmVmID0gbnVsbDsKICAgICBIYXNodGFibGUgcmVmc1RhYmxlID0gbnVsbDsKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0tleVdhbGtlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvS2V5V2Fsa2VyLmphdmEKaW5kZXggNDJlYWRmOS4uNGNiMmU3YiAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvS2V5V2Fsa2VyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvS2V5V2Fsa2VyLmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLmF4ZXMuTG9jUGF0aEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlByZWZpeFJlc29sdmVyOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlFOYW1lOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5LZXlEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnJlcy5YU0xNZXNzYWdlczsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnJlcy5YU0xURXJyb3JSZXNvdXJjZXM7CkBAIC02OSwxMSArNzAsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YT2JqZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGg7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNRmlsdGVyOwogCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKIApAQCAtOTksNTggKzk4LDUyIEBACiAgICAqCiAgICAqIEBwYXJhbSByb290IERvY3VtZW50IHJvb3Qgbm9kZQogICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdChOb2RlIHJvb3QpCisgIHB1YmxpYyB2b2lkIHNldFJvb3QoaW50IHJvb3QpCiAgIHsKIAotICAgIG1fYXR0cnMgPSBudWxsOworICAgIG1fbmV4dEF0dHIgPSBEVE0uTlVMTDsKICAgICBtX2ZvdW5kQXR0cnMgPSBmYWxzZTsKLSAgICBtX2F0dHJQb3MgPSAwOwogCiAgICAgc3VwZXIuc2V0Um9vdChyb290KTsKICAgfQogCi0gIC8qKiBMaXN0IG9mIGF0dHJpYnV0ZSBub2RlcyBvZiB0aGUgY3VycmVudCBub2RlICAgICAgKi8KLSAgdHJhbnNpZW50IE5hbWVkTm9kZU1hcCBtX2F0dHJzOworICAvKiogRmlyc3QgYXR0cmlidXRlIG9mIHRoZSBjdXJyZW50IG5vZGUuICAgICAgKi8KKyAgdHJhbnNpZW50IGludCBtX25leHRBdHRyOwogCiAgIC8qKiBGbGFnIGluZGljYXRpbmcgdGhhdCBhdHRpYnV0ZSBub2RlcyB3ZXJlIGZvdW5kIGZvciB0aGUgY3VycmVudCBub2RlICAgICovCiAgIHRyYW5zaWVudCBib29sZWFuIG1fZm91bmRBdHRyczsKIAotICAvKiogQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYXR0cmlidXRlIG5vZGVzIGxpc3QgICAgICAgICAqLwotICB0cmFuc2llbnQgaW50IG1fYXR0clBvczsKLQogICAvKiogS2V5IHZhbHVlIHRoYXQgdGhpcyBpcyBsb29raW5nIGZvci4KICAgICogIEBzZXJpYWwgICAgICAgICAgICovCi0gIFN0cmluZyBtX2xvb2t1cEtleTsKKyAgWE1MU3RyaW5nIG1fbG9va3VwS2V5OwogCiAgIC8qKgogICAgKiBHZXQgdGhlIG5leHQgbm9kZSBpbiBkb2N1bWVudCBvcmRlciBvbiB0aGUgYXhlcy4KICAgICoKICAgICogQHJldHVybiBUaGUgbmV4dCBub2RlIGZvdW5kIG9yIG51bGwuCiAgICAqLwotICBwcm90ZWN0ZWQgTm9kZSBnZXROZXh0Tm9kZSgpCisgIHByb3RlY3RlZCBpbnQgZ2V0TmV4dE5vZGUoKQogICB7CiAKKyAgICBpbnQgY3VycmVudE5vZGUgPSBnZXRDdXJyZW50Tm9kZSgpOworICAgIERUTSBkdG0gPSB0aGlzLm1fbHBpLmdldFhQYXRoQ29udGV4dCgpLmdldERUTShjdXJyZW50Tm9kZSk7CiAgICAgaWYgKCFtX2ZvdW5kQXR0cnMpCiAgICAgewotICAgICAgbV9hdHRycyA9IGdldEN1cnJlbnROb2RlKCkuZ2V0QXR0cmlidXRlcygpOworICAgICAgbV9uZXh0QXR0ciA9IGR0bS5nZXRGaXJzdEF0dHJpYnV0ZShjdXJyZW50Tm9kZSk7CiAgICAgICBtX2ZvdW5kQXR0cnMgPSB0cnVlOworICAgICAgaWYgKERUTS5OVUxMICE9IG1fbmV4dEF0dHIpCisgICAgICAgIHJldHVybiBtX25leHRBdHRyOwogICAgIH0KLQotICAgIGlmIChudWxsICE9IG1fYXR0cnMpCisgICAgZWxzZSBpZiAoRFRNLk5VTEwgIT0gbV9uZXh0QXR0cikKICAgICB7Ci0gICAgICBpZiAobV9hdHRyUG9zIDwgbV9hdHRycy5nZXRMZW5ndGgoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYXR0cnMuaXRlbShtX2F0dHJQb3MrKyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG1fYXR0cnMgPSBudWxsOwotICAgICAgfQorICAgICAgbV9uZXh0QXR0ciA9IGR0bS5nZXROZXh0QXR0cmlidXRlKG1fbmV4dEF0dHIpOworICAgICAgaWYgKERUTS5OVUxMICE9IG1fbmV4dEF0dHIpCisgICAgICAgIHJldHVybiBtX25leHRBdHRyOwogICAgIH0KIAotICAgIE5vZGUgbmV4dCA9IHN1cGVyLmdldE5leHROb2RlKCk7CisgICAgaW50IG5leHQgPSBzdXBlci5nZXROZXh0Tm9kZSgpOwogCi0gICAgaWYgKG51bGwgIT0gbmV4dCkKKyAgICBpZiAoRFRNLk5VTEwgIT0gbmV4dCkKICAgICAgIG1fZm91bmRBdHRycyA9IGZhbHNlOwogCiAgICAgcmV0dXJuIG5leHQ7CkBAIC0xNjcsMTYgKzE2MCwxNiBAQAogICAgKiBAcmV0dXJuICBhIGNvbnN0YW50IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBub2RlIGlzIGFjY2VwdGVkLAogICAgKiAgIHJlamVjdGVkLCBvciBza2lwcGVkLCBhcyBkZWZpbmVkICBhYm92ZSAuCiAgICAqLwotICBwdWJsaWMgc2hvcnQgYWNjZXB0Tm9kZShOb2RlIHRlc3ROb2RlKQorICBwdWJsaWMgc2hvcnQgYWNjZXB0Tm9kZShpbnQgdGVzdE5vZGUpCiAgIHsKLQkJYm9vbGVhbiBmb3VuZEtleSA9IGZhbHNlOworICAgIGJvb2xlYW4gZm91bmRLZXkgPSBmYWxzZTsKICAgICBLZXlJdGVyYXRvciBraSA9IChLZXlJdGVyYXRvcikgbV9scGk7CiAgICAgVmVjdG9yIGtleXMgPSBraS5nZXRLZXlEZWNsYXJhdGlvbnMoKTsKIAogICAgIFFOYW1lIG5hbWUgPSBraS5nZXROYW1lKCk7CiAgICAgdHJ5CiAgICAgewotICAgICAgU3RyaW5nIGxvb2t1cEtleSA9IG1fbG9va3VwS2V5OworICAgICAgWE1MU3RyaW5nIGxvb2t1cEtleSA9IG1fbG9va3VwS2V5OwogCiAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImxvb2t1cEtleTogIitsb29rdXBLZXkpOwogICAgICAgaW50IG5EZWNsYXJhdGlvbnMgPSBrZXlzLnNpemUoKTsKQEAgLTE5MSw3ICsxODQsNyBAQAogICAgICAgICBpZigha2QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgCiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIAotCQkJCWZvdW5kS2V5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRLZXkgPSB0cnVlOwogICAgICAgICBraS5nZXRYUGF0aENvbnRleHQoKS5zZXROYW1lc3BhY2VDb250ZXh0KGtpLmdldFByZWZpeFJlc29sdmVyKCkpOwogCiAgICAgICAgIC8vIFNlZSBpZiBvdXIgbm9kZSBtYXRjaGVzIHRoZSBnaXZlbiBrZXkgZGVjbGFyYXRpb24gYWNjb3JkaW5nIHRvIApAQCAtMjA5LDE2ICsyMDIsMTYgQEAKIAogICAgICAgICBpZiAoeHVzZS5nZXRUeXBlKCkgIT0geHVzZS5DTEFTU19OT0RFU0VUKQogICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGV4cHJSZXN1bHQgPSB4dXNlLnN0cigpOworICAgICAgICAgIFhNTFN0cmluZyBleHByUmVzdWx0ID0geHVzZS54c3RyKCk7CiAgICAgICAgICAgKChLZXlJdGVyYXRvciltX2xwaSkuYWRkUmVmTm9kZShleHByUmVzdWx0LCB0ZXN0Tm9kZSk7CiAgICAgICAgICAgCiAgICAgICAgICAgaWYgKGxvb2t1cEtleS5lcXVhbHMoZXhwclJlc3VsdCkpCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5GSUxURVJfQUNDRVBUOworICAgICAgICAgICAgcmV0dXJuIERUTUl0ZXJhdG9yLkZJTFRFUl9BQ0NFUFQ7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgTm9kZUl0ZXJhdG9yIG5sID0geHVzZS5ub2Rlc2V0KCk7Ci0gICAgICAgICAgTm9kZSB1c2VOb2RlOworICAgICAgICAgIERUTUl0ZXJhdG9yIG5sID0geHVzZS5ub2Rlc2V0KCk7CisgICAgICAgICAgaW50IHVzZU5vZGU7CiAgICAgICAgICAgc2hvcnQgcmVzdWx0ID0gLTE7CiAgICAgICAgICAgLyoKICAgICAgICAgICBXZSBhcmUgd2Fsa2luZyB0aHJvdWdoIGFsbCB0aGUgbm9kZXMgaW4gdGhpcyBub2Rlc2V0CkBAIC0yMzIsMTQgKzIyNSwxNSBAQAogICAgICAgICAgIG1hdGNoZXMuIFdoYXQgaWYgdGhlIG5leHQgY2FsbCBpcyBmb3IgdGhlIHNhbWUgbWF0Y2grdXNlIAogICAgICAgICAgIGNvbWJpbmF0aW9uPz8KICAgICAgICAgICAqLwotICAgICAgICAgIHdoaWxlIChudWxsICE9ICh1c2VOb2RlID0gbmwubmV4dE5vZGUoKSkpCisgICAgICAgICAgd2hpbGUgKERUTS5OVUxMICE9ICh1c2VOb2RlID0gbmwubmV4dE5vZGUoKSkpCiAgICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGV4cHJSZXN1bHQgPSBtX2xwaS5nZXRET01IZWxwZXIoKS5nZXROb2RlRGF0YSh1c2VOb2RlKTsKKyAgICAgICAgICAgIERUTSBkdG0gPSBnZXREVE0odXNlTm9kZSk7CisgICAgICAgICAgICBYTUxTdHJpbmcgZXhwclJlc3VsdCA9IGR0bS5nZXRTdHJpbmdWYWx1ZSh1c2VOb2RlKTsKICAgICAgICAgICAgICgoS2V5SXRlcmF0b3IpbV9scGkpLmFkZFJlZk5vZGUoZXhwclJlc3VsdCwgdGVzdE5vZGUpOyAKICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKChudWxsICE9IGV4cHJSZXN1bHQpICYmIGxvb2t1cEtleS5lcXVhbHMoZXhwclJlc3VsdCkpCi0gICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuRklMVEVSX0FDQ0VQVDsKLSAgICAgICAgICAgICAgLy9yZXR1cm4gdGhpcy5GSUxURVJfQUNDRVBUOworICAgICAgICAgICAgICByZXN1bHQgPSBEVE1JdGVyYXRvci5GSUxURVJfQUNDRVBUOworICAgICAgICAgICAgICAvL3JldHVybiBEVE1JdGVyYXRvci5GSUxURVJfQUNDRVBUOwogICAgICAgICAgIH0KICAgICAgICAgICBpZiAoLTEgIT0gcmVzdWx0KQogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTI1MywxMCArMjQ3LDEwIEBACiAgICAgICAvLyBUT0RPOiBXaGF0IHRvIGRvPwogICAgIH0KIAotCQlpZiAoIWZvdW5kS2V5KQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24KLQkJCQkoWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZShYU0xURXJyb3JSZXNvdXJjZXMuRVJfTk9fWFNMS0VZX0RFQ0xBUkFUSU9OLCBuZXcgT2JqZWN0W117bmFtZS5nZXRMb2NhbE5hbWUoKX0pKTsKLSAgICByZXR1cm4gdGhpcy5GSUxURVJfUkVKRUNUOworICAgICAgICAgICAgICAgIGlmICghZm91bmRLZXkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZShYU0xURXJyb3JSZXNvdXJjZXMuRVJfTk9fWFNMS0VZX0RFQ0xBUkFUSU9OLCBuZXcgT2JqZWN0W117bmFtZS5nZXRMb2NhbE5hbWUoKX0pKTsKKyAgICByZXR1cm4gRFRNSXRlcmF0b3IuRklMVEVSX1JFSkVDVDsKICAgfQogICAKICAgIC8qKgpAQCAtMjY5LDEzICsyNjMsMTMgQEAKICAgICogQHJldHVybiAgVGhlIG5ldyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwogICAgKiAgIG5leHQgbm9kZSAgaW4gdGhlIFRyZWVXYWxrZXIncyBsb2dpY2FsIHZpZXcuCiAgICAqLwotICBwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpCisgIHB1YmxpYyBpbnQgbmV4dE5vZGUoKQogICB7Ci0gICAgTm9kZSBub2RlID0gc3VwZXIubmV4dE5vZGUoKTsKKyAgICBpbnQgbm9kZSA9IHN1cGVyLm5leHROb2RlKCk7CiAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbmV4dCBub2RlLCB3ZSBoYXZlIHdhbGtlZCB0aGUgd2hvbGUgc291cmNlIHRyZWUuCiAgICAgLy8gTm90aWZ5IHRoZSBpdGVyYXRvciBvZiB0aGF0IHNvIHRoYXQgaXRzIGNhbGxlcnMga25vdyB0aGF0IHRoZXJlCiAgICAgLy8gYXJlIG5vIG1vcmUgbm9kZXMgdG8gYmUgZm91bmQuCi0gICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICBpZiAobm9kZSA9PSBEVE0uTlVMTCkKICAgICAgICgoS2V5SXRlcmF0b3IpbV9scGkpLnNldExvb2tGb3JNb3JlTm9kZXMoZmFsc2UpOwogICAgIHJldHVybiBub2RlOwogICB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9Ob2RlU29ydEtleS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvTm9kZVNvcnRLZXkuamF2YQppbmRleCA2YjM2OThjLi4xMzBiNTA2IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9Ob2RlU29ydEtleS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL05vZGVTb3J0S2V5LmphdmEKQEAgLTExMCw3ICsxMTAsOSBAQAogICAgKiBAdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIE5vZGVTb3J0S2V5KAotICAgICAgICAgIFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwgWFBhdGggc2VsZWN0UGF0LCBib29sZWFuIHRyZWF0QXNOdW1iZXJzLCBib29sZWFuIGRlc2NlbmRpbmcsIFN0cmluZyBsYW5nVmFsdWUsIGJvb2xlYW4gY2FzZU9yZGVyVXBwZXIsIG9yZy5hcGFjaGUueG1sLnV0aWxzLlByZWZpeFJlc29sdmVyIG5hbWVzcGFjZUNvbnRleHQpCisgICAgICAgICAgVHJhbnNmb3JtZXJJbXBsIHRyYW5zZm9ybWVyLCBYUGF0aCBzZWxlY3RQYXQsIGJvb2xlYW4gdHJlYXRBc051bWJlcnMsIAorICAgICAgICAgIGJvb2xlYW4gZGVzY2VuZGluZywgU3RyaW5nIGxhbmdWYWx1ZSwgYm9vbGVhbiBjYXNlT3JkZXJVcHBlciwgCisgICAgICAgICAgb3JnLmFwYWNoZS54bWwudXRpbHMuUHJlZml4UmVzb2x2ZXIgbmFtZXNwYWNlQ29udGV4dCkKICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvTm9kZVNvcnRlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvTm9kZVNvcnRlci5qYXZhCmluZGV4IDIwZjNhN2MuLmVhZDYyZWIgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL05vZGVTb3J0ZXIuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9Ob2RlU29ydGVyLmphdmEKQEAgLTYxLDggKzYxLDEwIEBACiBpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKIGltcG9ydCBqYXZhLnRleHQuQ29sbGF0aW9uS2V5OwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLmF4ZXMuQ29udGV4dE5vZGVMaXN0OwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0OwpAQCAtMTEyLDIyICsxMTQsMjYgQEAKICAgICoKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgdm9pZCBzb3J0KE5vZGVWZWN0b3IgdiwgVmVjdG9yIGtleXMsIFhQYXRoQ29udGV4dCBzdXBwb3J0KQorICBwdWJsaWMgdm9pZCBzb3J0KERUTUl0ZXJhdG9yIHYsIFZlY3RvciBrZXlzLCBYUGF0aENvbnRleHQgc3VwcG9ydCkKICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKICAgICBtX2tleXMgPSBrZXlzOwogCiAgICAgLy8gUXVpY2tTb3J0Mih2LCAwLCB2LnNpemUoKSAtIDEgKTsKLSAgICBpbnQgbiA9IHYuc2l6ZSgpOworICAgIGludCBuID0gdi5nZXRMZW5ndGgoKTsKIAorICAgIC8vICVPUFQlIENoYW5nZSBtZXJnZXNvcnQgdG8ganVzdCB0YWtlIGEgRFRNSXRlcmF0b3I/CisgICAgLy8gV2Ugd291bGQgYWxzbyBoYXZlIHRvIGFkYXB0IERUTUl0ZXJhdG9yIHRvIGhhdmUgdGhlIGZ1bmN0aW9uIAorICAgIC8vIG9mIE5vZGVDb21wYXJlRWxlbS4KKyAgICAKICAgICAvLyBDcmVhdGUgYSB2ZWN0b3Igb2Ygbm9kZSBjb21wYXJlIGVsZW1lbnRzCiAgICAgLy8gYmFzZWQgb24gdGhlIGlucHV0IHZlY3RvciBvZiBub2RlcwogICAgIFZlY3RvciBub2RlcyA9IG5ldyBWZWN0b3IoKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgIHsKLSAgICAgIE5vZGVDb21wYXJlRWxlbSBlbGVtID0gbmV3IE5vZGVDb21wYXJlRWxlbSgoTm9kZSkgdi5lbGVtZW50QXQoaSkpOworICAgICAgTm9kZUNvbXBhcmVFbGVtIGVsZW0gPSBuZXcgTm9kZUNvbXBhcmVFbGVtKHYuaXRlbShpKSk7CiAKICAgICAgIG5vZGVzLmFkZEVsZW1lbnQoZWxlbSk7CiAgICAgfQpAQCAtMTM5LDggKzE0NSw5IEBACiAgICAgLy8gcmV0dXJuIHNvcnRlZCB2ZWN0b3Igb2Ygbm9kZXMKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICB7Ci0gICAgICB2LnNldEVsZW1lbnRBdCgoKE5vZGVDb21wYXJlRWxlbSkgbm9kZXMuZWxlbWVudEF0KGkpKS5tX25vZGUsIGkpOworICAgICAgdi5zZXRJdGVtKCgoTm9kZUNvbXBhcmVFbGVtKSBub2Rlcy5lbGVtZW50QXQoaSkpLm1fbm9kZSwgaSk7CiAgICAgfQorICAgIHYuc2V0Q3VycmVudFBvcygwKTsKIAogICAgIC8vIG9sZCBjb2RlLi4uCiAgICAgLy9Ob2RlVmVjdG9yIHNjcmF0Y2hWZWN0b3IgPSBuZXcgTm9kZVZlY3RvcihuKTsKQEAgLTI5NCw4ICszMDEsOCBAQAogICAgICAgLy8gYmUgYSBnbGl0Y2ggaW4gdGhlIG1lcmdlc29ydAogICAgICAgLy8gaWYocjEuZ2V0VHlwZSgpID09IHIxLkNMQVNTX05PREVTRVQpCiAgICAgICAvLyB7Ci0gICAgICByZXN1bHQgPSBzdXBwb3J0LmdldERPTUhlbHBlcigpLmlzTm9kZUFmdGVyKG4xLm1fbm9kZSwgbjIubV9ub2RlKQotICAgICAgICAgICAgICAgPyAtMSA6IDE7CisgICAgICBEVE0gZHRtID0gc3VwcG9ydC5nZXREVE0objEubV9ub2RlKTsgLy8gJU9QVCUKKyAgICAgIHJlc3VsdCA9IGR0bS5pc05vZGVBZnRlcihuMS5tX25vZGUsIG4yLm1fbm9kZSkgPyAtMSA6IDE7CiAKICAgICAgIC8vIH0KICAgICB9CkBAIC00NjIsMjIgKzQ2OSwyMiBAQAogICAgICAgfQogICAgIH0gLy8gZW5kIFF1aWNrU29ydDIgICovCiAKLSAgLyoqCi0gICAqIFNpbXBsZSBmdW5jdGlvbiB0byBzd2FwIHR3byBlbGVtZW50cyBpbgotICAgKiBhIHZlY3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSB2IFZlY3RvciBvZiBub2RlcyB0byBzd2FwCi0gICAqIEBwYXJhbSBpIEluZGV4IG9mIGZpcnN0IG5vZGUgdG8gc3dhcAotICAgKiBAcGFyYW0gaSBJbmRleCBvZiBzZWNvbmQgbm9kZSB0byBzd2FwCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3dhcChWZWN0b3IgdiwgaW50IGksIGludCBqKQotICB7Ci0KLSAgICBOb2RlIG5vZGUgPSAoTm9kZSkgdi5lbGVtZW50QXQoaSk7Ci0KLSAgICB2LnNldEVsZW1lbnRBdCh2LmVsZW1lbnRBdChqKSwgaSk7Ci0gICAgdi5zZXRFbGVtZW50QXQobm9kZSwgaik7Ci0gIH0KKy8vICAvKioKKy8vICAgKiBTaW1wbGUgZnVuY3Rpb24gdG8gc3dhcCB0d28gZWxlbWVudHMgaW4KKy8vICAgKiBhIHZlY3Rvci4KKy8vICAgKiAKKy8vICAgKiBAcGFyYW0gdiBWZWN0b3Igb2Ygbm9kZXMgdG8gc3dhcAorLy8gICAqIEBwYXJhbSBpIEluZGV4IG9mIGZpcnN0IG5vZGUgdG8gc3dhcAorLy8gICAqIEBwYXJhbSBpIEluZGV4IG9mIHNlY29uZCBub2RlIHRvIHN3YXAKKy8vICAgKi8KKy8vICBwcml2YXRlIHZvaWQgc3dhcChWZWN0b3IgdiwgaW50IGksIGludCBqKQorLy8gIHsKKy8vCisvLyAgICBpbnQgbm9kZSA9IChOb2RlKSB2LmVsZW1lbnRBdChpKTsKKy8vCisvLyAgICB2LnNldEVsZW1lbnRBdCh2LmVsZW1lbnRBdChqKSwgaSk7CisvLyAgICB2LnNldEVsZW1lbnRBdChub2RlLCBqKTsKKy8vICB9CiAKICAgLyoqCiAgICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgpAQCAtNDg4LDcgKzQ5NSw3IEBACiAgIHsKIAogICAgIC8qKiBDdXJyZW50IG5vZGUgICAgICAgICAgKi8KLSAgICBOb2RlIG1fbm9kZTsKKyAgICBpbnQgbV9ub2RlOwogCiAgICAgLyoqIFRoaXMgbWF4a2V5IHZhbHVlIHdhcyBjaG9zZW4gYXJiaXRyYXJpbHkuIFdlIGFyZSBhc3N1bWluZyB0aGF0IHRoZSAgICAKICAgICAvLyBtYXhrZXkgKyAxIGtleXMgd2lsbCBvbmx5IGhpdCBmYWlybHkgcmFyZWx5IGFuZCB0aGVyZWZvcmUsIHdlCkBAIC01MTQsNyArNTIxLDcgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgICAqLwotICAgIE5vZGVDb21wYXJlRWxlbShOb2RlIG5vZGUpIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCisgICAgTm9kZUNvbXBhcmVFbGVtKGludCBub2RlKSB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgIHsKIAogICAgICAgYm9vbGVhbiB0cnlOZXh0S2V5ID0gdHJ1ZTsKQEAgLTU0NiwxMCArNTUzLDE0IEBACiAKICAgICAgICAgaWYgKHIuZ2V0VHlwZSgpID09IFhPYmplY3QuQ0xBU1NfTk9ERVNFVCkKICAgICAgICAgewotICAgICAgICAgIE5vZGVJdGVyYXRvciBuaSA9IChOb2RlSXRlcmF0b3IpIHIub2JqZWN0KCk7CisgICAgICAgICAgLy8gJVJFVklFVyUKKyAgICAgICAgICBEVE1JdGVyYXRvciBuaSA9IChEVE1JdGVyYXRvcilyLm9iamVjdCgpOworICAgICAgICAgIGludCBjdXJyZW50ID0gbmkuZ2V0Q3VycmVudE5vZGUoKTsKKyAgICAgICAgICBpZihEVE0uTlVMTCA9PSBjdXJyZW50KQorICAgICAgICAgICAgY3VycmVudCA9IG5pLm5leHROb2RlKCk7CiAKLSAgICAgICAgICBpZiAobmkgaW5zdGFuY2VvZiBDb250ZXh0Tm9kZUxpc3QpCi0gICAgICAgICAgICB0cnlOZXh0S2V5ID0gKCgoQ29udGV4dE5vZGVMaXN0KSBuaSkuZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsKTsKKyAgICAgICAgICAvLyBpZiAobmkgaW5zdGFuY2VvZiBDb250ZXh0Tm9kZUxpc3QpIC8vICVSRVZJRVclCisgICAgICAgICAgdHJ5TmV4dEtleSA9IChEVE0uTlVMTCAhPSBjdXJyZW50KTsKIAogICAgICAgICAgIC8vIGVsc2UgYWJkaWNhdGUuLi4gc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0Li4uIC1zYgogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9RdWV1ZWRTdGFydEVsZW1lbnQuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1F1ZXVlZFN0YXJ0RWxlbWVudC5qYXZhCmluZGV4IDgzZjg5NGMuLjY3NmNmMjcgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1F1ZXVlZFN0YXJ0RWxlbWVudC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1F1ZXVlZFN0YXJ0RWxlbWVudC5qYXZhCkBAIC03MiwxMyArNzIsMTYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtVGVtcGxhdGVFbGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1UZW1wbGF0ZTsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CiAKIC8qKgogICogVHJhY2tzIHRoZSBzdGF0ZSBvZiBhIHF1ZXVlZCBlbGVtZW50IGV2ZW50LgogICovCi1wdWJsaWMgY2xhc3MgUXVldWVkU3RhcnRFbGVtZW50IGV4dGVuZHMgUXVldWVkU0FYRXZlbnQgaW1wbGVtZW50cyBUcmFuc2Zvcm1TdGF0ZQorcHVibGljIGNsYXNzIFF1ZXVlZFN0YXJ0RWxlbWVudCBleHRlbmRzIFF1ZXVlZFNBWEV2ZW50CiB7CiAKICAgLyoqCkBAIC0xMjQsNyArMTI3LDcgQEAKICAgLyoqCiAgICAqIFRoZSBjdXJyZW50IGNvbnRleHQgbm9kZSBpbiB0aGUgc291cmNlIHRyZWUuCiAgICAqLwotICBwcml2YXRlIE5vZGUgbV9jdXJyZW50Tm9kZTsKKyAgcHJpdmF0ZSBpbnQgbV9jdXJyZW50Tm9kZTsKICAgCiAgIC8qKgogICAgKiBUaGUgeHNsOnRlbXBsYXRlIHRoYXQgaXMgaW4gZWZmZWN0LCB3aGljaCBtYXkgYmUgYSBtYXRjaGVkIHRlbXBsYXRlCkBAIC0xNDEsMTIgKzE0NCwxMiBAQAogICAgKiBUaGUgbm9kZSBpbiB0aGUgc291cmNlIHRyZWUgdGhhdCBtYXRjaGVkCiAgICAqIHRoZSB0ZW1wbGF0ZSBvYnRhaW5lZCB2aWEgZ2V0TWF0Y2hlZFRlbXBsYXRlKCkuCiAgICAqLwotICBwcml2YXRlIE5vZGUgbV9tYXRjaGVkTm9kZTsKKyAgcHJpdmF0ZSBpbnQgbV9tYXRjaGVkTm9kZTsKICAgCiAgIC8qKgogICAgKiBUaGUgY3VycmVudCBjb250ZXh0IG5vZGUgbGlzdC4KICAgICovCi0gIHByaXZhdGUgTm9kZUl0ZXJhdG9yIG1fY29udGV4dE5vZGVMaXN0OworICBwcml2YXRlIERUTUl0ZXJhdG9yIG1fY29udGV4dE5vZGVMaXN0OwogICAKICAgLyoqCiAgICAqIENsZWFyIHRoZSBwZW5kaW5nIGV2ZW50LgpAQCAtMTU4LDEwICsxNjEsMTAgQEAKICAgICBpZihtX2lzVHJhbnNmb3JtQ2xpZW50KQogICAgIHsKICAgICAgIG1fY3VycmVudEVsZW1lbnQgPSBudWxsOwotICAgICAgbV9jdXJyZW50Tm9kZSA9IG51bGw7CisgICAgICBtX2N1cnJlbnROb2RlID0gRFRNLk5VTEw7CiAgICAgICBtX2N1cnJlbnRUZW1wbGF0ZSA9IG51bGw7CiAgICAgICBtX21hdGNoZWRUZW1wbGF0ZSA9IG51bGw7Ci0gICAgICBtX21hdGNoZWROb2RlID0gbnVsbDsKKyAgICAgIG1fbWF0Y2hlZE5vZGUgPSBEVE0uTlVMTDsKICAgICAgIG1fY29udGV4dE5vZGVMaXN0ID0gbnVsbDsgLy8gVE9ETzogTmVlZCB0byBjbG9uZQogICAgIH0KICAgfQpAQCAtMTkwLDkgKzE5Myw5IEBACiAgICAgaWYobV9pc1RyYW5zZm9ybUNsaWVudCAmJiAobnVsbCAhPSBtX3RyYW5zZm9ybWVyKSkKICAgICB7CiAgICAgICBtX2N1cnJlbnRFbGVtZW50ID0gbV90cmFuc2Zvcm1lci5nZXRDdXJyZW50RWxlbWVudCgpOwotICAgICAgbV9jdXJyZW50Tm9kZSA9IG1fdHJhbnNmb3JtZXIuZ2V0Q3VycmVudE5vZGUoKTsKICAgICAgIG1fY3VycmVudFRlbXBsYXRlID0gbV90cmFuc2Zvcm1lci5nZXRDdXJyZW50VGVtcGxhdGUoKTsKICAgICAgIG1fbWF0Y2hlZFRlbXBsYXRlID0gbV90cmFuc2Zvcm1lci5nZXRNYXRjaGVkVGVtcGxhdGUoKTsKKyAgICAgIG1fY3VycmVudE5vZGUgPSBtX3RyYW5zZm9ybWVyLmdldEN1cnJlbnROb2RlKCk7CiAgICAgICBtX21hdGNoZWROb2RlID0gbV90cmFuc2Zvcm1lci5nZXRNYXRjaGVkTm9kZSgpOwogICAgICAgbV9jb250ZXh0Tm9kZUxpc3QgPSBtX3RyYW5zZm9ybWVyLmdldENvbnRleHROb2RlTGlzdCgpOyAvLyBUT0RPOiBOZWVkIHRvIGNsb25lCiAgICAgfQpAQCAtMzAxLDYgKzMwNCw3IEBACiAgICAqLwogICB2b2lkIHNldE5TRGVjbHNIYXZlQmVlbkFkZGVkKGJvb2xlYW4gYikKICAgeworICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigic2V0TlNEZWNsc0hhdmVCZWVuQWRkZWQ6ICIrYik7CiAgICAgbV9uc0RlY2xzSGF2ZUJlZW5BZGRlZCA9IGI7CiAgIH0KIApAQCAtMzkwLDkgKzM5NCw5IEBACiAgICAqCiAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgY29udGV4dCBub2RlIGluIHRoZSBzb3VyY2UgdHJlZS4KICAgICovCi0gIHB1YmxpYyBOb2RlIGdldEN1cnJlbnROb2RlKCkKKyAgcHVibGljIGludCBnZXRDdXJyZW50Tm9kZSgpCiAgIHsKLSAgICByZXR1cm4gbV9jdXJyZW50VGVtcGxhdGU7CisgICAgcmV0dXJuIG1fY3VycmVudE5vZGU7CiAgIH0KICAgCiAgIC8qKgpAQCAtNDM2LDcgKzQ0MCw3IEBACiAgICAqIEByZXR1cm4gdGhlIG5vZGUgaW4gdGhlIHNvdXJjZSB0cmVlIHRoYXQgbWF0Y2hlZAogICAgKiB0aGUgdGVtcGxhdGUgb2J0YWluZWQgdmlhIGdldE1hdGNoZWRUZW1wbGF0ZSgpLgogICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0TWF0Y2hlZE5vZGUoKQorICBwdWJsaWMgaW50IGdldE1hdGNoZWROb2RlKCkKICAgewogICAgIHJldHVybiBtX21hdGNoZWROb2RlOwogICB9CkBAIC00NDYsNyArNDUwLDcgQEAKICAgICoKICAgICogQHJldHVybiB0aGUgY3VycmVudCBjb250ZXh0IG5vZGUgbGlzdC4KICAgICovCi0gIHB1YmxpYyBOb2RlSXRlcmF0b3IgZ2V0Q29udGV4dE5vZGVMaXN0KCkKKyAgcHVibGljIERUTUl0ZXJhdG9yIGdldENvbnRleHROb2RlTGlzdCgpCiAgIHsKICAgICByZXR1cm4gbV9jb250ZXh0Tm9kZUxpc3Q7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1Jlc3VsdFRyZWVIYW5kbGVyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9SZXN1bHRUcmVlSGFuZGxlci5qYXZhCmluZGV4IDA1ZDJhODguLjlhZjk0OTYgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1Jlc3VsdFRyZWVIYW5kbGVyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvUmVzdWx0VHJlZUhhbmRsZXIuamF2YQpAQCAtNzMsMTIgKzczLDE1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworLy9pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNRmlsdGVyOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKIGltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKQEAgLTIzMSwxMCArMjM0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHFzZS5nZXRMb2NhbE5hbWUoKSk7CiAKICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0VHJlZUhhbmRsZXIjc3RhcnRFbGVtZW50OiAiICsgbnMgKyAiIyIgKyBsb2NhbE5hbWUpOwotICAgICAgaWYobnVsbCA9PSBucykKLSAgICAgIHsKLSAgICAgICAgKG5ldyBSdW50aW1lRXhjZXB0aW9uKGxvY2FsTmFtZSsiIGhhcyBhIG51bGwgbmFtZXNwYWNlISIpKS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KKy8vICAgICAgaWYobnVsbCA9PSBucykKKy8vICAgICAgeworLy8gICAgICAgIChuZXcgUnVudGltZUV4Y2VwdGlvbihsb2NhbE5hbWUrIiBoYXMgYSBudWxsIG5hbWVzcGFjZSEiKSkucHJpbnRTdGFja1RyYWNlKCk7CisvLyAgICAgIH0KICAgICB9CiAKICAgICBjaGVja0ZvclNlcmlhbGl6ZXJTd2l0Y2gobnMsIGxvY2FsTmFtZSk7CkBAIC0yNzUsNyArMjc4LDcgQEAKIAogICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHRUcmVlSGFuZGxlciNlbmRFbGVtZW50OiAiICsgbnMgKyAiIyIgKyBsb2NhbE5hbWUpOwogICAgIH0KLQorICAKICAgICBmbHVzaFBlbmRpbmcoRVZUX0VOREVMRU1FTlQpOwogICAgIG1fY29udGVudEhhbmRsZXIuZW5kRWxlbWVudChucywgbG9jYWxOYW1lLCBuYW1lKTsKIApAQCAtNzI1LDYgKzcyOCwyMyBAQAogICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgogICAgKi8KICAgcHVibGljIHZvaWQgc2tpcHBlZEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbnt9CisgIAorICAvKioKKyAgICogU2V0IHdoZXRoZXIgTmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBoYXZlIGJlZW4gYWRkZWQgdG8gCisgICAqIHRoaXMgZWxlbWVudAorICAgKgorICAgKgorICAgKiBAcGFyYW0gYiBGbGFnIGluZGljYXRpbmcgd2hldGhlciBOYW1lc3BhY2UgZGVjbGFyYXRpb25zIAorICAgKiBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcyBlbGVtZW50CisgICAqLworICBwdWJsaWMgdm9pZCBzZXROU0RlY2xzSGF2ZUJlZW5BZGRlZChib29sZWFuIGIpCisgIHsKKyAgICBRdWV1ZWRTdGFydEVsZW1lbnQgcWUgPSBnZXRRdWV1ZWRFbGVtKCk7CisgICAgaWYgKG51bGwgIT0gcWUpIAorICAgIHsKKyAgICAgIHFlLnNldE5TRGVjbHNIYXZlQmVlbkFkZGVkKGIpOworICAgIH0KKyAgfQogCiAgIC8qKgogICAgKiBGbHVzaCB0aGUgcGVuZGluZyBlbGVtZW50LgpAQCAtNzkxLDE1ICs4MTEsMTMgQEAKICAgcHVibGljIHZvaWQgb3V0cHV0UmVzdWx0VHJlZUZyYWdtZW50KFhPYmplY3Qgb2JqLCBYUGF0aENvbnRleHQgc3VwcG9ydCkKICAgICAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCiAgIHsKLQotICAgIERvY3VtZW50RnJhZ21lbnQgZG9jRnJhZyA9IG9iai5ydHJlZShzdXBwb3J0KTsKLSAgICBUcmVlV2Fsa2VyIHR3ID0gbmV3IFRyZWVXYWxrZXIodGhpcywgc3VwcG9ydC5nZXRET01IZWxwZXIoKSk7Ci0KLSAgICBOb2RlIG47Ci0gICAgZm9yIChuID0gZG9jRnJhZy5nZXRGaXJzdENoaWxkKCk7IG51bGwgIT0gbjsgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKSkKKyAgICBpbnQgZG9jID0gb2JqLnJ0cmVlKCk7CisgICAgRFRNIGR0bSA9IHN1cHBvcnQuZ2V0RFRNKGRvYyk7CisgIAorICAgIGZvciAoaW50IG4gPSBkdG0uZ2V0Rmlyc3RDaGlsZChkb2MpOyBEVE0uTlVMTCAhPSBuOyBuID0gZHRtLmdldE5leHRTaWJsaW5nKG4pKQogICAgIHsKICAgICAgIGZsdXNoUGVuZGluZyhFVlRfTk9ERSk7ICAvLyBJIHRoaW5rLgotICAgICAgdHcudHJhdmVyc2Uobik7CisgICAgICBkdG0uZGlzcGF0Y2hUb0V2ZW50cyhuLCB0aGlzKTsKICAgICB9CiAgIH0KIApAQCAtODExLDcgKzgyOSw3IEBACiAgICAqCiAgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgdm9pZCBjbG9uZVRvUmVzdWx0VHJlZShOb2RlIG5vZGUsIGJvb2xlYW4gc2hvdWxkQ2xvbmVBdHRyaWJ1dGVzKQorICBwdWJsaWMgdm9pZCBjbG9uZVRvUmVzdWx0VHJlZShpbnQgbm9kZSwgYm9vbGVhbiBzaG91bGRDbG9uZUF0dHJpYnV0ZXMpCiAgICAgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgogICB7CiAgICAgdHJ5CkBAIC04NDMsNyArODYxLDcgQEAKICAgICoKICAgICogQHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KICAgICovCi0gIHZvaWQgZW5zdXJlUHJlZml4SXNEZWNsYXJlZChTdHJpbmcgbnMsIFN0cmluZyByYXdOYW1lKSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHB1YmxpYyB2b2lkIGVuc3VyZVByZWZpeElzRGVjbGFyZWQoU3RyaW5nIG5zLCBTdHJpbmcgcmF3TmFtZSkgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgogICB7CiAKICAgICBpZiAobnMgIT0gbnVsbCAmJiBucy5sZW5ndGgoKSA+IDApCkBAIC04NTYsOCArODc0LDM5IEBACiAgICAgICB7CiAgICAgICAgIFN0cmluZyBmb3VuZFVSSSA9IG1fbnNTdXBwb3J0LmdldFVSSShwcmVmaXgpOwogCi0gICAgICAgIGlmICgobnVsbCA9PSBmb3VuZFVSSSkgfHwhZm91bmRVUkkuZXF1YWxzKG5zKSkKKyAgICAgICAgaWYgKChudWxsID09IGZvdW5kVVJJKSB8fCAhZm91bmRVUkkuZXF1YWxzKG5zKSkKKyAgICAgICAgeworICAgICAgICAgIAogICAgICAgICAgIHN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIG5zLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qKgorICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBtYWtlIHN1cmUgYSBnaXZlbiBwcmVmaXggaXMgcmVhbGx5CisgICAqIGRlY2xhcmVkLiAgSXQgbWlnaHQgbm90IGJlLCBiZWNhdXNlIGl0IG1heSBiZSBhbiBleGNsdWRlZCBwcmVmaXguCisgICAqIElmIGl0J3Mgbm90LCBpdCBzdGlsbCBuZWVkcyB0byBiZSBkZWNsYXJlZCBhdCB0aGlzIHBvaW50LgorICAgKiBUT0RPOiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYXQgYW4gZWFybGllciBzdGFnZSBpbiB0aGUgZ2FtZS4uLiAtc2IKKyAgICoKKyAgICogQHBhcmFtIG5zIE5hbWVzcGFjZSBVUkkgb2YgdGhlIGVsZW1lbnQgCisgICAqIEBwYXJhbSByYXdOYW1lIFJhdyBuYW1lIG9mIGVsZW1lbnQgKHdpdGggcHJlZml4KQorICAgKgorICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIHZvaWQgZW5zdXJlTmFtZXNwYWNlRGVjbERlY2xhcmVkKERUTSBkdG0sIGludCBuYW1lc3BhY2UpIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIFN0cmluZyB1cmkgPSBkdG0uZ2V0Tm9kZVZhbHVlKG5hbWVzcGFjZSk7CisgICAgU3RyaW5nIHByZWZpeCA9IGR0bS5nZXROb2RlTmFtZVgobmFtZXNwYWNlKTsKKworICAgIGlmICgodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCkgJiYgKG51bGwgIT0gcHJlZml4KSkKKyAgICB7CisgICAgICBTdHJpbmcgZm91bmRVUkkgPSBtX25zU3VwcG9ydC5nZXRVUkkocHJlZml4KTsKKworICAgICAgaWYgKChudWxsID09IGZvdW5kVVJJKSB8fCAhZm91bmRVUkkuZXF1YWxzKHVyaSkpCisgICAgICB7CisgICAgICAgIAorICAgICAgICBzdGFydFByZWZpeE1hcHBpbmcocHJlZml4LCB1cmksIGZhbHNlKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTkzNCw3ICs5ODMsNyBAQAogICAgKiBBZGQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBoYXZlIGJlZW4gZGVjbGFyZWQgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0LgogICAgKiAoU2VlbXMgbGlrZSBJIHNob3VsZG4ndCBoYXZlIHRvIGRvIHRoaXMuLi4pCiAgICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGROU0RlY2xzVG9BdHRycygpCisgIHB1YmxpYyB2b2lkIGFkZE5TRGVjbHNUb0F0dHJzKCkKICAgewogCiAgICAgRW51bWVyYXRpb24gcHJlZml4ZXMgPSBtX25zU3VwcG9ydC5nZXREZWNsYXJlZFByZWZpeGVzKCk7CkBAIC05NzQsNDMgKzEwMjMsMzkgQEAKICAgICoKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIHZvaWQgcHJvY2Vzc05TRGVjbHMoTm9kZSBzcmMpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorICBwdWJsaWMgdm9pZCBwcm9jZXNzTlNEZWNscyhpbnQgc3JjKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCiAgICAgdHJ5CiAgICAgewogICAgICAgaW50IHR5cGU7CisgICAgICBEVE0gZHRtID0gbV90cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKS5nZXREVE0oc3JjKTsKIAogICAgICAgLy8gVmVjdG9yIG5hbWVWYWx1ZXMgPSBudWxsOwogICAgICAgLy8gVmVjdG9yIGFscmVhZHlQcm9jZXNzZWRQcmVmaXhlcyA9IG51bGw7Ci0gICAgICBOb2RlIHBhcmVudDsKKyAgICAgIGludCBwYXJlbnQ7CiAKLSAgICAgIGlmICgoKHR5cGUgPSBzcmMuZ2V0Tm9kZVR5cGUoKSkgPT0gTm9kZS5FTEVNRU5UX05PREUgfHwgKHR5cGUgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpKQotICAgICAgICAgICYmIChwYXJlbnQgPSBzcmMuZ2V0UGFyZW50Tm9kZSgpKSAhPSBudWxsKQorICAgICAgaWYgKCgodHlwZSA9IGR0bS5nZXROb2RlVHlwZShzcmMpKSA9PSBEVE0uRUxFTUVOVF9OT0RFIHx8IAorICAgICAgICAgICAodHlwZSA9PSBEVE0uRU5USVRZX1JFRkVSRU5DRV9OT0RFKSkKKyAgICAgICAgICAmJiAocGFyZW50ID0gZHRtLmdldFBhcmVudChzcmMpKSAhPSBEVE0uTlVMTCkKICAgICAgIHsKICAgICAgICAgcHJvY2Vzc05TRGVjbHMocGFyZW50KTsKICAgICAgIH0KIAotICAgICAgaWYgKHR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpCisgICAgICBpZiAodHlwZSA9PSBEVE0uRUxFTUVOVF9OT0RFKQogICAgICAgewotICAgICAgICBOYW1lZE5vZGVNYXAgbm5tID0gc3JjLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgaW50IG5BdHRycyA9IG5ubS5nZXRMZW5ndGgoKTsKIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyczsgaSsrKQorICAgICAgICBmb3IgKGludCBuYW1lc3BhY2UgPSBkdG0uZ2V0Rmlyc3ROYW1lc3BhY2VOb2RlKHNyYywgdHJ1ZSk7CisgICAgICAgICAgICAgRFRNLk5VTEwgIT0gbmFtZXNwYWNlOyBuYW1lc3BhY2UgPSBkdG0uZ2V0TmV4dE5hbWVzcGFjZU5vZGUoc3JjLCBuYW1lc3BhY2UsIHRydWUpKQogICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBhdHRyID0gbm5tLml0ZW0oaSk7Ci0gICAgICAgICAgU3RyaW5nIGFuYW1lID0gYXR0ci5nZXROb2RlTmFtZSgpOworICAgICAgICAgIC8vIFN0cmluZyBwcmVmaXggPSBkdG0uZ2V0UHJlZml4KG5hbWVzcGFjZSk7CisgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGR0bS5nZXROb2RlTmFtZVgobmFtZXNwYWNlKTsKKyAgICAgICAgICBTdHJpbmcgZGVzdHVyaSA9IGdldFVSSShwcmVmaXgpOworICAgICAgICAgIFN0cmluZyBzcmNVUkkgPSBkdG0uZ2V0Tm9kZVZhbHVlKG5hbWVzcGFjZSk7CiAKLSAgICAgICAgICBpZiAoUU5hbWUuaXNYTUxOU0RlY2woYW5hbWUpKQorICAgICAgICAgIGlmICghc3JjVVJJLmVxdWFsc0lnbm9yZUNhc2UoZGVzdHVyaSkpCiAgICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IFFOYW1lLmdldFByZWZpeEZyb21YTUxOU0RlY2woYW5hbWUpOwotICAgICAgICAgICAgU3RyaW5nIGRlc3R1cmkgPSBnZXRVUkkocHJlZml4KTsKLSAgICAgICAgICAgIFN0cmluZyBzcmNVUkkgPSBhdHRyLmdldE5vZGVWYWx1ZSgpOwotCi0gICAgICAgICAgICBpZiAoIXNyY1VSSS5lcXVhbHNJZ25vcmVDYXNlKGRlc3R1cmkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0aGlzLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIHNyY1VSSSwgZmFsc2UpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5zdGFydFByZWZpeE1hcHBpbmcocHJlZml4LCBzcmNVUkksIGZhbHNlKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTEyNDMsMjQgKzEyODgsNDcgQEAKICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBuYW1lc3BhY2UgaXMgYWxyZWFkeSBkZWZpbmVkIGluIAogICAgKiBsaXN0IG9mIG5hbWVzcGFjZXMKICAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRGVmaW5lZE5TRGVjbChBdHRyIGF0dHIpCisgIHB1YmxpYyBib29sZWFuIGlzRGVmaW5lZE5TRGVjbChpbnQgYXR0cikKICAgewotCi0gICAgU3RyaW5nIHJhd05hbWUgPSBhdHRyLmdldE5vZGVOYW1lKCk7Ci0KLSAgICBpZiAocmF3TmFtZS5lcXVhbHMoInhtbG5zIikgfHwgcmF3TmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkKKyAgICBEVE0gZHRtID0gbV90cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKS5nZXREVE0oYXR0cik7CisgICAgaWYoRFRNLk5BTUVTUEFDRV9OT0RFID09IGR0bS5nZXROb2RlVHlwZShhdHRyKSkKICAgICB7Ci0gICAgICBpbnQgaW5kZXg7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gKGluZGV4ID0gcmF3TmFtZS5pbmRleE9mKCI6IikpIDwgMAotICAgICAgICAgICAgICAgICAgICAgID8gIiIgOiByYXdOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAvLyBTdHJpbmcgcHJlZml4ID0gZHRtLmdldFByZWZpeChhdHRyKTsKKyAgICAgIFN0cmluZyBwcmVmaXggPSBkdG0uZ2V0Tm9kZU5hbWVYKGF0dHIpOwogICAgICAgU3RyaW5nIHVyaSA9IGdldFVSSShwcmVmaXgpOwotCi0gICAgICBpZiAoKG51bGwgIT0gdXJpKSAmJiB1cmkuZXF1YWxzKGF0dHIuZ2V0VmFsdWUoKSkpCisgIAorICAgICAgaWYgKChudWxsICE9IHVyaSkgJiYgdXJpLmVxdWFscyhkdG0uZ2V0U3RyaW5nVmFsdWUoYXR0cikpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KKyAgCisgIC8qKgorICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuYW1lc3BhY2UgaXMgZGVmaW5lZCAKKyAgICoKKyAgICoKKyAgICogQHBhcmFtIGF0dHIgTmFtZXNwYWNlIGF0dHJpYnV0ZSBub2RlCisgICAqIEBwYXJhbSBkdG0gVGhlIERUTSB0aGF0IG93bnMgYXR0ci4KKyAgICoKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBuYW1lc3BhY2UgaXMgYWxyZWFkeSBkZWZpbmVkIGluIAorICAgKiBsaXN0IG9mIG5hbWVzcGFjZXMKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzRGVmaW5lZE5TRGVjbChpbnQgYXR0ciwgRFRNIGR0bSkKKyAgeworICAgIGlmKERUTS5OQU1FU1BBQ0VfTk9ERSA9PSBkdG0uZ2V0Tm9kZVR5cGUoYXR0cikpCisgICAgeworICAgICAgLy8gU3RyaW5nIHByZWZpeCA9IGR0bS5nZXRQcmVmaXgoYXR0cik7CisgICAgICBTdHJpbmcgcHJlZml4ID0gZHRtLmdldE5vZGVOYW1lWChhdHRyKTsKKyAgICAgIFN0cmluZyB1cmkgPSBnZXRVUkkocHJlZml4KTsKKyAgCisgICAgICBpZiAoKG51bGwgIT0gdXJpKSAmJiB1cmkuZXF1YWxzKGR0bS5nZXRTdHJpbmdWYWx1ZShhdHRyKSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAKICAgLyoqCiAgICAqIENvcHkgYW4gRE9NIGF0dHJpYnV0ZSB0byB0aGUgY3JlYXRlZCBvdXRwdXQgZWxlbWVudCwgZXhlY3V0aW5nCkBAIC0xMjcxLDIxICsxMzM5LDIxIEBACiAgICAqCiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShBdHRyIGF0dHIpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoaW50IGF0dHIpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CisgICAgRFRNIGR0bSA9IG1fdHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCkuZ2V0RFRNKGF0dHIpOwogCi0gICAgaWYgKGlzRGVmaW5lZE5TRGVjbChhdHRyKSkKKyAgICBpZiAoaXNEZWZpbmVkTlNEZWNsKGF0dHIsIGR0bSkpCiAgICAgICByZXR1cm47Ci0KLSAgICBET01IZWxwZXIgaGVscGVyID0gbV90cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKS5nZXRET01IZWxwZXIoKTsKICAgICAKLSAgICBTdHJpbmcgbnMgPSBoZWxwZXIuZ2V0TmFtZXNwYWNlT2ZOb2RlKGF0dHIpOworICAgIFN0cmluZyBucyA9IGR0bS5nZXROYW1lc3BhY2VVUkkoYXR0cik7CiAgICAgaWYobnMgPT0gbnVsbCkKICAgICAgIG5zID0gIiI7CiAKKyAgICAvLyAlT1BUJSAuLi5jYW4gSSBqdXN0IHN0b3JlIHRoZSBub2RlIGhhbmRsZT8gICAgCiAgICAgYWRkQXR0cmlidXRlKG5zLAotICAgICAgICAgICAgICAgICBoZWxwZXIuZ2V0TG9jYWxOYW1lT2ZOb2RlKGF0dHIpLCBhdHRyLmdldE5vZGVOYW1lKCksCi0gICAgICAgICAgICAgICAgICJDREFUQSIsIGF0dHIuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgIGR0bS5nZXRMb2NhbE5hbWUoYXR0ciksIGR0bS5nZXROb2RlTmFtZShhdHRyKSwKKyAgICAgICAgICAgICAgICAgIkNEQVRBIiwgZHRtLmdldE5vZGVWYWx1ZShhdHRyKSk7CiAgIH0gIC8vIGVuZCBjb3B5QXR0cmlidXRlVG9UYXJnZXQgbWV0aG9kCiAKICAgLyoqCkBAIC0xMjk1LDE2ICsxMzYzLDEzIEBACiAgICAqCiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZXMoTm9kZSBzcmMpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGVzKGludCBzcmMpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CisgICAgRFRNIGR0bSA9IG1fdHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCkuZ2V0RFRNKHNyYyk7CiAKLSAgICBOYW1lZE5vZGVNYXAgbm5tID0gc3JjLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgbkF0dHJzID0gbm5tLmdldExlbmd0aCgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cnM7IGkrKykKKyAgICBmb3IgKGludCBub2RlID0gZHRtLmdldEZpcnN0QXR0cmlidXRlKHNyYyk7IERUTS5OVUxMICE9IG5vZGU7IAorICAgICAgICAgbm9kZSA9IGR0bS5nZXROZXh0QXR0cmlidXRlKG5vZGUpKQogICAgIHsKLSAgICAgIEF0dHIgbm9kZSA9IChBdHRyKSBubm0uaXRlbShpKTsKLQogICAgICAgYWRkQXR0cmlidXRlKG5vZGUpOwogICAgIH0KICAgfQpAQCAtMTM0NywxMyArMTQxMiwxNSBAQAogICAgKgogICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGNvbnRleHQgbm9kZSBpbiB0aGUgc291cmNlIHRyZWUuCiAgICAqLwotICBwdWJsaWMgTm9kZSBnZXRDdXJyZW50Tm9kZSgpCisgIHB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldEN1cnJlbnROb2RlKCkKICAgewotICAgIFF1ZXVlZFN0YXJ0RWxlbWVudCBxZSA9IGdldFF1ZXVlZEVsZW0oKTsKLSAgICBpZihudWxsICE9IHFlICYmIHFlLmlzUGVuZGluZykKLSAgICAgIHJldHVybiBxZS5nZXRDdXJyZW50Tm9kZSgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBtX3RyYW5zZm9ybWVyLmdldEN1cnJlbnROb2RlKCk7CisgICAgLy8gJURUQkQlIE5lZWQgRFRNMkRPTSBzdHVmZgorICAgIHJldHVybiBudWxsOworLy8gICAgUXVldWVkU3RhcnRFbGVtZW50IHFlID0gZ2V0UXVldWVkRWxlbSgpOworLy8gICAgaWYobnVsbCAhPSBxZSAmJiBxZS5pc1BlbmRpbmcpCisvLyAgICAgIHJldHVybiBxZS5nZXRDdXJyZW50Tm9kZSgpOworLy8gICAgZWxzZQorLy8gICAgICByZXR1cm4gbV90cmFuc2Zvcm1lci5nZXRDdXJyZW50Tm9kZSgpOwogICB9CiAKICAgLyoqCkBAIC0xNDA1LDEzICsxNDcyLDE1IEBACiAgICAqIEByZXR1cm4gdGhlIG5vZGUgaW4gdGhlIHNvdXJjZSB0cmVlIHRoYXQgbWF0Y2hlZAogICAgKiB0aGUgdGVtcGxhdGUgb2J0YWluZWQgdmlhIGdldE1hdGNoZWRUZW1wbGF0ZSgpLgogICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0TWF0Y2hlZE5vZGUoKQorICBwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBnZXRNYXRjaGVkTm9kZSgpCiAgIHsKLSAgICBRdWV1ZWRTdGFydEVsZW1lbnQgcWUgPSBnZXRRdWV1ZWRFbGVtKCk7Ci0gICAgaWYobnVsbCAhPSBxZSAmJiBxZS5pc1BlbmRpbmcpCi0gICAgICByZXR1cm4gcWUuZ2V0TWF0Y2hlZE5vZGUoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbV90cmFuc2Zvcm1lci5nZXRNYXRjaGVkTm9kZSgpOworICAgIC8vICVEVEJEJSBOZWVkIERUTTJET00gc3R1ZmYKKyAgICByZXR1cm4gbnVsbDsKKy8vICAgIFF1ZXVlZFN0YXJ0RWxlbWVudCBxZSA9IGdldFF1ZXVlZEVsZW0oKTsKKy8vICAgIGlmKG51bGwgIT0gcWUgJiYgcWUuaXNQZW5kaW5nKQorLy8gICAgICByZXR1cm4gcWUuZ2V0TWF0Y2hlZE5vZGUoKTsKKy8vICAgIGVsc2UKKy8vICAgICAgcmV0dXJuIG1fdHJhbnNmb3JtZXIuZ2V0TWF0Y2hlZE5vZGUoKTsKICAgfQogCiAgIC8qKgpAQCAtMTQxOSwxMyArMTQ4OCwxNSBAQAogICAgKgogICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGNvbnRleHQgbm9kZSBsaXN0LgogICAgKi8KLSAgcHVibGljIE5vZGVJdGVyYXRvciBnZXRDb250ZXh0Tm9kZUxpc3QoKQorICBwdWJsaWMgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvciBnZXRDb250ZXh0Tm9kZUxpc3QoKQogICB7Ci0gICAgUXVldWVkU3RhcnRFbGVtZW50IHFlID0gZ2V0UXVldWVkRWxlbSgpOwotICAgIGlmKG51bGwgIT0gcWUgJiYgcWUuaXNQZW5kaW5nKQotICAgICAgcmV0dXJuIHFlLmdldENvbnRleHROb2RlTGlzdCgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBtX3RyYW5zZm9ybWVyLmdldENvbnRleHROb2RlTGlzdCgpOworICAgIC8vICVEVEJEJSBOZWVkIERUTTJET00gc3R1ZmYKKyAgICByZXR1cm4gbnVsbDsKKy8vICAgIFF1ZXVlZFN0YXJ0RWxlbWVudCBxZSA9IGdldFF1ZXVlZEVsZW0oKTsKKy8vICAgIGlmKG51bGwgIT0gcWUgJiYgcWUuaXNQZW5kaW5nKQorLy8gICAgICByZXR1cm4gcWUuZ2V0Q29udGV4dE5vZGVMaXN0KCk7CisvLyAgICBlbHNlCisvLyAgICAgIHJldHVybiBtX3RyYW5zZm9ybWVyLmdldENvbnRleHROb2RlTGlzdCgpOwogICB9CiAKICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9TdGFja0d1YXJkLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9TdGFja0d1YXJkLmphdmEKaW5kZXggNjg5ODlkZi4uYWUyNzk5YyAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvU3RhY2tHdWFyZC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1N0YWNrR3VhcmQuamF2YQpAQCAtNTYsOSArNTYsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CkBAIC0xMTksMTAgKzEyMCwxMCBAQAogICB9CiAKICAgLyoqIFN0eWxlc2hlZXQgVGVtcGxhdGUgbm9kZSAgICAgICAgICAqLwotICBOb2RlIG1feHNsUnVsZTsKKyAgRWxlbVRlbXBsYXRlRWxlbWVudCBtX3hzbFJ1bGU7CiAKICAgLyoqIFNvdXJjZSBub2RlICAgICAgICAgICovCi0gIE5vZGUgbV9zb3VyY2VYTUw7CisgIGludCBtX3NvdXJjZVhNTDsKIAogICAvKiogU3RhY2sgd2hlcmUgRWxlbVRlbXBhbHRlRWxlbWVudHMgd2lsbCBiZSBwdXNoZWQgICAgICAgICAgKi8KICAgamF2YS51dGlsLlN0YWNrIHN0YWNrID0gbmV3IGphdmEudXRpbC5TdGFjaygpOwpAQCAtMTQwLDcgKzE0MSw3IEBACiAgICAqIEBwYXJhbSB4c2xUZW1wbGF0ZSBDdXJyZW50IHRlbXBsYXRlIG5vZGUKICAgICogQHBhcmFtIHNvdXJjZVhNTCBTb3VyY2UgTm9kZQogICAgKi8KLSAgcHVibGljIFN0YWNrR3VhcmQoRWxlbVRlbXBsYXRlRWxlbWVudCB4c2xUZW1wbGF0ZSwgTm9kZSBzb3VyY2VYTUwpCisgIHB1YmxpYyBTdGFja0d1YXJkKEVsZW1UZW1wbGF0ZUVsZW1lbnQgeHNsVGVtcGxhdGUsIGludCBzb3VyY2VYTUwpCiAgIHsKICAgICBtX3hzbFJ1bGUgPSB4c2xUZW1wbGF0ZTsKICAgICBtX3NvdXJjZVhNTCA9IHNvdXJjZVhNTDsKQEAgLTE1OCw3ICsxNTksNyBAQAogICB7CiAKICAgICBpZiAoKChTdGFja0d1YXJkKSBvYmopLm1feHNsUnVsZS5lcXVhbHMobV94c2xSdWxlKQotICAgICAgICAgICAgJiYgKChTdGFja0d1YXJkKSBvYmopLm1fc291cmNlWE1MLmVxdWFscyhtX3NvdXJjZVhNTCkpCisgICAgICAgICAgICAmJiAoKFN0YWNrR3VhcmQpIG9iaikubV9zb3VyY2VYTUwgPT0gbV9zb3VyY2VYTUwpCiAgICAgewogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMTc2LDE4ICsxNzcsMTkgQEAKICAgewogCiAgICAgLy8gZm9yIHRoZSBtb21lbnQsIHRoZXNlIGRpYWdub3N0aWNzIGFyZSByZWFsbHkgYmFkLi4uCi0gICAgaWYgKG1fc291cmNlWE1MIGluc3RhbmNlb2YgVGV4dCkKLSAgICB7Ci0gICAgICBUZXh0IHR4ID0gKFRleHQpIG1fc291cmNlWE1MOwotCi0gICAgICBwdy5wcmludGxuKHR4LmdldERhdGEoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1fc291cmNlWE1MIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW0gPSAoRWxlbWVudCkgbV9zb3VyY2VYTUw7Ci0KLSAgICAgIHB3LnByaW50bG4oZWxlbS5nZXROb2RlTmFtZSgpKTsKLSAgICB9CisgICAgLy8gJURUQkQlIFdlIG5lZWQgYW4gZXhlY3V0aW9uIGNvbnRleHQuCisvLyAgICBpZiAobV9zb3VyY2VYTUwgaW5zdGFuY2VvZiBUZXh0KQorLy8gICAgeworLy8gICAgICBUZXh0IHR4ID0gKFRleHQpIG1fc291cmNlWE1MOworLy8KKy8vICAgICAgcHcucHJpbnRsbih0eC5nZXREYXRhKCkpOworLy8gICAgfQorLy8gICAgZWxzZSBpZiAobV9zb3VyY2VYTUwgaW5zdGFuY2VvZiBFbGVtZW50KQorLy8gICAgeworLy8gICAgICBFbGVtZW50IGVsZW0gPSAoRWxlbWVudCkgbV9zb3VyY2VYTUw7CisvLworLy8gICAgICBwdy5wcmludGxuKGVsZW0uZ2V0Tm9kZU5hbWUoKSk7CisvLyAgICB9CiAgIH0KIAogICAvKioKQEAgLTI0OSw3ICsyNTEsNyBAQAogICAgKgogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgdm9pZCBwdXNoKEVsZW1UZW1wbGF0ZUVsZW1lbnQgeHNsVGVtcGxhdGUsIE5vZGUgc291cmNlWE1MKQorICBwdWJsaWMgdm9pZCBwdXNoKEVsZW1UZW1wbGF0ZUVsZW1lbnQgeHNsVGVtcGxhdGUsIGludCBzb3VyY2VYTUwpCiAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvVHJBWEZpbHRlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvVHJBWEZpbHRlci5qYXZhCmluZGV4IDlhNGQzZmMuLjVkMmVmZWYgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1RyQVhGaWx0ZXIuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9UckFYRmlsdGVyLmphdmEKQEAgLTE3LDggKzE3LDYgQEAKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLkVycm9yTGlzdGVuZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnN0cmVlLlNvdXJjZVRyZWVIYW5kbGVyOwotCiBwdWJsaWMgY2xhc3MgVHJBWEZpbHRlciBleHRlbmRzIFhNTEZpbHRlckltcGwKIHsKICAgcHJpdmF0ZSBUZW1wbGF0ZXMgbV90ZW1wbGF0ZXM7CkBAIC0xNzEsOCArMTY5LDggQEAKICAgICB9CiAgICAgCiAgICAgQ29udGVudEhhbmRsZXIgY2ggPSBtX3RyYW5zZm9ybWVyLmdldElucHV0Q29udGVudEhhbmRsZXIoKTsKLSAgICBpZihjaCBpbnN0YW5jZW9mIFNvdXJjZVRyZWVIYW5kbGVyKQotICAgICAgKChTb3VyY2VUcmVlSGFuZGxlciljaCkuc2V0VXNlTXVsdGlUaHJlYWRpbmcodHJ1ZSk7CisvLyAgICBpZihjaCBpbnN0YW5jZW9mIFNvdXJjZVRyZWVIYW5kbGVyKQorLy8gICAgICAoKFNvdXJjZVRyZWVIYW5kbGVyKWNoKS5zZXRVc2VNdWx0aVRocmVhZGluZyh0cnVlKTsKICAgICBwLnNldENvbnRlbnRIYW5kbGVyKGNoKTsKIAogICAgIGlmKGNoIGluc3RhbmNlb2YgRW50aXR5UmVzb2x2ZXIpCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9UcmFuc2Zvcm1TbmFwc2hvdEltcGwuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1RyYW5zZm9ybVNuYXBzaG90SW1wbC5qYXZhCmluZGV4IGYyYTI4ODEuLjNlYTVkN2QgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1RyYW5zZm9ybVNuYXBzaG90SW1wbC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1RyYW5zZm9ybVNuYXBzaG90SW1wbC5qYXZhCkBAIC01Niw3ICs1NiwxNSBAQAogICAgKiBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlRyYW5zZm9ybVN0YXRlIGludGVyZmFjZSwgIAogICAgKiBzbyBhIHRvb2wgY2FuIGRpc2NvdmVyIHRoZSBtYXRjaGVkIHRlbXBsYXRlLCBhbmQgbWF0Y2hlZCAKICAgICogbm9kZS4gKi8KLSAgcHJpdmF0ZSBOb2RlVmVjdG9yIG1fY3VycmVudE1hdGNoVGVtcGxhdGVzID0gbmV3IE5vZGVWZWN0b3IoKTsKKyAgcHJpdmF0ZSBTdGFjayBtX2N1cnJlbnRNYXRjaFRlbXBsYXRlcyA9IG5ldyBTdGFjaygpOworCisgIC8qKiBBIG5vZGUgdmVjdG9yIHVzZWQgYXMgYSBzdGFjayB0byB0cmFjayB0aGUgY3VycmVudCAKKyAgICogRWxlbVRlbXBsYXRlIHRoYXQgd2FzIG1hdGNoZWQsIGFzIHdlbGwgYXMgdGhlIG5vZGUgdGhhdCAKKyAgICogd2FzIG1hdGNoZWQuICBOZWVkZWQgZm9yIHRoZSAKKyAgICogb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1TdGF0ZSBpbnRlcmZhY2UsICAKKyAgICogc28gYSB0b29sIGNhbiBkaXNjb3ZlciB0aGUgbWF0Y2hlZCB0ZW1wbGF0ZSwgYW5kIG1hdGNoZWQgCisgICAqIG5vZGUuICovCisgIHByaXZhdGUgTm9kZVZlY3RvciBtX2N1cnJlbnRNYXRjaE5vZGVzID0gbmV3IE5vZGVWZWN0b3IoKTsKIAogICAvKioKICAgICogVGhlIHRhYmxlIG9mIGNvdW50ZXJzIGZvciB4c2w6bnVtYmVyIHN1cHBvcnQuCkBAIC0xMjEsNyArMTI5LDggQEAKICAgCiAgICAgICBtX2N1cnJlbnRUZW1wbGF0ZVJ1bGVJc051bGwgPSAoQm9vbFN0YWNrKXRyYW5zZm9ybWVyLm1fY3VycmVudFRlbXBsYXRlUnVsZUlzTnVsbC5jbG9uZSgpOwogICAgICAgbV9jdXJyZW50VGVtcGxhdGVFbGVtZW50cyA9IChOb2RlVmVjdG9yKXRyYW5zZm9ybWVyLm1fY3VycmVudFRlbXBsYXRlRWxlbWVudHMuY2xvbmUoKTsKLSAgICAgIG1fY3VycmVudE1hdGNoVGVtcGxhdGVzID0gKE5vZGVWZWN0b3IpdHJhbnNmb3JtZXIubV9jdXJyZW50TWF0Y2hUZW1wbGF0ZXMuY2xvbmUoKTsKKyAgICAgIG1fY3VycmVudE1hdGNoVGVtcGxhdGVzID0gKFN0YWNrKXRyYW5zZm9ybWVyLm1fY3VycmVudE1hdGNoVGVtcGxhdGVzLmNsb25lKCk7CisgICAgICBtX2N1cnJlbnRNYXRjaE5vZGVzID0gKE5vZGVWZWN0b3IpdHJhbnNmb3JtZXIubV9jdXJyZW50TWF0Y2hlZE5vZGVzLmNsb25lKCk7CiAgICAgICBtX2NvdW50ZXJzVGFibGUgPSAoQ291bnRlcnNUYWJsZSl0cmFuc2Zvcm1lci5tX2NvdW50ZXJzVGFibGUuY2xvbmUoKTsKICAgICAgIG1fYXR0clNldFN0YWNrID0gKFN0YWNrKXRyYW5zZm9ybWVyLm1fYXR0clNldFN0YWNrLmNsb25lKCk7CiAgICAgfQpAQCAtMTY0LDggKzE3Myw5IEBACiAgICAgICB4cGMuc2V0QXhlc0l0ZXJhdG9yU3RhY2tTdGFja3MoKFN0YWNrKW1fYXhlc0l0ZXJhdG9yU3RhY2suY2xvbmUoKSk7CiAgIAogICAgICAgdHJhbnNmb3JtZXIubV9jdXJyZW50VGVtcGxhdGVSdWxlSXNOdWxsID0gKEJvb2xTdGFjayltX2N1cnJlbnRUZW1wbGF0ZVJ1bGVJc051bGwuY2xvbmUoKTsKLSAgICAgIHRyYW5zZm9ybWVyLm1fY3VycmVudFRlbXBsYXRlRWxlbWVudHMgPSAoTm9kZVZlY3RvciltX2N1cnJlbnRUZW1wbGF0ZUVsZW1lbnRzLmNsb25lKCk7Ci0gICAgICB0cmFuc2Zvcm1lci5tX2N1cnJlbnRNYXRjaFRlbXBsYXRlcyA9IChOb2RlVmVjdG9yKW1fY3VycmVudE1hdGNoVGVtcGxhdGVzLmNsb25lKCk7CisgICAgICB0cmFuc2Zvcm1lci5tX2N1cnJlbnRUZW1wbGF0ZUVsZW1lbnRzID0gKFN0YWNrKW1fY3VycmVudFRlbXBsYXRlRWxlbWVudHMuY2xvbmUoKTsKKyAgICAgIHRyYW5zZm9ybWVyLm1fY3VycmVudE1hdGNoVGVtcGxhdGVzID0gKFN0YWNrKW1fY3VycmVudE1hdGNoVGVtcGxhdGVzLmNsb25lKCk7CisgICAgICB0cmFuc2Zvcm1lci5tX2N1cnJlbnRNYXRjaGVkTm9kZXMgPSAoTm9kZVZlY3RvciltX2N1cnJlbnRNYXRjaE5vZGVzLmNsb25lKCk7CiAgICAgICB0cmFuc2Zvcm1lci5tX2NvdW50ZXJzVGFibGUgPSAoQ291bnRlcnNUYWJsZSltX2NvdW50ZXJzVGFibGUuY2xvbmUoKTsKICAgICAgIHRyYW5zZm9ybWVyLm1fYXR0clNldFN0YWNrID0gKFN0YWNrKW1fYXR0clNldFN0YWNrLmNsb25lKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvVHJhbnNmb3JtZXJIYW5kbGVySW1wbC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvVHJhbnNmb3JtZXJIYW5kbGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZjYyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9UcmFuc2Zvcm1lckhhbmRsZXJJbXBsLmphdmEKQEAgLTAsMCArMSw5OTggQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCisgKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTEZpbHRlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRFRESGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWFN0cmluZzsKKworLy8gaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5UcmFuc2Zvcm1lckhhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKKworaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTU1hbmFnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uQ29yb3V0aW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uQ29yb3V0aW5lU0FYUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5zYXgyZHRtLlNBWDJEVE07CisKKy8qKgorICogQSBUcmFuc2Zvcm1lckhhbmRsZXIKKyAqIGxpc3RlbnMgZm9yIFNBWCBDb250ZW50SGFuZGxlciBwYXJzZSBldmVudHMgYW5kIHRyYW5zZm9ybXMKKyAqIHRoZW0gdG8gYSBSZXN1bHQuCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc2Zvcm1lckhhbmRsZXJJbXBsCisgICAgICAgIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIsIERUREhhbmRsZXIsIENvbnRlbnRIYW5kbGVyLCBFcnJvckhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgTGV4aWNhbEhhbmRsZXIsIFRyYW5zZm9ybWVySGFuZGxlciwgRGVjbEhhbmRsZXIKK3sKKyAgCisgIHByaXZhdGUgYm9vbGVhbiBtX2luc2lkZVBhcnNlID0gZmFsc2U7CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gQ29uc3RydWN0b3JzLgorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgIC8qKgorICAgKiBDb25zdHJ1Y3QgYSBUcmFuc2Zvcm1lckhhbmRsZXJJbXBsLgorICAgKgorICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgTm9uLW51bGwgcmVmZXJlbmNlIHRvIHRoZSBYYWxhbiB0cmFuc2Zvcm1lciBpbXBsLgorICAgKiBAcGFyYW0gZG9GcmFnbWVudCBUcnVlIGlmIHRoZSByZXN1bHQgc2hvdWxkIGJlIGEgZG9jdW1lbnQgZnJhZ2VtZW50LgorICAgKiBAcGFyYW0gYmFzZVN5c3RlbUlEICBUaGUgc3lzdGVtIElEIHRvIHVzZSBhcyB0aGUgYmFzZSBmb3IgcmVsYXRpdmUgVVJMcy4KKyAgICovCisgIHB1YmxpYyBUcmFuc2Zvcm1lckhhbmRsZXJJbXBsKFRyYW5zZm9ybWVySW1wbCB0cmFuc2Zvcm1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb0ZyYWdtZW50LCBTdHJpbmcgYmFzZVN5c3RlbUlEKQorICB7CisKKyAgICBzdXBlcigpOworCisgICAgbV90cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOworICAgIG1fYmFzZVN5c3RlbUlEID0gYmFzZVN5c3RlbUlEOworCisgICAgWFBhdGhDb250ZXh0IHhjdHh0ID0gdHJhbnNmb3JtZXIuZ2V0WFBhdGhDb250ZXh0KCk7CisgICAgRFRNIGR0bSA9IHhjdHh0LmdldERUTShudWxsLCB0cnVlLCB0cmFuc2Zvcm1lciwgdHJ1ZSk7CisgICAgCisgICAgbV9kdG0gPSBkdG07CisgICAgZHRtLnNldERvY3VtZW50QmFzZVVSSShiYXNlU3lzdGVtSUQpOworCisgICAgbV9jb250ZW50SGFuZGxlciA9IGR0bS5nZXRDb250ZW50SGFuZGxlcigpOworICAgIG1fZHRkSGFuZGxlciA9IGR0bS5nZXREVERIYW5kbGVyKCk7CisgICAgbV9lbnRpdHlSZXNvbHZlciA9IGR0bS5nZXRFbnRpdHlSZXNvbHZlcigpOworICAgIG1fZXJyb3JIYW5kbGVyID0gZHRtLmdldEVycm9ySGFuZGxlcigpOworICAgIG1fbGV4aWNhbEhhbmRsZXIgPSBkdG0uZ2V0TGV4aWNhbEhhbmRsZXIoKTsKKyAgfQorICAKKyAgLyoqIAorICAgKiBEbyB3aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gc2h1dCBkb3duIHRoZSBDb1JvdXRpbmUgbWFuYWdlbWVudC4KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGNsZWFyQ29Sb3V0aW5lKCkKKyAgeworICAgIAorICAgIGlmKG1fZHRtIGluc3RhbmNlb2YgU0FYMkRUTSkKKyAgICB7CisgICAgICBpZihERUJVRykKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbiBjbGVhckNvUm91dGluZS4uLiIpOworICAgICAgU0FYMkRUTSBzYXgyZHRtID0gKChTQVgyRFRNKW1fZHRtKTsKKyAgICAgIGlmKG51bGwgIT0gbV9jb250ZW50SGFuZGxlciAKKyAgICAgICAgICYmIG1fY29udGVudEhhbmRsZXIgaW5zdGFuY2VvZiBDb3JvdXRpbmVTQVhQYXJzZXIpCisgICAgICB7CisgICAgICAgIENvcm91dGluZVNBWFBhcnNlciBzcCA9IChDb3JvdXRpbmVTQVhQYXJzZXIpbV9jb250ZW50SGFuZGxlcjsKKworICAgICAgICBpZihtX2luc2lkZVBhcnNlKQorICAgICAgICAgICAgc3AuZG9Nb3JlKGZhbHNlLCBzYXgyZHRtLmdldEFwcENvcm91dGluZUlEKCkpOyAgICAgIAorICAgICAgfQorICAgICAgCisgICAgICBzYXgyZHRtLmNsZWFyQ29Sb3V0aW5lKHRydWUpOworICAgICAgbV9jb250ZW50SGFuZGxlciA9IG51bGw7CisgICAgICBtX2R0ZEhhbmRsZXIgPSBudWxsOworICAgICAgbV9lbnRpdHlSZXNvbHZlciA9IG51bGw7CisgICAgICBtX2Vycm9ySGFuZGxlciA9IG51bGw7CisgICAgICBtX2xleGljYWxIYW5kbGVyID0gbnVsbDsKKyAgICAgIGlmKERFQlVHKQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi4uLmV4aXRpbmcgY2xlYXJDb1JvdXRpbmUiKTsKKyAgICB9CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBqYXZheC54bWwudHJhbnNmb3JtLnNheC5UcmFuc2Zvcm1lckhhbmRsZXIuCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgLyoqCisgICAqIEVuYWJsZXMgdGhlIHVzZXIgb2YgdGhlIFRyYW5zZm9ybWVySGFuZGxlciB0byBzZXQgdGhlCisgICAqIHRvIHNldCB0aGUgUmVzdWx0IGZvciB0aGUgdHJhbnNmb3JtYXRpb24uCisgICAqCisgICAqIEBwYXJhbSByZXN1bHQgQSBSZXN1bHQgaW5zdGFuY2UsIHNob3VsZCBub3QgYmUgbnVsbC4KKyAgICoKKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgcmVzdWx0IGlzIGludmFsaWQgZm9yIHNvbWUgcmVhc29uLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UmVzdWx0KFJlc3VsdCByZXN1bHQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgeworCisgICAgaWYgKG51bGwgPT0gcmVzdWx0KQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVzdWx0IHNob3VsZCBub3QgYmUgbnVsbCIpOworCisgICAgdHJ5CisgICAgeworICAgICAgQ29udGVudEhhbmRsZXIgaGFuZGxlciA9CisgICAgICAgIG1fdHJhbnNmb3JtZXIuY3JlYXRlUmVzdWx0Q29udGVudEhhbmRsZXIocmVzdWx0KTsKKworICAgICAgbV90cmFuc2Zvcm1lci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKKyAgICB9CisgICAgY2F0Y2ggKGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24gdGUpCisgICAgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVzdWx0IGNvdWxkIG5vdCBiZSBzZXQiKTsKKyAgICB9CisKKyAgICBtX3Jlc3VsdCA9IHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIGJhc2UgSUQgKFVSSSBvciBzeXN0ZW0gSUQpIGZyb20gd2hlcmUgcmVsYXRpdmUKKyAgICogVVJMcyB3aWxsIGJlIHJlc29sdmVkLgorICAgKiBAcGFyYW0gc3lzdGVtSUQgQmFzZSBVUkkgZm9yIHRoZSBzb3VyY2UgdHJlZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JRCkKKyAgeworICAgIG1fYmFzZVN5c3RlbUlEID0gc3lzdGVtSUQ7CisgICAgbV9kdG0uc2V0RG9jdW1lbnRCYXNlVVJJKHN5c3RlbUlEKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGJhc2UgSUQgKFVSSSBvciBzeXN0ZW0gSUQpIGZyb20gd2hlcmUgcmVsYXRpdmUKKyAgICogVVJMcyB3aWxsIGJlIHJlc29sdmVkLgorICAgKiBAcmV0dXJuIFRoZSBzeXN0ZW1JRCB0aGF0IHdhcyBzZXQgd2l0aCB7QGxpbmsgI3NldFN5c3RlbUlkfS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKQorICB7CisgICAgcmV0dXJuIG1fYmFzZVN5c3RlbUlEOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgVHJhbnNmb3JtZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGFuZGxlciwgd2hpY2gKKyAgICogaXMgbmVlZGVkIGluIG9yZGVyIHRvIHNldCBwYXJhbWV0ZXJzIGFuZCBvdXRwdXQgcHJvcGVydGllcy4KKyAgICoKKyAgICogQHJldHVybiBUaGUgVHJhbnNmb3JtZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGFuZGxlcgorICAgKi8KKyAgcHVibGljIFRyYW5zZm9ybWVyIGdldFRyYW5zZm9ybWVyKCkKKyAgeworICAgIHJldHVybiBtX3RyYW5zZm9ybWVyOworICB9CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gSW1wbGVtZW50YXRpb24gb2Ygb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIuCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgLyoqCisgICAqIEZpbHRlciBhbiBleHRlcm5hbCBlbnRpdHkgcmVzb2x1dGlvbi4KKyAgICoKKyAgICogQHBhcmFtIHB1YmxpY0lkIFRoZSBlbnRpdHkncyBwdWJsaWMgaWRlbnRpZmllciwgb3IgbnVsbC4KKyAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBlbnRpdHkncyBzeXN0ZW0gaWRlbnRpZmllci4KKyAgICogQHJldHVybiBBIG5ldyBJbnB1dFNvdXJjZSBvciBudWxsIGZvciB0aGUgZGVmYXVsdC4KKyAgICoKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBUaGUgY2xpZW50IG1heSB0aHJvdworICAgKiAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiBkdXJpbmcgcHJvY2Vzc2luZy4KKyAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIFRoZSBjbGllbnQgbWF5IHRocm93IGFuCisgICAqICAgICAgICAgICAgSS9PLXJlbGF0ZWQgZXhjZXB0aW9uIHdoaWxlIG9idGFpbmluZyB0aGUKKyAgICogICAgICAgICAgICBuZXcgSW5wdXRTb3VyY2UuCisgICAqIEBzZWUgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eQorICAgKi8KKyAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCisgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgeworCisgICAgaWYgKG1fZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkKKyAgICB7CisgICAgICByZXR1cm4gbV9lbnRpdHlSZXNvbHZlci5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCBzeXN0ZW1JZCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBvcmcueG1sLnNheC5EVERIYW5kbGVyLgorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgIC8qKgorICAgKiBGaWx0ZXIgYSBub3RhdGlvbiBkZWNsYXJhdGlvbiBldmVudC4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUgVGhlIG5vdGF0aW9uIG5hbWUuCisgICAqIEBwYXJhbSBwdWJsaWNJZCBUaGUgbm90YXRpb24ncyBwdWJsaWMgaWRlbnRpZmllciwgb3IgbnVsbC4KKyAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBub3RhdGlvbidzIHN5c3RlbSBpZGVudGlmaWVyLCBvciBudWxsLgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBUaGUgY2xpZW50IG1heSB0aHJvdworICAgKiAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiBkdXJpbmcgcHJvY2Vzc2luZy4KKyAgICogQHNlZSBvcmcueG1sLnNheC5EVERIYW5kbGVyI25vdGF0aW9uRGVjbAorICAgKi8KKyAgcHVibGljIHZvaWQgbm90YXRpb25EZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKKyAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChtX2R0ZEhhbmRsZXIgIT0gbnVsbCkKKyAgICB7CisgICAgICBtX2R0ZEhhbmRsZXIubm90YXRpb25EZWNsKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpbHRlciBhbiB1bnBhcnNlZCBlbnRpdHkgZGVjbGFyYXRpb24gZXZlbnQuCisgICAqCisgICAqIEBwYXJhbSBuYW1lIFRoZSBlbnRpdHkgbmFtZS4KKyAgICogQHBhcmFtIHB1YmxpY0lkIFRoZSBlbnRpdHkncyBwdWJsaWMgaWRlbnRpZmllciwgb3IgbnVsbC4KKyAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBlbnRpdHkncyBzeXN0ZW0gaWRlbnRpZmllciwgb3IgbnVsbC4KKyAgICogQHBhcmFtIG5vdGF0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBub3RhdGlvbi4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gVGhlIGNsaWVudCBtYXkgdGhyb3cKKyAgICogICAgICAgICAgICBhbiBleGNlcHRpb24gZHVyaW5nIHByb2Nlc3NpbmcuCisgICAqIEBzZWUgb3JnLnhtbC5zYXguRFRESGFuZGxlciN1bnBhcnNlZEVudGl0eURlY2wKKyAgICovCisgIHB1YmxpYyB2b2lkIHVucGFyc2VkRW50aXR5RGVjbCgKKyAgICAgICAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyBub3RhdGlvbk5hbWUpCisgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChtX2R0ZEhhbmRsZXIgIT0gbnVsbCkKKyAgICB7CisgICAgICBtX2R0ZEhhbmRsZXIudW5wYXJzZWRFbnRpdHlEZWNsKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbm90YXRpb25OYW1lKTsKKyAgICB9CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlci4KKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAvKioKKyAgICogRmlsdGVyIGEgbmV3IGRvY3VtZW50IGxvY2F0b3IgZXZlbnQuCisgICAqCisgICAqIEBwYXJhbSBsb2NhdG9yIFRoZSBkb2N1bWVudCBsb2NhdG9yLgorICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3NldERvY3VtZW50TG9jYXRvcgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikKKyAgeworCisgICAgaWYgKERFQlVHKQorICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2Zvcm1lckhhbmRsZXJJbXBsI3NldERvY3VtZW50TG9jYXRvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgbG9jYXRvci5nZXRTeXN0ZW1JZCgpKTsKKworICAgIHRoaXMubV9sb2NhdG9yID0gbG9jYXRvcjsKKyAgICAKKyAgICBpZihudWxsID09IG1fYmFzZVN5c3RlbUlEKQorICAgIHsKKyAgICAgIHNldFN5c3RlbUlkKGxvY2F0b3IuZ2V0U3lzdGVtSWQoKSk7CisgICAgfQorCisgICAgaWYgKG1fY29udGVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICB7CisgICAgICBtX2NvbnRlbnRIYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcihsb2NhdG9yKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmlsdGVyIGEgc3RhcnQgZG9jdW1lbnQgZXZlbnQuCisgICAqCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBjbGllbnQgbWF5IHRocm93CisgICAqICAgICAgICAgICAgYW4gZXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nLgorICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RG9jdW1lbnQKKyAgICovCisgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChERUJVRykKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJhbnNmb3JtZXJIYW5kbGVySW1wbCNzdGFydERvY3VtZW50Iik7CisgICAgICAKKyAgICBtX2luc2lkZVBhcnNlID0gdHJ1ZTsKKworICAgIFRocmVhZCBsaXN0ZW5lciA9IG5ldyBUaHJlYWQobV90cmFuc2Zvcm1lcik7CisKKyAgICBtX3RyYW5zZm9ybWVyLnNldFRyYW5zZm9ybVRocmVhZChsaXN0ZW5lcik7CisgICAgbGlzdGVuZXIuc2V0RGFlbW9uKGZhbHNlKTsKKyAgICBsaXN0ZW5lci5zdGFydCgpOworCisgICAgaWYgKG1fY29udGVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICB7CisgICAgICBtX2NvbnRlbnRIYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmlsdGVyIGFuIGVuZCBkb2N1bWVudCBldmVudC4KKyAgICoKKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gVGhlIGNsaWVudCBtYXkgdGhyb3cKKyAgICogICAgICAgICAgICBhbiBleGNlcHRpb24gZHVyaW5nIHByb2Nlc3NpbmcuCisgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjZW5kRG9jdW1lbnQKKyAgICovCisgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICBpZiAoREVCVUcpCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyYW5zZm9ybWVySGFuZGxlckltcGwjZW5kRG9jdW1lbnQiKTsKKworICAgIG1faW5zaWRlUGFyc2UgPSBmYWxzZTsKKyAgICAKKyAgICBpZiAobV9jb250ZW50SGFuZGxlciAhPSBudWxsKQorICAgIHsKKyAgICAgIG1fY29udGVudEhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKKyAgICB9CisgICAgCisgICAgVGhyZWFkIHRyYW5zZm9ybVRocmVhZCA9IG1fdHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtVGhyZWFkKCk7CisKKyAgICBpZiAobnVsbCAhPSB0cmFuc2Zvcm1UaHJlYWQpCisgICAgeworICAgICAgdHJ5CisgICAgICB7CisKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgd2FpdCB1bnRpbCB0aGUgdHJhbnNmb3JtVGhyZWFkIGlzIGNvbnNpZGVyZWQgbm90IGFsaXZlLgorICAgICAgICB0cmFuc2Zvcm1UaHJlYWQuam9pbigpOworCisgICAgICAgIGlmICghbV90cmFuc2Zvcm1lci5oYXNUcmFuc2Zvcm1UaHJlYWRFcnJvckNhdGNoZXIoKSkKKyAgICAgICAgeworICAgICAgICAgIEV4Y2VwdGlvbiBlID0gbV90cmFuc2Zvcm1lci5nZXRFeGNlcHRpb25UaHJvd24oKTsKKworICAgICAgICAgIGlmIChudWxsICE9IGUpCisgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgbV90cmFuc2Zvcm1lci5zZXRUcmFuc2Zvcm1UaHJlYWQobnVsbCk7CisgICAgICB9CisgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpe30KKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmlsdGVyIGEgc3RhcnQgTmFtZXNwYWNlIHByZWZpeCBtYXBwaW5nIGV2ZW50LgorICAgKgorICAgKiBAcGFyYW0gcHJlZml4IFRoZSBOYW1lc3BhY2UgcHJlZml4LgorICAgKiBAcGFyYW0gdXJpIFRoZSBOYW1lc3BhY2UgVVJJLgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBUaGUgY2xpZW50IG1heSB0aHJvdworICAgKiAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiBkdXJpbmcgcHJvY2Vzc2luZy4KKyAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydFByZWZpeE1hcHBpbmcKKyAgICovCisgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQorICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgaWYgKERFQlVHKQorICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2Zvcm1lckhhbmRsZXJJbXBsI3N0YXJ0UHJlZml4TWFwcGluZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJlZml4ICsgIiwgIiArIHVyaSk7CisKKyAgICBpZiAobV9jb250ZW50SGFuZGxlciAhPSBudWxsKQorICAgIHsKKyAgICAgIG1fY29udGVudEhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKHByZWZpeCwgdXJpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmlsdGVyIGFuIGVuZCBOYW1lc3BhY2UgcHJlZml4IG1hcHBpbmcgZXZlbnQuCisgICAqCisgICAqIEBwYXJhbSBwcmVmaXggVGhlIE5hbWVzcGFjZSBwcmVmaXguCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBjbGllbnQgbWF5IHRocm93CisgICAqICAgICAgICAgICAgYW4gZXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nLgorICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZFByZWZpeE1hcHBpbmcKKyAgICovCisgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICBpZiAoREVCVUcpCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyYW5zZm9ybWVySGFuZGxlckltcGwjZW5kUHJlZml4TWFwcGluZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJlZml4KTsKKworICAgIGlmIChtX2NvbnRlbnRIYW5kbGVyICE9IG51bGwpCisgICAgeworICAgICAgbV9jb250ZW50SGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKHByZWZpeCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpbHRlciBhIHN0YXJ0IGVsZW1lbnQgZXZlbnQuCisgICAqCisgICAqIEBwYXJhbSB1cmkgVGhlIGVsZW1lbnQncyBOYW1lc3BhY2UgVVJJLCBvciB0aGUgZW1wdHkgc3RyaW5nLgorICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBlbGVtZW50J3MgbG9jYWwgbmFtZSwgb3IgdGhlIGVtcHR5IHN0cmluZy4KKyAgICogQHBhcmFtIHFOYW1lIFRoZSBlbGVtZW50J3MgcXVhbGlmaWVkIChwcmVmaXhlZCkgbmFtZSwgb3IgdGhlIGVtcHR5CisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBhdHRzIFRoZSBlbGVtZW50J3MgYXR0cmlidXRlcy4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gVGhlIGNsaWVudCBtYXkgdGhyb3cKKyAgICogICAgICAgICAgICBhbiBleGNlcHRpb24gZHVyaW5nIHByb2Nlc3NpbmcuCisgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50CisgICAqLworICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoCisgICAgICAgICAgU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpCisgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChERUJVRykKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJhbnNmb3JtZXJIYW5kbGVySW1wbCNzdGFydEVsZW1lbnQ6ICIgKyBxTmFtZSk7CisKKyAgICBpZiAobV9jb250ZW50SGFuZGxlciAhPSBudWxsKQorICAgIHsKKyAgICAgIG1fY29udGVudEhhbmRsZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpbHRlciBhbiBlbmQgZWxlbWVudCBldmVudC4KKyAgICoKKyAgICogQHBhcmFtIHVyaSBUaGUgZWxlbWVudCdzIE5hbWVzcGFjZSBVUkksIG9yIHRoZSBlbXB0eSBzdHJpbmcuCisgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGVsZW1lbnQncyBsb2NhbCBuYW1lLCBvciB0aGUgZW1wdHkgc3RyaW5nLgorICAgKiBAcGFyYW0gcU5hbWUgVGhlIGVsZW1lbnQncyBxdWFsaWZpZWQgKHByZWZpeGVkKSBuYW1lLCBvciB0aGUgZW1wdHkKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gVGhlIGNsaWVudCBtYXkgdGhyb3cKKyAgICogICAgICAgICAgICBhbiBleGNlcHRpb24gZHVyaW5nIHByb2Nlc3NpbmcuCisgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjZW5kRWxlbWVudAorICAgKi8KKyAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCisgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICBpZiAoREVCVUcpCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyYW5zZm9ybWVySGFuZGxlckltcGwjZW5kRWxlbWVudDogIiArIHFOYW1lKTsKKworICAgIGlmIChtX2NvbnRlbnRIYW5kbGVyICE9IG51bGwpCisgICAgeworICAgICAgbV9jb250ZW50SGFuZGxlci5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpbHRlciBhIGNoYXJhY3RlciBkYXRhIGV2ZW50LgorICAgKgorICAgKiBAcGFyYW0gY2ggQW4gYXJyYXkgb2YgY2hhcmFjdGVycy4KKyAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydGluZyBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCisgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZSBmcm9tIHRoZSBhcnJheS4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gVGhlIGNsaWVudCBtYXkgdGhyb3cKKyAgICogICAgICAgICAgICBhbiBleGNlcHRpb24gZHVyaW5nIHByb2Nlc3NpbmcuCisgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjY2hhcmFjdGVycworICAgKi8KKyAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICBpZiAoREVCVUcpCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyYW5zZm9ybWVySGFuZGxlckltcGwjY2hhcmFjdGVyczogIiArIHN0YXJ0ICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgbGVuZ3RoKTsKKworICAgIGlmIChtX2NvbnRlbnRIYW5kbGVyICE9IG51bGwpCisgICAgeworICAgICAgbV9jb250ZW50SGFuZGxlci5jaGFyYWN0ZXJzKGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmlsdGVyIGFuIGlnbm9yYWJsZSB3aGl0ZXNwYWNlIGV2ZW50LgorICAgKgorICAgKiBAcGFyYW0gY2ggQW4gYXJyYXkgb2YgY2hhcmFjdGVycy4KKyAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydGluZyBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCisgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZSBmcm9tIHRoZSBhcnJheS4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gVGhlIGNsaWVudCBtYXkgdGhyb3cKKyAgICogICAgICAgICAgICBhbiBleGNlcHRpb24gZHVyaW5nIHByb2Nlc3NpbmcuCisgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjaWdub3JhYmxlV2hpdGVzcGFjZQorICAgKi8KKyAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZShjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkKKyAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChERUJVRykKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJhbnNmb3JtZXJIYW5kbGVySW1wbCNpZ25vcmFibGVXaGl0ZXNwYWNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGFydCArICIsICIgKyBsZW5ndGgpOworCisgICAgaWYgKG1fY29udGVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICB7CisgICAgICBtX2NvbnRlbnRIYW5kbGVyLmlnbm9yYWJsZVdoaXRlc3BhY2UoY2gsIHN0YXJ0LCBsZW5ndGgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBGaWx0ZXIgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGV2ZW50LgorICAgKgorICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldC4KKyAgICogQHBhcmFtIGRhdGEgVGhlIHRleHQgZm9sbG93aW5nIHRoZSB0YXJnZXQuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBjbGllbnQgbWF5IHRocm93CisgICAqICAgICAgICAgICAgYW4gZXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nLgorICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3Byb2Nlc3NpbmdJbnN0cnVjdGlvbgorICAgKi8KKyAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKQorICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgaWYgKERFQlVHKQorICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2Zvcm1lckhhbmRsZXJJbXBsI3Byb2Nlc3NpbmdJbnN0cnVjdGlvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFyZ2V0ICsgIiwgIiArIGRhdGEpOworCisgICAgaWYgKG1fY29udGVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICB7CisgICAgICBtX2NvbnRlbnRIYW5kbGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBGaWx0ZXIgYSBza2lwcGVkIGVudGl0eSBldmVudC4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHNraXBwZWQgZW50aXR5LgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBUaGUgY2xpZW50IG1heSB0aHJvdworICAgKiAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiBkdXJpbmcgcHJvY2Vzc2luZy4KKyAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNza2lwcGVkRW50aXR5CisgICAqLworICBwdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChERUJVRykKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJhbnNmb3JtZXJIYW5kbGVySW1wbCNza2lwcGVkRW50aXR5OiAiICsgbmFtZSk7CisKKyAgICBpZiAobV9jb250ZW50SGFuZGxlciAhPSBudWxsKQorICAgIHsKKyAgICAgIG1fY29udGVudEhhbmRsZXIuc2tpcHBlZEVudGl0eShuYW1lKTsKKyAgICB9CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIuCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgLyoqCisgICAqIEZpbHRlciBhIHdhcm5pbmcgZXZlbnQuCisgICAqCisgICAqIEBwYXJhbSBlIFRoZSBud2FybmluZyBhcyBhbiBleGNlcHRpb24uCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBjbGllbnQgbWF5IHRocm93CisgICAqICAgICAgICAgICAgYW4gZXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nLgorICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nCisgICAqLworICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgaWYgKERFQlVHKQorICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2Zvcm1lckhhbmRsZXJJbXBsI3dhcm5pbmc6ICIgKyBlKTsKKworICAgIGlmIChtX2Vycm9ySGFuZGxlciAhPSBudWxsKQorICAgIHsKKyAgICAgIG1fZXJyb3JIYW5kbGVyLndhcm5pbmcoZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpbHRlciBhbiBlcnJvciBldmVudC4KKyAgICoKKyAgICogQHBhcmFtIGUgVGhlIGVycm9yIGFzIGFuIGV4Y2VwdGlvbi4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gVGhlIGNsaWVudCBtYXkgdGhyb3cKKyAgICogICAgICAgICAgICBhbiBleGNlcHRpb24gZHVyaW5nIHByb2Nlc3NpbmcuCisgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yCisgICAqLworICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChERUJVRykKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJhbnNmb3JtZXJIYW5kbGVySW1wbCNlcnJvcjogIiArIGUpOworCisgICAgaWYgKG1fZXJyb3JIYW5kbGVyICE9IG51bGwpCisgICAgeworICAgICAgbV9lcnJvckhhbmRsZXIuZXJyb3IoZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpbHRlciBhIGZhdGFsIGVycm9yIGV2ZW50LgorICAgKgorICAgKiBAcGFyYW0gZSBUaGUgZXJyb3IgYXMgYW4gZXhjZXB0aW9uLgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBUaGUgY2xpZW50IG1heSB0aHJvdworICAgKiAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiBkdXJpbmcgcHJvY2Vzc2luZy4KKyAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcgorICAgKi8KKyAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChERUJVRykKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJhbnNmb3JtZXJIYW5kbGVySW1wbCNmYXRhbEVycm9yOiAiICsgZSk7CisKKyAgICBpZiAobV9lcnJvckhhbmRsZXIgIT0gbnVsbCkKKyAgICB7CisgICAgICBtX2Vycm9ySGFuZGxlci5mYXRhbEVycm9yKGUpOworICAgIH0KKyAgfQorCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vIEltcGxlbWVudGF0aW9uIG9mIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlci4KKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAvKioKKyAgICogUmVwb3J0IHRoZSBzdGFydCBvZiBEVEQgZGVjbGFyYXRpb25zLCBpZiBhbnkuCisgICAqCisgICAqIDxwPkFueSBkZWNsYXJhdGlvbnMgYXJlIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGludGVybmFsIHN1YnNldAorICAgKiB1bmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBieSBhIHtAbGluayAjc3RhcnRFbnRpdHkgc3RhcnRFbnRpdHl9CisgICAqIGV2ZW50LjwvcD4KKyAgICoKKyAgICogPHA+Tm90ZSB0aGF0IHRoZSBzdGFydC9lbmREVEQgZXZlbnRzIHdpbGwgYXBwZWFyIHdpdGhpbgorICAgKiB0aGUgc3RhcnQvZW5kRG9jdW1lbnQgZXZlbnRzIGZyb20gQ29udGVudEhhbmRsZXIgYW5kCisgICAqIGJlZm9yZSB0aGUgZmlyc3Qgc3RhcnRFbGVtZW50IGV2ZW50LjwvcD4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUgVGhlIGRvY3VtZW50IHR5cGUgbmFtZS4KKyAgICogQHBhcmFtIHB1YmxpY0lkIFRoZSBkZWNsYXJlZCBwdWJsaWMgaWRlbnRpZmllciBmb3IgdGhlCisgICAqICAgICAgICBleHRlcm5hbCBEVEQgc3Vic2V0LCBvciBudWxsIGlmIG5vbmUgd2FzIGRlY2xhcmVkLgorICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIGRlY2xhcmVkIHN5c3RlbSBpZGVudGlmaWVyIGZvciB0aGUKKyAgICogICAgICAgIGV4dGVybmFsIERURCBzdWJzZXQsIG9yIG51bGwgaWYgbm9uZSB3YXMgZGVjbGFyZWQuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4KKyAgICogICAgICAgICAgICBleGNlcHRpb24uCisgICAqIEBzZWUgI2VuZERURAorICAgKiBAc2VlICNzdGFydEVudGl0eQorICAgKi8KKyAgcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQorICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgaWYgKERFQlVHKQorICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2Zvcm1lckhhbmRsZXJJbXBsI3N0YXJ0RFREOiAiICsgbmFtZSArICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY0lkICsgIiwgIiArIHN5c3RlbUlkKTsKKworICAgIGlmIChudWxsICE9IG1fbGV4aWNhbEhhbmRsZXIpCisgICAgeworICAgICAgbV9sZXhpY2FsSGFuZGxlci5zdGFydERURChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXBvcnQgdGhlIGVuZCBvZiBEVEQgZGVjbGFyYXRpb25zLgorICAgKgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICogQHNlZSAjc3RhcnREVEQKKyAgICovCisgIHB1YmxpYyB2b2lkIGVuZERURCgpIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgaWYgKERFQlVHKQorICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2Zvcm1lckhhbmRsZXJJbXBsI2VuZERURCIpOworCisgICAgaWYgKG51bGwgIT0gbV9sZXhpY2FsSGFuZGxlcikKKyAgICB7CisgICAgICBtX2xleGljYWxIYW5kbGVyLmVuZERURCgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXBvcnQgdGhlIGJlZ2lubmluZyBvZiBhbiBlbnRpdHkgaW4gY29udGVudC4KKyAgICoKKyAgICogPHA+PHN0cm9uZz5OT1RFOjwvZW50aXR5PiBlbnRpdHkgcmVmZXJlbmNlcyBpbiBhdHRyaWJ1dGUKKyAgICogdmFsdWVzIC0tIGFuZCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZG9jdW1lbnQgZW50aXR5IC0tCisgICAqIGFyZSBuZXZlciByZXBvcnRlZC48L3A+CisgICAqCisgICAqIDxwPlRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0IGFyZSByZXBvcnRlZAorICAgKiB1c2luZyB0aGUgcHNldWRvLW5hbWUgIltkdGRdIi4gIEFsbCBvdGhlciBldmVudHMgbXVzdCBiZQorICAgKiBwcm9wZXJseSBuZXN0ZWQgd2l0aGluIHN0YXJ0L2VuZCBlbnRpdHkgZXZlbnRzLjwvcD4KKyAgICoKKyAgICogPHA+Tm90ZSB0aGF0IHNraXBwZWQgZW50aXRpZXMgd2lsbCBiZSByZXBvcnRlZCB0aHJvdWdoIHRoZQorICAgKiB7QGxpbmsgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc2tpcHBlZEVudGl0eSBza2lwcGVkRW50aXR5fQorICAgKiBldmVudCwgd2hpY2ggaXMgcGFydCBvZiB0aGUgQ29udGVudEhhbmRsZXIgaW50ZXJmYWNlLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVudGl0eS4gIElmIGl0IGlzIGEgcGFyYW1ldGVyCisgICAqICAgICAgICBlbnRpdHksIHRoZSBuYW1lIHdpbGwgYmVnaW4gd2l0aCAnJScuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgKiBAc2VlICNlbmRFbnRpdHkKKyAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjaW50ZXJuYWxFbnRpdHlEZWNsCisgICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2V4dGVybmFsRW50aXR5RGVjbAorICAgKi8KKyAgcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgaWYgKERFQlVHKQorICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2Zvcm1lckhhbmRsZXJJbXBsI3N0YXJ0RW50aXR5OiAiICsgbmFtZSk7CisKKyAgICBpZiAobnVsbCAhPSBtX2xleGljYWxIYW5kbGVyKQorICAgIHsKKyAgICAgIG1fbGV4aWNhbEhhbmRsZXIuc3RhcnRFbnRpdHkobmFtZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlcG9ydCB0aGUgZW5kIG9mIGFuIGVudGl0eS4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGVuZGluZy4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCisgICAqIEBzZWUgI3N0YXJ0RW50aXR5CisgICAqLworICBwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgaWYgKERFQlVHKQorICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2Zvcm1lckhhbmRsZXJJbXBsI2VuZEVudGl0eTogIiArIG5hbWUpOworCisgICAgaWYgKG51bGwgIT0gbV9sZXhpY2FsSGFuZGxlcikKKyAgICB7CisgICAgICBtX2xleGljYWxIYW5kbGVyLmVuZEVudGl0eShuYW1lKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVwb3J0IHRoZSBzdGFydCBvZiBhIENEQVRBIHNlY3Rpb24uCisgICAqCisgICAqIDxwPlRoZSBjb250ZW50cyBvZiB0aGUgQ0RBVEEgc2VjdGlvbiB3aWxsIGJlIHJlcG9ydGVkIHRocm91Z2gKKyAgICogdGhlIHJlZ3VsYXIge0BsaW5rIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2NoYXJhY3RlcnMKKyAgICogY2hhcmFjdGVyc30gZXZlbnQuPC9wPgorICAgKgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICogQHNlZSAjZW5kQ0RBVEEKKyAgICovCisgIHB1YmxpYyB2b2lkIHN0YXJ0Q0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChERUJVRykKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJhbnNmb3JtZXJIYW5kbGVySW1wbCNzdGFydENEQVRBIik7CisKKyAgICBpZiAobnVsbCAhPSBtX2xleGljYWxIYW5kbGVyKQorICAgIHsKKyAgICAgIG1fbGV4aWNhbEhhbmRsZXIuc3RhcnRDREFUQSgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXBvcnQgdGhlIGVuZCBvZiBhIENEQVRBIHNlY3Rpb24uCisgICAqCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgKiBAc2VlICNzdGFydENEQVRBCisgICAqLworICBwdWJsaWMgdm9pZCBlbmRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgaWYgKERFQlVHKQorICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2Zvcm1lckhhbmRsZXJJbXBsI2VuZENEQVRBIik7CisKKyAgICBpZiAobnVsbCAhPSBtX2xleGljYWxIYW5kbGVyKQorICAgIHsKKyAgICAgIG1fbGV4aWNhbEhhbmRsZXIuZW5kQ0RBVEEoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVwb3J0IGFuIFhNTCBjb21tZW50IGFueXdoZXJlIGluIHRoZSBkb2N1bWVudC4KKyAgICoKKyAgICogPHA+VGhpcyBjYWxsYmFjayB3aWxsIGJlIHVzZWQgZm9yIGNvbW1lbnRzIGluc2lkZSBvciBvdXRzaWRlIHRoZQorICAgKiBkb2N1bWVudCBlbGVtZW50LCBpbmNsdWRpbmcgY29tbWVudHMgaW4gdGhlIGV4dGVybmFsIERURAorICAgKiBzdWJzZXQgKGlmIHJlYWQpLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIGNoIEFuIGFycmF5IGhvbGRpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGNvbW1lbnQuCisgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnRpbmcgcG9zaXRpb24gaW4gdGhlIGFycmF5LgorICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UgZnJvbSB0aGUgYXJyYXkuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgKi8KKyAgcHVibGljIHZvaWQgY29tbWVudChjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICBpZiAoREVCVUcpCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyYW5zZm9ybWVySGFuZGxlckltcGwjY29tbWVudDogIiArIHN0YXJ0ICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgbGVuZ3RoKTsKKworICAgIGlmIChudWxsICE9IG1fbGV4aWNhbEhhbmRsZXIpCisgICAgeworICAgICAgbV9sZXhpY2FsSGFuZGxlci5jb21tZW50KGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICB9CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIuCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgLyoqCisgICAqIFJlcG9ydCBhbiBlbGVtZW50IHR5cGUgZGVjbGFyYXRpb24uCisgICAqCisgICAqIDxwPlRoZSBjb250ZW50IG1vZGVsIHdpbGwgY29uc2lzdCBvZiB0aGUgc3RyaW5nICJFTVBUWSIsIHRoZQorICAgKiBzdHJpbmcgIkFOWSIsIG9yIGEgcGFyZW50aGVzaXNlZCBncm91cCwgb3B0aW9uYWxseSBmb2xsb3dlZAorICAgKiBieSBhbiBvY2N1cnJlbmNlIGluZGljYXRvci4gIFRoZSBtb2RlbCB3aWxsIGJlIG5vcm1hbGl6ZWQgc28KKyAgICogdGhhdCBhbGwgd2hpdGVzcGFjZSBpcyByZW1vdmVkLGFuZCB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZworICAgKiBwYXJlbnRoZXNlcy48L3A+CisgICAqCisgICAqIEBwYXJhbSBuYW1lIFRoZSBlbGVtZW50IHR5cGUgbmFtZS4KKyAgICogQHBhcmFtIG1vZGVsIFRoZSBjb250ZW50IG1vZGVsIGFzIGEgbm9ybWFsaXplZCBzdHJpbmcuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgKi8KKyAgcHVibGljIHZvaWQgZWxlbWVudERlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBtb2RlbCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICBpZiAoREVCVUcpCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyYW5zZm9ybWVySGFuZGxlckltcGwjZWxlbWVudERlY2w6ICIgKyBuYW1lICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgbW9kZWwpOworCisgICAgaWYgKG51bGwgIT0gbV9kZWNsSGFuZGxlcikKKyAgICB7CisgICAgICBtX2RlY2xIYW5kbGVyLmVsZW1lbnREZWNsKG5hbWUsIG1vZGVsKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVwb3J0IGFuIGF0dHJpYnV0ZSB0eXBlIGRlY2xhcmF0aW9uLgorICAgKgorICAgKiA8cD5Pbmx5IHRoZSBlZmZlY3RpdmUgKGZpcnN0KSBkZWNsYXJhdGlvbiBmb3IgYW4gYXR0cmlidXRlIHdpbGwKKyAgICogYmUgcmVwb3J0ZWQuICBUaGUgdHlwZSB3aWxsIGJlIG9uZSBvZiB0aGUgc3RyaW5ncyAiQ0RBVEEiLAorICAgKiAiSUQiLCAiSURSRUYiLCAiSURSRUZTIiwgIk5NVE9LRU4iLCAiTk1UT0tFTlMiLCAiRU5USVRZIiwKKyAgICogIkVOVElUSUVTIiwgb3IgIk5PVEFUSU9OIiwgb3IgYSBwYXJlbnRoZXNpemVkIHRva2VuIGdyb3VwIHdpdGgKKyAgICogdGhlIHNlcGFyYXRvciAifCIgYW5kIGFsbCB3aGl0ZXNwYWNlIHJlbW92ZWQuPC9wPgorICAgKgorICAgKiBAcGFyYW0gZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgZWxlbWVudC4KKyAgICogQHBhcmFtIGFOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAqIEBwYXJhbSB0eXBlIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlIHR5cGUuCisgICAqIEBwYXJhbSB2YWx1ZURlZmF1bHQgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGUgZGVmYXVsdAorICAgKiAgICAgICAgKCIjSU1QTElFRCIsICIjUkVRVUlSRUQiLCBvciAiI0ZJWEVEIikgb3IgbnVsbCBpZgorICAgKiAgICAgICAgbm9uZSBvZiB0aGVzZSBhcHBsaWVzLgorICAgKiBAcGFyYW0gdmFsdWUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGUncyBkZWZhdWx0IHZhbHVlLAorICAgKiAgICAgICAgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICovCisgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZURlY2woCisgICAgICAgICAgU3RyaW5nIGVOYW1lLCBTdHJpbmcgYU5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWVEZWZhdWx0LCBTdHJpbmcgdmFsdWUpCisgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChERUJVRykKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJhbnNmb3JtZXJIYW5kbGVySW1wbCNhdHRyaWJ1dGVEZWNsOiAiICsgZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICArICIsICIgKyBhTmFtZSArICIsIGV0Yy4uLiIpOworCisgICAgaWYgKG51bGwgIT0gbV9kZWNsSGFuZGxlcikKKyAgICB7CisgICAgICBtX2RlY2xIYW5kbGVyLmF0dHJpYnV0ZURlY2woZU5hbWUsIGFOYW1lLCB0eXBlLCB2YWx1ZURlZmF1bHQsIHZhbHVlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVwb3J0IGFuIGludGVybmFsIGVudGl0eSBkZWNsYXJhdGlvbi4KKyAgICoKKyAgICogPHA+T25seSB0aGUgZWZmZWN0aXZlIChmaXJzdCkgZGVjbGFyYXRpb24gZm9yIGVhY2ggZW50aXR5CisgICAqIHdpbGwgYmUgcmVwb3J0ZWQuPC9wPgorICAgKgorICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZW50aXR5LiAgSWYgaXQgaXMgYSBwYXJhbWV0ZXIKKyAgICogICAgICAgIGVudGl0eSwgdGhlIG5hbWUgd2lsbCBiZWdpbiB3aXRoICclJy4KKyAgICogQHBhcmFtIHZhbHVlIFRoZSByZXBsYWNlbWVudCB0ZXh0IG9mIHRoZSBlbnRpdHkuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgKiBAc2VlICNleHRlcm5hbEVudGl0eURlY2wKKyAgICogQHNlZSBvcmcueG1sLnNheC5EVERIYW5kbGVyI3VucGFyc2VkRW50aXR5RGVjbAorICAgKi8KKyAgcHVibGljIHZvaWQgaW50ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCisgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICBpZiAoREVCVUcpCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyYW5zZm9ybWVySGFuZGxlckltcGwjaW50ZXJuYWxFbnRpdHlEZWNsOiAiICsgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgIiArIHZhbHVlKTsKKworICAgIGlmIChudWxsICE9IG1fZGVjbEhhbmRsZXIpCisgICAgeworICAgICAgbV9kZWNsSGFuZGxlci5pbnRlcm5hbEVudGl0eURlY2wobmFtZSwgdmFsdWUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXBvcnQgYSBwYXJzZWQgZXh0ZXJuYWwgZW50aXR5IGRlY2xhcmF0aW9uLgorICAgKgorICAgKiA8cD5Pbmx5IHRoZSBlZmZlY3RpdmUgKGZpcnN0KSBkZWNsYXJhdGlvbiBmb3IgZWFjaCBlbnRpdHkKKyAgICogd2lsbCBiZSByZXBvcnRlZC48L3A+CisgICAqCisgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkuICBJZiBpdCBpcyBhIHBhcmFtZXRlcgorICAgKiAgICAgICAgZW50aXR5LCB0aGUgbmFtZSB3aWxsIGJlZ2luIHdpdGggJyUnLgorICAgKiBAcGFyYW0gcHVibGljSWQgVGhlIGRlY2xhcmVkIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBlbnRpdHksIG9yCisgICAqICAgICAgICBudWxsIGlmIG5vbmUgd2FzIGRlY2xhcmVkLgorICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIGRlY2xhcmVkIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBlbnRpdHkuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgKiBAc2VlICNpbnRlcm5hbEVudGl0eURlY2wKKyAgICogQHNlZSBvcmcueG1sLnNheC5EVERIYW5kbGVyI3VucGFyc2VkRW50aXR5RGVjbAorICAgKi8KKyAgcHVibGljIHZvaWQgZXh0ZXJuYWxFbnRpdHlEZWNsKAorICAgICAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICBpZiAoREVCVUcpCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyYW5zZm9ybWVySGFuZGxlckltcGwjZXh0ZXJuYWxFbnRpdHlEZWNsOiAiICsgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgIiArIHB1YmxpY0lkICsgIiwgIiArIHN5c3RlbUlkKTsKKworICAgIGlmIChudWxsICE9IG1fZGVjbEhhbmRsZXIpCisgICAgeworICAgICAgbV9kZWNsSGFuZGxlci5leHRlcm5hbEVudGl0eURlY2wobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKKyAgICB9CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBJbnRlcm5hbCBzdGF0ZS4KKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAvKiogU2V0IHRvIHRydWUgZm9yIGRpYWdub3N0aWNzIG91dHB1dC4gICAgICAgICAqLworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgLyoqCisgICAqIFRoZSB0cmFuc2Zvcm1lciB0aGlzIHdpbGwgdXNlIHRvIHRyYW5zZm9ybSBhCisgICAqIHNvdXJjZSB0cmVlIGludG8gYSByZXN1bHQgdHJlZS4KKyAgICovCisgIHByaXZhdGUgVHJhbnNmb3JtZXJJbXBsIG1fdHJhbnNmb3JtZXI7CisKKyAgLyoqIFRoZSBzeXN0ZW0gSUQgdG8gdXNlIGFzIGEgYmFzZSBmb3IgcmVsYXRpdmUgVVJMcy4gKi8KKyAgcHJpdmF0ZSBTdHJpbmcgbV9iYXNlU3lzdGVtSUQ7CisKKyAgLyoqIFRoZSByZXN1bHQgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbi4gKi8KKyAgcHJpdmF0ZSBSZXN1bHQgbV9yZXN1bHQgPSBudWxsOworCisgIC8qKiBUaGUgbG9jYXRvciBmb3IgdGhpcyBUcmFuc2Zvcm1lckhhbmRsZXIuICovCisgIHByaXZhdGUgTG9jYXRvciBtX2xvY2F0b3IgPSBudWxsOworCisgIC8qKiBUaGUgZW50aXR5IHJlc29sdmVyIHRvIGFnZ3JlZ2F0ZSB0by4gKi8KKyAgcHJpdmF0ZSBFbnRpdHlSZXNvbHZlciBtX2VudGl0eVJlc29sdmVyID0gbnVsbDsKKworICAvKiogVGhlIERURCBoYW5kbGVyIHRvIGFnZ3JlZ2F0ZSB0by4gKi8KKyAgcHJpdmF0ZSBEVERIYW5kbGVyIG1fZHRkSGFuZGxlciA9IG51bGw7CisKKyAgLyoqIFRoZSBjb250ZW50IGhhbmRsZXIgdG8gYWdncmVnYXRlIHRvLiAqLworICBwcml2YXRlIENvbnRlbnRIYW5kbGVyIG1fY29udGVudEhhbmRsZXIgPSBudWxsOworCisgIC8qKiBUaGUgZXJyb3IgaGFuZGxlciB0byBhZ2dyZWdhdGUgdG8uICovCisgIHByaXZhdGUgRXJyb3JIYW5kbGVyIG1fZXJyb3JIYW5kbGVyID0gbnVsbDsKKworICAvKiogVGhlIGxleGljYWwgaGFuZGxlciB0byBhZ2dyZWdhdGUgdG8uICovCisgIHByaXZhdGUgTGV4aWNhbEhhbmRsZXIgbV9sZXhpY2FsSGFuZGxlciA9IG51bGw7CisKKyAgLyoqIFRoZSBkZWNsIGhhbmRsZXIgdG8gYWdncmVnYXRlIHRvLiAqLworICBwcml2YXRlIERlY2xIYW5kbGVyIG1fZGVjbEhhbmRsZXIgPSBudWxsOworICAKKyAgLyoqIFRoZSBEb2N1bWVudCBUYWJsZSBJbnN0YW5jZSB3ZSBhcmUgdHJhbnNmb3JtaW5nLiAqLworICBEVE0gbV9kdG07Cit9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9UcmFuc2Zvcm1lckltcGwuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1RyYW5zZm9ybWVySW1wbC5qYXZhCmluZGV4IDY1MGU0MmEuLmI2OTVmOTggMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1RyYW5zZm9ybWVySW1wbC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1RyYW5zZm9ybWVySW1wbC5qYXZhCkBAIC03MCw5ICs3MCw2IEBACiAvLyBYYWxhbiBpbXBvcnRzCiBpbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5yZXMuWFNMVEVycm9yUmVzb3VyY2VzOwogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ucmVzLlhTTE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc3RyZWUuU291cmNlVHJlZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zdHJlZS5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5zdHJlZS5Eb2NJbXBsOwogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtQXR0cmlidXRlU2V0OwogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1UZW1wbGF0ZUVsZW1lbnQ7CkBAIC0xMjEsMTEgKzExOCwxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLk1ldGhvZDsKIAogLy8gRE9NIEltcG9ydHMKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1XU0ZpbHRlcjsKIAogLy8gU0FYMiBJbXBvcnRzCiBpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CkBAIC0xNjksNyArMTcwLDcgQEAKICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBleGVjdXRpb24uPC9wPgogICovCiBwdWJsaWMgY2xhc3MgVHJhbnNmb3JtZXJJbXBsIGV4dGVuZHMgVHJhbnNmb3JtZXIKLSAgICAgICAgaW1wbGVtZW50cyBSdW5uYWJsZSwgVHJhbnNmb3JtU3RhdGUKKyAgICAgICAgaW1wbGVtZW50cyBSdW5uYWJsZSwgRFRNV1NGaWx0ZXIKIHsKICAgLy8gU3luY2ggb2JqZWN0IHRvIGdhdXJkIGFnYWluc3Qgc2V0dGluZyB2YWx1ZXMgZnJvbSB0aGUgVHJBWCBpbnRlcmZhY2UgCiAgIC8vIG9yIHJlZW50cnkgd2hpbGUgdGhlIHRyYW5zZm9ybSBpcyBnb2luZyBvbi4KQEAgLTI1NCwxNSArMjU1LDIzIEBACiAgICAqIEVsZW1UZW1wbGF0ZUVsZW1lbnQuICBOZWVkZWQgZm9yIHRoZSAKICAgICogb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1TdGF0ZSBpbnRlcmZhY2UsICAKICAgICogc28gYSB0b29sIGNhbiBkaXNjb3ZlciB0aGUgY2FsbGluZyB0ZW1wbGF0ZS4gKi8KLSAgTm9kZVZlY3RvciBtX2N1cnJlbnRUZW1wbGF0ZUVsZW1lbnRzID0gbmV3IE5vZGVWZWN0b3IoNjQpOworICBTdGFjayBtX2N1cnJlbnRUZW1wbGF0ZUVsZW1lbnRzID0gbmV3IFN0YWNrKCk7CiAKICAgLyoqIEEgbm9kZSB2ZWN0b3IgdXNlZCBhcyBhIHN0YWNrIHRvIHRyYWNrIHRoZSBjdXJyZW50IAotICAgKiBFbGVtVGVtcGxhdGUgdGhhdCB3YXMgbWF0Y2hlZCwgYXMgd2VsbCBhcyB0aGUgbm9kZSB0aGF0IAotICAgKiB3YXMgbWF0Y2hlZC4gIE5lZWRlZCBmb3IgdGhlIAorICAgKiBFbGVtVGVtcGxhdGUgdGhhdCB3YXMgbWF0Y2hlZC4KKyAgICogTmVlZGVkIGZvciB0aGUgCiAgICAqIG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuVHJhbnNmb3JtU3RhdGUgaW50ZXJmYWNlLCAgCi0gICAqIHNvIGEgdG9vbCBjYW4gZGlzY292ZXIgdGhlIG1hdGNoZWQgdGVtcGxhdGUsIGFuZCBtYXRjaGVkIAorICAgKiBzbyBhIHRvb2wgY2FuIGRpc2NvdmVyIHRoZSBtYXRjaGVkIHRlbXBsYXRlCisgICAqLworICBTdGFjayBtX2N1cnJlbnRNYXRjaFRlbXBsYXRlcyA9IG5ldyBTdGFjaygpOworICAKKyAgLyoqIEEgbm9kZSB2ZWN0b3IgdXNlZCBhcyBhIHN0YWNrIHRvIHRyYWNrIHRoZSBjdXJyZW50IAorICAgKiBub2RlIHRoYXQgd2FzIG1hdGNoZWQuCisgICAqIE5lZWRlZCBmb3IgdGhlIAorICAgKiBvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlRyYW5zZm9ybVN0YXRlIGludGVyZmFjZSwgIAorICAgKiBzbyBhIHRvb2wgY2FuIGRpc2NvdmVyIHRoZSBtYXRjaGVkIAogICAgKiBub2RlLiAqLwotICBOb2RlVmVjdG9yIG1fY3VycmVudE1hdGNoVGVtcGxhdGVzID0gbmV3IE5vZGVWZWN0b3IoKTsKKyAgTm9kZVZlY3RvciBtX2N1cnJlbnRNYXRjaGVkTm9kZXMgPSBuZXcgTm9kZVZlY3RvcigpOwogCiAgIC8qKgogICAgKiBUaGUgcm9vdCBvZiBhIGxpbmtlZCBzZXQgb2Ygc3R5bGVzaGVldHMuCkBAIC0zNDcsNyArMzU2LDcgQEAKICAgLyoqIFRoaXMgaXMgbmVlZGVkIGZvciBzdXBwb3J0IG9mIHNldFNvdXJjZVRyZWVEb2NGb3JUaHJlYWQoTm9kZSBkb2MpLAogICAgKiB3aGljaCBtdXN0IGJlIGNhbGxlZCBpbiBvcmRlciBmb3IgdGhlIHRyYW5zZm9ybSB0aHJlYWQncyBydW4gCiAgICAqIG1ldGhvZCB0byBvYnRhaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlIHRvIGJlIHRyYW5zZm9ybWVkLiAgICAgKi8KLSAgcHJpdmF0ZSBOb2RlIG1fZG9jOworICBwcml2YXRlIGludCBtX2RvYzsKIAogICAvKioKICAgICogSWYgdGhlIHRoZSB0cmFuc2Zvcm0gaXMgb24gdGhlIHNlY29uZGFyeSB0aHJlYWQsIHdlCkBAIC0zNTUsOCArMzY0LDE0IEBACiAgICAqLwogICBwcml2YXRlIGJvb2xlYW4gbV9pc1RyYW5zZm9ybURvbmUgPSBmYWxzZTsKICAgCisgIC8qKiBGbGFnIHRvIHRvIHRlbGwgaWYgdGhlIHRyYW5mb3JtZXIgbmVlZHMgdG8gYmUgcmVzZXQuICovCiAgIHByaXZhdGUgYm9vbGVhbiBtX2hhc0JlZW5SZXNldCA9IGZhbHNlOwogICAKKyAgLyoqCisgICAqIEEgc3RhY2sgb2YgY3VycmVudCB0ZW1wbGF0ZSBtb2Rlcy4KKyAgICovCisgIHByaXZhdGUgU3RhY2sgbV9tb2RlcyA9IG5ldyBTdGFjaygpOworICAKICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIC8vIFNFQ1RJT046IENvbnN0cnVjdG9ycwogICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTQwMyw2ICs0MTgsNyBAQAogICAgICAgZ2V0WFBhdGhDb250ZXh0KCkuZ2V0VmFyU3RhY2soKS5zZXRTaXplKDEpOwogICAgICAgbV9jdXJyZW50VGVtcGxhdGVFbGVtZW50cy5yZW1vdmVBbGxFbGVtZW50cygpOwogICAgICAgbV9jdXJyZW50TWF0Y2hUZW1wbGF0ZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgIG1fY3VycmVudE1hdGNoZWROb2Rlcy5yZW1vdmVBbGxFbGVtZW50cygpOwogICAKICAgICAgIG1fcmVzdWx0VHJlZUhhbmRsZXIgPSBudWxsOwogICAgICAgbV9vdXRwdXRUYXJnZXQgPSBudWxsOwpAQCAtNDExLDkgKzQyNyw5IEBACiAgICAgICBtX2NvdW50ZXJzVGFibGUgPSBudWxsOwogICAgICAgbV9jdXJyZW50VGVtcGxhdGVSdWxlSXNOdWxsID0gbmV3IEJvb2xTdGFjaygpOwogICAgICAgbV94bWxTb3VyY2UgPSBudWxsOwotICAgICAgbV9kb2MgPSBudWxsOworICAgICAgbV9kb2MgPSBEVE0uTlVMTDsKICAgICAgIG1faXNUcmFuc2Zvcm1Eb25lID0gZmFsc2U7Ci0gICAgICBtX2lucHV0Q29udGVudEhhbmRsZXIgPSBudWxsOworICAgICAgLy8gbV9pbnB1dENvbnRlbnRIYW5kbGVyID0gbnVsbDsKICAgICAgIAogICAgICAgLy8gRm9yIG5vdywgcmVzZXQgdGhlIGRvY3VtZW50IGNhY2hlIGVhY2ggdGltZS4KICAgICAgIGdldFhQYXRoQ29udGV4dCgpLmdldFNvdXJjZVRyZWVNYW5hZ2VyKCkucmVzZXQoKTsKQEAgLTQ3OSwxNTUgKzQ5NSwxOSBAQAogICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oU291cmNlIHNvdXJjZSkgCiAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKLSAgICBpZihzb3VyY2UgaW5zdGFuY2VvZiBET01Tb3VyY2UpCi0gICAgewotICAgICAgRE9NU291cmNlIGRzb3VyY2UgPSAoRE9NU291cmNlKXNvdXJjZTsKLSAgICAgIG1fdXJsT2ZTb3VyY2UgPSBkc291cmNlLmdldFN5c3RlbUlkKCk7Ci0gICAgICBOb2RlIGROb2RlID0gZHNvdXJjZS5nZXROb2RlKCk7Ci0gICAgICBpZiAobnVsbCAhPSBkTm9kZSkKLSAgICAgIHsgIAotICAgICAgICBpZihudWxsICE9IG1fdXJsT2ZTb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1dHRpbmcgZG9jdW1lbnQgaW4gY2FjaGU6ICIrbV91cmxPZlNvdXJjZSk7Ci0gICAgICAgICAgdGhpcy5nZXRYUGF0aENvbnRleHQoKS5nZXRTb3VyY2VUcmVlTWFuYWdlcigpLnB1dERvY3VtZW50SW5DYWNoZShkTm9kZSwgZHNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy50cmFuc2Zvcm1Ob2RlKGRzb3VyY2UuZ2V0Tm9kZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmcgbWVzc2FnZVN0ciA9IFhTTE1lc3NhZ2VzLmNyZWF0ZU1lc3NhZ2UoWFNMVEVycm9yUmVzb3VyY2VzLkVSX0lMTEVHQUxfRE9NU09VUkNFX0lOUFVULCBudWxsKTsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlU3RyKTsKLSAgICAgIH0gCi0gICAgfQotICAgIElucHV0U291cmNlIHhtbFNvdXJjZSA9IFNBWFNvdXJjZS5zb3VyY2VUb0lucHV0U291cmNlKHNvdXJjZSk7Ci0gICAgaWYobnVsbCA9PSB4bWxTb3VyY2UpCi0gICAgewotICAgICAgbV9lcnJvckhhbmRsZXIuZmF0YWxFcnJvcihuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oIkNhbid0IHRyYW5zZm9ybSBhIFNvdXJjZSBvZiB0eXBlICIrCi0gICAgICAgIHNvdXJjZS5nZXRDbGFzcygpLmdldE5hbWUoKSsiISIpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKG51bGwgIT0geG1sU291cmNlLmdldFN5c3RlbUlkKCkpCi0gICAgeyAgICAgCi0gICAgICBtX3VybE9mU291cmNlID0gb3JnLmFwYWNoZS54bWwudXRpbHMuU3lzdGVtSURSZXNvbHZlci5nZXRBYnNvbHV0ZVVSSSh4bWxTb3VyY2UuZ2V0U3lzdGVtSWQoKSk7Ci0gICAgICB4bWxTb3VyY2Uuc2V0U3lzdGVtSWQobV91cmxPZlNvdXJjZSk7Ci0gICAgfQotCiAgICAgdHJ5CiAgICAgewotICAgICAgbV9oYXNUcmFuc2Zvcm1UaHJlYWRFcnJvckNhdGNoZXIgPSB0cnVlOwotICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICBpZihzb3VyY2UgaW5zdGFuY2VvZiBTQVhTb3VyY2UpCi0gICAgICAgIHJlYWRlciA9ICgoU0FYU291cmNlKXNvdXJjZSkuZ2V0WE1MUmVhZGVyKCk7Ci0KLSAgICAgIGlmIChudWxsID09IHJlYWRlcikKLSAgICAgIHsKLSAgICAgIC8vIFVzZSBKQVhQMS4xICggaWYgcG9zc2libGUgKSAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUoIHRydWUgKTsKLSAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIgamF4cFBhcnNlcj0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgIHJlYWRlcj1qYXhwUGFyc2VyLmdldFhNTFJlYWRlcigpOwotICAgICAgICAgIAotICAgICAgICB9IGNhdGNoKCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4ICkgewotICAgICAgICAgIHRocm93IG5ldyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24oIGV4ICk7Ci0gICAgICAgIH0gY2F0Y2goIGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZXgxICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiggZXgxLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgfSBjYXRjaCggTm9TdWNoTWV0aG9kRXJyb3IgZXgyICkgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBYnN0cmFjdE1ldGhvZEVycm9yIGFtZSl7fQotICAgICAgfQotICAgICAgaWYgKG51bGwgPT0gcmVhZGVyKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIHJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7Ci0gICAgICB9Ci0KKyAgICAgIERUTU1hbmFnZXIgbWdyID0gdGhpcy5nZXRYUGF0aENvbnRleHQoKS5nZXREVE1NYW5hZ2VyKCk7CisgICAgICBEVE0gZHRtID0gbWdyLmdldERUTShzb3VyY2UsIGZhbHNlLCB0aGlzLCB0cnVlKTsKKyAgICAgIAorICAgICAgYm9vbGVhbiBoYXJkRGVsZXRlID0gdHJ1ZTsgIC8vICVSRVZJRVclIEkgaGF2ZSB0byB0aGluayBhYm91dCB0aGlzLiAtc2IKICAgICAgIHRyeQogICAgICAgewotICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vZHluYW1pYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICB0aGlzLnRyYW5zZm9ybU5vZGUoZHRtLmdldERvY3VtZW50KCkpOwogICAgICAgfQotICAgICAgY2F0Y2ggKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzZSkKKyAgICAgIGZpbmFsbHkKICAgICAgIHsKLSAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZS4KLSAgICAgIH0KLQotICAgICAgLy8gR2V0IHRoZSBpbnB1dCBjb250ZW50IGhhbmRsZXIsIHdoaWNoIHdpbGwgaGFuZGxlIHRoZSAKLSAgICAgIC8vIHBhcnNlIGV2ZW50cyBhbmQgY3JlYXRlIHRoZSBzb3VyY2UgdHJlZS4gCi0gICAgICBDb250ZW50SGFuZGxlciBpbnB1dEhhbmRsZXIgPSBnZXRJbnB1dENvbnRlbnRIYW5kbGVyKCk7Ci0KLSAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihpbnB1dEhhbmRsZXIpOwotICAgICAgaWYoaW5wdXRIYW5kbGVyIGluc3RhbmNlb2Ygb3JnLnhtbC5zYXguRFRESGFuZGxlcikKLSAgICAgICAgcmVhZGVyLnNldERUREhhbmRsZXIoKG9yZy54bWwuc2F4LkRUREhhbmRsZXIpaW5wdXRIYW5kbGVyKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZihpbnB1dEhhbmRsZXIgaW5zdGFuY2VvZiBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIpCi0gICAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEhhbmRsZXIpOwotICAgICAgICBpZihpbnB1dEhhbmRsZXIgaW5zdGFuY2VvZiBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIpCi0gICAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kZWNsYXJhdGlvbi1oYW5kbGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRIYW5kbGVyKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzZSkge30KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZihpbnB1dEhhbmRsZXIgaW5zdGFuY2VvZiBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIpCi0gICAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvaGFuZGxlcnMvTGV4aWNhbEhhbmRsZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEhhbmRsZXIpOwotICAgICAgICBpZihpbnB1dEhhbmRsZXIgaW5zdGFuY2VvZiBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIpCi0gICAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvaGFuZGxlcnMvRGVjbEhhbmRsZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEhhbmRsZXIpOwotICAgICAgfQotICAgICAgY2F0Y2gob3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBzbnJlKQotICAgICAgewotICAgICAgfQotCi0gICAgICAvLyBTZXQgdGhlIHJlYWRlciBmb3IgY2xvbmluZyBwdXJwb3Nlcy4KLSAgICAgIGdldFhQYXRoQ29udGV4dCgpLnNldFByaW1hcnlSZWFkZXIocmVhZGVyKTsKLQotICAgICAgdGhpcy5tX2V4Y2VwdGlvblRocm93biA9IG51bGw7Ci0KLSAgICAgIGlmIChpbnB1dEhhbmRsZXIgaW5zdGFuY2VvZiBTb3VyY2VUcmVlSGFuZGxlcikKLSAgICAgIHsKLSAgICAgICAgU291cmNlVHJlZUhhbmRsZXIgc3RoID0gKFNvdXJjZVRyZWVIYW5kbGVyKSBpbnB1dEhhbmRsZXI7Ci0KLSAgICAgICAgc3RoLnNldElucHV0U291cmNlKHNvdXJjZSk7Ci0gICAgICAgIHN0aC5zZXRVc2VNdWx0aVRocmVhZGluZyh0cnVlKTsKLQotICAgICAgICBOb2RlIGRvYyA9IHN0aC5nZXRSb290KCk7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gZG9jKQotICAgICAgICB7Ci0gICAgICAgICAgU291cmNlVHJlZU1hbmFnZXIgc3RtID0gZ2V0WFBhdGhDb250ZXh0KCkuZ2V0U291cmNlVHJlZU1hbmFnZXIoKTsKLSAgICAgICAgICBzdG0ucHV0RG9jdW1lbnRJbkNhY2hlKGRvYywgc291cmNlKTsKLQotICAgICAgICAgIG1feG1sU291cmNlID0gc291cmNlOwotICAgICAgICAgIG1fZG9jID0gZG9jOwotCi0gICAgICAgICAgaWYgKGlzUGFyc2VyRXZlbnRzT25NYWluKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgbV9pc1RyYW5zZm9ybURvbmUgPSBmYWxzZTsKLQotICAgICAgICAgICAgZ2V0WFBhdGhDb250ZXh0KCkuZ2V0UHJpbWFyeVJlYWRlcigpLnBhcnNlKHhtbFNvdXJjZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBUaHJlYWQgdCA9IGNyZWF0ZVRyYW5zZm9ybVRocmVhZCgpOwotLy8gICAgICAgICAgICBtX3JlcG9ydEluUG9zdEV4Y2VwdGlvbkZyb21UaHJlYWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHQuc3RhcnQoKTsKLSAgICAgICAgICAgIHRyYW5zZm9ybU5vZGUoZG9jKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLQotICAgICAgICAvLyA/PwotICAgICAgICByZWFkZXIucGFyc2UoeG1sU291cmNlKTsKKyAgICAgICAgbWdyLnJlbGVhc2UoZHRtLCBoYXJkRGVsZXRlKTsKICAgICAgIH0KIAogICAgICAgLy8gS2ljayBvZmYgdGhlIHBhcnNlLiAgV2hlbiB0aGUgQ29udGVudEhhbmRsZXIgZ2V0cyAKQEAgLTY4MiwxMCArNTYyLDYgQEAKICAgICB7CiAgICAgICBtX2Vycm9ySGFuZGxlci5mYXRhbEVycm9yKG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiggc2UgKSk7CiAgICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgbV9lcnJvckhhbmRsZXIuZmF0YWxFcnJvcihuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oIGlvZSApKTsKLSAgICB9CiAgICAgZmluYWxseQogICAgIHsKICAgICAgIG1faGFzVHJhbnNmb3JtVGhyZWFkRXJyb3JDYXRjaGVyID0gZmFsc2U7CkBAIC04ODAsMTQ4ICs3NTYsMTQ5IEBACiAgICAgcmV0dXJuIChQcm9wZXJ0aWVzKWdldE91dHB1dEZvcm1hdCgpLmdldFByb3BlcnRpZXMoKS5jbG9uZSgpOyAgCiAgIH0KIAotICAvKioKLSAgICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImludGVybmFsIi8+Ci0gICAqIFByb2Nlc3MgdGhlIGFuIGlucHV0IHNvdXJjZSB0byBhIERPTSBub2RlLiAgRk9SIElOVEVSTkFMIFVTRSBPTkxZLgotICAgKiAKLSAgICogQHBhcmFtIHhtbFNvdXJjZSAgVGhlIGlucHV0IGZvciB0aGUgc291cmNlIHRyZWUuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIE5vZGUgcmVzdWx0IG9mIHRoZSBwYXJzZSwgbmV2ZXIgbnVsbC4KLSAgICoKLSAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIE5vZGUgcGFyc2VUb05vZGUoU291cmNlIHNvdXJjZSkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gIHsKLSAgICBpZihzb3VyY2UgaW5zdGFuY2VvZiBET01Tb3VyY2UpCi0gICAgICByZXR1cm4gKChET01Tb3VyY2Upc291cmNlKS5nZXROb2RlKCk7Ci0gICAgCi0gICAgSW5wdXRTb3VyY2UgeG1sU291cmNlID0gU0FYU291cmNlLnNvdXJjZVRvSW5wdXRTb3VyY2Uoc291cmNlKTsKLSAgICBpZihudWxsID09IHhtbFNvdXJjZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oIkNhbid0IHRyYW5zZm9ybSBhIFNvdXJjZSBvZiB0eXBlICIrCi0gICAgICAgIHNvdXJjZS5nZXRDbGFzcygpLmdldE5hbWUoKSsiISIpOwotICAgIH0KLQotICAgIC8vIER1cGxpY2F0ZSBjb2RlIGZyb20gYWJvdmUuLi4gYnV0IHNsaWdodGx5IGRpZmZlcmVudC4gIAotICAgIC8vIFRPRE86IFdvcmsgb24gdGhpcy4uLgotICAgIGlmIChudWxsICE9IHhtbFNvdXJjZS5nZXRTeXN0ZW1JZCgpKQotICAgICAgbV91cmxPZlNvdXJjZSA9IHhtbFNvdXJjZS5nZXRTeXN0ZW1JZCgpOwotCi0gICAgTm9kZSBkb2MgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCBhbiBhbHJlYWR5IHNldCBYTUxSZWFkZXIsIG9yIGNyZWF0ZSBvbmUuCi0gICAgICBYTUxSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgIGlmKHNvdXJjZSBpbnN0YW5jZW9mIFNBWFNvdXJjZSkKLSAgICAgICAgcmVhZGVyID0gKChTQVhTb3VyY2Upc291cmNlKS5nZXRYTUxSZWFkZXIoKTsKLQotICAgICAgaWYgKG51bGwgPT0gcmVhZGVyKQotICAgICAgewotICAgICAgICAvLyBVc2UgSkFYUDEuMSAoIGlmIHBvc3NpYmxlICkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5IGZhY3Rvcnk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKCB0cnVlICk7Ci0gICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyIGpheHBQYXJzZXI9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICByZWFkZXI9amF4cFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLSAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCggamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleCApIHsKLSAgICAgICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKCBleCApOwotICAgICAgICB9IGNhdGNoKCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGV4MSApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24oIGV4MS50b1N0cmluZygpICk7Ci0gICAgICAgIH0gY2F0Y2goIE5vU3VjaE1ldGhvZEVycm9yIGV4MiApIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQWJzdHJhY3RNZXRob2RFcnJvciBhbWUpe30KLSAgICAgIH0KLQotICAgICAgaWYgKG51bGwgPT0gcmVhZGVyKQotICAgICAgewotICAgICAgICByZWFkZXIgPSBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOwotICAgICAgfQotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9keW5hbWljIiwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAob3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHNlKQotICAgICAgewotCi0gICAgICAgIC8vIFdoYXQgY2FuIHdlIGRvPwotICAgICAgICAvLyBUT0RPOiBVc2VyIGRpYWdub3N0aWNzLgotICAgICAgfQotCi0gICAgICAvLyBUT0RPOiBIYW5kbGUgWGVyY2VzIERPTSBwYXJzZXIuCi0gICAgICAvLyBHZXQgdGhlIGlucHV0IGNvbnRlbnQgaGFuZGxlciwgd2hpY2ggd2lsbCBoYW5kbGUgdGhlIAotICAgICAgLy8gcGFyc2UgZXZlbnRzIGFuZCBjcmVhdGUgdGhlIHNvdXJjZSB0cmVlLgotICAgICAgQ29udGVudEhhbmRsZXIgaW5wdXRIYW5kbGVyID0gZ2V0SW5wdXRDb250ZW50SGFuZGxlcigpOwotICAgICAgQ2xhc3MgaW5wdXRIYW5kbGVyQ2xhc3MgPSAoKE9iamVjdCkgaW5wdXRIYW5kbGVyKS5nZXRDbGFzcygpOwotCi0gICAgICBpbnB1dEhhbmRsZXIgPSAoQ29udGVudEhhbmRsZXIpIGlucHV0SGFuZGxlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihpbnB1dEhhbmRsZXIpOwotICAgICAgaWYoaW5wdXRIYW5kbGVyIGluc3RhbmNlb2Ygb3JnLnhtbC5zYXguRFRESGFuZGxlcikKLSAgICAgICAgcmVhZGVyLnNldERUREhhbmRsZXIoKG9yZy54bWwuc2F4LkRUREhhbmRsZXIpaW5wdXRIYW5kbGVyKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZihpbnB1dEhhbmRsZXIgaW5zdGFuY2VvZiBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIpCi0gICAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEhhbmRsZXIpOwotICAgICAgICBpZihpbnB1dEhhbmRsZXIgaW5zdGFuY2VvZiBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIpCi0gICAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kZWNsYXJhdGlvbi1oYW5kbGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRIYW5kbGVyKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gc25yZSl7fQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmKGlucHV0SGFuZGxlciBpbnN0YW5jZW9mIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcikKLSAgICAgICAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9oYW5kbGVycy9MZXhpY2FsSGFuZGxlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SGFuZGxlcik7Ci0gICAgICAgIGlmKGlucHV0SGFuZGxlciBpbnN0YW5jZW9mIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcikKLSAgICAgICAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9oYW5kbGVycy9EZWNsSGFuZGxlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SGFuZGxlcik7Ci0gICAgICB9Ci0gICAgICBjYXRjaChvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIHNucmUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBnZXRYUGF0aENvbnRleHQoKS5zZXRQcmltYXJ5UmVhZGVyKHJlYWRlcik7Ci0KLSAgICAgIC8vIC4uLmFuZCBvZiBjb3Vyc2UgSSBuZWVkIGEgc3RhbmRhcmQgd2F5IHRvIGdldCBhIG5vZGUuLi4KLSAgICAgIGlmIChpbnB1dEhhbmRsZXIgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhhbGFuLnN0cmVlLlNvdXJjZVRyZWVIYW5kbGVyKQotICAgICAgewotCi0gICAgICAgIC8vIEtpY2sgb2ZmIHRoZSBwYXJzZS4gIFdoZW4gdGhlIENvbnRlbnRIYW5kbGVyIGdldHMgCi0gICAgICAgIC8vIHRoZSBzdGFydERvY3VtZW50IGV2ZW50LCBpdCB3aWxsIGNhbGwgdHJhbnNmb3JtTm9kZSggbm9kZSApLgotICAgICAgICByZWFkZXIucGFyc2UoeG1sU291cmNlKTsKLQotICAgICAgICBkb2MgPQotICAgICAgICAgICAgICgob3JnLmFwYWNoZS54YWxhbi5zdHJlZS5Tb3VyY2VUcmVlSGFuZGxlcikgaW5wdXRIYW5kbGVyKS5nZXRSb290KCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oaWFlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGllKTsKLSAgICB9Ci0gICAgY2F0Y2gob3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHNlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihzZSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGlvZSk7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gZG9jOwotICB9CisgIC8vICVSRVZJRVclIE9LIHRvIGRlbGV0ZT8gIFdobyBuZWVkcyB0aGlzPworLy8gIC8qKgorLy8gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgorLy8gICAqIFByb2Nlc3MgdGhlIGFuIGlucHV0IHNvdXJjZSB0byBhIERPTSBub2RlLiAgRk9SIElOVEVSTkFMIFVTRSBPTkxZLgorLy8gICAqIAorLy8gICAqIEBwYXJhbSB4bWxTb3VyY2UgIFRoZSBpbnB1dCBmb3IgdGhlIHNvdXJjZSB0cmVlLgorLy8gICAqCisvLyAgICogQHJldHVybiBUaGUgTm9kZSByZXN1bHQgb2YgdGhlIHBhcnNlLCBuZXZlciBudWxsLgorLy8gICAqCisvLyAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorLy8gICAqLworLy8gIHB1YmxpYyBOb2RlIHBhcnNlVG9Ob2RlKFNvdXJjZSBzb3VyY2UpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorLy8gIHsKKy8vICAgIGlmKHNvdXJjZSBpbnN0YW5jZW9mIERPTVNvdXJjZSkKKy8vICAgICAgcmV0dXJuICgoRE9NU291cmNlKXNvdXJjZSkuZ2V0Tm9kZSgpOworLy8gICAgCisvLyAgICBJbnB1dFNvdXJjZSB4bWxTb3VyY2UgPSBTQVhTb3VyY2Uuc291cmNlVG9JbnB1dFNvdXJjZShzb3VyY2UpOworLy8gICAgaWYobnVsbCA9PSB4bWxTb3VyY2UpCisvLyAgICB7CisvLyAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbigiQ2FuJ3QgdHJhbnNmb3JtIGEgU291cmNlIG9mIHR5cGUgIisKKy8vICAgICAgICBzb3VyY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIiEiKTsKKy8vICAgIH0KKy8vCisvLyAgICAvLyBEdXBsaWNhdGUgY29kZSBmcm9tIGFib3ZlLi4uIGJ1dCBzbGlnaHRseSBkaWZmZXJlbnQuICAKKy8vICAgIC8vIFRPRE86IFdvcmsgb24gdGhpcy4uLgorLy8gICAgaWYgKG51bGwgIT0geG1sU291cmNlLmdldFN5c3RlbUlkKCkpCisvLyAgICAgIG1fdXJsT2ZTb3VyY2UgPSB4bWxTb3VyY2UuZ2V0U3lzdGVtSWQoKTsKKy8vCisvLyAgICBOb2RlIGRvYyA9IG51bGw7CisvLyAgICB0cnkKKy8vICAgIHsKKy8vICAgICAgLy8gR2V0IGFuIGFscmVhZHkgc2V0IFhNTFJlYWRlciwgb3IgY3JlYXRlIG9uZS4KKy8vICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IG51bGw7CisvLyAgICAgIGlmKHNvdXJjZSBpbnN0YW5jZW9mIFNBWFNvdXJjZSkKKy8vICAgICAgICByZWFkZXIgPSAoKFNBWFNvdXJjZSlzb3VyY2UpLmdldFhNTFJlYWRlcigpOworLy8KKy8vICAgICAgaWYgKG51bGwgPT0gcmVhZGVyKQorLy8gICAgICB7CisvLyAgICAgICAgLy8gVXNlIEpBWFAxLjEgKCBpZiBwb3NzaWJsZSApCisvLyAgICAgICAgdHJ5IHsKKy8vICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeT0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisvLyAgICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKCB0cnVlICk7CisvLyAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIgamF4cFBhcnNlcj0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CisvLyAgICAgICAgICByZWFkZXI9amF4cFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKKy8vICAgICAgICAgIAorLy8gICAgICAgIH0gY2F0Y2goIGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXggKSB7CisvLyAgICAgICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKCBleCApOworLy8gICAgICAgIH0gY2F0Y2goIGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZXgxICkgeworLy8gICAgICAgICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKCBleDEudG9TdHJpbmcoKSApOworLy8gICAgICAgIH0gY2F0Y2goIE5vU3VjaE1ldGhvZEVycm9yIGV4MiApIHsKKy8vICAgICAgICB9CisvLyAgICAgICAgY2F0Y2ggKEFic3RyYWN0TWV0aG9kRXJyb3IgYW1lKXt9CisvLyAgICAgIH0KKy8vCisvLyAgICAgIGlmIChudWxsID09IHJlYWRlcikKKy8vICAgICAgeworLy8gICAgICAgIHJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7CisvLyAgICAgIH0KKy8vCisvLyAgICAgIHRyeQorLy8gICAgICB7CisvLyAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworLy8gICAgICAgIHJlYWRlci5zZXRGZWF0dXJlKAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9keW5hbWljIiwgdHJ1ZSk7CisvLyAgICAgIH0KKy8vICAgICAgY2F0Y2ggKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzZSkKKy8vICAgICAgeworLy8KKy8vICAgICAgICAvLyBXaGF0IGNhbiB3ZSBkbz8KKy8vICAgICAgICAvLyBUT0RPOiBVc2VyIGRpYWdub3N0aWNzLgorLy8gICAgICB9CisvLworLy8gICAgICAvLyBUT0RPOiBIYW5kbGUgWGVyY2VzIERPTSBwYXJzZXIuCisvLyAgICAgIC8vIEdldCB0aGUgaW5wdXQgY29udGVudCBoYW5kbGVyLCB3aGljaCB3aWxsIGhhbmRsZSB0aGUgCisvLyAgICAgIC8vIHBhcnNlIGV2ZW50cyBhbmQgY3JlYXRlIHRoZSBzb3VyY2UgdHJlZS4KKy8vICAgICAgQ29udGVudEhhbmRsZXIgaW5wdXRIYW5kbGVyID0gZ2V0SW5wdXRDb250ZW50SGFuZGxlcigpOworLy8gICAgICBDbGFzcyBpbnB1dEhhbmRsZXJDbGFzcyA9ICgoT2JqZWN0KSBpbnB1dEhhbmRsZXIpLmdldENsYXNzKCk7CisvLworLy8gICAgICBpbnB1dEhhbmRsZXIgPSAoQ29udGVudEhhbmRsZXIpIGlucHV0SGFuZGxlckNsYXNzLm5ld0luc3RhbmNlKCk7CisvLworLy8gICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoaW5wdXRIYW5kbGVyKTsKKy8vICAgICAgaWYoaW5wdXRIYW5kbGVyIGluc3RhbmNlb2Ygb3JnLnhtbC5zYXguRFRESGFuZGxlcikKKy8vICAgICAgICByZWFkZXIuc2V0RFRESGFuZGxlcigob3JnLnhtbC5zYXguRFRESGFuZGxlcilpbnB1dEhhbmRsZXIpOworLy8gICAgICB0cnkKKy8vICAgICAgeworLy8gICAgICAgIGlmKGlucHV0SGFuZGxlciBpbnN0YW5jZW9mIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcikKKy8vICAgICAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEhhbmRsZXIpOworLy8gICAgICAgIGlmKGlucHV0SGFuZGxlciBpbnN0YW5jZW9mIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcikKKy8vICAgICAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRIYW5kbGVyKTsKKy8vICAgICAgfQorLy8gICAgICBjYXRjaChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIHNucmUpe30KKy8vICAgICAgdHJ5CisvLyAgICAgIHsKKy8vICAgICAgICBpZihpbnB1dEhhbmRsZXIgaW5zdGFuY2VvZiBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIpCisvLyAgICAgICAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9oYW5kbGVycy9MZXhpY2FsSGFuZGxlciIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRIYW5kbGVyKTsKKy8vICAgICAgICBpZihpbnB1dEhhbmRsZXIgaW5zdGFuY2VvZiBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIpCisvLyAgICAgICAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9oYW5kbGVycy9EZWNsSGFuZGxlciIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRIYW5kbGVyKTsKKy8vICAgICAgfQorLy8gICAgICBjYXRjaChvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIHNucmUpCisvLyAgICAgIHsKKy8vICAgICAgfQorLy8gICAgICBnZXRYUGF0aENvbnRleHQoKS5zZXRQcmltYXJ5UmVhZGVyKHJlYWRlcik7CisvLworLy8gICAgICAvLyAuLi5hbmQgb2YgY291cnNlIEkgbmVlZCBhIHN0YW5kYXJkIHdheSB0byBnZXQgYSBub2RlLi4uCisvLyAgICAgIGlmIChpbnB1dEhhbmRsZXIgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhhbGFuLnN0cmVlLlNvdXJjZVRyZWVIYW5kbGVyKQorLy8gICAgICB7CisvLworLy8gICAgICAgIC8vIEtpY2sgb2ZmIHRoZSBwYXJzZS4gIFdoZW4gdGhlIENvbnRlbnRIYW5kbGVyIGdldHMgCisvLyAgICAgICAgLy8gdGhlIHN0YXJ0RG9jdW1lbnQgZXZlbnQsIGl0IHdpbGwgY2FsbCB0cmFuc2Zvcm1Ob2RlKCBub2RlICkuCisvLyAgICAgICAgcmVhZGVyLnBhcnNlKHhtbFNvdXJjZSk7CisvLworLy8gICAgICAgIGRvYyA9CisvLyAgICAgICAgICAgICAoKG9yZy5hcGFjaGUueGFsYW4uc3RyZWUuU291cmNlVHJlZUhhbmRsZXIpIGlucHV0SGFuZGxlcikuZ2V0Um9vdCgpOworLy8gICAgICB9CisvLworLy8gICAgfQorLy8gICAgY2F0Y2ggKGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkKKy8vICAgIHsKKy8vICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGlhZSk7CisvLyAgICB9CisvLyAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkKKy8vICAgIHsKKy8vICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGllKTsKKy8vICAgIH0KKy8vICAgIGNhdGNoKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzZSkKKy8vICAgIHsKKy8vICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKHNlKTsKKy8vICAgIH0KKy8vICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCisvLyAgICB7CisvLyAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihpb2UpOworLy8gICAgfQorLy8KKy8vCisvLyAgICByZXR1cm4gZG9jOworLy8gIH0KIAogICAvKioKICAgICogQ3JlYXRlIGEgcmVzdWx0IENvbnRlbnRIYW5kbGVyIGZyb20gYSBSZXN1bHQgb2JqZWN0LCBiYXNlZCAKQEAgLTEwNTcsMjIgKzkzNCwyMyBAQAogICBwdWJsaWMgQ29udGVudEhhbmRsZXIgY3JlYXRlUmVzdWx0Q29udGVudEhhbmRsZXIoCiAgICAgICAgICAgUmVzdWx0IG91dHB1dFRhcmdldCwgT3V0cHV0UHJvcGVydGllcyBmb3JtYXQpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7ICAgIAotICAgIENvbnRlbnRIYW5kbGVyIGhhbmRsZXI7CisgICAgQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG51bGw7CiAgICAgCiAgICAgLy8gSWYgdGhlIFJlc3VsdCBvYmplY3QgY29udGFpbnMgYSBOb2RlLCB0aGVuIGNyZWF0ZSAKICAgICAvLyBhIENvbnRlbnRIYW5kbGVyIHRoYXQgd2lsbCBhZGQgbm9kZXMgdG8gdGhlIGlucHV0IG5vZGUuCi0gICAgTm9kZSBvdXRwdXROb2RlID0gbnVsbDsKKyAgICBvcmcudzNjLmRvbS5Ob2RlIG91dHB1dE5vZGUgPSBudWxsOwogICAgIGlmKG91dHB1dFRhcmdldCBpbnN0YW5jZW9mIERPTVJlc3VsdCkKICAgICB7CiAgICAgICBvdXRwdXROb2RlID0gKChET01SZXN1bHQpb3V0cHV0VGFyZ2V0KS5nZXROb2RlKCk7CiAKLSAgICAgIERvY3VtZW50IGRvYzsKKyAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvYzsKICAgICAgIHNob3J0IHR5cGU7CiAgICAgICBpZiAobnVsbCAhPSBvdXRwdXROb2RlKQogICAgICAgewogICAgICAgICB0eXBlID0gb3V0cHV0Tm9kZS5nZXROb2RlVHlwZSgpOwotICAgICAgICBkb2MgPSAoTm9kZS5ET0NVTUVOVF9OT0RFID09IHR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgID8gKERvY3VtZW50KSBvdXRwdXROb2RlIDogb3V0cHV0Tm9kZS5nZXRPd25lckRvY3VtZW50KCk7CisgICAgICAgIGRvYyA9IChvcmcudzNjLmRvbS5Ob2RlLkRPQ1VNRU5UX05PREUgPT0gdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPyAob3JnLnczYy5kb20uRG9jdW1lbnQpIG91dHB1dE5vZGUgCisgICAgICAgICAgICAgICAgICAgICAgIDogb3V0cHV0Tm9kZS5nZXRPd25lckRvY3VtZW50KCk7CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7CkBAIC0xMDgyLDggKzk2MCw4IEBACiAgICAgICAgICgoRE9NUmVzdWx0KW91dHB1dFRhcmdldCkuc2V0Tm9kZShvdXRwdXROb2RlKTsKICAgICAgIH0KICAgICAgIAotICAgICAgaGFuZGxlciA9IChOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPT0gdHlwZSkKLSAgICAgICAgICAgICAgICA/IG5ldyBET01CdWlsZGVyKGRvYywgKERvY3VtZW50RnJhZ21lbnQpIG91dHB1dE5vZGUpCisgICAgICBoYW5kbGVyID0gKG9yZy53M2MuZG9tLk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9PSB0eXBlKQorICAgICAgICAgICAgICAgID8gbmV3IERPTUJ1aWxkZXIoZG9jLCAob3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudCkgb3V0cHV0Tm9kZSkKICAgICAgICAgICAgICAgICAgIDogbmV3IERPTUJ1aWxkZXIoZG9jLCBvdXRwdXROb2RlKTsKICAgICB9CiAgICAgZWxzZSBpZihvdXRwdXRUYXJnZXQgaW5zdGFuY2VvZiBTQVhSZXN1bHQpCkBAIC0xMTY1LDEyICsxMDQzLDEzIEBACiAgICAqIFByb2Nlc3MgdGhlIHNvdXJjZSBub2RlIHRvIHRoZSBvdXRwdXQgcmVzdWx0LCBpZiB0aGUKICAgICogcHJvY2Vzc29yIHN1cHBvcnRzIHRoZSAiaHR0cDovL3htbC5vcmcvdHJheC9mZWF0dXJlcy9kb20vaW5wdXQiCiAgICAqIGZlYXR1cmUuCi0gICAqIEBwYXJhbSBub2RlICBUaGUgaW5wdXQgc291cmNlIG5vZGUsIHdoaWNoIGNhbiBiZSBhbnkgdmFsaWQgRE9NIG5vZGUuCisgICAqICVSRVZJRVclIERvIHdlIG5lZWQgYSBOb2RlIHZlcnNpb24gb2YgdGhpcz8KKyAgICogQHBhcmFtIG5vZGUgIFRoZSBpbnB1dCBzb3VyY2Ugbm9kZSwgd2hpY2ggY2FuIGJlIGFueSB2YWxpZCBEVE0gbm9kZS4KICAgICogQHBhcmFtIG91dHB1dFRhcmdldCBUaGUgb3V0cHV0IHNvdXJjZSB0YXJnZXQuCiAgICAqCiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyB2b2lkIHRyYW5zZm9ybU5vZGUoTm9kZSBub2RlLCBSZXN1bHQgb3V0cHV0VGFyZ2V0KQorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm1Ob2RlKGludCBub2RlLCBSZXN1bHQgb3V0cHV0VGFyZ2V0KQogICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKQEAgLTExODUsMTIgKzEwNjQsMTMgQEAKICAgICogUHJvY2VzcyB0aGUgc291cmNlIG5vZGUgdG8gdGhlIG91dHB1dCByZXN1bHQsIGlmIHRoZQogICAgKiBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlICJodHRwOi8veG1sLm9yZy90cmF4L2ZlYXR1cmVzL2RvbS9pbnB1dCIKICAgICogZmVhdHVyZS4KLSAgICogQHBhcmFtIG5vZGUgIFRoZSBpbnB1dCBzb3VyY2Ugbm9kZSwgd2hpY2ggY2FuIGJlIGFueSB2YWxpZCBET00gbm9kZS4KKyAgICogJVJFVklFVyUgRG8gd2UgbmVlZCBhIE5vZGUgdmVyc2lvbiBvZiB0aGlzPworICAgKiBAcGFyYW0gbm9kZSAgVGhlIGlucHV0IHNvdXJjZSBub2RlLCB3aGljaCBjYW4gYmUgYW55IHZhbGlkIERUTSBub2RlLgogICAgKiBAcGFyYW0gb3V0cHV0VGFyZ2V0IFRoZSBvdXRwdXQgc291cmNlIHRhcmdldC4KICAgICoKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIHZvaWQgdHJhbnNmb3JtTm9kZShOb2RlIG5vZGUpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm1Ob2RlKGludCBub2RlKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSBub3Qgd3JpdGluZyB0byB0aGUgc2FtZSBvdXRwdXQgY29udGVudCBoYW5kbGVyLgogICAgIHN5bmNocm9uaXplZChtX291dHB1dENvbnRlbnRIYW5kbGVyKQpAQCAtMTIyOSw3ICsxMTA5LDcgQEAKICAgCiAgICAgICAgIC8vID09PT09PT09PT09CiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGluZyBhcHBseVRlbXBsYXRlVG9Ob2RlIC0gIitUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7Ci0gICAgICAgIHRoaXMuYXBwbHlUZW1wbGF0ZVRvTm9kZShudWxsLCBudWxsLCBub2RlLCBudWxsKTsKKyAgICAgICAgdGhpcy5hcHBseVRlbXBsYXRlVG9Ob2RlKG51bGwsIG51bGwsIG5vZGUpOwogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgd2l0aCBhcHBseVRlbXBsYXRlVG9Ob2RlIC0gIitUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CiAgIAogICAgICAgICBpZiAobnVsbCAhPSBtX3Jlc3VsdFRyZWVIYW5kbGVyKQpAQCAtMTI4OCw4ICsxMTY4LDkgQEAKIAogICAgIGlmIChudWxsID09IG1faW5wdXRDb250ZW50SGFuZGxlcikKICAgICB7Ci0gICAgICBtX2lucHV0Q29udGVudEhhbmRsZXIgPSBuZXcgU291cmNlVHJlZUhhbmRsZXIodGhpcywgZG9Eb2NGcmFnKTsKLSAgICAgICgoU291cmNlVHJlZUhhbmRsZXIpbV9pbnB1dENvbnRlbnRIYW5kbGVyKS5zZXRVc2VNdWx0aVRocmVhZGluZyh0cnVlKTsKKyAgICAgIC8vICAgICAgaWYobnVsbCA9PSBtX3VybE9mU291cmNlICYmIG51bGwgIT0gbV9zdHlsZXNoZWV0Um9vdCkKKyAgICAgIC8vICAgICAgICBtX3VybE9mU291cmNlID0gbV9zdHlsZXNoZWV0Um9vdC5nZXRCYXNlSWRlbnRpZmllcigpOworICAgICAgbV9pbnB1dENvbnRlbnRIYW5kbGVyID0gbmV3IFRyYW5zZm9ybWVySGFuZGxlckltcGwodGhpcywgZG9Eb2NGcmFnLCBtX3VybE9mU291cmNlKTsKICAgICB9CiAKICAgICByZXR1cm4gbV9pbnB1dENvbnRlbnRIYW5kbGVyOwpAQCAtMTU2Miw3ICsxNDQzLDcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgcHVzaFBhcmFtcygKLSAgICAgICAgICBYUGF0aENvbnRleHQgeGN0eHQsIEVsZW1DYWxsVGVtcGxhdGUgeHNsQ2FsbFRlbXBsYXRlRWxlbWVudCwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlKQorICAgICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCwgRWxlbUNhbGxUZW1wbGF0ZSB4c2xDYWxsVGVtcGxhdGVFbGVtZW50KQogICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIApAQCAtMTU4NywyMCArMTQ2OCwyMiBAQAogCiAgICAgICBpZiAobnVsbCAhPSBwYXJhbSkKICAgICAgIHsKKyAgICAgICAgaW50IHNvdXJjZU5vZGUgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOwogICAgICAgICB2YXIgPSBwYXJhbS5leGVjdXRlKGdldFhQYXRoQ29udGV4dCgpLCBzb3VyY2VOb2RlLCB4c2xQYXJhbUVsZW1lbnQpOwogICAgICAgfQotICAgICAgZWxzZSBpZiAobnVsbCA9PSB4c2xQYXJhbUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKQorICAgICAgZWxzZSBpZiAobnVsbCA9PSB4c2xQYXJhbUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZEVsZW0oKSkKICAgICAgIHsKICAgICAgICAgdmFyID0gWFN0cmluZy5FTVBUWVNUUklORzsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKIAotICAgICAgICAvLyBVc2UgcmVzdWx0IHRyZWUgZnJhZ21lbnQKLSAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBkZiA9IHRyYW5zZm9ybVRvUlRGKHhzbFBhcmFtRWxlbWVudCwgc291cmNlTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUpOworICAgICAgICAgaW50IHNvdXJjZU5vZGUgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOworICAgICAgIC8vIFVzZSByZXN1bHQgdHJlZSBmcmFnbWVudAorICAgICAgIC8vICVSRVZJRVclIE1ha2Ugc3VyZSBjdXJyZW50IG5vZGUgaXMgcHVzaGVkLgorICAgICAgICBpbnQgZGYgPSB0cmFuc2Zvcm1Ub1JURih4c2xQYXJhbUVsZW1lbnQpOwogCi0gICAgICAgIHZhciA9IG5ldyBYUlRyZWVGcmFnKGRmKTsKKyAgICAgICAgdmFyID0gbmV3IFhSVHJlZUZyYWcoZGYsIHhjdHh0KTsKICAgICAgIH0KIAogICAgICAgdmFycy5zZXRTZWFyY2hTdGFydChwYXJhbVJlZmVyZW5jZUNvbnRleHQpOwpAQCAtMTY0MSw3ICsxNTI0LDcgQEAKICAgICoKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHVzaEdsb2JhbFZhcnMoTm9kZSBjb250ZXh0Tm9kZSkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCisgIHByb3RlY3RlZCB2b2lkIHB1c2hHbG9iYWxWYXJzKGludCBjb250ZXh0Tm9kZSkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAogICAgIC8vIEknbSBhIGxpdHRsZSB1bmhhcHB5IHdpdGggdGhpcywgYXMgaXQgc2VlbXMgbGlrZSAKQEAgLTE3NjcsNTYgKzE2NTAsMTcgQEAKICAgICoKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgdHJhbnNmb3JtVG9SVEYoCi0gICAgICAgICAgRWxlbVRlbXBsYXRlRWxlbWVudCB0ZW1wbGF0ZVBhcmVudCwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlKQorICBwdWJsaWMgaW50IHRyYW5zZm9ybVRvUlRGKAorICAgICAgICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgdGVtcGxhdGVQYXJlbnQpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewotCi0gICAgLy8gWFBhdGhDb250ZXh0IHhjdHh0ID0gZ2V0WFBhdGhDb250ZXh0KCk7Ci0gICAgLy8gRG9jdW1lbnQgZG9jRmFjdG9yeSA9IHhjdHh0LmdldERPTUhlbHBlcigpLmdldERPTUZhY3RvcnkoKTsKLSAgICBDb250ZW50SGFuZGxlciBydGZIYW5kbGVyOwotICAgIERvY3VtZW50RnJhZ21lbnQgcmVzdWx0RnJhZ21lbnQ7CisgICAgWFBhdGhDb250ZXh0IHhjdHh0ID0gZ2V0WFBhdGhDb250ZXh0KCk7CiAgICAgCi0gICAgLy8gSWYgdGhpcyBpcyBhbiBTdHJlZSBpbnN0YW5jZSwgaGFuZGxlIGl0IHdpdGggU291cmNlVHJlZUhhbmRsZXIKLSAgICAvLyBhbmQgYnlwYXNzIHRoZSB3aG9sZSBET00gcHJvY2Vzcy4KLSAgICBib29sZWFuIGlzU1RyZWUgPSAoc291cmNlTm9kZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUueGFsYW4uc3RyZWUuQ2hpbGQpOwotICAgIGlmIChpc1NUcmVlKQotICAgIHsgICAgICAKLSAgICAgIHJ0ZkhhbmRsZXIgPSBuZXcgU291cmNlVHJlZUhhbmRsZXIodGhpcywgdHJ1ZSk7Ci0gICAgICAoKFNvdXJjZVRyZWVIYW5kbGVyKXJ0ZkhhbmRsZXIpLnNldFVzZU11bHRpVGhyZWFkaW5nKGZhbHNlKTsKLSAgICAgICgoU291cmNlVHJlZUhhbmRsZXIpcnRmSGFuZGxlcikuc2V0U2hvdWxkVHJhbnNmb3JtQXRFbmQoZmFsc2UpOwotICAgICAgLy8gQ3JlYXRlIGEgUmVzdWx0VHJlZUZyYWcgb2JqZWN0LgotICAgICAgcmVzdWx0RnJhZ21lbnQgPSAoRG9jdW1lbnRGcmFnbWVudCkoKFNvdXJjZVRyZWVIYW5kbGVyKXJ0ZkhhbmRsZXIpLmdldFJvb3QoKTsKLSAgICAgIC8vICgob3JnLmFwYWNoZS54YWxhbi5zdHJlZS5Eb2N1bWVudEZyYWdtZW50SW1wbClyZXN1bHRGcmFnbWVudCkuc2V0Q29tcGxldGUodHJ1ZSk7ICAgICAKLSAgICB9ICAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKG51bGwgPT0gbV9kb2NCdWlsZGVyKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGZhY3RvcnkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgIERUTSBkdG1GcmFnID0geGN0eHQuZ2V0RFRNKG51bGwsIHRydWUsIHRoaXMsIGZhbHNlKTsKKyAgICBDb250ZW50SGFuZGxlciBydGZIYW5kbGVyID0gZHRtRnJhZy5nZXRDb250ZW50SGFuZGxlcigpOwogCi0gICAgICAgICAgZGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgZGZhY3Rvcnkuc2V0VmFsaWRhdGluZyh0cnVlKTsKLQotICAgICAgICAgIG1fZG9jQnVpbGRlciA9IGRmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihwY2UpOyAgLy8iY3JlYXRlRG9jdW1lbnQoKSBub3Qgc3VwcG9ydGVkIGluIFhQYXRoQ29udGV4dCEiKTsKLQotICAgICAgICAgIC8vIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICB9ICAgICAKLSAgICAgIERvY3VtZW50IGRvY0ZhY3RvcnkgPSBtX2RvY0J1aWxkZXIubmV3RG9jdW1lbnQoKTsKLSAgICAgIC8vIENyZWF0ZSBhIFJlc3VsdFRyZWVGcmFnIG9iamVjdC4KLSAgICAgIHJlc3VsdEZyYWdtZW50ID0gZG9jRmFjdG9yeS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7ICAgICAgICAgICAKLSAgICAgIC8vIENyZWF0ZSBhIERPTUJ1aWxkZXIgb2JqZWN0IHRoYXQgd2lsbCBoYW5kbGUgdGhlIFNBWCBldmVudHMgCi0gICAgICAvLyBhbmQgYnVpbGQgdGhlIFJlc3VsdFRyZWVGcmFnIG5vZGVzLgotICAgICAgcnRmSGFuZGxlciA9IG5ldyBET01CdWlsZGVyKGRvY0ZhY3RvcnksIHJlc3VsdEZyYWdtZW50KTsKLSAgICB9CisgICAgLy8gQ3JlYXRlIGEgUmVzdWx0VHJlZUZyYWcgb2JqZWN0LgorICAgIGludCByZXN1bHRGcmFnbWVudCA9IHJlc3VsdEZyYWdtZW50ID0gZHRtRnJhZy5nZXREb2N1bWVudCgpOwogCiAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCByZXN1bHQgdHJlZSBoYW5kbGVyLgogICAgIFJlc3VsdFRyZWVIYW5kbGVyIHNhdmVkUlRyZWVIYW5kbGVyID0gdGhpcy5tX3Jlc3VsdFRyZWVIYW5kbGVyOwpAQCAtMTgzMiw3ICsxNjc2LDcgQEAKICAgICAgIHRyeQogICAgICAgewogICAgICAgICAvLyBEbyB0aGUgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGNoaWxkIGVsZW1lbnRzLgotICAgICAgICBleGVjdXRlQ2hpbGRUZW1wbGF0ZXModGVtcGxhdGVQYXJlbnQsIHNvdXJjZU5vZGUsIG1vZGUsIHRydWUpOworICAgICAgICBleGVjdXRlQ2hpbGRUZW1wbGF0ZXModGVtcGxhdGVQYXJlbnQsIHRydWUpOwogICAgICAgICAKICAgICAgICAgLy8gTWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgZmx1c2hlZCEKICAgICAgICAgcnRoLmZsdXNoUGVuZGluZygpOwpAQCAtMTg0OSw4ICsxNjkzLDggQEAKIAogICAgIGZpbmFsbHkKICAgICB7Ci0gICAgLy8gUmVzdG9yZSB0aGUgcHJldmlvdXMgcmVzdWx0IHRyZWUgaGFuZGxlci4KLSAgICB0aGlzLm1fcmVzdWx0VHJlZUhhbmRsZXIgPSBzYXZlZFJUcmVlSGFuZGxlcjsKKyAgICAgIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIHJlc3VsdCB0cmVlIGhhbmRsZXIuCisgICAgICB0aGlzLm1fcmVzdWx0VHJlZUhhbmRsZXIgPSBzYXZlZFJUcmVlSGFuZGxlcjsKICAgICB9CiAgICAgCiAgICAgcmV0dXJuIHJlc3VsdEZyYWdtZW50OwpAQCAtMTg4NSw3ICsxNzI5LDcgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIFN0cmluZyB0cmFuc2Zvcm1Ub1N0cmluZygKLSAgICAgICAgICBFbGVtVGVtcGxhdGVFbGVtZW50IGVsZW0sIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSkKKyAgICAgICAgICBFbGVtVGVtcGxhdGVFbGVtZW50IGVsZW0pCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCkBAIC0xOTE2LDcgKzE3NjAsNyBAQAogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewotCisgICAgICAgIC8vIExlYXZlIENvbW1lbnRlZC4gIC1zYgogICAgICAgICAvLyBzZXJpYWxpemVyLnNldFdyaXRlcihzdyk7CiAgICAgICAgIC8vIHNlcmlhbGl6ZXIuc2V0T3V0cHV0Rm9ybWF0KG1fdGV4dGZvcm1hdCk7CiAgICAgICAgIC8vIENvbnRlbnRIYW5kbGVyIHNoYW5kbGVyID0gc2VyaWFsaXplci5hc0NvbnRlbnRIYW5kbGVyKCk7CkBAIC0xOTM1LDcgKzE3NzksNyBAQAogICAgICAgdGhpcy5tX3Jlc3VsdFRyZWVIYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKIAogICAgICAgLy8gRG8gdGhlIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBjaGlsZCBlbGVtZW50cy4KLSAgICAgIGV4ZWN1dGVDaGlsZFRlbXBsYXRlcyhlbGVtLCBzb3VyY2VOb2RlLCBtb2RlLCB0cnVlKTsKKyAgICAgIGV4ZWN1dGVDaGlsZFRlbXBsYXRlcyhlbGVtLCB0cnVlKTsKICAgICAgIHRoaXMubV9yZXN1bHRUcmVlSGFuZGxlci5lbmREb2N1bWVudCgpOwogCiAgICAgICByZXN1bHQgPSBzdy50b1N0cmluZygpOwpAQCAtMTk3OCwxMiArMTgyMiwxMSBAQAogICAgKiBAcmV0dXJuIHRydWUgaWYgYXBwbGllZCBhIHRlbXBsYXRlLCBmYWxzZSBpZiBub3QuCiAgICAqLwogICBwdWJsaWMgYm9vbGVhbiBhcHBseVRlbXBsYXRlVG9Ob2RlKEVsZW1UZW1wbGF0ZUVsZW1lbnQgeHNsSW5zdHJ1Y3Rpb24sICAvLyB4c2w6YXBwbHktdGVtcGxhdGVzIG9yIHhzbDpmb3ItZWFjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgdGVtcGxhdGUsICAvLyBtYXkgYmUgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBjaGlsZCwgUU5hbWUgbW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtVGVtcGxhdGVFbGVtZW50IHRlbXBsYXRlLCBpbnQgY2hpbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7Ci0KLSAgICBzaG9ydCBub2RlVHlwZSA9IGNoaWxkLmdldE5vZGVUeXBlKCk7CisgICAgRFRNIGR0bSA9IG1feGNvbnRleHQuZ2V0RFRNKGNoaWxkKTsKKyAgICBzaG9ydCBub2RlVHlwZSA9ICBkdG0uZ2V0Tm9kZVR5cGUoY2hpbGQpOwogICAgIGJvb2xlYW4gaXNEZWZhdWx0VGV4dFJ1bGUgPSBmYWxzZTsKIAogICAgIGlmIChudWxsID09IHRlbXBsYXRlKQpAQCAtMjAxMSw2ICsxODU0LDggQEAKICAgICAgIHRyeQogICAgICAgewogICAgICAgICB4Y3R4dC5zZXROYW1lc3BhY2VDb250ZXh0KHhzbEluc3RydWN0aW9uKTsKKworICAgICAgICBRTmFtZSBtb2RlID0gdGhpcy5nZXRNb2RlKCk7CiAgICAgICAgIHRlbXBsYXRlID0gbV9zdHlsZXNoZWV0Um9vdC5nZXRUZW1wbGF0ZUNvbXBvc2VkKHhjdHh0LCBjaGlsZCwgbW9kZSwgbWF4SW1wb3J0TGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9xdWlldENvbmZsaWN0V2FybmluZ3MpOwogICAgICAgfQpAQCAtMjAyNSwxNyArMTg3MCwxNyBAQAogICAgICAgewogICAgICAgICBzd2l0Y2ggKG5vZGVUeXBlKQogICAgICAgICB7Ci0gICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFIDoKLSAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6CisgICAgICAgIGNhc2UgRFRNLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgOgorICAgICAgICBjYXNlIERUTS5FTEVNRU5UX05PREUgOgogICAgICAgICAgIHRlbXBsYXRlID0gbV9zdHlsZXNoZWV0Um9vdC5nZXREZWZhdWx0UnVsZSgpOwogICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6CisgICAgICAgIGNhc2UgRFRNLkNEQVRBX1NFQ1RJT05fTk9ERSA6CisgICAgICAgIGNhc2UgRFRNLlRFWFRfTk9ERSA6CisgICAgICAgIGNhc2UgRFRNLkFUVFJJQlVURV9OT0RFIDoKICAgICAgICAgICB0ZW1wbGF0ZSA9IG1fc3R5bGVzaGVldFJvb3QuZ2V0RGVmYXVsdFRleHRSdWxlKCk7CiAgICAgICAgICAgaXNEZWZhdWx0VGV4dFJ1bGUgPSB0cnVlOwogICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6CisgICAgICAgIGNhc2UgRFRNLkRPQ1VNRU5UX05PREUgOgogICAgICAgICAgIHRlbXBsYXRlID0gbV9zdHlsZXNoZWV0Um9vdC5nZXREZWZhdWx0Um9vdFJ1bGUoKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdCA6CkBAIC0yMDU4LDI3ICsxOTAzLDIyIEBACiAgICAgICB7CiAgICAgICAgIHN3aXRjaCAobm9kZVR5cGUpCiAgICAgICAgIHsKLSAgICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgorICAgICAgICBjYXNlIERUTS5DREFUQV9TRUNUSU9OX05PREUgOgorICAgICAgICBjYXNlIERUTS5URVhUX05PREUgOgogICAgICAgICAgIG1fcmVzdWx0VHJlZUhhbmRsZXIubV9jbG9uZXIuY2xvbmVUb1Jlc3VsdFRyZWUoY2hpbGQsIGZhbHNlKTsKICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB2YWwgPSAoKEF0dHIpIGNoaWxkKS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKS5jaGFyYWN0ZXJzKHZhbC50b0NoYXJBcnJheSgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwubGVuZ3RoKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERUTS5BVFRSSUJVVEVfTk9ERSA6CisgICAgICAgICAgZHRtLmRpc3BhdGNoQ2hhcmFjdGVyc0V2ZW50cyhjaGlsZCwgZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKSk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKIAogICAgICAgICAvLyBGaXJlIGEgdHJhY2UgZXZlbnQgZm9yIHRoZSB0ZW1wbGF0ZS4KLQotICAgICAgICBpZiAoVHJhbnNmb3JtZXJJbXBsLlNfREVCVUcpCi0gICAgICAgICAgZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQoY2hpbGQsIG1vZGUsIHRlbXBsYXRlKTsKKyAgICAgICAgLy8gCisvLyAgICAgICAgaWYgKFRyYW5zZm9ybWVySW1wbC5TX0RFQlVHKQorLy8gICAgICAgICAgZ2V0VHJhY2VNYW5hZ2VyKCkuZmlyZVRyYWNlRXZlbnQoY2hpbGQsIG1vZGUsIHRlbXBsYXRlKTsKIAogICAgICAgICAvLyBBbmQgZXhlY3V0ZSB0aGUgY2hpbGQgdGVtcGxhdGVzLgogICAgICAgICAvLyA5LzExLzAwOiBJZiB0ZW1wbGF0ZSBoYXMgYmVlbiBjb21waWxlZCwgaGFuZCBvZmYgdG8gaXQKQEAgLTIwOTIsMTAgKzE5MzIsNyBAQAogCiAgICAgICAgIG1feGNvbnRleHQuc2V0U0FYTG9jYXRvcih0ZW1wbGF0ZSk7CiAKLSAgICAgICAgaWYgKHRlbXBsYXRlLmlzQ29tcGlsZWRUZW1wbGF0ZSgpKQotICAgICAgICAgIHRlbXBsYXRlLmV4ZWN1dGUodGhpcywgY2hpbGQsIG1vZGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZXhlY3V0ZUNoaWxkVGVtcGxhdGVzKHRlbXBsYXRlLCBjaGlsZCwgbW9kZSwgdHJ1ZSk7CisgICAgICAgIGV4ZWN1dGVDaGlsZFRlbXBsYXRlcyh0ZW1wbGF0ZSwgdHJ1ZSk7CiAgICAgICB9CiAgICAgfQogICAgIGNhdGNoKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzZSkKQEAgLTIxMTEsMTAgKzE5NDgsMTEgQEAKIAogICAgIHJldHVybiB0cnVlOwogICB9Ci0KKyAgCiAgIC8qKgogICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KLSAgICogRXhlY3V0ZSBlYWNoIG9mIHRoZSBjaGlsZHJlbiBvZiBhIHRlbXBsYXRlIGVsZW1lbnQuCisgICAqIEV4ZWN1dGUgZWFjaCBvZiB0aGUgY2hpbGRyZW4gb2YgYSB0ZW1wbGF0ZSBlbGVtZW50LiAgVGhpcyBtZXRob2QgCisgICAqIGlzIG9ubHkgZm9yIGV4dGVuc2lvbiB1c2UuCiAgICAqCiAgICAqIEBwYXJhbSBlbGVtIFRoZSBFbGVtVGVtcGxhdGVFbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGNoaWxkcmVuIAogICAgKiB0aGF0IHNob3VsZCBleGVjdXRlLgpAQCAtMjEyNiw3ICsxOTY0LDM5IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVDaGlsZFRlbXBsYXRlcygKLSAgICAgICAgICBFbGVtVGVtcGxhdGVFbGVtZW50IGVsZW0sIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSwgQ29udGVudEhhbmRsZXIgaGFuZGxlcikKKyAgICAgICAgICBFbGVtVGVtcGxhdGVFbGVtZW50IGVsZW0sIG9yZy53M2MuZG9tLk5vZGUgY29udGV4dCwgUU5hbWUgbW9kZSwgCisgICAgICAgICAgIENvbnRlbnRIYW5kbGVyIGhhbmRsZXIpCisgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KKyAgeworICAgIFhQYXRoQ29udGV4dCB4Y3R4dCA9IGdldFhQYXRoQ29udGV4dCgpOworICAgIHRyeQorICAgIHsKKyAgICAgIHhjdHh0LnB1c2hDdXJyZW50Tm9kZSgKKyAgICAgICAgICAgeGN0eHQuZ2V0RFRNSGFuZGxlRnJvbU5vZGUoY29udGV4dCkpOworICAgICAgICAgICAgIAorICAgICAgZXhlY3V0ZUNoaWxkVGVtcGxhdGVzKCBlbGVtLCBoYW5kbGVyKTsKKyAgICB9CisgICAgZmluYWxseQorICAgIHsKKyAgICAgIHhjdHh0LnBvcEN1cnJlbnROb2RlKCk7CisgICAgICBpZihudWxsICE9IG1vZGUpCisgICAgICAgIHBvcE1vZGUoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImFkdmFuY2VkIi8+CisgICAqIEV4ZWN1dGUgZWFjaCBvZiB0aGUgY2hpbGRyZW4gb2YgYSB0ZW1wbGF0ZSBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gZWxlbSBUaGUgRWxlbVRlbXBsYXRlRWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBjaGlsZHJlbiAKKyAgICogdGhhdCBzaG91bGQgZXhlY3V0ZS4KKyAgICogQHBhcmFtIGhhbmRsZXIgVGhlIENvbnRlbnRIYW5kbGVyIHRvIHdoZXJlIHRoZSByZXN1bHQgZXZlbnRzIAorICAgKiBzaG91bGQgYmUgZmVkLgorICAgKiAKKyAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIHZvaWQgZXhlY3V0ZUNoaWxkVGVtcGxhdGVzKAorICAgICAgICAgIEVsZW1UZW1wbGF0ZUVsZW1lbnQgZWxlbSwgQ29udGVudEhhbmRsZXIgaGFuZGxlcikKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKQEAgLTIxNDIsNyArMjAxMiw4IEBACiAgICAgewogICAgICAgZ2V0UmVzdWx0VHJlZUhhbmRsZXIoKS5mbHVzaFBlbmRpbmcoKTsKICAgICAgIHRoaXMuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICBleGVjdXRlQ2hpbGRUZW1wbGF0ZXMoZWxlbSwgc291cmNlTm9kZSwgbW9kZSwgdHJ1ZSk7CisgICAgICAvLyAlUkVWSUVXJSBNYWtlIHN1cmUgY3VycmVudCBub2RlIGlzIGJlaW5nIHB1c2hlZC4KKyAgICAgIGV4ZWN1dGVDaGlsZFRlbXBsYXRlcyhlbGVtLCB0cnVlKTsKICAgICB9CiAgICAgY2F0Y2gob3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHNlKQogICAgIHsKQEAgLTIxNzMsNyArMjA0NCw3IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVDaGlsZFRlbXBsYXRlcygKLSAgICAgICAgICBFbGVtVGVtcGxhdGVFbGVtZW50IGVsZW0sIE5vZGUgc291cmNlTm9kZSwgUU5hbWUgbW9kZSwgYm9vbGVhbiBzaG91bGRBZGRBdHRycykKKyAgICAgICAgICBFbGVtVGVtcGxhdGVFbGVtZW50IGVsZW0sIGJvb2xlYW4gc2hvdWxkQWRkQXR0cnMpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCkBAIC0yMTg5LDcgKzIwNjAsNyBAQAogICAgIGJvb2xlYW4gY2hlY2sgPSAobV9zdGFja0d1YXJkLm1fcmVjdXJzaW9uTGltaXQgPiAtMSk7CiAKICAgICBpZiAoY2hlY2spCi0gICAgICBnZXRTdGFja0d1YXJkKCkucHVzaChlbGVtLCBzb3VyY2VOb2RlKTsKKyAgICAgIGdldFN0YWNrR3VhcmQoKS5wdXNoKGVsZW0sIHhjdHh0LmdldEN1cnJlbnROb2RlKCkpOwogCiAgICAgLy8gV2UgbmVlZCB0byBwdXNoIGFuIGVsZW1lbnQgZnJhbWUgaW4gdGhlIHZhcmlhYmxlcyBzdGFjaywgCiAgICAgLy8gc28gYWxsIHRoZSB2YXJpYWJsZXMgY2FuIGJlIHBvcHBlZCBhdCBvbmNlIHdoZW4gd2UncmUgZG9uZS4KQEAgLTIyMTEsOCArMjA4Miw4IEBACiAgICAgICAgIGlmKCFzaG91bGRBZGRBdHRycyAmJiB0LmdldFhTTFRva2VuKCkgPT0gQ29uc3RhbnRzLkVMRU1OQU1FX0FUVFJJQlVURSkKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgeGN0eHQuc2V0U0FYTG9jYXRvcih0KTsKLSAgICAgICAgbV9jdXJyZW50VGVtcGxhdGVFbGVtZW50cy5zZXRUYWlsKHQpOwotICAgICAgICB0LmV4ZWN1dGUodGhpcywgc291cmNlTm9kZSwgbW9kZSk7CisgICAgICAgIG1fY3VycmVudFRlbXBsYXRlRWxlbWVudHMuc2V0RWxlbWVudEF0KHQsIG1fY3VycmVudFRlbXBsYXRlRWxlbWVudHMuc2l6ZSgpLTEpOworICAgICAgICB0LmV4ZWN1dGUodGhpcyk7CiAgICAgICB9CiAgICAgfQogICAgIGZpbmFsbHkKQEAgLTIyNDMsNyArMjExNCw3IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyBWZWN0b3IgcHJvY2Vzc1NvcnRLZXlzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtRm9yRWFjaCBmb3JlYWNoLCBOb2RlIHNvdXJjZU5vZGVDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtRm9yRWFjaCBmb3JlYWNoLCBpbnQgc291cmNlTm9kZUNvbnRleHQpCiAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIApAQCAtMjMzOCw3ICsyMjA5LDcgQEAKICAgICovCiAgIHB1YmxpYyB2b2lkIHB1c2hFbGVtVGVtcGxhdGVFbGVtZW50KEVsZW1UZW1wbGF0ZUVsZW1lbnQgZWxlbSkKICAgewotICAgIG1fY3VycmVudFRlbXBsYXRlRWxlbWVudHMucHVzaChlbGVtKTsKKyAgICAgbV9jdXJyZW50VGVtcGxhdGVFbGVtZW50cy5wdXNoKGVsZW0pOwogICB9CiAKICAgLyoqCkBAIC0yMzU4LDcgKzIyMjksNyBAQAogICAgKi8KICAgcHVibGljIHZvaWQgc2V0Q3VycmVudEVsZW1lbnQoRWxlbVRlbXBsYXRlRWxlbWVudCBlKQogICB7Ci0gICAgbV9jdXJyZW50VGVtcGxhdGVFbGVtZW50cy5zZXRUYWlsKGUpOworICAgIG1fY3VycmVudFRlbXBsYXRlRWxlbWVudHMuc2V0RWxlbWVudEF0KGUsIG1fY3VycmVudFRlbXBsYXRlRWxlbWVudHMuc2l6ZSgpLTEpOwogICB9CiAKICAgLyoqCkBAIC0yMzcwLDcgKzIyNDEsNyBAQAogICAgKi8KICAgcHVibGljIEVsZW1UZW1wbGF0ZUVsZW1lbnQgZ2V0Q3VycmVudEVsZW1lbnQoKQogICB7Ci0gICAgcmV0dXJuIChFbGVtVGVtcGxhdGVFbGVtZW50KSBtX2N1cnJlbnRUZW1wbGF0ZUVsZW1lbnRzLnBlZXBUYWlsKCk7CisgICAgcmV0dXJuIChFbGVtVGVtcGxhdGVFbGVtZW50KSBtX2N1cnJlbnRUZW1wbGF0ZUVsZW1lbnRzLnBlZWsoKTsKICAgfQogCiAgIC8qKgpAQCAtMjM3OSw3ICsyMjUwLDcgQEAKICAgICoKICAgICogQHJldHVybiBUaGUgY3VycmVudCBjb250ZXh0IG5vZGUgKHNob3VsZCBuZXZlciBiZSBudWxsPykuCiAgICAqLwotICBwdWJsaWMgTm9kZSBnZXRDdXJyZW50Tm9kZSgpCisgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudE5vZGUoKQogICB7CiAgICAgcmV0dXJuIG1feGNvbnRleHQuZ2V0Q3VycmVudE5vZGUoKTsKICAgfQpAQCAtMjQxNiw5ICsyMjg3LDEwIEBACiAgICAqIEBwYXJhbSB0ZW1wbGF0ZSB4c2w6dGVtcGxhdGUgb3IgeHNsOmZvci1lYWNoLgogICAgKiBAcGFyYW0gY2hpbGQgVGhlIGNoaWxkIHRoYXQgd2FzIG1hdGNoZWQuCiAgICAqLwotICBwdWJsaWMgdm9pZCBwdXNoUGFpckN1cnJlbnRNYXRjaGVkKEVsZW1UZW1wbGF0ZUVsZW1lbnQgdGVtcGxhdGUsIE5vZGUgY2hpbGQpCisgIHB1YmxpYyB2b2lkIHB1c2hQYWlyQ3VycmVudE1hdGNoZWQoRWxlbVRlbXBsYXRlRWxlbWVudCB0ZW1wbGF0ZSwgaW50IGNoaWxkKQogICB7Ci0gICAgbV9jdXJyZW50TWF0Y2hUZW1wbGF0ZXMucHVzaFBhaXIodGVtcGxhdGUsIGNoaWxkKTsKKyAgICBtX2N1cnJlbnRNYXRjaFRlbXBsYXRlcy5wdXNoKHRlbXBsYXRlKTsKKyAgICBtX2N1cnJlbnRNYXRjaGVkTm9kZXMucHVzaChjaGlsZCk7CiAgIH0KIAogICAvKioKQEAgLTI0MjYsNyArMjI5OCw4IEBACiAgICAqLwogICBwdWJsaWMgdm9pZCBwb3BDdXJyZW50TWF0Y2hlZCgpCiAgIHsKLSAgICBtX2N1cnJlbnRNYXRjaFRlbXBsYXRlcy5wb3BQYWlyKCk7CisgICAgbV9jdXJyZW50TWF0Y2hUZW1wbGF0ZXMucG9wKCk7CisgICAgbV9jdXJyZW50TWF0Y2hlZE5vZGVzLnBvcCgpOwogICB9CiAKICAgLyoqCkBAIC0yNDQwLDcgKzIzMTMsNyBAQAogICAgKi8KICAgcHVibGljIEVsZW1UZW1wbGF0ZSBnZXRNYXRjaGVkVGVtcGxhdGUoKQogICB7Ci0gICAgcmV0dXJuIChFbGVtVGVtcGxhdGUpIG1fY3VycmVudE1hdGNoVGVtcGxhdGVzLnBlZXBUYWlsU3ViMSgpOworICAgIHJldHVybiAoRWxlbVRlbXBsYXRlKSBtX2N1cnJlbnRNYXRjaFRlbXBsYXRlcy5wZWVrKCk7CiAgIH0KIAogICAvKioKQEAgLTI0NTAsOSArMjMyMyw5IEBACiAgICAqIEByZXR1cm4gVGhlIG1hdGNoZWQgbm9kZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSAKICAgICogbWF0Y2ggYXR0cmlidXRlIG9mIHRoZSBjdXJyZW50IHhzbDp0ZW1wbGF0ZS4KICAgICovCi0gIHB1YmxpYyBOb2RlIGdldE1hdGNoZWROb2RlKCkKKyAgcHVibGljIGludCBnZXRNYXRjaGVkTm9kZSgpCiAgIHsKLSAgICByZXR1cm4gbV9jdXJyZW50TWF0Y2hUZW1wbGF0ZXMucGVlcFRhaWwoKTsKKyAgICByZXR1cm4gbV9jdXJyZW50TWF0Y2hlZE5vZGVzLnBlZXBUYWlsKCk7CiAgIH0KIAogICAvKioKQEAgLTI0NjAsNyArMjMzMyw3IEBACiAgICAqCiAgICAqIEByZXR1cm4gQSByZXNldCBjbG9uZSBvZiB0aGUgY29udGV4dCBub2RlIGxpc3QuCiAgICAqLwotICBwdWJsaWMgTm9kZUl0ZXJhdG9yIGdldENvbnRleHROb2RlTGlzdCgpCisgIHB1YmxpYyBEVE1JdGVyYXRvciBnZXRDb250ZXh0Tm9kZUxpc3QoKQogICB7CiAKICAgICB0cnkKQEAgLTI4MjUsNiArMjY5OCwyNSBAQAogCiAgICAgdGhyb3cgbmV3IFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24obmFtZSk7CiAgIH0KKyAgCisgIC8vICVUT0RPJSBEb2MKKyAgcHVibGljIFFOYW1lIGdldE1vZGUoKQorICB7CisgICAgcmV0dXJuIG1fbW9kZXMuaXNFbXB0eSgpID8gbnVsbCA6IChRTmFtZSltX21vZGVzLnBlZWsoKTsKKyAgfQorICAKKyAgLy8gJVRPRE8lIERvYworICBwdWJsaWMgdm9pZCBwdXNoTW9kZShRTmFtZSBtb2RlKQorICB7CisgICAgbV9tb2Rlcy5wdXNoKG1vZGUpOworICB9CisgIAorICAvLyAlVE9ETyUgRG9jCisgIHB1YmxpYyB2b2lkIHBvcE1vZGUoKQorICB7CisgICAgbV9tb2Rlcy5wb3AoKTsKKyAgfQorCiAKICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgIC8vIEltcGxlbWVudCBSdW5uYWJsZSAvLyAgCkBAIC0yODU3LDE1ICsyNzQ5LDM5IEBACiAgIH0KIAogICAvKioKKyAgICogU2V0IHRoZSBleGNlcHRpb24gdGhyb3duIGJ5IHRoZSBzZWNvbmRhcnkgdGhyZWFkIChub3JtYWxseSAKKyAgICogdGhlIHRyYW5zZm9ybSB0aHJlYWQpLgorICAgKgorICAgKiBAcGFyYW0gZSBUaGUgdGhyb3duIGV4Y2VwdGlvbiwgb3IgbnVsbCBpZiBubyBleGNlcHRpb24gd2FzIAorICAgKiB0aHJvd24uCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb25UaHJvd24oRXhjZXB0aW9uIGUpCisgIHsKKyAgICBtX2V4Y2VwdGlvblRocm93biA9IGU7CisgIH0KKworICAvKioKICAgICogVGhpcyBpcyBqdXN0IGEgd2F5IHRvIHNldCB0aGUgZG9jdW1lbnQgZm9yIHJ1bigpLgogICAgKgogICAgKiBAcGFyYW0gZG9jIEEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIHRoZSByb290IG9mIHRoZSAKICAgICogdHJlZSB0byBiZSB0cmFuc2Zvcm1lZC4KICAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNvdXJjZVRyZWVEb2NGb3JUaHJlYWQoTm9kZSBkb2MpCisgIHB1YmxpYyB2b2lkIHNldFNvdXJjZVRyZWVEb2NGb3JUaHJlYWQoaW50IGRvYykKICAgewogICAgIG1fZG9jID0gZG9jOwogICB9CisgIAorICAKKyAgLyoqIFNldCB0aGUgaW5wdXQgc291cmNlIGZvciB0aGUgc291cmNlIHRyZWUsIHdoaWNoIGlzIG5lZWRlZCBpZiB0aGUgCisgICAqIHBhcnNlIHRocmVhZCBpcyBub3QgdGhlIG1haW4gdGhyZWFkLCBpbiBvcmRlciBmb3IgdGhlIHBhcnNlIAorICAgKiB0aHJlYWQncyBydW4gbWV0aG9kIHRvIGdldCB0byB0aGUgaW5wdXQgc291cmNlLiAgCisgICAqIAorICAgKiBAcGFyYW0gc291cmNlIFRoZSBpbnB1dCBzb3VyY2UgZm9yIHRoZSBzb3VyY2UgdHJlZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFhNTFNvdXJjZShTb3VyY2Ugc291cmNlKQorICB7CisgICAgbV94bWxTb3VyY2UgPSBzb3VyY2U7CisgIH0KIAogICAvKioKICAgICogVGVsbCBpZiB0aGUgdHJhbnNmb3JtIG1ldGhvZCBpcyBjb21wbGV0ZWQuCkBAIC0yODgyLDYgKzI3OTgsMjAgQEAKICAgfQogCiAgIC8qKgorICAgKiBTZXQgaWYgdGhlIHRyYW5zZm9ybSBtZXRob2QgaXMgY29tcGxldGVkLgorICAgKgorICAgKiBAcGFyYW0gZG9uZSBUcnVlIGlmIHRyYW5zZm9ybU5vZGUgaGFzIGNvbXBsZXRlZCwgb3IgCisgICAqIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0SXNUcmFuc2Zvcm1Eb25lKGJvb2xlYW4gZG9uZSkKKyAgeworICAgIHN5bmNocm9uaXplZCh0aGlzKQorICAgIHsKKyAgICAgIG1faXNUcmFuc2Zvcm1Eb25lID0gZG9uZTsKKyAgICB9CisgIH0KKworICAvKioKICAgICogRnJvbSBhIHNlY29uZGFyeSB0aHJlYWQsIHBvc3QgdGhlIGV4Y2VwdGlvbiwgc28gdGhhdAogICAgKiBpdCBjYW4gYmUgcGlja2VkIHVwIGZyb20gdGhlIG1haW4gdGhyZWFkLgogICAgKgpAQCAtMjg5NSwxOSArMjgyNSwyMCBAQAogLy8gICAgICAvLyBDb25zaWRlciByZS10aHJvd2luZyB0aGUgZXhjZXB0aW9uIGlmIHRoaXMgZmxhZyBpcyBzZXQuCiAvLyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAvLyAgICB9Ci0gICAgICAKLSAgICBpZiAobV9pbnB1dENvbnRlbnRIYW5kbGVyIGluc3RhbmNlb2YgU291cmNlVHJlZUhhbmRsZXIpCi0gICAgewotICAgICAgU291cmNlVHJlZUhhbmRsZXIgc3RoID0gKFNvdXJjZVRyZWVIYW5kbGVyKSBtX2lucHV0Q29udGVudEhhbmRsZXI7Ci0KLSAgICAgIHN0aC5zZXRFeGNlcHRpb25UaHJvd24oZSk7Ci0gICAgfQorICAKKyAgICAvLyAlUkVWSUVXIE5lZWQgRFRNIGVxdWl2ZWxlbnQ/ICAgIAorLy8gICAgaWYgKG1faW5wdXRDb250ZW50SGFuZGxlciBpbnN0YW5jZW9mIFNvdXJjZVRyZWVIYW5kbGVyKQorLy8gICAgeworLy8gICAgICBTb3VyY2VUcmVlSGFuZGxlciBzdGggPSAoU291cmNlVHJlZUhhbmRsZXIpIG1faW5wdXRDb250ZW50SGFuZGxlcjsKKy8vCisvLyAgICAgIHN0aC5zZXRFeGNlcHRpb25UaHJvd24oZSk7CisvLyAgICB9CiAgICAgQ29udGVudEhhbmRsZXIgY2ggPSBnZXRDb250ZW50SGFuZGxlcigpOwotICAgIGlmKGNoIGluc3RhbmNlb2YgU291cmNlVHJlZUhhbmRsZXIpCi0gICAgewotICAgICAgU291cmNlVHJlZUhhbmRsZXIgc3RoID0gKFNvdXJjZVRyZWVIYW5kbGVyKSBjaDsKLSAgICAgICgoVHJhbnNmb3JtZXJJbXBsKShzdGguZ2V0VHJhbnNmb3JtZXIoKSkpLnBvc3RFeGNlcHRpb25Gcm9tVGhyZWFkKGUpOwotICAgIH0KKy8vICAgIGlmKGNoIGluc3RhbmNlb2YgU291cmNlVHJlZUhhbmRsZXIpCisvLyAgICB7CisvLyAgICAgIFNvdXJjZVRyZWVIYW5kbGVyIHN0aCA9IChTb3VyY2VUcmVlSGFuZGxlcikgY2g7CisvLyAgICAgICgoVHJhbnNmb3JtZXJJbXBsKShzdGguZ2V0VHJhbnNmb3JtZXIoKSkpLnBvc3RFeGNlcHRpb25Gcm9tVGhyZWFkKGUpOworLy8gICAgfQogCiAgICAgbV9pc1RyYW5zZm9ybURvbmUgPSB0cnVlOwogICAgIG1fZXhjZXB0aW9uVGhyb3duID0gZTsKQEAgLTI5NDMsMzkgKzI4NzQsMzggQEAKIAogICAgIHRyeQogICAgIHsKLSAgICAgIC8vIE5vZGUgbiA9ICgoU291cmNlVHJlZUhhbmRsZXIpZ2V0SW5wdXRDb250ZW50SGFuZGxlcigpKS5nZXRSb290KCk7CisgICAgICAvLyBpbnQgbiA9ICgoU291cmNlVHJlZUhhbmRsZXIpZ2V0SW5wdXRDb250ZW50SGFuZGxlcigpKS5nZXREVE1Sb290KCk7CiAgICAgICAvLyB0cmFuc2Zvcm1Ob2RlKG4pOwotICAgICAgaWYgKGlzUGFyc2VyRXZlbnRzT25NYWluKCkpCisgICAgICB0cnkKICAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBtX2lzVHJhbnNmb3JtRG9uZSA9IGZhbHNlOwotCi0gICAgICAgICAgdHJhbnNmb3JtTm9kZShtX2RvYyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU3RyYW5nZSB0aGF0IHRoZSBvdGhlciBjYXRjaCB3b24ndCBjYXRjaCB0aGlzLi4uCi0gICAgICAgICAgcG9zdEV4Y2VwdGlvbkZyb21UaHJlYWQoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgbV9pc1RyYW5zZm9ybURvbmUgPSB0cnVlOwotCi0gICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vdGlmeUFsbCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtX2lzVHJhbnNmb3JtRG9uZSA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgdHJhbnNmb3JtTm9kZShtX2RvYyk7CiAgICAgICB9Ci0gICAgICBlbHNlCisgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICB7Ci0gICAgICAgIElucHV0U291cmNlIGlzb3VyY2UgPSBTQVhTb3VyY2Uuc291cmNlVG9JbnB1dFNvdXJjZShtX3htbFNvdXJjZSk7Ci0gICAgICAgIGdldFhQYXRoQ29udGV4dCgpLmdldFByaW1hcnlSZWFkZXIoKS5wYXJzZShpc291cmNlKTsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgLy8gU3RyYW5nZSB0aGF0IHRoZSBvdGhlciBjYXRjaCB3b24ndCBjYXRjaCB0aGlzLi4uCisgICAgICAgIHBvc3RFeGNlcHRpb25Gcm9tVGhyZWFkKGUpOworICAgICAgfQorICAgICAgZmluYWxseQorICAgICAgeworICAgICAgICBtX2lzVHJhbnNmb3JtRG9uZSA9IHRydWU7CisKKyAgICAgICAgaWYobV9pbnB1dENvbnRlbnRIYW5kbGVyIGluc3RhbmNlb2YgVHJhbnNmb3JtZXJIYW5kbGVySW1wbCkKKyAgICAgICAgeworICAgICAgICAgICgoVHJhbnNmb3JtZXJIYW5kbGVySW1wbCltX2lucHV0Q29udGVudEhhbmRsZXIpLmNsZWFyQ29Sb3V0aW5lKCk7CisgICAgICAgIH0KKworLy8gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKKy8vICAgICAgICB7CisvLyAgICAgICAgICBub3RpZnlBbGwoKTsKKy8vICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICB7CisgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgcG9zdEV4Y2VwdGlvbkZyb21UaHJlYWQoZSk7CiAgICAgfQogICB9CkBAIC0zMDAwLDUgKzI5MzAsNDAgQEAKICAgewogICB9CiAgIAorICAvKioKKyAgICogVGVzdCB3aGV0aGVyIHdoaXRlc3BhY2Utb25seSB0ZXh0IG5vZGVzIGFyZSB2aXNpYmxlIGluIHRoZSBsb2dpY2FsIAorICAgKiB2aWV3IG9mIDxjb2RlPkRUTTwvY29kZT4uIE5vcm1hbGx5LCB0aGlzIGZ1bmN0aW9uCisgICAqIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5EVE08L2NvZGU+OyAKKyAgICogaXQgaXMgbm90IG5vcm1hbGx5IGNhbGxlZCBkaXJlY3RseSBmcm9tCisgICAqIHVzZXIgY29kZS4KKyAgICogCisgICAqIEBwYXJhbSBlbGVtZW50SGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIGVsZW1lbnQuCisgICAqIEByZXR1cm4gb25lIG9mIE5PVFNUUklQLCBTVFJJUCwgb3IgSU5IRVJJVC4KKyAgICovCisgIHB1YmxpYyBzaG9ydCBnZXRTaG91bGRTdHJpcFNwYWNlKGludCBlbGVtZW50SGFuZGxlKQorICB7CisgICAgdHJ5CisgICAgeyAgICAgIAorICAgICAgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuV2hpdGVTcGFjZUluZm8gaW5mbyA9IAorICAgICAgICBtX3N0eWxlc2hlZXRSb290LmdldFdoaXRlU3BhY2VJbmZvKG1feGNvbnRleHQsIGVsZW1lbnRIYW5kbGUpOworICAgICAgICAgCisgICAgICBpZiAobnVsbCA9PSBpbmZvKQorICAgICAgeworICAgICAgICByZXR1cm4gRFRNV1NGaWx0ZXIuSU5IRVJJVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRTaG91bGRTdHJpcFNwYWNlOiAiK2luZm8uZ2V0U2hvdWxkU3RyaXBTcGFjZSgpKTsKKyAgICAgICAgcmV0dXJuIGluZm8uZ2V0U2hvdWxkU3RyaXBTcGFjZSgpID8gRFRNV1NGaWx0ZXIuU1RSSVAgOiBEVE1XU0ZpbHRlci5OT1RTVFJJUDsKKyAgICAgIH0KKyAgICB9CisgICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHNlKQorICAgIHsKKyAgICAgIHJldHVybiBEVE1XU0ZpbHRlci5JTkhFUklUOworICAgIH0KKworICB9CisKKyAgCiB9ICAvLyBlbmQgVHJhbnNmb3JtZXJJbXBsIGNsYXNzCiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1RyZWVXYWxrZXIyUmVzdWx0LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9UcmVlV2Fsa2VyMlJlc3VsdC5qYXZhCmluZGV4IDIzZWU1MGQuLjExNzc1MmUgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL1RyZWVXYWxrZXIyUmVzdWx0LmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvVHJlZVdhbGtlcjJSZXN1bHQuamF2YQpAQCAtNTYsMTEgKzU2LDEyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lcjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLio7CisvL2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIGltcG9ydCBvcmcueG1sLnNheC4qOwogCi1pbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuVHJlZVdhbGtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNVHJlZVdhbGtlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5NdXRhYmxlQXR0ckxpc3RJbXBsOwogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1UZW1wbGF0ZUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5ET01IZWxwZXI7CkBAIC03MCw3ICs3MSw3IEBACiAgKiBIYW5kbGUgYSB3YWxrIG9mIGEgdHJlZSwgYnV0IHNjcmVlbiBvdXQgYXR0cmlidXRlcyBmb3IKICAqIHRoZSByZXN1bHQgdHJlZS4KICAqLwotcHVibGljIGNsYXNzIFRyZWVXYWxrZXIyUmVzdWx0IGV4dGVuZHMgVHJlZVdhbGtlcgorcHVibGljIGNsYXNzIFRyZWVXYWxrZXIyUmVzdWx0IGV4dGVuZHMgRFRNVHJlZVdhbGtlcgogewogCiAgIC8qKiBUaGUgdHJhbnNmb3JtZXIgaW5zdGFuY2UgICAgICAgICAgKi8KQEAgLTgwLDcgKzgxLDcgQEAKICAgUmVzdWx0VHJlZUhhbmRsZXIgbV9oYW5kbGVyOwogCiAgIC8qKiBOb2RlIHdoZXJlIHRvIHN0YXJ0IHRoZSB0cmVlIHdhbGsgICAgICAgICAgICovCi0gIE5vZGUgbV9zdGFydE5vZGU7CisgIGludCBtX3N0YXJ0Tm9kZTsKIAogICAvKioKICAgICogQ29uc3RydWN0b3IuCkBAIC05Miw3ICs5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRUcmVlSGFuZGxlciBoYW5kbGVyKQogICB7CiAKLSAgICBzdXBlcihoYW5kbGVyLCB0cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKS5nZXRET01IZWxwZXIoKSk7CisgICAgc3VwZXIoaGFuZGxlciwgbnVsbCk7CiAKICAgICBtX3RyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7CiAgICAgbV9oYW5kbGVyID0gaGFuZGxlcjsKQEAgLTEwNSw5ICsxMDYsOSBAQAogICAgKgogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShOb2RlIHBvcykgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShpbnQgcG9zKSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCiAgIHsKLQorICAgIG1fZHRtID0gbV90cmFuc2Zvcm1lci5nZXRYUGF0aENvbnRleHQoKS5nZXREVE0ocG9zKTsKICAgICBtX3N0YXJ0Tm9kZSA9IHBvczsKIAogICAgIHN1cGVyLnRyYXZlcnNlKHBvcyk7CkBAIC0xMjEsOTUgKzEyMiw0MiBAQAogICAgKgogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzdGFydE5vZGUoTm9kZSBub2RlKSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHByb3RlY3RlZCB2b2lkIHN0YXJ0Tm9kZShpbnQgbm9kZSkgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgogICB7CiAKICAgICB0cnkKICAgICB7Ci0gICAgICBpZiAoKE5vZGUuRUxFTUVOVF9OT0RFID09IG5vZGUuZ2V0Tm9kZVR5cGUoKSkgJiYgKG1fc3RhcnROb2RlID09IG5vZGUpKQorICAgICAgCisgICAgICBpZiAoRFRNLkVMRU1FTlRfTk9ERSA9PSBtX2R0bS5nZXROb2RlVHlwZShub2RlKSkKICAgICAgIHsKLSAgICAgICAgRE9NSGVscGVyIGRoZWxwZXIgPSBtX3RyYW5zZm9ybWVyLmdldFhQYXRoQ29udGV4dCgpLmdldERPTUhlbHBlcigpOwotICAgICAgICBTdHJpbmcgZWxlbU5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBkaGVscGVyLmdldExvY2FsTmFtZU9mTm9kZShub2RlKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGRoZWxwZXIuZ2V0TmFtZXNwYWNlT2ZOb2RlKG5vZGUpOwotCisgICAgICAgIFN0cmluZyBlbGVtTmFtZSA9IG1fZHRtLmdldE5vZGVOYW1lKG5vZGUpOworICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gbV9kdG0uZ2V0TG9jYWxOYW1lKG5vZGUpOworICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gbV9kdG0uZ2V0TmFtZXNwYWNlVVJJKG5vZGUpOworICAgICAgICAKICAgICAgICAgbV9oYW5kbGVyLnN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIGxvY2FsTmFtZSwgZWxlbU5hbWUsIG51bGwpOwogCi0gICAgICAgIGZvciAoTm9kZSBwYXJlbnQgPSBub2RlOyBwYXJlbnQgIT0gbnVsbDsKLSAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKQorICAgICAgICBpZiAoRFRNLkVMRU1FTlRfTk9ERSA9PSBtX2R0bS5nZXROb2RlVHlwZShub2RlKSkKICAgICAgICAgewotICAgICAgICAgIGlmIChOb2RlLkVMRU1FTlRfTk9ERSAhPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHMgPSAoKEVsZW1lbnQpIHBhcmVudCkuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgIGludCBuID0gYXR0cy5nZXRMZW5ndGgoKTsKLQotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgIGJvb2xlYW4gaGFzTlNEZWNscyA9IGZhbHNlOworICAgICAgICAgIERUTSBkdG0gPSBtX2R0bTsKKyAgICAgICAgICBmb3IgKGludCBucyA9IGR0bS5nZXRGaXJzdE5hbWVzcGFjZU5vZGUobm9kZSwgdHJ1ZSk7IAorICAgICAgICAgICAgICAgRFRNLk5VTEwgIT0gbnM7IG5zID0gZHRtLmdldE5leHROYW1lc3BhY2VOb2RlKG5vZGUsIG5zLCB0cnVlKSkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbnNEZWNsUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBhdHRzLml0ZW0oaSk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAvLyBnZXQgdGhlIG5hbWVzcGFjZSBwcmVmaXggCi0gICAgICAgICAgICAgIG5zRGVjbFByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKG5hbWUuaW5kZXhPZigiOiIpICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChuYW1lLmVxdWFscygieG1sbnMiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbnNEZWNsUHJlZml4ID0gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgobnNEZWNsUHJlZml4ID09IG51bGwpICYmIChub2RlICE9IHBhcmVudCkpCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgZWxzZSBpZihuc0RlY2xQcmVmaXggIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBkZXN0dXJpID0gbV9wcm9jZXNzb3IuZ2V0VVJJKG5zRGVjbFByZWZpeCk7Ci0gICAgICAgICAgICAvLyBMb29rIGZvciBhbiBhbGlhcyBmb3IgdGhpcyBVUkkuIElmIG9uZSBpcyBmb3VuZCwgdXNlIGl0IGFzIHRoZSByZXN1bHQgVVJJCi0gICAgICAgICAgICBTdHJpbmcgYWxpYXNVUkkgPSBtX2VsZW0ubV9zdHlsZXNoZWV0Lmxvb2tGb3JBbGlhcyh2YWx1ZSk7Ci0gICAgICAgICAgICBpZihhbGlhc1VSSS5lcXVhbHMoZGVzdHVyaSkpIC8vIFRPRE86IENoZWNrIGZvciBleHRlbnNpb24gbmFtZXNwYWNlcwotICAgICAgICAgICAgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLwotICAgICAgICAgICAgbV9oYW5kbGVyLmFkZEF0dHJpYnV0ZShkaGVscGVyLmdldE5hbWVzcGFjZU9mTm9kZShhdHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGhlbHBlci5nZXRMb2NhbE5hbWVPZk5vZGUoYXR0ciksIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDREFUQSIsIHZhbHVlKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG5hbWVzcGFjZSBpcyBub3QgaW4gdGhlIGV4Y2x1ZGVkIGxpc3QgdGhlbgotICAgICAgICAgICAgLy8gYWRkIHRvIHJlc3VsdCB0cmVlCi0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBpZighbV9oYW5kbGVyLmdldFBlbmRpbmdBdHRyaWJ1dGVzKCkuY29udGFpbnMobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZihuc0RlY2xQcmVmaXggPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1faGFuZGxlci5hZGRBdHRyaWJ1dGUobmFtZSwgIkNEQVRBIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGRlc3R1cmkKLSAgICAgICAgICAgID0gbV9oYW5kbGVyLmdldFVSSShuc0RlY2xQcmVmaXgpOwotICAgICAgICAgICAgaWYobnVsbCA9PSBkZXN0dXJpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgbV9oYW5kbGVyLmFkZEF0dHJpYnV0ZShuYW1lLCAiQ0RBVEEiLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFkZXN0dXJpLmVxdWFscyh2YWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBtX2hhbmRsZXIuYWRkQXR0cmlidXRlKG5hbWUsICJDREFUQSIsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICovCisgICAgICAgICAgICBtX2hhbmRsZXIuZW5zdXJlTmFtZXNwYWNlRGVjbERlY2xhcmVkKGR0bSwgbnMpOwogICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZihoYXNOU0RlY2xzKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1faGFuZGxlci5hZGROU0RlY2xzVG9BdHRycygpOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBmb3IgKGludCBhdHRyID0gZHRtLmdldEZpcnN0QXR0cmlidXRlKG5vZGUpOyAKKyAgICAgICAgICAgICAgIERUTS5OVUxMICE9IGF0dHI7IGF0dHIgPSBkdG0uZ2V0TmV4dEF0dHJpYnV0ZShhdHRyKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBtX2hhbmRsZXIuYWRkQXR0cmlidXRlKGF0dHIpOworICAgICAgICAgIH0KKyAgICAgICAgICAKICAgICAgICAgfQotCi0gICAgICAgIC8vIG1faGFuZGxlci5wcm9jZXNzUmVzdWx0TlMobV9lbGVtKTsgICAgICAgICAgIAogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdC9Qcm9jZXNzLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1Byb2Nlc3MuamF2YQppbmRleCAxNTUzZTRkLi5jZTk4OGU2IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1Byb2Nlc3MuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1Byb2Nlc3MuamF2YQpAQCAtMTA1LDEyICsxMDUsMTMgQEAKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlVSSVJlc29sdmVyOwotCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uKjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC4qOwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7CisKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworCiBpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CiBpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CkBAIC0xNDQsNiArMTQ1LDcgQEAKICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4ocmVzYnVuZGxlLmdldFN0cmluZygib3B0aW9uRSIpKTsgLy8iICAgWy1FIChEbyBub3QgZXhwYW5kIGVudGl0eSByZWZzKV0iKTsKICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzYnVuZGxlLmdldFN0cmluZygib3B0aW9uViIpKTsgIC8vIiAgIFstViAoVmVyc2lvbiBpbmZvKV0iKTsKICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzYnVuZGxlLmdldFN0cmluZygib3B0aW9uUUMiKSk7ICAvLyIgICBbLVFDIChRdWlldCBQYXR0ZXJuIENvbmZsaWN0cyBXYXJuaW5ncyldIik7CisKICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4ocmVzYnVuZGxlLmdldFN0cmluZygib3B0aW9uUSIpKTsgIC8vIiAgIFstUSAgKFF1aWV0IE1vZGUpXSIpOyAvLyBzYyAyOC1GZWItMDEgY29tbWVudGVkIG91dAogICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNidW5kbGUuZ2V0U3RyaW5nKCJvcHRpb25UVCIpKTsgIC8vIiAgIFstVFQgKFRyYWNlIHRoZSB0ZW1wbGF0ZXMgYXMgdGhleSBhcmUgYmVpbmcgY2FsbGVkLildIik7CiAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc2J1bmRsZS5nZXRTdHJpbmcoIm9wdGlvblRHIikpOyAgLy8iICAgWy1URyAoVHJhY2UgZWFjaCBnZW5lcmF0aW9uIGV2ZW50LildIik7CkBAIC0xNTcsMTkgKzE1OSwyMCBAQAogICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNidW5kbGUuZ2V0U3RyaW5nKCJvcHRpb25URVhUIikpOyAgLy8iICAgWy1URVhUIChVc2Ugc2ltcGxlIFRleHQgZm9ybWF0dGVyLildIik7CiAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc2J1bmRsZS5nZXRTdHJpbmcoIm9wdGlvbkhUTUwiKSk7ICAvLyIgICBbLUhUTUwgKFVzZSBIVE1MIGZvcm1hdHRlci4pXSIpOwogICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNidW5kbGUuZ2V0U3RyaW5nKCJvcHRpb25QQVJBTSIpKTsgIC8vIiAgIFstUEFSQU0gbmFtZSBleHByZXNzaW9uIChTZXQgYSBzdHlsZXNoZWV0IHBhcmFtZXRlcildIik7CisKICAgICAvLyBzYyAyOC1GZWItMDEgdGhlc2UgYmVsb3cgc2hvdWxkIHJlYWxseSBiZSBhZGRlZCBhcyByZXNvdXJjZXMKICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCiAgICAgICAiICAgWy1NRURJQSBtZWRpYVR5cGUgKHVzZSBtZWRpYSBhdHRyaWJ1dGUgdG8gZmluZCBzdHlsZXNoZWV0IGFzc29jaWF0ZWQgd2l0aCBhIGRvY3VtZW50LildIik7CiAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgIiAgIFstRkxBVk9SIGZsYXZvck5hbWUgKEV4cGxpY2l0bHkgdXNlIHMycz1TQVggb3IgZDJkPURPTSB0byBkbyB0cmFuc2Zvcm0uKV0iKTsgLy8gQWRkZWQgYnkgc2JvYWcvc2N1cmN1cnU7IGV4cGVyaW1lbnRhbAorICAgICAgIiAgIFstRkxBVk9SIGZsYXZvck5hbWUgKEV4cGxpY2l0bHkgdXNlIHMycz1TQVggb3IgZDJkPURPTSB0byBkbyB0cmFuc2Zvcm0uKV0iKTsgIC8vIEFkZGVkIGJ5IHNib2FnL3NjdXJjdXJ1OyBleHBlcmltZW50YWwKICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCiAgICAgICAiICAgWy1ESUFHIChQcmludCBvdmVyYWxsIG1pbGxpc2Vjb25kcyB0cmFuc2Zvcm0gdG9vay4pXSIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzYnVuZGxlLmdldFN0cmluZygib3B0aW9uVVJJUkVTT0xWRVIiKSk7ICAvLyIgICBbLVVSSVJFU09MVkVSIGZ1bGwgY2xhc3MgbmFtZSAoVVJJUmVzb2x2ZXIgdG8gYmUgdXNlZCB0byByZXNvbHZlIFVSSXMpXSIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzYnVuZGxlLmdldFN0cmluZygib3B0aW9uRU5USVRZUkVTT0xWRVIiKSk7ICAvLyIgICBbLUVOVElUWVJFU09MVkVSIGZ1bGwgY2xhc3MgbmFtZSAoRW50aXR5UmVzb2x2ZXIgdG8gYmUgdXNlZCB0byByZXNvbHZlIGVudGl0aWVzKV0iKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHJlc2J1bmRsZS5nZXRTdHJpbmcoIm9wdGlvbkNPTlRFTlRIQU5ETEVSIikpOyAgLy8iICAgWy1DT05URU5USEFORExFUiBmdWxsIGNsYXNzIG5hbWUgKENvbnRlbnRIYW5kbGVyIHRvIGJlIHVzZWQgdG8gc2VyaWFsaXplIG91dHB1dCldIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc2J1bmRsZS5nZXRTdHJpbmcoIm9wdGlvblVSSVJFU09MVkVSIikpOyAgLy8iICAgWy1VUklSRVNPTFZFUiBmdWxsIGNsYXNzIG5hbWUgKFVSSVJlc29sdmVyIHRvIGJlIHVzZWQgdG8gcmVzb2x2ZSBVUklzKV0iKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzYnVuZGxlLmdldFN0cmluZygib3B0aW9uRU5USVRZUkVTT0xWRVIiKSk7ICAvLyIgICBbLUVOVElUWVJFU09MVkVSIGZ1bGwgY2xhc3MgbmFtZSAoRW50aXR5UmVzb2x2ZXIgdG8gYmUgdXNlZCB0byByZXNvbHZlIGVudGl0aWVzKV0iKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzYnVuZGxlLmdldFN0cmluZygib3B0aW9uQ09OVEVOVEhBTkRMRVIiKSk7ICAvLyIgICBbLUNPTlRFTlRIQU5ETEVSIGZ1bGwgY2xhc3MgbmFtZSAoQ29udGVudEhhbmRsZXIgdG8gYmUgdXNlZCB0byBzZXJpYWxpemUgb3V0cHV0KV0iKTsKICAgfQogCi0gIC8qKiBEZWZhdWx0IHByb3BlcnRpZXMgZmlsZSAgICAgICAgICAqLworICAvKiogRGVmYXVsdCBwcm9wZXJ0aWVzIGZpbGUgKi8KICAgc3RhdGljIFN0cmluZyBYU0xUX1BST1BFUlRJRVMgPSAiL29yZy9hcGFjaGUveGFsYW4vcmVzL1hTTFRJbmZvLnByb3BlcnRpZXMiOwogCiAgIC8qKgpAQCAtMTk5LDcgKzIwMiw2IEBACiAgICAgWFNMVEVycm9yUmVzb3VyY2VzIHJlc2J1bmRsZSA9CiAgICAgICAoWFNMVEVycm9yUmVzb3VyY2VzKSAoWFNMTWVzc2FnZXMubG9hZFJlc291cmNlQnVuZGxlKAogICAgICAgICBvcmcuYXBhY2hlLnhtbC51dGlscy5yZXMuWFJlc291cmNlQnVuZGxlLkVSUk9SX1JFU09VUkNFUykpOwotICAgICAgICAKICAgICBTdHJpbmcgZmxhdm9yID0gInMycyI7CiAKICAgICAvLyBsb2FkUHJvcGVydHlGaWxlVG9TeXN0ZW0oWFNMVF9QUk9QRVJUSUVTKTsKQEAgLTIzOCw5ICsyNDAsOSBAQAogICAgICAgU3RyaW5nIG1lZGlhID0gbnVsbDsKICAgICAgIFZlY3RvciBwYXJhbXMgPSBuZXcgVmVjdG9yKCk7CiAgICAgICBib29sZWFuIHF1aWV0Q29uZmxpY3RXYXJuaW5ncyA9IGZhbHNlOwotCQkJVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIgPSBudWxsOwotCQkJRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIgPSBudWxsOwotCQkJQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIgPSBudWxsOworICAgICAgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIgPSBudWxsOworICAgICAgRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIgPSBudWxsOworICAgICAgQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIgPSBudWxsOwogCiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspCiAgICAgICB7CkBAIC0zNjYsNyArMzY4LDcgQEAKICAgICAgICAgICAgICAgICBYU0xURXJyb3JSZXNvdXJjZXMuRVJfTUlTU0lOR19BUkdfRk9SX09QVElPTiwKICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ICItUEFSQU0iIH0pKTsgIC8vIk1pc3NpbmcgYXJndW1lbnQgZm9yKTsKICAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgiLXRyZWVkdW1wIi5lcXVhbHNJZ25vcmVDYXNlKGFyZ3ZbaV0pKSAvLyBzYyAyOC1GZWItMDEgYXBwZWFycyB0byBiZSB1bnVzZWQ7IGNhbiB3ZSByZW1vdmU/CisgICAgICAgIGVsc2UgaWYgKCItdHJlZWR1bXAiLmVxdWFsc0lnbm9yZUNhc2UoYXJndltpXSkpICAvLyBzYyAyOC1GZWItMDEgYXBwZWFycyB0byBiZSB1bnVzZWQ7IGNhbiB3ZSByZW1vdmU/CiAgICAgICAgIHsKICAgICAgICAgICBpZiAoaSArIDEgPCBhcmd2Lmxlbmd0aCkKICAgICAgICAgICAgIHRyZWVkdW1wRmlsZU5hbWUgPSBhcmd2WysraV07CkBAIC0zNzYsNyArMzc4LDcgQEAKICAgICAgICAgICAgICAgICBYU0xURXJyb3JSZXNvdXJjZXMuRVJfTUlTU0lOR19BUkdfRk9SX09QVElPTiwKICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ICItdHJlZWR1bXAiIH0pKTsgIC8vIk1pc3NpbmcgYXJndW1lbnQgZm9yKTsKICAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgiLUYiLmVxdWFsc0lnbm9yZUNhc2UoYXJndltpXSkpIC8vIHNjIDI4LUZlYi0wMSBhcHBlYXJzIHRvIGJlIHVudXNlZDsgY2FuIHdlIHJlbW92ZT8KKyAgICAgICAgZWxzZSBpZiAoIi1GIi5lcXVhbHNJZ25vcmVDYXNlKGFyZ3ZbaV0pKSAgLy8gc2MgMjgtRmViLTAxIGFwcGVhcnMgdG8gYmUgdW51c2VkOyBjYW4gd2UgcmVtb3ZlPwogICAgICAgICB7CiAgICAgICAgICAgZm9ybWF0T3V0cHV0ID0gdHJ1ZTsKICAgICAgICAgfQpAQCAtNDQ0LDgxICs0NDYsODggQEAKICAgICAgICAgICAgIGR1bXBGaWxlTmFtZSA9IGFyZ3ZbKytpXTsKICAgICAgICAgICB9CiAgICAgICAgIH0KLQkJCQllbHNlIGlmICgiLVVSSVJFU09MVkVSIi5lcXVhbHNJZ25vcmVDYXNlKGFyZ3ZbaV0pKSAKKyAgICAgICAgZWxzZSBpZiAoIi1VUklSRVNPTFZFUiIuZXF1YWxzSWdub3JlQ2FzZShhcmd2W2ldKSkKICAgICAgICAgewogICAgICAgICAgIGlmIChpICsgMSA8IGFyZ3YubGVuZ3RoKQotCQkJCQl7CQotCQkJCQkJdHJ5ewotCQkJCQkJCXVyaVJlc29sdmVyID0gKFVSSVJlc29sdmVyKUNsYXNzLmZvck5hbWUoYXJndlsrK2ldKS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCXRmYWN0b3J5LnNldFVSSVJlc29sdmVyKHVyaVJlc29sdmVyKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBjbmZlKQotCQkJCQkJewotCQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICAgICAgICAgWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZSgKLSAgICAgICAgICAgICAgICBYU0xURXJyb3JSZXNvdXJjZXMuRVJfQ0xBU1NfTk9UX0ZPVU5EX0ZPUl9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyAiLVVSSVJlc29sdmVyIiB9KSk7IAotCQkJCQkJCVN5c3RlbS5leGl0KC0xKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKKyAgICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdXJpUmVzb2x2ZXIgPQorICAgICAgICAgICAgICAgIChVUklSZXNvbHZlcikgQ2xhc3MuZm9yTmFtZShhcmd2WysraV0pLm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgICAgICAgdGZhY3Rvcnkuc2V0VVJJUmVzb2x2ZXIodXJpUmVzb2x2ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBjbmZlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCisgICAgICAgICAgICAgICAgWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgIFhTTFRFcnJvclJlc291cmNlcy5FUl9DTEFTU19OT1RfRk9VTkRfRk9SX09QVElPTiwKKyAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgIi1VUklSZXNvbHZlciIgfSkpOworICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCiAgICAgICAgICAgICAgIFhTTE1lc3NhZ2VzLmNyZWF0ZU1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgWFNMVEVycm9yUmVzb3VyY2VzLkVSX01JU1NJTkdfQVJHX0ZPUl9PUFRJT04sCiAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyAiLVVSSVJlc29sdmVyIiB9KSk7ICAvLyJNaXNzaW5nIGFyZ3VtZW50IGZvcik7Ci0JCQkJCQlTeXN0ZW0uZXhpdCgtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIi1FTlRJVFlSRVNPTFZFUiIuZXF1YWxzSWdub3JlQ2FzZShhcmd2W2ldKSkgCisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgtMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCItRU5USVRZUkVTT0xWRVIiLmVxdWFsc0lnbm9yZUNhc2UoYXJndltpXSkpCiAgICAgICAgIHsKICAgICAgICAgICBpZiAoaSArIDEgPCBhcmd2Lmxlbmd0aCkKLQkJCQkJewkKLQkJCQkJCXRyeXsKLQkJCQkJCQllbnRpdHlSZXNvbHZlciA9IChFbnRpdHlSZXNvbHZlcilDbGFzcy5mb3JOYW1lKGFyZ3ZbKytpXSkubmV3SW5zdGFuY2UoKTsJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQljYXRjaChFeGNlcHRpb24gY25mZSkKLQkJCQkJCXsKLQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oCi0gICAgICAgICAgICAgIFhTTE1lc3NhZ2VzLmNyZWF0ZU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgWFNMVEVycm9yUmVzb3VyY2VzLkVSX0NMQVNTX05PVF9GT1VORF9GT1JfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgIi1FbnRpdHlSZXNvbHZlciIgfSkpOwotCQkJCQkJCVN5c3RlbS5leGl0KC0xKTsKLQkJCQkJCX0KLQkJCQkJfQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBlbnRpdHlSZXNvbHZlciA9CisgICAgICAgICAgICAgICAgKEVudGl0eVJlc29sdmVyKSBDbGFzcy5mb3JOYW1lKGFyZ3ZbKytpXSkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gY25mZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAorICAgICAgICAgICAgICAgIFhTTE1lc3NhZ2VzLmNyZWF0ZU1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICBYU0xURXJyb3JSZXNvdXJjZXMuRVJfQ0xBU1NfTk9UX0ZPVU5EX0ZPUl9PUFRJT04sCisgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ICItRW50aXR5UmVzb2x2ZXIiIH0pKTsKKyAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCi0JCQkJCXsKKyAgICAgICAgICB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCiAgICAgICAgICAgICAgIFhTTE1lc3NhZ2VzLmNyZWF0ZU1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgWFNMVEVycm9yUmVzb3VyY2VzLkVSX01JU1NJTkdfQVJHX0ZPUl9PUFRJT04sCiAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyAiLUVudGl0eVJlc29sdmVyIiB9KSk7ICAvLyJNaXNzaW5nIGFyZ3VtZW50IGZvcik7Ci0JCQkJCQlTeXN0ZW0uZXhpdCgtMSk7Ci0JCQkJCX0KKyAgICAgICAgICAgIFN5c3RlbS5leGl0KC0xKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLQkJCQllbHNlIGlmICgiLUNPTlRFTlRIQU5ETEVSIi5lcXVhbHNJZ25vcmVDYXNlKGFyZ3ZbaV0pKSAKKyAgICAgICAgZWxzZSBpZiAoIi1DT05URU5USEFORExFUiIuZXF1YWxzSWdub3JlQ2FzZShhcmd2W2ldKSkKICAgICAgICAgewogICAgICAgICAgIGlmIChpICsgMSA8IGFyZ3YubGVuZ3RoKQotCQkJCQl7CQotCQkJCQkJdHJ5ewotCQkJCQkJCWNvbnRlbnRIYW5kbGVyID0gKENvbnRlbnRIYW5kbGVyKUNsYXNzLmZvck5hbWUoYXJndlsrK2ldKS5uZXdJbnN0YW5jZSgpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBjbmZlKQotCQkJCQkJewotCQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICAgICAgICAgWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZSgKLSAgICAgICAgICAgICAgICBYU0xURXJyb3JSZXNvdXJjZXMuRVJfQ0xBU1NfTk9UX0ZPVU5EX0ZPUl9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyAiLUNvbnRlbnRIYW5kbGVyIiB9KSk7Ci0JCQkJCQkJU3lzdGVtLmV4aXQoLTEpOwotCQkJCQkJfQotCQkJCQl9CisgICAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyID0KKyAgICAgICAgICAgICAgICAoQ29udGVudEhhbmRsZXIpIENsYXNzLmZvck5hbWUoYXJndlsrK2ldKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBjbmZlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCisgICAgICAgICAgICAgICAgWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgIFhTTFRFcnJvclJlc291cmNlcy5FUl9DTEFTU19OT1RfRk9VTkRfRk9SX09QVElPTiwKKyAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgIi1Db250ZW50SGFuZGxlciIgfSkpOworICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKLQkJCQkJeworICAgICAgICAgIHsKICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKICAgICAgICAgICAgICAgWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZSgKICAgICAgICAgICAgICAgICBYU0xURXJyb3JSZXNvdXJjZXMuRVJfTUlTU0lOR19BUkdfRk9SX09QVElPTiwKICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ICItQ29udGVudEhhbmRsZXIiIH0pKTsgIC8vIk1pc3NpbmcgYXJndW1lbnQgZm9yKTsKLQkJCQkJCVN5c3RlbS5leGl0KC0xKTsKLQkJCQkJfQorICAgICAgICAgICAgU3lzdGVtLmV4aXQoLTEpOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKApAQCAtNTM2LDI2ICs1NDUsMzcgQEAKICAgICAgICAgewogICAgICAgICAgIGR1bXBXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZHVtcEZpbGVOYW1lKSk7CiAgICAgICAgIH0KKwogICAgICAgICBUZW1wbGF0ZXMgc3R5bGVzaGVldCA9IG51bGw7Ci0gICAgICAgIGlmKG51bGwgIT0geHNsRmlsZU5hbWUpCisKKyAgICAgICAgaWYgKG51bGwgIT0geHNsRmlsZU5hbWUpCiAgICAgICAgIHsKLSAgICAgICAgICBpZihmbGF2b3IuZXF1YWxzKCJkMmQiKSkKKyAgICAgICAgICBpZiAoZmxhdm9yLmVxdWFscygiZDJkIikpCiAgICAgICAgICAgeworCiAgICAgICAgICAgICAvLyBQYXJzZSBpbiB0aGUgeG1sIGRhdGEgaW50byBhIERPTQotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGZhY3RvcnkgPQorICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKICAgICAgICAgICAgIGRmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCiAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJCQkJTm9kZSB4c2xET00gPSBkb2NCdWlsZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZSh4c2xGaWxlTmFtZSkpOwotICAgICAgICAgICAgc3R5bGVzaGVldCA9IHRmYWN0b3J5Lm5ld1RlbXBsYXRlcyhuZXcgRE9NU291cmNlKHhzbERPTSwgeHNsRmlsZU5hbWUpKTsKKyAgICAgICAgICAgIE5vZGUgeHNsRE9NID0gZG9jQnVpbGRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoeHNsRmlsZU5hbWUpKTsKKworICAgICAgICAgICAgc3R5bGVzaGVldCA9IHRmYWN0b3J5Lm5ld1RlbXBsYXRlcyhuZXcgRE9NU291cmNlKHhzbERPTSwKKyAgICAgICAgICAgICAgICAgICAgeHNsRmlsZU5hbWUpKTsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZQotICAgICAgICAgIHsgCisgICAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYWxsaW5nIG5ld1RlbXBsYXRlczogIit4c2xGaWxlTmFtZSk7CiAgICAgICAgICAgICBzdHlsZXNoZWV0ID0gdGZhY3RvcnkubmV3VGVtcGxhdGVzKG5ldyBTdHJlYW1Tb3VyY2UoeHNsRmlsZU5hbWUpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uZSBjYWxsaW5nIG5ld1RlbXBsYXRlczogIit4c2xGaWxlTmFtZSk7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgICAgCisKICAgICAgICAgUHJpbnRXcml0ZXIgcmVzdWx0V3JpdGVyOwogICAgICAgICBTdHJlYW1SZXN1bHQgc3RyUmVzdWx0OworCiAgICAgICAgIGlmIChudWxsICE9IG91dEZpbGVOYW1lKQogICAgICAgICB7CiAgICAgICAgICAgc3RyUmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChuZXcgRmlsZShvdXRGaWxlTmFtZSkpOwpAQCAtNTY1LDM5ICs1ODUsMzggQEAKICAgICAgICAgICBzdHJSZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KFN5c3RlbS5vdXQpOwogICAgICAgICB9CiAKLQotICAgICAgICBTQVhUcmFuc2Zvcm1lckZhY3Rvcnkgc3RmID0gKFNBWFRyYW5zZm9ybWVyRmFjdG9yeSl0ZmFjdG9yeTsKKyAgICAgICAgU0FYVHJhbnNmb3JtZXJGYWN0b3J5IHN0ZiA9IChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpIHRmYWN0b3J5OwogCiAgICAgICAgIC8vIERpZCB0aGV5IHBhc3MgaW4gYSBzdHlsZXNoZWV0LCBvciBzaG91bGQgd2UgZ2V0IGl0IGZyb20gdGhlIAogICAgICAgICAvLyBkb2N1bWVudD8KICAgICAgICAgaWYgKG51bGwgPT0gc3R5bGVzaGVldCkKICAgICAgICAgewogICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPQotICAgICAgICAgICAgc3RmLmdldEFzc29jaWF0ZWRTdHlsZXNoZWV0KG5ldyBTdHJlYW1Tb3VyY2UoaW5GaWxlTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIHN0Zi5nZXRBc3NvY2lhdGVkU3R5bGVzaGVldChuZXcgU3RyZWFtU291cmNlKGluRmlsZU5hbWUpLCBtZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKIAogICAgICAgICAgIGlmIChudWxsICE9IHNvdXJjZSkKICAgICAgICAgICAgIHN0eWxlc2hlZXQgPSB0ZmFjdG9yeS5uZXdUZW1wbGF0ZXMoc291cmNlKTsKICAgICAgICAgICBlbHNlCiAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKG51bGwgIT0gbWVkaWEpCi0gICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbigiTm8gc3R5bGVzaGVldCBmb3VuZCBpbjogIiArIGluRmlsZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG1lZGlhPSIgKyBtZWRpYSk7CisgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbigiTm8gc3R5bGVzaGVldCBmb3VuZCBpbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbkZpbGVOYW1lICsgIiwgbWVkaWE9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtZWRpYSk7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbigiTm8geG1sLXN0eWxlc2hlZXQgUEkgZm91bmQgaW46ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluRmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbkZpbGVOYW1lKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobnVsbCAhPSBzdHlsZXNoZWV0KQogICAgICAgICB7Ci0gICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBzdHlsZXNoZWV0Lm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBmbGF2b3IuZXF1YWxzKCJ0aCIpID8gbnVsbCA6IHN0eWxlc2hlZXQubmV3VHJhbnNmb3JtZXIoKTsKIAogICAgICAgICAgIC8vIE92ZXJyaWRlIHRoZSBvdXRwdXQgZm9ybWF0PwogICAgICAgICAgIGlmIChudWxsICE9IG91dHB1dFR5cGUpCiAgICAgICAgICAgewotICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUeXBlKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCBvdXRwdXRUeXBlKTsKICAgICAgICAgICB9CiAKICAgICAgICAgICBpZiAodHJhbnNmb3JtZXIgaW5zdGFuY2VvZiBUcmFuc2Zvcm1lckltcGwpCkBAIC02MjEsODQgKzY0MCwyMDAgQEAKICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcigoU3RyaW5nKSBwYXJhbXMuZWxlbWVudEF0KGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIHBhcmFtcy5lbGVtZW50QXQoaSArIDEpKTsKICAgICAgICAgICB9Ci0JCQkJCWlmICh1cmlSZXNvbHZlciAhPSBudWxsKQotCQkJCQkJdHJhbnNmb3JtZXIuc2V0VVJJUmVzb2x2ZXIodXJpUmVzb2x2ZXIpOworCisgICAgICAgICAgaWYgKHVyaVJlc29sdmVyICE9IG51bGwpCisgICAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRVUklSZXNvbHZlcih1cmlSZXNvbHZlcik7CiAKICAgICAgICAgICBpZiAobnVsbCAhPSBpbkZpbGVOYW1lKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKGZsYXZvci5lcXVhbHMoImQyZCIpKQorICAgICAgICAgICAgaWYgKGZsYXZvci5lcXVhbHMoImQyZCIpKQogICAgICAgICAgICAgeworCiAgICAgICAgICAgICAgIC8vIFBhcnNlIGluIHRoZSB4bWwgZGF0YSBpbnRvIGEgRE9NCi0gICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGZhY3RvcnkgPQorICAgICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwogICAgICAgICAgICAgICBkZmFjdG9yeS5zZXRDb2FsZXNjaW5nKHRydWUpOwogICAgICAgICAgICAgICBkZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKwogICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJCQkJCWlmIChlbnRpdHlSZXNvbHZlciAhPSBudWxsKQotCQkJCQkJCQlkb2NCdWlsZGVyLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKKworICAgICAgICAgICAgICBpZiAoZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkb2NCdWlsZGVyLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKKwogICAgICAgICAgICAgICBOb2RlIHhtbERvYyA9IGRvY0J1aWxkZXIucGFyc2UobmV3IElucHV0U291cmNlKGluRmlsZU5hbWUpKTsKICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZG9jQnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50IG91dE5vZGUgPSBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwotICAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZSh4bWxEb2MsIGluRmlsZU5hbWUpLCAKKyAgICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudCBvdXROb2RlID0KKyAgICAgICAgICAgICAgICBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOworCisgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKHhtbERvYywgaW5GaWxlTmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRE9NUmVzdWx0KG91dE5vZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgIC8vIE5vdyBzZXJpYWxpemUgb3V0cHV0IHRvIGRpc2sgd2l0aCBpZGVudGl0eSB0cmFuc2Zvcm1lcgogICAgICAgICAgICAgICBUcmFuc2Zvcm1lciBzZXJpYWxpemVyID0gc3RmLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgICAgICAgIFByb3BlcnRpZXMgc2VyaWFsaXphdGlvblByb3BzID0gc3R5bGVzaGVldC5nZXRPdXRwdXRQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgIFByb3BlcnRpZXMgc2VyaWFsaXphdGlvblByb3BzID0KKyAgICAgICAgICAgICAgICBzdHlsZXNoZWV0LmdldE91dHB1dFByb3BlcnRpZXMoKTsKKwogICAgICAgICAgICAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnRpZXMoc2VyaWFsaXphdGlvblByb3BzKTsKLQkJCQkJCQlpZiAoY29udGVudEhhbmRsZXIgIT0gbnVsbCkKLQkJCQkJCQl7Ci0JCQkJCQkJCVNBWFJlc3VsdCByZXN1bHQgPSBuZXcgU0FYUmVzdWx0KGNvbnRlbnRIYW5kbGVyKTsKLQkJCQkJCQkJc2VyaWFsaXplci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShvdXROb2RlKSwgcmVzdWx0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlzZXJpYWxpemVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKG91dE5vZGUpLCBzdHJSZXN1bHQpOwotICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGNvbnRlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTQVhSZXN1bHQgcmVzdWx0ID0gbmV3IFNBWFJlc3VsdChjb250ZW50SGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKG91dE5vZGUpLCByZXN1bHQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKG91dE5vZGUpLCBzdHJSZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZmxhdm9yLmVxdWFscygidGgiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0aW5nIHRoZSBUcmFuc2Zvcm1lckhhbmRsZXIuLi4iKTsKKworICAgICAgICAgICAgICAvLyA9PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IG51bGw7CisKKyAgICAgICAgICAgICAgLy8gVXNlIEpBWFAxLjEgKCBpZiBwb3NzaWJsZSApICAgICAgCisgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0KKyAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICAgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIgamF4cFBhcnNlciA9CisgICAgICAgICAgICAgICAgICBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOworCisgICAgICAgICAgICAgICAgcmVhZGVyID0gamF4cFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjYXRjaCAoamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNhdGNoIChqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGV4MSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24oZXgxLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBleDIpe30KKyAgICAgICAgICAgICAgY2F0Y2ggKEFic3RyYWN0TWV0aG9kRXJyb3IgYW1lKXt9CisKKyAgICAgICAgICAgICAgaWYgKG51bGwgPT0gcmVhZGVyKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVhZGVyID0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgVHJhbnNmb3JtZXJIYW5kbGVyIHRoID0gc3RmLm5ld1RyYW5zZm9ybWVySGFuZGxlcihzdHlsZXNoZWV0KTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0aCk7CisgICAgICAgICAgICAgIHJlYWRlci5zZXREVERIYW5kbGVyKHRoKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmKHRoIGluc3RhbmNlb2Ygb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyKQorICAgICAgICAgICAgICAgIHJlYWRlci5zZXRFcnJvckhhbmRsZXIoKG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcil0aCk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCB0aCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY2F0Y2ggKG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSl7fQorICAgICAgICAgICAgICBjYXRjaCAob3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpe30KKyAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgCisgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL2R5bmFtaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICB9IGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gc2UpIHt9CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICB0aC5zZXRSZXN1bHQoc3RyUmVzdWx0KTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigic2VuZGluZyBwYXJzZSBldmVudHMgdG8gdGhlIGhhbmRsZXIuLi4iKTsKKyAgICAgICAgICAgICAgcmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbkZpbGVOYW1lKSk7CisKKy8vICAgICAgICAgICAgICBpZiAoY29udGVudEhhbmRsZXIgIT0gbnVsbCkKKy8vICAgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBTQVhSZXN1bHQgcmVzdWx0ID0gbmV3IFNBWFJlc3VsdChjb250ZW50SGFuZGxlcik7CisvLworLy8gICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKAorLy8gICAgICAgICAgICAgICAgICBuZXcgU0FYU291cmNlKHJlYWRlciwgbmV3IElucHV0U291cmNlKGluRmlsZU5hbWUpKSwgcmVzdWx0KTsKKy8vICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgZWxzZQorLy8gICAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSgKKy8vICAgICAgICAgICAgICAgICAgbmV3IFNBWFNvdXJjZShyZWFkZXIsIG5ldyBJbnB1dFNvdXJjZShpbkZpbGVOYW1lKSksCisvLyAgICAgICAgICAgICAgICAgIHN0clJlc3VsdCk7CisvLyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8vID09PT09PT09PT09PT09PQorICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotCQlpZiAoZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkKLQkJICAgIHsKLQkJCVhNTFJlYWRlciByZWFkZXI9bnVsbDsKLQkJCS8vIFVzZSBKQVhQMS4xICggaWYgcG9zc2libGUgKSAgICAgIAotCQkJdHJ5IHsKLQkJCSAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5IGZhY3Rvcnk9Ci0JCQkJamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUoIHRydWUgKTsKLQkJCSAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIgamF4cFBhcnNlcj0KLQkJCQlmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQkJICAgIHJlYWRlcj1qYXhwUGFyc2VyLmdldFhNTFJlYWRlcigpOwotCQkJICAgIAotCQkJfSBjYXRjaCggamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleCApIHsKLQkJCSAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKCBleCApOwotCQkJfSBjYXRjaCggamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBleDEgKSB7Ci0JCQkgICAgdGhyb3cgbmV3IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiggZXgxLnRvU3RyaW5nKCkgKTsKLQkJCX0gY2F0Y2goIE5vU3VjaE1ldGhvZEVycm9yIGV4MiApIHsKLQkJCX0KLQkJCWNhdGNoIChBYnN0cmFjdE1ldGhvZEVycm9yIGFtZSl7fQotCQkJaWYgKG51bGwgPT0gcmVhZGVyKSB7Ci0JCQkgICAgcmVhZGVyID0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKLQkJCX0KKyAgICAgICAgICAgICAgaWYgKGVudGl0eVJlc29sdmVyICE9IG51bGwpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYTUxSZWFkZXIgcmVhZGVyID0gbnVsbDsKIAotCQkJcmVhZGVyLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKLQkJCWlmIChjb250ZW50SGFuZGxlciAhPSBudWxsKQotCQkJICAgIHsKLQkJCQlTQVhSZXN1bHQgcmVzdWx0ID0gbmV3IFNBWFJlc3VsdChjb250ZW50SGFuZGxlcik7Ci0JCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBTQVhTb3VyY2UocmVhZGVyLCBuZXcgSW5wdXRTb3VyY2UoaW5GaWxlTmFtZSkpLAotCQkJCQkJICAgICAgcmVzdWx0KTsKLQkJCSAgICB9Ci0JCQllbHNlCi0JCQkgICAgewotCQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgU0FYU291cmNlKHJlYWRlciwgbmV3IElucHV0U291cmNlKGluRmlsZU5hbWUpKSwKLQkJCQkJCSAgICAgIHN0clJlc3VsdCk7Ci0JCQkgICAgfQotCQkgICAgfQotCQllbHNlIGlmIChjb250ZW50SGFuZGxlciAhPSBudWxsKQotCQkgICAgewotCQkJU0FYUmVzdWx0IHJlc3VsdCA9IG5ldyBTQVhSZXN1bHQoY29udGVudEhhbmRsZXIpOwotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBTdHJlYW1Tb3VyY2UoaW5GaWxlTmFtZSksCi0JCQkJCSAgICAgIHJlc3VsdCk7Ci0JCSAgICB9Ci0JCWVsc2UKLQkJICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKGluRmlsZU5hbWUpLCBzdHJSZXN1bHQpOworICAgICAgICAgICAgICAgIC8vIFVzZSBKQVhQMS4xICggaWYgcG9zc2libGUgKSAgICAgIAorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9CisgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICAgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyIGpheHBQYXJzZXIgPQorICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOworCisgICAgICAgICAgICAgICAgICByZWFkZXIgPSBqYXhwUGFyc2VyLmdldFhNTFJlYWRlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZXgxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24oZXgxLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZXgyKXt9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEFic3RyYWN0TWV0aG9kRXJyb3IgYW1lKXt9CisKKyAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSByZWFkZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcmVhZGVyID0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIoZW50aXR5UmVzb2x2ZXIpOworCisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgU0FYUmVzdWx0IHJlc3VsdCA9IG5ldyBTQVhSZXN1bHQoY29udGVudEhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBTQVhTb3VyY2UocmVhZGVyLCBuZXcgSW5wdXRTb3VyY2UoaW5GaWxlTmFtZSkpLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKAorICAgICAgICAgICAgICAgICAgICBuZXcgU0FYU291cmNlKHJlYWRlciwgbmV3IElucHV0U291cmNlKGluRmlsZU5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyUmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiAoY29udGVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNBWFJlc3VsdCByZXN1bHQgPSBuZXcgU0FYUmVzdWx0KGNvbnRlbnRIYW5kbGVyKTsKKworICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKGluRmlsZU5hbWUpLCByZXN1bHQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdHJhbnNmb3JtIik7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBTdHJlYW1Tb3VyY2UoaW5GaWxlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0clJlc3VsdCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIHdpdGggdHJhbnNmb3JtIik7CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZQpAQCAtNzQwLDcgKzg3NSw4IEBACiAgICAgICAgICAgZG9TdGFja0R1bXBPbkVycm9yID0gdHJ1ZTsKIAogICAgICAgICBkaWFnbm9zdGljc1dyaXRlci5wcmludGxuKCk7Ci0gICAgICAgIGlmIChkb1N0YWNrRHVtcE9uRXJyb3IpICAgICAgICAgIAorCisgICAgICAgIGlmIChkb1N0YWNrRHVtcE9uRXJyb3IpCiAgICAgICAgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShkdW1wV3JpdGVyKTsKICAgICAgICAgZWxzZQogICAgICAgICAgIGRpYWdub3N0aWNzV3JpdGVyLnByaW50bG4oCkBAIC03NzQsNSArOTEwLDQgQEAKICAgICAgIGRpYWdub3N0aWNzV3JpdGVyLnByaW50bG4oIiIpOyAgLy8iWGFsYW46IGRvbmUiKTsKICAgICB9CiAgIH0KLSAgCiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0NodW5rZWRJbnRBcnJheS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9DaHVua2VkSW50QXJyYXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzg1Y2M2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9DaHVua2VkSW50QXJyYXkuamF2YQpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCisgKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0CisgKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKKyAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuZHRtOworIAoraW1wb3J0IG9yZy53M2MuZG9tLio7CisKKworLyoqCisgKiA8Y29kZT5DaHVua2VkSW50QXJyYXk8L2NvZGU+IGlzIGFuIGV4dGVuc2libGUgYXJyYXkgb2YgYmxvY2tzIG9mIGludGVnZXJzLgorICogKEknZCBjb25zaWRlciBWZWN0b3IsIGJ1dCBpdCdzIHVuYWJsZSB0byBoYW5kbGUgaW50ZWdlcnMgZXhjZXB0IGJ5CisgKiB0dXJuaW5nIHRoZW0gaW50byBPYmplY3RzLikKKworICogPHA+TWFraW5nIHRoaXMgYSBzZXBhcmF0ZSBjbGFzcyBtZWFucyBzb21lIGNhbGwtYW5kLXJldHVybiBvdmVyaGVhZC4gQnV0CisgKiBkb2luZyBpdCBhbGwgaW5saW5lIHRlbmRzIHRvIGJlIGZyYWdpbGUgYW5kIGV4cGVuc2l2ZSBpbiBjb2RlciB0aW1lLAorICogbm90IHRvIG1lbnRpb24gZHJpdmluZyB1cCBjb2RlIHNpemUuIElmIHlvdSB3YW50IHRvIGlubGluZSBpdCwgZmVlbCBmcmVlLgorICogVGhlIEphdmEgdGV4dCBzdWdnZXN0IHRoYXQgcHJpdmF0ZSBhbmQgRmluYWwgbWV0aG9kcyBtYXkgYmUgaW5saW5lZCwgCisgKiBhbmQgb25lIGNhbiBhcmd1ZSB0aGF0IHRoaXMgYmVhc3QgbmVlZCBub3QgYmUgbWFkZSBzdWJjbGFzc2FibGUuLi48L3A+CisgKgorICogPHA+JVJFVklFVyUgVGhpcyBoYXMgc3Ryb25nIGNvbmNlcHR1YWwgb3ZlcmxhcCB3aXRoIHRoZSBJbnRWZWN0b3IgY2xhc3MuCisgKiBJdCB3b3VsZCBwcm9iYWJseSBiZSBhIGdvb2QgdGhpbmcgdG8gbWVyZ2UgdGhlIHR3bywgd2hlbiB0aW1lIHBlcm1pdHMuPHA+CisgKi8KK2ZpbmFsIGNsYXNzIENodW5rZWRJbnRBcnJheQoreworICBmaW5hbCBpbnQgc2xvdHNpemU9NDsgLy8gTG9ja2VkLCBNVVNUIGJlIHBvd2VyIG9mIHR3byBpbiBjdXJyZW50IGNvZGUKKyAgLy8gRGVidWdnaW5nIHRpcDogQ3JhbmtpbmcgbG93Yml0cyBkb3duIHRvIDQgb3Igc28gaXMgYSBnb29kCisgIC8vIHdheSB0byBwb3VuZCBvbiB0aGUgYXJyYXkgYWRkcmVzc2luZyBjb2RlLgorICBzdGF0aWMgZmluYWwgaW50IGxvd2JpdHM9MTA7IC8vIEhvdyBtYW55IGJpdHMgYWRkcmVzcyB3aXRoaW4gY2h1bmtzCisgIHN0YXRpYyBmaW5hbCBpbnQgY2h1bmthbGxvYz0xPDxsb3diaXRzOworICBzdGF0aWMgZmluYWwgaW50IGxvd21hc2s9Y2h1bmthbGxvYy0xOworICAKKyAgQ2h1bmtzVmVjdG9yIGNodW5rcz1uZXcgQ2h1bmtzVmVjdG9yKCk7CisgIGZpbmFsIGludCBmYXN0QXJyYXlbXSA9IG5ldyBpbnRbY2h1bmthbGxvY107CisgIGludCBsYXN0VXNlZD0wOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgQ0lBIHdpdGggc3BlY2lmaWVkIHJlY29yZCBzaXplLiBDdXJyZW50bHkgcmVjb3JkIHNpemUgTVVTVAorICAgKiBiZSBhIHBvd2VyIG9mIHR3by4uLiBhbmQgaW4gZmFjdCBpcyBoYXJkY29kZWQgdG8gNC4KKyAgICovCisgIENodW5rZWRJbnRBcnJheShpbnQgc2xvdHNpemUpCisgIHsKKyAgICBpZih0aGlzLnNsb3RzaXplPHNsb3RzaXplKQorICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiQ2h1bmtlZEludEFycmF5KCIrc2xvdHNpemUrIikgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQiKTsKKyAgICBlbHNlIGlmICh0aGlzLnNsb3RzaXplPnNsb3RzaXplKQorICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKioqKldBUk5JTkc6IENodW5rZWRJbnRBcnJheSgiK3Nsb3RzaXplKyIpIHdhc3RpbmcgIisodGhpcy5zbG90c2l6ZS1zbG90c2l6ZSkrIiB3b3JkcyBwZXIgc2xvdCIpOworICAgIGNodW5rcy5hZGRFbGVtZW50KGZhc3RBcnJheSk7CisgIH0KKyAgLyoqCisgICAqIEFwcGVuZCBhIDQtaW50ZWdlciByZWNvcmQgdG8gdGhlIENJQSwgc3RhcnRpbmcgd2l0aCByZWNvcmQgMS4gKFNpbmNlCisgICAqIGFycmF5cyBhcmUgaW5pdGlhbGl6ZWQgdG8gYWxsLTAsIDAgaGFzIGJlZW4gcmVzZXJ2ZWQgYXMgdGhlICJ1bmtub3duIgorICAgKiB2YWx1ZSBpbiBEVE0uKQorICAgKiBAcmV0dXJuIHRoZSBpbmRleCBhdCB3aGljaCB0aGlzIHJlY29yZCB3YXMgaW5zZXJ0ZWQuCisgICAqLworICBpbnQgYXBwZW5kU2xvdChpbnQgdzAsIGludCB3MSwgaW50IHcyLCBpbnQgdzMpCisgIHsKKyAgICAvKgorICAgIHRyeQorICAgIHsKKyAgICAgIGludCBuZXdvZmZzZXQgPSAobGFzdFVzZWQrMSkqc2xvdHNpemU7CisgICAgICBmYXN0QXJyYXlbbmV3b2Zmc2V0XSA9IHcwOworICAgICAgZmFzdEFycmF5W25ld29mZnNldCsxXSA9IHcxOworICAgICAgZmFzdEFycmF5W25ld29mZnNldCsyXSA9IHcyOworICAgICAgZmFzdEFycmF5W25ld29mZnNldCszXSA9IHczOworICAgICAgcmV0dXJuICsrbGFzdFVzZWQ7CisgICAgfQorICAgIGNhdGNoKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBhaW9vYmUpCisgICAgKi8KKyAgICB7CisgICAgICBmaW5hbCBpbnQgc2xvdHNpemU9NDsKKyAgICAgIGludCBuZXdvZmZzZXQgPSAobGFzdFVzZWQrMSkqc2xvdHNpemU7CisgICAgICBpbnQgY2h1bmtwb3MgPSBuZXdvZmZzZXQgPj4gbG93Yml0czsKKyAgICAgIGludCBzbG90cG9zID0gKG5ld29mZnNldCAmIGxvd21hc2spOworCisgICAgICAvLyBHcm93IGlmIG5lZWRlZAorICAgICAgaWYgKGNodW5rcG9zID4gY2h1bmtzLnNpemUoKSAtIDEpCisgICAgICAgIGNodW5rcy5hZGRFbGVtZW50KG5ldyBpbnRbY2h1bmthbGxvY10pOworICAgICAgaW50W10gY2h1bmsgPSBjaHVua3MuZWxlbWVudEF0KGNodW5rcG9zKTsKKyAgICAgIGNodW5rW3Nsb3Rwb3NdID0gdzA7CisgICAgICBjaHVua1tzbG90cG9zKzFdID0gdzE7CisgICAgICBjaHVua1tzbG90cG9zKzJdID0gdzI7CisgICAgICBjaHVua1tzbG90cG9zKzNdID0gdzM7CisKKyAgICAgIHJldHVybiArK2xhc3RVc2VkOworICAgIH0KKyAgfQorICAvKioKKyAgICogUmV0cmlldmUgYW4gaW50ZWdlciBmcm9tIHRoZSBDSUEgYnkgcmVjb3JkIG51bWJlciBhbmQgY29sdW1uIHdpdGhpbgorICAgKiB0aGUgcmVjb3JkLCBib3RoIDAtYmFzZWQgKHRob3VnaCBwb3NpdGlvbiAwIGlzIHJlc2VydmVkIGZvciBzcGVjaWFsCisgICAqIHB1cnBvc2VzKS4KKyAgICogQHBhcmFtIHBvc2l0aW9uIGludCBSZWNvcmQgbnVtYmVyCisgICAqIEBwYXJhbSBzbG90cG9zIGludCBDb2x1bW4gbnVtYmVyCisgICAqLworICBpbnQgcmVhZEVudHJ5KGludCBwb3NpdGlvbiwgaW50IG9mZnNldCkgdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICB7CisgICAgLyoKKyAgICB0cnkKKyAgICB7CisgICAgICByZXR1cm4gZmFzdEFycmF5Wyhwb3NpdGlvbipzbG90c2l6ZSkrb2Zmc2V0XTsKKyAgICB9CisgICAgY2F0Y2goQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGFpb29iZSkKKyAgICAqLworICAgIHsKKyAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgc2xvdyByZWFkICgxKSIpOworICAgICAgaWYgKG9mZnNldD49c2xvdHNpemUpCisgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIk9mZnNldCBiaWdnZXIgdGhhbiBzbG90Iik7CisgICAgICBwb3NpdGlvbio9c2xvdHNpemU7CisgICAgICBpbnQgY2h1bmtwb3MgPSBwb3NpdGlvbiA+PiBsb3diaXRzOworICAgICAgaW50IHNsb3Rwb3MgPSBwb3NpdGlvbiAmIGxvd21hc2s7CisgICAgICBpbnRbXSBjaHVuayA9IGNodW5rcy5lbGVtZW50QXQoY2h1bmtwb3MpOworICAgICAgcmV0dXJuIGNodW5rW3Nsb3Rwb3MgKyBvZmZzZXRdOworICAgIH0KKyAgfQorICAKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgbm9kZSBhdCBpbmRleCAicG9zaXRpb24iIGlzIG5vdCBhbiBhbmNlc3RvcgorICAvLyBvZiB0aGUgbm9kZSBhdCBpbmRleCAic3RhcnRQb3MiLiBJRiBJVCBJUywgRE8gTk9UIEFDQ0VQVCBJVCBBTkQKKyAgLy8gUkVUVVJOIC0xLiBJZiBwb3NpdGlvbiBpcyBOT1QgYW4gYW5jZXN0b3IsIHJldHVybiBwb3NpdGlvbi4KKyAgLy8gU3BlY2lhbCBjYXNlOiBUaGUgRG9jdW1lbnQgbm9kZSAocG9zaXRpb249PTApIGlzIGFjY2VwdGFibGUuCisgIC8vCisgIC8vIFRoaXMgdGVzdCBzdXBwb3J0cyBEVE0uZ2V0TmV4dFByZWNlZGluZy4KKyAgaW50IHNwZWNpYWxGaW5kKGludCBzdGFydFBvcywgaW50IHBvc2l0aW9uKQorICB7CisJICAvLyBXZSBoYXZlIHRvIGxvb2sgYWxsIHRoZSB3YXkgdXAgdGhlIGFuY2VzdG9yIGNoYWluCisJICAvLyB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBhbiBhbmNlc3Rvci4KKwkgIGludCBhbmNlc3RvciA9IHN0YXJ0UG9zOworCSAgd2hpbGUoYW5jZXN0b3IgPiAwKQorCSAgeworCSAgICAgICAgLy8gR2V0IHRoZSBub2RlIHdob3NlIGluZGV4ID09IGFuY2VzdG9yCisJCWFuY2VzdG9yKj1zbG90c2l6ZTsKKwkJaW50IGNodW5rcG9zID0gYW5jZXN0b3IgPj4gbG93Yml0czsKKwkJaW50IHNsb3Rwb3MgPSBhbmNlc3RvciAmIGxvd21hc2s7CisJCWludFtdIGNodW5rID0gY2h1bmtzLmVsZW1lbnRBdChjaHVua3Bvcyk7CisJCQkJCQkJCisJCS8vIEdldCB0aGF0IG5vZGUncyBwYXJlbnQgKE5vdGUgdGhhdCB0aGlzIGFzc3VtZXMgd1sxXQorCQkvLyBpcyB0aGUgcGFyZW50IG5vZGUgaW5kZXguIFRoYXQncyByZWFsbHkgYSBEVE0gZmVhdHVyZQorCQkvLyByYXRoZXIgdGhhbiBhIENodW5rZWRJbnRBcnJheSBmZWF0dXJlLikKKwkJYW5jZXN0b3IgPSBjaHVua1tzbG90cG9zICsgMV07CisKKwkJaWYoYW5jZXN0b3IgPT0gcG9zaXRpb24pCisJCQkgYnJlYWs7CisJICB9CisKKwkgIGlmIChhbmNlc3RvciA8PSAwKSAKKwkgIHsKKwkJICByZXR1cm4gcG9zaXRpb247CisJICB9CisJICByZXR1cm4gLTE7CisgIH0KKyAgCisgIC8qKgorICAgKiBAcmV0dXJuIGludCBpbmRleCBvZiBoaWdoZXN0LW51bWJlcmVkIHJlY29yZCBjdXJyZW50bHkgaW4gdXNlCisgICAqLworICBpbnQgc2xvdHNVc2VkKCkKKyAgeworICAgIHJldHVybiBsYXN0VXNlZDsKKyAgfQorCisgIC8qKiBEaXNhcmQgdGhlIGhpZ2hlc3QtbnVtYmVyZWQgcmVjb3JkLiBUaGlzIGlzIHVzZWQgaW4gdGhlIHN0cmluZy1idWZmZXIKKyAgIENJQTsgd2hlbiBvbmx5IGEgc2luZ2xlIGNoYXJhY3RlcnMoKSBjaHVuayBoYXMgYmVlbiByZWNpZXZlZCwgaXRzIGluZGV4CisgICBpcyBtb3ZlZCBpbnRvIHRoZSBUZXh0IG5vZGUgcmF0aGVyIHRoYW4gYmVpbmcgcmVmZXJlbmNlZCBieSBpbmRpcmVjdGlvbgorICAgaW50byB0aGUgdGV4dCBhY2N1bXVsYXRvci4KKyAgICovCisgIHZvaWQgZGlzY2FyZExhc3QoKQorICB7CisgICAgLS1sYXN0VXNlZDsKKyAgfQorCisgIC8qKgorICAgKiBPdmVyd3JpdGUgdGhlIGludGVnZXIgZm91bmQgYXQgYSBzcGVjaWZpYyByZWNvcmQgYW5kIGNvbHVtbi4KKyAgICogVXNlZCB0byBiYWNrLXBhdGNoIGV4aXN0aW5nIHJlY29yZHMsIG1vc3Qgb2Z0ZW4gY2hhbmdpbmcgdGhlaXIKKyAgICogIm5leHQgc2libGluZyIgcmVmZXJlbmNlIGZyb20gMCAodW5rbm93bikgdG8gc29tZXRoaW5nIG1lYW5pbmdmdWwKKyAgICogQHBhcmFtIHBvc2l0aW9uIGludCBSZWNvcmQgbnVtYmVyCisgICAqIEBwYXJhbSBvZmZzZXQgaW50IENvbHVtbiBudW1iZXIKKyAgICogQHBhcmFtIHZhbHVlIGludCBOZXcgY29udGVudHMKKyAgICovCisgIHZvaWQgd3JpdGVFbnRyeShpbnQgcG9zaXRpb24sIGludCBvZmZzZXQsIGludCB2YWx1ZSkgdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICB7CisgICAgLyoKKyAgICB0cnkKKyAgICB7CisgICAgICBmYXN0QXJyYXlbKCBwb3NpdGlvbipzbG90c2l6ZSkrb2Zmc2V0XSA9IHZhbHVlOworICAgIH0KKyAgICBjYXRjaChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWlvb2JlKQorICAgICovCisgICAgeworICAgICAgaWYgKG9mZnNldCA+PSBzbG90c2l6ZSkKKyAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiT2Zmc2V0IGJpZ2dlciB0aGFuIHNsb3QiKTsKKyAgICAgIHBvc2l0aW9uKj1zbG90c2l6ZTsKKyAgICAgIGludCBjaHVua3BvcyA9IHBvc2l0aW9uID4+IGxvd2JpdHM7CisgICAgICBpbnQgc2xvdHBvcyA9IHBvc2l0aW9uICYgbG93bWFzazsKKyAgICAgIGludFtdIGNodW5rID0gY2h1bmtzLmVsZW1lbnRBdChjaHVua3Bvcyk7CisgICAgICBjaHVua1tzbG90cG9zICsgb2Zmc2V0XSA9IHZhbHVlOyAvLyBBVE9NSUMhCisgICAgfQorICB9CisKKyAgLyoqCisgICAqIE92ZXJ3cml0ZSBhbiBlbnRpcmUgKDQtaW50ZWdlcikgcmVjb3JkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAqIE1vc3RseSB1c2VkIHRvIGNyZWF0ZSByZWNvcmQgMCwgdGhlIERvY3VtZW50IG5vZGUuCisgICAqIEBwYXJhbSBwb3NpdGlvbiBpbnRlZ2VyIFJlY29yZCBudW1iZXIKKyAgICogQHBhcmFtIHcwIGludCAKKyAgICogQHBhcmFtIHcxIGludAorICAgKiBAcGFyYW0gdzIgaW50CisgICAqIEBwYXJhbSB3MyBpbnQKKyAgICovCisgIHZvaWQgd3JpdGVTbG90KGludCBwb3NpdGlvbiwgaW50IHcwLCBpbnQgdzEsIGludCB3MiwgaW50IHczKQorICB7CisgICAgICBwb3NpdGlvbiAqPSBzbG90c2l6ZTsKKyAgICAgIGludCBjaHVua3BvcyA9IHBvc2l0aW9uID4+IGxvd2JpdHM7CisgICAgICBpbnQgc2xvdHBvcyA9IChwb3NpdGlvbiAmIGxvd21hc2spOworCisgICAgLy8gR3JvdyBpZiBuZWVkZWQKKyAgICBpZiAoY2h1bmtwb3MgPiBjaHVua3Muc2l6ZSgpIC0gMSkKKyAgICAgIGNodW5rcy5hZGRFbGVtZW50KG5ldyBpbnRbY2h1bmthbGxvY10pOworICAgIGludFtdIGNodW5rID0gY2h1bmtzLmVsZW1lbnRBdChjaHVua3Bvcyk7CisgICAgY2h1bmtbc2xvdHBvc10gPSB3MDsKKyAgICBjaHVua1tzbG90cG9zICsgMV0gPSB3MTsKKyAgICBjaHVua1tzbG90cG9zICsgMl0gPSB3MjsKKyAgICBjaHVua1tzbG90cG9zICsgM10gPSB3MzsKKyAgfQorCisgIC8qKgorICAgKiBSZXRyaWV2ZSB0aGUgY29udGVudHMgb2YgYSByZWNvcmQgaW50byBhIHVzZXItc3VwcGxpZWQgYnVmZmVyIGFycmF5LgorICAgKiBVc2VkIHRvIHJlZHVjZSBhZGRyZXNzaW5nIG92ZXJoZWFkIHdoZW4gY29kZSB3aWxsIGFjY2VzcyBzZXZlcmFsCisgICAqIGNvbHVtbnMgb2YgdGhlIHJlY29yZC4KKyAgICogQHBhcmFtIHBvc2l0aW9uIGludCBSZWNvcmQgbnVtYmVyCisgICAqIEBwYXJhbSBidWZmZXIgaW50W10gSW50ZWdlciBhcnJheSBwcm92aWRlZCBieSB1c2VyLCBtdXN0IGJlIGxhcmdlIGVub3VnaAorICAgKiB0byBob2xkIGEgY29tcGxldGUgcmVjb3JkLgorICAgKi8KKyAgdm9pZCByZWFkU2xvdChpbnQgcG9zaXRpb24sIGludFtdIGJ1ZmZlcikKKyAgeworICAgIC8qCisgICAgdHJ5CisgICAgeworICAgICAgU3lzdGVtLmFycmF5Y29weShmYXN0QXJyYXksIHBvc2l0aW9uKnNsb3RzaXplLCBidWZmZXIsIDAsIHNsb3RzaXplKTsKKyAgICB9CisgICAgY2F0Y2goQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGFpb29iZSkKKyAgICAqLworICAgIHsKKyAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgc2xvdyByZWFkICgyKTogIitwb3NpdGlvbik7CisgICAgICBwb3NpdGlvbiAqPSBzbG90c2l6ZTsKKyAgICAgIGludCBjaHVua3BvcyA9IHBvc2l0aW9uID4+IGxvd2JpdHM7CisgICAgICBpbnQgc2xvdHBvcyA9IChwb3NpdGlvbiAmIGxvd21hc2spOworCisgICAgICAvLyBHcm93IGlmIG5lZWRlZAorICAgICAgaWYgKGNodW5rcG9zID4gY2h1bmtzLnNpemUoKSAtIDEpCisgICAgICAgIGNodW5rcy5hZGRFbGVtZW50KG5ldyBpbnRbY2h1bmthbGxvY10pOworICAgICAgaW50W10gY2h1bmsgPSBjaHVua3MuZWxlbWVudEF0KGNodW5rcG9zKTsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2h1bmssc2xvdHBvcyxidWZmZXIsMCxzbG90c2l6ZSk7CisgICAgfQorICB9CisKKyAgY2xhc3MgQ2h1bmtzVmVjdG9yCisgIHsKKyAgICBmaW5hbCBpbnQgQkxPQ0tTSVpFID0gNjQ7CisgICAgaW50W10gbV9tYXBbXSA9IG5ldyBpbnRbQkxPQ0tTSVpFXVtdOworICAgIGludCBtX21hcFNpemUgPSBCTE9DS1NJWkU7CisgICAgaW50IHBvcyA9IDA7CisgICAgCisgICAgQ2h1bmtzVmVjdG9yKCkKKyAgICB7CisgICAgfQorICAgIAorICAgIGZpbmFsIGludCBzaXplKCkKKyAgICB7CisgICAgICByZXR1cm4gcG9zOworICAgIH0KKyAgICAKKyAgICB2b2lkIGFkZEVsZW1lbnQoaW50W10gdmFsdWUpCisgICAgeworICAgICAgaWYocG9zID49IG1fbWFwU2l6ZSkKKyAgICAgIHsKKyAgICAgICAgaW50IG9yZ01hcFNpemUgPSBtX21hcFNpemU7CisgICAgICAgIHdoaWxlKHBvcyA+PSBtX21hcFNpemUpCisgICAgICAgICAgbV9tYXBTaXplKz1CTE9DS1NJWkU7CisgICAgICAgIGludFtdIG5ld01hcFtdID0gbmV3IGludFttX21hcFNpemVdW107CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobV9tYXAsIDAsIG5ld01hcCwgMCwgb3JnTWFwU2l6ZSk7CisgICAgICAgIG1fbWFwID0gbmV3TWFwOworICAgICAgfQorICAgICAgLy8gRm9yIG5vdywganVzdCBkbyBhIHNpbXBsZSBhcHBlbmQuICBBIHNvcnRlZCBpbnNlcnQgb25seSAKKyAgICAgIC8vIG1ha2VzIHNlbnNlIGlmIHdlJ3JlIGRvaW5nIGFuIGJpbmFyeSBzZWFyY2ggb3Igc29tZSBzdWNoLgorICAgICAgbV9tYXBbcG9zXSA9IHZhbHVlOworICAgICAgcG9zKys7CisgICAgfQorICAgIAorICAgIGZpbmFsIGludFtdIGVsZW1lbnRBdChpbnQgcG9zKQorICAgIHsKKyAgICAgIHJldHVybiBtX21hcFtwb3NdOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9Db3JvdXRpbmVNYW5hZ2VyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0Nvcm91dGluZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTE0NGI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9Db3JvdXRpbmVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCisgKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgorICogPHA+U3VwcG9ydCB0aGUgY29yb3V0aW5lIGRlc2lnbiBwYXR0ZXJuLjwvcD4KKyAqIAorICogPHA+QSBjb3JvdXRpbmUgc2V0IGlzIGEgdmVyeSBzaW1wbGUgY29vcGVyYXRpdmUgbm9uLXByZWVtcHRpdmUKKyAqIG11bHRpdGFza2luZyBtb2RlbCwgd2hlcmUgdGhlIHN3aXRjaCBmcm9tIG9uZSB0YXNrIHRvIGFub3RoZXIgaXMKKyAqIHBlcmZvcm1lZCB2aWEgYW4gZXhwbGljaXQgcmVxdWVzdC4gQ29yb3V0aW5lcyBpbnRlcmFjdCBhY2NvcmRpbmcgdG8KKyAqIHRoZSBmb2xsb3dpbmcgcnVsZXM6PC9wPgorICoKKyAqIDx1bD4KKyAqIDxsaT5PbmUgY29yb3V0aW5lIGluIHRoZSBzZXQgaGFzIGNvbnRyb2wsIHdoaWNoIGl0IHJldGFpbnMgdW50aWwgaXQKKyAqIGVpdGhlciBleGl0cyBvciByZXN1bWVzIGFub3RoZXIgY29yb3V0aW5lLjwvbGk+CisgKiA8bGk+QSBjb3JvdXRpbmUgaXMgYWN0aXZhdGVkIHdoZW4gaXQgaXMgcmVzdW1lZCBieSBzb21lIG90aGVyIGNvcm91dGluZQorICogZm9yIHRoZSBmaXJzdCB0aW1lLjwvbGk+CisgKiA8bGk+QW4gYWN0aXZlIGNvcm91dGluZSB0aGF0IGdpdmVzIHVwIGNvbnRyb2wgYnkgcmVzdW1pbmcgYW5vdGhlciBpbgorICogdGhlIHNldCByZXRhaW5zIGl0cyBjb250ZXh0IC0tIGluY2x1ZGluZyBjYWxsIHN0YWNrIGFuZCBsb2NhbCB2YXJpYWJsZXMKKyAqIC0tIHNvIHRoYXQgaWYvd2hlbiBpdCBpcyByZXN1bWVkLCBpdCB3aWxsIHByb2NlZWQgZnJvbSB0aGUgcG9pbnQgYXQgd2hpY2gKKyAqIGl0IGxhc3QgZ2F2ZSB1cCBjb250cm9sLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxwPkNvcm91dGluZXMgY2FuIGJlIHRob3VnaHQgb2YgYXMgZmFsbGluZyBzb21ld2hlcmUgYmV0d2VlbiBwaXBlcyBhbmQKKyAqIHN1YnJvdXRpbmVzLiBMaWtlIGNhbGwvcmV0dXJuLCB0aGVyZSBpcyBhbiBleHBsaWNpdCBmbG93IG9mIGNvbnRyb2wKKyAqIGZyb20gb25lIGNvcm91dGluZSB0byBhbm90aGVyLiBMaWtlIHBpcGVzLCBuZWl0aGVyIGNvcm91dGluZSBpcworICogYWN0dWFsbHkgImluIGNoYXJnZSIsIGFuZCBuZWl0aGVyIG11c3QgZXhpdCBpbiBvcmRlciB0byB0cmFuc2ZlcgorICogY29udHJvbCB0byB0aGUgb3RoZXIuIDwvcD4KKyAqIAorICogPHA+T25lIGNsYXNzaWMgYXBwbGljYXRpb24gb2YgY29yb3V0aW5lcyBpcyBpbiBjb21waWxlcnMsIHdoZXJlIGJvdGgKKyAqIHRoZSBwYXJzZXIgYW5kIHRoZSBsZXhlciBhcmUgbWFpbnRhaW5pbmcgY29tcGxleCBzdGF0ZQorICogaW5mb3JtYXRpb24uIFRoZSBwYXJzZXIgcmVzdW1lcyB0aGUgbGV4ZXIgdG8gcHJvY2VzcyBpbmNvbWluZworICogY2hhcmFjdGVycyBpbnRvIGxleGljYWwgdG9rZW5zLCBhbmQgdGhlIGxleGVyIHJlc3VtZXMgdGhlIHBhcnNlcgorICogd2hlbiBpdCBoYXMgcmVhY2hlZCBhIHBvaW50IGF0IHdoaWNoIGl0IGhhcyBhIHJlbGlhYmx5IGludGVycHJldGVkCisgKiBzZXQgb2YgdG9rZW5zIGF2YWlsYWJsZSBmb3Igc2VtYW50aWMgcHJvY2Vzc2luZy4gU3RydWN0dXJpbmcgdGhpcworICogYXMgY2FsbC1hbmQtcmV0dXJuIHdvdWxkIHJlcXVpcmUgc2F2aW5nIGFuZCByZXN0b3JpbmcgYQorICogY29uc2lkZXJhYmxlIGFtb3VudCBvZiBzdGF0ZSBlYWNoIHRpbWUuIFN0cnVjdHVyaW5nIGl0IGFzIHR3byB0YXNrcworICogY29ubmVjdGVkIGJ5IGEgcXVldWUgbWF5IGludm9sdmUgaGlnaGVyIG92ZXJoZWFkIChpbiBzeXN0ZW1zIHdoaWNoCisgKiBjYW4gb3B0aW1pemUgdGhlIGNvcm91dGluZSBtZXRhcGhvciksIGlzbid0IG5lY2Vzc2FyaWx5IGFzIGNsZWFyIGluCisgKiBpbnRlbnQsIG1heSBoYXZlIHRyb3VibGUgaGFuZGxpbmcgY2FzZXMgd2hlcmUgZGF0YSBmbG93cyBpbiBib3RoCisgKiBkaXJlY3Rpb25zLCBhbmQgbWF5IG5vdCBoYW5kbGUgc29tZSBvZiB0aGUgbW9yZSBjb21wbGV4IGNhc2VzIHdoZXJlCisgKiBtb3JlIHRoYW4gdHdvIGNvcm91dGluZXMgYXJlIGludm9sdmVkLjwvcD4KKyAqIAorICogPHA+TW9zdCBjb3JvdXRpbmUgc3lzdGVtcyBhbHNvIHByb3ZpZGUgYSB3YXkgdG8gcGFzcyBkYXRhIGJldHdlZW4gdGhlCisgKiBzb3VyY2UgYW5kIHRhcmdldCBvZiBhIHJlc3VtZSBvcGVyYXRpb247IHRoaXMgaXMgc29tZXRpbWVzIHJlZmVycmVkCisgKiB0byBhcyAieWllbGRpbmciIGEgdmFsdWUuICBPdGhlcnMgcmVseSBvbiB0aGUgZmFjdCB0aGF0LCBzaW5jZSBvbmx5CisgKiBvbmUgbWVtYmVyIG9mIGEgY29yb3V0aW5lIHNldCBpcyBydW5uaW5nIGF0IGEgdGltZSBhbmQgZG9lcyBub3QKKyAqIGxvc2UgY29udHJvbCB1bnRpbCBpdCBjaG9vc2VzIHRvIGRvIHNvLCBkYXRhIHN0cnVjdHVyZXMgbWF5IGJlCisgKiBkaXJlY3RseSBzaGFyZWQgYmV0d2VlbiB0aGVtIHdpdGggb25seSBtaW5pbWFsIHByZWNhdXRpb25zLjwvcD4KKyAqIAorICogPHA+Ik5vdGU6IFRoaXMgc2hvdWxkIG5vdCBiZSB0YWtlbiB0byBtZWFuIHRoYXQgcHJvZHVjZXIvY29uc3VtZXIKKyAqIHByb2JsZW1zIHNob3VsZCBiZSBhbHdheXMgYmUgZG9uZSB3aXRoIGNvcm91dGluZXMuIiBRdWV1ZWluZyBpcworICogb2Z0ZW4gYSBiZXR0ZXIgc29sdXRpb24gd2hlbiBvbmx5IHR3byB0aHJlYWRzIG9mIGV4ZWN1dGlvbiBhcmUKKyAqIGludm9sdmVkIGFuZCBmdWxsIHR3by13YXkgaGFuZHNoYWtpbmcgaXMgbm90IHJlcXVpcmVkLiBJdCdzIGEgYml0CisgKiBkaWZmaWN1bHQgdG8gZmluZCBzaG9ydCBwZWRhZ29naWNhbCBleGFtcGxlcyB0aGF0IHJlcXVpcmUKKyAqIGNvcm91dGluZXMgZm9yIGEgY2xlYXIgc29sdXRpb24uPC9wPgorICogCisgKiA8cD5UaGUgZmFjdCB0aGF0IG9ubHkgb25lIG9mIGEgZ3JvdXAgb2YgY29yb3V0aW5lcyBpcyBydW5uaW5nIGF0IGEKKyAqIHRpbWUsIGFuZCB0aGUgY29udHJvbCB0cmFuc2ZlciBiZXR3ZWVuIHRoZW0gaXMgZXhwbGljaXQsIHNpbXBsaWZpZXMKKyAqIHRoZWlyIHBvc3NpYmxlIGludGVyYWN0aW9ucywgYW5kIGluIHNvbWUgaW1wbGVtZW50YXRpb25zIHBlcm1pdHMKKyAqIHRoZW0gdG8gYmUgaW1wbGVtZW50ZWQgbW9yZSBlZmZpY2llbnRseSB0aGFuIGdlbmVyYWwgbXVsdGl0YXNraW5nLgorICogSW4gc29tZSBzaXR1YXRpb25zLCBjb3JvdXRpbmVzIGNhbiBiZSBjb21waWxlZCBvdXQgZW50aXJlbHk7CisgKiBpbiBvdGhlcnMsIHRoZXkgbWF5IG9ubHkgcmVxdWlyZSBhIGZldyBpbnN0cnVjdGlvbnMgbW9yZSB0aGFuIGEKKyAqIHNpbXBsZSBmdW5jdGlvbiBjYWxsLjwvcD4KKyAqCisgKiA8cD5UaGlzIHZlcnNpb24gaXMgYnVpbHQgb24gdG9wIG9mIHN0YW5kYXJkIEphdmEgdGhyZWFkaW5nLCBzaW5jZQorICogdGhhdCdzIGFsbCB3ZSBoYXZlIGF2YWlsYWJsZSByaWdodCBub3cuIEl0J3MgYmVlbiBlbmNhcHN1bGF0ZWQgZm9yCisgKiBjb2RlIGNsYXJpdHkgYW5kIHBvc3NpYmxlIGZ1dHVyZSBvcHRpbWl6YXRpb24uPC9wPgorICogCisgKiA8cD4oVHdvIHBvc3NpYmxlIGFwcHJvYWNoZXM6IHdhaXQtbm90aWZ5IGJhc2VkIGFuZCBxdWV1ZS1iYXNlZC4gU29tZQorICogZm9sa3MgdGhpbmsgdGhhdCBhIG9uZS1pdGVtIHF1ZXVlIGlzIGEgY2xlYW5lciBzb2x1dGlvbiBiZWNhdXNlIGl0J3MKKyAqIG1vcmUgYWJzdHJhY3QgLS0gYnV0IHNpbmNlIGNvcm91dGluZSBfaXNfIGFuIGFic3RyYWN0aW9uIEknbSBub3QgcmVhbGx5CisgKiB3b3JyaWVkIGFib3V0IHRoYXQ7IGZvbGtzIHNob3VsZCBiZSBhYmxlIHRvIHN3aXRjaCB0aGlzIGNvZGUgd2l0aG91dAorICogY29uY2Vybi4pPC9wPgorICogCisgKiA8cD4lVEJEJSBUSElTIFNIT1VMRCBCRSBBTiBJTlRFUkZBQ0UsIHRvIGZhY2lsaXRhdGUgYnVpbGRpbmcgb3RoZXIKKyAqIGltcGxlbWVudGF0aW9ucy4uLiBwZXJoYXBzIGluY2x1ZGluZyBhIHRydWUgY29yb3V0aW5lIHN5c3RlbQorICogc29tZWRheSwgcmF0aGVyIHRoYW4gY29udHJvbGxlZCB0aHJlYWRpbmcuIEFyZ3VhYmx5IENvcm91dGluZQorICogaXRzZWxmIHNob3VsZCBiZSBhbiBpbnRlcmZhY2UgbXVjaCBsaWtlIFJ1bm5hYmxlLCBidXQgSSB0aGluayB0aGF0CisgKiBjYW4gYmUgYnVpbHQgb24gdG9wIG9mIHRoaXMuPC9wPgorICogKi8KK3B1YmxpYyBjbGFzcyBDb3JvdXRpbmVNYW5hZ2VyCit7CisgIC8qKiAiSXMgdGhpcyBjb3JvdXRpbmUgSUQgbnVtYmVyIGFscmVhZHkgaW4gdXNlIiBsb29rdXAgdGFibGUuCisgICAqIEN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBhIGJpdHNldCBhcyBhIGNvbXByb21pc2UgYmV0d2VlbgorICAgKiBjb21wYWN0bmVzcyBhbmQgc3BlZWQgb2YgYWNjZXNzLCBidXQgb2J2aW91c2x5IG90aGVyIHNvbHV0aW9ucworICAgKiBjb3VsZCBiZSBhcHBsaWVkLgorICAgKiAqLworICBCaXRTZXQgbV9hY3RpdmVJRHM9bmV3IEJpdFNldCgpOworCisgIC8qKiBMaW1pdCBvbiB0aGUgY29yb3V0aW5lIElEIG51bWJlcnMgYWNjZXB0ZWQuIEkgZGlkbid0IHdhbnQgdGhlCisgICAqIGluLXVzZSB0YWJsZSB0byBncm93IHdpdGhvdXQgYm91bmQuIElmIHdlIHN3aXRjaCB0byBhIG1vcmUgZWZmaWNpZW50CisgICAqIHNwYXJzZS1hcnJheSBtZWNoYW5pc20sIGl0IG1heSBiZSBwb3NzaWJsZSB0byByYWlzZSBvciBlbGltaW5hdGUKKyAgICogdGhpcyBib3VuZGFyeS4KKyAgICovCisgIHN0YXRpYyBpbnQgbV91bnJlYXNvbmFibGVJZD0xMDI0OworCisgIC8qKiBJbnRlcm5hbCBmaWVsZCB1c2VkIHRvIGhvbGQgdGhlIGRhdGEgYmVpbmcgZXhwbGljaXRseSBwYXNzZWQKKyAgICogZnJvbSBvbmUgY29yb3V0aW5lIHRvIGFub3RoZXIgZHVyaW5nIGEgY29fcmVzdW1lKCkgb3BlcmF0aW9uLgorICAgKiAoT2YgY291cnNlIGltcGxpY2l0IGRhdGEgc2hhcmluZyBtYXkgYWxzbyBvY2N1cjsgb25lIG9mIHRoZSByZWFzb25zCisgICAqIGZvciB1c2luZyBjb3JvdXRpbmVzIGlzIHRoYXQgeW91J3JlIGd1YXJhbnRlZWQgdGhhdCBub25lIG9mIHRoZQorICAgKiBvdGhlciBjb3JvdXRpbmVzIGluIHlvdXIgc2V0IGFyZSB1c2luZyBzaGFyZWQgc3RydWN0dXJlcyBhdCB0aGUgdGltZQorICAgKiB5b3UgYWNjZXNzIHRoZW0uKQorICAgKgorICAgKiAlUkVWSUVXJSBJdCdzIGJlZW4gcHJvcG9zZWQgdGhhdCB3ZSBiZSBhYmxlIHRvIHBhc3MgdHlwZXMgb2YgZGF0YQorICAgKiBvdGhlciB0aGFuIE9iamVjdCAtLSBtb3JlIHNwZWNpZmljIG9iamVjdCB0eXBlcywgb3IKKyAgICogbGlnaHRlci13ZWlnaHQgcHJpbWl0aXZlcy4gIFRoaXMgd291bGQgc2VlbSB0byBjcmVhdGUgYSBwb3RlbnRpYWwKKyAgICogZXhwbG9zaW9uIG9mICJwYXNzIHggcmVjaWV2ZSB5IGJhY2siIG1ldGhvZHMgKG9yIHJlcXVpcmUKKyAgICogZnJhY3R1cmluZyByZXN1bWUgaW50byB0d28gY2FsbHMsIHJlc3VtZS1vdGhlciBhbmQKKyAgICogd2FpdC10by1iZS1yZXN1bWVkKSwgYW5kIHRoZSB3ZWlnaHQgaXNzdWUgY291bGQgYmUgbWFuYWdlZCBieQorICAgKiByZXVzaW5nIGEgbXV0YWJsZSBidWZmZXIgb2JqZWN0IHRvIGNvbnRhaW4gdGhlIHByaW1pdGl2ZQorICAgKiAocmVtZW1iZXIgdGhhdCBvbmx5IG9uZSBjb3JvdXRpbmUgcnVucyBhdCBhIHRpbWUsIHNvIG9uY2UgdGhlCisgICAqIGJ1ZmZlcidzIHNldCBpdCB3b24ndCBiZSB3YWxrZWQgb24pLiBUeXBlY2hlY2tpbmcgb2JqZWN0cyBpcworICAgKiBpbnRlcmVzdGluZyBmcm9tIGEgY29kZS1yb2J1c3RuZXNzIHBvaW50IG9mIHZpZXcsIGJ1dCBpdCdzCisgICAqIHVuY2xlYXIgd2hldGhlciBpdCBtYWtlcyBzZW5zZSB0byBlbmNhcHN1bGF0ZSB0aGF0IGluIHRoZQorICAgKiBjb3JvdXRpbmUgY29kZSBvciBsZXQgdGhlIGNhbGxlcnMgZG8gaXQsIHNpbmNlIGl0IGRlcGVuZHMgb24gUlRUSQorICAgKiBlaXRoZXIgd2F5LiBSZXN0cmljdGluZyB0aGUgcGFyYW1ldGVycyB0byBvYmplY3RzIGltcGxlbWVudGluZyBhCisgICAqIHNwZWNpZmljIENvcm91dGluZVBhcmFtZXRlciBpbnRlcmZhY2UgZG9lcyBfbm90XyBzZWVtIHRvIGJlIGEgbmV0CisgICAqIHdpbjsgYXBwbGljYXRpb25zIGNhbiBkbyBzbyBpZiB0aGV5IHdhbnQgdmlhIGZyb250LWVuZCBjb2RlLCBidXQKKyAgICogdGhlcmUgc2VlbSB0byBiZSB0b28gbWFueSB1c2UgY2FzZXMgaW52b2x2aW5nIHBhc3NpbmcgYW4gZXhpc3RpbmcKKyAgICogb2JqZWN0IHR5cGUgdGhhdCB5b3UgbWF5IG5vdCBoYXZlIHRoZSBmcmVlZG9tIHRvIGFsdGVyIGFuZCBtYXkKKyAgICogbm90IHdhbnQgdG8gc3BlbmQgdGltZSB3cmFwcGluZyBhbm90aGVyIG9iamVjdCBhcm91bmQuCisgICAqICovCisgIE9iamVjdCBtX3lpZWxkPW51bGw7CisKKyAgLy8gRXhwb3NlPz8/CisgIGZpbmFsIHN0YXRpYyBpbnQgTk9CT0RZPS0xOworICBmaW5hbCBzdGF0aWMgaW50IEFOWUJPRFk9LTE7CisKKyAgLyoqIEludGVybmFsIGZpZWxkIHVzZWQgdG8gY29uZmlybSB0aGF0IHRoZSBjb3JvdXRpbmUgbm93IHdha2luZyB1cCBpcworICAgKiBpbiBmYWN0IHRoZSBvbmUgd2UgaW50ZW5kZWQgdG8gcmVzdW1lLiBTb21lIHN1Y2ggc2VsZWN0aW9uIG1lY2hhbmlzbQorICAgKiBpcyBuZWVkZWQgd2hlbiBtb3JlIHRoYXQgdHdvIGNvcm91dGluZXMgYXJlIG9wZXJhdGluZyB3aXRoaW4gdGhlIHNhbWUKKyAgICogZ3JvdXAuCisgICAqLworICBpbnQgbV9uZXh0Q29yb3V0aW5lPU5PQk9EWTsKKyAgCisgIC8qKiA8cD5FYWNoIGNvcm91dGluZSBpbiB0aGUgc2V0IG1hbmFnZWQgYnkgYSBzaW5nbGUKKyAgICogQ29yb3V0aW5lTWFuYWdlciBpcyBpZGVudGlmaWVkIGJ5IGEgc21hbGwgcG9zaXRpdmUgaW50ZWdlci4gVGhpcworICAgKiBicmluZ3MgdXAgdGhlIHF1ZXN0aW9uIG9mIGhvdyB0byBtYW5hZ2UgdGhvc2UgaW50ZWdlcnMgdG8gYXZvaWQKKyAgICogcmV1c2UuLi4gc2luY2UgaWYgdHdvIGNvcm91dGluZXMgdXNlIHRoZSBzYW1lIElEIG51bWJlciwgcmVzdW1pbmcKKyAgICogdGhhdCBJRCBjb3VsZCByZXN1bWUgZWl0aGVyLiBJIGNhbiBzZWUgYXJndW1lbnRzIGZvciBlaXRoZXIKKyAgICogYWxsb3dpbmcgYXBwbGljYXRpb25zIHRvIHNlbGVjdCB0aGVpciBvd24gbnVtYmVycyAodGhleSBtYXkgd2FudAorICAgKiB0byBkZWNsYXJlIG1uZW1vbmljcyB2aWEgbWFuZWZlc3QgY29uc3RhbnRzKSBvciBnZW5lcmF0aW5nCisgICAqIG51bWJlcnMgb24gZGVtYW5kLiAgVGhpcyByb3V0aW5lJ3MgaW50ZW5kZWQgdG8gc3VwcG9ydCBib3RoCisgICAqIGFwcHJvYWNoZXMuPC9wPgorICAgKgorICAgKiA8cD4lUkVWSUVXJSBXZSBjb3VsZCB1c2UgYW4gb2JqZWN0IGFzIHRoZSBpZGVudGlmaWVyLiBOb3Qgc3VyZQorICAgKiBpdCdzIGEgbmV0IGdhaW4sIHRob3VnaCBpdCB3b3VsZCBhbGxvdyB0aGUgdGhyZWFkIHRvIGJlIGl0cyBvd24KKyAgICogSUQuIFBvbmRlci48L3A+CisgICAqCisgICAqIEBwYXJhbSBjb3JvdXRpbmVJRDogSWYgPj0wLCByZXF1ZXN0cyB0aGF0IHdlIHJlc2VydmUgdGhpcyBudW1iZXIuCisgICAqIElmIDwwLCByZXF1ZXN0cyB0aGF0IHdlIGZpbmQsIHJlc2VydmUsIGFuZCByZXR1cm4gYW4gYXZhaWxhYmxlIElECisgICAqIG51bWJlci4KKyAgICoKKyAgICogQHJldHVybiBJZiA+PTAsIHRoZSBJRCBudW1iZXIgdG8gYmUgdXNlZCBieSB0aGlzIGNvcm91dGluZS4gSWYgPDAsCisgICAqIGFuIGVycm9yIG9jY3VycmVkIC0tIHRoZSBJRCByZXF1ZXN0ZWQgd2FzIGFscmVhZHkgaW4gdXNlLCBvciB3ZQorICAgKiBjb3VsZG4ndCBhc3NpZ24gb25lIHdpdGhvdXQgZ29pbmcgb3ZlciB0aGUgInVucmVhc29uYWJsZSB2YWx1ZSIgbWFyaworICAgKiAqLworICBwdWJsaWMgc3luY2hyb25pemVkIGludCBjb19qb2luQ29yb3V0aW5lU2V0KGludCBjb3JvdXRpbmVJRCkKKyAgeworICAgIGlmKGNvcm91dGluZUlEPj0wKQorICAgICAgeworICAgICAgICBpZihjb3JvdXRpbmVJRD49bV91bnJlYXNvbmFibGVJZCB8fCBtX2FjdGl2ZUlEcy5nZXQoY29yb3V0aW5lSUQpKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8vIFdoYXQgSSB3YW50IGlzICJGaW5kIGZpcnN0IGNsZWFyIGJpdCIuIFRoYXQgZG9lc24ndCBleGlzdC4KKyAgICAgICAgLy8gSkRLMS4yIGFkZGVkICJmaW5kIGxhc3Qgc2V0IGJpdCIsIGJ1dCB0aGF0IGRvZXNuJ3QgaGVscCBub3cuCisgICAgICAgIGNvcm91dGluZUlEPTA7CisgICAgICAgIHdoaWxlKGNvcm91dGluZUlEPG1fdW5yZWFzb25hYmxlSWQpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYobV9hY3RpdmVJRHMuZ2V0KGNvcm91dGluZUlEKSkKKyAgICAgICAgICAgICAgKytjb3JvdXRpbmVJRDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBpZihjb3JvdXRpbmVJRD49bV91bnJlYXNvbmFibGVJZCkKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICBtX2FjdGl2ZUlEcy5zZXQoY29yb3V0aW5lSUQpOworICAgIHJldHVybiBjb3JvdXRpbmVJRDsKKyAgfQorCisgIC8qKiBJbiB0aGUgc3RhbmRhcmQgY29yb3V0aW5lIGFyY2hpdGVjdHVyZSwgY29yb3V0aW5lcyBhcmUKKyAgICogaWRlbnRpZmllZCBieSB0aGVpciBtZXRob2QgbmFtZXMgYW5kIGFyZSBsYXVuY2hlZCBhbmQgcnVuIHVwIHRvCisgICAqIHRoZWlyIGZpcnN0IHlpZWxkIGJ5IHNpbXBseSByZXN1bWluZyB0aGVtOyBpdHMncyBwcmVzdW1lZCB0aGF0CisgICAqIHRoaXMgcmVjb2duaXplcyB0aGUgbm90LWFscmVhZHktcnVubmluZyBjYXNlIGFuZCBkb2VzIHRoZSByaWdodAorICAgKiB0aGluZy4gV2Ugc2VlbSB0byBuZWVkIGEgd2F5IHRvIGFjaGlldmUgdGhhdCBzYW1lIHRocmVhZHNhZmUKKyAgICogcnVuLXVwLi4uICBlZywgc3RhcnQgdGhlIGNvcm91dGluZSB3aXRoIGEgd2FpdC4KKyAgICoKKyAgICogJVRCRCUgd2hldGhlciB0aGlzIG1ha2VzIGFueSBzZW5zZS4uLgorICAgKgorICAgKiBAcGFyYW0gdGhpc0Nvcm91dGluZSB0aGUgaWRlbnRpZmllciBvZiB0aGlzIGNvcm91dGluZSwgc28gd2UgY2FuCisgICAqIHJlY29nbml6ZSB3aGVuIHdlIGFyZSBiZWluZyByZXN1bWVkLgorICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb24gaWYgdGhpc0Nvcm91dGluZSBpc24ndAorICAgKiBhIHJlZ2lzdGVyZWQgbWVtYmVyIG9mIHRoaXMgZ3JvdXAuICVSRVZJRVclIHdoZXRoZXIgdGhpcyBpcyB0aGUKKyAgICogYmVzdCBjaG9pY2UuCisgICAqICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGNvX2VudHJ5X3BhdXNlKGludCB0aGlzQ29yb3V0aW5lKSB0aHJvd3MgamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICB7CisgICAgaWYoIW1fYWN0aXZlSURzLmdldCh0aGlzQ29yb3V0aW5lKSkKKyAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCk7CisKKyAgICB3aGlsZShtX25leHRDb3JvdXRpbmUgIT0gdGhpc0Nvcm91dGluZSkKKyAgICAgIHsKKyAgICAgICAgdHJ5IAorICAgICAgICAgIHsKKyAgICAgICAgICAgIHdhaXQoKTsKKyAgICAgICAgICB9CisgICAgICAgIGNhdGNoKGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vICVUQkQlIC0tIERlY2xhcmU/IEVuY2Fwc3VsYXRlPyBJZ25vcmU/IE9yCisgICAgICAgICAgICAvLyBkYW5jZSB3aWRkZXJzaGlucyBhYm91dCB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGU/CisgICAgICAgICAgfQorICAgICAgfQorICAgIAorICAgIHJldHVybiBtX3lpZWxkOworICB9CisKKyAgLyoqIFRyYW5zZmVyIGNvbnRyb2wgdG8gYW5vdGhlciBjb3JvdXRpbmUgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkIGFuZAorICAgKiBpcyB3YWl0aW5nIG9uIHRoaXMgQ29yb3V0aW5lTWFuYWdlci4gV2Ugd29uJ3QgcmV0dXJuIGZyb20gdGhpcyBjYWxsCisgICAqIHVudGlsIHRoYXQgcm91dGluZSBoYXMgcmVsaW5xdWlzaGVkIGNvbnRyb2wuCisgICAqCisgICAqICVUQkQlIFdoYXQgc2hvdWxkIHdlIGRvIGlmIHRvQ29yb3V0aW5lIGlzbid0IHJlZ2lzdGVyZWQ/IEV4Y2VwdGlvbj8KKyAgICoKKyAgICogQHBhcmFtIGFyZ19vYmplY3QgQSB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gdGhlIG90aGVyIGNvcm91dGluZS4KKyAgICogQHBhcmFtIHRoaXNDb3JvdXRpbmUgSW50ZWdlciBpZGVudGlmaWVyIGZvciB0aGlzIGNvcm91dGluZS4gVGhpcyBpcyB0aGUKKyAgICogSUQgd2Ugd2F0Y2ggZm9yIHRvIHNlZSBpZiB3ZSdyZSB0aGUgb25lcyBiZWluZyByZXN1bWVkLgorICAgKiBAcGFyYW0gdG9Db3JvdXRpbmUuIEludGVnZXIgaWRlbnRpZmllciBmb3IgdGhlIGNvcm91dGluZSB3ZSB3aXNoIHRvCisgICAqIGludm9rZS4gCisgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBpZiB0b0Nvcm91dGluZSBpc24ndCBhCisgICAqIHJlZ2lzdGVyZWQgbWVtYmVyIG9mIHRoaXMgZ3JvdXAuICVSRVZJRVclIHdoZXRoZXIgdGhpcyBpcyB0aGUgYmVzdCBjaG9pY2UuCisgICAqICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGNvX3Jlc3VtZShPYmplY3QgYXJnX29iamVjdCxpbnQgdGhpc0Nvcm91dGluZSxpbnQgdG9Db3JvdXRpbmUpIHRocm93cyBqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uCisgIHsKKyAgICBpZighbV9hY3RpdmVJRHMuZ2V0KHRvQ29yb3V0aW5lKSkKKyAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCJDb3JvdXRpbmUgbm90IGF2YWlsYWJsZSwgaWQ9Iit0b0Nvcm91dGluZSk7CisKKyAgICAvLyBXZSBleHBlY3QgdGhlc2UgdmFsdWVzIHRvIGJlIG92ZXJ3cml0dGVuIGR1cmluZyB0aGUgbm90aWZ5KCkvd2FpdCgpCisgICAgLy8gcGVyaW9kcywgYXMgb3RoZXIgY29yb3V0aW5lcyBpbiB0aGlzIHNldCBnZXQgdGhlaXIgb3Bwb3J0dW5pdHkgdG8gcnVuLgorICAgIG1feWllbGQ9YXJnX29iamVjdDsKKyAgICBtX25leHRDb3JvdXRpbmU9dG9Db3JvdXRpbmU7CisKKyAgICBub3RpZnkoKTsKKyAgICB3aGlsZShtX25leHRDb3JvdXRpbmUgIT0gdGhpc0Nvcm91dGluZSB8fCBtX25leHRDb3JvdXRpbmU9PUFOWUJPRFkgfHwgbV9uZXh0Q29yb3V0aW5lPT1OT0JPRFkpCisgICAgICB7CisgICAgICAgIHRyeSAKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIndhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHdhaXQoKTsKKyAgICAgICAgICB9CisgICAgICAgIGNhdGNoKGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vICVUQkQlIC0tIERlY2xhcmU/IEVuY2Fwc3VsYXRlPyBJZ25vcmU/IE9yCisgICAgICAgICAgICAvLyBkYW5jZSBkZWFzaWwgYWJvdXQgdGhlIHByb2dyYW0gY291bnRlcj8KKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICBpZihtX25leHRDb3JvdXRpbmU9PU5PQk9EWSkKKyAgICAgIHsKKyAgICAgICAgLy8gUGFzcyBpdCBhbG9uZworICAgICAgICBjb19leGl0KHRoaXNDb3JvdXRpbmUpOworICAgICAgICAvLyBBbmQgaW5mb3JtIHRoaXMgY29yb3V0aW5lIHRoYXQgaXRzIHBhcnRuZXJzIGFyZSBHb2luZyBBd2F5CisgICAgICAgIC8vICVSRVZJRVclIFNob3VsZCB0aGlzIHRocm93L3JldHVybiBzb21ldGhpbmcgbW9yZSB1c2VmdWw/CisgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCJDb3JvdXRpbmVNYW5hZ2VyIHJlY2lldmVkIGNvX2V4aXQoKSByZXF1ZXN0Iik7CisgICAgICB9CisgICAgCisgICAgcmV0dXJuIG1feWllbGQ7CisgIH0KKyAgCisgIC8qKiBUZXJtaW5hdGUgdGhpcyBlbnRpcmUgc2V0IG9mIGNvcm91dGluZXMuIFRoZSBvdGhlcnMgd2lsbCBiZQorICAgKiBkZXJlZ2lzdGVyZWQgYW5kIGhhdmUgZXhjZXB0aW9ucyB0aHJvd24gYXQgdGhlbS4gTm90ZSB0aGF0IHRoaXMKKyAgICogaXMgaW50ZW5kZWQgYXMgYSBwYW5pYy1zaHV0ZG93biBvcGVyYXRpb247IHVuZGVyIG5vcm1hbAorICAgKiBjaXJjdW1zdGFuY2VzIGEgY29yb3V0aW5lIHNob3VsZCBhbHdheXMgZW5kIHdpdGggY29fZXhpdF90bygpIGluCisgICAqIG9yZGVyIHRvIHBvbGl0ZWx5IGluZm9ybSBhdCBsZWFzdCBvbmUgb2YgaXRzIHBhcnRuZXJzIHRoYXQgaXQgaXMKKyAgICogZ29pbmcgYXdheS4KKyAgICoKKyAgICogJVRCRCUgVGhpcyBtYXkgbmVlZCBzaWduaWZpY2FudGx5IG1vcmUgd29yay4gCisgICAqCisgICAqICVUQkQlIFNob3VsZCB0aGlzIGp1c3QgYmUgY29fZXhpdF90bygsLENvcm91dGluZU1hbmFnZXIuUEFOSUMpPworICAgKgorICAgKiBAcGFyYW0gdGhpc0Nvcm91dGluZSBJbnRlZ2VyIGlkZW50aWZpZXIgZm9yIHRoZSBjb3JvdXRpbmUgcmVxdWVzdGluZyBleGl0LgorICAgKiAqLworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29fZXhpdChpbnQgdGhpc0Nvcm91dGluZSkKKyAgeworICAgIG1fYWN0aXZlSURzLmNsZWFyKHRoaXNDb3JvdXRpbmUpOworICAgIG1fbmV4dENvcm91dGluZT1OT0JPRFk7IC8vICVSRVZJRVclCisgICAgbm90aWZ5KCk7CisgIH0KKworICAvKiogTWFrZSB0aGUgSUQgYXZhaWxhYmxlIGZvciByZXVzZSBhbmQgdGVybWluYXRlIHRoaXMgY29yb3V0aW5lLAorICAgKiB0cmFuc2ZlcnJpbmcgY29udHJvbCB0byB0aGUgc3BlY2lmaWVkIGNvcm91dGluZS4KKyAgICoKKyAgICogQHBhcmFtIGFyZ19vYmplY3QgQSB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gdGhlIG90aGVyIGNvcm91dGluZS4KKyAgICogQHBhcmFtIHRoaXNDb3JvdXRpbmUgSW50ZWdlciBpZGVudGlmaWVyIGZvciB0aGUgY29yb3V0aW5lIGxlYXZpbmcgdGhlIHNldC4KKyAgICogQHBhcmFtIHRvQ29yb3V0aW5lLiBJbnRlZ2VyIGlkZW50aWZpZXIgZm9yIHRoZSBjb3JvdXRpbmUgd2Ugd2lzaCB0bworICAgKiBpbnZva2UuIAorICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb24gaWYgdG9Db3JvdXRpbmUgaXNuJ3QgYQorICAgKiByZWdpc3RlcmVkIG1lbWJlciBvZiB0aGlzIGdyb3VwLiAlUkVWSUVXJSB3aGV0aGVyIHRoaXMgaXMgdGhlIGJlc3QgY2hvaWNlLgorICAgKiAqLworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29fZXhpdF90byhPYmplY3QgYXJnX29iamVjdCxpbnQgdGhpc0Nvcm91dGluZSxpbnQgdG9Db3JvdXRpbmUpIHRocm93cyBqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uCisgIHsKKyAgICBpZighbV9hY3RpdmVJRHMuZ2V0KHRvQ29yb3V0aW5lKSkKKyAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCJDb3JvdXRpbmUgbm90IGF2YWlsYWJsZSwgaWQ9Iit0b0Nvcm91dGluZSk7CisgICAgCisgICAgLy8gV2UgZXhwZWN0IHRoZXNlIHZhbHVlcyB0byBiZSBvdmVyd3JpdHRlbiBkdXJpbmcgdGhlIG5vdGlmeSgpL3dhaXQoKQorICAgIC8vIHBlcmlvZHMsIGFzIG90aGVyIGNvcm91dGluZXMgaW4gdGhpcyBzZXQgZ2V0IHRoZWlyIG9wcG9ydHVuaXR5IHRvIHJ1bi4KKyAgICBtX3lpZWxkPWFyZ19vYmplY3Q7CisgICAgbV9uZXh0Q29yb3V0aW5lPXRvQ29yb3V0aW5lOworCisgICAgbV9hY3RpdmVJRHMuY2xlYXIodGhpc0Nvcm91dGluZSk7CisKKyAgICBub3RpZnkoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9Db3JvdXRpbmVQYXJzZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vQ29yb3V0aW5lUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmNWZhZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vQ29yb3V0aW5lUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCisgKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlhlcmNlcyIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIEludGVybmF0aW9uYWwKKyAqIEJ1c2luZXNzIE1hY2hpbmVzLCBJbmMuLCBodHRwOi8vd3d3LmFwYWNoZS5vcmcuICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5kdG07CisKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uQ29yb3V0aW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CisKKy8qKiA8cD5Db3JvdXRpbmVQYXJzZXIgaXMgYW4gQVBJIGZvciBwYXJzZXIgdGhyZWFkcyB0aGF0IG9wZXJhdGUgYXMKKyAqIGNvcm91dGluZXMuIFNlZSBDb3JvdXRpbmVTQVhQYXJzZXIgYW5kIENvcm91dGluZVNBWFBhcnNlcl9YZXJjZXMKKyAqIGZvciBleGFtcGxlcy48L3A+CisgKgorICogPHA+Jmx0O2dydW1ibGUmZ3Q7IEknZCBsaWtlIHRoZSBpbnRlcmZhY2UgdG8gcmVxdWlyZSBhIHNwZWNpZmljIGZvcm0KKyAqIGZvciBlaXRoZXIgdGhlIGJhc2UgY29uc3RydWN0b3Igb3IgYSBzdGF0aWMgZmFjdG9yeSBtZXRob2QuIEphdmEKKyAqIGRvZXNuJ3QgYWxsb3cgdXMgdG8gc3BlY2lmeSBlaXRoZXIsIHNvIEknbGwganVzdCBkb2N1bWVudCB0aGVtCisgKiBoZXJlOgorICoKKyAqIDx1bD4KKyAqIDxsaT5wdWJsaWMgQ29yb3V0aW5lUGFyc2VyKENvcm91dGluZU1hbmFnZXIgY28sIGludCBhcHBDb3JvdXRpbmUpOzwvbGk+CisgKiA8bGk+cHVibGljIENvcm91dGluZVBhcnNlciBjcmVhdGVDb3JvdXRpbmVQYXJzZXIoQ29yb3V0aW5lTWFuYWdlciBjbywgaW50IGFwcENvcm91dGluZSk7PC9saT4KKyAqIDwvdWw+CisgKgorICogJmx0Oy9ncnVtYmxlJmd0OzwvcD4KKyAqCisgKiA8cD5TdGF0dXM6IEluIHByb2dyZXNzPC9wPgorICogKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29yb3V0aW5lUGFyc2VyIHsKKworICAgIC8qKiBAcmV0dXJuIHRoZSBjb3JvdXRpbmUgSUQgbnVtYmVyIGZvciB0aGlzIENvcm91dGluZVBhcnNlciBvYmplY3QuCisgICAgICogTm90ZSB0aGF0IHRoaXMgaXNuJ3QgdXNlZnVsIHVubGVzcyB5b3Uga25vdyB3aGljaCBDb3JvdXRpbmVNYW5hZ2VyCisgICAgICogeW91J3JlIHRhbGtpbmcgdG8uIEFsc28gbm90ZSB0aGF0IHRoZSBkby4uLigpIG1ldGhvZHMgZW5jYXBzdWxhdGUKKyAgICAgKiB0aGUgY29tbW9uIHRyYW5zYWN0aW9ucyB3aXRoIHRoZSBDb3JvdXRpbmVQYXJzZXIsIHNvIHlvdSBzaG91bGRuJ3QKKyAgICAgKiBuZWVkIHRoaXMgaW4gbW9zdCBjYXNlcy4KKyAgICAgKiAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFyc2VyQ29yb3V0aW5lSUQoKTsKKworICAgIC8qKiBAcmV0dXJuIHRoZSBDb3JvdXRpbmVNYW5hZ2VyIGZvciB0aGlzIENvcm91dGluZVBhcnNlciBvYmplY3QuCisgICAgICogSWYgeW91J3JlIHVzaW5nIHRoZSBkby4uLigpIG1ldGhvZHMsIGFwcGxpY2F0aW9ucyBzaG91bGQgb25seQorICAgICAqIG5lZWQgdG8gdGFsayB0byB0aGUgQ29yb3V0aW5lTWFuYWdlciBvbmNlLCB0byBvYnRhaW4gdGhlCisgICAgICogYXBwbGljYXRpb24ncyBDb3JvdXRpbmUgSUQuCisgICAgICogKi8KKyAgICBwdWJsaWMgQ29yb3V0aW5lTWFuYWdlciBnZXRDb3JvdXRpbmVNYW5hZ2VyKCk7CisKKyAgLyoqIFJlZ2lzdGVyIGEgU0FYLXN0eWxlIGNvbnRlbnQgaGFuZGxlciBmb3IgdXMgdG8gb3V0cHV0IHRvICovCisgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRIYW5kbGVyKENvbnRlbnRIYW5kbGVyIGhhbmRsZXIpOworCisgIC8qKiAgUmVnaXN0ZXIgYSBTQVgtc3R5bGUgbGV4aWNhbCBoYW5kbGVyIGZvciB1cyB0byBvdXRwdXQgdG8KKyAgICogIE5vdCBhbGwgcGFyc2VycyBzdXBwb3J0IHRoaXMuLi4KKyAgICoKKyAgICogJVJFVklFVyUgTm90IGNhbGxlZCBzZXRMZXhpY2FsSGFuZGxlciBiZWNhdXNlIFhhbGFuIHVzZXMgdGhhdCBuYW1lCisgICAqIGludGVybmFsbHksIHdoaWNoIGNhdXNlcyBzdWJjbGFzc2luZyBudWlzYW5jZXMuIAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TGV4SGFuZGxlcihvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIgaGFuZGxlcik7CisKKyAgLyogVGhlIHJ1bigpIG1ldGhvZCBpcyByZXF1aXJlZCBpbiBDb3JvdXRpbmVQYXJzZXJzIHRoYXQgcnVuIGFzCisgICAqIHRocmVhZHMgKG9mIGNvdXJzZSkuLi4gYnV0IGl0IGlzbid0IHBhcnQgb2Ygb3VyIEFQSSwgYW5kCisgICAqIHNob3VsZG4ndCBiZSBkZWNsYXJlZCBoZXJlLgorICAgKiAqLworCisgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvKiogZG9QYXJzZSgpIGlzIGEgc2ltcGxlIEFQSSB3aGljaCB0ZWxscyB0aGUgY29yb3V0aW5lIHBhcnNlcgorICAgKiB0byBiZWdpbiByZWFkaW5nIGZyb20gYSBmaWxlLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZnJvbSBvbmUKKyAgICogb2Ygb3VyIHBhcnRuZXIgY29yb3V0aW5lcywgYW5kIHNlcnZlcyBib3RoIHRvIGVuY2Fwc3VsYXRlIHRoZQorICAgKiBjb21tdW5pY2F0aW9uIHByb3RvY29sIGFuZCB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseSB1c2UgdGhlCisgICAqIENvcm91dGluZVBhcnNlcidzIGNvcm91dGluZSBJRCBudW1iZXIuCisgICAqCisgICAqICVSRVZJRVclIENhbi9zaG91bGQgdGhpcyB1bmlmeSB3aXRoIGRvTW9yZT8gKGlmIFVSSSBoYXNuJ3QgY2hhbmdlZCwKKyAgICogcGFyc2UgbW9yZSBmcm9tIHNhbWUgZmlsZSwgZWxzZSBlbmQgYW5kIHJlc3RhcnQgcGFyc2luZy4uLj8KKyAgICoKKyAgICogQHBhcmFtIHNvdXJjZSBUaGUgSW5wdXRTb3VyY2UgdG8gcGFyc2UgZnJvbS4KKyAgICogQHBhcmFtIGFwcENvcm91dGluZSBUaGUgY29yb3V0aW5lIElEIG51bWJlciBvZiB0aGUgY29yb3V0aW5lIGludm9raW5nCisgICAqIHRoaXMgbWV0aG9kLCBzbyBpdCBjYW4gYmUgcmVzdW1lZCBhZnRlciB0aGUgcGFyc2VyIGhhcyByZXNwb25kZWQgdG8gdGhlCisgICAqIHJlcXVlc3QuCisgICAqIEByZXR1cm4gQm9vbGVhbi5UUlVFIGlmIHRoZSBDb3JvdXRpbmVQYXJzZXIgYmVsaWV2ZXMgbW9yZSBkYXRhIG1heSBiZSBhdmFpbGFibGUKKyAgICogZm9yIGZ1cnRoZXIgcGFyc2luZy4gQm9vbGVhbi5GQUxTRSBpZiBwYXJzaW5nIHJhbiB0byBjb21wbGV0aW9uLgorICAgKiBFeGNlcHRpb24gaWYgdGhlIHBhcnNlciBvYmplY3RlZCBmb3Igc29tZSByZWFzb24uCisgICAqICovCisgIHB1YmxpYyBPYmplY3QgZG9QYXJzZShJbnB1dFNvdXJjZSBzb3VyY2UsIGludCBhcHBDb3JvdXRpbmUpOworCisgIC8qKiBkb01vcmUoKSBpcyBhIHNpbXBsZSBBUEkgd2hpY2ggdGVsbHMgdGhlIGNvcm91dGluZSBwYXJzZXIKKyAgICogdGhhdCB3ZSBuZWVkIG1vcmUgbm9kZXMuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIG9uZQorICAgKiBvZiBvdXIgcGFydG5lciBjb3JvdXRpbmVzLCBhbmQgc2VydmVzIGJvdGggdG8gZW5jYXBzdWxhdGUgdGhlCisgICAqIGNvbW11bmljYXRpb24gcHJvdG9jb2wgYW5kIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5IHVzZSB0aGUKKyAgICogQ29yb3V0aW5lUGFyc2VyJ3MgY29yb3V0aW5lIElEIG51bWJlci4KKyAgICoKKyAgICogQHBhcmFtIHBhcnNlbW9yZSBJZiB0cnVlLCB0ZWxscyB0aGUgaW5jcmVtZW50YWwgcGFyc2VyIHRvIGdlbmVyYXRlCisgICAqIGFub3RoZXIgY2h1bmsgb2Ygb3V0cHV0LiBJZiBmYWxzZSwgdGVsbHMgdGhlIHBhcnNlciB0aGF0IHdlJ3JlCisgICAqIHNhdGlzZmllZCBhbmQgaXQgY2FuIHRlcm1pbmF0ZSBwYXJzaW5nIG9mIHRoaXMgZG9jdW1lbnQuCisgICAqIEBwYXJhbSBhcHBDb3JvdXRpbmUgVGhlIGNvcm91dGluZSBJRCBudW1iZXIgb2YgdGhlIGNvcm91dGluZSBpbnZva2luZworICAgKiB0aGlzIG1ldGhvZCwgc28gaXQgY2FuIGJlIHJlc3VtZWQgYWZ0ZXIgdGhlIHBhcnNlciBoYXMgcmVzcG9uZGVkIHRvIHRoZQorICAgKiByZXF1ZXN0LgorICAgKiBAcmV0dXJuIEJvb2xlYW4uVFJVRSBpZiB0aGUgQ29yb3V0aW5lUGFyc2VyIGJlbGlldmVzIG1vcmUgZGF0YSBtYXkgYmUgYXZhaWxhYmxlCisgICAqIGZvciBmdXJ0aGVyIHBhcnNpbmcuIEJvb2xlYW4uRkFMU0UgaWYgcGFyc2luZyByYW4gdG8gY29tcGxldGlvbi4KKyAgICogRXhjZXB0aW9uIGlmIHRoZSBwYXJzZXIgb2JqZWN0ZWQgZm9yIHNvbWUgcmVhc29uLgorICAgKiAqLworICBwdWJsaWMgT2JqZWN0IGRvTW9yZSAoYm9vbGVhbiBwYXJzZW1vcmUsIGludCBhcHBDb3JvdXRpbmUpOworCisgIC8qKiBkb1Rlcm1pbmF0ZSgpIGlzIGEgc2ltcGxlIEFQSSB3aGljaCB0ZWxscyB0aGUgY29yb3V0aW5lCisgICAqIHBhcnNlciB0byB0ZXJtaW5hdGUgaXRzZWxmLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZnJvbQorICAgKiBvbmUgb2Ygb3VyIHBhcnRuZXIgY29yb3V0aW5lcywgYW5kIHNlcnZlcyBib3RoIHRvIGVuY2Fwc3VsYXRlIHRoZQorICAgKiBjb21tdW5pY2F0aW9uIHByb3RvY29sIGFuZCB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseSB1c2UgdGhlCisgICAqIENvcm91dGluZVBhcnNlcidzIGNvcm91dGluZSBJRCBudW1iZXIuCisgICAqCisgICAqIFJldHVybnMgb25seSBhZnRlciB0aGUgQ29yb3V0aW5lUGFyc2VyIGhhcyBhY2tub3dsZWRnZWQgdGhlIHJlcXVlc3QuCisgICAqCisgICAqIEBwYXJhbSBhcHBDb3JvdXRpbmUgVGhlIGNvcm91dGluZSBJRCBudW1iZXIgb2YgdGhlIGNvcm91dGluZSBpbnZva2luZworICAgKiB0aGlzIG1ldGhvZCwgc28gaXQgY2FuIGJlIHJlc3VtZWQgYWZ0ZXIgdGhlIHBhcnNlciBoYXMgcmVzcG9uZGVkIHRvIHRoZQorICAgKiByZXF1ZXN0LgorICAgKiAqLworICBwdWJsaWMgdm9pZCBkb1Rlcm1pbmF0ZShpbnQgYXBwQ29yb3V0aW5lKTsKKworfSAvLyBjbGFzcyBDb3JvdXRpbmVQYXJzZXIKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vQ29yb3V0aW5lU0FYRmlsdGVyVGVzdC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9Db3JvdXRpbmVTQVhGaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhZDRhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vQ29yb3V0aW5lU0FYRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKKworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5Db3JvdXRpbmVNYW5hZ2VyOworCisKKy8qKiBQcmltaXRpdmUgdW5pdCB0ZXN0IGZvciBDb3JvdXRpbmVTQVhQYXJzZXIgaW4gZmlsdGVyaW5nIG1vZGU6CisgKiBBdHRlbXB0IGNvcm91dGluZSBwYXJzaW5nIG9mIGRvY3VtZW50cyBpbmRpY2F0ZWQgYnkgYXJndW1lbnRzIChhcworICogVVJJcyksIHJlcG9ydCBwcm9ncmVzcy4gSWYgYSBVUkkgaXMgZm9sbG93ZWQgYnkgIiEiIGFzIHRoZSBuZXh0CisgKiBhcmd1bWVudCwgd2UgY2FuY2VsIHRoZSBwYXJzZSBlYXJseS4KKyAqCisgKiBUaGlzIHZlcnNpb24gdGVzdHMgdGhlIGZpbHRlcmluZyBtb2RlLCB3aGVyZSB0aGUgQ29yb3V0aW5lUGFyc2VyCisgKiBpcyBtYW5hZ2luZyBhIFNBWCBzdHJlYW0gZ2VuZXJhdGVkIGJ5IG90aGVyIGNvZGUuIE5vcm1hbGx5IHRoaXMKKyAqIHdvdWxkIGJlIHVzZWQgd2hlbiB5b3UndmUgbGF1bmNoZWQgdGhlIGNvbnN1bWVyIGluIGEgc2Vjb25kYXJ5CisgKiB0aHJlYWQgYW5kIGFyZSBydW5uaW5nIHRoZSBTQVggZXZlbnQgZ2VuZXJhdGlvbiBpbiB0aGUgcHJpbWFyeQorICogdGhyZWFkLiBPZiBjb3Vyc2UgaXQgY291bGQgYmUgdXNlZCB0aGUgb3RoZXIgd2F5IHJvdW5kIGFzIHdlbGwuCisgKgorICogTm90ZSB0aGF0IHVubGlrZSB0aGUgZnVsbHktZW5jYXBzdWxhdGVkIHZlcnNpb24gKHNlZSB0aGUgaW5saW5lCisgKiB0ZXN0IGluIENvcm91dGluZVNBWFBhcnNlciksIHRoaXMgdmVyc2lvbiBkb2VzIF9ub3RfIGhhdmUgYQorICogZGlhbG9nIGZvciBzdGFydGluZyB0aGUgcGFyc2UsIG9yIGZvciByZXN0YXJ0aW5nIGl0IHdpdGggYSBuZXcKKyAqIGZpbGUuCisgKiAqLworY2xhc3MgQ29yb3V0aW5lU0FYRmlsdGVyVGVzdCBpbXBsZW1lbnRzIFJ1bm5hYmxlCit7CisgIC8vIFN0YXRpY3MgYXJlIGEgc2xvcHB5IHdheSBvZiBwYXNzaW5nIGRhdGEgdG8gdGhlIHRlc3QgdGhyZWFkLAorICAvLyBidXQgZm9yIHRoaXMgcXVpY2staGFjayBJIGRvbid0IG11Y2ggY2FyZS4KKyAgc3RhdGljIGJvb2xlYW4gVEVTVF9FQVJMWV9TVE9QPWZhbHNlOworICBzdGF0aWMgaW50IGFwcENvcm91dGluZUlEPS0xOworICBzdGF0aWMgQ29yb3V0aW5lU0FYUGFyc2VyIGZpbHRlcjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKQorICB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyBpbiBGaWx0ZXJpbmcgbW9kZS4uLiIpOworCisgICAgb3JnLnhtbC5zYXguWE1MUmVhZGVyIHRoZVNBWFBhcnNlcj0KKyAgICAgIG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpOworICAgIAorICAgIENvcm91dGluZU1hbmFnZXIgY28gPSBuZXcgQ29yb3V0aW5lTWFuYWdlcigpOworCisgICAgYXBwQ29yb3V0aW5lSUQgPSBjby5jb19qb2luQ29yb3V0aW5lU2V0KGFwcENvcm91dGluZUlEKTsKKyAgICBpZiAoYXBwQ29yb3V0aW5lSUQgPT0gLTEpCisgICAgICB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRVJST1I6IENvdWxkbid0IGFsbG9jYXRlIGNvcm91dGluZSBudW1iZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgYSBnbG9iYWwgLS0gc2xvcHB5IGNvbm5lY3Rpb24gdG8gdGhlIHRocmVhZC4KKyAgICBmaWx0ZXI9bmV3IENvcm91dGluZVNBWFBhcnNlcihjbywgYXBwQ29yb3V0aW5lSUQpOworCisgICAgLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24uLi4gU2V0IGhhbmRsZXJzCisgICAgZmlsdGVyLnNldFhNTFJlYWRlcih0aGVTQVhQYXJzZXIpOworICAgIAorICAgIC8vIFVzZSBhIHNlcmlhbGl6ZXIgYXMgb3VyIHNhbXBsZSBvdXRwdXQKKyAgICBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuWE1MU2VyaWFsaXplciB0cmFjZTsKKyAgICB0cmFjZT1uZXcgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLlhNTFNlcmlhbGl6ZXIoU3lzdGVtLm91dCxudWxsKTsKKyAgICBmaWx0ZXIuc2V0Q29udGVudEhhbmRsZXIodHJhY2UpOworICAgIGZpbHRlci5zZXRMZXhIYW5kbGVyKHRyYWNlKTsKKworICAgIC8vIExhdW5jaCB0aGUgbGlzdGVuZXIuCisgICAgVGhyZWFkIGxpc3RlbmVyPW5ldyBUaHJlYWQobmV3IENvcm91dGluZVNBWEZpbHRlclRlc3QoKSk7CisgICAgbGlzdGVuZXIuc2V0RGFlbW9uKGZhbHNlKTsKKyAgICBsaXN0ZW5lci5zdGFydCgpOworICAgIAorICAgIC8vIENoZWNrIHN0b3AtZWFybHkgZmxhZworICAgIGlmKGFyZ3MubGVuZ3RoPjEgJiYgIiEiLmVxdWFscyhhcmdzWzFdKSkKKyAgICAgIFRFU1RfRUFSTFlfU1RPUD10cnVlOworCisgICAgLy8gUnVuIHRoZSBwYXJzZXIKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBQYXJzZXIgc3RhcnQgKioqIik7CisgICAgdHJ5CisgICAgICB7CisJdGhlU0FYUGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShhcmdzWzBdKSk7CisgICAgICB9CisgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKQorICAgICAgeworCWUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB9CisgICAgY2F0Y2gob3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIGUpCisgICAgICB7CisJZS5wcmludFN0YWNrVHJhY2UoKTsKKworCS8vICVSRVZJRVclIFdlJ2xsIHNob3VsZCBwcm9iYWJseSBleHBvc2UgdGhlc2Ugc3BlY2lhbCB0eXBlcywKKwkvLyBpZiB3ZSBtaWdodCBiZSB0ZXN0aW5nIHRoZW0gb3V0c2lkZSB0aGUgZmlsdGVyaW5nIGNvZGUuLi4KKworCUV4Y2VwdGlvbiBlbWJlZGRlZD1lLmdldEV4Y2VwdGlvbigpOworCWlmKGVtYmVkZGVkIT1udWxsICYmIGVtYmVkZGVkLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygib3JnLmFwYWNoZS54bWwuZHRtLkNvcm91dGluZVNBWFBhcnNlciRVc2VyUmVxdWVzdGVkU3RvcEV4Y2VwdGlvbiIpKQorCSAgU3lzdGVtLm91dC5wcmludGxuKCIuLi4gTk9STUFMIHJlc3BvbnNlIHRvIGRvVGVybWluYXRlKCkuIik7CisgICAgICB9CisgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogUGFyc2VyIGVuZCAqKioiKTsKKyAgICBmaWx0ZXIuZG9UZXJtaW5hdGUoYXBwQ29yb3V0aW5lSUQpOworICB9CisgIAorICAvLyBJc3N1ZSBjb3JvdXRpbmUgdHJhbnNhY3Rpb25zIHRvIHNpbXVsYXRlIGRpYWxvZyB3aXRoIHRoZSBwYXJzZXIKKyAgLy8gZm9yIGEgc2luZ2xlIGZpbGUuICBOb3RlIHRoYXQgdGhlIHNlcXVlbmNlIG9mIGNhbGxzIGhlcmUgaXMKKyAgLy8gaWRlbnRpY2FsIHRvIHRoYXQgd2hlbiB0YWxraW5nIHRvIHRoZSBmdWxseSBlbmNhcHN1bGF0ZWQKKyAgLy8gcGFyc2VyLi4uIHRob3VnaCBkb1BhcnNlKCkgd2lsbCBiZSBhIG5vLW9wIHNpbmNlIHRoZSBwYXJzZQorICAvLyBpcyBsYXVuY2hlZCBzZXBhcmF0ZWx5LgorICBwdWJsaWMgdm9pZCBydW4oKSB7CisgIHsKKyAgICAvLyAlVEJEJSBQUk9CTEVNOiBQYXJzZXIgZXJyb3IgaGFuZ3MgdGhpcyBwcm9jZXNzLi4uCisKKyAgICBPYmplY3QgcmVzdWx0OworICAgIGJvb2xlYW4gbW9yZT10cnVlOworCisgICAgZm9yKHJlc3VsdCA9IGZpbHRlci5kb1BhcnNlKG51bGwsIGFwcENvcm91dGluZUlEKTsKKwkocmVzdWx0IGluc3RhbmNlb2YgQm9vbGVhbiAmJiAoKEJvb2xlYW4pcmVzdWx0KT09Qm9vbGVhbi5UUlVFKTsKKwlyZXN1bHQgPSBmaWx0ZXIuZG9Nb3JlKG1vcmUsIGFwcENvcm91dGluZUlEKSkKKyAgICAgIHsKKwkvLyBTcGVjaWFsIHRlc3Q6IFRlcm1pbmF0ZSBwYXJzaW5nIGVhcmx5LgorCWlmKFRFU1RfRUFSTFlfU1RPUCkKKwkgIHsKKwkgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNvbWUgcGFyc2luZyBzdWNjZXNzZnVsLCB0cnlpbmcgdG8gc3RvcC5cbiIpOworCSAgICBtb3JlPWZhbHNlOworCSAgfQorCWVsc2UKKwkgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5Tb21lIHBhcnNpbmcgc3VjY2Vzc2Z1bCwgdHJ5aW5nIG1vcmUuXG4iKTsKKyAgICAgIH0KKyAgICAKKyAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgQm9vbGVhbiAmJiAoKEJvb2xlYW4pcmVzdWx0KT09Qm9vbGVhbi5GQUxTRSkKKyAgICAgIHsKKwlTeXN0ZW0ub3V0LnByaW50bG4oIlxuZmlsdGVyIGVuZGVkIChFT0Ygb3Igb24gcmVxdWVzdCkuXG4iKTsKKyAgICAgIH0KKyAgICBlbHNlIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblVORVhQRUNURUQ6IGZpbHRlciBzYXlzIHNodXQgZG93biBwcmVtYXR1cmVseS5cbiIpOworICAgIH0KKyAgICBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5maWx0ZXIgdGhyZXcgZXhjZXB0aW9uOiIpOworICAgICAgKChFeGNlcHRpb24pcmVzdWx0KS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgCisgIH0KKyAgCisgIGZpbHRlci5kb1Rlcm1pbmF0ZShhcHBDb3JvdXRpbmVJRCk7CisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0Nvcm91dGluZVNBWFBhcnNlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9Db3JvdXRpbmVTQVhQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDZhN2UzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9Db3JvdXRpbmVTQVhQYXJzZXIuamF2YQpAQCAtMCwwICsxLDEwNjQgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCisgKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlhlcmNlcyIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIEludGVybmF0aW9uYWwKKyAqIEJ1c2luZXNzIE1hY2hpbmVzLCBJbmMuLCBodHRwOi8vd3d3LmFwYWNoZS5vcmcuICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5kdG07CisKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkNvcm91dGluZU1hbmFnZXI7CisKKy8qKiA8cD5Db3JvdXRpbmVTQVhQYXJzZXIgcnVucyBhIFNBWDIgcGFyc2VyIGluIGEgY29yb3V0aW5lIHRvIGFjaGlldmUKKyAqIGluY3JlbWVudGFsIHBhcnNpbmcuIE91dHB1dCBmcm9tIHRoZSBwYXJzZXIgd2lsbCBzdGlsbCBiZSBpc3N1ZWQKKyAqIHZpYSBjYWxsYmFja3MsIHdoaWNoIHdpbGwgbmVlZCB0byBiZSByZWNpZXZlZCBhbmQgYWN0ZWQgdXBvbiBieSBhbgorICogYXBwb3ByaWF0ZSBoYW5kbGVyLiBCdXQgdGhvc2UgY2FsbGJhY2tzIHdpbGwgcGFzcyB0aHJvdWdoIGEKKyAqIGNvdW50aW5nIHN0YWdlIHdoaWNoIHBlcmlvZGljYWxseSB5aWVsZHMgY29udHJvbCBiYWNrIHRvIHRoZSBvdGhlcgorICogY29yb3V0aW5lcyBpbiB0aGlzIHNldC48L3A+CisgKgorICogPHA+Rm9yIGEgYnJpZWYgdXNhZ2UgZXhhbXBsZSwgc2VlIHRoZSB1bml0LXRlc3QgbWFpbigpIG1ldGhvZC48L3A+CisgKgorICogPHA+U3RhdHVzOiBQYXNzZXMgc2ltcGxlIHVuaXQtdGVzdHMgaW4gbWFpbigpLgorICogRkFJTFMgQ29yb3V0aW5lU2F4RmlsdGVyVGVzdCB0ZXJtaW5hdGlvbiBpbiB0aGUgZG9Nb3JlKGZhbHNlKSBjYXNlCisgKiBORUVEUyBKQVZBRE9DITwvcD4KKyAqCisgKiAlVEJEJSBNQUpPUiBJU1NVRTogSW4gZmlsdGVyaW5nIG1vZGUsIHdoZXJlIHdlIGFyZW4ndCB0aGUgb25lcyB3aG8gaW52b2tlZAorICogdGhlIFhNTEhhbmRsZXIncyBwYXJzZSgpIG9wZXJhdGlvbiwgd2UgaGF2ZSBubyB3YXkgdG8gY2FwdHVyZQorICogZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIENvbnRlbnRIYW5kbGVyIC0tIGFuZCB0aHVzIG5vIHdheSB0byBjb21wbGV0ZQorICogdGhlIGRvTW9yZShmYWxzZSkgZGlhbG9nIGluIGl0cyB1c3VhbCBzZW5zZSwgb3IgdG8gYmUgaW5mb3JtZWQgaWYKKyAqIHRoZSBYTUxIYW5kbGVyIGNyYXNoZXMgZm9yIG90aGVyIHJlYXNvbnMuIFR3byBwb3NzaWJsZSBzb2x1dGlvbnM6CisgKglJbiB0aGlzIG1vZGUsIGNvbmR1Y3QgdGhlIHdob2xlIGRpYWxvZyB3aXRoaW4gZG9Nb3JlKCkuIFVnaC4KKyAqIE9yOgorICoJQ2hhbmdlIHRoZSBkaWFsb2dzIC0tIGN1dCBvdmVyIHRvIHB1cmUgZmlsdGVyaW5nIG1vZGUsIHdoZXJlCisgKgkJd2Ugb25seSBwcm9jZXNzIG9uZSBmaWxlIGFuZCBkb01vcmUoZmFsc2UpIGNhbiByZXNwb25kIHdpdGgKKyAqCQljb19leGl0X3RvKCkuCisgKgorICogKi8KK3B1YmxpYyBjbGFzcyBDb3JvdXRpbmVTQVhQYXJzZXIKK2ltcGxlbWVudHMgQ29yb3V0aW5lUGFyc2VyLCBSdW5uYWJsZSwgQ29udGVudEhhbmRsZXIsIExleGljYWxIYW5kbGVyLCBFcnJvckhhbmRsZXIKK3sKKworICBib29sZWFuIERFQlVHPWZhbHNlOyAvL0ludGVybmFsIHN0YXR1cyByZXBvcnQKKworICAvLworICAvLyBEYXRhCisgIC8vCisKKyAgcHJpdmF0ZSBDb3JvdXRpbmVNYW5hZ2VyIGZDb3JvdXRpbmVNYW5hZ2VyID0gbnVsbDsKKyAgcHJpdmF0ZSBpbnQgZkFwcENvcm91dGluZUlEID0gLTE7CisgIHByaXZhdGUgaW50IGZQYXJzZXJDb3JvdXRpbmVJRCA9IC0xOworICBwcml2YXRlIGJvb2xlYW4gZlBhcnNlSW5Qcm9ncmVzcz1mYWxzZTsKKyAgcHJpdmF0ZSBYTUxSZWFkZXIgZlhNTFJlYWRlcj1udWxsOworICBwcml2YXRlIGJvb2xlYW4gZlJ1bm5pbmdJblRocmVhZD1mYWxzZTsKKyAgcHJpdmF0ZSBDb250ZW50SGFuZGxlciBjbGllbnRDb250ZW50SGFuZGxlcj1udWxsOyAvLyAlUkVWSUVXJSBzdXBwb3J0IG11bHRpcGxlPworICBwcml2YXRlIExleGljYWxIYW5kbGVyIGNsaWVudExleGljYWxIYW5kbGVyPW51bGw7IC8vICVSRVZJRVclIHN1cHBvcnQgbXVsdGlwbGU/CisgIHByaXZhdGUgRXJyb3JIYW5kbGVyIGNsaWVudEVycm9ySGFuZGxlcj1udWxsOyAvLyAlUkVWSUVXJSBzdXBwb3J0IG11bHRpcGxlPworICBwcml2YXRlIGludCBldmVudGNvdW50ZXI7CisgIHByaXZhdGUgaW50IGZyZXF1ZW5jeT0xMDsKKworICAvLyBIb3JyZW5kb3VzIGtsdWdlIHRvIHJ1biBmaWx0ZXIgdG8gY29tcGxldGlvbi4gU2VlIGNvX3lpZWxkKCkncworICAvLyBpbnRlcm5hbCBjb21tZW50cyBmb3IgZGV0YWlscy4gIklzIHRoaXMgYW55IHdheSB0byBydW4gYSByYWlscm9hZD8iCisgIHByaXZhdGUgYm9vbGVhbiBmTmV2ZXJZaWVsZEFnYWluPWZhbHNlOworICAKKworICAvLworICAvLyBDb25zdHJ1Y3RvcnMKKyAgLy8KKworICAvKiogQ3JlYXRlIGEgQ29yb3V0aW5lU0FYUGFyc2VyIHdoaWNoIGlzIG5vdCB5ZXQgYm91bmQgdG8gYSBzcGVjaWZpYworICAgKiBTQVggZXZlbnQgc291cmNlLgorICAgKgorICAgKiBUSElTIFZFUlNJT04gRE9FUyBOT1QgTEFVTkNIIEEgVEhSRUFEISBJdCBpcyBwcmVzdW1lZCB0aGF0IHRoZQorICAgKiBhcHBsaWNhdGlvbiBjb3JvdXRpbmUgd2lsbCBiZSBzdGFydGVkIGluIGEgc2Vjb25kYXJ5IHRocmVhZCBhbmQKKyAgICogd2lsbCBiZSB3YWl0aW5nIGZvciBvdXIgZmlyc3QgeWllbGQoKSwgYW5kIHRoYXQgdGhlIHBhcnNlciB3aWxsCisgICAqIGJlIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuCisgICAqIAorICAgKiBTdGF0dXM6IEV4cGVyaW1lbnRhbAorICAgKiAKKyAgICogQHNlZSBzZXRYTUxSZWFkZXIKKyAgICogKi8KKyAgcHVibGljIENvcm91dGluZVNBWFBhcnNlcihDb3JvdXRpbmVNYW5hZ2VyIGNvLCBpbnQgYXBwQ29yb3V0aW5lSUQpCisgIHsKKyAgICBmWE1MUmVhZGVyPW51bGw7ICAgIC8vIE5vIHJlYWRlciB5ZXQKKworICAgIGV2ZW50Y291bnRlcj1mcmVxdWVuY3k7CisKKyAgICBmQ29yb3V0aW5lTWFuYWdlciA9IGNvOworICAgIGZBcHBDb3JvdXRpbmVJRCA9IGFwcENvcm91dGluZUlEOworICAgIGZQYXJzZXJDb3JvdXRpbmVJRCA9IGNvLmNvX2pvaW5Db3JvdXRpbmVTZXQoLTEpOworICAgIGlmIChmUGFyc2VyQ29yb3V0aW5lSUQgPT0gLTEpCisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY29fam9pbkNvcm91dGluZVNldCgpIGZhaWxlZCIpOworCisgICAgZlJ1bm5pbmdJblRocmVhZD1mYWxzZTsgLy8gVW5sZXNzIG92ZXJyaWRkZW4gYnkgdGhlIG90aGVyIGNvbnN0cnVjdG9yCisgIH0KKworICAvKiogV3JhcCBhIFNBWDIgWE1MUmVhZGVyIChwYXJzZXIgb3Igb3RoZXIgZXZlbnQgc291cmNlKQorICAgKiBpbiBhIENvcm91dGluZVNBWFBhcnNlci4gVGhpcyB2ZXJzaW9uIGxhdW5jaGVzIHRoZSBDb3JvdXRpbmVTQVhQYXJzZXIKKyAgICogaW4gYSB0aHJlYWQsIGFuZCBwcmVwYXJlcyBpdCB0byBpbnZva2UgdGhlIHBhcnNlciBmcm9tIHRoYXQgdGhyZWFkCisgICAqIHVwb24gcmVxdWVzdC4KKyAgICoKKyAgICogQHNlZSBkb1BhcnNlCisgICAqLworICBwdWJsaWMgQ29yb3V0aW5lU0FYUGFyc2VyKENvcm91dGluZU1hbmFnZXIgY28sIGludCBhcHBDb3JvdXRpbmVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxSZWFkZXIgcGFyc2VyKSB7CisgICAgdGhpcyhjbyxhcHBDb3JvdXRpbmVJRCk7CisgICAgc2V0WE1MUmVhZGVyKHBhcnNlcik7CisKKyAgICBmUnVubmluZ0luVGhyZWFkPXRydWU7CisgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHRoaXMpOworICAgIHQuc2V0RGFlbW9uKGZhbHNlKTsKKyAgICB0LnN0YXJ0KCk7CisgIH0KKworICAvLworICAvLyBQdWJsaWMgbWV0aG9kcworICAvLworCisgIC8qKiBCaW5kIHRvIHRoZSBYTUxSZWFkZXIuIFRoaXMgb3BlcmF0aW9uIGlzIGlnbm9yZWQgaWYgdGhlIHJlYWRlciBoYXMKKyAgICogcHJldmlvdXNseSBiZWVuIHNldC4KKyAgICoKKyAgICogSnVzdCBhIGNvbnZlbmllbmNlIHJvdXRpbmU7IG9idmlvdXNseSB5b3UgY2FuIGV4cGxpY2l0bHkgcmVnaXN0ZXIKKyAgICogdGhpcyBhcyBhIGxpc3RlbmVyIHdpdGggdGhlIHNhbWUgZWZmZWN0LgorICAgKgorICAgKiAlUkVWSUVXJSBTaG91bGQgaXQgdW5iaW5kIGZyb20gdGhlIHByZXZpb3VzIHJlYWRlciBpZiB0aGVyZSBpcyBvbmU/CisgICAqICVSRVZJRVclIERvIHdlIHJlYWxseSBuZWVkIHRvIHNldCBmWE1MUmVhZGVyPz8/CisgICAqCisgICAqICVUQkQlIFRoaXMgaXMgYSBxdWljay1oYWNrIHNvbHV0aW9uLiBJJ20gbm90IGNvbnZpbmNlZCB0aGF0IGl0J3MKKyAgICogYWRlcXVhdGUuIEluIHBhcnRpY3VsYXIsIHNpbmNlIGluIHRoaXMgbW9kZWwgcGFyc2VyLnBhcnNlKCkgaXMKKyAgICogaW52b2tlZCBmcm9tIG91dHNpZGUgcmF0aGVyIHRoYW4gZnJvbSBvdXIgcnVuKCkgbG9vcCwgSSdtIG5vdAorICAgKiBzdXJlIHRoZSBlbmQtb2YtZmlsZSByZXNwb25zZSBpcyBiZWluZyBkZWxpdmVyZWQgcHJvcGVybHkuCisgICAqIChUaGVyZSB3ZXJlIHF1ZXN0aW9ucyBvZiBkb3VibGUteWllbGRzIGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIGNvZGUuKQorICAgKiAqLworICBwdWJsaWMgdm9pZCBzZXRYTUxSZWFkZXIoWE1MUmVhZGVyIHBhcnNlcikKKyAgeworICAgIGlmKGZYTUxSZWFkZXIhPW51bGwpIHJldHVybjsKKyAgICAKKyAgICBmWE1MUmVhZGVyPXBhcnNlcjsKKyAgICBmWE1MUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOworICAgIGZYTUxSZWFkZXIuc2V0RXJyb3JIYW5kbGVyKHRoaXMpOyAvLyB0byByZXBvcnQgZmF0YWwgZXJyb3JzIGluIGZpbHRlcmluZyBtb2RlCisKKyAgICAvLyBOb3Qgc3VwcG9ydGVkIGJ5IGFsbCBTQVgyIHBhcnNlcnM6CisgICAgdHJ5IAorICAgICAgeworICAgICAgICBmWE1MUmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgICB9CisgICAgY2F0Y2goU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQorICAgICAgeworICAgICAgICAvLyBOb3RoaW5nIHdlIGNhbiBkbyBhYm91dCBpdAorICAgICAgfQorICAgIGNhdGNoKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKQorICAgICAgeworICAgICAgICAvLyBOb3RoaW5nIHdlIGNhbiBkbyBhYm91dCBpdAorICAgICAgfQorCisgICAgLy8gU2hvdWxkIHdlIGFsc28gYmluZCBhcyBvdGhlciB2YXJpZXRpZXMgb2YgaGFuZGxlcj8KKyAgICAvLyAoRFRESGFuZGxlciBhbmQgc28gb24pCisgIH0KKworICAvLyBSZWdpc3RlciBhIGNvbnRlbnQgaGFuZGxlciBmb3IgdXMgdG8gb3V0cHV0IHRvCisgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRIYW5kbGVyKENvbnRlbnRIYW5kbGVyIGhhbmRsZXIpCisgIHsKKyAgICBjbGllbnRDb250ZW50SGFuZGxlcj1oYW5kbGVyOworICB9CisgIC8vIFJlZ2lzdGVyIGEgbGV4aWNhbCBoYW5kbGVyIGZvciB1cyB0byBvdXRwdXQgdG8KKyAgLy8gTm90IGFsbCBwYXJzZXJzIHN1cHBvcnQgdGhpcy4uLgorICAvLyA/Pz8gU2hvdWxkIHdlIHJlZ2lzdGVyIGRpcmVjdGx5IG9uIHRoZSBwYXJzZXI/CisgIC8vIE5PVEUgTkFNRSAtLSBzdWJjbGFzc2luZyBpc3N1ZSBpbiB0aGUgWGVyY2VzIHZlcnNpb24KKyAgcHVibGljIHZvaWQgc2V0TGV4SGFuZGxlcihMZXhpY2FsSGFuZGxlciBoYW5kbGVyKQorICB7CisgICAgY2xpZW50TGV4aWNhbEhhbmRsZXI9aGFuZGxlcjsKKyAgfQorICAvLyBSZWdpc3RlciBhbiBlcnJvciBoYW5kbGVyIGZvciB1cyB0byBvdXRwdXQgdG8KKyAgLy8gTk9URSBOQU1FIC0tIHN1YmNsYXNzaW5nIGlzc3VlIGluIHRoZSBYZXJjZXMgdmVyc2lvbgorICBwdWJsaWMgdm9pZCBzZXRFcnJIYW5kbGVyKEVycm9ySGFuZGxlciBoYW5kbGVyKQorICB7CisgICAgY2xpZW50RXJyb3JIYW5kbGVyPWhhbmRsZXI7CisgIH0KKworICAvLyBTZXQgdGhlIG51bWJlciBvZiBldmVudHMgYmV0d2VlbiByZXN1bWVzIG9mIG91ciBjb3JvdXRpbmUKKyAgLy8gSW1tZWRpYXRlbHkgcmVzZXRzIG51bWJlciBvZiBldmVudHMgYmVmb3JlIF9uZXh0XyByZXN1bWUgYXMgd2VsbC4KKyAgcHVibGljIHZvaWQgc2V0UmV0dXJuRnJlcXVlbmN5KGludCBldmVudHMpCisgIHsKKyAgICBpZihldmVudHM8MSkgZXZlbnRzPTE7CisgICAgZnJlcXVlbmN5PWV2ZW50Y291bnRlcj1ldmVudHM7CisgIH0KKyAgCisgIC8vCisgIC8vIENvbnRlbnRIYW5kbGVyIG1ldGhvZHMKKyAgLy8gVGhlc2UgIHBhc3MgdGhlIGRhdGEgdG8gb3VyIGNsaWVudCBDb250ZW50SGFuZGxlci4uLgorICAvLyBidXQgdGhleSBhbHNvIGNvdW50IHRoZSBudW1iZXIgb2YgZXZlbnRzIHBhc3NpbmcgdGhyb3VnaCwKKyAgLy8gYW5kIHJlc3VtZSBvdXIgY29yb3V0aW5lIGVhY2ggdGltZSB0aGF0IGNvdW50ZXIgaGl0cyB6ZXJvIGFuZAorICAvLyBpcyByZXNldC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IGZvciBldmVyeXRoaW5nIGV4Y2VwdCBlbmREb2N1bWVudCwgd2UgZG8gdGhlIGNvdW50LWFuZC15aWVsZAorICAvLyBCRUZPUkUgcGFzc2luZyB0aGUgY2FsbCBhbG9uZy4gSSdtIGhvcGluZyB0aGF0IHRoaXMgd2lsbCBlbmNvdXJhZ2UgSklUCisgIC8vIGNvbXBpbGVycyB0byByZWFsaXplIHRoYXQgdGhlc2UgYXJlIHRhaWwtY2FsbHMsIHJlZHVjaW5nIHRoZSBleHBlbnNlIG9mCisgIC8vIHRoZSBhZGRpdGlvbmFsIGxheWVyIG9mIGRhdGEgZmxvdy4KKyAgLy8KKyAgLy8gJVJFVklFVyUgR2xlbm4gc3VnZ2VzdHMgdGhhdCBwYXVzaW5nIGFmdGVyIGVuZEVsZW1lbnQsIGVuZERvY3VtZW50LAorICAvLyBhbmQgY2hhcmFjdGVycyBtYXkgYmUgc3VmZmljaWVudC4gSSBhY3R1YWxseSBtYXkgbm90IHdhbnQgdG8KKyAgLy8gc3RvcCBhZnRlciBjaGFyYWN0ZXJzLCBzaW5jZSBpbiBvdXIgYXBwbGljYXRpb24gdGhlc2Ugd2luZCB1cCBiZWluZworICAvLyBjb25jYXRlbmF0ZWQgYmVmb3JlIHRoZXkncmUgcHJvY2Vzc2VkLi4uIGJ1dCB0aGF0IHJpc2tzIGh1Z2UgYmxvY2tzIG9mCisgIC8vIHRleHQgY2F1c2luZyBncmVhdGVyIHRoYW4gdXN1YWwgcmVhZGFoZWFkLiAoVW5saWtlbHk/IENvbnNpZGVyIHRoZQorICAvLyBwb3NzaWJpbGl0eSBvZiBhIGxhcmdlIGJhc2UtNjQgYmxvY2sgaW4gYSBTT0FQIHN0cmVhbS4pCisgIC8vCisgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgaWYoLS1ldmVudGNvdW50ZXI8PTApCisgICAgICB7CisgICAgICAgIGNvX3lpZWxkKHRydWUpOworICAgICAgICBldmVudGNvdW50ZXI9ZnJlcXVlbmN5OworICAgICAgfQorICAgIGlmKGNsaWVudENvbnRlbnRIYW5kbGVyIT1udWxsKQorICAgICAgY2xpZW50Q29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhjaCxzdGFydCxsZW5ndGgpOworICB9CisgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgLy8gRVhDRVBUSU9OOiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBydW4gdGhlIGV2ZW50IEJFRk9SRSB3ZSB5aWVsZC4KKyAgICBpZihjbGllbnRDb250ZW50SGFuZGxlciE9bnVsbCkKKyAgICAgIGNsaWVudENvbnRlbnRIYW5kbGVyLmVuZERvY3VtZW50KCk7CisKKyAgICBldmVudGNvdW50ZXI9MDsJCisgICAgY29feWllbGQoZmFsc2UpOworICB9CisgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkksIGphdmEubGFuZy5TdHJpbmcgbG9jYWxOYW1lLAorICAgICAgamF2YS5sYW5nLlN0cmluZyBxTmFtZSkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgaWYoLS1ldmVudGNvdW50ZXI8PTApCisgICAgICB7CisgICAgICAgIGNvX3lpZWxkKHRydWUpOworICAgICAgICBldmVudGNvdW50ZXI9ZnJlcXVlbmN5OworICAgICAgfQorICAgIGlmKGNsaWVudENvbnRlbnRIYW5kbGVyIT1udWxsKQorICAgICAgY2xpZW50Q29udGVudEhhbmRsZXIuZW5kRWxlbWVudChuYW1lc3BhY2VVUkksbG9jYWxOYW1lLHFOYW1lKTsKKyAgfQorICBwdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nKGphdmEubGFuZy5TdHJpbmcgcHJlZml4KSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICBpZigtLWV2ZW50Y291bnRlcjw9MCkKKyAgICAgIHsKKyAgICAgICAgY29feWllbGQodHJ1ZSk7CisgICAgICAgIGV2ZW50Y291bnRlcj1mcmVxdWVuY3k7CisgICAgICB9CisgICAgaWYoY2xpZW50Q29udGVudEhhbmRsZXIhPW51bGwpCisgICAgICBjbGllbnRDb250ZW50SGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKHByZWZpeCk7CisgIH0KKyAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZShjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgaWYoLS1ldmVudGNvdW50ZXI8PTApCisgICAgICB7CisgICAgICAgIGNvX3lpZWxkKHRydWUpOworICAgICAgICBldmVudGNvdW50ZXI9ZnJlcXVlbmN5OworICAgICAgfQorICAgIGlmKGNsaWVudENvbnRlbnRIYW5kbGVyIT1udWxsKQorICAgICAgY2xpZW50Q29udGVudEhhbmRsZXIuaWdub3JhYmxlV2hpdGVzcGFjZShjaCxzdGFydCxsZW5ndGgpOworICB9CisgIHB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihqYXZhLmxhbmcuU3RyaW5nIHRhcmdldCwgamF2YS5sYW5nLlN0cmluZyBkYXRhKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICBpZigtLWV2ZW50Y291bnRlcjw9MCkKKyAgICAgIHsKKyAgICAgICAgY29feWllbGQodHJ1ZSk7CisgICAgICAgIGV2ZW50Y291bnRlcj1mcmVxdWVuY3k7CisgICAgICB9CisgICAgaWYoY2xpZW50Q29udGVudEhhbmRsZXIhPW51bGwpCisgICAgICBjbGllbnRDb250ZW50SGFuZGxlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LGRhdGEpOworICB9CisgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIAorICB7CisgICAgaWYoLS1ldmVudGNvdW50ZXI8PTApCisgICAgICB7CisgICAgICAgIGNvX3lpZWxkKHRydWUpOworICAgICAgICBldmVudGNvdW50ZXI9ZnJlcXVlbmN5OworICAgICAgfQorICAgIGlmKGNsaWVudENvbnRlbnRIYW5kbGVyIT1udWxsKQorICAgICAgY2xpZW50Q29udGVudEhhbmRsZXIuc2V0RG9jdW1lbnRMb2NhdG9yKGxvY2F0b3IpOworICB9CisgIHB1YmxpYyB2b2lkIHNraXBwZWRFbnRpdHkoamF2YS5sYW5nLlN0cmluZyBuYW1lKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICBpZigtLWV2ZW50Y291bnRlcjw9MCkKKyAgICAgIHsKKyAgICAgICAgY29feWllbGQodHJ1ZSk7CisgICAgICAgIGV2ZW50Y291bnRlcj1mcmVxdWVuY3k7CisgICAgICB9CisgICAgaWYoY2xpZW50Q29udGVudEhhbmRsZXIhPW51bGwpCisgICAgICBjbGllbnRDb250ZW50SGFuZGxlci5za2lwcGVkRW50aXR5KG5hbWUpOworICB9CisgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICBpZigtLWV2ZW50Y291bnRlcjw9MCkKKyAgICAgIHsKKyAgICAgICAgY29feWllbGQodHJ1ZSk7CisgICAgICAgIGV2ZW50Y291bnRlcj1mcmVxdWVuY3k7CisgICAgICB9CisgICAgaWYoY2xpZW50Q29udGVudEhhbmRsZXIhPW51bGwpCisgICAgICBjbGllbnRDb250ZW50SGFuZGxlci5zdGFydERvY3VtZW50KCk7CisgIH0KKyAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJLCBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsTmFtZSwKKyAgICAgIGphdmEubGFuZy5TdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgaWYoLS1ldmVudGNvdW50ZXI8PTApCisgICAgICB7CisgICAgICAgIGNvX3lpZWxkKHRydWUpOworICAgICAgICBldmVudGNvdW50ZXI9ZnJlcXVlbmN5OworICAgICAgfQorICAgIGlmKGNsaWVudENvbnRlbnRIYW5kbGVyIT1udWxsKQorICAgICAgY2xpZW50Q29udGVudEhhbmRsZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cyk7CisgIH0KKyAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LCBqYXZhLmxhbmcuU3RyaW5nIHVyaSkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgaWYoLS1ldmVudGNvdW50ZXI8PTApCisgICAgICB7CisgICAgICAgIGNvX3lpZWxkKHRydWUpOworICAgICAgICBldmVudGNvdW50ZXI9ZnJlcXVlbmN5OworICAgICAgfQorICAgIGlmKGNsaWVudENvbnRlbnRIYW5kbGVyIT1udWxsKQorICAgICAgY2xpZW50Q29udGVudEhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKHByZWZpeCx1cmkpOworICB9CisKKyAgLy8KKyAgLy8gTGV4aWNhbEhhbmRsZXIgc3VwcG9ydC4gTm90IGFsbCBTQVgyIHBhcnNlcnMgc3VwcG9ydCB0aGVzZSBldmVudHMKKyAgLy8gYnV0IHdlIG1heSB3YW50IHRvIHBhc3MgdGhlbSB0aHJvdWdoIHdoZW4gdGhleSBleGlzdC4uLgorICAvLworICAvLyAlUkVWSUVXJSBUaGVzZSBkbyBOT1QgY3VycmVudGx5IGFmZmVjdCB0aGUgZXZlbnRjb3VudGVyOyBJJ20gYXNzZXJ0aW5nCisgIC8vIHRoYXQgdGhleSdyZSByYXJlIGVub3VnaCB0aGF0IGl0IG1ha2VzIGxpdHRsZSBvciBubyBzZW5zZSB0bworICAvLyBwYXVzZSBhZnRlciB0aGVtLiBBcyBzdWNoLCBpdCBtYXkgbWFrZSBtb3JlIHNlbnNlIGZvciBmb2xrcyB3aG8KKyAgLy8gYWN0dWFsbHkgd2FudCB0byB1c2UgdGhlbSB0byByZWdpc3RlciBkaXJlY3RseSB3aXRoIHRoZSBwYXJzZXIuCisgIC8vIEJ1dCBJIHdhbnQgJ2VtIGhlcmUgZm9yIG5vdywgdG8gcmVtaW5kIHVzIHRvIHJlY2hlY2sgdGhpcyBhc3NlcnRpb24hCisgIC8vCisgIHB1YmxpYyB2b2lkIGNvbW1lbnQoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIGlmKG51bGwhPWNsaWVudExleGljYWxIYW5kbGVyKQorICAgICAgY2xpZW50TGV4aWNhbEhhbmRsZXIuY29tbWVudChjaCxzdGFydCxsZW5ndGgpOworICB9CisgIHB1YmxpYyB2b2lkIGVuZENEQVRBKCkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgaWYobnVsbCE9Y2xpZW50TGV4aWNhbEhhbmRsZXIpCisgICAgICBjbGllbnRMZXhpY2FsSGFuZGxlci5lbmRDREFUQSgpOworICB9CisgIHB1YmxpYyB2b2lkIGVuZERURCgpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIGlmKG51bGwhPWNsaWVudExleGljYWxIYW5kbGVyKQorICAgICAgY2xpZW50TGV4aWNhbEhhbmRsZXIuZW5kRFREKCk7CisgIH0KKyAgcHVibGljIHZvaWQgZW5kRW50aXR5KGphdmEubGFuZy5TdHJpbmcgbmFtZSkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgaWYobnVsbCE9Y2xpZW50TGV4aWNhbEhhbmRsZXIpCisgICAgICBjbGllbnRMZXhpY2FsSGFuZGxlci5lbmRFbnRpdHkobmFtZSk7CisgIH0KKyAgcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIGlmKG51bGwhPWNsaWVudExleGljYWxIYW5kbGVyKQorICAgICAgY2xpZW50TGV4aWNhbEhhbmRsZXIuc3RhcnRDREFUQSgpOworICB9CisgIHB1YmxpYyB2b2lkIHN0YXJ0RFREKGphdmEubGFuZy5TdHJpbmcgbmFtZSwgamF2YS5sYW5nLlN0cmluZyBwdWJsaWNJZCwKKyAgICAgIGphdmEubGFuZy5TdHJpbmcgc3lzdGVtSWQpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIGlmKG51bGwhPWNsaWVudExleGljYWxIYW5kbGVyKQorICAgICAgY2xpZW50TGV4aWNhbEhhbmRsZXIuIHN0YXJ0RFREKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7CisgIH0KKyAgcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoamF2YS5sYW5nLlN0cmluZyBuYW1lKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICBpZihudWxsIT1jbGllbnRMZXhpY2FsSGFuZGxlcikKKyAgICAgIGNsaWVudExleGljYWxIYW5kbGVyLnN0YXJ0RW50aXR5KG5hbWUpOworICB9CisKKyAgLy8KKyAgLy8gRXJyb3JIYW5kbGVyIHN1cHBvcnQuCisgIC8vCisgIC8vIFBST0JMRU06IFhlcmNlcyBpcyBhcHBhcmVudGx5IF9ub3RfIGNhbGxpbmcgdGhlIEVycm9ySGFuZGxlciBmb3IKKyAgLy8gZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIENvbnRlbnRIYW5kbGVyLCB3aGljaCBwcmV2ZW50cyB1cyBmcm9tCisgIC8vIGhhbmRsaW5nIHRoaXMgcHJvcGVybHkgd2hlbiBydW5uaW5nIGluIGZpbHRlcmluZyBtb2RlIHdpdGggWGVyY2VzCisgIC8vIGFzIG91ciBldmVudCBzb3VyY2UuICBJdCdzIHVuY2xlYXIgd2hldGhlciB0aGlzIGlzIGEgWGVyY2VzIGJ1ZworICAvLyBvciBhIFNBWCBkZXNpZ24gZmxhdy4KKyAgLy8gCisgIC8vICVSRVZJRVclIEN1cnJlbnQgc29sdXRpb246IEluIGZpbHRlcmluZyBtb2RlLCBpdCBpcyBSRVFVSVJFRCB0aGF0CisgIC8vIGV2ZW50IHNvdXJjZSBtYWtlIHN1cmUgdGhpcyBtZXRob2QgaXMgaW52b2tlZCBpZiB0aGUgZXZlbnQgc3RyZWFtCisgIC8vIGFiZW5kcyBiZWZvcmUgZW5kRG9jdW1lbnQgaXMgZGVsaXZlcmVkLiBJZiB0aGF0IG1lYW5zIGV4cGxpY2l0bHkgY2FsbGluZworICAvLyB1cyBpbiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgYmVjYXVzZSBpdCB3b24ndCBiZSBkZWxpdmVyZWQgYXMgcGFydAorICAvLyBvZiB0aGUgbm9ybWFsIFNBWCBFcnJvckhhbmRsZXIgc3RyZWFtLCB0aGF0J3MgZmluZTsgTm90IE91ciBQcm9ibGVtLgorICAvLworICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworICAgIGlmKG51bGwhPWNsaWVudEVycm9ySGFuZGxlcikKKyAgICAgIGNsaWVudEVycm9ySGFuZGxlci5lcnJvcihleGNlcHRpb24pOworICB9CisgIAorICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisgICAgLy8gV2hlbiB3ZSdyZSBpbiBmaWx0ZXJpbmcgbW9kZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgLy8gd2UgdGVybWluYXRlIHRoZSBwYXJzaW5nIGNvcm91dGluZSB0cmFuc2FjdGlvbiAtLSBhbm5vdW5jZQorICAgIC8vIHRoZSBwcm9ibGVtIGFuZCBzaHV0IGRvd24gdGhlIGRpYWxvZy4KKworICAgIC8vIFBST0JMRU06IFhlcmNlcyBpcyBhcHBhcmVudGx5IF9ub3RfIGNhbGxpbmcgdGhlIEVycm9ySGFuZGxlciBmb3IKKyAgICAvLyBleGNlcHRpb25zIHRocm93biBieSB0aGUgQ29udGVudEhhbmRsZXIuLi4gc3BlY2lmaWNhbGx5LCBkb1Rlcm1pbmF0ZS4KKyAgICAvLyAlVEJEJSBORUVEIEEgU09MVVRJT04hCisgICAgCisgICAgaWYoIWZSdW5uaW5nSW5UaHJlYWQpCisgICAgICB7CisgICAgICAgIHRyeQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZDb3JvdXRpbmVNYW5hZ2VyLmNvX2V4aXRfdG8oZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUGFyc2VyQ29yb3V0aW5lSUQsZkFwcENvcm91dGluZUlEKTsKKyAgICAgICAgICAgIC8vICVUQkQlIERvIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGVybWluYXRlPworICAgICAgICAgIH0KKyAgICAgICAgY2F0Y2goTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gU2hvdWxkbid0IGhhcHBlbiB1bmxlc3Mgd2UndmUgbWlzY29kZWQgb3VyIGNvcm91dGluZSBsb2dpYworICAgICAgICAgICAgLy8gIlNodXQgZG93biB0aGUgZ2FyYmFnZSBzbWFzaGVycyBvbiB0aGUgZGV0ZW50aW9uIGxldmVsISIKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgICAgICAgZkNvcm91dGluZU1hbmFnZXIuY29fZXhpdChmUGFyc2VyQ29yb3V0aW5lSUQpOworCisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHRocm93IHNodXRkb3duRXhjZXB0aW9uOyB3ZSdyZSBhbHJlYWR5CisgICAgICAgICAgICAvLyBpbiB0aGUgcHJvY2VzcyBvZiBtdXJkZXJpbmcgdGhlIHBhcnNlci4KKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICBpZihudWxsIT1jbGllbnRFcnJvckhhbmRsZXIpCisgICAgICBjbGllbnRFcnJvckhhbmRsZXIuZXJyb3IoZXhjZXB0aW9uKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworICAgIGlmKG51bGwhPWNsaWVudEVycm9ySGFuZGxlcikKKyAgICAgIGNsaWVudEVycm9ySGFuZGxlci5lcnJvcihleGNlcHRpb24pOworICB9CisgIAorCisgIC8vCisgIC8vIGNvcm91dGluZSBzdXBwb3J0CisgIC8vCisKKyAgcHVibGljIGludCBnZXRQYXJzZXJDb3JvdXRpbmVJRCgpIHsKKyAgICByZXR1cm4gZlBhcnNlckNvcm91dGluZUlEOworICB9CisKKyAgLyoqIEByZXR1cm4gdGhlIENvcm91dGluZU1hbmFnZXIgdGhpcyBDb3JvdXRpbmVQYXJzZXIgb2JqZWN0IGlzIGJvdW5kIHRvLgorICAgKiBJZiB5b3UncmUgdXNpbmcgdGhlIGRvLi4uKCkgbWV0aG9kcywgYXBwbGljYXRpb25zIHNob3VsZCBvbmx5CisgICAqIG5lZWQgdG8gdGFsayB0byB0aGUgQ29yb3V0aW5lTWFuYWdlciBvbmNlLCB0byBvYnRhaW4gdGhlCisgICAqIGFwcGxpY2F0aW9uJ3MgQ29yb3V0aW5lIElELgorICAgKiAqLworICBwdWJsaWMgQ29yb3V0aW5lTWFuYWdlciBnZXRDb3JvdXRpbmVNYW5hZ2VyKCkKKyAgeworICAgIHJldHVybiBmQ29yb3V0aW5lTWFuYWdlcjsKKyAgfQorCisgIC8qKiA8cD5JbiB0aGUgU0FYIGRlbGVnYXRpb24gY29kZSwgSSd2ZSBpbmxpbmVkIHRoZSBjb3VudC1kb3duIGluCisgICAqIHRoZSBob3BlIG9mIGVuY291cmFnaW5nIGNvbXBpbGVycyB0byBkZWxpdmVyIGJldHRlcgorICAgKiBwZXJmb3JtYW5jZS4gSG93ZXZlciwgaWYgd2Ugc3ViY2xhc3MgKGVnIHRvIGRpcmVjdGx5IGNvbm5lY3QgdGhlCisgICAqIG91dHB1dCB0byBhIERUTSBidWlsZGVyKSwgdGhhdCB3b3VsZCByZXF1aXJlIGNhbGxpbmcgc3VwZXIgaW4KKyAgICogb3JkZXIgdG8gcnVuIHRoYXQgbG9naWMuLi4gd2hpY2ggc2VlbXMgaW5lbGVnYW50LiAgSGVuY2UgdGhpcworICAgKiByb3V0aW5lIGZvciB0aGUgY29udmVuaWVuY2Ugb2Ygc3ViY2xhc3NlczogZXZlcnkgW2ZyZXF1ZW5jeV0KKyAgICogaW52b2NhdGlvbnMsIGlzc3VlIGEgY29feWllbGQuPC9wPgorICAgKgorICAgKiBAcGFyYW0gbW9yZUV4ZXBjdGVkIFNob3VsZCBhbHdheXMgYmUgdHJ1ZSB1bmxlc3MgdGhpcyBpcyBiZWluZyBjYWxsZWQKKyAgICogYXQgdGhlIGVuZCBvZiBlbmREb2N1bWVudCgpIGhhbmRsaW5nLgorICAgKiAqLworICB2b2lkIGNvdW50X2FuZF95aWVsZChib29sZWFuIG1vcmVFeHBlY3RlZCkKKyAgeworICAgIGlmKCFtb3JlRXhwZWN0ZWQpIGV2ZW50Y291bnRlcj0wOworICAgIAorICAgIGlmKC0tZXZlbnRjb3VudGVyPD0wKQorICAgICAgeworICAgICAgICBjb195aWVsZCh0cnVlKTsKKyAgICAgICAgZXZlbnRjb3VudGVyPWZyZXF1ZW5jeTsKKyAgICAgIH0KKyAgfQorICAKKworICAvKioKKyAgICogQ29fWWllbGQgaGFuZGxlcyBjb3JvdXRpbmUgaW50ZXJhY3Rpb25zIHdoaWxlIGEgcGFyc2UgaXMgaW4gcHJvZ3Jlc3MuCisgICAqIEl0IHdpbGwgcmVzdW1lIHdpdGggCisgICAqICAgY29fcmVzdW1lKEJvb2xlYW4uVFJVRSwgLi4uKSBvbiBzdWNjZXNzIHdpdGggbW9yZSB0byBwYXJzZS4KKyAgICogICBjb19yZXN1bWUoQm9vbGVhbi5GQUxTRSwgLi4uKSBvbiBzdWNjZXNzIGFmdGVyIGVuZERvY3VtZW50LgorICAgKgorICAgKiBXaGVuIGNvbnRyb2wgaXMgcGFzc2VkIGJhY2sgaXQgbWF5IGluZGljYXRlCisgICAqCisgICAqICAgICAgbnVsbCAgICAgICAgICAgIHRlcm1pbmF0ZSB0aGlzIGNvcm91dGluZS4KKyAgICogICAgICAgICAgICAgICAgICAgICAgSXNzdWVzCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb19leGl0X3RvKG51bGwsIC4uLikKKyAgICoJCQkgIGFuZCB0aHJvd3MgVXNlclJlcXVlc3RlZFNodXRkb3duRXhjZXB0aW9uCisgICAqCisgICAqICAgICAgQm9vbGVhbi5UUlVFICAgIGluZGljYXRpb24gdG8gY29udGludWUgcGFyc2luZyB0aGUgY3VycmVudCBkb2N1bWVudC4KKyAgICoJCQkgIFJlc3VtZXMgbm9ybWFsIFNBWCBwYXJzaW5nLgorICAgKgorICAgKiAgICAgIEJvb2xlYW4uRkFMU0UgICBpbmRpY2F0aW9uIHRvIGRpc2NvbnRpbnVlIHBhcnNpbmcgYW5kIHJlc2V0LgorICAgKgkJCSAgVGhyb3dzIFVzZXJSZXF1ZXN0ZWRTdG9wRXhjZXB0aW9uCisgICAqCQkJICB0byByZXR1cm4gY29udHJvbCB0byB0aGUgcnVuKCkgbG9vcC4KKyAgICovCisgIHByaXZhdGUgdm9pZCBjb195aWVsZChib29sZWFuIG1vcmVSZW1haW5zKQorICB7CisgICAgLy8gSG9ycmVuZG91cyBrbHVnZSB0byBydW4gZmlsdGVyIHRvIGNvbXBsZXRpb24uIFNlZSBiZWxvdy4KKyAgICBpZihmTmV2ZXJZaWVsZEFnYWluKQorICAgICAgcmV0dXJuOworICAgIAorICAgIE9iamVjdCBhcmc9IG1vcmVSZW1haW5zID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICAKKyAgICAvLyAlUkVWSUVXJSBFbmQtb2YtZmlsZSBiZWhhdmlvci4gV2hlbiBtb3JlUmVtYWlucz09ZmFsc2UsIHdlIGhhdmUKKyAgICAvLyBqdXN0IGVuZGVkIHBhcnNpbmcgdGhlIGRvY3VtZW50IGFuZCBhcmUgYWJvdXQgdG8gcmV0dXJuCisgICAgLy8gZnJvbSB0aGUgcGFyc2VyLgorICAgIC8vCisgICAgLy8gSWYgd2Ugd2VyZSBpbnZva2VkIGZyb20gdGhlIHJ1bigpIGxvb3AsIHdlIGhhdmUgdG8gcHJvdmlkZQorICAgIC8vIHRoZSBjb3JvdXRpbmUgYXJndW1lbnQgcmV0dXJuZWQgYWJvdmUgYXMgdGhlIG5leHQgY29tbWFuZAorICAgIC8vIHRvIGJlIHByb2Nlc3NlZCBpbiB0aGF0IGxvb3AuCisgICAgLy8KKyAgICAvLyBDb252ZXJzZWx5LCBpZiB3ZSd2ZSBiZWVuIHJ1bm5pbmcgaW4gcmVzcG9uc2UgdG8KKyAgICAvLyBmWE1MUmVhZGVyLnBhcnNlKCkgaW52b2tlZCBkaXJlY3RseSwgd2Ugd2lsbCBub3QgYmUgcmV0dXJuaW5nCisgICAgLy8gdG8gdGhhdCBsb29wLiBJbiB0aGF0IGNhc2UsIHRoZSBxdWVzdGlvbiBiZWNvbWVzIG9uZSBvZiB3aGF0IHdlCisgICAgLy8gc2hvdWxkIGRvIGluc3RlYWQuIFRoZSBzaW1wbGVzdCBhbnN3ZXIgd291bGQgc2VlbSB0byBiZSB0byBkbyBhCisgICAgLy8gY29fZXhpdF90byBpbW1lZGlhdGVseSwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGNvbW1hbmQgbG9vcCB0bworICAgIC8vIGNvbnRpbnVlIHRvIHRhbGsgdG8uCisgICAgaWYoIW1vcmVSZW1haW5zKQorICAgICAgeworICAgICAgICBpZihmUnVubmluZ0luVGhyZWFkKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEp1c3QgcmV0dXJuLiBUaGUgY29tbWFuZCBsb29wIGluIHJ1bigpIHdpbGwgc2VuZCB0aGUKKyAgICAgICAgICAgIC8vICJ3ZSdyZSBkb25lIiBhbm5vdW5jZW1lbnQgYW5kIHJlcXVlc3QgdGhlIG5leHQgY29tbWFuZC4KKyAgICAgICAgICAgIHJldHVybjsgLy8gbGV0IHRoZSBwYXJzZXIgdGVybWluYXRlIGl0c2VsZgorICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgZWxzZSB0cnkgCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gRm9yY2VkIFRlcm1pbmF0aW9uIGRpYWxvZy4gU2F5IHdlJ3JlIGRvbmUsIHdhaXQgZm9yIGEKKyAgICAgICAgICAgIC8vIHRlcm1pbmF0aW9uIHJlcXVlc3QgKGRvbid0IGFjY2VwdCBhbnl0aGluZyBlbHNlKSwgYW5kCisgICAgICAgICAgICAvLyBzaHV0IGRvd24uCisgICAgICAgICAgICBhcmcgPSBmQ29yb3V0aW5lTWFuYWdlci5jb19yZXN1bWUoQm9vbGVhbi5GQUxTRSwgZlBhcnNlckNvcm91dGluZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZBcHBDb3JvdXRpbmVJRCk7CisgICAgICAgICAgICB3aGlsZShhcmchPW51bGwpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCisgICAgICAgICAgICAgICAgICAiRmlsdGVyaW5nIENvcm91dGluZVNBWFBhcnNlcjogdW5leHBlY3RlZCByZXN1bWUgcGFyYW1ldGVyLCAiCisgICAgICAgICAgICAgICAgICArYXJnLmdldENsYXNzKCkrIiB3aXRoIHZhbHVlPVwiIithcmcrJyInKTsKKyAgICAgICAgICAgICAgICAvLyBJZiB5b3UgZG9uJ3QgZG8gdGhpcywgaXQgY2FuIGxvb3AgZm9yZXZlciB3aXRoIHRoZSBhYm92ZQorICAgICAgICAgICAgICAgIC8vIGVycm9yIHByaW50aW5nIG91dC4gIC1zYgorICAgICAgICAgICAgICAgIGFyZyA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIkZpbHRlcmluZyBDb3JvdXRpbmVTQVhQYXJzZXI6IHVuZXhwZWN0ZWQgcmVzdW1lIHBhcmFtZXRlciwgIgorICAgICAgICAgICAgICAgICAgK2FyZy5nZXRDbGFzcygpKyIgd2l0aCB2YWx1ZT1cIiIrYXJnKyciJyk7CisgICAgICAgICAgICAgICAgYXJnID0gZkNvcm91dGluZU1hbmFnZXIuY29fcmVzdW1lKGFyZywgZlBhcnNlckNvcm91dGluZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQXBwQ29yb3V0aW5lSUQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZDb3JvdXRpbmVNYW5hZ2VyLmNvX2V4aXRfdG8oYXJnLCBmUGFyc2VyQ29yb3V0aW5lSUQsIGZBcHBDb3JvdXRpbmVJRCk7CisgICAgICAgICAgICByZXR1cm47IC8vIGxldCB0aGUgcGFyc2VyIHJldHVybgorICAgICAgICAgIH0KKyAgICAgICAgY2F0Y2goamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNob3VsZG4ndCBoYXBwZW4gdW5sZXNzIHdlJ3ZlIG1pc2NvZGVkIG91ciBjb3JvdXRpbmUgbG9naWMKKyAgICAgICAgICAgIC8vICJTaHV0IGRvd24gdGhlIGdhcmJhZ2Ugc21hc2hlcnMgb24gdGhlIGRldGVudGlvbiBsZXZlbCEiCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgICAgIGZDb3JvdXRpbmVNYW5hZ2VyLmNvX2V4aXQoZlBhcnNlckNvcm91dGluZUlEKTsKKyAgICAgICAgICAgIHRocm93IHNodXRkb3duRXhjZXB0aW9uOworICAgICAgICAgIH0KKyAgICAgIH0gLy8gaWYgbW9yZVJlbWFpbnMKKworCisgICAgZWxzZSB0cnkKKyAgICAgIHsKKyAgICAgICAgYXJnID0gZkNvcm91dGluZU1hbmFnZXIuY29fcmVzdW1lKGFyZywgZlBhcnNlckNvcm91dGluZUlELCBmQXBwQ29yb3V0aW5lSUQpOworCisgICAgICAgIC8vICVSRVZJRVclIEknbSByZWFsbHkgbm90IGhhcHB5IHdpdGggdGhlIGZvbGxvd2luZzoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgd2UncmUgcnVubmluZyBpbiBmaWx0ZXIgbW9kZSwgZHJpdmVuIGJ5IGFuIGV4dGVybmFsIFNBWAorICAgICAgICAvLyBldmVudCBzb3VyY2UsIGFuZCBoYXZlIGJlZW4gYmVlbiB5aWVsZGVkIGJhY2sgdG8gd2l0aAorICAgICAgICAvLyBCb29sZWFuLkZBTFNFIChkb01vcmUoZmFsc2UpKSB0aGVyZSBhcmUgdHdvIGFkZGl0aW9uYWwKKyAgICAgICAgLy8gcHJvYmxlbXMuCisgICAgICAgIC8vIAorICAgICAgICAvLyBGaXJzdDogU2NvdHQgdGVsbHMgbWUgdGhhdCBvdXIgdGVjaG5pcXVlIG9mIHRocm93aW5nIGFuCisgICAgICAgIC8vIGV4Y2VwdGlvbiBmcm9tIHRoZSBDb250ZW50SGFuZGxlciB0byB0ZXJtaW5hdGUgU0FYIHBhcnNpbmcsCisgICAgICAgIC8vIHdoaWxlIGFsbW9zdCBhIHVuaXZlcnNhbCBwcmFjdGljZSBpbiB0aGUgU0FYIGNvbW11bml0eSwgaXMgbm90CisgICAgICAgIC8vIGFjY2VwdGFibGUgYmVjYXVzZSB3ZSBjYW4ndCBmb3JjZSB0aGlzIGNvbnRyYWN0IHVwb24gdGhlIGV2ZW50CisgICAgICAgIC8vIGdlbmVyYXRvci4gKFRob3VnaCBoZSBmZWVscyB3ZSBfY2FuXyBmb3JjZSB0aGVtIHRvIGFjY2VwdCBhCisgICAgICAgIC8vIGNvbnRyYWN0IHRvIGV4cGxpY2l0bHkgc2VuZCB1cyBhIGZhdGFsRXJyb3IgZXZlbnQgaWYgcGFyc2luZworICAgICAgICAvLyB0ZXJtaW5hdGVzIGR1ZSB0byBzb21lIG90aGVyIFNBWEV4Y2VwdGlvbi4uLiBiYXNpY2FsbHksIGl0J3MKKyAgICAgICAgLy8gdGhlIG9sZCAidGhpcyBpcyBhIG5vcm1hbCBjb25kaXRpb24gc28gaXQgc2hvdWxkbid0IGJlIGFuCisgICAgICAgIC8vIGV4Y2VwdGlvbiIgcmF0aW9uYWxsZSwgd2hpY2ggaGFzIHNvbWUgdmFsaWRpdHkgdG8gaXQuKQorICAgICAgICAvLyBJbnN0ZWFkLCBhbmQgZGVzcGl0ZSB0aGUgd2FzdGVkIGN5Y2xlcywgaGUgd2FudHMgbWUgdG8gc2ltcGx5CisgICAgICAgIC8vIGxldCB0aGUgZXZlbnQgc3RyZWFtIHJ1biB0byBjb21wbGV0aW9uIHdpdGhvdXQgcGFzc2luZyB0aGUKKyAgICAgICAgLy8gZXZlbnRzIGFsb25nIHRvIG91ciBvd24gY2xpZW50LiBUaGF0IHJlcXVpcmVzIGRpc2FibGluZworICAgICAgICAvLyBjb195ZWlsZCgpIGFzIHdlbGwuIElGIEFORCBXSEVOIFNBWCBBRERTIEFOIE9GRklDSUFMCisgICAgICAgIC8vIFNUT1AtUEFSU0lORy1FQVJMWSBPUEVSQVRJT04sIHdlIGNhbiBsZXZlcmFnZSB0aGF0LgorICAgICAgICAvLworICAgICAgICAvLyBTZWNvbmQ6IFRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBvZiBDb3JvdXRpbmVTQVhQYXJzZXIncworICAgICAgICAvLyBjb3JvdXRpbmUgdHJhbnNhY3Rpb25zIGFzc3VtZXMgdGhhdCBkb01vcmUoZmFsc2UpIHdpbGwgYmUKKyAgICAgICAgLy8gZm9sbG93ZWQgYnkgZWl0aGVyIGRvUGFyc2UobmV3SW5wdXRTb3VyY2UpLCBvcgorICAgICAgICAvLyBkb1Rlcm1pbmF0ZSgpLiBXZSBtdXN0IGNvbXBsZXRlIHRoYXQgY29yb3V0aW5lIGRpYWxvZy4KKyAgICAgICAgLy8gCisgICAgICAgIC8vICJCbGFjayBtYWdpYyBpcyBhIG1hdHRlciBvZiBzeW1ib2xpc20gYW5kIGludGVudC4iCisgICAgICAgIC8vIC0tIFJhbmRhbGwgR2FycmV0dAorICAgICAgICAvLworICAgICAgICAvLyAlVEJEJSBXZSBfTVVTVF8gZ2V0IGF3YXkgZnJvbSB0aGlzIGFyY2hpdGVjdHVyZSBhbmQgc3dpdGNoCisgICAgICAgIC8vIHRvIENvcm91dGluZVNBWEZpbHRlciwganVzdCBzbyB3ZSBkb24ndCBoYXZlIHRvIGdvIHRocm91Z2gKKyAgICAgICAgLy8gdGhpcyAibm8sIEkgZG9uJ3Qgd2FudCBhbm90aGVyIGZpbGUsIHRoYW5rIHlvdSB2ZXJ5IG11Y2giCisgICAgICAgIC8vIHRyYW5zYWN0aW9uLiBJbiBvdXIgYXBwbGljYXRpb24gd2Ugc2hvdWxkIG5ldmVyIG5lZWQgaXQsCisgICAgICAgIC8vIGFuZCB0aGUgb25seSBqdXN0aWZpY2F0aW9uIGZvciBydW5uaW5nIHRoZSBwYXJzZSB3aXRoaW4gYQorICAgICAgICAvLyBjb3JvdXRpbmUgcmVxdWVzdCAtLSBjYXB0dXJpbmcgU0FYRXhjZXB0aW9ucyAtLSBjb3VsZCBiZQorICAgICAgICAvLyBoYW5kbGVkIHBlciB0aGUgYWJvdmUgZGlzY3Vzc2lvbi4KKyAgICAgICAgLy8gCisgICAgICAgIGlmKCFmUnVubmluZ0luVGhyZWFkICYmIGFyZz09Qm9vbGVhbi5GQUxTRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjbGllbnRDb250ZW50SGFuZGxlcj1udWxsOworICAgICAgICAgICAgY2xpZW50TGV4aWNhbEhhbmRsZXI9bnVsbDsKKyAgICAgICAgICAgIC8vIEFueW9uZSBlbHNlPworICAgICAgICAKKyAgICAgICAgICAgIGZOZXZlcllpZWxkQWdhaW49dHJ1ZTsgLy8gSG9ycmVuZG91cyBrbHVnZSBwYXJzaW5nIHRvIGNvbXBsZXRpb246CisKKyAgICAgICAgICAgIC8vIEZvcmNlZCBUZXJtaW5hdGlvbiBkaWFsb2cuIFNheSB3ZSdyZSBkb25lLCB3YWl0IGZvciBhCisgICAgICAgICAgICAvLyB0ZXJtaW5hdGlvbiByZXF1ZXN0IChkb24ndCBhY2NlcHQgYW55dGhpbmcgZWxzZSksIGFuZAorICAgICAgICAgICAgLy8gc2h1dCBkb3duLgorICAgICAgICAgICAgYXJnID0gZkNvcm91dGluZU1hbmFnZXIuY29fcmVzdW1lKEJvb2xlYW4uRkFMU0UsIGZQYXJzZXJDb3JvdXRpbmVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQXBwQ29yb3V0aW5lSUQpOworICAgICAgICAgICAgd2hpbGUoYXJnIT1udWxsKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZz0iRmlsdGVyaW5nIENvcm91dGluZVNBWFBhcnNlcjogIisKKyAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHJlc3VtZSBwYXJhbWV0ZXIsICIrCisgICAgICAgICAgICAgICAgICBhcmcuZ2V0Q2xhc3MoKSsiIHdpdGggdmFsdWU9XCIiK2FyZysnIic7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7CisgICAgICAgICAgICAgICAgLy8gSWYgeW91IGRvbid0IGRvIHRoaXMsIGl0IGNhbiBsb29wIGZvcmV2ZXIgd2l0aCB0aGUgYWJvdmUKKyAgICAgICAgICAgICAgICAvLyBlcnJvciBwcmludGluZyBvdXQuICAtc2IKKyAgICAgICAgICAgICAgICBhcmcgPSBuZXcgUnVudGltZUV4Y2VwdGlvbihtc2cpOworICAgICAgICAgICAgICAgIGFyZyA9IGZDb3JvdXRpbmVNYW5hZ2VyLmNvX3Jlc3VtZShhcmcsIGZQYXJzZXJDb3JvdXRpbmVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkFwcENvcm91dGluZUlEKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBmQ29yb3V0aW5lTWFuYWdlci5jb19leGl0X3RvKGFyZywgZlBhcnNlckNvcm91dGluZUlELCBmQXBwQ29yb3V0aW5lSUQpOworICAgICAgICAgICAgcmV0dXJuOyAvLyBsZXQgdGhlIHBhcnNlciBydW4gdG8gY29tcGxldGlvbiBhbmQgcmV0dXJuCisgICAgICAgICAgfQorCisgICAgICAgIGlmIChhcmcgPT0gbnVsbCkgeworICAgICAgICAgIGZDb3JvdXRpbmVNYW5hZ2VyLmNvX2V4aXRfdG8oYXJnLCBmUGFyc2VyQ29yb3V0aW5lSUQsIGZBcHBDb3JvdXRpbmVJRCk7CisgICAgICAgICAgdGhyb3cgc2h1dGRvd25FeGNlcHRpb247CisgICAgICAgIH0KKworCisgICAgICAgIGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICBib29sZWFuIGtlZXBnb2luZyA9ICgoQm9vbGVhbilhcmcpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICAgIGlmICgha2VlcGdvaW5nKQorICAgICAgICAgICAgdGhyb3cgc3RvcEV4Y2VwdGlvbjsKKyAgICAgICAgICB9CisKKyAgICAgICAgZWxzZSAvLyBVbmV4cGVjdGVkIQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICJBY3RpdmUgQ29yb3V0aW5lU0FYUGFyc2VyOiB1bmV4cGVjdGVkIHJlc3VtZSBwYXJhbWV0ZXIsICIKKyAgICAgICAgICAgICAgICAgICthcmcuZ2V0Q2xhc3MKKyAgICAgICAgICAgICAgICAgICgpKyIgd2l0aCB2YWx1ZT1cIiIrYXJnKyciJyk7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlx0U3RvcHBpbmcgcGFyc2VyIHJhdGhlciB0aGFuIHJpc2sgZGVhZGxvY2siKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3JvdXRpbmUgcGFyYW1ldGVyIGVycm9yICgiK2FyZysnKScpOworICAgICAgICAgIH0KKworICAgICAgfQorICAgIGNhdGNoKGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKKyAgICAgIHsKKyAgICAgICAgLy8gU2hvdWxkbid0IGhhcHBlbiB1bmxlc3Mgd2UndmUgbWlzY29kZWQgb3VyIGNvcm91dGluZSBsb2dpYworICAgICAgICAvLyAiU2h1dCBkb3duIHRoZSBnYXJiYWdlIHNtYXNoZXJzIG9uIHRoZSBkZXRlbnRpb24gbGV2ZWwhIgorICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgZkNvcm91dGluZU1hbmFnZXIuY29fZXhpdChmUGFyc2VyQ29yb3V0aW5lSUQpOworICAgICAgICB0aHJvdyBzaHV0ZG93bkV4Y2VwdGlvbjsKKyAgICAgIH0KKyAgfQorCisKKyAgLyoqIEJldHdlZW4gcGFyc2VyIGV4ZWN1dGlvbnMsIHdhaXQgZm9yIG91ciBwYXJ0bmVyIHRvIHJlc3VtZSB1cyBhbmQKKyAgICogdGVsbCB1cyB3aGF0IHRvIGRvOgorICAgKgorICAgKiAgICAgIG51bGwgICAgICAgICAgICB0ZXJtaW5hdGUgdGhpcyBjb3JvdXRpbmUuCisgICAqICAgICAgICAgICAgICAgICAgICAgIGV4aXRzIHdpdGg6CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb19leGl0X3RvKG51bGwsIC4uLikKKyAgICogICAgICAgICAgICAgICAgICAgICAgZXhwZWN0cyBuZXh0OgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aGluZywgd2UgaGF2ZSB0ZXJtaW5hdGVkIHRoZSB0aHJlYWQuCisgICAqCisgICAqICAgICAgSW5wdXRTb3VyY2UgICAgIHNldHVwIHRvIHJlYWQgZnJvbSB0aGlzIHNvdXJjZS4KKyAgICogICAgICAgICAgICAgICAgICAgICAgcmVzdW1lcyB3aXRoOgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29fcmVzdW1lKEJvb2xlYW4uVFJVRSwgLi4uKSBvbiBwYXJ0aWFsIHBhcnNlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb19yZXN1bWUoQm9vbGVhbi5GQUxTRSwgLi4uKSBvbiBjb21wbGV0ZSBwYXJzZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29fcmVzdW1lKEV4Y2VwdGlvbiwgLi4uKSBvbiBlcnJvci4KKyAgICoKKyAgICogJVJFVkVJVyUgU2hvdWxkIHRoaXMgYmUgYWJsZSB0byBzZXQgbGlzdGVuZXJzPyBQYXJ0bmVyIGNvcm91dGluZSBJRD8KKyAgICogKi8KKyAgcHVibGljIHZvaWQgcnVuKCkgeworICAgIHRyeSAKKyAgICAgIHsKKyAgICAgICAgZm9yKE9iamVjdCBhcmc9ZkNvcm91dGluZU1hbmFnZXIuY29fZW50cnlfcGF1c2UoZlBhcnNlckNvcm91dGluZUlEKTsKKyAgICAgICAgICAgIHRydWU7CisgICAgICAgICAgICBhcmc9ZkNvcm91dGluZU1hbmFnZXIuY29fcmVzdW1lKGFyZywgZlBhcnNlckNvcm91dGluZUlELCBmQXBwQ29yb3V0aW5lSUQpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU2h1dCBkb3duIHJlcXVlc3RlZC4KKyAgICAgICAgICAgIGlmIChhcmcgPT0gbnVsbCkgeworICAgICAgICAgICAgICBpZihERUJVRylTeXN0ZW0ub3V0LnByaW50bG4oIkNvcm91dGluZVNBWFBhcnNlciBhdC1yZXN0IHNodXRkb3duIHJlcXVlc3RlZCIpOworICAgICAgICAgICAgICBmQ29yb3V0aW5lTWFuYWdlci5jb19leGl0X3RvKGFyZywgZlBhcnNlckNvcm91dGluZUlELCBmQXBwQ29yb3V0aW5lSUQpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU3RhcnQtUGFyc2UgcmVxdWVzdGVkCisgICAgICAgICAgICAvLyBGb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgb3BlcmF0aW9uLCBhbGwgY29yb3V0aW5lIGhhbmRzaGFraW5nCisgICAgICAgICAgICAvLyB3aWxsIG9jY3VyIGluIHRoZSBjb195aWVsZCBtZXRob2QuIFRoYXQncyB0aGUgbmljZSB0aGluZyBhYm91dAorICAgICAgICAgICAgLy8gY29yb3V0aW5lczsgdGhleSBnaXZlIHVzIGEgd2F5IHRvIGhhbmQgb2ZmIGNvbnRyb2wgZnJvbSB0aGUKKyAgICAgICAgICAgIC8vIG1pZGRsZSBvZiBhIHN5bmNocm9ub3VzIG1ldGhvZC4KKyAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBJbnB1dFNvdXJjZSkgeworICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBpZihERUJVRylTeXN0ZW0ub3V0LnByaW50bG4oIkluYWN0aXZlIENvcm91dGluZVNBWFBhcnNlciBuZXcgcGFyc2UgIithcmcpOworICAgICAgICAgICAgICAgIGZYTUxSZWFkZXIucGFyc2UoKElucHV0U291cmNlKWFyZyk7CisgICAgICAgICAgICAgICAgLy8gVGVsbCBjYWxsZXIgd2UgcmV0dXJuZWQgZnJvbSBwYXJzaW5nCisgICAgICAgICAgICAgICAgYXJnPUJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGlubmVyPWV4LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmKGlubmVyIGluc3RhbmNlb2YgVXNlclJlcXVlc3RlZFN0b3BFeGNlcHRpb24peworICAgICAgICAgICAgICAgICAgaWYoREVCVUcpU3lzdGVtLm91dC5wcmludGxuKCJBY3RpdmUgQ29yb3V0aW5lU0FYUGFyc2VyIHVzZXIgc3RvcCBleGNlcHRpb24iKTsKKyAgICAgICAgICAgICAgICAgIGFyZz1Cb29sZWFuLkZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKGlubmVyIGluc3RhbmNlb2YgVXNlclJlcXVlc3RlZFNodXRkb3duRXhjZXB0aW9uKXsKKyAgICAgICAgICAgICAgICAgIGlmKERFQlVHKVN5c3RlbS5vdXQucHJpbnRsbigiQWN0aXZlIENvcm91dGluZVNBWFBhcnNlciB1c2VyIHNodXRkb3duIGV4Y2VwdGlvbiIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgaWYoREVCVUcpU3lzdGVtLm91dC5wcmludGxuKCJBY3RpdmUgQ29yb3V0aW5lU0FYUGFyc2VyIFVORVhQRUNURUQgU0FYIGV4Y2VwdGlvbjogIitleCk7CisgICAgICAgICAgICAgICAgICBhcmc9ZXg7CQkgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYoREVCVUcpU3lzdGVtLm91dC5wcmludGxuKCJBY3RpdmUgQ29yb3V0aW5lU0FYUGFyc2VyIG5vbi1TQVggZXhjZXB0aW9uOiAiK2V4KTsKKyAgICAgICAgICAgICAgICAgIGFyZyA9IGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UgLy8gVW5leHBlY3RlZCEKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICJJbmFjdGl2ZSBDb3JvdXRpbmVTQVhQYXJzZXI6IHVuZXhwZWN0ZWQgcmVzdW1lIHBhcmFtZXRlciwgIgorICAgICAgICAgICAgICAgICAgK2FyZy5nZXRDbGFzcygpKyIgd2l0aCB2YWx1ZT1cIiIrYXJnKyciJyk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBJZiB5b3UgZG9uJ3QgZG8gdGhpcywgaXQgY2FuIGxvb3AgZm9yZXZlciB3aXRoIHRoZSBhYm92ZQorICAgICAgICAgICAgICAgIC8vIGVycm9yIHByaW50aW5nIG91dC4gIC1zYgorICAgICAgICAgICAgICAgIGFyZyA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIkluYWN0aXZlIENvcm91dGluZVNBWFBhcnNlcjogdW5leHBlY3RlZCByZXN1bWUgcGFyYW1ldGVyLCAiCisgICAgICAgICAgICAgICAgICArYXJnLmdldENsYXNzKCkrIiB3aXRoIHZhbHVlPVwiIithcmcrJyInKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgfSAvLyBlbmQgd2hpbGUKKyAgICAgIH0gLy8gZW5kIHRyeQorICAgIGNhdGNoKGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKKyAgICAgIHsKKyAgICAgICAgLy8gU2hvdWxkbid0IGhhcHBlbiB1bmxlc3Mgd2UndmUgbWlzY29kZWQgb3VyIGNvcm91dGluZSBsb2dpYworICAgICAgICAvLyAiQ1BPLCBzaHV0IGRvd24gdGhlIGdhcmJhZ2Ugc21hc2hlcnMgb24gdGhlIGRldGVudGlvbiBsZXZlbCEiCisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgICBmQ29yb3V0aW5lTWFuYWdlci5jb19leGl0KGZQYXJzZXJDb3JvdXRpbmVJRCk7CisgICAgICB9CisgIH0KKworICAvKiogVXNlZCBzbyBjb195aWVsZCBjYW4gcmV0dXJuIGNvbnRyb2wgdG8gcnVuIGZvciBlYXJseSBwYXJzZQorICAgKiB0ZXJtaW5hdGlvbi4gICovCisgIGNsYXNzIFVzZXJSZXF1ZXN0ZWRTdG9wRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgorICB7CisgIH0KKyAgCisgIC8qKiAlUkVWSUVXJSBTaG91bGQgYmUgc3RhdGljLCBidXQgY2FuJ3QgYmUgYmVjYXVzZSBpbnRlcm5hbCBjbGFzcyAqLworICBmaW5hbCBVc2VyUmVxdWVzdGVkU3RvcEV4Y2VwdGlvbiBzdG9wRXhjZXB0aW9uPW5ldyBVc2VyUmVxdWVzdGVkU3RvcEV4Y2VwdGlvbigpOworCisgIC8qKiBVc2VkIHNvIGNvX3lpZWxkIGNhbiByZXR1cm4gY29udHJvbCB0byBydW4gZm9yIGNvcm91dGluZSB0aHJlYWQKKyAgICogdGVybWluYXRpb24uICAqLworICBjbGFzcyBVc2VyUmVxdWVzdGVkU2h1dGRvd25FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCisgIHsKKyAgfQorCisgIC8qKiAlUkVWSUVXJSBTaG91bGQgYmUgc3RhdGljLCBidXQgY2FuJ3QgYmUgYmVjYXVzZSBpbnRlcm5hbCBjbGFzcyAqLworICBmaW5hbCBVc2VyUmVxdWVzdGVkU2h1dGRvd25FeGNlcHRpb24gc2h1dGRvd25FeGNlcHRpb24gPSBuZXcgVXNlclJlcXVlc3RlZFNodXRkb3duRXhjZXB0aW9uKCk7CisKKyAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8qKiBkb1BhcnNlKCkgaXMgYSBzaW1wbGUgQVBJIHdoaWNoIHRlbGxzIHRoZSBjb3JvdXRpbmUgcGFyc2VyCisgICAqIHRvIGJlZ2luIHJlYWRpbmcgZnJvbSBhIGZpbGUuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIG9uZQorICAgKiBvZiBvdXIgcGFydG5lciBjb3JvdXRpbmVzLCBhbmQgc2VydmVzIGJvdGggdG8gZW5jYXBzdWxhdGUgdGhlCisgICAqIGNvbW11bmljYXRpb24gcHJvdG9jb2wgYW5kIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5IHVzZSB0aGUKKyAgICogQ29yb3V0aW5lUGFyc2VyJ3MgY29yb3V0aW5lIElEIG51bWJlci4KKyAgICoKKyAgICogJVJFVklFVyU6IElmIHdlIGFyZSBOT1QgcnVubmluZyBpbiBhIHRocmVhZCAoaWYgd2UgYm91bmQgdG8gYW4KKyAgICogZXh0ZXJuYWxseSBpbnZva2VkIFhNTFJlYWRlciksIHRoaXMgb3BlcmF0aW9uIGlzIGEgbm8tb3AuIEkgZG9uJ3QKKyAgICogX3RoaW5rXyBpdCBjYW4gc2FmZWx5IHN5bmNocm9ub3VzbHkgaW52b2tlIHRoYXQgcmVhZGVyJ3MgcGFyc2UoKQorICAgKiBvcGVyYXRpb24sIG9yIGRvTW9yZSgpLCB3aGljaCB3b3VsZCBiZSB0aGUgb2J2aW91cyBhbHRlcm5hdGl2ZXMuLi4uCisgICAqCisgICAqICVSRVZJRVclIENhbi9zaG91bGQgdGhpcyB1bmlmeSB3aXRoIGRvTW9yZT8gKGlmIFVSSSBoYXNuJ3QgY2hhbmdlZCwKKyAgICogcGFyc2UgbW9yZSBmcm9tIHNhbWUgZmlsZSwgZWxzZSBlbmQgYW5kIHJlc3RhcnQgcGFyc2luZy4uLj8KKyAgICoKKyAgICogQHBhcmFtIHNvdXJjZSBUaGUgSW5wdXRTb3VyY2UgdG8gcGFyc2UgZnJvbS4KKyAgICogQHBhcmFtIGFwcENvcm91dGluZUlEIFRoZSBjb3JvdXRpbmUgSUQgbnVtYmVyIG9mIHRoZSBjb3JvdXRpbmUgaW52b2tpbmcKKyAgICogdGhpcyBtZXRob2QsIHNvIGl0IGNhbiBiZSByZXN1bWVkIGFmdGVyIHRoZSBwYXJzZXIgaGFzIHJlc3BvbmRlZCB0byB0aGUKKyAgICogcmVxdWVzdC4KKyAgICogQHJldHVybiBCb29sZWFuLlRSVUUgaWYgdGhlIENvcm91dGluZVBhcnNlciBiZWxpZXZlcyBtb3JlIGRhdGEgbWF5IGJlIGF2YWlsYWJsZQorICAgKiBmb3IgZnVydGhlciBwYXJzaW5nLiBCb29sZWFuLkZBTFNFIGlmIHBhcnNpbmcgcmFuIHRvIGNvbXBsZXRpb24uCisgICAqIEV4Y2VwdGlvbiBpZiB0aGUgcGFyc2VyIG9iamVjdGVkIGZvciBzb21lIHJlYXNvbi4KKyAgICogKi8KKyAgcHVibGljIE9iamVjdCBkb1BhcnNlKElucHV0U291cmNlIHNvdXJjZSwgaW50IGFwcENvcm91dGluZUlEKQorICB7CisgICAgLy8gJVJFVklFVyUgSSdtIG5vdCB3aWxkIGFib3V0IHRoaXMgc29sdXRpb24uLi4KKyAgICBpZighZlJ1bm5pbmdJblRocmVhZCkKKyAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7IC8vICJZZXMsIHdlIGV4cGVjdCB0byBkZWxpdmVyIGV2ZW50cy4iCisKKyAgICB0cnkgCisgICAgICB7CisgICAgICAgIE9iamVjdCByZXN1bHQ9ICAgIAorICAgICAgICAgIGZDb3JvdXRpbmVNYW5hZ2VyLmNvX3Jlc3VtZShzb3VyY2UsIGFwcENvcm91dGluZUlELCBmUGFyc2VyQ29yb3V0aW5lSUQpOworICAgICAgICAKKyAgICAgICAgLy8gJVJFVklFVyUgQmV0dGVyIGVycm9yIHJlcG9ydGluZyBuZWVkZWQuLi4gdGhvdWdoIG1vc3Qgb2YgdGhlc2UKKyAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGFyaXNlIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uLgorICAgICAgICAvLyBTaG91bGQgdGhpcyByZXRocm93IHRoZSBwYXJzZSBleGNlcHRpb24/CisgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHsKKyAgICAgICAgICBpZihyZXN1bHQgaW5zdGFuY2VvZiBTQVhFeGNlcHRpb24pCisgICAgICAgICAgeworICAgICAgICAgICAgU0FYRXhjZXB0aW9uIHNlID0gKFNBWEV4Y2VwdGlvbilyZXN1bHQ7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHNlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYobnVsbCAhPSBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuUGFyc2VyIHRocmV3IGV4Y2VwdGlvbjoiKTsKKyAgICAgICAgICAgICAgc2UucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuUGFyc2VyIHRocmV3IGV4Y2VwdGlvbjoiKTsKKyAgICAgICAgICAgICgoRXhjZXB0aW9uKXJlc3VsdCkucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKworICAgIC8vIFNIT1VMRCBORVZFUiBPQ0NVUiwgc2luY2UgdGhlIGNvcm91dGluZSBudW1iZXIgYW5kIGNvcm91dGluZSBtYW5hZ2VyCisgICAgLy8gYXJlIHRob3NlIHByZXZpb3VzbHkgZXN0YWJsaXNoZWQgZm9yIHRoaXMgQ29yb3V0aW5lU0FYUGFyc2VyLi4uCisgICAgLy8gU28gSSdtIGp1c3QgZ29pbmcgdG8gcmV0dXJuIGl0IGFzIGEgcGFyc2luZyBleGNlcHRpb24sIGZvciBub3cuCisgICAgY2F0Y2goTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCisgICAgICB7CisgICAgICAgIHJldHVybiBlOworICAgICAgfQorICB9CisgIAorICAKKyAgLyoqIGRvTW9yZSgpIGlzIGEgc2ltcGxlIEFQSSB3aGljaCB0ZWxscyB0aGUgY29yb3V0aW5lIHBhcnNlcgorICAgKiB0aGF0IHdlIG5lZWQgbW9yZSBub2Rlcy4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gb25lCisgICAqIG9mIG91ciBwYXJ0bmVyIGNvcm91dGluZXMsIGFuZCBzZXJ2ZXMgYm90aCB0byBlbmNhcHN1bGF0ZSB0aGUKKyAgICogY29tbXVuaWNhdGlvbiBwcm90b2NvbCBhbmQgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkgdXNlIHRoZQorICAgKiBDb3JvdXRpbmVQYXJzZXIncyBjb3JvdXRpbmUgSUQgbnVtYmVyLgorICAgKgorICAgKiBAcGFyYW0gcGFyc2Vtb3JlIElmIHRydWUsIHRlbGxzIHRoZSBpbmNyZW1lbnRhbCBwYXJzZXIgdG8gZ2VuZXJhdGUKKyAgICogYW5vdGhlciBjaHVuayBvZiBvdXRwdXQuIElmIGZhbHNlLCB0ZWxscyB0aGUgcGFyc2VyIHRoYXQgd2UncmUKKyAgICogc2F0aXNmaWVkIGFuZCBpdCBjYW4gdGVybWluYXRlIHBhcnNpbmcgb2YgdGhpcyBkb2N1bWVudC4KKyAgICogQHBhcmFtIGFwcENvcm91dGluZUlEIFRoZSBjb3JvdXRpbmUgSUQgbnVtYmVyIG9mIHRoZSBjb3JvdXRpbmUgaW52b2tpbmcKKyAgICogdGhpcyBtZXRob2QsIHNvIGl0IGNhbiBiZSByZXN1bWVkIGFmdGVyIHRoZSBwYXJzZXIgaGFzIHJlc3BvbmRlZCB0byB0aGUKKyAgICogcmVxdWVzdC4KKyAgICogQHJldHVybiBCb29sZWFuLlRSVUUgaWYgdGhlIENvcm91dGluZVBhcnNlciBiZWxpZXZlcyBtb3JlIGRhdGEgbWF5IGJlIGF2YWlsYWJsZQorICAgKiBmb3IgZnVydGhlciBwYXJzaW5nLiBCb29sZWFuLkZBTFNFIGlmIHBhcnNpbmcgcmFuIHRvIGNvbXBsZXRpb24uCisgICAqIEV4Y2VwdGlvbiBpZiB0aGUgcGFyc2VyIG9iamVjdGVkIGZvciBzb21lIHJlYXNvbi4KKyAgICogKi8KKyAgcHVibGljIE9iamVjdCBkb01vcmUoYm9vbGVhbiBwYXJzZW1vcmUsIGludCBhcHBDb3JvdXRpbmVJRCkKKyAgeworICAgIHRyeSAKKyAgICAgIHsKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9CisgICAgICAgICAgZkNvcm91dGluZU1hbmFnZXIuY29fcmVzdW1lKHBhcnNlbW9yZT9Cb29sZWFuLlRSVUU6Qm9vbGVhbi5GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwQ29yb3V0aW5lSUQsIGZQYXJzZXJDb3JvdXRpbmVJRCk7CisgICAgICAgIAorICAgICAgICAvLyAlUkVWSUVXJSBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIG5lZWRlZAorICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblVORVhQRUNURUQ6IFBhcnNlciBkb01vcmUgc2F5cyBzaHV0IGRvd24gcHJlbWF0dXJlbHkuXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5QYXJzZXIgdGhyZXcgZXhjZXB0aW9uOiIpOworICAgICAgICAgICgoRXhjZXB0aW9uKXJlc3VsdCkucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgIAorICAgIC8vIFNIT1VMRCBORVZFUiBPQ0NVUiwgc2luY2UgdGhlIGNvcm91dGluZSBudW1iZXIgYW5kIGNvcm91dGluZSBtYW5hZ2VyCisgICAgLy8gYXJlIHRob3NlIHByZXZpb3VzbHkgZXN0YWJsaXNoZWQgZm9yIHRoaXMgQ29yb3V0aW5lU0FYUGFyc2VyLi4uCisgICAgLy8gU28gSSdtIGp1c3QgZ29pbmcgdG8gcmV0dXJuIGl0IGFzIGEgcGFyc2luZyBleGNlcHRpb24sIGZvciBub3cuCisgICAgY2F0Y2goTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCisgICAgICB7CisgICAgICAgIHJldHVybiBlOworICAgICAgfQorICB9CisgIAorICAKKyAgLyoqIGRvVGVybWluYXRlKCkgaXMgYSBzaW1wbGUgQVBJIHdoaWNoIHRlbGxzIHRoZSBjb3JvdXRpbmUKKyAgICogcGFyc2VyIHRvIHRlcm1pbmF0ZSBpdHNlbGYuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tCisgICAqIG9uZSBvZiBvdXIgcGFydG5lciBjb3JvdXRpbmVzLCBhbmQgc2VydmVzIGJvdGggdG8gZW5jYXBzdWxhdGUgdGhlCisgICAqIGNvbW11bmljYXRpb24gcHJvdG9jb2wgYW5kIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5IHVzZSB0aGUKKyAgICogQ29yb3V0aW5lUGFyc2VyJ3MgY29yb3V0aW5lIElEIG51bWJlci4KKyAgICoKKyAgICogUmV0dXJucyBvbmx5IGFmdGVyIHRoZSBDb3JvdXRpbmVQYXJzZXIgaGFzIGFja25vd2xlZGdlZCB0aGUgcmVxdWVzdC4KKyAgICoKKyAgICogQHBhcmFtIGFwcENvcm91dGluZUlEIFRoZSBjb3JvdXRpbmUgSUQgbnVtYmVyIG9mIHRoZSBjb3JvdXRpbmUgaW52b2tpbmcKKyAgICogdGhpcyBtZXRob2QsIHNvIGl0IGNhbiBiZSByZXN1bWVkIGFmdGVyIHRoZSBwYXJzZXIgaGFzIHJlc3BvbmRlZCB0byB0aGUKKyAgICogcmVxdWVzdC4KKyAgICogKi8KKyAgcHVibGljIHZvaWQgZG9UZXJtaW5hdGUoaW50IGFwcENvcm91dGluZUlEKQorICB7CisgICAgdHJ5CisgICAgICB7CisgICAgICAgIE9iamVjdCByZXN1bHQgPQorICAgICAgICAgIGZDb3JvdXRpbmVNYW5hZ2VyLmNvX3Jlc3VtZShudWxsLCBhcHBDb3JvdXRpbmVJRCwgZlBhcnNlckNvcm91dGluZUlEKTsKKworICAgICAgICAvLyBEZWJ1Z2dpbmc7IHNob3VsZG4ndCBhcmlzZSBpbiBub3JtYWwgb3BlcmF0aW9uCisgICAgICAgIGlmKHJlc3VsdCE9bnVsbCkKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuVU5FWFBFQ1RFRDogUGFyc2VyIGRvVGVybWluYXRlIGFuc3dlcnMgIityZXN1bHQpOworICAgICAgfQorICAgIGNhdGNoKGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKKyAgICAgIHsKKyAgICAgICAgLy8gVGhhdCdzIE9LOyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB3ZSBkb24ndCBuZWVkIHRvIHRlcm1pbmF0ZSBpdAorICAgICAgfQorICB9CisKKy8vICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAvKiogU2ltcGxlIHVuaXQgdGVzdC4gQXR0ZW1wdCBjb3JvdXRpbmUgcGFyc2luZyBvZiBkb2N1bWVudCBpbmRpY2F0ZWQKKy8vICAgKiBieSBmaXJzdCBhcmd1bWVudCAoYXMgYSBVUkkpLCByZXBvcnQgcHJvZ3Jlc3MuCisvLyAgICovCisvLyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkKKy8vICB7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nLi4uIik7CisvLworLy8gICAgb3JnLnhtbC5zYXguWE1MUmVhZGVyIHRoZVNBWFBhcnNlcj0KKy8vICAgICAgbmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCk7CisvLyAgICAKKy8vICAgIENvcm91dGluZU1hbmFnZXIgY28gPSBuZXcgQ29yb3V0aW5lTWFuYWdlcigpOworLy8gICAgaW50IGFwcENvcm91dGluZUlEID0gY28uY29fam9pbkNvcm91dGluZVNldCgtMSk7CisvLyAgICBpZiAoYXBwQ29yb3V0aW5lSUQgPT0gLTEpCisvLyAgICAgIHsKKy8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVSUk9SOiBDb3VsZG4ndCBhbGxvY2F0ZSBjb3JvdXRpbmUgbnVtYmVyLlxuIik7CisvLyAgICAgICAgcmV0dXJuOworLy8gICAgICB9CisvLyAgICBDb3JvdXRpbmVTQVhQYXJzZXIgcGFyc2VyPQorLy8gICAgICBuZXcgQ29yb3V0aW5lU0FYUGFyc2VyKGNvLCBhcHBDb3JvdXRpbmVJRCwgdGhlU0FYUGFyc2VyKTsKKy8vICAgIGludCBwYXJzZXJDb3JvdXRpbmVJRCA9IHBhcnNlci5nZXRQYXJzZXJDb3JvdXRpbmVJRCgpOworLy8KKy8vICAgIC8vIFVzZSBhIHNlcmlhbGl6ZXIgYXMgb3VyIHNhbXBsZSBvdXRwdXQKKy8vICAgIG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5YTUxTZXJpYWxpemVyIHRyYWNlOworLy8gICAgdHJhY2U9bmV3IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5YTUxTZXJpYWxpemVyKFN5c3RlbS5vdXQsbnVsbCk7CisvLyAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIodHJhY2UpOworLy8gICAgcGFyc2VyLnNldExleEhhbmRsZXIodHJhY2UpOworLy8KKy8vICAgIC8vIFRlbGwgY29yb3V0aW5lIHRvIGJlZ2luIHBhcnNpbmcsIHJ1biB3aGlsZSBwYXJzaW5nIGlzIGluIHByb2dyZXNzCisvLyAgICBmb3IoaW50IGFyZz0wO2FyZzxhcmdzLmxlbmd0aDsrK2FyZykKKy8vICAgICAgeworLy8gICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShhcmdzW2FyZ10pOworLy8gICAgICAgIE9iamVjdCByZXN1bHQ9bnVsbDsKKy8vICAgICAgICBib29sZWFuIG1vcmU9dHJ1ZTsKKy8vICAgICAgICBmb3IocmVzdWx0ID0gcGFyc2VyLmRvUGFyc2Uoc291cmNlLCBhcHBDb3JvdXRpbmVJRCk7CisvLyAgICAgICAgICAgIChyZXN1bHQgaW5zdGFuY2VvZiBCb29sZWFuICYmICgoQm9vbGVhbilyZXN1bHQpPT1Cb29sZWFuLlRSVUUpOworLy8gICAgICAgICAgICByZXN1bHQgPSBwYXJzZXIuZG9Nb3JlKG1vcmUsIGFwcENvcm91dGluZUlEKSkKKy8vICAgICAgICAgIHsKKy8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNvbWUgcGFyc2luZyBzdWNjZXNzZnVsLCB0cnlpbmcgbW9yZS5cbiIpOworLy8gICAgICAgICAgICAKKy8vICAgICAgICAgICAgLy8gU3BlY2lhbCB0ZXN0OiBUZXJtaW5hdGUgcGFyc2luZyBlYXJseS4KKy8vICAgICAgICAgICAgaWYoYXJnKzE8YXJncy5sZW5ndGggJiYgIiEiLmVxdWFscyhhcmdzW2FyZysxXSkpCisvLyAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgKythcmc7CisvLyAgICAgICAgICAgICAgICBtb3JlPWZhbHNlOworLy8gICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgCisvLyAgICAgICAgICB9CisvLyAgICAgICAgCisvLyAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEJvb2xlYW4gJiYgKChCb29sZWFuKXJlc3VsdCk9PUJvb2xlYW4uRkFMU0UpCisvLyAgICAgICAgICB7CisvLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5QYXJzZXIgZW5kZWQgKEVPRiBvciBvbiByZXF1ZXN0KS5cbiIpOworLy8gICAgICAgICAgfQorLy8gICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisvLyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuVU5FWFBFQ1RFRDogUGFyc2VyIHNheXMgc2h1dCBkb3duIHByZW1hdHVyZWx5LlxuIik7CisvLyAgICAgICAgfQorLy8gICAgICAgIGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikgeworLy8gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblBhcnNlciB0aHJldyBleGNlcHRpb246Iik7CisvLyAgICAgICAgICAoKEV4Y2VwdGlvbilyZXN1bHQpLnByaW50U3RhY2tUcmFjZSgpOworLy8gICAgICAgIH0KKy8vICAgICAgICAKKy8vICAgICAgfQorLy8KKy8vICAgIHBhcnNlci5kb1Rlcm1pbmF0ZShhcHBDb3JvdXRpbmVJRCk7CisvLyAgfQorICAKK30gLy8gY2xhc3MgQ29yb3V0aW5lU0FYUGFyc2VyCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0Nvcm91dGluZVNBWFBhcnNlcl9YZXJjZXMuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vQ29yb3V0aW5lU0FYUGFyc2VyX1hlcmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNzlmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0Nvcm91dGluZVNBWFBhcnNlcl9YZXJjZXMuamF2YQpAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiWGVyY2VzIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0CisgKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgSW50ZXJuYXRpb25hbAorICogQnVzaW5lc3MgTWFjaGluZXMsIEluYy4sIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCisvL3BhY2thZ2Ugb3JnLmFwYWNoZS54ZXJjZXMucGFyc2VyczsKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuZHRtOworCitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisvL2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uQ29yb3V0aW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcjsKKworLyoqIDxwPkNvcm91dGluZVNBWFBhcnNlcl9YZXJjZXMgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgWGVyY2VzCisgKiBpbmNyZW1lbnRhbCBtb2RlIGlzIGFscmVhZHkgYSBjb3JvdXRpbmUgb2Ygc29ydHMsIGFuZCBqdXN0IHdyYXBzIG91cgorICogQ29yb3V0aW5lUGFyc2VyIEFQSSBhcm91bmQgaXQuPC9wPgorICoKKyAqIE5PVEUgdGhhdCB0aGlzIHJlcXVpcmVzIGFjY2VzcyB0byBhIGZldyBmZWF0dXJlcyB3aGljaCBhcmUgbm90IHlldAorICogcGFydCBvZiB0aGUgcHVibGljIFhlcmNlcyBBUEkuIEdsZW5uIHNvbHZlZCB0aGF0IGJ5IG1ha2luZyB0aGlzIGNsYXNzCisgKiBhIHN1YmNsYXNzIG9mIHhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlci4gQSBiZXR0ZXIgc29sdXRpb24gbWF5IGJlIHRvCisgKiBtYWtlIGEgc2VwYXJhdGUgc3ViY2xhc3MgdGhlcmVvZiB3aGljaCBleHBvc2VzIHRoZSByZWxldmFudCBtZXRob2RzIGFzCisgKiBwdWJsaWMgLS0gYm90aCBiZWNhdXNlIGl0IHByb3ZpZGVzIG1vcmUgZXhwbGljaXQgY29udHJvbCBvdmVyIHdoYXQKKyAqIGlzIGFuZCBpc24ndCBleHBvc2VkLCBhbmQgYmVjYXVzZSBpdCBob2xkcyBvdXQgdGhlIGhvcGUgb2YgZHJvcHBpbmcgdGhhdAorICogc3ViY2xhc3MgYW5kIHBsdWdnaW5nIGluIGEgbm9ybWFsIGluc3RhbmNlIG9mIFhlcmNlcyBpZi93aGVuIHRoZXNlIG1ldGhvZHMKKyAqIGJlY29tZSBvZmZpY2lhbCBBUEkgY2FsbHMuCisgKgorICogPHA+VXNhZ2UgZXhhbXBsZTogU2VlIG1haW4oKS48L3A+CisgKgorICogPHA+U3RhdHVzOiBQYXNzZXMgc2ltcGxlIG1haW4oKSB1bml0LXRlc3QuIE5FRURTIEpBVkFET0MuPC9wPgorICogKi8KK3B1YmxpYyBjbGFzcyBDb3JvdXRpbmVTQVhQYXJzZXJfWGVyY2VzCisvLyBleHRlbmRzIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyCitpbXBsZW1lbnRzIENvcm91dGluZVBhcnNlcgoreworICAvLyBJbmNyZW1lbnRhbFhlcmNlc1NheFBhcnNlciBpbmNyZW1lbnRhbFBhcnNlcjsKKyAgU0FYUGFyc2VyIGluY3JlbWVudGFsUGFyc2VyOworCisgICAgLy8KKyAgICAvLyBEYXRhCisgICAgLy8KKworICAgIHByaXZhdGUgYm9vbGVhbiBmUGFyc2VJblByb2dyZXNzPWZhbHNlOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICAvLworCisgICAgcHVibGljIENvcm91dGluZVNBWFBhcnNlcl9YZXJjZXMoQ29yb3V0aW5lTWFuYWdlciBjbywgaW50IGFwcENvcm91dGluZUlEKSB7CisgICAgICB0aGlzKG51bGwsY28sYXBwQ29yb3V0aW5lSUQpOworICAgIH0KKworICAgIHB1YmxpYyBDb3JvdXRpbmVTQVhQYXJzZXJfWGVyY2VzKFNBWFBhcnNlciBpeHNwLCBDb3JvdXRpbmVNYW5hZ2VyIGNvLCBpbnQgYXBwQ29yb3V0aW5lSUQpIHsKKworICAgICAgaWYoaXhzcCE9bnVsbCkKKyAgICAgICAgaW5jcmVtZW50YWxQYXJzZXI9aXhzcDsKKyAgICAgIGVsc2UKKyAgICAgICAgaW5jcmVtZW50YWxQYXJzZXI9bmV3IFNBWFBhcnNlcigpOworICAgICAgCisgICAgICAvLyBpbmNyZW1lbnRhbFBhcnNlci5pbml0SGFuZGxlcnModHJ1ZSwgaW5jcmVtZW50YWxQYXJzZXIsIGluY3JlbWVudGFsUGFyc2VyKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEZhY3RvcmllcworICAgIC8vCisgICAgc3RhdGljIHB1YmxpYyBDb3JvdXRpbmVQYXJzZXIgY3JlYXRlQ29yb3V0aW5lUGFyc2VyKENvcm91dGluZU1hbmFnZXIgY28sIGludCBhcHBDb3JvdXRpbmVJRCkgeworICAgICAgcmV0dXJuIG5ldyBDb3JvdXRpbmVTQVhQYXJzZXJfWGVyY2VzKGNvLCBhcHBDb3JvdXRpbmVJRCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBQdWJsaWMgbWV0aG9kcworICAgIC8vCisKKyAgICAvLyBjb3JvdXRpbmUgc3VwcG9ydAorCisgICAgcHVibGljIGludCBnZXRQYXJzZXJDb3JvdXRpbmVJRCgpIHsKKyAgICAgIC8vIHJldHVybiBmUGFyc2VyQ29yb3V0aW5lSUQ7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIC8qKiBAcmV0dXJuIHRoZSBDb3JvdXRpbmVNYW5hZ2VyIHRoaXMgQ29yb3V0aW5lUGFyc2VyIG9iamVjdCBpcyBib3VuZCB0by4KKyAgICogSWYgeW91J3JlIHVzaW5nIHRoZSBkby4uLigpIG1ldGhvZHMsIGFwcGxpY2F0aW9ucyBzaG91bGQgb25seQorICAgKiBuZWVkIHRvIHRhbGsgdG8gdGhlIENvcm91dGluZU1hbmFnZXIgb25jZSwgdG8gb2J0YWluIHRoZQorICAgKiBhcHBsaWNhdGlvbidzIENvcm91dGluZSBJRC4KKyAgICogKi8KKyAgcHVibGljIENvcm91dGluZU1hbmFnZXIgZ2V0Q29yb3V0aW5lTWFuYWdlcigpCisgIHsKKyAgICAvLyByZXR1cm4gZkNvcm91dGluZU1hbmFnZXI7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvLyBSZWdpc3RlciBoYW5kbGVyIGRpcmVjdGx5IHdpdGggdGhlIGluY3JlbWVudGFsIHBhcnNlcgorICBwdWJsaWMgdm9pZCBzZXRDb250ZW50SGFuZGxlcihvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBoYW5kbGVyKQorICB7CisgICAgaW5jcmVtZW50YWxQYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7CisgIH0KKworICAvLyBOb3RlIG5hbWUsIG5lZWRlZCB0byBkb2RnZSB0aGUgaW5oZXJpdGVkIFhlcmNlcyBzZXRMZXhpY2FsSGFuZGxlcgorICAvLyB3aGljaCBpc24ndCBwdWJsaWMuCisgIHB1YmxpYyB2b2lkIHNldExleEhhbmRsZXIob3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyIGhhbmRsZXIpCisgIHsKKyAgICAvLyBOb3Qgc3VwcG9ydGVkIGJ5IGFsbCBTQVgyIHBhcnNlcnMgYnV0IHNob3VsZCB3b3JrIGluIFhlcmNlczoKKyAgICB0cnkgCisgICAgICB7CisgICAgICAgIGluY3JlbWVudGFsUGFyc2VyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKTsKKyAgICAgIH0KKyAgICBjYXRjaChvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpCisgICAgICB7CisgICAgICAgIC8vIE5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0CisgICAgICB9CisgICAgY2F0Y2gob3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpCisgICAgICB7CisgICAgICAgIC8vIE5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0CisgICAgICB9CisgIH0KKyAgCisgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvKiogZG9QYXJzZSgpIGlzIGEgc2ltcGxlIEFQSSB3aGljaCB0ZWxscyB0aGUgY29yb3V0aW5lIHBhcnNlcgorICAgKiB0byBiZWdpbiByZWFkaW5nIGZyb20gYSBmaWxlLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZnJvbSBvbmUKKyAgICogb2Ygb3VyIHBhcnRuZXIgY29yb3V0aW5lcywgYW5kIHNlcnZlcyBib3RoIHRvIGVuY2Fwc3VsYXRlIHRoZQorICAgKiBjb21tdW5pY2F0aW9uIHByb3RvY29sIGFuZCB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseSB1c2UgdGhlCisgICAqIENvcm91dGluZVBhcnNlcidzIGNvcm91dGluZSBJRCBudW1iZXIuCisgICAqCisgICAqICVSRVZJRVclIENhbi9zaG91bGQgdGhpcyB1bmlmeSB3aXRoIGRvTW9yZT8gKGlmIFVSSSBoYXNuJ3QgY2hhbmdlZCwKKyAgICogcGFyc2UgbW9yZSBmcm9tIHNhbWUgZmlsZSwgZWxzZSBlbmQgYW5kIHJlc3RhcnQgcGFyc2luZy4uLj8KKyAgICoKKyAgICogQHBhcmFtIHNvdXJjZSBUaGUgSW5wdXRTb3VyY2UgdG8gcGFyc2UgZnJvbS4KKyAgICogQHBhcmFtIGFwcENvcm91dGluZUlEIFRoZSBjb3JvdXRpbmUgSUQgbnVtYmVyIG9mIHRoZSBjb3JvdXRpbmUgaW52b2tpbmcKKyAgICogdGhpcyBtZXRob2QsIHNvIGl0IGNhbiBiZSByZXN1bWVkIGFmdGVyIHRoZSBwYXJzZXIgaGFzIHJlc3BvbmRlZCB0byB0aGUKKyAgICogcmVxdWVzdC4KKyAgICogQHJldHVybiBCb29sZWFuLlRSVUUgaWYgdGhlIENvcm91dGluZVBhcnNlciBiZWxpZXZlcyBtb3JlIGRhdGEgbWF5IGJlIGF2YWlsYWJsZQorICAgKiBmb3IgZnVydGhlciBwYXJzaW5nLiBCb29sZWFuLkZBTFNFIGlmIHBhcnNpbmcgcmFuIHRvIGNvbXBsZXRpb24uCisgICAqIEV4Y2VwdGlvbiBpZiB0aGUgcGFyc2VyIG9iamVjdGVkIGZvciBzb21lIHJlYXNvbi4KKyAgICogKi8KKyAgcHVibGljIE9iamVjdCBkb1BhcnNlKElucHV0U291cmNlIHNvdXJjZSwgaW50IGFwcENvcm91dGluZUlEKQorICB7CisgICAgaWYgKGZQYXJzZUluUHJvZ3Jlc3MpIHsKKyAgICAgIC8vICVyZXZpZXclIC0tIFdlIG5ldmVyIHNldCB0aGlzIGZsYWcgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YKKyAgICAgIC8vIHRoaXMgY2xhc3MsIHdlIHN0aWxsIGRvbid0IHNldCBpdCBoZXJlLi4uIERpc2NhcmQsIG9yIGZpeD8KKyAgICAgIHJldHVybiBuZXcgU0FYRXhjZXB0aW9uKCJwYXJzZSBtYXkgbm90IGJlIGNhbGxlZCB3aGlsZSBwYXJzaW5nLiIpOworICAgIH0KKyAgICAKKyAgICBPYmplY3QgYXJnOworICAgIHRyeSB7CisgICAgICBib29sZWFuIG9rID0gaW5jcmVtZW50YWxQYXJzZXIucGFyc2VTb21lU2V0dXAoc291cmNlKTsKKyAgICAgIGFyZyA9IG9rID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICB9CisgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgYXJnID0gZXg7CisgICAgfQorICAgIHJldHVybiBhcmc7CisgIH0KKworICAKKyAgLyoqIGRvTW9yZSgpIGlzIGEgc2ltcGxlIEFQSSB3aGljaCB0ZWxscyB0aGUgY29yb3V0aW5lIHBhcnNlcgorICAgKiB0aGF0IHdlIG5lZWQgbW9yZSBub2Rlcy4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gb25lCisgICAqIG9mIG91ciBwYXJ0bmVyIGNvcm91dGluZXMsIGFuZCBzZXJ2ZXMgYm90aCB0byBlbmNhcHN1bGF0ZSB0aGUKKyAgICogY29tbXVuaWNhdGlvbiBwcm90b2NvbCBhbmQgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkgdXNlIHRoZQorICAgKiBDb3JvdXRpbmVQYXJzZXIncyBjb3JvdXRpbmUgSUQgbnVtYmVyLgorICAgKgorICAgKiBAcGFyYW0gcGFyc2Vtb3JlIElmIHRydWUsIHRlbGxzIHRoZSBpbmNyZW1lbnRhbCBwYXJzZXIgdG8gZ2VuZXJhdGUKKyAgICogYW5vdGhlciBjaHVuayBvZiBvdXRwdXQuIElmIGZhbHNlLCB0ZWxscyB0aGUgcGFyc2VyIHRoYXQgd2UncmUKKyAgICogc2F0aXNmaWVkIGFuZCBpdCBjYW4gdGVybWluYXRlIHBhcnNpbmcgb2YgdGhpcyBkb2N1bWVudC4KKyAgICogQHBhcmFtIGFwcENvcm91dGluZUlEIFRoZSBjb3JvdXRpbmUgSUQgbnVtYmVyIG9mIHRoZSBjb3JvdXRpbmUgaW52b2tpbmcKKyAgICogdGhpcyBtZXRob2QsIHNvIGl0IGNhbiBiZSByZXN1bWVkIGFmdGVyIHRoZSBwYXJzZXIgaGFzIHJlc3BvbmRlZCB0byB0aGUKKyAgICogcmVxdWVzdC4KKyAgICogQHJldHVybiBCb29sZWFuLlRSVUUgaWYgdGhlIENvcm91dGluZVBhcnNlciBiZWxpZXZlcyBtb3JlIGRhdGEgbWF5IGJlIGF2YWlsYWJsZQorICAgKiBmb3IgZnVydGhlciBwYXJzaW5nLiBCb29sZWFuLkZBTFNFIGlmIHBhcnNpbmcgcmFuIHRvIGNvbXBsZXRpb24uCisgICAqIEV4Y2VwdGlvbiBpZiB0aGUgcGFyc2VyIG9iamVjdGVkIGZvciBzb21lIHJlYXNvbi4KKyAgICogKi8KKyAgcHVibGljIE9iamVjdCBkb01vcmUgKGJvb2xlYW4gcGFyc2Vtb3JlLCBpbnQgYXBwQ29yb3V0aW5lSUQpCisgIHsKKyAgICBpZighcGFyc2Vtb3JlKQorICAgICAgeworICAgICAgICBmUGFyc2VJblByb2dyZXNzPWZhbHNlOworICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKKyAgICAgIH0KKworICAgIE9iamVjdCBhcmc7CisgICAgdHJ5IHsKKyAgICAgIGJvb2xlYW4ga2VlcGdvaW5nID0gaW5jcmVtZW50YWxQYXJzZXIucGFyc2VTb21lKCk7CisgICAgICBhcmcgPSBrZWVwZ29pbmcgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleCkgeworICAgICAgYXJnID0gZXg7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgIGFyZyA9IGV4OworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgYXJnID0gbmV3IFNBWEV4Y2VwdGlvbihleCk7CisgICAgfQorICAgIHJldHVybiBhcmc7CisgIH0KKyAgCisgIC8qKiBkb1Rlcm1pbmF0ZSgpIGlzIGEgc2ltcGxlIEFQSSB3aGljaCB0ZWxscyB0aGUgY29yb3V0aW5lCisgICAqIHBhcnNlciB0byB0ZXJtaW5hdGUgaXRzZWxmLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZnJvbQorICAgKiBvbmUgb2Ygb3VyIHBhcnRuZXIgY29yb3V0aW5lcywgYW5kIHNlcnZlcyBib3RoIHRvIGVuY2Fwc3VsYXRlIHRoZQorICAgKiBjb21tdW5pY2F0aW9uIHByb3RvY29sIGFuZCB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseSB1c2UgdGhlCisgICAqIENvcm91dGluZVBhcnNlcidzIGNvcm91dGluZSBJRCBudW1iZXIuCisgICAqCisgICAqIFJldHVybnMgb25seSBhZnRlciB0aGUgQ29yb3V0aW5lUGFyc2VyIGhhcyBhY2tub3dsZWRnZWQgdGhlIHJlcXVlc3QuCisgICAqCisgICAqIEBwYXJhbSBhcHBDb3JvdXRpbmVJRCBUaGUgY29yb3V0aW5lIElEIG51bWJlciBvZiB0aGUgY29yb3V0aW5lIGludm9raW5nCisgICAqIHRoaXMgbWV0aG9kLCBzbyBpdCBjYW4gYmUgcmVzdW1lZCBhZnRlciB0aGUgcGFyc2VyIGhhcyByZXNwb25kZWQgdG8gdGhlCisgICAqIHJlcXVlc3QuCisgICAqICovCisgIHB1YmxpYyB2b2lkIGRvVGVybWluYXRlKGludCBhcHBDb3JvdXRpbmVJRCkKKyAgeworICAgIC8vIE5vLW9wIGluIEluY3JlbWVudGFsWGVyY2VzPworCisgICAgLy8gQ291bGQgcmVsZWFzZSBzb21lIGRhdGEgc3RydWN0dXJlcyB0byBwcm9tb3RlIGdhcmJhZ2UgY29sbGVjdGlvbi4uLgorICAgIGluY3JlbWVudGFsUGFyc2VyPW51bGw7CisgIH0KKworICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLyoqIFNpbXBsZSB1bml0IHRlc3QuIEF0dGVtcHQgY29yb3V0aW5lIHBhcnNpbmcgb2YgZG9jdW1lbnQgaW5kaWNhdGVkCisgICAqIGJ5IGZpcnN0IGFyZ3VtZW50IChhcyBhIFVSSSksIHJlcG9ydCBwcm9ncmVzcy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pCisgIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nLi4uIik7CisKKyAgICBDb3JvdXRpbmVNYW5hZ2VyIGNvID0gbmV3IENvcm91dGluZU1hbmFnZXIoKTsKKyAgICBpbnQgYXBwQ29yb3V0aW5lSUQgPSBjby5jb19qb2luQ29yb3V0aW5lU2V0KC0xKTsKKyAgICBpZiAoYXBwQ29yb3V0aW5lSUQgPT0gLTEpCisgICAgICB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRVJST1I6IENvdWxkbid0IGFsbG9jYXRlIGNvcm91dGluZSBudW1iZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIENvcm91dGluZVNBWFBhcnNlcl9YZXJjZXMgcGFyc2VyPQorICAgICAgbmV3IENvcm91dGluZVNBWFBhcnNlcl9YZXJjZXMoY28sIGFwcENvcm91dGluZUlEKTsKKyAgICBpbnQgcGFyc2VyQ29yb3V0aW5lSUQgPSBwYXJzZXIuZ2V0UGFyc2VyQ29yb3V0aW5lSUQoKTsKKworICAgIC8vIFVzZSBhIHNlcmlhbGl6ZXIgYXMgb3VyIHNhbXBsZSBvdXRwdXQKKyAgICBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuWE1MU2VyaWFsaXplciB0cmFjZTsKKyAgICB0cmFjZT1uZXcgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLlhNTFNlcmlhbGl6ZXIoU3lzdGVtLm91dCxudWxsKTsKKyAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIodHJhY2UpOworICAgIHBhcnNlci5zZXRMZXhIYW5kbGVyKHRyYWNlKTsKKworICAgIC8vIFRlbGwgY29yb3V0aW5lIHRvIGJlZ2luIHBhcnNpbmcsIHJ1biB3aGlsZSBwYXJzaW5nIGlzIGluIHByb2dyZXNzCisgICAgZm9yKGludCBhcmc9MDthcmc8YXJncy5sZW5ndGg7KythcmcpCisgICAgICB7CisgICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShhcmdzW2FyZ10pOworICAgICAgICBPYmplY3QgcmVzdWx0PW51bGw7CisgICAgICAgIGJvb2xlYW4gbW9yZT10cnVlOworICAgICAgICAvKiogICAgCisgICAgICAgICAgZm9yKHJlc3VsdCA9IGNvLmNvX3Jlc3VtZShzb3VyY2UsIGFwcENvcm91dGluZUlELCBwYXJzZXJDb3JvdXRpbmVJRCk7CisgICAgICAgICAgKHJlc3VsdCBpbnN0YW5jZW9mIEJvb2xlYW4gJiYgKChCb29sZWFuKXJlc3VsdCk9PUJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgcmVzdWx0ID0gY28uY29fcmVzdW1lKG1vcmUsIGFwcENvcm91dGluZUlELCBwYXJzZXJDb3JvdXRpbmVJRCkpCisgICAgICAgICAgKiovCisgICAgICAgIGZvcihyZXN1bHQgPSBwYXJzZXIuZG9QYXJzZShzb3VyY2UsIGFwcENvcm91dGluZUlEKTsKKyAgICAgICAgICAgIChyZXN1bHQgaW5zdGFuY2VvZiBCb29sZWFuICYmICgoQm9vbGVhbilyZXN1bHQpPT1Cb29sZWFuLlRSVUUpOworICAgICAgICAgICAgcmVzdWx0ID0gcGFyc2VyLmRvTW9yZShtb3JlLCBhcHBDb3JvdXRpbmVJRCkpCisgICAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNvbWUgcGFyc2luZyBzdWNjZXNzZnVsLCB0cnlpbmcgbW9yZS5cbiIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBTcGVjaWFsIHRlc3Q6IFRlcm1pbmF0ZSBwYXJzaW5nIGVhcmx5LgorICAgICAgICAgICAgaWYoYXJnKzE8YXJncy5sZW5ndGggJiYgIiEiLmVxdWFscyhhcmdzW2FyZysxXSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK2FyZzsKKyAgICAgICAgICAgICAgICBtb3JlPWZhbHNlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgQm9vbGVhbiAmJiAoKEJvb2xlYW4pcmVzdWx0KT09Qm9vbGVhbi5GQUxTRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuUGFyc2VyIGVuZGVkIChFT0Ygb3Igb24gcmVxdWVzdCkuXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblVORVhQRUNURUQ6IFBhcnNlciBzYXlzIHNodXQgZG93biBwcmVtYXR1cmVseS5cbiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5QYXJzZXIgdGhyZXcgZXhjZXB0aW9uOiIpOworICAgICAgICAgICgoRXhjZXB0aW9uKXJlc3VsdCkucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICB9CisKKyAgICBwYXJzZXIuZG9UZXJtaW5hdGUoYXBwQ29yb3V0aW5lSUQpOworICB9CisgIAorfSAvLyBjbGFzcyBDb3JvdXRpbmVTQVhQYXJzZXIKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vQ3VzdG9tU3RyaW5nUG9vbC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9DdXN0b21TdHJpbmdQb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjMDMyNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vQ3VzdG9tU3RyaW5nUG9vbC5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlhlcmNlcyIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgSW50ZXJuYXRpb25hbAorICogQnVzaW5lc3MgTWFjaGluZXMsIEluYy4sIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKKy8qKiA8cD5DdXN0b21TdHJpbmdQb29sIGlzIGFuIGV4YW1wbGUgb2YgYXBwbGljdGlvbiBwcm92aWRlZCBkYXRhIHN0cnVjdHVyZQorICogZm9yIGEgRFRNIGltcGxlbWVudGF0aW9uIHRvIGhvbGQgc3ltYm9sIHJlZmVyZW5jZXMsIGUuZy4gZWxlbG1lbnQgbmFtZXMuCisgKiBJdCB3aWxsIGZvbGxvdyB0aGUgRFRNRFN0cmluZ1Bvb2wgaW50ZXJmYWNlIGFuZCB1c2UgdHdvIHNpbXBsZSBtZXRob2RzCisgKiBpbmRleFRvU3RyaW5nKGludCBpKSBhbmQgc3RyaW5nVG9JbmRleChTcmluZyBzKSB0byBtYXAgYmV0d2VlbiBhIHNldCBvZgorICogc3RyaW5nIHZhbHVlcyBhbmQgYSBzZXQgb2YgaW50ZWdlciBpbmRleCB2YWx1ZXMuICBUaGVyZWZvcmUsIGFuIGFwcGxpY2F0aW9uCisgKiBtYXkgaW1wcm92ZSBEVE0gcHJvY2Vzc2luZyBzcGVlZCBieSBzdWJzdGl0dXRpbmcgdGhlIERUTSBzeW1ib2wgcmVzb2x1dGlvbgorICogdGFibGVzIHdpdGggYXBwbGljYXRpb24gc3BlY2lmaWMgcXVpY2sgc3ltYm9sIHJlc29sdXRpb24gdGFibGVzLjwvcD4KKyAqCisgKiAlUkVWSUVXJSBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbiBEVE1TdHJpbmdQb29sIHNlZW1zIHRvIGJlIHRoYXQKKyAqIGl0IHVzZXMgYSBqYXZhLmxhbmcuSGFzaHRhYmxlIGZ1bGwgb2YgSW50ZWdlcnMgcmF0aGVyIHRoYW4gaW1wbGVtZW50aW5nIGl0cworICogb3duIGhhc2hpbmcuIEpvZSBkZWxpYmVyYXRlbHkgYXZvaWRlZCB0aGF0IGFwcHJvYWNoIHdoZW4gd3JpdGluZworICogRFRNU3RyaW5nUG9vbCwgc2luY2UgaXQgaXMgYm90aCBtdWNoIG1vcmUgbWVtb3J5LWh1bmdyeSBhbmQgcHJvYmFibHkgc2xvd2VyCisgKiAtLSBlc3BlY2lhbGx5IGluIEpESyAxLjEueCwgd2hlcmUgSGFzaHRhYmxlIGlzIHN5bmNocm9uaXplZC4gV2UgbmVlZCB0bworICogZWl0aGVyIGp1c3RpZnkgdGhpcyBpbXBsZW1lbnRhdGlvbiBvciBkaXNjYXJkIGl0LgorICoKKyAqIDxwPlN0YXR1czogSW4gcHJvZ3Jlc3MsIHVuZGVyIGRpc2N1c3Npb24uPC9wPgorICogKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21TdHJpbmdQb29sIGV4dGVuZHMgRFRNU3RyaW5nUG9vbCB7CisJLy9maW5hbCBWZWN0b3IgbV9pbnRUb1N0cmluZzsKKwkvL3N0YXRpYyBmaW5hbCBpbnQgSEFTSFBSSU1FPTEwMTsKKwkvL2ludFtdIG1faGFzaFN0YXJ0PW5ldyBpbnRbSEFTSFBSSU1FXTsKKwlmaW5hbCBIYXNodGFibGUgbV9zdHJpbmdUb0ludCA9IG5ldyBIYXNodGFibGUoKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVUxMPS0xOworCisJcHVibGljIEN1c3RvbVN0cmluZ1Bvb2woKQorCXsKKwkJc3VwZXIoKTsKKwkJLyptX2ludFRvU3RyaW5nPW5ldyBWZWN0b3IoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBjb25zdHJ1Y3RvciBtX2ludFRvU3RyaW5nIGlzICIgKyAKKwkJCQkJCQkJCQkJICgobnVsbCA9PSBtX2ludFRvU3RyaW5nKSA/ICJudWxsIiA6ICJub3QgbnVsbCIpKTsqLworCQkvL21fc3RyaW5nVG9JbnQ9bmV3IEhhc2h0YWJsZSgpOworCQkvL3JlbW92ZUFsbEVsZW1lbnRzKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlQWxsRWxlbWVudHMoKQorCXsKKwkJbV9pbnRUb1N0cmluZy5yZW1vdmVBbGxFbGVtZW50cygpOworCQlpZiAobV9zdHJpbmdUb0ludCAhPSBudWxsKSAKKwkJCW1fc3RyaW5nVG9JbnQuY2xlYXIoKTsKKwl9CisKKwkvKiogQHJldHVybiBzdHJpbmcgd2hvc2UgdmFsdWUgaXMgdW5pcXVlbHkgaWRlbnRpZmllZCBieSB0aGlzIGludGVnZXIgaW5kZXguCisJICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisJICogIGlmIGluZGV4IGRvZXNuJ3QgbWFwIHRvIGEgc3RyaW5nLgorCSAqICovCisJcHVibGljIFN0cmluZyBpbmRleFRvU3RyaW5nKGludCBpKQorCXRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisJeworCQlyZXR1cm4oU3RyaW5nKSBtX2ludFRvU3RyaW5nLmVsZW1lbnRBdChpKTsKKwl9CisKKwkvKiogQHJldHVybiBpbnRlZ2VyIGluZGV4IHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIHN0cmluZy4gKi8KKwlwdWJsaWMgaW50IHN0cmluZ1RvSW5kZXgoU3RyaW5nIHMpCisJeworCQlpZiAocz09bnVsbCkgcmV0dXJuIE5VTEw7CisJCUludGVnZXIgaW9iaj0oSW50ZWdlciltX3N0cmluZ1RvSW50LmdldChzKTsKKwkJaWYgKGlvYmo9PW51bGwpIHsKKwkJCW1faW50VG9TdHJpbmcuYWRkRWxlbWVudChzKTsKKwkJCWlvYmo9bmV3IEludGVnZXIobV9pbnRUb1N0cmluZy5zaXplKCkpOworCQkJbV9zdHJpbmdUb0ludC5wdXQocyxpb2JqKTsKKwkJfQorCQlyZXR1cm4gaW9iai5pbnRWYWx1ZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjhhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTS5qYXZhCkBAIC0wLDAgKzEsODk0IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKKyAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKKyAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cworICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5kdG07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmc7CisKKy8qKgorICogPGNvZGU+RFRNPC9jb2RlPiBpcyBhbiBYTUwgZG9jdW1lbnQgbW9kZWwgZXhwcmVzc2VkIGFzIGEgdGFibGUKKyAqIHJhdGhlciB0aGFuIGFuIG9iamVjdCB0cmVlLiBJdCBhdHRlbXB0cyB0byBwcm92aWRlIGFuIGludGVyZmFjZSB0bworICogYSBwYXJzZSB0cmVlIHRoYXQgaGFzIHZlcnkgbGl0dGxlIG9iamVjdCBjcmVhdGlvbi4gKERUTQorICogaW1wbGVtZW50YXRpb25zIG1heSBhbHNvIHN1cHBvcnQgaW5jcmVtZW50YWwgY29uc3RydWN0aW9uIG9mIHRoZQorICogbW9kZWwsIGJ1dCB0aGF0J3MgaGlkZGVuIGZyb20gdGhlIERUTSBBUEkuKQorICoKKyAqIDxwPk5vZGVzIGluIHRoZSBEVE0gYXJlIGlkZW50aWZpZWQgYnkgaW50ZWdlciAiaGFuZGxlcyIuICBBIGhhbmRsZSBtdXN0CisgKiBiZSB1bmlxdWUgd2l0aGluIGEgcHJvY2VzcywgYW5kIGNhcnJpZXMgYm90aCBub2RlIGlkZW50aWZpY2F0aW9uIGFuZAorICogZG9jdW1lbnQgaWRlbnRpZmljYXRpb24uICBJdCBtdXN0IGJlIHBvc3NpYmxlIHRvIGNvbXBhcmUgdHdvIGhhbmRsZXMKKyAqIChhbmQgdGh1cyB0aGVpciBub2RlcykgZm9yIGlkZW50aXR5IHdpdGggIj09Ii48L3A+CisgKgorICogPHA+TmFtZXNwYWNlIFVSTHMsIGxvY2FsLW5hbWVzLCBhbmQgZXhwYW5kZWQtbmFtZXMgY2FuIGFsbCBiZQorICogcmVwcmVzZW50ZWQgYnkgYW5kIHRlc3RlZCBhcyBpbnRlZ2VyIElEIHZhbHVlcy4gIEFuIGV4cGFuZGVkIG5hbWUKKyAqIHJlcHJlc2VudHMgKGFuZCBtYXkgb3IgbWF5IG5vdCBkaXJlY3RseSBjb250YWluKSBhIGNvbWJpbmF0aW9uIG9mCisgKiB0aGUgVVJMIElELCBhbmQgdGhlIGxvY2FsLW5hbWUgSUQuICBOb3RlIHRoYXQgdGhlIG5hbWVzcGFjZSBVUkwgaWQKKyAqIGNhbiBiZSAwLCB3aGljaCBzaG91bGQgaGF2ZSB0aGUgbWVhbmluZyB0aGF0IHRoZSBuYW1lc3BhY2UgaXMgbnVsbC4KKyAqIEZvciBjb25zaXN0YW5jeSwgemVybyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGEgbG9jYWwtbmFtZSBpbmRleC4gPC9wPgorICoKKyAqIDxwPlRleHQgY29udGVudCBvZiBhIG5vZGUgaXMgcmVwcmVzZW50ZWQgYnkgYW4gaW5kZXggYW5kIGxlbmd0aCwKKyAqIHBlcm1pdHRpbmcgZWZmaWNpZW50IHN0b3JhZ2Ugc3VjaCBhcyBhIHNoYXJlZCBGYXN0U3RyaW5nQnVmZmVyLjwvcD4KKyAqCisgKiA8cD5UaGUgbW9kZWwgb2YgdGhlIHRyZWUsIGFzIHdlbGwgYXMgdGhlIGdlbmVyYWwgbmF2aWdhdGlvbiBtb2RlbCwKKyAqIGlzIHRoYXQgb2YgWFBhdGggMS4wLCBmb3IgdGhlIG1vbWVudC4gIFRoZSBtb2RlbCB3aWxsIGV2ZW50dWFsbHkgYmUKKyAqIGFkYXB0ZWQgdG8gbWF0Y2ggdGhlIFhQYXRoIDIuMCBkYXRhIG1vZGVsLCBYTUwgU2NoZW1hLCBhbmQKKyAqIEluZm9TZXQuPC9wPgorICoKKyAqIDxwPkRUTSBkb2VzIF9ub3RfIGRpcmVjdGx5IHN1cHBvcnQgdGhlIFczQydzIERvY3VtZW50IE9iamVjdAorICogTW9kZWwuIEhvd2V2ZXIsIGl0IGF0dGVtcHRzIHRvIGNvbWUgY2xvc2UgZW5vdWdoIHRoYXQgYW4KKyAqIGltcGxlbWVudGF0aW9uIG9mIERUTSBjYW4gYmUgY3JlYXRlZCB0aGF0IHdyYXBzIGEgRE9NIGFuZCB2aWNlCisgKiB2ZXJzYS48L3A+CisgKgorICogPHA+U3RhdGU6IEluIHByb2dyZXNzISE8L3A+IAorICovCitwdWJsaWMgaW50ZXJmYWNlIERUTQoreworCisgIC8qKgorICAgKiBOdWxsIG5vZGUgaGFuZGxlcyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhpcyB2YWx1ZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTEwgPSAtMTsKKworICAvLyBUaGVzZSBub2RlVHlwZSBtbmVtb25pY3MgYW5kIHZhbHVlcyBhcmUgZGVsaWJlcmF0ZWx5IHRoZSBzYW1lIGFzIHRob3NlCisgIC8vIHVzZWQgYnkgdGhlIERPTSwgZm9yIGNvbnZlbmllbnQgbWFwcGluZworICAvLworICAvLyAlUkVWSUVXJSBTaG91bGQgd2UgYWN0dWFsbHkgZGVmaW5lIHRoZXNlIGFzIGluaXRpYWxpemVkIHRvLAorICAvLyBlZy4gb3JnLnczYy5kb20uRG9jdW1lbnQuRUxFTUVOVF9OT0RFPworCisgIC8qKgorICAgKiBUaGUgbm9kZSBpcyBhbiA8Y29kZT5FbGVtZW50PC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgRUxFTUVOVF9OT0RFID0gMTsKKworICAvKioKKyAgICogVGhlIG5vZGUgaXMgYW4gPGNvZGU+QXR0cjwvY29kZT4uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEFUVFJJQlVURV9OT0RFID0gMjsKKworICAvKioKKyAgICogVGhlIG5vZGUgaXMgYSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBURVhUX05PREUgPSAzOworCisgIC8qKgorICAgKiBUaGUgbm9kZSBpcyBhIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENEQVRBX1NFQ1RJT05fTk9ERSA9IDQ7CisKKyAgLyoqCisgICAqIFRoZSBub2RlIGlzIGFuIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEVOVElUWV9SRUZFUkVOQ0VfTk9ERSA9IDU7CisKKyAgLyoqCisgICAqIFRoZSBub2RlIGlzIGFuIDxjb2RlPkVudGl0eTwvY29kZT4uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEVOVElUWV9OT0RFID0gNjsKKworICAvKioKKyAgICogVGhlIG5vZGUgaXMgYSA8Y29kZT5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb248L2NvZGU+LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgPSA3OworCisgIC8qKgorICAgKiBUaGUgbm9kZSBpcyBhIDxjb2RlPkNvbW1lbnQ8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDT01NRU5UX05PREUgPSA4OworCisgIC8qKgorICAgKiBUaGUgbm9kZSBpcyBhIDxjb2RlPkRvY3VtZW50PC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgRE9DVU1FTlRfTk9ERSA9IDk7CisKKyAgLyoqCisgICAqIFRoZSBub2RlIGlzIGEgPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgRE9DVU1FTlRfVFlQRV9OT0RFID0gMTA7CisKKyAgLyoqCisgICAqIFRoZSBub2RlIGlzIGEgPGNvZGU+RG9jdW1lbnRGcmFnbWVudDwvY29kZT4uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTsKKworICAvKioKKyAgICogVGhlIG5vZGUgaXMgYSA8Y29kZT5Ob3RhdGlvbjwvY29kZT4uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IE5PVEFUSU9OX05PREUgPSAxMjsKKworICAvKioKKyAgICogVGhlIG5vZGUgaXMgYSA8Y29kZT5uYW1lc3BhY2Ugbm9kZTwvY29kZT4uIE5vdGUgdGhhdCB0aGlzIGlzIG5vdAorICAgKiBjdXJyZW50bHkgYSBub2RlIHR5cGUgZGVmaW5lZCBieSB0aGUgRE9NIEFQSS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgTkFNRVNQQUNFX05PREUgPSAxMzsKKworICAvLyA9PT09PT09PT0gRFRNIEltcGxlbWVudGF0aW9uIENvbnRyb2wgRnVuY3Rpb25zLiA9PT09PT09PT09PT09PQorICAvLyAlVEJEJSBSRVRJUkVEIC0tIGRvIHZpYSBzZXRGZWF0dXJlIGlmIG5lZWRlZC4gUmVtb3ZlIGZyb20gaW1wbHMuCisgIC8vIHB1YmxpYyB2b2lkIHNldFBhcnNlQmxvY2tTaXplKGludCBibG9ja1NpemVTdWdnZXN0aW9uKTsKKworICAvKioKKyAgICogU2V0IGFuIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBmZWF0dXJlLgorICAgKiA8cD4KKyAgICogJVJFVklFVyUgRG8gd2UgcmVhbGx5IGV4cGVjdCB0byBzZXQgZmVhdHVyZXMgb24gRFRNcz8KKyAgICoKKyAgICogQHBhcmFtIGZlYXR1cmVJZCBBIGZlYXR1cmUgVVJMLgorICAgKiBAcGFyYW0gc3RhdGUgdHJ1ZSBpZiB0aGlzIGZlYXR1cmUgc2hvdWxkIGJlIG9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlSWQsIGJvb2xlYW4gc3RhdGUpOworCisgIC8vID09PT09PT09PSBEb2N1bWVudCBOYXZpZ2F0aW9uIEZ1bmN0aW9ucyA9PT09PT09PT0KKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgdGVzdCBpZiBpdCBoYXMgY2hpbGQgbm9kZXMuCisgICAqIDxwPiAlUkVWSUVXJSBUaGlzIGlzIG9idmlvdXNseSB1c2VmdWwgYXQgdGhlIERPTSBsYXllciwgd2hlcmUgaXQKKyAgICogd291bGQgcGVybWl0IHRlc3RpbmcgdGhpcyB3aXRob3V0IGhhdmluZyB0byBjcmVhdGUgYSBwcm94eQorICAgKiBub2RlLiBJdCdzIGxlc3MgdXNlZnVsIGluIHRoZSBEVE0gQVBJLCB3aGVyZQorICAgKiAoZHRtLmdldEZpcnN0Q2hpbGQobm9kZUhhbmRsZSkhPURUTS5OVUxMKSBpcyBqdXN0IGFzIGZhc3QgYW5kCisgICAqIGFsbW9zdCBhcyBzZWxmLWV2aWRlbnQuIEJ1dCBpdCdzIGEgY29udmVuaWVuY2UsIGFuZCBlYXNlcyBwb3J0aW5nCisgICAqIG9mIERPTSBjb2RlIHRvIERUTS4gIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4KKyAgICogQHJldHVybiBpbnQgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbm9kZSBoYXMgY2hpbGQgbm9kZXMuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgZ2V0IHRoZSBoYW5kbGUgb2YgdGhlIG5vZGUncyBmaXJzdCBjaGlsZC4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4KKyAgICogQHJldHVybiBpbnQgRFRNIG5vZGUtbnVtYmVyIG9mIGZpcnN0IGNoaWxkLAorICAgKiBvciBEVE0uTlVMTCB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0Rmlyc3RDaGlsZChpbnQgbm9kZUhhbmRsZSk7CisKKyAgLyoqCisgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIGdldCB0aGUgaGFuZGxlIG9mIHRoZSBub2RlJ3MgbGFzdCBjaGlsZC4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4KKyAgICogQHJldHVybiBpbnQgTm9kZS1udW1iZXIgb2YgbGFzdCBjaGlsZCwKKyAgICogb3IgRFRNLk5VTEwgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCisgICAqLworICBwdWJsaWMgaW50IGdldExhc3RDaGlsZChpbnQgbm9kZUhhbmRsZSk7CisKKyAgLyoqCisgICAqIFJldHJpZXZlcyBhbiBhdHRyaWJ1dGUgbm9kZSBieSBsb2NhbCBuYW1lIGFuZCBuYW1lc3BhY2UgVVJJCisgICAqCisgICAqICVUQkQlIE5vdGUgdGhhdCB3ZSBjdXJyZW50bHkgaGF2ZSBubyB3YXkgdG8gc3VwcG9ydAorICAgKiB0aGUgRE9NJ3Mgb2xkIGdldEF0dHJpYnV0ZSgpIGNhbGwsIHdoaWNoIGFjY2Vzc2VzIG9ubHkgdGhlIHFuYW1lLgorICAgKgorICAgKiBAcGFyYW0gZWxlbWVudEhhbmRsZSBIYW5kbGUgb2YgdGhlIG5vZGUgdXBvbiB3aGljaCB0byBsb29rIHVwIHRoaXMgYXR0cmlidXRlLgorICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIFRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBhdHRyaWJ1dGUgdG8KKyAgICogICByZXRyaWV2ZSwgb3IgbnVsbC4KKyAgICogQHBhcmFtIG5hbWUgVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0bworICAgKiAgIHJldHJpZXZlLgorICAgKiBAcmV0dXJuIFRoZSBhdHRyaWJ1dGUgbm9kZSBoYW5kbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgKAorICAgKiAgIDxjb2RlPm5vZGVOYW1lPC9jb2RlPikgb3IgPGNvZGU+RFRNLk5VTEw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2gKKyAgICogICBhdHRyaWJ1dGUuCisgICAqLworICBwdWJsaWMgaW50IGdldEF0dHJpYnV0ZU5vZGUoaW50IGVsZW1lbnRIYW5kbGUsIFN0cmluZyBuYW1lc3BhY2VVUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSk7CisKKyAgLyoqCisgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIGdldCB0aGUgaW5kZXggb2YgdGhlIG5vZGUncyBmaXJzdCBhdHRyaWJ1dGUuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIG5vZGUuCisgICAqIEByZXR1cm4gSGFuZGxlIG9mIGZpcnN0IGF0dHJpYnV0ZSwgb3IgRFRNLk5VTEwgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCisgICAqLworICBwdWJsaWMgaW50IGdldEZpcnN0QXR0cmlidXRlKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgZ2V0IHRoZSBpbmRleCBvZiB0aGUgbm9kZSdzIGZpcnN0IG5hbWVzcGFjZSBub2RlLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBoYW5kbGUgdG8gbm9kZSwgd2hpY2ggc2hvdWxkIHByb2JhYmx5IGJlIGFuIGVsZW1lbnQKKyAgICogICAgICAgICAgICAgICAgICAgbm9kZSwgYnV0IG5lZWQgbm90IGJlLgorICAgKgorICAgKiBAcGFyYW0gaW5TY29wZSB0cnVlIGlmIGFsbCBuYW1lc3BhY2VzIGluIHNjb3BlIHNob3VsZCBiZQorICAgKiAgICAgICAgICAgICAgICAgICByZXR1cm5lZCwgZmFsc2UgaWYgb25seSB0aGUgbm9kZSdzIG93bgorICAgKiAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICogQHJldHVybiBoYW5kbGUgb2YgZmlyc3QgbmFtZXNwYWNlLAorICAgKiBvciBEVE0uTlVMTCB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0Rmlyc3ROYW1lc3BhY2VOb2RlKGludCBub2RlSGFuZGxlLCBib29sZWFuIGluU2NvcGUpOworCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBhZHZhbmNlIHRvIGl0cyBuZXh0IHNpYmxpbmcuCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIG5vZGUuCisgICAqIEByZXR1cm4gaW50IE5vZGUtbnVtYmVyIG9mIG5leHQgc2libGluZywKKyAgICogb3IgRFRNLk5VTEwgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCisgICAqLworICBwdWJsaWMgaW50IGdldE5leHRTaWJsaW5nKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgZmluZCBpdHMgcHJlY2VlZGluZyBzaWJsaW5nLgorICAgKiBXQVJOSU5HOiBEVE0gaW1wbGVtZW50YXRpb25zIG1heSBiZSBhc3ltbWV0cmljOyBpbiBzb21lLAorICAgKiB0aGlzIG9wZXJhdGlvbiBoYXMgYmVlbiByZXNvbHZlZCBieSBzZWFyY2gsIGFuZCBpcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIGludCBOb2RlLW51bWJlciBvZiB0aGUgcHJldmlvdXMgc2liLAorICAgKiBvciBEVE0uTlVMTCB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0UHJldmlvdXNTaWJsaW5nKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgYWR2YW5jZSB0byB0aGUgbmV4dCBhdHRyaWJ1dGUuIElmIGFuCisgICAqIGVsZW1lbnQsIHdlIGFkdmFuY2UgdG8gaXRzIGZpcnN0IGF0dHJpYnV0ZTsgaWYgYW4gYXR0ciwgd2UgYWR2YW5jZSB0bworICAgKiB0aGUgbmV4dCBhdHRyIG9mIHRoZSBzYW1lIGVsZW1lbnQuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIG5vZGUuCisgICAqIEByZXR1cm4gaW50IERUTSBub2RlLW51bWJlciBvZiB0aGUgcmVzb2x2ZWQgYXR0ciwKKyAgICogb3IgRFRNLk5VTEwgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCisgICAqLworICBwdWJsaWMgaW50IGdldE5leHRBdHRyaWJ1dGUoaW50IG5vZGVIYW5kbGUpOworCisgIC8qKgorICAgKiBHaXZlbiBhIG5hbWVzcGFjZSBoYW5kbGUsIGFkdmFuY2UgdG8gdGhlIG5leHQgbmFtZXNwYWNlIGluIHRoZSBzYW1lIHNjb3BlCisgICAqIChsb2NhbCBvciBsb2NhbC1wbHVzLWluaGVyaXRlZCwgYXMgc2VsZWN0ZWQgYnkgZ2V0Rmlyc3ROYW1lc3BhY2VOb2RlKQorICAgKgorICAgKiBAcGFyYW0gYmFzZUhhbmRsZSBoYW5kbGUgdG8gb3JpZ2luYWwgbm9kZSBmcm9tIHdoZXJlIHRoZSBmaXJzdCBjaGlsZAorICAgKiB3YXMgcmVsYXRpdmUgdG8gKG5lZWRlZCB0byByZXR1cm4gbm9kZXMgaW4gZG9jdW1lbnQgb3JkZXIpLgorICAgKiBAcGFyYW0gbmFtZXNwYWNlSGFuZGxlIGhhbmRsZSB0byBub2RlIHdoaWNoIG11c3QgYmUgb2YgdHlwZQorICAgKiBOQU1FU1BBQ0VfTk9ERS4KKyAgICogTkVFRFNET0MgQHBhcmFtIGluU2NvcGUKKyAgICogQHJldHVybiBoYW5kbGUgb2YgbmV4dCBuYW1lc3BhY2UsCisgICAqIG9yIERUTS5OVUxMIHRvIGluZGljYXRlIG5vbmUgZXhpc3RzLgorICAgKi8KKyAgcHVibGljIGludCBnZXROZXh0TmFtZXNwYWNlTm9kZShpbnQgYmFzZUhhbmRsZSwgaW50IG5hbWVzcGFjZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluU2NvcGUpOworCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBmaW5kIGl0cyBwYXJlbnQgbm9kZS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIGludCBOb2RlIGhhbmRsZSBvZiBwYXJlbnQsCisgICAqIG9yIERUTS5OVUxMIHRvIGluZGljYXRlIG5vbmUgZXhpc3RzLgorICAgKi8KKyAgcHVibGljIGludCBnZXRQYXJlbnQoaW50IG5vZGVIYW5kbGUpOworCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBmaW5kIHRoZSBvd25pbmcgZG9jdW1lbnQgbm9kZS4gTm90ZSB0aGF0CisgICAqIHRoZSByZWFzb24gdGhpcyBjYW4ndCBqdXN0IHJldHVybiAwIGlzIHRoYXQgaXQgbmVlZHMgdG8gaW5jbHVkZSB0aGUKKyAgICogZG9jdW1lbnQgbnVtYmVyIHBvcnRpb24gb2YgdGhlIG5vZGUgaGFuZGxlLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSB0aGUgaWQgb2YgdGhlIG5vZGUuCisgICAqIEByZXR1cm4gaW50IE5vZGUgaGFuZGxlIG9mIGRvY3VtZW50LCB3aGljaCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkLgorICAgKi8KKyAgcHVibGljIGludCBnZXREb2N1bWVudCgpOworCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBmaW5kIHRoZSBvd25pbmcgZG9jdW1lbnQgbm9kZS4gIFRoaXMgaGFzIHRoZSBleGFjdAorICAgKiBzYW1lIHNlbWFudGljcyBhcyB0aGUgRE9NIERvY3VtZW50IG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lLCBpbiB0aGF0IGlmCisgICAqIHRoZSBub2RlSGFuZGxlIGlzIGEgZG9jdW1lbnQgbm9kZSwgaXQgd2lsbCByZXR1cm4gTlVMTC4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIGludCBOb2RlIGhhbmRsZSBvZiBvd25pbmcgZG9jdW1lbnQsCisgICAqIG9yIERUTS5OVUxMIGlmIHRoZSBub2RlSGFuZGxlIGlzIGEgZG9jdW1lbnQuCisgICAqLworICBwdWJsaWMgaW50IGdldE93bmVyRG9jdW1lbnQoaW50IG5vZGVIYW5kbGUpOworCisgIC8qKgorICAgKiBHZXQgdGhlIHN0cmluZy12YWx1ZSBvZiBhIG5vZGUgYXMgYSBTdHJpbmcgb2JqZWN0CisgICAqIChzZWUgaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjZGF0YS1tb2RlbAorICAgKiBmb3IgdGhlIGRlZmluaXRpb24gb2YgYSBub2RlJ3Mgc3RyaW5nLXZhbHVlKS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgSUQuCisgICAqCisgICAqIEByZXR1cm4gQSBzdHJpbmcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc3RyaW5nLXZhbHVlIG9mIHRoZSBnaXZlbiBub2RlLgorICAgKi8KKyAgcHVibGljIFhNTFN0cmluZyBnZXRTdHJpbmdWYWx1ZShpbnQgbm9kZUhhbmRsZSk7CisKKyAgLyoqCisgICAqIEdldCBudW1iZXIgb2YgY2hhcmFjdGVyIGFycmF5IGNodW5rcyBpbgorICAgKiB0aGUgc3RyaW5nLXZhbHVlIG9mIGEgbm9kZS4KKyAgICogKHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aCNkYXRhLW1vZGVsCisgICAqIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBhIG5vZGUncyBzdHJpbmctdmFsdWUpLgorICAgKiBOb3RlIHRoYXQgYSBzaW5nbGUgdGV4dCBub2RlIG1heSBoYXZlIG11bHRpcGxlIHRleHQgY2h1bmtzLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KKyAgICoKKyAgICogQHJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVyIGFycmF5IGNodW5rcyBpbgorICAgKiAgICAgICAgIHRoZSBzdHJpbmctdmFsdWUgb2YgYSBub2RlLgorICAgKi8KKyAgcHVibGljIGludCBnZXRTdHJpbmdWYWx1ZUNodW5rQ291bnQoaW50IG5vZGVIYW5kbGUpOworCisgIC8qKgorICAgKiBHZXQgYSBjaGFyYWN0ZXIgYXJyYXkgY2h1bmsgaW4gdGhlIHN0cmluZy12YWx1ZSBvZiBhIG5vZGUuCisgICAqIChzZWUgaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjZGF0YS1tb2RlbAorICAgKiBmb3IgdGhlIGRlZmluaXRpb24gb2YgYSBub2RlJ3Mgc3RyaW5nLXZhbHVlKS4KKyAgICogTm90ZSB0aGF0IGEgc2luZ2xlIHRleHQgbm9kZSBtYXkgaGF2ZSBtdWx0aXBsZSB0ZXh0IGNodW5rcy4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgSUQuCisgICAqIEBwYXJhbSBjaHVua0luZGV4IFdoaWNoIGNodW5rIHRvIGdldC4KKyAgICogQHBhcmFtIHN0YXJ0QW5kTGVuICBBIHR3by1pbnRlZ2VyIGFycmF5IHdoaWNoLCB1cG9uIHJldHVybiwgV0lMTAorICAgKiBCRSBGSUxMRUQgd2l0aCB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBjaHVuaydzIHN0YXJ0IHBvc2l0aW9uCisgICAqIHdpdGhpbiB0aGUgcmV0dXJuZWQgY2hhcmFjdGVyIGJ1ZmZlciBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgY2h1bmsuCisgICAqIEByZXR1cm4gVGhlIGNoYXJhY3RlciBhcnJheSBidWZmZXIgd2l0aGluIHdoaWNoIHRoZSBjaHVuayBvY2N1cnMsCisgICAqIHNldHRpbmcgc3RhcnRBbmRMZW4ncyBjb250ZW50cyBhcyBhIHNpZGUtZWZmZWN0LgorICAgKi8KKyAgcHVibGljIGNoYXJbXSBnZXRTdHJpbmdWYWx1ZUNodW5rKGludCBub2RlSGFuZGxlLCBpbnQgY2h1bmtJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHN0YXJ0QW5kTGVuKTsKKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGFuIElEIHRoYXQgcmVwcmVzZW50cyB0aGUgbm9kZSdzIGV4cGFuZGVkIG5hbWUuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBoYW5kbGUgdG8gdGhlIG5vZGUgaW4gcXVlc3Rpb24uCisgICAqCisgICAqIEByZXR1cm4gdGhlIGV4cGFuZGVkLW5hbWUgaWQgb2YgdGhlIG5vZGUuCisgICAqLworICBwdWJsaWMgaW50IGdldEV4cGFuZGVkTmFtZUlEKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogR2l2ZW4gYW4gZXhwYW5kZWQgbmFtZSwgcmV0dXJuIGFuIElELiAgSWYgdGhlIGV4cGFuZGVkLW5hbWUgZG9lcyBub3QKKyAgICogZXhpc3QgaW4gdGhlIGludGVybmFsIHRhYmxlcywgdGhlIGVudHJ5IHdpbGwgYmUgY3JlYXRlZCwgYW5kIHRoZSBJRCB3aWxsCisgICAqIGJlIHJldHVybmVkLiAgQW55IGFkZGl0aW9uYWwgbm9kZXMgdGhhdCBhcmUgY3JlYXRlZCB0aGF0IGhhdmUgdGhpcworICAgKiBleHBhbmRlZCBuYW1lIHdpbGwgdXNlIHRoaXMgSUQuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBoYW5kbGUgdG8gdGhlIG5vZGUgaW4gcXVlc3Rpb24uCisgICAqCisgICAqIE5FRURTRE9DIEBwYXJhbSBuYW1lc3BhY2UKKyAgICogTkVFRFNET0MgQHBhcmFtIGxvY2FsTmFtZQorICAgKiBORUVEU0RPQyBAcGFyYW0gdHlwZQorICAgKgorICAgKiBAcmV0dXJuIHRoZSBleHBhbmRlZC1uYW1lIGlkIG9mIHRoZSBub2RlLgorICAgKi8KKyAgcHVibGljIGludCBnZXRFeHBhbmRlZE5hbWVJRChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lLCBpbnQgdHlwZSk7CisKKyAgLyoqCisgICAqIEdpdmVuIGFuIGV4cGFuZGVkLW5hbWUgSUQsIHJldHVybiB0aGUgbG9jYWwgbmFtZSBwYXJ0LgorICAgKgorICAgKiBAcGFyYW0gRXhwYW5kZWROYW1lSUQgYW4gSUQgdGhhdCByZXByZXNlbnRzIGFuIGV4cGFuZGVkLW5hbWUuCisgICAqIEByZXR1cm4gU3RyaW5nIExvY2FsIG5hbWUgb2YgdGhpcyBub2RlLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWVGcm9tRXhwYW5kZWROYW1lSUQoaW50IEV4cGFuZGVkTmFtZUlEKTsKKworICAvKioKKyAgICogR2l2ZW4gYW4gZXhwYW5kZWQtbmFtZSBJRCwgcmV0dXJuIHRoZSBuYW1lc3BhY2UgVVJJIHBhcnQuCisgICAqCisgICAqIEBwYXJhbSBFeHBhbmRlZE5hbWVJRCBhbiBJRCB0aGF0IHJlcHJlc2VudHMgYW4gZXhwYW5kZWQtbmFtZS4KKyAgICogQHJldHVybiBTdHJpbmcgVVJJIHZhbHVlIG9mIHRoaXMgbm9kZSdzIG5hbWVzcGFjZSwgb3IgbnVsbCBpZiBubworICAgKiBuYW1lc3BhY2Ugd2FzIHJlc29sdmVkLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VGcm9tRXhwYW5kZWROYW1lSUQoaW50IEV4cGFuZGVkTmFtZUlEKTsKKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGl0cyBET00tc3R5bGUgbm9kZSBuYW1lLiBUaGlzIHdpbGwKKyAgICogaW5jbHVkZSBuYW1lcyBzdWNoIGFzICN0ZXh0IG9yICNkb2N1bWVudC4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIFN0cmluZyBOYW1lIG9mIHRoaXMgbm9kZSwgd2hpY2ggbWF5IGJlIGFuIGVtcHR5IHN0cmluZy4KKyAgICogJVJFVklFVyUgRG9jdW1lbnQgd2hlbiBlbXB0eSBzdHJpbmcgaXMgcG9zc2libGUuLi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoaW50IG5vZGVIYW5kbGUpOworCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gdGhlIFhQYXRoIG5vZGUgbmFtZS4gIFRoaXMgc2hvdWxkIGJlCisgICAqIHRoZSBuYW1lIGFzIGRlc2NyaWJlZCBieSB0aGUgWFBhdGggZGF0YSBtb2RlbCwgTk9UIHRoZSBET00tc3R5bGUKKyAgICogbmFtZS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIFN0cmluZyBOYW1lIG9mIHRoaXMgbm9kZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWVYKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGl0cyBET00tc3R5bGUgbG9jYWxuYW1lLgorICAgKiAoQXMgZGVmaW5lZCBpbiBOYW1lc3BhY2VzLCB0aGlzIGlzIHRoZSBwb3J0aW9uIG9mIHRoZSBuYW1lIGFmdGVyIHRoZQorICAgKiBwcmVmaXgsIGlmIHByZXNlbnQsIG9yIHRoZSB3aG9sZSBub2RlIG5hbWUgaWYgbm8gcHJlZml4IGV4aXN0cykKKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIFN0cmluZyBMb2NhbCBuYW1lIG9mIHRoaXMgbm9kZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogR2l2ZW4gYSBuYW1lc3BhY2UgaGFuZGxlLCByZXR1cm4gdGhlIHByZWZpeCB0aGF0IHRoZSBuYW1lc3BhY2UgZGVjbCBpcworICAgKiBtYXBwaW5nLgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gdGhlIHByZWZpeCB1c2VkIHRvIG1hcCB0byB0aGUgbmFtZXNwYWNlLgorICAgKiAoQXMgZGVmaW5lZCBpbiBOYW1lc3BhY2VzLCB0aGlzIGlzIHRoZSBwb3J0aW9uIG9mIHRoZSBuYW1lIGJlZm9yZSBhbnkKKyAgICogY29sb24gY2hhcmFjdGVyKS4KKyAgICogQHBhcmFtIHBvc3RpdGlvbiBpbnQgSGFuZGxlIG9mIHRoZSBub2RlLgorICAgKgorICAgKiA8cD4gJVJFVklFVyUgQXJlIHlvdSBzdXJlIHlvdSB3YW50ICIiIGZvciBubyBwcmVmaXg/ICA8L3A+CisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICogQHJldHVybiBTdHJpbmcgcHJlZml4IG9mIHRoaXMgbm9kZSdzIG5hbWUsIG9yICIiIGlmIG5vIGV4cGxpY2l0CisgICAqIG5hbWVzcGFjZSBwcmVmaXggd2FzIGdpdmVuLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoaW50IG5vZGVIYW5kbGUpOworCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gaXRzIERPTS1zdHlsZSBuYW1lc3BhY2UgVVJJCisgICAqIChBcyBkZWZpbmVkIGluIE5hbWVzcGFjZXMsIHRoaXMgaXMgdGhlIGRlY2xhcmVkIFVSSSB3aGljaCB0aGlzIG5vZGUncworICAgKiBwcmVmaXggLS0gb3IgZGVmYXVsdCBpbiBsaWV1IHRoZXJlb2YgLS0gd2FzIG1hcHBlZCB0by4pCisgICAqIEBwYXJhbSBwb3N0aXRpb24gaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIFN0cmluZyBVUkkgdmFsdWUgb2YgdGhpcyBub2RlJ3MgbmFtZXNwYWNlLCBvciBudWxsIGlmIG5vCisgICAqIG5hbWVzcGFjZSB3YXMgcmVzb2x2ZWQuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgbm9kZUhhbmRsZSk7CisKKyAgLyoqCisgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiBpdHMgbm9kZSB2YWx1ZS4gVGhpcyBpcyBtb3N0bHkKKyAgICogYXMgZGVmaW5lZCBieSB0aGUgRE9NLCBidXQgbWF5IGlnbm9yZSBzb21lIGNvbnZlbmllbmNlcy4KKyAgICogPHA+CisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLgorICAgKiBAcmV0dXJuIFN0cmluZyBWYWx1ZSBvZiB0aGlzIG5vZGUsIG9yIG51bGwgaWYgbm90CisgICAqIG1lYW5pbmdmdWwgZm9yIHRoaXMgbm9kZSB0eXBlLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoaW50IG5vZGVIYW5kbGUpOworCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gaXRzIERPTS1zdHlsZSBub2RlIHR5cGUuCisgICAqCisgICAqIDxwPiVSRVZJRVclIEdlbmVyYWxseSwgcmV0dXJuaW5nIHNob3J0IGlzIGZhbHNlIGVjb25vbXkuIFJldHVybiBpbnQ/PC9wPgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBpZC4KKyAgICogQHJldHVybiBpbnQgTm9kZSB0eXBlLCBhcyBwZXIgdGhlIERPTSdzIE5vZGUuX05PREUgY29uc3RhbnRzLgorICAgKi8KKyAgcHVibGljIHNob3J0IGdldE5vZGVUeXBlKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImludGVybmFsIi8+CisgICAqIEdldCB0aGUgZGVwdGggbGV2ZWwgb2YgdGhpcyBub2RlIGluIHRoZSB0cmVlIChlcXVhbHMgMSBmb3IKKyAgICogYSBwYXJlbnRsZXNzIG5vZGUpLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBpZC4KKyAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGFuY2VzdG9ycywgcGx1cyBvbmUKKyAgICovCisgIHB1YmxpYyBzaG9ydCBnZXRMZXZlbChpbnQgbm9kZUhhbmRsZSk7CisKKyAgLy8gPT09PT09PT09PT09PT0gRG9jdW1lbnQgcXVlcnkgZnVuY3Rpb25zID09PT09PT09PT09PT09IAorCisgIC8qKgorICAgKiBUZXN0cyB3aGV0aGVyIERUTSBET00gaW1wbGVtZW50YXRpb24gaW1wbGVtZW50cyBhIHNwZWNpZmljIGZlYXR1cmUgYW5kCisgICAqIHRoYXQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBub2RlLgorICAgKiBAcGFyYW0gZmVhdHVyZSBUaGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LgorICAgKiBAcGFyYW0gdmVyc2lvbiBUaGlzIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LgorICAgKiAgIElmIHRoZSB2ZXJzaW9uIGlzIG5vdAorICAgKiAgIHNwZWNpZmllZCwgc3VwcG9ydGluZyBhbnkgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSB3aWxsIGNhdXNlIHRoZQorICAgKiAgIG1ldGhvZCB0byByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgaXMKKyAgICogICBzdXBwb3J0ZWQgb24gdGhpcyBub2RlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKTsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSBiYXNlIFVSSSBvZiB0aGUgZG9jdW1lbnQgZW50aXR5LiBJZiBpdCBpcyBub3Qga25vd24KKyAgICogKGJlY2F1c2UgdGhlIGRvY3VtZW50IHdhcyBwYXJzZWQgZnJvbSBhIHNvY2tldCBjb25uZWN0aW9uIG9yIGZyb20KKyAgICogc3RhbmRhcmQgaW5wdXQsIGZvciBleGFtcGxlKSwgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMgdW5rbm93bi4KKyAgICoKKyAgICogQHJldHVybiB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgU3RyaW5nIG9iamVjdCBvciBudWxsIGlmIHVua25vd24uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50QmFzZVVSSSgpOworCisgIC8qKgorICAgKiBTZXQgdGhlIGJhc2UgVVJJIG9mIHRoZSBkb2N1bWVudCBlbnRpdHkuCisgICAqCisgICAqIEBwYXJhbSBiYXNlVVJJIHRoZSBkb2N1bWVudCBiYXNlIFVSSSBTdHJpbmcgb2JqZWN0IG9yIG51bGwgaWYgdW5rbm93bi4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50QmFzZVVSSShTdHJpbmcgYmFzZVVSSSk7CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IGVudGl0eS4gSWYKKyAgICogaXQgaXMgbm90IGtub3duLCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcyBudWxsLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBpZCwgd2hpY2ggY2FuIGJlIGFueSB2YWxpZCBub2RlIGhhbmRsZS4KKyAgICogQHJldHVybiB0aGUgc3lzdGVtIGlkZW50aWZpZXIgU3RyaW5nIG9iamVjdCBvciBudWxsIGlmIHVua25vd24uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50U3lzdGVtSWRlbnRpZmllcihpbnQgbm9kZUhhbmRsZSk7CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHNjaGVtZQorICAgKiAgICAgICAgaW4gd2hpY2ggdGhlIGRvY3VtZW50IGVudGl0eSBpcyBleHByZXNzZWQuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLCB3aGljaCBjYW4gYmUgYW55IHZhbGlkIG5vZGUgaGFuZGxlLgorICAgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBlbmNvZGluZyBTdHJpbmcgb2JqZWN0LgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudEVuY29kaW5nKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogUmV0dXJuIGFuIGluZGljYXRpb24gb2YgdGhlIHN0YW5kYWxvbmUgc3RhdHVzIG9mIHRoZSBkb2N1bWVudCwKKyAgICogICAgICAgIGVpdGhlciAieWVzIiBvciAibm8iLiBUaGlzIHByb3BlcnR5IGlzIGRlcml2ZWQgZnJvbSB0aGUgb3B0aW9uYWwKKyAgICogICAgICAgIHN0YW5kYWxvbmUgZG9jdW1lbnQgZGVjbGFyYXRpb24gaW4gdGhlIFhNTCBkZWNsYXJhdGlvbiBhdCB0aGUKKyAgICogICAgICAgIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQgZW50aXR5LCBhbmQgaGFzIG5vIHZhbHVlIGlmIHRoZXJlIGlzIG5vCisgICAqICAgICAgICBzdGFuZGFsb25lIGRvY3VtZW50IGRlY2xhcmF0aW9uLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBpZCwgd2hpY2ggY2FuIGJlIGFueSB2YWxpZCBub2RlIGhhbmRsZS4KKyAgICogQHJldHVybiB0aGUgZG9jdW1lbnQgc3RhbmRhbG9uZSBTdHJpbmcgb2JqZWN0LCBlaXRoZXIgInllcyIsICJubyIsIG9yIG51bGwuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50U3RhbmRhbG9uZShpbnQgbm9kZUhhbmRsZSk7CisKKyAgLyoqCisgICAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFhNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudC4gVGhpcworICAgKiBwcm9wZXJ0eSBpcyBkZXJpdmVkIGZyb20gdGhlIFhNTCBkZWNsYXJhdGlvbiBvcHRpb25hbGx5IHByZXNlbnQgYXQgdGhlCisgICAqIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQgZW50aXR5LCBhbmQgaGFzIG5vIHZhbHVlIGlmIHRoZXJlIGlzIG5vIFhNTAorICAgKiBkZWNsYXJhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIHRoZSBkb2N1bWVudCBoYW5kbGUKKyAgICoKKyAgICogTkVFRFNET0MgQHBhcmFtIGRvY3VtZW50SGFuZGxlCisgICAqCisgICAqIEByZXR1cm4gdGhlIGRvY3VtZW50IHZlcnNpb24gU3RyaW5nIG9iamVjdAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudFZlcnNpb24oaW50IGRvY3VtZW50SGFuZGxlKTsKKworICAvKioKKyAgICogUmV0dXJuIGFuIGluZGljYXRpb24gb2YKKyAgICogd2hldGhlciB0aGUgcHJvY2Vzc29yIGhhcyByZWFkIHRoZSBjb21wbGV0ZSBEVEQuIEl0cyB2YWx1ZSBpcyBhCisgICAqIGJvb2xlYW4uIElmIGl0IGlzIGZhbHNlLCB0aGVuIGNlcnRhaW4gcHJvcGVydGllcyAoaW5kaWNhdGVkIGluIHRoZWlyCisgICAqIGRlc2NyaXB0aW9ucyBiZWxvdykgbWF5IGJlIHVua25vd24uIElmIGl0IGlzIHRydWUsIHRob3NlIHByb3BlcnRpZXMKKyAgICogYXJlIG5ldmVyIHVua25vd24uCisgICAqCisgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWxsIGRlY2xhcmF0aW9ucyB3ZXJlIHByb2Nlc3NlZDsKKyAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZ2V0RG9jdW1lbnRBbGxEZWNsYXJhdGlvbnNQcm9jZXNzZWQoKTsKKworICAvKioKKyAgICogICBBIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24gaW5mb3JtYXRpb24gaXRlbSBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgKgorICAgKiAgICAgMS4gW3N5c3RlbSBpZGVudGlmaWVyXSBUaGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVybmFsIHN1YnNldCwgaWYKKyAgICogICAgICAgIGl0IGV4aXN0cy4gT3RoZXJ3aXNlIHRoaXMgcHJvcGVydHkgaGFzIG5vIHZhbHVlLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBTdHJpbmcgb2JqZWN0LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50VHlwZURlY2xhcmF0aW9uU3lzdGVtSWRlbnRpZmllcigpOworCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBleHRlcm5hbCBzdWJzZXQsCisgICAqIG5vcm1hbGl6ZWQgYXMgZGVzY3JpYmVkIGluIDQuMi4yIEV4dGVybmFsIEVudGl0aWVzIFtYTUxdLiBJZiB0aGVyZSBpcworICAgKiBubyBleHRlcm5hbCBzdWJzZXQgb3IgaWYgaXQgaGFzIG5vIHB1YmxpYyBpZGVudGlmaWVyLCB0aGlzIHByb3BlcnR5CisgICAqIGhhcyBubyB2YWx1ZS4KKyAgICoKKyAgICogQHBhcmFtIHRoZSBkb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9uIGhhbmRsZQorICAgKgorICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMgaWRlbnRpZmllciBTdHJpbmcgb2JqZWN0LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50VHlwZURlY2xhcmF0aW9uUHVibGljSWRlbnRpZmllcigpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5FbGVtZW50PC9jb2RlPiB3aG9zZSA8Y29kZT5JRDwvY29kZT4gaXMgZ2l2ZW4gYnkKKyAgICogPGNvZGU+ZWxlbWVudElkPC9jb2RlPi4gSWYgbm8gc3VjaCBlbGVtZW50IGV4aXN0cywgcmV0dXJucworICAgKiA8Y29kZT5EVE0uTlVMTDwvY29kZT4uIEJlaGF2aW9yIGlzIG5vdCBkZWZpbmVkIGlmIG1vcmUgdGhhbiBvbmUgZWxlbWVudAorICAgKiBoYXMgdGhpcyA8Y29kZT5JRDwvY29kZT4uIEF0dHJpYnV0ZXMgKGluY2x1ZGluZyB0aG9zZQorICAgKiB3aXRoIHRoZSBuYW1lICJJRCIpIGFyZSBub3Qgb2YgdHlwZSBJRCB1bmxlc3Mgc28gZGVmaW5lZCBieSBEVEQvU2NoZW1hCisgICAqIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byB0aGUgRFRNIGltcGxlbWVudGF0aW9uLgorICAgKiBJbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBub3Qga25vdyB3aGV0aGVyIGF0dHJpYnV0ZXMgYXJlIG9mIHR5cGUgSUQgb3IKKyAgICogbm90IGFyZSBleHBlY3RlZCB0byByZXR1cm4gPGNvZGU+RFRNLk5VTEw8L2NvZGU+LgorICAgKgorICAgKiA8cD4lUkVWSUVXJSBQcmVzdW1hYmx5IElEcyBhcmUgc3RpbGwgc2NvcGVkIHRvIGEgc2luZ2xlIGRvY3VtZW50LAorICAgKiBhbmQgdGhpcyBvcGVyYXRpb24gc2VhcmNoZXMgb25seSB3aXRoaW4gYSBzaW5nbGUgZG9jdW1lbnQsIHJpZ2h0PworICAgKiBXb3VsZG4ndCB3YW50IGNvbGxpc2lvbnMgYmV0d2VlbiBEVE1zIGluIHRoZSBzYW1lIHByb2Nlc3MuPC9wPgorICAgKgorICAgKiBAcGFyYW0gZWxlbWVudElkIFRoZSB1bmlxdWUgPGNvZGU+aWQ8L2NvZGU+IHZhbHVlIGZvciBhbiBlbGVtZW50LgorICAgKiBAcmV0dXJuIFRoZSBoYW5kbGUgb2YgdGhlIG1hdGNoaW5nIGVsZW1lbnQuCisgICAqLworICBwdWJsaWMgaW50IGdldEVsZW1lbnRCeUlkKFN0cmluZyBlbGVtZW50SWQpOworCisgIC8qKgorICAgKiBUaGUgZ2V0VW5wYXJzZWRFbnRpdHlVUkkgZnVuY3Rpb24gcmV0dXJucyB0aGUgVVJJIG9mIHRoZSB1bnBhcnNlZAorICAgKiBlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhlIHNhbWUgZG9jdW1lbnQgYXMgdGhlIGNvbnRleHQKKyAgICogbm9kZSAoc2VlIFszLjMgVW5wYXJzZWQgRW50aXRpZXNdKS4gSXQgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmCisgICAqIHRoZXJlIGlzIG5vIHN1Y2ggZW50aXR5LgorICAgKiA8cD4KKyAgICogWE1MIHByb2Nlc3NvcnMgbWF5IGNob29zZSB0byB1c2UgdGhlIFN5c3RlbSBJZGVudGlmaWVyIChpZiBvbmUKKyAgICogaXMgcHJvdmlkZWQpIHRvIHJlc29sdmUgdGhlIGVudGl0eSwgcmF0aGVyIHRoYW4gdGhlIFVSSSBpbiB0aGUKKyAgICogUHVibGljIElkZW50aWZpZXIuIFRoZSBkZXRhaWxzIGFyZSBkZXBlbmRlbnQgb24gdGhlIHByb2Nlc3NvciwgYW5kCisgICAqIHdlIHdvdWxkIGhhdmUgdG8gc3VwcG9ydCBzb21lIGZvcm0gb2YgcGx1Zy1pbiByZXNvbHZlciB0byBoYW5kbGUKKyAgICogdGhpcyBwcm9wZXJseS4gQ3VycmVudGx5LCB3ZSBzaW1wbHkgcmV0dXJuIHRoZSBTeXN0ZW0gSWRlbnRpZmllciBpZgorICAgKiBwcmVzZW50LCBhbmQgaG9wZSB0aGF0IGl0IGEgdXNhYmxlIFVSSSBvciB0aGF0IG91ciBjYWxsZXIgY2FuCisgICAqIG1hcCBpdCB0byBvbmUuCisgICAqICVSRVZJRVclIFJlc29sdmUgUHVibGljIElkZW50aWZpZXJzLi4uIG9yIGNvbnNpZGVyIGNoYW5naW5nIGZ1bmN0aW9uIG5hbWUuCisgICAqIDxwPgorICAgKiBJZiB3ZSBmaW5kIGEgcmVsYXRpdmUgVVJJCisgICAqIHJlZmVyZW5jZSwgWE1MIGV4cGVjdHMgaXQgdG8gYmUgcmVzb2x2ZWQgaW4gdGVybXMgb2YgdGhlIGJhc2UgVVJJCisgICAqIG9mIHRoZSBkb2N1bWVudC4gVGhlIERPTSBkb2Vzbid0IGRvIHRoYXQgZm9yIHVzLCBhbmQgaXQgaXNuJ3QKKyAgICogZW50aXJlbHkgY2xlYXIgd2hldGhlciB0aGF0IHNob3VsZCBiZSBkb25lIGhlcmU7IGN1cnJlbnRseSB0aGF0J3MKKyAgICogcHVzaGVkIHVwIHRvIGEgaGlnaGVyIGxldmVsIG9mIG91ciBhcHBsaWNhdGlvbi4gKE5vdGUgdGhhdCBET00gTGV2ZWwKKyAgICogMSBkaWRuJ3Qgc3RvcmUgdGhlIGRvY3VtZW50J3MgYmFzZSBVUkkuKQorICAgKiAlUkVWSUVXJSBDb25zaWRlciByZXNvbHZpbmcgUmVsYXRpdmUgVVJJcy4KKyAgICogPHA+CisgICAqIChUaGUgRE9NJ3Mgc3RhdGVtZW50IHRoYXQgIkFuIFhNTCBwcm9jZXNzb3IgbWF5IGNob29zZSB0bworICAgKiBjb21wbGV0ZWx5IGV4cGFuZCBlbnRpdGllcyBiZWZvcmUgdGhlIHN0cnVjdHVyZSBtb2RlbCBpcyBwYXNzZWQKKyAgICogdG8gdGhlIERPTSIgcmVmZXJzIG9ubHkgdG8gcGFyc2VkIGVudGl0aWVzLCBub3QgdW5wYXJzZWQsIGFuZCBoZW5jZQorICAgKiBkb2Vzbid0IGFmZmVjdCB0aGlzIGZ1bmN0aW9uLikKKyAgICoKKyAgICogQHBhcmFtIG5hbWUgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgRW50aXR5IE5hbWUgb2YgdGhlIHVucGFyc2VkCisgICAqIGVudGl0eS4KKyAgICoKKyAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgVVJJIG9mIHRoZSBVbnBhcnNlZCBFbnRpdHksIG9yIGFuCisgICAqIGVtcHR5IHN0cmluZyBpZiBubyBzdWNoIGVudGl0eSBleGlzdHMuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFVucGFyc2VkRW50aXR5VVJJKFN0cmluZyBuYW1lKTsKKworICAvLyA9PT09PT09PT09PT09PSBCb29sZWFuIG1ldGhvZHMgPT09PT09PT09PT09PT09PQorCisgIC8qKgorICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgeHNsOnN0cmlwLXNwYWNlIG9yIHhzbDpwcmVzZXJ2ZS1zcGFjZSB3YXMgcHJvY2Vzc2VkCisgICAqIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgdGhlIGRvY3VtZW50IGNvbnRhaW5lZCBpbiB0aGlzIERUTS4KKyAgICoKKyAgICogTkVFRFNET0MgKCRvYmplY3ROYW1lJCkgQHJldHVybgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNQcmVTdHJpcHBpbmcoKTsKKworICAvKioKKyAgICogRmlndXJlIG91dCB3aGV0aGVyIG5vZGVIYW5kbGUyIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGJlaW5nIGxhdGVyCisgICAqIGluIHRoZSBkb2N1bWVudCB0aGFuIG5vZGVIYW5kbGUxLCBpbiBEb2N1bWVudCBPcmRlciBhcyBkZWZpbmVkCisgICAqIGJ5IHRoZSBYUGF0aCBtb2RlbC4gVGhpcyBtYXkgbm90IGFncmVlIHdpdGggdGhlIG9yZGVyaW5nIGRlZmluZWQKKyAgICogYnkgb3RoZXIgWE1MIGFwcGxpY2F0aW9ucy4KKyAgICogPHA+CisgICAqIFRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIG9yZGVyaW5nIGlzbid0IGRlZmluZWQsIGFuZCBuZWl0aGVyIGFyZQorICAgKiB0aGUgcmVzdWx0cyBvZiB0aGlzIGZ1bmN0aW9uIC0tIHRob3VnaCB3ZSdsbCBnZW5lcmFsbHkgcmV0dXJuIHRydWUuCisgICAqIDxwPgorICAgKiAlUkVWSUVXJSBNYWtlIHN1cmUgdGhpcyBkb2VzIHRoZSByaWdodCB0aGluZyB3aXRoIGF0dHJpYnV0ZSBub2RlcyEhIQorICAgKiA8cD4KKyAgICogJVJFVklFVyUgQ29uc2lkZXIgcmVuYW1pbmcgZm9yIGNsYXJpdHkuIFBlcmhhcHMgaXNEb2N1bWVudE9yZGVyKGEsYik/CisgICAqCisgICAqIEBwYXJhbSBmaXJzdE5vZGVIYW5kbGUgRE9NIE5vZGUgdG8gcGVyZm9ybSBwb3NpdGlvbiBjb21wYXJpc29uIG9uLgorICAgKiBAcGFyYW0gc2Vjb25kTm9kZUhhbmRsZSBET00gTm9kZSB0byBwZXJmb3JtIHBvc2l0aW9uIGNvbXBhcmlzb24gb24uCisgICAqCisgICAqIEByZXR1cm4gZmFsc2UgaWYgc2Vjb25kTm9kZSBjb21lcyBiZWZvcmUgZmlyc3ROb2RlLCBvdGhlcndpc2UgcmV0dXJuIHRydWUuCisgICAqIFlvdSBjYW4gdGhpbmsgb2YgdGhpcyBhcworICAgKiA8Y29kZT4oZmlyc3ROb2RlLmRvY3VtZW50T3JkZXJQb3NpdGlvbiAmbHQ7PSBzZWNvbmROb2RlLmRvY3VtZW50T3JkZXJQb3NpdGlvbik8L2NvZGU+LiAgCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc05vZGVBZnRlcihpbnQgZmlyc3ROb2RlSGFuZGxlLCBpbnQgc2Vjb25kTm9kZUhhbmRsZSk7CisKKyAgLyoqCisgICAqIDIuIFtlbGVtZW50IGNvbnRlbnQgd2hpdGVzcGFjZV0gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhCisgICAqIHRleHQgbm9kZSByZXByZXNlbnRzIHdoaXRlIHNwYWNlIGFwcGVhcmluZyB3aXRoaW4gZWxlbWVudCBjb250ZW50CisgICAqIChzZWUgW1hNTF0sIDIuMTAgIldoaXRlIFNwYWNlIEhhbmRsaW5nIikuICBOb3RlIHRoYXQgdmFsaWRhdGluZworICAgKiBYTUwgcHJvY2Vzc29ycyBhcmUgcmVxdWlyZWQgYnkgWE1MIDEuMCB0byBwcm92aWRlIHRoaXMKKyAgICogaW5mb3JtYXRpb24uLi4gYnV0IHRoYXQgRE9NIExldmVsIDIgZGlkIG5vdCBzdXBwb3J0IGl0LCBzaW5jZSBpdAorICAgKiBkZXBlbmRzIG9uIGtub3dsZWRnZSBvZiB0aGUgRFREIHdoaWNoIERPTTIgY291bGQgbm90IGd1YXJhbnRlZQorICAgKiB3b3VsZCBiZSBhdmFpbGFibGUuCisgICAqIDxwPgorICAgKiBJZiB0aGVyZSBpcyBubyBkZWNsYXJhdGlvbiBmb3IgdGhlIGNvbnRhaW5pbmcgZWxlbWVudCwgYW4gWE1MCisgICAqIHByb2Nlc3NvciBtdXN0IGFzc3VtZSB0aGF0IHRoZSB3aGl0ZXNwYWNlIGNvdWxkIGJlIG1lYW5pbmdmdWwgYW5kCisgICAqIHJldHVybiBmYWxzZS4gSWYgbm8gZGVjbGFyYXRpb24gaGFzIGJlZW4gcmVhZCwgYnV0IHRoZSBbYWxsCisgICAqIGRlY2xhcmF0aW9ucyBwcm9jZXNzZWRdIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbiBpdGVtCisgICAqIGlzIGZhbHNlIChzbyB0aGVyZSBtYXkgYmUgYW4gdW5yZWFkIGRlY2xhcmF0aW9uKSwgdGhlbiB0aGUgdmFsdWUKKyAgICogb2YgdGhpcyBwcm9wZXJ0eSBpcyBpbmRldGVybWluYXRlIGZvciB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIGFuZAorICAgKiBzaG91bGQgcHJvYmFibHkgYmUgcmVwb3J0ZWQgYXMgZmFsc2UuIEl0IGlzIGFsd2F5cyBmYWxzZSBmb3IgdGV4dAorICAgKiBub2RlcyB0aGF0IGNvbnRhaW4gYW55dGhpbmcgb3RoZXIgdGhhbiAob3IgaW4gYWRkaXRpb24gdG8pIHdoaXRlCisgICAqIHNwYWNlLgorICAgKiA8cD4KKyAgICogTm90ZSB0b28gdGhhdCBpdCBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3Igbm9uLVRleHQgbm9kZXMuCisgICAqIDxwPgorICAgKiAlUkVWSUVXJSBKb2Ugd2FudHMgdG8gcmVuYW1lIHRoaXMgaXNXaGl0ZXNwYWNlSW5FbGVtZW50Q29udGVudCgpIGZvciBjbGFyaXR5CisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBub2RlIElELgorICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBub2RlIGRlZmluaXRlbHkgcmVwcmVzZW50cyB3aGl0ZXNwYWNlIGluCisgICAqIGVsZW1lbnQgY29udGVudDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVyRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogICAgMTAuIFthbGwgZGVjbGFyYXRpb25zIHByb2Nlc3NlZF0gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3RyaWN0bHkgc3BlYWtpbmcKKyAgICogICAgICAgIHBhcnQgb2YgdGhlIGluZm9zZXQgb2YgdGhlIGRvY3VtZW50LiBSYXRoZXIgaXQgaXMgYW4gaW5kaWNhdGlvbiBvZgorICAgKiAgICAgICAgd2hldGhlciB0aGUgcHJvY2Vzc29yIGhhcyByZWFkIHRoZSBjb21wbGV0ZSBEVEQuIEl0cyB2YWx1ZSBpcyBhCisgICAqICAgICAgICBib29sZWFuLiBJZiBpdCBpcyBmYWxzZSwgdGhlbiBjZXJ0YWluIHByb3BlcnRpZXMgKGluZGljYXRlZCBpbiB0aGVpcgorICAgKiAgICAgICAgZGVzY3JpcHRpb25zIGJlbG93KSBtYXkgYmUgdW5rbm93bi4gSWYgaXQgaXMgdHJ1ZSwgdGhvc2UgcHJvcGVydGllcworICAgKiAgICAgICAgYXJlIG5ldmVyIHVua25vd24uCisgICAqCisgICAqCisgICAqIEBwYXJhbSB0aGUgZG9jdW1lbnQgaGFuZGxlCisgICAqCisgICAqIEBwYXJhbSBkb2N1bWVudEhhbmRsZSBBIG5vZGUgaGFuZGxlIHRoYXQgbXVzdCBpZGVudGlmeSBhIGRvY3VtZW50LgorICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBkZWNsYXJhdGlvbnMgd2VyZSBwcm9jZXNzZWQ7CisgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzRG9jdW1lbnRBbGxEZWNsYXJhdGlvbnNQcm9jZXNzZWQoaW50IGRvY3VtZW50SGFuZGxlKTsKKworICAvKioKKyAgICogICAgIDUuIFtzcGVjaWZpZWRdIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgd2FzIGFjdHVhbGx5CisgICAqICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIHN0YXJ0LXRhZyBvZiBpdHMgZWxlbWVudCwgb3Igd2FzIGRlZmF1bHRlZCBmcm9tIHRoZQorICAgKiAgICAgICAgRFREIChvciBzY2hlbWEpLgorICAgKgorICAgKiBAcGFyYW0gdGhlIGF0dHJpYnV0ZSBoYW5kbGUKKyAgICoKKyAgICogTkVFRFNET0MgQHBhcmFtIGF0dHJpYnV0ZUhhbmRsZQorICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZDsKKyAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd2FzIGRlZmF1bHRlZCBvciB0aGUgaGFuZGxlIGRvZXNuJ3QKKyAgICogICAgICAgICAgICByZWZlciB0byBhbiBhdHRyaWJ1dGUgbm9kZS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKGludCBhdHRyaWJ1dGVIYW5kbGUpOworCisgIC8vID09PT09PT09PT0gRGlyZWN0IFNBWCBEaXNwYXRjaCwgZm9yIG9wdGltaXphdGlvbiBwdXJwb3NlcyA9PT09PT09PQorCisgIC8qKgorICAgKiBEaXJlY3RseSBjYWxsIHRoZQorICAgKiBjaGFyYWN0ZXJzIG1ldGhvZCBvbiB0aGUgcGFzc2VkIENvbnRlbnRIYW5kbGVyIGZvciB0aGUKKyAgICogc3RyaW5nLXZhbHVlIG9mIHRoZSBnaXZlbiBub2RlIChzZWUgaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjZGF0YS1tb2RlbAorICAgKiBmb3IgdGhlIGRlZmluaXRpb24gb2YgYSBub2RlJ3Mgc3RyaW5nLXZhbHVlKS4gTXVsdGlwbGUgY2FsbHMgdG8gdGhlCisgICAqIENvbnRlbnRIYW5kbGVyJ3MgY2hhcmFjdGVycyBtZXRob2RzIG1heSB3ZWxsIG9jY3VyIGZvciBhIHNpbmdsZSBjYWxsIHRvCisgICAqIHRoaXMgbWV0aG9kLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KKyAgICogQHBhcmFtIGNoIEEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgQ29udGVudEhhbmRsZXIuCisgICAqCisgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBkaXNwYXRjaENoYXJhY3RlcnNFdmVudHMoCisgICAgaW50IG5vZGVIYW5kbGUsIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyIGNoKQorICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogRGlyZWN0bHkgY3JlYXRlIFNBWCBwYXJzZXIgZXZlbnRzIHJlcHJlc2VudGluZyB0aGUgWE1MIGNvbnRlbnQgb2YKKyAgICogYSBEVE0gc3VidHJlZS4gVGhpcyBpcyBhICJzZXJpYWxpemUiIG9wZXJhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgSUQuCisgICAqIEBwYXJhbSBjaCBBIG5vbi1udWxsIHJlZmVyZW5jZSB0byBhIENvbnRlbnRIYW5kbGVyLgorICAgKgorICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIHZvaWQgZGlzcGF0Y2hUb0V2ZW50cyhpbnQgbm9kZUhhbmRsZSwgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgY2gpCisgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKyAgICAKKyAgLyoqCisgICAqIFJldHVybiBhbiBET00gbm9kZSBmb3IgdGhlIGdpdmVuIG5vZGUuCisgICAqIAorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KKyAgICogCisgICAqIEByZXR1cm4gQSBub2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBEVE0gbm9kZS4KKyAgICovCisgICBwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBnZXROb2RlKGludCBub2RlSGFuZGxlKTsKKworICAvLyA9PT09IENvbnN0cnVjdGlvbiBtZXRob2RzIChtYXkgbm90IGJlIHN1cHBvcnRlZCBieSBzb21lIGltcGxlbWVudGF0aW9ucyEpID09PT09CisgIC8vICVSRVZJRVclIFdoYXQgcmVzcG9uc2Ugb2NjdXJzIGlmIG5vdCBzdXBwb3J0ZWQ/CisKKyAgLyoqCisgICAqIEByZXR1cm4gdHJ1ZSBpZmYgd2UncmUgYnVpbGRpbmcgdGhpcyBtb2RlbCBpbmNyZW1lbnRhbGx5IChlZworICAgKiB3ZSdyZSBwYXJ0bmVyZWQgd2l0aCBhIENvcm91dGluZVBhcnNlcikgYW5kIHRodXMgcmVxdWlyZSB0aGF0IHRoZQorICAgKiB0cmFuc2Zvcm1hdGlvbiBhbmQgdGhlIHBhcnNlIHJ1biBzaW11bHRhbmVvdXNseS4gR3VpZGFuY2UgdG8gdGhlCisgICAqIERUTU1hbmFnZXIuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBuZWVkc1R3b1RocmVhZHMoKTsKKworICAvLyAlUkVWSUVXJSBEbyB0aGVzZSBhcHBlbmRzIG1ha2UgYW55IHNlbnNlLCBzaG91bGQgd2Ugc3VwcG9ydCBhCisgIC8vIHdpZGVyIHNldCBvZiBtZXRob2RzIChsaWtlIHRoZSAiYXBwZW5kIiBtZXRob2RzIGluIHRoZQorICAvLyBjdXJyZW50IERUTURvY3VtZW50SW1wbCBkcmFmdCksIG9yIHNob3VsZCB3ZSBqdXN0IHN1cHBvcnQgU0FYCisgIC8vIGxpc3RlbmVyIGludGVyZmFjZXM/ICBTaG91bGQgaXQgYmUgYSBzZXBhcmF0ZSBpbnRlcmZhY2UgdG8KKyAgLy8gbWFrZSB0aGF0IGRpc3RpbmN0aW9uIGV4cGxpY2l0PworCisgIC8qKgorICAgKiBSZXR1cm4gdGhpcyBEVE0ncyBjb250ZW50IGhhbmRsZXIsIGlmIGl0IGhhcyBvbmUuCisgICAqCisgICAqIEByZXR1cm4gbnVsbCBpZiB0aGlzIG1vZGVsIGRvZXNuJ3QgcmVzcG9uZCB0byBTQVggZXZlbnRzLgorICAgKi8KKyAgcHVibGljIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyIGdldENvbnRlbnRIYW5kbGVyKCk7CisKKyAgLyoqCisgICAqIFJldHVybiB0aGlzIERUTSdzIGxleGljYWwgaGFuZGxlciwgaWYgaXQgaGFzIG9uZS4KKyAgICoKKyAgICogJVJFVklFVyUgU2hvdWxkIHRoaXMgcmV0dXJuIG51bGwgaWYgY29uc3RydXRpb24gYWxyZWFkeSBkb25lL2JlZ3VuPworICAgKgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBtb2RlbCBkb2Vzbid0IHJlc3BvbmQgdG8gbGV4aWNhbCBTQVggZXZlbnRzLgorICAgKi8KKyAgcHVibGljIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciBnZXRMZXhpY2FsSGFuZGxlcigpOworCisgIC8qKgorICAgKiBSZXR1cm4gdGhpcyBEVE0ncyBFbnRpdHlSZXNvbHZlciwgaWYgaXQgaGFzIG9uZS4KKyAgICoKKyAgICogQHJldHVybiBudWxsIGlmIHRoaXMgbW9kZWwgZG9lc24ndCByZXNwb25kIHRvIFNBWCBlbnRpdHkgcmVmIGV2ZW50cy4KKyAgICovCisgIHB1YmxpYyBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpOworCisgIC8qKgorICAgKiBSZXR1cm4gdGhpcyBEVE0ncyBEVERIYW5kbGVyLCBpZiBpdCBoYXMgb25lLgorICAgKgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBtb2RlbCBkb2Vzbid0IHJlc3BvbmQgdG8gU0FYIGR0ZCBldmVudHMuCisgICAqLworICBwdWJsaWMgb3JnLnhtbC5zYXguRFRESGFuZGxlciBnZXREVERIYW5kbGVyKCk7CisKKyAgLyoqCisgICAqIFJldHVybiB0aGlzIERUTSdzIEVycm9ySGFuZGxlciwgaWYgaXQgaGFzIG9uZS4KKyAgICoKKyAgICogQHJldHVybiBudWxsIGlmIHRoaXMgbW9kZWwgZG9lc24ndCByZXNwb25kIHRvIFNBWCBlcnJvciBldmVudHMuCisgICAqLworICBwdWJsaWMgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcigpOworCisgIC8qKgorICAgKiBSZXR1cm4gdGhpcyBEVE0ncyBEZWNsSGFuZGxlciwgaWYgaXQgaGFzIG9uZS4KKyAgICoKKyAgICogQHJldHVybiBudWxsIGlmIHRoaXMgbW9kZWwgZG9lc24ndCByZXNwb25kIHRvIFNBWCBEZWNsIGV2ZW50cy4KKyAgICovCisgIHB1YmxpYyBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIgZ2V0RGVjbEhhbmRsZXIoKTsKKworICAvKioKKyAgICogQXBwZW5kIGEgY2hpbGQgdG8gInRoZSBlbmQgb2YgdGhlIGRvY3VtZW50Ii4gUGxlYXNlIG5vdGUgdGhhdAorICAgKiB0aGUgbm9kZSBpcyBhbHdheXMgY2xvbmVkIGluIGEgYmFzZSBEVE0sIHNpbmNlIG91ciBiYXNpYyBiZWhhdmlvcgorICAgKiBpcyBpbW11dGFibGUgc28gbm9kZXMgY2FuJ3QgYmUgcmVtb3ZlZCBmcm9tIHRoZWlyIHByZXZpb3VzCisgICAqIGxvY2F0aW9uLgorICAgKgorICAgKiA8cD4gJVJFVklFVyUgIERUTSBtYWludGFpbnMgYW4gaW5zZXJ0aW9uIGN1cnNvciB3aGljaAorICAgKiBwZXJmb3JtcyBhIGRlcHRoLWZpcnN0IHRyZWUgd2FsayBhcyBub2RlcyBjb21lIGluLCBhbmQgdGhpcyBvcGVyYXRpb24KKyAgICogaXMgcmVhbGx5IGVxdWl2YWxlbnQgdG86CisgICAqICAgIGluc2VydGlvbkN1cnNvci5hcHBlbmRDaGlsZChkb2N1bWVudC5pbXBvcnROb2RlKG5ld0NoaWxkKSkpCisgICAqIHdoZXJlIHRoZSBpbnNlcnQgcG9pbnQgaXMgdGhlIGxhc3QgZWxlbWVudCB0aGF0IHdhcyBhcHBlbmRlZCAob3IKKyAgICogdGhlIGxhc3Qgb25lIHBvcHBlZCBiYWNrIHRvIGJ5IGFuIGVuZC1lbGVtZW50IG9wZXJhdGlvbikuPC9wPgorICAgKgorICAgKiBAcGFyYW0gbmV3Q2hpbGQgTXVzdCBiZSBhIHZhbGlkIG5ldyBub2RlIGhhbmRsZS4KKyAgICogQHBhcmFtIGNsb25lIHRydWUgaWYgdGhlIGNoaWxkIHNob3VsZCBiZSBjbG9uZWQgaW50byB0aGUgZG9jdW1lbnQuCisgICAqIEBwYXJhbSBjbG9uZURlcHRoIGlmIHRoZSBjbG9uZSBhcmd1bWVudCBpcyB0cnVlLCBzcGVjaWZpZXMgdGhhdCB0aGUKKyAgICogICAgICAgICAgICAgICAgICAgY2xvbmUgc2hvdWxkIGluY2x1ZGUgYWxsIGl0J3MgY2hpbGRyZW4uICAKKyAgICovCisgIHB1YmxpYyB2b2lkIGFwcGVuZENoaWxkKGludCBuZXdDaGlsZCwgYm9vbGVhbiBjbG9uZSwgYm9vbGVhbiBjbG9uZURlcHRoKTsKKworICAvKioKKyAgICogQXBwZW5kIGEgdGV4dCBub2RlIGNoaWxkIHRoYXQgd2lsbCBiZSBjb25zdHJ1Y3RlZCBmcm9tIGEgc3RyaW5nLAorICAgKiB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gQmVoYXZpb3IgaXMgb3RoZXJ3aXNlIGxpa2UgYXBwZW5kQ2hpbGQoKS4KKyAgICoKKyAgICogQHBhcmFtIHN0ciBOb24tbnVsbCByZWZlcmVuY2UgdG8gYSBzdHJpbmcuCisgICAqLworICBwdWJsaWMgdm9pZCBhcHBlbmRUZXh0Q2hpbGQoU3RyaW5nIHN0cik7Cit9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTUJ1aWxkZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNTczYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDQ3NiBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiWGVyY2VzIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0CisgKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgSW50ZXJuYXRpb25hbAorICogQnVzaW5lc3MgTWFjaGluZXMsIEluYy4sIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCisvL3BhY2thZ2Ugb3JnLmFwYWNoZS54ZXJjZXMucGFyc2VyczsKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuZHRtOworCitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uQ29yb3V0aW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5GYXN0U3RyaW5nQnVmZmVyOworCisKKy8qKiA8cD5EVE1CdWlsZGVyIGlzIGEgZ2x1ZSBsYXllciB3aGljaCBhY2NlcHRzIGlucHV0IGZyb20gdGhlCisgKiBDb3JvdXRpbmVQYXJzZXIgYW5kIGlzc3VlcyBjYWxscyB0byBjb25zdHJ1Y3QgRFRNIG5vZGVzLjwvcD4KKyAqCisgKiA8cD5XZSdyZSBub3QgcmVhbGx5IGRlbGlnaHRlZCB3aXRoIHRoaXM7IGl0J3MgYW4gZXh0cmEgbGF5ZXIgb2YKKyAqIGNhbGwtYW5kLXJldHVybiBwZXIgbm9kZSBjcmVhdGVkLiBBIGJldHRlciBhcHByb2FjaCwgc2luY2UgdGhpcyBpcworICogc28gc3BlY2lmaWMgdG8gRFRNLCBtaWdodCBiZSB0byBnaXZlIGl0IGRpcmVjdCAoImZyaWVuZCIpIGFjY2VzcyB0bworICogRFRNJ3Mgc3RvcmFnZS4uLiBvciB0byBmb2xkIGl0IGRpcmVjdGx5IGludG8gdGhlIERUTSBjbGFzcy4gV2UndmUKKyAqIGJyb2tlbiBpdCBvdXQgcHJpbWFyaWx5IHRvIGFsbG93IHBhcmFsbGVsIGRldmVsb3BtZW50IG9mIHRoZQorICogYnVpbGRlciBhbmQgdGhlIERUTSBtb2RlbC4gKE9yLCBpbiBmYWN0LCB0byBtYWtlIGl0IGEgc3ViY2xhc3MKKyAqIG9mIENvcm91dGluZVBhcnNlciB0byBhdm9pZCBfdGhhdF8gbGF5ZXIgb2YgY2FsbC1hbmQtcmV0dXJuLi4uIHRob3VnaAorICogSSB0aGluayB0YWlsLWNhbGwgb3B0aW1pemF0aW9uIHdpbGwgaGVscCB1cyBpbiB0aGF0IGNhc2UuPC9wPgorICoKKyAqIDxwPkluIGl0cyBjdXJyZW50IGZvcm0sIHRoaXMgaXMgYmFzaWNhbGx5IGEgU0FYLXRvLURUTSBjYWxsIGFkYXB0ZXIuCisgKiBTQVggZXZlbnRzIGNvbWluZyBpbiBhcmUgcmVzdHJ1Y3R1cmVkIC0tIHByaW1hcmlseSBieSBoYXZpbmcgdGhlaXIgc3RyaW5ncworICogYW5kIHRleHQgY29udGVudCBjb3BpZWQgaW50byBhcHByb3ByaWF0ZSBzdG9yYWdlIGFuZCByZS1leHByZXNzZWQgYXMKKyAqIGluZGV4IG51bWJlcnMuIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHNvbWUgbmVnb3RpYXRpb24gYmV0d2VlbiB0aGUgRFRNCisgKiBhbmQgdGhlIGJ1aWxkZXIgdG8gYWdyZWUgb24gd2hpY2ggc3RyaW5nIHBvb2xzIHRoaXMgY29udGVudCB3aWxsIGJlIHBsYWNlZAorICogaW50by48L3A+CisgKgorICogPHA+V2UgYWxzbyByZXN0cnVjdHVyZSB0aGUgY2FsbCBzZXF1ZW5jZSBzb21ld2hhdCwgYnkgbWVyZ2luZworICogc3VjY2Vzc2l2ZSBjaGFyYWN0ZXJzKCkgY2FsbHMgaW50byBhIHNpbmdsZSB0ZXh0LW5vZGUgY3JlYXRpb24sIGFuZAorICogYnkgYnJlYWtpbmcgdGhlIGF0dHJpYnV0ZXMgb3V0IG9mIHRoZSBTQVggY3JlYXRlRXZlbnQgY2FsbCBhbmQgZ2VuZXJhdGluZworICogY3JlYXRlLWF0dHJpYnV0ZSAoYW5kIGNyZWF0ZS1uYW1lc3BhY2UtZGVjbGFyYXRpb24pIGNhbGxzLjwvcD4KKyAqCisgKiA8cD5TdGF0dXM6IE1PU1RMWSBERUFEIENPREUgLS0gTWVyZ2VkIGludG8gRFRNIGltcGxlbWVudGF0aW9uczsgdGhpcworICogY2xhc3MgaXMgYmVpbmcgcmV0YWluZWQganVzdCBmb3IgcmVmZXJlbmNlIGFuZCBjYW4gcHJvYmFibHkgYmUgZGlzY2FyZGVkCisgKiBzb21lIHRpbWUgc29vbiAtLSBDaGVjayB3aXRoIEpvZS48L3A+CisgKiAqLworcHVibGljIGNsYXNzIERUTUJ1aWxkZXIKK2ltcGxlbWVudHMgQ29udGVudEhhbmRsZXIsIExleGljYWxIYW5kbGVyCit7CisKKyAgLy8KKyAgLy8gRGF0YQorICAvLworCisgIC8qKiBEb2N1bWVudCBiZWluZyBidWlsdC4KKyAgICoKKyAgICogPHA+JVRCRCUgVGhlIERUTSBBUEkgZG9lc24ndCBjdXJyZW50bHkgaGF2ZSBjb25zdHJ1Y3Rpb24gY2FsbHMsCisgICAqIHNvIHRoaXMgaXMgZXhwbGljaXRseSBkZWZpbmVkIGFzIGEgRFRNRG9jdW1lbnRJbXBsLiBUaGF0IG5lZWRzIHRvCisgICAqIGJlIGZpeGVkLjwvcD4KKyAgICogKi8KKyAgcHJpdmF0ZSBEVE1Eb2N1bWVudEltcGwgbV9kdG07CisKKyAgcHJpdmF0ZSBDb3JvdXRpbmVNYW5hZ2VyIGZDb3JvdXRpbmVNYW5hZ2VyID0gbnVsbDsKKyAgcHJpdmF0ZSBpbnQgZkFwcENvcm91dGluZSA9IC0xOworICBwcml2YXRlIGludCBmUGFyc2VyQ29yb3V0aW5lID0gLTE7CisKKyAgcHJpdmF0ZSBDb3JvdXRpbmVQYXJzZXIgY29fcGFyc2VyOworCisgIC8vIFNjb3R0IHN1Z2dlc3RzIHNoYXJpbmcgcG9vbHMgYmV0d2VlbiBEVE1zLiBOb3RlIHRoYXQgdGhpcyB3aWxsIHJlcXVpcmUKKyAgLy8gdGhyZWFkc2FmZXR5IGF0IHRoZSBwb29sIGxldmVsLgorICBwcml2YXRlIHN0YXRpYyBEVE1TdHJpbmdQb29sIGNvbW1vbkxvY2FsTmFtZXM9bmV3IERUTVNhZmVTdHJpbmdQb29sKCk7CisgIHByaXZhdGUgc3RhdGljIERUTVN0cmluZ1Bvb2wgY29tbW9uTmFtZXNwYWNlTmFtZXM9bmV3IERUTVNhZmVTdHJpbmdQb29sKCk7CisgIHByaXZhdGUgc3RhdGljIERUTVN0cmluZ1Bvb2wgY29tbW9uUHJlZml4ZXM9bmV3IERUTVNhZmVTdHJpbmdQb29sKCk7CisKKyAgcHJpdmF0ZSBEVE1TdHJpbmdQb29sIGxvY2FsTmFtZXM7IC8vIEZvciB0aGlzIERUTSwgbWF5IGJlIGNvbW1vbgorICBwcml2YXRlIERUTVN0cmluZ1Bvb2wgbmFtZXNwYWNlTmFtZXM7IC8vIEZvciB0aGlzIERUTSwgbWF5IGJlIGNvbW1vbgorICBwcml2YXRlIERUTVN0cmluZ1Bvb2wgcHJlZml4ZXM7IAorICBwcml2YXRlIEZhc3RTdHJpbmdCdWZmZXIgY29udGVudDsgLy8gVW5pcXVlIHBlciBEVE0KKyAgaW50IGNvbnRlbnRTdGFydD0wOworCisgIC8vICVUQkQlIFRoZSB3aG9sZSBzdGFydHVwIHNlcXVlbmNlIGhhcyB0byBiZSByZXNvbHZlZCAtLQorICAvLyBIb3cgbXVjaCBpcyBwYXNzZWQgYnVpbGRlci10by1EVE0gYW5kIGhvdyBtdWNoIHRoZSBvdGhlciB3YXk/CisgIC8vIFdobyBkZWNpZGVzIHdoZXRoZXIgd2UncmUgc2hhcmluZyBzdHJpbmcgcG9vbHMgb3IgY3JlYXRpbmcgbmV3IG9uZXM/CisgIC8vIFdoZW4gZG8gd2UgaG9vayB1cCB0byB0aGUgY29yb3V0aW5lIHBhcnNlciBzeXN0ZW0/CisKKyAgLy8KKyAgLy8gQ29uc3RydWN0b3JzCisgIC8vCisKKyAgLyoKKyAgICogQHBhcmFtIGR0bSBEVE0gb2JqZWN0IHRvIGJlIHdyaXR0ZW4gaW50bworICAgKiA8cD4lVEJEJSBUaGUgRFRNIEFQSSBkb2Vzbid0IGN1cnJlbnRseSBoYXZlIGNvbnN0cnVjdGlvbiBjYWxscywKKyAgICogc28gdGhpcyBpcyBleHBsaWNpdGx5IGRlZmluZWQgYXMgYSBEVE1Eb2N1bWVudEltcGwuIFRoYXQgbmVlZHMgdG8KKyAgICogYmUgZml4ZWQuPC9wPgorICAgKiBAcGFyYW0gc291cmNlIFNBWCBJbnB1dFNvdXJjZSB0byByZWFkIHRoZSBYTUwgZG9jdW1lbnQgZnJvbS4KKyAgICogQHBhcmFtIHBhcnNlciBTQVggWE1MUmVhZGVyIHRvIGJlIHVzZWQgdG8gcGFyc2Ugc291cmNlIGludG8gZHRtCisgICAqICovCisgIHB1YmxpYyBEVE1CdWlsZGVyKERUTURvY3VtZW50SW1wbCBkdG0sIElucHV0U291cmNlIHNvdXJjZSwgb3JnLnhtbC5zYXguWE1MUmVhZGVyIHBhcnNlcikKKyAgeworICAgIG1fZHRtPWR0bTsKKyAgICAKKyAgICAvLyBTdGFydCB3aXRoIHBlcnNpc3RhbnQgc2hhcmVkIHBvb2xzIHVubGVzcyB0aGUgRFRNIGV4cHJlc3NlcworICAgIC8vIG90aGVyIHByZWZlcmVuY2VzCisgICAgbG9jYWxOYW1lcz1tX2R0bS5nZXRMb2NhbE5hbWVUYWJsZSgpOworICAgIGlmKGxvY2FsTmFtZXM9PW51bGwpCisgICAgICBtX2R0bS5zZXRMb2NhbE5hbWVUYWJsZShsb2NhbE5hbWVzPWNvbW1vbkxvY2FsTmFtZXMpOworCisgICAgbmFtZXNwYWNlTmFtZXM9bV9kdG0uZ2V0TnNOYW1lVGFibGUoKTsKKyAgICBpZihuYW1lc3BhY2VOYW1lcz09bnVsbCkKKyAgICAgIG1fZHRtLnNldE5zTmFtZVRhYmxlKG5hbWVzcGFjZU5hbWVzPWNvbW1vbk5hbWVzcGFjZU5hbWVzKTsKKworICAgIHByZWZpeGVzPW1fZHRtLmdldFByZWZpeE5hbWVUYWJsZSgpOworICAgIGlmKHByZWZpeGVzPT1udWxsKQorICAgICAgbV9kdG0uc2V0UHJlZml4TmFtZVRhYmxlKHByZWZpeGVzPWNvbW1vblByZWZpeGVzKTsKKworICAgIC8vIFVubGlrZSB0aGUgb3RoZXIgc3RyaW5ncywgd2hpY2ggbWF5IGJlIHNoYXJlZCBhbmQgdGh1cyBzaG91bGQgYmUKKyAgICAvLyByZXNldCBlbHNld2hlcmUgKGlmIGF0IGFsbCksIGNvbnRlbnQgc3RhcnRzIGVtcHR5IGVhY2ggdGltZSB3ZSBwYXJzZS4KKyAgICBjb250ZW50PW1fZHRtLmdldENvbnRlbnRCdWZmZXIoKTsKKyAgICBpZihjb250ZW50PT1udWxsKQorICAgICAgbV9kdG0uc2V0Q29udGVudEJ1ZmZlcihjb250ZW50PW5ldyBGYXN0U3RyaW5nQnVmZmVyKCkpOworICAgIGVsc2UKKyAgICAgIGNvbnRlbnQucmVzZXQoKTsKKyAgICBjb250ZW50U3RhcnQ9MDsKKworICAgIC8vIEVzdGFibGlzaCBpbmNyZW1lbnRhbCBwYXJzaW5nIGhvb2t1cHMKKyAgICBmQ29yb3V0aW5lTWFuYWdlcj1uZXcgQ29yb3V0aW5lTWFuYWdlcigpOworICAgIGZBcHBDb3JvdXRpbmUgPSBmQ29yb3V0aW5lTWFuYWdlci5jb19qb2luQ29yb3V0aW5lU2V0KC0xKTsKKyAgICAvLyAlVEJEJSBwYXJzZXIgc2hvdWxkIGJlIHBhc3NlZCBpbiBzbyB3ZSBjYW4gcGx1ZyBpbiB0aGUKKyAgICAvLyBYYWxhbiB2ZXJzaW9uIG9mIG90aGVyIHNwZWNpZmljIGluc3RhbmNlcy4KKyAgICBjb19wYXJzZXI9bmV3IENvcm91dGluZVNBWFBhcnNlcihmQ29yb3V0aW5lTWFuYWdlcixmQXBwQ29yb3V0aW5lLHBhcnNlcik7CisgICAgZlBhcnNlckNvcm91dGluZT1jb19wYXJzZXIuZ2V0UGFyc2VyQ29yb3V0aW5lSUQoKTsKKyAgICBjb19wYXJzZXIuc2V0Q29udGVudEhhbmRsZXIodGhpcyk7CisgICAgY29fcGFyc2VyLnNldExleEhhbmRsZXIodGhpcyk7IC8vIE5lZWRlZCBmb3IgY29tbWVudHMsIEkgdGhpbmsuCisgICAgCisgICAgLy8gJVRCRCUgTUFKT1IgQ09OQ0VSTjogQXJlIHdlIHN1cmUgd2UnbGwgaGF2ZSByZWFjaGVkIHRoZQorICAgIC8vIHN0YXJ0dXAgcG9pbnQgYmVmb3JlIHdlIHN0YXJ0IHRoZSBjYWxsPyBDSEVDSyBUSElTIQorCisgICAgLy8gQmVnaW4gaW5jcmVtZW50YWwgcGFyc2luZworICAgIC8vIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgcmV0dXJuIHVudGlsIHRoZSBmaXJzdCBjaHVuayBvZiBwYXJzaW5nCisgICAgLy8gaGFzIGJlZW4gY29tcGxldGVkIGFuZCB0aGUgcGFyc2VyIGNvcm91dGluZSB5aWVsZHMuCisgICAgdHJ5CisgICAgICB7CisJZkNvcm91dGluZU1hbmFnZXIuY29fcmVzdW1lKHNvdXJjZSxmQXBwQ29yb3V0aW5lLGZQYXJzZXJDb3JvdXRpbmUpOworICAgICAgfQorICAgIGNhdGNoKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQorICAgICAgeworCS8vIFNob3VsZG4ndCBoYXBwZW4gdW5sZXNzIHdlJ3ZlIG1pc2NvZGVkIG91ciBjb3JvdXRpbmUgbG9naWMKKwkvLyAiU2h1dCBkb3duIHRoZSBnYXJiYWdlIHNtYXNoZXJzIG9uIHRoZSBkZXRlbnRpb24gbGV2ZWwhIgorCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworCWZDb3JvdXRpbmVNYW5hZ2VyLmNvX2V4aXQoZkFwcENvcm91dGluZSk7CisgICAgICB9CisgIH0KKyAgCisgIC8vCisgIC8vIFB1YmxpYyBtZXRob2RzCisgIC8vCisgIAorICAvLyBTdHJpbmcgYWNjdW11bGF0b3Igc3VwcG9ydAorICBwcml2YXRlIHZvaWQgcHJvY2Vzc0FjY3VtdWxhdGVkVGV4dCgpCisgIHsKKyAgICBpbnQgbGVuPWNvbnRlbnQubGVuZ3RoKCk7CisgICAgaWYobGVuIT1jb250ZW50U3RhcnQpCisgICAgICB7CisJLy8gVGhlIEZhc3RTdHJpbmdCdWZmZXIgaGFzIGJlZW4gcHJldmlvdXNseSBhZ3JlZWQgdXBvbgorCW1fZHRtLmFwcGVuZFRleHRDaGlsZChjb250ZW50U3RhcnQsbGVuLWNvbnRlbnRTdGFydCk7CisJY29udGVudFN0YXJ0PWxlbjsKKyAgICAgIH0KKyAgfQorCisgIC8vCisgIC8vIENvbnRlbnRIYW5kbGVyIG1ldGhvZHMKKyAgLy8gQWNjZXB0IFNBWCBldmVudHMsIHJlZm9ybWF0IGFzIERUTSBjb25zdHJ1Y3Rpb24gY2FsbHMKKyAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICAvLyBBY3R1YWxseSBjcmVhdGluZyB0aGUgdGV4dCBub2RlIGlzIGhhbmRsZWQgYnkKKyAgICAvLyBwcm9jZXNzQWNjdW11bGF0ZWRUZXh0KCk7IGhlcmUgd2UganVzdCBhY2N1bXVsYXRlIHRoZQorICAgIC8vIGNoYXJhY3RlcnMgaW50byB0aGUgYnVmZmVyLgorICAgIGNvbnRlbnQuYXBwZW5kKGNoLHN0YXJ0LGxlbmd0aCk7CisgIH0KKyAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICAvLyBNYXkgbmVlZCB0byB0ZWxsIHRoZSBsb3ctbGV2ZWwgYnVpbGRlciBjb2RlIHRvIHBvcCB1cCBhIGxldmVsLgorICAgIC8vIFRoZXJlIF9zaG91bGQndF8gYmUgYW55IHNpZ25pZmljYW50IHBlbmRpbmcgdGV4dCBhdCB0aGlzIHBvaW50LgorICAgIG1fZHRtLmFwcGVuZEVuZERvY3VtZW50KCk7CisgIH0KKyAgcHVibGljIHZvaWQgZW5kRWxlbWVudChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSwgamF2YS5sYW5nLlN0cmluZyBsb2NhbE5hbWUsCisgICAgICBqYXZhLmxhbmcuU3RyaW5nIHFOYW1lKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICBwcm9jZXNzQWNjdW11bGF0ZWRUZXh0KCk7CisgICAgLy8gTm8gYXJncyBidXQgd2UgZG8gbmVlZCB0byB0ZWxsIHRoZSBsb3ctbGV2ZWwgYnVpbGRlciBjb2RlIHRvCisgICAgLy8gcG9wIHVwIGEgbGV2ZWwuCisgICAgbV9kdG0uYXBwZW5kRW5kRWxlbWVudCgpOworICB9CisgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIC8vIE5vLW9wCisgIH0KKyAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZShjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgLy8gJVRCRCUgSSBiZWxpZXZlIGlnbm9yYWJsZSB0ZXh0IGlzbid0IHBhcnQgb2YgdGhlIERUTSBtb2RlbC4uLj8KKyAgfQorICBwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oamF2YS5sYW5nLlN0cmluZyB0YXJnZXQsIGphdmEubGFuZy5TdHJpbmcgZGF0YSkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgcHJvY2Vzc0FjY3VtdWxhdGVkVGV4dCgpOworICAgIC8vICVUQkQlIFdoaWNoIHBvb2xzIGRvIHRhcmdldCBhbmQgZGF0YSBnbyBpbnRvPworICB9CisgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIAorICB7CisgICAgLy8gTm8tb3AgZm9yIERUTQorICB9CisgIHB1YmxpYyB2b2lkIHNraXBwZWRFbnRpdHkoamF2YS5sYW5nLlN0cmluZyBuYW1lKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICBwcm9jZXNzQWNjdW11bGF0ZWRUZXh0KCk7CisgICAgLy8lVEJEJQorICB9CisgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICAvLyBOby1vcCBmb3IgRFRNPworICAgIC8vbV9kdG0uc3RhcnREb2N1bWVudCgpOworICB9CisgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSwgamF2YS5sYW5nLlN0cmluZyBsb2NhbE5hbWUsCisgICAgICBqYXZhLmxhbmcuU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIHByb2Nlc3NBY2N1bXVsYXRlZFRleHQoKTsKKworICAgIC8vICVUQkQlIFNwbGl0IHByZWZpeCBvZmYgcW5hbWUKKyAgICBTdHJpbmcgcHJlZml4PW51bGw7CisgICAgaW50IGNvbG9uPXFOYW1lLmluZGV4T2YoJzonKTsKKyAgICBpZihjb2xvbj4wKQorICAgICAgcHJlZml4PXFOYW1lLnN1YnN0cmluZygwLGNvbG9uKTsKKworICAgIC8vICVUQkQlIFdoZXJlIGRvIHdlIHBvb2wgZXhwYW5kZWROYW1lLCBvciBpcyBpdCBqdXN0IHRoZSB1bmlvbiwgb3IuLi4KKyAgICBtX2R0bS5hcHBlbmRTdGFydEVsZW1lbnQobmFtZXNwYWNlTmFtZXMuc3RyaW5nVG9JbmRleChuYW1lc3BhY2VVUkkpLAorCQkgICAgIGxvY2FsTmFtZXMuc3RyaW5nVG9JbmRleChsb2NhbE5hbWUpLAorCQkgICAgIHByZWZpeGVzLnN0cmluZ1RvSW5kZXgocHJlZml4KSk7IC8vLy8vLy8gJVRCRCUKKworICAgIC8vICVUQkQlIEknbSBhc3N1bWluZyB0aGF0IERUTSB3aWxsIHJlcXVpcmUgcmVzZXF1ZW5jaW5nIG9mCisgICAgLy8gTlMgZGVjbHMgYmVmb3JlIG90aGVyIGF0dHJzLCBoZW5jZSB0d28gcGFzc2VzIGFyZSB0YWtlbi4KKyAgICAvLyAlVEJEJSBJcyB0aGVyZSBhbiBlYXNpZXIgd2F5IHRvIHRlc3QgZm9yIE5TRGVjbD8KKyAgICBpbnQgbkF0dHM9YXR0cy5nZXRMZW5ndGgoKTsKKyAgICAvLyAlVEJEJSBDb3VudGRvd24gaXMgbW9yZSBlZmZpY2llbnQgaWYgbm9ib2R5IGNhcmVzIGFib3V0IHNlcXVlbmNlLgorICAgIGZvcihpbnQgaT1uQXR0cy0xO2k+PTA7LS1pKQkKKyAgICAgIHsKKwlxTmFtZT1hdHRzLmdldFFOYW1lKGkpOworCWlmKHFOYW1lLnN0YXJ0c1dpdGgoInhtbG5zOiIpIHx8ICJ4bWxucyIuZXF1YWxzKHFOYW1lKSkKKwkgIHsKKwkgICAgcHJlZml4PW51bGw7CisJICAgIGNvbG9uPXFOYW1lLmluZGV4T2YoJzonKTsKKwkgICAgaWYoY29sb24+MCkKKwkgICAgICB7CisJCXByZWZpeD1xTmFtZS5zdWJzdHJpbmcoMCxjb2xvbik7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlwcmVmaXg9IiI7IC8vIERlZmF1bHQgcHJlZml4CisJICAgICAgfQorCSAgICAKKworCSAgICBtX2R0bS5hcHBlbmROU0RlY2xhcmF0aW9uKAorCQkJCSAgICBwcmVmaXhlcy5zdHJpbmdUb0luZGV4KHByZWZpeCksCisJCQkJICAgIG5hbWVzcGFjZU5hbWVzLnN0cmluZ1RvSW5kZXgoYXR0cy5nZXRWYWx1ZShpKSksCisJCQkJICAgIGF0dHMuZ2V0VHlwZShpKS5lcXVhbHNJZ25vcmVDYXNlKCJJRCIpKTsKKwkgIH0KKyAgICAgIH0KKyAgICAKKyAgICBmb3IoaW50IGk9bkF0dHMtMTtpPj0wOy0taSkJCisgICAgICB7CisJcU5hbWU9YXR0cy5nZXRRTmFtZShpKTsKKwlpZihxTmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSB8fCAieG1sbnMiLmVxdWFscyhxTmFtZSkpCisJICB7CisJICAgIC8vICVUQkQlIEkgaGF0ZSBoYXZpbmcgdG8gZXh0cmFjdCB0aGUgcHJlZml4IGludG8gYSBuZXcKKwkgICAgLy8gc3RyaW5nIHdoZW4gd2UgbWF5IG5ldmVyIHVzZSBpdC4gQ29uc2lkZXIgcG9vbGluZyB3aG9sZQorCSAgICAvLyBxTmFtZXMsIHdoaWNoIGFyZSBhbHJlYWR5IHN0cmluZ3M/CisJICAgIHByZWZpeD1udWxsOworCSAgICBjb2xvbj1xTmFtZS5pbmRleE9mKCc6Jyk7CisJICAgIGlmKGNvbG9uPjApCisJICAgICAgeworCQlwcmVmaXg9cU5hbWUuc3Vic3RyaW5nKDAsY29sb24pOworCQlsb2NhbE5hbWU9cU5hbWUuc3Vic3RyaW5nKGNvbG9uKzEpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJcHJlZml4PSIiOyAvLyBEZWZhdWx0IHByZWZpeAorCQlsb2NhbE5hbWU9cU5hbWU7CisJICAgICAgfQorCSAgICAKKwkgICAgCisJICAgIGNvbnRlbnQuYXBwZW5kKGF0dHMuZ2V0VmFsdWUoaSkpOyAvLyBTaW5nbGUtc3RyaW5nIHZhbHVlCisJICAgIGludCBjb250ZW50RW5kPWNvbnRlbnQubGVuZ3RoKCk7CisJICAgIAorCSAgICBpZighKCJ4bWxucyIuZXF1YWxzKHByZWZpeCkgfHwgInhtbG5zIi5lcXVhbHMocU5hbWUpKSkKKwkgICAgICBtX2R0bS5hcHBlbmRBdHRyaWJ1dGUobmFtZXNwYWNlTmFtZXMuc3RyaW5nVG9JbmRleChhdHRzLmdldFVSSShpKSksCisJCQkJICBsb2NhbE5hbWVzLnN0cmluZ1RvSW5kZXgobG9jYWxOYW1lKSwKKwkJCQkgIHByZWZpeGVzLnN0cmluZ1RvSW5kZXgocHJlZml4KSwKKwkJCQkgIGF0dHMuZ2V0VHlwZShpKS5lcXVhbHNJZ25vcmVDYXNlKCJJRCIpLAorCQkJCSAgY29udGVudFN0YXJ0LCBjb250ZW50RW5kLWNvbnRlbnRTdGFydCk7CisJICAgIGNvbnRlbnRTdGFydD1jb250ZW50RW5kOworCSAgfQorICAgICAgfQorICB9CisgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCwgamF2YS5sYW5nLlN0cmluZyB1cmkpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIC8vIE5vLW9wIGluIERUTSwgaGFuZGxlZCBkdXJpbmcgZWxlbWVudC9hdHRyIHByb2Nlc3Npbmc/CisgIH0KKworICAvLworICAvLyBMZXhpY2FsSGFuZGxlciBzdXBwb3J0LiBOb3QgYWxsIFNBWDIgcGFyc2VycyBzdXBwb3J0IHRoZXNlIGV2ZW50cworICAvLyBidXQgd2UgbWF5IHdhbnQgdG8gcGFzcyB0aGVtIHRocm91Z2ggd2hlbiB0aGV5IGV4aXN0Li4uCisgIC8vCisgIHB1YmxpYyB2b2lkIGNvbW1lbnQoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIHByb2Nlc3NBY2N1bXVsYXRlZFRleHQoKTsKKworICAgIGNvbnRlbnQuYXBwZW5kKGNoLHN0YXJ0LGxlbmd0aCk7IC8vIFNpbmdsZS1zdHJpbmcgdmFsdWUKKyAgICBtX2R0bS5hcHBlbmRDb21tZW50KGNvbnRlbnRTdGFydCxsZW5ndGgpOworICAgIGNvbnRlbnRTdGFydCs9bGVuZ3RoOyAgICAKKyAgfQorICBwdWJsaWMgdm9pZCBlbmRDREFUQSgpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIC8vIE5vLW9wIGluIERUTQorICB9CisgIHB1YmxpYyB2b2lkIGVuZERURCgpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIC8vIE5vLW9wIGluIERUTQorICB9CisgIHB1YmxpYyB2b2lkIGVuZEVudGl0eShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIC8vIE5vLW9wIGluIERUTQorICB9CisgIHB1YmxpYyB2b2lkIHN0YXJ0Q0RBVEEoKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICAvLyBOby1vcCBpbiBEVE0KKyAgfQorICBwdWJsaWMgdm9pZCBzdGFydERURChqYXZhLmxhbmcuU3RyaW5nIG5hbWUsIGphdmEubGFuZy5TdHJpbmcgcHVibGljSWQsCisgICAgICBqYXZhLmxhbmcuU3RyaW5nIHN5c3RlbUlkKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICAvLyBOby1vcCBpbiBEVE0KKyAgfQorICBwdWJsaWMgdm9pZCBzdGFydEVudGl0eShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIC8vIE5vLW9wIGluIERUTQorICB9CisKKyAgLy8KKyAgLy8gY29yb3V0aW5lIHN1cHBvcnQKKyAgLy8KKworICBwdWJsaWMgaW50IGdldEFwcENvcm91dGluZSgpIHsKKyAgICByZXR1cm4gZkFwcENvcm91dGluZTsKKyAgfQorICAKKyAgLyoqCisgICAqIGdldE1vcmVOb2RlcygpIHRlbGxzIHRoZSBjb3JvdXRpbmUgcGFyc2VyIHRoYXQgd2UgbmVlZCBtb3JlIG5vZGVzLgorICAgKgorICAgKiBQYXJhbWV0ZXIgbWF5IGJlOgorICAgKgorICAgKiAgICAgIG51bGwgICAgICAgICAgICB0ZXJtaW5hdGUgdGhlIHBhcnNlciBjb3JvdXRpbmUuCisgICAqCisgICAqICAgICAgQm9vbGVhbi5UUlVFICAgIGluZGljYXRpb24gdG8gY29udGludWUgcGFyc2luZyB0aGUgY3VycmVudCBkb2N1bWVudC4KKyAgICoJCQkgIFJlc3VtZXMgbm9ybWFsIFNBWCBwYXJzaW5nLgorICAgKgorICAgKiAgICAgIEJvb2xlYW4uRkFMU0UgICBpbmRpY2F0aW9uIHRvIGRpc2NvbnRpbnVlIHBhcnNpbmcgYW5kIHJlc2V0LgorICAgKgkJCSAgVGhyb3dzIFVzZXJSZXF1ZXN0ZWRTdG9wRXhjZXB0aW9uCisgICAqCQkJICB0byByZXR1cm4gY29udHJvbCB0byB0aGUgcnVuKCkgbG9vcC4KKyAgICoKKyAgICogV2Ugd2lsbCBiZSByZXN1bWVkIHdpdGggCisgICAqICAgY29fcmVzdW1lKEJvb2xlYW4uVFJVRSwgLi4uKSBvbiBzdWNjZXNzIHdpdGggbW9yZSByZW1haW5pbmcgdG8gcGFyc2UuCisgICAqICAgY29fcmVzdW1lKEJvb2xlYW4uRkFMU0UsIC4uLikgb24gc3VjY2VzcyBhZnRlciBlbmREb2N1bWVudC4KKyAgICovCisgIHByaXZhdGUgYm9vbGVhbiBjb195aWVsZChib29sZWFuIGdldG1vcmUsIGJvb2xlYW4gc2h1dGRvd24pCisgIHsKKyAgICBPYmplY3QgYXJnPW51bGw7CisgICAgaWYoIXNodXRkb3duKQorICAgICAgYXJnPSBnZXRtb3JlID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICB0cnkKKyAgICAgIHsKKwlhcmcgPSBmQ29yb3V0aW5lTWFuYWdlci5jb19yZXN1bWUoYXJnLGZBcHBDb3JvdXRpbmUsZlBhcnNlckNvcm91dGluZSk7CisJaWYgKGFyZyBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKwkgIHJldHVybiAoKEJvb2xlYW4pYXJnKS5ib29sZWFuVmFsdWUoKTsKKwkgIH0KKworCWVsc2UgLy8gVW5leHBlY3RlZCEKKwkgIHsKKwkgICAgU3lzdGVtLmVyci5wcmludGxuKAorCQkgICJBY3RpdmUgQ29yb3V0aW5lU0FYUGFyc2VyOiB1bmV4cGVjdGVkIHJlc3VtZSBwYXJhbWV0ZXIsICIKKwkJICArYXJnLmdldENsYXNzCisJCSAgKCkrIiB3aXRoIHZhbHVlPVwiIithcmcrJyInKTsKKwkgICAgU3lzdGVtLmVyci5wcmludGxuKCJcdFN0b3BwaW5nIHBhcnNlciByYXRoZXIgdGhhbiByaXNrIGRlYWRsb2NrIik7CisJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3JvdXRpbmUgcGFyYW1ldGVyIGVycm9yICgiK2FyZysnKScpOworCSAgfQorICAgICAgfQorICAgIGNhdGNoKGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKKyAgICAgIHsKKwkvLyBTaG91bGRuJ3QgaGFwcGVuIHVubGVzcyB3ZSd2ZSBtaXNjb2RlZCBvdXIgY29yb3V0aW5lIGxvZ2ljCisJLy8gIlNodXQgZG93biB0aGUgZ2FyYmFnZSBzbWFzaGVycyBvbiB0aGUgZGV0ZW50aW9uIGxldmVsISIKKwllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKwlmQ29yb3V0aW5lTWFuYWdlci5jb19leGl0KGZBcHBDb3JvdXRpbmUpOworICAgICAgfQorCisgICAgLy8gT25seSByZWFjaGVkIGlmIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB3YXMgdGhyb3duIChubyBjb3JvdXRpbmUpCisgICAgcmV0dXJuKGZhbHNlKTsgCisgIH0KKworfSAvLyBjbGFzcyBEVE1CdWlsZGVyCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTUNvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDE1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTUNvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDgwIEBACitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKKworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlTG9jYXRvcjsKKworLyoqCisgKiBJbmRpY2F0ZXMgYSBzZXJpb3VzIGNvbmZpZ3VyYXRpb24gZXJyb3IuCisgKi8KK3B1YmxpYyBjbGFzcyBEVE1Db25maWd1cmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRFRNRXhjZXB0aW9uIHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyA8Y29kZT5EVE1Db25maWd1cmF0aW9uRXhjZXB0aW9uPC9jb2RlPiB3aXRoIG5vCisgICAgICogZGV0YWlsIG1lc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRFRNQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoIkNvbmZpZ3VyYXRpb24gRXJyb3IiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgPGNvZGU+RFRNQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4gd2l0aAorICAgICAqIHRoZSA8Y29kZT5TdHJpbmcgPC9jb2RlPiBzcGVjaWZpZWQgYXMgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgVGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIERUTUNvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyA8Y29kZT5EVE1Db25maWd1cmF0aW9uRXhjZXB0aW9uPC9jb2RlPiB3aXRoIGEKKyAgICAgKiBnaXZlbiA8Y29kZT5FeGNlcHRpb248L2NvZGU+IGJhc2UgY2F1c2Ugb2YgdGhlIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIGUgVGhlIGV4Y2VwdGlvbiB0byBiZSBlbmNhcHN1bGF0ZWQgaW4gYQorICAgICAqIERUTUNvbmZpZ3VyYXRpb25FeGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIERUTUNvbmZpZ3VyYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgc3VwZXIoZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IDxjb2RlPkRUTUNvbmZpZ3VyYXRpb25FeGNlcHRpb248L2NvZGU+IHdpdGggdGhlCisgICAgICogZ2l2ZW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiBiYXNlIGNhdXNlIGFuZCBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlIFRoZSBleGNlcHRpb24gdG8gYmUgZW5jYXBzdWxhdGVkIGluIGEKKyAgICAgKiBEVE1Db25maWd1cmF0aW9uRXhjZXB0aW9uCisgICAgICogQHBhcmFtIG1zZyBUaGUgZGV0YWlsIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIGUgVGhlIGV4Y2VwdGlvbiB0byBiZSB3cmFwcGVkIGluIGEgRFRNQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBEVE1Db25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBlKSB7CisgICAgICAgIHN1cGVyKG1zZywgZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IERUTUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UgYW5kIGEgTG9jYXRvci4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgY29uc3RydWN0b3IgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBhbiBhcHBsaWNhdGlvbiBpcworICAgICAqIGNyZWF0aW5nIGl0cyBvd24gZXhjZXB0aW9uIGZyb20gd2l0aGluIGEgRG9jdW1lbnRIYW5kbGVyCisgICAgICogY2FsbGJhY2suPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gbG9jYXRvciBUaGUgbG9jYXRvciBvYmplY3QgZm9yIHRoZSBlcnJvciBvciB3YXJuaW5nLgorICAgICAqLworICAgIHB1YmxpYyBEVE1Db25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGxvY2F0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXAgYW4gZXhpc3RpbmcgZXhjZXB0aW9uIGluIGEgRFRNQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UsIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgICAgICB1c2UgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgZW1iZWRkZWQgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBsb2NhdG9yIFRoZSBsb2NhdG9yIG9iamVjdCBmb3IgdGhlIGVycm9yIG9yIHdhcm5pbmcuCisgICAgICogQHBhcmFtIGUgQW55IGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRFRNQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0b3IgbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGxvY2F0b3IsIGUpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTURlZmF1bHRCYXNlLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTURlZmF1bHRCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxMzYwYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNRGVmYXVsdEJhc2UuamF2YQpAQCAtMCwwICsxLDE1NDEgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCisgKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS4qOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLkludFZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5JbnRTdGFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5Cb29sU3RhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuU3RyaW5nQnVmZmVyUG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5GYXN0U3RyaW5nQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlRyZWVXYWxrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUU5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MQ2hhcmFjdGVyUmVjb2duaXplcjsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLk5vZGVWZWN0b3I7CisKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmdGYWN0b3J5OworCisvKioKKyAqIFRoZSA8Y29kZT5EVE1EZWZhdWx0QmFzZTwvY29kZT4gY2xhc3Mgc2VydmVzIGFzIGEgaGVscGVyIGJhc2UgZm9yIERUTXMuCisgKiBJdCBzZXRzIHVwIHN0cnVjdHVyZXMgZm9yIG5hdmlnYXRpb24gYW5kIHR5cGUsIHdoaWxlIGxlYXZpbmcgZGF0YQorICogbWFuYWdlbWVudCBhbmQgY29uc3RydWN0aW9uIHRvIHRoZSBkZXJpdmVkIGNsYXNzZXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEVE1EZWZhdWx0QmFzZSBpbXBsZW1lbnRzIERUTQoreworCisgIC8qKgorICAgKiBUaGlzIGlzIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBub2RlIG9iamVjdHMuICBFYWNoIGluZm9ybWF0aW9uCisgICAqIGJsb2NrIGlzIGNvbXBvc2VkIG9mIHNldmVyYWwgYXJyYXkgbWVtYmVycy4gIFRoZSBzaXplIG9mIHRoaXMgd2lsbCBhbHdheXMKKyAgICogYmUgKG1fbm9kZXMuc2l6ZSgpICogTk9ERUlORk9CTE9DS1NJWkUpLgorICAgKi8KKyAgcHJvdGVjdGVkIEludFZlY3RvciBtX2luZm8gPSBuZXcgSW50VmVjdG9yKCk7CisKKyAgLy8gT2Zmc2V0cyBpbnRvIGVhY2ggc2V0IG9mIGludGVnZXJzIGluIHRoZSA8Y29kZT5tX2luZm88L2NvZGU+IHRhYmxlLgorCisgIC8qKiAlVEJEJSBEb2MgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgT0ZGU0VUX0VYUEFOREVETkFNRUlEID0gMDsKKworICAvKiogJVRCRCUgRG9jICovCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE9GRlNFVF9UWVBFID0gMTsKKworICAvKiogJVRCRCUgRG9jICovCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE9GRlNFVF9MRVZFTCA9IDI7CisKKyAgLyoqICVUQkQlIERvYyAqLworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBPRkZTRVRfRklSU1RDSElMRCA9IDM7CisKKyAgLyoqICVUQkQlIERvYyAqLworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBPRkZTRVRfTkVYVFNJQkxJTkcgPSA0OworCisgIC8qKiAlVEJEJSBEb2MgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgT0ZGU0VUX1BSRVZTSUJMSU5HID0gNTsKKworICAvKiogJVRCRCUgRG9jICovCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE9GRlNFVF9QQVJFTlQgPSA2OworCisgIC8qKgorICAgKiBUaGlzIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBpbnRlZ2VycyBwZXIgbm9kZSBpbiB0aGUKKyAgICogPGNvZGU+bV9pbmZvPC9jb2RlPiBtZW1iZXIgdmFyaWFibGUsIGlmIHRoZSBkZXJpdmVkIGNsYXNzCisgICAqIGRvZXMgbm90IGFkZCBpbmZvcm1hdGlvbi4KKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFROT0RFSU5GT0JMT0NLU0laRSA9IDc7CisKKyAgLyoqCisgICAqIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgaW5mb3JtYXRpb24gaGFzIG5vdCBiZWVuIGJ1aWx0IHlldC4KKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5PVFBST0NFU1NFRCA9IERUTS5OVUxMIC0gMTsKKworICAvKiogTm90IHN1cmUgaWYgdGhpcyBpcyB1c2VkPyAqLworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOT0RFSURFTlRJVFlCSVRTID0gMHgwMDBGRkZGRjsKKworICAvKioKKyAgICogVGhlIERUTSBtYW5hZ2VyIHdobyAib3ducyIgdGhpcyBEVE0uCisgICAqLworICBwcm90ZWN0ZWQgRFRNTWFuYWdlciBtX21ncjsKKworICAvKiogJVRCRCUgRG9jICovCisgIHByb3RlY3RlZCBpbnQgbV9kdG1JZGVudDsKKworICAvKiogJVRCRCUgRG9jICovCisgIHByb3RlY3RlZCBpbnQgbV9tYXNrOworCisgIC8qKiAlVEJEJSBEb2MgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBtX2RvY3VtZW50QmFzZVVSSTsKKworICAvKioKKyAgICogVGhlIHdoaXRlc3BhY2UgZmlsdGVyIHRoYXQgZW5hYmxlcyBlbGVtZW50cyB0byBzdHJpcCB3aGl0ZXNwYWNlIG9yIG5vdC4KKyAgICovCisgIHByb3RlY3RlZCBEVE1XU0ZpbHRlciBtX3dzZmlsdGVyOworCisgIC8qKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBzdHJpcCB3aGl0ZXNwYWNlIG5vZGVzICovCisgIHByb3RlY3RlZCBib29sZWFuIG1fc2hvdWxkU3RyaXBXUyA9IGZhbHNlOworCisgIC8qKiBTdGFjayBvZiBmbGFncyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gc3RyaXAgd2hpdGVzcGFjZSBub2RlcyAqLworICBwcm90ZWN0ZWQgQm9vbFN0YWNrIG1fc2hvdWxkU3RyaXBXaGl0ZXNwYWNlU3RhY2s7CisgIAorICAvKiogVGhlIFhNTFN0cmluZyBmYWN0b3J5IGZvciBjcmVhdGluZyBYTUxTdHJpbmdzLiAqLworICBwcm90ZWN0ZWQgWE1MU3RyaW5nRmFjdG9yeSBtX3hzdHJmOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3QgYSBEVE1EZWZhdWx0QmFzZSBvYmplY3QgZnJvbSBhIERPTSBub2RlLgorICAgKgorICAgKiBAcGFyYW0gbWdyIFRoZSBEVE1NYW5hZ2VyIHdobyBvd25zIHRoaXMgRFRNLgorICAgKiBAcGFyYW0gZG9tU291cmNlIHRoZSBET00gc291cmNlIHRoYXQgdGhpcyBEVE0gd2lsbCB3cmFwLgorICAgKiBORUVEU0RPQyBAcGFyYW0gc291cmNlCisgICAqIEBwYXJhbSBkdG1JZGVudGl0eSBUaGUgRFRNIGlkZW50aXR5IElEIGZvciB0aGlzIERUTS4KKyAgICogQHBhcmFtIHdoaXRlU3BhY2VGaWx0ZXIgVGhlIHdoaXRlIHNwYWNlIGZpbHRlciBmb3IgdGhpcyBEVE0sIHdoaWNoIG1heQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBudWxsLgorICAgKi8KKyAgcHVibGljIERUTURlZmF1bHRCYXNlKERUTU1hbmFnZXIgbWdyLCBTb3VyY2Ugc291cmNlLCBpbnQgZHRtSWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBEVE1XU0ZpbHRlciB3aGl0ZVNwYWNlRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyaW5nRmFjdG9yeSB4c3RyaW5nZmFjdG9yeSkKKyAgeworCisgICAgbV9tZ3IgPSBtZ3I7CisgICAgbV9kb2N1bWVudEJhc2VVUkkgPSAobnVsbCAhPSBzb3VyY2UpID8gc291cmNlLmdldFN5c3RlbUlkKCkgOiBudWxsOworICAgIG1fZHRtSWRlbnQgPSBkdG1JZGVudGl0eTsKKyAgICBtX21hc2sgPSBtZ3IuZ2V0Tm9kZUlkZW50aXR5TWFzaygpOworICAgIG1fd3NmaWx0ZXIgPSB3aGl0ZVNwYWNlRmlsdGVyOworICAgIG1feHN0cmYgPSB4c3RyaW5nZmFjdG9yeTsKKworICAgIGlmIChudWxsICE9IHdoaXRlU3BhY2VGaWx0ZXIpCisgICAgeworICAgICAgbV9zaG91bGRTdHJpcFdoaXRlc3BhY2VTdGFjayA9IG5ldyBCb29sU3RhY2soKTsKKworICAgICAgcHVzaFNob3VsZFN0cmlwV2hpdGVzcGFjZShmYWxzZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbmV4dCBub2RlIGlkZW50aXR5IHZhbHVlIGluIHRoZSBsaXN0LCBhbmQgY2FsbCB0aGUgaXRlcmF0b3IKKyAgICogaWYgaXQgaGFzbid0IGJlZW4gYWRkZWQgeWV0LgorICAgKgorICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIG5vZGUgaWRlbnRpdHkgKGluZGV4KS4KKyAgICogQHJldHVybiBpZGVudGl0eSsxLCBvciBEVE0uTlVMTC4KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0TmV4dE5vZGVJZGVudGl0eShpbnQgaWRlbnRpdHkpOworCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgdHJ5IGFuZCBidWlsZCBvbmUgb3IgbW9yZSBub2RlcyBpbiB0aGUgdGFibGUuCisgICAqCisgICAqIEByZXR1cm4gVGhlIHRydWUgaWYgYSBuZXh0IG5vZGUgaXMgZm91bmQgb3IgZmFsc2UgaWYKKyAgICogICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBub2Rlcy4KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIG5leHROb2RlKCk7CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGludGVnZXJzIGluIGVhY2ggbm9kZSBpbmZvIGJsb2NrLgorICAgKgorICAgKiBORUVEU0RPQyAoJG9iamVjdE5hbWUkKSBAcmV0dXJuCisgICAqLworICBwcm90ZWN0ZWQgaW50IGdldE5vZGVJbmZvQmxvY2tTaXplKCkKKyAgeworICAgIHJldHVybiBERUZBVUxUTk9ERUlORk9CTE9DS1NJWkU7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBudW1iZXIgb2Ygbm9kZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQuCisgICAqCisgICAqIE5FRURTRE9DICgkb2JqZWN0TmFtZSQpIEByZXR1cm4KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0TnVtYmVyT2ZOb2RlcygpOworCisgIC8qKgorICAgKiBHZXQgYSBub2RlIGhhbmRsZSB0aGF0IGlzIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBub2RlLgorICAgKgorICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIG5vZGUgaWRlbnRpdHkuCisgICAqIEBwYXJhbSBvZmZzZXRWYWx1ZSBPbmUgb2YgT0ZGU0VUX1hYWCB2YWx1ZXMuCisgICAqIEByZXR1cm4gVGhlIHJlbGF0aXZlIG5vZGUgaGFuZGxlLgorICAgKi8KKyAgcHJvdGVjdGVkIGludCBnZXROb2RlSW5mbyhpbnQgaWRlbnRpdHksIGludCBvZmZzZXRWYWx1ZSkKKyAgeworCisgICAgaW50IGJhc2UgPSAoaWRlbnRpdHkgKiBnZXROb2RlSW5mb0Jsb2NrU2l6ZSgpKTsKKyAgICBpbnQgaW5mbyA9IChpZGVudGl0eSA+PSBnZXROdW1iZXJPZk5vZGVzKCkpCisgICAgICAgICAgICAgICA/IE5PVFBST0NFU1NFRCA6IG1faW5mby5lbGVtZW50QXQoYmFzZSArIG9mZnNldFZhbHVlKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgaW5mb3JtYXRpb24gcmVxdWVzdGVkIGhhcyBiZWVuIHByb2Nlc3NlZCwgYW5kLCAKKyAgICAvLyBpZiBub3QsIGFkdmFuY2UgdGhlIGl0ZXJhdG9yIHVudGlsIHdlIHRoZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiAKKyAgICAvLyBwcm9jZXNzZWQuCisgICAgd2hpbGUgKGluZm8gPT0gTk9UUFJPQ0VTU0VEKQorICAgIHsKKyAgICAgIGJvb2xlYW4gaXNNb3JlID0gbmV4dE5vZGUoKTsKKworICAgICAgaWYgKGlkZW50aXR5ID49IGdldE51bWJlck9mTm9kZXMoKSkKKyAgICAgIHsKKyAgICAgICAgaW5mbyA9IE5PVFBST0NFU1NFRDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgaW5mbyA9IG1faW5mby5lbGVtZW50QXQoYmFzZSArIG9mZnNldFZhbHVlKTsKKworICAgICAgaWYgKCFpc01vcmUgJiYgTk9UUFJPQ0VTU0VEID09IGluZm8pCisgICAgICAgIHJldHVybiBEVE0uTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gaW5mbzsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgYSBub2RlIGhhbmRsZSB0aGF0IGlzIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBub2RlLCBidXQgZG9uJ3QgY2hlY2sgZm9yCisgICAqIHRoZSBOT1RQUk9DRVNTRUQgZmxhZy4gIEEgY2xhc3Mgd2lsbCBuZWVkIHRvIHVzZSB0aGlzIGNhbGwgdG8gZ2V0IHZhbHVlcworICAgKiB0aGF0IG1heSBiZSBuZWdhdGl2ZS4gIEFsc28sIGl0J3MgYSB0aW55IGJpdCBmYXN0ZXIgdGhhbiBnZXROb2RlSW5mbyBpZgorICAgKiB5b3Uga25vdyB0aGF0IE5PVFBST0NFU1NFRCBpcyBub3QgYSBwb3NzaWJpbGl0eS4KKyAgICoKKyAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBub2RlIGlkZW50aXR5LgorICAgKiBAcGFyYW0gb2Zmc2V0VmFsdWUgT25lIG9mIE9GRlNFVF9YWFggdmFsdWVzLgorICAgKiBAcmV0dXJuIFRoZSByZWxhdGl2ZSBub2RlIGhhbmRsZS4KKyAgICovCisgIHByb3RlY3RlZCBpbnQgZ2V0Tm9kZUluZm9Ob1dhaXQoaW50IGlkZW50aXR5LCBpbnQgb2Zmc2V0VmFsdWUpCisgIHsKKyAgICByZXR1cm4gbV9pbmZvLmVsZW1lbnRBdCgoaWRlbnRpdHkgKiBnZXROb2RlSW5mb0Jsb2NrU2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb2Zmc2V0VmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIERpYWdub3N0aWNzIGZ1bmN0aW9uIHRvIGR1bXAgdGhlIERUTS4KKyAgICovCisgIHB1YmxpYyB2b2lkIGR1bXBEVE0oKQorICB7CisKKyAgICB3aGlsZSAobmV4dE5vZGUoKSl7fQorCisgICAgaW50IHNpemVQZXJSZWNvcmQgPSBnZXROb2RlSW5mb0Jsb2NrU2l6ZSgpOworICAgIGludCBuUmVjb3JkcyA9IG1faW5mby5zaXplKCkgLyBzaXplUGVyUmVjb3JkOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCBub2RlczogIiArIG5SZWNvcmRzKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblJlY29yZHM7IGkrKykKKyAgICB7CisgICAgICBpbnQgb2Zmc2V0ID0gaSAqIHNpemVQZXJSZWNvcmQ7CisKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT0gIiArIGkgKyAiID09PT09PT09PT09Iik7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGVOYW1lOiAiICsgZ2V0Tm9kZU5hbWUoaSkpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb2RlTmFtZVg6ICIgKyBnZXROb2RlTmFtZVgoaSkpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbE5hbWU6ICIgKyBnZXRMb2NhbE5hbWUoaSkpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOYW1lc3BhY2VVUkk6ICIgKyBnZXROYW1lc3BhY2VVUkkoaSkpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcmVmaXg6ICIgKyBnZXRQcmVmaXgoaSkpOworCisgICAgICBpbnQgZXhUeXBlSUQgPSBnZXRFeHBhbmRlZE5hbWVJRChpKTsKKworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBhbmRlZCBUeXBlIElEOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGV4VHlwZUlEKSk7CisKKyAgICAgIGludCB0eXBlID0gZ2V0Tm9kZVR5cGUoaSk7CisgICAgICBTdHJpbmcgdHlwZXN0cmluZzsKKworICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgeworICAgICAgY2FzZSBEVE0uQVRUUklCVVRFX05PREUgOgorICAgICAgICB0eXBlc3RyaW5nID0gIkFUVFJJQlVURV9OT0RFIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERUTS5DREFUQV9TRUNUSU9OX05PREUgOgorICAgICAgICB0eXBlc3RyaW5nID0gIkNEQVRBX1NFQ1RJT05fTk9ERSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEVE0uQ09NTUVOVF9OT0RFIDoKKyAgICAgICAgdHlwZXN0cmluZyA9ICJDT01NRU5UX05PREUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRFRNLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgOgorICAgICAgICB0eXBlc3RyaW5nID0gIkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRFRNLkRPQ1VNRU5UX05PREUgOgorICAgICAgICB0eXBlc3RyaW5nID0gIkRPQ1VNRU5UX05PREUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRFRNLkRPQ1VNRU5UX1RZUEVfTk9ERSA6CisgICAgICAgIHR5cGVzdHJpbmcgPSAiRE9DVU1FTlRfTk9ERSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEVE0uRUxFTUVOVF9OT0RFIDoKKyAgICAgICAgdHlwZXN0cmluZyA9ICJFTEVNRU5UX05PREUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRFRNLkVOVElUWV9OT0RFIDoKKyAgICAgICAgdHlwZXN0cmluZyA9ICJFTlRJVFlfTk9ERSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEVE0uRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKKyAgICAgICAgdHlwZXN0cmluZyA9ICJFTlRJVFlfUkVGRVJFTkNFX05PREUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRFRNLk5BTUVTUEFDRV9OT0RFIDoKKyAgICAgICAgdHlwZXN0cmluZyA9ICJOQU1FU1BBQ0VfTk9ERSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEVE0uTk9UQVRJT05fTk9ERSA6CisgICAgICAgIHR5cGVzdHJpbmcgPSAiTk9UQVRJT05fTk9ERSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEVE0uTlVMTCA6CisgICAgICAgIHR5cGVzdHJpbmcgPSAiTlVMTCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEVE0uUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKKyAgICAgICAgdHlwZXN0cmluZyA9ICJQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRFRNLlRFWFRfTk9ERSA6CisgICAgICAgIHR5cGVzdHJpbmcgPSAiVEVYVF9OT0RFIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgdHlwZXN0cmluZyA9ICJVbmtub3duISI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGU6ICIgKyB0eXBlc3RyaW5nKTsKKworICAgICAgaW50IGZpcnN0Q2hpbGQgPSBtX2luZm8uZWxlbWVudEF0KG9mZnNldCArIE9GRlNFVF9GSVJTVENISUxEKTsKKworICAgICAgaWYgKERUTS5OVUxMID09IGZpcnN0Q2hpbGQpCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlyc3QgY2hpbGQ6IERUTS5OVUxMIik7CisgICAgICBlbHNlIGlmIChOT1RQUk9DRVNTRUQgPT0gZmlyc3RDaGlsZCkKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaXJzdCBjaGlsZDogTk9UUFJPQ0VTU0VEIik7CisgICAgICBlbHNlCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlyc3QgY2hpbGQ6ICIgKyBmaXJzdENoaWxkKTsKKworICAgICAgaW50IHByZXZTaWJsaW5nID0gbV9pbmZvLmVsZW1lbnRBdChvZmZzZXQgKyBPRkZTRVRfUFJFVlNJQkxJTkcpOworCisgICAgICBpZiAoRFRNLk5VTEwgPT0gcHJldlNpYmxpbmcpCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJldiBzaWJsaW5nOiBEVE0uTlVMTCIpOworICAgICAgZWxzZSBpZiAoTk9UUFJPQ0VTU0VEID09IHByZXZTaWJsaW5nKQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByZXYgc2libGluZzogTk9UUFJPQ0VTU0VEIik7CisgICAgICBlbHNlCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJldiBzaWJsaW5nOiAiICsgcHJldlNpYmxpbmcpOworCisgICAgICBpbnQgbmV4dFNpYmxpbmcgPSBtX2luZm8uZWxlbWVudEF0KG9mZnNldCArIE9GRlNFVF9ORVhUU0lCTElORyk7CisKKyAgICAgIGlmIChEVE0uTlVMTCA9PSBuZXh0U2libGluZykKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOZXh0IHNpYmxpbmc6IERUTS5OVUxMIik7CisgICAgICBlbHNlIGlmIChOT1RQUk9DRVNTRUQgPT0gbmV4dFNpYmxpbmcpCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmV4dCBzaWJsaW5nOiBOT1RQUk9DRVNTRUQiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOZXh0IHNpYmxpbmc6ICIgKyBuZXh0U2libGluZyk7CisKKyAgICAgIGludCBwYXJlbnQgPSBtX2luZm8uZWxlbWVudEF0KG9mZnNldCArIE9GRlNFVF9QQVJFTlQpOworCisgICAgICBpZiAoRFRNLk5VTEwgPT0gcGFyZW50KQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcmVudDogRFRNLk5VTEwiKTsKKyAgICAgIGVsc2UgaWYgKE5PVFBST0NFU1NFRCA9PSBwYXJlbnQpCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyZW50OiBOT1RQUk9DRVNTRUQiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJlbnQ6ICIgKyBwYXJlbnQpOworCisgICAgICBpbnQgbGV2ZWwgPSBtX2luZm8uZWxlbWVudEF0KG9mZnNldCArIE9GRlNFVF9MRVZFTCk7CisKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTGV2ZWw6ICIgKyBsZXZlbCk7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUgVmFsdWU6ICIgKyBnZXROb2RlVmFsdWUoaSkpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgVmFsdWU6ICIgKyBnZXRTdHJpbmdWYWx1ZShpKSk7CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09IERUTSBJbXBsZW1lbnRhdGlvbiBDb250cm9sIEZ1bmN0aW9ucy4gPT09PT09PT09PT09PT0KKworICAvKioKKyAgICogU2V0IGFuIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBmZWF0dXJlLgorICAgKiA8cD4KKyAgICogJVJFVklFVyUgRG8gd2UgcmVhbGx5IGV4cGVjdCB0byBzZXQgZmVhdHVyZXMgb24gRFRNcz8KKyAgICoKKyAgICogQHBhcmFtIGZlYXR1cmVJZCBBIGZlYXR1cmUgVVJMLgorICAgKiBAcGFyYW0gc3RhdGUgdHJ1ZSBpZiB0aGlzIGZlYXR1cmUgc2hvdWxkIGJlIG9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlSWQsIGJvb2xlYW4gc3RhdGUpe30KKworICAvLyA9PT09PT09PT0gRG9jdW1lbnQgTmF2aWdhdGlvbiBGdW5jdGlvbnMgPT09PT09PT09CisKKyAgLyoqCisgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHRlc3QgaWYgaXQgaGFzIGNoaWxkIG5vZGVzLgorICAgKiA8cD4gJVJFVklFVyUgVGhpcyBpcyBvYnZpb3VzbHkgdXNlZnVsIGF0IHRoZSBET00gbGF5ZXIsIHdoZXJlIGl0CisgICAqIHdvdWxkIHBlcm1pdCB0ZXN0aW5nIHRoaXMgd2l0aG91dCBoYXZpbmcgdG8gY3JlYXRlIGEgcHJveHkKKyAgICogbm9kZS4gSXQncyBsZXNzIHVzZWZ1bCBpbiB0aGUgRFRNIEFQSSwgd2hlcmUKKyAgICogKGR0bS5nZXRGaXJzdENoaWxkKG5vZGVIYW5kbGUpIT1EVE0uTlVMTCkgaXMganVzdCBhcyBmYXN0IGFuZAorICAgKiBhbG1vc3QgYXMgc2VsZi1ldmlkZW50LiBCdXQgaXQncyBhIGNvbnZlbmllbmNlLCBhbmQgZWFzZXMgcG9ydGluZworICAgKiBvZiBET00gY29kZSB0byBEVE0uICA8L3A+CisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIG5vZGUuCisgICAqIEByZXR1cm4gaW50IHRydWUgaWYgdGhlIGdpdmVuIG5vZGUgaGFzIGNoaWxkIG5vZGVzLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcyhpbnQgbm9kZUhhbmRsZSkKKyAgeworCisgICAgaW50IGlkZW50aXR5ID0gbm9kZUhhbmRsZSAmIG1fbWFzazsKKyAgICBpbnQgZmlyc3RDaGlsZCA9IGdldE5vZGVJbmZvKGlkZW50aXR5LCBPRkZTRVRfRklSU1RDSElMRCk7CisKKyAgICByZXR1cm4gZmlyc3RDaGlsZCAhPSBEVE0uTlVMTDsKKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBnZXQgdGhlIGhhbmRsZSBvZiB0aGUgbm9kZSdzIGZpcnN0IGNoaWxkLgorICAgKiBJZiBub3QgeWV0IHJlc29sdmVkLCB3YWl0cyBmb3IgbW9yZSBub2RlcyB0byBiZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgYW5kCisgICAqIHRyaWVzIGFnYWluLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBpbnQgSGFuZGxlIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIGludCBEVE0gbm9kZS1udW1iZXIgb2YgZmlyc3QgY2hpbGQsIG9yIERUTS5OVUxMIHRvIGluZGljYXRlIG5vbmUgZXhpc3RzLgorICAgKi8KKyAgcHVibGljIGludCBnZXRGaXJzdENoaWxkKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBpbnQgaWRlbnRpdHkgPSBub2RlSGFuZGxlICYgbV9tYXNrOworICAgIGludCBmaXJzdENoaWxkID0gZ2V0Tm9kZUluZm8oaWRlbnRpdHksIE9GRlNFVF9GSVJTVENISUxEKTsKKworICAgIHJldHVybiBmaXJzdENoaWxkIHwgbV9kdG1JZGVudDsKKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBhZHZhbmNlIHRvIGl0cyBsYXN0IGNoaWxkLgorICAgKiBJZiBub3QgeWV0IHJlc29sdmVkLCB3YWl0cyBmb3IgbW9yZSBub2RlcyB0byBiZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgYW5kCisgICAqIHRyaWVzIGFnYWluLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBpbnQgSGFuZGxlIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIGludCBOb2RlLW51bWJlciBvZiBsYXN0IGNoaWxkLAorICAgKiBvciBEVE0uTlVMTCB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0TGFzdENoaWxkKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBpbnQgaWRlbnRpdHkgPSBub2RlSGFuZGxlICYgbV9tYXNrOworICAgIGludCBjaGlsZCA9IGdldE5vZGVJbmZvKGlkZW50aXR5LCBPRkZTRVRfRklSU1RDSElMRCk7CisgICAgaW50IGxhc3RDaGlsZCA9IERUTS5OVUxMOworCisgICAgd2hpbGUgKGNoaWxkICE9IERUTS5OVUxMKQorICAgIHsKKyAgICAgIGxhc3RDaGlsZCA9IGNoaWxkOworICAgICAgY2hpbGQgPSBnZXROb2RlSW5mbyhjaGlsZCwgT0ZGU0VUX05FWFRTSUJMSU5HKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGFzdENoaWxkIHwgbV9kdG1JZGVudDsKKyAgfQorCisgIC8qKgorICAgKiBSZXRyaWV2ZXMgYW4gYXR0cmlidXRlIG5vZGUgYnkgYnkgcXVhbGlmaWVkIG5hbWUgYW5kIG5hbWVzcGFjZSBVUkkuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIG5vZGUgdXBvbiB3aGljaCB0byBsb29rIHVwIHRoaXMgYXR0cmlidXRlLi4KKyAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSBUaGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgYXR0cmlidXRlIHRvCisgICAqICAgcmV0cmlldmUsIG9yIG51bGwuCisgICAqIEBwYXJhbSBuYW1lIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8KKyAgICogICByZXRyaWV2ZS4KKyAgICogQHJldHVybiBUaGUgYXR0cmlidXRlIG5vZGUgaGFuZGxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lICgKKyAgICogICA8Y29kZT5ub2RlTmFtZTwvY29kZT4pIG9yIDxjb2RlPkRUTS5OVUxMPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoCisgICAqICAgYXR0cmlidXRlLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGludCBnZXRBdHRyaWJ1dGVOb2RlKGludCBub2RlSGFuZGxlLCBTdHJpbmcgbmFtZXNwYWNlVVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUpOworCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBnZXQgdGhlIGluZGV4IG9mIHRoZSBub2RlJ3MgZmlyc3QgYXR0cmlidXRlLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBpbnQgSGFuZGxlIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIEhhbmRsZSBvZiBmaXJzdCBhdHRyaWJ1dGUsIG9yIERUTS5OVUxMIHRvIGluZGljYXRlIG5vbmUgZXhpc3RzLgorICAgKi8KKyAgcHVibGljIGludCBnZXRGaXJzdEF0dHJpYnV0ZShpbnQgbm9kZUhhbmRsZSkKKyAgeworCisgICAgaW50IHR5cGUgPSBnZXROb2RlVHlwZShub2RlSGFuZGxlKTsKKworICAgIGlmIChEVE0uRUxFTUVOVF9OT0RFID09IHR5cGUpCisgICAgeworCisgICAgICAvLyBBc3N1bWUgdGhhdCBhdHRyaWJ1dGVzIGFuZCBuYW1lc3BhY2VzIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgZWxlbWVudC4KKyAgICAgIGludCBpZGVudGl0eSA9IG5vZGVIYW5kbGUgJiBtX21hc2s7CisKKyAgICAgIHdoaWxlIChEVE0uTlVMTCAhPSAoaWRlbnRpdHkgPSBnZXROZXh0Tm9kZUlkZW50aXR5KGlkZW50aXR5KSkpCisgICAgICB7CisKKyAgICAgICAgLy8gQXNzdW1lIHRoaXMgY2FuIG5vdCBiZSBudWxsLgorICAgICAgICB0eXBlID0gZ2V0Tm9kZVR5cGUoaWRlbnRpdHkpOworCisgICAgICAgIGlmICh0eXBlID09IERUTS5BVFRSSUJVVEVfTk9ERSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBpZGVudGl0eSB8IG1fZHRtSWRlbnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoRFRNLk5BTUVTUEFDRV9OT0RFICE9IHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBEVE0uTlVMTDsKKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBhZHZhbmNlIHRvIGl0cyBuZXh0IHNpYmxpbmcuCisgICAqIElmIG5vdCB5ZXQgcmVzb2x2ZWQsIHdhaXRzIGZvciBtb3JlIG5vZGVzIHRvIGJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBhbmQKKyAgICogdHJpZXMgYWdhaW4uCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIG5vZGUuCisgICAqIEByZXR1cm4gaW50IE5vZGUtbnVtYmVyIG9mIG5leHQgc2libGluZywKKyAgICogb3IgRFRNLk5VTEwgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCisgICAqLworICBwdWJsaWMgaW50IGdldE5leHRTaWJsaW5nKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBpbnQgaWRlbnRpdHkgPSBub2RlSGFuZGxlICYgbV9tYXNrOworICAgIGludCBuZXh0U2libGluZyA9IGdldE5vZGVJbmZvKGlkZW50aXR5LCBPRkZTRVRfTkVYVFNJQkxJTkcpOworCisgICAgcmV0dXJuIG5leHRTaWJsaW5nIHwgbV9kdG1JZGVudDsKKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBmaW5kIGl0cyBwcmVjZWVkaW5nIHNpYmxpbmcuCisgICAqIFdBUk5JTkc6IERUTSBpcyBhc3ltbWV0cmljOyB0aGlzIG9wZXJhdGlvbiBpcyByZXNvbHZlZCBieSBzZWFyY2gsIGFuZCBpcworICAgKiByZWxhdGl2ZWx5IGV4cGVuc2l2ZS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIGludCBOb2RlLW51bWJlciBvZiB0aGUgcHJldmlvdXMgc2liLAorICAgKiBvciBEVE0uTlVMTCB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0UHJldmlvdXNTaWJsaW5nKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBpbnQgZmlyc3RDaGlsZCA9IGdldE5vZGVJbmZvKG5vZGVIYW5kbGUgJiBtX21hc2ssIE9GRlNFVF9QUkVWU0lCTElORyk7CisKKyAgICByZXR1cm4gZmlyc3RDaGlsZCB8IG1fZHRtSWRlbnQ7CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgYWR2YW5jZSB0byB0aGUgbmV4dCBhdHRyaWJ1dGUuIElmIGFuCisgICAqIGVsZW1lbnQsIHdlIGFkdmFuY2UgdG8gaXRzIGZpcnN0IGF0dHJpYnV0ZTsgaWYgYW4gYXR0ciwgd2UgYWR2YW5jZSB0bworICAgKiB0aGUgbmV4dCBhdHRyIG9uIHRoZSBzYW1lIG5vZGUuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIG5vZGUuCisgICAqIEByZXR1cm4gaW50IERUTSBub2RlLW51bWJlciBvZiB0aGUgcmVzb2x2ZWQgYXR0ciwKKyAgICogb3IgRFRNLk5VTEwgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCisgICAqLworICBwdWJsaWMgaW50IGdldE5leHRBdHRyaWJ1dGUoaW50IG5vZGVIYW5kbGUpCisgIHsKKworICAgIGludCB0eXBlID0gZ2V0Tm9kZVR5cGUobm9kZUhhbmRsZSk7CisKKyAgICBpZiAoRFRNLkFUVFJJQlVURV9OT0RFID09IHR5cGUpCisgICAgeworCisgICAgICAvLyBBc3N1bWUgdGhhdCBhdHRyaWJ1dGVzIGFuZCBuYW1lc3BhY2Ugbm9kZXMgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBlbGVtZW50LgorICAgICAgaW50IGlkZW50aXR5ID0gbm9kZUhhbmRsZSAmIG1fbWFzazsKKworICAgICAgd2hpbGUgKERUTS5OVUxMICE9IChpZGVudGl0eSA9IGdldE5leHROb2RlSWRlbnRpdHkoaWRlbnRpdHkpKSkKKyAgICAgIHsKKyAgICAgICAgdHlwZSA9IGdldE5vZGVUeXBlKGlkZW50aXR5KTsKKworICAgICAgICBpZiAodHlwZSA9PSBEVE0uQVRUUklCVVRFX05PREUpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gaWRlbnRpdHkgfCBtX2R0bUlkZW50OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgIT0gRFRNLk5BTUVTUEFDRV9OT0RFKQorICAgICAgICB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRFRNLk5VTEw7CisgIH0KKworICAvKiogTkVFRFNET0MgRmllbGQgbV9uYW1lc3BhY2VMaXN0cyAqLworICBwcml2YXRlIFZlY3RvciBtX25hbWVzcGFjZUxpc3RzID0gbnVsbDsgIC8vIG9uIGRlbWFuZAorCisgIC8qKgorICAgKiBORUVEU0RPQyBNZXRob2QgZ2V0TmFtZXNwYWNlTGlzdAorICAgKgorICAgKgorICAgKiBORUVEU0RPQyBAcGFyYW0gYmFzZUhhbmRsZQorICAgKgorICAgKiBORUVEU0RPQyAoZ2V0TmFtZXNwYWNlTGlzdCkgQHJldHVybgorICAgKi8KKyAgcHJvdGVjdGVkIE5vZGVWZWN0b3IgZ2V0TmFtZXNwYWNlTGlzdChpbnQgYmFzZUhhbmRsZSkKKyAgeworCisgICAgaWYgKG51bGwgPT0gbV9uYW1lc3BhY2VMaXN0cykKKyAgICAgIG1fbmFtZXNwYWNlTGlzdHMgPSBuZXcgVmVjdG9yKCk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIGludCBuID0gbV9uYW1lc3BhY2VMaXN0cy5zaXplKCk7CisKKyAgICAgIGZvciAoaW50IGkgPSAobiAtIDEpOyBpID49IDA7IGktLSkKKyAgICAgIHsKKyAgICAgICAgTm9kZVZlY3RvciBpdmVjID0gKE5vZGVWZWN0b3IpIG1fbmFtZXNwYWNlTGlzdHMuZWxlbWVudEF0KGkpOworCisgICAgICAgIGlmIChpdmVjLmVsZW1lbnRBdCgwKSA9PSBiYXNlSGFuZGxlKQorICAgICAgICAgIHJldHVybiBpdmVjOworICAgICAgfQorICAgIH0KKworICAgIE5vZGVWZWN0b3IgaXZlYyA9IGJ1aWxkTmFtZXNwYWNlTGlzdChiYXNlSGFuZGxlKTsKKworICAgIG1fbmFtZXNwYWNlTGlzdHMuYWRkRWxlbWVudChpdmVjKTsKKworICAgIHJldHVybiBpdmVjOworICB9CisKKyAgLyoqCisgICAqIE5FRURTRE9DIE1ldGhvZCBidWlsZE5hbWVzcGFjZUxpc3QKKyAgICoKKyAgICoKKyAgICogTkVFRFNET0MgQHBhcmFtIGJhc2VIYW5kbGUKKyAgICoKKyAgICogTkVFRFNET0MgKGJ1aWxkTmFtZXNwYWNlTGlzdCkgQHJldHVybgorICAgKi8KKyAgcHJpdmF0ZSBOb2RlVmVjdG9yIGJ1aWxkTmFtZXNwYWNlTGlzdChpbnQgYmFzZUhhbmRsZSkKKyAgeworCisgICAgTm9kZVZlY3RvciBpdmVjID0gbmV3IE5vZGVWZWN0b3IoNyk7CisKKyAgICBpdmVjLmFkZEVsZW1lbnQoLTEpOyAgLy8gZm9yIGJhc2UgaGFuZGxlLgorCisgICAgaW50IG5vZGVIYW5kbGUgPSBiYXNlSGFuZGxlOworICAgIGludCB0eXBlID0gZ2V0Tm9kZVR5cGUoYmFzZUhhbmRsZSk7CisgICAgaW50IG5hbWVzcGFjZUhhbmRsZSA9IERUTS5OVUxMOworCisgICAgaWYgKERUTS5FTEVNRU5UX05PREUgPT0gdHlwZSkKKyAgICB7CisKKyAgICAgIC8vIFdlIGhhdmUgdG8gcmV0dXJuIGluIGRvY3VtZW50IG9yZGVyLCBzbyB3ZSBhY3R1YWxseSB3YW50IHRvIGZpbmQgdGhlIAorICAgICAgLy8gZmlyc3QgbmFtZXNwYWNlIGRlY2wgb2YgdGhlIGxhc3QgZWxlbWVudCB0aGF0IGhhcyBhIG5hbWVzcGFjZSBkZWNsLgorICAgICAgLy8gQXNzdW1lIHRoYXQgYXR0cmlidXRlcyBhbmQgbmFtZXNwYWNlcyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIGVsZW1lbnQuCisgICAgICBpbnQgaWRlbnRpdHkgPSBub2RlSGFuZGxlICYgbV9tYXNrOworCisgICAgICB3aGlsZSAoRFRNLk5VTEwgIT0gaWRlbnRpdHkpCisgICAgICB7CisgICAgICAgIGlkZW50aXR5ID0gZ2V0TmV4dE5vZGVJZGVudGl0eShpZGVudGl0eSk7CisgICAgICAgIHR5cGUgPSAoRFRNLk5VTEwgPT0gaWRlbnRpdHkpID8gLTEgOiBnZXROb2RlVHlwZShpZGVudGl0eSk7CisKKyAgICAgICAgaWYgKHR5cGUgPT0gRFRNLk5BTUVTUEFDRV9OT0RFKQorICAgICAgICB7CisgICAgICAgICAgbmFtZXNwYWNlSGFuZGxlID0gaWRlbnRpdHkgfCBtX2R0bUlkZW50OworCisgICAgICAgICAgaXZlYy5pbnNlcnRJbk9yZGVyKG5hbWVzcGFjZUhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoRFRNLkFUVFJJQlVURV9OT0RFICE9IHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaWRlbnRpdHkgPiAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG5vZGVIYW5kbGUgPSBnZXRQYXJlbnQobm9kZUhhbmRsZSk7CisKKyAgICAgICAgICAgIGlmIChub2RlSGFuZGxlID09IERUTS5OVUxMKQorICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaWRlbnRpdHkgPSBub2RlSGFuZGxlICYgbV9tYXNrOworCisgICAgICAgICAgICBpZiAoaWRlbnRpdHkgPT0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaXZlYy5zZXRFbGVtZW50QXQoYmFzZUhhbmRsZSwgMCk7CisKKyAgICByZXR1cm4gaXZlYzsKKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBnZXQgdGhlIGluZGV4IG9mIHRoZSBub2RlJ3MgZmlyc3QgY2hpbGQuCisgICAqIElmIG5vdCB5ZXQgcmVzb2x2ZWQsIHdhaXRzIGZvciBtb3JlIG5vZGVzIHRvIGJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBhbmQKKyAgICogdHJpZXMgYWdhaW4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgaGFuZGxlIHRvIG5vZGUsIHdoaWNoIHNob3VsZCBwcm9iYWJseSBiZSBhbiBlbGVtZW50CisgICAqICAgICAgICAgICAgICAgICAgIG5vZGUsIGJ1dCBuZWVkIG5vdCBiZS4KKyAgICoKKyAgICogQHBhcmFtIGluU2NvcGUgICAgdHJ1ZSBpZiBhbGwgbmFtZXNwYWNlcyBpbiBzY29wZSBzaG91bGQgYmUgcmV0dXJuZWQsCisgICAqICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIG9ubHkgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgc2hvdWxkIGJlCisgICAqICAgICAgICAgICAgICAgICAgIHJldHVybmVkLgorICAgKiBAcmV0dXJuIGhhbmRsZSBvZiBmaXJzdCBuYW1lc3BhY2UsIG9yIERUTS5OVUxMIHRvIGluZGljYXRlIG5vbmUgZXhpc3RzLgorICAgKi8KKyAgcHVibGljIGludCBnZXRGaXJzdE5hbWVzcGFjZU5vZGUoaW50IG5vZGVIYW5kbGUsIGJvb2xlYW4gaW5TY29wZSkKKyAgeworCisgICAgaW50IHR5cGUgPSBnZXROb2RlVHlwZShub2RlSGFuZGxlKTsKKworICAgIGlmIChEVE0uRUxFTUVOVF9OT0RFID09IHR5cGUpCisgICAgeworICAgICAgaWYgKGluU2NvcGUpCisgICAgICB7CisgICAgICAgIE5vZGVWZWN0b3IgbmFtZXNwYWNlcyA9IGdldE5hbWVzcGFjZUxpc3Qobm9kZUhhbmRsZSk7CisgICAgICAgIGludCBuID0gbmFtZXNwYWNlcy5zaXplKCk7CisKKyAgICAgICAgaWYgKG4gPiAxKQorICAgICAgICAgIHJldHVybiBuYW1lc3BhY2VzLmVsZW1lbnRBdCgxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKworICAgICAgICAvLyBBc3N1bWUgdGhhdCBhdHRyaWJ1dGVzIGFuZCBuYW1lc3BhY2VzIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgZWxlbWVudC4KKyAgICAgICAgaW50IGlkZW50aXR5ID0gbm9kZUhhbmRsZSAmIG1fbWFzazsKKworICAgICAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKGlkZW50aXR5ID0gZ2V0TmV4dE5vZGVJZGVudGl0eShpZGVudGl0eSkpKQorICAgICAgICB7CisKKyAgICAgICAgICAvLyBBc3N1bWUgdGhpcyBjYW4gbm90IGJlIG51bGwuCisgICAgICAgICAgdHlwZSA9IGdldE5vZGVUeXBlKGlkZW50aXR5KTsKKworICAgICAgICAgIGlmICh0eXBlID09IERUTS5OQU1FU1BBQ0VfTk9ERSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaWRlbnRpdHkgfCBtX2R0bUlkZW50OworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChEVE0uQVRUUklCVVRFX05PREUgIT0gdHlwZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRFRNLk5VTEw7CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYSBuYW1lc3BhY2UgaGFuZGxlLCBhZHZhbmNlIHRvIHRoZSBuZXh0IG5hbWVzcGFjZS4KKyAgICoKKyAgICogQHBhcmFtIGJhc2VIYW5kbGUgaGFuZGxlIHRvIG9yaWdpbmFsIG5vZGUgZnJvbSB3aGVyZSB0aGUgZmlyc3QgbmFtZXNwYWNlCisgICAqIHdhcyByZWxhdGl2ZSB0byAobmVlZGVkIHRvIHJldHVybiBub2RlcyBpbiBkb2N1bWVudCBvcmRlcikuCisgICAqIEBwYXJhbSBuYW1lc3BhY2VIYW5kbGUgaGFuZGxlIHRvIG5vZGUgd2hpY2ggbXVzdCBiZSBvZiB0eXBlCisgICAqIE5BTUVTUEFDRV9OT0RFLgorICAgKiBORUVEU0RPQyBAcGFyYW0gbm9kZUhhbmRsZQorICAgKiBORUVEU0RPQyBAcGFyYW0gaW5TY29wZQorICAgKiBAcmV0dXJuIGhhbmRsZSBvZiBuZXh0IG5hbWVzcGFjZSwgb3IgRFRNLk5VTEwgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCisgICAqLworICBwdWJsaWMgaW50IGdldE5leHROYW1lc3BhY2VOb2RlKGludCBiYXNlSGFuZGxlLCBpbnQgbm9kZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluU2NvcGUpCisgIHsKKworICAgIGludCB0eXBlID0gZ2V0Tm9kZVR5cGUobm9kZUhhbmRsZSk7CisKKyAgICBpZiAoRFRNLk5BTUVTUEFDRV9OT0RFID09IHR5cGUpCisgICAgeworICAgICAgaWYgKGluU2NvcGUpCisgICAgICB7CisgICAgICAgIE5vZGVWZWN0b3IgbmFtZXNwYWNlcyA9IGdldE5hbWVzcGFjZUxpc3QoYmFzZUhhbmRsZSk7CisgICAgICAgIGludCBuID0gbmFtZXNwYWNlcy5zaXplKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspICAvLyBzdGFydCBmcm9tIDEgb24gcHVycG9zZSAKKyAgICAgICAgeworICAgICAgICAgIGlmIChub2RlSGFuZGxlID09IG5hbWVzcGFjZXMuZWxlbWVudEF0KGkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpICsgMSA8IG4pCisgICAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2VzLmVsZW1lbnRBdChpICsgMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisKKyAgICAgICAgLy8gQXNzdW1lIHRoYXQgYXR0cmlidXRlcyBhbmQgbmFtZXNwYWNlIG5vZGVzIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgZWxlbWVudC4KKyAgICAgICAgaW50IGlkZW50aXR5ID0gbm9kZUhhbmRsZSAmIG1fbWFzazsKKworICAgICAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKGlkZW50aXR5ID0gZ2V0TmV4dE5vZGVJZGVudGl0eShpZGVudGl0eSkpKQorICAgICAgICB7CisgICAgICAgICAgdHlwZSA9IGdldE5vZGVUeXBlKGlkZW50aXR5KTsKKworICAgICAgICAgIGlmICh0eXBlID09IERUTS5OQU1FU1BBQ0VfTk9ERSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaWRlbnRpdHkgfCBtX2R0bUlkZW50OworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICh0eXBlICE9IERUTS5BVFRSSUJVVEVfTk9ERSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRFRNLk5VTEw7CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgZmluZCBpdHMgcGFyZW50IG5vZGUuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICogQHJldHVybiBpbnQgTm9kZS1udW1iZXIgb2YgcGFyZW50LAorICAgKiBvciBEVE0uTlVMTCB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0UGFyZW50KGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBpbnQgaWRlbnRpdHkgPSBub2RlSGFuZGxlICYgbV9tYXNrOworCisgICAgaWYgKGlkZW50aXR5ID4gMCkKKyAgICB7CisgICAgICBpbnQgcGFyZW50ID0gZ2V0Tm9kZUluZm8oaWRlbnRpdHksIE9GRlNFVF9QQVJFTlQpOworCisgICAgICByZXR1cm4gcGFyZW50IHwgbV9kdG1JZGVudDsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIERUTS5OVUxMOworICB9CisKKyAgLyoqCisgICAqICBHaXZlbiBhIG5vZGUgaGFuZGxlLCBmaW5kIHRoZSBvd25pbmcgZG9jdW1lbnQgbm9kZS4KKyAgICoKKyAgICogIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICogIEByZXR1cm4gaW50IE5vZGUgaGFuZGxlIG9mIGRvY3VtZW50LCB3aGljaCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkLgorICAgKi8KKyAgcHVibGljIGludCBnZXREb2N1bWVudCgpCisgIHsKKyAgICByZXR1cm4gbV9kdG1JZGVudDsKKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBmaW5kIHRoZSBvd25pbmcgZG9jdW1lbnQgbm9kZS4gIFRoaXMgaGFzIHRoZSBleGFjdAorICAgKiBzYW1lIHNlbWFudGljcyBhcyB0aGUgRE9NIERvY3VtZW50IG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lLCBpbiB0aGF0IGlmCisgICAqIHRoZSBub2RlSGFuZGxlIGlzIGEgZG9jdW1lbnQgbm9kZSwgaXQgd2lsbCByZXR1cm4gTlVMTC4KKyAgICoKKyAgICogPHA+JVJFVklFVyUgU2luY2UgdGhpcyBpcyBET00tc3BlY2lmaWMsIGl0IG1heSBiZWxvbmcgYXQgdGhlIERPTQorICAgKiBiaW5kaW5nIGxheWVyLiBJbmNsdWRlZCBoZXJlIGFzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gYW5kIHRvCisgICAqIGFpZCBwb3J0aW5nIG9mIERPTSBjb2RlIHRvIERUTS48L3A+CisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICogQHJldHVybiBpbnQgTm9kZSBoYW5kbGUgb2Ygb3duaW5nIGRvY3VtZW50LCBvciAtMSBpZiB0aGUgbm9kZUhhbmRsZSBpcworICAgKiAgICAgICAgICAgICBhIGRvY3VtZW50LgorICAgKi8KKyAgcHVibGljIGludCBnZXRPd25lckRvY3VtZW50KGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBpbnQgdHlwZSA9IGdldE5vZGVUeXBlKG5vZGVIYW5kbGUpOworCisgICAgaWYgKERUTS5ET0NVTUVOVF9OT0RFID09IHR5cGUpCisgICAgeworICAgICAgcmV0dXJuIERUTS5OVUxMOworICAgIH0KKworICAgIHJldHVybiBnZXREb2N1bWVudCgpOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgc3RyaW5nLXZhbHVlIG9mIGEgbm9kZSBhcyBhIFN0cmluZyBvYmplY3QKKyAgICogKHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aCNkYXRhLW1vZGVsCisgICAqIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBhIG5vZGUncyBzdHJpbmctdmFsdWUpLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KKyAgICoKKyAgICogQHJldHVybiBBIHN0cmluZyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzdHJpbmctdmFsdWUgb2YgdGhlIGdpdmVuIG5vZGUuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgWE1MU3RyaW5nIGdldFN0cmluZ1ZhbHVlKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogR2V0IG51bWJlciBvZiBjaGFyYWN0ZXIgYXJyYXkgY2h1bmtzIGluCisgICAqIHRoZSBzdHJpbmctdmFsdWUgb2YgYSBub2RlLgorICAgKiAoc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI2RhdGEtbW9kZWwKKyAgICogZm9yIHRoZSBkZWZpbml0aW9uIG9mIGEgbm9kZSdzIHN0cmluZy12YWx1ZSkuCisgICAqIE5vdGUgdGhhdCBhIHNpbmdsZSB0ZXh0IG5vZGUgbWF5IGhhdmUgbXVsdGlwbGUgdGV4dCBjaHVua3MuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIElELgorICAgKgorICAgKiBAcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXIgYXJyYXkgY2h1bmtzIGluCisgICAqICAgICAgICAgdGhlIHN0cmluZy12YWx1ZSBvZiBhIG5vZGUuCisgICAqLworICBwdWJsaWMgaW50IGdldFN0cmluZ1ZhbHVlQ2h1bmtDb3VudChpbnQgbm9kZUhhbmRsZSkKKyAgeworCisgICAgLy8gJVRCRCUKKyAgICBlcnJvcigiZ2V0U3RyaW5nVmFsdWVDaHVua0NvdW50IG5vdCB5ZXQgc3VwcG9ydGVkISIpOworCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKioKKyAgICogR2V0IGEgY2hhcmFjdGVyIGFycmF5IGNodW5rIGluIHRoZSBzdHJpbmctdmFsdWUgb2YgYSBub2RlLgorICAgKiAoc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI2RhdGEtbW9kZWwKKyAgICogZm9yIHRoZSBkZWZpbml0aW9uIG9mIGEgbm9kZSdzIHN0cmluZy12YWx1ZSkuCisgICAqIE5vdGUgdGhhdCBhIHNpbmdsZSB0ZXh0IG5vZGUgbWF5IGhhdmUgbXVsdGlwbGUgdGV4dCBjaHVua3MuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIElELgorICAgKiBAcGFyYW0gY2h1bmtJbmRleCBXaGljaCBjaHVuayB0byBnZXQuCisgICAqIEBwYXJhbSBzdGFydEFuZExlbiBBbiBhcnJheSBvZiAyIHdoZXJlIHRoZSBzdGFydCBwb3NpdGlvbiBhbmQgbGVuZ3RoIG9mCisgICAqICAgICAgICAgICAgICAgICAgICB0aGUgY2h1bmsgd2lsbCBiZSByZXR1cm5lZC4KKyAgICoKKyAgICogQHJldHVybiBUaGUgY2hhcmFjdGVyIGFycmF5IHJlZmVyZW5jZSB3aGVyZSB0aGUgY2h1bmsgb2NjdXJzLgorICAgKi8KKyAgcHVibGljIGNoYXJbXSBnZXRTdHJpbmdWYWx1ZUNodW5rKGludCBub2RlSGFuZGxlLCBpbnQgY2h1bmtJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHN0YXJ0QW5kTGVuKQorICB7CisKKyAgICAvLyAlVEJEJQorICAgIGVycm9yKCJnZXRTdHJpbmdWYWx1ZUNodW5rIG5vdCB5ZXQgc3VwcG9ydGVkISIpOworCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGFuIElEIHRoYXQgcmVwcmVzZW50cyB0aGUgbm9kZSdzIGV4cGFuZGVkIG5hbWUuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBoYW5kbGUgdG8gdGhlIG5vZGUgaW4gcXVlc3Rpb24uCisgICAqCisgICAqIEByZXR1cm4gdGhlIGV4cGFuZGVkLW5hbWUgaWQgb2YgdGhlIG5vZGUuCisgICAqLworICBwdWJsaWMgaW50IGdldEV4cGFuZGVkTmFtZUlEKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBpbnQgaWRlbnRpdHkgPSBub2RlSGFuZGxlICYgbV9tYXNrOworICAgIGludCBleHBhbmRlZE5hbWVJRCA9IGdldE5vZGVJbmZvKGlkZW50aXR5LCBPRkZTRVRfRVhQQU5ERUROQU1FSUQpOworCisgICAgcmV0dXJuIGV4cGFuZGVkTmFtZUlEOworICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGFuIGV4cGFuZGVkIG5hbWUsIHJldHVybiBhbiBJRC4gIElmIHRoZSBleHBhbmRlZC1uYW1lIGRvZXMgbm90CisgICAqIGV4aXN0IGluIHRoZSBpbnRlcm5hbCB0YWJsZXMsIHRoZSBlbnRyeSB3aWxsIGJlIGNyZWF0ZWQsIGFuZCB0aGUgSUQgd2lsbAorICAgKiBiZSByZXR1cm5lZC4gIEFueSBhZGRpdGlvbmFsIG5vZGVzIHRoYXQgYXJlIGNyZWF0ZWQgdGhhdCBoYXZlIHRoaXMKKyAgICogZXhwYW5kZWQgbmFtZSB3aWxsIHVzZSB0aGlzIElELgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgaGFuZGxlIHRvIHRoZSBub2RlIGluIHF1ZXN0aW9uLgorICAgKiBORUVEU0RPQyBAcGFyYW0gdHlwZQorICAgKgorICAgKiBORUVEU0RPQyBAcGFyYW0gbmFtZXNwYWNlCisgICAqIE5FRURTRE9DIEBwYXJhbSBsb2NhbE5hbWUKKyAgICoKKyAgICogQHJldHVybiB0aGUgZXhwYW5kZWQtbmFtZSBpZCBvZiB0aGUgbm9kZS4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0RXhwYW5kZWROYW1lSUQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSwgaW50IHR5cGUpCisgIHsKKworICAgIEV4cGFuZGVkTmFtZVRhYmxlIGVudCA9IG1fbWdyLmdldEV4cGFuZGVkTmFtZVRhYmxlKHRoaXMpOworCisgICAgcmV0dXJuIGVudC5nZXRFeHBhbmRlZE5hbWVJRChuYW1lc3BhY2UsIGxvY2FsTmFtZSwgdHlwZSk7CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYW4gZXhwYW5kZWQtbmFtZSBJRCwgcmV0dXJuIHRoZSBsb2NhbCBuYW1lIHBhcnQuCisgICAqCisgICAqIEBwYXJhbSBFeHBhbmRlZE5hbWVJRCBhbiBJRCB0aGF0IHJlcHJlc2VudHMgYW4gZXhwYW5kZWQtbmFtZS4KKyAgICogQHJldHVybiBTdHJpbmcgTG9jYWwgbmFtZSBvZiB0aGlzIG5vZGUuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZUZyb21FeHBhbmRlZE5hbWVJRChpbnQgRXhwYW5kZWROYW1lSUQpCisgIHsKKworICAgIEV4cGFuZGVkTmFtZVRhYmxlIGVudCA9IG1fbWdyLmdldEV4cGFuZGVkTmFtZVRhYmxlKHRoaXMpOworCisgICAgcmV0dXJuIGVudC5nZXRMb2NhbE5hbWUoRXhwYW5kZWROYW1lSUQpOworICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGFuIGV4cGFuZGVkLW5hbWUgSUQsIHJldHVybiB0aGUgbmFtZXNwYWNlIFVSSSBwYXJ0LgorICAgKgorICAgKiBAcGFyYW0gRXhwYW5kZWROYW1lSUQgYW4gSUQgdGhhdCByZXByZXNlbnRzIGFuIGV4cGFuZGVkLW5hbWUuCisgICAqIEByZXR1cm4gU3RyaW5nIFVSSSB2YWx1ZSBvZiB0aGlzIG5vZGUncyBuYW1lc3BhY2UsIG9yIG51bGwgaWYgbm8KKyAgICogbmFtZXNwYWNlIHdhcyByZXNvbHZlZC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRnJvbUV4cGFuZGVkTmFtZUlEKGludCBFeHBhbmRlZE5hbWVJRCkKKyAgeworCisgICAgRXhwYW5kZWROYW1lVGFibGUgZW50ID0gbV9tZ3IuZ2V0RXhwYW5kZWROYW1lVGFibGUodGhpcyk7CisKKyAgICByZXR1cm4gZW50LmdldE5hbWVzcGFjZShFeHBhbmRlZE5hbWVJRCk7CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGl0cyBET00tc3R5bGUgbm9kZSBuYW1lLiBUaGlzIHdpbGwKKyAgICogaW5jbHVkZSBuYW1lcyBzdWNoIGFzICN0ZXh0IG9yICNkb2N1bWVudC4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIFN0cmluZyBOYW1lIG9mIHRoaXMgbm9kZSwgd2hpY2ggbWF5IGJlIGFuIGVtcHR5IHN0cmluZy4KKyAgICogJVJFVklFVyUgRG9jdW1lbnQgd2hlbiBlbXB0eSBzdHJpbmcgaXMgcG9zc2libGUuLi4KKyAgICogJVJFVklFVy1DT01NRU5UJSBJdCBzaG91bGQgbmV2ZXIgYmUgZW1wdHksIHNob3VsZCBpdD8KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Tm9kZU5hbWUoaW50IG5vZGVIYW5kbGUpOworCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gdGhlIFhQYXRoIG5vZGUgbmFtZS4gIFRoaXMgc2hvdWxkIGJlCisgICAqIHRoZSBuYW1lIGFzIGRlc2NyaWJlZCBieSB0aGUgWFBhdGggZGF0YSBtb2RlbCwgTk9UIHRoZSBET00tc3R5bGUKKyAgICogbmFtZS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIFN0cmluZyBOYW1lIG9mIHRoaXMgbm9kZSwgd2hpY2ggbWF5IGJlIGFuIGVtcHR5IHN0cmluZy4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWVYKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICAvKiogQHRvZG86IGltcGxlbWVudCB0aGlzIG9yZy5hcGFjaGUueG1sLmR0bS5EVE1EZWZhdWx0QmFzZSBhYnN0cmFjdCBtZXRob2QgKi8KKyAgICBlcnJvcigiTm90IHlldCBzdXBwb3J0ZWQhIik7CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gaXRzIFhQYXRoLXN0eWxlIGxvY2FsbmFtZS4KKyAgICogKEFzIGRlZmluZWQgaW4gTmFtZXNwYWNlcywgdGhpcyBpcyB0aGUgcG9ydGlvbiBvZiB0aGUgbmFtZSBhZnRlciBhbnkKKyAgICogY29sb24gY2hhcmFjdGVyKS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIFN0cmluZyBMb2NhbCBuYW1lIG9mIHRoaXMgbm9kZS4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TG9jYWxOYW1lKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogR2l2ZW4gYSBuYW1lc3BhY2UgaGFuZGxlLCByZXR1cm4gdGhlIHByZWZpeCB0aGF0IHRoZSBuYW1lc3BhY2UgZGVjbCBpcworICAgKiBtYXBwaW5nLgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gdGhlIHByZWZpeCB1c2VkIHRvIG1hcCB0byB0aGUgbmFtZXNwYWNlLgorICAgKgorICAgKiA8cD4gJVJFVklFVyUgQXJlIHlvdSBzdXJlIHlvdSB3YW50ICIiIGZvciBubyBwcmVmaXg/ICA8L3A+CisgICAqIDxwPiAlUkVWSUVXLUNPTU1FTlQlIEkgdGhpbmsgc28uLi4gbm90IHRvdGFsbHkgc3VyZS4gLXNiICA8L3A+CisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICogQHJldHVybiBTdHJpbmcgcHJlZml4IG9mIHRoaXMgbm9kZSdzIG5hbWUsIG9yICIiIGlmIG5vIGV4cGxpY2l0CisgICAqIG5hbWVzcGFjZSBwcmVmaXggd2FzIGdpdmVuLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmaXgoaW50IG5vZGVIYW5kbGUpOworCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gaXRzIERPTS1zdHlsZSBuYW1lc3BhY2UgVVJJCisgICAqIChBcyBkZWZpbmVkIGluIE5hbWVzcGFjZXMsIHRoaXMgaXMgdGhlIGRlY2xhcmVkIFVSSSB3aGljaCB0aGlzIG5vZGUncworICAgKiBwcmVmaXggLS0gb3IgZGVmYXVsdCBpbiBsaWV1IHRoZXJlb2YgLS0gd2FzIG1hcHBlZCB0by4pCisgICAqCisgICAqIDxwPiVSRVZJRVclIE51bGwgb3IgIiI/IC1zYjwvcD4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIFN0cmluZyBVUkkgdmFsdWUgb2YgdGhpcyBub2RlJ3MgbmFtZXNwYWNlLCBvciBudWxsIGlmIG5vCisgICAqIG5hbWVzcGFjZSB3YXMgcmVzb2x2ZWQuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgbm9kZUhhbmRsZSk7CisKKyAgLyoqCisgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiBpdHMgbm9kZSB2YWx1ZS4gVGhpcyBpcyBtb3N0bHkKKyAgICogYXMgZGVmaW5lZCBieSB0aGUgRE9NLCBidXQgbWF5IGlnbm9yZSBzb21lIGNvbnZlbmllbmNlcy4KKyAgICogPHA+CisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLgorICAgKiBAcmV0dXJuIFN0cmluZyBWYWx1ZSBvZiB0aGlzIG5vZGUsIG9yIG51bGwgaWYgbm90CisgICAqIG1lYW5pbmdmdWwgZm9yIHRoaXMgbm9kZSB0eXBlLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROb2RlVmFsdWUoaW50IG5vZGVIYW5kbGUpOworCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gaXRzIERPTS1zdHlsZSBub2RlIHR5cGUuCisgICAqIDxwPgorICAgKiAlUkVWSUVXJSBHZW5lcmFsbHksIHJldHVybmluZyBzaG9ydCBpcyBmYWxzZSBlY29ub215LiBSZXR1cm4gaW50PworICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBpZC4KKyAgICogQHJldHVybiBpbnQgTm9kZSB0eXBlLCBhcyBwZXIgdGhlIERPTSdzIE5vZGUuX05PREUgY29uc3RhbnRzLgorICAgKi8KKyAgcHVibGljIHNob3J0IGdldE5vZGVUeXBlKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBpbnQgaWRlbnRpdHkgPSBub2RlSGFuZGxlICYgbV9tYXNrOworICAgIHNob3J0IHR5cGUgPSAoc2hvcnQpIGdldE5vZGVJbmZvKGlkZW50aXR5LCBPRkZTRVRfVFlQRSk7CisKKyAgICByZXR1cm4gdHlwZTsKKyAgfQorCisgIC8qKgorICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KKyAgICogR2V0IHRoZSBkZXB0aCBsZXZlbCBvZiB0aGlzIG5vZGUgaW4gdGhlIHRyZWUgKGVxdWFscyAxIGZvcgorICAgKiBhIHBhcmVudGxlc3Mgbm9kZSkuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLgorICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYW5jZXN0b3JzLCBwbHVzIG9uZQorICAgKi8KKyAgcHVibGljIHNob3J0IGdldExldmVsKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBpbnQgaWRlbnRpdHkgPSBub2RlSGFuZGxlICYgbV9tYXNrOworCisgICAgLy8gQXBwYXJlbnRseSwgdGhlIGF4aXMgd2Fsa2VyIHN0dWZmIHJlcXVpcmVzIGxldmVscyB0byBjb3VudCBmcm9tIDEuCisgICAgcmV0dXJuIChzaG9ydCkgKGdldE5vZGVJbmZvKGlkZW50aXR5LCBPRkZTRVRfTEVWRUwpICsgMSk7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PSBEb2N1bWVudCBxdWVyeSBmdW5jdGlvbnMgPT09PT09PT09PT09PT0gCisKKyAgLyoqCisgICAqIFRlc3RzIHdoZXRoZXIgRFRNIERPTSBpbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIGEgc3BlY2lmaWMgZmVhdHVyZSBhbmQKKyAgICogdGhhdCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGlzIG5vZGUuCisgICAqCisgICAqIEBwYXJhbSBmZWF0dXJlIFRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHRvIHRlc3QuCisgICAqIEBwYXJhbSB2ZXJzaW9uVGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC4KKyAgICogICBJZiB0aGUgdmVyc2lvbiBpcyBub3QKKyAgICogICBzcGVjaWZpZWQsIHN1cHBvcnRpbmcgYW55IHZlcnNpb24gb2YgdGhlIGZlYXR1cmUgd2lsbCBjYXVzZSB0aGUKKyAgICogICBtZXRob2QgdG8gcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgorICAgKiBORUVEU0RPQyBAcGFyYW0gdmVyc2lvbgorICAgKiBAcmV0dXJuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGlzCisgICAqICAgc3VwcG9ydGVkIG9uIHRoaXMgbm9kZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikKKyAgeworCisgICAgLy8gJVRCRCUKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBiYXNlIFVSSSBvZiB0aGUgZG9jdW1lbnQgZW50aXR5LiBJZiBpdCBpcyBub3Qga25vd24KKyAgICogKGJlY2F1c2UgdGhlIGRvY3VtZW50IHdhcyBwYXJzZWQgZnJvbSBhIHNvY2tldCBjb25uZWN0aW9uIG9yIGZyb20KKyAgICogc3RhbmRhcmQgaW5wdXQsIGZvciBleGFtcGxlKSwgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMgdW5rbm93bi4KKyAgICoKKyAgICogQHJldHVybiB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgU3RyaW5nIG9iamVjdCBvciBudWxsIGlmIHVua25vd24uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50QmFzZVVSSSgpCisgIHsKKyAgICByZXR1cm4gbV9kb2N1bWVudEJhc2VVUkk7CisgIH0KKworICAvKioKKyAgICogU2V0IHRoZSBiYXNlIFVSSSBvZiB0aGUgZG9jdW1lbnQgZW50aXR5LgorICAgKgorICAgKiBAcGFyYW0gYmFzZVVSSSB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgU3RyaW5nIG9iamVjdCBvciBudWxsIGlmIHVua25vd24uCisgICAqLworICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudEJhc2VVUkkoU3RyaW5nIGJhc2VVUkkpCisgIHsKKyAgICBtX2RvY3VtZW50QmFzZVVSSSA9IGJhc2VVUkk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgZW50aXR5LiBJZgorICAgKiBpdCBpcyBub3Qga25vd24sIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGlzIHVua25vd24uCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLCB3aGljaCBjYW4gYmUgYW55IHZhbGlkIG5vZGUgaGFuZGxlLgorICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBTdHJpbmcgb2JqZWN0IG9yIG51bGwgaWYgdW5rbm93bi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRTeXN0ZW1JZGVudGlmaWVyKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICAvLyAlUkVWSUVXJSAgT0s/IC1zYgorICAgIHJldHVybiBtX2RvY3VtZW50QmFzZVVSSTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBzY2hlbWUKKyAgICogICAgICAgIGluIHdoaWNoIHRoZSBkb2N1bWVudCBlbnRpdHkgaXMgZXhwcmVzc2VkLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBpZCwgd2hpY2ggY2FuIGJlIGFueSB2YWxpZCBub2RlIGhhbmRsZS4KKyAgICogQHJldHVybiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcgU3RyaW5nIG9iamVjdC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRFbmNvZGluZyhpbnQgbm9kZUhhbmRsZSkKKyAgeworCisgICAgLy8gJVJFVklFVyUgIE9LPz8gIC1zYgorICAgIHJldHVybiAiVVRGLTgiOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiBhbiBpbmRpY2F0aW9uIG9mIHRoZSBzdGFuZGFsb25lIHN0YXR1cyBvZiB0aGUgZG9jdW1lbnQsCisgICAqICAgICAgICBlaXRoZXIgInllcyIgb3IgIm5vIi4gVGhpcyBwcm9wZXJ0eSBpcyBkZXJpdmVkIGZyb20gdGhlIG9wdGlvbmFsCisgICAqICAgICAgICBzdGFuZGFsb25lIGRvY3VtZW50IGRlY2xhcmF0aW9uIGluIHRoZSBYTUwgZGVjbGFyYXRpb24gYXQgdGhlCisgICAqICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IGVudGl0eSwgYW5kIGhhcyBubyB2YWx1ZSBpZiB0aGVyZSBpcyBubworICAgKiAgICAgICAgc3RhbmRhbG9uZSBkb2N1bWVudCBkZWNsYXJhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgaWQsIHdoaWNoIGNhbiBiZSBhbnkgdmFsaWQgbm9kZSBoYW5kbGUuCisgICAqIEByZXR1cm4gdGhlIGRvY3VtZW50IHN0YW5kYWxvbmUgU3RyaW5nIG9iamVjdCwgZWl0aGVyICJ5ZXMiLCAibm8iLCBvciBudWxsLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudFN0YW5kYWxvbmUoaW50IG5vZGVIYW5kbGUpCisgIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBYTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQuIFRoaXMKKyAgICogcHJvcGVydHkgaXMgZGVyaXZlZCBmcm9tIHRoZSBYTUwgZGVjbGFyYXRpb24gb3B0aW9uYWxseSBwcmVzZW50IGF0IHRoZQorICAgKiBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IGVudGl0eSwgYW5kIGhhcyBubyB2YWx1ZSBpZiB0aGVyZSBpcyBubyBYTUwKKyAgICogZGVjbGFyYXRpb24uCisgICAqCisgICAqIEBwYXJhbSB0aGUgZG9jdW1lbnQgaGFuZGxlCisgICAqCisgICAqIE5FRURTRE9DIEBwYXJhbSBkb2N1bWVudEhhbmRsZQorICAgKgorICAgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCB2ZXJzaW9uIFN0cmluZyBvYmplY3QuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50VmVyc2lvbihpbnQgZG9jdW1lbnRIYW5kbGUpCisgIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gYW4gaW5kaWNhdGlvbiBvZgorICAgKiB3aGV0aGVyIHRoZSBwcm9jZXNzb3IgaGFzIHJlYWQgdGhlIGNvbXBsZXRlIERURC4gSXRzIHZhbHVlIGlzIGEKKyAgICogYm9vbGVhbi4gSWYgaXQgaXMgZmFsc2UsIHRoZW4gY2VydGFpbiBwcm9wZXJ0aWVzIChpbmRpY2F0ZWQgaW4gdGhlaXIKKyAgICogZGVzY3JpcHRpb25zIGJlbG93KSBtYXkgYmUgdW5rbm93bi4gSWYgaXQgaXMgdHJ1ZSwgdGhvc2UgcHJvcGVydGllcworICAgKiBhcmUgbmV2ZXIgdW5rbm93bi4KKyAgICoKKyAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgZGVjbGFyYXRpb25zIHdlcmUgcHJvY2Vzc2VkOworICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBnZXREb2N1bWVudEFsbERlY2xhcmF0aW9uc1Byb2Nlc3NlZCgpCisgIHsKKworICAgIC8vICVSRVZJRVclIE9LPworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqICAgQSBkb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9uIGluZm9ybWF0aW9uIGl0ZW0gaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICoKKyAgICogICAgIDEuIFtzeXN0ZW0gaWRlbnRpZmllcl0gVGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBleHRlcm5hbCBzdWJzZXQsIGlmCisgICAqICAgICAgICBpdCBleGlzdHMuIE90aGVyd2lzZSB0aGlzIHByb3BlcnR5IGhhcyBubyB2YWx1ZS4KKyAgICoKKyAgICogQHJldHVybiB0aGUgc3lzdGVtIGlkZW50aWZpZXIgU3RyaW5nIG9iamVjdCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREb2N1bWVudFR5cGVEZWNsYXJhdGlvblN5c3RlbUlkZW50aWZpZXIoKTsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgZXh0ZXJuYWwgc3Vic2V0LAorICAgKiBub3JtYWxpemVkIGFzIGRlc2NyaWJlZCBpbiA0LjIuMiBFeHRlcm5hbCBFbnRpdGllcyBbWE1MXS4gSWYgdGhlcmUgaXMKKyAgICogbm8gZXh0ZXJuYWwgc3Vic2V0IG9yIGlmIGl0IGhhcyBubyBwdWJsaWMgaWRlbnRpZmllciwgdGhpcyBwcm9wZXJ0eQorICAgKiBoYXMgbm8gdmFsdWUuCisgICAqCisgICAqIEBwYXJhbSB0aGUgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbiBoYW5kbGUKKyAgICoKKyAgICogQHJldHVybiB0aGUgcHVibGljIGlkZW50aWZpZXIgU3RyaW5nIG9iamVjdCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREb2N1bWVudFR5cGVEZWNsYXJhdGlvblB1YmxpY0lkZW50aWZpZXIoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgPGNvZGU+RWxlbWVudDwvY29kZT4gd2hvc2UgPGNvZGU+SUQ8L2NvZGU+IGlzIGdpdmVuIGJ5CisgICAqIDxjb2RlPmVsZW1lbnRJZDwvY29kZT4uIElmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMsIHJldHVybnMKKyAgICogPGNvZGU+RFRNLk5VTEw8L2NvZGU+LiBCZWhhdmlvciBpcyBub3QgZGVmaW5lZCBpZiBtb3JlIHRoYW4gb25lIGVsZW1lbnQKKyAgICogaGFzIHRoaXMgPGNvZGU+SUQ8L2NvZGU+LiBBdHRyaWJ1dGVzIChpbmNsdWRpbmcgdGhvc2UKKyAgICogd2l0aCB0aGUgbmFtZSAiSUQiKSBhcmUgbm90IG9mIHR5cGUgSUQgdW5sZXNzIHNvIGRlZmluZWQgYnkgRFREL1NjaGVtYQorICAgKiBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gdGhlIERUTSBpbXBsZW1lbnRhdGlvbi4KKyAgICogSW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IGtub3cgd2hldGhlciBhdHRyaWJ1dGVzIGFyZSBvZiB0eXBlIElEIG9yCisgICAqIG5vdCBhcmUgZXhwZWN0ZWQgdG8gcmV0dXJuIDxjb2RlPkRUTS5OVUxMPC9jb2RlPi4KKyAgICoKKyAgICogPHA+JVJFVklFVyUgUHJlc3VtYWJseSBJRHMgYXJlIHN0aWxsIHNjb3BlZCB0byBhIHNpbmdsZSBkb2N1bWVudCwKKyAgICogYW5kIHRoaXMgb3BlcmF0aW9uIHNlYXJjaGVzIG9ubHkgd2l0aGluIGEgc2luZ2xlIGRvY3VtZW50LCByaWdodD8KKyAgICogV291bGRuJ3Qgd2FudCBjb2xsaXNpb25zIGJldHdlZW4gRFRNcyBpbiB0aGUgc2FtZSBwcm9jZXNzLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIGVsZW1lbnRJZCBUaGUgdW5pcXVlIDxjb2RlPmlkPC9jb2RlPiB2YWx1ZSBmb3IgYW4gZWxlbWVudC4KKyAgICogQHJldHVybiBUaGUgaGFuZGxlIG9mIHRoZSBtYXRjaGluZyBlbGVtZW50LgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGludCBnZXRFbGVtZW50QnlJZChTdHJpbmcgZWxlbWVudElkKTsKKworICAvKioKKyAgICogVGhlIGdldFVucGFyc2VkRW50aXR5VVJJIGZ1bmN0aW9uIHJldHVybnMgdGhlIFVSSSBvZiB0aGUgdW5wYXJzZWQKKyAgICogZW50aXR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBzYW1lIGRvY3VtZW50IGFzIHRoZSBjb250ZXh0CisgICAqIG5vZGUgKHNlZSBbMy4zIFVucGFyc2VkIEVudGl0aWVzXSkuIEl0IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZgorICAgKiB0aGVyZSBpcyBubyBzdWNoIGVudGl0eS4KKyAgICogPHA+CisgICAqIFhNTCBwcm9jZXNzb3JzIG1heSBjaG9vc2UgdG8gdXNlIHRoZSBTeXN0ZW0gSWRlbnRpZmllciAoaWYgb25lCisgICAqIGlzIHByb3ZpZGVkKSB0byByZXNvbHZlIHRoZSBlbnRpdHksIHJhdGhlciB0aGFuIHRoZSBVUkkgaW4gdGhlCisgICAqIFB1YmxpYyBJZGVudGlmaWVyLiBUaGUgZGV0YWlscyBhcmUgZGVwZW5kZW50IG9uIHRoZSBwcm9jZXNzb3IsIGFuZAorICAgKiB3ZSB3b3VsZCBoYXZlIHRvIHN1cHBvcnQgc29tZSBmb3JtIG9mIHBsdWctaW4gcmVzb2x2ZXIgdG8gaGFuZGxlCisgICAqIHRoaXMgcHJvcGVybHkuIEN1cnJlbnRseSwgd2Ugc2ltcGx5IHJldHVybiB0aGUgU3lzdGVtIElkZW50aWZpZXIgaWYKKyAgICogcHJlc2VudCwgYW5kIGhvcGUgdGhhdCBpdCBhIHVzYWJsZSBVUkkgb3IgdGhhdCBvdXIgY2FsbGVyIGNhbgorICAgKiBtYXAgaXQgdG8gb25lLgorICAgKiBUT0RPOiBSZXNvbHZlIFB1YmxpYyBJZGVudGlmaWVycy4uLiBvciBjb25zaWRlciBjaGFuZ2luZyBmdW5jdGlvbiBuYW1lLgorICAgKiA8cD4KKyAgICogSWYgd2UgZmluZCBhIHJlbGF0aXZlIFVSSQorICAgKiByZWZlcmVuY2UsIFhNTCBleHBlY3RzIGl0IHRvIGJlIHJlc29sdmVkIGluIHRlcm1zIG9mIHRoZSBiYXNlIFVSSQorICAgKiBvZiB0aGUgZG9jdW1lbnQuIFRoZSBET00gZG9lc24ndCBkbyB0aGF0IGZvciB1cywgYW5kIGl0IGlzbid0CisgICAqIGVudGlyZWx5IGNsZWFyIHdoZXRoZXIgdGhhdCBzaG91bGQgYmUgZG9uZSBoZXJlOyBjdXJyZW50bHkgdGhhdCdzCisgICAqIHB1c2hlZCB1cCB0byBhIGhpZ2hlciBsZXZlbCBvZiBvdXIgYXBwbGljYXRpb24uIChOb3RlIHRoYXQgRE9NIExldmVsCisgICAqIDEgZGlkbid0IHN0b3JlIHRoZSBkb2N1bWVudCdzIGJhc2UgVVJJLikKKyAgICogVE9ETzogQ29uc2lkZXIgcmVzb2x2aW5nIFJlbGF0aXZlIFVSSXMuCisgICAqIDxwPgorICAgKiAoVGhlIERPTSdzIHN0YXRlbWVudCB0aGF0ICJBbiBYTUwgcHJvY2Vzc29yIG1heSBjaG9vc2UgdG8KKyAgICogY29tcGxldGVseSBleHBhbmQgZW50aXRpZXMgYmVmb3JlIHRoZSBzdHJ1Y3R1cmUgbW9kZWwgaXMgcGFzc2VkCisgICAqIHRvIHRoZSBET00iIHJlZmVycyBvbmx5IHRvIHBhcnNlZCBlbnRpdGllcywgbm90IHVucGFyc2VkLCBhbmQgaGVuY2UKKyAgICogZG9lc24ndCBhZmZlY3QgdGhpcyBmdW5jdGlvbi4pCisgICAqCisgICAqIEBwYXJhbSBuYW1lIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIEVudGl0eSBOYW1lIG9mIHRoZSB1bnBhcnNlZAorICAgKiBlbnRpdHkuCisgICAqCisgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSSSBvZiB0aGUgVW5wYXJzZWQgRW50aXR5LCBvciBhbgorICAgKiBlbXB0eSBzdHJpbmcgaWYgbm8gc3VjaCBlbnRpdHkgZXhpc3RzLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRVbnBhcnNlZEVudGl0eVVSSShTdHJpbmcgbmFtZSk7CisKKyAgLy8gPT09PT09PT09PT09PT0gQm9vbGVhbiBtZXRob2RzID09PT09PT09PT09PT09PT0KKworICAvKioKKyAgICogUmV0dXJuIHRydWUgaWYgdGhlIHhzbDpzdHJpcC1zcGFjZSBvciB4c2w6cHJlc2VydmUtc3BhY2Ugd2FzIHByb2Nlc3NlZAorICAgKiBkdXJpbmcgY29uc3RydWN0aW9uIG9mIHRoZSBEVE0gZG9jdW1lbnQuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIERUTSBzdXBwb3J0cyBwcmVzdHJpcHBpbmcuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1ByZVN0cmlwcGluZygpCisgIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBGaWd1cmUgb3V0IHdoZXRoZXIgbm9kZUhhbmRsZTIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgYmVpbmcgbGF0ZXIKKyAgICogaW4gdGhlIGRvY3VtZW50IHRoYW4gbm9kZUhhbmRsZTEsIGluIERvY3VtZW50IE9yZGVyIGFzIGRlZmluZWQKKyAgICogYnkgdGhlIFhQYXRoIG1vZGVsLiBUaGlzIG1heSBub3QgYWdyZWUgd2l0aCB0aGUgb3JkZXJpbmcgZGVmaW5lZAorICAgKiBieSBvdGhlciBYTUwgYXBwbGljYXRpb25zLgorICAgKiA8cD4KKyAgICogVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUgb3JkZXJpbmcgaXNuJ3QgZGVmaW5lZCwgYW5kIG5laXRoZXIgYXJlCisgICAqIHRoZSByZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gLS0gdGhvdWdoIHdlJ2xsIGdlbmVyYWxseSByZXR1cm4gdHJ1ZS4KKyAgICoKKyAgICogVE9ETzogTWFrZSBzdXJlIHRoaXMgZG9lcyB0aGUgcmlnaHQgdGhpbmcgd2l0aCBhdHRyaWJ1dGUgbm9kZXMhISEKKyAgICoKKyAgICogQHBhcmFtIG5vZGUxIERPTSBOb2RlIHRvIHBlcmZvcm0gcG9zaXRpb24gY29tcGFyaXNvbiBvbi4KKyAgICogQHBhcmFtIG5vZGUyIERPTSBOb2RlIHRvIHBlcmZvcm0gcG9zaXRpb24gY29tcGFyaXNvbiBvbiAuCisgICAqCisgICAqIE5FRURTRE9DIEBwYXJhbSBub2RlSGFuZGxlMQorICAgKiBORUVEU0RPQyBAcGFyYW0gbm9kZUhhbmRsZTIKKyAgICoKKyAgICogQHJldHVybiBmYWxzZSBpZiBub2RlMiBjb21lcyBiZWZvcmUgbm9kZTEsIG90aGVyd2lzZSByZXR1cm4gdHJ1ZS4KKyAgICogWW91IGNhbiB0aGluayBvZiB0aGlzIGFzCisgICAqIDxjb2RlPihub2RlMS5kb2N1bWVudE9yZGVyUG9zaXRpb24gJmx0Oz0gbm9kZTIuZG9jdW1lbnRPcmRlclBvc2l0aW9uKTwvY29kZT4uCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc05vZGVBZnRlcihpbnQgbm9kZUhhbmRsZTEsIGludCBub2RlSGFuZGxlMikKKyAgeworCisgICAgaW50IGluZGV4MSA9IG5vZGVIYW5kbGUxICYgbV9tYXNrOworICAgIGludCBpbmRleDIgPSBub2RlSGFuZGxlMiAmIG1fbWFzazsKKworICAgIHJldHVybiBpbmRleDEgPD0gaW5kZXgyOworICB9CisKKyAgLyoqCisgICAqICAgICAyLiBbZWxlbWVudCBjb250ZW50IHdoaXRlc3BhY2VdIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgICAqICAgICAgICBjaGFyYWN0ZXIgaXMgd2hpdGUgc3BhY2UgYXBwZWFyaW5nIHdpdGhpbiBlbGVtZW50IGNvbnRlbnQgKHNlZSBbWE1MXSwKKyAgICogICAgICAgIDIuMTAgIldoaXRlIFNwYWNlIEhhbmRsaW5nIikuIE5vdGUgdGhhdCB2YWxpZGF0aW5nIFhNTCBwcm9jZXNzb3JzIGFyZQorICAgKiAgICAgICAgcmVxdWlyZWQgYnkgWE1MIDEuMCB0byBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24uIElmIHRoZXJlIGlzIG5vCisgICAqICAgICAgICBkZWNsYXJhdGlvbiBmb3IgdGhlIGNvbnRhaW5pbmcgZWxlbWVudCwgdGhpcyBwcm9wZXJ0eSBoYXMgbm8gdmFsdWUgZm9yCisgICAqICAgICAgICB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzLiBJZiBubyBkZWNsYXJhdGlvbiBoYXMgYmVlbiByZWFkLCBidXQgdGhlIFthbGwKKyAgICogICAgICAgIGRlY2xhcmF0aW9ucyBwcm9jZXNzZWRdIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbiBpdGVtIGlzCisgICAqICAgICAgICBmYWxzZSAoc28gdGhlcmUgbWF5IGJlIGFuIHVucmVhZCBkZWNsYXJhdGlvbiksIHRoZW4gdGhlIHZhbHVlIG9mIHRoaXMKKyAgICogICAgICAgIHByb3BlcnR5IGlzIHVua25vd24gZm9yIHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMuIEl0IGlzIGFsd2F5cyBmYWxzZSBmb3IKKyAgICogICAgICAgIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHdoaXRlIHNwYWNlLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSB0aGUgbm9kZSBJRC4KKyAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hhcmFjdGVyIGRhdGEgaXMgd2hpdGVzcGFjZTsKKyAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNDaGFyYWN0ZXJFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoaW50IG5vZGVIYW5kbGUpCisgIHsKKworICAgIC8vICVUQkQlCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLyoqCisgICAqICAgIDEwLiBbYWxsIGRlY2xhcmF0aW9ucyBwcm9jZXNzZWRdIFRoaXMgcHJvcGVydHkgaXMgbm90IHN0cmljdGx5IHNwZWFraW5nCisgICAqICAgICAgICBwYXJ0IG9mIHRoZSBpbmZvc2V0IG9mIHRoZSBkb2N1bWVudC4gUmF0aGVyIGl0IGlzIGFuIGluZGljYXRpb24gb2YKKyAgICogICAgICAgIHdoZXRoZXIgdGhlIHByb2Nlc3NvciBoYXMgcmVhZCB0aGUgY29tcGxldGUgRFRELiBJdHMgdmFsdWUgaXMgYQorICAgKiAgICAgICAgYm9vbGVhbi4gSWYgaXQgaXMgZmFsc2UsIHRoZW4gY2VydGFpbiBwcm9wZXJ0aWVzIChpbmRpY2F0ZWQgaW4gdGhlaXIKKyAgICogICAgICAgIGRlc2NyaXB0aW9ucyBiZWxvdykgbWF5IGJlIHVua25vd24uIElmIGl0IGlzIHRydWUsIHRob3NlIHByb3BlcnRpZXMKKyAgICogICAgICAgIGFyZSBuZXZlciB1bmtub3duLgorICAgKgorICAgKiBAcGFyYW0gdGhlIGRvY3VtZW50IGhhbmRsZQorICAgKgorICAgKiBAcGFyYW0gZG9jdW1lbnRIYW5kbGUgQSBub2RlIGhhbmRsZSB0aGF0IG11c3QgaWRlbnRpZnkgYSBkb2N1bWVudC4KKyAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgZGVjbGFyYXRpb25zIHdlcmUgcHJvY2Vzc2VkOworICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50QWxsRGVjbGFyYXRpb25zUHJvY2Vzc2VkKGludCBkb2N1bWVudEhhbmRsZSkKKyAgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqICAgICA1LiBbc3BlY2lmaWVkXSBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIHdhcyBhY3R1YWxseQorICAgKiAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBzdGFydC10YWcgb2YgaXRzIGVsZW1lbnQsIG9yIHdhcyBkZWZhdWx0ZWQgZnJvbSB0aGUKKyAgICogICAgICAgIERURC4KKyAgICoKKyAgICogQHBhcmFtIHRoZSBhdHRyaWJ1dGUgaGFuZGxlCisgICAqCisgICAqIE5FRURTRE9DIEBwYXJhbSBhdHRyaWJ1dGVIYW5kbGUKKyAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQ7CisgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHdhcyBkZWZhdWx0ZWQuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0F0dHJpYnV0ZVNwZWNpZmllZChpbnQgYXR0cmlidXRlSGFuZGxlKTsKKworICAvLyA9PT09PT09PT09IERpcmVjdCBTQVggRGlzcGF0Y2gsIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMgPT09PT09PT0KKworICAvKioKKyAgICogRGlyZWN0bHkgY2FsbCB0aGUKKyAgICogY2hhcmFjdGVycyBtZXRob2Qgb24gdGhlIHBhc3NlZCBDb250ZW50SGFuZGxlciBmb3IgdGhlCisgICAqIHN0cmluZy12YWx1ZSBvZiB0aGUgZ2l2ZW4gbm9kZSAoc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI2RhdGEtbW9kZWwKKyAgICogZm9yIHRoZSBkZWZpbml0aW9uIG9mIGEgbm9kZSdzIHN0cmluZy12YWx1ZSkuIE11bHRpcGxlIGNhbGxzIHRvIHRoZQorICAgKiBDb250ZW50SGFuZGxlcidzIGNoYXJhY3RlcnMgbWV0aG9kcyBtYXkgd2VsbCBvY2N1ciBmb3IgYSBzaW5nbGUgY2FsbCB0bworICAgKiB0aGlzIG1ldGhvZC4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgSUQuCisgICAqIEBwYXJhbSBjaCBBIG5vbi1udWxsIHJlZmVyZW5jZSB0byBhIENvbnRlbnRIYW5kbGVyLgorICAgKgorICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IHZvaWQgZGlzcGF0Y2hDaGFyYWN0ZXJzRXZlbnRzKAorICAgIGludCBub2RlSGFuZGxlLCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBjaCkKKyAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKyAgLyoqCisgICAqIERpcmVjdGx5IGNyZWF0ZSBTQVggcGFyc2VyIGV2ZW50cyBmcm9tIGEgc3VidHJlZS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgSUQuCisgICAqIEBwYXJhbSBjaCBBIG5vbi1udWxsIHJlZmVyZW5jZSB0byBhIENvbnRlbnRIYW5kbGVyLgorICAgKgorICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IHZvaWQgZGlzcGF0Y2hUb0V2ZW50cygKKyAgICBpbnQgbm9kZUhhbmRsZSwgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgY2gpCisgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBSZXR1cm4gYW4gRE9NIG5vZGUgZm9yIHRoZSBnaXZlbiBub2RlLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KKyAgICoKKyAgICogQHJldHVybiBBIG5vZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIERUTSBub2RlLgorICAgKi8KKyAgcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0Tm9kZShpbnQgbm9kZUhhbmRsZSkKKyAgeworICAgIHJldHVybiBuZXcgRFRNTm9kZVByb3h5KHRoaXMsIG5vZGVIYW5kbGUpOworICB9CisKKyAgLy8gPT09PSBDb25zdHJ1Y3Rpb24gbWV0aG9kcyAobWF5IG5vdCBiZSBzdXBwb3J0ZWQgYnkgc29tZSBpbXBsZW1lbnRhdGlvbnMhKSA9PT09PQorCisgIC8qKgorICAgKiBBcHBlbmQgYSBjaGlsZCB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgbm9kZQorICAgKiBpcyBhbHdheXMgY2xvbmVkIGlmIGl0IGlzIG93bmVkIGJ5IGFub3RoZXIgZG9jdW1lbnQuCisgICAqCisgICAqIDxwPiVSRVZJRVclICJFbmQgb2YgdGhlIGRvY3VtZW50IiBuZWVkcyB0byBiZSBkZWZpbmVkIG1vcmUgY2xlYXJseS4KKyAgICogRG9lcyBpdCBiZWNvbWUgdGhlIGxhc3QgY2hpbGQgb2YgdGhlIERvY3VtZW50PyBPZiB0aGUgcm9vdCBlbGVtZW50PzwvcD4KKyAgICoKKyAgICogQHBhcmFtIG5ld0NoaWxkIE11c3QgYmUgYSB2YWxpZCBuZXcgbm9kZSBoYW5kbGUuCisgICAqIEBwYXJhbSBjbG9uZSB0cnVlIGlmIHRoZSBjaGlsZCBzaG91bGQgYmUgY2xvbmVkIGludG8gdGhlIGRvY3VtZW50LgorICAgKiBAcGFyYW0gY2xvbmVEZXB0aCBpZiB0aGUgY2xvbmUgYXJndW1lbnQgaXMgdHJ1ZSwgc3BlY2lmaWVzIHRoYXQgdGhlCisgICAqICAgICAgICAgICAgICAgICAgIGNsb25lIHNob3VsZCBpbmNsdWRlIGFsbCBpdCdzIGNoaWxkcmVuLgorICAgKi8KKyAgcHVibGljIHZvaWQgYXBwZW5kQ2hpbGQoaW50IG5ld0NoaWxkLCBib29sZWFuIGNsb25lLCBib29sZWFuIGNsb25lRGVwdGgpCisgIHsKKyAgICBlcnJvcigiYXBwZW5kQ2hpbGQgbm90IHlldCBzdXBwb3J0ZWQhIik7CisgIH0KKworICAvKioKKyAgICogQXBwZW5kIGEgdGV4dCBub2RlIGNoaWxkIHRoYXQgd2lsbCBiZSBjb25zdHJ1Y3RlZCBmcm9tIGEgc3RyaW5nLAorICAgKiB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4KKyAgICoKKyAgICogPHA+JVJFVklFVyUgIkVuZCBvZiB0aGUgZG9jdW1lbnQiIG5lZWRzIHRvIGJlIGRlZmluZWQgbW9yZSBjbGVhcmx5LgorICAgKiBEb2VzIGl0IGJlY29tZSB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgRG9jdW1lbnQ/IE9mIHRoZSByb290IGVsZW1lbnQ/PC9wPgorICAgKgorICAgKiBAcGFyYW0gc3RyIE5vbi1udWxsIHJldmVyZW5jZSB0byBhIHN0cmluZy4KKyAgICovCisgIHB1YmxpYyB2b2lkIGFwcGVuZFRleHRDaGlsZChTdHJpbmcgc3RyKQorICB7CisgICAgZXJyb3IoImFwcGVuZFRleHRDaGlsZCBub3QgeWV0IHN1cHBvcnRlZCEiKTsKKyAgfQorCisgIC8qKgorICAgKiBTaW1wbGUgZXJyb3IgZm9yIGFzc2VydHMgYW5kIHRoZSBsaWtlLgorICAgKgorICAgKiBORUVEU0RPQyBAcGFyYW0gbXNnCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBlcnJvcihTdHJpbmcgbXNnKQorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihtc2cpOworICB9CisKKyAgLyoqCisgICAqIEZpbmQgb3V0IHdoZXRoZXIgb3Igbm90IHRvIHN0cmlwIHdoaXNwYWNlIG5vZGVzLgorICAgKgorICAgKgorICAgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRvIHN0cmlwIHdoaXNwYWNlIG5vZGVzLgorICAgKi8KKyAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U2hvdWxkU3RyaXBXaGl0ZXNwYWNlKCkKKyAgeworICAgIHJldHVybiBtX3Nob3VsZFN0cmlwV1M7CisgIH0KKworICAvKioKKyAgICogU2V0IHdoZXRoZXIgdG8gc3RyaXAgd2hpdGVzcGFjZXMgYW5kIHB1c2ggaW4gY3VycmVudCB2YWx1ZSBvZgorICAgKiBtX3Nob3VsZFN0cmlwV1MgaW4gbV9zaG91bGRTdHJpcFdoaXRlc3BhY2VTdGFjay4KKyAgICoKKyAgICogQHBhcmFtIHNob3VsZFN0cmlwIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHN0cmlwIHdoaXRlc3BhY2Ugbm9kZXMKKyAgICovCisgIHByb3RlY3RlZCB2b2lkIHB1c2hTaG91bGRTdHJpcFdoaXRlc3BhY2UoYm9vbGVhbiBzaG91bGRTdHJpcCkKKyAgeworCisgICAgbV9zaG91bGRTdHJpcFdTID0gc2hvdWxkU3RyaXA7CisKKyAgICBpZiAobnVsbCAhPSBtX3Nob3VsZFN0cmlwV2hpdGVzcGFjZVN0YWNrKQorICAgICAgbV9zaG91bGRTdHJpcFdoaXRlc3BhY2VTdGFjay5wdXNoKHNob3VsZFN0cmlwKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgd2hldGhlciB0byBzdHJpcCB3aGl0ZXNwYWNlcyBhdCB0aGlzIHBvaW50IGJ5IHBvcHBpbmcgb3V0CisgICAqIG1fc2hvdWxkU3RyaXBXaGl0ZXNwYWNlU3RhY2suCisgICAqCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBwb3BTaG91bGRTdHJpcFdoaXRlc3BhY2UoKQorICB7CisgICAgaWYgKG51bGwgIT0gbV9zaG91bGRTdHJpcFdoaXRlc3BhY2VTdGFjaykKKyAgICAgIG1fc2hvdWxkU3RyaXBXUyA9IG1fc2hvdWxkU3RyaXBXaGl0ZXNwYWNlU3RhY2sucG9wQW5kVG9wKCk7CisgIH0KKworICAvKioKKyAgICogU2V0IHdoZXRoZXIgdG8gc3RyaXAgd2hpdGVzcGFjZXMgYW5kIHNldCB0aGUgdG9wIG9mIHRoZSBzdGFjayB0bworICAgKiB0aGUgY3VycmVudCB2YWx1ZSBvZiBtX3Nob3VsZFN0cmlwV1MuCisgICAqCisgICAqCisgICAqIEBwYXJhbSBzaG91bGRTdHJpcCBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBzdHJpcCB3aGl0ZXNwYWNlIG5vZGVzCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBzZXRTaG91bGRTdHJpcFdoaXRlc3BhY2UoYm9vbGVhbiBzaG91bGRTdHJpcCkKKyAgeworCisgICAgbV9zaG91bGRTdHJpcFdTID0gc2hvdWxkU3RyaXA7CisKKyAgICBpZiAobnVsbCAhPSBtX3Nob3VsZFN0cmlwV2hpdGVzcGFjZVN0YWNrKQorICAgICAgbV9zaG91bGRTdHJpcFdoaXRlc3BhY2VTdGFjay5zZXRUb3Aoc2hvdWxkU3RyaXApOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTURvY3VtZW50SW1wbC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9EVE1Eb2N1bWVudEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTJjNjgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9EVE1Eb2N1bWVudEltcGwuamF2YQpAQCAtMCwwICsxLDIzNjMgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0CisgKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKKyAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cworICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5kdG07CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworLy9pbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uQ2h1bmtlZEludEFycmF5OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLkZhc3RTdHJpbmdCdWZmZXI7CisKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MU3RyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZ0ZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIERUTSBkb2N1bWVudCBpbnRlcmZhY2UuICBJdCByZWNlaXZlcworICogcmVxdWVzdHMgZnJvbSBhbiBYTUwgY29udGVudCBoYW5kbGVyIHNpbWlsYXIgdG8gdGhhdCBvZiBhbiBYTUwgRE9NIG9yIFNBWCBwYXJzZXIKKyAqIHRvIHN0b3JlIGluZm9ybWF0aW9uIGZyb20gdGhlIHhtbCBkb2N1bWVudCBpbiBhbiBhcnJheSBiYXNlZAorICogZHRtIHRhYmxlIHN0cnVjdHVyZS4gIFRoaXMgaW5mb3JtdGlvbiBpcyB1c2VkIGxhdGVyIGZvciBkb2N1bWVudCBuYXZpZ2F0aW9uLAorICogcXVlcnksIGFuZCBTQVggZXZlbnQgZGlzcGF0Y2ggZnVuY3Rpb25zLiBUaGUgRFRNIGNhbiBhbHNvIGJlIHVzZWQgZGlyZWN0bHkgYXMgYQorICogZG9jdW1lbnQgY29tcG9zaXRpb24gbW9kZWwgZm9yIGFuIGFwcGxpY2F0aW9uLiAgVGhlIHJlcXVlc3RzIHJlY2VpdmVkIGFyZToKKyAqIDx1bD4KKyAqIDxsaT5pbml0aWF0aW5nIERUTSB0byBzZXQgdGhlIGRvYyBoYW5kbGU8L2xpPgorICogPGxpPnJlc2V0dGluZyBEVE0gZm9yIGRhdGEgc3RydWN0dXJlIHJldXNlPC9saT4KKyAqIDxsaT5oaW50aW5nIHRoZSBlbmQgb2YgZG9jdW1lbnQgdG8gYWRqdXN0IHRoZSBlbmQgb2YgZGF0YSBzdHJ1Y3R1cmUgcG9pbnRlcnM8L2xpPgorICogPGxpPmNyZWF0ZW5vZGVzIChlbGVtZW50LCBjb21tZW50LCB0ZXh0LCBhdHRyaWJ1dGUsIC4uLi4pPC9saT4KKyAqIDxsaT5oaW50aW5nIHRoZSBlbmQgb2YgYW4gZWxlbWVudCB0byBwYXRjaCBwYXJlbnQgYW5kIHNpYmxpbmdzPGxpPgorICogPGxpPnNldHRpbmcgYXBwbGljYXRpb24gcHJvdmlkZWQgc3ltYm9sIG5hbWUgc3RyaW5ncG9vbCBkYXRhIHN0cnVjdHVyZXM8L2xpPgorICogPC91bD4KKyAqIDxwPlN0YXRlOiBJbiBwcm9ncmVzcyEhPC9wPgorICoKKyAqICVSRVZJRVclIEkgX3RoaW5rXyB0aGUgU0FYIGNvbnZlbnRpb24gaXMgdGhhdCAibm8gbmFtZXNwYWNlIiBpcyBleHByZXNzZWQKKyAqIGFzICIiIHJhdGhlciB0aGFuIGFzIG51bGwgKHdoaWNoIGlzIHRoZSBET00ncyBjb252ZW50aW9uKS4gV2hhdCBzaG91bGQgCisgKiBEVE0gZXhwZWN0PyBXaGF0IHNob3VsZCBpdCBkbyB3aXRoIHRoZSBvdGhlcj8KKyAqCisgKiA8cD5PcmlnaW46IHRoZSBpbXBsZW1lbnRpb24gaXMgYSBjb21wb3NpdGUgbG9naWMgYmFzZWQgb24gdGhlIERUTSBvZiBYYWxhbkoxIGFuZAorICogICAgIERvY0ltcGwsIERvY3VtZW50SW1wbCwgRWxlbWVudEltcGwsIFRleHRJbXBsLCBldGMuIG9mIFhhbGFuSjI8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBEVE1Eb2N1bWVudEltcGwKK2ltcGxlbWVudHMgRFRNLCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciwgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyCit7CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIGxvd2VyIGJpdHMgdXNlZCB0byByZXByZXNlbnQgbm9kZSBpbmRleC4KKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIERPQ0hBTkRMRV9TSElGVCA9IDIwOworICAgICAgICAvLyBNYXNrcyB0aGUgbG93ZXIgb3JkZXIgb2Ygbm9kZSBoYW5kbGUuCisgICAgICAgIC8vIFNhbWUgYXMge0BsaW5rIERUTUNvbnN0cnVjdG9yLklERU5UX05PREVfREVGQVVMVH0KKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTk9ERUhBTkRMRV9NQVNLID0gKDEgPDwgKERPQ0hBTkRMRV9TSElGVCArIDEpKSAtIDE7IAorICAgICAgICAvLyBNYXNrcyB0aGUgaGlnaGVyIG9yZGVyIERvY3VtZW50IGhhbmRsZQorICAgICAgICAvLyBTYW1lIGFzIHtAbGluayBEVE1Db25zdHJ1Y3Rvci5JREVOVF9ET0NfREVGQVVMVH0KKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRE9DSEFORExFX01BU0sgPSAtMSAtIE5PREVIQU5ETEVfTUFTSzsKKworICAgICAgICBpbnQgbV9kb2NIYW5kbGUgPSBOVUxMOwkJIC8vIG1hc2tlZCBkb2N1bWVudCBoYW5kbGUgZm9yIHRoaXMgZHRtIGRvY3VtZW50CisgICAgICAgIGludCBtX2RvY0VsZW1lbnQgPSBOVUxMOwkgLy8gbm9kZUhhbmRsZSB0byB0aGUgcm9vdCBvZiB0aGUgYWN0dWFsIGR0bSBkb2MgY29udGVudAorCisgICAgICAgIC8vIENvbnRleHQgZm9yIHBhcnNlLWFuZC1hcHBlbmQgb3BlcmF0aW9ucworICAgICAgICBpbnQgY3VycmVudFBhcmVudCA9IDA7CQkJLy8gY3VycmVudCBwYXJlbnQgLSBkZWZhdWx0IGlzIGRvY3VtZW50IHJvb3QKKyAgICAgICAgaW50IHByZXZpb3VzU2libGluZyA9IDA7CQkvLyBwcmV2aW91cyBzaWJsaW5nIC0gbm8gcHJldmlvdXMgc2libGluZworICAgICAgICBwcm90ZWN0ZWQgaW50IG1fY3VycmVudE5vZGUgPSAtMTsJCS8vIGN1cnJlbnQgbm9kZQorCisgICAgICAgIC8vIFRoZSB0cmVlIHVuZGVyIGNvbnN0cnVjdGlvbiBjYW4gaXRzZWxmIGJlIHVzZWQgYXMKKyAgICAgICAgLy8gdGhlIGVsZW1lbnQgc3RhY2ssIHNvIG1fZWxlbVN0YWNrIGlzbid0IG5lZWRlZC4KKyAgICAgICAgLy9wcm90ZWN0ZWQgU3RhY2sgbV9lbGVtU3RhY2sgPSBuZXcgU3RhY2soKTsJIC8vIGVsZW1lbnQgc3RhY2sKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJldmlvdXNTaWJsaW5nV2FzUGFyZW50ID0gZmFsc2U7CisgICAgICAgIC8vIExvY2FsIGNhY2hlIGZvciByZWNvcmQtYXQtYS10aW1lIGZldGNoCisgICAgICAgIGludCBnb3RzbG90W10gPSBuZXcgaW50WzRdOworCisgICAgICAgIC8vIGVuZERvY3VtZW50IHJlY2lldmVkPworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworICAgICAgICBib29sZWFuIG1faXNFcnJvciA9IGZhbHNlOworCisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgLyoqIFRoZSBkb2N1bWVudCBiYXNlIFVSSS4gKi8KKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBtX2RvY3VtZW50QmFzZVVSSTsKKworICAvKiogSWYgd2UncmUgYnVpbGRpbmcgdGhlIG1vZGVsIGluY3JlbWVudGFsbHkgb24gZGVtYW5kLCB3ZSBuZWVkIHRvCisgICAqIGJlIGFibGUgdG8gdGVsbCB0aGUgc291cmNlIHdoZW4gdG8gc2VuZCB1cyBtb3JlIGRhdGEuCisgICAqCisgICAqIE5vdGUgdGhhdCBpZiB0aGlzIGhhcyBub3QgYmVlbiBzZXQsIGFuZCB5b3UgYXR0ZW1wdCB0byByZWFkIGFoZWFkCisgICAqIG9mIHRoZSBjdXJyZW50IGJ1aWxkIHBvaW50LCB3ZSdsbCBwcm9iYWJseSB0aHJvdyBhIG51bGwtcG9pbnRlcgorICAgKiBleGNlcHRpb24uIFdlIGNvdWxkIHRyeSB0byB3YWl0LWFuZC1yZXRyeSBpbnN0ZWFkLCBhcyBhIHZlcnkgcG9vcgorICAgKiBmYWxsYmFjaywgYnV0IHRoYXQgaGFzIGFsbCB0aGUga25vd24gcHJvYmxlbXMgd2l0aCBtdWx0aXRocmVhZGluZworICAgKiBvbiBtdWx0aXByb2Nlc3NvcnMgYW5kIHdlIERvbid0IFdhbnQgdG8gR28gVGhlcmUuCisgICAqIAorICAgKiBAc2VlIHNldENvcm91dGluZVBhcnNlcgorICAgKi8KKyAgcHJpdmF0ZSBDb3JvdXRpbmVQYXJzZXIgbV9jb3JvdXRpbmVQYXJzZXI9bnVsbDsKKworICAvKiogSWYgd2UncmUgYnVpbGRpbmcgdGhlIG1vZGVsIGluY3JlbWVudGFsbHkgb24gZGVtYW5kLCB3ZSBuZWVkIHRvCisgICAqIGJlIGFibGUgdG8gdGVsbCB0aGUgc291cmNlIHdobyB0byByZXR1cm4gdGhlIGRhdGEgdG8uCisgICAqCisgICAqIE5vdGUgdGhhdCBpZiB0aGlzIGhhcyBub3QgYmVlbiBzZXQsIGFuZCB5b3UgYXR0ZW1wdCB0byByZWFkIGFoZWFkCisgICAqIG9mIHRoZSBjdXJyZW50IGJ1aWxkIHBvaW50LCB3ZSdsbCBwcm9iYWJseSB0aHJvdyBhIE1ldGhvZE5vdEZvdW5kCisgICAqIGV4Y2VwdGlvbi4gV2UgY291bGQgdHJ5IHRvIHdhaXQtYW5kLXJldHJ5IGluc3RlYWQsIGFzIGEgdmVyeSBwb29yCisgICAqIGZhbGxiYWNrLCBidXQgdGhhdCBoYXMgYWxsIHRoZSBrbm93biBwcm9ibGVtcyB3aXRoIG11bHRpdGhyZWFkaW5nCisgICAqIG9uIG11bHRpcHJvY2Vzc29ycyBhbmQgd2UgRG9uJ3QgV2FudCB0byBHbyBUaGVyZS4KKyAgICogCisgICAqIEBzZWUgc2V0Q29yb3V0aW5lUGFyc2VyCisgICAqLworICBwcml2YXRlIGludCBtX2FwcENvcm91dGluZUlEPS0xOworCisgICAgICAgIC8vID09PT09PT09PSBEVE0gZGF0YSBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zLiA9PT09PT09PT09PT09PQorCisgICAgICAgIC8vIG5vZGVzIGFycmF5OiBpbnRlZ2VyIGFycmF5IGJsb2NrcyB0byBob2xkIHRoZSBmaXJzdCBsZXZlbCByZWZlcmVuY2Ugb2YgdGhlIG5vZGVzLAorICAgICAgICAvLyBlYWNoIHJlZmVyZW5jZSBzbG90IGlzIGFkZHJlc3NlZCBieSBhIG5vZGVIYW5kbGUgaW5kZXggdmFsdWUuCisgICAgICAgIC8vIEFzc3VtZXMgaW5kaWNlcyBhcmUgbm90IGxhcmdlciB0aGFuIHtAbGluayBOT0RFSEFORExFX01BU0t9CisgICAgICAgIC8vICh7QGxpbmsgRE9DSEFORExFX1NISUZUfSBiaXRzKS4KKyAgICAgICAgQ2h1bmtlZEludEFycmF5IG5vZGVzID0gbmV3IENodW5rZWRJbnRBcnJheSg0KTsKKworICAgICAgICAvLyB0ZXh0L2NvbW1lbnQgdGFibGU6IHN0cmluZyBidWZmZXIgdG8gaG9sZCB0aGUgdGV4dCBzdHJpbmcgdmFsdWVzIG9mIHRoZSBkb2N1bWVudCwKKyAgICAgICAgLy8gZWFjaCBvZiB3aGljaCBpcyBhZGRyZXNzZWQgYnkgdGhlIGFic29sdXRlIG9mZnNldCBhbmQgbGVuZ3RoIGluIHRoZSBidWZmZXIKKyAgICAgICAgcHJpdmF0ZSBGYXN0U3RyaW5nQnVmZmVyIG1fY2hhciA9IG5ldyBGYXN0U3RyaW5nQnVmZmVyKCk7CisgICAgICAgIC8vIFN0YXJ0IG9mIHN0cmluZyBjdXJyZW50bHkgYmVpbmcgYWNjdW11bGF0ZWQgaW50byBtX2NoYXI7CisgICAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIHRoZSBzdHJpbmcgbWF5IGJlIGFwcGVuZGVkIGluIHNldmVyYWwgY2h1bmtzLgorICAgICAgICBwcml2YXRlIGludCBtX2NoYXJfY3VycmVudF9zdGFydD0wOworCisgICAgICAgIC8vICVUQkQlIElOSVRJQUxJWkFUSU9OL1NUQVJUVVAgSVNTVUVTCisgICAgICAgIC8vIC0tIFNob3VsZCB3ZSByZWFsbHkgYmUgY3JlYXRpbmcgdGhlc2UsIG9yIHNob3VsZCB0aGV5IGJlCisgICAgICAgIC8vIHBhc3NlZCBpbiBmcm9tIG91dHNpZGU/IFNjb3R0IHdhbnQgdG8gYmUgYWJsZSB0byBzaGFyZQorICAgICAgICAvLyBwb29scyBhY3Jvc3MgbXVsdGlwbGUgZG9jdW1lbnRzLCBzbyBzZXR0aW5nIHRoZW0gaGVyZSBpcworICAgICAgICAvLyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IGRlZmF1bHQuCisgICAgICAgIHByaXZhdGUgRFRNU3RyaW5nUG9vbCBtX2xvY2FsTmFtZXMgPSBuZXcgRFRNU3RyaW5nUG9vbCgpOworICAgICAgICBwcml2YXRlIERUTVN0cmluZ1Bvb2wgbV9uc05hbWVzID0gbmV3IERUTVN0cmluZ1Bvb2woKTsKKyAgICAgICAgcHJpdmF0ZSBEVE1TdHJpbmdQb29sIG1fcHJlZml4TmFtZXMgPSBuZXcgRFRNU3RyaW5nUG9vbCgpOworCisgICAgICAgIC8vICVUQkQlIElmIHdlIHVzZSB0aGUgY3VycmVudCBFeHBhbmRlZE5hbWVUYWJsZSBtYXBwZXIsIGl0CisgICAgICAgIC8vIG5lZWRzIHRvIGJlIGJvdW5kIHRvIHRoZSBOUyBhbmQgbG9jYWwgbmFtZSBwb29scy4gV2hpY2gKKyAgICAgICAgLy8gbWVhbnMgaXQgbmVlZHMgdG8gYXR0YWNoIHRvIHRoZW0gQUZURVIgd2UndmUgcmVzb2x2ZWQgdGhlaXIKKyAgICAgICAgLy8gc3RhcnR1cC4gT3IgaXQgbmVlZHMgdG8gYXR0YWNoIHRvIHRoaXMgZG9jdW1lbnQgYW5kCisgICAgICAgIC8vIHJldHJpZXZlIHRoZW0gZWFjaCB0aW1lLiBPciB0aGlzIG5lZWRzIHRvIGJlCisgICAgICAgIC8vIGFuIGludGVyZmFjZSBfaW1wbGVtZW50ZWRfIGJ5IHRoaXMgY2xhc3MuLi4gd2hpY2ggbWlnaHQgYmUgc2ltcGxlc3QhCisgICAgICAgIHByaXZhdGUgRXhwYW5kZWROYW1lVGFibGUgbV9leHBhbmRlZE5hbWVzPQorICAgICAgICAgICAgICAgIG5ldyBFeHBhbmRlZE5hbWVUYWJsZShtX2xvY2FsTmFtZXMsbV9uc05hbWVzKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBYTUxTdHJpbmdGYWN0b3J5IG1feHNmOworICAKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0IGEgRFRNLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZG9jdW1lbnROdW1iZXIgdGhlIElEIG51bWJlciBhc3NpZ25lZCB0byB0aGlzIGRvY3VtZW50LgorICAgICAgICAgKiBJdCB3aWxsIGJlIHNoaWZ0ZWQgdXAgaW50byB0aGUgaGlnaCBiaXRzIGFuZCByZXR1cm5lZCBhcyBwYXJ0IG9mCisgICAgICAgICAqIGFsbCBub2RlIElEIG51bWJlcnMsIHNvIHRob3NlIElEcyBpbmRpY2F0ZSB3aGljaCBkb2N1bWVudCB0aGV5CisgICAgICAgICAqIGNhbWUgZnJvbSBhcyB3ZWxsIGFzIGEgbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudC4gSXQgaXMgdGhlCisgICAgICAgICAqIERUTU1hbmFnZXIncyByZXNwb25zaWJpbGl0eSB0byBhc3NpZ24gYSB1bmlxdWUgbnVtYmVyIHRvIGVhY2gKKyAgICAgICAgICogZG9jdW1lbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRFRNRG9jdW1lbnRJbXBsKERUTU1hbmFnZXIgbWdyLCBpbnQgZG9jdW1lbnROdW1iZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERUTVdTRmlsdGVyIHdoaXRlU3BhY2VGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyaW5nRmFjdG9yeSB4c3RyaW5nZmFjdG9yeSl7CisgICAgICAgICAgICAgICAgaW5pdERvY3VtZW50KGRvY3VtZW50TnVtYmVyKTsJIC8vIGNsZWFyIG5vZGVzIGFuZCBkb2N1bWVudCBoYW5kbGUKKyAgICAgICAgICAgICAgICBtX3hzZiA9IHhzdHJpbmdmYWN0b3J5OworICAgICAgICB9CisKKyAgLyoqIEJpbmQgYSBDb3JvdXRpbmVQYXJzZXIgdG8gdGhpcyBEVE0uIElmIHdlIGRpc2NvdmVyIHdlIG5lZWQgbm9kZXMKKyAgICogdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBidWlsdCwgd2Ugd2lsbCBhc2sgdGhpcyBvYmplY3QgdG8gc2VuZCB1cyBtb3JlCisgICAqIGV2ZW50cywgYW5kIGl0IHdpbGwgbWFuYWdlIGludGVyYWN0aW9ucyB3aXRoIGl0cyBkYXRhIHNvdXJjZXMuCisgICAqCisgICAqIE5vdGUgdGhhdCB3ZSBkbyBub3QgYWN0dWFsbHkgYnVpbGQgdGhlIENvcm91dGluZVBhcnNlciwgc2luY2Ugd2UgZG9uJ3QKKyAgICoga25vdyB3aGF0IHNvdXJjZSBpdCdzIHJlYWRpbmcgZnJvbSwgd2hhdCB0aHJlYWQgdGhhdCBzb3VyY2Ugd2lsbCBydW4gaW4sCisgICAqIG9yIHdoZW4gaXQgd2lsbCBydW4uCisgICAqCisgICAqIEBwYXJhbSBjb3JvdXRpbmVQYXJzZXIgVGhlIHBhcnNlciB0aGF0IHdlIHdhbnQgdG8gcmVjaWV2ZSBldmVudHMgZnJvbQorICAgKiBvbiBkZW1hbmQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDb3JvdXRpbmVQYXJzZXIoQ29yb3V0aW5lUGFyc2VyIGNvcm91dGluZVBhcnNlcikKKyAgeworICAgIC8vIEVzdGFibGlzaCBjb3JvdXRpbmUgbGluayBzbyB3ZSBjYW4gcmVxdWVzdCBtb3JlIGRhdGEKKyAgICAvLworICAgIC8vIE5vdGU6IEl0J3MgcG9zc2libGUgdGhhdCBzb21lIHZlcnNpb25zIG9mIENvcm91dGluZVBhcnNlciBtYXkKKyAgICAvLyBub3QgYWN0dWFsbHkgdXNlIGEgQ29yb3V0aW5lTWFuYWdlciwgYW5kIGhlbmNlIG1heSBub3QgcmVxdWlyZQorICAgIC8vIHRoYXQgd2Ugb2J0YWluIGFuIEFwcGxpY2F0aW9uIENvcm91dGluZSBJRC4gKFRoaXMgcmVsaWVzIG9uIHRoZQorICAgIC8vIGNvcm91dGluZSB0cmFuc2FjdGlvbiBkZXRhaWxzIGhhdmluZyBiZWVuIGVuY2Fwc3VsYXRlZCBpbiB0aGUKKyAgICAvLyBDb3JvdXRpbmVQYXJzZXIuZG8uLi4oKSBtZXRob2RzLikKKyAgICBtX2Nvcm91dGluZVBhcnNlcj1jb3JvdXRpbmVQYXJzZXI7CisgICAgQ29yb3V0aW5lTWFuYWdlciBjbT1jb3JvdXRpbmVQYXJzZXIuZ2V0Q29yb3V0aW5lTWFuYWdlcigpOworICAgIGlmKGNtIT1udWxsKQorICAgICAgbV9hcHBDb3JvdXRpbmVJRD1jbS5jb19qb2luQ29yb3V0aW5lU2V0KC0xKTsKKworICAgIC8vIEVzdGFibGlzaCBTQVgtc3RyZWFtIGxpbmsgc28gd2UgY2FuIHJlY2VpdmUgdGhlIHJlcXVlc3RlZCBkYXRhCisgICAgY29yb3V0aW5lUGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOworICAgIGNvcm91dGluZVBhcnNlci5zZXRMZXhIYW5kbGVyKHRoaXMpOworCisgICAgLy8gQXJlIHRoZSBmb2xsb3dpbmcgcmVhbGx5IG5lZWRlZD8gY29yb3V0aW5lUGFyc2VyIGRvZXNuJ3QgeWV0CisgICAgLy8gc3VwcG9ydCB0aGVtLCBhbmQgdGhleSdyZSBtb3N0bHkgbm8tb3BzIGhlcmUuLi4KKyAgICAvL2Nvcm91dGluZVBhcnNlci5zZXRFcnJvckhhbmRsZXIodGhpcyk7CisgICAgLy9jb3JvdXRpbmVQYXJzZXIuc2V0RFRESGFuZGxlcih0aGlzKTsKKyAgICAvL2Nvcm91dGluZVBhcnNlci5zZXREZWNsSGFuZGxlcih0aGlzKTsKKyAgfQorICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyYXBwZXIgZm9yIENodW5rZWRJbnRBcnJheS5hcHBlbmQsIHRvIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZQorICAgICAgICAgKiBwcmV2aW91cyBzaWJsaW5nJ3MgIm5leHQiIHJlZmVyZW5jZSAoaWYgbmVjZXNzYXJ5KSBhbmQgcGVyaW9kaWNhbGx5CisgICAgICAgICAqIHdha2UgYSByZWFkZXIgd2hvIG1heSBoYXZlIGVuY291bnRlcmVkIGluY29tcGxldGUgZGF0YSBhbmQgZW50ZXJlZAorICAgICAgICAgKiBhIHdhaXQgc3RhdGUuCisgICAgICAgICAqIEBwYXJhbSB3MCBpbnQgQXMgaW4gQ2h1bmtlZEludEFycmF5LmFwcGVuZAorICAgICAgICAgKiBAcGFyYW0gdzEgaW50IEFzIGluIENodW5rZWRJbnRBcnJheS5hcHBlbmQKKyAgICAgICAgICogQHBhcmFtIHcyIGludCBBcyBpbiBDaHVua2VkSW50QXJyYXkuYXBwZW5kCisgICAgICAgICAqIEBwYXJhbSB3MyBpbnQgQXMgaW4gQ2h1bmtlZEludEFycmF5LmFwcGVuZAorICAgICAgICAgKiBAcmV0dXJuIGludCBBcyBpbiBDaHVua2VkSW50QXJyYXkuYXBwZW5kCisgICAgICAgICAqIEBzZWUgQ2h1bmtlZEludEFycmF5LmFwcGVuZAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgYXBwZW5kTm9kZShpbnQgdzAsIGludCB3MSwgaW50IHcyLCBpbnQgdzMpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBIGRlY2VudCBjb21waWxlciBtYXkgaW5saW5lIHRoaXMuCisgICAgICAgICAgICAgICAgaW50IHNsb3RudW1iZXIgPSBub2Rlcy5hcHBlbmRTbG90KHcwLCB3MSwgdzIsIHczKTsKKworICAgICAgICAgICAgICAgIGlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHNsb3RudW1iZXIrIjogIit3MCsiICIrdzErIiAiK3cyKyIgIit3Myk7CisKKyAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nV2FzUGFyZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMud3JpdGVFbnRyeShwcmV2aW91c1NpYmxpbmcsMixzbG90bnVtYmVyKTsKKworICAgICAgICAgICAgICAgIHByZXZpb3VzU2libGluZ1dhc1BhcmVudCA9IGZhbHNlOwkvLyBTZXQgdGhlIGRlZmF1bHQ7IGVuZEVsZW1lbnQgb3ZlcnJpZGVzCisKKyAgICAgICAgICAgICAgICByZXR1cm4gc2xvdG51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vID09PT09PT09PSBEVE0gSW1wbGVtZW50YXRpb24gQ29udHJvbCBGdW5jdGlvbnMuID09PT09PT09PT09PT09CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhbiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZmVhdHVyZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqICVSRVZJRVclIERvIHdlIHJlYWxseSBleHBlY3QgdG8gc2V0IGZlYXR1cmVzIG9uIERUTXM/CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmZWF0dXJlSWQgQSBmZWF0dXJlIFVSTC4KKyAgICAgICAgICogQHBhcmFtIHN0YXRlIHRydWUgaWYgdGhpcyBmZWF0dXJlIHNob3VsZCBiZSBvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZUlkLCBib29sZWFuIHN0YXRlKSB7fTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgcmVmZXJlbmNlIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnQgbmFtZSBzeW1ib2wgdGFibGUuCisgICAgICAgICAqICVSRVZJRVclIFNob3VsZCB0aGlzIHJlYWxseSBiZSBQdWJsaWM/IENoYW5naW5nIGl0IHdoaWxlCisgICAgICAgICAqIERUTSBpcyBpbiB1c2Ugd291bGQgYmUgYSBkaXNhc3Rlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvb2xSZWYgRFRNU3RyaW5nUG9vbCByZWZlcmVuY2UgdG8gYW4gaW5zdGFuY2Ugb2YgdGFibGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWVUYWJsZShEVE1TdHJpbmdQb29sIHBvb2xSZWYpIHsKKyAgICAgICAgICAgICAgICBtX2xvY2FsTmFtZXMgPSBwb29sUmVmOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIHJlZmVyZW5jZSBwb2ludGVyIHRvIHRoZSBlbGVtZW50IG5hbWUgc3ltYm9sIHRhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIERUTVN0cmluZ1Bvb2wgcmVmZXJlbmNlIHRvIGFuIGluc3RhbmNlIG9mIHRhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIERUTVN0cmluZ1Bvb2wgZ2V0TG9jYWxOYW1lVGFibGUoKSB7CisgICAgICAgICAgICAgICAgIHJldHVybiBtX2xvY2FsTmFtZXM7CisgICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIHJlZmVyZW5jZSBwb2ludGVyIHRvIHRoZSBuYW1lc3BhY2UgVVJJIHN5bWJvbCB0YWJsZS4KKyAgICAgICAgICogJVJFVklFVyUgU2hvdWxkIHRoaXMgcmVhbGx5IGJlIFB1YmxpYz8gQ2hhbmdpbmcgaXQgd2hpbGUKKyAgICAgICAgICogRFRNIGlzIGluIHVzZSB3b3VsZCBiZSBhIGRpc2FzdGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcG9vbFJlZiBEVE1TdHJpbmdQb29sIHJlZmVyZW5jZSB0byBhbiBpbnN0YW5jZSBvZiB0YWJsZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5zTmFtZVRhYmxlKERUTVN0cmluZ1Bvb2wgcG9vbFJlZikgeworICAgICAgICAgICAgICAgIG1fbnNOYW1lcyA9IHBvb2xSZWY7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgcmVmZXJlbmNlIHBvaW50ZXIgdG8gdGhlIG5hbWVzcGFjZSBVUkkgc3ltYm9sIHRhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIERUTVN0cmluZ1Bvb2wgcmVmZXJlbmNlIHRvIGFuIGluc3RhbmNlIG9mIHRhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIERUTVN0cmluZ1Bvb2wgZ2V0TnNOYW1lVGFibGUoKSB7CisgICAgICAgICAgICAgICAgIHJldHVybiBtX25zTmFtZXM7CisgICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIHJlZmVyZW5jZSBwb2ludGVyIHRvIHRoZSBwcmVmaXggbmFtZSBzeW1ib2wgdGFibGUuCisgICAgICAgICAqICVSRVZJRVclIFNob3VsZCB0aGlzIHJlYWxseSBiZSBQdWJsaWM/IENoYW5naW5nIGl0IHdoaWxlCisgICAgICAgICAqIERUTSBpcyBpbiB1c2Ugd291bGQgYmUgYSBkaXNhc3Rlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvb2xSZWYgRFRNU3RyaW5nUG9vbCByZWZlcmVuY2UgdG8gYW4gaW5zdGFuY2Ugb2YgdGFibGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXhOYW1lVGFibGUoRFRNU3RyaW5nUG9vbCBwb29sUmVmKSB7CisgICAgICAgICAgICAgICAgbV9wcmVmaXhOYW1lcyA9IHBvb2xSZWY7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgcmVmZXJlbmNlIHBvaW50ZXIgdG8gdGhlIHByZWZpeCBuYW1lIHN5bWJvbCB0YWJsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBEVE1TdHJpbmdQb29sIHJlZmVyZW5jZSB0byBhbiBpbnN0YW5jZSBvZiB0YWJsZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEVE1TdHJpbmdQb29sIGdldFByZWZpeE5hbWVUYWJsZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wcmVmaXhOYW1lczsKKyAgICAgICAgfQorCisgICAgICAgICAvKioKKyAgICAgICAgICAqIFNldCBhIHJlZmVyZW5jZSBwb2ludGVyIHRvIHRoZSBjb250ZW50LXRleHQgcmVwb3NpdG9yeQorICAgICAgICAgICoKKyAgICAgICAgICAqIEBwYXJhbSBidWZmZXJSZWYgRmFzdFN0cmluZ0J1ZmZlciByZWZlcmVuY2UgdG8gYW4gaW5zdGFuY2Ugb2YKKyAgICAgICAgICAqIGJ1ZmZlcgorICAgICAgICAgICovCisgICAgICAgICB2b2lkIHNldENvbnRlbnRCdWZmZXIoRmFzdFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgbV9jaGFyID0gYnVmZmVyOworICAgICAgICAgfQorIAorICAgICAgICAgLyoqCisgICAgICAgICAgKiBHZXQgYSByZWZlcmVuY2UgcG9pbnRlciB0byB0aGUgY29udGVudC10ZXh0IHJlcG9zaXRvcnkKKyAgICAgICAgICAqCisgICAgICAgICAgKiBAcmV0dXJuIEZhc3RTdHJpbmdCdWZmZXIgcmVmZXJlbmNlIHRvIGFuIGluc3RhbmNlIG9mIGJ1ZmZlcgorICAgICAgICAgICovCisgICAgICAgICBGYXN0U3RyaW5nQnVmZmVyIGdldENvbnRlbnRCdWZmZXIoKSB7CisgICAgICAgICAgICAgICAgIHJldHVybiBtX2NoYXI7CisgICAgICAgICB9CisKKyAgLyoqIGdldENvbnRlbnRIYW5kbGVyIHJldHVybnMgIm91ciBTQVggYnVpbGRlciIgLS0gdGhlIHRoaW5nIHRoYXQKKyAgICogc29tZW9uZSBlbHNlIHNob3VsZCBzZW5kIFNBWCBldmVudHMgdG8gaW4gb3JkZXIgdG8gZXh0ZW5kIHRoaXMKKyAgICogRFRNIG1vZGVsLgorICAgKgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBtb2RlbCBkb2Vzbid0IHJlc3BvbmQgdG8gU0FYIGV2ZW50cywKKyAgICogInRoaXMiIGlmIHRoZSBEVE0gb2JqZWN0IGhhcyBhIGJ1aWx0LWluIFNBWCBDb250ZW50SGFuZGxlciwKKyAgICogdGhlIENvcm91dGluZVBhcnNlciBpZiB3ZSdyZSBib3VuZCB0byBvbmUgYW5kIHNob3VsZCByZWNlaXZlCisgICAqIHRoZSBTQVggc3RyZWFtIHZpYSBpdCBmb3IgaW5jcmVtZW50YWwgYnVpbGQgcHVycG9zZXMuLi4KKyAgICogKi8KKyAgcHVibGljIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyIGdldENvbnRlbnRIYW5kbGVyKCkKKyAgeworICAgIGlmIChtX2Nvcm91dGluZVBhcnNlciBpbnN0YW5jZW9mIENvcm91dGluZVNBWFBhcnNlcikKKyAgICAgIHJldHVybiAoQ29udGVudEhhbmRsZXIpIG1fY29yb3V0aW5lUGFyc2VyOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0aGlzOworICB9CisgIAorICAvKioKKyAgICogUmV0dXJuIHRoaXMgRFRNJ3MgbGV4aWNhbCBoYW5kbGVyLgorICAgKgorICAgKiAlUkVWSUVXJSBTaG91bGQgdGhpcyByZXR1cm4gbnVsbCBpZiBjb25zdHJ1dGlvbiBhbHJlYWR5IGRvbmUvYmVndW4/CisgICAqCisgICAqIEByZXR1cm4gbnVsbCBpZiB0aGlzIG1vZGVsIGRvZXNuJ3QgcmVzcG9uZCB0byBsZXhpY2FsIFNBWCBldmVudHMsCisgICAqICJ0aGlzIiBpZiB0aGUgRFRNIG9iamVjdCBoYXMgYSBidWlsdC1pbiBTQVggQ29udGVudEhhbmRsZXIsCisgICAqIHRoZSBDb3JvdXRpbmVQYXJzZXIgaWYgd2UncmUgYm91bmQgdG8gb25lIGFuZCBzaG91bGQgcmVjZWl2ZQorICAgKiB0aGUgU0FYIHN0cmVhbSB2aWEgaXQgZm9yIGluY3JlbWVudGFsIGJ1aWxkIHB1cnBvc2VzLi4uCisgICAqLworICBwdWJsaWMgTGV4aWNhbEhhbmRsZXIgZ2V0TGV4aWNhbEhhbmRsZXIoKQorICB7CisKKyAgICBpZiAobV9jb3JvdXRpbmVQYXJzZXIgaW5zdGFuY2VvZiBDb3JvdXRpbmVTQVhQYXJzZXIpCisgICAgICByZXR1cm4gKExleGljYWxIYW5kbGVyKSBtX2Nvcm91dGluZVBhcnNlcjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gdGhpczsKKyAgfQorICAKKyAgLyoqCisgICAqIFJldHVybiB0aGlzIERUTSdzIEVudGl0eVJlc29sdmVyLgorICAgKgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBtb2RlbCBkb2Vzbid0IHJlc3BvbmQgdG8gU0FYIGVudGl0eSByZWYgZXZlbnRzLgorICAgKi8KKyAgcHVibGljIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkKKyAgeworCisgICAgcmV0dXJuIG51bGw7CisgIH0KKyAgCisgIC8qKgorICAgKiBSZXR1cm4gdGhpcyBEVE0ncyBEVERIYW5kbGVyLgorICAgKgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBtb2RlbCBkb2Vzbid0IHJlc3BvbmQgdG8gU0FYIGR0ZCBldmVudHMuCisgICAqLworICBwdWJsaWMgb3JnLnhtbC5zYXguRFRESGFuZGxlciBnZXREVERIYW5kbGVyKCkKKyAgeworCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoaXMgRFRNJ3MgRXJyb3JIYW5kbGVyLgorICAgKgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBtb2RlbCBkb2Vzbid0IHJlc3BvbmQgdG8gU0FYIGVycm9yIGV2ZW50cy4KKyAgICovCisgIHB1YmxpYyBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIgZ2V0RXJyb3JIYW5kbGVyKCkKKyAgeworCisgICAgcmV0dXJuIG51bGw7CisgIH0KKyAgCisgIC8qKgorICAgKiBSZXR1cm4gdGhpcyBEVE0ncyBEZWNsSGFuZGxlci4KKyAgICoKKyAgICogQHJldHVybiBudWxsIGlmIHRoaXMgbW9kZWwgZG9lc24ndCByZXNwb25kIHRvIFNBWCBEZWNsIGV2ZW50cy4KKyAgICovCisgIHB1YmxpYyBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIgZ2V0RGVjbEhhbmRsZXIoKQorICB7CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfSAgCisgIAorICAvKiogQHJldHVybiB0cnVlIGlmZiB3ZSdyZSBidWlsZGluZyB0aGlzIG1vZGVsIGluY3JlbWVudGFsbHkgKGVnCisgICAqIHdlJ3JlIHBhcnRuZXJlZCB3aXRoIGEgQ29yb3V0aW5lUGFyc2VyKSBhbmQgdGh1cyByZXF1aXJlIHRoYXQgdGhlCisgICAqIHRyYW5zZm9ybWF0aW9uIGFuZCB0aGUgcGFyc2UgcnVuIHNpbXVsdGFuZW91c2x5LiBHdWlkYW5jZSB0byB0aGUKKyAgICogRFRNTWFuYWdlci4KKyAgICogKi8KKyAgcHVibGljIGJvb2xlYW4gbmVlZHNUd29UaHJlYWRzKCkKKyAgeworICAgIHJldHVybiBudWxsIT1tX2Nvcm91dGluZVBhcnNlcjsKKyAgfQorCisgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyA9PT09PT09PT0gU0FYMiBDb250ZW50SGFuZGxlciBtZXRob2RzID09PT09PT09PQorICAvLyBBY2NlcHQgU0FYIGV2ZW50cywgdXNlIHRoZW0gdG8gYnVpbGQvZXh0ZW5kIHRoZSBEVE0gdHJlZS4KKyAgLy8gUmVwbGFjZXMgdGhlIGRlcHJlY2F0ZWQgRG9jdW1lbnRIYW5kbGVyIGludGVyZmFjZS4KKworICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIC8vIEFjdHVhbGx5IGNyZWF0aW5nIHRoZSB0ZXh0IG5vZGUgaXMgaGFuZGxlZCBieQorICAgIC8vIHByb2Nlc3NBY2N1bXVsYXRlZFRleHQoKTsgaGVyZSB3ZSBqdXN0IGFjY3VtdWxhdGUgdGhlCisgICAgLy8gY2hhcmFjdGVycyBpbnRvIHRoZSBidWZmZXIuCisgICAgbV9jaGFyLmFwcGVuZChjaCxzdGFydCxsZW5ndGgpOworICB9CisKKyAgLy8gRmx1c2ggc3RyaW5nIGFjY3VtdWxhdGlvbiBpbnRvIGEgdGV4dCBub2RlCisgIHByaXZhdGUgdm9pZCBwcm9jZXNzQWNjdW11bGF0ZWRUZXh0KCkKKyAgeworICAgIGludCBsZW49bV9jaGFyLmxlbmd0aCgpOworICAgIGlmKGxlbiE9bV9jaGFyX2N1cnJlbnRfc3RhcnQpCisgICAgICB7CisgICAgICAgIC8vIFRoZSBGYXN0U3RyaW5nQnVmZmVyIGhhcyBiZWVuIHByZXZpb3VzbHkgYWdyZWVkIHVwb24KKyAgICAgICAgYXBwZW5kVGV4dENoaWxkKG1fY2hhcl9jdXJyZW50X3N0YXJ0LGxlbi1tX2NoYXJfY3VycmVudF9zdGFydCk7CisgICAgICAgIG1fY2hhcl9jdXJyZW50X3N0YXJ0PWxlbjsKKyAgICAgIH0KKyAgfQorICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIC8vIE1heSBuZWVkIHRvIHRlbGwgdGhlIGxvdy1sZXZlbCBidWlsZGVyIGNvZGUgdG8gcG9wIHVwIGEgbGV2ZWwuCisgICAgLy8gVGhlcmUgX3Nob3VsZCd0XyBiZSBhbnkgc2lnbmlmaWNhbnQgcGVuZGluZyB0ZXh0IGF0IHRoaXMgcG9pbnQuCisgICAgYXBwZW5kRW5kRG9jdW1lbnQoKTsKKyAgfQorICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJLCBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsTmFtZSwKKyAgICAgIGphdmEubGFuZy5TdHJpbmcgcU5hbWUpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIHByb2Nlc3NBY2N1bXVsYXRlZFRleHQoKTsKKyAgICAvLyBObyBhcmdzIGJ1dCB3ZSBkbyBuZWVkIHRvIHRlbGwgdGhlIGxvdy1sZXZlbCBidWlsZGVyIGNvZGUgdG8KKyAgICAvLyBwb3AgdXAgYSBsZXZlbC4KKyAgICBhcHBlbmRFbmRFbGVtZW50KCk7CisgIH0KKyAgcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZyhqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgLy8gTm8tb3AKKyAgfQorICBwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICAvLyAlVEJEJSBJIGJlbGlldmUgaWdub3JhYmxlIHRleHQgaXNuJ3QgcGFydCBvZiB0aGUgRFRNIG1vZGVsLi4uPworICB9CisgIHB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihqYXZhLmxhbmcuU3RyaW5nIHRhcmdldCwgamF2YS5sYW5nLlN0cmluZyBkYXRhKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICBwcm9jZXNzQWNjdW11bGF0ZWRUZXh0KCk7CisgICAgLy8gJVRCRCUgV2hpY2ggcG9vbHMgZG8gdGFyZ2V0IGFuZCBkYXRhIGdvIGludG8/CisgIH0KKyAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikgCisgIHsKKyAgICAvLyBOby1vcCBmb3IgRFRNCisgIH0KKyAgcHVibGljIHZvaWQgc2tpcHBlZEVudGl0eShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIHByb2Nlc3NBY2N1bXVsYXRlZFRleHQoKTsKKyAgICAvLyVUQkQlCisgIH0KKyAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIGFwcGVuZFN0YXJ0RG9jdW1lbnQoKTsKKyAgfQorICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkksIGphdmEubGFuZy5TdHJpbmcgbG9jYWxOYW1lLAorICAgICAgamF2YS5sYW5nLlN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzKSAKKyAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICBwcm9jZXNzQWNjdW11bGF0ZWRUZXh0KCk7CisKKyAgICAvLyAlVEJEJSBTcGxpdCBwcmVmaXggb2ZmIHFuYW1lCisgICAgU3RyaW5nIHByZWZpeD1udWxsOworICAgIGludCBjb2xvbj1xTmFtZS5pbmRleE9mKCc6Jyk7CisgICAgaWYoY29sb24+MCkKKyAgICAgIHByZWZpeD1xTmFtZS5zdWJzdHJpbmcoMCxjb2xvbik7CisKKyAgICAvLyAlVEJEJSBXaGVyZSBkbyB3ZSBwb29sIGV4cGFuZGVkTmFtZSwgb3IgaXMgaXQganVzdCB0aGUgdW5pb24sIG9yLi4uCisgICAgLyoqL1N5c3RlbS5vdXQucHJpbnRsbigiUHJlZml4PSIrcHJlZml4KyIgaW5kZXg9IittX3ByZWZpeE5hbWVzLnN0cmluZ1RvSW5kZXgocHJlZml4KSk7CisgICAgYXBwZW5kU3RhcnRFbGVtZW50KG1fbnNOYW1lcy5zdHJpbmdUb0luZGV4KG5hbWVzcGFjZVVSSSksCisgICAgICAgICAgICAgICAgICAgICBtX2xvY2FsTmFtZXMuc3RyaW5nVG9JbmRleChsb2NhbE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgbV9wcmVmaXhOYW1lcy5zdHJpbmdUb0luZGV4KHByZWZpeCkpOyAvLy8vLy8vICVUQkQlCisKKyAgICAvLyAlVEJEJSBJJ20gYXNzdW1pbmcgdGhhdCBEVE0gd2lsbCByZXF1aXJlIHJlc2VxdWVuY2luZyBvZgorICAgIC8vIE5TIGRlY2xzIGJlZm9yZSBvdGhlciBhdHRycywgaGVuY2UgdHdvIHBhc3NlcyBhcmUgdGFrZW4uCisgICAgLy8gJVRCRCUgSXMgdGhlcmUgYW4gZWFzaWVyIHdheSB0byB0ZXN0IGZvciBOU0RlY2w/CisgICAgaW50IG5BdHRzPShhdHRzPT1udWxsKSA/IDAgOiBhdHRzLmdldExlbmd0aCgpOworICAgIC8vICVUQkQlIENvdW50ZG93biBpcyBtb3JlIGVmZmljaWVudCBpZiBub2JvZHkgY2FyZXMgYWJvdXQgc2VxdWVuY2UuCisgICAgZm9yKGludCBpPW5BdHRzLTE7aT49MDstLWkpCQorICAgICAgeworICAgICAgICBxTmFtZT1hdHRzLmdldFFOYW1lKGkpOworICAgICAgICBpZihxTmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSB8fCAieG1sbnMiLmVxdWFscyhxTmFtZSkpCisgICAgICAgICAgeworICAgICAgICAgICAgcHJlZml4PW51bGw7CisgICAgICAgICAgICBjb2xvbj1xTmFtZS5pbmRleE9mKCc6Jyk7CisgICAgICAgICAgICBpZihjb2xvbj4wKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJlZml4PXFOYW1lLnN1YnN0cmluZygwLGNvbG9uKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gJVJFVkVJVyUgTnVsbCBvciAiIj8KKyAgICAgICAgICAgICAgICBwcmVmaXg9bnVsbDsgLy8gRGVmYXVsdCBwcmVmaXgKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGFwcGVuZE5TRGVjbGFyYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZpeE5hbWVzLnN0cmluZ1RvSW5kZXgocHJlZml4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbnNOYW1lcy5zdHJpbmdUb0luZGV4KGF0dHMuZ2V0VmFsdWUoaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cy5nZXRUeXBlKGkpLmVxdWFsc0lnbm9yZUNhc2UoIklEIikpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAKKyAgICBmb3IoaW50IGk9bkF0dHMtMTtpPj0wOy0taSkJCisgICAgICB7CisgICAgICAgIHFOYW1lPWF0dHMuZ2V0UU5hbWUoaSk7CisgICAgICAgIGlmKCEocU5hbWUuc3RhcnRzV2l0aCgieG1sbnM6IikgfHwgInhtbG5zIi5lcXVhbHMocU5hbWUpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyAlVEJEJSBJIGhhdGUgaGF2aW5nIHRvIGV4dHJhY3QgdGhlIHByZWZpeCBpbnRvIGEgbmV3CisgICAgICAgICAgICAvLyBzdHJpbmcgd2hlbiB3ZSBtYXkgbmV2ZXIgdXNlIGl0LiBDb25zaWRlciBwb29saW5nIHdob2xlCisgICAgICAgICAgICAvLyBxTmFtZXMsIHdoaWNoIGFyZSBhbHJlYWR5IHN0cmluZ3M/CisgICAgICAgICAgICBwcmVmaXg9bnVsbDsKKyAgICAgICAgICAgIGNvbG9uPXFOYW1lLmluZGV4T2YoJzonKTsKKyAgICAgICAgICAgIGlmKGNvbG9uPjApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmVmaXg9cU5hbWUuc3Vic3RyaW5nKDAsY29sb24pOworICAgICAgICAgICAgICAgIGxvY2FsTmFtZT1xTmFtZS5zdWJzdHJpbmcoY29sb24rMSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByZWZpeD0iIjsgLy8gRGVmYXVsdCBwcmVmaXgKKyAgICAgICAgICAgICAgICBsb2NhbE5hbWU9cU5hbWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBtX2NoYXIuYXBwZW5kKGF0dHMuZ2V0VmFsdWUoaSkpOyAvLyBTaW5nbGUtc3RyaW5nIHZhbHVlCisgICAgICAgICAgICBpbnQgY29udGVudEVuZD1tX2NoYXIubGVuZ3RoKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCEoInhtbG5zIi5lcXVhbHMocHJlZml4KSB8fCAieG1sbnMiLmVxdWFscyhxTmFtZSkpKQorICAgICAgICAgICAgICBhcHBlbmRBdHRyaWJ1dGUobV9uc05hbWVzLnN0cmluZ1RvSW5kZXgoYXR0cy5nZXRVUkkoaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbG9jYWxOYW1lcy5zdHJpbmdUb0luZGV4KGxvY2FsTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wcmVmaXhOYW1lcy5zdHJpbmdUb0luZGV4KHByZWZpeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cy5nZXRUeXBlKGkpLmVxdWFsc0lnbm9yZUNhc2UoIklEIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jaGFyX2N1cnJlbnRfc3RhcnQsIGNvbnRlbnRFbmQtbV9jaGFyX2N1cnJlbnRfc3RhcnQpOworICAgICAgICAgICAgbV9jaGFyX2N1cnJlbnRfc3RhcnQ9Y29udGVudEVuZDsKKyAgICAgICAgICB9CisgICAgICB9CisgIH0KKyAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LCBqYXZhLmxhbmcuU3RyaW5nIHVyaSkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgLy8gTm8tb3AgaW4gRFRNLCBoYW5kbGVkIGR1cmluZyBlbGVtZW50L2F0dHIgcHJvY2Vzc2luZz8KKyAgfQorCisgIC8vCisgIC8vIExleGljYWxIYW5kbGVyIHN1cHBvcnQuIE5vdCBhbGwgU0FYMiBwYXJzZXJzIHN1cHBvcnQgdGhlc2UgZXZlbnRzCisgIC8vIGJ1dCB3ZSBtYXkgd2FudCB0byBwYXNzIHRoZW0gdGhyb3VnaCB3aGVuIHRoZXkgZXhpc3QuLi4KKyAgLy8KKyAgcHVibGljIHZvaWQgY29tbWVudChjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgcHJvY2Vzc0FjY3VtdWxhdGVkVGV4dCgpOworCisgICAgbV9jaGFyLmFwcGVuZChjaCxzdGFydCxsZW5ndGgpOyAvLyBTaW5nbGUtc3RyaW5nIHZhbHVlCisgICAgYXBwZW5kQ29tbWVudChtX2NoYXJfY3VycmVudF9zdGFydCxsZW5ndGgpOworICAgIG1fY2hhcl9jdXJyZW50X3N0YXJ0Kz1sZW5ndGg7ICAgIAorICB9CisgIHB1YmxpYyB2b2lkIGVuZENEQVRBKCkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgLy8gTm8tb3AgaW4gRFRNCisgIH0KKyAgcHVibGljIHZvaWQgZW5kRFREKCkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgLy8gTm8tb3AgaW4gRFRNCisgIH0KKyAgcHVibGljIHZvaWQgZW5kRW50aXR5KGphdmEubGFuZy5TdHJpbmcgbmFtZSkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgLy8gTm8tb3AgaW4gRFRNCisgIH0KKyAgcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIC8vIE5vLW9wIGluIERUTQorICB9CisgIHB1YmxpYyB2b2lkIHN0YXJ0RFREKGphdmEubGFuZy5TdHJpbmcgbmFtZSwgamF2YS5sYW5nLlN0cmluZyBwdWJsaWNJZCwKKyAgICAgIGphdmEubGFuZy5TdHJpbmcgc3lzdGVtSWQpIAorICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIC8vIE5vLW9wIGluIERUTQorICB9CisgIHB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5KGphdmEubGFuZy5TdHJpbmcgbmFtZSkgCisgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgLy8gTm8tb3AgaW4gRFRNCisgIH0KKworCisgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyA9PT09PT09PT0gRG9jdW1lbnQgSGFuZGxlciBGdW5jdGlvbnMgPT09PT09PT09CisgIC8vICVSRVZJRVclIGpqayAtLSBEb2N1bWVudEhhbmRsZXIgaXMgIFNBWCBMZXZlbCAxLCBhbmQgZGVwcmVjYXRlZC4uLi4KKyAgLy8gYW5kIHRoaXMgd2Fzbid0IGEgZnVsbHkgY29tcGxpYW50IG9yIGRlY2xhcmVkIGltcGxlbWVudGF0aW9uIG9mIHRoYXQgQVBJCisgIC8vIGluIGFueSBjYXNlLiBQaGFzZSBvdXQgaW4gZmF2b3Igb2YgU0FYMiBDb250ZW50SGFuZGxlci9MZXhpY2FsSGFuZGxlcgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNldCBhIGR0bSBkb2N1bWVudCB0byBpdHMgaW5pdGlhbCAoZW1wdHkpIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgRFRNTWFuYWdlciB3aWxsIGludm9rZSB0aGlzIG1ldGhvZCB3aGVuIHRoZSBkdG0gaXMgY3JlYXRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRvY0hhbmRsZSBpbnQgdGhlIGhhbmRsZSBmb3IgdGhlIERUTSBkb2N1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIHZvaWQgaW5pdERvY3VtZW50KGludCBkb2N1bWVudE51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNhdmUgbWFza2VkIERUTSBkb2N1bWVudCBoYW5kbGUKKyAgICAgICAgICAgICAgICBtX2RvY0hhbmRsZSA9IGRvY3VtZW50TnVtYmVyPDxET0NIQU5ETEVfU0hJRlQ7CisKKyAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBkb2MgLS0gbm8gcGFyZW50LCBubyBuZXh0LXNpYgorICAgICAgICAgICAgICAgIG5vZGVzLndyaXRlU2xvdCgwLERPQ1VNRU5UX05PREUsLTEsLTEsMCk7CisgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGZpcnN0IHN0YXJ0RWxlbWVudCB0byBjcmVhdGUgdGhlIGRvYyByb290IG5vZGUKKyAgICAgICAgICAgICAgICBkb25lID0gZmFsc2U7CisgICAgICAgIH0KKworLy8gCS8qKgorLy8gCSAqIFJlY2VpdmUgaGludCBvZiB0aGUgZW5kIG9mIGEgZG9jdW1lbnQuCisvLyAJICoKKy8vIAkgKiA8cD5UaGUgY29udGVudCBoYW5kbGVyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG9ubHkgb25jZSwgYW5kIGl0IHdpbGwKKy8vIAkgKiBiZSB0aGUgbGFzdCBtZXRob2QgaW52b2tlZCBkdXJpbmcgdGhlIHBhcnNlLiAgVGhlIGhhbmRsZXIgc2hhbGwgbm90CisvLyAJICogbm90IGludm9rZSB0aGlzIG1ldGhvZCB1bnRpbCBpdCBoYXMgZWl0aGVyIGFiYW5kb25lZCBwYXJzaW5nCisvLyAJICogKGJlY2F1c2Ugb2YgYW4gdW5yZWNvdmVyYWJsZSBlcnJvcikgb3IgcmVhY2hlZCB0aGUgZW5kIG9mCisvLyAJICogaW5wdXQuPC9wPgorLy8gCSAqLworLy8gCXB1YmxpYyB2b2lkIGRvY3VtZW50RW5kKCkKKy8vIAl7CisvLyAJCWRvbmUgPSB0cnVlOworLy8gCQkvLyAlVEJEJSBtYXkgbmVlZCB0byBub3RpY2UgdGhlIGxhc3Qgc2xvdCBudW1iZXIgYW5kIHNsb3QgY291bnQgdG8gYXZvaWQKKy8vIAkJLy8gcmVzaWR1YWwgZGF0YSBmcm9tIHByb3Zpb3VzIHVzZSBvZiB0aGlzIERUTQorLy8gCX0KKworLy8gCS8qKgorLy8gCSAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgYSBkb2N1bWVudC4KKy8vIAkgKgorLy8gCSAqIDxwPlRoZSBTQVggcGFyc2VyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG9ubHkgb25jZSwgYmVmb3JlIGFueQorLy8gCSAqIG90aGVyIG1ldGhvZHMgaW4gdGhpcyBpbnRlcmZhY2UuPC9wPgorLy8gCSAqLworLy8gCXB1YmxpYyB2b2lkIHJlc2V0KCkKKy8vIAl7CisKKy8vIAkJLy8gJVRCRCUgcmVzZXQgc2xvdCAwIHRvIGluZGljYXRlIENodW5rZWRJbnRBcnJheSByZXVzZSBvciB3YWl0IGZvcgorLy8gCQkvLyAgICAgICB0aGUgbmV4dCBpbml0RG9jdW1lbnQoKS4KKy8vIAkJbV9kb2NFbGVtZW50ID0gTlVMTDsJIC8vIHJlc2V0IG5vZGVIYW5kbGUgdG8gdGhlIHJvb3Qgb2YgdGhlIGFjdHVhbCBkdG0gZG9jIGNvbnRlbnQKKy8vIAkJaW5pdERvY3VtZW50KDApOworLy8gCX0KKworLy8gCS8qKgorLy8gCSAqIEZhY3RvcnkgbWV0aG9kOyBjcmVhdGVzIGFuIEVsZW1lbnQgbm9kZSBpbiB0aGlzIGRvY3VtZW50LgorLy8gCSAqCisvLyAJICogVGhlIG5vZGUgY3JlYXRlZCB3aWxsIGJlIGNoYWluZWQgYWNjb3JkaW5nIHRvIGl0cyBuYXR1cmFsIG9yZGVyIG9mIHJlcXVlc3QKKy8vIAkgKiByZWNlaXZlZC4gICVUQkQlIEl0IGNhbiBiZSByZWNoYWluZWQgbGF0ZXIgdmlhIHRoZSBvcHRpb25hbCBEVE0gd3JpdGFibGUgaW50ZXJmYWNlLgorLy8gCSAqCisvLyAJICogPHA+VGhlIFhNTCBjb250ZW50IGhhbmRsZXIgd2lsbCBpbnZva2UgZW5kRWxlbWVudCgpIG1ldGhvZCBhZnRlciBhbGwKKy8vIAkgKiBvZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgYXJlIHByb2Nlc3NlZCBpbiBvcmRlciB0byBnaXZlIERUTSB0aGUgaW5kaWNhdGlvbgorLy8gCSAqIHRvIHByZXBhcmUgYW5kIHBhdGNoIHVwIHBhcmVudCBhbmQgc2libGluZyBub2RlIHBvaW50ZXJzLjwvcD4KKy8vIAkgKgorLy8gCSAqIDxwPlRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIGZvciBjcmVhdGVFbGVtZW50IHdpbGwgdXNlIGFuIGluZGV4IHZhbHVlIGNvcnJlc3BvbmRzCisvLyAJICogdG8gdGhlIHN5bWJvbCBlbnRyeSBpbiB0aGUgRFRNRFN0cmluZ1Bvb2wgYmFzZWQgc3ltYm9sIHRhYmxlcy48L3A+CisvLyAJICoKKy8vIAkgKiBAcGFyYW0gbnNJbmRleCBUaGUgbmFtZXNwYWNlIG9mIHRoZSBub2RlCisvLyAJICogQHBhcmFtIG5hbWVJbmRleCBUaGUgZWxlbWVudCBuYW1lLgorLy8gCSAqIEBzZWUgI2VuZEVsZW1lbnQKKy8vIAkgKiBAc2VlIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMKKy8vIAkgKiBAcmV0dXJuIG5vZGVIYW5kbGUgaW50IG9mIHRoZSBlbGVtZW50IGNyZWF0ZWQKKy8vIAkgKi8KKy8vIAlwdWJsaWMgaW50IGNyZWF0ZUVsZW1lbnQoaW50IG5zSW5kZXgsIGludCBuYW1lSW5kZXgsIEF0dHJpYnV0ZXMgYXR0cykKKy8vIAl7CisvLyAJCS8vIGRvIGRvY3VtZW50IHJvb3Qgbm9kZSBjcmVhdGlvbiBoZXJlIG9uIHRoZSBmaXJzdCBlbGVtZW50LCBjcmVhdGUgbm9kZXMgZm9yCisvLyAJCS8vIHRoaXMgZWxlbWVudCBhbmQgaXRzIGF0dHJpYnV0ZXMsIHN0b3JlIHRoZSBlbGVtZW50LCBuYW1lc3BhY2UsIGFuZCBhdHRyaXR1dGUKKy8vIAkJLy8gbmFtZSBpbmRleGVzIHRvIHRoZSBub2RlcyBhcnJheSwga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBub2RlIGFuZCBwYXJlbnQKKy8vIAkJLy8gZWxlbWVudCB1c2VkCisKKy8vIAkJLy8gVzAgIEhpZ2g6ICBOYW1lc3BhY2UgIExvdzogIE5vZGUgVHlwZQorLy8gCQlpbnQgdzAgPSAobnNJbmRleCA8PCAxNikgfCBFTEVNRU5UX05PREU7CisvLyAJCS8vIFcxOiBQYXJlbnQKKy8vIAkJaW50IHcxID0gY3VycmVudFBhcmVudDsKKy8vIAkJLy8gVzI6IE5leHQgIChpbml0aWFsaXplZCBhcyAwKQorLy8gCQlpbnQgdzIgPSAwOworLy8gCQkvLyBXMzogVGFnbmFtZQorLy8gCQlpbnQgdzMgPSBuYW1lSW5kZXg7CisvLyAJCS8vaW50IG91cnNsb3QgPSBub2Rlcy5hcHBlbmRTbG90KHcwLCB3MSwgdzIsIHczKTsKKy8vIAkJaW50IG91cnNsb3QgPSBhcHBlbmROb2RlKHcwLCB3MSwgdzIsIHczKTsKKy8vIAkJY3VycmVudFBhcmVudCA9IG91cnNsb3Q7CisvLyAJCXByZXZpb3VzU2libGluZyA9IDA7CisvLyAJCXNldEF0dHJpYnV0ZXMoYXR0cyk7CisKKy8vIAkJLy8gc2V0IHRoZSByb290IGVsZW1lbnQgcG9pbnRlciB3aGVuIGNyZWF0aW5nIHRoZSBmaXJzdCBlbGVtZW50IG5vZGUKKy8vIAkJaWYgKG1fZG9jRWxlbWVudCA9PSBOVUxMKQorLy8gCQkJbV9kb2NFbGVtZW50ID0gb3Vyc2xvdDsKKy8vIAkJcmV0dXJuIChtX2RvY0hhbmRsZSB8IG91cnNsb3QpOworLy8gCX0KKworLy8gCS8vIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiBFbGVtZW50IG5vZGUgbm90IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIG5hbWUgc3BhY2UKKy8vIAkvLyB1c2luZyBTdHJpbmcgdmFsdWUgcGFyYW1ldGVycyBwYXNzZWQgaW4gZnJvbSBhIGNvbnRlbnQgaGFuZGxlciBvciBhcHBsaWNhdGlvbgorLy8gCS8qKgorLy8gCSAqIEZhY3RvcnkgbWV0aG9kOyBjcmVhdGVzIGFuIEVsZW1lbnQgbm9kZSBub3QgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gbmFtZSBzcGFjZSBpbiB0aGlzIGRvY3VtZW50LgorLy8gCSAqCisvLyAJICogVGhlIG5vZGUgY3JlYXRlZCB3aWxsIGJlIGNoYWluZWQgYWNjb3JkaW5nIHRvIGl0cyBuYXR1cmFsIG9yZGVyIG9mIHJlcXVlc3QKKy8vIAkgKiByZWNlaXZlZC4gICVUQkQlIEl0IGNhbiBiZSByZWNoYWluZWQgbGF0ZXIgdmlhIHRoZSBvcHRpb25hbCBEVE0gd3JpdGFibGUgaW50ZXJmYWNlLgorLy8gCSAqCisvLyAJICogPHA+VGhlIFhNTCBjb250ZW50IGhhbmRsZXIgb3IgYXBwbGljYXRpb24gd2lsbCBpbnZva2UgZW5kRWxlbWVudCgpIG1ldGhvZCBhZnRlciBhbGwKKy8vIAkgKiBvZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgYXJlIHByb2Nlc3NlZCBpbiBvcmRlciB0byBnaXZlIERUTSB0aGUgaW5kaWNhdGlvbgorLy8gCSAqIHRvIHByZXBhcmUgYW5kIHBhdGNoIHVwIHBhcmVudCBhbmQgc2libGluZyBub2RlIHBvaW50ZXJzLjwvcD4KKy8vIAkgKgorLy8gCSAqIDxwPlRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBmb3IgY3JlYXRlRWxlbWVudCBjb250YWlucyByYXcgc3RyaW5nIHZhbHVlcyBmb3IgbmFtZQorLy8gCSAqIHN5bWJvbHMgdXNlZCBpbiBhbiBFbGVtZW50IG5vZGUuPC9wPgorLy8gCSAqCisvLyAJICogQHBhcmFtIG5hbWUgU3RyaW5nIHRoZSBlbGVtZW50IG5hbWUsIGluY2x1ZGluZyB0aGUgcHJlZml4IGlmIGFueS4KKy8vIAkgKiBAcGFyYW0gYXR0cyBUaGUgYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCwgaWYgYW55LgorLy8gCSAqIEBzZWUgI2VuZEVsZW1lbnQKKy8vIAkgKiBAc2VlIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMKKy8vIAkgKi8KKy8vIAlwdWJsaWMgaW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cykKKy8vIAl7CisvLyAJCS8vIFRoaXMgbWV0aG9kIHdyYXBzIGFyb3VuZCB0aGUgaW5kZXggdmFsdWVkIGludGVyZmFjZSBvZiB0aGUgY3JlYXRlRWxlbWVudCBpbnRlcmZhY2UuCisvLyAJCS8vIFRoZSByYXcgc3RyaW5nIHZhbHVlcyBhcmUgc3RvcmVkIGludG8gdGhlIGN1cnJlbnQgRFRNIG5hbWUgc3ltYm9sIHRhYmxlcy4gIFRoZSBtZXRob2QKKy8vIAkJLy8gbWV0aG9kIHdpbGwgdGhlbiB1c2UgdGhlIGluZGV4IHZhbHVlcyByZXR1cm5lZCB0byBpbnZva2UgdGhlIG90aGVyIGNyZWF0ZUVsZW1lbnQoKQorLy8gCQkvLyBvbnZlcnRlZCB0byBpbmRleCB2YWx1ZXMgbW9kaWZpZWQgdG8gbWF0Y2ggYQorLy8gCQkvLyBtZXRob2QuCisvLyAJCWludCBuc0luZGV4ID0gTlVMTDsKKy8vIAkJaW50IG5hbWVJbmRleCA9IG1fbG9jYWxOYW1lcy5zdHJpbmdUb0luZGV4KG5hbWUpOworLy8gCQkvLyBub3RlIC0gdGhlcmUgc2hvdWxkIGJlIG5vIHByZWZpeCBzZXBhcmF0b3IgaW4gdGhlIG5hbWUgYmVjYXVzZSBpdCBpcyBub3QgYXNzb2NpYXRlZAorLy8gCQkvLyB3aXRoIGEgbmFtZSBzcGFjZQorCisvLyAJCXJldHVybiBjcmVhdGVFbGVtZW50KG5zSW5kZXgsIG5hbWVJbmRleCwgYXR0cyk7CisvLyAJfQorCisvLyAJLy8gRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIEVsZW1lbnQgbm9kZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBuYW1lIHNwYWNlCisvLyAJLy8gdXNpbmcgU3RyaW5nIHZhbHVlIHBhcmFtZXRlcnMgcGFzc2VkIGluIGZyb20gYSBjb250ZW50IGhhbmRsZXIgb3IgYXBwbGljYXRpb24KKy8vIAkvKioKKy8vIAkgKiBGYWN0b3J5IG1ldGhvZDsgY3JlYXRlcyBhbiBFbGVtZW50IG5vZGUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gbmFtZSBzcGFjZSBpbiB0aGlzIGRvY3VtZW50LgorLy8gCSAqCisvLyAJICogVGhlIG5vZGUgY3JlYXRlZCB3aWxsIGJlIGNoYWluZWQgYWNjb3JkaW5nIHRvIGl0cyBuYXR1cmFsIG9yZGVyIG9mIHJlcXVlc3QKKy8vIAkgKiByZWNlaXZlZC4gICVUQkQlIEl0IGNhbiBiZSByZWNoYWluZWQgbGF0ZXIgdmlhIHRoZSBvcHRpb25hbCBEVE0gd3JpdGFibGUgaW50ZXJmYWNlLgorLy8gCSAqCisvLyAJICogPHA+VGhlIFhNTCBjb250ZW50IGhhbmRsZXIgb3IgYXBwbGljYXRpb24gd2lsbCBpbnZva2UgZW5kRWxlbWVudCgpIG1ldGhvZCBhZnRlciBhbGwKKy8vIAkgKiBvZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgYXJlIHByb2Nlc3NlZCBpbiBvcmRlciB0byBnaXZlIERUTSB0aGUgaW5kaWNhdGlvbgorLy8gCSAqIHRvIHByZXBhcmUgYW5kIHBhdGNoIHVwIHBhcmVudCBhbmQgc2libGluZyBub2RlIHBvaW50ZXJzLjwvcD4KKy8vIAkgKgorLy8gCSAqIDxwPlRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBmb3IgY3JlYXRlRWxlbWVudE5TIGNvbnRhaW5zIHJhdyBzdHJpbmcgdmFsdWVzIGZvciBuYW1lCisvLyAJICogc3ltYm9scyB1c2VkIGluIGFuIEVsZW1lbnQgbm9kZS48L3A+CisvLyAJICoKKy8vIAkgKiBAcGFyYW0gbnMgU3RyaW5nIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG5vZGUKKy8vIAkgKiBAcGFyYW0gbmFtZSBTdHJpbmcgdGhlIGVsZW1lbnQgbmFtZSwgaW5jbHVkaW5nIHRoZSBwcmVmaXggaWYgYW55LgorLy8gCSAqIEBwYXJhbSBhdHRzIFRoZSBhdHRyaWJ1dGVzIGF0dGFjaGVkIHRvIHRoZSBlbGVtZW50LCBpZiBhbnkuCisvLyAJICogQHNlZSAjZW5kRWxlbWVudAorLy8gCSAqIEBzZWUgb3JnLnhtbC5zYXguQXR0cmlidXRlcworLy8gCSAqLworLy8gCXB1YmxpYyBpbnQgY3JlYXRlRWxlbWVudE5TKFN0cmluZyBucywgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cykKKy8vIAl7CisvLyAJCS8vIFRoaXMgbWV0aG9kIHdyYXBzIGFyb3VuZCB0aGUgaW5kZXggdmFsdWVkIGludGVyZmFjZSBvZiB0aGUgY3JlYXRlRWxlbWVudCBpbnRlcmZhY2UuCisvLyAJCS8vIFRoZSByYXcgc3RyaW5nIHZhbHVlcyBhcmUgc3RvcmVkIGludG8gdGhlIGN1cnJlbnQgRFRNIG5hbWUgc3ltYm9sIHRhYmxlcy4gIFRoZSBtZXRob2QKKy8vIAkJLy8gbWV0aG9kIHdpbGwgdGhlbiB1c2UgdGhlIGluZGV4IHZhbHVlcyByZXR1cm5lZCB0byBpbnZva2UgdGhlIG90aGVyIGNyZWF0ZUVsZW1lbnQoKQorLy8gCQkvLyBvbnZlcnRlZCB0byBpbmRleCB2YWx1ZXMgbW9kaWZpZWQgdG8gbWF0Y2ggYQorLy8gCQkvLyBtZXRob2QuCisvLyAJCWludCBuc0luZGV4ID0gbV9uc05hbWVzLnN0cmluZ1RvSW5kZXgobnMpOworLy8gCQlpbnQgbmFtZUluZGV4ID0gbV9sb2NhbE5hbWVzLnN0cmluZ1RvSW5kZXgobmFtZSk7CisvLyAJCS8vIFRoZSBwcmVmaXhJbmRleCBpcyBub3QgbmVlZGVkIGJ5IHRoZSBpbmRleGVkIGludGVyZmFjZSBvZiB0aGUgY3JlYXRlRWxlbWVudCBtZXRob2QKKy8vIAkJaW50IHByZWZpeFNlcCA9IG5hbWUuaW5kZXhPZigiOiIpOworLy8gCQlpbnQgcHJlZml4SW5kZXggPSBtX3ByZWZpeE5hbWVzLnN0cmluZ1RvSW5kZXgobmFtZS5zdWJzdHJpbmcoMCwgcHJlZml4U2VwKSk7CisvLyAJCXJldHVybiBjcmVhdGVFbGVtZW50KG5zSW5kZXgsIG5hbWVJbmRleCwgYXR0cyk7CisvLyAJfQorCisvLyAJLyoqCisvLyAJICogUmVjZWl2ZSBhbiBpbmRpY2F0aW9uIGZvciB0aGUgZW5kIG9mIGFuIGVsZW1lbnQuCisvLyAJICoKKy8vIAkgKiA8cD5UaGUgWE1MIGNvbnRlbnQgaGFuZGxlciB3aWxsIGludm9rZSB0aGlzIG1ldGhvZCBhdCB0aGUgZW5kIG9mIGV2ZXJ5CisvLyAJICogZWxlbWVudCBpbiB0aGUgWE1MIGRvY3VtZW50IHRvIGdpdmUgaGludCBpdHMgdGltZSB0byBwb3AgdXAgdGhlIGN1cnJlbnQKKy8vIAkgKiBlbGVtZW50IGFuZCBwYXJlbnQgYW5kIHBhdGNoIHVwIHBhcmVudCBhbmQgc2libGluZyBwb2ludGVycyBpZiBuZWNlc3NhcnkKKy8vIAkgKgorLy8gCSAqIDxwPiV0YmQlIFRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIG1heSBuZWVkIHRvIGJlIG1vZGlmaWVkIHRvIG1hdGNoIGEKKy8vIAkgKiBjb29yZGluYXRlZCBhY2Nlc3MgdG8gdGhlIERUTURTdHJpbmdQb29sIGJhc2VkIHN5bWJvbCB0YWJsZXMuPC9wPgorLy8gCQkgKgorLy8gCSAqIEBwYXJhbSBucyB0aGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50CisvLyAJICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgcGFydCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVsZW1lbnQKKy8vIAkgKiBAcGFyYW0gbmFtZSBUaGUgZWxlbWVudCBuYW1lCisvLyAJICovCisvLyAJcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbnMsIFN0cmluZyBuYW1lKQorLy8gCXsgCisvLyAJCS8vIHBvcCB1cCB0aGUgc3RhY2tzCisKKy8vIAkJLy8gCisvLyAJCWlmIChwcmV2aW91c1NpYmxpbmdXYXNQYXJlbnQpCisvLyAJCQlub2Rlcy53cml0ZUVudHJ5KHByZXZpb3VzU2libGluZywgMiwgTlVMTCk7CisKKy8vIAkJLy8gUG9wIHBhcmVudGFnZSAKKy8vIAkJcHJldmlvdXNTaWJsaW5nID0gY3VycmVudFBhcmVudDsKKy8vIAkJbm9kZXMucmVhZFNsb3QoY3VycmVudFBhcmVudCwgZ290c2xvdCk7CisvLyAJCWN1cnJlbnRQYXJlbnQgPSBnb3RzbG90WzFdICYgMHhGRkZGOworCisvLyAJCS8vIFRoZSBlbGVtZW50IGp1c3QgYmVpbmcgZmluaXNoZWQgd2lsbCBiZQorLy8gCQkvLyB0aGUgcHJldmlvdXMgc2libGluZyBmb3IgdGhlIG5leHQgb3BlcmF0aW9uCisvLyAJCXByZXZpb3VzU2libGluZ1dhc1BhcmVudCA9IHRydWU7CisKKy8vIAkJLy8gUG9wIGEgbGV2ZWwgb2YgbmFtZXNwYWNlIHRhYmxlCisvLyAJCS8vIG5hbWVzcGFjZVRhYmxlLnJlbW92ZUxhc3RFbGVtKCk7CisvLyAJfQorCisvLyAJLyoqCisvLyAJICogQ3JlYXRlcyBhdHRyaWJ1dGVzIGZvciB0aGUgY3VycmVudCBub2RlLgorLy8gCSAqCisvLyAJICogQHBhcmFtIGF0dHMgQXR0cmlidXRlcyB0byBiZSBjcmVhdGVkLgorLy8gCSAqLworLy8gCXZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHMpIHsKKy8vIAkJaW50IGF0TGVuZ3RoID0gKG51bGwgPT0gYXR0cykgPyAwIDogYXR0cy5nZXRMZW5ndGgoKTsKKy8vIAkJZm9yIChpbnQgaT0wOyBpIDwgYXRMZW5ndGg7IGkrKykgeworLy8gCQkJU3RyaW5nIHFuYW1lID0gYXR0cy5nZXRRTmFtZShpKTsKKy8vIAkJCWNyZWF0ZUF0dHJpYnV0ZShhdHRzLmdldFFOYW1lKGkpLCBhdHRzLmdldFZhbHVlKGkpKTsKKy8vIAkJfQorLy8gCX0KKworLy8gCS8qKgorLy8gCSAqIEFwcGVuZHMgYW4gYXR0cmlidXRlIHRvIHRoZSBkb2N1bWVudC4KKy8vIAkgKiBAcGFyYW0gcW5hbWUgUXVhbGlmaWVkIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorLy8gCSAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlCisvLyAJICogQHJldHVybiBIYW5kbGUgb2Ygbm9kZQorLy8gCSAqLworLy8gCXB1YmxpYyBpbnQgY3JlYXRlQXR0cmlidXRlKFN0cmluZyBxbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisvLyAJCWludCBjb2xvbnBvcyA9IHFuYW1lLmluZGV4T2YoIjoiKTsKKy8vIAkJU3RyaW5nIGF0dE5hbWUgPSBxbmFtZS5zdWJzdHJpbmcoY29sb25wb3MrMSk7CisvLyAJCWludCB3MCA9IDA7CisvLyAJCWlmIChjb2xvbnBvcyA+IDApIHsKKy8vIAkJCVN0cmluZyBwcmVmaXggPSBxbmFtZS5zdWJzdHJpbmcoMCwgY29sb25wb3MpOworLy8gCQkJaWYgKHByZWZpeC5lcXVhbHMoInhtbCIpKSB7CisvLyAJCQkJLy93MCA9IEFUVFJJQlVURV9OT0RFIHwgCisvLyAJCQkJLy8JKG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkNvbnN0YW50cy5TX1hNTE5BTUVTUEFDRVVSSSA8PCAxNik7CisvLyAJCQl9IGVsc2UgeworLy8gCQkJCS8vdzAgPSBBVFRSSUJVVEVfTk9ERSB8IAorLy8gCQkJfQorLy8gCQl9IGVsc2UgeworLy8gCQkJdzAgPSBBVFRSSUJVVEVfTk9ERTsKKy8vIAkJfQorLy8gCQkvLyBXMTogIFBhcmVudAorLy8gCQlpbnQgdzEgPSBjdXJyZW50UGFyZW50OworLy8gCQkvLyBXMjogIE5leHQgKG5vdCB5ZXQgcmVzb2x2ZWQpCisvLyAJCWludCB3MiA9IDA7CisvLyAJCS8vIFczOiAgVGFnIG5hbWUKKy8vIAkJaW50IHczID0gbV9sb2NhbE5hbWVzLnN0cmluZ1RvSW5kZXgoYXR0TmFtZSk7CisvLyAJCS8vIEFkZCBub2RlCisvLyAJCWludCBvdXJzbG90ID0gYXBwZW5kTm9kZSh3MCwgdzEsIHcyLCB3Myk7CisvLyAJCXByZXZpb3VzU2libGluZyA9IG91cnNsb3Q7CS8vIFNob3VsZCBhdHRyaWJ1dGVzIGJlIHByZXZpb3VzIHNpYmxpbmdzCisKKy8vIAkJLy8gVzA6IE5vZGUgVHlwZQorLy8gCQl3MCA9IFRFWFRfTk9ERTsKKy8vIAkJLy8gVzE6IFBhcmVudAorLy8gCQl3MSA9IG91cnNsb3Q7CisvLyAJCS8vIFcyOiBTdGFydCBQb3NpdGlvbiB3aXRoaW4gYnVmZmVyCisvLyAJCXcyID0gbV9jaGFyLmxlbmd0aCgpOworLy8gCQltX2NoYXIuYXBwZW5kKHZhbHVlKTsKKy8vIAkJLy8gVzM6IExlbmd0aAorLy8gCQl3MyA9IG1fY2hhci5sZW5ndGgoKSAtIHcyOworLy8gCQlhcHBlbmROb2RlKHcwLCB3MSwgdzIsIHczKTsKKy8vIAkJY2hhclN0cmluZ1N0YXJ0PW1fY2hhci5sZW5ndGgoKTsKKy8vIAkJY2hhclN0cmluZ0xlbmd0aCA9IDA7CisvLyAJCS8vcHJldmlvdXNTaWJsaW5nID0gb3Vyc2xvdDsKKy8vIAkJLy8gQXR0cnMgYXJlIFBhcmVudHMKKy8vIAkJcHJldmlvdXNTaWJsaW5nV2FzUGFyZW50ID0gdHJ1ZTsKKy8vIAkJcmV0dXJuIChtX2RvY0hhbmRsZSB8IG91cnNsb3QpOworLy8gCX0KKworLy8gCS8qKgorLy8gCSAqIEZhY3RvcnkgbWV0aG9kOyBjcmVhdGVzIGEgVGV4dCBub2RlIGluIHRoaXMgZG9jdW1lbnQuCisvLyAJICoKKy8vIAkgKiBUaGUgbm9kZSBjcmVhdGVkIHdpbGwgYmUgY2hhaW5lZCBhY2NvcmRpbmcgdG8gaXRzIG5hdHVyYWwgb3JkZXIgb2YgcmVxdWVzdAorLy8gCSAqIHJlY2VpdmVkLiAgJVRCRCUgSXQgY2FuIGJlIHJlY2hhaW5lZCBsYXRlciB2aWEgdGhlIG9wdGlvbmFsIERUTSB3cml0YWJsZSBpbnRlcmZhY2UuCisvLyAJICoKKy8vIAkgKiBAcGFyYW0gdGV4dCBTdHJpbmcgVGhlIGNoYXJhY3RlcnMgdGV4dCBzdHJpbmcgZnJvbSB0aGUgWE1MIGRvY3VtZW50LgorLy8gCSAqIEByZXR1cm4gaW50IERUTSBub2RlLW51bWJlciBvZiB0aGUgdGV4dCBub2RlIGNyZWF0ZWQKKy8vIAkgKi8KKy8vIAlwdWJsaWMgaW50IGNyZWF0ZVRleHROb2RlKFN0cmluZyB0ZXh0KQorLy8gCXRocm93cyBEVE1FeGNlcHRpb24KKy8vIAl7IAorLy8gCQkvLyB3cmFwcyBhcm91bmQgdGhlIGluZGV4IHZhbHVlIGJhc2VkIGNyZWF0ZVRleHROb2RlIG1ldGhvZAorLy8gCQlyZXR1cm4gY3JlYXRlVGV4dE5vZGUodGV4dC50b0NoYXJBcnJheSgpLCAwLCB0ZXh0Lmxlbmd0aCgpKTsKKy8vIAl9CisKKy8vIAkvKioKKy8vIAkgKiBGYWN0b3J5IG1ldGhvZDsgY3JlYXRlcyBhIFRleHQgbm9kZSBpbiB0aGlzIGRvY3VtZW50LgorLy8gCSAqCisvLyAJICogVGhlIG5vZGUgY3JlYXRlZCB3aWxsIGJlIGNoYWluZWQgYWNjb3JkaW5nIHRvIGl0cyBuYXR1cmFsIG9yZGVyIG9mIHJlcXVlc3QKKy8vIAkgKiByZWNlaXZlZC4gICVUQkQlIEl0IGNhbiBiZSByZWNoYWluZWQgbGF0ZXIgdmlhIHRoZSBvcHRpb25hbCBEVE0gd3JpdGFibGUgaW50ZXJmYWNlLgorLy8gCSAqCisvLyAJICogJVJFVklFVyUgZm9yIHRleHQgbm9ybWFsaXphdGlvbiBpc3N1ZXMsIHVubGVzcyB3ZSBhcmUgd2lsbGluZyB0bworLy8gCSAqIGluc2lzdCB0aGF0IGFsbCBhZGphY2VudCB0ZXh0IG11c3QgYmUgbWVyZ2VkIGJlZm9yZSB0aGlzIG1ldGhvZAorLy8gCSAqIGlzIGNhbGxlZC4KKy8vIAkgKgorLy8gCSAqIEBwYXJhbSBjaCBUaGUgY2hhcmFjdGVycyBmcm9tIHRoZSBYTUwgZG9jdW1lbnQuCisvLyAJICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCisvLyAJICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBhcnJheS4KKy8vIAkgKi8KKy8vIAlwdWJsaWMgaW50IGNyZWF0ZVRleHROb2RlKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQorLy8gCXRocm93cyBEVE1FeGNlcHRpb24KKy8vIAl7CisvLyAJCW1fY2hhci5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwkJLy8gc3RvcmUgdGhlIGNodW5rIHRvIHRoZSB0ZXh0L2NvbW1lbnQgc3RyaW5nIHRhYmxlCisKKy8vIAkJLy8gY3JlYXRlIGEgVGV4dCBOb2RlCisvLyAJCS8vICVUQkQlIG1heSBiZSBwb3NzaWJsZSB0byBjb21iaW5lIHdpdGggYXBwZW5kTm9kZSgpdG8gcmVwbGFjZSB0aGUgbmV4dCBjaHVuayBvZiBjb2RlCisvLyAJCWludCB3MCA9IFRFWFRfTk9ERTsKKy8vIAkJLy8gVzE6IFBhcmVudAorLy8gCQlpbnQgdzEgPSBjdXJyZW50UGFyZW50OworLy8gCQkvLyBXMjogU3RhcnQgcG9zaXRpb24gd2l0aGluIG1fY2hhcgorLy8gCQlpbnQgdzIgPSBjaGFyU3RyaW5nU3RhcnQ7CisvLyAJCS8vIFczOiBMZW5ndGggb2YgdGhlIGZ1bGwgc3RyaW5nCisvLyAJCWludCB3MyA9IGxlbmd0aDsKKy8vIAkJaW50IG91cnNsb3QgPSBhcHBlbmROb2RlKHcwLCB3MSwgdzIsIHczKTsKKy8vIAkJcHJldmlvdXNTaWJsaW5nID0gb3Vyc2xvdDsKKworLy8gCQljaGFyU3RyaW5nU3RhcnQ9bV9jaGFyLmxlbmd0aCgpOworLy8gCQljaGFyU3RyaW5nTGVuZ3RoID0gMDsKKy8vIAkJcmV0dXJuIChtX2RvY0hhbmRsZSB8IG91cnNsb3QpOworLy8gCX0KKworLy8gCS8qKgorLy8gCSAqIEZhY3RvcnkgbWV0aG9kOyBjcmVhdGVzIGEgQ29tbWVudCBub2RlIGluIHRoaXMgZG9jdW1lbnQuCisvLyAJICoKKy8vIAkgKiBUaGUgbm9kZSBjcmVhdGVkIHdpbGwgYmUgY2hhaW5lZCBhY2NvcmRpbmcgdG8gaXRzIG5hdHVyYWwgb3JkZXIgb2YgcmVxdWVzdAorLy8gCSAqIHJlY2VpdmVkLiAgJVRCRCUgSXQgY2FuIGJlIHJlY2hhaW5lZCBsYXRlciB2aWEgdGhlIG9wdGlvbmFsIERUTSB3cml0YWJsZSBpbnRlcmZhY2UuCisvLyAJICoKKy8vIAkgKiBAcGFyYW0gdGV4dCBTdHJpbmcgVGhlIGNoYXJhY3RlcnMgdGV4dCBzdHJpbmcgZnJvbSB0aGUgWE1MIGRvY3VtZW50LgorLy8gCSAqIEByZXR1cm4gaW50IERUTSBub2RlLW51bWJlciBvZiB0aGUgdGV4dCBub2RlIGNyZWF0ZWQKKy8vIAkgKi8KKy8vIAlwdWJsaWMgaW50IGNyZWF0ZUNvbW1lbnQoU3RyaW5nIHRleHQpCisvLyAJdGhyb3dzIERUTUV4Y2VwdGlvbgorLy8gCXsKKy8vIAkJLy8gd3JhcHMgYXJvdW5kIHRoZSBpbmRleCB2YWx1ZSBiYXNlZCBjcmVhdGVUZXh0Tm9kZSBtZXRob2QKKy8vIAkJcmV0dXJuIGNyZWF0ZUNvbW1lbnQodGV4dC50b0NoYXJBcnJheSgpLCAwLCB0ZXh0Lmxlbmd0aCgpKTsKKy8vIAl9CisKKy8vIAkvKioKKy8vIAkgKiBGYWN0b3J5IG1ldGhvZDsgY3JlYXRlcyBhIENvbW1lbnQgbm9kZSBpbiB0aGlzIGRvY3VtZW50LgorLy8gCSAqCisvLyAJICogVGhlIG5vZGUgY3JlYXRlZCB3aWxsIGJlIGNoYWluZWQgYWNjb3JkaW5nIHRvIGl0cyBuYXR1cmFsIG9yZGVyIG9mIHJlcXVlc3QKKy8vIAkgKiByZWNlaXZlZC4gICVUQkQlIEl0IGNhbiBiZSByZWNoYWluZWQgbGF0ZXIgdmlhIHRoZSBvcHRpb25hbCBEVE0gd3JpdGFibGUgaW50ZXJmYWNlLgorLy8gCSAqCisvLyAJICogQHBhcmFtIGNoIEFuIGFycmF5IGhvbGRpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGNvbW1lbnQuCisvLyAJICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydGluZyBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCisvLyAJICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlIGZyb20gdGhlIGFycmF5LgorLy8gCSAqIEBzZWUgRFRNRXhjZXB0aW9uCisvLyAJICovCisvLyAJcHVibGljIGludCBjcmVhdGVDb21tZW50KGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQorLy8gCXRocm93cyBEVE1FeGNlcHRpb24KKy8vIAl7CisvLyAJCW1fY2hhci5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwkJLy8gc3RvcmUgdGhlIGNvbW1lbnQgc3RyaW5nIHRvIHRoZSB0ZXh0L2NvbW1lbnQgc3RyaW5nIHRhYmxlCisKKy8vIAkJLy8gY3JlYXRlIGEgQ29tbWVudCBOb2RlCisvLyAJCS8vICVUQkQlIG1heSBiZSBwb3NzaWJsZSB0byBjb21iaW5lIHdpdGggYXBwZW5kTm9kZSgpdG8gcmVwbGFjZSB0aGUgbmV4dCBjaHVuayBvZiBjb2RlCisvLyAJCWludCB3MCA9IENPTU1FTlRfTk9ERTsKKy8vIAkJLy8gVzE6IFBhcmVudAorLy8gCQlpbnQgdzEgPSBjdXJyZW50UGFyZW50OworLy8gCQkvLyBXMjogU3RhcnQgcG9zaXRpb24gd2l0aGluIG1fY2hhcgorLy8gCQlpbnQgdzIgPSBjaGFyU3RyaW5nU3RhcnQ7CisvLyAJCS8vIFczOiBMZW5ndGggb2YgdGhlIGZ1bGwgc3RyaW5nCisvLyAJCWludCB3MyA9IGxlbmd0aDsKKy8vIAkJaW50IG91cnNsb3QgPSBhcHBlbmROb2RlKHcwLCB3MSwgdzIsIHczKTsKKy8vIAkJcHJldmlvdXNTaWJsaW5nID0gb3Vyc2xvdDsKKworLy8gCQljaGFyU3RyaW5nU3RhcnQ9bV9jaGFyLmxlbmd0aCgpOworLy8gCQljaGFyU3RyaW5nTGVuZ3RoID0gMDsKKy8vIAkJcmV0dXJuIChtX2RvY0hhbmRsZSB8IG91cnNsb3QpOworLy8gCX0KKworLy8gCS8vIENvdW50ZXJzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgdGV4dCBzdHJpbmcgYmVpbmcgYWNjdW11bGF0ZWQgd2l0aCByZXNwZWN0CisvLyAJLy8gdG8gdGhlIHRleHQvY29tbWVudCBzdHJpbmcgdGFibGU6IGNoYXJTdHJpbmdTdGFydCBzaG91bGQgcG9pbnQgdG8gdGhlIHN0YXJ0aW5nCisvLyAJLy8gb2Zmc2V0IG9mIHRoZSBzdHJpbmcgaW4gdGhlIHRhYmxlIGFuZCBjaGFyU3RyaW5nTGVuZ3RoIHRoZSBhY2NjdW11bGF0ZWQgbGVuZ3RoIHdoZW4KKy8vIAkvLyBhcHBlbmRBY2N1bXVsYXRlZFRleHQgc3RhcnRzLCBhbmQgcmVzZXQgdG8gdGhlIGVuZCBvZiB0aGUgdGFibGUgYW5kIDAgYXQgdGhlIGVuZAorLy8gCS8vIG9mIGFwcGVuZEFjY3VtdWxhdGVkVGV4dCBmb3IgdGhlIG5leHQgc2V0IG9mIGNoYXJhY3RlcnMgcmVjZWl2ZXMKKy8vIAlpbnQgY2hhclN0cmluZ1N0YXJ0PTAsY2hhclN0cmluZ0xlbmd0aD0wOworCisgICAgICAgIC8vID09PT09PT09PSBEb2N1bWVudCBOYXZpZ2F0aW9uIEZ1bmN0aW9ucyA9PT09PT09PT0KKworICAgICAgICAvKiogR2l2ZW4gYSBub2RlIGhhbmRsZSwgdGVzdCBpZiBpdCBoYXMgY2hpbGQgbm9kZXMuCisgICAgICAgICAqIDxwPiAlUkVWSUVXJSBUaGlzIGlzIG9idmlvdXNseSB1c2VmdWwgYXQgdGhlIERPTSBsYXllciwgd2hlcmUgaXQKKyAgICAgICAgICogd291bGQgcGVybWl0IHRlc3RpbmcgdGhpcyB3aXRob3V0IGhhdmluZyB0byBjcmVhdGUgYSBwcm94eQorICAgICAgICAgKiBub2RlLiBJdCdzIGxlc3MgdXNlZnVsIGluIHRoZSBEVE0gQVBJLCB3aGVyZQorICAgICAgICAgKiAoZHRtLmdldEZpcnN0Q2hpbGQobm9kZUhhbmRsZSkhPURUTS5OVUxMKSBpcyBqdXN0IGFzIGZhc3QgYW5kCisgICAgICAgICAqIGFsbW9zdCBhcyBzZWxmLWV2aWRlbnQuIEJ1dCBpdCdzIGEgY29udmVuaWVuY2UsIGFuZCBlYXNlcyBwb3J0aW5nCisgICAgICAgICAqIG9mIERPTSBjb2RlIHRvIERUTS4gIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4KKyAgICAgICAgICogQHJldHVybiBpbnQgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbm9kZSBoYXMgY2hpbGQgbm9kZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKGludCBub2RlSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuKGdldEZpcnN0Q2hpbGQobm9kZUhhbmRsZSkgIT0gTlVMTCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgZ2V0IHRoZSBoYW5kbGUgb2YgdGhlIG5vZGUncyBmaXJzdCBjaGlsZC4KKyAgICAgICAgICogSWYgbm90IHlldCByZXNvbHZlZCwgd2FpdHMgZm9yIG1vcmUgbm9kZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGRvY3VtZW50IGFuZAorICAgICAgICAgKiB0cmllcyBhZ2Fpbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4KKyAgICAgICAgICogQHJldHVybiBpbnQgRFRNIG5vZGUtbnVtYmVyIG9mIGZpcnN0IGNoaWxkLCBvciBEVE0uTlVMTCB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Rmlyc3RDaGlsZChpbnQgbm9kZUhhbmRsZSkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vICMjI3NocyB3b3JyeSBhYm91dCB0cmFjaW5nL2RlYnVnIGxhdGVyCisgICAgICAgICAgICAgICAgbm9kZUhhbmRsZSAmPSBOT0RFSEFORExFX01BU0s7CisgICAgICAgICAgICAgICAgLy8gUmVhZCBub2RlIGludG8gdmFyaWFibGUKKyAgICAgICAgICAgICAgICBub2Rlcy5yZWFkU2xvdChub2RlSGFuZGxlLCBnb3RzbG90KTsKKworICAgICAgICAgICAgICAgIC8vIHR5cGUgaXMgdGhlIGxhc3QgaGFsZiBvZiBmaXJzdCBzbG90CisgICAgICAgICAgICAgICAgc2hvcnQgdHlwZSA9IChzaG9ydCkgKGdvdHNsb3RbMF0gJiAweEZGRkYpOworCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIEVsZW1lbnQgb3IgRG9jdW1lbnQgbm9kZQorICAgICAgICAgICAgICAgIGlmICgodHlwZSA9PSBFTEVNRU5UX05PREUpIHx8ICh0eXBlID09IERPQ1VNRU5UX05PREUpIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBFTlRJVFlfUkVGRVJFTkNFX05PREUpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugd2hlbiBEb2N1bWVudCByb290IGlzIGdpdmVuCisgICAgICAgICAgICAgICAgICAgICAgICAvLwlpZiAobm9kZUhhbmRsZSA9PSAwKSBub2RlSGFuZGxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICVUQkQlIFByb2JhYmx5IHdhcyBhIG1pc3Rha2UuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzb21lb25lIGV4cGxpY2l0bHkgYXNrcyBmb3IgZmlyc3QgY2hpbGQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIERvY3VtZW50LCBJIHdvdWxkIGV4cGVjdCB0aGVtIHRvIHdhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgYW5kIG9ubHkgdGhhdC4KKworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtpZCA9IG5vZGVIYW5kbGUgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucmVhZFNsb3Qoa2lkLCBnb3RzbG90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChBVFRSSUJVVEVfTk9ERSA9PSAoZ290c2xvdFswXSAmIDB4RkZGRikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnRzIHRvIG5leHQgc2libGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraWQgPSBnb3RzbG90WzJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gTlVMTCBpZiBub2RlIGhhcyBvbmx5IGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtpZCA9PSBOVUxMKSByZXR1cm4gTlVMTDsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnJlYWRTbG90KGtpZCwgZ290c2xvdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBwYXJlbnQgc2xvdCBtYXRjaGVzIGdpdmVuIHBhcmVudCwgcmV0dXJuIGtpZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvdHNsb3RbMV0gPT0gbm9kZUhhbmRsZSkJCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdENoaWxkID0ga2lkIHwgbV9kb2NIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RDaGlsZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gTm8gY2hpbGQgZm91bmQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIGFkdmFuY2UgdG8gaXRzIGxhc3QgY2hpbGQuCisgICAgICAgICogSWYgbm90IHlldCByZXNvbHZlZCwgd2FpdHMgZm9yIG1vcmUgbm9kZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGRvY3VtZW50IGFuZAorICAgICAgICAqIHRyaWVzIGFnYWluLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4KKyAgICAgICAgKiBAcmV0dXJuIGludCBOb2RlLW51bWJlciBvZiBsYXN0IGNoaWxkLAorICAgICAgICAqIG9yIERUTS5OVUxMIHRvIGluZGljYXRlIG5vbmUgZXhpc3RzLgorICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldExhc3RDaGlsZChpbnQgbm9kZUhhbmRsZSkgeworICAgICAgICAgICAgICAgIC8vICMjI3NocyBwdXQgdHJhY2UvZGVidWcgbGF0ZXIKKyAgICAgICAgICAgICAgICBub2RlSGFuZGxlICY9IE5PREVIQU5ETEVfTUFTSzsKKyAgICAgICAgICAgICAgICAvLyBkbyBub3QgbmVlZCB0byB0ZXN0IG5vZGUgdHlwZSBzaW5jZSBnZXRGaXJzdENoaWxkIGRvZXMgdGhhdAorICAgICAgICAgICAgICAgIGludCBsYXN0Q2hpbGQgPSBOVUxMOworICAgICAgICAgICAgICAgIGZvciAoaW50IG5leHRraWQgPSBnZXRGaXJzdENoaWxkKG5vZGVIYW5kbGUpOyBuZXh0a2lkICE9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRraWQgPSBnZXROZXh0U2libGluZyhuZXh0a2lkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENoaWxkID0gbmV4dGtpZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RDaGlsZCB8IG1fZG9jSGFuZGxlOwkJCisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmVzIGFuIGF0dHJpYnV0ZSBub2RlIGJ5IGJ5IHF1YWxpZmllZCBuYW1lIGFuZCBuYW1lc3BhY2UgVVJJLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBpbnQgSGFuZGxlIG9mIHRoZSBub2RlIHVwb24gd2hpY2ggdG8gbG9vayB1cCB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSBUaGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgYXR0cmlidXRlIHRvCisgICAgICAgICAqICAgcmV0cmlldmUsIG9yIG51bGwuCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8KKyAgICAgICAgICogICByZXRyaWV2ZS4KKyAgICAgICAgICogQHJldHVybiBUaGUgYXR0cmlidXRlIG5vZGUgaGFuZGxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lICgKKyAgICAgICAgICogICA8Y29kZT5ub2RlTmFtZTwvY29kZT4pIG9yIDxjb2RlPkRUTS5OVUxMPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoCisgICAgICAgICAqICAgYXR0cmlidXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVOb2RlKGludCBub2RlSGFuZGxlLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgIGludCBuc0luZGV4ID0gbV9uc05hbWVzLnN0cmluZ1RvSW5kZXgobmFtZXNwYWNlVVJJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVJbmRleCA9IG1fbG9jYWxOYW1lcy5zdHJpbmdUb0luZGV4KG5hbWUpOworICAgICAgICAgICAgICAgIG5vZGVIYW5kbGUgJj0gTk9ERUhBTkRMRV9NQVNLOworICAgICAgICAgICAgICAgIG5vZGVzLnJlYWRTbG90KG5vZGVIYW5kbGUsIGdvdHNsb3QpOworICAgICAgICAgICAgICAgIHNob3J0IHR5cGUgPSAoc2hvcnQpIChnb3RzbG90WzBdICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICAvLyBJZiBub2RlSGFuZGxlIHBvaW50cyB0byBlbGVtZW50IG5leHQgc2xvdCB3b3VsZCBiZSBmaXJzdCBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBFTEVNRU5UX05PREUpCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlSGFuZGxlKys7CisgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIEF0dHJpYnV0ZSBOb2RlcworICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlID09IEFUVFJJQlVURV9OT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5zSW5kZXggPT0gKGdvdHNsb3RbMF0gPDwgMTYpKSAmJiAoZ290c2xvdFszXSA9PSBuYW1lSW5kZXgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZUhhbmRsZSB8IG1fZG9jSGFuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR290byBuZXh0IHNpYmxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVIYW5kbGUgPSBnb3RzbG90WzJdOworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucmVhZFNsb3Qobm9kZUhhbmRsZSwgZ290c2xvdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIGdldCB0aGUgaW5kZXggb2YgdGhlIG5vZGUncyBmaXJzdCBhdHRyaWJ1dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIEVsZW1lbnQgbm9kZS4KKyAgICAgICAgICogQHJldHVybiBIYW5kbGUgb2YgZmlyc3QgYXR0cmlidXRlLCBvciBEVE0uTlVMTCB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Rmlyc3RBdHRyaWJ1dGUoaW50IG5vZGVIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBub2RlSGFuZGxlICY9IE5PREVIQU5ETEVfTUFTSzsKKworICAgICAgICAgICAgICAgIC8vICVSRVZJRVclIGpqazogSnVzdCBhIHF1aWNrIG9ic2VydmF0aW9uOiBJZiB5b3UncmUgZ29pbmcgdG8KKyAgICAgICAgICAgICAgICAvLyBjYWxsIHJlYWRFbnRyeSByZXBlYXRlZGx5IG9uIHRoZSBzYW1lIG5vZGUsIGl0IG1heSBiZQorICAgICAgICAgICAgICAgIC8vIG1vcmUgZWZmaWNpZW50bHkgdG8gZG8gYSByZWFkU2xvdCB0byBnZXQgdGhlIGRhdGEgbG9jYWxseSwKKyAgICAgICAgICAgICAgICAvLyByZWR1Y2luZyB0aGUgYWRkcmVzc2luZyBhbmQgY2FsbC1hbmQtcmV0dXJuIG92ZXJoZWFkLgorCisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIHdlIGNoZWNrIGlmIGhhbmRsZSBpcyBlbGVtZW50IChkbyB3ZSB3YW50IHNhbml0eSBjaGVja3M/KQorICAgICAgICAgICAgICAgIGlmIChFTEVNRU5UX05PREUgIT0gKG5vZGVzLnJlYWRFbnRyeShub2RlSGFuZGxlLCAwKSAmIDB4RkZGRikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBBdHRyaWJ1dGUgKGlmIGFueSkgc2hvdWxkIGJlIGF0IG5leHQgcG9zaXRpb24gaW4gdGFibGUKKyAgICAgICAgICAgICAgICBub2RlSGFuZGxlKys7CisgICAgICAgICAgICAgICAgcmV0dXJuKEFUVFJJQlVURV9OT0RFID09IChub2Rlcy5yZWFkRW50cnkobm9kZUhhbmRsZSwgMCkgJiAweEZGRkYpKSA/IAorICAgICAgICAgICAgICAgIG5vZGVIYW5kbGUgfCBtX2RvY0hhbmRsZSA6IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgZ2V0IHRoZSBpbmRleCBvZiB0aGUgbm9kZSdzIGZpcnN0IGNoaWxkLgorICAgICAgICAgKiBJZiBub3QgeWV0IHJlc29sdmVkLCB3YWl0cyBmb3IgbW9yZSBub2RlcyB0byBiZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgYW5kCisgICAgICAgICAqIHRyaWVzIGFnYWluCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIGhhbmRsZSB0byBub2RlLCB3aGljaCBzaG91bGQgcHJvYmFibHkgYmUgYW4gZWxlbWVudAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICBub2RlLCBidXQgbmVlZCBub3QgYmUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpblNjb3BlICAgIHRydWUgaWYgYWxsIG5hbWVzcGFjZXMgaW4gc2NvcGUgc2hvdWxkIGJlIHJldHVybmVkLAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiBvbmx5IHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHNob3VsZCBiZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICByZXR1cm5lZC4KKyAgICAgICAgICogQHJldHVybiBoYW5kbGUgb2YgZmlyc3QgbmFtZXNwYWNlLCBvciBEVE0uTlVMTCB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Rmlyc3ROYW1lc3BhY2VOb2RlKGludCBub2RlSGFuZGxlLCBib29sZWFuIGluU2NvcGUpIHsKKworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIGFkdmFuY2UgdG8gaXRzIG5leHQgc2libGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogJVRCRCUgVGhpcyBjdXJyZW50bHkgdXNlcyB0aGUgRFRNLWludGVybmFsIGRlZmluaXRpb24gb2YKKyAgICAgICAgICogc2libGluZzsgZWcsIHRoZSBsYXN0IGF0dHIncyBuZXh0IHNpYiBpcyB0aGUgZmlyc3QKKyAgICAgICAgICogY2hpbGQuIEluIHRoZSBvbGQgRFRNLCB0aGUgRE9NIHByb3h5IGxheWVyIHByb3ZpZGVkIHRoZQorICAgICAgICAgKiBhZGRpdGlvbmFsIGxvZ2ljIGZvciB0aGUgcHVibGljIHZpZXcuICBJZiB3ZSdyZSByZXdyaXRpbmcKKyAgICAgICAgICogZm9yIFhQYXRoIGVtdWxhdGlvbiwgdGhhdCB0ZXN0IG11c3QgYmUgZG9uZSBoZXJlLgorICAgICAgICAgKgorICAgICAgICAgKiAlVEJEJSBDT0RFIElOVEVSQUNUSU9OIFdJVEggQ09ST1VUSU5FIFBBUlNFIC0gSWYgbm90IHlldAorICAgICAgICAgKiByZXNvbHZlZCwgc2hvdWxkIHdhaXQgZm9yIG1vcmUgbm9kZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGRvY3VtZW50CisgICAgICAgICAqIGFuZCB0cmllcyBhZ2Fpbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4KKyAgICAgICAgICogQHJldHVybiBpbnQgTm9kZS1udW1iZXIgb2YgbmV4dCBzaWJsaW5nLAorICAgICAgICAgKiBvciBEVE0uTlVMTCB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KKyAgICAgICAgICogKi8KKyAgICAgICAgcHVibGljIGludCBnZXROZXh0U2libGluZyhpbnQgbm9kZUhhbmRsZSkgeworICAgICAgICAgICAgICAgIG5vZGVIYW5kbGUgJj0gTk9ERUhBTkRMRV9NQVNLOworICAgICAgICAgICAgICAgIC8vIERvY3VtZW50IHJvb3QgaGFzIG5vIG5leHQgc2libGluZworICAgICAgICAgICAgICAgIGlmIChub2RlSGFuZGxlID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAgICAgICAgIHNob3J0IHR5cGUgPSAoc2hvcnQpIChub2Rlcy5yZWFkRW50cnkobm9kZUhhbmRsZSwgMCkgJiAweEZGRkYpOworICAgICAgICAgICAgICAgIGlmICgodHlwZSA9PSBFTEVNRU5UX05PREUpIHx8ICh0eXBlID09IEFUVFJJQlVURV9OT0RFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBFTlRJVFlfUkVGRVJFTkNFX05PREUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dFNpYiA9IG5vZGVzLnJlYWRFbnRyeShub2RlSGFuZGxlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0U2liID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRTaWIgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtX2RvY0hhbmRsZSB8IG5leHRTaWIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gIyMjc2hzIHNob3VsZCBjeWNsZS93YWl0IGlmIG5leHRTaWIgaXMgMD8gV29ya2luZyBvbiB0aHJlYWRpbmcgbmV4dAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBOZXh0IFNpYmxpbmcgaXMgaW4gdGhlIG5leHQgcG9zaXRpb24gaWYgaXQgc2hhcmVzIHRoZSBzYW1lIHBhcmVudAorICAgICAgICAgICAgICAgIGludCB0aGlzUGFyZW50ID0gbm9kZXMucmVhZEVudHJ5KG5vZGVIYW5kbGUsIDEpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChub2Rlcy5yZWFkRW50cnkoKytub2RlSGFuZGxlLCAxKSA9PSB0aGlzUGFyZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtX2RvY0hhbmRsZSB8IG5vZGVIYW5kbGUpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgZmluZCBpdHMgcHJlY2VlZGluZyBzaWJsaW5nLgorICAgICAgICAgKiBXQVJOSU5HOiBEVE0gaXMgYXN5bW1ldHJpYzsgdGhpcyBvcGVyYXRpb24gaXMgcmVzb2x2ZWQgYnkgc2VhcmNoLCBhbmQgaXMKKyAgICAgICAgICogcmVsYXRpdmVseSBleHBlbnNpdmUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICAgICAgICogQHJldHVybiBpbnQgTm9kZS1udW1iZXIgb2YgdGhlIHByZXZpb3VzIHNpYiwKKyAgICAgICAgICogb3IgRFRNLk5VTEwgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldFByZXZpb3VzU2libGluZyhpbnQgbm9kZUhhbmRsZSkgeworICAgICAgICAgICAgICAgIG5vZGVIYW5kbGUgJj0gTk9ERUhBTkRMRV9NQVNLOworICAgICAgICAgICAgICAgIC8vIERvY3VtZW50IHJvb3QgaGFzIG5vIHByZXZpb3VzIHNpYmxpbmcKKyAgICAgICAgICAgICAgICBpZiAobm9kZUhhbmRsZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgICAgICAgICBpbnQgcGFyZW50ID0gbm9kZXMucmVhZEVudHJ5KG5vZGVIYW5kbGUsIDEpOworICAgICAgICAgICAgICAgIGludCBraWQgPSBOVUxMOworICAgICAgICAgICAgICAgIGZvciAoaW50IG5leHRraWQgPSBnZXRGaXJzdENoaWxkKHBhcmVudCk7IG5leHRraWQgIT0gbm9kZUhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGtpZCA9IGdldE5leHRTaWJsaW5nKG5leHRraWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBraWQgPSBuZXh0a2lkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4ga2lkIHwgbV9kb2NIYW5kbGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgYWR2YW5jZSB0byB0aGUgbmV4dCBhdHRyaWJ1dGUuIElmIGFuCisgICAgICAgICAqIGVsZW1lbnQsIHdlIGFkdmFuY2UgdG8gaXRzIGZpcnN0IGF0dHJpYnV0ZTsgaWYgYW4gYXR0ciwgd2UgYWR2YW5jZSB0bworICAgICAgICAgKiB0aGUgbmV4dCBhdHRyIG9uIHRoZSBzYW1lIG5vZGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIG5vZGUuCisgICAgICAgICAqIEByZXR1cm4gaW50IERUTSBub2RlLW51bWJlciBvZiB0aGUgcmVzb2x2ZWQgYXR0ciwKKyAgICAgICAgICogb3IgRFRNLk5VTEwgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldE5leHRBdHRyaWJ1dGUoaW50IG5vZGVIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBub2RlSGFuZGxlICY9IE5PREVIQU5ETEVfTUFTSzsKKyAgICAgICAgICAgICAgICBub2Rlcy5yZWFkU2xvdChub2RlSGFuZGxlLCBnb3RzbG90KTsKKworICAgICAgICAgICAgICAgIC8vJVJFVklFVyUgV2h5IGFyZSB3ZSB1c2luZyBzaG9ydCBoZXJlPyBUaGVyZSdzIG5vIHN0b3JhZ2UKKyAgICAgICAgICAgICAgICAvL3JlZHVjdGlvbiBmb3IgYW4gYXV0b21hdGljIHZhcmlhYmxlLCBlc3BlY2lhbGx5IG9uZSB1c2VkCisgICAgICAgICAgICAgICAgLy9zbyBicmllZmx5LCBhbmQgaXQgdHlwaWNhbGx5IGNvc3RzIG1vcmUgY3ljbGVzIHRvIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAvL3RoYW4gYW4gaW50IHdvdWxkLgorICAgICAgICAgICAgICAgIHNob3J0IHR5cGUgPSAoc2hvcnQpIChnb3RzbG90WzBdICYgMHhGRkZGKTsKKworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEVMRU1FTlRfTk9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEZpcnN0QXR0cmlidXRlKG5vZGVIYW5kbGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBBVFRSSUJVVEVfTk9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvdHNsb3RbMl0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtX2RvY0hhbmRsZSB8IGdvdHNsb3RbMl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHaXZlbiBhIG5hbWVzcGFjZSBoYW5kbGUsIGFkdmFuY2UgdG8gdGhlIG5leHQgbmFtZXNwYWNlLgorICAgICAgICAgKgorICAgICAgICAgKiAlVEJEJSBUSElTIE1FVEhPRCBET0VTIE5PVCBNQVRDSCBUSEUgQ1VSUkVOVCBTSUdOQVRVUkUgSU4KKyAgICAgICAgICogVEhFIERUTSBJTlRFUkZBQ0UuICBGSVggSVQsIE9SIEpVU1RJRlkgQ0hBTkdJTkcgVEhFIERUTQorICAgICAgICAgKiBBUEkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lc3BhY2VIYW5kbGUgaGFuZGxlIHRvIG5vZGUgd2hpY2ggbXVzdCBiZSBvZiB0eXBlIE5BTUVTUEFDRV9OT0RFLgorICAgICAgICAgKiBAcmV0dXJuIGhhbmRsZSBvZiBuZXh0IG5hbWVzcGFjZSwgb3IgRFRNLk5VTEwgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldE5leHROYW1lc3BhY2VOb2RlKGludCBiYXNlSGFuZGxlLGludCBuYW1lc3BhY2VIYW5kbGUsIGJvb2xlYW4gaW5TY29wZSkgeworICAgICAgICAgICAgICAgIC8vICMjI3NocyBuZWVkIHRvIHdvcmsgb24gbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgYWR2YW5jZSB0byBpdHMgbmV4dCBkZXNjZW5kYW50LgorICAgICAgICAgKiBJZiBub3QgeWV0IHJlc29sdmVkLCB3YWl0cyBmb3IgbW9yZSBub2RlcyB0byBiZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgYW5kCisgICAgICAgICAqIHRyaWVzIGFnYWluLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3VidHJlZVJvb3ROb2RlSGFuZGxlCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIG5vZGUuCisgICAgICAgICAqIEByZXR1cm4gaGFuZGxlIG9mIG5leHQgZGVzY2VuZGFudCwKKyAgICAgICAgICogb3IgRFRNLk5VTEwgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldE5leHREZXNjZW5kYW50KGludCBzdWJ0cmVlUm9vdEhhbmRsZSwgaW50IG5vZGVIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBzdWJ0cmVlUm9vdEhhbmRsZSAmPSBOT0RFSEFORExFX01BU0s7CisgICAgICAgICAgICAgICAgbm9kZUhhbmRsZSAmPSBOT0RFSEFORExFX01BU0s7CisgICAgICAgICAgICAgICAgLy8gRG9jdW1lbnQgcm9vdCBbRG9jdW1lbnQgTm9kZT8gLS0gamprXSAtIG5vIG5leHQtc2liCisgICAgICAgICAgICAgICAgaWYgKG5vZGVIYW5kbGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHdoaWxlICghbV9pc0Vycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2N1bWVudCBkb25lIGFuZCBub2RlIG91dCBvZiBib3VuZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lICYmIChub2RlSGFuZGxlID4gbm9kZXMuc2xvdHNVc2VkKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlSGFuZGxlID4gc3VidHJlZVJvb3RIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucmVhZFNsb3Qobm9kZUhhbmRsZSsxLCBnb3RzbG90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvdHNsb3RbMl0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHR5cGUgPSAoc2hvcnQpIChnb3RzbG90WzBdICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBVFRSSUJVVEVfTk9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUhhbmRsZSArPTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0UGFyZW50UG9zID0gZ290c2xvdFsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0UGFyZW50UG9zID49IHN1YnRyZWVSb290SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1fZG9jSGFuZGxlIHwgKG5vZGVIYW5kbGUrMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgd2FpdCBsb2dpYyBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUhhbmRsZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBQcm9iYWJseSBzaG91bGQgdGhyb3cgZXJyb3IgaGVyZSBsaWtlIG9yaWdpbmFsIGluc3RlYWQgb2YgcmV0dXJuaW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgYWR2YW5jZSB0byB0aGUgbmV4dCBub2RlIG9uIHRoZSBmb2xsb3dpbmcgYXhpcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGF4aXNDb250ZXh0SGFuZGxlIHRoZSBzdGFydCBvZiB0aGUgYXhpcyB0aGF0IGlzIGJlaW5nIHRyYXZlcnNlZC4KKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUKKyAgICAgICAgICogQHJldHVybiBoYW5kbGUgb2YgbmV4dCBzaWJsaW5nLAorICAgICAgICAgKiBvciBEVE0uTlVMTCB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TmV4dEZvbGxvd2luZyhpbnQgYXhpc0NvbnRleHRIYW5kbGUsIGludCBub2RlSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgLy8jIyNzaHMgc3RpbGwgd29ya2luZyBvbgorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIGFkdmFuY2UgdG8gdGhlIG5leHQgbm9kZSBvbiB0aGUgcHJlY2VkaW5nIGF4aXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBheGlzQ29udGV4dEhhbmRsZSB0aGUgc3RhcnQgb2YgdGhlIGF4aXMgdGhhdCBpcyBiZWluZyB0cmF2ZXJzZWQuCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICAgICAgICogQHJldHVybiBpbnQgTm9kZS1udW1iZXIgb2YgcHJlY2VkaW5nIHNpYmxpbmcsCisgICAgICAgICAqIG9yIERUTS5OVUxMIHRvIGluZGljYXRlIG5vbmUgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXROZXh0UHJlY2VkaW5nKGludCBheGlzQ29udGV4dEhhbmRsZSwgaW50IG5vZGVIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAvLyAjIyNzaHMgY29waWVkIGZyb20gWGFsYW4gMSwgd2hhdCBpcyB0aGlzIHN1cHBvc2UgdG8gZG8/CisgICAgICAgICAgICAgICAgbm9kZUhhbmRsZSAmPSBOT0RFSEFORExFX01BU0s7CisgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGVIYW5kbGUgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlSGFuZGxlLS07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQVRUUklCVVRFX05PREUgPT0gKG5vZGVzLnJlYWRFbnRyeShub2RlSGFuZGxlLCAwKSAmIDB4RkZGRikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub2RlSGFuZGxlIGlzIF9ub3RfIGFuIGFuY2VzdG9yIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBheGlzQ29udGV4dEhhbmRsZSwgc3BlY2lhbEZpbmQgd2lsbCByZXR1cm4gaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBfaXNfIGFuIGFuY2VzdG9yLCBzcGVjaWFsRmluZCB3aWxsIHJldHVybiAtMQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAlUkVWSUVXJSB1bmNvbmRpdGlvbmFsIHJldHVybiBkZWZlYXRzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHVycG9zZSBvZiB0aGUgd2hpbGUgbG9vcCAtLSBkb2VzIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZ2ljIG1ha2UgYW55IHNlbnNlPworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1fZG9jSGFuZGxlIHwgbm9kZXMuc3BlY2lhbEZpbmQoYXhpc0NvbnRleHRIYW5kbGUsIG5vZGVIYW5kbGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgZmluZCBpdHMgcGFyZW50IG5vZGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICAgICAgICogQHJldHVybiBpbnQgTm9kZS1udW1iZXIgb2YgcGFyZW50LAorICAgICAgICAgKiBvciBEVE0uTlVMTCB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UGFyZW50KGludCBub2RlSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGNoZWNrIHRvIHNlZSB3aXRoaW4gcmFuZ2U/CisKKyAgICAgICAgICAgICAgICAvLyBEb2N1bWVudCBSb290IHNob3VsZCBub3QgaGF2ZSB0byBiZSBoYW5kbGVkIGRpZmZlcmVudGx5CisgICAgICAgICAgICAgICAgcmV0dXJuIChtX2RvY0hhbmRsZSB8IG5vZGVzLnJlYWRFbnRyeShub2RlSGFuZGxlLCAxKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudC4KKyAgICAgICAgICogQHJldHVybiBub2RlSGFuZGxlIHRvIHRoZSBEb2N1bWVudCBSb290LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXREb2N1bWVudFJvb3QoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChtX2RvY0hhbmRsZSB8IG1fZG9jRWxlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIGZpbmQgdGhlIG93bmluZyBkb2N1bWVudCBub2RlLgorICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICAgICAgICAgICAgICAqIEByZXR1cm4gaW50IE5vZGUgaGFuZGxlIG9mIGRvY3VtZW50LCB3aGljaCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkLgorICAgICAgICAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RG9jdW1lbnQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZG9jSGFuZGxlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIGZpbmQgdGhlIG93bmluZyBkb2N1bWVudCBub2RlLiAgVGhpcyBoYXMgdGhlIGV4YWN0CisgICAgICAgICAqIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBET00gRG9jdW1lbnQgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUsIGluIHRoYXQgaWYKKyAgICAgICAgICogdGhlIG5vZGVIYW5kbGUgaXMgYSBkb2N1bWVudCBub2RlLCBpdCB3aWxsIHJldHVybiBOVUxMLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD4lUkVWSUVXJSBTaW5jZSB0aGlzIGlzIERPTS1zcGVjaWZpYywgaXQgbWF5IGJlbG9uZyBhdCB0aGUgRE9NCisgICAgICAgICAqIGJpbmRpbmcgbGF5ZXIuIEluY2x1ZGVkIGhlcmUgYXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBhbmQgdG8KKyAgICAgICAgICogYWlkIHBvcnRpbmcgb2YgRE9NIGNvZGUgdG8gRFRNLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgICAgICAgKiBAcmV0dXJuIGludCBOb2RlIGhhbmRsZSBvZiBvd25pbmcgZG9jdW1lbnQsIG9yIE5VTEwgaWYgdGhlIG5vZGVIYW5kbGUgaXMKKyAgICAgICAgICogICAgICAgICAgICAgYSBkb2N1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0T3duZXJEb2N1bWVudChpbnQgbm9kZUhhbmRsZSkgeworICAgICAgICAgICAgICAgIC8vIEFzc3VtcHRpb24gdGhhdCBEb2N1bWVudCBOb2RlIGlzIGFsd2F5cyBpbiAwIHNsb3QKKyAgICAgICAgICAgICAgICBpZiAoKG5vZGVIYW5kbGUgJiBOT0RFSEFORExFX01BU0spID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG5vZGVIYW5kbGUgJiBET0NIQU5ETEVfTUFTSyk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHN0cmluZy12YWx1ZSBvZiBhIG5vZGUgYXMgYSBTdHJpbmcgb2JqZWN0CisgICAgICAgICAqIChzZWUgaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjZGF0YS1tb2RlbAorICAgICAgICAgKiBmb3IgdGhlIGRlZmluaXRpb24gb2YgYSBub2RlJ3Mgc3RyaW5nLXZhbHVlKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgSUQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQSBzdHJpbmcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc3RyaW5nLXZhbHVlIG9mIHRoZSBnaXZlbiBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFhNTFN0cmluZyBnZXRTdHJpbmdWYWx1ZShpbnQgbm9kZUhhbmRsZSkgeworICAgICAgICAvLyAjIyN6YWogLSByZXNlYXJjaGluZyAKKyAgICAgICAgbm9kZXMucmVhZFNsb3Qobm9kZUhhbmRsZSwgZ290c2xvdCk7CisgICAgICAgIGludCBub2RldHlwZT1nb3RzbG90WzBdICYgMHhGRjsJCQorICAgICAgICBTdHJpbmcgdmFsdWU9bnVsbDsKKworICAgICAgICBzd2l0Y2ggKG5vZGV0eXBlKSB7CQkJCisgICAgICAgIGNhc2UgVEVYVF9OT0RFOiAgIAorICAgICAgICBjYXNlIENPTU1FTlRfTk9ERToKKyAgICAgICAgY2FzZSBDREFUQV9TRUNUSU9OX05PREU6IAorICAgICAgICAgICAgICAgIHZhbHVlPSBtX2NoYXIuZ2V0U3RyaW5nKGdvdHNsb3RbMl0sIGdvdHNsb3RbM10pOwkJCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgorICAgICAgICBjYXNlIEFUVFJJQlVURV9OT0RFOgkKKyAgICAgICAgY2FzZSBFTEVNRU5UX05PREU6CisgICAgICAgIGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtX3hzZi5uZXdzdHIoIHZhbHVlICk7IAorICAgICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IG51bWJlciBvZiBjaGFyYWN0ZXIgYXJyYXkgY2h1bmtzIGluCisgICAgICAgICAqIHRoZSBzdHJpbmctdmFsdWUgb2YgYSBub2RlLgorICAgICAgICAgKiAoc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI2RhdGEtbW9kZWwKKyAgICAgICAgICogZm9yIHRoZSBkZWZpbml0aW9uIG9mIGEgbm9kZSdzIHN0cmluZy12YWx1ZSkuCisgICAgICAgICAqIE5vdGUgdGhhdCBhIHNpbmdsZSB0ZXh0IG5vZGUgbWF5IGhhdmUgbXVsdGlwbGUgdGV4dCBjaHVua3MuCisgICAgICAgICAqCisgICAgICAgICAqIEVYUExBTkFUSU9OOiBUaGlzIG1ldGhvZCBpcyBhbiBhcnRpZmFjdCBvZiB0aGUgZmFjdCB0aGF0IHRoZQorICAgICAgICAgKiB1bmRlcmx5aW5nIG1fY2hhcnMgb2JqZWN0IG1heSBub3Qgc3RvcmUgY2hhcmFjdGVycyBpbiBhCisgICAgICAgICAqIHNpbmdsZSBjb250aWd1b3VzIGFycmF5IC0tIGZvciBleGFtcGxlLHRoZSBjdXJyZW50CisgICAgICAgICAqIEZhc3RTdHJpbmdCdWZmZXIgbWF5IHNwbGl0IGEgc2luZ2xlIG5vZGUncyB0ZXh0IGFjcm9zcworICAgICAgICAgKiBtdWx0aXBsZSBhbGxvY2F0aW9uIHVuaXRzLiAgVGhpcyBjYWxsIHRlbGxzIHVzIGhvdyBtYW55CisgICAgICAgICAqIHNlcGFyYXRlIGFjY2Vzc2VzIHdpbGwgYmUgcmVxdWlyZWQgdG8gcmV0cmlldmUgdGhlIGVudGlyZQorICAgICAgICAgKiBjb250ZW50LiBQTEVBU0UgTk9URSB0aGF0IHRoaXMgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUKKyAgICAgICAgICogbnVtYmVyIG9mIFNBWCBjaGFyYWN0ZXJzKCkgZXZlbnRzIHRoYXQgY2F1c2VkIHRoZSB0ZXh0IG5vZGUKKyAgICAgICAgICogdG8gYmUgYnVpbHQgaW4gdGhlIGZpcnN0IHBsYWNlLCBzaW5jZSBtX2NoYXJzIGJ1ZmZlcmluZyBtYXkKKyAgICAgICAgICogYmUgb24gZGlmZmVyZW50IGJvdW5kYXJpZXMgdGhhbiB0aGUgcGFyc2VyJ3MgYnVmZmVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgSUQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlciBhcnJheSBjaHVua3MgaW4KKyAgICAgICAgICogICAgICAgICB0aGUgc3RyaW5nLXZhbHVlIG9mIGEgbm9kZS4KKyAgICAgICAgICogKi8KKyAgICAgICAgLy8jIyN6YWogLSB0YmQKKyAgICAgICAgcHVibGljIGludCBnZXRTdHJpbmdWYWx1ZUNodW5rQ291bnQoaW50IG5vZGVIYW5kbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyMjI3phaiAgICByZXR1cm4gdmFsdWUgCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgY2hhcmFjdGVyIGFycmF5IGNodW5rIGluIHRoZSBzdHJpbmctdmFsdWUgb2YgYSBub2RlLgorICAgICAgICAgKiAoc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI2RhdGEtbW9kZWwKKyAgICAgICAgICogZm9yIHRoZSBkZWZpbml0aW9uIG9mIGEgbm9kZSdzIHN0cmluZy12YWx1ZSkuCisgICAgICAgICAqIE5vdGUgdGhhdCBhIHNpbmdsZSB0ZXh0IG5vZGUgbWF5IGhhdmUgbXVsdGlwbGUgdGV4dCBjaHVua3MuCisgICAgICAgICAqCisgICAgICAgICAqIEVYUExBTkFUSU9OOiBUaGlzIG1ldGhvZCBpcyBhbiBhcnRpZmFjdCBvZiB0aGUgZmFjdCB0aGF0CisgICAgICAgICAqIHRoZSB1bmRlcmx5aW5nIG1fY2hhcnMgb2JqZWN0IG1heSBub3Qgc3RvcmUgY2hhcmFjdGVycyBpbiBhCisgICAgICAgICAqIHNpbmdsZSBjb250aWd1b3VzIGFycmF5IC0tIGZvciBleGFtcGxlLHRoZSBjdXJyZW50CisgICAgICAgICAqIEZhc3RTdHJpbmdCdWZmZXIgbWF5IHNwbGl0IGEgc2luZ2xlIG5vZGUncyB0ZXh0IGFjcm9zcworICAgICAgICAgKiBtdWx0aXBsZSBhbGxvY2F0aW9uIHVuaXRzLiAgVGhpcyBjYWxsIHJldHJpZXZlcyBhIHNpbmdsZQorICAgICAgICAgKiBjb250aWd1b3VzIHBvcnRpb24gb2YgdGhlIHRleHQgLS0gYXMgbXVjaCBhcyBtLWNoYXJzIHdhcworICAgICAgICAgKiBhYmxlIHRvIHN0b3JlIGluIGEgc2luZ2xlIGFsbG9jYXRpb24gdW5pdC4gIFBMRUFTRSBOT1RFCisgICAgICAgICAqIHRoYXQgdGhpcyBtYXkgbm90IGJlIHRoZSBzYW1lIGdyYW51bGFyaXR5YXMgdGhlIFNBWAorICAgICAgICAgKiBjaGFyYWN0ZXJzKCkgZXZlbnRzIHRoYXQgY2F1c2VkIHRoZSB0ZXh0IG5vZGUgdG8gYmUgYnVpbHQKKyAgICAgICAgICogaW4gdGhlIGZpcnN0IHBsYWNlLCBzaW5jZSBtX2NoYXJzIGJ1ZmZlcmluZyBtYXkgYmUgb24KKyAgICAgICAgICogZGlmZmVyZW50IGJvdW5kYXJpZXMgdGhhbiB0aGUgcGFyc2VyJ3MgYnVmZmVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgSUQuCisgICAgICAgICAqIEBwYXJhbSBjaHVua0luZGV4IFdoaWNoIGNodW5rIHRvIGdldC4KKyAgICAgICAgICogQHBhcmFtIHN0YXJ0QW5kTGVuIEFuIGFycmF5IG9mIDIgd2hlcmUgdGhlIHN0YXJ0IHBvc2l0aW9uIGFuZCBsZW5ndGggb2YKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgIHRoZSBjaHVuayB3aWxsIGJlIHJldHVybmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBjaGFyYWN0ZXIgYXJyYXkgcmVmZXJlbmNlIHdoZXJlIHRoZSBjaHVuayBvY2N1cnMuICAqLworICAgICAgICAvLyMjI3phaiAtIHRiZCAKKyAgICAgICAgcHVibGljIGNoYXJbXSBnZXRTdHJpbmdWYWx1ZUNodW5rKGludCBub2RlSGFuZGxlLCBpbnQgY2h1bmtJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHN0YXJ0QW5kTGVuKSB7cmV0dXJuIG5ldyBjaGFyWzBdO30KKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGFuIElEIHRoYXQgcmVwcmVzZW50cyB0aGUgbm9kZSdzIGV4cGFuZGVkIG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBoYW5kbGUgdG8gdGhlIG5vZGUgaW4gcXVlc3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGV4cGFuZGVkLW5hbWUgaWQgb2YgdGhlIG5vZGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEV4cGFuZGVkTmFtZUlEKGludCBub2RlSGFuZGxlKSB7CisgICAgICAgICAgIG5vZGVzLnJlYWRTbG90KG5vZGVIYW5kbGUsIGdvdHNsb3QpOworICAgICAgICAgICBTdHJpbmcgcU5hbWUgPSBtX2xvY2FsTmFtZXMuaW5kZXhUb1N0cmluZyhnb3RzbG90WzNdKTsgCisgICAgICAgICAgIC8vIFJlbW92ZSBwcmVmaXggZnJvbSBxTmFtZQorICAgICAgICAgICAvLyAlVEJEJSBqamsgVGhpcyBpcyBhc3N1bWluZyB0aGUgZWxlbWVudE5hbWUgaXMgdGhlIHFOYW1lLgorICAgICAgICAgICBpbnQgY29sb25wb3MgPSBxTmFtZS5pbmRleE9mKCI6Iik7CisgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBxTmFtZS5zdWJzdHJpbmcoY29sb25wb3MrMSk7CisgICAgICAgICAgIC8vIEdldCBOUworICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gbV9uc05hbWVzLmluZGV4VG9TdHJpbmcoZ290c2xvdFswXSA8PCAxNik7IAorICAgICAgICAgICAvLyBDcmVhdGUgZXhwYW5kZWQgbmFtZQorICAgICAgICAgICBTdHJpbmcgZXhwYW5kZWROYW1lID0gbmFtZXNwYWNlICsgIjoiICsgbG9jYWxOYW1lOworICAgICAgICAgICBpbnQgZXhwYW5kZWROYW1lSUQgPSBtX25zTmFtZXMuc3RyaW5nVG9JbmRleChleHBhbmRlZE5hbWUpOworCisgICAgICAgIHJldHVybiBleHBhbmRlZE5hbWVJRDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdpdmVuIGFuIGV4cGFuZGVkIG5hbWUsIHJldHVybiBhbiBJRC4gIElmIHRoZSBleHBhbmRlZC1uYW1lIGRvZXMgbm90CisgICAgICAgICAqIGV4aXN0IGluIHRoZSBpbnRlcm5hbCB0YWJsZXMsIHRoZSBlbnRyeSB3aWxsIGJlIGNyZWF0ZWQsIGFuZCB0aGUgSUQgd2lsbAorICAgICAgICAgKiBiZSByZXR1cm5lZC4gIEFueSBhZGRpdGlvbmFsIG5vZGVzIHRoYXQgYXJlIGNyZWF0ZWQgdGhhdCBoYXZlIHRoaXMKKyAgICAgICAgICogZXhwYW5kZWQgbmFtZSB3aWxsIHVzZSB0aGlzIElELgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgaGFuZGxlIHRvIHRoZSBub2RlIGluIHF1ZXN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBleHBhbmRlZC1uYW1lIGlkIG9mIHRoZSBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRFeHBhbmRlZE5hbWVJRChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lLCBpbnQgdHlwZSkgeworICAgICAgICAgICAvLyBDcmVhdGUgZXhwYW5kZWQgbmFtZQorICAgICAgICAgIC8vICVUQkQlIGpqayBFeHBhbmRlZCBuYW1lIGlzIGJpdGZpZWxkLWVuY29kZWQgYXMKKyAgICAgICAgICAvLyB0eXBlSURbNl1uc3VyaUlEWzEwXWxvY2FsSURbMTZdLiBTd2l0Y2ggdG8gdGhhdCBmb3JtLCBhbmQgdG8KKyAgICAgICAgICAvLyBhY2Nlc3NpbmcgdGhlIG5zL2xvY2FsIHZpYSB0aGVpciB0YWJsZXMgcmF0aGVyIHRoYW4gY29uZnVzaW5nCisgICAgICAgICAgLy8gbnNuYW1lcyBhbmQgZXhwYW5kZWRuYW1lcy4KKyAgICAgICAgICAgU3RyaW5nIGV4cGFuZGVkTmFtZSA9IG5hbWVzcGFjZSArICI6IiArIGxvY2FsTmFtZTsKKyAgICAgICAgICAgaW50IGV4cGFuZGVkTmFtZUlEID0gbV9uc05hbWVzLnN0cmluZ1RvSW5kZXgoZXhwYW5kZWROYW1lKTsKKworICAgICAgICAgICByZXR1cm4gZXhwYW5kZWROYW1lSUQ7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHaXZlbiBhbiBleHBhbmRlZC1uYW1lIElELCByZXR1cm4gdGhlIGxvY2FsIG5hbWUgcGFydC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIEV4cGFuZGVkTmFtZUlEIGFuIElEIHRoYXQgcmVwcmVzZW50cyBhbiBleHBhbmRlZC1uYW1lLgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyBMb2NhbCBuYW1lIG9mIHRoaXMgbm9kZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lRnJvbUV4cGFuZGVkTmFtZUlEKGludCBFeHBhbmRlZE5hbWVJRCkgeworCisgICAgICAgICAgIC8vIEdldCBleHBhbmRlZCBuYW1lCisgICAgICAgICAgIFN0cmluZyBleHBhbmRlZE5hbWUgPSBtX2xvY2FsTmFtZXMuaW5kZXhUb1N0cmluZyhFeHBhbmRlZE5hbWVJRCk7IAorICAgICAgICAgICAvLyBSZW1vdmUgcHJlZml4IGZyb20gZXhwYW5kZWQgbmFtZQorICAgICAgICAgICBpbnQgY29sb25wb3MgPSBleHBhbmRlZE5hbWUuaW5kZXhPZigiOiIpOworICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gZXhwYW5kZWROYW1lLnN1YnN0cmluZyhjb2xvbnBvcysxKTsKKyAgICAgICAgICAgcmV0dXJuIGxvY2FsTmFtZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdpdmVuIGFuIGV4cGFuZGVkLW5hbWUgSUQsIHJldHVybiB0aGUgbmFtZXNwYWNlIFVSSSBwYXJ0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gRXhwYW5kZWROYW1lSUQgYW4gSUQgdGhhdCByZXByZXNlbnRzIGFuIGV4cGFuZGVkLW5hbWUuCisgICAgICAgICAqIEByZXR1cm4gU3RyaW5nIFVSSSB2YWx1ZSBvZiB0aGlzIG5vZGUncyBuYW1lc3BhY2UsIG9yIG51bGwgaWYgbm8KKyAgICAgICAgICogbmFtZXNwYWNlIHdhcyByZXNvbHZlZC4KKyAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VGcm9tRXhwYW5kZWROYW1lSUQoaW50IEV4cGFuZGVkTmFtZUlEKSB7CisKKyAgICAgICAgICAgU3RyaW5nIGV4cGFuZGVkTmFtZSA9IG1fbG9jYWxOYW1lcy5pbmRleFRvU3RyaW5nKEV4cGFuZGVkTmFtZUlEKTsgCisgICAgICAgICAgIC8vIFJlbW92ZSBsb2NhbCBuYW1lIGZyb20gZXhwYW5kZWQgbmFtZQorICAgICAgICAgICBpbnQgY29sb25wb3MgPSBleHBhbmRlZE5hbWUuaW5kZXhPZigiOiIpOworICAgICAgICAgICBTdHJpbmcgbnNOYW1lID0gZXhwYW5kZWROYW1lLnN1YnN0cmluZygwLCBjb2xvbnBvcyk7CisKKyAgICAgICAgcmV0dXJuIG5zTmFtZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGZpeGVkbmFtZXMgCisgICAgICAgICovIAorICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZml4ZWRuYW1lcz0KKyAgICAgICAgeworICAgICAgICAgICAgICAgIG51bGwsbnVsbCwJCQkJCQkJLy8gbm90aGluZywgRWxlbWVudAorICAgICAgICAgICAgICAgIG51bGwsIiN0ZXh0IiwJCQkJCQkvLyBBdHRyLCBUZXh0CisgICAgICAgICAgICAgICAgIiNjZGF0YV9zZWN0aW9uIixudWxsLAkvLyBDREFUQSwgRW50aXR5UmVmZXJlbmNlCisgICAgICAgICAgICAgICAgbnVsbCxudWxsLAkJCQkJCQkvLyBFbnRpdHksIFBJCisgICAgICAgICAgICAgICAgIiNjb21tZW50IiwiI2RvY3VtZW50IiwJLy8gQ29tbWVudCwgRG9jdW1lbnQKKyAgICAgICAgICAgICAgICBudWxsLCIjZG9jdW1lbnQtZnJhZ21lbnQiLCAvLyBEb2N0eXBlLCBEb2N1bWVudEZyYWdtZW50CisgICAgICAgICAgICAgICAgbnVsbH07CQkJCQkJCQkJLy8gTm90YXRpb24KKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGl0cyBET00tc3R5bGUgbm9kZSBuYW1lLiBUaGlzIHdpbGwKKyAgICAgICAgICogaW5jbHVkZSBuYW1lcyBzdWNoIGFzICN0ZXh0IG9yICNkb2N1bWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyBOYW1lIG9mIHRoaXMgbm9kZSwgd2hpY2ggbWF5IGJlIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAgICogJVJFVklFVyUgRG9jdW1lbnQgd2hlbiBlbXB0eSBzdHJpbmcgaXMgcG9zc2libGUuLi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoaW50IG5vZGVIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBub2Rlcy5yZWFkU2xvdChub2RlSGFuZGxlLCBnb3RzbG90KTsKKyAgICAgICAgICAgICAgICBzaG9ydCB0eXBlID0gKHNob3J0KSAoZ290c2xvdFswXSAmIDB4RkZGRik7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaXhlZG5hbWVzW3R5cGVdOworICAgICAgICAgICAgICAgIGlmIChudWxsID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgIGludCBpPWdvdHNsb3RbM107CisgICAgICAgICAgICAgICAgICAvKiovU3lzdGVtLm91dC5wcmludGxuKCJnb3QgaT0iK2krIiAiKyhpPj4xNikrIi8iKyhpJjB4ZmZmZikpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBuYW1lPW1fbG9jYWxOYW1lcy5pbmRleFRvU3RyaW5nKGkgJiAweEZGRkYpOworICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeD1tX3ByZWZpeE5hbWVzLmluZGV4VG9TdHJpbmcoaSA+PjE2KTsKKyAgICAgICAgICAgICAgICAgIGlmKHByZWZpeCE9bnVsbCAmJiBwcmVmaXgubGVuZ3RoKCk+MCkKKyAgICAgICAgICAgICAgICAgICAgbmFtZT1wcmVmaXgrIjoiK25hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiB0aGUgWFBhdGggbm9kZSBuYW1lLiAgVGhpcyBzaG91bGQgYmUKKyAgICAgICAgICogdGhlIG5hbWUgYXMgZGVzY3JpYmVkIGJ5IHRoZSBYUGF0aCBkYXRhIG1vZGVsLCBOT1QgdGhlIERPTS1zdHlsZQorICAgICAgICAgKiBuYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbm9kZUhhbmRsZSB0aGUgaWQgb2YgdGhlIG5vZGUuCisgICAgICAgICAqIEByZXR1cm4gU3RyaW5nIE5hbWUgb2YgdGhpcyBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZVgoaW50IG5vZGVIYW5kbGUpIHtyZXR1cm4gbnVsbDt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiBpdHMgRE9NLXN0eWxlIGxvY2FsbmFtZS4KKyAgICAgICAgICogKEFzIGRlZmluZWQgaW4gTmFtZXNwYWNlcywgdGhpcyBpcyB0aGUgcG9ydGlvbiBvZiB0aGUgbmFtZSBhZnRlciBhbnkKKyAgICAgICAgICogY29sb24gY2hhcmFjdGVyKQorICAgICAgICAgKgorICAgICAgICAgKiAlUkVWSUVXJSBXaGF0J3MgdGhlIGxvY2FsIG5hbWUgb2Ygc29tZXRoaW5nIG90aGVyIHRoYW4gRWxlbWVudC9BdHRyPworICAgICAgICAgKiBTaG91bGQgdGhpcyBiZSBET00tc3R5bGUgKHVuZGVmaW5lZCB1bmxlc3MgbmFtZXNwYWNlZCksIG9yIG90aGVyPworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbm9kZUhhbmRsZSB0aGUgaWQgb2YgdGhlIG5vZGUuCisgICAgICAgICAqIEByZXR1cm4gU3RyaW5nIExvY2FsIG5hbWUgb2YgdGhpcyBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoaW50IG5vZGVIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBub2Rlcy5yZWFkU2xvdChub2RlSGFuZGxlLCBnb3RzbG90KTsKKyAgICAgICAgICAgICAgICBzaG9ydCB0eXBlID0gKHNob3J0KSAoZ290c2xvdFswXSAmIDB4RkZGRik7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKKyAgICAgICAgICAgICAgICBpZiAoKHR5cGU9PUVMRU1FTlRfTk9ERSkgfHwgKHR5cGU9PUFUVFJJQlVURV9OT0RFKSkgeworICAgICAgICAgICAgICAgICAgaW50IGk9Z290c2xvdFszXTsKKyAgICAgICAgICAgICAgICAgIG5hbWU9bV9sb2NhbE5hbWVzLmluZGV4VG9TdHJpbmcoaSAmIDB4RkZGRik7CisgICAgICAgICAgICAgICAgICBpZihuYW1lPT1udWxsKSBuYW1lPSIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHaXZlbiBhIG5hbWVzcGFjZSBoYW5kbGUsIHJldHVybiB0aGUgcHJlZml4IHRoYXQgdGhlIG5hbWVzcGFjZSBkZWNsIGlzCisgICAgICAgICAqIG1hcHBpbmcuCisgICAgICAgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiB0aGUgcHJlZml4IHVzZWQgdG8gbWFwIHRvIHRoZSBuYW1lc3BhY2UuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPiAlUkVWSUVXJSBBcmUgeW91IHN1cmUgeW91IHdhbnQgIiIgZm9yIG5vIHByZWZpeD8gIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogJVJFVklFVyUgIFNob3VsZCB0aGlzIGJlIERPTS1zdHlsZSAodW5kZWZpbmVkIHVubGVzcyBuYW1lc3BhY2VkKSwKKyAgICAgICAgICogb3Igb3RoZXI/CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICAgICAgICogQHJldHVybiBTdHJpbmcgcHJlZml4IG9mIHRoaXMgbm9kZSdzIG5hbWUsIG9yICIiIGlmIG5vIGV4cGxpY2l0CisgICAgICAgICAqIG5hbWVzcGFjZSBwcmVmaXggd2FzIGdpdmVuLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoaW50IG5vZGVIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBub2Rlcy5yZWFkU2xvdChub2RlSGFuZGxlLCBnb3RzbG90KTsKKyAgICAgICAgICAgICAgICBzaG9ydCB0eXBlID0gKHNob3J0KSAoZ290c2xvdFswXSAmIDB4RkZGRik7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKKyAgICAgICAgICAgICAgICBpZigodHlwZT09RUxFTUVOVF9OT0RFKSB8fCAodHlwZT09QVRUUklCVVRFX05PREUpKSB7CisgICAgICAgICAgICAgICAgICBpbnQgaT1nb3RzbG90WzNdOworICAgICAgICAgICAgICAgICAgbmFtZT1tX3ByZWZpeE5hbWVzLmluZGV4VG9TdHJpbmcoaSA+PjE2KTsKKyAgICAgICAgICAgICAgICAgIGlmKG5hbWU9PW51bGwpIG5hbWU9IiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiBpdHMgRE9NLXN0eWxlIG5hbWVzcGFjZSBVUkkKKyAgICAgICAgICogKEFzIGRlZmluZWQgaW4gTmFtZXNwYWNlcywgdGhpcyBpcyB0aGUgZGVjbGFyZWQgVVJJIHdoaWNoIHRoaXMgbm9kZSdzCisgICAgICAgICAqIHByZWZpeCAtLSBvciBkZWZhdWx0IGluIGxpZXUgdGhlcmVvZiAtLSB3YXMgbWFwcGVkIHRvLikKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyBVUkkgdmFsdWUgb2YgdGhpcyBub2RlJ3MgbmFtZXNwYWNlLCBvciBudWxsIGlmIG5vCisgICAgICAgICAqIG5hbWVzcGFjZSB3YXMgcmVzb2x2ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgbm9kZUhhbmRsZSkge3JldHVybiBudWxsO30KKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGl0cyBub2RlIHZhbHVlLiBUaGlzIGlzIG1vc3RseQorICAgICAgICAgKiBhcyBkZWZpbmVkIGJ5IHRoZSBET00sIGJ1dCBtYXkgaWdub3JlIHNvbWUgY29udmVuaWVuY2VzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgaWQuCisgICAgICAgICAqIEByZXR1cm4gU3RyaW5nIFZhbHVlIG9mIHRoaXMgbm9kZSwgb3IgbnVsbCBpZiBub3QKKyAgICAgICAgICogbWVhbmluZ2Z1bCBmb3IgdGhpcyBub2RlIHR5cGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZShpbnQgbm9kZUhhbmRsZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIG5vZGVzLnJlYWRTbG90KG5vZGVIYW5kbGUsIGdvdHNsb3QpOworICAgICAgICAgICAgICAgIGludCBub2RldHlwZT1nb3RzbG90WzBdICYgMHhGRjsJCS8vICMjI3phaiB1c2UgbWFzayB0byBnZXQgbm9kZSB0eXBlCisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlPW51bGw7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vZGV0eXBlKSB7CQkJLy8gIyMjemFqIHRvZG8gLSBkb2N1bWVudCBub2RldHlwZXMKKyAgICAgICAgICAgICAgICBjYXNlIEFUVFJJQlVURV9OT0RFOgorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucmVhZFNsb3Qobm9kZUhhbmRsZSsxLCBnb3RzbG90KTsKKyAgICAgICAgICAgICAgICBjYXNlIFRFWFRfTk9ERTogICAKKyAgICAgICAgICAgICAgICBjYXNlIENPTU1FTlRfTk9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENEQVRBX1NFQ1RJT05fTk9ERTogCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1tX2NoYXIuZ2V0U3RyaW5nKGdvdHNsb3RbMl0sIGdvdHNsb3RbM10pOwkJLy8jIyN6YWoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgRUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOyAKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gaXRzIERPTS1zdHlsZSBub2RlIHR5cGUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiAlUkVWSUVXJSBHZW5lcmFsbHksIHJldHVybmluZyBzaG9ydCBpcyBmYWxzZSBlY29ub215LiBSZXR1cm4gaW50PworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBpZC4KKyAgICAgICAgICogQHJldHVybiBpbnQgTm9kZSB0eXBlLCBhcyBwZXIgdGhlIERPTSdzIE5vZGUuX05PREUgY29uc3RhbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHNob3J0IGdldE5vZGVUeXBlKGludCBub2RlSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuKHNob3J0KSAobm9kZXMucmVhZEVudHJ5KG5vZGVIYW5kbGUsIDApICYgMHhGRkZGKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KKyAgICAgICAgICogR2V0IHRoZSBkZXB0aCBsZXZlbCBvZiB0aGlzIG5vZGUgaW4gdGhlIHRyZWUgKGVxdWFscyAxIGZvcgorICAgICAgICAgKiBhIHBhcmVudGxlc3Mgbm9kZSkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYW5jZXN0b3JzLCBwbHVzIG9uZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHNob3J0IGdldExldmVsKGludCBub2RlSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgc2hvcnQgY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChub2RlSGFuZGxlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlSGFuZGxlID0gbm9kZXMucmVhZEVudHJ5KG5vZGVIYW5kbGUsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICAvLyA9PT09PT09PT09PT09PSBEb2N1bWVudCBxdWVyeSBmdW5jdGlvbnMgPT09PT09PT09PT09PT0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGVzdHMgd2hldGhlciBEVE0gRE9NIGltcGxlbWVudGF0aW9uIGltcGxlbWVudHMgYSBzcGVjaWZpYyBmZWF0dXJlIGFuZAorICAgICAgICAgKiB0aGF0IGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgbm9kZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZlYXR1cmUgVGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC4KKyAgICAgICAgICogQHBhcmFtIHZlcnNpb25UaGlzIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LgorICAgICAgICAgKiAgIElmIHRoZSB2ZXJzaW9uIGlzIG5vdAorICAgICAgICAgKiAgIHNwZWNpZmllZCwgc3VwcG9ydGluZyBhbnkgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSB3aWxsIGNhdXNlIHRoZQorICAgICAgICAgKiAgIG1ldGhvZCB0byByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgaXMKKyAgICAgICAgICogICBzdXBwb3J0ZWQgb24gdGhpcyBub2RlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7cmV0dXJuIGZhbHNlO30KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBiYXNlIFVSSSBvZiB0aGUgZG9jdW1lbnQgZW50aXR5LiBJZiBpdCBpcyBub3Qga25vd24KKyAgICAgICAgICogKGJlY2F1c2UgdGhlIGRvY3VtZW50IHdhcyBwYXJzZWQgZnJvbSBhIHNvY2tldCBjb25uZWN0aW9uIG9yIGZyb20KKyAgICAgICAgICogc3RhbmRhcmQgaW5wdXQsIGZvciBleGFtcGxlKSwgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMgdW5rbm93bi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgU3RyaW5nIG9iamVjdCBvciBudWxsIGlmIHVua25vd24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50QmFzZVVSSSgpCisgICAgICAgIHsKKyAgICAgIAorICAgICAgICAgIHJldHVybiBtX2RvY3VtZW50QmFzZVVSSTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgYmFzZSBVUkkgb2YgdGhlIGRvY3VtZW50IGVudGl0eS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJhc2VVUkkgdGhlIGRvY3VtZW50IGJhc2UgVVJJIFN0cmluZyBvYmplY3Qgb3IgbnVsbCBpZiB1bmtub3duLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRCYXNlVVJJKFN0cmluZyBiYXNlVVJJKQorICAgICAgICB7CisgICAgICAKKyAgICAgICAgICBtX2RvY3VtZW50QmFzZVVSSSA9IGJhc2VVUkk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCBlbnRpdHkuIElmCisgICAgICAgICAqIGl0IGlzIG5vdCBrbm93biwgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMgdW5rbm93bi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgaWQsIHdoaWNoIGNhbiBiZSBhbnkgdmFsaWQgbm9kZSBoYW5kbGUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBpZGVudGlmaWVyIFN0cmluZyBvYmplY3Qgb3IgbnVsbCBpZiB1bmtub3duLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudFN5c3RlbUlkZW50aWZpZXIoaW50IG5vZGVIYW5kbGUpIHtyZXR1cm4gbnVsbDt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHNjaGVtZQorICAgICAgICAgKiAgICAgICAgaW4gd2hpY2ggdGhlIGRvY3VtZW50IGVudGl0eSBpcyBleHByZXNzZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLCB3aGljaCBjYW4gYmUgYW55IHZhbGlkIG5vZGUgaGFuZGxlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBlbmNvZGluZyBTdHJpbmcgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudEVuY29kaW5nKGludCBub2RlSGFuZGxlKSB7cmV0dXJuIG51bGw7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYW4gaW5kaWNhdGlvbiBvZiB0aGUgc3RhbmRhbG9uZSBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LAorICAgICAgICAgKiAgICAgICAgZWl0aGVyICJ5ZXMiIG9yICJubyIuIFRoaXMgcHJvcGVydHkgaXMgZGVyaXZlZCBmcm9tIHRoZSBvcHRpb25hbAorICAgICAgICAgKiAgICAgICAgc3RhbmRhbG9uZSBkb2N1bWVudCBkZWNsYXJhdGlvbiBpbiB0aGUgWE1MIGRlY2xhcmF0aW9uIGF0IHRoZQorICAgICAgICAgKiAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudCBlbnRpdHksIGFuZCBoYXMgbm8gdmFsdWUgaWYgdGhlcmUgaXMgbm8KKyAgICAgICAgICogICAgICAgIHN0YW5kYWxvbmUgZG9jdW1lbnQgZGVjbGFyYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLCB3aGljaCBjYW4gYmUgYW55IHZhbGlkIG5vZGUgaGFuZGxlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBzdGFuZGFsb25lIFN0cmluZyBvYmplY3QsIGVpdGhlciAieWVzIiwgIm5vIiwgb3IgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRTdGFuZGFsb25lKGludCBub2RlSGFuZGxlKSB7cmV0dXJuIG51bGw7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBYTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQuIFRoaXMKKyAgICAgICAgICogcHJvcGVydHkgaXMgZGVyaXZlZCBmcm9tIHRoZSBYTUwgZGVjbGFyYXRpb24gb3B0aW9uYWxseSBwcmVzZW50IGF0IHRoZQorICAgICAgICAgKiBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IGVudGl0eSwgYW5kIGhhcyBubyB2YWx1ZSBpZiB0aGVyZSBpcyBubyBYTUwKKyAgICAgICAgICogZGVjbGFyYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aGUgZG9jdW1lbnQgaGFuZGxlCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGRvY3VtZW50IHZlcnNpb24gU3RyaW5nIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudFZlcnNpb24oaW50IGRvY3VtZW50SGFuZGxlKSB7cmV0dXJuIG51bGw7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYW4gaW5kaWNhdGlvbiBvZgorICAgICAgICAgKiB3aGV0aGVyIHRoZSBwcm9jZXNzb3IgaGFzIHJlYWQgdGhlIGNvbXBsZXRlIERURC4gSXRzIHZhbHVlIGlzIGEKKyAgICAgICAgICogYm9vbGVhbi4gSWYgaXQgaXMgZmFsc2UsIHRoZW4gY2VydGFpbiBwcm9wZXJ0aWVzIChpbmRpY2F0ZWQgaW4gdGhlaXIKKyAgICAgICAgICogZGVzY3JpcHRpb25zIGJlbG93KSBtYXkgYmUgdW5rbm93bi4gSWYgaXQgaXMgdHJ1ZSwgdGhvc2UgcHJvcGVydGllcworICAgICAgICAgKiBhcmUgbmV2ZXIgdW5rbm93bi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgZGVjbGFyYXRpb25zIHdlcmUgcHJvY2Vzc2VkIHt9OworICAgICAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXREb2N1bWVudEFsbERlY2xhcmF0aW9uc1Byb2Nlc3NlZCgpIHtyZXR1cm4gZmFsc2U7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiAgIEEgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbiBpbmZvcm1hdGlvbiBpdGVtIGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAgICAgICAqCisgICAgICAgICAqICAgICAxLiBbc3lzdGVtIGlkZW50aWZpZXJdIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgZXh0ZXJuYWwgc3Vic2V0LCBpZgorICAgICAgICAgKiAgICAgICAgaXQgZXhpc3RzLiBPdGhlcndpc2UgdGhpcyBwcm9wZXJ0eSBoYXMgbm8gdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBpZGVudGlmaWVyIFN0cmluZyBvYmplY3QsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlRGVjbGFyYXRpb25TeXN0ZW1JZGVudGlmaWVyKCkge3JldHVybiBudWxsO30KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgZXh0ZXJuYWwgc3Vic2V0LAorICAgICAgICAgKiBub3JtYWxpemVkIGFzIGRlc2NyaWJlZCBpbiA0LjIuMiBFeHRlcm5hbCBFbnRpdGllcyBbWE1MXS4gSWYgdGhlcmUgaXMKKyAgICAgICAgICogbm8gZXh0ZXJuYWwgc3Vic2V0IG9yIGlmIGl0IGhhcyBubyBwdWJsaWMgaWRlbnRpZmllciwgdGhpcyBwcm9wZXJ0eQorICAgICAgICAgKiBoYXMgbm8gdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aGUgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbiBoYW5kbGUKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgcHVibGljIGlkZW50aWZpZXIgU3RyaW5nIG9iamVjdCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudFR5cGVEZWNsYXJhdGlvblB1YmxpY0lkZW50aWZpZXIoKSB7cmV0dXJuIG51bGw7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5FbGVtZW50PC9jb2RlPiB3aG9zZSA8Y29kZT5JRDwvY29kZT4gaXMgZ2l2ZW4gYnkKKyAgICAgICAgICogPGNvZGU+ZWxlbWVudElkPC9jb2RlPi4gSWYgbm8gc3VjaCBlbGVtZW50IGV4aXN0cywgcmV0dXJucworICAgICAgICAgKiA8Y29kZT5EVE0uTlVMTDwvY29kZT4uIEJlaGF2aW9yIGlzIG5vdCBkZWZpbmVkIGlmIG1vcmUgdGhhbiBvbmUgZWxlbWVudAorICAgICAgICAgKiBoYXMgdGhpcyA8Y29kZT5JRDwvY29kZT4uIEF0dHJpYnV0ZXMgKGluY2x1ZGluZyB0aG9zZQorICAgICAgICAgKiB3aXRoIHRoZSBuYW1lICJJRCIpIGFyZSBub3Qgb2YgdHlwZSBJRCB1bmxlc3Mgc28gZGVmaW5lZCBieSBEVEQvU2NoZW1hCisgICAgICAgICAqIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byB0aGUgRFRNIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgKiBJbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBub3Qga25vdyB3aGV0aGVyIGF0dHJpYnV0ZXMgYXJlIG9mIHR5cGUgSUQgb3IKKyAgICAgICAgICogbm90IGFyZSBleHBlY3RlZCB0byByZXR1cm4gPGNvZGU+RFRNLk5VTEw8L2NvZGU+LgorICAgICAgICAgKgorICAgICAgICAgKiA8cD4lUkVWSUVXJSBQcmVzdW1hYmx5IElEcyBhcmUgc3RpbGwgc2NvcGVkIHRvIGEgc2luZ2xlIGRvY3VtZW50LAorICAgICAgICAgKiBhbmQgdGhpcyBvcGVyYXRpb24gc2VhcmNoZXMgb25seSB3aXRoaW4gYSBzaW5nbGUgZG9jdW1lbnQsIHJpZ2h0PworICAgICAgICAgKiBXb3VsZG4ndCB3YW50IGNvbGxpc2lvbnMgYmV0d2VlbiBEVE1zIGluIHRoZSBzYW1lIHByb2Nlc3MuPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZWxlbWVudElkIFRoZSB1bmlxdWUgPGNvZGU+aWQ8L2NvZGU+IHZhbHVlIGZvciBhbiBlbGVtZW50LgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBoYW5kbGUgb2YgdGhlIG1hdGNoaW5nIGVsZW1lbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEVsZW1lbnRCeUlkKFN0cmluZyBlbGVtZW50SWQpIHtyZXR1cm4gMDt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBnZXRVbnBhcnNlZEVudGl0eVVSSSBmdW5jdGlvbiByZXR1cm5zIHRoZSBVUkkgb2YgdGhlIHVucGFyc2VkCisgICAgICAgICAqIGVudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGUgc2FtZSBkb2N1bWVudCBhcyB0aGUgY29udGV4dAorICAgICAgICAgKiBub2RlIChzZWUgWzMuMyBVbnBhcnNlZCBFbnRpdGllc10pLiBJdCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYKKyAgICAgICAgICogdGhlcmUgaXMgbm8gc3VjaCBlbnRpdHkuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBYTUwgcHJvY2Vzc29ycyBtYXkgY2hvb3NlIHRvIHVzZSB0aGUgU3lzdGVtIElkZW50aWZpZXIgKGlmIG9uZQorICAgICAgICAgKiBpcyBwcm92aWRlZCkgdG8gcmVzb2x2ZSB0aGUgZW50aXR5LCByYXRoZXIgdGhhbiB0aGUgVVJJIGluIHRoZQorICAgICAgICAgKiBQdWJsaWMgSWRlbnRpZmllci4gVGhlIGRldGFpbHMgYXJlIGRlcGVuZGVudCBvbiB0aGUgcHJvY2Vzc29yLCBhbmQKKyAgICAgICAgICogd2Ugd291bGQgaGF2ZSB0byBzdXBwb3J0IHNvbWUgZm9ybSBvZiBwbHVnLWluIHJlc29sdmVyIHRvIGhhbmRsZQorICAgICAgICAgKiB0aGlzIHByb3Blcmx5LiBDdXJyZW50bHksIHdlIHNpbXBseSByZXR1cm4gdGhlIFN5c3RlbSBJZGVudGlmaWVyIGlmCisgICAgICAgICAqIHByZXNlbnQsIGFuZCBob3BlIHRoYXQgaXQgYSB1c2FibGUgVVJJIG9yIHRoYXQgb3VyIGNhbGxlciBjYW4KKyAgICAgICAgICogbWFwIGl0IHRvIG9uZS4KKyAgICAgICAgICogVE9ETzogUmVzb2x2ZSBQdWJsaWMgSWRlbnRpZmllcnMuLi4gb3IgY29uc2lkZXIgY2hhbmdpbmcgZnVuY3Rpb24gbmFtZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIElmIHdlIGZpbmQgYSByZWxhdGl2ZSBVUkkKKyAgICAgICAgICogcmVmZXJlbmNlLCBYTUwgZXhwZWN0cyBpdCB0byBiZSByZXNvbHZlZCBpbiB0ZXJtcyBvZiB0aGUgYmFzZSBVUkkKKyAgICAgICAgICogb2YgdGhlIGRvY3VtZW50LiBUaGUgRE9NIGRvZXNuJ3QgZG8gdGhhdCBmb3IgdXMsIGFuZCBpdCBpc24ndAorICAgICAgICAgKiBlbnRpcmVseSBjbGVhciB3aGV0aGVyIHRoYXQgc2hvdWxkIGJlIGRvbmUgaGVyZTsgY3VycmVudGx5IHRoYXQncworICAgICAgICAgKiBwdXNoZWQgdXAgdG8gYSBoaWdoZXIgbGV2ZWwgb2Ygb3VyIGFwcGxpY2F0aW9uLiAoTm90ZSB0aGF0IERPTSBMZXZlbAorICAgICAgICAgKiAxIGRpZG4ndCBzdG9yZSB0aGUgZG9jdW1lbnQncyBiYXNlIFVSSS4pCisgICAgICAgICAqIFRPRE86IENvbnNpZGVyIHJlc29sdmluZyBSZWxhdGl2ZSBVUklzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogKFRoZSBET00ncyBzdGF0ZW1lbnQgdGhhdCAiQW4gWE1MIHByb2Nlc3NvciBtYXkgY2hvb3NlIHRvCisgICAgICAgICAqIGNvbXBsZXRlbHkgZXhwYW5kIGVudGl0aWVzIGJlZm9yZSB0aGUgc3RydWN0dXJlIG1vZGVsIGlzIHBhc3NlZAorICAgICAgICAgKiB0byB0aGUgRE9NIiByZWZlcnMgb25seSB0byBwYXJzZWQgZW50aXRpZXMsIG5vdCB1bnBhcnNlZCwgYW5kIGhlbmNlCisgICAgICAgICAqIGRvZXNuJ3QgYWZmZWN0IHRoaXMgZnVuY3Rpb24uKQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBFbnRpdHkgTmFtZSBvZiB0aGUgdW5wYXJzZWQKKyAgICAgICAgICogZW50aXR5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBVUkkgb2YgdGhlIFVucGFyc2VkIEVudGl0eSwgb3IgYW4KKyAgICAgICAgICogZW1wdHkgc3RyaW5nIGlmIG5vIHN1Y2ggZW50aXR5IGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5wYXJzZWRFbnRpdHlVUkkoU3RyaW5nIG5hbWUpIHtyZXR1cm4gbnVsbDt9CisKKworICAgICAgICAvLyA9PT09PT09PT09PT09PSBCb29sZWFuIG1ldGhvZHMgPT09PT09PT09PT09PT09PQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgeHNsOnN0cmlwLXNwYWNlIG9yIHhzbDpwcmVzZXJ2ZS1zcGFjZSB3YXMgcHJvY2Vzc2VkCisgICAgICAgICAqIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgdGhlIERUTSBkb2N1bWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+JVJFVkVJVyUgUHJlc3VtZXMgYSAxOjEgbWFwcGluZyBmcm9tIERUTSB0byBEb2N1bWVudCwgc2luY2UKKyAgICAgICAgICogd2UgYXJlbid0IHNheWluZyB3aGljaCBEb2N1bWVudCB0byBxdWVyeS4uLj88L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1ByZVN0cmlwcGluZygpIHtyZXR1cm4gZmFsc2U7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaWd1cmUgb3V0IHdoZXRoZXIgbm9kZUhhbmRsZTIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgYmVpbmcgbGF0ZXIKKyAgICAgICAgICogaW4gdGhlIGRvY3VtZW50IHRoYW4gbm9kZUhhbmRsZTEsIGluIERvY3VtZW50IE9yZGVyIGFzIGRlZmluZWQKKyAgICAgICAgICogYnkgdGhlIFhQYXRoIG1vZGVsLiBUaGlzIG1heSBub3QgYWdyZWUgd2l0aCB0aGUgb3JkZXJpbmcgZGVmaW5lZAorICAgICAgICAgKiBieSBvdGhlciBYTUwgYXBwbGljYXRpb25zLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUgb3JkZXJpbmcgaXNuJ3QgZGVmaW5lZCwgYW5kIG5laXRoZXIgYXJlCisgICAgICAgICAqIHRoZSByZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gLS0gdGhvdWdoIHdlJ2xsIGdlbmVyYWxseSByZXR1cm4gdHJ1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVE9ETzogTWFrZSBzdXJlIHRoaXMgZG9lcyB0aGUgcmlnaHQgdGhpbmcgd2l0aCBhdHRyaWJ1dGUgbm9kZXMhISEKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGUxIERPTSBOb2RlIHRvIHBlcmZvcm0gcG9zaXRpb24gY29tcGFyaXNvbiBvbi4KKyAgICAgICAgICogQHBhcmFtIG5vZGUyIERPTSBOb2RlIHRvIHBlcmZvcm0gcG9zaXRpb24gY29tcGFyaXNvbiBvbiAuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gZmFsc2UgaWYgbm9kZTIgY29tZXMgYmVmb3JlIG5vZGUxLCBvdGhlcndpc2UgcmV0dXJuIHRydWUuCisgICAgICAgICAqIFlvdSBjYW4gdGhpbmsgb2YgdGhpcyBhcworICAgICAgICAgKiA8Y29kZT4obm9kZTEuZG9jdW1lbnRPcmRlclBvc2l0aW9uICZsdDs9IG5vZGUyLmRvY3VtZW50T3JkZXJQb3NpdGlvbik8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOb2RlQWZ0ZXIoaW50IG5vZGVIYW5kbGUxLCBpbnQgbm9kZUhhbmRsZTIpIHtyZXR1cm4gZmFsc2U7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiAgICAgMi4gW2VsZW1lbnQgY29udGVudCB3aGl0ZXNwYWNlXSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICAgICAgICAgKiAgICAgICAgY2hhcmFjdGVyIGlzIHdoaXRlIHNwYWNlIGFwcGVhcmluZyB3aXRoaW4gZWxlbWVudCBjb250ZW50IChzZWUgW1hNTF0sCisgICAgICAgICAqICAgICAgICAyLjEwICJXaGl0ZSBTcGFjZSBIYW5kbGluZyIpLiBOb3RlIHRoYXQgdmFsaWRhdGluZyBYTUwgcHJvY2Vzc29ycyBhcmUKKyAgICAgICAgICogICAgICAgIHJlcXVpcmVkIGJ5IFhNTCAxLjAgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLiBJZiB0aGVyZSBpcyBubworICAgICAgICAgKiAgICAgICAgZGVjbGFyYXRpb24gZm9yIHRoZSBjb250YWluaW5nIGVsZW1lbnQsIHRoaXMgcHJvcGVydHkgaGFzIG5vIHZhbHVlIGZvcgorICAgICAgICAgKiAgICAgICAgd2hpdGUgc3BhY2UgY2hhcmFjdGVycy4gSWYgbm8gZGVjbGFyYXRpb24gaGFzIGJlZW4gcmVhZCwgYnV0IHRoZSBbYWxsCisgICAgICAgICAqICAgICAgICBkZWNsYXJhdGlvbnMgcHJvY2Vzc2VkXSBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgaW5mb3JtYXRpb24gaXRlbSBpcworICAgICAgICAgKiAgICAgICAgZmFsc2UgKHNvIHRoZXJlIG1heSBiZSBhbiB1bnJlYWQgZGVjbGFyYXRpb24pLCB0aGVuIHRoZSB2YWx1ZSBvZiB0aGlzCisgICAgICAgICAqICAgICAgICBwcm9wZXJ0eSBpcyB1bmtub3duIGZvciB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzLiBJdCBpcyBhbHdheXMgZmFsc2UgZm9yCisgICAgICAgICAqICAgICAgICBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCB3aGl0ZSBzcGFjZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIG5vZGUgSUQuCisgICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoYXJhY3RlciBkYXRhIGlzIHdoaXRlc3BhY2U7CisgICAgICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVyRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKGludCBub2RlSGFuZGxlKSB7cmV0dXJuIGZhbHNlO30KKworICAgICAgICAvKioKKyAgICAgICAgICogICAgMTAuIFthbGwgZGVjbGFyYXRpb25zIHByb2Nlc3NlZF0gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3RyaWN0bHkgc3BlYWtpbmcKKyAgICAgICAgICogICAgICAgIHBhcnQgb2YgdGhlIGluZm9zZXQgb2YgdGhlIGRvY3VtZW50LiBSYXRoZXIgaXQgaXMgYW4gaW5kaWNhdGlvbiBvZgorICAgICAgICAgKiAgICAgICAgd2hldGhlciB0aGUgcHJvY2Vzc29yIGhhcyByZWFkIHRoZSBjb21wbGV0ZSBEVEQuIEl0cyB2YWx1ZSBpcyBhCisgICAgICAgICAqICAgICAgICBib29sZWFuLiBJZiBpdCBpcyBmYWxzZSwgdGhlbiBjZXJ0YWluIHByb3BlcnRpZXMgKGluZGljYXRlZCBpbiB0aGVpcgorICAgICAgICAgKiAgICAgICAgZGVzY3JpcHRpb25zIGJlbG93KSBtYXkgYmUgdW5rbm93bi4gSWYgaXQgaXMgdHJ1ZSwgdGhvc2UgcHJvcGVydGllcworICAgICAgICAgKiAgICAgICAgYXJlIG5ldmVyIHVua25vd24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aGUgZG9jdW1lbnQgaGFuZGxlCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkb2N1bWVudEhhbmRsZSBBIG5vZGUgaGFuZGxlIHRoYXQgbXVzdCBpZGVudGlmeSBhIGRvY3VtZW50LgorICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBkZWNsYXJhdGlvbnMgd2VyZSBwcm9jZXNzZWQ7CisgICAgICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRG9jdW1lbnRBbGxEZWNsYXJhdGlvbnNQcm9jZXNzZWQoaW50IGRvY3VtZW50SGFuZGxlKSB7cmV0dXJuIGZhbHNlO30KKworICAgICAgICAvKioKKyAgICAgICAgICogICAgIDUuIFtzcGVjaWZpZWRdIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgd2FzIGFjdHVhbGx5CisgICAgICAgICAqICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIHN0YXJ0LXRhZyBvZiBpdHMgZWxlbWVudCwgb3Igd2FzIGRlZmF1bHRlZCBmcm9tIHRoZQorICAgICAgICAgKiAgICAgICAgRFRELgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGhlIGF0dHJpYnV0ZSBoYW5kbGUKKyAgICAgICAgICoKKyAgICAgICAgICogTkVFRFNET0MgQHBhcmFtIGF0dHJpYnV0ZUhhbmRsZQorICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZDsKKyAgICAgICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd2FzIGRlZmF1bHRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKGludCBhdHRyaWJ1dGVIYW5kbGUpIHtyZXR1cm4gZmFsc2U7fQorCisgICAgICAgIC8vID09PT09PT09PT0gRGlyZWN0IFNBWCBEaXNwYXRjaCwgZm9yIG9wdGltaXphdGlvbiBwdXJwb3NlcyA9PT09PT09PQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEaXJlY3RseSBjYWxsIHRoZQorICAgICAgICAgKiBjaGFyYWN0ZXJzIG1ldGhvZCBvbiB0aGUgcGFzc2VkIENvbnRlbnRIYW5kbGVyIGZvciB0aGUKKyAgICAgICAgICogc3RyaW5nLXZhbHVlIG9mIHRoZSBnaXZlbiBub2RlIChzZWUgaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjZGF0YS1tb2RlbAorICAgICAgICAgKiBmb3IgdGhlIGRlZmluaXRpb24gb2YgYSBub2RlJ3Mgc3RyaW5nLXZhbHVlKS4gTXVsdGlwbGUgY2FsbHMgdG8gdGhlCisgICAgICAgICAqIENvbnRlbnRIYW5kbGVyJ3MgY2hhcmFjdGVycyBtZXRob2RzIG1heSB3ZWxsIG9jY3VyIGZvciBhIHNpbmdsZSBjYWxsIHRvCisgICAgICAgICAqIHRoaXMgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KKyAgICAgICAgICogQHBhcmFtIGNoIEEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgQ29udGVudEhhbmRsZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaENoYXJhY3RlcnNFdmVudHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub2RlSGFuZGxlLCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBjaCkKKyAgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEaXJlY3RseSBjcmVhdGUgU0FYIHBhcnNlciBldmVudHMgZnJvbSBhIHN1YnRyZWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIElELgorICAgICAgICAgKiBAcGFyYW0gY2ggQSBub24tbnVsbCByZWZlcmVuY2UgdG8gYSBDb250ZW50SGFuZGxlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgICAgICAgICovCisKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hUb0V2ZW50cyhpbnQgbm9kZUhhbmRsZSwgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgY2gpCisgICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24ge30KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYW4gRE9NIG5vZGUgZm9yIHRoZSBnaXZlbiBub2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBBIG5vZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIERUTSBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0Tm9kZShpbnQgbm9kZUhhbmRsZSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gPT09PSBDb25zdHJ1Y3Rpb24gbWV0aG9kcyAobWF5IG5vdCBiZSBzdXBwb3J0ZWQgYnkgc29tZSBpbXBsZW1lbnRhdGlvbnMhKSA9PT09PQorICAgICAgICAvLyAlUkVWSUVXJSBqams6IFRoZXNlIHByb2JhYmx5IGFyZW4ndCB0aGUgcmlnaHQgQVBJLiBBdCB0aGUgdmVyeSBsZWFzdAorICAgICAgICAvLyB0aGV5IG5lZWQgdG8gZGVhbCB3aXRoIGN1cnJlbnQtaW5zZXJ0aW9uLWxvY2F0aW9uIGFuZCBlbmQtZWxlbWVudAorICAgICAgICAvLyBpc3N1ZXMuCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFwcGVuZCBhIGNoaWxkIHRvIHRoZSBlbmQgb2YgdGhlIGNoaWxkIGxpc3Qgb2YgdGhlIGN1cnJlbnQgbm9kZS4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgbm9kZQorICAgICAgICAgKiBpcyBhbHdheXMgY2xvbmVkIGlmIGl0IGlzIG93bmVkIGJ5IGFub3RoZXIgZG9jdW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPiVSRVZJRVclICJFbmQgb2YgdGhlIGRvY3VtZW50IiBuZWVkcyB0byBiZSBkZWZpbmVkIG1vcmUgY2xlYXJseS4KKyAgICAgICAgICogRG9lcyBpdCBiZWNvbWUgdGhlIGxhc3QgY2hpbGQgb2YgdGhlIERvY3VtZW50PyBPZiB0aGUgcm9vdCBlbGVtZW50PzwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5ld0NoaWxkIE11c3QgYmUgYSB2YWxpZCBuZXcgbm9kZSBoYW5kbGUuCisgICAgICAgICAqIEBwYXJhbSBjbG9uZSB0cnVlIGlmIHRoZSBjaGlsZCBzaG91bGQgYmUgY2xvbmVkIGludG8gdGhlIGRvY3VtZW50LgorICAgICAgICAgKiBAcGFyYW0gY2xvbmVEZXB0aCBpZiB0aGUgY2xvbmUgYXJndW1lbnQgaXMgdHJ1ZSwgc3BlY2lmaWVzIHRoYXQgdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgIGNsb25lIHNob3VsZCBpbmNsdWRlIGFsbCBpdCdzIGNoaWxkcmVuLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYXBwZW5kQ2hpbGQoaW50IG5ld0NoaWxkLCBib29sZWFuIGNsb25lLCBib29sZWFuIGNsb25lRGVwdGgpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHNhbWVEb2MgPSAoKG5ld0NoaWxkICYgRE9DSEFORExFX01BU0spID09IG1fZG9jSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xvbmUgfHwgIXNhbWVEb2MpIHsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQXBwZW5kIGEgdGV4dCBub2RlIGNoaWxkIHRoYXQgd2lsbCBiZSBjb25zdHJ1Y3RlZCBmcm9tIGEgc3RyaW5nLAorICAgICAgICAgKiB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+JVJFVklFVyUgIkVuZCBvZiB0aGUgZG9jdW1lbnQiIG5lZWRzIHRvIGJlIGRlZmluZWQgbW9yZSBjbGVhcmx5LgorICAgICAgICAgKiBEb2VzIGl0IGJlY29tZSB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgRG9jdW1lbnQ/IE9mIHRoZSByb290IGVsZW1lbnQ/PC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyIE5vbi1udWxsIHJlZmVyZW5jZSB0byBhIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRleHRDaGlsZChTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICAgICAgLy8gIyMjc2hzIFRoaW5rIG1vcmUgYWJvdXQgaG93IHRoaXMgZGlmZmVycyBmcm9tIGNyZWF0ZVRleHROb2RlCisgICAgICAgICAgLy8lVEJEJQorICAgICAgICB9CisKKworICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gPT09PSBCVUlMREVSIG1ldGhvZHMgPT09PQorICAvLyAlVEJEJSBqams6IFNIT1VMRCBQUk9CQUJMWSBCRSBJTkxJTkVELCB1bmxlc3Mgd2Ugd2FudCB0byBzdXBwb3J0CisgIC8vIGJvdGggU0FYMSBhbmQgU0FYMiBhbmQgc2hhcmUgdGhpcyBsb2dpYyBiZXR3ZWVuIHRoZW0uCisKKyAgLyoqIEFwcGVuZCBhIHRleHQgY2hpbGQgYXQgdGhlIGN1cnJlbnQgaW5zZXJ0aW9uIHBvaW50LiBBc3N1bWVzIHRoYXQgdGhlCisgICAqIGFjdHVhbCBjb250ZW50IG9mIHRoZSB0ZXh0IGhhcyBwcmV2aW91c2x5IGJlZW4gYXBwZW5kZWQgdG8gdGhlIG1fY2hhcgorICAgKiBidWZmZXIgKHNoYXJlZCB3aXRoIHRoZSBidWlsZGVyKS4KKyAgICoKKyAgICogQHBhcmFtIG1fY2hhcl9jdXJyZW50X3N0YXJ0IGludCBTdGFydGluZyBvZmZzZXQgb2Ygbm9kZSdzIGNvbnRlbnQgaW4gbV9jaGFyLgorICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBpbnQgTGVuZ3RoIG9mIG5vZGUncyBjb250ZW50IGluIG1fY2hhci4KKyAgICogKi8KKyAgdm9pZCBhcHBlbmRUZXh0Q2hpbGQoaW50IG1fY2hhcl9jdXJyZW50X3N0YXJ0LGludCBjb250ZW50TGVuZ3RoKQorICB7CisgICAgLy8gY3JlYXRlIGEgVGV4dCBOb2RlCisgICAgLy8gJVRCRCUgbWF5IGJlIHBvc3NpYmxlIHRvIGNvbWJpbmUgd2l0aCBhcHBlbmROb2RlKCl0byByZXBsYWNlIHRoZSBuZXh0IGNodW5rIG9mIGNvZGUKKyAgICBpbnQgdzAgPSBURVhUX05PREU7CisgICAgLy8gVzE6IFBhcmVudAorICAgIGludCB3MSA9IGN1cnJlbnRQYXJlbnQ7CisgICAgLy8gVzI6IFN0YXJ0IHBvc2l0aW9uIHdpdGhpbiBtX2NoYXIKKyAgICBpbnQgdzIgPSBtX2NoYXJfY3VycmVudF9zdGFydDsKKyAgICAvLyBXMzogTGVuZ3RoIG9mIHRoZSBmdWxsIHN0cmluZworICAgIGludCB3MyA9IGNvbnRlbnRMZW5ndGg7CisKKyAgICBpbnQgb3Vyc2xvdCA9IGFwcGVuZE5vZGUodzAsIHcxLCB3MiwgdzMpOworICAgIHByZXZpb3VzU2libGluZyA9IG91cnNsb3Q7CisgIH0KKyAgCisgIC8qKiBBcHBlbmQgYSBjb21tZW50IGNoaWxkIGF0IHRoZSBjdXJyZW50IGluc2VydGlvbiBwb2ludC4gQXNzdW1lcyB0aGF0IHRoZQorICAgKiBhY3R1YWwgY29udGVudCBvZiB0aGUgY29tbWVudCBoYXMgcHJldmlvdXNseSBiZWVuIGFwcGVuZGVkIHRvIHRoZSBtX2NoYXIKKyAgICogYnVmZmVyIChzaGFyZWQgd2l0aCB0aGUgYnVpbGRlcikuCisgICAqCisgICAqIEBwYXJhbSBtX2NoYXJfY3VycmVudF9zdGFydCBpbnQgU3RhcnRpbmcgb2Zmc2V0IG9mIG5vZGUncyBjb250ZW50IGluIG1fY2hhci4KKyAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggaW50IExlbmd0aCBvZiBub2RlJ3MgY29udGVudCBpbiBtX2NoYXIuCisgICAqICovCisgIHZvaWQgYXBwZW5kQ29tbWVudChpbnQgbV9jaGFyX2N1cnJlbnRfc3RhcnQsaW50IGNvbnRlbnRMZW5ndGgpCisgIHsKKyAgICAvLyBjcmVhdGUgYSBDb21tZW50IE5vZGUKKyAgICAvLyAlVEJEJSBtYXkgYmUgcG9zc2libGUgdG8gY29tYmluZSB3aXRoIGFwcGVuZE5vZGUoKXRvIHJlcGxhY2UgdGhlIG5leHQgY2h1bmsgb2YgY29kZQorICAgIGludCB3MCA9IENPTU1FTlRfTk9ERTsKKyAgICAvLyBXMTogUGFyZW50CisgICAgaW50IHcxID0gY3VycmVudFBhcmVudDsKKyAgICAvLyBXMjogU3RhcnQgcG9zaXRpb24gd2l0aGluIG1fY2hhcgorICAgIGludCB3MiA9IG1fY2hhcl9jdXJyZW50X3N0YXJ0OworICAgIC8vIFczOiBMZW5ndGggb2YgdGhlIGZ1bGwgc3RyaW5nCisgICAgaW50IHczID0gY29udGVudExlbmd0aDsKKworICAgIGludCBvdXJzbG90ID0gYXBwZW5kTm9kZSh3MCwgdzEsIHcyLCB3Myk7CisgICAgcHJldmlvdXNTaWJsaW5nID0gb3Vyc2xvdDsKKyAgfQorICAKKyAgCisgIC8qKiBBcHBlbmQgYW4gRWxlbWVudCBjaGlsZCBhdCB0aGUgY3VycmVudCBpbnNlcnRpb24gcG9pbnQuIFRoaXMKKyAgICogRWxlbWVudCB0aGVuIF9iZWNvbWVzXyB0aGUgaW5zZXJ0aW9uIHBvaW50OyBzdWJzZXF1ZW50IGFwcGVuZHMKKyAgICogYmVjb21lIGl0cyBsYXN0Q2hpbGQgdW50aWwgYW4gYXBwZW5kRW5kRWxlbWVudCgpIGNhbGwgaXMgbWFkZS4KKyAgICogCisgICAqIEFzc3VtZXMgdGhhdCB0aGUgc3ltYm9scyAobG9jYWwgbmFtZSwgbmFtZXNwYWNlIFVSSSBhbmQgcHJlZml4KQorICAgKiBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgcG9vbHMKKyAgICoKKyAgICogTm90ZSB0aGF0IHRoaXMgX29ubHlfIGhhbmRsZXMgdGhlIEVsZW1lbnQgbm9kZSBpdHNlbGYuIEF0dHJzIGFuZAorICAgKiBuYW1lc3BhY2Ugbm9kZXMgYXJlIHVuYnVuZGxlZCBpbiB0aGUgQ29udGVudEhhbmRsZXIgbGF5ZXIKKyAgICogYW5kIGFwcGVuZGVkIHNlcGFyYXRlbHkuCisgICAqCisgICAqIEBwYXJhbSBuYW1lc3BhY2VJbmRleDogSW5kZXggd2l0aGluIHRoZSBuYW1lc3BhY2VVUkkgc3RyaW5nIHBvb2wKKyAgICogQHBhcmFtIGxvY2FsTmFtZUluZGV4IEluZGV4IHdpdGhpbiB0aGUgbG9jYWwgbmFtZSBzdHJpbmcgcG9vbAorICAgKiBAcGFyYW0gcHJlZml4SW5kZXg6IEluZGV4IHdpdGhpbiB0aGUgcHJlZml4IHN0cmluZyBwb29sCisgICAqICovCisgIHZvaWQgYXBwZW5kU3RhcnRFbGVtZW50KGludCBuYW1lc3BhY2VJbmRleCxpbnQgbG9jYWxOYW1lSW5kZXgsIGludCBwcmVmaXhJbmRleCkKKyAgeworICAgICAgICAgICAgICAgIC8vIGRvIGRvY3VtZW50IHJvb3Qgbm9kZSBjcmVhdGlvbiBoZXJlIG9uIHRoZSBmaXJzdCBlbGVtZW50LCBjcmVhdGUgbm9kZXMgZm9yCisgICAgICAgICAgICAgICAgLy8gdGhpcyBlbGVtZW50IGFuZCBpdHMgYXR0cmlidXRlcywgc3RvcmUgdGhlIGVsZW1lbnQsIG5hbWVzcGFjZSwgYW5kIGF0dHJpdHV0ZQorICAgICAgICAgICAgICAgIC8vIG5hbWUgaW5kZXhlcyB0byB0aGUgbm9kZXMgYXJyYXksIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgcGFyZW50CisgICAgICAgICAgICAgICAgLy8gZWxlbWVudCB1c2VkCisKKyAgICAgICAgICAgICAgICAvLyBXMCAgSGlnaDogIE5hbWVzcGFjZSAgTG93OiAgTm9kZSBUeXBlCisgICAgICAgICAgICAgICAgaW50IHcwID0gKG5hbWVzcGFjZUluZGV4IDw8IDE2KSB8IEVMRU1FTlRfTk9ERTsKKyAgICAgICAgICAgICAgICAvLyBXMTogUGFyZW50CisgICAgICAgICAgICAgICAgaW50IHcxID0gY3VycmVudFBhcmVudDsKKyAgICAgICAgICAgICAgICAvLyBXMjogTmV4dCAgKGluaXRpYWxpemVkIGFzIDApCisgICAgICAgICAgICAgICAgaW50IHcyID0gMDsKKyAgICAgICAgICAgICAgICAvLyBXMzogVGFnbmFtZSBoaWdoOiBwcmVmaXggTG93OiBsb2NhbCBuYW1lCisgICAgICAgICAgICAgICAgaW50IHczID0gbG9jYWxOYW1lSW5kZXggfCBwcmVmaXhJbmRleDw8MTY7CisgICAgICAgICAgICAgICAgLyoqL1N5c3RlbS5vdXQucHJpbnRsbigic2V0IHczPSIrdzMrIiAiKyh3Mz4+MTYpKyIvIisodzMmMHhmZmZmKSk7CisKKyAgICAgICAgICAgICAgICAvL2ludCBvdXJzbG90ID0gbm9kZXMuYXBwZW5kU2xvdCh3MCwgdzEsIHcyLCB3Myk7CisgICAgICAgICAgICAgICAgaW50IG91cnNsb3QgPSBhcHBlbmROb2RlKHcwLCB3MSwgdzIsIHczKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGFyZW50ID0gb3Vyc2xvdDsKKyAgICAgICAgICAgICAgICBwcmV2aW91c1NpYmxpbmcgPSAwOworCisgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSByb290IGVsZW1lbnQgcG9pbnRlciB3aGVuIGNyZWF0aW5nIHRoZSBmaXJzdCBlbGVtZW50IG5vZGUKKyAgICAgICAgICAgICAgICBpZiAobV9kb2NFbGVtZW50ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBtX2RvY0VsZW1lbnQgPSBvdXJzbG90OworICB9CisgIAorICAvKiogQXBwZW5kIGEgTmFtZXNwYWNlIERlY2xhcmF0aW9uIGNoaWxkIGF0IHRoZSBjdXJyZW50IGluc2VydGlvbiBwb2ludC4KKyAgICogQXNzdW1lcyB0aGF0IHRoZSBzeW1ib2xzIChuYW1lc3BhY2UgVVJJIGFuZCBwcmVmaXgpIGhhdmUgYWxyZWFkeSBiZWVuCisgICAqIGFkZGVkIHRvIHRoZSBwb29scworICAgKgorICAgKiBAcGFyYW0gcHJlZml4SW5kZXg6IEluZGV4IHdpdGhpbiB0aGUgcHJlZml4IHN0cmluZyBwb29sCisgICAqIEBwYXJhbSBuYW1lc3BhY2VJbmRleDogSW5kZXggd2l0aGluIHRoZSBuYW1lc3BhY2VVUkkgc3RyaW5nIHBvb2wKKyAgICogQHBhcmFtIGlzSUQ6IElmIHNvbWVvbmUgcmVhbGx5IGluc2lzdHMgb24gd3JpdGluZyBhIGJhZCBEVEQsIGl0IGlzCisgICAqIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgZm9yIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRvIGFsc28gYmUgZGVjbGFyZWQKKyAgICogYXMgYmVpbmcgYSBub2RlIElELiBJIGRvbid0IHJlYWxseSB3YW50IHRvIHN1cHBvcnQgdGhhdCBzdHVwaWRpdHksCisgICAqIGJ1dCBJJ20gbm90IHN1cmUgd2UgY2FuIHJlZnVzZSB0byBhY2NlcHQgaXQuCisgICAqICovCisgIHZvaWQgYXBwZW5kTlNEZWNsYXJhdGlvbihpbnQgcHJlZml4SW5kZXgsIGludCBuYW1lc3BhY2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNJRCkKKyAgeworICAgIC8vICVSRVZJRVclIEknbSBhc3NpZ25pbmcgdGhpcyBub2RlIHRoZSAibmFtZXNwYWNlIGZvciBuYW1lc3BhY2VzIgorICAgIC8vIHdoaWNoIHRoZSBET00gZGVmaW5lZC4gSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgTmFtZXNwYWNlIHNwZWMgd2lsbAorICAgIC8vIGFkb3B0IHRoaXMgYXMgb2ZmaWNpYWwuIEl0IGlzbid0IHN0cmljdGx5IG5lZWRlZCBzaW5jZSBpdCdzIGltcGxpZWQKKyAgICAvLyBieSB0aGUgbm9kZXR5cGUsIGJ1dCBmb3Igbm93Li4uCisKKyAgICAvLyAlUkVWSUVXJSBQcmVmaXggbmVlZCBub3QgYmUgcmVjb3JkZWQ7IGl0J3MgaW1wbGllZCB0b28uIEJ1dAorICAgIC8vIHJlY29yZGluZyBpdCBtaWdodCBzaW1wbGlmeSB0aGUgZGVzaWduLgorCisgICAgLy8gJVRCRCUgaXNJRCBpcyBub3QgY3VycmVudGx5IGhvbm9yZWQuCisKKyAgICBmaW5hbCBpbnQgbmFtZXNwYWNlRm9yTmFtZXNwYWNlcz1tX25zTmFtZXMuc3RyaW5nVG9JbmRleCgiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iKTsKKworICAgIC8vIFcwICBIaWdoOiAgTmFtZXNwYWNlICBMb3c6ICBOb2RlIFR5cGUKKyAgICBpbnQgdzAgPSBOQU1FU1BBQ0VfTk9ERSB8IChtX25zTmFtZXMuc3RyaW5nVG9JbmRleCgiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iKTw8MTYpOworCisgICAgLy8gVzE6ICBQYXJlbnQKKyAgICBpbnQgdzEgPSBjdXJyZW50UGFyZW50OworICAgIC8vIFcyOiAgQ1VSUkVOVExZIFVOVVNFRCAtLSBJdCdzIG5leHQtc2liIGluIGF0dHJzLCBidXQgd2UgaGF2ZSBubyBraWRzLgorICAgIGludCB3MiA9IDA7CisgICAgLy8gVzM6ICBuYW1lc3BhY2UgbmFtZQorICAgIGludCB3MyA9IG5hbWVzcGFjZUluZGV4OworICAgIC8vIEFkZCBub2RlCisgICAgaW50IG91cnNsb3QgPSBhcHBlbmROb2RlKHcwLCB3MSwgdzIsIHczKTsKKyAgICBwcmV2aW91c1NpYmxpbmcgPSBvdXJzbG90OwkvLyBTaG91bGQgYXR0cmlidXRlcyBiZSBwcmV2aW91cyBzaWJsaW5ncworICAgIHByZXZpb3VzU2libGluZ1dhc1BhcmVudCA9IGZhbHNlOworICAgIHJldHVybiA7Ly8obV9kb2NIYW5kbGUgfCBvdXJzbG90KTsKKyAgfQorCisgIC8qKiBBcHBlbmQgYW4gQXR0cmlidXRlIGNoaWxkIGF0IHRoZSBjdXJyZW50IGluc2VydGlvbgorICAgKiBwb2ludC4gIEFzc3VtZXMgdGhhdCB0aGUgc3ltYm9scyAobmFtZXNwYWNlIFVSSSwgbG9jYWwgbmFtZSwgYW5kCisgICAqIHByZWZpeCkgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIHBvb2xzLCBhbmQgdGhhdCB0aGUgY29udGVudCBoYXMKKyAgICogYWxyZWFkeSBiZWVuIGFwcGVuZGVkIHRvIG1fY2hhci4gTm90ZSB0aGF0IHRoZSBhdHRyaWJ1dGUncyBjb250ZW50IGhhcworICAgKiBiZWVuIGZsYXR0ZW5lZCBpbnRvIGEgc2luZ2xlIHN0cmluZzsgRFRNIGRvZXMgX05PVF8gYXR0ZW1wdCB0byBtb2RlbAorICAgKiB0aGUgZGV0YWlscyBvZiBlbnRpdHkgcmVmZXJlbmNlcyB3aXRoaW4gYXR0cmlidXRlIHZhbHVlcy4KKyAgICoKKyAgICogQHBhcmFtIG5hbWVzcGFjZUluZGV4IGludCBJbmRleCB3aXRoaW4gdGhlIG5hbWVzcGFjZVVSSSBzdHJpbmcgcG9vbAorICAgKiBAcGFyYW0gbG9jYWxOYW1lSW5kZXggaW50IEluZGV4IHdpdGhpbiB0aGUgbG9jYWwgbmFtZSBzdHJpbmcgcG9vbAorICAgKiBAcGFyYW0gcHJlZml4SW5kZXggaW50IEluZGV4IHdpdGhpbiB0aGUgcHJlZml4IHN0cmluZyBwb29sCisgICAqIEBwYXJhbSBpc0lEIGJvb2xlYW4gVHJ1ZSBpZiB0aGlzIGF0dHJpYnV0ZSB3YXMgZGVjbGFyZWQgYXMgYW4gSUQKKyAgICogKGZvciB1c2UgaW4gc3VwcG9ydGluZyBnZXRFbGVtZW50QnlJRCkuCisgICAqIEBwYXJhbSBtX2NoYXJfY3VycmVudF9zdGFydCBpbnQgU3RhcnRpbmcgb2Zmc2V0IG9mIG5vZGUncyBjb250ZW50IGluIG1fY2hhci4KKyAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggaW50IExlbmd0aCBvZiBub2RlJ3MgY29udGVudCBpbiBtX2NoYXIuCisgICAqICovCisgIHZvaWQgYXBwZW5kQXR0cmlidXRlKGludCBuYW1lc3BhY2VJbmRleCwgaW50IGxvY2FsTmFtZUluZGV4LCBpbnQgcHJlZml4SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1fY2hhcl9jdXJyZW50X3N0YXJ0LCBpbnQgY29udGVudExlbmd0aCkKKyAgeworICAgIC8vICVUQkQlIGlzSUQgaXMgbm90IGN1cnJlbnRseSBob25vcmVkLgorCisgICAgLy8gVzAgIEhpZ2g6ICBOYW1lc3BhY2UgIExvdzogIE5vZGUgVHlwZQorICAgIGludCB3MCA9IEFUVFJJQlVURV9OT0RFIHwgbmFtZXNwYWNlSW5kZXg8PDE2OworCisgICAgLy8gVzE6ICBQYXJlbnQKKyAgICBpbnQgdzEgPSBjdXJyZW50UGFyZW50OworICAgIC8vIFcyOiAgTmV4dCAobm90IHlldCByZXNvbHZlZCkKKyAgICBpbnQgdzIgPSAwOworICAgIC8vIFczOiAgVGFnbmFtZSBoaWdoOiBwcmVmaXggTG93OiBsb2NhbCBuYW1lCisgICAgaW50IHczID0gbG9jYWxOYW1lSW5kZXggfCBwcmVmaXhJbmRleDw8MTY7CisgICAgLyoqL1N5c3RlbS5vdXQucHJpbnRsbigic2V0IHczPSIrdzMrIiAiKyh3Mz4+MTYpKyIvIisodzMmMHhmZmZmKSk7CisgICAgLy8gQWRkIG5vZGUKKyAgICBpbnQgb3Vyc2xvdCA9IGFwcGVuZE5vZGUodzAsIHcxLCB3MiwgdzMpOworICAgIHByZXZpb3VzU2libGluZyA9IG91cnNsb3Q7CS8vIFNob3VsZCBhdHRyaWJ1dGVzIGJlIHByZXZpb3VzIHNpYmxpbmdzCisgICAgCisgICAgLy8gQXR0cmlidXRlJ3MgY29udGVudCBpcyBjdXJyZW50bHkgYXBwZW5kZWQgYXMgYSBUZXh0IE5vZGUKKworICAgIC8vIFcwOiBOb2RlIFR5cGUKKyAgICB3MCA9IFRFWFRfTk9ERTsKKyAgICAvLyBXMTogUGFyZW50CisgICAgdzEgPSBvdXJzbG90OworICAgIC8vIFcyOiBTdGFydCBQb3NpdGlvbiB3aXRoaW4gYnVmZmVyCisgICAgdzIgPSBtX2NoYXJfY3VycmVudF9zdGFydDsKKyAgICAvLyBXMzogTGVuZ3RoCisgICAgdzMgPSBjb250ZW50TGVuZ3RoOworICAgIGFwcGVuZE5vZGUodzAsIHcxLCB3MiwgdzMpOworCisgICAgLy8gQXR0cnMgYXJlIFBhcmVudHMKKyAgICBwcmV2aW91c1NpYmxpbmdXYXNQYXJlbnQgPSB0cnVlOworICAgIHJldHVybiA7Ly8obV9kb2NIYW5kbGUgfCBvdXJzbG90KTsKKyAgfQorICAKKworCisgIC8qKiBUZXJtaW5hdGUgdGhlIGVsZW1lbnQgY3VycmVudGx5IGFjdGluZyBhcyBhbiBpbnNlcnRpb24gcG9pbnQuIFN1YnNlcXVlbnQKKyAgICogaW5zZXJ0aW9ucyB3aWxsIG9jY3VyIGFzIHRoZSBsYXN0IGNoaWxkIG9mIHRoaXMgZWxlbWVudCdzIHBhcmVudC4KKyAgICogKi8KKyAgdm9pZCBhcHBlbmRFbmRFbGVtZW50KCkKKyAgeworICAgIC8vIHBvcCB1cCB0aGUgc3RhY2tzCisgICAgCisgICAgaWYgKHByZXZpb3VzU2libGluZ1dhc1BhcmVudCkKKyAgICAgIG5vZGVzLndyaXRlRW50cnkocHJldmlvdXNTaWJsaW5nLCAyLCBOVUxMKTsKKyAgICAKKyAgICAvLyBQb3AgcGFyZW50YWdlIAorICAgIHByZXZpb3VzU2libGluZyA9IGN1cnJlbnRQYXJlbnQ7CisgICAgbm9kZXMucmVhZFNsb3QoY3VycmVudFBhcmVudCwgZ290c2xvdCk7CisgICAgY3VycmVudFBhcmVudCA9IGdvdHNsb3RbMV0gJiAweEZGRkY7CisgICAgCisgICAgLy8gVGhlIGVsZW1lbnQganVzdCBiZWluZyBmaW5pc2hlZCB3aWxsIGJlCisgICAgLy8gdGhlIHByZXZpb3VzIHNpYmxpbmcgZm9yIHRoZSBuZXh0IG9wZXJhdGlvbgorICAgIHByZXZpb3VzU2libGluZ1dhc1BhcmVudCA9IHRydWU7CisgICAgCisgICAgLy8gUG9wIGEgbGV2ZWwgb2YgbmFtZXNwYWNlIHRhYmxlCisgICAgLy8gbmFtZXNwYWNlVGFibGUucmVtb3ZlTGFzdEVsZW0oKTsKKyAgfQorICAKKyAgLyoqICBTdGFydGluZyBhIG5ldyBkb2N1bWVudC4gUGVyZm9ybSBhbnkgcmVzZXRzL2luaXRpYWxpemF0aW9uCisgICAqIG5vdCBhbHJlYWR5IGhhbmRsZWQuCisgICAqICovCisgIHZvaWQgYXBwZW5kU3RhcnREb2N1bWVudCgpCisgIHsKKyAgICAKKyAgICAvLyAlVEJEJSByZXNldCBzbG90IDAgdG8gaW5kaWNhdGUgQ2h1bmtlZEludEFycmF5IHJldXNlIG9yIHdhaXQgZm9yCisgICAgLy8gICAgICAgdGhlIG5leHQgaW5pdERvY3VtZW50KCkuCisgICAgbV9kb2NFbGVtZW50ID0gTlVMTDsJIC8vIHJlc2V0IG5vZGVIYW5kbGUgdG8gdGhlIHJvb3Qgb2YgdGhlIGFjdHVhbCBkdG0gZG9jIGNvbnRlbnQKKyAgICBpbml0RG9jdW1lbnQoMCk7CisgIH0KKworICAvKiogIEFsbCBhcHBlbmRzIHRvIHRoaXMgZG9jdW1lbnQgaGF2ZSBmaW5pc2hlZDsgZG8gd2hhdGV2ZXIgZmluYWwKKyAgICogY2xlYW51cCBpcyBuZWVkZWQuCisgICAqICovCisgIHZvaWQgYXBwZW5kRW5kRG9jdW1lbnQoKQorICB7CisgICAgZG9uZSA9IHRydWU7CisgICAgLy8gJVRCRCUgbWF5IG5lZWQgdG8gbm90aWNlIHRoZSBsYXN0IHNsb3QgbnVtYmVyIGFuZCBzbG90IGNvdW50IHRvIGF2b2lkCisgICAgLy8gcmVzaWR1YWwgZGF0YSBmcm9tIHByb3Zpb3VzIHVzZSBvZiB0aGlzIERUTQorICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNRXhjZXB0aW9uLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTBmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQ3IEBACitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKKworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZUxvY2F0b3I7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIHNwZWNpZmllcyBhbiBleGNlcHRpb25hbCBjb25kaXRpb24gdGhhdCBvY2N1cmVkCisgKiBpbiB0aGUgRFRNIG1vZHVsZS4KKyAqLworcHVibGljIGNsYXNzIERUTUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgLyoqIEZpZWxkIGxvY2F0b3Igc3BlY2lmaWVzIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLgorICAgICAqICBAc2VyaWFsICovCisgICAgU291cmNlTG9jYXRvciBsb2NhdG9yOworCisgICAgLyoqCisgICAgICogTWV0aG9kIGdldExvY2F0b3IgcmV0cmlldmVzIGFuIGluc3RhbmNlIG9mIGEgU291cmNlTG9jYXRvcgorICAgICAqIG9iamVjdCB0aGF0IHNwZWNpZmllcyB3aGVyZSBhbiBlcnJvciBvY2N1cmVkLgorICAgICAqCisgICAgICogQHJldHVybiBBIFNvdXJjZUxvY2F0b3Igb2JqZWN0LCBvciBudWxsIGlmIG5vbmUgd2FzIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU291cmNlTG9jYXRvciBnZXRMb2NhdG9yKCkgeworICAgICAgICByZXR1cm4gbG9jYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2Qgc2V0TG9jYXRvciBzZXRzIGFuIGluc3RhbmNlIG9mIGEgU291cmNlTG9jYXRvcgorICAgICAqIG9iamVjdCB0aGF0IHNwZWNpZmllcyB3aGVyZSBhbiBlcnJvciBvY2N1cmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0aW9uIEEgU291cmNlTG9jYXRvciBvYmplY3QsIG9yIG51bGwgdG8gY2xlYXIgdGhlIGxvY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2F0b3IoU291cmNlTG9jYXRvciBsb2NhdGlvbikgeworICAgICAgICBsb2NhdG9yID0gbG9jYXRpb247CisgICAgfQorCisgICAgLyoqIEZpZWxkIGNvbnRhaW5lZEV4Y2VwdGlvbiBzcGVjaWZpZXMgYSB3cmFwcGVkIGV4Y2VwdGlvbi4gIE1heSBiZSBudWxsLgorICAgICAqICBAc2VyaWFsICovCisgICAgVGhyb3dhYmxlIGNvbnRhaW5lZEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHJpZXZlcyBhbiBleGNlcHRpb24gdGhhdCB0aGlzIGV4Y2VwdGlvbiB3cmFwcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gVGhyb3dhYmxlIG9iamVjdCwgb3IgbnVsbC4KKyAgICAgKiBAc2VlICNnZXRDYXVzZQorICAgICAqLworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgeworICAgICAgICByZXR1cm4gY29udGFpbmVkRXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNhdXNlIG9mIHRoaXMgdGhyb3dhYmxlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQorICAgICAqIGNhdXNlIGlzIG5vbmV4aXN0ZW50IG9yIHVua25vd24uICAoVGhlIGNhdXNlIGlzIHRoZSB0aHJvd2FibGUgdGhhdAorICAgICAqIGNhdXNlZCB0aGlzIHRocm93YWJsZSB0byBnZXQgdGhyb3duLikKKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgeworCisgICAgICAgIHJldHVybiAoKGNvbnRhaW5lZEV4Y2VwdGlvbiA9PSB0aGlzKQorICAgICAgICAgICAgICAgID8gbnVsbAorICAgICAgICAgICAgICAgIDogY29udGFpbmVkRXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgPGk+Y2F1c2U8L2k+IG9mIHRoaXMgdGhyb3dhYmxlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICogKFRoZSBjYXVzZSBpcyB0aGUgdGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoaXMgdGhyb3dhYmxlIHRvIGdldCB0aHJvd24uKQorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UuICBJdCBpcyBnZW5lcmFsbHkgY2FsbGVkIGZyb20KKyAgICAgKiB3aXRoaW4gdGhlIGNvbnN0cnVjdG9yLCBvciBpbW1lZGlhdGVseSBhZnRlciBjcmVhdGluZyB0aGUKKyAgICAgKiB0aHJvd2FibGUuICBJZiB0aGlzIHRocm93YWJsZSB3YXMgY3JlYXRlZAorICAgICAqIHdpdGgge0BsaW5rICNEVE1FeGNlcHRpb24oVGhyb3dhYmxlKX0gb3IKKyAgICAgKiB7QGxpbmsgI0RUTUV4Y2VwdGlvbihTdHJpbmcsVGhyb3dhYmxlKX0sIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQKKyAgICAgKiBldmVuIG9uY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGNhdXNlIHRoZSBjYXVzZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbCBieSB0aGUKKyAgICAgKiAgICAgICAgIHtAbGluayAjZ2V0Q2F1c2UoKX0gbWV0aG9kKS4gIChBIDx0dD5udWxsPC90dD4gdmFsdWUgaXMKKyAgICAgKiAgICAgICAgIHBlcm1pdHRlZCwgYW5kIGluZGljYXRlcyB0aGF0IHRoZSBjYXVzZSBpcyBub25leGlzdGVudCBvcgorICAgICAqICAgICAgICAgdW5rbm93bi4pCisgICAgICogQHJldHVybiAgYSByZWZlcmVuY2UgdG8gdGhpcyA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmNhdXNlPC9jb2RlPiBpcyB0aGlzCisgICAgICogICAgICAgICB0aHJvd2FibGUuICAoQSB0aHJvd2FibGUgY2Fubm90CisgICAgICogICAgICAgICBiZSBpdHMgb3duIGNhdXNlLikKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIHRocm93YWJsZSB3YXMKKyAgICAgKiAgICAgICAgIGNyZWF0ZWQgd2l0aCB7QGxpbmsgI0RUTUV4Y2VwdGlvbihUaHJvd2FibGUpfSBvcgorICAgICAqICAgICAgICAge0BsaW5rICNEVE1FeGNlcHRpb24oU3RyaW5nLFRocm93YWJsZSl9LCBvciB0aGlzIG1ldGhvZCBoYXMgYWxyZWFkeQorICAgICAqICAgICAgICAgYmVlbiBjYWxsZWQgb24gdGhpcyB0aHJvd2FibGUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBUaHJvd2FibGUgaW5pdENhdXNlKFRocm93YWJsZSBjYXVzZSkgeworCisgICAgICAgIGlmICgodGhpcy5jb250YWluZWRFeGNlcHRpb24gPT0gbnVsbCkgJiYgKGNhdXNlICE9IG51bGwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBvdmVyd3JpdGUgY2F1c2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjYXVzZSA9PSB0aGlzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJTZWxmLWNhdXNhdGlvbiBub3QgcGVybWl0dGVkIik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmNvbnRhaW5lZEV4Y2VwdGlvbiA9IGNhdXNlOworCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBEVE1FeGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBEVE1FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKworICAgICAgICB0aGlzLmNvbnRhaW5lZEV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIHRoaXMubG9jYXRvciAgICAgICAgICAgID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgRFRNRXhjZXB0aW9uIHdyYXBwaW5nIGFuIGV4aXN0aW5nIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlIFRoZSBleGNlcHRpb24gdG8gYmUgd3JhcHBlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRFRNRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7CisKKyAgICAgICAgc3VwZXIoZS5nZXRNZXNzYWdlKCkpOworCisgICAgICAgIHRoaXMuY29udGFpbmVkRXhjZXB0aW9uID0gZTsKKyAgICAgICAgdGhpcy5sb2NhdG9yICAgICAgICAgICAgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXAgYW4gZXhpc3RpbmcgZXhjZXB0aW9uIGluIGEgRFRNRXhjZXB0aW9uLgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyB1c2VkIGZvciB0aHJvd2luZyBwcm9jZXNzb3IgZXhjZXB0aW9ucyBiZWZvcmUKKyAgICAgKiB0aGUgcHJvY2Vzc2luZyBoYXMgc3RhcnRlZC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICAgICAgdXNlIHRoZSBtZXNzYWdlIGZyb20gdGhlIGVtYmVkZGVkIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gZSBBbnkgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIERUTUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUpIHsKKworICAgICAgICBzdXBlcigoKG1lc3NhZ2UgPT0gbnVsbCkgfHwgKG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkpCisgICAgICAgICAgICAgID8gZS5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgICAgOiBtZXNzYWdlKTsKKworICAgICAgICB0aGlzLmNvbnRhaW5lZEV4Y2VwdGlvbiA9IGU7CisgICAgICAgIHRoaXMubG9jYXRvciAgICAgICAgICAgID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgRFRNRXhjZXB0aW9uIGZyb20gYSBtZXNzYWdlIGFuZCBhIExvY2F0b3IuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGNvbnN0cnVjdG9yIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gYW4gYXBwbGljYXRpb24gaXMKKyAgICAgKiBjcmVhdGluZyBpdHMgb3duIGV4Y2VwdGlvbiBmcm9tIHdpdGhpbiBhIERvY3VtZW50SGFuZGxlcgorICAgICAqIGNhbGxiYWNrLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIGxvY2F0b3IgVGhlIGxvY2F0b3Igb2JqZWN0IGZvciB0aGUgZXJyb3Igb3Igd2FybmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRFRNRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTb3VyY2VMb2NhdG9yIGxvY2F0b3IpIHsKKworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKworICAgICAgICB0aGlzLmNvbnRhaW5lZEV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIHRoaXMubG9jYXRvciAgICAgICAgICAgID0gbG9jYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwIGFuIGV4aXN0aW5nIGV4Y2VwdGlvbiBpbiBhIERUTUV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UsIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgICAgICB1c2UgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgZW1iZWRkZWQgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBsb2NhdG9yIFRoZSBsb2NhdG9yIG9iamVjdCBmb3IgdGhlIGVycm9yIG9yIHdhcm5pbmcuCisgICAgICogQHBhcmFtIGUgQW55IGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBEVE1FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFNvdXJjZUxvY2F0b3IgbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGUpIHsKKworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKworICAgICAgICB0aGlzLmNvbnRhaW5lZEV4Y2VwdGlvbiA9IGU7CisgICAgICAgIHRoaXMubG9jYXRvciAgICAgICAgICAgID0gbG9jYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGVycm9yIG1lc3NhZ2Ugd2l0aCBsb2NhdGlvbiBpbmZvcm1hdGlvbgorICAgICAqIGFwcGVuZGVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUFuZExvY2F0aW9uKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmcgICAgICAgbWVzc2FnZSA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKKworICAgICAgICBpZiAobnVsbCAhPSBtZXNzYWdlKSB7CisgICAgICAgICAgICBzYnVmZmVyLmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IGxvY2F0b3IpIHsKKyAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JRCA9IGxvY2F0b3IuZ2V0U3lzdGVtSWQoKTsKKyAgICAgICAgICAgIGludCAgICBsaW5lICAgICA9IGxvY2F0b3IuZ2V0TGluZU51bWJlcigpOworICAgICAgICAgICAgaW50ICAgIGNvbHVtbiAgID0gbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKTsKKworICAgICAgICAgICAgaWYgKG51bGwgIT0gc3lzdGVtSUQpIHsKKyAgICAgICAgICAgICAgICBzYnVmZmVyLmFwcGVuZCgiOyBTeXN0ZW1JRDogIik7CisgICAgICAgICAgICAgICAgc2J1ZmZlci5hcHBlbmQoc3lzdGVtSUQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoMCAhPSBsaW5lKSB7CisgICAgICAgICAgICAgICAgc2J1ZmZlci5hcHBlbmQoIjsgTGluZSM6ICIpOworICAgICAgICAgICAgICAgIHNidWZmZXIuYXBwZW5kKGxpbmUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoMCAhPSBjb2x1bW4pIHsKKyAgICAgICAgICAgICAgICBzYnVmZmVyLmFwcGVuZCgiOyBDb2x1bW4jOiAiKTsKKyAgICAgICAgICAgICAgICBzYnVmZmVyLmFwcGVuZChjb2x1bW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGFzIGEgc3RyaW5nLgorICAgICAqCisgICAgICogQHJldHVybiBBIHN0cmluZyB3aXRoIGxvY2F0aW9uIGluZm8sIG9yIG51bGwKKyAgICAgKiBpZiB0aGVyZSBpcyBubyBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQXNTdHJpbmcoKSB7CisKKyAgICAgICAgaWYgKG51bGwgIT0gbG9jYXRvcikgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNidWZmZXIgID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgU3RyaW5nICAgICAgIHN5c3RlbUlEID0gbG9jYXRvci5nZXRTeXN0ZW1JZCgpOworICAgICAgICAgICAgaW50ICAgICAgICAgIGxpbmUgICAgID0gbG9jYXRvci5nZXRMaW5lTnVtYmVyKCk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgY29sdW1uICAgPSBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpOworCisgICAgICAgICAgICBpZiAobnVsbCAhPSBzeXN0ZW1JRCkgeworICAgICAgICAgICAgICAgIHNidWZmZXIuYXBwZW5kKCI7IFN5c3RlbUlEOiAiKTsKKyAgICAgICAgICAgICAgICBzYnVmZmVyLmFwcGVuZChzeXN0ZW1JRCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgwICE9IGxpbmUpIHsKKyAgICAgICAgICAgICAgICBzYnVmZmVyLmFwcGVuZCgiOyBMaW5lIzogIik7CisgICAgICAgICAgICAgICAgc2J1ZmZlci5hcHBlbmQobGluZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgwICE9IGNvbHVtbikgeworICAgICAgICAgICAgICAgIHNidWZmZXIuYXBwZW5kKCI7IENvbHVtbiM6ICIpOworICAgICAgICAgICAgICAgIHNidWZmZXIuYXBwZW5kKGNvbHVtbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IHRoZSB0aGUgdHJhY2Ugb2YgbWV0aG9kcyBmcm9tIHdoZXJlIHRoZSBlcnJvcgorICAgICAqIG9yaWdpbmF0ZWQuICBUaGlzIHdpbGwgdHJhY2UgYWxsIG5lc3RlZCBleGNlcHRpb24KKyAgICAgKiBvYmplY3RzLCBhcyB3ZWxsIGFzIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKKyAgICAgICAgcHJpbnRTdGFja1RyYWNlKG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKFN5c3RlbS5lcnIsIHRydWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCB0aGUgdGhlIHRyYWNlIG9mIG1ldGhvZHMgZnJvbSB3aGVyZSB0aGUgZXJyb3IKKyAgICAgKiBvcmlnaW5hdGVkLiAgVGhpcyB3aWxsIHRyYWNlIGFsbCBuZXN0ZWQgZXhjZXB0aW9uCisgICAgICogb2JqZWN0cywgYXMgd2VsbCBhcyB0aGlzIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gcyBUaGUgc3RyZWFtIHdoZXJlIHRoZSBkdW1wIHdpbGwgYmUgc2VudCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKSB7CisgICAgICAgIHByaW50U3RhY2tUcmFjZShuZXcgamF2YS5pby5QcmludFdyaXRlcihzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgdGhlIHRoZSB0cmFjZSBvZiBtZXRob2RzIGZyb20gd2hlcmUgdGhlIGVycm9yCisgICAgICogb3JpZ2luYXRlZC4gIFRoaXMgd2lsbCB0cmFjZSBhbGwgbmVzdGVkIGV4Y2VwdGlvbgorICAgICAqIG9iamVjdHMsIGFzIHdlbGwgYXMgdGhpcyBvYmplY3QuCisgICAgICogQHBhcmFtIHMgVGhlIHdyaXRlciB3aGVyZSB0aGUgZHVtcCB3aWxsIGJlIHNlbnQgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgcykgeworCisgICAgICAgIGlmIChzID09IG51bGwpIHsKKyAgICAgICAgICAgIHMgPSBuZXcgamF2YS5pby5QcmludFdyaXRlcihTeXN0ZW0uZXJyLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgbG9jSW5mbyA9IGdldExvY2F0aW9uQXNTdHJpbmcoKTsKKworICAgICAgICAgICAgaWYgKG51bGwgIT0gbG9jSW5mbykgeworICAgICAgICAgICAgICAgIHMucHJpbnRsbihsb2NJbmZvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkge30KKworICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uID0gZ2V0RXhjZXB0aW9uKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IChpIDwgMTApICYmIChudWxsICE9IGV4Y2VwdGlvbik7IGkrKykgeworICAgICAgICAgICAgcy5wcmludGxuKCItLS0tLS0tLS0iKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgRFRNRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoRFRNRXhjZXB0aW9uKSBleGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvY2F0aW9uQXNTdHJpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBsb2NJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLnByaW50bG4obG9jSW5mbyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHMpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBzLnByaW50bG4oIkNvdWxkIG5vdCBwcmludCBzdGFjayB0cmFjZS4uLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRoID0KKyAgICAgICAgICAgICAgICAgICAgKChPYmplY3QpIGV4Y2VwdGlvbikuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKworICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG1ldGgpIHsKKyAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIHByZXYgPSBleGNlcHRpb247CisKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gKFRocm93YWJsZSkgbWV0aC5pbnZva2UoZXhjZXB0aW9uLCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9EVE1GaWx0ZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmZDRiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNRmlsdGVyLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCisgKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKKworLyoqCisgKiBTaW1wbGUgZmlsdGVyIGZvciBkb2luZyBub2RlIHRlc3RzLiAgTm90ZSB0aGUgc2VtYW50aWNzIG9mIHRoaXMgYXJlCisgKiBzb21ld2hhdCBkaWZmZXJlbnQgdGhhdCB0aGUgRE9NJ3MgTm9kZUZpbHRlci4KKyAqLworcHVibGljIGludGVyZmFjZSBEVE1GaWx0ZXIKK3sKKworICAvLyBDb25zdGFudHMgZm9yIHdoYXRUb1Nob3cuICBUaGVzZSBhcmUgdXNlZCB0byBzZXQgdGhlIG5vZGUgdHlwZSB0aGF0IHdpbGwgCisgIC8vIGJlIHRyYXZlcnNlZC4gVGhlc2UgdmFsdWVzIG1heSBiZSBPUmVkIHRvZ2V0aGVyIGJlZm9yZSBiZWluZyBwYXNzZWQgdG8KKyAgLy8gdGhlIERUTUl0ZXJhdG9yLgorCisgIC8qKgorICAgKiBTaG93IGFsbCA8Y29kZT5Ob2RlczwvY29kZT4uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FMTCA9IDB4RkZGRkZGRkY7CisKKyAgLyoqCisgICAqIFNob3cgPGNvZGU+RWxlbWVudDwvY29kZT4gbm9kZXMuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0VMRU1FTlQgPSAweDAwMDAwMDAxOworCisgIC8qKgorICAgKiBTaG93IDxjb2RlPkF0dHI8L2NvZGU+IG5vZGVzLiBUaGlzIGlzIG1lYW5pbmdmdWwgb25seSB3aGVuIGNyZWF0aW5nIGFuCisgICAqIGl0ZXJhdG9yIG9yIHRyZWUtd2Fsa2VyIHdpdGggYW4gYXR0cmlidXRlIG5vZGUgYXMgaXRzCisgICAqIDxjb2RlPnJvb3Q8L2NvZGU+OyBpbiB0aGlzIGNhc2UsIGl0IG1lYW5zIHRoYXQgdGhlIGF0dHJpYnV0ZSBub2RlCisgICAqIHdpbGwgYXBwZWFyIGluIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGUgaXRlcmF0aW9uIG9yIHRyYXZlcnNhbC4KKyAgICogU2luY2UgYXR0cmlidXRlcyBhcmUgbmV2ZXIgY2hpbGRyZW4gb2Ygb3RoZXIgbm9kZXMsIHRoZXkgZG8gbm90CisgICAqIGFwcGVhciB3aGVuIHRyYXZlcnNpbmcgb3ZlciB0aGUgbWFpbiBkb2N1bWVudCB0cmVlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BVFRSSUJVVEUgPSAweDAwMDAwMDAyOworCisgIC8qKgorICAgKiBTaG93IDxjb2RlPlRleHQ8L2NvZGU+IG5vZGVzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19URVhUID0gMHgwMDAwMDAwNDsKKworICAvKioKKyAgICogU2hvdyA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IG5vZGVzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19DREFUQV9TRUNUSU9OID0gMHgwMDAwMDAwODsKKworICAvKioKKyAgICogU2hvdyA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IG5vZGVzLiBOb3RlIHRoYXQgaWYgRW50aXR5IFJlZmVyZW5jZXMKKyAgICogaGF2ZSBiZWVuIGZ1bGx5IGV4cGFuZGVkIHdoaWxlIHRoZSB0cmVlIHdhcyBiZWluZyBjb25zdHJ1Y3RlZCwgdGhlc2UKKyAgICogbm9kZXMgd2lsbCBub3QgYXBwZWFyIGFuZCB0aGlzIG1hc2sgaGFzIG5vIGVmZmVjdC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfRU5USVRZX1JFRkVSRU5DRSA9IDB4MDAwMDAwMTA7CisKKyAgLyoqCisgICAqIFNob3cgPGNvZGU+RW50aXR5PC9jb2RlPiBub2Rlcy4gVGhpcyBpcyBtZWFuaW5nZnVsIG9ubHkgd2hlbiBjcmVhdGluZworICAgKiBhbiBpdGVyYXRvciBvciB0cmVlLXdhbGtlciB3aXRoIGFuPGNvZGU+IEVudGl0eTwvY29kZT4gbm9kZSBhcyBpdHMKKyAgICogPGNvZGU+cm9vdDwvY29kZT47IGluIHRoaXMgY2FzZSwgaXQgbWVhbnMgdGhhdCB0aGUgPGNvZGU+RW50aXR5PC9jb2RlPgorICAgKiAgbm9kZSB3aWxsIGFwcGVhciBpbiB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlIHRyYXZlcnNhbC4gU2luY2UKKyAgICogZW50aXRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBkb2N1bWVudCB0cmVlLCB0aGV5IGRvIG5vdCBhcHBlYXIgd2hlbgorICAgKiB0cmF2ZXJzaW5nIG92ZXIgdGhlIG1haW4gZG9jdW1lbnQgdHJlZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfRU5USVRZID0gMHgwMDAwMDAyMDsKKworICAvKioKKyAgICogU2hvdyA8Y29kZT5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb248L2NvZGU+IG5vZGVzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OID0gMHgwMDAwMDA0MDsKKworICAvKioKKyAgICogU2hvdyA8Y29kZT5Db21tZW50PC9jb2RlPiBub2Rlcy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQ09NTUVOVCA9IDB4MDAwMDAwODA7CisKKyAgLyoqCisgICAqIFNob3cgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG5vZGVzLiAoT2YgY291cnNlLCBhcyB3aXRoIEF0dHJpYnV0ZXMKKyAgICogYW5kIHN1Y2gsIHRoaXMgaXMgbWVhbmluZ2Z1bCBvbmx5IHdoZW4gdGhlIGl0ZXJhdGlvbiByb290IGlzIHRoZQorICAgKiBEb2N1bWVudCBpdHNlbGYsIHNpbmNlIERvY3VtZW50IGhhcyBubyBwYXJlbnQuKQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19ET0NVTUVOVCA9IDB4MDAwMDAxMDA7CisKKyAgLyoqCisgICAqIFNob3cgPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiBub2Rlcy4gCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0RPQ1VNRU5UX1RZUEUgPSAweDAwMDAwMjAwOworCisgIC8qKgorICAgKiBTaG93IDxjb2RlPkRvY3VtZW50RnJhZ21lbnQ8L2NvZGU+IG5vZGVzLiAoT2YgY291cnNlLCBhcyB3aXRoCisgICAqIEF0dHJpYnV0ZXMgYW5kIHN1Y2gsIHRoaXMgaXMgbWVhbmluZ2Z1bCBvbmx5IHdoZW4gdGhlIGl0ZXJhdGlvbgorICAgKiByb290IGlzIHRoZSBEb2N1bWVudCBpdHNlbGYsIHNpbmNlIERvY3VtZW50RnJhZ21lbnQgaGFzIG5vIHBhcmVudC4pCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UID0gMHgwMDAwMDQwMDsKKworICAvKioKKyAgICogU2hvdyA8Y29kZT5Ob3RhdGlvbjwvY29kZT4gbm9kZXMuIFRoaXMgaXMgbWVhbmluZ2Z1bCBvbmx5IHdoZW4gY3JlYXRpbmcKKyAgICogYW4gaXRlcmF0b3Igb3IgdHJlZS13YWxrZXIgd2l0aCBhIDxjb2RlPk5vdGF0aW9uPC9jb2RlPiBub2RlIGFzIGl0cworICAgKiA8Y29kZT5yb290PC9jb2RlPjsgaW4gdGhpcyBjYXNlLCBpdCBtZWFucyB0aGF0IHRoZQorICAgKiA8Y29kZT5Ob3RhdGlvbjwvY29kZT4gbm9kZSB3aWxsIGFwcGVhciBpbiB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlCisgICAqIHRyYXZlcnNhbC4gU2luY2Ugbm90YXRpb25zIGFyZSBub3QgcGFydCBvZiB0aGUgZG9jdW1lbnQgdHJlZSwgdGhleSBkbworICAgKiBub3QgYXBwZWFyIHdoZW4gdHJhdmVyc2luZyBvdmVyIHRoZSBtYWluIGRvY3VtZW50IHRyZWUuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX05PVEFUSU9OID0gMHgwMDAwMDgwMDsKKyAgCisgIC8qKgorCisgICAqIFRoaXMgYml0IGluc3RydWN0cyB0aGUgaXRlcmF0b3IgdG8gc2hvdyBuYW1lc3BhY2Ugbm9kZXMsIHdoaWNoCisgICAqIGFyZSBtb2RlbGVkIGJ5IERUTSBidXQgbm90IGJ5IHRoZSBET00uICBNYWtlIHN1cmUgdGhpcyBkb2VzIG5vdAorICAgKiBjb25mbGljdCB3aXRoIHtAbGluayBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcn0uCisgICAqIDxwPgorICAgKiAlUkVWSUVXJSBNaWdodCBiZSBzYWZlciB0byBzdGFydCBmcm9tIGhpZ2hlciBiaXRzIGFuZCB3b3JrIGRvd24sCisgICAqIHRvIGxlYXZlIHJvb20gZm9yIHRoZSBET00gdG8gZXhwYW5kIGl0cyBzZXQgb2YgY29uc3RhbnRzLi4uIE9yLAorICAgKiBwb3NzaWJseSwgdG8gY3JlYXRlIGEgRFRNLXNwZWNpZmljIGZpZWxkIGZvciB0aGVzZSBhZGRpdGlvbmFsIGJpdHMuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX05BTUVTUEFDRSA9IDB4MDAwMDEwMDA7CisKKyAgLyoqCisgICAqIFNwZWNpYWwgYml0IGZvciBmaWx0ZXJzIGltcGxlbWVudGluZyBtYXRjaCBwYXR0ZXJucyBzdGFydGluZyB3aXRoCisgICAqIGEgZnVuY3Rpb24uICBNYWtlIHN1cmUgdGhpcyBkb2VzIG5vdCBjb25mbGljdCB3aXRoCisgICAqIHtAbGluayBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcn0uCisgICAqIDxwPgorICAgKiAlUkVWSUVXJSBNaWdodCBiZSBzYWZlciB0byBzdGFydCBmcm9tIGhpZ2hlciBiaXRzIGFuZCB3b3JrIGRvd24sCisgICAqIHRvIGxlYXZlIHJvb20gZm9yIHRoZSBET00gdG8gZXhwYW5kIGl0cyBzZXQgb2YgY29uc3RhbnRzLi4uIE9yLAorICAgKiBwb3NzaWJseSwgdG8gY3JlYXRlIGEgRFRNLXNwZWNpZmljIGZpZWxkIGZvciB0aGVzZSBhZGRpdGlvbmFsIGJpdHMuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0JZRlVOQ1RJT04gPSAweDAwMDEwMDAwOworCisgIC8qKgorICAgKiBUZXN0IHdoZXRoZXIgYSBzcGVjaWZpZWQgbm9kZSBpcyB2aXNpYmxlIGluIHRoZSBsb2dpY2FsIHZpZXcgb2YgYQorICAgKiA8Y29kZT5EVE1JdGVyYXRvcjwvY29kZT4uIE5vcm1hbGx5LCB0aGlzIGZ1bmN0aW9uCisgICAqIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5EVE1JdGVyYXRvcjwvY29kZT47IAorICAgKiBpdCBpcyBub3Qgbm9ybWFsbHkgY2FsbGVkIGRpcmVjdGx5IGZyb20KKyAgICogdXNlciBjb2RlLgorICAgKiAKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4KKyAgICogQHBhcmFtIHdoYXRUb1Nob3cgb25lIG9mIFNIT1dfWFhYIHZhbHVlcy4KKyAgICogQHJldHVybiBvbmUgb2YgRklMVEVSX0FDQ0VQVCwgRklMVEVSX1JFSkVDVCwgb3IgRklMVEVSX1NLSVAuCisgICAqLworICBwdWJsaWMgc2hvcnQgYWNjZXB0Tm9kZShpbnQgbm9kZUhhbmRsZSwgaW50IHdoYXRUb1Nob3cpOworICAKKyAgLyoqCisgICAqIFRlc3Qgd2hldGhlciBhIHNwZWNpZmllZCBub2RlIGlzIHZpc2libGUgaW4gdGhlIGxvZ2ljYWwgdmlldyBvZiBhCisgICAqIDxjb2RlPkRUTUl0ZXJhdG9yPC9jb2RlPi4gTm9ybWFsbHksIHRoaXMgZnVuY3Rpb24KKyAgICogd2lsbCBiZSBjYWxsZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkRUTUl0ZXJhdG9yPC9jb2RlPjsgCisgICAqIGl0IGlzIG5vdCBub3JtYWxseSBjYWxsZWQgZGlyZWN0bHkgZnJvbQorICAgKiB1c2VyIGNvZGUuCisgICAqIDxwPgorICAgKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBzZXROYW1lTWF0Y2goZXhwYW5kZWROYW1lKSBmb2xsb3dlZCBieSBhY2NlcHQoKT8KKyAgICogT3Igd2lsbCB3ZSByZWFsbHkgYmUgdGVzdGluZyBhIGRpZmZlcmVudCBuYW1lIGF0IGV2ZXJ5IGludm9jYXRpb24/CisgICAqIAorICAgKiA8cD4lUkVWSUVXJSBVbmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgd2lsbCB0aGlzIGJlIHVzZWQ/IFRoZSBjYXNlcworICAgKiBJJ3ZlIGNvbnNpZGVyZWQgYXJlIGp1c3QgYXMgZWFzeSBhbmQganVzdCBhYm91dCBhcyBlZmZpY2llbnQgaWYKKyAgICogdGhlIG5hbWUgdGVzdCBpcyBwZXJmb3JtZWQgaW4gdGhlIERUTUl0ZXJhdG9yLi4uIC0tIEpvZTwvcD4KKyAgICogCisgICAqIDxwPiVSRVZJRVclIFNob3VsZCB0aGF0IDB4RkZGRiBoYXZlIGEgbW5lbW9uaWMgYXNzaWduZWQgdG8gaXQ/CisgICAqIEFsc286IFRoaXMgcmVwcmVzZW50YXRpb24gaXMgYXNzdW1pbmcgdGhlIGV4cGFuZGVkIG5hbWUgaXMgaW5kZWVkCisgICAqIHNwbGl0IGludG8gaGlnaC9sb3cgMTYtYml0IGhhbGZ3b3Jkcy4gSWYgd2UgZXZlciBjaGFuZ2UgdGhlCisgICAqIGJhbGFuY2UgYmV0d2VlbiBuYW1lc3BhY2UgYW5kIGxvY2FsbmFtZSBiaXRzIChlZyBiZWNhdXNlIHdlCisgICAqIGRlY2lkZSB0aGVyZSBhcmUgbWFueSBtb3JlIGxvY2FsbmFtZXMgdGhhbiBuYW1lc3BhY2VzLCB3aGljaCBpcworICAgKiBmYWlybHkgbGlrZWx5KSwgdGhpcyBpcyBnb2luZyB0byBicmVhay4gSXQgbWlnaHQgYmUgc2FmZXIgdG8KKyAgICogZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgd2l0aCBhIG1ha2VFeHBhbmRlZE5hbWUgbWV0aG9kIGFuZCBtYWtlCisgICAqIHRoYXQgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgdXAgdGhlIHdpbGRjYXJkIHZlcnNpb24gYXMgd2VsbC48L3A+CisgICAqIAorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBpbnQgSGFuZGxlIG9mIHRoZSBub2RlLgorICAgKiBAcGFyYW0gd2hhdFRvU2hvdyBvbmUgb2YgU0hPV19YWFggdmFsdWVzLgorICAgKiBAcGFyYW0gZXhwYW5kZWROYW1lIGEgdmFsdWUgZGVmaW5pbmcgdGhlIGV4YW5kZWQgbmFtZSBhcyBkZWZpbmVkIGluIAorICAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBEVE0gaW50ZXJmYWNlLiAgV2lsZCBjYXJkcyB3aWxsIGJlIGRlZmluZWQgCisgICAqICAgICAgICAgICAgICAgICAgICAgYnkgMHhGRkZGIGluIHRoZSBuYW1lc3BhY2UgYW5kL29yIGxvY2FsbmFtZQorICAgKgkJCSBwb3J0aW9uIG9mIHRoZSBleHBhbmRlZE5hbWUuCisgICAqIEByZXR1cm4gb25lIG9mIEZJTFRFUl9BQ0NFUFQsIEZJTFRFUl9SRUpFQ1QsIG9yIEZJTFRFUl9TS0lQLiAgKi8KKyAgcHVibGljIHNob3J0IGFjY2VwdE5vZGUoaW50IG5vZGVIYW5kbGUsIGludCB3aGF0VG9TaG93LCBpbnQgZXhwYW5kZWROYW1lKTsKKyAKK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9EVE1JdGVyYXRvci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9EVE1JdGVyYXRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjIlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYXBhY2hlL3htbC91dGlscy9EVE1JdGVyYXRvci5qYXZhCnJlbmFtZSB0byBzcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTUl0ZXJhdG9yLmphdmEKaW5kZXggYjllZDQzZC4uYTEyYTRjMCAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL0RUTUl0ZXJhdG9yLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9EVE1JdGVyYXRvci5qYXZhCkBAIC01NCwxMSArNTQsMTMgQEAKICAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQogICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgogICovCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sLnV0aWxzOworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5kdG07CiAKIC8qKgotICogPGNvZGU+SXRlcmF0b3JzPC9jb2RlPiBhcmUgdXNlZCB0byBzdGVwIHRocm91Z2ggYSBzZXQgb2Ygbm9kZXMuICAKLSAqIEl0IGlzIG1vZGVsZWQgbGFyZ2VseSBhZnRlciB0aGUgRE9NIE5vZGVJdGVyYXRvci4KKworICogPGNvZGU+RFRNSXRlcmF0b3JzPC9jb2RlPiBhcmUgdXNlZCB0byBzdGVwIHRocm91Z2ggYSAocG9zc2libHkKKyAqIGZpbHRlcmVkKSBzZXQgb2Ygbm9kZXMuICBUaGVpciBBUEkgaXMgbW9kZWxlZCBsYXJnZWx5IGFmdGVyIHRoZSBET00KKyAqIE5vZGVJdGVyYXRvci4KICAqIAogICogPHA+QSBEVE1JdGVyYXRvciBpcyBhIHNvbWV3aGF0IHVudXN1YWwgdHlwZSBvZiBpdGVyYXRvciwgaW4gdGhhdCBpdCAKICAqIGNhbiBzZXJ2ZSBib3RoIHNpbmdsZSBub2RlIGl0ZXJhdGlvbiBhbmQgcmFuZG9tIGFjY2Vzcy48L3A+CkBAIC03MSwxMiArNzMsMjEgQEAKICAqIDxwPkEgRFRNSXRlcmF0b3IgaXMgbWVhbnQgdG8gYmUgY3JlYXRlZCBvbmNlIGFzIGEgbWFzdGVyIHN0YXRpYyBvYmplY3QsIGFuZCAKICAqIHRoZW4gY2xvbmVkIG1hbnkgdGltZXMgZm9yIHJ1bnRpbWUgdXNlLiAgT3IgdGhlIG1hc3RlciBvYmplY3QgaXRzZWxmIG1heSAKICAqIGJlIHVzZWQgZm9yIHNpbXBsZXIgdXNlIGNhc2VzLjwvcD4KLSAqIDxwPlN0YXRlOiBJbiBwcm9ncmVzcyEhPC9wPgotICovCisgKgorICogPHA+QXQgdGhpcyB0aW1lLCB3ZSBkbyBub3QgZXhwZWN0IERUTUl0ZXJhdG9yIHRvIGVtdWxhdGUKKyAqIE5vZGVJdGVyYXRvcidzICJtYWludGFpbiByZWxhdGl2ZSBwb3NpdGlvbiIgc2VtYW50aWNzIHVuZGVyCisgKiBkb2N1bWVudCBtdXRhdGlvbi4gIEl0J3MgbGlrZWx5IHRvIHJlc3BvbmQgbW9yZSBsaWtlIHRoZQorICogVHJlZVdhbGtlcidzICJjdXJyZW50IG5vZGUiIHNlbWFudGljcy4gSG93ZXZlciwgc2luY2UgdGhlIGJhc2UgRFRNCisgKiBpcyBpbW11dGFibGUsIHRoaXMgaXNzdWUgY3VycmVudGx5IG1ha2VzIG5vIHByYWN0aWNhbAorICogZGlmZmVyZW5jZS48L3A+CisgKgorICogPHA+U3RhdGU6IEluIHByb2dyZXNzISE8L3A+ICovCiBwdWJsaWMgaW50ZXJmYWNlIERUTUl0ZXJhdG9yCiB7CiAKLSAgLy8gQ29uc3RhbnRzIHJldHVybmVkIGJ5IGFjY2VwdE5vZGUKKyAgLy8gQ29uc3RhbnRzIHJldHVybmVkIGJ5IGFjY2VwdE5vZGUsIGJvcnJvd2VkIGZyb20gdGhlIERPTSBUcmF2ZXJzYWwgY2hhcHRlcgorICAvLyAlUkVWSUVXJSBTaG91bGQgd2UgZXhwbGljaXRseSBpbml0aWFsaXplIHRoZW0gZnJvbSwgZWcsCisgIC8vIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQ/CiAKICAgLyoqCiAgICAqIEFjY2VwdCB0aGUgbm9kZS4KQEAgLTg0LDcgKzk1LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBGSUxURVJfQUNDRVBUID0gMTsKIAogICAvKioKLSAgICogUmVqZWN0IHRoZSBub2RlLiAoc2FtZSBhcyBGSUxURVJfU0tJUCkuCisgICAqIFJlamVjdCB0aGUgbm9kZS4gU2FtZSBiZWhhdmlvciBhcyBGSUxURVJfU0tJUC4gKEluIHRoZSBET00gdGhlc2UKKyAgICogZGlmZmVyIHdoZW4gYXBwbGllZCB0byBhIFRyZWVXYWxrZXIgYnV0IGhhdmUgdGhlIHNhbWUgcmVzdWx0IHdoZW4KKyAgICogYXBwbGllZCB0byBhIE5vZGVJdGVyYXRvcikuCiAgICAqLwogICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEZJTFRFUl9SRUpFQ1QgPSAyOwogCkBAIC05NSwxMSArMTA4LDEzIEBACiAgIAogICAvKioKICAgICogU2V0IHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGlzIGl0ZXJhdG9yIG9wZXJhdGVzLCB3aGljaCBzaG91bGQgcHJvdmlkZToKLSAgICogYSBub2RlICh0aGUgY29udGV4dCBub2RlLi4uIHNhbWUgdmFsdWUgYXMgInJvb3QiIGRlZmluZWQgYmVsb3cpIAotICAgKiBhIHBhaXIgb2Ygbm9uLXplcm8gcG9zaXRpdmUgaW50ZWdlcnMgKHRoZSBjb250ZXh0IHBvc2l0aW9uIGFuZCB0aGUgY29udGV4dCBzaXplKSAKLSAgICogYSBzZXQgb2YgdmFyaWFibGUgYmluZGluZ3MgCi0gICAqIGEgZnVuY3Rpb24gbGlicmFyeSAKLSAgICogdGhlIHNldCBvZiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGluIHNjb3BlIGZvciB0aGUgZXhwcmVzc2lvbi4KKyAgICogPHVsPgorICAgKiA8bGk+YSBub2RlICh0aGUgY29udGV4dCBub2RlLi4uIHNhbWUgdmFsdWUgYXMgInJvb3QiIGRlZmluZWQgYmVsb3cpIDwvbGk+CisgICAqIDxsaT5hIHBhaXIgb2Ygbm9uLXplcm8gcG9zaXRpdmUgaW50ZWdlcnMgKHRoZSBjb250ZXh0IHBvc2l0aW9uIGFuZCB0aGUgY29udGV4dCBzaXplKSA8L2xpPgorICAgKiA8bGk+YSBzZXQgb2YgdmFyaWFibGUgYmluZGluZ3MgPC9saT4KKyAgICogPGxpPmEgZnVuY3Rpb24gbGlicmFyeSA8L2xpPgorICAgKiA8bGk+dGhlIHNldCBvZiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGluIHNjb3BlIGZvciB0aGUgZXhwcmVzc2lvbi48L2xpPgorICAgKiA8dWw+CiAgICAqIAogICAgKiA8cD5BdCB0aGlzIHRpbWUgdGhlIGV4YWN0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZW52aXJvbm1lbnQgaXMgYXBwbGljYXRpb24gCiAgICAqIGRlcGVuZGVudC4gIFByb2JhYmx5IGEgcHJvcGVyIGludGVyZmFjZSB3aWxsIGJlIGNyZWF0ZWQgZmFpcmx5IHNvb24uPC9wPgpAQCAtMTA3LDI5ICsxMjIsNTEgQEAKICAgICogQHBhcmFtIGVudmlyb25tZW50IFRoZSBlbnZpcm9ubWVudCBvYmplY3QuCiAgICAqLwogICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChPYmplY3QgZW52aXJvbm1lbnQpOworICAKKyAgLyoqCisgICAqIEdldCBhbiBpbnN0YW5jZSBvZiBhIERUTSB0aGF0ICJvd25zIiBhIG5vZGUgaGFuZGxlLiAgU2luY2UgYSBub2RlIAorICAgKiBpdGVyYXRvciBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgYSBEVE1NYW5hZ2VyLCB0aGlzIGFsbG93cyB0aGUgCisgICAqIGNhbGxlciB0byBlYXNpbHkgZ2V0IHRoZSBEVE0gdXNpbmcganVzdCB0aGUgaXRlcmF0b3IuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBub2RlSGFuZGxlLgorICAgKgorICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgRFRNIHJlZmVyZW5jZS4KKyAgICovCisgIHB1YmxpYyBEVE0gZ2V0RFRNKGludCBub2RlSGFuZGxlKTsKKyAgCisgIC8qKgorICAgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgdGhlIERUTU1hbmFnZXIuICBTaW5jZSBhIG5vZGUgCisgICAqIGl0ZXJhdG9yIG1heSBiZSBwYXNzZWQgd2l0aG91dCBhIERUTU1hbmFnZXIsIHRoaXMgYWxsb3dzIHRoZSAKKyAgICogY2FsbGVyIHRvIGVhc2lseSBnZXQgdGhlIERUTU1hbmFnZXIgdXNpbmcganVzdCB0aGUgaXRlcmF0b3IuCisgICAqCisgICAqIEByZXR1cm4gYSBub24tbnVsbCBEVE1NYW5hZ2VyIHJlZmVyZW5jZS4KKyAgICovCisgIHB1YmxpYyBEVE1NYW5hZ2VyIGdldERUTU1hbmFnZXIoKTsKIAogICAvKioKICAgICogVGhlIHJvb3Qgbm9kZSBvZiB0aGUgPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+LCBhcyBzcGVjaWZpZWQgd2hlbiBpdAogICAgKiB3YXMgY3JlYXRlZC4gIE5vdGUgdGhlIHJvb3Qgbm9kZSBpcyBub3QgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgCi0gICAqIGRvY3VtZW50IHRyZWUsIGJ1dCB0aGUgY29udGV4dCBub2RlIGZyb20gd2hlcmUgdGhlIGl0dGVyYXRpb24gCi0gICAqIGJlZ2lucy4KKyAgICogZG9jdW1lbnQgdHJlZSwgYnV0IHRoZSBjb250ZXh0IG5vZGUgZnJvbSB3aGVyZSB0aGUgaXRlcmF0aW9uIAorICAgKiBiZWdpbnMgYW5kIGVuZHMuCiAgICAqCiAgICAqIEByZXR1cm4gbm9kZUhhbmRsZSBpbnQgSGFuZGxlIG9mIHRoZSBjb250ZXh0IG5vZGUuCiAgICAqLwogICBwdWJsaWMgaW50IGdldFJvb3QoKTsKIAogICAvKioKLSAgICogVGhlIHJvb3Qgbm9kZSBvZiB0aGUgPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+LCBhcyBzcGVjaWZpZWQgd2hlbiBpdAotICAgKiB3YXMgY3JlYXRlZC4gIE5vdGUgdGhlIHJvb3Qgbm9kZSBpcyBub3QgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgCi0gICAqIGRvY3VtZW50IHRyZWUsIGJ1dCB0aGUgY29udGV4dCBub2RlIGZyb20gd2hlcmUgdGhlIGl0dGVyYXRpb24gCi0gICAqIGJlZ2lucy4KKyAgICogUmVzZXQgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+LCBvdmVycmlkaW5nCisgICAqIHRoZSB2YWx1ZSBzcGVjaWZpZWQgd2hlbiBpdCB3YXMgY3JlYXRlZC4gIE5vdGUgdGhlIHJvb3Qgbm9kZSBpcworICAgKiBub3QgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgZG9jdW1lbnQgdHJlZSwgYnV0IHRoZSBjb250ZXh0IG5vZGUgZnJvbQorICAgKiB3aGVyZSB0aGUgaXRlcmF0aW9uIGJlZ2lucy4KICAgICoKICAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgY29udGV4dCBub2RlLgogICAgKi8KICAgcHVibGljIHZvaWQgc2V0Um9vdChpbnQgbm9kZUhhbmRsZSk7CiAgIAogICAvKioKLSAgICogUmVzZXQgdGhlIGl0ZXJhdG9yIHRvIHRoZSBzdGFydC4KKyAgICogUmVzZXQgdGhlIGl0ZXJhdG9yIHRvIHRoZSBzdGFydC4gQWZ0ZXIgcmVzZXR0aW5nLCB0aGUgbmV4dCBub2RlIHJldHVybmVkCisgICAqIHdpbGwgYmUgdGhlIHJvb3Qgbm9kZSAtLSBvciwgaWYgdGhhdCdzIGZpbHRlcmVkIG91dCwgdGhlIGZpcnN0IG5vZGUKKyAgICogd2l0aGluIHRoZSByb290J3Mgc3VidHJlZSB3aGljaCBpcyBfbm90XyBza2lwcGVkIGJ5IHRoZSBmaWx0ZXJzLgogICAgKi8KICAgcHVibGljIHZvaWQgcmVzZXQoKTsKIApAQCAtMTQwLDM0ICsxNzcsMzggQEAKICAgICogPGNvZGU+d2hhdFRvU2hvdzwvY29kZT4gd2lsbCBiZSBza2lwcGVkLCBidXQgdGhlaXIgY2hpbGRyZW4gbWF5IHN0aWxsCiAgICAqIGJlIGNvbnNpZGVyZWQuCiAgICAqCi0gICAqIEByZXR1cm4gb25lIG9mIHRoZSBTSE9XX1hYWCBjb25zdGFudHMuCisgICAqIEByZXR1cm4gb25lIG9mIHRoZSBTSE9XX1hYWCBjb25zdGFudHMsIG9yIHNldmVyYWwgT1JlZCB0b2dldGhlci4KICAgICovCiAgIHB1YmxpYyBpbnQgZ2V0V2hhdFRvU2hvdygpOwogCiAgIC8qKgotICAgKiAgVGhlIHZhbHVlIG9mIHRoaXMgZmxhZyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNoaWxkcmVuIG9mIGVudGl0eQorICAgKiA8cD5UaGUgdmFsdWUgb2YgdGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciB0aGUgY2hpbGRyZW4gb2YgZW50aXR5CiAgICAqIHJlZmVyZW5jZSBub2RlcyBhcmUgdmlzaWJsZSB0byB0aGUgaXRlcmF0b3IuIElmIGZhbHNlLCB0aGV5ICBhbmQKICAgICogdGhlaXIgZGVzY2VuZGFudHMgd2lsbCBiZSByZWplY3RlZC4gTm90ZSB0aGF0IHRoaXMgcmVqZWN0aW9uIHRha2VzCi0gICAqIHByZWNlZGVuY2Ugb3ZlciA8Y29kZT53aGF0VG9TaG93PC9jb2RlPiBhbmQgdGhlIGZpbHRlci4gCi0gICAqIDxicj4KLSAgICogPGJyPiBUbyBwcm9kdWNlIGEgdmlldyBvZiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgZW50aXR5IHJlZmVyZW5jZXMKKyAgICogcHJlY2VkZW5jZSBvdmVyIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGFuZCB0aGUgZmlsdGVyLiA8L3A+CisgICAqIAorICAgKiA8cD4gVG8gcHJvZHVjZSBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzIGVudGl0eSByZWZlcmVuY2VzCiAgICAqIGV4cGFuZGVkIGFuZCBkb2VzIG5vdCBleHBvc2UgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBpdHNlbGYsIHVzZQogICAgKiB0aGUgPGNvZGU+d2hhdFRvU2hvdzwvY29kZT4gZmxhZ3MgdG8gaGlkZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlCiAgICAqIGFuZCBzZXQgPGNvZGU+ZXhwYW5kRW50aXR5UmVmZXJlbmNlczwvY29kZT4gdG8gdHJ1ZSB3aGVuIGNyZWF0aW5nIHRoZQogICAgKiBpdGVyYXRvci4gVG8gcHJvZHVjZSBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzIGVudGl0eSByZWZlcmVuY2UKICAgICogbm9kZXMgYnV0IG5vIGVudGl0eSBleHBhbnNpb24sIHVzZSB0aGUgPGNvZGU+d2hhdFRvU2hvdzwvY29kZT4gZmxhZ3MKICAgICogdG8gc2hvdyB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGFuZCBzZXQKLSAgICogPGNvZGU+ZXhwYW5kRW50aXR5UmVmZXJlbmNlczwvY29kZT4gdG8gZmFsc2UuCisgICAqIDxjb2RlPmV4cGFuZEVudGl0eVJlZmVyZW5jZXM8L2NvZGU+IHRvIGZhbHNlLjwvcD4KICAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIGVudGl0eSByZWZlcmVuY2VzIHdpbGwgYmUgZXhwYW5kZWQuCi0gICAqLworICAgKiA8cD5OT1RFOiBJbiBYYWxhbidzIHVzZSBvZiBEVE0gd2Ugd2lsbCBnZW5lcmFsbHkgaGF2ZSBmdWxseSBleHBhbmRlZAorICAgKiBlbnRpdHkgcmVmZXJlbmNlcyB3aGVuIHRoZSBkb2N1bWVudCB0cmVlIHdhcyBidWlsdCwgYW5kIHRodXMgdGhpcworICAgKiBmbGFnIHdpbGwgaGF2ZSBubyBlZmZlY3QuPC9wPgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgZW50aXR5IHJlZmVyZW5jZXMgd2lsbCBiZSBleHBhbmRlZC4gICovCiAgIHB1YmxpYyBib29sZWFuIGdldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoKTsKIAogICAvKioKICAgICogUmV0dXJucyB0aGUgbmV4dCBub2RlIGluIHRoZSBzZXQgYW5kIGFkdmFuY2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUKICAgICogaXRlcmF0b3IgaW4gdGhlIHNldC4gQWZ0ZXIgYSA8Y29kZT5EVE1JdGVyYXRvcjwvY29kZT4gaGFzIHNldFJvb3QgY2FsbGVkLAotICAgKiB0aGUgZmlyc3QgY2FsbCB0byA8Y29kZT5uZXh0Tm9kZSgpPC9jb2RlPiByZXR1cm5zIHRoZSBmaXJzdCBub2RlIGluCi0gICAqIHRoZSBzZXQuCisgICAqIHRoZSBmaXJzdCBjYWxsIHRvIDxjb2RlPm5leHROb2RlKCk8L2NvZGU+IHJldHVybnMgdGhhdCByb290IG9yIChpZiBpdAorICAgKiBpcyByZWplY3RlZCBieSB0aGUgZmlsdGVycykgdGhlIGZpcnN0IG5vZGUgd2l0aGluIGl0cyBzdWJ0cmVlIHdoaWNoIGlzCisgICAqIG5vdCBmaWx0ZXJlZCBvdXQuCiAgICAqIEByZXR1cm4gVGhlIG5leHQgbm9kZSBoYW5kbGUgaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZCBvdmVyLCBvcgogICAgKiAgIC0xIGlmIHRoZXJlIGFyZSBubyBtb3JlIG1lbWJlcnMgaW4gdGhhdCBzZXQuCiAgICAqLwpAQCAtMTg3LDExICsyMjgsMjAgQEAKICAgICogaW4gdGhlIElOVkFMSUQgc3RhdGUuIEFmdGVyIDxjb2RlPmRldGFjaDwvY29kZT4gaGFzIGJlZW4gaW52b2tlZCwKICAgICogY2FsbHMgdG8gPGNvZGU+bmV4dE5vZGU8L2NvZGU+IG9yIDxjb2RlPnByZXZpb3VzTm9kZTwvY29kZT4gd2lsbAogICAgKiByYWlzZSBhIHJ1bnRpbWUgZXhjZXB0aW9uLgorICAgKgorICAgKiAlUkVWSUVXJSBUaGlzIG1ldGhvZCBtYXkgbm90IGJlIHJlcXVpcmVkIGluIERUTUl0ZXJhdG9yLgorICAgKiBJdCB3YXMgbmVlZGVkIGluIERPTUl0ZXJhdG9yIGJlY2F1c2UgZGF0YSBsaW5rYWdlcyB3ZXJlCisgICAqIGVzdGFibGlzaGVkIHRvIHN1cHBvcnQgdGhlICJtYWludGFpbiByZWxhdGl2ZSBwb3NpdGlvbiIgc2VtYW50aWMKKyAgICogdW5kZXIgZG9jdW1lbnQgbXV0YXRpb24uLi4gIGJ1dCBpZiBEVE0gZG9lc24ndCBuZWVkCisgICAqIHRoYXQgc2VtYW50aWMsIHdlIHByb2JhYmx5IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcworICAgKiBjbGVhbnVwLiBPbiB0aGUgb3RoZXIgaGFuZCwgYXQgd29yc3QgaXQncyBhIGhhcm1sZXNzIG5vLW9wLi4uCiAgICAqLwogICBwdWJsaWMgdm9pZCBkZXRhY2goKTsKIAogICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IG5vZGUgaW4gdGhlIGl0ZXJhdG9yLjwvYT4uCisgICAqIEdldCB0aGUgY3VycmVudCBub2RlIGluIHRoZSBpdGVyYXRvci4gTm90ZSB0aGF0IHRoaXMgZGlmZmVycyBmcm9tCisgICAqIHRoZSBET00ncyBOb2RlSXRlcmF0b3IsIHdoZXJlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGxpZXMgYmV0d2VlbiB0d28KKyAgICogbm9kZXMgKGFzIHBhcnQgb2YgdGhlIG1haW50YWluLXJlbGF0aXZlLXBvc2l0aW9uIHNlbWFudGljKS4KICAgICoKICAgICogQHJldHVybiBUaGUgY3VycmVudCBub2RlIGhhbmRsZSwgb3IgLTEuCiAgICAqLwpAQCAtMjEzLDE3ICsyNjMsMjcgQEAKICAgICogYmUgY2FjaGVkLCBlbmFibGluZyByYW5kb20gYWNjZXNzLCBhbmQgZ2l2aW5nIHRoZSBhYmlsaXR5IHRvIGRvIAogICAgKiBzb3J0cyBhbmQgdGhlIGxpa2UuICBUaGV5IGFyZSBub3QgY2FjaGVkIGJ5IGRlZmF1bHQuCiAgICAqCisgICAqICVSRVZJRVclIFNob3VsZG4ndCB0aGUgb3RoZXIgcmFuZG9tLWFjY2VzcyBtZXRob2RzIHRocm93IGFuIGV4Y2VwdGlvbgorICAgKiBpZiB0aGV5J3JlIGNhbGxlZCBvbiBhIERUTUl0ZXJhdG9yIHdpdGggdGhpcyBmbGFnIHNldCBmYWxzZT8KKyAgICoKICAgICogQHBhcmFtIGIgdHJ1ZSBpZiB0aGUgbm9kZXMgc2hvdWxkIGJlIGNhY2hlZC4KICAgICovCiAgIHB1YmxpYyB2b2lkIHNldFNob3VsZENhY2hlTm9kZXMoYm9vbGVhbiBiKTsKLQorICAKICAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBwb3NpdGlvbiwgd2hpY2ggaXMgb25lIGxlc3MgdGhhbgotICAgKiB0aGUgbmV4dCBuZXh0Tm9kZSgpIGNhbGwgd2lsbCByZXRyaWV2ZS4gIGkuZS4gaWYKLSAgICogeW91IGNhbGwgZ2V0Q3VycmVudFBvcygpIGFuZCB0aGUgcmV0dXJuIGlzIDAsIHRoZSBuZXh0Ci0gICAqIGZldGNoIHdpbGwgdGFrZSBwbGFjZSBhdCBpbmRleCAxLgorICAgKiBUZWxscyBpZiB0aGlzIGl0ZXJhdG9yIGNhbiBoYXZlIG5vZGVzIGFkZGVkIHRvIGl0IG9yIHNldCB2aWEgCisgICAqIHRoZSA8Y29kZT5zZXRJdGVtKGludCBub2RlLCBpbnQgaW5kZXgpPC9jb2RlPiBtZXRob2QuCisgICAqIAorICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5vZGVsaXN0IGNhbiBiZSBtdXRhdGVkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNNdXRhYmxlKCk7CisKKyAgLyoqIEdldCB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIGNhY2hlZCBsaXN0LCB3aGljaCBpcyBvbmUKKyAgICogbGVzcyB0aGFuIHRoZSBuZXh0IG5leHROb2RlKCkgY2FsbCB3aWxsIHJldHJpZXZlLiAgaS5lLiBpZiB5b3UKKyAgICogY2FsbCBnZXRDdXJyZW50UG9zKCkgYW5kIHRoZSByZXR1cm4gaXMgMCwgdGhlIG5leHQgZmV0Y2ggd2lsbAorICAgKiB0YWtlIHBsYWNlIGF0IGluZGV4IDEuCiAgICAqCi0gICAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVyYXRpb24uPC9hPi4KKyAgICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIGl0ZXJhdGlvbi4KICAgICovCiAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFBvcygpOwogCkBAIC0yMzEsNyArMjkxLDggQEAKICAgICogSWYgYW4gaW5kZXggaXMgcmVxdWVzdGVkLCBOb2RlU2V0IHdpbGwgY2FsbCB0aGlzIG1ldGhvZAogICAgKiB0byBydW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBpbmRleC4gIEJ5IGRlZmF1bHQgdGhpcyBzZXRzCiAgICAqIG1fbmV4dCB0byB0aGUgaW5kZXguICBJZiB0aGUgaW5kZXggYXJndW1lbnQgaXMgLTEsIHRoaXMKLSAgICogc2lnbmFscyB0aGF0IHRoZSBpdGVyYXRvciBzaG91bGQgYmUgcnVuIHRvIHRoZSBlbmQuCisgICAqIHNpZ25hbHMgdGhhdCB0aGUgaXRlcmF0b3Igc2hvdWxkIGJlIHJ1biB0byB0aGUgZW5kIGFuZAorICAgKiBjb21wbGV0ZWx5IGZpbGwgdGhlIGNhY2hlLgogICAgKgogICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIHJ1biB0bywgb3IgLTEgaWYgdGhlIGl0ZXJhdG9yIHNob3VsZCBiZSBydW4KICAgICogICAgICAgICAgICAgIHRvIHRoZSBlbmQuCkBAIC0yNTgsMTMgKzMxOSwyOSBAQAogICBwdWJsaWMgaW50IGl0ZW0oaW50IGluZGV4KTsKICAgCiAgIC8qKgorICAgKiBTZXRzIHRoZSBub2RlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyB2ZWN0b3IgdG8gYmUgdGhlCisgICAqIHNwZWNpZmllZCBub2RlLiBUaGUgcHJldmlvdXMgY29tcG9uZW50IGF0IHRoYXQgcG9zaXRpb24gaXMgZGlzY2FyZGVkLgorICAgKgorICAgKiA8cD5UaGUgaW5kZXggbXVzdCBiZSBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIGFuZCBsZXNzCisgICAqIHRoYW4gdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgdmVjdG9yLiAgCisgICAqIFRoZSBpdGVyYXRvciBtdXN0IGJlIGluIGNhY2hlZCBtb2RlLjwvcD4KKyAgICogCisgICAqIDxwPk1lYW50IHRvIGJlIHVzZWQgZm9yIHNvcnRlZCBpdGVyYXRvcnMuPC9wPgorICAgKgorICAgKiBAcGFyYW0gbm9kZSBOb2RlIHRvIHNldAorICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2Ygd2hlcmUgdG8gc2V0IHRoZSBub2RlCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRJdGVtKGludCBub2RlLCBpbnQgaW5kZXgpOworICAKKyAgLyoqCiAgICAqIFRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGxpc3QuIFRoZSByYW5nZSBvZiB2YWxpZCBjaGlsZCBub2RlIGluZGljZXMKLSAgICogaXMgMCB0byA8Y29kZT5sZW5ndGgtMTwvY29kZT4gaW5jbHVzaXZlLgorICAgKiBpcyAwIHRvIDxjb2RlPmxlbmd0aC0xPC9jb2RlPiBpbmNsdXNpdmUuIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHJ1bm5pbmcKKyAgICogdGhlIGl0ZXJhdG9yIHRvIGNvbXBsZXRpb24sIGFuZCBwcmVzdW1hYmx5IGZpbGxpbmcgdGhlIGNhY2hlLgogICAgKgogICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGxpc3QuCiAgICAqLwogICBwdWJsaWMgaW50IGdldExlbmd0aCgpOwotICAKKyAgICAKICAgLy89PT09PT09PT09PSBDbG9uaW5nIG9wZXJhdGlvbnMuID09PT09PT09PT09PQogICAKICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTU1hbmFnZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjE1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDUzNyBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCisgKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0CisgKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKKyAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuZHRtOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5QcmVmaXhSZXNvbHZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MU3RyaW5nRmFjdG9yeTsKKworLyoqCisgKiBBIERUTU1hbmFnZXIgaW5zdGFuY2UgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIERUTSBhbmQKKyAqIERUTUl0ZXJhdG9yIG9iamVjdHMsIGFuZCBtYW5hZ2UgdGhlIERUTSBvYmplY3RzIGluIHRoZSBzeXN0ZW0uCisgKgorICogPHA+VGhlIHN5c3RlbSBwcm9wZXJ0eSB0aGF0IGRldGVybWluZXMgd2hpY2ggRmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICogdG8gY3JlYXRlIGlzIG5hbWVkICJvcmcuYXBhY2hlLnhtbC51dGlscy5EVE1GYWN0b3J5Ii4gVGhpcworICogcHJvcGVydHkgbmFtZXMgYSBjb25jcmV0ZSBzdWJjbGFzcyBvZiB0aGUgRFRNRmFjdG9yeSBhYnN0cmFjdAorICogIGNsYXNzLiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGRlZmluZWQsIGEgcGxhdGZvcm0gZGVmYXVsdCBpcyBiZSB1c2VkLjwvcD4KKyAqCisgKiA8cD5BbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIDxlbXBoPm11c3Q8L2VtcGg+IGJlIHNhZmUgdG8gdXNlIGFjcm9zcworICogdGhyZWFkIGluc3RhbmNlcy4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgYSBjbGllbnQgd2lsbCBjcmVhdGUgYSBzaW5nbGUgaW5zdGFuY2UKKyAqIG9mIGEgRFRNTWFuYWdlciB0byB1c2UgYWNyb3NzIG11bHRpcGxlIHRocmVhZHMuICBUaGlzIHdpbGwgYWxsb3cgc2hhcmluZworICogb2YgRFRNcyBhY3Jvc3MgbXVsdGlwbGUgcHJvY2Vzc2VzLjwvcD4KKyAqCisgKiA8cD5Ob3RlOiB0aGlzIGNsYXNzIGlzIGluY29tcGxldGUgcmlnaHQgbm93LiAgSXQgd2lsbCBiZSBwcmV0dHkgbXVjaAorICogbW9kZWxlZCBhZnRlciBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSBpbiB0ZXJtcyBvZiBpdHMKKyAqIGZhY3Rvcnkgc3VwcG9ydC48L3A+CisgKgorICogPHA+U3RhdGU6IEluIHByb2dyZXNzISE8L3A+CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEVE1NYW5hZ2VyCit7CisKKyAgLyoqIFRoZSBkZWZhdWx0IHByb3BlcnR5IG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBKQVhQIHNwZWMuICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0UHJvcE5hbWUgPQorICAgICJvcmcuYXBhY2hlLnhtbC5kdG0uRFRNTWFuYWdlciI7CisKKyAgLyoqCisgICAqIFRoZSBkZWZhdWx0IHRhYmxlIGZvciBleGFuZGVkTmFtZUlEIGxvb2t1cHMuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBFeHBhbmRlZE5hbWVUYWJsZSBtX2V4cGFuZGVkTmFtZVRhYmxlID0KKyAgICBuZXcgRXhwYW5kZWROYW1lVGFibGUoKTsKKworICAvKioKKyAgICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgWE1MU3RyaW5nIG9iamVjdHMuCisgICAqICAlVEJEJSBNYWtlIHRoaXMgc2V0IGJ5IHRoZSBjYWxsZXIuCisgICAqLworICBwcm90ZWN0ZWQgWE1MU3RyaW5nRmFjdG9yeSBtX3hzZiA9IG51bGw7CisKKyAgLyoqCisgICAqIERlZmF1bHQgY29uc3RydWN0b3IgaXMgcHJvdGVjdGVkIG9uIHB1cnBvc2UuCisgICAqLworICBwcm90ZWN0ZWQgRFRNTWFuYWdlcigpe30KKworICAvKioKKyAgICogR2V0IHRoZSBYTUxTdHJpbmdGYWN0b3J5IHVzZWQgZm9yIHRoZSBEVE1zLgorICAgKgorICAgKgorICAgKiBAcmV0dXJuIGEgdmFsaWQgWE1MU3RyaW5nRmFjdG9yeSBvYmplY3QsIG9yIG51bGwgaWYgaXQgaGFzbid0IGJlZW4gc2V0IHlldC4KKyAgICovCisgIHB1YmxpYyBYTUxTdHJpbmdGYWN0b3J5IGdldFhNTFN0cmluZ0ZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIG1feHNmOworICB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgWE1MU3RyaW5nRmFjdG9yeSB1c2VkIGZvciB0aGUgRFRNcy4KKyAgICoKKyAgICoKKyAgICogQHBhcmFtIHhzZiBhIHZhbGlkIFhNTFN0cmluZ0ZhY3Rvcnkgb2JqZWN0LCBzaG91bGQgbm90IGJlIG51bGwuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRYTUxTdHJpbmdGYWN0b3J5KFhNTFN0cmluZ0ZhY3RvcnkgeHNmKQorICB7CisgICAgbV94c2YgPSB4c2Y7CisgIH0KKworICAvKioKKyAgICogT2J0YWluIGEgbmV3IGluc3RhbmNlIG9mIGEgPGNvZGU+RFRNTWFuYWdlcjwvY29kZT4uCisgICAqIFRoaXMgc3RhdGljIG1ldGhvZCBjcmVhdGVzIGEgbmV3IGZhY3RvcnkgaW5zdGFuY2UKKyAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgZm9sbG93aW5nIG9yZGVyZWQgbG9va3VwIHByb2NlZHVyZSB0byBkZXRlcm1pbmUKKyAgICogdGhlIDxjb2RlPkRUTU1hbmFnZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIGNsYXNzIHRvCisgICAqIGxvYWQ6CisgICAqIDx1bD4KKyAgICogPGxpPgorICAgKiBVc2UgdGhlIDxjb2RlPmphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk8L2NvZGU+IHN5c3RlbQorICAgKiBwcm9wZXJ0eS4KKyAgICogPC9saT4KKyAgICogPGxpPgorICAgKiBVc2UgdGhlIEpBVkFfSE9NRSh0aGUgcGFyZW50IGRpcmVjdG9yeSB3aGVyZSBqZGsgaXMKKyAgICogaW5zdGFsbGVkKS9saWIvamF4cC5wcm9wZXJ0aWVzIGZvciBhIHByb3BlcnR5IGZpbGUgdGhhdCBjb250YWlucyB0aGUKKyAgICogbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3Mga2V5ZWQgb24gdGhlIHNhbWUgdmFsdWUgYXMgdGhlCisgICAqIHN5c3RlbSBwcm9wZXJ0eSBkZWZpbmVkIGFib3ZlLgorICAgKiA8L2xpPgorICAgKiA8bGk+CisgICAqIFVzZSB0aGUgU2VydmljZXMgQVBJIChhcyBkZXRhaWxlZCBpbiB0ZWggSkFSIHNwZWNpZmljYXRpb24pLCBpZgorICAgKiBhdmFpbGFibGUsIHRvIGRldGVybWluZSB0aGUgY2xhc3NuYW1lLiBUaGUgU2VydmljZXMgQVBJIHdpbGwgbG9vaworICAgKiBmb3IgYSBjbGFzc25hbWUgaW4gdGhlIGZpbGUKKyAgICogPGNvZGU+TUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnBhcnNlcnMuRFRNTWFuYWdlcjwvY29kZT4KKyAgICogaW4gamFycyBhdmFpbGFibGUgdG8gdGhlIHJ1bnRpbWUuCisgICAqIDwvbGk+CisgICAqIDxsaT4KKyAgICogUGxhdGZvcm0gZGVmYXVsdCA8Y29kZT5EVE1NYW5hZ2VyPC9jb2RlPiBpbnN0YW5jZS4KKyAgICogPC9saT4KKyAgICogPC91bD4KKyAgICoKKyAgICogT25jZSBhbiBhcHBsaWNhdGlvbiBoYXMgb2J0YWluZWQgYSByZWZlcmVuY2UgdG8gYSA8Y29kZT4KKyAgICogRFRNTWFuYWdlcjwvY29kZT4gaXQgY2FuIHVzZSB0aGUgZmFjdG9yeSB0byBjb25maWd1cmUKKyAgICogYW5kIG9idGFpbiBwYXJzZXIgaW5zdGFuY2VzLgorICAgKgorICAgKiBAcmV0dXJuIG5ldyBEVE1NYW5hZ2VyIGluc3RhbmNlLCBuZXZlciBudWxsLgorICAgKgorICAgKiBAdGhyb3dzIERUTUNvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICogaWYgdGhlIGltcGxtZW50YXRpb24gaXMgbm90IGF2YWlsYWJsZSBvciBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBEVE1NYW5hZ2VyIG5ld0luc3RhbmNlKFhNTFN0cmluZ0ZhY3RvcnkgeHNmKSAKKyAgICAgICAgICAgdGhyb3dzIERUTUNvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgeworCisgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGZpbmRGYWN0b3J5KGRlZmF1bHRQcm9wTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUueG1sLmR0bS5EVE1NYW5hZ2VyRGVmYXVsdCIpOworCisgICAgaWYgKGNsYXNzbmFtZSA9PSBudWxsKQorICAgIHsKKyAgICAgIHRocm93IG5ldyBEVE1Db25maWd1cmF0aW9uRXhjZXB0aW9uKCJObyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvdW5kIik7CisgICAgfQorCisgICAgRFRNTWFuYWdlciBmYWN0b3J5SW1wbDsKKworICAgIHRyeQorICAgIHsKKyAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOworCisgICAgICBmYWN0b3J5SW1wbCA9IChEVE1NYW5hZ2VyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgIH0KKyAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKQorICAgIHsKKyAgICAgIHRocm93IG5ldyBEVE1Db25maWd1cmF0aW9uRXhjZXB0aW9uKGNuZmUpOworICAgIH0KKyAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpCisgICAgeworICAgICAgdGhyb3cgbmV3IERUTUNvbmZpZ3VyYXRpb25FeGNlcHRpb24oaWFlKTsKKyAgICB9CisgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpCisgICAgeworICAgICAgdGhyb3cgbmV3IERUTUNvbmZpZ3VyYXRpb25FeGNlcHRpb24oaWUpOworICAgIH0KKyAgICBmYWN0b3J5SW1wbC5zZXRYTUxTdHJpbmdGYWN0b3J5KHhzZik7CisKKyAgICByZXR1cm4gZmFjdG9yeUltcGw7CisgIH0KKworICAvKioKKyAgICogR2V0IGFuIGluc3RhbmNlIG9mIGEgRFRNLCBsb2FkZWQgd2l0aCB0aGUgY29udGVudCBmcm9tIHRoZQorICAgKiBzcGVjaWZpZWQgc291cmNlLiAgSWYgdGhlIHVuaXF1ZSBmbGFnIGlzIHRydWUsIGEgbmV3IGluc3RhbmNlIHdpbGwKKyAgICogYWx3YXlzIGJlIHJldHVybmVkLiAgT3RoZXJ3aXNlIGl0IGlzIHVwIHRvIHRoZSBEVE1NYW5hZ2VyIHRvIHJldHVybiBhCisgICAqIG5ldyBpbnN0YW5jZSBvciBhbiBpbnN0YW5jZSB0aGF0IGl0IGFscmVhZHkgY3JlYXRlZCBhbmQgbWF5IGJlIGJlaW5nIHVzZWQKKyAgICogYnkgc29tZW9uZSBlbHNlLgorICAgKiAoSSB0aGluayBtb3JlIHBhcmFtZXRlcnMgd2lsbCBuZWVkIHRvIGJlIGFkZGVkIGZvciBlcnJvciBoYW5kbGluZywgYW5kIGVudGl0eQorICAgKiByZXNvbHV0aW9uKS4KKyAgICoKKyAgICogQHBhcmFtIHNvdXJjZSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc291cmNlIG9iamVjdCwgd2hpY2ggbWF5IGJlIG51bGwsCisgICAqICAgICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSBpdCBpcyBhc3N1bWVkIHRoYXQgbm9kZSBjb25zdHJ1Y3Rpb24gd2lsbCB0YWtlCisgICAqICAgICAgICAgICAgICAgYnkgc29tZSBvdGhlciBtZWFucy4KKyAgICogQHBhcmFtIHVuaXF1ZSB0cnVlIGlmIHRoZSByZXR1cm5lZCBEVE0gbXVzdCBiZSB1bmlxdWUsIHByb2JhYmx5IGJlY2F1c2UgaXQKKyAgICogaXMgZ29pbmcgdG8gYmUgbXV0YXRlZC4KKyAgICogQHBhcmFtIHdoaXRlU3BhY2VGaWx0ZXIgRW5hYmxlcyBmaWx0ZXJpbmcgb2Ygd2hpdGVzcGFjZSBub2RlcywgYW5kIG1heQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBudWxsLgorICAgKiBAcGFyYW0gaW5jcmVtZW50YWwgdHJ1ZSBpZiB0aGUgRFRNIHNob3VsZCBiZSBidWlsdCBpbmNyZW1lbnRhbGx5LCBpZgorICAgKiAgICAgICAgICAgICAgICAgICAgcG9zc2libGUuCisgICAqCisgICAqIEByZXR1cm4gYSBub24tbnVsbCBEVE0gcmVmZXJlbmNlLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IERUTSBnZXREVE0oamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2Ugc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVuaXF1ZSwgRFRNV1NGaWx0ZXIgd2hpdGVTcGFjZUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNyZW1lbnRhbCk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgaW5zdGFuY2Ugb2YgRFRNIHRoYXQgIm93bnMiIGEgbm9kZSBoYW5kbGUuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBub2RlSGFuZGxlLgorICAgKgorICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgRFRNIHJlZmVyZW5jZS4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBEVE0gZ2V0RFRNKGludCBub2RlSGFuZGxlKTsKKworICAvKioKKyAgICogR2l2ZW4gYSBXM0MgRE9NIG5vZGUsIHRyeSBhbmQgcmV0dXJuIGEgRFRNIGhhbmRsZS4KKyAgICogTm90ZTogY2FsbGluZyB0aGlzIG1heSBiZSBub24tb3B0aW1hbC4KKyAgICoKKyAgICogQHBhcmFtIG5vZGUgTm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgRE9NIG5vZGUuCisgICAqCisgICAqIEByZXR1cm4gYSB2YWxpZCBEVE0gaGFuZGxlLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGludCBnZXREVE1IYW5kbGVGcm9tTm9kZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpOworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgRFRNIHJlcHJlc2VudGluZyBhbiBlbXB0eSA8Y29kZT5Eb2N1bWVudEZyYWdtZW50PC9jb2RlPiBvYmplY3QuCisgICAqIEByZXR1cm4gYSBub24tbnVsbCBEVE0gcmVmZXJlbmNlLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IERUTSBjcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisKKyAgLyoqCisgICAqIFJlbGVhc2UgYSBEVE0gZWl0aGVyIHRvIGEgbHJ1IHBvb2wsIG9yIGNvbXBsZXRlbHkgcmVtb3ZlIHJlZmVyZW5jZS4KKyAgICogRFRNcyB3aXRob3V0IHN5c3RlbSBJRHMgYXJlIGFsd2F5cyBoYXJkIGRlbGV0ZWQuCisgICAqIFN0YXRlOiBleHBlcmltZW50YWwuCisgICAqCisgICAqIEBwYXJhbSBkdG0gVGhlIERUTSB0byBiZSByZWxlYXNlZC4KKyAgICogQHBhcmFtIHNob3VsZEhhcmREZWxldGUgVHJ1ZSBpZiB0aGUgRFRNIHNob3VsZCBiZSByZW1vdmVkIG5vIG1hdHRlciB3aGF0LgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIERUTSB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgaXQgd2FzIHB1dCBiYWNrIGluIGEgbHJ1IHBvb2wuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWxlYXNlKERUTSBkdG0sIGJvb2xlYW4gc2hvdWxkSGFyZERlbGV0ZSk7CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyA8Y29kZT5EVE1JdGVyYXRvcjwvY29kZT4gYmFzZWQgb24gYW4gWFBhdGgKKyAgICogPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjTlQtTG9jYXRpb25QYXRoPkxvY2F0aW9uUGF0aDwvYT4gb3IKKyAgICogYSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aCNOVC1VbmlvbkV4cHIiPlVuaW9uRXhwcjwvYT4uCisgICAqCisgICAqIEBwYXJhbSB4cGF0aENvbXBpbGVyID8/PyBTb21laG93IHdlIG5lZWQgdG8gcGFzcyBpbiBhIHN1YnBhcnQgb2YgdGhlCisgICAqIGV4cHJlc3Npb24uICBJIGhhdGUgdG8gZG8gdGhpcyB3aXRoIHN0cmluZ3MsIHNpbmNlIHRoZSBsYXJnZXIgZXhwcmVzc2lvbgorICAgKiBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZC4KKyAgICoKKyAgICogQHBhcmFtIHBvcyBUaGUgcG9zaXRpb24gaW4gdGhlIGV4cHJlc3Npb24uCisgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IERUTUl0ZXJhdG9yIGNyZWF0ZURUTUl0ZXJhdG9yKE9iamVjdCB4cGF0aENvbXBpbGVyLAorICAgICAgICAgIGludCBwb3MpOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+IGJhc2VkIG9uIGFuIFhQYXRoCisgICAqIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI05ULUxvY2F0aW9uUGF0aD5Mb2NhdGlvblBhdGg8L2E+IG9yCisgICAqIGEgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjTlQtVW5pb25FeHByIj5VbmlvbkV4cHI8L2E+LgorICAgKgorICAgKiBAcGFyYW0geHBhdGhTdHJpbmcgTXVzdCBiZSBhIHZhbGlkIHN0cmluZyBleHByZXNzaW5nIGEKKyAgICogPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjTlQtTG9jYXRpb25QYXRoPkxvY2F0aW9uUGF0aDwvYT4gb3IKKyAgICogYSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aCNOVC1VbmlvbkV4cHIiPlVuaW9uRXhwcjwvYT4uCisgICAqCisgICAqIEBwYXJhbSBwcmVzb2x2ZXIgQW4gb2JqZWN0IHRoYXQgY2FuIHJlc29sdmUgcHJlZml4ZXMgdG8gbmFtZXNwYWNlIFVSTHMuCisgICAqCisgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IERUTUl0ZXJhdG9yIGNyZWF0ZURUTUl0ZXJhdG9yKFN0cmluZyB4cGF0aFN0cmluZywKKyAgICAgICAgICBQcmVmaXhSZXNvbHZlciBwcmVzb2x2ZXIpOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+IGJhc2VkIG9ubHkgb24gYSB3aGF0VG9TaG93CisgICAqIGFuZCBhIERUTUZpbHRlci4gIFRoZSB0cmF2ZXJzYWwgc2VtYW50aWNzIGFyZSBkZWZpbmVkIGFzIHRoZQorICAgKiBkZXNjZW5kYW50IGFjY2Vzcy4KKyAgICogPHA+CisgICAqIE5vdGUgdGhhdCBEVE1JdGVyYXRvcnMgbWF5IG5vdCBiZSBhbiBleGFjdCBtYXRjaCB0byBET00KKyAgICogTm9kZUl0ZXJhdG9ycy4gVGhleSBhcmUgaW5pdGlhbGl6ZWQgYW5kIHVzZWQgaW4gbXVjaCB0aGUgc2FtZSB3YXkKKyAgICogYXMgYSBOb2RlSXRlcmF0b3IsIGJ1dCB0aGVpciByZXNwb25zZSB0byBkb2N1bWVudCBtdXRhdGlvbiBpcyBub3QKKyAgICogY3VycmVudGx5IGRlZmluZWQuCisgICAqCisgICAqIEBwYXJhbSB3aGF0VG9TaG93IFRoaXMgZmxhZyBzcGVjaWZpZXMgd2hpY2ggbm9kZSB0eXBlcyBtYXkgYXBwZWFyIGluCisgICAqICAgdGhlIGxvZ2ljYWwgdmlldyBvZiB0aGUgdHJlZSBwcmVzZW50ZWQgYnkgdGhlIGl0ZXJhdG9yLiBTZWUgdGhlCisgICAqICAgZGVzY3JpcHRpb24gb2YgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gZm9yIHRoZSBzZXQgb2YgcG9zc2libGUKKyAgICogICA8Y29kZT5TSE9XXzwvY29kZT4gdmFsdWVzLlRoZXNlIGZsYWdzIGNhbiBiZSBjb21iaW5lZCB1c2luZworICAgKiAgIDxjb2RlPk9SPC9jb2RlPi4KKyAgICogQHBhcmFtIGZpbHRlciBUaGUgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gdG8gYmUgdXNlZCB3aXRoIHRoaXMKKyAgICogICA8Y29kZT5EVE1GaWx0ZXI8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBpbmRpY2F0ZSBubyBmaWx0ZXIuCisgICAqIEBwYXJhbSBlbnRpdHlSZWZlcmVuY2VFeHBhbnNpb24gVGhlIHZhbHVlIG9mIHRoaXMgZmxhZyBkZXRlcm1pbmVzCisgICAqICAgd2hldGhlciBlbnRpdHkgcmVmZXJlbmNlIG5vZGVzIGFyZSBleHBhbmRlZC4KKyAgICoKKyAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5EVE1JdGVyYXRvcjwvY29kZT4uCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgRFRNSXRlcmF0b3IgY3JlYXRlRFRNSXRlcmF0b3IoaW50IHdoYXRUb1Nob3csCisgICAgICAgICAgRFRNRmlsdGVyIGZpbHRlciwgYm9vbGVhbiBlbnRpdHlSZWZlcmVuY2VFeHBhbnNpb24pOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+IHRoYXQgaG9sZHMgZXhhY3RseSBvbmUgbm9kZS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgaGFuZGxlIHRoYXQgdGhlIERUTUl0ZXJhdG9yIHdpbGwgaXRlcmF0ZSB0by4KKyAgICoKKyAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5EVE1JdGVyYXRvcjwvY29kZT4uCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgRFRNSXRlcmF0b3IgY3JlYXRlRFRNSXRlcmF0b3IoaW50IG5vZGUpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHByaXZhdGUgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKgorICAgKiBBdm9pZCByZWFkaW5nIGFsbCB0aGUgZmlsZXMgd2hlbiB0aGUgZmluZEZhY3RvcnkKKyAgICogbWV0aG9kIGlzIGNhbGxlZCB0aGUgc2Vjb25kIHRpbWUgKGNhY2hlIHRoZSByZXN1bHQgb2YKKyAgICogZmluZGluZyB0aGUgZGVmYXVsdCBpbXBsKS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3VuZEZhY3RvcnkgPSBudWxsOworCisgIC8qKgorICAgKiBUZW1wIGRlYnVnIGNvZGUgLSB0aGlzIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciB3ZSB0ZXN0IGV2ZXJ5dGhpbmcKKyAgICovCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWc7CisKKyAgc3RhdGljCisgIHsKKyAgICB0cnkKKyAgICB7CisgICAgICBkZWJ1ZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZHRtLmRlYnVnIikgIT0gbnVsbDsKKyAgICB9CisgICAgY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KXt9CisgIH0KKworICAvKioKKyAgICogUHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBtZXRob2QgLSB3aWxsIGZpbmQgdGhlIGltcGxlbWVudGF0aW9uCisgICAqIGNsYXNzIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIuCisgICAqCisgICAqIEBwYXJhbSBmYWN0b3J5SWQgICBOYW1lIG9mIHRoZSBmYWN0b3J5IGludGVyZmFjZS4KKyAgICogQHBhcmFtIHhtbFByb3BlcnRpZXMgTmFtZSBvZiB0aGUgcHJvcGVydGllcyBmaWxlIGJhc2VkIG9uIEpBVkEvbGliLgorICAgKiBAcGFyYW0gZGVmYXVsdEZhY3RvcnkgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgaWYgbm90aGluZyBlbHNlIGlzIGZvdW5kLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBmYWN0b3J5IGNsYXNzIG5hbWUuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZEZhY3RvcnkoU3RyaW5nIGZhY3RvcnlJZCwgU3RyaW5nIGRlZmF1bHRGYWN0b3J5KQorICB7CisKKyAgICAvLyBVc2UgdGhlIHN5c3RlbSBwcm9wZXJ0eSBmaXJzdAorICAgIHRyeQorICAgIHsKKyAgICAgIFN0cmluZyBzeXN0ZW1Qcm9wID0gbnVsbDsKKworICAgICAgdHJ5CisgICAgICB7CisgICAgICAgIHN5c3RlbVByb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoZmFjdG9yeUlkKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBzZSl7fQorCisgICAgICBpZiAoc3lzdGVtUHJvcCAhPSBudWxsKQorICAgICAgeworICAgICAgICBpZiAoZGVidWcpCisgICAgICAgIHsKKyAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRUTTogZm91bmQgc3lzdGVtIHByb3BlcnR5IiArIHN5c3RlbVByb3ApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN5c3RlbVByb3A7CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBzZSl7fQorCisgICAgaWYgKGZvdW5kRmFjdG9yeSAhPSBudWxsKQorICAgIHsKKyAgICAgIHJldHVybiBmb3VuZEZhY3Rvcnk7CisgICAgfQorCisgICAgLy8gdHJ5IHRvIHJlYWQgZnJvbSAkamF2YS5ob21lL2xpYi9qYXhwLnByb3BlcnRpZXMKKyAgICB0cnkKKyAgICB7CisgICAgICBTdHJpbmcgamF2YWggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOworICAgICAgU3RyaW5nIGNvbmZpZ0ZpbGUgPSBqYXZhaCArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIgKyBGaWxlLnNlcGFyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICArICJqYXhwLnByb3BlcnRpZXMiOworICAgICAgRmlsZSBmID0gbmV3IEZpbGUoY29uZmlnRmlsZSk7CisKKyAgICAgIGlmIChmLmV4aXN0cygpKQorICAgICAgeworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKworICAgICAgICBwcm9wcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oZikpOworCisgICAgICAgIGZvdW5kRmFjdG9yeSA9IHByb3BzLmdldFByb3BlcnR5KGZhY3RvcnlJZCk7CisKKyAgICAgICAgaWYgKGRlYnVnKQorICAgICAgICB7CisgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEVE06IGZvdW5kIGphdmEuaG9tZSBwcm9wZXJ0eSAiICsgZm91bmRGYWN0b3J5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3VuZEZhY3RvcnkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBmb3VuZEZhY3Rvcnk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICB7CisgICAgICBpZiAoZGVidWcpCisgICAgICB7CisgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgfQorICAgIH0KKworICAgIFN0cmluZyBzZXJ2aWNlSWQgPSAiTUVUQS1JTkYvc2VydmljZXMvIiArIGZhY3RvcnlJZDsKKworICAgIC8vIHRyeSB0byBmaW5kIHNlcnZpY2VzIGluIENMQVNTUEFUSAorICAgIHRyeQorICAgIHsKKyAgICAgIENsYXNzTG9hZGVyIGNsID0gRFRNTWFuYWdlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworCisgICAgICBpZiAoY2wgPT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgaXMgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKHNlcnZpY2VJZCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlzID0gY2wuZ2V0UmVzb3VyY2VBc1N0cmVhbShzZXJ2aWNlSWQpOworICAgICAgfQorCisgICAgICBpZiAoaXMgIT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgaWYgKGRlYnVnKQorICAgICAgICB7CisgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEVE06IGZvdW5kICAiICsgc2VydmljZUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJkID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOworCisgICAgICAgIGZvdW5kRmFjdG9yeSA9IHJkLnJlYWRMaW5lKCk7CisKKyAgICAgICAgcmQuY2xvc2UoKTsKKworICAgICAgICBpZiAoZGVidWcpCisgICAgICAgIHsKKyAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRUTTogbG9hZGVkIGZyb20gc2VydmljZXM6ICIgKyBmb3VuZEZhY3RvcnkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChmb3VuZEZhY3RvcnkgIT0gbnVsbCkgJiYhIiIuZXF1YWxzKGZvdW5kRmFjdG9yeSkpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gZm91bmRGYWN0b3J5OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgeworICAgICAgaWYgKGRlYnVnKQorICAgICAgeworICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZGVmYXVsdEZhY3Rvcnk7CisgIH0KKworICAvKiogJVRCRCUgRG9jICovCisgIHN0YXRpYyBmaW5hbCBpbnQgSURFTlRfRFRNX0RFRkFVTFQgPSAweEZGRjAwMDAwOworCisgIC8qKiAlVEJEJSBEb2MgKi8KKyAgc3RhdGljIGZpbmFsIGludCBJREVOVF9OT0RFX0RFRkFVTFQgPSAweDAwMEZGRkZGOworCisgIC8qKgorICAgKiAlVEJEJSBEb2MKKyAgICoKKyAgICogTkVFRFNET0MgQHBhcmFtIGR0bQorICAgKgorICAgKiBORUVEU0RPQyAoJG9iamVjdE5hbWUkKSBAcmV0dXJuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldERUTUlkZW50aXR5KERUTSBkdG0pOworCisgIC8qKgorICAgKiAlVEJEJSBEb2MKKyAgICoKKyAgICogTkVFRFNET0MgKCRvYmplY3ROYW1lJCkgQHJldHVybgorICAgKi8KKyAgcHVibGljIGludCBnZXREVE1JZGVudGl0eU1hc2soKQorICB7CisgICAgcmV0dXJuIElERU5UX0RUTV9ERUZBVUxUOworICB9CisKKyAgLyoqCisgICAqICVUQkQlIERvYworICAgKgorICAgKiBORUVEU0RPQyAoJG9iamVjdE5hbWUkKSBAcmV0dXJuCisgICAqLworICBwdWJsaWMgaW50IGdldE5vZGVJZGVudGl0eU1hc2soKQorICB7CisgICAgcmV0dXJuIElERU5UX05PREVfREVGQVVMVDsKKyAgfQorCisgIC8qKgorICAgKiByZXR1cm4gdGhlIGV4cGFuZGVkIG5hbWUgdGFibGUuCisgICAqCisgICAqIE5FRURTRE9DIEBwYXJhbSBkdG0KKyAgICoKKyAgICogTkVFRFNET0MgKCRvYmplY3ROYW1lJCkgQHJldHVybgorICAgKi8KKyAgcHVibGljIEV4cGFuZGVkTmFtZVRhYmxlIGdldEV4cGFuZGVkTmFtZVRhYmxlKERUTSBkdG0pCisgIHsKKyAgICByZXR1cm4gbV9leHBhbmRlZE5hbWVUYWJsZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9EVE1NYW5hZ2VyRGVmYXVsdC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9EVE1NYW5hZ2VyRGVmYXVsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMGVlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTU1hbmFnZXJEZWZhdWx0LmphdmEKQEAgLTAsMCArMSw2NTYgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCisgKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vIEpBWFAgMS4xCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZUxvY2F0b3I7CisKKy8vIEFwYWNoZSBYTUwgVXRpbGl0aWVzCitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUHJlZml4UmVzb2x2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuU3lzdGVtSURSZXNvbHZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uZG9tMmR0bS5ET00yRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5zYXgyZHRtLlNBWDJEVE07CisKKy8vIFczQyBET00KK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCisvLyBTQVgyCitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTFJlYWRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmdGYWN0b3J5OworCisvKioKKyAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0aGUgRFRNTWFuYWdlci4KKyAqLworcHVibGljIGNsYXNzIERUTU1hbmFnZXJEZWZhdWx0IGV4dGVuZHMgRFRNTWFuYWdlcgoreworCisgIC8qKiBORUVEU0RPQyBGaWVsZCBtX2R0bXMgKi8KKyAgcHJvdGVjdGVkIFZlY3RvciBtX2R0bXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIERUTU1hbmFnZXJEZWZhdWx0CisgICAqCisgICAqLworICBwdWJsaWMgRFRNTWFuYWdlckRlZmF1bHQoKXt9CisKKyAgLyoqIFNldCB0aGlzIHRvIHRydWUgaWYgeW91IHdhbnQgYSBkdW1wIG9mIHRoZSBEVE0gYWZ0ZXIgY3JlYXRpb24uICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRFVNUFRSRUUgPSBmYWxzZTsKKyAgCisgIC8qKiBTZXQgdGhpcyB0byB0cnVlIGlmIHlvdSB3YW50IGEgYmFzaWMgZGlhZ25vc3RpY3MuICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAvKioKKyAgICogR2V0IGFuIGluc3RhbmNlIG9mIGEgRFRNLCBsb2FkZWQgd2l0aCB0aGUgY29udGVudCBmcm9tIHRoZQorICAgKiBzcGVjaWZpZWQgc291cmNlLiAgSWYgdGhlIHVuaXF1ZSBmbGFnIGlzIHRydWUsIGEgbmV3IGluc3RhbmNlIHdpbGwKKyAgICogYWx3YXlzIGJlIHJldHVybmVkLiAgT3RoZXJ3aXNlIGl0IGlzIHVwIHRvIHRoZSBEVE1NYW5hZ2VyIHRvIHJldHVybiBhCisgICAqIG5ldyBpbnN0YW5jZSBvciBhbiBpbnN0YW5jZSB0aGF0IGl0IGFscmVhZHkgY3JlYXRlZCBhbmQgbWF5IGJlIGJlaW5nIHVzZWQKKyAgICogYnkgc29tZW9uZSBlbHNlLgorICAgKiAoSSB0aGluayBtb3JlIHBhcmFtZXRlcnMgd2lsbCBuZWVkIHRvIGJlIGFkZGVkIGZvciBlcnJvciBoYW5kbGluZywgYW5kIGVudGl0eQorICAgKiByZXNvbHV0aW9uKS4KKyAgICoKKyAgICogQHBhcmFtIHNvdXJjZSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc291cmNlIG9iamVjdC4KKyAgICogQHBhcmFtIHVuaXF1ZSB0cnVlIGlmIHRoZSByZXR1cm5lZCBEVE0gbXVzdCBiZSB1bmlxdWUsIHByb2JhYmx5IGJlY2F1c2UgaXQKKyAgICogaXMgZ29pbmcgdG8gYmUgbXV0YXRlZC4KKyAgICogQHBhcmFtIHdoaXRlU3BhY2VGaWx0ZXIgRW5hYmxlcyBmaWx0ZXJpbmcgb2Ygd2hpdGVzcGFjZSBub2RlcywgYW5kIG1heQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBudWxsLgorICAgKiBAcGFyYW0gaW5jcmVtZW50YWwgdHJ1ZSBpZiB0aGUgRFRNIHNob3VsZCBiZSBidWlsdCBpbmNyZW1lbnRhbGx5LCBpZgorICAgKiAgICAgICAgICAgICAgICAgICAgcG9zc2libGUuCisgICAqCisgICAqIEByZXR1cm4gYSBub24tbnVsbCBEVE0gcmVmZXJlbmNlLgorICAgKi8KKyAgcHVibGljIERUTSBnZXREVE0oU291cmNlIHNvdXJjZSwgYm9vbGVhbiB1bmlxdWUsCisgICAgICAgICAgICAgICAgICAgIERUTVdTRmlsdGVyIHdoaXRlU3BhY2VGaWx0ZXIsIGJvb2xlYW4gaW5jcmVtZW50YWwpCisgIHsKKyAgICBpZihERUJVRyAmJiBudWxsICE9IHNvdXJjZSkKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgc291cmNlOiAiK3NvdXJjZS5nZXRTeXN0ZW1JZCgpKTsKKyAgICBYTUxTdHJpbmdGYWN0b3J5IHhzdHJpbmdGYWN0b3J5ID0gbV94c2Y7CisgICAgaW50IGRvY3VtZW50SUQgPSBtX2R0bXMuc2l6ZSgpIDw8IDIwOworCisgICAgaWYgKChudWxsICE9IHNvdXJjZSkgJiYgc291cmNlIGluc3RhbmNlb2YgRE9NU291cmNlKQorICAgIHsKKyAgICAgIERPTTJEVE0gZHRtID0gbmV3IERPTTJEVE0odGhpcywgKERPTVNvdXJjZSkgc291cmNlLCBkb2N1bWVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlRmlsdGVyLCB4c3RyaW5nRmFjdG9yeSk7CisKKyAgICAgIG1fZHRtcy5hZGQoZHRtKTsKKworICAgICAgaWYgKERVTVBUUkVFKQorICAgICAgeworICAgICAgICBkdG0uZHVtcERUTSgpOworICAgICAgfQorCisgICAgICByZXR1cm4gZHRtOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYm9vbGVhbiBpc1NBWFNvdXJjZSA9IChudWxsICE9IHNvdXJjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChzb3VyY2UgaW5zdGFuY2VvZiBTQVhTb3VyY2UpIDogdHJ1ZTsKKyAgICAgIGJvb2xlYW4gaXNTdHJlYW1Tb3VyY2UgPSAobnVsbCAhPSBzb3VyY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoc291cmNlIGluc3RhbmNlb2YgU3RyZWFtU291cmNlKSA6IGZhbHNlOworCisgICAgICBpZiAoaXNTQVhTb3VyY2UgfHwgaXNTdHJlYW1Tb3VyY2UpCisgICAgICB7CisgICAgICAgIFhNTFJlYWRlciByZWFkZXI7CisgICAgICAgIElucHV0U291cmNlIHhtbFNvdXJjZTsKKworICAgICAgICBpZiAobnVsbCA9PSBzb3VyY2UpCisgICAgICAgIHsKKyAgICAgICAgICB4bWxTb3VyY2UgPSBudWxsOworICAgICAgICAgIHJlYWRlciA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcmVhZGVyID0gZ2V0WE1MUmVhZGVyKHNvdXJjZSk7CisgICAgICAgICAgeG1sU291cmNlID0gU0FYU291cmNlLnNvdXJjZVRvSW5wdXRTb3VyY2Uoc291cmNlKTsKKworICAgICAgICAgIFN0cmluZyB1cmxPZlNvdXJjZSA9IHhtbFNvdXJjZS5nZXRTeXN0ZW1JZCgpOworCisgICAgICAgICAgaWYgKG51bGwgIT0gdXJsT2ZTb3VyY2UpCisgICAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHVybE9mU291cmNlID0gU3lzdGVtSURSZXNvbHZlci5nZXRBYnNvbHV0ZVVSSSh1cmxPZlNvdXJjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgLy8gJVJFVklFVyUgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIHNlbmQgYSB3YXJuaW5nPworICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbiBub3QgYWJzb2x1dGl6ZSBVUkw6ICIgKyB1cmxPZlNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHhtbFNvdXJjZS5zZXRTeXN0ZW1JZCh1cmxPZlNvdXJjZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBiYXNpYyBTQVgyRFRNLgorICAgICAgICBTQVgyRFRNIGR0bSA9IG5ldyBTQVgyRFRNKHRoaXMsIHNvdXJjZSwgZG9jdW1lbnRJRCwgd2hpdGVTcGFjZUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RyaW5nRmFjdG9yeSk7CisKKyAgICAgICAgLy8gR28gYWhlYWQgYW5kIGFkZCB0aGUgRFRNIHRvIHRoZSBsb29rdXAgdGFibGUuICBUaGlzIG5lZWRzIHRvIGJlIAorICAgICAgICAvLyBkb25lIGJlZm9yZSBhbnkgcGFyc2luZyBvY2N1cnMuCisgICAgICAgIG1fZHRtcy5hZGQoZHRtKTsKKworICAgICAgICBib29sZWFuIGhhdmVYZXJjZXNQYXJzZXIgPQorICAgICAgICAgIChudWxsICE9IHJlYWRlcikKKyAgICAgICAgICAmJiAocmVhZGVyIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIpOworCisgICAgICAgIGlmIChoYXZlWGVyY2VzUGFyc2VyKQorICAgICAgICAgIGluY3JlbWVudGFsID0gdHJ1ZTsgIC8vIE5vIG1hdHRlciB3aGF0LiAgJVJFVklFVyUKKworICAgICAgICBpZiAoaW5jcmVtZW50YWwpCisgICAgICAgIHsKKworICAgICAgICAgIC8vIENyZWF0ZSBhIENvcm91dGluZU1hbmFnZXIgdG8gbWFuYWdlIHRoZSBjb29yZGluYXRpb24gYmV0d2VlbiB0aGUgCisgICAgICAgICAgLy8gcGFyc2VyIGFuZCB0aGUgdHJhbnNmb3JtYXRpb24uICBUaGlzIHdpbGwgInRocm90dGxlIiBiZXR3ZWVuIAorICAgICAgICAgIC8vIHRoZSBwYXJzZXIgYW5kIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLgorICAgICAgICAgIENvcm91dGluZU1hbmFnZXIgY29yb3V0aW5lTWFuYWdlciA9IG5ldyBDb3JvdXRpbmVNYW5hZ2VyKCk7CisKKyAgICAgICAgICAvLyBDcmVhdGUgYW4gQ29Sb3V0aW5lIElEIGZvciB0aGUgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAgaW50IGFwcENvcm91dGluZSA9IGNvcm91dGluZU1hbmFnZXIuY29fam9pbkNvcm91dGluZVNldCgtMSk7CisgICAgICAgICAgQ29yb3V0aW5lUGFyc2VyIGNvUGFyc2VyOworCisgICAgICAgICAgaWYgKGhhdmVYZXJjZXNQYXJzZXIpCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gQ29yb3V0aW5lU0FYUGFyc2VyX1hlcmNlcyB0byBhdm9pZCB0aHJlYWRpbmcuCisgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVzaW5nIENvcm91dGluZVNBWFBhcnNlcl9YZXJjZXMgdG8gYXZvaWQgdGhyZWFkaW5nIik7CisgICAgICAgICAgICBjb1BhcnNlciA9IG5ldyBDb3JvdXRpbmVTQVhQYXJzZXJfWGVyY2VzKAorICAgICAgICAgICAgICAob3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIpIHJlYWRlciwgY29yb3V0aW5lTWFuYWdlciwKKyAgICAgICAgICAgICAgYXBwQ29yb3V0aW5lKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIENvcm91dGluZVNBWFBhcnNlciB0aGF0IHdpbGwgcnVuIG9uIHRoZSBzZWNvbmRhcnkgdGhyZWFkLgorICAgICAgICAgICAgaWYgKG51bGwgPT0gcmVhZGVyKQorICAgICAgICAgICAgICBjb1BhcnNlciA9IG5ldyBDb3JvdXRpbmVTQVhQYXJzZXIoY29yb3V0aW5lTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcENvcm91dGluZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGNvUGFyc2VyID0gbmV3IENvcm91dGluZVNBWFBhcnNlcihjb3JvdXRpbmVNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwQ29yb3V0aW5lLCByZWFkZXIpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIEhhdmUgdGhlIERUTSBzZXQgaXRzZWxmIHVwIGFzIHRoZSBDb3JvdXRpbmVTQVhQYXJzZXIncyBsaXN0ZW5lci4KKyAgICAgICAgICBkdG0uc2V0Q29yb3V0aW5lUGFyc2VyKGNvUGFyc2VyLCBhcHBDb3JvdXRpbmUpOworCisgICAgICAgICAgLy8gR2V0IHRoZSBwYXJzZXIncyBDb1JvdXRpbmUgSUQuCisgICAgICAgICAgaW50IHBhcnNlckNvcm91dGluZSA9IGNvUGFyc2VyLmdldFBhcnNlckNvcm91dGluZUlEKCk7CisKKyAgICAgICAgICBpZiAobnVsbCA9PSB4bWxTb3VyY2UpCisgICAgICAgICAgeworCisgICAgICAgICAgICAvLyBUaGVuIHRoZSB1c2VyIHdpbGwgY29uc3RydWN0IGl0IHRoZW1zZWx2ZXMuCisgICAgICAgICAgICByZXR1cm4gZHRtOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicGFyc2VyQ29yb3V0aW5lIChtZ3IpOiAiK3BhcnNlckNvcm91dGluZSk7CisgICAgICAgICAgLy8gJVRCRCUgIEl0J3MgcHJvYmFibHkgT0sgdG8gaGF2ZSB0aGVzZSBieXBhc3MgdGhlIENvUm91dGluZSBzdHVmZj8/CisgICAgICAgICAgLy8gT3IgbWF5YmUgbm90PworICAgICAgICAgIC8vIC4uLiBEZXBlbmRzIG9uIGhvdyBicm9rZW4gd2lsbCB0aGluZ3MgZ2V0IGlmIHRoZXkgb2NjdXIgYXQgdGhlIHNhbWUKKyAgICAgICAgICAvLyB0aW1lIHRoYXQgc29tZW9uZSBpcyB0cnlpbmcgdG8gcmVhZCB0aGUgRFRNIG1vZGVsLiBJJ2Qgc3VnZ2VzdCB0aGF0CisgICAgICAgICAgLy8gd2UgaW5zdGVhZCBleHRlbmQgQ29yb3V0aW5lUGFyc2VyIHRvIGhhbmRsZSB0aGVzZSwgYW5kIGxldCBpdAorICAgICAgICAgIC8vIHBhc3MgdGhlIHJlZ2lzdHJhdGlvbiB0aHJvdWdoIHRvIHRoZSByZWFkZXIgaWYgdGhhdCdzIHRoZSBSaWdodCBUaG5nCisgICAgICAgICAgcmVhZGVyLnNldERUREhhbmRsZXIoZHRtKTsKKyAgICAgICAgICByZWFkZXIuc2V0RXJyb3JIYW5kbGVyKGR0bSk7CisKKyAgICAgICAgICB0cnkKKyAgICAgICAgICB7CisKKyAgICAgICAgICAgIC8vICVSRVZJRVclIENvbnNpZGVyIG1ha2luZyBjb1BhcnNlciBqdXN0IGJlIGEgdGhyb3R0bGluZyBmaWx0ZXIKKyAgICAgICAgICAgIE9iamVjdCBnb3RNb3JlID0gY29QYXJzZXIuZG9QYXJzZSh4bWxTb3VyY2UsIGFwcENvcm91dGluZSk7CisKKyAgICAgICAgICAgIGlmIChnb3RNb3JlIGluc3RhbmNlb2YgRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkdG0uY2xlYXJDb1JvdXRpbmUoKTsKKworICAgICAgICAgICAgICB0aHJvdyAoKEV4Y2VwdGlvbikgZ290TW9yZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChnb3RNb3JlICE9IEJvb2xlYW4uVFJVRSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAvLyAlUkVWSUVXJSBDb25zaWRlciBoYXZpbmcgY29QYXJzZXIgc2VsZi10ZXJtaW5hdGUgYXQgZW5kIG9mIGZpbGUuCisgICAgICAgICAgICAgIGR0bS5jbGVhckNvUm91dGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkKKyAgICAgICAgICB7CisKKyAgICAgICAgICAgIC8vIGNvcm91dGluZU1hbmFnZXIuY29fZXhpdChhcHBDb3JvdXRpbmUpOworICAgICAgICAgICAgZHRtLmNsZWFyQ29Sb3V0aW5lKCk7CisKKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgeworCisgICAgICAgICAgICAvLyBjb3JvdXRpbmVNYW5hZ2VyLmNvX2V4aXQoYXBwQ29yb3V0aW5lKTsKKyAgICAgICAgICAgIGR0bS5jbGVhckNvUm91dGluZSgpOworCisgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS54bWwudXRpbHMuV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChudWxsID09IHJlYWRlcikKKyAgICAgICAgICB7CisKKyAgICAgICAgICAgIC8vIFRoZW4gdGhlIHVzZXIgd2lsbCBjb25zdHJ1Y3QgaXQgdGhlbXNlbHZlcy4KKyAgICAgICAgICAgIHJldHVybiBkdG07CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gbm90IGluY3JlbWVudGFsCisgICAgICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGR0bSk7CisgICAgICAgICAgcmVhZGVyLnNldERUREhhbmRsZXIoZHRtKTsKKyAgICAgICAgICByZWFkZXIuc2V0RXJyb3JIYW5kbGVyKGR0bSk7CisKKyAgICAgICAgICB0cnkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZWFkZXIuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCBkdG0pOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKXt9CisgICAgICAgICAgY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKXt9CisKKyAgICAgICAgICB0cnkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZWFkZXIucGFyc2UoeG1sU291cmNlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpCisgICAgICAgICAgeworCisgICAgICAgICAgICAvLyBjb3JvdXRpbmVNYW5hZ2VyLmNvX2V4aXQoYXBwQ29yb3V0aW5lKTsKKyAgICAgICAgICAgIGR0bS5jbGVhckNvUm91dGluZSgpOworCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgIHsKKworICAgICAgICAgICAgLy8gY29yb3V0aW5lTWFuYWdlci5jb19leGl0KGFwcENvcm91dGluZSk7CisgICAgICAgICAgICBkdG0uY2xlYXJDb1JvdXRpbmUoKTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUueG1sLnV0aWxzLldyYXBwZWRSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChEVU1QVFJFRSkKKyAgICAgICAgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRHVtcGluZyBTQVgyRE9NIik7CisgICAgICAgICAgZHRtLmR1bXBEVE0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkdG07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisKKyAgICAgICAgLy8gSXQgc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGJ5IGEgZGVyaXZlZCBjbGFzcyBvciB0aGUgY2FsbGVyIAorICAgICAgICAvLyBtYWRlIGEgbWlzdGFrZS4KKyAgICAgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZDogIiArIHNvdXJjZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGEgVzNDIERPTSBub2RlLCB0cnkgYW5kIHJldHVybiBhIERUTSBoYW5kbGUuCisgICAqIE5vdGU6IGNhbGxpbmcgdGhpcyBtYXkgYmUgbm9uLW9wdGltYWwsIGFuZCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAorICAgKiB0aGUgbm9kZSB3aWxsIGJlIGZvdW5kIGluIGFueSBwYXJ0aWN1bGFyIERUTS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGUgTm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgRE9NIG5vZGUuCisgICAqCisgICAqIEByZXR1cm4gYSB2YWxpZCBEVE0gaGFuZGxlLgorICAgKi8KKyAgcHVibGljIGludCBnZXREVE1IYW5kbGVGcm9tTm9kZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpCisgIHsKKworICAgIGlmIChub2RlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS54bWwuZHRtLkRUTU5vZGVQcm94eSkKKyAgICAgIHJldHVybiAoKG9yZy5hcGFjaGUueG1sLmR0bS5EVE1Ob2RlUHJveHkpIG5vZGUpLmdldERUTU5vZGVOdW1iZXIoKTsKKyAgICBlbHNlCisgICAgeworICAgICAgLy8gRmluZCB0aGUgRE9NMkRUTXMgd3JhcHBlZCBhcm91bmQgdGhpcyBEb2N1bWVudCAoaWYgYW55KQorICAgICAgLy8gYW5kIGNoZWNrIHdoZXRoZXIgdGhleSBjb250YWluIHRoZSBOb2RlIGluIHF1ZXN0aW9uLgorICAgICAgLy8KKyAgICAgIC8vIE5PVEUgdGhhdCBzaW5jZSBhIERPTTJEVE0gbWF5IHJlcHJlc2VudCBhIHN1YnRyZWUgcmF0aGVyCisgICAgICAvLyB0aGFuIGEgZnVsbCBkb2N1bWVudCwgd2UgaGF2ZSB0byBiZSBwcmVwYXJlZCB0byBjaGVjayBtb3JlCisgICAgICAvLyB0aGFuIG9uZSAtLSBhbmQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgd2Ugd2lsbCBmaW5kIAorICAgICAgLy8gb25lIHRoYXQgY29udGFpbnMgYW5jZXN0b3JzIG9yIHNpYmxpbmdzIG9mIHRoZSBub2RlIHdlJ3JlCisgICAgICAvLyBzZWVraW5nLgorICAgICAgLy8KKyAgICAgIC8vICVSRVZJRVclIFdlIGNvdWxkIHNlYXJjaCBmb3IgdGhlIG9uZSB3aGljaCBjb250YWlucyB0aGlzCisgICAgICAvLyBub2RlIGF0IHRoZSBkZWVwZXN0IGxldmVsLCBhbmQgdGh1cyBjb3ZlcnMgdGhlIHdpZGVzdAorICAgICAgLy8gc3VidHJlZSwgYnV0IHRoYXQncyBnb2luZyB0byBlbnRhaWwgYWRkaXRpb25hbCB3b3JrCisgICAgICAvLyBjaGVja2luZyBtb3JlIERUTXMuLi4gYW5kIGdldEhhbmRsZUZyb21Ob2RlIGlzIG5vdCBhCisgICAgICAvLyBjaGVhcCBvcGVyYXRpb24gaW4gbW9zdCBpbXBsZW1lbnRhdGlvbnMuCisgICAgICBmb3IoaW50IGk9bV9kdG1zLnNpemUoKS0xO2k+PTA7LS1pKQorCXsKKwkgIERUTSB0aGlzRFRNPShEVE0pbV9kdG1zLmVsZW1lbnRBdChpKTsKKwkgIGlmKHRoaXNEVE0gaW5zdGFuY2VvZiBET00yRFRNKQorCSAgICB7CisJICAgICAgaW50IGhhbmRsZT0oKERPTTJEVE0pdGhpc0RUTSkuZ2V0SGFuZGxlT2ZOb2RlKG5vZGUpOworCSAgICAgIGlmKGhhbmRsZSE9RFRNLk5VTEwpIHJldHVybiBoYW5kbGU7CisJICAgIH0KKwl9CisgICAgICAKKyAgICAgIC8vIEZhbGxiYWNrOiBOb3QgZm91bmQgaW4gb25lIHdlIGtub3cgaG93IHRvIHNlYXJjaC4KKyAgICAgIC8vIEN1cnJlbnQgc29sdXRpb246IEdlbmVyYXRlIGEgbmV3IERPTTJEVE0gd2l0aCB0aGlzIG5vZGUgYXMgcm9vdC4KKyAgICAgIC8vICVSRVZJRVclIE1heWJlIHRoZSBiZXN0IEkgY2FuIGRvPz8KKyAgICAgIERUTSBkdG0gPSBnZXREVE0obmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZShub2RlKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRydWUpOworCisgICAgICByZXR1cm4gZHRtLmdldERvY3VtZW50KCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIFNBWDIgcGFyc2VyIHRvIHVzZSB3aXRoIHRoZSBJbnB1dFNvdXJjZQorICAgKiBvYnRhaW5lZCBmcm9tIHRoaXMgVVJJLgorICAgKiBJdCBtYXkgcmV0dXJuIG51bGwgaWYgYW55IFNBWDItY29uZm9ybWFudCBYTUwgcGFyc2VyIGNhbiBiZSB1c2VkLAorICAgKiBvciBpZiBnZXRJbnB1dFNvdXJjZSgpIHdpbGwgYWxzbyByZXR1cm4gbnVsbC4gVGhlIHBhcnNlciBtdXN0CisgICAqIGJlIGZyZWUgZm9yIHVzZSAoaS5lLgorICAgKiBub3QgY3VycmVudGx5IGluIHVzZSBmb3IgYW5vdGhlciBwYXJzZSgpLgorICAgKgorICAgKiBAcGFyYW0gaW5wdXRTb3VyY2UgVGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIFVSSVJlc29sdmVyLgorICAgKiBAcmV0dXJucyBhIFNBWDIgWE1MUmVhZGVyIHRvIHVzZSB0byByZXNvbHZlIHRoZSBpbnB1dFNvdXJjZSBhcmd1bWVudC4KKyAgICoKKyAgICogQHJldHVybiBub24tbnVsbCBYTUxSZWFkZXIgcmVmZXJlbmNlIHJlYWR5IHRvIHBhcnNlLgorICAgKi8KKyAgcHVibGljIFhNTFJlYWRlciBnZXRYTUxSZWFkZXIoU291cmNlIGlucHV0U291cmNlKQorICB7CisKKyAgICB0cnkKKyAgICB7CisgICAgICBYTUxSZWFkZXIgcmVhZGVyID0gKGlucHV0U291cmNlIGluc3RhbmNlb2YgU0FYU291cmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgID8gKChTQVhTb3VyY2UpIGlucHV0U291cmNlKS5nZXRYTUxSZWFkZXIoKSA6IG51bGw7CisKKyAgICAgIGlmIChudWxsID09IHJlYWRlcikKKyAgICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPQorICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciBqYXhwUGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKKworICAgICAgICAgIHJlYWRlciA9IGpheHBQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBleDEpCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKGV4MS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZXgyKXt9CisgICAgICAgIGNhdGNoIChBYnN0cmFjdE1ldGhvZEVycm9yIGFtZSl7fQorCisgICAgICAgIGlmIChudWxsID09IHJlYWRlcikKKyAgICAgICAgICByZWFkZXIgPSBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOworICAgICAgfQorCisgICAgICB0cnkKKyAgICAgIHsKKyAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gc2UpCisgICAgICB7CisKKyAgICAgICAgLy8gV2hhdCBjYW4gd2UgZG8/CisgICAgICAgIC8vIFRPRE86IFVzZXIgZGlhZ25vc3RpY3MuCisgICAgICB9CisKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vZHluYW1pYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgfQorICAgICAgY2F0Y2ggKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzZSkKKyAgICAgIHsKKworICAgICAgICAvLyBXaGF0IGNhbiB3ZSBkbz8KKyAgICAgICAgLy8gVE9ETzogVXNlciBkaWFnbm9zdGljcy4KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlYWRlcjsKKyAgICB9CisgICAgY2F0Y2ggKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBzZSkKKyAgICB7CisgICAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKHNlLmdldE1lc3NhZ2UoKSwgc2UpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBORUVEU0RPQyBNZXRob2QgZ2V0RFRNCisgICAqCisgICAqCisgICAqIE5FRURTRE9DIEBwYXJhbSBub2RlSGFuZGxlCisgICAqCisgICAqIE5FRURTRE9DIChnZXREVE0pIEByZXR1cm4KKyAgICovCisgIHB1YmxpYyBEVE0gZ2V0RFRNKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICAvLyBQZXJmb3JtYW5jZSBjcml0aWNhbCBmdW5jdGlvbi4KKyAgICByZXR1cm4gKERUTSkgbV9kdG1zLmVsZW1lbnRBdChub2RlSGFuZGxlID4+IDIwKTsKKyAgfQorCisgIC8qKgorICAgKiBORUVEU0RPQyBNZXRob2QgZ2V0RFRNSWRlbnRpdHkKKyAgICoKKyAgICoKKyAgICogTkVFRFNET0MgQHBhcmFtIGR0bQorICAgKgorICAgKiBORUVEU0RPQyAoZ2V0RFRNSWRlbnRpdHkpIEByZXR1cm4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0RFRNSWRlbnRpdHkoRFRNIGR0bSkKKyAgeworCisgICAgLy8gQSBiYWNrd2FyZHMgc2VhcmNoIHNob3VsZCBub3JtYWxseSBiZSB0aGUgZmFzdGVzdC4KKyAgICBpbnQgbiA9IG1fZHRtcy5zaXplKCk7CisKKyAgICBmb3IgKGludCBpID0gKG4gLSAxKTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgRFRNIHRkdG0gPSAoRFRNKSBtX2R0bXMuZWxlbWVudEF0KGkpOworCisgICAgICBpZiAodGR0bSA9PSBkdG0pCisgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qKgorICAgKiBORUVEU0RPQyBNZXRob2QgcmVsZWFzZQorICAgKgorICAgKgorICAgKiBORUVEU0RPQyBAcGFyYW0gZHRtCisgICAqIE5FRURTRE9DIEBwYXJhbSBzaG91bGRIYXJkRGVsZXRlCisgICAqCisgICAqIE5FRURTRE9DIChyZWxlYXNlKSBAcmV0dXJuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiByZWxlYXNlKERUTSBkdG0sIGJvb2xlYW4gc2hvdWxkSGFyZERlbGV0ZSkKKyAgeworCisgICAgaWYgKGR0bSBpbnN0YW5jZW9mIFNBWDJEVE0pCisgICAgeworICAgICAgKChTQVgyRFRNKSBkdG0pLmNsZWFyQ29Sb3V0aW5lKCk7CisgICAgfQorCisgICAgaW50IGkgPSBnZXREVE1JZGVudGl0eShkdG0pOworCisgICAgLy8gJVRCRCUgUmVjb3ZlciBzcGFjZS4KKyAgICBpZiAoaSA+PSAwKQorICAgIHsKKyAgICAgIG1fZHRtcy5zZXRFbGVtZW50QXQobnVsbCwgaSk7CisgICAgfQorCisgICAgLyoqIEB0b2RvOiBpbXBsZW1lbnQgdGhpcyBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNTWFuYWdlciBhYnN0cmFjdCBtZXRob2QgKi8KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBNZXRob2QgY3JlYXRlRG9jdW1lbnRGcmFnbWVudAorICAgKgorICAgKgorICAgKiBORUVEU0RPQyAoY3JlYXRlRG9jdW1lbnRGcmFnbWVudCkgQHJldHVybgorICAgKi8KKyAgcHVibGljIERUTSBjcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKKyAgeworCisgICAgdHJ5CisgICAgeworICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgRG9jdW1lbnQgZG9jID0gZGIubmV3RG9jdW1lbnQoKTsKKyAgICAgIE5vZGUgZGYgPSBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOworCisgICAgICByZXR1cm4gZ2V0RFRNKG5ldyBET01Tb3VyY2UoZGYpLCB0cnVlLCBudWxsLCBmYWxzZSk7CisgICAgfQorICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICB7CisgICAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBORUVEU0RPQyBNZXRob2QgY3JlYXRlRFRNSXRlcmF0b3IKKyAgICoKKyAgICoKKyAgICogTkVFRFNET0MgQHBhcmFtIHdoYXRUb1Nob3cKKyAgICogTkVFRFNET0MgQHBhcmFtIGZpbHRlcgorICAgKiBORUVEU0RPQyBAcGFyYW0gZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uCisgICAqCisgICAqIE5FRURTRE9DIChjcmVhdGVEVE1JdGVyYXRvcikgQHJldHVybgorICAgKi8KKyAgcHVibGljIERUTUl0ZXJhdG9yIGNyZWF0ZURUTUl0ZXJhdG9yKGludCB3aGF0VG9TaG93LCBEVE1GaWx0ZXIgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBlbnRpdHlSZWZlcmVuY2VFeHBhbnNpb24pCisgIHsKKworICAgIC8qKiBAdG9kbzogaW1wbGVtZW50IHRoaXMgb3JnLmFwYWNoZS54bWwuZHRtLkRUTU1hbmFnZXIgYWJzdHJhY3QgbWV0aG9kICovCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogTkVFRFNET0MgTWV0aG9kIGNyZWF0ZURUTUl0ZXJhdG9yCisgICAqCisgICAqCisgICAqIE5FRURTRE9DIEBwYXJhbSB4cGF0aFN0cmluZworICAgKiBORUVEU0RPQyBAcGFyYW0gcHJlc29sdmVyCisgICAqCisgICAqIE5FRURTRE9DIChjcmVhdGVEVE1JdGVyYXRvcikgQHJldHVybgorICAgKi8KKyAgcHVibGljIERUTUl0ZXJhdG9yIGNyZWF0ZURUTUl0ZXJhdG9yKFN0cmluZyB4cGF0aFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWZpeFJlc29sdmVyIHByZXNvbHZlcikKKyAgeworCisgICAgLyoqIEB0b2RvOiBpbXBsZW1lbnQgdGhpcyBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNTWFuYWdlciBhYnN0cmFjdCBtZXRob2QgKi8KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBORUVEU0RPQyBNZXRob2QgY3JlYXRlRFRNSXRlcmF0b3IKKyAgICoKKyAgICoKKyAgICogTkVFRFNET0MgQHBhcmFtIG5vZGUKKyAgICoKKyAgICogTkVFRFNET0MgKGNyZWF0ZURUTUl0ZXJhdG9yKSBAcmV0dXJuCisgICAqLworICBwdWJsaWMgRFRNSXRlcmF0b3IgY3JlYXRlRFRNSXRlcmF0b3IoaW50IG5vZGUpCisgIHsKKworICAgIC8qKiBAdG9kbzogaW1wbGVtZW50IHRoaXMgb3JnLmFwYWNoZS54bWwuZHRtLkRUTU1hbmFnZXIgYWJzdHJhY3QgbWV0aG9kICovCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogTkVFRFNET0MgTWV0aG9kIGNyZWF0ZURUTUl0ZXJhdG9yCisgICAqCisgICAqCisgICAqIE5FRURTRE9DIEBwYXJhbSB4cGF0aENvbXBpbGVyCisgICAqIE5FRURTRE9DIEBwYXJhbSBwb3MKKyAgICoKKyAgICogTkVFRFNET0MgKGNyZWF0ZURUTUl0ZXJhdG9yKSBAcmV0dXJuCisgICAqLworICBwdWJsaWMgRFRNSXRlcmF0b3IgY3JlYXRlRFRNSXRlcmF0b3IoT2JqZWN0IHhwYXRoQ29tcGlsZXIsIGludCBwb3MpCisgIHsKKworICAgIC8qKiBAdG9kbzogaW1wbGVtZW50IHRoaXMgb3JnLmFwYWNoZS54bWwuZHRtLkRUTU1hbmFnZXIgYWJzdHJhY3QgbWV0aG9kICovCisgICAgcmV0dXJuIG51bGw7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNTmFtZWROb2RlTWFwLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTU5hbWVkTm9kZU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzQzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTU5hbWVkTm9kZU1hcC5qYXZhCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKKyAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKKyAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cworICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5kdG07CisKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KKyAqIERUTU5hbWVkTm9kZU1hcCBpcyBhIHF1aWNraWUgKGFzIG9wcG9zZWQgdG8gcXVpY2spIGltcGxlbWVudGF0aW9uIG9mIHRoZSBET00ncworICogTmFtZWROb2RlTWFwIGludGVyZmFjZSwgaW50ZW5kZWQgdG8gc3VwcG9ydCBEVE1Qcm94eSdzIGdldEF0dHJpYnV0ZXMoKQorICogY2FsbC4KKyAqIDxwPgorICogKioqKiogTm90ZTogdGhpcyBkb2VzIF9ub3RfIGN1cnJlbnQgYXR0ZW1wdCB0byBjYWNoZSBhbnkgb2YgdGhlIGRhdGE7CisgKiBpZiB5b3UgYXNrIGZvciBhdHRyaWJ1dGUgMjcgYW5kIHRoZW4gMjgsIHlvdSdsbCBoYXZlIHRvIHJlc2NhbiB0aGUgZmlyc3QKKyAqIDI3LiBJdCBzaG91bGQgcHJvYmFibHkgYXQgbGVhc3Qga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBvbmUgcmV0cmlldmVkLAorICogYW5kIHBvc3NpYmx5IGJ1ZmZlciB0aGUgd2hvbGUgYXJyYXkuCisgKiA8cD4KKyAqICoqKioqIEFsc28gbm90ZSB0aGF0IHRoZXJlJ3Mgbm8gZmFzdHBhdGggZm9yIHRoZSBieS1uYW1lIHF1ZXJ5OyB3ZSBzZWFyY2gKKyAqIGxpbmVhcmx5IHVudGlsIHdlIGZpbmQgaXQgb3IgZmFpbCB0byBmaW5kIGl0LiBBZ2FpbiwgdGhhdCBjb3VsZCBiZQorICogb3B0aW1pemVkIGF0IHNvbWUgY29zdCBpbiBvYmplY3QgY3JlYXRpb24vc3RvcmFnZS4KKyAqLworcHVibGljIGNsYXNzIERUTU5hbWVkTm9kZU1hcCBpbXBsZW1lbnRzIE5hbWVkTm9kZU1hcAoreworCisgIC8qKiBUaGUgRFRNIGZvciB0aGlzIG5vZGUuICovCisgIERUTSBkdG07CisKKyAgLyoqIFRoZSBEVE0gZWxlbWVudCBoYW5kbGUuICovCisgIGludCBlbGVtZW50OworCisgIC8qKiBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoaXMgbWFwLiAqLworICBzaG9ydCBtX2NvdW50ID0gLTE7CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIGdldEF0dHJpYnV0ZXMgTmFtZWROb2RlTWFwIGZvciBhIGdpdmVuIERUTSBlbGVtZW50IG5vZGUKKyAgICoKKyAgICogQHBhcmFtIGR0bSBUaGUgRFRNIFJlZmVyZW5jZSwgbXVzdCBiZSBub24tbnVsbC4KKyAgICogQHBhcmFtIGVsZW1lbnQgVGhlIERUTSBlbGVtZW50IGhhbmRsZS4KKyAgICovCisgIERUTU5hbWVkTm9kZU1hcChEVE0gZHRtLCBpbnQgZWxlbWVudCkKKyAgeworICAgIHRoaXMuZHRtID0gZHRtOworICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgQXR0cmlidXRlcyBvbiB0aGlzIEVsZW1lbnQKKyAgICoKKyAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoaXMgbWFwLgorICAgKi8KKyAgcHVibGljIGludCBnZXRMZW5ndGgoKQorICB7CisKKyAgICBpZiAobV9jb3VudCA9PSAtMSkKKyAgICB7CisgICAgICBzaG9ydCBjb3VudCA9IDA7CisKKyAgICAgIGZvciAoaW50IG4gPSBkdG0uZ2V0TmV4dEF0dHJpYnV0ZShlbGVtZW50KTsgbiAhPSAtMTsKKyAgICAgICAgICAgICAgbiA9IGR0bS5nZXROZXh0QXR0cmlidXRlKG4pKQorICAgICAgeworICAgICAgICArK2NvdW50OworICAgICAgfQorCisgICAgICBtX2NvdW50ID0gY291bnQ7CisgICAgfQorCisgICAgcmV0dXJuIChpbnQpIG1fY291bnQ7CisgIH0KKworICAvKioKKyAgICogUmV0cmlldmVzIGEgbm9kZSBzcGVjaWZpZWQgYnkgbmFtZS4KKyAgICogQHBhcmFtIG5hbWVUaGUgPGNvZGU+bm9kZU5hbWU8L2NvZGU+IG9mIGEgbm9kZSB0byByZXRyaWV2ZS4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgaXRlbSBiZWluZyByZXF1ZXN0ZWQuCisgICAqIEByZXR1cm4gQSA8Y29kZT5Ob2RlPC9jb2RlPiAob2YgYW55IHR5cGUpIHdpdGggdGhlIHNwZWNpZmllZAorICAgKiAgIDxjb2RlPm5vZGVOYW1lPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgZG9lcyBub3QgaWRlbnRpZnkKKyAgICogICBhbnkgbm9kZSBpbiB0aGlzIG1hcC4KKyAgICovCisgIHB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkKKyAgeworCisgICAgZm9yIChpbnQgbiA9IGR0bS5nZXROZXh0QXR0cmlidXRlKGVsZW1lbnQpOyBuICE9IC0xOworICAgICAgICAgICAgbiA9IGR0bS5nZXROZXh0QXR0cmlidXRlKG4pKQorICAgIHsKKyAgICAgIGlmIChkdG0uZ2V0Tm9kZU5hbWUobikuZXF1YWxzKG5hbWUpKQorICAgICAgICByZXR1cm4gZHRtLmdldE5vZGUobik7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+dGggaXRlbSBpbiB0aGUgbWFwLiBJZiA8Y29kZT5pbmRleDwvY29kZT4KKyAgICogaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhpcyBtYXAsIHRoaXMKKyAgICogcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICogQHBhcmFtIGluZGV4SW5kZXggaW50byB0aGlzIG1hcC4KKyAgICoKKyAgICogQHBhcmFtIGkgVGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0ZWQgaXRlbS4KKyAgICogQHJldHVybiBUaGUgbm9kZSBhdCB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+dGggcG9zaXRpb24gaW4gdGhlIG1hcCwgb3IKKyAgICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0IGlzIG5vdCBhIHZhbGlkIGluZGV4LgorICAgKi8KKyAgcHVibGljIE5vZGUgaXRlbShpbnQgaSkKKyAgeworCisgICAgaW50IGNvdW50ID0gMDsKKworICAgIGZvciAoaW50IG4gPSBkdG0uZ2V0TmV4dEF0dHJpYnV0ZShlbGVtZW50KTsgbiAhPSAtMTsKKyAgICAgICAgICAgIG4gPSBkdG0uZ2V0TmV4dEF0dHJpYnV0ZShuKSkKKyAgICB7CisgICAgICBpZiAoY291bnQgPT0gaSkKKyAgICAgICAgcmV0dXJuIGR0bS5nZXROb2RlKG4pOworICAgICAgZWxzZQorICAgICAgICArK2NvdW50OworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqCisgICAqIEFkZHMgYSBub2RlIHVzaW5nIGl0cyA8Y29kZT5ub2RlTmFtZTwvY29kZT4gYXR0cmlidXRlLiBJZiBhIG5vZGUgd2l0aAorICAgKiB0aGF0IG5hbWUgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgbWFwLCBpdCBpcyByZXBsYWNlZCBieSB0aGUgbmV3CisgICAqIG9uZS4KKyAgICogPGJyPkFzIHRoZSA8Y29kZT5ub2RlTmFtZTwvY29kZT4gYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVyaXZlIHRoZSBuYW1lCisgICAqIHdoaWNoIHRoZSBub2RlIG11c3QgYmUgc3RvcmVkIHVuZGVyLCBtdWx0aXBsZSBub2RlcyBvZiBjZXJ0YWluIHR5cGVzCisgICAqICh0aG9zZSB0aGF0IGhhdmUgYSAic3BlY2lhbCIgc3RyaW5nIHZhbHVlKSBjYW5ub3QgYmUgc3RvcmVkIGFzIHRoZQorICAgKiBuYW1lcyB3b3VsZCBjbGFzaC4gVGhpcyBpcyBzZWVuIGFzIHByZWZlcmFibGUgdG8gYWxsb3dpbmcgbm9kZXMgdG8gYmUKKyAgICogYWxpYXNlZC4KKyAgICogQHBhcmFtIG5ld05vZGUgbm9kZSB0byBzdG9yZSBpbiB0aGlzIG1hcC4gVGhlIG5vZGUgd2lsbCBsYXRlciBiZQorICAgKiAgIGFjY2Vzc2libGUgdXNpbmcgdGhlIHZhbHVlIG9mIGl0cyA8Y29kZT5ub2RlTmFtZTwvY29kZT4gYXR0cmlidXRlLgorICAgKgorICAgKiBAcmV0dXJuIElmIHRoZSBuZXcgPGNvZGU+Tm9kZTwvY29kZT4gcmVwbGFjZXMgYW4gZXhpc3Rpbmcgbm9kZSB0aGUKKyAgICogICByZXBsYWNlZCA8Y29kZT5Ob2RlPC9jb2RlPiBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+CisgICAqICAgaXMgcmV0dXJuZWQuCisgICAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCisgICAqICAgV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+YXJnPC9jb2RlPiB3YXMgY3JlYXRlZCBmcm9tIGEKKyAgICogICBkaWZmZXJlbnQgZG9jdW1lbnQgdGhhbiB0aGUgb25lIHRoYXQgY3JlYXRlZCB0aGlzIG1hcC4KKyAgICogICA8YnI+Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtYXAgaXMgcmVhZG9ubHkuCisgICAqICAgPGJyPklOVVNFX0FUVFJJQlVURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5hcmc8L2NvZGU+IGlzIGFuCisgICAqICAgPGNvZGU+QXR0cjwvY29kZT4gdGhhdCBpcyBhbHJlYWR5IGFuIGF0dHJpYnV0ZSBvZiBhbm90aGVyCisgICAqICAgPGNvZGU+RWxlbWVudDwvY29kZT4gb2JqZWN0LiBUaGUgRE9NIHVzZXIgbXVzdCBleHBsaWNpdGx5IGNsb25lCisgICAqICAgPGNvZGU+QXR0cjwvY29kZT4gbm9kZXMgdG8gcmUtdXNlIHRoZW0gaW4gb3RoZXIgZWxlbWVudHMuCisgICAqLworICBwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW0oTm9kZSBuZXdOb2RlKQorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihEVE1FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmVzIGEgbm9kZSBzcGVjaWZpZWQgYnkgbmFtZS4gV2hlbiB0aGlzIG1hcCBjb250YWlucyB0aGUgYXR0cmlidXRlcworICAgKiBhdHRhY2hlZCB0byBhbiBlbGVtZW50LCBpZiB0aGUgcmVtb3ZlZCBhdHRyaWJ1dGUgaXMga25vd24gdG8gaGF2ZSBhCisgICAqIGRlZmF1bHQgdmFsdWUsIGFuIGF0dHJpYnV0ZSBpbW1lZGlhdGVseSBhcHBlYXJzIGNvbnRhaW5pbmcgdGhlCisgICAqIGRlZmF1bHQgdmFsdWUgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgVVJJLCBsb2NhbCBuYW1lLAorICAgKiBhbmQgcHJlZml4IHdoZW4gYXBwbGljYWJsZS4KKyAgICogQHBhcmFtIG5hbWUgVGhlIDxjb2RlPm5vZGVOYW1lPC9jb2RlPiBvZiB0aGUgbm9kZSB0byByZW1vdmUuCisgICAqCisgICAqIEByZXR1cm4gVGhlIG5vZGUgcmVtb3ZlZCBmcm9tIHRoaXMgbWFwIGlmIGEgbm9kZSB3aXRoIHN1Y2ggYSBuYW1lCisgICAqICAgZXhpc3RzLgorICAgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgorICAgKiAgIE5PVF9GT1VORF9FUlI6IFJhaXNlZCBpZiB0aGVyZSBpcyBubyBub2RlIG5hbWVkIDxjb2RlPm5hbWU8L2NvZGU+IGluCisgICAqICAgdGhpcyBtYXAuCisgICAqICAgPGJyPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbWFwIGlzIHJlYWRvbmx5LgorICAgKi8KKyAgcHVibGljIE5vZGUgcmVtb3ZlTmFtZWRJdGVtKFN0cmluZyBuYW1lKQorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihEVE1FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXRyaWV2ZXMgYSBub2RlIHNwZWNpZmllZCBieSBsb2NhbCBuYW1lIGFuZCBuYW1lc3BhY2UgVVJJLiBIVE1MLW9ubHkKKyAgICogRE9NIGltcGxlbWVudGF0aW9ucyBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCisgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgVGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIG5vZGUgdG8gcmV0cmlldmUuCisgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGxvY2FsIG5hbWUgb2YgdGhlIG5vZGUgdG8gcmV0cmlldmUuCisgICAqCisgICAqIEByZXR1cm4gQSA8Y29kZT5Ob2RlPC9jb2RlPiAob2YgYW55IHR5cGUpIHdpdGggdGhlIHNwZWNpZmllZCBsb2NhbAorICAgKiAgIG5hbWUgYW5kIG5hbWVzcGFjZSBVUkksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXkgZG8gbm90CisgICAqICAgaWRlbnRpZnkgYW55IG5vZGUgaW4gdGhpcyBtYXAuCisgICAqIEBzaW5jZSBET00gTGV2ZWwgMgorICAgKi8KKyAgcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkKKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRFRNRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKiBBZGRzIGEgbm9kZSB1c2luZyBpdHMgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBhbmQKKyAgICogPGNvZGU+bG9jYWxOYW1lPC9jb2RlPi4gSWYgYSBub2RlIHdpdGggdGhhdCBuYW1lc3BhY2UgVVJJIGFuZCB0aGF0CisgICAqIGxvY2FsIG5hbWUgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgbWFwLCBpdCBpcyByZXBsYWNlZCBieSB0aGUgbmV3CisgICAqIG9uZS4KKyAgICogPGJyPkhUTUwtb25seSBET00gaW1wbGVtZW50YXRpb25zIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KKyAgICogQHBhcmFtIGFyZyBBIG5vZGUgdG8gc3RvcmUgaW4gdGhpcyBtYXAuIFRoZSBub2RlIHdpbGwgbGF0ZXIgYmUKKyAgICogICBhY2Nlc3NpYmxlIHVzaW5nIHRoZSB2YWx1ZSBvZiBpdHMgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBhbmQKKyAgICogICA8Y29kZT5sb2NhbE5hbWU8L2NvZGU+IGF0dHJpYnV0ZXMuCisgICAqCisgICAqIEByZXR1cm4gSWYgdGhlIG5ldyA8Y29kZT5Ob2RlPC9jb2RlPiByZXBsYWNlcyBhbiBleGlzdGluZyBub2RlIHRoZQorICAgKiAgIHJlcGxhY2VkIDxjb2RlPk5vZGU8L2NvZGU+IGlzIHJldHVybmVkLCBvdGhlcndpc2UgPGNvZGU+bnVsbDwvY29kZT4KKyAgICogICBpcyByZXR1cm5lZC4KKyAgICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KKyAgICogICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5hcmc8L2NvZGU+IHdhcyBjcmVhdGVkIGZyb20gYQorICAgKiAgIGRpZmZlcmVudCBkb2N1bWVudCB0aGFuIHRoZSBvbmUgdGhhdCBjcmVhdGVkIHRoaXMgbWFwLgorICAgKiAgIDxicj5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG1hcCBpcyByZWFkb25seS4KKyAgICogICA8YnI+SU5VU0VfQVRUUklCVVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmFyZzwvY29kZT4gaXMgYW4KKyAgICogICA8Y29kZT5BdHRyPC9jb2RlPiB0aGF0IGlzIGFscmVhZHkgYW4gYXR0cmlidXRlIG9mIGFub3RoZXIKKyAgICogICA8Y29kZT5FbGVtZW50PC9jb2RlPiBvYmplY3QuIFRoZSBET00gdXNlciBtdXN0IGV4cGxpY2l0bHkgY2xvbmUKKyAgICogICA8Y29kZT5BdHRyPC9jb2RlPiBub2RlcyB0byByZS11c2UgdGhlbSBpbiBvdGhlciBlbGVtZW50cy4KKyAgICogQHNpbmNlIERPTSBMZXZlbCAyCisgICAqLworICBwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW1OUyhOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbgorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihEVE1FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmVzIGEgbm9kZSBzcGVjaWZpZWQgYnkgbG9jYWwgbmFtZSBhbmQgbmFtZXNwYWNlIFVSSS4gQSByZW1vdmVkCisgICAqIGF0dHJpYnV0ZSBtYXkgYmUga25vd24gdG8gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgd2hlbiB0aGlzIG1hcCBjb250YWlucworICAgKiB0aGUgYXR0cmlidXRlcyBhdHRhY2hlZCB0byBhbiBlbGVtZW50LCBhcyByZXR1cm5lZCBieSB0aGUgYXR0cmlidXRlcworICAgKiBhdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPk5vZGU8L2NvZGU+IGludGVyZmFjZS4gSWYgc28sIGFuIGF0dHJpYnV0ZQorICAgKiBpbW1lZGlhdGVseSBhcHBlYXJzIGNvbnRhaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWUgYXMgd2VsbCBhcyB0aGUKKyAgICogY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgVVJJLCBsb2NhbCBuYW1lLCBhbmQgcHJlZml4IHdoZW4gYXBwbGljYWJsZS4KKyAgICogPGJyPkhUTUwtb25seSBET00gaW1wbGVtZW50YXRpb25zIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KKyAgICogCisgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgVGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIG5vZGUgdG8gcmVtb3ZlLgorICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBub2RlIHRvIHJlbW92ZS4KKyAgICoKKyAgICogQHJldHVybiBUaGUgbm9kZSByZW1vdmVkIGZyb20gdGhpcyBtYXAgaWYgYSBub2RlIHdpdGggc3VjaCBhIGxvY2FsCisgICAqICAgbmFtZSBhbmQgbmFtZXNwYWNlIFVSSSBleGlzdHMuCisgICAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCisgICAqICAgTk9UX0ZPVU5EX0VSUjogUmFpc2VkIGlmIHRoZXJlIGlzIG5vIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAqICAgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBhbmQgPGNvZGU+bG9jYWxOYW1lPC9jb2RlPiBpbiB0aGlzIG1hcC4KKyAgICogICA8YnI+Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtYXAgaXMgcmVhZG9ubHkuCisgICAqIEBzaW5jZSBET00gTGV2ZWwgMgorICAgKi8KKyAgcHVibGljIE5vZGUgcmVtb3ZlTmFtZWRJdGVtTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkKKyAgICAgICAgICB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERUTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOworICB9CisKKyAgLyoqCisgICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgorICAgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgRE9NRXhjZXB0aW9uLgorICAgKi8KKyAgcHVibGljIGNsYXNzIERUTUV4Y2VwdGlvbiBleHRlbmRzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgorICB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgRE9NL0RUTSBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZQorICAgICAqIEBwYXJhbSBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIERUTUV4Y2VwdGlvbihzaG9ydCBjb2RlLCBTdHJpbmcgbWVzc2FnZSkKKyAgICB7CisgICAgICBzdXBlcihjb2RlLCBtZXNzYWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBEVE1FeGNlcHRpb24KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIGNvZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRFRNRXhjZXB0aW9uKHNob3J0IGNvZGUpCisgICAgeworICAgICAgc3VwZXIoY29kZSwgIiIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9EVE1Ob2RlUHJveHkuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNTm9kZVByb3h5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBlNjgyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNTm9kZVByb3h5LmphdmEKQEAgLTAsMCArMSwxMTU2IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKKyAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKKyAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cworICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5kdG07CisKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworCisvKioKKyAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgorICogPGNvZGU+RFRNTm9kZVByb3h5PC9jb2RlPiBwcmVzZW50cyBhIERPTSBOb2RlIEFQSSBmcm9udC1lbmQgdG8gdGhlIERUTSBtb2RlbC4KKyAqIDxwPgorICogSXQgZG9lcyBfbm90XyBhdHRlbXB0IHRvIGFkZHJlc3MgdGhlICJub2RlIGlkZW50aXR5IiBxdWVzdGlvbjsgbm8gZWZmb3J0CisgKiBpcyBtYWRlIHRvIHByZXZlbnQgdGhlIGNyZWF0aW9uIG9mIG11bHRpcGxlIHByb3hpZXMgcmVmZXJyaW5nIHRvIGEgc2luZ2xlCisgKiBEVE0gbm9kZS4gVXNlcnMgY2FuIGNyZWF0ZSBhIG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgdGhpcywgb3IgcmVsaW5xdWlzaCB0aGUKKyAqIHVzZSBvZiAiPT0iIGFuZCB1c2UgdGhlIC5zYW1lTm9kZUFzKCkgbWVjaGFuaXNtLCB3aGljaCBpcyB1bmRlcgorICogY29uc2lkZXJhdGlvbiBmb3IgZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBET00uCisgKiA8cD4KKyAqIERUTU5vZGVQcm94eSBtYXkgYmUgc3ViY2xhc3NlZCBmdXJ0aGVyIHRvIHByZXNlbnQgc3BlY2lmaWMgRE9NIG5vZGUgdHlwZXMuCisgKgorICogQHNlZSBvcmcudzNjLmRvbQorICovCitwdWJsaWMgY2xhc3MgRFRNTm9kZVByb3h5CisgICAgICAgIGltcGxlbWVudHMgTm9kZSwgRG9jdW1lbnQsIFRleHQsIEVsZW1lbnQsIEF0dHIsCisgICAgICAgICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uLCBDb21tZW50Cit7CisKKyAgLyoqIFRoZSBEVE0gZm9yIHRoaXMgbm9kZS4gKi8KKyAgcHVibGljIERUTSBkdG07CisKKyAgLyoqIFRoZSBEVE0gbm9kZSBoYW5kbGUuICovCisgIGludCBub2RlOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBEVE1Ob2RlUHJveHkgTm9kZSByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyBOb2RlIGluIGEgRFRNCisgICAqCisgICAqIEBwYXJhbSBkdG0gVGhlIERUTSBSZWZlcmVuY2UsIG11c3QgYmUgbm9uLW51bGwuCisgICAqIEBwYXJhbSBub2RlIFRoZSBEVE0gbm9kZSBoYW5kbGUuCisgICAqLworICBEVE1Ob2RlUHJveHkoRFRNIGR0bSwgaW50IG5vZGUpCisgIHsKKyAgICB0aGlzLmR0bSA9IGR0bTsKKyAgICB0aGlzLm5vZGUgPSBub2RlOworICB9CisKKyAgLyoqCisgICAqIE5PTi1ET006IFJldHVybiB0aGUgRFRNIG1vZGVsCisgICAqCisgICAqIEByZXR1cm4gVGhlIERUTSB0aGF0IHRoaXMgcHJveHkgaXMgYSByZXByZXNlbnRhdGl2ZSBmb3IuCisgICAqLworICBwdWJsaWMgZmluYWwgRFRNIGdldERUTSgpCisgIHsKKyAgICByZXR1cm4gZHRtOworICB9CisKKyAgLyoqCisgICAqIE5PTi1ET006IFJldHVybiB0aGUgRFRNIG5vZGUgbnVtYmVyCisgICAqCisgICAqIEByZXR1cm4gVGhlIERUTSBub2RlIGhhbmRsZS4KKyAgICovCisgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RFRNTm9kZU51bWJlcigpCisgIHsKKyAgICByZXR1cm4gbm9kZTsKKyAgfQorCisgIC8qKgorICAgKiBUZXN0IGZvciBlcXVhbGl0eSBiYXNlZCBvbiBub2RlIG51bWJlci4KKyAgICoKKyAgICogQHBhcmFtIG5vZGUgQSBEVE0gbm9kZSBwcm94eSByZWZlcmVuY2UuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbm9kZSBoYXMgdGhlIHNhbWUgaGFuZGxlIGFzIHRoaXMgbm9kZS4KKyAgICovCisgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhOb2RlIG5vZGUpCisgIHsKKworICAgIHRyeQorICAgIHsKKyAgICAgIERUTU5vZGVQcm94eSBkdG1wID0gKERUTU5vZGVQcm94eSkgbm9kZTsKKworICAgICAgLy8gcmV0dXJuIChkdG1wLm5vZGUgPT0gdGhpcy5ub2RlKTsKKyAgICAgIC8vIFBhdGNoIGF0dHJpYnV0ZWQgdG8gR2FyeSBMIFBlc2tpbiA8Z2FyeXBAZmlyc3RlY2guY29tPgorICAgICAgcmV0dXJuIChkdG1wLm5vZGUgPT0gdGhpcy5ub2RlKSAmJiAoZHRtcC5kdG0gPT0gdGhpcy5kdG0pOworICAgIH0KKyAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkKKyAgICB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRlc3QgZm9yIGVxdWFsaXR5IGJhc2VkIG9uIG5vZGUgbnVtYmVyLgorICAgKgorICAgKiBAcGFyYW0gbm9kZSBBIERUTSBub2RlIHByb3h5IHJlZmVyZW5jZS4KKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBub2RlIGhhcyB0aGUgc2FtZSBoYW5kbGUgYXMgdGhpcyBub2RlLgorICAgKi8KKyAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBub2RlKQorICB7CisKKyAgICB0cnkKKyAgICB7CisKKyAgICAgIC8vIERUTU5vZGVQcm94eSBkdG1wID0gKERUTU5vZGVQcm94eSlub2RlOworICAgICAgLy8gcmV0dXJuIChkdG1wLm5vZGUgPT0gdGhpcy5ub2RlKTsKKyAgICAgIC8vIFBhdGNoIGF0dHJpYnV0ZWQgdG8gR2FyeSBMIFBlc2tpbiA8Z2FyeXBAZmlyc3RlY2guY29tPgorICAgICAgcmV0dXJuIGVxdWFscygoTm9kZSkgbm9kZSk7CisgICAgfQorICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKQorICAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRlVUVVJFIERPTTogVGVzdCBub2RlIGlkZW50aXR5LCBpbiBsaWV1IG9mIE5vZGU9PU5vZGUKKyAgICoKKyAgICogQHBhcmFtIG90aGVyCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbm9kZSBoYXMgdGhlIHNhbWUgaGFuZGxlIGFzIHRoaXMgbm9kZS4KKyAgICovCisgIHB1YmxpYyBmaW5hbCBib29sZWFuIHNhbWVOb2RlQXMoTm9kZSBvdGhlcikKKyAgeworCisgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBEVE1Ob2RlUHJveHkpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgRFRNTm9kZVByb3h5IHRoYXQgPSAoRFRNTm9kZVByb3h5KSBvdGhlcjsKKworICAgIHJldHVybiB0aGlzLmR0bSA9PSB0aGF0LmR0bSAmJiB0aGlzLm5vZGUgPT0gdGhhdC5ub2RlOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEByZXR1cm4KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlCisgICAqLworICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5vZGVOYW1lKCkKKyAgeworICAgIHJldHVybiBkdG0uZ2V0Tm9kZU5hbWUobm9kZSk7CisgIH0KKworICAvKioKKyAgICogQSBQSSdzICJ0YXJnZXQiIHN0YXRlcyB3aGF0IHByb2Nlc3NvciBjaGFubmVsIHRoZSBQSSdzIGRhdGEKKyAgICogc2hvdWxkIGJlIGRpcmVjdGVkIHRvLiBJdCBpcyBkZWZpbmVkIGRpZmZlcmVudGx5IGluIEhUTUwgYW5kIFhNTC4KKyAgICogPHA+CisgICAqIEluIFhNTCwgYSBQSSdzICJ0YXJnZXQiIGlzIHRoZSBmaXJzdCAod2hpdGVzcGFjZS1kZWxpbWl0ZWQpIHRva2VuCisgICAqIGZvbGxvd2luZyB0aGUgIjw/IiB0b2tlbiB0aGF0IGJlZ2lucyB0aGUgUEkuCisgICAqIDxwPgorICAgKiBJbiBIVE1MLCB0YXJnZXQgaXMgYWx3YXlzIG51bGwuCisgICAqIDxwPgorICAgKiBOb3RlIHRoYXQgZ2V0Tm9kZU5hbWUgaXMgYWxpYXNlZCB0byBnZXRUYXJnZXQuCisgICAqCisgICAqIEByZXR1cm4KKyAgICovCisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VGFyZ2V0KCkKKyAgeworICAgIHJldHVybiBkdG0uZ2V0Tm9kZU5hbWUobm9kZSk7CisgIH0gIC8vIGdldFRhcmdldCgpOlN0cmluZworCisgIC8qKgorICAgKgorICAgKiBAcmV0dXJuCisgICAqIEBzZWUgb3JnLnczYy5kb20uTm9kZSBhcyBvZiBET00gTGV2ZWwgMgorICAgKi8KKyAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRMb2NhbE5hbWUoKQorICB7CisgICAgcmV0dXJuIGR0bS5nZXRMb2NhbE5hbWUobm9kZSk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBUaGUgcHJlZml4IGZvciB0aGlzIG5vZGUuCisgICAqIEBzZWUgb3JnLnczYy5kb20uTm9kZSBhcyBvZiBET00gTGV2ZWwgMgorICAgKi8KKyAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcmVmaXgoKQorICB7CisgICAgcmV0dXJuIGR0bS5nZXRQcmVmaXgobm9kZSk7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIHByZWZpeAorICAgKgorICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUgYXMgb2YgRE9NIExldmVsIDIgLS0gRFRNTm9kZVByb3h5IGlzIHJlYWQtb25seQorICAgKi8KKyAgcHVibGljIGZpbmFsIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24KKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUgYXMgb2YgRE9NIExldmVsIDIKKyAgICovCisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkKKyAgeworICAgIHJldHVybiBkdG0uZ2V0TmFtZXNwYWNlVVJJKG5vZGUpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEBwYXJhbSBmZWF0dXJlCisgICAqIEBwYXJhbSB2ZXJzaW9uCisgICAqCisgICAqIEByZXR1cm4KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlIGFzIG9mIERPTSBMZXZlbCAyCisgICAqLworICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIGZlYXR1cmUKKyAgICogQHBhcmFtIHZlcnNpb24KKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUgYXMgb2YgRE9NIExldmVsIDIKKyAgICovCisgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzU3VwcG9ydGVkKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikKKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcmV0dXJuCisgICAqCisgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCisgICAqIEBzZWUgb3JnLnczYy5kb20uTm9kZQorICAgKi8KKyAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROb2RlVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKworICAgIC8vICoqKioqIEFTU1VNUFRJT046IEFUVFJJQlVURVMgSEFWRSBTSU5HTEUgVEVYVC1OT0RFIENISUxELgorICAgIC8vIChTSU1JTEFSIEFTU1VNUFRJT04gQ1VSUkVOVExZIE1BREUgSU4gRFRNOyBCRSBTVVJFIFRPCisgICAgLy8gUkVWSVNJVCBUSElTIElGIFRIQVQgQ0hBTkdFUyEpCisgICAgaWYgKGdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKKyAgICAgIHJldHVybiBkdG0uZ2V0Tm9kZVZhbHVlKG5vZGUgKyAxKTsKKworICAgIHJldHVybiBkdG0uZ2V0Tm9kZVZhbHVlKG5vZGUpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEBwYXJhbSBub2RlVmFsdWUKKyAgICoKKyAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlIC0tIERUTU5vZGVQcm94eSBpcyByZWFkLW9ubHkKKyAgICovCisgIHB1YmxpYyBmaW5hbCB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEByZXR1cm4KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlCisgICAqLworICBwdWJsaWMgZmluYWwgc2hvcnQgZ2V0Tm9kZVR5cGUoKQorICB7CisgICAgcmV0dXJuIChzaG9ydCkgZHRtLmdldE5vZGVUeXBlKG5vZGUpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEByZXR1cm4KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlCisgICAqLworICBwdWJsaWMgZmluYWwgTm9kZSBnZXRQYXJlbnROb2RlKCkKKyAgeworCisgICAgaWYgKGdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKKyAgICAgIHJldHVybiBudWxsOworCisgICAgaW50IG5ld25vZGUgPSBkdG0uZ2V0UGFyZW50KG5vZGUpOworCisgICAgcmV0dXJuIChuZXdub2RlID09IC0xKSA/IG51bGwgOiBkdG0uZ2V0Tm9kZShuZXdub2RlKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcmV0dXJuCisgICAqIEBzZWUgb3JnLnczYy5kb20uTm9kZQorICAgKi8KKyAgcHVibGljIGZpbmFsIE5vZGUgZ2V0T3duZXJOb2RlKCkKKyAgeworCisgICAgaW50IG5ld25vZGUgPSBkdG0uZ2V0UGFyZW50KG5vZGUpOworCisgICAgcmV0dXJuIChuZXdub2RlID09IC0xKSA/IG51bGwgOiBkdG0uZ2V0Tm9kZShuZXdub2RlKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcmV0dXJuCisgICAqIEBzZWUgb3JnLnczYy5kb20uTm9kZQorICAgKi8KKyAgcHVibGljIGZpbmFsIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKQorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEByZXR1cm4KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlCisgICAqLworICBwdWJsaWMgZmluYWwgTm9kZSBnZXRGaXJzdENoaWxkKCkKKyAgeworCisgICAgaW50IG5ld25vZGUgPSBkdG0uZ2V0Rmlyc3RDaGlsZChub2RlKTsKKworICAgIHJldHVybiAobmV3bm9kZSA9PSAtMSkgPyBudWxsIDogZHRtLmdldE5vZGUobmV3bm9kZSk7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUKKyAgICovCisgIHB1YmxpYyBmaW5hbCBOb2RlIGdldExhc3RDaGlsZCgpCisgIHsKKworICAgIGludCBuZXdub2RlID0gZHRtLmdldExhc3RDaGlsZChub2RlKTsKKworICAgIHJldHVybiAobmV3bm9kZSA9PSAtMSkgPyBudWxsIDogZHRtLmdldE5vZGUobmV3bm9kZSk7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUKKyAgICovCisgIHB1YmxpYyBmaW5hbCBOb2RlIGdldFByZXZpb3VzU2libGluZygpCisgIHsKKworICAgIGludCBuZXdub2RlID0gZHRtLmdldFByZXZpb3VzU2libGluZyhub2RlKTsKKworICAgIHJldHVybiAobmV3bm9kZSA9PSAtMSkgPyBudWxsIDogZHRtLmdldE5vZGUobmV3bm9kZSk7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUKKyAgICovCisgIHB1YmxpYyBmaW5hbCBOb2RlIGdldE5leHRTaWJsaW5nKCkKKyAgeworCisgICAgLy8gQXR0cidzIE5leHQgaXMgZGVmaW5lZCBhdCBEVE0gbGV2ZWwsIGJ1dCBub3QgYXQgRE9NIGxldmVsLgorICAgIGlmIChkdG0uZ2V0Tm9kZVR5cGUobm9kZSkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKKyAgICAgIHJldHVybiBudWxsOworCisgICAgaW50IG5ld25vZGUgPSBkdG0uZ2V0TmV4dFNpYmxpbmcobm9kZSk7CisKKyAgICByZXR1cm4gKG5ld25vZGUgPT0gLTEpID8gbnVsbCA6IGR0bS5nZXROb2RlKG5ld25vZGUpOworICB9CisKKyAgLy8gRFRNTmFtZWROb2RlTWFwIG1fYXR0cnM7CisKKyAgLyoqCisgICAqCisgICAqIEByZXR1cm4KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlCisgICAqLworICBwdWJsaWMgZmluYWwgTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKQorICB7CisKKyAgICByZXR1cm4gbmV3IERUTU5hbWVkTm9kZU1hcChkdG0sIG5vZGUpOworICB9CisKKyAgLyoqCisgICAqIE1ldGhvZCBoYXNBdHRyaWJ1dGUKKyAgICoKKyAgICoKKyAgICogQHBhcmFtIG5hbWUKKyAgICoKKyAgICogKGhhc0F0dHJpYnV0ZSkgQHJldHVybgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlKFN0cmluZyBuYW1lKQorICB7CisKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisKKyAgICAvLyByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogTWV0aG9kIGhhc0F0dHJpYnV0ZU5TCisgICAqCisgICAqCisgICAqIEBwYXJhbSBuYW1lCisgICAqIEBwYXJhbSB4CisgICAqCisgICAqIChoYXNBdHRyaWJ1dGVOUykgQHJldHVybgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlTlMoU3RyaW5nIG5hbWUsIFN0cmluZyB4KQorICB7CisKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisKKyAgICAvLyByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUKKyAgICovCisgIHB1YmxpYyBmaW5hbCBEb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkKKyAgeworICAgIHJldHVybiBuZXcgRFRNTm9kZVByb3h5KGR0bSwgZHRtLmdldERvY3VtZW50KCkpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEBwYXJhbSBuZXdDaGlsZAorICAgKiBAcGFyYW0gcmVmQ2hpbGQKKyAgICoKKyAgICogQHJldHVybgorICAgKgorICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUgLS0gRFRNTm9kZVByb3h5IGlzIHJlYWQtb25seQorICAgKi8KKyAgcHVibGljIGZpbmFsIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpCisgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbgorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gbmV3Q2hpbGQKKyAgICogQHBhcmFtIG9sZENoaWxkCisgICAqCisgICAqIEByZXR1cm4KKyAgICoKKyAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlIC0tIERUTU5vZGVQcm94eSBpcyByZWFkLW9ubHkKKyAgICovCisgIHB1YmxpYyBmaW5hbCBOb2RlIHJlcGxhY2VDaGlsZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKQorICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb24KKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIG9sZENoaWxkCisgICAqCisgICAqIEByZXR1cm4KKyAgICoKKyAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlIC0tIERUTU5vZGVQcm94eSBpcyByZWFkLW9ubHkKKyAgICovCisgIHB1YmxpYyBmaW5hbCBOb2RlIHJlbW92ZUNoaWxkKE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24KKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIG5ld0NoaWxkCisgICAqCisgICAqIEByZXR1cm4KKyAgICoKKyAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlIC0tIERUTU5vZGVQcm94eSBpcyByZWFkLW9ubHkKKyAgICovCisgIHB1YmxpYyBmaW5hbCBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbmV3Q2hpbGQpIHRocm93cyBET01FeGNlcHRpb24KKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUKKyAgICovCisgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0NoaWxkTm9kZXMoKQorICB7CisgICAgcmV0dXJuICgtMSAhPSBkdG0uZ2V0Rmlyc3RDaGlsZChub2RlKSk7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIGRlZXAKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUgLS0gRFRNTm9kZVByb3h5IGlzIHJlYWQtb25seQorICAgKi8KKyAgcHVibGljIGZpbmFsIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkKKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcmV0dXJuCisgICAqIEBzZWUgb3JnLnczYy5kb20uRG9jdW1lbnQKKyAgICovCisgIHB1YmxpYyBmaW5hbCBEb2N1bWVudFR5cGUgZ2V0RG9jdHlwZSgpCisgIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcmV0dXJuCisgICAqIEBzZWUgb3JnLnczYy5kb20uRG9jdW1lbnQKKyAgICovCisgIHB1YmxpYyBmaW5hbCBET01JbXBsZW1lbnRhdGlvbiBnZXRJbXBsZW1lbnRhdGlvbigpCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkRvY3VtZW50CisgICAqLworICBwdWJsaWMgZmluYWwgRWxlbWVudCBnZXREb2N1bWVudEVsZW1lbnQoKQorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEBwYXJhbSB0YWdOYW1lCisgICAqCisgICAqIEByZXR1cm4KKyAgICoKKyAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Eb2N1bWVudAorICAgKi8KKyAgcHVibGljIGZpbmFsIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgdGFnTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbgorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEByZXR1cm4KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Eb2N1bWVudAorICAgKi8KKyAgcHVibGljIGZpbmFsIERvY3VtZW50RnJhZ21lbnQgY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIGRhdGEKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkRvY3VtZW50CisgICAqLworICBwdWJsaWMgZmluYWwgVGV4dCBjcmVhdGVUZXh0Tm9kZShTdHJpbmcgZGF0YSkKKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gZGF0YQorICAgKgorICAgKiBAcmV0dXJuCisgICAqIEBzZWUgb3JnLnczYy5kb20uRG9jdW1lbnQKKyAgICovCisgIHB1YmxpYyBmaW5hbCBDb21tZW50IGNyZWF0ZUNvbW1lbnQoU3RyaW5nIGRhdGEpCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIGRhdGEKKyAgICoKKyAgICogQHJldHVybgorICAgKgorICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkRvY3VtZW50CisgICAqLworICBwdWJsaWMgZmluYWwgQ0RBVEFTZWN0aW9uIGNyZWF0ZUNEQVRBU2VjdGlvbihTdHJpbmcgZGF0YSkKKyAgICAgICAgICB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIHRhcmdldAorICAgKiBAcGFyYW0gZGF0YQorICAgKgorICAgKiBAcmV0dXJuCisgICAqCisgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCisgICAqIEBzZWUgb3JnLnczYy5kb20uRG9jdW1lbnQKKyAgICovCisgIHB1YmxpYyBmaW5hbCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKAorICAgICAgICAgIFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIG5hbWUKKyAgICoKKyAgICogQHJldHVybgorICAgKgorICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkRvY3VtZW50CisgICAqLworICBwdWJsaWMgZmluYWwgQXR0ciBjcmVhdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24KKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gbmFtZQorICAgKgorICAgKiBAcmV0dXJuCisgICAqCisgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCisgICAqIEBzZWUgb3JnLnczYy5kb20uRG9jdW1lbnQKKyAgICovCisgIHB1YmxpYyBmaW5hbCBFbnRpdHlSZWZlcmVuY2UgY3JlYXRlRW50aXR5UmVmZXJlbmNlKFN0cmluZyBuYW1lKQorICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb24KKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gdGFnbmFtZQorICAgKgorICAgKiBAcmV0dXJuCisgICAqIEBzZWUgb3JnLnczYy5kb20uRG9jdW1lbnQKKyAgICovCisgIHB1YmxpYyBmaW5hbCBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgdGFnbmFtZSkKKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gaW1wb3J0ZWROb2RlCisgICAqIEBwYXJhbSBkZWVwCisgICAqCisgICAqIEByZXR1cm4KKyAgICoKKyAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBhcyBvZiBET00gTGV2ZWwgMiAtLSBEVE1Ob2RlUHJveHkgaXMgcmVhZC1vbmx5CisgICAqLworICBwdWJsaWMgZmluYWwgTm9kZSBpbXBvcnROb2RlKE5vZGUgaW1wb3J0ZWROb2RlLCBib29sZWFuIGRlZXApCisgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbgorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCisgICAqIEBwYXJhbSBxdWFsaWZpZWROYW1lCisgICAqCisgICAqIEByZXR1cm4KKyAgICoKKyAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBhcyBvZiBET00gTGV2ZWwgMgorICAgKi8KKyAgcHVibGljIGZpbmFsIEVsZW1lbnQgY3JlYXRlRWxlbWVudE5TKAorICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQorICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQorICAgKgorICAgKiBAcmV0dXJuCisgICAqCisgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCisgICAqIEBzZWUgb3JnLnczYy5kb20uRG9jdW1lbnQgYXMgb2YgRE9NIExldmVsIDIKKyAgICovCisgIHB1YmxpYyBmaW5hbCBBdHRyIGNyZWF0ZUF0dHJpYnV0ZU5TKAorICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQorICAgKiBAcGFyYW0gbG9jYWxOYW1lCisgICAqCisgICAqIEByZXR1cm4KKyAgICogQHNlZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBhcyBvZiBET00gTGV2ZWwgMgorICAgKi8KKyAgcHVibGljIGZpbmFsIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwKKyAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lKQorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEBwYXJhbSBlbGVtZW50SWQKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkRvY3VtZW50IGFzIG9mIERPTSBMZXZlbCAyCisgICAqLworICBwdWJsaWMgZmluYWwgRWxlbWVudCBnZXRFbGVtZW50QnlJZChTdHJpbmcgZWxlbWVudElkKQorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEBwYXJhbSBvZmZzZXQKKyAgICoKKyAgICogQHJldHVybgorICAgKgorICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgKiBAc2VlIG9yZy53M2MuZG9tLlRleHQKKyAgICovCisgIHB1YmxpYyBmaW5hbCBUZXh0IHNwbGl0VGV4dChpbnQgb2Zmc2V0KSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHJldHVybgorICAgKgorICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGEKKyAgICovCisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24KKyAgeworICAgIHJldHVybiBkdG0uZ2V0Tm9kZVZhbHVlKG5vZGUpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEBwYXJhbSBkYXRhCisgICAqCisgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCisgICAqIEBzZWUgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YQorICAgKi8KKyAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbgorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEByZXR1cm4KKyAgICogQHNlZSBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhCisgICAqLworICBwdWJsaWMgZmluYWwgaW50IGdldExlbmd0aCgpCisgIHsKKworICAgIC8vICUlRklYOiBUaGlzIHNob3VsZCBkbyBzb21ldGhpbmcgc21hcnRlcj8KKyAgICByZXR1cm4gZHRtLmdldE5vZGVWYWx1ZShub2RlKS5sZW5ndGgoKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gb2Zmc2V0CisgICAqIEBwYXJhbSBjb3VudAorICAgKgorICAgKiBAcmV0dXJuCisgICAqCisgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCisgICAqIEBzZWUgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YQorICAgKi8KKyAgcHVibGljIGZpbmFsIFN0cmluZyBzdWJzdHJpbmdEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbgorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEBwYXJhbSBhcmcKKyAgICoKKyAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICogQHNlZSBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhCisgICAqLworICBwdWJsaWMgZmluYWwgdm9pZCBhcHBlbmREYXRhKFN0cmluZyBhcmcpIHRocm93cyBET01FeGNlcHRpb24KKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gb2Zmc2V0CisgICAqIEBwYXJhbSBhcmcKKyAgICoKKyAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICogQHNlZSBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhCisgICAqLworICBwdWJsaWMgZmluYWwgdm9pZCBpbnNlcnREYXRhKGludCBvZmZzZXQsIFN0cmluZyBhcmcpIHRocm93cyBET01FeGNlcHRpb24KKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gb2Zmc2V0CisgICAqIEBwYXJhbSBjb3VudAorICAgKgorICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGEKKyAgICovCisgIHB1YmxpYyBmaW5hbCB2b2lkIGRlbGV0ZURhdGEoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIG9mZnNldAorICAgKiBAcGFyYW0gY291bnQKKyAgICogQHBhcmFtIGFyZworICAgKgorICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGEKKyAgICovCisgIHB1YmxpYyBmaW5hbCB2b2lkIHJlcGxhY2VEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCwgU3RyaW5nIGFyZykKKyAgICAgICAgICB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQKKyAgICovCisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VGFnTmFtZSgpCisgIHsKKyAgICByZXR1cm4gZHRtLmdldE5vZGVOYW1lKG5vZGUpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEBwYXJhbSBuYW1lCisgICAqCisgICAqIEByZXR1cm4KKyAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50CisgICAqLworICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkKKyAgeworCisgICAgRFRNTmFtZWROb2RlTWFwICBtYXAgPSBuZXcgRFRNTmFtZWROb2RlTWFwKGR0bSwgbm9kZSk7CisgICAgTm9kZSBub2RlID0gbWFwLmdldE5hbWVkSXRlbShuYW1lKTsKKyAgICByZXR1cm4gKG51bGwgPT0gbm9kZSkgPyBudWxsIDogbm9kZS5nZXROb2RlVmFsdWUoKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gbmFtZQorICAgKiBAcGFyYW0gdmFsdWUKKyAgICoKKyAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50CisgICAqLworICBwdWJsaWMgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgICB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIG5hbWUKKyAgICoKKyAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50CisgICAqLworICBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24KKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gbmFtZQorICAgKgorICAgKiBAcmV0dXJuCisgICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudAorICAgKi8KKyAgcHVibGljIGZpbmFsIEF0dHIgZ2V0QXR0cmlidXRlTm9kZShTdHJpbmcgbmFtZSkKKyAgeworCisgICAgRFRNTmFtZWROb2RlTWFwICBtYXAgPSBuZXcgRFRNTmFtZWROb2RlTWFwKGR0bSwgbm9kZSk7CisgICAgcmV0dXJuIChBdHRyKW1hcC5nZXROYW1lZEl0ZW0obmFtZSk7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIG5ld0F0dHIKKyAgICoKKyAgICogQHJldHVybgorICAgKgorICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQKKyAgICovCisgIHB1YmxpYyBmaW5hbCBBdHRyIHNldEF0dHJpYnV0ZU5vZGUoQXR0ciBuZXdBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIG9sZEF0dHIKKyAgICoKKyAgICogQHJldHVybgorICAgKgorICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQKKyAgICovCisgIHB1YmxpYyBmaW5hbCBBdHRyIHJlbW92ZUF0dHJpYnV0ZU5vZGUoQXR0ciBvbGRBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICogSW50cm9kdWNlZCBpbiBET00gTGV2ZWwgMi4KKyAgICoKKyAgICogQHJldHVybgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKiogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50ICovCisgIHB1YmxpYyBmaW5hbCB2b2lkIG5vcm1hbGl6ZSgpCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQorICAgKiBAcGFyYW0gbG9jYWxOYW1lCisgICAqCisgICAqIEByZXR1cm4KKyAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50CisgICAqLworICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQorICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQorICAgKiBAcGFyYW0gdmFsdWUKKyAgICoKKyAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50CisgICAqLworICBwdWJsaWMgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGVOUygKKyAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbgorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKKyAgICogQHBhcmFtIGxvY2FsTmFtZQorICAgKgorICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQKKyAgICovCisgIHB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpCisgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbgorICB7CisgICAgdGhyb3cgbmV3IERUTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKKyAgICogQHBhcmFtIGxvY2FsTmFtZQorICAgKgorICAgKiBAcmV0dXJuCisgICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudAorICAgKi8KKyAgcHVibGljIGZpbmFsIEF0dHIgZ2V0QXR0cmlidXRlTm9kZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpCisgIHsKKyAgICB0aHJvdyBuZXcgRFRNRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUik7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIG5ld0F0dHIKKyAgICoKKyAgICogQHJldHVybgorICAgKgorICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQKKyAgICovCisgIHB1YmxpYyBmaW5hbCBBdHRyIHNldEF0dHJpYnV0ZU5vZGVOUyhBdHRyIG5ld0F0dHIpIHRocm93cyBET01FeGNlcHRpb24KKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcmV0dXJuCisgICAqIEBzZWUgb3JnLnczYy5kb20uQXR0cgorICAgKi8KKyAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkKKyAgeworICAgIHJldHVybiBkdG0uZ2V0Tm9kZU5hbWUobm9kZSk7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkF0dHIKKyAgICovCisgIHB1YmxpYyBmaW5hbCBib29sZWFuIGdldFNwZWNpZmllZCgpCisgIHsKKworICAgIC8vICUlRklYCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHJldHVybgorICAgKiBAc2VlIG9yZy53M2MuZG9tLkF0dHIKKyAgICovCisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VmFsdWUoKQorICB7CisgICAgcmV0dXJuIGR0bS5nZXROb2RlVmFsdWUobm9kZSArIDEpOworICB9CisKKyAgLyoqCisgICAqCisgICAqIEBwYXJhbSB2YWx1ZQorICAgKiBAc2VlIG9yZy53M2MuZG9tLkF0dHIKKyAgICovCisgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkKKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG93bmVyIGVsZW1lbnQgb2YgYW4gYXR0cmlidXRlLgorICAgKgorICAgKiBAcmV0dXJuCisgICAqIEBzZWUgb3JnLnczYy5kb20uQXR0ciBhcyBvZiBET00gTGV2ZWwgMgorICAgKi8KKyAgcHVibGljIGZpbmFsIEVsZW1lbnQgZ2V0T3duZXJFbGVtZW50KCkKKyAgeworICAgIHRocm93IG5ldyBEVE1FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSKTsKKyAgfQorCisgIC8qKgorICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KKyAgICogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIERPTUV4Y2VwdGlvbi4KKyAgICovCisgIHB1YmxpYyBjbGFzcyBEVE1FeGNlcHRpb24gZXh0ZW5kcyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KKyAgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIERPTS9EVE0gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvZGUKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBEVE1FeGNlcHRpb24oc2hvcnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UpCisgICAgeworICAgICAgc3VwZXIoY29kZSwgbWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgRFRNRXhjZXB0aW9uCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2RlCisgICAgICovCisgICAgcHVibGljIERUTUV4Y2VwdGlvbihzaG9ydCBjb2RlKQorICAgIHsKKyAgICAgIHN1cGVyKGNvZGUsICIiKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNU2FmZVN0cmluZ1Bvb2wuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNU2FmZVN0cmluZ1Bvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzM3NDdjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9EVE1TYWZlU3RyaW5nUG9vbC5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJYZXJjZXMiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKKyAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKKyAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBJbnRlcm5hdGlvbmFsCisgKiBCdXNpbmVzcyBNYWNoaW5lcywgSW5jLiwgaHR0cDovL3d3dy5hcGFjaGUub3JnLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuZHRtOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLkludFZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKiogPHA+TGlrZSBEVE1TdHJpbmdQb29sLCBidXQgdGhyZWFkc2FmZS4gSXQncyBiZWVuIHByb3Bvc2VkIHRoYXQgRFRNcworICogc2hhcmUgdGhlaXIgc3RyaW5nIHBvb2wocyk7IHRoYXQgcmFpc2VzIHRocmVhZHNhZmV0eSBpc3N1ZXMgd2hpY2gKKyAqIHRoaXMgYWRkcmVzc2VzLiBPZiBjb3Vyc2UgcGVyZm9ybWFuY2UgaXMgaW5mZXJpb3IgdG8gdGhhdCBvZiB0aGUKKyAqIGJhcmUtYm9uZXMgdmVyc2lvbi48L3A+CisgKgorICogPHA+U3RhdHVzOiBQYXNzZWQgYmFzaWMgdGVzdCBpbiBtYWluKCkuPC9wPgorICogKi8KK3B1YmxpYyBjbGFzcyBEVE1TYWZlU3RyaW5nUG9vbAorZXh0ZW5kcyBEVE1TdHJpbmdQb29sCit7CisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBbGxFbGVtZW50cygpCisgICAgeworICAgICAgc3VwZXIucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICB9CisKKyAgLyoqIEByZXR1cm4gc3RyaW5nIHdob3NlIHZhbHVlIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgdGhpcyBpbnRlZ2VyIGluZGV4LgorICAgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICogIGlmIGluZGV4IGRvZXNuJ3QgbWFwIHRvIGEgc3RyaW5nLgorICAgKiAqLyAKKyAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgaW5kZXhUb1N0cmluZyhpbnQgaSkKKyAgICB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBzdXBlci5pbmRleFRvU3RyaW5nKGkpOworICAgIH0KKworICAvKiogQHJldHVybiBpbnRlZ2VyIGluZGV4IHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIHN0cmluZy4gKi8gCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHN0cmluZ1RvSW5kZXgoU3RyaW5nIHMpCisgICAgeworICAgICAgcmV0dXJuIHN1cGVyLnN0cmluZ1RvSW5kZXgocyk7CisgICAgfQorCisgIC8qKiBDb21tYW5kLWxpbmUgdW5pdCB0ZXN0IGRyaXZlci4gVGhpcyB0ZXN0IHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0CisgICAqIHRoaXMgdmVyc2lvbiBvZiB0aGUgcG9vbCBhc3NpZ25zIGluZGljZXMgY29uc2VjdXRpdmVseSwgc3RhcnRpbmcKKyAgICogZnJvbSB6ZXJvLCBhcyBuZXcgdW5pcXVlIHN0cmluZ3MgYXJlIGVuY291bnRlcmVkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgeworICAgIFN0cmluZ1tdIHdvcmQ9eworICAgICAgIlplcm8iLCJPbmUiLCJUd28iLCJUaHJlZSIsIkZvdXIiLCJGaXZlIiwKKyAgICAgICJTaXgiLCJTZXZlbiIsIkVpZ2h0IiwiTmluZSIsIlRlbiIsCisgICAgICAiRWxldmVuIiwiVHdlbHZlIiwiVGhpcnRlZW4iLCJGb3VydGVlbiIsIkZpZnRlZW4iLAorICAgICAgIlNpeHRlZW4iLCJTZXZlbnRlZW4iLCJFaWdodGVlbiIsIk5pbmV0ZWVuIiwiVHdlbnR5IiwKKyAgICAgICJUd2VudHktT25lIiwiVHdlbnR5LVR3byIsIlR3ZW50eS1UaHJlZSIsIlR3ZW50eS1Gb3VyIiwKKyAgICAgICJUd2VudHktRml2ZSIsIlR3ZW50eS1TaXgiLCJUd2VudHktU2V2ZW4iLCJUd2VudHktRWlnaHQiLAorICAgICAgIlR3ZW50eS1OaW5lIiwiVGhpcnR5IiwiVGhpcnR5LU9uZSIsIlRoaXJ0eS1Ud28iLAorICAgICAgIlRoaXJ0eS1UaHJlZSIsIlRoaXJ0eS1Gb3VyIiwiVGhpcnR5LUZpdmUiLCJUaGlydHktU2l4IiwKKyAgICAgICJUaGlydHktU2V2ZW4iLCJUaGlydHktRWlnaHQiLCJUaGlydHktTmluZSJ9OworCisgICAgRFRNU3RyaW5nUG9vbCBwb29sPW5ldyBEVE1TYWZlU3RyaW5nUG9vbCgpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJJZiBubyBjb21wbGFpbnRzIGFyZSBwcmludGVkIGJlbG93LCB3ZSBwYXNzZWQgaW5pdGlhbCB0ZXN0LiIpOworCisgICAgZm9yKGludCBwYXNzPTA7cGFzczw9MTsrK3Bhc3MpCisgICAgICB7CisJaW50IGk7CisKKwlmb3IoaT0wO2k8d29yZC5sZW5ndGg7KytpKQorCSAgeworCSAgICBpbnQgaj1wb29sLnN0cmluZ1RvSW5kZXgod29yZFtpXSk7CisJICAgIGlmKGohPWkpCisJICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdE1pc21hdGNoIHBvcHVsYXRpbmcgcG9vbDogYXNzaWduZWQgIisKKwkJCQkgaisiIGZvciBjcmVhdGUgIitpKTsKKwkgIH0KKworCWZvcihpPTA7aTx3b3JkLmxlbmd0aDsrK2kpCisJICB7CisJICAgIGludCBqPXBvb2wuc3RyaW5nVG9JbmRleCh3b3JkW2ldKTsKKwkgICAgaWYoaiE9aSkKKwkgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0TWlzbWF0Y2ggaW4gc3RyaW5nVG9JbmRleDogcmV0dXJuZWQgIisKKwkJCQkgaisiIGZvciBsb29rdXAgIitpKTsKKwkgIH0KKworCWZvcihpPTA7aTx3b3JkLmxlbmd0aDsrK2kpCisJICB7CisJICAgIFN0cmluZyB3PXBvb2wuaW5kZXhUb1N0cmluZyhpKTsKKwkgICAgaWYoIXdvcmRbaV0uZXF1YWxzKHcpKQorCSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRNaXNtYXRjaCBpbiBpbmRleFRvU3RyaW5nOiByZXR1cm5lZCIrCisJCQkJIHcrIiBmb3IgbG9va3VwICIraSk7CisJICB9CisJCisJcG9vbC5yZW1vdmVBbGxFbGVtZW50cygpOworCQorCVN5c3RlbS5vdXQucHJpbnRsbigiXG5QYXNzICIrcGFzcysiIGNvbXBsZXRlXG4iKTsKKyAgICAgIH0gLy8gZW5kIHBhc3MgbG9vcAorICB9Cit9IC8vIERUTVNhZmVTdHJpbmdQb29sCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTVN0cmluZ1Bvb2wuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNU3RyaW5nUG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOTdkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTVN0cmluZ1Bvb2wuamF2YQpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiWGVyY2VzIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0CisgKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgSW50ZXJuYXRpb25hbAorICogQnVzaW5lc3MgTWFjaGluZXMsIEluYy4sIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5JbnRWZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqIDxwPkRUTVN0cmluZ1Bvb2wgaXMgYW4gImludGVybmluZyIgbWVjaGFuaXNtIGZvciBzdHJpbmdzLiBJdCB3aWxsCisgKiBjcmVhdGUgYSBzdGFibGUgMToxIG1hcHBpbmcgYmV0d2VlbiBhIHNldCBvZiBzdHJpbmcgdmFsdWVzIGFuZCBhIHNldCBvZgorICogaW50ZWdlciBpbmRleCB2YWx1ZXMsIHNvIHRoZSBpbnRlZ2VycyBjYW4gYmUgdXNlZCB0byByZWxpYWJseSBhbmQKKyAqIHVuaXF1ZWx5IGlkZW50aWZ5IChhbmQgd2hlbiBuZWNlc3NhcnkgcmV0cmlldmUpIHRoZSBzdHJpbmdzLjwvcD4KKyAqCisgKiA8cD5EZXNpZ24gUHJpb3JpdGllczoKKyAqIDx1bD4KKyAqIDxsaT5TdHJpbmctdG8taW5kZXggbG9va3VwIHNwZWVkIGlzIGNyaXRpY2FsLjwvbGk+CisgKiA8bGk+SW5kZXgtdG8tU3RyaW5nIGxvb2t1cCBzcGVlZCBpcyBzbGlnaHRseSBsZXNzIHNvLjwvbGk+CisgKiA8bGk+VGhyZWFkc2FmZXR5IGlzIG5vdCBndWFyYW50ZWVkIGF0IHRoaXMgbGV2ZWwuCisgKiBFbmZvcmNlIHRoYXQgaW4gdGhlIGFwcGxpY2F0aW9uIGlmIG5lZWRlZC48L2xpPgorICogPGxpPlN0b3JhZ2UgZWZmaWNpZW5jeSBpcyBhbiBpc3N1ZSBidXQgbm90IGEgaHVnZSBvbmUuCisgKiBJdCBpcyBleHBlY3RlZCB0aGF0IHN0cmluZyBwb29scyB3b24ndCBleGNlZWQgYWJvdXQgMjAwMCBlbnRyaWVzLjwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIDxwPkltcGxlbWVudGF0aW9uIGRldGFpbDogQSBzdGFuZGFyZCBIYXNodGFibGUgaXMgcmVsYXRpdmVseQorICogaW5lZmZpY2llbnQgd2hlbiBsb29raW5nIHVwIHByaW1pdGl2ZSBpbnQgdmFsdWVzLCBlc3BlY2lhbGx5IHdoZW4KKyAqIHdlJ3JlIGFscmVhZHkgbWFpbnRhaW5pbmcgYW4gaW50LXRvLXN0cmluZyB2ZWN0b3IuICBTbyBJJ20KKyAqIG1haW50YWluaW5nIGEgc2ltcGxlIGhhc2ggY2hhaW4gd2l0aGluIHRoaXMgY2xhc3MuPC9wPgorICoKKyAqIDxwPk5PVEU6IFRoZXJlIGlzIG5vdGhpbmcgaW4gdGhlIGNvZGUgdGhhdCBoYXMgYSByZWFsIGRlcGVuZGVuY3kgdXBvbgorICogU3RyaW5nLiBJdCB3b3VsZCB3b3JrIHdpdGggYW55IG9iamVjdCB0eXBlIHRoYXQgaW1wbGVtZW50cyByZWxpYWJsZQorICogLmhhc2hDb2RlKCkgYW5kIC5lcXVhbHMoKSBvcGVyYXRpb25zLiBUaGUgQVBJIGVuZm9yY2VzIFN0cmluZ3MgYmVjYXVzZQorICogaXQncyBzYWZlciB0aGF0IHdheSwgYnV0IHRoaXMgY291bGQgdHJpdmlhbGx5IGJlIHR1cm5lZCBpbnRvIGEgZ2VuZXJhbAorICogT2JqZWN0UG9vbCBpZiBvbmUgd2FzIG5lZWRlZC48L3A+CisgKgorICogPHA+U3RhdHVzOiBQYXNzZWQgYmFzaWMgdGVzdCBpbiBtYWluKCkuPC9wPgorICogKi8KK3B1YmxpYyBjbGFzcyBEVE1TdHJpbmdQb29sCit7CisgIFZlY3RvciBtX2ludFRvU3RyaW5nOworICBzdGF0aWMgZmluYWwgaW50IEhBU0hQUklNRT0xMDE7CisgIGludFtdIG1faGFzaFN0YXJ0PW5ldyBpbnRbSEFTSFBSSU1FXTsKKyAgSW50VmVjdG9yIG1faGFzaENoYWluOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVUxMPS0xOworCisgIHB1YmxpYyBEVE1TdHJpbmdQb29sKCkKKyAgICB7CisgICAgICBtX2ludFRvU3RyaW5nPW5ldyBWZWN0b3IoKTsKKyAgICAgIG1faGFzaENoYWluPW5ldyBJbnRWZWN0b3IoKTsKKyAgICAgIHJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgICAKKyAgICAgIC8vIC1zYiBBZGQgdGhpcyB0byBmb3JjZSBlbXB0eSBzdHJpbmdzIHRvIGJlIGluZGV4IDAuCisgICAgICBzdHJpbmdUb0luZGV4KCIiKTsKKyAgICB9CisgIAorICBwdWJsaWMgdm9pZCByZW1vdmVBbGxFbGVtZW50cygpCisgICAgeworICAgICAgbV9pbnRUb1N0cmluZy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgICAgZm9yKGludCBpPTA7aTxIQVNIUFJJTUU7KytpKQorICAgICAgICBtX2hhc2hTdGFydFtpXT1OVUxMOworICAgICAgbV9oYXNoQ2hhaW4ucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICB9CisKKyAgLyoqIEByZXR1cm4gc3RyaW5nIHdob3NlIHZhbHVlIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgdGhpcyBpbnRlZ2VyIGluZGV4LgorICAgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICogIGlmIGluZGV4IGRvZXNuJ3QgbWFwIHRvIGEgc3RyaW5nLgorICAgKiAqLyAKKyAgcHVibGljIFN0cmluZyBpbmRleFRvU3RyaW5nKGludCBpKQorICAgIHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgeworICAgICAgaWYoaT09TlVMTCkgcmV0dXJuIG51bGw7CisgICAgICByZXR1cm4gKFN0cmluZykgbV9pbnRUb1N0cmluZy5lbGVtZW50QXQoaSk7CisgICAgfQorCisgIC8qKiBAcmV0dXJuIGludGVnZXIgaW5kZXggdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhlIHZhbHVlIG9mIHRoaXMgc3RyaW5nLiAqLyAKKyAgcHVibGljIGludCBzdHJpbmdUb0luZGV4KFN0cmluZyBzKQorICAgIHsKKyAgICAgIGlmKHM9PW51bGwpIHJldHVybiBOVUxMOworICAgICAgCisgICAgICBpbnQgaGFzaHNsb3Q9cy5oYXNoQ29kZSgpJUhBU0hQUklNRTsKKyAgICAgIGlmKGhhc2hzbG90PDApIGhhc2hzbG90PS1oYXNoc2xvdDsKKworICAgICAgLy8gSXMgaXQgb25lIHdlIGFscmVhZHkga25vdz8KKyAgICAgIGludCBoYXNobGFzdD1tX2hhc2hTdGFydFtoYXNoc2xvdF07CisgICAgICBpbnQgaGFzaGNhbmRpZGF0ZT1oYXNobGFzdDsKKyAgICAgIHdoaWxlKGhhc2hjYW5kaWRhdGUhPU5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZihtX2ludFRvU3RyaW5nLmVsZW1lbnRBdChoYXNoY2FuZGlkYXRlKS5lcXVhbHMocykpCisgICAgICAgICAgICByZXR1cm4gaGFzaGNhbmRpZGF0ZTsKKworICAgICAgICAgIGhhc2hsYXN0PWhhc2hjYW5kaWRhdGU7CisgICAgICAgICAgaGFzaGNhbmRpZGF0ZT1tX2hhc2hDaGFpbi5lbGVtZW50QXQoaGFzaGNhbmRpZGF0ZSk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgLy8gTmV3IHZhbHVlLiBBZGQgdG8gdGFibGVzLgorICAgICAgaW50IG5ld0luZGV4PW1faW50VG9TdHJpbmcuc2l6ZSgpOworICAgICAgbV9pbnRUb1N0cmluZy5hZGRFbGVtZW50KHMpOworCisgICAgICBtX2hhc2hDaGFpbi5hZGRFbGVtZW50KE5VTEwpOwkvLyBJbml0aWFsaXplIHRvIG5vLWZvbGxvd2luZy1zYW1lLWhhc2gKKyAgICAgIGlmKGhhc2hsYXN0PT1OVUxMKSAgLy8gRmlyc3QgZm9yIHRoaXMgaGFzaAorICAgICAgICBtX2hhc2hTdGFydFtoYXNoc2xvdF09bmV3SW5kZXg7CisgICAgICBlbHNlIC8vIExpbmsgZnJvbSBwcmV2aW91cyB3aXRoIHNhbWUgaGFzaAorICAgICAgICBtX2hhc2hDaGFpbi5zZXRFbGVtZW50QXQobmV3SW5kZXgsaGFzaGxhc3QpOworCisgICAgICByZXR1cm4gbmV3SW5kZXg7CisgICAgfQorCisgIC8qKiBDb21tYW5kLWxpbmUgdW5pdCB0ZXN0IGRyaXZlci4gVGhpcyB0ZXN0IHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0CisgICAqIHRoaXMgdmVyc2lvbiBvZiB0aGUgcG9vbCBhc3NpZ25zIGluZGljZXMgY29uc2VjdXRpdmVseSwgc3RhcnRpbmcKKyAgICogZnJvbSB6ZXJvLCBhcyBuZXcgdW5pcXVlIHN0cmluZ3MgYXJlIGVuY291bnRlcmVkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgeworICAgIFN0cmluZ1tdIHdvcmQ9eworICAgICAgIlplcm8iLCJPbmUiLCJUd28iLCJUaHJlZSIsIkZvdXIiLCJGaXZlIiwKKyAgICAgICJTaXgiLCJTZXZlbiIsIkVpZ2h0IiwiTmluZSIsIlRlbiIsCisgICAgICAiRWxldmVuIiwiVHdlbHZlIiwiVGhpcnRlZW4iLCJGb3VydGVlbiIsIkZpZnRlZW4iLAorICAgICAgIlNpeHRlZW4iLCJTZXZlbnRlZW4iLCJFaWdodGVlbiIsIk5pbmV0ZWVuIiwiVHdlbnR5IiwKKyAgICAgICJUd2VudHktT25lIiwiVHdlbnR5LVR3byIsIlR3ZW50eS1UaHJlZSIsIlR3ZW50eS1Gb3VyIiwKKyAgICAgICJUd2VudHktRml2ZSIsIlR3ZW50eS1TaXgiLCJUd2VudHktU2V2ZW4iLCJUd2VudHktRWlnaHQiLAorICAgICAgIlR3ZW50eS1OaW5lIiwiVGhpcnR5IiwiVGhpcnR5LU9uZSIsIlRoaXJ0eS1Ud28iLAorICAgICAgIlRoaXJ0eS1UaHJlZSIsIlRoaXJ0eS1Gb3VyIiwiVGhpcnR5LUZpdmUiLCJUaGlydHktU2l4IiwKKyAgICAgICJUaGlydHktU2V2ZW4iLCJUaGlydHktRWlnaHQiLCJUaGlydHktTmluZSJ9OworCisgICAgRFRNU3RyaW5nUG9vbCBwb29sPW5ldyBEVE1TdHJpbmdQb29sKCk7CisKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklmIG5vIGNvbXBsYWludHMgYXJlIHByaW50ZWQgYmVsb3csIHdlIHBhc3NlZCBpbml0aWFsIHRlc3QuIik7CisKKyAgICBmb3IoaW50IHBhc3M9MDtwYXNzPD0xOysrcGFzcykKKyAgICAgIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yKGk9MDtpPHdvcmQubGVuZ3RoOysraSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgaj1wb29sLnN0cmluZ1RvSW5kZXgod29yZFtpXSk7CisgICAgICAgICAgICBpZihqIT1pKQorICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0TWlzbWF0Y2ggcG9wdWxhdGluZyBwb29sOiBhc3NpZ25lZCAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaisiIGZvciBjcmVhdGUgIitpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgZm9yKGk9MDtpPHdvcmQubGVuZ3RoOysraSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgaj1wb29sLnN0cmluZ1RvSW5kZXgod29yZFtpXSk7CisgICAgICAgICAgICBpZihqIT1pKQorICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0TWlzbWF0Y2ggaW4gc3RyaW5nVG9JbmRleDogcmV0dXJuZWQgIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorIiBmb3IgbG9va3VwICIraSk7CisgICAgICAgICAgfQorCisgICAgICAgIGZvcihpPTA7aTx3b3JkLmxlbmd0aDsrK2kpCisgICAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHc9cG9vbC5pbmRleFRvU3RyaW5nKGkpOworICAgICAgICAgICAgaWYoIXdvcmRbaV0uZXF1YWxzKHcpKQorICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0TWlzbWF0Y2ggaW4gaW5kZXhUb1N0cmluZzogcmV0dXJuZWQiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdysiIGZvciBsb29rdXAgIitpKTsKKyAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwb29sLnJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgICAgIAorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuUGFzcyAiK3Bhc3MrIiBjb21wbGV0ZVxuIik7CisgICAgICB9IC8vIGVuZCBwYXNzIGxvb3AKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9EVE1UcmVlV2Fsa2VyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTVRyZWVXYWxrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI4YjY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9EVE1UcmVlV2Fsa2VyLmphdmEKQEAgLTAsMCArMSw0MzMgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCisgKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKKworaW1wb3J0IG9yZy53M2MuZG9tLio7CisKK2ltcG9ydCBvcmcueG1sLnNheC4qOworaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLk5vZGVDb25zdW1lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmc7CisKKy8qKgorICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImFkdmFuY2VkIi8+CisgKiBUaGlzIGNsYXNzIGRvZXMgYSBwcmUtb3JkZXIgd2FsayBvZiB0aGUgRFRNIHRyZWUsIGNhbGxpbmcgYSBDb250ZW50SGFuZGxlcgorICogaW50ZXJmYWNlIGFzIGl0IGdvZXMuCisgKiBJIHRoaW5rIG5vcm1hbGx5IHRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBuZWVkZWQsIGJlY2F1c2UgCisgKiBvZiBEVE0jZGlzcGF0Y2hUb0V2ZW50cy4KKyAqLworcHVibGljIGNsYXNzIERUTVRyZWVXYWxrZXIKK3sKKworICAvKiogTG9jYWwgcmVmZXJlbmNlIHRvIGEgQ29udGVudEhhbmRsZXIgICAgICAgICAgKi8KKyAgcHJpdmF0ZSBDb250ZW50SGFuZGxlciBtX2NvbnRlbnRIYW5kbGVyID0gbnVsbDsKKworICAvKiogRG9tSGVscGVyIGZvciB0aGlzIFRyZWVXYWxrZXIgICAgICAgICAgKi8KKyAgcHJvdGVjdGVkIERUTSBtX2R0bTsKKyAgCisgIC8qKgorICAgKiBTZXQgdGhlIERUTSB0byBiZSB0cmF2ZXJzZWQuCisgICAqIAorICAgKiBAcGFyYW0gZHRtIFRoZSBEb2N1bWVudCBUYWJsZSBNb2RlbCB0byBiZSB1c2VkLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RFRNKERUTSBkdG0pCisgIHsKKyAgICBtX2R0bSA9IGR0bTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIENvbnRlbnRIYW5kbGVyIHVzZWQgZm9yIHRoZSB0cmVlIHdhbGsuCisgICAqCisgICAqIEByZXR1cm4gdGhlIENvbnRlbnRIYW5kbGVyIHVzZWQgZm9yIHRoZSB0cmVlIHdhbGsKKyAgICovCisgIHB1YmxpYyBDb250ZW50SGFuZGxlciBnZXRjb250ZW50SGFuZGxlcigpCisgIHsKKyAgICByZXR1cm4gbV9jb250ZW50SGFuZGxlcjsKKyAgfQorICAKKyAgLyoqCisgICAqIFNldCB0aGUgQ29udGVudEhhbmRsZXIgdXNlZCBmb3IgdGhlIHRyZWUgd2Fsay4KKyAgICoKKyAgICogQHBhcmFtIGNoIHRoZSBDb250ZW50SGFuZGxlciB0byBiZSB0aGUgcmVzdWx0IG9mIHRoZSB0cmVlIHdhbGsuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRjb250ZW50SGFuZGxlcihDb250ZW50SGFuZGxlciBjaCkKKyAgeworICAgIG1fY29udGVudEhhbmRsZXIgPSBjaDsKKyAgfQorCisgIAorICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqIEBwYXJhbSAgIGNvbnRlbnRIYW5kbGVyIFRoZSBpbXBsZW1lbnRpb24gb2YgdGhlCisgICAqIGNvbnRlbnRIYW5kbGVyIG9wZXJhdGlvbiAodG9YTUxTdHJpbmcsIGRpZ2VzdCwgLi4uKQorICAgKi8KKyAgcHVibGljIERUTVRyZWVXYWxrZXIoKQorICB7CisgIH0KKyAgCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICogQHBhcmFtICAgY29udGVudEhhbmRsZXIgVGhlIGltcGxlbWVudGlvbiBvZiB0aGUKKyAgICogY29udGVudEhhbmRsZXIgb3BlcmF0aW9uICh0b1hNTFN0cmluZywgZGlnZXN0LCAuLi4pCisgICAqLworICBwdWJsaWMgRFRNVHJlZVdhbGtlcihDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciwgRFRNIGR0bSkKKyAgeworICAgIHRoaXMubV9jb250ZW50SGFuZGxlciA9IGNvbnRlbnRIYW5kbGVyOworICAgIG1fZHRtID0gZHRtOworICB9CisgIAorICAvKioKKyAgICogUGVyZm9ybSBhIHByZS1vcmRlciB0cmF2ZXJzYWwgbm9uLXJlY3Vyc2l2ZSBzdHlsZS4KKyAgICoKKyAgICogQHBhcmFtIHBvcyBOb2RlIGluIHRoZSB0cmVlIHdoZXJlIHRvIHN0YXJ0IHRyYXZlcnNhbAorICAgKgorICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShpbnQgcG9zKSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGludCB0b3AgPSBwb3M7CisKKyAgICB3aGlsZSAoRFRNLk5VTEwgIT0gcG9zKQorICAgIHsKKyAgICAgIHN0YXJ0Tm9kZShwb3MpOworCisgICAgICBpbnQgbmV4dE5vZGUgPSBtX2R0bS5nZXRGaXJzdENoaWxkKHBvcyk7CisKKyAgICAgIHdoaWxlIChEVE0uTlVMTCA9PSBuZXh0Tm9kZSkKKyAgICAgIHsKKyAgICAgICAgZW5kTm9kZShwb3MpOworCisgICAgICAgIGlmICh0b3AgPT0gcG9zKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIG5leHROb2RlID0gbV9kdG0uZ2V0TmV4dFNpYmxpbmcocG9zKTsKKworICAgICAgICBpZiAoRFRNLk5VTEwgPT0gbmV4dE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICBwb3MgPSBtX2R0bS5nZXRQYXJlbnQocG9zKTsKKworICAgICAgICAgIGlmICgoRFRNLk5VTEwgPT0gcG9zKSB8fCAodG9wID09IHBvcykpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKERUTS5OVUxMICE9IHBvcykKKyAgICAgICAgICAgICAgZW5kTm9kZShwb3MpOworCisgICAgICAgICAgICBuZXh0Tm9kZSA9IERUTS5OVUxMOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcG9zID0gbmV4dE5vZGU7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFBlcmZvcm0gYSBwcmUtb3JkZXIgdHJhdmVyc2FsIG5vbi1yZWN1cnNpdmUgc3R5bGUuCisgICAqCisgICAqIEBwYXJhbSBwb3MgTm9kZSBpbiB0aGUgdHJlZSB3aGVyZSB0byBzdGFydCB0cmF2ZXJzYWwKKyAgICogQHBhcmFtIHRvcCBOb2RlIGluIHRoZSB0cmVlIHdoZXJlIHRvIGVuZCB0cmF2ZXJzYWwKKyAgICoKKyAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIHZvaWQgdHJhdmVyc2UoaW50IHBvcywgaW50IHRvcCkgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisKKyAgICB3aGlsZSAoRFRNLk5VTEwgIT0gcG9zKQorICAgIHsKKyAgICAgIHN0YXJ0Tm9kZShwb3MpOworCisgICAgICBpbnQgbmV4dE5vZGUgPSBtX2R0bS5nZXRGaXJzdENoaWxkKHBvcyk7CisKKyAgICAgIHdoaWxlIChEVE0uTlVMTCA9PSBuZXh0Tm9kZSkKKyAgICAgIHsKKyAgICAgICAgZW5kTm9kZShwb3MpOworCisgICAgICAgIGlmICgoRFRNLk5VTEwgIT0gdG9wKSAmJiB0b3AgPT0gcG9zKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIG5leHROb2RlID0gbV9kdG0uZ2V0TmV4dFNpYmxpbmcocG9zKTsKKworICAgICAgICBpZiAoRFRNLk5VTEwgPT0gbmV4dE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICBwb3MgPSBtX2R0bS5nZXRQYXJlbnQocG9zKTsKKworICAgICAgICAgIGlmICgoRFRNLk5VTEwgPT0gcG9zKSB8fCAoKERUTS5OVUxMICE9IHRvcCkgJiYgKHRvcCA9PSBwb3MpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBuZXh0Tm9kZSA9IERUTS5OVUxMOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcG9zID0gbmV4dE5vZGU7CisgICAgfQorICB9CisKKyAgLyoqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGZvbGxvd2luZyB0ZXh0IHRvIGJlIHByb2Nlc3NlZCBpcyByYXcgdGV4dCAgICAgICAgICAqLworICBib29sZWFuIG5leHRJc1JhdyA9IGZhbHNlOworICAKKyAgLyoqCisgICAqIE9wdGltaXplZCBkaXNwYXRjaCBvZiBjaGFyYWN0ZXJzLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCB2b2lkIGRpc3BhdGFjaENoYXJzKGludCBub2RlKQorICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICBtX2R0bS5kaXNwYXRjaENoYXJhY3RlcnNFdmVudHMobm9kZSwgbV9jb250ZW50SGFuZGxlcik7CisgIH0KKworICAvKioKKyAgICogU3RhcnQgcHJvY2Vzc2luZyBnaXZlbiBub2RlCisgICAqCisgICAqCisgICAqIEBwYXJhbSBub2RlIE5vZGUgdG8gcHJvY2VzcworICAgKgorICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgc3RhcnROb2RlKGludCBub2RlKSB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChtX2NvbnRlbnRIYW5kbGVyIGluc3RhbmNlb2YgTm9kZUNvbnN1bWVyKQorICAgIHsKKyAgICAgIC8vICVUQkQlCisvLyAgICAgICgoTm9kZUNvbnN1bWVyKSBtX2NvbnRlbnRIYW5kbGVyKS5zZXRPcmlnaW5hdGluZ05vZGUobm9kZSk7CisgICAgfQorCisgICAgc3dpdGNoIChtX2R0bS5nZXROb2RlVHlwZShub2RlKSkKKyAgICB7CisgICAgY2FzZSBEVE0uQ09NTUVOVF9OT0RFIDoKKyAgICB7CisgICAgICBYTUxTdHJpbmcgZGF0YSA9IG1fZHRtLmdldFN0cmluZ1ZhbHVlKG5vZGUpOworCisgICAgICBpZiAobV9jb250ZW50SGFuZGxlciBpbnN0YW5jZW9mIExleGljYWxIYW5kbGVyKQorICAgICAgeworICAgICAgICBMZXhpY2FsSGFuZGxlciBsaCA9ICgoTGV4aWNhbEhhbmRsZXIpIHRoaXMubV9jb250ZW50SGFuZGxlcik7CisgICAgICAgIGRhdGEuZGlzcGF0Y2hBc0NvbW1lbnQobGgpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIERUTS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFIDoKKworICAgICAgLy8gPz87CisgICAgICBicmVhazsKKyAgICBjYXNlIERUTS5ET0NVTUVOVF9OT0RFIDoKKyAgICAgIHRoaXMubV9jb250ZW50SGFuZGxlci5zdGFydERvY3VtZW50KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERUTS5FTEVNRU5UX05PREUgOgorICAgICAgRFRNIGR0bSA9IG1fZHRtOyAgICAgICAgICAgCisKKyAgICAgIGZvciAoaW50IG5zbiA9IGR0bS5nZXRGaXJzdE5hbWVzcGFjZU5vZGUobm9kZSwgdHJ1ZSk7IERUTS5OVUxMICE9IG5zbjsKKyAgICAgICAgICAgbnNuID0gZHRtLmdldE5leHROYW1lc3BhY2VOb2RlKG5vZGUsIG5zbiwgdHJ1ZSkpCisgICAgICB7CisgICAgICAgIC8vIFN0cmluZyBwcmVmaXggPSBkdG0uZ2V0UHJlZml4KG5zbik7CisgICAgICAgIFN0cmluZyBwcmVmaXggPSBkdG0uZ2V0Tm9kZU5hbWVYKG5zbik7CisKKyAgICAgICAgdGhpcy5tX2NvbnRlbnRIYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIGR0bS5nZXROb2RlVmFsdWUobnNuKSk7CisgICAgICAgIAorICAgICAgfQorCisgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1fZGguZ2V0TmFtZXNwYWNlT2ZOb2RlKG5vZGUpOiAiK21fZGguZ2V0TmFtZXNwYWNlT2ZOb2RlKG5vZGUpKTsKKyAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigibV9kaC5nZXRMb2NhbE5hbWVPZk5vZGUobm9kZSk6ICIrbV9kaC5nZXRMb2NhbE5hbWVPZk5vZGUobm9kZSkpOworICAgICAgU3RyaW5nIG5zID0gZHRtLmdldE5hbWVzcGFjZVVSSShub2RlKTsKKyAgICAgIGlmKG51bGwgPT0gbnMpCisgICAgICAgIG5zID0gIiI7CisgICAgICAgIAorICAgICAgLy8gJU9QVCUgISEKKyAgICAgIG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGwgYXR0cnMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbCgpOworICAgICAgICAgICAgICAKKyAgICAgIGZvciAoaW50IGkgPSBkdG0uZ2V0Rmlyc3RBdHRyaWJ1dGUobm9kZSk7IAorICAgICAgICAgICBpICE9IERUTS5OVUxMOyAKKyAgICAgICAgICAgaSA9IGR0bS5nZXROZXh0QXR0cmlidXRlKGkpKSAKKyAgICAgIHsKKyAgICAgICAgYXR0cnMuYWRkQXR0cmlidXRlKGR0bS5nZXROYW1lc3BhY2VVUkkoaSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRtLmdldExvY2FsTmFtZShpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG0uZ2V0Tm9kZU5hbWUoaSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEQVRBIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG0uZ2V0Tm9kZVZhbHVlKGkpKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgICAKKyAgICAgIHRoaXMubV9jb250ZW50SGFuZGxlci5zdGFydEVsZW1lbnQobnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHRtLmdldExvY2FsTmFtZShub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kdG0uZ2V0Tm9kZU5hbWUobm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFRNLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6CisgICAgeworICAgICAgU3RyaW5nIG5hbWUgPSBtX2R0bS5nZXROb2RlTmFtZShub2RlKTsKKworICAgICAgLy8gU3RyaW5nIGRhdGEgPSBwaS5nZXREYXRhKCk7CisgICAgICBpZiAobmFtZS5lcXVhbHMoInhzbHQtbmV4dC1pcy1yYXciKSkKKyAgICAgIHsKKyAgICAgICAgbmV4dElzUmF3ID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgdGhpcy5tX2NvbnRlbnRIYW5kbGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbihuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHRtLmdldE5vZGVWYWx1ZShub2RlKSk7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgRFRNLkNEQVRBX1NFQ1RJT05fTk9ERSA6CisgICAgeworICAgICAgYm9vbGVhbiBpc0xleEggPSAobV9jb250ZW50SGFuZGxlciBpbnN0YW5jZW9mIExleGljYWxIYW5kbGVyKTsKKyAgICAgIExleGljYWxIYW5kbGVyIGxoID0gaXNMZXhICisgICAgICAgICAgICAgICAgICAgICAgICAgID8gKChMZXhpY2FsSGFuZGxlcikgdGhpcy5tX2NvbnRlbnRIYW5kbGVyKSA6IG51bGw7CisKKyAgICAgIGlmIChpc0xleEgpCisgICAgICB7CisgICAgICAgIGxoLnN0YXJ0Q0RBVEEoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZGlzcGF0YWNoQ2hhcnMobm9kZSk7CisKKyAgICAgIHsKKyAgICAgICAgaWYgKGlzTGV4SCkKKyAgICAgICAgeworICAgICAgICAgIGxoLmVuZENEQVRBKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBEVE0uVEVYVF9OT0RFIDoKKyAgICB7CisgICAgICBpZiAobmV4dElzUmF3KQorICAgICAgeworICAgICAgICBuZXh0SXNSYXcgPSBmYWxzZTsKKworICAgICAgICBtX2NvbnRlbnRIYW5kbGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbihqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdC5QSV9ESVNBQkxFX09VVFBVVF9FU0NBUElORywgIiIpOworICAgICAgICBkaXNwYXRhY2hDaGFycyhub2RlKTsKKyAgICAgICAgbV9jb250ZW50SGFuZGxlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQuUElfRU5BQkxFX09VVFBVVF9FU0NBUElORywgIiIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBkaXNwYXRhY2hDaGFycyhub2RlKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBEVE0uRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKKyAgICB7CisgICAgICBpZiAobV9jb250ZW50SGFuZGxlciBpbnN0YW5jZW9mIExleGljYWxIYW5kbGVyKQorICAgICAgeworICAgICAgICAoKExleGljYWxIYW5kbGVyKSB0aGlzLm1fY29udGVudEhhbmRsZXIpLnN0YXJ0RW50aXR5KAorICAgICAgICAgIG1fZHRtLmdldE5vZGVOYW1lKG5vZGUpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKworICAgICAgICAvLyB3YXJuaW5nKCJDYW4gbm90IG91dHB1dCBlbnRpdHkgdG8gYSBwdXJlIFNBWCBDb250ZW50SGFuZGxlciIpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRW5kIHByb2Nlc3Npbmcgb2YgZ2l2ZW4gbm9kZSAKKyAgICoKKyAgICoKKyAgICogQHBhcmFtIG5vZGUgTm9kZSB3ZSBqdXN0IGZpbmlzaGVkIHByb2Nlc3NpbmcKKyAgICoKKyAgICogQHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGVuZE5vZGUoaW50IG5vZGUpIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworCisgICAgc3dpdGNoIChtX2R0bS5nZXROb2RlVHlwZShub2RlKSkKKyAgICB7CisgICAgY2FzZSBEVE0uRE9DVU1FTlRfTk9ERSA6CisgICAgICB0aGlzLm1fY29udGVudEhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFRNLkVMRU1FTlRfTk9ERSA6CisgICAgICBTdHJpbmcgbnMgPSBtX2R0bS5nZXROYW1lc3BhY2VVUkkobm9kZSk7CisgICAgICBpZihudWxsID09IG5zKQorICAgICAgICBucyA9ICIiOworICAgICAgdGhpcy5tX2NvbnRlbnRIYW5kbGVyLmVuZEVsZW1lbnQobnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHRtLmdldExvY2FsTmFtZShub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kdG0uZ2V0Tm9kZU5hbWUobm9kZSkpOworCisgICAgICBmb3IgKGludCBuc24gPSBtX2R0bS5nZXRGaXJzdE5hbWVzcGFjZU5vZGUobm9kZSwgdHJ1ZSk7IERUTS5OVUxMICE9IG5zbjsKKyAgICAgICAgICAgbnNuID0gbV9kdG0uZ2V0TmV4dE5hbWVzcGFjZU5vZGUobm9kZSwgbnNuLCB0cnVlKSkKKyAgICAgIHsKKyAgICAgICAgLy8gU3RyaW5nIHByZWZpeCA9IG1fZHRtLmdldFByZWZpeChuc24pOworICAgICAgICBTdHJpbmcgcHJlZml4ID0gbV9kdG0uZ2V0Tm9kZU5hbWVYKG5zbik7CisKKyAgICAgICAgdGhpcy5tX2NvbnRlbnRIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcocHJlZml4KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFRNLkNEQVRBX1NFQ1RJT05fTk9ERSA6CisgICAgICBicmVhazsKKyAgICBjYXNlIERUTS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgorICAgIHsKKyAgICAgIGlmIChtX2NvbnRlbnRIYW5kbGVyIGluc3RhbmNlb2YgTGV4aWNhbEhhbmRsZXIpCisgICAgICB7CisgICAgICAgIExleGljYWxIYW5kbGVyIGxoID0gKChMZXhpY2FsSGFuZGxlcikgdGhpcy5tX2NvbnRlbnRIYW5kbGVyKTsKKworICAgICAgICBsaC5lbmRFbnRpdHkobV9kdG0uZ2V0Tm9kZU5hbWUobm9kZSkpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICB9CisgIH0KK30gIC8vVHJlZVdhbGtlcgorCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTVdTRmlsdGVyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0RUTVdTRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyZTZmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vRFRNV1NGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSBhIGNsaWVudCBvZiB0aGUgRFRNLCBhbmQgYWxsb3dzCisgKiBzdHJpcHBpbmcgb2Ygd2hpdGVzcGFjZSBub2Rlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBEVE1XU0ZpbHRlcgoreworICAvKioKKyAgICogRG8gbm90IHN0cmlwIHdoaXRlc3BhY2UgY2hpbGQgbm9kZXMgb2YgdGhpcyBlbGVtZW50LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBOT1RTVFJJUCA9IDE7CisKKyAgLyoqCisgICAqIFN0cmlwIHdoaXRlc3BhY2UgY2hpbGQgbm9kZXMgb2YgdGhpcyBlbGVtZW50LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBTVFJJUCA9IDI7CisKKyAgLyoqCisgICAqIEluaGVyaXQgd2hpdGVzcGFjZSBzdHJpcHBpbmcgYmVoYXZpb3Igb2YgdGhlIHBhcmVudCBub2RlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBJTkhFUklUID0gMzsKKworICAvKioKKyAgICogVGVzdCB3aGV0aGVyIHdoaXRlc3BhY2Utb25seSB0ZXh0IG5vZGVzIGFyZSB2aXNpYmxlIGluIHRoZSBsb2dpY2FsIAorICAgKiB2aWV3IG9mIDxjb2RlPkRUTTwvY29kZT4uIE5vcm1hbGx5LCB0aGlzIGZ1bmN0aW9uCisgICAqIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5EVE08L2NvZGU+OyAKKyAgICogaXQgaXMgbm90IG5vcm1hbGx5IGNhbGxlZCBkaXJlY3RseSBmcm9tCisgICAqIHVzZXIgY29kZS4KKyAgICogCisgICAqIEBwYXJhbSBlbGVtZW50SGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIGVsZW1lbnQuCisgICAqIEByZXR1cm4gb25lIG9mIE5PVFNUUklQLCBTVFJJUCwgb3IgSU5IRVJJVC4KKyAgICovCisgIHB1YmxpYyBzaG9ydCBnZXRTaG91bGRTdHJpcFNwYWNlKGludCBlbGVtZW50SGFuZGxlKTsKKyAgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9FeHBhbmRlZE5hbWVUYWJsZS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9FeHBhbmRlZE5hbWVUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjZjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL0V4cGFuZGVkTmFtZVRhYmxlLmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCisgKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKKworLyoqCisgKiBUaGlzIGlzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhIHRhYmxlIHRoYXQgbWFuYWdlcyBtYXBwaW5ncyBmcm9tCisgKiBleHBhbmRlZCBuYW1lcyB0byBleHBhbmRlZE5hbWVJRHMuCisgKgorICogJVJFVklFVyUgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlYWxseSBhIHNlcGFyYXRlIHRhYmxlLCBvciBhCisgKiBzZXBhcmF0ZSBwb29sLiBJbnN0ZWFkLCBpdCdzIGFuIGFjY2VzcyBtZXRob2QgYnVpbGQgb24gdG9wIG9mIHRoZQorICogZXhpc3RpbmcgcG9vbHMsIHVzaW5nIHRocmVlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjogdGhlIGluZGV4CisgKiBudW1iZXJzIGZvciBhIG5vZGUncyBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgYW5kIG5vZGUgdHlwZSwgd2hpY2gKKyAqIGFyZSBjb21iaW5lZCB0byB5aWVsZCBhIGNvbXBvc2l0ZSBpbmRleCBudW1iZXIuCisgKgorICogJVRCRCUgc3RhcnR1cCBzZXF1ZW5jZSAtLSBob3cgdGhpcyBnZXRzIGFjY2VzcyB0byB0aGUgYXBwcm9wcmlhdGUKKyAqIHN0cmluZyBwb29scyBpbiB0aGUgRFRNRG9jdW1lbnQvc3R5bGVzaGVldC4KKyAqCisgKiAqLworcHVibGljIGNsYXNzIEV4cGFuZGVkTmFtZVRhYmxlCit7CisKKyAgLyoqIFByb2JhYmx5IGEgcmVmZXJlbmNlIHRvIHN0YXRpYyBwb29sLiAgICAgKi8KKyAgcHJpdmF0ZSBEVE1TdHJpbmdQb29sIG1fbG9jTmFtZXNQb29sOworCisgIC8qKiBQcm9iYWJseSBhIHJlZmVyZW5jZSB0byBzdGF0aWMgcG9vbC4gICAqLworICBwcml2YXRlIERUTVN0cmluZ1Bvb2wgbV9uYW1lc3BhY2VOYW1lczsKKyAgCisgIHB1YmxpYyBzdGF0aWMgaW50IEJJVFNfUEVSX0xPQ0FMTkFNRSA9IDE2OworICBwdWJsaWMgc3RhdGljIGludCBCSVRTX1BFUl9OQU1FU1BBQ0UgPSAxMDsKKworICBwdWJsaWMgc3RhdGljIGludCBNQVNLX0xPQ0FMTkFNRSA9IDB4MDAwMEZGRkY7CisgIHB1YmxpYyBzdGF0aWMgaW50IE1BU0tfTkFNRVNQQUNFID0gMHgwM0ZGMDAwMDsKKyAgcHVibGljIHN0YXRpYyBpbnQgTUFTS19OT0RFVFlQRSA9IDB4RkMwMDAwMDA7CisKKyAgLyoqCisgICAqIENyZWF0ZSBhbiBleHBhbmRlZCBuYW1lIHRhYmxlIHRoYXQgdXNlcyBwcml2YXRlIHN0cmluZyBwb29sIGxvb2t1cC4KKyAgICovCisgIHB1YmxpYyBFeHBhbmRlZE5hbWVUYWJsZSgpCisgIHsKKyAgICBtX2xvY05hbWVzUG9vbCA9IG5ldyBEVE1TYWZlU3RyaW5nUG9vbCgpOworICAgIG1fbmFtZXNwYWNlTmFtZXMgPSBuZXcgRFRNU2FmZVN0cmluZ1Bvb2woKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciBFeHBhbmRlZE5hbWVUYWJsZQorICAgKgorICAgKiBAcGFyYW0gbG9jTmFtZXNQb29sIExvY2FsIGVsZW1lbnQgbmFtZXMgbG9va3VwLgorICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZXMgTmFtZXNwYWNlIHZhbHVlcyBsb29rdXAuCisgICAqLworICBwdWJsaWMgRXhwYW5kZWROYW1lVGFibGUoRFRNU3RyaW5nUG9vbCBsb2NOYW1lc1Bvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEVE1TdHJpbmdQb29sIG5hbWVzcGFjZU5hbWVzKQorICB7CisgICAgbV9sb2NOYW1lc1Bvb2wgPSBsb2NOYW1lc1Bvb2w7CisgICAgbV9uYW1lc3BhY2VOYW1lcyA9IG5hbWVzcGFjZU5hbWVzOworICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGFuIGV4cGFuZGVkIG5hbWUsIHJldHVybiBhbiBJRC4gIElmIHRoZSBleHBhbmRlZC1uYW1lIGRvZXMgbm90CisgICAqIGV4aXN0IGluIHRoZSBpbnRlcm5hbCB0YWJsZXMsIHRoZSBlbnRyeSB3aWxsIGJlIGNyZWF0ZWQsIGFuZCB0aGUgSUQgd2lsbAorICAgKiBiZSByZXR1cm5lZC4gIEFueSBhZGRpdGlvbmFsIG5vZGVzIHRoYXQgYXJlIGNyZWF0ZWQgdGhhdCBoYXZlIHRoaXMKKyAgICogZXhwYW5kZWQgbmFtZSB3aWxsIHVzZSB0aGlzIElELgorICAgKgorICAgKiBAcGFyYW0gbmFtZXNwYWNlCisgICAqIEBwYXJhbSBsb2NhbE5hbWUKKyAgICoKKyAgICogQHJldHVybiB0aGUgZXhwYW5kZWQtbmFtZSBpZCBvZiB0aGUgbm9kZS4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0RXhwYW5kZWROYW1lSUQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSwgaW50IHR5cGUpCisgIHsKKyAgICBpbnQgbnNJRCA9IChudWxsICE9IG5hbWVzcGFjZSkgPyBtX25hbWVzcGFjZU5hbWVzLnN0cmluZ1RvSW5kZXgobmFtZXNwYWNlKSA6IDA7CisgICAgaW50IGxuSUQgPSBtX2xvY05hbWVzUG9vbC5zdHJpbmdUb0luZGV4KGxvY2FsTmFtZSk7CisgICAgCisgICAgaW50IGV4cGFuZGVkVHlwZUlEID0gKHR5cGUgPDwgKEJJVFNfUEVSX05BTUVTUEFDRStCSVRTX1BFUl9MT0NBTE5BTUUpKSAKKyAgICAgICAgICAgICAgICAgICAgICAgfCAobnNJRCA8PCBCSVRTX1BFUl9MT0NBTE5BTUUpIHwgbG5JRDsKKworICAgIHJldHVybiBleHBhbmRlZFR5cGVJRDsKKyAgfQorICAKKyAgLyoqCisgICAqIEdpdmVuIGEgdHlwZSwgcmV0dXJuIGFuIGV4cGFuZGVkIG5hbWUgSUQuQW55IGFkZGl0aW9uYWwgbm9kZXMgdGhhdCBhcmUgCisgICAqIGNyZWF0ZWQgdGhhdCBoYXZlIHRoaXMgZXhwYW5kZWQgbmFtZSB3aWxsIHVzZSB0aGlzIElELgorICAgKgorICAgKiBAcGFyYW0gbmFtZXNwYWNlCisgICAqIEBwYXJhbSBsb2NhbE5hbWUKKyAgICoKKyAgICogQHJldHVybiB0aGUgZXhwYW5kZWQtbmFtZSBpZCBvZiB0aGUgbm9kZS4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0RXhwYW5kZWROYW1lSUQoaW50IHR5cGUpCisgIHsKKyAgICBpbnQgZXhwYW5kZWRUeXBlSUQgPSAodHlwZSA8PCAoQklUU19QRVJfTkFNRVNQQUNFK0JJVFNfUEVSX0xPQ0FMTkFNRSkpOworCisgICAgcmV0dXJuIGV4cGFuZGVkVHlwZUlEOworICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGFuIGV4cGFuZGVkLW5hbWUgSUQsIHJldHVybiB0aGUgbG9jYWwgbmFtZSBwYXJ0LgorICAgKgorICAgKiBAcGFyYW0gRXhwYW5kZWROYW1lSUQgYW4gSUQgdGhhdCByZXByZXNlbnRzIGFuIGV4cGFuZGVkLW5hbWUuCisgICAqIEByZXR1cm4gU3RyaW5nIExvY2FsIG5hbWUgb2YgdGhpcyBub2RlLCBvciBudWxsIGlmIHRoZSBub2RlIGhhcyBubyBuYW1lLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoaW50IEV4cGFuZGVkTmFtZUlEKQorICB7CisgICAgaW50IGxvY2FsTmFtZUlEID0gKEV4cGFuZGVkTmFtZUlEICYgTUFTS19MT0NBTE5BTUUpOworICAgIAorICAgIGlmICgwID09IGxvY2FsTmFtZUlEKSAKKyAgICAgIHJldHVybiBudWxsOworICAgIGVsc2UKKyAgICAgIHJldHVybiBtX2xvY05hbWVzUG9vbC5pbmRleFRvU3RyaW5nKGxvY2FsTmFtZUlEKTsKKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhbiBleHBhbmRlZC1uYW1lIElELCByZXR1cm4gdGhlIG5hbWVzcGFjZSBVUkkgcGFydC4KKyAgICoKKyAgICogQHBhcmFtIEV4cGFuZGVkTmFtZUlEIGFuIElEIHRoYXQgcmVwcmVzZW50cyBhbiBleHBhbmRlZC1uYW1lLgorICAgKiBAcmV0dXJuIFN0cmluZyBVUkkgdmFsdWUgb2YgdGhpcyBub2RlJ3MgbmFtZXNwYWNlLCBvciBudWxsIGlmIG5vCisgICAqIG5hbWVzcGFjZSB3YXMgcmVzb2x2ZWQuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZShpbnQgRXhwYW5kZWROYW1lSUQpCisgIHsKKworICAgIGludCBpZCA9IChFeHBhbmRlZE5hbWVJRCAmIE1BU0tfTkFNRVNQQUNFKSA+PiBCSVRTX1BFUl9MT0NBTE5BTUU7CisgICAgcmV0dXJuICgwID09IGlkKSA/IG51bGwgOiBtX25hbWVzcGFjZU5hbWVzLmluZGV4VG9TdHJpbmcoaWQpOworICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGFuIGV4cGFuZGVkLW5hbWUgSUQsIHJldHVybiB0aGUgbmFtZXNwYWNlIFVSSSBwYXJ0LgorICAgKgorICAgKiBAcGFyYW0gRXhwYW5kZWROYW1lSUQgYW4gSUQgdGhhdCByZXByZXNlbnRzIGFuIGV4cGFuZGVkLW5hbWUuCisgICAqIEByZXR1cm4gU3RyaW5nIFVSSSB2YWx1ZSBvZiB0aGlzIG5vZGUncyBuYW1lc3BhY2UsIG9yIG51bGwgaWYgbm8KKyAgICogbmFtZXNwYWNlIHdhcyByZXNvbHZlZC4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgRXhwYW5kZWROYW1lSUQpCisgIHsKKworICAgIHJldHVybiAoKEV4cGFuZGVkTmFtZUlEICYgTUFTS19OQU1FU1BBQ0UpID4+IChCSVRTX1BFUl9MT0NBTE5BTUUrQklUU19QRVJfTkFNRVNQQUNFKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vVGVzdERUTS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9UZXN0RFRNLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MzYzllYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vVGVzdERUTS5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1Eb2N1bWVudEltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLlRlc3REVE1Ob2RlczsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOworCisvKioKKyAqIFRlc3RzIHRoZSBEVE0gYnkgY3JlYXRpbmcKKyAqCisgKiBSRVdSSVRURU4gdG8gdXNlIFNBWDIgQ29udGVudEhhbmRsZXIgQVBJcyAtLSBvcmlnaW5hbCBkcmFmdCB1c2VkCisgKiBhbiBpbmNvbXBsZXRlL2luY29ycmVjdCB2ZXJzaW9uIG9mIFNBWDEgRG9jdW1lbnRIYW5kbGVyLCB3aGljaCBpcworICogYmVpbmcgcGhhc2VkIG91dCBhcyBxdWlja2x5IGFzIHdlIGNhbiBwb3NzaWJseSBtYW5hZ2UgaXQuCisgKgorICogJVRCRCUgSSBfdGhpbmtfIHRoZSBTQVggY29udmVudGlvbiBpcyB0aGF0ICJubyBuYW1lc3BhY2UiIGlzIGV4cHJlc3NlZAorICogYXMgIiIgcmF0aGVyIHRoYW4gYXMgbnVsbCAod2hpY2ggaXMgdGhlIERPTSdzIGNvbnZlbnRpb24pLiBXaGF0IHNob3VsZCAKKyAqIERUTSBleHBlY3Q/IFdoYXQgc2hvdWxkIGl0IGRvIHdpdGggdGhlIG90aGVyPworICovCitwdWJsaWMgY2xhc3MgVGVzdERUTSB7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgeworICAgIFN0cmluZyB0ZXh0OworCisgICAgLyogIDw/eG1sIHZlcnNpb249IjEuMCI/PgorICAgICAqICA8dG9wPgorICAgICAqICAgPEE+CisgICAgICogICAgPEIgaGF0PSJuZXciIGNhcj0iSG9uZGEiIGRvZz0iQm94ZXIiPkxpZmUgaXMgZ29vZDwvQj4KKyAgICAgKiAgIDwvQT4KKyAgICAgKiAgIDxDPk15IEFuYWNvbmRhPEQvPldvcmRzPC9DPgorICAgICAqICA8L3RvcD4gKi8KKworICAgIERUTURvY3VtZW50SW1wbCBkb2MgPSBuZXcgRFRNRG9jdW1lbnRJbXBsKG51bGwsIDAsIG51bGwsIAorICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE1MU3RyaW5nRmFjdG9yeUltcGwuZ2V0RmFjdG9yeSgpKTsKKworICAgIHRyeQorICAgICAgeworICAgICAgICBkb2Muc3RhcnREb2N1bWVudCgpOworCisgICAgICAgIGRvYy5zdGFydEVsZW1lbnQoIiIsICJ0b3AiLCAidG9wIiwgbnVsbCk7CisKKyAgICAgICAgZG9jLnN0YXJ0RWxlbWVudCgiIiwgIkEiLCAiQSIsIG51bGwpOworCisgICAgICAgIEF0dHJpYnV0ZXNJbXBsIGF0dHMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKKyAgICAgICAgYXR0cy5hZGRBdHRyaWJ1dGUoIiIsICIiLCAiaGF0IiwgIkNEQVRBIiwgIm5ldyIpOworICAgICAgICBhdHRzLmFkZEF0dHJpYnV0ZSgiIiwgIiIsICJjYXIiLCAiQ0RBVEEiLCAiSG9uZGEiKTsKKyAgICAgICAgYXR0cy5hZGRBdHRyaWJ1dGUoIiIsICIiLCAiZG9nIiwgIkNEQVRBIiwgIkJveGVyIik7CisgICAgICAgIGRvYy5zdGFydEVsZW1lbnQoIiIsIkIiLCJCIiwgYXR0cyk7CisgICAgICAgIHRleHQ9IkxpZmUgaXMgZ29vZCI7CisgICAgICAgIGRvYy5jaGFyYWN0ZXJzKHRleHQudG9DaGFyQXJyYXkoKSwwLHRleHQubGVuZ3RoKCkpOworICAgICAgICBkb2MuZW5kRWxlbWVudCgiIiwiQiIsIkIiKTsKKworICAgICAgICBkb2MuZW5kRWxlbWVudCgiIiwiQSIsIkEiKTsKKyAgICAgICAgZG9jLnN0YXJ0RWxlbWVudCgiIiwiQyIsIkMiLCBudWxsKTsKKworICAgICAgICB0ZXh0PSJNeSBBbmFjb25kYSI7CisgICAgICAgIGRvYy5jaGFyYWN0ZXJzKHRleHQudG9DaGFyQXJyYXkoKSwwLHRleHQubGVuZ3RoKCkpOworICAgICAgICBkb2Muc3RhcnRFbGVtZW50KCIiLCJEIiwiRCIsbnVsbCk7CisgICAgICAgIGRvYy5lbmRFbGVtZW50KCIiLCJEIiwiRCIpOworICAgICAgICB0ZXh0PSJXb3JkcyI7CisgICAgICAgIGRvYy5jaGFyYWN0ZXJzKHRleHQudG9DaGFyQXJyYXkoKSwwLHRleHQubGVuZ3RoKCkpOworCisgICAgICAgIGRvYy5lbmRFbGVtZW50KCIiLCAiQyIsICJDIik7CisKKyAgICAgICAgYm9vbGVhbiBCVUlMRFBVUkNIQVNFT1JERVI9ZmFsc2U7CisgICAgICAgIGlmKEJVSUxEUFVSQ0hBU0VPUkRFUikKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgcm9vdCwgaCwgYzEsIGMyLCBjMywgYzQsIGMxX3RleHQsIGMyX3RleHQsIGMzX3RleHQsIGM0X3RleHQ7CisKKyAgICAgICAgICAgIGRvYy5zdGFydEVsZW1lbnQobnVsbCwiUHVyY2hhc2VPcmRlckxpc3QiLCJQdXJjaGFzZU9yZGVyTGlzdCIsIG51bGwpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKworICAgICAgICAgICAgICBkb2Muc3RhcnRFbGVtZW50KCIiLCJQdXJjaGFzZU9yZGVyIiwiUHVyY2hhc2VPcmRlciIsIG51bGwpOworCisgICAgICAgICAgICAgIGRvYy5zdGFydEVsZW1lbnQoIiIsIkl0ZW0iLCJJdGVtIiwgbnVsbCk7CisgICAgICAgICAgICAgIHRleHQ9IkJhc2tldGJhbGwiICsgIiAtICIgKyBpOworICAgICAgICAgICAgICBkb2MuY2hhcmFjdGVycyh0ZXh0LnRvQ2hhckFycmF5KCksMCx0ZXh0Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZG9jLmVuZEVsZW1lbnQoIiIsICJJdGVtIiwgIkl0ZW0iKTsKKworICAgICAgICAgICAgICBkb2Muc3RhcnRFbGVtZW50KCIiLCJEZXNjcmlwdGlvbiIsIkRlc2NyaXB0aW9uIiwgbnVsbCk7CisgICAgICAgICAgICAgIC8vIGMyLmNyZWF0ZUF0dHJpYnV0ZSgpOworICAgICAgICAgICAgICB0ZXh0PSJQcm9mZXNzaW9uYWwgTGVhdGhlciBNaWNoYWVsIEpvcmRhbiBTaWduYXR1cmVkIEJhc2tldGJhbGwiOworICAgICAgICAgICAgICBkb2MuY2hhcmFjdGVycyh0ZXh0LnRvQ2hhckFycmF5KCksMCx0ZXh0Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZG9jLmVuZEVsZW1lbnQoIiIsICJEZXNjcmlwdGlvbiIsICJEZXNjcmlwdGlvbiIpOworCisgICAgICAgICAgICAgIGRvYy5zdGFydEVsZW1lbnQoIiIsIlVuaXRQcmljZSIsIlVuaXRQcmljZSIsIG51bGwpOworICAgICAgICAgICAgICB0ZXh0PSIkMTIuOTkiOworICAgICAgICAgICAgICBkb2MuY2hhcmFjdGVycyh0ZXh0LnRvQ2hhckFycmF5KCksMCx0ZXh0Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZG9jLmVuZEVsZW1lbnQoIiIsICJVbml0UHJpY2UiLCAiVW5pdFByaWNlIik7CisKKyAgICAgICAgICAgICAgZG9jLnN0YXJ0RWxlbWVudCgiIiwiUXVhbnRpdHkiLCJRdWFudGl0eSIsIG51bGwpOworICAgICAgICAgICAgICB0ZXh0PSI1MCI7CisgICAgICAgICAgICAgIGRvYy5jaGFyYWN0ZXJzKHRleHQudG9DaGFyQXJyYXkoKSwwLHRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBkb2MuZW5kRWxlbWVudCgiIiwgIlF1YW50aXR5IiwgIlF1YW50aXR5Iik7CisKKyAgICAgICAgICAgICAgZG9jLmVuZEVsZW1lbnQoIiIsICJQdXJjaGFzZU9yZGVyIiwgIlB1cmNoYXNlT3JkZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZG9jLmVuZEVsZW1lbnQoIiIsICJQdXJjaGFzZU9yZGVyTGlzdCIsICJQdXJjaGFzZU9yZGVyTGlzdCIpOworICAgICAgICAgIH0gLy8gaWYoQlVJTERQVVJDSEFTRU9SREVSKQorCisgICAgICAgIGRvYy5lbmRFbGVtZW50KCIiLCAidG9wIiwgInRvcCIpOworICAgICAgICBkb2MuZW5kRG9jdW1lbnQoKTsKKyAgICAgIH0KKyAgICBjYXRjaChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gZSkKKyAgICAgIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAKKworICAgIFRlc3REVE1Ob2Rlcy5wcmludE5vZGVUYWJsZShkb2MpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL1Rlc3REVE1Ob2Rlcy5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9UZXN0RFRNTm9kZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGM5NGMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9UZXN0RFRNTm9kZXMuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5DaHVua2VkSW50QXJyYXk7CisKKy8qKiBEZWJ1Z2dpbmcgZHVtcCByb3V0aW5lIGZvciBEVE1Eb2N1bWVudEltcGwuIE5vdGUgdGhhdCBpdCBkaXJlY3RseSBhY2Nlc3NlcworICogdGhhdCBjbGFzcydzIGludGVybmFsIGRhdGEuLi4gd2hpY2ggcHJvYmFibHkgc2hvdWxkbid0IGJlIGV4cG9zZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RFRNTm9kZXMgeworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludE5vZGVUYWJsZShEVE1Eb2N1bWVudEltcGwgZG9jKSB7CisgICAgaW50IGxlbmd0aCA9IGRvYy5ub2Rlcy5zbG90c1VzZWQoKSwgc2xvdFtdID0gbmV3IGludFs0XTsKKyAgICBmb3IgKGludCBpPTA7IGkgPD0gbGVuZ3RoOyBpKyspIHsKKyAgICAgIGRvYy5ub2Rlcy5yZWFkU2xvdChpLCBzbG90KTsKKworICAgICAgLy8gV29yZDAgaXMgc2hvd24gYXMgaXRzIHR3byBoYWxmd29yZHMKKyAgICAgIHNob3J0IGhpZ2ggPSAoc2hvcnQpIChzbG90WzBdID4+IDE2KTsKKyAgICAgIHNob3J0IGxvdyA9IChzaG9ydCkgKHNsb3RbMF0gJiAweEZGRkYpOworCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaSArICI6ICgiICsgaGlnaCArICIpICgiICsgbG93ICsKKwkJCSAiKSAiICsgc2xvdFsxXSArICIgIiArIHNsb3RbMl0gKworCQkJICIgIiArc2xvdFszXSArCisJCQkgIlxuXHROYW1lOiAiICsgIGRvYy5nZXROb2RlTmFtZShpKSArCisJCQkgIiBWYWx1ZTogIiArIGRvYy5nZXROb2RlVmFsdWUoaSkgKworCQkJICIgUGFyZW50OiAiICsgZG9jLmdldFBhcmVudChpKSArCisJCQkgIiBGaXJzdEF0dHI6ICIgKyBkb2MuZ2V0Rmlyc3RBdHRyaWJ1dGUoaSkgKworCQkJICIgRmlyc3RDaGlsZDogIiArIGRvYy5nZXRGaXJzdENoaWxkKGkpICsKKwkJCSAiIE5leHRTaWI6ICIgKyBkb2MuZ2V0TmV4dFNpYmxpbmcoaSkKKwkJCSApOyAKKyAgICB9CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9kb20yZHRtL0RPTTJEVE0uamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vZG9tMmR0bS9ET00yRFRNLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiMTQyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vZG9tMmR0bS9ET00yRFRNLmphdmEKQEAgLTAsMCArMSwxMzY0IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKKyAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKKyAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cworICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5kdG0uZG9tMmR0bTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS4qOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLkludFZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5JbnRTdGFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5Cb29sU3RhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuU3RyaW5nQnVmZmVyUG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5GYXN0U3RyaW5nQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlRyZWVXYWxrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuUU5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MQ2hhcmFjdGVyUmVjb2duaXplcjsKKworaW1wb3J0IG9yZy53M2MuZG9tLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuTm9kZVZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmdGYWN0b3J5OworCisvKioKKyAqIFRoZSA8Y29kZT5ET00yRFRNPC9jb2RlPiBjbGFzcyBzZXJ2ZXMgdXAgYSBET00gdmlhIGEgRFRNIEFQSS4KKyAqLworcHVibGljIGNsYXNzIERPTTJEVE0gZXh0ZW5kcyBEVE1EZWZhdWx0QmFzZQoreworICAvKioKKyAgICogVGhpcyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgaW50ZWdlcnMgcGVyIG5vZGUgaW4gdGhlCisgICAqIDxjb2RlPm1faW5mbzwvY29kZT4gbWVtYmVyIHZhcmlhYmxlLgorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTk9ERUlORk9CTE9DS1NJWkUgPSBERUZBVUxUTk9ERUlORk9CTE9DS1NJWkU7CisKKyAgLyoqIFRoZSB0b3Agb2YgdGhlIHN1YnRyZWUsIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgbV9jb250ZXh0IGlmICIvL2ZvbyIgcGF0dGVybi4gKi8KKyAgdHJhbnNpZW50IHByaXZhdGUgTm9kZSBtX3Jvb3Q7CisKKyAgLyoqIFRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSB0cmVlLiAqLworICB0cmFuc2llbnQgcHJpdmF0ZSBOb2RlIG1fcG9zOworCisgIC8qKiB0cnVlIGlmIGFsbCB0aGUgbm9kZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gKi8KKyAgdHJhbnNpZW50IHByaXZhdGUgYm9vbGVhbiBtX25vZGVzQXJlUHJvY2Vzc2VkOworCisgIC8qKgorICAgKiAlVEJEJSBOZWVkcyBkb2MuLi4gaG93IHRvIGV4cGxhaW4/CisgICAqIFswXSBpbmRleCBvZiBwYXJlbnQuCisgICAqIFsxXSBpbmRleCBvZiBwcmV2aW91cyBzaWJsaW5nLgorICAgKi8KKyAgdHJhbnNpZW50IHByaXZhdGUgSW50U3RhY2sgbV9sZXZlbEluZm8gPSBuZXcgSW50U3RhY2soKTsKKworICAvKioKKyAgICogJVRCRCUgRG9jCisgICAqLworICB0cmFuc2llbnQgcHJpdmF0ZSBOYW1lZE5vZGVNYXAgbV9hdHRyczsKKworICAvKioKKyAgICogJVRCRCUgRG9jCisgICAqLworICB0cmFuc2llbnQgcHJpdmF0ZSBpbnQgbV9hdHRyc1BvczsKKworICAvKiogTkVFRFNET0MgRmllbGQgTEVWRUxJTkZPX1BBUkVOVCAqLworICBzdGF0aWMgZmluYWwgaW50IExFVkVMSU5GT19QQVJFTlQgPSAxOworCisgIC8qKiBORUVEU0RPQyBGaWVsZCBMRVZFTElORk9fUFJFVlNJQiAqLworICBzdGF0aWMgZmluYWwgaW50IExFVkVMSU5GT19QUkVWU0lCID0gMDsKKworICAvKiogTkVFRFNET0MgRmllbGQgTEVWRUxJTkZPX05QRVJMRVZFTCAqLworICBzdGF0aWMgZmluYWwgaW50IExFVkVMSU5GT19OUEVSTEVWRUwgPSAyOworICAKKyAgLyoqIFNhbWVkIGVsZW1lbnQgZm9yIGF0dHJpYnV0ZSBpdGVyYXRpb24gKi8KKyAgcHJpdmF0ZSBOb2RlIG1fZWxlbWVudEZvckF0dHJzOworICAKKyAgLyoqIFNhbWVkIGVsZW1lbnQgaW5kZXggZm9yIGF0dHJpYnV0ZSBpdGVyYXRpb24gKi8KKyAgcHJpdmF0ZSBpbnQgbV9lbGVtZW50Rm9yQXR0cnNJbmRleDsKKworICAvKioKKyAgICogVGhlIG5vZGUgb2JqZWN0cy4gIFRoZSBpbnN0YW5jZSBwYXJ0IG9mIHRoZSBoYW5kbGUgaW5kZXhlcyBkaXJlY3RseQorICAgKiBpbnRvIHRoaXMgdmVjdG9yLiAgRWFjaCBEVE0gbm9kZSBtYXkgYWN0dWFsbHkgYmUgY29tcG9zZWQgb2Ygc2V2ZXJhbAorICAgKiBET00gbm9kZXMuCisgICAqLworICBwcm90ZWN0ZWQgVmVjdG9yIG1fbm9kZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdCBhIERPTTJEVE0gb2JqZWN0IGZyb20gYSBET00gbm9kZS4KKyAgICoKKyAgICogQHBhcmFtIG1nciBUaGUgRFRNTWFuYWdlciB3aG8gb3ducyB0aGlzIERUTS4KKyAgICogQHBhcmFtIGRvbVNvdXJjZSB0aGUgRE9NIHNvdXJjZSB0aGF0IHRoaXMgRFRNIHdpbGwgd3JhcC4KKyAgICogQHBhcmFtIGR0bUlkZW50aXR5IFRoZSBEVE0gaWRlbnRpdHkgSUQgZm9yIHRoaXMgRFRNLgorICAgKiBAcGFyYW0gd2hpdGVTcGFjZUZpbHRlciBUaGUgd2hpdGUgc3BhY2UgZmlsdGVyIGZvciB0aGlzIERUTSwgd2hpY2ggbWF5IAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBudWxsLgorICAgKi8KKyAgcHVibGljIERPTTJEVE0oRFRNTWFuYWdlciBtZ3IsIERPTVNvdXJjZSBkb21Tb3VyY2UsIAorICAgICAgICAgICAgICAgICBpbnQgZHRtSWRlbnRpdHksIERUTVdTRmlsdGVyIHdoaXRlU3BhY2VGaWx0ZXIsCisgICAgICAgICAgICAgICAgIFhNTFN0cmluZ0ZhY3RvcnkgeHN0cmluZ2ZhY3RvcnkpCisgIHsKKyAgICBzdXBlcihtZ3IsIGRvbVNvdXJjZSwgZHRtSWRlbnRpdHksIHdoaXRlU3BhY2VGaWx0ZXIsIHhzdHJpbmdmYWN0b3J5KTsKKworICAgIG1fcm9vdCA9IGRvbVNvdXJjZS5nZXROb2RlKCk7CisgICAgbV9wb3MgPSBudWxsOworICAgIG1fbm9kZXNBcmVQcm9jZXNzZWQgPSBmYWxzZTsKKyAgICBhZGROb2RlKG1fcm9vdCwgMCwgRFRNLk5VTEwsIERUTS5OVUxMKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3QgdGhlIG5vZGUgbWFwIGZyb20gdGhlIG5vZGUuCisgICAqCisgICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRoYXQgaXMgdG8gYmUgYWRkZWQgdG8gdGhlIERUTS4KKyAgICogQHBhcmFtIGxldmVsIFRoZSBjdXJyZW50IGxldmVsIGluIHRoZSB0cmVlLgorICAgKiBAcGFyYW0gcGFyZW50SW5kZXggVGhlIGN1cnJlbnQgcGFyZW50IGluZGV4LgorICAgKiBAcGFyYW0gcHJldmlvdXNTaWJsaW5nIFRoZSBwcmV2aW91cyBzaWJsaW5nIGluZGV4LgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBpbmRleCBpZGVudGl0eSBvZiB0aGUgbm9kZSB0aGF0IHdhcyBhZGRlZC4KKyAgICovCisgIHByb3RlY3RlZCBpbnQgYWRkTm9kZShOb2RlIG5vZGUsIGludCBsZXZlbCwgaW50IHBhcmVudEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXZpb3VzU2libGluZykKKyAgeworCisgICAgaW50IG5vZGVJbmRleCA9IG1fbm9kZXMuc2l6ZSgpOworICAgIAorICAgIGludCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOworICAgIAorICAgIG1fbm9kZXMuYWRkRWxlbWVudChub2RlKTsKKworICAgIGludCBzdGFydEluZm8gPSBub2RlSW5kZXggKiBOT0RFSU5GT0JMT0NLU0laRTsKKworICAgIG1faW5mby5hZGRFbGVtZW50cyhOT0RFSU5GT0JMT0NLU0laRSk7CisgICAgbV9pbmZvLnNldEVsZW1lbnRBdChsZXZlbCwgc3RhcnRJbmZvICsgT0ZGU0VUX0xFVkVMKTsKKworICAgIGlmIChOb2RlLkFUVFJJQlVURV9OT0RFID09IHR5cGUpCisgICAgeworICAgICAgU3RyaW5nIG5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7CisKKyAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInhtbG5zOiIpIHx8IG5hbWUuZXF1YWxzKCJ4bWxucyIpKQorICAgICAgeworICAgICAgICB0eXBlID0gRFRNLk5BTUVTUEFDRV9OT0RFOworICAgICAgfQorICAgIH0KKworICAgIG1faW5mby5zZXRFbGVtZW50QXQodHlwZSwgc3RhcnRJbmZvICsgT0ZGU0VUX1RZUEUpOworICAgIG1faW5mby5zZXRFbGVtZW50QXQoTk9UUFJPQ0VTU0VELCBzdGFydEluZm8gKyBPRkZTRVRfRklSU1RDSElMRCk7CisgICAgbV9pbmZvLnNldEVsZW1lbnRBdChOT1RQUk9DRVNTRUQsIHN0YXJ0SW5mbyArIE9GRlNFVF9ORVhUU0lCTElORyk7CisgICAgbV9pbmZvLnNldEVsZW1lbnRBdChwcmV2aW91c1NpYmxpbmcsIHN0YXJ0SW5mbyArIE9GRlNFVF9QUkVWU0lCTElORyk7CisgICAgbV9pbmZvLnNldEVsZW1lbnRBdChwYXJlbnRJbmRleCwgc3RhcnRJbmZvICsgT0ZGU0VUX1BBUkVOVCk7CisgICAgCisgICAgaWYoRFRNLk5VTEwgIT0gcGFyZW50SW5kZXggJiYgdHlwZSAhPSBEVE0uQVRUUklCVVRFX05PREUgJiYgdHlwZSAhPSBEVE0uTkFNRVNQQUNFX05PREUpCisgICAgeworICAgICAgaW50IHN0YXJ0UGFyZW50SW5mbyA9IHBhcmVudEluZGV4ICogTk9ERUlORk9CTE9DS1NJWkU7CisgICAgICBpZihOT1RQUk9DRVNTRUQgPT0gbV9pbmZvLmVsZW1lbnRBdChzdGFydFBhcmVudEluZm8gKyBPRkZTRVRfRklSU1RDSElMRCkpCisgICAgICB7CisgICAgICAgIG1faW5mby5zZXRFbGVtZW50QXQobm9kZUluZGV4LCBzdGFydFBhcmVudEluZm8gKyBPRkZTRVRfRklSU1RDSElMRCk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIFN0cmluZyBuc1VSSSA9IG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgU3RyaW5nIGxvY2FsTmFtZSA9ICAodHlwZSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmdldE5vZGVOYW1lKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0TG9jYWxOYW1lKCk7CisgICAgRXhwYW5kZWROYW1lVGFibGUgZXhudCA9IG1fbWdyLmdldEV4cGFuZGVkTmFtZVRhYmxlKHRoaXMpOworCisgICAgaW50IGV4cGFuZGVkTmFtZUlEID0gKG51bGwgIT0gbG9jYWxOYW1lKSAKKyAgICAgICA/IGV4bnQuZ2V0RXhwYW5kZWROYW1lSUQobnNVUkksIGxvY2FsTmFtZSwgdHlwZSkgOgorICAgICAgICAgZXhudC5nZXRFeHBhbmRlZE5hbWVJRCh0eXBlKTsKKworICAgIG1faW5mby5zZXRFbGVtZW50QXQoZXhwYW5kZWROYW1lSUQsIHN0YXJ0SW5mbyArIE9GRlNFVF9FWFBBTkRFRE5BTUVJRCk7ICAgIAorCisgICAgaWYgKERUTS5OVUxMICE9IHByZXZpb3VzU2libGluZykKKyAgICB7CisgICAgICBtX2luZm8uc2V0RWxlbWVudEF0KG5vZGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZpb3VzU2libGluZyAqIE5PREVJTkZPQkxPQ0tTSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICArIE9GRlNFVF9ORVhUU0lCTElORyk7CisgICAgfQorCisgICAgcmV0dXJuIG5vZGVJbmRleDsKKyAgfQorICAKKyAgLyoqCisgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGludGVnZXJzIGluIGVhY2ggbm9kZSBpbmZvIGJsb2NrLgorICAgKi8KKyAgcHJvdGVjdGVkIGludCBnZXROb2RlSW5mb0Jsb2NrU2l6ZSgpCisgIHsKKyAgICByZXR1cm4gTk9ERUlORk9CTE9DS1NJWkU7CisgIH0KKyAgCisgIC8qKgorICAgKiBHZXQgdGhlIG51bWJlciBvZiBub2RlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZC4KKyAgICovCisgIHByb3RlY3RlZCBpbnQgZ2V0TnVtYmVyT2ZOb2RlcygpCisgIHsKKyAgICByZXR1cm4gbV9ub2Rlcy5zaXplKCk7CisgIH0KKworCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCBpdGVyYXRlcyB0byB0aGUgbmV4dCBub2RlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGFibGUuCisgICAqIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCBhZGRzIGEgbmV3IG5vZGUgdG8gdGhlIHRhYmxlLCB1bmxlc3MgdGhlIGVuZAorICAgKiBpcyByZWFjaGVkLCBpbiB3aGljaCBjYXNlIGl0IHJldHVybnMgbnVsbC4KKyAgICoKKyAgICogQHJldHVybiBUaGUgdHJ1ZSBpZiBhIG5leHQgbm9kZSBpcyBmb3VuZCBvciBmYWxzZSBpZiAKKyAgICogICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBub2Rlcy4KKyAgICovCisgIHByb3RlY3RlZCBib29sZWFuIG5leHROb2RlKCkKKyAgeworICAgIC8vIE5vbi1yZWN1cnNpdmUgb25lLWZldGNoLWF0LWEtdGltZSBkZXB0aC1maXJzdCB0cmF2ZXJzYWwgd2l0aCAKKyAgICAvLyBhdHRyaWJ1dGUvbmFtZXNwYWNlIG5vZGVzIGFuZCB3aGl0ZS1zcGFjZSBzdHJpcHBpbmcuCisgICAgLy8gWWlwcGVlISAgTm90IGZvciB0aGUgZmFpbnQgb2YgaGVhcnQuICBJIHdvdWxkIGJlIGdsYWQgZm9yIAorICAgIC8vIGNvbnN0cnVjdGl2ZSBzdWdnZXN0aW9ucyBvbiBob3cgdG8gbWFrZSB0aGlzIGNsZWFuZXIuCisKKyAgICBpZiAobV9ub2Rlc0FyZVByb2Nlc3NlZCkKKyAgICB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIGlmKG1fbm9kZXMuc2l6ZSgpID09IDQ3KQorICAgIHsKKyAgICAgIGludCB4ID0gNTsKKyAgICAgIHgrKzsKKyAgICB9CisKKyAgICBOb2RlIHRvcCA9IG1fcm9vdDsgIC8vIHRlbGxzIHVzIHdoZW4gdG8gc3RvcC4KKyAgICBOb2RlIHBvcyA9IChudWxsID09IG1fcG9zKSA/IG1fcm9vdCA6IG1fcG9zOworCisgICAgTm9kZSBuZXh0Tm9kZTsKKyAgICBpbnQgdHlwZSA9IHBvcy5nZXROb2RlVHlwZSgpOworCisgICAgaW50IGN1cnJlbnRJbmRleEhhbmRsZSA9IG1fbm9kZXMuc2l6ZSgpLTE7CisgICAgaW50IHBvc0luZm8gPSBjdXJyZW50SW5kZXhIYW5kbGUgKiBOT0RFSU5GT0JMT0NLU0laRTsKKyAgICAKKyAgICBib29sZWFuIHNob3VsZFB1c2hMZXZlbCA9IHRydWU7CisgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IHR5cGUpCisgICAgeworICAgICAgbV9hdHRycyA9IHBvcy5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICBtX2F0dHJzUG9zID0gMDsKKworICAgICAgaWYgKG51bGwgIT0gbV9hdHRycykKKyAgICAgIHsKKyAgICAgICAgaWYgKG1fYXR0cnNQb3MgPCBtX2F0dHJzLmdldExlbmd0aCgpKQorICAgICAgICB7CisgICAgICAgICAgbV9lbGVtZW50Rm9yQXR0cnMgPSBwb3M7CisgICAgICAgICAgbV9lbGVtZW50Rm9yQXR0cnNJbmRleCA9IGN1cnJlbnRJbmRleEhhbmRsZTsKKyAgICAgICAgICBuZXh0Tm9kZSA9IG1fYXR0cnMuaXRlbShtX2F0dHJzUG9zKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgbmV4dE5vZGUgPSBwb3MuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBuZXh0Tm9kZSA9IHBvcy5nZXRGaXJzdENoaWxkKCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKE5vZGUuQVRUUklCVVRFX05PREUgPT0gdHlwZSkKKyAgICB7CisgICAgICBtX2luZm8uc2V0RWxlbWVudEF0KERUTS5OVUxMLCBwb3NJbmZvICsgT0ZGU0VUX0ZJUlNUQ0hJTEQpOworICAgICAgbV9hdHRyc1BvcysrOworCisgICAgICBpZiAobV9hdHRyc1BvcyA8IG1fYXR0cnMuZ2V0TGVuZ3RoKCkpCisgICAgICB7CisgICAgICAgIG5leHROb2RlID0gbV9hdHRycy5pdGVtKG1fYXR0cnNQb3MpOworICAgICAgICBzaG91bGRQdXNoTGV2ZWwgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbV9pbmZvLnNldEVsZW1lbnRBdChEVE0uTlVMTCwgcG9zSW5mbyArIE9GRlNFVF9ORVhUU0lCTElORyk7IAorICAgICAgICBwb3MgPSBtX2VsZW1lbnRGb3JBdHRyczsKKyAgICAgICAgY3VycmVudEluZGV4SGFuZGxlID0gbV9lbGVtZW50Rm9yQXR0cnNJbmRleDsKKyAgICAgICAgcG9zSW5mbyA9IGN1cnJlbnRJbmRleEhhbmRsZSAqIE5PREVJTkZPQkxPQ0tTSVpFOworICAgICAgICBuZXh0Tm9kZSA9IHBvcy5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIG1fbGV2ZWxJbmZvLnF1aWNrUG9wKExFVkVMSU5GT19OUEVSTEVWRUwpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBuZXh0Tm9kZSA9IHBvcy5nZXRGaXJzdENoaWxkKCk7ICAKKyAgICAgCisgICAgLy8gJVRCRCUgVGV4dCBub2RlIGNvYWxpdGlvbi4KKyAgICBpZigobnVsbCAhPSBtX3dzZmlsdGVyKSAmJiAobnVsbCAhPSBuZXh0Tm9kZSkgJiYgZ2V0U2hvdWxkU3RyaXBXaGl0ZXNwYWNlKCkpCisgICAgeworICAgICAgaW50IHQgPSBuZXh0Tm9kZS5nZXROb2RlVHlwZSgpOworICAgICAgCisgICAgICBpZigoTm9kZS5DREFUQV9TRUNUSU9OX05PREUgPT0gdCkgfHwgKE5vZGUuVEVYVF9OT0RFID09IHQpKQorICAgICAgeworICAgICAgICBTdHJpbmcgZGF0YSA9IG5leHROb2RlLmdldE5vZGVWYWx1ZSgpOworICAgICAgICBpZihYTUxDaGFyYWN0ZXJSZWNvZ25pemVyLmlzV2hpdGVTcGFjZShkYXRhKSkKKyAgICAgICAgeworICAgICAgICAgIG5leHROb2RlID0gbmV4dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoc2hvdWxkUHVzaExldmVsICYmIChudWxsICE9IG5leHROb2RlKSkKKyAgICB7CisgICAgICBtX2xldmVsSW5mby5wdXNoKGN1cnJlbnRJbmRleEhhbmRsZSk7IC8vIHBhcmVudAorICAgICAgbV9sZXZlbEluZm8ucHVzaChEVE0uTlVMTCk7IC8vIHByZXZpb3VzIHNpYmxpbmcKKyAgICB9CisKKyAgICB3aGlsZSAobnVsbCA9PSBuZXh0Tm9kZSkKKyAgICB7CisgICAgICBpZihtX2luZm8uZWxlbWVudEF0KHBvc0luZm8gKyBPRkZTRVRfRklSU1RDSElMRCkgPT0gTk9UUFJPQ0VTU0VEKQorICAgICAgeworICAgICAgICBtX2luZm8uc2V0RWxlbWVudEF0KERUTS5OVUxMLCBwb3NJbmZvICsgT0ZGU0VUX0ZJUlNUQ0hJTEQpOworICAgICAgfQorICAgICAgCisgICAgICBpZiAodG9wLmVxdWFscyhwb3MpKQorICAgICAgeworICAgICAgICBtX2luZm8uc2V0RWxlbWVudEF0KERUTS5OVUxMLCBwb3NJbmZvICsgT0ZGU0VUX05FWFRTSUJMSU5HKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIG5leHROb2RlID0gcG9zLmdldE5leHRTaWJsaW5nKCk7CisgICAgICBpZihudWxsICE9IG5leHROb2RlICYmIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFID09IG5leHROb2RlLmdldE5vZGVUeXBlKCkpCisgICAgICB7CisgICAgICAgIC8vIFhlcmNlcworICAgICAgICBuZXh0Tm9kZSA9IG5leHROb2RlLmdldE5leHRTaWJsaW5nKCk7IC8vIGp1c3Qgc2tpcCBpdC4KKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYoTm9kZS5FTEVNRU5UX05PREUgPT0gcG9zLmdldE5vZGVUeXBlKCkpCisgICAgICB7CisgICAgICAgIC8vIEkgdGhpbmsgdGhpcyBvbmx5IGhhcyB0byBiZSBwb3BwZWQgaGVyZSwgYW5kIG5vdCBhdCBnZXRQYXJlbnQsCisgICAgICAgIC8vIG9kZGx5IGVub3VnaCBhdCBmaXJzdCBnbGFuY2UuCisgICAgICAgIHBvcFNob3VsZFN0cmlwV2hpdGVzcGFjZSgpOworICAgICAgfQorCisgICAgICAvLyAlVEJEJSBUZXh0IG5vZGUgY29hbGl0aW9uLgorICAgICAgaWYoKG51bGwgIT0gbmV4dE5vZGUpICYmIChudWxsICE9IG1fd3NmaWx0ZXIpICYmIGdldFNob3VsZFN0cmlwV2hpdGVzcGFjZSgpKQorICAgICAgeworICAgICAgICBpbnQgdCA9IG5leHROb2RlLmdldE5vZGVUeXBlKCk7CisgICAgICAgIAorICAgICAgICBpZigoTm9kZS5DREFUQV9TRUNUSU9OX05PREUgPT0gdCkgfHwgKE5vZGUuVEVYVF9OT0RFID09IHQpKQorICAgICAgICB7CisgICAgICAgICAgU3RyaW5nIGRhdGEgPSBuZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKKyAgICAgICAgICBpZihYTUxDaGFyYWN0ZXJSZWNvZ25pemVyLmlzV2hpdGVTcGFjZShkYXRhKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHROb2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAgICAgICAgICAgICAKKyAgICAgIGlmIChudWxsID09IG5leHROb2RlKQorICAgICAgeworICAgICAgICBtX2luZm8uc2V0RWxlbWVudEF0KERUTS5OVUxMLCBwb3NJbmZvICsgT0ZGU0VUX05FWFRTSUJMSU5HKTsKKworICAgICAgICBjdXJyZW50SW5kZXhIYW5kbGUgPSBtX2luZm8uZWxlbWVudEF0KHBvc0luZm8gKyBPRkZTRVRfUEFSRU5UKTsKKyAgICAgICAgcG9zSW5mbyA9IGN1cnJlbnRJbmRleEhhbmRsZSAqIE5PREVJTkZPQkxPQ0tTSVpFOworICAgICAgICBtX2xldmVsSW5mby5xdWlja1BvcChMRVZFTElORk9fTlBFUkxFVkVMKTsKKyAgICAgICAgcG9zID0gcG9zLmdldFBhcmVudE5vZGUoKTsKKworICAgICAgICBpZiAoKG51bGwgPT0gcG9zKSB8fCAodG9wLmVxdWFscyhwb3MpKSkKKyAgICAgICAgeworICAgICAgICAgIG1faW5mby5zZXRFbGVtZW50QXQoRFRNLk5VTEwsIHBvc0luZm8gKyBPRkZTRVRfTkVYVFNJQkxJTkcpOworICAgICAgICAgIG5leHROb2RlID0gbnVsbDsKKyAgICAgICAgICAvLyBicmVhazsKKyAgICAgICAgICBtX25vZGVzQXJlUHJvY2Vzc2VkID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICAgCisgICAgICAKKyAgICB9IC8vIGVuZCB3aGlsZSAobnVsbCA9PSBuZXh0Tm9kZSkgW2ZvciBuZXh0IHNpYmxpbmcsIHBhcmVudF0KKworICAgIHBvcyA9IG5leHROb2RlOworCisgICAgaWYgKG51bGwgIT0gcG9zKQorICAgIHsKKyAgICAgIGludCBsZXZlbCA9IG1fbGV2ZWxJbmZvLnNpemUoKSAvIExFVkVMSU5GT19OUEVSTEVWRUw7CisgICAgICBpbnQgbmV3SW5kZXhIYW5kbGUgPSAKKyAgICAgICAgICAgIGFkZE5vZGUocG9zLCBsZXZlbCwgbV9sZXZlbEluZm8ucGVlayhMRVZFTElORk9fUEFSRU5UKSwKKyAgICAgICAgICAgICAgICBtX2xldmVsSW5mby5wZWVrKExFVkVMSU5GT19QUkVWU0lCKSk7CisKKyAgICAgIG1fcG9zID0gcG9zOworCisgICAgICBpbnQgc3ogPSBtX2xldmVsSW5mby5zaXplKCk7CisKKyAgICAgIG1fbGV2ZWxJbmZvLnNldEVsZW1lbnRBdChuZXdJbmRleEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeiAtICgxICsgTEVWRUxJTkZPX1BSRVZTSUIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGlmKChudWxsICE9IG1fd3NmaWx0ZXIpICYmIChOb2RlLkVMRU1FTlRfTk9ERSA9PSBwb3MuZ2V0Tm9kZVR5cGUoKSkpCisgICAgICB7CisgICAgICAgIHNob3J0IHdzdiA9IG1fd3NmaWx0ZXIuZ2V0U2hvdWxkU3RyaXBTcGFjZShuZXdJbmRleEhhbmRsZSk7CisgICAgICAgIGJvb2xlYW4gc2hvdWxkU3RyaXAgPSAoRFRNV1NGaWx0ZXIuSU5IRVJJVCA9PSB3c3YpID8gCisgICAgICAgICAgICAgICAgICBnZXRTaG91bGRTdHJpcFdoaXRlc3BhY2UoKSA6IChEVE1XU0ZpbHRlci5TVFJJUCA9PSB3c3YpOworICAgICAgICBwdXNoU2hvdWxkU3RyaXBXaGl0ZXNwYWNlKHNob3VsZFN0cmlwKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisgICAgbV9ub2Rlc0FyZVByb2Nlc3NlZCA9IHRydWU7CisgICAgbV9wb3MgPSBudWxsOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gYW4gRE9NIG5vZGUgZm9yIHRoZSBnaXZlbiBub2RlLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KKyAgICoKKyAgICogQHJldHVybiBBIG5vZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIERUTSBub2RlLgorICAgKi8KKyAgcHVibGljIE5vZGUgZ2V0Tm9kZShpbnQgbm9kZUhhbmRsZSkKKyAgeworCisgICAgaW50IGlkZW50aXR5ID0gbm9kZUhhbmRsZSAmIG1fbWFzazsKKworICAgIHJldHVybiAoTm9kZSkgbV9ub2Rlcy5lbGVtZW50QXQoaWRlbnRpdHkpOworICB9CisKKyAgLyoqCisgICAqIEdldCBhIE5vZGUgZnJvbSBhbiBpZGVudGl0eSBpbmRleC4KKyAgICoKKyAgICogTkVFRFNET0MgQHBhcmFtIG5vZGVJZGVudGl0eQorICAgKgorICAgKiBORUVEU0RPQyAoJG9iamVjdE5hbWUkKSBAcmV0dXJuCisgICAqLworICBwcm90ZWN0ZWQgTm9kZSBsb29rdXBOb2RlKGludCBub2RlSWRlbnRpdHkpCisgIHsKKyAgICByZXR1cm4gKE5vZGUpIG1fbm9kZXMuZWxlbWVudEF0KG5vZGVJZGVudGl0eSk7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBuZXh0IG5vZGUgaWRlbnRpdHkgdmFsdWUgaW4gdGhlIGxpc3QsIGFuZCBjYWxsIHRoZSBpdGVyYXRvcgorICAgKiBpZiBpdCBoYXNuJ3QgYmVlbiBhZGRlZCB5ZXQuCisgICAqCisgICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgbm9kZSBpZGVudGl0eSAoaW5kZXgpLgorICAgKiBAcmV0dXJuIGlkZW50aXR5KzEsIG9yIERUTS5OVUxMLgorICAgKi8KKyAgcHJvdGVjdGVkIGludCBnZXROZXh0Tm9kZUlkZW50aXR5KGludCBpZGVudGl0eSkKKyAgeworCisgICAgaWRlbnRpdHkgKz0gMTsKKworICAgIGlmIChpZGVudGl0eSA+PSBtX25vZGVzLnNpemUoKSkKKyAgICB7CisgICAgICBpZiAoIW5leHROb2RlKCkpCisgICAgICAgIGlkZW50aXR5ID0gRFRNLk5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGlkZW50aXR5OworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgaGFuZGxlIGZyb20gYSBOb2RlLgorICAgKiA8cD4lT1BUJSBUaGlzIHdpbGwgYmUgcHJldHR5IHNsb3cuPC9wPgorICAgKiAKKyAgICogJVJFVklFVyUgVGhpcyByZWxpZXMgb24gYmVpbmcgYWJsZSB0byB0ZXN0IG5vZGUtaWRlbnRpdHkgdmlhCisgICAqIG9iamVjdC1pZGVudGl0eS4gRFRNMkRPTSBwcm94eWluZyBpcyBhIGdyZWF0IGV4YW1wbGUgb2YgYSBjYXNlIHdoZXJlCisgICAqIHRoYXQgZG9lc24ndCB3b3JrLiBET00gTGV2ZWwgMyB3aWxsIHByb3ZpZGUgdGhlIGlzU2FtZU5vZGUoKSBtZXRob2QKKyAgICogdG8gZml4IHRoYXQsIGJ1dCB1bnRpbCB0aGVuIHRoaXMgaXMgZ29pbmcgdG8gYmUgZmxha3kuCisgICAqCisgICAqIEBwYXJhbSBub2RlIEEgbm9kZSwgd2hpY2ggbWF5IGJlIG51bGwuCisgICAqCisgICAqIEByZXR1cm4gVGhlIG5vZGUgaGFuZGxlIG9yIDxjb2RlPkRUTS5OVUxMPC9jb2RlPi4KKyAgICovCisgIHByaXZhdGUgaW50IGdldEhhbmRsZUZyb21Ob2RlKE5vZGUgbm9kZSkKKyAgeworICAgIGlmIChudWxsICE9IG5vZGUpCisgICAgeworICAgICAgaW50IGxlbiA9IG1fbm9kZXMuc2l6ZSgpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKwl7CisJICBpZiAobV9ub2Rlcy5lbGVtZW50QXQoaSkgPT0gbm9kZSkKKwkgICAgcmV0dXJuIGkgfCBtX2R0bUlkZW50OworCX0KKyAgICB9CisKKyAgICByZXR1cm4gRFRNLk5VTEw7CisgIH0KKworICAvKiogR2V0IHRoZSBoYW5kbGUgZnJvbSBhIE5vZGUuIFRoaXMgaXMgYSBtb3JlIHJvYnVzdCB2ZXJzaW9uIG9mCisgICAqIGdldEhhbmRsZUZyb21Ob2RlLCBpbnRlbmRlZCB0byBiZSB1c2FibGUgYnkgdGhlIHB1YmxpYy4KKyAgICoKKyAgICogPHA+JU9QVCUgVGhpcyB3aWxsIGJlIHByZXR0eSBzbG93LjwvcD4KKyAgICogCisgICAqICVSRVZJRVclIFRoaXMgcmVsaWVzIG9uIGJlaW5nIGFibGUgdG8gdGVzdCBub2RlLWlkZW50aXR5IHZpYQorICAgKiBvYmplY3QtaWRlbnRpdHkuIERUTTJET00gcHJveHlpbmcgaXMgYSBncmVhdCBleGFtcGxlIG9mIGEgY2FzZSB3aGVyZQorICAgKiB0aGF0IGRvZXNuJ3Qgd29yay4gRE9NIExldmVsIDMgd2lsbCBwcm92aWRlIHRoZSBpc1NhbWVOb2RlKCkgbWV0aG9kCisgICAqIHRvIGZpeCB0aGF0LCBidXQgdW50aWwgdGhlbiB0aGlzIGlzIGdvaW5nIHRvIGJlIGZsYWt5LgorICAgKgorICAgKiBAcGFyYW0gbm9kZSBBIG5vZGUsIHdoaWNoIG1heSBiZSBudWxsLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBub2RlIGhhbmRsZSBvciA8Y29kZT5EVE0uTlVMTDwvY29kZT4uICAqLworICBwdWJsaWMgaW50IGdldEhhbmRsZU9mTm9kZShOb2RlIG5vZGUpCisgIHsKKyAgICBpZiAobnVsbCAhPSBub2RlKQorICAgIHsKKyAgICAgIC8vIElzIE5vZGUgYWN0dWFsbHkgd2l0aGluIHRoZSBzYW1lIGRvY3VtZW50PyBJZiBub3QsIGRvbid0IHNlYXJjaCEKKyAgICAgIC8vIFRoaXMgd291bGQgYmUgZWFzaWVyIGlmIG1fcm9vdCB3YXMgYWx3YXlzIHRoZSBEb2N1bWVudCBub2RlLCBidXQKKyAgICAgIC8vIHdlIGRlY2lkZWQgdG8gYWxsb3cgd3JhcHBpbmcgYSBEVE0gYXJvdW5kIGEgc3VidHJlZS4KKyAgICAgIGlmKChtX3Jvb3Q9PW5vZGUpIHx8CisJIChtX3Jvb3QuZ2V0Tm9kZVR5cGUoKT09RE9DVU1FTlRfTk9ERSAmJgorCSAgbV9yb290PT1ub2RlLmdldE93bmVyRG9jdW1lbnQoKSkgfHwKKwkgKG1fcm9vdC5nZXROb2RlVHlwZSgpIT1ET0NVTUVOVF9OT0RFICYmCisJICBtX3Jvb3QuZ2V0T3duZXJEb2N1bWVudCgpPT1ub2RlLmdldE93bmVyRG9jdW1lbnQoKSkKKwkgKQorCXsKKwkgIC8vIElmIG5vZGUgX2lzXyBpbiBtX3Jvb3QncyB0cmVlLCBmaW5kIGl0cyBoYW5kbGUKKwkgIC8vCisJICAvLyAlT1BUJSBUaGlzIGNoZWNrIG1heSBiZSBpbXByb3ZlZCBzaWduaWZpY2FudGx5IHdoZW4gRE9NCisJICAvLyBMZXZlbCAzIG5vZGVLZXkgYW5kIHJlbGF0aXZlLW9yZGVyIHRlc3RzIGJlY29tZQorCSAgLy8gYXZhaWxhYmxlIQorCSAgZm9yKE5vZGUgY3Vyc29yPW5vZGU7CisJICAgICAgY3Vyc29yIT1udWxsOworCSAgICAgIGN1cnNvcj0KKwkJKGN1cnNvci5nZXROb2RlVHlwZSgpIT1BVFRSSUJVVEVfTk9ERSkKKwkJPyBjdXJzb3IuZ2V0UGFyZW50Tm9kZSgpCisJCTogKChvcmcudzNjLmRvbS5BdHRyKWN1cnNvcikuZ2V0T3duZXJFbGVtZW50KCkpCisJICAgIHsKKwkgICAgICBpZihjdXJzb3I9PW1fcm9vdCkKKwkJLy8gV2Uga25vdyB0aGlzIG5vZGU7IGZpbmQgaXRzIGhhbmRsZS4KKwkJcmV0dXJuIGdldEhhbmRsZUZyb21Ob2RlKG5vZGUpOyAKKwkgICAgfSAvLyBmb3IgYW5jZXN0b3JzIG9mIG5vZGUKKwl9IC8vIGlmIG5vZGUgYW5kIG1fcm9vdCBpbiBzYW1lIERvY3VtZW50CisgICAgfSAvLyBpZiBub2RlIT1udWxsCisKKyAgICByZXR1cm4gRFRNLk5VTEw7CisgIH0KKworICAvKioKKyAgICogUmV0cmlldmVzIGFuIGF0dHJpYnV0ZSBub2RlIGJ5IGJ5IHF1YWxpZmllZCBuYW1lIGFuZCBuYW1lc3BhY2UgVVJJLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBpbnQgSGFuZGxlIG9mIHRoZSBub2RlIHVwb24gd2hpY2ggdG8gbG9vayB1cCB0aGlzIGF0dHJpYnV0ZS4uCisgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgVGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGF0dHJpYnV0ZSB0bworICAgKiAgIHJldHJpZXZlLCBvciBudWxsLgorICAgKiBAcGFyYW0gbmFtZSBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvCisgICAqICAgcmV0cmlldmUuCisgICAqIEByZXR1cm4gVGhlIGF0dHJpYnV0ZSBub2RlIGhhbmRsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSAoCisgICAqICAgPGNvZGU+bm9kZU5hbWU8L2NvZGU+KSBvciA8Y29kZT5EVE0uTlVMTDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaAorICAgKiAgIGF0dHJpYnV0ZS4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlTm9kZShpbnQgbm9kZUhhbmRsZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKQorICB7CisKKyAgICAvLyAlT1BUJSBUaGlzIGlzIHByb2JhYmx5IHNsb3dlciB0aGFuIGl0IG5lZWRzIHRvIGJlLgorICAgIGlmIChudWxsID09IG5hbWVzcGFjZVVSSSkKKyAgICAgIG5hbWVzcGFjZVVSSSA9ICIiOworCisgICAgaW50IHR5cGUgPSBnZXROb2RlVHlwZShub2RlSGFuZGxlKTsKKworICAgIGlmIChEVE0uRUxFTUVOVF9OT0RFID09IHR5cGUpCisgICAgeworCisgICAgICAvLyBBc3N1bWUgdGhhdCBhdHRyaWJ1dGVzIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgZWxlbWVudC4KKyAgICAgIGludCBpZGVudGl0eSA9IG5vZGVIYW5kbGUgJiBtX21hc2s7CisKKyAgICAgIHdoaWxlIChEVE0uTlVMTCAhPSAoaWRlbnRpdHkgPSBnZXROZXh0Tm9kZUlkZW50aXR5KGlkZW50aXR5KSkpCisgICAgICB7CisgICAgICAgIC8vIEFzc3VtZSB0aGlzIGNhbiBub3QgYmUgbnVsbC4KKyAgICAgICAgdHlwZSA9IGdldE5vZGVUeXBlKGlkZW50aXR5KTsKKworICAgICAgICBpZiAodHlwZSA9PSBEVE0uQVRUUklCVVRFX05PREUpCisgICAgICAgIHsKKyAgICAgICAgICBOb2RlIG5vZGUgPSBsb29rdXBOb2RlKGlkZW50aXR5KTsKKyAgICAgICAgICBTdHJpbmcgbm9kZXVyaSA9IG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7CisKKyAgICAgICAgICBpZiAobnVsbCA9PSBub2RldXJpKQorICAgICAgICAgICAgbm9kZXVyaSA9ICIiOworCisgICAgICAgICAgU3RyaW5nIG5vZGVsb2NhbG5hbWUgPSBub2RlLmdldExvY2FsTmFtZSgpOworCisgICAgICAgICAgaWYgKG5vZGV1cmkuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYgbmFtZS5lcXVhbHMobm9kZWxvY2FsbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gaWRlbnRpdHkgfCBtX2R0bUlkZW50OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKERUTS5OQU1FU1BBQ0VfTk9ERSAhPSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRFRNLk5VTEw7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBzdHJpbmctdmFsdWUgb2YgYSBub2RlIGFzIGEgU3RyaW5nIG9iamVjdAorICAgKiAoc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI2RhdGEtbW9kZWwKKyAgICogZm9yIHRoZSBkZWZpbml0aW9uIG9mIGEgbm9kZSdzIHN0cmluZy12YWx1ZSkuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIElELgorICAgKgorICAgKiBAcmV0dXJuIEEgc3RyaW5nIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHN0cmluZy12YWx1ZSBvZiB0aGUgZ2l2ZW4gbm9kZS4KKyAgICovCisgIHB1YmxpYyBYTUxTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoaW50IG5vZGVIYW5kbGUpCisgIHsKKworICAgIGludCB0eXBlID0gZ2V0Tm9kZVR5cGUobm9kZUhhbmRsZSk7CisgICAgTm9kZSBub2RlID0gZ2V0Tm9kZShub2RlSGFuZGxlKTsKKyAgICAvLyAlVEJEJSBJZiBhbiBlbGVtZW50IG9ubHkgaGFzIG9uZSB0ZXh0IG5vZGUsIHdlIHNob3VsZCBqdXN0IHVzZSBpdCAKKyAgICAvLyBkaXJlY3RseS4KKyAgICBpZihEVE0uRUxFTUVOVF9OT0RFID09IHR5cGUgfHwgRFRNLkRPQ1VNRU5UX05PREUgPT0gdHlwZSAKKyAgICB8fCBEVE0uRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9PSB0eXBlKQorICAgIHsKKyAgICAgIEZhc3RTdHJpbmdCdWZmZXIgYnVmID0gU3RyaW5nQnVmZmVyUG9vbC5nZXQoKTsKKyAgICAgIFN0cmluZyBzOworICAKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICBnZXROb2RlRGF0YShub2RlLCBidWYpOworICAKKyAgICAgICAgcyA9IChidWYubGVuZ3RoKCkgPiAwKSA/IGJ1Zi50b1N0cmluZygpIDogIiI7CisgICAgICB9CisgICAgICBmaW5hbGx5CisgICAgICB7CisgICAgICAgIFN0cmluZ0J1ZmZlclBvb2wuZnJlZShidWYpOworICAgICAgfQorICAKKyAgICAgIHJldHVybiBtX3hzdHJmLm5ld3N0ciggcyApOworCisgICAgfQorICAgIHJldHVybiBtX3hzdHJmLm5ld3N0ciggbm9kZS5nZXROb2RlVmFsdWUoKSApOworICB9CisgIAorICAvKioKKyAgICogUmV0cmlldmUgdGhlIHRleHQgY29udGVudCBvZiBhIERPTSBzdWJ0cmVlLCBhcHBlbmRpbmcgaXQgaW50byBhCisgICAqIHVzZXItc3VwcGxpZWQgRmFzdFN0cmluZ0J1ZmZlciBvYmplY3QuIE5vdGUgdGhhdCBhdHRyaWJ1dGVzIGFyZQorICAgKiBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjb250ZW50IG9mIGFuIGVsZW1lbnQuCisgICAqIDxwPgorICAgKiBUaGVyZSBhcmUgb3BlbiBxdWVzdGlvbnMgcmVnYXJkaW5nIHdoaXRlc3BhY2Ugc3RyaXBwaW5nLiAKKyAgICogQ3VycmVudGx5IHdlIG1ha2Ugbm8gc3BlY2lhbCBlZmZvcnQgaW4gdGhhdCByZWdhcmQsIHNpbmNlIHRoZSBzdGFuZGFyZAorICAgKiBET00gZG9lc24ndCB5ZXQgcHJvdmlkZSBEVEQtYmFzZWQgaW5mb3JtYXRpb24gdG8gZGlzdGluZ3Vpc2gKKyAgICogd2hpdGVzcGFjZS1pbi1lbGVtZW50LWNvbnRleHQgZnJvbSBnZW51aW5lICNQQ0RBVEEuIE5vdGUgdGhhdCB3ZQorICAgKiBzaG91bGQgcHJvYmFibHkgYWxzbyBjb25zaWRlciB4bWw6c3BhY2UgaWYvd2hlbiB3ZSBhZGRyZXNzIHRoaXMuCisgICAqIERPTSBMZXZlbCAzIG1heSBzb2x2ZSB0aGUgcHJvYmxlbSBmb3IgdXMuCisgICAqCisgICAqIEBwYXJhbSBub2RlIE5vZGUgd2hvc2Ugc3VidHJlZSBpcyB0byBiZSB3YWxrZWQsIGdhdGhlcmluZyB0aGUKKyAgICogY29udGVudHMgb2YgYWxsIFRleHQgb3IgQ0RBVEFTZWN0aW9uIG5vZGVzLgorICAgKiBAcGFyYW0gYnVmIEZhc3RTdHJpbmdCdWZmZXIgaW50byB3aGljaCB0aGUgY29udGVudHMgb2YgdGhlIHRleHQKKyAgICogbm9kZXMgYXJlIHRvIGJlIGNvbmNhdGVuYXRlZC4KKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBnZXROb2RlRGF0YShOb2RlIG5vZGUsIEZhc3RTdHJpbmdCdWZmZXIgYnVmKQorICB7CisKKyAgICBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkKKyAgICB7CisgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgOgorICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKKyAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKKyAgICB7CisgICAgICBmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgbnVsbCAhPSBjaGlsZDsKKyAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKQorICAgICAgeworICAgICAgICBnZXROb2RlRGF0YShjaGlsZCwgYnVmKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6CisgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6CisgICAgICBidWYuYXBwZW5kKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKKyAgICAgIGJ1Zi5hcHBlbmQobm9kZS5nZXROb2RlVmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKKyAgICAgIC8vIHdhcm5pbmcoWFBBVEhFcnJvclJlc291cmNlcy5XR19QQVJTSU5HX0FORF9QUkVQQVJJTkcpOyAgICAgICAgCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8vIGlnbm9yZQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiBpdHMgRE9NLXN0eWxlIG5vZGUgbmFtZS4gVGhpcyB3aWxsCisgICAqIGluY2x1ZGUgbmFtZXMgc3VjaCBhcyAjdGV4dCBvciAjZG9jdW1lbnQuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICogQHJldHVybiBTdHJpbmcgTmFtZSBvZiB0aGlzIG5vZGUsIHdoaWNoIG1heSBiZSBhbiBlbXB0eSBzdHJpbmcuCisgICAqICVSRVZJRVclIERvY3VtZW50IHdoZW4gZW1wdHkgc3RyaW5nIGlzIHBvc3NpYmxlLi4uCisgICAqICVSRVZJRVctQ09NTUVOVCUgSXQgc2hvdWxkIG5ldmVyIGJlIGVtcHR5LCBzaG91bGQgaXQ/CisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBOb2RlIG5vZGUgPSBnZXROb2RlKG5vZGVIYW5kbGUpOworCisgICAgLy8gQXNzdW1lIG5vbi1udWxsLgorICAgIHJldHVybiBub2RlLmdldE5vZGVOYW1lKCk7CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIHRoZSBYUGF0aCBub2RlIG5hbWUuICBUaGlzIHNob3VsZCBiZQorICAgKiB0aGUgbmFtZSBhcyBkZXNjcmliZWQgYnkgdGhlIFhQYXRoIGRhdGEgbW9kZWwsIE5PVCB0aGUgRE9NLXN0eWxlCisgICAqIG5hbWUuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICogQHJldHVybiBTdHJpbmcgTmFtZSBvZiB0aGlzIG5vZGUsIHdoaWNoIG1heSBiZSBhbiBlbXB0eSBzdHJpbmcuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lWChpbnQgbm9kZUhhbmRsZSkKKyAgeworCisgICAgU3RyaW5nIG5hbWU7CisgICAgc2hvcnQgdHlwZSA9IGdldE5vZGVUeXBlKG5vZGVIYW5kbGUpOworCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIERUTS5OQU1FU1BBQ0VfTk9ERSA6CisgICAgeworICAgICAgTm9kZSBub2RlID0gZ2V0Tm9kZShub2RlSGFuZGxlKTsKKworICAgICAgLy8gYXNzdW1lIG5vdCBudWxsLgorICAgICAgbmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKKyAgICAgIGlmKG5hbWUuc3RhcnRzV2l0aCgieG1sbnM6IikpCisgICAgICB7CisgICAgICAgIG5hbWUgPSBRTmFtZS5nZXRMb2NhbFBhcnQobmFtZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKG5hbWUuZXF1YWxzKCJ4bWxucyIpKQorICAgICAgeworICAgICAgICBuYW1lID0gIiI7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgRFRNLkFUVFJJQlVURV9OT0RFIDoKKyAgICBjYXNlIERUTS5FTEVNRU5UX05PREUgOgorICAgIGNhc2UgRFRNLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6CisgICAgY2FzZSBEVE0uUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKKyAgICB7CisgICAgICBOb2RlIG5vZGUgPSBnZXROb2RlKG5vZGVIYW5kbGUpOworCisgICAgICAvLyBhc3N1bWUgbm90IG51bGwuCisgICAgICBuYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOworICAgIH0KKyAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIG5hbWUgPSAiIjsKKyAgICB9CisKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gaXRzIFhQYXRoLXN0eWxlIGxvY2FsbmFtZS4KKyAgICogKEFzIGRlZmluZWQgaW4gTmFtZXNwYWNlcywgdGhpcyBpcyB0aGUgcG9ydGlvbiBvZiB0aGUgbmFtZSBhZnRlciBhbnkKKyAgICogY29sb24gY2hhcmFjdGVyKS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIFN0cmluZyBMb2NhbCBuYW1lIG9mIHRoaXMgbm9kZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBTdHJpbmcgbmFtZTsKKyAgICBzaG9ydCB0eXBlID0gZ2V0Tm9kZVR5cGUobm9kZUhhbmRsZSk7CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgRFRNLkFUVFJJQlVURV9OT0RFIDoKKyAgICBjYXNlIERUTS5FTEVNRU5UX05PREUgOgorICAgIGNhc2UgRFRNLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6CisgICAgY2FzZSBEVE0uTkFNRVNQQUNFX05PREUgOgorICAgIGNhc2UgRFRNLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6CisgICAgeworICAgICAgTm9kZSBub2RlID0gZ2V0Tm9kZShub2RlSGFuZGxlKTsKKworICAgICAgLy8gYXNzdW1lIG5vdCBudWxsLgorICAgICAgbmFtZSA9IG5vZGUuZ2V0TG9jYWxOYW1lKCk7CisKKyAgICAgIGlmIChudWxsID09IG5hbWUpCisgICAgICB7CisgICAgICAgIFN0cmluZyBxbmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKKyAgICAgICAgaW50IGluZGV4ID0gcW5hbWUuaW5kZXhPZignOicpOworCisgICAgICAgIG5hbWUgPSAoaW5kZXggPCAwKSA/IHFuYW1lIDogcW5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgbmFtZSA9ICIiOworICAgIH0KKworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGEgbmFtZXNwYWNlIGhhbmRsZSwgcmV0dXJuIHRoZSBwcmVmaXggdGhhdCB0aGUgbmFtZXNwYWNlIGRlY2wgaXMKKyAgICogbWFwcGluZy4KKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIHRoZSBwcmVmaXggdXNlZCB0byBtYXAgdG8gdGhlIG5hbWVzcGFjZS4KKyAgICoKKyAgICogPHA+ICVSRVZJRVclIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCAiIiBmb3Igbm8gcHJlZml4PyAgPC9wPgorICAgKiA8cD4gJVJFVklFVy1DT01NRU5UJSBJIHRoaW5rIHNvLi4uIG5vdCB0b3RhbGx5IHN1cmUuIC1zYiAgPC9wPgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSB0aGUgaWQgb2YgdGhlIG5vZGUuCisgICAqIEByZXR1cm4gU3RyaW5nIHByZWZpeCBvZiB0aGlzIG5vZGUncyBuYW1lLCBvciAiIiBpZiBubyBleHBsaWNpdAorICAgKiBuYW1lc3BhY2UgcHJlZml4IHdhcyBnaXZlbi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBTdHJpbmcgcHJlZml4OworICAgIHNob3J0IHR5cGUgPSBnZXROb2RlVHlwZShub2RlSGFuZGxlKTsKKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBEVE0uTkFNRVNQQUNFX05PREUgOgorICAgIHsKKyAgICAgIE5vZGUgbm9kZSA9IGdldE5vZGUobm9kZUhhbmRsZSk7CisKKyAgICAgIC8vIGFzc3VtZSBub3QgbnVsbC4KKyAgICAgIFN0cmluZyBxbmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKKyAgICAgIGludCBpbmRleCA9IHFuYW1lLmluZGV4T2YoJzonKTsKKworICAgICAgcHJlZml4ID0gKGluZGV4IDwgMCkgPyAiIiA6IHFuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOworICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIERUTS5BVFRSSUJVVEVfTk9ERSA6CisgICAgY2FzZSBEVE0uRUxFTUVOVF9OT0RFIDoKKyAgICB7CisgICAgICBOb2RlIG5vZGUgPSBnZXROb2RlKG5vZGVIYW5kbGUpOworCisgICAgICAvLyBhc3N1bWUgbm90IG51bGwuCisgICAgICBTdHJpbmcgcW5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7CisgICAgICBpbnQgaW5kZXggPSBxbmFtZS5pbmRleE9mKCc6Jyk7CisKKyAgICAgIHByZWZpeCA9IChpbmRleCA8IDApID8gIiIgOiBxbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgIH0KKyAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIHByZWZpeCA9ICIiOworICAgIH0KKworICAgIHJldHVybiBwcmVmaXg7CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGl0cyBET00tc3R5bGUgbmFtZXNwYWNlIFVSSQorICAgKiAoQXMgZGVmaW5lZCBpbiBOYW1lc3BhY2VzLCB0aGlzIGlzIHRoZSBkZWNsYXJlZCBVUkkgd2hpY2ggdGhpcyBub2RlJ3MKKyAgICogcHJlZml4IC0tIG9yIGRlZmF1bHQgaW4gbGlldSB0aGVyZW9mIC0tIHdhcyBtYXBwZWQgdG8uKQorICAgKgorICAgKiA8cD4lUkVWSUVXJSBOdWxsIG9yICIiPyAtc2I8L3A+CisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICogQHJldHVybiBTdHJpbmcgVVJJIHZhbHVlIG9mIHRoaXMgbm9kZSdzIG5hbWVzcGFjZSwgb3IgbnVsbCBpZiBubworICAgKiBuYW1lc3BhY2Ugd2FzIHJlc29sdmVkLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IG5vZGVIYW5kbGUpCisgIHsKKworICAgIFN0cmluZyBuc3VyaTsKKyAgICBzaG9ydCB0eXBlID0gZ2V0Tm9kZVR5cGUobm9kZUhhbmRsZSk7CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgRFRNLkFUVFJJQlVURV9OT0RFIDoKKyAgICBjYXNlIERUTS5FTEVNRU5UX05PREUgOgorICAgIGNhc2UgRFRNLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6CisgICAgY2FzZSBEVE0uTkFNRVNQQUNFX05PREUgOgorICAgIGNhc2UgRFRNLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6CisgICAgeworICAgICAgTm9kZSBub2RlID0gZ2V0Tm9kZShub2RlSGFuZGxlKTsKKworICAgICAgLy8gYXNzdW1lIG5vdCBudWxsLgorICAgICAgbnN1cmkgPSBub2RlLmdldE5hbWVzcGFjZVVSSSgpOworCisgICAgICAvLyAlVEJEJSBIYW5kbGUgRE9NMT8KKyAgICB9CisgICAgYnJlYWs7CisgICAgZGVmYXVsdCA6CisgICAgICBuc3VyaSA9IG51bGw7CisgICAgfQorCisgICAgcmV0dXJuIG5zdXJpOworICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiBpdHMgbm9kZSB2YWx1ZS4gVGhpcyBpcyBtb3N0bHkKKyAgICogYXMgZGVmaW5lZCBieSB0aGUgRE9NLCBidXQgbWF5IGlnbm9yZSBzb21lIGNvbnZlbmllbmNlcy4KKyAgICogPHA+CisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLgorICAgKiBAcmV0dXJuIFN0cmluZyBWYWx1ZSBvZiB0aGlzIG5vZGUsIG9yIG51bGwgaWYgbm90CisgICAqIG1lYW5pbmdmdWwgZm9yIHRoaXMgbm9kZSB0eXBlLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoaW50IG5vZGVIYW5kbGUpCisgIHsKKworICAgIE5vZGUgbm9kZSA9IGdldE5vZGUobm9kZUhhbmRsZSk7CisKKyAgICByZXR1cm4gbm9kZS5nZXROb2RlVmFsdWUoKTsKKyAgfQorCisKKyAgLyoqCisgICAqICAgQSBkb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9uIGluZm9ybWF0aW9uIGl0ZW0gaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICoKKyAgICogICAgIDEuIFtzeXN0ZW0gaWRlbnRpZmllcl0gVGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBleHRlcm5hbCBzdWJzZXQsIGlmCisgICAqICAgICAgICBpdCBleGlzdHMuIE90aGVyd2lzZSB0aGlzIHByb3BlcnR5IGhhcyBubyB2YWx1ZS4KKyAgICoKKyAgICogQHJldHVybiB0aGUgc3lzdGVtIGlkZW50aWZpZXIgU3RyaW5nIG9iamVjdCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudFR5cGVEZWNsYXJhdGlvblN5c3RlbUlkZW50aWZpZXIoKQorICB7CisKKyAgICBEb2N1bWVudCBkb2M7CisKKyAgICBpZiAobV9yb290LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQorICAgICAgZG9jID0gKERvY3VtZW50KSBtX3Jvb3Q7CisgICAgZWxzZQorICAgICAgZG9jID0gbV9yb290LmdldE93bmVyRG9jdW1lbnQoKTsKKworICAgIGlmIChudWxsICE9IGRvYykKKyAgICB7CisgICAgICBEb2N1bWVudFR5cGUgZHRkID0gZG9jLmdldERvY3R5cGUoKTsKKworICAgICAgaWYgKG51bGwgIT0gZHRkKQorICAgICAgeworICAgICAgICByZXR1cm4gZHRkLmdldFN5c3RlbUlkKCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgZXh0ZXJuYWwgc3Vic2V0LAorICAgKiBub3JtYWxpemVkIGFzIGRlc2NyaWJlZCBpbiA0LjIuMiBFeHRlcm5hbCBFbnRpdGllcyBbWE1MXS4gSWYgdGhlcmUgaXMKKyAgICogbm8gZXh0ZXJuYWwgc3Vic2V0IG9yIGlmIGl0IGhhcyBubyBwdWJsaWMgaWRlbnRpZmllciwgdGhpcyBwcm9wZXJ0eQorICAgKiBoYXMgbm8gdmFsdWUuCisgICAqCisgICAqIEBwYXJhbSB0aGUgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbiBoYW5kbGUKKyAgICoKKyAgICogQHJldHVybiB0aGUgcHVibGljIGlkZW50aWZpZXIgU3RyaW5nIG9iamVjdCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudFR5cGVEZWNsYXJhdGlvblB1YmxpY0lkZW50aWZpZXIoKQorICB7CisKKyAgICBEb2N1bWVudCBkb2M7CisKKyAgICBpZiAobV9yb290LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQorICAgICAgZG9jID0gKERvY3VtZW50KSBtX3Jvb3Q7CisgICAgZWxzZQorICAgICAgZG9jID0gbV9yb290LmdldE93bmVyRG9jdW1lbnQoKTsKKworICAgIGlmIChudWxsICE9IGRvYykKKyAgICB7CisgICAgICBEb2N1bWVudFR5cGUgZHRkID0gZG9jLmdldERvY3R5cGUoKTsKKworICAgICAgaWYgKG51bGwgIT0gZHRkKQorICAgICAgeworICAgICAgICByZXR1cm4gZHRkLmdldFB1YmxpY0lkKCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgPGNvZGU+RWxlbWVudDwvY29kZT4gd2hvc2UgPGNvZGU+SUQ8L2NvZGU+IGlzIGdpdmVuIGJ5CisgICAqIDxjb2RlPmVsZW1lbnRJZDwvY29kZT4uIElmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMsIHJldHVybnMKKyAgICogPGNvZGU+RFRNLk5VTEw8L2NvZGU+LiBCZWhhdmlvciBpcyBub3QgZGVmaW5lZCBpZiBtb3JlIHRoYW4gb25lIGVsZW1lbnQKKyAgICogaGFzIHRoaXMgPGNvZGU+SUQ8L2NvZGU+LiBBdHRyaWJ1dGVzIChpbmNsdWRpbmcgdGhvc2UKKyAgICogd2l0aCB0aGUgbmFtZSAiSUQiKSBhcmUgbm90IG9mIHR5cGUgSUQgdW5sZXNzIHNvIGRlZmluZWQgYnkgRFREL1NjaGVtYQorICAgKiBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gdGhlIERUTSBpbXBsZW1lbnRhdGlvbi4KKyAgICogSW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IGtub3cgd2hldGhlciBhdHRyaWJ1dGVzIGFyZSBvZiB0eXBlIElEIG9yCisgICAqIG5vdCBhcmUgZXhwZWN0ZWQgdG8gcmV0dXJuIDxjb2RlPkRUTS5OVUxMPC9jb2RlPi4KKyAgICoKKyAgICogPHA+JVJFVklFVyUgUHJlc3VtYWJseSBJRHMgYXJlIHN0aWxsIHNjb3BlZCB0byBhIHNpbmdsZSBkb2N1bWVudCwKKyAgICogYW5kIHRoaXMgb3BlcmF0aW9uIHNlYXJjaGVzIG9ubHkgd2l0aGluIGEgc2luZ2xlIGRvY3VtZW50LCByaWdodD8KKyAgICogV291bGRuJ3Qgd2FudCBjb2xsaXNpb25zIGJldHdlZW4gRFRNcyBpbiB0aGUgc2FtZSBwcm9jZXNzLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIGVsZW1lbnRJZCBUaGUgdW5pcXVlIDxjb2RlPmlkPC9jb2RlPiB2YWx1ZSBmb3IgYW4gZWxlbWVudC4KKyAgICogQHJldHVybiBUaGUgaGFuZGxlIG9mIHRoZSBtYXRjaGluZyBlbGVtZW50LgorICAgKi8KKyAgcHVibGljIGludCBnZXRFbGVtZW50QnlJZChTdHJpbmcgZWxlbWVudElkKQorICB7CisKKyAgICBEb2N1bWVudCBkb2MgPSAobV9yb290LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAKKyAgICAgICAgPyAoRG9jdW1lbnQpIG1fcm9vdCA6IG1fcm9vdC5nZXRPd25lckRvY3VtZW50KCk7CisgICAgICAgIAorICAgIGlmKG51bGwgIT0gZG9jKQorICAgIHsKKyAgICAgIE5vZGUgZWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpOworICAgICAgaWYobnVsbCAhPSBlbGVtKQorICAgICAgeworICAgICAgICBpbnQgZWxlbUhhbmRsZSA9IGdldEhhbmRsZUZyb21Ob2RlKGVsZW0pOworICAgICAgICAKKyAgICAgICAgaWYoRFRNLk5VTEwgPT0gZWxlbUhhbmRsZSkKKyAgICAgICAgeworICAgICAgICAgIGludCBpZGVudGl0eSA9IG1fbm9kZXMuc2l6ZSgpLTE7CisgICAgICAgICAgd2hpbGUgKERUTS5OVUxMICE9IChpZGVudGl0eSA9IGdldE5leHROb2RlSWRlbnRpdHkoaWRlbnRpdHkpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBnZXROb2RlKGlkZW50aXR5KTsKKyAgICAgICAgICAgIGlmKG5vZGUgPT0gZWxlbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZWxlbUhhbmRsZSA9IGdldEhhbmRsZUZyb21Ob2RlKGVsZW0pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gZWxlbUhhbmRsZTsKKyAgICAgIH0KKyAgICAKKyAgICB9CisgICAgcmV0dXJuIERUTS5OVUxMOworICB9CisKKyAgLyoqCisgICAqIFRoZSBnZXRVbnBhcnNlZEVudGl0eVVSSSBmdW5jdGlvbiByZXR1cm5zIHRoZSBVUkkgb2YgdGhlIHVucGFyc2VkCisgICAqIGVudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGUgc2FtZSBkb2N1bWVudCBhcyB0aGUgY29udGV4dAorICAgKiBub2RlIChzZWUgWzMuMyBVbnBhcnNlZCBFbnRpdGllc10pLiBJdCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYKKyAgICogdGhlcmUgaXMgbm8gc3VjaCBlbnRpdHkuCisgICAqIDxwPgorICAgKiBYTUwgcHJvY2Vzc29ycyBtYXkgY2hvb3NlIHRvIHVzZSB0aGUgU3lzdGVtIElkZW50aWZpZXIgKGlmIG9uZQorICAgKiBpcyBwcm92aWRlZCkgdG8gcmVzb2x2ZSB0aGUgZW50aXR5LCByYXRoZXIgdGhhbiB0aGUgVVJJIGluIHRoZQorICAgKiBQdWJsaWMgSWRlbnRpZmllci4gVGhlIGRldGFpbHMgYXJlIGRlcGVuZGVudCBvbiB0aGUgcHJvY2Vzc29yLCBhbmQKKyAgICogd2Ugd291bGQgaGF2ZSB0byBzdXBwb3J0IHNvbWUgZm9ybSBvZiBwbHVnLWluIHJlc29sdmVyIHRvIGhhbmRsZQorICAgKiB0aGlzIHByb3Blcmx5LiBDdXJyZW50bHksIHdlIHNpbXBseSByZXR1cm4gdGhlIFN5c3RlbSBJZGVudGlmaWVyIGlmCisgICAqIHByZXNlbnQsIGFuZCBob3BlIHRoYXQgaXQgYSB1c2FibGUgVVJJIG9yIHRoYXQgb3VyIGNhbGxlciBjYW4KKyAgICogbWFwIGl0IHRvIG9uZS4KKyAgICogVE9ETzogUmVzb2x2ZSBQdWJsaWMgSWRlbnRpZmllcnMuLi4gb3IgY29uc2lkZXIgY2hhbmdpbmcgZnVuY3Rpb24gbmFtZS4KKyAgICogPHA+CisgICAqIElmIHdlIGZpbmQgYSByZWxhdGl2ZSBVUkkKKyAgICogcmVmZXJlbmNlLCBYTUwgZXhwZWN0cyBpdCB0byBiZSByZXNvbHZlZCBpbiB0ZXJtcyBvZiB0aGUgYmFzZSBVUkkKKyAgICogb2YgdGhlIGRvY3VtZW50LiBUaGUgRE9NIGRvZXNuJ3QgZG8gdGhhdCBmb3IgdXMsIGFuZCBpdCBpc24ndAorICAgKiBlbnRpcmVseSBjbGVhciB3aGV0aGVyIHRoYXQgc2hvdWxkIGJlIGRvbmUgaGVyZTsgY3VycmVudGx5IHRoYXQncworICAgKiBwdXNoZWQgdXAgdG8gYSBoaWdoZXIgbGV2ZWwgb2Ygb3VyIGFwcGxpY2F0aW9uLiAoTm90ZSB0aGF0IERPTSBMZXZlbAorICAgKiAxIGRpZG4ndCBzdG9yZSB0aGUgZG9jdW1lbnQncyBiYXNlIFVSSS4pCisgICAqIFRPRE86IENvbnNpZGVyIHJlc29sdmluZyBSZWxhdGl2ZSBVUklzLgorICAgKiA8cD4KKyAgICogKFRoZSBET00ncyBzdGF0ZW1lbnQgdGhhdCAiQW4gWE1MIHByb2Nlc3NvciBtYXkgY2hvb3NlIHRvCisgICAqIGNvbXBsZXRlbHkgZXhwYW5kIGVudGl0aWVzIGJlZm9yZSB0aGUgc3RydWN0dXJlIG1vZGVsIGlzIHBhc3NlZAorICAgKiB0byB0aGUgRE9NIiByZWZlcnMgb25seSB0byBwYXJzZWQgZW50aXRpZXMsIG5vdCB1bnBhcnNlZCwgYW5kIGhlbmNlCisgICAqIGRvZXNuJ3QgYWZmZWN0IHRoaXMgZnVuY3Rpb24uKQorICAgKgorICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBFbnRpdHkgTmFtZSBvZiB0aGUgdW5wYXJzZWQKKyAgICogZW50aXR5LgorICAgKgorICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBVUkkgb2YgdGhlIFVucGFyc2VkIEVudGl0eSwgb3IgYW4KKyAgICogZW1wdHkgc3RyaW5nIGlmIG5vIHN1Y2ggZW50aXR5IGV4aXN0cy4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VW5wYXJzZWRFbnRpdHlVUkkoU3RyaW5nIG5hbWUpCisgIHsKKworICAgIFN0cmluZyB1cmwgPSAiIjsKKyAgICBEb2N1bWVudCBkb2MgPSAobV9yb290LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAKKyAgICAgICAgPyAoRG9jdW1lbnQpIG1fcm9vdCA6IG1fcm9vdC5nZXRPd25lckRvY3VtZW50KCk7CisKKyAgICBpZiAobnVsbCAhPSBkb2MpCisgICAgeworICAgICAgRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBkb2MuZ2V0RG9jdHlwZSgpOworICAKKyAgICAgIGlmIChudWxsICE9IGRvY3R5cGUpCisgICAgICB7CisgICAgICAgIE5hbWVkTm9kZU1hcCBlbnRpdGllcyA9IGRvY3R5cGUuZ2V0RW50aXRpZXMoKTsKKyAgICAgICAgaWYobnVsbCA9PSBlbnRpdGllcykKKyAgICAgICAgICByZXR1cm4gdXJsOworICAgICAgICBFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgZW50aXRpZXMuZ2V0TmFtZWRJdGVtKG5hbWUpOworICAgICAgICBpZihudWxsID09IGVudGl0eSkKKyAgICAgICAgICByZXR1cm4gdXJsOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIG5vdGF0aW9uTmFtZSA9IGVudGl0eS5nZXROb3RhdGlvbk5hbWUoKTsKKyAgCisgICAgICAgIGlmIChudWxsICE9IG5vdGF0aW9uTmFtZSkgIC8vIHRoZW4gaXQncyB1bnBhcnNlZAorICAgICAgICB7CisgICAgICAgICAgLy8gVGhlIGRyYWZ0IHNheXM6ICJUaGUgWFNMVCBwcm9jZXNzb3IgbWF5IHVzZSB0aGUgcHVibGljIAorICAgICAgICAgIC8vIGlkZW50aWZpZXIgdG8gZ2VuZXJhdGUgYSBVUkkgZm9yIHRoZSBlbnRpdHkgaW5zdGVhZCBvZiB0aGUgVVJJIAorICAgICAgICAgIC8vIHNwZWNpZmllZCBpbiB0aGUgc3lzdGVtIGlkZW50aWZpZXIuIElmIHRoZSBYU0xUIHByb2Nlc3NvciBkb2VzIAorICAgICAgICAgIC8vIG5vdCB1c2UgdGhlIHB1YmxpYyBpZGVudGlmaWVyIHRvIGdlbmVyYXRlIHRoZSBVUkksIGl0IG11c3QgdXNlIAorICAgICAgICAgIC8vIHRoZSBzeXN0ZW0gaWRlbnRpZmllcjsgaWYgdGhlIHN5c3RlbSBpZGVudGlmaWVyIGlzIGEgcmVsYXRpdmUgCisgICAgICAgICAgLy8gVVJJLCBpdCBtdXN0IGJlIHJlc29sdmVkIGludG8gYW4gYWJzb2x1dGUgVVJJIHVzaW5nIHRoZSBVUkkgb2YgCisgICAgICAgICAgLy8gdGhlIHJlc291cmNlIGNvbnRhaW5pbmcgdGhlIGVudGl0eSBkZWNsYXJhdGlvbiBhcyB0aGUgYmFzZSAKKyAgICAgICAgICAvLyBVUkkgW1JGQzIzOTZdLiIKKyAgICAgICAgICAvLyBTbyBJJ20gZmFsbGluZyBhIGJpdCBzaG9ydCBoZXJlLgorICAgICAgICAgIHVybCA9IGVudGl0eS5nZXRTeXN0ZW1JZCgpOworICAKKyAgICAgICAgICBpZiAobnVsbCA9PSB1cmwpCisgICAgICAgICAgeworICAgICAgICAgICAgdXJsID0gZW50aXR5LmdldFB1YmxpY0lkKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSByZXNvbHZlZCB0byBhbiBhYnNvbHV0ZSBVUkwsIGJ1dCB0aGF0J3MgaGFyZCAKKyAgICAgICAgICAgIC8vIHRvIGRvIGZyb20gaGVyZS4KKyAgICAgICAgICB9ICAgICAgICAKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB1cmw7CisgIH0KKworICAvKioKKyAgICogICAgIDUuIFtzcGVjaWZpZWRdIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgd2FzIGFjdHVhbGx5CisgICAqICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIHN0YXJ0LXRhZyBvZiBpdHMgZWxlbWVudCwgb3Igd2FzIGRlZmF1bHRlZCBmcm9tIHRoZQorICAgKiAgICAgICAgRFRELgorICAgKgorICAgKiBAcGFyYW0gdGhlIGF0dHJpYnV0ZSBoYW5kbGUKKyAgICoKKyAgICogTkVFRFNET0MgQHBhcmFtIGF0dHJpYnV0ZUhhbmRsZQorICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZDsKKyAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd2FzIGRlZmF1bHRlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKGludCBhdHRyaWJ1dGVIYW5kbGUpCisgIHsKKyAgICBpbnQgdHlwZSA9IGdldE5vZGVUeXBlKGF0dHJpYnV0ZUhhbmRsZSk7CisKKyAgICBpZiAoRFRNLkFUVFJJQlVURV9OT0RFID09IHR5cGUpCisgICAgeworICAgICAgQXR0ciBhdHRyID0gKEF0dHIpZ2V0Tm9kZShhdHRyaWJ1dGVIYW5kbGUpOworICAgICAgcmV0dXJuIGF0dHIuZ2V0U3BlY2lmaWVkKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8qKiBCaW5kIGEgQ29yb3V0aW5lUGFyc2VyIHRvIHRoaXMgRFRNLiBOT1QgUkVMRVZBTlQgZm9yIERPTTJEVE0sIHNpbmNlCisgICAqIHdlJ3JlIHdyYXBwZWQgYXJvdW5kIGFuIGV4aXN0aW5nIERPTS4KKyAgICoKKyAgICogQHBhcmFtIGNvcm91dGluZVBhcnNlciBUaGUgcGFyc2VyIHRoYXQgd2Ugd2FudCB0byByZWNpZXZlIGV2ZW50cyBmcm9tCisgICAqIG9uIGRlbWFuZC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldENvcm91dGluZVBhcnNlcihDb3JvdXRpbmVQYXJzZXIgY29yb3V0aW5lUGFyc2VyKQorICB7CisgIH0KKyAgCisgIC8qKiBnZXRDb250ZW50SGFuZGxlciByZXR1cm5zICJvdXIgU0FYIGJ1aWxkZXIiIC0tIHRoZSB0aGluZyB0aGF0CisgICAqIHNvbWVvbmUgZWxzZSBzaG91bGQgc2VuZCBTQVggZXZlbnRzIHRvIGluIG9yZGVyIHRvIGV4dGVuZCB0aGlzCisgICAqIERUTSBtb2RlbC4KKyAgICoKKyAgICogQHJldHVybiBudWxsIGlmIHRoaXMgbW9kZWwgZG9lc24ndCByZXNwb25kIHRvIFNBWCBldmVudHMsCisgICAqICJ0aGlzIiBpZiB0aGUgRFRNIG9iamVjdCBoYXMgYSBidWlsdC1pbiBTQVggQ29udGVudEhhbmRsZXIsCisgICAqIHRoZSBDb3JvdXRpbmVQYXJzZXIgaWYgd2UncmUgYm91bmQgdG8gb25lIGFuZCBzaG91bGQgcmVjZWl2ZQorICAgKiB0aGUgU0FYIHN0cmVhbSB2aWEgaXQgZm9yIGluY3JlbWVudGFsIGJ1aWxkIHB1cnBvc2VzLi4uCisgICAqICovCisgIHB1YmxpYyBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBnZXRDb250ZW50SGFuZGxlcigpCisgIHsKKyAgICAgIHJldHVybiBudWxsOworICB9CisgIAorICAvKioKKyAgICogUmV0dXJuIHRoaXMgRFRNJ3MgbGV4aWNhbCBoYW5kbGVyLgorICAgKgorICAgKiAlUkVWSUVXJSBTaG91bGQgdGhpcyByZXR1cm4gbnVsbCBpZiBjb25zdHJ1dGlvbiBhbHJlYWR5IGRvbmUvYmVndW4/CisgICAqCisgICAqIEByZXR1cm4gbnVsbCBpZiB0aGlzIG1vZGVsIGRvZXNuJ3QgcmVzcG9uZCB0byBsZXhpY2FsIFNBWCBldmVudHMsCisgICAqICJ0aGlzIiBpZiB0aGUgRFRNIG9iamVjdCBoYXMgYSBidWlsdC1pbiBTQVggQ29udGVudEhhbmRsZXIsCisgICAqIHRoZSBDb3JvdXRpbmVQYXJzZXIgaWYgd2UncmUgYm91bmQgdG8gb25lIGFuZCBzaG91bGQgcmVjZWl2ZQorICAgKiB0aGUgU0FYIHN0cmVhbSB2aWEgaXQgZm9yIGluY3JlbWVudGFsIGJ1aWxkIHB1cnBvc2VzLi4uCisgICAqLworICBwdWJsaWMgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyIGdldExleGljYWxIYW5kbGVyKCkKKyAgeworCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAKKyAgLyoqCisgICAqIFJldHVybiB0aGlzIERUTSdzIEVudGl0eVJlc29sdmVyLgorICAgKgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBtb2RlbCBkb2Vzbid0IHJlc3BvbmQgdG8gU0FYIGVudGl0eSByZWYgZXZlbnRzLgorICAgKi8KKyAgcHVibGljIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkKKyAgeworCisgICAgcmV0dXJuIG51bGw7CisgIH0KKyAgCisgIC8qKgorICAgKiBSZXR1cm4gdGhpcyBEVE0ncyBEVERIYW5kbGVyLgorICAgKgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBtb2RlbCBkb2Vzbid0IHJlc3BvbmQgdG8gU0FYIGR0ZCBldmVudHMuCisgICAqLworICBwdWJsaWMgb3JnLnhtbC5zYXguRFRESGFuZGxlciBnZXREVERIYW5kbGVyKCkKKyAgeworCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoaXMgRFRNJ3MgRXJyb3JIYW5kbGVyLgorICAgKgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBtb2RlbCBkb2Vzbid0IHJlc3BvbmQgdG8gU0FYIGVycm9yIGV2ZW50cy4KKyAgICovCisgIHB1YmxpYyBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIgZ2V0RXJyb3JIYW5kbGVyKCkKKyAgeworCisgICAgcmV0dXJuIG51bGw7CisgIH0KKyAgCisgIC8qKgorICAgKiBSZXR1cm4gdGhpcyBEVE0ncyBEZWNsSGFuZGxlci4KKyAgICoKKyAgICogQHJldHVybiBudWxsIGlmIHRoaXMgbW9kZWwgZG9lc24ndCByZXNwb25kIHRvIFNBWCBEZWNsIGV2ZW50cy4KKyAgICovCisgIHB1YmxpYyBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIgZ2V0RGVjbEhhbmRsZXIoKQorICB7CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfSAgCisKKyAgLyoqIEByZXR1cm4gdHJ1ZSBpZmYgd2UncmUgYnVpbGRpbmcgdGhpcyBtb2RlbCBpbmNyZW1lbnRhbGx5IChlZworICAgKiB3ZSdyZSBwYXJ0bmVyZWQgd2l0aCBhIENvcm91dGluZVBhcnNlcikgYW5kIHRodXMgcmVxdWlyZSB0aGF0IHRoZQorICAgKiB0cmFuc2Zvcm1hdGlvbiBhbmQgdGhlIHBhcnNlIHJ1biBzaW11bHRhbmVvdXNseS4gR3VpZGFuY2UgdG8gdGhlCisgICAqIERUTU1hbmFnZXIuCisgICAqICovCisgIHB1YmxpYyBib29sZWFuIG5lZWRzVHdvVGhyZWFkcygpCisgIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyA9PT09PT09PT09IERpcmVjdCBTQVggRGlzcGF0Y2gsIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMgPT09PT09PT0KKworICAvKioKKyAgICogRGlyZWN0bHkgY2FsbCB0aGUKKyAgICogY2hhcmFjdGVycyBtZXRob2Qgb24gdGhlIHBhc3NlZCBDb250ZW50SGFuZGxlciBmb3IgdGhlCisgICAqIHN0cmluZy12YWx1ZSBvZiB0aGUgZ2l2ZW4gbm9kZSAoc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI2RhdGEtbW9kZWwKKyAgICogZm9yIHRoZSBkZWZpbml0aW9uIG9mIGEgbm9kZSdzIHN0cmluZy12YWx1ZSkuIE11bHRpcGxlIGNhbGxzIHRvIHRoZQorICAgKiBDb250ZW50SGFuZGxlcidzIGNoYXJhY3RlcnMgbWV0aG9kcyBtYXkgd2VsbCBvY2N1ciBmb3IgYSBzaW5nbGUgY2FsbCB0bworICAgKiB0aGlzIG1ldGhvZC4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgSUQuCisgICAqIEBwYXJhbSBjaCBBIG5vbi1udWxsIHJlZmVyZW5jZSB0byBhIENvbnRlbnRIYW5kbGVyLgorICAgKgorICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIHZvaWQgZGlzcGF0Y2hDaGFyYWN0ZXJzRXZlbnRzKAorICAgICAgICAgIGludCBub2RlSGFuZGxlLCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBjaCkKKyAgICAgICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIGludCB0eXBlID0gZ2V0Tm9kZVR5cGUobm9kZUhhbmRsZSk7CisgICAgTm9kZSBub2RlID0gZ2V0Tm9kZShub2RlSGFuZGxlKTsKKyAgICBkaXNwYXRjaE5vZGVEYXRhKG5vZGUsIGNoLCAwKTsKKyAgfQorICAKKyAgLyoqCisgICAqIFJldHJpZXZlIHRoZSB0ZXh0IGNvbnRlbnQgb2YgYSBET00gc3VidHJlZSwgYXBwZW5kaW5nIGl0IGludG8gYQorICAgKiB1c2VyLXN1cHBsaWVkIEZhc3RTdHJpbmdCdWZmZXIgb2JqZWN0LiBOb3RlIHRoYXQgYXR0cmlidXRlcyBhcmUKKyAgICogbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgY29udGVudCBvZiBhbiBlbGVtZW50LgorICAgKiA8cD4KKyAgICogVGhlcmUgYXJlIG9wZW4gcXVlc3Rpb25zIHJlZ2FyZGluZyB3aGl0ZXNwYWNlIHN0cmlwcGluZy4gCisgICAqIEN1cnJlbnRseSB3ZSBtYWtlIG5vIHNwZWNpYWwgZWZmb3J0IGluIHRoYXQgcmVnYXJkLCBzaW5jZSB0aGUgc3RhbmRhcmQKKyAgICogRE9NIGRvZXNuJ3QgeWV0IHByb3ZpZGUgRFRELWJhc2VkIGluZm9ybWF0aW9uIHRvIGRpc3Rpbmd1aXNoCisgICAqIHdoaXRlc3BhY2UtaW4tZWxlbWVudC1jb250ZXh0IGZyb20gZ2VudWluZSAjUENEQVRBLiBOb3RlIHRoYXQgd2UKKyAgICogc2hvdWxkIHByb2JhYmx5IGFsc28gY29uc2lkZXIgeG1sOnNwYWNlIGlmL3doZW4gd2UgYWRkcmVzcyB0aGlzLgorICAgKiBET00gTGV2ZWwgMyBtYXkgc29sdmUgdGhlIHByb2JsZW0gZm9yIHVzLgorICAgKgorICAgKiBAcGFyYW0gbm9kZSBOb2RlIHdob3NlIHN1YnRyZWUgaXMgdG8gYmUgd2Fsa2VkLCBnYXRoZXJpbmcgdGhlCisgICAqIGNvbnRlbnRzIG9mIGFsbCBUZXh0IG9yIENEQVRBU2VjdGlvbiBub2Rlcy4KKyAgICogQHBhcmFtIGJ1ZiBGYXN0U3RyaW5nQnVmZmVyIGludG8gd2hpY2ggdGhlIGNvbnRlbnRzIG9mIHRoZSB0ZXh0CisgICAqIG5vZGVzIGFyZSB0byBiZSBjb25jYXRlbmF0ZWQuCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGlzcGF0Y2hOb2RlRGF0YShOb2RlIG5vZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBjaCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXB0aCkKKyAgICAgICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworCisgICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCisgICAgeworICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFIDoKKyAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6CisgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6CisgICAgeworICAgICAgZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IG51bGwgIT0gY2hpbGQ7CisgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKKyAgICAgIHsKKyAgICAgICAgZGlzcGF0Y2hOb2RlRGF0YShjaGlsZCwgY2gsIGRlcHRoKzEpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogLy8gJVJFVklFVyUKKyAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKKyAgICAgIGlmKDAgIT0gZGVwdGgpCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgorICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgorICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6CisgICAgICBTdHJpbmcgc3RyID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKKyAgICAgIGNoLmNoYXJhY3RlcnMoc3RyLnRvQ2hhckFycmF5KCksIDAsIHN0ci5sZW5ndGgoKSk7CisgICAgICBicmVhazsKKy8vICAgIC8qIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgorLy8gICAgICAvLyB3YXJuaW5nKFhQQVRIRXJyb3JSZXNvdXJjZXMuV0dfUEFSU0lOR19BTkRfUFJFUEFSSU5HKTsgICAgICAgIAorLy8gICAgICBicmVhazsgKi8KKyAgICBkZWZhdWx0IDoKKyAgICAgIC8vIGlnbm9yZQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIAorICBUcmVlV2Fsa2VyIG1fd2Fsa2VyID0gbmV3IFRyZWVXYWxrZXIobnVsbCk7CisgIAorICAvKioKKyAgICogRGlyZWN0bHkgY3JlYXRlIFNBWCBwYXJzZXIgZXZlbnRzIGZyb20gYSBzdWJ0cmVlLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KKyAgICogQHBhcmFtIGNoIEEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgQ29udGVudEhhbmRsZXIuCisgICAqCisgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBkaXNwYXRjaFRvRXZlbnRzKGludCBub2RlSGFuZGxlLCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBjaCkKKyAgICAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICBUcmVlV2Fsa2VyIHRyZWVXYWxrZXIgPSBtX3dhbGtlcjsKKyAgICBDb250ZW50SGFuZGxlciBwcmV2Q0ggPSB0cmVlV2Fsa2VyLmdldENvbnRlbnRIYW5kbGVyKCk7CisgICAgCisgICAgaWYobnVsbCAhPSBwcmV2Q0gpCisgICAgeworICAgICAgdHJlZVdhbGtlciA9IG5ldyBUcmVlV2Fsa2VyKG51bGwpOworICAgIH0KKyAgICB0cmVlV2Fsa2VyLnNldENvbnRlbnRIYW5kbGVyKGNoKTsKKyAgICAKKyAgICB0cnkKKyAgICB7CisgICAgICBOb2RlIG5vZGUgPSBnZXROb2RlKG5vZGVIYW5kbGUpOworICAgICAgdHJlZVdhbGtlci50cmF2ZXJzZShub2RlKTsKKyAgICB9CisgICAgZmluYWxseQorICAgIHsKKyAgICAgIHRyZWVXYWxrZXIuc2V0Q29udGVudEhhbmRsZXIobnVsbCk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vZG9tMmR0bS9Vbml0VGVzdC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9kb20yZHRtL1VuaXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5ZjYwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC9kdG0vZG9tMmR0bS9Vbml0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bS5kb20yZHRtOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uKjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS4qOworCisvKioKKyAqIFNpbXBsZSB1bml0IHRlc3QgZm9yIERPTTJEVE0uCisgKi8KK3B1YmxpYyBjbGFzcyBVbml0VGVzdAoreworCisgIHB1YmxpYyBVbml0VGVzdCgpCisgIHsKKyAgfQorICAKKyAgLy8gTm8gbmFtZXNwYWNlcywgb25seSBlbGVtZW50cyAmIGF0dHJpYnV0ZXMKKyAgc3RhdGljIFN0cmluZyBzX2RvYzFTdHJpbmcxID0gCisgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIgKworICAgICAgICAgICAgICAiPGZhci1ub3J0aD4iICsKKyAgICAgICAgICAgICAgIiA8bm9ydGg+IiArCisgICAgICAgICAgICAgICIgIDxuZWFyLW5vcnRoPiIgKworICAgICAgICAgICAgICAiICAgPGZhci13ZXN0Lz4iICsKKyAgICAgICAgICAgICAgIiAgIDx3ZXN0Lz4iICsKKyAgICAgICAgICAgICAgIiAgIDxuZWFyLXdlc3QgbmVhci13ZXN0LWF0dHIxPSduZWFyLXdlc3QtYXR0cjEtdmFsdWUnLz4iICsKKyAgICAgICAgICAgICAgIiAgIDxjZW50ZXI+IiArCisgICAgICAgICAgICAgICIgICAgPG5lYXItc291dGg+IiArCisgICAgICAgICAgICAgICIgICAgIDxzb3V0aCBzb3V0aC1hdHRyMT0nc291dGgtYXR0cjEtdmFsdWUnIHNvdXRoLWF0dHIyPSdzb3V0aC1hdHRyMi12YWx1ZSc+IiArCisgICAgICAgICAgICAgICIgICAgICA8ZmFyLXNvdXRoLz4iICsKKyAgICAgICAgICAgICAgIiAgICAgPC9zb3V0aD4iICsKKyAgICAgICAgICAgICAgIiAgICA8L25lYXItc291dGg+IiArCisgICAgICAgICAgICAgICIgICA8L2NlbnRlcj4iICsKKyAgICAgICAgICAgICAgIiAgIDxuZWFyLWVhc3QvPiIgKworICAgICAgICAgICAgICAiICAgPGVhc3QvPiIgKworICAgICAgICAgICAgICAiICAgPGZhci1lYXN0Lz4iICsKKyAgICAgICAgICAgICAgIiAgPC9uZWFyLW5vcnRoPiIgKworICAgICAgICAgICAgICAiIDwvbm9ydGg+IiArCisgICAgICAgICAgICAgICI8L2Zhci1ub3J0aD4iOworCisgIC8vIFdpdGggbmFtZXNwYWNlcworICBzdGF0aWMgU3RyaW5nIHNfZG9jMVN0cmluZzIgPSAKKyAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IiArCisgICAgICAgICAgICAgICI8ZmFyLW5vcnRoPiIgKworICAgICAgICAgICAgICAiIDxub3J0aCB4bWxuczp4PSdodHRwOi8veC5jb20nPiIgKworICAgICAgICAgICAgICAiICA8bmVhci1ub3J0aD4iICsKKyAgICAgICAgICAgICAgIiAgIDxmYXItd2VzdCB4bWxuczp5PSdodHRwOi8veS5jb20nLz4iICsKKyAgICAgICAgICAgICAgIiAgIDx3ZXN0Lz4iICsKKyAgICAgICAgICAgICAgIiAgIDxuZWFyLXdlc3QgbmVhci13ZXN0LWF0dHIxPSduZWFyLXdlc3QtYXR0cjEtdmFsdWUnLz4iICsKKyAgICAgICAgICAgICAgIiAgIDxjZW50ZXIgeG1sbnM6eT0naHR0cDovL3kuY29tJz4iICsKKyAgICAgICAgICAgICAgIiAgICA8bmVhci1zb3V0aCB4bWxuczp6PSdodHRwOi8vei5jb20nIHhtbG5zOnY9J2h0dHA6Ly92LmNvbSc+IiArCisgICAgICAgICAgICAgICIgICAgIDxzb3V0aCBzb3V0aC1hdHRyMT0nc291dGgtYXR0cjEtdmFsdWUnIHNvdXRoLWF0dHIyPSdzb3V0aC1hdHRyMi12YWx1ZSc+IiArCisgICAgICAgICAgICAgICIgICAgICA8ZmFyLXNvdXRoLz4iICsKKyAgICAgICAgICAgICAgIiAgICAgPC9zb3V0aD4iICsKKyAgICAgICAgICAgICAgIiAgICA8L25lYXItc291dGg+IiArCisgICAgICAgICAgICAgICIgICA8L2NlbnRlcj4iICsKKyAgICAgICAgICAgICAgIiAgIDxuZWFyLWVhc3QvPiIgKworICAgICAgICAgICAgICAiICAgPGVhc3QvPiIgKworICAgICAgICAgICAgICAiICAgPGZhci1lYXN0Lz4iICsKKyAgICAgICAgICAgICAgIiAgPC9uZWFyLW5vcnRoPiIgKworICAgICAgICAgICAgICAiIDwvbm9ydGg+IiArCisgICAgICAgICAgICAgICI8L2Zhci1ub3J0aD4iOworICAgICAgICAgICAgICAKKyAgICAvLyBSZXByb2R1Y2VzIGJ1ZyB3aGVyZSB0aGluZ3MgZG9uJ3QgZ2V0IHByb2Nlc3NlZCBhZnRlciB0aGUgbGFzdCBhdHRyaWJ1dGUuCisgIHN0YXRpYyBTdHJpbmcgc19kb2MxU3RyaW5nMmEgPSAKKyAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IiArCisgICAgICAgICAgICAgICI8ZmFyLW5vcnRoPiIgKworICAgICAgICAgICAgICAgICI8Y2VudGVyPiIgKworICAgICAgICAgICAgICAgICAgIjxuZWFyLXNvdXRoIGE9J2EnIGI9J2InPiIgKworICAgICAgICAgICAgICAgICAgICAiPHNvdXRoIGM9J2MnIGQ9J2QnLz4iICsKKyAgICAgICAgICAgICAgICAgICI8L25lYXItc291dGg+IiArCisgICAgICAgICAgICAgICAgIjwvY2VudGVyPiIgKworICAgICAgICAgICAgICAgICI8bmVhci1lYXN0Lz4iICsKKyAgICAgICAgICAgICAgIjwvZmFyLW5vcnRoPiI7CisgICAgICAgICAgICAgICAgCisgIC8vIG5hbWVzcGFjZXMgYW5kIHRleHQKKyAgc3RhdGljIFN0cmluZyBzX2RvYzFTdHJpbmczeCA9IAorICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iICsKKyAgICAgICAgICAgICAgIjxmYXItbm9ydGg+YSIgKworICAgICAgICAgICAgICAiIDxub3J0aCB4bWxuczp4PSdodHRwOi8veC5jb20nPmIiICsKKyAgICAgICAgICAgICAgIiAgPG5lYXItbm9ydGg+YyIgKworICAgICAgICAgICAgICAiICAgPGZhci13ZXN0IHhtbG5zOnk9J2h0dHA6Ly95LmNvbSc+ZDwvZmFyLXdlc3Q+IiArCisgICAgICAgICAgICAgICIgICA8d2VzdD5lPC93ZXN0PiIgKworICAgICAgICAgICAgICAiICAgPG5lYXItd2VzdCBuZWFyLXdlc3QtYXR0cjE9J25lYXItd2VzdC1hdHRyMS12YWx1ZSc+ZjwvbmVhci13ZXN0PiIgKworICAgICAgICAgICAgICAiICAgPGNlbnRlciB4bWxuczp5PSdodHRwOi8veS5jb20nPmciICsKKyAgICAgICAgICAgICAgIiAgICA8bmVhci1zb3V0aCB4bWxuczp6PSdodHRwOi8vei5jb20nIHhtbG5zOnY9J2h0dHA6Ly92LmNvbSc+aCIgKworICAgICAgICAgICAgICAiICAgICA8c291dGggc291dGgtYXR0cjE9J3NvdXRoLWF0dHIxLXZhbHVlJyBzb3V0aC1hdHRyMj0nc291dGgtYXR0cjItdmFsdWUnPmkiICsKKyAgICAgICAgICAgICAgIiAgICAgIDxmYXItc291dGg+ajwvZmFyLXNvdXRoPmsiICsKKyAgICAgICAgICAgICAgIiAgICAgPC9zb3V0aD5sIiArCisgICAgICAgICAgICAgICIgICAgPC9uZWFyLXNvdXRoPm0iICsKKyAgICAgICAgICAgICAgIiAgIDwvY2VudGVyPm4iICsKKyAgICAgICAgICAgICAgIiAgIDxuZWFyLWVhc3Q+bzwvbmVhci1lYXN0PiIgKworICAgICAgICAgICAgICAiICAgPGVhc3Q+cDwvZWFzdD4iICsKKyAgICAgICAgICAgICAgIiAgIDxmYXItZWFzdD5xPC9mYXItZWFzdD5yIiArCisgICAgICAgICAgICAgICIgIDwvbmVhci1ub3J0aD5zIiArCisgICAgICAgICAgICAgICIgPC9ub3J0aD50IiArCisgICAgICAgICAgICAgICI8L2Zhci1ub3J0aD4iOworICAgICAgICAgICAgICAKKyAgICBzdGF0aWMgU3RyaW5nIHNfZG9jMVN0cmluZzMgPSAKKyAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IiArCisgICAgICAgICAgICAgICI8ZG9jcz4iICsKKyAgICAgICAgICAgICAgIiAgPGRvYyB4bWxuczpleHQ9XCJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uXCI+IiArCisgICAgICAgICAgICAgICIgICAgPHNlY3Rpb24geG1sbnM6Zm9vPVwiaHR0cDovL2Zvby5jb21cIj4iICsKKyAgICAgICAgICAgICAgIiAgICAgIDxpbm5lciB4bWxuczp3aGl6PVwiaHR0cDovL3doaXouY29tL3NwZWNpYWwvcGFnZVwiLz4iICsKKyAgICAgICAgICAgICAgIiAgICA8L3NlY3Rpb24+IiArCisgICAgICAgICAgICAgICIgIDwvZG9jPiIgKworICAgICAgICAgICAgICAiPC9kb2NzPiI7CisgIAorICBwcm90ZWN0ZWQgaW50IHJ1bihTdHJpbmdbXSBhcmdzKQorICAgIHRocm93cyBFeGNlcHRpb24KKyAgeworICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICBEb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzX2RvYzFTdHJpbmczKTsKKyAgICAKKyAgICBEb2N1bWVudCBkb2MgPSBkYi5wYXJzZShuZXcgSW5wdXRTb3VyY2Uoc3IpKTsKKyAgICAKKyAgICBEVE1NYW5hZ2VyIGR0bU1nciA9IERUTU1hbmFnZXIubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YTUxTdHJpbmdGYWN0b3J5SW1wbC5nZXRGYWN0b3J5KCkpOworICAgIERUTSBkdG0gPSBkdG1NZ3IuZ2V0RFRNKG5ldyBET01Tb3VyY2UoZG9jKSwgdHJ1ZSwgbnVsbCwgdHJ1ZSk7CisgICAgCisgICAgaW50IGRvY0hhbmRsZSA9IGR0bS5nZXREb2N1bWVudCgpOworICAgIG91dHB1dENoaWxkcmVuKGRvY0hhbmRsZSwgZHRtLCAwKTsKKworLy8gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisvLyAgICBUcmFuc2Zvcm1lciB0ID0gdGYubmV3VHJhbnNmb3JtZXIoKTsKKy8vICAgIHQuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKKy8vICAgIHQudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jKSwgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7CisgICAgCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJET00yRFRNIFVuaXQgdGVzdCBkb25lISIpOworICAgIAorICAgIHJldHVybiAwOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBvdXRwdXRDaGlsZHJlbihpbnQgaGFuZGxlLCBEVE0gZHRtLCBpbnQgaW5kZW50QW1vdW50KQorICB7CisgICAgZm9yIChoYW5kbGUgPSBkdG0uZ2V0Rmlyc3RDaGlsZChoYW5kbGUpOyBoYW5kbGUgIT0gRFRNLk5VTEw7IAorICAgICAgICAgaGFuZGxlID0gZHRtLmdldE5leHRTaWJsaW5nKGhhbmRsZSkpIAorICAgIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50QW1vdW50OyBpKyspIAorICAgICAgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCcgJyk7CisgICAgICB9CisgICAgICAKKyAgICAgIFN5c3RlbS5vdXQucHJpbnQoIm5vZGUgbmFtZTogIitkdG0uZ2V0Tm9kZU5hbWUoaGFuZGxlKSk7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiwgdmFsOiAiK2R0bS5nZXRTdHJpbmdWYWx1ZShoYW5kbGUpKTsKKyAgICAgIAorICAgICAgZm9yIChpbnQgbnMgPSBkdG0uZ2V0Rmlyc3ROYW1lc3BhY2VOb2RlKGhhbmRsZSwgdHJ1ZSk7IG5zICE9IERUTS5OVUxMOyAKKyAgICAgICAgICAgbnMgPSBkdG0uZ2V0TmV4dE5hbWVzcGFjZU5vZGUoaGFuZGxlLCBucywgdHJ1ZSkpIAorICAgICAgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJucyBkZWNsOiAiK2R0bS5nZXROb2RlTmFtZShucykpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiwgdmFsOiAiK2R0bS5nZXRTdHJpbmdWYWx1ZShucykpOworICAgICAgfQorICAgICAgZm9yIChpbnQgYXR0ciA9IGR0bS5nZXRGaXJzdEF0dHJpYnV0ZShoYW5kbGUpOyBhdHRyICE9IERUTS5OVUxMOyAKKyAgICAgICAgICAgYXR0ciA9IGR0bS5nZXROZXh0QXR0cmlidXRlKGF0dHIpKSAKKyAgICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiYXR0cjogIitkdG0uZ2V0Tm9kZU5hbWUoYXR0cikpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiwgdmFsOiAiK2R0bS5nZXRTdHJpbmdWYWx1ZShhdHRyKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIG91dHB1dENoaWxkcmVuKGhhbmRsZSwgZHRtLCBpbmRlbnRBbW91bnQrMSk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgIHRocm93cyBFeGNlcHRpb24KKyAgeworICAgIFVuaXRUZXN0IHVuaXRUZXN0MSA9IG5ldyBVbml0VGVzdCgpOworICAgIHVuaXRUZXN0MS5ydW4oYXJncyk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvZHRtL3NheDJkdG0vU0FYMkRUTS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9zYXgyZHRtL1NBWDJEVE0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDllNWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL2R0bS9zYXgyZHRtL1NBWDJEVE0uamF2YQpAQCAtMCwwICsxLDIxOTAgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCisgKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLmR0bS5zYXgyZHRtOworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLnhtbC5zYXguKjsKK2ltcG9ydCBvcmcueG1sLnNheC5leHQuKjsKKworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuRmFzdFN0cmluZ0J1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5JbnRWZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuSW50U3RhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MQ2hhcmFjdGVyUmVjb2duaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5TeXN0ZW1JRFJlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS4qOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmdGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIERUTSB0aGF0IHRlbmRzIHRvIGJlIG9wdGltaXplZCBtb3JlIGZvciBzcGVlZCB0aGFuCisgKiBmb3IgY29tcGFjdG5lc3MsIHRoYXQgaXMgY29uc3RydWN0ZWQgdmlhIFNBWDIgQ29udGVudEhhbmRsZXIgZXZlbnRzLgorICovCitwdWJsaWMgY2xhc3MgU0FYMkRUTSBleHRlbmRzIERUTURlZmF1bHRCYXNlCisgICAgICAgIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIsIERUREhhbmRsZXIsIENvbnRlbnRIYW5kbGVyLCBFcnJvckhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgRGVjbEhhbmRsZXIsIExleGljYWxIYW5kbGVyCit7CisKKyAgLyoqIHNpbXBsZSBERUJVRyBmbGFnLCBmb3IgZHVtcGluZyBkaWFnbm9zdGljcyBpbmZvLiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgLyoqCisgICAqIElmIHdlJ3JlIGJ1aWxkaW5nIHRoZSBtb2RlbCBpbmNyZW1lbnRhbGx5IG9uIGRlbWFuZCwgd2UgbmVlZCB0bworICAgKiBiZSBhYmxlIHRvIHRlbGwgdGhlIHNvdXJjZSB3aGVuIHRvIHNlbmQgdXMgbW9yZSBkYXRhLgorICAgKgorICAgKiBOb3RlIHRoYXQgaWYgdGhpcyBoYXMgbm90IGJlZW4gc2V0LCBhbmQgeW91IGF0dGVtcHQgdG8gcmVhZCBhaGVhZAorICAgKiBvZiB0aGUgY3VycmVudCBidWlsZCBwb2ludCwgd2UnbGwgcHJvYmFibHkgdGhyb3cgYSBudWxsLXBvaW50ZXIKKyAgICogZXhjZXB0aW9uLiBXZSBjb3VsZCB0cnkgdG8gd2FpdC1hbmQtcmV0cnkgaW5zdGVhZCwgYXMgYSB2ZXJ5IHBvb3IKKyAgICogZmFsbGJhY2ssIGJ1dCB0aGF0IGhhcyBhbGwgdGhlIGtub3duIHByb2JsZW1zIHdpdGggbXVsdGl0aHJlYWRpbmcKKyAgICogb24gbXVsdGlwcm9jZXNzb3JzIGFuZCB3ZSBEb24ndCBXYW50IHRvIEdvIFRoZXJlLgorICAgKgorICAgKiBAc2VlIHNldENvcm91dGluZVBhcnNlcgorICAgKi8KKyAgcHJpdmF0ZSBDb3JvdXRpbmVQYXJzZXIgbV9jb3JvdXRpbmVQYXJzZXIgPSBudWxsOworCisgIC8qKgorICAgKiBJZiB3ZSdyZSBidWlsZGluZyB0aGUgbW9kZWwgaW5jcmVtZW50YWxseSBvbiBkZW1hbmQsIHdlIG5lZWQgdG8KKyAgICogYmUgYWJsZSB0byB0ZWxsIHRoZSBzb3VyY2Ugd2hvIHRvIHJldHVybiB0aGUgZGF0YSB0by4KKyAgICoKKyAgICogTm90ZSB0aGF0IGlmIHRoaXMgaGFzIG5vdCBiZWVuIHNldCwgYW5kIHlvdSBhdHRlbXB0IHRvIHJlYWQgYWhlYWQKKyAgICogb2YgdGhlIGN1cnJlbnQgYnVpbGQgcG9pbnQsIHdlJ2xsIHByb2JhYmx5IHRocm93IGEgTWV0aG9kTm90Rm91bmQKKyAgICogZXhjZXB0aW9uLiBXZSBjb3VsZCB0cnkgdG8gd2FpdC1hbmQtcmV0cnkgaW5zdGVhZCwgYXMgYSB2ZXJ5IHBvb3IKKyAgICogZmFsbGJhY2ssIGJ1dCB0aGF0IGhhcyBhbGwgdGhlIGtub3duIHByb2JsZW1zIHdpdGggbXVsdGl0aHJlYWRpbmcKKyAgICogb24gbXVsdGlwcm9jZXNzb3JzIGFuZCB3ZSBEb24ndCBXYW50IHRvIEdvIFRoZXJlLgorICAgKgorICAgKiBAc2VlIHNldENvcm91dGluZVBhcnNlcgorICAgKi8KKyAgcHJpdmF0ZSBpbnQgbV9hcHBDb3JvdXRpbmVJRCA9IC0xOworCisgIC8qKgorICAgKiBUaGUgbnVtYmVyIG9mIG5vZGVzLCB3aGljaCBpcyBhbHNvIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBuZXh0CisgICAqICBub2RlIGluZGV4LgorICAgKi8KKyAgcHJpdmF0ZSBpbnQgbV9zaXplID0gMDsKKworICAvKioKKyAgICogQWxsIHRoZSBjaGFyYWN0ZXIgY29udGVudCwgaW5jbHVkaW5nIGF0dHJpYnV0ZSB2YWx1ZXMsIGFyZSBzdG9yZWQgaW4KKyAgICogdGhpcyBidWZmZXIuCisgICAqICVSRVZJRVclIFNob3VsZCB0aGlzIGhhdmUgYW4gb3B0aW9uIG9mIGJlaW5nIHNoYXJlZD8KKyAgICovCisgIHByaXZhdGUgRmFzdFN0cmluZ0J1ZmZlciBtX2NoYXJzID0gbmV3IEZhc3RTdHJpbmdCdWZmZXIoMTMsIDEzKTsKKworICAvKiogVGhpcyB2ZWN0b3IgaG9sZHMgb2Zmc2V0IGFuZCBsZW5ndGggZGF0YS4gKi8KKyAgcHJvdGVjdGVkIEludFZlY3RvciBtX2RhdGEgPSBuZXcgSW50VmVjdG9yKCk7CisKKyAgLyoqIFRoZSB0YWJsZSBvZiBleHBhbmRlZCBuYW1lcywgd2hpY2ggbWF5IHdlbGwgYmUgb3duZWQgYnkgdGhlIERUTU1hbmFnZXIgKi8KKyAgRXhwYW5kZWROYW1lVGFibGUgbV9lbnQ7CisKKyAgLyoqIFRoZSBwYXJlbnQgc3RhY2ssIG5lZWRlZCBvbmx5IGZvciBjb25zdHJ1Y3Rpb24uICovCisgIHRyYW5zaWVudCBwcml2YXRlIEludFN0YWNrIG1fcGFyZW50cyA9IG5ldyBJbnRTdGFjaygpOworCisgIC8qKiBUaGUgY3VycmVudCBjb25zdHJ1Y3Rpb24gbGV2ZWwsIG5lZWRlZCBvbmx5IGZvciBjb25zdHJ1Y3Rpb24gdGltZS4gKi8KKyAgdHJhbnNpZW50IHByaXZhdGUgaW50IG1fbGV2ZWwgPSAwOworCisgIC8qKiBUaGUgY3VycmVudCBwcmV2aW91cyBub2RlLCBuZWVkZWQgb25seSBmb3IgY29uc3RydWN0aW9uIHRpbWUuICovCisgIHRyYW5zaWVudCBwcml2YXRlIGludCBtX3ByZXZpb3VzID0gMDsKKworICAvKiogTmFtZXNwYWNlIHN1cHBvcnQsIG9ubHkgcmVsZXZlbnQgYXQgY29uc3RydWN0aW9uIHRpbWUuICovCisgIHRyYW5zaWVudCBwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgbV9wcmVmaXhNYXBwaW5ncyA9CisgICAgbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKKworICAvKiogTmFtZXNwYWNlIHN1cHBvcnQsIG9ubHkgcmVsZXZlbnQgYXQgY29uc3RydWN0aW9uIHRpbWUuICovCisgIHRyYW5zaWVudCBwcml2YXRlIEludFN0YWNrIG1fY29udGV4dEluZGV4ZXMgPSBuZXcgSW50U3RhY2soKTsKKworICAvKiogVHlwZSBvZiBuZXh0IGNoYXJhY3RlcnMoKSBldmVudCB3aXRoaW4gdGV4dCBibG9jayBpbiBwcmdyZXNzLiAqLworICB0cmFuc2llbnQgcHJpdmF0ZSBpbnQgbV90ZXh0VHlwZSA9IERUTS5URVhUX05PREU7CisKKyAgLyoqCisgICAqIFR5cGUgb2YgY29hbGVzY2VkIHRleHQgYmxvY2suIFNlZSBsb2dpYyBpbiB0aGUgY2hhcmFjdGVycygpCisgICAqIG1ldGhvZC4KKyAgICovCisgIHRyYW5zaWVudCBwcml2YXRlIGludCBtX2NvYWxlc2NlZFRleHRUeXBlID0gRFRNLlRFWFRfTk9ERTsKKworICAvKiogVGhlIFNBWCBEb2N1bWVudCBsb2NhdG9yICovCisgIHRyYW5zaWVudCBwcml2YXRlIExvY2F0b3IgbV9sb2NhdG9yID0gbnVsbDsKKworICAvKiogVHJlZSBXYWxrZXIgZm9yIGRpc3BhdGNoVG9FdmVudHMuICovCisgIHByb3RlY3RlZCBEVE1UcmVlV2Fsa2VyIG1fd2Fsa2VyID0gbmV3IERUTVRyZWVXYWxrZXIoKTsKKworICAvKiogcG9vbCBvZiBzdHJpbmcgdmFsdWVzIHRoYXQgY29tZSBhcyBzdHJpbmdzLiAqLworICBwcml2YXRlIERUTVN0cmluZ1Bvb2wgbV92YWx1ZXNPclByZWZpeGVzID0gbmV3IERUTVN0cmluZ1Bvb2woKTsKKworICAvKiogRW5kIGRvY3VtZW50IGhhcyBiZWVuIHJlYWNoZWQuICovCisgIHByaXZhdGUgYm9vbGVhbiBtX2VuZERvY3VtZW50T2NjdXJlZCA9IGZhbHNlOworCisgIC8qKgorICAgKiBUaGlzIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBpbnRlZ2VycyBwZXIgbm9kZSBpbiB0aGUKKyAgICogPGNvZGU+bV9pbmZvPC9jb2RlPiBtZW1iZXIgdmFyaWFibGUuCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOT0RFSU5GT0JMT0NLU0laRSA9IERFRkFVTFROT0RFSU5GT0JMT0NLU0laRSArIDE7CisKKyAgLyoqCisgICAqIFRoZSB2YWx1ZSBhdCB0aGlzIG9mZnNldCBpbiB0aGUgbV9pbmZvIHRhYmxlIGlzIGFuIGluZGV4CisgICAqIGludG8gdGhlIGRhdGEgdGFibGUsIG9yIG5hbWUgcHJlZml4LiAgT3IgaWYgdGhlIG5vZGUgaXMgYW4KKyAgICogIGF0dHJpYnV0ZSBub2RlLCBpZiB0aGUgdmFsdWUgaXMgcG9zaXRpdmUsIGl0IGlzIGEgcG9vbCBpbmRleCBpbnRvCisgICAqICB0aGUgbV92YWx1ZXNPclByZWZpeGVzIHBvb2wsIG9yIGlmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZSwgaXQgc2hvdWxkCisgICAqICBiZSBtYWRlIHBvc2l0aXZlIGFuZCB1c2VkIGFzIGFuIGluZGV4IGludG8gdGhlIG1fZGF0YSBsaXN0LCB3aXRoIHRoZQorICAgKiAgZmlyc3QgdmFsdWUgYXQgdGhhdCBvZmZzZXQgYmVpbmcgdGhlIHFuYW1lIGluZGV4LCBhbmQgdGhlIG5leHQgdmFsdWUKKyAgICogIGF0IHRoZSBvZmZzZXQgYmVpbmcgdGhlIHZhbHVlIGluZGV4LgorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgT0ZGU0VUX0RBVEFfT1JfUU5BTUUgPSBERUZBVUxUTk9ERUlORk9CTE9DS1NJWkU7CisKKyAgLyoqCisgICAqIFRoaXMgdGFibGUgaG9sZHMgdGhlIElEIHN0cmluZyB0byBub2RlIGFzc29jaWF0aW9ucywgZm9yCisgICAqIFhNTCBJRHMuCisgICAqLworICBwcm90ZWN0ZWQgSGFzaHRhYmxlIG1faWRBdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOworCisgIC8qKgorICAgKiBmaXhlZCBkb20tc3R5bGUgbmFtZXMuCisgICAqLworICBzdGF0aWMgZmluYWwgU3RyaW5nW10gbV9maXhlZG5hbWVzID0geyBudWxsLCBudWxsLCAgLy8gbm90aGluZywgRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAiI3RleHQiLCAgLy8gQXR0ciwgVGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI2NkYXRhX3NlY3Rpb24iLCBudWxsLCAgLy8gQ0RBVEEsIEVudGl0eVJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCAgLy8gRW50aXR5LCBQSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI2NvbW1lbnQiLCAiI2RvY3VtZW50IiwgIC8vIENvbW1lbnQsIERvY3VtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICIjZG9jdW1lbnQtZnJhZ21lbnQiLCAgLy8gRG9jdHlwZSwgRG9jdW1lbnRGcmFnbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIH07ICAvLyBOb3RhdGlvbgorCisgIC8qKgorICAgKiBWZWN0b3Igb2YgZW50aXRpZXMuICBFYWNoIHJlY29yZCBpcyBjb21wb3NlZCBvZiBmb3VyIFN0cmluZ3M6CisgICAqICBwdWJsaWNJZCwgc3lzdGVtSUQsIG5vdGF0aW9uTmFtZSwgYW5kIG5hbWUuCisgICAqLworICBwcml2YXRlIFZlY3RvciBtX2VudGl0aWVzID0gbnVsbDsKKworICAvKiogbV9lbnRpdGllcyBwdWJsaWMgSUQgb2Zmc2V0LiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0ZJRUxEX1BVQkxJQ0lEID0gMDsKKworICAvKiogbV9lbnRpdGllcyBzeXN0ZW0gSUQgb2Zmc2V0LiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0ZJRUxEX1NZU1RFTUlEID0gMTsKKworICAvKiogbV9lbnRpdGllcyBub3RhdGlvbiBuYW1lIG9mZnNldC4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9GSUVMRF9OT1RBVElPTk5BTUUgPSAyOworCisgIC8qKiBtX2VudGl0aWVzIG5hbWUgb2Zmc2V0LiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0ZJRUxEX05BTUUgPSAzOworCisgIC8qKiBOdW1iZXIgb2YgZW50cmllcyBwZXIgcmVjb3JkIGZvciBtX2VudGl0aWVzLiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0ZJRUxEU19QRVIgPSA0OworCisgIC8qKgorICAgKiBUaGUgc3RhcnRpbmcgb2Zmc2V0IHdpdGhpbiBtX2NoYXJzIGZvciB0aGUgdGV4dCBvcgorICAgKiBDREFUQV9TRUNUSU9OIG5vZGUgY3VycmVudGx5IGJlaW5nIGFjdW11bGF0ZWQsCisgICAqIG9yIC0xIGlmIHRoZXJlIGlzIG5vIHRleHQgbm9kZSBpbiBwcm9ncmVzcworICAgKi8KKyAgcHJpdmF0ZSBpbnQgbV90ZXh0UGVuZGluZ1N0YXJ0ID0gLTE7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdCBhIFNBWDJEVE0gb2JqZWN0IHJlYWR5IHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gU0FYMgorICAgKiBDb250ZW50SGFuZGxlciBldmVudHMuCisgICAqCisgICAqIEBwYXJhbSBtZ3IgVGhlIERUTU1hbmFnZXIgd2hvIG93bnMgdGhpcyBEVE0uCisgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEpBWFAgMS4xIFNvdXJjZSBvYmplY3QgZm9yIHRoaXMgRFRNLgorICAgKiBAcGFyYW0gZHRtSWRlbnRpdHkgVGhlIERUTSBpZGVudGl0eSBJRCBmb3IgdGhpcyBEVE0uCisgICAqIEBwYXJhbSB3aGl0ZVNwYWNlRmlsdGVyIFRoZSB3aGl0ZSBzcGFjZSBmaWx0ZXIgZm9yIHRoaXMgRFRNLCB3aGljaCBtYXkKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgYmUgbnVsbC4KKyAgICogQHBhcmFtIHhzdHJpbmdmYWN0b3J5IFhNTFN0cmluZyBmYWN0b3J5IGZvciBjcmVhdGluZyBjaGFyYWN0ZXIgY29udGVudC4KKyAgICovCisgIHB1YmxpYyBTQVgyRFRNKERUTU1hbmFnZXIgbWdyLCBTb3VyY2Ugc291cmNlLCBpbnQgZHRtSWRlbnRpdHksCisgICAgICAgICAgICAgICAgIERUTVdTRmlsdGVyIHdoaXRlU3BhY2VGaWx0ZXIsCisgICAgICAgICAgICAgICAgIFhNTFN0cmluZ0ZhY3RvcnkgeHN0cmluZ2ZhY3RvcnkpCisgIHsKKworICAgIHN1cGVyKG1nciwgc291cmNlLCBkdG1JZGVudGl0eSwgd2hpdGVTcGFjZUZpbHRlciwgeHN0cmluZ2ZhY3RvcnkpOworCisgICAgbV9lbnQgPSBtZ3IuZ2V0RXhwYW5kZWROYW1lVGFibGUodGhpcyk7CisKKyAgICBpZiAobnVsbCA9PSBtX2VudCkKKyAgICAgIG1fZW50ID0gbmV3IEV4cGFuZGVkTmFtZVRhYmxlKCk7CisKKyAgICBpbnQgZG9jID0gYWRkTm9kZShEVE0uRE9DVU1FTlRfTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICBtX2VudC5nZXRFeHBhbmRlZE5hbWVJRChEVE0uRE9DVU1FTlRfTk9ERSksIG1fbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgRFRNLk5VTEwsIERUTS5OVUxMLCAwLCB0cnVlKTsKKworICAgIG1fbGV2ZWwrKzsKKworICAgIG1fcGFyZW50cy5wdXNoKGRvYyk7CisKKyAgICBtX3ByZXZpb3VzID0gRFRNLk5VTEw7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBDb1JvdXRpbmUgSUQgZm9yIHRoZSBhcHBsaWNhdGlvbi4KKyAgICoKKyAgICogQHJldHVybiBUaGUgQ29Sb3V0aW5lIElEIGZvciB0aGUgYXBwbGljYXRpb24uCisgICAqLworICBwdWJsaWMgaW50IGdldEFwcENvcm91dGluZUlEKCkKKyAgeworICAgIHJldHVybiBtX2FwcENvcm91dGluZUlEOworICB9CisKKyAgLyoqCisgICAqIEFzayB0aGUgQ29Sb3V0aW5lIHBhcnNlciB0byBkb1Rlcm1pbmF0ZSBhbmQgY2xlYXIgdGhlIHJlZmVyZW5jZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIGNsZWFyQ29Sb3V0aW5lKCkKKyAgeworICAgIGNsZWFyQ29Sb3V0aW5lKHRydWUpOworICB9CisKKyAgLyoqCisgICAqIEFzayB0aGUgQ29Sb3V0aW5lIHBhcnNlciB0byBkb1Rlcm1pbmF0ZSBhbmQgY2xlYXIgdGhlIHJlZmVyZW5jZS4gSWYgCisgICAqIHRoZSBDb1JvdXRpbmUgcGFyc2VyIGhhcyBhbHJlYWR5IGJlZW4gY2xlYXJlZCwgdGhpcyB3aWxsIGhhdmUgbm8gZWZmZWN0LgorICAgKgorICAgKiBAcGFyYW0gY2FsbERvVGVybWluYXRlIHRydWUgb2YgZG9UZXJtaW5hdGUgc2hvdWxkIGJlIGNhbGxlZCBvbiB0aGUgCisgICAqIGNvUm91dGluZSBwYXJzZXIuCisgICAqLworICBwdWJsaWMgdm9pZCBjbGVhckNvUm91dGluZShib29sZWFuIGNhbGxEb1Rlcm1pbmF0ZSkKKyAgeworCisgICAgaWYgKG51bGwgIT0gbV9jb3JvdXRpbmVQYXJzZXIpCisgICAgeworICAgICAgaWYgKGNhbGxEb1Rlcm1pbmF0ZSkKKyAgICAgICAgbV9jb3JvdXRpbmVQYXJzZXIuZG9UZXJtaW5hdGUobV9hcHBDb3JvdXRpbmVJRCk7CisKKyAgICAgIG1fY29yb3V0aW5lUGFyc2VyID0gbnVsbDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQmluZCBhIENvcm91dGluZVBhcnNlciB0byB0aGlzIERUTS4gSWYgd2UgZGlzY292ZXIgd2UgbmVlZCBub2RlcworICAgKiB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGJ1aWx0LCB3ZSB3aWxsIGFzayB0aGlzIG9iamVjdCB0byBzZW5kIHVzIG1vcmUKKyAgICogZXZlbnRzLCBhbmQgaXQgd2lsbCBtYW5hZ2UgaW50ZXJhY3Rpb25zIHdpdGggaXRzIGRhdGEgc291cmNlcy4KKyAgICoKKyAgICogTm90ZSB0aGF0IHdlIGRvIG5vdCBhY3R1YWxseSBidWlsZCB0aGUgQ29yb3V0aW5lUGFyc2VyLCBzaW5jZSB3ZSBkb24ndAorICAgKiBrbm93IHdoYXQgc291cmNlIGl0J3MgcmVhZGluZyBmcm9tLCB3aGF0IHRocmVhZCB0aGF0IHNvdXJjZSB3aWxsIHJ1biBpbiwKKyAgICogb3Igd2hlbiBpdCB3aWxsIHJ1bi4KKyAgICoKKyAgICogQHBhcmFtIGNvcm91dGluZVBhcnNlciBUaGUgcGFyc2VyIHRoYXQgd2Ugd2FudCB0byByZWNpZXZlIGV2ZW50cyBmcm9tCisgICAqIG9uIGRlbWFuZC4KKyAgICogQHBhcmFtIGFwcENvUklEIFRoZSBDb1JvdXRpbmUgSUQgZm9yIHRoZSBhcHBsaWNhdGlvbi4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldENvcm91dGluZVBhcnNlcihDb3JvdXRpbmVQYXJzZXIgY29yb3V0aW5lUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwcENvUklEKQorICB7CisKKyAgICAvLyBFc3RhYmxpc2ggY29yb3V0aW5lIGxpbmsgc28gd2UgY2FuIHJlcXVlc3QgbW9yZSBkYXRhCisgICAgLy8KKyAgICAvLyBOb3RlOiBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZSB2ZXJzaW9ucyBvZiBDb3JvdXRpbmVQYXJzZXIgbWF5CisgICAgLy8gbm90IGFjdHVhbGx5IHVzZSBhIENvcm91dGluZU1hbmFnZXIsIGFuZCBoZW5jZSBtYXkgbm90IHJlcXVpcmUKKyAgICAvLyB0aGF0IHdlIG9idGFpbiBhbiBBcHBsaWNhdGlvbiBDb3JvdXRpbmUgSUQuIChUaGlzIHJlbGllcyBvbiB0aGUKKyAgICAvLyBjb3JvdXRpbmUgdHJhbnNhY3Rpb24gZGV0YWlscyBoYXZpbmcgYmVlbiBlbmNhcHN1bGF0ZWQgaW4gdGhlCisgICAgLy8gQ29yb3V0aW5lUGFyc2VyLmRvLi4uKCkgbWV0aG9kcy4pCisgICAgbV9jb3JvdXRpbmVQYXJzZXIgPSBjb3JvdXRpbmVQYXJzZXI7CisKKyAgICBDb3JvdXRpbmVNYW5hZ2VyIGNtID0gY29yb3V0aW5lUGFyc2VyLmdldENvcm91dGluZU1hbmFnZXIoKTsKKworICAgIG1fYXBwQ29yb3V0aW5lSUQgPSBhcHBDb1JJRDsKKworICAgIC8vIEVzdGFibGlzaCBTQVgtc3RyZWFtIGxpbmsgc28gd2UgY2FuIHJlY2VpdmUgdGhlIHJlcXVlc3RlZCBkYXRhCisgICAgY29yb3V0aW5lUGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOworICAgIGNvcm91dGluZVBhcnNlci5zZXRMZXhIYW5kbGVyKHRoaXMpOworCisgICAgLy8gQXJlIHRoZSBmb2xsb3dpbmcgcmVhbGx5IG5lZWRlZD8gY29yb3V0aW5lUGFyc2VyIGRvZXNuJ3QgeWV0CisgICAgLy8gc3VwcG9ydCB0aGVtLCBhbmQgdGhleSdyZSBtb3N0bHkgbm8tb3BzIGhlcmUuLi4KKyAgICAvL2Nvcm91dGluZVBhcnNlci5zZXRFcnJvckhhbmRsZXIodGhpcyk7CisgICAgLy9jb3JvdXRpbmVQYXJzZXIuc2V0RFRESGFuZGxlcih0aGlzKTsKKyAgICAvL2Nvcm91dGluZVBhcnNlci5zZXREZWNsSGFuZGxlcih0aGlzKTsKKyAgfQorCisgIC8qKgorICAgKiBnZXRDb250ZW50SGFuZGxlciByZXR1cm5zICJvdXIgU0FYIGJ1aWxkZXIiIC0tIHRoZSB0aGluZyB0aGF0CisgICAqIHNvbWVvbmUgZWxzZSBzaG91bGQgc2VuZCBTQVggZXZlbnRzIHRvIGluIG9yZGVyIHRvIGV4dGVuZCB0aGlzCisgICAqIERUTSBtb2RlbC4KKyAgICoKKyAgICogJVJFVklFVyUgU2hvdWxkIHRoaXMgcmV0dXJuIG51bGwgaWYgY29uc3RydXRpb24gYWxyZWFkeSBkb25lL2JlZ3VuPworICAgKgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBtb2RlbCBkb2Vzbid0IHJlc3BvbmQgdG8gU0FYIGV2ZW50cywKKyAgICogInRoaXMiIGlmIHRoZSBEVE0gb2JqZWN0IGhhcyBhIGJ1aWx0LWluIFNBWCBDb250ZW50SGFuZGxlciwKKyAgICogdGhlIENvcm91dGluZVBhcnNlciBpZiB3ZSdyZSBib3VuZCB0byBvbmUgYW5kIHNob3VsZCByZWNlaXZlCisgICAqIHRoZSBTQVggc3RyZWFtIHZpYSBpdCBmb3IgaW5jcmVtZW50YWwgYnVpbGQgcHVycG9zZXMuLi4KKyAgICovCisgIHB1YmxpYyBDb250ZW50SGFuZGxlciBnZXRDb250ZW50SGFuZGxlcigpCisgIHsKKworICAgIGlmIChtX2Nvcm91dGluZVBhcnNlciBpbnN0YW5jZW9mIENvcm91dGluZVNBWFBhcnNlcikKKyAgICAgIHJldHVybiAoQ29udGVudEhhbmRsZXIpIG1fY29yb3V0aW5lUGFyc2VyOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiB0aGlzIERUTSdzIGxleGljYWwgaGFuZGxlci4KKyAgICoKKyAgICogJVJFVklFVyUgU2hvdWxkIHRoaXMgcmV0dXJuIG51bGwgaWYgY29uc3RydXRpb24gYWxyZWFkeSBkb25lL2JlZ3VuPworICAgKgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBtb2RlbCBkb2Vzbid0IHJlc3BvbmQgdG8gbGV4aWNhbCBTQVggZXZlbnRzLAorICAgKiAidGhpcyIgaWYgdGhlIERUTSBvYmplY3QgaGFzIGEgYnVpbHQtaW4gU0FYIENvbnRlbnRIYW5kbGVyLAorICAgKiB0aGUgQ29yb3V0aW5lUGFyc2VyIGlmIHdlJ3JlIGJvdW5kIHRvIG9uZSBhbmQgc2hvdWxkIHJlY2VpdmUKKyAgICogdGhlIFNBWCBzdHJlYW0gdmlhIGl0IGZvciBpbmNyZW1lbnRhbCBidWlsZCBwdXJwb3Nlcy4uLgorICAgKi8KKyAgcHVibGljIExleGljYWxIYW5kbGVyIGdldExleGljYWxIYW5kbGVyKCkKKyAgeworCisgICAgaWYgKG1fY29yb3V0aW5lUGFyc2VyIGluc3RhbmNlb2YgQ29yb3V0aW5lU0FYUGFyc2VyKQorICAgICAgcmV0dXJuIChMZXhpY2FsSGFuZGxlcikgbV9jb3JvdXRpbmVQYXJzZXI7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoaXMgRFRNJ3MgRW50aXR5UmVzb2x2ZXIuCisgICAqCisgICAqIEByZXR1cm4gbnVsbCBpZiB0aGlzIG1vZGVsIGRvZXNuJ3QgcmVzcG9uZCB0byBTQVggZW50aXR5IHJlZiBldmVudHMuCisgICAqLworICBwdWJsaWMgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKQorICB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoaXMgRFRNJ3MgRFRESGFuZGxlci4KKyAgICoKKyAgICogQHJldHVybiBudWxsIGlmIHRoaXMgbW9kZWwgZG9lc24ndCByZXNwb25kIHRvIFNBWCBkdGQgZXZlbnRzLgorICAgKi8KKyAgcHVibGljIERUREhhbmRsZXIgZ2V0RFRESGFuZGxlcigpCisgIHsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhpcyBEVE0ncyBFcnJvckhhbmRsZXIuCisgICAqCisgICAqIEByZXR1cm4gbnVsbCBpZiB0aGlzIG1vZGVsIGRvZXNuJ3QgcmVzcG9uZCB0byBTQVggZXJyb3IgZXZlbnRzLgorICAgKi8KKyAgcHVibGljIEVycm9ySGFuZGxlciBnZXRFcnJvckhhbmRsZXIoKQorICB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoaXMgRFRNJ3MgRGVjbEhhbmRsZXIuCisgICAqCisgICAqIEByZXR1cm4gbnVsbCBpZiB0aGlzIG1vZGVsIGRvZXNuJ3QgcmVzcG9uZCB0byBTQVggRGVjbCBldmVudHMuCisgICAqLworICBwdWJsaWMgRGVjbEhhbmRsZXIgZ2V0RGVjbEhhbmRsZXIoKQorICB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0cnVlIGlmZiB3ZSdyZSBidWlsZGluZyB0aGlzIG1vZGVsIGluY3JlbWVudGFsbHkgKGVnCisgICAqIHdlJ3JlIHBhcnRuZXJlZCB3aXRoIGEgQ29yb3V0aW5lUGFyc2VyKSBhbmQgdGh1cyByZXF1aXJlIHRoYXQgdGhlCisgICAqIHRyYW5zZm9ybWF0aW9uIGFuZCB0aGUgcGFyc2UgcnVuIHNpbXVsdGFuZW91c2x5LiBHdWlkYW5jZSB0byB0aGUKKyAgICogRFRNTWFuYWdlci4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIG5lZWRzVHdvVGhyZWFkcygpCisgIHsKKyAgICByZXR1cm4gbnVsbCAhPSBtX2Nvcm91dGluZVBhcnNlcjsKKyAgfQorCisgIC8qKgorICAgKiBEaXJlY3RseSBjYWxsIHRoZQorICAgKiBjaGFyYWN0ZXJzIG1ldGhvZCBvbiB0aGUgcGFzc2VkIENvbnRlbnRIYW5kbGVyIGZvciB0aGUKKyAgICogc3RyaW5nLXZhbHVlIG9mIHRoZSBnaXZlbiBub2RlIChzZWUgaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjZGF0YS1tb2RlbAorICAgKiBmb3IgdGhlIGRlZmluaXRpb24gb2YgYSBub2RlJ3Mgc3RyaW5nLXZhbHVlKS4gTXVsdGlwbGUgY2FsbHMgdG8gdGhlCisgICAqIENvbnRlbnRIYW5kbGVyJ3MgY2hhcmFjdGVycyBtZXRob2RzIG1heSB3ZWxsIG9jY3VyIGZvciBhIHNpbmdsZSBjYWxsIHRvCisgICAqIHRoaXMgbWV0aG9kLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KKyAgICogQHBhcmFtIGNoIEEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgQ29udGVudEhhbmRsZXIuCisgICAqCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBkaXNwYXRjaENoYXJhY3RlcnNFdmVudHMoaW50IG5vZGVIYW5kbGUsIENvbnRlbnRIYW5kbGVyIGNoKQorICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgaW50IGlkZW50aXR5ID0gbm9kZUhhbmRsZSAmIG1fbWFzazsKKyAgICBpbnQgdHlwZSA9IGdldE5vZGVUeXBlKGlkZW50aXR5KTsKKworICAgIGlmIChpc1RleHRUeXBlKHR5cGUpKQorICAgIHsKKyAgICAgIGludCBkYXRhSW5kZXggPSBnZXROb2RlSW5mb05vV2FpdChpZGVudGl0eSwgT0ZGU0VUX0RBVEFfT1JfUU5BTUUpOworICAgICAgaW50IG9mZnNldCA9IG1fZGF0YS5lbGVtZW50QXQoZGF0YUluZGV4KTsKKyAgICAgIGludCBsZW5ndGggPSBtX2RhdGEuZWxlbWVudEF0KGRhdGFJbmRleCArIDEpOworCisgICAgICBtX2NoYXJzLnNlbmRTQVhjaGFyYWN0ZXJzKGNoLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpbnQgZmlyc3RDaGlsZCA9IGdldE5vZGVJbmZvKGlkZW50aXR5LCBPRkZTRVRfRklSU1RDSElMRCk7CisKKyAgICAgIGlmIChEVE0uTlVMTCAhPSBmaXJzdENoaWxkKQorICAgICAgeworICAgICAgICBpbnQgb2Zmc2V0ID0gLTE7CisgICAgICAgIGludCBsZW5ndGggPSAwOworICAgICAgICBpbnQgbGV2ZWwgPSBnZXROb2RlSW5mbyhpZGVudGl0eSwgT0ZGU0VUX0xFVkVMKTsKKworICAgICAgICBpZGVudGl0eSA9IGZpcnN0Q2hpbGQ7CisKKyAgICAgICAgd2hpbGUgKERUTS5OVUxMICE9IGlkZW50aXR5CisgICAgICAgICAgICAgICAmJiAoZ2V0Tm9kZUluZm8oaWRlbnRpdHksIE9GRlNFVF9MRVZFTCkgPiBsZXZlbCkpCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlID0gZ2V0Tm9kZVR5cGUoaWRlbnRpdHkpOworCisgICAgICAgICAgaWYgKGlzVGV4dFR5cGUodHlwZSkpCisgICAgICAgICAgeworICAgICAgICAgICAgaW50IGRhdGFJbmRleCA9IGdldE5vZGVJbmZvTm9XYWl0KGlkZW50aXR5LCBPRkZTRVRfREFUQV9PUl9RTkFNRSk7CisKKyAgICAgICAgICAgIGlmICgtMSA9PSBvZmZzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG9mZnNldCA9IG1fZGF0YS5lbGVtZW50QXQoZGF0YUluZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuZ3RoICs9IG1fZGF0YS5lbGVtZW50QXQoZGF0YUluZGV4ICsgMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWRlbnRpdHkgPSBnZXROZXh0Tm9kZUlkZW50aXR5KGlkZW50aXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW5ndGggPiAwKQorICAgICAgICB7CisgICAgICAgICAgbV9jaGFycy5zZW5kU0FYY2hhcmFjdGVycyhjaCwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGludCBkYXRhSW5kZXggPSBnZXROb2RlSW5mb05vV2FpdChpZGVudGl0eSwgT0ZGU0VUX0RBVEFfT1JfUU5BTUUpOworCisgICAgICAgIGlmIChkYXRhSW5kZXggPCAwKQorICAgICAgICB7CisgICAgICAgICAgZGF0YUluZGV4ID0gLWRhdGFJbmRleDsKKyAgICAgICAgICBkYXRhSW5kZXggPSBtX2RhdGEuZWxlbWVudEF0KGRhdGFJbmRleCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHN0ciA9IG1fdmFsdWVzT3JQcmVmaXhlcy5pbmRleFRvU3RyaW5nKGRhdGFJbmRleCk7CisKKyAgICAgICAgY2guY2hhcmFjdGVycyhzdHIudG9DaGFyQXJyYXkoKSwgMCwgc3RyLmxlbmd0aCgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGl0cyBET00tc3R5bGUgbm9kZSBuYW1lLiBUaGlzIHdpbGwKKyAgICogaW5jbHVkZSBuYW1lcyBzdWNoIGFzICN0ZXh0IG9yICNkb2N1bWVudC4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIFN0cmluZyBOYW1lIG9mIHRoaXMgbm9kZSwgd2hpY2ggbWF5IGJlIGFuIGVtcHR5IHN0cmluZy4KKyAgICogJVJFVklFVyUgRG9jdW1lbnQgd2hlbiBlbXB0eSBzdHJpbmcgaXMgcG9zc2libGUuLi4KKyAgICogJVJFVklFVy1DT01NRU5UJSBJdCBzaG91bGQgbmV2ZXIgYmUgZW1wdHksIHNob3VsZCBpdD8KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoaW50IG5vZGVIYW5kbGUpCisgIHsKKworICAgIGludCBleHBhbmRlZFR5cGVJRCA9IGdldEV4cGFuZGVkTmFtZUlEKG5vZGVIYW5kbGUpOworICAgIGludCBuYW1lc3BhY2VJRCA9IChleHBhbmRlZFR5cGVJRCAmIEV4cGFuZGVkTmFtZVRhYmxlLk1BU0tfTkFNRVNQQUNFKQorICAgICAgICAgICAgICAgICAgICAgID4+IEV4cGFuZGVkTmFtZVRhYmxlLkJJVFNfUEVSX0xPQ0FMTkFNRTsKKworICAgIGlmICgwID09IG5hbWVzcGFjZUlEKQorICAgIHsKKyAgICAgIFN0cmluZyBuYW1lID0gbV9lbnQuZ2V0TG9jYWxOYW1lKGV4cGFuZGVkVHlwZUlEKTsKKyAgICAgIGludCB0eXBlID0gZ2V0Tm9kZVR5cGUobm9kZUhhbmRsZSk7CisKKyAgICAgIGlmICh0eXBlID09IERUTS5OQU1FU1BBQ0VfTk9ERSkKKyAgICAgIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICByZXR1cm4gInhtbG5zIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiAieG1sbnM6IiArIG5hbWU7CisgICAgICB9CisgICAgICBlbHNlIGlmIChuYW1lID09IG51bGwpCisgICAgICB7CisgICAgICAgIHJldHVybiBtX2ZpeGVkbmFtZXNbdHlwZV07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaW50IHFuYW1lSW5kZXggPSBnZXROb2RlSW5mb05vV2FpdChub2RlSGFuZGxlICYgbV9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVRfREFUQV9PUl9RTkFNRSk7CisKKyAgICAgIGlmIChxbmFtZUluZGV4IDwgMCkKKyAgICAgIHsKKyAgICAgICAgcW5hbWVJbmRleCA9IC1xbmFtZUluZGV4OworICAgICAgICBxbmFtZUluZGV4ID0gbV9kYXRhLmVsZW1lbnRBdChxbmFtZUluZGV4KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG1fdmFsdWVzT3JQcmVmaXhlcy5pbmRleFRvU3RyaW5nKHFuYW1lSW5kZXgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gdGhlIFhQYXRoIG5vZGUgbmFtZS4gIFRoaXMgc2hvdWxkIGJlCisgICAqIHRoZSBuYW1lIGFzIGRlc2NyaWJlZCBieSB0aGUgWFBhdGggZGF0YSBtb2RlbCwgTk9UIHRoZSBET00tc3R5bGUKKyAgICogbmFtZS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgorICAgKiBAcmV0dXJuIFN0cmluZyBOYW1lIG9mIHRoaXMgbm9kZSwgd2hpY2ggbWF5IGJlIGFuIGVtcHR5IHN0cmluZy4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWVYKGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBpbnQgZXhwYW5kZWRUeXBlSUQgPSBnZXRFeHBhbmRlZE5hbWVJRChub2RlSGFuZGxlKTsKKyAgICBpbnQgbmFtZXNwYWNlSUQgPSAoZXhwYW5kZWRUeXBlSUQgJiBFeHBhbmRlZE5hbWVUYWJsZS5NQVNLX05BTUVTUEFDRSkKKyAgICAgICAgICAgICAgICAgICAgICA+PiBFeHBhbmRlZE5hbWVUYWJsZS5CSVRTX1BFUl9MT0NBTE5BTUU7CisKKyAgICBpZiAoMCA9PSBuYW1lc3BhY2VJRCkKKyAgICB7CisgICAgICBTdHJpbmcgbmFtZSA9IG1fZW50LmdldExvY2FsTmFtZShleHBhbmRlZFR5cGVJRCk7CisKKyAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgIHJldHVybiAiIjsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpbnQgcW5hbWVJbmRleCA9IGdldE5vZGVJbmZvTm9XYWl0KG5vZGVIYW5kbGUgJiBtX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVF9EQVRBX09SX1FOQU1FKTsKKworICAgICAgaWYgKHFuYW1lSW5kZXggPCAwKQorICAgICAgeworICAgICAgICBxbmFtZUluZGV4ID0gLXFuYW1lSW5kZXg7CisgICAgICAgIHFuYW1lSW5kZXggPSBtX2RhdGEuZWxlbWVudEF0KHFuYW1lSW5kZXgpOworICAgICAgfQorCisgICAgICByZXR1cm4gbV92YWx1ZXNPclByZWZpeGVzLmluZGV4VG9TdHJpbmcocW5hbWVJbmRleCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqICAgICA1LiBbc3BlY2lmaWVkXSBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIHdhcyBhY3R1YWxseQorICAgKiAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBzdGFydC10YWcgb2YgaXRzIGVsZW1lbnQsIG9yIHdhcyBkZWZhdWx0ZWQgZnJvbSB0aGUKKyAgICogICAgICAgIERURC4KKyAgICoKKyAgICogQHBhcmFtIHRoZSBhdHRyaWJ1dGUgaGFuZGxlCisgICAqCisgICAqIEBwYXJhbSBhdHRyaWJ1dGVIYW5kbGUgTXVzdCBiZSBhIHZhbGlkIGhhbmRsZSB0byBhbiBhdHRyaWJ1dGUgbm9kZS4KKyAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQ7CisgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHdhcyBkZWZhdWx0ZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVNwZWNpZmllZChpbnQgYXR0cmlidXRlSGFuZGxlKQorICB7CisKKyAgICAvLyBJJ20gbm90IHN1cmUgaWYgSSB3YW50IHRvIGRvIGFueXRoaW5nIHdpdGggdGhpcy4uLgorICAgIHJldHVybiB0cnVlOyAgLy8gPz8KKyAgfQorCisgIC8qKgorICAgKiAgIEEgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbiBpbmZvcm1hdGlvbiBpdGVtIGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAqCisgICAqICAgICAxLiBbc3lzdGVtIGlkZW50aWZpZXJdIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgZXh0ZXJuYWwgc3Vic2V0LCBpZgorICAgKiAgICAgICAgaXQgZXhpc3RzLiBPdGhlcndpc2UgdGhpcyBwcm9wZXJ0eSBoYXMgbm8gdmFsdWUuCisgICAqCisgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBpZGVudGlmaWVyIFN0cmluZyBvYmplY3QsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlRGVjbGFyYXRpb25TeXN0ZW1JZGVudGlmaWVyKCkKKyAgeworCisgICAgLyoqIEB0b2RvOiBpbXBsZW1lbnQgdGhpcyBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNRGVmYXVsdEJhc2UgYWJzdHJhY3QgbWV0aG9kICovCisgICAgZXJyb3IoIk5vdCB5ZXQgc3VwcG9ydGVkISIpOworCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBuZXh0IG5vZGUgaWRlbnRpdHkgdmFsdWUgaW4gdGhlIGxpc3QsIGFuZCBjYWxsIHRoZSBpdGVyYXRvcgorICAgKiBpZiBpdCBoYXNuJ3QgYmVlbiBhZGRlZCB5ZXQuCisgICAqCisgICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgbm9kZSBpZGVudGl0eSAoaW5kZXgpLgorICAgKiBAcmV0dXJuIGlkZW50aXR5KzEsIG9yIERUTS5OVUxMLgorICAgKi8KKyAgcHJvdGVjdGVkIGludCBnZXROZXh0Tm9kZUlkZW50aXR5KGludCBpZGVudGl0eSkKKyAgeworCisgICAgaWRlbnRpdHkgKz0gMTsKKworICAgIHdoaWxlIChpZGVudGl0eSA+PSBtX3NpemUpCisgICAgeworICAgICAgaWYgKG51bGwgPT0gbV9jb3JvdXRpbmVQYXJzZXIpCisgICAgICAgIHJldHVybiBEVE0uTlVMTDsKKworICAgICAgbmV4dE5vZGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gaWRlbnRpdHk7CisgIH0KKworICAvKioKKyAgICogRGlyZWN0bHkgY3JlYXRlIFNBWCBwYXJzZXIgZXZlbnRzIGZyb20gYSBzdWJ0cmVlLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KKyAgICogQHBhcmFtIGNoIEEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgQ29udGVudEhhbmRsZXIuCisgICAqCisgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBkaXNwYXRjaFRvRXZlbnRzKGludCBub2RlSGFuZGxlLCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBjaCkKKyAgICAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKworICAgIERUTVRyZWVXYWxrZXIgdHJlZVdhbGtlciA9IG1fd2Fsa2VyOworICAgIENvbnRlbnRIYW5kbGVyIHByZXZDSCA9IHRyZWVXYWxrZXIuZ2V0Y29udGVudEhhbmRsZXIoKTsKKworICAgIGlmIChudWxsICE9IHByZXZDSCkKKyAgICB7CisgICAgICB0cmVlV2Fsa2VyID0gbmV3IERUTVRyZWVXYWxrZXIoKTsKKyAgICB9CisKKyAgICB0cmVlV2Fsa2VyLnNldGNvbnRlbnRIYW5kbGVyKGNoKTsKKyAgICB0cmVlV2Fsa2VyLnNldERUTSh0aGlzKTsKKworICAgIHRyeQorICAgIHsKKyAgICAgIHRyZWVXYWxrZXIudHJhdmVyc2Uobm9kZUhhbmRsZSk7CisgICAgfQorICAgIGZpbmFsbHkKKyAgICB7CisgICAgICB0cmVlV2Fsa2VyLnNldGNvbnRlbnRIYW5kbGVyKG51bGwpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpbnRlZ2VycyBpbiBlYWNoIG5vZGUgaW5mbyBibG9jay4KKyAgICoKKyAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGludGVnZXJzIGluIGVhY2ggbm9kZSBpbmZvIGJsb2NrLgorICAgKi8KKyAgcHJvdGVjdGVkIGludCBnZXROb2RlSW5mb0Jsb2NrU2l6ZSgpCisgIHsKKyAgICByZXR1cm4gTk9ERUlORk9CTE9DS1NJWkU7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBudW1iZXIgb2Ygbm9kZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQuCisgICAqCisgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aGF0IGFyZSBjdXJyZW50bHkgaW4gdGhlIHRyZWUuCisgICAqLworICBwcm90ZWN0ZWQgaW50IGdldE51bWJlck9mTm9kZXMoKQorICB7CisgICAgcmV0dXJuIG1fc2l6ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgdHJ5IGFuZCBidWlsZCBvbmUgb3IgbW9yZSBub2RlcyBpbiB0aGUgdGFibGUuCisgICAqCisgICAqIEByZXR1cm4gVGhlIHRydWUgaWYgYSBuZXh0IG5vZGUgaXMgZm91bmQgb3IgZmFsc2UgaWYKKyAgICogICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBub2Rlcy4KKyAgICovCisgIHByb3RlY3RlZCBib29sZWFuIG5leHROb2RlKCkKKyAgeworCisgICAgaWYgKG51bGwgPT0gbV9jb3JvdXRpbmVQYXJzZXIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobV9lbmREb2N1bWVudE9jY3VyZWQpCisgICAgeworICAgICAgY2xlYXJDb1JvdXRpbmUoKTsKKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIE9iamVjdCBnb3RNb3JlID0gbV9jb3JvdXRpbmVQYXJzZXIuZG9Nb3JlKHRydWUsIG1fYXBwQ29yb3V0aW5lSUQpOworCisgICAgLy8gZ290TW9yZSBtYXkgYmUgYSBCb29sZWFuIChUUlVFIGlmIHN0aWxsIHBhcnNpbmcsIEZBTFNFIGlmCisgICAgLy8gRU9GKSBvciBhbiBleGNlcHRpb24gaWYgQ29yb3V0aW5lUGFyc2VyIG1hbGZ1bmN0aW9uZWQKKyAgICAvLyAoY29kZSBlcnJvciByYXRoZXIgdGhhbiB1c2VyIGVycm9yKS4KKyAgICAvLworICAgIC8vICVSRVZJRVclIEN1cnJlbnRseSB0aGUgRXJyb3JIYW5kbGVycyBza2V0Y2hlZCBoZXJlaW4gYXJlCisgICAgLy8gbm8tb3BzLCBzbyBJJ20gZ29pbmcgdG8gaW5pdGlhbGx5IGxlYXZlIHRoaXMgYWxzbyBhcyBhCisgICAgLy8gbm8tb3AuCisgICAgaWYgKCEoZ290TW9yZSBpbnN0YW5jZW9mIEJvb2xlYW4pKQorICAgIHsKKworICAgICAgLy8gZm9yIG5vdy4uLgorICAgICAgY2xlYXJDb1JvdXRpbmUoKTsKKworICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyAlVEJEJSAKKyAgICB9CisKKyAgICBpZiAoZ290TW9yZSAhPSBCb29sZWFuLlRSVUUpCisgICAgeworCisgICAgICAvLyBFT0YgcmVhY2hlZCB3aXRob3V0IHNhdGlzZnlpbmcgdGhlIHJlcXVlc3QKKyAgICAgIGNsZWFyQ29Sb3V0aW5lKCk7ICAvLyBEcm9wIGNvbm5lY3Rpb24sIHN0b3AgdHJ5aW5nCisKKyAgICAgIC8vICVUQkQlIGRlcmVnaXN0ZXIgYXMgaXRzIGxpc3RlbmVyPworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIEJvdHRsZW5lY2sgZGV0ZXJtaW5hdGlvbiBvZiB0ZXh0IHR5cGUuCisgICAqCisgICAqIEBwYXJhbSB0eXBlIG9uZW9mIERUTS5YWFhfTk9ERS4KKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSB0ZXh0IG9yIGNkYXRhIHNlY3Rpb24uCisgICAqLworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNUZXh0VHlwZShpbnQgdHlwZSkKKyAgeworICAgIHJldHVybiAoRFRNLlRFWFRfTk9ERSA9PSB0eXBlIHx8IERUTS5DREFUQV9TRUNUSU9OX05PREUgPT0gdHlwZSk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0IHRoZSBub2RlIG1hcCBmcm9tIHRoZSBub2RlLgorICAgKgorICAgKiBAcGFyYW0gdHlwZSByYXcgdHlwZSBJRCwgb25lIG9mIERUTS5YWFhfTk9ERS4KKyAgICogQHBhcmFtIGV4cGFuZGVkVHlwZUlEIFRoZSBleHBlbmRlZCB0eXBlIElELgorICAgKiBAcGFyYW0gbGV2ZWwgVGhlIGN1cnJlbnQgbGV2ZWwgaW4gdGhlIHRyZWUuCisgICAqIEBwYXJhbSBwYXJlbnRJbmRleCBUaGUgY3VycmVudCBwYXJlbnQgaW5kZXguCisgICAqIEBwYXJhbSBwcmV2aW91c1NpYmxpbmcgVGhlIHByZXZpb3VzIHNpYmxpbmcgaW5kZXguCisgICAqIEBwYXJhbSBkYXRhT3JQcmVmaXggaW5kZXggaW50byBtX2RhdGEgdGFibGUsIG9yIHN0cmluZyBoYW5kbGUuCisgICAqIEBwYXJhbSBjYW5IYXZlRmlyc3RDaGlsZCB0cnVlIGlmIHRoZSBub2RlIGNhbiBoYXZlIGEgZmlyc3QgY2hpbGQsIGZhbHNlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhdG9taWMuCisgICAqCisgICAqIEByZXR1cm4gVGhlIGluZGV4IGlkZW50aXR5IG9mIHRoZSBub2RlIHRoYXQgd2FzIGFkZGVkLgorICAgKi8KKyAgcHJvdGVjdGVkIGludCBhZGROb2RlKGludCB0eXBlLCBpbnQgZXhwYW5kZWRUeXBlSUQsIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJlbnRJbmRleCwgaW50IHByZXZpb3VzU2libGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXRhT3JQcmVmaXgsIGJvb2xlYW4gY2FuSGF2ZUZpcnN0Q2hpbGQpCisgIHsKKworICAgIGludCBub2RlSW5kZXggPSBtX3NpemUrKzsKKyAgICBpbnQgc3RhcnRJbmZvID0gbm9kZUluZGV4ICogTk9ERUlORk9CTE9DS1NJWkU7CisKKyAgICBtX2luZm8uYWRkRWxlbWVudHMoTk9ERUlORk9CTE9DS1NJWkUpOworICAgIG1faW5mby5zZXRFbGVtZW50QXQobGV2ZWwsIHN0YXJ0SW5mbyArIE9GRlNFVF9MRVZFTCk7CisgICAgbV9pbmZvLnNldEVsZW1lbnRBdCh0eXBlLCBzdGFydEluZm8gKyBPRkZTRVRfVFlQRSk7CisgICAgbV9pbmZvLnNldEVsZW1lbnRBdCgoY2FuSGF2ZUZpcnN0Q2hpbGQpID8gTk9UUFJPQ0VTU0VEIDogRFRNLk5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZm8gKyBPRkZTRVRfRklSU1RDSElMRCk7CisgICAgbV9pbmZvLnNldEVsZW1lbnRBdChOT1RQUk9DRVNTRUQsIHN0YXJ0SW5mbyArIE9GRlNFVF9ORVhUU0lCTElORyk7CisgICAgbV9pbmZvLnNldEVsZW1lbnRBdChwcmV2aW91c1NpYmxpbmcsIHN0YXJ0SW5mbyArIE9GRlNFVF9QUkVWU0lCTElORyk7CisgICAgbV9pbmZvLnNldEVsZW1lbnRBdChwYXJlbnRJbmRleCwgc3RhcnRJbmZvICsgT0ZGU0VUX1BBUkVOVCk7CisgICAgbV9pbmZvLnNldEVsZW1lbnRBdChleHBhbmRlZFR5cGVJRCwgc3RhcnRJbmZvICsgT0ZGU0VUX0VYUEFOREVETkFNRUlEKTsKKyAgICBtX2luZm8uc2V0RWxlbWVudEF0KGRhdGFPclByZWZpeCwgc3RhcnRJbmZvICsgT0ZGU0VUX0RBVEFfT1JfUU5BTUUpOworCisgICAgLy8gVGV4dCBub2RlcyBubyBsb25nZXIgbmVlZCBzcGVjaWFsIGhhbmRsaW5nLCBiZWNhdXNlIHdlCisgICAgLy8gZG9uJ3QgYWRkIHRoZW0gdW50aWwgdGhleSdyZSBjb21wbGV0ZQorICAgIHsKKyAgICAgIGlmIChEVE0uTlVMTCAhPSBwYXJlbnRJbmRleCAmJiB0eXBlICE9IERUTS5BVFRSSUJVVEVfTk9ERQorICAgICAgICAgICAgICAmJiB0eXBlICE9IERUTS5OQU1FU1BBQ0VfTk9ERSkKKyAgICAgIHsKKyAgICAgICAgaW50IHN0YXJ0UGFyZW50SW5mbyA9IHBhcmVudEluZGV4ICogTk9ERUlORk9CTE9DS1NJWkU7CisKKyAgICAgICAgaWYgKE5PVFBST0NFU1NFRAorICAgICAgICAgICAgICAgID09IG1faW5mby5lbGVtZW50QXQoc3RhcnRQYXJlbnRJbmZvICsgT0ZGU0VUX0ZJUlNUQ0hJTEQpKQorICAgICAgICB7CisgICAgICAgICAgbV9pbmZvLnNldEVsZW1lbnRBdChub2RlSW5kZXgsIHN0YXJ0UGFyZW50SW5mbyArIE9GRlNFVF9GSVJTVENISUxEKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3Qgd2FudCBuZXh0U2libGluZyB0byBiZSBwcm9jZXNzZWQgdW50aWwKKyAgICAgIC8vIGNoYXJhY3RlcnNGbHVzaCgpIGlzIGNhbGxlZC4KKyAgICAgIGlmIChEVE0uTlVMTCAhPSBwcmV2aW91c1NpYmxpbmcpCisgICAgICB7CisgICAgICAgIGludCBzdGFydFByZXZJbmZvID0gcHJldmlvdXNTaWJsaW5nICogTk9ERUlORk9CTE9DS1NJWkU7CisKKyAgICAgICAgbV9pbmZvLnNldEVsZW1lbnRBdChub2RlSW5kZXgsIHN0YXJ0UHJldkluZm8gKyBPRkZTRVRfTkVYVFNJQkxJTkcpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBub2RlSW5kZXg7CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGl0cyBub2RlIHZhbHVlLiBUaGlzIGlzIG1vc3RseQorICAgKiBhcyBkZWZpbmVkIGJ5IHRoZSBET00sIGJ1dCBtYXkgaWdub3JlIHNvbWUgY29udmVuaWVuY2VzLgorICAgKiA8cD4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgaWQuCisgICAqIEByZXR1cm4gU3RyaW5nIFZhbHVlIG9mIHRoaXMgbm9kZSwgb3IgbnVsbCBpZiBub3QKKyAgICogbWVhbmluZ2Z1bCBmb3IgdGhpcyBub2RlIHR5cGUuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZShpbnQgbm9kZUhhbmRsZSkKKyAgeworCisgICAgaW50IGlkZW50aXR5ID0gbm9kZUhhbmRsZSAmIG1fbWFzazsKKyAgICBpbnQgdHlwZSA9IGdldE5vZGVUeXBlKGlkZW50aXR5KTsKKworICAgIGlmIChpc1RleHRUeXBlKHR5cGUpKQorICAgIHsKKyAgICAgIGludCBkYXRhSW5kZXggPSBnZXROb2RlSW5mb05vV2FpdChpZGVudGl0eSwgT0ZGU0VUX0RBVEFfT1JfUU5BTUUpOworICAgICAgaW50IG9mZnNldCA9IG1fZGF0YS5lbGVtZW50QXQoZGF0YUluZGV4KTsKKyAgICAgIGludCBsZW5ndGggPSBtX2RhdGEuZWxlbWVudEF0KGRhdGFJbmRleCArIDEpOworCisgICAgICAvLyAlT1BUJSBXZSBzaG91bGQgY2FjaGUgdGhpcywgSSBndWVzcy4KKyAgICAgIHJldHVybiBtX2NoYXJzLmdldFN0cmluZyhvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorICAgIGVsc2UgaWYgKERUTS5FTEVNRU5UX05PREUgPT0gdHlwZSB8fCBEVE0uRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9PSB0eXBlCisgICAgICAgICAgICAgfHwgRFRNLkRPQ1VNRU5UX05PREUgPT0gdHlwZSkKKyAgICB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGludCBkYXRhSW5kZXggPSBnZXROb2RlSW5mb05vV2FpdChpZGVudGl0eSwgT0ZGU0VUX0RBVEFfT1JfUU5BTUUpOworCisgICAgICBpZiAoZGF0YUluZGV4IDwgMCkKKyAgICAgIHsKKyAgICAgICAgZGF0YUluZGV4ID0gLWRhdGFJbmRleDsKKyAgICAgICAgZGF0YUluZGV4ID0gbV9kYXRhLmVsZW1lbnRBdChkYXRhSW5kZXggKyAxKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG1fdmFsdWVzT3JQcmVmaXhlcy5pbmRleFRvU3RyaW5nKGRhdGFJbmRleCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiBpdHMgWFBhdGgtc3R5bGUgbG9jYWxuYW1lLgorICAgKiAoQXMgZGVmaW5lZCBpbiBOYW1lc3BhY2VzLCB0aGlzIGlzIHRoZSBwb3J0aW9uIG9mIHRoZSBuYW1lIGFmdGVyIGFueQorICAgKiBjb2xvbiBjaGFyYWN0ZXIpLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSB0aGUgaWQgb2YgdGhlIG5vZGUuCisgICAqIEByZXR1cm4gU3RyaW5nIExvY2FsIG5hbWUgb2YgdGhpcyBub2RlLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoaW50IG5vZGVIYW5kbGUpCisgIHsKKworICAgIGludCBleHBhbmRlZFR5cGVJRCA9IGdldEV4cGFuZGVkTmFtZUlEKG5vZGVIYW5kbGUpOworICAgIFN0cmluZyBuYW1lID0gbV9lbnQuZ2V0TG9jYWxOYW1lKGV4cGFuZGVkVHlwZUlEKTsKKworICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICByZXR1cm4gIiI7CisgICAgZWxzZQorICAgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICAvKioKKyAgICogVGhlIGdldFVucGFyc2VkRW50aXR5VVJJIGZ1bmN0aW9uIHJldHVybnMgdGhlIFVSSSBvZiB0aGUgdW5wYXJzZWQKKyAgICogZW50aXR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBzYW1lIGRvY3VtZW50IGFzIHRoZSBjb250ZXh0CisgICAqIG5vZGUgKHNlZSBbMy4zIFVucGFyc2VkIEVudGl0aWVzXSkuIEl0IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZgorICAgKiB0aGVyZSBpcyBubyBzdWNoIGVudGl0eS4KKyAgICogPHA+CisgICAqIFhNTCBwcm9jZXNzb3JzIG1heSBjaG9vc2UgdG8gdXNlIHRoZSBTeXN0ZW0gSWRlbnRpZmllciAoaWYgb25lCisgICAqIGlzIHByb3ZpZGVkKSB0byByZXNvbHZlIHRoZSBlbnRpdHksIHJhdGhlciB0aGFuIHRoZSBVUkkgaW4gdGhlCisgICAqIFB1YmxpYyBJZGVudGlmaWVyLiBUaGUgZGV0YWlscyBhcmUgZGVwZW5kZW50IG9uIHRoZSBwcm9jZXNzb3IsIGFuZAorICAgKiB3ZSB3b3VsZCBoYXZlIHRvIHN1cHBvcnQgc29tZSBmb3JtIG9mIHBsdWctaW4gcmVzb2x2ZXIgdG8gaGFuZGxlCisgICAqIHRoaXMgcHJvcGVybHkuIEN1cnJlbnRseSwgd2Ugc2ltcGx5IHJldHVybiB0aGUgU3lzdGVtIElkZW50aWZpZXIgaWYKKyAgICogcHJlc2VudCwgYW5kIGhvcGUgdGhhdCBpdCBhIHVzYWJsZSBVUkkgb3IgdGhhdCBvdXIgY2FsbGVyIGNhbgorICAgKiBtYXAgaXQgdG8gb25lLgorICAgKiBUT0RPOiBSZXNvbHZlIFB1YmxpYyBJZGVudGlmaWVycy4uLiBvciBjb25zaWRlciBjaGFuZ2luZyBmdW5jdGlvbiBuYW1lLgorICAgKiA8cD4KKyAgICogSWYgd2UgZmluZCBhIHJlbGF0aXZlIFVSSQorICAgKiByZWZlcmVuY2UsIFhNTCBleHBlY3RzIGl0IHRvIGJlIHJlc29sdmVkIGluIHRlcm1zIG9mIHRoZSBiYXNlIFVSSQorICAgKiBvZiB0aGUgZG9jdW1lbnQuIFRoZSBET00gZG9lc24ndCBkbyB0aGF0IGZvciB1cywgYW5kIGl0IGlzbid0CisgICAqIGVudGlyZWx5IGNsZWFyIHdoZXRoZXIgdGhhdCBzaG91bGQgYmUgZG9uZSBoZXJlOyBjdXJyZW50bHkgdGhhdCdzCisgICAqIHB1c2hlZCB1cCB0byBhIGhpZ2hlciBsZXZlbCBvZiBvdXIgYXBwbGljYXRpb24uIChOb3RlIHRoYXQgRE9NIExldmVsCisgICAqIDEgZGlkbid0IHN0b3JlIHRoZSBkb2N1bWVudCdzIGJhc2UgVVJJLikKKyAgICogVE9ETzogQ29uc2lkZXIgcmVzb2x2aW5nIFJlbGF0aXZlIFVSSXMuCisgICAqIDxwPgorICAgKiAoVGhlIERPTSdzIHN0YXRlbWVudCB0aGF0ICJBbiBYTUwgcHJvY2Vzc29yIG1heSBjaG9vc2UgdG8KKyAgICogY29tcGxldGVseSBleHBhbmQgZW50aXRpZXMgYmVmb3JlIHRoZSBzdHJ1Y3R1cmUgbW9kZWwgaXMgcGFzc2VkCisgICAqIHRvIHRoZSBET00iIHJlZmVycyBvbmx5IHRvIHBhcnNlZCBlbnRpdGllcywgbm90IHVucGFyc2VkLCBhbmQgaGVuY2UKKyAgICogZG9lc24ndCBhZmZlY3QgdGhpcyBmdW5jdGlvbi4pCisgICAqCisgICAqIEBwYXJhbSBuYW1lIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIEVudGl0eSBOYW1lIG9mIHRoZSB1bnBhcnNlZAorICAgKiBlbnRpdHkuCisgICAqCisgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSSSBvZiB0aGUgVW5wYXJzZWQgRW50aXR5LCBvciBhbgorICAgKiBlbXB0eSBzdHJpbmcgaWYgbm8gc3VjaCBlbnRpdHkgZXhpc3RzLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRVbnBhcnNlZEVudGl0eVVSSShTdHJpbmcgbmFtZSkKKyAgeworCisgICAgU3RyaW5nIHVybCA9ICIiOworCisgICAgaWYgKG51bGwgPT0gbV9lbnRpdGllcykKKyAgICAgIHJldHVybiB1cmw7CisKKyAgICBpbnQgbiA9IG1fZW50aXRpZXMuc2l6ZSgpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpICs9IEVOVElUWV9GSUVMRFNfUEVSKQorICAgIHsKKyAgICAgIFN0cmluZyBlbmFtZSA9IChTdHJpbmcpIG1fZW50aXRpZXMuZWxlbWVudEF0KGkgKyBFTlRJVFlfRklFTERfTkFNRSk7CisKKyAgICAgIGlmIChudWxsICE9IGVuYW1lICYmIGVuYW1lLmVxdWFscyhuYW1lKSkKKyAgICAgIHsKKyAgICAgICAgU3RyaW5nIG5uYW1lID0gKFN0cmluZykgbV9lbnRpdGllcy5lbGVtZW50QXQoaQorICAgICAgICAgICAgICAgICAgICAgICAgICsgRU5USVRZX0ZJRUxEX05PVEFUSU9OTkFNRSk7CisKKyAgICAgICAgaWYgKG51bGwgIT0gbm5hbWUpCisgICAgICAgIHsKKworICAgICAgICAgIC8vIFRoZSBkcmFmdCBzYXlzOiAiVGhlIFhTTFQgcHJvY2Vzc29yIG1heSB1c2UgdGhlIHB1YmxpYyAKKyAgICAgICAgICAvLyBpZGVudGlmaWVyIHRvIGdlbmVyYXRlIGEgVVJJIGZvciB0aGUgZW50aXR5IGluc3RlYWQgb2YgdGhlIFVSSSAKKyAgICAgICAgICAvLyBzcGVjaWZpZWQgaW4gdGhlIHN5c3RlbSBpZGVudGlmaWVyLiBJZiB0aGUgWFNMVCBwcm9jZXNzb3IgZG9lcyAKKyAgICAgICAgICAvLyBub3QgdXNlIHRoZSBwdWJsaWMgaWRlbnRpZmllciB0byBnZW5lcmF0ZSB0aGUgVVJJLCBpdCBtdXN0IHVzZSAKKyAgICAgICAgICAvLyB0aGUgc3lzdGVtIGlkZW50aWZpZXI7IGlmIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBpcyBhIHJlbGF0aXZlIAorICAgICAgICAgIC8vIFVSSSwgaXQgbXVzdCBiZSByZXNvbHZlZCBpbnRvIGFuIGFic29sdXRlIFVSSSB1c2luZyB0aGUgVVJJIG9mIAorICAgICAgICAgIC8vIHRoZSByZXNvdXJjZSBjb250YWluaW5nIHRoZSBlbnRpdHkgZGVjbGFyYXRpb24gYXMgdGhlIGJhc2UgCisgICAgICAgICAgLy8gVVJJIFtSRkMyMzk2XS4iCisgICAgICAgICAgLy8gU28gSSdtIGZhbGxpbmcgYSBiaXQgc2hvcnQgaGVyZS4KKyAgICAgICAgICB1cmwgPSAoU3RyaW5nKSBtX2VudGl0aWVzLmVsZW1lbnRBdChpICsgRU5USVRZX0ZJRUxEX1NZU1RFTUlEKTsKKworICAgICAgICAgIGlmIChudWxsID09IHVybCkKKyAgICAgICAgICB7CisgICAgICAgICAgICB1cmwgPSAoU3RyaW5nKSBtX2VudGl0aWVzLmVsZW1lbnRBdChpICsgRU5USVRZX0ZJRUxEX1BVQkxJQ0lEKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdXJsOworICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGEgbmFtZXNwYWNlIGhhbmRsZSwgcmV0dXJuIHRoZSBwcmVmaXggdGhhdCB0aGUgbmFtZXNwYWNlIGRlY2wgaXMKKyAgICogbWFwcGluZy4KKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIHRoZSBwcmVmaXggdXNlZCB0byBtYXAgdG8gdGhlIG5hbWVzcGFjZS4KKyAgICoKKyAgICogPHA+ICVSRVZJRVclIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCAiIiBmb3Igbm8gcHJlZml4PyAgPC9wPgorICAgKiA8cD4gJVJFVklFVy1DT01NRU5UJSBJIHRoaW5rIHNvLi4uIG5vdCB0b3RhbGx5IHN1cmUuIC1zYiAgPC9wPgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSB0aGUgaWQgb2YgdGhlIG5vZGUuCisgICAqIEByZXR1cm4gU3RyaW5nIHByZWZpeCBvZiB0aGlzIG5vZGUncyBuYW1lLCBvciAiIiBpZiBubyBleHBsaWNpdAorICAgKiBuYW1lc3BhY2UgcHJlZml4IHdhcyBnaXZlbi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KGludCBub2RlSGFuZGxlKQorICB7CisKKyAgICBpbnQgaWRlbnRpdHkgPSBub2RlSGFuZGxlICYgbV9tYXNrOworICAgIGludCB0eXBlID0gZ2V0Tm9kZVR5cGUoaWRlbnRpdHkpOworCisgICAgaWYgKERUTS5FTEVNRU5UX05PREUgPT0gdHlwZSkKKyAgICB7CisgICAgICBpbnQgcHJlZml4SW5kZXggPSBnZXROb2RlSW5mb05vV2FpdChpZGVudGl0eSwgT0ZGU0VUX0RBVEFfT1JfUU5BTUUpOworCisgICAgICBpZiAoMCA9PSBwcmVmaXhJbmRleCkKKyAgICAgICAgcmV0dXJuICIiOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBTdHJpbmcgcW5hbWUgPSBtX3ZhbHVlc09yUHJlZml4ZXMuaW5kZXhUb1N0cmluZyhwcmVmaXhJbmRleCk7CisKKyAgICAgICAgcmV0dXJuIGdldFByZWZpeChxbmFtZSwgbnVsbCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKERUTS5BVFRSSUJVVEVfTk9ERSA9PSB0eXBlKQorICAgIHsKKyAgICAgIGludCBwcmVmaXhJbmRleCA9IGdldE5vZGVJbmZvTm9XYWl0KGlkZW50aXR5LCBPRkZTRVRfREFUQV9PUl9RTkFNRSk7CisKKyAgICAgIGlmIChwcmVmaXhJbmRleCA8IDApCisgICAgICB7CisgICAgICAgIHByZWZpeEluZGV4ID0gbV9kYXRhLmVsZW1lbnRBdCgtcHJlZml4SW5kZXgpOworCisgICAgICAgIFN0cmluZyBxbmFtZSA9IG1fdmFsdWVzT3JQcmVmaXhlcy5pbmRleFRvU3RyaW5nKHByZWZpeEluZGV4KTsKKworICAgICAgICByZXR1cm4gZ2V0UHJlZml4KHFuYW1lLCBudWxsKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvKioKKyAgICogUmV0cmlldmVzIGFuIGF0dHJpYnV0ZSBub2RlIGJ5IGJ5IHF1YWxpZmllZCBuYW1lIGFuZCBuYW1lc3BhY2UgVVJJLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBpbnQgSGFuZGxlIG9mIHRoZSBub2RlIHVwb24gd2hpY2ggdG8gbG9vayB1cCB0aGlzIGF0dHJpYnV0ZS4uCisgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgVGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGF0dHJpYnV0ZSB0bworICAgKiAgIHJldHJpZXZlLCBvciBudWxsLgorICAgKiBAcGFyYW0gbmFtZSBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvCisgICAqICAgcmV0cmlldmUuCisgICAqIEByZXR1cm4gVGhlIGF0dHJpYnV0ZSBub2RlIGhhbmRsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSAoCisgICAqICAgPGNvZGU+bm9kZU5hbWU8L2NvZGU+KSBvciA8Y29kZT5EVE0uTlVMTDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaAorICAgKiAgIGF0dHJpYnV0ZS4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlTm9kZShpbnQgbm9kZUhhbmRsZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKQorICB7CisKKyAgICBmb3IgKGludCBhdHRySCA9IGdldEZpcnN0QXR0cmlidXRlKG5vZGVIYW5kbGUpOyBEVE0uTlVMTCAhPSBhdHRySDsKKyAgICAgICAgICAgIGF0dHJIID0gZ2V0TmV4dEF0dHJpYnV0ZShhdHRySCkpCisgICAgeworICAgICAgU3RyaW5nIGF0dHJOUyA9IGdldE5hbWVzcGFjZVVSSShhdHRySCk7CisgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBnZXRMb2NhbE5hbWUoYXR0ckgpOworICAgICAgYm9vbGVhbiBuc01hdGNoID0gbmFtZXNwYWNlVVJJID09IGF0dHJOUworICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG5hbWVzcGFjZVVSSSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmFtZXNwYWNlVVJJLmVxdWFscyhhdHRyTlMpKTsKKworICAgICAgaWYgKG5zTWF0Y2ggJiYgbmFtZS5lcXVhbHMoYXR0ck5hbWUpKQorICAgICAgICByZXR1cm4gYXR0ckg7CisgICAgfQorCisgICAgcmV0dXJuIERUTS5OVUxMOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVybmFsIHN1YnNldCwKKyAgICogbm9ybWFsaXplZCBhcyBkZXNjcmliZWQgaW4gNC4yLjIgRXh0ZXJuYWwgRW50aXRpZXMgW1hNTF0uIElmIHRoZXJlIGlzCisgICAqIG5vIGV4dGVybmFsIHN1YnNldCBvciBpZiBpdCBoYXMgbm8gcHVibGljIGlkZW50aWZpZXIsIHRoaXMgcHJvcGVydHkKKyAgICogaGFzIG5vIHZhbHVlLgorICAgKgorICAgKiBAcGFyYW0gdGhlIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24gaGFuZGxlCisgICAqCisgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBpZGVudGlmaWVyIFN0cmluZyBvYmplY3QsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlRGVjbGFyYXRpb25QdWJsaWNJZGVudGlmaWVyKCkKKyAgeworCisgICAgLyoqIEB0b2RvOiBpbXBsZW1lbnQgdGhpcyBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNRGVmYXVsdEJhc2UgYWJzdHJhY3QgbWV0aG9kICovCisgICAgZXJyb3IoIk5vdCB5ZXQgc3VwcG9ydGVkISIpOworCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGl0cyBET00tc3R5bGUgbmFtZXNwYWNlIFVSSQorICAgKiAoQXMgZGVmaW5lZCBpbiBOYW1lc3BhY2VzLCB0aGlzIGlzIHRoZSBkZWNsYXJlZCBVUkkgd2hpY2ggdGhpcyBub2RlJ3MKKyAgICogcHJlZml4IC0tIG9yIGRlZmF1bHQgaW4gbGlldSB0aGVyZW9mIC0tIHdhcyBtYXBwZWQgdG8uKQorICAgKgorICAgKiA8cD4lUkVWSUVXJSBOdWxsIG9yICIiPyAtc2I8L3A+CisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KKyAgICogQHJldHVybiBTdHJpbmcgVVJJIHZhbHVlIG9mIHRoaXMgbm9kZSdzIG5hbWVzcGFjZSwgb3IgbnVsbCBpZiBubworICAgKiBuYW1lc3BhY2Ugd2FzIHJlc29sdmVkLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IG5vZGVIYW5kbGUpCisgIHsKKworICAgIGludCBleHBhbmRlZFR5cGVJRCA9IGdldEV4cGFuZGVkTmFtZUlEKG5vZGVIYW5kbGUpOworCisgICAgcmV0dXJuIG1fZW50LmdldE5hbWVzcGFjZShleHBhbmRlZFR5cGVJRCk7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBzdHJpbmctdmFsdWUgb2YgYSBub2RlIGFzIGEgU3RyaW5nIG9iamVjdAorICAgKiAoc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI2RhdGEtbW9kZWwKKyAgICogZm9yIHRoZSBkZWZpbml0aW9uIG9mIGEgbm9kZSdzIHN0cmluZy12YWx1ZSkuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIElELgorICAgKgorICAgKiBAcmV0dXJuIEEgc3RyaW5nIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHN0cmluZy12YWx1ZSBvZiB0aGUgZ2l2ZW4gbm9kZS4KKyAgICovCisgIHB1YmxpYyBYTUxTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoaW50IG5vZGVIYW5kbGUpCisgIHsKKworICAgIGludCBpZGVudGl0eSA9IG5vZGVIYW5kbGUgJiBtX21hc2s7CisgICAgaW50IHR5cGUgPSBnZXROb2RlVHlwZShpZGVudGl0eSk7CisKKyAgICBpZiAoaXNUZXh0VHlwZSh0eXBlKSkKKyAgICB7CisgICAgICBpbnQgZGF0YUluZGV4ID0gZ2V0Tm9kZUluZm9Ob1dhaXQoaWRlbnRpdHksIE9GRlNFVF9EQVRBX09SX1FOQU1FKTsKKyAgICAgIGludCBvZmZzZXQgPSBtX2RhdGEuZWxlbWVudEF0KGRhdGFJbmRleCk7CisgICAgICBpbnQgbGVuZ3RoID0gbV9kYXRhLmVsZW1lbnRBdChkYXRhSW5kZXggKyAxKTsKKworICAgICAgcmV0dXJuIG1feHN0cmYubmV3c3RyKG1fY2hhcnMsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGludCBmaXJzdENoaWxkID0gZ2V0Tm9kZUluZm8oaWRlbnRpdHksIE9GRlNFVF9GSVJTVENISUxEKTsKKworICAgICAgaWYgKERUTS5OVUxMICE9IGZpcnN0Q2hpbGQpCisgICAgICB7CisgICAgICAgIGludCBvZmZzZXQgPSAtMTsKKyAgICAgICAgaW50IGxlbmd0aCA9IDA7CisgICAgICAgIGludCBsZXZlbCA9IGdldE5vZGVJbmZvKGlkZW50aXR5LCBPRkZTRVRfTEVWRUwpOworCisgICAgICAgIGlkZW50aXR5ID0gZmlyc3RDaGlsZDsKKworICAgICAgICB3aGlsZSAoRFRNLk5VTEwgIT0gaWRlbnRpdHkKKyAgICAgICAgICAgICAgICYmIChnZXROb2RlSW5mbyhpZGVudGl0eSwgT0ZGU0VUX0xFVkVMKSA+IGxldmVsKSkKKyAgICAgICAgeworICAgICAgICAgIHR5cGUgPSBnZXROb2RlVHlwZShpZGVudGl0eSk7CisKKyAgICAgICAgICBpZiAoaXNUZXh0VHlwZSh0eXBlKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgZGF0YUluZGV4ID0gZ2V0Tm9kZUluZm9Ob1dhaXQoaWRlbnRpdHksIE9GRlNFVF9EQVRBX09SX1FOQU1FKTsKKworICAgICAgICAgICAgaWYgKC0xID09IG9mZnNldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgb2Zmc2V0ID0gbV9kYXRhLmVsZW1lbnRBdChkYXRhSW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZW5ndGggKz0gbV9kYXRhLmVsZW1lbnRBdChkYXRhSW5kZXggKyAxKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZGVudGl0eSA9IGdldE5leHROb2RlSWRlbnRpdHkoaWRlbnRpdHkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxlbmd0aCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gbV94c3RyZi5uZXdzdHIobV9jaGFycywgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGludCBkYXRhSW5kZXggPSBnZXROb2RlSW5mb05vV2FpdChpZGVudGl0eSwgT0ZGU0VUX0RBVEFfT1JfUU5BTUUpOworCisgICAgICAgIGlmIChkYXRhSW5kZXggPCAwKQorICAgICAgICB7CisgICAgICAgICAgZGF0YUluZGV4ID0gLWRhdGFJbmRleDsKKyAgICAgICAgICBkYXRhSW5kZXggPSBtX2RhdGEuZWxlbWVudEF0KGRhdGFJbmRleCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1feHN0cmYubmV3c3RyKG1fdmFsdWVzT3JQcmVmaXhlcy5pbmRleFRvU3RyaW5nKGRhdGFJbmRleCkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtX3hzdHJmLmVtcHR5c3RyKCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgPGNvZGU+RWxlbWVudDwvY29kZT4gd2hvc2UgPGNvZGU+SUQ8L2NvZGU+IGlzIGdpdmVuIGJ5CisgICAqIDxjb2RlPmVsZW1lbnRJZDwvY29kZT4uIElmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMsIHJldHVybnMKKyAgICogPGNvZGU+RFRNLk5VTEw8L2NvZGU+LiBCZWhhdmlvciBpcyBub3QgZGVmaW5lZCBpZiBtb3JlIHRoYW4gb25lIGVsZW1lbnQKKyAgICogaGFzIHRoaXMgPGNvZGU+SUQ8L2NvZGU+LiBBdHRyaWJ1dGVzIChpbmNsdWRpbmcgdGhvc2UKKyAgICogd2l0aCB0aGUgbmFtZSAiSUQiKSBhcmUgbm90IG9mIHR5cGUgSUQgdW5sZXNzIHNvIGRlZmluZWQgYnkgRFREL1NjaGVtYQorICAgKiBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gdGhlIERUTSBpbXBsZW1lbnRhdGlvbi4KKyAgICogSW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IGtub3cgd2hldGhlciBhdHRyaWJ1dGVzIGFyZSBvZiB0eXBlIElEIG9yCisgICAqIG5vdCBhcmUgZXhwZWN0ZWQgdG8gcmV0dXJuIDxjb2RlPkRUTS5OVUxMPC9jb2RlPi4KKyAgICoKKyAgICogPHA+JVJFVklFVyUgUHJlc3VtYWJseSBJRHMgYXJlIHN0aWxsIHNjb3BlZCB0byBhIHNpbmdsZSBkb2N1bWVudCwKKyAgICogYW5kIHRoaXMgb3BlcmF0aW9uIHNlYXJjaGVzIG9ubHkgd2l0aGluIGEgc2luZ2xlIGRvY3VtZW50LCByaWdodD8KKyAgICogV291bGRuJ3Qgd2FudCBjb2xsaXNpb25zIGJldHdlZW4gRFRNcyBpbiB0aGUgc2FtZSBwcm9jZXNzLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIGVsZW1lbnRJZCBUaGUgdW5pcXVlIDxjb2RlPmlkPC9jb2RlPiB2YWx1ZSBmb3IgYW4gZWxlbWVudC4KKyAgICogQHJldHVybiBUaGUgaGFuZGxlIG9mIHRoZSBtYXRjaGluZyBlbGVtZW50LgorICAgKi8KKyAgcHVibGljIGludCBnZXRFbGVtZW50QnlJZChTdHJpbmcgZWxlbWVudElkKQorICB7CisKKyAgICBJbnRlZ2VyIGludE9iajsKKyAgICBib29sZWFuIGlzTW9yZSA9IHRydWU7CisKKyAgICBkbworICAgIHsKKyAgICAgIGludE9iaiA9IChJbnRlZ2VyKSBtX2lkQXR0cmlidXRlcy5nZXQoZWxlbWVudElkKTsKKworICAgICAgaWYgKG51bGwgIT0gaW50T2JqKQorICAgICAgICByZXR1cm4gaW50T2JqLmludFZhbHVlKCk7CisKKyAgICAgIGlmICghaXNNb3JlIHx8IG1fZW5kRG9jdW1lbnRPY2N1cmVkKQorICAgICAgICBicmVhazsKKworICAgICAgaXNNb3JlID0gbmV4dE5vZGUoKTsKKyAgICB9CisgICAgd2hpbGUgKG51bGwgPT0gaW50T2JqKTsKKworICAgIHJldHVybiBEVE0uTlVMTDsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgYSBwcmVmaXggZWl0aGVyIGZyb20gdGhlIHFuYW1lIG9yIGZyb20gdGhlIHVyaSBtYXBwaW5nLCBvciBqdXN0IG1ha2UKKyAgICogb25lIHVwIQorICAgKgorICAgKiBAcGFyYW0gcW5hbWUgVGhlIHF1YWxpZmllZCBuYW1lLCB3aGljaCBtYXkgYmUgbnVsbC4KKyAgICogQHBhcmFtIHVyaSBUaGUgbmFtZXNwYWNlIFVSSSwgd2hpY2ggbWF5IGJlIG51bGwuCisgICAqCisgICAqIEByZXR1cm4gVGhlIHByZWZpeCBpZiB0aGVyZSBpcyBvbmUsIG9yIG51bGwuCisgICAqLworICBwcml2YXRlIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIHFuYW1lLCBTdHJpbmcgdXJpKQorICB7CisKKyAgICBTdHJpbmcgcHJlZml4OworCisgICAgaWYgKG51bGwgIT0gdXJpICYmIHVyaS5sZW5ndGgoKSA+IDApCisgICAgeworICAgICAgaW50IHVyaUluZGV4ID0gbV9wcmVmaXhNYXBwaW5ncy5pbmRleE9mKHVyaSwgMCk7CisKKyAgICAgIGlmICh1cmlJbmRleCA+PSAwKQorICAgICAgeworICAgICAgICBwcmVmaXggPSAoU3RyaW5nKSBtX3ByZWZpeE1hcHBpbmdzLmVsZW1lbnRBdCh1cmlJbmRleCAtIDEpOworICAgICAgfQorICAgICAgZWxzZSBpZiAobnVsbCAhPSBxbmFtZSkKKyAgICAgIHsKKyAgICAgICAgaW50IGluZGV4T2ZOU1NlcCA9IHFuYW1lLmluZGV4T2YoJzonKTsKKworICAgICAgICBpZiAocW5hbWUuZXF1YWxzKCJ4bWxucyIpKQorICAgICAgICAgIHByZWZpeCA9ICIiOworICAgICAgICBlbHNlIGlmIChxbmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkKKyAgICAgICAgICBwcmVmaXggPSBxbmFtZS5zdWJzdHJpbmcoaW5kZXhPZk5TU2VwICsgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmVmaXggPSAoaW5kZXhPZk5TU2VwID4gMCkKKyAgICAgICAgICAgICAgICAgICA/IHFuYW1lLnN1YnN0cmluZygwLCBpbmRleE9mTlNTZXApIDogbnVsbDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcHJlZml4ID0gbnVsbDsgIC8vID8/CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKG51bGwgIT0gcW5hbWUpCisgICAgeworICAgICAgaW50IGluZGV4T2ZOU1NlcCA9IHFuYW1lLmluZGV4T2YoJzonKTsKKworICAgICAgaWYgKHFuYW1lLmVxdWFscygieG1sbnMiKSkKKyAgICAgICAgcHJlZml4ID0gIiI7CisgICAgICBlbHNlIGlmIChxbmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkKKyAgICAgICAgcHJlZml4ID0gcW5hbWUuc3Vic3RyaW5nKGluZGV4T2ZOU1NlcCArIDEpOworICAgICAgZWxzZQorICAgICAgICBwcmVmaXggPSAoaW5kZXhPZk5TU2VwID4gMCkgPyBxbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXhPZk5TU2VwKSA6IG51bGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwcmVmaXggPSBudWxsOworICAgIH0KKworICAgIHJldHVybiBwcmVmaXg7CisgIH0KKworICAvKioKKyAgICogU2V0IGFuIElEIHN0cmluZyB0byBub2RlIGFzc29jaWF0aW9uIGluIHRoZSBJRCB0YWJsZS4KKyAgICoKKyAgICogQHBhcmFtIGlkIFRoZSBJRCBzdHJpbmcuCisgICAqIEBwYXJhbSBlbGVtIFRoZSBhc3NvY2lhdGVkIGVsZW1lbnQgaGFuZGxlLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0SURBdHRyaWJ1dGUoU3RyaW5nIGlkLCBpbnQgZWxlbSkKKyAgeworICAgIG1faWRBdHRyaWJ1dGVzLnB1dChpZCwgbmV3IEludGVnZXIoZWxlbSkpOworICB9CisKKyAgLyoqCisgICAqIENoZWNrIHdoZXRoZXIgYWNjdW11bGF0ZWQgdGV4dCBzaG91bGQgYmUgc3RyaXBwZWQ7IGlmIG5vdCwKKyAgICogYXBwZW5kIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3Igb2YgdGV4dC9jZGF0YSBub2RlLgorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgY2hhcmFjdGVyc0ZsdXNoKCkKKyAgeworCisgICAgaWYgKG1fdGV4dFBlbmRpbmdTdGFydCA+PSAwKSAgLy8gLTEgaW5kaWNhdGVzIG5vLXRleHQtaW4tcHJvZ3Jlc3MKKyAgICB7CisgICAgICBpbnQgbGVuZ3RoID0gbV9jaGFycy5zaXplKCkgLSBtX3RleHRQZW5kaW5nU3RhcnQ7CisgICAgICBib29sZWFuIGRvU3RyaXAgPSBmYWxzZTsKKworICAgICAgaWYgKGdldFNob3VsZFN0cmlwV2hpdGVzcGFjZSgpKQorICAgICAgeworICAgICAgICBkb1N0cmlwID0gbV9jaGFycy5pc1doaXRlc3BhY2UobV90ZXh0UGVuZGluZ1N0YXJ0LCBsZW5ndGgpOworICAgICAgfQorCisgICAgICBpZiAoZG9TdHJpcCkKKyAgICAgICAgbV9jaGFycy5zZXRMZW5ndGgobV90ZXh0UGVuZGluZ1N0YXJ0KTsgIC8vIERpc2NhcmQgYWNjdW11bGF0ZWQgdGV4dAorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpbnQgZXhOYW1lID0gbV9lbnQuZ2V0RXhwYW5kZWROYW1lSUQoRFRNLlRFWFRfTk9ERSk7CisgICAgICAgIGludCBkYXRhSW5kZXggPSBtX2RhdGEuc2l6ZSgpOworCisgICAgICAgIG1fcHJldmlvdXMgPSBhZGROb2RlKG1fY29hbGVzY2VkVGV4dFR5cGUsIGV4TmFtZSwgbV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnRzLnBlZWsoKSwgbV9wcmV2aW91cywgZGF0YUluZGV4LCBmYWxzZSk7CisKKyAgICAgICAgbV9kYXRhLmFkZEVsZW1lbnQobV90ZXh0UGVuZGluZ1N0YXJ0KTsKKyAgICAgICAgbV9kYXRhLmFkZEVsZW1lbnQobGVuZ3RoKTsKKyAgICAgIH0KKworICAgICAgLy8gUmVzZXQgZm9yIG5leHQgdGV4dCBibG9jaworICAgICAgbV90ZXh0UGVuZGluZ1N0YXJ0ID0gLTE7CisgICAgICBtX3RleHRUeXBlID0gbV9jb2FsZXNjZWRUZXh0VHlwZSA9IERUTS5URVhUX05PREU7CisgICAgfQorICB9CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIEVudGl0eVJlc29sdmVyIGludGVyZmFjZS4KKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAvKioKKyAgICogUmVzb2x2ZSBhbiBleHRlcm5hbCBlbnRpdHkuCisgICAqCisgICAqIDxwPkFsd2F5cyByZXR1cm4gbnVsbCwgc28gdGhhdCB0aGUgcGFyc2VyIHdpbGwgdXNlIHRoZSBzeXN0ZW0KKyAgICogaWRlbnRpZmllciBwcm92aWRlZCBpbiB0aGUgWE1MIGRvY3VtZW50LiAgVGhpcyBtZXRob2QgaW1wbGVtZW50cworICAgKiB0aGUgU0FYIGRlZmF1bHQgYmVoYXZpb3VyOiBhcHBsaWNhdGlvbiB3cml0ZXJzIGNhbiBvdmVycmlkZSBpdAorICAgKiBpbiBhIHN1YmNsYXNzIHRvIGRvIHNwZWNpYWwgdHJhbnNsYXRpb25zIHN1Y2ggYXMgY2F0YWxvZyBsb29rdXBzCisgICAqIG9yIFVSSSByZWRpcmVjdGlvbi48L3A+CisgICAqCisgICAqIEBwYXJhbSBwdWJsaWNJZCBUaGUgcHVibGljIGlkZW50aWZlciwgb3IgbnVsbCBpZiBub25lIGlzCisgICAqICAgICAgICAgICAgICAgICBhdmFpbGFibGUuCisgICAqIEBwYXJhbSBzeXN0ZW1JZCBUaGUgc3lzdGVtIGlkZW50aWZpZXIgcHJvdmlkZWQgaW4gdGhlIFhNTAorICAgKiAgICAgICAgICAgICAgICAgZG9jdW1lbnQuCisgICAqIEByZXR1cm4gVGhlIG5ldyBpbnB1dCBzb3VyY2UsIG9yIG51bGwgdG8gcmVxdWlyZSB0aGUKKyAgICogICAgICAgICBkZWZhdWx0IGJlaGF2aW91ci4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5CisgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCisgICAqIEBzZWUgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eQorICAgKgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCisgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBEVERIYW5kbGVyIGludGVyZmFjZS4KKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAvKioKKyAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgYSBub3RhdGlvbiBkZWNsYXJhdGlvbi4KKyAgICoKKyAgICogPHA+QnkgZGVmYXVsdCwgZG8gbm90aGluZy4gIEFwcGxpY2F0aW9uIHdyaXRlcnMgbWF5IG92ZXJyaWRlIHRoaXMKKyAgICogbWV0aG9kIGluIGEgc3ViY2xhc3MgaWYgdGhleSB3aXNoIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG5vdGF0aW9ucworICAgKiBkZWNsYXJlZCBpbiBhIGRvY3VtZW50LjwvcD4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUgVGhlIG5vdGF0aW9uIG5hbWUuCisgICAqIEBwYXJhbSBwdWJsaWNJZCBUaGUgbm90YXRpb24gcHVibGljIGlkZW50aWZpZXIsIG9yIG51bGwgaWYgbm90CisgICAqICAgICAgICAgICAgICAgICBhdmFpbGFibGUuCisgICAqIEBwYXJhbSBzeXN0ZW1JZCBUaGUgbm90YXRpb24gc3lzdGVtIGlkZW50aWZpZXIuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQorICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgorICAgKiBAc2VlIG9yZy54bWwuc2F4LkRUREhhbmRsZXIjbm90YXRpb25EZWNsCisgICAqCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBub3RhdGlvbkRlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQorICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgLy8gbm8gb3AKKyAgfQorCisgIC8qKgorICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBhbiB1bnBhcnNlZCBlbnRpdHkgZGVjbGFyYXRpb24uCisgICAqCisgICAqIDxwPkJ5IGRlZmF1bHQsIGRvIG5vdGhpbmcuICBBcHBsaWNhdGlvbiB3cml0ZXJzIG1heSBvdmVycmlkZSB0aGlzCisgICAqIG1ldGhvZCBpbiBhIHN1YmNsYXNzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHVucGFyc2VkIGVudGl0aWVzCisgICAqIGRlY2xhcmVkIGluIGEgZG9jdW1lbnQuPC9wPgorICAgKgorICAgKiBAcGFyYW0gbmFtZSBUaGUgZW50aXR5IG5hbWUuCisgICAqIEBwYXJhbSBwdWJsaWNJZCBUaGUgZW50aXR5IHB1YmxpYyBpZGVudGlmaWVyLCBvciBudWxsIGlmIG5vdAorICAgKiAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLgorICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIGVudGl0eSBzeXN0ZW0gaWRlbnRpZmllci4KKyAgICogQHBhcmFtIG5vdGF0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBub3RhdGlvbi4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5CisgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCisgICAqIEBzZWUgb3JnLnhtbC5zYXguRFRESGFuZGxlciN1bnBhcnNlZEVudGl0eURlY2wKKyAgICoKKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyB2b2lkIHVucGFyc2VkRW50aXR5RGVjbCgKKyAgICAgICAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyBub3RhdGlvbk5hbWUpCisgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChudWxsID09IG1fZW50aXRpZXMpCisgICAgeworICAgICAgbV9lbnRpdGllcyA9IG5ldyBWZWN0b3IoKTsKKyAgICB9CisKKyAgICB0cnkKKyAgICB7CisgICAgICBzeXN0ZW1JZCA9IFN5c3RlbUlEUmVzb2x2ZXIuZ2V0QWJzb2x1dGVVUkkoc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOworICAgIH0KKyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgeworICAgICAgdGhyb3cgbmV3IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICAvLyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9GSUVMRF9QVUJMSUNJRCA9IDA7CisgICAgbV9lbnRpdGllcy5hZGRFbGVtZW50KHB1YmxpY0lkKTsKKworICAgIC8vICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0ZJRUxEX1NZU1RFTUlEID0gMTsKKyAgICBtX2VudGl0aWVzLmFkZEVsZW1lbnQoc3lzdGVtSWQpOworCisgICAgLy8gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfRklFTERfTk9UQVRJT05OQU1FID0gMjsKKyAgICBtX2VudGl0aWVzLmFkZEVsZW1lbnQobm90YXRpb25OYW1lKTsKKworICAgIC8vICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0ZJRUxEX05BTUUgPSAzOworICAgIG1fZW50aXRpZXMuYWRkRWxlbWVudChuYW1lKTsKKyAgfQorCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vIEltcGxlbWVudGF0aW9uIG9mIENvbnRlbnRIYW5kbGVyIGludGVyZmFjZS4KKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAvKioKKyAgICogUmVjZWl2ZSBhIExvY2F0b3Igb2JqZWN0IGZvciBkb2N1bWVudCBldmVudHMuCisgICAqCisgICAqIDxwPkJ5IGRlZmF1bHQsIGRvIG5vdGhpbmcuICBBcHBsaWNhdGlvbiB3cml0ZXJzIG1heSBvdmVycmlkZSB0aGlzCisgICAqIG1ldGhvZCBpbiBhIHN1YmNsYXNzIGlmIHRoZXkgd2lzaCB0byBzdG9yZSB0aGUgbG9jYXRvciBmb3IgdXNlCisgICAqIHdpdGggb3RoZXIgZG9jdW1lbnQgZXZlbnRzLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIGxvY2F0b3IgQSBsb2NhdG9yIGZvciBhbGwgU0FYIGRvY3VtZW50IGV2ZW50cy4KKyAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzZXREb2N1bWVudExvY2F0b3IKKyAgICogQHNlZSBvcmcueG1sLnNheC5Mb2NhdG9yCisgICAqLworICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKQorICB7CisgICAgbV9sb2NhdG9yID0gbG9jYXRvcjsKKyAgfQorCisgIC8qKgorICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudC4KKyAgICoKKyAgICogPHA+QnkgZGVmYXVsdCwgZG8gbm90aGluZy4gIEFwcGxpY2F0aW9uIHdyaXRlcnMgbWF5IG92ZXJyaWRlIHRoaXMKKyAgICogbWV0aG9kIGluIGEgc3ViY2xhc3MgdG8gdGFrZSBzcGVjaWZpYyBhY3Rpb25zIGF0IHRoZSBiZWdpbm5pbmcKKyAgICogb2YgYSBkb2N1bWVudCAoc3VjaCBhcyBhbGxvY2F0aW5nIHRoZSByb290IG5vZGUgb2YgYSB0cmVlIG9yCisgICAqIGNyZWF0aW5nIGFuIG91dHB1dCBmaWxlKS48L3A+CisgICAqCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQorICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgorICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RG9jdW1lbnQKKyAgICovCisgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKyAgICBtX2NvbnRleHRJbmRleGVzLnB1c2gobV9wcmVmaXhNYXBwaW5ncy5zaXplKCkpOyAgLy8gZm9yIHRoZSBuZXh0IGVsZW1lbnQuCisgIH0KKworICAvKioKKyAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuCisgICAqCisgICAqIDxwPkJ5IGRlZmF1bHQsIGRvIG5vdGhpbmcuICBBcHBsaWNhdGlvbiB3cml0ZXJzIG1heSBvdmVycmlkZSB0aGlzCisgICAqIG1ldGhvZCBpbiBhIHN1YmNsYXNzIHRvIHRha2Ugc3BlY2lmaWMgYWN0aW9ucyBhdCB0aGUgZW5kCisgICAqIG9mIGEgZG9jdW1lbnQgKHN1Y2ggYXMgZmluYWxpc2luZyBhIHRyZWUgb3IgY2xvc2luZyBhbiBvdXRwdXQKKyAgICogZmlsZSkuPC9wPgorICAgKgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKKyAgICogICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KKyAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNlbmREb2N1bWVudAorICAgKi8KKyAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGNoYXJhY3RlcnNGbHVzaCgpOworICAgIG1faW5mby5zZXRFbGVtZW50QXQoRFRNLk5VTEwsIE9GRlNFVF9ORVhUU0lCTElORyk7CisKKyAgICBpbnQgbGFzdE5vZGUgPSBtX3ByZXZpb3VzOworCisgICAgaWYgKERUTS5OVUxMICE9IG1fcHJldmlvdXMpCisgICAgeworICAgICAgaW50IHN0YXJ0SW5mbyA9IGxhc3ROb2RlICogTk9ERUlORk9CTE9DS1NJWkU7CisKKyAgICAgIG1faW5mby5zZXRFbGVtZW50QXQoRFRNLk5VTEwsIHN0YXJ0SW5mbyArIE9GRlNFVF9ORVhUU0lCTElORyk7CisgICAgfQorCisgICAgbV9wYXJlbnRzID0gbnVsbDsKKyAgICBtX3ByZWZpeE1hcHBpbmdzID0gbnVsbDsKKyAgICBtX2NvbnRleHRJbmRleGVzID0gbnVsbDsKKworICAgIG1fbGV2ZWwtLTsKKworICAgIG1fZW5kRG9jdW1lbnRPY2N1cmVkID0gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgc3RhcnQgb2YgYSBOYW1lc3BhY2UgbWFwcGluZy4KKyAgICoKKyAgICogPHA+QnkgZGVmYXVsdCwgZG8gbm90aGluZy4gIEFwcGxpY2F0aW9uIHdyaXRlcnMgbWF5IG92ZXJyaWRlIHRoaXMKKyAgICogbWV0aG9kIGluIGEgc3ViY2xhc3MgdG8gdGFrZSBzcGVjaWZpYyBhY3Rpb25zIGF0IHRoZSBzdGFydCBvZgorICAgKiBlYWNoIE5hbWVzcGFjZSBwcmVmaXggc2NvcGUgKHN1Y2ggYXMgc3RvcmluZyB0aGUgcHJlZml4IG1hcHBpbmcpLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIHByZWZpeCBUaGUgTmFtZXNwYWNlIHByZWZpeCBiZWluZyBkZWNsYXJlZC4KKyAgICogQHBhcmFtIHVyaSBUaGUgTmFtZXNwYWNlIFVSSSBtYXBwZWQgdG8gdGhlIHByZWZpeC4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5CisgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCisgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRQcmVmaXhNYXBwaW5nCisgICAqLworICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkKKyAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGlmIChERUJVRykKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3RhcnRQcmVmaXhNYXBwaW5nOiBwcmVmaXg6ICIgKyBwcmVmaXggKyAiLCB1cmk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICArIHVyaSk7CisKKyAgICBtX3ByZWZpeE1hcHBpbmdzLmFkZEVsZW1lbnQocHJlZml4KTsgIC8vIEpESyAxLjEueCBjb21wYXQgLXNjCisgICAgbV9wcmVmaXhNYXBwaW5ncy5hZGRFbGVtZW50KHVyaSk7ICAvLyBKREsgMS4xLnggY29tcGF0IC1zYworICB9CisKKyAgLyoqCisgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBlbmQgb2YgYSBOYW1lc3BhY2UgbWFwcGluZy4KKyAgICoKKyAgICogPHA+QnkgZGVmYXVsdCwgZG8gbm90aGluZy4gIEFwcGxpY2F0aW9uIHdyaXRlcnMgbWF5IG92ZXJyaWRlIHRoaXMKKyAgICogbWV0aG9kIGluIGEgc3ViY2xhc3MgdG8gdGFrZSBzcGVjaWZpYyBhY3Rpb25zIGF0IHRoZSBlbmQgb2YKKyAgICogZWFjaCBwcmVmaXggbWFwcGluZy48L3A+CisgICAqCisgICAqIEBwYXJhbSBwcmVmaXggVGhlIE5hbWVzcGFjZSBwcmVmaXggYmVpbmcgZGVjbGFyZWQuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQorICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgorICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZFByZWZpeE1hcHBpbmcKKyAgICovCisgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICBpZiAoREVCVUcpCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVuZFByZWZpeE1hcHBpbmc6IHByZWZpeDogIiArIHByZWZpeCk7CisKKyAgICBpbnQgc3RhcnQgPSBtX2NvbnRleHRJbmRleGVzLnBlZWsoKTsKKyAgICBpbnQgaW5kZXggPSBtX3ByZWZpeE1hcHBpbmdzLmluZGV4T2YocHJlZml4LCBzdGFydCk7CisKKyAgICBpZiAoaW5kZXggPiAtMSkKKyAgICB7CisgICAgICBtX3ByZWZpeE1hcHBpbmdzLnNldEVsZW1lbnRBdCgiJUAkI15AIyIsIGluZGV4KTsKKyAgICAgIG1fcHJlZml4TWFwcGluZ3Muc2V0RWxlbWVudEF0KCIlQCQjXkAjIiwgaW5kZXggKyAxKTsKKyAgICB9CisKKyAgICAvLyBubyBvcAorICB9CisKKyAgLyoqCisgICAqIENoZWNrIGlmIGEgZGVjbGFyYXRpb24gaGFzIGFscmVhZHkgYmVlbiBtYWRlIGZvciBhIGdpdmVuIHByZWZpeC4KKyAgICoKKyAgICogQHBhcmFtIHByZWZpeCBub24tbnVsbCBwcmVmaXggc3RyaW5nLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRlY2xhcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gZGVjbGFyZWQgaW4gdGhlCisgICAqICAgICAgICAgY3VycmVudCBjb250ZXh0LgorICAgKi8KKyAgcHJvdGVjdGVkIGJvb2xlYW4gZGVjbEFscmVhZHlEZWNsYXJlZChTdHJpbmcgcHJlZml4KQorICB7CisKKyAgICBpbnQgc3RhcnREZWNscyA9IG1fY29udGV4dEluZGV4ZXMucGVlaygpOworICAgIGphdmEudXRpbC5WZWN0b3IgcHJlZml4TWFwcGluZ3MgPSBtX3ByZWZpeE1hcHBpbmdzOworICAgIGludCBuRGVjbHMgPSBwcmVmaXhNYXBwaW5ncy5zaXplKCk7CisKKyAgICBmb3IgKGludCBpID0gc3RhcnREZWNsczsgaSA8IG5EZWNsczsgaSArPSAyKQorICAgIHsKKyAgICAgIFN0cmluZyBwcmVmaXhEZWNsID0gKFN0cmluZykgcHJlZml4TWFwcGluZ3MuZWxlbWVudEF0KGkpOworCisgICAgICBpZiAocHJlZml4RGVjbCA9PSBudWxsKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKHByZWZpeERlY2wuZXF1YWxzKHByZWZpeCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudC4KKyAgICoKKyAgICogPHA+QnkgZGVmYXVsdCwgZG8gbm90aGluZy4gIEFwcGxpY2F0aW9uIHdyaXRlcnMgbWF5IG92ZXJyaWRlIHRoaXMKKyAgICogbWV0aG9kIGluIGEgc3ViY2xhc3MgdG8gdGFrZSBzcGVjaWZpYyBhY3Rpb25zIGF0IHRoZSBzdGFydCBvZgorICAgKiBlYWNoIGVsZW1lbnQgKHN1Y2ggYXMgYWxsb2NhdGluZyBhIG5ldyB0cmVlIG5vZGUgb3Igd3JpdGluZworICAgKiBvdXRwdXQgdG8gYSBmaWxlKS48L3A+CisgICAqCisgICAqIEBwYXJhbSBuYW1lIFRoZSBlbGVtZW50IHR5cGUgbmFtZS4KKyAgICoKKyAgICogQHBhcmFtIHVyaSBUaGUgTmFtZXNwYWNlIFVSSSwgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGUKKyAgICogICAgICAgIGVsZW1lbnQgaGFzIG5vIE5hbWVzcGFjZSBVUkkgb3IgaWYgTmFtZXNwYWNlCisgICAqICAgICAgICBwcm9jZXNzaW5nIGlzIG5vdCBiZWluZyBwZXJmb3JtZWQuCisgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGxvY2FsIG5hbWUgKHdpdGhvdXQgcHJlZml4KSwgb3IgdGhlCisgICAqICAgICAgICBlbXB0eSBzdHJpbmcgaWYgTmFtZXNwYWNlIHByb2Nlc3NpbmcgaXMgbm90IGJlaW5nCisgICAqICAgICAgICBwZXJmb3JtZWQuCisgICAqIEBwYXJhbSBxTmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgKHdpdGggcHJlZml4KSwgb3IgdGhlCisgICAqICAgICAgICBlbXB0eSBzdHJpbmcgaWYgcXVhbGlmaWVkIG5hbWVzIGFyZSBub3QgYXZhaWxhYmxlLgorICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgc3BlY2lmaWVkIG9yIGRlZmF1bHRlZCBhdHRyaWJ1dGVzLgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKKyAgICogICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KKyAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydEVsZW1lbnQKKyAgICovCisgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCgKKyAgICAgICAgICBTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKKyAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgY2hhcmFjdGVyc0ZsdXNoKCk7CisKKyAgICBpbnQgZXhOYW1lID0gbV9lbnQuZ2V0RXhwYW5kZWROYW1lSUQodXJpLCBsb2NhbE5hbWUsIERUTS5FTEVNRU5UX05PREUpOworICAgIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXgocU5hbWUsIHVyaSk7CisgICAgaW50IHByZWZpeEluZGV4ID0gKG51bGwgIT0gcHJlZml4KQorICAgICAgICAgICAgICAgICAgICAgID8gbV92YWx1ZXNPclByZWZpeGVzLnN0cmluZ1RvSW5kZXgocU5hbWUpIDogMDsKKyAgICBpbnQgZWxlbU5vZGUgPSBhZGROb2RlKERUTS5FTEVNRU5UX05PREUsIGV4TmFtZSwgbV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50cy5wZWVrKCksIG1fcHJldmlvdXMsIHByZWZpeEluZGV4LCB0cnVlKTsKKworICAgIG1fbGV2ZWwrKzsKKworICAgIG1fcGFyZW50cy5wdXNoKGVsZW1Ob2RlKTsKKworICAgIGludCBzdGFydERlY2xzID0gbV9jb250ZXh0SW5kZXhlcy5wZWVrKCk7CisgICAgaW50IG5EZWNscyA9IG1fcHJlZml4TWFwcGluZ3Muc2l6ZSgpOworICAgIGludCBwcmV2ID0gRFRNLk5VTEw7CisKKyAgICBmb3IgKGludCBpID0gc3RhcnREZWNsczsgaSA8IG5EZWNsczsgaSArPSAyKQorICAgIHsKKyAgICAgIHByZWZpeCA9IChTdHJpbmcpIG1fcHJlZml4TWFwcGluZ3MuZWxlbWVudEF0KGkpOworCisgICAgICBpZiAocHJlZml4ID09IG51bGwpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBTdHJpbmcgZGVjbFVSTCA9IChTdHJpbmcpIG1fcHJlZml4TWFwcGluZ3MuZWxlbWVudEF0KGkgKyAxKTsKKworICAgICAgZXhOYW1lID0gbV9lbnQuZ2V0RXhwYW5kZWROYW1lSUQobnVsbCwgcHJlZml4LCBEVE0uTkFNRVNQQUNFX05PREUpOworCisgICAgICBpbnQgdmFsID0gbV92YWx1ZXNPclByZWZpeGVzLnN0cmluZ1RvSW5kZXgoZGVjbFVSTCk7CisKKyAgICAgIHByZXYgPSBhZGROb2RlKERUTS5OQU1FU1BBQ0VfTk9ERSwgZXhOYW1lLCBtX2xldmVsLCBlbGVtTm9kZSwgcHJldiwKKyAgICAgICAgICAgICAgICAgICAgIHZhbCwgZmFsc2UpOworICAgIH0KKworICAgIGludCBuID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgIFN0cmluZyBhdHRyVXJpID0gYXR0cmlidXRlcy5nZXRVUkkoaSk7CisgICAgICBTdHJpbmcgYXR0clFOYW1lID0gYXR0cmlidXRlcy5nZXRRTmFtZShpKTsKKyAgICAgIFN0cmluZyB2YWxTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOworCisgICAgICBwcmVmaXggPSBnZXRQcmVmaXgoYXR0clFOYW1lLCBhdHRyVXJpKTsKKworICAgICAgaW50IG5vZGVUeXBlOworCisgICAgICBpZiAoKG51bGwgIT0gYXR0clFOYW1lKQorICAgICAgICAgICAgICAmJiAoYXR0clFOYW1lLmVxdWFscygieG1sbnMiKQorICAgICAgICAgICAgICAgICAgfHwgYXR0clFOYW1lLnN0YXJ0c1dpdGgoInhtbG5zOiIpKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGRlY2xBbHJlYWR5RGVjbGFyZWQocHJlZml4KSkKKyAgICAgICAgICBjb250aW51ZTsgIC8vIGdvIHRvIHRoZSBuZXh0IGF0dHJpYnV0ZS4KKworICAgICAgICBub2RlVHlwZSA9IERUTS5OQU1FU1BBQ0VfTk9ERTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbm9kZVR5cGUgPSBEVE0uQVRUUklCVVRFX05PREU7CisKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0VHlwZShpKS5lcXVhbHNJZ25vcmVDYXNlKCJJRCIpKQorICAgICAgICAgIHNldElEQXR0cmlidXRlKHZhbFN0cmluZywgZWxlbU5vZGUpOworICAgICAgfQorCisgICAgICBpbnQgdmFsID0gbV92YWx1ZXNPclByZWZpeGVzLnN0cmluZ1RvSW5kZXgodmFsU3RyaW5nKTsKKyAgICAgIFN0cmluZyBhdHRyTG9jYWxOYW1lID0gYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSk7CisKKyAgICAgIGlmIChudWxsICE9IHByZWZpeCkKKyAgICAgIHsKKyAgICAgICAgcHJlZml4SW5kZXggPSBtX3ZhbHVlc09yUHJlZml4ZXMuc3RyaW5nVG9JbmRleChhdHRyUU5hbWUpOworCisgICAgICAgIGludCBkYXRhSW5kZXggPSBtX2RhdGEuc2l6ZSgpOworCisgICAgICAgIG1fZGF0YS5hZGRFbGVtZW50KHByZWZpeEluZGV4KTsKKyAgICAgICAgbV9kYXRhLmFkZEVsZW1lbnQodmFsKTsKKworICAgICAgICB2YWwgPSAtZGF0YUluZGV4OworICAgICAgfQorCisgICAgICBleE5hbWUgPSBtX2VudC5nZXRFeHBhbmRlZE5hbWVJRChhdHRyVXJpLCBhdHRyTG9jYWxOYW1lLCBub2RlVHlwZSk7CisgICAgICBwcmV2ID0gYWRkTm9kZShub2RlVHlwZSwgZXhOYW1lLCBtX2xldmVsLCBlbGVtTm9kZSwgcHJldiwgdmFsLCBmYWxzZSk7CisgICAgfQorCisgICAgaWYgKERUTS5OVUxMICE9IHByZXYpCisgICAgeworICAgICAgaW50IHN0YXJ0SW5mbyA9IHByZXYgKiBOT0RFSU5GT0JMT0NLU0laRTsKKworICAgICAgbV9pbmZvLnNldEVsZW1lbnRBdChEVE0uTlVMTCwgc3RhcnRJbmZvICsgT0ZGU0VUX05FWFRTSUJMSU5HKTsKKyAgICB9CisKKyAgICBpZiAobnVsbCAhPSBtX3dzZmlsdGVyKQorICAgIHsKKyAgICAgIHNob3J0IHdzdiA9IG1fd3NmaWx0ZXIuZ2V0U2hvdWxkU3RyaXBTcGFjZShlbGVtTm9kZSk7CisgICAgICBib29sZWFuIHNob3VsZFN0cmlwID0gKERUTVdTRmlsdGVyLklOSEVSSVQgPT0gd3N2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0U2hvdWxkU3RyaXBXaGl0ZXNwYWNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChEVE1XU0ZpbHRlci5TVFJJUCA9PSB3c3YpOworCisgICAgICBwdXNoU2hvdWxkU3RyaXBXaGl0ZXNwYWNlKHNob3VsZFN0cmlwKTsKKyAgICB9CisKKyAgICBtX3ByZXZpb3VzID0gRFRNLk5VTEw7CisKKyAgICBtX2NvbnRleHRJbmRleGVzLnB1c2gobV9wcmVmaXhNYXBwaW5ncy5zaXplKCkpOyAgLy8gZm9yIHRoZSBjaGlsZHJlbi4KKyAgfQorCisgIC8qKgorICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZW5kIG9mIGFuIGVsZW1lbnQuCisgICAqCisgICAqIDxwPkJ5IGRlZmF1bHQsIGRvIG5vdGhpbmcuICBBcHBsaWNhdGlvbiB3cml0ZXJzIG1heSBvdmVycmlkZSB0aGlzCisgICAqIG1ldGhvZCBpbiBhIHN1YmNsYXNzIHRvIHRha2Ugc3BlY2lmaWMgYWN0aW9ucyBhdCB0aGUgZW5kIG9mCisgICAqIGVhY2ggZWxlbWVudCAoc3VjaCBhcyBmaW5hbGlzaW5nIGEgdHJlZSBub2RlIG9yIHdyaXRpbmcKKyAgICogb3V0cHV0IHRvIGEgZmlsZSkuPC9wPgorICAgKgorICAgKiBAcGFyYW0gbmFtZSBUaGUgZWxlbWVudCB0eXBlIG5hbWUuCisgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIFRoZSBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkIGF0dHJpYnV0ZXMuCisgICAqCisgICAqIEBwYXJhbSB1cmkgVGhlIE5hbWVzcGFjZSBVUkksIG9yIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlCisgICAqICAgICAgICBlbGVtZW50IGhhcyBubyBOYW1lc3BhY2UgVVJJIG9yIGlmIE5hbWVzcGFjZQorICAgKiAgICAgICAgcHJvY2Vzc2luZyBpcyBub3QgYmVpbmcgcGVyZm9ybWVkLgorICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbCBuYW1lICh3aXRob3V0IHByZWZpeCksIG9yIHRoZQorICAgKiAgICAgICAgZW1wdHkgc3RyaW5nIGlmIE5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIG5vdCBiZWluZworICAgKiAgICAgICAgcGVyZm9ybWVkLgorICAgKiBAcGFyYW0gcU5hbWUgVGhlIHF1YWxpZmllZCBYTUwgMS4wIG5hbWUgKHdpdGggcHJlZml4KSwgb3IgdGhlCisgICAqICAgICAgICBlbXB0eSBzdHJpbmcgaWYgcXVhbGlmaWVkIG5hbWVzIGFyZSBub3QgYXZhaWxhYmxlLgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKKyAgICogICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KKyAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNlbmRFbGVtZW50CisgICAqLworICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkKKyAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIGNoYXJhY3RlcnNGbHVzaCgpOworCisgICAgLy8gSWYgbm8gb25lIG5vdGljZWQsIHN0YXJ0UHJlZml4TWFwcGluZyBpcyBhIGRyYWcuCisgICAgLy8gUG9wIHRoZSBjb250ZXh0IGZvciB0aGUgbGFzdCBjaGlsZCAodGhlIG9uZSBwdXNoZWQgYnkgc3RhcnRFbGVtZW50KQorICAgIG1fcHJlZml4TWFwcGluZ3Muc2V0U2l6ZShtX2NvbnRleHRJbmRleGVzLnBvcCgpKTsKKworICAgIC8vIERvIGl0IGFnYWluIGZvciB0aGlzIG9uZSAodGhlIG9uZSBwdXNoZWQgYnkgdGhlIGxhc3QgZW5kRWxlbWVudCkuCisgICAgbV9wcmVmaXhNYXBwaW5ncy5zZXRTaXplKG1fY29udGV4dEluZGV4ZXMucG9wKCkpOworICAgIG1fY29udGV4dEluZGV4ZXMucHVzaChtX3ByZWZpeE1hcHBpbmdzLnNpemUoKSk7ICAvLyBmb3IgdGhlIG5leHQgZWxlbWVudC4KKworICAgIG1fbGV2ZWwtLTsKKworICAgIGludCBsYXN0Tm9kZSA9IG1fcHJldmlvdXM7CisKKyAgICBtX3ByZXZpb3VzID0gbV9wYXJlbnRzLnBvcCgpOworCisgICAgaW50IHN0YXJ0SW5mbyA9IG1fcHJldmlvdXMgKiBOT0RFSU5GT0JMT0NLU0laRTsKKworICAgIGlmIChtX2luZm8uZWxlbWVudEF0KHN0YXJ0SW5mbyArIE9GRlNFVF9GSVJTVENISUxEKSA9PSBOT1RQUk9DRVNTRUQpCisgICAgeworICAgICAgbV9pbmZvLnNldEVsZW1lbnRBdChEVE0uTlVMTCwgc3RhcnRJbmZvICsgT0ZGU0VUX0ZJUlNUQ0hJTEQpOworICAgIH0KKyAgICBlbHNlIGlmIChEVE0uTlVMTCAhPSBsYXN0Tm9kZSkKKyAgICB7CisgICAgICBzdGFydEluZm8gPSBsYXN0Tm9kZSAqIE5PREVJTkZPQkxPQ0tTSVpFOworCisgICAgICBtX2luZm8uc2V0RWxlbWVudEF0KERUTS5OVUxMLCBzdGFydEluZm8gKyBPRkZTRVRfTkVYVFNJQkxJTkcpOworICAgIH0KKworICAgIHBvcFNob3VsZFN0cmlwV2hpdGVzcGFjZSgpOworICB9CisKKyAgLyoqCisgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGNoYXJhY3RlciBkYXRhIGluc2lkZSBhbiBlbGVtZW50LgorICAgKgorICAgKiA8cD5CeSBkZWZhdWx0LCBkbyBub3RoaW5nLiAgQXBwbGljYXRpb24gd3JpdGVycyBtYXkgb3ZlcnJpZGUgdGhpcworICAgKiBtZXRob2QgdG8gdGFrZSBzcGVjaWZpYyBhY3Rpb25zIGZvciBlYWNoIGNodW5rIG9mIGNoYXJhY3RlciBkYXRhCisgICAqIChzdWNoIGFzIGFkZGluZyB0aGUgZGF0YSB0byBhIG5vZGUgb3IgYnVmZmVyLCBvciBwcmludGluZyBpdCB0bworICAgKiBhIGZpbGUpLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIGNoIFRoZSBjaGFyYWN0ZXJzLgorICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkuCisgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZSBmcm9tIHRoZQorICAgKiAgICAgICAgICAgICAgIGNoYXJhY3RlciBhcnJheS4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5CisgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCisgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjY2hhcmFjdGVycworICAgKi8KKyAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICBpZiAobV90ZXh0UGVuZGluZ1N0YXJ0ID09IC0xKSAgLy8gRmlyc3Qgb25lIGluIHRoaXMgYmxvY2sKKyAgICB7CisgICAgICBtX3RleHRQZW5kaW5nU3RhcnQgPSBtX2NoYXJzLnNpemUoKTsKKyAgICAgIG1fY29hbGVzY2VkVGV4dFR5cGUgPSBtX3RleHRUeXBlOworICAgIH0KKworICAgIG1fY2hhcnMuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKKworICAgIC8vIFR5cGUgbG9naWM6IElmIGFsbCBhZGphY2VudCB0ZXh0IGlzIENEQVRBU2VjdGlvbnMsIHRoZQorICAgIC8vIGNvbmNhdGVudGF0ZWQgdGV4dCBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIENEQVRBU2VjdGlvbiAoc2VlCisgICAgLy8gaW5pdGlhbGl6YXRpb24gYWJvdmUpLiAgSWYgYW55IHdlcmUgb3JkaW5hcnkgVGV4dCwgdGhlIHdob2xlCisgICAgLy8gdGhpbmcgaXMgdHJlYXRlZCBhcyBUZXh0LiBUaGlzIG1heSBiZSB3b3J0aCAlUkVWSUVXJWluZy4KKyAgICBpZiAobV90ZXh0VHlwZSA9PSBEVE0uVEVYVF9OT0RFKQorICAgICAgbV9jb2FsZXNjZWRUZXh0VHlwZSA9IERUTS5URVhUX05PREU7CisgIH0KKworICAvKioKKyAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgaWdub3JhYmxlIHdoaXRlc3BhY2UgaW4gZWxlbWVudCBjb250ZW50LgorICAgKgorICAgKiA8cD5CeSBkZWZhdWx0LCBkbyBub3RoaW5nLiAgQXBwbGljYXRpb24gd3JpdGVycyBtYXkgb3ZlcnJpZGUgdGhpcworICAgKiBtZXRob2QgdG8gdGFrZSBzcGVjaWZpYyBhY3Rpb25zIGZvciBlYWNoIGNodW5rIG9mIGlnbm9yYWJsZQorICAgKiB3aGl0ZXNwYWNlIChzdWNoIGFzIGFkZGluZyBkYXRhIHRvIGEgbm9kZSBvciBidWZmZXIsIG9yIHByaW50aW5nCisgICAqIGl0IHRvIGEgZmlsZSkuPC9wPgorICAgKgorICAgKiBAcGFyYW0gY2ggVGhlIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KKyAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgY2hhcmFjdGVyIGFycmF5LgorICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UgZnJvbSB0aGUKKyAgICogICAgICAgICAgICAgICBjaGFyYWN0ZXIgYXJyYXkuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQorICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgorICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2lnbm9yYWJsZVdoaXRlc3BhY2UKKyAgICovCisgIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCisgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICAvLyAlT1BUJSBXZSBjYW4gcHJvYmFibHkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB3ZSBrbm93IHRoaXMgCisgICAgLy8gaXMgd2hpdGVzcGFjZS4KKyAgICBjaGFyYWN0ZXJzKGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCisgICAqCisgICAqIDxwPkJ5IGRlZmF1bHQsIGRvIG5vdGhpbmcuICBBcHBsaWNhdGlvbiB3cml0ZXJzIG1heSBvdmVycmlkZSB0aGlzCisgICAqIG1ldGhvZCBpbiBhIHN1YmNsYXNzIHRvIHRha2Ugc3BlY2lmaWMgYWN0aW9ucyBmb3IgZWFjaAorICAgKiBwcm9jZXNzaW5nIGluc3RydWN0aW9uLCBzdWNoIGFzIHNldHRpbmcgc3RhdHVzIHZhcmlhYmxlcyBvcgorICAgKiBpbnZva2luZyBvdGhlciBtZXRob2RzLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIHRhcmdldCBUaGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQuCisgICAqIEBwYXJhbSBkYXRhIFRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGRhdGEsIG9yIG51bGwgaWYKKyAgICogICAgICAgICAgICAgbm9uZSBpcyBzdXBwbGllZC4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5CisgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCisgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjcHJvY2Vzc2luZ0luc3RydWN0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpCisgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICBjaGFyYWN0ZXJzRmx1c2goKTsKKworICAgIGludCBleE5hbWUgPSBtX2VudC5nZXRFeHBhbmRlZE5hbWVJRChudWxsLCB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERUTS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpOworICAgIGludCBkYXRhSW5kZXggPSBtX3ZhbHVlc09yUHJlZml4ZXMuc3RyaW5nVG9JbmRleChkYXRhKTsKKworICAgIG1fcHJldmlvdXMgPSBhZGROb2RlKERUTS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUsIGV4TmFtZSwgbV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3BhcmVudHMucGVlaygpLCBtX3ByZXZpb3VzLCBkYXRhSW5kZXgsIGZhbHNlKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBhIHNraXBwZWQgZW50aXR5LgorICAgKgorICAgKiA8cD5CeSBkZWZhdWx0LCBkbyBub3RoaW5nLiAgQXBwbGljYXRpb24gd3JpdGVycyBtYXkgb3ZlcnJpZGUgdGhpcworICAgKiBtZXRob2QgaW4gYSBzdWJjbGFzcyB0byB0YWtlIHNwZWNpZmljIGFjdGlvbnMgZm9yIGVhY2gKKyAgICogcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgc3VjaCBhcyBzZXR0aW5nIHN0YXR1cyB2YXJpYWJsZXMgb3IKKyAgICogaW52b2tpbmcgb3RoZXIgbWV0aG9kcy48L3A+CisgICAqCisgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBza2lwcGVkIGVudGl0eS4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5CisgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCisgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjcHJvY2Vzc2luZ0luc3RydWN0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIC8vICVSRVZJRVclIFdoYXQgc2hvdWxkIGJlIGRvbmUgaGVyZT8KKyAgICAvLyBubyBvcAorICB9CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIEVycm9ySGFuZGxlciBpbnRlcmZhY2UuCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgLyoqCisgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGEgcGFyc2VyIHdhcm5pbmcuCisgICAqCisgICAqIDxwPlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gIEFwcGxpY2F0aW9uIHdyaXRlcnMKKyAgICogbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3MgdG8gdGFrZSBzcGVjaWZpYyBhY3Rpb25zCisgICAqIGZvciBlYWNoIHdhcm5pbmcsIHN1Y2ggYXMgaW5zZXJ0aW5nIHRoZSBtZXNzYWdlIGluIGEgbG9nIGZpbGUgb3IKKyAgICogcHJpbnRpbmcgaXQgdG8gdGhlIGNvbnNvbGUuPC9wPgorICAgKgorICAgKiBAcGFyYW0gZSBUaGUgd2FybmluZyBpbmZvcm1hdGlvbiBlbmNvZGVkIGFzIGFuIGV4Y2VwdGlvbi4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gQW55IFNBWCBleGNlcHRpb24sIHBvc3NpYmx5CisgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24uCisgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI3dhcm5pbmcKKyAgICogQHNlZSBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIC8vICVSRVZJRVclIElzIHRoZXJlIGFueXdheSB0byBnZXQgdGhlIEpBWFAgZXJyb3IgbGlzdGVuZXIgaGVyZT8KKyAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOworICB9CisKKyAgLyoqCisgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGEgcmVjb3ZlcmFibGUgcGFyc2VyIGVycm9yLgorICAgKgorICAgKiA8cD5UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuICBBcHBsaWNhdGlvbiB3cml0ZXJzCisgICAqIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBhIHN1YmNsYXNzIHRvIHRha2Ugc3BlY2lmaWMgYWN0aW9ucworICAgKiBmb3IgZWFjaCBlcnJvciwgc3VjaCBhcyBpbnNlcnRpbmcgdGhlIG1lc3NhZ2UgaW4gYSBsb2cgZmlsZSBvcgorICAgKiBwcmludGluZyBpdCB0byB0aGUgY29uc29sZS48L3A+CisgICAqCisgICAqIEBwYXJhbSBlIFRoZSB3YXJuaW5nIGluZm9ybWF0aW9uIGVuY29kZWQgYXMgYW4gZXhjZXB0aW9uLgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKKyAgICogICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KKyAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZworICAgKiBAc2VlIG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKyAgICB0aHJvdyBlOworICB9CisKKyAgLyoqCisgICAqIFJlcG9ydCBhIGZhdGFsIFhNTCBwYXJzaW5nIGVycm9yLgorICAgKgorICAgKiA8cD5UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0aHJvd3MgYSBTQVhQYXJzZUV4Y2VwdGlvbi4KKyAgICogQXBwbGljYXRpb24gd3JpdGVycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4gYSBzdWJjbGFzcyBpZgorICAgKiB0aGV5IG5lZWQgdG8gdGFrZSBzcGVjaWZpYyBhY3Rpb25zIGZvciBlYWNoIGZhdGFsIGVycm9yIChzdWNoIGFzCisgICAqIGNvbGxlY3RpbmcgYWxsIG9mIHRoZSBlcnJvcnMgaW50byBhIHNpbmdsZSByZXBvcnQpOiBpbiBhbnkgY2FzZSwKKyAgICogdGhlIGFwcGxpY2F0aW9uIG11c3Qgc3RvcCBhbGwgcmVndWxhciBwcm9jZXNzaW5nIHdoZW4gdGhpcworICAgKiBtZXRob2QgaXMgaW52b2tlZCwgc2luY2UgdGhlIGRvY3VtZW50IGlzIG5vIGxvbmdlciByZWxpYWJsZSwgYW5kCisgICAqIHRoZSBwYXJzZXIgbWF5IG5vIGxvbmdlciByZXBvcnQgcGFyc2luZyBldmVudHMuPC9wPgorICAgKgorICAgKiBAcGFyYW0gZSBUaGUgZXJyb3IgaW5mb3JtYXRpb24gZW5jb2RlZCBhcyBhbiBleGNlcHRpb24uCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQorICAgKiAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgorICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNmYXRhbEVycm9yCisgICAqIEBzZWUgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisgICAgdGhyb3cgZTsKKyAgfQorCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBEZWNsSGFuZGxlciBpbnRlcmZhY2UuCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgLyoqCisgICAqIFJlcG9ydCBhbiBlbGVtZW50IHR5cGUgZGVjbGFyYXRpb24uCisgICAqCisgICAqIDxwPlRoZSBjb250ZW50IG1vZGVsIHdpbGwgY29uc2lzdCBvZiB0aGUgc3RyaW5nICJFTVBUWSIsIHRoZQorICAgKiBzdHJpbmcgIkFOWSIsIG9yIGEgcGFyZW50aGVzaXNlZCBncm91cCwgb3B0aW9uYWxseSBmb2xsb3dlZAorICAgKiBieSBhbiBvY2N1cnJlbmNlIGluZGljYXRvci4gIFRoZSBtb2RlbCB3aWxsIGJlIG5vcm1hbGl6ZWQgc28KKyAgICogdGhhdCBhbGwgd2hpdGVzcGFjZSBpcyByZW1vdmVkLGFuZCB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZworICAgKiBwYXJlbnRoZXNlcy48L3A+CisgICAqCisgICAqIEBwYXJhbSBuYW1lIFRoZSBlbGVtZW50IHR5cGUgbmFtZS4KKyAgICogQHBhcmFtIG1vZGVsIFRoZSBjb250ZW50IG1vZGVsIGFzIGEgbm9ybWFsaXplZCBzdHJpbmcuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgKi8KKyAgcHVibGljIHZvaWQgZWxlbWVudERlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBtb2RlbCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICAvLyBubyBvcAorICB9CisKKyAgLyoqCisgICAqIFJlcG9ydCBhbiBhdHRyaWJ1dGUgdHlwZSBkZWNsYXJhdGlvbi4KKyAgICoKKyAgICogPHA+T25seSB0aGUgZWZmZWN0aXZlIChmaXJzdCkgZGVjbGFyYXRpb24gZm9yIGFuIGF0dHJpYnV0ZSB3aWxsCisgICAqIGJlIHJlcG9ydGVkLiAgVGhlIHR5cGUgd2lsbCBiZSBvbmUgb2YgdGhlIHN0cmluZ3MgIkNEQVRBIiwKKyAgICogIklEIiwgIklEUkVGIiwgIklEUkVGUyIsICJOTVRPS0VOIiwgIk5NVE9LRU5TIiwgIkVOVElUWSIsCisgICAqICJFTlRJVElFUyIsIG9yICJOT1RBVElPTiIsIG9yIGEgcGFyZW50aGVzaXplZCB0b2tlbiBncm91cCB3aXRoCisgICAqIHRoZSBzZXBhcmF0b3IgInwiIGFuZCBhbGwgd2hpdGVzcGFjZSByZW1vdmVkLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIGVsZW1lbnQuCisgICAqIEBwYXJhbSBhTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICAgKiBAcGFyYW0gdHlwZSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGF0dHJpYnV0ZSB0eXBlLgorICAgKiBAcGFyYW0gdmFsdWVEZWZhdWx0IEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlIGRlZmF1bHQKKyAgICogICAgICAgICgiI0lNUExJRUQiLCAiI1JFUVVJUkVEIiwgb3IgIiNGSVhFRCIpIG9yIG51bGwgaWYKKyAgICogICAgICAgIG5vbmUgb2YgdGhlc2UgYXBwbGllcy4KKyAgICogQHBhcmFtIHZhbHVlIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlJ3MgZGVmYXVsdCB2YWx1ZSwKKyAgICogICAgICAgIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24gVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCisgICAqLworICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVEZWNsKAorICAgICAgICAgIFN0cmluZyBlTmFtZSwgU3RyaW5nIGFOYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlRGVmYXVsdCwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICAvLyBubyBvcAorICB9CisKKyAgLyoqCisgICAqIFJlcG9ydCBhbiBpbnRlcm5hbCBlbnRpdHkgZGVjbGFyYXRpb24uCisgICAqCisgICAqIDxwPk9ubHkgdGhlIGVmZmVjdGl2ZSAoZmlyc3QpIGRlY2xhcmF0aW9uIGZvciBlYWNoIGVudGl0eQorICAgKiB3aWxsIGJlIHJlcG9ydGVkLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVudGl0eS4gIElmIGl0IGlzIGEgcGFyYW1ldGVyCisgICAqICAgICAgICBlbnRpdHksIHRoZSBuYW1lIHdpbGwgYmVnaW4gd2l0aCAnJScuCisgICAqIEBwYXJhbSB2YWx1ZSBUaGUgcmVwbGFjZW1lbnQgdGV4dCBvZiB0aGUgZW50aXR5LgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICogQHNlZSAjZXh0ZXJuYWxFbnRpdHlEZWNsCisgICAqIEBzZWUgb3JnLnhtbC5zYXguRFRESGFuZGxlciN1bnBhcnNlZEVudGl0eURlY2wKKyAgICovCisgIHB1YmxpYyB2b2lkIGludGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgLy8gbm8gb3AKKyAgfQorCisgIC8qKgorICAgKiBSZXBvcnQgYSBwYXJzZWQgZXh0ZXJuYWwgZW50aXR5IGRlY2xhcmF0aW9uLgorICAgKgorICAgKiA8cD5Pbmx5IHRoZSBlZmZlY3RpdmUgKGZpcnN0KSBkZWNsYXJhdGlvbiBmb3IgZWFjaCBlbnRpdHkKKyAgICogd2lsbCBiZSByZXBvcnRlZC48L3A+CisgICAqCisgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkuICBJZiBpdCBpcyBhIHBhcmFtZXRlcgorICAgKiAgICAgICAgZW50aXR5LCB0aGUgbmFtZSB3aWxsIGJlZ2luIHdpdGggJyUnLgorICAgKiBAcGFyYW0gcHVibGljSWQgVGhlIGRlY2xhcmVkIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBlbnRpdHksIG9yCisgICAqICAgICAgICBudWxsIGlmIG5vbmUgd2FzIGRlY2xhcmVkLgorICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIGRlY2xhcmVkIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBlbnRpdHkuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgKiBAc2VlICNpbnRlcm5hbEVudGl0eURlY2wKKyAgICogQHNlZSBvcmcueG1sLnNheC5EVERIYW5kbGVyI3VucGFyc2VkRW50aXR5RGVjbAorICAgKi8KKyAgcHVibGljIHZvaWQgZXh0ZXJuYWxFbnRpdHlEZWNsKAorICAgICAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICB7CisKKyAgICAvLyBubyBvcAorICB9CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIExleGljYWxIYW5kbGVyIGludGVyZmFjZS4KKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAvKioKKyAgICogUmVwb3J0IHRoZSBzdGFydCBvZiBEVEQgZGVjbGFyYXRpb25zLCBpZiBhbnkuCisgICAqCisgICAqIDxwPkFueSBkZWNsYXJhdGlvbnMgYXJlIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGludGVybmFsIHN1YnNldAorICAgKiB1bmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBieSBhIHtAbGluayAjc3RhcnRFbnRpdHkgc3RhcnRFbnRpdHl9CisgICAqIGV2ZW50LjwvcD4KKyAgICoKKyAgICogPHA+Tm90ZSB0aGF0IHRoZSBzdGFydC9lbmREVEQgZXZlbnRzIHdpbGwgYXBwZWFyIHdpdGhpbgorICAgKiB0aGUgc3RhcnQvZW5kRG9jdW1lbnQgZXZlbnRzIGZyb20gQ29udGVudEhhbmRsZXIgYW5kCisgICAqIGJlZm9yZSB0aGUgZmlyc3Qgc3RhcnRFbGVtZW50IGV2ZW50LjwvcD4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUgVGhlIGRvY3VtZW50IHR5cGUgbmFtZS4KKyAgICogQHBhcmFtIHB1YmxpY0lkIFRoZSBkZWNsYXJlZCBwdWJsaWMgaWRlbnRpZmllciBmb3IgdGhlCisgICAqICAgICAgICBleHRlcm5hbCBEVEQgc3Vic2V0LCBvciBudWxsIGlmIG5vbmUgd2FzIGRlY2xhcmVkLgorICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIGRlY2xhcmVkIHN5c3RlbSBpZGVudGlmaWVyIGZvciB0aGUKKyAgICogICAgICAgIGV4dGVybmFsIERURCBzdWJzZXQsIG9yIG51bGwgaWYgbm9uZSB3YXMgZGVjbGFyZWQuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4KKyAgICogICAgICAgICAgICBleGNlcHRpb24uCisgICAqIEBzZWUgI2VuZERURAorICAgKiBAc2VlICNzdGFydEVudGl0eQorICAgKi8KKyAgcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQorICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgLy8gbm8gb3AKKyAgfQorCisgIC8qKgorICAgKiBSZXBvcnQgdGhlIGVuZCBvZiBEVEQgZGVjbGFyYXRpb25zLgorICAgKgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICogQHNlZSAjc3RhcnREVEQKKyAgICovCisgIHB1YmxpYyB2b2lkIGVuZERURCgpIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgLy8gbm8gb3AKKyAgfQorCisgIC8qKgorICAgKiBSZXBvcnQgdGhlIGJlZ2lubmluZyBvZiBhbiBlbnRpdHkgaW4gY29udGVudC4KKyAgICoKKyAgICogPHA+PHN0cm9uZz5OT1RFOjwvZW50aXR5PiBlbnRpdHkgcmVmZXJlbmNlcyBpbiBhdHRyaWJ1dGUKKyAgICogdmFsdWVzIC0tIGFuZCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZG9jdW1lbnQgZW50aXR5IC0tCisgICAqIGFyZSBuZXZlciByZXBvcnRlZC48L3A+CisgICAqCisgICAqIDxwPlRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0IGFyZSByZXBvcnRlZAorICAgKiB1c2luZyB0aGUgcHNldWRvLW5hbWUgIltkdGRdIi4gIEFsbCBvdGhlciBldmVudHMgbXVzdCBiZQorICAgKiBwcm9wZXJseSBuZXN0ZWQgd2l0aGluIHN0YXJ0L2VuZCBlbnRpdHkgZXZlbnRzLjwvcD4KKyAgICoKKyAgICogPHA+Tm90ZSB0aGF0IHNraXBwZWQgZW50aXRpZXMgd2lsbCBiZSByZXBvcnRlZCB0aHJvdWdoIHRoZQorICAgKiB7QGxpbmsgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc2tpcHBlZEVudGl0eSBza2lwcGVkRW50aXR5fQorICAgKiBldmVudCwgd2hpY2ggaXMgcGFydCBvZiB0aGUgQ29udGVudEhhbmRsZXIgaW50ZXJmYWNlLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVudGl0eS4gIElmIGl0IGlzIGEgcGFyYW1ldGVyCisgICAqICAgICAgICBlbnRpdHksIHRoZSBuYW1lIHdpbGwgYmVnaW4gd2l0aCAnJScuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgKiBAc2VlICNlbmRFbnRpdHkKKyAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjaW50ZXJuYWxFbnRpdHlEZWNsCisgICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2V4dGVybmFsRW50aXR5RGVjbAorICAgKi8KKyAgcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgLy8gbm8gb3AKKyAgfQorCisgIC8qKgorICAgKiBSZXBvcnQgdGhlIGVuZCBvZiBhbiBlbnRpdHkuCisgICAqCisgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBlbmRpbmcuCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgKiBAc2VlICNzdGFydEVudGl0eQorICAgKi8KKyAgcHVibGljIHZvaWQgZW5kRW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKworICAgIC8vIG5vIG9wCisgIH0KKworICAvKioKKyAgICogUmVwb3J0IHRoZSBzdGFydCBvZiBhIENEQVRBIHNlY3Rpb24uCisgICAqCisgICAqIDxwPlRoZSBjb250ZW50cyBvZiB0aGUgQ0RBVEEgc2VjdGlvbiB3aWxsIGJlIHJlcG9ydGVkIHRocm91Z2gKKyAgICogdGhlIHJlZ3VsYXIge0BsaW5rIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2NoYXJhY3RlcnMKKyAgICogY2hhcmFjdGVyc30gZXZlbnQuPC9wPgorICAgKgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICogQHNlZSAjZW5kQ0RBVEEKKyAgICovCisgIHB1YmxpYyB2b2lkIHN0YXJ0Q0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgIHsKKyAgICBtX3RleHRUeXBlID0gRFRNLkNEQVRBX1NFQ1RJT05fTk9ERTsKKyAgfQorCisgIC8qKgorICAgKiBSZXBvcnQgdGhlIGVuZCBvZiBhIENEQVRBIHNlY3Rpb24uCisgICAqCisgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgKiBAc2VlICNzdGFydENEQVRBCisgICAqLworICBwdWJsaWMgdm9pZCBlbmRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworICAgIG1fdGV4dFR5cGUgPSBEVE0uVEVYVF9OT0RFOworICB9CisKKyAgLyoqCisgICAqIFJlcG9ydCBhbiBYTUwgY29tbWVudCBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQuCisgICAqCisgICAqIDxwPlRoaXMgY2FsbGJhY2sgd2lsbCBiZSB1c2VkIGZvciBjb21tZW50cyBpbnNpZGUgb3Igb3V0c2lkZSB0aGUKKyAgICogZG9jdW1lbnQgZWxlbWVudCwgaW5jbHVkaW5nIGNvbW1lbnRzIGluIHRoZSBleHRlcm5hbCBEVEQKKyAgICogc3Vic2V0IChpZiByZWFkKS48L3A+CisgICAqCisgICAqIEBwYXJhbSBjaCBBbiBhcnJheSBob2xkaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBjb21tZW50LgorICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBhcnJheS4KKyAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlIGZyb20gdGhlIGFycmF5LgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICovCisgIHB1YmxpYyB2b2lkIGNvbW1lbnQoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24KKyAgeworCisgICAgY2hhcmFjdGVyc0ZsdXNoKCk7CisKKyAgICBpbnQgZXhOYW1lID0gbV9lbnQuZ2V0RXhwYW5kZWROYW1lSUQoRFRNLkNPTU1FTlRfTk9ERSk7CisKKyAgICAvLyBGb3Igbm93LCB0cmVhdCBjb21tZW50cyBhcyBzdHJpbmdzLi4uICBJIGd1ZXNzIHdlIHNob3VsZCBkbyBhIAorICAgIC8vIHNlcGVyYXRlIEZTQiBidWZmZXIgaW5zdGVhZC4KKyAgICBpbnQgZGF0YUluZGV4ID0gbV92YWx1ZXNPclByZWZpeGVzLnN0cmluZ1RvSW5kZXgobmV3IFN0cmluZyhjaCwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKSk7CisKKyAgICBtX3ByZXZpb3VzID0gYWRkTm9kZShEVE0uQ09NTUVOVF9OT0RFLCBleE5hbWUsIG1fbGV2ZWwsIG1fcGFyZW50cy5wZWVrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9wcmV2aW91cywgZGF0YUluZGV4LCBmYWxzZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9ET01CdWlsZGVyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvRE9NQnVpbGRlci5qYXZhCmluZGV4IGRhZWMwZDcuLmUwZjc2NDUgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9ET01CdWlsZGVyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL0RPTUJ1aWxkZXIuamF2YQpAQCAtNTksNiArNTksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ucmVzLlhTTE1lc3NhZ2VzOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgucmVzLlhQQVRIRXJyb3JSZXNvdXJjZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuTm9kZVZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKIGltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CkBAIC04Nyw3ICs4OCw3IEBACiAgIHB1YmxpYyBEb2N1bWVudEZyYWdtZW50IG1fZG9jRnJhZyA9IG51bGw7CiAKICAgLyoqIFZlY3RvciBvZiBlbGVtZW50IG5vZGVzICAgICAgICAgICovCi0gIHByb3RlY3RlZCBOb2RlVmVjdG9yIG1fZWxlbVN0YWNrID0gbmV3IE5vZGVWZWN0b3IoKTsKKyAgcHJvdGVjdGVkIFN0YWNrIG1fZWxlbVN0YWNrID0gbmV3IFN0YWNrKCk7CiAKICAgLyoqCiAgICAqIERPTUJ1aWxkZXIgaW5zdGFuY2UgY29uc3RydWN0b3IuLi4gaXQgd2lsbCBhZGQgdGhlIERPTSBub2RlcwpAQCAtMzc1LDcgKzM3Niw4IEBACiAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5zLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZSkKICAgICAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCiAgIHsKLSAgICBtX2N1cnJlbnROb2RlID0gbV9lbGVtU3RhY2sucG9wQW5kVG9wKCk7CisgICAgbV9lbGVtU3RhY2sucG9wKCk7CisgICAgbV9jdXJyZW50Tm9kZSA9IG1fZWxlbVN0YWNrLmlzRW1wdHkoKSA/IG51bGwgOiAoTm9kZSltX2VsZW1TdGFjay5wZWVrKCk7CiAgIH0KIAogICAvKioKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9EVE0uamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9EVE0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxOGM3OS4uMDAwMDAwMAotLS0gYS9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvRFRNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzcgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54bWwudXRpbHM7Ci0KLS8qKgotICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImludGVybmFsIi8+Ci0gKiA8Y29kZT5EVE08L2NvZGU+IGlzIGFuIFhNTCBkb2N1bWVudCBtb2RlbCBleHByZXNzZWQgYXMgYSB0YWJsZSByYXRoZXIgdGhhbgotICogYW4gb2JqZWN0IHRyZWUuIEl0IGF0dGVtcHRzIHRvIHByb3ZpZGUgYW4gaW50ZXJmYWNlIHRvIGEgcGFyc2UgdHJlZSB0aGF0IAotICogaGFzIHZlcnkgbGl0dGxlIG9iamVjdCBjcmVhdGlvbi4KLSAqIAotICogPHA+Tm9kZXMgaW4gdGhlIERUTSBhcmUgaWRlbnRpZmllZCBieSBpbnRlZ2VyICJoYW5kbGVzIi4gIEEgaGFuZGxlIG11c3QgCi0gKiBiZSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQuICBBIHByb2Nlc3NpbmcgYXBwbGljYXRpb24gbXVzdCBiZSBjYXJlZnVsLCAKLSAqIGJlY2F1c2UgYSBoYW5kbGUgaXMgbm90IHVuaXF1ZSB3aXRoaW4gYSBwcm9jZXNzLi4uIHlvdSBjYW4gaGF2ZSB0d28gCi0gKiBoYW5kbGVzIHRoYXQgYmVsb25nIHRvIGRpZmZlcmVudCBkb2N1bWVudHMuICBJdCBpcyB1cCB0byB0aGUgY2FsbGluZyAKLSAqIGFwcGxpY2F0aW9uIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGFzc29jaWF0aW9uIG9mIGEgZG9jdW1lbnQgd2l0aCBpdCdzIAotICogaGFuZGxlLjwvcD4KLSAqIAotICogPHA+TmFtZXNwYWNlIFVSTHMsIGxvY2FsLW5hbWVzLCBhbmQgZXhwYW5kZWQtbmFtZXMgY2FuIGFsbCBiZSByZXByZXNlbnRlZCAKLSAqIGJ5IGludGVnZXIgSUQgdmFsdWVzLiAgQW4gZXhwYW5kZWQgbmFtZSBpcyBtYWRlIG9mIGEgY29tYmluYXRpb24gb2YgdGhlIFVSTCAKLSAqIElEIGluIHRoZSBoaWdoIHR3byBieXRlcywgYW5kIHRoZSBsb2NhbC1uYW1lIElEIGlzIGhlbGQgaW4gdGhlIGxvdyB0d28gCi0gKiBieXRlcy4gIFRodXMgYSBjb21wYXJpc29uIG9mIGFuIGV4cGFuZGVkIG5hbWUgY2FuIGJlIHF1aWNrbHkgbWFkZSBpbiBhIAotICogc2luZ2xlIG9wZXJhdGlvbi4gIEFsc28sIHRoZSBzeW1ib2wgc3BhY2UgZm9yIFVSTHMgYW5kIGxvY2FsLW5hbWVzIG11c3QgCi0gKiBiZSBsaW1pdGVkIHRvIDMySyBlYWNoIChpZiB5b3UgYXJlIHRvIG9ubHkgdXNlIHBvc2l0aXZlIHZhbHVlcyBmb3IgaW5kZXggCi0gKiBsb29rdXApLCB3aGljaCBtZWFucyB0aGF0IHRoZXNlIHNob3VsZCBub3QgYmUgcGFydCBvZiBhIGdlbmVyYWwgc3RyaW5nIAotICogcG9vbCBtZWNoYW5pc20uICBOb3RlIHRoYXQgdGhlIG5hbWVzcGFjZSBVUkwgaWQgY2FuIGJlIDAsIHdoaWNoIHNob3VsZCBoYXZlIAotICogdGhlIG1lYW5pbmcgdGhhdCB0aGUgbmFtZXNwYWNlIGlzIG51bGwuICBaZXJvIHNob3VsZCBhbHNvIG5vdCBiZSB1c2VkIGZvciAKLSAqIGEgbG9jYWwtbmFtZSBpbmRleC48L3A+Ci0gKiAKLSAqIDxwPlRoZSBtb2RlbCBvZiB0aGUgdHJlZSwgYXMgd2VsbCBhcyB0aGUgZ2VuZXJhbCBuYXZpZ2F0aW9uIG1vZGVsLCBpcyAKLSAqIHRoYXQgb2YgWFBhdGggMS4wLCBmb3IgdGhlIG1vbWVudC4gIFRoZSBtb2RlbCB3aWxsIGJlIGFkYXB0ZWQgdG8gbWF0Y2gKLSAqIHRoZSBYUGF0aCAyLjAgZGF0YSBtb2RlbCwgWE1MIFNjaGVtYSwgYW5kIEluZm9TZXQuPC9wPgotICogCi0gKiA8cD5EVE0gZG9lcyBfbm90XyBkaXJlY3RseSBzdXBwb3J0IHRoZSBXM0MncyBEb2N1bWVudCBPYmplY3QgTW9kZWwuIEhvd2V2ZXIsCi0gKiBpdCBhdHRlbXB0cyB0byBjb21lIGNsb3NlIGVub3VnaCB0aGF0IGFuIGltcGxlbWVudGF0aW9uIG9mIERUTSBjYW4gYmUgY3JlYXRlZCAKLSAqIHRoYXQgd3JhcHMgYSBET00uPC9wPgotICogPHA+U3RhdGU6IEluIHByb2dyZXNzISE8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRNCi17Ci0KLSAgLy8gVGhlc2UgYXJlIHRoZSBzYW1lIGFzIHRoZSBET00gb24gcHVycG9zZS4KLSAgLyoqCi0gICAqIFRoZSBub2RlIGlzIGFuIDxjb2RlPkVsZW1lbnQ8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBFTEVNRU5UX05PREUgICAgICAgICAgICAgID0gMTsKLSAgLyoqCi0gICAqIFRoZSBub2RlIGlzIGFuIDxjb2RlPkF0dHI8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBBVFRSSUJVVEVfTk9ERSAgICAgICAgICAgID0gMjsKLSAgLyoqCi0gICAqIFRoZSBub2RlIGlzIGEgPGNvZGU+VGV4dDwvY29kZT4gbm9kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgVEVYVF9OT0RFICAgICAgICAgICAgICAgICA9IDM7Ci0gIC8qKgotICAgKiBUaGUgbm9kZSBpcyBhIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENEQVRBX1NFQ1RJT05fTk9ERSAgICAgICAgPSA0OwotICAvKioKLSAgICogVGhlIG5vZGUgaXMgYW4gPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgRU5USVRZX1JFRkVSRU5DRV9OT0RFICAgICA9IDU7Ci0gIC8qKgotICAgKiBUaGUgbm9kZSBpcyBhbiA8Y29kZT5FbnRpdHk8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBFTlRJVFlfTk9ERSAgICAgICAgICAgICAgID0gNjsKLSAgLyoqCi0gICAqIFRoZSBub2RlIGlzIGEgPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFID0gNzsKLSAgLyoqCi0gICAqIFRoZSBub2RlIGlzIGEgPGNvZGU+Q29tbWVudDwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENPTU1FTlRfTk9ERSAgICAgICAgICAgICAgPSA4OwotICAvKioKLSAgICogVGhlIG5vZGUgaXMgYSA8Y29kZT5Eb2N1bWVudDwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IERPQ1VNRU5UX05PREUgICAgICAgICAgICAgPSA5OwotICAvKioKLSAgICogVGhlIG5vZGUgaXMgYSA8Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBET0NVTUVOVF9UWVBFX05PREUgICAgICAgID0gMTA7Ci0gIC8qKgotICAgKiBUaGUgbm9kZSBpcyBhIDxjb2RlPkRvY3VtZW50RnJhZ21lbnQ8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBET0NVTUVOVF9GUkFHTUVOVF9OT0RFICAgID0gMTE7Ci0gIC8qKgotICAgKiBUaGUgbm9kZSBpcyBhIDxjb2RlPk5vdGF0aW9uPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgTk9UQVRJT05fTk9ERSAgICAgICAgICAgICA9IDEyOwotCi0gIC8qKgotICAgKiBUaGUgbm9kZSBpcyBhIDxjb2RlPm5hbWVzcGFjZSBub2RlPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgTkFNRVNQQUNFX05PREUgICAgICAgICAgICAgPSAxMTM7Ci0gIAotICAvLyA9PT09PT09PT0gRFRNIEltcGxlbWVudGF0aW9uIENvbnRyb2wgRnVuY3Rpb25zLiA9PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBTZXQgYSBzdWdnZXN0ZWQgcGFyc2UgYmxvY2sgc2l6ZSBmb3IgdGhlIHBhcnNlci4KLSAgICoKLSAgICogQHBhcmFtIGJsb2NrU2l6ZVN1Z2dlc3Rpb24gU3VnZ2VzdGVkIHNpemUgb2YgdGhlIHBhcnNlIGJsb2NrcywgaW4gYnl0ZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJzZUJsb2NrU2l6ZShpbnQgYmxvY2tTaXplU3VnZ2VzdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNldCBhbiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZmVhdHVyZS4KLSAgICoKLSAgICogQHBhcmFtIGZlYXR1cmVJZCBBIGZlYXR1cmUgVVJMLgotICAgKiBAcGFyYW0gc3RhdGUgdHJ1ZSBpZiB0aGlzIGZlYXR1cmUgc2hvdWxkIGJlIG9uLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlSWQsIGJvb2xlYW4gc3RhdGUpOwotICAKLSAgLy8gPT09PT09PT09IERvY3VtZW50IE5hdmlnYXRpb24gRnVuY3Rpb25zID09PT09PT09PQotCi0gIC8qKgotICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBnZXQgdGhlIGhhbmRsZSBvZiB0aGUgbm9kZSdzIGZpcnN0IGNoaWxkLgotICAgKiBJZiBub3QgeWV0IHJlc29sdmVkLCB3YWl0cyBmb3IgbW9yZSBub2RlcyB0byBiZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgYW5kCi0gICAqIHRyaWVzIGFnYWluLgotICAgKiAKLSAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4uCi0gICAqIEByZXR1cm4gaW50IERUTSBub2RlLW51bWJlciBvZiBmaXJzdCBjaGlsZCwgb3IgLTEgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEZpcnN0Q2hpbGQoaW50IG5vZGVIYW5kbGUpOwotCi0gIC8qKgotICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBhZHZhbmNlIHRvIGl0cyBsYXN0IGNoaWxkLgotICAgKiBJZiBub3QgeWV0IHJlc29sdmVkLCB3YWl0cyBmb3IgbW9yZSBub2RlcyB0byBiZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgYW5kCi0gICAqIHRyaWVzIGFnYWluLgotICAgKiAKLSAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4uCi0gICAqIEByZXR1cm4gaW50IE5vZGUtbnVtYmVyIG9mIGxhc3QgY2hpbGQsCi0gICAqIG9yIC0xIHRvIGluZGljYXRlIG5vbmUgZXhpc3RzLgotICAgKi8KLSAgcHVibGljIGludCBnZXRMYXN0Q2hpbGQoaW50IG5vZGVIYW5kbGUpOwotCi0gIC8qKgotICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBnZXQgdGhlIGluZGV4IG9mIHRoZSBub2RlJ3MgZmlyc3QgYXR0cmlidXRlLgotICAgKiAKLSAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4uCi0gICAqIEByZXR1cm4gSGFuZGxlIG9mIGZpcnN0IGF0dHJpYnV0ZSwgb3IgLTEgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEZpcnN0QXR0cmlidXRlKGludCBub2RlSGFuZGxlKTsKLSAgCi0gIC8qKgotICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBnZXQgdGhlIGluZGV4IG9mIHRoZSBub2RlJ3MgZmlyc3QgY2hpbGQuCi0gICAqIElmIG5vdCB5ZXQgcmVzb2x2ZWQsIHdhaXRzIGZvciBtb3JlIG5vZGVzIHRvIGJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBhbmQKLSAgICogdHJpZXMgYWdhaW4KLSAgICogCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlIGhhbmRsZSB0byBub2RlLCB3aGljaCBzaG91bGQgcHJvYmFibHkgYmUgYW4gZWxlbWVudCAKLSAgICogICAgICAgICAgICAgICAgICAgbm9kZSwgYnV0IG5lZWQgbm90IGJlLgotICAgKiAgICAgICAgICAgICAgICAgICAKLSAgICogQHBhcmFtIGluU2NvcGUgICAgdHJ1ZSBpZiBhbGwgbmFtZXNwYWNlcyBpbiBzY29wZSBzaG91bGQgYmUgcmV0dXJuZWQsIAotICAgKiAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiBvbmx5IHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHNob3VsZCBiZSAKLSAgICogICAgICAgICAgICAgICAgICAgcmV0dXJuZWQuCi0gICAqIEByZXR1cm4gaGFuZGxlIG9mIGZpcnN0IG5hbWVzcGFjZSwgb3IgLTEgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEZpcnN0TmFtZXNwYWNlTm9kZShpbnQgbm9kZUhhbmRsZSwgYm9vbGVhbiBpblNjb3BlKTsKLQotICAvKioKLSAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgYWR2YW5jZSB0byBpdHMgbmV4dCBzaWJsaW5nLgotICAgKiBJZiBub3QgeWV0IHJlc29sdmVkLCB3YWl0cyBmb3IgbW9yZSBub2RlcyB0byBiZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgYW5kCi0gICAqIHRyaWVzIGFnYWluLgotICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBpbnQgSGFuZGxlIG9mIHRoZSBub2RlLi4KLSAgICogQHJldHVybiBpbnQgTm9kZS1udW1iZXIgb2YgbmV4dCBzaWJsaW5nLAotICAgKiBvciAtMSB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TmV4dFNpYmxpbmcoaW50IG5vZGVIYW5kbGUpOwotICAKLSAgLyoqCi0gICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIGZpbmQgaXRzIHByZWNlZWRpbmcgc2libGluZy4KLSAgICogV0FSTklORzogRFRNIGlzIGFzeW1tZXRyaWM7IHRoaXMgb3BlcmF0aW9uIGlzIHJlc29sdmVkIGJ5IHNlYXJjaCwgYW5kIGlzCi0gICAqIHJlbGF0aXZlbHkgZXhwZW5zaXZlLgotICAgKiBAcGFyYW0gcG9zdGl0aW9uIGludCBIYW5kbGUgb2YgdGhlIG5vZGUuLgotICAgKgotICAgKiBAcGFyYW0gbm9kZUhhbmRsZSB0aGUgaWQgb2YgdGhlIG5vZGUuCi0gICAqIEByZXR1cm4gaW50IE5vZGUtbnVtYmVyIG9mIHRoZSBwcmV2aW91cyBzaWIsCi0gICAqIG9yIC0xIHRvIGluZGljYXRlIG5vbmUgZXhpc3RzLgotICAgKi8KLSAgcHVibGljIGludCBnZXRQcmV2aW91c1NpYmxpbmcoaW50IG5vZGVIYW5kbGUpOwotCi0gIC8qKgotICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBhZHZhbmNlIHRvIHRoZSBuZXh0IGF0dHJpYnV0ZS4gSWYgYW4KLSAgICogZWxlbWVudCwgd2UgYWR2YW5jZSB0byBpdHMgZmlyc3QgYXR0cmlidXRlOyBpZiBhbiBhdHRyLCB3ZSBhZHZhbmNlIHRvCi0gICAqIHRoZSBuZXh0IGF0dHIgb24gdGhlIHNhbWUgbm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIG5vZGUuLgotICAgKiBAcmV0dXJuIGludCBEVE0gbm9kZS1udW1iZXIgb2YgdGhlIHJlc29sdmVkIGF0dHIsCi0gICAqIG9yIC0xIHRvIGluZGljYXRlIG5vbmUgZXhpc3RzLgotICAgKi8KLSAgcHVibGljIGludCBnZXROZXh0QXR0cmlidXRlKGludCBub2RlSGFuZGxlKTsKLQotICAvKioKLSAgICogR2l2ZW4gYSBuYW1lc3BhY2UgaGFuZGxlLCBhZHZhbmNlIHRvIHRoZSBuZXh0IG5hbWVzcGFjZS4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VIYW5kbGUgaGFuZGxlIHRvIG5vZGUgd2hpY2ggbXVzdCBiZSBvZiB0eXBlIE5BTUVTUEFDRV9OT0RFLgotICAgKiBAcmV0dXJuIGhhbmRsZSBvZiBuZXh0IG5hbWVzcGFjZSwgb3IgLTEgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldE5leHROYW1lc3BhY2VOb2RlKGludCBuYW1lc3BhY2VIYW5kbGUsIGJvb2xlYW4gaW5TY29wZSk7Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIGFkdmFuY2UgdG8gaXRzIG5leHQgZGVzY2VuZGFudC4KLSAgICogSWYgbm90IHlldCByZXNvbHZlZCwgd2FpdHMgZm9yIG1vcmUgbm9kZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGRvY3VtZW50IGFuZAotICAgKiB0cmllcyBhZ2Fpbi4KLSAgICoKLSAgICogQHBhcmFtIHN1YnRyZWVSb290Tm9kZUhhbmRsZQotICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBpbnQgSGFuZGxlIG9mIHRoZSBub2RlLi4KLSAgICogQHJldHVybiBoYW5kbGUgb2YgbmV4dCBkZXNjZW5kYW50LAotICAgKiBvciAtMSB0byBpbmRpY2F0ZSBub25lIGV4aXN0cy4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TmV4dERlc2NlbmRhbnQoaW50IHN1YnRyZWVSb290SGFuZGxlLCBpbnQgbm9kZUhhbmRsZSk7Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIGFkdmFuY2UgdG8gdGhlIG5leHQgbm9kZSBvbiB0aGUgZm9sbG93aW5nIGF4aXMuCi0gICAqCi0gICAqIEBwYXJhbSBheGlzQ29udGV4dEhhbmRsZSB0aGUgc3RhcnQgb2YgdGhlIGF4aXMgdGhhdCBpcyBiZWluZyB0cmF2ZXJzZWQuCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlCi0gICAqIEByZXR1cm4gaGFuZGxlIG9mIG5leHQgc2libGluZywKLSAgICogb3IgLTEgdG8gaW5kaWNhdGUgbm9uZSBleGlzdHMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldE5leHRGb2xsb3dpbmcoaW50IGF4aXNDb250ZXh0SGFuZGxlLCBpbnQgbm9kZUhhbmRsZSk7Ci0gIAotICAvKioKLSAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgYWR2YW5jZSB0byB0aGUgbmV4dCBub2RlIG9uIHRoZSBwcmVjZWRpbmcgYXhpcy4KLSAgICogCi0gICAqIEBwYXJhbSBheGlzQ29udGV4dEhhbmRsZSB0aGUgc3RhcnQgb2YgdGhlIGF4aXMgdGhhdCBpcyBiZWluZyB0cmF2ZXJzZWQuCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KLSAgICogQHJldHVybiBpbnQgTm9kZS1udW1iZXIgb2YgcHJlY2VkaW5nIHNpYmxpbmcsCi0gICAqIG9yIC0xIHRvIGluZGljYXRlIG5vbmUgZXhpc3RzLgotICAgKi8KLSAgcHVibGljIGludCBnZXROZXh0UHJlY2VkaW5nKGludCBheGlzQ29udGV4dEhhbmRsZSwgaW50IG5vZGVIYW5kbGUpOwotCi0gIC8qKgotICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCBmaW5kIGl0cyBwYXJlbnQgbm9kZS4KLSAgICogQHBhcmFtIHBvc3RpdGlvbiBpbnQgSGFuZGxlIG9mIHRoZSBub2RlLi4KLSAgICoKLSAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgotICAgKiBAcmV0dXJuIGludCBOb2RlLW51bWJlciBvZiBwYXJlbnQsCi0gICAqIG9yIC0xIHRvIGluZGljYXRlIG5vbmUgZXhpc3RzLgotICAgKi8KLSAgcHVibGljIGludCBnZXRQYXJlbnQoaW50IG5vZGVIYW5kbGUpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIHN0cmluZy12YWx1ZSBvZiBhIG5vZGUgYXMgYSBTdHJpbmcgb2JqZWN0Ci0gICAqIChzZWUgaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjZGF0YS1tb2RlbCAKLSAgICogZm9yIHRoZSBkZWZpbml0aW9uIG9mIGEgbm9kZSdzIHN0cmluZy12YWx1ZSkuCi0gICAqCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIElELgotICAgKgotICAgKiBAcmV0dXJuIEEgc3RyaW5nIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHN0cmluZy12YWx1ZSBvZiB0aGUgZ2l2ZW4gbm9kZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoaW50IG5vZGVIYW5kbGUpOwotICAKLSAgLyoqCi0gICAqIEdldCBudW1iZXIgb2YgY2hhcmFjdGVyIGFycmF5IGNodW5rcyBpbiAKLSAgICogdGhlIHN0cmluZy12YWx1ZSBvZiBhIG5vZGUuCi0gICAqIChzZWUgaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjZGF0YS1tb2RlbCAKLSAgICogZm9yIHRoZSBkZWZpbml0aW9uIG9mIGEgbm9kZSdzIHN0cmluZy12YWx1ZSkuCi0gICAqIE5vdGUgdGhhdCBhIHNpbmdsZSB0ZXh0IG5vZGUgbWF5IGhhdmUgbXVsdGlwbGUgdGV4dCBjaHVua3MuCi0gICAqCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIElELgotICAgKgotICAgKiBAcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXIgYXJyYXkgY2h1bmtzIGluIAotICAgKiAgICAgICAgIHRoZSBzdHJpbmctdmFsdWUgb2YgYSBub2RlLgotICAgKi8KLSAgcHVibGljIGludCBnZXRTdHJpbmdWYWx1ZUNodW5rQ291bnQoaW50IG5vZGVIYW5kbGUpOwotICAKLSAgLyoqCi0gICAqIEdldCBhIGNoYXJhY3RlciBhcnJheSBjaHVuayBpbiB0aGUgc3RyaW5nLXZhbHVlIG9mIGEgbm9kZS4KLSAgICogKHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aCNkYXRhLW1vZGVsIAotICAgKiBmb3IgdGhlIGRlZmluaXRpb24gb2YgYSBub2RlJ3Mgc3RyaW5nLXZhbHVlKS4KLSAgICogTm90ZSB0aGF0IGEgc2luZ2xlIHRleHQgbm9kZSBtYXkgaGF2ZSBtdWx0aXBsZSB0ZXh0IGNodW5rcy4KLSAgICoKLSAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIG5vZGUgSUQuCi0gICAqIEBwYXJhbSBjaHVua0luZGV4IFdoaWNoIGNodW5rIHRvIGdldC4KLSAgICogQHBhcmFtIHN0YXJ0QW5kTGVuIEFuIGFycmF5IG9mIDIgd2hlcmUgdGhlIHN0YXJ0IHBvc2l0aW9uIGFuZCBsZW5ndGggb2YgCi0gICAqICAgICAgICAgICAgICAgICAgICB0aGUgY2h1bmsgd2lsbCBiZSByZXR1cm5lZC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY2hhcmFjdGVyIGFycmF5IHJlZmVyZW5jZSB3aGVyZSB0aGUgY2h1bmsgb2NjdXJzLgotICAgKi8KLSAgcHVibGljIGNoYXJbXSBnZXRTdHJpbmdWYWx1ZUNodW5rKGludCBub2RlSGFuZGxlLCBpbnQgY2h1bmtJbmRleCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBzdGFydEFuZExlbik7Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiBhbiBJRCB0aGF0IHJlcHJlc2VudHMgdGhlIG5vZGUncyBleHBhbmRlZCBuYW1lLgotICAgKiAKLSAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIGhhbmRsZSB0byB0aGUgbm9kZSBpbiBxdWVzdGlvbi4KLSAgICoKLSAgICogQHJldHVybiB0aGUgZXhwYW5kZWQtbmFtZSBpZCBvZiB0aGUgbm9kZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RXhwYW5kZWROYW1lSUQoaW50IG5vZGVIYW5kbGUpOwotICAKLSAgLyoqCi0gICAqIEdpdmVuIGFuIGV4cGFuZGVkIG5hbWUsIHJldHVybiBhbiBJRC4gIElmIHRoZSBleHBhbmRlZC1uYW1lIGRvZXMgbm90IAotICAgKiBleGlzdCBpbiB0aGUgaW50ZXJuYWwgdGFibGVzLCB0aGUgZW50cnkgd2lsbCBiZSBjcmVhdGVkLCBhbmQgdGhlIElEIHdpbGwgCi0gICAqIGJlIHJldHVybmVkLiAgQW55IGFkZGl0aW9uYWwgbm9kZXMgdGhhdCBhcmUgY3JlYXRlZCB0aGF0IGhhdmUgdGhpcyAKLSAgICogZXhwYW5kZWQgbmFtZSB3aWxsIHVzZSB0aGlzIElELgotICAgKiAKLSAgICogQHBhcmFtIG5vZGVIYW5kbGUgVGhlIGhhbmRsZSB0byB0aGUgbm9kZSBpbiBxdWVzdGlvbi4KLSAgICoKLSAgICogQHJldHVybiB0aGUgZXhwYW5kZWQtbmFtZSBpZCBvZiB0aGUgbm9kZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RXhwYW5kZWROYW1lSUQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSk7Ci0gIAotICAvKioKLSAgICogR2l2ZW4gYW4gZXhwYW5kZWQtbmFtZSBJRCwgcmV0dXJuIHRoZSBsb2NhbCBuYW1lIHBhcnQuCi0gICAqCi0gICAqIEBwYXJhbSBFeHBhbmRlZE5hbWVJRCBhbiBJRCB0aGF0IHJlcHJlc2VudHMgYW4gZXhwYW5kZWQtbmFtZS4KLSAgICogQHJldHVybiBTdHJpbmcgTG9jYWwgbmFtZSBvZiB0aGlzIG5vZGUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZUZyb21FeHBhbmRlZE5hbWVJRChpbnQgRXhwYW5kZWROYW1lSUQpOwotICAKLSAgLyoqCi0gICAqIEdpdmVuIGFuIGV4cGFuZGVkLW5hbWUgSUQsIHJldHVybiB0aGUgbmFtZXNwYWNlIFVSSSBwYXJ0LgotICAgKgotICAgKiBAcGFyYW0gRXhwYW5kZWROYW1lSUQgYW4gSUQgdGhhdCByZXByZXNlbnRzIGFuIGV4cGFuZGVkLW5hbWUuCi0gICAqIEByZXR1cm4gU3RyaW5nIFVSSSB2YWx1ZSBvZiB0aGlzIG5vZGUncyBuYW1lc3BhY2UsIG9yIG51bGwgaWYgbm8KLSAgICogbmFtZXNwYWNlIHdhcyByZXNvbHZlZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRnJvbUV4cGFuZGVkTmFtZUlEKGludCBFeHBhbmRlZE5hbWVJRCk7Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiBpdHMgRE9NLXN0eWxlIG5vZGUgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgotICAgKiBAcmV0dXJuIFN0cmluZyBOYW1lIG9mIHRoaXMgbm9kZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoaW50IG5vZGVIYW5kbGUpOwotCi0gIC8qKgotICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gaXRzIERPTS1zdHlsZSBsb2NhbG5hbWUuCi0gICAqIChBcyBkZWZpbmVkIGluIE5hbWVzcGFjZXMsIHRoaXMgaXMgdGhlIHBvcnRpb24gb2YgdGhlIG5hbWUgYWZ0ZXIgYW55Ci0gICAqIGNvbG9uIGNoYXJhY3RlcikKLSAgICoKLSAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgotICAgKiBAcmV0dXJuIFN0cmluZyBMb2NhbCBuYW1lIG9mIHRoaXMgbm9kZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKGludCBub2RlSGFuZGxlKTsKLQotICAvKioKLSAgICogR2l2ZW4gYSBub2RlIGhhbmRsZSwgcmV0dXJuIGl0cyBET00tc3R5bGUgbmFtZSBwcmVmaXguCi0gICAqIChBcyBkZWZpbmVkIGluIE5hbWVzcGFjZXMsIHRoaXMgaXMgdGhlIHBvcnRpb24gb2YgdGhlIG5hbWUgYmVmb3JlIGFueQotICAgKiBjb2xvbiBjaGFyYWN0ZXIpCi0gICAqIEBwYXJhbSBwb3N0aXRpb24gaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4uCi0gICAqCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBpZCBvZiB0aGUgbm9kZS4KLSAgICogQHJldHVybiBTdHJpbmcgcHJlZml4IG9mIHRoaXMgbm9kZSdzIG5hbWUsIG9yIG51bGwgaWYgbm8gZXhwbGljaXQKLSAgICogbmFtZXNwYWNlIHByZWZpeCB3YXMgZ2l2ZW4uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChpbnQgbm9kZUhhbmRsZSk7Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiBpdHMgRE9NLXN0eWxlIG5hbWVzcGFjZSBVUkkKLSAgICogKEFzIGRlZmluZWQgaW4gTmFtZXNwYWNlcywgdGhpcyBpcyB0aGUgZGVjbGFyZWQgVVJJIHdoaWNoIHRoaXMgbm9kZSdzCi0gICAqIHByZWZpeCAtLSBvciBkZWZhdWx0IGluIGxpZXUgdGhlcmVvZiAtLSB3YXMgbWFwcGVkIHRvLikKLSAgICogQHBhcmFtIHBvc3RpdGlvbiBpbnQgSGFuZGxlIG9mIHRoZSBub2RlLi4KLSAgICoKLSAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIGlkIG9mIHRoZSBub2RlLgotICAgKiBAcmV0dXJuIFN0cmluZyBVUkkgdmFsdWUgb2YgdGhpcyBub2RlJ3MgbmFtZXNwYWNlLCBvciBudWxsIGlmIG5vCi0gICAqIG5hbWVzcGFjZSB3YXMgcmVzb2x2ZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgbm9kZUhhbmRsZSk7Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgbm9kZSBoYW5kbGUsIHJldHVybiBpdHMgbm9kZSB2YWx1ZS4gVGhpcyBpcyBtb3N0bHkKLSAgICogYXMgZGVmaW5lZCBieSB0aGUgRE9NLCBidXQgbWF5IGlnbm9yZSBzb21lIGNvbnZlbmllbmNlcy4KLSAgICogPHA+Ci0gICAqIEBwYXJhbSBwb3N0aXRpb24gaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4uCi0gICAqCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLgotICAgKiBAcmV0dXJuIFN0cmluZyBWYWx1ZSBvZiB0aGlzIG5vZGUsIG9yIG51bGwgaWYgbm90Ci0gICAqIG1lYW5pbmdmdWwgZm9yIHRoaXMgbm9kZSB0eXBlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoaW50IG5vZGVIYW5kbGUpOwotCi0gIC8qKgotICAgKiBHaXZlbiBhIG5vZGUgaGFuZGxlLCByZXR1cm4gaXRzIERPTS1zdHlsZSBub2RlIHR5cGUuCi0gICAqIEBwYXJhbSBwb3N0aXRpb24gaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4uCi0gICAqCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLgotICAgKiBAcmV0dXJuIGludCBOb2RlIHR5cGUsIGFzIHBlciB0aGUgRE9NJ3MgTm9kZS5fTk9ERSBjb25zdGFudHMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKGludCBub2RlSGFuZGxlKTsKLSAgCi0gIC8qKgotICAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KLSAgICogR2V0IHRoZSBkZXB0aCBsZXZlbCBvZiB0aGlzIG5vZGUgaW4gdGhlIHRyZWUgKGVxdWFscyAxIGZvcgotICAgKiBhIHBhcmVudGxlc3Mgbm9kZSkuCi0gICAqCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLgotICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYW5jZXN0b3JzLCBwbHVzIG9uZQotICAgKi8KLSAgcHVibGljIHNob3J0IGdldExldmVsKGludCBub2RlSGFuZGxlKTsKLSAgCi0gIC8vID09PT09PT09PT09PT09IERvY3VtZW50IHF1ZXJ5IGZ1bmN0aW9ucyA9PT09PT09PT09PT09PSAKLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGJhc2UgVVJJIG9mIHRoZSBkb2N1bWVudCBlbnRpdHkuIElmIGl0IGlzIG5vdCBrbm93bgotICAgKiAoYmVjYXVzZSB0aGUgZG9jdW1lbnQgd2FzIHBhcnNlZCBmcm9tIGEgc29ja2V0IGNvbm5lY3Rpb24gb3IgZnJvbQotICAgKiBzdGFuZGFyZCBpbnB1dCwgZm9yIGV4YW1wbGUpLCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcyB1bmtub3duLgotICAgKgotICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBpZCwgd2hpY2ggY2FuIGJlIGFueSB2YWxpZCBub2RlIGhhbmRsZS4KLSAgICogQHJldHVybiB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgU3RyaW5nIG9iamVjdCBvciBudWxsIGlmIHVua25vd24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50QmFzZVVSSShpbnQgbm9kZUhhbmRsZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IGVudGl0eS4gSWYKLSAgICogaXQgaXMgbm90IGtub3duLCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcyB1bmtub3duLgotICAgKgotICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBpZCwgd2hpY2ggY2FuIGJlIGFueSB2YWxpZCBub2RlIGhhbmRsZS4KLSAgICogQHJldHVybiB0aGUgc3lzdGVtIGlkZW50aWZpZXIgU3RyaW5nIG9iamVjdCBvciBudWxsIGlmIHVua25vd24uCi0gICAqLwotICBwdWJsaWMgaW50IGdldERvY3VtZW50U3lzdGVtSWRlbnRpZmllcihpbnQgbm9kZUhhbmRsZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHNjaGVtZQotICAgKiAgICAgICAgaW4gd2hpY2ggdGhlIGRvY3VtZW50IGVudGl0eSBpcyBleHByZXNzZWQuCi0gICAqCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlIFRoZSBub2RlIGlkLCB3aGljaCBjYW4gYmUgYW55IHZhbGlkIG5vZGUgaGFuZGxlLgotICAgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBlbmNvZGluZyBTdHJpbmcgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudEVuY29kaW5nKGludCBub2RlSGFuZGxlKTsKLQotICAvKioKLSAgICogUmV0dXJuIGFuIGluZGljYXRpb24gb2YgdGhlIHN0YW5kYWxvbmUgc3RhdHVzIG9mIHRoZSBkb2N1bWVudCwKLSAgICogICAgICAgIGVpdGhlciAieWVzIiBvciAibm8iLiBUaGlzIHByb3BlcnR5IGlzIGRlcml2ZWQgZnJvbSB0aGUgb3B0aW9uYWwKLSAgICogICAgICAgIHN0YW5kYWxvbmUgZG9jdW1lbnQgZGVjbGFyYXRpb24gaW4gdGhlIFhNTCBkZWNsYXJhdGlvbiBhdCB0aGUKLSAgICogICAgICAgIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQgZW50aXR5LCBhbmQgaGFzIG5vIHZhbHVlIGlmIHRoZXJlIGlzIG5vCi0gICAqICAgICAgICBzdGFuZGFsb25lIGRvY3VtZW50IGRlY2xhcmF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBpZCwgd2hpY2ggY2FuIGJlIGFueSB2YWxpZCBub2RlIGhhbmRsZS4KLSAgICogQHJldHVybiB0aGUgZG9jdW1lbnQgc3RhbmRhbG9uZSBTdHJpbmcgb2JqZWN0LCBlaXRoZXIgInllcyIsICJubyIsIG9yIG51bGwuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50U3RhbmRhbG9uZShpbnQgbm9kZUhhbmRsZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFhNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudC4gVGhpcwotICAgKiBwcm9wZXJ0eSBpcyBkZXJpdmVkIGZyb20gdGhlIFhNTCBkZWNsYXJhdGlvbiBvcHRpb25hbGx5IHByZXNlbnQgYXQgdGhlCi0gICAqIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQgZW50aXR5LCBhbmQgaGFzIG5vIHZhbHVlIGlmIHRoZXJlIGlzIG5vIFhNTAotICAgKiBkZWNsYXJhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHRoZSBkb2N1bWVudCBoYW5kbGUKLSAgICoKLSAgICogQHJldHVybiB0aGUgZG9jdW1lbnQgdmVyc2lvbiBTdHJpbmcgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50VmVyc2lvbihpbnQgZG9jdW1lbnRIYW5kbGUpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYW4gaW5kaWNhdGlvbiBvZgotICAgKiB3aGV0aGVyIHRoZSBwcm9jZXNzb3IgaGFzIHJlYWQgdGhlIGNvbXBsZXRlIERURC4gSXRzIHZhbHVlIGlzIGEKLSAgICogYm9vbGVhbi4gSWYgaXQgaXMgZmFsc2UsIHRoZW4gY2VydGFpbiBwcm9wZXJ0aWVzIChpbmRpY2F0ZWQgaW4gdGhlaXIKLSAgICogZGVzY3JpcHRpb25zIGJlbG93KSBtYXkgYmUgdW5rbm93bi4gSWYgaXQgaXMgdHJ1ZSwgdGhvc2UgcHJvcGVydGllcwotICAgKiBhcmUgbmV2ZXIgdW5rbm93bi4KLSAgICoKLSAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgZGVjbGFyYXRpb25zIHdlcmUgcHJvY2Vzc2VkOwotICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXREb2N1bWVudEFsbERlY2xhcmF0aW9uc1Byb2Nlc3NlZCgpOwotCi0gIC8qKgotICAgKiAgIEEgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbiBpbmZvcm1hdGlvbiBpdGVtIGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0gICAqCi0gICAqICAgICAxLiBbc3lzdGVtIGlkZW50aWZpZXJdIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgZXh0ZXJuYWwgc3Vic2V0LCBpZgotICAgKiAgICAgICAgaXQgZXhpc3RzLiBPdGhlcndpc2UgdGhpcyBwcm9wZXJ0eSBoYXMgbm8gdmFsdWUuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHN5c3RlbSBpZGVudGlmaWVyIFN0cmluZyBvYmplY3QsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlRGVjbGFyYXRpb25TeXN0ZW1JZGVudGlmaWVyKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVybmFsIHN1YnNldCwKLSAgICogbm9ybWFsaXplZCBhcyBkZXNjcmliZWQgaW4gNC4yLjIgRXh0ZXJuYWwgRW50aXRpZXMgW1hNTF0uIElmIHRoZXJlIGlzCi0gICAqIG5vIGV4dGVybmFsIHN1YnNldCBvciBpZiBpdCBoYXMgbm8gcHVibGljIGlkZW50aWZpZXIsIHRoaXMgcHJvcGVydHkKLSAgICogaGFzIG5vIHZhbHVlLgotICAgKgotICAgKiBAcGFyYW0gdGhlIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24gaGFuZGxlCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHB1YmxpYyBpZGVudGlmaWVyIFN0cmluZyBvYmplY3QsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RG9jdW1lbnRUeXBlRGVjbGFyYXRpb25QdWJsaWNJZGVudGlmaWVyKCk7Ci0KLSAgLy8gPT09PT09PT09PT09PT0gQm9vbGVhbiBtZXRob2RzID09PT09PT09PT09PT09PT0KLSAgCi0gIC8qKgotICAgKiBGaWd1cmUgb3V0IHdoZXRoZXIgbm9kZUhhbmRsZTIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgYmVpbmcgbGF0ZXIKLSAgICogaW4gdGhlIGRvY3VtZW50IHRoYW4gbm9kZUhhbmRsZTEsIGluIERvY3VtZW50IE9yZGVyIGFzIGRlZmluZWQKLSAgICogYnkgdGhlIFhQYXRoIG1vZGVsLiBUaGlzIG1heSBub3QgYWdyZWUgd2l0aCB0aGUgb3JkZXJpbmcgZGVmaW5lZAotICAgKiBieSBvdGhlciBYTUwgYXBwbGljYXRpb25zLgotICAgKiA8cD4KLSAgICogVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUgb3JkZXJpbmcgaXNuJ3QgZGVmaW5lZCwgYW5kIG5laXRoZXIgYXJlCi0gICAqIHRoZSByZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gLS0gdGhvdWdoIHdlJ2xsIGdlbmVyYWxseSByZXR1cm4gdHJ1ZS4KLSAgICogCi0gICAqIFRPRE86IE1ha2Ugc3VyZSB0aGlzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIHdpdGggYXR0cmlidXRlIG5vZGVzISEhCi0gICAqCi0gICAqIEBwYXJhbSBub2RlMSBET00gTm9kZSB0byBwZXJmb3JtIHBvc2l0aW9uIGNvbXBhcmlzb24gb24uCi0gICAqIEBwYXJhbSBub2RlMiBET00gTm9kZSB0byBwZXJmb3JtIHBvc2l0aW9uIGNvbXBhcmlzb24gb24gLgotICAgKiAKLSAgICogQHJldHVybiBmYWxzZSBpZiBub2RlMiBjb21lcyBiZWZvcmUgbm9kZTEsIG90aGVyd2lzZSByZXR1cm4gdHJ1ZS4KLSAgICogWW91IGNhbiB0aGluayBvZiB0aGlzIGFzIAotICAgKiA8Y29kZT4obm9kZTEuZG9jdW1lbnRPcmRlclBvc2l0aW9uICZsdDs9IG5vZGUyLmRvY3VtZW50T3JkZXJQb3NpdGlvbik8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNOb2RlQWZ0ZXIoaW50IG5vZGVIYW5kbGUxLCBpbnQgbm9kZUhhbmRsZTIpOwotCi0gIC8qKgotICAgKiAgICAgMi4gW2VsZW1lbnQgY29udGVudCB3aGl0ZXNwYWNlXSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZQotICAgKiAgICAgICAgY2hhcmFjdGVyIGlzIHdoaXRlIHNwYWNlIGFwcGVhcmluZyB3aXRoaW4gZWxlbWVudCBjb250ZW50IChzZWUgW1hNTF0sCi0gICAqICAgICAgICAyLjEwICJXaGl0ZSBTcGFjZSBIYW5kbGluZyIpLiBOb3RlIHRoYXQgdmFsaWRhdGluZyBYTUwgcHJvY2Vzc29ycyBhcmUKLSAgICogICAgICAgIHJlcXVpcmVkIGJ5IFhNTCAxLjAgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLiBJZiB0aGVyZSBpcyBubwotICAgKiAgICAgICAgZGVjbGFyYXRpb24gZm9yIHRoZSBjb250YWluaW5nIGVsZW1lbnQsIHRoaXMgcHJvcGVydHkgaGFzIG5vIHZhbHVlIGZvcgotICAgKiAgICAgICAgd2hpdGUgc3BhY2UgY2hhcmFjdGVycy4gSWYgbm8gZGVjbGFyYXRpb24gaGFzIGJlZW4gcmVhZCwgYnV0IHRoZSBbYWxsCi0gICAqICAgICAgICBkZWNsYXJhdGlvbnMgcHJvY2Vzc2VkXSBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgaW5mb3JtYXRpb24gaXRlbSBpcwotICAgKiAgICAgICAgZmFsc2UgKHNvIHRoZXJlIG1heSBiZSBhbiB1bnJlYWQgZGVjbGFyYXRpb24pLCB0aGVuIHRoZSB2YWx1ZSBvZiB0aGlzCi0gICAqICAgICAgICBwcm9wZXJ0eSBpcyB1bmtub3duIGZvciB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzLiBJdCBpcyBhbHdheXMgZmFsc2UgZm9yCi0gICAqICAgICAgICBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCB3aGl0ZSBzcGFjZS4KLSAgICoKLSAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIG5vZGUgSUQuCi0gICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoYXJhY3RlciBkYXRhIGlzIHdoaXRlc3BhY2U7Ci0gICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVyRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKGludCBub2RlSGFuZGxlKTsKLQotICAvKioKLSAgICogICAgMTAuIFthbGwgZGVjbGFyYXRpb25zIHByb2Nlc3NlZF0gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3RyaWN0bHkgc3BlYWtpbmcKLSAgICogICAgICAgIHBhcnQgb2YgdGhlIGluZm9zZXQgb2YgdGhlIGRvY3VtZW50LiBSYXRoZXIgaXQgaXMgYW4gaW5kaWNhdGlvbiBvZgotICAgKiAgICAgICAgd2hldGhlciB0aGUgcHJvY2Vzc29yIGhhcyByZWFkIHRoZSBjb21wbGV0ZSBEVEQuIEl0cyB2YWx1ZSBpcyBhCi0gICAqICAgICAgICBib29sZWFuLiBJZiBpdCBpcyBmYWxzZSwgdGhlbiBjZXJ0YWluIHByb3BlcnRpZXMgKGluZGljYXRlZCBpbiB0aGVpcgotICAgKiAgICAgICAgZGVzY3JpcHRpb25zIGJlbG93KSBtYXkgYmUgdW5rbm93bi4gSWYgaXQgaXMgdHJ1ZSwgdGhvc2UgcHJvcGVydGllcwotICAgKiAgICAgICAgYXJlIG5ldmVyIHVua25vd24uCi0gICAqCi0gICAqIEBwYXJhbSB0aGUgZG9jdW1lbnQgaGFuZGxlCi0gICAqCi0gICAqIEBwYXJhbSBkb2N1bWVudEhhbmRsZSBBIG5vZGUgaGFuZGxlIHRoYXQgbXVzdCBpZGVudGlmeSBhIGRvY3VtZW50LgotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBkZWNsYXJhdGlvbnMgd2VyZSBwcm9jZXNzZWQ7Ci0gICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRG9jdW1lbnRBbGxEZWNsYXJhdGlvbnNQcm9jZXNzZWQoaW50IGRvY3VtZW50SGFuZGxlKTsKLQotICAvKioKLSAgICogICAgIDUuIFtzcGVjaWZpZWRdIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgd2FzIGFjdHVhbGx5Ci0gICAqICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIHN0YXJ0LXRhZyBvZiBpdHMgZWxlbWVudCwgb3Igd2FzIGRlZmF1bHRlZCBmcm9tIHRoZQotICAgKiAgICAgICAgRFRELgotICAgKgotICAgKiBAcGFyYW0gdGhlIGF0dHJpYnV0ZSBoYW5kbGUKLSAgICoKLSAgICogTkVFRFNET0MgQHBhcmFtIGF0dHJpYnV0ZUhhbmRsZQotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZDsKLSAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd2FzIGRlZmF1bHRlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKGludCBhdHRyaWJ1dGVIYW5kbGUpOwotICAKLSAgCi0gIC8vID09PT09PT09PT0gRGlyZWN0IFNBWCBEaXNwYXRjaCwgZm9yIG9wdGltaXphdGlvbiBwdXJwb3NlcyA9PT09PT09PQotICAKLSAgLyoqCi0gICAqIERpcmVjdGx5IGNhbGwgdGhlCi0gICAqIGNoYXJhY3RlcnMgbWV0aG9kIG9uIHRoZSBwYXNzZWQgQ29udGVudEhhbmRsZXIgZm9yIHRoZSAKLSAgICogc3RyaW5nLXZhbHVlIG9mIHRoZSBnaXZlbiBub2RlIChzZWUgaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjZGF0YS1tb2RlbCAKLSAgICogZm9yIHRoZSBkZWZpbml0aW9uIG9mIGEgbm9kZSdzIHN0cmluZy12YWx1ZSkuIE11bHRpcGxlIGNhbGxzIHRvIHRoZSAKLSAgICogQ29udGVudEhhbmRsZXIncyBjaGFyYWN0ZXJzIG1ldGhvZHMgbWF5IHdlbGwgb2NjdXIgZm9yIGEgc2luZ2xlIGNhbGwgdG8gCi0gICAqIHRoaXMgbWV0aG9kLgotICAgKgotICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KLSAgICogQHBhcmFtIGNoIEEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgQ29udGVudEhhbmRsZXIuCi0gICAqCi0gICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwYXRjaENoYXJhY3RlcnNFdmVudHMoCi0gICAgaW50IG5vZGVIYW5kbGUsIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyIGNoKQotICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogRGlyZWN0bHkgY3JlYXRlIFNBWCBwYXJzZXIgZXZlbnRzIGZyb20gYSBzdWJ0cmVlLgotICAgKgotICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBUaGUgbm9kZSBJRC4KLSAgICogQHBhcmFtIGNoIEEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgQ29udGVudEhhbmRsZXIuCi0gICAqCi0gICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwYXRjaFRvRXZlbnRzKAotICAgIGludCBub2RlSGFuZGxlLCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBjaCkKLSAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9EVE1GaWx0ZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9EVE1GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkYmEzYi4uMDAwMDAwMAotLS0gYS9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvRFRNRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLnhtbC51dGlsczsKLQotLyoqCi0gKiBTaW1wbGUgZmlsdGVyIGZvciBkb2luZyBub2RlIHRlc3RzLiAgTm90ZSB0aGUgc2VtYW50aWNzIG9mIHRoaXMgYXJlIHNvbWV3aGF0IAotICogZGlmZmVyZW50IHRoYXQgdGhlIERPTSdzIE5vZGVGaWx0ZXIuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRNRmlsdGVyCi17Ci0KLSAgLy8gQ29uc3RhbnRzIGZvciB3aGF0VG9TaG93LiAgVGhlc2UgYXJlIHVzZWQgdG8gc2V0IHRoZSBub2RlIHR5cGUgdGhhdCB3aWxsIAotICAvLyBiZSB0cmF2ZXJzZWQuCi0KLSAgLyoqCi0gICAqIFNob3cgYWxsIDxjb2RlPk5vZGVzPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQUxMID0gMHhGRkZGRkZGRjsKLQotICAvKioKLSAgICogU2hvdyA8Y29kZT5FbGVtZW50PC9jb2RlPiBub2Rlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfRUxFTUVOVCA9IDB4MDAwMDAwMDE7Ci0KLSAgLyoqCi0gICAqIFNob3cgPGNvZGU+QXR0cjwvY29kZT4gbm9kZXMuIFRoaXMgaXMgbWVhbmluZ2Z1bCBvbmx5IHdoZW4gY3JlYXRpbmcgYW4KLSAgICogaXRlcmF0b3Igb3IgdHJlZS13YWxrZXIgd2l0aCBhbiBhdHRyaWJ1dGUgbm9kZSBhcyBpdHMKLSAgICogPGNvZGU+cm9vdDwvY29kZT47IGluIHRoaXMgY2FzZSwgaXQgbWVhbnMgdGhhdCB0aGUgYXR0cmlidXRlIG5vZGUKLSAgICogd2lsbCBhcHBlYXIgaW4gdGhlIGZpcnN0IHBvc2l0aW9uIG9mIHRoZSBpdGVyYXRpb24gb3IgdHJhdmVyc2FsLgotICAgKiBTaW5jZSBhdHRyaWJ1dGVzIGFyZSBuZXZlciBjaGlsZHJlbiBvZiBvdGhlciBub2RlcywgdGhleSBkbyBub3QKLSAgICogYXBwZWFyIHdoZW4gdHJhdmVyc2luZyBvdmVyIHRoZSBkb2N1bWVudCB0cmVlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BVFRSSUJVVEUgPSAweDAwMDAwMDAyOwotCi0gIC8qKgotICAgKiBTaG93IDxjb2RlPlRleHQ8L2NvZGU+IG5vZGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19URVhUID0gMHgwMDAwMDAwNDsKLQotICAvKioKLSAgICogU2hvdyA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IG5vZGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19DREFUQV9TRUNUSU9OID0gMHgwMDAwMDAwODsKLQotICAvKioKLSAgICogU2hvdyA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IG5vZGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19FTlRJVFlfUkVGRVJFTkNFID0gMHgwMDAwMDAxMDsKLQotICAvKioKLSAgICogU2hvdyA8Y29kZT5FbnRpdHk8L2NvZGU+IG5vZGVzLiBUaGlzIGlzIG1lYW5pbmdmdWwgb25seSB3aGVuIGNyZWF0aW5nCi0gICAqIGFuIGl0ZXJhdG9yIG9yIHRyZWUtd2Fsa2VyIHdpdGggYW48Y29kZT4gRW50aXR5PC9jb2RlPiBub2RlIGFzIGl0cwotICAgKiA8Y29kZT5yb290PC9jb2RlPjsgaW4gdGhpcyBjYXNlLCBpdCBtZWFucyB0aGF0IHRoZSA8Y29kZT5FbnRpdHk8L2NvZGU+Ci0gICAqICBub2RlIHdpbGwgYXBwZWFyIGluIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGUgdHJhdmVyc2FsLiBTaW5jZQotICAgKiBlbnRpdGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIGRvY3VtZW50IHRyZWUsIHRoZXkgZG8gbm90IGFwcGVhciB3aGVuCi0gICAqIHRyYXZlcnNpbmcgb3ZlciB0aGUgZG9jdW1lbnQgdHJlZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfRU5USVRZID0gMHgwMDAwMDAyMDsKLQotICAvKioKLSAgICogU2hvdyA8Y29kZT5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb248L2NvZGU+IG5vZGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OID0gMHgwMDAwMDA0MDsKLQotICAvKioKLSAgICogU2hvdyA8Y29kZT5Db21tZW50PC9jb2RlPiBub2Rlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQ09NTUVOVCA9IDB4MDAwMDAwODA7Ci0KLSAgLyoqCi0gICAqIFNob3cgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG5vZGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19ET0NVTUVOVCA9IDB4MDAwMDAxMDA7Ci0KLSAgLyoqCi0gICAqIFNob3cgPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiBub2Rlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfRE9DVU1FTlRfVFlQRSA9IDB4MDAwMDAyMDA7Ci0KLSAgLyoqCi0gICAqIFNob3cgPGNvZGU+RG9jdW1lbnRGcmFnbWVudDwvY29kZT4gbm9kZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UID0gMHgwMDAwMDQwMDsKLQotICAvKioKLSAgICogU2hvdyA8Y29kZT5Ob3RhdGlvbjwvY29kZT4gbm9kZXMuIFRoaXMgaXMgbWVhbmluZ2Z1bCBvbmx5IHdoZW4gY3JlYXRpbmcKLSAgICogYW4gaXRlcmF0b3Igb3IgdHJlZS13YWxrZXIgd2l0aCBhIDxjb2RlPk5vdGF0aW9uPC9jb2RlPiBub2RlIGFzIGl0cwotICAgKiA8Y29kZT5yb290PC9jb2RlPjsgaW4gdGhpcyBjYXNlLCBpdCBtZWFucyB0aGF0IHRoZQotICAgKiA8Y29kZT5Ob3RhdGlvbjwvY29kZT4gbm9kZSB3aWxsIGFwcGVhciBpbiB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlCi0gICAqIHRyYXZlcnNhbC4gU2luY2Ugbm90YXRpb25zIGFyZSBub3QgcGFydCBvZiB0aGUgZG9jdW1lbnQgdHJlZSwgdGhleSBkbwotICAgKiBub3QgYXBwZWFyIHdoZW4gdHJhdmVyc2luZyBvdmVyIHRoZSBkb2N1bWVudCB0cmVlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19OT1RBVElPTiA9IDB4MDAwMDA4MDA7Ci0gIAotICAvKiogVGhpcyBiaXQgc3BlY2lmaWVzIGEgbmFtZXNwYWNlLCBhbmQgZXh0ZW5kcyB0aGUgU0hPV19YWFggc3R1ZmYgCi0gICAqICBpbiB7QGxpbmsgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXJ9LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX05BTUVTUEFDRSA9IDB4MDAwMDEwMDA7Ci0KLSAgLyoqCi0gICAqIFNwZWNpYWwgYml0bWFwIGZvciBtYXRjaCBwYXR0ZXJucyBzdGFydGluZyB3aXRoIGEgZnVuY3Rpb24uCi0gICAqIE1ha2Ugc3VyZSB0aGlzIGRvZXMgbm90IGNvbmZsaWN0IHdpdGgge0BsaW5rIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQllGVU5DVElPTiA9IDB4MDAwMTAwMDA7Ci0KLSAgLyoqCi0gICAqIFRlc3Qgd2hldGhlciBhIHNwZWNpZmllZCBub2RlIGlzIHZpc2libGUgaW4gdGhlIGxvZ2ljYWwgdmlldyBvZiBhCi0gICAqIDxjb2RlPkRUTUl0ZXJhdG9yPC9jb2RlPi4gTm9ybWFsbHksIHRoaXMgZnVuY3Rpb24KLSAgICogd2lsbCBiZSBjYWxsZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkRUTUl0ZXJhdG9yPC9jb2RlPjsgCi0gICAqIGl0IGlzIG5vdCBub3JtYWxseSBjYWxsZWQgZGlyZWN0bHkgZnJvbQotICAgKiB1c2VyIGNvZGUuCi0gICAqIAotICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBpbnQgSGFuZGxlIG9mIHRoZSBub2RlLgotICAgKiBAcGFyYW0gd2hhdFRvU2hvdyBvbmUgb2YgU0hPV19YWFggdmFsdWVzLgotICAgKiBAcmV0dXJuIG9uZSBvZiBGSUxURVJfQUNDRVBULCBGSUxURVJfUkVKRUNULCBvciBGSUxURVJfU0tJUC4KLSAgICovCi0gIHB1YmxpYyBzaG9ydCBhY2NlcHROb2RlKGludCBub2RlSGFuZGxlLCBpbnQgd2hhdFRvU2hvdyk7Ci0gIAotICAvKioKLSAgICogVGVzdCB3aGV0aGVyIGEgc3BlY2lmaWVkIG5vZGUgaXMgdmlzaWJsZSBpbiB0aGUgbG9naWNhbCB2aWV3IG9mIGEKLSAgICogPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+LiBOb3JtYWxseSwgdGhpcyBmdW5jdGlvbgotICAgKiB3aWxsIGJlIGNhbGxlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+OyAKLSAgICogaXQgaXMgbm90IG5vcm1hbGx5IGNhbGxlZCBkaXJlY3RseSBmcm9tCi0gICAqIHVzZXIgY29kZS4KLSAgICogCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIG5vZGUuCi0gICAqIEBwYXJhbSB3aGF0VG9TaG93IG9uZSBvZiBTSE9XX1hYWCB2YWx1ZXMuCi0gICAqIEBwYXJhbSBleHBhbmRlZE5hbWUgYSB2YWx1ZSBkZWZpbmluZyB0aGUgZXhhbmRlZCBuYW1lIGFzIGRlZmluZWQgaW4gCi0gICAqICAgICAgICAgICAgICAgICAgICAgdGhlIERUTSBpbnRlcmZhY2UuICBXaWxkIGNhcmRzIHdpbGwgYmUgZGVmaW5lZCAKLSAgICogICAgICAgICAgICAgICAgICAgICBieSAweEZGRkYgaW4gdGhlIGhpZ2ggd29yZCBhbmQvb3IgaW4gdGhlIGxvdyB3b3JkLgotICAgKiBAcmV0dXJuIG9uZSBvZiBGSUxURVJfQUNDRVBULCBGSUxURVJfUkVKRUNULCBvciBGSUxURVJfU0tJUC4KLSAgICovCi0gIHB1YmxpYyBzaG9ydCBhY2NlcHROb2RlKGludCBub2RlSGFuZGxlLCBpbnQgd2hhdFRvU2hvdywgaW50IGV4cGFuZGVkTmFtZSk7Ci0gCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL0RUTU1hbmFnZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9EVE1NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NTZmYmUuLjAwMDAwMDAKLS0tIGEvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL0RUTU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhtbC51dGlsczsKLQotLyoqCi0gKiBBIERUTU1hbmFnZXIgaW5zdGFuY2UgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIERUTSBhbmQKLSAqIERUTUl0ZXJhdG9yIG9iamVjdHMsIGFuZCBtYW5hZ2UgdGhlIERUTSBvYmplY3RzIGluIHRoZSBzeXN0ZW0uCi0gKgotICogPHA+VGhlIHN5c3RlbSBwcm9wZXJ0eSB0aGF0IGRldGVybWluZXMgd2hpY2ggRmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotICogdG8gY3JlYXRlIGlzIG5hbWVkICJvcmcuYXBhY2hlLnhtbC51dGlscy5EVE1GYWN0b3J5Ii4gVGhpcwotICogcHJvcGVydHkgbmFtZXMgYSBjb25jcmV0ZSBzdWJjbGFzcyBvZiB0aGUgRFRNRmFjdG9yeSBhYnN0cmFjdAotICogIGNsYXNzLiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGRlZmluZWQsIGEgcGxhdGZvcm0gZGVmYXVsdCBpcyBiZSB1c2VkLjwvcD4KLSAqICAKLSAqIDxwPkFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgPGVtcGg+bXVzdDwvZW1waD4gYmUgc2FmZSB0byB1c2UgYWNyb3NzIAotICogdGhyZWFkIGluc3RhbmNlcy4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgYSBjbGllbnQgd2lsbCBjcmVhdGUgYSBzaW5nbGUgaW5zdGFuY2UgCi0gKiBvZiBhIERUTU1hbmFnZXIgdG8gdXNlIGFjcm9zcyBtdWx0aXBsZSB0aHJlYWRzLiAgVGhpcyB3aWxsIGFsbG93IHNoYXJpbmcgCi0gKiBvZiBEVE1zIGFjcm9zcyBtdWx0aXBsZSBwcm9jZXNzZXMuPC9wPgotICogIAotICogPHA+Tm90ZTogdGhpcyBjbGFzcyBpcyBpbmNvbXBsZXRlIHJpZ2h0IG5vdy4gIEl0IHdpbGwgYmUgcHJldHR5IG11Y2ggCi0gKiBtb2RlbGVkIGFmdGVyIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IGluIHRlcm1zIG9mIGl0cyAKLSAqIGZhY3Rvcnkgc3VwcG9ydC48L3A+Ci0gKiAKLSAqIDxwPlN0YXRlOiBJbiBwcm9ncmVzcyEhPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRFRNTWFuYWdlcgotewotCi0gIC8qKgotICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHByb3RlY3RlZCBvbiBwdXJwb3NlLgotICAgKi8KLSAgcHJvdGVjdGVkIERUTU1hbmFnZXIoKXt9Ci0KLSAgLyoqCi0gICAqIEdldCBhbiBpbnN0YW5jZSBvZiBhIERUTS4gIElmIHRoZSB1bmlxdWUgZmxhZyBpcyB0cnVlLCBhIG5ldyBpbnN0YW5jZSB3aWxsCi0gICAqIGFsd2F5cyBiZSByZXR1cm5lZC4gIE90aGVyd2lzZSBpdCBpcyB1cCB0byB0aGUgRFRNTWFuYWdlciB0byByZXR1cm4gYQotICAgKiBuZXcgaW5zdGFuY2Ugb3IgYW4gaW5zdGFuY2UgdGhhdCBpdCBhbHJlYWR5IGNyZWF0ZWQgYW5kIG1heSBiZSBiZWluZyB1c2VkCi0gICAqIGJ5IHNvbWVvbmUgZWxzZS4KLSAgICogKEkgdGhpbmsgbW9yZSBwYXJhbWV0ZXJzIHdpbGwgbmVlZCB0byBiZSBhZGRlZCBmb3IgZXJyb3IgaGFuZGxpbmcsIGFuZCBlbnRpdHkKLSAgICogcmVzb2x1dGlvbikuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIHNvdXJjZSBvYmplY3QuCi0gICAqIEBwYXJhbSB1bmlxdWUgdHJ1ZSBpZiB0aGUgcmV0dXJuZWQgRFRNIG11c3QgYmUgdW5pcXVlLCBwcm9iYWJseSBiZWNhdXNlIGl0Ci0gICAqIGlzIGdvaW5nIHRvIGJlIG11dGF0ZWQuCi0gICAqCi0gICAqIEByZXR1cm4gYSBub24tbnVsbCBEVE0gcmVmZXJlbmNlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IERUTSBnZXREVE0oamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2Ugc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVuaXF1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKioKLSAgICogR2V0IGFuIGluc3RhbmNlIG9mIGEgRFRNIHRoYXQgIm93bnMiIGEgbm9kZSBoYW5kbGUuCi0gICAqCi0gICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBub2RlSGFuZGxlLgotICAgKgotICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgRFRNIHJlZmVyZW5jZS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBEVE0gZ2V0RFRNKGludCBub2RlSGFuZGxlKTsKLQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+IGJhc2VkIG9uIGFuIFhQYXRoCi0gICAqIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI05ULUxvY2F0aW9uUGF0aD5Mb2NhdGlvblBhdGg8L2E+IG9yCi0gICAqIGEgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjTlQtVW5pb25FeHByIj5VbmlvbkV4cHI8L2E+LgotICAgKgotICAgKiBAcGFyYW0geHBhdGhDb21waWxlciA/Pz8gU29tZWhvdyB3ZSBuZWVkIHRvIHBhc3MgaW4gYSBzdWJwYXJ0IG9mIHRoZQotICAgKiBleHByZXNzaW9uLiAgSSBoYXRlIHRvIGRvIHRoaXMgd2l0aCBzdHJpbmdzLCBzaW5jZSB0aGUgbGFyZ2VyIGV4cHJlc3Npb24KLSAgICogaGFzIGFscmVhZHkgYmVlbiBwYXJzZWQuCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgVGhlIHBvc2l0aW9uIGluIHRoZSBleHByZXNzaW9uLgotICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkRUTUl0ZXJhdG9yPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBEVE1JdGVyYXRvciBjcmVhdGVEVE1JdGVyYXRvcihPYmplY3QgeHBhdGhDb21waWxlciwKLSAgICAgICAgICBpbnQgcG9zKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IDxjb2RlPkRUTUl0ZXJhdG9yPC9jb2RlPiBiYXNlZCBvbiBhbiBYUGF0aAotICAgKiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aCNOVC1Mb2NhdGlvblBhdGg+TG9jYXRpb25QYXRoPC9hPiBvcgotICAgKiBhIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI05ULVVuaW9uRXhwciI+VW5pb25FeHByPC9hPi4KLSAgICoKLSAgICogQHBhcmFtIHhwYXRoU3RyaW5nIE11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZXhwcmVzc2luZyBhCi0gICAqIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI05ULUxvY2F0aW9uUGF0aD5Mb2NhdGlvblBhdGg8L2E+IG9yCi0gICAqIGEgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjTlQtVW5pb25FeHByIj5VbmlvbkV4cHI8L2E+LgotICAgKgotICAgKiBAcGFyYW0gcHJlc29sdmVyIEFuIG9iamVjdCB0aGF0IGNhbiByZXNvbHZlIHByZWZpeGVzIHRvIG5hbWVzcGFjZSBVUkxzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkRUTUl0ZXJhdG9yPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBEVE1JdGVyYXRvciBjcmVhdGVEVE1JdGVyYXRvcihTdHJpbmcgeHBhdGhTdHJpbmcsCi0gICAgICAgICAgUHJlZml4UmVzb2x2ZXIgcHJlc29sdmVyKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IDxjb2RlPkRUTUl0ZXJhdG9yPC9jb2RlPiBiYXNlZCBvbmx5IG9uIGEgd2hhdFRvU2hvdyBhbmQKLSAgICogYSBEVE1GaWx0ZXIuICBUaGUgdHJhdmVyc2FsIHNlbWFudGljcyBhcmUgZGVmaW5lZCBhcyB0aGUgZGVzY2VuZGFudAotICAgKiBhY2Nlc3MuCi0gICAqCi0gICAqIEBwYXJhbSB3aGF0VG9TaG93IFRoaXMgZmxhZyBzcGVjaWZpZXMgd2hpY2ggbm9kZSB0eXBlcyBtYXkgYXBwZWFyIGluCi0gICAqICAgdGhlIGxvZ2ljYWwgdmlldyBvZiB0aGUgdHJlZSBwcmVzZW50ZWQgYnkgdGhlIGl0ZXJhdG9yLiBTZWUgdGhlCi0gICAqICAgZGVzY3JpcHRpb24gb2YgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gZm9yIHRoZSBzZXQgb2YgcG9zc2libGUKLSAgICogICA8Y29kZT5TSE9XXzwvY29kZT4gdmFsdWVzLlRoZXNlIGZsYWdzIGNhbiBiZSBjb21iaW5lZCB1c2luZwotICAgKiAgIDxjb2RlPk9SPC9jb2RlPi4KLSAgICogQHBhcmFtIGZpbHRlciBUaGUgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gdG8gYmUgdXNlZCB3aXRoIHRoaXMKLSAgICogICA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gaW5kaWNhdGUgbm8gZmlsdGVyLgotICAgKiBAcGFyYW0gZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uIFRoZSB2YWx1ZSBvZiB0aGlzIGZsYWcgZGV0ZXJtaW5lcwotICAgKiAgIHdoZXRoZXIgZW50aXR5IHJlZmVyZW5jZSBub2RlcyBhcmUgZXhwYW5kZWQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBEVE1JdGVyYXRvciBjcmVhdGVEVE1JdGVyYXRvcihpbnQgd2hhdFRvU2hvdywKLSAgICAgICAgICBEVE1GaWx0ZXIgZmlsdGVyLCBib29sZWFuIGVudGl0eVJlZmVyZW5jZUV4cGFuc2lvbik7Ci19CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvRmFzdFN0cmluZ0J1ZmZlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL0Zhc3RTdHJpbmdCdWZmZXIuamF2YQppbmRleCBjNmY5NzA2Li41MjNiNzk4IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvRmFzdFN0cmluZ0J1ZmZlci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9GYXN0U3RyaW5nQnVmZmVyLmphdmEKQEAgLTIsNyArMiw3IEBACiAgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCiAgKgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKICAqIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNTksNyArNTksNyBAQAogLyoqCiAgKiBCYXJlLWJvbmVzLCB1bnNhZmUsIGZhc3Qgc3RyaW5nIGJ1ZmZlci4gTm8gdGhyZWFkLXNhZmV0eSwgbm8KICAqIHBhcmFtZXRlciByYW5nZSBjaGVja2luZywgZXhwb3NlZCBmaWVsZHMuIE5vdGUgdGhhdCBpbiB0eXBpY2FsCi0gKiBhcHBsaWNhdGlvbnMsIHRocmVhZC1zYWZldHkgb2YgYSBTdHJpbmdCdWZmZXIgaXMgYSBzb21ld2hhdCAKKyAqIGFwcGxpY2F0aW9ucywgdGhyZWFkLXNhZmV0eSBvZiBhIFN0cmluZ0J1ZmZlciBpcyBhIHNvbWV3aGF0CiAgKiBkdWJpb3VzIGNvbmNlcHQgaW4gYW55IGNhc2UuCiAgKiA8cD4KICAqIE5vdGUgdGhhdCBTdHJlZSBpcyB1c2luZyBhIHNpbmdsZSBGYXN0U3RyaW5nQnVmZmVyIGFzIGEgc3RyaW5nIHBvb2wsCkBAIC03OSw0OSArNzksNjMgQEAKICAqIHRoZW9yeSwgUlRGcyBtaWdodCB3YW50IHRvIGJlIHR1bmVkIGRpZmZlcmVudGx5IGZyb20gdGhlIG1haW4KICAqIGRvY3VtZW50J3MgdGV4dC4KICAqIDxwPgotICogKi8KKyAqLwogcHVibGljIGNsYXNzIEZhc3RTdHJpbmdCdWZmZXIKIHsKLSAgLyoqIEZpZWxkIG1fY2h1bmtCaXRzIHNldHMgb3VyIGNodW5raW5nIHN0cmF0ZWd5LCBieSBzYXlpbmcgaG93IG1hbnkKKyAgLy8gSWYgbm9uemVybywgZm9yY2VzIHRoZSBpbmlhbCBjaHVuayBzaXplLgorICAvKiovc3RhdGljIGZpbmFsIGludCBERUJVR19GT1JDRV9JTklUX0JJVFM9MDsKKworICAvKioKKyAgICogRmllbGQgbV9jaHVua0JpdHMgc2V0cyBvdXIgY2h1bmtpbmcgc3RyYXRlZ3ksIGJ5IHNheWluZyBob3cgbWFueQogICAgKiBiaXRzIG9mIGluZGV4IGNhbiBiZSB1c2VkIHdpdGhpbiBhIHNpbmdsZSBjaHVuayBiZWZvcmUgZmxvd2luZyBvdmVyCiAgICAqIHRvIHRoZSBuZXh0IGNodW5rLiBGb3IgZXhhbXBsZSwgaWYgbV9jaHVua2JpdHMgaXMgc2V0IHRvIDE1LCBlYWNoCi0gICAqIGNodW5rIGNhbiBjb250YWluIHVwIHRvIDJeMTUgKDMySykgY2hhcmFjdGVycyAgKi8KLSAgaW50IG1fY2h1bmtCaXRzPTE1OwotICAgICAgICAKLSAgLyoqIEZpZWxkIG1fbWF4Q2h1bmtCaXRzIGFmZmVjdHMgb3VyIGNodW5rLWdyb3d0aCBzdHJhdGVneSwgYnkgc2F5aW5nIHdoYXQKLSAgICogdGhlIGxhcmdlc3QgcGVybWlzc2libGUgY2h1bmsgc2l6ZSBpcyBpbiB0aGlzIHBhcnRpY3VsYXIgRmFzdFN0cmluZ0J1ZmZlciAKLSAgICogaGllcmFyY2h5LiAqLwotICBpbnQgbV9tYXhDaHVua0JpdHM9MTU7Ci0gIAotICAvKiogRmllbGQgbV9yZWNodW5rQml0cyBhZmZlY3RzIG91ciBjaHVuay1ncm93dGggc3RyYXRlZ3ksIGJ5IHNheWluZyBob3cKKyAgICogY2h1bmsgY2FuIGNvbnRhaW4gdXAgdG8gMl4xNSAoMzJLKSBjaGFyYWN0ZXJzICAKKyAgICovCisgIGludCBtX2NodW5rQml0cyA9IDE1OworCisgIC8qKgorICAgKiBGaWVsZCBtX21heENodW5rQml0cyBhZmZlY3RzIG91ciBjaHVuay1ncm93dGggc3RyYXRlZ3ksIGJ5IHNheWluZyB3aGF0CisgICAqIHRoZSBsYXJnZXN0IHBlcm1pc3NpYmxlIGNodW5rIHNpemUgaXMgaW4gdGhpcyBwYXJ0aWN1bGFyIEZhc3RTdHJpbmdCdWZmZXIKKyAgICogaGllcmFyY2h5LiAKKyAgICovCisgIGludCBtX21heENodW5rQml0cyA9IDE1OworCisgIC8qKgorICAgKiBGaWVsZCBtX3JlY2h1bmtCaXRzIGFmZmVjdHMgb3VyIGNodW5rLWdyb3d0aCBzdHJhdGVneSwgYnkgc2F5aW5nIGhvdwogICAgKiBtYW55IGNodW5rcyBzaG91bGQgYmUgYWxsb2NhdGVkIGF0IG9uZSBzaXplIGJlZm9yZSB3ZSBlbmNhcHN1bGF0ZSB0aGVtCiAgICAqIGludG8gdGhlIGZpcnN0IGNodW5rIG9mIHRoZSBuZXh0IHNpemUgdXAuIEZvciBleGFtcGxlLCBpZiBtX3JlY2h1bmtCaXRzCiAgICAqIGlzIHNldCB0byAzLCB0aGVuIGFmdGVyIDggY2h1bmtzIGF0IGEgZ2l2ZW4gc2l6ZSB3ZSB3aWxsIHJlYnVuZGxlCiAgICAqIHRoZW0gYXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBGYXN0U3RyaW5nQnVmZmVyIHVzaW5nIGEgY2h1bmsgc2l6ZQogICAgKiA4IHRpbWVzIGxhcmdlciAoY2h1bmtCaXRzIHNoaWZ0ZWQgbGVmdCB0aHJlZSBiaXRzKS4KICAgICovCi0gIGludCBtX3JlYnVuZGxlQml0cz0yOworICBpbnQgbV9yZWJ1bmRsZUJpdHMgPSAyOwogCi0gIC8qKiBGaWVsZCBtX2NodW5rU2l6ZSBlc3RhYmxpc2hlcyB0aGUgbWF4aW11bSBzaXplIG9mIG9uZSBjaHVuayBvZiB0aGUgYXJyYXkKKyAgLyoqCisgICAqIEZpZWxkIG1fY2h1bmtTaXplIGVzdGFibGlzaGVzIHRoZSBtYXhpbXVtIHNpemUgb2Ygb25lIGNodW5rIG9mIHRoZSBhcnJheQogICAgKiBhcyAyKipjaHVua2JpdHMgY2hhcmFjdGVycy4KLSAgICogKFdoaWNoIG1heSBhbHNvIGJlIHRoZSBtaW5pbXVtIHNpemUgaWYgd2UgYXJlbid0IHR1bmluZyBmb3Igc3RvcmFnZSkgKi8KLSAgaW50IG1fY2h1bmtTaXplOyAvLyA9MTw8KG1fY2h1bmtCaXRzLTEpOwotICAKLSAgLyoqIEZpZWxkIG1fY2h1bmtNYXNrIGlzIG1fY2h1bmtTaXplLTEgLS0gaW4gb3RoZXIgd29yZHMsIG1fY2h1bmtCaXRzCi0gICAqIHdvcnRoIG9mIGxvdy1vcmRlciAnMScgYml0cywgdXNlZnVsIGZvciBzaGlmdC1hbmQtbWFzayBhZGRyZXNzaW5nCi0gICAqIHdpdGhpbiB0aGUgY2h1bmtzLiAqLwotICBpbnQgbV9jaHVua01hc2s7IC8vID1tX2NodW5rU2l6ZS0xOworICAgKiAoV2hpY2ggbWF5IGFsc28gYmUgdGhlIG1pbmltdW0gc2l6ZSBpZiB3ZSBhcmVuJ3QgdHVuaW5nIGZvciBzdG9yYWdlKSAKKyAgICovCisgIGludCBtX2NodW5rU2l6ZTsgIC8vID0xPDwobV9jaHVua0JpdHMtMSk7CiAKLSAgLyoqIEZpZWxkIG1fYXJyYXkgaG9sZHMgdGhlIHN0cmluZyBidWZmZXIncyB0ZXh0IGNvbnRlbnRzLCB1c2luZyBhbgotICAgKiBhcnJheS1vZi1hcnJheXMuIE5vdGUgdGhhdCB0aGlzIGFycmF5LCBhbmQgdGhlIGFycmF5cyBpdCBjb250YWlucywgbWF5IGJlIAotICAgKiByZWFsbG9jYXRlZCB3aGVuIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBhbGxvdyB0aGUgYnVmZmVyIHRvIGdyb3c7IAorICAvKioKKyAgICogRmllbGQgbV9jaHVua01hc2sgaXMgbV9jaHVua1NpemUtMSAtLSBpbiBvdGhlciB3b3JkcywgbV9jaHVua0JpdHMKKyAgICogd29ydGggb2YgbG93LW9yZGVyICcxJyBiaXRzLCB1c2VmdWwgZm9yIHNoaWZ0LWFuZC1tYXNrIGFkZHJlc3NpbmcKKyAgICogd2l0aGluIHRoZSBjaHVua3MuIAorICAgKi8KKyAgaW50IG1fY2h1bmtNYXNrOyAgLy8gPW1fY2h1bmtTaXplLTE7CisKKyAgLyoqCisgICAqIEZpZWxkIG1fYXJyYXkgaG9sZHMgdGhlIHN0cmluZyBidWZmZXIncyB0ZXh0IGNvbnRlbnRzLCB1c2luZyBhbgorICAgKiBhcnJheS1vZi1hcnJheXMuIE5vdGUgdGhhdCB0aGlzIGFycmF5LCBhbmQgdGhlIGFycmF5cyBpdCBjb250YWlucywgbWF5IGJlCisgICAqIHJlYWxsb2NhdGVkIHdoZW4gbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGFsbG93IHRoZSBidWZmZXIgdG8gZ3JvdzsKICAgICogcmVmZXJlbmNlcyB0byB0aGVtIHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIGludmFsaWRhdGVkIGFmdGVyIGFueQogICAgKiBhcHBlbmQuIEhvd2V2ZXIsIHRoZSBvbmx5IHRpbWUgdGhlc2UgYXJyYXlzIGFyZSBkaXJlY3RseSBleHBvc2VkCiAgICAqIGlzIGluIHRoZSBzZW5kU0FYY2hhcmFjdGVycyBjYWxsLgogICAgKi8KICAgY2hhcltdW10gbV9hcnJheTsKIAotICAvKiogRmllbGQgbV9sYXN0Q2h1bmsgaXMgYW4gaW5kZXggaW50byBtX2FycmF5W10sIHBvaW50aW5nIHRvIHRoZSBsYXN0CisgIC8qKgorICAgKiBGaWVsZCBtX2xhc3RDaHVuayBpcyBhbiBpbmRleCBpbnRvIG1fYXJyYXlbXSwgcG9pbnRpbmcgdG8gdGhlIGxhc3QKICAgICogY2h1bmsgb2YgdGhlIENodW5rZWQgQXJyYXkgY3VycmVudGx5IGluIHVzZS4gTm90ZSB0aGF0IGFkZGl0aW9uYWwKICAgICogY2h1bmtzIG1heSBhY3R1YWxseSBiZSBhbGxvY2F0ZWQsIGVnIGlmIHRoZSBGYXN0U3RyaW5nQnVmZmVyIGhhZAogICAgKiBwcmV2aW91c2x5IGJlZW4gdHJ1bmNhdGVkIG9yIGlmIHNvbWVvbmUgaXNzdWVkIGFuIGVuc3VyZVNwYWNlIHJlcXVlc3QuCkBAIC0xMzEsMjAgKzE0NSwyMyBAQAogICAgKi8KICAgaW50IG1fbGFzdENodW5rID0gMDsKIAotICAvKiogRmllbGQgbV9maXJzdEZyZWUgaXMgYW4gaW5kZXggaW50byBtX2FycmF5W21fbGFzdENodW5rXVtdLCBwb2ludGluZyB0byAKKyAgLyoqCisgICAqIEZpZWxkIG1fZmlyc3RGcmVlIGlzIGFuIGluZGV4IGludG8gbV9hcnJheVttX2xhc3RDaHVua11bXSwgcG9pbnRpbmcgdG8KICAgICogdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgQ2h1bmtlZCBBcnJheSB3aGljaCBpcyBub3QgcGFydCBvZiB0aGUKLSAgICogRmFzdFN0cmluZ0J1ZmZlcidzIGN1cnJlbnQgY29udGVudC4gU2luY2UgbV9hcnJheVtdW10gaXMgemVyby1iYXNlZCwgCi0gICAqIHRoZSBsZW5ndGggb2YgdGhhdCBjb250ZW50IGNhbiBiZSBjYWxjdWxhdGVkIGFzIAotICAgKiAobV9sYXN0Q2h1bms8PG1fY2h1bmtCaXRzKSArIG1fZmlyc3RGcmVlICovCisgICAqIEZhc3RTdHJpbmdCdWZmZXIncyBjdXJyZW50IGNvbnRlbnQuIFNpbmNlIG1fYXJyYXlbXVtdIGlzIHplcm8tYmFzZWQsCisgICAqIHRoZSBsZW5ndGggb2YgdGhhdCBjb250ZW50IGNhbiBiZSBjYWxjdWxhdGVkIGFzCisgICAqIChtX2xhc3RDaHVuazw8bV9jaHVua0JpdHMpICsgbV9maXJzdEZyZWUgCisgICAqLwogICBpbnQgbV9maXJzdEZyZWUgPSAwOwotICAKLSAgLyoqIEZpZWxkIG1faW5uZXJGU0IsIHdoZW4gbm9uLW51bGwsIGlzIGEgRmFzdFN0cmluZ0J1ZmZlciB3aG9zZSB0b3RhbAorCisgIC8qKgorICAgKiBGaWVsZCBtX2lubmVyRlNCLCB3aGVuIG5vbi1udWxsLCBpcyBhIEZhc3RTdHJpbmdCdWZmZXIgd2hvc2UgdG90YWwKICAgICogbGVuZ3RoIGVxdWFscyBtX2NodW5rU2l6ZSwgYW5kIHdoaWNoIHJlcGxhY2VzIG1fYXJyYXlbMF0uIFRoaXMgYWxsb3dzCiAgICAqIGJ1aWxkaW5nIGEgaGllcmFyY2h5IG9mIEZhc3RTdHJpbmdCdWZmZXJzLCB3aGVyZSBlYXJseSBhcHBlbmRzIHVzZQogICAgKiBhIHNtYWxsZXIgY2h1bmtTaXplIChmb3IgbGVzcyB3YXN0ZWQgbWVtb3J5IG92ZXJoZWFkKSBidXQgbGF0ZXIKICAgICogb25lcyB1c2UgYSBsYXJnZXIgY2h1bmtTaXplIChmb3IgbGVzcyBoZWFwIGFjdGl2aXR5IG92ZXJoZWFkKS4KICAgICovCi0gIEZhc3RTdHJpbmdCdWZmZXIgbV9pbm5lckZTQj1udWxsOworICBGYXN0U3RyaW5nQnVmZmVyIG1faW5uZXJGU0IgPSBudWxsOwogCiAgIC8qKgogICAgKiBDb25zdHJ1Y3QgYSBGYXN0U3RyaW5nQnVmZmVyLCB3aXRoIGFsbG9jYXRpb24gcG9saWN5IGFzIHBlciBwYXJhbWV0ZXJzLgpAQCAtMTU2LDQxICsxNzMsNDYgQEAKICAgICogPHA+CiAgICAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIGFjY2VwdCBpbnRlZ2VyIHNpemVzIGFuZCByb3VuZCB0byBwb3dlcnMgb2YgdHdvOwogICAgKiB0aGF0IHJlYWxseSBkb2Vzbid0IHNlZW0gdG8gYnV5IHVzIG11Y2gsIGlmIGFueXRoaW5nLgotICAgKiAKLSAgICogQHBhcmFtIGluaXRDaHVua0JpdHMgTGVuZ3RoIGluIGNoYXJhY3RlcnMgb2YgdGhlIGluaXRpYWwgYWxsb2NhdGlvbiAKLSAgICogb2YgYSBjaHVuaywgZXhwcmVzc2VkIGluIGxvZy1iYXNlLTIuIChUaGF0IGlzLCAxMCBtZWFucyBhbGxvY2F0ZSAxMDI0IAorICAgKgorICAgKiBAcGFyYW0gaW5pdENodW5rQml0cyBMZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGUgaW5pdGlhbCBhbGxvY2F0aW9uCisgICAqIG9mIGEgY2h1bmssIGV4cHJlc3NlZCBpbiBsb2ctYmFzZS0yLiAoVGhhdCBpcywgMTAgbWVhbnMgYWxsb2NhdGUgMTAyNAogICAgKiBjaGFyYWN0ZXJzLikgTGF0ZXIgY2h1bmtzIHdpbGwgdXNlIGxhcmdlciBhbGxvY2F0aW9uIHVuaXRzLCB0byB0cmFkZSBvZmYKLSAgICogYWxsb2NhdGlvbiBzcGVlZCBvZiBsYXJnZSBkb2N1bWVudCBhZ2FpbnN0IHN0b3JhZ2UgZWZmaWNpZW5jeSBvZiBzbWFsbCAKKyAgICogYWxsb2NhdGlvbiBzcGVlZCBvZiBsYXJnZSBkb2N1bWVudCBhZ2FpbnN0IHN0b3JhZ2UgZWZmaWNpZW5jeSBvZiBzbWFsbAogICAgKiBvbmVzLgogICAgKiBAcGFyYW0gbWF4Q2h1bmtCaXRzIE51bWJlciBvZiBjaGFyYWN0ZXItb2Zmc2V0IGJpdHMgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IKLSAgICogYWRkcmVzc2luZyB3aXRoaW4gYSBjaHVuay4gTWF4aW11bSBsZW5ndGggb2YgYSBjaHVuayBpcyAyXmNodW5rQml0cyAKKyAgICogYWRkcmVzc2luZyB3aXRoaW4gYSBjaHVuay4gTWF4aW11bSBsZW5ndGggb2YgYSBjaHVuayBpcyAyXmNodW5rQml0cwogICAgKiBjaGFyYWN0ZXJzLgogICAgKiBAcGFyYW0gcmVidW5kbGVCaXRzIE51bWJlciBvZiBjaGFyYWN0ZXItb2Zmc2V0IGJpdHMgdGhhdCBhZGRyZXNzaW5nIHNob3VsZAogICAgKiBhZHZhbmNlIGJlZm9yZSB3ZSBhdHRlbXB0IHRvIHRha2UgYSBzdGVwIGZyb20gaW5pdENodW5rQml0cyB0byBtYXhDaHVua0JpdHMKICAgICovCi0gIHB1YmxpYyBGYXN0U3RyaW5nQnVmZmVyKGludCBpbml0Q2h1bmtCaXRzLGludCBtYXhDaHVua0JpdHMsIGludCByZWJ1bmRsZUJpdHMpCisgIHB1YmxpYyBGYXN0U3RyaW5nQnVmZmVyKGludCBpbml0Q2h1bmtCaXRzLCBpbnQgbWF4Q2h1bmtCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVidW5kbGVCaXRzKQogICB7CisgICAgaWYoREVCVUdfRk9SQ0VfSU5JVF9CSVRTIT0wKSBpbml0Q2h1bmtCaXRzPURFQlVHX0ZPUkNFX0lOSVRfQklUUzsKKwogICAgIG1fYXJyYXkgPSBuZXcgY2hhclsxNl1bXTsKIAogICAgIC8vIERvbid0IGJpdGUgb2ZmIG1vcmUgdGhhbiB3ZSdyZSBwcmVwYXJlZCB0byBzd2FsbG93IQotICAgIGlmKGluaXRDaHVua0JpdHM+bWF4Q2h1bmtCaXRzKQotICAgICAgaW5pdENodW5rQml0cz1tYXhDaHVua0JpdHM7Ci0gICAgICAgIAotICAgIG1fY2h1bmtCaXRzPWluaXRDaHVua0JpdHM7Ci0gICAgbV9tYXhDaHVua0JpdHM9bWF4Q2h1bmtCaXRzOwotICAgIG1fcmVidW5kbGVCaXRzPXJlYnVuZGxlQml0czsKLSAgICAgICAgCi0gICAgbV9jaHVua1NpemU9MTw8KGluaXRDaHVua0JpdHMpOwotICAgIG1fY2h1bmtNYXNrPW1fY2h1bmtTaXplLTE7CisgICAgaWYgKGluaXRDaHVua0JpdHMgPiBtYXhDaHVua0JpdHMpCisgICAgICBpbml0Q2h1bmtCaXRzID0gbWF4Q2h1bmtCaXRzOworCisgICAgbV9jaHVua0JpdHMgPSBpbml0Q2h1bmtCaXRzOworICAgIG1fbWF4Q2h1bmtCaXRzID0gbWF4Q2h1bmtCaXRzOworICAgIG1fcmVidW5kbGVCaXRzID0gcmVidW5kbGVCaXRzOworICAgIG1fY2h1bmtTaXplID0gMSA8PCAoaW5pdENodW5rQml0cyk7CisgICAgbV9jaHVua01hc2sgPSBtX2NodW5rU2l6ZSAtIDE7CiAgICAgbV9hcnJheVswXSA9IG5ldyBjaGFyW21fY2h1bmtTaXplXTsKICAgfQogCiAgIC8qKgogICAgKiBDb25zdHJ1Y3QgYSBGYXN0U3RyaW5nQnVmZmVyLCB1c2luZyBhIGRlZmF1bHQgcmVidW5kbGVCaXRzIHZhbHVlLgorICAgKgorICAgKiBORUVEU0RPQyBAcGFyYW0gaW5pdENodW5rQml0cworICAgKiBORUVEU0RPQyBAcGFyYW0gbWF4Q2h1bmtCaXRzCiAgICAqLwotICBwdWJsaWMgRmFzdFN0cmluZ0J1ZmZlcihpbnQgaW5pdENodW5rQml0cyxpbnQgbWF4Q2h1bmtCaXRzKQorICBwdWJsaWMgRmFzdFN0cmluZ0J1ZmZlcihpbnQgaW5pdENodW5rQml0cywgaW50IG1heENodW5rQml0cykKICAgewotICAgICAgICAgIHRoaXMoaW5pdENodW5rQml0cyxtYXhDaHVua0JpdHMsMik7CisgICAgdGhpcyhpbml0Q2h1bmtCaXRzLCBtYXhDaHVua0JpdHMsIDIpOwogICB9CiAKICAgLyoqCkBAIC0yMDAsMjYgKzIyMiwyOSBAQAogICAgKiBJU1NVRTogU2hvdWxkIHRoaXMgY2FsbCBhc3NlcnQgaW5pdGlhbCBzaXplLCBvciBmaXhlZCBzaXplPwogICAgKiBOb3cgY29uZmlndXJlZCBhcyBpbml0aWFsLCB3aXRoIGEgZGVmYXVsdCBmb3IgZml4ZWQuCiAgICAqCi0gICAqIEBwYXJhbSAKKyAgICogQHBhcmFtCisgICAqCisgICAqIE5FRURTRE9DIEBwYXJhbSBpbml0Q2h1bmtCaXRzCiAgICAqLwogICBwdWJsaWMgRmFzdFN0cmluZ0J1ZmZlcihpbnQgaW5pdENodW5rQml0cykKICAgewotICAgIHRoaXMoaW5pdENodW5rQml0cywxNSwyKTsKKyAgICB0aGlzKGluaXRDaHVua0JpdHMsIDE1LCAyKTsKICAgfQorCiAgIC8qKgogICAgKiBDb25zdHJ1Y3QgYSBGYXN0U3RyaW5nQnVmZmVyLCB1c2luZyBhIGRlZmF1bHQgYWxsb2NhdGlvbiBwb2xpY3kuCiAgICAqLwogICBwdWJsaWMgRmFzdFN0cmluZ0J1ZmZlcigpCiAgIHsKKwogICAgIC8vIDEwIGJpdHMgaXMgMUsuIDE1IGJpdHMgaXMgMzJLLiBSZW1lbWJlciB0aGF0IHRoZXNlIGFyZSBjaGFyYWN0ZXIKICAgICAvLyBjb3VudHMsIHNvIGFjdHVhbCBtZW1vcnkgYWxsb2NhdGlvbiB1bml0IGlzIGRvdWJsZWQgZm9yIFVURi0xNiBjaGFycy4KICAgICAvLwogICAgIC8vIEZvciByZWZlcmVuY2U6IEluIHRoZSBvcmlnaW5hbCBGYXN0U3RyaW5nQnVmZmVyLCB3ZSBzaW1wbHkKICAgICAvLyBvdmVyYWxsb2NhdGVkIGJ5IGJsb2Nrc2l6ZSAoZGVmYXVsdCAxS0IpIG9uIGVhY2ggYnVmZmVyLWdyb3d0aC4KLSAgICB0aGlzKDEwLDE1LDIpOworICAgIHRoaXMoMTAsIDE1LCAyKTsKICAgfQogCi0KICAgLyoqCiAgICAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0LiBTeW5vbnltIGZvciBsZW5ndGgoKS4KICAgICoKQEAgLTIyNyw3ICsyNTIsNyBAQAogICAgKi8KICAgcHVibGljIGZpbmFsIGludCBzaXplKCkKICAgewotICAgICAgICByZXR1cm4gKG1fbGFzdENodW5rPDxtX2NodW5rQml0cykgKyBtX2ZpcnN0RnJlZTsKKyAgICByZXR1cm4gKG1fbGFzdENodW5rIDw8IG1fY2h1bmtCaXRzKSArIG1fZmlyc3RGcmVlOwogICB9CiAKICAgLyoqCkBAIC0yMzcsNyArMjYyLDcgQEAKICAgICovCiAgIHB1YmxpYyBmaW5hbCBpbnQgbGVuZ3RoKCkKICAgewotICAgIHJldHVybiAobV9sYXN0Q2h1bms8PG1fY2h1bmtCaXRzKSArIG1fZmlyc3RGcmVlOworICAgIHJldHVybiAobV9sYXN0Q2h1bmsgPDwgbV9jaHVua0JpdHMpICsgbV9maXJzdEZyZWU7CiAgIH0KIAogICAvKioKQEAgLTI0NywyMiArMjcyLDI2IEBACiAgICAqLwogICBwdWJsaWMgZmluYWwgdm9pZCByZXNldCgpCiAgIHsKKwogICAgIG1fbGFzdENodW5rID0gMDsKICAgICBtX2ZpcnN0RnJlZSA9IDA7Ci0JCi0JLy8gUmVjb3ZlciB0aGUgb3JpZ2luYWwgY2h1bmsgc2l6ZQotCUZhc3RTdHJpbmdCdWZmZXIgaW5uZXJtb3N0PXRoaXM7Ci0Jd2hpbGUoaW5uZXJtb3N0Lm1faW5uZXJGU0IhPW51bGwpCi0JCWlubmVybW9zdD1pbm5lcm1vc3QubV9pbm5lckZTQjsKLQltX2NodW5rQml0cz1pbm5lcm1vc3QubV9jaHVua0JpdHM7Ci0JbV9jaHVua1NpemU9aW5uZXJtb3N0Lm1fY2h1bmtTaXplOwotCW1fY2h1bmtNYXNrPWlubmVybW9zdC5tX2NodW5rTWFzazsKLQkgCi0JLy8gRGlzY2FyZCB0aGUgaGllcmFyY2h5Ci0JbV9pbm5lckZTQiAgPSBudWxsOwogCi0JbV9hcnJheT1uZXcgY2hhclsxNl1bMF07Ci0JbV9hcnJheVswXT1uZXcgY2hhclttX2NodW5rU2l6ZV07CisgICAgLy8gUmVjb3ZlciB0aGUgb3JpZ2luYWwgY2h1bmsgc2l6ZQorICAgIEZhc3RTdHJpbmdCdWZmZXIgaW5uZXJtb3N0ID0gdGhpczsKKworICAgIHdoaWxlIChpbm5lcm1vc3QubV9pbm5lckZTQiAhPSBudWxsKQorICAgIHsKKyAgICAgIGlubmVybW9zdCA9IGlubmVybW9zdC5tX2lubmVyRlNCOworICAgIH0KKworICAgIG1fY2h1bmtCaXRzID0gaW5uZXJtb3N0Lm1fY2h1bmtCaXRzOworICAgIG1fY2h1bmtTaXplID0gaW5uZXJtb3N0Lm1fY2h1bmtTaXplOworICAgIG1fY2h1bmtNYXNrID0gaW5uZXJtb3N0Lm1fY2h1bmtNYXNrOworCisgICAgLy8gRGlzY2FyZCB0aGUgaGllcmFyY2h5CisgICAgbV9pbm5lckZTQiA9IG51bGw7CisgICAgbV9hcnJheSA9IG5ldyBjaGFyWzE2XVswXTsKKyAgICBtX2FycmF5WzBdID0gbmV3IGNoYXJbbV9jaHVua1NpemVdOwogICB9CiAKICAgLyoqCkBAIC0yNzQsNzggKzMwMyw4OSBAQAogICAgKiBUaGUgb25seSBzYWZlIHVzZSBmb3Igb3VyIHNldExlbmd0aCgpIGlzIHRvIHRydW5jYXRlIHRoZSBGYXN0U3RyaW5nQnVmZmVyCiAgICAqIHRvIGEgc2hvcnRlciBzdHJpbmcuCiAgICAqIDxwPgotICAgKiBUT0RPOiBDdXJyZW50IHNldExlbmd0aCBjb2RlIGlzIHByb2JhYmx5IG5vdCB0aGUgYmVzdCBzb2x1dGlvbi4KKyAgICogVE9ETzogJVJFVkVJVyUgQ3VycmVudCBzZXRMZW5ndGggY29kZSBpcyBwcm9iYWJseSBub3QgdGhlIGJlc3Qgc29sdXRpb24uCiAgICAqIEl0IHJlbGVhc2VzIG1lbW9yeSB0aGF0IGluIHRoZW9yeSB3ZSBzaG91bGRuIHJldGFpbiBhbmQKICAgICogcmV1c2UuIEhvbGRpbmcgb250byB0aGF0IHdvdWxkIHJlcXVpcmUgcmVjdXJzaXZlIHRydW5jYXRpb24gb2YKICAgICogdGhlIGlubmVyIEZTQiwgYW5kIGV4dGVuZGluZyB0aGUgYXBwZW5kIG9wZXJhdGlvbnMgdG8gcmVjdXJzZQogICAgKiBpbnRvIHRoZSBpbm5lciBGU0Igd2hlbiBzcGFjZSBleGlzdHMgd2l0aGluIHRoZW0uIENvdWxkIGJlIGRvbmUsCiAgICAqIGJ1dCBub250cml2aWFsIGNoYW5nZSBhbmQgYWRkcyBzb21lIG92ZXJoZWFkIHRvIHRoZSBhcHBlbmQKLSAgICogb3BlcmF0aW9uLiBDb25zaWRlciBhbHRlcm5hdGl2ZXMuICoqKioqCisgICAqIG9wZXJhdGlvbi4gQ29uc2lkZXIgYWx0ZXJuYXRpdmVzLiAKICAgICoKICAgICogQHBhcmFtIGwgTmV3IGxlbmd0aC4gSWYgbDwwIG9yIGw+PWdldExlbmd0aCgpLCB0aGlzIG9wZXJhdGlvbiB3aWxsCiAgICAqIG5vdCByZXBvcnQgYW4gZXJyb3IgYnV0IGZ1dHVyZSBvcGVyYXRpb25zIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBmYWlsLgogICAgKi8KICAgcHVibGljIGZpbmFsIHZvaWQgc2V0TGVuZ3RoKGludCBsKQogICB7Ci0JbV9sYXN0Q2h1bmsgPSBsID4+PiBtX2NodW5rQml0czsKLQlpZihtX2xhc3RDaHVuaz09MCAmJiBtX2lubmVyRlNCIT1udWxsKQotCXsKLQkJbV9pbm5lckZTQi5zZXRMZW5ndGgobCx0aGlzKTsKLQl9Ci0JZWxzZQotCXsKLQkJbV9maXJzdEZyZWUgPSBsICAmICBtX2NodW5rTWFzazsKLQl9CisKKyAgICBtX2xhc3RDaHVuayA9IGwgPj4+IG1fY2h1bmtCaXRzOworCisgICAgaWYgKG1fbGFzdENodW5rID09IDAgJiYgbV9pbm5lckZTQiAhPSBudWxsKQorICAgIHsKKyAgICAgIG1faW5uZXJGU0Iuc2V0TGVuZ3RoKGwsIHRoaXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbV9maXJzdEZyZWUgPSBsICYgbV9jaHVua01hc2s7CisgICAgfQogICB9Ci0gIAotICAvKiogU3Vicm91dGluZSBmb3IgdGhlIHB1YmxpYyBzZXRMZW5ndGgoKSBtZXRob2QuIERlYWxzIHdpdGggdGhlIGZhY3QKKworICAvKioKKyAgICogU3Vicm91dGluZSBmb3IgdGhlIHB1YmxpYyBzZXRMZW5ndGgoKSBtZXRob2QuIERlYWxzIHdpdGggdGhlIGZhY3QKICAgICogdGhhdCB0cnVuY2F0aW9uIG1heSByZXF1aXJlIHJlc3RvcmluZyBvbmUgb2YgdGhlIGlubmVyRlNCcworICAgKgorICAgKiBORUVEU0RPQyBAcGFyYW0gbAorICAgKiBORUVEU0RPQyBAcGFyYW0gcm9vdEZTQgogICAgKi8KLSAgZmluYWwgdm9pZCBzZXRMZW5ndGgoaW50IGwsIEZhc3RTdHJpbmdCdWZmZXIgcm9vdEZTQikKKyAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNldExlbmd0aChpbnQgbCwgRmFzdFN0cmluZ0J1ZmZlciByb290RlNCKQogICB7Ci0JbV9sYXN0Q2h1bmsgPSBsID4+PiBtX2NodW5rQml0czsKLQlpZihtX2xhc3RDaHVuaz09MCAmJiBtX2lubmVyRlNCIT1udWxsKQotCXsKLQkJbV9pbm5lckZTQi5zZXRMZW5ndGgobCxyb290RlNCKTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gVW5kbyBlbmNhcHN1bGF0aW9uIC0tIHBvcCB0aGUgaW5uZXJGU0IgZGF0YSBiYWNrIHVwIHRvIHJvb3QuCi0JCXJvb3RGU0IubV9jaHVua0JpdHMgICA9bV9jaHVua0JpdHM7Ci0gICAgICAgIHJvb3RGU0IubV9tYXhDaHVua0JpdHM9bV9tYXhDaHVua0JpdHM7Ci0gICAgICAgIHJvb3RGU0IubV9yZWJ1bmRsZUJpdHM9bV9yZWJ1bmRsZUJpdHM7Ci0gICAgICAgIHJvb3RGU0IubV9jaHVua1NpemUgICA9bV9jaHVua1NpemU7Ci0gICAgICAgIHJvb3RGU0IubV9jaHVua01hc2sgICA9bV9jaHVua01hc2s7Ci0gICAgICAgIHJvb3RGU0IubV9hcnJheSAgICAgICA9bV9hcnJheTsgCi0JCXJvb3RGU0IubV9pbm5lckZTQiAgICA9bV9pbm5lckZTQjsKLQkJcm9vdEZTQi5tX2xhc3RDaHVuayAgID1tX2xhc3RDaHVuazsgCi0JCQotCQkvLyBGaW5hbGx5LCB0cnVuY2F0ZSB0aGlzIHN1Y2tlci4KLQkJcm9vdEZTQi5tX2ZpcnN0RnJlZSA9IGwgICYgIG1fY2h1bmtNYXNrOwotCX0KKworICAgIG1fbGFzdENodW5rID0gbCA+Pj4gbV9jaHVua0JpdHM7CisKKyAgICBpZiAobV9sYXN0Q2h1bmsgPT0gMCAmJiBtX2lubmVyRlNCICE9IG51bGwpCisgICAgeworICAgICAgbV9pbm5lckZTQi5zZXRMZW5ndGgobCwgcm9vdEZTQik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisKKyAgICAgIC8vIFVuZG8gZW5jYXBzdWxhdGlvbiAtLSBwb3AgdGhlIGlubmVyRlNCIGRhdGEgYmFjayB1cCB0byByb290LgorICAgICAgcm9vdEZTQi5tX2NodW5rQml0cyA9IG1fY2h1bmtCaXRzOworICAgICAgcm9vdEZTQi5tX21heENodW5rQml0cyA9IG1fbWF4Q2h1bmtCaXRzOworICAgICAgcm9vdEZTQi5tX3JlYnVuZGxlQml0cyA9IG1fcmVidW5kbGVCaXRzOworICAgICAgcm9vdEZTQi5tX2NodW5rU2l6ZSA9IG1fY2h1bmtTaXplOworICAgICAgcm9vdEZTQi5tX2NodW5rTWFzayA9IG1fY2h1bmtNYXNrOworICAgICAgcm9vdEZTQi5tX2FycmF5ID0gbV9hcnJheTsKKyAgICAgIHJvb3RGU0IubV9pbm5lckZTQiA9IG1faW5uZXJGU0I7CisgICAgICByb290RlNCLm1fbGFzdENodW5rID0gbV9sYXN0Q2h1bms7CisKKyAgICAgIC8vIEZpbmFsbHksIHRydW5jYXRlIHRoaXMgc3Vja2VyLgorICAgICAgcm9vdEZTQi5tX2ZpcnN0RnJlZSA9IGwgJiBtX2NodW5rTWFzazsKKyAgICB9CiAgIH0KIAogICAvKioKICAgICogTm90ZSB0aGF0IHRoaXMgb3BlcmF0aW9uIGhhcyBiZWVuIHNvbWV3aGF0IGRlb3B0aW1pemVkIGJ5IHRoZSBzaGlmdCB0byBhCi0gICAqIGNodW5rZWQgYXJyYXksIGFzIHRoZXJlIGlzIG5vIGZhY3RvcnkgbWV0aG9kIHRvIHByb2R1Y2UgYSBTdHJpbmcgb2JqZWN0IAorICAgKiBjaHVua2VkIGFycmF5LCBhcyB0aGVyZSBpcyBubyBmYWN0b3J5IG1ldGhvZCB0byBwcm9kdWNlIGEgU3RyaW5nIG9iamVjdAogICAgKiBkaXJlY3RseSBmcm9tIGFuIGFycmF5IG9mIGFycmF5cyBhbmQgaGVuY2UgYSBkb3VibGUgY29weSBpcyBuZWVkZWQuCi0gICAqIEJ5IHVzaW5nIGVuc3VyZUNhcGFjaXR5IHdlIGhvcGUgdG8gbWluaW1pemUgdGhlIGhlYXAgb3ZlcmhlYWQgb2YgYnVpbGRpbmcgCisgICAqIEJ5IHVzaW5nIGVuc3VyZUNhcGFjaXR5IHdlIGhvcGUgdG8gbWluaW1pemUgdGhlIGhlYXAgb3ZlcmhlYWQgb2YgYnVpbGRpbmcKICAgICogdGhlIGludGVybWVkaWF0ZSBTdHJpbmdCdWZmZXIuCiAgICAqIDxwPgogICAgKiAoSXQgcmVhbGx5IGlzIGEgcGl0eSB0aGF0IEphdmEgZGlkbid0IGRlc2lnbiBTdHJpbmcgYXMgYSBmaW5hbCBzdWJjbGFzcwogICAgKiBvZiBNdXRhYmxlU3RyaW5nLCByYXRoZXIgdGhhbiBoYXZpbmcgU3RyaW5nQnVmZmVyIGJlIGEgc2VwYXJhdGUgaGllcmFyY2h5LgogICAgKiBXZSdkIGF2b2lkIGEgPHN0cm9uZz5sb3Q8L3N0cm9uZz4gb2YgZG91YmxlLWJ1ZmZlcmluZy4pCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgRmFzdFN0cmluZ0J1ZmZlciBhcyBhIHN0YW5kYXJkIEphdmEgc3RyaW5nLgogICAgKi8KICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpCiAgIHsKLQlpbnQgbGVuZ3RoPShtX2xhc3RDaHVuazw8bV9jaHVua0JpdHMpK21fZmlyc3RGcmVlOwotICAgIHJldHVybiBnZXRTdHJpbmcobmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpLDAsMCxsZW5ndGgpLnRvU3RyaW5nKCk7CisKKyAgICBpbnQgbGVuZ3RoID0gKG1fbGFzdENodW5rIDw8IG1fY2h1bmtCaXRzKSArIG1fZmlyc3RGcmVlOworCisgICAgcmV0dXJuIGdldFN0cmluZyhuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCksIDAsIDAsIGxlbmd0aCkudG9TdHJpbmcoKTsKICAgfQogCiAgIC8qKgotICAgKiBBcHBlbmQgYSBzaW5nbGUgY2hhcmFjdGVyIG9udG8gdGhlIEZhc3RTdHJpbmdCdWZmZXIsIGdyb3dpbmcgdGhlIAorICAgKiBBcHBlbmQgYSBzaW5nbGUgY2hhcmFjdGVyIG9udG8gdGhlIEZhc3RTdHJpbmdCdWZmZXIsIGdyb3dpbmcgdGhlCiAgICAqIHN0b3JhZ2UgaWYgbmVjZXNzYXJ5LgogICAgKiA8cD4KICAgICogTk9URSBUSEFUIGFmdGVyIGNhbGxpbmcgYXBwZW5kKCksIHByZXZpb3VzbHkgb2J0YWluZWQKQEAgLTM1Niw1MSArMzk2LDU5IEBACiAgICAqLwogICBwdWJsaWMgZmluYWwgdm9pZCBhcHBlbmQoY2hhciB2YWx1ZSkKICAgeworCiAgICAgY2hhcltdIGNodW5rOwotICAgICAgICAgIAorCiAgICAgLy8gV2UgbWF5IGhhdmUgcHJlYWxsb2NhdGVkIGNodW5rcy4gSWYgc28sIGFsbCBidXQgbGFzdCBzaG91bGQKICAgICAvLyBiZSBhdCBmdWxsIHNpemUuCi0gICAgYm9vbGVhbiBsYXN0Y2h1bms9KG1fbGFzdENodW5rKzE9PW1fYXJyYXkubGVuZ3RoKTsKLSAgICAgICAgICAKLSAgICBpZihtX2ZpcnN0RnJlZTxtX2NodW5rU2l6ZSkgLy8gU2ltcGxpZmllZCB0ZXN0IHNpbmdsZS1jaGFyYWN0ZXItZml0cwotICAgICAgY2h1bms9bV9hcnJheVttX2xhc3RDaHVua107Ci0gICAgICAgICAgCisgICAgYm9vbGVhbiBsYXN0Y2h1bmsgPSAobV9sYXN0Q2h1bmsgKyAxID09IG1fYXJyYXkubGVuZ3RoKTsKKworICAgIGlmIChtX2ZpcnN0RnJlZSA8IG1fY2h1bmtTaXplKSAgLy8gU2ltcGxpZmllZCB0ZXN0IHNpbmdsZS1jaGFyYWN0ZXItZml0cworICAgICAgY2h1bmsgPSBtX2FycmF5W21fbGFzdENodW5rXTsKICAgICBlbHNlCisgICAgeworCisgICAgICAvLyBFeHRlbmQgYXJyYXk/CisgICAgICBpbnQgaSA9IG1fYXJyYXkubGVuZ3RoOworCisgICAgICBpZiAobV9sYXN0Q2h1bmsgKyAxID09IGkpCiAgICAgICB7Ci0gICAgICAgIC8vIEV4dGVuZCBhcnJheT8KLSAgICAgICAgaW50IGk9bV9hcnJheS5sZW5ndGg7Ci0gICAgICAgIGlmKG1fbGFzdENodW5rKzE9PWkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hhcltdW10gbmV3YXJyYXk9bmV3IGNoYXJbaSsxNl1bXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobV9hcnJheSwwLG5ld2FycmF5LDAsaSk7Ci0gICAgICAgICAgICBtX2FycmF5PW5ld2FycmF5OwotICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBBZHZhbmNlIG9uZSBjaHVuawotICAgICAgICBjaHVuaz1tX2FycmF5WysrbV9sYXN0Q2h1bmtdOwotICAgICAgICBpZihjaHVuaz09bnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSGllcmFyY2hpY2FsIGVuY2Fwc3VsYXRpb24KLSAgICAgICAgICAgICAgICBpZihtX2xhc3RDaHVuaz09MTw8bV9yZWJ1bmRsZUJpdHMgJiYgbV9jaHVua0JpdHM8bV9tYXhDaHVua0JpdHMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGRvIGFsbCB0aGUgd29yayBvZiBib3RoIGVuY2Fwc3VsYXRpbmcKLSAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGRhdGEgYW5kIGVzdGFibGlzaGluZyBuZXcgc2l6ZXMvb2Zmc2V0cwotICAgICAgICAgICAgICAgICAgbV9pbm5lckZTQj1uZXcgRmFzdFN0cmluZ0J1ZmZlcih0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQWRkIGEgY2h1bmsuCi0gICAgICAgICAgICBjaHVuaz1tX2FycmF5W21fbGFzdENodW5rXT1uZXcgY2hhclttX2NodW5rU2l6ZV07Ci0gICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgCi0gICAgICAgIG1fZmlyc3RGcmVlPTA7CisgICAgICAgIGNoYXJbXVtdIG5ld2FycmF5ID0gbmV3IGNoYXJbaSArIDE2XVtdOworCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobV9hcnJheSwgMCwgbmV3YXJyYXksIDAsIGkpOworCisgICAgICAgIG1fYXJyYXkgPSBuZXdhcnJheTsKICAgICAgIH0KIAorICAgICAgLy8gQWR2YW5jZSBvbmUgY2h1bmsKKyAgICAgIGNodW5rID0gbV9hcnJheVsrK21fbGFzdENodW5rXTsKKworICAgICAgaWYgKGNodW5rID09IG51bGwpCisgICAgICB7CisKKyAgICAgICAgLy8gSGllcmFyY2hpY2FsIGVuY2Fwc3VsYXRpb24KKyAgICAgICAgaWYgKG1fbGFzdENodW5rID09IDEgPDwgbV9yZWJ1bmRsZUJpdHMKKyAgICAgICAgICAgICAgICAmJiBtX2NodW5rQml0cyA8IG1fbWF4Q2h1bmtCaXRzKQorICAgICAgICB7CisKKyAgICAgICAgICAvLyBTaG91bGQgZG8gYWxsIHRoZSB3b3JrIG9mIGJvdGggZW5jYXBzdWxhdGluZworICAgICAgICAgIC8vIGV4aXN0aW5nIGRhdGEgYW5kIGVzdGFibGlzaGluZyBuZXcgc2l6ZXMvb2Zmc2V0cworICAgICAgICAgIG1faW5uZXJGU0IgPSBuZXcgRmFzdFN0cmluZ0J1ZmZlcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBhIGNodW5rLgorICAgICAgICBjaHVuayA9IG1fYXJyYXlbbV9sYXN0Q2h1bmtdID0gbmV3IGNoYXJbbV9jaHVua1NpemVdOworICAgICAgfQorCisgICAgICBtX2ZpcnN0RnJlZSA9IDA7CisgICAgfQorCiAgICAgLy8gU3BhY2UgZXhpc3RzIGluIHRoZSBjaHVuay4gQXBwZW5kIHRoZSBjaGFyYWN0ZXIuCi0gICAgY2h1bmtbbV9maXJzdEZyZWUrK109dmFsdWU7CisgICAgY2h1bmtbbV9maXJzdEZyZWUrK10gPSB2YWx1ZTsKICAgfQogCiAgIC8qKgotICAgKiBBcHBlbmQgdGhlIGNvbnRlbnRzIG9mIGEgU3RyaW5nIG9udG8gdGhlIEZhc3RTdHJpbmdCdWZmZXIsIAorICAgKiBBcHBlbmQgdGhlIGNvbnRlbnRzIG9mIGEgU3RyaW5nIG9udG8gdGhlIEZhc3RTdHJpbmdCdWZmZXIsCiAgICAqIGdyb3dpbmcgdGhlIHN0b3JhZ2UgaWYgbmVjZXNzYXJ5LgogICAgKiA8cD4KICAgICogTk9URSBUSEFUIGFmdGVyIGNhbGxpbmcgYXBwZW5kKCksIHByZXZpb3VzbHkgb2J0YWluZWQKQEAgLTQxMCw1NyArNDU4LDczIEBACiAgICAqLwogICBwdWJsaWMgZmluYWwgdm9pZCBhcHBlbmQoU3RyaW5nIHZhbHVlKQogICB7Ci0gICAgaW50IHN0cmxlbj12YWx1ZS5sZW5ndGgoKTsKKworICAgIGludCBzdHJsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKKwogICAgIGlmICgwID09IHN0cmxlbikKICAgICAgIHJldHVybjsKLSAgICBpbnQgY29weWZyb209MDsKLSAgICBjaGFyW10gY2h1bms9bV9hcnJheVttX2xhc3RDaHVua107Ci0gICAgaW50IGF2YWlsYWJsZT1tX2NodW5rU2l6ZS1tX2ZpcnN0RnJlZTsKLSAgICAgICAgICAKLSAgICAvLyBSZXBlYXQgd2hpbGUgZGF0YSByZW1haW5zIHRvIGJlIGNvcGllZAotICAgIHdoaWxlKHN0cmxlbj4wKQotICAgICAgewotICAgICAgICAvLyBDb3B5IHdoYXQgZml0cwotICAgICAgICBpZihhdmFpbGFibGU+c3RybGVuKSBhdmFpbGFibGU9c3RybGVuOwotICAgICAgICB2YWx1ZS5nZXRDaGFycyhjb3B5ZnJvbSwgY29weWZyb20rYXZhaWxhYmxlLCBtX2FycmF5W21fbGFzdENodW5rXSwgbV9maXJzdEZyZWUpOwotICAgICAgICBzdHJsZW4tPWF2YWlsYWJsZTsKLSAgICAgICAgY29weWZyb20rPWF2YWlsYWJsZTsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgbGVmdCwgYWxsb2NhdGUgYW5vdGhlciBjaHVuayBhbmQgY29udGludWUKLSAgICAgICAgaWYoc3RybGVuPjApCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gRXh0ZW5kIGFycmF5PwotICAgICAgICAgICAgaW50IGk9bV9hcnJheS5sZW5ndGg7Ci0gICAgICAgICAgICBpZihtX2xhc3RDaHVuaysxPT1pKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhcltdW10gbmV3YXJyYXk9bmV3IGNoYXJbaSsxNl1bXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1fYXJyYXksMCxuZXdhcnJheSwwLGkpOwotICAgICAgICAgICAgICAgIG1fYXJyYXk9bmV3YXJyYXk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQWR2YW5jZSBvbmUgY2h1bmsKLSAgICAgICAgICAgIGNodW5rPW1fYXJyYXlbKyttX2xhc3RDaHVua107Ci0gICAgICAgICAgICBpZihjaHVuaz09bnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEhpZXJhcmNoaWNhbCBlbmNhcHN1bGF0aW9uCi0gICAgICAgICAgICAgICAgaWYobV9sYXN0Q2h1bms9PTE8PG1fcmVidW5kbGVCaXRzICYmIG1fY2h1bmtCaXRzPG1fbWF4Q2h1bmtCaXRzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBkbyBhbGwgdGhlIHdvcmsgb2YgYm90aCBlbmNhcHN1bGF0aW5nCi0gICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBkYXRhIGFuZCBlc3RhYmxpc2hpbmcgbmV3IHNpemVzL29mZnNldHMKLSAgICAgICAgICAgICAgICAgIG1faW5uZXJGU0I9bmV3IEZhc3RTdHJpbmdCdWZmZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLy8gQWRkIGEgY2h1bmsuIAotICAgICAgICAgICAgICAgIGNodW5rPW1fYXJyYXlbbV9sYXN0Q2h1bmtdPW5ldyBjaGFyW21fY2h1bmtTaXplXTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZhaWxhYmxlPW1fY2h1bmtTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIG1fZmlyc3RGcmVlPTA7CisgICAgaW50IGNvcHlmcm9tID0gMDsKKyAgICBjaGFyW10gY2h1bmsgPSBtX2FycmF5W21fbGFzdENodW5rXTsKKyAgICBpbnQgYXZhaWxhYmxlID0gbV9jaHVua1NpemUgLSBtX2ZpcnN0RnJlZTsKKworICAgIC8vIFJlcGVhdCB3aGlsZSBkYXRhIHJlbWFpbnMgdG8gYmUgY29waWVkCisgICAgd2hpbGUgKHN0cmxlbiA+IDApCisgICAgeworCisgICAgICAvLyBDb3B5IHdoYXQgZml0cworICAgICAgaWYgKGF2YWlsYWJsZSA+IHN0cmxlbikKKyAgICAgICAgYXZhaWxhYmxlID0gc3RybGVuOworCisgICAgICB2YWx1ZS5nZXRDaGFycyhjb3B5ZnJvbSwgY29weWZyb20gKyBhdmFpbGFibGUsIG1fYXJyYXlbbV9sYXN0Q2h1bmtdLAorICAgICAgICAgICAgICAgICAgICAgbV9maXJzdEZyZWUpOworCisgICAgICBzdHJsZW4gLT0gYXZhaWxhYmxlOworICAgICAgY29weWZyb20gKz0gYXZhaWxhYmxlOworCisgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgbGVmdCwgYWxsb2NhdGUgYW5vdGhlciBjaHVuayBhbmQgY29udGludWUKKyAgICAgIGlmIChzdHJsZW4gPiAwKQorICAgICAgeworCisgICAgICAgIC8vIEV4dGVuZCBhcnJheT8KKyAgICAgICAgaW50IGkgPSBtX2FycmF5Lmxlbmd0aDsKKworICAgICAgICBpZiAobV9sYXN0Q2h1bmsgKyAxID09IGkpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyW11bXSBuZXdhcnJheSA9IG5ldyBjaGFyW2kgKyAxNl1bXTsKKworICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobV9hcnJheSwgMCwgbmV3YXJyYXksIDAsIGkpOworCisgICAgICAgICAgbV9hcnJheSA9IG5ld2FycmF5OworICAgICAgICB9CisKKyAgICAgICAgLy8gQWR2YW5jZSBvbmUgY2h1bmsKKyAgICAgICAgY2h1bmsgPSBtX2FycmF5WysrbV9sYXN0Q2h1bmtdOworCisgICAgICAgIGlmIChjaHVuayA9PSBudWxsKQorICAgICAgICB7CisKKyAgICAgICAgICAvLyBIaWVyYXJjaGljYWwgZW5jYXBzdWxhdGlvbgorICAgICAgICAgIGlmIChtX2xhc3RDaHVuayA9PSAxIDw8IG1fcmVidW5kbGVCaXRzCisgICAgICAgICAgICAgICAgICAmJiBtX2NodW5rQml0cyA8IG1fbWF4Q2h1bmtCaXRzKQorICAgICAgICAgIHsKKworICAgICAgICAgICAgLy8gU2hvdWxkIGRvIGFsbCB0aGUgd29yayBvZiBib3RoIGVuY2Fwc3VsYXRpbmcKKyAgICAgICAgICAgIC8vIGV4aXN0aW5nIGRhdGEgYW5kIGVzdGFibGlzaGluZyBuZXcgc2l6ZXMvb2Zmc2V0cworICAgICAgICAgICAgbV9pbm5lckZTQiA9IG5ldyBGYXN0U3RyaW5nQnVmZmVyKHRoaXMpOwogICAgICAgICAgIH0KKworICAgICAgICAgIC8vIEFkZCBhIGNodW5rLiAKKyAgICAgICAgICBjaHVuayA9IG1fYXJyYXlbbV9sYXN0Q2h1bmtdID0gbmV3IGNoYXJbbV9jaHVua1NpemVdOworICAgICAgICB9CisKKyAgICAgICAgYXZhaWxhYmxlID0gbV9jaHVua1NpemU7CisgICAgICAgIG1fZmlyc3RGcmVlID0gMDsKICAgICAgIH0KLSAgICAgICAgICAKKyAgICB9CisKICAgICAvLyBBZGp1c3QgdGhlIGluc2VydCBwb2ludCBpbiB0aGUgbGFzdCBjaHVuaywgd2hlbiB3ZSd2ZSByZWFjaGVkIGl0LgotICAgIG1fZmlyc3RGcmVlKz1hdmFpbGFibGU7CisgICAgbV9maXJzdEZyZWUgKz0gYXZhaWxhYmxlOwogICB9CiAKICAgLyoqCkBAIC00NzQsNjAgKzUzOCw3NyBAQAogICAgKi8KICAgcHVibGljIGZpbmFsIHZvaWQgYXBwZW5kKFN0cmluZ0J1ZmZlciB2YWx1ZSkKICAgewotICAgIGludCBzdHJsZW49dmFsdWUubGVuZ3RoKCk7CisKKyAgICBpbnQgc3RybGVuID0gdmFsdWUubGVuZ3RoKCk7CisKICAgICBpZiAoMCA9PSBzdHJsZW4pCiAgICAgICByZXR1cm47Ci0gICAgaW50IGNvcHlmcm9tPTA7Ci0gICAgY2hhcltdIGNodW5rPW1fYXJyYXlbbV9sYXN0Q2h1bmtdOwotICAgIGludCBhdmFpbGFibGU9bV9jaHVua1NpemUtbV9maXJzdEZyZWU7Ci0gICAgICAgICAgCisKKyAgICBpbnQgY29weWZyb20gPSAwOworICAgIGNoYXJbXSBjaHVuayA9IG1fYXJyYXlbbV9sYXN0Q2h1bmtdOworICAgIGludCBhdmFpbGFibGUgPSBtX2NodW5rU2l6ZSAtIG1fZmlyc3RGcmVlOworCiAgICAgLy8gUmVwZWF0IHdoaWxlIGRhdGEgcmVtYWlucyB0byBiZSBjb3BpZWQKLSAgICB3aGlsZShzdHJsZW4+MCkKKyAgICB3aGlsZSAoc3RybGVuID4gMCkKKyAgICB7CisKKyAgICAgIC8vIENvcHkgd2hhdCBmaXRzCisgICAgICBpZiAoYXZhaWxhYmxlID4gc3RybGVuKQorICAgICAgICBhdmFpbGFibGUgPSBzdHJsZW47CisKKyAgICAgIHZhbHVlLmdldENoYXJzKGNvcHlmcm9tLCBjb3B5ZnJvbSArIGF2YWlsYWJsZSwgbV9hcnJheVttX2xhc3RDaHVua10sCisgICAgICAgICAgICAgICAgICAgICBtX2ZpcnN0RnJlZSk7CisKKyAgICAgIHN0cmxlbiAtPSBhdmFpbGFibGU7CisgICAgICBjb3B5ZnJvbSArPSBhdmFpbGFibGU7CisKKyAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSBsZWZ0LCBhbGxvY2F0ZSBhbm90aGVyIGNodW5rIGFuZCBjb250aW51ZQorICAgICAgaWYgKHN0cmxlbiA+IDApCiAgICAgICB7Ci0gICAgICAgIC8vIENvcHkgd2hhdCBmaXRzCi0gICAgICAgIGlmKGF2YWlsYWJsZT5zdHJsZW4pIGF2YWlsYWJsZT1zdHJsZW47Ci0gICAgICAgIHZhbHVlLmdldENoYXJzKGNvcHlmcm9tLCBjb3B5ZnJvbSthdmFpbGFibGUsIG1fYXJyYXlbbV9sYXN0Q2h1bmtdLCBtX2ZpcnN0RnJlZSk7Ci0gICAgICAgIHN0cmxlbi09YXZhaWxhYmxlOwotICAgICAgICBjb3B5ZnJvbSs9YXZhaWxhYmxlOwotICAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSBsZWZ0LCBhbGxvY2F0ZSBhbm90aGVyIGNodW5rIGFuZCBjb250aW51ZQotICAgICAgICBpZihzdHJsZW4+MCkKKworICAgICAgICAvLyBFeHRlbmQgYXJyYXk/CisgICAgICAgIGludCBpID0gbV9hcnJheS5sZW5ndGg7CisKKyAgICAgICAgaWYgKG1fbGFzdENodW5rICsgMSA9PSBpKQorICAgICAgICB7CisgICAgICAgICAgY2hhcltdW10gbmV3YXJyYXkgPSBuZXcgY2hhcltpICsgMTZdW107CisKKyAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1fYXJyYXksIDAsIG5ld2FycmF5LCAwLCBpKTsKKworICAgICAgICAgIG1fYXJyYXkgPSBuZXdhcnJheTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkdmFuY2Ugb25lIGNodW5rCisgICAgICAgIGNodW5rID0gbV9hcnJheVsrK21fbGFzdENodW5rXTsKKworICAgICAgICBpZiAoY2h1bmsgPT0gbnVsbCkKKyAgICAgICAgeworCisgICAgICAgICAgLy8gSGllcmFyY2hpY2FsIGVuY2Fwc3VsYXRpb24KKyAgICAgICAgICBpZiAobV9sYXN0Q2h1bmsgPT0gMSA8PCBtX3JlYnVuZGxlQml0cworICAgICAgICAgICAgICAgICAgJiYgbV9jaHVua0JpdHMgPCBtX21heENodW5rQml0cykKICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBFeHRlbmQgYXJyYXk/Ci0gICAgICAgICAgICBpbnQgaT1tX2FycmF5Lmxlbmd0aDsKLSAgICAgICAgICAgIGlmKG1fbGFzdENodW5rKzE9PWkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyW11bXSBuZXdhcnJheT1uZXcgY2hhcltpKzE2XVtdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobV9hcnJheSwwLG5ld2FycmF5LDAsaSk7Ci0gICAgICAgICAgICAgICAgbV9hcnJheT1uZXdhcnJheTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBZHZhbmNlIG9uZSBjaHVuawotICAgICAgICAgICAgY2h1bms9bV9hcnJheVsrK21fbGFzdENodW5rXTsKLSAgICAgICAgICAgIGlmKGNodW5rPT1udWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSGllcmFyY2hpY2FsIGVuY2Fwc3VsYXRpb24KLSAgICAgICAgICAgICAgICBpZihtX2xhc3RDaHVuaz09MTw8bV9yZWJ1bmRsZUJpdHMgJiYgIG1fY2h1bmtCaXRzPG1fbWF4Q2h1bmtCaXRzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBkbyBhbGwgdGhlIHdvcmsgb2YgYm90aCBlbmNhcHN1bGF0aW5nCi0gICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBkYXRhIGFuZCBlc3RhYmxpc2hpbmcgbmV3IHNpemVzL29mZnNldHMKLSAgICAgICAgICAgICAgICAgIG1faW5uZXJGU0I9bmV3IEZhc3RTdHJpbmdCdWZmZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEFkZCBhIGNodW5rLgotICAgICAgICAgICAgICAgIGNodW5rPW1fYXJyYXlbbV9sYXN0Q2h1bmtdPW5ldyBjaGFyW21fY2h1bmtTaXplXTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZhaWxhYmxlPW1fY2h1bmtTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIG1fZmlyc3RGcmVlPTA7CisKKyAgICAgICAgICAgIC8vIFNob3VsZCBkbyBhbGwgdGhlIHdvcmsgb2YgYm90aCBlbmNhcHN1bGF0aW5nCisgICAgICAgICAgICAvLyBleGlzdGluZyBkYXRhIGFuZCBlc3RhYmxpc2hpbmcgbmV3IHNpemVzL29mZnNldHMKKyAgICAgICAgICAgIG1faW5uZXJGU0IgPSBuZXcgRmFzdFN0cmluZ0J1ZmZlcih0aGlzKTsKICAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBBZGQgYSBjaHVuay4KKyAgICAgICAgICBjaHVuayA9IG1fYXJyYXlbbV9sYXN0Q2h1bmtdID0gbmV3IGNoYXJbbV9jaHVua1NpemVdOworICAgICAgICB9CisKKyAgICAgICAgYXZhaWxhYmxlID0gbV9jaHVua1NpemU7CisgICAgICAgIG1fZmlyc3RGcmVlID0gMDsKICAgICAgIH0KLSAgICAgICAgICAKKyAgICB9CisKICAgICAvLyBBZGp1c3QgdGhlIGluc2VydCBwb2ludCBpbiB0aGUgbGFzdCBjaHVuaywgd2hlbiB3ZSd2ZSByZWFjaGVkIGl0LgotICAgIG1fZmlyc3RGcmVlKz1hdmFpbGFibGU7CisgICAgbV9maXJzdEZyZWUgKz0gYXZhaWxhYmxlOwogICB9CiAKICAgLyoqCi0gICAqIEFwcGVuZCBwYXJ0IG9mIHRoZSBjb250ZW50cyBvZiBhIENoYXJhY3RlciBBcnJheSBvbnRvIHRoZSAKKyAgICogQXBwZW5kIHBhcnQgb2YgdGhlIGNvbnRlbnRzIG9mIGEgQ2hhcmFjdGVyIEFycmF5IG9udG8gdGhlCiAgICAqIEZhc3RTdHJpbmdCdWZmZXIsICBncm93aW5nIHRoZSBzdG9yYWdlIGlmIG5lY2Vzc2FyeS4KICAgICogPHA+CiAgICAqIE5PVEUgVEhBVCBhZnRlciBjYWxsaW5nIGFwcGVuZCgpLCBwcmV2aW91c2x5IG9idGFpbmVkCkBAIC01NDAsNjAgKzYyMSw3NyBAQAogICAgKi8KICAgcHVibGljIGZpbmFsIHZvaWQgYXBwZW5kKGNoYXJbXSBjaGFycywgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQogICB7Ci0gICAgaW50IHN0cmxlbj1sZW5ndGg7CisKKyAgICBpbnQgc3RybGVuID0gbGVuZ3RoOworCiAgICAgaWYgKDAgPT0gc3RybGVuKQogICAgICAgcmV0dXJuOwotICAgIGludCBjb3B5ZnJvbT1zdGFydDsKLSAgICBjaGFyW10gY2h1bms9bV9hcnJheVttX2xhc3RDaHVua107Ci0gICAgaW50IGF2YWlsYWJsZT1tX2NodW5rU2l6ZS1tX2ZpcnN0RnJlZTsKLSAgICAgICAgICAKLSAgICAvLyBSZXBlYXQgd2hpbGUgZGF0YSByZW1haW5zIHRvIGJlIGNvcGllZAotICAgIHdoaWxlKHN0cmxlbj4wKQotICAgICAgewotICAgICAgICAvLyBDb3B5IHdoYXQgZml0cwotICAgICAgICBpZihhdmFpbGFibGU+c3RybGVuKSBhdmFpbGFibGU9c3RybGVuOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNoYXJzLGNvcHlmcm9tLCBtX2FycmF5W21fbGFzdENodW5rXSwgbV9maXJzdEZyZWUsIGF2YWlsYWJsZSk7Ci0gICAgICAgIHN0cmxlbi09YXZhaWxhYmxlOwotICAgICAgICBjb3B5ZnJvbSs9YXZhaWxhYmxlOwotICAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSBsZWZ0LCBhbGxvY2F0ZSBhbm90aGVyIGNodW5rIGFuZCBjb250aW51ZQotICAgICAgICBpZihzdHJsZW4+MCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBFeHRlbmQgYXJyYXk/Ci0gICAgICAgICAgICBpbnQgaT1tX2FycmF5Lmxlbmd0aDsKLSAgICAgICAgICAgIGlmKG1fbGFzdENodW5rKzE9PWkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyW11bXSBuZXdhcnJheT1uZXcgY2hhcltpKzE2XVtdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobV9hcnJheSwwLG5ld2FycmF5LDAsaSk7Ci0gICAgICAgICAgICAgICAgbV9hcnJheT1uZXdhcnJheTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBZHZhbmNlIG9uZSBjaHVuawotICAgICAgICAgICAgY2h1bms9bV9hcnJheVsrK21fbGFzdENodW5rXTsKLSAgICAgICAgICAgIGlmKGNodW5rPT1udWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSGllcmFyY2hpY2FsIGVuY2Fwc3VsYXRpb24KLSAgICAgICAgICAgICAgICBpZihtX2xhc3RDaHVuaz09MTw8bV9yZWJ1bmRsZUJpdHMgJiYgIG1fY2h1bmtCaXRzPG1fbWF4Q2h1bmtCaXRzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBkbyBhbGwgdGhlIHdvcmsgb2YgYm90aCBlbmNhcHN1bGF0aW5nCi0gICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBkYXRhIGFuZCBlc3RhYmxpc2hpbmcgbmV3IHNpemVzL29mZnNldHMKLSAgICAgICAgICAgICAgICAgIG1faW5uZXJGU0I9bmV3IEZhc3RTdHJpbmdCdWZmZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEFkZCBhIGNodW5rLgotICAgICAgICAgICAgICAgIGNodW5rPW1fYXJyYXlbbV9sYXN0Q2h1bmtdPW5ldyBjaGFyW21fY2h1bmtTaXplXTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZhaWxhYmxlPW1fY2h1bmtTaXplOwogCi0gICAgICAgICAgICBtX2ZpcnN0RnJlZT0wOworICAgIGludCBjb3B5ZnJvbSA9IHN0YXJ0OworICAgIGNoYXJbXSBjaHVuayA9IG1fYXJyYXlbbV9sYXN0Q2h1bmtdOworICAgIGludCBhdmFpbGFibGUgPSBtX2NodW5rU2l6ZSAtIG1fZmlyc3RGcmVlOworCisgICAgLy8gUmVwZWF0IHdoaWxlIGRhdGEgcmVtYWlucyB0byBiZSBjb3BpZWQKKyAgICB3aGlsZSAoc3RybGVuID4gMCkKKyAgICB7CisKKyAgICAgIC8vIENvcHkgd2hhdCBmaXRzCisgICAgICBpZiAoYXZhaWxhYmxlID4gc3RybGVuKQorICAgICAgICBhdmFpbGFibGUgPSBzdHJsZW47CisKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2hhcnMsIGNvcHlmcm9tLCBtX2FycmF5W21fbGFzdENodW5rXSwgbV9maXJzdEZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSk7CisKKyAgICAgIHN0cmxlbiAtPSBhdmFpbGFibGU7CisgICAgICBjb3B5ZnJvbSArPSBhdmFpbGFibGU7CisKKyAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSBsZWZ0LCBhbGxvY2F0ZSBhbm90aGVyIGNodW5rIGFuZCBjb250aW51ZQorICAgICAgaWYgKHN0cmxlbiA+IDApCisgICAgICB7CisKKyAgICAgICAgLy8gRXh0ZW5kIGFycmF5PworICAgICAgICBpbnQgaSA9IG1fYXJyYXkubGVuZ3RoOworCisgICAgICAgIGlmIChtX2xhc3RDaHVuayArIDEgPT0gaSkKKyAgICAgICAgeworICAgICAgICAgIGNoYXJbXVtdIG5ld2FycmF5ID0gbmV3IGNoYXJbaSArIDE2XVtdOworCisgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtX2FycmF5LCAwLCBuZXdhcnJheSwgMCwgaSk7CisKKyAgICAgICAgICBtX2FycmF5ID0gbmV3YXJyYXk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZHZhbmNlIG9uZSBjaHVuaworICAgICAgICBjaHVuayA9IG1fYXJyYXlbKyttX2xhc3RDaHVua107CisKKyAgICAgICAgaWYgKGNodW5rID09IG51bGwpCisgICAgICAgIHsKKworICAgICAgICAgIC8vIEhpZXJhcmNoaWNhbCBlbmNhcHN1bGF0aW9uCisgICAgICAgICAgaWYgKG1fbGFzdENodW5rID09IDEgPDwgbV9yZWJ1bmRsZUJpdHMKKyAgICAgICAgICAgICAgICAgICYmIG1fY2h1bmtCaXRzIDwgbV9tYXhDaHVua0JpdHMpCisgICAgICAgICAgeworCisgICAgICAgICAgICAvLyBTaG91bGQgZG8gYWxsIHRoZSB3b3JrIG9mIGJvdGggZW5jYXBzdWxhdGluZworICAgICAgICAgICAgLy8gZXhpc3RpbmcgZGF0YSBhbmQgZXN0YWJsaXNoaW5nIG5ldyBzaXplcy9vZmZzZXRzCisgICAgICAgICAgICBtX2lubmVyRlNCID0gbmV3IEZhc3RTdHJpbmdCdWZmZXIodGhpcyk7CiAgICAgICAgICAgfQorCisgICAgICAgICAgLy8gQWRkIGEgY2h1bmsuCisgICAgICAgICAgY2h1bmsgPSBtX2FycmF5W21fbGFzdENodW5rXSA9IG5ldyBjaGFyW21fY2h1bmtTaXplXTsKKyAgICAgICAgfQorCisgICAgICAgIGF2YWlsYWJsZSA9IG1fY2h1bmtTaXplOworICAgICAgICBtX2ZpcnN0RnJlZSA9IDA7CiAgICAgICB9Ci0gICAgICAgICAgCisgICAgfQorCiAgICAgLy8gQWRqdXN0IHRoZSBpbnNlcnQgcG9pbnQgaW4gdGhlIGxhc3QgY2h1bmssIHdoZW4gd2UndmUgcmVhY2hlZCBpdC4KLSAgICBtX2ZpcnN0RnJlZSs9YXZhaWxhYmxlOworICAgIG1fZmlyc3RGcmVlICs9IGF2YWlsYWJsZTsKICAgfQogCiAgIC8qKgotICAgKiBBcHBlbmQgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgRmFzdFN0cmluZ0J1ZmZlciBvbnRvIAorICAgKiBBcHBlbmQgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgRmFzdFN0cmluZ0J1ZmZlciBvbnRvCiAgICAqIHRoaXMgRmFzdFN0cmluZ0J1ZmZlciwgZ3Jvd2luZyB0aGUgc3RvcmFnZSBpZiBuZWNlc3NhcnkuCiAgICAqIDxwPgogICAgKiBOT1RFIFRIQVQgYWZ0ZXIgY2FsbGluZyBhcHBlbmQoKSwgcHJldmlvdXNseSBvYnRhaW5lZApAQCAtNjA0LDExOSArNzAyLDE0NSBAQAogICAgKi8KICAgcHVibGljIGZpbmFsIHZvaWQgYXBwZW5kKEZhc3RTdHJpbmdCdWZmZXIgdmFsdWUpCiAgIHsKKwogICAgIC8vIENvbXBsaWNhdGluZyBmYWN0b3IgaGVyZSBpcyB0aGF0IHRoZSB0d28gYnVmZmVycyBtYXkgdXNlCiAgICAgLy8gZGlmZmVyZW50IGNodW5rIHNpemVzLCBhbmQgZXZlbiBpZiB0aGV5J3JlIHRoZSBzYW1lIHdlJ3JlCiAgICAgLy8gcHJvYmFibHkgb24gYSBkaWZmZXJlbnQgYWxpZ25tZW50IGR1ZSB0byBwcmV2aW91c2x5IGFwcGVuZGVkCiAgICAgLy8gZGF0YS4gV2UgaGF2ZSB0byB3b3JrIHRocm91Z2ggdGhlIHNvdXJjZSBpbiBiaXRlLXNpemVkIGNodW5rcy4KLSAgICBpbnQgc3RybGVuPXZhbHVlLmxlbmd0aCgpOworICAgIGludCBzdHJsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKKwogICAgIGlmICgwID09IHN0cmxlbikKICAgICAgIHJldHVybjsKLSAgICBpbnQgY29weWZyb209MDsKLSAgICBjaGFyW10gY2h1bms9bV9hcnJheVttX2xhc3RDaHVua107Ci0gICAgaW50IGF2YWlsYWJsZT1tX2NodW5rU2l6ZS1tX2ZpcnN0RnJlZTsKLSAgICAgICAgICAKKworICAgIGludCBjb3B5ZnJvbSA9IDA7CisgICAgY2hhcltdIGNodW5rID0gbV9hcnJheVttX2xhc3RDaHVua107CisgICAgaW50IGF2YWlsYWJsZSA9IG1fY2h1bmtTaXplIC0gbV9maXJzdEZyZWU7CisKICAgICAvLyBSZXBlYXQgd2hpbGUgZGF0YSByZW1haW5zIHRvIGJlIGNvcGllZAotICAgIHdoaWxlKHN0cmxlbj4wKQorICAgIHdoaWxlIChzdHJsZW4gPiAwKQorICAgIHsKKworICAgICAgLy8gQ29weSB3aGF0IGZpdHMKKyAgICAgIGlmIChhdmFpbGFibGUgPiBzdHJsZW4pCisgICAgICAgIGF2YWlsYWJsZSA9IHN0cmxlbjsKKworICAgICAgaW50IHNvdXJjZWNodW5rID0gKGNvcHlmcm9tICsgdmFsdWUubV9jaHVua1NpemUgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgPj4+IHZhbHVlLm1fY2h1bmtCaXRzOworICAgICAgaW50IHNvdXJjZWNvbHVtbiA9IGNvcHlmcm9tICYgdmFsdWUubV9jaHVua01hc2s7CisgICAgICBpbnQgcnVubGVuZ3RoID0gdmFsdWUubV9jaHVua1NpemUgLSBzb3VyY2Vjb2x1bW47CisKKyAgICAgIGlmIChydW5sZW5ndGggPiBhdmFpbGFibGUpCisgICAgICAgIHJ1bmxlbmd0aCA9IGF2YWlsYWJsZTsKKworICAgICAgU3lzdGVtLmFycmF5Y29weSh2YWx1ZS5tX2FycmF5W3NvdXJjZWNodW5rXSwgc291cmNlY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICBtX2FycmF5W21fbGFzdENodW5rXSwgbV9maXJzdEZyZWUsIHJ1bmxlbmd0aCk7CisKKyAgICAgIGlmIChydW5sZW5ndGggIT0gYXZhaWxhYmxlKQorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbHVlLm1fYXJyYXlbc291cmNlY2h1bmsgKyAxXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2FycmF5W21fbGFzdENodW5rXSwgbV9maXJzdEZyZWUgKyBydW5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIC0gcnVubGVuZ3RoKTsKKworICAgICAgc3RybGVuIC09IGF2YWlsYWJsZTsKKyAgICAgIGNvcHlmcm9tICs9IGF2YWlsYWJsZTsKKworICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIGxlZnQsIGFsbG9jYXRlIGFub3RoZXIgY2h1bmsgYW5kIGNvbnRpbnVlCisgICAgICBpZiAoc3RybGVuID4gMCkKICAgICAgIHsKLSAgICAgICAgLy8gQ29weSB3aGF0IGZpdHMKLSAgICAgICAgaWYoYXZhaWxhYmxlPnN0cmxlbikgYXZhaWxhYmxlPXN0cmxlbjsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgc291cmNlY2h1bms9KGNvcHlmcm9tK3ZhbHVlLm1fY2h1bmtTaXplLTEpPj4+dmFsdWUubV9jaHVua0JpdHM7Ci0gICAgICAgIGludCBzb3VyY2Vjb2x1bW49Y29weWZyb20gJiB2YWx1ZS5tX2NodW5rTWFzazsKLSAgICAgICAgaW50IHJ1bmxlbmd0aD12YWx1ZS5tX2NodW5rU2l6ZS1zb3VyY2Vjb2x1bW47Ci0gICAgICAgIGlmKHJ1bmxlbmd0aD5hdmFpbGFibGUpIHJ1bmxlbmd0aD1hdmFpbGFibGU7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsdWUubV9hcnJheVtzb3VyY2VjaHVua10sc291cmNlY29sdW1uLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXJyYXlbbV9sYXN0Q2h1bmtdLCBtX2ZpcnN0RnJlZSwgcnVubGVuZ3RoKTsKLSAgICAgICAgaWYocnVubGVuZ3RoIT1hdmFpbGFibGUpCi0gICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh2YWx1ZS5tX2FycmF5W3NvdXJjZWNodW5rKzFdLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FycmF5W21fbGFzdENodW5rXSwgbV9maXJzdEZyZWUrcnVubGVuZ3RoLCBhdmFpbGFibGUtcnVubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBzdHJsZW4tPWF2YWlsYWJsZTsKLSAgICAgICAgY29weWZyb20rPWF2YWlsYWJsZTsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgbGVmdCwgYWxsb2NhdGUgYW5vdGhlciBjaHVuayBhbmQgY29udGludWUKLSAgICAgICAgaWYoc3RybGVuPjApCisKKyAgICAgICAgLy8gRXh0ZW5kIGFycmF5PworICAgICAgICBpbnQgaSA9IG1fYXJyYXkubGVuZ3RoOworCisgICAgICAgIGlmIChtX2xhc3RDaHVuayArIDEgPT0gaSkKKyAgICAgICAgeworICAgICAgICAgIGNoYXJbXVtdIG5ld2FycmF5ID0gbmV3IGNoYXJbaSArIDE2XVtdOworCisgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtX2FycmF5LCAwLCBuZXdhcnJheSwgMCwgaSk7CisKKyAgICAgICAgICBtX2FycmF5ID0gbmV3YXJyYXk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZHZhbmNlIG9uZSBjaHVuaworICAgICAgICBjaHVuayA9IG1fYXJyYXlbKyttX2xhc3RDaHVua107CisKKyAgICAgICAgaWYgKGNodW5rID09IG51bGwpCisgICAgICAgIHsKKworICAgICAgICAgIC8vIEhpZXJhcmNoaWNhbCBlbmNhcHN1bGF0aW9uCisgICAgICAgICAgaWYgKG1fbGFzdENodW5rID09IDEgPDwgbV9yZWJ1bmRsZUJpdHMKKyAgICAgICAgICAgICAgICAgICYmIG1fY2h1bmtCaXRzIDwgbV9tYXhDaHVua0JpdHMpCiAgICAgICAgICAgewotICAgICAgICAgICAgLy8gRXh0ZW5kIGFycmF5PwotICAgICAgICAgICAgaW50IGk9bV9hcnJheS5sZW5ndGg7Ci0gICAgICAgICAgICBpZihtX2xhc3RDaHVuaysxPT1pKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhcltdW10gbmV3YXJyYXk9bmV3IGNoYXJbaSsxNl1bXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1fYXJyYXksMCxuZXdhcnJheSwwLGkpOwotICAgICAgICAgICAgICAgIG1fYXJyYXk9bmV3YXJyYXk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQWR2YW5jZSBvbmUgY2h1bmsKLSAgICAgICAgICAgIGNodW5rPW1fYXJyYXlbKyttX2xhc3RDaHVua107Ci0gICAgICAgICAgICBpZihjaHVuaz09bnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEhpZXJhcmNoaWNhbCBlbmNhcHN1bGF0aW9uCi0gICAgICAgICAgICAgICAgaWYobV9sYXN0Q2h1bms9PTE8PG1fcmVidW5kbGVCaXRzICYmICBtX2NodW5rQml0czxtX21heENodW5rQml0cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBTaG91bGQgZG8gYWxsIHRoZSB3b3JrIG9mIGJvdGggZW5jYXBzdWxhdGluZwotICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgZGF0YSBhbmQgZXN0YWJsaXNoaW5nIG5ldyBzaXplcy9vZmZzZXRzCi0gICAgICAgICAgICAgICAgICBtX2lubmVyRlNCPW5ldyBGYXN0U3RyaW5nQnVmZmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBBZGQgYSBjaHVuay4gCi0gICAgICAgICAgICAgICAgY2h1bms9bV9hcnJheVttX2xhc3RDaHVua109bmV3IGNoYXJbbV9jaHVua1NpemVdOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdmFpbGFibGU9bV9jaHVua1NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgbV9maXJzdEZyZWU9MDsKKworICAgICAgICAgICAgLy8gU2hvdWxkIGRvIGFsbCB0aGUgd29yayBvZiBib3RoIGVuY2Fwc3VsYXRpbmcKKyAgICAgICAgICAgIC8vIGV4aXN0aW5nIGRhdGEgYW5kIGVzdGFibGlzaGluZyBuZXcgc2l6ZXMvb2Zmc2V0cworICAgICAgICAgICAgbV9pbm5lckZTQiA9IG5ldyBGYXN0U3RyaW5nQnVmZmVyKHRoaXMpOwogICAgICAgICAgIH0KKworICAgICAgICAgIC8vIEFkZCBhIGNodW5rLiAKKyAgICAgICAgICBjaHVuayA9IG1fYXJyYXlbbV9sYXN0Q2h1bmtdID0gbmV3IGNoYXJbbV9jaHVua1NpemVdOworICAgICAgICB9CisKKyAgICAgICAgYXZhaWxhYmxlID0gbV9jaHVua1NpemU7CisgICAgICAgIG1fZmlyc3RGcmVlID0gMDsKICAgICAgIH0KLSAgICAgICAgICAKKyAgICB9CisKICAgICAvLyBBZGp1c3QgdGhlIGluc2VydCBwb2ludCBpbiB0aGUgbGFzdCBjaHVuaywgd2hlbiB3ZSd2ZSByZWFjaGVkIGl0LgotICAgIG1fZmlyc3RGcmVlKz1hdmFpbGFibGU7CisgICAgbV9maXJzdEZyZWUgKz0gYXZhaWxhYmxlOwogICB9CiAKLSAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIGNoYXJhY3RlcnMgYXJlIGFsbCB3aGl0ZXNwYWNlLAorICAvKioKKyAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgY2hhcmFjdGVycyBhcmUgYWxsIHdoaXRlc3BhY2UsCiAgICAqIGFzIGRlZmluZWQgYnkgWE1MQ2hhcmFjdGVyUmVjb2duaXplci4KICAgICogPHA+CiAgICAqIENVUlJFTlRMWSBET0VTIE5PVCBDSEVDSyBGT1IgT1VULU9GLVJBTkdFLgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHN0YXJ0IE9mZnNldCBvZiBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlLgogICAgKiBAcGFyYW0gbGVuZ3RoIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNlbmQuCiAgICAqLwogICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQogICB7Ci0gICAgaW50IHNvdXJjZWNodW5rPXN0YXJ0ID4+PiBtX2NodW5rQml0czsKLSAgICBpbnQgc291cmNlY29sdW1uPXN0YXJ0ICYgbV9jaHVua01hc2s7Ci0gICAgaW50IGF2YWlsYWJsZT1tX2NodW5rU2l6ZS1zb3VyY2Vjb2x1bW47Ci0JYm9vbGVhbiBjaHVua09LOwotICAgICAgICAgIAotICAgIHdoaWxlKGxlbmd0aD4wKQotICAgICAgewotICAgICAgICBpbnQgcnVubGVuZ3RoPShsZW5ndGg8PWF2YWlsYWJsZSkgPyBsZW5ndGggOiBhdmFpbGFibGU7Ci0JCQotCQlpZihzb3VyY2VjaHVuaz09MCAmJiBtX2lubmVyRlNCIT1udWxsKQotCQkJY2h1bmtPSz1tX2lubmVyRlNCLmlzV2hpdGVzcGFjZShzb3VyY2Vjb2x1bW4scnVubGVuZ3RoKTsKLQkJZWxzZQotCQkJY2h1bmtPSz1vcmcuYXBhY2hlLnhtbC51dGlscy5YTUxDaGFyYWN0ZXJSZWNvZ25pemVyCi0JCQkgICAgLmlzV2hpdGVTcGFjZShtX2FycmF5W3NvdXJjZWNodW5rXSxzb3VyY2Vjb2x1bW4scnVubGVuZ3RoKTsKLQkJaWYoIWNodW5rT0spCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgbGVuZ3RoLT1ydW5sZW5ndGg7Ci0gICAgICAgICsrc291cmNlY2h1bms7Ci0gICAgICAgIHNvdXJjZWNvbHVtbj0wOwotICAgICAgICBhdmFpbGFibGU9bV9jaHVua1NpemU7Ci0gICAgICB9Ci0gICAgICAgICAgCisKKyAgICBpbnQgc291cmNlY2h1bmsgPSBzdGFydCA+Pj4gbV9jaHVua0JpdHM7CisgICAgaW50IHNvdXJjZWNvbHVtbiA9IHN0YXJ0ICYgbV9jaHVua01hc2s7CisgICAgaW50IGF2YWlsYWJsZSA9IG1fY2h1bmtTaXplIC0gc291cmNlY29sdW1uOworICAgIGJvb2xlYW4gY2h1bmtPSzsKKworICAgIHdoaWxlIChsZW5ndGggPiAwKQorICAgIHsKKyAgICAgIGludCBydW5sZW5ndGggPSAobGVuZ3RoIDw9IGF2YWlsYWJsZSkgPyBsZW5ndGggOiBhdmFpbGFibGU7CisKKyAgICAgIGlmIChzb3VyY2VjaHVuayA9PSAwICYmIG1faW5uZXJGU0IgIT0gbnVsbCkKKyAgICAgICAgY2h1bmtPSyA9IG1faW5uZXJGU0IuaXNXaGl0ZXNwYWNlKHNvdXJjZWNvbHVtbiwgcnVubGVuZ3RoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgY2h1bmtPSyA9IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTENoYXJhY3RlclJlY29nbml6ZXIuaXNXaGl0ZVNwYWNlKAorICAgICAgICAgIG1fYXJyYXlbc291cmNlY2h1bmtdLCBzb3VyY2Vjb2x1bW4sIHJ1bmxlbmd0aCk7CisKKyAgICAgIGlmICghY2h1bmtPSykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBsZW5ndGggLT0gcnVubGVuZ3RoOworCisgICAgICArK3NvdXJjZWNodW5rOworCisgICAgICBzb3VyY2Vjb2x1bW4gPSAwOworICAgICAgYXZhaWxhYmxlID0gbV9jaHVua1NpemU7CisgICAgfQorCiAgICAgcmV0dXJuIHRydWU7CiAgIH0KLSAgCisKICAgLyoqCiAgICAqIEBwYXJhbSBzdGFydCBPZmZzZXQgb2YgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSByYW5nZS4KICAgICogQHBhcmFtIGxlbmd0aCBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBzZW5kLgotICAgKiBAcmV0dXJuIGEgbmV3IFN0cmluZyBvYmplY3QgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIAorICAgKiBAcmV0dXJuIGEgbmV3IFN0cmluZyBvYmplY3QgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mCiAgICAqIGNoYXJhY3RlcnMuCiAgICAqLwogICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgc3RhcnQsIGludCBsZW5ndGgpCiAgIHsKLSAgICByZXR1cm4gZ2V0U3RyaW5nKG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKSxzdGFydD4+Pm1fY2h1bmtCaXRzLHN0YXJ0Jm1fY2h1bmtNYXNrLGxlbmd0aCkudG9TdHJpbmcoKTsKKyAgICByZXR1cm4gZ2V0U3RyaW5nKG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKSwgc3RhcnQgPj4+IG1fY2h1bmtCaXRzLAorICAgICAgICAgICAgICAgICAgICAgc3RhcnQgJiBtX2NodW5rTWFzaywgbGVuZ3RoKS50b1N0cmluZygpOwogICB9Ci0gIAorCiAgIC8qKgogICAgKiBAcGFyYW0gc2IgU3RyaW5nQnVmZmVyIHRvIGJlIGFwcGVuZGVkIHRvCiAgICAqIEBwYXJhbSBzdGFydCBPZmZzZXQgb2YgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSByYW5nZS4KQEAgLTcyNSw1NiArODQ5LDgzIEBACiAgICAqLwogICBTdHJpbmdCdWZmZXIgZ2V0U3RyaW5nKFN0cmluZ0J1ZmZlciBzYiwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQogICB7Ci0gICAgcmV0dXJuIGdldFN0cmluZyhzYixzdGFydD4+Pm1fY2h1bmtCaXRzLHN0YXJ0Jm1fY2h1bmtNYXNrLGxlbmd0aCk7CisgICAgcmV0dXJuIGdldFN0cmluZyhzYiwgc3RhcnQgPj4+IG1fY2h1bmtCaXRzLCBzdGFydCAmIG1fY2h1bmtNYXNrLCBsZW5ndGgpOwogICB9Ci0gIAotICAvKiogSW50ZXJuYWwgc3VwcG9ydCBmb3IgdG9TdHJpbmcoKSBhbmQgZ2V0U3RyaW5nKCkuCisKKyAgLyoqCisgICAqIEludGVybmFsIHN1cHBvcnQgZm9yIHRvU3RyaW5nKCkgYW5kIGdldFN0cmluZygpLgogICAgKiBQTEVBU0UgTk9URSBTSUdOQVRVUkUgQ0hBTkdFIGZyb20gZWFybGllciB2ZXJzaW9uczsgaXQgbm93IGFwcGVuZHMgaW50bwotICAgKiBhbmQgcmV0dXJucyBhIFN0cmluZ0J1ZmZlciBzdXBwbGllZCBieSB0aGUgY2FsbGVyLiBUaGlzIHNpbXBsaWZpZXMgCisgICAqIGFuZCByZXR1cm5zIGEgU3RyaW5nQnVmZmVyIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIuIFRoaXMgc2ltcGxpZmllcwogICAgKiBtX2lubmVyRlNCIHN1cHBvcnQuCiAgICAqIDxwPgogICAgKiBOb3RlIHRoYXQgdGhpcyBvcGVyYXRpb24gaGFzIGJlZW4gc29tZXdoYXQgZGVvcHRpbWl6ZWQgYnkgdGhlIHNoaWZ0IHRvIGEKLSAgICogY2h1bmtlZCBhcnJheSwgYXMgdGhlcmUgaXMgbm8gZmFjdG9yeSBtZXRob2QgdG8gcHJvZHVjZSBhIFN0cmluZyBvYmplY3QgCisgICAqIGNodW5rZWQgYXJyYXksIGFzIHRoZXJlIGlzIG5vIGZhY3RvcnkgbWV0aG9kIHRvIHByb2R1Y2UgYSBTdHJpbmcgb2JqZWN0CiAgICAqIGRpcmVjdGx5IGZyb20gYW4gYXJyYXkgb2YgYXJyYXlzIGFuZCBoZW5jZSBhIGRvdWJsZSBjb3B5IGlzIG5lZWRlZC4KLSAgICogQnkgcHJlc2V0dGluZyBsZW5ndGggd2UgaG9wZSB0byBtaW5pbWl6ZSB0aGUgaGVhcCBvdmVyaGVhZCBvZiBidWlsZGluZyAKKyAgICogQnkgcHJlc2V0dGluZyBsZW5ndGggd2UgaG9wZSB0byBtaW5pbWl6ZSB0aGUgaGVhcCBvdmVyaGVhZCBvZiBidWlsZGluZwogICAgKiB0aGUgaW50ZXJtZWRpYXRlIFN0cmluZ0J1ZmZlci4KICAgICogPHA+CiAgICAqIChJdCByZWFsbHkgaXMgYSBwaXR5IHRoYXQgSmF2YSBkaWRuJ3QgZGVzaWduIFN0cmluZyBhcyBhIGZpbmFsIHN1YmNsYXNzCiAgICAqIG9mIE11dGFibGVTdHJpbmcsIHJhdGhlciB0aGFuIGhhdmluZyBTdHJpbmdCdWZmZXIgYmUgYSBzZXBhcmF0ZSBoaWVyYXJjaHkuCiAgICAqIFdlJ2QgYXZvaWQgYSA8c3Ryb25nPmxvdDwvc3Ryb25nPiBvZiBkb3VibGUtYnVmZmVyaW5nLikKKyAgICoKKyAgICoKKyAgICogQHBhcmFtIHNiCisgICAqIEBwYXJhbSBzdGFydENodW5rCisgICAqIEBwYXJhbSBzdGFydENvbHVtbgorICAgKiBAcGFyYW0gbGVuZ3RoCiAgICAqIAogICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgRmFzdFN0cmluZ0J1ZmZlciBhcyBhIHN0YW5kYXJkIEphdmEgc3RyaW5nLgogICAgKi8KLSAgU3RyaW5nQnVmZmVyIGdldFN0cmluZyhTdHJpbmdCdWZmZXIgc2IsaW50IHN0YXJ0Q2h1bmssaW50IHN0YXJ0Q29sdW1uLGludCBsZW5ndGgpCisgIFN0cmluZ0J1ZmZlciBnZXRTdHJpbmcoU3RyaW5nQnVmZmVyIHNiLCBpbnQgc3RhcnRDaHVuaywgaW50IHN0YXJ0Q29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpCiAgIHsKLSAgICBpbnQgc3RvcD0oc3RhcnRDaHVuazw8bV9jaHVua0JpdHMpK3N0YXJ0Q29sdW1uK2xlbmd0aDsKLSAgICBpbnQgc3RvcENodW5rPXN0b3A+Pj5tX2NodW5rQml0czsKLSAgICBpbnQgc3RvcENvbHVtbj1zdG9wJm1fY2h1bmtNYXNrOwotICAgICAgCi0JLy8gRmFjdG9yZWQgb3V0CisKKyAgICBpbnQgc3RvcCA9IChzdGFydENodW5rIDw8IG1fY2h1bmtCaXRzKSArIHN0YXJ0Q29sdW1uICsgbGVuZ3RoOworICAgIGludCBzdG9wQ2h1bmsgPSBzdG9wID4+PiBtX2NodW5rQml0czsKKyAgICBpbnQgc3RvcENvbHVtbiA9IHN0b3AgJiBtX2NodW5rTWFzazsKKworICAgIC8vIEZhY3RvcmVkIG91dAogICAgIC8vU3RyaW5nQnVmZmVyIHNiPW5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLSAgICAgICAgICAKLSAgICBmb3IoaW50IGk9c3RhcnRDaHVuaztpPHN0b3BDaHVuazsrK2kpCi0gICAgICB7Ci0JCWlmKGk9PTAgJiYgbV9pbm5lckZTQiE9bnVsbCkKLQkJCW1faW5uZXJGU0IuZ2V0U3RyaW5nKHNiLHN0YXJ0Q29sdW1uLG1fY2h1bmtTaXplLXN0YXJ0Q29sdW1uKTsKLQkJZWxzZQotCQkJc2IuYXBwZW5kKG1fYXJyYXlbaV0sc3RhcnRDb2x1bW4sbV9jaHVua1NpemUtc3RhcnRDb2x1bW4pOwotICAgICAgICBzdGFydENvbHVtbj0wOyAvLyBhZnRlciBmaXJzdCBjaHVuawotICAgICAgfQorICAgIGZvciAoaW50IGkgPSBzdGFydENodW5rOyBpIDwgc3RvcENodW5rOyArK2kpCisgICAgeworICAgICAgaWYgKGkgPT0gMCAmJiBtX2lubmVyRlNCICE9IG51bGwpCisgICAgICAgIG1faW5uZXJGU0IuZ2V0U3RyaW5nKHNiLCBzdGFydENvbHVtbiwgbV9jaHVua1NpemUgLSBzdGFydENvbHVtbik7CisgICAgICBlbHNlCisgICAgICAgIHNiLmFwcGVuZChtX2FycmF5W2ldLCBzdGFydENvbHVtbiwgbV9jaHVua1NpemUgLSBzdGFydENvbHVtbik7CiAKLQlpZihzdG9wQ2h1bms9PTAgJiYgbV9pbm5lckZTQiE9bnVsbCkKLQkJbV9pbm5lckZTQi5nZXRTdHJpbmcoc2Isc3RhcnRDb2x1bW4sc3RvcENvbHVtbi1zdGFydENvbHVtbik7Ci0JZWxzZSBpZihzdG9wQ29sdW1uPnN0YXJ0Q29sdW1uKQotCQlzYi5hcHBlbmQobV9hcnJheVtzdG9wQ2h1bmtdLHN0YXJ0Q29sdW1uLHN0b3BDb2x1bW4tc3RhcnRDb2x1bW4pOworICAgICAgc3RhcnRDb2x1bW4gPSAwOyAgLy8gYWZ0ZXIgZmlyc3QgY2h1bmsKKyAgICB9CiAKLQlyZXR1cm4gc2I7CisgICAgaWYgKHN0b3BDaHVuayA9PSAwICYmIG1faW5uZXJGU0IgIT0gbnVsbCkKKyAgICAgIG1faW5uZXJGU0IuZ2V0U3RyaW5nKHNiLCBzdGFydENvbHVtbiwgc3RvcENvbHVtbiAtIHN0YXJ0Q29sdW1uKTsKKyAgICBlbHNlIGlmIChzdG9wQ29sdW1uID4gc3RhcnRDb2x1bW4pCisgICAgICBzYi5hcHBlbmQobV9hcnJheVtzdG9wQ2h1bmtdLCBzdGFydENvbHVtbiwgc3RvcENvbHVtbiAtIHN0YXJ0Q29sdW1uKTsKKworICAgIHJldHVybiBzYjsKICAgfQotICAKLSAgLyoqIFNlbmRzIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgY2hhcmFjdGVycyBhcyBvbmUgb3IgbW9yZSBTQVggY2hhcmFjdGVycygpCisKKyAgLyoqCisgICAqIEdldCBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3RyaW5nIGJ1ZmZlci4KKyAgICoKKyAgICoKKyAgICogQHBhcmFtIHBvcyBjaGFyYWN0ZXIgcG9zaXRpb24gcmVxdWVzdGVkLgorICAgKiBAcmV0dXJuIEEgY2hhcmFjdGVyIGZyb20gdGhlIHJlcXVlc3RlZCBwb3NpdGlvbi4KKyAgICovCisgIHB1YmxpYyBjaGFyIGNoYXJBdChpbnQgcG9zKQorICB7CisgICAgaW50IHN0YXJ0Q2h1bmsgPSBwb3MgPj4+IG1fY2h1bmtCaXRzOworCisgICAgaWYgKHN0YXJ0Q2h1bmsgPT0gMCAmJiBtX2lubmVyRlNCICE9IG51bGwpCisgICAgICByZXR1cm4gbV9pbm5lckZTQi5jaGFyQXQocG9zICYgbV9jaHVua01hc2spOworICAgIGVsc2UKKyAgICAgIHJldHVybiBtX2FycmF5W3N0YXJ0Q2h1bmtdW3BvcyAmIG1fY2h1bmtNYXNrXTsKKyAgfQorCisgIC8qKgorICAgKiBTZW5kcyB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIGNoYXJhY3RlcnMgYXMgb25lIG9yIG1vcmUgU0FYIGNoYXJhY3RlcnMoKQogICAgKiBldmVudHMuCi0gICAqIE5vdGUgdGhhdCB0aGUgYnVmZmVyIHJlZmVyZW5jZSBwYXNzZWQgdG8gdGhlIENvbnRlbnRIYW5kbGVyIG1heSBiZSAKLSAgICogaW52YWxpZGF0ZWQgaWYgdGhlIEZhc3RTdHJpbmdCdWZmZXIgaXMgZWRpdGVkOyBpdCdzIHRoZSB1c2VyJ3MgCisgICAqIE5vdGUgdGhhdCB0aGUgYnVmZmVyIHJlZmVyZW5jZSBwYXNzZWQgdG8gdGhlIENvbnRlbnRIYW5kbGVyIG1heSBiZQorICAgKiBpbnZhbGlkYXRlZCBpZiB0aGUgRmFzdFN0cmluZ0J1ZmZlciBpcyBlZGl0ZWQ7IGl0J3MgdGhlIHVzZXIncwogICAgKiByZXNwb25zaWJpbGl0eSB0byBtYW5hZ2UgYWNjZXNzIHRvIHRoZSBGYXN0U3RyaW5nQnVmZmVyIHRvIHByZXZlbnQgdGhpcwogICAgKiBwcm9ibGVtIGZyb20gYXJpc2luZy4KICAgICogPHA+CkBAIC03ODIsNjggKzkzMywxMjcgQEAKICAgICogc2luZ2xlIGNhbGwuIEFzIGlzIGFsd2F5cyB0cnVlIGluIFNBWCwgb25lIGxvZ2ljYWwgc3RyaW5nIG1heSBiZSBzcGxpdAogICAgKiBhY3Jvc3MgbXVsdGlwbGUgYmxvY2tzIG9mIG1lbW9yeSBhbmQgaGVuY2UgZGVsaXZlcmVkIGFzIHNldmVyYWwKICAgICogc3VjY2Vzc2l2ZSBldmVudHMuCi0gICAqIAorICAgKgogICAgKiBAcGFyYW0gY2ggU0FYIENvbnRlbnRIYW5kbGVyIG9iamVjdCB0byByZWNlaXZlIHRoZSBldmVudC4KICAgICogQHBhcmFtIHN0YXJ0IE9mZnNldCBvZiBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlLgogICAgKiBAcGFyYW0gbGVuZ3RoIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNlbmQuCiAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYnkgaGFuZGxlcidzCiAgICAqIGNoYXJhY3RlcnMoKSBtZXRob2QuCiAgICAqLwotICBwdWJsaWMgdm9pZCBzZW5kU0FYY2hhcmFjdGVycyhvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBjaCxpbnQgc3RhcnQsIGludCBsZW5ndGgpIAotICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgcHVibGljIHZvaWQgc2VuZFNBWGNoYXJhY3RlcnMoCisgICAgICAgICAgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkKKyAgICAgICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KICAgewotICAgIGludCBzdG9wPXN0YXJ0K2xlbmd0aDsKLSAgICBpbnQgc3RhcnRDaHVuaz1zdGFydD4+Pm1fY2h1bmtCaXRzOwotICAgIGludCBzdGFydENvbHVtbj1zdGFydCZtX2NodW5rTWFzazsKLSAgICBpbnQgc3RvcENodW5rPXN0b3A+Pj5tX2NodW5rQml0czsKLSAgICBpbnQgc3RvcENvbHVtbj1zdG9wJm1fY2h1bmtNYXNrOwotICAgICAgICAgIAotICAgIGZvcihpbnQgaT1zdGFydENodW5rO2k8c3RvcENodW5rOysraSkKLSAgICAgIHsKLQkJaWYoaT09MCAmJiBtX2lubmVyRlNCIT1udWxsKQotCQkJbV9pbm5lckZTQi5zZW5kU0FYY2hhcmFjdGVycyhjaCxzdGFydENvbHVtbixtX2NodW5rU2l6ZS1zdGFydENvbHVtbik7Ci0JCWVsc2UKLQkJCWNoLmNoYXJhY3RlcnMobV9hcnJheVtpXSxzdGFydENvbHVtbixtX2NodW5rU2l6ZS1zdGFydENvbHVtbik7Ci0gICAgICAgIHN0YXJ0Q29sdW1uPTA7IC8vIGFmdGVyIGZpcnN0IGNodW5rCi0gICAgICB9CisKKyAgICBpbnQgc3RvcCA9IHN0YXJ0ICsgbGVuZ3RoOworICAgIGludCBzdGFydENodW5rID0gc3RhcnQgPj4+IG1fY2h1bmtCaXRzOworICAgIGludCBzdGFydENvbHVtbiA9IHN0YXJ0ICYgbV9jaHVua01hc2s7CisgICAgaW50IHN0b3BDaHVuayA9IHN0b3AgPj4+IG1fY2h1bmtCaXRzOworICAgIGludCBzdG9wQ29sdW1uID0gc3RvcCAmIG1fY2h1bmtNYXNrOworCisgICAgZm9yIChpbnQgaSA9IHN0YXJ0Q2h1bms7IGkgPCBzdG9wQ2h1bms7ICsraSkKKyAgICB7CisgICAgICBpZiAoaSA9PSAwICYmIG1faW5uZXJGU0IgIT0gbnVsbCkKKyAgICAgICAgbV9pbm5lckZTQi5zZW5kU0FYY2hhcmFjdGVycyhjaCwgc3RhcnRDb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jaHVua1NpemUgLSBzdGFydENvbHVtbik7CisgICAgICBlbHNlCisgICAgICAgIGNoLmNoYXJhY3RlcnMobV9hcnJheVtpXSwgc3RhcnRDb2x1bW4sIG1fY2h1bmtTaXplIC0gc3RhcnRDb2x1bW4pOworCisgICAgICBzdGFydENvbHVtbiA9IDA7ICAvLyBhZnRlciBmaXJzdCBjaHVuaworICAgIH0KIAogICAgIC8vIExhc3QsIG9yIG9ubHksIGNodW5rCi0JaWYoc3RvcENodW5rPT0wICYmIG1faW5uZXJGU0IhPW51bGwpCi0JCW1faW5uZXJGU0Iuc2VuZFNBWGNoYXJhY3RlcnMoY2gsc3RhcnRDb2x1bW4sc3RvcENvbHVtbi1zdGFydENvbHVtbik7Ci0JZWxzZSBpZihzdG9wQ29sdW1uPnN0YXJ0Q29sdW1uKQotCSAgICBjaC5jaGFyYWN0ZXJzKG1fYXJyYXlbc3RvcENodW5rXSxzdGFydENvbHVtbixzdG9wQ29sdW1uLXN0YXJ0Q29sdW1uKTsKKyAgICBpZiAoc3RvcENodW5rID09IDAgJiYgbV9pbm5lckZTQiAhPSBudWxsKQorICAgICAgbV9pbm5lckZTQi5zZW5kU0FYY2hhcmFjdGVycyhjaCwgc3RhcnRDb2x1bW4sIHN0b3BDb2x1bW4gLSBzdGFydENvbHVtbik7CisgICAgZWxzZSBpZiAoc3RvcENvbHVtbiA+IHN0YXJ0Q29sdW1uKQorICAgICAgY2guY2hhcmFjdGVycyhtX2FycmF5W3N0b3BDaHVua10sIHN0YXJ0Q29sdW1uLAorICAgICAgICAgICAgICAgICAgICBzdG9wQ29sdW1uIC0gc3RhcnRDb2x1bW4pOworICB9CisgIAorICAvKioKKyAgICogU2VuZHMgdGhlIHNwZWNpZmllZCByYW5nZSBvZiBjaGFyYWN0ZXJzIGFzIHNheCBDb21tZW50LgorICAgKiA8cD4KKyAgICogTm90ZSB0aGF0LCB1bmxpa2Ugc2VuZFNBWGNoYXJhY3RlcnMsIHRoaXMgaGFzIHRvIGJlIGRvbmUgYXMgYSBzaW5nbGUgCisgICAqIGNhbGwgdG8gTGV4aWNhbEhhbmRsZXIjY29tbWVudC4KKyAgICoKKyAgICogQHBhcmFtIGNoIFNBWCBMZXhpY2FsSGFuZGxlciBvYmplY3QgdG8gcmVjZWl2ZSB0aGUgZXZlbnQuCisgICAqIEBwYXJhbSBzdGFydCBPZmZzZXQgb2YgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSByYW5nZS4KKyAgICogQHBhcmFtIGxlbmd0aCBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBzZW5kLgorICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IGhhbmRsZXIncworICAgKiBjaGFyYWN0ZXJzKCkgbWV0aG9kLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2VuZFNBWENvbW1lbnQoCisgICAgICAgICAgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCisgICAgICAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKworICAgIC8vICVPUFQlIERvIGl0IHRoaXMgd2F5IGZvciBub3cuLi4KKyAgICBTdHJpbmcgY29tbWVudCA9IGdldFN0cmluZyhzdGFydCwgbGVuZ3RoKTsKKyAgICBjaC5jb21tZW50KGNvbW1lbnQudG9DaGFyQXJyYXkoKSwgMCwgbGVuZ3RoKTsKICAgfQogCi0gIC8qKiBFbmNhcHN1bGF0aW9uIGMndG9yLiBBZnRlciB0aGlzIGlzIGNhbGxlZCwgdGhlIHNvdXJjZSBGYXN0U3RyaW5nQnVmZmVyCisgIC8qKgorICAgKiBDb3BpZXMgY2hhcmFjdGVycyBmcm9tIHRoaXMgc3RyaW5nIGludG8gdGhlIGRlc3RpbmF0aW9uIGNoYXJhY3RlcgorICAgKiBhcnJheS4KKyAgICoKKyAgICogQHBhcmFtICAgICAgc3JjQmVnaW4gICBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcKKyAgICogICAgICAgICAgICAgICAgICAgICAgICB0byBjb3B5LgorICAgKiBAcGFyYW0gICAgICBzcmNFbmQgICAgIGluZGV4IGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gY29weS4KKyAgICogQHBhcmFtICAgICAgZHN0ICAgICAgICB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAqIEBwYXJhbSAgICAgIGRzdEJlZ2luICAgdGhlIHN0YXJ0IG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZworICAgKiAgICAgICAgICAgIGlzIHRydWU6CisgICAqICAgICAgICAgICAgPHVsPjxsaT48Y29kZT5zcmNCZWdpbjwvY29kZT4gaXMgbmVnYXRpdmUuCisgICAqICAgICAgICAgICAgPGxpPjxjb2RlPnNyY0JlZ2luPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+c3JjRW5kPC9jb2RlPgorICAgKiAgICAgICAgICAgIDxsaT48Y29kZT5zcmNFbmQ8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMKKyAgICogICAgICAgICAgICAgICAgc3RyaW5nCisgICAqICAgICAgICAgICAgPGxpPjxjb2RlPmRzdEJlZ2luPC9jb2RlPiBpcyBuZWdhdGl2ZQorICAgKiAgICAgICAgICAgIDxsaT48Y29kZT5kc3RCZWdpbisoc3JjRW5kLXNyY0JlZ2luKTwvY29kZT4gaXMgbGFyZ2VyIHRoYW4KKyAgICogICAgICAgICAgICAgICAgPGNvZGU+ZHN0Lmxlbmd0aDwvY29kZT48L3VsPgorICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmRzdDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICovCisgIHByaXZhdGUgdm9pZCBnZXRDaGFycyhpbnQgc3JjQmVnaW4sIGludCBzcmNFbmQsIGNoYXIgZHN0W10sIGludCBkc3RCZWdpbikKKyAgeworICAgIC8vICVUQkQlIEpvZSBuZWVkcyB0byB3cml0ZSB0aGlzIGZ1bmN0aW9uLiAgTWFrZSBwdWJsaWMgd2hlbiBpbXBsZW1lbnRlZC4KKyAgfQorCisgIC8qKgorICAgKiBFbmNhcHN1bGF0aW9uIGMndG9yLiBBZnRlciB0aGlzIGlzIGNhbGxlZCwgdGhlIHNvdXJjZSBGYXN0U3RyaW5nQnVmZmVyCiAgICAqIHdpbGwgYmUgcmVzZXQgdG8gdXNlIHRoZSBuZXcgb2JqZWN0IGFzIGl0cyBtX2lubmVyRlNCLCBhbmQgd2lsbCBoYXZlCiAgICAqIGhhZCBpdHMgY2h1bmsgc2l6ZSByZXNldCBhcHByb3ByaWF0ZWx5LiBJVCBTSE9VTEQgTkVWRVIgQkUgQ0FMTEVECiAgICAqIEVYQ0VQVCBXSEVOIHNvdXJjZS5sZW5ndGgoKT09MTw8KHNvdXJjZS5tX2NodW5rQml0cytzb3VyY2UubV9yZWJ1bmRsZUJpdHMpCisgICAqCisgICAqIE5FRURTRE9DIEBwYXJhbSBzb3VyY2UKICAgICovCiAgIHByaXZhdGUgRmFzdFN0cmluZ0J1ZmZlcihGYXN0U3RyaW5nQnVmZmVyIHNvdXJjZSkKICAgewotICAgICAgICAvLyBDb3B5IGV4aXN0aW5nIGluZm9ybWF0aW9uIGludG8gbmV3IGVuY2Fwc3VsYXRpb24KLSAgICAgICAgbV9jaHVua0JpdHMgICA9c291cmNlLm1fY2h1bmtCaXRzOwotICAgICAgICBtX21heENodW5rQml0cz1zb3VyY2UubV9tYXhDaHVua0JpdHM7Ci0gICAgICAgIG1fcmVidW5kbGVCaXRzPXNvdXJjZS5tX3JlYnVuZGxlQml0czsKLSAgICAgICAgbV9jaHVua1NpemUgICA9c291cmNlLm1fY2h1bmtTaXplOwotICAgICAgICBtX2NodW5rTWFzayAgID1zb3VyY2UubV9jaHVua01hc2s7Ci0gICAgICAgIG1fYXJyYXkgICAgICAgPXNvdXJjZS5tX2FycmF5OyAKLQkJbV9pbm5lckZTQiAgICA9c291cmNlLm1faW5uZXJGU0I7Ci0JCS8vIFRoZXNlIGhhdmUgdG8gYmUgYWRqdXN0ZWQgYmVjYXVzZSB3ZSdyZSBjYWxsaW5nIGp1c3QgYXQgdGhlIHRpbWUKLQkJLy8gd2hlbiB3ZSB3b3VsZCBiZSBhYm91dCB0byBhbGxvY2F0ZSBhbm90aGVyIGNodW5rCi0gICAgICAgIG1fbGFzdENodW5rICAgPXNvdXJjZS5tX2xhc3RDaHVuay0xOyAKLSAgICAgICAgbV9maXJzdEZyZWUgICA9c291cmNlLm1fY2h1bmtTaXplOwotICAgICAgICAKLSAgICAgICAgLy8gRXN0YWJsaXNoIGNhcHN1bGUgYXMgdGhlIElubmVyIEZTQiwgcmVzZXQgY2h1bmsgc2l6ZXMvYWRkcmVzc2luZwotCQlzb3VyY2UubV9hcnJheSA9IG5ldyBjaGFyWzE2XVtdOwotICAgICAgICBzb3VyY2UubV9pbm5lckZTQj10aGlzOyAKLQkJLy8gU2luY2Ugd2UgZW5jYXBzdWxhdGVkIGp1c3QgYXMgd2Ugd2VyZSBhYm91dCB0byBhcHBlbmQgYW5vdGhlcgotCQkvLyBjaHVuaywgcmV0dXJuIHJlYWR5IHRvIGNyZWF0ZSB0aGUgY2h1bmsgYWZ0ZXIgdGhlIGlubmVyRlNCCi0JCS8vIC0tIDEsIG5vdCAwLgotICAgICAgICBzb3VyY2UubV9sYXN0Q2h1bms9MTsKLSAgICAgICAgc291cmNlLm1fZmlyc3RGcmVlPTA7Ci0gICAgICAgIHNvdXJjZS5tX2NodW5rQml0cys9bV9yZWJ1bmRsZUJpdHM7Ci0gICAgICAgIHNvdXJjZS5tX2NodW5rU2l6ZT0xPDwoc291cmNlLm1fY2h1bmtCaXRzKTsgCi0gICAgICAgIHNvdXJjZS5tX2NodW5rTWFzaz1zb3VyY2UubV9jaHVua1NpemUtMTsKKworICAgIC8vIENvcHkgZXhpc3RpbmcgaW5mb3JtYXRpb24gaW50byBuZXcgZW5jYXBzdWxhdGlvbgorICAgIG1fY2h1bmtCaXRzID0gc291cmNlLm1fY2h1bmtCaXRzOworICAgIG1fbWF4Q2h1bmtCaXRzID0gc291cmNlLm1fbWF4Q2h1bmtCaXRzOworICAgIG1fcmVidW5kbGVCaXRzID0gc291cmNlLm1fcmVidW5kbGVCaXRzOworICAgIG1fY2h1bmtTaXplID0gc291cmNlLm1fY2h1bmtTaXplOworICAgIG1fY2h1bmtNYXNrID0gc291cmNlLm1fY2h1bmtNYXNrOworICAgIG1fYXJyYXkgPSBzb3VyY2UubV9hcnJheTsKKyAgICBtX2lubmVyRlNCID0gc291cmNlLm1faW5uZXJGU0I7CisKKyAgICAvLyBUaGVzZSBoYXZlIHRvIGJlIGFkanVzdGVkIGJlY2F1c2Ugd2UncmUgY2FsbGluZyBqdXN0IGF0IHRoZSB0aW1lCisgICAgLy8gd2hlbiB3ZSB3b3VsZCBiZSBhYm91dCB0byBhbGxvY2F0ZSBhbm90aGVyIGNodW5rCisgICAgbV9sYXN0Q2h1bmsgPSBzb3VyY2UubV9sYXN0Q2h1bmsgLSAxOworICAgIG1fZmlyc3RGcmVlID0gc291cmNlLm1fY2h1bmtTaXplOworCisgICAgLy8gRXN0YWJsaXNoIGNhcHN1bGUgYXMgdGhlIElubmVyIEZTQiwgcmVzZXQgY2h1bmsgc2l6ZXMvYWRkcmVzc2luZworICAgIHNvdXJjZS5tX2FycmF5ID0gbmV3IGNoYXJbMTZdW107CisgICAgc291cmNlLm1faW5uZXJGU0IgPSB0aGlzOworCisgICAgLy8gU2luY2Ugd2UgZW5jYXBzdWxhdGVkIGp1c3QgYXMgd2Ugd2VyZSBhYm91dCB0byBhcHBlbmQgYW5vdGhlcgorICAgIC8vIGNodW5rLCByZXR1cm4gcmVhZHkgdG8gY3JlYXRlIHRoZSBjaHVuayBhZnRlciB0aGUgaW5uZXJGU0IKKyAgICAvLyAtLSAxLCBub3QgMC4KKyAgICBzb3VyY2UubV9sYXN0Q2h1bmsgPSAxOworICAgIHNvdXJjZS5tX2ZpcnN0RnJlZSA9IDA7CisgICAgc291cmNlLm1fY2h1bmtCaXRzICs9IG1fcmVidW5kbGVCaXRzOworICAgIHNvdXJjZS5tX2NodW5rU2l6ZSA9IDEgPDwgKHNvdXJjZS5tX2NodW5rQml0cyk7CisgICAgc291cmNlLm1fY2h1bmtNYXNrID0gc291cmNlLm1fY2h1bmtTaXplIC0gMTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL0ludFN0YWNrLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvSW50U3RhY2suamF2YQppbmRleCBmYzQ1NjdlLi4yZmViZGQ3IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvSW50U3RhY2suamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvSW50U3RhY2suamF2YQpAQCAtMTQ0LDYgKzE0NCwxOCBAQAogICB9CiAKICAgLyoqCisgICAqIExvb2tzIGF0IHRoZSBvYmplY3QgYXQgdGhlIHBvc2l0aW9uIHRoZSBzdGFjayBjb3VudGluZyBkb3duIG4gaXRlbXMuCisgICAqCisgICAqIEBwYXJhbSBuIFRoZSBudW1iZXIgb2YgaXRlbXMgZG93biwgaW5kZXhlZCBmcm9tIHplcm8uCisgICAqIEByZXR1cm4gICAgIHRoZSBvYmplY3QgYXQgbiBpdGVtcyBkb3duLgorICAgKiBAdGhyb3dzICBFbXB0eVN0YWNrRXhjZXB0aW9uICBpZiB0aGlzIHN0YWNrIGlzIGVtcHR5LgorICAgKi8KKyAgcHVibGljIGludCBwZWVrKGludCBuKQorICB7CisgICAgcmV0dXJuIG1fbWFwW21fZmlyc3RGcmVlLSgxK24pXTsKKyAgfQorCisgIC8qKgogICAgKiBTZXRzIGFuIG9iamVjdCBhdCBhIHRoZSB0b3Agb2YgdGhlIHN0YXRjawogICAgKgogICAgKgpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL0ludFZlY3Rvci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL0ludFZlY3Rvci5qYXZhCmluZGV4IDU2ZGYxZmUuLjI0MmU5NTcgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9JbnRWZWN0b3IuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvSW50VmVjdG9yLmphdmEKQEAgLTEwOSw2ICsxMDksMTcgQEAKICAgewogICAgIHJldHVybiBtX2ZpcnN0RnJlZTsKICAgfQorICAKKyAgLyoqCisgICAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0LgorICAgKgorICAgKiBAcmV0dXJuIGxlbmd0aCBvZiB0aGUgbGlzdAorICAgKi8KKyAgcHVibGljIGZpbmFsIHZvaWQgc2V0U2l6ZShpbnQgc3opCisgIHsKKyAgICBtX2ZpcnN0RnJlZSA9IHN6OworICB9CisKIAogICAvKioKICAgICogQXBwZW5kIGEgaW50IG9udG8gdGhlIHZlY3Rvci4KQEAgLTEzMyw2ICsxNDQsNTUgQEAKIAogICAgIG1fZmlyc3RGcmVlKys7CiAgIH0KKyAgCisgIC8qKgorICAgKiBBcHBlbmQgc2V2ZXJhbCBpbnQgdmFsdWVzIG9udG8gdGhlIHZlY3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHZhbHVlIEludCB0byBhZGQgdG8gdGhlIGxpc3QgCisgICAqLworICBwdWJsaWMgZmluYWwgdm9pZCBhZGRFbGVtZW50cyhpbnQgdmFsdWUsIGludCBudW1iZXJPZkVsZW1lbnRzKQorICB7CisKKyAgICBpZiAoKG1fZmlyc3RGcmVlICsgbnVtYmVyT2ZFbGVtZW50cykgPj0gbV9tYXBTaXplKQorICAgIHsKKyAgICAgIG1fbWFwU2l6ZSArPSAobV9ibG9ja3NpemUrbnVtYmVyT2ZFbGVtZW50cyk7CisKKyAgICAgIGludCBuZXdNYXBbXSA9IG5ldyBpbnRbbV9tYXBTaXplXTsKKworICAgICAgU3lzdGVtLmFycmF5Y29weShtX21hcCwgMCwgbmV3TWFwLCAwLCBtX2ZpcnN0RnJlZSArIDEpOworCisgICAgICBtX21hcCA9IG5ld01hcDsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mRWxlbWVudHM7IGkrKykgCisgICAgeworICAgICAgbV9tYXBbbV9maXJzdEZyZWVdID0gdmFsdWU7CisgICAgICBtX2ZpcnN0RnJlZSsrOworICAgIH0KKyAgfQorICAKKyAgLyoqCisgICAqIEFwcGVuZCBzZXZlcmFsIHNsb3RzIG9udG8gdGhlIHZlY3RvciwgYnV0IGRvIG5vdCBzZXQgdGhlIHZhbHVlcy4KKyAgICoKKyAgICogQHBhcmFtIHZhbHVlIEludCB0byBhZGQgdG8gdGhlIGxpc3QgCisgICAqLworICBwdWJsaWMgZmluYWwgdm9pZCBhZGRFbGVtZW50cyhpbnQgbnVtYmVyT2ZFbGVtZW50cykKKyAgeworCisgICAgaWYgKChtX2ZpcnN0RnJlZSArIG51bWJlck9mRWxlbWVudHMpID49IG1fbWFwU2l6ZSkKKyAgICB7CisgICAgICBtX21hcFNpemUgKz0gKG1fYmxvY2tzaXplK251bWJlck9mRWxlbWVudHMpOworCisgICAgICBpbnQgbmV3TWFwW10gPSBuZXcgaW50W21fbWFwU2l6ZV07CisKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkobV9tYXAsIDAsIG5ld01hcCwgMCwgbV9maXJzdEZyZWUgKyAxKTsKKworICAgICAgbV9tYXAgPSBuZXdNYXA7CisgICAgfQorICAgIAorICAgIG1fZmlyc3RGcmVlICs9IG51bWJlck9mRWxlbWVudHM7CisgIH0KKyAgCiAKICAgLyoqCiAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBub2RlIGluIHRoaXMgdmVjdG9yIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCkBAIC0yNDUsOSArMzA1LDkgQEAKICAgICogQHBhcmFtIG5vZGUgb2JqZWN0IHRvIHNldAogICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2Ygd2hlcmUgdG8gc2V0IHRoZSBvYmplY3QKICAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldEVsZW1lbnRBdChpbnQgbm9kZSwgaW50IGluZGV4KQorICBwdWJsaWMgZmluYWwgdm9pZCBzZXRFbGVtZW50QXQoaW50IHZhbHVlLCBpbnQgaW5kZXgpCiAgIHsKLSAgICBtX21hcFtpbmRleF0gPSBub2RlOworICAgIG1fbWFwW2luZGV4XSA9IHZhbHVlOwogICB9CiAKICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvTm9kZVZlY3Rvci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL05vZGVWZWN0b3IuamF2YQppbmRleCAwNzZmNTIwLi4zOTE3NTJkIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvTm9kZVZlY3Rvci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9Ob2RlVmVjdG9yLmphdmEKQEAgLTU3LDggKzU3LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS54bWwudXRpbHM7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogLyoqCiAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KQEAgLTczLDcgKzcyLDcgQEAKIAogICAvKiogQXJyYXkgb2Ygbm9kZXMgdGhpcyBwb2ludHMgdG8uCiAgICAqICBAc2VyaWFsICAgICAgICAgICovCi0gIHByaXZhdGUgTm9kZSBtX21hcFtdOworICBwcml2YXRlIGludCBtX21hcFtdOwogCiAgIC8qKiBOdW1iZXIgb2Ygbm9kZXMgaW4gdGhpcyBOb2RlVmVjdG9yLgogICAgKiAgQHNlcmlhbCAgICAgICAgICAqLwpAQCAtMTE3LDcgKzExNiw3IEBACiAKICAgICBpZiAoKG51bGwgIT0gdGhpcy5tX21hcCkgJiYgKHRoaXMubV9tYXAgPT0gY2xvbmUubV9tYXApKQogICAgIHsKLSAgICAgIGNsb25lLm1fbWFwID0gbmV3IE5vZGVbdGhpcy5tX21hcC5sZW5ndGhdOworICAgICAgY2xvbmUubV9tYXAgPSBuZXcgaW50W3RoaXMubV9tYXAubGVuZ3RoXTsKIAogICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLm1fbWFwLCAwLCBjbG9uZS5tX21hcCwgMCwgdGhpcy5tX21hcC5sZW5ndGgpOwogICAgIH0KQEAgLTE0MCwyMSArMTM5LDIxIEBACiAgICAqCiAgICAqIEBwYXJhbSB2YWx1ZSBOb2RlIHRvIGFkZCB0byB0aGUgdmVjdG9yCiAgICAqLwotICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KE5vZGUgdmFsdWUpCisgIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoaW50IHZhbHVlKQogICB7CiAKICAgICBpZiAoKG1fZmlyc3RGcmVlICsgMSkgPj0gbV9tYXBTaXplKQogICAgIHsKICAgICAgIGlmIChudWxsID09IG1fbWFwKQogICAgICAgewotICAgICAgICBtX21hcCA9IG5ldyBOb2RlW21fYmxvY2tzaXplXTsKKyAgICAgICAgbV9tYXAgPSBuZXcgaW50W21fYmxvY2tzaXplXTsKICAgICAgICAgbV9tYXBTaXplID0gbV9ibG9ja3NpemU7CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgIG1fbWFwU2l6ZSArPSBtX2Jsb2Nrc2l6ZTsKIAotICAgICAgICBOb2RlIG5ld01hcFtdID0gbmV3IE5vZGVbbV9tYXBTaXplXTsKKyAgICAgICAgaW50IG5ld01hcFtdID0gbmV3IGludFttX21hcFNpemVdOwogCiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobV9tYXAsIDAsIG5ld01hcCwgMCwgbV9maXJzdEZyZWUgKyAxKTsKIApAQCAtMTcyLDcgKzE3MSw3IEBACiAgICAqCiAgICAqIEBwYXJhbSB2YWx1ZSBOb2RlIHRvIGFkZCB0byB0aGUgdmVjdG9yCiAgICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBwdXNoKE5vZGUgdmFsdWUpCisgIHB1YmxpYyBmaW5hbCB2b2lkIHB1c2goaW50IHZhbHVlKQogICB7CiAKICAgICBpbnQgZmYgPSBtX2ZpcnN0RnJlZTsKQEAgLTE4MSwxNCArMTgwLDE0IEBACiAgICAgewogICAgICAgaWYgKG51bGwgPT0gbV9tYXApCiAgICAgICB7Ci0gICAgICAgIG1fbWFwID0gbmV3IE5vZGVbbV9ibG9ja3NpemVdOworICAgICAgICBtX21hcCA9IG5ldyBpbnRbbV9ibG9ja3NpemVdOwogICAgICAgICBtX21hcFNpemUgPSBtX2Jsb2Nrc2l6ZTsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgbV9tYXBTaXplICs9IG1fYmxvY2tzaXplOwogCi0gICAgICAgIE5vZGUgbmV3TWFwW10gPSBuZXcgTm9kZVttX21hcFNpemVdOworICAgICAgICBpbnQgbmV3TWFwW10gPSBuZXcgaW50W21fbWFwU2l6ZV07CiAKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtX21hcCwgMCwgbmV3TWFwLCAwLCBmZiArIDEpOwogCkBAIC0yMDgsMTQgKzIwNywxNCBAQAogICAgKgogICAgKiBAcmV0dXJuIHRoZSBub2RlIGF0IHRoZSB0YWlsIG9mIHRoZSB2ZWN0b3IKICAgICovCi0gIHB1YmxpYyBmaW5hbCBOb2RlIHBvcCgpCisgIHB1YmxpYyBmaW5hbCBpbnQgcG9wKCkKICAgewogCiAgICAgbV9maXJzdEZyZWUtLTsKIAotICAgIE5vZGUgbiA9IG1fbWFwW21fZmlyc3RGcmVlXTsKKyAgICBpbnQgbiA9IG1fbWFwW21fZmlyc3RGcmVlXTsKIAotICAgIG1fbWFwW21fZmlyc3RGcmVlXSA9IG51bGw7CisgICAgbV9tYXBbbV9maXJzdEZyZWVdID0gRFRNLk5VTEw7CiAKICAgICByZXR1cm4gbjsKICAgfQpAQCAtMjI2LDE0ICsyMjUsMTQgQEAKICAgICoKICAgICogQHJldHVybiBUaGUgdG9wIG9mIHRoZSBzdGFjayBhZnRlciBpdCdzIGJlZW4gcG9wcGVkIAogICAgKi8KLSAgcHVibGljIGZpbmFsIE5vZGUgcG9wQW5kVG9wKCkKKyAgcHVibGljIGZpbmFsIGludCBwb3BBbmRUb3AoKQogICB7CiAKICAgICBtX2ZpcnN0RnJlZS0tOwogCi0gICAgbV9tYXBbbV9maXJzdEZyZWVdID0gbnVsbDsKKyAgICBtX21hcFttX2ZpcnN0RnJlZV0gPSBEVE0uTlVMTDsKIAotICAgIHJldHVybiAobV9maXJzdEZyZWUgPT0gMCkgPyBudWxsIDogbV9tYXBbbV9maXJzdEZyZWUgLSAxXTsKKyAgICByZXR1cm4gKG1fZmlyc3RGcmVlID09IDApID8gRFRNLk5VTEwgOiBtX21hcFttX2ZpcnN0RnJlZSAtIDFdOwogICB9CiAKICAgLyoqCkBAIC0yNDQsNyArMjQzLDcgQEAKIAogICAgIG1fZmlyc3RGcmVlLS07CiAKLSAgICBtX21hcFttX2ZpcnN0RnJlZV0gPSBudWxsOworICAgIG1fbWFwW21fZmlyc3RGcmVlXSA9IERUTS5OVUxMOwogICB9CiAKICAgLyoqCkBAIC0yNTQsMTAgKzI1MywxMCBAQAogICAgKgogICAgKiBAcmV0dXJuIE5vZGUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgb3IgbnVsbCBpZiBzdGFjayBpcyBlbXB0eS4gIAogICAgKi8KLSAgcHVibGljIGZpbmFsIE5vZGUgcGVlcE9yTnVsbCgpCisgIHB1YmxpYyBmaW5hbCBpbnQgcGVlcE9yTnVsbCgpCiAgIHsKICAgICByZXR1cm4gKChudWxsICE9IG1fbWFwKSAmJiAobV9maXJzdEZyZWUgPiAwKSkKLSAgICAgICAgICAgPyBtX21hcFttX2ZpcnN0RnJlZSAtIDFdIDogbnVsbDsKKyAgICAgICAgICAgPyBtX21hcFttX2ZpcnN0RnJlZSAtIDFdIDogRFRNLk5VTEw7CiAgIH0KIAogICAvKioKQEAgLTI2OCwxMiArMjY3LDEyIEBACiAgICAqIEBwYXJhbSB2MSBGaXJzdCBub2RlIHRvIGFkZCB0byB2ZWN0b3IKICAgICogQHBhcmFtIHYyIFNlY29uZCBub2RlIHRvIGFkZCB0byB2ZWN0b3IKICAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHB1c2hQYWlyKE5vZGUgdjEsIE5vZGUgdjIpCisgIHB1YmxpYyBmaW5hbCB2b2lkIHB1c2hQYWlyKGludCB2MSwgaW50IHYyKQogICB7CiAKICAgICBpZiAobnVsbCA9PSBtX21hcCkKICAgICB7Ci0gICAgICBtX21hcCA9IG5ldyBOb2RlW21fYmxvY2tzaXplXTsKKyAgICAgIG1fbWFwID0gbmV3IGludFttX2Jsb2Nrc2l6ZV07CiAgICAgICBtX21hcFNpemUgPSBtX2Jsb2Nrc2l6ZTsKICAgICB9CiAgICAgZWxzZQpAQCAtMjgyLDcgKzI4MSw3IEBACiAgICAgICB7CiAgICAgICAgIG1fbWFwU2l6ZSArPSBtX2Jsb2Nrc2l6ZTsKIAotICAgICAgICBOb2RlIG5ld01hcFtdID0gbmV3IE5vZGVbbV9tYXBTaXplXTsKKyAgICAgICAgaW50IG5ld01hcFtdID0gbmV3IGludFttX21hcFNpemVdOwogCiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobV9tYXAsIDAsIG5ld01hcCwgMCwgbV9maXJzdEZyZWUpOwogCkBAIC0zMDQsOCArMzAzLDggQEAKICAgewogCiAgICAgbV9maXJzdEZyZWUgLT0gMjsKLSAgICBtX21hcFttX2ZpcnN0RnJlZV0gPSBudWxsOwotICAgIG1fbWFwW21fZmlyc3RGcmVlICsgMV0gPSBudWxsOworICAgIG1fbWFwW21fZmlyc3RGcmVlXSA9IERUTS5OVUxMOworICAgIG1fbWFwW21fZmlyc3RGcmVlICsgMV0gPSBEVE0uTlVMTDsKICAgfQogCiAgIC8qKgpAQCAtMzE1LDcgKzMxNCw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBuIE5vZGUgdG8gc2V0IGF0IHRoZSB0YWlsIG9mIHZlY3RvcgogICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0VGFpbChOb2RlIG4pCisgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFRhaWwoaW50IG4pCiAgIHsKICAgICBtX21hcFttX2ZpcnN0RnJlZSAtIDFdID0gbjsKICAgfQpAQCAtMzI3LDcgKzMyNiw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBuIE5vZGUgdG8gc2V0CiAgICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRUYWlsU3ViMShOb2RlIG4pCisgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFRhaWxTdWIxKGludCBuKQogICB7CiAgICAgbV9tYXBbbV9maXJzdEZyZWUgLSAyXSA9IG47CiAgIH0KQEAgLTMzOSw3ICszMzgsNyBAQAogICAgKgogICAgKiBAcmV0dXJuIE5vZGUgYXQgdGhlIHRhaWwgb2YgdGhlIHZlY3RvcgogICAgKi8KLSAgcHVibGljIGZpbmFsIE5vZGUgcGVlcFRhaWwoKQorICBwdWJsaWMgZmluYWwgaW50IHBlZXBUYWlsKCkKICAgewogICAgIHJldHVybiBtX21hcFttX2ZpcnN0RnJlZSAtIDFdOwogICB9CkBAIC0zNTEsMTAgKzM1MCwyOSBAQAogICAgKgogICAgKiBAcmV0dXJuIE5vZGUgb25lIGF3YXkgZnJvbSB0aGUgdGFpbAogICAgKi8KLSAgcHVibGljIGZpbmFsIE5vZGUgcGVlcFRhaWxTdWIxKCkKKyAgcHVibGljIGZpbmFsIGludCBwZWVwVGFpbFN1YjEoKQogICB7CiAgICAgcmV0dXJuIG1fbWFwW21fZmlyc3RGcmVlIC0gMl07CiAgIH0KKyAgCisgIC8qKgorICAgKiBJbnNlcnQgYSBub2RlIGluIG9yZGVyIGluIHRoZSBsaXN0LgorICAgKiAKKyAgICogQHBhcmFtIHZhbHVlIE5vZGUgdG8gaW5zZXJ0CisgICAqLworICBwdWJsaWMgdm9pZCBpbnNlcnRJbk9yZGVyKGludCB2YWx1ZSkKKyAgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9maXJzdEZyZWU7IGkrKykgCisgICAgeworICAgICAgaWYodmFsdWUgPCBtX21hcFtpXSkKKyAgICAgIHsKKyAgICAgICAgaW5zZXJ0RWxlbWVudEF0KHZhbHVlLCBpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBhZGRFbGVtZW50KHZhbHVlKTsKKyAgICAKKyAgfQogCiAgIC8qKgogICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgbm9kZSBpbiB0aGlzIHZlY3RvciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgpAQCAtMzY1LDE5ICszODMsMTkgQEAKICAgICogQHBhcmFtIHZhbHVlIE5vZGUgdG8gaW5zZXJ0CiAgICAqIEBwYXJhbSBhdCBQb3NpdGlvbiB3aGVyZSB0byBpbnNlcnQKICAgICovCi0gIHB1YmxpYyB2b2lkIGluc2VydEVsZW1lbnRBdChOb2RlIHZhbHVlLCBpbnQgYXQpCisgIHB1YmxpYyB2b2lkIGluc2VydEVsZW1lbnRBdChpbnQgdmFsdWUsIGludCBhdCkKICAgewogCiAgICAgaWYgKG51bGwgPT0gbV9tYXApCiAgICAgewotICAgICAgbV9tYXAgPSBuZXcgTm9kZVttX2Jsb2Nrc2l6ZV07CisgICAgICBtX21hcCA9IG5ldyBpbnRbbV9ibG9ja3NpemVdOwogICAgICAgbV9tYXBTaXplID0gbV9ibG9ja3NpemU7CiAgICAgfQogICAgIGVsc2UgaWYgKChtX2ZpcnN0RnJlZSArIDEpID49IG1fbWFwU2l6ZSkKICAgICB7CiAgICAgICBtX21hcFNpemUgKz0gbV9ibG9ja3NpemU7CiAKLSAgICAgIE5vZGUgbmV3TWFwW10gPSBuZXcgTm9kZVttX21hcFNpemVdOworICAgICAgaW50IG5ld01hcFtdID0gbmV3IGludFttX21hcFNpemVdOwogCiAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1fbWFwLCAwLCBuZXdNYXAsIDAsIG1fZmlyc3RGcmVlICsgMSk7CiAKQEAgLTQwNywxMyArNDI1LDEzIEBACiAgICAgaWYgKG51bGwgPT0gbV9tYXApCiAgICAgewogICAgICAgbV9tYXBTaXplID0gbk5vZGVzICsgbV9ibG9ja3NpemU7Ci0gICAgICBtX21hcCA9IG5ldyBOb2RlW21fbWFwU2l6ZV07CisgICAgICBtX21hcCA9IG5ldyBpbnRbbV9tYXBTaXplXTsKICAgICB9CiAgICAgZWxzZSBpZiAoKG1fZmlyc3RGcmVlICsgbk5vZGVzKSA+PSBtX21hcFNpemUpCiAgICAgewogICAgICAgbV9tYXBTaXplICs9IChuTm9kZXMgKyBtX2Jsb2Nrc2l6ZSk7CiAKLSAgICAgIE5vZGUgbmV3TWFwW10gPSBuZXcgTm9kZVttX21hcFNpemVdOworICAgICAgaW50IG5ld01hcFtdID0gbmV3IGludFttX21hcFNpemVdOwogCiAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1fbWFwLCAwLCBuZXdNYXAsIDAsIG1fZmlyc3RGcmVlICsgbk5vZGVzKTsKIApAQCAtNDM5LDcgKzQ1Nyw3IEBACiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fZmlyc3RGcmVlOyBpKyspCiAgICAgewotICAgICAgbV9tYXBbaV0gPSBudWxsOworICAgICAgbV9tYXBbaV0gPSBEVE0uTlVMTDsKICAgICB9CiAKICAgICBtX2ZpcnN0RnJlZSA9IDA7CkBAIC00NTYsNyArNDc0LDcgQEAKICAgICoKICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBub2RlIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZAogICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxlbWVudChOb2RlIHMpCisgIHB1YmxpYyBib29sZWFuIHJlbW92ZUVsZW1lbnQoaW50IHMpCiAgIHsKIAogICAgIGlmIChudWxsID09IG1fbWFwKQpAQCAtNDY0LDE0ICs0ODIsMTQgQEAKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9maXJzdEZyZWU7IGkrKykKICAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBtX21hcFtpXTsKKyAgICAgIGludCBub2RlID0gbV9tYXBbaV07CiAKLSAgICAgIGlmICgobnVsbCAhPSBub2RlKSAmJiBub2RlLmVxdWFscyhzKSkKKyAgICAgIGlmICggbm9kZSA9PSBzICkKICAgICAgIHsKICAgICAgICAgaWYgKGkgPiBtX2ZpcnN0RnJlZSkKICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1fbWFwLCBpICsgMSwgbV9tYXAsIGkgLSAxLCBtX2ZpcnN0RnJlZSAtIGkpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgbV9tYXBbaV0gPSBudWxsOworICAgICAgICAgIG1fbWFwW2ldID0gRFRNLk5VTEw7CiAKICAgICAgICAgbV9maXJzdEZyZWUtLTsKIApAQCAtNDk5LDcgKzUxNyw3IEBACiAgICAgaWYgKGkgPiBtX2ZpcnN0RnJlZSkKICAgICAgIFN5c3RlbS5hcnJheWNvcHkobV9tYXAsIGkgKyAxLCBtX21hcCwgaSAtIDEsIG1fZmlyc3RGcmVlIC0gaSk7CiAgICAgZWxzZQotICAgICAgbV9tYXBbaV0gPSBudWxsOworICAgICAgbV9tYXBbaV0gPSBEVE0uTlVMTDsKICAgfQogCiAgIC8qKgpAQCAtNTEyLDEyICs1MzAsMTIgQEAKICAgICogQHBhcmFtIG5vZGUgTm9kZSB0byBzZXQKICAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHdoZXJlIHRvIHNldCB0aGUgbm9kZQogICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudEF0KE5vZGUgbm9kZSwgaW50IGluZGV4KQorICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50QXQoaW50IG5vZGUsIGludCBpbmRleCkKICAgewogCiAgICAgaWYgKG51bGwgPT0gbV9tYXApCiAgICAgewotICAgICAgbV9tYXAgPSBuZXcgTm9kZVttX2Jsb2Nrc2l6ZV07CisgICAgICBtX21hcCA9IG5ldyBpbnRbbV9ibG9ja3NpemVdOwogICAgICAgbV9tYXBTaXplID0gbV9ibG9ja3NpemU7CiAgICAgfQogCkBAIC01MzEsMTEgKzU0OSwxMSBAQAogICAgKgogICAgKiBAcmV0dXJuIE5vZGUgYXQgc3BlY2lmaWVkIGluZGV4CiAgICAqLwotICBwdWJsaWMgTm9kZSBlbGVtZW50QXQoaW50IGkpCisgIHB1YmxpYyBpbnQgZWxlbWVudEF0KGludCBpKQogICB7CiAKICAgICBpZiAobnVsbCA9PSBtX21hcCkKLSAgICAgIHJldHVybiBudWxsOworICAgICAgcmV0dXJuIERUTS5OVUxMOwogCiAgICAgcmV0dXJuIG1fbWFwW2ldOwogICB9CkBAIC01NDcsNyArNTY1LDcgQEAKICAgICoKICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBnaXZlbiBub2RlIHdhcyBmb3VuZC4KICAgICovCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE5vZGUgcykKKyAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHMpCiAgIHsKIAogICAgIGlmIChudWxsID09IG1fbWFwKQpAQCAtNTU1LDkgKzU3Myw5IEBACiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fZmlyc3RGcmVlOyBpKyspCiAgICAgewotICAgICAgTm9kZSBub2RlID0gbV9tYXBbaV07CisgICAgICBpbnQgbm9kZSA9IG1fbWFwW2ldOwogCi0gICAgICBpZiAoKG51bGwgIT0gbm9kZSkgJiYgbm9kZS5lcXVhbHMocykpCisgICAgICBpZiAobm9kZSA9PSBzKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTU3NSw3ICs1OTMsNyBAQAogICAgKiBhcmd1bWVudCBpbiB0aGlzIHZlY3RvciBhdCBwb3NpdGlvbiBpbmRleCBvciBsYXRlciBpbiB0aGUKICAgICogdmVjdG9yOyByZXR1cm5zIC0xIGlmIHRoZSBvYmplY3QgaXMgbm90IGZvdW5kLgogICAgKi8KLSAgcHVibGljIGludCBpbmRleE9mKE5vZGUgZWxlbSwgaW50IGluZGV4KQorICBwdWJsaWMgaW50IGluZGV4T2YoaW50IGVsZW0sIGludCBpbmRleCkKICAgewogCiAgICAgaWYgKG51bGwgPT0gbV9tYXApCkBAIC01ODMsOSArNjAxLDkgQEAKIAogICAgIGZvciAoaW50IGkgPSBpbmRleDsgaSA8IG1fZmlyc3RGcmVlOyBpKyspCiAgICAgewotICAgICAgTm9kZSBub2RlID0gbV9tYXBbaV07CisgICAgICBpbnQgbm9kZSA9IG1fbWFwW2ldOwogCi0gICAgICBpZiAoKG51bGwgIT0gbm9kZSkgJiYgbm9kZS5lcXVhbHMoZWxlbSkpCisgICAgICBpZiAoIG5vZGUgPT0gZWxlbSApCiAgICAgICAgIHJldHVybiBpOwogICAgIH0KIApAQCAtNjAyLDcgKzYyMCw3IEBACiAgICAqIGFyZ3VtZW50IGluIHRoaXMgdmVjdG9yIGF0IHBvc2l0aW9uIGluZGV4IG9yIGxhdGVyIGluIHRoZQogICAgKiB2ZWN0b3I7IHJldHVybnMgLTEgaWYgdGhlIG9iamVjdCBpcyBub3QgZm91bmQuCiAgICAqLwotICBwdWJsaWMgaW50IGluZGV4T2YoTm9kZSBlbGVtKQorICBwdWJsaWMgaW50IGluZGV4T2YoaW50IGVsZW0pCiAgIHsKIAogICAgIGlmIChudWxsID09IG1fbWFwKQpAQCAtNjEwLDkgKzYyOCw5IEBACiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fZmlyc3RGcmVlOyBpKyspCiAgICAgewotICAgICAgTm9kZSBub2RlID0gbV9tYXBbaV07CisgICAgICBpbnQgbm9kZSA9IG1fbWFwW2ldOwogCi0gICAgICBpZiAoKG51bGwgIT0gbm9kZSkgJiYgbm9kZS5lcXVhbHMoZWxlbSkpCisgICAgICBpZiAobm9kZSA9PSBlbGVtKQogICAgICAgICByZXR1cm4gaTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9QcmVmaXhSZXNvbHZlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL1ByZWZpeFJlc29sdmVyLmphdmEKaW5kZXggZjc3YjY4MC4uNmY2MTJkYSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL1ByZWZpeFJlc29sdmVyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL1ByZWZpeFJlc29sdmVyLmphdmEKQEAgLTU4LDE1ICs1OCwxNyBAQAogCiAvKioKICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgotICogVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSBjYW4gcmVzb2x2ZSBwcmVmaXhlcwotICogdG8gbmFtZXNwYWNlcy4KKyAqIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgY2FuIHJlc29sdmUgcHJlZml4ZXMgdG8KKyAqIG5hbWVzcGFjZXMuIEV4YW1wbGVzIHdvdWxkIGluY2x1ZGUgcmVzb2x2aW5nIHRoZSBtZWFuaW5nIG9mIGEKKyAqIHByZWZpeCBhdCBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gYSBkb2N1bWVudCwgb3IgbWFwcGluZyB0aGUgcHJlZml4ZXMKKyAqIHVzZWQgaW4gYW4gWFBhdGggZXhwcmVzc2lvbi4KICAqLwogcHVibGljIGludGVyZmFjZSBQcmVmaXhSZXNvbHZlcgogewogCiAgIC8qKgogICAgKiBHaXZlbiBhIG5hbWVzcGFjZSwgZ2V0IHRoZSBjb3JyaXNwb25kaW5nIHByZWZpeC4gIFRoaXMgYXNzdW1lcyB0aGF0Ci0gICAqIHRoZSBQcmV2aXhSZXNvbHZlciBob2xkJ3MgaXQncyBvd24gbmFtZXNwYWNlIGNvbnRleHQsIG9yIGlzIGEgbmFtZXNwYWNlCisgICAqIHRoZSBQcmVmaXhSZXNvbHZlciBob2xkcyBpdHMgb3duIG5hbWVzcGFjZSBjb250ZXh0LCBvciBpcyBhIG5hbWVzcGFjZQogICAgKiBjb250ZXh0IGl0c2VsZi4KICAgICoKICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRvIGxvb2sgdXAsIHdoaWNoIG1heSBiZSBhbiBlbXB0eSBzdHJpbmcgKCIiKSBmb3IgdGhlIGRlZmF1bHQgTmFtZXNwYWNlLgpAQCAtNzcsMTIgKzc5LDEyIEBACiAgIFN0cmluZyBnZXROYW1lc3BhY2VGb3JQcmVmaXgoU3RyaW5nIHByZWZpeCk7CiAKICAgLyoqCi0gICAqIEdpdmVuIGEgbmFtZXNwYWNlLCBnZXQgdGhlIGNvcnJpc3BvbmRpbmcgcHJlZml4LCBiYXNlZCBvbiB0aGUgbm9kZSBjb250ZXh0LgorICAgKiBHaXZlbiBhIG5hbWVzcGFjZSwgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIHByZWZpeCwgYmFzZWQgb24gdGhlIGNvbnRleHQgbm9kZS4KICAgICoKICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRvIGxvb2sgdXAsIHdoaWNoIG1heSBiZSBhbiBlbXB0eSBzdHJpbmcgKCIiKSBmb3IgdGhlIGRlZmF1bHQgTmFtZXNwYWNlLgogICAgKiBAcGFyYW0gY29udGV4dCBUaGUgbm9kZSBjb250ZXh0IGZyb20gd2hpY2ggdG8gbG9vayB1cCB0aGUgVVJJLgogICAgKgotICAgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIE5hbWVzcGFjZSBVUkksIG9yIG51bGwgaWYgdGhlIHByZWZpeAorICAgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIE5hbWVzcGFjZSBVUkkgYXMgYSBzdHJpbmcsIG9yIG51bGwgaWYgdGhlIHByZWZpeAogICAgKiAgICAgICAgIGlzIHVuZGVjbGFyZWQgaW4gdGhpcyBjb250ZXh0LgogICAgKi8KICAgU3RyaW5nIGdldE5hbWVzcGFjZUZvclByZWZpeChTdHJpbmcgcHJlZml4LCBvcmcudzNjLmRvbS5Ob2RlIGNvbnRleHQpOwpAQCAtOTIsNiArOTQsMTMgQEAKICAgICoKICAgICogQHJldHVybiBUaGUgYmFzZSBpZGVudGlmaWVyIGZyb20gd2hlcmUgcmVsYXRpdmUgVVJJcyBzaG91bGQgYmUgYWJzb2x1dGl6ZWQsIG9yIG51bGwgCiAgICAqIGlmIHRoZSBiYXNlIElEIGlzIHVua25vd24uCisgICAqIDxwPgorICAgKiBDQVZFQVQ6IE5vdGUgdGhhdCB0aGUgYmFzZSBVUkkgaW4gYW4gWE1MIGRvY3VtZW50IG1heSB2YXJ5IHdpdGggd2hlcmUKKyAgICogeW91IGFyZSBpbiB0aGUgZG9jdW1lbnQsIGlmIHBhcnQgb2YgdGhlIGRvYydzIGNvbnRlbnRzIHdlcmUgYnJvdWdodCBpbgorICAgKiB2aWEgYW4gZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZSBvciBpZiBtZWNoYW5pc21zIHN1Y2ggYXMgeG1sOmJhc2UgaGF2ZQorICAgKiBiZWVuIHVzZWQuIFVubGVzcyB0aGlzIFByZWZpeFJlc29sdmVyIGlzIGJvdW5kIHRvIGEgc3BlY2lmaWMgcG9ydGlvbiBvZgorICAgKiB0aGUgZG9jdW1lbnQsIG9yIGhhcyBiZWVuIGtlcHQgdXAgdG8gZGF0ZSB2aWEgc29tZSBvdGhlciBtZWNoYW5pc20sIGl0CisgICAqIG1heSBub3QgYWNjdXJhdGVseSByZWZsZWN0IHRoYXQgY29udGV4dCBpbmZvcm1hdGlvbi4KICAgICovCiAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUlkZW50aWZpZXIoKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9UcmVlV2Fsa2VyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvVHJlZVdhbGtlci5qYXZhCmluZGV4IDc4OGRkYTUuLjU0ZjRiMzYgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9UcmVlV2Fsa2VyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL1RyZWVXYWxrZXIuamF2YQpAQCAtODcsMTIgKzg3LDIyIEBACiAgICAqCiAgICAqIEByZXR1cm4gdGhlIENvbnRlbnRIYW5kbGVyIHVzZWQgZm9yIHRoZSB0cmVlIHdhbGsKICAgICovCi0gIHB1YmxpYyBDb250ZW50SGFuZGxlciBnZXRjb250ZW50SGFuZGxlcigpCisgIHB1YmxpYyBDb250ZW50SGFuZGxlciBnZXRDb250ZW50SGFuZGxlcigpCiAgIHsKICAgICByZXR1cm4gbV9jb250ZW50SGFuZGxlcjsKICAgfQogCiAgIC8qKgorICAgKiBHZXQgdGhlIENvbnRlbnRIYW5kbGVyIHVzZWQgZm9yIHRoZSB0cmVlIHdhbGsuCisgICAqCisgICAqIEByZXR1cm4gdGhlIENvbnRlbnRIYW5kbGVyIHVzZWQgZm9yIHRoZSB0cmVlIHdhbGsKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRIYW5kbGVyKENvbnRlbnRIYW5kbGVyIGNoKQorICB7CisgICAgbV9jb250ZW50SGFuZGxlciA9IGNoOworICB9CisKKyAgLyoqCiAgICAqIENvbnN0cnVjdG9yLgogICAgKiBAcGFyYW0gICBjb250ZW50SGFuZGxlciBUaGUgaW1wbGVtZW50aW9uIG9mIHRoZQogICAgKiBjb250ZW50SGFuZGxlciBvcGVyYXRpb24gKHRvWE1MU3RyaW5nLCBkaWdlc3QsIC4uLikKQEAgLTIxMywxNSArMjIzLDggQEAKICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGRpc3BhdGFjaENoYXJzKE5vZGUgbm9kZSkKICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgogICB7Ci0gICAgaWYobm9kZS5pc1N1cHBvcnRlZChvcmcuYXBhY2hlLnhhbGFuLnN0cmVlLlNheEV2ZW50RGlzcGF0Y2guU1VQUE9SVFNJTlRFUkZBQ0UsICIxLjAiKSkKLSAgICB7Ci0gICAgICAoKG9yZy5hcGFjaGUueGFsYW4uc3RyZWUuU2F4RXZlbnREaXNwYXRjaClub2RlKS5kaXNwYXRjaENoYXJhY3RlcnNFdmVudChtX2NvbnRlbnRIYW5kbGVyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyBkYXRhID0gKChUZXh0KSBub2RlKS5nZXREYXRhKCk7Ci0gICAgICB0aGlzLm1fY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhkYXRhLnRvQ2hhckFycmF5KCksIDAsIGRhdGEubGVuZ3RoKCkpOwotICAgIH0KKyAgICBTdHJpbmcgZGF0YSA9ICgoVGV4dCkgbm9kZSkuZ2V0RGF0YSgpOworICAgIHRoaXMubV9jb250ZW50SGFuZGxlci5jaGFyYWN0ZXJzKGRhdGEudG9DaGFyQXJyYXkoKSwgMCwgZGF0YS5sZW5ndGgoKSk7CiAgIH0KIAogICAvKioKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9YTUxTdHJpbmcuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9YTUxTdHJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTFiYTk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzL1hNTFN0cmluZy5qYXZhCkBAIC0wLDAgKzEsNzExIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKKyAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKKyAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cworICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC51dGlsczsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBtZWFudCB0byBiZSBhbiBpbnRlcmZhY2UgdG8gY2hhcmFjdGVyIHN0cmluZ3MsIHdoZXRoZXIgdGhleQorICogYmUgamF2YSBTdHJpbmdzIG9yIDxjb2RlPm9yZy5hcGFjaGUueG1sLnV0aWxzLkZhc3RTdHJpbmdCdWZmZXI8L2NvZGU+cywgb3IKKyAqIG90aGVyIGNoYXJhY3RlciBkYXRhLiAgQnkgdXNpbmcgWE1MU3RyaW5nLCBjaGFyYWN0ZXIgY29waWVzIGNhbiBiZSByZWR1Y2VkCisgKiBpbiB0aGUgWE1MIHBpcGVsaW5lLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFhNTFN0cmluZworeworCisgIC8qKgorICAgKiBEaXJlY3RseSBjYWxsIHRoZQorICAgKiBjaGFyYWN0ZXJzIG1ldGhvZCBvbiB0aGUgcGFzc2VkIENvbnRlbnRIYW5kbGVyIGZvciB0aGUKKyAgICogc3RyaW5nLXZhbHVlLiBNdWx0aXBsZSBjYWxscyB0byB0aGUKKyAgICogQ29udGVudEhhbmRsZXIncyBjaGFyYWN0ZXJzIG1ldGhvZHMgbWF5IHdlbGwgb2NjdXIgZm9yIGEgc2luZ2xlIGNhbGwgdG8KKyAgICogdGhpcyBtZXRob2QuCisgICAqCisgICAqIEBwYXJhbSBjaCBBIG5vbi1udWxsIHJlZmVyZW5jZSB0byBhIENvbnRlbnRIYW5kbGVyLgorICAgKgorICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IHZvaWQgZGlzcGF0Y2hDaGFyYWN0ZXJzRXZlbnRzKG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyIGNoKQorICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKyAgLyoqCisgICAqIERpcmVjdGx5IGNhbGwgdGhlCisgICAqIGNvbW1lbnQgbWV0aG9kIG9uIHRoZSBwYXNzZWQgTGV4aWNhbEhhbmRsZXIgZm9yIHRoZQorICAgKiBzdHJpbmctdmFsdWUuCisgICAqCisgICAqIEBwYXJhbSBsaCBBIG5vbi1udWxsIHJlZmVyZW5jZSB0byBhIExleGljYWxIYW5kbGVyLgorICAgKgorICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IHZvaWQgZGlzcGF0Y2hBc0NvbW1lbnQob3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyIGxoKQorICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisgICAgCisgIC8qKgorICAgKiBDb25kaXRpb25hbGx5IHRyaW0gYWxsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gdGhlIHNwZWNpZmllZCBTdHJpbmcuCisgICAqIEFsbCBzdHJpbmdzIG9mIHdoaXRlIHNwYWNlIGFyZQorICAgKiByZXBsYWNlZCBieSBhIHNpbmdsZSBzcGFjZSBjaGFyYWN0ZXIgKCN4MjApLCBleGNlcHQgc3BhY2VzIGFmdGVyIHB1bmN0dWF0aW9uIHdoaWNoCisgICAqIHJlY2VpdmUgZG91YmxlIHNwYWNlcyBpZiBkb3VibGVQdW5jdHVhdGlvblNwYWNlcyBpcyB0cnVlLgorICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VmdWwgdG8gYSBmb3JtYXR0ZXIsIGJ1dCB0byBnZXQgZmlyc3QgY2xhc3MKKyAgICogcmVzdWx0cywgdGhlIGZvcm1hdHRlciBzaG91bGQgcHJvYmFibHkgZG8gaXQncyBvd24gd2hpdGUgc3BhY2UgaGFuZGxpbmcKKyAgICogYmFzZWQgb24gdGhlIHNlbWFudGljcyBvZiB0aGUgZm9ybWF0dGluZyBvYmplY3QuCisgICAqIAorICAgKiBAcGFyYW0gICB0cmltSGVhZCAgICBUcmltIGxlYWRpbmcgd2hpdGVzcGFjZT8KKyAgICogQHBhcmFtICAgdHJpbVRhaWwgICAgVHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlPworICAgKiBAcGFyYW0gICBkb3VibGVQdW5jdHVhdGlvblNwYWNlcyAgICBVc2UgZG91YmxlIHNwYWNlcyBmb3IgcHVuY3R1YXRpb24/CisgICAqIEByZXR1cm4gICAgICAgICAgICAgIFRoZSB0cmltbWVkIHN0cmluZy4KKyAgICovCisgIHB1YmxpYyBYTUxTdHJpbmcgZml4V2hpdGVTcGFjZShib29sZWFuIHRyaW1IZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0cmltVGFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZG91YmxlUHVuY3R1YXRpb25TcGFjZXMpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBzdHJpbmcuCisgICAqCisgICAqIEByZXR1cm4gIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgcmVwcmVzZW50ZWQgYnkgdGhpcworICAgKiAgICAgICAgICBvYmplY3QuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgaW50IGxlbmd0aCgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gQW4gaW5kZXggcmFuZ2VzCisgICAqIGZyb20gPGNvZGU+MDwvY29kZT4gdG8gPGNvZGU+bGVuZ3RoKCkgLSAxPC9jb2RlPi4gVGhlIGZpcnN0IGNoYXJhY3RlcgorICAgKiBvZiB0aGUgc2VxdWVuY2UgaXMgYXQgaW5kZXggPGNvZGU+MDwvY29kZT4sIHRoZSBuZXh0IGF0IGluZGV4CisgICAqIDxjb2RlPjE8L2NvZGU+LCBhbmQgc28gb24sIGFzIGZvciBhcnJheSBpbmRleGluZy4KKyAgICoKKyAgICogQHBhcmFtICAgICAgaW5kZXggICB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3Rlci4KKyAgICogQHJldHVybiAgICAgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoaXMgc3RyaW5nLgorICAgKiAgICAgICAgICAgICBUaGUgZmlyc3QgY2hhcmFjdGVyIGlzIGF0IGluZGV4IDxjb2RlPjA8L2NvZGU+LgorICAgKiBAZXhjZXB0aW9uICBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uICBpZiB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+CisgICAqICAgICAgICAgICAgIGFyZ3VtZW50IGlzIG5lZ2F0aXZlIG9yIG5vdCBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzCisgICAqICAgICAgICAgICAgIHN0cmluZy4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBjaGFyIGNoYXJBdChpbnQgaW5kZXgpOworCisgIC8qKgorICAgKiBDb3BpZXMgY2hhcmFjdGVycyBmcm9tIHRoaXMgc3RyaW5nIGludG8gdGhlIGRlc3RpbmF0aW9uIGNoYXJhY3RlcgorICAgKiBhcnJheS4KKyAgICoKKyAgICogQHBhcmFtICAgICAgc3JjQmVnaW4gICBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcKKyAgICogICAgICAgICAgICAgICAgICAgICAgICB0byBjb3B5LgorICAgKiBAcGFyYW0gICAgICBzcmNFbmQgICAgIGluZGV4IGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gY29weS4KKyAgICogQHBhcmFtICAgICAgZHN0ICAgICAgICB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAqIEBwYXJhbSAgICAgIGRzdEJlZ2luICAgdGhlIHN0YXJ0IG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZworICAgKiAgICAgICAgICAgIGlzIHRydWU6CisgICAqICAgICAgICAgICAgPHVsPjxsaT48Y29kZT5zcmNCZWdpbjwvY29kZT4gaXMgbmVnYXRpdmUuCisgICAqICAgICAgICAgICAgPGxpPjxjb2RlPnNyY0JlZ2luPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+c3JjRW5kPC9jb2RlPgorICAgKiAgICAgICAgICAgIDxsaT48Y29kZT5zcmNFbmQ8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMKKyAgICogICAgICAgICAgICAgICAgc3RyaW5nCisgICAqICAgICAgICAgICAgPGxpPjxjb2RlPmRzdEJlZ2luPC9jb2RlPiBpcyBuZWdhdGl2ZQorICAgKiAgICAgICAgICAgIDxsaT48Y29kZT5kc3RCZWdpbisoc3JjRW5kLXNyY0JlZ2luKTwvY29kZT4gaXMgbGFyZ2VyIHRoYW4KKyAgICogICAgICAgICAgICAgICAgPGNvZGU+ZHN0Lmxlbmd0aDwvY29kZT48L3VsPgorICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmRzdDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldENoYXJzKGludCBzcmNCZWdpbiwgaW50IHNyY0VuZCwgY2hhciBkc3RbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdEJlZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8qKgorICAgKiBDb21wYXJlcyB0aGlzIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICogVGhlIHJlc3VsdCBpcyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgbm90CisgICAqIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBpcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cworICAgKiB0aGUgc2FtZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGFzIHRoaXMgb2JqZWN0LgorICAgKgorICAgKiBAcGFyYW0gICBhbk9iamVjdCAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4KKyAgICogICAgICAgICAgICAgICAgICAgICBhZ2FpbnN0LgorICAgKiBAcmV0dXJuICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+U3RyaW5nIDwvY29kZT5hcmUgZXF1YWw7CisgICAqICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAqIEBzZWUgICAgIGphdmEubGFuZy5TdHJpbmcjY29tcGFyZVRvKGphdmEubGFuZy5TdHJpbmcpCisgICAqIEBzZWUgICAgIGphdmEubGFuZy5TdHJpbmcjZXF1YWxzSWdub3JlQ2FzZShqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxzKFhNTFN0cmluZyBhbk9iamVjdCk7CisKKworICAvKioKKyAgICogQ29tcGFyZXMgdGhpcyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAqIFRoZSByZXN1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdAorICAgKiA8Y29kZT5udWxsPC9jb2RlPiBhbmQgaXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCB0aGF0IHJlcHJlc2VudHMKKyAgICogdGhlIHNhbWUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBhcyB0aGlzIG9iamVjdC4KKyAgICoKKyAgICogQHBhcmFtICAgYW5PYmplY3QgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+CisgICAqICAgICAgICAgICAgICAgICAgICAgYWdhaW5zdC4KKyAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPlN0cmluZyA8L2NvZGU+YXJlIGVxdWFsOworICAgKiAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgKiBAc2VlICAgICBqYXZhLmxhbmcuU3RyaW5nI2NvbXBhcmVUbyhqYXZhLmxhbmcuU3RyaW5nKQorICAgKiBAc2VlICAgICBqYXZhLmxhbmcuU3RyaW5nI2VxdWFsc0lnbm9yZUNhc2UoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpOworCisgIC8qKgorICAgKiBDb21wYXJlcyB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYW5vdGhlciA8Y29kZT5TdHJpbmc8L2NvZGU+LAorICAgKiBpZ25vcmluZyBjYXNlIGNvbnNpZGVyYXRpb25zLiAgVHdvIHN0cmluZ3MgYXJlIGNvbnNpZGVyZWQgZXF1YWwKKyAgICogaWdub3JpbmcgY2FzZSBpZiB0aGV5IGFyZSBvZiB0aGUgc2FtZSBsZW5ndGgsIGFuZCBjb3JyZXNwb25kaW5nCisgICAqIGNoYXJhY3RlcnMgaW4gdGhlIHR3byBzdHJpbmdzIGFyZSBlcXVhbCBpZ25vcmluZyBjYXNlLgorICAgKgorICAgKiBAcGFyYW0gICBhbm90aGVyU3RyaW5nICAgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gY29tcGFyZSB0aGlzCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5TdHJpbmc8L2NvZGU+IGFnYWluc3QuCisgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcmd1bWVudCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4KKyAgICogICAgICAgICAgYW5kIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+cyBhcmUgZXF1YWwsCisgICAqICAgICAgICAgIGlnbm9yaW5nIGNhc2U7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAqIEBzZWUgICAgICNlcXVhbHMoT2JqZWN0KQorICAgKiBAc2VlICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyI3RvTG93ZXJDYXNlKGNoYXIpCisgICAqIEBzZWUgamF2YS5sYW5nLkNoYXJhY3RlciN0b1VwcGVyQ2FzZShjaGFyKQorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxzSWdub3JlQ2FzZShTdHJpbmcgYW5vdGhlclN0cmluZyk7CisKKyAgLyoqCisgICAqIENvbXBhcmVzIHR3byBzdHJpbmdzIGxleGljb2dyYXBoaWNhbGx5LgorICAgKgorICAgKiBAcGFyYW0gICBhbm90aGVyU3RyaW5nICAgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYmUgY29tcGFyZWQuCisgICAqIEByZXR1cm4gIHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0aGUgYXJndW1lbnQgc3RyaW5nIGlzIGVxdWFsIHRvCisgICAqICAgICAgICAgIHRoaXMgc3RyaW5nOyBhIHZhbHVlIGxlc3MgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiB0aGlzIHN0cmluZworICAgKiAgICAgICAgICBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4gdGhlIHN0cmluZyBhcmd1bWVudDsgYW5kIGEKKyAgICogICAgICAgICAgdmFsdWUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IGlmIHRoaXMgc3RyaW5nIGlzCisgICAqICAgICAgICAgIGxleGljb2dyYXBoaWNhbGx5IGdyZWF0ZXIgdGhhbiB0aGUgc3RyaW5nIGFyZ3VtZW50LgorICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5hbm90aGVyU3RyaW5nPC9jb2RlPgorICAgKiAgICAgICAgICBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBpbnQgY29tcGFyZVRvKFhNTFN0cmluZyBhbm90aGVyU3RyaW5nKTsKKworICAvKioKKyAgICogQ29tcGFyZXMgdHdvIHN0cmluZ3MgbGV4aWNvZ3JhcGhpY2FsbHksIGlnbm9yaW5nIGNhc2UgY29uc2lkZXJhdGlvbnMuCisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gaW50ZWdlciB3aG9zZSBzaWduIGlzIHRoYXQgb2YKKyAgICogPGNvZGU+dGhpcy50b1VwcGVyQ2FzZSgpLnRvTG93ZXJDYXNlKCkuY29tcGFyZVRvKAorICAgKiBzdHIudG9VcHBlckNhc2UoKS50b0xvd2VyQ2FzZSgpKTwvY29kZT4uCisgICAqIDxwPgorICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyA8ZW0+bm90PC9lbT4gdGFrZSBsb2NhbGUgaW50byBhY2NvdW50LAorICAgKiBhbmQgd2lsbCByZXN1bHQgaW4gYW4gdW5zYXRpc2ZhY3Rvcnkgb3JkZXJpbmcgZm9yIGNlcnRhaW4gbG9jYWxlcy4KKyAgICogVGhlIGphdmEudGV4dCBwYWNrYWdlIHByb3ZpZGVzIDxlbT5jb2xsYXRvcnM8L2VtPiB0byBhbGxvdworICAgKiBsb2NhbGUtc2Vuc2l0aXZlIG9yZGVyaW5nLgorICAgKgorICAgKiBAcGFyYW0gICBzdHIgICB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBiZSBjb21wYXJlZC4KKyAgICogQHJldHVybiAgYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlCisgICAqICAgICAgICAgIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGlzIGdyZWF0ZXIgdGhhbiwgZXF1YWwgdG8sIG9yIGxlc3MKKyAgICogICAgICAgICAgdGhhbiB0aGlzIFN0cmluZywgaWdub3JpbmcgY2FzZSBjb25zaWRlcmF0aW9ucy4KKyAgICogQHNlZSAgICAgamF2YS50ZXh0LkNvbGxhdG9yI2NvbXBhcmUoU3RyaW5nLCBTdHJpbmcpCisgICAqIEBzaW5jZSAgIDEuMgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGludCBjb21wYXJlVG9JZ25vcmVDYXNlKFhNTFN0cmluZyBzdHIpOworCisgIC8qKgorICAgKiBUZXN0cyBpZiB0aGlzIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCBiZWdpbm5pbmcKKyAgICogYSBzcGVjaWZpZWQgaW5kZXguCisgICAqCisgICAqIEBwYXJhbSAgIHByZWZpeCAgICB0aGUgcHJlZml4LgorICAgKiBAcGFyYW0gICB0b2Zmc2V0ICAgd2hlcmUgdG8gYmVnaW4gbG9va2luZyBpbiB0aGUgc3RyaW5nLgorICAgKiBAcmV0dXJuICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgKiAgICAgICAgICBhcmd1bWVudCBpcyBhIHByZWZpeCBvZiB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgb2JqZWN0IHN0YXJ0aW5nCisgICAqICAgICAgICAgIGF0IGluZGV4IDxjb2RlPnRvZmZzZXQ8L2NvZGU+OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgKiAgICAgICAgICBUaGUgcmVzdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiA8Y29kZT50b2Zmc2V0PC9jb2RlPiBpcworICAgKiAgICAgICAgICBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzCisgICAqICAgICAgICAgIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0OyBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZQorICAgKiAgICAgICAgICBhcyB0aGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uCisgICAqICAgICAgICAgIDxwcmU+CisgICAqICAgICAgICAgIHRoaXMuc3ViU3RyaW5nKHRvZmZzZXQpLnN0YXJ0c1dpdGgocHJlZml4KQorICAgKiAgICAgICAgICA8L3ByZT4KKyAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+cHJlZml4PC9jb2RlPiBpcworICAgKiAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN0YXJ0c1dpdGgoU3RyaW5nIHByZWZpeCwgaW50IHRvZmZzZXQpOworCisgIC8qKgorICAgKiBUZXN0cyBpZiB0aGlzIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCBiZWdpbm5pbmcKKyAgICogYSBzcGVjaWZpZWQgaW5kZXguCisgICAqCisgICAqIEBwYXJhbSAgIHByZWZpeCAgICB0aGUgcHJlZml4LgorICAgKiBAcGFyYW0gICB0b2Zmc2V0ICAgd2hlcmUgdG8gYmVnaW4gbG9va2luZyBpbiB0aGUgc3RyaW5nLgorICAgKiBAcmV0dXJuICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgKiAgICAgICAgICBhcmd1bWVudCBpcyBhIHByZWZpeCBvZiB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgb2JqZWN0IHN0YXJ0aW5nCisgICAqICAgICAgICAgIGF0IGluZGV4IDxjb2RlPnRvZmZzZXQ8L2NvZGU+OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgKiAgICAgICAgICBUaGUgcmVzdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiA8Y29kZT50b2Zmc2V0PC9jb2RlPiBpcworICAgKiAgICAgICAgICBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzCisgICAqICAgICAgICAgIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0OyBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZQorICAgKiAgICAgICAgICBhcyB0aGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uCisgICAqICAgICAgICAgIDxwcmU+CisgICAqICAgICAgICAgIHRoaXMuc3ViU3RyaW5nKHRvZmZzZXQpLnN0YXJ0c1dpdGgocHJlZml4KQorICAgKiAgICAgICAgICA8L3ByZT4KKyAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+cHJlZml4PC9jb2RlPiBpcworICAgKiAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN0YXJ0c1dpdGgoWE1MU3RyaW5nIHByZWZpeCwgaW50IHRvZmZzZXQpOworCisgIC8qKgorICAgKiBUZXN0cyBpZiB0aGlzIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeC4KKyAgICoKKyAgICogQHBhcmFtICAgcHJlZml4ICAgdGhlIHByZWZpeC4KKyAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGUKKyAgICogICAgICAgICAgYXJndW1lbnQgaXMgYSBwcmVmaXggb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieQorICAgKiAgICAgICAgICB0aGlzIHN0cmluZzsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICogICAgICAgICAgTm90ZSBhbHNvIHRoYXQgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUKKyAgICogICAgICAgICAgYXJndW1lbnQgaXMgYW4gZW1wdHkgc3RyaW5nIG9yIGlzIGVxdWFsIHRvIHRoaXMKKyAgICogICAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgYXMgZGV0ZXJtaW5lZCBieSB0aGUKKyAgICogICAgICAgICAge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0gbWV0aG9kLgorICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5wcmVmaXg8L2NvZGU+IGlzCisgICAqICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgKiBAc2luY2UgICBKREsxLiAwCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdGFydHNXaXRoKFN0cmluZyBwcmVmaXgpOworCisgIC8qKgorICAgKiBUZXN0cyBpZiB0aGlzIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeC4KKyAgICoKKyAgICogQHBhcmFtICAgcHJlZml4ICAgdGhlIHByZWZpeC4KKyAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGUKKyAgICogICAgICAgICAgYXJndW1lbnQgaXMgYSBwcmVmaXggb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieQorICAgKiAgICAgICAgICB0aGlzIHN0cmluZzsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICogICAgICAgICAgTm90ZSBhbHNvIHRoYXQgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUKKyAgICogICAgICAgICAgYXJndW1lbnQgaXMgYW4gZW1wdHkgc3RyaW5nIG9yIGlzIGVxdWFsIHRvIHRoaXMKKyAgICogICAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgYXMgZGV0ZXJtaW5lZCBieSB0aGUKKyAgICogICAgICAgICAge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0gbWV0aG9kLgorICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5wcmVmaXg8L2NvZGU+IGlzCisgICAqICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgKiBAc2luY2UgICBKREsxLiAwCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdGFydHNXaXRoKFhNTFN0cmluZyBwcmVmaXgpOworCisgIC8qKgorICAgKiBUZXN0cyBpZiB0aGlzIHN0cmluZyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBzdWZmaXguCisgICAqCisgICAqIEBwYXJhbSAgIHN1ZmZpeCAgIHRoZSBzdWZmaXguCisgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAqICAgICAgICAgIGFyZ3VtZW50IGlzIGEgc3VmZml4IG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkKKyAgICogICAgICAgICAgdGhpcyBvYmplY3Q7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuIE5vdGUgdGhhdCB0aGUKKyAgICogICAgICAgICAgcmVzdWx0IHdpbGwgYmUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFyZ3VtZW50IGlzIHRoZQorICAgKiAgICAgICAgICBlbXB0eSBzdHJpbmcgb3IgaXMgZXF1YWwgdG8gdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdAorICAgKiAgICAgICAgICBhcyBkZXRlcm1pbmVkIGJ5IHRoZSB7QGxpbmsgI2VxdWFscyhPYmplY3QpfSBtZXRob2QuCisgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnN1ZmZpeDwvY29kZT4gaXMKKyAgICogICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlbmRzV2l0aChTdHJpbmcgc3VmZml4KTsKKworICAvKioKKyAgICogUmV0dXJucyBhIGhhc2hjb2RlIGZvciB0aGlzIHN0cmluZy4gVGhlIGhhc2hjb2RlIGZvciBhCisgICAqIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IGlzIGNvbXB1dGVkIGFzCisgICAqIDxibG9ja3F1b3RlPjxwcmU+CisgICAqIHNbMF0qMzFeKG4tMSkgKyBzWzFdKjMxXihuLTIpICsgLi4uICsgc1tuLTFdCisgICAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICogdXNpbmcgPGNvZGU+aW50PC9jb2RlPiBhcml0aG1ldGljLCB3aGVyZSA8Y29kZT5zW2ldPC9jb2RlPiBpcyB0aGUKKyAgICogPGk+aTwvaT50aCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZywgPGNvZGU+bjwvY29kZT4gaXMgdGhlIGxlbmd0aCBvZgorICAgKiB0aGUgc3RyaW5nLCBhbmQgPGNvZGU+XjwvY29kZT4gaW5kaWNhdGVzIGV4cG9uZW50aWF0aW9uLgorICAgKiAoVGhlIGhhc2ggdmFsdWUgb2YgdGhlIGVtcHR5IHN0cmluZyBpcyB6ZXJvLikKKyAgICoKKyAgICogQHJldHVybiAgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGludCBoYXNoQ29kZSgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBpbmRleCB3aXRoaW4gdGhpcyBzdHJpbmcgb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlCisgICAqIHNwZWNpZmllZCBjaGFyYWN0ZXIuIElmIGEgY2hhcmFjdGVyIHdpdGggdmFsdWUgPGNvZGU+Y2g8L2NvZGU+IG9jY3VycworICAgKiBpbiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPgorICAgKiBvYmplY3QsIHRoZW4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdWNoIG9jY3VycmVuY2UgaXMgcmV0dXJuZWQgLS0KKyAgICogdGhhdCBpcywgdGhlIHNtYWxsZXN0IHZhbHVlIDxpPms8L2k+IHN1Y2ggdGhhdDoKKyAgICogPGJsb2NrcXVvdGU+PHByZT4KKyAgICogdGhpcy5jaGFyQXQoPGk+azwvaT4pID09IGNoCisgICAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICogaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIG5vIHN1Y2ggY2hhcmFjdGVyIG9jY3VycyBpbiB0aGlzIHN0cmluZywKKyAgICogdGhlbiA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAqCisgICAqIEBwYXJhbSAgIGNoICAgYSBjaGFyYWN0ZXIuCisgICAqIEByZXR1cm4gIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZQorICAgKiAgICAgICAgICBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QsIG9yCisgICAqICAgICAgICAgIDxjb2RlPi0xPC9jb2RlPiBpZiB0aGUgY2hhcmFjdGVyIGRvZXMgbm90IG9jY3VyLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGludCBpbmRleE9mKGludCBjaCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGluZGV4IHdpdGhpbiB0aGlzIHN0cmluZyBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKKyAgICogc3BlY2lmaWVkIGNoYXJhY3Rlciwgc3RhcnRpbmcgdGhlIHNlYXJjaCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgKiA8cD4KKyAgICogSWYgYSBjaGFyYWN0ZXIgd2l0aCB2YWx1ZSA8Y29kZT5jaDwvY29kZT4gb2NjdXJzIGluIHRoZSBjaGFyYWN0ZXIKKyAgICogc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCBhdCBhbiBpbmRleAorICAgKiBubyBzbWFsbGVyIHRoYW4gPGNvZGU+ZnJvbUluZGV4PC9jb2RlPiwgdGhlbiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0CisgICAqIHN1Y2ggb2NjdXJyZW5jZSBpcyByZXR1cm5lZC0tdGhhdCBpcywgdGhlIHNtYWxsZXN0IHZhbHVlIDxpPms8L2k+CisgICAqIHN1Y2ggdGhhdDoKKyAgICogPGJsb2NrcXVvdGU+PHByZT4KKyAgICogKHRoaXMuY2hhckF0KDxpPms8L2k+KSA9PSBjaCkgJiYgKDxpPms8L2k+ID49IGZyb21JbmRleCkKKyAgICogPC9wcmU+PC9ibG9ja3F1b3RlPgorICAgKiBpcyB0cnVlLiBJZiBubyBzdWNoIGNoYXJhY3RlciBvY2N1cnMgaW4gdGhpcyBzdHJpbmcgYXQgb3IgYWZ0ZXIKKyAgICogcG9zaXRpb24gPGNvZGU+ZnJvbUluZGV4PC9jb2RlPiwgdGhlbiA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAqIDxwPgorICAgKiBUaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiB0aGUgdmFsdWUgb2YgPGNvZGU+ZnJvbUluZGV4PC9jb2RlPi4gSWYgaXQKKyAgICogaXMgbmVnYXRpdmUsIGl0IGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgaWYgaXQgd2VyZSB6ZXJvOiB0aGlzIGVudGlyZQorICAgKiBzdHJpbmcgbWF5IGJlIHNlYXJjaGVkLiBJZiBpdCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzCisgICAqIHN0cmluZywgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBpZiBpdCB3ZXJlIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YKKyAgICogdGhpcyBzdHJpbmc6IDxjb2RlPi0xPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICoKKyAgICogQHBhcmFtICAgY2ggICAgICAgICAgYSBjaGFyYWN0ZXIuCisgICAqIEBwYXJhbSAgIGZyb21JbmRleCAgIHRoZSBpbmRleCB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uCisgICAqIEByZXR1cm4gIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZQorICAgKiAgICAgICAgICBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QgdGhhdCBpcyBncmVhdGVyCisgICAqICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+ZnJvbUluZGV4PC9jb2RlPiwgb3IgPGNvZGU+LTE8L2NvZGU+CisgICAqICAgICAgICAgIGlmIHRoZSBjaGFyYWN0ZXIgZG9lcyBub3Qgb2NjdXIuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgaW50IGluZGV4T2YoaW50IGNoLCBpbnQgZnJvbUluZGV4KTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5kZXggd2l0aGluIHRoaXMgc3RyaW5nIG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCisgICAqIHNwZWNpZmllZCBjaGFyYWN0ZXIuIFRoYXQgaXMsIHRoZSBpbmRleCByZXR1cm5lZCBpcyB0aGUgbGFyZ2VzdAorICAgKiB2YWx1ZSA8aT5rPC9pPiBzdWNoIHRoYXQ6CisgICAqIDxibG9ja3F1b3RlPjxwcmU+CisgICAqIHRoaXMuY2hhckF0KDxpPms8L2k+KSA9PSBjaAorICAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+CisgICAqIGlzIHRydWUuCisgICAqIFRoZSBTdHJpbmcgaXMgc2VhcmNoZWQgYmFja3dhcmRzIHN0YXJ0aW5nIGF0IHRoZSBsYXN0IGNoYXJhY3Rlci4KKyAgICoKKyAgICogQHBhcmFtICAgY2ggICBhIGNoYXJhY3Rlci4KKyAgICogQHJldHVybiAgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIGNoYXJhY3RlciBpbiB0aGUKKyAgICogICAgICAgICAgY2hhcmFjdGVyIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0LCBvcgorICAgKiAgICAgICAgICA8Y29kZT4tMTwvY29kZT4gaWYgdGhlIGNoYXJhY3RlciBkb2VzIG5vdCBvY2N1ci4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBpbnQgbGFzdEluZGV4T2YoaW50IGNoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5kZXggd2l0aGluIHRoaXMgc3RyaW5nIG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCisgICAqIHNwZWNpZmllZCBjaGFyYWN0ZXIsIHNlYXJjaGluZyBiYWNrd2FyZCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkCisgICAqIGluZGV4LiBUaGF0IGlzLCB0aGUgaW5kZXggcmV0dXJuZWQgaXMgdGhlIGxhcmdlc3QgdmFsdWUgPGk+azwvaT4KKyAgICogc3VjaCB0aGF0OgorICAgKiA8YmxvY2txdW90ZT48cHJlPgorICAgKiB0aGlzLmNoYXJBdChrKSA9PSBjaCkgJiYgKGsgPD0gZnJvbUluZGV4KQorICAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+CisgICAqIGlzIHRydWUuCisgICAqCisgICAqIEBwYXJhbSAgIGNoICAgICAgICAgIGEgY2hhcmFjdGVyLgorICAgKiBAcGFyYW0gICBmcm9tSW5kZXggICB0aGUgaW5kZXggdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLiBUaGVyZSBpcyBubworICAgKiAgICAgICAgICByZXN0cmljdGlvbiBvbiB0aGUgdmFsdWUgb2YgPGNvZGU+ZnJvbUluZGV4PC9jb2RlPi4gSWYgaXQgaXMKKyAgICogICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhpcyBzdHJpbmcsIGl0IGhhcworICAgKiAgICAgICAgICB0aGUgc2FtZSBlZmZlY3QgYXMgaWYgaXQgd2VyZSBlcXVhbCB0byBvbmUgbGVzcyB0aGFuIHRoZQorICAgKiAgICAgICAgICBsZW5ndGggb2YgdGhpcyBzdHJpbmc6IHRoaXMgZW50aXJlIHN0cmluZyBtYXkgYmUgc2VhcmNoZWQuCisgICAqICAgICAgICAgIElmIGl0IGlzIG5lZ2F0aXZlLCBpdCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGlmIGl0IHdlcmUgLTE6CisgICAqICAgICAgICAgIC0xIGlzIHJldHVybmVkLgorICAgKiBAcmV0dXJuICB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZQorICAgKiAgICAgICAgICBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QgdGhhdCBpcyBsZXNzCisgICAqICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+ZnJvbUluZGV4PC9jb2RlPiwgb3IgPGNvZGU+LTE8L2NvZGU+CisgICAqICAgICAgICAgIGlmIHRoZSBjaGFyYWN0ZXIgZG9lcyBub3Qgb2NjdXIgYmVmb3JlIHRoYXQgcG9pbnQuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgaW50IGxhc3RJbmRleE9mKGludCBjaCwgaW50IGZyb21JbmRleCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGluZGV4IHdpdGhpbiB0aGlzIHN0cmluZyBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKKyAgICogc3BlY2lmaWVkIHN1YnN0cmluZy4gVGhlIGludGVnZXIgcmV0dXJuZWQgaXMgdGhlIHNtYWxsZXN0IHZhbHVlCisgICAqIDxpPms8L2k+IHN1Y2ggdGhhdDoKKyAgICogPGJsb2NrcXVvdGU+PHByZT4KKyAgICogdGhpcy5zdGFydHNXaXRoKHN0ciwgPGk+azwvaT4pCisgICAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICogaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAqCisgICAqIEBwYXJhbSAgIHN0ciAgIGFueSBzdHJpbmcuCisgICAqIEByZXR1cm4gIGlmIHRoZSBzdHJpbmcgYXJndW1lbnQgb2NjdXJzIGFzIGEgc3Vic3RyaW5nIHdpdGhpbiB0aGlzCisgICAqICAgICAgICAgIG9iamVjdCwgdGhlbiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZmlyc3QKKyAgICogICAgICAgICAgc3VjaCBzdWJzdHJpbmcgaXMgcmV0dXJuZWQ7IGlmIGl0IGRvZXMgbm90IG9jY3VyIGFzIGEKKyAgICogICAgICAgICAgc3Vic3RyaW5nLCA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnN0cjwvY29kZT4gaXMKKyAgICogICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgaW50IGluZGV4T2YoU3RyaW5nIHN0cik7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGluZGV4IHdpdGhpbiB0aGlzIHN0cmluZyBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKKyAgICogc3BlY2lmaWVkIHN1YnN0cmluZy4gVGhlIGludGVnZXIgcmV0dXJuZWQgaXMgdGhlIHNtYWxsZXN0IHZhbHVlCisgICAqIDxpPms8L2k+IHN1Y2ggdGhhdDoKKyAgICogPGJsb2NrcXVvdGU+PHByZT4KKyAgICogdGhpcy5zdGFydHNXaXRoKHN0ciwgPGk+azwvaT4pCisgICAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICogaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAqCisgICAqIEBwYXJhbSAgIHN0ciAgIGFueSBzdHJpbmcuCisgICAqIEByZXR1cm4gIGlmIHRoZSBzdHJpbmcgYXJndW1lbnQgb2NjdXJzIGFzIGEgc3Vic3RyaW5nIHdpdGhpbiB0aGlzCisgICAqICAgICAgICAgIG9iamVjdCwgdGhlbiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZmlyc3QKKyAgICogICAgICAgICAgc3VjaCBzdWJzdHJpbmcgaXMgcmV0dXJuZWQ7IGlmIGl0IGRvZXMgbm90IG9jY3VyIGFzIGEKKyAgICogICAgICAgICAgc3Vic3RyaW5nLCA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnN0cjwvY29kZT4gaXMKKyAgICogICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgaW50IGluZGV4T2YoWE1MU3RyaW5nIHN0cik7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGluZGV4IHdpdGhpbiB0aGlzIHN0cmluZyBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKKyAgICogc3BlY2lmaWVkIHN1YnN0cmluZywgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gVGhlIGludGVnZXIKKyAgICogcmV0dXJuZWQgaXMgdGhlIHNtYWxsZXN0IHZhbHVlIDxpPms8L2k+IHN1Y2ggdGhhdDoKKyAgICogPGJsb2NrcXVvdGU+PHByZT4KKyAgICogdGhpcy5zdGFydHNXaXRoKHN0ciwgPGk+azwvaT4pICYmICg8aT5rPC9pPiA+PSBmcm9tSW5kZXgpCisgICAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICogaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAqIDxwPgorICAgKiBUaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiB0aGUgdmFsdWUgb2YgPGNvZGU+ZnJvbUluZGV4PC9jb2RlPi4gSWYKKyAgICogaXQgaXMgbmVnYXRpdmUsIGl0IGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgaWYgaXQgd2VyZSB6ZXJvOiB0aGlzIGVudGlyZQorICAgKiBzdHJpbmcgbWF5IGJlIHNlYXJjaGVkLiBJZiBpdCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzCisgICAqIHN0cmluZywgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBpZiBpdCB3ZXJlIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YKKyAgICogdGhpcyBzdHJpbmc6IDxjb2RlPi0xPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICoKKyAgICogQHBhcmFtICAgc3RyICAgICAgICAgdGhlIHN1YnN0cmluZyB0byBzZWFyY2ggZm9yLgorICAgKiBAcGFyYW0gICBmcm9tSW5kZXggICB0aGUgaW5kZXggdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLgorICAgKiBAcmV0dXJuICBJZiB0aGUgc3RyaW5nIGFyZ3VtZW50IG9jY3VycyBhcyBhIHN1YnN0cmluZyB3aXRoaW4gdGhpcworICAgKiAgICAgICAgICBvYmplY3QgYXQgYSBzdGFydGluZyBpbmRleCBubyBzbWFsbGVyIHRoYW4KKyAgICogICAgICAgICAgPGNvZGU+ZnJvbUluZGV4PC9jb2RlPiwgdGhlbiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgKiAgICAgICAgICBvZiB0aGUgZmlyc3Qgc3VjaCBzdWJzdHJpbmcgaXMgcmV0dXJuZWQuIElmIGl0IGRvZXMgbm90IG9jY3VyCisgICAqICAgICAgICAgIGFzIGEgc3Vic3RyaW5nIHN0YXJ0aW5nIGF0IDxjb2RlPmZyb21JbmRleDwvY29kZT4gb3IgYmV5b25kLAorICAgKiAgICAgICAgICA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnN0cjwvY29kZT4gaXMKKyAgICogICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBpbnQgaW5kZXhPZihTdHJpbmcgc3RyLCBpbnQgZnJvbUluZGV4KTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5kZXggd2l0aGluIHRoaXMgc3RyaW5nIG9mIHRoZSByaWdodG1vc3Qgb2NjdXJyZW5jZQorICAgKiBvZiB0aGUgc3BlY2lmaWVkIHN1YnN0cmluZy4gIFRoZSByaWdodG1vc3QgZW1wdHkgc3RyaW5nICIiIGlzCisgICAqIGNvbnNpZGVyZWQgdG8gb2NjdXIgYXQgdGhlIGluZGV4IHZhbHVlIDxjb2RlPnRoaXMubGVuZ3RoKCk8L2NvZGU+LgorICAgKiBUaGUgcmV0dXJuZWQgaW5kZXggaXMgdGhlIGxhcmdlc3QgdmFsdWUgPGk+azwvaT4gc3VjaCB0aGF0CisgICAqIDxibG9ja3F1b3RlPjxwcmU+CisgICAqIHRoaXMuc3RhcnRzV2l0aChzdHIsIGspCisgICAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICogaXMgdHJ1ZS4KKyAgICoKKyAgICogQHBhcmFtICAgc3RyICAgdGhlIHN1YnN0cmluZyB0byBzZWFyY2ggZm9yLgorICAgKiBAcmV0dXJuICBpZiB0aGUgc3RyaW5nIGFyZ3VtZW50IG9jY3VycyBvbmUgb3IgbW9yZSB0aW1lcyBhcyBhIHN1YnN0cmluZworICAgKiAgICAgICAgICB3aXRoaW4gdGhpcyBvYmplY3QsIHRoZW4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKKyAgICogICAgICAgICAgdGhlIGxhc3Qgc3VjaCBzdWJzdHJpbmcgaXMgcmV0dXJuZWQuIElmIGl0IGRvZXMgbm90IG9jY3VyIGFzCisgICAqICAgICAgICAgIGEgc3Vic3RyaW5nLCA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uICBpZiA8Y29kZT5zdHI8L2NvZGU+IGlzCisgICAqICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGludCBsYXN0SW5kZXhPZihTdHJpbmcgc3RyKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5kZXggd2l0aGluIHRoaXMgc3RyaW5nIG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YKKyAgICogdGhlIHNwZWNpZmllZCBzdWJzdHJpbmcuCisgICAqCisgICAqIEBwYXJhbSAgIHN0ciAgICAgICAgIHRoZSBzdWJzdHJpbmcgdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtICAgZnJvbUluZGV4ICAgdGhlIGluZGV4IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gVGhlcmUgaXMgbm8KKyAgICogICAgICAgICAgcmVzdHJpY3Rpb24gb24gdGhlIHZhbHVlIG9mIGZyb21JbmRleC4gSWYgaXQgaXMgZ3JlYXRlciB0aGFuCisgICAqICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhpcyBzdHJpbmcsIGl0IGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgaWYgaXQKKyAgICogICAgICAgICAgd2VyZSBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgc3RyaW5nOiB0aGlzIGVudGlyZSBzdHJpbmcKKyAgICogICAgICAgICAgbWF5IGJlIHNlYXJjaGVkLiBJZiBpdCBpcyBuZWdhdGl2ZSwgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdAorICAgKiAgICAgICAgICBhcyBpZiBpdCB3ZXJlIC0xOiAtMSBpcyByZXR1cm5lZC4KKyAgICogQHJldHVybiAgSWYgdGhlIHN0cmluZyBhcmd1bWVudCBvY2N1cnMgb25lIG9yIG1vcmUgdGltZXMgYXMgYSBzdWJzdHJpbmcKKyAgICogICAgICAgICAgd2l0aGluIHRoaXMgb2JqZWN0IGF0IGEgc3RhcnRpbmcgaW5kZXggbm8gZ3JlYXRlciB0aGFuCisgICAqICAgICAgICAgIDxjb2RlPmZyb21JbmRleDwvY29kZT4sIHRoZW4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKKyAgICogICAgICAgICAgdGhlIGxhc3Qgc3VjaCBzdWJzdHJpbmcgaXMgcmV0dXJuZWQuIElmIGl0IGRvZXMgbm90IG9jY3VyIGFzIGEKKyAgICogICAgICAgICAgc3Vic3RyaW5nIHN0YXJ0aW5nIGF0IDxjb2RlPmZyb21JbmRleDwvY29kZT4gb3IgZWFybGllciwKKyAgICogICAgICAgICAgPGNvZGU+LTE8L2NvZGU+IGlzIHJldHVybmVkLgorICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5zdHI8L2NvZGU+IGlzCisgICAqICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGludCBsYXN0SW5kZXhPZihTdHJpbmcgc3RyLCBpbnQgZnJvbUluZGV4KTsKKworICAvKioKKyAgICogUmV0dXJucyBhIG5ldyBzdHJpbmcgdGhhdCBpcyBhIHN1YnN0cmluZyBvZiB0aGlzIHN0cmluZy4gVGhlCisgICAqIHN1YnN0cmluZyBiZWdpbnMgd2l0aCB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggYW5kCisgICAqIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGlzIHN0cmluZy4gPHA+CisgICAqIEV4YW1wbGVzOgorICAgKiA8YmxvY2txdW90ZT48cHJlPgorICAgKiAidW5oYXBweSIuc3Vic3RyaW5nKDIpIHJldHVybnMgImhhcHB5IgorICAgKiAiSGFyYmlzb24iLnN1YnN0cmluZygzKSByZXR1cm5zICJiaXNvbiIKKyAgICogImVtcHRpbmVzcyIuc3Vic3RyaW5nKDkpIHJldHVybnMgIiIgKGFuIGVtcHR5IHN0cmluZykKKyAgICogPC9wcmU+PC9ibG9ja3F1b3RlPgorICAgKgorICAgKiBAcGFyYW0gICAgICBiZWdpbkluZGV4ICAgdGhlIGJlZ2lubmluZyBpbmRleCwgaW5jbHVzaXZlLgorICAgKiBAcmV0dXJuICAgICB0aGUgc3BlY2lmaWVkIHN1YnN0cmluZy4KKyAgICogQGV4Y2VwdGlvbiAgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAgaWYKKyAgICogICAgICAgICAgICAgPGNvZGU+YmVnaW5JbmRleDwvY29kZT4gaXMgbmVnYXRpdmUgb3IgbGFyZ2VyIHRoYW4gdGhlCisgICAqICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0LgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IFhNTFN0cmluZyBzdWJzdHJpbmcoaW50IGJlZ2luSW5kZXgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbmV3IHN0cmluZyB0aGF0IGlzIGEgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nLiBUaGUKKyAgICogc3Vic3RyaW5nIGJlZ2lucyBhdCB0aGUgc3BlY2lmaWVkIDxjb2RlPmJlZ2luSW5kZXg8L2NvZGU+IGFuZAorICAgKiBleHRlbmRzIHRvIHRoZSBjaGFyYWN0ZXIgYXQgaW5kZXggPGNvZGU+ZW5kSW5kZXggLSAxPC9jb2RlPi4KKyAgICogVGh1cyB0aGUgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcgaXMgPGNvZGU+ZW5kSW5kZXgtYmVnaW5JbmRleDwvY29kZT4uCisgICAqCisgICAqIEBwYXJhbSAgICAgIGJlZ2luSW5kZXggICB0aGUgYmVnaW5uaW5nIGluZGV4LCBpbmNsdXNpdmUuCisgICAqIEBwYXJhbSAgICAgIGVuZEluZGV4ICAgICB0aGUgZW5kaW5nIGluZGV4LCBleGNsdXNpdmUuCisgICAqIEByZXR1cm4gICAgIHRoZSBzcGVjaWZpZWQgc3Vic3RyaW5nLgorICAgKiBAZXhjZXB0aW9uICBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uICBpZiB0aGUKKyAgICogICAgICAgICAgICAgPGNvZGU+YmVnaW5JbmRleDwvY29kZT4gaXMgbmVnYXRpdmUsIG9yCisgICAqICAgICAgICAgICAgIDxjb2RlPmVuZEluZGV4PC9jb2RlPiBpcyBsYXJnZXIgdGhhbiB0aGUgbGVuZ3RoIG9mCisgICAqICAgICAgICAgICAgIHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QsIG9yCisgICAqICAgICAgICAgICAgIDxjb2RlPmJlZ2luSW5kZXg8L2NvZGU+IGlzIGxhcmdlciB0aGFuCisgICAqICAgICAgICAgICAgIDxjb2RlPmVuZEluZGV4PC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBYTUxTdHJpbmcgc3Vic3RyaW5nKGludCBiZWdpbkluZGV4LCBpbnQgZW5kSW5kZXgpOworCisgIC8qKgorICAgKiBDb25jYXRlbmF0ZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIGVuZCBvZiB0aGlzIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtICAgc3RyICAgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdGhhdCBpcyBjb25jYXRlbmF0ZWQgdG8gdGhlIGVuZAorICAgKiAgICAgICAgICAgICAgICBvZiB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4uCisgICAqIEByZXR1cm4gIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGlzIG9iamVjdCdzCisgICAqICAgICAgICAgIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgdGhlIHN0cmluZyBhcmd1bWVudCdzIGNoYXJhY3RlcnMuCisgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnN0cjwvY29kZT4gaXMKKyAgICogICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgWE1MU3RyaW5nIGNvbmNhdChTdHJpbmcgc3RyKTsKKworICAvKioKKyAgICogQ29udmVydHMgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBsb3dlcgorICAgKiBjYXNlIHVzaW5nIHRoZSBydWxlcyBvZiB0aGUgZ2l2ZW4gPGNvZGU+TG9jYWxlPC9jb2RlPi4KKyAgICoKKyAgICogQHBhcmFtIGxvY2FsZSB1c2UgdGhlIGNhc2UgdHJhbnNmb3JtYXRpb24gcnVsZXMgZm9yIHRoaXMgbG9jYWxlCisgICAqIEByZXR1cm4gdGhlIFN0cmluZywgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KKyAgICogQHNlZSAgICAgamF2YS5sYW5nLkNoYXJhY3RlciN0b0xvd2VyQ2FzZShjaGFyKQorICAgKiBAc2VlICAgICBqYXZhLmxhbmcuU3RyaW5nI3RvVXBwZXJDYXNlKExvY2FsZSkKKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBYTUxTdHJpbmcgdG9Mb3dlckNhc2UoTG9jYWxlIGxvY2FsZSk7CisKKyAgLyoqCisgICAqIENvbnZlcnRzIGFsbCBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gbG93ZXIKKyAgICogY2FzZSB1c2luZyB0aGUgcnVsZXMgb2YgdGhlIGRlZmF1bHQgbG9jYWxlLCB3aGljaCBpcyByZXR1cm5lZAorICAgKiBieSA8Y29kZT5Mb2NhbGUuZ2V0RGVmYXVsdDwvY29kZT4uCisgICAqIDxwPgorICAgKgorICAgKiBAcmV0dXJuICB0aGUgc3RyaW5nLCBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLgorICAgKiBAc2VlICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyI3RvTG93ZXJDYXNlKGNoYXIpCisgICAqIEBzZWUgICAgIGphdmEubGFuZy5TdHJpbmcjdG9Mb3dlckNhc2UoTG9jYWxlKQorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IFhNTFN0cmluZyB0b0xvd2VyQ2FzZSgpOworCisgIC8qKgorICAgKiBDb252ZXJ0cyBhbGwgb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIHVwcGVyCisgICAqIGNhc2UgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoZSBnaXZlbiBsb2NhbGUuCisgICAqIEBwYXJhbSBsb2NhbGUgdXNlIHRoZSBjYXNlIHRyYW5zZm9ybWF0aW9uIHJ1bGVzIGZvciB0aGlzIGxvY2FsZQorICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcsIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuCisgICAqIEBzZWUgICAgIGphdmEubGFuZy5DaGFyYWN0ZXIjdG9VcHBlckNhc2UoY2hhcikKKyAgICogQHNlZSAgICAgamF2YS5sYW5nLlN0cmluZyN0b0xvd2VyQ2FzZShMb2NhbGUpCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgWE1MU3RyaW5nIHRvVXBwZXJDYXNlKExvY2FsZSBsb2NhbGUpOworCisgIC8qKgorICAgKiBDb252ZXJ0cyBhbGwgb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIHVwcGVyCisgICAqIGNhc2UgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoZSBkZWZhdWx0IGxvY2FsZSwgd2hpY2ggaXMgcmV0dXJuZWQKKyAgICogYnkgPGNvZGU+TG9jYWxlLmdldERlZmF1bHQ8L2NvZGU+LgorICAgKgorICAgKiA8cD4KKyAgICogSWYgbm8gY2hhcmFjdGVyIGluIHRoaXMgc3RyaW5nIGhhcyBhIGRpZmZlcmVudCB1cHBlcmNhc2UgdmVyc2lvbiwKKyAgICogYmFzZWQgb24gY2FsbGluZyB0aGUgPGNvZGU+dG9VcHBlckNhc2U8L2NvZGU+IG1ldGhvZCBkZWZpbmVkIGJ5CisgICAqIDxjb2RlPkNoYXJhY3RlcjwvY29kZT4sIHRoZW4gdGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZC4KKyAgICogPHA+CisgICAqIE90aGVyd2lzZSwgdGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdAorICAgKiByZXByZXNlbnRpbmcgYSBjaGFyYWN0ZXIgc2VxdWVuY2UgaWRlbnRpY2FsIGluIGxlbmd0aCB0byB0aGUKKyAgICogY2hhcmFjdGVyIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgYW5kCisgICAqIHdpdGggZXZlcnkgY2hhcmFjdGVyIGVxdWFsIHRvIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIG1ldGhvZAorICAgKiA8Y29kZT5DaGFyYWN0ZXIudG9VcHBlckNhc2U8L2NvZGU+IHRvIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJhY3RlciBvZgorICAgKiB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0LiA8cD4KKyAgICogRXhhbXBsZXM6CisgICAqIDxibG9ja3F1b3RlPjxwcmU+CisgICAqICJGYWhydmVyZ278Z2VuIi50b1VwcGVyQ2FzZSgpIHJldHVybnMgIkZBSFJWRVJHTtxHRU4iCisgICAqICJWaXNpdCBManViaW5qZSEiLnRvVXBwZXJDYXNlKCkgcmV0dXJucyAiVklTSVQgTEpVQklOSkUhIgorICAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+CisgICAqCisgICAqIEByZXR1cm4gIHRoZSBzdHJpbmcsIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuCisgICAqIEBzZWUgICAgIGphdmEubGFuZy5DaGFyYWN0ZXIjdG9VcHBlckNhc2UoY2hhcikKKyAgICogQHNlZSAgICAgamF2YS5sYW5nLlN0cmluZyN0b1VwcGVyQ2FzZShMb2NhbGUpCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgWE1MU3RyaW5nIHRvVXBwZXJDYXNlKCk7CisKKyAgLyoqCisgICAqIFJlbW92ZXMgd2hpdGUgc3BhY2UgZnJvbSBib3RoIGVuZHMgb2YgdGhpcyBzdHJpbmcuCisgICAqIDxwPgorICAgKiBJZiB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IHJlcHJlc2VudHMgYW4gZW1wdHkgY2hhcmFjdGVyCisgICAqIHNlcXVlbmNlLCBvciB0aGUgZmlyc3QgYW5kIGxhc3QgY2hhcmFjdGVycyBvZiBjaGFyYWN0ZXIgc2VxdWVuY2UKKyAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCBib3RoIGhhdmUgY29kZXMKKyAgICogZ3JlYXRlciB0aGFuIDxjb2RlPicmIzkyO3UwMDIwJzwvY29kZT4gKHRoZSBzcGFjZSBjaGFyYWN0ZXIpLCB0aGVuIGEKKyAgICogcmVmZXJlbmNlIHRvIHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgaXMgcmV0dXJuZWQuCisgICAqIDxwPgorICAgKiBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIG5vIGNoYXJhY3RlciB3aXRoIGEgY29kZSBncmVhdGVyIHRoYW4KKyAgICogPGNvZGU+JyYjOTI7dTAwMjAnPC9jb2RlPiBpbiB0aGUgc3RyaW5nLCB0aGVuIGEgbmV3CisgICAqIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbXB0eSBzdHJpbmcgaXMgY3JlYXRlZAorICAgKiBhbmQgcmV0dXJuZWQuCisgICAqIDxwPgorICAgKiBPdGhlcndpc2UsIGxldCA8aT5rPC9pPiBiZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUKKyAgICogc3RyaW5nIHdob3NlIGNvZGUgaXMgZ3JlYXRlciB0aGFuIDxjb2RlPicmIzkyO3UwMDIwJzwvY29kZT4sIGFuZCBsZXQKKyAgICogPGk+bTwvaT4gYmUgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHdob3NlIGNvZGUKKyAgICogaXMgZ3JlYXRlciB0aGFuIDxjb2RlPicmIzkyO3UwMDIwJzwvY29kZT4uIEEgbmV3IDxjb2RlPlN0cmluZzwvY29kZT4KKyAgICogb2JqZWN0IGlzIGNyZWF0ZWQsIHJlcHJlc2VudGluZyB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIHRoYXQKKyAgICogYmVnaW5zIHdpdGggdGhlIGNoYXJhY3RlciBhdCBpbmRleCA8aT5rPC9pPiBhbmQgZW5kcyB3aXRoIHRoZQorICAgKiBjaGFyYWN0ZXIgYXQgaW5kZXggPGk+bTwvaT4tdGhhdCBpcywgdGhlIHJlc3VsdCBvZgorICAgKiA8Y29kZT50aGlzLnN1YnN0cmluZyg8aT5rPC9pPiwmbmJzcDs8aT5tPC9pPisxKTwvY29kZT4uCisgICAqIDxwPgorICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgdXNlZCB0byB0cmltCisgICAqIHtAbGluayBDaGFyYWN0ZXIjaXNTcGFjZShjaGFyKSB3aGl0ZXNwYWNlfSBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZAorICAgKiBvZiBhIHN0cmluZzsgaW4gZmFjdCwgaXQgdHJpbXMgYWxsIEFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVycyBhcyB3ZWxsLgorICAgKgorICAgKiBAcmV0dXJuICB0aGlzIHN0cmluZywgd2l0aCB3aGl0ZSBzcGFjZSByZW1vdmVkIGZyb20gdGhlIGZyb250IGFuZCBlbmQuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgWE1MU3RyaW5nIHRyaW0oKTsKKworICAvKioKKyAgICogVGhpcyBvYmplY3QgKHdoaWNoIGlzIGFscmVhZHkgYSBzdHJpbmchKSBpcyBpdHNlbGYgcmV0dXJuZWQuCisgICAqCisgICAqIEByZXR1cm4gIHRoZSBzdHJpbmcgaXRzZWxmLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZygpOworICAKKyAgLyoqCisgICAqIFRlbGwgaWYgdGhpcyBvYmplY3QgY29udGFpbnMgYSBqYXZhIFN0cmluZyBvYmplY3QuCisgICAqIAorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBYTUxTdHJpbmcgY2FuIHJldHVybiBhIHN0cmluZyB3aXRob3V0IGNyZWF0aW5nIG9uZS4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1N0cmluZygpOworICAKKyAgLyoqCisgICAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBkb3VibGUgLS0gQWxsb3dlZCBpbnB1dCBpcyBpbiBmaXhlZAorICAgKiBub3RhdGlvbiBkZGQuZmZmLgorICAgKgorICAgKiBAcmV0dXJuIEEgZG91YmxlIHZhbHVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdHJpbmcsIG9yIHJldHVybiBEb3VibGUuTmFOIAorICAgKiBpZiB0aGUgc3RyaW5nIGNhbiBub3QgYmUgY29udmVydGVkLgorICAgKi8KKyAgcHVibGljIGRvdWJsZSB0b0RvdWJsZSgpOworfQpkaWZmIC0tZ2l0IGEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvWFNMUHJvY2Vzc29yRXhjZXB0aW9uLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvWE1MU3RyaW5nRmFjdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjQlCnJlbmFtZSBmcm9tIGNvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFByb2Nlc3NvckV4Y2VwdGlvbi5qYXZhCnJlbmFtZSB0byBzcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMvWE1MU3RyaW5nRmFjdG9yeS5qYXZhCmluZGV4IDBhMmIzNTIuLjg2NzU1OTcgMTAwNjQ0Ci0tLSBhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0L1hTTFByb2Nlc3NvckV4Y2VwdGlvbi5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscy9YTUxTdHJpbmdGYWN0b3J5LmphdmEKQEAgLTU0LDU0ICs1NCw1NCBAQAogICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCiAgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCiAgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54c2x0OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ucmVzLlhTTFRFcnJvclJlc291cmNlczsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnJlcy5YU0xNZXNzYWdlczsKLQorcGFja2FnZSBvcmcuYXBhY2hlLnhtbC51dGlsczsKIAogLyoqCi0gKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgotICogVGhlIGV4Y2VwdGlvbiB1c2VkIGZvciBtb3N0IFhTTFQgZXJyb3JzLgorICogQSBjb25jcmV0ZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgY3JlYXRlcyBYTUxTdHJpbmcgb2JqZWN0cy4KICAqLwotcHVibGljIGNsYXNzIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiBleHRlbmRzIFNBWEV4Y2VwdGlvbgorcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTFN0cmluZ0ZhY3RvcnkKIHsKLSAgcHJpdmF0ZSBFeGNlcHRpb24gbV9leGNlcHRpb247Ci0gIAorCiAgIC8qKgotICAgKiBDcmVhdGUgYW4gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIG9iamVjdCB0aGF0IGhvbGRzIAotICAgKiBhbiBlcnJvciBtZXNzYWdlLgotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS4KKyAgICogQ3JlYXRlIGEgbmV3IFhNTFN0cmluZyBmcm9tIGEgSmF2YSBzdHJpbmcuCisgICAqCisgICAqCisgICAqIEBwYXJhbSBzdHJpbmcgSmF2YSBTdHJpbmcgcmVmZXJlbmNlLCB3aGljaCBtdXN0IGJlIG5vbi1udWxsLgorICAgKgorICAgKiBAcmV0dXJuIEFuIFhNTFN0cmluZyBvYmplY3QgdGhhdCB3cmFwcyB0aGUgU3RyaW5nIHJlZmVyZW5jZS4KICAgICovCi0gIHB1YmxpYyBYU0xQcm9jZXNzb3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIAotICB7Ci0gICAgIHN1cGVyKChudWxsID09IG1lc3NhZ2UpID8gWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZShYU0xURXJyb3JSZXNvdXJjZXMuRVJfWFNMVF9FUlJPUiwgbnVsbCkgOiBtZXNzYWdlKTsKLSAgICAgbV9leGNlcHRpb24gPSBudWxsOwotICB9Ci0gIAorICBwdWJsaWMgYWJzdHJhY3QgWE1MU3RyaW5nIG5ld3N0cihTdHJpbmcgc3RyaW5nKTsKKwogICAvKioKLSAgICogQ3JlYXRlIGFuIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiBvYmplY3QgdGhhdCBob2xkcyAKLSAgICogYW4gZXJyb3IgbWVzc2FnZSwgYW5kIGFub3RoZXIgZXhjZXB0aW9uIAotICAgKiB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbi4KLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBlIFRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24uCisgICAqIENyZWF0ZSBhIFhNTFN0cmluZyBmcm9tIGEgRmFzdFN0cmluZ0J1ZmZlci4KKyAgICoKKyAgICoKKyAgICogQHBhcmFtIHN0cmluZyBGYXN0U3RyaW5nQnVmZmVyIHJlZmVyZW5jZSwgd2hpY2ggbXVzdCBiZSBub24tbnVsbC4KKyAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCisgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQgZnJvbSB0aGUgYXJyYXkuCisgICAqCisgICAqIEByZXR1cm4gQW4gWE1MU3RyaW5nIG9iamVjdCB0aGF0IHdyYXBzIHRoZSBGYXN0U3RyaW5nQnVmZmVyIHJlZmVyZW5jZS4KICAgICovCi0gIHB1YmxpYyBYU0xQcm9jZXNzb3JFeGNlcHRpb24gKFN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gZSkKLSAgewotICAgIHN1cGVyKChudWxsID09IG1lc3NhZ2UpID8gWFNMTWVzc2FnZXMuY3JlYXRlTWVzc2FnZShYU0xURXJyb3JSZXNvdXJjZXMuRVJfWFNMVF9FUlJPUiwgbnVsbCkgOiBtZXNzYWdlKTsKLSAgICB0aGlzLm1fZXhjZXB0aW9uID0gZTsKLSAgfQotICAKKyAgcHVibGljIGFic3RyYWN0IFhNTFN0cmluZyBuZXdzdHIoRmFzdFN0cmluZ0J1ZmZlciBzdHJpbmcsIGludCBzdGFydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOworCiAgIC8qKgotICAgKiBDcmVhdGUgYW4gWFNMUHJvY2Vzc29yRXhjZXB0aW9uIG9iamVjdCB0aGF0IGhvbGRzIAotICAgKiBhbm90aGVyIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbi4KLSAgICogQHBhcmFtIGUgVGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbi4KKyAgICogQ3JlYXRlIGEgWE1MU3RyaW5nIGZyb20gYSBGYXN0U3RyaW5nQnVmZmVyLgorICAgKgorICAgKgorICAgKiBAcGFyYW0gc3RyaW5nIEZhc3RTdHJpbmdCdWZmZXIgcmVmZXJlbmNlLCB3aGljaCBtdXN0IGJlIG5vbi1udWxsLgorICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBhcnJheS4KKyAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBhcnJheS4KKyAgICoKKyAgICogQHJldHVybiBBbiBYTUxTdHJpbmcgb2JqZWN0IHRoYXQgd3JhcHMgdGhlIEZhc3RTdHJpbmdCdWZmZXIgcmVmZXJlbmNlLgogICAgKi8KLSAgcHVibGljIFhTTFByb2Nlc3NvckV4Y2VwdGlvbiAoRXhjZXB0aW9uIGUpCi0gIHsKLSAgICBzdXBlcigobnVsbCA9PSBlLmdldE1lc3NhZ2UoKSkgPyBYU0xNZXNzYWdlcy5jcmVhdGVNZXNzYWdlKFhTTFRFcnJvclJlc291cmNlcy5FUl9YU0xUX0VSUk9SLCBudWxsKSA6IGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB0aGlzLm1fZXhjZXB0aW9uID0gZTsKLSAgfQotICAgIAorICBwdWJsaWMgYWJzdHJhY3QgWE1MU3RyaW5nIG5ld3N0cihjaGFyW10gc3RyaW5nLCBpbnQgc3RhcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8qKgorICAgKiBHZXQgYSBjaGVhcCByZXByZXNlbnRhdGlvbiBvZiBhbiBlbXB0eSBzdHJpbmcuCisgICAqIAorICAgKiBAcmV0dXJuIEFuIG5vbi1udWxsIHJlZmVyZW5jZSB0byBhbiBYTUxTdHJpbmcgdGhhdCByZXByZXNlbnRzICIiLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IFhNTFN0cmluZyBlbXB0eXN0cigpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvRXhwcmVzc2lvbi5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvRXhwcmVzc2lvbi5qYXZhCmluZGV4IDhhNmNlN2MuLmUzZTA4YmIgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL0V4cHJlc3Npb24uamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9FeHByZXNzaW9uLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLnJlcy5YUEFUSEVycm9yUmVzb3VyY2VzOwpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvTm9kZVNldC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvTm9kZVNldC5qYXZhCmluZGV4IGMyZmM3NTguLjdmNzUwOWEgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL05vZGVTZXQuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9Ob2RlU2V0LmphdmEKQEAgLTU2LDEyICs1NiwxNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGg7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTU1hbmFnZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5Ob2RlVmVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguYXhlcy5Db250ZXh0Tm9kZUxpc3Q7CkBAIC05MSw3ICs5Niw4IEBACiAgKiBsZXNzLXRoYW4tZW5saWdodGVuaW5nIHJlc3VsdHMgd2hlbiB5b3UgZG8gc28uPC9wPgogICovCiBwdWJsaWMgY2xhc3MgTm9kZVNldCBleHRlbmRzIE5vZGVWZWN0b3IKLSAgICAgICAgaW1wbGVtZW50cyBOb2RlTGlzdCwgTm9kZUl0ZXJhdG9yLCBDbG9uZWFibGUsIENvbnRleHROb2RlTGlzdAorICAgICAgICBpbXBsZW1lbnRzIC8qIE5vZGVMaXN0LCBOb2RlSXRlcmF0b3IsICovIERUTUl0ZXJhdG9yLCAKKyAgICAgICAgQ2xvbmVhYmxlCiB7CiAKICAgLyoqCkBAIC0xMDYsMjUgKzExMiwyNyBAQAogICAgKiBDcmVhdGUgYW4gZW1wdHksIHVzaW5nIHRoZSBnaXZlbiBibG9jayBzaXplLgogICAgKgogICAgKiBAcGFyYW0gYmxvY2tzaXplIFNpemUgb2YgYmxvY2tzIHRvIGFsbG9jYXRlIAorICAgKiBAcGFyYW0gZHVtbXkgcGFzcyB6ZXJvIGZvciByaWdodCBub3cuLi4KICAgICovCi0gIHB1YmxpYyBOb2RlU2V0KGludCBibG9ja3NpemUpCisgIHB1YmxpYyBOb2RlU2V0KGludCBibG9ja3NpemUsIGludCBkdW1teSkKICAgewogICAgIHN1cGVyKGJsb2Nrc2l6ZSk7CiAgIH0KIAotICAvKioKLSAgICogQ3JlYXRlIGEgTm9kZVNldCwgYW5kIGNvcHkgdGhlIG1lbWJlcnMgb2YgdGhlCi0gICAqIGdpdmVuIG5vZGVsaXN0IGludG8gaXQuCi0gICAqCi0gICAqIEBwYXJhbSBub2RlbGlzdCBMaXN0IG9mIE5vZGVzIHRvIGJlIG1hZGUgbWVtYmVycyBvZiB0aGUgbmV3IHNldC4KLSAgICovCi0gIHB1YmxpYyBOb2RlU2V0KE5vZGVMaXN0IG5vZGVsaXN0KQotICB7Ci0KLSAgICBzdXBlcigpOwotCi0gICAgYWRkTm9kZXMobm9kZWxpc3QpOwotICB9CisgIC8vICVUQkQlCisvLyAgLyoqCisvLyAgICogQ3JlYXRlIGEgTm9kZVNldCwgYW5kIGNvcHkgdGhlIG1lbWJlcnMgb2YgdGhlCisvLyAgICogZ2l2ZW4gbm9kZWxpc3QgaW50byBpdC4KKy8vICAgKgorLy8gICAqIEBwYXJhbSBub2RlbGlzdCBMaXN0IG9mIE5vZGVzIHRvIGJlIG1hZGUgbWVtYmVycyBvZiB0aGUgbmV3IHNldC4KKy8vICAgKi8KKy8vICBwdWJsaWMgTm9kZVNldChOb2RlTGlzdCBub2RlbGlzdCkKKy8vICB7CisvLworLy8gICAgc3VwZXIoKTsKKy8vCisvLyAgICBhZGROb2Rlcyhub2RlbGlzdCk7CisvLyAgfQogCiAgIC8qKgogICAgKiBDcmVhdGUgYSBOb2RlU2V0LCBhbmQgY29weSB0aGUgbWVtYmVycyBvZiB0aGUKQEAgLTEzNywxNiArMTQ1LDE2IEBACiAKICAgICBzdXBlcigpOwogCi0gICAgYWRkTm9kZXMoKE5vZGVJdGVyYXRvcikgbm9kZWxpc3QpOworICAgIGFkZE5vZGVzKChEVE1JdGVyYXRvcikgbm9kZWxpc3QpOwogICB9CiAKICAgLyoqCiAgICAqIENyZWF0ZSBhIE5vZGVTZXQsIGFuZCBjb3B5IHRoZSBtZW1iZXJzIG9mIHRoZQotICAgKiBnaXZlbiBOb2RlSXRlcmF0b3IgaW50byBpdC4KKyAgICogZ2l2ZW4gRFRNSXRlcmF0b3IgaW50byBpdC4KICAgICoKICAgICogQHBhcmFtIG5pIEl0ZXJhdG9yIHdoaWNoIHlpZWxkcyBOb2RlcyB0byBiZSBtYWRlIG1lbWJlcnMgb2YgdGhlIG5ldyBzZXQuCiAgICAqLwotICBwdWJsaWMgTm9kZVNldChOb2RlSXRlcmF0b3IgbmkpCisgIHB1YmxpYyBOb2RlU2V0KERUTUl0ZXJhdG9yIG5pKQogICB7CiAKICAgICBzdXBlcigpOwpAQCAtMTU5LDIyICsxNjcsNTYgQEAKICAgICoKICAgICogQHBhcmFtIG5vZGUgU2luZ2xlIG5vZGUgdG8gYmUgYWRkZWQgdG8gdGhlIG5ldyBzZXQuCiAgICAqLwotICBwdWJsaWMgTm9kZVNldChOb2RlIG5vZGUpCisgIHB1YmxpYyBOb2RlU2V0KGludCBub2RlKQogICB7CiAKICAgICBzdXBlcigpOwogCiAgICAgYWRkTm9kZShub2RlKTsKICAgfQorICAKKyAgLyoqCisgICAqIFNldCB0aGUgZW52aXJvbm1lbnQgaW4gd2hpY2ggdGhpcyBpdGVyYXRvciBvcGVyYXRlcywgd2hpY2ggc2hvdWxkIHByb3ZpZGU6CisgICAqIGEgbm9kZSAodGhlIGNvbnRleHQgbm9kZS4uLiBzYW1lIHZhbHVlIGFzICJyb290IiBkZWZpbmVkIGJlbG93KSAKKyAgICogYSBwYWlyIG9mIG5vbi16ZXJvIHBvc2l0aXZlIGludGVnZXJzICh0aGUgY29udGV4dCBwb3NpdGlvbiBhbmQgdGhlIGNvbnRleHQgc2l6ZSkgCisgICAqIGEgc2V0IG9mIHZhcmlhYmxlIGJpbmRpbmdzIAorICAgKiBhIGZ1bmN0aW9uIGxpYnJhcnkgCisgICAqIHRoZSBzZXQgb2YgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBpbiBzY29wZSBmb3IgdGhlIGV4cHJlc3Npb24uCisgICAqIAorICAgKiA8cD5BdCB0aGlzIHRpbWUgdGhlIGV4YWN0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZW52aXJvbm1lbnQgaXMgYXBwbGljYXRpb24gCisgICAqIGRlcGVuZGVudC4gIFByb2JhYmx5IGEgcHJvcGVyIGludGVyZmFjZSB3aWxsIGJlIGNyZWF0ZWQgZmFpcmx5IHNvb24uPC9wPgorICAgKiAKKyAgICogQHBhcmFtIGVudmlyb25tZW50IFRoZSBlbnZpcm9ubWVudCBvYmplY3QuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChPYmplY3QgZW52aXJvbm1lbnQpCisgIHsKKyAgICAvLyBuby1vcAorICB9CisKIAogICAvKioKICAgICogQHJldHVybiBUaGUgcm9vdCBub2RlIG9mIHRoZSBJdGVyYXRvciwgYXMgc3BlY2lmaWVkIHdoZW4gaXQgd2FzIGNyZWF0ZWQuCiAgICAqIEZvciBub24tSXRlcmF0b3IgTm9kZVNldHMsIHRoaXMgd2lsbCBiZSBudWxsLgogICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0Um9vdCgpCisgIHB1YmxpYyBpbnQgZ2V0Um9vdCgpCiAgIHsKLSAgICByZXR1cm4gbnVsbDsKKyAgICAvLyAlVEJEJT8KKyAgICByZXR1cm4gRFRNLk5VTEw7CiAgIH0KKyAgCisgIC8qKgorICAgKiBUaGUgcm9vdCBub2RlIG9mIHRoZSA8Y29kZT5EVE1JdGVyYXRvcjwvY29kZT4sIGFzIHNwZWNpZmllZCB3aGVuIGl0CisgICAqIHdhcyBjcmVhdGVkLiAgTm90ZSB0aGUgcm9vdCBub2RlIGlzIG5vdCB0aGUgcm9vdCBub2RlIG9mIHRoZSAKKyAgICogZG9jdW1lbnQgdHJlZSwgYnV0IHRoZSBjb250ZXh0IG5vZGUgZnJvbSB3aGVyZSB0aGUgaXR0ZXJhdGlvbiAKKyAgICogYmVnaW5zLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSBpbnQgSGFuZGxlIG9mIHRoZSBjb250ZXh0IG5vZGUuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRSb290KGludCBub2RlSGFuZGxlKQorICB7CisgIC8vICVUQkQlCisgIH0KKwogCiAgIC8qKgogICAgKiBDbG9uZSB0aGlzIE5vZGVTZXQuCkBAIC0yMDYsNyArMjQ4LDcgQEAKICAgICogQHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiB0aGlzIHN1YmNsYXNzIG9mIE5vZGVTZXQKICAgICogZG9lcyBub3Qgc3VwcG9ydCB0aGUgY2xvbmUoKSBvcGVyYXRpb24uCiAgICAqLwotICBwdWJsaWMgTm9kZUl0ZXJhdG9yIGNsb25lV2l0aFJlc2V0KCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCisgIHB1YmxpYyBEVE1JdGVyYXRvciBjbG9uZVdpdGhSZXNldCgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbgogICB7CiAKICAgICBOb2RlU2V0IGNsb25lID0gKE5vZGVTZXQpIGNsb25lKCk7CkBAIC0yMjcsMjYgKzI2OSwyNiBAQAogICAvKioKICAgICogIFRoaXMgYXR0cmlidXRlIGRldGVybWluZXMgd2hpY2ggbm9kZSB0eXBlcyBhcmUgcHJlc2VudGVkIHZpYSB0aGUKICAgICogaXRlcmF0b3IuIFRoZSBhdmFpbGFibGUgc2V0IG9mIGNvbnN0YW50cyBpcyBkZWZpbmVkIGluIHRoZQotICAgKiA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiBpbnRlcmZhY2UuIEZvciBOb2RlU2V0cywgdGhlIG1hc2sgaGFzIGJlZW4KKyAgICogPGNvZGU+RFRNRmlsdGVyPC9jb2RlPiBpbnRlcmZhY2UuIEZvciBOb2RlU2V0cywgdGhlIG1hc2sgaGFzIGJlZW4KICAgICogaGFyZGNvZGVkIHRvIHNob3cgYWxsIG5vZGVzIGV4Y2VwdCBFbnRpdHlSZWZlcmVuY2Ugbm9kZXMsIHdoaWNoIGhhdmUKICAgICogbm8gZXF1aXZhbGVudCBpbiB0aGUgWFBhdGggZGF0YSBtb2RlbC4KICAgICoKICAgICogQHJldHVybiBpbnRlZ2VyIHVzZWQgYXMgYSBiaXQtYXJyYXksIGNvbnRhaW5pbmcgZmxhZ3MgZGVmaW5lZCBpbgotICAgKiB0aGUgRE9NJ3MgTm9kZUZpbHRlciBjbGFzcy4gVGhlIHZhbHVlIHdpbGwgYmUgCisgICAqIHRoZSBET00ncyBEVE1GaWx0ZXIgY2xhc3MuIFRoZSB2YWx1ZSB3aWxsIGJlIAogICAgKiA8Y29kZT5TSE9XX0FMTCAmIH5TSE9XX0VOVElUWV9SRUZFUkVOQ0U8L2NvZGU+LCBtZWFuaW5nIHRoYXQKICAgICogb25seSBlbnRpdHkgcmVmZXJlbmNlcyBhcmUgc3VwcHJlc3NlZC4KICAgICovCiAgIHB1YmxpYyBpbnQgZ2V0V2hhdFRvU2hvdygpCiAgIHsKLSAgICByZXR1cm4gTm9kZUZpbHRlci5TSE9XX0FMTCAmIH5Ob2RlRmlsdGVyLlNIT1dfRU5USVRZX1JFRkVSRU5DRTsKKyAgICByZXR1cm4gRFRNRmlsdGVyLlNIT1dfQUxMICYgfkRUTUZpbHRlci5TSE9XX0VOVElUWV9SRUZFUkVOQ0U7CiAgIH0KIAogICAvKioKICAgICogVGhlIGZpbHRlciBvYmplY3QgdXNlZCB0byBzY3JlZW4gbm9kZXMuIEZpbHRlcnMgYXJlIGFwcGxpZWQgdG8KLSAgICogZnVydGhlciByZWR1Y2UgKGFuZCByZXN0cnVjdHVyZSkgdGhlIE5vZGVJdGVyYXRvcidzIHZpZXcgb2YgdGhlCisgICAqIGZ1cnRoZXIgcmVkdWNlIChhbmQgcmVzdHJ1Y3R1cmUpIHRoZSBEVE1JdGVyYXRvcidzIHZpZXcgb2YgdGhlCiAgICAqIGRvY3VtZW50LiBJbiBvdXIgY2FzZSwgd2Ugd2lsbCBiZSB1c2luZyBoYXJkY29kZWQgZmlsdGVycyBidWlsdAogICAgKiBpbnRvIG91ciBpdGVyYXRvcnMuLi4gYnV0IGdldEZpbHRlcigpIGlzIHBhcnQgb2YgdGhlIERPTSdzIAotICAgKiBOb2RlSXRlcmF0b3IgaW50ZXJmYWNlLCBzbyB3ZSBoYXZlIHRvIHN1cHBvcnQgaXQuCisgICAqIERUTUl0ZXJhdG9yIGludGVyZmFjZSwgc28gd2UgaGF2ZSB0byBzdXBwb3J0IGl0LgogICAgKgogICAgKiBAcmV0dXJuIG51bGwsIHdoaWNoIGlzIHNsaWdodGx5IG1pc2xlYWRpbmcuIFRydWUsIHRoZXJlIGlzIG5vCiAgICAqIHVzZXItd3JpdHRlbiBmaWx0ZXIgb2JqZWN0LCBidXQgaW4gZmFjdCB3ZSBhcmUgZG9pbmcgc29tZSB2ZXJ5CkBAIC0yNTQsNyArMjk2LDcgQEAKICAgICogcmV0dXJuaW5nIGEgcGxhY2Vob2xkZXIgb2JqZWN0IGp1c3QgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzCiAgICAqIG5vdCBnb2luZyB0byByZXR1cm4gYWxsIG5vZGVzIHNlbGVjdGVkIGJ5IHdoYXRUb1Nob3cuCiAgICAqLwotICBwdWJsaWMgTm9kZUZpbHRlciBnZXRGaWx0ZXIoKQorICBwdWJsaWMgRFRNRmlsdGVyIGdldEZpbHRlcigpCiAgIHsKICAgICByZXR1cm4gbnVsbDsKICAgfQpAQCAtMjc5LDEwICszMjEsMzggQEAKICAgewogICAgIHJldHVybiB0cnVlOwogICB9CisgIAorICAvKioKKyAgICogR2V0IGFuIGluc3RhbmNlIG9mIGEgRFRNIHRoYXQgIm93bnMiIGEgbm9kZSBoYW5kbGUuICBTaW5jZSBhIG5vZGUgCisgICAqIGl0ZXJhdG9yIG1heSBiZSBwYXNzZWQgd2l0aG91dCBhIERUTU1hbmFnZXIsIHRoaXMgYWxsb3dzIHRoZSAKKyAgICogY2FsbGVyIHRvIGVhc2lseSBnZXQgdGhlIERUTSB1c2luZyBqdXN0IHRoZSBpdGVyYXRvci4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIG5vZGVIYW5kbGUuCisgICAqCisgICAqIEByZXR1cm4gYSBub24tbnVsbCBEVE0gcmVmZXJlbmNlLgorICAgKi8KKyAgcHVibGljIERUTSBnZXREVE0oaW50IG5vZGVIYW5kbGUpCisgIHsKKyAgICAvLyAlVEJEJQorICAgIHJldHVybiBudWxsOworICB9CisgIAorICAvKioKKyAgICogR2V0IGFuIGluc3RhbmNlIG9mIHRoZSBEVE1NYW5hZ2VyLiAgU2luY2UgYSBub2RlIAorICAgKiBpdGVyYXRvciBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgYSBEVE1NYW5hZ2VyLCB0aGlzIGFsbG93cyB0aGUgCisgICAqIGNhbGxlciB0byBlYXNpbHkgZ2V0IHRoZSBEVE1NYW5hZ2VyIHVzaW5nIGp1c3QgdGhlIGl0ZXJhdG9yLgorICAgKgorICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgRFRNTWFuYWdlciByZWZlcmVuY2UuCisgICAqLworICBwdWJsaWMgRFRNTWFuYWdlciBnZXREVE1NYW5hZ2VyKCkKKyAgeworICAgIC8vICVUQkQlCisgICAgcmV0dXJuIG51bGw7CisgIH0KIAogICAvKioKICAgICogIFJldHVybnMgdGhlIG5leHQgbm9kZSBpbiB0aGUgc2V0IGFuZCBhZHZhbmNlcyB0aGUgcG9zaXRpb24gb2YgdGhlCi0gICAqIGl0ZXJhdG9yIGluIHRoZSBzZXQuIEFmdGVyIGEgTm9kZUl0ZXJhdG9yIGlzIGNyZWF0ZWQsIHRoZSBmaXJzdCBjYWxsCisgICAqIGl0ZXJhdG9yIGluIHRoZSBzZXQuIEFmdGVyIGEgRFRNSXRlcmF0b3IgaXMgY3JlYXRlZCwgdGhlIGZpcnN0IGNhbGwKICAgICogdG8gbmV4dE5vZGUoKSByZXR1cm5zIHRoZSBmaXJzdCBub2RlIGluIHRoZSBzZXQuCiAgICAqIEByZXR1cm4gIFRoZSBuZXh0IDxjb2RlPk5vZGU8L2NvZGU+IGluIHRoZSBzZXQgYmVpbmcgaXRlcmF0ZWQgb3Zlciwgb3IKICAgICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBtZW1iZXJzIGluIHRoYXQgc2V0LgpAQCAtMjkwLDE5ICszNjAsMTkgQEAKICAgICogICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlCiAgICAqICAgPGNvZGU+ZGV0YWNoPC9jb2RlPiBtZXRob2Qgd2FzIGludm9rZWQuCiAgICAqLwotICBwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpIHRocm93cyBET01FeGNlcHRpb24KKyAgcHVibGljIGludCBuZXh0Tm9kZSgpCiAgIHsKIAogICAgIGlmICgobV9uZXh0KSA8IHRoaXMuc2l6ZSgpKQogICAgIHsKLSAgICAgIE5vZGUgbmV4dCA9IHRoaXMuZWxlbWVudEF0KG1fbmV4dCk7CisgICAgICBpbnQgbmV4dCA9IHRoaXMuZWxlbWVudEF0KG1fbmV4dCk7CiAKICAgICAgIG1fbmV4dCsrOwogCiAgICAgICByZXR1cm4gbmV4dDsKICAgICB9CiAgICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7CisgICAgICByZXR1cm4gRFRNLk5VTEw7CiAgIH0KIAogICAvKioKQEAgLTMxNiw3ICszODYsNyBAQAogICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gdGhyb3duIGlmIHRoaXMgTm9kZVNldCBpcyBub3Qgb2YgCiAgICAqIGEgY2FjaGVkIHR5cGUsIGFuZCBoZW5jZSBkb2Vzbid0IGtub3cgd2hhdCB0aGUgcHJldmlvdXMgbm9kZSB3YXMuCiAgICAqLwotICBwdWJsaWMgTm9kZSBwcmV2aW91c05vZGUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHB1YmxpYyBpbnQgcHJldmlvdXNOb2RlKCkKICAgewogCiAgICAgaWYgKCFtX2NhY2hlTm9kZXMpCkBAIC0zMzAsNyArNDAwLDcgQEAKICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRBdChtX25leHQpOwogICAgIH0KICAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKKyAgICAgIHJldHVybiBEVE0uTlVMTDsKICAgfQogCiAgIC8qKgpAQCAtMzk2LDEyICs0NjYsMTIgQEAKICAgICogICA8Y29kZT5Ob2RlTGlzdDwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoYXQgaXMgbm90IGEgdmFsaWQKICAgICogICBpbmRleC4KICAgICovCi0gIHB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KQorICBwdWJsaWMgaW50IGl0ZW0oaW50IGluZGV4KQogICB7CiAKICAgICBydW5UbyhpbmRleCk7CiAKLSAgICByZXR1cm4gKE5vZGUpIHRoaXMuZWxlbWVudEF0KGluZGV4KTsKKyAgICByZXR1cm4gdGhpcy5lbGVtZW50QXQoaW5kZXgpOwogICB9CiAKICAgLyoqCkBAIC00MjgsNyArNDk4LDcgQEAKICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHRocm93biBpZiB0aGlzIE5vZGVTZXQgaXMgbm90IG9mIAogICAgKiBhIG11dGFibGUgdHlwZS4KICAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE5vZGUoTm9kZSBuKQorICBwdWJsaWMgdm9pZCBhZGROb2RlKGludCBuKQogICB7CiAKICAgICBpZiAoIW1fbXV0YWJsZSkKQEAgLTQ0Niw3ICs1MTYsNyBAQAogICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gdGhyb3duIGlmIHRoaXMgTm9kZVNldCBpcyBub3Qgb2YgCiAgICAqIGEgbXV0YWJsZSB0eXBlLgogICAgKi8KLSAgcHVibGljIHZvaWQgaW5zZXJ0Tm9kZShOb2RlIG4sIGludCBwb3MpCisgIHB1YmxpYyB2b2lkIGluc2VydE5vZGUoaW50IG4sIGludCBwb3MpCiAgIHsKIAogICAgIGlmICghbV9tdXRhYmxlKQpAQCAtNDYyLDcgKzUzMiw3IEBACiAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhpcyBOb2RlU2V0IGlzIG5vdCBvZiAKICAgICogYSBtdXRhYmxlIHR5cGUuCiAgICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmVOb2RlKE5vZGUgbikKKyAgcHVibGljIHZvaWQgcmVtb3ZlTm9kZShpbnQgbikKICAgewogCiAgICAgaWYgKCFtX211dGFibGUpCkBAIC00NzEsNzMgKzU0MSw3NSBAQAogICAgIHRoaXMucmVtb3ZlRWxlbWVudChuKTsKICAgfQogCi0gIC8qKgotICAgKiBDb3B5IE5vZGVMaXN0IG1lbWJlcnMgaW50byB0aGlzIG5vZGVsaXN0LCBhZGRpbmcgaW4KLSAgICogZG9jdW1lbnQgb3JkZXIuICBJZiBhIG5vZGUgaXMgbnVsbCwgZG9uJ3QgYWRkIGl0LgotICAgKgotICAgKiBAcGFyYW0gbm9kZWxpc3QgTGlzdCBvZiBub2RlcyB3aGljaCBzaG91bGQgbm93IGJlIHJlZmVyZW5jZWQgYnkKLSAgICogdGhpcyBOb2RlU2V0LgotICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gdGhyb3duIGlmIHRoaXMgTm9kZVNldCBpcyBub3Qgb2YgCi0gICAqIGEgbXV0YWJsZSB0eXBlLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTm9kZXMoTm9kZUxpc3Qgbm9kZWxpc3QpCi0gIHsKKyAgLy8gJVRCRCUKKy8vICAvKioKKy8vICAgKiBDb3B5IE5vZGVMaXN0IG1lbWJlcnMgaW50byB0aGlzIG5vZGVsaXN0LCBhZGRpbmcgaW4KKy8vICAgKiBkb2N1bWVudCBvcmRlci4gIElmIGEgbm9kZSBpcyBudWxsLCBkb24ndCBhZGQgaXQuCisvLyAgICoKKy8vICAgKiBAcGFyYW0gbm9kZWxpc3QgTGlzdCBvZiBub2RlcyB3aGljaCBzaG91bGQgbm93IGJlIHJlZmVyZW5jZWQgYnkKKy8vICAgKiB0aGlzIE5vZGVTZXQuCisvLyAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHRocm93biBpZiB0aGlzIE5vZGVTZXQgaXMgbm90IG9mIAorLy8gICAqIGEgbXV0YWJsZSB0eXBlLgorLy8gICAqLworLy8gIHB1YmxpYyB2b2lkIGFkZE5vZGVzKE5vZGVMaXN0IG5vZGVsaXN0KQorLy8gIHsKKy8vCisvLyAgICBpZiAoIW1fbXV0YWJsZSkKKy8vICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgTm9kZVNldCBpcyBub3QgbXV0YWJsZSEiKTsKKy8vCisvLyAgICBpZiAobnVsbCAhPSBub2RlbGlzdCkgIC8vIGRlZmVuc2l2ZSB0byBmaXggYSBidWcgdGhhdCBTYW5qaXZhIHJlcG9ydGVkLgorLy8gICAgeworLy8gICAgICBpbnQgbkNoaWxkcmVuID0gbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7CisvLworLy8gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZHJlbjsgaSsrKQorLy8gICAgICB7CisvLyAgICAgICAgaW50IG9iaiA9IG5vZGVsaXN0Lml0ZW0oaSk7CisvLworLy8gICAgICAgIGlmIChudWxsICE9IG9iaikKKy8vICAgICAgICB7CisvLyAgICAgICAgICBhZGRFbGVtZW50KG9iaik7CisvLyAgICAgICAgfQorLy8gICAgICB9CisvLyAgICB9CisvLworLy8gICAgLy8gY2hlY2tEdXBzKCk7CisvLyAgfQogCi0gICAgaWYgKCFtX211dGFibGUpCi0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBOb2RlU2V0IGlzIG5vdCBtdXRhYmxlISIpOwotCi0gICAgaWYgKG51bGwgIT0gbm9kZWxpc3QpICAvLyBkZWZlbnNpdmUgdG8gZml4IGEgYnVnIHRoYXQgU2Fuaml2YSByZXBvcnRlZC4KLSAgICB7Ci0gICAgICBpbnQgbkNoaWxkcmVuID0gbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNoaWxkcmVuOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgb2JqID0gbm9kZWxpc3QuaXRlbShpKTsKLQotICAgICAgICBpZiAobnVsbCAhPSBvYmopCi0gICAgICAgIHsKLSAgICAgICAgICBhZGRFbGVtZW50KG9iaik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjaGVja0R1cHMoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8cD5Db3B5IE5vZGVMaXN0IG1lbWJlcnMgaW50byB0aGlzIG5vZGVsaXN0LCBhZGRpbmcgaW4KLSAgICogZG9jdW1lbnQgb3JkZXIuICBPbmx5IGdlbnVpbmUgbm9kZSByZWZlcmVuY2VzIHdpbGwgYmUgY29waWVkOwotICAgKiBudWxscyBhcHBlYXJpbmcgaW4gdGhlIHNvdXJjZSBOb2RlU2V0IHdpbGwKLSAgICogbm90IGJlIGFkZGVkIHRvIHRoaXMgb25lLiA8L3A+Ci0gICAqIAotICAgKiA8cD4gSW4gY2FzZSB5b3UncmUgd29uZGVyaW5nIHdoeSB0aGlzIGZ1bmN0aW9uIGlzIG5lZWRlZDogTm9kZVNldAotICAgKiBpbXBsZW1lbnRzIGJvdGggTm9kZUl0ZXJhdG9yIGFuZCBOb2RlTGlzdC4gSWYgdGhpcyBtZXRob2QgaXNuJ3QKLSAgICogcHJvdmlkZWQsIEphdmEgY2FuJ3QgZGVjaWRlIHdoaWNoIG9mIHRob3NlIHRvIHVzZSB3aGVuIGFkZE5vZGVzKCkKLSAgICogaXMgaW52b2tlZC4gUHJvdmlkaW5nIHRoZSBtb3JlLWV4cGxpY2l0IG1hdGNoIGF2b2lkcyB0aGF0Ci0gICAqIGFtYmlndWl0eS4pPC9wPgotICAgKgotICAgKiBAcGFyYW0gbnMgTm9kZVNldCB3aG9zZSBtZW1iZXJzIHNob3VsZCBiZSBtZXJnZWQgaW50byB0aGlzIE5vZGVTZXQuCi0gICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhpcyBOb2RlU2V0IGlzIG5vdCBvZiAKLSAgICogYSBtdXRhYmxlIHR5cGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGROb2RlcyhOb2RlU2V0IG5zKQotICB7Ci0KLSAgICBpZiAoIW1fbXV0YWJsZSkKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIE5vZGVTZXQgaXMgbm90IG11dGFibGUhIik7Ci0KLSAgICBhZGROb2RlcygoTm9kZUl0ZXJhdG9yKSBucyk7Ci0gIH0KKyAgLy8gJVRCRCUKKy8vICAvKioKKy8vICAgKiA8cD5Db3B5IE5vZGVMaXN0IG1lbWJlcnMgaW50byB0aGlzIG5vZGVsaXN0LCBhZGRpbmcgaW4KKy8vICAgKiBkb2N1bWVudCBvcmRlci4gIE9ubHkgZ2VudWluZSBub2RlIHJlZmVyZW5jZXMgd2lsbCBiZSBjb3BpZWQ7CisvLyAgICogbnVsbHMgYXBwZWFyaW5nIGluIHRoZSBzb3VyY2UgTm9kZVNldCB3aWxsCisvLyAgICogbm90IGJlIGFkZGVkIHRvIHRoaXMgb25lLiA8L3A+CisvLyAgICogCisvLyAgICogPHA+IEluIGNhc2UgeW91J3JlIHdvbmRlcmluZyB3aHkgdGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQ6IE5vZGVTZXQKKy8vICAgKiBpbXBsZW1lbnRzIGJvdGggRFRNSXRlcmF0b3IgYW5kIE5vZGVMaXN0LiBJZiB0aGlzIG1ldGhvZCBpc24ndAorLy8gICAqIHByb3ZpZGVkLCBKYXZhIGNhbid0IGRlY2lkZSB3aGljaCBvZiB0aG9zZSB0byB1c2Ugd2hlbiBhZGROb2RlcygpCisvLyAgICogaXMgaW52b2tlZC4gUHJvdmlkaW5nIHRoZSBtb3JlLWV4cGxpY2l0IG1hdGNoIGF2b2lkcyB0aGF0CisvLyAgICogYW1iaWd1aXR5Lik8L3A+CisvLyAgICoKKy8vICAgKiBAcGFyYW0gbnMgTm9kZVNldCB3aG9zZSBtZW1iZXJzIHNob3VsZCBiZSBtZXJnZWQgaW50byB0aGlzIE5vZGVTZXQuCisvLyAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHRocm93biBpZiB0aGlzIE5vZGVTZXQgaXMgbm90IG9mIAorLy8gICAqIGEgbXV0YWJsZSB0eXBlLgorLy8gICAqLworLy8gIHB1YmxpYyB2b2lkIGFkZE5vZGVzKE5vZGVTZXQgbnMpCisvLyAgeworLy8KKy8vICAgIGlmICghbV9tdXRhYmxlKQorLy8gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBOb2RlU2V0IGlzIG5vdCBtdXRhYmxlISIpOworLy8KKy8vICAgIGFkZE5vZGVzKChEVE1JdGVyYXRvcikgbnMpOworLy8gIH0KIAogICAvKioKICAgICogQ29weSBOb2RlTGlzdCBtZW1iZXJzIGludG8gdGhpcyBub2RlbGlzdCwgYWRkaW5nIGluCiAgICAqIGRvY3VtZW50IG9yZGVyLiAgTnVsbCByZWZlcmVuY2VzIGFyZSBub3QgYWRkZWQuCiAgICAqCi0gICAqIEBwYXJhbSBpdGVyYXRvciBOb2RlSXRlcmF0b3Igd2hpY2ggeWllbGRzIHRoZSBub2RlcyB0byBiZSBhZGRlZC4KKyAgICogQHBhcmFtIGl0ZXJhdG9yIERUTUl0ZXJhdG9yIHdoaWNoIHlpZWxkcyB0aGUgbm9kZXMgdG8gYmUgYWRkZWQuCiAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhpcyBOb2RlU2V0IGlzIG5vdCBvZiAKICAgICogYSBtdXRhYmxlIHR5cGUuCiAgICAqLwotICBwdWJsaWMgdm9pZCBhZGROb2RlcyhOb2RlSXRlcmF0b3IgaXRlcmF0b3IpCisgIHB1YmxpYyB2b2lkIGFkZE5vZGVzKERUTUl0ZXJhdG9yIGl0ZXJhdG9yKQogICB7CiAKICAgICBpZiAoIW1fbXV0YWJsZSkKQEAgLTU0NSw5ICs2MTcsOSBAQAogCiAgICAgaWYgKG51bGwgIT0gaXRlcmF0b3IpICAvLyBkZWZlbnNpdmUgdG8gZml4IGEgYnVnIHRoYXQgU2Fuaml2YSByZXBvcnRlZC4KICAgICB7Ci0gICAgICBOb2RlIG9iajsKKyAgICAgIGludCBvYmo7CiAKLSAgICAgIHdoaWxlIChudWxsICE9IChvYmogPSBpdGVyYXRvci5uZXh0Tm9kZSgpKSkKKyAgICAgIHdoaWxlIChEVE0uTlVMTCAhPSAob2JqID0gaXRlcmF0b3IubmV4dE5vZGUoKSkpCiAgICAgICB7CiAgICAgICAgIGFkZEVsZW1lbnQob2JqKTsKICAgICAgIH0KQEAgLTU1NiwxMjAgKzYyOCwxMjIgQEAKICAgICAvLyBjaGVja0R1cHMoKTsKICAgfQogCi0gIC8qKgotICAgKiBDb3B5IE5vZGVMaXN0IG1lbWJlcnMgaW50byB0aGlzIG5vZGVsaXN0LCBhZGRpbmcgaW4KLSAgICogZG9jdW1lbnQgb3JkZXIuICBJZiBhIG5vZGUgaXMgbnVsbCwgZG9uJ3QgYWRkIGl0LgotICAgKgotICAgKiBAcGFyYW0gbm9kZWxpc3QgTGlzdCBvZiBub2RlcyB0byBiZSBhZGRlZAotICAgKiBAcGFyYW0gc3VwcG9ydCBUaGUgWFBhdGggcnVudGltZSBjb250ZXh0LgotICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gdGhyb3duIGlmIHRoaXMgTm9kZVNldCBpcyBub3Qgb2YgCi0gICAqIGEgbXV0YWJsZSB0eXBlLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTm9kZXNJbkRvY09yZGVyKE5vZGVMaXN0IG5vZGVsaXN0LCBYUGF0aENvbnRleHQgc3VwcG9ydCkKLSAgewotCi0gICAgaWYgKCFtX211dGFibGUpCi0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBOb2RlU2V0IGlzIG5vdCBtdXRhYmxlISIpOwotCi0gICAgaW50IG5DaGlsZHJlbiA9IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hpbGRyZW47IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBub2RlbGlzdC5pdGVtKGkpOwotCi0gICAgICBpZiAobnVsbCAhPSBub2RlKQotICAgICAgewotICAgICAgICBhZGROb2RlSW5Eb2NPcmRlcihub2RlLCBzdXBwb3J0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KKyAgLy8gJVRCRCUKKy8vICAvKioKKy8vICAgKiBDb3B5IE5vZGVMaXN0IG1lbWJlcnMgaW50byB0aGlzIG5vZGVsaXN0LCBhZGRpbmcgaW4KKy8vICAgKiBkb2N1bWVudCBvcmRlci4gIElmIGEgbm9kZSBpcyBudWxsLCBkb24ndCBhZGQgaXQuCisvLyAgICoKKy8vICAgKiBAcGFyYW0gbm9kZWxpc3QgTGlzdCBvZiBub2RlcyB0byBiZSBhZGRlZAorLy8gICAqIEBwYXJhbSBzdXBwb3J0IFRoZSBYUGF0aCBydW50aW1lIGNvbnRleHQuCisvLyAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHRocm93biBpZiB0aGlzIE5vZGVTZXQgaXMgbm90IG9mIAorLy8gICAqIGEgbXV0YWJsZSB0eXBlLgorLy8gICAqLworLy8gIHB1YmxpYyB2b2lkIGFkZE5vZGVzSW5Eb2NPcmRlcihOb2RlTGlzdCBub2RlbGlzdCwgWFBhdGhDb250ZXh0IHN1cHBvcnQpCisvLyAgeworLy8KKy8vICAgIGlmICghbV9tdXRhYmxlKQorLy8gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBOb2RlU2V0IGlzIG5vdCBtdXRhYmxlISIpOworLy8KKy8vICAgIGludCBuQ2hpbGRyZW4gPSBub2RlbGlzdC5nZXRMZW5ndGgoKTsKKy8vCisvLyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZHJlbjsgaSsrKQorLy8gICAgeworLy8gICAgICBpbnQgbm9kZSA9IG5vZGVsaXN0Lml0ZW0oaSk7CisvLworLy8gICAgICBpZiAobnVsbCAhPSBub2RlKQorLy8gICAgICB7CisvLyAgICAgICAgYWRkTm9kZUluRG9jT3JkZXIobm9kZSwgc3VwcG9ydCk7CisvLyAgICAgIH0KKy8vICAgIH0KKy8vICB9CiAKICAgLyoqCiAgICAqIENvcHkgTm9kZUxpc3QgbWVtYmVycyBpbnRvIHRoaXMgbm9kZWxpc3QsIGFkZGluZyBpbgogICAgKiBkb2N1bWVudCBvcmRlci4gIElmIGEgbm9kZSBpcyBudWxsLCBkb24ndCBhZGQgaXQuCiAgICAqCi0gICAqIEBwYXJhbSBpdGVyYXRvciBOb2RlSXRlcmF0b3Igd2hpY2ggeWllbGRzIHRoZSBub2RlcyB0byBiZSBhZGRlZC4KKyAgICogQHBhcmFtIGl0ZXJhdG9yIERUTUl0ZXJhdG9yIHdoaWNoIHlpZWxkcyB0aGUgbm9kZXMgdG8gYmUgYWRkZWQuCiAgICAqIEBwYXJhbSBzdXBwb3J0IFRoZSBYUGF0aCBydW50aW1lIGNvbnRleHQuCiAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhpcyBOb2RlU2V0IGlzIG5vdCBvZiAKICAgICogYSBtdXRhYmxlIHR5cGUuCiAgICAqLwotICBwdWJsaWMgdm9pZCBhZGROb2Rlc0luRG9jT3JkZXIoTm9kZUl0ZXJhdG9yIGl0ZXJhdG9yLCBYUGF0aENvbnRleHQgc3VwcG9ydCkKKyAgcHVibGljIHZvaWQgYWRkTm9kZXNJbkRvY09yZGVyKERUTUl0ZXJhdG9yIGl0ZXJhdG9yLCBYUGF0aENvbnRleHQgc3VwcG9ydCkKICAgewogCiAgICAgaWYgKCFtX211dGFibGUpCiAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBOb2RlU2V0IGlzIG5vdCBtdXRhYmxlISIpOwogCi0gICAgTm9kZSBub2RlOworICAgIGludCBub2RlOwogCi0gICAgd2hpbGUgKG51bGwgIT0gKG5vZGUgPSBpdGVyYXRvci5uZXh0Tm9kZSgpKSkKKyAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKG5vZGUgPSBpdGVyYXRvci5uZXh0Tm9kZSgpKSkKICAgICB7CiAgICAgICBhZGROb2RlSW5Eb2NPcmRlcihub2RlLCBzdXBwb3J0KTsKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQWRkIHRoZSBub2RlIGxpc3QgdG8gdGhpcyBub2RlIHNldCBpbiBkb2N1bWVudCBvcmRlci4KLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0IGluZGV4LgotICAgKiBAcGFyYW0gZW5kIGluZGV4LgotICAgKiBAcGFyYW0gdGVzdEluZGV4IGluZGV4LgotICAgKiBAcGFyYW0gbm9kZWxpc3QgVGhlIG5vZGVsaXN0IHRvIGFkZC4KLSAgICogQHBhcmFtIHN1cHBvcnQgVGhlIFhQYXRoIHJ1bnRpbWUgY29udGV4dC4KLSAgICoKLSAgICogQHJldHVybiBmYWxzZSBhbHdheXMuCi0gICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhpcyBOb2RlU2V0IGlzIG5vdCBvZiAKLSAgICogYSBtdXRhYmxlIHR5cGUuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRkTm9kZXNJbkRvY09yZGVyKGludCBzdGFydCwgaW50IGVuZCwgaW50IHRlc3RJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBub2RlbGlzdCwgWFBhdGhDb250ZXh0IHN1cHBvcnQpCi0gIHsKLQotICAgIGlmICghbV9tdXRhYmxlKQotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgTm9kZVNldCBpcyBub3QgbXV0YWJsZSEiKTsKLQotICAgIGJvb2xlYW4gZm91bmRpdCA9IGZhbHNlOwotICAgIGludCBpOwotICAgIE5vZGUgbm9kZSA9IG5vZGVsaXN0Lml0ZW0odGVzdEluZGV4KTsKLQotICAgIGZvciAoaSA9IGVuZDsgaSA+PSBzdGFydDsgaS0tKQotICAgIHsKLSAgICAgIE5vZGUgY2hpbGQgPSAoTm9kZSkgZWxlbWVudEF0KGkpOwotCi0gICAgICBpZiAoY2hpbGQgPT0gbm9kZSkKLSAgICAgIHsKLSAgICAgICAgaSA9IC0yOyAgLy8gRHVwbGljYXRlLCBzdXBwcmVzcyBpbnNlcnQKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKCFzdXBwb3J0LmdldERPTUhlbHBlcigpLmlzTm9kZUFmdGVyKG5vZGUsIGNoaWxkKSkKLSAgICAgIHsKLSAgICAgICAgaW5zZXJ0RWxlbWVudEF0KG5vZGUsIGkgKyAxKTsKLQotICAgICAgICB0ZXN0SW5kZXgtLTsKLQotICAgICAgICBpZiAodGVzdEluZGV4ID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gZm91bmRQcmV2ID0gYWRkTm9kZXNJbkRvY09yZGVyKDAsIGksIHRlc3RJbmRleCwgbm9kZWxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCk7Ci0KLSAgICAgICAgICBpZiAoIWZvdW5kUHJldikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhZGROb2Rlc0luRG9jT3JkZXIoaSwgc2l6ZSgpIC0gMSwgdGVzdEluZGV4LCBub2RlbGlzdCwgc3VwcG9ydCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGkgPT0gLTEpCi0gICAgewotICAgICAgaW5zZXJ0RWxlbWVudEF0KG5vZGUsIDApOwotICAgIH0KLQotICAgIHJldHVybiBmb3VuZGl0OwotICB9CisgIC8vICVUQkQlCisvLyAgLyoqCisvLyAgICogQWRkIHRoZSBub2RlIGxpc3QgdG8gdGhpcyBub2RlIHNldCBpbiBkb2N1bWVudCBvcmRlci4KKy8vICAgKgorLy8gICAqIEBwYXJhbSBzdGFydCBpbmRleC4KKy8vICAgKiBAcGFyYW0gZW5kIGluZGV4LgorLy8gICAqIEBwYXJhbSB0ZXN0SW5kZXggaW5kZXguCisvLyAgICogQHBhcmFtIG5vZGVsaXN0IFRoZSBub2RlbGlzdCB0byBhZGQuCisvLyAgICogQHBhcmFtIHN1cHBvcnQgVGhlIFhQYXRoIHJ1bnRpbWUgY29udGV4dC4KKy8vICAgKgorLy8gICAqIEByZXR1cm4gZmFsc2UgYWx3YXlzLgorLy8gICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhpcyBOb2RlU2V0IGlzIG5vdCBvZiAKKy8vICAgKiBhIG11dGFibGUgdHlwZS4KKy8vICAgKi8KKy8vICBwcml2YXRlIGJvb2xlYW4gYWRkTm9kZXNJbkRvY09yZGVyKGludCBzdGFydCwgaW50IGVuZCwgaW50IHRlc3RJbmRleCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0IG5vZGVsaXN0LCBYUGF0aENvbnRleHQgc3VwcG9ydCkKKy8vICB7CisvLworLy8gICAgaWYgKCFtX211dGFibGUpCisvLyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIE5vZGVTZXQgaXMgbm90IG11dGFibGUhIik7CisvLworLy8gICAgYm9vbGVhbiBmb3VuZGl0ID0gZmFsc2U7CisvLyAgICBpbnQgaTsKKy8vICAgIGludCBub2RlID0gbm9kZWxpc3QuaXRlbSh0ZXN0SW5kZXgpOworLy8KKy8vICAgIGZvciAoaSA9IGVuZDsgaSA+PSBzdGFydDsgaS0tKQorLy8gICAgeworLy8gICAgICBpbnQgY2hpbGQgPSBlbGVtZW50QXQoaSk7CisvLworLy8gICAgICBpZiAoY2hpbGQgPT0gbm9kZSkKKy8vICAgICAgeworLy8gICAgICAgIGkgPSAtMjsgIC8vIER1cGxpY2F0ZSwgc3VwcHJlc3MgaW5zZXJ0CisvLworLy8gICAgICAgIGJyZWFrOworLy8gICAgICB9CisvLworLy8gICAgICBpZiAoIXN1cHBvcnQuZ2V0RE9NSGVscGVyKCkuaXNOb2RlQWZ0ZXIobm9kZSwgY2hpbGQpKQorLy8gICAgICB7CisvLyAgICAgICAgaW5zZXJ0RWxlbWVudEF0KG5vZGUsIGkgKyAxKTsKKy8vCisvLyAgICAgICAgdGVzdEluZGV4LS07CisvLworLy8gICAgICAgIGlmICh0ZXN0SW5kZXggPiAwKQorLy8gICAgICAgIHsKKy8vICAgICAgICAgIGJvb2xlYW4gZm91bmRQcmV2ID0gYWRkTm9kZXNJbkRvY09yZGVyKDAsIGksIHRlc3RJbmRleCwgbm9kZWxpc3QsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0KTsKKy8vCisvLyAgICAgICAgICBpZiAoIWZvdW5kUHJldikKKy8vICAgICAgICAgIHsKKy8vICAgICAgICAgICAgYWRkTm9kZXNJbkRvY09yZGVyKGksIHNpemUoKSAtIDEsIHRlc3RJbmRleCwgbm9kZWxpc3QsIHN1cHBvcnQpOworLy8gICAgICAgICAgfQorLy8gICAgICAgIH0KKy8vCisvLyAgICAgICAgYnJlYWs7CisvLyAgICAgIH0KKy8vICAgIH0KKy8vCisvLyAgICBpZiAoaSA9PSAtMSkKKy8vICAgIHsKKy8vICAgICAgaW5zZXJ0RWxlbWVudEF0KG5vZGUsIDApOworLy8gICAgfQorLy8KKy8vICAgIHJldHVybiBmb3VuZGl0OworLy8gIH0KIAogICAvKioKICAgICogQWRkIHRoZSBub2RlIGludG8gYSB2ZWN0b3Igb2Ygbm9kZXMgd2hlcmUgaXQgc2hvdWxkIG9jY3VyIGluCkBAIC02ODQsNyArNzU4LDcgQEAKICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHRocm93biBpZiB0aGlzIE5vZGVTZXQgaXMgbm90IG9mIAogICAgKiBhIG11dGFibGUgdHlwZS4KICAgICovCi0gIHB1YmxpYyBpbnQgYWRkTm9kZUluRG9jT3JkZXIoTm9kZSBub2RlLCBib29sZWFuIHRlc3QsIFhQYXRoQ29udGV4dCBzdXBwb3J0KQorICBwdWJsaWMgaW50IGFkZE5vZGVJbkRvY09yZGVyKGludCBub2RlLCBib29sZWFuIHRlc3QsIFhQYXRoQ29udGV4dCBzdXBwb3J0KQogICB7CiAKICAgICBpZiAoIW1fbXV0YWJsZSkKQEAgLTcwMiw3ICs3NzYsNyBAQAogCiAgICAgICBmb3IgKGkgPSBzaXplIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICB7Ci0gICAgICAgIE5vZGUgY2hpbGQgPSAoTm9kZSkgZWxlbWVudEF0KGkpOworICAgICAgICBpbnQgY2hpbGQgPSBlbGVtZW50QXQoaSk7CiAKICAgICAgICAgaWYgKGNoaWxkID09IG5vZGUpCiAgICAgICAgIHsKQEAgLTcxMSw3ICs3ODUsOCBAQAogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFzdXBwb3J0LmdldERPTUhlbHBlcigpLmlzTm9kZUFmdGVyKG5vZGUsIGNoaWxkKSkKKyAgICAgICAgRFRNIGR0bSA9IHN1cHBvcnQuZ2V0RFRNKG5vZGUpOworICAgICAgICBpZiAoIWR0bS5pc05vZGVBZnRlcihub2RlLCBjaGlsZCkpCiAgICAgICAgIHsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNzMyLDcgKzgwNyw3IEBACiAKICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zZXJ0SW5kZXg7IGkrKykKICAgICAgIHsKLSAgICAgICAgaWYgKHRoaXMuaXRlbShpKS5lcXVhbHMobm9kZSkpCisgICAgICAgIGlmIChpID09IG5vZGUpCiAgICAgICAgIHsKICAgICAgICAgICBmb3VuZGl0ID0gdHJ1ZTsKIApAQCAtNzYxLDcgKzgzNiw3IEBACiAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhpcyBOb2RlU2V0IGlzIG5vdCBvZiAKICAgICogYSBtdXRhYmxlIHR5cGUuCiAgICAqLwotICBwdWJsaWMgaW50IGFkZE5vZGVJbkRvY09yZGVyKE5vZGUgbm9kZSwgWFBhdGhDb250ZXh0IHN1cHBvcnQpCisgIHB1YmxpYyBpbnQgYWRkTm9kZUluRG9jT3JkZXIoaW50IG5vZGUsIFhQYXRoQ29udGV4dCBzdXBwb3J0KQogICB7CiAKICAgICBpZiAoIW1fbXV0YWJsZSkKQEAgLTc4Nyw3ICs4NjIsNyBAQAogICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gdGhyb3duIGlmIHRoaXMgTm9kZVNldCBpcyBub3Qgb2YgCiAgICAqIGEgbXV0YWJsZSB0eXBlLgogICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRWxlbWVudChOb2RlIHZhbHVlKQorICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KGludCB2YWx1ZSkKICAgewogCiAgICAgaWYgKCFtX211dGFibGUpCkBAIC04MDcsNyArODgyLDcgQEAKICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHRocm93biBpZiB0aGlzIE5vZGVTZXQgaXMgbm90IG9mIAogICAgKiBhIG11dGFibGUgdHlwZS4KICAgICovCi0gIHB1YmxpYyB2b2lkIGluc2VydEVsZW1lbnRBdChOb2RlIHZhbHVlLCBpbnQgYXQpCisgIHB1YmxpYyB2b2lkIGluc2VydEVsZW1lbnRBdChpbnQgdmFsdWUsIGludCBhdCkKICAgewogCiAgICAgaWYgKCFtX211dGFibGUpCkBAIC04NjIsNyArOTM3LDcgQEAKICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHRocm93biBpZiB0aGlzIE5vZGVTZXQgaXMgbm90IG9mIAogICAgKiBhIG11dGFibGUgdHlwZS4KICAgICovCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUVsZW1lbnQoTm9kZSBzKQorICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGVtZW50KGludCBzKQogICB7CiAKICAgICBpZiAoIW1fbXV0YWJsZSkKQEAgLTkwMiw3ICs5NzcsMjQgQEAKICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHRocm93biBpZiB0aGlzIE5vZGVTZXQgaXMgbm90IG9mIAogICAgKiBhIG11dGFibGUgdHlwZS4KICAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRBdChOb2RlIG5vZGUsIGludCBpbmRleCkKKyAgcHVibGljIHZvaWQgc2V0RWxlbWVudEF0KGludCBub2RlLCBpbnQgaW5kZXgpCisgIHsKKworICAgIGlmICghbV9tdXRhYmxlKQorICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgTm9kZVNldCBpcyBub3QgbXV0YWJsZSEiKTsKKworICAgIHN1cGVyLnNldEVsZW1lbnRBdChub2RlLCBpbmRleCk7CisgIH0KKyAgCisgIC8qKgorICAgKiBTYW1lIGFzIHNldEVsZW1lbnRBdC4KKyAgICoKKyAgICogQHBhcmFtIG5vZGUgIFRoZSBub2RlIHRvIGJlIHNldC4KKyAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgbm9kZSB0byBiZSByZXBsYWNlZC4KKyAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHRocm93biBpZiB0aGlzIE5vZGVTZXQgaXMgbm90IG9mIAorICAgKiBhIG11dGFibGUgdHlwZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEl0ZW0oaW50IG5vZGUsIGludCBpbmRleCkKICAgewogCiAgICAgaWYgKCFtX211dGFibGUpCkBAIC05MTgsNyArMTAxMCw3IEBACiAgICAqCiAgICAqIEByZXR1cm4gTm9kZSBhdCBzcGVjaWZpZWQgaW5kZXguCiAgICAqLwotICBwdWJsaWMgTm9kZSBlbGVtZW50QXQoaW50IGkpCisgIHB1YmxpYyBpbnQgZWxlbWVudEF0KGludCBpKQogICB7CiAKICAgICBydW5UbyhpKTsKQEAgLTkzMyw3ICsxMDI1LDcgQEAKICAgICoKICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBnaXZlbiBub2RlIHdhcyBmb3VuZC4KICAgICovCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE5vZGUgcykKKyAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHMpCiAgIHsKIAogICAgIHJ1blRvKC0xKTsKQEAgLTk1Miw3ICsxMDQ0LDcgQEAKICAgICogYXJndW1lbnQgaW4gdGhpcyB2ZWN0b3IgYXQgcG9zaXRpb24gaW5kZXggb3IgbGF0ZXIgaW4gdGhlCiAgICAqIHZlY3RvcjsgcmV0dXJucyAtMSBpZiB0aGUgb2JqZWN0IGlzIG5vdCBmb3VuZC4KICAgICovCi0gIHB1YmxpYyBpbnQgaW5kZXhPZihOb2RlIGVsZW0sIGludCBpbmRleCkKKyAgcHVibGljIGludCBpbmRleE9mKGludCBlbGVtLCBpbnQgaW5kZXgpCiAgIHsKIAogICAgIHJ1blRvKC0xKTsKQEAgLTk3MCw3ICsxMDYyLDcgQEAKICAgICogYXJndW1lbnQgaW4gdGhpcyB2ZWN0b3IgYXQgcG9zaXRpb24gaW5kZXggb3IgbGF0ZXIgaW4gdGhlCiAgICAqIHZlY3RvcjsgcmV0dXJucyAtMSBpZiB0aGUgb2JqZWN0IGlzIG5vdCBmb3VuZC4KICAgICovCi0gIHB1YmxpYyBpbnQgaW5kZXhPZihOb2RlIGVsZW0pCisgIHB1YmxpYyBpbnQgaW5kZXhPZihpbnQgZWxlbSkKICAgewogCiAgICAgcnVuVG8oLTEpOwpAQCAtMTAxOCw3ICsxMTEwLDcgQEAKICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHRocm93biBpZiB0aGlzIE5vZGVTZXQgaXMgbm90IG9mIAogICAgKiBhIGNhY2hlZCB0eXBlLCBhbmQgdGh1cyBkb2Vzbid0IHBlcm1pdCBpbmRleGVkIGFjY2Vzcy4KICAgICovCi0gIHB1YmxpYyBOb2RlIGdldEN1cnJlbnROb2RlKCkKKyAgcHVibGljIGludCBnZXRDdXJyZW50Tm9kZSgpCiAgIHsKIAogICAgIGlmICghbV9jYWNoZU5vZGVzKQpAQCAtMTAyNiw3ICsxMTE4LDcgQEAKICAgICAgICAgIlRoaXMgTm9kZVNldCBjYW4gbm90IGRvIGluZGV4aW5nIG9yIGNvdW50aW5nIGZ1bmN0aW9ucyEiKTsKIAogICAgIGludCBzYXZlZCA9IG1fbmV4dDsKLSAgICBOb2RlIG4gPSBlbGVtZW50QXQobV9uZXh0LTEpOworICAgIGludCBuID0gZWxlbWVudEF0KG1fbmV4dC0xKTsKICAgICBtX25leHQgPSBzYXZlZDsgLy8gSEFDSzogSSB0aGluayB0aGlzIGlzIGEgYml0IG9mIGEgaGFjay4gIC1zYgogICAgIHJldHVybiBuOwogICB9CkBAIC0xMDcxLDYgKzExNjMsMTYgQEAKICAgICBtX211dGFibGUgPSB0cnVlOwogICB9CiAgIAorICAvKioKKyAgICogVGVsbHMgaWYgdGhpcyBpdGVyYXRvciBjYW4gaGF2ZSBub2RlcyBhZGRlZCB0byBpdCBvciBzZXQgdmlhIAorICAgKiB0aGUgPGNvZGU+c2V0SXRlbShpbnQgbm9kZSwgaW50IGluZGV4KTwvY29kZT4gbWV0aG9kLgorICAgKiAKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBub2RlbGlzdCBjYW4gYmUgbXV0YXRlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzTXV0YWJsZSgpCisgIHsKKyAgICByZXR1cm4gbV9tdXRhYmxlOworICB9CiAgIAogICB0cmFuc2llbnQgcHJpdmF0ZSBpbnQgbV9sYXN0ID0gMDsKICAgCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9Tb3VyY2VUcmVlLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9Tb3VyY2VUcmVlLmphdmEKaW5kZXggMzdiOGJhZi4uOWYwNDYyOSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvU291cmNlVHJlZS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL1NvdXJjZVRyZWUuamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGg7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAogLyoqCiAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iaW50ZXJuYWwiLz4KQEAgLTc0LDcgKzc0LDcgQEAKICAgICoge0BsaW5rIG9yZy53M2MuZG9tLkRvY3VtZW50fSBub2RlLgogICAgKiBAcGFyYW0gdXJsIFRoZSBVUkkgb2YgdGhlIHNvdXJjZSB0cmVlLgogICAgKi8KLSAgcHVibGljIFNvdXJjZVRyZWUoTm9kZSByb290LCBTdHJpbmcgdXJsKQorICBwdWJsaWMgU291cmNlVHJlZShpbnQgcm9vdCwgU3RyaW5nIHVybCkKICAgewogICAgIG1fcm9vdCA9IHJvb3Q7CiAgICAgbV91cmwgPSB1cmw7CkBAIC04NSw1ICs4NSw1IEBACiAKICAgLyoqIFRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZSwgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgYSAKICAgICoge0BsaW5rIG9yZy53M2MuZG9tLkRvY3VtZW50fSBub2RlLiAgKi8KLSAgcHVibGljIE5vZGUgbV9yb290OworICBwdWJsaWMgaW50IG1fcm9vdDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL1NvdXJjZVRyZWVNYW5hZ2VyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9Tb3VyY2VUcmVlTWFuYWdlci5qYXZhCmluZGV4IDQyZjAxN2EuLmU5MTA1YzEgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL1NvdXJjZVRyZWVNYW5hZ2VyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvU291cmNlVHJlZU1hbmFnZXIuamF2YQpAQCAtNjQsOCArNjQsMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YU3RyaW5nOworCisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlcjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwpAQCAtNzgsNyArODIsNiBAQAogCiAvLyBpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnJlcy5YU0xNZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnN0cmVlLlNvdXJjZVRyZWVIYW5kbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlN5c3RlbUlEUmVzb2x2ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuU0FYU291cmNlTG9jYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLnJlcy5YUEFUSEVycm9yUmVzb3VyY2VzOwpAQCAtMTQxLDMwICsxNDQsMTkgQEAKICAgICoKICAgICogQHJldHVybiBUaGUgYmFzZSBVUkkgb2YgdGhlIG93bmVyIGFyZ3VtZW50LgogICAgKi8KLSAgcHVibGljIFN0cmluZyBmaW5kVVJJRnJvbURvYyhEb2N1bWVudCBvd25lcikKKyAgcHVibGljIFN0cmluZyBmaW5kVVJJRnJvbURvYyhpbnQgb3duZXIpCiAgIHsKLQotICAgIE5vZGUgcm9vdCA9IG93bmVyLmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgIGlmIChudWxsID09IHJvb3QpCi0gICAgICByb290ID0gb3duZXI7Ci0KLSAgICBTdHJpbmcgdXJsID0gbnVsbDsKICAgICBpbnQgbiA9IG1fc291cmNlVHJlZS5zaXplKCk7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICB7CiAgICAgICBTb3VyY2VUcmVlIHNUcmVlID0gKFNvdXJjZVRyZWUpIG1fc291cmNlVHJlZS5lbGVtZW50QXQoaSk7CiAKLSAgICAgIGlmIChyb290ID09IHNUcmVlLm1fcm9vdCkKLSAgICAgIHsKLSAgICAgICAgdXJsID0gc1RyZWUubV91cmw7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9CisgICAgICBpZiAob3duZXIgPT0gc1RyZWUubV9yb290KQorICAgICAgICByZXR1cm4gc1RyZWUubV91cmw7CiAgICAgfQogCi0gICAgcmV0dXJuIHVybDsKKyAgICByZXR1cm4gbnVsbDsKICAgfQogCiAgIC8qKgpAQCAtMjA5LDE0ICsyMDEsMTQgQEAKICAgICogQHBhcmFtIG4gVGhlIG5vZGUgdG8gY2FjaGUuCiAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIFNvdXJjZSBvYmplY3QgdG8gY2FjaGUuCiAgICAqLwotICBwdWJsaWMgdm9pZCBwdXREb2N1bWVudEluQ2FjaGUoTm9kZSBuLCBTb3VyY2Ugc291cmNlKQorICBwdWJsaWMgdm9pZCBwdXREb2N1bWVudEluQ2FjaGUoaW50IG4sIFNvdXJjZSBzb3VyY2UpCiAgIHsKIAotICAgIE5vZGUgY2FjaGVkTm9kZSA9IGdldE5vZGUoc291cmNlKTsKKyAgICBpbnQgY2FjaGVkTm9kZSA9IGdldE5vZGUoc291cmNlKTsKIAotICAgIGlmIChudWxsICE9IGNhY2hlZE5vZGUpCisgICAgaWYgKERUTS5OVUxMICE9IGNhY2hlZE5vZGUpCiAgICAgewotICAgICAgaWYgKCFjYWNoZWROb2RlLmVxdWFscyhuKSkKKyAgICAgIGlmICghKGNhY2hlZE5vZGUgPT0gbikpCiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAogICAgICAgICAgICJQcm9ncmFtbWVyJ3MgRXJyb3IhICAiCiAgICAgICAgICAgKyAicHV0RG9jdW1lbnRJbkNhY2hlIGZvdW5kIHJlcGFyc2Ugb2YgZG9jOiAiCkBAIC0yMzYsNyArMjI4LDcgQEAKICAgICoKICAgICogQHJldHVybiBUaGUgbm9kZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgU291cmNlLCBvciBudWxsIGlmIG5vdCBmb3VuZC4KICAgICovCi0gIHB1YmxpYyBOb2RlIGdldE5vZGUoU291cmNlIHNvdXJjZSkKKyAgcHVibGljIGludCBnZXROb2RlKFNvdXJjZSBzb3VyY2UpCiAgIHsKIAogLy8gICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIERPTVNvdXJjZSkKQEAgLTI0NiwxMSArMjM4LDkgQEAKICAgICBTdHJpbmcgdXJsID0gc291cmNlLmdldFN5c3RlbUlkKCk7CiAKICAgICBpZiAobnVsbCA9PSB1cmwpCi0gICAgICByZXR1cm4gbnVsbDsKKyAgICAgIHJldHVybiBEVE0uTlVMTDsKIAotICAgIE5vZGUgbm9kZSA9IG51bGw7CiAgICAgaW50IG4gPSBtX3NvdXJjZVRyZWUuc2l6ZSgpOwotICAgIDsKIAogICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0Tm9kZTogIituKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKQEAgLTI2MCwxNSArMjUwLDExIEBACiAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldE5vZGUgLSAgICAgICAgIHVybDogIit1cmwpOwogICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXROb2RlIC0gc1RyZWUubV91cmw6ICIrc1RyZWUubV91cmwpOwogICAgICAgaWYgKHVybC5lcXVhbHMoc1RyZWUubV91cmwpKQotICAgICAgewotICAgICAgICBub2RlID0gc1RyZWUubV9yb290OwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQorICAgICAgICByZXR1cm4gc1RyZWUubV9yb290OwogICAgIH0KIAogICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0Tm9kZSAtIHJldHVybmluZzogIitub2RlKTsKLSAgICByZXR1cm4gbm9kZTsKKyAgICByZXR1cm4gRFRNLk5VTEw7CiAgIH0KIAogICAvKioKQEAgLTI4Myw4ICsyNjksOCBAQAogICAgKgogICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIElmIHRoZSBVUkwgY2FuIG5vdCByZXNvbHZlIHRvIGEgbm9kZS4KICAgICovCi0gIHB1YmxpYyBOb2RlIGdldFNvdXJjZVRyZWUoCi0gICAgICAgICAgU3RyaW5nIGJhc2UsIFN0cmluZyB1cmxTdHJpbmcsIFNvdXJjZUxvY2F0b3IgbG9jYXRvcikKKyAgcHVibGljIGludCBnZXRTb3VyY2VUcmVlKAorICAgICAgICAgIFN0cmluZyBiYXNlLCBTdHJpbmcgdXJsU3RyaW5nLCBTb3VyY2VMb2NhdG9yIGxvY2F0b3IsIFhQYXRoQ29udGV4dCB4Y3R4dCkKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKQEAgLTI5NCw3ICsyODAsNyBAQAogICAgICAgU291cmNlIHNvdXJjZSA9IHRoaXMucmVzb2x2ZVVSSShiYXNlLCB1cmxTdHJpbmcsIGxvY2F0b3IpOwogCiAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldFNvdXJjZVRyZWUgLSBiYXNlOiAiK2Jhc2UrIiwgdXJsU3RyaW5nOiAiK3VybFN0cmluZysiLCBzb3VyY2U6ICIrc291cmNlLmdldFN5c3RlbUlkKCkpOwotICAgICAgcmV0dXJuIGdldFNvdXJjZVRyZWUoc291cmNlLCBsb2NhdG9yKTsKKyAgICAgIHJldHVybiBnZXRTb3VyY2VUcmVlKHNvdXJjZSwgbG9jYXRvciwgeGN0eHQpOwogICAgIH0KICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQogICAgIHsKQEAgLTMxOCwxOCArMzA0LDE4IEBACiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gaWYgdGhlIFNvdXJjZSBhcmd1bWVudCBjYW4ndCBiZSByZXNvbHZlZCB0byAKICAgICogICAgICAgICBhIG5vZGUuCiAgICAqLwotICBwdWJsaWMgTm9kZSBnZXRTb3VyY2VUcmVlKFNvdXJjZSBzb3VyY2UsIFNvdXJjZUxvY2F0b3IgbG9jYXRvcikKKyAgcHVibGljIGludCBnZXRTb3VyY2VUcmVlKFNvdXJjZSBzb3VyY2UsIFNvdXJjZUxvY2F0b3IgbG9jYXRvciwgWFBhdGhDb250ZXh0IHhjdHh0KQogICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKLSAgICBOb2RlIG4gPSBnZXROb2RlKHNvdXJjZSk7CisgICAgaW50IG4gPSBnZXROb2RlKHNvdXJjZSk7CiAKLSAgICBpZiAobnVsbCAhPSBuKQorICAgIGlmIChEVE0uTlVMTCAhPSBuKQogICAgICAgcmV0dXJuIG47CiAKLSAgICBuID0gZ2V0RE9NTm9kZShzb3VyY2UsIGxvY2F0b3IpOworICAgIG4gPSBwYXJzZVRvTm9kZShzb3VyY2UsIGxvY2F0b3IsIHhjdHh0KTsKIAotICAgIGlmIChudWxsICE9IG4pCisgICAgaWYgKERUTS5OVUxMICE9IG4pCiAgICAgICBwdXREb2N1bWVudEluQ2FjaGUobiwgc291cmNlKTsKIAogICAgIHJldHVybiBuOwpAQCAtMzQ2LDgzICszMzIsMzEgQEAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGFyZ3VtZW50IGNhbiBub3QgYmUgcmVzb2x2ZWQgCiAgICAqICAgICAgICAgdG8gYSBzb3VyY2Ugbm9kZS4KICAgICovCi0gIHB1YmxpYyBOb2RlIGdldERPTU5vZGUoU291cmNlIHNvdXJjZSwgU291cmNlTG9jYXRvciBsb2NhdG9yKQorICBwdWJsaWMgaW50IHBhcnNlVG9Ob2RlKFNvdXJjZSBzb3VyY2UsIFNvdXJjZUxvY2F0b3IgbG9jYXRvciwgWFBhdGhDb250ZXh0IHhjdHh0KQogICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKLSAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgRE9NU291cmNlKQotICAgIHsKLSAgICAgIHJldHVybiAoKERPTVNvdXJjZSkgc291cmNlKS5nZXROb2RlKCk7Ci0gICAgfQotCi0gICAgTm9kZSBkb2MgPSBudWxsOwotCiAgICAgdHJ5Ci0gICAgewotCi0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlYWRpbmc6ICIrc291cmNlLmdldFN5c3RlbUlkKCkpOwotICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IGdldFhNTFJlYWRlcihzb3VyY2UsIGxvY2F0b3IpOwotCi0gICAgICAvLyBUT0RPOiBOZWVkIHRvIHVzZSBmYWN0b3J5IG9mIHNvbWUga2luZCB0byBjcmVhdGUgdGhlIENvbnRlbnRIYW5kbGVyCi0gICAgICAvLyAoQWxzbywgdHJ5IHVzaW5nIEpBWFAgaWYgbmVlZCBiZS4uLikKLSAgICAgIENvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgU291cmNlVHJlZUhhbmRsZXIoKTsKLQotICAgICAgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhhbGFuLnN0cmVlLlNvdXJjZVRyZWVIYW5kbGVyKQorICAgIHsgICAgICAKKyAgICAgIE9iamVjdCB4b3duZXIgPSB4Y3R4dC5nZXRPd25lck9iamVjdCgpOworICAgICAgRFRNIGR0bTsKKyAgICAgIGlmKG51bGwgIT0geG93bmVyICYmIHhvd25lciBpbnN0YW5jZW9mIG9yZy5hcGFjaGUueG1sLmR0bS5EVE1XU0ZpbHRlcikKICAgICAgIHsKLQotICAgICAgICAvLyB0ZW1wIGhhY2sKLSAgICAgICAgKChvcmcuYXBhY2hlLnhhbGFuLnN0cmVlLlNvdXJjZVRyZWVIYW5kbGVyKSBoYW5kbGVyKS5zZXRVc2VNdWx0aVRocmVhZGluZygKLSAgICAgICAgICBmYWxzZSk7CisgICAgICAgIGR0bSA9IHhjdHh0LmdldERUTShzb3VyY2UsIGZhbHNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUueG1sLmR0bS5EVE1XU0ZpbHRlcil4b3duZXIsIGZhbHNlKTsKICAgICAgIH0KLQotICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotCi0gICAgICBpZiAoaGFuZGxlciBpbnN0YW5jZW9mIG9yZy54bWwuc2F4LkRUREhhbmRsZXIpCi0gICAgICAgIHJlYWRlci5zZXREVERIYW5kbGVyKChvcmcueG1sLnNheC5EVERIYW5kbGVyKSBoYW5kbGVyKTsKLQotICAgICAgdHJ5CisgICAgICBlbHNlCiAgICAgICB7Ci0gICAgICAgIGlmIChoYW5kbGVyIGluc3RhbmNlb2Ygb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyKQotICAgICAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcik7Ci0KLSAgICAgICAgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIpCi0gICAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KAotICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2RlY2xhcmF0aW9uLWhhbmRsZXIiLCBoYW5kbGVyKTsKKyAgICAgICAgZHRtID0geGN0eHQuZ2V0RFRNKHNvdXJjZSwgZmFsc2UsIG51bGwsIGZhbHNlKTsKICAgICAgIH0KLSAgICAgIGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gc2Upe30KLQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChoYW5kbGVyIGluc3RhbmNlb2Ygb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyKQotICAgICAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L2hhbmRsZXJzL0xleGljYWxIYW5kbGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcik7Ci0KLSAgICAgICAgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIpCi0gICAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvaGFuZGxlcnMvRGVjbEhhbmRsZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIHNucmUpe30KLQotICAgICAgSW5wdXRTb3VyY2UgaXNvdXJjZSA9IFNBWFNvdXJjZS5zb3VyY2VUb0lucHV0U291cmNlKHNvdXJjZSk7Ci0KLSAgICAgIHJlYWRlci5wYXJzZShpc291cmNlKTsKLQotICAgICAgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhhbGFuLnN0cmVlLlNvdXJjZVRyZWVIYW5kbGVyKQotICAgICAgewotICAgICAgICBkb2MgPSAoKG9yZy5hcGFjaGUueGFsYW4uc3RyZWUuU291cmNlVHJlZUhhbmRsZXIpIGhhbmRsZXIpLmdldFJvb3QoKTsKLSAgICAgIH0KKyAgICAgIHJldHVybiBkdG0uZ2V0RG9jdW1lbnQoKTsKICAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKKyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgewotICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGlvZS5nZXRNZXNzYWdlKCksIGxvY2F0b3IsIGlvZSk7Ci0gICAgfQotICAgIGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gc2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKHNlLmdldE1lc3NhZ2UoKSwgbG9jYXRvciwgc2UpOworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgbG9jYXRvciwgZSk7CiAgICAgfQogCi0gICAgcmV0dXJuIGRvYzsKICAgfQogCiAgIC8qKgpAQCAtNDQxLDcgKzM3NSw3IEBACiAgICAqCiAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gaWYgdGhlIHJlYWRlciBjYW4gbm90IGJlIGNyZWF0ZWQuCiAgICAqLwotICBwdWJsaWMgWE1MUmVhZGVyIGdldFhNTFJlYWRlcihTb3VyY2UgaW5wdXRTb3VyY2UsIFNvdXJjZUxvY2F0b3IgbG9jYXRvcikKKyAgcHVibGljIHN0YXRpYyBYTUxSZWFkZXIgZ2V0WE1MUmVhZGVyKFNvdXJjZSBpbnB1dFNvdXJjZSwgU291cmNlTG9jYXRvciBsb2NhdG9yKQogICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL1hQYXRoLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9YUGF0aC5qYXZhCmluZGV4IGU3OGZmMDcuLmZmM2RlN2QgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL1hQYXRoLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvWFBhdGguamF2YQpAQCAtNTYsMTAgKzU2LDEzIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54cGF0aDsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKQEAgLTIyNyw2ICsyMzAsMzYgQEAKICAgeyAgCiAgICAgdGhpcyhleHByU3RyaW5nLCBsb2NhdG9yLCBwcmVmaXhSZXNvbHZlciwgdHlwZSwgbnVsbCk7ICAgIAogICB9CisgIAorICAvKioKKyAgICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImV4cGVyaW1lbnRhbCIvPgorICAgKiBHaXZlbiBhbiBleHByZXNzaW9uIGFuZCBhIGNvbnRleHQsIGV2YWx1YXRlIHRoZSBYUGF0aAorICAgKiBhbmQgY2FsbCB0aGUgY2FsbGJhY2sgYXMgbm9kZXMgYXJlIGZvdW5kLiAgT25seSBzb21lIHNpbXBsZQorICAgKiB0eXBlcyBvZiBleHByZXNpb25zIHJpZ2h0IG5vdyBjYW4gY2FsbCBiYWNrLCBzbyBpZiB0aGlzCisgICAqIG1ldGhvZCByZXR1cm5zIG51bGwsIHRoZW4gdGhlIGNhbGxiYWNrcyBoYXZlIGJlZW4gY2FsbGVkLCBvdGhlcndpc2UKKyAgICogYSB2YWxpZCBYT2JqZWN0IHdpbGwgYmUgcmV0dXJuZWQuCisgICAqIAorICAgKiBAcGFyYW0geGN0eHQgVGhlIGV4ZWN1dGlvbiBjb250ZXh0LgorICAgKiBAcGFyYW0gY29udGV4dE5vZGUgVGhlIG5vZGUgdGhhdCAiLiIgZXhwcmVzc2VzLgorICAgKiBAcGFyYW0gbmFtZXNwYWNlQ29udGV4dCBUaGUgY29udGV4dCBpbiB3aGljaCBuYW1lc3BhY2VzIGluIHRoZQorICAgKiBYUGF0aCBhcmUgc3VwcG9zZWQgdG8gYmUgZXhwYW5kZWQuCisKKyAgICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBYUGF0aCBvciBudWxsIGlmIGNhbGxiYWNrcyBhcmUgdXNlZC4KKyAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0aHJvd24gaWYKKyAgICogdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBzZXZlcmUgZW5vdWdoIHRvIGhhbHQgcHJvY2Vzc2luZy4KKyAgICoKKyAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKAorICAgICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCwgb3JnLnczYy5kb20uTm9kZSBjb250ZXh0Tm9kZSwgCisgICAgICAgICAgUHJlZml4UmVzb2x2ZXIgbmFtZXNwYWNlQ29udGV4dCkKKyAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gZXhlY3V0ZSgKKyAgICAgICAgICB4Y3R4dCwgeGN0eHQuZ2V0RFRNSGFuZGxlRnJvbU5vZGUoY29udGV4dE5vZGUpLCAKKyAgICAgICAgICBuYW1lc3BhY2VDb250ZXh0KTsKKyAgfQorICAKIAogICAvKioKICAgICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImV4cGVyaW1lbnRhbCIvPgpAQCAtMjM1LDI0ICsyNjgsMTkgQEAKICAgICogdHlwZXMgb2YgZXhwcmVzaW9ucyByaWdodCBub3cgY2FuIGNhbGwgYmFjaywgc28gaWYgdGhpcwogICAgKiBtZXRob2QgcmV0dXJucyBudWxsLCB0aGVuIHRoZSBjYWxsYmFja3MgaGF2ZSBiZWVuIGNhbGxlZCwgb3RoZXJ3aXNlCiAgICAqIGEgdmFsaWQgWE9iamVjdCB3aWxsIGJlIHJldHVybmVkLgorICAgKiAKICAgICogQHBhcmFtIHhjdHh0IFRoZSBleGVjdXRpb24gY29udGV4dC4KICAgICogQHBhcmFtIGNvbnRleHROb2RlIFRoZSBub2RlIHRoYXQgIi4iIGV4cHJlc3Nlcy4KICAgICogQHBhcmFtIG5hbWVzcGFjZUNvbnRleHQgVGhlIGNvbnRleHQgaW4gd2hpY2ggbmFtZXNwYWNlcyBpbiB0aGUKICAgICogWFBhdGggYXJlIHN1cHBvc2VkIHRvIGJlIGV4cGFuZGVkLgorICAgKiAKICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGFjdGl2ZSBQcm9ibGVtTGlzdGVuZXIgZGVjaWRlcwogICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgotICAgKiBAcGFyYW0gY2FsbGJhY2sgSW50ZXJmYWNlIHRoYXQgaW1wbGVtZW50cyB0aGUgcHJvY2Vzc0xvY2F0ZWROb2RlIG1ldGhvZC4KLSAgICogQHBhcmFtIGNhbGxiYWNrSW5mbyBPYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcHJvY2Vzc0xvY2F0ZWROb2RlIG1ldGhvZC4KLSAgICogQHBhcmFtIHN0b3BBdEZpcnN0IFRydWUgaWYgdGhlIHNlYXJjaCBzaG91bGQgc3RvcCBvbmNlIHRoZSBmaXJzdCBub2RlIGluIGRvY3VtZW50Ci0gICAqIG9yZGVyIGlzIGZvdW5kLgotICAgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIFhQYXRoIG9yIG51bGwgaWYgY2FsbGJhY2tzIGFyZSB1c2VkLgotICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRocm93biBpZgotICAgKiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIHNldmVyZSBlbm91Z2ggdG8gaGFsdCBwcm9jZXNzaW5nLgogICAgKgogICAgKiBAdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyBYT2JqZWN0IGV4ZWN1dGUoCi0gICAgICAgICAgWFBhdGhDb250ZXh0IHhjdHh0LCBOb2RlIGNvbnRleHROb2RlLCBQcmVmaXhSZXNvbHZlciBuYW1lc3BhY2VDb250ZXh0KQorICAgICAgICAgIFhQYXRoQ29udGV4dCB4Y3R4dCwgaW50IGNvbnRleHROb2RlLCBQcmVmaXhSZXNvbHZlciBuYW1lc3BhY2VDb250ZXh0KQogICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCkBAIC0yODUsNyArMzEzLDcgQEAKICAgICAgIHsKICAgICAgICAgZSA9ICgob3JnLmFwYWNoZS54bWwudXRpbHMuV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24pIGUpLmdldEV4Y2VwdGlvbigpOwogICAgICAgfQotCisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogCiAgICAgICBTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7CiAgICAgICBtc2cgPSAobXNnID09IG51bGwgfHwgbXNnLmxlbmd0aCgpPT0gMCk/ICJVbmtub3duIGVycm9yIGluIFhQYXRoIiA6IG1zZzsKQEAgLTMyNiw3ICszNTQsNyBAQAogICAgKgogICAgKiBAdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0TWF0Y2hTY29yZShYUGF0aENvbnRleHQgeGN0eHQsIE5vZGUgY29udGV4dCkKKyAgcHVibGljIGRvdWJsZSBnZXRNYXRjaFNjb3JlKFhQYXRoQ29udGV4dCB4Y3R4dCwgaW50IGNvbnRleHQpCiAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCkBAIC0zMzgsOSArMzY2LDEyIEBACiAgICAgICBYT2JqZWN0IHNjb3JlID0gbV9tYWluRXhwLmV4ZWN1dGUoeGN0eHQpOwogCiAgICAgICBpZiAoREVCVUdfTUFUQ0hFUykKKyAgICAgIHsKKyAgICAgICAgRFRNIGR0bSA9IHhjdHh0LmdldERUTShjb250ZXh0KTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzY29yZTogIiArIHNjb3JlLm51bSgpICsgIiBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250ZXh0LmdldE5vZGVOYW1lKCkgKyAiIGZvciB4cGF0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIGR0bS5nZXROb2RlTmFtZShjb250ZXh0KSArICIgZm9yIHhwYXRoICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcy5nZXRQYXR0ZXJuU3RyaW5nKCkpOworICAgICAgfQogCiAgICAgICByZXR1cm4gc2NvcmUubnVtKCk7CiAgICAgfQpAQCAtMzgwLDcgKzQxMSw3IEBACiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYW4gZXhjZXB0aW9uLgogICAgKi8KICAgcHVibGljIHZvaWQgd2FybigKLSAgICAgICAgICBYUGF0aENvbnRleHQgeGN0eHQsIE5vZGUgc291cmNlTm9kZSwgaW50IG1zZywgT2JqZWN0W10gYXJncykKKyAgICAgICAgICBYUGF0aENvbnRleHQgeGN0eHQsIGludCBzb3VyY2VOb2RlLCBpbnQgbXNnLCBPYmplY3RbXSBhcmdzKQogICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCkBAIC00MzMsNyArNDY0LDcgQEAKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBhbiBleGNlcHRpb24uCiAgICAqLwogICBwdWJsaWMgdm9pZCBlcnJvcigKLSAgICAgICAgICBYUGF0aENvbnRleHQgeGN0eHQsIE5vZGUgc291cmNlTm9kZSwgaW50IG1zZywgT2JqZWN0W10gYXJncykKKyAgICAgICAgICBYUGF0aENvbnRleHQgeGN0eHQsIGludCBzb3VyY2VOb2RlLCBpbnQgbXNnLCBPYmplY3RbXSBhcmdzKQogICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9YUGF0aEFQSS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvWFBhdGhBUEkuamF2YQppbmRleCBhZDJhZjI3Li5iMmY0ZjkxIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9YUGF0aEFQSS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL1hQYXRoQVBJLmphdmEKQEAgLTE1OSw3ICsxNTksOSBAQAogICAgIFhPYmplY3QgbGlzdCA9IGV2YWwoY29udGV4dE5vZGUsIHN0ciwgbmFtZXNwYWNlTm9kZSk7CiAKICAgICAvLyBIYXZlIHRoZSBYT2JqZWN0IHJldHVybiBpdHMgcmVzdWx0IGFzIGEgTm9kZVNldC4KLSAgICByZXR1cm4gbGlzdC5ub2Rlc2V0KCk7CisgICAgLy8gJVRCRCUgQ29udmVydCB0byBET00gbm9kZXNldAorLy8gICAgcmV0dXJuIGxpc3Qubm9kZXNldCgpOworICAgIHJldHVybiBudWxsOwogICB9CiAKICAgLyoqCkBAIC0yNzIsNyArMjc0LDkgQEAKICAgICBYUGF0aCB4cGF0aCA9IG5ldyBYUGF0aChzdHIsIG51bGwsIHByZWZpeFJlc29sdmVyLCBYUGF0aC5TRUxFQ1QsIG51bGwpOwogCiAgICAgLy8gRXhlY3V0ZSB0aGUgWFBhdGgsIGFuZCBoYXZlIGl0IHJldHVybiB0aGUgcmVzdWx0Ci0gICAgcmV0dXJuIHhwYXRoLmV4ZWN1dGUoeHBhdGhTdXBwb3J0LCBjb250ZXh0Tm9kZSwgcHJlZml4UmVzb2x2ZXIpOworICAgIC8vICVUQkQlIE5lZWQgdG8gY29udmVydCBjb250ZXh0Tm9kZSB0byBhIERUTSBub2RlCisvLyAgICByZXR1cm4geHBhdGguZXhlY3V0ZSh4cGF0aFN1cHBvcnQsIGNvbnRleHROb2RlLCBwcmVmaXhSZXNvbHZlcik7CisgICAgcmV0dXJuIG51bGw7CiAgIH0KIAogICAvKioKQEAgLTMxMSw2ICszMTUsOCBAQAogICAgIFhQYXRoIHhwYXRoID0gbmV3IFhQYXRoKHN0ciwgbnVsbCwgcHJlZml4UmVzb2x2ZXIsIFhQYXRoLlNFTEVDVCwgbnVsbCk7CiAKICAgICAvLyBFeGVjdXRlIHRoZSBYUGF0aCwgYW5kIGhhdmUgaXQgcmV0dXJuIHRoZSByZXN1bHQKLSAgICByZXR1cm4geHBhdGguZXhlY3V0ZShuZXcgWFBhdGhDb250ZXh0KCksIGNvbnRleHROb2RlLCBwcmVmaXhSZXNvbHZlcik7CisgICAgLy8gJVRCRCUgTmVlZCB0byBjb252ZXJ0IGNvbnRleHROb2RlIHRvIGEgRFRNIG5vZGUKKyAgICAvLyByZXR1cm4geHBhdGguZXhlY3V0ZShuZXcgWFBhdGhDb250ZXh0KCksIGNvbnRleHROb2RlLCBwcmVmaXhSZXNvbHZlcik7CisgICAgcmV0dXJuIG51bGw7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL1hQYXRoQ29udGV4dC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvWFBhdGhDb250ZXh0LmphdmEKaW5kZXggMzdjN2ZjZC4uOGI4ZDU2NCAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvWFBhdGhDb250ZXh0LmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvWFBhdGhDb250ZXh0LmphdmEKQEAgLTc2LDExICs3NiwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguYXhlcy5TdWJDb250ZXh0TGlzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE5vZGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhTdHJpbmc7CiAKIC8vIERPTSBJbXBvcnRzCi1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuVHJlZVdhbGtlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5UcmVlV2Fsa2VyOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4uZXh0ZW5zaW9ucy5FeHByZXNzaW9uQ29udGV4dDsKIApAQCAtOTIsNyArOTMsNiBAQAogLy8gVFJhWCBpbXBvcnRzCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlcjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlNBWFNvdXJjZUxvY2F0b3I7CiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKIApAQCAtMTAzLDEyICsxMDMsMjA0IEBACiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5FcnJvckxpc3RlbmVyOwogCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1GaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNV1NGaWx0ZXI7CisKKy8vIFV0aWxpdHkgaW1wb3J0cy4KK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5TQVhTb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmdGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5heGVzLkRlc2NlbmRhbnRJdGVyYXRvcjsKKwogLyoqCiAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KICAqIERlZmF1bHQgY2xhc3MgZm9yIHRoZSBydW50aW1lIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBYUGF0aC4KKyAqIAorICogPHA+VGhpcyBjbGFzcyBleHRlbmRzIERUTU1hbmFnZXIgYnV0IGRvZXMgbm90IGRpcmVjdGx5IGltcGxlbWVudCBpdC48L3A+CiAgKi8KLXB1YmxpYyBjbGFzcyBYUGF0aENvbnRleHQgaW1wbGVtZW50cyBFeHByZXNzaW9uQ29udGV4dAorcHVibGljIGNsYXNzIFhQYXRoQ29udGV4dCBleHRlbmRzIERUTU1hbmFnZXIgLy8gaW1wbGVtZW50cyBFeHByZXNzaW9uQ29udGV4dAogeworICAvKioKKyAgICogVGhvdWdoIFhQYXRoQ29udGV4dCBjb250ZXh0IGV4dGVuZHMgCisgICAqIHRoZSBEVE1NYW5hZ2VyLCBpdCByZWFsbHkgaXMgYSBwcm94eSBmb3IgdGhpcyBvYmplY3QsIHdoaWNoIAorICAgKiBpcyB0aGUgcmVhbCBEVE1NYW5hZ2VyLgorICAgKi8KKyAgcHJpdmF0ZSBEVE1NYW5hZ2VyIG1fZHRtTWFuYWdlciA9IERUTU1hbmFnZXIubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhNTFN0cmluZ0ZhY3RvcnlJbXBsLmdldEZhY3RvcnkoKSk7CisgIAorICAvKioKKyAgICogUmV0dXJuIHRoZSBEVE1NYW5hZ2VyIG9iamVjdC4gIFRob3VnaCBYUGF0aENvbnRleHQgY29udGV4dCBleHRlbmRzIAorICAgKiB0aGUgRFRNTWFuYWdlciwgaXQgcmVhbGx5IGlzIGEgcHJveHkgZm9yIHRoZSByZWFsIERUTU1hbmFnZXIuICBJZiBhIAorICAgKiBjYWxsZXIgbmVlZHMgdG8gbWFrZSBhIGxvdCBvZiBjYWxscyB0byB0aGUgRFRNTWFuYWdlciwgaXQgaXMgZmFzdGVyIAorICAgKiBpZiBpdCBnZXRzIHRoZSByZWFsIG9uZSBmcm9tIHRoaXMgZnVuY3Rpb24uCisgICAqLworICAgcHVibGljIERUTU1hbmFnZXIgZ2V0RFRNTWFuYWdlcigpCisgICB7CisgICAgIHJldHVybiBtX2R0bU1hbmFnZXI7CisgICB9CisgIAorICAvKioKKyAgICogR2V0IGFuIGluc3RhbmNlIG9mIGEgRFRNLCBsb2FkZWQgd2l0aCB0aGUgY29udGVudCBmcm9tIHRoZQorICAgKiBzcGVjaWZpZWQgc291cmNlLiAgSWYgdGhlIHVuaXF1ZSBmbGFnIGlzIHRydWUsIGEgbmV3IGluc3RhbmNlIHdpbGwKKyAgICogYWx3YXlzIGJlIHJldHVybmVkLiAgT3RoZXJ3aXNlIGl0IGlzIHVwIHRvIHRoZSBEVE1NYW5hZ2VyIHRvIHJldHVybiBhCisgICAqIG5ldyBpbnN0YW5jZSBvciBhbiBpbnN0YW5jZSB0aGF0IGl0IGFscmVhZHkgY3JlYXRlZCBhbmQgbWF5IGJlIGJlaW5nIHVzZWQKKyAgICogYnkgc29tZW9uZSBlbHNlLgorICAgKiAoSSB0aGluayBtb3JlIHBhcmFtZXRlcnMgd2lsbCBuZWVkIHRvIGJlIGFkZGVkIGZvciBlcnJvciBoYW5kbGluZywgYW5kIGVudGl0eQorICAgKiByZXNvbHV0aW9uKS4KKyAgICoKKyAgICogQHBhcmFtIHNvdXJjZSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc291cmNlIG9iamVjdCwgd2hpY2ggbWF5IGJlIG51bGwsIAorICAgKiAgICAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgaXQgaXMgYXNzdW1lZCB0aGF0IG5vZGUgY29uc3RydWN0aW9uIHdpbGwgdGFrZSAKKyAgICogICAgICAgICAgICAgICBieSBzb21lIG90aGVyIG1lYW5zLgorICAgKiBAcGFyYW0gdW5pcXVlIHRydWUgaWYgdGhlIHJldHVybmVkIERUTSBtdXN0IGJlIHVuaXF1ZSwgcHJvYmFibHkgYmVjYXVzZSBpdAorICAgKiBpcyBnb2luZyB0byBiZSBtdXRhdGVkLgorICAgKiBAcGFyYW0gd2hpdGVTcGFjZUZpbHRlciBFbmFibGVzIGZpbHRlcmluZyBvZiB3aGl0ZXNwYWNlIG5vZGVzLCBhbmQgbWF5IAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBudWxsLgorICAgKiBAcGFyYW0gaW5jcmVtZW50YWwgdHJ1ZSBpZiB0aGUgY29uc3RydWN0aW9uIHNob3VsZCB0cnkgYW5kIGJlIGluY3JlbWVudGFsLgorICAgKgorICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgRFRNIHJlZmVyZW5jZS4KKyAgICovCisgIHB1YmxpYyBEVE0gZ2V0RFRNKGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlIHNvdXJjZSwgYm9vbGVhbiB1bmlxdWUsIAorICAgICAgICAgICAgICAgICAgICBEVE1XU0ZpbHRlciB3c2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNyZW1lbnRhbCkKKyAgeworICAgIHJldHVybiBtX2R0bU1hbmFnZXIuZ2V0RFRNKHNvdXJjZSwgdW5pcXVlLCB3c2ZpbHRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50YWwpOworICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAvKioKKyAgICogR2V0IGFuIGluc3RhbmNlIG9mIGEgRFRNIHRoYXQgIm93bnMiIGEgbm9kZSBoYW5kbGUuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIHRoZSBub2RlSGFuZGxlLgorICAgKgorICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgRFRNIHJlZmVyZW5jZS4KKyAgICovCisgIHB1YmxpYyBEVE0gZ2V0RFRNKGludCBub2RlSGFuZGxlKQorICB7CisgICAgcmV0dXJuIG1fZHRtTWFuYWdlci5nZXREVE0obm9kZUhhbmRsZSk7CisgIH0KKyAgCisgIC8qKgorICAgKiBHaXZlbiBhIFczQyBET00gbm9kZSwgdHJ5IGFuZCByZXR1cm4gYSBEVE0gaGFuZGxlLgorICAgKiBOb3RlOiBjYWxsaW5nIHRoaXMgbWF5IGJlIG5vbi1vcHRpbWFsLgorICAgKiAKKyAgICogQHBhcmFtIG5vZGUgTm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgRE9NIG5vZGUuCisgICAqIAorICAgKiBAcmV0dXJuIGEgdmFsaWQgRFRNIGhhbmRsZS4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0RFRNSGFuZGxlRnJvbU5vZGUob3JnLnczYy5kb20uTm9kZSBub2RlKQorICB7CisgICAgcmV0dXJuIG1fZHRtTWFuYWdlci5nZXREVE1IYW5kbGVGcm9tTm9kZShub2RlKTsKKyAgfQorCisgIAorICAvKioKKyAgICogJVRCRCUgRG9jCisgICAqLworICBwdWJsaWMgaW50IGdldERUTUlkZW50aXR5KERUTSBkdG0pCisgIHsKKyAgICByZXR1cm4gbV9kdG1NYW5hZ2VyLmdldERUTUlkZW50aXR5KGR0bSk7CisgIH0KKyAgCisgIC8qKgorICAgKiBDcmVhdGVzIGFuIGVtcHR5IDxjb2RlPkRvY3VtZW50RnJhZ21lbnQ8L2NvZGU+IG9iamVjdC4gCisgICAqIEByZXR1cm4gQSBuZXcgPGNvZGU+RG9jdW1lbnRGcmFnbWVudCBoYW5kbGU8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIERUTSBjcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKKyAgeworICAgIHJldHVybiBtX2R0bU1hbmFnZXIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOworICB9CisgIAorICAvKioKKyAgICogUmVsZWFzZSBhIERUTSBlaXRoZXIgdG8gYSBscnUgcG9vbCwgb3IgY29tcGxldGVseSByZW1vdmUgcmVmZXJlbmNlLgorICAgKiBEVE1zIHdpdGhvdXQgc3lzdGVtIElEcyBhcmUgYWx3YXlzIGhhcmQgZGVsZXRlZC4KKyAgICogU3RhdGU6IGV4cGVyaW1lbnRhbC4KKyAgICogCisgICAqIEBwYXJhbSBkdG0gVGhlIERUTSB0byBiZSByZWxlYXNlZC4KKyAgICogQHBhcmFtIHNob3VsZEhhcmREZWxldGUgVHJ1ZSBpZiB0aGUgRFRNIHNob3VsZCBiZSByZW1vdmVkIG5vIG1hdHRlciB3aGF0LgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIERUTSB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgaXQgd2FzIHB1dCBiYWNrIGluIGEgbHJ1IHBvb2wuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiByZWxlYXNlKERUTSBkdG0sIGJvb2xlYW4gc2hvdWxkSGFyZERlbGV0ZSkKKyAgeworICAgIHJldHVybiBtX2R0bU1hbmFnZXIucmVsZWFzZShkdG0sIHNob3VsZEhhcmREZWxldGUpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyA8Y29kZT5EVE1JdGVyYXRvcjwvY29kZT4gYmFzZWQgb24gYW4gWFBhdGgKKyAgICogPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjTlQtTG9jYXRpb25QYXRoPkxvY2F0aW9uUGF0aDwvYT4gb3IKKyAgICogYSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aCNOVC1VbmlvbkV4cHIiPlVuaW9uRXhwcjwvYT4uCisgICAqCisgICAqIEBwYXJhbSB4cGF0aENvbXBpbGVyID8/PyBTb21laG93IHdlIG5lZWQgdG8gcGFzcyBpbiBhIHN1YnBhcnQgb2YgdGhlCisgICAqIGV4cHJlc3Npb24uICBJIGhhdGUgdG8gZG8gdGhpcyB3aXRoIHN0cmluZ3MsIHNpbmNlIHRoZSBsYXJnZXIgZXhwcmVzc2lvbgorICAgKiBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZC4KKyAgICoKKyAgICogQHBhcmFtIHBvcyBUaGUgcG9zaXRpb24gaW4gdGhlIGV4cHJlc3Npb24uCisgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIERUTUl0ZXJhdG9yIGNyZWF0ZURUTUl0ZXJhdG9yKE9iamVjdCB4cGF0aENvbXBpbGVyLCBpbnQgcG9zKQorICB7CisgICAgcmV0dXJuIG1fZHRtTWFuYWdlci5jcmVhdGVEVE1JdGVyYXRvcih4cGF0aENvbXBpbGVyLCBwb3MpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyA8Y29kZT5EVE1JdGVyYXRvcjwvY29kZT4gYmFzZWQgb24gYW4gWFBhdGgKKyAgICogPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjTlQtTG9jYXRpb25QYXRoPkxvY2F0aW9uUGF0aDwvYT4gb3IKKyAgICogYSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aCNOVC1VbmlvbkV4cHIiPlVuaW9uRXhwcjwvYT4uCisgICAqCisgICAqIEBwYXJhbSB4cGF0aFN0cmluZyBNdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGV4cHJlc3NpbmcgYQorICAgKiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aCNOVC1Mb2NhdGlvblBhdGg+TG9jYXRpb25QYXRoPC9hPiBvcgorICAgKiBhIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI05ULVVuaW9uRXhwciI+VW5pb25FeHByPC9hPi4KKyAgICoKKyAgICogQHBhcmFtIHByZXNvbHZlciBBbiBvYmplY3QgdGhhdCBjYW4gcmVzb2x2ZSBwcmVmaXhlcyB0byBuYW1lc3BhY2UgVVJMcy4KKyAgICoKKyAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5EVE1JdGVyYXRvcjwvY29kZT4uCisgICAqLworICBwdWJsaWMgRFRNSXRlcmF0b3IgY3JlYXRlRFRNSXRlcmF0b3IoU3RyaW5nIHhwYXRoU3RyaW5nLAorICAgICAgICAgIFByZWZpeFJlc29sdmVyIHByZXNvbHZlcikKKyAgeworICAgIHJldHVybiBtX2R0bU1hbmFnZXIuY3JlYXRlRFRNSXRlcmF0b3IoeHBhdGhTdHJpbmcsIHByZXNvbHZlcik7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IDxjb2RlPkRUTUl0ZXJhdG9yPC9jb2RlPiBiYXNlZCBvbmx5IG9uIGEgd2hhdFRvU2hvdyBhbmQKKyAgICogYSBEVE1GaWx0ZXIuICBUaGUgdHJhdmVyc2FsIHNlbWFudGljcyBhcmUgZGVmaW5lZCBhcyB0aGUgZGVzY2VuZGFudAorICAgKiBhY2Nlc3MuCisgICAqCisgICAqIEBwYXJhbSB3aGF0VG9TaG93IFRoaXMgZmxhZyBzcGVjaWZpZXMgd2hpY2ggbm9kZSB0eXBlcyBtYXkgYXBwZWFyIGluCisgICAqICAgdGhlIGxvZ2ljYWwgdmlldyBvZiB0aGUgdHJlZSBwcmVzZW50ZWQgYnkgdGhlIGl0ZXJhdG9yLiBTZWUgdGhlCisgICAqICAgZGVzY3JpcHRpb24gb2YgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gZm9yIHRoZSBzZXQgb2YgcG9zc2libGUKKyAgICogICA8Y29kZT5TSE9XXzwvY29kZT4gdmFsdWVzLlRoZXNlIGZsYWdzIGNhbiBiZSBjb21iaW5lZCB1c2luZworICAgKiAgIDxjb2RlPk9SPC9jb2RlPi4KKyAgICogQHBhcmFtIGZpbHRlciBUaGUgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gdG8gYmUgdXNlZCB3aXRoIHRoaXMKKyAgICogICA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gaW5kaWNhdGUgbm8gZmlsdGVyLgorICAgKiBAcGFyYW0gZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uIFRoZSB2YWx1ZSBvZiB0aGlzIGZsYWcgZGV0ZXJtaW5lcworICAgKiAgIHdoZXRoZXIgZW50aXR5IHJlZmVyZW5jZSBub2RlcyBhcmUgZXhwYW5kZWQuCisgICAqCisgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBEVE1JdGVyYXRvciBjcmVhdGVEVE1JdGVyYXRvcihpbnQgd2hhdFRvU2hvdywKKyAgICAgICAgICBEVE1GaWx0ZXIgZmlsdGVyLCBib29sZWFuIGVudGl0eVJlZmVyZW5jZUV4cGFuc2lvbikKKyAgeworICAgIHJldHVybiBtX2R0bU1hbmFnZXIuY3JlYXRlRFRNSXRlcmF0b3Iod2hhdFRvU2hvdywgZmlsdGVyLCBlbnRpdHlSZWZlcmVuY2VFeHBhbnNpb24pOworICB9CisgIAorICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IDxjb2RlPkRUTUl0ZXJhdG9yPC9jb2RlPiB0aGF0IGhvbGRzIGV4YWN0bHkgb25lIG5vZGUuCisgICAqCisgICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIGhhbmRsZSB0aGF0IHRoZSBEVE1JdGVyYXRvciB3aWxsIGl0ZXJhdGUgdG8uCisgICAqCisgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+RFRNSXRlcmF0b3I8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIERUTUl0ZXJhdG9yIGNyZWF0ZURUTUl0ZXJhdG9yKGludCBub2RlKQorICB7CisgICAgRGVzY2VuZGFudEl0ZXJhdG9yIGl0ZXIgPSBuZXcgRGVzY2VuZGFudEl0ZXJhdG9yKCk7CisgICAgaXRlci5pbml0Q29udGV4dCh0aGlzLCBub2RlKTsKKyAgICByZXR1cm4gaXRlcjsKKyAgICAvLyByZXR1cm4gbV9kdG1NYW5hZ2VyLmNyZWF0ZURUTUl0ZXJhdG9yKG5vZGUpOworICB9CiAKICAgLyoqCiAgICAqIENyZWF0ZSBhbiBYUGF0aENvbnRleHQgaW5zdGFuY2UuCkBAIC00NTAsNyArNjQyLDcgQEAKICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIC8vIFNFQ1RJT046IEV4ZWN1dGlvbiBjb250ZXh0IHN0YXRlIHRyYWNraW5nCiAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCisgIAogICAvKioKICAgICogVGhlIGN1cnJlbnQgY29udGV4dCBub2RlIGxpc3QuCiAgICAqLwpAQCAtNDY1LDExICs2NTcsMTEgQEAKICAgICogQHJldHVybiAgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjZHQtY3VycmVudC1ub2RlLWxpc3QiPmN1cnJlbnQgbm9kZSBsaXN0PC9hPiwKICAgICogYWxzbyByZWZlcmVkIHRvIGhlcmUgYXMgYSA8dGVybT5jb250ZXh0IG5vZGUgbGlzdDwvdGVybT4uCiAgICAqLwotICBwdWJsaWMgZmluYWwgQ29udGV4dE5vZGVMaXN0IGdldENvbnRleHROb2RlTGlzdCgpCisgIHB1YmxpYyBmaW5hbCBEVE1JdGVyYXRvciBnZXRDb250ZXh0Tm9kZUxpc3QoKQogICB7CiAKICAgICBpZiAobV9jb250ZXh0Tm9kZUxpc3RzLnNpemUoKSA+IDApCi0gICAgICByZXR1cm4gKENvbnRleHROb2RlTGlzdCkgbV9jb250ZXh0Tm9kZUxpc3RzLnBlZWsoKTsKKyAgICAgIHJldHVybiAoRFRNSXRlcmF0b3IpIG1fY29udGV4dE5vZGVMaXN0cy5wZWVrKCk7CiAgICAgZWxzZQogICAgICAgcmV0dXJuIG51bGw7CiAgIH0KQEAgLTQ4MSw3ICs2NzMsNyBAQAogICAgKiBAcGFyYW0gbmwgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjZHQtY3VycmVudC1ub2RlLWxpc3QiPmN1cnJlbnQgbm9kZSBsaXN0PC9hPiwKICAgICogYWxzbyByZWZlcmVkIHRvIGhlcmUgYXMgYSA8dGVybT5jb250ZXh0IG5vZGUgbGlzdDwvdGVybT4uCiAgICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBwdXNoQ29udGV4dE5vZGVMaXN0KENvbnRleHROb2RlTGlzdCBubCkKKyAgcHVibGljIGZpbmFsIHZvaWQgcHVzaENvbnRleHROb2RlTGlzdChEVE1JdGVyYXRvciBubCkKICAgewogICAgIG1fY29udGV4dE5vZGVMaXN0cy5wdXNoKG5sKTsKICAgfQpAQCAtNTE0LDE4ICs3MDYsMTggQEAKICAgICoKICAgICogQHJldHVybiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCNkdC1jdXJyZW50LW5vZGUiPmN1cnJlbnQgbm9kZTwvYT4uCiAgICAqLwotICBwdWJsaWMgZmluYWwgTm9kZSBnZXRDdXJyZW50Tm9kZSgpCisgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q3VycmVudE5vZGUoKQogICB7CiAgICAgcmV0dXJuIG1fY3VycmVudE5vZGVzLnBlZXBPck51bGwoKTsKICAgfQotCisgIAogICAvKioKICAgICogU2V0IHRoZSBjdXJyZW50IGNvbnRleHQgbm9kZSBhbmQgZXhwcmVzc2lvbiBub2RlLgogICAgKgogICAgKiBAcGFyYW0gY24gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjZHQtY3VycmVudC1ub2RlIj5jdXJyZW50IG5vZGU8L2E+LgogICAgKiBAcGFyYW0gZW4gdGhlIHN1Yi1leHByZXNzaW9uIGNvbnRleHQgbm9kZS4KICAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHB1c2hDdXJyZW50Tm9kZUFuZEV4cHJlc3Npb24oTm9kZSBjbiwgTm9kZSBlbikKKyAgcHVibGljIGZpbmFsIHZvaWQgcHVzaEN1cnJlbnROb2RlQW5kRXhwcmVzc2lvbihpbnQgY24sIGludCBlbikKICAgewogICAgIG1fY3VycmVudE5vZGVzLnB1c2goY24pOwogICAgIG1fY3VycmVudEV4cHJlc3Npb25Ob2Rlcy5wdXNoKGVuKTsKQEAgLTU0NSw3ICs3MzcsNyBAQAogICAgKgogICAgKiBAcGFyYW0gbiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCNkdC1jdXJyZW50LW5vZGUiPmN1cnJlbnQgbm9kZTwvYT4uCiAgICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBwdXNoQ3VycmVudE5vZGUoTm9kZSBuKQorICBwdWJsaWMgZmluYWwgdm9pZCBwdXNoQ3VycmVudE5vZGUoaW50IG4pCiAgIHsKICAgICBtX2N1cnJlbnROb2Rlcy5wdXNoKG4pOwogICB9CkBAIC01NjksNyArNzYxLDcgQEAKICAgICoKICAgICogQHJldHVybiBUaGUgY3VycmVudCBzdWItZXhwcmVzc2lvbiBub2RlLgogICAgKi8KLSAgcHVibGljIGZpbmFsIE5vZGUgZ2V0Q3VycmVudEV4cHJlc3Npb25Ob2RlKCkKKyAgcHVibGljIGZpbmFsIGludCBnZXRDdXJyZW50RXhwcmVzc2lvbk5vZGUoKQogICB7CiAgICAgcmV0dXJuIG1fY3VycmVudEV4cHJlc3Npb25Ob2Rlcy5wZWVwT3JOdWxsKCk7CiAgIH0KQEAgLTU3OSw3ICs3NzEsNyBAQAogICAgKgogICAgKiBAcGFyYW0gbiBUaGUgc3ViLWV4cHJlc3Npb24gbm9kZSB0byBiZSBjdXJyZW50LgogICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgcHVzaEN1cnJlbnRFeHByZXNzaW9uTm9kZShOb2RlIG4pCisgIHB1YmxpYyBmaW5hbCB2b2lkIHB1c2hDdXJyZW50RXhwcmVzc2lvbk5vZGUoaW50IG4pCiAgIHsKICAgICBtX2N1cnJlbnRFeHByZXNzaW9uTm9kZXMucHVzaChuKTsKICAgfQpAQCAtNjY2LDcgKzg1OCw3IEBACiAgICAqIEdldCB0aGUgY3VycmVudCBjb250ZXh0IG5vZGUuCiAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgY29udGV4dCBub2RlLgogICAgKi8KLSAgcHVibGljIGZpbmFsIE5vZGUgZ2V0Q29udGV4dE5vZGUoKQorICBwdWJsaWMgZmluYWwgaW50IGdldENvbnRleHROb2RlKCkKICAgewogICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnROb2RlKCk7CiAgIH0KQEAgLTY3NiwxMiArODY4LDEyIEBACiAgICAqIEByZXR1cm4gQW4gaXRlcmF0b3IgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQgbGlzdCwgYXMKICAgICogZGVmaW5lZCBpbiBYU0xULgogICAgKi8KLSAgcHVibGljIGZpbmFsIE5vZGVJdGVyYXRvciBnZXRDb250ZXh0Tm9kZXMoKQorICBwdWJsaWMgZmluYWwgRFRNSXRlcmF0b3IgZ2V0Q29udGV4dE5vZGVzKCkKICAgewogCiAgICAgdHJ5CiAgICAgewotICAgICAgQ29udGV4dE5vZGVMaXN0IGNubCA9IGdldENvbnRleHROb2RlTGlzdCgpOworICAgICAgRFRNSXRlcmF0b3IgY25sID0gZ2V0Q29udGV4dE5vZGVMaXN0KCk7CiAKICAgICAgIGlmIChudWxsICE9IGNubCkKICAgICAgICAgcmV0dXJuIGNubC5jbG9uZVdpdGhSZXNldCgpOwpAQCAtNjkzLDI0ICs4ODUsNzMgQEAKICAgICAgIHJldHVybiBudWxsOyAgLy8gZXJyb3IgcmVwb3J0aW5nPwogICAgIH0KICAgfQotCisgIAorICBYUGF0aEV4cHJlc3Npb25Db250ZXh0IGV4cHJlc2lvbkNvbnRleHQgPSBuZXcgWFBhdGhFeHByZXNzaW9uQ29udGV4dCgpOworICAKICAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgb2YgYSBub2RlIGFzIGEgbnVtYmVyLgotICAgKiBAcGFyYW0gbiBOb2RlIHRvIGJlIGNvbnZlcnRlZCB0byBhIG51bWJlci4gIE1heSBiZSBudWxsLgotICAgKiBAcmV0dXJuIHZhbHVlIG9mIG4gYXMgYSBudW1iZXIuCisgICAqIFRoZSB0aGUgZXhwcmVzc2lvbiBjb250ZXh0IGZvciBleHRlbnNpb25zIGZvciB0aGlzIGNvbnRleHQuCisgICAqIAorICAgKiBAcmV0dXJuIEFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIEV4cHJlc3Npb25Db250ZXh0LgogICAgKi8KLSAgcHVibGljIGZpbmFsIGRvdWJsZSB0b051bWJlcihOb2RlIG4pCisgIHB1YmxpYyBFeHByZXNzaW9uQ29udGV4dCBnZXRFeHByZXNzaW9uQ29udGV4dCgpCiAgIHsKLSAgICByZXR1cm4gWE5vZGVTZXQuZ2V0TnVtYmVyRnJvbU5vZGUobik7CisgICAgcmV0dXJuIGV4cHJlc2lvbkNvbnRleHQ7CisgIH0KKyAgCisgIGNsYXNzIFhQYXRoRXhwcmVzc2lvbkNvbnRleHQgaW1wbGVtZW50cyBFeHByZXNzaW9uQ29udGV4dAorICB7CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IGNvbnRleHQgbm9kZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGNvbnRleHQgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBnZXRDb250ZXh0Tm9kZSgpCisgICAgeworICAgICAgaW50IGNvbnRleHQgPSBtX2N1cnJlbnROb2Rlcy5wZWVwT3JOdWxsKCk7CisgICAgICAKKyAgICAgIHJldHVybiBnZXREVE0oY29udGV4dCkuZ2V0Tm9kZShjb250ZXh0KTsKKyAgICB9CisgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBjb250ZXh0IG5vZGUgbGlzdC4KKyAgICAgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIGZvciB0aGUgY3VycmVudCBjb250ZXh0IGxpc3QsIGFzCisgICAgICogZGVmaW5lZCBpbiBYU0xULgorICAgICAqLworICAgIHB1YmxpYyBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yIGdldENvbnRleHROb2RlcygpCisgICAgeworICAgICAgLy8gJVRCRCUKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIG5vZGUgYXMgYSBudW1iZXIuCisgICAgICogQHBhcmFtIG4gTm9kZSB0byBiZSBjb252ZXJ0ZWQgdG8gYSBudW1iZXIuICBNYXkgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIG4gYXMgYSBudW1iZXIuCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSB0b051bWJlcihvcmcudzNjLmRvbS5Ob2RlIG4pCisgICAgeworICAgICAgLy8gJVJFVklFVyUgWW91IGNhbid0IGdldCBtdWNoIHVnbGllciB0aGFuIHRoaXMuLi4KKyAgICAgIGludCBub2RlSGFuZGxlID0gZ2V0RFRNSGFuZGxlRnJvbU5vZGUobik7CisgICAgICBEVE0gZHRtID0gZ2V0RFRNKG5vZGVIYW5kbGUpOworICAgICAgWFN0cmluZyB4b2JqID0gKFhTdHJpbmcpZHRtLmdldFN0cmluZ1ZhbHVlKG5vZGVIYW5kbGUpOworICAgICAgcmV0dXJuIHhvYmoubnVtKCk7CisgICAgfQorICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgbm9kZSBhcyBhIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gbiBOb2RlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZy4gIE1heSBiZSBudWxsLgorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgbiBhcyBhIHN0cmluZywgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG4gaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKG9yZy53M2MuZG9tLk5vZGUgbikKKyAgICB7CisgICAgICAvLyAlUkVWSUVXJSBZb3UgY2FuJ3QgZ2V0IG11Y2ggdWdsaWVyIHRoYW4gdGhpcy4uLgorICAgICAgaW50IG5vZGVIYW5kbGUgPSBnZXREVE1IYW5kbGVGcm9tTm9kZShuKTsKKyAgICAgIERUTSBkdG0gPSBnZXREVE0obm9kZUhhbmRsZSk7CisgICAgICBYTUxTdHJpbmcgc3RyVmFsID0gZHRtLmdldFN0cmluZ1ZhbHVlKG5vZGVIYW5kbGUpOworICAgICAgcmV0dXJuIHN0clZhbC50b1N0cmluZygpOworICAgIH0KKworICAgIAogICB9CiAKLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgb2YgYSBub2RlIGFzIGEgc3RyaW5nLgotICAgKiBAcGFyYW0gbiBOb2RlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZy4gIE1heSBiZSBudWxsLgotICAgKiBAcmV0dXJuIHZhbHVlIG9mIG4gYXMgYSBzdHJpbmcsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBuIGlzIG51bGwuCi0gICAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKE5vZGUgbikKLSAgewotICAgIHJldHVybiBYTm9kZVNldC5nZXRTdHJpbmdGcm9tTm9kZShuKTsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9BbmNlc3Rvck9yU2VsZldhbGtlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9BbmNlc3Rvck9yU2VsZldhbGtlci5qYXZhCmluZGV4IDJkNzFlZmYuLmQ1MDdkNDAgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQW5jZXN0b3JPclNlbGZXYWxrZXIuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0FuY2VzdG9yT3JTZWxmV2Fsa2VyLmphdmEKQEAgLTYxLDkgKzYxLDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5heGVzLkxvY1BhdGhJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguRE9NSGVscGVyOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5JbnRTdGFjazsKIAogLyoqCiAgKiBXYWxrZXIgZm9yIHRoZSAnYW5jZXN0b3Itb3Itc2VsZicgYXhlcy4KQEAgLTg3LDIxICs4OCwyMSBAQAogICAgKgogICAgKiBAcGFyYW0gbiBUaGUgY29udGV4dCBub2RlLgogICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHVzaEFuY2VzdG9ycyhOb2RlIG4pCisgIHByb3RlY3RlZCB2b2lkIHB1c2hBbmNlc3RvcnMoaW50IG4pCiAgIHsKIAotICAgIG1fYW5jZXN0b3JzID0gbmV3IFN0YWNrKCk7CisgICAgbV9hbmNlc3RvcnMgPSBuZXcgSW50U3RhY2soKTsKIAogICAgIG1fYW5jZXN0b3JzLnB1c2gobik7CiAKLSAgICBET01IZWxwZXIgZGggPSBtX2xwaS5nZXRET01IZWxwZXIoKTsKKyAgICBEVE0gZHRtID0gZ2V0RFRNKG4pOwogCi0gICAgd2hpbGUgKG51bGwgIT0gKG4gPSBkaC5nZXRQYXJlbnRPZk5vZGUobikpKQorICAgIHdoaWxlIChEVE0uTlVMTCAhPSAobiA9IGR0bS5nZXRQYXJlbnQobikpKQogICAgIHsKICAgICAgIG1fYW5jZXN0b3JzLnB1c2gobik7CiAgICAgfQogCi0gICAgbV9uZXh0TGV2ZWxBbW91bnQgPSBtX2FuY2VzdG9ycy5pc0VtcHR5KCkgPyAwIDogMTsKKyAgICBtX25leHRMZXZlbEFtb3VudCA9IG1fYW5jZXN0b3JzLmVtcHR5KCkgPyAwIDogMTsKICAgICBtX2FuY2VzdG9yc1BvcyA9IG1fYW5jZXN0b3JzLnNpemUoKSAtIDE7CiAgIH0KIApAQCAtMTEyLDYgKzExMyw2IEBACiAgICAqLwogICBwcm90ZWN0ZWQgaW50IGdldExldmVsTWF4KCkKICAgewotICAgIHJldHVybiBtX2xwaS5nZXRET01IZWxwZXIoKS5nZXRMZXZlbChtX3Jvb3QpOworICAgIHJldHVybiBnZXREVE0obV9yb290KS5nZXRMZXZlbChtX3Jvb3QpOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0FuY2VzdG9yV2Fsa2VyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0FuY2VzdG9yV2Fsa2VyLmphdmEKaW5kZXggMDg5ZGExOC4uNWYxMTJkZSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9BbmNlc3RvcldhbGtlci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQW5jZXN0b3JXYWxrZXIuamF2YQpAQCAtNjEsOSArNjEsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLmF4ZXMuTG9jUGF0aEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5ET01IZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuSW50U3RhY2s7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiAvKioKICAqIFdhbGtlciBmb3IgdGhlICdhbmNlc3RvcicgYXhlcy4KQEAgLTEwMywxOSArMTA0LDE5IEBACiAgICAqCiAgICAqIEBwYXJhbSBuCiAgICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwdXNoQW5jZXN0b3JzKE5vZGUgbikKKyAgcHJvdGVjdGVkIHZvaWQgcHVzaEFuY2VzdG9ycyhpbnQgbikKICAgewogCi0gICAgbV9hbmNlc3RvcnMgPSBuZXcgU3RhY2soKTsKKyAgICBtX2FuY2VzdG9ycyA9IG5ldyBJbnRTdGFjaygpOwogCi0gICAgRE9NSGVscGVyIGRoID0gbV9scGkuZ2V0RE9NSGVscGVyKCk7CisgICAgRFRNIGR0bSA9IGdldERUTShuKTsKIAotICAgIHdoaWxlIChudWxsICE9IChuID0gZGguZ2V0UGFyZW50T2ZOb2RlKG4pKSkKKyAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKG4gPSBkdG0uZ2V0UGFyZW50KG4pKSkKICAgICB7CiAgICAgICBtX2FuY2VzdG9ycy5wdXNoKG4pOwogICAgIH0KIAotICAgIG1fbmV4dExldmVsQW1vdW50ID0gbV9hbmNlc3RvcnMuaXNFbXB0eSgpID8gMCA6IDE7CisgICAgbV9uZXh0TGV2ZWxBbW91bnQgPSBtX2FuY2VzdG9ycy5lbXB0eSgpID8gMCA6IDE7CiAgICAgbV9hbmNlc3RvcnNQb3MgPSBtX2FuY2VzdG9ycy5zaXplKCkgLSAxOwogICB9CiAKQEAgLTEyNCw3ICsxMjUsNyBAQAogICAgKgogICAgKiBAcGFyYW0gcm9vdCBUaGUgY29udGV4dCBub2RlIG9mIHRoaXMgc3RlcC4KICAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJvb3QoTm9kZSByb290KQorICBwdWJsaWMgdm9pZCBzZXRSb290KGludCByb290KQogICB7CiAgICAgcHVzaEFuY2VzdG9ycyhyb290KTsKICAgICBzdXBlci5zZXRSb290KHJvb3QpOwpAQCAtMTM4LDEwICsxMzksMTEgQEAKICAgICogQHJldHVybiAgVGhlIG5ldyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwogICAgKiAgIHZpc2libGUgY2hpbGRyZW4gaW4gdGhlIFRyZWVXYWxrZXIncyBsb2dpY2FsIHZpZXcuCiAgICAqLwotICBwdWJsaWMgTm9kZSBmaXJzdENoaWxkKCkKKyAgcHVibGljIGludCBmaXJzdENoaWxkKCkKICAgewogCi0gICAgTm9kZSBuZXh0ID0gKG1fYW5jZXN0b3JzUG9zIDwgMCkgPyBudWxsIDogKE5vZGUpIG1fYW5jZXN0b3JzLmVsZW1lbnRBdChtX2FuY2VzdG9yc1Bvcy0tKTsKKyAgICBpbnQgbmV4dCA9IChtX2FuY2VzdG9yc1BvcyA8IDApID8gRFRNLk5VTEwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQpIG1fYW5jZXN0b3JzLmVsZW1lbnRBdChtX2FuY2VzdG9yc1Bvcy0tKTsKIAogICAgIG1fbmV4dExldmVsQW1vdW50ID0gKG1fYW5jZXN0b3JzUG9zIDwgMCkgPyAwIDogMTsKIApAQCAtMTUxLDcgKzE1Myw3IEBACiAgIC8qKiBTdGFjayBvZiBhbmNlc3RvcnMuICBXZSBoYXZlIHRvIGRvIHRoaXMgaW5zdGVhZCBvZiAKICAgICogIGp1c3QgdXNpbmcgZ2V0UGFyZW50IG9uIHRoZSBmbHksIGJlY2F1c2Ugd2UgaGF2ZSB0byB3YWxrIHRoZSBhbmNlc3RvcnMgCiAgICAqICBpbiBkb2N1bWVudCBvcmRlci4gKi8KLSAgdHJhbnNpZW50IHByb3RlY3RlZCBTdGFjayBtX2FuY2VzdG9yczsKKyAgdHJhbnNpZW50IHByb3RlY3RlZCBJbnRTdGFjayBtX2FuY2VzdG9yczsKICAgCiAgIC8qKiBUaGUgcG9zaXRpb24gd2l0aGluIHRoZSBzdGFjay4KICAgICogIEBzZXJpYWwgKi8KQEAgLTE2NSw5ICsxNjcsOSBAQAogICBwcm90ZWN0ZWQgaW50IGdldExldmVsTWF4KCkKICAgewogCi0gICAgRE9NSGVscGVyIGRoID0gbV9scGkuZ2V0RE9NSGVscGVyKCk7Ci0gICAgTm9kZSBwID0gZGguZ2V0UGFyZW50T2ZOb2RlKG1fcm9vdCk7CisgICAgRFRNIGR0bSA9IGdldERUTShtX3Jvb3QpOworICAgIGludCBwID0gZHRtLmdldFBhcmVudChtX3Jvb3QpOwogCi0gICAgcmV0dXJuIChudWxsID09IHApID8gMSA6IGRoLmdldExldmVsKHApOworICAgIHJldHVybiAoRFRNLk5VTEwgPT0gcCkgPyAxIDogZHRtLmdldExldmVsKHApOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0F0dHJpYnV0ZUl0ZXJhdG9yLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0F0dHJpYnV0ZUl0ZXJhdG9yLmphdmEKaW5kZXggYzQzNzRlOC4uZjU2OWJhYyAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9BdHRyaWJ1dGVJdGVyYXRvci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQXR0cmlidXRlSXRlcmF0b3IuamF2YQpAQCAtNjMsMTEgKzYzLDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5wYXR0ZXJucy5Ob2RlVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE9iamVjdDsKIAotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNRmlsdGVyOwogCiAvKioKICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgpAQCAtNzUsNyArNzgsNyBAQAogICogYXR0cmlidXRlIGF4ZXMgcGF0dGVybnMuCiAgKiBAc2VlIG9yZy5hcGFjaGUueHBhdGguYXhlcy5XYWxrZXJGYWN0b3J5I25ld0xvY1BhdGhJdGVyYXRvcgogICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlSXRlcmF0b3IgZXh0ZW5kcyBMb2NQYXRoSXRlcmF0b3IKK3B1YmxpYyBjbGFzcyBBdHRyaWJ1dGVJdGVyYXRvciBleHRlbmRzIENoaWxkVGVzdEl0ZXJhdG9yCiB7CiAKICAgLyoqCkBAIC05MCwyMDUgKzkzLDE4IEBACiAgIHB1YmxpYyBBdHRyaWJ1dGVJdGVyYXRvcihDb21waWxlciBjb21waWxlciwgaW50IG9wUG9zLCBpbnQgYW5hbHlzaXMpCiAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewotCi0gICAgc3VwZXIoY29tcGlsZXIsIG9wUG9zLCBhbmFseXNpcywgZmFsc2UpOwotCi0gICAgaW50IGZpcnN0U3RlcFBvcyA9IGNvbXBpbGVyLmdldEZpcnN0Q2hpbGRQb3Mob3BQb3MpOwotICAgIGludCB3aGF0VG9TaG93ID0gY29tcGlsZXIuZ2V0V2hhdFRvU2hvdyhmaXJzdFN0ZXBQb3MpOwotCi0gICAgaWYgKCgwID09ICh3aGF0VG9TaG93Ci0gICAgICAgICAgICAgICAmIChOb2RlRmlsdGVyLlNIT1dfQVRUUklCVVRFIHwgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQKLSAgICAgICAgICAgICAgICAgIHwgTm9kZUZpbHRlci5TSE9XX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04pKSkgfHwgKHdoYXRUb1Nob3cgPT0gTm9kZUZpbHRlci5TSE9XX0FMTCkpCi0gICAgICBpbml0Tm9kZVRlc3Qod2hhdFRvU2hvdyk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGluaXROb2RlVGVzdCh3aGF0VG9TaG93LCBjb21waWxlci5nZXRTdGVwTlMoZmlyc3RTdGVwUG9zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyLmdldFN0ZXBMb2NhbE5hbWUoZmlyc3RTdGVwUG9zKSk7Ci0gICAgfQotICAgIGluaXRQcmVkaWNhdGVJbmZvKGNvbXBpbGVyLCBmaXJzdFN0ZXBQb3MpOworICAgIHN1cGVyKGNvbXBpbGVyLCBvcFBvcywgYW5hbHlzaXMpOwogICB9CiAgIAogICAvKioKLSAgICogR2V0IGEgY2xvbmVkIExvY1BhdGhJdGVyYXRvciB0aGF0IGhvbGRzIHRoZSBzYW1lIAotICAgKiBwb3NpdGlvbiBhcyB0aGlzIGl0ZXJhdG9yLgotICAgKgotICAgKiBAcmV0dXJuIEEgY2xvbmUgb2YgdGhpcyBpdGVyYXRvciB0aGF0IGhvbGRzIHRoZSBzYW1lIG5vZGUgcG9zaXRpb24uCi0gICAqCi0gICAqIEB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24KKyAgICogR2V0IHRoZSBuZXh0IG5vZGUgdmlhIGdldEZpcnN0QXR0cmlidXRlICYmIGdldE5leHRBdHRyaWJ1dGUuCiAgICAqLwotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCisgIHByb3RlY3RlZCBpbnQgZ2V0TmV4dE5vZGUoKQogICB7Ci0gICAgTG9jUGF0aEl0ZXJhdG9yIGNsb25lID0gKExvY1BhdGhJdGVyYXRvcikgc3VwZXIuY2xvbmUoKTsKLSAgICByZXR1cm4gY2xvbmU7CisgICAgbV9sYXN0RmV0Y2hlZCA9IChEVE0uTlVMTCA9PSBtX2xhc3RGZXRjaGVkKQorICAgICAgICAgICAgICAgICAgICAgPyBtX2NkdG0uZ2V0Rmlyc3RBdHRyaWJ1dGUobV9jb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgOiBtX2NkdG0uZ2V0TmV4dEF0dHJpYnV0ZShtX2xhc3RGZXRjaGVkKTsKKyAgICByZXR1cm4gbV9sYXN0RmV0Y2hlZDsKICAgfQogCi0gIC8qKgotICAgKiAgR2V0IGEgY2xvbmVkIEl0ZXJhdG9yIHRoYXQgaXMgcmVzZXQgdG8gdGhlIGJlZ2lubmluZwotICAgKiAgb2YgdGhlIHF1ZXJ5LgotICAgKiAKLSAgICogIEByZXR1cm4gQSBjbG9uZWQgTm9kZUl0ZXJhdG9yIHNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIHF1ZXJ5LgotICAgKiAKLSAgICogIEB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBOb2RlSXRlcmF0b3IgY2xvbmVXaXRoUmVzZXQoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24KLSAgewotCi0gICAgQXR0cmlidXRlSXRlcmF0b3IgY2xvbmUgPSAoQXR0cmlidXRlSXRlcmF0b3IpIHN1cGVyLmNsb25lV2l0aFJlc2V0KCk7Ci0KLSAgICBjbG9uZS5tX2F0dHJMaXN0UG9zID0gMDsKLSAgICAKLSAgICBjbG9uZS5yZXNldFByb3hpbWl0eVBvc2l0aW9ucygpOwotCi0gICAgcmV0dXJuIGNsb25lOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemUgdGhlIGF0dHJpYnV0ZSBsaXN0LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRBdHRyTGlzdCgpCi0gIHsKLQotICAgIGlmIChtX2NvbnRleHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7Ci0gICAgICBtX2F0dHJMaXN0UG9zID0gMDsKLSAgICAgIG1fYXR0cmlidXRlTGlzdCA9IG1fY29udGV4dC5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgIGlmIChudWxsICE9IG1fYXR0cmlidXRlTGlzdCkKLSAgICAgIHsKLSAgICAgICAgbV9uQXR0cnMgPSBtX2F0dHJpYnV0ZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIG1fbkF0dHJzID0gMDsKLQotICAgICAgaWYgKDAgPT0gbV9uQXR0cnMpCi0gICAgICB7Ci0gICAgICAgIG1fZm91bmRMYXN0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogIFJldHVybnMgdGhlIG5leHQgbm9kZSBpbiB0aGUgc2V0IGFuZCBhZHZhbmNlcyB0aGUgcG9zaXRpb24gb2YgdGhlCi0gICAqIGl0ZXJhdG9yIGluIHRoZSBzZXQuIEFmdGVyIGEgTm9kZUl0ZXJhdG9yIGlzIGNyZWF0ZWQsIHRoZSBmaXJzdCBjYWxsCi0gICAqIHRvIG5leHROb2RlKCkgcmV0dXJucyB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgc2V0LgotICAgKgotICAgKiBAcmV0dXJuICBUaGUgbmV4dCA8Y29kZT5Ob2RlPC9jb2RlPiBpbiB0aGUgc2V0IGJlaW5nIGl0ZXJhdGVkIG92ZXIsIG9yCi0gICAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbiB0aGF0IHNldC4KLSAgICoKLSAgICogQHRocm93cyBET01FeGNlcHRpb24KLSAgICogICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlCi0gICAqICAgPGNvZGU+ZGV0YWNoPC9jb2RlPiBtZXRob2Qgd2FzIGludm9rZWQuCi0gICAqLwotICBwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpIHRocm93cyBET01FeGNlcHRpb24KLSAgewotICAgIC8vIElmIHRoZSBjYWNoZSBpcyBvbiwgYW5kIHRoZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gZm91bmQsIHRoZW4gCi0gICAgLy8ganVzdCByZXR1cm4gZnJvbSB0aGUgbGlzdC4KLSAgICBpZiAoKG51bGwgIT0gbV9jYWNoZWROb2RlcykKLSAgICAgICAgICAgICYmIChtX2NhY2hlZE5vZGVzLmdldEN1cnJlbnRQb3MoKSA8IG1fY2FjaGVkTm9kZXMuc2l6ZSgpKSkKLSAgICB7Ci0gICAgICBOb2RlIG5leHQgPSBtX2NhY2hlZE5vZGVzLm5leHROb2RlKCk7Ci0KLSAgICAgIHRoaXMuc2V0Q3VycmVudFBvcyhtX2NhY2hlZE5vZGVzLmdldEN1cnJlbnRQb3MoKSk7Ci0KLSAgICAgIHJldHVybiBuZXh0OwotICAgIH0KLQotICAgIGlmIChtX2ZvdW5kTGFzdCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgaWYgKG51bGwgPT0gbV9hdHRyaWJ1dGVMaXN0KQotICAgIHsKLSAgICAgIGluaXRBdHRyTGlzdCgpOwotICAgICAgcmVzZXRQcm94aW1pdHlQb3NpdGlvbnMoKTsKLSAgICB9Ci0KLSAgICBvcmcuYXBhY2hlLnhwYXRoLlZhcmlhYmxlU3RhY2sgdmFyczsKLSAgICBpbnQgc2F2ZWRTdGFydDsKLSAgICBpZiAoLTEgIT0gbV92YXJTdGFja1BvcykKLSAgICB7Ci0gICAgICB2YXJzID0gbV9leGVjQ29udGV4dC5nZXRWYXJTdGFjaygpOwotCi0gICAgICAvLyBUaGVzZSB0aHJlZSBzdGF0ZW1lbnRzIG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUgb3BlcmF0aW9uLgotICAgICAgc2F2ZWRTdGFydCA9IHZhcnMuZ2V0U2VhcmNoU3RhcnQoKTsKLQotICAgICAgdmFycy5zZXRTZWFyY2hTdGFydChtX3ZhclN0YWNrUG9zKTsKLSAgICAgIHZhcnMucHVzaENvbnRleHRQb3NpdGlvbihtX3ZhclN0YWNrQ29udGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBZdWNrLiAgSnVzdCB0byBzaHV0IHVwIHRoZSBjb21waWxlciEKLSAgICAgIHZhcnMgPSBudWxsOwotICAgICAgc2F2ZWRTdGFydCA9IDA7Ci0gICAgfQotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIE5vZGUgbmV4dDsKLSAgCi0gICAgICBkbwotICAgICAgewotICAgICAgICBtX2xhc3RGZXRjaGVkID0gbmV4dCA9Ci0gICAgICAgICAgKG51bGwgPT0gbV9hdHRyaWJ1dGVMaXN0IHx8IG1fYXR0ckxpc3RQb3MgPj0gbV9uQXR0cnMpCi0gICAgICAgICAgPyBudWxsIDogbV9hdHRyaWJ1dGVMaXN0Lml0ZW0obV9hdHRyTGlzdFBvcysrKTsKLSAgCi0gICAgICAgIGlmIChudWxsICE9IG5leHQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZihOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQgPT0gYWNjZXB0Tm9kZShuZXh0KSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHdoaWxlIChuZXh0ICE9IG51bGwpOwotICAKLSAgICAgIGlmIChudWxsICE9IG5leHQpCi0gICAgICB7Ci0gICAgICAgIGlmIChudWxsICE9IG1fY2FjaGVkTm9kZXMpCi0gICAgICAgICAgbV9jYWNoZWROb2Rlcy5hZGRFbGVtZW50KG1fbGFzdEZldGNoZWQpOwotICAKLSAgICAgICAgbV9uZXh0Kys7Ci0gIAotICAgICAgICByZXR1cm4gbmV4dDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbV9mb3VuZExhc3QgPSB0cnVlOwotICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBpZiAoLTEgIT0gbV92YXJTdGFja1BvcykKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlc2UgdHdvIHN0YXRlbWVudHMgbmVlZCB0byBiZSBjb21iaW5lZCBpbnRvIG9uZSBvcGVyYXRpb24uCi0gICAgICAgIHZhcnMuc2V0U2VhcmNoU3RhcnQoc2F2ZWRTdGFydCk7Ci0gICAgICAgIHZhcnMucG9wQ29udGV4dFBvc2l0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub2RlIHRoYXQgY2FuIGJlIGl0dGVyYXRlZCB0by4KLSAgICoKLSAgICogQHBhcmFtIHhjdHh0IFhQYXRoIHJ1bnRpbWUgY29udGV4dC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9kZSB0aGF0IGNhbiBiZSBpdHRlcmF0ZWQgdG8uCi0gICAqLwotICBwdWJsaWMgaW50IGdldExhc3RQb3MoWFBhdGhDb250ZXh0IHhjdHh0KQotICB7Ci0gICAgcmV0dXJuIG1fbkF0dHJzOwotICB9Ci0KLQotICAvKiogVGhlIGF0dHJpYnV0ZSBsaXN0IGZvciB0aGUgZ2l2ZW4gY29udGV4dC4gKi8KLSAgdHJhbnNpZW50IHByaXZhdGUgTmFtZWROb2RlTWFwIG1fYXR0cmlidXRlTGlzdDsKLQotICAvKiogVGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgYXR0cmlidXRlIGxpc3QuICovCi0gIHRyYW5zaWVudCBwcml2YXRlIGludCBtX2F0dHJMaXN0UG9zID0gMDsKLQotICAvKiogVGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIHdpdGhpbiB0aGUgbGlzdC4gKi8KLSAgdHJhbnNpZW50IHByaXZhdGUgaW50IG1fbkF0dHJzID0gMDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQXR0cmlidXRlV2Fsa2VyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0F0dHJpYnV0ZVdhbGtlci5qYXZhCmluZGV4IDU0ZTViMGIuLmE3Y2JiNGQgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQXR0cmlidXRlV2Fsa2VyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9BdHRyaWJ1dGVXYWxrZXIuamF2YQpAQCAtNjAsOCArNjAsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogLyoqCiAgKiBXYWxrZXIgZm9yIHRoZSAnYXR0cmlidXRlJyBheGVzLgpAQCAtODUsNDIgKzg2LDQwIEBACiAgICAqCiAgICAqIEBwYXJhbSByb290IFRoZSBjb250ZXh0IG5vZGUgb2YgdGhpcyBzdGVwLgogICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdChOb2RlIHJvb3QpCisgIHB1YmxpYyB2b2lkIHNldFJvb3QoaW50IHJvb3QpCiAgIHsKIAotICAgIG1fYXR0ckxpc3RQb3MgPSAtMTsKLSAgICBtX2F0dHJpYnV0ZUxpc3QgPSBudWxsOwotICAgIG1fbkF0dHJzID0gLTI7Ci0gICAgbV9uZXh0TGV2ZWxBbW91bnQgPSAxOworICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hpbGRXYWxrZXIuc2V0Um9vdCIpOworICAgIG1fbmV4dExldmVsQW1vdW50ID0gKGdldERUTShyb290KS5nZXRGaXJzdEF0dHJpYnV0ZShyb290KSAhPSBEVE0uTlVMTCkgPyAxIDogMDsKIAorICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQmFjayBmcm9tIGNhbGxpbmcgaGFzQ2hpbGROb2RlcyIpOwogICAgIHN1cGVyLnNldFJvb3Qocm9vdCk7CisKKyAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4aXRpbmcgQ2hpbGRXYWxrZXIuc2V0Um9vdCIpOwogICB9CiAKICAgLyoqCi0gICAqIE1vdmVzIHRoZSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiB0byB0aGUgZmlyc3QgdmlzaWJsZSBjaGlsZCBvZiB0aGUKKyAgICogIE1vdmVzIHRoZSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiB0byB0aGUgZmlyc3QgdmlzaWJsZSBjaGlsZCBvZiB0aGUKICAgICogY3VycmVudCBub2RlLCBhbmQgcmV0dXJucyB0aGUgbmV3IG5vZGUuIElmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vCiAgICAqIHZpc2libGUgY2hpbGRyZW4sIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gLCBhbmQgcmV0YWlucyB0aGUgY3VycmVudAogICAgKiBub2RlLgogICAgKiBAcmV0dXJuICBUaGUgbmV3IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vCiAgICAqICAgdmlzaWJsZSBjaGlsZHJlbiBpbiB0aGUgVHJlZVdhbGtlcidzIGxvZ2ljYWwgdmlldy4KICAgICovCi0gIHB1YmxpYyBOb2RlIGZpcnN0Q2hpbGQoKQorICBwdWJsaWMgaW50IGZpcnN0Q2hpbGQoKQogICB7CiAKLSAgICBpZiAobV9jdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIG1fYXR0ckxpc3RQb3MgPSAtMTsKLSAgICAgIG1fYXR0cmlidXRlTGlzdCA9IG1fY3VycmVudE5vZGUuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICBpZiAobnVsbCAhPSBtX2F0dHJpYnV0ZUxpc3QpCi0gICAgICAgIG1fbkF0dHJzID0gbV9hdHRyaWJ1dGVMaXN0LmdldExlbmd0aCgpOwotICAgICAgZWxzZQotICAgICAgICBtX25BdHRycyA9IC0yOwotICAgIH0KLQorICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hpbGRXYWxrZXIuZmlyc3RDaGlsZCIpOwogICAgIG1fbmV4dExldmVsQW1vdW50ID0gMDsKIAotICAgIHJldHVybiBuZXh0U2libGluZygpOworICAgIGlmIChtX3Jvb3QgPT0gbV9jdXJyZW50Tm9kZSkKKyAgICB7CisKKyAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hpbGRXYWxrZXIgLSBDYWxsaW5nIGdldEZpcnN0Q2hpbGQiKTsKKyAgICAgIHJldHVybiBzZXRDdXJyZW50SWZOb3ROdWxsKGdldERUTShtX3Jvb3QpLmdldEZpcnN0QXR0cmlidXRlKG1fY3VycmVudE5vZGUpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIERUTS5OVUxMOwogICB9CiAKICAgLyoqCkBAIC0xMzAsMzQgKzEyOSwxNSBAQAogICAgKiBAcmV0dXJuICBUaGUgbmV3IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vCiAgICAqICAgbmV4dCBzaWJsaW5nIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgbmV4dFNpYmxpbmcoKQorICBwdWJsaWMgaW50IG5leHRTaWJsaW5nKCkKICAgewogCi0gICAgLy8gQXR0cmlidXRlcyBkb24ndCByZWFsbHkgaGF2ZSBzaWJsaW5ncywgYnV0IHdlJ2xsIGZha2UgaXQuCi0gICAgaWYgKG51bGwgIT0gbV9hdHRyaWJ1dGVMaXN0KQotICAgIHsKLSAgICAgIG1fYXR0ckxpc3RQb3MrKzsKLQotICAgICAgaWYgKG1fYXR0ckxpc3RQb3MgPCBtX25BdHRycykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHNldEN1cnJlbnRJZk5vdE51bGwobV9hdHRyaWJ1dGVMaXN0Lml0ZW0obV9hdHRyTGlzdFBvcykpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBtX2F0dHJpYnV0ZUxpc3QgPSBudWxsOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOworICAgIGlmIChtX3Jvb3QgIT0gbV9jdXJyZW50Tm9kZSkKKyAgICAgIHJldHVybiBzZXRDdXJyZW50SWZOb3ROdWxsKGdldERUTShtX3Jvb3QpLmdldE5leHRBdHRyaWJ1dGUobV9jdXJyZW50Tm9kZSkpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBEVE0uTlVMTDsKICAgfQogCi0gIC8qKiBUaGUgYXR0cmlidXRlIGxpc3QgZm9yIHRoZSBnaXZlbiBjb250ZXh0LiAgICAqLwotICB0cmFuc2llbnQgTmFtZWROb2RlTWFwIG1fYXR0cmlidXRlTGlzdDsKLQotICAvKiogVGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgYXR0cmlidXRlIGxpc3QuICAqLwotICB0cmFuc2llbnQgaW50IG1fYXR0ckxpc3RQb3M7Ci0KLSAgLyoqIFRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyB3aXRoaW4gdGhlIGxpc3QuICAqLwotICB0cmFuc2llbnQgaW50IG1fbkF0dHJzOwotCiAgIC8qKgogICAgKiBUZWxsIHdoYXQncyB0aGUgbWF4aW11bSBsZXZlbCB0aGlzIGF4ZXMgY2FuIGRlc2NlbmQgdG8uCiAgICAqCkBAIC0xNjUsNiArMTQ1LDYgQEAKICAgICovCiAgIHByb3RlY3RlZCBpbnQgZ2V0TGV2ZWxNYXgoKQogICB7Ci0gICAgcmV0dXJuIG1fbHBpLmdldERPTUhlbHBlcigpLmdldExldmVsKG1fcm9vdCk7CisgICAgcmV0dXJuIGdldERUTShtX3Jvb3QpLmdldExldmVsKG1fcm9vdCk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQXR0cmlidXRlV2Fsa2VyT25lU3RlcC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9BdHRyaWJ1dGVXYWxrZXJPbmVTdGVwLmphdmEKaW5kZXggMGY4NTE0Zi4uMDgzOWUwMyAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9BdHRyaWJ1dGVXYWxrZXJPbmVTdGVwLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9BdHRyaWJ1dGVXYWxrZXJPbmVTdGVwLmphdmEKQEAgLTU2LDkgKzU2LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54cGF0aC5heGVzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLnBhdHRlcm5zLk5vZGVUZXN0RmlsdGVyOwogCkBAIC03MCwzNyArNzIsNiBAQAogcHVibGljIGNsYXNzIEF0dHJpYnV0ZVdhbGtlck9uZVN0ZXAgZXh0ZW5kcyBBeGVzV2Fsa2VyCiB7CiAKLSAgLyoqIFRoZSBhdHRyaWJ1dGUgbGlzdCBmcm9tIHRoZSBjb250ZXh0IG5vZGUuICAqLwotICB0cmFuc2llbnQgTmFtZWROb2RlTWFwIG1fYXR0cmlidXRlTGlzdDsKLQotICAvKiogVGhlIGN1cnJlbnQgaW5kZXggaW50byBtX2F0dHJpYnV0ZUxpc3QuICAtMSB0byBzdGFydC4gKi8KLSAgdHJhbnNpZW50IGludCBtX2F0dHJMaXN0UG9zOwotCi0gIC8qKiBUaGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgaW4gbV9hdHRyaWJ1dGVMaXN0LCBvciAtMiBpZiBubyBhdHRyaWJ1dGVzLiAqLwotICB0cmFuc2llbnQgaW50IG1fbkF0dHJzOwotCi0gIC8qKgotICAgKiAgVGhlIHJvb3Qgbm9kZSBvZiB0aGUgVHJlZVdhbGtlci4KLSAgICoKLSAgICogQHBhcmFtIHJvb3QgVGhlIGNvbnRleHQgbm9kZSBvZiB0aGUgbm9kZSBzdGVwLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdChOb2RlIHJvb3QpCi0gIHsKLQotICAgIHN1cGVyLnNldFJvb3Qocm9vdCk7Ci0KLSAgICBpZiAocm9vdC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIG1fYXR0ckxpc3RQb3MgPSAtMTsKLSAgICAgIG1fYXR0cmlidXRlTGlzdCA9IG1fY3VycmVudE5vZGUuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICBpZiAobnVsbCAhPSBtX2F0dHJpYnV0ZUxpc3QpCi0gICAgICAgIG1fbkF0dHJzID0gbV9hdHRyaWJ1dGVMaXN0LmdldExlbmd0aCgpOwotICAgICAgZWxzZQotICAgICAgICBtX25BdHRycyA9IC0yOwotICAgIH0KLSAgfQotCiAgIC8qKgogICAgKiBDb25zdHJ1Y3QgYW4gQXhlc1dhbGtlciB1c2luZyBhIExvY1BhdGhJdGVyYXRvci4KICAgICoKQEAgLTExMiw0NSArODMsNTIgQEAKICAgfQogCiAgIC8qKgorICAgKiBUZWxsIHdoYXQncyB0aGUgbWF4aW11bSBsZXZlbCB0aGlzIGF4ZXMgY2FuIGRlc2NlbmQgdG8uCisgICAqCisgICAqIEByZXR1cm4gQW4gZXN0aW1hdGlvbiBvZiB0aGUgbWF4aW11bSBsZXZlbCB0aGlzIGF4ZXMgY2FuIGRlc2NlbmQgdG8uCisgICAqLworICBwcm90ZWN0ZWQgaW50IGdldExldmVsTWF4KCkKKyAgeworICAgIHJldHVybiBnZXREVE0obV9yb290KS5nZXRMZXZlbChtX3Jvb3QpOworICB9CisKKyAgLyoqCiAgICAqIEdldCB0aGUgbmV4dCBub2RlIGluIGRvY3VtZW50IG9yZGVyIG9uIHRoZSBheGVzLgogICAgKgotICAgKiBAcmV0dXJuIFRoZSBuZXh0IG5vZGUgaW4gdGhlIGl0dGVyYXRpb24sIG9yIG51bGwuCisgICAqIEByZXR1cm4gVGhlIG5leHQgbm9kZSBpbiB0aGUgd2Fsaywgb3IgbnVsbC4KICAgICovCi0gIHB1YmxpYyBOb2RlIG5leHROb2RlKCkKKyAgcHVibGljIGludCBuZXh0Tm9kZSgpCiAgIHsKIAotICAgIGlmIChtX2lzRnJlc2gpCi0gICAgICBtX2lzRnJlc2ggPSBmYWxzZTsKKyAgICBpbnQgbmV4dDsKIAotICAgIE5vZGUgY3VycmVudCA9IHRoaXMuZ2V0Q3VycmVudE5vZGUoKTsKLQotICAgIGlmIChjdXJyZW50LmlzU3VwcG9ydGVkKEZFQVRVUkVfTk9ERVRFU1RGSUxURVIsICIxLjAiKSkKLSAgICAgICgoTm9kZVRlc3RGaWx0ZXIpIGN1cnJlbnQpLnNldE5vZGVUZXN0KHRoaXMpOwotCi0gICAgTm9kZSBuZXh0ID0gbnVsbDsKLQotICAgIHdoaWxlIChudWxsICE9IG1fYXR0cmlidXRlTGlzdCkKKyAgICBpZiAobV9yb290ID09IG1fY3VycmVudE5vZGUpCiAgICAgewotICAgICAgbV9hdHRyTGlzdFBvcysrOworICAgICAgbmV4dCA9IGdldERUTShtX2N1cnJlbnROb2RlKS5nZXRGaXJzdEF0dHJpYnV0ZShtX2N1cnJlbnROb2RlKTsKKyAgICAgIG1faXNGcmVzaCA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlCisgICAgICBuZXh0ID0gZ2V0RFRNKG1fY3VycmVudE5vZGUpLmdldE5leHRBdHRyaWJ1dGUobV9jdXJyZW50Tm9kZSk7CiAKLSAgICAgIGlmIChtX2F0dHJMaXN0UG9zIDwgbV9uQXR0cnMpCisgICAgaWYgKERUTS5OVUxMICE9IG5leHQpCisgICAgeworICAgICAgbV9jdXJyZW50Tm9kZSA9IG5leHQ7CisKKyAgICAgIHdoaWxlIChhY2NlcHROb2RlKG5leHQpICE9IERUTUl0ZXJhdG9yLkZJTFRFUl9BQ0NFUFQpCiAgICAgICB7Ci0gICAgICAgIG5leHQgPSBtX2F0dHJpYnV0ZUxpc3QuaXRlbShtX2F0dHJMaXN0UG9zKTsKKyAgICAgICAgbmV4dCA9IGdldERUTShuZXh0KS5nZXROZXh0QXR0cmlidXRlKG5leHQpOwogCi0gICAgICAgIGlmIChudWxsICE9IG5leHQpCisgICAgICAgIGlmIChEVE0uTlVMTCAhPSBuZXh0KQogICAgICAgICAgIG1fY3VycmVudE5vZGUgPSBuZXh0OworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0aGlzLm1faXNEb25lID0gdHJ1ZTsKIAotICAgICAgICBpZiAoYWNjZXB0Tm9kZShuZXh0KSA9PSBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQpCiAgICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG5leHQgPSBudWxsOwotICAgICAgICBtX2F0dHJpYnV0ZUxpc3QgPSBudWxsOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKG51bGwgPT0gbmV4dCkKKyAgICBlbHNlCiAgICAgICB0aGlzLm1faXNEb25lID0gdHJ1ZTsKIAogICAgIHJldHVybiBuZXh0OwpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9BeGVzV2Fsa2VyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0F4ZXNXYWxrZXIuamF2YQppbmRleCA1OWVlMTE5Li4yZGU3ZGEwIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0F4ZXNXYWxrZXIuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0F4ZXNXYWxrZXIuamF2YQpAQCAtNzMsMTkgKzczLDE4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aDsKIAotLy8gRE9NMiBpbXBvcnRzCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLlRyZWVXYWxrZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1GaWx0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmc7CiAKIC8qKgogICogU2VydmVzIGFzIGNvbW1vbiBpbnRlcmZhY2UgZm9yIGF4ZXMgV2Fsa2VycywgYW5kIHN0b3JlcyBjb21tb24KICAqIHN0YXRlIHZhcmlhYmxlcy4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEF4ZXNXYWxrZXIgZXh0ZW5kcyBQcmVkaWNhdGVkTm9kZVRlc3QKLSAgICAgICAgaW1wbGVtZW50cyBDbG9uZWFibGUsIFRyZWVXYWxrZXIsIE5vZGVGaWx0ZXIKKyAgICAgICAgaW1wbGVtZW50cyBDbG9uZWFibGUgLCBEVE1GaWx0ZXIKIHsKICAgCiAgIC8qKgpAQCAtMjcxLDE0ICsyNzAsMTUgQEAKICAgICogQHJldHVybiB0cnVlIGlmIG4gaXMgYSBwYXJlbnQgb2YgdGhlIHN0ZXAgY29udGV4dCwgb3IgdGhlIHN0ZXAgY29udGV4dCAKICAgICogICAgICAgICAgICAgIGl0c2VsZi4KICAgICovCi0gIGJvb2xlYW4gaXNBbmNlc3Rvck9mUm9vdENvbnRleHQoTm9kZSBuKQorICBib29sZWFuIGlzQW5jZXN0b3JPZlJvb3RDb250ZXh0KGludCBuKQogICB7CiAKLSAgICBOb2RlIHBhcmVudCA9IG1fcm9vdDsKLQotICAgIHdoaWxlIChudWxsICE9IChwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSkKKyAgICBpbnQgcGFyZW50ID0gbV9yb290OworICAgIAorICAgIERUTSBkdG0gPSBnZXREVE0ocGFyZW50KTsKKyAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKHBhcmVudCA9IGR0bS5nZXRQYXJlbnQocGFyZW50KSkpCiAgICAgewotICAgICAgaWYgKHBhcmVudC5lcXVhbHMobikpCisgICAgICBpZiAocGFyZW50ID09IG4pCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMjg4LDEyICsyODgsMTIgQEAKICAgLy89PT09PT09PT09PT09PT0gVHJlZVdhbGtlciBJbXBsZW1lbnRhdGlvbiA9PT09PT09PT09PT09PT0KIAogICAvKioKLSAgICogVGhlIHJvb3Qgbm9kZSBvZiB0aGUgVHJlZVdhbGtlciwgYXMgc3BlY2lmaWVkIGluIHNldFJvb3QoTm9kZSByb290KS4KKyAgICogVGhlIHJvb3Qgbm9kZSBvZiB0aGUgVHJlZVdhbGtlciwgYXMgc3BlY2lmaWVkIGluIHNldFJvb3QoaW50IHJvb3QpLgogICAgKiBOb3RlIHRoYXQgdGhpcyBtYXkgYWN0dWFsbHkgYmUgYmVsb3cgdGhlIGN1cnJlbnQgbm9kZS4KICAgICoKICAgICogQHJldHVybiBUaGUgY29udGV4dCBub2RlIG9mIHRoZSBzdGVwLgogICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0Um9vdCgpCisgIHB1YmxpYyBpbnQgZ2V0Um9vdCgpCiAgIHsKICAgICByZXR1cm4gbV9yb290OwogICB9CkBAIC0zMDQsMTYgKzMwNCwxNyBAQAogICAgKgogICAgKiBAcGFyYW0gcm9vdCBUaGUgY29udGV4dCBub2RlIG9mIHRoaXMgc3RlcC4KICAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJvb3QoTm9kZSByb290KQorICBwdWJsaWMgdm9pZCBzZXRSb290KGludCByb290KQogICB7Ci0KKyAgICAvLyAlT1BUJSBHZXQgdGhpcyBkaXJlY3RseSBmcm9tIHRoZSBscGkuCisgICAgbV9kdG0gPSBtX2xwaS5nZXRYUGF0aENvbnRleHQoKS5nZXREVE0ocm9vdCk7CiAgICAgbV9pc0ZyZXNoID0gdHJ1ZTsKICAgICBtX2lzRG9uZSA9IGZhbHNlOwogICAgIG1fcm9vdCA9IHJvb3Q7CiAgICAgbV9jdXJyZW50Tm9kZSA9IHJvb3Q7Ci0gICAgbV9wcmV2UmV0dXJuZWQgPSBudWxsOworICAgIG1fcHJldlJldHVybmVkID0gRFRNLk5VTEw7CiAKLSAgICBpZiAobnVsbCA9PSByb290KQorICAgIGlmIChEVE0uTlVMTCA9PSByb290KQogICAgIHsKICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAogICAgICAgICAiXG4gISEhISBFcnJvciEgU2V0dGluZyB0aGUgcm9vdCBvZiBhIHdhbGtlciB0byBudWxsISEhIik7CkBAIC0zMzUsMTEgKzMzNiw4IEBACiAgICAqCiAgICAqIEByZXR1cm4gVGhlIG5vZGUgYXQgd2hpY2ggdGhlIFRyZWVXYWxrZXIgaXMgY3VycmVudGx5IHBvc2l0aW9uZWQsIG9ubHkgbnVsbCAKICAgICogaWYgc2V0Um9vdCBoYXMgbm90IHlldCBiZWVuIGNhbGxlZC4KLSAgICogQHRocm93cyBET01FeGNlcHRpb24KLSAgICogICAgTk9UX1NVUFBPUlRFRF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPmN1cnJlbnROb2RlPC9jb2RlPgotICAgKiAgIGlzPGNvZGU+bnVsbDwvY29kZT4gLgogICAgKi8KLSAgcHVibGljIGZpbmFsIE5vZGUgZ2V0Q3VycmVudE5vZGUoKQorICBwdWJsaWMgZmluYWwgaW50IGdldEN1cnJlbnROb2RlKCkKICAgewogICAgIHJldHVybiBtX2N1cnJlbnROb2RlOwogICB9CkBAIC0zNDgsMTAgKzM0Niw4IEBACiAgICAqIFNldCB0aGUgY3VycmVudCBub2RlLgogICAgKgogICAgKiBAcGFyYW0gY3VycmVudE5vZGUgVGhlIGN1cnJlbnQgaXR0ZXJhdGlvbiBub2RlLCBzaG91bGQgbm90IGJlIG51bGwuCi0gICAqCi0gICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50Tm9kZShOb2RlIGN1cnJlbnROb2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnROb2RlKGludCBjdXJyZW50Tm9kZSkKICAgewogICAgIG1fY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZTsKICAgfQpAQCAtMzYxLDEzICszNTcsMTEgQEAKICAgICoKICAgICogQHBhcmFtIGN1cnJlbnROb2RlIFRoZSBjdXJyZW50IG5vZGUgb3IgbnVsbC4KICAgICogQHJldHVybiBUaGUgbm9kZSBwYXNzZWQgaW4uCi0gICAqCi0gICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCiAgICAqLwotICBwcm90ZWN0ZWQgTm9kZSBzZXRDdXJyZW50SWZOb3ROdWxsKE5vZGUgY3VycmVudE5vZGUpIHRocm93cyBET01FeGNlcHRpb24KKyAgcHJvdGVjdGVkIGludCBzZXRDdXJyZW50SWZOb3ROdWxsKGludCBjdXJyZW50Tm9kZSkKICAgewogCi0gICAgaWYgKG51bGwgIT0gY3VycmVudE5vZGUpCisgICAgaWYgKERUTS5OVUxMICE9IGN1cnJlbnROb2RlKQogICAgICAgbV9jdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlOwogCiAgICAgcmV0dXJuIGN1cnJlbnROb2RlOwpAQCAtMzc4LDcgKzM3Miw3IEBACiAgICAqCiAgICAqIEByZXR1cm4gVGhpcyBBeGVzV2Fsa2VyLgogICAgKi8KLSAgcHVibGljIE5vZGVGaWx0ZXIgZ2V0RmlsdGVyKCkKKyAgcHVibGljIERUTUZpbHRlciBnZXRGaWx0ZXIoKQogICB7CiAgICAgcmV0dXJuIHRoaXM7CiAgIH0KQEAgLTQxMCw5ICs0MDQsOSBAQAogICAgKiBAcmV0dXJuICBUaGUgbmV3IHBhcmVudCBub2RlLCBvciBudWxsIGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vIHBhcmVudAogICAgKiAgIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgcGFyZW50Tm9kZSgpCisgIHB1YmxpYyBpbnQgcGFyZW50Tm9kZSgpCiAgIHsKLSAgICByZXR1cm4gbnVsbDsKKyAgICByZXR1cm4gRFRNLk5VTEw7CiAgIH0KIAogICAvKioKQEAgLTQyMyw5ICs0MTcsOSBAQAogICAgKiBAcmV0dXJuICBUaGUgbmV3IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vCiAgICAqICAgdmlzaWJsZSBjaGlsZHJlbiBpbiB0aGUgVHJlZVdhbGtlcidzIGxvZ2ljYWwgdmlldy4KICAgICovCi0gIHB1YmxpYyBOb2RlIGZpcnN0Q2hpbGQoKQorICBwdWJsaWMgaW50IGZpcnN0Q2hpbGQoKQogICB7Ci0gICAgcmV0dXJuIG51bGw7CisgICAgcmV0dXJuIERUTS5OVUxMOwogICB9CiAKICAgLyoqCkBAIC00MzUsOSArNDI5LDkgQEAKICAgICogQHJldHVybiAgVGhlIG5ldyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwogICAgKiAgIG5leHQgc2libGluZyBpbiB0aGUgVHJlZVdhbGtlcidzIGxvZ2ljYWwgdmlldy4KICAgICovCi0gIHB1YmxpYyBOb2RlIG5leHRTaWJsaW5nKCkKKyAgcHVibGljIGludCBuZXh0U2libGluZygpCiAgIHsKLSAgICByZXR1cm4gbnVsbDsKKyAgICByZXR1cm4gRFRNLk5VTEw7CiAgIH0KIAogICAvKioKQEAgLTQ0OCw3ICs0NDIsNyBAQAogICAgKiBAcmV0dXJuICBUaGUgbmV3IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vCiAgICAqICAgY2hpbGRyZW4gIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgbGFzdENoaWxkKCkKKyAgcHVibGljIGludCBsYXN0Q2hpbGQoKQogICB7CiAKICAgICAvLyBXZSBtYXkgbmVlZCB0byBzdXBwb3J0IHRoaXMuLi4KQEAgLTQ2Myw3ICs0NTcsNyBAQAogICAgKiBAcmV0dXJuICBUaGUgbmV3IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vCiAgICAqICAgcHJldmlvdXMgc2libGluZyBpbiB0aGUgVHJlZVdhbGtlcidzIGxvZ2ljYWwgdmlldy4KICAgICovCi0gIHB1YmxpYyBOb2RlIHByZXZpb3VzU2libGluZygpCisgIHB1YmxpYyBpbnQgcHJldmlvdXNTaWJsaW5nKCkKICAgewogICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJwcmV2aW91c1NpYmxpbmcgbm90IHN1cHBvcnRlZCEiKTsKICAgfQpAQCAtNDc3LDcgKzQ3MSw3IEBACiAgICAqIEByZXR1cm4gIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KICAgICogICBwcmV2aW91cyBub2RlIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgcHJldmlvdXNOb2RlKCkKKyAgcHVibGljIGludCBwcmV2aW91c05vZGUoKQogICB7CiAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInByZXZpb3VzTm9kZSBub3Qgc3VwcG9ydGVkISIpOwogICB9CkBAIC01NDksMjQgKzU0MywxNSBAQAogICAgIFN0cmluZyByb290TmFtZTsKICAgICBTdHJpbmcgY3VycmVudE5vZGVOYW1lOwogCi0gICAgdHJ5Ci0gICAgewotICAgICAgcm9vdE5hbWUgPSAobnVsbCA9PSBtX3Jvb3QpCi0gICAgICAgICAgICAgICAgID8gIm51bGwiCi0gICAgICAgICAgICAgICAgIDogbV9yb290LmdldE5vZGVOYW1lKCkgKyAieyIKLSAgICAgICAgICAgICAgICAgICArICgob3JnLmFwYWNoZS54YWxhbi5zdHJlZS5DaGlsZCkgbV9yb290KS5nZXRVaWQoKSArICJ9IjsKLSAgICAgIGN1cnJlbnROb2RlTmFtZSA9Ci0gICAgICAgIChudWxsID09IG1fcm9vdCkKLSAgICAgICAgPyAibnVsbCIKLSAgICAgICAgOiBtX2N1cnJlbnROb2RlLmdldE5vZGVOYW1lKCkgKyAieyIKLSAgICAgICAgICArICgob3JnLmFwYWNoZS54YWxhbi5zdHJlZS5DaGlsZCkgbV9jdXJyZW50Tm9kZSkuZ2V0VWlkKCkgKyAifSI7Ci0gICAgfQotICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKQotICAgIHsKLSAgICAgIHJvb3ROYW1lID0gKG51bGwgPT0gbV9yb290KSA/ICJudWxsIiA6IG1fcm9vdC5nZXROb2RlTmFtZSgpOwotICAgICAgY3VycmVudE5vZGVOYW1lID0gKG51bGwgPT0gbV9yb290KQotICAgICAgICAgICAgICAgICAgICAgICAgPyAibnVsbCIgOiBtX2N1cnJlbnROb2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgfQorICAgIHJvb3ROYW1lID0gKERUTS5OVUxMID09IG1fcm9vdCkKKyAgICAgICAgICAgICAgID8gIm51bGwiCisgICAgICAgICAgICAgICA6IGdldERUTShtX3Jvb3QpLmdldE5vZGVOYW1lKG1fcm9vdCkgKyAieyIKKyAgICAgICAgICAgICAgICAgKyAobV9yb290KzEpICsgIn0iOworICAgIGN1cnJlbnROb2RlTmFtZSA9CisgICAgICAoRFRNLk5VTEwgPT0gbV9jdXJyZW50Tm9kZSkKKyAgICAgID8gIm51bGwiCisgICAgICA6IGdldERUTShtX2N1cnJlbnROb2RlKS5nZXROb2RlTmFtZShtX2N1cnJlbnROb2RlKSArICJ7IgorICAgICAgICArIChtX2N1cnJlbnROb2RlKzEpICsgIn0iOwogCiAgICAgcmV0dXJuIGNsTmFtZSArICJbIiArIHJvb3ROYW1lICsgIl1bIiArIGN1cnJlbnROb2RlTmFtZSArICJdIjsKICAgfQpAQCAtNTc5LDEwICs1NjQsMTAgQEAKICAgICoKICAgICogQHJldHVybiBUaGUgYXJndW1lbnQuCiAgICAqLwotICBwcml2YXRlIE5vZGUgcmV0dXJuTmV4dE5vZGUoTm9kZSBuKQorICBwcml2YXRlIGludCByZXR1cm5OZXh0Tm9kZShpbnQgbikKICAgewogCi0gICAgaWYgKERFQlVHX0xPQ0FURUQgJiYgKG51bGwgIT0gbikpCisgICAgaWYgKERFQlVHX0xPQ0FURUQgJiYgKERUTS5OVUxMICE9IG4pKQogICAgIHsKICAgICAgIHByaW50RGVidWcoIlJFVFVSTiAtLS0+IiArIG5vZGVUb1N0cmluZyhuKSk7CiAgICAgfQpAQCAtNjA2LDEzICs1OTEsMTEgQEAKICAgICB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJcbiIpOwogCi0gICAgICBpZiAobnVsbCAhPSBtX2N1cnJlbnROb2RlKQorICAgICAgaWYgKERUTS5OVUxMICE9IG1fY3VycmVudE5vZGUpCiAgICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgb3JnLmFwYWNoZS54YWxhbi5zdHJlZS5DaGlsZCBuID0KLSAgICAgICAgICAgICgob3JnLmFwYWNoZS54YWxhbi5zdHJlZS5DaGlsZCkgbV9jdXJyZW50Tm9kZSk7Ci0gICAgICAgICAgaW50IGRlcHRoID0gbi5nZXRMZXZlbCgpOworICAgICAgICAgIGludCBkZXB0aCA9IGdldERUTShtX2N1cnJlbnROb2RlKS5nZXRMZXZlbChtX2N1cnJlbnROb2RlKTsKIAogICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKICAgICAgICAgICB7CkBAIC02MzIsNyArNjE1LDcgQEAKICAgICogQHBhcmFtIG5vZGUgVGhlIHRvcCBvZiB0aGUgc3VidHJlZS4KICAgICogQHBhcmFtIGluZGVudCBUaGUgYW1vdW50IHRvIGJlZ2luIHRoZSBpbmRlbnRpbmcgYXQuCiAgICAqLwotICBwcml2YXRlIHZvaWQgZHVtcEFsbChOb2RlIG5vZGUsIGludCBpbmRlbnQpCisgIHByaXZhdGUgdm9pZCBkdW1wQWxsKGludCBub2RlLCBpbnQgaW5kZW50KQogICB7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKQpAQCAtNjQyLDkgKzYyNSw5IEBACiAKICAgICBTeXN0ZW0ub3V0LnByaW50KG5vZGVUb1N0cmluZyhub2RlKSk7CiAKLSAgICBpZiAoTm9kZS5URVhUX05PREUgPT0gbm9kZS5nZXROb2RlVHlwZSgpKQorICAgIGlmIChEVE0uVEVYVF9OT0RFID09IGdldERUTShub2RlKS5nZXROb2RlVHlwZShub2RlKSkKICAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBub2RlLmdldE5vZGVWYWx1ZSgpOworICAgICAgWE1MU3RyaW5nIHZhbHVlID0gZ2V0RFRNKG5vZGUpLmdldFN0cmluZ1ZhbHVlKG5vZGUpOwogCiAgICAgICBpZiAobnVsbCAhPSB2YWx1ZSkKICAgICAgIHsKQEAgLTY1NCw0MCArNjM3LDMyIEBACiAKICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwogCi0gICAgTmFtZWROb2RlTWFwIG1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgaWYgKG51bGwgIT0gbWFwKQorICAgIERUTSBkdG0gPSBnZXREVE0obm9kZSk7CisgICAgZm9yIChpbnQgYXR0ciA9IGR0bS5nZXRGaXJzdEF0dHJpYnV0ZShub2RlKTsgYXR0ciAhPSBEVE0uTlVMTDsgCisgICAgICAgICBhdHRyID0gZHRtLmdldE5leHRBdHRyaWJ1dGUoYXR0cikpCiAgICAgewotICAgICAgaW50IG4gPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBpbmRlbnQ7IGsrKykKICAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBpbmRlbnQ7IGsrKykKLSAgICAgICAgewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoImF0dHIgLS0+Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQobm9kZVRvU3RyaW5nKG1hcC5pdGVtKGkpKSk7Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbWFwLml0ZW0oaSkuZ2V0Tm9kZVZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIrPSAtLT4iICsgdmFsdWUudHJpbSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiKTsKICAgICAgIH0KKworICAgICAgU3lzdGVtLm91dC5wcmludCgiYXR0ciAtLT4iKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnQobm9kZVRvU3RyaW5nKGF0dHIpKTsKKworICAgICAgWE1MU3RyaW5nIHZhbHVlID0gZHRtLmdldFN0cmluZ1ZhbHVlKGF0dHIpOworCisgICAgICBpZiAobnVsbCAhPSB2YWx1ZSkKKyAgICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiKz0gLS0+IiArIHZhbHVlLnRyaW0oKSk7CisgICAgICB9CisKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CiAgICAgfQogCi0gICAgTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCi0gICAgd2hpbGUgKG51bGwgIT0gY2hpbGQpCisgICAgZm9yIChpbnQgY2hpbGQgPSBkdG0uZ2V0Rmlyc3RDaGlsZChub2RlKTsgRFRNLk5VTEwgIT0gY2hpbGQ7IAorICAgICAgICAgY2hpbGQgPSBkdG0uZ2V0TmV4dFNpYmxpbmcoY2hpbGQpKQogICAgIHsKICAgICAgIGR1bXBBbGwoY2hpbGQsIGluZGVudCArIDEpOwotCi0gICAgICBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7CiAgICAgfQogICB9CiAKQEAgLTcxNSwxMyArNjkwLDExIEBACiAgICAgewogICAgICAgU3lzdGVtLm91dC5wcmludCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKIAotICAgICAgaWYgKG51bGwgIT0gbV9jdXJyZW50Tm9kZSkKKyAgICAgIGlmIChEVE0uTlVMTCAhPSBtX2N1cnJlbnROb2RlKQogICAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgIG9yZy5hcGFjaGUueGFsYW4uc3RyZWUuQ2hpbGQgbiA9Ci0gICAgICAgICAgICAoKG9yZy5hcGFjaGUueGFsYW4uc3RyZWUuQ2hpbGQpIG1fY3VycmVudE5vZGUpOwotICAgICAgICAgIGludCBkZXB0aCA9IG4uZ2V0TGV2ZWwoKTsKKyAgICAgICAgICBpbnQgZGVwdGggPSBnZXREVE0obV9jdXJyZW50Tm9kZSkuZ2V0TGV2ZWwobV9jdXJyZW50Tm9kZSk7CiAKICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcHRoOyBpKyspCiAgICAgICAgICAgewpAQCAtNzkzLDE1ICs3NjYsMTQgQEAKICAgICovCiAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrT0tUb1RyYXZlcnNlKEF4ZXNXYWxrZXIgcHJldlN0ZXBXYWxrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4ZXNXYWxrZXIgdGVzdFdhbGtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBjdXJyZW50VGVzdE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdXJyZW50VGVzdE5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0TGV2ZWxBbW91bnQpCiAgIHsKIAotICAgIERPTUhlbHBlciBkaCA9IG1fbHBpLmdldERPTUhlbHBlcigpOwotICAgIGludCBsZXZlbCA9IGRoLmdldExldmVsKGN1cnJlbnRUZXN0Tm9kZSk7CisgICAgaW50IGxldmVsID0gZ2V0RFRNKGN1cnJlbnRUZXN0Tm9kZSkuZ2V0TGV2ZWwoY3VycmVudFRlc3ROb2RlKTsKIAogICAgIC8vIElzIHRoaXMgYWx3YXlzIHRoZSBjb250ZXh0IG5vZGUgb2YgdGhlIHRlc3Qgd2Fsa2VyPwotICAgIE5vZGUgcHJldk5vZGUgPSBwcmV2U3RlcFdhbGtlci5tX2N1cnJlbnROb2RlOworICAgIGludCBwcmV2Tm9kZSA9IHByZXZTdGVwV2Fsa2VyLm1fY3VycmVudE5vZGU7CiAKICAgICAvLyBDYW4gdGhlIHByZXZpb3VzIHdhbGtlciBnbyBwYXN0IHRoZSBvbmUgYmVpbmcgdGVzdGVkPwogICAgIGlmIChERUJVR19XQUlUSU5HKQpAQCAtODE1LDE0ICs3ODcsMTQgQEAKIAogICAgICAgLy8gSXMgKHByZXZTdGVwV2Fsa2VyLm1fY3VycmVudE5vZGUgPiB0aGUgY3VycmVudFRlc3ROb2RlKT8KICAgICAgIC8vIChTb3JyeSBhYm91dCB0aGUgcmV2ZXJzZSBsb2dpYykuCi0gICAgICBib29sZWFuIGlzTm9kZUFmdGVyID0gIWRoLmlzTm9kZUFmdGVyKHByZXZOb2RlLCBjdXJyZW50VGVzdE5vZGUpOworICAgICAgYm9vbGVhbiBpc05vZGVBZnRlciA9ICFnZXREVE0ocHJldk5vZGUpLmlzTm9kZUFmdGVyKHByZXZOb2RlLCBjdXJyZW50VGVzdE5vZGUpOwogCiAgICAgICBpZiAoREVCVUdfV0FJVElORykKICAgICAgICAgcHJpbnREZWJ1ZygiW2lzTm9kZUFmdGVyOiIgKyBpc05vZGVBZnRlciArICI/XSIpOwogCiAgICAgICBpZiAoaXNOb2RlQWZ0ZXIpCiAgICAgICB7Ci0gICAgICAgIGludCBwcmV2U3RlcExldmVsID0gZGguZ2V0TGV2ZWwocHJldk5vZGUpOworICAgICAgICBpbnQgcHJldlN0ZXBMZXZlbCA9IGdldERUTShwcmV2Tm9kZSkuZ2V0TGV2ZWwocHJldk5vZGUpOwogCiAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBzdGVwIHdhbGtlciBpcyBiZWxvdyB1cyBpbiB0aGUgdHJlZSwgCiAgICAgICAgIC8vIHRoZW4gd2UgaGF2ZSB0byB3YWl0IHVudGlsIGl0IHBvcHMgYmFjayB1cCB0byBvdXIgbGV2ZWwsIApAQCAtODY1LDcgKzgzNyw3IEBACiAgIHsKIAogICAgIC8vIHByaW50RGVidWcoImNoZWNrV2FpdGluZzogIit3YWxrZXIudG9TdHJpbmcoKSsiLCAiK25vZGVUb1N0cmluZyh3YWxrZXIubV9jdXJyZW50Tm9kZSkpOwotICAgIGlmICgobnVsbCAhPSB3YWxrZXIpICYmIChudWxsID09IHdhbGtlci5tX2N1cnJlbnROb2RlKSkKKyAgICBpZiAoKG51bGwgIT0gd2Fsa2VyKSAmJiAoRFRNLk5VTEwgPT0gd2Fsa2VyLm1fY3VycmVudE5vZGUpKQogICAgICAgcmV0dXJuIHdhbGtlcjsKIAogICAgIGludCBuV2FpdGluZyA9IG1fbHBpLmdldFdhaXRpbmdDb3VudCgpOwpAQCAtOTM0LDcgKzkwNiw3IEBACiAgICAgICAgIGZpcnN0ID0gd3M7CiAgICAgICBlbHNlCiAgICAgICB7Ci0gICAgICAgIGlmICghZGguaXNOb2RlQWZ0ZXIod3MubV9jdXJyZW50Tm9kZSwgZmlyc3QubV9jdXJyZW50Tm9kZSkpCisgICAgICAgIGlmICghZ2V0RFRNKHdzLm1fY3VycmVudE5vZGUpLmlzTm9kZUFmdGVyKHdzLm1fY3VycmVudE5vZGUsIGZpcnN0Lm1fY3VycmVudE5vZGUpKQogICAgICAgICAgIGZpcnN0ID0gd3M7CiAgICAgICB9CiAgICAgfQpAQCAtMTA0MCwzNSArMTAxMiwzNyBAQAogICAgKgogICAgKiBAcmV0dXJuIHRoZSBuZXh0IG5vZGUgaW4gZG9jdW1lbnQgb3JkZXIgb24gdGhlIGF4ZXMsIG9yIG51bGwuCiAgICAqLwotICBwcm90ZWN0ZWQgTm9kZSBnZXROZXh0Tm9kZSgpCisgIHByb3RlY3RlZCBpbnQgZ2V0TmV4dE5vZGUoKQogICB7CiAKICAgICBpZiAobV9pc0ZyZXNoKQogICAgICAgbV9pc0ZyZXNoID0gZmFsc2U7CiAKLSAgICBOb2RlIGN1cnJlbnQgPSB0aGlzLmdldEN1cnJlbnROb2RlKCk7CisgICAgaW50IGN1cnJlbnQgPSB0aGlzLmdldEN1cnJlbnROb2RlKCk7CiAKLSAgICBpZiAoY3VycmVudC5pc1N1cHBvcnRlZChGRUFUVVJFX05PREVURVNURklMVEVSLCAiMS4wIikpCi0gICAgICAoKE5vZGVUZXN0RmlsdGVyKSBjdXJyZW50KS5zZXROb2RlVGVzdCh0aGlzKTsKKyAgICAvLyAlTk9ERVRFU1RGSUxURVIlCisvLyAgICBpZiAoY3VycmVudC5pc1N1cHBvcnRlZChGRUFUVVJFX05PREVURVNURklMVEVSLCAiMS4wIikpCisvLyAgICAgICgoTm9kZVRlc3RGaWx0ZXIpIGN1cnJlbnQpLnNldE5vZGVUZXN0KHRoaXMpOwogCi0gICAgTm9kZSBuZXh0ID0gdGhpcy5maXJzdENoaWxkKCk7CisgICAgaW50IG5leHQgPSB0aGlzLmZpcnN0Q2hpbGQoKTsKIAotICAgIHdoaWxlIChudWxsID09IG5leHQpCisgICAgd2hpbGUgKERUTS5OVUxMID09IG5leHQpCiAgICAgewogICAgICAgbmV4dCA9IHRoaXMubmV4dFNpYmxpbmcoKTsKIAotICAgICAgaWYgKG51bGwgPT0gbmV4dCkKKyAgICAgIGlmIChEVE0uTlVMTCA9PSBuZXh0KQogICAgICAgewotICAgICAgICBOb2RlIHAgPSB0aGlzLnBhcmVudE5vZGUoKTsKKyAgICAgICAgaW50IHAgPSB0aGlzLnBhcmVudE5vZGUoKTsKIAotICAgICAgICBpZiAobnVsbCA9PSBwKQorICAgICAgICBpZiAoRFRNLk5VTEwgPT0gcCkKICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobnVsbCA9PSBuZXh0KQorICAgIGlmIChEVE0uTlVMTCA9PSBuZXh0KQogICAgICAgdGhpcy5tX2lzRG9uZSA9IHRydWU7CiAKKyAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJldHVybmluZzogIit0aGlzKTsKICAgICByZXR1cm4gbmV4dDsKICAgfQogCkBAIC0xMDgxLDcgKzEwNTUsNyBAQAogICAgKiBAcmV0dXJuICBUaGUgbmV3IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vCiAgICAqICAgbmV4dCBub2RlICBpbiB0aGUgVHJlZVdhbGtlcidzIGxvZ2ljYWwgdmlldy4KICAgICovCi0gIHB1YmxpYyBOb2RlIG5leHROb2RlKCkKKyAgcHVibGljIGludCBuZXh0Tm9kZSgpCiAgIHsKIAogICAgIGlmIChERUJVR19UUkFWRVJTQUwgJiYhbV9kaWREdW1wQWxsKQpAQCAtMTA5Miw3ICsxMDY2LDcgQEAKICAgICAgIC8vIGR1bXBBbGwoZG9jLCAwKTsKICAgICB9CiAKLSAgICBOb2RlIG5leHROb2RlID0gbnVsbDsKKyAgICBpbnQgbmV4dE5vZGUgPSBEVE0uTlVMTDsKICAgICBBeGVzV2Fsa2VyIHdhbGtlciA9IG1fbHBpLmdldExhc3RVc2VkV2Fsa2VyKCk7CiAKICAgICAvLyBET01IZWxwZXIgZGggPSBtX2xwaS5nZXRET01IZWxwZXIoKTsKQEAgLTExNDAsNyArMTExNCw3IEBACiAgICAgICAgICAgd2Fsa2VyLnByaW50RGVidWcod2Fsa2VyLnRvU3RyaW5nKCkgKyAiLS1ORVhULT4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBub2RlVG9TdHJpbmcobmV4dE5vZGUpICsgIikiKTsKIAotICAgICAgICBpZiAobnVsbCA9PSBuZXh0Tm9kZSkKKyAgICAgICAgaWYgKERUTS5OVUxMID09IG5leHROb2RlKQogICAgICAgICB7CiAKICAgICAgICAgICAvLyBBeGVzV2Fsa2VyIHByZXYgPSB3YWxrZXI7ID8/IC1zYgpAQCAtMTE2Miw3ICsxMTM2LDcgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICBpZiAod2Fsa2VyLmFjY2VwdE5vZGUobmV4dE5vZGUpICE9IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVCkKKyAgICAgICAgICBpZiAod2Fsa2VyLmFjY2VwdE5vZGUobmV4dE5vZGUpICE9IERUTUl0ZXJhdG9yLkZJTFRFUl9BQ0NFUFQpCiAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKERFQlVHX1RSQVZFUlNBTCkKICAgICAgICAgICAgICAgcHJpbnREZWJ1Z0FkZCgiW0ZJTFRFUl9TS0lQXSIpOwpAQCAtMTE4Miw3ICsxMTU2LDcgQEAKICAgICAgICAgICAgIGlmIChERUJVR19UUkFWRVJTQUwpCiAgICAgICAgICAgICAgIHByaW50RGVidWcoIk1heSBiZSByZXR1cm5pbmc6ICIgKyBub2RlVG9TdHJpbmcobmV4dE5vZGUpKTsKIAotICAgICAgICAgICAgaWYgKERFQlVHX1RSQVZFUlNBTCAmJiAobnVsbCAhPSBtX3ByZXZSZXR1cm5lZCkpCisgICAgICAgICAgICBpZiAoREVCVUdfVFJBVkVSU0FMICYmIChEVE0uTlVMTCAhPSBtX3ByZXZSZXR1cm5lZCkpCiAgICAgICAgICAgICAgIHByaW50RGVidWdBZGQoIiwgbV9wcmV2UmV0dXJuZWQ6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5vZGVUb1N0cmluZyhtX3ByZXZSZXR1cm5lZCkpOwogCkBAIC0xMjM3LDkgKzEyMTEsOSBAQAogICAgIC8vIHRoZSBuZXh0IG5vZGUgaW4gdGhlIG5vZGVzZXQgYmVjYXVzZSBpdCdzIGNvbWluZyBmcm9tIGEgCiAgICAgLy8gZGlmZmVyZW50IGRvY3VtZW50LiAKICAgICB3aGlsZSAoCi0gICAgICAobnVsbCAhPSBuZXh0Tm9kZSkgJiYgKG51bGwgIT0gbV9wcmV2UmV0dXJuZWQpCi0gICAgICAmJiBuZXh0Tm9kZS5nZXRPd25lckRvY3VtZW50KCkgPT0gbV9wcmV2UmV0dXJuZWQuZ2V0T3duZXJEb2N1bWVudCgpCi0gICAgICAmJiBtX2xwaS5nZXRET01IZWxwZXIoKS5pc05vZGVBZnRlcihuZXh0Tm9kZSwgbV9wcmV2UmV0dXJuZWQpKTsKKyAgICAgIChEVE0uTlVMTCAhPSBuZXh0Tm9kZSkgJiYgKERUTS5OVUxMICE9IG1fcHJldlJldHVybmVkKQorICAgICAgJiYgZ2V0RFRNKG5leHROb2RlKS5nZXREb2N1bWVudCgpID09IGdldERUTShtX3ByZXZSZXR1cm5lZCkuZ2V0RG9jdW1lbnQoKQorICAgICAgJiYgZ2V0RFRNKG5leHROb2RlKS5pc05vZGVBZnRlcihuZXh0Tm9kZSwgbV9wcmV2UmV0dXJuZWQpKTsKIAogICAgIG1fcHJldlJldHVybmVkID0gbmV4dE5vZGU7CiAKQEAgLTEyNjMsNiArMTIzNyw3IEBACiAgIHsKIAogICAgIGludCBwb3MgPSBnZXRQcm94aW1pdHlQb3NpdGlvbigpOworICAgIAogICAgIEF4ZXNXYWxrZXIgd2Fsa2VyOwogCiAgICAgdHJ5CkBAIC0xMjg1LDkgKzEyNjAsOSBAQAogICAgIHsKICAgICAgIGxwaS5zZXRMYXN0VXNlZFdhbGtlcih3YWxrZXIpOwogCi0gICAgICBOb2RlIG5leHQ7CisgICAgICBpbnQgbmV4dDsKIAotICAgICAgd2hpbGUgKG51bGwgIT0gKG5leHQgPSB3YWxrZXIubmV4dE5vZGUoKSkpCisgICAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKG5leHQgPSB3YWxrZXIubmV4dE5vZGUoKSkpCiAgICAgICB7CiAgICAgICAgIHBvcysrOwogICAgICAgfQpAQCAtMTMxMiw2ICsxMjg3LDQxIEBACiAgIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KKyAgCisgIC8qKgorICAgKiBUZXN0IHdoZXRoZXIgYSBzcGVjaWZpZWQgbm9kZSBpcyB2aXNpYmxlIGluIHRoZSBsb2dpY2FsIHZpZXcgb2YgYQorICAgKiA8Y29kZT5EVE1JdGVyYXRvcjwvY29kZT4uIE5vcm1hbGx5LCB0aGlzIGZ1bmN0aW9uCisgICAqIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5EVE1JdGVyYXRvcjwvY29kZT47CisgICAqIGl0IGlzIG5vdCBub3JtYWxseSBjYWxsZWQgZGlyZWN0bHkgZnJvbQorICAgKiB1c2VyIGNvZGUuCisgICAqCisgICAqIEBwYXJhbSBub2RlSGFuZGxlIGludCBIYW5kbGUgb2YgdGhlIG5vZGUuCisgICAqIEBwYXJhbSB3aGF0VG9TaG93IG9uZSBvZiBTSE9XX1hYWCB2YWx1ZXMuCisgICAqIEByZXR1cm4gb25lIG9mIEZJTFRFUl9BQ0NFUFQsIEZJTFRFUl9SRUpFQ1QsIG9yIEZJTFRFUl9TS0lQLgorICAgKi8KKyAgcHVibGljIHNob3J0IGFjY2VwdE5vZGUoaW50IG5vZGVIYW5kbGUsIGludCB3aGF0VG9TaG93KQorICB7CisgICAgcmV0dXJuIERUTUl0ZXJhdG9yLkZJTFRFUl9BQ0NFUFQ7ICAvLyAlVEJEJQorICB9CisKKyAgLyoqCisgICAqIFRlc3Qgd2hldGhlciBhIHNwZWNpZmllZCBub2RlIGlzIHZpc2libGUgaW4gdGhlIGxvZ2ljYWwgdmlldyBvZiBhCisgICAqIDxjb2RlPkRUTUl0ZXJhdG9yPC9jb2RlPi4gTm9ybWFsbHksIHRoaXMgZnVuY3Rpb24KKyAgICogd2lsbCBiZSBjYWxsZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkRUTUl0ZXJhdG9yPC9jb2RlPjsKKyAgICogaXQgaXMgbm90IG5vcm1hbGx5IGNhbGxlZCBkaXJlY3RseSBmcm9tCisgICAqIHVzZXIgY29kZS4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgaW50IEhhbmRsZSBvZiB0aGUgbm9kZS4KKyAgICogQHBhcmFtIHdoYXRUb1Nob3cgb25lIG9mIFNIT1dfWFhYIHZhbHVlcy4KKyAgICogQHBhcmFtIGV4cGFuZGVkTmFtZSBhIHZhbHVlIGRlZmluaW5nIHRoZSBleGFuZGVkIG5hbWUgYXMgZGVmaW5lZCBpbgorICAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBEVE0gaW50ZXJmYWNlLiAgV2lsZCBjYXJkcyB3aWxsIGJlIGRlZmluZWQKKyAgICogICAgICAgICAgICAgICAgICAgICBieSAweEZGRkYgaW4gdGhlIGhpZ2ggd29yZCBhbmQvb3IgaW4gdGhlIGxvdyB3b3JkLgorICAgKiBAcmV0dXJuIG9uZSBvZiBGSUxURVJfQUNDRVBULCBGSUxURVJfUkVKRUNULCBvciBGSUxURVJfU0tJUC4KKyAgICovCisgIHB1YmxpYyBzaG9ydCBhY2NlcHROb2RlKGludCBub2RlSGFuZGxlLCBpbnQgd2hhdFRvU2hvdywgaW50IGV4cGFuZGVkTmFtZSkKKyAgeworICAgIHJldHVybiBEVE1JdGVyYXRvci5GSUxURVJfQUNDRVBUOyAgLy8gJVRCRCUKKyAgfQogCiAgIC8vPT09PT09PT09PT09PSBTdGF0aWMgRGF0YSA9PT09PT09PT09PT09CiAKQEAgLTEzNDUsMTkgKzEzNTUsNDggQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9OT0RFVEVTVEZJTFRFUiA9ICJOb2RlVGVzdEZpbHRlciI7CiAgIAogICAvLz09PT09PT09PT09PT0gU3RhdGUgRGF0YSA9PT09PT09PT09PT09CisgIAorICAvKioKKyAgICogVGhlIERUTSBmb3IgdGhlIHJvb3QuICBUaGlzIGNhbiBub3QgYmUgdXNlZCwgb3IgbXVzdCBiZSBjaGFuZ2VkLCAKKyAgICogZm9yIHRoZSBmaWx0ZXIgd2Fsa2VyLCBvciBhbnkgd2Fsa2VyIHRoYXQgY2FuIGhhdmUgbm9kZXMgCisgICAqIGZyb20gbXVsdGlwbGUgZG9jdW1lbnRzLgorICAgKiBOZXZlciwgZXZlciwgYWNjZXNzIHRoaXMgdmFsdWUgd2l0aG91dCBnb2luZyB0aHJvdWdoIGdldERUTShpbnQgbm9kZSkuCisgICAqLworICBwcml2YXRlIERUTSBtX2R0bTsKKyAgCisgIC8qKgorICAgKiBTZXQgdGhlIERUTSBmb3IgdGhpcyB3YWxrZXIuCisgICAqIAorICAgKiBAcGFyYW0gZHRtIE5vbi1udWxsIHJlZmVyZW5jZSB0byBhIERUTS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldERlZmF1bHREVE0oRFRNIGR0bSkKKyAgeworICAgIG1fZHRtID0gZHRtOworICB9CisgIAorICAvKioKKyAgICogR2V0IHRoZSBEVE0gZm9yIHRoaXMgd2Fsa2VyLgorICAgKiAKKyAgICogQHJldHVybiBOb24tbnVsbCByZWZlcmVuY2UgdG8gYSBEVE0uCisgICAqLworICBwdWJsaWMgRFRNIGdldERUTShpbnQgbm9kZSkKKyAgeworICAgIC8vCisgICAgcmV0dXJuIG1fbHBpLmdldFhQYXRoQ29udGV4dCgpLmdldERUTShub2RlKTsKKyAgfQogCiAgIC8qKgogICAgKiAgVGhlIHJvb3Qgbm9kZSBvZiB0aGUgVHJlZVdhbGtlciwgYXMgc3BlY2lmaWVkIHdoZW4gaXQgd2FzIGNyZWF0ZWQuCiAgICAqLwotICB0cmFuc2llbnQgTm9kZSBtX3Jvb3Q7CisgIHRyYW5zaWVudCBpbnQgbV9yb290ID0gRFRNLk5VTEw7CiAKICAgLyoqCiAgICAqICBUaGUgbm9kZSBhdCB3aGljaCB0aGUgVHJlZVdhbGtlciBpcyBjdXJyZW50bHkgcG9zaXRpb25lZC4KICAgICovCi0gIHRyYW5zaWVudCBOb2RlIG1fY3VycmVudE5vZGU7CisgIHRyYW5zaWVudCBpbnQgbV9jdXJyZW50Tm9kZSA9IERUTS5OVUxMOwogICAKICAgLyoqIFRoZSBub2RlIGxhc3QgcmV0dXJuZWQgZnJvbSBuZXh0Tm9kZSgpLiAqLwotICB0cmFuc2llbnQgTm9kZSBtX3ByZXZSZXR1cm5lZDsKKyAgdHJhbnNpZW50IGludCBtX3ByZXZSZXR1cm5lZCA9IERUTS5OVUxMOwogCiAgIC8qKgogICAgKiBUaGUgYXJnIGxlbmd0aCBvZiB0aGUgWFBhdGggc3RlcC4gRG9lcyBub3QgY2hhbmdlIGFmdGVyIHRoZSBjb25zdHJ1Y3Rvci4KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQ2hpbGRJdGVyYXRvci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9DaGlsZEl0ZXJhdG9yLmphdmEKaW5kZXggNjIzYWM2Ni4uZmQxNDliOCAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9DaGlsZEl0ZXJhdG9yLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9DaGlsZEl0ZXJhdG9yLmphdmEKQEAgLTYzLDggKzYzLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLldoaXRlc3BhY2VTdHJpcHBpbmdFbGVtZW50TWF0Y2hlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5QcmVmaXhSZXNvbHZlcjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiAvKioKICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgpAQCAtOTksODggKzEwMCwzNyBAQAogICAgKgogICAgKiBAcmV0dXJuICBUaGUgbmV4dCA8Y29kZT5Ob2RlPC9jb2RlPiBpbiB0aGUgc2V0IGJlaW5nIGl0ZXJhdGVkIG92ZXIsIG9yCiAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbiB0aGF0IHNldC4KLSAgICoKLSAgICogQHRocm93cyBET01FeGNlcHRpb24KLSAgICogICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlCi0gICAqICAgPGNvZGU+ZGV0YWNoPC9jb2RlPiBtZXRob2Qgd2FzIGludm9rZWQuCiAgICAqLwotICBwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpIHRocm93cyBET01FeGNlcHRpb24KKyAgcHVibGljIGludCBuZXh0Tm9kZSgpCiAgIHsKIAogICAgIC8vIElmIHRoZSBjYWNoZSBpcyBvbiwgYW5kIHRoZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gZm91bmQsIHRoZW4gCiAgICAgLy8ganVzdCByZXR1cm4gZnJvbSB0aGUgbGlzdC4KKyAgICAvLyBJZiB0aGUgY2FjaGUgaXMgb24sIGFuZCB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGZvdW5kLCB0aGVuIAorICAgIC8vIGp1c3QgcmV0dXJuIGZyb20gdGhlIGxpc3QuCiAgICAgaWYgKChudWxsICE9IG1fY2FjaGVkTm9kZXMpCi0gICAgICAgICAgICAmJiAobV9jYWNoZWROb2Rlcy5nZXRDdXJyZW50UG9zKCkgPCBtX2NhY2hlZE5vZGVzLnNpemUoKSkpCisgICAgICAgICAgICAmJiAobV9uZXh0IDwgbV9jYWNoZWROb2Rlcy5zaXplKCkpKQogICAgIHsKLSAgICAgIE5vZGUgbmV4dCA9IG1fY2FjaGVkTm9kZXMubmV4dE5vZGUoKTsKLQotICAgICAgdGhpcy5zZXRDdXJyZW50UG9zKG1fY2FjaGVkTm9kZXMuZ2V0Q3VycmVudFBvcygpKTsKKyAgICAgIGludCBuZXh0ID0gbV9jYWNoZWROb2Rlcy5lbGVtZW50QXQobV9uZXh0KTsKKyAgICAKKyAgICAgIGluY3JlbWVudE5leHRQb3NpdGlvbigpOworICAgICAgbV9jdXJyZW50Q29udGV4dE5vZGUgPSBuZXh0OwogCiAgICAgICByZXR1cm4gbmV4dDsKICAgICB9CiAKICAgICBpZiAobV9mb3VuZExhc3QpCi0gICAgICByZXR1cm4gbnVsbDsKKyAgICAgIHJldHVybiBEVE0uTlVMTDsKIAotICAgIE5vZGUgbmV4dDsKKyAgICBpbnQgbmV4dDsKKyAgICBEVE0gZHRtID0gbV9jZHRtOwogCi0gICAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgbV9sYXN0RmV0Y2hlZCA9IG5leHQgPSAobnVsbCA9PSBtX2xhc3RGZXRjaGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1fY29udGV4dC5nZXRGaXJzdENoaWxkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX2xhc3RGZXRjaGVkLmdldE5leHRTaWJsaW5nKCk7Ci0KLSAgICAgIC8vIFl1Y2shICBCbGVjaCEgIC1zYgotICAgICAgaWYgKG51bGwgIT0gbmV4dCkKLSAgICAgIHsKLSAgICAgICAgaW50IG50ID0gbmV4dC5nZXROb2RlVHlwZSgpOwotICAgICAgICBpZihOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA9PSBudCkgLy8gYnVnIGZpeCwgcG9zaXRpb24xNCwgZDJkLCB4ZXJjZXMgRE9NCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGVsc2UgaWYgKChOb2RlLlRFWFRfTk9ERSA9PSBudCkKLSAgICAgICAgICAgICAgICAmJiFuZXh0LmlzU3VwcG9ydGVkKFNVUFBPUlRTX1BSRV9TVFJJUFBJTkcsIG51bGwpKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBwYXJlbnQgPSBuZXh0LmdldFBhcmVudE5vZGUoKTsKLQotICAgICAgICAgIGlmIChudWxsICE9IHBhcmVudCAmJiBOb2RlLkVMRU1FTlRfTk9ERSA9PSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZGF0YSA9IG5leHQuZ2V0Tm9kZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGlmIChvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxDaGFyYWN0ZXJSZWNvZ25pemVyLmlzV2hpdGVTcGFjZSgKLSAgICAgICAgICAgICAgICAgICAgZGF0YSkpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgLy8gVWdseSB0cmljayBmb3Igbm93LgotICAgICAgICAgICAgICBQcmVmaXhSZXNvbHZlciByZXNvbHZlciA9Ci0gICAgICAgICAgICAgICAgZ2V0WFBhdGhDb250ZXh0KCkuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOwotCi0gICAgICAgICAgICAgIGlmIChyZXNvbHZlciBpbnN0YW5jZW9mIFdoaXRlc3BhY2VTdHJpcHBpbmdFbGVtZW50TWF0Y2hlcikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdoaXRlc3BhY2VTdHJpcHBpbmdFbGVtZW50TWF0Y2hlciB3c2VtID0KLSAgICAgICAgICAgICAgICAgIChXaGl0ZXNwYWNlU3RyaXBwaW5nRWxlbWVudE1hdGNoZXIpIHJlc29sdmVyOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKHdzZW0uc2hvdWxkU3RyaXBXaGl0ZVNwYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRYUGF0aENvbnRleHQoKSwgKG9yZy53M2MuZG9tLkVsZW1lbnQpIHBhcmVudCkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS54bWwudXRpbHMuV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24odGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBicmVhazsKLSAgICB9CisgICAgbV9sYXN0RmV0Y2hlZCA9IG5leHQgPSAoRFRNLk5VTEwgPT0gbV9sYXN0RmV0Y2hlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZHRtLmdldEZpcnN0Q2hpbGQobV9jb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkdG0uZ2V0TmV4dFNpYmxpbmcobV9sYXN0RmV0Y2hlZCk7CiAKICAgICAvLyBtX2xhc3RGZXRjaGVkID0gbmV4dDsKLSAgICBpZiAobnVsbCAhPSBuZXh0KQorICAgIGlmIChEVE0uTlVMTCAhPSBuZXh0KQogICAgIHsKICAgICAgIGlmIChudWxsICE9IG1fY2FjaGVkTm9kZXMpCiAgICAgICAgIG1fY2FjaGVkTm9kZXMuYWRkRWxlbWVudChtX2xhc3RGZXRjaGVkKTsKQEAgLTE5Myw3ICsxNDMsNyBAQAogICAgIHsKICAgICAgIG1fZm91bmRMYXN0ID0gdHJ1ZTsKIAotICAgICAgcmV0dXJuIG51bGw7CisgICAgICByZXR1cm4gRFRNLk5VTEw7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0NoaWxkVGVzdEl0ZXJhdG9yLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0NoaWxkVGVzdEl0ZXJhdG9yLmphdmEKaW5kZXggNmIyMjQ0MC4uYWJlMzUwNiAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9DaGlsZFRlc3RJdGVyYXRvci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQ2hpbGRUZXN0SXRlcmF0b3IuamF2YQpAQCAtNjIsMTAgKzYyLDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5wYXR0ZXJucy5Ob2RlVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE9iamVjdDsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1GaWx0ZXI7CiAKIC8qKgogICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImFkdmFuY2VkIi8+CkBAIC05NSw4ICs5OCw5IEBACiAgICAgaW50IHdoYXRUb1Nob3cgPSBjb21waWxlci5nZXRXaGF0VG9TaG93KGZpcnN0U3RlcFBvcyk7CiAKICAgICBpZiAoKDAgPT0gKHdoYXRUb1Nob3cKLSAgICAgICAgICAgICAgICYgKE5vZGVGaWx0ZXIuU0hPV19BVFRSSUJVVEUgfCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVAotICAgICAgICAgICAgICAgICAgfCBOb2RlRmlsdGVyLlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTikpKSB8fCAod2hhdFRvU2hvdyA9PSBOb2RlRmlsdGVyLlNIT1dfQUxMKSkKKyAgICAgICAgICAgICAgICYgKERUTUZpbHRlci5TSE9XX0FUVFJJQlVURSB8IERUTUZpbHRlci5TSE9XX0VMRU1FTlQKKyAgICAgICAgICAgICAgICAgIHwgRFRNRmlsdGVyLlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTikpKSAKKyAgICAgICAgICAgICAgICAgIHx8ICh3aGF0VG9TaG93ID09IERUTUZpbHRlci5TSE9XX0FMTCkpCiAgICAgICBpbml0Tm9kZVRlc3Qod2hhdFRvU2hvdyk7CiAgICAgZWxzZQogICAgIHsKQEAgLTExNCw3ICsxMTgsNyBAQAogICAgKiAKICAgICogIEB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyBOb2RlSXRlcmF0b3IgY2xvbmVXaXRoUmVzZXQoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24KKyAgcHVibGljIERUTUl0ZXJhdG9yIGNsb25lV2l0aFJlc2V0KCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCiAgIHsKIAogICAgIENoaWxkVGVzdEl0ZXJhdG9yIGNsb25lID0gKENoaWxkVGVzdEl0ZXJhdG9yKSBzdXBlci5jbG9uZVdpdGhSZXNldCgpOwpAQCAtMTIzLDYgKzEyNywxOCBAQAogCiAgICAgcmV0dXJuIGNsb25lOwogICB9CisgIAorICAvKioKKyAgICogR2V0IHRoZSBuZXh0IG5vZGUgdmlhIGdldE5leHRYWFguICBCb3R0bGVuZWNrZWQgZm9yIGRlcml2ZWQgY2xhc3Mgb3ZlcnJpZGUuCisgICAqIEByZXR1cm4gVGhlIG5leHQgbm9kZSBvbiB0aGUgYXhpcywgb3IgRFRNLk5VTEwuCisgICAqLworICBwcm90ZWN0ZWQgaW50IGdldE5leHROb2RlKCkKKyAgeworICAgIG1fbGFzdEZldGNoZWQgPSAoRFRNLk5VTEwgPT0gbV9sYXN0RmV0Y2hlZCkKKyAgICAgICAgICAgICAgICAgICAgID8gbV9jZHRtLmdldEZpcnN0Q2hpbGQobV9jb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgOiBtX2NkdG0uZ2V0TmV4dFNpYmxpbmcobV9sYXN0RmV0Y2hlZCk7CisgICAgcmV0dXJuIG1fbGFzdEZldGNoZWQ7CisgIH0KIAogICAvKioKICAgICogIFJldHVybnMgdGhlIG5leHQgbm9kZSBpbiB0aGUgc2V0IGFuZCBhZHZhbmNlcyB0aGUgcG9zaXRpb24gb2YgdGhlCkBAIC0xMzEsMzUgKzE0NywzNCBAQAogICAgKgogICAgKiBAcmV0dXJuICBUaGUgbmV4dCA8Y29kZT5Ob2RlPC9jb2RlPiBpbiB0aGUgc2V0IGJlaW5nIGl0ZXJhdGVkIG92ZXIsIG9yCiAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbiB0aGF0IHNldC4KLSAgICoKLSAgICogQHRocm93cyBET01FeGNlcHRpb24KLSAgICogICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlCi0gICAqICAgPGNvZGU+ZGV0YWNoPC9jb2RlPiBtZXRob2Qgd2FzIGludm9rZWQuCiAgICAqLwotICBwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpIHRocm93cyBET01FeGNlcHRpb24KKyAgcHVibGljIGludCBuZXh0Tm9kZSgpCiAgIHsKIAogICAgIC8vIElmIHRoZSBjYWNoZSBpcyBvbiwgYW5kIHRoZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gZm91bmQsIHRoZW4gCiAgICAgLy8ganVzdCByZXR1cm4gZnJvbSB0aGUgbGlzdC4KKyAgICAvLyBJZiB0aGUgY2FjaGUgaXMgb24sIGFuZCB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGZvdW5kLCB0aGVuIAorICAgIC8vIGp1c3QgcmV0dXJuIGZyb20gdGhlIGxpc3QuCiAgICAgaWYgKChudWxsICE9IG1fY2FjaGVkTm9kZXMpCi0gICAgICAgICAgICAmJiAobV9jYWNoZWROb2Rlcy5nZXRDdXJyZW50UG9zKCkgPCBtX2NhY2hlZE5vZGVzLnNpemUoKSkpCisgICAgICAgICAgICAmJiAobV9uZXh0IDwgbV9jYWNoZWROb2Rlcy5zaXplKCkpKQogICAgIHsKLSAgICAgIE5vZGUgbmV4dCA9IG1fY2FjaGVkTm9kZXMubmV4dE5vZGUoKTsKLQotICAgICAgdGhpcy5zZXRDdXJyZW50UG9zKG1fY2FjaGVkTm9kZXMuZ2V0Q3VycmVudFBvcygpKTsKKyAgICAgIGludCBuZXh0ID0gbV9jYWNoZWROb2Rlcy5lbGVtZW50QXQobV9uZXh0KTsKKyAgICAKKyAgICAgIGluY3JlbWVudE5leHRQb3NpdGlvbigpOworICAgICAgbV9jdXJyZW50Q29udGV4dE5vZGUgPSBuZXh0OwogCiAgICAgICByZXR1cm4gbmV4dDsKICAgICB9CiAKICAgICBpZiAobV9mb3VuZExhc3QpCi0gICAgICByZXR1cm4gbnVsbDsKKyAgICAgIHJldHVybiBEVE0uTlVMTDsKICAgICAgIAotICAgIGlmKG51bGwgPT0gbV9sYXN0RmV0Y2hlZCkKKyAgICBpZihEVE0uTlVMTCA9PSBtX2xhc3RGZXRjaGVkKQogICAgIHsKICAgICAgIHJlc2V0UHJveGltaXR5UG9zaXRpb25zKCk7CiAgICAgfQogCi0gICAgTm9kZSBuZXh0OworICAgIGludCBuZXh0OwogICAgIAogICAgIG9yZy5hcGFjaGUueHBhdGguVmFyaWFibGVTdGFjayB2YXJzOwogICAgIGludCBzYXZlZFN0YXJ0OwpAQCAtMTg0LDEzICsxOTksMTEgQEAKICAgICB7CiAgICAgICBkbwogICAgICAgewotICAgICAgICBtX2xhc3RGZXRjaGVkID0gbmV4dCA9IChudWxsID09IG1fbGFzdEZldGNoZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX2NvbnRleHQuZ2V0Rmlyc3RDaGlsZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX2xhc3RGZXRjaGVkLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIG5leHQgPSBnZXROZXh0Tm9kZSgpOwogICAKLSAgICAgICAgaWYgKG51bGwgIT0gbmV4dCkKKyAgICAgICAgaWYgKERUTS5OVUxMICE9IG5leHQpCiAgICAgICAgIHsKLSAgICAgICAgICBpZihOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQgPT0gYWNjZXB0Tm9kZShuZXh0KSkKKyAgICAgICAgICBpZihEVE1JdGVyYXRvci5GSUxURVJfQUNDRVBUID09IGFjY2VwdE5vZGUobmV4dCkpCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE5OCw5ICsyMTEsOSBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICB3aGlsZSAobmV4dCAhPSBudWxsKTsKKyAgICAgIHdoaWxlIChuZXh0ICE9IERUTS5OVUxMKTsKICAgCi0gICAgICBpZiAobnVsbCAhPSBuZXh0KQorICAgICAgaWYgKERUTS5OVUxMICE9IG5leHQpCiAgICAgICB7CiAgICAgICAgIGlmIChudWxsICE9IG1fY2FjaGVkTm9kZXMpCiAgICAgICAgICAgbV9jYWNoZWROb2Rlcy5hZGRFbGVtZW50KG1fbGFzdEZldGNoZWQpOwpAQCAtMjEzLDcgKzIyNiw3IEBACiAgICAgICB7CiAgICAgICAgIG1fZm91bmRMYXN0ID0gdHJ1ZTsKICAgCi0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gRFRNLk5VTEw7CiAgICAgICB9CiAgICAgfQogICAgIGZpbmFsbHkKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQ2hpbGRXYWxrZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQ2hpbGRXYWxrZXIuamF2YQppbmRleCA2OTMyMTU3Li5jODMxNTgxIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0NoaWxkV2Fsa2VyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9DaGlsZFdhbGtlci5qYXZhCkBAIC02MCw3ICs2MCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIC8qKgogICogV2Fsa2VyIGZvciB0aGUgJ2NoaWxkJyBheGVzLgpAQCAtODQsMTEgKzg1LDExIEBACiAgICAqCiAgICAqIEBwYXJhbSByb290IFRoZSBjb250ZXh0IG5vZGUgb2YgdGhpcyBzdGVwLgogICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdChOb2RlIHJvb3QpCisgIHB1YmxpYyB2b2lkIHNldFJvb3QoaW50IHJvb3QpCiAgIHsKIAogICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hpbGRXYWxrZXIuc2V0Um9vdCIpOwotICAgIG1fbmV4dExldmVsQW1vdW50ID0gcm9vdC5oYXNDaGlsZE5vZGVzKCkgPyAxIDogMDsKKyAgICBtX25leHRMZXZlbEFtb3VudCA9IGdldERUTShyb290KS5oYXNDaGlsZE5vZGVzKHJvb3QpID8gMSA6IDA7CiAKICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJhY2sgZnJvbSBjYWxsaW5nIGhhc0NoaWxkTm9kZXMiKTsKICAgICBzdXBlci5zZXRSb290KHJvb3QpOwpAQCAtMTA0LDcgKzEwNSw3IEBACiAgICAqIEByZXR1cm4gIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KICAgICogICB2aXNpYmxlIGNoaWxkcmVuIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgZmlyc3RDaGlsZCgpCisgIHB1YmxpYyBpbnQgZmlyc3RDaGlsZCgpCiAgIHsKIAogICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hpbGRXYWxrZXIuZmlyc3RDaGlsZCIpOwpAQCAtMTEyLDEyICsxMTMsMTEgQEAKIAogICAgIGlmIChtX3Jvb3QgPT0gbV9jdXJyZW50Tm9kZSkKICAgICB7Ci0KICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hpbGRXYWxrZXIgLSBDYWxsaW5nIGdldEZpcnN0Q2hpbGQiKTsKLSAgICAgIHJldHVybiBzZXRDdXJyZW50SWZOb3ROdWxsKHRoaXMubV9yb290LmdldEZpcnN0Q2hpbGQoKSk7CisgICAgICByZXR1cm4gc2V0Q3VycmVudElmTm90TnVsbChnZXREVE0obV9yb290KS5nZXRGaXJzdENoaWxkKG1fcm9vdCkpOwogICAgIH0KICAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKKyAgICAgIHJldHVybiBEVE0uTlVMTDsKICAgfQogCiAgIC8qKgpAQCAtMTI3LDEzICsxMjcsMTIgQEAKICAgICogQHJldHVybiAgVGhlIG5ldyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwogICAgKiAgIG5leHQgc2libGluZyBpbiB0aGUgVHJlZVdhbGtlcidzIGxvZ2ljYWwgdmlldy4KICAgICovCi0gIHB1YmxpYyBOb2RlIG5leHRTaWJsaW5nKCkKKyAgcHVibGljIGludCBuZXh0U2libGluZygpCiAgIHsKLQogICAgIGlmIChtX3Jvb3QgIT0gbV9jdXJyZW50Tm9kZSkKLSAgICAgIHJldHVybiBzZXRDdXJyZW50SWZOb3ROdWxsKG1fY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7CisgICAgICByZXR1cm4gc2V0Q3VycmVudElmTm90TnVsbChnZXREVE0obV9jdXJyZW50Tm9kZSkuZ2V0TmV4dFNpYmxpbmcobV9jdXJyZW50Tm9kZSkpOwogICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOworICAgICAgcmV0dXJuIERUTS5OVUxMOwogICB9CiAKICAgLyoqCkBAIC0xNDMsNiArMTQyLDYgQEAKICAgICovCiAgIHByb3RlY3RlZCBpbnQgZ2V0TGV2ZWxNYXgoKQogICB7Ci0gICAgcmV0dXJuIG1fbHBpLmdldERPTUhlbHBlcigpLmdldExldmVsKG1fcm9vdCk7CisgICAgcmV0dXJuIGdldERUTShtX3Jvb3QpLmdldExldmVsKG1fcm9vdCk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQ2hpbGRXYWxrZXJNdWx0aVN0ZXAuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQ2hpbGRXYWxrZXJNdWx0aVN0ZXAuamF2YQppbmRleCA3ZWU4YTRlLi5hZjYyN2U1IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0NoaWxkV2Fsa2VyTXVsdGlTdGVwLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9DaGlsZFdhbGtlck11bHRpU3RlcC5qYXZhCkBAIC01Niw4ICs1NiwxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguYXhlczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgucGF0dGVybnMuTm9kZVRlc3RGaWx0ZXI7CiAKQEAgLTg1LDM5ICs4OCw0MSBAQAogICAgKgogICAgKiBAcmV0dXJuIHRoZSBuZXh0IHZhbGlkIGNoaWxkIG5vZGUuCiAgICAqLwotICBwcm90ZWN0ZWQgTm9kZSBnZXROZXh0Tm9kZSgpCisgIHByb3RlY3RlZCBpbnQgZ2V0TmV4dE5vZGUoKQogICB7CiAgICAgaWYgKG1faXNGcmVzaCkKICAgICAgIG1faXNGcmVzaCA9IGZhbHNlOwogCi0gICAgTm9kZSBjdXJyZW50ID0gdGhpcy5nZXRDdXJyZW50Tm9kZSgpOworICAgIGludCBjdXJyZW50ID0gdGhpcy5nZXRDdXJyZW50Tm9kZSgpOwogICAgIAotICAgIGlmIChjdXJyZW50LmlzU3VwcG9ydGVkKEZFQVRVUkVfTk9ERVRFU1RGSUxURVIsICIxLjAiKSkKLSAgICAgICgoTm9kZVRlc3RGaWx0ZXIpIGN1cnJlbnQpLnNldE5vZGVUZXN0KHRoaXMpOworICAgIC8vICVOT0RFVEVTVEZJTFRFUiUKKy8vICAgIGlmIChjdXJyZW50LmlzU3VwcG9ydGVkKEZFQVRVUkVfTk9ERVRFU1RGSUxURVIsICIxLjAiKSkKKy8vICAgICAgKChOb2RlVGVzdEZpbHRlcikgY3VycmVudCkuc2V0Tm9kZVRlc3QodGhpcyk7CisgICAgRFRNIGR0bSA9IGdldERUTShtX3Jvb3QpOwogCi0gICAgTm9kZSBuZXh0ID0gKG1fcm9vdCA9PSBtX2N1cnJlbnROb2RlKQotICAgICAgICAgICAgICAgID8gbV9jdXJyZW50Tm9kZS5nZXRGaXJzdENoaWxkKCkKLSAgICAgICAgICAgICAgICA6IG1fY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICBpbnQgbmV4dCA9IChtX3Jvb3QgPT0gbV9jdXJyZW50Tm9kZSkKKyAgICAgICAgICAgICAgICA/IGR0bS5nZXRGaXJzdENoaWxkKG1fY3VycmVudE5vZGUpCisgICAgICAgICAgICAgICAgOiBkdG0uZ2V0TmV4dFNpYmxpbmcobV9jdXJyZW50Tm9kZSk7CiAKLSAgICBpZiAobnVsbCAhPSBuZXh0KQorICAgIGlmIChEVE0uTlVMTCAhPSBuZXh0KQogICAgIHsKICAgICAgIG1fY3VycmVudE5vZGUgPSBuZXh0OwogCi0gICAgICB3aGlsZSAoYWNjZXB0Tm9kZShuZXh0KSAhPSBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQpCisgICAgICB3aGlsZSAoYWNjZXB0Tm9kZShuZXh0KSAhPSBEVE1JdGVyYXRvci5GSUxURVJfQUNDRVBUKQogICAgICAgewotICAgICAgICBuZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOworICAgICAgICBuZXh0ID0gZHRtLmdldE5leHRTaWJsaW5nKG5leHQpOwogCi0gICAgICAgIGlmIChudWxsID09IG5leHQpCisgICAgICAgIGlmIChEVE0uTlVMTCA9PSBuZXh0KQogICAgICAgICAgIGJyZWFrOwogICAgICAgICBlbHNlCiAgICAgICAgICAgbV9jdXJyZW50Tm9kZSA9IG5leHQ7CiAgICAgICB9CiAgICAgICAKLSAgICAgIGlmKG51bGwgPT0gbmV4dCkKKyAgICAgIGlmKERUTS5OVUxMID09IG5leHQpCiAgICAgICAgIG1fY3VycmVudE5vZGUgPSBjdXJyZW50OyAvLyBkb24ndCBhZHZhbmNlIHRoZSBjdXJyZW50IG5vZGUuCiAgICAgfSAgICAgICAgICAKIAotICAgIGlmIChudWxsID09IG5leHQpCisgICAgaWYgKERUTS5OVUxMID09IG5leHQpCiAgICAgICB0aGlzLm1faXNEb25lID0gdHJ1ZTsKIAogICAgIHJldHVybiBuZXh0OwpAQCAtMTMzLDcgKzEzOCw3IEBACiAgICAqIEByZXR1cm4gIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KICAgICogICBuZXh0IG5vZGUgIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgbmV4dE5vZGUoKQorICBwdWJsaWMgaW50IG5leHROb2RlKCkKICAgewogCiAgICAgQXhlc1dhbGtlciB3YWxrZXIgPSBtX2xwaS5nZXRMYXN0VXNlZFdhbGtlcigpOwpAQCAtMTQxLDcgKzE0Niw3IEBACiAKICAgICB3aGlsZSAobnVsbCAhPSB3YWxrZXIpCiAgICAgewotICAgICAgTm9kZSBuZXh0OworICAgICAgaW50IG5leHQ7CiAgICAgICBpZihmYXN0KQogICAgICAgewogICAgICAgICBuZXh0ID0gd2Fsa2VyLmdldE5leHROb2RlKCk7CkBAIC0xNTAsMTEgKzE1NSwxMSBAQAogICAgICAgewogICAgICAgICBuZXh0ID0gd2Fsa2VyLm5leHROb2RlKCk7CiAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgbmV4dE5vZGUgZmluaXNoZWQgdGhlIHdhbGssIHNvIHdlIGp1c3QgcmV0dXJuLgotICAgICAgICBpZihudWxsICE9IG5leHQpCisgICAgICAgIGlmKERUTS5OVUxMICE9IG5leHQpCiAgICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICB9CiAKLSAgICAgIGlmIChudWxsICE9IG5leHQpCisgICAgICBpZiAoRFRNLk5VTEwgIT0gbmV4dCkKICAgICAgIHsKICAgICAgICAgaWYgKG51bGwgIT0gd2Fsa2VyLm1fbmV4dFdhbGtlcikKICAgICAgICAgewpAQCAtMTc3LDcgKzE4Miw3IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIG51bGw7CisgICAgcmV0dXJuIERUTS5OVUxMOwogICB9CiAgIAogICAvKioKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQ2hpbGRXYWxrZXJPbmVTdGVwLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0NoaWxkV2Fsa2VyT25lU3RlcC5qYXZhCmluZGV4IDU5YzAyMDcuLjkyOTdlYTQgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvQ2hpbGRXYWxrZXJPbmVTdGVwLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9DaGlsZFdhbGtlck9uZVN0ZXAuamF2YQpAQCAtNTYsOCArNTYsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoLmF4ZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLnBhdHRlcm5zLk5vZGVUZXN0RmlsdGVyOwogCkBAIC04NSw3ICs4OCw3IEBACiAgICAqLwogICBwcm90ZWN0ZWQgaW50IGdldExldmVsTWF4KCkKICAgewotICAgIHJldHVybiBtX2xwaS5nZXRET01IZWxwZXIoKS5nZXRMZXZlbChtX3Jvb3QpOworICAgIHJldHVybiBnZXREVE0obV9yb290KS5nZXRMZXZlbChtX3Jvb3QpOwogICB9CiAKICAgLyoqCkBAIC05MywyOCArOTYsMjggQEAKICAgICoKICAgICogQHJldHVybiBUaGUgbmV4dCBub2RlIGluIHRoZSB3YWxrLCBvciBudWxsLgogICAgKi8KLSAgcHVibGljIE5vZGUgbmV4dE5vZGUoKQorICBwdWJsaWMgaW50IG5leHROb2RlKCkKICAgewogCi0gICAgTm9kZSBuZXh0OworICAgIGludCBuZXh0OwogCiAgICAgaWYgKG1fcm9vdCA9PSBtX2N1cnJlbnROb2RlKQogICAgIHsKLSAgICAgIG5leHQgPSBtX2N1cnJlbnROb2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgIG5leHQgPSBnZXREVE0obV9jdXJyZW50Tm9kZSkuZ2V0Rmlyc3RDaGlsZChtX2N1cnJlbnROb2RlKTsKICAgICAgIG1faXNGcmVzaCA9IGZhbHNlOwogICAgIH0KICAgICBlbHNlCi0gICAgICBuZXh0ID0gbV9jdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgbmV4dCA9IGdldERUTShtX2N1cnJlbnROb2RlKS5nZXROZXh0U2libGluZyhtX2N1cnJlbnROb2RlKTsKIAotICAgIGlmIChudWxsICE9IG5leHQpCisgICAgaWYgKERUTS5OVUxMICE9IG5leHQpCiAgICAgewogICAgICAgbV9jdXJyZW50Tm9kZSA9IG5leHQ7CiAKLSAgICAgIHdoaWxlIChhY2NlcHROb2RlKG5leHQpICE9IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVCkKKyAgICAgIHdoaWxlIChhY2NlcHROb2RlKG5leHQpICE9IERUTUl0ZXJhdG9yLkZJTFRFUl9BQ0NFUFQpCiAgICAgICB7Ci0gICAgICAgIG5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIG5leHQgPSBnZXREVE0obmV4dCkuZ2V0TmV4dFNpYmxpbmcobmV4dCk7CiAKLSAgICAgICAgaWYgKG51bGwgIT0gbmV4dCkKKyAgICAgICAgaWYgKERUTS5OVUxMICE9IG5leHQpCiAgICAgICAgICAgbV9jdXJyZW50Tm9kZSA9IG5leHQ7CiAgICAgICAgIGVsc2UKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9EZXNjZW5kYW50SXRlcmF0b3IuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvRGVzY2VuZGFudEl0ZXJhdG9yLmphdmEKaW5kZXggNzJjYWE4Mi4uMmIxY2E3OSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9EZXNjZW5kYW50SXRlcmF0b3IuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0Rlc2NlbmRhbnRJdGVyYXRvci5qYXZhCkBAIC02MywxMSArNjMsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLmNvbXBpbGVyLk9wQ29kZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworLy9pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUZpbHRlcjsKIAogLyoqCiAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KQEAgLTExNiw4ICsxMTksOSBAQAogICAgIGludCB3aGF0VG9TaG93ID0gY29tcGlsZXIuZ2V0V2hhdFRvU2hvdyhmaXJzdFN0ZXBQb3MpOwogCiAgICAgaWYgKCgwID09ICh3aGF0VG9TaG93Ci0gICAgICAgICAgICAgICAmIChOb2RlRmlsdGVyLlNIT1dfQVRUUklCVVRFIHwgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQKLSAgICAgICAgICAgICAgICAgIHwgTm9kZUZpbHRlci5TSE9XX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04pKSkgfHwgKHdoYXRUb1Nob3cgPT0gTm9kZUZpbHRlci5TSE9XX0FMTCkpCisgICAgICAgICAgICAgICAmIChEVE1GaWx0ZXIuU0hPV19BVFRSSUJVVEUgfCBEVE1GaWx0ZXIuU0hPV19FTEVNRU5UCisgICAgICAgICAgICAgICAgICB8IERUTUZpbHRlci5TSE9XX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04pKSkgfHwgCisgICAgICAgICAgICAgICAgICAgKHdoYXRUb1Nob3cgPT0gRFRNRmlsdGVyLlNIT1dfQUxMKSkKICAgICAgIGluaXROb2RlVGVzdCh3aGF0VG9TaG93KTsKICAgICBlbHNlCiAgICAgewpAQCAtMTI4LDYgKzEzMiwyNSBAQAogICB9CiAgIAogICAvKioKKyAgICogQ3JlYXRlIGEgRGVzY2VuZGFudEl0ZXJhdG9yIG9iamVjdC4KKyAgICoKKyAgICogQHBhcmFtIGNvbXBpbGVyIEEgcmVmZXJlbmNlIHRvIHRoZSBDb21waWxlciB0aGF0IGNvbnRhaW5zIHRoZSBvcCBtYXAuCisgICAqIEBwYXJhbSBvcFBvcyBUaGUgcG9zaXRpb24gd2l0aGluIHRoZSBvcCBtYXAsIHdoaWNoIGNvbnRhaW5zIHRoZQorICAgKiBsb2NhdGlvbiBwYXRoIGV4cHJlc3Npb24gZm9yIHRoaXMgaXR0ZXJhdG9yLgorICAgKgorICAgKiBAdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBEZXNjZW5kYW50SXRlcmF0b3IoKQorICB7CisgICAgc3VwZXIobnVsbCk7CisgICAgbV9vclNlbGYgPSB0cnVlOworICAgIG1fZnJvbVJvb3QgPSB0cnVlOworICAgIGludCB3aGF0VG9TaG93ID0gRFRNRmlsdGVyLlNIT1dfQUxMOworICAgIGluaXROb2RlVGVzdCh3aGF0VG9TaG93KTsKKyAgfQorCisgIAorICAvKioKICAgICogIEdldCBhIGNsb25lZCBJdGVyYXRvciB0aGF0IGlzIHJlc2V0IHRvIHRoZSBiZWdpbm5pbmcKICAgICogIG9mIHRoZSBxdWVyeS4KICAgICogCkBAIC0xMzUsNyArMTU4LDcgQEAKICAgICogCiAgICAqICBAdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgTm9kZUl0ZXJhdG9yIGNsb25lV2l0aFJlc2V0KCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCisgIHB1YmxpYyBEVE1JdGVyYXRvciBjbG9uZVdpdGhSZXNldCgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbgogICB7CiAKICAgICBEZXNjZW5kYW50SXRlcmF0b3IgY2xvbmUgPSAoRGVzY2VuZGFudEl0ZXJhdG9yKSBzdXBlci5jbG9uZVdpdGhSZXNldCgpOwpAQCAtMTU3LDMxICsxODAsMzQgQEAKICAgICogICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlCiAgICAqICAgPGNvZGU+ZGV0YWNoPC9jb2RlPiBtZXRob2Qgd2FzIGludm9rZWQuCiAgICAqLwotICBwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpIHRocm93cyBET01FeGNlcHRpb24KKyAgcHVibGljIGludCBuZXh0Tm9kZSgpCiAgIHsKIAogICAgIC8vIElmIHRoZSBjYWNoZSBpcyBvbiwgYW5kIHRoZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gZm91bmQsIHRoZW4gCiAgICAgLy8ganVzdCByZXR1cm4gZnJvbSB0aGUgbGlzdC4KKyAgICAvLyBJZiB0aGUgY2FjaGUgaXMgb24sIGFuZCB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGZvdW5kLCB0aGVuIAorICAgIC8vIGp1c3QgcmV0dXJuIGZyb20gdGhlIGxpc3QuCiAgICAgaWYgKChudWxsICE9IG1fY2FjaGVkTm9kZXMpCi0gICAgICAgICAgICAmJiAobV9jYWNoZWROb2Rlcy5nZXRDdXJyZW50UG9zKCkgPCBtX2NhY2hlZE5vZGVzLnNpemUoKSkpCisgICAgICAgICAgICAmJiAobV9uZXh0IDwgbV9jYWNoZWROb2Rlcy5zaXplKCkpKQogICAgIHsKLSAgICAgIE5vZGUgbmV4dCA9IG1fY2FjaGVkTm9kZXMubmV4dE5vZGUoKTsKLQotICAgICAgdGhpcy5zZXRDdXJyZW50UG9zKG1fY2FjaGVkTm9kZXMuZ2V0Q3VycmVudFBvcygpKTsKKyAgICAgIGludCBuZXh0ID0gbV9jYWNoZWROb2Rlcy5lbGVtZW50QXQobV9uZXh0KTsKKyAgICAKKyAgICAgIGluY3JlbWVudE5leHRQb3NpdGlvbigpOworICAgICAgbV9jdXJyZW50Q29udGV4dE5vZGUgPSBuZXh0OwogCiAgICAgICByZXR1cm4gbmV4dDsKICAgICB9CiAKICAgICBpZiAobV9mb3VuZExhc3QpCi0gICAgICByZXR1cm4gbnVsbDsKKyAgICAgIHJldHVybiBEVE0uTlVMTDsKIAotICAgIE5vZGUgcG9zOyAgLy8gb3VyIG1haW4gaXR0ZXJhdGlvbiBub2RlLiAgCisgICAgaW50IHBvczsgIC8vIG91ciBtYWluIGl0dGVyYXRpb24gbm9kZS4gIAogICAgIGJvb2xlYW4gZ2V0U2VsZjsKIAogICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhcnQgY29udGV4dCBzaG91bGQgYmUuCiAgICAgLy8gSWYgdGhlIG1fbGFzdEZldGNoZWQgaXMgbnVsbCBhdCB0aGlzIHBvaW50IHdlJ3JlIGF0IHRoZSBzdGFydCAKICAgICAvLyBvZiBhIGZyZXNoIGl0ZXJhdGlvbi4KLSAgICBpZiAobnVsbCA9PSBtX2xhc3RGZXRjaGVkKQorICAgIGlmIChEVE0uTlVMTCA9PSBtX2xhc3RGZXRjaGVkKQogICAgIHsKICAgICAgIGdldFNlbGYgPSBtX29yU2VsZjsgLy8gdHJ1ZSBpZiBkZXNjZW5kYW50cy1vci1zZWxmLgogICAgICAgCkBAIC0xODksMTAgKzIxNSwxMCBAQAogICAgICAgLy8gb3IgdGhlIHJvb3Qgbm9kZS4KICAgICAgIGlmIChnZXRTZWxmICYmIG1fZnJvbVJvb3QpCiAgICAgICB7Ci0gICAgICAgIGlmKG1fY29udGV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKKyAgICAgICAgaWYobV9jZHRtLmdldE5vZGVUeXBlKG1fY29udGV4dCkgPT0gRFRNLkRPQ1VNRU5UX05PREUpCiAgICAgICAgICAgcG9zID0gbV9jb250ZXh0OwogICAgICAgICBlbHNlCi0gICAgICAgICAgcG9zID0gbV9jb250ZXh0LmdldE93bmVyRG9jdW1lbnQoKTsKKyAgICAgICAgICBwb3MgPSBtX2NkdG0uZ2V0RG9jdW1lbnQoKTsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgICAgcG9zID0gbV9jb250ZXh0OwpAQCAtMjI3LDE2ICsyNTMsMTYgQEAKICAgICAKICAgICB0cnkKICAgICB7Ci0gICAgICBOb2RlIHRvcCA9IG1fc3RhcnRDb250ZXh0OyAvLyB0ZWxscyB1cyB3aGVuIHRvIHN0b3AuCi0gICAgICBOb2RlIG5leHQgPSBudWxsOworICAgICAgaW50IHRvcCA9IG1fc3RhcnRDb250ZXh0OyAvLyB0ZWxscyB1cyB3aGVuIHRvIHN0b3AuCisgICAgICBpbnQgbmV4dCA9IERUTS5OVUxMOwogICAKICAgICAgIC8vIG5vbi1yZWN1cnNpdmUgZGVwdGgtZmlyc3QgdHJhdmVyc2FsLgotICAgICAgd2hpbGUgKG51bGwgIT0gcG9zKQorICAgICAgd2hpbGUgKERUTS5OVUxMICE9IHBvcykKICAgICAgIHsKICAgICAgICAgaWYoZ2V0U2VsZikKICAgICAgICAgewogICAgICAgICAgIG1fbGFzdEZldGNoZWQgPSBwb3M7IC8vIHdlIGhhdmUgdG8gZG8gdGhpcyBmb3IgYSBjbG9uZSBpbiBhIHByZWRpY2F0ZSB0byB3b3JrIGNvcnJlY3RseS4KLSAgICAgICAgICBpZihOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQgPT0gYWNjZXB0Tm9kZShwb3MpKQorICAgICAgICAgIGlmKERUTUl0ZXJhdG9yLkZJTFRFUl9BQ0NFUFQgPT0gYWNjZXB0Tm9kZShwb3MpKQogICAgICAgICAgIHsKICAgICAgICAgICAgIG5leHQgPSBwb3M7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI0NSwyMiArMjcxLDIyIEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICBnZXRTZWxmID0gdHJ1ZTsKICAgICAgICAgIAotICAgICAgICBOb2RlIG5leHROb2RlID0gcG9zLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgaW50IG5leHROb2RlID0gbV9jZHRtLmdldEZpcnN0Q2hpbGQocG9zKTsKICAgCi0gICAgICAgIHdoaWxlIChudWxsID09IG5leHROb2RlKQorICAgICAgICB3aGlsZSAoRFRNLk5VTEwgPT0gbmV4dE5vZGUpCiAgICAgICAgIHsKLSAgICAgICAgICBpZiAodG9wLmVxdWFscyhwb3MpKQorICAgICAgICAgIGlmICh0b3AgPT0gcG9zKQogICAgICAgICAgICAgYnJlYWs7CiAgIAotICAgICAgICAgIG5leHROb2RlID0gcG9zLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgbmV4dE5vZGUgPSBtX2NkdG0uZ2V0TmV4dFNpYmxpbmcocG9zKTsKICAgCi0gICAgICAgICAgaWYgKG51bGwgPT0gbmV4dE5vZGUpCisgICAgICAgICAgaWYgKERUTS5OVUxMID09IG5leHROb2RlKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvcyA9IHBvcy5nZXRQYXJlbnROb2RlKCk7CisgICAgICAgICAgICBwb3MgPSBtX2NkdG0uZ2V0UGFyZW50KHBvcyk7CiAgIAotICAgICAgICAgICAgaWYgKChudWxsID09IHBvcykgfHwgKHRvcC5lcXVhbHMocG9zKSkpCisgICAgICAgICAgICBpZiAoKERUTS5OVUxMID09IHBvcykgfHwgKHRvcCA9PSBwb3MpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG51bGw7CisgICAgICAgICAgICAgIG5leHROb2RlID0gRFRNLk5VTEw7CiAgIAogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTI3Miw3ICsyOTgsNyBAQAogICAgICAgCiAgICAgICBtX2xhc3RGZXRjaGVkID0gbmV4dDsKICAgCi0gICAgICBpZiAobnVsbCAhPSBuZXh0KQorICAgICAgaWYgKERUTS5OVUxMICE9IG5leHQpCiAgICAgICB7CiAgICAgICAgIGlmIChudWxsICE9IG1fY2FjaGVkTm9kZXMpCiAgICAgICAgICAgbV9jYWNoZWROb2Rlcy5hZGRFbGVtZW50KG5leHQpOwpAQCAtMjg0LDkgKzMxMCw5IEBACiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgIG1fZm91bmRMYXN0ID0gdHJ1ZTsKLSAgICAgICAgbV9zdGFydENvbnRleHQgPSBudWxsOworICAgICAgICBtX3N0YXJ0Q29udGV4dCA9IERUTS5OVUxMOwogICAKLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBEVE0uTlVMTDsKICAgICAgIH0KICAgICB9CiAgICAgZmluYWxseQpAQCAtMzAxLDcgKzMyNyw3IEBACiAgIH0KICAgCiAgIC8qKiBUaGUgdG9wIG9mIHRoZSBzdWJ0cmVlLCBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIG1fY29udGV4dCBpZiAiLy9mb28iIHBhdHRlcm4uICovIAotICB0cmFuc2llbnQgcHJpdmF0ZSBOb2RlIG1fc3RhcnRDb250ZXh0OworICB0cmFuc2llbnQgcHJpdmF0ZSBpbnQgbV9zdGFydENvbnRleHQgPSBEVE0uTlVMTDsKIAogICAvKiogVHJ1ZSBpZiB0aGlzIGlzIGEgZGVzY2VuZGFudHMtb3Itc2VsZiBheGVzLgogICAgKiAgQHNlcmlhbCAqLwpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9EZXNjZW5kYW50T3JTZWxmV2Fsa2VyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0Rlc2NlbmRhbnRPclNlbGZXYWxrZXIuamF2YQppbmRleCA5OTFmNjg1Li4wZjI4MGQ5IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0Rlc2NlbmRhbnRPclNlbGZXYWxrZXIuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0Rlc2NlbmRhbnRPclNlbGZXYWxrZXIuamF2YQpAQCAtNjAsNyArNjAsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiAvKioKICAqIFdhbGtlciBmb3IgdGhlICdkZXNjZW5kYW50LW9yLXNlbGYnIGF4ZXMuCkBAIC04NCw3ICs4NSw3IEBACiAgICAqCiAgICAqIEBwYXJhbSByb290IFRoZSBjb250ZXh0IG5vZGUgb2YgdGhpcyBzdGVwLgogICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdChOb2RlIHJvb3QpCisgIHB1YmxpYyB2b2lkIHNldFJvb3QoaW50IHJvb3QpCiAgIHsKIAogICAgIG1fcHJvY2Vzc2VkU2VsZiA9IGZhbHNlOwpAQCAtMTAwLDcgKzEwMSw3IEBACiAgICAqIEByZXR1cm4gIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KICAgICogICB2aXNpYmxlIGNoaWxkcmVuIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgZmlyc3RDaGlsZCgpCisgIHB1YmxpYyBpbnQgZmlyc3RDaGlsZCgpCiAgIHsKIAogICAgIC8vIEZvbGxvdyBteSBtYWRlLXVwIHJ1bGUgYWJvdXQgcmV0dXJuaW5nIHRoZSBzZWxmIG5vZGUgYXMgYSBjaGlsZC4KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvRGVzY2VuZGFudFdhbGtlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9EZXNjZW5kYW50V2Fsa2VyLmphdmEKaW5kZXggNTBjMjU1OC4uY2IxNTdiZSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9EZXNjZW5kYW50V2Fsa2VyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9EZXNjZW5kYW50V2Fsa2VyLmphdmEKQEAgLTYwLDcgKzYwLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0OwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogLyoqCiAgKiBXYWxrZXIgZm9yIHRoZSAnZGVzY2VuZGFudCcgYXhlcy4KQEAgLTg0LDEwICs4NSw5IEBACiAgICAqCiAgICAqIEBwYXJhbSByb290IFRoZSBjb250ZXh0IG5vZGUgb2YgdGhpcyBzdGVwLgogICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdChOb2RlIHJvb3QpCisgIHB1YmxpYyB2b2lkIHNldFJvb3QoaW50IHJvb3QpCiAgIHsKLQotICAgIG1fbmV4dExldmVsQW1vdW50ID0gcm9vdC5oYXNDaGlsZE5vZGVzKCkgPyAxIDogMDsKKyAgICBtX25leHRMZXZlbEFtb3VudCA9IGdldERUTShyb290KS5oYXNDaGlsZE5vZGVzKHJvb3QpID8gMSA6IDA7CiAKICAgICBzdXBlci5zZXRSb290KHJvb3QpOwogICB9CkBAIC0xMDAsMjAgKzEwMCwyMCBAQAogICAgKiBAcmV0dXJuICBUaGUgbmV3IHBhcmVudCBub2RlLCBvciBudWxsIGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vIHBhcmVudAogICAgKiAgIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgcGFyZW50Tm9kZSgpCisgIHB1YmxpYyBpbnQgcGFyZW50Tm9kZSgpCiAgIHsKIAotICAgIE5vZGUgbjsKKyAgICBpbnQgbjsKIAotICAgIGlmIChtX3Jvb3QuZXF1YWxzKG1fY3VycmVudE5vZGUpKSAvLyB3aHkgbm90ID09ID8gIC1zYgorICAgIGlmIChtX3Jvb3QgPT0gbV9jdXJyZW50Tm9kZSkgLy8gd2h5IG5vdCA9PSA/ICAtc2IKICAgICB7Ci0gICAgICBuID0gbnVsbDsKKyAgICAgIG4gPSBEVE0uTlVMTDsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgIE5vZGUgcCA9IG1fY3VycmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOworICAgICAgaW50IHAgPSBnZXREVE0obV9jdXJyZW50Tm9kZSkuZ2V0UGFyZW50KG1fY3VycmVudE5vZGUpOwogCi0gICAgICBuID0gbV9yb290LmVxdWFscyhwKSA/IG51bGwgOiBwOworICAgICAgbiA9IChtX3Jvb3QgPT0gcCkgPyBEVE0uTlVMTCA6IHA7CiAgICAgfQogCiAgICAgbV9uZXh0TGV2ZWxBbW91bnQgPSAwOwpAQCAtMTI5LDEzICsxMjksMTMgQEAKICAgICogQHJldHVybiAgVGhlIG5ldyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwogICAgKiAgIHZpc2libGUgY2hpbGRyZW4gaW4gdGhlIFRyZWVXYWxrZXIncyBsb2dpY2FsIHZpZXcuCiAgICAqLwotICBwdWJsaWMgTm9kZSBmaXJzdENoaWxkKCkKKyAgcHVibGljIGludCBmaXJzdENoaWxkKCkKICAgewotICAgIAotICAgIE5vZGUgbmV4dCA9IChtX2N1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgPwotICAgICAgICAgICAgICAgIG1fY3VycmVudE5vZGUuZ2V0Rmlyc3RDaGlsZCgpIDogbnVsbDsKKyAgICBEVE0gZHRtID0gZ2V0RFRNKG1fY3VycmVudE5vZGUpOworICAgIGludCBuZXh0ID0gKGR0bS5nZXROb2RlVHlwZShtX2N1cnJlbnROb2RlKSAhPSBEVE0uQVRUUklCVVRFX05PREUpID8KKyAgICAgICAgICAgICAgICBkdG0uZ2V0Rmlyc3RDaGlsZChtX2N1cnJlbnROb2RlKSA6IERUTS5OVUxMOwogCi0gICAgbV9uZXh0TGV2ZWxBbW91bnQgPSAobnVsbCA9PSBuZXh0KSA/IDAgOiAobmV4dC5oYXNDaGlsZE5vZGVzKCkgPyAxIDogMCk7CisgICAgbV9uZXh0TGV2ZWxBbW91bnQgPSAoRFRNLk5VTEwgPT0gbmV4dCkgPyAwIDogKGR0bS5oYXNDaGlsZE5vZGVzKG5leHQpID8gMSA6IDApOwogCiAgICAgcmV0dXJuIHNldEN1cnJlbnRJZk5vdE51bGwobmV4dCk7CiAgIH0KQEAgLTE0NywxMyArMTQ3LDEzIEBACiAgICAqIEByZXR1cm4gIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KICAgICogICBuZXh0IHNpYmxpbmcgaW4gdGhlIFRyZWVXYWxrZXIncyBsb2dpY2FsIHZpZXcuCiAgICAqLwotICBwdWJsaWMgTm9kZSBuZXh0U2libGluZygpCisgIHB1YmxpYyBpbnQgbmV4dFNpYmxpbmcoKQogICB7CisgICAgRFRNIGR0bSA9IGdldERUTShtX3Jvb3QpOworICAgIGludCBuZXh0ID0gKG1fcm9vdCA9PSBtX2N1cnJlbnROb2RlKQorICAgICAgICAgICAgICAgID8gRFRNLk5VTEwgOiBkdG0uZ2V0TmV4dFNpYmxpbmcobV9jdXJyZW50Tm9kZSk7CiAKLSAgICBOb2RlIG5leHQgPSBtX3Jvb3QuZXF1YWxzKG1fY3VycmVudE5vZGUpCi0gICAgICAgICAgICAgICAgPyBudWxsIDogbV9jdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCi0gICAgbV9uZXh0TGV2ZWxBbW91bnQgPSAobnVsbCA9PSBuZXh0KSA/IDAgOiAobmV4dC5oYXNDaGlsZE5vZGVzKCkgPyAxIDogMCk7CisgICAgbV9uZXh0TGV2ZWxBbW91bnQgPSAoRFRNLk5VTEwgPT0gbmV4dCkgPyAwIDogKGR0bS5oYXNDaGlsZE5vZGVzKG5leHQpID8gMSA6IDApOwogCiAgICAgcmV0dXJuIHNldEN1cnJlbnRJZk5vdE51bGwobmV4dCk7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvRmlsdGVyRXhwcldhbGtlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9GaWx0ZXJFeHByV2Fsa2VyLmphdmEKaW5kZXggNWViOTY0ZC4uY2NjYzYyNSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9GaWx0ZXJFeHByV2Fsa2VyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9GaWx0ZXJFeHByV2Fsa2VyLmphdmEKQEAgLTcwLDkgKzcwLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNRmlsdGVyOwogCiAvKioKICAqIFdhbGtlciBmb3IgdGhlIE9QX1ZBUklBQkxFLCBvciBPUF9FWFRGVU5DVElPTiwgb3IgT1BfRlVOQ1RJT04sIG9yIE9QX0dST1VQLApAQCAtMTI3LDcgKzEzMCw3IEBACiAgICAqIEBwYXJhbSByb290IG5vbi1udWxsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCwgb3Igc3RhcnRpbmcgcG9pbnQgb2YgCiAgICAqICAgICAgICB0aGUgcXVlcnkuCiAgICAqLwotICBwdWJsaWMgdm9pZCBzZXRSb290KE5vZGUgcm9vdCkKKyAgcHVibGljIHZvaWQgc2V0Um9vdChpbnQgcm9vdCkKICAgewogCiAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJyb290OiAiK3Jvb3QpOwpAQCAtMTY3LDcgKzE3MCw3IEBACiAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJhY2sgZnJvbSBtX2V4cHIuZXhlY3V0ZShtX2xwaS5nZXRYUGF0aENvbnRleHQoKSk6ICIrb2JqKTsKICAgICAgIG1fbm9kZVNldCA9IChudWxsICE9IG9iaikgPyBvYmoubm9kZXNldCgpIDogbnVsbDsKICAgICAgIAotICAgICAgbV9wZWVrID0gbnVsbDsKKyAgICAgIG1fcGVlayA9IERUTS5OVUxMOwogICAgIH0KICAgICBjYXRjaCAoamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiBzZSkKICAgICB7CkBAIC0xOTgsNyArMjAxLDcgQEAKIAogICAgIC8vIGNsb25lLm1fZXhwciA9IChFeHByZXNzaW9uKSgoRXhwcmVzc2lvbiltX2V4cHIpLmNsb25lKCk7CiAgICAgaWYgKG51bGwgIT0gbV9ub2RlU2V0KQotICAgICAgY2xvbmUubV9ub2RlU2V0ID0gKE5vZGVJdGVyYXRvcikgKChDb250ZXh0Tm9kZUxpc3QpIG1fbm9kZVNldCkuY2xvbmUoKTsKKyAgICAgIGNsb25lLm1fbm9kZVNldCA9IChEVE1JdGVyYXRvcikgbV9ub2RlU2V0LmNsb25lKCk7CiAKICAgICByZXR1cm4gY2xvbmU7CiAgIH0KQEAgLTIxMCw3ICsyMTMsNyBAQAogICAgKiBAcmV0dXJuICBhIGNvbnN0YW50IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBub2RlIGlzIGFjY2VwdGVkLAogICAgKiAgIHJlamVjdGVkLCBvciBza2lwcGVkLCBhcyBkZWZpbmVkICBhYm92ZSAuCiAgICAqLwotICBwdWJsaWMgc2hvcnQgYWNjZXB0Tm9kZShOb2RlIG4pCisgIHB1YmxpYyBzaG9ydCBhY2NlcHROb2RlKGludCBuKQogICB7CiAKICAgICB0cnkKQEAgLTIyMCwxMCArMjIzLDEwIEBACiAgICAgICAgIGNvdW50UHJveGltaXR5UG9zaXRpb24oMCk7CiAKICAgICAgICAgaWYgKCFleGVjdXRlUHJlZGljYXRlcyhuLCBtX2xwaS5nZXRYUGF0aENvbnRleHQoKSkpCi0gICAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX1NLSVA7CisgICAgICAgICAgcmV0dXJuIERUTUl0ZXJhdG9yLkZJTFRFUl9TS0lQOwogICAgICAgfQogCi0gICAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUOworICAgICAgcmV0dXJuIERUTUl0ZXJhdG9yLkZJTFRFUl9BQ0NFUFQ7CiAgICAgfQogICAgIGNhdGNoIChqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uIHNlKQogICAgIHsKQEAgLTI0MCwzNCArMjQzLDM1IEBACiAgICAqIEByZXR1cm4gIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KICAgICogICBuZXh0IG5vZGUgIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0TmV4dE5vZGUoKQorICBwdWJsaWMgaW50IGdldE5leHROb2RlKCkKICAgewogCi0gICAgTm9kZSBuZXh0OworICAgIGludCBuZXh0OwogCi0gICAgaWYgKG51bGwgIT0gbV9wZWVrKQorICAgIGlmIChEVE0uTlVMTCAhPSBtX3BlZWspCiAgICAgewogICAgICAgbmV4dCA9IG1fcGVlazsKLSAgICAgIG1fcGVlayA9IG51bGw7CisgICAgICBtX3BlZWsgPSBEVE0uTlVMTDsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgIGlmIChudWxsICE9IG1fbm9kZVNldCkKICAgICAgIHsKLSAgICAgICAgTm9kZSBjdXJyZW50ID0gdGhpcy5nZXRDdXJyZW50Tm9kZSgpOworICAgICAgICBpbnQgY3VycmVudCA9IHRoaXMuZ2V0Q3VycmVudE5vZGUoKTsKIAotICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIE5vZGVUZXN0RmlsdGVyKQotICAgICAgICAgICgoTm9kZVRlc3RGaWx0ZXIpIGN1cnJlbnQpLnNldE5vZGVUZXN0KHRoaXMpOworICAgICAgICAvLyAlTk9ERVRFU1RGSUxURVIlCisvLyAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBOb2RlVGVzdEZpbHRlcikKKy8vICAgICAgICAgICgoTm9kZVRlc3RGaWx0ZXIpIGN1cnJlbnQpLnNldE5vZGVUZXN0KHRoaXMpOwogCiAgICAgICAgIG5leHQgPSBtX25vZGVTZXQubmV4dE5vZGUoKTsKICAgICAgIH0KICAgICAgIGVsc2UKLSAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgIG5leHQgPSBEVE0uTlVMTDsKICAgICB9CiAKICAgICAvLyBCb2d1cywgSSB0aGluaywgYnV0IHByb2JhYmx5IE9LIGZvciByaWdodCBub3cgc2luY2UgYSBmaWx0ZXJFeHByIAogICAgIC8vIGNhbiBvbmx5IG9jY3VyIGF0IHRoZSBoZWFkIG9mIGEgbG9jYXRpb24gcGF0aC4KLSAgICBpZiAobnVsbCA9PSBuZXh0KQorICAgIGlmIChEVE0uTlVMTCA9PSBuZXh0KQogICAgIHsKICAgICAgIG1fbmV4dExldmVsQW1vdW50ID0gMDsKICAgICB9CkBAIC0yNzUsNyArMjc5LDcgQEAKICAgICB7CiAKICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsdGVyRXhwcldhbGtlci5nZXROZXh0Tm9kZSIpOwotICAgICAgbV9uZXh0TGV2ZWxBbW91bnQgPSAobmV4dC5oYXNDaGlsZE5vZGVzKCkgPyAxIDogMCk7CisgICAgICBtX25leHRMZXZlbEFtb3VudCA9ICgoZ2V0RFRNKG5leHQpLmdldEZpcnN0Q2hpbGQobmV4dCkgIT0gRFRNLk5VTEwpID8gMSA6IDApOwogCiAgICAgICAvKiAuLi5XQUlUIFRPIFNFRSBJRiBXRSBSRUFMTFkgTkVFRCBUSElTLi4uCiAgICAgICBtX3BlZWsgPSBtX25vZGVTZXQubmV4dE5vZGUoKTsKQEAgLTI4OSwxOSArMjkzLDIwIEBACiAgICAgICAqLwogICAgIH0KIAotICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsdGVyRXhwcldhbGtlci5nZXROZXh0Tm9kZSAtIFJldHVybmluZzogIituZXh0KTsKLSAgICByZXR1cm4gc2V0Q3VycmVudElmTm90TnVsbChuZXh0KTsKKyAgICBpbnQgY3VycmVudCA9IHNldEN1cnJlbnRJZk5vdE51bGwobmV4dCk7CisgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5pbmc6ICIrdGhpcyk7CisgICAgcmV0dXJuIGN1cnJlbnQ7CiAgIH0KLQorICAKICAgLyoqIFRoZSBjb250YWluZWQgZXhwcmVzc2lvbi4gU2hvdWxkIGJlIG5vbi1udWxsLgogICAgKiAgQHNlcmlhbCAgICovCiAgIHByaXZhdGUgRXhwcmVzc2lvbiBtX2V4cHI7CiAKICAgLyoqIFRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIG1fZXhwci4gIE5lZWRzIHRvIGJlIGRlZXAgY2xvbmVkIG9uIGNsb25lIG9wLiAgKi8KLSAgdHJhbnNpZW50IHByaXZhdGUgTm9kZUl0ZXJhdG9yIG1fbm9kZVNldDsKKyAgdHJhbnNpZW50IHByaXZhdGUgRFRNSXRlcmF0b3IgbV9ub2RlU2V0OwogCiAgIC8qKiBJIHRoaW5rIHRoaXMgaXMgYWx3YXlzIG51bGwgcmlnaHQgbm93LiAgICAqLwotICB0cmFuc2llbnQgcHJpdmF0ZSBOb2RlIG1fcGVlayA9IG51bGw7CisgIHRyYW5zaWVudCBwcml2YXRlIGludCBtX3BlZWsgPSBEVE0uTlVMTDsKIAogICAvKioKICAgICogVGVsbCB3aGF0J3MgdGhlIG1heGltdW0gbGV2ZWwgdGhpcyBheGVzIGNhbiBkZXNjZW5kIHRvICh3aGljaCBpcyBhY3R1YWxseQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9Gb2xsb3dpbmdTaWJsaW5nV2Fsa2VyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0ZvbGxvd2luZ1NpYmxpbmdXYWxrZXIuamF2YQppbmRleCBhMzFlOWMzLi44YjU4ODdiIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0ZvbGxvd2luZ1NpYmxpbmdXYWxrZXIuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0ZvbGxvd2luZ1NpYmxpbmdXYWxrZXIuamF2YQpAQCAtNjAsNyArNjAsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiAvKioKICAqIFdhbGtlciBmb3IgdGhlICdmb2xsb3dpbmctc2libGluZycgYXhlcy4KQEAgLTg5LDEwICs5MCwxMCBAQAogICAgKiBAcmV0dXJuICBUaGUgbmV3IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vCiAgICAqICAgbmV4dCBzaWJsaW5nIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgbmV4dFNpYmxpbmcoKQorICBwdWJsaWMgaW50IG5leHRTaWJsaW5nKCkKICAgewogCi0gICAgTm9kZSBuID0gbV9jdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOworICAgIGludCBuID0gZ2V0RFRNKG1fcm9vdCkuZ2V0TmV4dFNpYmxpbmcobV9jdXJyZW50Tm9kZSk7CiAKICAgICByZXR1cm4gc2V0Q3VycmVudElmTm90TnVsbChuKTsKICAgfQpAQCAtMTA0LDYgKzEwNSw2IEBACiAgICAqLwogICBwcm90ZWN0ZWQgaW50IGdldExldmVsTWF4KCkKICAgewotICAgIHJldHVybiBtX2xwaS5nZXRET01IZWxwZXIoKS5nZXRMZXZlbChtX3Jvb3QpOworICAgIHJldHVybiBnZXREVE0obV9yb290KS5nZXRMZXZlbChtX3Jvb3QpOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0ZvbGxvd2luZ1dhbGtlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9Gb2xsb3dpbmdXYWxrZXIuamF2YQppbmRleCAzMzgxY2ZkLi45ODgwYzc5IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0ZvbGxvd2luZ1dhbGtlci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvRm9sbG93aW5nV2Fsa2VyLmphdmEKQEAgLTYzLDcgKzYzLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLkRPTUhlbHBlcjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIC8qKgogICogV2Fsa2VyIGZvciB0aGUgJ2ZvbGxvd2luZycgYXhlcy4KQEAgLTg3LDEyICs4OCwxMyBAQAogICAgKgogICAgKiBAcGFyYW0gcm9vdCBUaGUgY29udGV4dCBub2RlIG9mIHRoaXMgc3RlcC4KICAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJvb3QoTm9kZSByb290KQorICBwdWJsaWMgdm9pZCBzZXRSb290KGludCByb290KQogICB7ICAgICAgCiAKICAgICBzdXBlci5zZXRSb290KHJvb3QpOwogICAgIAotICAgIGlmKHJvb3QuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQorICAgIERUTSBkdG0gPSBnZXREVE0ocm9vdCk7CisgICAgaWYoZHRtLmdldE5vZGVUeXBlKHJvb3QpID09IERUTS5BVFRSSUJVVEVfTk9ERSkKICAgICB7CiAgICAgICAvLyBUaGUgY3VycmVudCBub2RlIGNvdWxkIGJlIGFuIGF0dHJpYnV0ZSBub2RlLCBzbyBnZXROZXh0U2libGluZygpIHdpbGwgCiAgICAgICAvLyBhbHdheXMgcmV0dXJuIG51bGwuICBJbiB0aGF0IGNhc2UsIHdlIHdhbnQgdG8gY29udGludWUgdGhlIHNlYXJjaCAKQEAgLTEwMSwxNSArMTAzLDE1IEBACiAgICAgICAvLyBkb24ndCBoYXZlIHRvIGNvbnNpZGVyIGZvbGxvd2luZyBhdHRyaWJ1dGVzLCBzaW5jZSB0aGV5IG5ldmVyIG1hdGNoIAogICAgICAgLy8gdGhlIGZvbGxvd2luZyBheGVzLgogICAgICAgLyoKLSAgICAgIE5vZGUgZSA9IG1fbHBpLmdldERPTUhlbHBlcigpLmdldFBhcmVudE9mTm9kZShyb290KTsKKyAgICAgIGludCBlID0gbV9scGkuZ2V0RE9NSGVscGVyKCkuZ2V0UGFyZW50T2ZOb2RlKHJvb3QpOwogICAgICAgcm9vdCA9IGUuZ2V0TGFzdENoaWxkKCk7CiAgICAgICBpZihudWxsID09IHJvb3QpCiAgICAgICAgIHJvb3QgPSBlOwogICAgICAgbV9jdXJyZW50QW5jZXN0b3IgPSBlLmdldFBhcmVudE5vZGUoKTsKICAgICAgICovCi0gICAgICBOb2RlIGUgPSBtX2xwaS5nZXRET01IZWxwZXIoKS5nZXRQYXJlbnRPZk5vZGUocm9vdCk7CisgICAgICBpbnQgZSA9IGR0bS5nZXRQYXJlbnQocm9vdCk7CiAgICAgICBtX2N1cnJlbnROb2RlID0gZTsKLSAgICAgIG1fY3VycmVudEFuY2VzdG9yID0gZS5nZXRPd25lckRvY3VtZW50KCk7IC8vIE5vdCB0b3RhbGx5IHN1cmUgd2h5CisgICAgICBtX2N1cnJlbnRBbmNlc3RvciA9IGR0bS5nZXREb2N1bWVudCgpOyAvLyBOb3QgdG90YWxseSBzdXJlIHdoeQogICAgIH0gCiAgICAgZWxzZQogICAgICAgbV9jdXJyZW50QW5jZXN0b3IgPSByb290OwpAQCAtMTMwLDIyICsxMzIsMjIgQEAKICAgICogQHJldHVybiAgVGhlIG5ldyBwYXJlbnQgbm9kZSwgb3IgbnVsbCBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubyBwYXJlbnQKICAgICogICBpbiB0aGUgVHJlZVdhbGtlcidzIGxvZ2ljYWwgdmlldy4KICAgICovCi0gIHB1YmxpYyBOb2RlIHBhcmVudE5vZGUoKQorICBwdWJsaWMgaW50IHBhcmVudE5vZGUoKQogICB7CiAKLSAgICBOb2RlIG47Ci0vLyAgICBOb2RlIG5leHRBbmNlc3RvciA9IChudWxsICE9IG1fY3VycmVudEFuY2VzdG9yKQorICAgIGludCBuOworLy8gICAgaW50IG5leHRBbmNlc3RvciA9IChudWxsICE9IG1fY3VycmVudEFuY2VzdG9yKQogLy8gICAgICAgICAgICAgICAgICAgICAgICA/IG1fY3VycmVudEFuY2VzdG9yLmdldFBhcmVudE5vZGUoKSA6IG51bGw7Ci0gICAgTm9kZSBuZXh0UGFyZW50ID0gbV9jdXJyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7CisgICAgaW50IG5leHRQYXJlbnQgPSBnZXREVE0obV9yb290KS5nZXRQYXJlbnQobV9jdXJyZW50Tm9kZSk7CiAKIC8vICAgIGlmIChuZXh0UGFyZW50ID09IG5leHRBbmNlc3RvcikKIC8vICAgIHsKIC8vICAgICAgbiA9IG51bGw7CiAvLwotLy8gICAgICBOb2RlIGFuY2VzdG9yID0gbV9jdXJyZW50QW5jZXN0b3I7CisvLyAgICAgIGludCBhbmNlc3RvciA9IG1fY3VycmVudEFuY2VzdG9yOwogLy8KIC8vICAgICAgd2hpbGUgKChudWxsICE9IGFuY2VzdG9yKQotLy8gICAgICAgICAgICAgJiYgKG51bGwgIT0gKGFuY2VzdG9yID0gKE5vZGUpIGFuY2VzdG9yLmdldFBhcmVudE5vZGUoKSkpKQorLy8gICAgICAgICAgICAgJiYgKG51bGwgIT0gKGFuY2VzdG9yID0gKGludCkgYW5jZXN0b3IuZ2V0UGFyZW50Tm9kZSgpKSkpCiAvLyAgICAgIHsKIC8vICAgICAgICBuID0gYW5jZXN0b3IuZ2V0TmV4dFNpYmxpbmcoKTsKIC8vCkBAIC0xNjIsNyArMTY0LDcgQEAKIAogLy8gICAgaWYobnVsbCAhPSBuKQogLy8gICAgewotLy8gICAgICBOb2RlIGF0dHJOb2RlID0gbi5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJpZCIpOworLy8gICAgICBpbnQgYXR0ck5vZGUgPSBuLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oImlkIik7CiAvLyAgICAgIGlmKG51bGwgIT0gYXR0ck5vZGUpCiAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwYXJlbnROb2RlOiAiK2F0dHJOb2RlLmdldE5vZGVWYWx1ZSgpKTsKIC8vICAgICAgZWxzZQpAQCAtMTgyLDEzICsxODQsMTQgQEAKICAgICogQHJldHVybiAgVGhlIG5ldyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwogICAgKiAgIHZpc2libGUgY2hpbGRyZW4gaW4gdGhlIFRyZWVXYWxrZXIncyBsb2dpY2FsIHZpZXcuCiAgICAqLwotICBwdWJsaWMgTm9kZSBmaXJzdENoaWxkKCkKKyAgcHVibGljIGludCBmaXJzdENoaWxkKCkKICAgewogCi0gICAgTm9kZSBuOworICAgIGludCBuOworICAgIERUTSBkdG0gPSBnZXREVE0obV9yb290KTsKICAgICBpZihtX2N1cnJlbnRBbmNlc3RvciA9PSBtX2N1cnJlbnROb2RlKQogICAgIHsKLS8vICAgICAgaWYobV9jdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCisvLyAgICAgIGlmKG1fY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBEVE0uQVRUUklCVVRFX05PREUpCiAvLyAgICAgIHsKIC8vICAgICAgICAvLyBUaGUgY3VycmVudCBub2RlIGNvdWxkIGJlIGFuIGF0dHJpYnV0ZSBub2RlLCBzbyBnZXROZXh0U2libGluZygpIHdpbGwgCiAvLyAgICAgICAgLy8gYWx3YXlzIHJldHVybiBudWxsLiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRvIGNvbnRpbnVlIHRoZSBzZWFyY2ggCkBAIC0xOTksMTggKzIwMiwxOCBAQAogLy8gICAgICAgIG4gPSBtX2xwaS5nZXRET01IZWxwZXIoKS5nZXRQYXJlbnRPZk5vZGUobV9jdXJyZW50Tm9kZSkuZ2V0Rmlyc3RDaGlsZCgpOwogLy8gICAgICB9IAogLy8gICAgICBlbHNlCi0gICAgICAgIG4gPSBtX2N1cnJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIG4gPSBkdG0uZ2V0TmV4dFNpYmxpbmcobV9jdXJyZW50Tm9kZSk7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBuID0gbV9jdXJyZW50Tm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICBuID0gZHRtLmdldEZpcnN0Q2hpbGQobV9jdXJyZW50Tm9kZSk7CiAgICAgfQogCi0gICAgbV9uZXh0TGV2ZWxBbW91bnQgPSAobnVsbCA9PSBuKSA/IDAgOiAobi5oYXNDaGlsZE5vZGVzKCkgPyAxIDogMCk7CisgICAgbV9uZXh0TGV2ZWxBbW91bnQgPSAoRFRNLk5VTEwgPT0gbikgPyAwIDogKGR0bS5oYXNDaGlsZE5vZGVzKG4pID8gMSA6IDApOwogICAgIAogLy8gICAgaWYobnVsbCAhPSBuKQogLy8gICAgewotLy8gICAgICBOb2RlIGF0dHJOb2RlID0gbi5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJpZCIpOworLy8gICAgICBpbnQgYXR0ck5vZGUgPSBuLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oImlkIik7CiAvLyAgICAgIGlmKG51bGwgIT0gYXR0ck5vZGUpCiAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaXJzdENoaWxkOiAiK2F0dHJOb2RlLmdldE5vZGVWYWx1ZSgpKTsKIC8vICAgICAgZWxzZQpAQCAtMjI5LDE3ICsyMzIsMTggQEAKICAgICogQHJldHVybiAgVGhlIG5ldyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwogICAgKiAgIG5leHQgc2libGluZyBpbiB0aGUgVHJlZVdhbGtlcidzIGxvZ2ljYWwgdmlldy4KICAgICovCi0gIHB1YmxpYyBOb2RlIG5leHRTaWJsaW5nKCkKKyAgcHVibGljIGludCBuZXh0U2libGluZygpCiAgIHsKIAotICAgIE5vZGUgbjsgICAgCi0gICAgbiA9IG1fY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICBpbnQgbjsgICAgCisgICAgRFRNIGR0bSA9IGdldERUTShtX3Jvb3QpOworICAgIG4gPSBkdG0uZ2V0TmV4dFNpYmxpbmcobV9jdXJyZW50Tm9kZSk7CiAKLSAgICBtX25leHRMZXZlbEFtb3VudCA9IChudWxsID09IG4pID8gMCA6IChuLmhhc0NoaWxkTm9kZXMoKSA/IDEgOiAwKTsKKyAgICBtX25leHRMZXZlbEFtb3VudCA9IChEVE0uTlVMTCA9PSBuKSA/IDAgOiAoZHRtLmhhc0NoaWxkTm9kZXMobikgPyAxIDogMCk7CiAKIC8vICAgIGlmKG51bGwgIT0gbikKIC8vICAgIHsKLS8vICAgICAgTm9kZSBhdHRyTm9kZSA9IG4uZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgiaWQiKTsKKy8vICAgICAgaW50IGF0dHJOb2RlID0gbi5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJpZCIpOwogLy8gICAgICBpZihudWxsICE9IGF0dHJOb2RlKQogLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibmV4dFNpYmxpbmc6ICIrYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwogLy8gICAgICBlbHNlCkBAIC0yNTMsNyArMjU3LDcgQEAKIAogICAvKiogV2hhdCB0aGlzIGlzIGlzIGZyYW5rbHkgYSBsaXR0bGUgdW5jbGVhci4gIEl0IGlzIHVzZWQgaW4gZ2V0UGFyZW50IAogICAgKiAgdG8gc2VlIGlmIHdlIHNob3VsZCBjb250aW51ZSB0byBjbGltYiB0aGUgdHJlZS4gKi8KLSAgdHJhbnNpZW50IE5vZGUgbV9jdXJyZW50QW5jZXN0b3I7CisgIHRyYW5zaWVudCBpbnQgbV9jdXJyZW50QW5jZXN0b3IgPSBEVE0uTlVMTDsKIAogICAvKioKICAgICogVGVsbCB3aGF0J3MgdGhlIG1heGltdW0gbGV2ZWwgdGhpcyBheGVzIGNhbiBkZXNjZW5kIHRvLgpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9Mb2NQYXRoSXRlcmF0b3IuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvTG9jUGF0aEl0ZXJhdG9yLmphdmEKaW5kZXggZWE0OWIzMy4uZGMyZDYwOCAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9Mb2NQYXRoSXRlcmF0b3IuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL0xvY1BhdGhJdGVyYXRvci5qYXZhCkBAIC02MSwxMyArNjEsMTcgQEAKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKIC8vIERPTSBpbXBvcnRzCi1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuVHJlZVdhbGtlcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLlRyZWVXYWxrZXI7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1NYW5hZ2VyOwogCiAvLyBYYWxhbiBpbXBvcnRzCiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5yZXMuWFBBVEhFcnJvclJlc291cmNlczsKQEAgLTEwMSw4ICsxMDUsNyBAQAogICogaW4gd2hpY2ggY2FzZSB0aGUgVW5pb25QYXRoSXRlcmF0b3Igd2lsbCBjYWNoZSB0aGUgbm9kZXMuPC9wPgogICovCiBwdWJsaWMgY2xhc3MgTG9jUGF0aEl0ZXJhdG9yIGV4dGVuZHMgUHJlZGljYXRlZE5vZGVUZXN0Ci0gICAgICAgIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBOb2RlSXRlcmF0b3IsIENvbnRleHROb2RlTGlzdCwgTm9kZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgamF2YS5pby5TZXJpYWxpemFibGUKKyAgICAgICAgaW1wbGVtZW50cyBDbG9uZWFibGUsIERUTUl0ZXJhdG9yLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQogewogCiAgIC8qKgpAQCAtMTk4LDYgKzIwMSw1MSBAQAogICAgICAgbV9sYXN0VXNlZFdhbGtlciA9IG1fZmlyc3RXYWxrZXI7CiAgICAgfQogICB9CisgIAorICAvKioKKyAgICogU2V0IHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGlzIGl0ZXJhdG9yIG9wZXJhdGVzLCB3aGljaCBzaG91bGQgcHJvdmlkZToKKyAgICogYSBub2RlICh0aGUgY29udGV4dCBub2RlLi4uIHNhbWUgdmFsdWUgYXMgInJvb3QiIGRlZmluZWQgYmVsb3cpIAorICAgKiBhIHBhaXIgb2Ygbm9uLXplcm8gcG9zaXRpdmUgaW50ZWdlcnMgKHRoZSBjb250ZXh0IHBvc2l0aW9uIGFuZCB0aGUgY29udGV4dCBzaXplKSAKKyAgICogYSBzZXQgb2YgdmFyaWFibGUgYmluZGluZ3MgCisgICAqIGEgZnVuY3Rpb24gbGlicmFyeSAKKyAgICogdGhlIHNldCBvZiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGluIHNjb3BlIGZvciB0aGUgZXhwcmVzc2lvbi4KKyAgICogCisgICAqIDxwPkF0IHRoaXMgdGltZSB0aGUgZXhhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBlbnZpcm9ubWVudCBpcyBhcHBsaWNhdGlvbiAKKyAgICogZGVwZW5kZW50LiAgUHJvYmFibHkgYSBwcm9wZXIgaW50ZXJmYWNlIHdpbGwgYmUgY3JlYXRlZCBmYWlybHkgc29vbi48L3A+CisgICAqIAorICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgVGhlIGVudmlyb25tZW50IG9iamVjdC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KE9iamVjdCBlbnZpcm9ubWVudCkKKyAgeworICAgIC8vIG5vLW9wIGZvciBub3cuCisgIH0KKyAgCisgIC8qKgorICAgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgYSBEVE0gdGhhdCAib3ducyIgYSBub2RlIGhhbmRsZS4gIFNpbmNlIGEgbm9kZSAKKyAgICogaXRlcmF0b3IgbWF5IGJlIHBhc3NlZCB3aXRob3V0IGEgRFRNTWFuYWdlciwgdGhpcyBhbGxvd3MgdGhlIAorICAgKiBjYWxsZXIgdG8gZWFzaWx5IGdldCB0aGUgRFRNIHVzaW5nIGp1c3QgdGhlIGl0ZXJhdG9yLgorICAgKgorICAgKiBAcGFyYW0gbm9kZUhhbmRsZSB0aGUgbm9kZUhhbmRsZS4KKyAgICoKKyAgICogQHJldHVybiBhIG5vbi1udWxsIERUTSByZWZlcmVuY2UuCisgICAqLworICBwdWJsaWMgRFRNIGdldERUTShpbnQgbm9kZUhhbmRsZSkKKyAgeworICAgIC8vICVPUFQlCisgICAgcmV0dXJuIG1fZXhlY0NvbnRleHQuZ2V0RFRNKG5vZGVIYW5kbGUpOworICB9CisgIAorICAvKioKKyAgICogR2V0IGFuIGluc3RhbmNlIG9mIHRoZSBEVE1NYW5hZ2VyLiAgU2luY2UgYSBub2RlIAorICAgKiBpdGVyYXRvciBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgYSBEVE1NYW5hZ2VyLCB0aGlzIGFsbG93cyB0aGUgCisgICAqIGNhbGxlciB0byBlYXNpbHkgZ2V0IHRoZSBEVE1NYW5hZ2VyIHVzaW5nIGp1c3QgdGhlIGl0ZXJhdG9yLgorICAgKgorICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgRFRNTWFuYWdlciByZWZlcmVuY2UuCisgICAqLworICBwdWJsaWMgRFRNTWFuYWdlciBnZXREVE1NYW5hZ2VyKCkKKyAgeworICAgIHJldHVybiBtX2V4ZWNDb250ZXh0LmdldERUTU1hbmFnZXIoKTsKKyAgfQogCiAgIC8qKgogICAgKiBFeGVjdXRlIHRoaXMgaXRlcmF0b3IsIG1lYW5pbmcgY3JlYXRlIGEgY2xvbmUgdGhhdCBjYW4KQEAgLTI2OSw2ICszMTcsNyBAQAogICB7CiAKICAgICB0aGlzLm1fY29udGV4dCA9IGV4ZWNDb250ZXh0LmdldEN1cnJlbnROb2RlKCk7CisgICAgbV9jZHRtID0gZXhlY0NvbnRleHQuZ2V0RFRNKG1fY29udGV4dCk7CiAgICAgdGhpcy5tX2N1cnJlbnRDb250ZXh0Tm9kZSA9IGV4ZWNDb250ZXh0LmdldEN1cnJlbnRFeHByZXNzaW9uTm9kZSgpOwogICAgIHRoaXMubV9leGVjQ29udGV4dCA9IGV4ZWNDb250ZXh0OwogICAgIHRoaXMubV9wcmVmaXhSZXNvbHZlciA9IGV4ZWNDb250ZXh0LmdldE5hbWVzcGFjZUNvbnRleHQoKTsKQEAgLTI4Miw2ICszMzEsMzIgQEAKICAgICAgIHRoaXMubV92YXJTdGFja0NvbnRleHQgPSB2YXJzLmdldENvbnRleHRQb3MoKTsKICAgICB9CiAgIH0KKyAgCisgIC8qKgorICAgKiBJbml0aWFsaXplIHRoZSBjb250ZXh0IHZhbHVlcyBmb3IgdGhpcyBleHByZXNzaW9uCisgICAqIGFmdGVyIGl0IGlzIGNsb25lZC4KKyAgICoKKyAgICogQHBhcmFtIGV4ZWNDb250ZXh0IFRoZSBYUGF0aCBydW50aW1lIGNvbnRleHQgZm9yIHRoaXMKKyAgICogdHJhbnNmb3JtYXRpb24uCisgICAqLworICBwdWJsaWMgdm9pZCBpbml0Q29udGV4dChYUGF0aENvbnRleHQgZXhlY0NvbnRleHQsIGludCBjb250ZXh0KQorICB7CisKKyAgICB0aGlzLm1fY29udGV4dCA9IGNvbnRleHQ7CisgICAgbV9jZHRtID0gZXhlY0NvbnRleHQuZ2V0RFRNKG1fY29udGV4dCk7CisgICAgdGhpcy5tX2N1cnJlbnRDb250ZXh0Tm9kZSA9IGNvbnRleHQ7CisgICAgdGhpcy5tX2V4ZWNDb250ZXh0ID0gZXhlY0NvbnRleHQ7CisgICAgdGhpcy5tX3ByZWZpeFJlc29sdmVyID0gZXhlY0NvbnRleHQuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOworICAgIHRoaXMubV9kaGVscGVyID0gZXhlY0NvbnRleHQuZ2V0RE9NSGVscGVyKCk7CisKKyAgICBpZiAobV9pc1RvcExldmVsKQorICAgIHsKKyAgICAgIFZhcmlhYmxlU3RhY2sgdmFycyA9IGV4ZWNDb250ZXh0LmdldFZhclN0YWNrKCk7CisKKyAgICAgIHRoaXMubV92YXJTdGFja1BvcyA9IHZhcnMuZ2V0U2VhcmNoU3RhcnRPclRvcCgpOworICAgICAgdGhpcy5tX3ZhclN0YWNrQ29udGV4dCA9IHZhcnMuZ2V0Q29udGV4dFBvcygpOworICAgIH0KKyAgfQogCiAgIC8qKgogICAgKiBTZXQgdGhlIG5leHQgcG9zaXRpb24gaW5kZXggb2YgdGhpcyBpdGVyYXRvci4KQEAgLTMzMCw2ICs0MDUsMTggQEAKICAgICBlbHNlCiAgICAgICBtX2NhY2hlZE5vZGVzID0gbnVsbDsKICAgfQorICAKKyAgLyoqCisgICAqIFRlbGxzIGlmIHRoaXMgaXRlcmF0b3IgY2FuIGhhdmUgbm9kZXMgYWRkZWQgdG8gaXQgb3Igc2V0IHZpYSAKKyAgICogdGhlIDxjb2RlPnNldEl0ZW0oaW50IG5vZGUsIGludCBpbmRleCk8L2NvZGU+IG1ldGhvZC4KKyAgICogCisgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbm9kZWxpc3QgY2FuIGJlIG11dGF0ZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc011dGFibGUoKQorICB7CisgICAgcmV0dXJuIChtX2NhY2hlZE5vZGVzICE9IG51bGwpOworICB9CisKIAogICAvKioKICAgICogR2V0IGNhY2hlZCBub2Rlcy4KQEAgLTM4OSwxMyArNDc2LDMxIEBACiAgICAqICAgPGNvZGU+Tm9kZUxpc3Q8L2NvZGU+ICwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhhdCBpcyBub3QgYSB2YWxpZAogICAgKiAgIGluZGV4LgogICAgKi8KLSAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpCisgIHB1YmxpYyBpbnQgaXRlbShpbnQgaW5kZXgpCiAgIHsKIAotICAgIHJlc2V0VG9DYWNoZWRMaXN0KCk7CisgICAgLy8gcmVzZXRUb0NhY2hlZExpc3QoKTsKIAogICAgIHJldHVybiBtX2NhY2hlZE5vZGVzLml0ZW0oaW5kZXgpOwogICB9CisgIAorICAvKioKKyAgICogU2V0cyB0aGUgbm9kZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoaXMgdmVjdG9yIHRvIGJlIHRoZQorICAgKiBzcGVjaWZpZWQgbm9kZS4gVGhlIHByZXZpb3VzIGNvbXBvbmVudCBhdCB0aGF0IHBvc2l0aW9uIGlzIGRpc2NhcmRlZC4KKyAgICoKKyAgICogPHA+VGhlIGluZGV4IG11c3QgYmUgYSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzcworICAgKiB0aGFuIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHZlY3Rvci4gIAorICAgKiBUaGUgaXRlcmF0b3IgbXVzdCBiZSBpbiBjYWNoZWQgbW9kZS48L3A+CisgICAqIAorICAgKiA8cD5NZWFudCB0byBiZSB1c2VkIGZvciBzb3J0ZWQgaXRlcmF0b3JzLjwvcD4KKyAgICoKKyAgICogQHBhcmFtIG5vZGUgTm9kZSB0byBzZXQKKyAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHdoZXJlIHRvIHNldCB0aGUgbm9kZQorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0SXRlbShpbnQgbm9kZSwgaW50IGluZGV4KQorICB7CisgICAgbV9jYWNoZWROb2Rlcy5zZXRFbGVtZW50QXQobm9kZSwgaW5kZXgpOworICB9CiAKICAgLyoqCiAgICAqICBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBsaXN0LiBUaGUgcmFuZ2Ugb2YgdmFsaWQgY2hpbGQgbm9kZSBpbmRpY2VzCkBAIC00MDYsOSArNTExLDE4IEBACiAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKICAgewogCi0gICAgcmVzZXRUb0NhY2hlZExpc3QoKTsKLQotICAgIHJldHVybiBtX2NhY2hlZE5vZGVzLmdldExlbmd0aCgpOworICAgIC8vIHJlc2V0VG9DYWNoZWRMaXN0KCk7CisgICAgaWYobV9sYXN0ID4gMCkKKyAgICAgIHJldHVybiBtX2xhc3Q7CisgICAgZWxzZSBpZihudWxsID09IG1fY2FjaGVkTm9kZXMgfHwgIW1fZm91bmRMYXN0KQorICAgIHsKKyAgICAgIG1fbGFzdCA9IGdldExhc3RQb3MobV9leGVjQ29udGV4dCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBtX2xhc3QgPSBtX2NhY2hlZE5vZGVzLmdldExlbmd0aCgpOworICAgIH0KKyAgICByZXR1cm4gbV9sYXN0OwogICB9CiAKICAgLyoqCkBAIC00MTcsNyArNTMxLDcgQEAKICAgICovCiAgIHByaXZhdGUgdm9pZCByZXNldFRvQ2FjaGVkTGlzdCgpCiAgIHsKLQorICAgIC8vICVSRVZJRVclID8gVGhpcyBkb2Vzbid0IHNlZW0gdG8gd29yayBzbyB3ZWxsLi4uCiAgICAgaW50IHBvcyA9IHRoaXMuZ2V0Q3VycmVudFBvcygpOwogCiAgICAgaWYgKChudWxsID09IG1fY2FjaGVkTm9kZXMpIHx8IChwb3MgIT0gMCkpCkBAIC00NDQsMTEgKzU1OCw4IEBACiAgICAqIGl0ZXJhdG9yIGJhY2t3YXJkcyBpbiB0aGUgc2V0LgogICAgKiBAcmV0dXJuICBUaGUgcHJldmlvdXMgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZCBvdmVyLAogICAgKiAgIG9yPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbiB0aGF0IHNldC4KLSAgICogQHRocm93cyBET01FeGNlcHRpb24KLSAgICogICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlCi0gICAqICAgPGNvZGU+ZGV0YWNoPC9jb2RlPiBtZXRob2Qgd2FzIGludm9rZWQuCiAgICAqLwotICBwdWJsaWMgTm9kZSBwcmV2aW91c05vZGUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHB1YmxpYyBpbnQgcHJldmlvdXNOb2RlKCkKICAgewogCiAgICAgaWYgKG51bGwgPT0gbV9jYWNoZWROb2RlcykKQEAgLTQ3NSw3ICs1ODYsNyBAQAogICB7CiAKICAgICAvLyBUT0RPOiA/PwotICAgIHJldHVybiBOb2RlRmlsdGVyLlNIT1dfQUxMICYgfk5vZGVGaWx0ZXIuU0hPV19FTlRJVFlfUkVGRVJFTkNFOworICAgIHJldHVybiBEVE1GaWx0ZXIuU0hPV19BTEwgJiB+RFRNRmlsdGVyLlNIT1dfRU5USVRZX1JFRkVSRU5DRTsKICAgfQogCiAgIC8qKgpAQCAtNDg2LDcgKzU5Nyw3IEBACiAgICAqIEByZXR1cm4gQWx3YXlzIG51bGwuCiAgICAqIEBzZWUgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcgogICAgKi8KLSAgcHVibGljIE5vZGVGaWx0ZXIgZ2V0RmlsdGVyKCkKKyAgcHVibGljIERUTUZpbHRlciBnZXRGaWx0ZXIoKQogICB7CiAgICAgcmV0dXJuIG51bGw7CiAgIH0KQEAgLTQ5Nyw3ICs2MDgsNyBAQAogICAgKiBAcmV0dXJuIFRoZSAicm9vdCIgb2YgdGhpcyBpdGVyYXRvciwgd2hpY2gsIGluIFhQYXRoIHRlcm1zLAogICAgKiBpcyB0aGUgbm9kZSBjb250ZXh0IGZvciB0aGlzIGl0ZXJhdG9yLgogICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0Um9vdCgpCisgIHB1YmxpYyBpbnQgZ2V0Um9vdCgpCiAgIHsKICAgICByZXR1cm4gbV9jb250ZXh0OwogICB9CkBAIC01MzIsNyArNjQzLDggQEAKICAgcHVibGljIHZvaWQgZGV0YWNoKCkKICAgewogCi0gICAgdGhpcy5tX2NvbnRleHQgPSBudWxsOworICAgIHRoaXMubV9jb250ZXh0ID0gRFRNLk5VTEw7CisgICAgbV9jZHRtID0gbnVsbDsKICAgICB0aGlzLm1fZXhlY0NvbnRleHQgPSBudWxsOwogICAgIHRoaXMubV9wcmVmaXhSZXNvbHZlciA9IG51bGw7CiAgICAgdGhpcy5tX2RoZWxwZXIgPSBudWxsOwpAQCAtNTUwLDcgKzY2Miw3IEBACiAgICAqCiAgICAqIEB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24KICAgICovCi0gIHB1YmxpYyBOb2RlSXRlcmF0b3IgY2xvbmVXaXRoUmVzZXQoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24KKyAgcHVibGljIERUTUl0ZXJhdG9yIGNsb25lV2l0aFJlc2V0KCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCiAgIHsKIAogICAgIExvY1BhdGhJdGVyYXRvciBjbG9uZSA9IChMb2NQYXRoSXRlcmF0b3IpIGNsb25lKCk7CkBAIC02MDgsNyArNzIwLDcgQEAKIAogICAgIC8vIHN1cGVyLnJlc2V0KCk7CiAgICAgbV9mb3VuZExhc3QgPSBmYWxzZTsKLSAgICBtX2xhc3RGZXRjaGVkID0gbnVsbDsKKyAgICBtX2xhc3RGZXRjaGVkID0gRFRNLk5VTEw7CiAgICAgbV9uZXh0ID0gMDsKICAgICBtX2xhc3QgPSAwOwogICAgIG1fd2FpdGluZ0JvdHRvbSA9IDA7CkBAIC02MjksMjEgKzc0MSwxOSBAQAogICAgKiB0byBuZXh0Tm9kZSgpIHJldHVybnMgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHNldC4KICAgICogQHJldHVybiAgVGhlIG5leHQgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZCBvdmVyLCBvcgogICAgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBtb3JlIG1lbWJlcnMgaW4gdGhhdCBzZXQuCi0gICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCi0gICAqICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZQotICAgKiAgIDxjb2RlPmRldGFjaDwvY29kZT4gbWV0aG9kIHdhcyBpbnZva2VkLgogICAgKi8KLSAgcHVibGljIE5vZGUgbmV4dE5vZGUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uCisgIHB1YmxpYyBpbnQgbmV4dE5vZGUoKQogICB7CiAKICAgICAvLyBJZiB0aGUgY2FjaGUgaXMgb24sIGFuZCB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGZvdW5kLCB0aGVuIAogICAgIC8vIGp1c3QgcmV0dXJuIGZyb20gdGhlIGxpc3QuCiAgICAgaWYgKChudWxsICE9IG1fY2FjaGVkTm9kZXMpCi0gICAgICAgICAgICAmJiAobV9jYWNoZWROb2Rlcy5nZXRDdXJyZW50UG9zKCkgPCBtX2NhY2hlZE5vZGVzLnNpemUoKSkpCisgICAgICAgICAgICAmJiAobV9uZXh0IDwgbV9jYWNoZWROb2Rlcy5zaXplKCkpKQogICAgIHsKLSAgICAgIE5vZGUgbmV4dCA9IG1fY2FjaGVkTm9kZXMubmV4dE5vZGUoKTsKLQotICAgICAgdGhpcy5zZXRDdXJyZW50UG9zKG1fY2FjaGVkTm9kZXMuZ2V0Q3VycmVudFBvcygpKTsKKyAgICAgIGludCBuZXh0ID0gbV9jYWNoZWROb2Rlcy5lbGVtZW50QXQobV9uZXh0KTsKKyAgICAKKyAgICAgIGluY3JlbWVudE5leHRQb3NpdGlvbigpOworICAgICAgbV9jdXJyZW50Q29udGV4dE5vZGUgPSBuZXh0OwogCiAgICAgICByZXR1cm4gbmV4dDsKICAgICB9CkBAIC02NTgsNyArNzY4LDcgQEAKICAgICAvLyBmcm9tIHRoZSBleGVjdXRlIG1ldGhvZC4KICAgICBpZiAoLTEgPT0gbV92YXJTdGFja1BvcykKICAgICB7Ci0gICAgICBpZiAobnVsbCA9PSBtX2ZpcnN0V2Fsa2VyLmdldFJvb3QoKSkKKyAgICAgIGlmIChEVE0uTlVMTCA9PSBtX2ZpcnN0V2Fsa2VyLmdldFJvb3QoKSkKICAgICAgIHsKICAgICAgICAgdGhpcy5zZXROZXh0UG9zaXRpb24oMCk7CiAgICAgICAgIG1fZmlyc3RXYWxrZXIuc2V0Um9vdChtX2NvbnRleHQpOwpAQCAtNjc4LDcgKzc4OCw3IEBACiAgICAgICB2YXJzLnNldFNlYXJjaFN0YXJ0KG1fdmFyU3RhY2tQb3MpOwogICAgICAgdmFycy5wdXNoQ29udGV4dFBvc2l0aW9uKG1fdmFyU3RhY2tDb250ZXh0KTsKIAotICAgICAgaWYgKG51bGwgPT0gbV9maXJzdFdhbGtlci5nZXRSb290KCkpCisgICAgICBpZiAoRFRNLk5VTEwgPT0gbV9maXJzdFdhbGtlci5nZXRSb290KCkpCiAgICAgICB7CiAgICAgICAgIHRoaXMuc2V0TmV4dFBvc2l0aW9uKDApOwogICAgICAgICBtX2ZpcnN0V2Fsa2VyLnNldFJvb3QobV9jb250ZXh0KTsKQEAgLTY4Niw3ICs3OTYsNyBAQAogICAgICAgICBtX2xhc3RVc2VkV2Fsa2VyID0gbV9maXJzdFdhbGtlcjsKICAgICAgIH0KIAotICAgICAgTm9kZSBuID0gcmV0dXJuTmV4dE5vZGUobV9maXJzdFdhbGtlci5uZXh0Tm9kZSgpKTsKKyAgICAgIGludCBuID0gcmV0dXJuTmV4dE5vZGUobV9maXJzdFdhbGtlci5uZXh0Tm9kZSgpKTsKIAogICAgICAgLy8gVGhlc2UgdHdvIHN0YXRlbWVudHMgbmVlZCB0byBiZSBjb21iaW5lZCBpbnRvIG9uZSBvcGVyYXRpb24uCiAgICAgICB2YXJzLnNldFNlYXJjaFN0YXJ0KHNhdmVkU3RhcnQpOwpAQCAtNzA0LDEwICs4MTQsMTAgQEAKICAgICoKICAgICogQHJldHVybiBUaGUgc2FtZSBub2RlIHRoYXQgd2FzIHBhc3NlZCBhcyBhbiBhcmd1bWVudC4KICAgICovCi0gIHByb3RlY3RlZCBOb2RlIHJldHVybk5leHROb2RlKE5vZGUgbmV4dE5vZGUpCisgIHByb3RlY3RlZCBpbnQgcmV0dXJuTmV4dE5vZGUoaW50IG5leHROb2RlKQogICB7CiAKLSAgICBpZiAobnVsbCAhPSBuZXh0Tm9kZSkKKyAgICBpZiAoRFRNLk5VTEwgIT0gbmV4dE5vZGUpCiAgICAgewogICAgICAgaWYgKG51bGwgIT0gbV9jYWNoZWROb2RlcykKICAgICAgICAgbV9jYWNoZWROb2Rlcy5hZGRFbGVtZW50KG5leHROb2RlKTsKQEAgLTcxNyw3ICs4MjcsNyBAQAogCiAgICAgbV9sYXN0RmV0Y2hlZCA9IG5leHROb2RlOwogCi0gICAgaWYgKG51bGwgPT0gbmV4dE5vZGUpCisgICAgaWYgKERUTS5OVUxMID09IG5leHROb2RlKQogICAgICAgbV9mb3VuZExhc3QgPSB0cnVlOwogCiAgICAgcmV0dXJuIG5leHROb2RlOwpAQCAtNzI4LDcgKzgzOCw3IEBACiAgICAqCiAgICAqIEByZXR1cm4gVGhlIGxhc3QgZmV0Y2hlZCBub2RlLCBvciBudWxsIGlmIHRoZSBsYXN0IGZldGNoIHdhcyBudWxsLgogICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0Q3VycmVudE5vZGUoKQorICBwdWJsaWMgaW50IGdldEN1cnJlbnROb2RlKCkKICAgewogICAgIHJldHVybiBtX2xhc3RGZXRjaGVkOwogICB9CkBAIC03NDgsMTUgKzg1OCwxNSBAQAogICAgIGlmIChtX2ZvdW5kTGFzdCB8fCAoKGluZGV4ID49IDApICYmIChpbmRleCA8PSBnZXRDdXJyZW50UG9zKCkpKSkKICAgICAgIHJldHVybjsKIAotICAgIE5vZGUgbjsKKyAgICBpbnQgbjsKIAogICAgIGlmICgtMSA9PSBpbmRleCkKICAgICB7Ci0gICAgICB3aGlsZSAobnVsbCAhPSAobiA9IG5leHROb2RlKCkpKTsKKyAgICAgIHdoaWxlIChEVE0uTlVMTCAhPSAobiA9IG5leHROb2RlKCkpKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgIHdoaWxlIChudWxsICE9IChuID0gbmV4dE5vZGUoKSkpCisgICAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKG4gPSBuZXh0Tm9kZSgpKSkKICAgICAgIHsKICAgICAgICAgaWYgKGdldEN1cnJlbnRQb3MoKSA+PSBpbmRleCkKICAgICAgICAgICBicmVhazsKQEAgLTg2OSw3ICs5NzksNyBAQAogICAgKgogICAgKiBAcmV0dXJuIFRoZSBub2RlIGNvbnRleHQsIHNhbWUgYXMgZ2V0Um9vdCgpLgogICAgKi8KLSAgcHVibGljIGZpbmFsIE5vZGUgZ2V0Q29udGV4dCgpCisgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29udGV4dCgpCiAgIHsKICAgICByZXR1cm4gbV9jb250ZXh0OwogICB9CkBAIC04ODAsNyArOTkwLDcgQEAKICAgICoKICAgICogQHJldHVybiBUaGUgdG9wLWxldmVsIG5vZGUgY29udGV4dCBvZiB0aGUgZW50aXJlIGV4cHJlc3Npb24uCiAgICAqLwotICBwdWJsaWMgZmluYWwgTm9kZSBnZXRDdXJyZW50Q29udGV4dE5vZGUoKQorICBwdWJsaWMgZmluYWwgaW50IGdldEN1cnJlbnRDb250ZXh0Tm9kZSgpCiAgIHsKICAgICByZXR1cm4gbV9jdXJyZW50Q29udGV4dE5vZGU7CiAgIH0KQEAgLTg5MCwxMCArMTAwMCwyMiBAQAogICAgKgogICAgKiBAcGFyYW0gbiBNdXN0IGJlIGEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIHRoZSBub2RlIGNvbnRleHQuCiAgICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDdXJyZW50Q29udGV4dE5vZGUoTm9kZSBuKQorICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDdXJyZW50Q29udGV4dE5vZGUoaW50IG4pCiAgIHsKICAgICBtX2N1cnJlbnRDb250ZXh0Tm9kZSA9IG47CiAgIH0KKyAgCisgIC8qKgorICAgKiBTZXQgdGhlIGN1cnJlbnQgY29udGV4dCBub2RlIGZvciB0aGlzIGl0ZXJhdG9yLgorICAgKgorICAgKiBAcGFyYW0gbiBNdXN0IGJlIGEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIHRoZSBub2RlIGNvbnRleHQuCisgICAqLworICBwdWJsaWMgZmluYWwgdm9pZCBzZXRSb290KGludCBuKQorICB7CisgICAgbV9jb250ZXh0ID0gbjsKKyAgICBtX2NkdG0gPSBtX2V4ZWNDb250ZXh0LmdldERUTShuKTsKKyAgfQorCiAKICAgLyoqCiAgICAqIFJldHVybiB0aGUgc2F2ZWQgcmVmZXJlbmNlIHRvIHRoZSBwcmVmaXggcmVzb2x2ZXIgdGhhdApAQCAtOTE0LDcgKzEwMzYsNyBAQAogICAgKi8KICAgcHVibGljIGludCBnZXRMYXN0KCkKICAgewotICAgIHJldHVybiBtX2xhc3Q7CisgICAgcmV0dXJuIGdldExlbmd0aCgpOwogICB9CiAKICAgLyoqCkBAIC05NDMsMTggKzEwNjUsMjMgQEAKIAogICAgIHRyeQogICAgIHsKLSAgICAgIGNsb25lID0gKExvY1BhdGhJdGVyYXRvcikgY2xvbmUoKTsKKyAgICAgIC8vICVSRVZJRVclICVPUFQlCisgICAgICBpZigwID09IHBvcyAmJiBtX2N1cnJlbnRDb250ZXh0Tm9kZSAhPSBEVE0uTlVMTCkKKyAgICAgICAgY2xvbmUgPSAoTG9jUGF0aEl0ZXJhdG9yKSBjbG9uZVdpdGhSZXNldCgpOworICAgICAgZWxzZQorICAgICAgICBjbG9uZSA9IChMb2NQYXRoSXRlcmF0b3IpIGNsb25lKCk7CiAgICAgfQogICAgIGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjbnNlKQogICAgIHsKICAgICAgIHJldHVybiAtMTsKICAgICB9CisgICAgLy8gJVJFVklFVyUgQ29tbWVudGVkIHRoaXMgb3V0LCBhcyBpdCB3YXMgbWVzc2luZyB1cCBwb3M2OCB0ZXN0LiBjb3VudC0xPworICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2xvbmUuZ2V0UHJlZGljYXRlQ291bnQoKTogIitjbG9uZS5nZXRQcmVkaWNhdGVDb3VudCgpKTsKKyAgICAvLyBjbG9uZS5zZXRQcmVkaWNhdGVDb3VudChjbG9uZS5nZXRQcmVkaWNhdGVDb3VudCgpIC0gMSk7CiAKLSAgICBjbG9uZS5zZXRQcmVkaWNhdGVDb3VudChjbG9uZS5nZXRQcmVkaWNhdGVDb3VudCgpIC0gMSk7CisgICAgaW50IG5leHQ7CiAKLSAgICBOb2RlIG5leHQ7Ci0KLSAgICB3aGlsZSAobnVsbCAhPSAobmV4dCA9IGNsb25lLm5leHROb2RlKCkpKQorICAgIHdoaWxlIChEVE0uTlVMTCAhPSAobmV4dCA9IGNsb25lLm5leHROb2RlKCkpKQogICAgIHsKICAgICAgIHBvcysrOwogICAgIH0KQEAgLTEwMDcsNiArMTEzNCwxMiBAQAogICAKICAgLy89PT09PT09PT09PT09IFN0YXRlIERhdGEgPT09PT09PT09PT09PQogICAKKyAgLyoqIAorICAgKiBUaGUgZHRtIG9mIHRoZSBjb250ZXh0IG5vZGUuICBDYXJlZnVsIGFib3V0IHVzaW5nIHRoaXMuLi4gaXQgbWF5IG5vdCAKKyAgICogYmUgdGhlIGR0bSBvZiB0aGUgY3VycmVudCBub2RlLgorICAgKi8KKyAgdHJhbnNpZW50IHByb3RlY3RlZCBEVE0gbV9jZHRtOworICAKICAgLyoqIFRoZSBzdGFydGluZyBwb2ludCBpbiBtX3dhaXRpbmcgd2hlcmUgdGhlIHdhaXRpbmcgc3RlcCB3YWxrZXJzIGFyZS4gKi8KICAgdHJhbnNpZW50IGludCBtX3dhaXRpbmdCb3R0b20gPSAwOwogCkBAIC0xMDQyLDcgKzExNzUsNyBAQAogICAvLyBPYmplY3RQb29sIG1fcG9vbCA9IG5ldyBPYmplY3RQb29sKHRoaXMuZ2V0Q2xhc3MoKSk7CiAKICAgLyoqIFRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgZmV0Y2hlZCwgdXN1YWxseSBieSBuZXh0Tm9kZS4gKi8KLSAgdHJhbnNpZW50IHB1YmxpYyBOb2RlIG1fbGFzdEZldGNoZWQ7CisgIHRyYW5zaWVudCBwdWJsaWMgaW50IG1fbGFzdEZldGNoZWQgPSBEVE0uTlVMTDsKIAogICAvKioKICAgICogSWYgdGhpcyBpdGVyYXRvciBuZWVkcyB0byBjYWNoZSBub2RlcyB0aGF0IGFyZSBmZXRjaGVkLCB0aGV5CkBAIC0xMDcxLDcgKzEyMDQsNyBAQAogICAgKiBUaGUgY29udGV4dCBub2RlIGZvciB0aGlzIGl0ZXJhdG9yLCB3aGljaCBkb2Vzbid0IGNoYW5nZSB0aHJvdWdoCiAgICAqIHRoZSBjb3Vyc2Ugb2YgdGhlIGl0ZXJhdGlvbi4KICAgICovCi0gIHRyYW5zaWVudCBwcm90ZWN0ZWQgTm9kZSBtX2NvbnRleHQ7CisgIHRyYW5zaWVudCBwcm90ZWN0ZWQgaW50IG1fY29udGV4dCA9IERUTS5OVUxMOwogCiAgIC8qKgogICAgKiBUaGUgbm9kZSBjb250ZXh0IGZyb20gd2hlcmUgdGhlIGV4cHJlc3Npb24gaXMgYmVpbmcKQEAgLTEwNzksNyArMTIxMiw3IEBACiAgICAqIGZyb20gbV9jb250ZXh0IGluIHRoYXQgdGhpcyBpcyB0aGUgY29udGV4dCBmb3IgdGhlIGVudGlyZQogICAgKiBleHByZXNzaW9uLCByYXRoZXIgdGhhbiB0aGUgY29udGV4dCBmb3IgdGhlIHN1YmV4cHJlc3Npb24uCiAgICAqLwotICB0cmFuc2llbnQgcHJvdGVjdGVkIE5vZGUgbV9jdXJyZW50Q29udGV4dE5vZGU7CisgIHRyYW5zaWVudCBwcm90ZWN0ZWQgaW50IG1fY3VycmVudENvbnRleHROb2RlID0gRFRNLk5VTEw7CiAKICAgLyoqCiAgICAqIEZhc3QgYWNjZXNzIHRvIHRoZSBjdXJyZW50IHByZWZpeCByZXNvbHZlci4gIEl0IGlzbid0IHJlYWxseQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9OYW1lc3BhY2VXYWxrZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvTmFtZXNwYWNlV2Fsa2VyLmphdmEKaW5kZXggZjIyMzY1MC4uYjYwYjg4NCAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9OYW1lc3BhY2VXYWxrZXIuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL05hbWVzcGFjZVdhbGtlci5qYXZhCkBAIC02Miw4ICs2Miw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiAvKioKICAqIFdhbGtlciBmb3IgdGhlICduYW1lc3BhY2UnIGF4ZXMuCkBAIC04Myw2NiArODQsMjAgQEAKICAgfQogCiAgIC8qKgotICAgKiBHZXQgYSBjbG9uZWQgQXhlc1dhbGtlci4KLSAgICoKLSAgICogQHJldHVybiBBIGNsb25lZCBOYW1lc3BhY2VXYWxrZXIuCi0gICAqCi0gICAqIEB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24KLSAgewotCi0gICAgTmFtZXNwYWNlV2Fsa2VyIGNsb25lID0gKE5hbWVzcGFjZVdhbGtlcikgc3VwZXIuY2xvbmUoKTsKLQotICAgIGlmIChudWxsICE9IHRoaXMubV9uYW1lc3BhY2VzKQotICAgIHsKLSAgICAgIGNsb25lLm1fbmFtZXNwYWNlcyA9IChTdGFjaykgdGhpcy5tX25hbWVzcGFjZXMuY2xvbmUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY2xvbmU7Ci0gIH0KLQotICAvKioKLSAgICogIFNldCB0aGUgcm9vdCBub2RlIG9mIHRoZSBUcmVlV2Fsa2VyLgorICAgKiAgVGhlIHJvb3Qgbm9kZSBvZiB0aGUgVHJlZVdhbGtlci4KICAgICoKICAgICogQHBhcmFtIHJvb3QgVGhlIGNvbnRleHQgbm9kZSBvZiB0aGlzIHN0ZXAuCiAgICAqLwotICBwdWJsaWMgdm9pZCBzZXRSb290KE5vZGUgcm9vdCkKKyAgcHVibGljIHZvaWQgc2V0Um9vdChpbnQgcm9vdCkKICAgewogCi0gICAgbV9uZXh0TGV2ZWxBbW91bnQgPSAxOwotICAgIG1fbmFtZXNwYWNlcyA9IG5ldyBTdGFjaygpOworICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hpbGRXYWxrZXIuc2V0Um9vdCIpOworICAgIG1fbmV4dExldmVsQW1vdW50ID0gKGdldERUTShyb290KS5nZXRGaXJzdE5hbWVzcGFjZU5vZGUocm9vdCwgdHJ1ZSkgIT0gRFRNLk5VTEwpID8gMSA6IDA7CiAKLSAgICBOb2RlIG5zQ29udGV4dCA9IHJvb3Q7Ci0KLSAgICB3aGlsZSAobnVsbCAhPSBuc0NvbnRleHQpCi0gICAgewotICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZUxpc3QgPSBuc0NvbnRleHQuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICBpZiAobnVsbCAhPSBhdHRyaWJ1dGVMaXN0KQotICAgICAgewotICAgICAgICBpbnQgbkF0dHJzID0gYXR0cmlidXRlTGlzdC5nZXRMZW5ndGgoKTsKLQotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNldFJvb3QgLSBuQXR0cnM6ICIrbkF0dHJzKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IChuQXR0cnMgLSAxKTsgaSA+PSAwOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIGF0dHIgPSBhdHRyaWJ1dGVMaXN0Lml0ZW0oaSk7Ci0KLSAgICAgICAgICBpZiAobV9scGkuZ2V0RE9NSGVscGVyKCkuaXNOYW1lc3BhY2VOb2RlKGF0dHIpKQotICAgICAgICAgIHsKLQotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZXRSb290IC0gcHVzaGluZyBuYW1lc3BhY2U6ICIrYXR0ci5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgICAgIG1fbmFtZXNwYWNlcy5wdXNoKGF0dHIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBuc0NvbnRleHQgPSBuc0NvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotICAgIH0KLQorICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQmFjayBmcm9tIGNhbGxpbmcgaGFzQ2hpbGROb2RlcyIpOwogICAgIHN1cGVyLnNldFJvb3Qocm9vdCk7CiAKLSAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PSIpOworICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhpdGluZyBDaGlsZFdhbGtlci5zZXRSb290Iik7CiAgIH0KIAogICAvKioKQEAgLTE1MywxMiArMTA4LDIyIEBACiAgICAqIEByZXR1cm4gIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KICAgICogICB2aXNpYmxlIGNoaWxkcmVuIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgZmlyc3RDaGlsZCgpCisgIHB1YmxpYyBpbnQgZmlyc3RDaGlsZCgpCiAgIHsKIAorICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hpbGRXYWxrZXIuZmlyc3RDaGlsZCIpOwogICAgIG1fbmV4dExldmVsQW1vdW50ID0gMDsKIAotICAgIHJldHVybiBuZXh0U2libGluZygpOworICAgIGlmIChtX3Jvb3QgPT0gbV9jdXJyZW50Tm9kZSkKKyAgICB7CisgICAgICBEVE0gZHRtID0gZ2V0RFRNKG1fcm9vdCk7CisgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5hbWVzcGFjZVdhbGtlciAtIENhbGxpbmcgZ2V0Rmlyc3ROYW1lc3BhY2VOb2RlOiAiK2R0bS5nZXROb2RlTmFtZShtX2N1cnJlbnROb2RlKSk7CisgICAgICBpbnQgbnNOb2RlID0gZHRtLmdldEZpcnN0TmFtZXNwYWNlTm9kZShtX2N1cnJlbnROb2RlLCB0cnVlKTsKKyAgICAgIAorICAgICAgcmV0dXJuIHNldEN1cnJlbnRJZk5vdE51bGwobnNOb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIERUTS5OVUxMOwogICB9CiAKICAgLyoqCkBAIC0xNjgsMTggKzEzMywyMSBAQAogICAgKiBAcmV0dXJuICBUaGUgbmV3IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vCiAgICAqICAgbmV4dCBzaWJsaW5nIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgbmV4dFNpYmxpbmcoKQorICBwdWJsaWMgaW50IG5leHRTaWJsaW5nKCkKICAgewogCi0gICAgTm9kZSBuZXh0ID0gbV9uYW1lc3BhY2VzLmlzRW1wdHkoKSA/IG51bGwgOiAoTm9kZSkgbV9uYW1lc3BhY2VzLnBvcCgpOwotCi0gICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJuZXh0U2libGluZzogIit0aGlzLm5vZGVUb1N0cmluZyhuZXh0KSk7Ci0gICAgcmV0dXJuIHRoaXMuc2V0Q3VycmVudElmTm90TnVsbChuZXh0KTsKKyAgICBpZiAobV9yb290ICE9IG1fY3VycmVudE5vZGUpCisgICAgeworICAgICAgRFRNIGR0bSA9IGdldERUTShtX3Jvb3QpOworICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJOYW1lc3BhY2VXYWxrZXIgLSBDYWxsaW5nIGdldE5leHROYW1lc3BhY2VOb2RlOiAiK2R0bS5nZXROb2RlTmFtZShtX2N1cnJlbnROb2RlKSk7CisgICAgICBpbnQgbnNOb2RlID0gZHRtLmdldE5leHROYW1lc3BhY2VOb2RlKG1fcm9vdCwgbV9jdXJyZW50Tm9kZSwgdHJ1ZSk7CisgICAgICAKKyAgICAgIHJldHVybiBzZXRDdXJyZW50SWZOb3ROdWxsKG5zTm9kZSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBEVE0uTlVMTDsKICAgfQogCi0gIC8qKiBTdGFjayBvZiBuYW1lc3BhY2UgZGVjbCBub2RlcyAoeG1sbnMgYXR0cmlidXRlcykuICAgKi8KLSAgdHJhbnNpZW50IFN0YWNrIG1fbmFtZXNwYWNlczsKLQogICAvKioKICAgICogVGVsbCB3aGF0J3MgdGhlIG1heGltdW0gbGV2ZWwgdGhpcyBheGVzIGNhbiBkZXNjZW5kIHRvLgogICAgKgpAQCAtMTg3LDYgKzE1NSw2IEBACiAgICAqLwogICBwcm90ZWN0ZWQgaW50IGdldExldmVsTWF4KCkKICAgewotICAgIHJldHVybiBtX2xwaS5nZXRET01IZWxwZXIoKS5nZXRMZXZlbChtX3Jvb3QpOworICAgIHJldHVybiBnZXREVE0obV9yb290KS5nZXRMZXZlbChtX3Jvb3QpOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL1BhcmVudFdhbGtlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9QYXJlbnRXYWxrZXIuamF2YQppbmRleCA5MGI0MGUwLi5jMTk4YjgxIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL1BhcmVudFdhbGtlci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvUGFyZW50V2Fsa2VyLmphdmEKQEAgLTYwLDcgKzYwLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0OwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogLyoqCiAgKiBXYWxrZXIgZm9yIHRoZSAncGFyZW50JyBheGVzLgpAQCAtODQsNyArODUsNyBAQAogICAgKgogICAgKiBAcGFyYW0gcm9vdCBUaGUgY29udGV4dCBub2RlIG9mIHRoaXMgc3RlcC4KICAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJvb3QoTm9kZSByb290KQorICBwdWJsaWMgdm9pZCBzZXRSb290KGludCByb290KQogICB7CiAKICAgICBtX2dvdFBhcmVudCA9IGZhbHNlOwpAQCAtMTAxLDcgKzEwMiw3IEBACiAgICAqIEByZXR1cm4gIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KICAgICogICB2aXNpYmxlIGNoaWxkcmVuIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgZmlyc3RDaGlsZCgpCisgIHB1YmxpYyBpbnQgZmlyc3RDaGlsZCgpCiAgIHsKIAogICAgIC8vIEZvbGxvdyBydWxlIGFib3V0IHJldHVybmluZyB0aGUgZmlyc3Qgb2NjdXJpbmcgaW4gZG9jdW1lbnQgb3JkZXIgCkBAIC0xMTAsMTMgKzExMSwxMiBAQAogICAgIHsKICAgICAgIG1fZ290UGFyZW50ID0gdHJ1ZTsKIAotICAgICAgLy8gUGF0Y2ggZnJvbSBNZXJsaW4KLSAgICAgIE5vZGUgbiA9IG1fbHBpLmdldERPTUhlbHBlcigpLmdldFBhcmVudE9mTm9kZShtX3Jvb3QpOworICAgICAgaW50IG4gPSBnZXREVE0obV9yb290KS5nZXRQYXJlbnQobV9yb290KTsKIAogICAgICAgcmV0dXJuIHNldEN1cnJlbnRJZk5vdE51bGwobik7CiAgICAgfQogCi0gICAgcmV0dXJuIG51bGw7CisgICAgcmV0dXJuIERUTS5OVUxMOwogICB9CiAKICAgLyoqIFRydWUgaWYgd2UgYWxyZWFkeSBvYnRhaW5lZCB0aGUgcGFyZW50IG5vZGUuICAqLwpAQCAtMTI5LDYgKzEyOSw2IEBACiAgICAqLwogICBwcm90ZWN0ZWQgaW50IGdldExldmVsTWF4KCkKICAgewotICAgIHJldHVybiBtX2xwaS5nZXRET01IZWxwZXIoKS5nZXRMZXZlbChtX3Jvb3QpIC0gMTsKKyAgICByZXR1cm4gZ2V0RFRNKG1fcm9vdCkuZ2V0TGV2ZWwobV9yb290KSAtIDE7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvUHJlY2VkaW5nU2libGluZ1dhbGtlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9QcmVjZWRpbmdTaWJsaW5nV2Fsa2VyLmphdmEKaW5kZXggNjZkY2E3OC4uNGUxM2Y2MCAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9QcmVjZWRpbmdTaWJsaW5nV2Fsa2VyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9QcmVjZWRpbmdTaWJsaW5nV2Fsa2VyLmphdmEKQEAgLTYwLDcgKzYwLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0OwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogLyoqCiAgKiBXYWxrZXIgZm9yIHRoZSAncHJlY2VkaW5nLXNpYmxpbmcnIGF4ZXMuCkBAIC04OSwzNyArOTAsMzggQEAKICAgICogQHJldHVybiAgVGhlIG5ldyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwogICAgKiAgIG5leHQgc2libGluZyBpbiB0aGUgVHJlZVdhbGtlcidzIGxvZ2ljYWwgdmlldy4KICAgICovCi0gIHB1YmxpYyBOb2RlIG5leHRTaWJsaW5nKCkKKyAgcHVibGljIGludCBuZXh0U2libGluZygpCiAgIHsKIAotICAgIE5vZGUgbmV4dDsKKyAgICBpbnQgbmV4dDsKIAorICAgIERUTSBkdG0gPSBnZXREVE0obV9yb290KTsKICAgICBpZiAobV9jdXJyZW50Tm9kZSA9PSBtX3Jvb3QpCiAgICAgewotICAgICAgaWYobV9jdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCisgICAgICBpZihkdG0uZ2V0Tm9kZVR5cGUobV9jdXJyZW50Tm9kZSkgPT0gRFRNLkFUVFJJQlVURV9OT0RFKQogICAgICAgewogICAgICAgICAvLyB0aGVuIGRvbid0IGJvdGhlciwgc2luY2UgYXR0cmlidXRlcyBkb24ndCBoYXZlIHNpYmxpbmdzLgogICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHdvdWxkIGdvIHVwIHRvIHRoZSBwYXJlbnQsIGFuZCBnZXQgdGhlIHNvLWNhbGxlZCAKICAgICAgICAgLy8gZmlyc3QgYXR0cmlidXRlLgotICAgICAgICBuZXh0ID0gbnVsbDsKKyAgICAgICAgbmV4dCA9IERUTS5OVUxMOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewotICAgICAgICBOb2RlIHBhcmVudCA9IG1fbHBpLmdldERPTUhlbHBlcigpLmdldFBhcmVudE9mTm9kZShtX2N1cnJlbnROb2RlKTsKKyAgICAgICAgaW50IHBhcmVudCA9IGR0bS5nZXRQYXJlbnQobV9jdXJyZW50Tm9kZSk7CiAgIAotICAgICAgICBpZiAobnVsbCA9PSBwYXJlbnQpCi0gICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChEVE0uTlVMTCA9PSBwYXJlbnQpCisgICAgICAgICAgcmV0dXJuIERUTS5OVUxMOwogICAKLSAgICAgICAgbmV4dCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIG5leHQgPSBkdG0uZ2V0Rmlyc3RDaGlsZChwYXJlbnQpOwogICAgICAgfQogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgbmV4dCA9IG1fY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgIG5leHQgPSBkdG0uZ2V0TmV4dFNpYmxpbmcobV9jdXJyZW50Tm9kZSk7CiAgICAgfQogCi0gICAgaWYgKG51bGwgIT0gbmV4dCAmJiBuZXh0LmVxdWFscyhtX3Jvb3QpKQotICAgICAgbmV4dCA9IG51bGw7CisgICAgaWYgKERUTS5OVUxMICE9IG5leHQgJiYgbmV4dCA9PSBtX3Jvb3QpCisgICAgICBuZXh0ID0gRFRNLk5VTEw7CiAKICAgICByZXR1cm4gc2V0Q3VycmVudElmTm90TnVsbChuZXh0KTsKICAgfQpAQCAtMTMxLDYgKzEzMyw2IEBACiAgICAqLwogICBwcm90ZWN0ZWQgaW50IGdldExldmVsTWF4KCkKICAgewotICAgIHJldHVybiBtX2xwaS5nZXRET01IZWxwZXIoKS5nZXRMZXZlbChtX3Jvb3QpOworICAgIHJldHVybiBnZXREVE0obV9yb290KS5nZXRMZXZlbChtX3Jvb3QpOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL1ByZWNlZGluZ1dhbGtlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9QcmVjZWRpbmdXYWxrZXIuamF2YQppbmRleCBiMzIzZDNkLi45ZTc0MWY4IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL1ByZWNlZGluZ1dhbGtlci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvUHJlY2VkaW5nV2Fsa2VyLmphdmEKQEAgLTYxLDcgKzYxLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLkRPTUhlbHBlcjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIC8qKgogICogV2Fsa2VyIGZvciB0aGUgJ3ByZWNlZGluZycgYXhlcy4KQEAgLTkwLDE5ICs5MSwxOSBAQAogICAgKgogICAgKiBAcGFyYW0gcm9vdCBUaGUgY29udGV4dCBub2RlIG9mIHRoaXMgc3RlcC4KICAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJvb3QoTm9kZSByb290KQorICBwdWJsaWMgdm9pZCBzZXRSb290KGludCByb290KQogICB7Ci0KLSAgICBpZiAoTm9kZS5BVFRSSUJVVEVfTk9ERSA9PSByb290LmdldE5vZGVUeXBlKCkpCisgICAgRFRNIGR0bSA9IGdldERUTShyb290KTsKKyAgICBpZiAoRFRNLkFUVFJJQlVURV9OT0RFID09IGR0bS5nZXROb2RlVHlwZShyb290KSkKICAgICB7Ci0gICAgICByb290ID0gbV9scGkuZ2V0RE9NSGVscGVyKCkuZ2V0UGFyZW50T2ZOb2RlKHJvb3QpOworICAgICAgcm9vdCA9IGR0bS5nZXRQYXJlbnQocm9vdCk7CiAgICAgfQogCiAgICAgc3VwZXIuc2V0Um9vdChyb290KTsKIAotICAgIG1fZG9jID0gbV9scGkuZ2V0RE9NSGVscGVyKCkuZ2V0Um9vdE5vZGUocm9vdCk7CisgICAgbV9kb2MgPSBkdG0uZ2V0RG9jdW1lbnQoKTsKICAgICBtX2N1cnJlbnROb2RlID0gbV9kb2M7Ci0gICAgbV9uZXh0TGV2ZWxBbW91bnQgPSByb290Lmhhc0NoaWxkTm9kZXMoKSA/IDEgOiAwOworICAgIG1fbmV4dExldmVsQW1vdW50ID0gKGR0bS5nZXRGaXJzdENoaWxkKHJvb3QpICE9IERUTS5OVUxMKSA/IDEgOiAwOwogCiAgICAgc3VwZXIucmVzZXRQcm94aW1pdHlQb3NpdGlvbnMoKTsKICAgfQpAQCAtMTIwLDI2ICsxMjEsMjYgQEAKICAgICogQHJldHVybiAgVGhlIG5ldyBwYXJlbnQgbm9kZSwgb3IgbnVsbCBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubyBwYXJlbnQKICAgICogICBpbiB0aGUgVHJlZVdhbGtlcidzIGxvZ2ljYWwgdmlldy4KICAgICovCi0gIHB1YmxpYyBOb2RlIHBhcmVudE5vZGUoKQorICBwdWJsaWMgaW50IHBhcmVudE5vZGUoKQogICB7CiAKLSAgICBOb2RlIG5leHQgPSBtX2N1cnJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKKyAgICBpbnQgbmV4dCA9IGdldERUTShtX2N1cnJlbnROb2RlKS5nZXRQYXJlbnQobV9jdXJyZW50Tm9kZSk7CiAKICAgICAvLyBJZiB3ZSdyZSBhdCB0aGUgcm9vdCBvZiB0aGUgdHJlZSwgd2UncmUgZG9uZS4KLSAgICBpZiAoKG51bGwgPT0gbmV4dCkgfHwgbV9kb2MuZXF1YWxzKG5leHQpKQotICAgICAgcmV0dXJuIG51bGw7CisgICAgaWYgKChEVE0uTlVMTCA9PSBuZXh0KSB8fCBtX2RvYyA9PSBuZXh0KQorICAgICAgcmV0dXJuIERUTS5OVUxMOwogCiAgICAgLy8gSWYgdGhlIHBhcmVudCB2ZXJ0aWNlIGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBzdGVwIAogICAgIC8vIGNvbnRleHQsIHRoZW4gYWxsIHNpYmxpbmdzIGFyZSB0byB0aGUgbGVmdCBvZiB0aGUgCiAgICAgLy8gYW5jZXN0b3IgcGF0aCwgc28gd2UncmUgZG9uZS4KICAgICBpZiAoaXNBbmNlc3Rvck9mUm9vdENvbnRleHQobmV4dCkpCi0gICAgICByZXR1cm4gbnVsbDsKKyAgICAgIHJldHVybiBEVE0uTlVMTDsKIAogICAgIG1fbmV4dExldmVsQW1vdW50ID0gMDsKIAogLy8gICAgaWYobnVsbCAhPSBuZXh0KQogLy8gICAgewotLy8gICAgICBOb2RlIGF0dHJOb2RlID0gbmV4dC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJpZCIpOworLy8gICAgICBpbnQgYXR0ck5vZGUgPSBuZXh0LmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oImlkIik7CiAvLyAgICAgIGlmKG51bGwgIT0gYXR0ck5vZGUpCiAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwYXJlbnROb2RlOiAiK2F0dHJOb2RlLmdldE5vZGVWYWx1ZSgpKTsKIC8vICAgICAgZWxzZQpAQCAtMTU5LDIzICsxNjAsMjUgQEAKICAgICogQHJldHVybiAgVGhlIG5ldyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwogICAgKiAgIHZpc2libGUgY2hpbGRyZW4gaW4gdGhlIFRyZWVXYWxrZXIncyBsb2dpY2FsIHZpZXcuCiAgICAqLwotICBwdWJsaWMgTm9kZSBmaXJzdENoaWxkKCkKKyAgcHVibGljIGludCBmaXJzdENoaWxkKCkKICAgewogCiAgICAgLy8gV2FsayBkb3duIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGN1cnJlbnQgc3ViLXRyZWUuCiAgICAgLy8gR2V0IHRoZSBuZXh0IGNoaWxkIG9uIHRoZSAncHJlY2VkaW5nJyBheGVzLiBUaGlzIHdpbGwgCiAgICAgLy8gc2tpcCBhbnkgY2hpbGRyZW4gbm9kZXMgdGhhdCBhcmUgYW5jZXN0b3JzIG9mIHRoZSBzdGVwIGNvbnRleHQsCiAgICAgLy8gYnV0IHdpbGwgcmV0dXJuIGNoaWxkcmVuIG9mIHRob3NlIG5vZGVzLgotICAgIGlmIChtX3Jvb3QuZXF1YWxzKG1fY3VycmVudE5vZGUpKQotICAgICAgcmV0dXJuIG51bGw7CisgICAgaWYgKG1fcm9vdCA9PSBtX2N1cnJlbnROb2RlKQorICAgICAgcmV0dXJuIERUTS5OVUxMOwogCi0gICAgTm9kZSBuZXh0Tm9kZSA9IG1fY3VycmVudE5vZGU7CisgICAgaW50IG5leHROb2RlID0gbV9jdXJyZW50Tm9kZTsKKyAgICAKKyAgICBEVE0gZHRtID0gZ2V0RFRNKG1fcm9vdCk7CiAKLSAgICB3aGlsZSAobnVsbCAhPSBuZXh0Tm9kZSkKKyAgICB3aGlsZSAoRFRNLk5VTEwgIT0gbmV4dE5vZGUpCiAgICAgewotICAgICAgTm9kZSBuID0gbmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgaW50IG4gPSBkdG0uZ2V0Rmlyc3RDaGlsZChuZXh0Tm9kZSk7CiAKLSAgICAgIGlmIChudWxsICE9IG4pCisgICAgICBpZiAoRFRNLk5VTEwgIT0gbikKICAgICAgIHsKICAgICAgICAgbmV4dE5vZGUgPSBuOwogICAgICAgfQpAQCAtMTg1LDI4ICsxODgsMjggQEAKICAgICAgICAgLy8gSWYgdGhlIG5leHQgc2libGluZyBpcyBhbiBhbmNlc3RvciwgdGhlbiBjb250aW51ZSAKICAgICAgICAgLy8gb24gdG8gZ2V0IGl0J3MgZmlyc3QgY2hpbGQsIG90aGVyd2lzZSBuZXh0U2libGluZygpIAogICAgICAgICAvLyB3aWxsIGdldCBpdC4KLSAgICAgICAgbmV4dE5vZGUgPSBuZXh0Tm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICBuZXh0Tm9kZSA9IGR0bS5nZXROZXh0U2libGluZyhuZXh0Tm9kZSk7CiAKLSAgICAgICAgaWYgKG51bGwgIT0gbmV4dE5vZGUpCisgICAgICAgIGlmIChEVE0uTlVMTCAhPSBuZXh0Tm9kZSkKICAgICAgICAgewotICAgICAgICAgIGlmIChtX3Jvb3QuZXF1YWxzKG5leHROb2RlKSB8fCFpc0FuY2VzdG9yT2ZSb290Q29udGV4dChuZXh0Tm9kZSkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICBpZiAoKG1fcm9vdCA9PSBuZXh0Tm9kZSkgfHwhaXNBbmNlc3Rvck9mUm9vdENvbnRleHQobmV4dE5vZGUpKQorICAgICAgICAgICAgcmV0dXJuIERUTS5OVUxMOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGlmIChudWxsICE9IG5leHROb2RlKQorICAgICAgaWYgKERUTS5OVUxMICE9IG5leHROb2RlKQogICAgICAgewotICAgICAgICBpZiAobV9yb290LmVxdWFscyhuZXh0Tm9kZSkpCi0gICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChtX3Jvb3QgPT0gbmV4dE5vZGUpCisgICAgICAgICAgcmV0dXJuIERUTS5OVUxMOwogICAgICAgICBlbHNlIGlmICghaXNBbmNlc3Rvck9mUm9vdENvbnRleHQobmV4dE5vZGUpKQogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KIAotICAgIG1fbmV4dExldmVsQW1vdW50ID0gKG51bGwgPT0gbmV4dE5vZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IDAgOiAobmV4dE5vZGUuaGFzQ2hpbGROb2RlcygpID8gMSA6IDApOworICAgIG1fbmV4dExldmVsQW1vdW50ID0gKERUTS5OVUxMID09IG5leHROb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgPyAwIDogKGR0bS5oYXNDaGlsZE5vZGVzKG5leHROb2RlKSA/IDEgOiAwKTsKIAogLy8gICAgaWYobnVsbCAhPSBuZXh0Tm9kZSkKIC8vICAgIHsKQEAgLTIyOSwzMiArMjMyLDMzIEBACiAgICAqIEByZXR1cm4gIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KICAgICogICBuZXh0IHNpYmxpbmcgaW4gdGhlIFRyZWVXYWxrZXIncyBsb2dpY2FsIHZpZXcuCiAgICAqLwotICBwdWJsaWMgTm9kZSBuZXh0U2libGluZygpCisgIHB1YmxpYyBpbnQgbmV4dFNpYmxpbmcoKQogICB7CiAKLSAgICBpZiAobV9yb290LmVxdWFscyhtX2N1cnJlbnROb2RlKSkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgTm9kZSBuZXh0ID0gbV9jdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOworICAgIGlmIChtX3Jvb3QgPT0gbV9jdXJyZW50Tm9kZSkKKyAgICAgIHJldHVybiBEVE0uTlVMTDsKICAgICAKLSAgICBpZiAoKG51bGwgPT0gbmV4dCkgfHwgbV9yb290LmVxdWFscyhuZXh0KQorICAgIERUTSBkdG0gPSBnZXREVE0obV9yb290KTsKKyAgICBpbnQgbmV4dCA9IGR0bS5nZXROZXh0U2libGluZyhtX2N1cnJlbnROb2RlKTsKKyAgICAKKyAgICBpZiAoKERUTS5OVUxMID09IG5leHQpIHx8IG1fcm9vdCA9PSBuZXh0CiAgICAgICAgICAgICAvKiB8fCBpc0FuY2VzdG9yT2ZSb290Q29udGV4dChuZXh0KSAqLykKLSAgICAgIHJldHVybiBudWxsOworICAgICAgcmV0dXJuIERUTS5OVUxMOwogICAgICAgCiAgICAgaWYoaXNBbmNlc3Rvck9mUm9vdENvbnRleHQobmV4dCkpCiAgICAgewotICAgICAgbmV4dCA9IG5leHQuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgbmV4dCA9IGR0bS5nZXRGaXJzdENoaWxkKG5leHQpOwogICAgICAgCi0gICAgICBpZiAoKG51bGwgPT0gbmV4dCkgfHwgbV9yb290LmVxdWFscyhuZXh0KQorICAgICAgaWYgKChEVE0uTlVMTCA9PSBuZXh0KSB8fCAobV9yb290ID09IG5leHQpCiAgICAgICAgICAgICAgIC8qIHx8IGlzQW5jZXN0b3JPZlJvb3RDb250ZXh0KG5leHQpICovKQotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIERUTS5OVUxMOwogICAgIH0KIAotICAgIG1fbmV4dExldmVsQW1vdW50ID0gKG51bGwgPT0gbmV4dCkgPyAwIDogKG5leHQuaGFzQ2hpbGROb2RlcygpID8gMSA6IDApOworICAgIG1fbmV4dExldmVsQW1vdW50ID0gKERUTS5OVUxMID09IG5leHQpID8gMCA6IChkdG0uaGFzQ2hpbGROb2RlcyhuZXh0KSA/IDEgOiAwKTsKIAogLy8gICAgaWYobnVsbCAhPSBuZXh0KQogLy8gICAgewotLy8gICAgICBOb2RlIGF0dHJOb2RlID0gbmV4dC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJpZCIpOworLy8gICAgICBpbnQgYXR0ck5vZGUgPSBuZXh0LmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oImlkIik7CiAvLyAgICAgIGlmKG51bGwgIT0gYXR0ck5vZGUpCiAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJuZXh0U2libGluZzogIithdHRyTm9kZS5nZXROb2RlVmFsdWUoKSk7CiAvLyAgICAgIGVsc2UKQEAgLTI2Nyw3ICsyNzEsNyBAQAogICB9CiAKICAgLyoqIFRoZSBkb2N1bWVudCBvd25lciBub2RlLiAgKi8KLSAgdHJhbnNpZW50IE5vZGUgbV9kb2M7CisgIHRyYW5zaWVudCBpbnQgbV9kb2MgPSBEVE0uTlVMTDsKIAogICAvKioKICAgICogVGVsbCB3aGF0J3MgdGhlIG1heGltdW0gbGV2ZWwgdGhpcyBheGVzIGNhbiBkZXNjZW5kIHRvLgpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9QcmVkaWNhdGVkTm9kZVRlc3QuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvUHJlZGljYXRlZE5vZGVUZXN0LmphdmEKaW5kZXggNjQ3MTI0NC4uNDE4YWYwNCAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9QcmVkaWNhdGVkTm9kZVRlc3QuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL1ByZWRpY2F0ZWROb2RlVGVzdC5qYXZhCkBAIC05LDkgKzksMTEgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlByZWZpeFJlc29sdmVyOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKLQorLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1GaWx0ZXI7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcmVkaWNhdGVkTm9kZVRlc3QgZXh0ZW5kcyBOb2RlVGVzdCBpbXBsZW1lbnRzIFN1YkNvbnRleHRMaXN0CiB7CkBAIC0yNTcsNyArMjU5LDcgQEAKICAgICoKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBib29sZWFuIGV4ZWN1dGVQcmVkaWNhdGVzKE5vZGUgY29udGV4dCwgWFBhdGhDb250ZXh0IHhjdHh0KQorICBib29sZWFuIGV4ZWN1dGVQcmVkaWNhdGVzKGludCBjb250ZXh0LCBYUGF0aENvbnRleHQgeGN0eHQpCiAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCkBAIC0zNTAsMTggKzM1MiwxNiBAQAogICAgKgogICAgKiBAcmV0dXJuIEluZm9ybWF0aXZlIHN0cmluZyBhYm91dCB0aGUgYXJndW1lbnQuCiAgICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG5vZGVUb1N0cmluZyhOb2RlIG4pCisgIHByb3RlY3RlZCBTdHJpbmcgbm9kZVRvU3RyaW5nKGludCBuKQogICB7Ci0KLSAgICB0cnkKKyAgICBpZihEVE0uTlVMTCAhPSBuKQogICAgIHsKLSAgICAgIHJldHVybiAobnVsbCAhPSBuKQotICAgICAgICAgICAgID8gbi5nZXROb2RlTmFtZSgpICsgInsiICsgKChvcmcuYXBhY2hlLnhhbGFuLnN0cmVlLkNoaWxkKSBuKS5nZXRVaWQoKSArICJ9IgotICAgICAgICAgICAgIDogIm51bGwiOworICAgICAgRFRNIGR0bSA9IG1fbHBpLmdldFhQYXRoQ29udGV4dCgpLmdldERUTShuKTsKKyAgICAgIHJldHVybiBkdG0uZ2V0Tm9kZU5hbWUobikgKyAieyIgKyAobisxKSArICJ9IjsKICAgICB9Ci0gICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpCisgICAgZWxzZQogICAgIHsKLSAgICAgIHJldHVybiAobnVsbCAhPSBuKSA/IG4uZ2V0Tm9kZU5hbWUoKSA6ICJudWxsIjsKKyAgICAgIHJldHVybiAibnVsbCI7CiAgICAgfQogICB9CiAgIApAQCAtMzc2LDcgKzM3Niw3IEBACiAgICAqIEByZXR1cm4gIGEgY29uc3RhbnQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5vZGUgaXMgYWNjZXB0ZWQsCiAgICAqICAgcmVqZWN0ZWQsIG9yIHNraXBwZWQsIGFzIGRlZmluZWQgIGFib3ZlIC4KICAgICovCi0gIHB1YmxpYyBzaG9ydCBhY2NlcHROb2RlKE5vZGUgbikKKyAgcHVibGljIHNob3J0IGFjY2VwdE5vZGUoaW50IG4pCiAgIHsKIAogICAgIFhQYXRoQ29udGV4dCB4Y3R4dCA9IG1fbHBpLmdldFhQYXRoQ29udGV4dCgpOwpAQCAtMzk1LDEwICszOTUsMTAgQEAKICAgICAgICAgICBjb3VudFByb3hpbWl0eVBvc2l0aW9uKDApOwogCiAgICAgICAgICAgaWYgKCFleGVjdXRlUHJlZGljYXRlcyhuLCB4Y3R4dCkpCi0gICAgICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfU0tJUDsKKyAgICAgICAgICAgIHJldHVybiBEVE1JdGVyYXRvci5GSUxURVJfU0tJUDsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQ7CisgICAgICAgIHJldHVybiBEVE1JdGVyYXRvci5GSUxURVJfQUNDRVBUOwogICAgICAgfQogICAgIH0KICAgICBjYXRjaCAoamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiBzZSkKQEAgLTQxMiw3ICs0MTIsNyBAQAogICAgICAgeGN0eHQucG9wQ3VycmVudE5vZGUoKTsKICAgICB9CiAKLSAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfU0tJUDsKKyAgICByZXR1cm4gRFRNSXRlcmF0b3IuRklMVEVSX1NLSVA7CiAgIH0KIAogICAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvUmV2ZXJzZUF4ZXNXYWxrZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvUmV2ZXJzZUF4ZXNXYWxrZXIuamF2YQppbmRleCBkZDg5NTMxLi44ZjFiOGVlIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL1JldmVyc2VBeGVzV2Fsa2VyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9SZXZlcnNlQXhlc1dhbGtlci5qYXZhCkBAIC02Niw4ICs2NiwxMCBAQAogCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CiAKIC8qKgogICogV2Fsa2VyIGZvciBhIHJldmVyc2UgYXhlcy4KQEAgLTk2LDE1ICs5OCwxNSBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgLyoqCi0gICAqICBTZXQgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgVHJlZVdhbGtlci4KLSAgICoKLSAgICogQHBhcmFtIHJvb3QgVGhlIGNvbnRleHQgbm9kZSBvZiB0aGlzIHN0ZXAuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSb290KE5vZGUgcm9vdCkKLSAgewotICAgIHN1cGVyLnNldFJvb3Qocm9vdCk7Ci0gIH0KKy8vICAvKioKKy8vICAgKiAgU2V0IHRoZSByb290IG5vZGUgb2YgdGhlIFRyZWVXYWxrZXIuCisvLyAgICoKKy8vICAgKiBAcGFyYW0gcm9vdCBUaGUgY29udGV4dCBub2RlIG9mIHRoaXMgc3RlcC4KKy8vICAgKi8KKy8vICBwdWJsaWMgdm9pZCBzZXRSb290KGludCByb290KQorLy8gIHsKKy8vICAgIHN1cGVyLnNldFJvb3Qocm9vdCk7CisvLyAgfQogCiAgIC8qKgogICAgKiBHZXQgdGhlIGN1cnJlbnQgc3ViLWNvbnRleHQgcG9zaXRpb24uICBJbiBvcmRlciB0byBkbyB0aGUKQEAgLTE0Myw5ICsxNDUsOSBAQAogCiAgICAgICAgIC8vIENvdW50ICdlbSBhbGwKICAgICAgICAgaW50IGNvdW50ID0gMTsKLSAgICAgICAgTm9kZSBuZXh0OworICAgICAgICBpbnQgbmV4dDsKIAotICAgICAgICB3aGlsZSAobnVsbCAhPSAobmV4dCA9IGNsb25lLm5leHROb2RlKCkpKQorICAgICAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKG5leHQgPSBjbG9uZS5uZXh0Tm9kZSgpKSkKICAgICAgICAgewogICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgIH0KQEAgLTIwNiw5ICsyMDgsOSBAQAogCiAgICAgICAvLyBDb3VudCAnZW0gYWxsCiAgICAgICAvLyBjb3VudCA9IDE7Ci0gICAgICBOb2RlIG5leHQ7CisgICAgICBpbnQgbmV4dDsKIAotICAgICAgd2hpbGUgKG51bGwgIT0gKG5leHQgPSBjbG9uZS5uZXh0Tm9kZSgpKSkKKyAgICAgIHdoaWxlIChEVE0uTlVMTCAhPSAobmV4dCA9IGNsb25lLm5leHROb2RlKCkpKQogICAgICAgewogICAgICAgICBjb3VudCsrOwogICAgICAgfQpAQCAtMjI0LDYgKzIyNiw3IEBACiAgICAgfQogCiAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRMYXN0UG9zIC0gcG9zOiAiK2NvdW50KTsKKyAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInBvcyAoUmV2ZXJzZUF4ZXNXYWxrZXIpOiAiK2NvdW50KTsKICAgICByZXR1cm4gY291bnQ7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvUm9vdFdhbGtlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9Sb290V2Fsa2VyLmphdmEKaW5kZXggN2YxZGYxMy4uZTQzZTQyZiAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9Sb290V2Fsa2VyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9Sb290V2Fsa2VyLmphdmEKQEAgLTYwLDcgKzYwLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0OwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogLyoqCiAgKiBXYWxrZXIgZm9yIHRoZSBGUk9NX1JPT1QgYXhlcy4KQEAgLTg5LDcgKzkwLDcgQEAKICAgICoKICAgICogQHBhcmFtIHJvb3QgVGhlIGNvbnRleHQgbm9kZSBvZiB0aGlzIHN0ZXAuCiAgICAqLwotICBwdWJsaWMgdm9pZCBzZXRSb290KE5vZGUgcm9vdCkKKyAgcHVibGljIHZvaWQgc2V0Um9vdChpbnQgcm9vdCkKICAgeyAgICAgIAogCiAgICAgc3VwZXIuc2V0Um9vdChyb290KTsKQEAgLTEwNCw3ICsxMDUsNyBAQAogICAgKiBAcmV0dXJuICBUaGUgbmV3IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vCiAgICAqICAgdmlzaWJsZSBjaGlsZHJlbiBpbiB0aGUgVHJlZVdhbGtlcidzIGxvZ2ljYWwgdmlldy4KICAgICovCi0gIHB1YmxpYyBOb2RlIGZpcnN0Q2hpbGQoKQorICBwdWJsaWMgaW50IGZpcnN0Q2hpbGQoKQogICB7CiAKICAgICAvLyBGb2xsb3cgcnVsZSBhYm91dCByZXR1cm5pbmcgdGhlIGZpcnN0IG9jY3VyaW5nIGluIGRvY3VtZW50IG9yZGVyIApAQCAtMTEzLDEyICsxMTQsMTIgQEAKICAgICB7CiAgICAgICBtX3Byb2Nlc3NlZFJvb3QgPSB0cnVlOwogCi0gICAgICBOb2RlIG4gPSBtX2xwaS5nZXRET01IZWxwZXIoKS5nZXRSb290Tm9kZShtX2N1cnJlbnROb2RlKTsKKyAgICAgIGludCBuID0gZ2V0RFRNKG1fY3VycmVudE5vZGUpLmdldERvY3VtZW50KCk7CiAKICAgICAgIHJldHVybiBzZXRDdXJyZW50SWZOb3ROdWxsKG4pOwogICAgIH0KIAotICAgIHJldHVybiBudWxsOworICAgIHJldHVybiBEVE0uTlVMTDsKICAgfQogCiAgIC8qKiBUcnVlIGlmIHRoZSByb290IG5vZGUgaGFzIGJlZW4gcHJvY2Vzc2VkLiAgICovCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL1Jvb3RXYWxrZXJNdWx0aVN0ZXAuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvUm9vdFdhbGtlck11bHRpU3RlcC5qYXZhCmluZGV4IDExN2E1NWUuLjQzNmMwYjcgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvUm9vdFdhbGtlck11bHRpU3RlcC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvUm9vdFdhbGtlck11bHRpU3RlcC5qYXZhCkBAIC01Niw4ICs1NiwxMCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguYXhlczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLnBhdHRlcm5zLk5vZGVUZXN0RmlsdGVyOwogCkBAIC04NCw3ICs4Niw3IEBACiAgICAqCiAgICAqIEBwYXJhbSByb290IFRoZSBjb250ZXh0IG5vZGUgb2YgdGhpcyBzdGVwLgogICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdChOb2RlIHJvb3QpCisgIHB1YmxpYyB2b2lkIHNldFJvb3QoaW50IHJvb3QpCiAgIHsKIAogICAgIHN1cGVyLnNldFJvb3Qocm9vdCk7CkBAIC05Nyw0MiArOTksNDYgQEAKICAgICoKICAgICogQHJldHVybiB0aGUgbmV4dCB2YWxpZCBjaGlsZCBub2RlLgogICAgKi8KLSAgcHJvdGVjdGVkIE5vZGUgZ2V0TmV4dE5vZGUoKQorICBwcm90ZWN0ZWQgaW50IGdldE5leHROb2RlKCkKICAgewogCiAgICAgaWYgKG1faXNGcmVzaCkKICAgICAgIG1faXNGcmVzaCA9IGZhbHNlOwogCi0gICAgTm9kZSBjdXJyZW50ID0gdGhpcy5nZXRDdXJyZW50Tm9kZSgpOworICAgIGludCBjdXJyZW50ID0gdGhpcy5nZXRDdXJyZW50Tm9kZSgpOwogCi0gICAgaWYgKGN1cnJlbnQuaXNTdXBwb3J0ZWQoRkVBVFVSRV9OT0RFVEVTVEZJTFRFUiwgIjEuMCIpKQotICAgICAgKChOb2RlVGVzdEZpbHRlcikgY3VycmVudCkuc2V0Tm9kZVRlc3QodGhpcyk7CisgICAgLy8gJU5PREVURVNURklMVEVSJQorLy8gICAgaWYgKGN1cnJlbnQuaXNTdXBwb3J0ZWQoRkVBVFVSRV9OT0RFVEVTVEZJTFRFUiwgIjEuMCIpKQorLy8gICAgICAoKE5vZGVUZXN0RmlsdGVyKSBjdXJyZW50KS5zZXROb2RlVGVzdCh0aGlzKTsKIAotICAgIE5vZGUgbmV4dDsKKyAgICBpbnQgbmV4dDsKIAogICAgIGlmICghbV9wcm9jZXNzZWRSb290KQogICAgIHsKICAgICAgIG1fcHJvY2Vzc2VkUm9vdCA9IHRydWU7Ci0gICAgICBuZXh0ID0gbV9scGkuZ2V0RE9NSGVscGVyKCkuZ2V0Um9vdE5vZGUobV9jdXJyZW50Tm9kZSk7CisgICAgICAKKyAgICAgIG5leHQgPSBnZXREVE0obV9jdXJyZW50Tm9kZSkuZ2V0RG9jdW1lbnQoKTsKICAgICB9CiAgICAgZWxzZQotICAgICAgbmV4dCA9IG51bGw7CisgICAgICBuZXh0ID0gRFRNLk5VTEw7CiAKLSAgICBpZiAobnVsbCAhPSBuZXh0KQorICAgIGlmIChEVE0uTlVMTCAhPSBuZXh0KQogICAgIHsKICAgICAgIG1fY3VycmVudE5vZGUgPSBuZXh0OwogCiAgICAgICAvLyBkb2Vzbid0IHNlZW0gbGlrZSB3ZSBuZWVkIHRvIGRvIHRoaXMhCi0gICAgICBpZiAoYWNjZXB0Tm9kZShuZXh0KSAhPSBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQpCisgICAgICBpZiAoYWNjZXB0Tm9kZShuZXh0KSAhPSBEVE1JdGVyYXRvci5GSUxURVJfQUNDRVBUKQogICAgICAgewotICAgICAgICBuZXh0ID0gbnVsbDsKKyAgICAgICAgbmV4dCA9IERUTS5OVUxMOwogICAgICAgfQogCi0gICAgICBpZiAobnVsbCA9PSBuZXh0KQorICAgICAgaWYgKERUTS5OVUxMID09IG5leHQpCisgICAgICB7CiAgICAgICAgIG1fY3VycmVudE5vZGUgPSBjdXJyZW50OyAgLy8gZG9uJ3QgYWR2YW5jZSB0aGUgY3VycmVudCBub2RlLgorICAgICAgICB0aGlzLm1faXNEb25lID0gdHJ1ZTsKKyAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAobnVsbCA9PSBuZXh0KQorICAgIGVsc2UKICAgICAgIHRoaXMubV9pc0RvbmUgPSB0cnVlOwogCiAgICAgcmV0dXJuIG5leHQ7CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL1NlbGZXYWxrZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvU2VsZldhbGtlci5qYXZhCmluZGV4IDM4MDZlOTIuLjNjOWRjMjYgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvU2VsZldhbGtlci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvU2VsZldhbGtlci5qYXZhCkBAIC02MCw3ICs2MCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIC8qKgogICogV2Fsa2VyIGZvciB0aGUgJ3NlbGYnIGF4ZXMuCkBAIC04OCw3ICs4OSw3IEBACiAgICAqCiAgICAqIEBwYXJhbSByb290IFRoZSBjb250ZXh0IG5vZGUgb2YgdGhpcyBzdGVwLgogICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdChOb2RlIHJvb3QpCisgIHB1YmxpYyB2b2lkIHNldFJvb3QoaW50IHJvb3QpCiAgIHsKIAogICAgIG1fcHJvY2Vzc2VkU2VsZiA9IGZhbHNlOwpAQCAtMTA0LDcgKzEwNSw3IEBACiAgICAqIEByZXR1cm4gIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KICAgICogICB2aXNpYmxlIGNoaWxkcmVuIGluIHRoZSBUcmVlV2Fsa2VyJ3MgbG9naWNhbCB2aWV3LgogICAgKi8KLSAgcHVibGljIE5vZGUgZmlyc3RDaGlsZCgpCisgIHB1YmxpYyBpbnQgZmlyc3RDaGlsZCgpCiAgIHsKIAogICAgIC8vIEZvbGxvdyBteSBtYWRlLXVwIHJ1bGUgYWJvdXQgcmV0dXJuaW5nIHRoZSBzZWxmIG5vZGUgYXMgYSBjaGlsZC4KQEAgLTExNSw3ICsxMTYsNyBAQAogICAgICAgcmV0dXJuIHNldEN1cnJlbnRJZk5vdE51bGwobV9yb290KTsKICAgICB9CiAKLSAgICByZXR1cm4gbnVsbDsKKyAgICByZXR1cm4gRFRNLk5VTEw7CiAgIH0KIAogICAvKiogVHJ1ZSBpZiB0aGUgc2VsZiBub2RlIGhhcyBiZWVuIHByb2Nlc3NlZC4gICAqLwpAQCAtMTI4LDYgKzEyOSw2IEBACiAgICAqLwogICBwcm90ZWN0ZWQgaW50IGdldExldmVsTWF4KCkKICAgewotICAgIHJldHVybiBtX2xwaS5nZXRET01IZWxwZXIoKS5nZXRMZXZlbChtX3Jvb3QpOworICAgIHJldHVybiBnZXREVE0obV9yb290KS5nZXRMZXZlbChtX3Jvb3QpOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL1NlbGZXYWxrZXJPbmVTdGVwLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL1NlbGZXYWxrZXJPbmVTdGVwLmphdmEKaW5kZXggZGEzMTI0Ny4uYTk2ZWJlZiAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9TZWxmV2Fsa2VyT25lU3RlcC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvU2VsZldhbGtlck9uZVN0ZXAuamF2YQpAQCAtNTYsOCArNTYsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoLmF4ZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOwogCiAvKioKICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgpAQCAtODQsMjEgKzg2LDIxIEBACiAgICAqCiAgICAqIEByZXR1cm4gVGhlIHNlbGYgbm9kZSBvciBudWxsLgogICAgKi8KLSAgcHVibGljIE5vZGUgbmV4dE5vZGUoKQorICBwdWJsaWMgaW50IG5leHROb2RlKCkKICAgewogCiAgICAgaWYgKG1faXNGcmVzaCkKICAgICB7CiAgICAgICBtX2lzRnJlc2ggPSBmYWxzZTsKIAotICAgICAgaWYgKGFjY2VwdE5vZGUobV9yb290KSA9PSBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQpCisgICAgICBpZiAoYWNjZXB0Tm9kZShtX3Jvb3QpID09IERUTUl0ZXJhdG9yLkZJTFRFUl9BQ0NFUFQpCiAgICAgICAgIHJldHVybiBtX3Jvb3Q7CiAgICAgICBlbHNlCi0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gRFRNLk5VTEw7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKKyAgICAgIHJldHVybiBEVE0uTlVMTDsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvU3ViQ29udGV4dExpc3QuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvU3ViQ29udGV4dExpc3QuamF2YQppbmRleCA1YzAyZGUyLi45NTliZjNhIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL1N1YkNvbnRleHRMaXN0LmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9TdWJDb250ZXh0TGlzdC5qYXZhCkBAIC01OCw4ICs1OCw4IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisgCiAvKioKICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgogICogQSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgaXMgYSBzdWIgY29udGV4dCBub2RlIGxpc3QsIG1lYW5pbmcgaXQKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvVW5pb25QYXRoSXRlcmF0b3IuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvVW5pb25QYXRoSXRlcmF0b3IuamF2YQppbmRleCAzZTM1MDgzLi42Nzk5MTU2IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9heGVzL1VuaW9uUGF0aEl0ZXJhdG9yLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcy9VbmlvblBhdGhJdGVyYXRvci5qYXZhCkBAIC01OSwxMCArNTksMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLmNvbXBpbGVyLk9wQ29kZXM7CiAKIC8vIERPTSBJbXBvcnRzCi1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNTWFuYWdlcjsKIAogLy8gWGFsYW4gSW1wb3J0cwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguTm9kZVNldDsKQEAgLTc3LDE0ICs4MSwxNCBAQAogCiAvKioKICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgotICogVGhpcyBjbGFzcyBleHRlbmRzIE5vZGVTZXQsIHdoaWNoIGltcGxlbWVudHMgTm9kZUl0ZXJhdG9yLAorICogVGhpcyBjbGFzcyBleHRlbmRzIE5vZGVTZXQsIHdoaWNoIGltcGxlbWVudHMgRFRNSXRlcmF0b3IsCiAgKiBhbmQgZmV0Y2hlcyBub2RlcyBvbmUgYXQgYSB0aW1lIGluIGRvY3VtZW50IG9yZGVyIGJhc2VkIG9uIGEgWFBhdGgKICAqIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI05ULVVuaW9uRXhwciI+VW5pb25FeHByPC9hPi4KICAqIEFzIGVhY2ggbm9kZSBpcyBpdGVyYXRlZCB2aWEgbmV4dE5vZGUoKSwgdGhlIG5vZGUgaXMgYWxzbyBzdG9yZWQKICAqIGluIHRoZSBOb2RlVmVjdG9yLCBzbyB0aGF0IHByZXZpb3VzTm9kZSgpIGNhbiBlYXNpbHkgYmUgZG9uZS4KICAqLwogcHVibGljIGNsYXNzIFVuaW9uUGF0aEl0ZXJhdG9yIGV4dGVuZHMgRXhwcmVzc2lvbgotICAgICAgICBpbXBsZW1lbnRzIENsb25lYWJsZSwgTm9kZUl0ZXJhdG9yLCBDb250ZXh0Tm9kZUxpc3QKKyAgICAgICAgaW1wbGVtZW50cyBDbG9uZWFibGUsIERUTUl0ZXJhdG9yLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQogewogCiAgIC8qKgpAQCAtMTM2LDkgKzE0MCw5IEBACiAgIHB1YmxpYyB2b2lkIGRldGFjaCgpCiAgIHsKIAotICAgIHRoaXMubV9jb250ZXh0ID0gbnVsbDsKKyAgICB0aGlzLm1fY29udGV4dCA9IERUTS5OVUxMOwogICAgIHRoaXMubV9leGVjQ29udGV4dCA9IG51bGw7Ci0gICAgdGhpcy5tX2NvbnRleHQgPSBudWxsOworICAgIHRoaXMubV9jb250ZXh0ID0gRFRNLk5VTEw7CiAKICAgICBpbnQgbiA9IG1faXRlcmF0b3JzLmxlbmd0aDsKIApAQCAtMjA4LDYgKzIxMiwxNyBAQAogICAgIGVsc2UKICAgICAgIG1fY2FjaGVkTm9kZXMgPSBudWxsOwogICB9CisgIAorICAvKioKKyAgICogVGVsbHMgaWYgdGhpcyBpdGVyYXRvciBjYW4gaGF2ZSBub2RlcyBhZGRlZCB0byBpdCBvciBzZXQgdmlhIAorICAgKiB0aGUgPGNvZGU+c2V0SXRlbShpbnQgbm9kZSwgaW50IGluZGV4KTwvY29kZT4gbWV0aG9kLgorICAgKiAKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBub2RlbGlzdCBjYW4gYmUgbXV0YXRlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzTXV0YWJsZSgpCisgIHsKKyAgICByZXR1cm4gKG1fY2FjaGVkTm9kZXMgIT0gbnVsbCk7CisgIH0KIAogICAvKioKICAgICogU2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBub2RlIHNldC4KQEAgLTI1NiwxMSArMjcxLDggQEAKICAgICogaXRlcmF0b3IgYmFja3dhcmRzIGluIHRoZSBzZXQuCiAgICAqIEByZXR1cm4gIFRoZSBwcmV2aW91cyA8Y29kZT5Ob2RlPC9jb2RlPiBpbiB0aGUgc2V0IGJlaW5nIGl0ZXJhdGVkIG92ZXIsCiAgICAqICAgb3I8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBtZW1iZXJzIGluIHRoYXQgc2V0LgotICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgotICAgKiAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUKLSAgICogICA8Y29kZT5kZXRhY2g8L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KICAgICovCi0gIHB1YmxpYyBOb2RlIHByZXZpb3VzTm9kZSgpIHRocm93cyBET01FeGNlcHRpb24KKyAgcHVibGljIGludCBwcmV2aW91c05vZGUoKQogICB7CiAKICAgICBpZiAobnVsbCA9PSBtX2NhY2hlZE5vZGVzKQpAQCAtMjczLDE2ICsyODUsMTYgQEAKICAgLyoqCiAgICAqICBUaGlzIGF0dHJpYnV0ZSBkZXRlcm1pbmVzIHdoaWNoIG5vZGUgdHlwZXMgYXJlIHByZXNlbnRlZCB2aWEgdGhlCiAgICAqIGl0ZXJhdG9yLiBUaGUgYXZhaWxhYmxlIHNldCBvZiBjb25zdGFudHMgaXMgZGVmaW5lZCBpbiB0aGUKLSAgICogPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gaW50ZXJmYWNlLgorICAgKiA8Y29kZT5EVE1GaWx0ZXI8L2NvZGU+IGludGVyZmFjZS4KICAgICoKLSAgICogQHJldHVybiBBIGJpdCBzZXQgdGhhdCB0ZWxscyB3aGF0IG5vZGUgdHlwZXMgdG8gc2hvdyAoTm9kZUZpbHRlci5TSE9XX0FMTCBhdCAKKyAgICogQHJldHVybiBBIGJpdCBzZXQgdGhhdCB0ZWxscyB3aGF0IG5vZGUgdHlwZXMgdG8gc2hvdyAoRFRNRmlsdGVyLlNIT1dfQUxMIGF0IAogICAgKiB0aGUgaXRlcmF0b3IgbGV2ZWwpLgogICAgKi8KICAgcHVibGljIGludCBnZXRXaGF0VG9TaG93KCkKICAgewogCiAgICAgLy8gVE9ETzogPz8KLSAgICByZXR1cm4gTm9kZUZpbHRlci5TSE9XX0FMTCAmIH5Ob2RlRmlsdGVyLlNIT1dfRU5USVRZX1JFRkVSRU5DRTsKKyAgICByZXR1cm4gRFRNRmlsdGVyLlNIT1dfQUxMICYgfkRUTUZpbHRlci5TSE9XX0VOVElUWV9SRUZFUkVOQ0U7CiAgIH0KIAogICAvKioKQEAgLTI5MCw3ICszMDIsNyBAQAogICAgKgogICAgKiBAcmV0dXJuIG51bGwuCiAgICAqLwotICBwdWJsaWMgTm9kZUZpbHRlciBnZXRGaWx0ZXIoKQorICBwdWJsaWMgRFRNRmlsdGVyIGdldEZpbHRlcigpCiAgIHsKICAgICByZXR1cm4gbnVsbDsKICAgfQpAQCAtMzAwLDcgKzMxMiw3IEBACiAgICAqCiAgICAqIEByZXR1cm4gVGhlIGNvbnRleHQgbm9kZSBvZiB0aGlzIGl0ZXJhdG9yLgogICAgKi8KLSAgcHVibGljIE5vZGUgZ2V0Um9vdCgpCisgIHB1YmxpYyBpbnQgZ2V0Um9vdCgpCiAgIHsKICAgICByZXR1cm4gbV9jb250ZXh0OwogICB9CkBAIC0zNzksMTEgKzM5MSwxMSBAQAogICAgKiBHZXQgYSBjbG9uZWQgSXRlcmF0b3IgdGhhdCBpcyByZXNldCB0byB0aGUgYmVnaW5uaW5nIAogICAgKiBvZiB0aGUgcXVlcnkuCiAgICAqCi0gICAqIEByZXR1cm4gQSBjbG9uZWQgTm9kZUl0ZXJhdG9yIHNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIHF1ZXJ5LgorICAgKiBAcmV0dXJuIEEgY2xvbmVkIERUTUl0ZXJhdG9yIHNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIHF1ZXJ5LgogICAgKgogICAgKiBAdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgTm9kZUl0ZXJhdG9yIGNsb25lV2l0aFJlc2V0KCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCisgIHB1YmxpYyBEVE1JdGVyYXRvciBjbG9uZVdpdGhSZXNldCgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbgogICB7CiAKICAgICBVbmlvblBhdGhJdGVyYXRvciBjbG9uZSA9IChVbmlvblBhdGhJdGVyYXRvcikgY2xvbmUoKTsKQEAgLTQyNyw3ICs0MzksNyBAQAogICAgIG1fZm91bmRMYXN0ID0gZmFsc2U7CiAgICAgbV9uZXh0ID0gMDsKICAgICBtX2xhc3QgPSAwOwotICAgIG1fbGFzdEZldGNoZWQgPSBudWxsOworICAgIG1fbGFzdEZldGNoZWQgPSBEVE0uTlVMTDsKIAogICAgIGludCBuID0gbV9pdGVyYXRvcnMubGVuZ3RoOwogCkBAIC01MTQsMzUgKzUyNiw0NCBAQAogICB9CiAKICAgLyoqIFRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgZmV0Y2hlZCwgdXN1YWxseSBieSBuZXh0Tm9kZS4gKi8KLSAgdHJhbnNpZW50IE5vZGUgbV9sYXN0RmV0Y2hlZDsKKyAgdHJhbnNpZW50IGludCBtX2xhc3RGZXRjaGVkID0gRFRNLk5VTEw7CiAKICAgLyoqCiAgICAqICBSZXR1cm5zIHRoZSBuZXh0IG5vZGUgaW4gdGhlIHNldCBhbmQgYWR2YW5jZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotICAgKiBpdGVyYXRvciBpbiB0aGUgc2V0LiBBZnRlciBhIE5vZGVJdGVyYXRvciBpcyBjcmVhdGVkLCB0aGUgZmlyc3QgY2FsbAorICAgKiBpdGVyYXRvciBpbiB0aGUgc2V0LiBBZnRlciBhIERUTUl0ZXJhdG9yIGlzIGNyZWF0ZWQsIHRoZSBmaXJzdCBjYWxsCiAgICAqIHRvIG5leHROb2RlKCkgcmV0dXJucyB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgc2V0LgogICAgKiBAcmV0dXJuICBUaGUgbmV4dCA8Y29kZT5Ob2RlPC9jb2RlPiBpbiB0aGUgc2V0IGJlaW5nIGl0ZXJhdGVkIG92ZXIsIG9yCiAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbiB0aGF0IHNldC4KLSAgICogQHRocm93cyBET01FeGNlcHRpb24KLSAgICogICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlCi0gICAqICAgPGNvZGU+ZGV0YWNoPC9jb2RlPiBtZXRob2Qgd2FzIGludm9rZWQuCiAgICAqLwotICBwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpIHRocm93cyBET01FeGNlcHRpb24KKyAgcHVibGljIGludCBuZXh0Tm9kZSgpCiAgIHsKIAorLy8gICAgLy8gSWYgdGhlIGNhY2hlIGlzIG9uLCBhbmQgdGhlIG5vZGUgaGFzIGFscmVhZHkgYmVlbiBmb3VuZCwgdGhlbiAKKy8vICAgIC8vIGp1c3QgcmV0dXJuIGZyb20gdGhlIGxpc3QuCisvLyAgICBpZiAoKG51bGwgIT0gbV9jYWNoZWROb2RlcykKKy8vICAgICAgICAgICAgJiYgKG1fY2FjaGVkTm9kZXMuZ2V0Q3VycmVudFBvcygpIDwgbV9jYWNoZWROb2Rlcy5zaXplKCkpKQorLy8gICAgeworLy8gICAgICByZXR1cm4gbV9jYWNoZWROb2Rlcy5uZXh0Tm9kZSgpOworLy8gICAgfQogICAgIC8vIElmIHRoZSBjYWNoZSBpcyBvbiwgYW5kIHRoZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gZm91bmQsIHRoZW4gCiAgICAgLy8ganVzdCByZXR1cm4gZnJvbSB0aGUgbGlzdC4KICAgICBpZiAoKG51bGwgIT0gbV9jYWNoZWROb2RlcykKLSAgICAgICAgICAgICYmIChtX2NhY2hlZE5vZGVzLmdldEN1cnJlbnRQb3MoKSA8IG1fY2FjaGVkTm9kZXMuc2l6ZSgpKSkKKyAgICAgICAgICAgICYmIChtX25leHQgPCBtX2NhY2hlZE5vZGVzLnNpemUoKSkpCiAgICAgewotICAgICAgcmV0dXJuIG1fY2FjaGVkTm9kZXMubmV4dE5vZGUoKTsKKyAgICAgIGludCBuZXh0ID0gbV9jYWNoZWROb2Rlcy5lbGVtZW50QXQobV9uZXh0KTsKKyAgICAKKyAgICAgIG1fbmV4dCsrOworICAgICAgbV9jdXJyZW50Q29udGV4dE5vZGUgPSBuZXh0OworCisgICAgICByZXR1cm4gbmV4dDsKICAgICB9CiAKICAgICBpZiAobV9mb3VuZExhc3QpCi0gICAgICByZXR1cm4gbnVsbDsKKyAgICAgIHJldHVybiBEVE0uTlVMTDsKIAogICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgaXRlcmF0b3JzIGdldHRpbmcgdGhlIGN1cnJlbnQgZmV0Y2hlZCAKICAgICAvLyBub2RlLCBhbmQgZ2V0IHRoZSBlYXJsaWVzdCBvY2N1cmluZyBpbiBkb2N1bWVudCBvcmRlcgotICAgIE5vZGUgZWFybGllc3ROb2RlID0gbnVsbDsKKyAgICBpbnQgZWFybGllc3ROb2RlID0gRFRNLk5VTEw7CiAKICAgICBpZiAobnVsbCAhPSBtX2l0ZXJhdG9ycykKICAgICB7CkBAIC01NTEsMTggKzU3MiwxOCBAQAogCiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbV9pdGVyYXRvcnNbaV0uZ2V0Q3VycmVudE5vZGUoKTsKKyAgICAgICAgaW50IG5vZGUgPSBtX2l0ZXJhdG9yc1tpXS5nZXRDdXJyZW50Tm9kZSgpOwogCi0gICAgICAgIGlmIChudWxsID09IG5vZGUpCisgICAgICAgIGlmIChEVE0uTlVMTCA9PSBub2RlKQogICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBlbHNlIGlmIChudWxsID09IGVhcmxpZXN0Tm9kZSkKKyAgICAgICAgZWxzZSBpZiAoRFRNLk5VTEwgPT0gZWFybGllc3ROb2RlKQogICAgICAgICB7CiAgICAgICAgICAgaXRlcmF0b3JVc2VkID0gaTsKICAgICAgICAgICBlYXJsaWVzdE5vZGUgPSBub2RlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgIGlmIChub2RlLmVxdWFscyhlYXJsaWVzdE5vZGUpKQorICAgICAgICAgIGlmIChub2RlID09IGVhcmxpZXN0Tm9kZSkKICAgICAgICAgICB7CiAKICAgICAgICAgICAgIC8vIEZvdW5kIGEgZHVwbGljYXRlLCBzbyBza2lwIHBhc3QgaXQuCkBAIC01NzAsOSArNTkxLDkgQEAKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZQogICAgICAgICAgIHsKLSAgICAgICAgICAgIERPTUhlbHBlciBkaCA9IG1fZXhlY0NvbnRleHQuZ2V0RE9NSGVscGVyKCk7CisgICAgICAgICAgICBEVE0gZHRtID0gZ2V0RFRNKG5vZGUpOwogCi0gICAgICAgICAgICBpZiAoZGguaXNOb2RlQWZ0ZXIobm9kZSwgZWFybGllc3ROb2RlKSkKKyAgICAgICAgICAgIGlmIChkdG0uaXNOb2RlQWZ0ZXIobm9kZSwgZWFybGllc3ROb2RlKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgaXRlcmF0b3JVc2VkID0gaTsKICAgICAgICAgICAgICAgZWFybGllc3ROb2RlID0gbm9kZTsKQEAgLTU4MSw3ICs2MDIsNyBAQAogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGlmIChudWxsICE9IGVhcmxpZXN0Tm9kZSkKKyAgICAgIGlmIChEVE0uTlVMTCAhPSBlYXJsaWVzdE5vZGUpCiAgICAgICB7CiAgICAgICAgIG1faXRlcmF0b3JzW2l0ZXJhdG9yVXNlZF0ubmV4dE5vZGUoKTsKIApAQCAtNjE0LDkgKzYzNSw5IEBACiAgICAgaWYgKG1fZm91bmRMYXN0IHx8ICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDw9IG1fbmV4dCkpKQogICAgICAgcmV0dXJuOwogCi0gICAgTm9kZSBuOworICAgIGludCBuOwogCi0gICAgd2hpbGUgKG51bGwgPT0gKG4gPSBuZXh0Tm9kZSgpKSkKKyAgICB3aGlsZSAoRFRNLk5VTEwgPT0gKG4gPSBuZXh0Tm9kZSgpKSkKICAgICB7CiAgICAgICBpZiAobV9uZXh0ID49IGluZGV4KQogICAgICAgICBicmVhazsKQEAgLTYzNiwxMyArNjU3LDEwMiBAQAogICB7CiAgICAgcmV0dXJuIG1fbmV4dDsKICAgfQorICAKKyAgLyoqCisgICAqICBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBsaXN0LiBUaGUgcmFuZ2Ugb2YgdmFsaWQgY2hpbGQgbm9kZSBpbmRpY2VzCisgICAqIGlzIDAgdG8gPGNvZGU+bGVuZ3RoLTE8L2NvZGU+IGluY2x1c2l2ZS4KKyAgICoKKyAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBsaXN0LCBhbHdheXMgZ3JlYXRlciBvciBlcXVhbCB0byB6ZXJvLgorICAgKi8KKyAgcHVibGljIGludCBnZXRMZW5ndGgoKQorICB7CiAKKyAgICAvLyAlUkVWSUVXJSA/PworLy8gICAgcmVzZXRUb0NhY2hlZExpc3QoKTsKKworICAgIHJldHVybiBtX2NhY2hlZE5vZGVzLmdldExlbmd0aCgpOworICB9CisKKyAgLyoqCisgICAqICBSZXR1cm5zIHRoZSA8Y29kZT5pbmRleDwvY29kZT4gdGggaXRlbSBpbiB0aGUgY29sbGVjdGlvbi4gSWYKKyAgICogPGNvZGU+aW5kZXg8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIG5vZGVzIGluCisgICAqIHRoZSBsaXN0LCB0aGlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gLgorICAgKiBAcGFyYW0gaW5kZXggIEluZGV4IGludG8gdGhlIGNvbGxlY3Rpb24uCisgICAqIEByZXR1cm4gIFRoZSBub2RlIGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4gdGggcG9zaXRpb24gaW4gdGhlCisgICAqICAgPGNvZGU+Tm9kZUxpc3Q8L2NvZGU+ICwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhhdCBpcyBub3QgYSB2YWxpZAorICAgKiAgIGluZGV4LgorICAgKi8KKyAgcHVibGljIGludCBpdGVtKGludCBpbmRleCkKKyAgeworICAgIC8vIHJlc2V0VG9DYWNoZWRMaXN0KCk7ICVUQkQlID8/CisKKyAgICByZXR1cm4gbV9jYWNoZWROb2Rlcy5pdGVtKGluZGV4KTsKKyAgfQorICAKKyAgLyoqCisgICAqIFNldHMgdGhlIG5vZGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGlzIHZlY3RvciB0byBiZSB0aGUKKyAgICogc3BlY2lmaWVkIG5vZGUuIFRoZSBwcmV2aW91cyBjb21wb25lbnQgYXQgdGhhdCBwb3NpdGlvbiBpcyBkaXNjYXJkZWQuCisgICAqCisgICAqIDxwPlRoZSBpbmRleCBtdXN0IGJlIGEgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MKKyAgICogdGhhbiB0aGUgY3VycmVudCBzaXplIG9mIHRoZSB2ZWN0b3IuICAKKyAgICogVGhlIGl0ZXJhdG9yIG11c3QgYmUgaW4gY2FjaGVkIG1vZGUuPC9wPgorICAgKiAKKyAgICogPHA+TWVhbnQgdG8gYmUgdXNlZCBmb3Igc29ydGVkIGl0ZXJhdG9ycy48L3A+CisgICAqCisgICAqIEBwYXJhbSBub2RlIE5vZGUgdG8gc2V0CisgICAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB3aGVyZSB0byBzZXQgdGhlIG5vZGUKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEl0ZW0oaW50IG5vZGUsIGludCBpbmRleCkKKyAgeworICAgIG1fY2FjaGVkTm9kZXMuc2V0RWxlbWVudEF0KG5vZGUsIGluZGV4KTsKKyAgfQorICAKKyAgLyoqCisgICAqIFNldCB0aGUgY3VycmVudCBjb250ZXh0IG5vZGUgZm9yIHRoaXMgaXRlcmF0b3IuCisgICAqCisgICAqIEBwYXJhbSBuIE11c3QgYmUgYSBub24tbnVsbCByZWZlcmVuY2UgdG8gdGhlIG5vZGUgY29udGV4dC4KKyAgICovCisgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFJvb3QoaW50IG4pCisgIHsKKyAgICBtX2NvbnRleHQgPSBuOworICB9CisgIAorICAvKioKKyAgICogU2V0IHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGlzIGl0ZXJhdG9yIG9wZXJhdGVzLCB3aGljaCBzaG91bGQgcHJvdmlkZToKKyAgICogYSBub2RlICh0aGUgY29udGV4dCBub2RlLi4uIHNhbWUgdmFsdWUgYXMgInJvb3QiIGRlZmluZWQgYmVsb3cpIAorICAgKiBhIHBhaXIgb2Ygbm9uLXplcm8gcG9zaXRpdmUgaW50ZWdlcnMgKHRoZSBjb250ZXh0IHBvc2l0aW9uIGFuZCB0aGUgY29udGV4dCBzaXplKSAKKyAgICogYSBzZXQgb2YgdmFyaWFibGUgYmluZGluZ3MgCisgICAqIGEgZnVuY3Rpb24gbGlicmFyeSAKKyAgICogdGhlIHNldCBvZiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGluIHNjb3BlIGZvciB0aGUgZXhwcmVzc2lvbi4KKyAgICogCisgICAqIDxwPkF0IHRoaXMgdGltZSB0aGUgZXhhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBlbnZpcm9ubWVudCBpcyBhcHBsaWNhdGlvbiAKKyAgICogZGVwZW5kZW50LiAgUHJvYmFibHkgYSBwcm9wZXIgaW50ZXJmYWNlIHdpbGwgYmUgY3JlYXRlZCBmYWlybHkgc29vbi48L3A+CisgICAqIAorICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgVGhlIGVudmlyb25tZW50IG9iamVjdC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KE9iamVjdCBlbnZpcm9ubWVudCkKKyAgeworICAgIC8vIG5vLW9wIGZvciBub3cuCisgIH0KKyAgCisgIC8qKgorICAgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgdGhlIERUTU1hbmFnZXIuICBTaW5jZSBhIG5vZGUgCisgICAqIGl0ZXJhdG9yIG1heSBiZSBwYXNzZWQgd2l0aG91dCBhIERUTU1hbmFnZXIsIHRoaXMgYWxsb3dzIHRoZSAKKyAgICogY2FsbGVyIHRvIGVhc2lseSBnZXQgdGhlIERUTU1hbmFnZXIgdXNpbmcganVzdCB0aGUgaXRlcmF0b3IuCisgICAqCisgICAqIEByZXR1cm4gYSBub24tbnVsbCBEVE1NYW5hZ2VyIHJlZmVyZW5jZS4KKyAgICovCisgIHB1YmxpYyBEVE1NYW5hZ2VyIGdldERUTU1hbmFnZXIoKQorICB7CisgICAgcmV0dXJuIG1fZXhlY0NvbnRleHQuZ2V0RFRNTWFuYWdlcigpOworICB9CisgIAogICAvKioKICAgICogUmV0dXJuIHRoZSBsYXN0IGZldGNoZWQgbm9kZS4KICAgICoKICAgICogQHJldHVybiBUaGUgbGFzdCBmZXRjaGVkIG5vZGUsIG9yIG51bGwgaWYgdGhlIGxhc3QgZmV0Y2ggd2FzIG51bGwuCiAgICAqLwotICBwdWJsaWMgTm9kZSBnZXRDdXJyZW50Tm9kZSgpCisgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudE5vZGUoKQogICB7CiAgICAgcmV0dXJuIG1fbGFzdEZldGNoZWQ7CiAgIH0KQEAgLTY2MCwyMSArNzcwLDM1IEBACiAgIC8qKgogICAgKiBUaGUgbm9kZSBjb250ZXh0IGZvciB0aGUgZXhwcmVzc2lvbi4KICAgICovCi0gIHRyYW5zaWVudCBwcm90ZWN0ZWQgTm9kZSBtX2NvbnRleHQ7CisgIHRyYW5zaWVudCBwcm90ZWN0ZWQgaW50IG1fY29udGV4dCA9IERUTS5OVUxMOwogCiAgIC8qKgogICAgKiBUaGUgbm9kZSBjb250ZXh0IGZyb20gd2hlcmUgdGhlIExvY2F0aW9uIFBhdGggaXMgYmVpbmcKICAgICogZXhlY3V0ZWQgZnJvbSAoaS5lLiBmb3IgY3VycmVudCgpIHN1cHBvcnQpLgogICAgKi8KLSAgdHJhbnNpZW50IHByb3RlY3RlZCBOb2RlIG1fY3VycmVudENvbnRleHROb2RlOwotCisgIHRyYW5zaWVudCBwcm90ZWN0ZWQgaW50IG1fY3VycmVudENvbnRleHROb2RlID0gRFRNLk5VTEw7CisgIAorICAvKioKKyAgICogR2V0IGFuIGluc3RhbmNlIG9mIGEgRFRNIHRoYXQgIm93bnMiIGEgbm9kZSBoYW5kbGUuICBTaW5jZSBhIG5vZGUgCisgICAqIGl0ZXJhdG9yIG1heSBiZSBwYXNzZWQgd2l0aG91dCBhIERUTU1hbmFnZXIsIHRoaXMgYWxsb3dzIHRoZSAKKyAgICogY2FsbGVyIHRvIGVhc2lseSBnZXQgdGhlIERUTSB1c2luZyBqdXN0IHRoZSBpdGVyYXRvci4KKyAgICoKKyAgICogQHBhcmFtIG5vZGVIYW5kbGUgdGhlIG5vZGVIYW5kbGUuCisgICAqCisgICAqIEByZXR1cm4gYSBub24tbnVsbCBEVE0gcmVmZXJlbmNlLgorICAgKi8KKyAgcHVibGljIERUTSBnZXREVE0oaW50IG5vZGVIYW5kbGUpCisgIHsKKyAgICByZXR1cm4gbV9leGVjQ29udGV4dC5nZXREVE0obm9kZUhhbmRsZSk7CisgIH0KKyAgCiAgIC8qKgogICAgKiBUaGUgbm9kZSBjb250ZXh0IGZyb20gd2hlcmUgdGhlIGV4cHJlc3Npb24gaXMgYmVpbmcKICAgICogZXhlY3V0ZWQgZnJvbSAoaS5lLiBmb3IgY3VycmVudCgpIHN1cHBvcnQpLgogICAgKgogICAgKiBAcmV0dXJuIFRoZSB0b3AtbGV2ZWwgbm9kZSBjb250ZXh0IG9mIHRoZSBlbnRpcmUgZXhwcmVzc2lvbi4KICAgICovCi0gIHB1YmxpYyBOb2RlIGdldEN1cnJlbnRDb250ZXh0Tm9kZSgpCisgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudENvbnRleHROb2RlKCkKICAgewogICAgIHJldHVybiBtX2N1cnJlbnRDb250ZXh0Tm9kZTsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvY29tcGlsZXIvQ29tcGlsZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKaW5kZXggNzBkNWY0NS4uYTVlN2Y4ZiAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvY29tcGlsZXIvQ29tcGlsZXIuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9jb21waWxlci9Db21waWxlci5qYXZhCkBAIC04OCwxMSArODgsMTIgQEAKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZUxvY2F0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuU0FYU291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNRmlsdGVyOwogCiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5FcnJvckxpc3RlbmVyOwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CiAKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKKy8vIGltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKIAogLyoqCiAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KQEAgLTc3NCw1OCArNzc1LDU4IEBACiAgICAgc3dpdGNoICh0ZXN0VHlwZSkKICAgICB7CiAgICAgY2FzZSBPcENvZGVzLk5PREVUWVBFX0NPTU1FTlQgOgotICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UOworICAgICAgcmV0dXJuIERUTUZpbHRlci5TSE9XX0NPTU1FTlQ7CiAgICAgY2FzZSBPcENvZGVzLk5PREVUWVBFX1RFWFQgOgotLy8gICAgICByZXR1cm4gTm9kZUZpbHRlci5TSE9XX1RFWFQgfCBOb2RlRmlsdGVyLlNIT1dfQ09NTUVOVDsKLSAgICAgIHJldHVybiBOb2RlRmlsdGVyLlNIT1dfVEVYVCB8IE5vZGVGaWx0ZXIuU0hPV19DREFUQV9TRUNUSU9OIDsKKy8vICAgICAgcmV0dXJuIERUTUZpbHRlci5TSE9XX1RFWFQgfCBEVE1GaWx0ZXIuU0hPV19DT01NRU5UOworICAgICAgcmV0dXJuIERUTUZpbHRlci5TSE9XX1RFWFQgfCBEVE1GaWx0ZXIuU0hPV19DREFUQV9TRUNUSU9OIDsKICAgICBjYXNlIE9wQ29kZXMuTk9ERVRZUEVfUEkgOgotICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOworICAgICAgcmV0dXJuIERUTUZpbHRlci5TSE9XX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047CiAgICAgY2FzZSBPcENvZGVzLk5PREVUWVBFX05PREUgOgotLy8gICAgICByZXR1cm4gTm9kZUZpbHRlci5TSE9XX0FMTDsKKy8vICAgICAgcmV0dXJuIERUTUZpbHRlci5TSE9XX0FMTDsKICAgICAgIHN3aXRjaCAoYXhlc1R5cGUpCiAgICAgICB7CiAgICAgICBjYXNlIE9wQ29kZXMuRlJPTV9OQU1FU1BBQ0U6Ci0gICAgICAgIHJldHVybiBOb2RlRmlsdGVyLlNIT1dfQVRUUklCVVRFIHwgTm9kZVRlc3QuU0hPV19OQU1FU1BBQ0U7CisgICAgICAgIHJldHVybiBEVE1GaWx0ZXIuU0hPV19BVFRSSUJVVEUgfCBEVE1GaWx0ZXIuU0hPV19OQU1FU1BBQ0U7CiAgICAgICBjYXNlIE9wQ29kZXMuRlJPTV9BVFRSSUJVVEVTIDoKICAgICAgIGNhc2UgT3BDb2Rlcy5NQVRDSF9BVFRSSUJVVEUgOgotICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5TSE9XX0FUVFJJQlVURTsKKyAgICAgICAgcmV0dXJuIERUTUZpbHRlci5TSE9XX0FUVFJJQlVURTsKICAgICAgIGNhc2UgT3BDb2Rlcy5GUk9NX1NFTEY6CiAgICAgICBjYXNlIE9wQ29kZXMuRlJPTV9BTkNFU1RPUlNfT1JfU0VMRjoKICAgICAgIGNhc2UgT3BDb2Rlcy5GUk9NX0RFU0NFTkRBTlRTX09SX1NFTEY6Ci0gICAgICAgIHJldHVybiBOb2RlRmlsdGVyLlNIT1dfQUxMOworICAgICAgICByZXR1cm4gRFRNRmlsdGVyLlNIT1dfQUxMOwogICAgICAgZGVmYXVsdDoKICAgICAgICAgaWYgKGdldE9wKDApID09IE9wQ29kZXMuT1BfTUFUQ0hQQVRURVJOKQotICAgICAgICAgIHJldHVybiB+Tm9kZUZpbHRlci5TSE9XX0FUVFJJQlVURQotICAgICAgICAgICAgICAgICAgJiB+Tm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UCi0gICAgICAgICAgICAgICAgICAmIH5Ob2RlRmlsdGVyLlNIT1dfRE9DVU1FTlRfRlJBR01FTlQ7CisgICAgICAgICAgcmV0dXJuIH5EVE1GaWx0ZXIuU0hPV19BVFRSSUJVVEUKKyAgICAgICAgICAgICAgICAgICYgfkRUTUZpbHRlci5TSE9XX0RPQ1VNRU5UCisgICAgICAgICAgICAgICAgICAmIH5EVE1GaWx0ZXIuU0hPV19ET0NVTUVOVF9GUkFHTUVOVDsKICAgICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiB+Tm9kZUZpbHRlci5TSE9XX0FUVFJJQlVURTsKKyAgICAgICAgICByZXR1cm4gfkRUTUZpbHRlci5TSE9XX0FUVFJJQlVURTsKICAgICAgIH0KICAgICBjYXNlIE9wQ29kZXMuTk9ERVRZUEVfUk9PVCA6Ci0gICAgICByZXR1cm4gTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UIHwgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UOworICAgICAgcmV0dXJuIERUTUZpbHRlci5TSE9XX0RPQ1VNRU5UIHwgRFRNRmlsdGVyLlNIT1dfRE9DVU1FTlRfRlJBR01FTlQ7CiAgICAgY2FzZSBPcENvZGVzLk5PREVUWVBFX0ZVTkNURVNUIDoKICAgICAgIHJldHVybiBOb2RlVGVzdC5TSE9XX0JZRlVOQ1RJT047CiAgICAgY2FzZSBPcENvZGVzLk5PREVOQU1FIDoKICAgICAgIHN3aXRjaCAoYXhlc1R5cGUpCiAgICAgICB7CiAgICAgICBjYXNlIE9wQ29kZXMuRlJPTV9OQU1FU1BBQ0UgOgotICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5TSE9XX0FUVFJJQlVURSB8IE5vZGVUZXN0LlNIT1dfTkFNRVNQQUNFOworICAgICAgICByZXR1cm4gRFRNRmlsdGVyLlNIT1dfQVRUUklCVVRFIHwgRFRNRmlsdGVyLlNIT1dfTkFNRVNQQUNFOwogICAgICAgY2FzZSBPcENvZGVzLkZST01fQVRUUklCVVRFUyA6CiAgICAgICBjYXNlIE9wQ29kZXMuTUFUQ0hfQVRUUklCVVRFIDoKLSAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuU0hPV19BVFRSSUJVVEU7CisgICAgICAgIHJldHVybiBEVE1GaWx0ZXIuU0hPV19BVFRSSUJVVEU7CiAKICAgICAgIC8vIGJyZWFrOwogICAgICAgY2FzZSBPcENvZGVzLk1BVENIX0FOWV9BTkNFU1RPUiA6CiAgICAgICBjYXNlIE9wQ29kZXMuTUFUQ0hfSU1NRURJQVRFX0FOQ0VTVE9SIDoKLSAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UOworICAgICAgICByZXR1cm4gRFRNRmlsdGVyLlNIT1dfRUxFTUVOVDsKIAogICAgICAgLy8gYnJlYWs7CiAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UOworICAgICAgICByZXR1cm4gRFRNRmlsdGVyLlNIT1dfRUxFTUVOVDsKICAgICAgIH0KICAgICBkZWZhdWx0IDoKICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbigiV2Ugc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUuIik7Ci0gICAgICByZXR1cm4gTm9kZUZpbHRlci5TSE9XX0FMTDsKKyAgICAgIHJldHVybiBEVE1GaWx0ZXIuU0hPV19BTEw7CiAgICAgfQogICB9CiAKQEAgLTg2OSwxMiArODcwLDEyIEBACiAgICAgY2FzZSBPcENvZGVzLkZST01fUk9PVCA6CiAgICAgICBhcmdMZW4gPSBnZXRBcmdMZW5ndGhPZlN0ZXAob3BQb3MpOwogICAgICAgb3BQb3MgPSBnZXRGaXJzdENoaWxkUG9zT2ZTdGVwKG9wUG9zKTsKLSAgICAgIHBhdHRlcm4gPSBuZXcgU3RlcFBhdHRlcm4oTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UIHwgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UKTsKKyAgICAgIHBhdHRlcm4gPSBuZXcgU3RlcFBhdHRlcm4oRFRNRmlsdGVyLlNIT1dfRE9DVU1FTlQgfCBEVE1GaWx0ZXIuU0hPV19ET0NVTUVOVF9GUkFHTUVOVCk7CiAgICAgICBicmVhazsKICAgICBjYXNlIE9wQ29kZXMuTUFUQ0hfQVRUUklCVVRFIDoKICAgICAgIGFyZ0xlbiA9IGdldEFyZ0xlbmd0aE9mU3RlcChvcFBvcyk7CiAgICAgICBvcFBvcyA9IGdldEZpcnN0Q2hpbGRQb3NPZlN0ZXAob3BQb3MpOwotICAgICAgcGF0dGVybiA9IG5ldyBTdGVwUGF0dGVybihOb2RlRmlsdGVyLlNIT1dfQVRUUklCVVRFLAorICAgICAgcGF0dGVybiA9IG5ldyBTdGVwUGF0dGVybihEVE1GaWx0ZXIuU0hPV19BVFRSSUJVVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0ZXBOUyhzdGFydE9wUG9zKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RlcExvY2FsTmFtZShzdGFydE9wUG9zKSk7CiAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jQm9vbGVhbi5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNCb29sZWFuLmphdmEKaW5kZXggOGFkZTYxNC4uZjJiOWM1ZSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNCb29sZWFuLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNCb29sZWFuLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoLmZ1bmN0aW9uczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogCiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNDZWlsaW5nLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0NlaWxpbmcuamF2YQppbmRleCBmZTcxMWU3Li4xOWIyYzBkIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0NlaWxpbmcuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0NlaWxpbmcuamF2YQpAQCAtNTgsNyArNTgsNyBAQAogCiBpbXBvcnQgamF2YS5sYW5nLk1hdGg7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jQ29uY2F0LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0NvbmNhdC5qYXZhCmluZGV4IDU5ODNjZDUuLmMyOGU1NjEgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jQ29uY2F0LmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNDb25jYXQuamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0NvbnRhaW5zLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0NvbnRhaW5zLmphdmEKaW5kZXggYzU2MWM0Yi4uNzA0M2Y3ZiAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNDb250YWlucy5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jQ29udGFpbnMuamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0NvdW50LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0NvdW50LmphdmEKaW5kZXggOTdjMDVhNC4uN2JhNjk4MiAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNDb3VudC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jQ291bnQuamF2YQpAQCAtNTgsOCArNTgsMTAgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgucmVzLlhQQVRIRXJyb3JSZXNvdXJjZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKQEAgLTg3LDEzICs4OSwxMyBAQAogICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCkgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCi0gICAgTm9kZUl0ZXJhdG9yIG5sID0gbV9hcmcwLmV4ZWN1dGUoeGN0eHQpLm5vZGVzZXQoKTsKKyAgICBEVE1JdGVyYXRvciBubCA9IG1fYXJnMC5leGVjdXRlKHhjdHh0KS5ub2Rlc2V0KCk7CiAKICAgICAvLyBXZSBzaG91bGQgcHJvYmFibHkgbWFrZSBhIGZ1bmN0aW9uIG9uIHRoZSBpdGVyYXRvciBmb3IgdGhpcywgCiAgICAgLy8gYXMgYSBnaXZlbiBpbXBsZW1lbnRhdGlvbiBjb3VsZCBvcHRpbWl6ZS4KICAgICBpbnQgaSA9IDA7CiAKLSAgICB3aGlsZSAobnVsbCAhPSBubC5uZXh0Tm9kZSgpKQorICAgIHdoaWxlIChEVE0uTlVMTCAhPSBubC5uZXh0Tm9kZSgpKQogICAgIHsKICAgICAgIGkrKzsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0N1cnJlbnQuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jQ3VycmVudC5qYXZhCmluZGV4IGZmMTc0NTMuLjkxMDBmZjQgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jQ3VycmVudC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jQ3VycmVudC5qYXZhCkBAIC01OCw4ICs1OCwxMCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5yZXMuWFBBVEhFcnJvclJlc291cmNlczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOwogCiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApAQCAtNzksMjEgKzgxLDYgQEAKIHsKIAogICAvKioKLSAgICogRGlhZ25vc3RpY3MgdG8gc2hvdyBzdHJpbmcgb3V0cHV0IGZyb20gYSBub2RlLgotICAgKgotICAgKiBAcGFyYW0gbiBUaGUgaW5wdXQgbm9kZSwgd2hpY2ggbWF5IGJlIG51bGwuCi0gICAqCi0gICAqIEByZXR1cm4gQSBkaWFnbm9zdGljcyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBub2RlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBub2RlVG9TdHJpbmcoTm9kZSBuKQotICB7Ci0KLSAgICByZXR1cm4gKG51bGwgIT0gbikKLSAgICAgICAgICAgPyBuLmdldE5vZGVOYW1lKCkgKyAieyIgKyAoKG9yZy5hcGFjaGUueGFsYW4uc3RyZWUuQ2hpbGQpIG4pLmdldFVpZCgpICsgIn0iCi0gICAgICAgICAgIDogIm51bGwiOwotICB9Ci0KLSAgLyoqCiAgICAqIEV4ZWN1dGUgdGhlIGZ1bmN0aW9uLiAgVGhlIGZ1bmN0aW9uIG11c3QgcmV0dXJuCiAgICAqIGEgdmFsaWQgb2JqZWN0LgogICAgKiBAcGFyYW0geGN0eHQgVGhlIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHQuCkBAIC0xMDYsNyArOTMsNyBAQAogCiAgICAgLy8gSWYgd2UncmUgaW4gYSBwcmVkaWNhdGUsIHRoZW4gdGhpcyB3aWxsIHJldHVybiBub24tbnVsbC4KICAgICBQcmVkaWNhdGVkTm9kZVRlc3QgaXRlciA9IChQcmVkaWNhdGVkTm9kZVRlc3QpIHhjdHh0LmdldFN1YkNvbnRleHRMaXN0KCk7Ci0gICAgTm9kZSBjdXJyZW50Tm9kZTsKKyAgICBpbnQgY3VycmVudE5vZGU7CiAKICAgICBpZiAobnVsbCAhPSBpdGVyKQogICAgIHsKQEAgLTExNiwxNiArMTAzLDE3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBDb250ZXh0Tm9kZUxpc3QgY25sID0geGN0eHQuZ2V0Q29udGV4dE5vZGVMaXN0KCk7CisgICAgICBEVE1JdGVyYXRvciBjbmwgPSB4Y3R4dC5nZXRDb250ZXh0Tm9kZUxpc3QoKTsKIAogICAgICAgaWYgKG51bGwgIT0gY25sKQogICAgICAgeworICAgICAgICAvLyAlUkVWSUVXJSBOb3Qgc28gY2VydGFpbiB0aGF0IHRoaXMgaXMgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nPwogICAgICAgICBjdXJyZW50Tm9kZSA9IGNubC5nZXRDdXJyZW50Tm9kZSgpOwogICAgICAgfQogICAgICAgZWxzZQotICAgICAgICBjdXJyZW50Tm9kZSA9IG51bGw7CisgICAgICAgIGN1cnJlbnROb2RlID0gRFRNLk5VTEw7CiAgICAgfQogCi0gICAgcmV0dXJuIG5ldyBYTm9kZVNldChjdXJyZW50Tm9kZSk7CisgICAgcmV0dXJuIG5ldyBYTm9kZVNldChjdXJyZW50Tm9kZSwgeGN0eHQuZ2V0RFRNTWFuYWdlcigpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNEb2Nsb2NhdGlvbi5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNEb2Nsb2NhdGlvbi5qYXZhCmluZGV4IGRkMzgyNGUuLjJhYmYwMDcgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jRG9jbG9jYXRpb24uamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0RvY2xvY2F0aW9uLmphdmEKQEAgLTU2LDkgKzU2LDEwIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54cGF0aC5mdW5jdGlvbnM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKQEAgLTg2LDIxICs4NywyNCBAQAogICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCkgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCi0gICAgTm9kZSB3aGVyZU5vZGUgPSBnZXRBcmcwQXNOb2RlKHhjdHh0KTsKKyAgICBpbnQgd2hlcmVOb2RlID0gZ2V0QXJnMEFzTm9kZSh4Y3R4dCk7CiAgICAgU3RyaW5nIGZpbGVMb2NhdGlvbiA9IG51bGw7CiAKLSAgICBpZiAobnVsbCAhPSB3aGVyZU5vZGUpCisgICAgaWYgKERUTS5OVUxMICE9IHdoZXJlTm9kZSkKICAgICB7Ci0gICAgICBpZiAoTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFID09IHdoZXJlTm9kZS5nZXROb2RlVHlwZSgpKQorICAgICAgRFRNIGR0bSA9IHhjdHh0LmdldERUTSh3aGVyZU5vZGUpOworICAgICAgCisgICAgICAvLyAlUkVWSUVXJQorICAgICAgaWYgKERUTS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFID09ICBkdG0uZ2V0Tm9kZVR5cGUod2hlcmVOb2RlKSkKICAgICAgIHsKLSAgICAgICAgd2hlcmVOb2RlID0gd2hlcmVOb2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgd2hlcmVOb2RlID0gZHRtLmdldEZpcnN0Q2hpbGQod2hlcmVOb2RlKTsKICAgICAgIH0KIAotICAgICAgaWYgKG51bGwgIT0gd2hlcmVOb2RlKQotICAgICAgewotICAgICAgICBEb2N1bWVudCBvd25lciA9IHdoZXJlTm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0KLSAgICAgICAgZmlsZUxvY2F0aW9uID0geGN0eHQuZ2V0U291cmNlVHJlZU1hbmFnZXIoKS5maW5kVVJJRnJvbURvYyhvd25lcik7CisgICAgICBpZiAoRFRNLk5VTEwgIT0gd2hlcmVOb2RlKQorICAgICAgeyAgICAgICAgCisgICAgICAgIGZpbGVMb2NhdGlvbiA9IGR0bS5nZXREb2N1bWVudEJhc2VVUkkoKTsKKy8vICAgICAgICBpbnQgb3duZXIgPSBkdG0uZ2V0RG9jdW1lbnQoKTsKKy8vICAgICAgICBmaWxlTG9jYXRpb24gPSB4Y3R4dC5nZXRTb3VyY2VUcmVlTWFuYWdlcigpLmZpbmRVUklGcm9tRG9jKG93bmVyKTsKICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jRXh0RWxlbWVudEF2YWlsYWJsZS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNFeHRFbGVtZW50QXZhaWxhYmxlLmphdmEKaW5kZXggYWZlZjQ2Ny4uYTQ2ZGQ2MyAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNFeHRFbGVtZW50QXZhaWxhYmxlLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNFeHRFbGVtZW50QXZhaWxhYmxlLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGw7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jRXh0RnVuY3Rpb24uamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jRXh0RnVuY3Rpb24uamF2YQppbmRleCAxNTU3ZmVlLi5hMTdhZGU3IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0V4dEZ1bmN0aW9uLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNFeHRGdW5jdGlvbi5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLio7CiBpbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5leHRlbnNpb25zLkV4dGVuc2lvbnNUYWJsZTsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKIApAQCAtMTM5LDcgKzEzOSw3IEBACiAKICAgICBFeHRlbnNpb25zVGFibGUgZXRhYmxlID0geGN0eHQuZ2V0RXh0ZW5zaW9uc1RhYmxlKCk7CiAgICAgT2JqZWN0IHZhbCA9IGV0YWJsZS5leHRGdW5jdGlvbihtX25hbWVzcGFjZSwgbV9leHRlbnNpb25OYW1lLCBhcmdWZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX21ldGhvZEtleSwgeGN0eHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9tZXRob2RLZXksIHhjdHh0LmdldEV4cHJlc3Npb25Db250ZXh0KCkpOwogCiAgICAgaWYgKG51bGwgIT0gdmFsKQogICAgIHsKQEAgLTE2OCwxNyArMTY4LDE5IEBACiAgICAgICB7CiAgICAgICAgIHJlc3VsdCA9IG5ldyBYTnVtYmVyKCgoRG91YmxlKSB2YWwpLmRvdWJsZVZhbHVlKCkpOwogICAgICAgfQotICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkKKyAgICAgIC8vICVUQkQlCisvLyAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpCisvLyAgICAgIHsKKy8vICAgICAgICByZXN1bHQgPSBuZXcgWFJUcmVlRnJhZygoRG9jdW1lbnRGcmFnbWVudCkgdmFsKTsKKy8vICAgICAgfQorLy8gICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBOb2RlSXRlcmF0b3IpCisvLyAgICAgIHsKKy8vICAgICAgICByZXN1bHQgPSBuZXcgWE5vZGVTZXQoKE5vZGVJdGVyYXRvcikgdmFsKTsKKy8vICAgICAgfQorICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uTm9kZSkKICAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFhSVHJlZUZyYWcoKERvY3VtZW50RnJhZ21lbnQpIHZhbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBOb2RlSXRlcmF0b3IpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBYTm9kZVNldCgoTm9kZUl0ZXJhdG9yKSB2YWwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFhOb2RlU2V0KChOb2RlKSB2YWwpOworICAgICAgICByZXN1bHQgPSBuZXcgWE5vZGVTZXQoeGN0eHQuZ2V0RFRNSGFuZGxlRnJvbU5vZGUoKG9yZy53M2MuZG9tLk5vZGUpdmFsKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y3R4dC5nZXREVE1NYW5hZ2VyKCkpOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNFeHRGdW5jdGlvbkF2YWlsYWJsZS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNFeHRGdW5jdGlvbkF2YWlsYWJsZS5qYXZhCmluZGV4IDg3MzY0YTIuLmY4MTk5NjEgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jRXh0RnVuY3Rpb25BdmFpbGFibGUuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0V4dEZ1bmN0aW9uQXZhaWxhYmxlLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS54YWxhbi5leHRlbnNpb25zLkV4dGVuc2lvbnNUYWJsZTsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogCiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNGYWxzZS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNGYWxzZS5qYXZhCmluZGV4IDQ1OTdjNTUuLmQ0YjBiMGYgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jRmFsc2UuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0ZhbHNlLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoLmZ1bmN0aW9uczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogCiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNGbG9vci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNGbG9vci5qYXZhCmluZGV4IDFkYmU5OWUuLmQ3ZGMwZTEgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jRmxvb3IuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0Zsb29yLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoLmZ1bmN0aW9uczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogCiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNHZW5lcmF0ZUlkLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0dlbmVyYXRlSWQuamF2YQppbmRleCAwNzc5MDkwLi5kYmZhNDEyIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0dlbmVyYXRlSWQuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0dlbmVyYXRlSWQuamF2YQpAQCAtNTYsOCArNTYsOSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKQEAgLTg0LDEwICs4NSwxMCBAQAogICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCkgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCi0gICAgTm9kZSB3aGljaCA9IGdldEFyZzBBc05vZGUoeGN0eHQpOworICAgIGludCB3aGljaCA9IGdldEFyZzBBc05vZGUoeGN0eHQpOwogCi0gICAgaWYgKG51bGwgIT0gd2hpY2gpCi0gICAgICByZXR1cm4gbmV3IFhTdHJpbmcoeGN0eHQuZ2V0RE9NSGVscGVyKCkuZ2V0VW5pcXVlSUQod2hpY2gpKTsKKyAgICBpZiAoRFRNLk5VTEwgIT0gd2hpY2gpCisgICAgICByZXR1cm4gbmV3IFhTdHJpbmcoIk4iICsgSW50ZWdlci50b0hleFN0cmluZyh3aGljaCsxKS50b1VwcGVyQ2FzZSgpKTsKICAgICBlbHNlCiAgICAgICByZXR1cm4gWFN0cmluZy5FTVBUWVNUUklORzsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNJZC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNJZC5qYXZhCmluZGV4IDg3NTJlNjYuLjllZmVmODUgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jSWQuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0lkLmphdmEKQEAgLTYxLDkgKzYxLDEwIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLnJlcy5YUEFUSEVycm9yUmVzb3VyY2VzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC05NSw3ICs5Niw3IEBACiAgICAqCiAgICAqIEByZXR1cm4gVGhlIHVzZWRyZWZzIHZhbHVlLgogICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmdWZWN0b3IgZ2V0Tm9kZXNCeUlEKFhQYXRoQ29udGV4dCB4Y3R4dCwgRG9jdW1lbnQgZG9jQ29udGV4dCwKKyAgcHJpdmF0ZSBTdHJpbmdWZWN0b3IgZ2V0Tm9kZXNCeUlEKFhQYXRoQ29udGV4dCB4Y3R4dCwgaW50IGRvY0NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVmdmFsLCBTdHJpbmdWZWN0b3IgdXNlZHJlZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlU2V0IG5vZGVTZXQsIGJvb2xlYW4gbWF5QmVNb3JlKQogICB7CkBAIC0xMDMsOSArMTA0LDEwIEBACiAgICAgaWYgKG51bGwgIT0gcmVmdmFsKQogICAgIHsKICAgICAgIFN0cmluZyByZWYgPSBudWxsOwotICAgICAgRE9NSGVscGVyIGRoID0geGN0eHQuZ2V0RE9NSGVscGVyKCk7CisvLyAgICAgIERPTUhlbHBlciBkaCA9IHhjdHh0LmdldERPTUhlbHBlcigpOwogICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmVmdmFsKTsKICAgICAgIGJvb2xlYW4gaGFzTW9yZSA9IHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7CisgICAgICBEVE0gZHRtID0geGN0eHQuZ2V0RFRNKGRvY0NvbnRleHQpOwogCiAgICAgICB3aGlsZSAoaGFzTW9yZSkKICAgICAgIHsKQEAgLTExOSw5ICsxMjEsOSBAQAogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgTm9kZSBub2RlID0gZGguZ2V0RWxlbWVudEJ5SUQocmVmLCBkb2NDb250ZXh0KTsKKyAgICAgICAgaW50IG5vZGUgPSBkdG0uZ2V0RWxlbWVudEJ5SWQocmVmKTsKIAotICAgICAgICBpZiAobnVsbCAhPSBub2RlKQorICAgICAgICBpZiAoRFRNLk5VTEwgIT0gbm9kZSkKICAgICAgICAgICBub2RlU2V0LmFkZE5vZGVJbkRvY09yZGVyKG5vZGUsIHhjdHh0KTsKIAogICAgICAgICBpZiAoKG51bGwgIT0gcmVmKSAmJiAoaGFzTW9yZSB8fCBtYXlCZU1vcmUpKQpAQCAtMTQ4LDMxICsxNTAsMzIgQEAKICAgcHVibGljIFhPYmplY3QgZXhlY3V0ZShYUGF0aENvbnRleHQgeGN0eHQpIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAotICAgIE5vZGUgY29udGV4dCA9IHhjdHh0LmdldEN1cnJlbnROb2RlKCk7Ci0gICAgRG9jdW1lbnQgZG9jQ29udGV4dCA9IChOb2RlLkRPQ1VNRU5UX05PREUgPT0gY29udGV4dC5nZXROb2RlVHlwZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICA/IChEb2N1bWVudCkgY29udGV4dCA6IGNvbnRleHQuZ2V0T3duZXJEb2N1bWVudCgpOworICAgIGludCBjb250ZXh0ID0geGN0eHQuZ2V0Q3VycmVudE5vZGUoKTsKKyAgICBEVE0gZHRtID0geGN0eHQuZ2V0RFRNKGNvbnRleHQpOworICAgIGludCBkb2NDb250ZXh0ID0gZHRtLmdldERvY3VtZW50KCk7CiAKLSAgICBpZiAobnVsbCA9PSBkb2NDb250ZXh0KQorICAgIGlmIChEVE0uTlVMTCA9PSBkb2NDb250ZXh0KQogICAgICAgZXJyb3IoeGN0eHQsIFhQQVRIRXJyb3JSZXNvdXJjZXMuRVJfQ09OVEVYVF9IQVNfTk9fT1dORVJET0MsIG51bGwpOwogCiAgICAgWE9iamVjdCBhcmcgPSBtX2FyZzAuZXhlY3V0ZSh4Y3R4dCk7CiAgICAgaW50IGFyZ1R5cGUgPSBhcmcuZ2V0VHlwZSgpOwotICAgIFhOb2RlU2V0IG5vZGVzID0gbmV3IFhOb2RlU2V0KCk7CisgICAgWE5vZGVTZXQgbm9kZXMgPSBuZXcgWE5vZGVTZXQoeGN0eHQuZ2V0RFRNTWFuYWdlcigpKTsKICAgICBOb2RlU2V0IG5vZGVTZXQgPSBub2Rlcy5tdXRhYmxlTm9kZXNldCgpOwogCiAgICAgaWYgKFhPYmplY3QuQ0xBU1NfTk9ERVNFVCA9PSBhcmdUeXBlKQogICAgIHsKLSAgICAgIE5vZGVJdGVyYXRvciBuaSA9IGFyZy5ub2Rlc2V0KCk7CisgICAgICBEVE1JdGVyYXRvciBuaSA9IGFyZy5ub2Rlc2V0KCk7CiAgICAgICBTdHJpbmdWZWN0b3IgdXNlZHJlZnMgPSBudWxsOwotICAgICAgTm9kZSBwb3MgPSBuaS5uZXh0Tm9kZSgpOworICAgICAgaW50IHBvcyA9IG5pLm5leHROb2RlKCk7CiAKLSAgICAgIHdoaWxlIChudWxsICE9IHBvcykKKyAgICAgIHdoaWxlIChEVE0uTlVMTCAhPSBwb3MpCiAgICAgICB7Ci0gICAgICAgIFN0cmluZyByZWZ2YWwgPSBET01IZWxwZXIuZ2V0Tm9kZURhdGEocG9zKTsKKyAgICAgICAgRFRNIG5kdG0gPSBuaS5nZXREVE0ocG9zKTsKKyAgICAgICAgU3RyaW5nIHJlZnZhbCA9IG5kdG0uZ2V0U3RyaW5nVmFsdWUocG9zKS50b1N0cmluZygpOwogCiAgICAgICAgIHBvcyA9IG5pLm5leHROb2RlKCk7CiAgICAgICAgIHVzZWRyZWZzID0gZ2V0Tm9kZXNCeUlEKHhjdHh0LCBkb2NDb250ZXh0LCByZWZ2YWwsIHVzZWRyZWZzLCBub2RlU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHBvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERUTS5OVUxMICE9IHBvcyk7CiAgICAgICB9CiAgICAgICAvLyBuaS5kZXRhY2goKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0xhbmcuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTGFuZy5qYXZhCmluZGV4IGU3MzA5NzYuLjVlMzM1NTkgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTGFuZy5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTGFuZy5qYXZhCkBAIC01Niw4ICs1NiwxMCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC04NSwxNyArODcsMjAgQEAKICAgewogCiAgICAgU3RyaW5nIGxhbmcgPSBtX2FyZzAuZXhlY3V0ZSh4Y3R4dCkuc3RyKCk7Ci0gICAgTm9kZSBwYXJlbnQgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOworICAgIGludCBwYXJlbnQgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOwogICAgIGJvb2xlYW4gaXNMYW5nID0gZmFsc2U7CisgICAgRFRNIGR0bSA9IHhjdHh0LmdldERUTShwYXJlbnQpOwogCi0gICAgd2hpbGUgKG51bGwgIT0gcGFyZW50KQorICAgIHdoaWxlIChEVE0uTlVMTCAhPSBwYXJlbnQpCiAgICAgewotICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IHBhcmVudC5nZXROb2RlVHlwZSgpKQorICAgICAgaWYgKERUTS5FTEVNRU5UX05PREUgPT0gZHRtLmdldE5vZGVUeXBlKHBhcmVudCkpCiAgICAgICB7Ci0gICAgICAgIFN0cmluZyBsYW5nVmFsID0gKChFbGVtZW50KSBwYXJlbnQpLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKTsKKyAgICAgICAgaW50IGxhbmdBdHRyID0gZHRtLmdldEF0dHJpYnV0ZU5vZGUocGFyZW50LCAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwgImxhbmciKTsKIAotICAgICAgICBpZiAoKG51bGwgIT0gbGFuZ1ZhbCkgJiYgKGxhbmdWYWwubGVuZ3RoKCkgPiAwKSkKKyAgICAgICAgaWYgKERUTS5OVUxMICE9IGxhbmdBdHRyKQogICAgICAgICB7CisgICAgICAgICAgU3RyaW5nIGxhbmdWYWwgPSBkdG0uZ2V0Tm9kZVZhbHVlKGxhbmdBdHRyKTsKKyAgICAgICAgICAvLyAlT1BUJQogICAgICAgICAgIGlmIChsYW5nVmFsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChsYW5nLnRvTG93ZXJDYXNlKCkpKQogICAgICAgICAgIHsKICAgICAgICAgICAgIGludCB2YWxMZW4gPSBsYW5nLmxlbmd0aCgpOwpAQCAtMTExLDcgKzExNiw3IEBACiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgcGFyZW50ID0geGN0eHQuZ2V0RE9NSGVscGVyKCkuZ2V0UGFyZW50T2ZOb2RlKHBhcmVudCk7CisgICAgICBwYXJlbnQgPSBkdG0uZ2V0UGFyZW50KHBhcmVudCk7CiAgICAgfQogCiAgICAgcmV0dXJuIGlzTGFuZyA/IFhCb29sZWFuLlNfVFJVRSA6IFhCb29sZWFuLlNfRkFMU0U7CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0xhc3QuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTGFzdC5qYXZhCmluZGV4IGRhNmNmNTUuLjA0OTU3NGUgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTGFzdC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTGFzdC5qYXZhCkBAIC01Niw4ICs1NiwxMCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC05Myw0NiArOTUsMTQgQEAKICAgICAvLyBhc3NlcnQobnVsbCAhPSBtX2NvbnRleHROb2RlTGlzdCwgIm1fY29udGV4dE5vZGVMaXN0IG11c3QgYmUgbm9uLW51bGwiKTsKICAgICAvLyBJZiB3ZSdyZSBpbiBhIHByZWRpY2F0ZSwgdGhlbiB0aGlzIHdpbGwgcmV0dXJuIG5vbi1udWxsLgogICAgIFN1YkNvbnRleHRMaXN0IGl0ZXIgPSB4Y3R4dC5nZXRTdWJDb250ZXh0TGlzdCgpOwotCisgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJpdGVyOiAiK2l0ZXIpOwogICAgIGlmIChudWxsICE9IGl0ZXIpCiAgICAgICByZXR1cm4gaXRlci5nZXRMYXN0UG9zKHhjdHh0KTsKIAotICAgIENvbnRleHROb2RlTGlzdCBjbmwgPSB4Y3R4dC5nZXRDb250ZXh0Tm9kZUxpc3QoKTsKLQotICAgIGlmIChjbmwuc2l6ZSgpID09IDApCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIE5vZGVJdGVyYXRvciBuaSA9IChOb2RlSXRlcmF0b3IpY25sLmNsb25lKCk7Ci0gICAgICAgIGludCBjb3VudCA9IGNubC5nZXRDdXJyZW50UG9zKCk7Ci0gICAgICAgIHdoaWxlKG51bGwgIT0gbmkubmV4dE5vZGUoKSkKLSAgICAgICAgICBjb3VudCsrOwotICAgICAgICBjbmwuc2V0TGFzdChjb3VudCk7Ci0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgIH0KLSAgICAgIGNhdGNoKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNuc2Upe30KLSAgICB9Ci0gICAgcmV0dXJuIGNubC5zaXplKCk7Ci0KLSAgICAvKgotICAgIC8vIFRoZSBjb2RlIGJlbG93IGhhcyBtYXNzaXZlIHByb2JsZW0gaWYgaW5zaWRlIG9mIGEgcHJlZGljYXRlLiAgLXNiCi0gICAgaWYgKGNubC5zaXplKCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgY3VycmVudFBvcyA9IGNubC5nZXRDdXJyZW50UG9zKCk7Ci0KLSAgICAgIC8vIFRoaXMgaGFzIHByb2JsZW1zIGlmIGluc2lkZSBhIHByZWRpY2F0ZS4gIEZvciBub3csIGp1c3QgY2xvbmUuCi0gICAgICBpZiAoIWNubC5pc0ZyZXNoKCkpCi0gICAgICAgIGNubC5yZXNldCgpOwotCi0gICAgICBjbmwuc2V0U2hvdWxkQ2FjaGVOb2Rlcyh0cnVlKTsKLSAgICAgIGNubC5ydW5UbygtMSk7Ci0gICAgICBjbmwuc2V0Q3VycmVudFBvcyhjdXJyZW50UG9zKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY25sLmdldEN1cnJlbnRQb3MoKSBhZnRlcjogIitjbmwuZ2V0Q3VycmVudFBvcygpKTsKLSAgICB9Ci0KLSAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNubC5zaXplKCk6ICIrY25sLnNpemUoKSk7Ci0gICAgcmV0dXJuIGNubC5zaXplKCk7Ci0gICAgKi8KKyAgICBEVE1JdGVyYXRvciBjbmwgPSB4Y3R4dC5nZXRDb250ZXh0Tm9kZUxpc3QoKTsKKyAgICBpbnQgY291bnQgPSBjbmwuZ2V0TGVuZ3RoKCk7CisgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb3VudDogIitjb3VudCk7ICAgIAorICAgIHJldHVybiBjb3VudDsKICAgfQogCiAgIC8qKgpAQCAtMTQ1LDYgKzExNSw4IEBACiAgICAqLwogICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCkgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewotICAgIHJldHVybiBuZXcgWE51bWJlcigoZG91YmxlKSBnZXRDb3VudE9mQ29udGV4dE5vZGVMaXN0KHhjdHh0KSk7CisgICAgWE51bWJlciB4bnVtID0gbmV3IFhOdW1iZXIoKGRvdWJsZSkgZ2V0Q291bnRPZkNvbnRleHROb2RlTGlzdCh4Y3R4dCkpOworICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigibGFzdDogIit4bnVtLm51bSgpKTsKKyAgICByZXR1cm4geG51bTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNMb2NhbFBhcnQuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTG9jYWxQYXJ0LmphdmEKaW5kZXggNjQ2YzA5Ny4uNTM4MDNkZiAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNMb2NhbFBhcnQuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY0xvY2FsUGFydC5qYXZhCkBAIC01OCw4ICs1OCwxMCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5yZXMuWFBBVEhFcnJvclJlc291cmNlczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOwogCiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApAQCAtODYsMTEgKzg4LDkgQEAKICAgcHVibGljIFhPYmplY3QgZXhlY3V0ZShYUGF0aENvbnRleHQgeGN0eHQpIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAotICAgIE5vZGUgY29udGV4dCA9IGdldEFyZzBBc05vZGUoeGN0eHQpOwotICAgIAotICAgIFN0cmluZyBzID0gKGNvbnRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgPyB4Y3R4dC5nZXRET01IZWxwZXIoKS5nZXRMb2NhbE5hbWVPZk5vZGUoY29udGV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgOiAiIjsKKyAgICBpbnQgY29udGV4dCA9IGdldEFyZzBBc05vZGUoeGN0eHQpOworICAgIERUTSBkdG0gPSB4Y3R4dC5nZXREVE0oY29udGV4dCk7CisgICAgU3RyaW5nIHMgPSAoY29udGV4dCAhPSBEVE0uTlVMTCkgPyBkdG0uZ2V0TG9jYWxOYW1lKGNvbnRleHQpIDogIiI7CiAgICAgaWYocy5zdGFydHNXaXRoKCIjIikgfHwgcy5lcXVhbHMoInhtbG5zIikpCiAgICAgICBzID0gIiI7CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTmFtZXNwYWNlLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY05hbWVzcGFjZS5qYXZhCmluZGV4IDFhNjRjYzEuLjZhMzkyNWYgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTmFtZXNwYWNlLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNOYW1lc3BhY2UuamF2YQpAQCAtNTgsOCArNTgsMTAgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgucmVzLlhQQVRIRXJyb3JSZXNvdXJjZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKQEAgLTg2LDI3ICs4OCwyOCBAQAogICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCkgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCi0gICAgTm9kZSBjb250ZXh0ID0gZ2V0QXJnMEFzTm9kZSh4Y3R4dCk7CisgICAgaW50IGNvbnRleHQgPSBnZXRBcmcwQXNOb2RlKHhjdHh0KTsKICAgICAKICAgICBTdHJpbmcgczsKLSAgICBpZihjb250ZXh0ICE9IG51bGwpCisgICAgaWYoY29udGV4dCAhPSBEVE0uTlVMTCkKICAgICB7Ci0gICAgICBpbnQgdCA9IGNvbnRleHQuZ2V0Tm9kZVR5cGUoKTsKLSAgICAgIGlmKHQgPT0gTm9kZS5FTEVNRU5UX05PREUpCisgICAgICBEVE0gZHRtID0geGN0eHQuZ2V0RFRNKGNvbnRleHQpOworICAgICAgaW50IHQgPSBkdG0uZ2V0Tm9kZVR5cGUoY29udGV4dCk7CisgICAgICBpZih0ID09IERUTS5FTEVNRU5UX05PREUpCiAgICAgICB7Ci0gICAgICAgIHMgPSB4Y3R4dC5nZXRET01IZWxwZXIoKS5nZXROYW1lc3BhY2VPZk5vZGUoY29udGV4dCk7CisgICAgICAgIHMgPSBkdG0uZ2V0TmFtZXNwYWNlVVJJKGNvbnRleHQpOwogICAgICAgfQotICAgICAgZWxzZSBpZih0ID09IE5vZGUuQVRUUklCVVRFX05PREUpCisgICAgICBlbHNlIGlmKHQgPT0gRFRNLkFUVFJJQlVURV9OT0RFKQogICAgICAgewogCiAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGZvciBuYW1lc3BhY2Ugbm9kZXMuCiAgICAgICAgIC8vIFdlIGNoZWNrIGZvciB0aG9zZSBoZXJlLiAgRml4IGluc3BpcmVkIGJ5IERhdmFudW0gU3Jpbml2YXMuCiAKLSAgICAgICAgcyA9IGNvbnRleHQuZ2V0Tm9kZU5hbWUoKTsKKyAgICAgICAgcyA9IGR0bS5nZXROb2RlTmFtZShjb250ZXh0KTsKICAgICAgICAgaWYocy5zdGFydHNXaXRoKCJ4bWxuczoiKSB8fCBzLmVxdWFscygieG1sbnMiKSkKICAgICAgICAgICByZXR1cm4gWFN0cmluZy5FTVBUWVNUUklORzsKIAotICAgICAgICBzID0geGN0eHQuZ2V0RE9NSGVscGVyKCkuZ2V0TmFtZXNwYWNlT2ZOb2RlKGNvbnRleHQpOworICAgICAgICBzID0gZHRtLmdldE5hbWVzcGFjZVVSSShjb250ZXh0KTsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgICAgcmV0dXJuIFhTdHJpbmcuRU1QVFlTVFJJTkc7CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY05vcm1hbGl6ZVNwYWNlLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY05vcm1hbGl6ZVNwYWNlLmphdmEKaW5kZXggMTYyZTBhYS4uMDcxNTAzNSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNOb3JtYWxpemVTcGFjZS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTm9ybWFsaXplU3BhY2UuamF2YQpAQCAtNTgsNyArNTgsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5yZXMuWFBBVEhFcnJvclJlc291cmNlczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogCiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApAQCAtNjcsNyArNjcsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWFN0cmluZzsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE5vZGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhNTFN0cmluZ0ZhY3RvcnlJbXBsOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTENoYXJhY3RlclJlY29nbml6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MU3RyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuRmFzdFN0cmluZ0J1ZmZlcjsKIAogLyoqCiAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KQEAgLTg3LDExOSArOTEsOSBAQAogICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCkgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCi0gICAgU3RyaW5nIHMxID0gZ2V0QXJnMEFzU3RyaW5nKHhjdHh0KTsKKyAgICBYTUxTdHJpbmcgczEgPSBnZXRBcmcwQXNTdHJpbmcoeGN0eHQpOwogCi0gICAgcmV0dXJuIG5ldyBYU3RyaW5nKGZpeFdoaXRlU3BhY2UoczEsIHRydWUsIHRydWUsIGZhbHNlKSk7CisgICAgcmV0dXJuIChYU3RyaW5nKXMxLmZpeFdoaXRlU3BhY2UodHJ1ZSwgdHJ1ZSwgZmFsc2UpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIDx2YXI+Y2g8L3Zhcj4gY29uZm9ybXMgdG8gdGhlIFhNTCAxLjAgZGVmaW5pdGlvbgotICAgKiBvZiB3aGl0ZXNwYWNlLiAgUmVmZXIgdG8gPEEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwI05ULVMiPgotICAgKiB0aGUgZGVmaW5pdGlvbiBvZiA8Q09ERT5TPC9DT0RFPjwvQT4gZm9yIGRldGFpbHMuCi0gICAqIEBwYXJhbSAgIGNoICAgICAgQ2hhcmFjdGVyIHRvIGNoZWNrIGFzIFhNTCB3aGl0ZXNwYWNlLgotICAgKiBAcmV0dXJuICAgICAgICAgID10cnVlIGlmIDx2YXI+Y2g8L3Zhcj4gaXMgWE1MIHdoaXRlc3BhY2U7IG90aGVyd2lzZSA9ZmFsc2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3BhY2UoY2hhciBjaCkKLSAgewotICAgIHJldHVybiBYTUxDaGFyYWN0ZXJSZWNvZ25pemVyLmlzV2hpdGVTcGFjZShjaCk7ICAvLyBUYWtlIHRoZSBlYXN5IHdheSBvdXQgZm9yIG5vdy4KLSAgfQotCi0gIC8qKgotICAgKiAoQ29kZSBzdG9sZW4gYW5kIG1vZGlmaWVkIGZyb20gWE1MNEopCi0gICAqIENvbmRpdGlvbmFsbHkgdHJpbSBhbGwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpbiB0aGUgc3BlY2lmaWVkIFN0cmluZy4KLSAgICogQWxsIHN0cmluZ3Mgb2Ygd2hpdGUgc3BhY2UgYXJlCi0gICAqIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIHNwYWNlIGNoYXJhY3RlciAoI3gyMCksIGV4Y2VwdCBzcGFjZXMgYWZ0ZXIgcHVuY3R1YXRpb24gd2hpY2gKLSAgICogcmVjZWl2ZSBkb3VibGUgc3BhY2VzIGlmIGRvdWJsZVB1bmN0dWF0aW9uU3BhY2VzIGlzIHRydWUuCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWZ1bCB0byBhIGZvcm1hdHRlciwgYnV0IHRvIGdldCBmaXJzdCBjbGFzcwotICAgKiByZXN1bHRzLCB0aGUgZm9ybWF0dGVyIHNob3VsZCBwcm9iYWJseSBkbyBpdCdzIG93biB3aGl0ZSBzcGFjZSBoYW5kbGluZwotICAgKiBiYXNlZCBvbiB0aGUgc2VtYW50aWNzIG9mIHRoZSBmb3JtYXR0aW5nIG9iamVjdC4KLSAgICogQHBhcmFtICAgc3RyaW5nICAgICAgU3RyaW5nIHRvIGJlIHRyaW1tZWQuCi0gICAqIEBwYXJhbSAgIHRyaW1IZWFkICAgIFRyaW0gbGVhZGluZyB3aGl0ZXNwYWNlPwotICAgKiBAcGFyYW0gICB0cmltVGFpbCAgICBUcmltIHRyYWlsaW5nIHdoaXRlc3BhY2U/Ci0gICAqIEBwYXJhbSAgIGRvdWJsZVB1bmN0dWF0aW9uU3BhY2VzICAgIFVzZSBkb3VibGUgc3BhY2VzIGZvciBwdW5jdHVhdGlvbj8KLSAgICogQHJldHVybiAgICAgICAgICAgICAgVGhlIHRyaW1tZWQgc3RyaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmaXhXaGl0ZVNwYWNlKFN0cmluZyBzdHJpbmcsIGJvb2xlYW4gdHJpbUhlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHRyaW1UYWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb3VibGVQdW5jdHVhdGlvblNwYWNlcykKLSAgewotCi0gICAgY2hhcltdIGJ1ZiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotICAgIGludCBsZW4gPSBidWYubGVuZ3RoOwotICAgIGJvb2xlYW4gZWRpdCA9IGZhbHNlOwotICAgIGludCBzOwotCi0gICAgZm9yIChzID0gMDsgcyA8IGxlbjsgcysrKQotICAgIHsKLSAgICAgIGlmIChpc1NwYWNlKGJ1ZltzXSkpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHJlcGxhY2UgUyB0byAnICcuIGFuZCAnICcrIC0+IHNpbmdsZSAnICcuICovCi0gICAgaW50IGQgPSBzOwotICAgIGJvb2xlYW4gcHJlcyA9IGZhbHNlOwotCi0gICAgZm9yICg7IHMgPCBsZW47IHMrKykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSBidWZbc107Ci0KLSAgICAgIGlmIChpc1NwYWNlKGMpKQotICAgICAgewotICAgICAgICBpZiAoIXByZXMpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoJyAnICE9IGMpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRpdCA9IHRydWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYnVmW2QrK10gPSAnICc7Ci0KLSAgICAgICAgICBpZiAoZG91YmxlUHVuY3R1YXRpb25TcGFjZXMgJiYgKHMgIT0gMCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hhciBwcmV2Q2hhciA9IGJ1ZltzIC0gMV07Ci0KLSAgICAgICAgICAgIGlmICghKChwcmV2Q2hhciA9PSAnLicpIHx8IChwcmV2Q2hhciA9PSAnIScpCi0gICAgICAgICAgICAgICAgICB8fCAocHJldkNoYXIgPT0gJz8nKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByZXMgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJlcyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVkaXQgPSB0cnVlOwotICAgICAgICAgIHByZXMgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJ1ZltkKytdID0gYzsKLSAgICAgICAgcHJlcyA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh0cmltVGFpbCAmJiAxIDw9IGQgJiYgJyAnID09IGJ1ZltkIC0gMV0pCi0gICAgewotICAgICAgZWRpdCA9IHRydWU7Ci0KLSAgICAgIGQtLTsKLSAgICB9Ci0KLSAgICBpbnQgc3RhcnQgPSAwOwotCi0gICAgaWYgKHRyaW1IZWFkICYmIDAgPCBkICYmICcgJyA9PSBidWZbMF0pCi0gICAgewotICAgICAgZWRpdCA9IHRydWU7Ci0KLSAgICAgIHN0YXJ0Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVkaXQgPyBuZXcgU3RyaW5nKGJ1Ziwgc3RhcnQsIGQgLSBzdGFydCkgOiBzdHJpbmc7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTm90LmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY05vdC5qYXZhCmluZGV4IGMyYmEzOTguLjlkNTk2MDAgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTm90LmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNOb3QuamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY051bWJlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNOdW1iZXIuamF2YQppbmRleCAxMmE0NWMzLi5kYmU5MjU3IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY051bWJlci5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jTnVtYmVyLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgucmVzLlhQQVRIRXJyb3JSZXNvdXJjZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jUG9zaXRpb24uamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jUG9zaXRpb24uamF2YQppbmRleCA5YzQzNmU1Li4yMzYwM2U4IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1Bvc2l0aW9uLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNQb3NpdGlvbi5qYXZhCkBAIC01Niw4ICs1NiwxMCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC05OSwxMSArMTAxLDM4IEBACiAgICAgICByZXR1cm4gcHJveDsKICAgICB9CiAKLSAgICBDb250ZXh0Tm9kZUxpc3QgY25sID0gKENvbnRleHROb2RlTGlzdCkgeGN0eHQuZ2V0Q29udGV4dE5vZGVMaXN0KCk7CisgICAgRFRNSXRlcmF0b3IgY25sID0geGN0eHQuZ2V0Q29udGV4dE5vZGVMaXN0KCk7CiAKICAgICBpZiAobnVsbCAhPSBjbmwpCiAgICAgewotCisgICAgICBpbnQgbiA9IGNubC5nZXRDdXJyZW50Tm9kZSgpOworICAgICAgaWYobiA9PSBEVE0uTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaWYoY25sLmdldEN1cnJlbnRQb3MoKSA9PSAwKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIAorICAgICAgICAvLyBUaGVuIEkgdGhpbmsgd2UncmUgaW4gYSBzb3J0LiAgU2VlIHNvcnQyMS54c2wuIFNvIHRoZSBpdGVyYXRvciBoYXMgCisgICAgICAgIC8vIGFscmVhZHkgYmVlbiBzcGVudCwgYW5kIGlzIG5vdCBvbiB0aGUgbm9kZSB3ZSdyZSBwcm9jZXNzaW5nLiAKKyAgICAgICAgLy8gSXQncyBoaWdobHkgcG9zc2libGUgdGhhdCB0aGlzIGlzIGFuIGlzc3VlIGZvciBvdGhlciBjb250ZXh0LWxpc3QgCisgICAgICAgIC8vIGZ1bmN0aW9ucy4gIFNob3VsZG4ndCBiZSBhIHByb2JsZW0gZm9yIGxhc3QoKSwgYW5kIGl0IHNob3VsZG4ndCBiZSAKKyAgICAgICAgLy8gYSBwcm9ibGVtIGZvciBjdXJyZW50KCkuCisgICAgICAgIHRyeSAKKyAgICAgICAgeyAKKyAgICAgICAgICBjbmwgPSBjbmwuY2xvbmVXaXRoUmVzZXQoKTsgCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY25zZSkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLnhtbC51dGlscy5XcmFwcGVkUnVudGltZUV4Y2VwdGlvbihjbnNlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgY3VycmVudE5vZGUgPSB4Y3R4dC5nZXRDb250ZXh0Tm9kZSgpOworICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImN1cnJlbnROb2RlOiAiK2N1cnJlbnROb2RlKTsKKyAgICAgICAgd2hpbGUoRFRNLk5VTEwgIT0gKG4gPSBjbmwubmV4dE5vZGUoKSkpCisgICAgICAgIHsKKyAgICAgICAgICBpZihuID09IGN1cnJlbnROb2RlKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigibjogIituKTsKICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRnVuY1Bvc2l0aW9uLSBjbmwuZ2V0Q3VycmVudFBvcygpOiAiK2NubC5nZXRDdXJyZW50UG9zKCkpOwogICAgICAgcmV0dXJuIGNubC5nZXRDdXJyZW50UG9zKCk7CiAgICAgfQpAQCAtMTIyLDYgKzE1MSw4IEBACiAgICAqLwogICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCkgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewotICAgIHJldHVybiBuZXcgWE51bWJlcigoZG91YmxlKSBnZXRQb3NpdGlvbkluQ29udGV4dE5vZGVMaXN0KHhjdHh0KSk7CisgICAgZG91YmxlIHBvcyA9IChkb3VibGUpIGdldFBvc2l0aW9uSW5Db250ZXh0Tm9kZUxpc3QoeGN0eHQpOworICAgIAorICAgIHJldHVybiBuZXcgWE51bWJlcihwb3MpOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1FuYW1lLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1FuYW1lLmphdmEKaW5kZXggZGJmODQ0Ni4uMjRlZGQ5YyAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNRbmFtZS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jUW5hbWUuamF2YQpAQCAtNTgsOSArNTgsMTEgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgucmVzLlhQQVRIRXJyb3JSZXNvdXJjZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworLy9pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKQEAgLTg4LDQxICs5MCwxNCBAQAogICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCkgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewogCi0gICAgTm9kZSBjb250ZXh0ID0gZ2V0QXJnMEFzTm9kZSh4Y3R4dCk7CisgICAgaW50IGNvbnRleHQgPSBnZXRBcmcwQXNOb2RlKHhjdHh0KTsKICAgICBYT2JqZWN0IHZhbDsKIAotICAgIGlmIChudWxsICE9IGNvbnRleHQpCisgICAgaWYgKERUTS5OVUxMICE9IGNvbnRleHQpCiAgICAgewotICAgICAgc2hvcnQgbnR5cGUgPSBjb250ZXh0LmdldE5vZGVUeXBlKCk7Ci0KLSAgICAgIGlmIChudHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgICAgewotICAgICAgICBTdHJpbmcgcW5hbWUgPSAoKEF0dHIpIGNvbnRleHQpLmdldE5hbWUoKTsKLQotICAgICAgICBpZiAoeGN0eHQuZ2V0RE9NSGVscGVyKCkuaXNOYW1lc3BhY2VOb2RlKGNvbnRleHQpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHFuYW1lLmVxdWFscygieG1sbnMiKSkKLSAgICAgICAgICAgIHZhbCA9IFhTdHJpbmcuRU1QVFlTVFJJTkc7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHFuYW1lID0gUU5hbWUuZ2V0TG9jYWxQYXJ0KHFuYW1lKTsKLSAgICAgICAgICAgIHZhbCA9IChudWxsID09IHFuYW1lKSA/IFhTdHJpbmcuRU1QVFlTVFJJTkcgOiBuZXcgWFN0cmluZyhxbmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB2YWwgPSBuZXcgWFN0cmluZyhxbmFtZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgobnR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgICAgICB8fCAobnR5cGUgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcW5hbWUgPSBjb250ZXh0LmdldE5vZGVOYW1lKCk7Ci0KLSAgICAgICAgdmFsID0gbmV3IFhTdHJpbmcocW5hbWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWwgPSBYU3RyaW5nLkVNUFRZU1RSSU5HOwotICAgICAgfQorICAgICAgRFRNIGR0bSA9IHhjdHh0LmdldERUTShjb250ZXh0KTsKKyAgICAgIFN0cmluZyBxbmFtZSA9IGR0bS5nZXROb2RlTmFtZVgoY29udGV4dCk7CisgICAgICB2YWwgPSAobnVsbCA9PSBxbmFtZSkgPyBYU3RyaW5nLkVNUFRZU1RSSU5HIDogbmV3IFhTdHJpbmcocW5hbWUpOwogICAgIH0KICAgICBlbHNlCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNSb3VuZC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNSb3VuZC5qYXZhCmluZGV4IDJhYTcwZDAuLmQxYmI1NGQgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jUm91bmQuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1JvdW5kLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoLmZ1bmN0aW9uczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogCiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNTdGFydHNXaXRoLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1N0YXJ0c1dpdGguamF2YQppbmRleCBjYzgxMWFjLi4zMTNiMWQyIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1N0YXJ0c1dpdGguamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1N0YXJ0c1dpdGguamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC04Miw3ICs4Miw3IEBACiAgICAqLwogICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCkgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewotICAgIHJldHVybiBtX2FyZzAuZXhlY3V0ZSh4Y3R4dCkuc3RyKCkuc3RhcnRzV2l0aChtX2FyZzEuZXhlY3V0ZSh4Y3R4dCkuc3RyKCkpCisgICAgcmV0dXJuIG1fYXJnMC5leGVjdXRlKHhjdHh0KS54c3RyKCkuc3RhcnRzV2l0aChtX2FyZzEuZXhlY3V0ZSh4Y3R4dCkueHN0cigpKQogICAgICAgICAgICA/IFhCb29sZWFuLlNfVFJVRSA6IFhCb29sZWFuLlNfRkFMU0U7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jU3RyaW5nLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1N0cmluZy5qYXZhCmluZGV4IDc1ZTRjOGMuLjNmYzg1MjUgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jU3RyaW5nLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNTdHJpbmcuamF2YQpAQCAtNTgsNyArNTgsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5yZXMuWFBBVEhFcnJvclJlc291cmNlczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogCiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApAQCAtODUsNiArODUsNiBAQAogICAgKi8KICAgcHVibGljIFhPYmplY3QgZXhlY3V0ZShYUGF0aENvbnRleHQgeGN0eHQpIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKLSAgICByZXR1cm4gbmV3IFhTdHJpbmcoZ2V0QXJnMEFzU3RyaW5nKHhjdHh0KSk7CisgICAgcmV0dXJuIChYU3RyaW5nKWdldEFyZzBBc1N0cmluZyh4Y3R4dCk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jU3RyaW5nTGVuZ3RoLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1N0cmluZ0xlbmd0aC5qYXZhCmluZGV4IGU5YjhjNjQuLjA1N2MxZjIgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jU3RyaW5nTGVuZ3RoLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNTdHJpbmdMZW5ndGguamF2YQpAQCAtNTgsNyArNTgsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5yZXMuWFBBVEhFcnJvclJlc291cmNlczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogCiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNTdWJzdHJpbmcuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jU3Vic3RyaW5nLmphdmEKaW5kZXggMzMwYzZhMC4uYjM5ZGEzOCAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNTdWJzdHJpbmcuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1N1YnN0cmluZy5qYXZhCkBAIC01Niw3ICs1Niw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54cGF0aC5mdW5jdGlvbnM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jU3Vic3RyaW5nQWZ0ZXIuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jU3Vic3RyaW5nQWZ0ZXIuamF2YQppbmRleCA0OWM4OGQzLi5jZjQ1MzE2IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1N1YnN0cmluZ0FmdGVyLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNTdWJzdHJpbmdBZnRlci5qYXZhCkBAIC01Niw3ICs1Niw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54cGF0aC5mdW5jdGlvbnM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKQEAgLTY1LDYgKzY1LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWFN0cmluZzsKIAoraW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKKwogLyoqCiAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KICAqIEV4ZWN1dGUgdGhlIFN1YnN0cmluZ0FmdGVyKCkgZnVuY3Rpb24uCkBAIC04MywxMiArODUsMTIgQEAKICAgcHVibGljIFhPYmplY3QgZXhlY3V0ZShYUGF0aENvbnRleHQgeGN0eHQpIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAotICAgIFN0cmluZyBzMSA9IG1fYXJnMC5leGVjdXRlKHhjdHh0KS5zdHIoKTsKLSAgICBTdHJpbmcgczIgPSBtX2FyZzEuZXhlY3V0ZSh4Y3R4dCkuc3RyKCk7CisgICAgWE1MU3RyaW5nIHMxID0gbV9hcmcwLmV4ZWN1dGUoeGN0eHQpLnhzdHIoKTsKKyAgICBYTUxTdHJpbmcgczIgPSBtX2FyZzEuZXhlY3V0ZSh4Y3R4dCkueHN0cigpOwogICAgIGludCBpbmRleCA9IHMxLmluZGV4T2YoczIpOwogCiAgICAgcmV0dXJuICgtMSA9PSBpbmRleCkKICAgICAgICAgICAgPyBYU3RyaW5nLkVNUFRZU1RSSU5HCi0gICAgICAgICAgIDogbmV3IFhTdHJpbmcoczEuc3Vic3RyaW5nKGluZGV4ICsgczIubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgOiAoWFN0cmluZylzMS5zdWJzdHJpbmcoaW5kZXggKyBzMi5sZW5ndGgoKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jU3Vic3RyaW5nQmVmb3JlLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1N1YnN0cmluZ0JlZm9yZS5qYXZhCmluZGV4IGZhYjVjOGQuLjk0NDAyY2IgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jU3Vic3RyaW5nQmVmb3JlLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNTdWJzdHJpbmdCZWZvcmUuamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1N1bS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNTdW0uamF2YQppbmRleCBjNTljODI5Li5iZThjODdiIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1N1bS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jU3VtLmphdmEKQEAgLTU2LDggKzU2LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoLmZ1bmN0aW9uczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKQEAgLTY4LDYgKzY4LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE51bWJlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWFN0cmluZzsKIAoraW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKKwogLyoqCiAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iYWR2YW5jZWQiLz4KICAqIEV4ZWN1dGUgdGhlIFN1bSgpIGZ1bmN0aW9uLgpAQCAtODYsMTYgKzg4LDE3IEBACiAgIHB1YmxpYyBYT2JqZWN0IGV4ZWN1dGUoWFBhdGhDb250ZXh0IHhjdHh0KSB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKLSAgICBOb2RlSXRlcmF0b3Igbm9kZXMgPSBtX2FyZzAuZXhlY3V0ZSh4Y3R4dCkubm9kZXNldCgpOworICAgIERUTUl0ZXJhdG9yIG5vZGVzID0gbV9hcmcwLmV4ZWN1dGUoeGN0eHQpLm5vZGVzZXQoKTsKICAgICBkb3VibGUgc3VtID0gMC4wOwotICAgIE5vZGUgcG9zOworICAgIGludCBwb3M7CiAKLSAgICB3aGlsZSAobnVsbCAhPSAocG9zID0gbm9kZXMubmV4dE5vZGUoKSkpCisgICAgd2hpbGUgKERUTS5OVUxMICE9IChwb3MgPSBub2Rlcy5uZXh0Tm9kZSgpKSkKICAgICB7Ci0gICAgICBTdHJpbmcgcyA9IERPTUhlbHBlci5nZXROb2RlRGF0YShwb3MpOworICAgICAgRFRNIGR0bSA9IG5vZGVzLmdldERUTShwb3MpOworICAgICAgWE1MU3RyaW5nIHMgPSBkdG0uZ2V0U3RyaW5nVmFsdWUocG9zKTsKIAogICAgICAgaWYgKG51bGwgIT0gcykKLSAgICAgICAgc3VtICs9IFhTdHJpbmcuY2FzdFRvTnVtKHMpOworICAgICAgICBzdW0gKz0gcy50b0RvdWJsZSgpOwogICAgIH0KICAgICAvLyBub2Rlcy5kZXRhY2goKTsKIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNTeXN0ZW1Qcm9wZXJ0eS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNTeXN0ZW1Qcm9wZXJ0eS5qYXZhCmluZGV4IDIwYjc2NTQuLjAzNDE5ZGIgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jU3lzdGVtUHJvcGVydHkuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1N5c3RlbVByb3BlcnR5LmphdmEKQEAgLTY2LDcgKzY2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5QcmVmaXhSZXNvbHZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLnJlcy5YUEFUSEVycm9yUmVzb3VyY2VzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1RyYW5zbGF0ZS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNUcmFuc2xhdGUuamF2YQppbmRleCA0YTI2MjFlLi41ZThmMjYzIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1RyYW5zbGF0ZS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jVHJhbnNsYXRlLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoLmZ1bmN0aW9uczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogCiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNUcnVlLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1RydWUuamF2YQppbmRleCA3NDQ5NjgzLi5kMDAzYWJhIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1RydWUuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1RydWUuamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1VucGFyc2VkRW50aXR5VVJJLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY1VucGFyc2VkRW50aXR5VVJJLmphdmEKaW5kZXggMzc1NzU2YS4uZmY3Mjg5ZSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmNVbnBhcnNlZEVudGl0eVVSSS5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jVW5wYXJzZWRFbnRpdHlVUkkuamF2YQpAQCAtNTgsOCArNTgsMTAgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgucmVzLlhQQVRIRXJyb3JSZXNvdXJjZXM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC04NiwxMCArODgsMTEgQEAKICAgewogCiAgICAgU3RyaW5nIG5hbWUgPSBtX2FyZzAuZXhlY3V0ZSh4Y3R4dCkuc3RyKCk7Ci0gICAgTm9kZSBjb250ZXh0ID0geGN0eHQuZ2V0Q3VycmVudE5vZGUoKTsKLSAgICBEb2N1bWVudCBkb2MgPSAoTm9kZS5ET0NVTUVOVF9OT0RFID09IGNvbnRleHQuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICA/ICgoRG9jdW1lbnQpIGNvbnRleHQpIDogY29udGV4dC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgU3RyaW5nIHVyaSA9IHhjdHh0LmdldERPTUhlbHBlcigpLmdldFVucGFyc2VkRW50aXR5VVJJKG5hbWUsIGRvYyk7CisgICAgaW50IGNvbnRleHQgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOworICAgIERUTSBkdG0gPSB4Y3R4dC5nZXREVE0oY29udGV4dCk7CisgICAgaW50IGRvYyA9IGR0bS5nZXREb2N1bWVudCgpOworICAgIAorICAgIFN0cmluZyB1cmkgPSBkdG0uZ2V0VW5wYXJzZWRFbnRpdHlVUkkobmFtZSk7CiAKICAgICByZXR1cm4gbmV3IFhTdHJpbmcodXJpKTsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmN0aW9uLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY3Rpb24uamF2YQppbmRleCBiYWM3MWUzLi40ZWVkOWRkIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY3Rpb24uamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY3Rpb24uamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zOwogCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY3Rpb25EZWYxQXJnLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9mdW5jdGlvbnMvRnVuY3Rpb25EZWYxQXJnLmphdmEKaW5kZXggYzFhOWI0MS4uZGM3YTI1NSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvZnVuY3Rpb25zL0Z1bmN0aW9uRGVmMUFyZy5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2Z1bmN0aW9ucy9GdW5jdGlvbkRlZjFBcmcuamF2YQpAQCAtNTYsMTEgKzU2LDE2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54cGF0aC5mdW5jdGlvbnM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YTm9kZVNldDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE51bWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWFN0cmluZzsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIC8qKgogICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImFkdmFuY2VkIi8+CkBAIC04Miw3ICs4Nyw3IEBACiAgICAqIEB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGluZyB0aGUgYXJndW1lbnQgZXhwcmVzc2lvbi4KICAgICovCi0gIHByb3RlY3RlZCBOb2RlIGdldEFyZzBBc05vZGUoWFBhdGhDb250ZXh0IHhjdHh0KQorICBwcm90ZWN0ZWQgaW50IGdldEFyZzBBc05vZGUoWFBhdGhDb250ZXh0IHhjdHh0KQogICAgICAgICAgIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIApAQCAtMTA0LDEzICsxMDksMjMgQEAKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW5nIHRoZSBhcmd1bWVudCBleHByZXNzaW9uLgogICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRBcmcwQXNTdHJpbmcoWFBhdGhDb250ZXh0IHhjdHh0KQorICBwcm90ZWN0ZWQgWE1MU3RyaW5nIGdldEFyZzBBc1N0cmluZyhYUGF0aENvbnRleHQgeGN0eHQpCiAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewotCi0gICAgcmV0dXJuIChudWxsID09IG1fYXJnMCkKLSAgICAgICAgICAgPyBYTm9kZVNldC5nZXRTdHJpbmdGcm9tTm9kZSh4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpKQotICAgICAgICAgICA6IG1fYXJnMC5leGVjdXRlKHhjdHh0KS5zdHIoKTsKKyAgICBpZihudWxsID09IG1fYXJnMCkKKyAgICB7CisgICAgICBpbnQgY3VycmVudE5vZGUgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOworICAgICAgaWYoRFRNLk5VTEwgPT0gY3VycmVudE5vZGUpCisgICAgICAgIHJldHVybiBYU3RyaW5nLkVNUFRZU1RSSU5HOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBEVE0gZHRtID0geGN0eHQuZ2V0RFRNKGN1cnJlbnROb2RlKTsKKyAgICAgICAgcmV0dXJuIGR0bS5nZXRTdHJpbmdWYWx1ZShjdXJyZW50Tm9kZSk7CisgICAgICB9CisgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIG1fYXJnMC5leGVjdXRlKHhjdHh0KS54c3RyKCk7ICAgCiAgIH0KIAogICAvKioKQEAgLTEzMCw5ICsxNDUsMjEgQEAKICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKLSAgICByZXR1cm4gKG51bGwgPT0gbV9hcmcwKQotICAgICAgICAgICA/IFhOb2RlU2V0LmdldE51bWJlckZyb21Ob2RlKHhjdHh0LmdldEN1cnJlbnROb2RlKCkpCi0gICAgICAgICAgIDogbV9hcmcwLmV4ZWN1dGUoeGN0eHQpLm51bSgpOworICAgIGlmKG51bGwgPT0gbV9hcmcwKQorICAgIHsKKyAgICAgIGludCBjdXJyZW50Tm9kZSA9IHhjdHh0LmdldEN1cnJlbnROb2RlKCk7CisgICAgICBpZihEVE0uTlVMTCA9PSBjdXJyZW50Tm9kZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIERUTSBkdG0gPSB4Y3R4dC5nZXREVE0oY3VycmVudE5vZGUpOworICAgICAgICBYTUxTdHJpbmcgc3RyID0gZHRtLmdldFN0cmluZ1ZhbHVlKGN1cnJlbnROb2RlKTsKKyAgICAgICAgcmV0dXJuIHN0ci50b0RvdWJsZSgpOworICAgICAgfQorICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBtX2FyZzAuZXhlY3V0ZSh4Y3R4dCkubnVtKCk7CiAgIH0KIAogICAvKioKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWEJvb2xlYW4uamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWEJvb2xlYW4uamF2YQppbmRleCBkYmVhMGZlLi4zYWIzYWM5IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hCb29sZWFuLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvb2JqZWN0cy9YQm9vbGVhbi5qYXZhCkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICoKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE9iamVjdCBvYmoyKSB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE9iamVjdCBvYmoyKQogICB7CiAKICAgICAvLyBJbiBvcmRlciB0byBoYW5kbGUgdGhlICdhbGwnIHNlbWFudGljcyBvZiAKQEAgLTE3NSw3ICsxNzUsMTQgQEAKICAgICBpZiAob2JqMi5nZXRUeXBlKCkgPT0gWE9iamVjdC5DTEFTU19OT0RFU0VUKQogICAgICAgcmV0dXJuIG9iajIuZXF1YWxzKHRoaXMpOwogCi0gICAgcmV0dXJuIG1fdmFsID09IG9iajIuYm9vbCgpOworICAgIHRyeQorICAgIHsKKyAgICAgIHJldHVybiBtX3ZhbCA9PSBvYmoyLmJvb2woKTsKKyAgICB9CisgICAgY2F0Y2goamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZSkKKyAgICB7CisgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS54bWwudXRpbHMuV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24odGUpOworICAgIH0KICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hCb29sZWFuU3RhdGljLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hCb29sZWFuU3RhdGljLmphdmEKaW5kZXggZjEzZDZkZC4uYzU2ODk4YSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvb2JqZWN0cy9YQm9vbGVhblN0YXRpYy5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWEJvb2xlYW5TdGF0aWMuamF2YQpAQCAtOTUsOCArOTUsMTUgQEAKICAgICoKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE9iamVjdCBvYmoyKSB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE9iamVjdCBvYmoyKQogICB7Ci0gICAgcmV0dXJuIG1fdmFsID09IG9iajIuYm9vbCgpOworICAgIHRyeQorICAgIHsKKyAgICAgIHJldHVybiBtX3ZhbCA9PSBvYmoyLmJvb2woKTsKKyAgICB9CisgICAgY2F0Y2goamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZSkKKyAgICB7CisgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS54bWwudXRpbHMuV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24odGUpOworICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvb2JqZWN0cy9YTUxTdHJpbmdGYWN0b3J5SW1wbC5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvb2JqZWN0cy9YTUxTdHJpbmdGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmY2Q1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hNTFN0cmluZ0ZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCisgKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0czsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmdGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLkZhc3RTdHJpbmdCdWZmZXI7CisKKy8qKgorICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImludGVybmFsIi8+CisgKiBDbGFzcyBYTUxTdHJpbmdGYWN0b3J5SW1wbCBjcmVhdGVzIFhTdHJpbmcgdmVyc2lvbnMgb2YgWE1MU3RyaW5ncy4KKyAqLworcHVibGljIGNsYXNzIFhNTFN0cmluZ0ZhY3RvcnlJbXBsIGV4dGVuZHMgWE1MU3RyaW5nRmFjdG9yeQoreworICAvKiogVGhlIFhNTFN0cmluZ0ZhY3RvcnkgdG8gcGFzcyB0byBEVE0gY29uc3RydWN0aW9uLiAgICovCisgIHByaXZhdGUgc3RhdGljIFhNTFN0cmluZ0ZhY3RvcnkgbV94c3RyaW5nZmFjdG9yeSA9CisgICAgbmV3IFhNTFN0cmluZ0ZhY3RvcnlJbXBsKCk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgWE1MU3RyaW5nRmFjdG9yeSB0byBwYXNzIHRvIERUTSBjb25zdHJ1Y3Rpb24uCisgICAqCisgICAqCisgICAqIEByZXR1cm4gQSBuZXZlci1udWxsIHN0YXRpYyByZWZlcmVuY2UgdG8gYSBTdHJpbmcgZmFjdG9yeS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgWE1MU3RyaW5nRmFjdG9yeSBnZXRGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBtX3hzdHJpbmdmYWN0b3J5OworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBYTUxTdHJpbmcgZnJvbSBhIEphdmEgc3RyaW5nLgorICAgKgorICAgKgorICAgKiBAcGFyYW0gc3RyaW5nIEphdmEgU3RyaW5nIHJlZmVyZW5jZSwgd2hpY2ggbXVzdCBiZSBub24tbnVsbC4KKyAgICoKKyAgICogQHJldHVybiBBbiBYTUxTdHJpbmcgb2JqZWN0IHRoYXQgd3JhcHMgdGhlIFN0cmluZyByZWZlcmVuY2UuCisgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIG5ld3N0cihTdHJpbmcgc3RyaW5nKQorICB7CisgICAgcmV0dXJuIG5ldyBYU3RyaW5nKHN0cmluZyk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgWE1MU3RyaW5nIGZyb20gYSBGYXN0U3RyaW5nQnVmZmVyLgorICAgKgorICAgKgorICAgKiBAcGFyYW0gc3RyaW5nIEZhc3RTdHJpbmdCdWZmZXIgcmVmZXJlbmNlLCB3aGljaCBtdXN0IGJlIG5vbi1udWxsLgorICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBhcnJheS4KKyAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBhcnJheS4KKyAgICoKKyAgICogQHJldHVybiBBbiBYTUxTdHJpbmcgb2JqZWN0IHRoYXQgd3JhcHMgdGhlIEZhc3RTdHJpbmdCdWZmZXIgcmVmZXJlbmNlLgorICAgKi8KKyAgcHVibGljIFhNTFN0cmluZyBuZXdzdHIoRmFzdFN0cmluZ0J1ZmZlciBmc2IsIGludCBzdGFydCwgaW50IGxlbmd0aCkKKyAgeworICAgIHJldHVybiBuZXcgWFN0cmluZ0ZvckZTQihmc2IsIHN0YXJ0LCBsZW5ndGgpOworICB9CisgIAorICAvKioKKyAgICogQ3JlYXRlIGEgWE1MU3RyaW5nIGZyb20gYSBGYXN0U3RyaW5nQnVmZmVyLgorICAgKgorICAgKgorICAgKiBAcGFyYW0gc3RyaW5nIEZhc3RTdHJpbmdCdWZmZXIgcmVmZXJlbmNlLCB3aGljaCBtdXN0IGJlIG5vbi1udWxsLgorICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBhcnJheS4KKyAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBhcnJheS4KKyAgICoKKyAgICogQHJldHVybiBBbiBYTUxTdHJpbmcgb2JqZWN0IHRoYXQgd3JhcHMgdGhlIEZhc3RTdHJpbmdCdWZmZXIgcmVmZXJlbmNlLgorICAgKi8KKyAgcHVibGljIFhNTFN0cmluZyBuZXdzdHIoY2hhcltdIHN0cmluZywgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQorICB7CisgICAgcmV0dXJuIG5ldyBYU3RyaW5nRm9yQ2hhcnMoc3RyaW5nLCBzdGFydCwgbGVuZ3RoKTsKKyAgfQorICAKKyAgLyoqCisgICAqIEdldCBhIGNoZWFwIHJlcHJlc2VudGF0aW9uIG9mIGFuIGVtcHR5IHN0cmluZy4KKyAgICogCisgICAqIEByZXR1cm4gQW4gbm9uLW51bGwgcmVmZXJlbmNlIHRvIGFuIFhNTFN0cmluZyB0aGF0IHJlcHJlc2VudHMgIiIuCisgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIGVtcHR5c3RyKCkKKyAgeworICAgIHJldHVybiBYU3RyaW5nLkVNUFRZU1RSSU5HOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWE5vZGVTZXQuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWE5vZGVTZXQuamF2YQppbmRleCA3MzU5OGEyLi5hM2Y0NDA4IDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hOb2RlU2V0LmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvb2JqZWN0cy9YTm9kZVNldC5qYXZhCkBAIC01NiwxNiArNTYsMjEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworLy9pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1NYW5hZ2VyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5ET01IZWxwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5Ob2RlU2V0OwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguYXhlcy5Db250ZXh0Tm9kZUxpc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuU3RyaW5nVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZzsKIAogLyoqCiAgKiA8bWV0YSBuYW1lPSJ1c2FnZSIgY29udGVudD0iZ2VuZXJhbCIvPgpAQCAtNzQsMjMgKzc5LDMyIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBYTm9kZVNldCBleHRlbmRzIFhPYmplY3QKIHsKKyAgcHJpdmF0ZSBEVE1NYW5hZ2VyIG1fZHRtTWdyOworICAKKyAgcHVibGljIERUTU1hbmFnZXIgZ2V0RFRNTWdyKCkKKyAgeworICAgIHJldHVybiBtX2R0bU1ncjsKKyAgfQogCiAgIC8qKgogICAgKiBDb25zdHJ1Y3QgYSBYTm9kZVNldCBvYmplY3QuCiAgICAqCiAgICAqIEBwYXJhbSB2YWwgVmFsdWUgb2YgdGhlIFhOb2RlU2V0IG9iamVjdAogICAgKi8KLSAgcHVibGljIFhOb2RlU2V0KE5vZGVJdGVyYXRvciB2YWwpCisgIHB1YmxpYyBYTm9kZVNldChEVE1JdGVyYXRvciB2YWwpCiAgIHsKICAgICBzdXBlcih2YWwpOworICAgIG1fZHRtTWdyID0gdmFsLmdldERUTU1hbmFnZXIoKTsKICAgfQogCiAgIC8qKgotICAgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgWE5vZGVTZXQgb2JqZWN0LgorICAgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgWE5vZGVTZXQgb2JqZWN0LiAgVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBhIG11dGFibGUgCisgICAqIG5vZGVzZXQgdG8gd2hpY2ggcmFuZG9tIG5vZGVzIG1heSBiZSBhZGRlZC4KICAgICovCi0gIHB1YmxpYyBYTm9kZVNldCgpCisgIHB1YmxpYyBYTm9kZVNldChEVE1NYW5hZ2VyIGR0bU1ncikKICAgewogICAgIHN1cGVyKG5ldyBOb2RlU2V0KCkpOworICAgIG1fZHRtTWdyID0gZHRtTWdyOwogICB9CiAKICAgLyoqCkBAIC05OCwxMiArMTEyLDEzIEBACiAgICAqCiAgICAqIEBwYXJhbSBuIE5vZGUgdG8gYWRkIHRvIHRoZSBuZXcgWE5vZGVTZXQgb2JqZWN0CiAgICAqLwotICBwdWJsaWMgWE5vZGVTZXQoTm9kZSBuKQorICBwdWJsaWMgWE5vZGVTZXQoaW50IG4sIERUTU1hbmFnZXIgZHRtTWdyKQogICB7CiAKICAgICBzdXBlcihuZXcgTm9kZVNldCgpKTsKKyAgICBtX2R0bU1nciA9IGR0bU1ncjsKIAotICAgIGlmIChudWxsICE9IG4pCisgICAgaWYgKERUTS5OVUxMICE9IG4pCiAgICAgewogICAgICAgKChOb2RlU2V0KSBtX29iaikuYWRkTm9kZShuKTsKICAgICB9CkBAIC0xMzcsOSArMTUyLDkgQEAKICAgICoKICAgICogQHJldHVybiBudW1lcmljIHZhbHVlIG9mIHRoZSBzdHJpbmcgY29udmVyc2lvbiBmcm9tIGEgc2luZ2xlIG5vZGUuCiAgICAqLwotICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXROdW1iZXJGcm9tTm9kZShOb2RlIG4pCisgIHB1YmxpYyBkb3VibGUgZ2V0TnVtYmVyRnJvbU5vZGUoaW50IG4pCiAgIHsKLSAgICByZXR1cm4gWFN0cmluZy5jYXN0VG9OdW0oZ2V0U3RyaW5nRnJvbU5vZGUobikpOworICAgIHJldHVybiBtX2R0bU1nci5nZXREVE0obikuZ2V0U3RyaW5nVmFsdWUobikudG9Eb3VibGUoKTsKICAgfQogCiAgIC8qKgpAQCAtMTUxLDEwICsxNjYsMTAgQEAKICAgcHVibGljIGRvdWJsZSBudW0oKQogICB7CiAKLSAgICBOb2RlSXRlcmF0b3IgbmwgPSBub2Rlc2V0KCk7Ci0gICAgTm9kZSBub2RlID0gbmwubmV4dE5vZGUoKTsKKyAgICBEVE1JdGVyYXRvciBubCA9IG5vZGVzZXQoKTsKKyAgICBpbnQgbm9kZSA9IG5sLm5leHROb2RlKCk7CiAKLSAgICByZXR1cm4gKG5vZGUgIT0gbnVsbCkgPyBnZXROdW1iZXJGcm9tTm9kZShub2RlKSA6IERvdWJsZS5OYU47CisgICAgcmV0dXJuIChub2RlICE9IERUTS5OVUxMKSA/IGdldE51bWJlckZyb21Ob2RlKG5vZGUpIDogRG91YmxlLk5hTjsKICAgfQogCiAgIC8qKgpAQCAtMTY0LDkgKzE3OSw5IEBACiAgICAqLwogICBwdWJsaWMgYm9vbGVhbiBib29sKCkKICAgewotICAgIHJldHVybiAobm9kZXNldCgpLm5leHROb2RlKCkgIT0gbnVsbCk7CisgICAgcmV0dXJuIChub2Rlc2V0KCkubmV4dE5vZGUoKSAhPSBEVE0uTlVMTCk7CiAgIH0KLQorICAKICAgLyoqCiAgICAqIEdldCB0aGUgc3RyaW5nIGNvbnZlcnNpb24gZnJvbSBhIHNpbmdsZSBub2RlLgogICAgKgpAQCAtMTc0LDI1ICsxODksNDQgQEAKICAgICoKICAgICogQHJldHVybiB0aGUgc3RyaW5nIGNvbnZlcnNpb24gZnJvbSBhIHNpbmdsZSBub2RlLgogICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nRnJvbU5vZGUoTm9kZSBuKQorICBwdWJsaWMgWE1MU3RyaW5nIGdldFN0cmluZ0Zyb21Ob2RlKGludCBuKQogICB7Ci0KLSAgICBzd2l0Y2ggKG4uZ2V0Tm9kZVR5cGUoKSkKKyAgICAvLyAlT1BUJQorICAgIC8vIEkgZ3Vlc3Mgd2UnbGwgaGF2ZSB0byBnZXQgYSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhlIERUTSBtYW5hZ2VyLi4uCisgICAgaWYoRFRNLk5VTEwgIT0gbikKICAgICB7Ci0gICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOgotICAgICAgcmV0dXJuIERPTUhlbHBlci5nZXROb2RlRGF0YShuKTsKLSAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgIHJldHVybiAoKFRleHQpIG4pLmdldERhdGEoKTsKLSAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotICAgICAgcmV0dXJuIG4uZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICByZXR1cm4gRE9NSGVscGVyLmdldE5vZGVEYXRhKG4pOworICAgICAgcmV0dXJuIG1fZHRtTWdyLmdldERUTShuKS5nZXRTdHJpbmdWYWx1ZShuKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWFN0cmluZy5FTVBUWVNUUklORzsKICAgICB9CiAgIH0KKyAgCisgIC8qKgorICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYW4gWE1MU3RyaW5nLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBkb2N1bWVudCBmcmFnbWVudCBub2RlIGRhdGEgb3IgdGhlIGVtcHR5IHN0cmluZy4gCisgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIHhzdHIoKQorICB7CisgICAgRFRNSXRlcmF0b3IgbmwgPSBub2Rlc2V0KCk7CisgICAgaW50IG5vZGUgPSBubC5uZXh0Tm9kZSgpOworCisgICAgcmV0dXJuIChub2RlICE9IERUTS5OVUxMKSA/IGdldFN0cmluZ0Zyb21Ob2RlKG5vZGUpIDogWFN0cmluZy5FTVBUWVNUUklORzsKKyAgfQorICAKKyAgLyoqCisgICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHN0cmluZy4KKyAgICoKKyAgICogQHJldHVybiBUaGUgc3RyaW5nIHRoaXMgd3JhcHMgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBudWxsCisgICAqLworICBwdWJsaWMgdm9pZCBhcHBlbmRUb0ZzYihvcmcuYXBhY2hlLnhtbC51dGlscy5GYXN0U3RyaW5nQnVmZmVyIGZzYikKKyAgeworICAgIFhTdHJpbmcgeHN0cmluZyA9IChYU3RyaW5nKXhzdHIoKTsKKyAgICB4c3RyaW5nLmFwcGVuZFRvRnNiKGZzYik7CisgIH0KKwogCiAgIC8qKgogICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBzdHJpbmcuCkBAIC0yMDMsNzIgKzIzNyw2MSBAQAogICBwdWJsaWMgU3RyaW5nIHN0cigpCiAgIHsKIAotICAgIE5vZGVJdGVyYXRvciBubCA9IG5vZGVzZXQoKTsKLSAgICBOb2RlIG5vZGUgPSBubC5uZXh0Tm9kZSgpOworICAgIERUTUl0ZXJhdG9yIG5sID0gbm9kZXNldCgpOworICAgIGludCBub2RlID0gbmwubmV4dE5vZGUoKTsKIAotICAgIHJldHVybiAobm9kZSAhPSBudWxsKSA/IGdldFN0cmluZ0Zyb21Ob2RlKG5vZGUpIDogIiI7CisgICAgcmV0dXJuIChub2RlICE9IERUTS5OVUxMKSA/IGdldFN0cmluZ0Zyb21Ob2RlKG5vZGUpLnRvU3RyaW5nKCkgOiAiIjsKICAgfQogCi0gIC8qKgotICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSByZXN1bHQgdHJlZSBmcmFnbWVudC4KLSAgICoKLSAgICogQHBhcmFtIHN1cHBvcnQgVGhlIFhQYXRoIGNvbnRleHQgdG8gdXNlIGZvciB0aGUgY29udmVyc2lvbiAKLSAgICoKLSAgICogQHJldHVybiB0aGUgbm9kZXNldCBhcyBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoWFBhdGhDb250ZXh0IHN1cHBvcnQpCi0gIHsKLQotICAgIERvY3VtZW50RnJhZ21lbnQgZnJhZyA9Ci0gICAgICBzdXBwb3J0LmdldERPTUhlbHBlcigpLmdldERPTUZhY3RvcnkoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Ci0gICAgTm9kZUl0ZXJhdG9yIG5sID0gbm9kZXNldCgpOwotICAgIE5vZGUgbm9kZTsKLQotICAgIHdoaWxlIChudWxsICE9IChub2RlID0gbmwubmV4dE5vZGUoKSkpCi0gICAgewotICAgICAgZnJhZy5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZyYWc7Ci0gIH0KKyAgLy8gJVJFVklFVyUKKy8vICAvKioKKy8vICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSByZXN1bHQgdHJlZSBmcmFnbWVudC4KKy8vICAgKgorLy8gICAqIEBwYXJhbSBzdXBwb3J0IFRoZSBYUGF0aCBjb250ZXh0IHRvIHVzZSBmb3IgdGhlIGNvbnZlcnNpb24gCisvLyAgICoKKy8vICAgKiBAcmV0dXJuIHRoZSBub2Rlc2V0IGFzIGEgcmVzdWx0IHRyZWUgZnJhZ21lbnQuCisvLyAgICovCisvLyAgcHVibGljIERUTUl0ZXJhdG9yIHJ0cmVlKFhQYXRoQ29udGV4dCBzdXBwb3J0KQorLy8gIHsKKy8vICAgIERUTSBmcmFnID0gc3VwcG9ydC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisvLworLy8gICAgRFRNSXRlcmF0b3IgbmwgPSBub2Rlc2V0KCk7CisvLyAgICBpbnQgbm9kZTsKKy8vCisvLyAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKG5vZGUgPSBubC5uZXh0Tm9kZSgpKSkKKy8vICAgIHsKKy8vICAgICAgZnJhZy5hcHBlbmRDaGlsZChub2RlLCB0cnVlLCB0cnVlKTsKKy8vICAgIH0KKy8vCisvLyAgICByZXR1cm4gc3VwcG9ydC5jcmVhdGVEVE1JdGVyYXRvcihmcmFnLmdldERvY3VtZW50KCkpOworLy8gIH0KICAgCiAgIC8qKgogICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBub2RlbGlzdC4KICAgICoKICAgICogQHJldHVybiBUaGUgbm9kZXNldCBhcyBhIG5vZGVsaXN0CiAgICAqLwotICBwdWJsaWMgTm9kZUl0ZXJhdG9yIG5vZGVzZXQoKQorICBwdWJsaWMgRFRNSXRlcmF0b3Igbm9kZXNldCgpCiAgIHsKIAogICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW4gWE5vZGVTZXQubm9kZXNldCgpIik7Ci0gICAgTm9kZUl0ZXJhdG9yIG5zID0gKE5vZGVJdGVyYXRvcikgbV9vYmo7CisgICAgRFRNSXRlcmF0b3IgbnMgPSAoRFRNSXRlcmF0b3IpIG1fb2JqOwogCi0gICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3QgTm9kZUl0ZXJhdG9yIik7Ci0gICAgaWYgKG5zIGluc3RhbmNlb2YgQ29udGV4dE5vZGVMaXN0KQorICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSXMgYSBDb250ZXh0Tm9kZUxpc3Q6ICIrbnMpOworICAgIGlmIChucy5pc0ZyZXNoKCkpICAvLyBiaXQgb2YgYSBoYWNrLi4uCiAgICAgewotCi0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIklzIGEgQ29udGV4dE5vZGVMaXN0OiAiK25zKTsKLSAgICAgIGlmICgoKENvbnRleHROb2RlTGlzdCkgbnMpLmlzRnJlc2goKSkgIC8vIGJpdCBvZiBhIGhhY2suLi4KLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5zOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoKENvbnRleHROb2RlTGlzdCkgbnMpLmNsb25lV2l0aFJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNuc2UpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihjbnNlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KKyAgICAgIHJldHVybiBuczsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLQotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5pbmcgbm9kZSBpdGVyYXRvciIpOwotICAgICAgcmV0dXJuIG5zOworICAgICAgdHJ5CisgICAgICB7CisgICAgICAgIHJldHVybiBucy5jbG9uZVdpdGhSZXNldCgpOworICAgICAgfQorICAgICAgY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNuc2UpCisgICAgICB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGNuc2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIApAQCAtMjgyLDcgKzMwNSw3IEBACiAKICAgICBOb2RlU2V0IG1ubDsKIAotICAgIGlmIChtX29iaiBpbnN0YW5jZW9mIE5vZGVTZXQpCisgICAgaWYobV9vYmogaW5zdGFuY2VvZiBOb2RlU2V0KQogICAgIHsKICAgICAgIG1ubCA9IChOb2RlU2V0KSBtX29iajsKICAgICB9CkBAIC0zMzMsNiArMzU2LDcgQEAKIAogICAgIGlmIChYT2JqZWN0LkNMQVNTX05PREVTRVQgPT0gdHlwZSkKICAgICB7CisgICAgICAvLyAlT1BUJSBUaGlzIHNob3VsZCBiZSBYTUxTdHJpbmcgYmFzZWQgaW5zdGVhZCBvZiBzdHJpbmcgYmFzZWQuLi4KIAogICAgICAgLy8gRnJvbSBodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aDogCiAgICAgICAvLyBJZiBib3RoIG9iamVjdHMgdG8gYmUgY29tcGFyZWQgYXJlIG5vZGUtc2V0cywgdGhlbiB0aGUgY29tcGFyaXNvbiAKQEAgLTM0NSwyMiArMzY5LDIyIEBACiAgICAgICAvLyBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHNvbWUgbm9kZSBpbiAkeCBoYXMgdGhlIHN0cmluZy12YWx1ZSAKICAgICAgIC8vIGZvbzsgdGhlIGxhdHRlciBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIGFsbCBub2RlcyBpbiAkeCBoYXZlIAogICAgICAgLy8gdGhlIHN0cmluZy12YWx1ZSBmb28uCi0gICAgICBOb2RlSXRlcmF0b3IgbGlzdDEgPSBub2Rlc2V0KCk7Ci0gICAgICBOb2RlSXRlcmF0b3IgbGlzdDIgPSAoKFhOb2RlU2V0KSBvYmoyKS5ub2Rlc2V0KCk7Ci0gICAgICBOb2RlIG5vZGUxOwotICAgICAgU3RyaW5nVmVjdG9yIG5vZGUyU3RyaW5ncyA9IG51bGw7CisgICAgICBEVE1JdGVyYXRvciBsaXN0MSA9IG5vZGVzZXQoKTsKKyAgICAgIERUTUl0ZXJhdG9yIGxpc3QyID0gKChYTm9kZVNldCkgb2JqMikubm9kZXNldCgpOworICAgICAgaW50IG5vZGUxOworICAgICAgamF2YS51dGlsLlZlY3RvciBub2RlMlN0cmluZ3MgPSBudWxsOwogCi0gICAgICB3aGlsZSAobnVsbCAhPSAobm9kZTEgPSBsaXN0MS5uZXh0Tm9kZSgpKSkKKyAgICAgIHdoaWxlIChEVE0uTlVMTCAhPSAobm9kZTEgPSBsaXN0MS5uZXh0Tm9kZSgpKSkKICAgICAgIHsKLSAgICAgICAgU3RyaW5nIHMxID0gZ2V0U3RyaW5nRnJvbU5vZGUobm9kZTEpOworICAgICAgICBYTUxTdHJpbmcgczEgPSBnZXRTdHJpbmdGcm9tTm9kZShub2RlMSk7CiAKICAgICAgICAgaWYgKG51bGwgPT0gbm9kZTJTdHJpbmdzKQogICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBub2RlMjsKKyAgICAgICAgICBpbnQgbm9kZTI7CiAKLSAgICAgICAgICB3aGlsZSAobnVsbCAhPSAobm9kZTIgPSBsaXN0Mi5uZXh0Tm9kZSgpKSkKKyAgICAgICAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKG5vZGUyID0gbGlzdDIubmV4dE5vZGUoKSkpCiAgICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHMyID0gZ2V0U3RyaW5nRnJvbU5vZGUobm9kZTIpOworICAgICAgICAgICAgWE1MU3RyaW5nIHMyID0gZ2V0U3RyaW5nRnJvbU5vZGUobm9kZTIpOwogCiAgICAgICAgICAgICBpZiAoY29tcGFyYXRvci5jb21wYXJlU3RyaW5ncyhzMSwgczIpKQogICAgICAgICAgICAgewpAQCAtMzcwLDcgKzM5NCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChudWxsID09IG5vZGUyU3RyaW5ncykKLSAgICAgICAgICAgICAgbm9kZTJTdHJpbmdzID0gbmV3IFN0cmluZ1ZlY3RvcigpOworICAgICAgICAgICAgICBub2RlMlN0cmluZ3MgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwogCiAgICAgICAgICAgICBub2RlMlN0cmluZ3MuYWRkRWxlbWVudChzMik7CiAgICAgICAgICAgfQpAQCAtMzgxLDcgKzQwNSw3IEBACiAKICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcGFyYXRvci5jb21wYXJlU3RyaW5ncyhzMSwgbm9kZTJTdHJpbmdzLmVsZW1lbnRBdChpKSkpCisgICAgICAgICAgICBpZiAoY29tcGFyYXRvci5jb21wYXJlU3RyaW5ncyhzMSwgKFhNTFN0cmluZylub2RlMlN0cmluZ3MuZWxlbWVudEF0KGkpKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKIApAQCAtNDE1LDExICs0MzksMTEgQEAKICAgICAgIC8vIGNvbXBhcmlzb24gb24gdGhlIG51bWJlciB0byBiZSBjb21wYXJlZCBhbmQgb24gdGhlIHJlc3VsdCBvZiAKICAgICAgIC8vIGNvbnZlcnRpbmcgdGhlIHN0cmluZy12YWx1ZSBvZiB0aGF0IG5vZGUgdG8gYSBudW1iZXIgdXNpbmcgCiAgICAgICAvLyB0aGUgbnVtYmVyIGZ1bmN0aW9uIGlzIHRydWUuIAotICAgICAgTm9kZUl0ZXJhdG9yIGxpc3QxID0gbm9kZXNldCgpOworICAgICAgRFRNSXRlcmF0b3IgbGlzdDEgPSBub2Rlc2V0KCk7CiAgICAgICBkb3VibGUgbnVtMiA9IG9iajIubnVtKCk7Ci0gICAgICBOb2RlIG5vZGU7CisgICAgICBpbnQgbm9kZTsKIAotICAgICAgd2hpbGUgKG51bGwgIT0gKG5vZGUgPSBsaXN0MS5uZXh0Tm9kZSgpKSkKKyAgICAgIHdoaWxlIChEVE0uTlVMTCAhPSAobm9kZSA9IGxpc3QxLm5leHROb2RlKCkpKQogICAgICAgewogICAgICAgICBkb3VibGUgbnVtMSA9IGdldE51bWJlckZyb21Ob2RlKG5vZGUpOwogCkBAIC00MzMsNDUgKzQ1NywxOSBAQAogICAgIH0KICAgICBlbHNlIGlmIChYT2JqZWN0LkNMQVNTX1JUUkVFRlJBRyA9PSB0eXBlKQogICAgIHsKKyAgICAgIFhNTFN0cmluZyBzMiA9IG9iajIueHN0cigpOworICAgICAgRFRNSXRlcmF0b3IgbGlzdDEgPSBub2Rlc2V0KCk7CisgICAgICBpbnQgbm9kZTsKIAotICAgICAgLy8gaG1tbS4uLiAKLSAgICAgIC8vIFRyeSBmaXJzdCB0byB0cmVhdCBpdCBhcyBhIG51bWJlciwgc28gdGhhdCBudW1lcmljIAotICAgICAgLy8gY29tcGFyaXNvbnMgY2FuIGJlIGRvbmUgd2l0aCBpdC4gIEkgc3VzcGVjdCB0aGlzIGlzIGJvZ3VzLi4uCi0gICAgICBkb3VibGUgbnVtMiA9IG9iajIubnVtKCk7Ci0KLSAgICAgIGlmICghRG91YmxlLmlzTmFOKG51bTIpKQorICAgICAgd2hpbGUgKERUTS5OVUxMICE9IChub2RlID0gbGlzdDEubmV4dE5vZGUoKSkpCiAgICAgICB7Ci0gICAgICAgIE5vZGVJdGVyYXRvciBsaXN0MSA9IG5vZGVzZXQoKTsKLSAgICAgICAgTm9kZSBub2RlOworICAgICAgICBYTUxTdHJpbmcgczEgPSBnZXRTdHJpbmdGcm9tTm9kZShub2RlKTsKIAotICAgICAgICB3aGlsZSAobnVsbCAhPSAobm9kZSA9IGxpc3QxLm5leHROb2RlKCkpKQorICAgICAgICBpZiAoY29tcGFyYXRvci5jb21wYXJlU3RyaW5ncyhzMSwgczIpKQogICAgICAgICB7Ci0gICAgICAgICAgZG91YmxlIG51bTEgPSBnZXROdW1iZXJGcm9tTm9kZShub2RlKTsKKyAgICAgICAgICByZXN1bHQgPSB0cnVlOwogCi0gICAgICAgICAgaWYgKGNvbXBhcmF0b3IuY29tcGFyZU51bWJlcnMobnVtMSwgbnVtMikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBzMiA9IG9iajIuc3RyKCk7Ci0gICAgICAgIE5vZGVJdGVyYXRvciBsaXN0MSA9IG5vZGVzZXQoKTsKLSAgICAgICAgTm9kZSBub2RlOwotCi0gICAgICAgIHdoaWxlIChudWxsICE9IChub2RlID0gbGlzdDEubmV4dE5vZGUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgczEgPSBnZXRTdHJpbmdGcm9tTm9kZShub2RlKTsKLQotICAgICAgICAgIGlmIChjb21wYXJhdG9yLmNvbXBhcmVTdHJpbmdzKHMxLCBzMikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNDg0LDEzICs0ODIsMTMgQEAKICAgICAgIC8vIGlzIGEgbm9kZSBpbiB0aGUgbm9kZS1zZXQgc3VjaCB0aGF0IHRoZSByZXN1bHQgb2YgcGVyZm9ybWluZyAKICAgICAgIC8vIHRoZSBjb21wYXJpc29uIG9uIHRoZSBzdHJpbmctdmFsdWUgb2YgdGhlIG5vZGUgYW5kIHRoZSBvdGhlciAKICAgICAgIC8vIHN0cmluZyBpcyB0cnVlLiAKLSAgICAgIFN0cmluZyBzMiA9IG9iajIuc3RyKCk7Ci0gICAgICBOb2RlSXRlcmF0b3IgbGlzdDEgPSBub2Rlc2V0KCk7Ci0gICAgICBOb2RlIG5vZGU7CisgICAgICBYTUxTdHJpbmcgczIgPSBvYmoyLnhzdHIoKTsKKyAgICAgIERUTUl0ZXJhdG9yIGxpc3QxID0gbm9kZXNldCgpOworICAgICAgaW50IG5vZGU7CiAKLSAgICAgIHdoaWxlIChudWxsICE9IChub2RlID0gbGlzdDEubmV4dE5vZGUoKSkpCisgICAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKG5vZGUgPSBsaXN0MS5uZXh0Tm9kZSgpKSkKICAgICAgIHsKLSAgICAgICAgU3RyaW5nIHMxID0gZ2V0U3RyaW5nRnJvbU5vZGUobm9kZSk7CisgICAgICAgIFhNTFN0cmluZyBzMSA9IGdldFN0cmluZ0Zyb21Ob2RlKG5vZGUpOwogCiAgICAgICAgIGlmIChjb21wYXJhdG9yLmNvbXBhcmVTdHJpbmdzKHMxLCBzMikpCiAgICAgICAgIHsKQEAgLTU3NCw5ICs1NzIsMTYgQEAKICAgICoKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE9iamVjdCBvYmoyKSB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE9iamVjdCBvYmoyKQogICB7Ci0gICAgcmV0dXJuIGNvbXBhcmUob2JqMiwgU19FUSk7CisgICAgdHJ5CisgICAgeworICAgICAgcmV0dXJuIGNvbXBhcmUob2JqMiwgU19FUSk7CisgICAgfQorICAgIGNhdGNoKGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24gdGUpCisgICAgeworICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUueG1sLnV0aWxzLldyYXBwZWRSdW50aW1lRXhjZXB0aW9uKHRlKTsKKyAgICB9CiAgIH0KIAogICAvKioKQEAgLTYwOSw3ICs2MTQsNyBAQAogICAgKgogICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIHN0cmluZ3MgYXJlIGVxdWFsIG9yIG5vdAogICAgKi8KLSAgYWJzdHJhY3QgYm9vbGVhbiBjb21wYXJlU3RyaW5ncyhTdHJpbmcgczEsIFN0cmluZyBzMik7CisgIGFic3RyYWN0IGJvb2xlYW4gY29tcGFyZVN0cmluZ3MoWE1MU3RyaW5nIHMxLCBYTUxTdHJpbmcgczIpOwogCiAgIC8qKgogICAgKiBDb21wYXJlIHR3byBudW1iZXJzCkBAIC02MzgsNyArNjQzLDcgQEAKICAgICoKICAgICogQHJldHVybiBUcnVlIGlmIHMxIGlzIGxlc3MgdGhhbiBzMgogICAgKi8KLSAgYm9vbGVhbiBjb21wYXJlU3RyaW5ncyhTdHJpbmcgczEsIFN0cmluZyBzMikKKyAgYm9vbGVhbiBjb21wYXJlU3RyaW5ncyhYTUxTdHJpbmcgczEsIFhNTFN0cmluZyBzMikKICAgewogICAgIHJldHVybiBzMS5jb21wYXJlVG8oczIpIDwgMDsKICAgfQpAQCAtNjczLDcgKzY3OCw3IEBACiAgICAqCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzMSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gczIKICAgICovCi0gIGJvb2xlYW4gY29tcGFyZVN0cmluZ3MoU3RyaW5nIHMxLCBTdHJpbmcgczIpCisgIGJvb2xlYW4gY29tcGFyZVN0cmluZ3MoWE1MU3RyaW5nIHMxLCBYTUxTdHJpbmcgczIpCiAgIHsKICAgICByZXR1cm4gczEuY29tcGFyZVRvKHMyKSA8PSAwOwogICB9CkBAIC03MDgsNyArNzEzLDcgQEAKICAgICoKICAgICogQHJldHVybiB0cnVlIGlmIHMxIGlzIGdyZWF0ZXIgdGhhbiBzMgogICAgKi8KLSAgYm9vbGVhbiBjb21wYXJlU3RyaW5ncyhTdHJpbmcgczEsIFN0cmluZyBzMikKKyAgYm9vbGVhbiBjb21wYXJlU3RyaW5ncyhYTUxTdHJpbmcgczEsIFhNTFN0cmluZyBzMikKICAgewogICAgIHJldHVybiBzMS5jb21wYXJlVG8oczIpID4gMDsKICAgfQpAQCAtNzQzLDcgKzc0OCw3IEBACiAgICAqCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzMSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gczIKICAgICovCi0gIGJvb2xlYW4gY29tcGFyZVN0cmluZ3MoU3RyaW5nIHMxLCBTdHJpbmcgczIpCisgIGJvb2xlYW4gY29tcGFyZVN0cmluZ3MoWE1MU3RyaW5nIHMxLCBYTUxTdHJpbmcgczIpCiAgIHsKICAgICByZXR1cm4gczEuY29tcGFyZVRvKHMyKSA+PSAwOwogICB9CkBAIC03NzgsNyArNzgzLDcgQEAKICAgICoKICAgICogQHJldHVybiB0cnVlIGlmIHMxIGlzIGVxdWFsIHRvIHMyCiAgICAqLwotICBib29sZWFuIGNvbXBhcmVTdHJpbmdzKFN0cmluZyBzMSwgU3RyaW5nIHMyKQorICBib29sZWFuIGNvbXBhcmVTdHJpbmdzKFhNTFN0cmluZyBzMSwgWE1MU3RyaW5nIHMyKQogICB7CiAgICAgcmV0dXJuIHMxLmVxdWFscyhzMik7CiAgIH0KQEAgLTgxMyw3ICs4MTgsNyBAQAogICAgKgogICAgKiBAcmV0dXJuIHRydWUgaWYgczEgaXMgbm90IGVxdWFsIHRvIHMyCiAgICAqLwotICBib29sZWFuIGNvbXBhcmVTdHJpbmdzKFN0cmluZyBzMSwgU3RyaW5nIHMyKQorICBib29sZWFuIGNvbXBhcmVTdHJpbmdzKFhNTFN0cmluZyBzMSwgWE1MU3RyaW5nIHMyKQogICB7CiAgICAgcmV0dXJuICFzMS5lcXVhbHMoczIpOwogICB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hOdWxsLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hOdWxsLmphdmEKaW5kZXggNWNlODc3Mi4uMmI3ZDU4NiAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvb2JqZWN0cy9YTnVsbC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWE51bGwuamF2YQpAQCAtNTYsOCArNTYsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworLy9pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5Ob2RlU2V0OwpAQCAtMTM3LDEzICsxNDAsMTEgQEAKICAgICoKICAgICogQHJldHVybiBUaGUgb2JqZWN0IGFzIGEgcmVzdWx0IHRyZWUgZnJhZ21lbnQuCiAgICAqLwotICBwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBydHJlZShYUGF0aENvbnRleHQgc3VwcG9ydCkKKyAgcHVibGljIGludCBydHJlZShYUGF0aENvbnRleHQgc3VwcG9ydCkKICAgewotCi0gICAgRG9jdW1lbnRGcmFnbWVudCByZXN1bHQgPQotICAgICAgc3VwcG9ydC5nZXRET01IZWxwZXIoKS5nZXRET01GYWN0b3J5KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICAvLyBEVE0gZnJhZyA9IHN1cHBvcnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOworICAgIC8vICVSRVZJRVclCisgICAgcmV0dXJuIERUTS5OVUxMOwogICB9CiAKICAgLyoqCkBAIC0xNTEsNyArMTUyLDcgQEAKICAgICoKICAgICogQHJldHVybiBudWxsCiAgICAqLwotICBwdWJsaWMgTm9kZUl0ZXJhdG9yIG5vZGVzZXQoKQorICBwdWJsaWMgRFRNSXRlcmF0b3Igbm9kZXNldCgpCiAgIHsKICAgICByZXR1cm4gbnVsbDsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvb2JqZWN0cy9YTnVtYmVyLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hOdW1iZXIuamF2YQppbmRleCAzNDNmZTNhLi5lNGQ3MDIyIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hOdW1iZXIuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hOdW1iZXIuamF2YQpAQCAtNTcsNiArNTcsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHM7CiAKIGltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwogCiAvKioKICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+CkBAIC0xMjQsNiArMTI1LDE1NiBAQAogICAgIHJldHVybiAoRG91YmxlLmlzTmFOKG1fdmFsKSB8fCAobV92YWwgPT0gMC4wKSkgPyBmYWxzZSA6IHRydWU7CiAgIH0KIAorLy8gIC8qKgorLy8gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHN0cmluZy4KKy8vICAgKgorLy8gICAqIEByZXR1cm4gIk5hTiIgaWYgdGhlIG51bWJlciBpcyBOYU4sIEluZmluaXR5IG9yIC1JbmZpbml0eSBpZgorLy8gICAqIHRoZSBudW1iZXIgaXMgaW5maW5pdGUgb3IgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgbnVtYmVyLgorLy8gICAqLworLy8gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUkVDSVNJT04gPSAxNjsKKy8vICBwdWJsaWMgU3RyaW5nIHN0cigpCisvLyAgeworLy8KKy8vICAgIGlmIChEb3VibGUuaXNOYU4obV92YWwpKQorLy8gICAgeworLy8gICAgICByZXR1cm4gIk5hTiI7CisvLyAgICB9CisvLyAgICBlbHNlIGlmIChEb3VibGUuaXNJbmZpbml0ZShtX3ZhbCkpCisvLyAgICB7CisvLyAgICAgIGlmIChtX3ZhbCA+IDApCisvLyAgICAgICAgcmV0dXJuICJJbmZpbml0eSI7CisvLyAgICAgIGVsc2UKKy8vICAgICAgICByZXR1cm4gIi1JbmZpbml0eSI7CisvLyAgICB9CisvLworLy8gICAgbG9uZyBsb25nVmFsID0gKGxvbmcpbV92YWw7CisvLyAgICBpZiAoKGRvdWJsZSlsb25nVmFsID09IG1fdmFsKQorLy8gICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhsb25nVmFsKTsKKy8vCisvLworLy8gICAgU3RyaW5nIHMgPSBEb3VibGUudG9TdHJpbmcobV92YWwpOworLy8gICAgaW50IGxlbiA9IHMubGVuZ3RoKCk7CisvLworLy8gICAgaWYgKHMuY2hhckF0KGxlbiAtIDIpID09ICcuJyAmJiBzLmNoYXJBdChsZW4gLSAxKSA9PSAnMCcpCisvLyAgICB7CisvLyAgICAgIHJldHVybiBzLnN1YnN0cmluZygwLCBsZW4gLSAyKTsKKy8vICAgIH0KKy8vCisvLyAgICBpbnQgZXhwID0gMDsKKy8vICAgIGludCBlID0gcy5pbmRleE9mKCdFJyk7CisvLyAgICBpZiAoZSAhPSAtMSkKKy8vICAgIHsKKy8vICAgICAgZXhwID0gSW50ZWdlci5wYXJzZUludChzLnN1YnN0cmluZyhlICsgMSkpOworLy8gICAgICBzID0gcy5zdWJzdHJpbmcoMCxlKTsKKy8vICAgICAgbGVuID0gZTsKKy8vICAgIH0KKy8vCisvLyAgICAvLyBDYWxjdWxhdGUgU2lnbmlmaWNhbnQgRGlnaXRzOgorLy8gICAgLy8gbG9vayBmcm9tIHN0YXJ0IG9mIHN0cmluZyBmb3IgZmlyc3QgZGlnaXQKKy8vICAgIC8vIGxvb2sgZnJvbSBlbmQgZm9yIGxhc3QgZGlnaXQKKy8vICAgIC8vIHNpZ25pZmljYW50IGRpZ2l0cyA9IGVuZCAtIHN0YXJ0ICsgKDAgb3IgMSBkZXBlbmRpbmcgb24gZGVjaW1hbCBsb2NhdGlvbikKKy8vCisvLyAgICBpbnQgZGVjaW1hbFBvcyA9IC0xOworLy8gICAgaW50IHN0YXJ0ID0gKHMuY2hhckF0KDApID09ICctJykgPyAxIDogMDsKKy8vICAgIGZpbmRTdGFydDogZm9yKCA7IHN0YXJ0IDwgbGVuOyBzdGFydCsrICkKKy8vICAgIHsKKy8vICAgICAgc3dpdGNoIChzLmNoYXJBdChzdGFydCkpCisvLyAgICAgIHsKKy8vICAgICAgY2FzZSAnMCc6CisvLyAgICAgICAgYnJlYWs7CisvLyAgICAgIGNhc2UgJy4nOgorLy8gICAgICAgIGRlY2ltYWxQb3MgPSBzdGFydDsKKy8vICAgICAgICBicmVhazsKKy8vICAgICAgZGVmYXVsdDoKKy8vICAgICAgICBicmVhayBmaW5kU3RhcnQ7CisvLyAgICAgIH0KKy8vICAgIH0KKy8vICAgIGludCBlbmQgPSBzLmxlbmd0aCgpIC0gMTsKKy8vICAgIGZpbmRFbmQ6IGZvciggOyBlbmQgPiBzdGFydDsgZW5kLS0gKQorLy8gICAgeworLy8gICAgICBzd2l0Y2ggKHMuY2hhckF0KGVuZCkpCisvLyAgICAgIHsKKy8vICAgICAgY2FzZSAnMCc6CisvLyAgICAgICAgYnJlYWs7CisvLyAgICAgIGNhc2UgJy4nOgorLy8gICAgICAgIGRlY2ltYWxQb3MgPSBlbmQ7CisvLyAgICAgICAgYnJlYWs7CisvLyAgICAgIGRlZmF1bHQ6CisvLyAgICAgICAgYnJlYWsgZmluZEVuZDsKKy8vICAgICAgfQorLy8gICAgfQorLy8KKy8vICAgIGludCBzaWdEaWcgPSBlbmQgLSBzdGFydDsKKy8vCisvLyAgICAvLyBjbGFyaWZ5IGRlY2ltYWwgbG9jYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBmb3VuZAorLy8gICAgaWYgKGRlY2ltYWxQb3MgPT0gLTEpCisvLyAgICAgIGRlY2ltYWxQb3MgPSBzLmluZGV4T2YoJy4nKTsKKy8vCisvLyAgICAvLyBpZiBkZWNpbWFsIGlzIG5vdCBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQsIGFkZCBvbmUgdG8gc2lnRGlnCisvLyAgICBpZiAoZGVjaW1hbFBvcyA8IHN0YXJ0IHx8IGRlY2ltYWxQb3MgPiBlbmQpCisvLyAgICAgICsrc2lnRGlnOworLy8KKy8vICAgIC8vIHJlZHVjZSBzaWduaWZpY2FudCBkaWdpdHMgdG8gUFJFQ0lTSU9OIGlmIG5lY2Vzc2FyeQorLy8gICAgaWYgKHNpZ0RpZyA+IFBSRUNJU0lPTikKKy8vICAgIHsKKy8vICAgICAgLy8gcmUtc2NhbGUgQmlnRGVjaW1hbCBpbiBvcmRlciB0byBnZXQgc2lnbmlmaWNhbnQgZGlnaXRzID0gUFJFQ0lTSU9OCisvLyAgICAgIEJpZ0RlY2ltYWwgbnVtID0gbmV3IEJpZ0RlY2ltYWwocyk7CisvLyAgICAgIGludCBuZXdTY2FsZSA9IG51bS5zY2FsZSgpIC0gKHNpZ0RpZyAtIFBSRUNJU0lPTik7CisvLyAgICAgIGlmIChuZXdTY2FsZSA8IDApCisvLyAgICAgICAgbmV3U2NhbGUgPSAwOworLy8gICAgICBzID0gbnVtLnNldFNjYWxlKG5ld1NjYWxlLCBCaWdEZWNpbWFsLlJPVU5EX0hBTEZfVVApLnRvU3RyaW5nKCk7CisvLworLy8gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgJzAnczsga2VlcCB0cmFjayBvZiBkZWNpbWFsUG9zCisvLyAgICAgIGludCB0cnVuY2F0ZVBvaW50ID0gcy5sZW5ndGgoKTsKKy8vICAgICAgd2hpbGUgKHMuY2hhckF0KC0tdHJ1bmNhdGVQb2ludCkgPT0gJzAnKQorLy8gICAgICAgIDsKKy8vCisvLyAgICAgIGlmIChzLmNoYXJBdCh0cnVuY2F0ZVBvaW50KSA9PSAnLicpCisvLyAgICAgIHsKKy8vICAgICAgICBkZWNpbWFsUG9zID0gdHJ1bmNhdGVQb2ludDsKKy8vICAgICAgfQorLy8gICAgICBlbHNlCisvLyAgICAgIHsKKy8vICAgICAgICBkZWNpbWFsUG9zID0gcy5pbmRleE9mKCcuJyk7CisvLyAgICAgICAgdHJ1bmNhdGVQb2ludCArPSAxOworLy8gICAgICB9CisvLworLy8gICAgICBzID0gcy5zdWJzdHJpbmcoMCwgdHJ1bmNhdGVQb2ludCk7CisvLyAgICAgIGxlbiA9IHMubGVuZ3RoKCk7CisvLyAgICB9CisvLworLy8gICAgLy8gQWNjb3VudCBmb3IgZXhwb25lbnQgYnkgYWRkaW5nIHplcm9zIGFzIG5lZWRlZCAKKy8vICAgIC8vIGFuZCBtb3ZpbmcgdGhlIGRlY2ltYWwgcGxhY2UKKy8vCisvLyAgICBpZiAoZXhwID09IDApCisvLyAgICAgICByZXR1cm4gczsKKy8vCisvLyAgICBzdGFydCA9IDA7CisvLyAgICBTdHJpbmcgc2lnbjsKKy8vICAgIGlmIChzLmNoYXJBdCgwKSA9PSAnLScpCisvLyAgICB7CisvLyAgICAgIHNpZ24gPSAiLSI7CisvLyAgICAgIHN0YXJ0Kys7CisvLyAgICB9CisvLyAgICBlbHNlCisvLyAgICAgIHNpZ24gPSAiIjsKKy8vCisvLyAgICBTdHJpbmcgd2hvbGVQYXJ0ID0gcy5zdWJzdHJpbmcoc3RhcnQsIGRlY2ltYWxQb3MpOworLy8gICAgU3RyaW5nIGRlY2ltYWxQYXJ0ID0gcy5zdWJzdHJpbmcoZGVjaW1hbFBvcyArIDEpOworLy8KKy8vICAgIC8vIGdldCB0aGUgbnVtYmVyIG9mIGRpZ2l0cyByaWdodCBvZiB0aGUgZGVjaW1hbAorLy8gICAgaW50IGRlY2ltYWxMZW4gPSBkZWNpbWFsUGFydC5sZW5ndGgoKTsKKy8vCisvLyAgICBpZiAoZXhwID49IGRlY2ltYWxMZW4pCisvLyAgICAgIHJldHVybiBzaWduICsgd2hvbGVQYXJ0ICsgZGVjaW1hbFBhcnQgKyB6ZXJvcyhleHAgLSBkZWNpbWFsTGVuKTsKKy8vCisvLyAgICBpZiAoZXhwID4gMCkKKy8vICAgICAgcmV0dXJuIHNpZ24gKyB3aG9sZVBhcnQgKyBkZWNpbWFsUGFydC5zdWJzdHJpbmcoMCwgZXhwKSArICIuIgorLy8gICAgICAgICAgICAgKyBkZWNpbWFsUGFydC5zdWJzdHJpbmcoZXhwKTsKKy8vCisvLyAgICByZXR1cm4gc2lnbiArICIwLiIgKyB6ZXJvcygtMSAtIGV4cCkgKyB3aG9sZVBhcnQgKyBkZWNpbWFsUGFydDsKKy8vICB9CisKICAgLyoqCiAgICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHN0cmluZy4KICAgICoKQEAgLTE5MSw2ICszNDIsNyBAQAogICAgICAgICAgICArIHMuc3Vic3RyaW5nKDIsIGUpOwogICB9CiAKKwogICAvKioKICAgICogUmV0dXJuIGEgc3RyaW5nIG9mICcwJyBvZiB0aGUgZ2l2ZW4gbGVuZ3RoCiAgICAqCkBAIC0yMDEsNiArMzUzLDggQEAKICAgICovCiAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyB6ZXJvcyhpbnQgbikKICAgeworICAgIGlmIChuIDwgMSkKKyAgICAgIHJldHVybiAiIjsKIAogICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltuXTsKIApAQCAtMjMyLDcgKzM4Niw3IEBACiAgICAqCiAgICAqIEB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFhPYmplY3Qgb2JqMikgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFhPYmplY3Qgb2JqMikKICAgewogCiAgICAgLy8gSW4gb3JkZXIgdG8gaGFuZGxlIHRoZSAnYWxsJyBzZW1hbnRpY3Mgb2YgCkBAIC0yNDEsNiArMzk1LDEzIEBACiAgICAgaWYgKG9iajIuZ2V0VHlwZSgpID09IFhPYmplY3QuQ0xBU1NfTk9ERVNFVCkKICAgICAgIHJldHVybiBvYmoyLmVxdWFscyh0aGlzKTsKIAotICAgIHJldHVybiBtX3ZhbCA9PSBvYmoyLm51bSgpOworICAgIHRyeQorICAgIHsKKyAgICAgIHJldHVybiBtX3ZhbCA9PSBvYmoyLm51bSgpOworICAgIH0KKyAgICBjYXRjaChqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKQorICAgIHsKKyAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLnhtbC51dGlscy5XcmFwcGVkUnVudGltZUV4Y2VwdGlvbih0ZSk7CisgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hPYmplY3QuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWE9iamVjdC5qYXZhCmluZGV4IGEzMTk3YzQuLjA3ZDUyODAgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWE9iamVjdC5qYXZhCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWE9iamVjdC5qYXZhCkBAIC01NiwxMCArNTYsMTMgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOworLy9pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOwogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKQEAgLTY5LDYgKzcyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ucmVzLlhTTE1lc3NhZ2VzOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmc7CiAKIC8qKgogICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KQEAgLTE0MywxNyArMTQ3LDI0IEBACiAgICAgewogICAgICAgcmVzdWx0ID0gbmV3IFhOdW1iZXIoKChEb3VibGUpIHZhbCkuZG91YmxlVmFsdWUoKSk7CiAgICAgfQotICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpCisgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudCkKICAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgWFJUcmVlRnJhZygoRG9jdW1lbnRGcmFnbWVudCkgdmFsKTsKKyAgICAgIC8vIHJlc3VsdCA9IG5ldyBYUlRyZWVGcmFnKChEb2N1bWVudEZyYWdtZW50KSB2YWwpOworICAgICAgLy8gJVJFVklFVyUKKyAgICAgIHJlc3VsdCA9IG5ldyBYT2JqZWN0KHZhbCk7CiAgICAgfQotICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIE5vZGUpCisgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2Ygb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcikKICAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgWE5vZGVTZXQoKE5vZGUpIHZhbCk7CisgICAgICAvLyByZXN1bHQgPSBuZXcgWE5vZGVTZXQoKE5vZGVJdGVyYXRvcikgdmFsKTsKKyAgICAgIC8vICVSRVZJRVclCisgICAgICByZXN1bHQgPSBuZXcgWE9iamVjdCh2YWwpOwogICAgIH0KLSAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBOb2RlSXRlcmF0b3IpCisgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uTm9kZSkKICAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgWE5vZGVTZXQoKE5vZGVJdGVyYXRvcikgdmFsKTsKKyAgICAgIC8vIHJlc3VsdCA9IG5ldyBYTm9kZVNldCh4Y3R4dC5nZXREVE1IYW5kbGVGcm9tTm9kZSgob3JnLnczYy5kb20uTm9kZSl2YWwpLCAKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHhjdHh0LmdldERUTU1hbmFnZXIoKSk7CisgICAgICAvLyAlUkVWSUVXJQorICAgICAgcmVzdWx0ID0gbmV3IFhPYmplY3QodmFsKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTIzOSw2ICsyNTAsMTYgQEAKIAogICAgIHJldHVybiBmYWxzZTsKICAgfQorICAKKyAgLyoqCisgICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHN0cmluZy4KKyAgICoKKyAgICogQHJldHVybiBUaGUgc3RyaW5nIHRoaXMgd3JhcHMgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBudWxsCisgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIHhzdHIoKQorICB7CisgICAgcmV0dXJuIFhNTFN0cmluZ0ZhY3RvcnlJbXBsLmdldEZhY3RvcnkoKS5uZXdzdHIoc3RyKCkpOworICB9CiAKICAgLyoqCiAgICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHN0cmluZy4KQEAgLTI2OCwyMCArMjg5LDE4IEBACiAgICAqCiAgICAqIEByZXR1cm4gdGhlIG9iamVjIGFzIGEgcmVzdWx0IHRyZWUgZnJhZ21lbnQuCiAgICAqLwotICBwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBydHJlZShYUGF0aENvbnRleHQgc3VwcG9ydCkKKyAgcHVibGljIGludCBydHJlZShYUGF0aENvbnRleHQgc3VwcG9ydCkKICAgewogCi0gICAgRG9jdW1lbnRGcmFnbWVudCByZXN1bHQgPSBydHJlZSgpOworICAgIGludCByZXN1bHQgPSBydHJlZSgpOwogCi0gICAgaWYgKG51bGwgPT0gcmVzdWx0KQorICAgIGlmIChEVE0uTlVMTCA9PSByZXN1bHQpCiAgICAgewotICAgICAgcmVzdWx0ID0KLSAgICAgICAgc3VwcG9ydC5nZXRET01IZWxwZXIoKS5nZXRET01GYWN0b3J5KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwotCi0gICAgICBUZXh0IHRleHROb2RlID0KLSAgICAgICAgc3VwcG9ydC5nZXRET01IZWxwZXIoKS5nZXRET01GYWN0b3J5KCkuY3JlYXRlVGV4dE5vZGUoc3RyKCkpOwotCi0gICAgICByZXN1bHQuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOworICAgICAgRFRNIGZyYWcgPSBzdXBwb3J0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgIAorICAgICAgLy8gJU9QVCUKKyAgICAgIGZyYWcuYXBwZW5kVGV4dENoaWxkKHN0cigpKTsKKyAgICAgIHJlc3VsdCA9IGZyYWcuZ2V0RG9jdW1lbnQoKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMjkyLDkgKzMxMSw5IEBACiAgICAqCiAgICAqIEByZXR1cm4gbnVsbAogICAgKi8KLSAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgcnRyZWUoKQorICBwdWJsaWMgaW50IHJ0cmVlKCkKICAgewotICAgIHJldHVybiBudWxsOworICAgIHJldHVybiBEVE0uTlVMTDsKICAgfQogCiAgIC8qKgpAQCAtMzE1LDcgKzMzNCw3IEBACiAgICAqCiAgICAqIEB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIE5vZGVJdGVyYXRvciBub2Rlc2V0KCkgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KKyAgcHVibGljIERUTUl0ZXJhdG9yIG5vZGVzZXQoKSB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKICAgICBlcnJvcihYUEFUSEVycm9yUmVzb3VyY2VzLkVSX0NBTlRfQ09OVkVSVF9UT19OT0RFTElTVCwKQEAgLTM3Myw5ICszOTIsMTAgQEAKICAgICBjYXNlIENMQVNTX1VOS05PV04gOgogICAgICAgcmVzdWx0ID0gbV9vYmo7CiAgICAgICBicmVhazsKLSAgICBjYXNlIENMQVNTX1JUUkVFRlJBRyA6Ci0gICAgICByZXN1bHQgPSBydHJlZShzdXBwb3J0KTsKLSAgICAgIGJyZWFrOworICAgICAgLy8gJVRCRCUgIFdoYXQgdG8gZG8gaGVyZT8KKy8vICAgIGNhc2UgQ0xBU1NfUlRSRUVGUkFHIDoKKy8vICAgICAgcmVzdWx0ID0gcnRyZWUoc3VwcG9ydCk7CisvLyAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQgOgogICAgICAgZXJyb3IoWFBBVEhFcnJvclJlc291cmNlcy5FUl9DQU5UX0NPTlZFUlRfVE9fVFlQRSwKICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgZ2V0VHlwZVN0cmluZygpLApAQCAtNDg5LDcgKzUwOSw3IEBACiAgICAqCiAgICAqIEB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFhPYmplY3Qgb2JqMikgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFhPYmplY3Qgb2JqMikKICAgewogCiAgICAgLy8gSW4gb3JkZXIgdG8gaGFuZGxlIHRoZSAnYWxsJyBzZW1hbnRpY3Mgb2YgCkBAIC01NTgsNCArNTc4LDE1IEBACiAgICAgICB0aHJvdyBuZXcgWFBhdGhFeGNlcHRpb24oZm1zZyk7CiAgICAgfQogICB9CisgIAorICAvKioKKyAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgc3RyaW5nLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgdGhpcyB3cmFwcyBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIG51bGwKKyAgICovCisgIHB1YmxpYyB2b2lkIGFwcGVuZFRvRnNiKG9yZy5hcGFjaGUueG1sLnV0aWxzLkZhc3RTdHJpbmdCdWZmZXIgZnNiKQorICB7CisgICAgZnNiLmFwcGVuZChzdHIoKSk7CisgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvb2JqZWN0cy9YUlRyZWVGcmFnLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hSVHJlZUZyYWcuamF2YQppbmRleCA1NjRmZWYyLi5mYWU5OWYwIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hSVHJlZUZyYWcuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hSVHJlZUZyYWcuamF2YQpAQCAtNTYsMTEgKzU2LDE3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzOwogCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOworLy9pbXBvcnQgb3JnLnczYy5kb20uKjsKKy8vaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNRmlsdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MU3RyaW5nOwogCiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5ET01IZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aENvbnRleHQ7CiAKIC8qKgogICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImdlbmVyYWwiLz4KQEAgLTY5LDE1ICs3NSwzNiBAQAogICovCiBwdWJsaWMgY2xhc3MgWFJUcmVlRnJhZyBleHRlbmRzIFhPYmplY3QKIHsKKyAgRFRNIG1fZHRtOworICBpbnQgbV9kdG1Sb290OworICBYUGF0aENvbnRleHQgbV94Y3R4dDsKIAorLy8gIC8qKgorLy8gICAqIENyZWF0ZSBhbiBYUlRyZWVGcmFnIE9iamVjdC4KKy8vICAgKgorLy8gICAqIEBwYXJhbSBmcmFnIERvY3VtZW50IGZyYWdtZW50IHRoaXMgd2lsbCB3cmFwCisvLyAgICovCisvLyAgcHVibGljIFhSVHJlZUZyYWcoRFRNSXRlcmF0b3IgZnJhZykKKy8vICB7CisvLyAgICBzdXBlcihmcmFnKTsKKy8vICAgIAorLy8gICAgLy8gT2J2aW91c2x5LCB0aGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBhdm9pZGVkIHdoZW4gcG9zc2libGUuCisvLyAgICBtX2R0bVJvb3QgPSBmcmFnLmNsb25lV2l0aFJlc2V0KCkubmV4dE5vZGUoKTsKKy8vICB9CisgIAogICAvKioKICAgICogQ3JlYXRlIGFuIFhSVHJlZUZyYWcgT2JqZWN0LgogICAgKgogICAgKiBAcGFyYW0gZnJhZyBEb2N1bWVudCBmcmFnbWVudCB0aGlzIHdpbGwgd3JhcAogICAgKi8KLSAgcHVibGljIFhSVHJlZUZyYWcoRG9jdW1lbnRGcmFnbWVudCBmcmFnKQorICBwdWJsaWMgWFJUcmVlRnJhZyhpbnQgcm9vdCwgWFBhdGhDb250ZXh0IHhjdHh0KQogICB7Ci0gICAgc3VwZXIoZnJhZyk7CisgICAgc3VwZXIobnVsbCk7CisgICAgCisgICAgLy8gT2J2aW91c2x5LCB0aGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBhdm9pZGVkIHdoZW4gcG9zc2libGUuCisgICAgbV9kdG1Sb290ID0gcm9vdDsKKyAgICBtX3hjdHh0ID0geGN0eHQ7CisgICAgbV9kdG0gPSB4Y3R4dC5nZXREVE0ocm9vdCk7CiAgIH0KIAogICAvKioKQEAgLTEwOSwzNSArMTM2LDExIEBACiAgIHB1YmxpYyBkb3VibGUgbnVtKCkKICAgewogCi0vLyAgICBqYXZhLnRleHQuTnVtYmVyRm9ybWF0IG1fZm9ybWF0dGVyID0KLS8vICAgICAgamF2YS50ZXh0Lk51bWJlckZvcm1hdC5nZXROdW1iZXJJbnN0YW5jZSgpOwogICAgIGRvdWJsZSByZXN1bHQ7Ci0gICAgU3RyaW5nIHMgPSBET01IZWxwZXIuZ2V0Tm9kZURhdGEoKERvY3VtZW50RnJhZ21lbnQpIG1fb2JqKTsKKyAgICAKKyAgICBYTUxTdHJpbmcgcyA9IG1fZHRtLmdldFN0cmluZ1ZhbHVlKG1fZHRtUm9vdCk7CiAKLSAgICBpZiAobnVsbCAhPSBzKQotICAgIHsKLS8vICAgICAgdHJ5Ci0vLyAgICAgIHsKLQotICAgICAgICAvLyByZXN1bHQgPSBEb3VibGUudmFsdWVPZihzKS5kb3VibGVWYWx1ZSgpOwotLy8gICAgICAgIE51bWJlciBuID0gbV9mb3JtYXR0ZXIucGFyc2Uocy50cmltKCkpOwotLy8KLS8vICAgICAgICByZXN1bHQgPSBuLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgcmVzdWx0ID0gWFN0cmluZy5jYXN0VG9OdW0ocy50cmltKCkpOwotLy8gICAgICB9Ci0vLwotLy8gICAgICAvLyBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotLy8gICAgICBjYXRjaCAoamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uIG5mZSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9IERvdWJsZS5OYU47Ci0vLyAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IERvdWJsZS5OYU47Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcy50b0RvdWJsZSgpOwogICB9CiAKICAgLyoqCkBAIC0xNTAsNiArMTUzLDMzIEBACiAgIHsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQorICAKKyAgcHJpdmF0ZSBYTUxTdHJpbmcgbV94bWxTdHIgPSBudWxsOworICAKKyAgLyoqCisgICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhbiBYTUxTdHJpbmcuCisgICAqCisgICAqIEByZXR1cm4gVGhlIGRvY3VtZW50IGZyYWdtZW50IG5vZGUgZGF0YSBvciB0aGUgZW1wdHkgc3RyaW5nLiAKKyAgICovCisgIHB1YmxpYyBYTUxTdHJpbmcgeHN0cigpCisgIHsKKyAgICBpZihudWxsID09IG1feG1sU3RyKQorICAgICAgbV94bWxTdHIgPSBtX2R0bS5nZXRTdHJpbmdWYWx1ZShtX2R0bVJvb3QpOworICAgIAorICAgIHJldHVybiBtX3htbFN0cjsKKyAgfQorICAKKyAgLyoqCisgICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHN0cmluZy4KKyAgICoKKyAgICogQHJldHVybiBUaGUgc3RyaW5nIHRoaXMgd3JhcHMgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBudWxsCisgICAqLworICBwdWJsaWMgdm9pZCBhcHBlbmRUb0ZzYihvcmcuYXBhY2hlLnhtbC51dGlscy5GYXN0U3RyaW5nQnVmZmVyIGZzYikKKyAgeworICAgIFhTdHJpbmcgeHN0cmluZyA9IChYU3RyaW5nKXhzdHIoKTsKKyAgICB4c3RyaW5nLmFwcGVuZFRvRnNiKGZzYik7CisgIH0KKwogCiAgIC8qKgogICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBzdHJpbmcuCkBAIC0xNTgsOCArMTg4LDcgQEAKICAgICovCiAgIHB1YmxpYyBTdHJpbmcgc3RyKCkKICAgewotCi0gICAgU3RyaW5nIHN0ciA9IERPTUhlbHBlci5nZXROb2RlRGF0YSgoRG9jdW1lbnRGcmFnbWVudCkgbV9vYmopOworICAgIFN0cmluZyBzdHIgPSBtX2R0bS5nZXRTdHJpbmdWYWx1ZShtX2R0bVJvb3QpLnRvU3RyaW5nKCk7CiAKICAgICByZXR1cm4gKG51bGwgPT0gc3RyKSA/ICIiIDogc3RyOwogICB9CkBAIC0xNjksMzggKzE5OCwzNSBAQAogICAgKgogICAgKiBAcmV0dXJuIFRoZSBkb2N1bWVudCBmcmFnbWVudCB0aGlzIHdyYXBzCiAgICAqLwotICBwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBydHJlZSgpCisgIHB1YmxpYyBpbnQgcnRyZWUoKQogICB7Ci0gICAgcmV0dXJuIChEb2N1bWVudEZyYWdtZW50KSBtX29iajsKKyAgICByZXR1cm4gbV9kdG1Sb290OwogICB9CiAKICAgLyoqCi0gICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIE5vZGVJdGVyYXRvci4KKyAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgRFRNSXRlcmF0b3IuCiAgICAqCi0gICAqIEByZXR1cm4gVGhlIGRvY3VtZW50IGZyYWdtZW50IGFzIGEgTm9kZUl0ZXJhdG9yCisgICAqIEByZXR1cm4gVGhlIGRvY3VtZW50IGZyYWdtZW50IGFzIGEgRFRNSXRlcmF0b3IKICAgICovCi0gIHB1YmxpYyBOb2RlSXRlcmF0b3IgYXNOb2RlSXRlcmF0b3IoKQorICBwdWJsaWMgRFRNSXRlcmF0b3IgYXNOb2RlSXRlcmF0b3IoKQogICB7Ci0KLSAgICBpZiAobV9vYmogaW5zdGFuY2VvZiBOb2RlSXRlcmF0b3IpCi0gICAgICByZXR1cm4gKE5vZGVJdGVyYXRvcikgbV9vYmo7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3JXcmFwcGVyKHJ0cmVlKCkpOworICAgIHJldHVybiBtX3hjdHh0LmNyZWF0ZURUTUl0ZXJhdG9yKG1fZHRtUm9vdCk7CiAgIH0KIAotICAvKioKLSAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgbm9kZWxpc3QuIChzcGVjaWFsIGZ1bmN0aW9uKS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgZG9jdW1lbnQgZnJhZ21lbnQgYXMgYSBub2RlbGlzdAotICAgKi8KLSAgcHVibGljIE5vZGVMaXN0IGNvbnZlcnRUb05vZGVzZXQoKQotICB7Ci0KLSAgICBpZiAobV9vYmogaW5zdGFuY2VvZiBOb2RlTGlzdCkKLSAgICAgIHJldHVybiAoTm9kZUxpc3QpIG1fb2JqOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9CisgIC8vICVUQkQlCisvLyAgLyoqCisvLyAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgbm9kZWxpc3QuIChzcGVjaWFsIGZ1bmN0aW9uKS4KKy8vICAgKgorLy8gICAqIEByZXR1cm4gVGhlIGRvY3VtZW50IGZyYWdtZW50IGFzIGEgbm9kZWxpc3QKKy8vICAgKi8KKy8vICBwdWJsaWMgTm9kZUxpc3QgY29udmVydFRvTm9kZXNldCgpCisvLyAgeworLy8KKy8vICAgIGlmIChtX29iaiBpbnN0YW5jZW9mIE5vZGVMaXN0KQorLy8gICAgICByZXR1cm4gKE5vZGVMaXN0KSBtX29iajsKKy8vICAgIGVsc2UKKy8vICAgICAgcmV0dXJuIG51bGw7CisvLyAgfQogCiAgIC8qKgogICAgKiBUZWxsIGlmIHR3byBvYmplY3RzIGFyZSBmdW5jdGlvbmFsbHkgZXF1YWwuCkBAIC0yMTEsMTcyICsyMzcsNTAgQEAKICAgICoKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE9iamVjdCBvYmoyKSB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE9iamVjdCBvYmoyKQogICB7CiAKLSAgICBpZiAoWE9iamVjdC5DTEFTU19OT0RFU0VUID09IG9iajIuZ2V0VHlwZSgpKQorICAgIHRyeQogICAgIHsKLQotICAgICAgLy8gSW4gb3JkZXIgdG8gaGFuZGxlIHRoZSAnYWxsJyBzZW1hbnRpY3Mgb2YgCi0gICAgICAvLyBub2Rlc2V0IGNvbXBhcmlzb25zLCB3ZSBhbHdheXMgY2FsbCB0aGUgCi0gICAgICAvLyBub2Rlc2V0IGZ1bmN0aW9uLgotICAgICAgcmV0dXJuIG9iajIuZXF1YWxzKHRoaXMpOworICAgICAgaWYgKFhPYmplY3QuQ0xBU1NfTk9ERVNFVCA9PSBvYmoyLmdldFR5cGUoKSkKKyAgICAgIHsKKyAgCisgICAgICAgIC8vIEluIG9yZGVyIHRvIGhhbmRsZSB0aGUgJ2FsbCcgc2VtYW50aWNzIG9mIAorICAgICAgICAvLyBub2Rlc2V0IGNvbXBhcmlzb25zLCB3ZSBhbHdheXMgY2FsbCB0aGUgCisgICAgICAgIC8vIG5vZGVzZXQgZnVuY3Rpb24uCisgICAgICAgIHJldHVybiBvYmoyLmVxdWFscyh0aGlzKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKFhPYmplY3QuQ0xBU1NfQk9PTEVBTiA9PSBvYmoyLmdldFR5cGUoKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGJvb2woKSA9PSBvYmoyLmJvb2woKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKFhPYmplY3QuQ0xBU1NfTlVNQkVSID09IG9iajIuZ2V0VHlwZSgpKQorICAgICAgeworICAgICAgICByZXR1cm4gbnVtKCkgPT0gb2JqMi5udW0oKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKFhPYmplY3QuQ0xBU1NfTk9ERVNFVCA9PSBvYmoyLmdldFR5cGUoKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHhzdHIoKS5lcXVhbHMob2JqMi54c3RyKCkpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoWE9iamVjdC5DTEFTU19TVFJJTkcgPT0gb2JqMi5nZXRUeXBlKCkpCisgICAgICB7CisgICAgICAgIHJldHVybiB4c3RyKCkuZXF1YWxzKG9iajIueHN0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKFhPYmplY3QuQ0xBU1NfUlRSRUVGUkFHID09IG9iajIuZ2V0VHlwZSgpKQorICAgICAgeworICAKKyAgICAgICAgLy8gUHJvYmFibHkgbm90IHNvIGdvb2QuICBUaGluayBhYm91dCB0aGlzLgorICAgICAgICByZXR1cm4geHN0cigpLmVxdWFscyhvYmoyLnhzdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMob2JqMik7CisgICAgICB9CiAgICAgfQotICAgIGVsc2UgaWYgKFhPYmplY3QuQ0xBU1NfQk9PTEVBTiA9PSBvYmoyLmdldFR5cGUoKSkKKyAgICBjYXRjaChqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKQogICAgIHsKLSAgICAgIHJldHVybiBib29sKCkgPT0gb2JqMi5ib29sKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhPYmplY3QuQ0xBU1NfTlVNQkVSID09IG9iajIuZ2V0VHlwZSgpKQotICAgIHsKLSAgICAgIHJldHVybiBudW0oKSA9PSBvYmoyLm51bSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChYT2JqZWN0LkNMQVNTX05PREVTRVQgPT0gb2JqMi5nZXRUeXBlKCkpCi0gICAgewotICAgICAgcmV0dXJuIHN0cigpLmVxdWFscyhvYmoyLnN0cigpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoWE9iamVjdC5DTEFTU19TVFJJTkcgPT0gb2JqMi5nZXRUeXBlKCkpCi0gICAgewotICAgICAgcmV0dXJuIHN0cigpLmVxdWFscyhvYmoyLnN0cigpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoWE9iamVjdC5DTEFTU19SVFJFRUZSQUcgPT0gb2JqMi5nZXRUeXBlKCkpCi0gICAgewotCi0gICAgICAvLyBQcm9iYWJseSBub3Qgc28gZ29vZC4gIFRoaW5rIGFib3V0IHRoaXMuCi0gICAgICByZXR1cm4gc3RyKCkuZXF1YWxzKG9iajIuc3RyKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmoyKTsKKyAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLnhtbC51dGlscy5XcmFwcGVkUnVudGltZUV4Y2VwdGlvbih0ZSk7CiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJpbnRlcm5hbCIvPgotICAgKiBDbGFzcyB0byB3cmFwIGEgIE5vZGVJdGVyYXRvciBvYmplY3QKLSAgICovCi0gIGNsYXNzIE5vZGVJdGVyYXRvcldyYXBwZXIgaW1wbGVtZW50cyBOb2RlSXRlcmF0b3IKLSAgewotCi0gICAgLyoqIFBvc2l0aW9uIG9mIG5leHQgbm9kZSAgICAgICAgICAqLwotICAgIHByaXZhdGUgaW50IG1fcG9zID0gLTE7Ci0KLSAgICAvKiogRG9jdW1lbnQgZnJhZ21lbnQgaW5zdGFuY2UgdGhpcyB3aWxsIHdyYXAgICAgICAgICAqLwotICAgIHByaXZhdGUgRG9jdW1lbnRGcmFnbWVudCBtX2RvY0ZyYWc7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBOb2RlSXRlcmF0b3JXcmFwcGVyCi0gICAgICoKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZiBEb2N1bWVudCBmcmFnbWVudCBpbnN0YW5jZSB0aGlzIHdpbGwgd3JhcAotICAgICAqLwotICAgIE5vZGVJdGVyYXRvcldyYXBwZXIoRG9jdW1lbnRGcmFnbWVudCBkZikKLSAgICB7Ci0gICAgICBtX2RvY0ZyYWcgPSBkZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIHJvb3Qgbm9kZSBvZiB0aGUgSXRlcmF0b3IsIGFzIHNwZWNpZmllZCB3aGVuIGl0IHdhcyBjcmVhdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiBudWxsCi0gICAgICovCi0gICAgcHVibGljIE5vZGUgZ2V0Um9vdCgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFRoaXMgYXR0cmlidXRlIGRldGVybWluZXMgd2hpY2ggbm9kZSB0eXBlcyBhcmUgcHJlc2VudGVkIHZpYSB0aGUKLSAgICAgKiBpdGVyYXRvci4gVGhlIGF2YWlsYWJsZSBzZXQgb2YgY29uc3RhbnRzIGlzIGRlZmluZWQgaW4gdGhlCi0gICAgICogPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogQHJldHVybiBBbGwgbm9kZSB0eXBlcwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0V2hhdFRvU2hvdygpCi0gICAgewotICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuU0hPV19BTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFRoZSBmaWx0ZXIgdXNlZCB0byBzY3JlZW4gbm9kZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZUZpbHRlciBnZXRGaWx0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBUaGUgdmFsdWUgb2YgdGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciB0aGUgY2hpbGRyZW4gb2YgZW50aXR5Ci0gICAgICogcmVmZXJlbmNlIG5vZGVzIGFyZSB2aXNpYmxlIHRvIHRoZSBpdGVyYXRvci4gSWYgZmFsc2UsIHRoZXkgd2lsbCBiZQotICAgICAqIHNraXBwZWQgb3Zlci4KLSAgICAgKiA8YnI+IFRvIHByb2R1Y2UgYSB2aWV3IG9mIHRoZSBkb2N1bWVudCB0aGF0IGhhcyBlbnRpdHkgcmVmZXJlbmNlcwotICAgICAqIGV4cGFuZGVkIGFuZCBkb2VzIG5vdCBleHBvc2UgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBpdHNlbGYsIHVzZSB0aGUKLSAgICAgKiB3aGF0VG9TaG93IGZsYWdzIHRvIGhpZGUgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBhbmQgc2V0Ci0gICAgICogZXhwYW5kRW50aXR5UmVmZXJlbmNlcyB0byB0cnVlIHdoZW4gY3JlYXRpbmcgdGhlIGl0ZXJhdG9yLiBUbyBwcm9kdWNlCi0gICAgICogYSB2aWV3IG9mIHRoZSBkb2N1bWVudCB0aGF0IGhhcyBlbnRpdHkgcmVmZXJlbmNlIG5vZGVzIGJ1dCBubyBlbnRpdHkKLSAgICAgKiBleHBhbnNpb24sIHVzZSB0aGUgd2hhdFRvU2hvdyBmbGFncyB0byBzaG93IHRoZSBlbnRpdHkgcmVmZXJlbmNlIG5vZGUKLSAgICAgKiBhbmQgc2V0IGV4cGFuZEVudGl0eVJlZmVyZW5jZXMgdG8gZmFsc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmV4dCBub2RlIGluIHRoZSBzZXQgYW5kIGFkdmFuY2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUKLSAgICAgKiBpdGVyYXRvciBpbiB0aGUgc2V0LiBBZnRlciBhIE5vZGVJdGVyYXRvciBpcyBjcmVhdGVkLCB0aGUgZmlyc3QgY2FsbAotICAgICAqIHRvIG5leHROb2RlKCkgcmV0dXJucyB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgc2V0LgotICAgICAqIEByZXR1cm4gIFRoZSBuZXh0IDxjb2RlPk5vZGU8L2NvZGU+IGluIHRoZSBzZXQgYmVpbmcgaXRlcmF0ZWQgb3Zlciwgb3IKLSAgICAgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBtb3JlIG1lbWJlcnMgaW4gdGhhdCBzZXQuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24KLSAgICAgKiAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUKLSAgICAgKiAgIDxjb2RlPmRldGFjaDwvY29kZT4gbWV0aG9kIHdhcyBpbnZva2VkLgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIG5leHROb2RlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgaWYgKC0xID09IG1fcG9zKQotICAgICAgewotICAgICAgICBtX3BvcyA9IDA7Ci0KLSAgICAgICAgcmV0dXJuIG1fZG9jRnJhZzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIHNldCBhbmQgbW92ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotICAgICAqIGl0ZXJhdG9yIGJhY2t3YXJkcyBpbiB0aGUgc2V0LgotICAgICAqIEByZXR1cm4gIFRoZSBwcmV2aW91cyA8Y29kZT5Ob2RlPC9jb2RlPiBpbiB0aGUgc2V0IGJlaW5nIGl0ZXJhdGVkIG92ZXIsCi0gICAgICogICBvcjxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBtb3JlIG1lbWJlcnMgaW4gdGhhdCBzZXQuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24KLSAgICAgKiAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUKLSAgICAgKiAgIDxjb2RlPmRldGFjaDwvY29kZT4gbWV0aG9kIHdhcyBpbnZva2VkLgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIHByZXZpb3VzTm9kZSgpIHRocm93cyBET01FeGNlcHRpb24KLSAgICB7Ci0KLSAgICAgIGlmICgwID09IG1fcG9zKQotICAgICAgewotICAgICAgICBtX3BvcyA9IC0xOwotCi0gICAgICAgIHJldHVybiBtX2RvY0ZyYWc7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBEZXRhY2hlcyB0aGUgaXRlcmF0b3IgZnJvbSB0aGUgc2V0IHdoaWNoIGl0IGl0ZXJhdGVkIG92ZXIsIHJlbGVhc2luZwotICAgICAqIGFueSBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBhbmQgcGxhY2luZyB0aGUgaXRlcmF0b3IgaW4gdGhlIElOVkFMSUQKLSAgICAgKiBzdGF0ZS4gQWZ0ZXI8Y29kZT5kZXRhY2g8L2NvZGU+IGhhcyBiZWVuIGludm9rZWQsIGNhbGxzIHRvCi0gICAgICogPGNvZGU+bmV4dE5vZGU8L2NvZGU+IG9yPGNvZGU+cHJldmlvdXNOb2RlPC9jb2RlPiB3aWxsIHJhaXNlIHRoZQotICAgICAqIGV4Y2VwdGlvbiBJTlZBTElEX1NUQVRFX0VSUi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXRhY2goKXt9Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWFN0cmluZy5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvb2JqZWN0cy9YU3RyaW5nLmphdmEKaW5kZXggNzYwNmNhYS4uMjgxZTEzNCAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvb2JqZWN0cy9YU3RyaW5nLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvb2JqZWN0cy9YU3RyaW5nLmphdmEKQEAgLTU2LDIyICs1Niw0MCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0czsKIAotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci0KKy8vaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MU3RyaW5nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxDaGFyYWN0ZXJSZWNvZ25pemVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLkZhc3RTdHJpbmdCdWZmZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAvKioKICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJnZW5lcmFsIi8+CiAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gWFBhdGggc3RyaW5nIG9iamVjdCwgYW5kIGlzIGNhcGFibGUgb2YKICAqIGNvbnZlcnRpbmcgdGhlIHN0cmluZyB0byBvdGhlciB0eXBlcywgc3VjaCBhcyBhIG51bWJlci4KICAqLwotcHVibGljIGNsYXNzIFhTdHJpbmcgZXh0ZW5kcyBYT2JqZWN0CitwdWJsaWMgY2xhc3MgWFN0cmluZyBleHRlbmRzIFhPYmplY3QgaW1wbGVtZW50cyBYTUxTdHJpbmcKIHsKIAotICAvKiogRW1wdHkgc3RyaW5nIFhTdHJpbmcgb2JqZWN0ICAgICAgICAgICovCisgIC8qKiBFbXB0eSBzdHJpbmcgWFN0cmluZyBvYmplY3QgKi8KICAgcHVibGljIHN0YXRpYyBYU3RyaW5nIEVNUFRZU1RSSU5HID0gbmV3IFhTdHJpbmcoIiIpOwogCiAgIC8qKgorICAgKiBDb25zdHJ1Y3QgYSBYU3RyaW5nIG9iamVjdC4gIFRoaXMgY29uc3RydWN0b3IgZXhpc3RzIGZvciBkZXJpdmVkIGNsYXNzZXMuCisgICAqCisgICAqIEBwYXJhbSB2YWwgU3RyaW5nIG9iamVjdCB0aGlzIHdpbGwgd3JhcC4KKyAgICovCisgIHByb3RlY3RlZCBYU3RyaW5nKE9iamVjdCB2YWwpCisgIHsKKyAgICBzdXBlcih2YWwpOworICB9CisKKyAgLyoqCiAgICAqIENvbnN0cnVjdCBhIFhOb2RlU2V0IG9iamVjdC4KICAgICoKICAgICogQHBhcmFtIHZhbCBTdHJpbmcgb2JqZWN0IHRoaXMgd2lsbCB3cmFwLgpAQCAtMTAzLDYyICsxMjEsMTMgQEAKICAgfQogCiAgIC8qKgotICAgKiBDYXN0IGEgc3RyaW5nIHRvIGEgbnVtYmVyLgorICAgKiBUZWxsIGlmIHRoaXMgb2JqZWN0IGNvbnRhaW5zIGEgamF2YSBTdHJpbmcgb2JqZWN0LgogICAgKgotICAgKiBAcGFyYW0gcyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQKLSAgICoKLSAgICogQHJldHVybiAwLjAgaWYgdGhlIHN0cmluZyBpcyBudWxsLCBudW1lcmljIHZhbHVlIG9mIHRoZSBzdHJpbmcKLSAgICogb3IgTmFOCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIFhNTFN0cmluZyBjYW4gcmV0dXJuIGEgc3RyaW5nIHdpdGhvdXQgY3JlYXRpbmcgb25lLgogICAgKi8KLSAgcHVibGljIHN0YXRpYyBkb3VibGUgY2FzdFRvTnVtKFN0cmluZyBzKQorICBwdWJsaWMgYm9vbGVhbiBoYXNTdHJpbmcoKQogICB7Ci0KLSAgICBkb3VibGUgcmVzdWx0OwotCi0gICAgaWYgKG51bGwgPT0gcykKLSAgICAgIHJlc3VsdCA9IDAuMDsKLSAgICBlbHNlCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRPRE86IEFkanVzdCB0aGlzIGZvciBsb2NhbGUuIE5lZWQgdG8gdGFrZSBpbnRvCi0gICAgICAgICAqIGFjY291bnQgdGhlIGxhbmcgcGFyYW1ldGVyIG9uIHRoZSB4c2w6c29ydAotICAgICAgICAgKi8KLQotICAgICAgICAvLyBJdCBzZWVtcyB3ZSBjYW4gbm90IHVzZSB0aGlzIGFzIGl0IGp1c3QgcGFyc2VzIHRoZSAKLSAgICAgICAgLy8gc3RhcnQgb2YgdGhlIHN0cmluZyB1bnRpbCBpdCBmaW5kcyBhIG5vbi1udW1iZXIgY2hhciwgCi0gICAgICAgIC8vIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnQgYWNjb3JkaW5nIHRvIHRoZSBYU0xUIHNwZWMuICAKLSAgICAgICAgLy8gQWxzbywgSSAqdGhpbmsqIHRoaXMgaXMgYSBsb2NhbC1zcGVjaWZpYwotICAgICAgICAvLyBwYXJzZSwgd2hpY2ggaXMgYWxzbyBub3Qgd2hhdCB3ZSB3YW50IGFjY29yZGluZyB0byB0aGUgCi0gICAgICAgIC8vIFhTTFQgc3BlYyAoc2VlIGJlbG93KS4KLSAgICAgICAgLy8gTnVtYmVyRm9ybWF0IGZvcm1hdHRlciA9IE51bWJlckZvcm1hdC5nZXROdW1iZXJJbnN0YW5jZSgpOwotICAgICAgICAvLyByZXN1bHQgPSBmb3JtYXR0ZXIucGFyc2Uocy50cmltKCkpLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgIC8vIFRoZSBkdW1iIFhTTFQgc3BlYyBzYXlzOiAiVGhlIG51bWJlciBmdW5jdGlvbiBzaG91bGQgCi0gICAgICAgIC8vIG5vdCBiZSB1c2VkIGZvciBjb252ZXJzaW9uIG9mIG51bWVyaWMgZGF0YSBvY2N1cnJpbmcgCi0gICAgICAgIC8vIGluIGFuIGVsZW1lbnQgaW4gYW4gWE1MIGRvY3VtZW50IHVubGVzcyB0aGUgZWxlbWVudCAKLSAgICAgICAgLy8gaXMgb2YgYSB0eXBlIHRoYXQgcmVwcmVzZW50cyBudW1lcmljIGRhdGEgaW4gYSAKLSAgICAgICAgLy8gbGFuZ3VhZ2UtbmV1dHJhbCBmb3JtYXQgKHdoaWNoIHdvdWxkIHR5cGljYWxseSBiZSAKLSAgICAgICAgLy8gdHJhbnNmb3JtZWQgaW50byBhIGxhbmd1YWdlLXNwZWNpZmljIGZvcm1hdCBmb3IgCi0gICAgICAgIC8vIHByZXNlbnRhdGlvbiB0byBhIHVzZXIpLiBJbiBhZGRpdGlvbiwgdGhlIG51bWJlciAKLSAgICAgICAgLy8gZnVuY3Rpb24gY2Fubm90IGJlIHVzZWQgdW5sZXNzIHRoZSBsYW5ndWFnZS1uZXV0cmFsIAotICAgICAgICAvLyBmb3JtYXQgdXNlZCBieSB0aGUgZWxlbWVudCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIAotICAgICAgICAvLyBYUGF0aCBzeW50YXggZm9yIGEgTnVtYmVyLiIKLSAgICAgICAgLy8gU28gSSBndWVzcyB3ZSBuZWVkIHRvIGNoZWNrLCBpZiB0aGUgZGVmYXVsdCBsb2NhbCAKLSAgICAgICAgLy8gaXMgZnJlbmNoLCBkb2VzIERvdWJsZS52YWx1ZU9mIHVzZSB0aGUgbG9jYWwgc3BlY2lmaWMgCi0gICAgICAgIC8vIHBhcnNlPyAgT3IgZG9lcyBpdCB1c2UgdGhlIGllZWUgcGFyc2U/Ci0gICAgICAgIHJlc3VsdCA9IERvdWJsZS52YWx1ZU9mKHMudHJpbSgpKS5kb3VibGVWYWx1ZSgpOwotICAgICAgfQotCi0gICAgICAvLyBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgCi0gICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gRG91YmxlLk5hTjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiB0cnVlOwogICB9CiAKICAgLyoqCkBAIC0xNjksNyArMTM4LDEwNyBAQAogICAgKi8KICAgcHVibGljIGRvdWJsZSBudW0oKQogICB7Ci0gICAgcmV0dXJuIGNhc3RUb051bSgoU3RyaW5nKSBtX29iaik7CisgICAgcmV0dXJuIHRvRG91YmxlKCk7CisgIH0KKworICAvKioKKyAgICogQ29udmVydCBhIHN0cmluZyB0byBhIGRvdWJsZSAtLSBBbGxvd2VkIGlucHV0IGlzIGluIGZpeGVkCisgICAqIG5vdGF0aW9uIGRkZC5mZmYuCisgICAqCisgICAqIEByZXR1cm4gQSBkb3VibGUgdmFsdWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0cmluZywgb3IgcmV0dXJuIERvdWJsZS5OYU4KKyAgICogaWYgdGhlIHN0cmluZyBjYW4gbm90IGJlIGNvbnZlcnRlZC4KKyAgICovCisgIHB1YmxpYyBkb3VibGUgdG9Eb3VibGUoKQorICB7CisgICAgaW50IGVuZCA9IGxlbmd0aCgpOworICAgIAorICAgIGlmKDAgPT0gZW5kKQorICAgICAgcmV0dXJuIERvdWJsZS5OYU47CisKKyAgICBkb3VibGUgcmVzdWx0ID0gMC4wOworICAgIGludCBzdGFydCA9IDA7CisgICAgaW50IHB1bmN0UG9zID0gZW5kLTE7CisKKyAgICAvLyBTY2FuIHRvIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyLgorICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKQorICAgIHsKKyAgICAgIGNoYXIgYyA9IGNoYXJBdChpKTsKKworICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoYykpCisgICAgICB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzdGFydCsrOworICAgIH0KKworICAgIGRvdWJsZSBzaWduID0gMS4wOworCisgICAgaWYgKHN0YXJ0IDwgZW5kICYmIGNoYXJBdChzdGFydCkgPT0gJy0nKQorICAgIHsKKyAgICAgIHNpZ24gPSAtMS4wOworCisgICAgICBzdGFydCsrOworICAgIH0KKworICAgIGludCBkaWdpdHNGb3VuZCA9IDA7CisKKyAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgIC8vIHBhcnNlIHRoZSBzdHJpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0IGNvbnZlcnRpbmcgdGhlIGludGVnZXIgcGFydAorICAgIHsKKyAgICAgIGNoYXIgYyA9IGNoYXJBdChpKTsKKworICAgICAgaWYgKGMgIT0gJy4nKQorICAgICAgeworICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKGMpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChjKSkKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAqIDEwLjAgKyAoYyAtIDB4MzApOworCisgICAgICAgICAgZGlnaXRzRm91bmQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gRG91YmxlLk5hTjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwdW5jdFBvcyA9IGk7CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNoYXJBdChwdW5jdFBvcykgPT0gJy4nKSAgLy8gcGFyc2UgdGhlIHN0cmluZyBmcm9tIHRoZSBlbmQgdG8gdGhlICcuJyBjb252ZXJ0aW5nIHRoZSBmcmFjdGlvbmFsIHBhcnQKKyAgICB7CisgICAgICBkb3VibGUgZnJhY3RQYXJ0ID0gMC4wOworCisgICAgICBmb3IgKGludCBpID0gZW5kIC0gMTsgaSA+IHB1bmN0UG9zOyBpLS0pCisgICAgICB7CisgICAgICAgIGNoYXIgYyA9IGNoYXJBdChpKTsKKworICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKGMpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChjKSkKKyAgICAgICAgeworICAgICAgICAgIGZyYWN0UGFydCA9IGZyYWN0UGFydCAvIDEwLjAgKyAoYyAtIDB4MzApOworCisgICAgICAgICAgZGlnaXRzRm91bmQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gRG91YmxlLk5hTjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXN1bHQgKz0gZnJhY3RQYXJ0IC8gMTAuMDsKKyAgICB9CisKKyAgICBpZiAoMCA9PSBkaWdpdHNGb3VuZCkKKyAgICAgIHJldHVybiBEb3VibGUuTmFOOworCisgICAgcmV0dXJuIHJlc3VsdCAqIHNpZ247CiAgIH0KIAogICAvKioKQEAgLTE4OCw2ICsyNTcsMTYgQEAKICAgICoKICAgICogQHJldHVybiBUaGUgc3RyaW5nIHRoaXMgd3JhcHMgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBudWxsCiAgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIHhzdHIoKQorICB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgc3RyaW5nLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgdGhpcyB3cmFwcyBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIG51bGwKKyAgICovCiAgIHB1YmxpYyBTdHJpbmcgc3RyKCkKICAgewogICAgIHJldHVybiAobnVsbCAhPSBtX29iaikgPyAoKFN0cmluZykgbV9vYmopIDogIiI7CkBAIC0xOTYsMjEgKzI3NSwxMTEgQEAKICAgLyoqCiAgICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHJlc3VsdCB0cmVlIGZyYWdtZW50LgogICAgKgotICAgKiBAcGFyYW0gc3VwcG9ydCBYcGF0aCBjb250ZXh0IHRvIHVzZSBmb3IgdGhlIGNvbnZlcnNpb24gCisgICAqIEBwYXJhbSBzdXBwb3J0IFhwYXRoIGNvbnRleHQgdG8gdXNlIGZvciB0aGUgY29udmVyc2lvbgogICAgKgogICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQgZnJhZ21lbnQgd2l0aCB0aGlzIHN0cmluZyBhcyBhIGNoaWxkIG5vZGUKICAgICovCi0gIHB1YmxpYyBEb2N1bWVudEZyYWdtZW50IHJ0cmVlKFhQYXRoQ29udGV4dCBzdXBwb3J0KQorICBwdWJsaWMgaW50IHJ0cmVlKFhQYXRoQ29udGV4dCBzdXBwb3J0KQogICB7CiAKLSAgICBEb2N1bWVudEZyYWdtZW50IGRmID0KLSAgICAgIHN1cHBvcnQuZ2V0RE9NSGVscGVyKCkuZ2V0RE9NRmFjdG9yeSgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKLSAgICBUZXh0IHRleHROb2RlID0KLSAgICAgIHN1cHBvcnQuZ2V0RE9NSGVscGVyKCkuZ2V0RE9NRmFjdG9yeSgpLmNyZWF0ZVRleHROb2RlKHN0cigpKTsKKyAgICBEVE0gZnJhZyA9IHN1cHBvcnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogCi0gICAgZGYuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOworICAgIGZyYWcuYXBwZW5kVGV4dENoaWxkKHN0cigpKTsKIAotICAgIHJldHVybiBkZjsKKyAgICByZXR1cm4gZnJhZy5nZXREb2N1bWVudCgpOworICB9CisKKyAgLyoqCisgICAqIERpcmVjdGx5IGNhbGwgdGhlCisgICAqIGNoYXJhY3RlcnMgbWV0aG9kIG9uIHRoZSBwYXNzZWQgQ29udGVudEhhbmRsZXIgZm9yIHRoZQorICAgKiBzdHJpbmctdmFsdWUuIE11bHRpcGxlIGNhbGxzIHRvIHRoZQorICAgKiBDb250ZW50SGFuZGxlcidzIGNoYXJhY3RlcnMgbWV0aG9kcyBtYXkgd2VsbCBvY2N1ciBmb3IgYSBzaW5nbGUgY2FsbCB0bworICAgKiB0aGlzIG1ldGhvZC4KKyAgICoKKyAgICogQHBhcmFtIGNoIEEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgQ29udGVudEhhbmRsZXIuCisgICAqCisgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBkaXNwYXRjaENoYXJhY3RlcnNFdmVudHMob3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgY2gpCisgICAgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisKKyAgICBTdHJpbmcgc3RyID0gc3RyKCk7CisKKyAgICBjaC5jaGFyYWN0ZXJzKHN0ci50b0NoYXJBcnJheSgpLCAwLCBzdHIubGVuZ3RoKCkpOworICB9CisKKyAgLyoqCisgICAqIERpcmVjdGx5IGNhbGwgdGhlCisgICAqIGNvbW1lbnQgbWV0aG9kIG9uIHRoZSBwYXNzZWQgTGV4aWNhbEhhbmRsZXIgZm9yIHRoZQorICAgKiBzdHJpbmctdmFsdWUuCisgICAqCisgICAqIEBwYXJhbSBsaCBBIG5vbi1udWxsIHJlZmVyZW5jZSB0byBhIExleGljYWxIYW5kbGVyLgorICAgKgorICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIHZvaWQgZGlzcGF0Y2hBc0NvbW1lbnQob3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyIGxoKQorICAgICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworCisgICAgU3RyaW5nIHN0ciA9IHN0cigpOworCisgICAgbGguY29tbWVudChzdHIudG9DaGFyQXJyYXkoKSwgMCwgc3RyLmxlbmd0aCgpKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBzdHJpbmcuCisgICAqCisgICAqIEByZXR1cm4gIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgcmVwcmVzZW50ZWQgYnkgdGhpcworICAgKiAgICAgICAgICBvYmplY3QuCisgICAqLworICBwdWJsaWMgaW50IGxlbmd0aCgpCisgIHsKKyAgICByZXR1cm4gc3RyKCkubGVuZ3RoKCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguIEFuIGluZGV4IHJhbmdlcworICAgKiBmcm9tIDxjb2RlPjA8L2NvZGU+IHRvIDxjb2RlPmxlbmd0aCgpIC0gMTwvY29kZT4uIFRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICogb2YgdGhlIHNlcXVlbmNlIGlzIGF0IGluZGV4IDxjb2RlPjA8L2NvZGU+LCB0aGUgbmV4dCBhdCBpbmRleAorICAgKiA8Y29kZT4xPC9jb2RlPiwgYW5kIHNvIG9uLCBhcyBmb3IgYXJyYXkgaW5kZXhpbmcuCisgICAqCisgICAqIEBwYXJhbSAgICAgIGluZGV4ICAgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIuCisgICAqIEByZXR1cm4gICAgIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGlzIHN0cmluZy4KKyAgICogICAgICAgICAgICAgVGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhdCBpbmRleCA8Y29kZT4wPC9jb2RlPi4KKyAgICogQGV4Y2VwdGlvbiAgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAgaWYgdGhlIDxjb2RlPmluZGV4PC9jb2RlPgorICAgKiAgICAgICAgICAgICBhcmd1bWVudCBpcyBuZWdhdGl2ZSBvciBub3QgbGVzcyB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcworICAgKiAgICAgICAgICAgICBzdHJpbmcuCisgICAqLworICBwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KQorICB7CisgICAgcmV0dXJuIHN0cigpLmNoYXJBdChpbmRleCk7CisgIH0KKworICAvKioKKyAgICogQ29waWVzIGNoYXJhY3RlcnMgZnJvbSB0aGlzIHN0cmluZyBpbnRvIHRoZSBkZXN0aW5hdGlvbiBjaGFyYWN0ZXIKKyAgICogYXJyYXkuCisgICAqCisgICAqIEBwYXJhbSAgICAgIHNyY0JlZ2luICAgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gY29weS4KKyAgICogQHBhcmFtICAgICAgc3JjRW5kICAgICBpbmRleCBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZworICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNvcHkuCisgICAqIEBwYXJhbSAgICAgIGRzdCAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGFycmF5LgorICAgKiBAcGFyYW0gICAgICBkc3RCZWdpbiAgIHRoZSBzdGFydCBvZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIGFycmF5LgorICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcKKyAgICogICAgICAgICAgICBpcyB0cnVlOgorICAgKiAgICAgICAgICAgIDx1bD48bGk+PGNvZGU+c3JjQmVnaW48L2NvZGU+IGlzIG5lZ2F0aXZlLgorICAgKiAgICAgICAgICAgIDxsaT48Y29kZT5zcmNCZWdpbjwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIDxjb2RlPnNyY0VuZDwvY29kZT4KKyAgICogICAgICAgICAgICA8bGk+PGNvZGU+c3JjRW5kPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzCisgICAqICAgICAgICAgICAgICAgIHN0cmluZworICAgKiAgICAgICAgICAgIDxsaT48Y29kZT5kc3RCZWdpbjwvY29kZT4gaXMgbmVnYXRpdmUKKyAgICogICAgICAgICAgICA8bGk+PGNvZGU+ZHN0QmVnaW4rKHNyY0VuZC1zcmNCZWdpbik8L2NvZGU+IGlzIGxhcmdlciB0aGFuCisgICAqICAgICAgICAgICAgICAgIDxjb2RlPmRzdC5sZW5ndGg8L2NvZGU+PC91bD4KKyAgICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5kc3Q8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisgICAqLworICBwdWJsaWMgdm9pZCBnZXRDaGFycyhpbnQgc3JjQmVnaW4sIGludCBzcmNFbmQsIGNoYXIgZHN0W10sIGludCBkc3RCZWdpbikKKyAgeworICAgIHN0cigpLmdldENoYXJzKHNyY0JlZ2luLCBzcmNFbmQsIGRzdCwgZHN0QmVnaW4pOwogICB9CiAKICAgLyoqCkBAIC0yMjIsNyArMzkxLDcgQEAKICAgICoKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE9iamVjdCBvYmoyKSB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE9iamVjdCBvYmoyKQogICB7CiAKICAgICAvLyBJbiBvcmRlciB0byBoYW5kbGUgdGhlICdhbGwnIHNlbWFudGljcyBvZiAKQEAgLTIzMyw0ICs0MDIsNzcwIEBACiAKICAgICByZXR1cm4gc3RyKCkuZXF1YWxzKG9iajIuc3RyKCkpOwogICB9CisKKyAgLyoqCisgICAqIENvbXBhcmVzIHRoaXMgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAgKiBUaGUgcmVzdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBub3QKKyAgICogPGNvZGU+bnVsbDwvY29kZT4gYW5kIGlzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgdGhhdCByZXByZXNlbnRzCisgICAqIHRoZSBzYW1lIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYXMgdGhpcyBvYmplY3QuCisgICAqCisgICAqIEBwYXJhbSAgIGFuT2JqZWN0ICAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPgorICAgKiAgICAgICAgICAgICAgICAgICAgIGFnYWluc3QuCisgICAqCisgICAqIE5FRURTRE9DIEBwYXJhbSBvYmoyCisgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5TdHJpbmcgPC9jb2RlPmFyZSBlcXVhbDsKKyAgICogICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICogQHNlZSAgICAgamF2YS5sYW5nLlN0cmluZyNjb21wYXJlVG8oamF2YS5sYW5nLlN0cmluZykKKyAgICogQHNlZSAgICAgamF2YS5sYW5nLlN0cmluZyNlcXVhbHNJZ25vcmVDYXNlKGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWE1MU3RyaW5nIG9iajIpCisgIHsKKworICAgIGlmICghb2JqMi5oYXNTdHJpbmcoKSkKKyAgICAgIHJldHVybiBvYmoyLmVxdWFscyh0aGlzKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gc3RyKCkuZXF1YWxzKG9iajIudG9TdHJpbmcoKSk7CisgIH0KKworICAvKioKKyAgICogQ29tcGFyZXMgdGhpcyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAqIFRoZSByZXN1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdAorICAgKiA8Y29kZT5udWxsPC9jb2RlPiBhbmQgaXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCB0aGF0IHJlcHJlc2VudHMKKyAgICogdGhlIHNhbWUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBhcyB0aGlzIG9iamVjdC4KKyAgICoKKyAgICogQHBhcmFtICAgYW5PYmplY3QgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+CisgICAqICAgICAgICAgICAgICAgICAgICAgYWdhaW5zdC4KKyAgICoKKyAgICogTkVFRFNET0MgQHBhcmFtIG9iajIKKyAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPlN0cmluZyA8L2NvZGU+YXJlIGVxdWFsOworICAgKiAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgKiBAc2VlICAgICBqYXZhLmxhbmcuU3RyaW5nI2NvbXBhcmVUbyhqYXZhLmxhbmcuU3RyaW5nKQorICAgKiBAc2VlICAgICBqYXZhLmxhbmcuU3RyaW5nI2VxdWFsc0lnbm9yZUNhc2UoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqMikKKyAgeworCisgICAgaWYgKG51bGwgPT0gb2JqMikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gSW4gb3JkZXIgdG8gaGFuZGxlIHRoZSAnYWxsJyBzZW1hbnRpY3Mgb2YgCisgICAgICAvLyBub2Rlc2V0IGNvbXBhcmlzb25zLCB3ZSBhbHdheXMgY2FsbCB0aGUgCisgICAgICAvLyBub2Rlc2V0IGZ1bmN0aW9uLgorICAgIGVsc2UgaWYgKG9iajIgaW5zdGFuY2VvZiBYTm9kZVNldCkKKyAgICAgIHJldHVybiBvYmoyLmVxdWFscyh0aGlzKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gc3RyKCkuZXF1YWxzKG9iajIudG9TdHJpbmcoKSk7CisgIH0KKworICAvKioKKyAgICogQ29tcGFyZXMgdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGFub3RoZXIgPGNvZGU+U3RyaW5nPC9jb2RlPiwKKyAgICogaWdub3JpbmcgY2FzZSBjb25zaWRlcmF0aW9ucy4gIFR3byBzdHJpbmdzIGFyZSBjb25zaWRlcmVkIGVxdWFsCisgICAqIGlnbm9yaW5nIGNhc2UgaWYgdGhleSBhcmUgb2YgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgY29ycmVzcG9uZGluZworICAgKiBjaGFyYWN0ZXJzIGluIHRoZSB0d28gc3RyaW5ncyBhcmUgZXF1YWwgaWdub3JpbmcgY2FzZS4KKyAgICoKKyAgICogQHBhcmFtICAgYW5vdGhlclN0cmluZyAgIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGNvbXBhcmUgdGhpcworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPiBhZ2FpbnN0LgorICAgKiBAcmV0dXJuICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJndW1lbnQgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+CisgICAqICAgICAgICAgIGFuZCB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPnMgYXJlIGVxdWFsLAorICAgKiAgICAgICAgICBpZ25vcmluZyBjYXNlOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgKiBAc2VlICAgICAjZXF1YWxzKE9iamVjdCkKKyAgICogQHNlZSAgICAgamF2YS5sYW5nLkNoYXJhY3RlciN0b0xvd2VyQ2FzZShjaGFyKQorICAgKiBAc2VlIGphdmEubGFuZy5DaGFyYWN0ZXIjdG9VcHBlckNhc2UoY2hhcikKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGVxdWFsc0lnbm9yZUNhc2UoU3RyaW5nIGFub3RoZXJTdHJpbmcpCisgIHsKKyAgICByZXR1cm4gc3RyKCkuZXF1YWxzSWdub3JlQ2FzZShhbm90aGVyU3RyaW5nKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wYXJlcyB0d28gc3RyaW5ncyBsZXhpY29ncmFwaGljYWxseS4KKyAgICoKKyAgICogQHBhcmFtICAgYW5vdGhlclN0cmluZyAgIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGJlIGNvbXBhcmVkLgorICAgKgorICAgKiBORUVEU0RPQyBAcGFyYW0geHN0cgorICAgKiBAcmV0dXJuICB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdGhlIGFyZ3VtZW50IHN0cmluZyBpcyBlcXVhbCB0bworICAgKiAgICAgICAgICB0aGlzIHN0cmluZzsgYSB2YWx1ZSBsZXNzIHRoYW4gPGNvZGU+MDwvY29kZT4gaWYgdGhpcyBzdHJpbmcKKyAgICogICAgICAgICAgaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIHRoZSBzdHJpbmcgYXJndW1lbnQ7IGFuZCBhCisgICAqICAgICAgICAgIHZhbHVlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiB0aGlzIHN0cmluZyBpcworICAgKiAgICAgICAgICBsZXhpY29ncmFwaGljYWxseSBncmVhdGVyIHRoYW4gdGhlIHN0cmluZyBhcmd1bWVudC4KKyAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+YW5vdGhlclN0cmluZzwvY29kZT4KKyAgICogICAgICAgICAgaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAqLworICBwdWJsaWMgaW50IGNvbXBhcmVUbyhYTUxTdHJpbmcgeHN0cikKKyAgeworCisgICAgaW50IGxlbjEgPSB0aGlzLmxlbmd0aCgpOworICAgIGludCBsZW4yID0geHN0ci5sZW5ndGgoKTsKKyAgICBpbnQgbiA9IE1hdGgubWluKGxlbjEsIGxlbjIpOworICAgIGludCBpID0gMDsKKyAgICBpbnQgaiA9IDA7CisKKyAgICB3aGlsZSAobi0tICE9IDApCisgICAgeworICAgICAgY2hhciBjMSA9IHRoaXMuY2hhckF0KGkpOworICAgICAgY2hhciBjMiA9IHhzdHIuY2hhckF0KGopOworCisgICAgICBpZiAoYzEgIT0gYzIpCisgICAgICB7CisgICAgICAgIHJldHVybiBjMSAtIGMyOworICAgICAgfQorCisgICAgICBpKys7CisgICAgICBqKys7CisgICAgfQorCisgICAgcmV0dXJuIGxlbjEgLSBsZW4yOworICB9CisKKyAgLyoqCisgICAqIENvbXBhcmVzIHR3byBzdHJpbmdzIGxleGljb2dyYXBoaWNhbGx5LCBpZ25vcmluZyBjYXNlIGNvbnNpZGVyYXRpb25zLgorICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGludGVnZXIgd2hvc2Ugc2lnbiBpcyB0aGF0IG9mCisgICAqIDxjb2RlPnRoaXMudG9VcHBlckNhc2UoKS50b0xvd2VyQ2FzZSgpLmNvbXBhcmVUbygKKyAgICogc3RyLnRvVXBwZXJDYXNlKCkudG9Mb3dlckNhc2UoKSk8L2NvZGU+LgorICAgKiA8cD4KKyAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgPGVtPm5vdDwvZW0+IHRha2UgbG9jYWxlIGludG8gYWNjb3VudCwKKyAgICogYW5kIHdpbGwgcmVzdWx0IGluIGFuIHVuc2F0aXNmYWN0b3J5IG9yZGVyaW5nIGZvciBjZXJ0YWluIGxvY2FsZXMuCisgICAqIFRoZSBqYXZhLnRleHQgcGFja2FnZSBwcm92aWRlcyA8ZW0+Y29sbGF0b3JzPC9lbT4gdG8gYWxsb3cKKyAgICogbG9jYWxlLXNlbnNpdGl2ZSBvcmRlcmluZy4KKyAgICoKKyAgICogQHBhcmFtICAgc3RyICAgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYmUgY29tcGFyZWQuCisgICAqIEByZXR1cm4gIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZQorICAgKiAgICAgICAgICB0aGUgc3BlY2lmaWVkIFN0cmluZyBpcyBncmVhdGVyIHRoYW4sIGVxdWFsIHRvLCBvciBsZXNzCisgICAqICAgICAgICAgIHRoYW4gdGhpcyBTdHJpbmcsIGlnbm9yaW5nIGNhc2UgY29uc2lkZXJhdGlvbnMuCisgICAqIEBzZWUgICAgIGphdmEudGV4dC5Db2xsYXRvciNjb21wYXJlKFN0cmluZywgU3RyaW5nKQorICAgKiBAc2luY2UgICAxLjIKKyAgICovCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvSWdub3JlQ2FzZShYTUxTdHJpbmcgc3RyKQorICB7CisgICAgcmV0dXJuIHN0cigpLmNvbXBhcmVUb0lnbm9yZUNhc2Uoc3RyLnRvU3RyaW5nKCkpOworICB9CisKKyAgLyoqCisgICAqIFRlc3RzIGlmIHRoaXMgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4IGJlZ2lubmluZworICAgKiBhIHNwZWNpZmllZCBpbmRleC4KKyAgICoKKyAgICogQHBhcmFtICAgcHJlZml4ICAgIHRoZSBwcmVmaXguCisgICAqIEBwYXJhbSAgIHRvZmZzZXQgICB3aGVyZSB0byBiZWdpbiBsb29raW5nIGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAqICAgICAgICAgIGFyZ3VtZW50IGlzIGEgcHJlZml4IG9mIHRoZSBzdWJzdHJpbmcgb2YgdGhpcyBvYmplY3Qgc3RhcnRpbmcKKyAgICogICAgICAgICAgYXQgaW5kZXggPGNvZGU+dG9mZnNldDwvY29kZT47IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAqICAgICAgICAgIFRoZSByZXN1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIDxjb2RlPnRvZmZzZXQ8L2NvZGU+IGlzCisgICAqICAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMKKyAgICogICAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3Q7IG90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lCisgICAqICAgICAgICAgIGFzIHRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24KKyAgICogICAgICAgICAgPHByZT4KKyAgICogICAgICAgICAgdGhpcy5zdWJTdHJpbmcodG9mZnNldCkuc3RhcnRzV2l0aChwcmVmaXgpCisgICAqICAgICAgICAgIDwvcHJlPgorICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5wcmVmaXg8L2NvZGU+IGlzCisgICAqICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gc3RhcnRzV2l0aChTdHJpbmcgcHJlZml4LCBpbnQgdG9mZnNldCkKKyAgeworICAgIHJldHVybiBzdHIoKS5zdGFydHNXaXRoKHByZWZpeCwgdG9mZnNldCk7CisgIH0KKworICAvKioKKyAgICogVGVzdHMgaWYgdGhpcyBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguCisgICAqCisgICAqIEBwYXJhbSAgIHByZWZpeCAgIHRoZSBwcmVmaXguCisgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAqICAgICAgICAgIGFyZ3VtZW50IGlzIGEgcHJlZml4IG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkKKyAgICogICAgICAgICAgdGhpcyBzdHJpbmc7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAqICAgICAgICAgIE5vdGUgYWxzbyB0aGF0IDxjb2RlPnRydWU8L2NvZGU+IHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlCisgICAqICAgICAgICAgIGFyZ3VtZW50IGlzIGFuIGVtcHR5IHN0cmluZyBvciBpcyBlcXVhbCB0byB0aGlzCisgICAqICAgICAgICAgIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IGFzIGRldGVybWluZWQgYnkgdGhlCisgICAqICAgICAgICAgIHtAbGluayAjZXF1YWxzKE9iamVjdCl9IG1ldGhvZC4KKyAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+cHJlZml4PC9jb2RlPiBpcworICAgKiAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoU3RyaW5nIHByZWZpeCkKKyAgeworICAgIHJldHVybiBzdGFydHNXaXRoKHByZWZpeCwgMCk7CisgIH0KKworICAvKioKKyAgICogVGVzdHMgaWYgdGhpcyBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXggYmVnaW5uaW5nCisgICAqIGEgc3BlY2lmaWVkIGluZGV4LgorICAgKgorICAgKiBAcGFyYW0gICBwcmVmaXggICAgdGhlIHByZWZpeC4KKyAgICogQHBhcmFtICAgdG9mZnNldCAgIHdoZXJlIHRvIGJlZ2luIGxvb2tpbmcgaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGUKKyAgICogICAgICAgICAgYXJndW1lbnQgaXMgYSBwcmVmaXggb2YgdGhlIHN1YnN0cmluZyBvZiB0aGlzIG9iamVjdCBzdGFydGluZworICAgKiAgICAgICAgICBhdCBpbmRleCA8Y29kZT50b2Zmc2V0PC9jb2RlPjsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICogICAgICAgICAgVGhlIHJlc3VsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgPGNvZGU+dG9mZnNldDwvY29kZT4gaXMKKyAgICogICAgICAgICAgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcworICAgKiAgICAgICAgICA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdDsgb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUKKyAgICogICAgICAgICAgYXMgdGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbgorICAgKiAgICAgICAgICA8cHJlPgorICAgKiAgICAgICAgICB0aGlzLnN1YlN0cmluZyh0b2Zmc2V0KS5zdGFydHNXaXRoKHByZWZpeCkKKyAgICogICAgICAgICAgPC9wcmU+CisgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnByZWZpeDwvY29kZT4gaXMKKyAgICogICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKFhNTFN0cmluZyBwcmVmaXgsIGludCB0b2Zmc2V0KQorICB7CisKKyAgICBpbnQgdG8gPSB0b2Zmc2V0OworICAgIGludCB0bGltID0gdGhpcy5sZW5ndGgoKTsKKyAgICBpbnQgcG8gPSAwOworICAgIGludCBwYyA9IHByZWZpeC5sZW5ndGgoKTsKKworICAgIC8vIE5vdGU6IHRvZmZzZXQgbWlnaHQgYmUgbmVhciAtMT4+PjEuCisgICAgaWYgKCh0b2Zmc2V0IDwgMCkgfHwgKHRvZmZzZXQgPiB0bGltIC0gcGMpKQorICAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAoLS1wYyA+PSAwKQorICAgIHsKKyAgICAgIGlmICh0aGlzLmNoYXJBdCh0bykgIT0gcHJlZml4LmNoYXJBdChwbykpCisgICAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgdG8rKzsKKyAgICAgIHBvKys7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGVzdHMgaWYgdGhpcyBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguCisgICAqCisgICAqIEBwYXJhbSAgIHByZWZpeCAgIHRoZSBwcmVmaXguCisgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAqICAgICAgICAgIGFyZ3VtZW50IGlzIGEgcHJlZml4IG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkKKyAgICogICAgICAgICAgdGhpcyBzdHJpbmc7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAqICAgICAgICAgIE5vdGUgYWxzbyB0aGF0IDxjb2RlPnRydWU8L2NvZGU+IHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlCisgICAqICAgICAgICAgIGFyZ3VtZW50IGlzIGFuIGVtcHR5IHN0cmluZyBvciBpcyBlcXVhbCB0byB0aGlzCisgICAqICAgICAgICAgIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IGFzIGRldGVybWluZWQgYnkgdGhlCisgICAqICAgICAgICAgIHtAbGluayAjZXF1YWxzKE9iamVjdCl9IG1ldGhvZC4KKyAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+cHJlZml4PC9jb2RlPiBpcworICAgKiAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoWE1MU3RyaW5nIHByZWZpeCkKKyAgeworICAgIHJldHVybiBzdGFydHNXaXRoKHByZWZpeCwgMCk7CisgIH0KKworICAvKioKKyAgICogVGVzdHMgaWYgdGhpcyBzdHJpbmcgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LgorICAgKgorICAgKiBAcGFyYW0gICBzdWZmaXggICB0aGUgc3VmZml4LgorICAgKiBAcmV0dXJuICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgKiAgICAgICAgICBhcmd1bWVudCBpcyBhIHN1ZmZpeCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5CisgICAqICAgICAgICAgIHRoaXMgb2JqZWN0OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLiBOb3RlIHRoYXQgdGhlCisgICAqICAgICAgICAgIHJlc3VsdCB3aWxsIGJlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcmd1bWVudCBpcyB0aGUKKyAgICogICAgICAgICAgZW1wdHkgc3RyaW5nIG9yIGlzIGVxdWFsIHRvIHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QKKyAgICogICAgICAgICAgYXMgZGV0ZXJtaW5lZCBieSB0aGUge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0gbWV0aG9kLgorICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5zdWZmaXg8L2NvZGU+IGlzCisgICAqICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZW5kc1dpdGgoU3RyaW5nIHN1ZmZpeCkKKyAgeworICAgIHJldHVybiBzdHIoKS5lbmRzV2l0aChzdWZmaXgpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBoYXNoY29kZSBmb3IgdGhpcyBzdHJpbmcuIFRoZSBoYXNoY29kZSBmb3IgYQorICAgKiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCBpcyBjb21wdXRlZCBhcworICAgKiA8YmxvY2txdW90ZT48cHJlPgorICAgKiBzWzBdKjMxXihuLTEpICsgc1sxXSozMV4obi0yKSArIC4uLiArIHNbbi0xXQorICAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+CisgICAqIHVzaW5nIDxjb2RlPmludDwvY29kZT4gYXJpdGhtZXRpYywgd2hlcmUgPGNvZGU+c1tpXTwvY29kZT4gaXMgdGhlCisgICAqIDxpPmk8L2k+dGggY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcsIDxjb2RlPm48L2NvZGU+IGlzIHRoZSBsZW5ndGggb2YKKyAgICogdGhlIHN0cmluZywgYW5kIDxjb2RlPl48L2NvZGU+IGluZGljYXRlcyBleHBvbmVudGlhdGlvbi4KKyAgICogKFRoZSBoYXNoIHZhbHVlIG9mIHRoZSBlbXB0eSBzdHJpbmcgaXMgemVyby4pCisgICAqCisgICAqIEByZXR1cm4gIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG9iamVjdC4KKyAgICovCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICB7CisgICAgcmV0dXJuIHN0cigpLmhhc2hDb2RlKCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5kZXggd2l0aGluIHRoaXMgc3RyaW5nIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQorICAgKiBzcGVjaWZpZWQgY2hhcmFjdGVyLiBJZiBhIGNoYXJhY3RlciB3aXRoIHZhbHVlIDxjb2RlPmNoPC9jb2RlPiBvY2N1cnMKKyAgICogaW4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4KKyAgICogb2JqZWN0LCB0aGVuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc3VjaCBvY2N1cnJlbmNlIGlzIHJldHVybmVkIC0tCisgICAqIHRoYXQgaXMsIHRoZSBzbWFsbGVzdCB2YWx1ZSA8aT5rPC9pPiBzdWNoIHRoYXQ6CisgICAqIDxibG9ja3F1b3RlPjxwcmU+CisgICAqIHRoaXMuY2hhckF0KDxpPms8L2k+KSA9PSBjaAorICAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+CisgICAqIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiBubyBzdWNoIGNoYXJhY3RlciBvY2N1cnMgaW4gdGhpcyBzdHJpbmcsCisgICAqIHRoZW4gPGNvZGU+LTE8L2NvZGU+IGlzIHJldHVybmVkLgorICAgKgorICAgKiBAcGFyYW0gICBjaCAgIGEgY2hhcmFjdGVyLgorICAgKiBAcmV0dXJuICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIGNoYXJhY3RlciBpbiB0aGUKKyAgICogICAgICAgICAgY2hhcmFjdGVyIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0LCBvcgorICAgKiAgICAgICAgICA8Y29kZT4tMTwvY29kZT4gaWYgdGhlIGNoYXJhY3RlciBkb2VzIG5vdCBvY2N1ci4KKyAgICovCisgIHB1YmxpYyBpbnQgaW5kZXhPZihpbnQgY2gpCisgIHsKKyAgICByZXR1cm4gc3RyKCkuaW5kZXhPZihjaCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5kZXggd2l0aGluIHRoaXMgc3RyaW5nIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQorICAgKiBzcGVjaWZpZWQgY2hhcmFjdGVyLCBzdGFydGluZyB0aGUgc2VhcmNoIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAqIDxwPgorICAgKiBJZiBhIGNoYXJhY3RlciB3aXRoIHZhbHVlIDxjb2RlPmNoPC9jb2RlPiBvY2N1cnMgaW4gdGhlIGNoYXJhY3RlcgorICAgKiBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IGF0IGFuIGluZGV4CisgICAqIG5vIHNtYWxsZXIgdGhhbiA8Y29kZT5mcm9tSW5kZXg8L2NvZGU+LCB0aGVuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QKKyAgICogc3VjaCBvY2N1cnJlbmNlIGlzIHJldHVybmVkLS10aGF0IGlzLCB0aGUgc21hbGxlc3QgdmFsdWUgPGk+azwvaT4KKyAgICogc3VjaCB0aGF0OgorICAgKiA8YmxvY2txdW90ZT48cHJlPgorICAgKiAodGhpcy5jaGFyQXQoPGk+azwvaT4pID09IGNoKSAmJiAoPGk+azwvaT4gPj0gZnJvbUluZGV4KQorICAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+CisgICAqIGlzIHRydWUuIElmIG5vIHN1Y2ggY2hhcmFjdGVyIG9jY3VycyBpbiB0aGlzIHN0cmluZyBhdCBvciBhZnRlcgorICAgKiBwb3NpdGlvbiA8Y29kZT5mcm9tSW5kZXg8L2NvZGU+LCB0aGVuIDxjb2RlPi0xPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICogPHA+CisgICAqIFRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uIHRoZSB2YWx1ZSBvZiA8Y29kZT5mcm9tSW5kZXg8L2NvZGU+LiBJZiBpdAorICAgKiBpcyBuZWdhdGl2ZSwgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBpZiBpdCB3ZXJlIHplcm86IHRoaXMgZW50aXJlCisgICAqIHN0cmluZyBtYXkgYmUgc2VhcmNoZWQuIElmIGl0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMKKyAgICogc3RyaW5nLCBpdCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGlmIGl0IHdlcmUgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZgorICAgKiB0aGlzIHN0cmluZzogPGNvZGU+LTE8L2NvZGU+IGlzIHJldHVybmVkLgorICAgKgorICAgKiBAcGFyYW0gICBjaCAgICAgICAgICBhIGNoYXJhY3Rlci4KKyAgICogQHBhcmFtICAgZnJvbUluZGV4ICAgdGhlIGluZGV4IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4KKyAgICogQHJldHVybiAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIgaW4gdGhlCisgICAqICAgICAgICAgIGNoYXJhY3RlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdCB0aGF0IGlzIGdyZWF0ZXIKKyAgICogICAgICAgICAgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5mcm9tSW5kZXg8L2NvZGU+LCBvciA8Y29kZT4tMTwvY29kZT4KKyAgICogICAgICAgICAgaWYgdGhlIGNoYXJhY3RlciBkb2VzIG5vdCBvY2N1ci4KKyAgICovCisgIHB1YmxpYyBpbnQgaW5kZXhPZihpbnQgY2gsIGludCBmcm9tSW5kZXgpCisgIHsKKyAgICByZXR1cm4gc3RyKCkuaW5kZXhPZihjaCwgZnJvbUluZGV4KTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBpbmRleCB3aXRoaW4gdGhpcyBzdHJpbmcgb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKKyAgICogc3BlY2lmaWVkIGNoYXJhY3Rlci4gVGhhdCBpcywgdGhlIGluZGV4IHJldHVybmVkIGlzIHRoZSBsYXJnZXN0CisgICAqIHZhbHVlIDxpPms8L2k+IHN1Y2ggdGhhdDoKKyAgICogPGJsb2NrcXVvdGU+PHByZT4KKyAgICogdGhpcy5jaGFyQXQoPGk+azwvaT4pID09IGNoCisgICAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICogaXMgdHJ1ZS4KKyAgICogVGhlIFN0cmluZyBpcyBzZWFyY2hlZCBiYWNrd2FyZHMgc3RhcnRpbmcgYXQgdGhlIGxhc3QgY2hhcmFjdGVyLgorICAgKgorICAgKiBAcGFyYW0gICBjaCAgIGEgY2hhcmFjdGVyLgorICAgKiBAcmV0dXJuICB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZQorICAgKiAgICAgICAgICBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QsIG9yCisgICAqICAgICAgICAgIDxjb2RlPi0xPC9jb2RlPiBpZiB0aGUgY2hhcmFjdGVyIGRvZXMgbm90IG9jY3VyLgorICAgKi8KKyAgcHVibGljIGludCBsYXN0SW5kZXhPZihpbnQgY2gpCisgIHsKKyAgICByZXR1cm4gc3RyKCkubGFzdEluZGV4T2YoY2gpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGluZGV4IHdpdGhpbiB0aGlzIHN0cmluZyBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQorICAgKiBzcGVjaWZpZWQgY2hhcmFjdGVyLCBzZWFyY2hpbmcgYmFja3dhcmQgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZAorICAgKiBpbmRleC4gVGhhdCBpcywgdGhlIGluZGV4IHJldHVybmVkIGlzIHRoZSBsYXJnZXN0IHZhbHVlIDxpPms8L2k+CisgICAqIHN1Y2ggdGhhdDoKKyAgICogPGJsb2NrcXVvdGU+PHByZT4KKyAgICogdGhpcy5jaGFyQXQoaykgPT0gY2gpICYmIChrIDw9IGZyb21JbmRleCkKKyAgICogPC9wcmU+PC9ibG9ja3F1b3RlPgorICAgKiBpcyB0cnVlLgorICAgKgorICAgKiBAcGFyYW0gICBjaCAgICAgICAgICBhIGNoYXJhY3Rlci4KKyAgICogQHBhcmFtICAgZnJvbUluZGV4ICAgdGhlIGluZGV4IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gVGhlcmUgaXMgbm8KKyAgICogICAgICAgICAgcmVzdHJpY3Rpb24gb24gdGhlIHZhbHVlIG9mIDxjb2RlPmZyb21JbmRleDwvY29kZT4uIElmIGl0IGlzCisgICAqICAgICAgICAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgc3RyaW5nLCBpdCBoYXMKKyAgICogICAgICAgICAgdGhlIHNhbWUgZWZmZWN0IGFzIGlmIGl0IHdlcmUgZXF1YWwgdG8gb25lIGxlc3MgdGhhbiB0aGUKKyAgICogICAgICAgICAgbGVuZ3RoIG9mIHRoaXMgc3RyaW5nOiB0aGlzIGVudGlyZSBzdHJpbmcgbWF5IGJlIHNlYXJjaGVkLgorICAgKiAgICAgICAgICBJZiBpdCBpcyBuZWdhdGl2ZSwgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBpZiBpdCB3ZXJlIC0xOgorICAgKiAgICAgICAgICAtMSBpcyByZXR1cm5lZC4KKyAgICogQHJldHVybiAgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIGNoYXJhY3RlciBpbiB0aGUKKyAgICogICAgICAgICAgY2hhcmFjdGVyIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0IHRoYXQgaXMgbGVzcworICAgKiAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPmZyb21JbmRleDwvY29kZT4sIG9yIDxjb2RlPi0xPC9jb2RlPgorICAgKiAgICAgICAgICBpZiB0aGUgY2hhcmFjdGVyIGRvZXMgbm90IG9jY3VyIGJlZm9yZSB0aGF0IHBvaW50LgorICAgKi8KKyAgcHVibGljIGludCBsYXN0SW5kZXhPZihpbnQgY2gsIGludCBmcm9tSW5kZXgpCisgIHsKKyAgICByZXR1cm4gc3RyKCkubGFzdEluZGV4T2YoY2gsIGZyb21JbmRleCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5kZXggd2l0aGluIHRoaXMgc3RyaW5nIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQorICAgKiBzcGVjaWZpZWQgc3Vic3RyaW5nLiBUaGUgaW50ZWdlciByZXR1cm5lZCBpcyB0aGUgc21hbGxlc3QgdmFsdWUKKyAgICogPGk+azwvaT4gc3VjaCB0aGF0OgorICAgKiA8YmxvY2txdW90ZT48cHJlPgorICAgKiB0aGlzLnN0YXJ0c1dpdGgoc3RyLCA8aT5rPC9pPikKKyAgICogPC9wcmU+PC9ibG9ja3F1b3RlPgorICAgKiBpcyA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICoKKyAgICogQHBhcmFtICAgc3RyICAgYW55IHN0cmluZy4KKyAgICogQHJldHVybiAgaWYgdGhlIHN0cmluZyBhcmd1bWVudCBvY2N1cnMgYXMgYSBzdWJzdHJpbmcgd2l0aGluIHRoaXMKKyAgICogICAgICAgICAgb2JqZWN0LCB0aGVuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBmaXJzdAorICAgKiAgICAgICAgICBzdWNoIHN1YnN0cmluZyBpcyByZXR1cm5lZDsgaWYgaXQgZG9lcyBub3Qgb2NjdXIgYXMgYQorICAgKiAgICAgICAgICBzdWJzdHJpbmcsIDxjb2RlPi0xPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+c3RyPC9jb2RlPiBpcworICAgKiAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBpbnQgaW5kZXhPZihTdHJpbmcgc3RyKQorICB7CisgICAgcmV0dXJuIHN0cigpLmluZGV4T2Yoc3RyKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBpbmRleCB3aXRoaW4gdGhpcyBzdHJpbmcgb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlCisgICAqIHNwZWNpZmllZCBzdWJzdHJpbmcuIFRoZSBpbnRlZ2VyIHJldHVybmVkIGlzIHRoZSBzbWFsbGVzdCB2YWx1ZQorICAgKiA8aT5rPC9pPiBzdWNoIHRoYXQ6CisgICAqIDxibG9ja3F1b3RlPjxwcmU+CisgICAqIHRoaXMuc3RhcnRzV2l0aChzdHIsIDxpPms8L2k+KQorICAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+CisgICAqIGlzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgKgorICAgKiBAcGFyYW0gICBzdHIgICBhbnkgc3RyaW5nLgorICAgKiBAcmV0dXJuICBpZiB0aGUgc3RyaW5nIGFyZ3VtZW50IG9jY3VycyBhcyBhIHN1YnN0cmluZyB3aXRoaW4gdGhpcworICAgKiAgICAgICAgICBvYmplY3QsIHRoZW4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGZpcnN0CisgICAqICAgICAgICAgIHN1Y2ggc3Vic3RyaW5nIGlzIHJldHVybmVkOyBpZiBpdCBkb2VzIG5vdCBvY2N1ciBhcyBhCisgICAqICAgICAgICAgIHN1YnN0cmluZywgPGNvZGU+LTE8L2NvZGU+IGlzIHJldHVybmVkLgorICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5zdHI8L2NvZGU+IGlzCisgICAqICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIGludCBpbmRleE9mKFhNTFN0cmluZyBzdHIpCisgIHsKKyAgICByZXR1cm4gc3RyKCkuaW5kZXhPZihzdHIudG9TdHJpbmcoKSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5kZXggd2l0aGluIHRoaXMgc3RyaW5nIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQorICAgKiBzcGVjaWZpZWQgc3Vic3RyaW5nLCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiBUaGUgaW50ZWdlcgorICAgKiByZXR1cm5lZCBpcyB0aGUgc21hbGxlc3QgdmFsdWUgPGk+azwvaT4gc3VjaCB0aGF0OgorICAgKiA8YmxvY2txdW90ZT48cHJlPgorICAgKiB0aGlzLnN0YXJ0c1dpdGgoc3RyLCA8aT5rPC9pPikgJiYgKDxpPms8L2k+ID49IGZyb21JbmRleCkKKyAgICogPC9wcmU+PC9ibG9ja3F1b3RlPgorICAgKiBpcyA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICogPHA+CisgICAqIFRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uIHRoZSB2YWx1ZSBvZiA8Y29kZT5mcm9tSW5kZXg8L2NvZGU+LiBJZgorICAgKiBpdCBpcyBuZWdhdGl2ZSwgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBpZiBpdCB3ZXJlIHplcm86IHRoaXMgZW50aXJlCisgICAqIHN0cmluZyBtYXkgYmUgc2VhcmNoZWQuIElmIGl0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMKKyAgICogc3RyaW5nLCBpdCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGlmIGl0IHdlcmUgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZgorICAgKiB0aGlzIHN0cmluZzogPGNvZGU+LTE8L2NvZGU+IGlzIHJldHVybmVkLgorICAgKgorICAgKiBAcGFyYW0gICBzdHIgICAgICAgICB0aGUgc3Vic3RyaW5nIHRvIHNlYXJjaCBmb3IuCisgICAqIEBwYXJhbSAgIGZyb21JbmRleCAgIHRoZSBpbmRleCB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uCisgICAqIEByZXR1cm4gIElmIHRoZSBzdHJpbmcgYXJndW1lbnQgb2NjdXJzIGFzIGEgc3Vic3RyaW5nIHdpdGhpbiB0aGlzCisgICAqICAgICAgICAgIG9iamVjdCBhdCBhIHN0YXJ0aW5nIGluZGV4IG5vIHNtYWxsZXIgdGhhbgorICAgKiAgICAgICAgICA8Y29kZT5mcm9tSW5kZXg8L2NvZGU+LCB0aGVuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICAqICAgICAgICAgIG9mIHRoZSBmaXJzdCBzdWNoIHN1YnN0cmluZyBpcyByZXR1cm5lZC4gSWYgaXQgZG9lcyBub3Qgb2NjdXIKKyAgICogICAgICAgICAgYXMgYSBzdWJzdHJpbmcgc3RhcnRpbmcgYXQgPGNvZGU+ZnJvbUluZGV4PC9jb2RlPiBvciBiZXlvbmQsCisgICAqICAgICAgICAgIDxjb2RlPi0xPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+c3RyPC9jb2RlPiBpcworICAgKiAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgorICAgKi8KKyAgcHVibGljIGludCBpbmRleE9mKFN0cmluZyBzdHIsIGludCBmcm9tSW5kZXgpCisgIHsKKyAgICByZXR1cm4gc3RyKCkuaW5kZXhPZihzdHIsIGZyb21JbmRleCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5kZXggd2l0aGluIHRoaXMgc3RyaW5nIG9mIHRoZSByaWdodG1vc3Qgb2NjdXJyZW5jZQorICAgKiBvZiB0aGUgc3BlY2lmaWVkIHN1YnN0cmluZy4gIFRoZSByaWdodG1vc3QgZW1wdHkgc3RyaW5nICIiIGlzCisgICAqIGNvbnNpZGVyZWQgdG8gb2NjdXIgYXQgdGhlIGluZGV4IHZhbHVlIDxjb2RlPnRoaXMubGVuZ3RoKCk8L2NvZGU+LgorICAgKiBUaGUgcmV0dXJuZWQgaW5kZXggaXMgdGhlIGxhcmdlc3QgdmFsdWUgPGk+azwvaT4gc3VjaCB0aGF0CisgICAqIDxibG9ja3F1b3RlPjxwcmU+CisgICAqIHRoaXMuc3RhcnRzV2l0aChzdHIsIGspCisgICAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICogaXMgdHJ1ZS4KKyAgICoKKyAgICogQHBhcmFtICAgc3RyICAgdGhlIHN1YnN0cmluZyB0byBzZWFyY2ggZm9yLgorICAgKiBAcmV0dXJuICBpZiB0aGUgc3RyaW5nIGFyZ3VtZW50IG9jY3VycyBvbmUgb3IgbW9yZSB0aW1lcyBhcyBhIHN1YnN0cmluZworICAgKiAgICAgICAgICB3aXRoaW4gdGhpcyBvYmplY3QsIHRoZW4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKKyAgICogICAgICAgICAgdGhlIGxhc3Qgc3VjaCBzdWJzdHJpbmcgaXMgcmV0dXJuZWQuIElmIGl0IGRvZXMgbm90IG9jY3VyIGFzCisgICAqICAgICAgICAgIGEgc3Vic3RyaW5nLCA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uICBpZiA8Y29kZT5zdHI8L2NvZGU+IGlzCisgICAqICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIGludCBsYXN0SW5kZXhPZihTdHJpbmcgc3RyKQorICB7CisgICAgcmV0dXJuIHN0cigpLmxhc3RJbmRleE9mKHN0cik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5kZXggd2l0aGluIHRoaXMgc3RyaW5nIG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YKKyAgICogdGhlIHNwZWNpZmllZCBzdWJzdHJpbmcuCisgICAqCisgICAqIEBwYXJhbSAgIHN0ciAgICAgICAgIHRoZSBzdWJzdHJpbmcgdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtICAgZnJvbUluZGV4ICAgdGhlIGluZGV4IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gVGhlcmUgaXMgbm8KKyAgICogICAgICAgICAgcmVzdHJpY3Rpb24gb24gdGhlIHZhbHVlIG9mIGZyb21JbmRleC4gSWYgaXQgaXMgZ3JlYXRlciB0aGFuCisgICAqICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhpcyBzdHJpbmcsIGl0IGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgaWYgaXQKKyAgICogICAgICAgICAgd2VyZSBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgc3RyaW5nOiB0aGlzIGVudGlyZSBzdHJpbmcKKyAgICogICAgICAgICAgbWF5IGJlIHNlYXJjaGVkLiBJZiBpdCBpcyBuZWdhdGl2ZSwgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdAorICAgKiAgICAgICAgICBhcyBpZiBpdCB3ZXJlIC0xOiAtMSBpcyByZXR1cm5lZC4KKyAgICogQHJldHVybiAgSWYgdGhlIHN0cmluZyBhcmd1bWVudCBvY2N1cnMgb25lIG9yIG1vcmUgdGltZXMgYXMgYSBzdWJzdHJpbmcKKyAgICogICAgICAgICAgd2l0aGluIHRoaXMgb2JqZWN0IGF0IGEgc3RhcnRpbmcgaW5kZXggbm8gZ3JlYXRlciB0aGFuCisgICAqICAgICAgICAgIDxjb2RlPmZyb21JbmRleDwvY29kZT4sIHRoZW4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKKyAgICogICAgICAgICAgdGhlIGxhc3Qgc3VjaCBzdWJzdHJpbmcgaXMgcmV0dXJuZWQuIElmIGl0IGRvZXMgbm90IG9jY3VyIGFzIGEKKyAgICogICAgICAgICAgc3Vic3RyaW5nIHN0YXJ0aW5nIGF0IDxjb2RlPmZyb21JbmRleDwvY29kZT4gb3IgZWFybGllciwKKyAgICogICAgICAgICAgPGNvZGU+LTE8L2NvZGU+IGlzIHJldHVybmVkLgorICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5zdHI8L2NvZGU+IGlzCisgICAqICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIGludCBsYXN0SW5kZXhPZihTdHJpbmcgc3RyLCBpbnQgZnJvbUluZGV4KQorICB7CisgICAgcmV0dXJuIHN0cigpLmxhc3RJbmRleE9mKHN0ciwgZnJvbUluZGV4KTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbmV3IHN0cmluZyB0aGF0IGlzIGEgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nLiBUaGUKKyAgICogc3Vic3RyaW5nIGJlZ2lucyB3aXRoIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBhbmQKKyAgICogZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoaXMgc3RyaW5nLiA8cD4KKyAgICogRXhhbXBsZXM6CisgICAqIDxibG9ja3F1b3RlPjxwcmU+CisgICAqICJ1bmhhcHB5Ii5zdWJzdHJpbmcoMikgcmV0dXJucyAiaGFwcHkiCisgICAqICJIYXJiaXNvbiIuc3Vic3RyaW5nKDMpIHJldHVybnMgImJpc29uIgorICAgKiAiZW1wdGluZXNzIi5zdWJzdHJpbmcoOSkgcmV0dXJucyAiIiAoYW4gZW1wdHkgc3RyaW5nKQorICAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+CisgICAqCisgICAqIEBwYXJhbSAgICAgIGJlZ2luSW5kZXggICB0aGUgYmVnaW5uaW5nIGluZGV4LCBpbmNsdXNpdmUuCisgICAqIEByZXR1cm4gICAgIHRoZSBzcGVjaWZpZWQgc3Vic3RyaW5nLgorICAgKiBAZXhjZXB0aW9uICBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uICBpZgorICAgKiAgICAgICAgICAgICA8Y29kZT5iZWdpbkluZGV4PC9jb2RlPiBpcyBuZWdhdGl2ZSBvciBsYXJnZXIgdGhhbiB0aGUKKyAgICogICAgICAgICAgICAgbGVuZ3RoIG9mIHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QuCisgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIHN1YnN0cmluZyhpbnQgYmVnaW5JbmRleCkKKyAgeworICAgIHJldHVybiBuZXcgWFN0cmluZyhzdHIoKS5zdWJzdHJpbmcoYmVnaW5JbmRleCkpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBuZXcgc3RyaW5nIHRoYXQgaXMgYSBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcuIFRoZQorICAgKiBzdWJzdHJpbmcgYmVnaW5zIGF0IHRoZSBzcGVjaWZpZWQgPGNvZGU+YmVnaW5JbmRleDwvY29kZT4gYW5kCisgICAqIGV4dGVuZHMgdG8gdGhlIGNoYXJhY3RlciBhdCBpbmRleCA8Y29kZT5lbmRJbmRleCAtIDE8L2NvZGU+LgorICAgKiBUaHVzIHRoZSBsZW5ndGggb2YgdGhlIHN1YnN0cmluZyBpcyA8Y29kZT5lbmRJbmRleC1iZWdpbkluZGV4PC9jb2RlPi4KKyAgICoKKyAgICogQHBhcmFtICAgICAgYmVnaW5JbmRleCAgIHRoZSBiZWdpbm5pbmcgaW5kZXgsIGluY2x1c2l2ZS4KKyAgICogQHBhcmFtICAgICAgZW5kSW5kZXggICAgIHRoZSBlbmRpbmcgaW5kZXgsIGV4Y2x1c2l2ZS4KKyAgICogQHJldHVybiAgICAgdGhlIHNwZWNpZmllZCBzdWJzdHJpbmcuCisgICAqIEBleGNlcHRpb24gIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gIGlmIHRoZQorICAgKiAgICAgICAgICAgICA8Y29kZT5iZWdpbkluZGV4PC9jb2RlPiBpcyBuZWdhdGl2ZSwgb3IKKyAgICogICAgICAgICAgICAgPGNvZGU+ZW5kSW5kZXg8L2NvZGU+IGlzIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YKKyAgICogICAgICAgICAgICAgdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCwgb3IKKyAgICogICAgICAgICAgICAgPGNvZGU+YmVnaW5JbmRleDwvY29kZT4gaXMgbGFyZ2VyIHRoYW4KKyAgICogICAgICAgICAgICAgPGNvZGU+ZW5kSW5kZXg8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIFhNTFN0cmluZyBzdWJzdHJpbmcoaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCkKKyAgeworICAgIHJldHVybiBuZXcgWFN0cmluZyhzdHIoKS5zdWJzdHJpbmcoYmVnaW5JbmRleCwgZW5kSW5kZXgpKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25jYXRlbmF0ZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIGVuZCBvZiB0aGlzIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtICAgc3RyICAgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdGhhdCBpcyBjb25jYXRlbmF0ZWQgdG8gdGhlIGVuZAorICAgKiAgICAgICAgICAgICAgICBvZiB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4uCisgICAqIEByZXR1cm4gIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGlzIG9iamVjdCdzCisgICAqICAgICAgICAgIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgdGhlIHN0cmluZyBhcmd1bWVudCdzIGNoYXJhY3RlcnMuCisgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnN0cjwvY29kZT4gaXMKKyAgICogICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIGNvbmNhdChTdHJpbmcgc3RyKQorICB7CisKKyAgICAvLyAlUkVWSUVXJSBNYWtlIGFuIEZTQiBoZXJlPworICAgIHJldHVybiBuZXcgWFN0cmluZyhzdHIoKS5jb25jYXQoc3RyKSk7CisgIH0KKworICAvKioKKyAgICogQ29udmVydHMgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBsb3dlcgorICAgKiBjYXNlIHVzaW5nIHRoZSBydWxlcyBvZiB0aGUgZ2l2ZW4gPGNvZGU+TG9jYWxlPC9jb2RlPi4KKyAgICoKKyAgICogQHBhcmFtIGxvY2FsZSB1c2UgdGhlIGNhc2UgdHJhbnNmb3JtYXRpb24gcnVsZXMgZm9yIHRoaXMgbG9jYWxlCisgICAqIEByZXR1cm4gdGhlIFN0cmluZywgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KKyAgICogQHNlZSAgICAgamF2YS5sYW5nLkNoYXJhY3RlciN0b0xvd2VyQ2FzZShjaGFyKQorICAgKiBAc2VlICAgICBqYXZhLmxhbmcuU3RyaW5nI3RvVXBwZXJDYXNlKExvY2FsZSkKKyAgICovCisgIHB1YmxpYyBYTUxTdHJpbmcgdG9Mb3dlckNhc2UoTG9jYWxlIGxvY2FsZSkKKyAgeworICAgIHJldHVybiBuZXcgWFN0cmluZyhzdHIoKS50b0xvd2VyQ2FzZShsb2NhbGUpKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyBhbGwgb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGxvd2VyCisgICAqIGNhc2UgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoZSBkZWZhdWx0IGxvY2FsZSwgd2hpY2ggaXMgcmV0dXJuZWQKKyAgICogYnkgPGNvZGU+TG9jYWxlLmdldERlZmF1bHQ8L2NvZGU+LgorICAgKiA8cD4KKyAgICoKKyAgICogQHJldHVybiAgdGhlIHN0cmluZywgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KKyAgICogQHNlZSAgICAgamF2YS5sYW5nLkNoYXJhY3RlciN0b0xvd2VyQ2FzZShjaGFyKQorICAgKiBAc2VlICAgICBqYXZhLmxhbmcuU3RyaW5nI3RvTG93ZXJDYXNlKExvY2FsZSkKKyAgICovCisgIHB1YmxpYyBYTUxTdHJpbmcgdG9Mb3dlckNhc2UoKQorICB7CisgICAgcmV0dXJuIG5ldyBYU3RyaW5nKHN0cigpLnRvTG93ZXJDYXNlKCkpOworICB9CisKKyAgLyoqCisgICAqIENvbnZlcnRzIGFsbCBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gdXBwZXIKKyAgICogY2FzZSB1c2luZyB0aGUgcnVsZXMgb2YgdGhlIGdpdmVuIGxvY2FsZS4KKyAgICogQHBhcmFtIGxvY2FsZSB1c2UgdGhlIGNhc2UgdHJhbnNmb3JtYXRpb24gcnVsZXMgZm9yIHRoaXMgbG9jYWxlCisgICAqIEByZXR1cm4gdGhlIFN0cmluZywgY29udmVydGVkIHRvIHVwcGVyY2FzZS4KKyAgICogQHNlZSAgICAgamF2YS5sYW5nLkNoYXJhY3RlciN0b1VwcGVyQ2FzZShjaGFyKQorICAgKiBAc2VlICAgICBqYXZhLmxhbmcuU3RyaW5nI3RvTG93ZXJDYXNlKExvY2FsZSkKKyAgICovCisgIHB1YmxpYyBYTUxTdHJpbmcgdG9VcHBlckNhc2UoTG9jYWxlIGxvY2FsZSkKKyAgeworICAgIHJldHVybiBuZXcgWFN0cmluZyhzdHIoKS50b1VwcGVyQ2FzZShsb2NhbGUpKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyBhbGwgb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIHVwcGVyCisgICAqIGNhc2UgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoZSBkZWZhdWx0IGxvY2FsZSwgd2hpY2ggaXMgcmV0dXJuZWQKKyAgICogYnkgPGNvZGU+TG9jYWxlLmdldERlZmF1bHQ8L2NvZGU+LgorICAgKgorICAgKiA8cD4KKyAgICogSWYgbm8gY2hhcmFjdGVyIGluIHRoaXMgc3RyaW5nIGhhcyBhIGRpZmZlcmVudCB1cHBlcmNhc2UgdmVyc2lvbiwKKyAgICogYmFzZWQgb24gY2FsbGluZyB0aGUgPGNvZGU+dG9VcHBlckNhc2U8L2NvZGU+IG1ldGhvZCBkZWZpbmVkIGJ5CisgICAqIDxjb2RlPkNoYXJhY3RlcjwvY29kZT4sIHRoZW4gdGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZC4KKyAgICogPHA+CisgICAqIE90aGVyd2lzZSwgdGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdAorICAgKiByZXByZXNlbnRpbmcgYSBjaGFyYWN0ZXIgc2VxdWVuY2UgaWRlbnRpY2FsIGluIGxlbmd0aCB0byB0aGUKKyAgICogY2hhcmFjdGVyIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgYW5kCisgICAqIHdpdGggZXZlcnkgY2hhcmFjdGVyIGVxdWFsIHRvIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIG1ldGhvZAorICAgKiA8Y29kZT5DaGFyYWN0ZXIudG9VcHBlckNhc2U8L2NvZGU+IHRvIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJhY3RlciBvZgorICAgKiB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0LiA8cD4KKyAgICogRXhhbXBsZXM6CisgICAqIDxibG9ja3F1b3RlPjxwcmU+CisgICAqICJGYWhydmVyZ278Z2VuIi50b1VwcGVyQ2FzZSgpIHJldHVybnMgIkZBSFJWRVJHTtxHRU4iCisgICAqICJWaXNpdCBManViaW5qZSEiLnRvVXBwZXJDYXNlKCkgcmV0dXJucyAiVklTSVQgTEpVQklOSkUhIgorICAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+CisgICAqCisgICAqIEByZXR1cm4gIHRoZSBzdHJpbmcsIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuCisgICAqIEBzZWUgICAgIGphdmEubGFuZy5DaGFyYWN0ZXIjdG9VcHBlckNhc2UoY2hhcikKKyAgICogQHNlZSAgICAgamF2YS5sYW5nLlN0cmluZyN0b1VwcGVyQ2FzZShMb2NhbGUpCisgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIHRvVXBwZXJDYXNlKCkKKyAgeworICAgIHJldHVybiBuZXcgWFN0cmluZyhzdHIoKS50b1VwcGVyQ2FzZSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmVzIHdoaXRlIHNwYWNlIGZyb20gYm90aCBlbmRzIG9mIHRoaXMgc3RyaW5nLgorICAgKgorICAgKiBAcmV0dXJuICB0aGlzIHN0cmluZywgd2l0aCB3aGl0ZSBzcGFjZSByZW1vdmVkIGZyb20gdGhlIGZyb250IGFuZCBlbmQuCisgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIHRyaW0oKQorICB7CisgICAgcmV0dXJuIG5ldyBYU3RyaW5nKHN0cigpLnRyaW0oKSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgPHZhcj5jaDwvdmFyPiBjb25mb3JtcyB0byB0aGUgWE1MIDEuMCBkZWZpbml0aW9uCisgICAqIG9mIHdoaXRlc3BhY2UuICBSZWZlciB0byA8QSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAjTlQtUyI+CisgICAqIHRoZSBkZWZpbml0aW9uIG9mIDxDT0RFPlM8L0NPREU+PC9BPiBmb3IgZGV0YWlscy4KKyAgICogQHBhcmFtICAgY2ggICAgICBDaGFyYWN0ZXIgdG8gY2hlY2sgYXMgWE1MIHdoaXRlc3BhY2UuCisgICAqIEByZXR1cm4gICAgICAgICAgPXRydWUgaWYgPHZhcj5jaDwvdmFyPiBpcyBYTUwgd2hpdGVzcGFjZTsgb3RoZXJ3aXNlID1mYWxzZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTcGFjZShjaGFyIGNoKQorICB7CisgICAgcmV0dXJuIFhNTENoYXJhY3RlclJlY29nbml6ZXIuaXNXaGl0ZVNwYWNlKGNoKTsgIC8vIFRha2UgdGhlIGVhc3kgd2F5IG91dCBmb3Igbm93LgorICB9CisKKyAgLyoqCisgICAqIENvbmRpdGlvbmFsbHkgdHJpbSBhbGwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpbiB0aGUgc3BlY2lmaWVkIFN0cmluZy4KKyAgICogQWxsIHN0cmluZ3Mgb2Ygd2hpdGUgc3BhY2UgYXJlCisgICAqIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIHNwYWNlIGNoYXJhY3RlciAoI3gyMCksIGV4Y2VwdCBzcGFjZXMgYWZ0ZXIgcHVuY3R1YXRpb24gd2hpY2gKKyAgICogcmVjZWl2ZSBkb3VibGUgc3BhY2VzIGlmIGRvdWJsZVB1bmN0dWF0aW9uU3BhY2VzIGlzIHRydWUuCisgICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWZ1bCB0byBhIGZvcm1hdHRlciwgYnV0IHRvIGdldCBmaXJzdCBjbGFzcworICAgKiByZXN1bHRzLCB0aGUgZm9ybWF0dGVyIHNob3VsZCBwcm9iYWJseSBkbyBpdCdzIG93biB3aGl0ZSBzcGFjZSBoYW5kbGluZworICAgKiBiYXNlZCBvbiB0aGUgc2VtYW50aWNzIG9mIHRoZSBmb3JtYXR0aW5nIG9iamVjdC4KKyAgICoKKyAgICogQHBhcmFtICAgdHJpbUhlYWQgICAgVHJpbSBsZWFkaW5nIHdoaXRlc3BhY2U/CisgICAqIEBwYXJhbSAgIHRyaW1UYWlsICAgIFRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZT8KKyAgICogQHBhcmFtICAgZG91YmxlUHVuY3R1YXRpb25TcGFjZXMgICAgVXNlIGRvdWJsZSBzcGFjZXMgZm9yIHB1bmN0dWF0aW9uPworICAgKiBAcmV0dXJuICAgICAgICAgICAgICBUaGUgdHJpbW1lZCBzdHJpbmcuCisgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIGZpeFdoaXRlU3BhY2UoYm9vbGVhbiB0cmltSGVhZCwgYm9vbGVhbiB0cmltVGFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZG91YmxlUHVuY3R1YXRpb25TcGFjZXMpCisgIHsKKworICAgIC8vICVPUFQlICEhISEhISEKKyAgICBpbnQgbGVuID0gdGhpcy5sZW5ndGgoKTsKKyAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbbGVuXTsKKworICAgIHRoaXMuZ2V0Q2hhcnMoMCwgbGVuLCBidWYsIDApOworCisgICAgYm9vbGVhbiBlZGl0ID0gZmFsc2U7CisgICAgaW50IHM7CisKKyAgICBmb3IgKHMgPSAwOyBzIDwgbGVuOyBzKyspCisgICAgeworICAgICAgaWYgKGlzU3BhY2UoYnVmW3NdKSkKKyAgICAgIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLyogcmVwbGFjZSBTIHRvICcgJy4gYW5kICcgJysgLT4gc2luZ2xlICcgJy4gKi8KKyAgICBpbnQgZCA9IHM7CisgICAgYm9vbGVhbiBwcmVzID0gZmFsc2U7CisKKyAgICBmb3IgKDsgcyA8IGxlbjsgcysrKQorICAgIHsKKyAgICAgIGNoYXIgYyA9IGJ1ZltzXTsKKworICAgICAgaWYgKGlzU3BhY2UoYykpCisgICAgICB7CisgICAgICAgIGlmICghcHJlcykKKyAgICAgICAgeworICAgICAgICAgIGlmICgnICcgIT0gYykKKyAgICAgICAgICB7CisgICAgICAgICAgICBlZGl0ID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBidWZbZCsrXSA9ICcgJzsKKworICAgICAgICAgIGlmIChkb3VibGVQdW5jdHVhdGlvblNwYWNlcyAmJiAocyAhPSAwKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjaGFyIHByZXZDaGFyID0gYnVmW3MgLSAxXTsKKworICAgICAgICAgICAgaWYgKCEoKHByZXZDaGFyID09ICcuJykgfHwgKHByZXZDaGFyID09ICchJykKKyAgICAgICAgICAgICAgICAgIHx8IChwcmV2Q2hhciA9PSAnPycpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJlcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmVzID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZWRpdCA9IHRydWU7CisgICAgICAgICAgcHJlcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYnVmW2QrK10gPSBjOworICAgICAgICBwcmVzID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHRyaW1UYWlsICYmIDEgPD0gZCAmJiAnICcgPT0gYnVmW2QgLSAxXSkKKyAgICB7CisgICAgICBlZGl0ID0gdHJ1ZTsKKworICAgICAgZC0tOworICAgIH0KKworICAgIGludCBzdGFydCA9IDA7CisKKyAgICBpZiAodHJpbUhlYWQgJiYgMCA8IGQgJiYgJyAnID09IGJ1ZlswXSkKKyAgICB7CisgICAgICBlZGl0ID0gdHJ1ZTsKKworICAgICAgc3RhcnQrKzsKKyAgICB9CisKKyAgICBYTUxTdHJpbmdGYWN0b3J5IHhzZiA9IFhNTFN0cmluZ0ZhY3RvcnlJbXBsLmdldEZhY3RvcnkoKTsKKworICAgIHJldHVybiBlZGl0ID8geHNmLm5ld3N0cihuZXcgU3RyaW5nKGJ1Ziwgc3RhcnQsIGQgLSBzdGFydCkpIDogdGhpczsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvb2JqZWN0cy9YU3RyaW5nRm9yQ2hhcnMuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWFN0cmluZ0ZvckNoYXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkOGU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWFN0cmluZ0ZvckNoYXJzLmphdmEKQEAgLTAsMCArMSwxODUgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuRmFzdFN0cmluZ0J1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxTdHJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MU3RyaW5nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5YTUxDaGFyYWN0ZXJSZWNvZ25pemVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIHdpbGwgd3JhcCBhIEZhc3RTdHJpbmdCdWZmZXIgYW5kIGFsbG93IGZvcgorICovCitwdWJsaWMgY2xhc3MgWFN0cmluZ0ZvckNoYXJzIGV4dGVuZHMgWFN0cmluZworeworICAvKiogVGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBmc2IuICovCisgIGludCBtX3N0YXJ0OworICAKKyAgLyoqIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gKi8KKyAgaW50IG1fbGVuZ3RoOworICAKKyAgcHJvdGVjdGVkIFN0cmluZyBtX3N0ckNhY2hlID0gbnVsbDsKKyAgCisgIC8qKgorICAgKiBDb25zdHJ1Y3QgYSBYTm9kZVNldCBvYmplY3QuCisgICAqCisgICAqIEBwYXJhbSB2YWwgRmFzdFN0cmluZ0J1ZmZlciBvYmplY3QgdGhpcyB3aWxsIHdyYXAsIG11c3QgYmUgbm9uLW51bGwuCisgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIGFycmF5LgorICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkIGZyb20gdGhlIGFycmF5LgorICAgKi8KKyAgcHVibGljIFhTdHJpbmdGb3JDaGFycyhjaGFyW10gdmFsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCisgIHsKKyAgICBzdXBlcih2YWwpOworICAgIG1fc3RhcnQgPSBzdGFydDsKKyAgICBtX2xlbmd0aCA9IGxlbmd0aDsKKyAgICBpZihudWxsID09IHZhbCkKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgRmFzdFN0cmluZ0J1ZmZlciBhcmd1bWVudCBjYW4gbm90IGJlIG51bGwhISIpOworICB9CisKKworICAvKioKKyAgICogQ29uc3RydWN0IGEgWE5vZGVTZXQgb2JqZWN0LgorICAgKgorICAgKiBAcGFyYW0gdmFsIFN0cmluZyBvYmplY3QgdGhpcyB3aWxsIHdyYXAuCisgICAqLworICBwcml2YXRlIFhTdHJpbmdGb3JDaGFycyhTdHJpbmcgdmFsKQorICB7CisgICAgc3VwZXIodmFsKTsKKyAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICJYU3RyaW5nRm9yQ2hhcnMgY2FuIG5vdCB0YWtlIGEgc3RyaW5nIGZvciBhbiBhcmd1bWVudCEiKTsKKyAgfQorICAKKyAgLyoqCisgICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHN0cmluZy4KKyAgICoKKyAgICogQHJldHVybiBUaGUgc3RyaW5nIHRoaXMgd3JhcHMgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBudWxsCisgICAqLworICBwdWJsaWMgRmFzdFN0cmluZ0J1ZmZlciBmc2IoKQorICB7CisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImZzYigpIG5vdCBzdXBwb3J0ZWQgZm9yIFhTdHJpbmdGb3JDaGFycyEiKTsKKyAgfQorICAKKyAgLyoqCisgICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHN0cmluZy4KKyAgICoKKyAgICogQHJldHVybiBUaGUgc3RyaW5nIHRoaXMgd3JhcHMgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBudWxsCisgICAqLworICBwdWJsaWMgdm9pZCBhcHBlbmRUb0ZzYihvcmcuYXBhY2hlLnhtbC51dGlscy5GYXN0U3RyaW5nQnVmZmVyIGZzYikKKyAgeworICAgIGZzYi5hcHBlbmQoKGNoYXJbXSltX29iaiwgbV9zdGFydCwgbV9sZW5ndGgpOworICB9CisKKyAgCisgIC8qKgorICAgKiBUZWxsIGlmIHRoaXMgb2JqZWN0IGNvbnRhaW5zIGEgamF2YSBTdHJpbmcgb2JqZWN0LgorICAgKiAKKyAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgWE1MU3RyaW5nIGNhbiByZXR1cm4gYSBzdHJpbmcgd2l0aG91dCBjcmVhdGluZyBvbmUuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBoYXNTdHJpbmcoKQorICB7CisgICAgcmV0dXJuIChudWxsICE9IG1fc3RyQ2FjaGUpOworICB9CisKKyAgCisgIC8qKgorICAgKiBDYXN0IHJlc3VsdCBvYmplY3QgdG8gYSBzdHJpbmcuCisgICAqCisgICAqIEByZXR1cm4gVGhlIHN0cmluZyB0aGlzIHdyYXBzIG9yIHRoZSBlbXB0eSBzdHJpbmcgaWYgbnVsbAorICAgKi8KKyAgcHVibGljIFN0cmluZyBzdHIoKQorICB7CisgICAgaWYobnVsbCA9PSBtX3N0ckNhY2hlKQorICAgICAgbV9zdHJDYWNoZSA9IG5ldyBTdHJpbmcoKGNoYXJbXSltX29iaiwgbV9zdGFydCwgbV9sZW5ndGgpOworICAgIAorICAgIHJldHVybiBtX3N0ckNhY2hlOworICB9CisKKyAgLyoqCisgICAqIERpcmVjdGx5IGNhbGwgdGhlCisgICAqIGNoYXJhY3RlcnMgbWV0aG9kIG9uIHRoZSBwYXNzZWQgQ29udGVudEhhbmRsZXIgZm9yIHRoZQorICAgKiBzdHJpbmctdmFsdWUuIE11bHRpcGxlIGNhbGxzIHRvIHRoZQorICAgKiBDb250ZW50SGFuZGxlcidzIGNoYXJhY3RlcnMgbWV0aG9kcyBtYXkgd2VsbCBvY2N1ciBmb3IgYSBzaW5nbGUgY2FsbCB0bworICAgKiB0aGlzIG1ldGhvZC4KKyAgICoKKyAgICogQHBhcmFtIGNoIEEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgQ29udGVudEhhbmRsZXIuCisgICAqCisgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBkaXNwYXRjaENoYXJhY3RlcnNFdmVudHMob3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgY2gpCisgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgIHsKKyAgICBjaC5jaGFyYWN0ZXJzKChjaGFyW10pbV9vYmosIG1fc3RhcnQsIG1fbGVuZ3RoKTsKKyAgfQorICAgICAgCisgIC8qKgorICAgKiBEaXJlY3RseSBjYWxsIHRoZQorICAgKiBjb21tZW50IG1ldGhvZCBvbiB0aGUgcGFzc2VkIExleGljYWxIYW5kbGVyIGZvciB0aGUKKyAgICogc3RyaW5nLXZhbHVlLgorICAgKgorICAgKiBAcGFyYW0gbGggQSBub24tbnVsbCByZWZlcmVuY2UgdG8gYSBMZXhpY2FsSGFuZGxlci4KKyAgICoKKyAgICogQHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQXNDb21tZW50KG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciBsaCkKKyAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIGxoLmNvbW1lbnQoKGNoYXJbXSltX29iaiwgbV9zdGFydCwgbV9sZW5ndGgpOworICB9CisgIAorICAvKioKKyAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgc3RyaW5nLgorICAgKgorICAgKiBAcmV0dXJuICB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHJlcHJlc2VudGVkIGJ5IHRoaXMKKyAgICogICAgICAgICAgb2JqZWN0LgorICAgKi8KKyAgcHVibGljIGludCBsZW5ndGgoKQorICB7CisgICAgcmV0dXJuIG1fbGVuZ3RoOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiBBbiBpbmRleCByYW5nZXMKKyAgICogZnJvbSA8Y29kZT4wPC9jb2RlPiB0byA8Y29kZT5sZW5ndGgoKSAtIDE8L2NvZGU+LiBUaGUgZmlyc3QgY2hhcmFjdGVyCisgICAqIG9mIHRoZSBzZXF1ZW5jZSBpcyBhdCBpbmRleCA8Y29kZT4wPC9jb2RlPiwgdGhlIG5leHQgYXQgaW5kZXgKKyAgICogPGNvZGU+MTwvY29kZT4sIGFuZCBzbyBvbiwgYXMgZm9yIGFycmF5IGluZGV4aW5nLgorICAgKgorICAgKiBAcGFyYW0gICAgICBpbmRleCAgIHRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyLgorICAgKiBAcmV0dXJuICAgICB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhpcyBzdHJpbmcuCisgICAqICAgICAgICAgICAgIFRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYXQgaW5kZXggPGNvZGU+MDwvY29kZT4uCisgICAqIEBleGNlcHRpb24gIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gIGlmIHRoZSA8Y29kZT5pbmRleDwvY29kZT4KKyAgICogICAgICAgICAgICAgYXJndW1lbnQgaXMgbmVnYXRpdmUgb3Igbm90IGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMKKyAgICogICAgICAgICAgICAgc3RyaW5nLgorICAgKi8KKyAgcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkKKyAgeworICAgIHJldHVybiAoKGNoYXJbXSltX29iailbaW5kZXhdOworICB9CisKKyAgLyoqCisgICAqIENvcGllcyBjaGFyYWN0ZXJzIGZyb20gdGhpcyBzdHJpbmcgaW50byB0aGUgZGVzdGluYXRpb24gY2hhcmFjdGVyCisgICAqIGFycmF5LgorICAgKgorICAgKiBAcGFyYW0gICAgICBzcmNCZWdpbiAgIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZworICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNvcHkuCisgICAqIEBwYXJhbSAgICAgIHNyY0VuZCAgICAgaW5kZXggYWZ0ZXIgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcKKyAgICogICAgICAgICAgICAgICAgICAgICAgICB0byBjb3B5LgorICAgKiBAcGFyYW0gICAgICBkc3QgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICogQHBhcmFtICAgICAgZHN0QmVnaW4gICB0aGUgc3RhcnQgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIElmIGFueSBvZiB0aGUgZm9sbG93aW5nCisgICAqICAgICAgICAgICAgaXMgdHJ1ZToKKyAgICogICAgICAgICAgICA8dWw+PGxpPjxjb2RlPnNyY0JlZ2luPC9jb2RlPiBpcyBuZWdhdGl2ZS4KKyAgICogICAgICAgICAgICA8bGk+PGNvZGU+c3JjQmVnaW48L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiA8Y29kZT5zcmNFbmQ8L2NvZGU+CisgICAqICAgICAgICAgICAgPGxpPjxjb2RlPnNyY0VuZDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcworICAgKiAgICAgICAgICAgICAgICBzdHJpbmcKKyAgICogICAgICAgICAgICA8bGk+PGNvZGU+ZHN0QmVnaW48L2NvZGU+IGlzIG5lZ2F0aXZlCisgICAqICAgICAgICAgICAgPGxpPjxjb2RlPmRzdEJlZ2luKyhzcmNFbmQtc3JjQmVnaW4pPC9jb2RlPiBpcyBsYXJnZXIgdGhhbgorICAgKiAgICAgICAgICAgICAgICA8Y29kZT5kc3QubGVuZ3RoPC9jb2RlPjwvdWw+CisgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+ZHN0PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorICAgKi8KKyAgcHVibGljIHZvaWQgZ2V0Q2hhcnMoaW50IHNyY0JlZ2luLCBpbnQgc3JjRW5kLCBjaGFyIGRzdFtdLCBpbnQgZHN0QmVnaW4pCisgIHsKKyAgICBTeXN0ZW0uYXJyYXljb3B5KChjaGFyW10pbV9vYmosIG1fc3RhcnQrc3JjQmVnaW4sIGRzdCwgZHN0QmVnaW4sIG1fc3RhcnQrc3JjRW5kKTsKKyAgfQorICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hTdHJpbmdGb3JGU0IuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29iamVjdHMvWFN0cmluZ0ZvckZTQi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDk5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9vYmplY3RzL1hTdHJpbmdGb3JGU0IuamF2YQpAQCAtMCwwICsxLDEwNDMgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAorICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCisgKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGgub2JqZWN0czsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLkZhc3RTdHJpbmdCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MU3RyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTFN0cmluZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwudXRpbHMuWE1MQ2hhcmFjdGVyUmVjb2duaXplcjsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8qKgorICogVGhpcyBjbGFzcyB3aWxsIHdyYXAgYSBGYXN0U3RyaW5nQnVmZmVyIGFuZCBhbGxvdyBmb3IKKyAqLworcHVibGljIGNsYXNzIFhTdHJpbmdGb3JGU0IgZXh0ZW5kcyBYU3RyaW5nCit7CisKKyAgLyoqIFRoZSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgZnNiLiAqLworICBpbnQgbV9zdGFydDsKKworICAvKiogVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLiAqLworICBpbnQgbV9sZW5ndGg7CisKKyAgLyoqIElmIHRoZSBzdHIoKSBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBzdHJpbmcgd2lsbCBiZSBjYWNoZWQgaGVyZS4gKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBtX3N0ckNhY2hlID0gbnVsbDsKKworICAvKiogY2FjaGVkIGhhc2ggY29kZSAqLworICBwcm90ZWN0ZWQgaW50IG1faGFzaCA9IDA7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdCBhIFhOb2RlU2V0IG9iamVjdC4KKyAgICoKKyAgICogQHBhcmFtIHZhbCBGYXN0U3RyaW5nQnVmZmVyIG9iamVjdCB0aGlzIHdpbGwgd3JhcCwgbXVzdCBiZSBub24tbnVsbC4KKyAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCisgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQgZnJvbSB0aGUgYXJyYXkuCisgICAqLworICBwdWJsaWMgWFN0cmluZ0ZvckZTQihGYXN0U3RyaW5nQnVmZmVyIHZhbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQorICB7CisKKyAgICBzdXBlcih2YWwpOworCisgICAgbV9zdGFydCA9IHN0YXJ0OworICAgIG1fbGVuZ3RoID0gbGVuZ3RoOworCisgICAgaWYgKG51bGwgPT0gdmFsKQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgIlRoZSBGYXN0U3RyaW5nQnVmZmVyIGFyZ3VtZW50IGNhbiBub3QgYmUgbnVsbCEhIik7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0IGEgWE5vZGVTZXQgb2JqZWN0LgorICAgKgorICAgKiBAcGFyYW0gdmFsIFN0cmluZyBvYmplY3QgdGhpcyB3aWxsIHdyYXAuCisgICAqLworICBwcml2YXRlIFhTdHJpbmdGb3JGU0IoU3RyaW5nIHZhbCkKKyAgeworCisgICAgc3VwZXIodmFsKTsKKworICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAiWFN0cmluZ0ZvckZTQiBjYW4gbm90IHRha2UgYSBzdHJpbmcgZm9yIGFuIGFyZ3VtZW50ISIpOworICB9CisKKyAgLyoqCisgICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHN0cmluZy4KKyAgICoKKyAgICogQHJldHVybiBUaGUgc3RyaW5nIHRoaXMgd3JhcHMgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBudWxsCisgICAqLworICBwdWJsaWMgRmFzdFN0cmluZ0J1ZmZlciBmc2IoKQorICB7CisgICAgcmV0dXJuICgoRmFzdFN0cmluZ0J1ZmZlcikgbV9vYmopOworICB9CisgIAorICAvKioKKyAgICogQ2FzdCByZXN1bHQgb2JqZWN0IHRvIGEgc3RyaW5nLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgdGhpcyB3cmFwcyBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIG51bGwKKyAgICovCisgIHB1YmxpYyB2b2lkIGFwcGVuZFRvRnNiKG9yZy5hcGFjaGUueG1sLnV0aWxzLkZhc3RTdHJpbmdCdWZmZXIgZnNiKQorICB7CisgICAgLy8gJU9QVCUgISEhIEZTQiBoYXMgdG8gYmUgdXBkYXRlZCB0byB0YWtlIHBhcnRpYWwgZnNiJ3MgZm9yIGFwcGVuZC4KKyAgICBmc2IuYXBwZW5kKHN0cigpKTsKKyAgfQorCisgIC8qKgorICAgKiBUZWxsIGlmIHRoaXMgb2JqZWN0IGNvbnRhaW5zIGEgamF2YSBTdHJpbmcgb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBYTUxTdHJpbmcgY2FuIHJldHVybiBhIHN0cmluZyB3aXRob3V0IGNyZWF0aW5nIG9uZS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGhhc1N0cmluZygpCisgIHsKKyAgICByZXR1cm4gKG51bGwgIT0gbV9zdHJDYWNoZSk7CisgIH0KKworLy8gIC8qKiBORUVEU0RPQyBGaWVsZCBzdHJDb3VudCAqLworLy8gIHB1YmxpYyBzdGF0aWMgaW50IHN0ckNvdW50ID0gMDsKKy8vCisvLyAgLyoqIE5FRURTRE9DIEZpZWxkIHh0YWJsZSAqLworLy8gIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIHh0YWJsZSA9IG5ldyBqYXZhLnV0aWwuSGFzaHRhYmxlKCk7CisKKyAgLyoqCisgICAqIENhc3QgcmVzdWx0IG9iamVjdCB0byBhIHN0cmluZy4KKyAgICoKKyAgICogQHJldHVybiBUaGUgc3RyaW5nIHRoaXMgd3JhcHMgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBudWxsCisgICAqLworICBwdWJsaWMgU3RyaW5nIHN0cigpCisgIHsKKworICAgIGlmIChudWxsID09IG1fc3RyQ2FjaGUpCisgICAgeworICAgICAgbV9zdHJDYWNoZSA9IGZzYigpLmdldFN0cmluZyhtX3N0YXJ0LCBtX2xlbmd0aCk7CisKKy8vICAgICAgc3RyQ291bnQrKzsKKy8vCisvLyAgICAgIFJ1bnRpbWVFeGNlcHRpb24gZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJCYWQhICBCYWQhIik7CisvLyAgICAgIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyIHdyaXRlciA9IG5ldyBqYXZhLmlvLkNoYXJBcnJheVdyaXRlcigpOworLy8gICAgICBqYXZhLmlvLlByaW50V3JpdGVyIHB3ID0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIod3JpdGVyKTsKKy8vCisvLyAgICAgIGUucHJpbnRTdGFja1RyYWNlKHB3KTsKKy8vCisvLyAgICAgIFN0cmluZyBzdHIgPSB3cml0ZXIudG9TdHJpbmcoKTsKKy8vCisvLyAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgNjAwKTsKKy8vCisvLyAgICAgIGlmIChudWxsID09IHh0YWJsZS5nZXQoc3RyKSkKKy8vICAgICAgeworLy8gICAgICAgIHh0YWJsZS5wdXQoc3RyLCBzdHIpOworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdHIpOworLy8gICAgICB9CisvLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3RyQ291bnQ6ICIgKyBzdHJDb3VudCk7CisKKy8vICAgICAgdGhyb3cgZTsKKy8vICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIC8vIFN5c3RlbS5leGl0KC0xKTsKKyAgICB9CisKKyAgICByZXR1cm4gbV9zdHJDYWNoZTsKKyAgfQorCisgIC8qKgorICAgKiBEaXJlY3RseSBjYWxsIHRoZQorICAgKiBjaGFyYWN0ZXJzIG1ldGhvZCBvbiB0aGUgcGFzc2VkIENvbnRlbnRIYW5kbGVyIGZvciB0aGUKKyAgICogc3RyaW5nLXZhbHVlLiBNdWx0aXBsZSBjYWxscyB0byB0aGUKKyAgICogQ29udGVudEhhbmRsZXIncyBjaGFyYWN0ZXJzIG1ldGhvZHMgbWF5IHdlbGwgb2NjdXIgZm9yIGEgc2luZ2xlIGNhbGwgdG8KKyAgICogdGhpcyBtZXRob2QuCisgICAqCisgICAqIEBwYXJhbSBjaCBBIG5vbi1udWxsIHJlZmVyZW5jZSB0byBhIENvbnRlbnRIYW5kbGVyLgorICAgKgorICAgKiBAdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIHZvaWQgZGlzcGF0Y2hDaGFyYWN0ZXJzRXZlbnRzKG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyIGNoKQorICAgICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24KKyAgeworICAgIGZzYigpLnNlbmRTQVhjaGFyYWN0ZXJzKGNoLCBtX3N0YXJ0LCBtX2xlbmd0aCk7CisgIH0KKworICAvKioKKyAgICogRGlyZWN0bHkgY2FsbCB0aGUKKyAgICogY29tbWVudCBtZXRob2Qgb24gdGhlIHBhc3NlZCBMZXhpY2FsSGFuZGxlciBmb3IgdGhlCisgICAqIHN0cmluZy12YWx1ZS4KKyAgICoKKyAgICogQHBhcmFtIGxoIEEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgTGV4aWNhbEhhbmRsZXIuCisgICAqCisgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBkaXNwYXRjaEFzQ29tbWVudChvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIgbGgpCisgICAgICAgICAgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgorICB7CisgICAgZnNiKCkuc2VuZFNBWENvbW1lbnQobGgsIG1fc3RhcnQsIG1fbGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBzdHJpbmcuCisgICAqCisgICAqIEByZXR1cm4gIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgcmVwcmVzZW50ZWQgYnkgdGhpcworICAgKiAgICAgICAgICBvYmplY3QuCisgICAqLworICBwdWJsaWMgaW50IGxlbmd0aCgpCisgIHsKKyAgICByZXR1cm4gbV9sZW5ndGg7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguIEFuIGluZGV4IHJhbmdlcworICAgKiBmcm9tIDxjb2RlPjA8L2NvZGU+IHRvIDxjb2RlPmxlbmd0aCgpIC0gMTwvY29kZT4uIFRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICogb2YgdGhlIHNlcXVlbmNlIGlzIGF0IGluZGV4IDxjb2RlPjA8L2NvZGU+LCB0aGUgbmV4dCBhdCBpbmRleAorICAgKiA8Y29kZT4xPC9jb2RlPiwgYW5kIHNvIG9uLCBhcyBmb3IgYXJyYXkgaW5kZXhpbmcuCisgICAqCisgICAqIEBwYXJhbSAgICAgIGluZGV4ICAgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIuCisgICAqIEByZXR1cm4gICAgIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGlzIHN0cmluZy4KKyAgICogICAgICAgICAgICAgVGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhdCBpbmRleCA8Y29kZT4wPC9jb2RlPi4KKyAgICogQGV4Y2VwdGlvbiAgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAgaWYgdGhlIDxjb2RlPmluZGV4PC9jb2RlPgorICAgKiAgICAgICAgICAgICBhcmd1bWVudCBpcyBuZWdhdGl2ZSBvciBub3QgbGVzcyB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcworICAgKiAgICAgICAgICAgICBzdHJpbmcuCisgICAqLworICBwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KQorICB7CisgICAgcmV0dXJuIGZzYigpLmNoYXJBdChtX3N0YXJ0ICsgaW5kZXgpOworICB9CisKKyAgLyoqCisgICAqIENvcGllcyBjaGFyYWN0ZXJzIGZyb20gdGhpcyBzdHJpbmcgaW50byB0aGUgZGVzdGluYXRpb24gY2hhcmFjdGVyCisgICAqIGFycmF5LgorICAgKgorICAgKiBAcGFyYW0gICAgICBzcmNCZWdpbiAgIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZworICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNvcHkuCisgICAqIEBwYXJhbSAgICAgIHNyY0VuZCAgICAgaW5kZXggYWZ0ZXIgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcKKyAgICogICAgICAgICAgICAgICAgICAgICAgICB0byBjb3B5LgorICAgKiBAcGFyYW0gICAgICBkc3QgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICogQHBhcmFtICAgICAgZHN0QmVnaW4gICB0aGUgc3RhcnQgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIElmIGFueSBvZiB0aGUgZm9sbG93aW5nCisgICAqICAgICAgICAgICAgaXMgdHJ1ZToKKyAgICogICAgICAgICAgICA8dWw+PGxpPjxjb2RlPnNyY0JlZ2luPC9jb2RlPiBpcyBuZWdhdGl2ZS4KKyAgICogICAgICAgICAgICA8bGk+PGNvZGU+c3JjQmVnaW48L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiA8Y29kZT5zcmNFbmQ8L2NvZGU+CisgICAqICAgICAgICAgICAgPGxpPjxjb2RlPnNyY0VuZDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcworICAgKiAgICAgICAgICAgICAgICBzdHJpbmcKKyAgICogICAgICAgICAgICA8bGk+PGNvZGU+ZHN0QmVnaW48L2NvZGU+IGlzIG5lZ2F0aXZlCisgICAqICAgICAgICAgICAgPGxpPjxjb2RlPmRzdEJlZ2luKyhzcmNFbmQtc3JjQmVnaW4pPC9jb2RlPiBpcyBsYXJnZXIgdGhhbgorICAgKiAgICAgICAgICAgICAgICA8Y29kZT5kc3QubGVuZ3RoPC9jb2RlPjwvdWw+CisgICAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+ZHN0PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorICAgKi8KKyAgcHVibGljIHZvaWQgZ2V0Q2hhcnMoaW50IHNyY0JlZ2luLCBpbnQgc3JjRW5kLCBjaGFyIGRzdFtdLCBpbnQgZHN0QmVnaW4pCisgIHsKKworICAgIC8vICVPUFQlIE5lZWQgdG8gY2FsbCB0aGlzIG9uIEZTQiB3aGVuIGl0IGlzIGltcGxlbWVudGVkLgorICAgIC8vICVVTlRFU1RFRCUgKEkgZG9uJ3QgdGhpbmsgYW55b25lIGNhbGxzIHRoaXMgeWV0PykKKyAgICBpbnQgbiA9IHNyY0VuZCAtIHNyY0JlZ2luOworCisgICAgaWYgKG4gPiBtX2xlbmd0aCkKKyAgICAgIG4gPSBtX2xlbmd0aDsKKworICAgIGlmIChuID4gKGRzdC5sZW5ndGggLSBkc3RCZWdpbikpCisgICAgICBuID0gKGRzdC5sZW5ndGggLSBkc3RCZWdpbik7CisKKyAgICBpbnQgZW5kID0gc3JjQmVnaW4gKyBtX3N0YXJ0ICsgbjsKKyAgICBpbnQgZCA9IGRzdEJlZ2luOworICAgIEZhc3RTdHJpbmdCdWZmZXIgZnNiID0gZnNiKCk7CisKKyAgICBmb3IgKGludCBpID0gc3JjQmVnaW4gKyBtX3N0YXJ0OyBpIDwgZW5kOyBpKyspCisgICAgeworICAgICAgZHN0W2QrK10gPSBmc2IuY2hhckF0KGkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDb21wYXJlcyB0aGlzIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICogVGhlIHJlc3VsdCBpcyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgbm90CisgICAqIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBpcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cworICAgKiB0aGUgc2FtZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGFzIHRoaXMgb2JqZWN0LgorICAgKgorICAgKiBAcGFyYW0gICBhbk9iamVjdCAgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4KKyAgICogICAgICAgICAgICAgICAgICAgICBhZ2FpbnN0LgorICAgKgorICAgKiBORUVEU0RPQyBAcGFyYW0gb2JqMgorICAgKiBAcmV0dXJuICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+U3RyaW5nIDwvY29kZT5hcmUgZXF1YWw7CisgICAqICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAqIEBzZWUgICAgIGphdmEubGFuZy5TdHJpbmcjY29tcGFyZVRvKGphdmEubGFuZy5TdHJpbmcpCisgICAqIEBzZWUgICAgIGphdmEubGFuZy5TdHJpbmcjZXF1YWxzSWdub3JlQ2FzZShqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFhNTFN0cmluZyBvYmoyKQorICB7CisKKyAgICBpZiAodGhpcyA9PSBvYmoyKQorICAgIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGludCBuID0gbV9sZW5ndGg7CisKKyAgICBpZiAobiA9PSBvYmoyLmxlbmd0aCgpKQorICAgIHsKKyAgICAgIEZhc3RTdHJpbmdCdWZmZXIgZnNiID0gZnNiKCk7CisgICAgICBpbnQgaSA9IG1fc3RhcnQ7CisgICAgICBpbnQgaiA9IDA7CisKKyAgICAgIHdoaWxlIChuLS0gIT0gMCkKKyAgICAgIHsKKyAgICAgICAgaWYgKGZzYi5jaGFyQXQoaSkgIT0gb2JqMi5jaGFyQXQoaikpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpKys7CisgICAgICAgIGorKzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIFRlbGwgaWYgdHdvIG9iamVjdHMgYXJlIGZ1bmN0aW9uYWxseSBlcXVhbC4KKyAgICoKKyAgICogQHBhcmFtIG9iajIgT2JqZWN0IHRvIGNvbXBhcmUgdGhpcyB0bworICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVhbAorICAgKgorICAgKiBAdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhYT2JqZWN0IG9iajIpCisgIHsKKworICAgIGlmICh0aGlzID09IG9iajIpCisgICAgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgU3RyaW5nIHN0ciA9IG9iajIuc3RyKCk7CisgICAgaW50IG4gPSBtX2xlbmd0aDsKKworICAgIGlmIChuID09IHN0ci5sZW5ndGgoKSkKKyAgICB7CisgICAgICBGYXN0U3RyaW5nQnVmZmVyIGZzYiA9IGZzYigpOworICAgICAgaW50IGkgPSBtX3N0YXJ0OworICAgICAgaW50IGogPSAwOworCisgICAgICB3aGlsZSAobi0tICE9IDApCisgICAgICB7CisgICAgICAgIGlmIChmc2IuY2hhckF0KGkpICE9IHN0ci5jaGFyQXQoaikpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpKys7CisgICAgICAgIGorKzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIFRlbGwgaWYgdHdvIG9iamVjdHMgYXJlIGZ1bmN0aW9uYWxseSBlcXVhbC4KKyAgICoKKyAgICogQHBhcmFtIG9iajIgT2JqZWN0IHRvIGNvbXBhcmUgdGhpcyB0bworICAgKgorICAgKiBORUVEU0RPQyBAcGFyYW0gYW5vdGhlclN0cmluZworICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVhbAorICAgKgorICAgKiBAdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgYW5vdGhlclN0cmluZykKKyAgeworCisgICAgaW50IG4gPSBtX2xlbmd0aDsKKworICAgIGlmIChuID09IGFub3RoZXJTdHJpbmcubGVuZ3RoKCkpCisgICAgeworICAgICAgRmFzdFN0cmluZ0J1ZmZlciBmc2IgPSBmc2IoKTsKKyAgICAgIGludCBpID0gbV9zdGFydDsKKyAgICAgIGludCBqID0gMDsKKworICAgICAgd2hpbGUgKG4tLSAhPSAwKQorICAgICAgeworICAgICAgICBpZiAoZnNiLmNoYXJBdChpKSAhPSBhbm90aGVyU3RyaW5nLmNoYXJBdChqKSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGkrKzsKKyAgICAgICAgaisrOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogQ29tcGFyZXMgdGhpcyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAqIFRoZSByZXN1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdAorICAgKiA8Y29kZT5udWxsPC9jb2RlPiBhbmQgaXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCB0aGF0IHJlcHJlc2VudHMKKyAgICogdGhlIHNhbWUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBhcyB0aGlzIG9iamVjdC4KKyAgICoKKyAgICogQHBhcmFtICAgYW5PYmplY3QgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+CisgICAqICAgICAgICAgICAgICAgICAgICAgYWdhaW5zdC4KKyAgICoKKyAgICogTkVFRFNET0MgQHBhcmFtIG9iajIKKyAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPlN0cmluZyA8L2NvZGU+YXJlIGVxdWFsOworICAgKiAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgKiBAc2VlICAgICBqYXZhLmxhbmcuU3RyaW5nI2NvbXBhcmVUbyhqYXZhLmxhbmcuU3RyaW5nKQorICAgKiBAc2VlICAgICBqYXZhLmxhbmcuU3RyaW5nI2VxdWFsc0lnbm9yZUNhc2UoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqMikKKyAgeworCisgICAgaWYgKG51bGwgPT0gb2JqMikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gSW4gb3JkZXIgdG8gaGFuZGxlIHRoZSAnYWxsJyBzZW1hbnRpY3Mgb2YgCisgICAgICAvLyBub2Rlc2V0IGNvbXBhcmlzb25zLCB3ZSBhbHdheXMgY2FsbCB0aGUgCisgICAgICAvLyBub2Rlc2V0IGZ1bmN0aW9uLgorICAgIGVsc2UgaWYgKG9iajIgaW5zdGFuY2VvZiBYTm9kZVNldCkKKyAgICAgIHJldHVybiBvYmoyLmVxdWFscyh0aGlzKTsKKyAgICBlbHNlIGlmIChvYmoyIGluc3RhbmNlb2YgWFN0cmluZ0ZvckZTQikKKyAgICAgIHJldHVybiBlcXVhbHMoKFhNTFN0cmluZykgdGhpcyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGVxdWFscyhvYmoyLnRvU3RyaW5nKCkpOworICB9CisKKyAgLyoqCisgICAqIENvbXBhcmVzIHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBhbm90aGVyIDxjb2RlPlN0cmluZzwvY29kZT4sCisgICAqIGlnbm9yaW5nIGNhc2UgY29uc2lkZXJhdGlvbnMuICBUd28gc3RyaW5ncyBhcmUgY29uc2lkZXJlZCBlcXVhbAorICAgKiBpZ25vcmluZyBjYXNlIGlmIHRoZXkgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aCwgYW5kIGNvcnJlc3BvbmRpbmcKKyAgICogY2hhcmFjdGVycyBpbiB0aGUgdHdvIHN0cmluZ3MgYXJlIGVxdWFsIGlnbm9yaW5nIGNhc2UuCisgICAqCisgICAqIEBwYXJhbSAgIGFub3RoZXJTdHJpbmcgICB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBjb21wYXJlIHRoaXMKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlN0cmluZzwvY29kZT4gYWdhaW5zdC4KKyAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPgorICAgKiAgICAgICAgICBhbmQgdGhlIDxjb2RlPlN0cmluZzwvY29kZT5zIGFyZSBlcXVhbCwKKyAgICogICAgICAgICAgaWdub3JpbmcgY2FzZTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICogQHNlZSAgICAgI2VxdWFscyhPYmplY3QpCisgICAqIEBzZWUgICAgIGphdmEubGFuZy5DaGFyYWN0ZXIjdG9Mb3dlckNhc2UoY2hhcikKKyAgICogQHNlZSBqYXZhLmxhbmcuQ2hhcmFjdGVyI3RvVXBwZXJDYXNlKGNoYXIpCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVDYXNlKFN0cmluZyBhbm90aGVyU3RyaW5nKQorICB7CisgICAgcmV0dXJuIChtX2xlbmd0aCA9PSBhbm90aGVyU3RyaW5nLmxlbmd0aCgpKQorICAgICAgICAgICA/IHN0cigpLmVxdWFsc0lnbm9yZUNhc2UoYW5vdGhlclN0cmluZykgOiBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wYXJlcyB0d28gc3RyaW5ncyBsZXhpY29ncmFwaGljYWxseS4KKyAgICoKKyAgICogQHBhcmFtICAgYW5vdGhlclN0cmluZyAgIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGJlIGNvbXBhcmVkLgorICAgKgorICAgKiBORUVEU0RPQyBAcGFyYW0geHN0cgorICAgKiBAcmV0dXJuICB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdGhlIGFyZ3VtZW50IHN0cmluZyBpcyBlcXVhbCB0bworICAgKiAgICAgICAgICB0aGlzIHN0cmluZzsgYSB2YWx1ZSBsZXNzIHRoYW4gPGNvZGU+MDwvY29kZT4gaWYgdGhpcyBzdHJpbmcKKyAgICogICAgICAgICAgaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIHRoZSBzdHJpbmcgYXJndW1lbnQ7IGFuZCBhCisgICAqICAgICAgICAgIHZhbHVlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiB0aGlzIHN0cmluZyBpcworICAgKiAgICAgICAgICBsZXhpY29ncmFwaGljYWxseSBncmVhdGVyIHRoYW4gdGhlIHN0cmluZyBhcmd1bWVudC4KKyAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+YW5vdGhlclN0cmluZzwvY29kZT4KKyAgICogICAgICAgICAgaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAqLworICBwdWJsaWMgaW50IGNvbXBhcmVUbyhYTUxTdHJpbmcgeHN0cikKKyAgeworCisgICAgaW50IGxlbjEgPSBtX2xlbmd0aDsKKyAgICBpbnQgbGVuMiA9IHhzdHIubGVuZ3RoKCk7CisgICAgaW50IG4gPSBNYXRoLm1pbihsZW4xLCBsZW4yKTsKKyAgICBGYXN0U3RyaW5nQnVmZmVyIGZzYiA9IGZzYigpOworICAgIGludCBpID0gbV9zdGFydDsKKyAgICBpbnQgaiA9IDA7CisKKyAgICB3aGlsZSAobi0tICE9IDApCisgICAgeworICAgICAgY2hhciBjMSA9IGZzYi5jaGFyQXQoaSk7CisgICAgICBjaGFyIGMyID0geHN0ci5jaGFyQXQoaik7CisKKyAgICAgIGlmIChjMSAhPSBjMikKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGMxIC0gYzI7CisgICAgICB9CisKKyAgICAgIGkrKzsKKyAgICAgIGorKzsKKyAgICB9CisKKyAgICByZXR1cm4gbGVuMSAtIGxlbjI7CisgIH0KKworICAvKioKKyAgICogQ29tcGFyZXMgdHdvIHN0cmluZ3MgbGV4aWNvZ3JhcGhpY2FsbHksIGlnbm9yaW5nIGNhc2UgY29uc2lkZXJhdGlvbnMuCisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gaW50ZWdlciB3aG9zZSBzaWduIGlzIHRoYXQgb2YKKyAgICogPGNvZGU+dGhpcy50b1VwcGVyQ2FzZSgpLnRvTG93ZXJDYXNlKCkuY29tcGFyZVRvKAorICAgKiBzdHIudG9VcHBlckNhc2UoKS50b0xvd2VyQ2FzZSgpKTwvY29kZT4uCisgICAqIDxwPgorICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyA8ZW0+bm90PC9lbT4gdGFrZSBsb2NhbGUgaW50byBhY2NvdW50LAorICAgKiBhbmQgd2lsbCByZXN1bHQgaW4gYW4gdW5zYXRpc2ZhY3Rvcnkgb3JkZXJpbmcgZm9yIGNlcnRhaW4gbG9jYWxlcy4KKyAgICogVGhlIGphdmEudGV4dCBwYWNrYWdlIHByb3ZpZGVzIDxlbT5jb2xsYXRvcnM8L2VtPiB0byBhbGxvdworICAgKiBsb2NhbGUtc2Vuc2l0aXZlIG9yZGVyaW5nLgorICAgKgorICAgKiBAcGFyYW0gICBzdHIgICB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBiZSBjb21wYXJlZC4KKyAgICoKKyAgICogTkVFRFNET0MgQHBhcmFtIHhzdHIKKyAgICogQHJldHVybiAgYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlCisgICAqICAgICAgICAgIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGlzIGdyZWF0ZXIgdGhhbiwgZXF1YWwgdG8sIG9yIGxlc3MKKyAgICogICAgICAgICAgdGhhbiB0aGlzIFN0cmluZywgaWdub3JpbmcgY2FzZSBjb25zaWRlcmF0aW9ucy4KKyAgICogQHNlZSAgICAgamF2YS50ZXh0LkNvbGxhdG9yI2NvbXBhcmUoU3RyaW5nLCBTdHJpbmcpCisgICAqIEBzaW5jZSAgIDEuMgorICAgKi8KKyAgcHVibGljIGludCBjb21wYXJlVG9JZ25vcmVDYXNlKFhNTFN0cmluZyB4c3RyKQorICB7CisKKyAgICBpbnQgbGVuMSA9IG1fbGVuZ3RoOworICAgIGludCBsZW4yID0geHN0ci5sZW5ndGgoKTsKKyAgICBpbnQgbiA9IE1hdGgubWluKGxlbjEsIGxlbjIpOworICAgIEZhc3RTdHJpbmdCdWZmZXIgZnNiID0gZnNiKCk7CisgICAgaW50IGkgPSBtX3N0YXJ0OworICAgIGludCBqID0gMDsKKworICAgIHdoaWxlIChuLS0gIT0gMCkKKyAgICB7CisgICAgICBjaGFyIGMxID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGZzYi5jaGFyQXQoaSkpOworICAgICAgY2hhciBjMiA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh4c3RyLmNoYXJBdChqKSk7CisKKyAgICAgIGlmIChjMSAhPSBjMikKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGMxIC0gYzI7CisgICAgICB9CisKKyAgICAgIGkrKzsKKyAgICAgIGorKzsKKyAgICB9CisKKyAgICByZXR1cm4gbGVuMSAtIGxlbjI7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIGhhc2hjb2RlIGZvciB0aGlzIHN0cmluZy4gVGhlIGhhc2hjb2RlIGZvciBhCisgICAqIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IGlzIGNvbXB1dGVkIGFzCisgICAqIDxibG9ja3F1b3RlPjxwcmU+CisgICAqIHNbMF0qMzFeKG4tMSkgKyBzWzFdKjMxXihuLTIpICsgLi4uICsgc1tuLTFdCisgICAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICogdXNpbmcgPGNvZGU+aW50PC9jb2RlPiBhcml0aG1ldGljLCB3aGVyZSA8Y29kZT5zW2ldPC9jb2RlPiBpcyB0aGUKKyAgICogPGk+aTwvaT50aCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZywgPGNvZGU+bjwvY29kZT4gaXMgdGhlIGxlbmd0aCBvZgorICAgKiB0aGUgc3RyaW5nLCBhbmQgPGNvZGU+XjwvY29kZT4gaW5kaWNhdGVzIGV4cG9uZW50aWF0aW9uLgorICAgKiAoVGhlIGhhc2ggdmFsdWUgb2YgdGhlIGVtcHR5IHN0cmluZyBpcyB6ZXJvLikKKyAgICoKKyAgICogQHJldHVybiAgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgcHVibGljIGludCBoYXNoQ29kZSgpCisgIHsKKworICAgIGludCBoID0gbV9oYXNoOworCisgICAgaWYgKGggPT0gMCkKKyAgICB7CisgICAgICBpbnQgb2ZmID0gbV9zdGFydDsKKyAgICAgIGludCBsZW4gPSBtX2xlbmd0aDsKKyAgICAgIEZhc3RTdHJpbmdCdWZmZXIgZnNiID0gZnNiKCk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICB7CisgICAgICAgIGggPSAzMSAqIGggKyBmc2IuY2hhckF0KG9mZik7CisKKyAgICAgICAgb2ZmKys7CisgICAgICB9CisKKyAgICAgIG1faGFzaCA9IGg7CisgICAgfQorCisgICAgcmV0dXJuIGg7CisgIH0KKworICAvKioKKyAgICogVGVzdHMgaWYgdGhpcyBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXggYmVnaW5uaW5nCisgICAqIGEgc3BlY2lmaWVkIGluZGV4LgorICAgKgorICAgKiBAcGFyYW0gICBwcmVmaXggICAgdGhlIHByZWZpeC4KKyAgICogQHBhcmFtICAgdG9mZnNldCAgIHdoZXJlIHRvIGJlZ2luIGxvb2tpbmcgaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGUKKyAgICogICAgICAgICAgYXJndW1lbnQgaXMgYSBwcmVmaXggb2YgdGhlIHN1YnN0cmluZyBvZiB0aGlzIG9iamVjdCBzdGFydGluZworICAgKiAgICAgICAgICBhdCBpbmRleCA8Y29kZT50b2Zmc2V0PC9jb2RlPjsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICogICAgICAgICAgVGhlIHJlc3VsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgPGNvZGU+dG9mZnNldDwvY29kZT4gaXMKKyAgICogICAgICAgICAgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcworICAgKiAgICAgICAgICA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdDsgb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUKKyAgICogICAgICAgICAgYXMgdGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbgorICAgKiAgICAgICAgICA8cHJlPgorICAgKiAgICAgICAgICB0aGlzLnN1YlN0cmluZyh0b2Zmc2V0KS5zdGFydHNXaXRoKHByZWZpeCkKKyAgICogICAgICAgICAgPC9wcmU+CisgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnByZWZpeDwvY29kZT4gaXMKKyAgICogICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKFhNTFN0cmluZyBwcmVmaXgsIGludCB0b2Zmc2V0KQorICB7CisKKyAgICBGYXN0U3RyaW5nQnVmZmVyIGZzYiA9IGZzYigpOworICAgIGludCB0byA9IG1fc3RhcnQgKyB0b2Zmc2V0OworICAgIGludCB0bGltID0gbV9zdGFydCArIG1fbGVuZ3RoOworICAgIGludCBwbyA9IDA7CisgICAgaW50IHBjID0gcHJlZml4Lmxlbmd0aCgpOworCisgICAgLy8gTm90ZTogdG9mZnNldCBtaWdodCBiZSBuZWFyIC0xPj4+MS4KKyAgICBpZiAoKHRvZmZzZXQgPCAwKSB8fCAodG9mZnNldCA+IG1fbGVuZ3RoIC0gcGMpKQorICAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAoLS1wYyA+PSAwKQorICAgIHsKKyAgICAgIGlmIChmc2IuY2hhckF0KHRvKSAhPSBwcmVmaXguY2hhckF0KHBvKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICB0bysrOworICAgICAgcG8rKzsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUZXN0cyBpZiB0aGlzIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeC4KKyAgICoKKyAgICogQHBhcmFtICAgcHJlZml4ICAgdGhlIHByZWZpeC4KKyAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGUKKyAgICogICAgICAgICAgYXJndW1lbnQgaXMgYSBwcmVmaXggb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieQorICAgKiAgICAgICAgICB0aGlzIHN0cmluZzsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICogICAgICAgICAgTm90ZSBhbHNvIHRoYXQgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUKKyAgICogICAgICAgICAgYXJndW1lbnQgaXMgYW4gZW1wdHkgc3RyaW5nIG9yIGlzIGVxdWFsIHRvIHRoaXMKKyAgICogICAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgYXMgZGV0ZXJtaW5lZCBieSB0aGUKKyAgICogICAgICAgICAge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0gbWV0aG9kLgorICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5wcmVmaXg8L2NvZGU+IGlzCisgICAqICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgKiBAc2luY2UgICBKREsxLiAwCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKFhNTFN0cmluZyBwcmVmaXgpCisgIHsKKyAgICByZXR1cm4gc3RhcnRzV2l0aChwcmVmaXgsIDApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGluZGV4IHdpdGhpbiB0aGlzIHN0cmluZyBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKKyAgICogc3BlY2lmaWVkIGNoYXJhY3Rlci4gSWYgYSBjaGFyYWN0ZXIgd2l0aCB2YWx1ZSA8Y29kZT5jaDwvY29kZT4gb2NjdXJzCisgICAqIGluIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+CisgICAqIG9iamVjdCwgdGhlbiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN1Y2ggb2NjdXJyZW5jZSBpcyByZXR1cm5lZCAtLQorICAgKiB0aGF0IGlzLCB0aGUgc21hbGxlc3QgdmFsdWUgPGk+azwvaT4gc3VjaCB0aGF0OgorICAgKiA8YmxvY2txdW90ZT48cHJlPgorICAgKiB0aGlzLmNoYXJBdCg8aT5rPC9pPikgPT0gY2gKKyAgICogPC9wcmU+PC9ibG9ja3F1b3RlPgorICAgKiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgbm8gc3VjaCBjaGFyYWN0ZXIgb2NjdXJzIGluIHRoaXMgc3RyaW5nLAorICAgKiB0aGVuIDxjb2RlPi0xPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICoKKyAgICogQHBhcmFtICAgY2ggICBhIGNoYXJhY3Rlci4KKyAgICogQHJldHVybiAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIgaW4gdGhlCisgICAqICAgICAgICAgIGNoYXJhY3RlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdCwgb3IKKyAgICogICAgICAgICAgPGNvZGU+LTE8L2NvZGU+IGlmIHRoZSBjaGFyYWN0ZXIgZG9lcyBub3Qgb2NjdXIuCisgICAqLworICBwdWJsaWMgaW50IGluZGV4T2YoaW50IGNoKQorICB7CisgICAgcmV0dXJuIGluZGV4T2YoY2gsIDApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGluZGV4IHdpdGhpbiB0aGlzIHN0cmluZyBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKKyAgICogc3BlY2lmaWVkIGNoYXJhY3Rlciwgc3RhcnRpbmcgdGhlIHNlYXJjaCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgKiA8cD4KKyAgICogSWYgYSBjaGFyYWN0ZXIgd2l0aCB2YWx1ZSA8Y29kZT5jaDwvY29kZT4gb2NjdXJzIGluIHRoZSBjaGFyYWN0ZXIKKyAgICogc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCBhdCBhbiBpbmRleAorICAgKiBubyBzbWFsbGVyIHRoYW4gPGNvZGU+ZnJvbUluZGV4PC9jb2RlPiwgdGhlbiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0CisgICAqIHN1Y2ggb2NjdXJyZW5jZSBpcyByZXR1cm5lZC0tdGhhdCBpcywgdGhlIHNtYWxsZXN0IHZhbHVlIDxpPms8L2k+CisgICAqIHN1Y2ggdGhhdDoKKyAgICogPGJsb2NrcXVvdGU+PHByZT4KKyAgICogKHRoaXMuY2hhckF0KDxpPms8L2k+KSA9PSBjaCkgJiYgKDxpPms8L2k+ID49IGZyb21JbmRleCkKKyAgICogPC9wcmU+PC9ibG9ja3F1b3RlPgorICAgKiBpcyB0cnVlLiBJZiBubyBzdWNoIGNoYXJhY3RlciBvY2N1cnMgaW4gdGhpcyBzdHJpbmcgYXQgb3IgYWZ0ZXIKKyAgICogcG9zaXRpb24gPGNvZGU+ZnJvbUluZGV4PC9jb2RlPiwgdGhlbiA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAqIDxwPgorICAgKiBUaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiB0aGUgdmFsdWUgb2YgPGNvZGU+ZnJvbUluZGV4PC9jb2RlPi4gSWYgaXQKKyAgICogaXMgbmVnYXRpdmUsIGl0IGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgaWYgaXQgd2VyZSB6ZXJvOiB0aGlzIGVudGlyZQorICAgKiBzdHJpbmcgbWF5IGJlIHNlYXJjaGVkLiBJZiBpdCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzCisgICAqIHN0cmluZywgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBpZiBpdCB3ZXJlIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YKKyAgICogdGhpcyBzdHJpbmc6IDxjb2RlPi0xPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICoKKyAgICogQHBhcmFtICAgY2ggICAgICAgICAgYSBjaGFyYWN0ZXIuCisgICAqIEBwYXJhbSAgIGZyb21JbmRleCAgIHRoZSBpbmRleCB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uCisgICAqIEByZXR1cm4gIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZQorICAgKiAgICAgICAgICBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QgdGhhdCBpcyBncmVhdGVyCisgICAqICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+ZnJvbUluZGV4PC9jb2RlPiwgb3IgPGNvZGU+LTE8L2NvZGU+CisgICAqICAgICAgICAgIGlmIHRoZSBjaGFyYWN0ZXIgZG9lcyBub3Qgb2NjdXIuCisgICAqLworICBwdWJsaWMgaW50IGluZGV4T2YoaW50IGNoLCBpbnQgZnJvbUluZGV4KQorICB7CisKKyAgICBpbnQgbWF4ID0gbV9zdGFydCArIG1fbGVuZ3RoOworICAgIEZhc3RTdHJpbmdCdWZmZXIgZnNiID0gZnNiKCk7CisKKyAgICBpZiAoZnJvbUluZGV4IDwgMCkKKyAgICB7CisgICAgICBmcm9tSW5kZXggPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChmcm9tSW5kZXggPj0gbV9sZW5ndGgpCisgICAgeworCisgICAgICAvLyBOb3RlOiBmcm9tSW5kZXggbWlnaHQgYmUgbmVhciAtMT4+PjEuCisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IG1fc3RhcnQgKyBmcm9tSW5kZXg7IGkgPCBtYXg7IGkrKykKKyAgICB7CisgICAgICBpZiAoZnNiLmNoYXJBdChpKSA9PSBjaCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGkgLSBtX3N0YXJ0OworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbmV3IHN0cmluZyB0aGF0IGlzIGEgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nLiBUaGUKKyAgICogc3Vic3RyaW5nIGJlZ2lucyB3aXRoIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBhbmQKKyAgICogZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoaXMgc3RyaW5nLiA8cD4KKyAgICogRXhhbXBsZXM6CisgICAqIDxibG9ja3F1b3RlPjxwcmU+CisgICAqICJ1bmhhcHB5Ii5zdWJzdHJpbmcoMikgcmV0dXJucyAiaGFwcHkiCisgICAqICJIYXJiaXNvbiIuc3Vic3RyaW5nKDMpIHJldHVybnMgImJpc29uIgorICAgKiAiZW1wdGluZXNzIi5zdWJzdHJpbmcoOSkgcmV0dXJucyAiIiAoYW4gZW1wdHkgc3RyaW5nKQorICAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+CisgICAqCisgICAqIEBwYXJhbSAgICAgIGJlZ2luSW5kZXggICB0aGUgYmVnaW5uaW5nIGluZGV4LCBpbmNsdXNpdmUuCisgICAqIEByZXR1cm4gICAgIHRoZSBzcGVjaWZpZWQgc3Vic3RyaW5nLgorICAgKiBAZXhjZXB0aW9uICBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uICBpZgorICAgKiAgICAgICAgICAgICA8Y29kZT5iZWdpbkluZGV4PC9jb2RlPiBpcyBuZWdhdGl2ZSBvciBsYXJnZXIgdGhhbiB0aGUKKyAgICogICAgICAgICAgICAgbGVuZ3RoIG9mIHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QuCisgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIHN1YnN0cmluZyhpbnQgYmVnaW5JbmRleCkKKyAgeworCisgICAgaW50IGxlbiA9IG1fbGVuZ3RoIC0gYmVnaW5JbmRleDsKKworICAgIGlmIChsZW4gPD0gMCkKKyAgICAgIHJldHVybiBYU3RyaW5nLkVNUFRZU1RSSU5HOworICAgIGVsc2UKKyAgICB7CisgICAgICBpbnQgc3RhcnQgPSBtX3N0YXJ0ICsgYmVnaW5JbmRleDsKKworICAgICAgcmV0dXJuIG5ldyBYU3RyaW5nRm9yRlNCKGZzYigpLCBzdGFydCwgbGVuKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIG5ldyBzdHJpbmcgdGhhdCBpcyBhIHN1YnN0cmluZyBvZiB0aGlzIHN0cmluZy4gVGhlCisgICAqIHN1YnN0cmluZyBiZWdpbnMgYXQgdGhlIHNwZWNpZmllZCA8Y29kZT5iZWdpbkluZGV4PC9jb2RlPiBhbmQKKyAgICogZXh0ZW5kcyB0byB0aGUgY2hhcmFjdGVyIGF0IGluZGV4IDxjb2RlPmVuZEluZGV4IC0gMTwvY29kZT4uCisgICAqIFRodXMgdGhlIGxlbmd0aCBvZiB0aGUgc3Vic3RyaW5nIGlzIDxjb2RlPmVuZEluZGV4LWJlZ2luSW5kZXg8L2NvZGU+LgorICAgKgorICAgKiBAcGFyYW0gICAgICBiZWdpbkluZGV4ICAgdGhlIGJlZ2lubmluZyBpbmRleCwgaW5jbHVzaXZlLgorICAgKiBAcGFyYW0gICAgICBlbmRJbmRleCAgICAgdGhlIGVuZGluZyBpbmRleCwgZXhjbHVzaXZlLgorICAgKiBAcmV0dXJuICAgICB0aGUgc3BlY2lmaWVkIHN1YnN0cmluZy4KKyAgICogQGV4Y2VwdGlvbiAgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAgaWYgdGhlCisgICAqICAgICAgICAgICAgIDxjb2RlPmJlZ2luSW5kZXg8L2NvZGU+IGlzIG5lZ2F0aXZlLCBvcgorICAgKiAgICAgICAgICAgICA8Y29kZT5lbmRJbmRleDwvY29kZT4gaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZgorICAgKiAgICAgICAgICAgICB0aGlzIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0LCBvcgorICAgKiAgICAgICAgICAgICA8Y29kZT5iZWdpbkluZGV4PC9jb2RlPiBpcyBsYXJnZXIgdGhhbgorICAgKiAgICAgICAgICAgICA8Y29kZT5lbmRJbmRleDwvY29kZT4uCisgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIHN1YnN0cmluZyhpbnQgYmVnaW5JbmRleCwgaW50IGVuZEluZGV4KQorICB7CisKKyAgICBpbnQgbGVuID0gZW5kSW5kZXggLSBiZWdpbkluZGV4OworCisgICAgaWYgKGxlbiA+IG1fbGVuZ3RoKQorICAgICAgbGVuID0gbV9sZW5ndGg7CisKKyAgICBpZiAobGVuIDw9IDApCisgICAgICByZXR1cm4gWFN0cmluZy5FTVBUWVNUUklORzsKKyAgICBlbHNlCisgICAgeworICAgICAgaW50IHN0YXJ0ID0gbV9zdGFydCArIGJlZ2luSW5kZXg7CisKKyAgICAgIHJldHVybiBuZXcgWFN0cmluZ0ZvckZTQihmc2IoKSwgc3RhcnQsIGxlbik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENvbmNhdGVuYXRlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgZW5kIG9mIHRoaXMgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gICBzdHIgICB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGF0IGlzIGNvbmNhdGVuYXRlZCB0byB0aGUgZW5kCisgICAqICAgICAgICAgICAgICAgIG9mIHRoaXMgPGNvZGU+U3RyaW5nPC9jb2RlPi4KKyAgICogQHJldHVybiAgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoaXMgb2JqZWN0J3MKKyAgICogICAgICAgICAgY2hhcmFjdGVycyBmb2xsb3dlZCBieSB0aGUgc3RyaW5nIGFyZ3VtZW50J3MgY2hhcmFjdGVycy4KKyAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+c3RyPC9jb2RlPiBpcworICAgKiAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBYTUxTdHJpbmcgY29uY2F0KFN0cmluZyBzdHIpCisgIHsKKworICAgIC8vICVPUFQlIE1ha2UgYW4gRlNCIGhlcmU/CisgICAgcmV0dXJuIG5ldyBYU3RyaW5nKHN0cigpLmNvbmNhdChzdHIpKTsKKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmVzIHdoaXRlIHNwYWNlIGZyb20gYm90aCBlbmRzIG9mIHRoaXMgc3RyaW5nLgorICAgKgorICAgKiBAcmV0dXJuICB0aGlzIHN0cmluZywgd2l0aCB3aGl0ZSBzcGFjZSByZW1vdmVkIGZyb20gdGhlIGZyb250IGFuZCBlbmQuCisgICAqLworICBwdWJsaWMgWE1MU3RyaW5nIHRyaW0oKQorICB7CisgICAgcmV0dXJuIGZpeFdoaXRlU3BhY2UodHJ1ZSwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIDx2YXI+Y2g8L3Zhcj4gY29uZm9ybXMgdG8gdGhlIFhNTCAxLjAgZGVmaW5pdGlvbgorICAgKiBvZiB3aGl0ZXNwYWNlLiAgUmVmZXIgdG8gPEEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwI05ULVMiPgorICAgKiB0aGUgZGVmaW5pdGlvbiBvZiA8Q09ERT5TPC9DT0RFPjwvQT4gZm9yIGRldGFpbHMuCisgICAqIEBwYXJhbSAgIGNoICAgICAgQ2hhcmFjdGVyIHRvIGNoZWNrIGFzIFhNTCB3aGl0ZXNwYWNlLgorICAgKiBAcmV0dXJuICAgICAgICAgID10cnVlIGlmIDx2YXI+Y2g8L3Zhcj4gaXMgWE1MIHdoaXRlc3BhY2U7IG90aGVyd2lzZSA9ZmFsc2UuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3BhY2UoY2hhciBjaCkKKyAgeworICAgIHJldHVybiBYTUxDaGFyYWN0ZXJSZWNvZ25pemVyLmlzV2hpdGVTcGFjZShjaCk7ICAvLyBUYWtlIHRoZSBlYXN5IHdheSBvdXQgZm9yIG5vdy4KKyAgfQorCisgIC8qKgorICAgKiBDb25kaXRpb25hbGx5IHRyaW0gYWxsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gdGhlIHNwZWNpZmllZCBTdHJpbmcuCisgICAqIEFsbCBzdHJpbmdzIG9mIHdoaXRlIHNwYWNlIGFyZQorICAgKiByZXBsYWNlZCBieSBhIHNpbmdsZSBzcGFjZSBjaGFyYWN0ZXIgKCN4MjApLCBleGNlcHQgc3BhY2VzIGFmdGVyIHB1bmN0dWF0aW9uIHdoaWNoCisgICAqIHJlY2VpdmUgZG91YmxlIHNwYWNlcyBpZiBkb3VibGVQdW5jdHVhdGlvblNwYWNlcyBpcyB0cnVlLgorICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VmdWwgdG8gYSBmb3JtYXR0ZXIsIGJ1dCB0byBnZXQgZmlyc3QgY2xhc3MKKyAgICogcmVzdWx0cywgdGhlIGZvcm1hdHRlciBzaG91bGQgcHJvYmFibHkgZG8gaXQncyBvd24gd2hpdGUgc3BhY2UgaGFuZGxpbmcKKyAgICogYmFzZWQgb24gdGhlIHNlbWFudGljcyBvZiB0aGUgZm9ybWF0dGluZyBvYmplY3QuCisgICAqCisgICAqIEBwYXJhbSAgIHRyaW1IZWFkICAgIFRyaW0gbGVhZGluZyB3aGl0ZXNwYWNlPworICAgKiBAcGFyYW0gICB0cmltVGFpbCAgICBUcmltIHRyYWlsaW5nIHdoaXRlc3BhY2U/CisgICAqIEBwYXJhbSAgIGRvdWJsZVB1bmN0dWF0aW9uU3BhY2VzICAgIFVzZSBkb3VibGUgc3BhY2VzIGZvciBwdW5jdHVhdGlvbj8KKyAgICogQHJldHVybiAgICAgICAgICAgICAgVGhlIHRyaW1tZWQgc3RyaW5nLgorICAgKi8KKyAgcHVibGljIFhNTFN0cmluZyBmaXhXaGl0ZVNwYWNlKGJvb2xlYW4gdHJpbUhlYWQsIGJvb2xlYW4gdHJpbVRhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRvdWJsZVB1bmN0dWF0aW9uU3BhY2VzKQorICB7CisKKyAgICBpbnQgZW5kID0gbV9sZW5ndGggKyBtX3N0YXJ0OworICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclttX2xlbmd0aF07CisgICAgRmFzdFN0cmluZ0J1ZmZlciBmc2IgPSBmc2IoKTsKKyAgICBib29sZWFuIGVkaXQgPSBmYWxzZTsKKworICAgIC8qIHJlcGxhY2UgUyB0byAnICcuIGFuZCAnICcrIC0+IHNpbmdsZSAnICcuICovCisgICAgaW50IGQgPSAwOworICAgIGJvb2xlYW4gcHJlcyA9IGZhbHNlOworCisgICAgZm9yIChpbnQgcyA9IG1fc3RhcnQ7IHMgPCBlbmQ7IHMrKykKKyAgICB7CisgICAgICBjaGFyIGMgPSBmc2IuY2hhckF0KHMpOworCisgICAgICBpZiAoaXNTcGFjZShjKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKCFwcmVzKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCcgJyAhPSBjKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGVkaXQgPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGJ1ZltkKytdID0gJyAnOworCisgICAgICAgICAgaWYgKGRvdWJsZVB1bmN0dWF0aW9uU3BhY2VzICYmIChkICE9IDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgcHJldkNoYXIgPSBidWZbZCAtIDFdOworCisgICAgICAgICAgICBpZiAoISgocHJldkNoYXIgPT0gJy4nKSB8fCAocHJldkNoYXIgPT0gJyEnKQorICAgICAgICAgICAgICAgICAgfHwgKHByZXZDaGFyID09ICc/JykpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmVzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByZXMgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBlZGl0ID0gdHJ1ZTsKKyAgICAgICAgICBwcmVzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBidWZbZCsrXSA9IGM7CisgICAgICAgIHByZXMgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHJpbVRhaWwgJiYgMSA8PSBkICYmICcgJyA9PSBidWZbZCAtIDFdKQorICAgIHsKKyAgICAgIGVkaXQgPSB0cnVlOworCisgICAgICBkLS07CisgICAgfQorCisgICAgaW50IHN0YXJ0ID0gMDsKKworICAgIGlmICh0cmltSGVhZCAmJiAwIDwgZCAmJiAnICcgPT0gYnVmWzBdKQorICAgIHsKKyAgICAgIGVkaXQgPSB0cnVlOworCisgICAgICBzdGFydCsrOworICAgIH0KKworICAgIFhNTFN0cmluZ0ZhY3RvcnkgeHNmID0gWE1MU3RyaW5nRmFjdG9yeUltcGwuZ2V0RmFjdG9yeSgpOworCisgICAgcmV0dXJuIGVkaXQgPyB4c2YubmV3c3RyKGJ1Ziwgc3RhcnQsIGQgLSBzdGFydCkgOiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBkb3VibGUgLS0gQWxsb3dlZCBpbnB1dCBpcyBpbiBmaXhlZAorICAgKiBub3RhdGlvbiBkZGQuZmZmLgorICAgKgorICAgKiBAcmV0dXJuIEEgZG91YmxlIHZhbHVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdHJpbmcsIG9yIHJldHVybiBEb3VibGUuTmFOIAorICAgKiBpZiB0aGUgc3RyaW5nIGNhbiBub3QgYmUgY29udmVydGVkLgorICAgKi8KKyAgcHVibGljIGRvdWJsZSB0b0RvdWJsZSgpCisgIHsKKworICAgIGludCBzdGFydCA9IG1fc3RhcnQ7CisgICAgaW50IGVuZCA9IG1fbGVuZ3RoK3N0YXJ0OworICAgIAorICAgIGlmKDAgPT0gZW5kKQorICAgICAgcmV0dXJuIERvdWJsZS5OYU47CisgICAgICAKKyAgICBkb3VibGUgcmVzdWx0ID0gMC4wOworICAgIGludCBwdW5jdFBvcyA9IGVuZC0xOworICAgIEZhc3RTdHJpbmdCdWZmZXIgZnNiID0gZnNiKCk7CisgICAgCisgICAgLy8gU2NhbiB0byBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4KKyAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgCisgICAgeworICAgICAgY2hhciBjID0gZnNiLmNoYXJBdChpKTsKKyAgICAgIGlmKCAhQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKCBjICkgKQorICAgICAgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc3RhcnQrKzsKKyAgICB9CisKKyAgICBkb3VibGUgc2lnbiA9IDEuMDsKKyAgICBpZiAoc3RhcnQgPCBlbmQgJiYgZnNiLmNoYXJBdChzdGFydCkgPT0gJy0nKQorICAgIHsKKyAgICAgIHNpZ24gPSAtMS4wOworCisgICAgICBzdGFydCsrOworICAgIH0KKyAgICAKKyAgICBpbnQgZGlnaXRzRm91bmQgPSAwOworICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSAgLy8gcGFyc2UgdGhlIHN0cmluZyBmcm9tIGxlZnQgdG8gcmlnaHQgY29udmVydGluZyB0aGUgaW50ZWdlciBwYXJ0CisgICAgeworICAgICAgY2hhciBjID0gZnNiLmNoYXJBdChpKTsKKyAgICAgIGlmIChjICE9ICcuJykKKyAgICAgIHsKKyAgICAgICAgaWYoQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKGMpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChjKSkKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAqIDEwLjAgKyAoYyAtIDB4MzApOworICAgICAgICAgIGRpZ2l0c0ZvdW5kKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIERvdWJsZS5OYU47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcHVuY3RQb3MgPSBpOworCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoZnNiLmNoYXJBdChwdW5jdFBvcykgPT0gJy4nKSAgLy8gcGFyc2UgdGhlIHN0cmluZyBmcm9tIHRoZSBlbmQgdG8gdGhlICcuJyBjb252ZXJ0aW5nIHRoZSBmcmFjdGlvbmFsIHBhcnQKKyAgICB7CisgICAgICBkb3VibGUgZnJhY3RQYXJ0ID0gMC4wOworICAgICAgZm9yIChpbnQgaSA9IGVuZCAtIDE7IGkgPiBwdW5jdFBvczsgaS0tKQorICAgICAgeworICAgICAgICBjaGFyIGMgPSBmc2IuY2hhckF0KGkpOworICAgICAgICBpZihDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoYykpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGMpKQorICAgICAgICB7CisgICAgICAgICAgZnJhY3RQYXJ0ID0gZnJhY3RQYXJ0IC8gMTAuMCArIChjIC0gMHgzMCk7CisgICAgICAgICAgZGlnaXRzRm91bmQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gRG91YmxlLk5hTjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXN1bHQgKz0gZnJhY3RQYXJ0IC8gMTAuMDsKKyAgICB9CisgICAgCisgICAgaWYoMCA9PSBkaWdpdHNGb3VuZCkKKyAgICAgIHJldHVybiBEb3VibGUuTmFOOworCisgICAgcmV0dXJuIHJlc3VsdCAqIHNpZ247CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvb3BlcmF0aW9ucy9WYXJpYWJsZS5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvb3BlcmF0aW9ucy9WYXJpYWJsZS5qYXZhCmluZGV4IGQxZGZiM2IuLmU1OTQ0ZGIgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL29wZXJhdGlvbnMvVmFyaWFibGUuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9vcGVyYXRpb25zL1ZhcmlhYmxlLmphdmEKQEAgLTEyNSw3ICsxMjUsNyBAQAogLy8gICAgICBlcnJvcih4Y3R4dCwgWFBBVEhFcnJvclJlc291cmNlcy5FUl9DT1VMRE5PVF9HRVRfVkFSX05BTUVELAogLy8gICAgICAgICAgICBuZXcgT2JqZWN0W117IG1fcW5hbWUuZ2V0TG9jYWxQYXJ0KCkgfSk7ICAvLyJDb3VsZCBub3QgZ2V0IHZhcmlhYmxlIG5hbWVkICIrdmFyTmFtZSk7CiAgICAgICAKLSAgICAgIHJlc3VsdCA9IG5ldyBYTm9kZVNldCgpOworICAgICAgcmVzdWx0ID0gbmV3IFhOb2RlU2V0KHhjdHh0LmdldERUTU1hbmFnZXIoKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL3BhdHRlcm5zL0FuY2VzdG9yU3RlcFBhdHRlcm4uamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL3BhdHRlcm5zL0FuY2VzdG9yU3RlcFBhdHRlcm4uamF2YQppbmRleCAzODQxZjViLi5kNzgwYWVlIDEwMDY0NAotLS0gYS9zcmMvb3JnL2FwYWNoZS94cGF0aC9wYXR0ZXJucy9BbmNlc3RvclN0ZXBQYXR0ZXJuLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvcGF0dGVybnMvQW5jZXN0b3JTdGVwUGF0dGVybi5qYXZhCkBAIC02Miw4ICs2MiwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlByZWZpeFJlc29sdmVyOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguYXhlcy5Mb2NQYXRoSXRlcmF0b3I7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CiAKIC8qKgogICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImFkdmFuY2VkIi8+CkBAIC0xNjEsMjYgKzE2MywzMCBAQAogICB7CiAKICAgICBYT2JqZWN0IHNjb3JlID0gTm9kZVRlc3QuU0NPUkVfTk9ORTsKLSAgICBOb2RlIHBhcmVudCA9IHhjdHh0LmdldEN1cnJlbnROb2RlKCk7Ci0KLSAgICB3aGlsZSAobnVsbCAhPSAocGFyZW50ID0geGN0eHQuZ2V0RE9NSGVscGVyKCkuZ2V0UGFyZW50T2ZOb2RlKHBhcmVudCkpKQorICAgIGludCBwYXJlbnQgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOworICAgIERUTSBkdG0gPSB4Y3R4dC5nZXREVE0ocGFyZW50KTsKKyAgICAKKyAgICBpZihudWxsICE9IGR0bSkKICAgICB7Ci0gICAgICB0cnkKKyAgICAgIHdoaWxlIChEVE0uTlVMTCAhPSAocGFyZW50ID0gZHRtLmdldFBhcmVudChwYXJlbnQpKSkKICAgICAgIHsKLSAgICAgICAgeGN0eHQucHVzaEN1cnJlbnROb2RlKHBhcmVudCk7Ci0KLSAgICAgICAgc2NvcmUgPSBleGVjdXRlKHhjdHh0KTsKLQotICAgICAgICBpZiAoc2NvcmUgIT0gTm9kZVRlc3QuU0NPUkVfTk9ORSkKKyAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICBzY29yZSA9IFNDT1JFX09USEVSOwotCi0gICAgICAgICAgYnJlYWs7CisgICAgICAgICAgeGN0eHQucHVzaEN1cnJlbnROb2RlKHBhcmVudCk7CisgIAorICAgICAgICAgIHNjb3JlID0gZXhlY3V0ZSh4Y3R4dCk7CisgIAorICAgICAgICAgIGlmIChzY29yZSAhPSBOb2RlVGVzdC5TQ09SRV9OT05FKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHNjb3JlID0gU0NPUkVfT1RIRVI7CisgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIHhjdHh0LnBvcEN1cnJlbnROb2RlKCk7CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgIHhjdHh0LnBvcEN1cnJlbnROb2RlKCk7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL3BhdHRlcm5zL0Z1bmN0aW9uUGF0dGVybi5qYXZhIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvcGF0dGVybnMvRnVuY3Rpb25QYXR0ZXJuLmphdmEKaW5kZXggMmM3MzQ5ZC4uZTNmY2IzMiAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvcGF0dGVybnMvRnVuY3Rpb25QYXR0ZXJuLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvcGF0dGVybnMvRnVuY3Rpb25QYXR0ZXJuLmphdmEKQEAgLTYzLDggKzYzLDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOdW1iZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3Q7CiAKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisvL2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy9pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUl0ZXJhdG9yOwogCiAvKioKICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgpAQCAtMTIwLDE4ICsxMjMsMjAgQEAKICAgcHVibGljIFhPYmplY3QgZXhlY3V0ZShYUGF0aENvbnRleHQgeGN0eHQpIHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgIHsKIAotICAgIE5vZGUgY29udGV4dCA9IHhjdHh0LmdldEN1cnJlbnROb2RlKCk7CisgICAgaW50IGNvbnRleHQgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOwogICAgIFhPYmplY3Qgb2JqID0gbV9mdW5jdGlvbkV4cHIuZXhlY3V0ZSh4Y3R4dCk7Ci0gICAgTm9kZUl0ZXJhdG9yIG5sID0gb2JqLm5vZGVzZXQoKTsKKyAgICAKKyAgICBEVE1JdGVyYXRvciBubCA9ICBvYmoubm9kZXNldCgpOworICAgIAogICAgIFhOdW1iZXIgc2NvcmUgPSBTQ09SRV9OT05FOwogCiAgICAgaWYgKG51bGwgIT0gbmwpCiAgICAgewotICAgICAgTm9kZSBuOworICAgICAgaW50IG47CiAKLSAgICAgIHdoaWxlIChudWxsICE9IChuID0gbmwubmV4dE5vZGUoKSkpCisgICAgICB3aGlsZSAoRFRNLk5VTEwgIT0gKG4gPSBubC5uZXh0Tm9kZSgpKSkKICAgICAgIHsKLSAgICAgICAgc2NvcmUgPSAobi5lcXVhbHMoY29udGV4dCkpID8gU0NPUkVfT1RIRVIgOiBTQ09SRV9OT05FOworICAgICAgICBzY29yZSA9IChuID09IGNvbnRleHQpID8gU0NPUkVfT1RIRVIgOiBTQ09SRV9OT05FOwogCiAgICAgICAgIGlmIChzY29yZSA9PSBTQ09SRV9PVEhFUikKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveHBhdGgvcGF0dGVybnMvTm9kZVRlc3QuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hwYXRoL3BhdHRlcm5zL05vZGVUZXN0LmphdmEKaW5kZXggNTg4MDkxYy4uOTJlN2YwOSAxMDA2NDQKLS0tIGEvc3JjL29yZy9hcGFjaGUveHBhdGgvcGF0dGVybnMvTm9kZVRlc3QuamF2YQorKysgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9wYXR0ZXJucy9Ob2RlVGVzdC5qYXZhCkBAIC01NiwxMSArNTYsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueHBhdGgucGF0dGVybnM7CiAKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKLQogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguY29tcGlsZXIuT3BDb2RlczsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguRE9NSGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE51bWJlcjsKQEAgLTY4LDggKzY1LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLldoaXRlc3BhY2VTdHJpcHBpbmdFbGVtZW50TWF0Y2hlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC51dGlscy5QcmVmaXhSZXNvbHZlcjsKIAotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuZHRtLkRUTUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOwogCiAvKioKICAqIDxtZXRhIG5hbWU9InVzYWdlIiBjb250ZW50PSJhZHZhbmNlZCIvPgpAQCAtOTQsMTAgKzkxLDYgQEAKICAgICovCiAgIHByb3RlY3RlZCBpbnQgbV93aGF0VG9TaG93OwogCi0gIC8qKiBUaGlzIGJpdCBzcGVjaWZpZXMgYSBuYW1lc3BhY2UsIGFuZCBleHRlbmRzIHRoZSBTSE9XX1hYWCBzdHVmZiAKLSAgICogIGluIHtAbGluayBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcn0uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfTkFNRVNQQUNFID0gMHgwMDAwMTAwMDsKLQogICAvKioKICAgICogU3BlY2lhbCBiaXRtYXAgZm9yIG1hdGNoIHBhdHRlcm5zIHN0YXJ0aW5nIHdpdGggYSBmdW5jdGlvbi4KICAgICogTWFrZSBzdXJlIHRoaXMgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCB7QGxpbmsgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXJ9LgpAQCAtMjkyLDQwICsyODUsNDAgQEAKIAogICAgIGphdmEudXRpbC5WZWN0b3IgdiA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7CiAKLSAgICBpZiAoMCAhPSAod2hhdFRvU2hvdyAmIE5vZGVGaWx0ZXIuU0hPV19BVFRSSUJVVEUpKQorICAgIGlmICgwICE9ICh3aGF0VG9TaG93ICYgRFRNRmlsdGVyLlNIT1dfQVRUUklCVVRFKSkKICAgICAgIHYuYWRkRWxlbWVudCgiU0hPV19BVFRSSUJVVEUiKTsKIAotICAgIGlmICgwICE9ICh3aGF0VG9TaG93ICYgTm9kZUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04pKQorICAgIGlmICgwICE9ICh3aGF0VG9TaG93ICYgRFRNRmlsdGVyLlNIT1dfQ0RBVEFfU0VDVElPTikpCiAgICAgICB2LmFkZEVsZW1lbnQoIlNIT1dfQ0RBVEFfU0VDVElPTiIpOwogCi0gICAgaWYgKDAgIT0gKHdoYXRUb1Nob3cgJiBOb2RlRmlsdGVyLlNIT1dfQ09NTUVOVCkpCisgICAgaWYgKDAgIT0gKHdoYXRUb1Nob3cgJiBEVE1GaWx0ZXIuU0hPV19DT01NRU5UKSkKICAgICAgIHYuYWRkRWxlbWVudCgiU0hPV19DT01NRU5UIik7CiAKLSAgICBpZiAoMCAhPSAod2hhdFRvU2hvdyAmIE5vZGVGaWx0ZXIuU0hPV19ET0NVTUVOVCkpCisgICAgaWYgKDAgIT0gKHdoYXRUb1Nob3cgJiBEVE1GaWx0ZXIuU0hPV19ET0NVTUVOVCkpCiAgICAgICB2LmFkZEVsZW1lbnQoIlNIT1dfRE9DVU1FTlQiKTsKIAotICAgIGlmICgwICE9ICh3aGF0VG9TaG93ICYgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UKSkKKyAgICBpZiAoMCAhPSAod2hhdFRvU2hvdyAmIERUTUZpbHRlci5TSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UKSkKICAgICAgIHYuYWRkRWxlbWVudCgiU0hPV19ET0NVTUVOVF9GUkFHTUVOVCIpOwogCi0gICAgaWYgKDAgIT0gKHdoYXRUb1Nob3cgJiBOb2RlRmlsdGVyLlNIT1dfRE9DVU1FTlRfVFlQRSkpCisgICAgaWYgKDAgIT0gKHdoYXRUb1Nob3cgJiBEVE1GaWx0ZXIuU0hPV19ET0NVTUVOVF9UWVBFKSkKICAgICAgIHYuYWRkRWxlbWVudCgiU0hPV19ET0NVTUVOVF9UWVBFIik7CiAKLSAgICBpZiAoMCAhPSAod2hhdFRvU2hvdyAmIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKSkKKyAgICBpZiAoMCAhPSAod2hhdFRvU2hvdyAmIERUTUZpbHRlci5TSE9XX0VMRU1FTlQpKQogICAgICAgdi5hZGRFbGVtZW50KCJTSE9XX0VMRU1FTlQiKTsKIAotICAgIGlmICgwICE9ICh3aGF0VG9TaG93ICYgTm9kZUZpbHRlci5TSE9XX0VOVElUWSkpCisgICAgaWYgKDAgIT0gKHdoYXRUb1Nob3cgJiBEVE1GaWx0ZXIuU0hPV19FTlRJVFkpKQogICAgICAgdi5hZGRFbGVtZW50KCJTSE9XX0VOVElUWSIpOwogCi0gICAgaWYgKDAgIT0gKHdoYXRUb1Nob3cgJiBOb2RlRmlsdGVyLlNIT1dfRU5USVRZX1JFRkVSRU5DRSkpCisgICAgaWYgKDAgIT0gKHdoYXRUb1Nob3cgJiBEVE1GaWx0ZXIuU0hPV19FTlRJVFlfUkVGRVJFTkNFKSkKICAgICAgIHYuYWRkRWxlbWVudCgiU0hPV19FTlRJVFlfUkVGRVJFTkNFIik7CiAKLSAgICBpZiAoMCAhPSAod2hhdFRvU2hvdyAmIE5vZGVGaWx0ZXIuU0hPV19OT1RBVElPTikpCisgICAgaWYgKDAgIT0gKHdoYXRUb1Nob3cgJiBEVE1GaWx0ZXIuU0hPV19OT1RBVElPTikpCiAgICAgICB2LmFkZEVsZW1lbnQoIlNIT1dfTk9UQVRJT04iKTsKIAotICAgIGlmICgwICE9ICh3aGF0VG9TaG93ICYgTm9kZUZpbHRlci5TSE9XX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04pKQorICAgIGlmICgwICE9ICh3aGF0VG9TaG93ICYgRFRNRmlsdGVyLlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTikpCiAgICAgICB2LmFkZEVsZW1lbnQoIlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiIpOwogCi0gICAgaWYgKDAgIT0gKHdoYXRUb1Nob3cgJiBOb2RlRmlsdGVyLlNIT1dfVEVYVCkpCisgICAgaWYgKDAgIT0gKHdoYXRUb1Nob3cgJiBEVE1GaWx0ZXIuU0hPV19URVhUKSkKICAgICAgIHYuYWRkRWxlbWVudCgiU0hPV19URVhUIik7CiAKICAgICBpbnQgbiA9IHYuc2l6ZSgpOwpAQCAtMzk0LDUzICszODcsMzIgQEAKICAgICoKICAgICogQHRocm93cyBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uCiAgICAqLwotICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCwgTm9kZSBjb250ZXh0KQorICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCwgaW50IGNvbnRleHQpCiAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24KICAgewotICAgIHNob3J0IG5vZGVUeXBlID0gY29udGV4dC5nZXROb2RlVHlwZSgpOwotICAgIAotICAgIC8vIFl1Y2shICBCbGVjaCEgIC1zYgotICAgIGlmKChOb2RlLlRFWFRfTk9ERSA9PSBub2RlVHlwZSB8fCBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA9PSBub2RlVHlwZSkgJiYgIWNvbnRleHQuaXNTdXBwb3J0ZWQoU1VQUE9SVFNfUFJFX1NUUklQUElORywgbnVsbCkpCi0gICAgewotICAgICAgTm9kZSBwYXJlbnQgPSBjb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLSAgICAgIGlmKG51bGwgIT0gcGFyZW50ICYmIE5vZGUuRUxFTUVOVF9OT0RFID09IHBhcmVudC5nZXROb2RlVHlwZSgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgZGF0YSA9IGNvbnRleHQuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIGlmKG9yZy5hcGFjaGUueG1sLnV0aWxzLlhNTENoYXJhY3RlclJlY29nbml6ZXIuaXNXaGl0ZVNwYWNlKGRhdGEpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gVWdseSB0cmljayBmb3Igbm93LgotICAgICAgICAgIFByZWZpeFJlc29sdmVyIHJlc29sdmVyID0geGN0eHQuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOwotICAgICAgICAgIGlmKHJlc29sdmVyIGluc3RhbmNlb2YgV2hpdGVzcGFjZVN0cmlwcGluZ0VsZW1lbnRNYXRjaGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFdoaXRlc3BhY2VTdHJpcHBpbmdFbGVtZW50TWF0Y2hlciB3c2VtID0gCi0gICAgICAgICAgICAgICAoV2hpdGVzcGFjZVN0cmlwcGluZ0VsZW1lbnRNYXRjaGVyKXJlc29sdmVyOwotICAgICAgICAgICAgaWYod3NlbS5zaG91bGRTdHJpcFdoaXRlU3BhY2UoeGN0eHQsIChvcmcudzNjLmRvbS5FbGVtZW50KXBhcmVudCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiBTQ09SRV9OT05FOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KKyAgICBEVE0gZHRtID0geGN0eHQuZ2V0RFRNKGNvbnRleHQpOworICAgIHNob3J0IG5vZGVUeXBlID0gZHRtLmdldE5vZGVUeXBlKGNvbnRleHQpOwogCi0gICAgaWYgKG1fd2hhdFRvU2hvdyA9PSBOb2RlRmlsdGVyLlNIT1dfQUxMKQorICAgIGlmIChtX3doYXRUb1Nob3cgPT0gRFRNRmlsdGVyLlNIT1dfQUxMKQogICAgICAgcmV0dXJuIG1fc2NvcmU7CiAKICAgICBpbnQgbm9kZUJpdCA9IChtX3doYXRUb1Nob3cgJiAoMHgwMDAwMDAwMSA8PCAobm9kZVR5cGUgLSAxKSkpOwogCiAgICAgc3dpdGNoIChub2RlQml0KQogICAgIHsKLSAgICBjYXNlIE5vZGVGaWx0ZXIuU0hPV19ET0NVTUVOVF9GUkFHTUVOVCA6Ci0gICAgY2FzZSBOb2RlRmlsdGVyLlNIT1dfRE9DVU1FTlQgOgorICAgIGNhc2UgRFRNRmlsdGVyLlNIT1dfRE9DVU1FTlRfRlJBR01FTlQgOgorICAgIGNhc2UgRFRNRmlsdGVyLlNIT1dfRE9DVU1FTlQgOgogICAgICAgcmV0dXJuIFNDT1JFX09USEVSOwotICAgIGNhc2UgTm9kZUZpbHRlci5TSE9XX0NPTU1FTlQgOgorICAgIGNhc2UgRFRNRmlsdGVyLlNIT1dfQ09NTUVOVCA6CiAgICAgICByZXR1cm4gbV9zY29yZTsKLSAgICBjYXNlIE5vZGVGaWx0ZXIuU0hPV19DREFUQV9TRUNUSU9OIDoKLSAgICBjYXNlIE5vZGVGaWx0ZXIuU0hPV19URVhUIDoKLSAgICAgIHJldHVybiAoIXhjdHh0LmdldERPTUhlbHBlcigpLnNob3VsZFN0cmlwU291cmNlTm9kZShjb250ZXh0KSkKLSAgICAgICAgICAgICA/IG1fc2NvcmUgOiBTQ09SRV9OT05FOwotICAgIGNhc2UgTm9kZUZpbHRlci5TSE9XX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04gOgotICAgICAgcmV0dXJuIHN1YlBhcnRNYXRjaChjb250ZXh0LmdldE5vZGVOYW1lKCksIG1fbmFtZSkKKyAgICBjYXNlIERUTUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04gOgorICAgIGNhc2UgRFRNRmlsdGVyLlNIT1dfVEVYVCA6CisgICAgICAvLyB3YXM6IAorICAgICAgLy8gcmV0dXJuICgheGN0eHQuZ2V0RE9NSGVscGVyKCkuc2hvdWxkU3RyaXBTb3VyY2VOb2RlKGNvbnRleHQpKQorICAgICAgLy8gICAgICAgPyBtX3Njb3JlIDogU0NPUkVfTk9ORTsKKyAgICAgIHJldHVybiBtX3Njb3JlOworICAgIGNhc2UgRFRNRmlsdGVyLlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiA6CisgICAgICByZXR1cm4gc3ViUGFydE1hdGNoKGR0bS5nZXROb2RlTmFtZShjb250ZXh0KSwgbV9uYW1lKQogICAgICAgICAgICAgID8gbV9zY29yZSA6IFNDT1JFX05PTkU7CiAKICAgICAvLyBGcm9tIHRoZSBkcmFmdDogIlR3byBleHBhbmRlZCBuYW1lcyBhcmUgZXF1YWwgaWYgdGhleSAKQEAgLTQ1NSwzNyArNDI3LDE3IEBACiAgICAgLy8gbmFtZXNwYWNlIGRlY2xhcmF0aW9ucy4gVGhlIG5vZGUgdGVzdCB3aWxsIGJlIHRydWUgZm9yIGFueSBub2RlIAogICAgIC8vIG9mIHRoZSBwcmluY2lwYWwgdHlwZSB3aG9zZSBleHBhbmRlZCBuYW1lIGhhcyB0aGUgVVJJIHRvIHdoaWNoIAogICAgIC8vIHRoZSBwcmVmaXggZXhwYW5kcywgcmVnYXJkbGVzcyBvZiB0aGUgbG9jYWwgcGFydCBvZiB0aGUgbmFtZS4iCi0gICAgY2FzZSBOb2RlRmlsdGVyLlNIT1dfQVRUUklCVVRFIDoKKyAgICBjYXNlIERUTUZpbHRlci5TSE9XX05BTUVTUEFDRSA6CiAgICAgewotICAgICAgaW50IGlzTmFtZXNwYWNlID0gKG1fd2hhdFRvU2hvdyAmIFNIT1dfTkFNRVNQQUNFKTsKKyAgICAgIFN0cmluZyBucyA9IGR0bS5nZXROb2RlVmFsdWUoY29udGV4dCk7CiAKLSAgICAgIGlmICgwID09IGlzTmFtZXNwYWNlKQotICAgICAgewotICAgICAgICBET01IZWxwZXIgZGggPSB4Y3R4dC5nZXRET01IZWxwZXIoKTsKLQotICAgICAgICBpZiAoIWRoLmlzTmFtZXNwYWNlTm9kZShjb250ZXh0KSkKLSAgICAgICAgICByZXR1cm4gKG1faXNUb3RhbGx5V2lsZCB8fCAoc3ViUGFydE1hdGNoTlMoZGguZ2V0TmFtZXNwYWNlT2ZOb2RlKGNvbnRleHQpLCBtX25hbWVzcGFjZSkgJiYgc3ViUGFydE1hdGNoKGRoLmdldExvY2FsTmFtZU9mTm9kZShjb250ZXh0KSwgbV9uYW1lKSkpCi0gICAgICAgICAgICAgICAgID8gbV9zY29yZSA6IFNDT1JFX05PTkU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gU0NPUkVfTk9ORTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHhjdHh0LmdldERPTUhlbHBlcigpLmlzTmFtZXNwYWNlTm9kZShjb250ZXh0KSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBucyA9IGNvbnRleHQuZ2V0Tm9kZVZhbHVlKCk7Ci0KLSAgICAgICAgICByZXR1cm4gKHN1YlBhcnRNYXRjaChucywgbV9uYW1lKSkgPyBtX3Njb3JlIDogU0NPUkVfTk9ORTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuIFNDT1JFX05PTkU7Ci0gICAgICB9CisgICAgICByZXR1cm4gKHN1YlBhcnRNYXRjaChucywgbV9uYW1lKSkgPyBtX3Njb3JlIDogU0NPUkVfTk9ORTsKICAgICB9Ci0gICAgY2FzZSBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCA6CisgICAgY2FzZSBEVE1GaWx0ZXIuU0hPV19BVFRSSUJVVEUgOgorICAgIGNhc2UgRFRNRmlsdGVyLlNIT1dfRUxFTUVOVCA6CiAgICAgewotICAgICAgRE9NSGVscGVyIGRoID0geGN0eHQuZ2V0RE9NSGVscGVyKCk7Ci0KLSAgICAgIHJldHVybiAobV9pc1RvdGFsbHlXaWxkIHx8IChzdWJQYXJ0TWF0Y2hOUyhkaC5nZXROYW1lc3BhY2VPZk5vZGUoY29udGV4dCksIG1fbmFtZXNwYWNlKSAmJiBzdWJQYXJ0TWF0Y2goZGguZ2V0TG9jYWxOYW1lT2ZOb2RlKGNvbnRleHQpLCBtX25hbWUpKSkKKyAgICAgIHJldHVybiAobV9pc1RvdGFsbHlXaWxkIHx8IChzdWJQYXJ0TWF0Y2hOUyhkdG0uZ2V0TmFtZXNwYWNlVVJJKGNvbnRleHQpLCBtX25hbWVzcGFjZSkgCisgICAgICAgICAgICYmIHN1YlBhcnRNYXRjaChkdG0uZ2V0TG9jYWxOYW1lKGNvbnRleHQpLCBtX25hbWUpKSkKICAgICAgICAgICAgICA/IG1fc2NvcmUgOiBTQ09SRV9OT05FOwogICAgIH0KICAgICBkZWZhdWx0IDoKQEAgLTUwOSw3ICs0NjEsNiBAQAogICBwdWJsaWMgWE9iamVjdCBleGVjdXRlKFhQYXRoQ29udGV4dCB4Y3R4dCkKICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7Ci0KICAgICByZXR1cm4gZXhlY3V0ZSh4Y3R4dCwgeGN0eHQuZ2V0Q3VycmVudE5vZGUoKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL3BhdHRlcm5zL1N0ZXBQYXR0ZXJuLmphdmEgYi9zcmMvb3JnL2FwYWNoZS94cGF0aC9wYXR0ZXJucy9TdGVwUGF0dGVybi5qYXZhCmluZGV4IGMwYzczMzguLjJiNzZlOWMgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL3BhdHRlcm5zL1N0ZXBQYXR0ZXJuLmphdmEKKysrIGIvc3JjL29yZy9hcGFjaGUveHBhdGgvcGF0dGVybnMvU3RlcFBhdHRlcm4uamF2YQpAQCAtNjMsOSArNjMsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLmF4ZXMuU3ViQ29udGV4dExpc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5jb21waWxlci5Qc3VlZG9OYW1lczsKIAotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKKy8vIGltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKKy8vIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworLy8gaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5kdG0uRFRNOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5EVE1GaWx0ZXI7CiAKIC8qKgogICogPG1ldGEgbmFtZT0idXNhZ2UiIGNvbnRlbnQ9ImFkdmFuY2VkIi8+CkBAIC04NCw3ICs4Nyw3IEBACiAgICAqLwogICBwdWJsaWMgU3RlcFBhdHRlcm4oaW50IHdoYXRUb1Nob3csIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQogICB7Ci0gICAgCisKICAgICBzdXBlcih3aGF0VG9TaG93LCBuYW1lc3BhY2UsIG5hbWUpOwogICB9CiAKQEAgLTExNiwyMiArMTE5LDIyIEBACiAKICAgICBzd2l0Y2ggKHdoYXRUb1Nob3cpCiAgICAgewotICAgIGNhc2UgTm9kZUZpbHRlci5TSE9XX0NPTU1FTlQgOgorICAgIGNhc2UgRFRNRmlsdGVyLlNIT1dfQ09NTUVOVCA6CiAgICAgICBtX3RhcmdldFN0cmluZyA9IFBzdWVkb05hbWVzLlBTRVVET05BTUVfQ09NTUVOVDsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgTm9kZUZpbHRlci5TSE9XX1RFWFQgOgotICAgIGNhc2UgTm9kZUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04gOgotICAgIGNhc2UgKE5vZGVGaWx0ZXIuU0hPV19URVhUIHwgTm9kZUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04pOgorICAgIGNhc2UgRFRNRmlsdGVyLlNIT1dfVEVYVCA6CisgICAgY2FzZSBEVE1GaWx0ZXIuU0hPV19DREFUQV9TRUNUSU9OIDoKKyAgICBjYXNlIChEVE1GaWx0ZXIuU0hPV19URVhUIHwgRFRNRmlsdGVyLlNIT1dfQ0RBVEFfU0VDVElPTik6CiAgICAgICBtX3RhcmdldFN0cmluZyA9IFBzdWVkb05hbWVzLlBTRVVET05BTUVfVEVYVDsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgTm9kZUZpbHRlci5TSE9XX0FMTCA6CisgICAgY2FzZSBEVE1GaWx0ZXIuU0hPV19BTEwgOgogICAgICAgbV90YXJnZXRTdHJpbmcgPSBQc3VlZG9OYW1lcy5QU0VVRE9OQU1FX0FOWTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UIDoKLSAgICBjYXNlIE5vZGVGaWx0ZXIuU0hPV19ET0NVTUVOVCB8IE5vZGVGaWx0ZXIuU0hPV19ET0NVTUVOVF9GUkFHTUVOVCA6CisgICAgY2FzZSBEVE1GaWx0ZXIuU0hPV19ET0NVTUVOVCA6CisgICAgY2FzZSBEVE1GaWx0ZXIuU0hPV19ET0NVTUVOVCB8IERUTUZpbHRlci5TSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UIDoKICAgICAgIG1fdGFyZ2V0U3RyaW5nID0gUHN1ZWRvTmFtZXMuUFNFVURPTkFNRV9ST09UOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCA6CisgICAgY2FzZSBEVE1GaWx0ZXIuU0hPV19FTEVNRU5UIDoKICAgICAgIGlmICh0aGlzLldJTEQgPT0gbV9uYW1lKQogICAgICAgICBtX3RhcmdldFN0cmluZyA9IFBzdWVkb05hbWVzLlBTRVVET05BTUVfQU5ZOwogICAgICAgZWxzZQpAQCAtMzQ0LDEwICszNDcsMTIgQEAKICAgcHVibGljIGludCBnZXRQcm94aW1pdHlQb3NpdGlvbihYUGF0aENvbnRleHQgeGN0eHQpCiAgIHsKIAotICAgIE5vZGUgY29udGV4dCA9IHhjdHh0LmdldEN1cnJlbnROb2RlKCk7CisgICAgaW50IGNvbnRleHQgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOworICAgIAorICAgIERUTSBkdG0gPSB4Y3R4dC5nZXREVE0oY29udGV4dCk7CiAKICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRleHQ6ICIrY29udGV4dC5nZXROb2RlTmFtZSgpKTsKLSAgICBOb2RlIHBhcmVudENvbnRleHQgPSB4Y3R4dC5nZXRET01IZWxwZXIoKS5nZXRQYXJlbnRPZk5vZGUoY29udGV4dCk7CisgICAgaW50IHBhcmVudENvbnRleHQgPSBkdG0uZ2V0UGFyZW50KGNvbnRleHQpOwogCiAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJwYXJlbnRDb250ZXh0OiAiK3BhcmVudENvbnRleHQuZ2V0Tm9kZU5hbWUoKSk7CiAgICAgdHJ5CkBAIC0zNTYsOCArMzYxLDggQEAKIAogICAgICAgaW50IHBvcyA9IDA7CiAKLSAgICAgIGZvciAoTm9kZSBjaGlsZCA9IHBhcmVudENvbnRleHQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOwotICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCisgICAgICBmb3IgKGludCBjaGlsZCA9IGR0bS5nZXRGaXJzdENoaWxkKHBhcmVudENvbnRleHQpOyBjaGlsZCAhPSBEVE0uTlVMTDsKKyAgICAgICAgICAgICAgY2hpbGQgPSBkdG0uZ2V0TmV4dFNpYmxpbmcoY2hpbGQpKQogICAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewpAQCAtMzY3LDcgKzM3Miw3IEBACiAgICAgICAgICAgewogICAgICAgICAgICAgcG9zKys7CiAKLSAgICAgICAgICAgIGlmIChjaGlsZC5lcXVhbHMoY29udGV4dCkpCisgICAgICAgICAgICBpZiAoY2hpbGQgPT0gY29udGV4dCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgcmV0dXJuIHBvczsKICAgICAgICAgICAgIH0KQEAgLTQwOSw4ICs0MTQsOSBAQAogICBwdWJsaWMgaW50IGdldExhc3RQb3MoWFBhdGhDb250ZXh0IHhjdHh0KQogICB7CiAKLSAgICBOb2RlIGNvbnRleHQgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOwotICAgIE5vZGUgcGFyZW50Q29udGV4dCA9IHhjdHh0LmdldERPTUhlbHBlcigpLmdldFBhcmVudE9mTm9kZShjb250ZXh0KTsKKyAgICBpbnQgY29udGV4dCA9IHhjdHh0LmdldEN1cnJlbnROb2RlKCk7CisgICAgRFRNIGR0bSA9IHhjdHh0LmdldERUTShjb250ZXh0KTsKKyAgICBpbnQgcGFyZW50Q29udGV4dCA9IGR0bS5nZXRQYXJlbnQoY29udGV4dCk7CiAKICAgICB0cnkKICAgICB7CkBAIC00MTgsOCArNDI0LDggQEAKIAogICAgICAgaW50IGNvdW50ID0gMDsKIAotICAgICAgZm9yIChOb2RlIGNoaWxkID0gcGFyZW50Q29udGV4dC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7Ci0gICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKKyAgICAgIGZvciAoaW50IGNoaWxkID0gZHRtLmdldEZpcnN0Q2hpbGQocGFyZW50Q29udGV4dCk7IGNoaWxkICE9IERUTS5OVUxMOworICAgICAgICAgICAgICBjaGlsZCA9IGR0bS5nZXROZXh0U2libGluZyhjaGlsZCkpCiAgICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7CkBAIC00NjksMTAgKzQ3NSwxMSBAQAogICB7CiAKICAgICBYT2JqZWN0IHNjb3JlOwotICAgIE5vZGUgcGFyZW50ID0KLSAgICAgIHhjdHh0LmdldERPTUhlbHBlcigpLmdldFBhcmVudE9mTm9kZSh4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpKTsKKyAgICBpbnQgY3VycmVudE5vZGUgPSB4Y3R4dC5nZXRDdXJyZW50Tm9kZSgpOworICAgIERUTSBkdG0gPSB4Y3R4dC5nZXREVE0oY3VycmVudE5vZGUpOworICAgIGludCBwYXJlbnQgPSBkdG0uZ2V0UGFyZW50KGN1cnJlbnROb2RlKTsKIAotICAgIGlmIChudWxsICE9IHBhcmVudCkKKyAgICBpZiAoRFRNLk5VTEwgIT0gcGFyZW50KQogICAgIHsKICAgICAgIHRyeQogICAgICAgewpAQCAtNTQyLDcgKzU0OSw3IEBACiAgICAqCiAgICAqIEB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXRNYXRjaFNjb3JlKFhQYXRoQ29udGV4dCB4Y3R4dCwgTm9kZSBjb250ZXh0KQorICBwdWJsaWMgZG91YmxlIGdldE1hdGNoU2NvcmUoWFBhdGhDb250ZXh0IHhjdHh0LCBpbnQgY29udGV4dCkKICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbgogICB7CiAKZGlmZiAtLWdpdCBhL3NyYy9vcmcvdzNjL2RvbS90cmF2ZXJzYWwvTm9kZUl0ZXJhdG9yLmphdmEgYi9zcmMvb3JnL3czYy9kb20vdHJhdmVyc2FsL05vZGVJdGVyYXRvci5qYXZhCmluZGV4IDEwMzVmYWYuLjI4ZWJiM2IgMTAwNjQ0Ci0tLSBhL3NyYy9vcmcvdzNjL2RvbS90cmF2ZXJzYWwvTm9kZUl0ZXJhdG9yLmphdmEKKysrIGIvc3JjL29yZy93M2MvZG9tL3RyYXZlcnNhbC9Ob2RlSXRlcmF0b3IuamF2YQpAQCAtMTA0LDUgKzEwNCw3IEBACiAgICAgICogcmFpc2UgdGhlIGV4Y2VwdGlvbiBJTlZBTElEX1NUQVRFX0VSUi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkZXRhY2goKTsKKyAgICAKKwogCiB9CmRpZmYgLS1naXQgYS9zcmMvdHJheC90cmF4LnByb3BlcnRpZXMgYi9zcmMvdHJheC90cmF4LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OTNjMzkuLjAwMDAwMDAKLS0tIGEvc3JjL3RyYXgvdHJheC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyAkUmV2aXNpb24kICREYXRlJAotIwotIyBOb3RlOiBUaGlzIHByb3BlcnRpZXMgZmlsZSBpcyBwcm92aWRlZCBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzCi0jICAgICAgIG9ubHkgYW5kIGlzIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSMgICAgICAgVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaXMgbG9jYXRlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gSkFSCi0jICAgICAgIGFuZCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIHdpbGwgc3BlY2lmeSBkaWZmZXJlbnQKLSMgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBhbmQgb3V0cHV0IG1ldGhvZHMuCi0jCi0KLSMgVGhlIFRSYVggU3R5bGVzaGVldCBwcm9jZXNzb3IKLXRyYXgucHJvY2Vzc29yLnhzbHQ9b3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuU3R5bGVzaGVldFByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvdG9kby54bWwgYi90b2RvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkZTBmOC4uMDAwMDAwMAotLS0gYS90b2RvLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHRvZG8gdGl0bGU9IlRoaW5ncyBUbyBEbyIgcHJvamVjdD0iWGFsYW4iIG1ham9yLXZlcnNpb249IjIiPgotCi0gPGRldnM+Ci0gIDwhLS0gaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBieSBsYXN0IG5hbWUgLS0+Ci0gIDxwZXJzb24gbmFtZT0iU2NvdHQgQm9hZyIgZW1haWw9InNjb3R0X2JvYWdAbG90dXMuY29tIiBpZD0iU0IiIGV4cGVydGlzZT0iY29kZSI+Ci0gICAgWGFsYW4gYXJjaGl0ZWN0LCBsZWFkIGRldmVsb3BlciBvbiBYYWxhbi1KIDIueC4KLSAgPC9wZXJzb24+Ci0gIDxwZXJzb24gbmFtZT0iU2hhbmUgQ3VyY3VydSIgZW1haWw9IlNoYW5lX0N1cmN1cnVAbG90dXMuY29tIiBpZD0iU0MiIGV4cGVydGlzZT0idGVzdCI+Ci0gICAgTGVhZCB0ZXN0ZXIgZm9yIEFQSSBpc3N1ZXMsIGF1dG9tYXRpb24gZnJhbWV3b3JrLgotICA8L3BlcnNvbj4KLSAgPHBlcnNvbiBuYW1lPSJQYXVsIERpY2siIGVtYWlsPSJQYXVsX0RpY2tAbG90dXMuY29tIiBpZD0iUEQiIGV4cGVydGlzZT0idGVzdCI+Ci0gICAgWFNMVCBDb25mb3JtYW5jZSBzdHlsZXNoZWV0IGlzc3VlcyBhbmQgWGFsYW4tQyB0ZXN0aW5nLgotICA8L3BlcnNvbj4KLSAgPHBlcnNvbiBuYW1lPSJKb3NlcGggS2Vzc2VsbWFuIiBlbWFpbD0iSm9zZXBoX0tlc3NlbG1hbkBsb3R1cy5jb20iIGlkPSJKSyIgZXhwZXJ0aXNlPSJjb2RlIj4KLSAgICBYYWxhbi1KIDIueCBkZXZlbG9wZXIsIGNvbXBpbGluZy9jb21waWxlZCBzdHlsZXNoZWV0cyBleHBlcmltZW50cy4KLSAgPC9wZXJzb24+Ci0gIDxwZXJzb24gbmFtZT0iRG9uYWxkIExlc2xpZSIgZW1haWw9ImRvbmFsZF9sZXNsaWVAbG90dXMuY29tIiBpZD0iREwiIGV4cGVydGlzZT0iZG9jIj4KLSAgICBYYWxhbi1KIGFuZCAtQyBkb2N1bWVudGF0aW9uLCBzZXJ2bGV0cyBhbmQgc2FtcGxlcy4KLSAgPC9wZXJzb24+Ci0gIDxwZXJzb24gbmFtZT0iQ29zdGluIE1hbm9sYWNoZSIgZW1haWw9ImNtYW5vbGFjaGVAeWFob28uY29tIiBpZD0iQ00iPgotICAgIFhhbGFuLUogMi54IGRldmVsb3Blci4KLSAgPC9wZXJzb24+Ci0gIDxwZXJzb24gbmFtZT0iRGF2aWQgTWFyc3RvbiIgZW1haWw9IkRhdmlkX01hcnN0b25AbG90dXMuY29tIiBpZD0iRE0iIGV4cGVydGlzZT0idGVzdCI+Ci0gICAgTGVhZCB0ZXN0ZXIgZm9yIFhTTFQgQ29uZm9ybWFuY2Ugc3R5bGVzaGVldCBpc3N1ZXMuCi0gIDwvcGVyc29uPgotICA8cGVyc29uIG5hbWU9Ik15cmlhbSBNaWR5IiBlbWFpbD0ibXlyaWFtX21pZHlAbG90dXMuY29tIiBpZD0iTU0iIGV4cGVydGlzZT0iY29kZSI+Ci0gICAgWGFsYW4tSiAxLnggYW5kIDIueCBkZXZlbG9wZXIuCi0gIDwvcGVyc29uPgotICA8cGVyc29uIG5hbWU9IkdhcnkgTCBQZXNraW4iIGVtYWlsPSJnYXJ5cEBmaXJzdGVjaC5jb20iIGlkPSJHUCIgZXhwZXJ0aXNlPSJjb2RlIj4KLSAgICBYYWxhbi1KIDEueCBhbmQgMi54IGRldmVsb3BlciwgZXNwZWNpYWxseSBleHRlbnNpb24gbWVjaGFuaXNpbS4KLSAgPC9wZXJzb24+Ci0KLSA8L2RldnM+Ci0KLSA8YWN0aW9ucz4KLQotICAgPHRhcmdldC1yZWxlYXNlLWRlc2NyaXB0aW9uPgotICAgIDxkYXRlPjAxLzE5LzAxPC9kYXRlPgotICAgIDxsZXZlbD5wcm9kdWN0aW9uPC9sZXZlbD4KLSAgICA8Z29hbCB0eXBlPSJjb25mb3JtYW5jZSI+WFNMVCAxLjAgYW5kIFhQYXRoIDEuMCBjb21wbGlhbnQsIDk5JSBjb25mb3JtYW5jZSB0ZXN0IHBhc3NhZ2UuPC9nb2FsPgotICAgIDxnb2FsIHR5cGU9InBlcmZvcm1hbmNlIj5SZWFzb25hYmxlLCBjb21wZXRhdGl2ZSBwZXJmb3JtYW5jZS4gW25lZWQgbWV0cmljc108L2dvYWw+Ci0gICAgPGdvYWwgdHlwZT0ic3RhYmlsaXR5Ij5Sb2J1c3QuPC9nb2FsPgotICAgIDxnb2FsIHR5cGU9ImFwaSI+QVBJIENvbXBsZXRlLjwvZ29hbD4KLSAgICA8Z29hbCB0eXBlPSJkb2N1bWVudGF0aW9uIj5Eb2N1bWVudGF0aW9uIGNvbXBsZXRlLjwvZ29hbD4KLSAgIDwvdGFyZ2V0LXJlbGVhc2UtZGVzY3JpcHRpb24+Ci0KLSAgPCEtLSBNb3ZlIHRvIGNvbXBsZXRlZCBzZWN0aW9uIHdoZW4gZG9uZS4gLS0+Ci0gICAgICAgICAgICAKLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9InJlbGVhc2UiPgotICAgICAgTm8ga25vd24gYWN0aW9ucyBwZW5kaW5nIGZvciAyLjAuMCByZWxlYXNlLgotICAgPC9hY3Rpb24+Ci0gIAotIDwvYWN0aW9ucz4KLQotIDxhY3Rpb25zIHByaW9yaXR5PSJsb25nLXRlcm0iID4KLSAgPCEtLSBNb3ZlIHRvIGNvbXBsZXRlZCBzZWN0aW9uIHdoZW4gZG9uZS4gLS0+Ci0KLSAgIDx0YXJnZXQtcmVsZWFzZS1kZXNjcmlwdGlvbj4KLSAgICA8ZGF0ZT40LzE1LzAxPC9kYXRlPgotICAgIDxsZXZlbD5iZXRhPC9sZXZlbD4KLSAgICA8Z29hbCB0eXBlPSJjb25mb3JtYW5jZSI+WFNMVCAxLjEgYW5kIFhQYXRoIDEuMCthZGRlbmR1bSBjb21wbGlhbnQsIDEwMCUgY29uZm9ybWFuY2UgdGVzdCBwYXNzYWdlLjwvZ29hbD4KLSAgICA8Z29hbCB0eXBlPSJwZXJmb3JtYW5jZSI+VmVyeSBnb29kIHBlcmZvcm1hbmNlLiBbbmVlZCBtZXRyaWNzXTwvZ29hbD4KLSAgICA8Z29hbCB0eXBlPSJzdGFiaWxpdHkiPlN0YWJsZSwgcmVhc29uYWJsZS48L2dvYWw+Ci0gICAgPGdvYWwgdHlwZT0iYXBpIj5BUEkgQ29tcGxldGUuPC9nb2FsPgotICAgIDxnb2FsIHR5cGU9ImRvY3VtZW50YXRpb24iPkRvY3VtZW50YXRpb24gZnVuY3Rpb25hbGx5IGNvbXBsZXRlLjwvZ29hbD4KLSAgIDwvdGFyZ2V0LXJlbGVhc2UtZGVzY3JpcHRpb24+Ci0gICAKLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImNvbmZvcm1hbmNlIiB3aG89IkdQIj4KLSAgICAgIFZlcmlmeSB0aGF0IHRoZSByZWNvbXBvc2luZyBwcm9jZWR1cmUgZm9yIGVhY2ggb2YgdGhlIHJlY29tcG9zYWJsZQotICAgICAgZWxlbWVudHMgbWF0Y2hlcyB0aGUgc3RhbmRhcmQgKGluY2x1ZGluZyBlcnJhdGEpLgotICAgPC9hY3Rpb24+Ci0KLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImNvbmZvcm1hbmNlIiB3aG89IkdQIj4KLSAgICAgIEZpeCB4c2w6b3V0cHV0IG1ldGhvZD0gc28gdGhhdCBpdCBvbmx5IGFjY2VwdHMgdmFsaWQgdmFsdWVzIHBlciB0aGUKLSAgICAgIHN0YW5kYXJkICh4bWwsIGh0bWwsIHRleHQsIHFuYW1lLXRoYXQtaXMtbm90LWFuLW5jbmFtZSkuICBJJ20gbG9va2luZwotICAgICAgaW50byB3aGVyZSB0aGlzIGNoYW5nZSBzaG91bGQgYmUgbWFkZS4KLSAgIDwvYWN0aW9uPgotCi0gICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJjb25mb3JtYW5jZSIgd2hvPSJHUCI+Ci0gICAgICBWZXJpZnkgdGhhdCB0aGUgZWxlbWVudC1hdmFpbGFibGUgZnVuY3Rpb24gZXhoaWJpdHMgdGhlIHByb3BlcgotICAgICAgYmVoYXZpb3IgYWNjb3JkaW5nIHRvIEVycmF0YSBFNyByZWdhcmRpbmcgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlCi0gICAgICBkZWZhdWx0IG5hbWVzcGFjZSBhbmQgdGhlIGVsZW1lbnQtYXZhaWxhYmxlIGZ1bmN0aW9uLgotICAgPC9hY3Rpb24+Ci0KLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImV4dGVuc2lvbnMiIHdobz0iR1AiPgotICAgICAgQWRkIGNvbXBhdGliaWxpdHkgd2l0aCBYYWxhbkoxIE5vZGVTZXQgZXh0ZW5zaW9uLCBzbyB0aGF0IHN0eWxlaHNoZWV0cyAKLSAgICAgIGNhbiB3b3JrIHdpdGggYm90aCBwcm9jZXNzb3JzLgotICAgPC9hY3Rpb24+Ci0KLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImJ1ZyIgd2hvPSJTQiI+Ci0gICAgSGFuZGxlIHFOYW1lIHBhcmFtdGVyZXIgdG8gdGhlIENvbnRlbnRIYW5kbGVyIG1ldGhvZHMgYmVpbmcgYW4gZW1wdHkgc3RyaW5nLgotICAgIFNlZSBub3RlIGZyb20gbWlrYWVsQGluZ2VuLnJla2xhbS5zdGFsZGFsLm51IChNaWthZWwgU3TlbGRhbCksIDAxLzAxLzIwMDEgMDk6NDIgQU0uCi0gICA8L2FjdGlvbj4KLQotICAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiIHdobz0iU0IiPgotICAgIE9wdGltaXplICIuIiBwYXR0ZXJucyB0byBiZSB1bHRyYSBzaW1wbGUgaXRlcmF0b3IuCi0gICA8L2FjdGlvbj4KLQotICAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiIHdobz0iU0IiPgotICAgIE9wdGltaXplICIvZm9vL2JheiIgcGF0dGVybnMgdGhhdCBoYXZlIG5vIHZhcmlhYmlsaXR5LCB0byBhIGdsb2JhbCBzcGFjZSwgCi0gICAgYW5kIGRvbid0IHJlLWV2YWx1YXRlIGVhY2ggdGltZS4KLSAgIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImZlYXR1cmUiPgotICAgIERvbiBwdWJsaXNoZWQgYSBsaXN0IG9mIHByb3Bvc2VkIGV4dGVuc2lvbnMgYSB3aGlsZSBhZ28uCi0gICAgSSB3b3VsZCByZWFsbHkgbGlrZSB0byBnZXQgdGhlc2UgaW1wbGVtZW50ZWQuICBUaGlzIGlzIGEgZ29vZAotICAgIGFyZWEgZm9yIHBhcnQtdGltZSBjb250cmlidXRlcnMsIGFzIHRoZSBleHRlbnNpb25zIGhhdmUgbGltaXRlZCBzY29wZS4KLSAgPC9hY3Rpb24+Ci0KLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiPgotICAgIEpvZSBjb3VsZCB1c2UgaGVscCB3aXRoIHRoZSBzdHlsZXNoZWV0IGNvbXBpbGVyIHN0dWZmLgotICAgIExvdHMgb2Ygd29yayB0byBiZSBkb25lIHRoZXJlLiAgSW4gcGFydGljdWxhciwgSSB3b3VsZCBsaWtlIHRvCi0gICAgZmlndXJlIG91dCBob3cgdG8gaW5saW5lIHNvbWUgc2ltcGxlIGl0dGVyYXRvciBvcGVyYXRpb25zLAotICAgIGxpa2Ugc2VsZWN0PSJub2RlKCkiIGFuZCBzZWxlY3Q9ImZvbyIuICBBbHNvLCB3ZSBuZWVkIHRvIGZpZ3VyZQotICAgIG91dCBob3cgdG8gYW5hbHl6ZSBhIHBhcnRpY3VsYXIgc3R5bGVzaGVldCdzIGRlcGVuZGVuY2llcywgYW5kCi0gICAgYmUgYWJsZSB0byBwYWNrYWdlIGp1c3QgdGhvc2UgY2xhc3NlcyBpbiBhIGphciwgYWxvbmcgd2l0aCB0aGUKLSAgICBjb21waWxlZCBjbGFzc2VzLgotICAgIDxpc3N1ZSBpZD0iaXNzdWUtY29tcGlsZXItZm9yLWphbnVhcnktcmVsZWFzZSI+SSBzdXNwZWN0IGl0IGlzIHVubGlrZWx5IHRoaXMKLSAgICB3aWxsIGJlIHJlYWR5IGluIHRpbWUgZm9yIHRoaXMgcmVsZWFzZS48L2lzc3VlPgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9InRlc3QiIGNhdGVnb3J5PSJmZWF0dXJlIiBwcmlvcml0eT0iaGlnaCI+Ci0gICAgQHRvZG8gbmVlZCB0byBmaW5kIGFuIEhUTUwgdG8gRE9NIHBhcnNlciB3ZSBjYW4gdXNlISEKLSAgICBHZXQgYSBnb29kLCBhcGFjaGUtbGljZW5zZWQgSFRNTC10by1ET00gcGFyc2VyIGNoZWNrZWQgaW50byB0aGUgCi0gICAgeG1sLXhhbGFuXHRlc3RcamF2YSByZXBvc2l0b3J5LCBmb3IgdXNlIGJ5IG9yZy5hcGFjaGUucWV0ZXN0LnhzbC5YSFRDb21wYXJhdG9yCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0idGVzdCIgY2F0ZWdvcnk9InRlc3RzIiBwcmlvcml0eT0ibWVkaXVtIj4KLSAgICBHZXQgbW9yZSByZWFsLXdvcmxkIHN0eWxlc2hlZXRzIGNoZWNrZWQgaW50byB4bWwteGFsYW5cdGVzdFx0ZXN0c1xjb250cmliLgotICAgIFdlIG5lZWQgbW9yZSByZWFsLWxpZmUgZXhhbXBsZXMgb2YgaG93IHBlb3BsZSBhcmUgdXNpbmcgc3R5bGVzaGVldHMsIGFsb25nIAotICAgIHdpdGggZXhwZWN0ZWQgb3V0cHV0cyAoaW4gY29udHJpYi1nb2xkKSAtIHdlIGNhbiB0aGVuIHJ1biBvdXIgdGVzdCBkcml2ZXIgCi0gICAgb3ZlciB0aGUgd2hvbGUgc2V0IG9mIHRoZW0gZWFzaWx5IHRvIGdldCBtb3JlIHRlc3QgcG9pbnRzLgotICAgIE5vdGU6IHBsZWFzZSBmZWVsIGZyZWUgdG8gY29udHJpYnV0ZSB0ZXN0cyBoZXJlIC0gdGhlIGNvbW1pdHRlcnMgCi0gICAgd2lsbCByZXZpZXcgYW5kIG1vdmUgdGVzdHMgaW50byBjb25mb3JtYW5jZSwgcHJvZHVjdCwgZXRjLiB0ZXN0IAotICAgIGFyZWFzIGFzIG5lZWRlZCwgYnV0IHdlIGNhbiBhbHdheXMganVzdCBydW4gQ29udHJpYlRlc3Qgb24gYW55IHRlc3RzLgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9InRlc3QiIGNhdGVnb3J5PSJ0ZXN0cyIgcHJpb3JpdHk9ImhpZ2giPgotICAgIEdldCBleHRlbnNpb24gdGVzdHMgY2hlY2tlZCBpbnRvIHhtbC14YWxhblx0ZXN0XHRlc3RzXGV4dGVuZAotICAgIFdlIGhhdmUgc29tZSBhdCBMb3R1cyB3ZSBuZWVkIHRvIGNsZWFudXAgYW5kIGNoZWNraW4sIGFuZCB3ZSAKLSAgICBob3BlIHRvIGdldCBtb3JlIGV4YW1wbGVzIGZyb20gR2FyeSBhbmQgb3RoZXIgbGlzdCBtZW1iZXJzLgotICA8L2FjdGlvbj4KLSAgIAotICAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiIHdobz0iU0IiPgotICAgIERlbGV0ZSBub2RlcyBpbiB0aGUgc291cmNlIHRyZWUgd2hlbiBwb3NzaWJsZS4gICg/PyBOb3RlIHN1cmUgaWYgdGhpcyAKLSAgICBpcyBkby1hYmxlIGJ5IGJldGEyLikKLSAgICA8cHN1ZWRvLWNvZGU+Ci0gICAgICAxKSBGb3IgZWFjaCBleHByZXNzaW9uLCB0ZWxsIGlmIGV4cHJlc3Npb24gY2FuIHRyYXZlcnNlIG91dHNpZGUgaXQncyAKLSAgICAgICAgIHN1YnRyZWUuCi0gICAgICAyKSBGb3IgZWFjaCBlbGVtZW50LCB0ZWxsIGlmIGFueSBmb2xsb3dpbmcgZWxlbWVudHMgbWF5IG5lZWQgdG8gIAotICAgICAgICAgYWNjZXNzIHRoYXQgbm9kZS4KLSAgICAgIDMpIEluIGluc3RydWN0aW9ucyB0aGF0IHRyYXZlcnNlIG5vZGVzLCBvbmNlIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSAKLSAgICAgICAgIG5vZGUgaXMgY29tcGxldGVkLCByZW1vdmUgdGhlIG5vZGUgaWYgbm8gZm9sbG93aW5nIGVsZW1lbnRzIG1heSAKLSAgICAgICAgIG5lZWQgdG8gYWNjZXNzIHRoYXQgbm9kZS4KLSAgICAgIDQpIEtlZXAgdGhlIHBhcnNlIGV2ZW50cyBmcm9tIGdldHRpbmcgdG9vIGZhciBhaGVhZCBvZiB0aGUgdHJhbnNmb3JtLgotICAgICAgCi0gICAgICBUT0RPOiBJbiBTdGVwUGF0dGVybiwgQW5jZXN0b3JzIHRlc3RzIHdpdGggcHJlZGljYXRlcyBhcmUgcHJvYmxlbWF0aWMsIAotICAgICAgYW5kIHdpbGwgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudC4KLSAgICA8L3BzdWVkby1jb2RlPgotICAgPC9hY3Rpb24+Ci0KLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iZmVhdHVyZSI+Ci0gICAgWFBvaW50ZXIgYnVpbHQgb24gdGhlIFhQYXRoIHBhY2thZ2UuCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgcGFja2FnZXM9InhwYXRoLmF4ZXMiIGNhdGVnb3J5PSJwZXJmb3JtYW5jZSI+Ci0gICAgU2NoZW1hLXNhdnkgaXR0ZXJhdG9ycy4KLSAgICBUaGlzIGlzIGhhcmQgYmVjYXVzZSB0aGVyZSBpcyBubyBzdGFuZGFyZCBBUEkgZm9yIHNjaGVtYXMgeWV0LgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGlkPSJzdHlsZXNoZWV0LWFuYWx5c2lzIiBwYWNrYWdlcz0icHJvY2Vzc29yIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiPgotICAgIFN0eWxlc2hlZXQgYW5hbHlzaXMgbW9kdWxlLiAgV2hlbiBJIGNhbGwgYSB0ZW1wbGF0ZSwgd2hlcmUgaXMgaXQgbGlrZWx5IHRvIHdhbGsgaW4gdGhlIHRyZWU/Ci0gICAgQ2FuIEkgYmUgc3VyZSB0aGF0IGl0IHdpbGwgbm90IHdhbGsgdXAgYWdhaW4/Ci0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgcGFja2FnZXM9InN0cmVlIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiPgotICAgIFJlbGF0ZWQgdG8gc3R5bGVzaGVldC1hbmFseXNpcywgdGhlIGFiaWxpdHkgdG8gdGhyb3cgYXdheSBwYXJ0cyBvZiB0aGUgdHJlZSB0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWQsCi0gICAgYW5kIHdlIGtub3cgd2Ugd29uJ3QgcmV1c2UsIGJhc2VkIG9uIHRoZSBzdHlsZXNoZWV0IGFuYWx5c2lzLgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIHBhY2thZ2VzPSJwcm9jZXNzb3IiIGNhdGVnb3J5PSJwZXJmb3JtYW5jZSI+Ci0gICAgU3ViLWV4cHJlc3Npb24gZWxpbWluYXRpb24uICBXaGVuIEkgY2FsbCBhIHNlcmllcyBvZgotICAgIHhzbDp3aGVuIHRlc3RzLCBhcmUgdGhlcmUgY29tbW9uIHN1YmV4cHJlc3Npb25zIHRoYXQgY2FuIGJlCi0gICAgZXhlY3V0ZWQgb25jZSBhbmQgdGhlbiBzaGFyZWQ/Ci0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSI+Ci0gIDwvYWN0aW9uPgotCi0gPC9hY3Rpb25zPgotCi0gPGNvbXBsZXRlZD4KLSAgPCEtLSBNb3ZlIGFjdGlvbiBzZWN0aW9ucyB0byBoZXJlIHdoZW4gY29tcGxldGVkLCBhbmQgZGF0ZSB0aGVtLiAtLT4KLSAgCi0gICA8YWN0aW9uIGNvbnRleHQ9ImRvYyIgY2F0ZWdvcnk9ImRvY3VtZW50YXRpb24iIHdobz0iU0IiIGNvbXBsZXRlZD0iMDEvMTIvMDEiPgotICAgIFVwZGF0ZSBhbmQgYWRkIHRvIGFyY2hpdGVjdHVyZSBkb2N1bWVudGF0aW9uLCBpbmNsdWRpbmcgcGFja2FnZSBoZWFkZXJzLgotICAgPC9hY3Rpb24+Ci0KLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImVycm9yLWhhbmRsaW5nIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjAxLzA2LzAxIj4KLSAgICBTaW1wbGlmeSBzb21lIG9mIHRoZSBleGNlcHRpb24gbmVzdGluZywgbWF5YmUsIGFuZCBtYWtlIHN1cmUgZXJyb3IgbGlzdGVuZXJzIAotICAgIGFyZSBiZWluZyBjYWxsZWQgZm9yIGFsbCBjYXNlcy4KLSAgICA8bm90ZT5GaXhlZCBidWcgd2l0aCBYUGF0aHMgaW4gdGhpcyBhcmVhLiAgTW9zdCBvZiB0aGUgbmVzdGluZyBpcyBiZWluZyBjYXVzZWQgCi0gICAgYnkgVHJhbmZvcm1lckhhbmRsZXIgdG8gU0FYRXhjZXB0aW9uIG5lc3RpbmcsIHdoaWNoIGNhbiBiZSB1bm5lc3RlZC48L25vdGU+Ci0gICA8L2FjdGlvbj4KLSAgCi0gICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJidWciIHdobz0iU0IiIGNvbXBsZXRlZD0iMDEvMDYvMDEiPgotICAgIEZpeCAxLjggcHJvYmxlbXM6IGV4dGVuZDAxIChleGNlcHRpb24pLCBudW1iZXJmb3JtYXQgMDYsIG51bWJlcmZvcm1hdDE2LCBvdXRwdXQ3NyAoZXhjZXB0aW9uKS4KLSAgICBKREsgMS4xLjgsIHVzaW5nIHhtbC14YWxhblx0ZXN0XENvbmZvcm1hbmNlVGVzdC5iYXQsIHJ1bmhhcm5lc3MuYmF0LCBhbmQgdGVzdHRocmVhZHMuYmF0IGFzLWlzLgotICAgIDxub3RlPlRoZSBudW1iZXIgZm9ybWF0IHN0dWZmIGlzIGEgYnVnIGluIEpESyAxLjggYW5kIGNhbid0IGVhc2lseSBiZSBmaXhlZCAKLSAgICBvciBoYWNrZWQuPC9ub3RlPgotICAgPC9hY3Rpb24+Ci0KLSAgIDwhLS0gYWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJmZWF0dXJlIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjAxLzA0LzAxIj4KLSAgICBJbnRlZ3JhdGUgSm9obiBHZW50aWxpbiAmbHQ7am9obmdsaW51eEBleWVjYXRjaGluZy5jb20+IGNvZGUsIAotICAgIGZvciBTUUwgRXh0ZW5zaW9uIEVuaGFuY2VtZW50cy4KLSAgIDwvYWN0aW9uICAoQ0hBTkdFUyBCQUNLRUQgT1VUIE9GKSAtLT4KLQotICAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iYnVnIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjAxLzA0LzAxIj4KLSAgICBJbXBsZW1lbnQgeHNsOnN0cmlwLXNwYWNlIGZvciBnZW5lcmljIERPTSBwcm9jZXNzaW5nLgotICAgPC9hY3Rpb24+Ci0KLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9InBlcmZvcm1hbmNlIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjAxLzAzLzAxIj4KLSAgICBGb3IgZGVmYXVsdCB0cmFuc2Zvcm1lciwgZG8gZGlyZWN0IHRyYW5zZm9ybSB3aXRob3V0IHN0eWxlc2hlZXQuCi0gICA8L2FjdGlvbj4KLSAgIAotICAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iZG9jdW1lbnRhdGlvbiIgd2hvPSJTQiIgY29tcGxldGVkPSIwMS8wMS8wMSI+Ci0gICAgRml4IHNvbWUgamF2YWRvYyBoZWFkZXJzIHRoYXQgc3RpbGwgaGF2ZSBvbGQgWGFsYW5KMSB0ZXh0LiAgRm9yIGluc3RhbmNlLCAKLSAgICBUcmFuc2Zvcm1lckltcGwuCi0gICA8L2FjdGlvbj4KLSAgCi0gICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJidWdzIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjEyLzMxLzAwIj4KLSAgICBGaXggYnVnIHdpdGggU2hhbmUncyBzMnMgdGVzdCBoYW5nLgotICAgPC9hY3Rpb24+Ci0gICAKLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImJ1Z3MiIHdobz0iU0IsIEpLIiBjb21wbGV0ZWQ9IjEyLzMxLzAwIj4KLSAgICBGaXggYnVnIHdpdGggcmFyZSBpbnRlcm1pdHRlbnQgZmFpbHVyZXMsIHByb2JhYmx5IGluIHRoZSBTVHJlZS4KLSAgICA8bm90ZT5WZXJpZmljYXRpb24gdGVzdGluZyBvbiBKSydzIG1hY2hpbmUgbmVlZGVkLjwvbm90ZT4KLSAgIDwvYWN0aW9uPgotCi0gICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJwZXJmb3JtYW5jZSIgd2hvPSJTQiIgY29tcGxldGVkPSIxMi8yNi8wMCI+Ci0gICAgT3B0aW1pemUgIi9mb28vYmF6IiBwYXR0ZXJucyB0byB1c2Ugc2ltcGxlIGNoaWxkIHdhbGtlcnMuCi0gICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0idGVzdCIgd2hvPSJTQyIgY2F0ZWdvcnk9Im1pbml0ZXN0IiBwcmlvcml0eT0ibWVkaXVtIiBjb21wbGV0ZWQ9IjEyLzA4LzAwIj4KLSAgICBDcmVhdGUgTWluaXRlc3QgYXV0b21hdGVkIHRlc3QgZm9yIGRldmVsb3BlcnMgdG8gcnVuIGJlZm9yZSBjaGVja2luOyAKLSAgICB2ZXJpZmllcyBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIFRSQVggaW50ZXJmYWNlIGFuZCBYYWxhbiBwcm9jZXNzb3IuIAotICAgIChTdGlsbCB0b2RvLCBtaW5vcjogZ2V0IHhhbGFuLWRldiBsaXN0IHRvIHZvdGUgdG8gdXNlIHRoaXMpCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImFyY2hpdGVjdHVyZSIgcHJpb3JpdHk9ImhpZ2giIHdobz0iU0IiIGNvbXBsZXRlZD0iMTIvMTAvMDAiPgotICAgIEZpeCByZW1haW5pbmcgYXhlcyB0ZXN0cy4KLSAgPC9hY3Rpb24+Ci0KLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiIHByaW9yaXR5PSJoaWdoIiB3aG89Ik1NIiBjb21wbGV0ZWQ9IjEyLzgvMDAiPgotICAgIFdoZW4gdXNpbmcgU1RyZWUgZm9yIHRoZSBpbnB1dCwgdXNlIFNUcmVlIGZvciB0aGUgZG9jdW1lbnQoKSBhbmQKLSAgICByZXN1bHQgdHJlZSBmcmFnbWVudHMuCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImFyY2hpdGVjdHVyZSwgY29uZm9ybWFuY2UiIHByaW9yaXR5PSJoaWdoIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjEyLzA2LzAwIj4KLSAgICBSZXN0cnVjdHVyZSBPdXRwdXRGb3JtYXQgY2xhc3MgdG8gYmUgYmFzZWQgb24gcHJvcGVydGllcy4gIE1ha2Ugc3VyZSAKLSAgICBpbmNsdWRlL2ltcG9ydCBjb25mb3JtYW5jZSBpcyBjb3JyZWN0LgotICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImFyY2hpdGVjdHVyZSIgcHJpb3JpdHk9ImhpZ2giIHdobz0iU0IiIGNvbXBsZXRlZD0iMTIvMDYvMDAiPgotICAgIE1ha2UgZW50aXRpZXMgaW4gdGhlIGh0bWwgc2VyaWFsaXplciB0byBiZSByZXNvdXJjZSBmaWxlIGRyaXZlbi4KLSAgPC9hY3Rpb24+Ci0gIAotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJhcmNoaXRlY3R1cmUiIHByaW9yaXR5PSJoaWdoIiB3aG89IlNCIiBjb21wbGV0ZWQ9IjEyLzA2LzAwIj4KLSAgICBSZW1vdmVkIGxpbmVmZWVkIG5vcm1hbGl6YXRpb24gZnJvbSBzZXJpYWxpemVycy4gIEkgdGhpbmsuCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY29tcGxldGVkLWRhdGU9IjEwLzMxLzAwIj4KLSAgICBNYWtlIHRoaXMgdG9kbyBsaXN0LgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIHdobz0iU0IiICBjYXRlZ29yeT0idHJheCIgY29tcGxldGVkLWRhdGU9IjExLzA2LzAwIj4KLSAgICBpbXBsZW1lbnQgamF2YXgudHJheCBpbnRlcmZhY2VzLgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIHBhY2thZ2VzPSJzZXJpYWxpemUiIHdobz0iU0IiICBjYXRlZ29yeT0iZmVhdHVyZSIKLSAgICAgICAgICBjb21wbGV0ZWQtZGF0ZT0iMTEvMTcvMDAiPgotICAgIEltcGxlbWVudCBET01TZXJpYWxpemVyIG9uIFNlcmlhbGl6ZXJUb1hNTC4KLSAgPC9hY3Rpb24+Ci0KLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiB3aG89IlNCIiBwYWNrYWdlcz0ieHBhdGguYXhlcyIgY2F0ZWdvcnk9InBlcmZvcm1hbmNlIgotICAgICAgICAgIHByaW9yaXR5PSJoaWdoIiBjb21wbGV0ZWQtZGF0ZT0iMTEvMTcvMDAiPgotICAgIGltcGxlbWVudCBmYXN0IGl0ZXJhdG9yIGZvciAiZm9vIiBwYXR0ZXJuLgotICA8L2FjdGlvbj4KLQotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIHdobz0iTU0iIGNhdGVnb3J5PSJwZXJmb3JtYW5jZSIgcHJpb3JpdHk9ImhpZ2giIGNvbXBsZXRlZC1kYXRlPSIxMS8yOS8wMCI+Ci0gICAgb3B0aW1pemUgeHNsOmtleSBhbmQga2V5KCkgc3R1ZmYgYnkgYnVpbGRpbmcgaGFzaCB0YWJsZSBvZiBpdGVyYXRvcnMgZm9yCi0gICAgZWFjaCBrZXkuCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImNvZGUtY2xlYW51cCIgcHJpb3JpdHk9Im1lZGl1bSIgY29tcGxldGVkPSIxMi8wMS8wMCI+Ci0gICAgQ2xlYW4gdXAgdHJlYXRtZW50IG9mIG51bGwgbmFtZXNwYWNlcywgcmUgIiIgdnMuIG51bGwuCi0gICAgPGNvbXBsZXRlZC1jb21tZW50PkkgY29uc2lkZXIgdGhpcyB0byBiZSBwcmV0dHkgZ29vZCBpbiBtb3N0IHBsYWNlcy4gICIiIAotICAgIGVxdWFscyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuICBObyBwZW5kaW5nIHBsYW5zIGZvciBhY3Rpb24sIG90aGVyIHRoYW4gb25nb2luZyAKLSAgICBjbGVhbnVwIGFuZCBqYXZhZG9jIGFzIGl0IG9jY3Vycy48L2NvbXBsZXRlZC1jb21tZW50PgotICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgIGNhdGVnb3J5PSJjb25mb3JtYW5jZSIgcHJpb3JpdHk9ImhpZ2giIGNvbXBsZXRlZD0iMTIvMTAvMDAiPgotICAgIEltcGxlbWVudCBuYW1lc3BhY2UgYWxpYXNpbmcuCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgcGFja2FnZXM9InRlbXBsYXRlcyIgY2F0ZWdvcnk9ImNvbmZvcm1hbmNlIiBwcmlvcml0eT0ibWVkaXVtIgotICAgICAgICAgIG5vdGU9ImRvbmU/IiBjb21wbGV0ZWQ9IjExLzI5LzAwIj4KLSAgICBDYXRjaCBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBhIHZhcmlhYmxlIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2NvcGUuCi0gIDwvYWN0aW9uPgotICAKLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iY29kZS1jbGVhbnVwIiBwcmlvcml0eT0ibWVkaXVtIiBjb21wbGV0ZWQ9IjExLzI1LzAwIj4KLSAgICBNb3ZlIG9yZy5hcGFjaGUueGFsYW4udXRpbHMgcGFja2FnZSB0byBvcmcuYXBhY2hlLnhtbC51dGlscy4KLSAgICByZW1vdmUgcmVzb3VyY2UgZGVwZW5kZW5jaWVzIG9uIHhhbGFuIGFuZC9vciB4cGF0aCBwYWNrYWdlLgotICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImNvZGUtY2xlYW51cCwgcGVyZm9ybWFuY2UiIHBhY2thZ2VzPSJ0ZW1wbGF0ZXMiCi0gICBwcmlvcml0eT0ibWVkaXVtIiB3aG89IkdQIiBjb21wbGV0ZWQ9IjExLzMwLzAwIj4KLSAgICBSZWZhY3RvcmVkIHRoZSByZWNvbXBvc2UgbG9naWMgdG8gb3BlcmF0ZSBtb3JlIGNsZWFubHkgYW5kIHF1aWNrbHkuIEZpeGVkIFRlbXBsYXRlTGlzdAotICAgIHRvIHByb3Blcmx5IG9yZGVyIHRlbXBsYXRlcy4KLSAgPC9hY3Rpb24+Ci0gIAotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIGNhdGVnb3J5PSJjb2RlLWNsZWFudXAiIHBhY2thZ2VzPSJleHRlbnNpb25zIgotICAgcHJpb3JpdHk9Im1lZGl1bSIgd2hvPSJHUCIgY29tcGxldGVkPSIxMC8yOS8wMCI+Ci0gICAgSW1wcm92ZWQgZXJyb3IgcmVwb3J0aW5nIGZvciBqYXZhIGV4dGVuc2lvbiBtZXRob2QgZXJyb3JzLgotICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImRvY3VtZW50YXRpb24iIHByaW9yaXR5PSJtZWRpdW0iIHdobz0iR1AiIGNvbXBsZXRlZD0iMTEvMjMvMDAiPgotICAgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgRXh0ZW5zaW9uIEhhbmRsaW5nIHRvIGNvbmZvcm0gdG8gdGhlIG5ldyBleHRlbnNpb24gbWVjaGFuaXNtLgotICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImZlYXR1cmUiIHByaW9yaXR5PSJtZWRpdW0iIHdobz0iR1AiIGNvbXBsZXRlZD0iMTIvMDMvMDAiPgotICAgIENoYW5nZWQgZXh0ZW5zaW9uIG1lY2hhbmlzbSB0byBsb2FkIGV4dGVuc2lvbnMgdXNpbmcgdGhlIHRocmVhZCdzIENvbnRleHRDbGFzc0xvYWRlciwKLSAgICBpZiBhdmFpbGFibGUuCi0gIDwvYWN0aW9uPgotICAKLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iZmVhdHVyZSIgcGFja2FnZXM9ImV4dGVuc2lvbnMiIAotICAgcHJpb3JpdHk9Im1lZGl1bSIgd2hvPSJHUCIgY29tcGxldGVkPSIxMS8yOC8wMCI+Ci0gICAgSW1wbGVtZW50IHRva2VuaXplIGV4dGVuc2lvbi4gIEltcGxlbWVudCBlbGVtZW50LWF2YWlsYWJsZSBhbmQgZnVuY3Rpb24tYXZhaWxhYmxlIGZvcgotICAgIGJ1aWx0LWluIGVsZW1lbnRzIGFuZCBmdW5jdGlvbnMuCi0gIDwvYWN0aW9uPgotICAKLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iY29kZS1jbGVhbnVwIiBwYWNrYWdlcz0iZXh0ZW5zaW9ucyIgCi0gICBwcmlvcml0eT0ibWVkaXVtIiB3aG89IkdQIiBjb21wbGV0ZWQ9IjExLzA3LzAwIj4KLSAgICAgRml4IGhhbmRsaW5nIG9mIHhzbDpmYWxsYmFjayBlbGVtZW50cyB3aXRoaW4gZXh0ZW5zaW9uIGVsZW1lbnRzIHRoYXQgcHJvY2VzcyB0aGVpciBvd24KLSAgICAgY29kZSAobGlrZSByZWRpcmVjdCkuCi0gIDwvYWN0aW9uPgotICAKLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iY29kZS1jbGVhbnVwIiBwYWNrYWdlcz0iY29tcGlsZXIiIAotICAgcHJpb3JpdHk9Im1lZGl1bSIgd2hvPSJHUCIgY29tcGxldGVkPSIxMS8wOS8wMCI+Ci0gICAgIENsZWFuZWQgdXAgY29tcGlsZXIgaGFuZGxpbmcgb2YgZ2V0V2hhdFRvU2hvdygpIHRvIHJlc3VsdCBpbiBjbGVhbmVyIGNvZGUgYW5kIHByb3ZpZGUKLSAgICAgYSBtb3JlIGFjY3VyYXRlIGZpbHRlci4KLSAgPC9hY3Rpb24+Ci0gIAotICA8YWN0aW9uIGNvbnRleHQ9ImNvZGUiIHdobz0iU0IiIHBhY2thZ2VzPSJ4cGF0aC5heGVzIiBjYXRlZ29yeT0icGVyZm9ybWFuY2UiIHByaW9yaXR5PSJoaWdoIiBjb21wbGV0ZWQ9IjEyLzEzLzAwIj4KLSAgICBpbXBsZW1lbnQgZmFzdCBpdGVyYXRvciBmb3IgIkBmb28iIHBhdHRlcm4uCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgd2hvPSJTQiIgcGFja2FnZXM9InhwYXRoLmF4ZXMiIGNhdGVnb3J5PSJwZXJmb3JtYW5jZSIgcHJpb3JpdHk9ImhpZ2giIGNvbXBsZXRlZD0iMTIvMTQvMDAiPgotICAgIGltcGxlbWVudCBmYXN0IGl0ZXJhdG9yIGZvciAiLy9mb28iIHBhdHRlcm4uCi0gIDwvYWN0aW9uPgotICAKLSAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImNvZGUtY2xlYW51cCIgd2hvPSJETCIgcGFja2FnZXM9InhhbGFuc2VydmxldCIgcHJpb3JpdHk9Im1lZGl1bSIgY29tcGxldGVkPSIxMi8xNS8wMCI+Ci0gICAgIFJld3JpdGUgdGhlIHNhbXBsZSBzZXJ2bGV0IHRvIHVzZSB0aGUgVHJBWCBpbnRlcmZhY2VzIGFuZCBlbGltaW5hdGUgc2V0dGluZyBzeXN0ZW0gcHJvcGVydGllcwotICAgICB3aXRoaW4gdGhlIHNlcnZsZXQuCi0gIDwvYWN0aW9uPiAgCi0KLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiB3aG89IlNCIiBwYWNrYWdlcz0ib3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUiIGNhdGVnb3J5PSJzYW1wbGVzIiBwcmlvcml0eT0iaGlnaCIgY29tcGxldGVkPSIxMi8xNi8wMCI+Ci0gICAgRml4IHRoZSBzZXJpYWxpemVyIHNvIGl0IGNhbiBzZXJpYWxpemUgYXJiaXRyYXJ5IFhQYXRoIGV4cHJlc3Npb24gcmVzdWx0cyAob3RoZXIgdGhhbiBEb2N1bWVudCBub2RlcykuCi0gICAgQXMgaXQgY3VycmVudGx5IHN0YW5kcywgdGhlIEFwcGx5WFBhdGggc2FtcGxlIG9ubHkgd29ya3Mgd2hlbiB5b3UgZ2l2ZSBpdCBhbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyAKLSAgICB0aGUgZW50aXJlIERvY3VtZW50LgotICA8L2FjdGlvbj4KLSAgCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgY2F0ZWdvcnk9ImRvY3VtZW50YXRpb24iIHByaW9yaXR5PSJoaWdoIiBjb21wbGV0ZWQ9IjEyLzE3LzAwIj4KLSAgICBGaWxsIGluIGFsbCBORUVEU0RPQyBzZWN0aW9ucy4KLSAgPC9hY3Rpb24+Ci0KLSAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBjYXRlZ29yeT0iY29kZS1jbGVhbnVwIiB3aG89IkRMIiBwYWNrYWdlcz0ieGFsYW4uY2xpZW50IiBwcmlvcml0eT0ibWVkaXVtIiBjb21wbGV0ZWQ9IjEyLzE3LzAwIj4KLSAgICBSZXdyaXRlIHRoZSBjbGllbnQgYXBwbGV0IHRvIHVzZSB0aGUgVHJBWCBpbnRlcmZhY2VzLCBhbmQgbW92ZSBmZXRjaGluZyBvZiBzb3VyY2UKLSAgICBkb2N1bWVudHMgYW5kIHN0eWxlc2hlZXRzIHRvIHRoZSB0cnVzdGVkIHdvcmtlciB0aHJlYWQgdG8gZ2V0IGFyb3VuZCBJRSBzZWN1cml0eSByZXN0cmljdGlvbnMuCi0gIDwvYWN0aW9uPgotCi0gIDxhY3Rpb24gY29udGV4dD0iY29kZSIgIGNhdGVnb3J5PSJjb25mb3JtYW5jZSIgcHJpb3JpdHk9ImhpZ2giIGNvbXBsZXRlZD0iMTIvMTkvMDAiPgotICAgIENoZWNrIHJlbGF0aXZlIFVSTCByZXNvbHV0aW9uIHdpdGggbm90YXRpb25zIGFuZCB1bnBhcnNlZCBlbnRpdGllcy4KLSAgICBOb3Qgc3VyZSBpZiB0aGVyZSBpcyBhIGJ1ZyBoZXJlLiAgU2VlIG5vdGUgZnJvbSBUaG9tYWwgTWFlc2luZyBvbgotICAgIDEwLzI0LzIwMDAsIHRpdGxlZCAiQW50d29ydDogUmU6Ii4KLSAgPC9hY3Rpb24+Ci0KLSAgPGFjdGlvbiBjb250ZXh0PSJ0ZXN0IiBjYXRlZ29yeT0iZmVhdHVyZSIgcHJpb3JpdHk9ImhpZ2giIGNvbXBsZXRlZD0iMTIvMTkvMDAiPgotICAgIFVwZGF0ZSB0aGUgeG1sLXhhbGFuXHRlc3Rcdmlld1Jlc3VsdHMueHNsIHN0eWxlc2hlZXQgdG8gc2hvdyAKLSAgICBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byByZXN1bHQgZmlsZXMgZnJvbSB0aGUgc2FtZSB0ZXN0IChlZy4KLSAgICBzaG93IGRpZmZlcmVuY2VzIGZyb20gYSByZXN1bHRzLWJlZm9yZS54bWwgcnVuIGJlZm9yZSBhIGRldmVsb3BlciAKLSAgICBtYWtlcyBhIGNoYW5nZSwgd2l0aCByZXN1bHRzLWFmdGVyLnhtbCwgd2hpY2ggd2FzIGFmdGVyIHRoZSAKLSAgICBkZXZlbG9wZXIncyBjaGFuZ2UuKQotICAgIFRoaXMgY291bGQgYmUgYSBidW5jaCBvZiBzdHVmZiBhZGRlZCB0byB2aWV3UmVzdWx0cy54c2wgb3IgY291bGQgCi0gICAgYmUgYSBzZXBhcmF0ZSBzdHlsZXNoZWV0LiBTZWUgPGI+U0M8L2I+IGZvciBkZXRhaWxzLgotICA8L2FjdGlvbj4KLQotIDwvY29tcGxldGVkPgotCi08L3RvZG8+CmRpZmYgLS1naXQgYS90b2RvLnhzbCBiL3RvZG8ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDA2ODU0Li4wMDAwMDAwCi0tLSBhL3RvZG8ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDxIVE1MPgotICAgICAgPEhFQUQ+Ci0gICAgICAgICA8VElUTEU+WGFsYW4tSmF2YSBWZXJzaW9uIDI8L1RJVExFPgotICAgICAgPC9IRUFEPgotICAgICAgPEJPRFk+Ci0gICAgICAgIDwhLS0gSDE+WGFsYW4gZm9yIEphdmEgVmVyc2lvbiAyPC9IMSAtLT4KLSAgICAgICAgPEgyPlhhbGFuIGZvciBKYXZhIFZlcnNpb24gMjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRvZG8vQHRpdGxlIi8+PC9IMj4KLSAgICAgICAgPHA+PGZvbnQgc2l6ZT0iLTEiPlNlZSBhIAotICAgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhIj4KLSAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPiNkZXZlbG9wZXItbGlzdDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDx4c2w6dGV4dD5saXN0IG9mIGRldmVsb3BlcnMvaW5pdGlhbHMuPC94c2w6dGV4dD4KLSAgICAgICAgICA8L3hzbDplbGVtZW50PgotICAgICAgICA8L2ZvbnQ+PC9wPgotICAgICAgICA8Zm9udCBzaXplPSItMSI+PHA+UGxhbm5lZCByZWxlYXNlczogCi0gICAgICAgICAgICA8QlIvPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJ0b2RvL2FjdGlvbnMvdGFyZ2V0LXJlbGVhc2UtZGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYSI+Ci0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+I3JlbGVhc2UtZGF0ZS08eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGF0ZSIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGF0ZSIvPgotICAgICAgICAgICAgICA8L3hzbDplbGVtZW50Pjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhIj4KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4jcmVsZWFzZS1kYXRlLWNvbXBsZXRlZDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+Q29tcGxldGVkPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgPC94c2w6ZWxlbWVudD4KLQotICAgICAgICA8L3A+PC9mb250PgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0idG9kbyI+Ci0gICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImFjdGlvbnMiPgotICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0idGFyZ2V0LXJlbGVhc2UtZGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhY3Rpb24iPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm9ybWFsaXplLXNwYWNlKC4pIj4KLSAgICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgIDx4c2w6bnVtYmVyLz4pIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkAqIj4KLSAgICAgICAgICAgICAgICAgICAgPEJSLz4KLSAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIi8+Ci0gICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDxIUi8+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iY29tcGxldGVkIj4KLSAgICAgICAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImEiPgotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPnJlbGVhc2UtZGF0ZS1jb21wbGV0ZWQ8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgPEgzPkNvbXBsZXRlZDogPC9IMz4KLSAgICAgICAgICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhY3Rpb24iPgotICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vcm1hbGl6ZS1zcGFjZSguKSI+Ci0gICAgICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgIDx4c2w6bnVtYmVyLz4pIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAKiI+Ci0gICAgICAgICAgICAgICAgICA8QlIvPgotICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKiIvPgotICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgPEhSLz4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRldmVsb3Blci1saXN0Ii8+Ci0gICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgIDwvQk9EWT4KLSAgICA8L0hUTUw+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImFjdGlvbi9AKiI+Ci0gIDwhLS0gQWRkIGxpbmsgdG8gdGhlIHdobyBhdHRyaWJ1dGVzIHRvIGNvcnJlc3BvbmRpbmcgaXRlbSBpbiBkZXZlbG9wZXItbGlzdCAtLT4KLSAgICA8Yj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSguKSIvPjo8L2I+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJuYW1lKC4pPSd3aG8nIj4KLSAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYSI+Ci0gICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4jcGVyc29ucmVmLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KLSAgICAgICAgICA8L3hzbDplbGVtZW50PgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPHhzbDppZiB0ZXN0PSJub3QgKHBvc2l0aW9uKCk9bGFzdCgpKSI+Ci0gICAgICA8eHNsOnRleHQ+LCA8L3hzbDp0ZXh0PgotICAgIDwveHNsOmlmPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0YXJnZXQtcmVsZWFzZS1kZXNjcmlwdGlvbi9kYXRlIj4KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhIj4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+cmVsZWFzZS1kYXRlLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICA8Yj48eHNsOnRleHQ+Rm9yIHJlbGVhc2U6IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L2I+Ci0gICAgICA8L3hzbDplbGVtZW50PgotICAgIAotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJpc3N1ZSI+Ci0gICAgPEJSLz48Yj5Jc3N1ZSA8L2I+PHhzbDp0ZXh0Pls8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4KLSAgICA8eHNsOnRleHQ+XTogPC94c2w6dGV4dD4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRhcmdldC1yZWxlYXNlLWRlc2NyaXB0aW9uL2xldmVsIj4KLSAgICA8eHNsOnRleHQ+LCA8L3hzbDp0ZXh0Pjx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGFyZ2V0LXJlbGVhc2UtZGVzY3JpcHRpb24vZ29hbCI+Ci0gICAgPEJSLz48Yj5Hb2FsIDwvYj48eHNsOnRleHQ+WzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgPHhzbDp0ZXh0Pl06IDwveHNsOnRleHQ+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iZGV2ZWxvcGVyLWxpc3QiPgotICAgIDxIMz4KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhIj4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+ZGV2ZWxvcGVyLWxpc3Q8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgIDx4c2w6dGV4dD5EZXZlbG9wZXJzOjwveHNsOnRleHQ+Ci0gICAgICA8L3hzbDplbGVtZW50PgotICAgIDwvSDM+Ci0gICAgPHA+QSBsaXN0IG9mIHNvbWUgb2YgcGVvcGxlIHdvcmtpbmcgb24gWGFsYW4gY3VycmVudGx5OjwvcD4KLSAgICA8dWw+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImRldnMvcGVyc29uIj4KLSAgICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0ibWFpbHRvOntAZW1haWx9Ij4KLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgPC9hPgotICAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImEiPgotICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnRleHQ+cGVyc29ucmVmLTwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgPHhzbDp0ZXh0PiAoPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+PHhzbDp0ZXh0Pik8L3hzbDp0ZXh0PgotICAgICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICAgICAgIDxCUi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KLSAgICAgIDwvbGk+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPC91bD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cmF4X2J1Z3MueG1sIGIvdHJheF9idWdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2ZjljNS4uMDAwMDAwMAotLS0gYS90cmF4X2J1Z3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08P3htLXdlbGxfZm9ybWVkIHBhdGg9IkU6XHhtbC14YWxhblxqYXZhXGJ1Z3MuZHRkIj8+Ci08IS0tIFRoaXMgc2hvdWxkIGNvbnRhaW4gKm9ubHkqIFNQUnMgKFNvZnR3YXJlIFByb2JsZW0gUmVwb3J0cykgZm9yIHRoZSBUckFYIEFQSSAKLSAgICAgaW50ZXJmYWNlcyBhbmQgY2xhc3Nlcy4gLS0+Ci08U3Bycz48U3ByPjxOYW1lPlRSQVhTUFIwMDAxPC9OYW1lPgotPERhdGVDcmVhdGVkPjExLzE1LzIwMDA8L0RhdGVDcmVhdGVkPgotPFN0YXRlPk9wZW48L1N0YXRlPgotPFRlc3REZXNjPlNBWFRyYW5zZm9ybWVyRmFjdG90eSNGRUFUVVJFIHNob3VsZCBkb2N1bWVudCBzdXBwb3J0IGZvciBhbGwgVHJhbnNmb3JtZXJGYWN0b3JpZXMuPC9UZXN0RGVzYz48RGV0YWlscz48IVtDREFUQVtJbiBTQVhUcmFuc2Zvcm1lckZhY3RvdHk6Ci0KLSAgICAvKiogSWYge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I2dldEZlYXR1cmV9Ci0gICAgICogcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIHRoaXMgdmFsdWUgYXMgYW4gYXJndW1lbnQsCi0gICAgICogdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSByZXR1cm5lZCBmcm9tCi0gICAgICoge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I25ld0luc3RhbmNlfSBtYXkKLSAgICAgKiBiZSBzYWZlbHkgY2FzdCB0byBhIFNBWFRyYW5zZm9ybWVyRmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFID0KLQotSSBwcm9wb3NlIHlvdSByZW1vdmUgdGhlIHBocmFzZSAicmV0dXJuZWQgZnJvbQotVHJhbnNmb3JlckZhY3RvcnkubmV3SW5zdGFuY2UiLiBJc24ndCB0aGUgaW50ZW50IHRoYXQgZmVhdHVyZSB0ZXN0aW5nCi1jYW4gYmUgZG9uZSBvbiBhbGwgVHJhbnNmb3JtZXJGYWN0b3JpZXMsIHJlZ2FyZGxlc3MgaG93IHRoZXkgYXJlCi1jcmVhdGVkPyBJdCBjYW4gYmUgbGlrZSB0aGlzIGluc3RlYWQ6Ci0KLSAgICAvKiogSWYge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I2dldEZlYXR1cmV9Ci0gICAgICogcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIHRoaXMgdmFsdWUgYXMgYW4gYXJndW1lbnQsCi0gICAgICogdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gYQotICAgICAqIFNBWFRyYW5zZm9ybWVyRmFjdG9yeS4KLSAgICAgKi9dXT48L0RldGFpbHM+PC9TcHI+PFNwcj48TmFtZT5UUkFYU1BSMDAwMjwvTmFtZT4KLTxEYXRlQ3JlYXRlZD4xMS8xNS8yMDAwPC9EYXRlQ3JlYXRlZD4KLTxTdGF0ZT5PcGVuPC9TdGF0ZT4KLTxUZXN0RGVzYz5PdXRwdXRLZXlzI21ldGhvZCBzaG91bGQgZG9jdW1lbnQgcW5hbWUgaW5zdGVhZCBvZiBxbmFtZS1idXQtbm90LW5jbmFtZTwvVGVzdERlc2M+PERldGFpbHM+PCFbQ0RBVEFbSW4gT3V0cHV0S2V5czoKLQotICAgIC8qKgotICAgICAqIG1ldGhvZCA9ICJ4bWwiIHwgImh0bWwiIHwgInRleHQiIHwgPHZhcj5xbmFtZS1idXQtbm90LW5jbmFtZTwvdmFyPi4KLSAgICAgKgotICAgICAqIDxwPlRoZSBtZXRob2QgYXR0cmlidXRlIGlkZW50aWZpZXMgdGhlIG92ZXJhbGwgbWV0aG9kIHRoYXQKLSAgICAgKiBzaG91bGQgYmUgdXNlZCBmb3Igb3V0cHV0dGluZyB0aGUgcmVzdWx0IHRyZWUuICBPdGhlcgotICAgICAqIG5vbi1uYW1lc3BhY2VkIHZhbHVlcyBtYXkgYmUgdXNlZCwKLQotVGhpcyBpcyBjb250cmFkaWN0YXJ5LCBjaGFuZ2UgInFuYW1lLWJ1dC1ub3QtbmNuYW1lIiB0byAicW5hbWUiLl1dPjwvRGV0YWlscz48L1Nwcj4KLTxTcHI+PE5hbWU+VFJBWFNQUjAwMDM8L05hbWU+Ci08RGF0ZUNyZWF0ZWQ+MTEvMTUvMjAwMDwvRGF0ZUNyZWF0ZWQ+Ci08U3RhdGU+T3BlbjwvU3RhdGU+Ci08VGVzdERlc2M+PC9UZXN0RGVzYz48RGV0YWlscz48IVtDREFUQVtdXT48L0RldGFpbHM+PC9TcHI+Ci08U3ByPjxOYW1lPlRSQVhTUFIwMDA0PC9OYW1lPgotPERhdGVDcmVhdGVkPjExLzE1LzIwMDA8L0RhdGVDcmVhdGVkPgotPFN0YXRlPk9wZW48L1N0YXRlPgotPFRlc3REZXNjPjwvVGVzdERlc2M+PERldGFpbHM+PCFbQ0RBVEFbXV0+PC9EZXRhaWxzPjwvU3ByPgotPFNwcj48TmFtZT5UUkFYU1BSMDAwNTwvTmFtZT4KLTxEYXRlQ3JlYXRlZD4xMS8xNS8yMDAwPC9EYXRlQ3JlYXRlZD4KLTxTdGF0ZT5PcGVuPC9TdGF0ZT4KLTxUZXN0RGVzYz48L1Rlc3REZXNjPjxEZXRhaWxzPjwhW0NEQVRBW11dPjwvRGV0YWlscz48L1Nwcj4KLQotPC9TcHJzPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy9kZXNpZ24vY29tcGlsYXRpb24uZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24vY29tcGlsYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzVkN2Q0Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL2NvbXBpbGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL2NvbmNlcHR1YWwuZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24vY29uY2VwdHVhbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4M2ZlZTUuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy9kZXNpZ24vY29uY2VwdHVhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL2Rlc2lnbi9kYXRhLmdpZiBiL3hkb2NzL3NvdXJjZXMvZGVzaWduL2RhdGEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjI4YTE3Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL2RhdGEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy9kZXNpZ24vZGVzaWduMl8wXzAueG1sIGIveGRvY3Mvc291cmNlcy9kZXNpZ24vZGVzaWduMl8wXzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGZjMmU1Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL2Rlc2lnbjJfMF8wLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBzMSBTWVNURU0gInNiazovc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCI+Ci08czEgdGl0bGU9IlhhbGFuLUogMi4wIERlc2lnbiI+Ci0gIDxwPjxsaW5rPlhhbGFuLUogMi4wIERlc2lnbjwvbGluaz48aW1nIHNyYz0ieG1sbG9nby5naWYiIGFsdD0ieG1sbG9nby5naWYiLz48L3A+Ci0gIDxwPkF1dGhvcjogU2NvdHQgQm9hZzxici8+U3RhdGU6IEluIFByb2dyZXNzPC9wPgotICA8dWw+IAotCSAgIDxsaT48bGluayBhbmNob3I9ImludHJvIj5JbnRyb2R1Y3Rpb248L2xpbms+PC9saT4KLSAJICAgPGxpPjxsaW5rIGFuY2hvcj0icmVxdWlyZW1lbnRzIj5YYWxhbiBSZXF1aXJlbWVudHM8L2xpbms+PC9saT4KLQkgICA8bGk+PGxpbmsgYW5jaG9yPSJvdmVyYXJjaCI+T3ZlcnZpZXcgb2YgQXJjaGl0ZWN0dXJlPC9saW5rPjwvbGk+Ci0JICAgPGxpPjxsaW5rIGFuY2hvcj0icHJvY2VzcyI+UHJvY2VzcyBNb2R1bGU8L2xpbms+PC9saT4KLQkgICA8bGk+PGxpbmsgYW5jaG9yPSJ0ZW1wbGF0ZXMiPlRlbXBsYXRlcyBNb2R1bGU8L2xpbms+PC9saT4KLQkgICA8bGk+PGxpbmsgYW5jaG9yPSJ0cmFuc2Zvcm1lciI+VHJhbnNmb3JtZXIgTW9kdWxlPC9saW5rPjwvbGk+Ci0gICAgICAgPHVsPgotICAgICAgICAgPGxpPjxsaW5rIGFuY2hvcj0ic3RyZWUiPlN0cmVlIE1vZHVsZTwvbGluaz48L2xpPgotICAgICAgICAgPGxpPjxsaW5rIGFuY2hvcj0iZXh0ZW5zaW9ucyI+RXh0ZW5zaW9ucyBNb2R1bGU8L2xpbms+PC9saT4KLSAgICAgPC91bD4KLQkgICA8bGk+PGxpbmsgYW5jaG9yPSJ4cGF0aCI+WFBhdGggTW9kdWxlPC9saW5rPjwvbGk+Ci0gICAgICAgPHVsPjxsaT48bGluayBhbmNob3I9InhwYXRoZGJjb25uIj5YUGF0aCBEYXRhYmFzZSBDb25uZWN0aW9uPC9saW5rPjwvbGk+PC91bD4KLQkgICA8bGk+PGxpbmsgYW5jaG9yPSJ1dGlscyI+VXRpbHMgUGFja2FnZTwvbGluaz48L2xpPiAgICAgICAgIAotCSAgIDxsaT48bGluayBhbmNob3I9Im90aGVyIj5PdGhlciBQYWNrYWdlczwvbGluaz48L2xpPiAgICAgICAgIAotCSAgIDxsaT48bGluayBhbmNob3I9ImNvbXBpbGF0aW9uIj5YYWxhbiBTdHlsZXNoZWV0IENvbXBsaWxhdGlvbiB0byBKYXZhPC9saW5rPjwvbGk+PGxpPjxsaW5rIGFuY2hvcj0ib3B0aW1pemF0aW9ucyI+RnV0dXJlIE9wdGltaXphdGlvbnM8L2xpbms+PC9saT48bGk+PGxpbmsgYW5jaG9yPSJjb2RpbmciPkNvZGluZyBDb252ZW50aW9uczwvbGluaz48L2xpPgotCSAgICAgICAgCi0gICA8bGk+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9pbmRleC5odG1sIj5YYWxhbi1KIDIuMCBKYXZhZG9jPC9qdW1wPjwvbGk+Ci0gIDwvdWw+PGFuY2hvciBuYW1lPSJpbnRybyIvPgotICA8czIgdGl0bGU9IkludHJvZHVjdGlvbiI+IAotCSA8cD48bGluaz5JbnRyb2R1Y3Rpb248L2xpbms+PC9wPiAKLQkgPHA+VGhpcyBkb2N1bWVudCBwcmVzZW50cyB0aGUgYmFzaWMgZGVzaWduIGZvciBYYWxhbi1KIDIuMCwgd2hpY2ggaXMgYQotCQk8anVtcCBocmVmPSJodHRwOi8vd3d3LmF3bC5jb20vY3NlbmcvdGl0bGVzLzAtMjAxLTg5NTQyLTAvdGVjaG5pcXVlcy9yZWZhY3RvcmluZy5odG0iPnJlZmFjdG9yaW5nPC9qdW1wPgotCQlhbmQgcmVkZXNpZ24gb2YgdGhlIFhhbGFuLUogMS54IHByb2Nlc3Nvci4gICBUaGlzIGRvY3VtZW50IHdpbGwgZXhwYW5kIGFuZCBncm93IG92ZXIgdGltZSwgYW5kIGlzIGFsc28gaW5jb21wbGV0ZSBpbiBzb21lIHNlY3Rpb25zLCB0aG91Z2ggaG9wZWZ1bGx5IG92ZXJhbGwgYWNjdXJhdGUuICBUaGUgcmVhZGVyIHNob3VsZCBiZSBhYmxlIHRvIGdldCBhIGdvb2Qgb3ZlcmFsbCBpZGVhIG9mIHRoZSBpbnRlcm5hbCBkZXNpZ24gb2YgWGFsYW4sIGFuZCBiZWdpbiB0byB1bmRlcnN0YW5kIHRoZSBwcm9jZXNzIGZsb3csIGFuZCBhbHNvIHRoZSB0ZWNobmljYWwgY2hhbGxhbmdlcy48L3A+IAotCSA8cD5UaGUgbWFpbiBnb2FscyBvZiB0aGlzIHJlZGVzaWduIGFyZQotCQl0bzogPC9wPjxvbD4gCi0JCTxsaT5NYWtlIHRoZSBkZXNpZ24gYW5kIGNvZGUgbW9yZSB1bmRlcnN0YW5kYWJsZSBieSBPcGVuIFNvdXJjZQotCQkgIHBlb3BsZS48L2xpPiAKLQkJPGxpPlJlZHVjZSBjb2RlIHNpemUgYW5kIGNvbXBsZXhpdHkuPC9saT4KLQkJPGxpPkJ5IHNpbXBsaWZ5aW5nIHRoZSBjb2RlLCBtYWtlIG9wdGltaXphdGlvbiBlYXNpZXIuPC9saT4gCi0JCTxsaT5NYWtlIG1vZHVsZXMgZ2VuZXJhbGx5IG1vcmUgbG9jYWxpemVkLCBhbmQgbGVzcyB0YW5nbGVkIHdpdGggb3RoZXIKLQkJICBtb2R1bGVzLjwvbGk+IAotCQk8bGk+Q29uZm9ybSB0byB0aGUgPGp1bXAgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9hYm91dEphdmEvY29tbXVuaXR5cHJvY2Vzcy9qc3IvanNyXzA2M19qYXhwMTEuaHRtbCI+amF2YXgueG1sLnRyYW5zZm9ybSAgKFRyQVggW1RyYW5zZm9ybWF0aW9ucyBmb3IgWE1MXSk8L2p1bXA+IGludGVyZmFjZXMuPC9saT4gCi0JIDxsaT5JbmNyZWFzZSB0aGUgYWJpbGl0eSB0byBpbmNyZW1lbnRhbGx5IHByb2R1Y2UgdGhlIHJlc3VsdCB0cmVlLjwvbGk+PC9vbD4gCi0JIDxwPlRoZSB0ZWNobmlxdWVzIHVzZWQgdG93YXJkIHRoZXNlIGdvYWxzIGFyZSB0bzo8L3A+IAotCSA8b2w+IAotCQk8bGk+SW4gZ2VuZXJhbCwgZmxhdHRlbiB0aGUgaGllcmFyY2h5IG9mIHBhY2thZ2VzLCBpbiBvcmRlciB0byBtYWtlIHRoZQotCQkgIHN0cnVjdHVyZSBtb3JlIGFwcGFyZW50IGZyb20gdGhlIHRvcC1sZXZlbCB2aWV3LjwvbGk+IAotCQk8bGk+QnJlYWsgdGhlIGNvbnN0cnVjdGlvbiBhbmQgdGhlIHZhbGlkYXRpb24gb2YgdGhlIFhTTFQgc3R5bGVzaGVldCBmcm9tCi0JCSAgdGhlIHN0eWxlc2hlZXQgb2JqZWN0cyB0aGVtc2VsdmVzLjwvbGk+Ci0JCTxsaT5Ecml2ZSB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBzdHlsZXNoZWV0IHRocm91Z2ggYSB0YWJsZSwgc28gdGhhdCBpdAotCQkgIGlzIGxlc3MgcHJvbmUgdG8gZXJyb3IuPC9saT4gCi0JCTxsaT5CcmVhayB0aGUgdHJhbnNmb3JtYXRpb24gcHJvY2VzcyBpbnRvIGEgc2VwYXJhdGUgcGFja2FnZSwgYXdheSBmcm9tCi0JCSAgdGhlIHN0eWxlc2hlZXQgb2JqZWN0cy48L2xpPiAKLQkJPGxpPkNyZWF0ZSB0aGlzIGRlc2lnbiBkb2N1bWVudCwgYXMgYSBzdGFydGluZyBwb2ludCBmb3IgcGVvcGxlIGludGVyZXN0ZWQgaW4KLQkJICBhcHByb2FjaGluZyB0aGUgY29kZS48L2xpPiAKLQkgPC9vbD4gCi0JIDxwPlRoZSBnb2FscyBhcmUgbm90OjwvcD4gCi0JIDxvbD4gCi0JCTxsaT5UbyBhZGQgbW9yZSBmZWF0dXJlcyBpbiB0aGUgcHJvZ3Jlc3Mgb2YgdGhpcyByZWZhY3RvcmluZy4gVGhpcyBpcwotCQkgIGRlc2lnbiBhbmQgY29kZSBjbGVhbi11cCBpbiBvcmRlciB0byBtZWV0IHRoZSBhYm92ZS1uYW1lZCBnb2Fscy4gV2UgZXhwZWN0IHRoYXQgaXQgd2lsbCBiZSA8ZW0+bXVjaDwvZW0+IGVhc2llciB0byBhZGQKLQkJICBmZWF0dXJlcyBvbmNlIHRoaXMgd29yayBpcyBjb21wbGV0ZWQuPC9saT4gCi0JCTxsaT5UbyBvcHRpbWl6ZSBjb2RlIGZvciB0aGUgc2FrZSBvZiBvcHRpbWl6YXRpb24uIEhvd2V2ZXIsIHdlCi0JCSAgZXhwZWN0IHRoYXQgdGhlIGNvZGUgd2lsbCBiZSBmYXN0ZXIgb25jZSB0aGlzIHdvcmsgaXMgY29tcGxldGUuPC9saT4gCi0JIDwvb2w+IAotCSA8cD5Ib3cgd2VsbCB3ZSd2ZSBhY2hpZXZlZCB0aGUgZ29hbHMgd2lsbCBiZSBtZWFzdXJlZCBieSBmZWVkYmFjayBmcm9tIHRoZQotCQk8anVtcCBocmVmPSJodHRwOi8vYXJjaGl2ZS5jb3ZhbGVudC5uZXQvIj5YYWxhbi1kZXY8L2p1bXA+IGxpc3QsIGFuZCBieSBzb2Z0d2FyZSBtZXRyaWNzIHRvb2xzLjwvcD4gCi0JIDxwPlBsZWFzZSBub3RlIHRoYXQgdGhlIGRpYWdyYW1zIGluIHRoaXMgZGVzaWduIGRvY3VtZW50IGFyZSBtZWFudCB0byBiZQotCQl1c2VmdWwgYWJzdHJhY3Rpb25zLCBhbmQgbWF5IG5vdCBhbHdheXMgYmUgZXhhY3QuPC9wPiAKLSAgPC9zMj48YW5jaG9yIG5hbWU9InJlcXVpcmVtZW50cyIvPiAKLSAgPHMyIHRpdGxlPSJYYWxhbiBSZXF1aXJlbWVudHMiPjxwPjxsaW5rPlhhbGFuIFJlcXVpcmVtZW50czwvbGluaz48L3A+PHA+VGhlc2UgYXJlIHRoZSBjb25jcmV0ZSBnZW5lcmFsIHJlcXVpcmVtZW50cyBvZiBYYWxhbiwgYXMgSSB1bmRlcnN0YW5kIHRoZW0sIGFuZCBjb3ZlcmluZyBib3RoIHRoZSBKYXZhIGFuZCBDKysgdmVyc2lvbnMuICBUaGVzZSByZXF1aXJlbWVudHMgaGF2ZSBiZWVuIGJ1aWx0IHVwIG92ZXIgdGltZSBieSBleHBlcmllbmNlIHdpdGggcHJvZHVjdCBncm91cHMgYW5kIGdlbmVyYWwgdXNlcnMuPC9wPjxvbD48bGk+SmF2YSwgQysrIFZlcnNpb25zLjwvbGk+PGxpPlhTTFQgMS4wIGNvbmZvcm1hbmNlLCBhbmQgYmV5b25kLiAoaS5lLiBjb25mb3JtIHRvIHRoZSBjdXJyZW50IFczQyByZWNvbW1lbmRhdGlvbikuPC9saT48bGk+SGF2ZSBkZXNpZ24gYW5kIENvZGUgdW5kZXJzdGFuZGFibGUgYnkgT3BlbiBTb3VyY2UgQ29tbXVuaXR5LjwvbGk+PGxpPkFiaWxpdHkgdG8gaW50ZXJvcGVyYXRlIHdpdGggc3RhbmRhcmQgQVBJcy4gIChTQVgyLCBET00yLCBKQVhQKSAgW3RoaXMgaXMgY3VycmVudGx5IExlc3Mgb2YgYW4gaXNzdWUgd2l0aCBDKytdLjwvbGk+PGxpPkhpZ2ggUGVyZm9ybWFuY2UgKFJhdyBwZXJmb3JtYW5jZSwgSW5jcmVtZW50YWwgYWJpbGl0eSwgU2NhbGVhYmlsaXR5IHRvIGxhcmdlIGRvY3VtZW50cywgUmVkdWN0aW9uIG9mIEdhcmJhZ2UgQ29sbGVjdGlvbiBmb3IgdGhlIEphdmEgdmVyc2lvbi4pPC9saT48bGk+VG9vbGluZyBBUEkgKEFjY2VzcyBzdHlsZXNoZWV0IGRhdGEgc3RydWN0dXJlcywgQWNjZXNzIHNvdXJjZSBub2RlIGZyb20gcmVzdWx0IGV2ZW50LCBBc2sgcnVudGltZSBxdWVzdGlvbnMsIERlYnVnZ2luZyBBUEkpLjwvbGk+PGxpPlN1cHBvcnQgYWRkcmVzc2luZyBvZiBYTUwgaW4gc3RhbmRhbG9uZSBmYXNoaW9uIChpLmUuIFhQYXRoIEFQSSkuPC9saT48bGk+RXh0ZW5zaWJpbGl0eSAoQWJpbGl0eSB0byBjYWxsIEphdmEsIEFiaWxpdHkgdG8gY2FsbCBKYXZhU2NyaXB0LCBvdGhlciBsYW5ndWFnZXMpLjwvbGk+PGxpPk11bHRpcGxlIGRhdGEgc291cmNlcyAoSkRCQywgTERBUCwgb3RoZXIgZGF0YSBzb3VyY2VzLCBEaXJlY3QgWE1MIHJlcG9zaXRvcnkgY291cGxpbmcpLjwvbGk+PC9vbD48L3MyPjxhbmNob3IgbmFtZT0ib3ZlcmFyY2giLz4gCi0gIDxzMiB0aXRsZT0iT3ZlcnZpZXcgb2YgQXJjaGl0ZWN0dXJlIj4gCi0JIDxwPjxsaW5rPk92ZXJ2aWV3IG9mIEFyY2hpdGVjdHVyZTwvbGluaz48L3A+PHA+VGhlIGZvbGxvd2luZyBkaWFncmFtIHNob3dzIHRoZSBYU0xUIGFic3RyYWN0IHByb2Nlc3NpbmcgbW9kZWwuICBBIHRyYW5zZm9ybWF0aW9uIGV4cHJlc3NlZCBpbiBYU0xUIGRlc2NyaWJlcyBydWxlcyBmb3IgdHJhbnNmb3JtaW5nIGEgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgjZGF0YS1tb2RlbCI+U291cmNlIFRyZWUgPC9qdW1wPiBpbnRvIGEgcmVzdWx0IHRyZWUuIFRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBhY2hpZXZlZCBieSBhc3NvY2lhdGluZyBwYXR0ZXJucyB3aXRoIHRlbXBsYXRlcy4gQSBwYXR0ZXJuIGlzIG1hdGNoZWQgYWdhaW5zdCBlbGVtZW50cyBpbiB0aGUgc291cmNlIHRyZWUuIEEgdGVtcGxhdGUgaXMgaW5zdGFudGlhdGVkIHRvIGNyZWF0ZSBwYXJ0IG9mIHRoZSByZXN1bHQgdHJlZS4gVGhlIHJlc3VsdCB0cmVlIGlzIHNlcGFyYXRlIGZyb20gdGhlIHNvdXJjZSB0cmVlLiBUaGUgc3RydWN0dXJlIG9mIHRoZSByZXN1bHQgdHJlZSBjYW4gYmUgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSB0aGUgc3RydWN0dXJlIG9mIHRoZSBzb3VyY2UgdHJlZS4gSW4gY29uc3RydWN0aW5nIHRoZSByZXN1bHQgdHJlZSwgZWxlbWVudHMgZnJvbSB0aGUgc291cmNlIHRyZWUgY2FuIGJlIGZpbHRlcmVkIGFuZCByZW9yZGVyZWQsIGFuZCBhcmJpdHJhcnkgc3RydWN0dXJlIGNhbiBiZSBhZGRlZC4KLQotPC9wPjxwPlRoZSB0ZXJtICJ0cmVlIiwgYXMgdXNlZCB3aXRoaW4gdGhpcyBkb2N1bWVudCwgZGVzY3JpYmVzIGFuCi0JCQkgYWJzdHJhY3Qgc3RydWN0dXJlIHRoYXQgY29uc2lzdHMgb2Ygbm9kZXMgb3IgZXZlbnRzIHRoYXQgbWF5IGJlIHByb2R1Y2VkIGJ5Ci0JCQkgWE1MLiBBIFRyZWUgcGh5c2ljYWxseSBtYXkgYmUgYSBET00gdHJlZSwgYSBzZXJpZXMgb2Ygd2VsbCBiYWxhbmNlZCBwYXJzZQotCQkJIGV2ZW50cyAoc3VjaCBhcyB0aG9zZSBjb21pbmcgZnJvbSBhIFNBWDIgQ29udGVudEhhbmRlciksIGEgc2VyaWVzIG9mIHJlcXVlc3RzCi0JCQkgKHRoZSByZXN1bHQgb2Ygd2hpY2ggY2FuIGRlc2NyaWJlIGEgdHJlZSksIG9yIGEgc3RyZWFtIG9mIG1hcmtlZC11cAotCQkJIGNoYXJhY3RlcnMuPC9wPjxwPjxpbWcgc3JjPSJ4c2x0X2Fic3RyYWN0LmdpZiIgYWx0PSJ4c2x0X2Fic3RyYWN0LmdpZiIvPjwvcD48cD5UaGUgcHJpbWFyeSBpbnRlcmZhY2UgZm9yIFhhbGFuIDIuMCBleHRlcm5hbCB1c2FnZSBpcyBkZWZpbmVkIGluIHRoZSA8anVtcCBocmVmPSIuLi9hcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwjcGFja2FnZV9kZXNjcmlwdGlvbiI+amF2YXgueG1sLnRyYW5zZm9ybTwvanVtcD4gaW50ZXJmYWNlcy4gIFRoZXNlIGludGVyZmFjZXMgZGVmaW5lIGEgc3RhbmRhcmQgYW5kIHBvd2VyZnVsIGludGVyZmFjZSB0byBwZXJmb3JtIHRyZWUtYmFzZWQgdHJhbnNmb3JtYXRpb25zLjwvcD4gCi0JIDxwPlRoZSBpbnRlcm5hbCBhcmNoaXRlY3R1cmUgb2YgWGFsYW4gMi4wIGlzIGRpdmlkZWQgaW50byBmb3VyIG1ham9yIG1vZHVsZXMsIGFuZCB2YXJpb3VzIHNtYWxsZXIKLQkJbW9kdWxlcy4gVGhlIG1haW4gbW9kdWxlcyBhcmU6PC9wPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9wcm9jZXNzb3IvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yPC9qdW1wPjwvY29kZT48L2xhYmVsPiAKLQkJPGl0ZW0+VGhlIG1vZHVsZSB0aGF0IHByb2Nlc3NlcyB0aGUgc3R5bGVzaGVldCwgYW5kIHByb3ZpZGVzIHRoZSBtYWluCi0JCSAgZW50cnkgcG9pbnQgaW50byBYYWxhbi48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzPC9qdW1wPjwvY29kZT48L2xhYmVsPiAKLQkJPGl0ZW0+VGhlIG1vZHVsZSB0aGF0IGRlZmluZXMgdGhlIHN0eWxlc2hlZXQgc3RydWN0dXJlcywgaW5jbHVkaW5nIHRoZQotCQkgIFN0eWxlc2hlZXQgb2JqZWN0LCB0ZW1wbGF0ZSBlbGVtZW50IGluc3RydWN0aW9ucywgYW5kIEF0dHJpYnV0ZSBWYWx1ZQotCQkgIFRlbXBsYXRlcy4gPC9pdGVtPiAKLQkgPC9nbG9zcz4gCi0JIDxnbG9zcz4gCi0JCTxsYWJlbD48Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXI8L2p1bXA+PC9jb2RlPjwvbGFiZWw+IAotCQk8aXRlbT5UaGUgbW9kdWxlIHRoYXQgYXBwbGllcyB0aGUgc291cmNlIHRyZWUgdG8gdGhlIFRlbXBsYXRlcywgYW5kCi0JCSAgcHJvZHVjZXMgYSByZXN1bHQgdHJlZS48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94cGF0aC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmFwYWNoZS54cGF0aDwvanVtcD48L2NvZGU+PC9sYWJlbD4gCi0JCTxpdGVtPlRoZSBtb2R1bGUgdGhhdCBwcm9jZXNzZXMgYm90aCBYUGF0aCBleHByZXNzaW9ucywgYW5kIFhTTFQgTWF0Y2gKLQkJICBwYXR0ZXJucy48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgPHA+SW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIG1vZHVsZXMsIFhhbGFuIGltcGxlbWVudHMgdGhlCi0JCTxqdW1wIGhyZWY9Ii4uL2FwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9wYWNrYWdlLXN1bW1hcnkuaHRtbCNwYWNrYWdlX2Rlc2NyaXB0aW9uIj5qYXZheC54bWwudHJhbnNmb3JtPC9qdW1wPiBpbnRlcmZhY2VzLCBhbmQgZGVwZW5kcyBvbiB0aGUKLQkgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9KYXZhL2luZGV4Lmh0bWwiPlNBWDI8L2p1bXA+IGFuZCA8anVtcCBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi8iPkRPTTwvanVtcD4gcGFja2FnZXMuCi08L3A+PHA+PGltZyBzcmM9InRyYXguZ2lmIiBhbHQ9InRyYXguZ2lmIi8+PC9wPjxwPlRoZXJlIGlzIGFsc28gYSBnZW5lcmFsIHV0aWxpdGllcyBwYWNrYWdlIHRoYXQgY29udGFpbnMgYm90aCBYTUwgdXRpbGl0eQotCSBjbGFzc2VzIHN1Y2ggYXMgUU5hbWUsIGJ1dCBnZW5lcmFsbHkgdXNlZnVsIGNsYXNzZXMgc3VjaCBhcwotCSBTdHJpbmdUb0ludFRhYmxlLjwvcD4gCi0JIDxwPkluIHRoZSBkaWFncmFtIGJlbG93LCB0aGUgZGFzaGVkIGxpbmVzIGRlbm90ZSB2aXNpYmlsaXR5LiBBbGwgcGFja2FnZXMKLQkJYWNjZXNzIHRoZSBTQVgyIGFuZCBET00gcGFja2FnZXMuPC9wPiAKLQkgPHA+PGltZyBzcmM9InhhbGFuMV8xeDEuZ2lmIiBhbHQ9InhhbGFuMV8xeDEuZ2lmIi8+PC9wPiAKLQkgPHA+SW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIHBhY2thZ2VzLCB0aGVyZSBhcmUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsCi0JCXBhY2thZ2VzOjwvcD4gCi0JIDxnbG9zcz4gCi0JCTxsYWJlbD48Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vY2xpZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLmNsaWVudDwvanVtcD48L2NvZGU+PC9sYWJlbD4gCi0JCTxpdGVtPlRoaXMgcGFja2FnZSBoYXMgYSBjbGllbnQgYXBwbGV0LiBJIHN1c3BlY3QgdGhpcyBzaG91bGQgYmUgbW92ZWQKLQkJICBpbnRvIHRoZSBzYW1wbGVzIGRpcmVjdG9yeS48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9leHRlbnNpb25zL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnM8L2p1bXA+PC9jb2RlPjwvbGFiZWw+IAotCQk8aXRlbT5UaGlzIGhvbGRzIGNsYXNzZXMgYmVsb25naW5nIHRvIHRoZSBYYWxhbiBleHRlbnNpb25zIG1lY2hhbmlzbSwKLQkJICB3aGljaCBhbGxvd3MgSmF2YSBjb2RlIGFuZCBzY3JpcHQgdG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgc3R5bGVzaGVldC48L2l0ZW0+Ci0JCQotCSA8L2dsb3NzPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9saWIvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ubGliPC9qdW1wPjwvY29kZT48L2xhYmVsPiAKLQkJPGl0ZW0+VGhpcyBpcyB0aGUgYnVpbHQtaW4gWGFsYW4gZXh0ZW5zaW9ucyBsaWJyYXJ5LCB3aGljaCBob2xkcwotCQkgIGV4dGVuc2lvbnMgc3VjaCBhcyBSZWRpcmVjdCAod2hpY2ggYWxsb3dzIGEgc3R5bGVzaGVldCB0byBwcm9kdWNlIG11bHRpcGxlCi0JCSAgb3V0cHV0IGZpbGVzKS48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9yZXMvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucmVzPC9qdW1wPjwvY29kZT48L2xhYmVsPiAKLQkJPGl0ZW0+VGhpcyBob2xkcyByZXNvdXJjZSBmaWxlcyBuZWVkZWQgYnkgWGFsYW4sIHN1Y2ggYXMgZXJyb3IgbWVzc2FnZQotCQkgIHJlc291cmNlcy48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgIAotCSA8Z2xvc3M+IAotCQk8bGFiZWw+PGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RyYWNlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLnRyYWNlPC9qdW1wPjwvY29kZT48L2xhYmVsPiAKLQkJPGl0ZW0+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgdGhhdCBhbGxvdyBhIGNhbGxlciB0bwotCQkgIGFkZCB0cmFjZSBsaXN0ZW5lcnMgdG8gdGhlIHRyYW5zZm9ybWF0aW9uLCBhbGxvd2luZyBhbiBpbnRlcmZhY2UgdG8gWFNMVAotCQkgIGRlYnVnZ2VycyBhbmQgc2ltaWxhciB0b29scy48L2l0ZW0+IAotCSA8L2dsb3NzPiAKLQkgPGdsb3NzPiAKLQkJPGxhYmVsPjxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi94c2x0L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLnhzbHQ8L2p1bXA+PC9jb2RlPjwvbGFiZWw+IAotCQk8aXRlbT5UaGlzIHBhY2thZ2UgaG9sZHMgdGhlIFhhbGFuMiBjb21tYW5kIGxpbmUgcHJvY2Vzc29yLjwvaXRlbT4gCi0JIDwvZ2xvc3M+IAotICA8cD5BIG1vcmUgY29uY2VwdHVhbCB2aWV3IG9mIHRoaXMgYXJjaGl0ZWN0dXJlIGlzIGFzIGZvbGxvd3M6PC9wPjxwPjxpbWcgc3JjPSJjb25jZXB0dWFsLmdpZiIgYWx0PSJQaWN0dXJlIG9mIGNvbmNlcHR1YWwgYXJjaGl0ZWN0dXJlLiIvPjwvcD48L3MyPjxhbmNob3IgbmFtZT0icHJvY2VzcyIvPiAKLSAgPHMyIHRpdGxlPSJQcm9jZXNzIE1vZHVsZSI+IAotCSA8cD48bGluaz5Qcm9jZXNzb3IgTW9kdWxlPC9saW5rPjwvcD4gCi0JIDxwPlRoZSA8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3NvcjwvanVtcD48L2NvZGU+IG1vZHVsZSBpbXBsZW1lbnRzIHRoZQotCQk8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vVHJhbnNmb3JtZXJGYWN0b3J5Lmh0bWwiPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5PC9qdW1wPjwvY29kZT4gaW50ZXJmYWNlLCB3aGljaCBwcm92aWRlcyBhCi0JCWZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhIGNvbmNyZXRlIFByb2Nlc3NvciBpbnN0YW5jZSwgYW5kIHByb3ZpZGVzIG1ldGhvZHMKLQkJZm9yIGNyZWF0aW5nIGEgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9qYXZheC94bWwvdHJhbnNmb3JtL1RlbXBsYXRlcy5odG1sIj5qYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlczwvanVtcD48L2NvZGU+IGluc3RhbmNlLCB3aGljaCwgaW4KLQkJWGFsYW4gYW5kIFhTTFQgdGVybXMsIGlzIHRoZSBTdHlsZXNoZWV0LiBUaHVzIHRoZSB0YXNrIG9mIHRoZSBwcm9jZXNzIG1vZHVsZSBpcwotCQl0byByZWFkIHRoZSBYU0xUIGlucHV0IGluIHRoZSBmb3JtIG9mIGEgZmlsZSwgc3RyZWFtLCBTQVggZXZlbnRzLCBvciBhIERPTQotCQl0cmVlLCBhbmQgcHJvZHVjZSBhIFRlbXBsYXRlcy9TdHlsZXNoZWV0IG9iamVjdC48L3A+IAotCSA8cD5UaGUgb3ZlcmFsbCBzdHJhdGVneSBpcyB0byBkZWZpbmUgYSBzY2hlbWEgaW4gdGhhdCBkaWN0YXRlcyB0aGUgbGVnYWwKLQkJc3RydWN0dXJlIGZvciBYU0xUIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCBhbmQgdG8gYXNzb2NpYXRlIHdpdGggdGhvc2UKLQkJZWxlbWVudHMgY29uc3RydWN0aW9uLXRpbWUgcHJvY2Vzc29ycyB0aGF0IGNhbiBmaWxsIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMKLQkJaW4gdGhlIHRvcC1sZXZlbCBTdHlsZXNoZWV0IG9iamVjdCwgYW5kIGFsc28gYXNzb2NpYXRlIGNsYXNzZXMgaW4gdGhlIHRlbXBsYXRlcwotCQltb2R1bGUgdGhhdCBjYW4gYmUgY3JlYXRlZCBpbiBhIGdlbmVyYWxpemVkIGZhc2hpb24uIFRoaXMgbWFrZXMgdGhlIHZhbGlkYXRpb24KLQkJb2JqZWN0LXRvLWNsYXNzIGFzc29jaWF0aW9ucyBjZW50cmFsaXplZCBhbmQgZGVjbGFyYXRpdmUuPC9wPiAKLQkgPHA+VGhlIHNjaGVtYSdzIHJvb3QgY2xhc3MgaXMKLQkJPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3Nvci9YU0xUU2NoZW1hLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlhTTFRTY2hlbWE8L2p1bXA+PC9jb2RlPiwgYW5kIGl0IGlzIGhlcmUgdGhhdCB0aGUKLQkJWFNMVCBzY2hlbWEgc3RydWN0dXJlIGlzIGRlZmluZWQuIFhTTFRTY2hlbWEgdXNlcwotCQk8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yL1hTTFRFbGVtZW50RGVmLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlhTTFRFbGVtZW50RGVmPC9qdW1wPjwvY29kZT4gdG8gZGVmaW5lIGVsZW1lbnRzLCBhbmQKLQkJPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3Nvci9YU0xUQXR0cmlidXRlRGVmLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlhTTFRBdHRyaWJ1dGVEZWY8L2p1bXA+PC9jb2RlPiB0byBkZWZpbmUgYXR0cmlidXRlcy4KLQkJQm90aCBjbGFzc2VzIGhvbGQgdGhlIGFsbG93ZWQgbmFtZXNwYWNlLCBsb2NhbCBuYW1lLCBhbmQgdHlwZSBvZiBlbGVtZW50IG9yCi0JCWF0dHJpYnV0ZS4gVGhlIFhTTFRFbGVtZW50RGVmIGFsc28gaG9sZHMgYSByZWZlcmVuY2UgdG8gYQotCQk8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yL1hTTFRFbGVtZW50UHJvY2Vzc29yLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlhTTFRFbGVtZW50UHJvY2Vzc29yPC9qdW1wPjwvY29kZT4sIGFuZCBhIHNvbWV0aW1lcyBhCi0JCTxjb2RlPkNsYXNzPC9jb2RlPiBvYmplY3QsIHdpdGggd2hpY2ggaXQgY2FuIGNyZWF0ZSBvYmplY3RzIHRoYXQgZGVyaXZlIGZyb20KLQkJPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVGVtcGxhdGVFbGVtZW50Lmh0bWwiPm9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1UZW1wbGF0ZUVsZW1lbnQ8L2p1bXA+PC9jb2RlPi4gSW4gYWRkaXRpb24sIHRoZQotCQlYU0xURWxlbWVudERlZiBpbnN0YW5jZSBob2xkcyBhIGxpc3Qgb2YgWFNMVEVsZW1lbnREZWYgaW5zdGFuY2VzIHRoYXQgZGVmaW5lCi0JCWxlZ2FsIGVsZW1lbnRzIG9yIGNoYXJhY3RlciBldmVudHMgdGhhdCBhcmUgYWxsb3dlZCBhcyBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4KLQkJZWxlbWVudC48L3A+IAotCSA8cD5UaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lckZhY3RvcnkuaHRtbCI+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk8L2p1bXA+PC9jb2RlPgotCQlpbnRlcmZhY2UgaXMgaW4gPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3Nvci9UcmFuc2Zvcm1lckZhY3RvcnlJbXBsLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGw8L2p1bXA+PC9jb2RlPiwKLQkJd2hpY2ggY3JlYXRlcyBhIDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9wcm9jZXNzb3IvU3R5bGVzaGVldEhhbmRsZXIuaHRtbCI+b3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuU3R5bGVzaGVldEhhbmRsZXI8L2p1bXA+PC9jb2RlPgotCQlpbnN0YW5jZS4gVGhpcyBpbnN0YW5jZSBhY3RzIGFzIHRoZSBDb250ZW50SGFuZGxlciBmb3IgdGhlIHBhcnNlIGV2ZW50cywgYW5kIGlzCi0JCWhhbmRlZCB0byB0aGUgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcveG1sL3NheC9YTUxSZWFkZXIuaHRtbCI+b3JnLnhtbC5zYXguWE1MUmVhZGVyPC9qdW1wPjwvY29kZT4sIHdoaWNoIHRoZSBTdHlsZXNoZWV0UHJvY2Vzc29yCi0JCXVzZXMgdG8gcGFyc2UgdGhlIFhTTFQgZG9jdW1lbnQuIFRoZSA8Y29kZT5TdHlsZXNoZWV0SGFuZGxlcjwvY29kZT4gdGhlbiByZWNlaXZlcyB0aGUgcGFyc2UKLQkJZXZlbnRzLCB3aGljaCBtYWludGFpbnMgdGhlIHN0YXRlIG9mIHRoZSBjb25zdHJ1Y3Rpb24sIGFuZCBwYXNzZXMgdGhlIGV2ZW50cyBvbgotCQl0byB0aGUgYXBwcm9wcmlhdGUgPGNvZGU+WFNMVEVsZW1lbnRQcm9jZXNzb3I8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gZXZlbnQsIGFzIGRpY3RhdGVkIGJ5IHRoZQotCQk8Y29kZT5YU0xURWxlbWVudERlZjwvY29kZT4gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGV2ZW50LjwvcD4gCi0JIDwvczI+PGFuY2hvciBuYW1lPSJ0ZW1wbGF0ZXMiLz4gCi0gIDxzMiB0aXRsZT0iVGVtcGxhdGVzIE1vZHVsZSI+IAotCSA8cD48bGluaz5UZW1wbGF0ZXMgTW9kdWxlPC9saW5rPjwvcD4gCi0JIDxwPlRoZSA8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlczwvanVtcD48L2NvZGU+IG1vZHVsZSBpbXBsZW1lbnRzIHRoZQotCQk8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vVGVtcGxhdGVzLmh0bWwiPmphdmF4LnhtbC50cmFuc2Zvcm0uVGVtcGxhdGVzPC9qdW1wPjwvY29kZT4gaW50ZXJmYWNlLCBhbmQgZGVmaW5lcyBhIHNldCBvZgotCQljbGFzc2VzIHRoYXQgcmVwcmVzZW50IGEgU3R5bGVzaGVldC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0bwotCQlob2xkIHN0eWxlc2hlZXQgZGF0YSwgbm90IHRvIHBlcmZvcm0gcHJvY2VkdXJhbCB0YXNrcyBhc3NvY2lhdGVkIHdpdGggdGhlCi0JCWNvbnN0cnVjdGlvbiBvZiB0aGUgZGF0YSwgbm9yIHRhc2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNmb3JtYXRpb24gaXRzZWxmLgotCQk8L3A+IAotCSA8cD5UaGUgYmFzZSBjbGFzcyBvZiBhbGwgdGVtcGxhdGVzIG9iamVjdHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGFuIFhTTFQgZWxlbWVudCBpcyB0aGUgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtVGVtcGxhdGVFbGVtZW50Lmh0bWwiPkVsZW1UZW1wbGF0ZUVsZW1lbnQ8L2p1bXA+PC9jb2RlPiBvYmplY3QsIHdoaWNoIGluIHR1cm4gaW1wbGVtZW50cyA8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveG1sL3V0aWxzL1VuSW1wbE5vZGUuaHRtbCI+VW5JbXBsTm9kZTwvanVtcD48L2NvZGU+LiAgIEEgPGNvZGU+RWxlbVRlbXBsYXRlRWxlbWVudDwvY29kZT4gb2JqZWN0IG11c3QgYmUgaW1tdXRhYmxlIG9uY2UgaXQncyBjb25zdHJ1Y3RlZCwgc28gdGhhdCBpdCBtYXkgYmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LiAgSWRlYWxseSwgYSA8Y29kZT5FbGVtVGVtcGxhdGVFbGVtZW50PC9jb2RlPiBzaG91bGQgYmUgYSBkYXRhIG9iamVjdCBvbmx5LCBhbmQgYmUgdXNlZCB2aWEgYSB2aXNpdG9yIHBhdHRlcm4uICBIb3dldmVyLCBpbiBwcmFjdGljZSB0aGlzIGlzIGltcHJhY3RpY2FsLCBiZWNhdXNlIGl0IHdvdWxkIGNhdXNlIHRvbyBtdWNoIGRhdGEgZXhwb3N1cmUgYW5kIHdvdWxkIGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gcGVyZm9ybWFuY2UuICBUaGVyZWZvcmUsIGVhY2ggPGNvZGU+RWxlbVRlbXBsYXRlRWxlbWVudDwvY29kZT4gY2xhc3MgaGFzIGFuIDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVRlbXBsYXRlRWxlbWVudC5odG1sI2V4ZWN1dGUob3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGwsIG9yZy53M2MuZG9tLk5vZGUsIG9yZy5hcGFjaGUueG1sLnV0aWxzLlFOYW1lKSI+ZXhlY3V0ZTwvanVtcD48L2NvZGU+IG1ldGhvZCB3aGVyZSBpdCBwZXJmb3JtcyBpdCdzIHRyYW5zZm9ybWF0aW9uIGR1dGllcy4gIEEgPGNvZGU+RWxlbVRlbXBsYXRlRWxlbWVudDwvY29kZT4gYWxzbyBrbm93cyBpdCdzIHBvc2l0aW9uIGluIHRoZSBzb3VyY2Ugc3R5bGVzaGVldCwgYW5kIGNhbiBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IGN1cnJlbnQgbmFtZXNwYWNlIG5vZGVzLjwvcD48cD5BIDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvU3R5bGVzaGVldFJvb3QuaHRtbCI+U3R5bGVzaGVldFJvb3Q8L2p1bXA+PC9jb2RlPiwgd2hpY2ggaW1wbGVtZW50cyB0aGUKLQkJPGNvZGU+VGVtcGxhdGVzPC9jb2RlPiBpbnRlcmZhY2UsIGlzIGEgdHlwZSBvZiA8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL1N0eWxlc2hlZXRDb21wb3NlZC5odG1sIj5TdHlsZXNoZWV0Q29tcG9zZWQ8L2p1bXA+PC9jb2RlPiwKLQkJd2hpY2ggaXMgYSA8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL1N0eWxlc2hlZXQuaHRtbCI+U3R5bGVzaGVldDwvanVtcD48L2NvZGU+IGNvbXBvc2VkIG9mIGl0c2VsZiBhbmQgYWxsIGluY2x1ZGVkCi0JCTxjb2RlPlN0eWxlc2hlZXQ8L2NvZGU+IG9iamVjdHMuIEEgPGNvZGU+U3R5bGVzaGVldFJvb3Q8L2NvZGU+IGhhcyBhIGdsb2JhbAotCQlpbXBvcnRzIGxpc3QsIHdoaWNoIGlzIGEgbGlzdCBvZiBhbGwgaW1wb3J0ZWQgPGNvZGU+U3R5bGVzaGVldENvbXBvc2VkPC9jb2RlPgotCQlpbnN0YW5jZXMuIEZyb20gZWFjaCA8Y29kZT5TdHlsZXNoZWV0Q29tcG9zZWQ8L2NvZGU+IG9iamVjdCwgb25lIGNhbiBpdGVyYXRlCi0JCXRocm91Z2ggdGhlIGxpc3Qgb2YgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmNsdWRlZCA8Y29kZT5TdHlsZXNoZWV0PC9jb2RlPgotCQlvYmplY3RzLCBhbmQgb25lIGNhbGwgYWxzbyBpdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgYWxsCi0JCTxjb2RlPlN0eWxlc2hlZXRDb21wb3NlZDwvY29kZT4gb2JqZWN0cyBvZiBsZXNzZXIgaW1wb3J0IHByZWNlZGVuY2UuCi0JCTxjb2RlPlN0eWxlc2hlZXRSb290PC9jb2RlPiBpcyBhIDxjb2RlPlN0eWxlc2hlZXRDb21wb3NlZDwvY29kZT4sIHdoaWNoIGlzIGEKLQkJPGNvZGU+U3R5bGVzaGVldDwvY29kZT4uPC9wPiAKLQkgPHA+RWFjaCBzdHlsZXNoZWV0IGhhcyBhIHNldCBvZiBwcm9wZXJ0aWVzLCB3aGljaCBjYW4gYmUgc2V0IGJ5IHZhcmlvdXMKLQkJbWVhbnMsIHVzdWFsbHkgZWl0aGVyIHZpYSBhbiBhdHRyaWJ1dGUgb24geHNsOnN0eWxlc2hlZXQsIG9yIHZpYSBhIHRvcC1sZXZlbAotCQl4c2wgaW5zdHJ1Y3Rpb24gKGZvciBpbnN0YW5jZSwgeHNsOmF0dHJpYnV0ZS1zZXQpLiBUaGUgZ2V0IG1ldGhvZHMgZm9yIHRoZXNlCi0JCXByb3BlcnRpZXMgb25seSBhY2Nlc3MgdGhlIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgZ2l2ZW4gPGNvZGU+U3R5bGVzaGVldDwvY29kZT4KLQkJb2JqZWN0LCBhbmQgbmV2ZXIgdGFrZXMgaW50byBhY2NvdW50IGluY2x1ZGVkIG9yIGltcG9ydGVkIHN0eWxlc2hlZXRzLiBUaGUKLQkJPGNvZGU+U3R5bGVzaGVldENvbXBvc2VkPC9jb2RlPiBkZXJpdmF0aXZlIG9iamVjdCwgaWYgaXQgaXMgYSByb290Ci0JCTxjb2RlPlN0eWxlc2hlZXQ8L2NvZGU+IG9yIGltcG9ydGVkIDxjb2RlPlN0eWxlc2hlZXQ8L2NvZGU+LCBoYXMgImNvbXBvc2VkIgotCQlnZXR0ZXIgbWV0aG9kcyB0aGF0IGRvIHRha2UgaW50byBhY2NvdW50IGltcG9ydGVkIGFuZCBpbmNsdWRlZCBzdHlsZXNoZWV0cywgZm9yCi0JCXNvbWUgb2YgdGhlc2UgcHJvcGVydGllcy48L3A+IAotCSAgCi0gIDwvczI+PGFuY2hvciBuYW1lPSJ0cmFuc2Zvcm1lciIvPiAKLSAgPHMyIHRpdGxlPSJUcmFuc2Zvcm1lciBNb2R1bGUiPiAKLQkgPHA+PGxpbms+VHJhbnNmb3JtZXIgTW9kdWxlPC9saW5rPjwvcD4gCi0JIDxwPlRoZSA8anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPlRyYW5zZm9ybWVyPC9qdW1wPiBtb2R1bGUgaXMgaW4gY2hhcmdlIG9mIHJ1bi10aW1lIHRyYW5zZm9ybWF0aW9ucy4gIFRoZSA8anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIvVHJhbnNmb3JtZXJJbXBsLmh0bWwiPlRyYW5zZm9ybWVySW1wbDwvanVtcD4gb2JqZWN0LCB3aGljaCBpbXBsZW1lbnRzIHRoZSBUckFYIDxqdW1wIGhyZWY9Ii4uL2FwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lci5odG1sIj5UcmFuc2Zvcm1lcjwvanVtcD4gaW50ZXJmYWNlLCBhbmQgaGFzIGFuIGFzc29jaWF0aW9uIHdpdGggYSA8anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL1N0eWxlc2hlZXRSb290Lmh0bWwiPlN0eWxlc2hlZXRSb290PC9qdW1wPiBvYmplY3QsIGJlZ2lucyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgc291cmNlIHRyZWUgKG9yIHByb3ZpZGVzIGEgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9KYXZhL2phdmFkb2Mvb3JnL3htbC9zYXgvQ29udGVudEhhbmRsZXIuaHRtbCI+Q29udGVudEhhbmRsZXI8L2p1bXA+IHJlZmVyZW5jZSB2aWEgdGhlPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3N0cmVlL1NvdXJjZVRyZWVIYW5kbGVyLmh0bWwiPlNvdXJjZVRyZWVIYW5kbGVyPC9qdW1wPjwvY29kZT4pLCBhbmQgcGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9uLiAgVGhlIFRyYW5zZm9ybWVyIHBhY2thZ2UgZG9lcyBhcyBtdWNoIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBhcyBpdCBjYW4sIGJ1dCBlbGVtZW50IGxldmVsIG9wZXJhdGlvbnMgYXJlIGdlbmVyYWxseSBwZXJmb3JtZWQgaW4gdGhlIDxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbVRlbXBsYXRlRWxlbWVudC5odG1sI2V4ZWN1dGUob3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGwsIG9yZy53M2MuZG9tLk5vZGUsIG9yZy5hcGFjaGUueGFsYW4udXRpbHMuUU5hbWUpIj5FbGVtVGVtcGxhdGVFbGVtZW50LmV4ZWN1dGUoLi4uKTwvanVtcD4gbWV0aG9kcy48L3A+PHA+UmVzdWx0IFRyZWUgZXZlbnRzIGFyZSBmZWQgaW50byBhIDxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lci9SZXN1bHRUcmVlSGFuZGxlci5odG1sIj5SZXN1bHRUcmVlSGFuZGxlcjwvanVtcD4gb2JqZWN0LCB3aGljaCBhY3RzIGFzIGEgbGF5ZXIgYmV0d2VlbiB0aGUgZGlyZWN0IGNhbGxzIHRvIHRoZSByZXN1bHQgCi10cmVlIGNvbnRlbnQgaGFuZGxlciAob2Z0ZW4gYSA8anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vc2VyaWFsaXplL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5TZXJpYWxpemVyPC9qdW1wPiksIGFuZCB0aGUgPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+LiAgRm9yIG9uZSB0aGluZywgCi0gd2UgaGF2ZSB0byBkZWxheSB0aGUgY2FsbCB0bwotIHN0YXJ0RWxlbWVudChuYW1lLCBhdHRzKSBiZWNhdXNlIG9mIHRoZQotIHhzbDphdHRyaWJ1dGUgYW5kIHhzbDpjb3B5IGNhbGxzLiAgSW4gb3RoZXIgd29yZHMsCi0gdGhlIGF0dHJpYnV0ZXMgaGF2ZSB0byBiZSBmdWxseSBjb2xsZWN0ZWQgYmVmb3JlIHlvdQotIGNhbiBjYWxsIHN0YXJ0RWxlbWVudC48L3A+PHA+T3RoZXIgaW1wb3J0YW50IGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZTo8L3A+PGdsb3NzPjxsYWJlbD5Db3VudGVyc1RhYmxlIGFuZCBDb3VudGVyPC9sYWJlbD48aXRlbT5UaGUgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0NvdW50ZXIuaHRtbCI+Q291bnRlcjwvanVtcD48L2NvZGU+IGNsYXNzIGRvZXMgaW5jcmVtZW50YWwgY291bnRpbmcgZm9yIHN1cHBvcnQgb2YgeHNsOm51bWJlci4KLSBUaGlzIGNsYXNzIHN0b3JlcyBhIGNhY2hlIG9mIGNvdW50ZWQgbm9kZXMgKG1fY291bnROb2RlcykuIAotICBJdCB0cmllcyB0byBjYWNoZSB0aGUgY291bnRlZCBub2RlcyBpbiBkb2N1bWVudCBvcmRlci4uLiAKLSB0aGUgbm9kZSBjb3VudCBpcyBiYXNlZCBvbiBpdHMgcG9zaXRpb24gaW4gdGhlIGNhY2hlIGxpc3QuICBUaGUgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyL0NvdW50ZXJzVGFibGUuaHRtbCI+Q291bnRlcnNUYWJsZTwvanVtcD48L2NvZGU+IGNsYXNzIGlzIGEgdGFibGUgb2YgY291bnRlcnMsIGtleWVkIGJ5IDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMvRWxlbU51bWJlci5odG1sIj5FbGVtTnVtYmVyPC9qdW1wPjwvY29kZT4gb2JqZWN0cywgZWFjaCAKLSBvZiB3aGljaCBoYXMgYSBsaXN0IG9mIDxjb2RlPkNvdW50ZXI8L2NvZGU+IG9iamVjdHMuPC9pdGVtPjwvZ2xvc3M+PGdsb3NzPjxsYWJlbD5LZXlJdGVyYXRvciwgS2V5TWFuYWdlciwgYW5kIEtleVRhYmxlPC9sYWJlbD48aXRlbT5UaGVzZSBjbGFzc2VzIGhhbmRsZSBtYXBwaW5nIG9mIGtleXMgZGVjbGFyZWQgd2l0aCB0aGUgeHNsOmtleSBlbGVtZW50LiAgVGhleSBhdHRlbXB0IHRvIHdvcmsgaW5jcmVtZW50YWxseSwgbG9jYXRpbmcgbm9kZXMgb24gcmVxdWVzdCBidXQgaW5kZXhpbmcgYWxsIGFzIHRoZXkgdHJhdmVyc2UgdGhlIHRyZWUsIGFuZCBzdG9wcGluZyB3aGVuIHRoZSByZXF1ZXN0ZWQgbm9kZSBpcyBmb3VuZC4gIElmIGEgcmVxdWVzdGVkIG5vZGUgaXMgbm90IGZvdW5kLCB0aGVuIHRoZSBlbnRpcmUgdHJlZSB3aWxsIGJlIHRyYXZlcnNlZC4gIFN1Y2ggaXMgdGhlIG5hdHVyZSBvZiB4c2w6a2V5LjwvaXRlbT48L2dsb3NzPjxnbG9zcz48bGFiZWw+VHJhbnNmb3JtU3RhdGU8L2xhYmVsPjxpdGVtPlRoaXMgaW50ZXJmYWNlIGlzIG1lYW50IHRvIGJlIHVzZWQgYnkgYSBjb25zdW1lciBvZiBTQVgyIGV2ZW50cyBwcm9kdWNlZCBieSBYYWxhbiwgYW5kIGVuYWJsZXMgdGhlIGNvbnN1bWVyIAotIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHRyYW5zZm9ybS4gIEl0IAotIGlzIHByaW1hcmlseSBpbnRlbmRlZCBhcyBhIHRvb2xpbmcgaW50ZXJmYWNlLjwvaXRlbT48L2dsb3NzPjxwPkV2ZW4gdGhvdWdoIHRoZSBmb2xsb3dpbmcgbW9kdWxlcyBhcmUgZGVmaW5lZCBpbiB0aGUgPGNvZGU+b3JnLmFwYWNoZS54YWxhbjwvY29kZT4gcGFja2FnZSwgaW5zdGVhZCBvZiB0aGUgdHJhbnNmb3JtZXIgcGFja2FnZSwgdGhleSBhcmUgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24gYXMgdGhleSBhcmUgbW9zdGx5IHJlbGF0ZWQgdG8gcnVudGltZSB0cmFuc2Zvcm1hdGlvbi48L3A+PGFuY2hvciBuYW1lPSJzdHJlZSIvPgotICA8czMgdGl0bGU9IlN0cmVlIE1vZHVsZSI+PHA+PGxpbms+U3RyZWUgTW9kdWxlIFtBbmQgZGlzY3Vzc2lvbnMgYWJvdXQgc3RyZWFtaW5nXTwvbGluaz48L3A+PHA+VGhlIFN0cmVlIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoI2RhdGEtbW9kZWwiPlNvdXJjZSBUcmVlIDwvanVtcD4gZm9yIFhhbGFuLCB0aGF0IGlzIHRvIGJlIHRyYW5zZm9ybWVkLiAgSXQgaW1wbGVtZW50cyByZWFkLW9ubHkgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTIvIj5ET00yPC9qdW1wPiBpbnRlcmZhY2VzLCBhbmQgcHJvdmlkZXMgc29tZSBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGZhc3QgdHJhbnNmb3Jtcywgc3VjaCBhcyBkb2N1bWVudCBvcmRlciBpbmRleGVzLiAgSXQgYWxzbyBhdHRlbXB0cyB0byBhbGxvdyBhbiBpbmNyZW1lbnRhbCB0cmFuc2Zvcm0gYnkgbGF1bmNoaW5nIHRoZSB0cmFuc2Zvcm0gb24gYSBzZWNvbmRhcnkgdGhyZWFkIGFzIHNvb24gYXMgdGhlIFNBWDIgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9KYXZhL2phdmFkb2Mvb3JnL3htbC9zYXgvQ29udGVudEhhbmRsZXIuaHRtbCNzdGFydERvY3VtZW50KCkiPlN0YXJ0RG9jdW1lbnQ8L2p1bXA+IGV2ZW50IGhhcyBvY2N1cnJlZC4gIFdoZW4gdGhlIHRyYW5zZm9ybSByZXF1ZXN0cyBhIG5vZGUsIGFuZCB0aGUgbm9kZSBpcyBub3QgcHJlc2VudCwgdGhlIGdldEZpcnN0Q2hpbGQgYW5kIEdldE5leHRTaWJsaW5nIG1ldGhvZHMgd2lsbCB3YWl0IHVudGlsIHRoZSBjaGlsZCBub2RlIGhhcyBhcnJpdmVkLCBvciBhbiA8anVtcCBocmVmPSJodHRwOi8vd3d3Lm1lZ2dpbnNvbi5jb20vU0FYL0phdmEvamF2YWRvYy9vcmcveG1sL3NheC9Db250ZW50SGFuZGxlci5odG1sI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywlMjBqYXZhLmxhbmcuU3RyaW5nLCUyMGphdmEubGFuZy5TdHJpbmcpIj5lbmRFbGVtZW50PC9qdW1wPiBldmVudCBoYXMgb2NjdXJyZWQuPC9wPjxwPk5vdGUgdGhhdCB0aGUgc2Vjb25kYXJ5IHRocmVhZCBpcyBhbiBpc3N1ZS4gIEl0IHdvdWxkIGJlIGJldHRlciB0byBkbyB0aGUgc2FtZSB0aGluZyBhcyBkZXNjcmliZWQgYWJvdmUgb24gYSBzaW5nbGUgdGhyZWFkLCBidXQgdXNpbmcgdGhlIHBhcnNlciBpbiAncHVsbCcgbW9kZSwgb3Igc2ltcGx5IHdpdGggYSBwYXJzZU5leHQgbWV0aG9kIHNvIHRoZSBwYXJzZSB3b3VsZCBvY2N1ciBpbiBibG9ja3MuICBIb3dldmVyLCB0aGlzIG1vZGVsIHdvdWxkIG9ubHkgYmUgcG9zc2libGU8L3A+PHA+VGhpcyBraW5kIG9mIGluY3JlbWVudGFsaXR5IGlzIG5vdCBwZXJmZWN0IGJlY2F1c2UgaXQgc3RpbGwgcmVxdWlyZXMgYW4gZW50aXJlIHNvdXJjZSB0cmVlIHRvIGJlIGNvbmNyZXRlbHkgYnVpbHQuICBUaGVyZSBoYXZlIGJlZW4gYSBsb3Qgb2YgZ29vZCBkaXNjdXNzaW9ucyBvbiB0aGUgeGFsYW4tZGV2IGxpc3QgYWJvdXQgaG93IHRvIGRvIHN0YXRpYyBhbmFseXNpcyBvZiBhIHN0eWxlc2hlZXQsIGFuZCBiZSBhYmxlIHRvIGFsbG9jYXRlIG9ubHkgdGhlIG5vZGVzIG5lZWRlZCBieSB0aGUgdHJhbnNmb3JtLCB3aGlsZSB0aGV5IGFyZSBuZWVkZWQgKG9yIG5vdCBhbGxvY2F0ZSBzb3VyY2Ugb2JqZWN0cyBhdCBhbGwpLjwvcD48L3MzPjxzMyB0aXRsZT0iU2VyaWFsaXplciBNb2R1bGUiPjxwPjxsaW5rPlNlcmlhbGl6ZXIgTW9kdWxlPC9saW5rPjwvcD48cD5YTUwgc2VyaWFsaXphdGlvbiBpcyBhIHRlcm0gdXNlZCBmb3IgdHVybmluZyBhIHRyZWUgb3Igc2V0IG9mIGV2ZW50cyBpbnRvIGEgc3RyZWFtLCBhbmQgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIEphdmEgb2JqZWN0IHNlcmlhbGl6YXRpb24uICBUaGUgWGFsYW4gc2VyaWFsaXplcnMgaW1wbGVtZW50IHRoZSA8anVtcCBocmVmPSJodHRwOi8vd3d3Lm1lZ2dpbnNvbi5jb20vU0FYL0phdmEvamF2YWRvYy9vcmcveG1sL3NheC9Db250ZW50SGFuZGxlci5odG1sIj5Db250ZW50SGFuZGxlcjwvanVtcD4gdG8gdHVybiBwYXJzZXIgZXZlbnRzIGNvbWluZyBmcm9tIHRoZSB0cmFuc2Zvcm0sIGludG8gYSBzdHJlYW0gb2YgWE1MLCBIVE1MLCBvciBwbGFpbiB0ZXh0LiAgVGhlIHNlcmlhbGl6ZXJzIGFsc28gaW1wbGVtZW50IHRoZSA8Y29kZT48anVtcCBocmVmPSIuLi9hcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vc2VyaWFsaXplci9TZXJpYWxpemVyLmh0bWwiPlNlcmlhbGl6ZXI8L2p1bXA+PC9jb2RlPiB3aGljaCBhbGxvd3MgdGhlIHRyYW5zZm9ybSBwcm9jZXNzIHRvIHNldCBYU0xUIG91dHB1dCBwcm9wZXJ0aWVzIGFuZCB0aGUgb3V0cHV0IHN0cmVhbSBvciBXcml0ZXIuPC9wPjwvczM+PHMzIHRpdGxlPSJFeHRlbnNpb25zIE1vZHVsZSI+PHA+PGxpbms+RXh0ZW5zaW9ucyBNb2R1bGU8L2xpbms+PC9wPjxwPlRoaXMgcGFja2FnZSBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBYYWxhbiBFeHRlbnNpb24gTWVjaGFuaXNtLCB3aGljaCB1c2VzIHRoZSA8anVtcCBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9ic2YvIj5CZWFuIFNjcmlwdGluZyBGcmFtZXdvcms8L2p1bXA+LgotCi1UaGUgQmVhbiBTY3JpcHRpbmcgRnJhbWV3b3JrIChCU0YpIGlzIGFuIGFyY2hpdGVjdHVyZSBmb3IgaW5jb3Jwb3JhdGluZyBzY3JpcHRpbmcgaW50byBKYXZhIGFwcGxpY2F0aW9ucyBhbmQgYXBwbGV0cy4gIFNjcmlwdGluZyBsYW5ndWFnZXMgc3VjaCBhcyBOZXRzY2FwZSBSaGlubyAoSmF2YXNjcmlwdCksIFZCU2NyaXB0LCBQZXJsLCBUY2wsIFB5dGhvbiwgTmV0UmV4eCBhbmQgUmV4eCBjYW4gYmUgdXNlZCB0byBhdWdtZW50IFhTTFQncyBmdW5jdGlvbmFsaXR5LiAgSW4gYWRkaXRpb24sIHRoZSBYYWxhbiBleHRlbnNpb24gbWVjaGFuaXNtIGFsbG93cyB1c2Ugb2YgSmF2YSBjbGFzc2VzLiAgU2VlIHRoZSA8anVtcCBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4vZXh0ZW5zaW9ucy5odG1sIj5YYWxhbi1KIDIgZXh0ZW5zaW9uIGRvY3VtZW50YXRpb248L2p1bXA+IGZvciBhIGRlc2NyaXB0aW9uIG9mIHVzaW5nIGV4dGVuc2lvbnMgaW4gYSBzdHlsZXNoZWV0LiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBXM0MgWFNMIFdvcmtpbmcgR3JvdXAgaXMgd29ya2luZyBvbiBhIHNwZWNpZmljYXRpb24gZm9yIHN0YW5kYXJkIGV4dGVuc2lvbiBiaW5kaW5ncywgYW5kIHRoaXMgbW9kdWxlIHdpbGwgY2hhbmdlIHRvIGZvbGxvdyB0aGF0IHNwZWNpZmljYXRpb24uICA8L3A+PHA+W01vcmUgbmVlZGVkLi4uIC1zYl08L3A+PC9zMz48L3MyPjxhbmNob3IgbmFtZT0ieHBhdGgiLz4gCi0gIDxzMiB0aXRsZT0iWFBhdGggTW9kdWxlIj4gCi0JIDxwPjxsaW5rPlhQYXRoIE1vZHVsZTwvbGluaz48L3A+IAotCSA8cD5UaGlzIG1vZHVsZSBpcyBwdWxsZWQgb3V0IG9mIHRoZSBYYWxhbiBwYWNrYWdlLCBhbmQgcHV0IGluIHRoZSBvcmcuYXBhY2hlIHBhY2thZ2UsIHRvIGVtcGhhc2l6ZSB0aGF0IHRoZSBpbnRlbnRpb24gaXMgdGhhdCB0aGlzIHBhY2thZ2UgY2FuIGJlIHVzZWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgWFNMVCBlbmdpbmUsIGV2ZW4gdGhvdWdoIGl0IGhhcyBkZXBlbmRlbmNpZXMgb24gdGhlIFhhbGFuIHV0aWxzIG1vZHVsZS48L3A+PHA+PGltZyBzcmM9Im9yZ19hcGFjaGUuZ2lmIiBhbHQ9InhhbGFuIC0tLT4geHBhdGgiLz48L3A+IAotICA8cD5UaGUgWFBhdGggbW9kdWxlIGZpcnN0IGNvbXBpbGVzIHRoZSBYUGF0aCBzdHJpbmdzIGludG8gZXhwcmVzc2lvbiB0cmVlcywgYW5kIHRoZW4gZXhlY3V0ZXMgdGhlc2UgZXhwcmVzc2lvbnMgdmlhIGEgY2FsbCB0byB0aGUgWFBhdGggZXhlY3V0ZSguLi4pIGZ1bmN0aW9uLiAgPC9wPiAgPHA+TWFqb3IgY2xhc3NlcyBhcmU6PC9wPjxnbG9zcz48bGFiZWw+WFBhdGg8L2xhYmVsPjxpdGVtPlJlcHJlc2VudHMgYSBjb21waWxlZCBYUGF0aC4gIE1ham9yIGZ1bmN0aW9uIGlzIDxjb2RlPlhPYmplY3QgZXhlY3V0ZShYUGF0aENvbnRleHQgeGN0eHQsIE5vZGUgY29udGV4dE5vZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgIFByZWZpeFJlc29sdmVyIG5hbWVzcGFjZUNvbnRleHQpLjwvY29kZT48L2l0ZW0+PC9nbG9zcz48Z2xvc3M+PGxhYmVsPlhQYXRoQVBJPC9sYWJlbD48aXRlbT5UaGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSBjb252ZW5pZW5jZSBtZXRob2RzIGludG8gdGhlCi0gbG93LWxldmVsIFhQYXRoIEFQSS48L2l0ZW0+PC9nbG9zcz48Z2xvc3M+PGxhYmVsPlhQYXRoQ29udGV4dDwvbGFiZWw+PGl0ZW0+VXNlZCBhcyB0aGUgcnVudGltZSBleGVjdXRpb24gY29udGV4dCBmb3IgWFBhdGguPC9pdGVtPjwvZ2xvc3M+PGdsb3NzPjxsYWJlbD5ET01IZWxwZXI8L2xhYmVsPjxpdGVtPlVzZWQgYXMgYSBoZWxwZXIgZm9yIGhhbmRsaW5nIERPTSBpc3N1ZXMuICBNYXkgYmUgc3ViY2xhc3NlZCB0byB0YWtlIGFkdmFudGFnZSAKLSAgIG9mIHNwZWNpZmljIERPTSBpbXBsZW1lbnRhdGlvbnMuPC9pdGVtPjwvZ2xvc3M+PGdsb3NzPjxsYWJlbD5Tb3VyY2VUcmVlTWFuYWdlcjwvbGFiZWw+PGl0ZW0+Ym90dGxlbmVja3MgYWxsIG1hbmFnZW1lbnQgb2Ygc291cmNlIHRyZWVzLiAgVGhlIG1ldGhvZHMKLSBpbiB0aGlzIGNsYXNzIHNob3VsZCBhbGxvdyBlYXN5IGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBzb3VyY2UgCi0gdHJlZXMsIGFuZCBzaG91bGQgY2VudHJhbGl6ZSBwYXJzaW5nIGZvciB0aG9zZSBzb3VyY2UgdHJlZXMuPC9pdGVtPjwvZ2xvc3M+PGdsb3NzPjxsYWJlbD5FeHByZXNzaW9uPC9sYWJlbD48aXRlbT5UaGUgYmFzZS1jbGFzcyBvZiBhbGwgZXhwcmVzc2lvbiBvYmplY3RzLCBhbGxvd2luZyBwb2x5bW9ycGhpYyBiZWhhdmlvcnMuPC9pdGVtPjwvZ2xvc3M+PHA+VGhlIGdlbmVyYWwgYXJjaGl0ZWN0dXJlIG9mIHRoZSBYUGF0aCBtb2R1bGUgaXMgZGl2aWRlZCBpbnRvIHRoZSBjb21waWxlciwgYW5kIGNhdGVnb3JpZXMgb2YgZXhwcmVzc2lvbiBvYmplY3RzLjwvcD48cD48aW1nIHNyYz0ieHBhdGguZ2lmIiBhbHQ9InhwYXRoIG1vZHVsZXMiLz48L3A+PHA+VGhlIG1vc3QgaW1wb3J0YW50IG1vZHVsZSBpcyB0aGUgYXhlcyBtb2R1bGUuICBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBET00yIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yL3RyYXZlcnNhbC5odG1sI0l0ZXJhdG9yLW92ZXJ2aWV3Ij5Ob2RlSXRlcmF0b3I8L2p1bXA+IGludGVyZmFjZSwgYW5kIGlzIG1lYW50IHRvIGFsbG93IFhQYXRoIGNsaWVudHMgdG8gZWl0aGVyIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9yIHRvIHJlcGxhY2UgdGhpcyBiZWhhdmlvci48L3A+PHA+VGhlIDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94cGF0aC9heGVzL0xvY1BhdGhJdGVyYXRvci5odG1sIj5Mb2NQYXRoSXRlcmF0b3I8L2p1bXA+PC9jb2RlPiBhbmQgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvVW5pb25QYXRoSXRlcmF0b3IuaHRtbCI+VW5pb25QYXRoSXRlcmF0b3I8L2p1bXA+PC9jb2RlPiBjbGFzc2VzIGltcGxlbWVudCB0aGUgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTIvamF2YS1iaW5kaW5nLmh0bWwjb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvciI+Tm9kZUl0ZXJhdG9yPC9qdW1wPiBpbnRlcmZhY2UsIGFuZCBwb2x5bW9ycGhpY2FsbHkgdXNlIDxjb2RlPjxqdW1wIGhyZWY9Ii4uL2FwaWRvY3Mvb3JnL2FwYWNoZS94cGF0aC9heGVzL0F4ZXNXYWxrZXIuaHRtbCI+QXhlc1dhbGtlcjwvanVtcD48L2NvZGU+IGRlcml2ZWQgb2JqZWN0cyB0byBleGVjdXRlIGVhY2ggc3RlcCBpbiB0aGUgcGF0aC4gIFRoZSB3aG9sZSB0cmljayBpcyB0byBleGVjdXRlIHRoZSA8Y29kZT5Mb2NhdGlvblBhdGg8L2NvZGU+IGluIGRlcHRoLWZpcnN0IGRvY3VtZW50IG9yZGVyIHNvIHRoYXQgbm9kZXMgY2FuIGJlIGZvdW5kIHdpdGhvdXQgbmVjZXNzYXJpbHkgbG9va2luZyBhaGVhZCBvciBwZXJmb3JtaW5nIGEgYnJlYWR0aC1maXJzdCBzZWFyY2guICBCZWNhdXNlIGEgZG9jdW1lbnQgb3JkZXIgZGVwdGgtZmlyc3Qgc2VhcmNoIHJlcXVpcmVzIHN0YXRlIHRvIGJlIHNhdmVkIGZvciBtYW55IGV4cHJlc3Npb25zLCB0aGUgZGVmYXVsdCBvcGVyYXRpb25zIGNyZWF0ZSAiV2FpdGVyIiBjbG9uZXMgdGhhdCBoYXZlIHRvIHdhaXQgd2hpbGUgdGhlIG1haW4gPGNvZGU+QXhlc1dhbGtlcnM8L2NvZGU+IHRyYXZlcnNlcyBjaGlsZCBub2RlcyAodGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoYXQgaGFwcGVucyB3aGVuIGEgIi8vZm9vL2JheiIgZXhwcmVzc2lvbiBpcyBleGVjdXRlZCkuICAgT3B0aW1pemF0aW9uIGlzIGRvbmUgYnkgaW1wbGVtZW50aW5nIHNwZWNpYWxpemVkIGl0ZXJhdG9ycyBhbmQgPGNvZGU+QXhlc1dhbGtlcnM8L2NvZGU+IGZvciBjZXJ0YWluIHR5cGVzIG9mIG9wZXJhdGlvbnMuICBUaGUgZGVjaXNpb24gYXMgdG8gd2hhdCB0eXBlIG9mIGl0ZXJhdG9yIG9yIHdhbGtlciB3aWxsIGJlIGNyZWF0ZWQgaXMgZG9uZSBpbiB0aGUgPGNvZGU+PGp1bXAgaHJlZj0iLi4vYXBpZG9jcy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMvV2Fsa2VyRmFjdG9yeS5odG1sIj5XYWxrZXJGYWN0b3J5PC9qdW1wPjwvY29kZT4gY2xhc3MuPC9wPjxwPltGcmFua2x5LCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRlZmF1bHQgQXhlc1dhbGtlciwgd2l0aCBpdCdzIHdhaXRlcnMsIGlzIHRoZSBvbmUgdG90YWxseSBpbmNvbXByZWhlbnNpYmxlIHBhcnQgb2YgWGFsYW4uICBJdCBnZXRzIGVzcGVjaWFsbHkgZGlmZmljdWx0IGJlY2F1c2UgeW91IGNhbiBub3QgbG9vayB0byB0aGUgbm9kZSBhaGVhZC4gIEkgd291bGQgYmUgdmVyeSBpbnRlcmVzdGVkIGlmIGFueSByb2NrZXQgc2NpZW50aXN0cyBvdXQgdGhlcmUgY2FuIGNvbWUgdXAgd2l0aCBhIGJldHRlciBhbGdvcml0aG0uXTwvcD48YW5jaG9yIG5hbWU9InhwYXRoZGJjb25uIi8+PHMzIHRpdGxlPSJYUGF0aCBEYXRhYmFzZSBDb25uZWN0aW9uIj48cD48bGluaz5YUGF0aCBEaXJlY3QgRGF0YWJhc2UgQ29ubmVjdGlvbnM8L2xpbms+PC9wPjxwPkFuIGltcG9ydGFudCBwYXJ0IG9mIHRoZSBYUGF0aCBkZXNpZ24gaW4gYm90aCBYYWxhbiAxIGFuZCBYYWxhbiAyLCBpcyB0byBlbmFibGUgZGF0YWJhc2UgY29ubmVjdGlvbnMgdG8gYmUgdXNlZCBhcyBkcml2ZXJzIGRpcmVjdGx5IHRvIHRoZSBYUGF0aCA8anVtcCBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aCNsb2NhdGlvbi1wYXRocyI+TG9jYXRpb25QYXRoPC9qdW1wPiBoYW5kbGluZy4gIFRoaXMgYWxsb3dzIGRhdGFiYXNlcyB0byBiZSBkaXJlY3RseSBjb25uZWN0ZWQgdG8gdGhlIHRyYW5zZm9ybSwgYW5kIGJlIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaW50ZXJuYWwgaW5kZXhpbmcgYW5kIHRoZSBsaWtlLiAgV2hpbGUgaW4gWGFsYW4gMSB0aGlzIHdhcyBkb25lIHZpYSB0aGUgPGp1bXAgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuL2FwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi94cGF0aC9YTG9jYXRvci5odG1sIj5YTG9jYXRvcjwvanVtcD4gaW50ZXJmYWNlLCBpbiBYYWxhbiAyIHRoaXMgaW50ZXJmYWNlIGlzIG5vIGxvbmdlciB1c2VkLCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIERPTTIgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTIvdHJhdmVyc2FsLmh0bWwjSXRlcmF0b3Itb3ZlcnZpZXciPk5vZGVJdGVyYXRvcjwvanVtcD4gaW50ZXJmYWNlLiAgQW4gYXBwbGljYXRpb24gb3IgZXh0ZW5zaW9uIHNob3VsZCBiZSBhYmxlIHRvIGluc3RhbGwgdGhlaXIgb3duIE5vZGVJdGVyYXRvciBmb3IgYSBnaXZlbiBkb2N1bWVudC48L3A+PHA+PGltZyBzcmM9ImRhdGEuZ2lmIiBhbHQ9ImRhdGEuZ2lmIi8+PC9wPjxwPltNb3JlIHRvIGRvXTwvcD48L3MzPjwvczI+PGFuY2hvciBuYW1lPSJ1dGlscyIvPiAKLSAgPHMyIHRpdGxlPSJVdGlscyBQYWNrYWdlIj4gCi0JIDxwPjxsaW5rPlV0aWxzIFBhY2thZ2U8L2xpbms+PC9wPiAKLSAgPHA+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIGdlbmVyYWwgdXRpbGl0aWVzIGZvciB1c2UgYnkgYm90aCB0aGUgeGFsYW4gYW5kIHhwYXRoIHBhY2thZ2VzLjwvcD48L3MyPjxhbmNob3IgbmFtZT0ib3RoZXIiLz4KLSAgPHMyIHRpdGxlPSJPdGhlciBQYWNrYWdlcyI+IAotCSA8cD48bGluaz5PdGhlciBQYWNrYWdlczwvbGluaz48L3A+IAotCSA8Z2xvc3M+PGxhYmVsPmNsaWVudDwvbGFiZWw+PGl0ZW0+SW1wbGVtZW50YXRpb24gb2YgWGFsYW4gQXBwbGV0IFtzaG91bGQgd2Uga2VlcCB0aGlzP10uCi0KLTwvaXRlbT48L2dsb3NzPiAKLQkJIAotCQkgCi0JCTxnbG9zcz48bGFiZWw+bGliPC9sYWJlbD48aXRlbT5JbXBsZW1lbnRhdGlvbiBvZiBYYWxhbi1zcGVjaWZpYyBleHRlbnNpb25zLjwvaXRlbT48L2dsb3NzPjxnbG9zcz48bGFiZWw+cmVzPC9sYWJlbD48aXRlbT5Db250YWlucyBzdHJpbmdzIHRoYXQgcmVxdWlyZSBpbnRlcm5hdGlvbmFsaXphdGlvbi48L2l0ZW0+PC9nbG9zcz48L3MyPjxhbmNob3IgbmFtZT0iY29tcGlsYXRpb24iLz48czIgdGl0bGU9IlhhbGFuIFN0eWxlc2hlZXQgQ29tcGxpbGF0aW9uIHRvIEphdmEiPjxwPjxsaW5rPlhhbGFuIFN0eWxlc2hlZXQgQ29tcGxpbGF0aW9uIHRvIEphdmE8L2xpbms+PC9wPjxwPldlIGFyZSBkb2luZyBzb21lIHdvcmsgb24gY29tcGlsaW5nIHN0eWxlc2hlZXQgb2JqZWN0cyB0byBKYXZhLiAgVGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGFuZCBpcyBub3QgbWVhbnQgZm9yIGdlbmVyYWwgdXNlIHlldC4gIEZvciB0aGUgbW9tZW50LCB3ZSBhcmUgd3JpdGluZyBvdXQgSmF2YSB0ZXh0IGZpbGVzLCBhbmQgdGhlbiBjb21waWxpbmcgdGhlbSB0byBieXRlY29kZXMgdmlhIGphdmFjLCByYXRoZXIgdGhhbiBkaXJlY3RseSBwcm9kdWNpbmcgYnl0ZWNvZGVzLiAgVGhlIENvbXBpbGluZ1N0eWxlc2hlZXRQcm9jZXNzb3IgZGVyaXZlcyBmcm9tIFRyYW5zZm9ybWVyRmFjdG9yeUltcGwgdG8gcHJvZHVjZSB0aGVzZSBjbGFzc2VzLCB3aGljaCBhcmUgdGhlbiBidW5kbGVkIGludG8gYSBqYXIgZmlsZS4gIEZvciB0aGUgbW9tZW50IHRoZSBmdWxsIFhhbGFuIGphciBpcyByZXF1aXJlZCwgYnV0IHdlJ3JlIGxvb2tpbmcgYXQgd2F5cyB0byBvbmx5IHVzZSBhIHN1YnNldCBvZiBYYWxhbiwgc28gdGhhdCBvbmx5IGEgbWluaW1hbCBqYXIgd291bGQgYmUgcmVxdWlyZWQuPC9wPjxwPjxpbWcgc3JjPSJjb21waWxhdGlvbi5naWYiIGFsdD0iY29tcGlsYXRpb24uZ2lmIi8+PC9wPjwvczI+PGFuY2hvciBuYW1lPSJvcHRpbWl6YXRpb25zIi8+PHMyIHRpdGxlPSJGdXR1cmUgT3B0aW1pemF0aW9ucyI+PHA+PGxpbms+RnV0dXJlIE9wdGltaXphdGlvbnM8L2xpbms+PC9wPjxwPlRoaXMgc2VjdGlvbiBlbnVtZXJhdGVzIHNvbWUgb3B0aW1pemF0aW9ucyB0aGF0IHdlJ3JlIHBsYW5uaW5nIHRvIGRvIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBYYWxhbi48L3A+PHA+TGlrZWx5IG5lYXIgdGVybSBvcHRpbWl6YXRpb25zIChuZXh0IHNpeCBtb250aHM/KTo8L3A+PG9sPjxsaT5CeSBwcmUtYW5hbHlzaXMgb2YgdGhlIHN0eWxlc2hlZXQsIHBydW5lIG5vZGVzIGZyb20gdGhlIHRyZWUgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkIGFuZCBjYW4gYmUgcHJlZGljdGVkIHRoYXQgdGhleSB3b24ndCBiZSB2aXNpdGVkIGFnYWluLjwvbGk+PGxpPkVsaW1pbmF0ZSByZWR1bmRlbnQgZXhwcmVzc2lvbnMgKHhzbDp3aGVuLCB2YXJpYWJsZSBzZXRzLCByb290ZWQgcGF0dGVybnMsIGV0Yy4pLjwvbGk+PGxpPk9wdGltaXplIHZhcmlhYmxlIHBhdHRlcm5zIHN1Y2ggYXMgJmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJmb28iJmd0OyZsdDt4c2w6dmFyaWFibGUgc2VsZWN0PSJ5YWRhIi8mZ3Q7Jmx0Oy94c2w6dmFyaWFibGUmZ3Q7IGludG8gJmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJmb28iIHNlbGVjdD0ic3RyaW5nKHlhZGEpIi8mZ3Q7LCBpbiBvcmRlciB0byByZWR1Y2UgcmVzdWx0IHRyZWUgZnJhZ21lbnQgY3JlYXRpb24uPC9saT48bGk+UmVkdWNlIHNpemUgb2YgU3RyZWUgbm9kZXMuPC9saT48bGk+SW1wbGVtZW50IG91ciBvd24gTmFtZXNwYWNlU3VwcG9ydCBjbGFzcyAodGhlIFNBWDIgb25lIGlzIHRvbyBleHBlbnNpdmUpLjwvbGk+PGxpPk1vcmUgc3BlY2lhbGl6YXRpb24gb2YgaXR0ZXJhdG9ycyBhbmQgd2Fsa2Vycy48L2xpPjxsaT5GdWxsIEphdmEgY29tcGlsYXRpb24gc3VwcG9ydC48L2xpPjxsaT5TY2hlbWEgQXdhcmVuZXNzIChpZiAiLy9mb28iLCB0aGUgU2NoZW1hIGNhbiB0ZWxsIHVzIHdoZXJlIHRvIGxvb2ssIGJ1dCB3ZSBuZWVkIHN0YW5kYXJkIGludGVyZmFjZSB0byBTY2hlbWFzKS48L2xpPjwvb2w+PHA+TGlrZWx5IGxvbmdlciB0ZXJtIG9wdGltaXphdGlvbnMgKDEyLTE4IG1vbnRocz8pOjwvcD48b2w+PGxpPk9uLXRoZS1mbHkgaW5kZXhpbmcuPC9saT48bGk+UHJlZGljdCBpZiBub2RlcyB3b24ndCBiZSBwcm9jZXNzZWQgYXQgYWxsLCBhbmQgc28gZG9uJ3QgYnVpbGQgdGhlbSwgYWNoaWV2ZSBmdWxsIHN0cmVhbWluZyBzdXBwb3J0IGZvciBhIGNlcnRhaW4gY2xhc3Mgb2Ygc3R5bGVzaGVldHMuPC9saT48L29sPjwvczI+PGFuY2hvciBuYW1lPSJjb2RpbmciLz4gCi0gIDxzMiB0aXRsZT0iQ29kaW5nIENvbnZlbnRpb25zIj4gCi0JIDxwPjxsaW5rPkNvZGluZyBDb252ZW50aW9uczwvbGluaz48L3A+IAotCSA8cD5UaGlzIHNlY3Rpb24gZG9jdW1lbnRzIHRoZSBjb2RpbmcgY29udmVudGlvbnMgdXNlZCBpbiB0aGUgWGFsYW4KLQkJc291cmNlLjwvcD4gCi0JIDxvbD4gCi0JCTxsaT5DbGFzcyBmaWxlcyBhcmUgYXJyYW5nZWQgd2l0aCBjb25zdHJ1Y3RvcnMgYW5kIHBvc3NpYmx5IGFuIGluaXQoKQotCQkgIGZ1bmN0aW9uIGZpcnN0LCBwdWJsaWMgQVBJIG1ldGhvZHMgc2Vjb25kLCBwYWNrYWdlIHNwZWNpZmljLCBwcm90ZWN0ZWQsIGFuZAotCQkgIHByaXZhdGUgbWV0aG9kcyBmb2xsb3dpbmcgKGFycmFuZ2VkIGJhc2VkIG9uIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSksIG1lbWJlcgotCQkgIHZhcmlhYmxlcyB3aXRoIHRoZWlyIGdldHRlci9zZXR0ZXIgYWNjZXNzIG1ldGhvZHMgbGFzdC48L2xpPiAKLQkJPGxpPk5vbi1zdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcmUgcHJlZml4ZWQgd2l0aCAibV8iLjwvbGk+IAotCQk8bGk+c3RhdGljIGZpbmFsIG1lbWJlciB2YXJpYWJsZXMgc2hvdWxkIGFsd2F5cyBiZSB1cHBlciBjYXNlLCB3aXRob3V0Ci0JCSAgdGhlICJtXyIgcHJlZml4LiBUaGV5IG5lZWQgbm90IGhhdmUgYWNjZXNzb3JzLjwvbGk+IAotCQk8bGk+UHJpdmF0ZSBtZW1iZXIgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCBhY2Nlc3NlZCBvdXRzaWRlIHRoZSBjbGFzcyBuZWVkCi0JCSAgbm90IGhhdmUgZ2V0dGVyL3NldHRlciBtZXRob2RzIGRlY2xhcmVkLjwvbGk+IAotCQk8bGk+UHJpdmF0ZSBtZW1iZXIgdmFyaWFibGVzIHRoYXQgYXJlIGFjY2Vzc2VkIG91dHNpZGUgdGhlIGNsYXNzIHNob3VsZAotCQkgIGhhdmUgZWl0aGVyIHBhY2thZ2Ugc3BlY2lmaWMgb3IgcHVibGljIGdldHRlci9zZXR0ZXIgbWV0aG9kcyBkZWNsYXJlZC4gQWxsCi0JCSAgYWNjZXNzb3JzIHNob3VsZCBmb2xsb3cgdGhlIGJlYW4gZGVzaWduIHBhdHRlcm5zLjwvbGk+IAotCQk8bGk+UGFja2FnZS1zY29wZWQgbWVtYmVyIHZhcmlhYmxlcywgcHVibGljIG1lbWJlciB2YXJpYWJsZXMsIGFuZAotCQkgIHByb3RlY3RlZCBtZW1iZXIgdmFyaWFibGVzIHNob3VsZCBub3QgYmUgZGVjbGFyZWQuPC9saT4gCi0JIDwvb2w+IAotICA8L3MyPjxhbmNob3IgbmFtZT0ib3BlbiIvPiAKLSAgCi08L3MxPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy9kZXNpZ24vb3JnX2FwYWNoZS5naWYgYi94ZG9jcy9zb3VyY2VzL2Rlc2lnbi9vcmdfYXBhY2hlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1ZjI2NC4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL2Rlc2lnbi9vcmdfYXBhY2hlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3Byb2Nlc3MuZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24vcHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YTg3MWUuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy9kZXNpZ24vcHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL2Rlc2lnbi90cmF4LmdpZiBiL3hkb2NzL3NvdXJjZXMvZGVzaWduL3RyYXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWI5NjE0Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3RyYXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy9kZXNpZ24veGFsYW4uZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24veGFsYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTRhNTdjLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3hhbGFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3hhbGFuMV8xeDEuZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24veGFsYW4xXzF4MS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZTE1MzYuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy9kZXNpZ24veGFsYW4xXzF4MS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL2Rlc2lnbi94bWxsb2dvLmdpZiBiL3hkb2NzL3NvdXJjZXMvZGVzaWduL3htbGxvZ28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjMxODhkLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3htbGxvZ28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy9kZXNpZ24veHBhdGguZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24veHBhdGguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4ZjljLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3hwYXRoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMvZGVzaWduL3hzbHRfYWJzdHJhY3QuZ2lmIGIveGRvY3Mvc291cmNlcy9kZXNpZ24veHNsdF9hYnN0cmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMDQxYTYuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy9kZXNpZ24veHNsdF9hYnN0cmFjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL2VudGl0aWVzLmVudCBiL3hkb2NzL3NvdXJjZXMvZW50aXRpZXMuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2RlMDQ0Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMvZW50aXRpZXMuZW50CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgZW5jb2Rpbmc9IlVTLUFTQ0lJIj8+Ci0KLTwhRU5USVRZIHhzbHQ0aiAiWGFsYW4tSmF2YSI+Ci08IUVOVElUWSB4c2x0NGoyICJYYWxhbi1KYXZhIDIiPgotPCFFTlRJVFkgeHNsdDRqLWRpc3QgInhhbGFuLWpfMl8wXzEiPgotPCFFTlRJVFkgeHNsdDRqLWN1cnJlbnQgIiZ4c2x0NGo7IHZlcnNpb24gMi4wLjEiPgotPCFFTlRJVFkgeG1sNGogIlhlcmNlcy1KYXZhIj4KLTwhRU5USVRZIHhtbDRqLXVzZWQgIiZ4bWw0ajsgdmVyc2lvbiAxLjMuMCI+Ci08IUVOVElUWSB4c2x0NGMgIlhhbGFuLUMrKyI+Ci08IUVOVElUWSB4bWw0YyAiWGVyY2VzLUMrKyI+Ci08IUVOVElUWSBkb3dubG9hZCAiVGhlICZ4c2x0NGotY3VycmVudDsgZG93bmxvYWQgZnJvbSB4bWwuYXBhY2hlLm9yZyBpbmNsdWRlcyB4ZXJjZXMuamFyIGZyb20gJnhtbDRqLXVzZWQ7LiI+Ci08IUVOVElUWSB0cmF4c2FtcGxlbm90ZSAiVG8gcnVuIHRoZSB0cmF4IHNhbXBsZSwgeW91IG11c3QgYmUgdXNpbmcgYW4gWE1MIHBhcnNlciAoc3VjaCBhcyBYZXJjZXMgMS4zLjAgb3IgQ3JpbXNvbiAxLjEpIAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZnVsbHkgaW1wbGVtZW50cyB0aGUgSkFYUCAxLjEgamF2YXgueG1sLnBhcnNlcnMgaW50ZXJmYWNlLiI+Ci0KZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMvdHJheC90cmF4LnhtbCBiL3hkb2NzL3NvdXJjZXMvdHJheC90cmF4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlY2IwMS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3RyYXgvdHJheC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgc3BlYyBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9zcGVjLmR0ZCI+Ci08c3BlYz4gCi0gIDx0aXRsZT5UcmFuc2Zvcm1hdGlvbiBBUEkgRm9yIFhNTCAoVHJBWCk8L3RpdGxlPgotICA8ZnJvbnRtYXR0ZXI+IAotICA8cHViZGF0ZT5Ob3ZlbWJlciAxMiwgMjAwMDwvcHViZGF0ZT4gCi0gIDxjb3B5cmlnaHQ+Q29weXJpZ2h0IDIwMDAgSmF2YSBDb21tdW5pdHkgUHJvY2VzcyAoU3VuIE1pY3Jvc3lzdGVtcywKLQkgSW5jLik8L2NvcHlyaWdodD4gCi0gIDxhdXRob3I+PGZpcnN0bmFtZT5TY290dDwvZmlyc3RuYW1lPiAKLQkgPHN1cm5hbWU+Qm9hZzwvc3VybmFtZT4gCi0JIDxvcmduYW1lPklCTSBSZXNlYXJjaDwvb3JnbmFtZT4gCi0JIDxhZGRyZXNzPiAKLQkJPGVtYWlsPnNib2FnQGxvdHVzLmNvbTwvZW1haWw+IAotCSA8L2FkZHJlc3M+IAotICA8L2F1dGhvcj48L2Zyb250bWF0dGVyPiAKLSAgPGludHJvZHVjdGlvbj4gCi0gIDx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPiAKLSAgPHBhcmE+VGhpcyBvdmVydmlldyBkZXNjcmliZXMgdGhlIHNldCBvZiBBUElzIGNvbnRhaW5lZCBpbgotCSA8dWxpbmsgdXJsPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+amF2YXgueG1sLnRyYW5zZm9ybTwvdWxpbms+LCA8dWxpbmsgdXJsPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+amF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW08L3VsaW5rPiwgPHVsaW5rIHVybD0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPmphdmF4LnhtbC50cmFuc2Zvcm0uZG9tPC91bGluaz4sIGFuZCA8dWxpbmsgdXJsPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+amF2YXgueG1sLnRyYW5zZm9ybS5zYXg8L3VsaW5rPi4gRm9yIHRoZSBzYWtlIG9mIGJyZXZpdHksIHRoZXNlIGludGVyZmFjZXMgYXJlIHJlZmVycmVkIHRvCi0JIGFzIFRyQVggKFRyYW5zZm9ybWF0aW9uIEFQSSBmb3IgWE1MKS4gPC9wYXJhPiAKLSAgPHBhcmE+VGhlcmUgaXMgYSBicm9hZCBuZWVkIGZvciBKYXZhIGFwcGxpY2F0aW9ucyB0byBiZSBhYmxlIHRvIHRyYW5zZm9ybSBYTUwKLQkgYW5kIHJlbGF0ZWQgdHJlZS1zaGFwZWQgZGF0YSBzdHJ1Y3R1cmVzLiBJbiBmYWN0LCBYTUwgaXMgbm90IG5vcm1hbGx5IHZlcnkKLQkgdXNlZnVsIHRvIGFuIGFwcGxpY2F0aW9uIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBzb21lIHNvcnQgb2YgdHJhbnNmb3JtYXRpb24sCi0JIHVubGVzcyB0aGUgc2VtYW50aWMgc3RydWN0dXJlIGlzIHVzZWQgZGlyZWN0bHkgYXMgZGF0YS4gQWxtb3N0IGFsbCBYTUwtcmVsYXRlZAotCSBhcHBsaWNhdGlvbnMgbmVlZCB0byBwZXJmb3JtIHRyYW5zZm9ybWF0aW9ucy4gVHJhbnNmb3JtYXRpb25zIG1heSBiZSBkZXNjcmliZWQKLQkgYnkgSmF2YSBjb2RlLCBQZXJsIGNvZGUsIDx1bGluayB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPlhTTFQ8L3VsaW5rPgotCSBTdHlsZXNoZWV0cywgb3RoZXIgdHlwZXMgb2Ygc2NyaXB0LCBvciBieSBwcm9wcmlldGFyeSBmb3JtYXRzLiBUaGUgaW5wdXRzLCBvbmUKLQkgb3IgbXVsdGlwbGUsIHRvIGEgdHJhbnNmb3JtYXRpb24sIG1heSBiZSBhIFVSTCwgWE1MIHN0cmVhbSwgYSBET00gdHJlZSwgU0FYCi0JIEV2ZW50cywgb3IgYSBwcm9wcmlldGFyeSBmb3JtYXQgb3IgZGF0YSBzdHJ1Y3R1cmUuIFRoZSBvdXRwdXQgdHlwZXMgYXJlIHRoZQotCSBwcmV0dHkgbXVjaCB0aGUgc2FtZSB0eXBlcyBhcyB0aGUgaW5wdXRzLCBidXQgZGlmZmVyZW50IGlucHV0cyBtYXkgbmVlZCB0byBiZQotCSBjb21iaW5lZCB3aXRoIGRpZmZlcmVudCBvdXRwdXRzLjwvcGFyYT4gCi0gIDxwYXJhPlRoZSBncmVhdCBjaGFsbGVuZ2Ugb2YgYSB0cmFuc2Zvcm1hdGlvbiBBUEkgaXMgaG93IHRvIGRlYWwgd2l0aCBhbGwgdGhlCi0JIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBpbnB1dHMgYW5kIG91dHB1dHMsIHdpdGhvdXQgYmVjb21pbmcgc3BlY2lhbGl6ZWQgZm9yCi0JIGFueSBvZiB0aGUgZ2l2ZW4gdHlwZXMuPC9wYXJhPiAKLSAgPHBhcmE+VGhlIEphdmEgY29tbXVuaXR5IHdpbGwgZ3JlYXRseSBiZW5lZml0IGZyb20gYSBjb21tb24gQVBJIHRoYXQgd2lsbAotCSBhbGxvdyB0aGVtIHRvIHVuZGVyc3RhbmQgYW5kIGFwcGx5IGEgc2luZ2xlIG1vZGVsLCB3cml0ZSB0byBjb25zaXN0ZW50Ci0JIGludGVyZmFjZXMsIGFuZCBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb25zIHBvbHltb3JwaGljYWxseS4gVHJBWCBhdHRlbXB0cyB0bwotCSBkZWZpbmUgYSBtb2RlbCB0aGF0IGlzIGNsZWFuIGFuZCBnZW5lcmljLCB5ZXQgZmlsbHMgZ2VuZXJhbCBhcHBsaWNhdGlvbgotCSByZXF1aXJlbWVudHMgYWNyb3NzIGEgd2lkZSB2YXJpZXR5IG9mIHVzZXMuIDwvcGFyYT4gCi0gIDxzZWN0Mj4gCi0JIDx0aXRsZT5HZW5lcmFsIFRlcm1pbm9sb2d5PC90aXRsZT4gCi0JIDxwYXJhPlRoaXMgc2VjdGlvbiB3aWxsIGV4cGxhaW4gc29tZSBnZW5lcmFsIHRlcm1pbm9sb2d5IHVzZWQgaW4gdGhpcwotCQlkb2N1bWVudC4gVGVjaG5pY2FsIHRlcm1pbm9sb2d5IHdpbGwgYmUgZXhwbGFpbmVkIGluIHRoZSBNb2RlbCBzZWN0aW9uLiBJbiBtYW55Ci0JCWNhc2VzLCB0aGUgZ2VuZXJhbCB0ZXJtaW5vbG9neSBvdmVybGFwcyB3aXRoIHRoZSB0ZWNobmljYWwgdGVybWlub2xvZ3kuPC9wYXJhPiAKLQkgPHZhcmlhYmxlbGlzdD4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPlRyZWU8L3Rlcm0+IAotCQkgIDxsaXN0aXRlbT5UaGlzIHRlcm0sIGFzIHVzZWQgd2l0aGluIHRoaXMgZG9jdW1lbnQsIGRlc2NyaWJlcyBhbgotCQkJIGFic3RyYWN0IHN0cnVjdHVyZSB0aGF0IGNvbnNpc3RzIG9mIG5vZGVzIG9yIGV2ZW50cyB0aGF0IG1heSBiZSBwcm9kdWNlZCBieQotCQkJIFhNTC4gQSBUcmVlIHBoeXNpY2FsbHkgbWF5IGJlIGEgRE9NIHRyZWUsIGEgc2VyaWVzIG9mIHdlbGwgYmFsYW5jZWQgcGFyc2UKLQkJCSBldmVudHMgKHN1Y2ggYXMgdGhvc2UgY29taW5nIGZyb20gYSBTQVgyIENvbnRlbnRIYW5kZXIpLCBhIHNlcmllcyBvZiByZXF1ZXN0cwotCQkJICh0aGUgcmVzdWx0IG9mIHdoaWNoIGNhbiBkZXNjcmliZSBhIHRyZWUpLCBvciBhIHN0cmVhbSBvZiBtYXJrZWQtdXAKLQkJCSBjaGFyYWN0ZXJzLjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPlNvdXJjZSBUcmVlKHMpPC90ZXJtPiAKLQkJICA8bGlzdGl0ZW0+T25lIG9yIG1vcmUgdHJlZXMgdGhhdCBhcmUgdGhlIGlucHV0cyB0byB0aGUKLQkJCSB0cmFuc2Zvcm1hdGlvbi48L2xpc3RpdGVtPiAKLQkJPC92YXJsaXN0ZW50cnk+IAotCQk8dmFybGlzdGVudHJ5PiAKLQkJICA8dGVybT5SZXN1bHQgVHJlZShzKTwvdGVybT4gCi0JCSAgPGxpc3RpdGVtPk9uZSBvciBtb3JlIHRyZWVzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgdGhlCi0JCQkgdHJhbnNmb3JtYXRpb24uPC9saXN0aXRlbT4gCi0JCTwvdmFybGlzdGVudHJ5PiAKLQkJPHZhcmxpc3RlbnRyeT4gCi0JCSAgPHRlcm0+VHJhbnNmb3JtYXRpb248L3Rlcm0+IAotCQkgIDxsaXN0aXRlbT5UaGUgcHJvY2Vzc29yIG9mIGNvbnN1bWluZyBhIHN0cmVhbSBvciB0cmVlIHRvIHByb2R1Y2UKLQkJCSBhbm90aGVyIHN0cmVhbSBvciB0cmVlLjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPklkZW50aXR5IChvciBDb3B5KSBUcmFuc2Zvcm1hdGlvbjwvdGVybT4gCi0JCSAgPGxpc3RpdGVtPlRoZSBwcm9jZXNzIG9mIHRyYW5zZm9ybWF0aW9uIGZyb20gYSBzb3VyY2UgdG8gYSByZXN1bHQsCi0JCQkgbWFraW5nIGFzIGZldyBzdHJ1Y3R1cmFsIGNoYW5nZXMgYXMgcG9zc2libGUgYW5kIG5vIGluZm9ybWF0aW9uYWwgY2hhbmdlcy4gVGhlCi0JCQkgdGVybSBpcyBzb21ld2hhdCBsb29zZWx5IHVzZWQsIGFzIHRoZSBwcm9jZXNzIGlzIHJlYWxseSBhIGNvcHkuIGZyb20gb25lCi0JCQkgImZvcm1hdCIgKHN1Y2ggYXMgYSBET00gdHJlZSwgc3RyZWFtLCBvciBzZXQgb2YgU0FYIGV2ZW50cykgdG8KLQkJCSBhbm90aGVyLjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPlNlcmlhbGl6YXRpb248L3Rlcm0+IAotCQkgIDxsaXN0aXRlbT5UaGUgcHJvY2VzcyBvZiB0YWtpbmcgYSB0cmVlIGFuZCB0dXJuaW5nIGl0IGludG8gYSBzdHJlYW0uIEluCi0JCQkgc29tZSBzZW5zZSwgYSBzZXJpYWxpemF0aW9uIGlzIGEgc3BlY2lhbGl6ZWQgdHJhbnNmb3JtYXRpb24uPC9saXN0aXRlbT4gCi0JCTwvdmFybGlzdGVudHJ5PiAKLQkJPHZhcmxpc3RlbnRyeT4gCi0JCSAgPHRlcm0+UGFyc2luZzwvdGVybT4gCi0JCSAgPGxpc3RpdGVtPlRoZSBwcm9jZXNzIG9mIHRha2luZyBhIHN0cmVhbSBhbmQgdHVybmluZyBpdCBpbnRvIGEgdHJlZS4gSW4KLQkJCSBzb21lIHNlbnNlLCBwYXJzaW5nIGlzIGEgc3BlY2lhbGl6ZWQgdHJhbnNmb3JtYXRpb24uPC9saXN0aXRlbT4gCi0JCTwvdmFybGlzdGVudHJ5PiAKLQkJPHZhcmxpc3RlbnRyeT4gCi0JCSAgPHRlcm0+VHJhbnNmb3JtZXI8L3Rlcm0+IAotCQkgIDxsaXN0aXRlbT5BIFRyYW5zZm9ybWVyIGlzIHRoZSBvYmplY3QgdGhhdCBleGVjdXRlcyB0aGUgdHJhbnNmb3JtYXRpb24uCi0JCQkgPC9saXN0aXRlbT4gCi0JCTwvdmFybGlzdGVudHJ5PiAKLQkJPHZhcmxpc3RlbnRyeT4gCi0JCSAgPHRlcm0+VHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zPC90ZXJtPiAKLQkJICA8bGlzdGl0ZW0+RGVzY3JpYmVzIHRoZSB0cmFuc2Zvcm1hdGlvbi4gQSBmb3JtIG9mIGNvZGUsIHNjcmlwdCwgb3IKLQkJCSBzaW1wbHkgYSBkZWNsYXJhdGlvbiBvciBzZXJpZXMgb2YgZGVjbGFyYXRpb25zLjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPlN0eWxlc2hlZXQ8L3Rlcm0+IAotCQkgIDxsaXN0aXRlbT5UaGUgc2FtZSBhcyAidHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zLCIgZXhjZXB0IGl0IGlzCi0JCQkgbGlrZWx5IHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCA8dWxpbmsKLQkJCSB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPlhTTFQ8L3VsaW5rPi48L2xpc3RpdGVtPiAKLQkJPC92YXJsaXN0ZW50cnk+IAotCQk8dmFybGlzdGVudHJ5PiAKLQkJICA8dGVybT5UZW1wbGF0ZXM8L3Rlcm0+IAotCQkgIDxsaXN0aXRlbT5Bbm90aGVyIGZvcm0gb2YgInRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucy4iIEluIHRoZSBUckFYCi0JCQkgaW50ZXJmYWNlLCB0aGlzIHRlcm0gaXMgdXNlZCB0byBkZXNjcmliZSBwcm9jZXNzZWQgb3IgY29tcGlsZWQgdHJhbnNmb3JtYXRpb24KLQkJCSBpbnN0cnVjdGlvbnMuIFRoZSBTb3VyY2UgZmxvd3MgdGhyb3VnaCBhIFRlbXBsYXRlcyBvYmplY3QgdG8gYmUgZm9ybWVkIGludG8gdGhlCi0JCQkgUmVzdWx0LjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPlByb2Nlc3NvcjwvdGVybT4gCi0JCSAgPGxpc3RpdGVtPkEgZ2VuZXJhbCB0ZXJtIGZvciB0aGUgdGhpbmcgdGhhdCBtYXkgYm90aCBwcm9jZXNzIHRoZQotCQkJIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucywgYW5kIHBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uLjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPkRPTTwvdGVybT4gCi0JCSAgPGxpc3RpdGVtPkRvY3VtZW50IE9iamVjdCBNb2RlbCwgc3BlY2lmaWNhbGx5IHJlZmVycmluZyB0byB0aGUKLQkJCSA8dGVybXJlZiBsaW5rLXVybD0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTIgIj5Eb2N1bWVudCBPYmplY3QgTW9kZWwKLQkJCSAoRE9NKSBMZXZlbCAyIFNwZWNpZmljYXRpb248L3Rlcm1yZWY+LjwvbGlzdGl0ZW0+IAotCQk8L3Zhcmxpc3RlbnRyeT4gCi0JCTx2YXJsaXN0ZW50cnk+IAotCQkgIDx0ZXJtPlNBWDwvdGVybT4gCi0JCSAgPGxpc3RpdGVtPlNpbXBsZSBBUEkgZm9yIFhNTCwgc3BlY2lmaWNhbGx5IHJlZmVycmluZyB0byB0aGUKLQkJCSA8dGVybXJlZiBsaW5rLXVybD0iaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9TQVgyIj5TQVggMi4wCi0JCQkgcmVsZWFzZTwvdGVybXJlZj4uPC9saXN0aXRlbT4gCi0JCTwvdmFybGlzdGVudHJ5PiAKLQkgPC92YXJpYWJsZWxpc3Q+IAotICA8L3NlY3QyPjwvaW50cm9kdWN0aW9uPgotICA8cmVxdWlyZW1lbnRzPiAKLSAgPHRpdGxlPlJlcXVpcmVtZW50czwvdGl0bGU+IAotICA8cGFyYT5UaGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBoYXZlIGJlZW4gZGV0ZXJtaW5lZCBmcm9tIGJyb2FkIGV4cGVyaWVuY2UKLQkgd2l0aCBYTUwgcHJvamVjdHMgZnJvbSB0aGUgdmFyaW91cyBtZW1iZXJzIHBhcnRpY2lwYXRpbmcgb24gdGhlIEpDUC48L3BhcmE+IAotICA8b3JkZXJlZGxpc3Q+IAotCSA8bGlzdGl0ZW0gaWQ9InJlcXVpcmVtZW50LXNpbXBsZSI+VHJBWCBtdXN0IHByb3ZpZGUgYSBjbGVhbiwgc2ltcGxlCi0JCWludGVyZmFjZSBmb3Igc2ltcGxlIHVzZXMuPC9saXN0aXRlbT4gCi0JIDxsaXN0aXRlbSBpZD0icmVxdWlyZW1lbnQtZ2VuZXJhbCI+VHJBWCBtdXN0IGJlIHBvd2VyZnVsIGVub3VnaCB0byBiZQotCQlhcHBsaWVkIHRvIGEgd2lkZSByYW5nZSBvZiB1c2VzLCBzdWNoIGFzLCBlLWNvbW1lcmNlLCBjb250ZW50IG1hbmFnZW1lbnQsCi0JCXNlcnZlciBjb250ZW50IGRlbGl2ZXJ5LCBhbmQgY2xpZW50IGFwcGxpY2F0aW9ucy48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1vcHRpbWl6ZWFibGUiPkEgcHJvY2Vzc29yIHRoYXQgaW1wbGVtZW50cyBhIFRyQVgKLQkJaW50ZXJmYWNlIG11c3QgYmUgb3B0aW1pemVhYmxlLiBQZXJmb3JtYW5jZSBpcyBhIGNyaXRpY2FsIGlzc3VlIGZvciBtb3N0Ci0JCXRyYW5zZm9ybWF0aW9uIHVzZSBjYXNlcy48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1jb21waWxlZC1tb2RlbCI+QXMgYSBzcGVjaWFsaXphdGlvbiBvZiB0aGUgYWJvdmUKLQkJcmVxdWlyZW1lbnQsIGEgVHJBWCBwcm9jZXNzb3IgbXVzdCBiZSBhYmxlIHRvIHN1cHBvcnQgYSBjb21waWxlZCBtb2RlbCwgc28gdGhhdAotCQlhIHNpbmdsZSBzZXQgb2YgdHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zIGNhbiBiZSBjb21waWxlZCwgb3B0aW1pemVkLCBhbmQKLQkJYXBwbGllZCB0byBhIGxhcmdlIHNldCBvZiBpbnB1dCBzb3VyY2VzLjwvbGlzdGl0ZW0+IAotCSA8bGlzdGl0ZW0gaWQ9InJlcXVpcmVtZW50LWluZGVwZW5kZW5jZSI+VHJBWCBtdXN0IG5vdCBiZSBkZXBlbmRlbnQgYW4gYW55Ci0JCWdpdmVuIHR5cGUgb2YgdHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zLiBGb3IgaW5zdGFuY2UsIGl0IG11c3QgcmVtYWluCi0JCWluZGVwZW5kZW50IG9mIDx1bGluayB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPlhTTFQ8L3VsaW5rPi48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1mcm9tLWRvbSI+VHJBWCBtdXN0IGJlIGFibGUgdG8gYWxsb3cgcHJvY2Vzc29ycwotCQl0byB0cmFuc2Zvcm0gRE9NIHRyZWVzLjwvbGlzdGl0ZW0+IAotCSA8bGlzdGl0ZW0gaWQ9InJlcXVpcmVtZW50LXRvLWRvbSI+VHJBWCBtdXN0IGJlIGFibGUgdG8gYWxsb3cgcHJvY2Vzc29ycyB0bwotCQlwcm9kdWNlIERPTSB0cmVlcy48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1mcm9tLXNheCI+VHJBWCBtdXN0IGFsbG93IHByb2Nlc3NvcnMgdG8gdHJhbnNmb3JtCi0JCVNBWCBldmVudHMuPC9saXN0aXRlbT4gCi0JIDxsaXN0aXRlbSBpZD0icmVxdWlyZW1lbnQtdG8tc2F4Ij5UckFYIG11c3QgYWxsb3cgcHJvY2Vzc29ycyB0byBwcm9kdWNlIFNBWAotCQlldmVudHMuPC9saXN0aXRlbT4gCi0JIDxsaXN0aXRlbSBpZD0icmVxdWlyZW1lbnQtZnJvbS1zdHJlYW0iPlRyQVggbXVzdCBhbGxvdyBwcm9jZXNzb3JzIHRvCi0JCXRyYW5zZm9ybSBzdHJlYW1zIG9mIFhNTC48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC10by1zdHJlYW0iPlRyQVggbXVzdCBhbGxvdyBwcm9jZXNzb3JzIHRvIHByb2R1Y2UKLQkJWE1MLCBIVE1MLCBhbmQgb3RoZXIgdHlwZXMgb2Ygc3RyZWFtcy48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1jb21iby1pbnB1dC1vdXRwdXQiPlRyQVggbXVzdCBhbGxvdyBwcm9jZXNzb3JzIHRvCi0JCWltcGxlbWVudCB0aGUgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgaW5wdXRzIGFuZCBvdXRwdXRzIHdpdGhpbiBhIHNpbmdsZQotCQlwcm9jZXNzb3IuPC9saXN0aXRlbT4gCi0JIDxsaXN0aXRlbSBpZD0icmVxdWlyZW1lbnQtbGltaXRlZC1pbnB1dC1vdXRwdXQiPlRyQVggbXVzdCBhbGxvdyBwcm9jZXNzb3JzCi0JCXRvIGltcGxlbWVudCBvbmx5IGEgbGltaXRlZCBzZXQgb2YgaW5wdXRzLiBGb3IgaW5zdGFuY2UsIGl0IHNob3VsZCBiZSBwb3NzaWJsZQotCQl0byB3cml0ZSBhIHByb2Nlc3NvciB0aGF0IGltcGxlbWVudHMgdGhlIFRyQVggaW50ZXJmYWNlcyBhbmQgdGhhdCBvbmx5Ci0JCXByb2Nlc3NlcyBET00gdHJlZXMsIG5vdCBzdHJlYW1zIG9yIFNBWCBldmVudHMuPC9saXN0aXRlbT4gCi0JIDxsaXN0aXRlbSBpZD0icmVxdWlyZW1lbnQtcHJvcHJpZXRhcnktZGF0YS1zdHJ1Y3R1cmVzIj5UckFYIHNob3VsZCBhbGxvdyBhCi0JCXByb2Nlc3NvciB0byBpbXBsZW1lbnQgdHJhbnNmb3JtYXRpb25zIG9mIHByb3ByaWV0YXJ5IGRhdGEgc3RydWN0dXJlcy4gRm9yCi0JCWluc3RhbmNlLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaW1wbGVtZW50IGEgcHJvY2Vzc29yIHRoYXQgcHJvdmlkZXMgVHJBWAotCQlpbnRlcmZhY2VzIHRoYXQgcGVyZm9ybXMgdHJhbnNmb3JtYXRpb24gb2YgSkRPTSB0cmVlcy48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1zZXJpYWxpemF0aW9uLXByb3BzIj5UckFYIG11c3QgYWxsb3cgdGhlIHNldHRpbmcKLQkJb2Ygc2VyaWFsaXphdGlvbiBwcm9wZXJ0aWVzLCB3aXRob3V0IGNvbnN0cmFpbnQgYXMgdG8gd2hhdCB0aGUgZGV0YWlscyBvZiB0aG9zZQotCQlwcm9wZXJ0aWVzIGFyZS48L2xpc3RpdGVtPiAKLQkgPGxpc3RpdGVtIGlkPSJyZXF1aXJlbWVudC1zZXR0aW5nLXBhcmFtZXRlcnMiPlRyQVggbXVzdCBhbGxvdyB0aGUgc2V0dGluZwotCQlvZiBwYXJhbWV0ZXJzIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMuPC9saXN0aXRlbT4gCi0JIDxsaXN0aXRlbSBpZD0icmVxdWlyZW1lbnQtbmFtZXNwYWNlZC1wcm9wZXJ0aWVzIj5UckFYIG11c3Qgc3VwcG9ydCB0aGUKLQkJc2V0dGluZyBvZiBwYXJhbWV0ZXJzIGFuZCBwcm9wZXJ0aWVzIGFzIFhNTCBOYW1lc3BhY2VkIGl0ZW1zIChpLmUuLCBxdWFsaWZpZWQKLQkJbmFtZXMpLjwvbGlzdGl0ZW0+IAotCSA8bGlzdGl0ZW0gaWQ9InJlcXVpcmVtZW50LXJlbGF0aXZlLXVybC1yZXNvbHV0aW9uIj5UckFYIG11c3Qgc3VwcG9ydCBVUkwKLQkJcmVzb2x1dGlvbiBmcm9tIHdpdGhpbiB0aGUgdHJhbnNmb3JtYXRpb24sIGFuZCBoYXZlIGl0IHJldHVybiB0aGUgbmVlZGVkIGRhdGEKLQkJc3RydWN0dXJlLjwvbGlzdGl0ZW0+IAotCSA8bGlzdGl0ZW0gaWQ9InJlcXVpcmVtZW50LWVycm9yLXJlcG9ydGluZyI+VHJBWCBtdXN0IGhhdmUgYSBtZWNoYW5pc20gZm9yCi0JCXJlcG9ydGluZyBlcnJvcnMgYW5kIHdhcm5pbmdzIHRvIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLjwvbGlzdGl0ZW0+IAotICA8L29yZGVyZWRsaXN0PiA8L3JlcXVpcmVtZW50cz4gCi0gIDxtb2RlbD4gCi0gIDx0aXRsZT5Nb2RlbDwvdGl0bGU+IAotICA8cGFyYT5UaGUgc2VjdGlvbiBkZWZpbmVzIHRoZSBhYnN0cmFjdCBtb2RlbCBmb3IgVHJBWCwgYXBhcnQgZnJvbSB0aGUgZGV0YWlscwotCSBvZiB0aGUgaW50ZXJmYWNlcy48L3BhcmE+IAotICA8cGFyYT5BIFRSYVggPHRlcm1yZWYKLQkgbGluay11cmw9InBhdHRlcm4tVHJhbnNmb3JtZXJGYWN0b3J5Ij5UcmFuc2Zvcm1lckZhY3Rvcnk8L3Rlcm1yZWY+IGlzIGFuIG9iamVjdAotCSB0aGF0IHByb2Nlc3NlcyB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMsIGFuZCBwcm9kdWNlcwotCSA8dGVybXJlZiBsaW5rLXVybD0icGF0dGVybi1UZW1wbGF0ZXMiPlRlbXBsYXRlczwvdGVybXJlZj4gKGluIHRoZSB0ZWNobmljYWwKLQkgdGVybWlub2xvZ3kpLiBBIDx0ZXJtcmVmIGxpbmstdXJsPSJwYXR0ZXJuLVRlbXBsYXRlcyI+VGVtcGxhdGVzPC90ZXJtcmVmPgotCSBvYmplY3QgcHJvdmlkZXMgYSA8dGVybXJlZgotCSBsaW5rLXVybD0icGF0dGVybi1UcmFuc2Zvcm1lciI+VHJhbnNmb3JtZXI8L3Rlcm1yZWY+LCB3aGljaCB0cmFuc2Zvcm1zIG9uZSBvcgotCSBtb3JlIDx0ZXJtcmVmIGxpbmstdXJsPSJwYXR0ZXJuLVNvdXJjZSI+U291cmNlPC90ZXJtcmVmPnMgaW50byBvbmUgb3IgbW9yZQotCSA8dGVybXJlZiBsaW5rLXVybD0icGF0dGVybi1SZXN1bHQiPlJlc3VsdDwvdGVybXJlZj5zLjwvcGFyYT4gCi0gIDxwYXJhPlRvIHVzZSB0aGUgVFJhWCBpbnRlcmZhY2UsIHlvdSBjcmVhdGUgYQotCSA8dGVybXJlZiBsaW5rLXVybD0icGF0dGVybi1UcmFuc2Zvcm1lckZhY3RvcnkiPlRyYW5zZm9ybWVyRmFjdG9yeTwvdGVybXJlZj4sCi0JIHdoaWNoIG1heSBkaXJlY3RseSBwcm92aWRlIGEgPHRlcm1yZWYKLQkgbGluay11cmw9InBhdHRlcm4tVHJhbnNmb3JtZXJzIj5UcmFuc2Zvcm1lcnM8L3Rlcm1yZWY+LCBvciB3aGljaCBjYW4gcHJvdmlkZQotCSA8dGVybXJlZiBsaW5rLXVybD0icGF0dGVybi1UZW1wbGF0ZXMiPlRlbXBsYXRlczwvdGVybXJlZj4gZnJvbSBhIHZhcmlldHkgb2YKLQkgPHRlcm1yZWYgbGluay11cmw9InBhdHRlcm4tU291cmNlIj5Tb3VyY2U8L3Rlcm1yZWY+cy4gVGhlCi0JIDx0ZXJtcmVmIGxpbmstdXJsPSJwYXR0ZXJuLVRlbXBsYXRlcyI+VGVtcGxhdGVzPC90ZXJtcmVmPiBvYmplY3QgaXMgYSBwcm9jZXNzZWQKLQkgb3IgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucywgYW5kIHByb3ZpZGVzIGEKLQkgPHRlcm1yZWYgbGluay11cmw9InBhdHRlcm4tVHJhbnNmb3JtZXIiPlRyYW5zZm9ybWVyPC90ZXJtcmVmPi4gVGhlCi0JIDx0ZXJtcmVmIGxpbmstdXJsPSJwYXR0ZXJuLVRyYW5zZm9ybWVyIj5UcmFuc2Zvcm1lcjwvdGVybXJlZj4gcHJvY2Vzc2VzIGEKLQkgPHRlcm1yZWYgbGluay11cmw9InBhdHRlcm4tVHJhbnNmb3JtZXIiPlNvdXJjZTwvdGVybXJlZj4gYWNjb3JkaW5nIHRvIHRoZQotCSBpbnN0cnVjdGlvbnMgZm91bmQgaW4gdGhlIDx0ZXJtcmVmCi0JIGxpbmstdXJsPSJwYXR0ZXJuLVRlbXBsYXRlcyI+VGVtcGxhdGVzPC90ZXJtcmVmPiwgYW5kIHByb2R1Y2VzIGEKLQkgPHRlcm1yZWYgbGluay11cmw9InBhdHRlcm4tUmVzdWx0Ij5SZXN1bHQ8L3Rlcm1yZWY+LjwvcGFyYT4gCi0gIDxwYXJhPlRoZSBwcm9jZXNzIG9mIHRyYW5zZm9ybWF0aW9uIGZyb20gYSB0cmVlLCBlaXRoZXIgaW4gdGhlIGZvcm0gb2YgYW4KLQkgb2JqZWN0IG1vZGVsLCBvciBpbiB0aGUgZm9ybSBvZiBwYXJzZSBldmVudHMsIGludG8gYSBzdHJlYW0sIGlzIGtub3duIGFzCi0JIDx0ZXJtcmVmPnNlcmlhbGl6YXRpb248L3Rlcm1yZWY+LiBXZSBiZWxpZXZlIHRoaXMgaXMgdGhlIG1vc3Qgc3VpdGFibGUgdGVybSBmb3IKLQkgdGhpcyBwcm9jZXNzLCBkZXNwaXRlIHRoZSBvdmVybGFwIHdpdGggSmF2YSBvYmplY3Qgc2VyaWFsaXphdGlvbi48L3BhcmE+IAotICA8cGF0dGVybnMgbW9kdWxlPSJUUmFYIj4gPHBhdHRlcm4+PHBhdHRlcm4tbmFtZQotICBpZD0icGF0dGVybi1Qcm9jZXNzb3IiPlByb2Nlc3NvcjwvcGF0dGVybi1uYW1lPjxpbnRlbnQ+R2VuZXJpYyBjb25jZXB0IGZvciB0aGUKLSAgc2V0IG9mIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIFRyQVggaW50ZXJmYWNlcy48L2ludGVudD4KLSAgPHJlc3BvbnNpYmlsaXRpZXM+Q3JlYXRlIGNvbXBpbGVkIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucywgdHJhbnNmb3JtCi0gIHNvdXJjZXMsIGFuZCBtYW5hZ2UgdHJhbnNmb3JtYXRpb24gcGFyYW1ldGVycyBhbmQKLSAgcHJvcGVydGllcy48L3Jlc3BvbnNpYmlsaXRpZXM+PHRocmVhZC1zYWZldHk+T25seSB0aGUgVGVtcGxhdGVzIG9iamVjdCBjYW4gYmUKLSAgdXNlZCBjb25jdXJyZW50bHkgaW4gbXVsdGlwbGUgdGhyZWFkcy4gVGhlIHJlc3Qgb2YgdGhlIHByb2Nlc3NvciBkb2VzIG5vdCBkbwotICBzeW5jaHJvbml6ZWQgYmxvY2tpbmcsIGFuZCBzbyBtYXkgbm90IGJlIHVzZWQgdG8gcGVyZm9ybSBtdWx0aXBsZSBjb25jdXJyZW50Ci0gIG9wZXJhdGlvbnMuPC90aHJlYWQtc2FmZXR5PjwvcGF0dGVybj48cGF0dGVybj4gCi0gIDxwYXR0ZXJuLW5hbWUgaWQ9InBhdHRlcm4tVHJhbnNmb3JtZXJGYWN0b3J5Ij5UcmFuc2Zvcm1lckZhY3Rvcnk8L3BhdHRlcm4tbmFtZT4KLSAgPGludGVudD5TZXJ2ZSBhcyBhIHZlbmRvci1uZXV0cmFsIFByb2Nlc3NvciBpbnRlcmZhY2UgZm9yCi0gIDx1bGluayB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPlhTTFQ8L3VsaW5rPiBhbmQgc2ltaWxhcgotICBwcm9jZXNzb3JzLjwvaW50ZW50PiA8cmVzcG9uc2liaWxpdGllcz5TZXJ2ZSBhcyBhIGZhY3RvcnkgZm9yIGEgY29uY3JldGUKLSAgaW1wbGVtZW50YXRpb24gb2YgYW4gVHJhbnNmb3JtZXJGYWN0b3J5LCBzZXJ2ZSBhcyBhIGRpcmVjdCBmYWN0b3J5IGZvcgotICBUcmFuc2Zvcm1lciBvYmplY3RzLCBzZXJ2ZSBhcyBhIGZhY3RvcnkgZm9yIFRlbXBsYXRlcyBvYmplY3RzLCBhbmQgbWFuYWdlCi0gIHByb2Nlc3NvciBzcGVjaWZpYyBmZWF0dXJlcy48L3Jlc3BvbnNpYmlsaXRpZXM+IDx0aHJlYWQtc2FmZXR5PkEKLSAgVHJhbnNmb3JtZXJGYWN0b3J5IG1heSBub3QgcGVyZm9ybSBtdWxpdHBsZSBjb25jdXJyZW50Ci0gIG9wZXJhdGlvbnMuPC90aHJlYWQtc2FmZXR5PiA8L3BhdHRlcm4+IDxwYXR0ZXJuPiAKLSAgPHBhdHRlcm4tbmFtZSBpZD0icGF0dGVybi1UZW1wbGF0ZXMiPlRlbXBsYXRlczwvcGF0dGVybi1uYW1lPiA8aW50ZW50PlRoZQotICBydW50aW1lIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMuPC9pbnRlbnQ+IAotICA8cmVzcG9uc2liaWxpdGllcz5BIGRhdGEgYmFnIGZvciB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnM7IGFjdCBhcyBhIGZhY3RvcnkKLSAgZm9yIFRyYW5zZm9ybWVycy48L3Jlc3BvbnNpYmlsaXRpZXM+IDx0aHJlYWQtc2FmZXR5PlRocmVhZHNhZmUgZm9yIGNvbmN1cnJlbnQKLSAgdXNhZ2Ugb3ZlciBtdWx0aXBsZSB0aHJlYWRzIG9uY2UgY29uc3RydWN0aW9uIGlzIGNvbXBsZXRlLjwvdGhyZWFkLXNhZmV0eT4KLSAgPC9wYXR0ZXJuPiA8cGF0dGVybj4gPHBhdHRlcm4tbmFtZQotICBpZD0icGF0dGVybi1UcmFuc2Zvcm1lciI+VHJhbnNmb3JtZXI8L3BhdHRlcm4tbmFtZT4gPGludGVudD5BY3QgYXMgYSBwZXItdGhyZWFkCi0gIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0cmFuc2Zvcm1hdGlvbnMsIGFjdCBhcyBhbiBpbnRlcmZhY2UgZm9yIHBlcmZvcm1pbmcgdGhlCi0gIHRyYW5zZm9ybWF0aW9uLjwvaW50ZW50PjxyZXNwb25zaWJpbGl0aWVzPlBlcmZvcm0gdGhlCi0gIHRyYW5zZm9ybWF0aW9uLjwvcmVzcG9uc2liaWxpdGllcz4gPHRocmVhZC1zYWZldHk+T25seSBvbmUgaW5zdGFuY2UgcGVyIHRocmVhZAotICBpcyBzYWZlLjwvdGhyZWFkLXNhZmV0eT4gPG5vdGVzPlRoZSBUcmFuc2Zvcm1lciBpcyBib3VuZCB0byB0aGUgVGVtcGxhdGVzCi0gIG9iamVjdCB0aGF0IGNyZWF0ZWQgaXQuPC9ub3Rlcz4gPC9wYXR0ZXJuPiA8cGF0dGVybj4gCi0gIDxwYXR0ZXJuLW5hbWUgaWQ9InBhdHRlcm4tU291cmNlIj5Tb3VyY2U8L3BhdHRlcm4tbmFtZT4gPGludGVudD5TZXJ2ZSBhcyBhCi0gIHNpbmdsZSB2ZW5kb3ItbmV1dHJhbCBvYmplY3QgZm9yIG11bHRpcGxlIHR5cGVzIG9mIGlucHV0LjwvaW50ZW50PiAKLSAgPHJlc3BvbnNpYmlsaXRpZXM+QWN0IGFzIHNpbXBsZSBkYXRhIGhvbGRlciBmb3IgU3lzdGVtIElEcywgRE9NIG5vZGVzLCBzdHJlYW1zLAotICBldGMuPC9yZXNwb25zaWJpbGl0aWVzPiA8dGhyZWFkLXNhZmV0eT5UaHJlYWRzYWZlIGNvbmN1cnJlbnRseSBvdmVyIG11bHRpcGxlCi0gIHRocmVhZHMgZm9yIHJlYWQtb25seSBvcGVyYXRpb25zOyBtdXN0IGJlIHN5bmNocm9uaXplZCBmb3IgZWRpdAotICBvcGVyYXRpb25zLjwvdGhyZWFkLXNhZmV0eT4gPC9wYXR0ZXJuPjxwYXR0ZXJuPiAKLSAgPHBhdHRlcm4tbmFtZSBpZD0icGF0dGVybi1SZXN1bHQiPlJlc3VsdDwvcGF0dGVybi1uYW1lPiAKLSAgPHBvdGVudGlhbC1hbHRlcm5hdGUtbmFtZT5SZXN1bHRUYXJnZXQ8L3BvdGVudGlhbC1hbHRlcm5hdGUtbmFtZT4gPGludGVudD5TZXJ2ZQotICBhcyBhIHNpbmdsZSBvYmplY3QgZm9yIG11bHRpcGxlIHR5cGVzIG9mIG91dHB1dCwgc28gdGhlcmUgY2FuIGJlIHNpbXBsZSBwcm9jZXNzCi0gIG1ldGhvZCBzaWduYXR1cmVzLjwvaW50ZW50PiA8cmVzcG9uc2liaWxpdGllcz5BY3QgYXMgc2ltcGxlIGRhdGEgaG9sZGVyIGZvcgotICBvdXRwdXQgc3RyZWFtLCBET00gbm9kZSwgQ29udGVudEhhbmRsZXIsIGV0Yy48L3Jlc3BvbnNpYmlsaXRpZXM+IAotICA8dGhyZWFkLXNhZmV0eT5UaHJlYWRzYWZlIGNvbmN1cnJlbnRseSBvdmVyIG11bHRpcGxlIHRocmVhZHMgZm9yIHJlYWQtb25seSwKLSAgbXVzdCBiZSBzeW5jaHJvbml6ZWQgZm9yIGVkaXQuPC90aHJlYWQtc2FmZXR5PiA8L3BhdHRlcm4+IDwvcGF0dGVybnM+PC9tb2RlbD4gCi0gIDxzZWN0MSBpZD0icGFja2FnZSI+IAotCSA8dGl0bGU+amF2YXgueG1sLnRyYW5zZm9ybTwvdGl0bGU+IAotCSA8cGFyYT5UaGlzIHBhY2thZ2UgZGVmaW5lcyB0aGUgZ2VuZXJpYyBBUElzIGZvciBwcm9jZXNzaW5nIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucywKLQkJYW5kIHBlcmZvcm1pbmcgYSB0cmFuc2Zvcm1hdGlvbiBmcm9tIHNvdXJjZSB0byByZXN1bHQuIFRoZXNlIAotCQlpbnRlcmZhY2VzIGhhdmUgbm8gZGVwZW5kZW5jaWVzIG9uIFNBWCBvciB0aGUgRE9NIHN0YW5kYXJkLCBhbmQgdHJ5IHRvIG1ha2UgYXMKLQkJZmV3IGFzc3VtcHRpb25zIGFzIHBvc3NpYmxlIGFib3V0IHRoZSBkZXRhaWxzIG9mIHRoZSBzb3VyY2UgYW5kIHJlc3VsdCBvZiBhCi0JCXRyYW5zZm9ybWF0aW9uLiBUaGUgQVBJIGFjaGlldmVzIHRoaXMgYnkgZGVmaW5pbmcgCi0JCTxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTwvcGxpbms+IGFuZCAKLQkJPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0PC9wbGluaz4gaW50ZXJmYWNlcy48L3BhcmE+IAotCSA8cGFyYT5UbyBkZWZpbmUgY29uY3JldGUgY2xhc3NlcyBmb3IgdGhlIHVzZXIsIHRoZSBBUEkgZGVmaW5lcyBzcGVjaWFsaXphdGlvbnMKLQkJb2YgdGhlIGludGVyZmFjZXMgZm91bmQgYXQgdGhlIHJvb3QgbGV2ZWwuIFRoZXNlIGludGVyZmFjZXMgYXJlIGZvdW5kIGluIAotCQk8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXg8L3BsaW5rPiwgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uZG9tPC9wbGluaz4sCi0JCWFuZCA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW08L3BsaW5rPi48L3BhcmE+IAotCSA8c2VjdDI+IAotCQk8dGl0bGU+Q3JlYXRpbmcgT2JqZWN0czwvdGl0bGU+IAotCQk8cGFyYT5UaGUgQVBJIGFsbG93cyBhIGNvbmNyZXRlIAotCQkgIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTwvcGxpbms+IG9iamVjdCB0byBiZSBjcmVhdGVkIGZyb20KLQkJICB0aGUgc3RhdGljIGZ1bmN0aW9uIAotCQkgIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSNuZXdJbnN0YW5jZTwvcGxpbms+LiBUaGUKLQkJICAiamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkiIHN5c3RlbSBwcm9wZXJ0eSBkZXRlcm1pbmVzIHdoaWNoCi0JCSAgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbiB0byBpbnN0YW50aWF0ZS4gVGhpcyBwcm9wZXJ0eSBuYW1lcyBhIGNvbmNyZXRlIHN1YmNsYXNzCi0JCSAgb2YgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSBhYnN0cmFjdCBjbGFzcy4gSWYgdGhpcyBzeXN0ZW0gcHJvcGVydHkgaXMgbm90Ci0JCSAgZGVmaW5lZCwgYSBwbGF0Zm9ybSBkZWZhdWx0IGlzIHVzZWQuPC9wYXJhPiAKLQkgPC9zZWN0Mj4gCi0JIDxzZWN0Mj4gCi0JCTx0aXRsZT5TcGVjaWZpY2F0aW9uIG9mIElucHV0cyBhbmQgT3V0cHV0czwvdGl0bGU+IAotCQk8cGFyYT5UaGlzIEFQSSBkZWZpbmVzIHR3byBpbnRlcmZhY2Ugb2JqZWN0cyBjYWxsZWQgCi0JCSAgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlPC9wbGluaz4gYW5kIAotCQkgIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDwvcGxpbms+LiBJbiBvcmRlciB0byBwYXNzIFNvdXJjZSBhbmQgUmVzdWx0Ci0JCSAgb2JqZWN0cyB0byB0aGUgaW50ZXJmYWNlcywgY29uY3JldGUgY2xhc3NlcyBtdXN0IGJlIHVzZWQuIFRoZSB0cmFuc2Zvcm1hdGlvbiBBUEkgZGVmaW5lcwotCQkgIHRocmVlIGNvbmNyZXRlIHJlcHJlc2VudGF0aW9ucyBmb3IgZWFjaCBvZiB0aGVzZSBvYmplY3RzOiAKLQkJICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlPC9wbGluaz4gYW5kIAotCQkgIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ8L3BsaW5rPiwKLQkJICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlPC9wbGluaz4gYW5kIAotCQkgIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ8L3BsaW5rPiwgYW5kIAotCQkgIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U8L3BsaW5rPiBhbmQgCi0JCSAgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDwvcGxpbms+LiBFYWNoIG9mIHRoZXNlIG9iamVjdHMgZGVmaW5lcwotCQkgIGEgRkVBVFVSRSBzdHJpbmcgKHdoaWNoIGlzIGkgdGhlIGZvcm0gb2YgYSBVUkwpLCB3aGljaCBjYW4gYmUgcGFzc2VkIGludG8gCi0JCSAgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I2dldEZlYXR1cmU8L3BsaW5rPiB0byBzZWUgaWYgdGhlCi0JCSAgZ2l2ZW4gdHlwZSBvZiBTb3VyY2Ugb3IgUmVzdWx0IG9iamVjdCBpcyBzdXBwb3J0ZWQuIEZvciBpbnN0YW5jZSwgdG8gdGVzdCBpZiBhCi0JCSAgRE9NU291cmNlIGFuZCBhIFN0cmVhbVJlc3VsdCBpcyBzdXBwb3J0ZWQsIHlvdSBjYW4gYXBwbHkgdGhlIGZvbGxvd2luZwotCQkgIHRlc3QuPC9wYXJhPiAKLQkJPHByb2dyYW1saXN0aW5nPiAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIGlmICh0ZmFjdG9yeS5nZXRGZWF0dXJlKERPTVNvdXJjZS5GRUFUVVJFKSAmYW1wOyZhbXA7IHRmYWN0b3J5LmdldEZlYXR1cmUoU3RyZWFtUmVzdWx0LkZFQVRVUkUpKQotICAgIHsKLSAgICAgICAuLi4KLSAgICB9PC9wcm9ncmFtbGlzdGluZz4KLSAgPC9zZWN0Mj4gCi0gIDxzZWN0Mj4gCi0JIDx0aXRsZSBpZD0icW5hbWUtZGVsaW1pdGVyIj5RdWFsaWZpZWQgTmFtZSByZXByZXNlbnRhdGlvbjwvdGl0bGU+IAotCSA8cGFyYT48dWxpbmsgdXJsPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzIj5OYW1lc3BhY2VzPC91bGluaz4KLQkJcHJlc2VudCBzb21ldGhpbmcgb2YgYSBwcm9ibGVtIGFyZWEgd2hlbiBkZWFsaW5nIHdpdGggWE1MIG9iamVjdHMuIFF1YWxpZmllZAotCQlOYW1lcyBhcHBlYXIgaW4gWE1MIG1hcmt1cCBhcyBwcmVmaXhlZCBuYW1lcy4gQnV0IHRoZSBwcmVmaXhlcyB0aGVtc2VsdmVzIGRvCi0JCW5vdCBob2xkIGlkZW50aXR5LiBSYXRoZXIsIGl0IGlzIHRoZSBVUklzIHRoYXQgdGhleSBjb250ZXh0dWFsbHkgbWFwIHRvIHRoYXQKLQkJaG9sZCB0aGUgaWRlbnRpdHkuIFRoZXJlZm9yZSwgd2hlbiBwYXNzaW5nIGEgUXVhbGlmaWVkIE5hbWUgbGlrZSAieHl6OmZvbyIKLQkJYW1vbmcgSmF2YSBwcm9ncmFtcywgb25lIG11c3QgcHJvdmlkZSBhIG1lYW5zIHRvIG1hcCAieHl6IiB0byBhIG5hbWVzcGFjZS4KLQkJPC9wYXJhPiAKLQkgPHBhcmE+T25lIHNvbHV0aW9uIGhhcyBiZWVuIHRvIGNyZWF0ZSBhICJRTmFtZSIgb2JqZWN0IHRoYXQgaG9sZHMgdGhlCi0JCW5hbWVzcGFjZSBVUkksIGFzIHdlbGwgYXMgdGhlIHByZWZpeCBhbmQgbG9jYWwgbmFtZSwgYnV0IHRoaXMgaXMgbm90IGFsd2F5cyBhbgotCQlvcHRpbWFsIHNvbHV0aW9uLCBhcyB3aGVuLCBmb3IgZXhhbXBsZSwgeW91IHdhbnQgdG8gdXNlIHVuaXF1ZSBzdHJpbmdzIGFzIGtleXMKLQkJaW4gYSBkaWN0aW9uYXJ5IG9iamVjdC4gTm90IGhhdmluZyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBhbHNvIG1ha2VzIGl0Ci0JCWRpZmZpY3VsdCB0byBzcGVjaWZ5IGEgbmFtZXNwYWNlZCBpZGVudGl0eSBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIGFuIFhNTAotCQlkb2N1bWVudC48L3BhcmE+IAotCSA8cGFyYT5JbiBvcmRlciB0byBwYXNzIG5hbWVzcGFjZWQgdmFsdWVzIHRvIHRyYW5zZm9ybWF0aW9ucywgZm9yIGluc3RhbmNlCi0JCWFzIGEgc2V0IG9mIHByb3BlcnRpZXMgdG8gdGhlIFNlcmlhbGl6ZXIsIHRoaXMgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIHRoYXQgYQotCQlTdHJpbmcgInFuYW1lIiBvYmplY3QgcGFyYW1ldGVyIGJlIHBhc3NlZCBhcyB0d28tcGFydCBzdHJpbmcsIHRoZSBuYW1lc3BhY2UgVVJJCi0JCWVuY2xvc2VkIGluIGN1cmx5IGJyYWNlcyAoe30pLCBmb2xsb3dlZCBieSB0aGUgbG9jYWwgbmFtZS4gSWYgdGhlIHFuYW1lIGhhcyBhCi0JCW51bGwgVVJJLCB0aGVuIHRoZSBTdHJpbmcgb2JqZWN0IG9ubHkgY29udGFpbnMgdGhlIGxvY2FsIG5hbWUuIEFuIGFwcGxpY2F0aW9uCi0JCWNhbiBzYWZlbHkgY2hlY2sgZm9yIGEgbm9uLW51bGwgVVJJIGJ5IHRlc3RpbmcgdG8gc2VlIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKLQkJdGhlIG5hbWUgaXMgYSAneycgY2hhcmFjdGVyLjwvcGFyYT4gCi0JIDxwYXJhPkZvciBleGFtcGxlLCBpZiBhIFVSSSBhbmQgbG9jYWwgbmFtZSB3ZXJlIG9idGFpbmVkIGZyb20gYW4gZWxlbWVudAotCQlkZWZpbmVkIHdpdGggJmx0O3h5ejpmb28geG1sbnM6eHl6PSJodHRwOi8veHl6LmZvby5jb20veWFkYS9iYXouaHRtbCIvJmd0OywKLQkJdGhlbiB0aGUgdHJhbnNmb3JtYXRpb24gQVBJIFF1YWxpZmllZCBOYW1lIHdvdWxkIGJlICJ7aHR0cDovL3h5ei5mb28uY29tL3lhZGEvYmF6Lmh0bWx9Zm9vIi4KLQkJTm90ZSB0aGF0IHRoZSBwcmVmaXggaXMgbG9zdC48L3BhcmE+IAotICA8L3NlY3QyPiAKLSAgPHNlY3QyPiAKLQkgPHRpdGxlPlJlc3VsdCBUcmVlIFNlcmlhbGl6YXRpb248L3RpdGxlPiAKLQkgPHBhcmE+U2VyaWFsaXphdGlvbiBvZiB0aGUgcmVzdWx0IHRyZWUgdG8gYSBzdHJlYW0gY2FuIGJlIGNvbnRyb2xsZWQgd2l0aAotCQl0aGUgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIjc2V0T3V0cHV0UHJvcGVydGllczwvcGxpbms+IGFuZCB0aGUgCi0JCTxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyI3NldE91dHB1dFByb3BlcnR5PC9wbGluaz4gbWV0aG9kcy4KLQkJU3RyaW5ncyB0aGF0IG1hdGNoIHRoZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0I291dHB1dCI+WFNMVAotCQlzcGVjaWZpY2F0aW9uIGZvciB4c2w6b3V0cHV0IGF0dHJpYnV0ZXM8L3VsaW5rPiBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoZSAKLQkJPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czwvcGxpbms+IGNsYXNzLiBPdGhlciBzdHJpbmdzIGNhbiBiZQotCQlzcGVjaWZpZWQgYXMgd2VsbC4gSWYgdGhlIHRyYW5zZm9ybWVyIGRvZXMgbm90IHJlY29nbml6ZSBhbiBvdXRwdXQga2V5LCBhIAotCQk8cGxpbms+amF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvcGxpbms+IGlzIHRocm93biwgdW5sZXNzIHRoZSAKLQkJPGVtcGhhc2lzPnVubGVzczwvZW1waGFzaXM+IHRoZSBrZXkgbmFtZSBpcyA8bGluawotCQlsaW5rZW5kPSJxbmFtZS1kZWxpbWl0ZXIiPm5hbWVzcGFjZSBxdWFsaWZpZWQ8L2xpbms+LiBPdXRwdXQga2V5IG5hbWVzIHRoYXQgYXJlCi0JCXF1YWxpZmllZCBieSBhIG5hbWVzcGFjZSBhcmUgaWdub3JlZCBvciBwYXNzZWQgb24gdG8gdGhlIHNlcmlhbGl6ZXIKLQkJbWVjaGFuaXNtLjwvcGFyYT4gCi0JIDxwYXJhPklmIGFsbCB0aGF0IGlzIGRlc2lyZWQgaXMgdGhlIHNpbXBsZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiBvZiBhCi0JCXNvdXJjZSB0byBhIHJlc3VsdCwgdGhlbiA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk8L3BsaW5rPgotCQlwcm92aWRlcyBhCi0JCTxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSNuZXdUcmFuc2Zvcm1lcigpPC9wbGluaz4gbWV0aG9kCi0JCXdpdGggbm8gYXJndW1lbnRzLiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgVHJhbnNmb3JtZXIgdGhhdCBlZmZlY3RpdmVseSBjb3BpZXMKLQkJdGhlIHNvdXJjZSB0byB0aGUgcmVzdWx0LiBUaGlzIG1ldGhvZCBtYXkgYmUgdXNlZCB0byBjcmVhdGUgYSBET00gZnJvbSBTQVgKLQkJZXZlbnRzIG9yIHRvIGNyZWF0ZSBhbiBYTUwgb3IgSFRNTCBzdHJlYW0gZnJvbSBhIERPTSBvciBTQVggZXZlbnRzLjwvcGFyYT4KLTwvc2VjdDI+IAotPHNlY3QyPiAKLSAgPHRpdGxlPkV4Y2VwdGlvbnMgYW5kIEVycm9yIFJlcG9ydGluZzwvdGl0bGU+IAotICA8cGFyYT5UaGUgdHJhbnNmb3JtYXRpb24gQVBJIHRocm93cyB0aHJlZSB0eXBlcyBvZiBzcGVjaWFsaXplZCBleGNlcHRpb25zLiBBCi0JIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjwvcGxpbms+IGlzIHBhcmFsbGVsIHRvCi0JIHRoZSA8cGxpbms+amF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjwvcGxpbms+LCBhbmQgaXMgdGhyb3duCi0JIHdoZW4gYSBjb25maWd1cmF0aW9uIHByb2JsZW0gd2l0aCB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IGV4aXN0cy4gVGhpcyBlcnJvcgotCSB3aWxsIHR5cGljYWxseSBiZSB0aHJvd24gd2hlbiB0aGUgdHJhbnNmb3JtYXRpb24gZmFjdG9yeSBjbGFzcyBzcGVjaWZpZWQgd2l0aAotCSB0aGUgImphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IiBzeXN0ZW0gcHJvcGVydHkgY2Fubm90IGJlIGZvdW5kIG9yCi0JIGluc3RhbnRpYXRlZC48L3BhcmE+IAotICA8cGFyYT5BIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjwvcGxpbms+Ci0JIG1heSBiZSB0aHJvd24gaWYgZm9yIGFueSByZWFzb24gYSBUcmFuc2Zvcm1lciBjYW4gbm90IGJlIGNyZWF0ZWQuIEEKLQkgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gaWYgdGhlcmUgaXMgYSBzeW50YXggZXJyb3IgaW4KLQkgdGhlIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucywgZm9yIGV4YW1wbGUgd2hlbgotCSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkjbmV3VHJhbnNmb3JtZXI8L3BsaW5rPiBpcwotCSBjYWxsZWQuPC9wYXJhPiAKLSAgPHBhcmE+PHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb248L3BsaW5rPiBpcyBhIGdlbmVyYWwKLQkgZXhjZXB0aW9uIHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgY291cnNlIG9mIGEgdHJhbnNmb3JtYXRpb24uIEEgdHJhbnNmb3JtZXIKLQkgZXhjZXB0aW9uIG1heSB3cmFwIGFub3RoZXIgZXhjZXB0aW9uLCBhbmQgaWYgYW55IG9mIHRoZQotCSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiNwcmludFN0YWNrVHJhY2UoKTwvcGxpbms+Ci0JIG1ldGhvZHMgYXJlIGNhbGxlZCBvbiBpdCwgaXQgd2lsbCBwcm9kdWNlIGEgbGlzdCBvZiBzdGFjayBkdW1wcywgc3RhcnRpbmcgZnJvbQotCSB0aGUgbW9zdCByZWNlbnQuIFRoZSB0cmFuc2Zvcm1lciBleGNlcHRpb24gYWxzbyBwcm92aWRlcyBhCi0JIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZUxvY2F0b3I8L3BsaW5rPiBvYmplY3Qgd2hpY2ggaW5kaWNhdGVzIHdoZXJlCi0JIGluIHRoZSBzb3VyY2UgdHJlZSBvciB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMgdGhlIGVycm9yIG9jY3VycmVkLgotCSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiNnZXRNZXNzYWdlQW5kTG9jYXRpb24oKTwvcGxpbms+Ci0JIG1heSBiZSBjYWxsZWQgdG8gZ2V0IGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBsb2NhdGlvbiBpbmZvLCBhbmQKLQkgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24jZ2V0TG9jYXRpb25Bc1N0cmluZygpPC9wbGluaz4KLQkgbWF5IGJlIGNhbGxlZCB0byBnZXQganVzdCB0aGUgbG9jYXRpb24gc3RyaW5nLjwvcGFyYT4gCi0gIDxwYXJhPlRyYW5zZm9ybWF0aW9uIHdhcm5pbmdzIGFuZCBlcnJvcnMgYXJlIG5vcm1hbGx5IGZpcnN0IHNlbnQgdG8gYQotCSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5FcnJvckxpc3RlbmVyPC9wbGluaz4sIGF0IHdoaWNoIHBvaW50IHRoZQotCSBpbXBsZW1lbnRvciBtYXkgZGVjaWRlIHRvIHJlcG9ydCB0aGUgZXJyb3Igb3Igd2FybmluZywgYW5kIG1heSBkZWNpZGUgdG8gdGhyb3cKLQkgYW4gZXhjZXB0aW9uIGZvciBhIG5vbi1mYXRhbCBlcnJvci4gVGhlIGVycm9yIGxpc3RlbmVyIG1heSBiZSBzZXQgdmlhCi0JIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSNzZXRFcnJvckxpc3RlbmVyPC9wbGluaz4gZm9yCi0JIHJlcG9ydGluZyBlcnJvcnMgdGhhdCBoYXZlIHRvIGRvIHdpdGggc3ludGF4IGVycm9ycyBpbiB0aGUgdHJhbnNmb3JtYXRpb24KLQkgaW5zdHJ1Y3Rpb25zLCBvciB2aWEKLQkgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIjc2V0RXJyb3JMaXN0ZW5lcjwvcGxpbms+IHRvIHJlcG9ydAotCSBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgdGhlIHRyYW5zZm9ybWF0aW9uLiBUaGUgZXJyb3IgbGlzdGVuZXIgb24gYm90aCBvYmplY3RzCi0JIHNob3VsZCBhbHdheXMgYmUgdmFsaWQgYW5kIG5vbi1udWxsLCB3aGV0aGVyIHNldCBieSB0aGUgdXNlciBvciBhIGRlZmF1bHQKLQkgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhlIHByb2Nlc3Nvci48L3BhcmE+IAotPC9zZWN0Mj4gCi08c2VjdDI+IAotICA8dGl0bGU+UmVzb2x1dGlvbiBvZiBVUklzIHdpdGhpbiBhIHRyYW5zZm9ybWF0aW9uPC90aXRsZT4gCi0gIDxwYXJhPlRoZSBBUEkgcHJvdmlkZXMgYSB3YXkgZm9yIFVSSXMgcmVmZXJlbmNlZCBmcm9tIHdpdGhpbiB0aGUgc3R5bGVzaGVldAotCSBpbnN0cnVjdGlvbnMgb3Igd2l0aGluIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBiZSByZXNvbHZlZCBieSB0aGUgY2FsbGluZwotCSBhcHBsaWNhdGlvbi4gVGhpcyBjYW4gYmUgZG9uZSBieSBjcmVhdGluZyBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUKLQkgVVJJUmVzb2x2ZXIgaW50ZXJmYWNlLCB3aXRoIGl0cyBvbmUgbWV0aG9kLAotCSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlciNyZXNvbHZlPC9wbGluaz4sIGFuZCB1c2UgdGhpcyBjbGFzcyB0bwotCSBzZXQgdGhlIFVSSSByZXNvbHV0aW9uIGZvciB0aGUgdHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zIG9yIHRyYW5zZm9ybWF0aW9uCi0JIHdpdGggPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I3NldFVSSVJlc29sdmVyPC9wbGluaz4gb3IKLQkgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIjc2V0VVJJUmVzb2x2ZXI8L3BsaW5rPi4gVGhlCi0JIFVSSVJlc29sdmVyLnJlc29sdmUgbWV0aG9kIHRha2VzIHR3byBTdHJpbmcgYXJndW1lbnRzLCB0aGUgVVJJIGZvdW5kIGluIHRoZQotCSBzdHlsZXNoZWV0IGluc3RydWN0aW9ucyBvciBidWlsdCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBwcm9jZXNzLCBhbmQgdGhlCi0JIGJhc2UgVVJJIGluIGVmZmVjdCB3aGVuIHRoZSBVUkkgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgZW5jb3VudGVyZWQuCi0JIFRoZSByZXR1cm5lZCA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U8L3BsaW5rPiBvYmplY3QgbXVzdCBiZSB1c2FibGUgYnkKLQkgdGhlIHRyYW5zZm9ybWVyLCBhcyBzcGVjaWZpZWQgaW4gaXRzIGltcGxlbWVudGVkIGZlYXR1cmVzLjwvcGFyYT4gCi08L3NlY3QyPiAKLTxzZWN0MiBpZD0ic3BlY2lhbGl6ZWQtcGFja2FnZXMiPiAKLTx0aXRsZT5TcGVjaWFsaXplZCBQYWNrYWdlczwvdGl0bGU+IAotPHNlY3QzPiAKLSAgPHRpdGxlPmphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtPC90aXRsZT4gCi0gIDxwYXJhPlRoaXMgcGFja2FnZSBpbXBsZW1lbnRzIHN0cmVhbS0gYW5kIFVSSS0gc3BlY2lmaWMgdHJhbnNmb3JtYXRpb24gQVBJcy4KLQkgPC9wYXJhPiAKLSAgPHBhcmE+VGhlIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U8L3BsaW5rPiBjbGFzcwotCSBwcm92aWRlcyBtZXRob2RzIGZvciBzcGVjaWZ5aW5nIDxwbGluaz5qYXZhLmlvLklucHV0U3RyZWFtPC9wbGluaz4gaW5wdXQsCi0JIDxwbGluaz5qYXZhLmlvLlJlYWRlcjwvcGxpbms+IGlucHV0LCBhbmQgVVJMIGlucHV0IGluIHRoZSBmb3JtIG9mIHN0cmluZ3MuIEV2ZW4KLQkgaWYgYW4gaW5wdXQgc3RyZWFtIG9yIHJlYWRlciBpcyBzcGVjaWZpZWQgYXMgdGhlIHNvdXJjZSwKLQkgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZSNzZXRTeXN0ZW1JZDwvcGxpbms+IHNob3VsZCBzdGlsbAotCSBiZSBjYWxsZWQsIHNvIHRoYXQgdGhlIHRyYW5zZm9ybWVyIGNhbiBrbm93IGZyb20gd2hlcmUgaXQgc2hvdWxkIHJlc29sdmUKLQkgcmVsYXRpdmUgVVJJcy4gVGhlIHB1YmxpYyBpZGVudGlmaWVyIGlzIGFsd2F5cyBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uCi0JIHdyaXRlciBpbmNsdWRlcyBvbmUsIGl0IHdpbGwgYmUgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUKLQkgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlTG9jYXRvcjwvcGxpbms+IGluZm9ybWF0aW9uLjwvcGFyYT4gCi0gIDxwYXJhPlRoZSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0PC9wbGluaz4gY2xhc3MKLQkgcHJvdmlkZXMgbWV0aG9kcyBmb3Igc3BlY2lmeWluZyA8cGxpbms+amF2YS5pby5PdXRwdXRTdHJlYW08L3BsaW5rPiwKLQkgPHBsaW5rPmphdmEuaW8uV3JpdGVyPC9wbGluaz4sIG9yIGFuIG91dHB1dCBzeXN0ZW0gSUQsIGFzIHRoZSBvdXRwdXQgb2YgdGhlCi0JIHRyYW5zZm9ybWF0aW9uIHJlc3VsdC48L3BhcmE+IAotICA8cGFyYT5Ob3JtYWxseSBzdHJlYW1zIHNob3VsZCBiZSB1c2VkIHJhdGhlciB0aGFuIHJlYWRlcnMgb3Igd3JpdGVycywgZm9yCi0JIGJvdGggdGhlIFNvdXJjZSBhbmQgUmVzdWx0LCBzaW5jZSByZWFkZXJzIGFuZCB3cml0ZXJzIGFscmVhZHkgaGF2ZSB0aGUgZW5jb2RpbmcKLQkgZXN0YWJsaXNoZWQgdG8gYW5kIGZyb20gdGhlIGludGVybmFsIFVuaWNvZGUgZm9ybWF0LiBIb3dldmVyLCB0aGVyZSBhcmUgdGltZXMKLQkgd2hlbiBpdCBpcyB1c2VmdWwgdG8gd3JpdGUgdG8gYSBjaGFyYWN0ZXIgc3RyZWFtLCBzdWNoIGFzIHdoZW4gdXNpbmcgYQotCSBTdHJpbmdXcml0ZXIgaW4gb3JkZXIgdG8gd3JpdGUgdG8gYSBTdHJpbmcsIG9yIGluIHRoZSBjYXNlIG9mIHJlYWRpbmcgc291cmNlCi0JIFhNTCBmcm9tIGEgU3RyaW5nUmVhZGVyLjwvcGFyYT4gCi08L3NlY3QzPiAKLTxzZWN0Mz4gCi08dGl0bGU+amF2YXgueG1sLnRyYW5zZm9ybS5zYXg8L3RpdGxlPiAKLTxwYXJhPlRoaXMgcGFja2FnZSBpbXBsZW1lbnRzIFNBWDItc3BlY2lmaWMgdHJhbnNmb3JtYXRpb24gQVBJcy4gSXQgcHJvdmlkZXMKLSAgY2xhc3NlcyB3aGljaCBhbGxvdyBpbnB1dCBmcm9tIDxwbGluaz5vcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjwvcGxpbms+Ci0gIGV2ZW50cywgYW5kIGFsc28gY2xhc3NlcyB0aGF0IHByb2R1Y2Ugb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgZXZlbnRzLiBJdAotICBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgdG8gc2V0IHRoZSBpbnB1dCBzb3VyY2UgYXMgYW4KLSAgPHBsaW5rPm9yZy54bWwuc2F4LlhNTFJlYWRlcjwvcGxpbms+LCBvciB0byB1c2UgYQotICA8cGxpbms+b3JnLnhtbC5zYXguSW5wdXRTb3VyY2U8L3BsaW5rPiBhcyB0aGUgc291cmNlLiBJdCBhbHNvIGFsbG93cyB0aGUKLSAgY3JlYXRpb24gb2YgYSA8cGxpbms+b3JnLnhtbC5zYXguWE1MRmlsdGVyPC9wbGluaz4sIHdoaWNoIGVuYWJsZXMKLSAgdHJhbnNmb3JtYXRpb25zIHRvICJwdWxsIiBmcm9tIG90aGVyIHRyYW5zZm9ybWF0aW9ucywgYW5kIGxldHMgdGhlIHRyYW5zZm9ybWVyCi0gIHRvIGJlIHVzZWQgcG9seW1vcnBoaWNhbGx5IGFzIGFuIDxwbGluaz5vcmcueG1sLnNheC5YTUxSZWFkZXI8L3BsaW5rPi48L3BhcmE+IAotPHBhcmE+VGhlIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U8L3BsaW5rPiBjbGFzcyBhbGxvd3MgdGhlCi0gIHNldHRpbmcgb2YgYW4gPHBsaW5rPm9yZy54bWwuc2F4LlhNTFJlYWRlcjwvcGxpbms+IHRvIGJlIHVzZWQgZm9yICJwdWxsaW5nIgotICBwYXJzZSBldmVudHMsIGFuZCBhbiA8cGxpbms+b3JnLnhtbC5zYXguSW5wdXRTb3VyY2U8L3BsaW5rPiB0aGF0IG1heSBiZSB1c2VkIHRvCi0gIHNwZWNpZnkgdGhlIFNBWCBzb3VyY2UuPC9wYXJhPiAKLTxwYXJhPlRoZSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYUmVzdWx0PC9wbGluaz4gY2xhc3MgYWxsb3dzIHRoZQotICBzZXR0aW5nIG9mIGEgPHBsaW5rPm9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyPC9wbGluaz4gdG8gYmUgdGhlIHJlY2VpdmVyIG9mCi0gIFNBWDIgZXZlbnRzIGZyb20gdGhlIHRyYW5zZm9ybWF0aW9uLjwvcGFyYT4KLTxwYXJhPlRoZSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5PC9wbGluaz4gZXh0ZW5kcwotICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk8L3BsaW5rPiB0byBwcm92aWRlIGZhY3RvcnkKLSAgbWV0aG9kcyBmb3IgY3JlYXRpbmcgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRlbXBsYXRlc0hhbmRsZXI8L3BsaW5rPiwKLSAgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjwvcGxpbms+LCBhbmQKLSAgPHBsaW5rPm9yZy54bWwuc2F4LlhNTFJlYWRlcjwvcGxpbms+IGluc3RhbmNlcy48L3BhcmE+IAotPHBhcmE+VG8gb2J0YWluIGEgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeTwvcGxpbms+LAotICB0aGUgY2FsbGVyIG11c3QgY2FzdCB0aGUgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5PC9wbGluaz4KLSAgaW5zdGFuY2UgcmV0dXJuZWQgZnJvbQotICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkjbmV3SW5zdGFuY2U8L3BsaW5rPi48L3BhcmE+Ci08cGFyYT5UaGUgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjwvcGxpbms+IGludGVyZmFjZQotICBhbGxvd3MgYSB0cmFuc2Zvcm1hdGlvbiB0byBiZSBjcmVhdGVkIGZyb20gU0FYMiBwYXJzZSBldmVudHMsIHdoaWNoIGlzIGEgInB1c2giCi0gIG1vZGVsIHJhdGhlciB0aGFuIHRoZSAicHVsbCIgbW9kZWwgdGhhdCBub3JtYWxseSBvY2N1cnMgZm9yIGEgdHJhbnNmb3JtYXRpb24uCi0gIE5vcm1hbCBwYXJzZSBldmVudHMgYXJlIHJlY2VpdmVkIHRocm91Z2ggdGhlCi0gIDxwbGluaz5vcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjwvcGxpbms+IGludGVyZmFjZSwgbGV4aWNhbCBldmVudHMgc3VjaCBhcwotICBzdGFydENEQVRBIGFuZCBlbmRDREFUQSBhcmUgcmVjZWl2ZWQgdGhyb3VnaCB0aGUKLSAgPHBsaW5rPm9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjwvcGxpbms+IGludGVyZmFjZSwgYW5kIGV2ZW50cyB0aGF0IHNpZ25hbAotICB0aGUgc3RhcnQgb3IgZW5kIG9mIGRpc2FibGluZyBvdXRwdXQgZXNjYXBpbmcgYXJlIHJlY2VpdmVkIHZpYQotICA8cGxpbms+b3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjcHJvY2Vzc2luZ0luc3RydWN0aW9uPC9wbGluaz4sIHdpdGggdGhlCi0gIHRhcmdldCBwYXJhbWV0ZXIgYmVpbmcKLSAgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0I1BJX0RJU0FCTEVfT1VUUFVUX0VTQ0FQSU5HPC9wbGluaz4gYW5kCi0gIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdCNQSV9FTkFCTEVfT1VUUFVUX0VTQ0FQSU5HPC9wbGluaz4uIElmCi0gIHBhcmFtZXRlcnMsIG91dHB1dCBwcm9wZXJ0aWVzLCBvciBvdGhlciBmZWF0dXJlcyBuZWVkIHRvIGJlIHNldCBvbiB0aGUKLSAgVHJhbnNmb3JtZXIgaGFuZGxlciwgYSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjwvcGxpbms+IHJlZmVyZW5jZQotICB3aWxsIG5lZWQgdG8gYmUgb2J0YWluZWQgZnJvbQotICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyI2dldFRyYW5zZm9ybWVyPC9wbGluaz4sIGFuZAotICB0aGUgbWV0aG9kcyBpbnZva2VkIGZyb20gdGhhdCByZWZlcmVuY2UuPC9wYXJhPgotPHBhcmE+VGhlIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLnNheC5UZW1wbGF0ZXNIYW5kbGVyPC9wbGluaz4gaW50ZXJmYWNlCi0gIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uVGVtcGxhdGVzPC9wbGluaz4gb2JqZWN0cwotICBmcm9tIFNBWDIgcGFyc2UgZXZlbnRzLiBPbmNlIHRoZSA8cGxpbms+b3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI8L3BsaW5rPgotICBldmVudHMgYXJlIGNvbXBsZXRlLCB0aGUgVGVtcGxhdGVzIG9iamVjdCBtYXkgYmUgb2J0YWluZWQgZnJvbQotICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXguVGVtcGxhdGVzSGFuZGxlciNnZXRUZW1wbGF0ZXM8L3BsaW5rPi4gTm90ZSB0aGF0IAotICA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5zYXguVGVtcGxhdGVzSGFuZGxlciNzZXRTeXN0ZW1JZDwvcGxpbms+IHNob3VsZAotICBub3JtYWxseSBiZSBjYWxsZWQgaW4gb3JkZXIgdG8gZXN0YWJsaXNoIGEgYmFzZSBzeXN0ZW0gSUQgZnJvbSB3aGljaCByZWxhdGl2ZQotICBVUkxzIG1heSBiZSByZXNvbHZlZC48L3BhcmE+Ci08cGFyYT5UaGUKLSAgPHBsaW5rPmphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeSNuZXdYTUxGaWx0ZXI8L3BsaW5rPgotICBtZXRob2QgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIDxwbGluaz5vcmcueG1sLnNheC5YTUxGaWx0ZXI8L3BsaW5rPiwgd2hpY2gKLSAgZW5jYXBzdWxhdGVzIHRoZSBTQVgyIG5vdGlvbiBvZiBhICJwdWxsIiB0cmFuc2Zvcm1hdGlvbi4gVGhlIGZvbGxvd2luZwotICBpbGx1c3RyYXRlcyBzZXZlcmFsIHRyYW5zZm9ybWF0aW9ucyBjaGFpbmVkIHRvZ2V0aGVyLiBFYWNoIGZpbHRlciBwb2ludHMgdG8gYQotICBwYXJlbnQgPHBsaW5rPm9yZy54bWwuc2F4LlhNTFJlYWRlcjwvcGxpbms+LCBhbmQgdGhlIGZpbmFsIHRyYW5zZm9ybWF0aW9uIGlzCi0gIGNhdXNlZCBieSBpbnZva2luZyA8cGxpbms+b3JnLnhtbC5zYXguWE1MUmVhZGVyI3BhcnNlPC9wbGluaz4gb24gdGhlIGZpbmFsCi0gIHJlYWRlciBpbiB0aGUgY2hhaW4uPC9wYXJhPgotPC9zZWN0Mz4gCi08c2VjdDM+IAotPHRpdGxlPmphdmF4LnhtbC50cmFuc2Zvcm0uZG9tPC90aXRsZT4gCi08cGFyYT5UaGlzIHBhY2thZ2UgaW1wbGVtZW50cyBET00tc3BlY2lmaWMgdHJhbnNmb3JtYXRpb24gQVBJcy48L3BhcmE+IAotPHBhcmE+VGhlIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U8L3BsaW5rPiBjbGFzcyBhbGxvd3MgdGhlCi1jbGllbnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgQVBJIHRvIHNwZWNpZnkgYSBET00KLTxwbGluaz5vcmcudzNjLmRvbS5Ob2RlPC9wbGluaz4gYXMgdGhlIHNvdXJjZSBvZiB0aGUgaW5wdXQgdHJlZS4gVGhlIG1vZGVsIG9mCi1ob3cgdGhlIFRyYW5zZm9ybWVyIGRlYWxzIHdpdGggdGhlIERPTSB0cmVlIGluIHRlcm1zIG9mIG1pc21hdGNoZXMgd2l0aCB0aGUKLTx1bGluayB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjZGF0YS1tb2RlbCI+WFNMVCBkYXRhIG1vZGVsPC91bGluaz4gb3IKLW90aGVyIGRhdGEgbW9kZWxzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudC4gQW55IG9mIHRoZSBub2RlcwotZGVyaXZlZCBmcm9tIDxwbGluaz5vcmcudzNjLmRvbS5Ob2RlPC9wbGluaz4gYXJlIGxlZ2FsIGlucHV0LjwvcGFyYT4KLTxwYXJhPlRoZSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0PC9wbGluaz4gY2xhc3MgYWxsb3dzIGEKLTxwbGluaz5vcmcudzNjLmRvbS5Ob2RlPC9wbGluaz4gdG8gYmUgc3BlY2lmaWVkIHRvIHdoaWNoIHJlc3VsdCBET00gbm9kZXMgd2lsbAotYmUgYXBwZW5kZWQuIElmIGFuIG91dHB1dCBub2RlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSB0cmFuc2Zvcm1lciB3aWxsIHVzZSAKLTxwbGluaz5qYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIjbmV3RG9jdW1lbnQ8L3BsaW5rPiB0byBjcmVhdGUgYW4KLW91dHB1dCA8cGxpbms+b3JnLnczYy5kb20uRG9jdW1lbnQ8L3BsaW5rPiBub2RlLiBJZiBhIG5vZGUgaXMgc3BlY2lmaWVkLCBpdAotc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiA8cGxpbms+b3JnLnczYy5kb20uRG9jdW1lbnQ8L3BsaW5rPiwgCi08cGxpbms+b3JnLnczYy5kb20uRWxlbWVudDwvcGxpbms+LCBvciAKLTxwbGluaz5vcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50PC9wbGluaz4uIFNwZWNpZmljYXRpb24gb2YgYW55IG90aGVyIG5vZGUKLXR5cGUgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGFuZCB1bmRlZmluZWQgYnkgdGhpcyBBUEkuIElmIHRoZSByZXN1bHQgaXMgYSAKLTxwbGluaz5vcmcudzNjLmRvbS5Eb2N1bWVudDwvcGxpbms+LCB0aGUgb3V0cHV0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtdXN0IGhhdmUKLWEgc2luZ2xlIGVsZW1lbnQgcm9vdCB0byBzZXQgYXMgdGhlIGRvY3VtZW50IGVsZW1lbnQuPC9wYXJhPgotPHBhcmE+VGhlIDxwbGluaz5qYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Mb2NhdG9yPC9wbGluaz4gbm9kZSBtYXkgYmUgcGFzc2VkCi10byA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjwvcGxpbms+IG9iamVjdHMsIGFuZAotcmV0cmlldmVkIGJ5IHRyeWluZyB0byBjYXN0IHRoZSByZXN1bHQgb2YKLXRoZSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiNnZXRMb2NhdG9yKCk8L3BsaW5rPiBtZXRob2QuCi1UaGUgaW1wbGVtZW50YXRpb24gaGFzIG5vIHJlc3BvbnNpYmlsaXR5IHRvIHVzZSBhIERPTUxvY2F0b3IgaW5zdGVhZCBvZgotYSA8cGxpbms+amF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yPC9wbGluaz4gKHRob3VnaCBsaW5lIG51bWJlcnMgYW5kIHRoZQotbGlrZSBkbyBub3QgbWFrZSBtdWNoIHNlbnNlIGZvciBhIERPTSksIHNvIHRoZSByZXN1bHQgb2YgZ2V0TG9jYXRvciBtdXN0IGFsd2F5cwotYmUgdGVzdGVkIHdpdGggYW4gaW5zdGFuY2VvZi4gPC9wYXJhPgotPC9zZWN0Mz4gCi08L3NlY3QyPgotPC9zZWN0MT4KLTwvc3BlYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hhbGFuLWNvbGxhdGUueHNsIGIveGRvY3Mvc291cmNlcy94YWxhbi1jb2xsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1NWQyYS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hhbGFuLWNvbGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaCA9Ii8iPgotICA8ZG9jdW1lbnRhdGlvbj4KLSAgICA8Y2hhcHRlciBpZD0iaW5kZXgiPjx4c2w6Y29weS1vZiBzZWxlY3Q9ImRvY3VtZW50KCd4YWxhbi9pbmRleC54bWwnKSIvPjwvY2hhcHRlcj4gIAotICAgIDxjaGFwdGVyIGlkPSJ3aGF0c25ldyI+PHhzbDpjb3B5LW9mIHNlbGVjdD0iZG9jdW1lbnQoJ3hhbGFuL3doYXRzbmV3LnhtbCcpIi8+PC9jaGFwdGVyPgotICAgIDxjaGFwdGVyIGlkPSJvdmVydmlldyI+PHhzbDpjb3B5LW9mIHNlbGVjdD0iZG9jdW1lbnQoJ3hhbGFuL292ZXJ2aWV3LnhtbCcpIi8+PC9jaGFwdGVyPgotICAgIDxjaGFwdGVyIGlkPSJnZXRzdGFydGVkIj48eHNsOmNvcHktb2Ygc2VsZWN0PSJkb2N1bWVudCgneGFsYW4vZ2V0c3RhcnRlZC54bWwnKSIvPjwvY2hhcHRlcj4KLSAgICA8Y2hhcHRlciBpZD0iZmFxIj48eHNsOmNvcHktb2Ygc2VsZWN0PSJkb2N1bWVudCgneGFsYW4vZmFxLnhtbCcpIi8+PC9jaGFwdGVyPgotICAgIDxjaGFwdGVyIGlkPSJzYW1wbGVzIj48eHNsOmNvcHktb2Ygc2VsZWN0PSJkb2N1bWVudCgneGFsYW4vc2FtcGxlcy54bWwnKSIvPjwvY2hhcHRlcj4KLSAgICA8Y2hhcHRlciBpZD0iY29tbWFuZGxpbmUiPjx4c2w6Y29weS1vZiBzZWxlY3Q9ImRvY3VtZW50KCd4YWxhbi9jb21tYW5kbGluZS54bWwnKSIvPjwvY2hhcHRlcj4KLSAgICA8Y2hhcHRlciBpZD0idXNhZ2VwYXR0ZXJucyI+PHhzbDpjb3B5LW9mIHNlbGVjdD0iZG9jdW1lbnQoJ3hhbGFuL3VzYWdlcGF0dGVybnMueG1sJykiLz48L2NoYXB0ZXI+Ci0gICAgPGNoYXB0ZXIgaWQ9ImV4dGVuc2lvbnMiPjx4c2w6Y29weS1vZiBzZWxlY3Q9ImRvY3VtZW50KCd4YWxhbi9leHRlbnNpb25zLnhtbCcpIi8+PC9jaGFwdGVyPgotICAgIDxjaGFwdGVyIGlkPSJleHRlbnNpb25zbGliIj48eHNsOmNvcHktb2Ygc2VsZWN0PSJkb2N1bWVudCgneGFsYW4vZXh0ZW5zaW9uc2xpYi54bWwnKSIvPjwvY2hhcHRlcj4KLSAgICA8Y2hhcHRlciBpZD0icmVhZG1lIj48eHNsOmNvcHktb2Ygc2VsZWN0PSJkb2N1bWVudCgneGFsYW4vcmVhZG1lLnhtbCcpIi8+PC9jaGFwdGVyPgotICAgIDxjaGFwdGVyIGlkPSJhcGkiPgotICAgICAgPHMxIHRpdGxlPSJKYXZhIEFQSSI+Ci0gICAgICAgIDxwPkphdmFkb2MgZm9yIHRoZSBlbnRpcmUgWGFsYW4tSmF2YSBBUEk6PC9wPgotICAgICAgICA8dWw+Ci0gICAgICAgICAgPGxpPjxqdW1wIGhyZWY9ImFwaWRvY3MvaW5kZXguaHRtbCI+WGFsYW4tSmF2YSAyIEFQSTwvanVtcD48L2xpPgotICAgICAgICAgIDxsaT48anVtcCBocmVmPSJjb21wYXRfYXBpZG9jcy9pbmRleC5odG1sIj5YYWxhbi1KYXZhIDEgY29tcGF0aWJpbGl0eSBBUEk8L2p1bXA+PC9saT4KLSAgICAgICAgPC91bD4gICAgICAgICAKLSAgICAgIDwvczE+Ci0gICAgPC9jaGFwdGVyPgotICA8L2RvY3VtZW50YXRpb24+Ci08L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+Ci0KLQpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94YWxhbi1qbG9jYWwueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi1qbG9jYWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM4MjcyLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4tamxvY2FsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGJvb2sgU1lTVEVNICJzYms6L3N0eWxlL2R0ZC9ib29rLmR0ZCI+Ci0KLTwhLS0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci0KLTxib29rIHRpdGxlPSJYYWxhbiBYU0wgVHJhbnNmb3JtZXIgVXNlcidzIEd1aWRlIiBjb3B5cmlnaHQ9IjIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIj4KLSAgPHJlc291cmNlcyBzb3VyY2U9InNiazovc291cmNlcy94YWxhbi9yZXNvdXJjZXMueG1sIi8+Ci0gIDxkb2N1bWVudCBpZD0id2hhdHNuZXciIGxhYmVsPSJXaGF0J3MgTmV3IiBzb3VyY2U9InhhbGFuL3doYXRzbmV3LnhtbCIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGRvY3VtZW50IGlkPSJvdmVydmlldyIgbGFiZWw9Ik92ZXJ2aWV3IiBzb3VyY2U9InhhbGFuL292ZXJ2aWV3LnhtbCIvPgotICA8ZG9jdW1lbnQgaWQ9ImdldHN0YXJ0ZWQiIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiIHNvdXJjZT0ieGFsYW4vZ2V0c3RhcnRlZC54bWwiLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxmYXFzIGlkPSJmYXEiIGxhYmVsPSJGQVFzIiBzb3VyY2U9InhhbGFuL2ZhcS54bWwiLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxkb2N1bWVudCBpZD0ic2FtcGxlcyIgbGFiZWw9IlNhbXBsZSBBcHBzIiBzb3VyY2U9InhhbGFuL3NhbXBsZXMueG1sIi8+Ci0gIDxkb2N1bWVudCBpZD0iY29tbWFuZGxpbmUiIGxhYmVsPSJDb21tYW5kIExpbmUiIHNvdXJjZT0ieGFsYW4vY29tbWFuZGxpbmUueG1sIi8+Ci0gIDxzZXBhcmF0b3IvPgotICA8ZG9jdW1lbnQgaWQ9InVzYWdlcGF0dGVybnMiIGxhYmVsPSJVc2FnZSBQYXR0ZXJucyIgc291cmNlPSJ4YWxhbi91c2FnZXBhdHRlcm5zLnhtbCIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGV4dGVybmFsIGhyZWY9ImFwaWRvY3MvaW5kZXguaHRtbCIgbGFiZWw9IkFQSSAoSmF2YWRvYykiLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxkb2N1bWVudCBpZD0iZXh0ZW5zaW9ucyIgbGFiZWw9IkV4dGVuc2lvbnMiIHNvdXJjZT0ieGFsYW4vZXh0ZW5zaW9ucy54bWwiLz4KLSAgPGRvY3VtZW50IGlkPSJleHRlbnNpb25zbGliIiBsYWJlbD0iRXh0ZW5zaW9ucyBMaWJyYXJ5IiBzb3VyY2U9InhhbGFuL2V4dGVuc2lvbnNsaWIueG1sIi8+Ci0gIDxzZXBhcmF0b3IvPgotICA8ZG9jdW1lbnQgaWQ9InJlYWRtZSIgbGFiZWw9IlJlbGVhc2UgTm90ZXMiIHNvdXJjZT0ieGFsYW4vcmVhZG1lLnhtbCIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGV4dGVybmFsIGhyZWY9ImRlc2lnbi9kZXNpZ24yXzBfMC5odG1sIiBsYWJlbD0iWGFsYW4gMiBEZXNpZ24iLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxleHRlcm5hbCBocmVmPSJyZWFkbWUuaHRtbCNidWdzIiBsYWJlbD0iQnVncyIvPgotICA8ZXh0ZXJuYWwgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuLWovdGVzdC9vdmVydmlldy5odG1sIiBsYWJlbD0iVGVzdGluZyIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGV4dGVybmFsIGhyZWY9InRvZG8uaHRtbCNkZXZlbG9wZXItbGlzdCIgbGFiZWw9IkNyZWRpdHMiLz4gIAotPC9ib29rPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94YWxhbi1qc2l0ZS54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuLWpzaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzZWJhMS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hhbGFuLWpzaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGJvb2sgU1lTVEVNICJzYms6L3N0eWxlL2R0ZC9ib29rLmR0ZCI+Ci0KLTwhLS0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci0KLTxib29rIHRpdGxlPSJYYWxhbiBYU0wgVHJhbnNmb3JtZXIgVXNlcidzIEd1aWRlIiBjb3B5cmlnaHQ9IjIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIj4KLSAgPHJlc291cmNlcyBzb3VyY2U9InNiazovc291cmNlcy94YWxhbi9yZXNvdXJjZXMueG1sIi8+Ci0gIDxleHRlcm5hbCBocmVmPSIuLi9pbmRleC5odG1sIiBsYWJlbD0iSG9tZSIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGRvY3VtZW50IGlkPSJpbmRleCIgbGFiZWw9IlhhbGFuLUogMi4wLjEiIHNvdXJjZT0ieGFsYW4vaW5kZXgueG1sIi8+Ci0gIDxkb2N1bWVudCBpZD0id2hhdHNuZXciIGxhYmVsPSJXaGF0J3MgTmV3IiBzb3VyY2U9InhhbGFuL3doYXRzbmV3LnhtbCIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGRvY3VtZW50IGlkPSJvdmVydmlldyIgbGFiZWw9Ik92ZXJ2aWV3IiBzb3VyY2U9InhhbGFuL292ZXJ2aWV3LnhtbCIvPgotICA8ZG9jdW1lbnQgaWQ9ImdldHN0YXJ0ZWQiIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiIHNvdXJjZT0ieGFsYW4vZ2V0c3RhcnRlZC54bWwiLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxmYXFzIGlkPSJmYXEiIGxhYmVsPSJGQVFzIiBzb3VyY2U9InhhbGFuL2ZhcS54bWwiLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxkb2N1bWVudCBpZD0ic2FtcGxlcyIgbGFiZWw9IlNhbXBsZSBBcHBzIiBzb3VyY2U9InhhbGFuL3NhbXBsZXMueG1sIi8+Ci0gIDxkb2N1bWVudCBpZD0iY29tbWFuZGxpbmUiIGxhYmVsPSJDb21tYW5kIExpbmUiIHNvdXJjZT0ieGFsYW4vY29tbWFuZGxpbmUueG1sIi8+Ci0gIDxzZXBhcmF0b3IvPgotICA8ZG9jdW1lbnQgaWQ9InVzYWdlcGF0dGVybnMiIGxhYmVsPSJVc2FnZSBQYXR0ZXJucyIgc291cmNlPSJ4YWxhbi91c2FnZXBhdHRlcm5zLnhtbCIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGV4dGVybmFsIGhyZWY9ImFwaWRvY3MvaW5kZXguaHRtbCIgbGFiZWw9IkFQSSAoSmF2YWRvYykiLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxkb2N1bWVudCBpZD0iZXh0ZW5zaW9ucyIgbGFiZWw9IkV4dGVuc2lvbnMiIHNvdXJjZT0ieGFsYW4vZXh0ZW5zaW9ucy54bWwiLz4KLSAgPGRvY3VtZW50IGlkPSJleHRlbnNpb25zbGliIiBsYWJlbD0iRXh0ZW5zaW9ucyBMaWJyYXJ5IiBzb3VyY2U9InhhbGFuL2V4dGVuc2lvbnNsaWIueG1sIi8+Ci0gIDxzZXBhcmF0b3IvPgotICA8ZG9jdW1lbnQgaWQ9InJlYWRtZSIgbGFiZWw9IlJlbGVhc2UgTm90ZXMiIHNvdXJjZT0ieGFsYW4vcmVhZG1lLnhtbCIvPgotICA8c2VwYXJhdG9yLz4KLSAgPGV4dGVybmFsIGhyZWY9ImRlc2lnbi9kZXNpZ24yXzBfMC5odG1sIiBsYWJlbD0iWGFsYW4gMiBEZXNpZ24iLz4KLSAgPHNlcGFyYXRvci8+Ci0gIDxleHRlcm5hbCBocmVmPSJyZWFkbWUuaHRtbCNidWdzIiBsYWJlbD0iQnVncyIvPiAgCi0gIDxleHRlcm5hbCBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai90ZXN0L292ZXJ2aWV3Lmh0bWwiIGxhYmVsPSJUZXN0aW5nIi8+Ci0gIDxzZXBhcmF0b3IvPgotICA8ZXh0ZXJuYWwgaHJlZj0idG9kby5odG1sI2RldmVsb3Blci1saXN0IiBsYWJlbD0iQ3JlZGl0cyIvPiAgCi08L2Jvb2s+CmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hhbGFuL1NUQVRVUyBiL3hkb2NzL3NvdXJjZXMveGFsYW4vU1RBVFVTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTBhM2ZjLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vU1RBVFVTCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0gIDxzMyB0aXRsZT0iVmVyc2lvbiBvZiBYZXJjZXMgdG8gdXNlIj4gCi08cD5UaGUgJnhzbHQ0ai1jdXJyZW50OyBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCAmeG1sNGotdXNlZDsuICZkb3dubG9hZDsgRm9yIGluZm9ybWF0aW9uIGFib3V0IGluY2x1ZGluZyB4ZXJjZXMuamFyIG9uIHRoZSBzeXN0ZW0gY2xhc3MgcGF0aCwgc2VlIDxsaW5rIGlkcmVmPSJnZXRzdGFydGVkIiBhbmNob3I9ImNsYXNzcGF0aCI+U2V0dGluZyB1cCB0aGUgc3lzdGVtIGNsYXNzIHBhdGg8L2xpbms+LjwvcD4KLTxwPjxlbT5JbXBvcnRhbnQ8L2VtPiBZb3UgbWF5IGV4cGVyaWVuY2UgdW5wcmVkaWN0YWJsZSBhbm9tYWxpZXMgaWYgeW91ciBYYWxhbiBhbmQgWGVyY2VzIGJ1aWxkcyBhcmUgbm90IGluIHN5bmNoLiBJZiB5b3UgZG93bmxvYWQgYW4gdXBkYXRlIHRvIFhhbGFuLCBjaGVjayB0aGUgcmVsZWFzZSBub3RlcyB0byBkZXRlcm1pbmUgd2hpY2ggdmVyc2lvbiBvZiBYZXJjZXMgeW91IHNob3VsZCB1c2UuPC9wPgotPG5vdGU+WW91IGNhbiB1c2UgWGFsYW4gd2l0aCBvdGhlciBYTUwgcGFyc2VycyB0aGF0IGltcGxlbWVudCB0aGUgPHJlc291cmNlLXJlZiBpZHJlZj0iamF4cCIvPi4gU2VlIAotPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0icGx1ZyI+UGx1Z2dpbmcgaW4gdGhlIFRyYW5zZm9ybWVyIGFuZCBYTUwgcGFyc2VyPC9saW5rPi48L25vdGU+Ci08L3MzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vY29tbWFuZGxpbmUueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi9jb21tYW5kbGluZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTYxOWEuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94YWxhbi9jb21tYW5kbGluZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PgotPCFET0NUWVBFIHMxIFNZU1RFTSAiLi4vLi4vc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCI+Ci0KLTwhLS0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci0gCi0KLTxzMSB0aXRsZT0iQ29tbWFuZC1MaW5lIFV0aWxpdHkiPgotICAgCi0gICA8czIgdGl0bGU9IlVzaW5nIHRoZSBDb21tYW5kLUxpbmUgVXRpbGl0eSI+Ci0gICAgICA8cD5UbyBwZXJmb3JtIGEgdHJhbnNmb3JtYXRpb24sIHlvdSBjYW4gY2FsbCAmeHNsdDRqOyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKG9yIHNjcmlwdCksIAotICAgICAgYW4gYXBwbGV0LCBhbiBhcHBsaWNhdGlvbiwgb3IgYSBzZXJ2bGV0IChzZWUgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiPlVzYWdlIFBhdHRlcm5zPC9saW5rPikuPC9wPgotICAgICA8cD5UaGUgb3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MgbWFpbigpIG1ldGhvZCBwcm92aWRlcyBhIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UKLSAgICBmb3IgcGVyZm9ybWluZyBYU0wgdHJhbnNmb3JtYXRpb24uIFRvIHBlcmZvcm0gYSB0cmFuc2Zvcm1hdGlvbiBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3IgYSBzY3JpcHQsCi0gICAgZG8gdGhlIGZvbGxvd2luZzo8L3A+Ci0gCQk8b2w+Ci0gICAgPGxpPkRvd25sb2FkICZ4c2x0NGo7Ljxici8+PGJyLz48L2xpPiAKLSAgICA8bGk+PGxpbmsgaWRyZWY9ImdldHN0YXJ0ZWQiIGFuY2hvcj0iY2xhc3NwYXRoIj5TZXQgdGhlIEphdmEgY2xhc3NwYXRoPC9saW5rPiB0byBpbmNsdWRlIHhhbGFuLmphciBhbmQKLSAgICB4ZXJjZXMuamFyIChvciBhbm90aGVyIGNvbmZvcm1hbnQgWE1MIFBhcnNlciAtLSBzZWUgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0icGx1ZyI+UGx1Z2dpbmcgaW4gCi0gICAgdGhlIFRyYW5zZm9ybWVyIGFuZCBYTUwgcGFyc2VyPC9saW5rPikuPGJyLz48YnIvPjwvbGk+Ci0gICAgPGxpPkNhbGwgamF2YSBhbmQgdGhlIFByb2Nlc3MgY2xhc3Mgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgYW5kCi0gICAgYXJndW1lbnRzIChkZXNjcmliZWQgYmVsb3cpLiBUaGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZSwgZm9yIGV4YW1wbGUsIGluY2x1ZGVzIHRoZSAtSU4sIC1YU0wsCi0gICAgYW5kIC1PVVQgZmxhZ3Mgd2l0aCB0aGVpciBhY2NvbXBhbnlpbmcgYXJndW1lbnRzIC0tIHRoZSBYTUwgc291cmNlIGRvY3VtZW50LCB0aGUgWFNMCi0gICAgc3R5bGVzaGVldCwgYW5kIHRoZSBvdXRwdXQgZmlsZTo8YnIvPjxici8+Ci0gICAgPGNvZGU+amF2YSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuUHJvY2VzcyAtSU4gZm9vLnhtbCAtWFNMIGZvby54c2wgLU9VVCBmb28ub3V0PC9jb2RlPgotICAgIDwvbGk+PC9vbD4KLSAgICA8cD5UaGUgY29tbWFuZCBsaW5lIHV0aWxpdHkgY2FuIHRha2UgdGhlIGZvbGxvd2luZyBmbGFncyBhbmQgYXJndW1lbnRzICh0aGUgZmxhZ3MgYXJlIGNhc2UgaW5zZW5zaXRpdmUpOjwvcD4gCi0gICAgICA8c291cmNlPi1JTiBpbnB1dFhNTFVSTAotLVhTTCBYU0xUcmFuc2Zvcm1hdGlvblVSTAotLU9VVCBvdXRwdXRGaWxlTmFtZQotLVYgKFZlcnNpb24gaW5mbykKLS1RQyAoUXVpZXQgUGF0dGVybiBDb25mbGljdHMgV2FybmluZ3MpCi0tUSAgKFF1aWV0IE1vZGUpCi0tTEYgKFVzZSBsaW5lZmVlZHMgb25seSBvbiBvdXRwdXQgLS0gZGVmYXVsdCBpcyBDUi9MRikKLS1DUiAoVXNlIGNhcnJpYWdlIHJldHVybnMgb25seSBvbiBvdXRwdXQgLS0gZGVmYXVsdCBpcyBDUi9MRikKLS1JTkRFTlQgKE51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IGVhY2ggbGV2ZWwgaW4gb3V0cHV0IHRyZWUgLS1kZWZhdWx0IGlzIDApCi0tVFQgKFRyYWNlIHRoZSB0ZW1wbGF0ZXMgYXMgdGhleSBhcmUgYmVpbmcgY2FsbGVkKQotLVRHIChUcmFjZSBlYWNoIHJlc3VsdCB0cmVlIGdlbmVyYXRpb24gZXZlbnQpCi0tVFMgKFRyYWNlIGVhY2ggc2VsZWN0aW9uIGV2ZW50KQotLVRUQyAoVHJhY2UgdGhlIHRlbXBsYXRlIGNoaWxkcmVuIGFzIHRoZXkgYXJlIGJlaW5nIHByb2Nlc3NlZCkKLS1FRFVNUCBbb3B0aW9uYWxdRmlsZU5hbWUgKERvIHN0YWNrZHVtcCBvbiBlcnJvcikKLS1YTUwgKFVzZSBYTUwgZm9ybWF0dGVyIGFuZCBhZGQgWE1MIGhlYWRlcikKLS1URVhUIChVc2Ugc2ltcGxlIFRleHQgZm9ybWF0dGVyKQotLUhUTUwgKFVzZSBIVE1MIGZvcm1hdHRlcikKLS1QQVJBTSBuYW1lIHZhbHVlIChTZXQgYSBzdHlsZXNoZWV0IHBhcmFtZXRlcikKLS1ESUFHIHB1dCBvdXQgdGltaW5nIGRpYWdub3N0aWNzCi0tVVJJUkVTT0xWRVIgZnVsbENsYXNzTmFtZSAoVXNlIGEgY3VzdG9tIFVSSVJlc29sdmVyKQotLUVOVElUWVJFU09MVkVSIGZ1bGxDbGFzc05hbWUgKFVzZSBhIGN1c3RvbSBFbnRpdHlSZXNvbHZlcikKLS1DT05URU5USEFORExFUiBmdWxsQ2xhc3NOYW1lIChVc2UgYSBjdXN0b20gQ29udGVudEhhbmRsZXIpCi08L3NvdXJjZT4KLSAgICAgIDxwPlVzZSA8Y29kZT4tSU48L2NvZGU+IHRvIHNwZWNpZnkgdGhlIFhNTCBzb3VyY2UgZG9jdW1lbnQuPC9wPiAKLSAgICAgIDxwPlVzZSA8Y29kZT4tWFNMPC9jb2RlPiB0byBzcGVjaWZ5IHRoZSBYU0wgc3R5bGVzaGVldCBmaWxlLjwvcD4KLSAgICAgIDxwPlVzZSA8Y29kZT4tVEVYVDwvY29kZT4gaWYgeW91IHdhbnQgdGhlIG91dHB1dCB0byBpbmNsdWRlIG9ubHkgZWxlbWVudCB2YWx1ZXMgKG5vdCBlbGVtZW50IHRhZ3Mgd2l0aCBlbGVtZW50IG5hbWVzIGFuZAotICAgICAgYXR0cmlidXRlcykuPC9wPgotICAgICAgPHA+VXNlIDxjb2RlPi1IVE1MPC9jb2RlPiB0byB3cml0ZSA0LjAgdHJhbnNpdGlvbmFsIEhUTUwgKHNvbWUgZWxlbWVudHMsIHN1Y2ggYXMgJmx0O2JyJmd0OywgYXJlCi0gICAgICBub3Qgd2VsbCBmb3JtZWQgWE1MKS48L3A+Ci0gICAgICA8cD5UbyBzZXQgc3R5bGVzaGVldCBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdXNlIDxici8+Ci0gICAgICA8Y29kZT5qYXZhIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIC1QQVJBTSA8cmVmPm5hbWUgdmFsdWU8L3JlZj48L2NvZGU+PC9wPgotICAgICAgPHA+VXNlIDxjb2RlPi1VUklSRVNPTFZFUjwvY29kZT4gd2l0aCBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHRvIHV0aWxpemUgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gICAgICA8anVtcCBocmVmPSJhcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vVVJJUmVzb2x2ZXIuaHRtbCI+VVJJUmVzb2x2ZXI8L2p1bXA+IFRyQVggaW50ZXJmYWNlIHRvIHJlc29sdmUgVVJJcyBmb3IKLSAgICAgICB4c2w6aW5jbHVkZSwgeHNsOmltcG9ydCwgYW5kIHRoZSBkb2N1bWVudCgpIGZ1bmN0aW9uLjwvcD4KLSAgICAgICA8cD5Vc2UgPGNvZGU+LUVOVElUWVJFU09MVkVSPC9jb2RlPiB3aXRoIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgdG8gdXRpbGl6ZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAgICAgICA8anVtcCBocmVmPSJhcGlkb2NzL29yZy94bWwvc2F4L0VudGl0eVJlc29sdmVyLmh0bWwiPkVudGl0eVJlc29sdmVyPC9qdW1wPiBTQVggaW50ZXJmYWNlIHRvIGhhbmRsZSBleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlcy48L3A+Ci0gICAgICAgPHA+VXNlIDxjb2RlPi1DT05URU5USEFORExFUjwvY29kZT4gd2l0aCBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHRvIHV0aWxpemUgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgdGhlIAotICAgICAgIDxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL3htbC9zYXgvQ29udGVudEhhbmRsZXIuaHRtbCI+Q29udGVudEhhbmRsZXI8L2p1bXA+IFNBWCBpbnRlcmZhY2UgdG8gc2VyaWFsaXplIG91dHB1dC48L3A+Ci0gICA8L3MyPgotPC9zMT4KZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vZXh0ZW5zaW9ucy54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuL2V4dGVuc2lvbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTg2MTRiLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vZXh0ZW5zaW9ucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PgotPCFET0NUWVBFIHMxIFNZU1RFTSAiLi4vLi4vc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCI+Ci0KLTwhLS0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci0KLTxzMSB0aXRsZT0iJnhzbHQ0ajsgRXh0ZW5zaW9ucyI+Ci08dWw+Ci08bGk+PGxpbmsgYW5jaG9yPSJpbnRybyI+SW50cm9kdWN0aW9uPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJzdXBwb3J0ZWQtbGFuZyI+U3VwcG9ydGVkIGxhbmd1YWdlczwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iYmFzaWMtcGF0dGVybiI+VGhlIGJhc2ljIHBhdHRlcm48L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InNldHVwLXJ1bnRpbWUiPlNldHRpbmcgdXAgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQ8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImJhc2ljLXN5bnRheCI+U3ludGF4PC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJleHQtZWxlbWVudHMiPlVzaW5nIGFuIGV4dGVuc2lvbiBlbGVtZW50PC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJleHQtZnVuY3Rpb25zIj5Vc2luZyBleHRlbnNpb24gZnVuY3Rpb25zPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJqYXZhLW5hbWVzcGFjZSI+QWx0ZXJuYXRpdmU6IHVzaW5nIHRoZSBhYmJyZXZpYXRlZCBzeW50YXggZm9yIGV4dGVuc2lvbnMgaW1wbGVtZW50ZWQgaW4gSmF2YTwvbGluaz48L2xpPgotPGxpPkV4YW1wbGVzOiA8bGluayBhbmNob3I9ImV4LWJhc2ljIj5iYXNpYyBKYXZhU2NyaXB0IGV4YW1wbGU8L2xpbms+LCA8bGluayBhbmNob3I9ImV4LWphdmEtbmFtZXNwYWNlIj51c2luZyB0aGUgamF2YSBuYW1lc3BhY2U8L2xpbms+LCA8bGluayBhbmNob3I9ImV4LWphdmEiPnVzaW5nIGEgSmF2YSBIYXNodGFibGU8L2xpbms+LCA8bGluayBhbmNob3I9ImV4LWphdmFzY3JpcHQiPnVzaW5nIGEgSmF2YVNjcmlwdCBhcnJheTwvbGluaz48L2xpPgotPC91bD48YW5jaG9yIG5hbWU9ImludHJvIi8+Ci0gIDxzMiB0aXRsZT0iSW50cm9kdWN0aW9uIj4KLSAgPHA+Rm9yIHRob3NlIHNpdHVhdGlvbnMgd2hlcmUgeW91IHdvdWxkIGxpa2UgdG8gYXVnbWVudCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBYU0xUIHdpdGggY2FsbHMgdG8gYSBwcm9jZWR1cmFsIGxhbmd1YWdlLCAmeHNsdDRqOyBzdXBwb3J0cyB0aGUgY3JlYXRpb24gYW5kIHVzZSBvZiBleHRlbnNpb24gZWxlbWVudHMgYW5kIGV4dGVuc2lvbiBmdW5jdGlvbnMuICZ4c2x0NGo7IGFsc28gcHJvdmlkZXMgYSBncm93aW5nIDxsaW5rIGlkcmVmPSJleHRlbnNpb25zbGliIj5leHRlbnNpb25zIGxpYnJhcnk8L2xpbms+IGF2YWlsYWJsZSBmb3IgeW91ciB1c2UuIEFuIGV4dGVuc2lvbiAoYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIGFuZCBmdW5jdGlvbnMpIGluaGFiaXRzIGEgbmFtZXNwYWNlLCBlaXRoZXIgYSBuYW1lc3BhY2UgeW91IGRlY2xhcmUgYW5kIGRlc2lnbmF0ZSBhcyBhbiBleHRlbnNpb25zIG5hbWVzcGFjZSwgb3Igb25lIG9mIHRoZSBwcmVkZWZpbmVkIG5hbWVzcGFjZXMgdGhhdCAmeHNsdDRqOyBwcm92aWRlcy4gRm9yIGluZm9ybWF0aW9uIGFib3V0IFhNTCBuYW1lc3BhY2VzLCBzZWUgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8iPk5hbWVzcGFjZXMgaW4gWE1MPC9qdW1wPi48L3A+Ci0KLTxwPjxlbT5FeHRlbnNpb24gZWxlbWVudHM8L2VtPiAgVW5saWtlIGEgbGl0ZXJhbCByZXN1bHQgZWxlbWVudCwgd2hpY2ggdGhlIHN0eWxlc2hlZXQgc2ltcGx5IHRyYW5zZmVycyB0byB0aGUgcmVzdWx0IHRyZWUsIGFuIGV4dGVuc2lvbiBlbGVtZW50IHBlcmZvcm1zIGFuIGFjdGlvbi4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHRoZSBSZWRpcmVjdCBleHRlbnNpb24gZWxlbWVudHMgc2hpcHBlZCB3aXRoICZ4c2x0NGo7IHRvIHJlZGlyZWN0IHBvcnRpb25zIG9mIHlvdXIgdHJhbnNmb3JtYXRpb24gb3V0cHV0IHRvIG9uZSBvciBtb3JlIGZpbGVzLiBFeHRlbnNpb24gZWxlbWVudHMgbWF5IGNvbnRhaW4gYXR0cmlidXRlcywgdGV4dCBub2Rlcywgb3RoZXIgZWxlbWVudHMsIGJhc2ljYWxseSBhbnkgdmFsaWQgWE1MLiBFeHRlbnNpb24gZWxlbWVudHMgbWF5IHBlcmZvcm0gcXVpdGUgc29waGlzdGljYXRlZCBhY3Rpb25zLCBnaXZlbiB0aGF0IHRoZSBleHRlbnNpb24gcm91dGluZSAodGhlIGltcGxlbWVudGF0aW9uKSBoYXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgWFNMVCBwcm9jZXNzb3IgY29udGV4dCBvYmplY3QgYW5kIHRvIHRoZSBlbGVtZW50LiBJbiBtYW55IGNhc2VzIHRoZSBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHZvaWQgb3IgbnVsbDsgaWYgaXQgZG9lcyByZXR1cm4gYSB2YWx1ZSwgdGhhdCB2YWx1ZSBpcyBwbGFjZWQgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdCB0cmVlLjwvcD4KLQotPHA+PGVtPkV4dGVuc2lvbiBmdW5jdGlvbnM8L2VtPiAgWW91IGNhbiB0aGluayBvZiBleHRlbnNpb24gZnVuY3Rpb25zIGFzIGV4dGVuZGluZyB0aGUgY29yZSBsaWJyYXJ5IG9mIGZ1bmN0aW9ucyB0aGF0IFhQYXRoIHByb3ZpZGVzLiBBbiBleHRlbnNpb24gZnVuY3Rpb24gcGFzc2VzIGFyZ3VtZW50cyB0byB0aGUgZXh0ZW5zaW9uIGltcGxlbWVudGF0aW9uIGFuZCByZXR1cm5zIGEgdmFsdWUuIFlvdSBjYW4gdXNlIGV4dGVuc2lvbiBmdW5jdGlvbnMgdG8gcmV0dXJuIHZhbHVlcyB0aGF0IFhTTFQgY2FuIGludGVyYWN0IHdpdGggZGlyZWN0bHkgKG5vZGUtc2V0LCByZXN1bHQgdHJlZSBmcmFnbWVudCwgc3RyaW5nLCBib29sZWFuLCBhbmQgbnVtYmVyKSBhcyB3ZWxsIGFzIHZhbHVlcyAob2YgYW55IHR5cGUpIHRoYXQgeW91IHBhc3MgaW4gdHVybiB0byBvdGhlciBleHRlbnNpb24gZnVuY3Rpb25zLiBFeHRlbnNpb24gZnVuY3Rpb25zIHdyaXR0ZW4gaW4gSmF2YSBjYW4gYWxzbyBhY2Nlc3MgY2VydGFpbiBpdGVtcyBpbiB0aGUgWFNMVCBleGVjdXRpb24gZW52aXJvbm1lbnQgdGhyb3VnaCBhbiA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vZXh0ZW5zaW9ucy9FeHByZXNzaW9uQ29udGV4dC5odG1sIj5FeHByZXNzaW9uQ29udGV4dDwvanVtcD4gaW50ZXJmYWNlLjwvcD4KLQotPHA+WFNMVCBleHRlbnNpb25zIGFyZSBzcGVjaWZpZWQgaW4gdGhlIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjZXh0ZW5zaW9uIj5YU0xUIFJlY29tbWVuZGF0aW9uPC9qdW1wPi4gIFRoaXMgZG9jdW1lbnQgZm9jdXNlcyBvbiB0aGUgJnhzbHQ0ajsgaW1wbGVtZW50YXRpb24gb2YgdGhvc2UgcmVxdWlyZW1lbnRzLCBub3Qgb24gWFNMVCBleHRlbnNpb25zIGluIGdlbmVyYWwuIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4dGVuc2lvbnMsIGNvbnN1bHQgdGhlIFJlY29tbWVuZGF0aW9uIG9yIHRoZSBvdGhlciByZXNvdXJjZXMgbGlzdGVkIGluIDxsaW5rIGlkcmVmPSJvdmVydmlldyIgYW5jaG9yPSJ1cHRvc3BlZWQiPkdldHRpbmcgdXAgdG8gc3BlZWQgd2l0aCBYU0xUPC9saW5rPi48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0ic3VwcG9ydGVkLWxhbmciLz4KLTxzMiB0aXRsZT0iU3VwcG9ydGVkIGxhbmd1YWdlcyI+Ci08cD5FeHRlbnNpb25zIHdyaXR0ZW4gaW4gSmF2YSBhcmUgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5ICZ4c2x0NGo7LiAgRm9yIGV4dGVuc2lvbnMgd3JpdHRlbiBpbiBsYW5ndWFnZXMgb3RoZXIgdGhhbiBKYXZhLCAmeHNsdDRqOyB1c2VzIHRoZSA8cmVzb3VyY2UtcmVmIGlkcmVmPSJic2YiLz4sIGFuIGFyY2hpdGVjdHVyZSBmb3IgaW5jb3Jwb3JhdGluZyBzY3JpcHRpbmcgaW50byBKYXZhIGFwcGxpY2F0aW9ucyBhbmQgYXBwbGV0cy4gQlNGIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB0YWtlIGFkdmFudGFnZSBvZiBzY3JpcHRpbmcgd2hpbGUgYmVpbmcgaW5kZXBlbmRlbnQgb2YgYW55IHNwZWNpZmljIHNjcmlwdGluZyBsYW5ndWFnZS4gVG8gZGF0ZSwgd2UgaGF2ZSB0ZXN0ZWQgZXh0ZW5zaW9ucyBpbXBsZW1lbnRlZCBpbiBKYXZhU2NyaXB0LiBPdGhlciBsYW5ndWFnZXMgd2l0aCBCU0Ygc3VwcG9ydCBhcHBlYXIgaW4gdGhlIHRhYmxlIGJlbG93LjwvcD4KLTxwPkJTRiByZXF1aXJlcyBic2YuamFyIG9uIHRoZSBjbGFzc3BhdGguIFRoaXMgSkFSIGZpbGUgaXMgc2hpcHBlZCB3aXRoICZ4c2x0NGo7IGFuZCBpcyByZXF1aXJlZCBvbmx5IGlmIHlvdSBoYXZlIGV4dGVuc2lvbnMgd3JpdHRlbiBpbiBsYW5ndWFnZXMgb3RoZXIgdGhhbiBKYXZhLiBUaGUgYWRkaXRpb25hbCBKQVIgZmlsZXMgb3IgRExMcyByZXF1aXJlZCB0byBzdXBwb3J0IGV4dGVuc2lvbnMgd3JpdHRlbiBpbiBvdGhlciBsYW5ndWFnZXMgYXJlIGxpc3RlZCBpbiB0aGUgdGFibGUgYmVsb3cuIFRoZXNlIGZpbGVzIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgc291cmNlcyBpbmRpY2F0ZWQgYW5kIGFyZSBub3Qgc2hpcHBlZCB3aXRoICZ4c2x0NGo7LjwvcD4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZD48ZW0+TGFuZ3VhZ2U8L2VtPjwvdGQ+Ci0gICAgPHRkPjxlbT5WZXJzaW9uPC9lbT48L3RkPgotICAgIDx0ZD48ZW0+UmVxdWlyZW1lbnRzPC9lbT48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPk1vemlsbGEgUmhpbm8gKEphdmFTY3JpcHQpPGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPjEuNTxici8+PGJyLz48L3RkPgotICAgIDx0ZD5qcy5qYXIgYXZhaWxhYmxlIGZyb20gCi0JCQkJICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvcmhpbm88YnIvPjxici8+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD5OZXRSZXh4PGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPjEuMTQ4IHVwIDxici8+PGJyLz48L3RkPgotICAgIDx0ZD5OZXRSZXh4Qy56aXAgYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL25ldHJleHg8YnIvPjxici8+PC90ZD4KLSAgPC90cj4KLSAgICA8dHI+Ci0gICAgPHRkPkJNTDxici8+PGJyLz48L3RkPgotICAgIDx0ZD4yLjQ8YnIvPjxici8+PC90ZD4KLSAgICA8dGQ+Ym1sYWxsLmphciBhdmFpbGFibGUgZnJvbSBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3MvcHJvamVjdHMvYnNmPGJyLz48YnIvPjwvdGQ+Ci0gIDwvdHI+Ci0gICAgPHRyPgotICAgIDx0ZD5KUHl0aG9uPGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPjEuMS1iZXRhMzxici8+PGJyLz48L3RkPgotICAgIDx0ZD5weXRob24uamFyIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuanB5dGhvbi5vcmcvPGJyLz48YnIvPjwvdGQ+Ci0gIDwvdHI+Ci0gICAgPHRyPgotICAgIDx0ZD5KYWNsPGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPjEuMS4xPGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPiBqYWNsLmphciBhbmQgdGNsamF2YS5qYXIgZnJvbSBodHRwOi8vd3d3LnNjcmlwdGljcy5jb20vamF2YTxici8+PGJyLz48L3RkPgotICA8L3RyPgotICAgIDx0cj4KLSAgICA8dGQ+V2luMzIgQWN0aXZlU2NyaXB0IGxhbmdzCi0JSlNjcmlwdCwgVkJTY3JpcHQ8YnIvPjxici8+PC90ZD4KLSAgICA8dGQ+PGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPk1TVkNQNjAuRExMIGZyb20gTWljcm9zb2Z0LCBhcHByb3ByaWF0ZSBsYW5ndWFnZSBETExzIGZyb20gTWljcm9zb2Z0IAotICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vc2NyaXB0aW5nPGJyLz48YnIvPjwvdGQ+Ci0gIDwvdHI+Ci0gICAgPHRyPgotICAgIDx0ZD5QZXJsU2NyaXB0PGJyLz48YnIvPjwvdGQ+Ci0gICAgPHRkPjxici8+PGJyLz48L3RkPgotICAgIDx0ZD5BY3RpdmVQZXJsIGZyb20gaHR0cDovL3d3dy5hY3RpdmVzdGF0ZS5jb20vPGJyLz48YnIvPjwvdGQ+Ci0gIDwvdHI+ICAKLTwvdGFibGU+Ci08L3MyPjxhbmNob3IgbmFtZT0iYmFzaWMtcGF0dGVybiIvPgotPHMyIHRpdGxlPSJUaGUgYmFzaWMgcGF0dGVybiI+Ci08cD5MZXQncyBleGFtaW5lIGEgc2ltcGxlIGV4YW1wbGUuIFRoZSBzdHlsZXNoZWV0IGJlbG93IHVzZXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgYW5kIGFuIGV4dGVuc2lvbiBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gYW4gZWxlbWVudCBpbiB0aGUgWE1MIHNvdXJjZSBpbnRvIGEgc3RhdGVtZW50IGluIHRoZSBvdXRwdXQgaW5kaWNhdGluZyB0aGUgZGF0ZSBieSB3aGljaCBhIGN1c3RvbWVyIGNhbiBleHBlY3QgYSByZXNwb25zZSB0byBhIGdpdmVuIGVucXVpcnkuPC9wPgotCi08cD5UaGUgc291cmNlIGVsZW1lbnQgY29udGFpbnMgYSBudW1kYXlzIGF0dHJpYnV0ZS4gVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgbXVsdGlwbGllciBhdHRyaWJ1dGUsIHdoaWNoIGlzIHVzZWQgdG8gc2V0IGEgdmFyaWFibGUgaW4gdGhlIGV4dGVuc2lvbi4gVGhlIGV4dGVuc2lvbiBmdW5jdGlvbiBjb21wdXRlcyB0aGUgZGVhZGxpbmUsIHRoYXQgaXMgdGhlIGN1cnJlbnQgZGF0ZSBwbHVzIG51bWRheXMgKiBtdWx0aXBsaWVyLiBTbyBmb3IgJmx0O2RlYWRsaW5lIG51bWRheXM9IjMiLyZndDsgKGluIHRoZSBYTUwgc291cmNlKSBhbmQgJmx0O215LWV4dDp0aW1lbGFwc2UgbXVsdGlwbGllcj0iMiIvJmd0OyAoaW4gdGhlIHN0eWxlc2hlZXQpLCB0aGUgZXh0ZW5zaW9uIGNvbXB1dGVzIGEgZGVhZGxpbmUgNiBkYXlzIGZyb20gbm93LCBhbmQgdGhlIHN0eWxlc2hlZXQgdGVtcGxhdGUgdHJhbnNmb3JtcyB0aGUgZGVhZGxpbmUgZWxlbWVudCBpbnRvIGEgc3RyaW5nIGFsb25nIHRoZSBsaW5lcyBvZiA8Y29kZT4mbHQ7cCZndDtXZSBoYXZlIGxvZ2dlZCB5b3VyIGVucXVpcnkgYW5kIHdpbGwgcmVzcG9uZCBieSBBcHJpbCAyOSwgMjAwMCAxMjowNzoxNiBQTSBFU1QuJmx0Oy9wJmd0OzwvY29kZT48L3A+Ci08bm90ZT5UaGUgZXh0ZW5zaW9uIGZ1bmN0aW9uIGNvdWxkIGluY2x1ZGUgYm90aCBudW1kYXlzIGFuZCBtdWx0aXBsaWVyIGFzIGFyZ3VtZW50cywgdGh1cyBieXBhc3NpbmcgdGhlIG5lZWQgZm9yIHRoZSBleHRlbnNpb24gZWxlbWVudCwgYnV0IHRoZSBwdXJwb3NlIGhlcmUgaXMgdG8gaWxsdXN0cmF0ZSB0aGUgdXNhZ2UgcGF0dGVybiBmb3IgZXh0ZW5zaW9uIGVsZW1lbnRzLjwvbm90ZT4KLTxwPkFzIHlvdSByZXZpZXcgdGhpcyBzdHlsZXNoZWV0LCBwbGVhc2Ugbm90ZSB0aGUgZm9sbG93aW5nOjwvcD4KLTxvbD4KLQkgIDxsaT5UaGUgZGVjbGFyYXRpb24gb2YgdGhlIFhhbGFuIGx4c2x0IG5hbWVzcGFjZSwgd2hpY2ggcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGNvbXBvbmVudCBhbmQKLSAgICAgY29tcG9uZW50L3NjcmlwdCBlbGVtZW50czo8YnIvPjxici8+Ci0gICAgPGNvZGU+eG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IjwvY29kZT48YnIvPjxici8+PC9saT4KLSAgICA8bGk+VGhlIGRlY2xhcmF0aW9uIG9mIGEgbmFtZXNwYWNlIGZvciB0aGlzIGV4dGVuc2lvbjo8YnIvPjxici8+Ci0gICAgPGNvZGU+eG1sbnM6bXktZXh0PSJleHQxIjwvY29kZT48YnIvPjxici8+PC9saT4KLSAgCTxsaT5UaGUgZGVzaWduYXRpb24gb2YgdGhpcyBuYW1lc3BhY2UgcHJlZml4IGFzIGFuIGV4dGVuc2lvbiBwcmVmaXguIFRoaXMgY2F1c2VzIGFueSBlbGVtZW50IGluIHRoZSBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJlZml4IHRvIGJlIHRyZWF0ZWQgYXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgcmF0aGVyIHRoYW4gYSBsaXRlcmFsIHJlc3VsdCBlbGVtZW50Ljxici8+PGJyLz4KLSAgICAgPGNvZGU+ZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9Im15LWV4dCI8L2NvZGU+PGJyLz48YnIvPjwvbGk+Ci0JICA8bGk+VGhlIGx4c2x0OmNvbXBvbmVudCB3aXRoIGF0dHJpYnV0ZXMgZGVzaWduYXRpbmcgdGhlIG5hbWVzcGFjZSBwcmVmaXggYW5kIHRoZSBlbGVtZW50cyBhbmQKLSAgICAgZnVuY3Rpb25zIHRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzLjxici8+PGJyLz48L2xpPgotICAJPGxpPlRoZSBseHNsdDpzY3JpcHQgc3ViZWxlbWVudCB3aXRoIGEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZW5zaW9uLiBGb3IgSmF2YQotICAgICBleHRlbnNpb25zLCB0aGUgbHhzbHQ6c2NyaXB0IGVsZW1lbnQgaGFzIGEgc3JjIGF0dHJpYnV0ZSB0aGF0IHlvdSBzZXQgdG8gaWRlbnRpZnkgdGhlIEphdmEgY2xhc3MuPC9saT4KLTwvb2w+PGFuY2hvciBuYW1lPSJleC1iYXNpYyIvPiAgIAotPHNvdXJjZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDshLS1OYW1lc3BhY2VzIGFyZSBnbG9iYWwgaWYgeW91IHNldCB0aGVtIGluIHRoZSBzdHlsZXNoZWV0IGVsZW1lbnQtLSZndDsKLSZsdDt4c2w6c3R5bGVzaGVldCAKLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgCi0gICAgdmVyc2lvbj0iMS4wIiAgIAotICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKLSAgICB4bWxuczpteS1leHQ9ImV4dDEiCi0gICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9Im15LWV4dCImZ3Q7Ci0gICAgCi0gICZsdDshLS1UaGUgY29tcG9uZW50IGFuZCBpdHMgc2NyaXB0IGFyZSBpbiB0aGUgbHhzbHQgbmFtZXNwYWNlIGFuZCBkZWZpbmUgdGhlIAotICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlbnNpb24uLS0mZ3Q7Ci0gICZsdDtseHNsdDpjb21wb25lbnQgcHJlZml4PSJteS1leHQiIGVsZW1lbnRzPSJ0aW1lbGFwc2UiIGZ1bmN0aW9ucz0iZ2V0ZGF0ZSImZ3Q7Ci0gICAgJmx0O2x4c2x0OnNjcmlwdCBsYW5nPSJqYXZhc2NyaXB0IiZndDsKLSAgICAgIHZhciBtdWx0aXBsaWVyPTE7Ci0gICAgICAvLyBUaGUgbWV0aG9kcyBvciBmdW5jdGlvbnMgdGhhdCBpbXBsZW1lbnQgZXh0ZW5zaW9uIGVsZW1lbnRzIGFsd2F5cyB0YWtlIDIKLSAgICAgIC8vIGFyZ3VtZW50cy4gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBYU0wgUHJvY2Vzc29yIGNvbnRleHQ7IHRoZSBzZWNvbmQgCi0gICAgICAvLyBhcmd1bWVudCBpcyB0aGUgZWxlbWVudCBub2RlLgotICAgICAgZnVuY3Rpb24gdGltZWxhcHNlKHhzbFByb2Nlc3NvckNvbnRleHQsIGVsZW0pCi0gICAgICB7Ci0gICAgICAgIG11bHRpcGxpZXI9cGFyc2VJbnQoZWxlbS5nZXRBdHRyaWJ1dGUoIm11bHRpcGxpZXIiKSk7Ci0gICAgICAgIC8vIFRoZSBlbGVtZW50IHJldHVybiB2YWx1ZSBpcyBwbGFjZWQgaW4gdGhlIHJlc3VsdCB0cmVlLgotICAgICAgICAvLyBJZiB5b3UgZG8gbm90IHdhbnQgYSByZXR1cm4gdmFsdWUsIHJldHVybiBudWxsLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIGZ1bmN0aW9uIGdldGRhdGUobnVtZGF5cykKLSAgICAgIHsKLSAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwotICAgICAgICB2YXIgdG90YWxEYXlzID0gcGFyc2VJbnQobnVtZGF5cykgKiBtdWx0aXBsaWVyOwotICAgICAgICBkLnNldERhdGUoZC5nZXREYXRlKCkgKyB0b3RhbERheXMpOwotICAgICAgICByZXR1cm4gZC50b0xvY2FsZVN0cmluZygpOwotICAgICAgfQotICAgICZsdDsvbHhzbHQ6c2NyaXB0Jmd0OwotICAmbHQ7L2x4c2x0OmNvbXBvbmVudCZndDsKLSAgICAgIAotICAmbHQ7eHNsOnRlbXBsYXRlIG1hdGNoPSJkZWFkbGluZSImZ3Q7Ci0gICAgJmx0O3AmZ3Q7Jmx0O215LWV4dDp0aW1lbGFwc2UgbXVsdGlwbGllcj0iMiIvJmd0O1dlIGhhdmUgbG9nZ2VkIHlvdXIgZW5xdWlyeSBhbmQgd2lsbCAKLSAgICAgIHJlc3BvbmQgYnkgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9Im15LWV4dDpnZXRkYXRlKHN0cmluZyhAbnVtZGF5cykpIi8mZ3Q7LiZsdDsvcCZndDsKLSAgJmx0Oy94c2w6dGVtcGxhdGU+Ci0KLSZsdDsveHNsOnN0eWxlc2hlZXQmZ3Q7Ci08L3NvdXJjZT4KLTwvczI+PGFuY2hvciBuYW1lPSJzZXR1cC1ydW50aW1lIi8+Ci08czIgdGl0bGU9IlNldHRpbmcgdXAgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQiPgotPHA+VG8gcnVuIHRoZSBwcmVjZWRpbmcgZXhhbXBsZSwgYnNmLmphciBhbmQganMuamFyIG11c3QgYmUgb24gdGhlIGNsYXNzcGF0aC4gUmVtZW1iZXIgdGhhdCBic2YuamFyIG11c3QgYmUgb24gdGhlIGNsYXNzcGF0aCB0byBydW4gYW55IGV4dGVuc2lvbiB3cml0dGVuIGluIGEgbGFuZ3VhZ2Ugb3RoZXIgdGhhbiBKYXZhLiBGb3IgZXh0ZW5zaW9ucyBpbXBsZW1lbnRlZCBpbiBhIHNjcmlwdGluZyBsYW5ndWFnZSwgc2VlIHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBpbiA8bGluayBhbmNob3I9InN1cHBvcnRlZC1sYW5nIj5TdXBwb3J0ZWQgbGFuZ3VhZ2VzPC9saW5rPi48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0iYmFzaWMtc3ludGF4Ii8+Ci08czIgdGl0bGU9IlN5bnRheCI+Ci08cD5Zb3UgY2FuIGFsd2F5cyB1c2UgdGhlIHBhdHRlcm4gaWxsdXN0cmF0ZWQgYWJvdmUgdG8gc2V0IHVwIGFuZCB1c2UgZXh0ZW5zaW9uIGVsZW1lbnRzIGFuZCBleHRlbnNpb24gZnVuY3Rpb25zLiBGb3IgZXh0ZW5zaW9uIGVsZW1lbnRzIGFuZCBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gSmF2YSwgeW91IGNhbiBhbHNvIHVzZSBhbiBhYmJyZXZpYXRlZCBzeW50YXgsIGRlc2NyaWJlZCBpbiA8bGluayBhbmNob3I9ImphdmEtbmFtZXNwYWNlIj5BbHRlcm5hdGl2ZTogdXNpbmcgdGhlIGFiYnJldmlhdGVkIHN5bnRheCBmb3IgZXh0ZW5zaW9ucyBpbXBsZW1lbnRlZCBpbiBKYXZhPC9saW5rPi4gVW5sZXNzIHlvdSBhcmUgdXNpbmcgdGhlIGFiYnJldmlhdGVkIHN5bnRheCwgZG8gdGhlIGZvbGxvd2luZzo8L3A+Ci08czMgdGl0bGU9IjEuIERlY2xhcmUgdGhlIGx4c2x0IG5hbWVzcGFjZSI+Ci08cD48YnIvPjxjb2RlPnhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCI8L2NvZGU+PC9wPgotPHA+VGhlIGx4c2x0IG5hbWVzcGFjZSBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgbHhzbHQ6Y29tcG9uZW50IGVsZW1lbnQgYW5kIGx4c2x0OnNjcmlwdCBzdWJlbGVtZW50LjwvcD4KLTwvczM+Ci08czMgdGl0bGU9IjIuIERlY2xhcmUgYSB1bmlxdWUgbmFtZXNwYWNlIGZvciBlYWNoIGV4dGVuc2lvbiBwcmVmaXgiPgotPHA+PGJyLz48Y29kZT54bWxuczo8cmVmPnByZWZpeDwvcmVmPj08cmVmPlVSSTwvcmVmPjwvY29kZT48L3A+Ci08cD5UaGUgPHJlZj5wcmVmaXg8L3JlZj4gaWRlbnRpZmllcyB0aGUgbmFtZXNwYWNlLCBhbmQgPHJlZj5VUkk8L3JlZj4gaXMgYW4gYXJiaXRyYXJ5IChidXQgdW5pcXVlKSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUgcHJlZml4IGF0dHJpYnV0ZSBvZiBhbiBseHNsdDpjb21wb25lbnQgZWxlbWVudCBpbiB0aGUgc3R5bGVzaGVldC48YnIvPgotRXhhbXBsZTogPGNvZGU+eG1sbnM6ZXh0MT0ieHl6IjwvY29kZT48YnIvPjxici8+PC9wPgotPC9zMz4KLTxzMyB0aXRsZT0iMy4gSWYgeW91IGFyZSB1c2luZyBleHRlbnNpb24gZWxlbWVudHMsIGRlc2lnbmF0ZSB0aGUgZXh0ZW5zaW9uIGVsZW1lbnQgcHJlZml4ZXMiPgotPHA+PGJyLz5UaGlzIHN0ZXAgaXMgcmVxdWlyZWQgb25seSBpZiB5b3UgYXJlIHVzaW5nIGV4dGVuc2lvbiBlbGVtZW50cy4gIElmIHlvdSBhcmUgdXNpbmcgZXh0ZW5zaW9uIGZ1bmN0aW9ucyBvbmx5LCB5b3UgY2FuIHNraXAgdGhpcyBzdGVwLjwvcD4KLTxwPkluIHRoZSBzdHlsZXNoZWV0IGVsZW1lbnQsIHdyaXRlOjwvcD4gCi08cD48Y29kZT5leHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0iPHJlZj5wcmVmaXgtMSBwcmVmaXgtMiAuLi48L3JlZj4iPC9jb2RlPjwvcD4KLTxwPkluIGEgbGl0ZXJhbCByZXN1bHQgZWxlbWVudCBvciBleHRlbnNpb24gZWxlbWVudCBpbmNsdWRlIHRoZSB4c2wgcHJlZml4OjwvcD4KLTxwPjxjb2RlPnhzbDpleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0iPHJlZj5wcmVmaXgxIHByZWZpeDIgLi4uPC9yZWY+IjwvY29kZT48L3A+Ci08cD5LZWVwIGluIG1pbmQgdGhhdCB3aGVyZSB5b3UgZGVjbGFyZSBuYW1lc3BhY2VzIGFuZCBkZXNpZ25hdGUgZXh0ZW5zaW9uIHByZWZpeGVzIGRldGVybWluZXMgdGhlIHNjb3BlIG9mIHRob3NlIG5hbWVzcGFjZXMuVG8gbWFrZSB5b3VyIGV4dGVuc2lvbnMgYXZhaWxhYmxlIHRocm91Z2hvdXQgdGhlIHN0eWxlc2hlZXQsIGluY2x1ZGUgdGhlc2Ugc2V0dGluZ3MgYW5kIGF0dHJpYnV0ZSBpbiB0aGUgc3R5bGVzaGVldCBlbGVtZW50LjwvcD4KLTwvczM+Ci08czMgdGl0bGU9IjQuIChPcHRpb25hbCkgRXhjbHVkZSB0aGUgZXh0ZW5zaW9uIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBmcm9tIHRoZSByZXN1bHQgdHJlZSI+Ci08cD48YnIvPkJ5IGRlZmF1bHQsIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgYXJlIGluY2x1ZGVkIGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQuIFRvIGV4Y2x1ZGUgbmFtZXNwYWNlcyBmcm9tIHRoZSBvdXRwdXQsIHVzZTwvcD4KLTxwPjxjb2RlPmV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSI8cmVmPnByZWZpeC0xIHByZWZpeC0yIC4uLjwvcmVmPiI8L2NvZGU+PC9wPgotPHA+aW4gdGhlIHN0eWxlc2hlZXQgZWxlbWVudCBvcjwvcD4KLTxwPjxjb2RlPnhzbDpleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0iPHJlZj5wcmVmaXgtMSBwcmVmaXgtMiAuLi48L3JlZj4iPC9jb2RlPjwvcD4gCi08cD5pbiBhIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnQgb3IgZXh0ZW5zaW9uIGVsZW1lbnQuPC9wPgotPC9zMz4KLTxzMyB0aXRsZT0iNS4gU2V0IHVwIGFuIGx4c2x0OmNvbXBvbmVudCI+Ci08cD48YnIvPkluIHRoZSBzY29wZSBvZiB0aGUgbHhzbHQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uOjwvcD4KLTxwPjxjb2RlPiZsdDtseHNsdDpjb21wb25lbnQgcHJlZml4PSI8cmVmPnByZWZpeDwvcmVmPiIgPC9jb2RlPjxici8+Ci0gICA8Y29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmdW5jdGlvbnM9IjxyZWY+ZnVuYy0xIGZ1bmMtMiAuLi5mdW5jLW48L3JlZj4iPC9jb2RlPjxici8+IAotICAgPGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZWxlbWVudHM9IjxyZWY+ZWxlbS0xIGVsZW0tMiAuLi5lbGVtLW48L3JlZj4iJmd0OzwvY29kZT48YnIvPgotICAgPGNvZGU+Jm5ic3A7Jm5ic3A7Jmx0OyEtLVNlZSBseHNsdDpzY3JpcHQgYmVsb3ctLSZndDs8L2NvZGU+PGJyLz4KLSAgIDxjb2RlPiZsdDsvbHhzbHQ6Y29tcG9uZW50Jmd0OzwvY29kZT48L3A+Ci08cD53aGVyZSA8cmVmPmZ1bmMtMSBmdW5jLTIgLi4uIGZ1bmMtbjwvcmVmPiBhbmQgPHJlZj5lbGVtLTEgZWxlbS0yIC4uLiBlbGVtLW48L3JlZj4gZGVzaWduYXRlIHRoZSBmdW5jdGlvbnMgYW5kIGVsZW1lbnRzIHRoZSBleHRlbnNpb24gcHJvdmlkZXMgYW5kIHRoZSBzdHlsZXNoZWV0IHVzZXMuIFlvdSBjYW4gdXNlIHRoZSBmdW5jdGlvbi1hdmFpbGFibGUgYW5kIGVsZW1lbnQtYXZhaWxhYmxlIGZ1bmN0aW9ucyB0byBkZXRlcm1pbmUgYXQgcnVuIHRpbWUgd2hldGhlciBhIGZ1bmN0aW9uIG9yIGVsZW1lbnQgZGVzaWduYXRlZCBpbiB0aGUgbHhzbHQ6Y29tcG9uZW50IGlzIGFjdHVhbGx5IGF2YWlsYWJsZS48L3A+Ci08bm90ZT5JZiB0aGUgY29tcG9uZW50IGlzIGltcGxlbWVudGVkIGluIEphdmEsIHRoZSB2YWx1ZXMgb2YgdGhlIDxjb2RlPmZ1bmN0aW9uczwvY29kZT4gYW5kIDxjb2RlPmVsZW1lbnRzPC9jb2RlPiBhdHRyaWJ1dGVzIGFyZSBpZ25vcmVkLiBUaGUgZnVuY3Rpb24tYXZhaWxhYmxlIGFuZCBlbGVtZW50LWF2YWlsYWJsZSBmdW5jdGlvbnMgdXNlIHJlZmxlY3Rpb24gdG8gZXhhbWluZSB0aGUgYWN0dWFsIEphdmEgbWV0aG9kcy48L25vdGU+Ci08L3MzPgotPGFuY2hvciBuYW1lPSJzZXR1cC1zY3JpcHQiLz4KLTxzMyB0aXRsZT0iNi4gU2V0IHVwIHRoZSBseHNsdDpzY3JpcHQgZWxlbWVudCI+Ci08cD48YnIvPkluIGVhY2ggbHhzbHQ6Y29tcG9uZW50LCB5b3UgbXVzdCBpbmNsdWRlIGV4YWN0bHkgb25lIGx4c2x0OnNjcmlwdCBlbGVtZW50LiBJZiB0aGUgZXh0ZW5zaW9uIGlzIGltcGxlbWVudGVkIGluIEphdmFTY3JpcHQ6PC9wPgotPHA+PGNvZGU+Jmx0O2x4c2x0OnNjcmlwdCBsYW5nPSJqYXZhc2NyaXB0IiAmZ3Q7PC9jb2RlPjxici8+Ci08Y29kZT4mbmJzcDsmbmJzcDsmbHQ7IS0tVGhlIGltcGxlbWVudGF0aW9uIHNjcmlwdC0tJmd0OzwvY29kZT48YnIvPgotPGNvZGU+Jmx0Oy9seHNsdDpzY3JpcHQmZ3Q7PC9jb2RlPjwvcD4KLTxwPkZvciBvdGhlciBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHN1cHBvcnRlZCBieSBCU0YsIHVzZSB0aGUgc2FtZSBhcHByb2FjaCBhcyBmb3IgSmF2YVNjcmlwdC4gJnhzbHQ0ajsgcGxhbnMgdG8gYWRkIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBzcmMgYXR0cmlidXRlIHRvIGlkZW50aWZ5IGFub3RoZXIgZG9jdW1lbnQgdGhhdCBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gc2NyaXB0OyB0aGlzIGZlYXR1cmUgaXMgbm90IHlldCBzdXBwb3J0ZWQuPC9wPgotPHA+SWYgdGhlIGV4dGVuc2lvbiBpcyBpbXBsZW1lbnRlZCBpbiBKYXZhLCB5b3UgaGF2ZSB0aHJlZSBjaG9pY2VzIGZvciB0aGUgZm9ybWF0IG9mIHRoZSBzcmMgYXR0cmlidXRlIGluIHRoZSBseHNsdDpzY3JpcHQgZWxlbWVudC48L3A+Ci08cD48Y29kZT4mbHQ7bHhzbHQ6c2NyaXB0IGxhbmc9ImphdmFjbGFzcyIgc3JjPSJ4YWxhbjovLzxyZWY+RlFDTjwvcmVmPiIvJmd0OzwvY29kZT4KLTxici8+d2hlcmUgPHJlZj5GUUNOPC9yZWY+IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLTxici8+RXhhbXBsZTogPGNvZGU+Jmx0O2x4c2x0OnNjcmlwdCBsYW5nPSJqYXZhY2xhc3MiIHNyYz0ieGFsYW46Ly9qYXZhLnV0aWwuSGFzaHRhYmxlIi8mZ3Q7PC9jb2RlPjwvcD4KLTxwPjxjb2RlPiZsdDtseHNsdDpzY3JpcHQgbGFuZz0iamF2YWNsYXNzIiBzcmM9InhhbGFuOi8vPHJlZj5QSlBOPC9yZWY+Ii8mZ3Q7PC9jb2RlPgotPGJyLz53aGVyZSA8cmVmPlBKUE48L3JlZj4gaXMgdGhlIGJlZ2lubmluZyBvZiBvciB0aGUgY29tcGxldGUgbmFtZSBvZiBhIGphdmEgcGFja2FnZS4KLTxici8+RXhhbXBsZTogPGNvZGU+Jmx0O2x4c2x0OnNjcmlwdCBsYW5nPSJqYXZhY2xhc3MiIHNyYz0iamF2YS51dGlsIi8mZ3Q7PC9jb2RlPjwvcD4KLTxwPjxjb2RlPiZsdDtseHNsdDpzY3JpcHQgbGFuZz0iamF2YWNsYXNzIiBzcmM9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiLyZndDs8L2NvZGU+PC9wPgotPHA+VGhlIGRpZmZlcmVudCBmb3JtYXRzIGZvciB0aGUgdmFsdWUgb2YgdGhlIHNyYyBhdHRyaWJ1dGUgd2hlbiB1c2luZyBKYXZhIGV4dGVuc2lvbnMgYXJlIG1vcmUgZnVsbHkgZXhwbGFpbmVkIGluIDxsaW5rIGFuY2hvcj0iamF2YS1uYW1lc3BhY2UtZGVjbGFyZSI+RGVjbGFyZSB0aGUgbmFtZXNwYWNlPC9saW5rPi48L3A+Ci08L3MzPgotPHMzIHRpdGxlPSJJbXBsaWNpdCBEVEQgZm9yIGx4c2x0OmNvbXBvbmVudCI+Ci08c291cmNlPiZsdDshRUxFTUVOVCBseHNsdDpjb21wb25lbnQgKGx4c2x0OnNjcmlwdCkmZ3Q7Ci0mbHQ7IUFUVExJU1QgbHhzbHQ6Y29tcG9uZW50Ci0gIHByZWZpeCBDREFUQSAjUkVRVUlSRUQKLSAgZWxlbWVudHMgTk1UT0tFTlMgI0lNUExJRUQKLSAgZnVuY3Rpb25zIE5NVE9LRU5TICNJTVBMSUVEJmd0OwotCi0mbHQ7IUVMRU1FTlQgbHhzbHQ6c2NyaXB0ICgjUENEQVRBIHwgRU1QVFkpPyZndDsKLSZsdDshQVRUTElTVCBseHNsdDpzY3JpcHQKLSAgbGFuZyBDREFUQSAjUkVRVUlSRUQKLSAgc3JjIENEQVRBICNJTVBMSUVEJmd0Ozwvc291cmNlPgotPC9zMz4KLTwvczI+PGFuY2hvciBuYW1lPSJleHQtZWxlbWVudHMiLz4KLTxzMiB0aXRsZT0iVXNpbmcgYW4gZXh0ZW5zaW9uIGVsZW1lbnQiPgotPHA+RXh0ZW5zaW9uIGVsZW1lbnRzIHBhc3MgdGhlIGV4dGVuc2lvbiB0d28gb2JqZWN0czo8L3A+Ci08dWw+Ci08bGk+PGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL2V4dGVuc2lvbnMvWFNMUHJvY2Vzc29yQ29udGV4dC5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnMuWFNMUHJvY2Vzc29yQ29udGV4dDwvanVtcD4sIHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgWFNMIHByb2Nlc3NvciwgdGhlIFhNTCBzb3VyY2UgdHJlZSwgdGhlIHN0eWxlc2hlZXQgdHJlZSwgdGhlIGN1cnJlbnQgY29udGV4dCBub2RlLCBhbmQgdGhlIGN1cnJlbnQgbW9kZSAoaWYgYW55KS48YnIvPjxici8+PC9saT4KLTxsaT48anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzL0VsZW1FeHRlbnNpb25DYWxsLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1FeHRlbnNpb25DYWxsPC9qdW1wPiwgd2hpY2ggcHJvdmlkZXMgdGhlIEFQSSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgZXh0ZW5zaW9uIGVsZW1lbnQuPC9saT4KLTwvdWw+Ci08cD5Zb3UgY2FuIHVzZSB0aGUgRWxlbUV4dGVuc2lvbkNhbGwgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSBtZXRob2QsIGZvciBleGFtcGxlLCB0byByZWFkIGVsZW1lbnQgYXR0cmlidXRlcyBpbiB0aGVpciByYXcgZm9ybS4gIFVzZSB0aGUgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBOb2RlIHNvdXJjZU5vZGUsIFhTTFRFbmdpbmVJbXBsIHByb2Nlc3NvcikgbWV0aG9kIHRvIGV2YWx1YXRlIHRoZSBhdHRyaWJ1dGUgYXMgYW4gYXR0cmlidXRlIHZhbHVlIHRlbXBsYXRlLiAgTm90ZSB0aGF0IHRoZSBtZXRob2QgbmFtZXMgYXJlIHRoZSBzYW1lIGJ1dCB0aGUgbWV0aG9kIHNpZ25hdHVyZXMgYXJlIGRpZmZlcmVudC4gIEZvciBmdWxsIGRldGFpbHMsIHNlZSB0aGUgPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcy9FbGVtRXh0ZW5zaW9uQ2FsbC5odG1sIj5KYXZhZG9jPC9qdW1wPiBmb3IgdGhlIEVsZW1FeHRlbnNpb25DYWxsIGNsYXNzLjwvcD4KLTxzMyB0aXRsZT0iSW1wbGVtZW50aW5nIGFuIGV4dGVuc2lvbiBlbGVtZW50Ij4KLTxwPkZvciBlYWNoIGV4dGVuc2lvbiBlbGVtZW50IGluIGEgbmFtZXNwYWNlLCB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCBiZSBhIEphdmEgbWV0aG9kIHdpdGggdGhlIGZvbGxvd2luZyBzaWduYXR1cmUsIG9yIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgZXF1aXZhbGVudDo8L3A+Ci08cD48Y29kZT48cmVmPlR5cGUgZWxlbWVudDwvcmVmPihvcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnMuWFNMUHJvY2Vzc29yQ29udGV4dCwgPC9jb2RlPjxici8+Ci08Y29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtRXh0ZW5zaW9uQ2FsbCBleHRlbnNpb25FbGVtZW50KTwvY29kZT48L3A+Ci08cD53aGVyZSA8cmVmPlR5cGU8L3JlZj4gZGVzaWduYXRlcyB0aGUgcmV0dXJuIHR5cGUgYW5kIDxyZWY+ZWxlbWVudDwvcmVmPiBpcyB0aGUgbG9jYWwgcGFydCBvZiB0aGUgZXh0ZW5zaW9uIGVsZW1lbnQgbmFtZSAodGhlIGVsZW1lbnQgbmFtZSB3aXRob3V0IHRoZSBuYW1lc3BhY2UgcHJlZml4KS4gSW4gdGhlIG1ldGhvZCBzaWduYXR1cmUsIHlvdSBtYXkgYWxzbyB1c2Ugc3VwZXJjbGFzc2VzIG9mIHRoZSBpbmRpY2F0ZWQgdHlwZXMuPC9wPgotPHA+SWYgdGhlIGV4dGVuc2lvbiBlbGVtZW50IGlzIGltcGxlbWVudGVkIGluIGEgbG9vc2VseSB0eXBlZCBzY3JpcHRpbmcgbGFuZ3VhZ2UsIHN1Y2ggYXMgSmF2YVNjcmlwdCwgdGhlIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlIGFyZSB1bnR5cGVkLjwvcD4KLTxwPjxlbT5DYXV0aW9uOjwvZW0+IFRoZSB2YWx1ZSByZXR1cm5lZCBieSBhbiBleHRlbnNpb24gZWxlbWVudCBpcyBwbGFjZWQgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdC4gSWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiBhIHJldHVybiB2YWx1ZSwgdXNlIGEgcHVibGljIHZvaWQgSmF2YSBtZXRob2Qgb3IgcmV0dXJuIG51bGwgZnJvbSBhIHNjcmlwdGluZyBsYW5ndWFnZSBmdW5jdGlvbi48L3A+Ci08cD5KYXZhIGV4YW1wbGU6IDxjb2RlPnB1YmxpYyB2b2lkIG15RWxlbWVudDwvY29kZT48YnIvPgotPGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KG9yZy5hcGFjaGUueGFsYW4ueHNsdC5YU0xQcm9jZXNzb3JDb250ZXh0LCA8L2NvZGU+PGJyLz4KLTxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO29yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1FeHRlbnNpb25DYWxsIGV4dGVuc2lvbkVsZW1lbnQpPC9jb2RlPjwvcD4KLTxwPkphdmFTY3JpcHQgZXhhbXBsZTogPGNvZGU+ZnVuY3Rpb24gbXlFbGVtZW50KHhzbFByb2NDb250ZXh0LCBlbGVtZW50KTwvY29kZT48L3A+Ci08cD5UaGUgPGxpbmsgaWRyZWY9ImV4dGVuc2lvbnNsaWIiIGFuY2hvcj0icmVkaXJlY3QiPlJlZGlyZWN0IGV4dGVuc2lvbjwvbGluaz4gaW4gdGhlIGV4dGVuc2lvbnMgbGlicmFyeSBjb250YWlucyB0aHJlZSBleHRlbnNpb24gZWxlbWVudHMuPC9wPgotPC9zMz4KLQotPC9zMj48YW5jaG9yIG5hbWU9ImV4dC1mdW5jdGlvbnMiLz4KLTxzMiB0aXRsZT0iVXNpbmcgZXh0ZW5zaW9uIGZ1bmN0aW9ucyI+Ci08cD5FeHRlbnNpb24gZnVuY3Rpb25zIG1heSBpbmNsdWRlIGFyZ3VtZW50cyBvZiBhbnkgdHlwZSBhbmQgcmV0dXJuIGEgdmFsdWUgb2YgYW55IHR5cGUuPC9wPgotPHA+WFNMVCByZWNvZ25pemVzIGZpdmUgZGF0YSB0eXBlczogbm9kZS1zZXQsIHJlc3VsdC10cmVlLWZyYWdtZW50LCBzdHJpbmcsIGJvb2xlYW4sIGFuZCBudW1iZXIuIFlvdSBjYW4gdXNlIFhQYXRoIGV4cHJlc3Npb25zIHRvIHNldCB2YXJpYWJsZXMgd2l0aCB2YWx1ZXMgb2YgdGhlc2UgdHlwZXMuIFlvdSBjYW4gYWxzbyBwYXNzIGxpdGVyYWxzIGZvciBzdHJpbmcsIGJvb2xlYW4sIGFuZCBudW1iZXIgYXJndW1lbnRzLiBJZiB5b3Ugd2FudCB0byBwYXNzIGFuIGFyZ3VtZW50IG9mIGEgdHlwZSB0aGF0IFhTTFQgZG9lcyBub3QgcmVjb2duaXplLCB1c2UgYW5vdGhlciBleHRlbnNpb24gZnVuY3Rpb24gdG8gcmV0dXJuIGFuIG9iamVjdCBvZiB0aGF0IHR5cGUuIFRoZSBzdHlsZXNoZWV0IHRoYXQgYXBwZWFycyBpbiA8bGluayBhbmNob3I9ImZvcm1hdC1kYXRlLXN0eWxlc2hlZXQiPkZvcm1hdHRpbmcgYSBkYXRlPC9saW5rPiwgZm9yIGV4YW1wbGUgdXNlcyBleHRlbnNpb24gZnVuY3Rpb25zIHRvIHJldHVybiBhIERhdGUgb2JqZWN0IGFuZCBhIFNpbXBsZURhdGVGb3JtYXQgb2JqZWN0LCBhbmQgdGhlbiB1c2VzIHRoZXNlIG9iamVjdHMgdG8gY2FsbCBhbm90aGVyIGV4dGVuc2lvbiBmdW5jdGlvbi48L3A+Ci08czMgdGl0bGU9IkRhdGEgdHlwZSBtYXBwaW5nIGFuZCBtZXRob2Qgc2VsZWN0aW9uIj4KLTxwPldoZW4gY2FsbGluZyBhbiBleHRlbnNpb24gZnVuY3Rpb24gd3JpdHRlbiBpbiBhIGxhbmd1YWdlIG90aGVyIHRoYW4gSmF2YSwgb2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIEphdmEgY2xhc3NlcyB3aWxsIGFsd2F5cyBiZSBwYXNzZWQgdG8gdGhlIGV4dGVuc2lvbiBmdW5jdGlvbjo8L3A+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGg+WFNMVCBUeXBlPC90aD4KLSAgICAgIDx0aD5KYXZhIFR5cGU8L3RoPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgIDx0ZD5Ob2RlLVNldDwvdGQ+Ci0gICAgICAgPHRkPm9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgIDx0ZD5TdHJpbmc8L3RkPgotICAgICAgIDx0ZD5qYXZhLmxhbmcuU3RyaW5nPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+Qm9vbGVhbjwvdGQ+Ci0gICAgICAgPHRkPmphdmEubGFuZy5Cb29sZWFuPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+TnVtYmVyPC90ZD4KLSAgICAgICA8dGQ+amF2YS5sYW5nLkRvdWJsZTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgPHRkPlJlc3VsdCBUcmVlIEZyYWdtZW50PC90ZD4KLSAgICAgICA8dGQ+b3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTxwPkFueSBub24tWFNMVCB0eXBlIGlzIHBhc3NlZCB3aXRob3V0IGNvbnZlcnNpb24uPC9wPgotPHA+V2hlbiBjYWxsaW5nIGFuIGV4dGVuc2lvbiBmdW5jdGlvbiB3cml0dGVuIGluIEphdmEsIHRoZSBleHRlbnNpb24gZnVuY3Rpb24gc2lnbmF0dXJlIGNhbiBzcGVjaWZ5IGFueSBvZiB0aGUgaW5kaWNhdGVkIEphdmEgdHlwZXMsIGFzIGV4cGxhaW5lZCBiZWxvdzo8L3A+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGg+WFNMVCBUeXBlPC90aD4KLSAgICAgIDx0aD5KYXZhIFR5cGVzPC90aD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+Tm9kZS1TZXQ8L3RkPgotICAgICAgIDx0ZD5vcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yLCBvcmcudzNjLmRvbS5Ob2RlTGlzdCwgb3JnLnczYy5kb20uTm9kZSBvciBpdHMgc3ViY2xhc3NlcywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCwgY2hhciwgW2RvdWJsZSwgZmxvYXQsIGxvbmcsIGludCwgc2hvcnQsIGJ5dGUsXSBib29sZWFuPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+U3RyaW5nPC90ZD4KLSAgICAgICA8dGQ+amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCwgY2hhciwgW2RvdWJsZSwgZmxvYXQsIGxvbmcsIGludCwgc2hvcnQsIGJ5dGUsXSBib29sZWFuPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+Qm9vbGVhbjwvdGQ+Ci0gICAgICAgPHRkPmJvb2xlYW4sIGphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+TnVtYmVyPC90ZD4KLSAgICAgICA8dGQ+ZG91YmxlLCBqYXZhLmxhbmcuRG91YmxlLCBmbG9hdCwgbG9uZywgaW50LCBzaG9ydCxjaGFyLCBieXRlLCBib29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+UmVzdWx0IFRyZWUgRnJhZ21lbnQ8L3RkPgotICAgICAgIDx0ZD5vcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yLCBvcmcudzNjLmRvbS5Ob2RlTGlzdCwgb3JnLnczYy5kb20uTm9kZSBvciBpdHMgc3ViY2xhc3NlcywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCwgY2hhciwgW2RvdWJsZSwgZmxvYXQsIGxvbmcsIGludCwgc2hvcnQsIGJ5dGUsXSBib29sZWFuPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+Tm9uLVhTTFQgVHlwZTwvdGQ+Ci0gICAgICAgPHRkPnRoZSBuYXRpdmUgdHlwZSBvciBhbnkgb2YgaXRzIHN1cGVyY2xhc3NlcywgZG91YmxlLCBmbG9hdCwgbG9uZywgaW50LCBzaG9ydCwgY2hhciwgYnl0ZSwgamF2YS5sYW5nLlN0cmluZzwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTxwPldoZW4gY2FsbGluZyBleHRlbnNpb24gZnVuY3Rpb25zIHdyaXR0ZW4gaW4gSmF2YSwgJnhzbHQ0ajsgc2VsZWN0cyB0aGUgbWV0aG9kIHRvIGNhbGwgYXMgZm9sbG93czo8L3A+Ci08b2w+Ci0gIDxsaT4meHNsdDRqOyBzZWxlY3RzIGFsbCBtZXRob2RzIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGUgZXh0ZW5zaW9uIGZ1bmN0aW9uIG5hbWUgYXMgc3BlY2lmaWVkIGluIDxsaW5rIGFuY2hvcj0iZXh0LWZ1bmMtY2FsbHMiPkV4dGVuc2lvbiBmdW5jdGlvbiBKYXZhIGNhbGxzPC9saW5rPi48L2xpPgotICA8bGk+RnJvbSB0aGlzIGxpc3Qgb2YgbWV0aG9kcywgJnhzbHQ0ajsgZGV0ZXJtaW5lcyB3aGljaCBtZXRob2RzIGFyZSA8cmVmPnF1YWxpZmllZDwvcmVmPi48L2xpPgotICA8bGk+RWFjaCBxdWFsaWZpZWQgbWV0aG9kIGlzIGFzc2lnbmVkIGEgc2NvcmUgYmFzZWQgb24gdGhlIHRhYmxlIHNob3duIGFib3ZlLiBUbyBhc3NpZ24gdGhlIHNjb3JlIHRvIGEgZ2l2ZW4gbWV0aG9kLCAmeHNsdDRqOyBleGFtaW5lcyBlYWNoIG9mIHRoZSBYU0xUIGFyZ3VtZW50IHR5cGVzIGluIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIGluIHRoZSBzdHlsZXNoZWV0LiBGb3IgZWFjaCBhcmd1bWVudCwgdGhlIGFwcHJvcHJpYXRlIHJvdyBpbiB0aGUgdGFibGUgYWJvdmUgaXMgc2VsZWN0ZWQuIFRoZW4sIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgcGFyYW1ldGVyIHR5cGUgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUgaW4gdGhlIEphdmEgcHJvZ3JhbSBpcyBzY29yZWQuIFR5cGVzIHdoaWNoIGFwcGVhciBlYXJsaWVyIGluIHRoZSBsaXN0IGFyZSBnaXZlbiBhIGhpZ2hlciBzY29yZS4gIFRoYXQgaXMsIHRoZSBsaXN0IGFwcGVhcnMgaW4gb3JkZXIgb2Ygc2NvcmluZyBwcmVmZXJlbmNlIGZyb20gaGlnaGVzdCB0byBsb3dlc3QuIFR5cGVzIHNob3duIGluIHNxdWFyZSBicmFja2V0cyBoYXZlIGVxdWFsIHByaW9yaXR5LjwvbGk+Ci0gIDxsaT5UaGUgbWV0aG9kIHdpdGggdGhlIGhpZ2hlc3Qgc2NvcmUgaXMgaW52b2tlZCBhZnRlciB0aGUgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUuIElmIG1vcmUgdGhhbiBvbmUgbWV0aG9kIGhhcyB0aGUgaGlnaGVzdCBzY29yZSwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi48L2xpPgotPC9vbD4KLTxwPkFueSBleHRlbnNpb24gZnVuY3Rpb24gd3JpdHRlbiBpbiBKYXZhIGNhbiBoYXZlIGEgZmlyc3QgcGFyYW1ldGVyIG9mIHR5cGUgPGNvZGU+b3JnLmFwYWNoZS54YWxhbi5leHRlbnNpb25zLkV4cHJlc3Npb25Db250ZXh0PC9jb2RlPi4gQW55IG1ldGhvZCB3aXRoIGFuIEV4cHJlc3Npb25Db250ZXh0IGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgd2lsbCBzY29yZSBoaWdoZXIgdGhhbiBhbnkgbWV0aG9kIHdoaWNoIGRvZXMgbm90IGhhdmUgYW4gRXhwcmVzc2lvbkNvbnRleHQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIuPC9wPgotPC9zMz4KLTxhbmNob3IgbmFtZT0iZXh0LWZ1bmMtY2FsbHMiLz4KLTxzMyB0aXRsZT0iRXh0ZW5zaW9uIGZ1bmN0aW9uIEphdmEgY2FsbHMiPgotPHA+VGhlIHRlY2huaXF1ZSBmb3IgaW5zdGFudGlhdGluZyBKYXZhIG9iamVjdHMgYW5kIGNhbGxpbmcgSmF2YSBtZXRob2RzIGRlcGVuZHMgb24gdGhlIGZvcm1hdCBvZiB0aGUgZXh0ZW5zaW9uIG5hbWVzcGFjZSB0aGF0IHdhcyBkZWNsYXJlZC4gIFNlZSA8bGluayBhbmNob3I9ImphdmEtbmFtZXNwYWNlLWRlY2xhcmUiPkRlY2xhcmUgdGhlIG5hbWVzcGFjZTwvbGluaz4gZm9yIHRoZSB0aHJlZSBkaWZmZXJlbnQgZm9ybWF0cyBvZiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGZvciBKYXZhIGV4dGVuc2lvbnMuIEZvciBlYWNoIG5hbWVzcGFjZSBmb3JtYXQsIHRoZSBzZWN0aW9uIGJlbG93IGRlc2NyaWJlcyBob3cgdG8gaW5zdGFudGlhdGUgYW4gb2JqZWN0LCBob3cgdG8gaW52b2tlIGFuIGluc3RhbmNlIG1ldGhvZCwgYW5kIGhvdyB0byBpbnZva2UgYSBzdGF0aWMgbWV0aG9kLiBUaGUgc2VjdGlvbnMgYmVsb3cgZXhwbGFpbiwgZm9yIGVhY2ggc3ludGF4LCB3aGljaCBtZXRob2RzIGFyZSA8cmVmPnF1YWxpZmllZDwvcmVmPiBmb3IgbWV0aG9kIHNlbGVjdGlvbiBhcyBkZXNjcmliZWQgaW4gdGhlIHByZWNlZWRpbmcgc2VjdGlvbi48L3A+Ci08czQgdGl0bGU9IkNsYXNzIGZvcm1hdCBuYW1lc3BhY2UiPgotPHA+PGJyLz48ZW0+VG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIG9iamVjdDwvZW0+OgotPGJyLz48Y29kZT48cmVmPnByZWZpeDwvcmVmPjpuZXcgKDxyZWY+YXJnczwvcmVmPik8L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj5wcmVmaXg8L3JlZj4gaXMgdGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UgcHJlZml4LiBBIG5ldyBpbnN0YW5jZSBpcyB0byBiZSBjcmVhdGVkIHdpdGggdGhlIDxyZWY+YXJnczwvcmVmPiBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKGlmIGFueSkuIEFsbCBjb25zdHJ1Y3RvciBtZXRob2RzIGFyZSBxdWFsaWZpZWQgZm9yIG1ldGhvZCBzZWxlY3Rpb24uCi08YnIvPkV4YW1wbGU6IDxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ibXlUeXBlIjwvY29kZT4KLTxici8+PGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c2VsZWN0PSJteS1jbGFzczpuZXcoKSImZ3Q7PC9jb2RlPjwvcD4KLQotPHA+PGVtPlRvIGludm9rZSBhbiBpbnN0YW5jZSBtZXRob2Qgb24gYSBzcGVjaWZpZWQgb2JqZWN0PC9lbT46Ci08YnIvPjxjb2RlPjxyZWY+cHJlZml4PC9yZWY+OjxyZWY+bWV0aG9kTmFtZTwvcmVmPiAoPHJlZj5vYmplY3Q8L3JlZj4sIDxyZWY+YXJnczwvcmVmPik8L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj5wcmVmaXg8L3JlZj4gaXMgdGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UgcHJlZml4IGFuZCA8cmVmPm1ldGhvZE5hbWU8L3JlZj4gaXMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb24gPHJlZj5vYmplY3Q8L3JlZj4gd2l0aCB0aGUgPHJlZj5hcmdzPC9yZWY+IGFyZ3VtZW50cy4gPHJlZj5vYmplY3Q8L3JlZj4gbXVzdCBiZSBhbiBvYmplY3Qgb2YgdGhlIGNsYXNzIGluZGljYXRlZCBieSB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uLiAgT3RoZXJ3aXNlLCB0aGUgY2FzZSBzaG93biBpbW1lZGlhdGVseSBiZWxvdyB3aWxsIGFwcGx5LiBPbmx5IGluc3RhbmNlIG1ldGhvZHMgd2l0aCAgdGhlIG5hbWUgPHJlZj5tZXRob2ROYW1lPC9yZWY+IGFyZSBxdWFsaWZpZWQgbWV0aG9kcy4gSWYgYSBtYXRjaGluZyBtZXRob2QgaXMgZm91bmQsIDxyZWY+b2JqZWN0PC9yZWY+IHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgb2JqZWN0IGluc3RhbmNlIGFuZCA8cmVmPmFyZ3M8L3JlZj4gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLgotPGJyLz4KLUV4YW1wbGU6IDxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ibmV3LXBvcCI8L2NvZGU+PGJyLz4KLTxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NlbGVjdD0ibXktY2xhc3M6dmFsdWVPZigkbXlUeXBlLCBzdHJpbmcoQHBvcHVsYXRpb24pKSImZ3Q7PC9jb2RlPjwvcD4KLQotPHA+PGVtPlRvIGludm9rZSBhbiBpbnN0YW5jZSBtZXRob2Qgb24gYSBkZWZhdWx0IG9iamVjdDwvZW0+OgotPGJyLz48Y29kZT48cmVmPnByZWZpeDwvcmVmPjo8cmVmPm1ldGhvZE5hbWU8L3JlZj4gKDxyZWY+YXJnczwvcmVmPik8L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj5wcmVmaXg8L3JlZj4gaXMgdGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UgcHJlZml4IGFuZCA8cmVmPm1ldGhvZE5hbWU8L3JlZj4gaXMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugd2l0aCB0aGUgPHJlZj5hcmdzPC9yZWY+IGFyZ3VtZW50cy4gVGhlIGZpcnN0IDxyZWY+YXJnPC9yZWY+LCBpZiBhbnksIG11c3Qgbm90IGJlIGFuIG9iamVjdCBvZiB0aGUgY2xhc3MgaW5kaWNhdGVkIGJ5IHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24uICBPdGhlcndpc2UsIHRoZSBjYXNlIHNob3duIGltbWVkaWF0ZWx5IGFib3ZlIHdpbGwgYXBwbHkuIE9ubHkgaW5zdGFuY2UgbWV0aG9kcyB3aXRoIHRoZSBuYW1lIDxyZWY+bWV0aG9kTmFtZTwvcmVmPiBhcmUgcXVhbGlmaWVkIG1ldGhvZHMuIElmIGEgbWF0Y2hpbmcgbWV0aG9kIGlzIGZvdW5kLCBhIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotPGJyLz4KLUV4YW1wbGU6IDxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ibmV3LXBvcCI8L2NvZGU+PGJyLz4KLTxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NlbGVjdD0ibXktY2xhc3M6dmFsdWVPZihzdHJpbmcoQHBvcHVsYXRpb24pKSImZ3Q7PC9jb2RlPjwvcD4KLQotPHA+PGVtPlRvIGludm9rZSBhIHN0YXRpYyBtZXRob2Q8L2VtPjoKLTxici8+PGNvZGU+PHJlZj5wcmVmaXg8L3JlZj46PHJlZj5tZXRob2ROYW1lPC9yZWY+ICg8cmVmPmFyZ3M8L3JlZj4pPC9jb2RlPjwvcD4KLTxwPndoZXJlIDxyZWY+cHJlZml4PC9yZWY+IGlzIHRoZSBleHRlbnNpb24gbmFtZXNwYWNlIHByZWZpeCBhbmQgPHJlZj5tZXRob2ROYW1lPC9yZWY+IGlzIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlIHdpdGggdGhlIDxyZWY+YXJnczwvcmVmPiBhcmd1bWVudHMuIE9ubHkgc3RhdGljIG1ldGhvZHMgd2l0aCB0aGUgbmFtZSA8cmVmPm1ldGhvZE5hbWU8L3JlZj4gYXJlIHF1YWxpZmllZCBtZXRob2RzLiBJZiBhIG1hdGNoaW5nIG1ldGhvZCBpcyBmb3VuZCwgPHJlZj5hcmdzPC9yZWY+IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBpbnZva2VkIHN0YXRpYyBtZXRob2QuCi08YnIvPgotRXhhbXBsZTogPGNvZGU+Jmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJuZXctcG9wIjwvY29kZT48YnIvPgotPGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c2VsZWN0PSJteS1jbGFzczpwcmludGl0KHN0cmluZyhAcG9wdWxhdGlvbikpIiZndDs8L2NvZGU+PC9wPgotPC9zND4KLTxzNCB0aXRsZT0iUGFja2FnZSBmb3JtYXQgbmFtZXNwYWNlIj4KLTxwPjxici8+PGVtPlRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBvYmplY3Q8L2VtPjoKLTxici8+PGNvZGU+PHJlZj5wcmVmaXg8L3JlZj46PHJlZj5zdWJwYWNrYWdlPC9yZWY+LjxyZWY+Y2xhc3M8L3JlZj4ubmV3ICg8cmVmPmFyZ3M8L3JlZj4pPC9jb2RlPjwvcD4KLTxwPndoZXJlIDxyZWY+cHJlZml4PC9yZWY+IGlzIHRoZSBleHRlbnNpb24gbmFtZXNwYWNlIHByZWZpeCwgPHJlZj5zdWJwYWNrYWdlPC9yZWY+IGlzIHRoZSByZXN0IG9mIHRoZSBwYWNrYWdlIG5hbWUgKHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2thZ2UgbmFtZSB3YXMgaW4gdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiksIGFuZCA8cmVmPmNsYXNzPC9yZWY+IGlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy4gQSBuZXcgaW5zdGFuY2UgaXMgdG8gYmUgY3JlYXRlZCB3aXRoIHRoZSA8cmVmPmFyZ3M8L3JlZj4gY29uc3RydWN0b3IgYXJndW1lbnRzIChpZiBhbnkpLiBBbGwgY29uc3RydWN0b3IgbWV0aG9kcyBhcmUgcXVhbGlmaWVkIGZvciBtZXRob2Qgc2VsZWN0aW9uLgotPGJyLz5FeGFtcGxlOiA8Y29kZT4mbHQ7eHNsOnZhcmlhYmxlIG5hbWU9Im15VHlwZSI8L2NvZGU+Ci08YnIvPjxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NlbGVjdD0ibXktcGFja2FnZTpleHRjbGFzcy5uZXcoKSImZ3Q7PC9jb2RlPjwvcD4KLQotPHA+PGVtPlRvIGludm9rZSBhbiBpbnN0YW5jZSBtZXRob2Qgb24gYSBzcGVjaWZpZWQgaW5zdGFuY2U8L2VtPjoKLTxici8+PGNvZGU+PHJlZj5wcmVmaXg8L3JlZj46PHJlZj5tZXRob2ROYW1lPC9yZWY+ICg8cmVmPm9iamVjdDwvcmVmPiwgPHJlZj5hcmdzPC9yZWY+KTwvY29kZT48L3A+Ci08cD53aGVyZSA8cmVmPnByZWZpeDwvcmVmPiBpcyB0aGUgZXh0ZW5zaW9uIG5hbWVzcGFjZSBwcmVmaXggYW5kIDxyZWY+bWV0aG9kTmFtZTwvcmVmPiBpcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGludm9rZSBvbiA8cmVmPm9iamVjdDwvcmVmPiB3aXRoIHRoZSA8cmVmPmFyZ3M8L3JlZj4gYXJndW1lbnRzLiBPbmx5IGluc3RhbmNlIG1ldGhvZHMgb2YgdGhlIDxyZWY+b2JqZWN0PC9yZWY+IHdpdGggdGhlIG5hbWUgPHJlZj5tZXRob2ROYW1lPC9yZWY+IGFyZSBxdWFsaWZpZWQgbWV0aG9kcy4gSWYgYSBtYXRjaGluZyBtZXRob2QgaXMgZm91bmQsIDxyZWY+b2JqZWN0PC9yZWY+IHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgb2JqZWN0IGluc3RhbmNlIGFuZCA8cmVmPmFyZ3M8L3JlZj4gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLgotPGJyLz4KLUV4YW1wbGU6IDxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ibmV3LXBvcCI8L2NvZGU+PGJyLz4KLTxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NlbGVjdD0ibXktcGFja2FnZTp2YWx1ZU9mKCRteVR5cGUsIHN0cmluZyhAcG9wdWxhdGlvbikpIiZndDs8L2NvZGU+PC9wPgotCi08cD48ZW0+VG8gaW52b2tlIGEgc3RhdGljIG1ldGhvZDwvZW0+OgotPGJyLz48Y29kZT48cmVmPnByZWZpeDwvcmVmPjo8cmVmPnN1YnBhY2thZ2U8L3JlZj4uPHJlZj5jbGFzczwvcmVmPi48cmVmPm1ldGhvZE5hbWU8L3JlZj4gKDxyZWY+YXJnczwvcmVmPik8L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj5wcmVmaXg8L3JlZj4gaXMgdGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UgcHJlZml4LCA8cmVmPnN1YnBhY2thZ2U8L3JlZj4gaXMgdGhlIHJlc3Qgb2YgdGhlIHBhY2thZ2UgbmFtZSAodGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2FnZSBuYW1lIHdhcyBpbiB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uKSwgPHJlZj5jbGFzczwvcmVmPiBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MsIGFuZCA8cmVmPm1ldGhvZE5hbWU8L3JlZj4gaXMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugd2l0aCB0aGUgPHJlZj5hcmdzPC9yZWY+IGFyZ3VtZW50cy4gT25seSBzdGF0aWMgbWV0aG9kcyB3aXRoIHRoZSBuYW1lIDxyZWY+bWV0aG9kTmFtZTwvcmVmPiBhcmUgcXVhbGlmaWVkIG1ldGhvZHMuIElmIGEgbWF0Y2hpbmcgbWV0aG9kIGlzIGZvdW5kLCA8cmVmPmFyZ3M8L3JlZj4gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGludm9rZWQgc3RhdGljIG1ldGhvZC4KLTxici8+Ci1FeGFtcGxlOiA8Y29kZT4mbHQ7eHNsOnZhcmlhYmxlIG5hbWU9Im5ldy1wb3AiPC9jb2RlPjxici8+Ci08Y29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzZWxlY3Q9Im15LXBhY2thZ2U6ZXh0Y2xhc3MucHJpbnRpdChzdHJpbmcoQHBvcHVsYXRpb24pKSImZ3Q7PC9jb2RlPjwvcD4KLTxub3RlPlVubGlrZSB0aGUgY2xhc3MgZm9ybWF0IG5hbWVzcGFjZSwgdGhlcmUgaXMgbm8gY29uY2VwdCBvZiBhIGRlZmF1bHQgb2JqZWN0IHNpbmNlIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gZG9lcyBub3QgaWRlbnRpZnkgYSB1bmlxdWUgY2xhc3MuPC9ub3RlPgotPC9zND4KLTxzNCB0aXRsZT0iSmF2YSBmb3JtYXQgbmFtZXNwYWNlIj4KLTxwPjxici8+PGVtPlRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBvYmplY3Q8L2VtPjoKLTxici8+PGNvZGU+PHJlZj5wcmVmaXg8L3JlZj46PHJlZj5GUUNOPC9yZWY+Lm5ldyAoPHJlZj5hcmdzPC9yZWY+KTwvY29kZT48L3A+Ci08cD53aGVyZSA8cmVmPnByZWZpeDwvcmVmPiBpcyB0aGUgZXh0ZW5zaW9uIG5hbWVzcGFjZSBwcmVmaXggZm9yIHRoZSBKYXZhIG5hbWVzcGFjZSBhbmQgPHJlZj5GUUNOPC9yZWY+IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3Mgd2hvc2UgY29uc3RydWN0b3IgaXMgdG8gYmUgY2FsbGVkLiBBIG5ldyBpbnN0YW5jZSBpcyB0byBiZSBjcmVhdGVkIHdpdGggdGhlIDxyZWY+YXJnczwvcmVmPiBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKGlmIGFueSkuIEFsbCBjb25zdHJ1Y3RvciBtZXRob2RzIGFyZSBxdWFsaWZpZWQgZm9yIG1ldGhvZCBzZWxlY3Rpb24uCi08YnIvPkV4YW1wbGU6IDxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ibXlIYXNoIjwvY29kZT4KLTxici8+PGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c2VsZWN0PSJqYXZhOmphdmEudXRpbC5IYXNodGFibGUubmV3KCkiJmd0OzwvY29kZT48L3A+Ci0KLTxwPjxlbT5UbyBpbnZva2UgYW4gaW5zdGFuY2UgbWV0aG9kIG9uIGEgc3BlY2lmaWVkIGluc3RhbmNlPC9lbT46Ci08YnIvPjxjb2RlPjxyZWY+cHJlZml4PC9yZWY+OjxyZWY+bWV0aG9kTmFtZTwvcmVmPiAoPHJlZj5vYmplY3Q8L3JlZj4sIDxyZWY+YXJnczwvcmVmPik8L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj5wcmVmaXg8L3JlZj4gaXMgdGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UgcHJlZml4IGFuZCA8cmVmPm1ldGhvZE5hbWU8L3JlZj4gaXMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb24gPHJlZj5vYmplY3Q8L3JlZj4gd2l0aCB0aGUgPHJlZj5hcmdzPC9yZWY+IGFyZ3VtZW50cy4gT25seSBpbnN0YW5jZSBtZXRob2RzIG9mIHRoZSA8cmVmPm9iamVjdDwvcmVmPiB3aXRoIHRoZSBuYW1lIDxyZWY+bWV0aG9kTmFtZTwvcmVmPiBhcmUgcXVhbGlmaWVkIG1ldGhvZHMuIElmIGEgbWF0Y2hpbmcgbWV0aG9kIGlzIGZvdW5kLCA8cmVmPm9iamVjdDwvcmVmPiB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG9iamVjdCBpbnN0YW5jZSBhbmQgPHJlZj5hcmdzPC9yZWY+IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC4KLTxici8+Ci1FeGFtcGxlOiA8Y29kZT4mbHQ7eHNsOnZhcmlhYmxlIG5hbWU9Im5ldy1wb3AiPC9jb2RlPjxici8+Ci08Y29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzZWxlY3Q9ImphdmE6cHV0KCRteUhhc2gsIHN0cmluZyhAcmVnaW9uKSwgJG5ld3BvcCkiJmd0OzwvY29kZT48L3A+Ci0KLTxwPjxlbT5UbyBpbnZva2UgYSBzdGF0aWMgbWV0aG9kPC9lbT46Ci08YnIvPjxjb2RlPjxyZWY+cHJlZml4PC9yZWY+OjxyZWY+RlFDTjwvcmVmPi48cmVmPm1ldGhvZE5hbWU8L3JlZj4gKDxyZWY+YXJnczwvcmVmPik8L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj5wcmVmaXg8L3JlZj4gaXMgdGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UgcHJlZml4LCA8cmVmPkZRQ048L3JlZj4gaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyB3aG9zZSBzdGF0aWMgbWV0aG9kIGlzIHRvIGJlIGNhbGxlZCwgYW5kIDxyZWY+bWV0aG9kTmFtZTwvcmVmPiBpcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGludm9rZSB3aXRoIHRoZSA8cmVmPmFyZ3M8L3JlZj4gYXJndW1lbnRzLiBPbmx5IHN0YXRpYyBtZXRob2RzIHdpdGggdGhlIG5hbWUgPHJlZj5tZXRob2ROYW1lPC9yZWY+IGFyZSBxdWFsaWZpZWQgbWV0aG9kcy4gSWYgYSBtYXRjaGluZyBtZXRob2QgaXMgZm91bmQsIDxyZWY+YXJnczwvcmVmPiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgaW52b2tlZCBzdGF0aWMgbWV0aG9kLgotPGJyLz4KLUV4YW1wbGU6IDxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ibmV3LXBvcCI8L2NvZGU+PGJyLz4KLTxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NlbGVjdD0iamF2YTpqYXZhLmxhbmcuSW50ZWdlci52YWx1ZU9mKHN0cmluZyhAcG9wdWxhdGlvbikpIiZndDs8L2NvZGU+PC9wPgotPG5vdGU+VW5saWtlIHRoZSBjbGFzcyBmb3JtYXQgbmFtZXNwYWNlLCB0aGVyZSBpcyBubyBjb25jZXB0IG9mIGEgZGVmYXVsdCBvYmplY3Qgc2luY2UgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBkb2VzIG5vdCBpZGVudGlmeSBhIHVuaXF1ZSBjbGFzcy48L25vdGU+Ci08L3M0PgotPC9zMz4KLQotPHMzIHRpdGxlPSJQYXNzaW5nIE5vZGVzIHRvIGphdmEiPgotPHA+UGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IDxlbT5hbGw8L2VtPiBMb2NhdGlvblBhdGggZXhwcmVzc2lvbnMgcmV0dXJuIGEgbm9kZS1zZXQsIGV2ZW4gaWYgdGhlIGV4cHJlc3Npb24gb25seSByZXR1cm5zIGEgc2luZ2xlIGF0dHJpYnV0ZSBvciBhIHRleHQgbm9kZSAobm9kZS1zZXRzIHdpdGggb25lIG1lbWJlcikuIFlvdSBjYW4gdXNlIHRoZSBYU0xUIHN0cmluZygpIGZ1bmN0aW9uIChhcyBpbiB0aGUgc3ludGF4IGV4YW1wbGVzIGFib3ZlKSB0byBjb252ZXJ0IGEgbm9kZS1zZXQgdmFsdWUgdG8gc3RyaW5nLCBhbmQgdGhlIG51bWJlcigpIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBub2RlLXNldCB2YWx1ZSB0byBudW1iZXIgKGEgZG91YmxlKS48L3A+Ci08cD5JZiB5b3Ugd2FudCB0byBwYXNzIGEgbm9kZS1zZXQgdG8gYW4gZXh0ZW5zaW9uIGZ1bmN0aW9uLCBzZXQgdXAgYSBKYXZhIG1ldGhvZCB0byBhY2NlcHQgYW4gCi1vcmcudzNjLmRvbS5Ob2RlTGlzdCAob3IgYW4gb3JnLmFwYWNoZS54cGF0aC5Ob2RlU2V0LCB3aGljaCBpbXBsZW1lbnRzIE5vZGVMaXN0LCBpZiB5b3Ugd2FudCB0byBtb2RpZnkgdGhlIG5vZGVzKS48L3A+Ci08cD5TdXBwb3NlLCBmb3IgZXhhbXBsZSwgeW91IGhhdmUgYSBteUV4dGVuc2lvbnMuUHJvY2Vzc05vZGVzIGNsYXNzIHdpdGggdGhlIGZvbGxvd2luZyBkb1NvbWV0aGluZyBtZXRob2Q6PC9wPgotPHA+PGNvZGU+cHVibGljIHN0YXRpYyBib29sZWFuIGRvU29tZXRoaW5nKG9yZy53M2MuZG9tLk5vZGVMaXN0IG5MaXN0KTwvY29kZT48L3A+Ci08cD5Bc3N1bWluZyB5b3Ugc2V0IHVwIHRoaXMgZXh0ZW5zaW9uIGluIHRoZSBub2RlLWV4dCBuYW1lc3BhY2UsIGFueSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbiBjYWxscyBmcm9tIGEgc3R5bGVzaGVldCBhcmUgc3ludGFjdGljYWxseSBwb3NzaWJsZTo8L3A+Ci08cD48Y29kZT4mbHQ7IS0tUHJvY2VzcyB0aGUgY3VycmVudCBub2RlLS0mZ3Q7PC9jb2RlPjxici8+Ci08Y29kZT4mbHQ7eHNsOnZhcmlhYmxlIG5hbWU9InN1Y2Nlc3MiIHNlbGVjdD0ibm9kZS1leHQ6TXlFeHRlbnNpb25zLlByb2Nlc3NOb2Rlcy5kb1NvbWV0aGluZyguKSIvJmd0OzwvY29kZT48L3A+Ci08cD48Y29kZT4mbHQ7IS0tUHJvY2VzcyBhbGwgbm9kZXMgaW4gY3VycmVudCBjb250ZXh0LS0+PC9jb2RlPjxici8+Ci08Y29kZT4mbHQ7eHNsOnZhcmlhYmxlIG5hbWU9InN1Y2Nlc3MiIHNlbGVjdD0ibm9kZS1leHQ6TXlFeHRlbnNpb25zLlByb2Nlc3NOb2Rlcy5kb1NvbWV0aGluZygqKSIvJmd0OzwvY29kZT48L3A+Ci08cD48Y29kZT4mbHQ7IS0tIFByb2Nlc3MgYWxsIG5vZGVzIC0tPjwvY29kZT48YnIvPgotPGNvZGU+Jmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJzdWNjZXNzIiBzZWxlY3Q9Im5vZGUtZXh0Ok15RXh0ZW5zaW9ucy5Qcm9jZXNzTm9kZXMuZG9Tb21ldGhpbmcoLyopIi8mZ3Q7PC9jb2RlPjwvcD4KLTxwPjxjb2RlPiZsdDshLS1Qcm9jZXNzIHRoZSBmb28vYmF6IG5vZGVzIGluIGN1cnJlbnQgY29udGV4dCAtLT48L2NvZGU+PGJyLz4KLTxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ic3VjY2VzcyIgc2VsZWN0PSJub2RlLWV4dDpNeUV4dGVuc2lvbnMuUHJvY2Vzc05vZGVzLmRvU29tZXRoaW5nKGZvby9iYXopIi8mZ3Q7PC9jb2RlPjwvcD4KLTxwPjxjb2RlPiZsdDshLS1Qcm9jZXNzIHRoZS9mb28vYmF6IGFuZCAvYmFyL3NheiBub2RlcyAtLT48L2NvZGU+PGJyLz4KLTxjb2RlPiZsdDt4c2w6dmFyaWFibGUgbmFtZT0ic3VjY2VzcyIgc2VsZWN0PSJub2RlLWV4dDpNeUV4dGVuc2lvbnMuUHJvY2Vzc05vZGVzLmRvU29tZXRoaW5nKC9mb28vYmF6IHwgL2Jhci9zYXopIi8mZ3Q7PC9jb2RlPjwvcD4KLTxwPlRoZSBOb2RlTGlzdCBpcyBpbiBmYWN0IGEgbGlzdCBvZiByZWZlcmVuY2VzIGludG8gdGhlIFhNTCBkb2N1bWVudCwgc28ga2VlcCBpbiBtaW5kIHRoYXQgZ2V0TmV4dFNpYmxpbmcoKSwgZm9yIGV4YW1wbGUsIGdldHMgeW91IHRoZSBuZXh0IHNpYmxpbmcgaW4gdGhlIGRvY3VtZW50LCB3aGljaCBtYXkgbm90IGJlIHRoZSBuZXh0IE5vZGUgaW4gdGhlIE5vZGVMaXN0LjwvcD4KLTwvczM+Ci08czMgdGl0bGU9IkltcGxlbWVudGluZyBleHRlbnNpb24gZnVuY3Rpb25zIj4KLTxwPkZvciBlYWNoIGV4dGVuc2lvbiBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZSB3aGljaCBpcyBpbXBsZW1lbnRlZCBpbiBhIGxhbmd1YWdlIG90aGVyIHRoYW4gSmF2YSwgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgaW5jbHVkZSBhIG1ldGhvZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlLCBvciB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIGVxdWl2YWxlbnQ6PC9wPgotPHA+PGNvZGU+cHVibGljIDxyZWY+IG9iamVjdCBmdW5jdGlvbjwvcmVmPig8cmVmPmFyZ3M8L3JlZj4pPC9jb2RlPjwvcD4KLTxwPndoZXJlIDxyZWY+b2JqZWN0PC9yZWY+IGlzIHRoZSByZXR1cm4gdHlwZSwgPHJlZj5mdW5jdGlvbjwvcmVmPiBpcyB0aGUgbG9jYWwgcGFydCBvZiB0aGUgZXh0ZW5zaW9uIGZ1bmN0aW9uIG5hbWUgKHRoZSBmdW5jdGlvbiBuYW1lIHdpdGhvdXQgdGhlIG5hbWVzcGFjZSBwcmVmaXgpLCBhbmQgPHJlZj5hcmdzPC9yZWY+IGNvcnJlc3BvbmQgdG8gdGhlIGFyZ3VtZW50cyBpbiB0aGUgZnVuY3Rpb24gY2FsbC48L3A+Ci08cD5JbiBhZGRpdGlvbiwgZm9yIGV4dGVuc2lvbiBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gSmF2YSwgdGhlIGltcGxlbWVudGF0aW9uIG1heSBpbmNsdWRlIGVpdGhlciBhIEphdmEgbWV0aG9kIHdpdGggdGhlIHNpZ25hdHVyZSBzaG93biBhYm92ZSBvciBvbmUgd2l0aCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZTo8L3A+Ci08cD48Y29kZT5wdWJsaWMgPHJlZj4gb2JqZWN0IGZ1bmN0aW9uPC9yZWY+KG9yZy5hcGFjaGUueGFsYW4uZXh0ZW5zaW9ucy5FeHByZXNzaW9uQ29udGV4dCwgPHJlZj5hcmdzPC9yZWY+KTwvY29kZT48L3A+Ci08L3MzPgotPC9zMj48YW5jaG9yIG5hbWU9ImphdmEtbmFtZXNwYWNlIi8+Ci08czIgdGl0bGU9IkFsdGVybmF0aXZlOiB1c2luZyB0aGUgYWJicmV2aWF0ZWQgc3ludGF4IGZvciBleHRlbnNpb25zIGltcGxlbWVudGVkIGluIEphdmEiPgotPHA+Rm9yIGV4dGVuc2lvbiBmdW5jdGlvbnMgYW5kIGV4dGVuc2lvbiBlbGVtZW50cyBpbXBsZW1lbnRlZCBpbiBKYXZhLCBYYWxhbiBwZXJtaXRzIGFuIGFiYnJldmlhdGVkIHN5bnRheC4gV2hlbiB5b3UgdXNlIHRoZSBhYmJyZXZpYXRlZCBzeW50YXgsIHlvdSBkbyBub3QgdXNlIGFuIGx4c2x0OmNvbXBvbmVudCB0byBkZXNpZ25hdGUgdGhlIGZ1bmN0aW9ucy48L3A+Ci08cD5UaGUgYWJicmV2aWF0ZWQgc3ludGF4IHN1cHBvcnRzIHRoZSB1c2Ugb2YgZXh0ZW5zaW9uIGZ1bmN0aW9ucyBhbmQgZXh0ZW5zaW9uIGVsZW1lbnRzIGltcGxlbWVudGVkIGluIEphdmEuIFlvdSBjYW5ub3QgdXNlIHRoaXMgc3ludGF4IHdpdGggZXh0ZW5zaW9ucyBpbXBsZW1lbnRlZCBpbiBKYXZhU2NyaXB0IG9yIGFub3RoZXIgc2NyaXB0aW5nIGxhbmd1YWdlLjwvcD4KLTxhbmNob3IgbmFtZT0iamF2YS1uYW1lc3BhY2UtZGVjbGFyZSIvPgotPHMzIHRpdGxlPSJEZWNsYXJlIHRoZSBuYW1lc3BhY2UiPgotPHA+RGVjbGFyZSB0aGUgbmFtZXNwYWNlIGZvciB5b3VyIGV4dGVuc2lvbnMgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhyZWUgZm9ybWF0cy4gVGhlIHRlY2huaXF1ZSBmb3IgaW52b2tpbmcgYW4gZXh0ZW5zaW9uIGZvciBlYWNoIGZvcm1hdCBpcyBleHBsYWluZWQgaW4gPGxpbmsgYW5jaG9yPSJleHQtZnVuYy1jYWxscyI+RXh0ZW5zaW9uIGZ1bmN0aW9uIEphdmEgY2FsbHM8L2xpbms+LjwvcD4KLTxwPjxlbT5jbGFzcyBmb3JtYXQ6PC9lbT4gPGNvZGU+eG1sbnM6bXktY2xhc3M9InhhbGFuOi8vPHJlZj5GUUNOPC9yZWY+IjwvY29kZT48L3A+Ci08cD53aGVyZSA8cmVmPkZRQ048L3JlZj4gaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotPGJyLz5FeGFtcGxlczogPGNvZGU+eG1sbnM6bXktY2xhc3M9InhhbGFuOi8vamF2YS51dGlsLkhhc2h0YWJsZSI8L2NvZGU+Ci08YnIvPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxjb2RlPnhtbG5zOm15LWNsYXNzPSJ4YWxhbjovL215cGFja2FnZS5teWNsYXNzIjwvY29kZT48L3A+Ci08cD48ZW0+cGFja2FnZSBmb3JtYXQ6PC9lbT4gPGNvZGU+eG1sbnM6bXktY2xhc3M9InhhbGFuOi8vPHJlZj5QSlBOPC9yZWY+IjwvY29kZT48L3A+Ci08cD53aGVyZSA8cmVmPlBKUE48L3JlZj4gaXMgYSBwYXJ0aWFsIGphdmEgcGFja2FnZSBuYW1lLiAgVGhhdCBpcywgaXQgaXMgdGhlIGJlZ2lubmluZyBvZiBvciB0aGUgY29tcGxldGUgbmFtZSBvZiBhIGphdmEgcGFja2FnZS4KLTxici8+RXhhbXBsZXM6IDxjb2RlPnhtbG5zOm15LXBhY2thZ2U9InhhbGFuOi8vamF2YS51dGlsIjwvY29kZT4KLTxici8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGNvZGU+eG1sbnM6bXktcGFja2FnZT0ieGFsYW46Ly9teXBhY2thZ2UiPC9jb2RlPjwvcD4KLTxwPjxlbT5KYXZhIGZvcm1hdDo8L2VtPiA8Y29kZT54bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIjwvY29kZT48L3A+Ci08bm90ZT5BbHRob3VnaCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNsYXNzIGFuZCBwYWNrYWdlIGZvcm1hdHMgYXJlIHNob3duIHdpdGggdGhlIHhhbGFuOi8vIHByZWZpeCwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZm9yIHRob3NlIGZvcm1hdHMgd2lsbCBzaW1wbHkgdXNlIHRoZSBzdHJpbmcgdG8gdGhlIHJpZ2h0IG9mIHRoZSByaWdodG1vc3QgZm9yd2FyZCBzbGFzaCBhcyB0aGUgSmF2YSBjbGFzcyBuYW1lLiBUaGlzIGZvcm1hdCBpcyBzaG93biBpbiBvcmRlciB0byBjb21wbHkgd2l0aCBXM0MgcmVjb21tZW5kYXRpb25zIGZvciBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLjwvbm90ZT4KLTxub3RlPlRoZSBjbGFzczogcHJlZml4IHdoaWNoIHdhcyBzb21ldGltZXMgcmVxdWlyZWQgaW4gZWFybGllciB2ZXJzaW9ucyBvZiAmeHNsdDRqOyBpcyBubyBsb25nZXIgcmVxdWlyZWQuPC9ub3RlPgotPG5vdGU+VGhlc2UgZm9ybWF0cyBhcmUgYWxzbyBhdmFpbGFibGUgd2hlbiBjb2RpbmcgdGhlIHNyYyBhdHRyaWJ1dGUgb2YgdGhlIGx4c2x0OnNjcmlwdCBlbGVtZW50IGFzIGV4cGxhaW5lZCBpbiA8bGluayBhbmNob3I9InNldHVwLXNjcmlwdCI+U2V0IHVwIHRoZSBseHNsdDpzY3JpcHQgZWxlbWVudDwvbGluaz4uPC9ub3RlPgotPC9zMz4KLTxzMyB0aXRsZT0iVXNlIHRoZSBuYW1lc3BhY2Ugd2hlbiB5b3UgbWFrZSBleHRlbnNpb24gY2FsbHMiPgotPHA+VXNlIHRoZSBkZWNsYXJlZCBwcmVmaXggd2l0aCB0aGUgc3ludGF4IGRlc2NyaWJlZCBpbiA8bGluayBhbmNob3I9ImV4dC1mdW5jLWNhbGxzIj5FeHRlbnNpb24gZnVuY3Rpb24gSmF2YSBjYWxsczwvbGluaz4uPC9wPgotPHA+VGhhdCBpcyBhbGwuIFlvdSBkbyBub3QgaW5jbHVkZSBhbiBseHNsdDpjb21wb25lbnQgZWxlbWVudC4gVXNpbmcgdGhlIGFiYnJldmlhdGVkIHN5bnRheCBjbGVhcmx5IGludm9sdmVzIGxlc3Mgc2V0dXAgdGhhbiB1c2luZyB0aGUgbHhzbHQ6Y29tcG9uZW50L2x4c2x0OnNjcmlwdCBhcHByb2FjaC48L3A+Ci08bm90ZT5XZSByZWNvbW1lbmQgdGhhdCwgZm9yIGV4dGVuc2lvbnMgY29kZWQgaW4gSmF2YSwgdGhlIGFiYnJldmlhdGVkIHN5bnRheCBzaG91bGQgYWx3YXlzIGJlIHVzZWQgc2luY2UgdGhlIGx4c2x0OmNvbXBvbmVudC9seHNsdDpzY3JpcHQgY29uc3RydWN0cyBhZGQgbm8gZnVuY3Rpb25hbGl0eS48L25vdGU+Ci08L3MzPjxhbmNob3IgbmFtZT0iZXgtamF2YS1uYW1lc3BhY2UiLz4gCi08czMgdGl0bGU9IkV4YW1wbGU6IEZvcm1hdHRpbmcgYSBkYXRlIj4KLTxwPlRoaXMgZXhhbXBsZSB1c2VzIGV4dGVuc2lvbiBmdW5jdGlvbnMgdG8gY2FsbCB0aGUgU2ltcGxlRGF0ZUZvcm1hdCBjbGFzcyBhbmQgdGhlIEludERhdGUgY2xhc3MuIEludERhdGUgdXNlcyBTdHJpbmcgYXJndW1lbnRzIHRvIHNldCB1cCBhIERhdGUgb2JqZWN0OjwvcD4KLTxzb3VyY2U+aW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotcHVibGljIGNsYXNzIEludERhdGUKLXsKLSAgcHVibGljIHN0YXRpYyBEYXRlIGdldERhdGUoU3RyaW5nIHllYXIsIFN0cmluZyBtb250aCwgU3RyaW5nIGRheSkKLSAgICB7Ci0gICAgICAvLyBEYXRlKGludCwgaW50LCBpbnQpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHNvIHVzZSBDYWxlbmRhciB0bwotICAgICAgLy8gc2V0IHRoZSB5ZWFyLCBtb250aCwgYW5kIGRheS4KLSAgICAgIENhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgICAgLy8gQ29udmVydCBlYWNoIGFyZ3VtZW50IHRvIGludC4KLSAgICAgIGMuc2V0ICggSW50ZWdlci5wYXJzZUludCh5ZWFyKSwKLSAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChtb250aCksCi0gICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoZGF5KSApOwotICAgICAgcmV0dXJuIGMuZ2V0VGltZSgpOwotICAgIH0KLX08L3NvdXJjZT4KLTxwPlRoZSB0ZW1wbGF0ZSB0cmFuc2Zvcm1zIGRhdGUgZWxlbWVudHMgd2l0aCBmb3VyIGF0dHJpYnV0ZXMuIEZvciBleGFtcGxlLCBpdCB0cmFuc2Zvcm1zIDxjb2RlPiZsdDtkYXRlIGZvcm1hdD0iRUVFRSwgTU1NIGRkLCB5eXl5IiB5ZWFyPSIyMDAwIiBtb250aD0iNCIgZGF5PSIyNyIvJmd0OzwvY29kZT4gaW50byAmbHQ7cCZndDtEYXRlOiBUaHVyc2RheSwgQXByaWwgMjcsIDIwMDAuJmx0Oy9wJmd0Oy48L3A+Ci08cD5BcyB5b3UgcmV2aWV3IHRoaXMgc3R5bGVzaGVldCwgcGxlYXNlIGtlZXAgdGhlIGZvbGxvd2luZyBpbiBtaW5kOjwvcD4KLSA8dWw+Ci0gIDxsaT5UaGUgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXMgc3R5bGVzaGVldCBhdHRyaWJ1dGUgcHJldmVudHMgdGhlIGphdmEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGZyb20KLSAgIGFwcGVhcmluZyBpbiB0aGUgb3V0cHV0LjwvbGk+Ci0gIDxsaT5UaGUgWFNMVCB0eXBlIHJldHVybmVkIGJ5IGFueSBMb2NhdGlvblBhdGggZXhwcmVzc2lvbiBpcyBub2RlLXNldCwgc28gdGhlIFhTTFQgc3RyaW5nCi0gICAgZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0IHRoZSBmb3JtYXQsIHllYXIsIG1vbnRoLCBhbmQgZGF5IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBub2RlLXNldHMgdG8KLSAgICBzdHJpbmdzLjwvbGk+Ci0gIDxsaT5UaGUgZm9ybWF0IGF0dHJpYnV0ZSBwcm92aWRlcyBhIFN0cmluZyBhcmd1bWVudCBmb3IgY29uc3RydWN0aW5nIGEgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQKLSAgICBvYmplY3QuPC9saT4KLSAgICA8bGk+VGhlIEludERhdGUgY2xhc3MgdXNlcyBTdHJpbmcgdmFsdWVzIHByb3ZpZGVkIGJ5IHRoZSB5ZWFyLCBtb250aCwgYW5kIGRheSBhdHRyaWJ1dGVzLCB0byBzZXQgdGhlCi0gICAgZGF0ZS4gWFNMVCBjYW4gcGFzcyBudW1iZXIgdmFsdWVzLCBidXQgdGhlc2UgYXJlIGNvbnZlcnRlZCBpbnRvIGRvdWJsZXMuPC9saT4KLSAgPGxpPlRoZSBmb3JtYXR0ZXIgdmFyaWFibGUgaG9sZHMgYSBTaW1wbGVEYXRlRm9ybWF0IG9iamVjdCwgYW5kIHRoZSBkYXRlIHZhcmlhYmxlIGhvbGRzIGEgRGF0ZSBvYmplY3QuCi0gICAgWFNMVCBkb2VzIG5vdCB1bmRlcnN0YW5kIGVpdGhlciBvZiB0aGVzZSB0eXBlcywgYnV0IHRoZXkgYXJlIHVzZWQgdG8gY2FsbCB0aGUgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQKLSAgICAgbWV0aG9kLiBJbiB0aGF0IGNhbGwsICRmb3JtYXR0ZXIgaXMgdGhlIG9iamVjdCwgYW5kICRkYXRlIGlzIHRoZSBhcmd1bWVudC4gVGhlIHN5bnRheCBmb3IgY2FsbGluZwotICAgICBKYXZhIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcyBpcyBkZXNjcmliZWQgYWJvdmUgaW4gPGxpbmsgYW5jaG9yPSJleHQtZnVuYy1jYWxscyI+RXh0ZW5zaW9uIGZ1bmN0aW9uIEphdmEgY2FsbHM8L2xpbms+LjwvbGk+ICAgIAotIDwvdWw+PGFuY2hvciBuYW1lPSJmb3JtYXQtZGF0ZS1zdHlsZXNoZWV0Ii8+ICAgCi08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzbDpzdHlsZXNoZWV0IAotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiAKLSAgICB2ZXJzaW9uPSIxLjAiICAgCi0gICAgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIKLSAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0iamF2YSImZ3Q7Ci0gICAgCi0gICZsdDshLS1PdGhlciB0ZW1wbGF0ZXMgZm9yIHRyYW5zZm9ybWluZyB0aGUgcmVzdCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgWE1MIHNvdXJjZSBkb2N1bWVudHMtLSZndDsKLSAgCi0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGUiJmd0OyAKLSAgICAmbHQ7eHNsOnZhcmlhYmxlIG5hbWU9InllYXIiIHNlbGVjdD0ic3RyaW5nKC4vQHllYXIpIi8mZ3Q7Ci0gICAgJmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJtb250aCIgc2VsZWN0PSJzdHJpbmcoLi9AbW9udGgpIi8mZ3Q7IAotICAgICZsdDt4c2w6dmFyaWFibGUgbmFtZT0iZGF5IiBzZWxlY3Q9InN0cmluZyguL0BkYXkpIi8mZ3Q7ICAgICAgICAgIAotICAgICZsdDt4c2w6dmFyaWFibGUgbmFtZT0iZm9ybWF0IiBzZWxlY3Q9InN0cmluZyguL0Bmb3JtYXQpIi8mZ3Q7Ci0KLSAgICAmbHQ7eHNsOnZhcmlhYmxlIG5hbWU9ImZvcm1hdHRlciIgICAgICAgCi0gICAgICAgIHNlbGVjdD0iamF2YTpqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdC5uZXcoJGZvcm1hdCkiLyZndDsKLQotICAgICZsdDt4c2w6dmFyaWFibGUgbmFtZT0iZGF0ZSIgCi0gICAgICAgIHNlbGVjdD0iamF2YTpJbnREYXRlLmdldERhdGUoJHllYXIsICRtb250aCwgJGRheSkiLyZndDsKLQotICAgICZsdDtwJmd0O0RhdGU6ICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJqYXZhOmZvcm1hdCgkZm9ybWF0dGVyLCAkZGF0ZSkiLyZndDsmbHQ7L3AmZ3Q7Ci0gICZsdDsveHNsOnRlbXBsYXRlJmd0OwotJmx0Oy94c2w6c3R5bGVzaGVldCZndDsgIAotPC9zb3VyY2U+Ci08L3MzPgotPC9zMj4KLTxzMiB0aXRsZT0iRXhhbXBsZXM6IHVzaW5nIEphdmEgYW5kIEphdmFTY3JpcHQgdG8gaW1wbGVtZW50IHRoZSBzYW1lIGV4dGVuc2lvbiI+Ci08cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgdHdvIGV4YW1wbGVzLiBUaGUgZmlyc3QgZXhhbXBsZSB1c2VzIGEgSmF2YSBleHRlbnNpb24gdG8gdHJhbnNmb3JtIGEgc2V0IG9mIG5hbWUgZWxlbWVudHMgIGludG8gYW4gYWxwaGFiZXRpY2FsIGFuZCBudW1iZXJlZCBsaXN0LiBUaGUgc2Vjb25kIGV4YW1wbGUgdXNlcyBhIEphdmFTY3JpcHQgc2NyaXB0IHRvIGRvIHRoZSBzYW1lLiBCb3RoIGV4YW1wbGVzIGluY2x1ZGUgZXF1aXZhbGVudCBleHRlbnNpb24gZWxlbWVudHMgYW5kIGFuIGV4dGVuc2lvbiBmdW5jdGlvbi48L3A+Ci08YW5jaG9yIG5hbWU9ImV4LWphdmEiLz4gCi08czMgdGl0bGU9IkphdmEgaW1wbGVtZW50YXRpb24iPgotPHA+TXlDb3VudGVyLmphdmE8L3A+Ci08c291cmNlPkltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIE15Q291bnRlciB7Ci0gIEhhc2h0YWJsZSBjb3VudGVycyA9IG5ldyBIYXNodGFibGUgKCk7Ci0KLSAgcHVibGljIE15Q291bnRlciAoKSAKLSAge30KLQotICBwdWJsaWMgdm9pZCBpbml0Ci0gICAgICAgICAgICAgKCBvcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnMuWFNMUHJvY2Vzc29yQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuRWxlbUV4dGVuc2lvbkNhbGwgZXh0RWxlbSApIAotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBleHRFbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIFN0cmluZyB2YWx1ZSA9IGV4dEVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOwotICAgIGludCB2YWw7Ci0gICAgdHJ5IAotICAgIHsKLSAgICAgIHZhbCA9IEludGVnZXIucGFyc2VJbnQgKHZhbHVlKTsKLSAgICB9IAotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UgKCk7Ci0gICAgICB2YWwgPSAwOwotICAgIH0KLSAgICBjb3VudGVycy5wdXQgKG5hbWUsIG5ldyBJbnRlZ2VyICh2YWwpKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgcmVhZChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBJbnRlZ2VyIGN2YWwgPSAoSW50ZWdlcikgY291bnRlcnMuZ2V0IChuYW1lKTsKLSAgICByZXR1cm4gKGN2YWwgPT0gbnVsbCkgPyAwIDogY3ZhbC5pbnRWYWx1ZSAoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluY3IKLSAgICAgICAgICAgICAoIG9yZy5hcGFjaGUueGFsYW4uZXh0ZW5zaW9ucy5YU0xQcm9jZXNzb3JDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtRXh0ZW5zaW9uQ2FsbCBleHRFbGVtKSAKLSAgewotICAgIFN0cmluZyBuYW1lID0gZXh0RWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICBJbnRlZ2VyIGN2YWwgPSAoSW50ZWdlcikgY291bnRlcnMuZ2V0KG5hbWUpOwotICAgIGludCBudmFsID0gKGN2YWwgPT0gbnVsbCkgPyAwIDogKGN2YWwuaW50VmFsdWUgKCkgKyAxKTsKLSAgICBjb3VudGVycy5wdXQgKG5hbWUsIG5ldyBJbnRlZ2VyIChudmFsKSk7Ci0gIH0KLX0KLTwvc291cmNlPgotPHA+QW4gWE1MIHNvdXJjZSBkb2N1bWVudDo8L3A+Ci08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O2RvYyZndDsKLSAgJmx0O25hbWUgZmlyc3Q9IkRhdmlkIiBsYXN0PSJNYXJzdG9uIi8mZ3Q7Ci0gICZsdDtuYW1lIGZpcnN0PSJEYXZpZCIgbGFzdD0iQmVydG9uaSIvJmd0OwotICAmbHQ7bmFtZSBmaXJzdD0iRG9uYWxkIiBsYXN0PSJMZXNsaWUiLyZndDsKLSAgJmx0O25hbWUgZmlyc3Q9IkVtaWx5IiBsYXN0PSJGYXJtZXIiLyZndDsKLSAgJmx0O25hbWUgZmlyc3Q9IkphY2siIGxhc3Q9IkRvbm9odWUiLyZndDsKLSAgJmx0O25hbWUgZmlyc3Q9Ik15cmlhbSIgbGFzdD0iTWlkeSIvJmd0OwotICAmbHQ7bmFtZSBmaXJzdD0iUGF1bCIgbGFzdD0iRGljayIvJmd0OwotICAmbHQ7bmFtZSBmaXJzdD0iUm9iZXJ0IiBsYXN0PSJXZWlyIi8mZ3Q7Ci0gICZsdDtuYW1lIGZpcnN0PSJTY290dCIgbGFzdD0iQm9hZyIvJmd0OwotICAmbHQ7bmFtZSBmaXJzdD0iU2hhbmUiIGxhc3Q9IkN1cmN1cnUiLyZndDsKLSZsdDsvZG9jJmd0Ozwvc291cmNlPgotPHA+VGhlIHN0eWxlc2hlZXQ6PC9wPgotPHNvdXJjZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsgCi0mbHQ7eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgICAgICAgICAgICAgIHhtbG5zOmNvdW50ZXI9Ik15Q291bnRlciIKLSAgICAgICAgICAgICAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0iY291bnRlciIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiJmd0OwotCi0gICZsdDtseHNsdDpjb21wb25lbnQgcHJlZml4PSJjb3VudGVyIgotICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzPSJpbml0IGluY3IiIGZ1bmN0aW9ucz0icmVhZCImZ3Q7Ci0gICAgJmx0O2x4c2x0OnNjcmlwdCBsYW5nPSJqYXZhY2xhc3MiIHNyYz0ieGFsYW46Ly9NeUNvdW50ZXIiLyZndDsKLSAgJmx0Oy9seHNsdDpjb21wb25lbnQmZ3Q7Ci0KLSAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0iLyImZ3Q7Ci0gICAgJmx0O0hUTUwmZ3Q7Ci0gICAgICAmbHQ7SDEmZ3Q7TmFtZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyJmx0Oy9IMSZndDsKLSAgICAgICZsdDtjb3VudGVyOmluaXQgbmFtZT0iaW5kZXgiIHZhbHVlPSIxIi8mZ3Q7Ci0gICAgICAmbHQ7eHNsOmZvci1lYWNoIHNlbGVjdD0iZG9jL25hbWUiJmd0OwotICAgICAgICAmbHQ7eHNsOnNvcnQgc2VsZWN0PSJAbGFzdCIvJmd0OwotICAgICAgICAmbHQ7eHNsOnNvcnQgc2VsZWN0PSJAZmlyc3QiLyZndDsKLSAgICAgICAgJmx0O3AmZ3Q7Ci0gICAgICAgICZsdDt4c2w6dGV4dCZndDtbJmx0Oy94c2w6dGV4dCZndDsKLSAgICAgICAgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50ZXI6cmVhZCgnaW5kZXgnKSIvJmd0OwotICAgICAgICAmbHQ7eHNsOnRleHQmZ3Q7XS4gJmx0Oy94c2w6dGV4dCZndDsKLSAgICAgICAgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYXN0Ii8mZ3Q7Ci0gICAgICAgICZsdDt4c2w6dGV4dCZndDssICZsdDsveHNsOnRleHQmZ3Q7Ci0gICAgICAgICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmlyc3QiLyZndDsKLSAgICAgICAgJmx0Oy9wJmd0OwotICAgICAgICAmbHQ7Y291bnRlcjppbmNyIG5hbWU9ImluZGV4Ii8mZ3Q7Ci0gICAgICAmbHQ7L3hzbDpmb3ItZWFjaCZndDsKLSAgICAmbHQ7L0hUTUwmZ3Q7Ci0gICZsdDsveHNsOnRlbXBsYXRlJmd0OwotIAotJmx0Oy94c2w6c3R5bGVzaGVldCZndDsKLTwvc291cmNlPgotPHA+VHJhbnNmb3JtYXRpb24gb3V0cHV0OjwvcD4KLTxzb3VyY2U+Jmx0O0hUTUwmZ3Q7Ci0mbHQ7SDEmZ3Q7TmFtZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyJmx0Oy9IMSZndDsKLSZsdDtwJmd0O1sxXS4gQmVydG9uaSwgRGF2aWQmbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtbMl0uIEJvYWcsIFNjb3R0Jmx0Oy9wJmd0OwotJmx0O3AmZ3Q7WzNdLiBDdXJjdXJ1LCBTaGFuZSZsdDsvcCZndDsKLSZsdDtwJmd0O1s0XS4gRGljaywgUGF1bCZsdDsvcCZndDsKLSZsdDtwJmd0O1s1XS4gRG9ub2h1ZSwgSmFjayZsdDsvcCZndDsKLSZsdDtwJmd0O1s2XS4gRmFybWVyLCBFbWlseSZsdDsvcCZndDsKLSZsdDtwJmd0O1s3XS4gTGVzbGllLCBEb25hbGQmbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtbOF0uIE1hcnN0b24sIERhdmlkJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7WzldLiBNaWR5LCBNeXJpYW0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtbMTBdLiBXZWlyLCBSb2JlcnQmbHQ7L3AmZ3Q7Ci0mbHQ7L0hUTUwmZ3Q7PC9zb3VyY2U+Ci08L3MzPjxhbmNob3IgbmFtZT0iZXgtamF2YXNjcmlwdCIvPiAKLTxzMyB0aXRsZT0iSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiI+Ci08cD48L3A+Ci08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OyAKLSZsdDt4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICAgICAgICAgICAgICB4bWxuczpseHNsdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCi0gICAgICAgICAgICAgICAgeG1sbnM6Y291bnRlcj0iTXlDb3VudGVyIgotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJjb3VudGVyIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCImZ3Q7Ci0KLSAgJmx0O2x4c2x0OmNvbXBvbmVudCBwcmVmaXg9ImNvdW50ZXIiCi0gICAgICAgICAgICAgICAgICAgZWxlbWVudHM9ImluaXQgaW5jciIgZnVuY3Rpb25zPSJyZWFkIiZndDsKLSAgICAmbHQ7bHhzbHQ6c2NyaXB0IGxhbmc9ImphdmFzY3JpcHQiJmd0OwotICAgICAgdmFyIGNvdW50ZXJzID0gbmV3IEFycmF5KCk7Ci0KLSAgICAgIGZ1bmN0aW9uIGluaXQgKHhzbHByb2MsIGVsZW0pIHsKLSAgICAgICAgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlICgibmFtZSIpOwotICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KGVsZW0uZ2V0QXR0cmlidXRlICgidmFsdWUiKSk7Ci0gICAgICAgIGNvdW50ZXJzW25hbWVdID0gdmFsdWU7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotCi0gICAgICBmdW5jdGlvbiByZWFkIChuYW1lKSB7Ci0gICAgICAgIC8vIFJldHVybiBhIHN0cmluZy4KLSAgICAgICAgcmV0dXJuICIiICsgKGNvdW50ZXJzW25hbWVdKTsKLSAgICAgIH0KLQotICAgICAgZnVuY3Rpb24gaW5jciAoeHNscHJvYywgZWxlbSkKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlICgibmFtZSIpOwotICAgICAgICBjb3VudGVyc1tuYW1lXSsrOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAmbHQ7L2x4c2x0OnNjcmlwdCZndDsKLSAgJmx0Oy9seHNsdDpjb21wb25lbnQmZ3Q7Ci0KLSAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0iLyImZ3Q7Ci0gICAgJmx0O0hUTUwmZ3Q7Ci0gICAgICAmbHQ7SDEmZ3Q7TmFtZXMgaW4gYWxwaGF0ZWJpY2FsIG9yZGVyJmx0Oy9IMSZndDsKLSAgICAgICZsdDtjb3VudGVyOmluaXQgbmFtZT0iaW5kZXgiIHZhbHVlPSIxIi8mZ3Q7Ci0gICAgICAmbHQ7eHNsOmZvci1lYWNoIHNlbGVjdD0iZG9jL25hbWUiJmd0OwotICAgICAgICAmbHQ7eHNsOnNvcnQgc2VsZWN0PSJAbGFzdCIvJmd0OwotICAgICAgICAmbHQ7eHNsOnNvcnQgc2VsZWN0PSJAZmlyc3QiLyZndDsKLSAgICAgICAgJmx0O3AmZ3Q7Ci0gICAgICAgICZsdDt4c2w6dGV4dCZndDtbJmx0Oy94c2w6dGV4dCZndDsKLSAgICAgICAgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50ZXI6cmVhZCgnaW5kZXgnKSIvJmd0OwotICAgICAgICAmbHQ7eHNsOnRleHQmZ3Q7XS4gJmx0Oy94c2w6dGV4dCZndDsKLSAgICAgICAgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYXN0Ii8mZ3Q7Ci0gICAgICAgICZsdDt4c2w6dGV4dCZndDssICZsdDsveHNsOnRleHQmZ3Q7Ci0gICAgICAgICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmlyc3QiLyZndDsKLSAgICAgICAgJmx0Oy9wJmd0OwotICAgICAgICAmbHQ7Y291bnRlcjppbmNyIG5hbWU9ImluZGV4Ii8mZ3Q7Ci0gICAgICAmbHQ7L3hzbDpmb3ItZWFjaCZndDsKLSAgICAmbHQ7L0hUTUwmZ3Q7Ci0gICZsdDsveHNsOnRlbXBsYXRlJmd0OwotIAotJmx0Oy94c2w6c3R5bGVzaGVldCZndDsKLTwvc291cmNlPgotPHA+VGhpcyBzdHlsZXNoZWV0IHByb2R1Y2VzIHRoZSBzYW1lIG91dHB1dCBhcyB0aGUgcHJlY2VkaW5nIGV4YW1wbGUgd2l0aCB0aGUgSmF2YSBleHRlbnNpb24uPC9wPgotPC9zMz4KLTwvczI+Ci08L3MxPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94YWxhbi9leHRlbnNpb25zbGliLnhtbCBiL3hkb2NzL3NvdXJjZXMveGFsYW4vZXh0ZW5zaW9uc2xpYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MTVjODAuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94YWxhbi9leHRlbnNpb25zbGliLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+IAotPCFET0NUWVBFIHMxIFNZU1RFTSAiLi4vLi4vc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCI+Ci08IS0tIAotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLTxzMSB0aXRsZT0iRXh0ZW5zaW9ucyBsaWJyYXJ5Ij4KLTx1bD4KLTxsaT48bGluayBhbmNob3I9ImludHJvIj5JbnRyb2R1Y3Rpb248L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InhhbGFubnMiPlhhbGFuIG5hbWVzcGFjZTwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0icmVkaXJlY3QiPlJlZGlyZWN0PC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJub2Rlc2V0Ij5ub2Rlc2V0PC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJpbnRlcnNlY3Rpb24iPmludGVyc2VjdGlvbjwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iZGlmZmVyZW5jZSI+ZGlmZmVyZW5jZTwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iZGlzdGluY3QiPmRpc3RpbmN0PC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJoYXNzYW1lbm9kZXMiPmhhc1NhbWVOb2RlczwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0ic3FsIj5TUUwgZXh0ZW5zaW9uczwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iZXZhbHVhdGUiPmV2YWx1YXRlPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJ0b2tlbml6ZSI+dG9rZW5pemU8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9Imdyb3VwaXRlbSI+Z3JvdXAgYW5kIGl0ZW08L2xpbms+IDxyZWY+KHRvIGJlIGRvbmUpPC9yZWY+PC9saT4KLTxsaT48bGluayBhbmNob3I9InR5cGUiPnR5cGU8L2xpbms+IDxyZWY+KHRvIGJlIGRvbmUpPC9yZWY+PC9saT4KLTxsaT48bGluayBhbmNob3I9InRvZGF0ZSI+dG9EYXRlPC9saW5rPiA8cmVmPih0byBiZSBkb25lKTwvcmVmPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJmb3JtYXRkYXRlIj5mb3JtYXREYXRlPC9saW5rPiA8cmVmPih0byBiZSBkb25lKTwvcmVmPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJncmVwIj5ncmVwPC9saW5rPiA8cmVmPih0byBiZSBkb25lKTwvcmVmPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJmb3JlYWNodG9rZW4iPmZvckVhY2hUb2tlbjwvbGluaz4gPHJlZj4odG8gYmUgZG9uZSk8L3JlZj48L2xpPgotPGxpPkV4YW1wbGVzOiA8bGluayBhbmNob3I9ImV4LXJlZGlyZWN0Ij5SZWRpcmVjdDwvbGluaz4sIDxsaW5rIGFuY2hvcj0iZXgtbm9kZXNldCI+bm9kZXNldDwvbGluaz4sIDxsaW5rIGFuY2hvcj0iZXgtc3FsIj5TUUwgbGlicmFyeTwvbGluaz48L2xpPgotPC91bD48YW5jaG9yIG5hbWU9ImludHJvIi8+Ci08czIgdGl0bGU9ICJJbnRyb2R1Y3Rpb24iPgotPHA+RXh0ZW5zaW9uIGVsZW1lbnRzIGFuZCBmdW5jdGlvbnMgcHJvdmlkZSBhIHBvd2VyZnVsIG1lY2hhbmlzbQotZm9yIGV4dGVuZGluZyBhbmQgc2ltcGxpZnlpbmcgd2hhdCB5b3UgY2FuIGRvIHdpdGggYW4gWExTVCBwcm9jZXNzb3IgbGlrZQotWGFsYW4uIFdpdGggaW5wdXQgYW5kIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgWE1MIG9wZW4tc291cmNlIGRldmVsb3BlciBjb21tdW5pdHksIHdlIGFyZSB3b3JraW5nIG9uIHBsYWNpbmcgdGhlIG1vc3QgdXNlZnVsCi1leHRlbnNpb25zIGluIGFuIGV4dGVuc2lvbnMgbGlicmFyeSBkaXN0cmlidXRlZCB3aXRoICZ4c2x0NGo7LiBJZiB5b3UgaGF2ZSBpZGVhcyBhbmQvb3IgY29udHJpYnV0aW9ucyB5b3Ugd291bGQgbGlrZSB0byBtYWtlLCBwbGVhc2UgZW1haWwgdXMgYXQgdGhlIDxodW1hbi1yZXNvdXJjZS1yZWYgaWRyZWY9InhhbGFuZGV2Ii8+LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJ4YWxhbm5zIi8+Ci08czIgdGl0bGU9IlhhbGFuIG5hbWVzcGFjZSI+Ci08cD5XaGVyZSBpdCBtYWtlcyBzZW5zZSwgd2UgYXJlIHBsYWNpbmcgdGhlIG5ldyBYYWxhbiBleHRlbnNpb25zIGluIHRoZSBvcmcuYXBhY2hlLnhhbGFuLmxpYi5FeHRlbnNpb25zIGNsYXNzIGFuZCB3ZSBoYXZlIGRlZmluZWQgYSBuYW1lc3BhY2UgZm9yIHRoaXMgY2xhc3M6PC9wPgotPHA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGNvZGU+aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuPC9jb2RlPjwvcD4KLTxwPklmIHlvdSBhcmUgY2FsbGluZyAmeHNsdDRqOy1zdXBwbGllZCBleHRlbnNpb25zLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZGVmaW5lIHRoaXMgbmFtZXNwYWNlIGluIHlvdXIgc3R5bGVzaGVldCBlbGVtZW50LCBhbmQgY2FsbCB0aGUgZXh0ZW5zaW9uIHVzaW5nIHRoZSBuYW1lc3BhY2UgcHJlZml4IHRoYXQgeW91IGhhdmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZXNwYWNlLiBUaGF0IHdheSwgaWYgd2UgbGF0ZXIgcmVvcmdhbml6ZSBob3cgdGhlICZ4c2x0NGo7LXN1cHBsaWVkIGV4dGVuc2lvbnMgYXJlIHN0b3JlZCwgeW91IHdvbid0IGhhdmUgdG8gbW9kaWZ5IHlvdXIgc3R5bGVzaGVldC48L3A+Ci08cD5Gb3IgYW4gZXhhbXBsZSB0aGF0IHVzZXMgdGhpcyBuYW1lc3BhY2UsIHNlZSA8bGluayBhbmNob3I9ImV4LW5vZGVzZXQiPkV4YW1wbGUgd2l0aCB0aGUgbm9kZXNldCBleHRlbnNpb24gZnVuY3Rpb248L2xpbms+LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJyZWRpcmVjdCIvPgotPHMyIHRpdGxlPSAiUmVkaXJlY3QiPgotPHA+QSBzdGFuZGFyZCBYU0wgdHJhbnNmb3JtYXRpb24gaW52b2x2ZXMgYW4gWFNMIHN0eWxlc2hlZXQsIGFuIFhNTCBzb3VyY2UgdHJlZSwgYW5kIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQgdHJlZS4gVGhlIHRyYW5zZm9ybWF0aW9uIHNlbmRzIHRoZSBlbnRpcmUgcmVzdWx0IHRvIGEgc2luZ2xlIDxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS90cmF4L1Jlc3VsdC5odG1sIj5vcmcuYXBhY2hlLnRyYXguUmVzdWx0PC9qdW1wPiBvYmplY3QuPC9wPiAKLTxwPlRoZSBSZWRpcmVjdCBleHRlbnNpb24gCi0oPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQvZXh0ZW5zaW9ucy9SZWRpcmVjdC5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLnhzbHQuZXh0ZW5zaW9ucy5SZWRpcmVjdDwvanVtcD4pIHN1cHBsaWVzIHRocmVlIGV4dGVuc2lvbiBlbGVtZW50cyB0aGF0IHlvdSBjYW4gdXNlIHRvIHJlZGlyZWN0IHBvcnRpb25zIG9mIHlvdXIgdHJhbnNmb3JtYXRpb24gb3V0cHV0IHRvIG11bHRpcGxlIGZpbGVzOiAmbHQ7b3BlbiZndDssICZsdDt3cml0ZSZndDssIGFuZCAmbHQ7Y2xvc2UmZ3Q7LiBJZiB5b3UgdXNlIHRoZSAmbHQ7d3JpdGUmZ3Q7IGVsZW1lbnQgYWxvbmUsIHRoZSBleHRlbnNpb24gb3BlbnMgYSBmaWxlLCB3cml0ZXMgdG8gaXQsIGFuZCBjbG9zZXMgdGhlIGZpbGUgaW1tZWRpYXRlbHkuIElmIHlvdSB3YW50IGV4cGxpY2l0IGNvbnRyb2wgb3ZlciB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBvZiBmaWxlcywgdXNlICZsdDt3cml0ZSZndDsgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgJmx0O29wZW4mZ3Q7IGFuZCAmbHQ7Y2xvc2UmZ3Q7IGVsZW1lbnRzLjwvcD4KLTxwPkVhY2ggb2YgdGhlc2UgZWxlbWVudHMgaW5jbHVkZXMgYSBmaWxlIGF0dHJpYnV0ZSBhbmQvb3IgYSBzZWxlY3QgYXR0cmlidXRlIHRvIGRlc2lnbmF0ZSB0aGUgb3V0cHV0IGZpbGUuIFRoZSBmaWxlIGF0dHJpYnV0ZSB0YWtlcyBhIHN0cmluZywgc28geW91IGNhbiB1c2UgaXQgdG8gZGlyZWN0bHkgc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4gVGhlIHNlbGVjdCBhdHRyaWJ1dGUgdGFrZXMgYW4gWFBhdGggZXhwcmVzc2lvbiwgc28geW91IGNhbiB1c2UgaXQgdG8gZHluYW1pY2FsbHkgZ2VuZXJhdGUgdGhlIG91dHB1dCBmaWxlIG5hbWUuIElmIHlvdSBpbmNsdWRlIGJvdGggYXR0cmlidXRlcywgdGhlIFJlZGlyZWN0IGV4dGVuc2lvbiBmaXJzdCBldmFsdWF0ZXMgdGhlIHNlbGVjdCBhdHRyaWJ1dGUsIGFuZCBmYWxscyBiYWNrIHRvIHRoZSBmaWxlIGF0dHJpYnV0ZSBpZiB0aGUgc2VsZWN0IGF0dHJpYnV0ZSBleHByZXNzaW9uIGRvZXMgbm90IHJldHVybiBhIHZhbGlkIGZpbGUgbmFtZS48L3A+Ci08YW5jaG9yIG5hbWU9ImV4LXJlZGlyZWN0Ii8+IAotPHMzIHRpdGxlPSJFeGFtcGxlIHdpdGggdGhlIFJlZGlyZWN0IGV4dGVuc2lvbiI+Ci08cD5TdXBwb3NlIHlvdSBhcmUgb3V0cHV0dGluZyB0aGUgYnVsayBvZiB5b3VyIHJlc3VsdCB0cmVlIHRvIG9uZSBmaWxlLCBidXQgeW91IHdhbnQgdG8gb3V0cHV0IHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiBhbGwgJmx0O2ZvbyZndDsgZWxlbWVudHMgYW5kIHRoZWlyIGNoaWxkcmVuIHRvIGFub3RoZXIgZmlsZS4gVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgb2YgdGhlIFhNTCBzb3VyY2U6PC9wPgotPHNvdXJjZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsgCi0mbHQ7ZG9jJmd0OwotICAmbHQ7Zm9vIGZpbGU9ImZvby5vdXQiJmd0OwotICAgIFRlc3RpbmcgUmVkaXJlY3QgZXh0ZW5zaW9uOgotICAgICAgJmx0O2JhciZndDtBIGZvbyBzdWJlbGVtZW50IHRleHQgbm9kZSZsdDsvYmFyJmd0OwotICAmbHQ7L2ZvbyZndDsKLSAgJmx0O21haW4mZ3Q7Ci0gICAgRXZlcnl0aGluZyBlbHNlCi0gICZsdDsvbWFpbiZndDsgIAotJmx0Oy9kb2MmZ3Q7PC9zb3VyY2U+Ci08cD5UaGlzIHN0eWxlc2hlZXQgcmVkaXJlY3RzIHBhcnQgb2YgdGhlIG91dHB1dCB0byBhIHNlY29uZGFyeSBmaWxlOjwvcD4KLTxzb3VyY2U+Ci0mbHQ7eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKLSAgICB4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi54c2x0LmV4dGVuc2lvbnMuUmVkaXJlY3QiCi0gICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0IiZndDsKLQotICAmbHQ7eHNsOnRlbXBsYXRlIG1hdGNoPSIvIiZndDsKLSAgICAmbHQ7c3RhbmRhcmQtb3V0Jmd0OwotICAgICAgU3RhbmRhcmQgb3V0cHV0OgotICAgICAgJmx0O3hzbDphcHBseS10ZW1wbGF0ZXMvJmd0OwotICAgICZsdDsvc3RhbmRhcmQtb3V0Jmd0OwotICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKLSAgCi0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Im1haW4iJmd0OwotICAgICZsdDttYWluJmd0OwotICAgICAgJmx0O3hzbDphcHBseS10ZW1wbGF0ZXMvJmd0OwotICAgICZsdDsvbWFpbiZndDsKLSAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7Ci0gIAotICAmbHQ7eHNsOnRlbXBsYXRlIG1hdGNoPSIvZG9jL2ZvbyImZ3Q7Ci0gICAgJmx0O3JlZGlyZWN0OndyaXRlIHNlbGVjdD0iQGZpbGUiJmd0OwotICAgICAgJmx0O2Zvby1vdXQmZ3Q7Ci0gICAgICAgICZsdDt4c2w6YXBwbHktdGVtcGxhdGVzLyZndDsKLSAgICAgICZsdDsvZm9vLW91dCZndDsKLSAgICAmbHQ7L3JlZGlyZWN0OndyaXRlJmd0OwotICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKLSAgCi0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9ImJhciImZ3Q7Ci0gICAgJmx0O2Zvb2Jhci1vdXQmZ3Q7Ci0gICAgICAmbHQ7eHNsOmFwcGx5LXRlbXBsYXRlcy8mZ3Q7Ci0gICAgJmx0Oy9mb29iYXItb3V0Jmd0OwotICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKLSAgCi0mbHQ7L3hzbDpzdHlsZXNoZWV0Jmd0Ozwvc291cmNlPgotPHA+VGhlIHN0YW5kYXJkIG91dHB1dCBpczo8L3A+Ci08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7Ci0mbHQ7c3RhbmRhcmQtb3V0Jmd0OwotICBTdGFuZGFyZCBvdXRwdXQ6Ci0gICZsdDttYWluJmd0OwotICAgIEV2ZXJ5dGhpbmcgZWxzZS4KLSAgJmx0Oy9tYWluJmd0OwotJmx0O3N0YW5kYXJkLW91dCZndDs8L3NvdXJjZT4KLTxwPlRoZSBvdXRwdXQgcmVkaXJlY3RlZCB0byBmb28ub3V0IGlzOjwvcD4KLTxzb3VyY2U+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKLSZsdDtmb28tb3V0Jmd0OwotICAgIFRlc3RpbmcgUmVkaXJlY3QgZXh0ZW5zaW9uOgotICAgICZsdDtmb29iYXItb3V0Jmd0O2ZvbyBzdWJlbGVtZW50IHRleHQgbm9kZSZsdDsvZm9vYmFyLW91dCZndDsKLSAgJmx0Oy9mb28tb3V0Jmd0Ozwvc291cmNlPgotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIFJlZGlyZWN0IGV4dGVuc2lvbiB0byBzZW5kIG91dHB1dCB0byBtdWx0aXBsZSBmaWxlcywgZXhhbWluZSB0aGUgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0iZXh0MSI+U2ltcGxlUmVkaXJlY3Q8L2xpbms+IHNhbXBsZSBhbmQgc2VlIHRoZSA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vbGliL1JlZGlyZWN0Lmh0bWwiPlJlZGlyZWN0PC9qdW1wPiBjbGFzcyBKYXZhZG9jLjwvcD4gIAotPC9zMz48L3MyPjxhbmNob3IgbmFtZT0ibm9kZXNldCIvPgotPHMyIHRpdGxlPSAibm9kZXNldCI+Ci08cD5JbXBsZW1lbnRlZCBpbiA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vbGliL0V4dGVuc2lvbnMuaHRtbCI+b3JnLmFwYWNoZS54YWxhbi5saWIuRXh0ZW5zaW9uczwvanVtcD4sPGJyLz4KLTxjb2RlPm5vZGVzZXQgKHJlc3VsdC10cmVlLWZyYWdtZW50KTwvY29kZT4gIGNhc3RzIGEgcmVzdWx0IHRyZWUgZnJhZ21lbnQgaW50byBhIG5vZGUtc2V0LjwvcD4KLTxub3RlPldoZW4geW91IGJpbmQgYSB2YXJpYWJsZSB0byBhIHRlbXBsYXRlLCByYXRoZXIgdGhhbiB0byB0aGUgdmFsdWUgZ2VuZXJhdGVkIGJ5IGEgc2VsZWN0IGV4cHJlc3Npb24sIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGlzIHJlc3VsdCB0cmVlIGZyYWdtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjc2VjdGlvbi1SZXN1bHQtVHJlZS1GcmFnbWVudHMiPlJlc3VsdCBUcmVlIEZyYWdtZW50czwvanVtcD4uPC9ub3RlPgotPGFuY2hvciBuYW1lPSJleC1ub2Rlc2V0Ii8+Ci08czMgdGl0bGU9IkV4YW1wbGUgd2l0aCB0aGUgbm9kZXNldCBleHRlbnNpb24gZnVuY3Rpb24iPgotPHA+VGhlIGZvbGxvd2luZyBzdHlsZXNoZWV0IHVzZXMgdGhlIG5vZGVzZXQgZXh0ZW5zaW9uIGZ1bmN0aW9uIHRvIGNhc3QgYSByZXN1bHQgdHJlZSBmcmFnbWVudCBpbnRvIGEgbm9kZS1zZXQgdGhhdCBjYW4gdGhlbiBiZSBuYXZpZ2F0ZWQgaW4gc3RhbmRhcmQgWFBhdGggbWFubmVyLiBJdCB1c2VzIHRoZSBodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4gbmFtZXNwYWNlIHRvIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBub2Rlc2V0KCkgbWV0aG9kIGluIHhtbC5hcGFjaGUueGFsYW4ubGliLkV4dGVuc2lvbnMuPC9wPgotPHNvdXJjZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDt4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zOnhhbGFuPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4iCi0gICAgICAgICAgICAgICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhhbGFuIiZndDsKLSZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iJmd0OwotICAmbHQ7b3V0Jmd0OwotCSAgJmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJydGYiJmd0OwotICAgICAgJmx0O2RvY2VsZW0mZ3Q7Ci0gICAgICAgICZsdDtlbGVtMSZndDsKLSAgICAgICAgICAmbHQ7ZWxlbTFhJmd0O0VMRU1FTlQxQSZsdDsvZWxlbTFhJmd0OwotICAgICAgICAgICZsdDtlbGVtMWImZ3Q7LEVMRU1FTlQxQiZsdDsvZWxlbTFiJmd0OwotICAgICAgICAmbHQ7L2VsZW0xJmd0OwotICAgICAgICAmbHQ7ZWxlbTImZ3Q7Ci0gICAgICAgICAgJmx0O2VsZW0yYSZndDtFTEVNRU5UMkEmbHQ7L2VsZW0yYSZndDsKLSAgICAgICAgJmx0Oy9lbGVtMiZndDsKLSAgICAgICZsdDsvZG9jZWxlbSZndDsKLSAgICAmbHQ7L3hzbDp2YXJpYWJsZSZndDsgICAgIAotICAgICAgJmx0O3hzbDpmb3ItZWFjaCBzZWxlY3Q9InhhbGFuOm5vZGVzZXQoJHJ0ZikvZG9jZWxlbS8vKiImZ3Q7Ci0gICAgICAgICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKC4pIi8mZ3Q7Jmx0O3hzbDp0ZXh0Jmd0OywmbHQ7L3hzbDp0ZXh0Jmd0OwotICAgICAgJmx0Oy94c2w6Zm9yLWVhY2g+Ci0gICZsdDsvb3V0PgotJmx0Oy94c2w6dGVtcGxhdGU+IAotJmx0Oy94c2w6c3R5bGVzaGVldCZndDs8L3NvdXJjZT4KLTxwPlRoZSBvdXRwdXQgb2YgcnVubmluZyB0aGlzIHN0eWxlc2hlZXQgKHdpdGggYW55IFhNTCBpbnB1dCBzb3VyY2UpIGlzIGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgdGhlIGVsZW1lbnQgbmFtZXMgaW4gdGhlIG5vZGUtc2V0PGJyLz4KLSZuYnNwOyZuYnNwOzxjb2RlPiZsdDtvdXQmZ3Q7ZWxlbTEsZWxlbTFhLGVsZW0xYixlbGVtMixlbGVtMmEmbHQ7L291dCZndDs8L2NvZGU+PC9wPgotPG5vdGU+Rm9yIGlsbHVzdHJhdGlvbiBwdXJwb3NlcywgdGhlIHByZWNlZGluZyBzdHlsZXNoZWV0IHBheXMgbm8gYXR0ZW50aW9uIHRvIHRoZSBzdHJ1Y3R1cmUgYW5kIGNvbnRlbnQgb2YgdGhlIFhNTCBpbnB1dCBkb2N1bWVudC4gSW5zdGVhZCwgaXQgcHJvY2Vzc2VzIHRoZSB0ZW1wbGF0ZSAoaW4gdGhlIHN0eWxlc2hlZXQpIGJvdW5kIHRvIHRoZSB2YXJpYWJsZSBuYW1lZCBydGYuPC9ub3RlPgotCi08L3MzPgotPC9zMj48YW5jaG9yIG5hbWU9ImludGVyc2VjdGlvbiIvPgotPHMyIHRpdGxlPSJpbnRlcnNlY3Rpb24iPgotPHA+SW1wbGVtZW50ZWQgaW4gPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9FeHRlbnNpb25zLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ubGliLkV4dGVuc2lvbnM8L2p1bXA+LDxici8+Ci08Y29kZT5pbnRlcnNlY3Rpb24gKG5vZGUtc2V0MSwgbm9kZS1zZXQyKTwvY29kZT4gIGZ1bmN0aW9uIHJldHVybnMgYSBub2RlLXNldCB3aXRoIGFsbCBub2RlcyB0aGF0IGFyZSBpbiBuczEgYW5kIGluIG5zMiAuPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImRpZmZlcmVuY2UiLz4KLTxzMiB0aXRsZT0gImRpZmZlcmVuY2UiPgotPHA+SW1wbGVtZW50ZWQgaW4gPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9FeHRlbnNpb25zLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ubGliLkV4dGVuc2lvbnM8L2p1bXA+LDxici8+Ci08Y29kZT5kaWZmZXJlbmNlKG5vZGUtc2V0MSwgbm9kZS1zZXQyKTwvY29kZT4gcmV0dXJucyBhIG5vZGUtc2V0IHdpdGggdGhlIG5vZGVzIGluIG5vZGUtc2V0MSBhbmQgbm90IGluIG5vZGUtc2V0Mi48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0iZGlzdGluY3QiLz4KLTxzMiB0aXRsZT0gImRpc3RpbmN0Ij4KLSA8cD5JbXBsZW1lbnRlZCBpbiA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vbGliL0V4dGVuc2lvbnMuaHRtbCI+b3JnLmFwYWNoZS54YWxhbi5saWIuRXh0ZW5zaW9uczwvanVtcD4sPGJyLz4KLSBkaXN0aW5jdCAobm9kZS1zZXQpIHJldHVybnMgYSBub2RlLXNldCBjb250YWluaW5nIG5vZGVzIHdpdGggZGlzdGluY3Qgc3RyaW5nIHZhbHVlcy4gSWYgbW9yZSB0aGFuIG9uZSBub2RlIGluIHRoZSBub2RlLXNldCAKLSBjb250YWlucyB0aGUgc2FtZSB0ZXh0IG5vZGUgdmFsdWUsIGRpc3RpbmN0IG9ubHkgcmV0dXJucyB0aGUgZmlyc3Qgb2YgdGhlc2Ugbm9kZXMgdGhhdCBpdCBmaW5kcy48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0iaGFzc2FtZW5vZGVzIi8+Ci08czIgdGl0bGU9ICJoYXNTYW1lTm9kZXMiPgotPHA+SW1wbGVtZW50ZWQgaW4gPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9FeHRlbnNpb25zLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ubGliLkV4dGVuc2lvbnM8L2p1bXA+LDxici8+Ci08Y29kZT5oYXNTYW1lTm9kZXMobm9kZS1zZXQxLCBub2RlLXNldDIpPC9jb2RlPiByZXR1cm5zIHRydWUgaWYgYm90aCBub2RlLXNldDEgYW5kIG5vZGUtc2V0MiBjb250YWluIGV4YWN0bHkgdGhlIHNhbWUgc2V0IG9mIG5vZGVzLjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJzcWwiLz4KLTxzMiB0aXRsZT0gIlNRTCBsaWJyYXJ5Ij4KLTxwPjxlbT4qKkV4cGVyaW1lbnRhbCoqPC9lbT4gUHJvdmlkZXMgZXh0ZW5zaW9uIGZ1bmN0aW9ucyBmb3IgY29ubmVjdGluZyB0byBhIEpEQkMgZGF0YSBzb3VyY2UsIGV4ZWN1dGluZyBhIHF1ZXJ5LAotYW5kIHdvcmtpbmcgaW5jcmVtZW50YWxseSB0aHJvdWdoICJzdHJlYW1hYmxlIiByZXN1bHQgc2V0LjwvcD4KLTxwPjxlbT5UaGUgU1FMIGV4dGVuc2lvbiB1c2Ugb2YgYSBzaW5nbGUgcm93LXNldCBub2RlIHRvIGluY3JlbWVudGFsbHkgcmV0dXJuIGEgcXVlcnkgcmVzdWx0IHNldCBpcyBleHBlcmltZW50YWwuIEtlZXAgaW4gbWluZCB0aGF0IHlvdQotY2FuIG9ubHkgYWNjZXNzIHJvdyBlbGVtZW50cyBvbmUgYXQgYSB0aW1lIG1vdmluZyBmb3J3YXJkIHRocm91Z2ggdGhlIHJlc3VsdCBzZXQuIFRoZSB1c2Ugb2YgWFBhdGggZXhwcmVzc2lvbnMgaW4geW91ciBzdHlsZXNoZWV0LCBmb3IKLWV4YW1wbGUsIHRoYXQgYXR0ZW1wdCB0byByZXR1cm4gbm9kZXMgZnJvbSB0aGUgcmVzdWx0IHNldCBpbiBhbnkgb3RoZXIgbWFubmVyIG1heSBwcm9kdWNlIHVucHJlZGljdGFibGUgcmVzdWx0cy48L2VtPjwvcD4KLTxwPjxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9saWIvc3FsL1hDb25uZWN0aW9uLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ubGliLnNxbC5YQ29ubmVjdGlvbjwvanVtcD4gcHJvdmlkZXMgdGhyZWUgZXh0ZW5zaW9uIGZ1bmN0aW9ucyB0aGF0IHlvdSBjYW4gdXNlIGluIHlvdXIgc3R5bGVzaGVldC48L3A+Ci0gICAgPG9sPgotICAgICAgPGxpPm5ldygpIC0tIFVzZSBvbmUgb2YgdGhlIFhDb25uZWN0aW9uIGNvbnN0cnVjdG9ycyB0byBjb25uZWN0IHRvIGEgZGF0YSBzb3VyY2UsIGFuZCByZXR1cm4gYW4gWENvbm5lY3Rpb24KLSAgICAgICBvYmplY3QuPGJyLz48YnIvPjwvbGk+Ci0gICAgICA8bGk+cXVlcnkoKSAtLSBVc2UgdGhlIFhDb25uZWN0aW9uIG9iamVjdCBxdWVyeSgpIG1ldGhvZCB0byByZXR1cm4gYSAic3RyZWFtYWJsZSIgcmVzdWx0IHNldCBpbiB0aGUgZm9ybSBvZiBhIHJvdy1zZXQKLSAgICAgICBub2RlLiBXb3JrIHlvdXIgd2F5IHRocm91Z2ggdGhlIHJvdy1zZXQgb25lIHJvdyBhdCBhIHRpbWUuIFRoZSBzYW1lIHJvdyBlbGVtZW50IGlzIHVzZWQgb3ZlciBhbmQgb3ZlciBhZ2Fpbiwgc28geW91IGNhbgotICAgICAgIGJlZ2luICJ0cmFuc2Zvcm1pbmciIHRoZSByb3ctc2V0IGJlZm9yZSB0aGUgZW50aXJlIHJlc3VsdCBzZXQgaGFzIGJlZW4gcmV0dXJuZWQuPGJyLz48YnIvPjwvbGk+Ci0gICAgICA8bGk+Y2xvc2UoKSAtLSBVc2UgdGhlIFhDb25uZWN0aW9uIG9iamVjdCBjbG9zZSgpIG1ldGhvZCB0byB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24uPC9saT4gICAgICAKLSAgICA8L29sPgotICAgIDxwPlRoZSBxdWVyeSgpIGV4dGVuc2lvbiBmdW5jdGlvbiByZXR1cm5zIGEgRG9jdW1lbnQgbm9kZSB0aGF0IGNvbnRhaW5zIChhcyBuZWVkZWQpIGFuIGFycmF5IG9mIGNvbHVtbi1oZWFkZXIgZWxlbWVudHMsIAotICAgIGEgc2luZ2xlIHJvdyBlbGVtZW50IHRoYXQgaXMgdXNlZCByZXBlYXRlZGx5LCBhbmQgYW4gYXJyYXkgb2YgY29sIGVsZW1lbnRzLiBFYWNoIGNvbHVtbi1oZWFkZXIgZWxlbWVudCAob25lIHBlciBjb2x1bW4gaW4KLSAgICB0aGUgcm93LXNldCkgY29udGFpbnMgYW4gYXR0cmlidXRlIChDb2x1bW5BdHRyaWJ1dGUpIGZvciBlYWNoIG9mIHRoZSBjb2x1bW4gZGVzY3JpcHRvcnMgaW4gdGhlIFJlc3VsdFNldE1ldGFEYXRhIG9iamVjdC4gCi0gICAgRWFjaCBjb2wgZWxlbWVudCBjb250YWlucyBhIHRleHQgbm9kZSB3aXRoIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgZm9yIHRoYXQgY29sdW1uIGluIHRoZSBjdXJyZW50IHJvdy48L3A+Ci0gICAgPGFuY2hvciBuYW1lPSJleC1zcWwiLz4gCi0gICAgPHMzIHRpdGxlPSJFeGFtcGxlIHdpdGggU1FMIGxpYnJhcnkiPgotICAgIDxwPlRoaXMgZXhhbXBsZSBkaXNwbGF5cyB0aGUgcmVzdWx0IHNldCBmcm9tIGEgdGFibGUgaW4gYSBzYW1wbGUgSW5zdGFudERCIGRhdGFiYXNlLiBJdCBpcyBhbHNvCi0gICAgYXZhaWxhYmxlIGFzIGEgc2FtcGxlIGFwcGxpY2F0aW9uOyBzZWUgCi0gICAgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0iZXh0NiI+Ni1zcWxsaWItaW5zdGFudGRiPC9saW5rPi48L3A+Ci08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICAgICB4bWxuczpzcWw9Im9yZy5hcGFjaGUueGFsYW4ubGliLnNxbC5YQ29ubmVjdGlvbiIKLSAgICAgICAgICAgICAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0ic3FsIiZndDsKLSAgJmx0O3hzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIvJmd0OwotICAmbHQ7eHNsOnBhcmFtIG5hbWU9InF1ZXJ5IiBzZWxlY3Q9IidTRUxFQ1QgKiBGUk9NIGltcG9ydDEnIi8mZ3Q7Ci0gCi0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iJmd0OwotICAgICZsdDshLS0gMS4gTWFrZSB0aGUgY29ubmVjdGlvbiAtLSZndDsKLSAgICAmbHQ7eHNsOnZhcmlhYmxlIG5hbWU9InByb2R1Y3RzIgotICAgICAgICAgICAgICAgICAgc2VsZWN0PSJzcWw6bmV3KCdvcmcuZW5oeWRyYS5pbnN0YW50ZGIuamRiYy5pZGJEcml2ZXInLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnamRiYzppZGI6LlxpbnN0YW50ZGJcc2FtcGxlLnBycCcpIi8mZ3Q7Ci0gICAgJmx0O0hUTUwmZ3Q7Ci0gICAgICAmbHQ7SEVBRCZndDsKLSAgICAgICZsdDsvSEVBRCZndDsKLSAgICAgICZsdDtCT0RZJmd0OwotICAgICAgICAmbHQ7VEFCTEUgYm9yZGVyPSIxIiZndDsKLSAgICAgICAgJmx0OyEtLTIuIEV4ZWN1dGUgdGhlIHF1ZXJ5IC0tJmd0OwotICAgICAgICAmbHQ7eHNsOnZhcmlhYmxlIG5hbWU9InRhYmxlIiBzZWxlY3Q9J3NxbDpxdWVyeSgkcHJvZHVjdHMsICRxdWVyeSknLyZndDsKLSAgICAgICAgICAmbHQ7VFImZ3Q7Ci0gICAgICAgICAgJmx0OyEtLSBHZXQgY29sdW1uLWxhYmVsIGF0dHJpYnV0ZSBmcm9tIGVhY2ggY29sdW1uLWhlYWRlci0tJmd0OwotICAgICAgICAgICZsdDt4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkdGFibGUvcm93LXNldC9jb2x1bW4taGVhZGVyIiZndDsKLSAgICAgICAgICAgICZsdDtUSCZndDsmbHQ7eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbHVtbi1sYWJlbCIvJmd0OyZsdDsvVEgmZ3Q7Ci0gICAgICAgICAgJmx0Oy94c2w6Zm9yLWVhY2gmZ3Q7Ci0gICAgICAgICAgJmx0Oy9UUiZndDsKLSAgICAgICAgICAmbHQ7eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiR0YWJsZS9yb3ctc2V0L3JvdyIvJmd0OwotICAgICAgICAgICZsdDt4c2w6dGV4dCZndDsmYW1wOyMxMDsmbHQ7L3hzbDp0ZXh0Jmd0OwotICAgICAgICAmbHQ7L1RBQkxFJmd0OwotICAgICAgJmx0Oy9CT0RZJmd0OwotICAgICZsdDsvSFRNTCZndDsgCi0gICAgJmx0OyEtLSAzLiBDbG9zZSB0aGUgY29ubmVjdGlvbiAtLSZndDsKLSAgICAmbHQ7eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3FsOmNsb3NlKCRwcm9kdWN0cykiLyZndDsKLSAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7Ci0KLSAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0icm93IiZndDsKLSAgICAgICAgJmx0O1RSJmd0OwotICAgICAgICAgICZsdDt4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iY29sIi8mZ3Q7Ci0gICAgICAgICZsdDsvVFImZ3Q7Ci0gICZsdDsveHNsOnRlbXBsYXRlJmd0OwotCi0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbCImZ3Q7Ci0gICAgJmx0O1REJmd0OwotICAgICAgJmx0OyEtLSBIZXJlIGlzIHRoZSBjb2x1bW4gZGF0YSAtLT4KLSAgICAgICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz4KLSAgICAmbHQ7L1REPgotICAmbHQ7L3hzbDp0ZW1wbGF0ZT4KLQotJmx0Oy94c2w6c3R5bGVzaGVldCZndDsKLTwvc291cmNlPgotPC9zMz4KLTwvczI+PGFuY2hvciBuYW1lPSJldmFsdWF0ZSIvPgotPHMyIHRpdGxlPSAiZXZhbHVhdGUiPgotPHA+SW1wbGVtZW50ZWQgaW4gPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9FeHRlbnNpb25zLmh0bWwiPm9yZy5hcGFjaGUueGFsYW4ubGliLkV4dGVuc2lvbnM8L2p1bXA+LDxici8+Ci08Y29kZT5ldmFsdWF0ZSAoeHBhdGgtZXhwcmVzc2lvbik8L2NvZGU+IGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSB4cGF0aC1leHByZXNzaW9uIGluIHRoZSBjdXJyZW50IAotWFBhdGggZXhwcmVzc2lvbiBjb250ZXh0IChhdXRvbWF0aWNhbGx5IHBhc3NlZCBpbiBieSB0aGUgZXh0ZW5zaW9uIG1lY2hhbmlzbSkuPC9wPgotPHA+VXNlIHRoZSBldmFsdWF0aW9uIGV4dGVuc2lvbiBmdW5jdGlvbiB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBub3Qga25vd24gdW50aWwgcnVuIHRpbWUuPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9InRva2VuaXplIi8+Ci08czIgdGl0bGU9InRva2VuaXplIj4KLTxwPkltcGxlbWVudGVkIGluIDxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9saWIvRXh0ZW5zaW9ucy5odG1sIj5vcmcuYXBhY2hlLnhhbGFuLmxpYi5FeHRlbnNpb25zPC9qdW1wPiw8YnIvPgotPGNvZGU+dG9rZW5pemUgKHRva2VuaXplLXN0cmluZywgZGVsaW1pdGVycyk8L2NvZGU+PGJyLz4KLW9yPGJyLz4KLTxjb2RlPnRva2VuaXplICh0b2tlbml6ZS1zdHJpbmcpPC9jb2RlPiBmdW5jdGlvbiByZXR1cm5zIGEgbm9kZS1zZXQgY29udGFpbmluZyBvbmUgdGV4dCBub2RlIGZvciBlYWNoIHRva2VuIGluIHRoZSB0b2tlbml6ZS1zdHJpbmcuPC9wPgotPHA+VGhlIGRlbGltaXRlcnMgZGV0ZXJtaW5lIHdoaWNoIGNoYXJhY3RlcnMgYXJlIHVzZWQgdG8gZGl2aWRlIHRoZSB0b2tlbml6ZS1zdHJpbmcgaW50byBpbmRpdmlkdWFsIHRva2Vucy4gSWYgeW91IGRvIG5vdCBpbmNsdWRlCi10aGUgZGVsaW1pdGVycyBhcmd1bWVudCwgdGhlIGZ1bmN0aW9uIHVzZXMgdGFiICgmYW1wOyN4MDkpLCBsaW5lZmVlZCAoJmFtcDsjeDBBKSwgcmV0dXJuICgmYW1wOyN4MEQpLCBhbmQgc3BhY2UgKCZhbXA7I3gyMCkgYXMgZGVsaW1pdGVycy4KLUlmIHRva2VuaXplLXN0cmluZyBpcyBhbiBlbXB0eSBzdHJpbmcgb3IgY29udGFpbnMgb25seSBkZWxpbWl0ZXJzLCB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IG5vZGUtc2V0LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJncm91cGl0ZW0iLz4KLTxzMiB0aXRsZT0gImdyb3VwIGFuZCBpdGVtIj4KLTxwPjxlbT5UbyBiZSBkb25lLjwvZW0+IFByb3ZpZGVzIGVmZmljaWVudCBncm91cGluZyBvZiBpdGVtcyB3aXRoIGEgY29tbW9uIHZhbHVlLjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJ0eXBlIi8+Ci08czIgdGl0bGU9ICJ0eXBlIj4KLTxwPjxlbT5UbyBiZSBkb25lLjwvZW0+IFJldHVybnMgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBTY2hlbWEgb3IgRFREIHR5cGUuPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9InRvZGF0ZSIvPgotPHMyIHRpdGxlPSJ0by1kYXRlIj4KLTxwPjxlbT5UbyBiZSBkb25lLjwvZW0+IFRha2VzIGEgc3RyaW5nIGFzIGlucHV0LCBhbmQgcmV0dXJucyBhIGxvbmcgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBkYXRlLjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJmb3JtYXRkYXRlIi8+Ci08czIgdGl0bGU9ImZvcm1hdC1kYXRlIj4KLTxwPjxlbT5UbyBiZSBkb25lLjwvZW0+IFRha2VzIGEgZGF0ZSBzdHJpbmcsIGFuZCBmb3JtYXRzIGl0IGFjY29yZGluZyB0byBhIHNwZWNpZmljYXRpb24uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImdyZXAiLz4KLTxzMiB0aXRsZT0iZ3JlcCI+Ci08cD48ZW0+VG8gYmUgZG9uZS48L2VtPiBQZXJmb3JtcyBhIGdyZXAgZnVuY3Rpb24gYW5kIHJldHVybnMgdGhlIHN1YnN0cmluZy48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0iZm9yZWFjaHRva2VuIi8+Ci08czIgdGl0bGU9ImZvci1lYWNoLXRva2VuIj4KLTxwPjxlbT5UbyBiZSBkb25lLjwvZW0+IFRva2VuaXplcyBhIHN0cmluZywgdHJlYXRzIGVhY2ggdG9rZW4gYXMgYSBET00gVGV4dCBub2RlLCBhbmQgZXhlY3V0ZXMgdGhlCi1zdWItdGVtcGxhdGUuPC9wPgotPC9zMj4KLTwvczE+CmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hhbGFuL2ZhcS54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuL2ZhcS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NDQ4ZTMuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94YWxhbi9mYXEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4gCi08IURPQ1RZUEUgZmFxcyBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9mYXFzLmR0ZCI+Ci0KLTxmYXFzIHRpdGxlPSJGcmVxdWVudGx5IGFza2VkIHF1ZXN0aW9ucyI+Ci0KLSAgPGZhcSB0aXRsZT0iV2hlcmUgZG8gSSBnbyB0byBsZWFybiBhYm91dCBYU0xUIj4gIAotICAgIDxxPldoZXJlIGRvIEkgZ28gdG8gbGVhcm4gYWJvdXQgWFNMVD88L3E+ICAgIAotICAgIDxhPjxwPlRoZSBkZWZpbml0aXZlIHNvdXJjZXMgYXJlIHRoZSBXM0MgWFNMVCBhbmQgWFBhdGggcmVjb21tZW5kYXRpb25zOiA8cmVzb3VyY2UtcmVmIGlkcmVmPSJ4c2x0Ii8+IGFuZCAKLSAgICA8cmVzb3VyY2UtcmVmIGlkcmVmPSJ4cGF0aCIvPi48L3A+Ci0gICAgPHA+Rm9yIGEgYnJpZWYgbGlzdGluZyBvZiB0dXRvcmlhbHMsIGRpc2N1c3Npb24gZm9ydW1zLCBhbmQgb3RoZXIgbWF0ZXJpYWxzLCBzZWUgPGxpbmsgaWRyZWY9Im92ZXJ2aWV3IgotICAgICBhbmNob3I9InVwdG9zcGVlZCI+R2V0dGluZyB1cCB0byBzcGVlZCB3aXRoIFhTTFQ8L2xpbms+LjwvcD48L2E+Ci0gIDwvZmFxPgotCi0gIDxmYXEgdGl0bGU9IldoaWNoIHZlcnNpb24gb2YgWGVyY2VzIHNob3VsZCBJIGJlIHVzaW5nPyI+ICAKLSAgICA8cT5XaGljaCB2ZXJzaW9uIG9mIFhlcmNlcyBzaG91bGQgSSBiZSB1c2luZz88L3E+ICAgIAotICAgIDxhPjxwPiZ4c2x0NGotY3VycmVudDsgaGFzIGJlZW4gdGVzdGVkIHdpdGggJnhtbDRqLXVzZWQ7LiBTZWUgPGxpbmsgaWRyZWY9InJlYWRtZSIgYW5jaG9yPSJzdGF0dXMiPlN0YXR1czwvbGluaz4uPC9wPjwvYT4KLSAgPC9mYXE+Ci0gIAotICA8ZmFxIHRpdGxlPSJDb21wYXRpYmlsaXR5IHdpdGggJnhzbHQ0ajsgdmVyc2lvbiAxIj4KLSAgIDxxPkhvdyBkbyBJIHJ1biBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhlICZ4c2x0NGo7IHZlcnNpb24gMSBBUEkgd2l0aCAmeHNsdDRqMjs8L3E+Ci0gICA8YT48cD5Vc2UgdGhlIFhhbGFuLUphdmEgMSBjb21wYXRpYmlsaXR5IEpBUiB0byByZWNvbXBpbGUgYW5kIHJ1biB5b3VyICZ4c2x0NGo7IDEgYXBwbGljYXRpb25zIHdpdGggJnhzbHQ0ajI7LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIAotICAgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0iY29tcGF0Ij5Vc2luZyB0aGUgJnhzbHQ0ajsgdmVyc2lvbiAxIEFQSTwvbGluaz4uPC9wPjwvYT4KLSAgPC9mYXE+Ci0gICAgCi0gIDxmYXEgdGl0bGU9IlRyQVggYW5kIEpBWFAiPgotICAgIDxxPldoYXQgYXJlIFRyQVggYW5kIEpBWFAsIGFuZCBhcmUgdGhleSByZWxhdGVkPzwvcT4KLSAgICA8YT48cD5UckFYIGlzIHRoZSBUcmFuc2Zvcm1hdGlvbiBBUEkgZm9yIFhNTC4gSW4gTm92ZW1iZXIgMjAwMCwgVHJBWCB3YXMgcmV2aXNlZCBhbmQgaW5jb3Jwb3JhdGVkIGludG8gSkFYUCwgdGhlIEpBVkEgQVBJIGZvciBYTUwKLSAgICBQcm9jZXNzaW5nLiBKQVhQIChpbmNsdWRpbmcgVHJBWCkgcHJvdmlkZXMgdXNlcnMgYSBzdGFuZGFyZCwgdmVuZG9yLW5ldXRyYWwgQVBJIGZvciB3b3JraW5nIHdpdGggKGFuZCB0cmFuc2Zvcm1pbmcpIFhNTCBkb2N1bWVudHMuIAotICAgIFlvdSBjYW4gdXNlIHRoaXMgQVBJIHRvIGJ1aWxkIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBub3QgYm91bmQgdG8gdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBhIGdpdmVuIFhNTCBwYXJzZXIgb3IgWFNMCi0gICAgdHJhbnNmb3JtZXIuPC9wPgotICAgIDxwPiZ4c2x0NGo7IGluY2x1ZGVzIHRoZSBKQVhQIHBhY2thZ2VzLCBpbXBsZW1lbnRzIHRoZSBUckFYIHBvcnRpb24gb2YgdGhhdCBBUEkgKGphdmF4LnhtbC50cmFuc2Zvcm0uLi4uKSwgYW5kIGluY2x1ZGVzIHhlcmNlcy5qYXIgZnJvbQotICAgICZ4bWw0ajssIHdoaWNoIGltcGxlbWVudHMgdGhlIHBhcnNlciBwb3J0aW9uIG9mIHRoZSBBUEkgKGphdmF4LnhtbC5wYXJzZXIuLi4uKS48L3A+Ci08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxyZXNvdXJjZS1yZWYgaWRyZWY9InRyYXgiLz4gYW5kIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImpheHAxMSIvPi48L3A+PC9hPgotICA8L2ZhcT4KLSAgPGZhcSB0aXRsZT0iQ2hhaW5pbmcgdHJhbnNmb3JtYXRpb25zIj4gIAotICAgIDxxPkhvdyBkbyB5b3UgY2hhaW4gdG9nZXRoZXIgYSBzZXJpZXMgb2YgdHJhbnNmb3JtYXRpb25zPyI8L3E+Ci0gICAgCi0gICAgPGE+PHA+JnhzbHQ0ajsgc3VwcG9ydHMgdHdvIHN0cmF0ZWdpZXMgZm9yIGNoYWluaW5nIHRvZ2V0aGVyIGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9ucyBzdWNoIHRoYXQgdGhlIG91dHB1dCBvZiBlYWNoIAotICAgIHRyYW5zZm9ybWF0aW9uIHByb3ZpZGVzIGlucHV0IGZvciB0aGUgbmV4dCB0cmFuc2Zvcm1hdGlvbi48L3A+Ci0gICAgPHVsPgotICAgICAgPGxpPkZvciBlYWNoIHRyYW5zZm9ybWF0aW9uIGluIHRoZSBzZXJpZXMsIHlvdSBjYW4gc2V0IG9uZSBTQVggQ29udGVudEhhbmRsZXIgdG8gcHJvY2VzcyB0aGUgaW5wdXQsIGFuZCBhbm90aGVyIENvbnRlbkhhbmRsZXIgdG8gcHJvY2VzcwotICAgICAgIHRoZSBvdXRwdXQuPGJyLz48YnIvPjwvbGk+Ci0gICAgICA8bGk+WW91IGNhbiBhbHNvIHNldCB1cCBhIHNlcmllcyBvZiBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGFuIFhNTFJlYWRlciBhbmQgb25lIG9yIG1vcmUgWE1MRmlsdGVycy48L2xpPiAKLSAgICA8L3VsPgotICAgIDxwPkZvciB0aGUgZGV0YWlscyBhbmQgbGlua3MgdG8gZXhhbXBsZXMsIHNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJvdXRhc2luIj5Vc2luZyB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQgYXMgaW5wdXQgZm9yIAotICAgIGFub3RoZXIgdHJhbnNmb3JtYXRpb248L2xpbms+LjwvcD48L2E+Ci0gIDwvZmFxPgotICAKLSAgPGZhcSB0aXRsZT0iSXNzdWVzIHJ1bm5pbmcgWGFsYW4gb24gSkRLIDEuMyI+Ci0gIDxxPkknbSBoYXZpbmcgYSBwcm9ibGVtIGJ1aWxkaW5nIG9yIHJ1bm5pbmcgJnhzbHQ0ajsgb24gdGhlIEpESyAxLjMuPC9xPgotICA8YT48cD5UaGUgSkRLIDEuMyBhdXRvbWF0aWNhbGx5IHBsYWNlcyBldmVyeXRoaW5nIGluIHRoZSBsaWIvZXh0IGRpcmVjdG9yeSBpbiBmcm9udCBvZiBldmVyeXRoaW5nIHlvdSBwbGFjZSBvbiB0aGUgY2xhc3NwYXRoLiBJZiB0aGlzIGRpcmVjdG9yeSBjb250YWlucyBhIHZlcnNpb24gb2YgRE9NLCBKQVhQLCBvciBYZXJjZXMgdGhhdCBwcmVkYXRlcyB0aGUgJnhzbHQ0ajsgZGlzdHJpYnV0aW9uIHlvdSBhcmUgdXNpbmcsIHlvdSBtYXkgaGF2ZSBwcm9ibGVtcyE8L3A+IAotPHA+VGhlIElCTSBKREsgMS4zIGluY2x1ZGVzIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB4ZXJjZXMuamFyIGluIHRoZSBsaWIvZXh0IGRpcmVjdG9yeSwgYSB2ZXJzaW9uIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBKQVhQIDEuMSBpbnRlcmZhY2VzIGFuZCB0aGVyZWZvcmUgZG9lcyBub3Qgd29yayB3aXRoIHRoZSBjdXJyZW50IFhhbGFuIHJlbGVhc2UuIEFjY29yZGluZ2x5LCB5b3UgbXVzdCBlaXRoZXIgcHVyZ2UgdGhlIHhlcmNlcy5qYXIgdGhhdCBpcyBpbiB0aGF0IGRpcmVjdG9yeSBvciBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgeGVyY2VzLmphciB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhlIFhhbGFuIGRpc3RyaWJ1dGlvbi48L3A+Ci08cD5UaGUgU1VOIEpESyAxLjMgaW5jbHVkZXMgYSBwcmUtMS4xIHZlcnNpb24gb2YgdGhlIEpBWFAgaW4gY3JpbXNvbi5qYXIuIEVpdGhlciBwdXJnZSB0aGUgY3JpbXNvbi5qYXIgaW4gdGhhdCBkaXJlY3Rvcnkgb3Igb3ZlcndyaXRlIGl0IHdpdGggYSBuZXdlciBjcmltc29uLmphciB0aGF0IGluY2x1ZGVzIGFuZCBpbXBsZW1lbnRzIHRoZSBKQVhQIDEuMSBpbnRlcmZhY2VzLjwvcD48L2E+ICAKLSAgPC9mYXE+Ci0gIDxmYXEgdGl0bGU9ImEgJnF1b3Q7RE9NMDA2IEhpZXJhcmNoeSByZXF1ZXN0IGVycm9yJnF1b3Q7Ij4KLSAgPHE+V2h5IGRvIEkgZ2V0IGEgIkRPTTAwNiBIaWVyYXJjaHkgcmVxdWVzdCBlcnJvciIgd2hlbiBJIHRyeSB0byB0cmFuc2Zvcm0gaW50byBhIERPTSBEb2N1bWVudCBub2RlPzwvcT4KLSAgPGE+Ci0gIDxwPlRoaXMgZXJyb3Igb2NjdXJzIHdoZW4gWGFsYW4gdHJpZXMgdG8gYWRkIGEgTm9kZSB0byBhIERvY3VtZW50IG5vZGUgd2hlcmUgaXQgaXNuJ3QgYWxsb3dlZC4gRm9yIGV4YW1wbGUsIGF0dGVtcHRpbmcgdG8gYWRkIG5vbi13aGl0ZXNwYWNlCi0gIHRleHQgdG8gdGhlIERPTSBEb2N1bWVudCBub2RlIHByb2R1Y2VzIHRoaXMgZXJyb3IuPC9wPgotICAgPHA+VGhlIGVycm9yIGNhbiBhbHNvIG9jY3VyIHdoZW4gYSBEb2N1bWVudCBub2RlIGlzIGNyZWF0ZWQgd2l0aCB0aGUgRE9NSW1wbGVtZW50YXRpb24gY3JlYXRlRG9jdW1lbnQoKSBtZXRob2QsIHdoaWNoIHRha2VzIGEgcXVhbGlmaWVkIG5hbWUKLSAgICBhcyBhbiBhcmd1bWVudCBhbmQgY3JlYXRlcyBhbiBlbGVtZW50IG5vZGUuICBJZiB5b3UgdGhlbiBwYXNzIHRoZSByZXR1cm5lZCBEb2N1bWVudCBub2RlIHRvIFhhbGFuLCB5b3UgZ2V0IGEgIkRPTTAwNiBIaWVyYXJjaHkgcmVxdWVzdAotICAgIGVycm9yIiB3aGVuIFhhbGFuIHRyaWVzIHRvIGFkZCBhIHNlY29uZCBlbGVtZW50IHRvIHRoZSBEb2N1bWVudCBub2RlLiBUaGUgc29sdXRpb24gaXMgdG8gZWl0aGVyIHVzZSB0aGUgRG9jdW1lbnRCdWlsZGVyIG5ld0RvY3VtZW50KCkgbWV0aG9kCi0gICAgdG8gY3JlYXRlIGEgRG9jdW1lbnQgdGhhdCBkb2VzIG5vdCBjb250YWluIGFuIGVsZW1lbnQgbm9kZSwgb3IgdXNlIGEgRG9jdW1lbnRGcmFnbWVudC4gSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIAotICAgIERvY3VtZW50QnVpbGRlciBuZXdEb2N1bWVudCgpIG1ldGhvZCBpcyAiTm9uLXByZWZlcnJlZCIgYWNjb3JkaW5nIHRvIHRoZSBKQVhQIDEuMSBkb2N1bWVudGF0aW9uLjwvcD4KLSAgPC9hPgotICA8L2ZhcT4KLSAgCi0gIDxmYXEgdGl0bGU9IlNwZWVkaW5nIHVwIHRyYW5zZm9ybWF0aW9ucyI+Ci0gIAotICAgIDxxPldoYXQgY2FuIEkgZG8gdG8gc3BlZWQgdXAgdHJhbnNmb3JtYXRpb25zPzwvcT4KLSAgICAKLSAgICA8YT48cD5JbiB0aGUgb25nb2luZyBkZXZlbG9wbWVudCBvZiAmeHNsdDRqOywgZW5oYW5jaW5nIHBlcmZvcm1hbmNlIGlzIHRoZSBwcmltYXJ5IGdvYWwgb2YgdGhlICZ4c2x0NGo7IHRlYW0uCi0gICAgSGVyZSBhcmUgc29tZSBwcmVsaW1pbmFyeSBzdWdnZXN0aW9ucyBmb3IgeW91IHRvIGtlZXAgaW4gbWluZCBhcyB5b3Ugc2V0IHVwIHlvdXIgYXBwbGljYXRpb25zOjwvcD48dWw+Ci0gICAgPGxpPlVzZSBhIFRlbXBsYXRlcyBvYmplY3QgKHdpdGggYSBkaWZmZXJlbnQgVHJhbnNmb3JtZXJzIGZvciBlYWNoIHRyYW5zZm9ybWF0aW9uKSB0byBwZXJmb3JtIG11bHRpcGxlIHRyYW5zZm9ybWF0aW9ucyB3aXRoIHRoZSBzYW1lIAotICAgIHNldCBvZiBzdHlsZXNoZWV0IGluc3RydWN0aW9ucyAoc2VlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9Im11bHRpdGhyZWFkaW5nIj5NdWx0aXRocmVhZGluZzwvbGluaz4pLjxici8+PGJyLz48L2xpPiAgICAgICAgIAotICAgIDxsaT5TZXQgdXAgeW91ciBzdHlsZXNoZWV0cyB0byBmdW5jdGlvbiBlZmZpY2llbnRseS48YnIvPjxici8+PC9saT4KLSAgICAgICA8dWw+Ci0gICAgICAgICA8bGk+RG9uJ3QgdXNlICIvLyIgKGRlc2NlbmRhbnQgYXhlcykgcGF0dGVybnMgbmVhciB0aGUgcm9vdCBvZiBhIGxhcmdlIGRvY3VtZW50Ljxici8+PGJyLz48L2xpPgotICAgICAgICAgPGxpPlVzZSB4c2w6a2V5IGVsZW1lbnRzIGFuZCB0aGUga2V5KCkgZnVuY3Rpb24gYXMgYW4gZWZmaWNpZW50IHdheSB0byByZXRyaWV2ZSBub2RlIHNldHMuPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgICA8bGk+V2hlcmUgcG9zc2libGUsIHVzZSBwYXR0ZXJuIG1hdGNoaW5nIHJhdGhlciB0aGFuIHhzbDppZiBvciB4c2w6d2hlbiBzdGF0ZW1lbnRzLjxici8+PGJyLz48L2xpPgotICAgICAgICAgPGxpPnhzbDpmb3ItZWFjaCBpcyBmYXN0IGJlY2F1c2UgaXQgZG9lcyBub3QgcmVxdWlyZSBwYXR0ZXJuIG1hdGNoaW5nLjxici8+PGJyLz48L2xpPgotICAgICAgICAgPGxpPktlZXAgaW4gbWluZCB0aGF0IHhzbDpzb3J0IHByZXZlbnRzIGluY3JlbWVudGFsIHByb2Nlc3NpbmcuPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgICA8bGk+V2hlbiB5b3UgY3JlYXRlIHZhcmlhYmxlcywgJmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJmb29FbGVtIiBzZWxlY3Q9ImZvbyIvJmd0OyBpcyB1c3VhbGx5IGZhc3RlciB0aGFuCi0gICAgICAgICAmZ3Q7eHNsOnZhcmlhYmxlIG5hbWU9ImZvb0VsZW0iJmd0OyZsdDt4c2w6dmFsdWUtb2Ytc2VsZWN0PSJmb28iLyZndDsmbHQ7L3hzbDp2YXJpYWJsZSZndDsuPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgICA8bGk+QmUgY2FyZWZ1bCB1c2luZyB0aGUgbGFzdCgpIGZ1bmN0aW9uLjxici8+PGJyLz48L2xpPgotICAgICAgICAgPGxpPlRoZSB1c2Ugb2YgaW5kZXggcHJlZGljYXRlcyB3aXRoaW4gbWF0Y2ggcGF0dGVybnMgY2FuIGJlIGV4cGVuc2l2ZS48YnIvPjxici8+PC9saT4KLSAgICAgICAgIDxsaT5EZWNvZGluZyBhbmQgZW5jb2RpbmcgaXMgZXhwZW5zaXZlLjxici8+PGJyLz48L2xpPgotICAgICAgIDwvdWw+Ci0gICAgIDxsaT5Gb3IgdGhlIHVsdGltYXRlIGluIHNlcnZlci1zaWRlIHNjYWxhYmlsaXR5LCBwZXJmb3JtIHRyYW5zZm9ybSBvcGVyYXRpb25zIG9uIHRoZSBjbGllbnQuIEZvciBleGFtcGxlcywgc2VlIAotICAgICA8bGluayBpZHJlZj0ic2FtcGxlcyIgYW5jaG9yPSJhcHBsZXR4bWx0b2h0bWwiPmFwcGxldFhNTHRvSFRNTDwvbGluaz4gYW5kIDxsaW5rIGlkcmVmPSJzYW1wbGVzIgotICAgICBhbmNob3I9ImdldC10b2RvLWxpc3QiPmdldC10b2RvLWxpc3Q8L2xpbms+LjwvbGk+Ci0gICAgPC91bD48L2E+Ci0gIDwvZmFxPgotCi0gIDxmYXEgdGl0bGU9Ik5vQ2xhc3NEZWZGb3VuZCBlcnJvcnMiPgotICAKLSAgICA8cT5JJ20gZ2V0dGluZyBhIE5vQ2xhc3NEZWZGb3VuZCBlcnJvci4gV2hhdCBoYXMgdG8gYmUgb24gdGhlIGNsYXNzcGF0aD88L3E+Ci0gICAgCi0gICAgPGE+PG9sPgotICAgIDxsaT54YWxhbi5qYXIgYW5kIHhlcmNlcy5qYXIgKG9yIHRoZSBYTUwgcGFyc2VyIHlvdSBhcmUgdXNpbmcpIG11c3QgYWx3YXlzIGJlIG9uIHRoZSBjbGFzc3BhdGguPGJyLz48YnIvPjwvbGk+Ci0gICAgPGxpPlRvIHJ1biB0aGUgc2FtcGxlcyBpbiB0aGUgc2FtcGxlcyBzdWJkaXJlY3RvcmllcywgeGFsYW5zYW1wbGVzLmphciBtdXN0IGJlIG9uIHRoZSBjbGFzc3BhdGguIFRvIHJ1biB0aGUgc2VydmxldCAoaW4KLSAgICBzYW1wbGVzL3NlcnZsZXQpLCB4YWxhbnNlcnZsZXQuamFyIG11c3QgYmUgb24gdGhlIGNsYXNzcGF0aCBhbG9uZyB3aXRoIHRoZSBqYXZheC5zZXJ2bGV0IGFuZCBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZXMuIFN1biBkaXN0cmlidXRlcwotICAgIHRoZSBqYXZheC5zZXJ2bGV0IHBhY2thZ2VzIGluIHRoZSBKU1dESyBzZXJ2bGV0LmphciBmaWxlLjxici8+PGJyLz48L2xpPgotICAgIDxsaT5UbyBydW4gZXh0ZW5zaW9ucyAoaW5jbHVkaW5nIHRoZSBzYW1wbGVzIGluIHNhbXBsZXMvZXh0ZW5zaW9ucyksIGJzZi5qYXIsIGFuZCBic2ZlbmdpbmVzLmphciBtdXN0IGJlIG9uIHRoZSAKLSAgICBjbGFzc3BhdGguIFRvIHJ1biBleHRlbnNpb25zIGltcGxlbWVudGVkIGluIEphdmFTY3JpcHQsIGpzLmphciBtdXN0IGFsc28gYmUgb24gdGhlIGNsYXNzcGF0aC4gRm9yIGluZm9ybWF0aW9uIG9uIHdoYXQgCi0gICAgeW91IG5lZWQgdG8gcnVuIGV4dGVuc2lvbnMgaW1wbGVtZW50ZWQgaW4gb3RoZXIgc2NyaXB0aW5nIGxhbmd1YWdlcywgc2VlIDxsaW5rIGlkcmVmPSJleHRlbnNpb25zIgotICAgIGFuY2hvcj0ic3VwcG9ydGVkLWxhbmciPlN1cHBvcnRlZCBsYW5ndWFnZXM8L2xpbms+Ljxici8+PGJyLz48L2xpPgotICAgIDxsaT5UbyBydW4gYXBwbGljYXRpb25zIHRoYXQgdXNlIHRoZSAmeHNsdDRqOyB2ZXJzaW9uIDEgQVBJLCB5b3UgbXVzdCBwdXQgeGFsYW5qMWNvbXBhdC5qYXIgb24gdGhlIGNsYXNzcGF0aCwgcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbiwKLSAgICBhbmQgYmUgc3VyZSB4YWxhbmoxY29tcGF0LmphciBpcyBvbiB0aGUgY2xhc3NwYXRoIGF0IHJ1biB0aW1lIChzZWUgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0iY29tcGF0Ij5Vc2luZyB0aGUgJnhzbHQ0ajsgdmVyc2lvbiAxCi0gICAgQVBJKTwvbGluaz4uPC9saT4KLSAgICA8L29sPgotICAgIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGxpbmsgaWRyZWY9ImdldHN0YXJ0ZWQiIGFuY2hvcj0iY2xhc3NwYXRoIj5TZXR0aW5nIHVwIHRoZSBzeXN0ZW0gY2xhc3NwYXRoPC9saW5rPi48L3A+PC9hPgotICAgPC9mYXE+Ci0gCi0JPGZhcSB0aXRsZT0iU3R5bGVzaGVldCB2YWxpZGF0aW9uIj4KLQkJPHE+SG93IGRvIEkgdmFsaWRhdGUgYW4gWFNMIHN0eWxlc2hlZXQ/PC9xPgotCQk8YT4KLSAgICAgIDxwPkFuIFhTTCBzdHlsZXNoZWV0IGlzIGFuIFhNTCBkb2N1bWVudCwgc28gaXQgY2FuIGhhdmUgYSBET0NUWVBFIGFuZCBiZSBzdWJqZWN0IHRvIHZhbGlkYXRpb24sIHJpZ2h0PyA8L3A+Ci0gICAgICA8cD5UaGUgWFNMVCBSZWNvbW1lbmRhdGlvbiBpbmNsdWRlcyBhIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjZHRkIj5EVEQgRnJhZ21lbnQgCi0gICAgICBmb3IgWFNMIFN0eWxlc2hlZXRzPC9qdW1wPiB3aXRoIHNvbWUgaW5kaWNhdGlvbnMgb2Ygd2hhdCB5b3UgbmVlZCB0byBkbyB0byBjcmVhdGUgYSBjb21wbGV0ZSBEVEQgZm9yIGEgZ2l2ZW4KLSAgICAgIHN0eWxlc2hlZXQuIEtlZXAgaW4gbWluZCB0aGF0IHN0eWxlc2hlZXRzIGNhbiBpbmNsdWRlIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzIGFuZCBwcm9kdWNlIG91dHB1dCB0aGF0IGlzIG5vdCB2YWxpZAotICAgICAgWE1MLjwvcD4KLSAgICAgIDxwPllvdSBjYW4gdXNlIHRoZSB4c2w6c3R5bGVzaGVldCBkb2N0eXBlIGRlZmluZWQgaW4geHNsLWh0bWw0MHMuZHRkIGZvciBzdHlsZXNoZWV0cyB0aGF0IGdlbmVyYXRlIEhUTUwuPC9wPgotCQk8L2E+Ci0JPC9mYXE+Ci0gICAgCi0gICAgPGZhcSB0aXRsZT0iUmV0cmlldmluZyBub2RlcyBpbiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UiPgotICAgICA8cT5YUGF0aCBpc24ndCByZXRyaWV2aW5nIG5vZGVzIHRoYXQgYXJlIGluIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBJIGRlZmluZWQuIEhvdyBkbyBJIGdldCB0aGVtPzwvcT4KLSAgICAgPGE+PHA+SWYgeW91IGFyZSBsb29raW5nIGZvciBub2RlcyBpbiBhIG5hbWVzcGFjZSwgdGhlIFhQYXRoIGV4cHJlc3Npb24gbXVzdCBpbmNsdWRlIGEgbmFtZXNwYWNlIHByZWZpeCB0aGF0IHlvdSBoYXZlIG1hcHBlZCB0byB0aGUKLSAgICAgICBuYW1lc3BhY2Ugd2l0aCBhbiB4bWxucyBkZWNsYXJhdGlvbi4gSWYgeW91IGhhdmUgZGVjbGFyZWQgYSBkZWZhdWx0IG5hbWVzcGFjZSwgaXQgZG9lcyBub3QgaGF2ZSBhIHByZWZpeCAoc2VlIAotICAgICAgIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoLmh0bWwjbm9kZS10ZXN0cyI+WFBhdGggTm9kZSBUZXN0czwvanVtcD4pLiBJbiBvcmRlciB0byBjb25zdHJ1Y3QgWFBhdGggZXhwcmVzc2lvbnMgCi0gICAgICAgdG8gcmV0cmlldmUgbm9kZXMgZnJvbSB0aGlzIG5hbWVzcGFjZSwgeW91IG11c3QgYWRkIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRoYXQgcHJvdmlkZXMgYSBwcmVmaXggeW91IGNhbiBpbmNsdWRlIGluIHRoZSBYUGF0aAotICAgICAgICBleHByZXNzaW9ucy48L3A+Ci0gICAgICAgPHA+U3VwcG9zZSwgZm9yIGV4YW1wbGUsIHlvdSB5b3Ugd2FudCB0byBsb2NhdGUgbm9kZXMgaW4gYSBkZWZhdWx0IG5hbWVzcGFjZSBkZWNsYXJlZCBhcyBmb2xsb3dzOjxici8+Ci0gICAgICAgPGNvZGU+eG1sbnM9Imh0dHA6Ly9teS1uYW1lc3BhY2UiPC9jb2RlPjwvcD4KLSAgICAgICA8cD5BZGQgYSBuYW1wZXNwYWNlIGRlY2xhcmF0aW9uIHdpdGggYSBwcmVmaXg6PGJyLz4KLSAgICAgICA8Y29kZT54bWxuczpmb289Imh0dHA6Ly9teS1uYW1lc3BhY2UiPC9jb2RlPjwvcD4gICAgICAgCi0gICAgICAgPHA+VGhlbiB5b3UgY2FuIHVzZSBmb286IGluIHlvdXIgWFBhdGggZXhwcmVzc2lvbi48L3A+Ci0gICAgICAgPHA+SGludDogRG9uJ3QgdXNlIGRlZmF1bHQgbmFtZXNwYWNlcywgYW5kIHRoZSBwcm9ibGVtIGRvZXNuJ3QgYXJpc2UuPC9wPjwvYT4KLSAgICA8L2ZhcT4gICAKLTwvZmFxcz4KZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vZ2V0c3RhcnRlZC54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuL2dldHN0YXJ0ZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODFhMmFkLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vZ2V0c3RhcnRlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+ICAKLTwhRE9DVFlQRSBzMSBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9kb2N1bWVudC5kdGQiPgotCi08czEgdGl0bGU9IkdldHRpbmcgU3RhcnRlZCI+Ci08dWw+Ci08bGk+PGxpbmsgYW5jaG9yPSJkb3dubG9hZCI+RG93bmxvYWRpbmcgd2hhdCB5b3UgbmVlZDwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iY2xhc3NwYXRoIj5TZXR0aW5nIHVwIHRoZSBzeXN0ZW0gY2xhc3NwYXRoPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJzYW1wbGVzIj5Ucnlpbmcgb3V0IHRoZSBzYW1wbGVzPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJjb21tYW5kbGluZSI+UGVyZm9ybWluZyB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJqYXZhLWFwcHMiPlNldHRpbmcgdXAgeW91ciBvd24gWFNMVCBhcHBsaWNhdGlvbnM8L2xpbms+PC9saT4KLTwvdWw+Ci08YW5jaG9yIG5hbWU9ImRvd25sb2FkIi8+Ci08czIgdGl0bGU9IkRvd25sb2FkaW5nIHdoYXQgeW91IG5lZWQiPgotPHA+VG8gdXNlIFhhbGFuLCB5b3UgbmVlZCB0aGUgZm9sbG93aW5nOjwvcD4KLTx1bD4KLTxsaT5UaGUgSkRLIG9yIEpSRSAxLjEuOCwgMS4yLjIsIG9yIDEuMzwvbGk+Ci08bGk+eGFsYW4uamFyPC9saT4KLTxsaT54ZXJjZXMuamFyIChvciBhbm90aGVyIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9InBsdWciPlhNTCBQYXJzZXI8L2xpbms+KTwvbGk+Ci08L3VsPgotPHA+WW91IGNhbiBnZXQgdGhlIEpESyBvciBKUkUgZnJvbSA8anVtcCBocmVmPSJodHRwOi8vd3d3LmlibS5jb20vamF2YS9qZGsiPmlibS5jb20vamF2YS9qZGsvPC9qdW1wPiBvciA8anVtcCBocmVmPSJodHRwOi8vd3d3LmphdmEuc3VuLmNvbSI+amF2YS5zdW4uY29tPC9qdW1wPi48L3A+IAotPHA+RG93bmxvYWQgPHJlc291cmNlLXJlZiBpZHJlZj0ieHNsdDRqLWRpc3QtemlwIi8+IG9yIDxyZXNvdXJjZS1yZWYgaWRyZWY9InhzbHQ0ai1kaXN0LXRhcmd6Ii8+LiBCb3RoIG9mIHRoZXNlIGZpbGVzIGNvbnRhaW4gPHJlc291cmNlLXJlZiBpZHJlZj0ieHNsdDRqLWN1cnJlbnQiLz4gKHdpdGggeGFsYW4uamFyKSBhbmQgeGVyY2VzLmphciBmcm9tIDxyZXNvdXJjZS1yZWYgaWRyZWY9InhtbDRqLXVzZWQiLz4uIFlvdSBjYW4gdXNlIGEgemlwIG9yIHRhciB1dGlsaXR5IHRvIGV4cGFuZCB0aGVzZSBmaWxlcyBpbnRvIGEgZnVsbCBidWlsZC48L3A+Ci0KLTxwPklmIHlvdSBwbGFuIHRvIHJ1biA8bGluayBpZHJlZj0iZXh0ZW5zaW9ucyI+WFNMVCBleHRlbnNpb25zPC9saW5rPiwgeW91IG5lZWQgYnNmLmphciwgd2hpY2ggaXMgaW5jbHVkZWQgaW4gdGhlICZ4c2x0NGo7IGRpc3RyaWJ1dGlvbi4gSWYgeW91IHBsYW4gdG8gcnVuIFhTTFQgZXh0ZW5zaW9ucyBpbXBsZW1lbnRlZCBpbiBKYXZhc2NyaXB0IG9yIGFub3RoZXIgc2NyaXB0aW5nIGxhbmd1YWdlLCB5b3Ugd2lsbCBuZWVkIG9uZSBvciBtb3JlIGFkZGl0aW9uYWwgZmlsZXMgYXMgaW5kaWNhdGVkIGluIDxsaW5rIGlkcmVmPSJleHRlbnNpb25zIiBhbmNob3I9InN1cHBvcnRlZC1sYW5nIj5leHRlbnNpb25zIGxhbmd1YWdlIHJlcXVpcmVtZW50czwvbGluaz4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImNsYXNzcGF0aCIvPgotPHMyIHRpdGxlPSJTZXR0aW5nIHVwIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIj4KLTxwPkF0IHRoZSB2ZXJ5IG1pbmltdW0sIHlvdSBtdXN0IGluY2x1ZGUgeGFsYW4uamFyIGFuZCB4ZXJjZXMuamFyIChvciBhbm90aGVyIGNvbmZvcm1hbnQgWE1MIHBhcnNlciAtLSBzZWUgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0icGx1ZyI+UGx1Z2dpbmcgaW4gYSBUcmFuc2Zvcm1lciBhbmQgWE1MIHBhcnNlcjwvbGluaz4pIG9uIHRoZSBzeXN0ZW0gY2xhc3NwYXRoLiBUbyBydW4gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMsIGluY2x1ZGUgeGFsYW5zYW1wbGVzLmphciAoYWxsIHNhbXBsZXMgb3RoZXIgdGhhbiB0aGUgc2VydmxldCkgYW5kIHhhbGFuc2VydmxldC5qYXIuIFRvIHJ1biBleHRlbnNpb25zLCBpbmNsdWRlIGJzZi5qYXIuIEFsbCB0aGVzZSBKQVIgZmlsZXMgYXJlIGRpc3RyaWJ1dGVkIHdpdGggJnhzbHQ0ajsuIEZvciBleHRlbnNpb25zIGltcGxlbWVudGVkIGluIEphdmFTY3JpcHQgb3IgYW5vdGhlciBzY3JpcHRpbmcgbGFuZ3VhZ2UsIHNlZSA8bGluayBpZHJlZj0iZXh0ZW5zaW9ucyIgYW5jaG9yPSJzdXBwb3J0ZWQtbGFuZyI+ZXh0ZW5zaW9ucyBsYW5ndWFnZSByZXF1aXJlbWVudHM8L2xpbms+IHRvIGlkZW50aWZ5IGFueSBhZGRpdGlvbmFsIEpBUiBmaWxlcyB5b3UgbXVzdCBwbGFjZSBvbiB0aGUgY2xhc3NwYXRoIGFuZCB3aGVyZSB5b3UgY2FuIGdldCB0aGVtLjwvcD4KLTxwPklmIHlvdSBhcmUgdXNpbmcgSkRLIG9yIEpSRSAxLjEuOCwgYWxzbyBpbmNsdWRlIGNsYXNzZXMuemlwIG9uIHRoZSBjbGFzc3BhdGguPC9wPgotPG5vdGU+SWYgeW91IGFyZSB1c2luZyB4ZXJjZXMuamFyIGZyb20gYSBYZXJjZXMgcmVsZWFzZSB0aGF0IGlzIG1vcmUgcmVjZW50IHRoYW4gJnhtbDRqLXVzZWQ7LCB5b3UgbWF5IG5lZWQgdG8gcHV0IHhlcmNlcy5qYXIgYmVmb3JlIHhhbGFuLmphciBvbiB0aGUgY2xhc3NwYXRoLiBCb3RoIEpBUiBmaWxlcyBpbmNsdWRlIHRoZSBvcmcudzNjLmRvbSBwYWNrYWdlcy4gVGhlIFhlcmNlcyB0ZWFtIGlzIHRyYWNraW5nIHVwZGF0ZXMgdG8gRE9NIGxldmVsIDIsIGFuZCB0aGUgWGVyY2VzIHBhcnNlciBtYXkgcmVxdWlyZSBhY2Nlc3MgdG8gdXBkYXRlcyBpbiB0aGVzZSBwYWNrYWdlcy48L25vdGU+Ci08L3MyPjxhbmNob3IgbmFtZT0ic2FtcGxlcyIvPgotPHMyIHRpdGxlPSJUcnlpbmcgb3V0IHRoZSBzYW1wbGVzIj4KLTxwPlRoZSAmeHNsdDRqOyBkaXN0cmlidXRpb24gaW5jbHVkZXMgYSBudW1iZXIgb2YgYmFzaWMgc2FtcGxlIGFwcGxpY2F0aW9ucy4gVGhlc2Ugc2FtcGxlcyBhcmUgZWFzeSB0byBydW4sIGFuZCB5b3UgY2FuIHJldmlldyB0aGUgc291cmNlIGZpbGVzIC0tIGFsbCBvZiB3aGljaCBhcmUgYnJpZWYgLS0gdG8gc2VlIGp1c3QgaG93IHRoZXkgd29yay48L3A+Ci08cD5UbyBydW4gdGhlIHNhbXBsZXMsIGRvIHRoZSBmb2xsb3dpbmc6PC9wPgotPG9sPgotPGxpPlNldCB1cCB5b3VyIGNsYXNzcGF0aCAoc2VlIGFib3ZlKSwgaW5jbHVkaW5nIHhhbGFuc2FtcGxlcy5qYXIgYW5kIChmb3IgdGhlIHNlcnZsZXQpIHhhbGFuc2VydmxldC5qYXIuPC9saT4KLTxsaT5CZSBzdXJlIHRoZSBqYXZhIGV4ZWN1dGFibGUgaXMgb24geW91ciBwYXRoLjwvbGk+Ci08bGk+R28gdG8gdGhlIHNhbXBsZXMgc3ViZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNhbXBsZSAodXNlIHRoZSBET1Mgc2hlbGwgaWYgeW91IGFyZSBydW5uaW5nIFdpbmRvd3MpLjwvbGk+Ci08bGk+VXNlIHRoZSBqYXZhIGV4ZWN1dGFibGUgdG8gcnVuIHRoZSBzYW1wbGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLjwvbGk+Ci08bGk+RXhhbWluZSB0aGUgYXBwbGljYXRpb24gc291cmNlIGFuZCByZXN1bHQgZmlsZXMuPC9saT4KLTwvb2w+Ci08cD5Gb3IgZXhhbXBsZSwgZ28gdG8gdGhlIFNpbXBsZVRyYW5zZm9ybSBzdWJkaXJlY3RvcnkgYW5kIGlzc3VlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo8L3A+Ci08cD48Y29kZT5qYXZhIFNpbXBsZVRyYW5zZm9ybTwvY29kZT48L3A+Ci08cD5UaGUgc2FtcGxlIHdyaXRlcyB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0ICB0byBhIGZpbGUgKGJpcmRzLm91dCkuIFRvIHNlZSBob3cgdGhlIGV4YW1wbGUgd29ya3MsIGV4YW1pbmUgdGhlIHNvdXJjZSBmaWxlczogYmlyZHMueG1sLCBiaXJkcy54c2wsIGFuZCBTaW1wbGVUcmFuc2Zvcm0uamF2YS48L3A+Ci08cD5UaGUgZXh0ZW5zaW9ucyBleGFtcGxlcyByZXF1aXJlIGFkZGl0aW9uYWwgSkFSIGZpbGVzIG9uIHRoZSBjbGFzc3BhdGgsIGFuZCB0aGUgcHJvY2VkdXJlIGZvciBydW5uaW5nIHRoZSBzYW1wbGUgYXBwbGV0IGFuZCBzYW1wbGUgc2VydmxldCBpcyBkaWZmZXJlbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGFsbCB0aGUgc2FtcGxlcywgc2VlIDxsaW5rIGlkcmVmPSJzYW1wbGVzIj4meHNsdDRqOyBTYW1wbGVzPC9saW5rPi48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0iY29tbWFuZGxpbmUiLz4KLTxzMiB0aXRsZT0iUGVyZm9ybWluZyB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIj4KLTxwPmphdmEub3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MgcHJvdmlkZXMgYSBiYXNpYyB1dGlsaXR5IGZvciBwZXJmb3JtaW5nIHRyYW5zZm9ybWF0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIFlvdSB1c2UgdGhpcyB1dGlsaXR5LCBmb3IgZXhhbXBsZSwgdG8gcnVuIHNldmVyYWwgb2YgdGhlIGV4dGVuc2lvbnMgc2FtcGxlcy4gVGhlIGNvbW1hbmQgbGluZSBmb3IgbW9zdCBzdGFuZGFyZCB0cmFuc2Zvcm1hdGlvbnMgaXMgYXMgZm9sbG93czo8L3A+Ci08cD48Y29kZT5qYXZhIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIC1pbiA8cmVmPnhtbFNvdXJjZTwvcmVmPjwvY29kZT48YnIvPgotPGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7LXhzbCA8cmVmPnN0eWxlc2hlZXQ8L3JlZj4gLW91dCA8cmVmPm91dHB1dGZpbGU8L3JlZj48L2NvZGU+PC9wPgotPHA+d2hlcmUgPHJlZj54bWxTb3VyY2U8L3JlZj4gaXMgdGhlIFhNTCBzb3VyY2UgZmlsZSBuYW1lLCA8cmVmPnN0eWxlc2hlZXQ8L3JlZj4gaXMgdGhlIFhTTCBzdHlsZXNoZWV0IGZpbGUgbmFtZSwgYW5kIDxyZWY+b3V0cHV0ZmlsZTwvcmVmPiBpcyB0aGUgb3V0cHV0IGZpbGUgbmFtZS48L3A+Ci08cD5JZiB5b3Ugd2FudCB0aGUgb3V0cHV0IHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuLCBzaW1wbHkgb21pdCB0aGUgLW91dCBmbGFnIGFuZCBhcmd1bWVudC48L3A+Ci08cD5Zb3UgY2FuIHVzZSB0aGlzIHV0aWxpdHkgdG8gdHJ5IG91dCBYU0wgc3R5bGVzaGVldHMgeW91IGhhdmUgd3JpdHRlbiwgdG8gbWFrZSBzdXJlIHRoZXkgZG8gd2hhdCB5b3UgZXhwZWN0IHdpdGggdGhlIFhNTCBzb3VyY2UgZmlsZXMgdGhleSBhcmUgZGVzaWduZWQgdG8gdHJhbnNmb3JtLiBUaGUgdXRpbGl0eSBwcm92aWRlcyB1c2VmdWwgbWVzc2FnZXMgaWYgdGhlIHNvdXJjZSBmaWxlIG9yIHN0eWxlc2hlZXQgaXMgbm90IHdlbGwgZm9ybWVkLiBJZiB5b3UgaW5jbHVkZSBhIERPQ1RZUEUgc3RhdGVtZW50IGluIHlvdXIgWE1MIHNvdXJjZSBmaWxlcyBhbmQgaW5jbHVkZSB0aGUgLXZhbGlkYXRlIGZsYWcgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlIHV0aWxpdHkgd2lsbCBhbHNvIGxldCB5b3Uga25vdyB3aGV0aGVyIHRoZSBYTUwgZG9jdW1lbnQgaXMgdmFsaWQgKGNvbmZvcm1zIHRvIHRoYXQgRE9DVFlQRSkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGxpbmsgaWRyZWY9ImNvbW1hbmRsaW5lIj5Db21tYW5kLUxpbmUgVXRpbGl0eTwvbGluaz4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImphdmEtYXBwcyIvPgotPHMyIHRpdGxlPSJTZXR0aW5nIHVwIHlvdXIgb3duIEphdmEgYXBwbGljYXRpb25zIj4KLTxwPllvdSBjYW4gc3RhcnQgYnkgdXNpbmcgeW91ciBvd24gWE1MIHNvdXJjZSBmaWxlcyBhbmQgWFNMIHN0eWxlc2hlZXRzIHdpdGggdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMsIHdoaWNoIGlsbHVzdHJhdGUgYSBudW1iZXIgb2YgdGhlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIj5iYXNpYyB1c2FnZSBwYXR0ZXJuczwvbGluaz4uPC9wPgotPHA+SGVyZSBpcyB0aGUgYmFzaWMgVFJhWCBwcm9jZWR1cmUgdG8ga2VlcCBpbiBtaW5kIHdoZW4geW91IHNldCB1cCBhIHRyYW5zZm9ybWF0aW9uOjwvcD4KLTxvbD4KLTxsaT5Vc2UgdGhlIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lckZhY3RvcnkuaHRtbCI+VHJhbnNmb3JtZXJGYWN0b3J5PC9qdW1wPiBzdGF0aWMgbmV3SW5zdGFuY2UoKSBtZXRob2QgdG8gaW5zdGFudGlhdGUgYSBUcmFuc2Zvcm1lckZhY3RvcnkuPGJyLz48YnIvPjwvbGk+Ci08bGk+VXNlIHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgbmV3VHJhbnNmb3JtZXIoU291cmNlIHN0eWxlc2hlZXQpIG1ldGhvZCB0byBwcm9jZXNzIHRoZSB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMgaW4gYW4gWFNMVCBzdHlsZXNoZWV0IFNvdXJjZSAocHJvZHVjaW5nIHVuZGVyIHRoZSBjb3ZlcnMgYSA8anVtcCBocmVmPSJhcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vVGVtcGxhdGVzLmh0bWwiPlRlbXBsYXRlczwvanVtcD4gb2JqZWN0KSBhbmQgZ2VuZXJhdGUgYSA8anVtcCBocmVmPSJhcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vVHJhbnNmb3JtZXIuaHRtbCI+VHJhbnNmb3JtZXI8L2p1bXA+Ljxici8+PGJyLz48L2xpPgotPGxpPlVzZSB0aGUgVHJhbnNmb3JtZXIgdHJhbnNmb3JtKFNvdXJjZSB4bWxTb3VyY2UsIFJlc3VsdCB0cmFuc2Zvcm1SZXN1bHQpIG1ldGhvZCB0byBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zICh0aGUgVGVtcGxhdGVzIG9iamVjdCkgdG8gdGhlIFhNTCBTb3VyY2UgYW5kIHByb2R1Y2UgdGhlIHRyYW5zZm9ybWF0aW9uIFJlc3VsdC48YnIvPjxici8+PC9saT4KLTwvb2w+Ci08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHByb2NlZHVyZSBhbmQgaXRzIHZhcmlhdGlvbnMsIHNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyI+QmFzaWMgVXNhZ2UgUGF0dGVybnM8L2xpbms+LjwvcD4KLTwvczI+Ci08L3MxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vaGlzdG9yeS54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuL2hpc3RvcnkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmRiNTRjLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vaGlzdG9yeS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjQgKzAsMCBAQAotPHMzIHRpdGxlPSJDaGFuZ2VzIGZvciAmeHNsdDRqOyAyLjAuMSI+Ci08cD5UaGlzIHJlbGVhc2UgaW5jbHVkZXMgYSBudW1iZXIgb2YgYnVnIGZpeGVzIHRvIHRoZSAmeHNsdDRqOyBhbmQgVHJBWCBjb3JlIGFuZCBYYWxhbi1KYXZhIDEgY29tcGFiaWxpdHkgQVBJLiBXZSBoYXZlIGFsc288L3A+Ci08dWw+Ci0gIDxsaT5FbnRlcmVkIGFsbCBrbm93biAmeHNsdDRqOyAyIDxsaW5rIGFuY2hvcj0iYnVncyI+YnVnczwvbGluaz4gaW4gdGhlIEFwYWNoZSBCdWd6aWxsYSBkYXRhYmFzZTxici8+PGJyLz48L2xpPgotICA8bGk+QWRkZWQgc3VwcG9ydCBmb3IgdXNpbmcgY3VzdG9tIFVSSVJlc29sdmVyLCBFbnRpdHlSZXNvbHZlciwgYW5kIENvbnRlbnRIYW5kbGVyIGltcGxlbWVudGF0aW9ucyB3aXRoIHRoZSA8bGluawotICAgICAgaWRyZWY9ImNvbW1hbmRsaW5lIj5jb21tYW5kLWxpbmUgdXRpbGl0eTwvbGluaz48YnIvPjxici8+PC9saT4gCi0gIDxsaT5VcGdyYWRlZCBmcm9tIEFudCAxLjIgdG8gQW50IDEuMyBmb3Igb3VyIDxsaW5rIGFuY2hvcj0iYnVpbGQiPmJ1aWxkczwvbGluaz4gKHRoZSBuZXcgYW50LmphciBpcyBpbiB0aGUgYmluIGRpcmVjdG9yeSkuPC9saT4KLTwvdWw+Ci08cD5Db3JlIHNvdXJjZSBjb2RlIHVwZGF0ZXM6PC9wPgotPHVsPgotPGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8wNi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMgQ2hpbGRXYWxrZXJNdWx0aVN0ZXAuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkZpeCBmb3IgYnVnIHJlcG9ydGVkIGJ5ICJDaHJpcyBQLiBNY0NhYmUiICZsdDtjaHJpc19tY2NhYmVAY2hvaWNlaG90ZWxzLmNvbSZndDsKLSAwMi8wNi8yMDAxIDA2OjU1IFBNLgotIERlZmVuc2l2ZSBmaXggZm9yIGlmIHRoZSBsYXN0IHVzZWQgd2Fsa2VyIGlzIG51bGwsIHRoZW4gZG9uJ3QgY2hlY2sgdG8KLSBzZWUgaWYgaXQgaXMgYSBmYXN0IHdhbGtlciEgV2l0aG91dCB0aGlzLCBhIG51bGwgcG9pbnRlciBleGNlcHRpb24gaXMKLSB2ZXJ5IHBvc3NpYmxlLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMDYvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lciBUcmFuc2Zvcm1lckltcGwuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkZpeGVzIGZvciBleGNlcHRpb25zIGJlaW5nIHRocm93biB0aGF0IHdlcmVuJ3QgYmVpbmcgcGFzc2VkIHRocm91Z2gKLSB0aGUgZXJyb3IgbGlzdGVuZXIuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8wNy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2F4ZXMgRm9sbG93aW5nV2Fsa2VyLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5GaXggZm9yIGJ1ZyByZXBvcnRlZCBieSBEYXZlIEhhZmZuZXIgJmx0O2RhdmUuaGFmZm5lckB4bWxzLmNvbSZndDsKLSAwMi8wNi8yMDAxIDA0OjAzIEFNCi0gSW4gcGFyZW50Tm9kZSgpLCBkb24ndCBzY3JlZW4gb3V0IG5leHRBbmNlc3Rvciwgc2luY2UgdGhlIHBhcmVudAotIGlzIG5ldmVyIGFjdHVhbGx5IHJldHVybmVkLiBUaGlzIHNldHMgdGhpbmdzIHVwIGNvcnJlY3RseSBmb3IgZmlyc3RDaGlsZAotIGFuZCBuZXh0U2libGluZy48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzA3LzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcyBQcmVjZWRpbmdXYWxrZXIuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkZpeCBmb3IgYnVnIHJlcG9ydGVkIGJ5IERhdmUgSGFmZm5lciAmbHQ7ZGF2ZS5oYWZmbmVyQHhtbHMuY29tJmd0OwotIDAyLzA2LzIwMDEgMDQ6MDMgQU0KLSBJbiBuZXh0U2libGluZygpLCBkb24ndCByZXR1cm4gbnVsbCBpZiBpc0FuY2VzdG9yT2ZSb290Q29udGV4dCwgaW5zdGVhZAotIGRvIG5leHQuZ2V0Rmlyc3RDaGlsZCgpLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMDcvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94cGF0aCBTb3VyY2VUcmVlTWFuYWdlci5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4IGZvciBidWcgcmVwb3J0ZWQgYnkgYW5kZXJzLmRvbWVpakB1Yy5zZQotIDAyLzA3LzIwMDEgMDk6MzUgQU0KLSByZW1vdmVkIGV4dHJhIGJvZ3VzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIGRlY2wgaW4gcmVzb2x2ZVVSSTxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMDgvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zdHJlZSBTb3VyY2VUcmVlSGFuZGxlci5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4IGJ1ZyByZXBvcnRlZCBieSBKYXNvbiBIYXJyb3AgJmx0O2poYXJyb3BAYmlncG9uZC5uZXQuYXUmZ3Q7Ci0gMDIvMDcvMjAwMSAwODoxMiBQTQotIERvbid0IHByb2Nlc3MgY29tbWVudCBvciB3aGl0ZXNwYWNlIGV2ZW50cyBpZiBpbnNpZGUgYSBzdGFydERURC9lbmREVEQKLSBldmVudC48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzEwLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveHBhdGgvYXhlcyBXYWxrZXJGYWN0b3J5LmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5JbiBpbmRpcmVjdCByZXNwb25zZSB0byBidWcgcG9zdGVkIGJ5ICJUaGVlIEJvb24gSG9vIiAmbHQ7dGhlZWJoQG5ld3N0YWtlcy5jb20mZ3Q7Ci0gMDIvMDcvMjAwMSAwOTozNyBQTQotCi0gIi8vdGFibGVbMV0iIHBhdHRlcm5zIHdvdWxkIGdpdmUgb25lIG5vZGUKLSB3aGVuIHRoZXkgc2hvdWxkIGhhdmUgZ2l2ZW4gMiwgd2hlbiBhcHBsaWVkIHRvIEJvb24gSG9vJ3MKLSBzb3VyY2UuCi0gIi8vdGFibGVbMV0iIGlzIGVxdWl2ZWxlbnQgdG8KLSAiL2Rlc2NlbmRhbnQtb3Itc2VsZjo6bm9kZSgpL3RhYmxlWzFdIiwKLSBhbmQgc28gbXVzdCByZXR1cm4gdGhlIGZpcnN0IHRhYmxlIGNoaWxkCi0gb2YgZWFjaCB0YWJsZS1pbnN0IGVsZW1lbnQuCi0KLSBBbiBvcHRpbWl6YXRpb24gd2FzIG9wdGltaXppbmcgdGhpcyB0bwotICIvZGVzY2VuZGFudC1vci1zZWxmOjp0YWJsZSwgd2hpY2ggaXMKLSBmaW5lIGFzIGxvbmcgYXMgaW5kZXhpbmcgaXNuJ3QgdXNlZC4gU2luY2UKLSB3ZSBjYW4gbm90IHRlbGwgdW50aWwgcnVudGltZSBpZiBpbmRleGluZwotIGlzIGJlaW5nIHVzZWQsIHdlIGhhdmUgdG8gdHVybiBvZiB0aGlzCi0gb3B0aW1pemF0aW9uIGZvciBhbGwgcHJlZGljYXRlZCAiLy9mb29beHhdIgotIHBhdHRlcm5zLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5tbWlkeUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMTIvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9wcm9jZXNzb3IgU3R5bGVzaGVldFBJSGFuZGxlci5qYXZhCi0gVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+UGF0Y2ggZm9yIERtaXRyaSBJSXlpbiB0byB1c2UgdGhlIHNwZWNpZmllZCBVUklSZXNvbHZlci48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+bW1pZHlAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzEyLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vdGVtcGxhdGVzIEVsZW1OdW1iZXIuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPk51bWJlciBFeHByZXNzaW9uIHNob3VsZCBiZSBldmFsdWF0ZWQgdGhlbiByb3VuZGVkIHVwLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMTMvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IFByb2Nlc3MuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkNyZWF0ZSBhIGRvY3VtZW50IGZyYWdtZW50IGZvciB0aGUgb3V0cHV0IG5vZGUsIGZvciAtZmxhdm9yIGQyZC48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzEzLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveHBhdGgvY29tcGlsZXIgQ29tcGlsZXIuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gcXVvIGlzIHVzZWQuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8xMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcyBFbGVtQ2FsbFRlbXBsYXRlLmphdmEKLSBFbGVtQ2hvb3NlLmphdmEgRWxlbUNvcHkuamF2YSBFbGVtRmFsbGJhY2suamF2YQotIEVsZW1JZi5qYXZhIEVsZW1MaXRlcmFsUmVzdWx0LmphdmEKLSBFbGVtVGVtcGxhdGUuamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIgVHJhbnNmb3JtZXJJbXBsLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5SZW1vdmUgZXh0cmEgbWV0aG9kL2NhbGwgdG8gVHJhbnNmb3JtZXJJbXBsLmV4ZWN1dGVDaGlsZFRlbXBsYXRlcygpPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8xMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL3BhdHRlcm5zIE5vZGVUZXN0LmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5SZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGluc3RlYWQgb2YgbnVsbCBmcm9tIGdldExvY2FsTmFtZSgpIHdoZW4gdGhlCi0gbm9kZXRlc3QgZG9lcyBub3QgaGF2ZSBhIG5hbWUuIEVuY291bnRlcmVkIHdpdGggdGhlIFNRTCBleHRlbnNpb24sCi0gaW4gcmVzcG9uc2UgdG8gYnVnIHJlcG9ydGVkIGJ5ICJNaWNoYWVsIEtheSIgJmx0O21oa2F5QGljbHdheS5jby51ayZndDssCi0gMDIvMDgvMjAwMSAwODo1NyBBTS48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzEzLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vbGliL3NxbCBDb2x1bW5EYXRhLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5JbiBnZXREYXRhKCkgcmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mIG51bGwgaWYgdGhlcmUgaXMKLSBubyBkYXRhIHRvIGJlIG9idGFpbmVkLgotIEluIHJlc3BvbnNlIHRvIGJ1ZyByZXBvcnRlZCBieSAiTWljaGFlbCBLYXkiICZsdDttaGtheUBpY2x3YXkuY28udWsmZ3Q7LAotIDAyLzA4LzIwMDEgMDg6NTcgQU0uPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmdhcnlwQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8xOS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2V4dGVuc2lvbnMgTWV0aG9kUmVzb2x2ZXIuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkNvcnJlY3QgQ29udmVyc2lvbkluZm8gYXJyYXkgZm9yIE5vZGUtU2V0IGFuZCBSVEYuIFJlbW92ZSBEb2N1bWVudEZyYWdtZW50IAotZnJvbSBSVEYgYW5kIHJlcGxhY2Ugd2l0aCBOb2RlTGlzdC4gUmVtb3ZlIGR1cGxpY2F0ZSBCb29sZWFuIGZyb20gYm90aC4gRml4IAotQm9vbGVhbiBjb252ZXJzaW9uIHRvIG1ha2UgamF2YS5sYW5nLkJvb2xlYW4gaGlnaGVyIHRoYW4gc3RyaW5nLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMTkvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9saWIvc3FsIENvbHVtbkhlYWRlci5qYXZhCi0gUm93U2V0LmphdmEgWFN0YXRlbWVudC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+VXNlIG51bGwgbm9kZXRlc3QgdG8gbWVhbiB0aGUgc2FtZSBhcyAibm9kZSgpIi4gVGhpcyBmaXhlcyBhIGJ1ZyByZXBvcnRlZAotIGJ5ICJWb3l0ZW5rbywgRGltaXRyeSIgJmx0O0RWb3l0ZW5rb0BTRUNUT1JCQVNFLkNPTSZndDsKLSB3aGVyZSAmbHQ7eHNsOmNvcHktb2Ygc2VsZWN0PSJzcWw6cXVlcnkoLi4uKSIvJmd0OwotIGNyYXNoZXMgd2l0aCBOdWxsUG9pbnRlckV4Y2VwdGlvbiwgaS5lLgotIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB3ZSByZWFsbHkgZG9uJ3Qgd2FudAotIHRvIHNldCB0aGUgTm9kZVRlc3QuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8yMC8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL2NvbXBpbGVyIFhQYXRoUGFyc2VyLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5DaGVjayBmb3IgbnVsbCB0b2tlbiBiZWZvcmUgY2hlY2tpbmcgaWYgaXQgaXMgYSBsZXR0ZXI8YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzIwLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIKLSBUcmFuc2Zvcm1lcklkZW50aXR5SW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4IG1hZGUgZm9yIGJ1ZyByZXBvcnRlZCBieSAiR2xlbmNyb3NzLCBDaHJpc3RpYW4iIAotJmx0O0NocmlzdGlhbi5HbGVuY3Jvc3NAZ3MuY29tJmd0OwotIG9uIDAyLzE2LzIwMDEgMTA6MTggQU0uCi0gWGVyY2VzIDEuMi4zIFNBWCBwYXJzZXIgY2FsbHMKLSBoYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcigpIGJlZm9yZSBoYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKS4KLSBUcmFuc2Zvcm1lcklkZW50aXR5SW1wbC5tX3Jlc3VsdENvbnRlbnRIYW5kbGVyIGlzbid0IGluaXRpYWxpc2VkIHVudGlsCi0gVHJhbnNmb3JtZXJJZGVudGl0eUltcGwuc3RhcnREb2N1bWVudCgpIGlzIGNhbGxlZC4KLSBBZGRlZCBsYXp5IGNvbnN0cnVjdGlvbiBvZiByZXN1bHQgaGFuZGxlcgotIGluIHNldERvY3VtZW50TG9jYXRvciwgaW4gYWRkaXRpb24gdG8KLSBzdGFydERvY3VtZW50Ljxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5nYXJ5cEBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMjEvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9saWIgRXh0ZW5zaW9ucy5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Q29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZiBzdHJpbmcgdmFsdWUgb2YgYSBub2RlLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5kbGVzbGllQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8yMS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9zcWwgQ29sdW1uLmphdmEKLSBDb2x1bW5BdHRyaWJ1dGUuamF2YSBDb2x1bW5EYXRhLmphdmEKLSBDb2x1bW5IZWFkZXIuamF2YSBSb3cuamF2YSBSb3dTZXQuamF2YQotIFN0cmVhbWFibGVOb2RlLmphdmEgWENvbm5lY3Rpb24uamF2YQotIFhTdGF0ZW1lbnQuamF2YSBwYWNrYWdlLmh0bWw8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BZGRlZCBleHBlcmltZW50YWwgdXNhZ2UgbWV0YXRhZyB0byBhbGwgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UsCi0gYW5kIGFuIGV4cGxhbmF0b3J5IG5vdGUgdG8gcGFja2FnZS5odG1sLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMjIvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zdHJlZSBFbGVtZW50SW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+QnVnIGZpeCBhdHRyaWJ1dGVkIHRvIE5vcm1hbiBXYWxzaCAmbHQ7bmR3QG53YWxzaC5jb20mZ3Q7LCBvbgotIDAyLzIwLzIwMDEgMDk6NTAgQU0uIGlmIHRoZSBhdHRyaWJ1dGUgJ25hbWUnIGRvZXNuJ3Qgb2NjdXIgaW4gdGhlIEF0dExpc3QsIAotdGhlCi0gcmVzdWx0IG9mIGdldEluZGV4KG5hbWUpIGlzIC0xLCBidXQKLSBnZXRDaGlsZEF0dHJpYnV0ZSgpIHdvdWxkIGluY29ycmVjdGx5Ci0gcmV0dXJuIHRoZSBmaXJzdCBhdHRyaWJ1dGUuIEZpeCByZXR1cm5zCi0gbnVsbCBpZiBpbmRleCAmbHQ7IDAuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8yMi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3NlcmlhbGl6ZSBTZXJpYWxpemVyVG9YTUwuamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIKLSBUcmFuc2Zvcm1lcklkZW50aXR5SW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+SW1wbGVtZW50IERlY2xIYW5kbGVyIGZvciBpZGVudGl0eSB0cmFuc2Zvcm1zPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8yMi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyIFRyYW5zZm9ybWVySW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4IGZvciBidWcgb3JpZ2luYWxseSByZXBvcnRlZCBieSBEYXJ5bCBCZWF0dGllICZsdDtEYXJ5bEJAc2NyZWFtaW5nbWVkaWEuY29tJmd0OwotIG9uIDAyLzE0LzIwMDEgMDQ6MTYgUE0uIEEgaGFuZyB3YXMgb2NjdXJpbmcgaW5zaWRlIHRoZSB1c2UKLSBvZiBhIFJlc3VsdCBUcmVlIEZyYWdtZW50LiBXaGVuIHRoZSByZXN1bHQgdHJlZSBmcmFnZW1lbnQgd2FzCi0gYmVpbmcgY3JlYXRlZCwgdGhlIFJlZGlyZWN0IGV4dGVuc2lvbiB3YXMgYmVpbmcgY2FsbGVkLCB3aGljaAotIGNhbGxlZCBjcmVhdGVSZXN1bHRDb250ZW50SGFuZGxlciB3aGljaCBzZXQgdGhlIENvbnRlbnRIYW5kbGVyCi0gaW4gdGhlIFRyYW5zZm9ybWVyLCBidXQgbm90IGluIHRoZSBSZXN1bHRUcmVlSGFuZGxlci4gVGhlbiwgUmVkaXJlY3QKLSBjYWxsZWQgVHJhbnNmb3JtZXIjZXhlY3V0ZUNoaWxkVGVtcGxhdGVzKAotIEVsZW1UZW1wbGF0ZUVsZW1lbnQgZWxlbSwgTm9kZSBzb3VyY2VOb2RlLCBRTmFtZSBtb2RlLCAKLUNvbnRlbnRIYW5kbGVyIGhhbmRsZXIpCi0gd2hpY2ggc2F2ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgY29udGVudCBoYW5kbGVyIGluCi0gdGhlIHRyYW5zZm9ybWVyLCBhbmQgdGhlbiBzZXRzIHRoZSBuZXcgb25lIGJ5IGNhbGxpbmcgc2V0Q29udGVudEhhbmRsZXIsCi0gd2hpY2ggc2V0cyB0aGUgQ29udGVudEhhbmRsZXIgaW4gdGhlIFJlc3VsdFRyZWVIYW5kbGVyIGFzIHdlbGwKLSBhcyB0aGUgVHJhbnNmb3JtZXIuIFdoZW4gaXQgdHJpZWQgdG8gcmVzdG9yZSB0aGUgb2xkIENvbnRlbnRIYW5kbGVyLAotIGl0IHJlc3RvcmVkIHRoZSB2YWx1ZSBpbiB0aGUgUmVzdWx0VHJlZUhhbmRsZXIgdG8gYSBTZXJpYWxpemVyLCBpbnN0ZWFkCi0gb2YgdGhlIGNvcnJlY3QgQ29udGVudEhhbmRsZXIuIFdoZW4gdHJhbnNmb3JtVG9SVEYgdGhlbiBjYWxsZWQKLSBlbmREb2N1bWVudCBvbiBpdCdzIHJlc3VsdFRyZWVGcmFnbWVudCwgdGhlIGV2ZW50IHdhcyBzZW50Ci0gdG8gdGhlIFNlcmlhbGl6ZXIgaW5zdGVhZCBvZiB0aGUgU291cmNlVHJlZUhhbmRsZXIsIGFuZCB0aHVzIHRoZQotIGlzQ29tcGxldGUgZmxhZyB3YXMgbm90IHNldCwgYW5kIHRodXMgdGhlIGhhbmcuICh3aGV3ISkKLSBUaGUgZml4IGlzIGluIGV4ZWN1dGVDaGlsZFRlbXBsYXRlcyBzYXZlIHRoZSB2YWx1ZSBvZiB0aGUKLSByZXN1bHRUcmVlSGFuZGxlcidzIGNvbnRlbnRIYW5kbGVyIGFzIHdlbGwgYXMgVHJhbnNmb3JtZXIncwotIGNvbnRlbnQgaGFuZGxlciwgYW5kIHJlc3RvcmUgdGhlbSBib3RoLiBBIG1vcmUgYXJjaGl0ZWN0dWFsIGZpeAotIGNvdWxkIGJlIG1hZGUsIGJ1dCBub3Qgd2l0aG91dCBoaWdoIHJpc2ssIHNvIEkgdGhpbmsgdGhpcyBpcyB0aGUgYmVzdAotIGFuZCBzYWZlc3Qgd2F5IHRvIGZpeCBpdC48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+ZGxlc2xpZUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMjMvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9yZXMgWFNMVEluZm8ucHJvcGVydGllczxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkNoYW5nZWQgdmVyc2lvbiB0byAyLjAuMTxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5kbGVzbGllQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8yMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3NvciBYU0xQcm9jZXNzb3JWZXJzaW9uLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5DaGFuZ2VkIHZlcnNpb24gdG8gMi4wLjE8YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+Y3VyY3VydUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMjgvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9yZXMgWFNMVEVycm9yUmVzb3VyY2VzLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5VcGRhdGUgdGV4dCBvZiBlcnJvciBtZXNzYWdlcwotIFN1Ym1pdHRlZCBieTogQW5kcmVhcyBaZWhucGZ1bmQ8YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+Y3VyY3VydUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMjgvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IFByb2Nlc3MuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPlVwZGF0ZSBwcmludEFyZ09wdGlvbnMoKSB3aXRoIGJldHRlciB0ZXh0IGFuZCB0byBiZXR0ZXIgcmVmbGVjdCBhY3R1YWwKLSBvcHRpb25zIHRoYXQgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ7IGNhdGNoIG1pc3NpbmcgLUlOIGFyZ3VtZW50PGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmprZXNzZWxtQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8wNS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2NsaWVudCBYU0xUUHJvY2Vzc29yQXBwbGV0LmphdmEKLSBqYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3NvciBTdHlsZXNoZWV0SGFuZGxlci5qYXZhCi0gVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zdHJlZSBEb2NJbXBsLmphdmEKLSBTdHJlZURPTUJ1aWxkZXIuamF2YSBUZXh0SW1wbC5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMgT3V0cHV0UHJvcGVydGllcy5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IFByb2Nlc3MuamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzIEZhc3RTdHJpbmdCdWZmZXIuamF2YQotIGphdmEvc3JjL3RyYXggdHJheC5wcm9wZXJ0aWVzPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+TmV3IGFwcHJvYWNoIHRvIEZhc3RTdHJpbmdCdWZmZXIsIGFuZCBjaGFuZ2VzIG5lZWRlZCB0byBzdXBwb3J0IGl0LgotIFdlIHN0aWxsIG5lZWQgdG8gZG8gc29tZSBzZXJpb3VzIHdvcmsgb24gYm90aCB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlCi0gdHVuaW5nIHBhcmFtZXRlcnMgYW5kIHRoZSBoZXVyaXN0aWNzIGRyaXZpbmcgdGhlICJjaHVuayBncm93dGgiIGFsZ29yaXRobXMuCi0gQ3VycmVudGx5IHNldCBmb3IgZml4ZWQtc2l6ZWQgY2h1bmtzIG9mIDhLY2ggaW4gbWFpbiB0cmVlLCAuNUtjaCBpbiBSVEYuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8wNi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcyBFbGVtRWxlbWVudC5qYXZhCi0gRWxlbUZvckVhY2guamF2YSBFbGVtTGl0ZXJhbFJlc3VsdC5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lcgotIENsb25lclRvUmVzdWx0VHJlZS5qYXZhIFF1ZXVlZFNBWEV2ZW50LmphdmEKLSBRdWV1ZWRTdGFydERvY3VtZW50LmphdmEgUXVldWVkU3RhcnRFbGVtZW50LmphdmEKLSBSZXN1bHRUcmVlSGFuZGxlci5qYXZhIFRyYW5zZm9ybWVySW1wbC5qYXZhCi0gVHJlZVdhbGtlcjJSZXN1bHQuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkZpeCBmb3IgaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD03NDEuCi0KLSAxKSBSZXN1bHRUcmVlSGFuZGxlciBub3cgaW1wbGVtZW50cyB0aGUgVHJhbnNmb3JtU3RhdGUgaW50ZXJmYWNlLgotIDIpIFF1ZXVlZCBzdGF0ZSBzdWNoIGFzIHRoZSBjdXJyZW50IG5vZGUgYW5kIHRoZSBjdXJyZW50IHRlbXBsYXRlIGlzIHN0b3JlZCAKLWFzIHBhcnQgb2YgUXVldWVkU3RhcnRFbGVtZW50LiBTdG9yYWdlIHdpbGwgb25seSBvY2N1ciBpZiB0aGUgQ29udGVudEhhbmRsZXIgCi1pbXBsZW1lbnRzIFRyYW5zZm9ybUNsaWVudC4KLSAzKSBXaGVuIHN0YXRlIGlzIHJlcXVlc3RlZCAoZm9yIGluc3RhbmNlIFRyYW5zZm9ybVN0YXRlI2dldEN1cnJlbnRFbGVtZW50KCkpLCAKLWlmIHRoZSBxdWV1ZWQgZWxlbWVudCBpcyBudWxsIG9yIG5vdCBwZW5kaW5nIChmb3IgaW5zdGFuY2UsIGluIGEgY2hhcmFjdGVycyAKLWV2ZW50KSwgaXQgd2lsbCBnZXQgdGhlIHN0YXRlIGZyb20gdGhlIHRyYW5zZm9ybWVyLCBvdGhlcndpc2UgaXQgd2lsbCBnZXQgdGhlIAotc3RhdGUgZnJvbSB0aGUgcXVldWVkIGVsZW1lbnQuCi0KLSBPdGhlciBmaXhlcyB3ZXJlIGF0dGVtcHRlZCBmb3IgdGhpcyBwcm9ibGVtLCBpbmNsdWRpbmcgdHJ5aW5nIHRvCi0gZ2V0IHJpZCBvZiBxdWV1ZWluZyBhbHRvZ2V0aGVyLCBhbmQgZmx1c2hpbmcgYSBiaXQgZWFybGllciBiZWZvcmUKLSB0aGUgc3RhdGUgd2FzIHB1c2hlZCBvbiB0aGUgdmFyaW91cyBzdGFja3MsIGJ1dCBib3RoIG9mCi0gdGhlc2UgaGFkIHNob3ctc3RvcHBpbmcgaXNzdWVzIChzZWUgZGlzY3Vzc2lvbnMKLSBvbiB4YWxhbi1kZXYpLgotCi0gTm90ZSB0aGF0IGZvciB0aGUgbW9tZW50IHRoZSBDb250ZXh0Tm9kZUxpc3QgaXMgbm9kZQotIGNsb25lZCBhcyBpdCBuZWVkcyB0byBiZSBpbiBvcmRlciBmb3IKLSBUcmFuc2Zvcm1TdGF0ZSNnZXRDb250ZXh0Tm9kZUxpc3QuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmdhcnlwQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8wNi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcyBFbGVtUGFyYW0uamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveHBhdGggQXJnLmphdmEgVmFyaWFibGVTdGFjay5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+VGhlIGZpZWxkIEFyZy5pc1BhcmFtVmFyIHdhcyBhdHRlbXB0aW5nIHRvIHNlcnZlIHR3byBmdW5jdGlvbnM6IHRvIGluZGljYXRlIAotdmFyaWFibGUgRnJhbWUgZW50cmllcyB3aGljaCBhcmUgbm90IGN1cnJlbnRseSBhY3RpdmF0ZWQgYW5kIHRvIGluZGljYXRlIEZyYW1lcyAKLWNvbnRhaW5pbmcgcGFyYW1ldGVycyBwYXNzZWQgd2l0aCB4c2w6d2l0aC1wYXJhbS4gV2hlbiBwcm9jZXNzaW5nIHdhcyBmaW5pc2hlZCAKLWZvciBhIG5vZGUgaW4gYSBub2RlLXNldCwgdGhlIGlzUGFyYW1WYXIgZmxhZyB3YXMgdHVybmVkIG9uIHRvIGluZGljYXRlIHRoZSAKLUZyYW1lIHNsb3Qgd2FzIGF2YWlsYWJsZS4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIGluZGljYXRlZCB0aGF0IHRoZSBpdGVtIHdhcyAKLXBhc3NlZCBhcyBhIHBhcmFtZXRlciB3aGljaCBpdCB3YXNuJ3QuIFRoaXMgZml4IGNoYW5nZXMgaXNQYXJhbVZhciBpbnRvIHRvIAotZmllbGRzLCBpc0F2YWlsYWJsZSB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgc2xvdCBpcyBhdmFpbGFibGUgYW5kIAotaXNGcm9tV2l0aFBhcmFtIGluZGljYXRpbmcgdGhlIEZyYW1lIHNsb3QgY2FtZSBmcm9tIGFuIHhzbDp3aXRoLXBhcmFtIG9yIGEgCi10b3AtbGV2ZWwgcGFyYW1ldGVyIHBhc3NlZCBpbiB2aWEgdGhlIHRyYW5mb3JtZXJJbXBsLnNldFBhcmFtZXRlcigpIEFQSS4KLSBJIGhhdmUgdGVzdGVkIHRoaXMgY2hhbmdlIGFnYWluc3QgdGhlIGNvbmZvcm1hbmNlIHN1aXRlIGFuZCBoYWQgbm8gCi1yZWdyZXNzaW9uLiBJJ3ZlIGFsc28gc3VibWl0dGVkIGEgdGVzdCBjYXNlIHdoaWNoIGZhaWxzIG9uIHRoZSBleGlzdGluZyAKLWNvZGViYXNlIGJ1dCB3b3JrcyBva2F5IGFmdGVyIHRoaXMgZml4LgotIEl0IGlzIHBvc3NpYmxlIHRoYXQgSSd2ZSBtaXNzZWQgc29tZXRoaW5nIHdpdGggcmVnYXJkIHRvIHRoZSBBUEkgc2V0UGFyYW1ldGVyIAotY2FsbHMgYnV0IHdlIGNhbiBmaXggdGhvc2UgaWYgcHJvYmxlbXMgYXJlIHJlcG9ydGVkLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5nYXJ5cEBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMDcvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMgRmFzdFN0cmluZ0J1ZmZlci5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Q29ycmVjdCBvcGVyYXRpb24gd2hlbiBsZW5ndGggb2YgY29udGVudCB0byBiZSBhcHBlbmRlZCBpcyB6ZXJvLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5tbWlkeUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMDcvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zZXJpYWxpemUgU2VyaWFsaXplclRvWE1MLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5GaXggY2xvc2luZyBvdXQgZG9jdHlwZSBkZWNsYXJhdGlvbjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5tbWlkeUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMDgvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94bWwvdXRpbHMgU3lzdGVtSURSZXNvbHZlci5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Q2hhbmdlIFN5c3RlbUlkUmVzb2x2ZXIgdG8gZGVmYXVsdCB0byB1c2VyLmRpciBpZiB0aGUgYmFzZSBVUkkgaXMgbnVsbDxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5nYXJ5cEBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMDkvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lciBUcmFuc2Zvcm1lckltcGwuamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveHBhdGggVmFyaWFibGVTdGFjay5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+UGFyYW1ldGVycyBzZXQgd2l0aCBzZXRQYXJhbWV0ZXIgd2VyZSBhdmFpbGFibGUgdG8gc3R5bGVzaGVldCBhcyB2YXJpYWJsZSAKLXJlZmVyZW5jZXMgKCRteVBhcmFtKSBldmVuIHRob3VnaCB0aGVyZSB3YXMgbm8geHNsOnBhcmFtIGVsZW1lbnQgdG8gcmVjZWl2ZSBpdC48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+bW1pZHlAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzA5LzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIKLSBUcmFuc2Zvcm1lcklkZW50aXR5SW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Q2hlY2sgaWYgdGhlcmUgaXMgYSBEZWNsSGFuZGxlciBiZWZvcmUgY2FsbGluZyBpdC48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzExLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5QYXRjaCBhdHRyaWJ1dGVkIHRvIFBhdHJpY2sgTW9vcmUgJmx0O3BhdHJpY2ttQHJpb3BvcnQuY29tJmd0OyBvbiAwMy8wOS8yMDAxLgotIEFkZHMgYW5vdGhlciBjb25zdHJ1Y3RvciB0byBwYXNzIGluIHRoZSBlcnJvciBtZXNzYWdlLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTEvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMgRWxlbUF0dHJpYnV0ZS5qYXZhCi0gRWxlbUVsZW1lbnQuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkNoZWNraW4gYWRkcmVzc2VzIGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9OTIzLgotIGVsZW1BdHRyaWJ1dGUgbm93IGRlcml2ZXMgZnJvbSBlbGVtRWxlbWVudCBzbyB0aGUgYmFzaWMgbmFtZSByZXNvbHV0aW9uCi0gY29kZSBjYW4gYmUgc2hhcmVkLiBCcmVha3MgYXR0cmlic2V0MjQgdGVzdCwgYnV0IEkgdGhpbmsgdGhlIG5ld2VyCi0gYmVoYXZpb3IgaXMgYmV0dGVyLiBOZXcgdmlydHVhbCBtZXRob2RzIG92ZXJsb2FkZWQgYnkgZWxlbUF0dHJpYnV0ZSBhcmUKLSBjb25zdHJ1Y3ROb2RlLCByZXNvbHZlUHJlZml4LCBhbmQgdmFsaWRhdGVOb2RlTmFtZS4gQWxzbywgaW4gdGhlCi0gZWxlbUF0dHJpYnV0ZSNleGVjdXRlIG1ldGhvZCwgY2hlY2tzIGFyZSBtYWRlIHRvIG1ha2Ugc3VyZSBhbgotIGVsZW1lbnQgaXMgcGVuZGluZy48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzExLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveG1sL3V0aWxzIFN5c3RlbUlEUmVzb2x2ZXIuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkFkZGVkIGdldEFic29sdXRlVVJJKFN0cmluZyB1cmwpLCBhbmQgbWVyZ2UKLSB3aXRoIE15cmlhbSdzIGNoYW5nZXMuCi0gUGFydCBvZiBmaXggZm9yIHByb2JsZW0gZm91bmQgd2hlbgotIGludmVzdGlnYXRpbmcgaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD05MDYuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3NvcgotIFRyYW5zZm9ybWVyRmFjdG9yeUltcGwuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkNhbGwgZ2V0QWJzb2x1dGVVUkkoU3RyaW5nIHVybCkgZm9yIHRoZSBzb3VyY2UgVVJMLgotIEZpeCBmb3IgcHJvYmxlbSBmb3VuZCB3aGVuCi0gaW52ZXN0aWdhdGluZyBodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTkwNi4KLSBUaGlzIHRyaWVzIHRvIGZvcmNlIHVzIGFsd2F5cyBoYXZpbmcgYW4gYWJzb2x1dGUgVVJMIGluIHRoZSBwcm9jZXNzaW5nCi0gc3RhY2sgYXMgdGhlIGJhc2UgVVJMLCB3aGljaCBzaG91bGQgYmUgT0ssIEkgaG9wZS48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzExLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vdHJhbnNmb3JtZXIgVHJhbnNmb3JtZXJJbXBsLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5DYWxsIGdldEFic29sdXRlVVJJKFN0cmluZyB1cmwpIGZvciB0aGUgc291cmNlIFVSTC4KLSBGaXggZm9yIHByb2JsZW0gZm91bmQgd2hlbgotIGludmVzdGlnYXRpbmcgaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD05MDYuCi0gVGhpcyB0cmllcyB0byBmb3JjZSB1cyBhbHdheXMgaGF2aW5nIGFuIGFic29sdXRlIFVSTCBpbiB0aGUgcHJvY2Vzc2luZwotIHN0YWNrIGFzIHRoZSBiYXNlIFVSTCwgd2hpY2ggc2hvdWxkIGJlIE9LLCBJIGhvcGUuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyIFF1ZXVlZEV2ZW50cy5qYXZhCi0gUXVldWVkU3RhcnRFbGVtZW50LmphdmEgUmVzdWx0VHJlZUhhbmRsZXIuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPlRoZSB1c2VyIGZvciBodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTc0MSByZXBvcnRlZAotIHByb2JsZW1zIG9uIHRlc3RpbmcsIHNvIHRoZXNlIGNoYW5nZXMgYXJlIGEgcmUtZml4LiBIZSB0ZXN0ZWQgYW5kCi0gZXZlcnl0aGluZyBzZWVtcyBPSyBub3cuIFRoZXJlIGFjdHVhbGx5IG1heSBiZSBhIHNsaWdodCBwZXJmb3JtYW5jZQotIGltcHJvdmVtZW50IGludm9sdmVkIGhlcmUuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3NlcmlhbGl6ZSBTZXJpYWxpemVyVG9IVE1MLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BcHBsaWVkIHBhdGNoZXMgZnJvbSBkbWl0cmkuaWx5aW5AbWVtaXEuY29tIChEbWl0cmkgSWx5aW4pCi0gZnJvbSBodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTcwNS48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzExLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveHBhdGggWFBhdGhBUEkuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkFwcGxpZWQgcGF0Y2ggc3VibWl0dGVkIGJ5IG5ib3lkQGF0Zy5jb20gKE5vcnJpcyBCb3lkKQotIGF0IGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NzAyLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTEvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zZXJpYWxpemUgRW5jb2RpbmdzLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BcHBsaWVkIHBhdGNoIHN1Ym1pdHRlZCBieSBoYXZhcmR3QHVuZGVyZHVza2VuLm5vIChI5bahcmQgV2lndGlsKS4KLSBBbHNvIGFkZGVkICJYWFgtWCIgdmFyaWFudHMgZm9yIGFsbCAiWFhYX1giIGphdmEgZW5jb2RpbmcgbmFtZXMuCi0gSSdtIG5vdCB0b3RhbGx5IGNvbmZpZGVudCB0aGF0IHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLCBidXQgSSBjYW4ndAotIHNlZSB0aGF0IGl0IHdpbGwgaHVydCwgZXhjZXB0IHRvIG1ha2UgdGhlIHRhYmxlIGEgYml0IGxhcmdlci4gSQotIHdvdWxkIHByZWZlciB0byBiZSBzYWZlIGFuZCBtYWtlIHN1cmUgd2UgaGFuZGxlIHRoZSBlbmNvZGluZy4KLSBTZWUgbXkgY29tbWVudHMgaW4gaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD03MTguPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcyBFbGVtVGVtcGxhdGVFbGVtZW50LmphdmEKLSBTdHlsZXNoZWV0Um9vdC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+TWlub3IgY2hhbmdlcyB0byBiZXR0ZXIgYm90dGxlbmVjayB0aHJvd2luZyBvZiBSdW50aW1lIGV4Y2VwdGlvbnMKLSBkdXJpbmcgcHJvY2Vzc2luZy48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+c2JvYWdAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzExLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yCi0gVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Q2F0Y2ggYWxsIGV4Y2VwdGlvbnMgdGhyb3duIHdoZW4gcHJvY2Vzc2luZyBzdHlsZXNoZWV0LCBhbmQgc2VuZAotIHRoZW0gdG8gdGhlIGVycm9yIGxpc3RlbmVyLiBUaGVyZSdzIHByb2JhYmx5IHNvbWUgZGFuZ2VyIG9mIGhhdmluZwotIHRoZSBzYW1lIGVycm9yIHNlbnQgdG8gdGhlIGVycm9yIGxpc3RlbmVyIG11bHRpcGxlIHRpbWVzLCBidXQgYmV0dGVyIHRvbwotIG1hbnkgcmVwb3J0cywgdGhhbiBub25lLCBJIGd1ZXNzLgotIFRoaXMgYWRkcmVzc2VzIGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9OTA2Ljxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTEvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9saWIvc3FsIFhDb25uZWN0aW9uLmphdmEKLSBYU3RhdGVtZW50LmphdmE8YnIvPjxyZWY+QWRkZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vbGliL3NxbCBDb25uZWN0aW9uUG9vbC5qYXZhCi0gRGVmYXVsdENvbm5lY3Rpb25Qb29sLmphdmEgRXh0ZW5zaW9uRXJyb3IuamF2YQotIFBvb2xlZENvbm5lY3Rpb24uamF2YSBRdWVyeVBhcmFtZXRlci5qYXZhCi0gU1FMRXh0ZW5zaW9uRXJyb3IuamF2YSBYQ29ubmVjdGlvblBvb2xNYW5hZ2VyLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5UaGVzZSBhcmUgSm9obiBHZW50aWxpbiAmbHQ7am9obmdsaW51eEBleWVjYXRjaGluZy5jb20mZ3Q7Ci0gcGF0Y2hlcyBmb3IgY29ubmVjdGlvbiBwb29saW5nIGFuZCBwYXJhbWV0ZXJpemVkCi0gcXVlcmllcy4gVGhlc2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgdW5zdGFibGUKLSByaWdodCBub3csIGFzIHdlIGFyZSBzdGlsbCB3b3JraW5nIG9uIHNvbWUgdGhpbmdzLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTEvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9wcm9jZXNzb3IgUHJvY2Vzc29ySW5jbHVkZS5qYXZhCi0gVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9zZXJpYWxpemUgU2VyaWFsaXplclRvWE1MLmphdmEKLSBqYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3N0cmVlIFN0cmVlRE9NSGVscGVyLmphdmEKLSBqYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RyYW5zZm9ybWVyIFJlc3VsdFRyZWVIYW5kbGVyLmphdmEKLSBUcmFuc2Zvcm1lcklkZW50aXR5SW1wbC5qYXZhIFRyZWVXYWxrZXIyUmVzdWx0LmphdmEKLSBqYXZhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscyBBdHRMaXN0LmphdmEgVHJlZVdhbGtlci5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94cGF0aCBET00ySGVscGVyLmphdmEgWFBhdGhDb250ZXh0LmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5UaGUgRE9NMkhlbHBlciNpc05vZGVBZnRlcihOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSBtZXRob2QKLSBoYXMgYmVlbiBmaXhlZCBzbyB0aGF0IGl0IG5vIGxvbmdlciBkb2VzIHRoZSB0cnkvY2F0Y2ggdGhpbmcgaWYgb25lCi0gb2YgdGhlIG5vZGVzIGRvZXNuJ3QgaW1wbGVtZW50IERPTU9yZGVyLCBidXQgaW5zdGVhZCBkb2VzIGFuCi0gaW5zdGFuY2VvZiB0ZXN0LiBJbiBTdHJlZURPTUhlbHBlciwgaXQgb3ZlcmxvYWRzIHRoaXMgbWV0aG9kIGFuZAotICpkb2VzKiBkbyB0aGUgdHJ5L2NhdGNoIGJ1c2luZXNzLCBzaW5jZSBhbG1vc3QgYWx3YXlzIGJvdGggbm9kZXMKLSB3aWxsIGltcGxlbWVudCBET01PcmRlciBpbiB0aGlzIGNhc2UsIGFuZCB0aGlzIHdpbGwgYmUgZmFzdGVyIHRoYW4KLSBhbiBpbnN0YW5jZW9mIHRlc3QuIEFsc28sIGluIHZhcmlvdXMgY2xhc3NlcywgSSBkaWQgc29tZSBzdHVmZiB0byB0cnkKLSBhbmQgbWFrZSBzdXJlIHRoYXQgYSBET00ySGVscGVyIHdhc24ndCBiZWluZyBjcmVhdGVkIGFuZCB1c2VkCi0gd2hlbiBhIFN0cmVlRE9NSGVscGVyIGlzIG5lZWRlZC4KLQotIFRoaXMgYWRkcmVzc2VzIGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9ODAwCi0gYW5kIHNob3VsZCBnaXZlIGEgZ29vZCBwZXJmb3JtYW5jZSBmaXggZm9yIGZvcmVpZ24gRE9NIHByb2Nlc3NpbmcuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hwYXRoL3BhdHRlcm5zIE5vZGVUZXN0LmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5YZXJjZXMgYXQgc29tZSBwb2ludCBkZWNpZGVkIHRvIHVzZSAiIiBpbnN0ZWFkCi0gb2YgbnVsbCBmb3IgbnVsbCBuYW1lc3BhY2VzLiBUaGVyZSBoYXMgYmVlbiBhCi0gZGlzY3Vzc2lvbiBiZXR3ZWVuIEdhcnkgUGVza2luIGluCi0gSm9lIEtlc3NsZW1hbiBvbiB4YWxhbi1kZXYgYWJvdXQgdGhpcywKLSBidXQgSSBoYWRuJ3QgYmVlbiBmdWxseSBrZWVwaW5nIHVwIHRoZSB0aGUKLSB0aHJlYWQgdGhhdCB3ZWxsLCBhbmQgbWlzc2VkIGl0J3MgcmVsYXRpb24gdG8KLSB0aGlzIHByb2JsZW0uIEkgaW5jbHVkZSBzb21lIG9mIHRoZSBkaXNjdXNzaW9uCi0gYXQgdGhlIGVuZCBvZiB0aGlzIG5vdGUuIEkgbWFkZSBYYWxhbiBiZSBhYmxlIHRvCi0gY29tcGFyZSBhICIiIG5hbWVzcGFjZSB0byBudWxsIGZvciBub3csIHVudGlsCi0gd2UgZ2V0IHRoaXMgcmVzb2x2ZWQuCi0KLSBUaGUgZ2lzdCBvZiB0aGUgZGlzY3Vzc2lvbiBvbiB4YWxhbi1kZXYgcmVnYXJkaW5nIHRoaXMgaXM6Ci0KLSAmZ3Q7Jmd0OzEuIERlY2xhcmUgdGhlIFhlcmNlcy1KIHN1cHBvcnQgb2Ygc2NoZW1hcyB0byBoYXZlIGEgYnVnIGFuZCBhc2sgdGhhdAotICZndDsmZ3Q7WGVyY2VzIGJlIGNvcnJlY3RlZCB0byBhbHdheXMgdXNlIGEgbnVsbCBuYW1lc3BhY2UgVVJJIHRvIGluZGljYXRlIHRoYXQKLSAmZ3Q7Jmd0O3RoZXJlIGlzIG5vIGRlZmF1bHQgbmFtZXNwYWNlLiBFdmVuIGlmIHRoZSBYZXJjZXMgcGVvcGxlIGNoYW5nZSB0aGlzCi0gJmd0OyZndDtiZWhhdmlvciwgaXMgdGhpcyBjb3JyZWN0PwotICZndDsKLSAmZ3Q7IFllcy4gSWYgeW91ciBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSBpcyBhY2N1cmF0ZSAoeW91IHNob3VsZCBwcm9iYWJseQotICZndDsgc3VibWl0IGEgbW9yZSBkZXRhaWxlZCBjYXNlIHNvIGl0IGNhbiBiZSByZXByb2R1Y2VkIGluIHRoZSBsYWIpLCB0aGlzIGlzIGEKLSAmZ3Q7IHBhcnNlci9ET00tYnVpbGRlciBidWcuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmNvc3RpbkBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTIvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi9saWIvc3FsIEV4dGVuc2lvbkVycm9yLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5SZW1vdmVkICggY29tbWVudGVkIG91dCApIGR1bXAoKSBtZXRob2QgYW5kIHRoZSBpbXBvcnRzIGluIEV4dGVuc2lvbkVycm9yLgotCi0gU28gZmFyIHRoZSBtZXRob2QgZG9lc24ndCBzZWVtIHRvIGJlIHVzZWQgKCBubyB3YXJuaW5nIGluIHRoZSBjb21waWxlICkuCi0KLSBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoaXMgbWV0aG9kIGlzIGJyZWFraW5nIHRoZSBidWlsZCB3aXRoIGNyaW1zb24gKCBzaW5jZQotIGl0IHVzZXMgeGVyY2VzLXNwZWNpZmljIGNsYXNzZXMgKS4gSXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IGl0IG9uIHRvcAotIG9mIHRoZSBzZXJpYWxpemF0aW9uIGNsYXNzZXMgdGhhdCBhcmUgcGFydCBvZiB4YWxhbiAtIGlmIHNvbWVvbmUgbmVlZHMgdGhlCi0gbWV0aG9kIEknbGwgdHJ5IHRvIHBvcnQgaXQuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscyBUcmVlV2Fsa2VyLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BZGRlZCBiYWNrIGluIHRoZSBUcmVlV2Fsa2VyKENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyKQotIGNvbnN0cnVjdG9yLCBiZWNhdXNlIEknbSB3b3JyaWVkIEknbGwgYnJlYWsgbW9yZSBkZXBlbmRlbnQgY29kZS48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+bW1pZHlAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzEzLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vcmVzIFhTTFRFcnJvclJlc291cmNlcy5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IFByb2Nlc3MuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkltcGxlbWVudCBuZXcgYXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZTogVVJJUmVzb2x2ZXIsIAotRW50aXR5UmVzb2x2ZXIgYW5kIENvbnRlbnRIYW5kbGVyPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3RlbXBsYXRlcyBGdW5jRm9ybWF0TnVtYi5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4IGVycm9yIG1lc3NhZ2UgdG8gc2F5IHRoYXQgMiBvciAzIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3Byb2Nlc3NvciBQcm9jZXNzb3JMUkUuamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4vcmVzIFhTTFRFcnJvclJlc291cmNlcy5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+QmV0dGVyIGVycm9yIG1lc3NhZ2UgZm9yIG1pc3Npbmcgb3IgaW5jb3JyZWN0IFhTTFQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGluIGEgCi1zdHlsZXNoZWV0PGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmdhcnlwQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xMy8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2xpYiBSZWRpcmVjdC5qYXZhCi0gamF2YS9zcmMvb3JnL2FwYWNoZS94YWxhbi90cmFuc2Zvcm1lciBUcmFuc2Zvcm1lckltcGwuamF2YQotIGphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdCBQcm9jZXNzLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5SZW1lbWJlciB0aGUgUmVzdWx0IHRoYXQgd2FzIHVzZWQgdG8gdHJpZ2dlciB0aGUgdHJhbnNmb3JtLiBBY2Nlc3MgdGhhdCAKLXJlc3VsdCBmcm9tIHRoZSBSZWRpcmVjdCBleHRlbnNpb24gdG8gbWFrZSBmaWxlIHJlZmVyZW5jZXMgaW4gUmVkaXJlY3QgcmVsYXRpdmUgCi10byB0aGUgb3JpZ2luYWwgcmVzdWx0IFVSSS4KLSBJZiB0aGlzIGlzIG5vdCBhdmFpbGFibGUsIHJlZmVyZW5jZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgVVJJLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTQvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9zcmMvb3JnL2FwYWNoZS94cGF0aCBWYXJpYWJsZVN0YWNrLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BZGRlZCBwcm90ZWN0aW9uIGZvciBudWxsIHBvaW50ZXIgZXhjZXB0aW9uIHRoYXQgSSBkaXNjb3ZlcmVkIHdoZW4KLSBydW5uaW5nIHNvbWUgQ29jb29uIHRlc3RzLiBTaW5jZSBJJ3ZlIG5ldmVyIHNlZW4gdGhpcyBiZWZvcmUsCi0gSSBhc3N1bWUgdGhpcyBpcyByZWxhdGVkIHRvIHRoZSBjaGFuZ2VzIHRoYXQgR2FyeSBtYWRlLCBidXQgYW0KLSB1bnN1cmUgYXMgaXQncyA0OjAwIGluIHRoZSBtb3JuaW5nIGFuZCBJJ20gdG9vIHRpcmVkIHRvIGxvb2sgaW50byBpdCBkZWVwbHkuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmN1cmN1cnVAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzE0LzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdCBQcm9jZXNzLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5SZW1vdmUgY2hlY2sgZm9yIG1pc3NpbmcgLUlOIGFyZzsgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHVzZQotIGNhc2VzIGZvciBjYWxsaW5nIFByb2Nlc3MubWFpbiB3aXRob3V0IGFuIFhNTCBkb2N1bWVudDxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5jb3N0aW5AYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAzLzE0LzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdCBQcm9jZXNzLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BIChsYXN0ID8gKSBwbGFjZSB3aGVyZSBYTUxSZWFkZXJGYWN0b3J5IHdhcyB1c2VkIHdpdGhvdXQKLSB0cnlpbmcgamF4cCBmaXJzdC4gSSB1c2VkIHRoZSBzYW1lIGNvZGUgdGhhdCBpcyB1c2VkIGluIGFsbCBvdGhlcgotIHBsYWNlcyBpbiB4YWxhbi4KLQotIFdpdGggdGhpcyBjaGFuZ2UsIHRoZSBwYXJzZXIgZGVmaW5lZCBpbiBYU0xUSW5mby5wcm9wZXJ0aWVzIHdpbGwgYmUgdXNlZAotIG9ubHkgaWYgamF4cCBpcyBub3QgYXZhaWxhYmxlLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5kbGVzbGllQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xNC8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3htbC91dGlscyBTdHJpbmdWZWN0b3IuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkFkZGVkIG1pc3NpbmcgQHNlcmlhbCBKYXZhZG9jIHRhZ3MuPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPnNib2FnQGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMy8xNS8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL2xpYi9zcWwgQ29ubmVjdGlvblBvb2wuamF2YQotICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdENvbm5lY3Rpb25Qb29sLmphdmEgRXh0ZW5zaW9uRXJyb3IuamF2YQotICAgICAgICAgICAgICAgICAgICAgICAgU1FMRXh0ZW5zaW9uRXJyb3IuamF2YSBYQ29ubmVjdGlvbi5qYXZhCi0gICAgICAgICAgICAgICAgICAgICAgICBYQ29ubmVjdGlvblBvb2xNYW5hZ2VyLmphdmEgWFN0YXRlbWVudC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+VXBkYXRlIGZyb20gSm9obiBHZW50aWxpbiAmbHQ7am9obmdsaW51eEBleWVjYXRjaGluZy5jb20mZ3Q7IHRvCi0gIGZpeCBjb25uZWN0aW9uIGNsZWFudXAuPGJyLz48YnIvPjwvbGk+PC91bD48cD5Db21wYXRpYmlsaXR5IHNvdXJjZSBjb2RlIHVwZGF0ZXM6PC9wPjx1bD48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+bW1pZHlAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzAyLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQgWFNMVElucHV0U291cmNlLmphdmEKLSBYU0xUUmVzdWx0VGFyZ2V0LmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5JbXBsZW1lbnQgc29tZSBtb3JlIG1ldGhvZHMgZm9yIGNvbXBhdGliaWxpdHk8YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+ZGxlc2xpZUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMDIvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdCBYU0xUSW5wdXRTb3VyY2UuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkZpeGVkIGphdmFkb2MgZm9yIGFwaSB0aGF0IHdhcyBqdXN0IGFkZGVkIGJhY2suPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPmRsZXNsaWVAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzAyLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQgWFNMVFJlc3VsdFRhcmdldC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4ZWQgamF2YWRvYyBmb3IgYXBpIHRoYXQgd2FzIGp1c3QgYWRkZWQgYmFjay48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+bW1pZHlAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzAyLzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQgWFNMVEVuZ2luZUltcGwuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPkZpeCBwcm9ibGVtIHdpdGggY2FsbGluZyB0aGUgcHJvY2Vzc29yIHdpdGggYSBsaWFpc29uPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8wMi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IFhTTFRFbmdpbmVJbXBsLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5GaXggcHJvYmxlbSB3aGVyZSBzb3VyY2UgZmlsZSB3YXMgYmVpbmcgcGFyc2VkIG1vcmUgdGhhbiBvbmNlIGFuZCBpZiB1c2luZyBhbiAKLWlucHV0IHN0cmVhbSwgd2Ugd291bGQgZ2V0IGEgcmVhZCBlcnJvcjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5tbWlkeUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMTIvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdCBYU0xURW5naW5lSW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+U2V0IHN5c3RlbSBpZCBpbiBzdHlsZXNoZWV0IGhhbmRsZXI8YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+bW1pZHlAYXBhY2hlLm9yZzxyZWY+IG9uIDwvcmVmPjAyLzE0LzIwMDE8YnIvPjxyZWY+TW9kaWZpZWQ6IDwvcmVmPmphdmEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQgWFNMVElucHV0U291cmNlLmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5DYWxsIGxvY2FsIHNldFN5c3RlbUlkLjxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5tbWlkeUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDIvMTUvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdCBYU0xURW5naW5lSW1wbC5qYXZhPGJyLz48cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+Rml4IHByb2JsZW0gd2l0aCBwcm9jZXNzaW5nIGFuIGlucHV0IHNvdXJjZSBjcmVhdGVkIGZyb20gYSByZWFkZXIgd2l0aCBubyAKLXN5c3RlbUlkCi0gRml4IHByb2JsZW0gd2l0aCByZWFkaW5nIGFuIGlucHV0IHNvdXJjZSBmaWxlIHR3aWNlIGlmIGl0IGhhcyBhIFBJPGJyLz48YnIvPjwvbGk+PGxpPjxyZWY+Q29tbWl0dGVkIGJ5IDwvcmVmPm1taWR5QGFwYWNoZS5vcmc8cmVmPiBvbiA8L3JlZj4wMi8yMi8yMDAxPGJyLz48cmVmPk1vZGlmaWVkOiA8L3JlZj5qYXZhL2NvbXBhdF9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0IFN0eWxlc2hlZXRSb290LmphdmE8YnIvPjxyZWY+Q29tbWl0dGVyJ3MgbG9nIGVudHJ5OiA8L3JlZj5BZGQgZ2V0T3V0cHV0TWV0aG9kIEFQSS48YnIvPjxici8+PC9saT48bGk+PHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+ZGxlc2xpZUBhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMDcvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sCi0gWE1MUGFyc2VyTGlhaXNvbkRlZmF1bHQuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPlB1dCBpbiBBcGFjaGUgY29weXJpZ2h0Ljxici8+PGJyLz48L2xpPjxsaT48cmVmPkNvbW1pdHRlZCBieSA8L3JlZj5zYm9hZ0BhcGFjaGUub3JnPHJlZj4gb24gPC9yZWY+MDMvMTMvMjAwMTxici8+PHJlZj5Nb2RpZmllZDogPC9yZWY+amF2YS9jb21wYXRfc3JjL29yZy9hcGFjaGUveGFsYW4veHBhdGgveG1sIFRyZWVXYWxrZXIuamF2YQotIGphdmEvY29tcGF0X3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHQgWFNMVEVuZ2luZUltcGwuamF2YTxici8+PHJlZj5Db21taXR0ZXIncyBsb2cgZW50cnk6IDwvcmVmPk1hZGUgY2hhbmdlcyBmb3IgY2hhbmdlIHRvIEFQSSBmb3IgWGFsYW5KMiBUcmVlV2Fsa2VyLCB3aGljaAotIG5vdyByZXF1aXJlcyB0aGF0IHRoZSBET00gaGVscGVyIGJlIGNyZWF0ZWQgYnkgdGhlIGNhbGxlci48L2xpPgotIDwvdWw+Ci08L3MzPgotCi08czMgdGl0bGU9IkNoYW5nZXMgZm9yICZ4c2x0NGo7IHZlcnNpb24gMi4wLjAiPgotPHA+UmVsZWFzZSAyLjAgaW5jbHVkZXMgc2V2ZXJhbCBidWcgZml4ZXMgdG8gdGhlICZ4c2x0NGo7IGFuZCBUckFYIGNvcmUgYW5kIHRvIHRoZSBYYWxhbi1KYXZhIDEgY29tcGF0aWJpbGl0eSBBUEkuIFdlIGFsc28gdXBkYXRlZCBic2YuamFyIHRvIHRoZSA8cmVzb3VyY2UtcmVmIGlkcmVmPSJic2YiLz4gcmVsZWFzZSBjYW5kaWRhdGUgMi4yLCB3aGljaCBmaXhlcyBhIGJ1ZyBydW5uaW5nIEpQeXRob24gZXh0ZW5zaW9ucy48L3A+Ci08cD48ZW0+Q29yZSBidWcgZml4ZXM6PC9lbT48L3A+Ci08dWw+Ci0gIDxsaT5BIHRocmVhZGluZyBwcm9ibGVtIHNob3dlZCB1cCB3aGVuIHVzaW5nIG11bHRpcGxlIHByb2Nlc3NvcnMuIFdlIGZpeGVkIGl0IGJ5IHVzaW5nIGEgc2VwYXJhdGUgWFBhdGhDb250ZXh0IG9iamVjdCB0byBkbyB3aGl0ZXNwYWNlIG5vZGUKLSAgIG1hdGNoZXMgKHhzbDpzdHJpcC1zcGFjZSkuPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5GaXhlZCBhIGJ1ZyBydW5uaW5nIE5vcm0gV2Fsc2gncyBEb2NCb29rIHN0eWxlc2hlZXRzIGJ5IG5vdCBzZXR0aW5nIHRoZSB2YXJpYWJsZSBzdGFjayBwb3NpdGlvbiBpZiB0aGUgRmlsdGVyRXhwcldhbGtlciBpcyBub3Qgb3duZWQgYnkgYQotICB0b3AtbGV2ZWwgTm9kZUl0ZXJhdG9yLjxici8+PGJyLz48L2xpPgotICA8bGk+Rml4ZWQgYSBwcm9ibGVtIHdpdGggbnVsbCBuYW1lc3BhY2UgYmVpbmcgcGFzc2VkIGZyb20geHNsOmVsZW1lbnQuIFRoaXMgYnVnIGFsc28gc3VyZmFjZWQgd2hpbGUgcHJvY2Vzc2luZyBEb2NCb29rCi0gICBzdHlsZXNoZWV0cy48YnIvPjxici8+PC9saT4KLSAgPGxpPkluIHRoZSBpbnRlcmVzdCBvZiBzdGFiaWxpdHksIHdlIG5vdyB0cmVhdCAidW5rbm93biBlcnJvciBpbiBYUGF0aCIgYXMgYSBmYXRhbCBlcnJvci48YnIvPjxici8+PC9saT4KLSAgPGxpPkFkZGVkIHN1cHBvcnQgaW4gc3R5bGVzaGVldCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBmb3IgInRleHQveG1sIiBhbmQgImFwcGxpY2F0aW9uL3htbCt4c2x0IiBtaW1lIHR5cGVzLjxici8+PGJyLz48L2xpPgotICA8bGk+Rml4ZWQgdG9rZW5pemluZyBvZiBzdHlsZXNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIHRvIGFsbG93IHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIHNlcnZlciBpbiBocmVmIGF0dHJpYnV0ZXMuPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5GaXhlZCBhIGJ1ZyBwYXNzaW5nIFRyYW5zZm9ybWVyIGNyZWF0aW9uIGVycm9yIG1lc3NhZ2VzIHRvIEVycm9yTGlzdGVuZXIgd2hlbiBhbiBFcnJvckxpc3RlbmVyIGhhcyBiZWVuIHNldCBvbgotICAgVHJhbnNmb3JtZXJGYWN0b3J5Ljxici8+PGJyLz48L2xpPgotICA8bGk+V2hlbiB1c2luZyBhbiBFeGNlcHRpb24gdG8gaW5zdGFudGlhdGUgYSBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIChleHRlbmRzIEVycm9yKSwgd2Ugbm93IHByb3BhZ2F0ZSB0aGUgRXhjZXB0aW9uIG1lc3NhZ2UgdG8gCi0gIHN1cGVyKCkuPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5BZGRlZCBkZWZlbnNpdmUgY29kZSB0byBFbGVtVGVtcGxhdGVFbGVtZW50IGZvciBoYW5kbGluZyBhIG51bGwgVVJJLjxici8+PGJyLz48L2xpPgotICA8bGk+V2hlbiB1c2luZyBhbiBFeGNlcHRpb24gdG8gaW5zdGFudGlhdGUgYSBUcmFuc2Zvcm1lckV4Y2VwdGlvbiAoZXh0ZW5kcyBFeGNlcHRpb24pLCB3ZSBub3cgcHJvcGFnYXRlIHRoZSBFeGNlcHRpb24gbWVzc2FnZSB0byBzdXBlcigpIAotICByYXRoZXIgdGhhbiBhIGdlbmVyaWMgbWVzc2FnZS48YnIvPjxici8+PC9saT4KLSAgPGxpPkZpeGVkIGEgYnVnICh0aGUgZ2VuZXJhdGlvbiBvZiBhbiB1bndhbnRlZCBlbnRpdHkgcmVmZXJlbmNlKSBwZXJmb3JtaW5nIHRoZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiAKLSAgKHNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJzZXJpYWxpemUiPlNlcmlhbGl6aW5nIG91dHB1dDwvbGluaz4pIHdpdGggYW4gWE1MIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBET0NUWVBFCi0gICBkZWNsYXJhdGlvbi48YnIvPjxici8+PC9saT4KLSAgIDxsaT5NZXNzYWdlIG1hbmFnZXIgbW9kaWZpZWQgc28gdGhhdCB0aGUgU291cmNlTG9jYXRvciBtdXN0IGFsd2F5cyBiZSBwYXNzZWQgaW4sCi0gIHdoaWNoIHdpbGwgbWFrZSBhIG1ham9yIGRpZmZlcmVuY2UgaW4gZ2V0dGluZyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi48YnIvPjxici8+PC9saT4gCi0gIDxsaT54c2w6ZWxlbWVudCdzIGhhbmRsaW5nIG9mIG5hbWVzcGFjZSBhdHRyaWJ1dGUgYW5kIHByZWZpeCBpbgotICBuYW1lIGF0dHJpYnV0ZSBjaGFuZ2VkIHNvIHRoYXQgaXQgbm8gbG9uZ2VyIG1hbnVmYWN0dXJlcyBwcmVmaXhlcy4uLgotICBpdCBhbHdheXMgdHJpZXMgaXRzIGJlc3QgdG8gbWF0Y2ggdGhlIHByZWZpeCBlbnRlcmVkLjxici8+PGJyLz48L2xpPiAgCi0gIDxsaT5CdWcgZml4ZWQgd2l0aCBuYW1lc3BhY2UgY29udGV4dHMgaW4gdGhlIHN0eWxlc2hlZXQgcHJvY2Vzc29yLgotICBUaGUgYnVnIGNvdWxkIGNhdXNlICZsdDthIHhtbG5zOmE9IngiJmd0OyZsdDtiJmd0OyB0byBwcm9kdWNlICZsdDthIHhtbG5zOmE9IngiJmd0OyZsdDtiIHhtbG5zOmE9IngiJmd0Oy48YnIvPjxici8+PC9saT4gIAotICA8bGk+TW9kaWZpZWQgcHJvY2Vzc2luZyBvZiB4c2w6bWVzc2FnZSB0byBlbmhhbmNlIGl0IGFzIGEgZGVidWdnaW5nIGFpZC4gTGluZSBudW1iZXJzIGFyZSBub3cgb3V0cHV0IHdpdGggZWFjaAotICBtZXNzYWdlLiBJZiB0aGUgdGVybWluYXRlIGF0dHJpYnV0ZSBpcyB0cnVlICh0aGUgZGVmYXVsdCBpcyBmYWxzZSkgdGhlIG1lc3NhZ2UgaXMgc2VudCB0byB0aGUgY29uc29sZSwgYW5kIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2l0aCB0aGUKLSAgbWVzc2FnZSAiU3R5bGVzaGVldCBkaXJlY3RlZCB0ZXJtaW5hdGlvbiIuPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5JbiBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgY2hlY2sgdGhhdCB0aGUgY2F1c2UgIT0gbnVsbCB3aGVuIGNoZWNraW5nIGZvciBhIGNvbnRhaW5lZCBleGNlcHRpb24uPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5GaXhlZCBhIHByb2JsZW0gdmFsaWRhdGluZyBub24tbmFtZXNwYWNlZCBhdHRyaWJ1dGVzIGFuZCBhIHByb2JsZW0gYWxsb3dpbmcgbm9uLW5hbWVzcGFjZWQgYXR0cmlidXRlcyB0byBiZSBjaGlsZHJlbiBvZiB0aGUKLSAgIHN0eWxlc2hlZXQgZWxlbWVudC48YnIvPjxici8+PC9saT4KLSAgIDxsaT5GaXhlZCBjaGVja2luZyBvZiBudW1iZXIgb2YgYXJndW1lbnRzIGluIGRvY3VtZW50KCkgZnVuY3Rpb24uPGJyLz48YnIvPjwvbGk+Ci0gICA8bGk+Rml4ZWQgcHJvYmxlbSB3aXRoIG11dGF0aW9uIG9mIHRlbXBsYXRlcyBhdCBydW4gdGltZS4gVGVtcGxhdGVzIHJlc29sdXRpb24gbm93IHRha2VzIHBsYWNlIGR1cmluZyB0aGUgY29tcG9zZSgpIG1ldGhvZC48YnIvPjxici8+PC9saT4KLSAgIDxsaT5GaXhlZCBzb21lIG1pbm9yIHRocmVhZGluZyBpc3N1ZXMgaW4gb3JnLmFwYWNoZS54YWxhbi5zdHJlZSAoQ2hpbGQsIFBhcmVudCwgRWxlbWVudEltcGwsIFNvdXJjZVRyZWVIYW5kbGVyKS48YnIvPjxici8+PC9saT4KLSAgIDxsaT5TeW5jaHJvbml6ZWQgVHJBWCBBUEkgZnVuY3Rpb25zIHN1YmplY3QgdG8gbXV0YXRpb24gdG8gcHJldmVudCBtdXRhdGlvbiBkdXJpbmcgYSB0cmFuc2Zvcm1hdGlvbi48YnIvPjxici8+PC9saT4KLSAgIDxsaT5GaXhlZCBidWcgcmVwb3J0ZWQgYnkgSmFubyBFbG92aXJ0YTogc3Vic3RyaW5nKCkgd2FzIHJldHVybmluZyBhbiBlcnJvciBpZiB0aGUgc3RhcnQgaW5kZXggaXMgbGFyZ2VyIHRoYW4gdGhlIHN0cmluZy48YnIvPjxici8+PC9saT4gICAKLSAgIDxsaT5TZXQgU3RyaW5nS2V5LnRvU3RyaW5nKCkgdG8gcmV0dXJuIHRoZSB1bmRlcmx5aW5nIFN0cmluZyAobV9zdHIpLCB0aHVzIGF2b2lkaW5nIGEgcG90ZW50aWFsIHN5bW1ldHJ5IHByb2JsZW0gd2l0aCB0aGUgZXF1YWxzKCkgbWV0aG9kCi0gICByZXBvcnRlZCBieSBJdG8gS2F6dW1pdHN1Ljxici8+PGJyLz48L2xpPgotICAgPGxpPkluIHJlc3BvbnNlIHRvIG5vdGUgZnJvbSBJdG8gS2F6dW1pdHN1LCBjaGFuZ2VkIEphdmEgZW5jb2RpbmcgbmFtZSAiRVVDSklTIiBpbiBGb3JtYXR0ZXJUb1hNTCB0byAiRVVDX0pQIi48YnIvPjxici8+PC9saT4KLSAgIDxsaT5XaGVuIFhhbGFuIGNyZWF0ZXMgYSBGaWxlT3V0cHV0U3RyZWFtLCBpdCBub3cgY2xvc2VzIHRoZSBzdHJlYW0gYmVmb3JlIGV4aXRpbmcuPGJyLz48YnIvPjwvbGk+Ci0gICA8bGk+Rml4ZWQgaGFuZGxpbmcgb2YgYW4gZXhjZXB0aW9uIHRoYXQgY2FuIGJlIHRocm93biB3aGlsZSBidWlsZGluZyBhIERPTS48YnIvPjxici8+PC9saT4KLSAgIDxsaT5GaXhlZCBhIHByb2JsZW0gcmVwb3J0ZWQgYnkgRGltaXRyeSBWb3l0ZW5rbyBzZXJpYWxpemluZyBjb21waWxlZCBzdHlsZXNoZWV0cy48YnIvPjxici8+PC9saT4KLSAgIDxsaT5Gb3Igc3VwcG9ydCBvZiBhcHBsZXRzLCBtb2RpZmllZCBUcmFuc2Zvcm1lckZhY3RvcnkgU3lzdGVtLmdldFByb3BlcnR5KCkgY2FsbHMgdG8gY2F0Y2ggU2VjdXJpdHlFeGNlcHRpb25zLjxici8+PGJyLz48L2xpPgotICAgPGxpPkZpeGVkIGEgYnVnIHJlcG9ydGVkIGJ5IEtyaXNobmEgTW9oYW4gTWVkdXJpIHNldHRpbmcgb3V0cHV0IHByb3BlcnRpZXMuPGJyLz48YnIvPjwvbGk+Ci0gICA8bGk+Rml4ZWQgZXJyb3IgcmVjb3Zlcnkgd2hlbiB4c2w6ZWxlbWVudCBlbmNvdW50ZXJzIGEgYmFkIG5hbWUgb3IgdW5yZXNvbHZhYmxlIHByZWZpeC48YnIvPjxici8+PC9saT4KLSAgIDxsaT5BZGRlZCBBYnN0cmFjdE1ldGhvZEVycm9yIGhhbmRsaW5nIHRvIGV4aXN0aW5nIE5vU3VjaE1ldGhvZEVycm9yIGhhbmRsaW5nIGFzIGEgZmFsbGJhY2sgdG8gdGhlIFhNTFJlYWRlckZhY3RvcnkgZm9yIFhNTCBwYXJzZXJzIHRoYXQgZG8KLSAgICAgICBub3QgaW1wbGVtZW50IHRoZSBKQVhQIHBhcnNlcnMgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBhbiBYTUxSZWFkZXI8YnIvPjxici8+PC9saT4KLSAgIDxsaT5GaXhlZCBidWcgd2l0aCBjbG9uZWQgaXRlcmF0b3JzIHJlcG9ydGVkIGJ5IFRpbSBTZWFuLjxici8+PGJyLz48L2xpPgotICAgPGxpPkZpeGVkIG51bGwgcG9pbnRlciBleGNlcHRpb24gdGhhdCBjb3VsZCBvY2N1ciB3aXRoIGdldFZhbHVlKCJ4eHgiKS48YnIvPjxici8+PC9saT4KLSAgIDxsaT5GaXhlZCBidWcgcmVwb3J0ZWQgYnkgVGltIFNlYW4gaGFuZGxpbmcgdGhlIHhtbDpzcGFjZSBhdHRyaWJ1dGUuPC9saT4KLTwvdWw+Ci08cD48ZW0+QnVnIGZpeGVzIGluIHRoZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJjb21wYXQiPlhhbGFuLUphdmEgMSBjb21wYXRpYmlsaXR5IEFQSTwvbGluaz46PC9lbT48L3A+Ci08dWw+Ci0gIDxsaT5GaXhlZCBQcm9ibGVtTGlzdGVuZXIgKGZvciBwcm9jZXNzaW5nIGVycm9yIG1lc3NhZ2VzKSB0byBkZXJpdmUgZnJvbSAmeHNsdDRqOyAyIEVycm9ySGFuZGxlci48YnIvPjxici8+PC9saT4KLSAgPGxpPkZpeGVkIGV2YWx1YXRpb24gb2Ygc3R5bGVzaGVldCBzdHJpbmcgcGFyYW1ldGVycyB0byBjb25mb3JtIHRvICZ4c2x0NGo7IDEgYmVoYXZpb3IgKGV4cHJlc3Npb25zIGZvciAmeHNsdDRqOyAxIHZzLiBTdHJpbmcgb2JqZWN0cyAKLSAgZm9yICZ4c2x0NGo7IDIpLjxici8+PGJyLz48L2xpPiAgICAKLSAgPGxpPkFkZGVkIFhQYXRoU3VwcG9ydCBhbmQgWFBhdGhTdXBwb3J0RGVmYXVsdCwgYW5kIGZpeGVkIHRoZSBkZXJpdmF0aW9uIG9mIFhPYmplY3Qgc3ViLXR5cGVzIChYU3RyaW5nLCBldGMuKS48YnIvPjxici8+PC9saT4KLSAgPGxpPkZpeGVkIGJ1ZyB3aXRoIFhTTFRQcm9jZXNzb3IgcHJvY2Vzcyh4bWxJbiwgbnVsbCwgb3V0KSBtZXRob2Qgc28gdGhhdCBpdCB1c2VzIHRoZSBTdHlsZXNoZWV0Um9vdCAoaWYgb25lIGV4aXN0cykgdGhhdCBoYXMgYmVlbiBjcmVhdGVkCi0gICB3aXRoIHRoZSBwcm9jZXNzU3R5bGVzaGVldCgpIG1ldGhvZC48L2xpPgotPC91bD4KLTxwPkZvciBhIGxpc3Qgb2YgdGFza3MgaW4gdGhlICZ4c2x0NGoyOyBUby1EbyBsaXN0IHRoYXQgaGF2ZSBiZWVuIGNvbXBsZXRlZCwgc2VlIDxqdW1wIGhyZWY9InRvZG8uaHRtbCNyZWxlYXNlLWRhdGUtY29tcGxldGVkIj5UYXNrcyBjb21wbGV0ZWQ8L2p1bXA+LjwvcD4KLTwvczM+Ci0KLTxzMyB0aXRsZT0iQ2hhbmdlcyBmb3IgJnhzbHQ0ajsgdmVyc2lvbiAyLjAuRDA3Ij4KLTxwPiZ4c2x0NGo7IDIuMC5EMDcgaW5jb3Jwb3JhdGVzIGEgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0iY29tcGF0Ij5YYWxhbi1KYXZhIDEgY29tcGF0aWJpbGl0eSBqYXI8L2xpbms+LCBzb21lIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cywgYW5kIGEgbnVtYmVyIG9mIGJ1ZyBmaXhlcyBmb3IgYnVncyBmb3VuZCBpbiB2ZXJzaW9uIDIuMC5EMDYuPC9wPgotPHVsPgotPGxpPkZpeGVkIGhhbmRsaW5nIG9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJubyIuICBQcmV2aW91c2x5LCBvbmNlIGl0IHdhcyB0dXJuZWQgb24sIGl0IGNvdWxkIG5vdCBiZSB0dXJuZWQgb2ZmLjxici8+PGJyLz48L2xpPgotPGxpPkZpeGVkIGEgYnVnIHdpdGggd2hpdGVzcGFjZSBoYW5kbGluZyB3aGVyZSBYYWxhbiB3YXMgaW5jb3JyZWN0bHkgY2hlY2tpbmcgZm9yIHdoaXRlc3BhY2UgCi0gICAgc3RyaXBwaW5nIGJlZm9yZSBjb2xsYXRpb24gb2YgbXVsdGlwbGUgd2hpdGVzcGFjZSBldmVudHMgaW50byBhIHNpbmdsZSB0ZXh0IG5vZGUuPGJyLz48YnIvPjwvbGk+Ci08bGk+V2hpdGVzcGFjZSBzdHJpcHBpbmcgd2Fzbid0IHdvcmtpbmcgd2l0aCBpbnB1dCBET01zIGJlZm9yZS4gIFRoaXMgaXMgbm93IGZpeGVkLjxici8+PGJyLz48L2xpPgotPGxpPkZpeGVkIG1hbnkgZXhjZXB0aW9uIGhhbmRsaW5nIHByb2JsZW1zIGFuZCBwcm9ibGVtcyB3aXRoIGVycm9yIHJlcG9ydGluZy48YnIvPjxici8+PC9saT4KLTxsaT5GaXhlZCBhIGJ1ZyByZXNldHRpbmcgcGFyYW1ldGVycyBpbiBUcmFuc2Zvcm1lciBjbGVhclBhcmFtZXRlcnMoKS48YnIvPjxici8+PC9saT4KLTxsaT5GaXhlZCBhIGJ1ZyB3aGVyZSBDREFUQSBzZWN0aW9ucyB3ZXJlIG5vdCBtYXRjaGluZyB0aGUgdGV4dCgpIG5vZGUgdGVzdC48YnIvPjxici8+PC9saT4KLTxsaT5NYWRlIGJldHRlciBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtIHdpdGggcmVzdWx0IHRyZWUgZnJhZ21lbnRzLjxici8+PGJyLz48L2xpPgotPGxpPk1hZGUgcmVzdWx0IHRyZWUgZnJhZ21lbnQgcGFyc2luZyBvZiBudW1iZXJzIGNvbnNpc3RlbnQgd2l0aCBzdHJpbmdzLjxici8+PGJyLz48L2xpPgotPGxpPkV4Y2VwdGlvbnMgdGhyb3duIGZyb20gZXh0ZW5zaW9ucyBzaG91bGQgbm93IGJlIHByb3Blcmx5IHJlcG9ydGVkIHZpYSB0aGUgZXJyb3IgbGlzdGVuZXIuPGJyLz48YnIvPjwvbGk+Ci08bGk+Rml4ZWQgaGFyZC1jb2RlZCBzdGFjayBkdW1wIHNldCBvZmYgYnkgbV9yZXBvcnRJblBvc3RFeGNlcHRpb25Gcm9tVGhyZWFkIHZhcmlhYmxlLjxici8+PGJyLz48L2xpPgotPGxpPkZpeGVkIGludGVybWl0dGVudCB0aHJlYWRpbmcgcHJvYmxlbSB3aXRoIHRleHQgbm9kZXMgYmVpbmcgZHJvcHBlZC48YnIvPjxici8+PC9saT4KLTxsaT5GaXhlZCBwcm9ibGVtIHdpdGggdmFyaWFibGUgZXZhbHVhdGlvbiBpbnNpZGUgb2YgdW5pb24gZXhwcmVzc2lvbnMuPC9saT4KLTwvdWw+Ci08L3MzPgotPHMzIHRpdGxlPSJDaGFuZ2VzIGZvciAmeHNsdDRqOyB2ZXJzaW9uIDIuMC5EMDYiPgotPHA+V2UgaGF2ZSBmaXhlZCB0aGUgYnVncyByZXBvcnRlZCBpbiAmeHNsdDRqOyAyLjAuRDA1LiBBbG9uZyB3aXRoIHNldmVyYWwgb3RoZXIgZW5oYW5jZW1lbnRzLCAKLXdlIGhhdmUgYWxzbyBmaXhlZCBhIG51bWJlciBvZiBidWdzIGZvdW5kIGJ5IHRlc3RpbmcgYW5kIG91ciB1c2Vyczo8L3A+Ci08dWw+Ci08bGk+Rml4ZWQgc29tZSB0aHJlYWRpbmcgcHJvYmxlbXMgYW5kIGltcHJvdmVkIHN1cHBvcnQgZm9yIGhhbmRsaW5nIEV4Y2VwdGlvbnMgdGhyb3duIGluIGEgc2Vjb25kYXJ5IHRocmVhZC48YnIvPjxici8+Ci1Ob3RlOiBUbyBzdXBwb3J0IGluY3JlbWVudGFsIG91dHB1dCwgJnhzbHQ0ajsgcGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9uIGluIGEgc2Vjb25kIHRocmVhZCB3aGlsZSBidWlsZGluZyB0aGUgc291cmNlIHRyZWUgaW4gdGhlIG1haW4gdGhyZWFkLjxici8+PGJyLz48L2xpPgotPGxpPkZpeGVkIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHBpcGluZyAodXRpbGl6aW5nIHRyYW5zZm9ybWF0aW9uIG91dHB1dCBhcyBpbnB1dCBmb3IgYW5vdGhlciB0cmFuc2Zvcm1hdGlvbikuPGJyLz48YnIvPjwvbGk+Ci08bGk+Rml4ZWQgcHJvYmxlbXMgaGFuZGxpbmcgYXR0cmlidXRlcyBhbmQgYWRkaW5nIGF0dHJpYnV0ZXMgdG8gcmVzdWx0IHRyZWUuPGJyLz48YnIvPjwvbGk+Ci08bGk+QWRkZWQgZGVmZW5zaXZlIGNoZWNraW5nIGZvciBudWxsIGVudGl0aWVzLCBudWxsIG5hbWVzcGFjZXMsIGFuZCBlbXB0eSBzdHJpbmdzIHBhc3NlZCBpbiBmb3IgVVJJcyBhbmQgbG9jYWwgbmFtZXMuPGJyLz48YnIvPjwvbGk+Ci08bGk+V2Ugbm93IGNvbmZvcm0gdG8gdGhlIFNBWCBjb252ZW50aW9uIG9mIHJlcHJlc2VudGluZyBudWxsIG5hbWVzcGFjZXMgd2l0aCBlbXB0eSBzdHJpbmdzLjxici8+PGJyLz48L2xpPgotPGxpPkZpeGVkIGEgYnVnIGVuY291bnRlcmVkIGV2YWx1YXRpbmcgYSB2YXJpYWJsZSBpbiBhIHByZWRpY2F0ZSBleHByZXNzaW9uIGFwcGxpZWQgdG8gY2hpbGQgbm9kZXMuPGJyLz48YnIvPjwvbGk+Ci08bGk+Q2hhbmdlZCBuYW1lcyBvZiBzZXJpYWxpemVycyBmcm9tIEZvcm1hdHRlclRvPHJlZj5YeHg8L3JlZj4gdG8gU2VyaWFsaXplclRvPHJlZj5YeHg8L3JlZj4uIFNlZSAKLTxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9zZXJpYWxpemUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPlBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemU8L2p1bXA+Ljxici8+PGJyLz48L2xpPgotPGxpPkltcHJvdmVkIGRlYnVnZ2luZyBzdXBwb3J0IGluIGEgbnVtYmVyIG9mIGFyZWFzLjwvbGk+Ci08L3VsPgotPC9zMz4KLTxzMyB0aXRsZT0iQ2hhbmdlcyBmb3IgJnhzbHQ0ajsgdmVyc2lvbiAyLjAuRDA1Ij4KLTxwPkFsbCBvZiB0aGUgYnVncyByZXBvcnRlZCBpbiAmeHNsdDRqOyAyLjAuRDAxIGhhdmUgYmVlbiBmaXhlZC4gVGhlIHJlbWFpbmRlciBvZiB0aGlzIHNlY3Rpb24gZGlzY3Vzc2VzIHR3byBjaGFuZ2VzIHRoYXQgd2UgYmVsaWV2ZSBhcmUgb2YgcGFydGljdWxhciBpbXBvcnRhbmNlOjwvcD4KLTxwPjxlbT5UckFYPC9lbT48L3A+Ci08cD5UaGUgVHJhbnNmb3JtYXRpb24gQVBJIGZvciBYTUwgKFRyQVgpIHRoYXQgJnhzbHQ0ajI7IGltcGxlbWVudHMgaGFzIHVuZGVyZ29uZSBzdWJzdGFudGlhbCByZXZpc2lvbnMgc2luY2UgdGhlIHJlbGVhc2Ugb2YgJnhzbHQ0ajsgMi4wLkQwMS4gVHJBWCBoYXMgam9pbmVkIHRoZSBKYXZhIEFQSSBmb3IgWE1MIFBhcnNpbmcgKEpBWFApIGFzIHBhcnQgb2YgdGhlIFN1biZyZWc7IDxyZXNvdXJjZS1yZWYgaWRyZWY9ImpzcjA2MyIvPi4gQWNjb3JkaW5nbHksIHRoZSBUckFYIHBhY2thZ2UgbmFtZXMgaGF2ZSBjaGFuZ2VkLiBUaGUgY29uY2VwdHVhbCBvcmdhbml6YXRpb24gaGFzIGFsc28gY2hhbmdlZCBzb21ld2hhdDogVGhlIHByaW1hcnkgdHJhbnNmb3JtYXRpb24gaW50ZXJmYWNlcyBhcmUgZGVmaW5lZCBpbiBqYXZheC54bWwudHJhbnNmb3JtLCB3aXRoIGNvbmNyZXRlIGNsYXNzZXMgZm9yIG1hbmFnaW5nIHN0cmVhbSBpbnB1dC9vdXRwdXQsIFNBWCBwYXJzZXJzIGFuZCBDb250ZW50SGFuZGxlciwgYW5kIERPTSBwYXJzZXJzIGFuZCBET00gdHJlZXMgaW4gamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0sIGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LCBhbmQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPHJlc291cmNlLXJlZiBpZHJlZj0idHJheCIvPiwgYW5kIHJldmlldyA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyI+VXNhZ2UgUGF0dGVybnM8L2xpbms+LjwvcD4KLTxhbmNob3IgbmFtZT0ib3V0cHV0cHJvcHMiLz48cD48ZW0+T3V0cHV0IHByb3BlcnRpZXM8L2VtPjwvcD4KLTxwPlRoZSBoYW5kbGluZyBvZiB4c2w6b3V0cHV0IHByb3BlcnRpZXMgaGFzIGNoYW5nZWQ6IG9yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplLk91dHB1dEZvcm1hdCBhbmQgYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5PdXRwdXRGb3JtYXRFeHRlbmRlZCB3ZXJlIHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuT3V0cHV0UHJvcGVydGllcy4gVGhlIFNlcmlhbGl6ZXJGYWN0b3J5IGdldFNlcmlhbGl6ZXIoKSBtZXRob2Qgbm93IHRha2VzIFByb3BlcnRpZXMgcmF0aGVyIHRoYW4gYSBTdHJpbmcgaW5kaWNhdGluZyB0aGUgb3V0cHV0IG1ldGhvZC4gWW91IGNhbiByZXBsYWNlIDxjb2RlPmdldFNlcmlhbGl6ZXIoInhtbCIpPC9jb2RlPiwgZm9yIGV4YW1wbGUsIHdpdGggPGNvZGU+Z2V0U2VyaWFsaXplcihPdXRwdXRQcm9wZXJ0aWVzLmdldERlZmF1bHRNZXRob2RQcm9wZXJ0aWVzKCJ4bWwiKSk8L2NvZGU+LjwvcD4KLTxwPkhUTUwsIFhNTCwgYW5kIHRleHQgeHNsOm91dHB1dCBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgaW4gcHJvcGVydHkgZmlsZXMgaW4gb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXM6IG91dHB1dF9odG1sLnByb3BlcnRpZXMsIG91dHB1dF94bWwucHJvcGVydGllcywgYW5kIG91dHB1dF90ZXh0LnByb3BlcnRpZXMuPC9wPgotPHA+WW91IGNhbiBzdGFydCB1c2luZyB0aGUgb3V0cHV0IHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGVzZSBmaWxlcyBpbiB5b3VyIHN0eWxlc2hlZXRzLiBGb3IgZXhhbXBsZSwgeW91IGNhbiB0dXJuIFVSTCBlc2NhcGluZyBvZmYgaW4gSFRNTCBvdXRwdXQgd2l0aDxici8+PGNvZGU+e2h0dHBcdTAwM2EvL3htbC5hcGFjaGUub3JnL3hzbHR9dXNlLXVybC1lc2NhcGluZz1ubzwvY29kZT48YnIvPgotYW5kIHlvdSBjYW4gY29udHJvbCBpbmRlbnRpbmcgd2l0aDxici8+Ci08Y29kZT57aHR0cFx1MDAzYS8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50PTxyZWY+bjwvcmVmPjwvY29kZT48L3A+Ci08bm90ZT5UaGUgY29sb24gYWZ0ZXIgdGhlICJodHRwIiBwcm90b2NvbCBtdXN0IGJlIGVzY2FwZWQuPC9ub3RlPgotPHA+Q2hhcmFjdGVyLXRvLWVudGl0eSBtYXBwaW5nIGlzIHNwZWNpZmllZCBpbiBvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZTogSFRNTEVudGl0aWVzLnJlcyBhbmQgWE1MRW50aXRpZXMucmVzLiBZb3UgY2FuIG92ZXJyaWRlIGVudGl0eSByZWYgCi1tYXBwaW5nIGZyb20gYSBzdHlsZXNoZWV0LiBGb3IgZXhhbXBsZTo8L3A+Ci08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgeG1sbnM6eGFsYW49Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IiB2ZXJzaW9uPSIxLjAiJmd0OwotCi0gICZsdDt4c2w6b3V0cHV0IHhhbGFuOmVudGl0aWVzPSJteWVudGl0aWVzLmVudCIvJmd0OwotCi0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iJmd0OwotICAgICZsdDtvdXQmZ3Q7JmFtcDsjMTI1OyZsdDsvb3V0Jmd0OwotICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKLQotJmx0Oy94c2w6c3R5bGVzaGVldCZndDs8L3NvdXJjZT4KLTxwPj09PSBteWVudGl0aWVzLmVudCA9PT08L3A+Ci08c291cmNlPnF1b3QgMzQKLWFtcCAzOAotbHQgNjAKLWd0IDYyCi1sYWxhIDEyNTwvc291cmNlPgotPHA+VGhlIG91dHB1dCBpczo8L3A+Ci08c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7Ci0mbHQ7b3V0Jmd0OyZhbXA7bGFsYTsmbHQ7L291dCZndDs8L3NvdXJjZT4KLTxwPlNlZSBhbHNvIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9Im91dHB1dHByb3BzIj5TZXR0aW5nIG91dHB1dCBwcm9wZXJ0aWVzIGluIHlvdXIgc3R5bGVzaGVldHM8L2xpbms+LjwvcD4KLTwvczM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94YWxhbi9pbmRleC54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4N2Q4ZS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hhbGFuL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhRE9DVFlQRSBzMSBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9kb2N1bWVudC5kdGQiPgotPCEtLSAKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci08czEgdGl0bGU9IiZ4c2x0NGotY3VycmVudDsiPgotICA8czIgdGl0bGU9IldoYXQgaXMgaXQ/Ij4KLSAgICA8cD5YYWxhbiBpcyBhbiBYU0xUIHByb2Nlc3NvciBmb3IgdHJhbnNmb3JtaW5nIFhNTCBkb2N1bWVudHMgaW50byBIVE1MLCB0ZXh0LCBvciBvdGhlciBYTUwgZG9jdW1lbnQgdHlwZXMuIEl0IGltcGxlbWVudHMgdGhlCi0gICAgIFczQyBSZWNvbW1lbmRhdGlvbnMgZm9yIFhTTCBUcmFuc2Zvcm1hdGlvbnMgKFhTTFQpIGFuZCB0aGUgWE1MIFBhdGggTGFuZ3VhZ2UgKFhQYXRoKS4gSXQgY2FuIGJlIHVzZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLAotICAgICBpbiBhbiBhcHBsZXQgb3IgYSBzZXJ2bGV0LCBvciBhcyBhIG1vZHVsZSBpbiBvdGhlciBwcm9ncmFtLjwvcD4KLSAgPC9zMj4KLSAgPHMyIHRpdGxlPSJJJ3ZlIGhlYXJkIG9mICZ4c2x0NGo7LCBidXQgd2hhdCBpcyB2ZXJzaW9uIDI/Ij4KLSAgICA8cD4meHNsdDRqOyB2ZXJzaW9uIDIgcmVjYXN0cyBYYWxhbiBhcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPHJlc291cmNlLXJlZiBpZHJlZj0idHJheCIvPiBpbnRlcmZhY2VzLCBwYXJ0IG9mIHRoZSA8cmVzb3VyY2UtcmVmIGlkcmVmPSJqYXhwMTEiLz4uIFRSYVggcHJvdmlkZXMgYQotICAgIG1vZHVsYXIgZnJhbWV3b3JrIGFuZCBhIHN0YW5kYXJkIEFQSSBmb3IgcGVyZm9ybWluZyBYTUwgdHJhbnNmb3JtYXRpb25zLCBhbmQgaXQgdXRpbGl6ZXMgc3lzdGVtIHByb3BlcnRpZXMgdG8gZGV0ZXJtaW5lIHdoaWNoIFRyYW5zZm9ybWVyIGFuZCB3aGljaCBYTUwgcGFyc2VyIHRvIHVzZS48L3A+Ci0gICAgIDxwPiZ4c2x0NGo7IHZlcnNpb24gMiBhbHNvIGJ1aWxkcyBvbiA8cmVzb3VyY2UtcmVmIGlkcmVmPSJzYXgyIi8+LCA8cmVzb3VyY2UtcmVmIGlkcmVmPSJkb20yIi8+LCBhbmQgdGhlIFhNTCBwYXJzZXIgQVBJIGluCi0gICAgIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImpheHAiLz4uPC9wPgotICAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxsaW5rIGlkcmVmPSJ3aGF0c25ldyI+V2hhdCdzIG5ldyBpbiAmeHNsdDRqMjs8L2xpbms+LjwvcD4KLSAgPC9zMj4KLSAgPHMyIHRpdGxlPSJIb3cgYWJvdXQgdGhpcyByZWxlYXNlPyI+Ci0gIDxwPiZ4c2x0NGotY3VycmVudDsgaXMgYSBwcm9kdWN0aW9uIHJlbGVhc2UgSXQgaW5jb3Jwb3JhdGVzIGEgbnVtYmVyIG9mIGVuaGFuY2VtZW50cyBhbmQgYnVnIGZpeGVzLiBGb3IgdGhlIGRldGFpbHMsIHNlZSAKLSAgPGxpbmsgaWRyZWY9InJlYWRtZSI+UmVsZWFzZSBOb3RlczwvbGluaz4uIFBsZWFzZSBzZW5kIHlvdXIgZmVlZGJhY2sgdG8gdGhlIDxodW1hbi1yZXNvdXJjZS1yZWYgaWRyZWY9InhhbGFuZGV2Ii8+LjwvcD4KLSAgPC9zMj4gCi0gIDxzMiB0aXRsZT0iSG93IGRvIEkgZ2V0IGl0PyI+Ci0gICAgPHA+RG93bmxvYWQgYW5kIHVuemlwIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nOjwvcD4KLSAgICA8dWw+Ci0gICAgICA8bGk+PHJlc291cmNlLXJlZiBpZHJlZj0ieHNsdDRqLWRpc3QtemlwIi8+PC9saT4KLSAgICAgIDxsaT48cmVzb3VyY2UtcmVmIGlkcmVmPSJ4c2x0NGotZGlzdC10YXJneiIvPjwvbGk+Ci0gICAgPC91bD4gICAgIAotICA8L3MyPgotICAKLSAgPHMyIHRpdGxlPSJXaGVyZSBkbyBJIGdldCBYZXJjZXM/Ij4KLSAgICA8cD5UaGUgWGFsYW4gZG93bmxvYWQgaW5jbHVkZXMgeGVyY2VzLmphciBmcm9tICZ4bWw0ai11c2VkOy4gVGhpcyBpcyBhbGwgeW91IG5lZWQgdG8gcnVuIFhhbGFuIHdpdGggdGhlIFhlcmNlcyBYTUwgcGFyc2VyLiAKLSAgICBZb3UgY2FuLCBob3dldmVyLCBkb3dubG9hZCB0aGUgY29tcGxldGUgWGVyY2VzIGRpc3RyaWJ1dGlvbiBmcm9tIHRoZSA8cmVzb3VyY2UtcmVmIGlkcmVmPSJ4bWw0ai1kaXN0ZGlyIi8+LjwvcD4KLSAgICA8bm90ZT5JZiB5b3UgcGxhbiB0byB1c2UgYSBkaWZmZXJlbnQgWE1MIHBhcnNlciwgc2VlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9InBsdWciPlBsdWdnaW5nIGluIGEgVHJhbnNmb3JtZXIKLSAgICAgYW5kIFhNTCBwYXJzZXI8L2xpbms+Ljwvbm90ZT4gCi0gIDwvczI+Ci0gIDxzMiB0aXRsZT0iV2hhdCBlbHNlIGRvIEkgbmVlZD8iPgotICAgIDxwPllvdSBuZWVkIHRoZSBKYXZhIERldmVsb3BtZW50IEtpdCBvciBKYXZhIFJ1bnRpbWUgMS4xLjgsIDEuMi4yLCBvciAxLjMsIHdoaWNoIHlvdSBjYW4gb2J0YWluIGZyb20gPGp1bXAKLSAgICBocmVmPSJodHRwOi8vd3d3LmlibS5jb20vamF2YS9qZGsiPmlibS5jb20vamF2YS9qZGsvPC9qdW1wPiBvciA8anVtcCBocmVmPSJodHRwOi8vd3d3LmphdmEuc3VuLmNvbSI+amF2YS5zdW4uY29tPC9qdW1wPi48L3A+IAotICA8L3MyPiAgCi0gICAgPHMyIHRpdGxlPSJGb3IgbW9yZSBpbmZvcm1hdGlvbi4uLiI+Ci0gICAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24sIGdvIHRvIDxsaW5rIGlkcmVmPSJvdmVydmlldyI+WGFsYW4gT3ZlcnZpZXc8L2xpbms+IGFuZCA8bGluayBpZHJlZj0iZ2V0c3RhcnRlZCI+R2V0dGluZwotICAgIFN0YXJ0ZWQ8L2xpbms+LiBBbGwgb2YgdGhlIFhhbGFuIGRvY3VtZW50YXRpb24gb24gdGhpcyB3ZWJzaXRlIGlzIGluY2x1ZGVkIGluIHRoZSBYYWxhbiBkb3dubG9hZCwgYXMgYXJlIGEgbnVtYmVyIG9mCi0gICAgPGxpbmsgaWRyZWY9InNhbXBsZXMiPlNhbXBsZXM8L2xpbms+IHRvIGhlbHAgeW91IHN0YXJ0IHVzaW5nICZ4c2x0NGoyOyB0byB0cmFuc2Zvcm0gWE1MIGRvY3VtZW50cy48L3A+Ci0gIDwvczI+ICAKLTwvczE+IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vb3ZlcnZpZXcueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi9vdmVydmlldy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOGU3OTguLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94YWxhbi9vdmVydmlldy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PgotPCFET0NUWVBFIHMxIFNZU1RFTSAiLi4vLi4vc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCI+Ci0KLTwhLS0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci0gCi08czEgdGl0bGU9IiZ4c2x0NGo7IE92ZXJ2aWV3Ij4KLTx1bD4KLTxsaT48bGluayBhbmNob3I9ImludHJvIj5JbnRyb2R1Y3Rpb248L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImZlYXR1cmVzIj4meHNsdDRqOyBGZWF0dXJlczwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0idG93b3JrIj5HZXR0aW5nIHRvIHdvcmsgd2l0aCAmeHNsdDRqOzwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0idXB0b3NwZWVkIj5HZXR0aW5nIHVwIHRvIHNwZWVkIHdpdGggWFNMVDwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iZ2xvc3NhcnkiPkdsb3NzYXJ5PC9saW5rPjwvbGk+Ci08L3VsPjxhbmNob3IgbmFtZT0iaW50cm8iLz4KLSAgPHMyIHRpdGxlPSJJbnRyb2R1Y3Rpb24iPgotICAgIDxwPiZ4c2x0NGo7IChuYW1lZCBhZnRlciBhIHJhcmUgbXVzaWNhbCBpbnN0cnVtZW50KSBmdWxseSBpbXBsZW1lbnRzIHRoZSA8cmVzb3VyY2UtcmVmIGlkcmVmPSJ4c2x0Ii8+IGFuZCB0aGUgCi0gICAgPHJlc291cmNlLXJlZiBpZHJlZj0ieHBhdGgiLz4uIFhTTFQgaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIFhTTCBzdHlsZXNoZWV0IGxhbmd1YWdlIGZvciBYTUwuIEl0IGluY2x1ZGVzIHRoZSBYU0wKLSAgICAgVHJhbnNmb3JtYXRpb24gdm9jYWJ1bGFyeSBhbmQgWFBhdGgsIGEgbGFuZ3VhZ2UgZm9yIGFkZHJlc3NpbmcgcGFydHMgb2YgWE1MIGRvY3VtZW50cy4gRm9yIGxpbmtzIHRvIGJhY2tncm91bmQgbWF0ZXJpYWxzLCAKLSAgICBkaXNjdXNzaW9uIGdyb3VwcywgZnJlcXVlbnRseSBhc2tlZCBxdWVzdGlvbnMsIGFuZCB0dXRvcmlhbHMgb24gWFNMVCwgc2VlIDxsaW5rIGFuY2hvcj0idXB0b3NwZWVkIj5HZXR0aW5nIHVwCi0gICAgdG8gc3BlZWQgd2l0aCBYU0xUPC9saW5rPi48L3A+IAotICAgIDxub3RlPlhTTCBhbHNvIGluY2x1ZGVzIGEgdm9jYWJ1bGFyeSBmb3IgZm9ybWF0dGluZyBkb2N1bWVudHMsIHdoaWNoIGlzIG5vdCBwYXJ0IG9mICZ4c2x0NGo7LiAKLSAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxyZXNvdXJjZS1yZWYgaWRyZWY9InhzbCIvPiBhbmQgdGhlIDxqdW1wCi0gICAgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL2ZvcCI+QXBhY2hlIFhNTCBGT1AgKEZvcm1hdHRpbmcgT2JqZWN0cyBQcm9qZWN0KTwvanVtcD4uPC9ub3RlPgotICAgIDxwPllvdSB1c2UgdGhlIFhTTFQgbGFuZ3VhZ2UgdG8gY29tcG9zZSBYU0wgc3R5bGVzaGVldHMuIEFuIFhTTCBzdHlsZXNoZWV0IGNvbnRhaW5zIGluc3RydWN0aW9ucyBmb3IKLSAgICAgdHJhbnNmb3JtaW5nIFhNTCBkb2N1bWVudHMgZnJvbSBvbmUgZG9jdW1lbnQgdHlwZSBpbnRvIGFub3RoZXIgZG9jdW1lbnQgdHlwZSAoWE1MLCBIVE1MLCBvciBvdGhlcikuIEluIHN0cnVjdHVyYWwKLSAgICAgdGVybXMsIGFuIFhTTCBzdHlsZXNoZWV0IHNwZWNpZmllcyB0aGUgdHJhbnNmb3JtYXRpb24gb2Ygb25lIHRyZWUgb2Ygbm9kZXMgKHRoZSBYTUwgaW5wdXQpIGludG8gYW5vdGhlciB0cmVlIG9mIG5vZGVzIAotICAgICAodGhlIG91dHB1dCBvciB0cmFuc2Zvcm1hdGlvbiByZXN1bHQpLjwvcD4KLSAgICA8bm90ZT5UaGUgWFNMIHN0eWxlc2hlZXQgbWF5IGdlbmVyYXRlIGFuZCByZWZlciB0byBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzICg8anVtcAotICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1N0eWxlL0NTUy8iPkNTUzwvanVtcD4pIGFzIHBhcnQgb2YgaXRzIG91dHB1dC48L25vdGU+IAotICAgIDxwPkluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgdGhlIGZvby54c2wgc3R5bGVzaGVldCBpcyB1c2VkIHRvIHRyYW5zZm9ybSBmb28ueG1sIGludG8gZm9vLm91dDo8L3A+Ci0gICAgPHA+Zm9vLnhtbDo8L3A+Ci0gICAgICAgIDxzb3VyY2U+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+Ci0mbHQ7ZG9jPkhlbGxvJmx0Oy9kb2M+PC9zb3VyY2U+Ci0gICAgICAgIDxwPmZvby54c2w6PC9wPgotICAgICAgICA8c291cmNlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/PiAKLSZsdDt4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+Ci0mbHQ7b3V0PiZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+Jmx0Oy9vdXQ+Ci0mbHQ7L3hzbDp0ZW1wbGF0ZT4KLSZsdDsveHNsOnN0eWxlc2hlZXQ+PC9zb3VyY2U+Ci08cD5mb28ub3V0OjwvcD4KLTxzb3VyY2U+Jmx0O291dD5IZWxsbyZsdDsvb3V0Pjwvc291cmNlPgotPHA+QnkgZGVmYXVsdCwgJnhzbHQ0ajsgdXNlcyAmeG1sNGo7LCBhbmQgaXQgbWF5IGJlIGNvbmZpZ3VyZWQgd2l0aCBzeXN0ZW0gcHJvcGVydGllcyB0byB3b3JrIHdpdGggb3RoZXIgWE1MIHBhcnNlcnMgKHNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJwbHVnIj5QbHVnZ2luZyBpbiBhIFRyYW5zZm9ybWVyIGFuZCBYTUwgcGFyc2VyPC9saW5rPikuIFRoZSBpbnB1dCBtYXkgYmUgc3VibWl0dGVkIGluIHRoZSBmb3JtIG9mIGEgc3RyZWFtIG9mIFhNTCBtYXJrdXAgKGZyb20gYSBVUkksIGEgY2hhcmFjdGVyIG9yIGJ5dGUgc3RyZWFtLCBvciBhbm90aGVyIHRyYW5zZm9ybWF0aW9uKSwgYSBTQVggSW5wdXRTdHJlYW0sIG9yIGEgRE9NIE5vZGUuPC9wPgotPHA+JnhzbHQ0ajsgcGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9ucyBzcGVjaWZpZWQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0IGFuZCBwYWNrYWdlcyBhIHNlcXVlbmNlIG9mIFNBWCBldmVudHMgdGhhdCBtYXkgYmUgc2VyaWFsaXplZCB0byBhbiBvdXRwdXQgc3RyZWFtIG9yIHdyaXRlciwgdXNlZCB0byBidWlsZCBhIERPTSB0cmVlLCBvciBmb3J3YXJkZWQgYXMgaW5wdXQgdG8gYW5vdGhlciB0cmFuc2Zvcm1hdGlvbi48L3A+Ci0gICAgICA8L3MyPjxhbmNob3IgbmFtZT0iZmVhdHVyZXMiLz4KLSAgIAkgIDxzMiB0aXRsZT0iJnhzbHQ0ajsgRmVhdHVyZXMiPgotCSAgICA8dWw+IAotCQkgICAgPGxpPkltcGxlbWVudHMgdGhlIHJlbGV2YW50IFczQyBzcGVjaWZpY2F0aW9uczogPHJlc291cmNlLXJlZiBpZHJlZj0ieHNsdCIvPiBhbmQgPHJlc291cmNlLXJlZiBpZHJlZj0ieHBhdGgiLz4uPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgIDxsaT5JbXBsZW1lbnRzIDxyZXNvdXJjZS1yZWYgaWRyZWY9InRyYXgiLz4sIG5vdyBwYXJ0IG9mIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImpheHAiLz4sIGFuZCBidWlsZHMgb24KLSAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWRyZWY9InNheDIiLz4gYW5kIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImRvbTIiLz4uPGJyLz48YnIvPjwvbGk+Ci0gICAgCSAgPGxpPk1heSBiZSBjb25maWd1cmVkIHRvIHdvcmsgd2l0aCBhbnkgWE1MIHBhcnNlciwgc3VjaAotICAgICAgICA8anVtcCBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGVyY2VzLWovaW5kZXguaHRtbCI+JnhtbDRqOzwvanVtcD4sIHRoYXQgaW1wbGVtZW50cyA8cmVzb3VyY2UtcmVmCi0gICAgICAgIGlkcmVmPSJqYXhwIi8+IChzZWUgPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0icGx1ZyI+UGx1Z2dpbmcgaW4gYW4gWE1MCi0gICAgICAgICBwYXJzZXI8L2xpbms+KS48YnIvPjxici8+PC9saT4KLSAgICAJICA8bGk+Q2FuIHByb2Nlc3MgU3RyZWFtLCBTQVggb3IgRE9NIGlucHV0LCBhbmQgb3V0cHV0IHRvIGEgU3RyZWFtLCBTQVggb3IgRE9NLjxici8+PGJyLz48L2xpPgotICAgICAgICA8bGk+VHJhbnNmb3JtYXRpb25zIG1heSBiZSBjaGFpbmVkICh0aGUgb3V0cHV0IG9mIG9uZSB0cmFuc2Zvcm1hdGlvbiBtYXkgYmUgdGhlIGlucHV0IGZvcgotICAgICAgICAgYW5vdGhlcikuPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgIDxsaT5NYXkgYmUgcnVuIGZyb20gdGhlIDxsaW5rIGlkcmVmPSJjb21tYW5kbGluZSI+Y29tbWFuZCBsaW5lPC9saW5rPiBmb3IgY29udmVuaWVudCBmaWxlLXRvLWZpbGUKLSAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9ucy48YnIvPjxici8+PC9saT4KLSAgICAJICA8bGk+SW5jbHVkZXMgYW4gPGxpbmsgaWRyZWY9InVzYWdlcGF0dGVybnMiIGFuY2hvcj0iYXBwbGV0Ij5hcHBsZXQgd3JhcHBlcjwvbGluaz4uPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgIDxsaT5NYXkgYmUgdXNlZCBpbiBhIDxsaW5rIGlkcmVmPSJzYW1wbGVzIiBhbmNob3I9InNlcnZsZXQiPnNlcnZsZXQ8L2xpbms+IHRvIHRyYW5zZm9ybSBYTUwgZG9jdW1lbnRzIGludG8KLSAgICAgICAgSFRNTCBhbmQgc2VydmUgdGhlIHJlc3VsdHMgdG8gY2xpZW50cy48YnIvPjxici8+PC9saT4KLSAgICAgICAgPGxpPlN1cHBvcnRzIHRoZSBjcmVhdGlvbiBvZiA8bGluayBpZHJlZj0iZXh0ZW5zaW9ucyI+SmF2YSBhbmQgc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbnM8L2xpbms+LiBhbmQKLSAgICAgICAgIHByb3ZpZGVzIGEgZ3Jvd2luZyBsaWJyYXJ5IG9mIGV4dGVuc2lvbiBlbGVtZW50cyBhbmQgZnVuY3Rpb25zLjwvbGk+Ci0JICAgIDwvdWw+IAotCSAgPC9zMj48YW5jaG9yIG5hbWU9InRvd29yayIvPgotICAgIDxzMiB0aXRsZT0iR2V0dGluZyB0byB3b3JrIHdpdGggJnhzbHQ0ajsiPgotICAgICA8cD5Gb3IgaW5zdHJ1Y3Rpb25zIGFuZCBzb21lIHN1Z2dlc3Rpb25zIGFib3V0IGhvdyB0byBnZXQgc3RhcnRlZCB1c2luZyAmeHNsdDRqOywgc2VlIAotICAgICA8bGluayBpZHJlZj0iZ2V0c3RhcnRlZCI+R2V0dGluZyBTdGFydGVkPC9saW5rPi48L3A+Ci0gICAgPC9zMj48YW5jaG9yIG5hbWU9InVwdG9zcGVlZCIvPgotICAgIAotICAgIDxzMiB0aXRsZT0iR2V0dGluZyB1cCB0byBzcGVlZCB3aXRoIFhTTFQiPgotICAgIDxwPklmIHlvdSBhcmUgc3RpbGwgd29ya2luZyB0aHJvdWdoIHRoZSBkZXRhaWxzIG9mIHRoZSBYU0xUIHNwZWMgKHRoZSBXM0MgMS4wIFJlY29tbWVuZGF0aW9uKSwgeW91IG1heSB3YW50IAotICAgIHRvIGNvbnN1bHQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZzo8L3A+Ci0gICAgPHVsPgotICAgICAgPGxpPk1pY2hhZWwgS2F5J3MgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53cm94LmNvbS9Db25zdW1lci9TdG9yZS9EZXRhaWxzLmFzcD9JU0JOPTE4NjEwMDMxMjkiPlhTTFQgUHJvZ3JhbW1lcidzCi0gICAgICAgUmVmZXJlbmNlPC9qdW1wPiwgV3JveCBQcmVzcywgMjAwMDxici8+PGJyLz48L2xpPgotICAgICAgIDxsaT5OZWlsIEJyYWRsZXkncyBYU0wgQ29tcGFuaW9uLCBBZGRpc29uLVdlc2xleSwgMjAwMDxici8+PGJyLz48L2xpPiAgICAgICAgICAgICAgICAgCi0gICAgICAgIDxsaT5FbGxpb3R0ZSBSdXN0eSBIYXJvbGQncyA8anVtcCBocmVmPSJodHRwOi8vbWV0YWxhYi51bmMuZWR1L3htbC9ib29rcy9iaWJsZS91cGRhdGVzLzE0Lmh0bWwiPkNoYXB0ZXIgMTQgb2YgCi0gICAgICAgIHRoZSBYTUwgQmlibGU6IFhTTCBUcmFuc2Zvcm1hdGlvbnM8L2p1bXA+PGJyLz48YnIvPjwvbGk+Ci0gICAgICAgIDxsaT5DcmFuZSBTb2Z0d3JpZ2h0J3MgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy5DcmFuZVNvZnR3cmlnaHRzLmNvbS90cmFpbmluZy8iPkZyZWUgcHJldmlldyBvZiBQcmFjdGljYWwKLSAgICAgICAgIFRyYW5zZm9ybWF0aW9uIFVzaW5nIFhTTFQgYW5kIFhQYXRoPC9qdW1wPjxici8+PGJyLz48L2xpPgotICAgICAgICA8bGk+VGhlIE11bGJlcnJ5IDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cubXVsYmVycnl0ZWNoLmNvbS94c2wveHNsLWxpc3QvIj5YU0wtTGlzdCAtLSBPcGVuIEZvcnVtIG9uIFhTTDwvanVtcD4gCi0gICAgICAgIChvZiBpbnRlcmVzdCB0byBYU0wgdXNlcnMgYXQgYWxsIGxldmVscyk8YnIvPjxici8+PC9saT4KLSAgICAgICAgPGxpPkRhdmUgUGF3c29uJ3MgPHJlc291cmNlLXJlZiBpZHJlZj0iZHBhd3NvbnhzbGZhcSIvPjxici8+PGJyLz48L2xpPgotICAgICAgICA8bGk+T2JqZWN0cyBieSBEZXNpZ24ncyA8anVtcCBocmVmPSJodHRwOi8vd3d3Lm9iamVjdHNieWRlc2lnbi5jb20vcHJvamVjdHMveG1pX3RvX2h0bWwuaHRtbCI+VHJhbnNmb3JtaW5nIFhNSSB0bwotICAgICAgICAgSFRNTDwvanVtcD4gKG9yaWVudGVkIHRvd2FyZHMgWE1JLCAiYW4gWE1MLWJhc2VkLCBzdHJlYW0gcmVwcmVzZW50YXRpb24gb2YgYSBVTUwgbW9kZWwsIiBidXQgYWxzbyBjb3ZlcnMgImdlbmVyaWMiCi0gICAgICAgICBYTUwgdHJhbnNmb3JtYXRpb25zKTxici8+PGJyLz48L2xpPgotICAgICAgICAgPGxpPk9iamVjdHMgYnkgRGVzaWduOydzIDxqdW1wIGhyZWY9Imh0dHA6Ly9vYmplY3RzYnlkZXNpZ24uY29tL3Byb2plY3RzL3hzbHQveHNsdF9ieV9leGFtcGxlLmh0bWwiPlhTTFQgYnkKLSAgICAgICAgIEV4YW1wbGU8L2p1bXA+PGJyLz48YnIvPjwvbGk+ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICA8bGk+TWlsb3NsYXYgTmljJ3MgPGp1bXAgaHJlZj0iaHR0cDovL3p2b24udnNjaHQuY3ovSFRNTG9ubHkvWFNMVHV0b3JpYWwvQm9va3MvQm9vazEvaW5kZXguaHRtbCI+WFNMIFR1dG9yaWFsPC9qdW1wPgotICAgICAgICAgPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgICA8bGk+T0FTSVMgKHRoZSBPcmdhbml6YXRpb24gZm9yIHRoZSBBZHZhbmNlbWVudCBvZiBTdHJ1Y3R1cmVkIEluZm9ybWF0aW9uIFN0YW5kYXJkcyk6IAotICAgICAgICAgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb3Zlci94c2wuaHRtbCI+RXh0ZW5zaWJsZSBTdHlsZXNoZWV0IExhbmd1YWdlIChYU0wpPC9qdW1wPiBieSBSb2JpbgotICAgICAgICAgQ292ZXI8YnIvPjxici8+PC9saT4KLSAgICAgICAgIDxsaT5Eb25hbGQgQmFsbCdzIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cud2Vic2xpbmdlclouY29tL2JhbGxkL3hzbC9kZXNpZ25lcl9tYW51YWwueG1sIj5BIEd1aWRlIHRvIFhNTCBhbmQgWFNMIGZvcgotICAgICAgICAgRGVzaWduZXJzPC9qdW1wPjxici8+PGJyLz48L2xpPgotICAgICAgICA8bGk+WFNMVCAtIFhTTCBUcmFuc2Zvcm1hdGlvbnMgaW4gCi0gICAgICAgIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cuYnJpY3MuZGsvfmFtb2VsbGVyL1hNTC8iPlRoZSBYTUwgUmV2b2x1dGlvbjogVGVjaG5vbG9naWVzIGZvciB0aGUgZnV0dXJlIFdlYjwvanVtcD4gYnkKLSAgICAgICAgQW5kZXJzIE0mb3NsYXNoO2xsZXIgYW5kIE1pY2hhZWwgSS4gU2Nod2FydHpiYWNoPC9saT4KLSAgICA8L3VsPgotICAgIDxwPldoZW4geW91IGNvbWUgYWNyb3NzIG90aGVyIHVzZWZ1bCBpbnRyb2R1Y3Rvcnkgb3IgYmFja2dyb3VuZCBtYXRlcmlhbHMsIHBsZWFzZSBlbWFpbCA8aHVtYW4tcmVzb3VyY2UtcmVmCi0gICAgIGlkcmVmPSJ4YWxhbmRldiIvPiwgc28gd2UgY2FuIGFkZCB0aGVtIHRvIHRoaXMgbGlzdC48L3A+Ci0gICAgIAotICAgIDwvczI+PGFuY2hvciBuYW1lPSJnbG9zc2FyeSIvPgotICAgIDxzMiB0aXRsZT0iR2xvc3NhcnkiPgotICAgICAgPGdsb3NzPgotICAgICAgICA8bGFiZWw+WFNMVCBOYW1lc3BhY2U8L2xhYmVsPgotICAgICAgICA8aXRlbT5UaGUgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8iPlhNTCBuYW1lc3BhY2U8L2p1bXA+IGZvciBYU0xULiBBbiBYTUwgbmFtZXNwYWNlIGlzIGEgCi0gICAgICAgIGNvbGxlY3Rpb24gb2YgZWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzLCBpZGVudGlmaWVkIGJ5IGEgVW5pcXVlIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSksIHdoaWNoIG9mdGVuIHRha2VzIHRoZSBmb3JtIG9mCi0gICAgICAgIGEgVVJMLCBidXQgaXMgcmVhbGx5IGp1c3QgYSB1bmlxdWUgc3RyaW5nLCBub3QgYSBwb2ludGVyIHRvIGEgd2ViIHBhZ2UuIFRoZSBYU0xUIG5hbWVzcGFjZSBVUkkgaXMKLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtLiBJbiBlYWNoIFhTTFQgc3R5bGVzaGVldCwgeW91IG11c3QgZGVjbGFyZSB0aGlzIG5hbWVzcGFjZSBpbiB0aGUgc3R5bGVzaGVldCBlbGVtZW50Ci0gICAgICAgIHRhZyBhbmQgYmluZCBpdCB0byBhIGxvY2FsIHByZWZpeC4gTGlrZSB0aGUgWFNMVCBzcGVjaWZpY2F0aW9uLCB3ZSBhbHdheXMgdXNlIHhzbCBhcyB0aGUgWFNMVCBuYW1lc3BhY2UgcHJlZml4IGluIG91cgotICAgICAgICBkZXNjcmlwdGlvbnMgYW5kIGV4YW1wbGVzLCBhbHRob3VnaCB5b3UgYXJlIGZyZWUgdG8gYmluZCBhbnkgcHJlZml4IHRvIHRoaXMgbmFtZXNwYWNlLjxici8+PGJyLz48L2l0ZW0+Ci0gICAgICAgIAotICAgICAgICA8bGFiZWw+WFNMIEluc3RydWN0aW9uPC9sYWJlbD4KLSAgICAgICAgPGl0ZW0+QW55IHRhZyBhc3NvY2lhdGVkIHdpdGggdGhlIFhTTFQgbmFtZXNwYWNlLjxici8+PGJyLz48L2l0ZW0+Ci0gICAgICAgIAotICAgICAgICA8bGFiZWw+VGVtcGxhdGU8L2xhYmVsPgotICAgICAgICA8aXRlbT5BbiBlbGVtZW50LCB1c3VhbGx5IHdpdGggY2hpbGQgZWxlbWVudHMsIHRoYXQgc3BlY2lmaWVzIGEgInJ1bGUiIG9yIHNldCBvZiAKLSAgICAgICAgaW5zdHJ1Y3Rpb25zIHRvIHBlcmZvcm0gd2hlbiBhIHBhcnRpY3VsYXIga2luZCBvZiBub2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBzb3VyY2UgdHJlZS48YnIvPjxici8+PC9pdGVtPgotICAgICAgICAgICAgICAgIAotICAgICAgICA8bGFiZWw+WFNMIFRlbXBsYXRlIEluc3RydWN0aW9uPC9sYWJlbD4KLSAgICAgICAgPGl0ZW0+QW55IHRhZyB0aGF0IG9jY3VycyBpbnNpZGUgYW4geHNsOnRlbXBsYXRlIGVsZW1lbnQgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgWFNMVCBuYW1lc3BhY2UuPGJyLz48YnIvPjwvaXRlbT4KLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgPGxhYmVsPlNvdXJjZSBUcmVlPC9sYWJlbD4KLSAgICAgICAgPGl0ZW0+VGhlIFhNTCB0cmVlIGlucHV0IHRvIHRoZSBYU0wgcHJvY2Vzcy48YnIvPjxici8+PC9pdGVtPgotICAgICAgICAKLSAgICAgICAgPGxhYmVsPlJlc3VsdCBUcmVlPC9sYWJlbD4KLSAgICAgICAgPGl0ZW0+VGhlIHRyZWUgdGhhdCBpcyBvdXRwdXQgYnkgdGhlIFhTTCBwcm9jZXNzLjxici8+PGJyLz48L2l0ZW0+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIDxsYWJlbD5NYXRjaCBQYXR0ZXJuPC9sYWJlbD4KLSAgICAgICAgPGl0ZW0+VGhlIHBhcnQgb2YgYSB0ZW1wbGF0ZSB0aGF0IGRlZmluZXMgdGhlIGtpbmQocykgb2Ygbm9kZXMgdG8gd2hpY2ggdGhlIHRlbXBsYXRlIGFwcGxpZXMuPGJyLz48YnIvPjwvaXRlbT4KLQotICAgICAgPC9nbG9zcz4KLSAgICAgIDxwPkZvciBtb3JlIGRlZmluaXRpb25zIG9mIFhTTFQgdGVybWlub2xvZ3ksIHNlZSBEYXZlIFBhd3NvbidzIAotICAgICAgPGp1bXAgaHJlZj0iaHR0cDovL3d3dy5kcGF3c29uLmNvLnVrL3hzbC92b2NhYi5odG1sIj5YU0xUIFRlcm1pbm9sb2d5Ci0gICAgICBDbGFyaWZpY2F0aW9uPC9qdW1wPiBhbmQgdGhlIEdsb3NzYXJ5IGluIE1pY2hhZWwgS2F5J3MgCi0gICAgICA8anVtcCBocmVmPSJodHRwOi8vd3d3Lndyb3guY29tL0NvbnN1bWVyL1N0b3JlL0RldGFpbHMuYXNwP0lTQk49MTg2MTAwMzEyOSI+WFNMVCBQcm9ncmFtbWVyJ3MgUmVmZXJlbmNlPC9qdW1wPi48L3A+Ci0gICAgPC9zMj4KLTwvczE+IApkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94YWxhbi9yZWFkbWUueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi9yZWFkbWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2UxNDNiLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vcmVhZG1lLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+IAotPCFET0NUWVBFIHMxIFNZU1RFTSAiLi4vLi4vc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCJbCi08IUVOVElUWSBkb25lLWogU1lTVEVNICJET05FIj4KLTwhRU5USVRZIHN0YXR1cy1qIFNZU1RFTSAiU1RBVFVTIj4KLTwhRU5USVRZIGhpc3RvcnktaiBTWVNURU0gImhpc3RvcnkueG1sIj5dPgotCi08IS0tCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIExvdHVzCi0gKiBEZXZlbG9wbWVudCBDb3Jwb3JhdGlvbi4sIGh0dHA6Ly93d3cubG90dXMuY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotIC0tPgotPHMxIHRpdGxlPSJSZWxlYXNlIE5vdGVzIj4KLTxwPiZ4c2x0NGotY3VycmVudDs8L3A+Ci0gPHVsPgotICA8bGk+PGxpbmsgYW5jaG9yPSJzdGF0dXMwIj5TdGF0dXM8L2xpbms+PC9saT4KLSAgPGxpPjxsaW5rIGFuY2hvcj0iYnVpbGQiPkJ1aWxkIE5vdGVzPC9saW5rPjwvbGk+Ci0gIDxsaT48bGluayBhbmNob3I9ImNvbnRhY3QiPkdldHRpbmcgaW4gdG91Y2g8L2xpbms+PC9saT4KLSAgPGxpPjxsaW5rIGFuY2hvcj0iaGlzdG9yeSI+SGlzdG9yeSBvZiBzb2Z0d2FyZSBjaGFuZ2VzPC9saW5rPjwvbGk+Ci0gPC91bD48YW5jaG9yIG5hbWU9InN0YXR1czAiLz4KLSAgPHMyIHRpdGxlPSJTdGF0dXMiPgotICAgPHVsPgotICAgIDxsaT48bGluayBhbmNob3I9ImRvbmUiPkNoYW5nZXMgc2luY2UgdmVyc2lvbiAyLjAuMTwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9Im90aGVyIj5PdGhlciBwb2ludHMgb2YgaW50ZXJlc3Q8L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJidWdzIj5CdWdzPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0ic3RhdHVzIj5WZXJzaW9uIG9mIFhlcmNlcyB0byB1c2U8L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJ0by1kbyI+VG8tZG8gdGFza3MgZm9yIGZ1dHVyZSAmeHNsdDRqOyByZWxlYXNlczwvbGluaz48L2xpPgotICAgPC91bD4KLSAgICAgPGFuY2hvciBuYW1lPSJkb25lIi8+Ci0gICAgIDxzMyB0aXRsZT0iQ2hhbmdlcyBzaW5jZSAmeHNsdDRqOyAyLjAuMSI+Ci0gICAgIDxwPlRoaXMgcmVsZWFzZSBpbmNsdWRlcyBhIG51bWJlciBvZiBidWcgZml4ZXMgdG8gdGhlICZ4c2x0NGo7IGFuZCBUckFYIGNvcmUgYW5kIFhhbGFuLUphdmEgMSBjb21wYWJpbGl0eSBBUEkuIFdlIGhhdmUgYWxzbzwvcD4KLSAgICAgPHVsPgotICAgICA8bGk+PC9saT4KLSAgICAgPGxpPjxici8+PGJyLz48L2xpPiAKLSAgICAgPGxpPjwvbGk+Ci0gICAgIDwvdWw+Ci0gICAgICZkb25lLWo7Ci0gICAgIDwvczM+Ci0gICAgIDxhbmNob3IgbmFtZT0ib3RoZXIiLz4KLSAgICAgPHMzIHRpdGxlPSJPdGhlciBwb2ludHMgb2YgaW50ZXJlc3QiPgotICAgICA8dWw+Ci0gICAgIDxsaT5IYW5kbGluZyB4c2w6bmFtZXNwYWNlLWFsaWFzIGRlY2xhcmF0aW9uczogSW4gcmVsZWFzZSAyLjAuRDAxLCB3ZSByZXBvcnRlZCB0aGUgbmVlZCB0byBkbyBzb21lIHJlc2VhcmNoIGNvbmNlcm5pbmcgZXhhY3RseSBob3cgWGFsYW4KLSAgICAgc2hvdWxkIGhhbmRsZSB4c2w6bmFtZXNwYWNlLWFsaWFzIGRlY2xhcmF0aW9ucy4gQXMgYSByZXN1bHQgb2YgZGlzY3Vzc2lvbnMgYW1vbmcgbWVtYmVycyBvZiB0aGUgVzNDIFdvcmtpbmcgR3JvdXAgb24gWFNMLCB3ZSBoYXZlIHJlYWNoZWQgYQotICAgICBtb3JlIHByZWNpc2UgY29uc2Vuc3VzIG9uIGhvdyBuYW1lc3BhY2VzIHNob3VsZCBiZSByZXByZXNlbnRlZCB3aGVuIGFuIHhzbDpuYW1lc3BhY2UtYWxpYXMgZGVjbGFyYXRpb24gaXMgaW4gZWZmZWN0Ljxici8+PGJyLz4KLSAgICAgSWYgYSBsaXRlcmFsIHJlc3VsdCBlbGVtZW50IGhhcyBhIG5hbWVzcGFjZSBwcmVmaXgsIHRoZSBwcmVmaXggd2lsbCBiZSBwcmVzZXJ2ZWQgYW5kIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBlbGVtZW50IHdpbGwgYmUgYXMKLSAgICAgc3BlY2lmaWVkIGluIHRoZSB4c2w6bmFtZXNwYWNlLWFsaWFzIGVsZW1lbnQsIGJ1dCB0aGUgcmVzdWx0LXByZWZpeCBpcyBub3QgcmVxdWlyZWQgdG8gYXBwZWFyIGluIHRoZSByZXN1bHQuIFRoaXMgYWxzbyBhcHBsaWVzIHRvIHRoZQotICAgICB0d28gb3RoZXIgY2FzZXMgb2YgIkxpdGVyYWwgbmFtZXNwYWNlIFVSSSIgbWVudGlvbmVkIGluIHRoZSBYU0xUIFJlY29tbWVuZGF0aW9uIG9uIAotICAgICA8anVtcCBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0I2xpdGVyYWwtcmVzdWx0LWVsZW1lbnQiPkxpdGVyYWwgUmVzdWx0IEVsZW1lbnRzPC9qdW1wPi4gTW9yZSBzaW1wbHksIGlmIHRoZSBzdHlsZXNoZWV0IGNhbGxzIGZvcgotICAgICAmbHQ7YXhzbDpmb28mZ3Q7IHRvIGJlIG91dHB1dCBhcyBhIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnQsIHRoZW4gaXQgd2lsbCBiZSBvdXRwdXQgYXMgJmx0O2F4c2w6Zm9vJmd0OyBpbiB0aGUgcmVzdWx0LCBidXQgdGhlIG5hbWVzcGFjZQotICAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyAiYXhzbCIgcHJlZml4IHdpbGwgYmUgYXMgZGVzaWduYXRlZCBpbiB0aGUgeHNsOm5hbWVzcGFjZS1hbGlhcyBkZWNsYXJhdGlvbi48YnIvPjxici8+PC9saT4KLSAgICAgPGxpPkZvciBIVE1MIG91dHB1dCwgJnhzbHQ0ajI7IG91dHB1dHMgY2hhcmFjdGVyIGVudGl0eSByZWZlcmVuY2VzICgmYW1wO2NvcHk7IGV0Yy4pIGZvciB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGRlc2lnbmF0ZWQgaW4gIAotICAgICA8anVtcCBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvI2R0ZHMiPkFwcGVuZGl4IEEuIERURHMgb2YgdGhlIFhIVE1MIDEuMDogVGhlIEV4dGVuc2libGUgSHlwZXJUZXh0IE1hcmt1cAotICAgICBMYW5ndWFnZTwvanVtcD4uICZ4c2x0NGo7IDEueCwgb24gdGhlIG90aGVyIGhhbmQsIG91dHB1dHMgbGl0ZXJhbCBjaGFyYWN0ZXJzIGZvciBzb21lIG9mIHRoZXNlIHNwZWNpYWwgY2hhcmFjdGVycy48YnIvPjxici8+PC9saT4KLSAgICAgPGxpPkluIGNvbmZvcm1hbmNlIHdpdGggdGhlIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjc2VjdGlvbi1IVE1MLU91dHB1dC1NZXRob2QiPlhTTFQgUmVjb21tZW5kYXRpb24gb24gdGhlIEhUTUwgCi0gICAgIE91dHB1dCBNZXRob2Q8L2p1bXA+IGFuZCA8anVtcCBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2FwcGVuZGl4L25vdGVzLmh0bWwjaC1CLjIuMSI+U2VjdGlvbiBCLjIuMSBvZiB0aGUgSFRNTCA0LjAKLSAgICAgUmVjb21tZW5kYXRpb248L2p1bXA+LCAmeHNsdDRqMjsgdXNlcyAlaGggZW5jb2RpbmcgZm9yIGVhY2ggYnl0ZSBvZiB0aGUgVVRGLTggcmVwcmVzZW50YXRpb24gb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gSFRNTCBVUkkKLSAgICAgYXR0cmlidXRlcy48YnIvPjxici8+PC9saT4KLSAgICAgPGxpPldoZW4geW91ciBzdHlsZXNoZWV0IGFza3MgZm9yIGFuIGV4cGxpY2l0IGNhcnJpYWdlLXJldHVybiBjaGFyYWN0ZXIgKCZhbXA7IzEzOykgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgb3V0cHV0LCBpdCBpcyBvdXRwdXQgZHVyaW5nCi0gICAgIHRoZSBzZXJpYWxpemF0aW9uIHByb2Nlc3MgaW4gZXNjYXBlZCBmb3JtIHVubGVzcyBlc2NhcGluZyBoYXMgYmVlbiBkaXNhYmxlZC4gIFdoZW4geW91ciBzdHlsZXNoZWV0IGFza3MgZm9yIGFuIGV4cGxpY2l0IGxpbmUtZmVlZCBjaGFyYWN0ZXIKLSAgICAgKCZhbXA7IzEwOykgdG8gYmUgb3V0cHV0LCB0aGUgc3lzdGVtLWRlZmF1bHQgbGluZS1icmVhayBjaGFyYWN0ZXIocykgaXMvYXJlIG91dHB1dCBkdXJpbmcgdGhlIHNlcmlhbGl6YXRpb24gcHJvY2Vzcy4gIEFsc28ga2VlcCBpbiBtaW5kIHRoYXQKLSAgICAgdGhlIFhNTCBwYXJzZXIgbm9ybWFsaXplcyBsaW5lLWJyZWFrcyB0byBsaW5lLWZlZWRzIHdoZW4gaXQgc2VuZHMgY2hhcmFjdGVyIGV2ZW50cyB0byB0aGUgcHJvY2Vzc29yLjxici8+PGJyLz48L2xpPgotICAgICA8bGk+SWYgeW91ciBYTUwgaW5wdXQgaXMgYSBET00sIHVzZSB0aGUgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBzZXRDb2FsZXNjaW5nKCkgbWV0aG9kIHRvIHNldCBjb2FsZXNjaW5nIHRvIHRydWUgKGl0IGlzCi0gICAgIGZhbHNlIGJ5IGRlZmF1bHQpLCBpZiB5b3Ugd2FudCB0byBhcHBlbmQgQ0RBVEEgc2VjdGlvbnMgdG8gYWRqYWNlbnQgdGV4dCBzZWN0aW9ucyB0byBmb3JtIGEgc2luZ2xlIHRleHQgbm9kZSAoYXMgdGhlIFhQYXRoIHN0YW5kYXJkIGNhbGxzCi0gICAgICBmb3IpLCBhbmQgaWYgdGhlIFhNTCBwYXJzZXIgc3VwcG9ydHMgdGhpcyBmZWF0dXJlICgmeG1sNGotdXNlZDsgZG9lcyBub3QpLjwvbGk+Ci0gICAgIDwvdWw+Ci0gICAgIDwvczM+PGFuY2hvciBuYW1lPSJidWdzIi8+Ci0gICAgIDxzMyB0aXRsZT0iQnVncyI+Ci0gICAgIDxwPkFsbCBrbm93biAmeHNsdDRqOyBidWdzIGFyZSBsaXN0ZWQgaW4gPHJlc291cmNlLXJlZiBpZHJlZj0iYnVnemlsbGEiLz4uIEZvciBhIGxpc3Qgb2Ygb3BlbiBidWdzIHdpdGggbGlua3MgdG8gZWFjaCBidWcKLSAgICAgIHJlcG9ydCwgc2VlIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImJ1Z2xpc3QiLz4uIElmIHlvdSBmaW5kIGEgbmV3IGJ1ZywgcGxlYXNlIGVudGVyIGEgWGFsYW5KMiBidWcgcmVwb3J0IGluIHRoaXMKLSAgICAgIGRhdGFiYXNlLjwvcD4KLSAgICAgPG5vdGU+QmVmb3JlIHlvdSBjYW4gZW50ZXIgeW91ciBmaXJzdCBidWcgcmVwb3J0LCB5b3UgbXVzdCBzdWJtaXQgeW91ciBlbWFpbCBhZGRyZXNzIHRvIEJ1Z3ppbGxhIGFuZCByZWNlaXZlIGEgcGFzc3dvcmQuPC9ub3RlPiAKLSAgICAgPHA+V2Ugc3Ryb25nbHkgZW5jb3VyYWdlIHlvdSB3cml0ZSBwYXRjaGVzIGZvciBwcm9ibGVtcyB5b3UgZmluZCBhbmQgc3VibWl0IHRoZW0gdG8KLSAgICAgIHhhbGFuLWRldkB4bWwuYXBhY2hlLm9yZy4gV2UgcmV2aWV3IHRoZSBwYXRjaGVzIHdlIHJlY2VpdmUgdG8gbWFrZSBzdXJlIHRoZXkgZG8gbm90IGJyZWFrIHNvbWV0aGluZyBlbHNlLCBhbmQgKGFzc3VtaW5nIHRoZXkgCi0gICAgIGRvIG5vdCkgaW5jbHVkZSB0aGVtIGluIG91ciBuZXh0IHJlbGVhc2UuIEluIHRoZSBpbnRlcmVzdCBvZiBmaXhpbmcgYnVncywgYWRkaW5nIGVuaGFuY2VtZW50cywgYW5kIGFkZHJlc3Npbmcgb3V0c3RhbmRpbmcgZGVzaWduCi0gICAgIGlzc3Vlcywgd2Ugc2luY2VyZWx5IHdhbnQgKGFuZCBuZWVkISkgeW91ciBhY3RpdmUgcGFydGljaXBhdGlvbiBpbiB0aGUgb25nb2luZyBkZXZlbG9wbWVudCBvZiBYYWxhbi48L3A+Ci0gICAgIDxwPlhlcmNlcyBidWcgaW4gJnhtbDRqLXVzZWQ7OjwvcD4KLSAgICAgPHVsPgotICAgICAgIDxsaT4meG1sNGo7IDEuMi4zIGRvZXMgbm90IHByb2Nlc3MgbmFtZXNwYWNlcyBpbiBTQVggZXZlbnRzIHdoZW4gcGFyc2luZyBVVEYtMTYgZG9jdW1lbnRzLCB3aGljaCBjYXVzZXMgJnhzbHQ0ajsgdG8gZmFpbCB3aXRoIFVURi0xNgotICAgICAgICBkb2N1bWVudHMuIFhlcmNlcyB3aWxsIHBvc3QgYSBmaXggc2hvcnRseS48YnIvPjxici8+PC9saT4KLSAgICAgPC91bD4KLSAgICAgPC9zMz4gICAgIAotICAgICA8YW5jaG9yIG5hbWU9InN0YXR1cyIvPgotICAgICAmc3RhdHVzLWo7Ci0gICAgIDxhbmNob3IgbmFtZT0idG8tZG8iLz4KLSAgICAgPHMzIHRpdGxlPSJUby1kbyB0YXNrcyI+Ci0gICAgICAgPHA+Rm9yIGEgbGlzdCBvZiBnb2FscywgdGFza3MsIGFuZCB0YXJnZXQgZGF0ZXMgZm9yIGNvbXBsZXRpb24sIHNlZSA8anVtcCBocmVmPSJ0b2RvLmh0bWwiPlhhbGFuLUphdmEgVmVyc2lvbiAyOiBUaGluZ3MgVG8gRG88L2p1bXA+LiAKLSAgICAgICBBcyB0YXNrcyBhcmUgY29tcGxldGVkLCB0aGV5IGFyZSBtb3ZlZCBmcm9tIHRoZSB0by1kbyBsaXN0IHRvIAotICAgICAgIDxqdW1wIGhyZWY9InRvZG8uaHRtbCNyZWxlYXNlLWRhdGUtY29tcGxldGVkIj5Db21wbGV0ZWQ8L2p1bXA+LjwvcD4KLSAgICAgICA8cD5UaGUgc291cmNlIGRvY3VtZW50IGZvciB0aGUgdG8tZG8gbGlzdCBpcyBhbiBhY3RpdmUgZG9jdW1lbnQgaW4gdGhlIEFwYWNoZSBDVlMgcmVwb3NpdG9yeTogCi0gICAgICAgPGp1bXAgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3dlYnNyYy9jdnN3ZWIuY2dpL3htbC14YWxhbi9qYXZhL3RvZG8ueG1sIj54bWwteGFsYW4vamF2YS90b2RvLnhtbDwvanVtcD4uPC9wPgotICAgICAgPC9zMz4gCi0gIDwvczI+Ci0gIDxhbmNob3IgbmFtZT0iYnVpbGQiLz4KLSAgCi0gIDxzMiB0aXRsZT0iQnVpbGQgTm90ZXMiPgotPHVsPgotPGxpPjxsaW5rIGFuY2hvcj0iYW50Ij5Vc2luZyBBbnQ8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImphciI+UmVidWlsZGluZyB4YWxhbi5qYXI8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InNhbXBsZXMiPlJlYnVpbGRpbmcgc2FtcGxlIGFwcGxpY2F0aW9uczwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iZG9jIj5SZWJ1aWxkaW5nIHRoZSAmeHNsdDRqOyBkb2N1bWVudGF0aW9uPC9saW5rPjwvbGk+Ci08L3VsPgotPGFuY2hvciBuYW1lPSJhbnQiLz4KLSAgIDxzMyB0aXRsZT0iVXNpbmcgQW50Ij4KLSAgICAgPHA+QXBhY2hlIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImFudCIvPiBpcyBhIGZsZXhpYmxlLCBwb3dlcmZ1bCwgYW5kIGVhc3ktdG8tdXNlIEphdmEgYnVpbGQgdG9vbCB0aGF0IHdlIGluY2x1ZGUgd2l0aCB0aGUKLSAgICAgJnhzbHQ0ajsgZGlzdHJpYnV0aW9uLiBUaGUgQW50IEpBUiBmaWxlIGlzIGluIHRoZSBiaW4gZGlyZWN0b3J5LCBhbmQgdGhlIGNyb3NzLXBsYXRmb3JtIFhNTCBidWlsZCBmaWxlIChidWlsZC54bWwpIGlzIGluIAotICAgICB0aGUgcm9vdCBkaXJlY3RvcnkgYWxvbmcgd2l0aCBhIFdpbmRvd3MzMiBiYXRjaCBmaWxlIChidWlsZC5iYXQpIGFuZCBhIFVOSVggc2hlbGwgZmlsZSAoYnVpbGQuc2gpLiBUaGUgYnVpbGQgZmlsZSBkZWZpbmVzIAotICAgICB0aGUgInRhcmdldHMiIHRoYXQgeW91IGNhbiB1c2UgQW50IHRvIGJ1aWxkLiBUaGUgYmF0Y2ggYW5kIHNoZWxsIGZpbGVzIHNldCB1cCB0aGUgY2xhc3NwYXRoIGFuZCBsYXVuY2ggQW50IHdpdGggdGhlIHRhcmdldCAKLSAgICAgKGFuZCBhbnkgb3RoZXIgYXJndW1lbnRzKSB5b3UgcHJvdmlkZS48L3A+Ci0gICAgIDxwPjxlbT5JbnN0cnVjdGlvbnMgZm9yIHVzaW5nIEFudDwvZW0+PC9wPgotICAgICA8b2w+Ci0gICAgICAgPGxpPlNldCB0aGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBKREsgcm9vdCBkaXJlY3RvcnkuPGJyLz48YnIvPgotICAgICAgIElmIHlvdSBhcmUgdXNpbmcgSkRLIDEuMS44LCB5b3UgbXVzdCBhbHNvIHB1dCBjbGFzc2VzLnppcCBpbiB0aGUgSkRLIGJpbiBkaXJlY3Rvcnkgb24gdGhlIGNsYXNzcGF0aC4gWW91IGNhbiB1c2UgQW50IAotICAgICAgIHdpdGggSkRLIDEuMS44IHRvIGNvbXBpbGUgYW5kIGphciB0aGUgJnhzbHQ0ajsgc291cmNlIGZpbGVzLCBidXQgeW91IG11c3QgaGF2ZSBKREsgMS4yLjIgb3IgaGlnaGVyIHRvIGJ1aWxkIHRoZQotICAgICAgIGRvY3VtZW50YXRpb24uPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgPGxpPkRlcGVuZGluZyBvbiB5b3VyIGVudmlyb25tZW50LCBydW4gdGhlIGJhdGNoIGZpbGUgKGJ1aWxkLmJhdCkgb3Igc2hlbGwgZmlsZSAoYnVpbGQuc2gpIGZyb20gdGhlICZ4c2x0NGo7IHJvb3QKLSAgICAgICBkaXJlY3RvcnksIG9wdGlvbmFsbHkgd2l0aCBhcmd1bWVudHMgKHNlZSB0aGUgdGFibGUgb2YgdGFyZ2V0cyBiZWxvdykuPGJyLz48YnIvPgotICAgICAgIFRoZSBiYXRjaC9zaGVsbCBmaWxlIGFkZHMgc2V2ZXJhbCBKQVIgZmlsZXMgdG8gdGhlIGNsYXNzcGF0aCBhbmQgbGF1bmNoZXMgQW50IHdpdGggYW55IGFyZ3VtZW50cyB5b3UgcHJvdmlkZS4gSWYgeW91Ci0gICAgICAgcHJvdmlkZSBubyB0YXJnZXQsIEFudCBjb21waWxlcyB0aGUgc291cmNlIGZpbGVzIGFuZCByZWJ1aWxkcyB4YWxhbi5qYXIgKHRoZSAiamFyIiB0YXJnZXQpLjwvbGk+Ci0gICAgIDwvb2w+Ci0gICAgIDxwPllvdSBjYW4gYWxzbyBzZXQgdXAgeW91ciBjbGFzc3BhdGggbWFudWFsbHkgKHNlZSBidWlsZC5iYXQgb3IgYnVpbGQuc2ggZm9yIHRoZSBkZXRhaWxzKSwgYW5kIHRoZW4gcnVuIEFudCBhcwotICAgICBmb2xsb3dzOjxici8+PGJyLz4KLSAgICAgPGNvZGU+amF2YSBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluIDxyZWY+dGFyZ2V0PC9yZWY+PC9jb2RlPjxici8+PGJyLz4KLSAgICAgd2hlcmUgPHJlZj50YXJnZXQ8L3JlZj4gaXMgbm90aGluZyAoZm9yIHRoZSBkZWZhdWx0IHRhcmdldCkgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcuPC9wPgotICAgICA8dGFibGU+Ci0gICAgICAgPHRyPjx0ZD48ZW0+VGFyZ2V0PC9lbT48L3RkPjx0ZD48ZW0+V2hhdCBBbnQgZG9lczwvZW0+PC90ZD48L3RyPgotICAgICAgIDx0cj48dGQ+Y29tcGlsZTwvdGQ+PHRkPmNvbXBpbGVzIFhhbGFuLUphdmEgaW4gYnVpbGQvY2xhc3Nlcy48L3RkPjwvdHI+Ci0gICAgICAgPHRyPjx0ZD5qYXIgKHRoZSBkZWZhdWx0KTwvdGQ+PHRkPmNyZWF0ZXMgeGFsYW4uamFyIGluIHRoZSBidWlsZCBkaXJlY3Rvcnk8L3RkPjwvdHI+Ci0gICAgICAgPHRyPjx0ZD5zYW1wbGVzPC90ZD48dGQ+Y29tcGlsZXMgYW5kIGphcnMgdGhlIHNhbXBsZSBhcHBzIGluIGJ1aWxkL3hhbGFuc2FtcGxlcy5qYXI8L3RkPjwvdHI+Ci0gICAgICAgPHRyPjx0ZD5zZXJ2bGV0PC90ZD48dGQ+Y29tcGlsZXMgYW5kIGphcnMgdGhlIHNhbXBsZSBzZXJ2bGV0IGluIGJ1aWxkL3hhbGFuc2VydmxldC5qYXI8L3RkPjwvdHI+ICAgICAgIAotICAgICAgIDx0cj48dGQ+ZG9jczwvdGQ+PHRkPmNyZWF0ZXMgdGhlIEhUTUwgVXNlcidzIEd1aWRlIGluIGJ1aWxkL2RvY3M8L3RkPjwvdHI+Ci0gICAgICAgPHRyPjx0ZD5qYXZhZG9jczwvdGQ+PHRkPmdlbmVyYXRlcyB0aGUgQVBJIGRvY3VtZW50YXRpb24gaW4gLi9idWlsZC9kb2NzL2FwaWRvY3M8L3RkPjwvdHI+Ci0gICAgICAgPHRyPjx0ZD5kaXN0PC90ZD48dGQ+Z2VuZXJhdGVzIGEgY29tcGxldGUgZGlzdHJpYnV0aW9uIHRyZWUgd2l0aCB6aXAgYW5kIHRhci5neiBkaXN0cmlidXRpb24gZmlsZXMgaW4gYnVpbGQ8L3RkPjwvdHI+Ci0gICAgICAgPHRyPjx0ZD5jbGVhbjwvdGQ+PHRkPnB1cmdlcyB0aGUgYnVpbGQgYW5kIGRpc3RyaWJ1dGlvbjwvdGQ+PC90cj4gCi0gIDwvdGFibGU+Ci0gIDxwPklmIHlvdSBidWlsZCBhIHRhcmdldCB0aGF0IGRlcGVuZHMgb24gb3RoZXIgdGFyZ2V0cywgQW50IGNyZWF0ZXMgdGhvc2Ugb3RoZXIgdGFyZ2V0cyBpbiB0aGUgY29ycmVjdCBvcmRlci48L3A+Ci0gICA8L3MzPjxhbmNob3IgbmFtZT0iamFyIi8+IAotICAgPHMzIHRpdGxlPSJSZWJ1aWxkaW5nICZ4c2x0NGo7Ij4KLSAgICAgPHA+VGhlICZ4c2x0NGo7IGJ1aWxkIGlzIGluIHhhbGFuLmphci4gVGhlICZ4c2x0NGo7IHNvdXJjZSBjb2RlIHRyZWUgaXMgaW4gdGhlIHNyYyBkaXJlY3RvcnkuPC9wPgotICAgICA8cD5JZiB5b3UgYXJlIHVzaW5nIEFudCwgdGhlIHRhcmdldCBpcyBqYXIgKHRoZSBkZWZhdWx0KS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8bGluayBhbmNob3I9ImFudCI+VXNpbmcKLSAgICAgQW50PC9saW5rPi48L3A+Ci0gICAgIDxwPklmIHlvdSB3YW50IHRvIGRvIHRoZSBidWlsZCB3aXRob3V0IEFudCwga2VlcCB0aGUgZm9sbG93aW5nIGluIG1pbmQ6PC9wPgotICAgICA8dWw+Ci0gICAgIDxsaT5TZXQgdGhlIGNsYXNzcGF0aCB0byBpbmNsdWRlIHRoZSBzcmMgZGlyZWN0b3J5LCB4ZXJjZXMuamFyLCBic2YuamFyLCBhbmQgYnNmZW5naW5lcy5qYXIuPC9saT4KLSAgICAgPGxpPlVzZSBhIEphdmEgY29tcGlsZXIgKHN1Y2ggYXMgdGhlIElCTSBKdXN0LUluLVRpbWUgY29tcGlsZXIgb3IgdGhlIFN1biBqYXZhYykgdG8gY29tcGlsZSBhbGwgdGhlIC5qYXZhIGZpbGVzIGluIHRoZSBzcmMKLSAgICAgdHJlZS4gPC9saT4KLSAgICAgPGxpPlVzZSB0aGUgU3VuIGphciB1dGlsaXR5IHRvIHN0b3JlIHRoZSByZXN1bHRpbmcgLmNsYXNzIGZpbGVzIGluIHhhbGFuLmphcjwvbGk+Ci0gICAgIDwvdWw+Ci0gICA8L3MzPjxhbmNob3IgbmFtZT0ic2FtcGxlcyIvPgotICAgPHMzIHRpdGxlPSJSZWJ1aWxkaW5nIGEgc2FtcGxlIGFwcGxpY2F0aW9uIj4KLSAgIDxwPklmIHlvdSBtb2RpZnkgYSBzYW1wbGUgYW5kIHdhbnQgdG8gcmVjb21waWxlIGl0LCB5b3UgY2FuIHJ1biB0aGUgSmF2YSBjb21waWxlciBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlCi0gICBleGFtcGxlLiBCZSBzdXJlIHhhbGFuLmphciBhbmQgeGVyY2VzLmphciBhcmUgb24gdGhlIGNsYXNzcGF0aC4gVG8gcmVjb21waWxlIChhbmQgcnVuISkgdGhlIGNsYXNzIGZpbGVzIGluIHRoZQotICAgU2VydmxldCBzdWJkaXJlY3RvcnksIHRoZSBqYXZheC5zZXJ2bGV0IGFuZCBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZXMgbXVzdCBhbHNvIGJlIG9uIHRoZSBjbGFzc3BhdGguIFN1bgotICAgZGlzdHJpYnV0ZXMgdGhlc2UgcGFja2FnZXMgaW4gdGhlIEpTV0RLIDEuMC4xIHNlcnZsZXQuamFyIGZpbGUuPC9wPiAKLSAgIDxwPkFmdGVyIHJlY29tcGlsaW5nIGEgc2FtcGxlLCB5b3UgY2FuIHVzZSB0aGUgU3VuIGphciB1dGlsaXR5IHRvIHBsYWNlIHlvdXIgbmV3IC5jbGFzcyBmaWxlcyBpbgotICAgIHhhbGFuc2FtcGxlcy5qYXIuPC9wPgotICAgIDxwPllvdSBjYW4gdXNlIEFudCB3aXRoIHRoZSBzYW1wbGVzIHRhcmdldCB0byByZWNvbXBpbGUgdGhlIHNhbXBsZXMgYW5kIHBsYWNlIHRoZSB1bnBhY2thZ2VkIGNsYXNzIGZpbGVzIGluIHhhbGFuc2FtcGxlcy5qYXIuCi0gICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGxpbmsgYW5jaG9yPSJhbnQiPlVzaW5nIEFudDwvbGluaz4uPC9wPgotICAgIDxub3RlPlRvIHJlYnVpbGQgKGFuZCB0byBydW4pIHRoZSBzYW1wbGUgc2VydmxldCwgdGhlIGphdmF4LnNlcnZsZXQgYW5kIGphdmF4LnNlcnZsZXQuaHR0cCBwYWNrYWdlcyBtdXN0IGJlIG9uIHlvdXIKLSAgICBjbGFzc3BhdGguPC9ub3RlPgotICAgPC9zMz48YW5jaG9yIG5hbWU9ImRvYyIvPgotICAgPHMzIHRpdGxlPSJSZWJ1aWxkaW5nIHRoZSAmeHNsdDRqOyBkb2N1bWVudGF0aW9uIj4KLSAgICAgPHA+JnhzbHQ0ajsgaW5jbHVkZXMgYSBudW1iZXIgb2YgWE1MIHNvdXJjZSBmaWxlcywgWFNMIHN0eWxlc2hlZXRzLCBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkKLSAgICAgIGZpbGVzLCBlbnRpdHkgcmVsYXRpb25zaGlwIChFTlQpIGZpbGVzLCBncmFwaGljcywgYW5kIGEgSmF2YVNjcmlwdCBmaWxlIHRoYXQgcHJvdmlkZSB0aGUgaW5wdXQgZm9yIHRoZSBYYWxhbgotICAgICAgSFRNTCBVc2VyJ3MgR3VpZGUsIGFuZCB0aGUgb3ZlcnZpZXcgYW5kIHBhY2thZ2UtbGV2ZWwgZG9jdW1lbnRzIHVzZWQgZHVyaW5nIHRoZSBnZW5lcmF0aW9uIG9mIEphdmFkb2MuPC9wPgotICAgICAgPHA+VG8gcmVidWlsZCB0aGUgZG9jdW1lbnRhdGlvbiwgeW91IG11c3QgdXNlIHRoZSBTdHlsZUJvb2sgdG9vbCBhbmQgdGhlIEpESyAxLjIuMiBqYXZhIGFuZCBqYXZhZG9jCi0gICAgICB0b29scy4gU3R5bGVCb29rICh3aGljaCB1c2VzIFhhbGFuIGFuZCBYZXJjZXMpIGlzIGluIHN0eWxlYm9vay0xLjAtYjIuamFyLiBTb21lIG9mIHRoZSBkb2N1bWVudCBkZWZpbml0aW9uIGZpbGVzLAotICAgICAgc3R5bGVzaGVldHMsIGFuZCByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiB4bWwtc2l0ZS1zdHlsZS50YXIuZ3osIGFuZCBhcmUgdW56aXBwZWQgd2hlbiB5b3UgcnVuIEFudCBhcyBkZXNjcmliZWQKLSAgICAgICBiZWxvdy48L3A+Ci0gICAgICA8cD5Zb3UgY2FuIHVzZSBBbnQgd2l0aCB0aGUgZG9jcyB0YXJnZXQgdG8gcmVnZW5lcmF0ZSB0aGUgVXNlcidzIEd1aWRlIGFuZCB3aXRoIHRoZSBqYXZhZG9jcyB0YXJnZXQgdG8gcmVnZW5lcmF0ZSB0aGUKLSAgICAgIEphdmFkb2MgQVBJIGRvY3VtZW50YXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGxpbmsgYW5jaG9yPSJhbnQiPlVzaW5nIEFudDwvbGluaz4uPC9wPgotICAgICAgPHA+SWYgeW91IHdhbnQgdG8gcmVidWlsZCB0aGUgZG9jdW1lbnRhdGlvbiB3aXRob3V0IHVzaW5nIEFudCwga2VlcCB0aGUgZm9sbG93aW5nIGluIG1pbmQ6PC9wPgotICAgICAgIDx1bD4KLSAgICAgICA8bGk+VW56aXAgeG1sLXNpdGUtc3R5bGUudGFyLmd6IGludG8gdGhlIHhkb2NzIGRpcmVjdG9yeSAodGhlIG9wZXJhdGlvbiBwbGFjZXMgZmlsZXMgaW4gYSBudW1iZXIgb2Ygc3ViZGlyZWN0b3JpZXMpLgotICAgICAgIDxici8+PGJyLz48L2xpPgotICAgICAgIDxsaT5CZSBzdXJlIHN0eWxlYm9vay0xLjAtYjIuamFyLCB4YWxhbmpkb2MuamFyLCB4YWxhbi5qYXIsIGJzZi5qYXIsIGJzZmVuZ2luZXMuamFyLCBhbmQgeGVyY2VzLmphciBhcmUgb24gdGhlIGNsYXNzCi0gICAgICAgcGF0aC48YnIvPjxici8+PC9saT4KLSAgICAgICA8bGk+VG8gYnVpbGQgZG9jIGluIGEgYnVpbGQvZG9jcyBzdWJkaXJlY3RvcnksIHJ1biBTdHlsZUJvb2sgZnJvbSB0aGUgeGRvY3MgZGlyZWN0b3J5IGFzIGZvbGxvd3M6PGJyLz48YnIvPgotICAgICAgIDxjb2RlPmphdmEgb3JnLmFwYWNoZS5zdHlsZWJvb2suU3R5bGVCb29rICJ0YXJnZXREaXJlY3Rvcnk9Li4vYnVpbGQvZG9jcy8iIHNvdXJjZXMveGFsYW5Mb2NhbC54bWwgc3R5bGU8L2NvZGU+Ci0gICAgICAgPGJyLz48YnIvPjwvbGk+Ci0gICAgICAgPGxpPlRvIGJ1aWxkIHRoZSBIVE1MIHNvdXJjZSBmaWxlcyB0aGF0IGphdmFkb2MgbmVlZHMgZm9yIHRoZSBUckFYIHRvcC1sZXZlbCBhbmQgcGFja2FnZS1sZXZlbCBkb2N1bWVudGF0aW9uLCBhZGQKLSAgICAgICBhIGJ1aWxkL2RvY3MvYXBkaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybSBkaXJlY3RvcnkgYW5kIHJ1biB0aGUgWGFsYW4gY29tbWFuZC1saW5lIHV0aWxpdHkgZnJvbSB0aGUgeGRvY3MgZGlyZWN0b3J5IAotICAgICAgIGFzIGZvbGxvd3MgKGFsbCBvbmUgbGluZSk6PGJyLz48YnIvPgotPGNvZGU+Ci1qYXZhIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIAotICAtaW4gc291cmNlcy90cmF4L3RyYXgueG1sCi0gIC1wYXJhbSBwYWNrYWdlLXJvb3QgJy4uLy4uLy4uL3NyYy8nCi0gIC14c2wgc3R5bGUvc3R5bGVzaGVldHMvc3BlYy54c2wgCi0gIC1vdXQgYnVpbGQvZG9jcy9hcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vdHJheC5odG1sPC9jb2RlPjxici8+PGJyLz48L2xpPgotICAgICAgICA8bGk+QmVmb3JlIHlvdSBydW4gamF2YWRvYywgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBleGlzdHMgdW5kZXIgdGhlIFhhbGFuIHJvb3QKLSAgICAgICAgIGRpcmVjdG9yeTogYnVpbGQvZG9jcy9hcGlkb2NzLjxici8+PGJyLz48L2xpPgotICAgICAgIDxsaT5UbyBidWlsZCB0aGUgQVBJIGRvY3VtZW50YXRpb24sIHJ1biB0aGUgSkRLIDEuMi4yIGphdmFkb2MgdG9vbCBmcm9tIHRoZSB4ZG9jcyBkaXJlY3RvcnkgKGFsbCBvbmUgbGluZSk6PGJyLz48YnIvPgotPGNvZGU+Ci1qYXZhZG9jIC1kb2NsZXQgeGFsYW5qZG9jLlN0YW5kYXJkIAotIC1kb2NsZXRwYXRoIC4uL2Jpbi94YWxhbmpkb2MuamFyIAotIC1wcml2YXRlCi0gLW92ZXJ2aWV3IC4uL3NyYy9qYXZhZG9jT3ZlcnZpZXcuaHRtbCAtc291cmNlcGF0aCAuLi9zcmMgCi0gLWdyb3VwIFRyQVggImphdmF4LnhtbC50cmFuc2Zvcm0qIiAKLSAtZ3JvdXAgWGFsYW5fQ29yZSAib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3I6Ci0gICAgICAgIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzOgotIG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIiCi0gLWdyb3VwIFhQYXRoICJvcmcuYXBhY2hlLnhwYXRoKiIKLSAtZ3JvdXAgVXRpbGl0aWVzICJvcmcuYXBhY2hlLnhtbC51dGlscyoiCi0gLWdyb3VwIFhhbGFuX090aGVyICJvcmcuYXBhY2hlLnhhbGFuLmNsaWVudDoKLSAgICAgICAgb3JnLmFwYWNoZS54YWxhbi5kdG06Ci0gb3JnLmFwYWNoZS54YWxhbi5leHRlbnNpb25zOm9yZy5hcGFjaGUueGFsYW4ucmVzOgotIG9yZy5hcGFjaGUueGFsYW4uc3RyZWU6b3JnLmFwYWNoZS54YWxhbi50cmFjZToKLSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQiIAotIC1ncm91cCBYYWxhbl9FeHRlbnNpb25zICJvcmcuYXBhY2hlLnhhbGFuLmxpYioiIAotIC1ncm91cCBTZXJpYWxpemVycyAib3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUiIAotIG9yZy5hcGFjaGUueGFsYW4uY2xpZW50IG9yZy5hcGFjaGUueGFsYW4uZHRtIAotIG9yZy5hcGFjaGUueGFsYW4uZXh0ZW5zaW9ucyBvcmcuYXBhY2hlLnhhbGFuLmxpYiAKLSBvcmcuYXBhY2hlLnhhbGFuLmxpYi5zcWwgb3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IgCi0gb3JnLmFwYWNoZS54YWxhbi5yZXMgb3JnLmFwYWNoZS54YWxhbi5zdHJlZSAKLSBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcyBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlIAotIG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIgb3JnLmFwYWNoZS54YWxhbi54c2x0IAotIG9yZy5hcGFjaGUueHBhdGggb3JnLmFwYWNoZS54cGF0aC5heGVzIAotIG9yZy5hcGFjaGUueHBhdGguY29tcGlsZXIgb3JnLmFwYWNoZS54cGF0aC5mdW5jdGlvbnMgCi0gb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzIG9yZy5hcGFjaGUueHBhdGgub3BlcmF0aW9ucyAKLSBvcmcuYXBhY2hlLnhwYXRoLnBhdHRlcm5zIG9yZy5hcGFjaGUueHBhdGgucmVzCi0gb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUgamF2YXgueG1sLnRyYW5zZm9ybSAgCi0gamF2YXgueG1sLnRyYW5zZm9ybS5kb20gamF2YXgueG1sLnRyYW5zZm9ybS5zYXggCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0gamF2YXgueG1sLnBhcnNlcnMKLSAtZCAuLi9idWlsZC9kb2NzL2FwaWRvY3MgLXdpbmRvd3RpdGxlICJYYWxhbi1KYXZhIDIiIAotIC1kb2N0aXRsZSAiWGFsYW4tSmF2YSAyIiAtYm90dG9tICJDb3B5cmlnaHQgJiMxNjk7IAotICAyMDAwIEFwYWNoZSBYTUwgUHJvamVjdC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iCi08L2NvZGU+PC9saT4KLTwvdWw+Ci0gIDwvczM+ICAgIAotIDwvczI+PGFuY2hvciBuYW1lPSJjb250YWN0Ii8+Ci0gPHMyIHRpdGxlPSJHZXR0aW5nIGluIFRvdWNoIj4KLSAgPHA+WW91ciBmZWVkYmFjayBpcyBtb3JlIHRoYW4gd2VsY29tZS4gT2ZmZXJzIG9mIGhlbHAgYXJlIGV2ZW4gbW9yZSBzbyEgUGVyaGFwcyB5b3Ugd291bGQgbGlrZSB0byB0YWtlIG9uIGFuIGFjdGl2ZSByb2xlIGluIHRoZSBvbmdvaW5nIGRldmVsb3BtZW50LCB0ZXN0aW5nLCBhbmQgZG9jdW1lbnRhdGlvbiBvZiAmeHNsdDRqOz88L3A+IAotPHA+UGxlYXNlIGVtYWlsIHlvdXIgY29tbWVudHMsIHF1ZXN0aW9ucywgc3VnZ2VzdGlvbnMsIGFuZCBvZmZlcnMgdG8gam9pbiB0aGUgWGFsYW4gdGVhbSB0byA8aHVtYW4tcmVzb3VyY2UtcmVmIGlkcmVmPSJ4YWxhbmRldiIvPi48L3A+Ci0gPC9zMj48YW5jaG9yIG5hbWU9Imhpc3RvcnkiLz4KLSA8czIgdGl0bGU9IkN1bXVsYXRpdmUgaGlzdG9yeSBvZiBzb2Z0d2FyZSBjaGFuZ2VzIj4KLSAgIDxwPlRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgbGlzdCB0aGUgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2Ugc2luY2UgJnhzbHQ0ajsgdmVyc2lvbiAyLjAuRDAxLjwvcD4KLSAgICZoaXN0b3J5LWo7Ci0gPC9zMj4KLTwvczE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94YWxhbi9yZXNvdXJjZXMueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi9yZXNvdXJjZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ZhNWYyLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vcmVzb3VyY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVUy1BU0NJSSI/PgotPCFET0NUWVBFIHJlc291cmNlcyBbCi0gIDwhRU5USVRZICUgZXh0ZXJuYWxFbnRpdHkgU1lTVEVNICIuLi9lbnRpdGllcy5lbnQiPgotICAlZXh0ZXJuYWxFbnRpdHk7Ci0gIDwhRUxFTUVOVCByZXNvdXJjZXMgKHJlc291cmNlfGh1bWFuLXJlc291cmNlKSs+Ci0gIDwhRUxFTUVOVCByZXNvdXJjZSBFTVBUWT4KLSAgPCFBVFRMSVNUIHJlc291cmNlIAkJCi0gICAgICAgIGlkIENEQVRBICNJTVBMSUVECi0JCQkJdGl0bGUgQ0RBVEEgI0lNUExJRUQKLQkJCQlsb2NhdGlvbiBDREFUQSAjSU1QTElFRD4KLSAgPCFFTEVNRU5UIGh1bWFuLXJlc291cmNlIEVNUFRZPgotICA8IUFUVExJU1QgaHVtYW4tcmVzb3VyY2UgCQotICAgICAgICBpZCBDREFUQSAjSU1QTElFRAotCQkJCW5hbWUgQ0RBVEEgI0lNUExJRUQKLQkJCQltYWlsdG8gQ0RBVEEgI0lNUExJRUQ+Ci0gICBdPiAgCi08cmVzb3VyY2VzPiAJCi0gIDxyZXNvdXJjZSBpZD0ieHNsdDRqLWN1cnJlbnQiIAotICAgICAgICAgICAgdGl0bGU9IiZ4c2x0NGotY3VycmVudDsiIAotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbiIvPgotICA8cmVzb3VyY2UgaWQ9InhzbHQ0ai1kaXN0LXppcCIgCi0gICAgICAgICAgICB0aXRsZT0iJnhzbHQ0ai1kaXN0Oy56aXAiIAotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy9kaXN0L3hhbGFuLWovJnhzbHQ0ai1kaXN0Oy56aXAiLz4KLSAgPHJlc291cmNlIGlkPSJ4c2x0NGotZGlzdC10YXJneiIgCi0gICAgICAgICAgICB0aXRsZT0iJnhzbHQ0ai1kaXN0Oy50YXIuZ3oiIAotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy9kaXN0L3hhbGFuLWovJnhzbHQ0ai1kaXN0Oy50YXIuZ3oiLz4KLSAgPHJlc291cmNlIGlkPSJ4c2x0NGotZGlzdGRpciIgCi0gICAgICAgICAgICB0aXRsZT0ieGFsYW4taiBkaXN0cmlidXRpb24gZGlyZWN0b3J5IiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvZGlzdC94YWxhbi1qLyIvPgotICA8cmVzb3VyY2UgaWQ9InhtbDRqLXVzZWQiIAotICAgICAgICAgICAgdGl0bGU9IiZ4bWw0ai11c2VkOyIgCi0gICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hlcmNlcy1qL2luZGV4Lmh0bWwiLz4KLSAgPHJlc291cmNlIGlkPSJ4bWw0ai1kaXN0ZGlyIiAKLSAgICAgICAgICAgIHRpdGxlPSJ4ZXJjZXMtaiBkaXN0cmlidXRpb24gZGlyZWN0b3J5IiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvZGlzdC94ZXJjZXMtai8iLz4KLSAgPHJlc291cmNlIGlkPSJhbnQiIHRpdGxlPSJBbnQiIAotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYW50L2luZGV4Lmh0bWwiLz4KLSAgPHJlc291cmNlIGlkPSJBcGFjaGVMaWNlbnNlIiAKLSAgICAgICAgICAgIHRpdGxlPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xIiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvZGlzdC9MSUNFTlNFLnR4dCIvPgotICA8cmVzb3VyY2UgaWQ9ImJ1Z3ppbGxhIgotICAgICAgICAgICAgdGl0bGU9IkJ1Z3ppbGxhICh0aGUgQXBhY2hlIGJ1ZyBkYXRhYmFzZSkiCi0gICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL25hZ295YS5iZXRhdmVyc2lvbi5vcmcvYnVnemlsbGEvIi8+Ci0gIDxyZXNvdXJjZSBpZD0iYnVnbGlzdCIKLSAgICAgICAgICAgIHRpdGxlPSJYYWxhbkoyIG9wZW4gYnVncyIgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2J1Z3ppbGxhL2J1Z2xpc3QuY2dpP2J1Z19zdGF0dXM9TkVXJmFtcDtidWdfc3RhdHVzPUFTU0lHTkVEJmFtcDtidWdfc3RhdHVzPVJFT1BFTkVEJmFtcDtlbWFpbDE9JmFtcDtlbWFpbHR5cGUxPXN1YnN0cmluZyZhbXA7ZW1haWxhc3NpZ25lZF90bzE9MSZhbXA7ZW1haWwyPSZhbXA7ZW1haWx0eXBlMj1zdWJzdHJpbmcmYW1wO2VtYWlscmVwb3J0ZXIyPTEmYW1wO2J1Z2lkdHlwZT1pbmNsdWRlJmFtcDtidWdfaWQ9JmFtcDtjaGFuZ2VkaW49JmFtcDt2b3Rlcz0mYW1wO2NoZmllbGRmcm9tPSZhbXA7Y2hmaWVsZHRvPU5vdyZhbXA7Y2hmaWVsZHZhbHVlPSZhbXA7cHJvZHVjdD1YYWxhbkoyJmFtcDtzaG9ydF9kZXNjPSZhbXA7c2hvcnRfZGVzY190eXBlPXN1YnN0cmluZyZhbXA7bG9uZ19kZXNjPSZhbXA7bG9uZ19kZXNjX3R5cGU9c3Vic3RyaW5nJmFtcDtidWdfZmlsZV9sb2M9JmFtcDtidWdfZmlsZV9sb2NfdHlwZT1zdWJzdHJpbmcmYW1wO2tleXdvcmRzPSZhbXA7a2V5d29yZHNfdHlwZT1hbnl3b3JkcyZhbXA7ZmllbGQwLTAtMD1ub29wJmFtcDt0eXBlMC0wLTA9bm9vcCZhbXA7dmFsdWUwLTAtMD0mYW1wO2NtZHR5cGU9ZG9pdCZhbXA7b3JkZXI9JTI3SW1wb3J0YW5jZSUyNyIvPiAgICAgICAgICAgICAgICAgICAKLSAgPHJlc291cmNlIGlkPSJic2YiCi0gICAgICAgICAgICB0aXRsZT0iQmVhbiBTY3JpcHRpbmcgRnJhbWV3b3JrIChCU0YpIgotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9wcm9qZWN0cy9ic2YiLz4gICAgIAotCQotICA8cmVzb3VyY2UgaWQ9IlJlYWRtZSIgCi0gICAgICAgICAgICB0aXRsZT0iWGFsYW4gUmVwb3NpdG9yeSBSZWxlYXNlIE5vdGVzIiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvd2Vic3JjL2N2c3dlYi5jZ2kveG1sLXhhbGFuL1JFQURNRSIvPgotICAgICAgICAgICAgCi0gIDxyZXNvdXJjZSBpZD0ieHNsIiB0aXRsZT0iRXh0ZW5zaWJsZSBTdHlsZXNoZWV0IExhbmd1YWdlIChYU0wpIFZlcnNpb24gMS4wIFczQyBDYW5kaWRhdGUgUmVjb21tZW5kYXRpb24iCi0gICBsb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsIi8+Ci0KLSAgPHJlc291cmNlIGlkPSJkcGF3c29ueHNsZmFxIiB0aXRsZT0iWFNMIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIiBsb2NhdGlvbj0iaHR0cDovL3d3dy5kcGF3c29uLmNvLnVrL3hzbC94c2xmYXEuaHRtbCIvPgotICAKLSAgPHJlc291cmNlIGlkPSJ4c2x0IiAKLSAgICAgICAgICAgIHRpdGxlPSJXM0MgUmVjb21tZW5kYXRpb24gWFNMIFRyYW5zZm9ybWF0aW9ucyAoWFNMVCkgVmVyc2lvbiAxLjAiCi0gICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCIvPgotICAKLSAgPHJlc291cmNlIGlkPSJ4cGF0aCIgCi0gICAgICAgICAgICB0aXRsZT0iWE1MIFBhdGggTGFuZ3VhZ2UgKFhQYXRoKSBWZXJzaW9uIDEuMCIgCi0gICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgiLz4gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICA8cmVzb3VyY2UgaWQ9ImRvbSIgCi0gICAgICAgICAgICB0aXRsZT0iRE9NIiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy9ET00iLz4KLSAgPHJlc291cmNlIGlkPSJkb20yIiAKLSAgICAgICAgICAgIHRpdGxlPSJET00gbGV2ZWwgMiIgCi0gICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTIvIi8+Ci0KLSAgPHJlc291cmNlIGlkPSJzYXgiIAotICAgICAgICAgICAgdGl0bGU9IlNBWCIgCi0gICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9zYXguaHRtbCIvPgotICA8cmVzb3VyY2UgaWQ9InNheDIiIAotICAgICAgICAgICAgdGl0bGU9IlNBWCAyIiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vd3d3Lm1lZ2dpbnNvbi5jb20vU0FYL0phdmEvaW5kZXguaHRtbCIvPgotICA8cmVzb3VyY2UgaWQ9ImpheHAiIAotICAgICAgICAgICAgdGl0bGU9IkphdmEgQVBJIGZvciBYTUwgUGFyc2luZyAxLjAiIAotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2RvY3MvYXBpL2luZGV4Lmh0bWwiLz4KLSAgPHJlc291cmNlIGlkPSJqYXhwMTEiIAotICAgICAgICAgICAgdGl0bGU9IkphdmEgQVBJIGZvciBYTUwgUHJvY2Vzc2luZyAxLjEgUHVibGljIFJldmlldyAyIiAKLSAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL2Fib3V0SmF2YS9jb21tdW5pdHlwcm9jZXNzL3Jldmlldy9qc3IwNjMvamF4cC1wZDIucGRmIi8+Ci0gIDxyZXNvdXJjZSBpZD0ianNyMDYzIgotICAgICAgICAgICAgdGl0bGU9IkphdmEgU3BlY2lmaWNhdGlvbiBSZXF1ZXN0IDYzIgotICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20vYWJvdXRKYXZhL2NvbW11bml0eXByb2Nlc3MvcmV2aWV3L2pzcjA2MyIvPgotICA8cmVzb3VyY2UgaWQ9InRyYXgiIAotICAgICAgICAgICAgdGl0bGU9IlRSYVggKFRyYW5zZm9ybWF0aW9uIEFQSSBmb3IgWE1MKSIgCi0gICAgICAgICAgICBsb2NhdGlvbj0iYXBpZG9jcy9qYXZheC94bWwvdHJhbnNmb3JtL3RyYXguaHRtbCIvPgotICAgICAgICAgICAgCi0gIDxyZXNvdXJjZSBpZD0iY29tcGF0YXBpIgotICAgICAgICAgICAgdGl0bGU9IlhhbGFuLUphdmEgMSBjb21wYXRpYmlsaXR5IEphdmFkb2MiCi0gICAgICAgICAgICBsb2NhdGlvbj0iY29tcGF0X2FwaWRvY3MvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgCi0gIDxodW1hbi1yZXNvdXJjZSBpZD0ieGFsYW5kZXYiIAotICAgICAgICAgICAgICAgICAgbmFtZT0iWGFsYW4gRGV2ZWxvcG1lbnQgTWFpbGluZyBMaXN0IiAKLSAgICAgICAgICAgICAgICAgIG1haWx0bz0ieGFsYW4tZGV2QHhtbC5hcGFjaGUub3JnIi8+Ci08L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hhbGFuL3NhbXBsZXMueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi9zYW1wbGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4YTEyYi4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hhbGFuL3NhbXBsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhRE9DVFlQRSBzMSBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9kb2N1bWVudC5kdGQiPgotPCEtLQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLTxzMSB0aXRsZT0iJnhzbHQ0ajI7IFNhbXBsZXMiPgotPHVsPgotPGxpPjxsaW5rIGFuY2hvcj0ic2ltcGxldHJhbnNmb3JtIj5TaW1wbGVUcmFuc2Zvcm08L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InVzZXN0eWxlc2hlZXRwaSI+VXNlU3R5bGVzaGVldFBJPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJ1c2VzdHlsZXNoZWV0cGFyYW0iPlVzZVN0eWxlc2hlZXRQYXJhbTwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0ic2F4MnNheCI+U0FYMlNBWDwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iZG9tMmRvbSI+RE9NMkRPTTwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0icGlwZSI+UGlwZTwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0idXNleG1sZmlsdGVycyI+VXNlWE1MRmlsdGVyczwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iYXBwbHl4cGF0aCI+QXBwbHlYUGF0aDwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0iYXBwbGV0eG1sdG9odG1sIj5BcHBsZXRYTUx0b0hUTUw8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImdldC10b2RvLWxpc3QiPmdldC10b2RvLWxpc3Q8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InNlcnZsZXQiPnNlcnZsZXQ8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImV4dGVuc2lvbnMiPkV4dGVuc2lvbnM8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InRyYWNlIj5UcmFjZTwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0idHJheCI+dHJheDwvbGluaz48L2xpPgotPC91bD4gIAotCSAgPHMyIHRpdGxlPSJTYW1wbGVzIHRvIGhlbHAgeW91IGdldCBzdGFydGVkIj4KLSAgICA8cD5FYWNoIG9mIHRoZSBzdWJkaXJlY3RvcmllcyBpbiB0aGUgJnhzbHQ0ajsgamF2YS9zYW1wbGVzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgc291cmNlIGZpbGVzIGZvciBvbmUgb3IgbW9yZQotICAgICBzYW1wbGUgYXBwbGljYXRpb25zLiBUaGUgY2xhc3MgZmlsZXMgZm9yIHRoZSBzYW1wbGVzIGFyZSBpbiB4YWxhbnNhbXBsZXMuamFyIChldmVyeXRoaW5nIGV4Y2VwdCB0aGUgc2VydmxldCkgYW5kIHhhbGFuc2VydmxldC5qYXIsIHNvIHRvIHJ1biB0aGUgc2FtcGxlcywgeW91IHNob3VsZCBwbGFjZSB0aGVzZSBKQVIgZmlsZXMgb24gdGhlIHN5c3RlbSBjbGFzc3BhdGguPC9wPgotICAgICA8cD5XaXRoIG1vc3Qgb2YgdGhlIHNhbXBsZXMsIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlOjwvcD4KLSAgICAgPG9sPgotICAgICA8bGk+QmUgc3VyZSB4YWxhbi5qYXIsIHhhbGFuc2FtcGxlcy5qYXIsIGFuZCB4ZXJjZXMuamFyIGFyZSBvbiB0aGUgc3lzdGVtIGNsYXNzCi0gICAgICBwYXRoLiBGb3IgdGhlIGV4dGVuc2lvbiBleGFtcGxlcywgYnNmLmphciBhbmQgKGZvciB0aGUgSmF2YVNjcmlwdCBleHRlbnNpb25zKSBqcy5qYXIgbXVzdCBhbHNvIGJlIG9uIHRoZSBjbGFzcwotICAgICAgcGF0aC48L2xpPgotICAgICA8bGk+QmUgc3VyZSB0aGUgamF2YSBleGVjdXRhYmxlIGlzIG9uIHlvdXIgcGF0aC48L2xpPgotICAgICA8bGk+R28gdG8gdGhlIHNhbXBsZXMgc3ViZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNhbXBsZSAodXNlIHRoZSBET1Mgc2hlbGwgaWYgeW91IGFyZSBydW5uaW5nIFdpbmRvd3MpLjwvbGk+Ci0gICAgIDxsaT5SdW4gdGhlIHNhbXBsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGFzIGluZGljYXRlZCBiZWxvdykuPC9saT4KLSAgICA8bGk+RXhhbWluZSB0aGUgYXBwbGljYXRpb24gc291cmNlIGZpbGVzLiBZb3UgbWF5IGFsc28gd2FudCB0byBtb2RpZnkgdGhlIHNvdXJjZSBmaWxlcy4gUmVtZW1iZXIgdGhhdCBpZiB5b3UKLSAgICAgbW9kaWZ5IGEgamF2YSBmaWxlLCB5b3UgbXVzdCByZWNvbXBpbGUgdGhlIGNsYXNzIGFuZCBwbGFjZSBpdCBvbiB0aGUgY2xhc3NwYXRoIGJlZm9yZSB5b3UgY2FuIHJ1biB0aGUKLSAgICAgbW9kaWZpZWQgYXBwbGljYXRpb24uPC9saT4KLSAgICAgPC9vbD4gICAgICAKLSAgICA8cD5UaGUgYmFzaWMgY29tbWFuZCBsaW5lIGZvciBydW5uaW5nIG1vc3Qgb2YgdGhlIHNhbXBsZXMgaXMgPC9wPiAKLSAgICA8cD48Y29kZT5qYXZhIDxyZWY+Y2xhc3NuYW1lIGFyZ3M8L3JlZj48L2NvZGU+PC9wPgotICAgIDxwPndoZXJlIDxyZWY+Y2xhc3NuYW1lPC9yZWY+IGlzIHRoZSBzYW1wbGUgY2xhc3MgYW5kIDxyZWY+YXJnczwvcmVmPiBhcmUgdGhlIGFyZ3VtZW50cywgaWYgYW55LiBBcyBkZXNjcmliZWQgaW4KLSAgICAgdGhlIGZvbGxvd2luZyBzZWN0aW9ucywgc29tZSBzYW1wbGVzIHRha2Ugbm8gYXJndW1lbnRzLiBUaGUgVXNlU3R5bGVzaGVldFBhcmFtIHNhbXBsZSB0YWtlcyBhbgotICAgICBhZGRpdGlvbmFsIGFyZ3VtZW50LiBTZXZlcmFsIHNhbXBsZXMgaW4gZXh0ZW5zaW9ucyB1c2UgdGhlICZ4c2x0NGo7IAotICAgICA8bGluayBpZHJlZj0iY29tbWFuZGxpbmUiPmNvbW1hbmQtbGluZSB1dGlsaXR5PC9saW5rPiwgc28gdGhleSB0YWtlIGFyZ3VtZW50cyBmb3IgdGhlIFhNTCBzb3VyY2UKLSAgICAgZmlsZSBhbmQgdGhlIFhTTCBzdHlsZXNoZWV0LjwvcD4KLSAgCTwvczI+PGFuY2hvciBuYW1lPSJzaW1wbGV0cmFuc2Zvcm0iLz4KLSAgICA8czIgdGl0bGU9IlNpbXBsZVRyYW5zZm9ybSI+Ci0gICAgPHA+V2hhdCBpdCBkb2VzOiBUaGUgU2ltcGxlVHJhbnNmb3JtIGNsYXNzIHVzZXMgdGhlIGJpcmRzLnhzbCBzdHlsZXNoZWV0IHRvIHRyYW5zZm9ybSBiaXJkcy54bWwsIGFuZCBwcmludHMgdGhlCi0gICAgIG91dHB1dCB0byBiaXJkcy5vdXQuPC9wPgotICAgIDxwPllvdSBjYW4gcnVuIGl0IGZyb20gdGhlIFNpbXBsZVRyYW5zZm9ybSBzdWJkaXJlY3Rvcnkgd2l0aDwvcD4KLSAgICA8cD48Y29kZT5qYXZhIFNpbXBsZVRyYW5zZm9ybTwvY29kZT48L3A+Ci0gICAgPC9zMj48YW5jaG9yIG5hbWU9InVzZXN0eWxlc2hlZXRwaSIvPgotICAgIDxzMiB0aXRsZT0iVXNlU3R5bGVzaGVldFBJIj4KLSAgICA8cD5XaGF0IGl0IGRvZXM6IFRoZSBVc2VTdHlsZXNoZWV0UEkgY2xhc3MgdXNlcyB0aGUgc3R5bGVzaGVldCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGluIHRoZSBYTUwgc291cmNlIGRvY3VtZW50IHRvIGRldGVybWluZQotICAgICB3aGljaCBzdHlsZXNoZWV0IHRvIHVzZSB0byBwZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbi48L3A+Ci0gICAgIDxwPllvdSBjYW4gcnVuIGl0IGZyb20gdGhlIFVzZVN0eWxlc2hlZXRQSSBzdWJkaXJlY3Rvcnkgd2l0aDwvcD4KLSAgICAgPHA+PGNvZGU+amF2YSBVc2VTdHlsZXNoZWV0UEk8L2NvZGU+PC9wPgotICAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9ImVtYmVkIj5Xb3JraW5nIHdpdGggZW1iZWRkZWQgc3R5bGVzaGVldHM8L2xpbms+LjwvcD4KLSAgICA8L3MyPjxhbmNob3IgbmFtZT0idXNlc3R5bGVzaGVldHBhcmFtIi8+Ci0gICAgPHMyIHRpdGxlPSJVc2VTdHlsZXNoZWV0UGFyYW0iPgotICAgICAgPHA+V2hhdCBpdCBkb2VzOiBUaGUgVXNlU3R5bGVTaGVldFBhcmFtIGNsYXNzIHVzZXMgZm9vLnhzbCBhbmQgYSBzdHlsZXNoZWV0IHBhcmFtZXRlciB0byB0cmFuc2Zvcm0gZm9vLnhtbCwKLSAgICAgICBhbmQgcHJpbnRzIHRoZSBvdXRwdXQgdG8gU3lzdGVtLm91dC4gVGhlIHN0eWxlc2hlZXQgcGFyYW1ldGVyIGFwcGVhcnMgYXMgYSB0ZXh0IG5vZGUgaW4gdGhlIG91dHB1dC48L3A+Ci0gICAgPHA+UnVuIHRoaXMgc2FtcGxlIGZyb20gdGhlIFVzZVN0eWxlc2hlZXRQYXJhbSBzdWJkaXJlY3Rvcnkgd2l0aDwvcD4gCi0gICAgPHA+PGNvZGU+amF2YSBVc2VTdHlsZXNoZWV0UGFyYW0gPHJlZj5wYXJhbTwvcmVmPjwvY29kZT48L3A+Ci0gICAgPHA+d2hlcmUgPHJlZj5wYXJhbTwvcmVmPiBpcyB0aGUgc3R5bGVzaGVldCBwYXJhbWV0ZXIgdmFsdWUgKGEgc3RyaW5nIG9mIHlvdXIgY2hvaWNlKS48L3A+ICAKLSAgICA8L3MyPjxhbmNob3IgbmFtZT0ic2F4MnNheCIvPgotICA8czIgdGl0bGU9IlNBWDJTQVgiPgotICA8cD5XaGF0IGl0IGRvZXM6IEV4cGxpY2l0bHkgc2V0IHRoZSBTQVggWE1MUmVhZGVyIGFuZCBTQVggQ29udGVudEhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgdGhlIHN0eWxlc2hlZXQgKGJpcmRzLnhzbCksIHByb2Nlc3NpbmcgdGhlIFhNTCBpbnB1dCAoYmlyZHMueG1sKSwgYW5kIHByb2R1Y2luZyB0aGUgb3V0cHV0IChiaXJkcy5vdXQpLjwvcD4KLSAgPHA+UnVuIHRoaXMgc2FtcGxlIGZyb20gdGhlIFNBWDJTQVggc3ViZGlyZWN0b3J5IHdpdGg8L3A+Ci0gICA8cD48Y29kZT5qYXZhIFNBWDJTQVg8L2NvZGU+PC9wPgotICAgIDwvczI+PGFuY2hvciBuYW1lPSJkb20yZG9tIi8+Ci0gICAgPHMyIHRpdGxlPSJET00yRE9NIj4KLSAgICA8cD5XaGF0IGl0IGRvZXM6IHRoZSBET00yRE9NIGNsYXNzIHVzZXMgdGhlIGJpcmRzLnhzbCBzdHlsZXNoZWV0IHRvIHRyYW5zZm9ybSBhIERPTSBEb2N1bWVudCBnZW5lcmF0ZWQgZnJvbSBiaXJkcy54bWwsCi0gICAgIHByb2R1Y2VzIGFuIG91dHB1dCBET00sIGFuZCB0cmF2ZXJzZXMgdGhlIERPTSwgcHJpbnRpbmcgdGhlIHRyYXZlcnNhbCB0byBTeXN0ZW0ub3V0LiBJbiBjb250cmFzdCB0byBTaW1wbGVUcmFuc2Zvcm0sCi0gICAgICBET00yRE9NIGlsbHVzdHJhdGVzIHRoZSBwcm9jZWR1cmUgZm9yIHByb2Nlc3NpbmcgYW4gaW5wdXQgRE9NIGFuZCBjcmVhdGluZyBhbiBvdXRwdXQgRE9NIHRoYXQgaXMgYXZhaWxhYmxlIGZvcgotICAgICAgZnVydGhlciBwcm9jZXNzaW5nLjwvcD4KLSAgIDxwPllvdSBjYW4gcnVuIGl0IGZyb20gdGhlIERPTTJET00gc3ViZGlyZWN0b3J5IHdpdGg8L3A+Ci0gICAgPHA+PGNvZGU+amF2YSBET00yRE9NPC9jb2RlPjwvcD4KLSAgICA8L3MyPjxhbmNob3IgbmFtZT0icGlwZSIvPgotICAgIDxzMiB0aXRsZT0iUGlwZSI+Ci0gICAgPHA+V2hhdCBpdCBkb2VzOiBQaXBlcyB0aGUgb3V0cHV0IGZyb20gb25lIHRyYW5zZm9ybWF0aW9uIHRvIGEgc2Vjb25kIHRyYW5zZm9ybWF0aW9uLCB0aGVuIGZyb20gdGhlIHNlY29uZAotICAgIHRyYW5zZm9ybWF0aW9uIHRvIHRoZSB0aGlyZCB0cmFuc2Zvcm1hdGlvbi4gVHJhbnNmb3JtZXIxIGlzIHRoZSBDb250ZW50SGFuZGxlciBmb3IgdGhlIFhNTFJlYWRlciAod2hpY2ggcGFyc2VzIHRoZQotICAgIGlucHV0IGRvY3VtZW50KS4gVHJhbnNmb3JtZXIyIHByb3ZpZGVzIHRoZSBDb250ZW50SGFuZGxlciBmb3IgVHJhbnNmb3JtZXIxLCBhbmQgVHJhbnNmb3JtZXIzIGZvciBUcmFuc2Zvcm1lcjIuPC9wPgotICAgIDxub3RlPlBpcGUgYW5kIFVzZVhNTEZpbHRlcnMgaWxsdXN0cmF0ZSB0d28gc3RyYXRlZ2llcyBmb3IgdXNpbmcgdGhlIG91dHB1dCBvZiBvbmUgdHJhbnNmb3JtYXRpb24gYXMgdGhlIGlucHV0IGZvcgotICAgIGFub3RoZXIgdHJhbnNmb3JtYXRpb24uIFRoZSBQaXBlIHNhbXBsZSBpbmNvcnBvcmF0ZXMgYSAicHVzaCIgbW9kZWwgLS0gVHJhbnNmb3JtZXIxICJwdXNoZXMiIGl0cyBvdXRwdXQgdG8KLSAgICBUcmFuc2Zvcm1lcjIsIGFuZCBzbyBvbiAtLSB3aGVyZWFzIGluIHRoZSBVc2VYTUxGaWx0ZXJzIHNhbXBsZSwgVHJhbnNmb3JtZXIzICJwdWxscyIgaXRzIGlucHV0IGZyb20gVHJhbnNmb3JtZXIyLAotICAgIGFuZCBzbyBvbi48L25vdGU+Ci0gICAgPHA+UnVuIHRoaXMgc2FtcGxlIGZyb20gdGhlIFBpcGUgc3ViZGlyZWN0b3J5IHdpdGg8L3A+IAotICAgIDxwPjxjb2RlPmphdmEgUGlwZTwvY29kZT48L3A+Ci0gICAgPC9zMj48YW5jaG9yIG5hbWU9InVzZXhtbGZpbHRlcnMiLz4KLSAgICA8czIgdGl0bGU9IlVzZVhNTEZpbHRlcnMiPgotICAgIDxwPldoYXQgaXQgZG9lczogQ2hhaW5zIHRvZ2V0aGVyIHRoZSBzYW1lIHRyYW5zZm9ybWF0aW9ucyBhcyB0aGUgcHJlY2VkaW5nIFBpcGUgc2FtcGxlLiBVc2luZyBlYWNoIFRyYW5zZm9ybWVyCi0gICAgIG9iamVjdCBhcyBhbiBleHRlbnNpb24gb2YgdGhlIFNBWCBYTUxGaWx0ZXIgaW50ZXJmYWNlLCBzZXRzIHRoZSBYTUxSZWFkZXIgYXMgdGhlIHBhcmVudCBvZiBUcmFuc2Zvcm1lcjEsCi0gICAgIFRyYW5zZm9ybWVyMSBhcyB0aGUgcGFyZW50IG9mIFRyYW5zZm9ybWVyMiwgYW5kIFRyYW5zZm9ybWVyMiBhcyB0aGUgcGFyZW50IG9mIG9mIFRyYW5zZm9ybWVyMy48L3A+Ci0gICAgICA8cD5SdW4gdGhpcyBzYW1wbGUgZnJvbSB0aGUgVXNlWE1MRmlsdGVycyBzdWJkaXJlY3Rvcnkgd2l0aDwvcD4KLSAgIDxwPjxjb2RlPmphdmEgVXNlWE1MRmlsdGVyczwvY29kZT48L3A+Ci0gICAgPC9zMj48YW5jaG9yIG5hbWU9ImFwcGx5eHBhdGgiLz4KLSAgICA8czIgdGl0bGU9IkFwcGx5WFBhdGgiPgotICAgIDxwPldoYXQgaXQgZG9lczogQXBwbHlYUGF0aCB1c2VzIHRoZSA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveHBhdGgvWFBhdGhBUEkuaHRtbCI+WFBhdGhBUEk8L2p1bXA+IGNvbnZlbmllbmNlIG1ldGhvZHMgdG8KLSAgICBleGVjdXRlIGFuIFhQYXRoIGV4cHJlc3Npb24gYWdhaW5zdCBhbiBYTUwgZG9jdW1lbnQgYW5kIHJldHVybiB0aGUgbm9kZXMgKGlmIGFueSkgaXQgZmluZHMuPC9wPgotICAgICA8bm90ZT5Zb3UgY2FuIHVzZSB0aGlzIHNhbXBsZSBhcyBhbiBhaWQgd2hlbiB5b3Ugd2FudCB0byBmaW5kIG91dCB3aGF0IGEgZ2l2ZW4gWFBhdGggZXhwcmVzc2lvbiByZXR1cm5zIGZyb20gYQotICAgICBnaXZlbiBYTUwgZmlsZS4gS2VlcCBpbiBtaW5kIHRoYXQgdGhlIGNvbnRleHQgbm9kZSAoYmFzZSBwb2ludCBvZiBldmFsdWF0aW9uKSBmb3IgdGhlIFhQYXRoIGV4cHJlc3Npb24gaXMgdGhlIGRvY3VtZW50Ci0gICAgIHJvb3QuPC9ub3RlPgotICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBBcHBseVhQYXRoIHN1YmRpcmVjdG9yeSB3aXRoPC9wPiAKLSAgICA8cD48Y29kZT5qYXZhIEFwcGx5WFBhdGggPHJlZj5YTUxGaWxlIFhQYXRoRXhwcmVzc2lvbjwvcmVmPjwvY29kZT48L3A+Ci0gICAgPHA+d2hlcmUgPHJlZj5YTUxGaWxlPC9yZWY+IGlzIGFuIFhNTCBzb3VyY2UgZmlsZSBhbmQgPHJlZj5YUGF0aEV4cHJlc3Npb248L3JlZj4gaXMgYW4gWFBhdGggZXhwcmVzc2lvbiB0bwotICAgICBhcHBseSB0byB0aGF0IGZpbGUuIFRoZSBBcHBseVhQYXRoIHN1YmRpcmVjdG9yeSBjb250YWlucyBhbiBYTUwgZmlsZSBuYW1lZCBmb28ueG1sIC0tPGJyLz4KLSAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGNvZGU+Jmx0O2RvYyZndDsmbHQ7bmFtZSBmaXJzdD0iRGF2aWQiIGxhc3Q9Ik1hcnN0b24iLyZndDsuLi4mbHQ7L2RvYz48L2NvZGU+PGJyLz4gLS0gc28geW91IGNhbiB0cnkgY29tbWFuZAotICAgICBsaW5lcyBsaWtlPC9wPgotICAgIDxwPjxjb2RlPmphdmEgQXBwbHlYUGF0aCBmb28ueG1sIC88L2NvZGU+PC9wPgotICAgIDxwPmFuZDwvcD4KLSAgICA8cD48Y29kZT5qYXZhIEFwcGx5WFBhdGggZm9vLnhtbCAvZG9jL25hbWUvQGZpcnN0PC9jb2RlPjwvcD4KLSAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9InhwYXRoIj5Xb3JraW5nIHdpdGggWFBhdGggZXhwcmVzc2lvbnM8L2xpbms+LjwvcD4KLSAgICA8L3MyPjxhbmNob3IgbmFtZT0iYXBwbGV0eG1sdG9odG1sIi8+Ci0gICAgPHMyIHRpdGxlPSJBcHBsZXRYTUx0b0hUTUwiPgotICAgIDxwPlRoZSBhcHBsZXQgdXNlcyBhIHN0eWxlc2hlZXQgdG8gdHJhbnNmb3JtIGFuIFhNTCBkb2N1bWVudCBpbnRvIEhUTUwuIEl0IGRpc3BsYXlzIHRoZSBYTUwgZG9jdW1lbnQsIHRoZQotICAgICBzdHlsZXNoZWV0LCBhbmQgdGhlIEhUTUwgb3V0cHV0LjwvcD4KLSAgICA8cD5Ib3cgdG8gcnVuIGl0OiBPcGVuIGFwcGxldFhNTHRvSFRNTC5obXRsIGluIHRoZSBJbnRlcm5ldCBFeHBsb3JlciA1IGJyb3dzZXIuPC9wPgotICAgIDxub3RlPlRoaXMgYW5kIHRoZSBmb2xsb3dpbmcgc2FtcGxlIGFwcGxldCBkbyBub3Qgd29yayBpbiB0aGUgTmV0c2NhcGUgQ29tbXVuaWNhdG9yIDQuNy4gV2UgaGF2ZSBzb21lIHdvcmsgdG8gZG8gdG8gZ2V0Ci0gICAgb3VyIGJhc2ljIHN0cmF0ZWd5IG9mIHVzaW5nIHN5c3RlbSBwcm9wZXJ0aWVzIHRvIGlkZW50aWZ5IHRoZSBUcmFuc2Zvcm1lciBhbmQgWE1MIFBhcnNlciB0byB3b3JrIGluIHRoZSBOZXRzY2FwZSBhcHBsZXQKLSAgICBzYW5kYm94Ljxici8+PGJyLz4KLSAgICBCb3RoIGFwcGxldHMgbG9vayBmb3IgeGFsYW4uamFyIGFuZCB4ZXJjZXMuamFyIGluIHRoZSBiaW4gc3ViZGlyZWN0b3J5LiBJZiB5b3UgaGF2ZSBwbGFjZWQgdGhlc2UgSkFSIGZpbGVzCi0gICAgZWxzZXdoZXJlLCBhZGp1c3QgdGhlIGFwcGxldCBhcmNoaXZlIHNldHRpbmcgaW4gY2xpZW50Lmh0bWwgYW5kIGdldC10b2RvLWxpc3QuaHRtbCBhY2NvcmRpbmdseS48L25vdGU+Ci0gICAgPC9zMj48YW5jaG9yIG5hbWU9ImdldC10b2RvLWxpc3QiLz4KLSAgICA8czIgdGl0bGU9ImdldC10b2RvLWxpc3QiPgotICAgIDxwPlRoaXMgYXBwbGV0IHVzZXMgdG9kby54c2wgdG8gdHJhbnNmb3JtIHRvZG8ueG1sIGFuZCBkaXNwbGF5IHRoZSByZXN1bHQuIFRoZSBYTUwgc291cmNlICh0b2RvLnhtbCkgaXMgYSBzbmFwc2hvdCBvZiBhbgotICAgICBvbmdvaW5nIGxpc3Qgb2YgdGFza3MgYW5kIHRhc2sgY29tcGxldGlvbnMgZm9yIHRoZSAmeHNsdDRqMjsgcHJvamVjdCB0aGF0IGlzIG1haW50YWluZWQgaW4gdGhlIHhtbC14YWxhbi9qYXZhCi0gICAgIHN1YmRpcmVjdG9yeSBvZiB0aGUgQXBhY2hlIENWUyByZXBvc2l0b3J5LjwvcD4KLSAgICAgPHA+SG93IHRvIHJ1biBpdDogT3BlbiBnZXQtdG9kby1saXN0Lmh0bWwgaW4gdGhlIEludGVybmV0IEV4cGxvcmVyIDUgYnJvd3Nlci48L3A+Ci0gICAgPC9zMj48YW5jaG9yIG5hbWU9InNlcnZsZXQiLz4KLSAgICA8czIgdGl0bGU9InNlcnZsZXQiPgotICAgPHA+Rm9yIGEgZ2VuZXJhbCBpbnRyb2R1Y3Rpb24sIHNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJzZXJ2bGV0Ij5Vc2luZyAmeHNsdDRqOyBpbiBhIHNlcnZsZXQ8L2xpbms+LjwvcD4KLSAgICA8cD5UaGUgc2VydmxldCBzdWJkaXJlY3RvcnkgY29udGFpbnMgZm91ciBzYW1wbGUgc2VydmxldHMgdGhhdCB1c2UgJnhzbHQ0ajsgdG8gcGVyZm9ybSB0cmFuc2Zvcm1hdGlvbnMuIFRoZXNlIHNlcnZsZXRzIAotICAgIGFyZSBpbiBhIHBhY2thZ2UgbmFtZWQgc2VydmxldCBhbmQgYXJlIGNvbXBpbGVkIGluIHhhbGFuc2VydmxldC5qYXIuIFRvIHJ1biB0aGVzZSBzYW1wbGVzLCB5b3UgbXVzdCBwbGFjZSAKLSAgICB4YWxhbnNlcnZsZXQuamFyLCBhbmQgYW55IFhNTCBhbmQgWFNMIGZpbGVzIHlvdSB3YW50IHRvIHVzZSBvbiBhIHdlYiBzZXJ2ZXIgd2l0aCBhIHNlcnZsZXQgZW5naW5lLCBwbGFjZSAKLSAgICB4YWxhbnNlcnZsZXQuamFyLCB4YWxhbi5qYXIsIGFuZCB4ZXJjZXMuamFyIG9uIHRoZSBzZXJ2bGV0IGVuZ2luZSBjbGFzcyBwYXRoLCBhbmQgY29uZmlndXJlIHRoZSBzZXJ2bGV0IGVuZ2luZSB0bwotICAgIGxvY2F0ZSB0aGUgWE1MIGFuZCBYU0wgZmlsZXMsIGFuZCB0aGUgcHJvcGVydGllcyBmaWxlIHVzZWQgYnkgQXBwbHlYU0wuPC9wPgotICAgIDxwPjxsaW5rIGFuY2hvcj0ic2ltcGxleHNsdHNlcnZsZXQiPnNlcnZsZXQuU2ltcGxlWFNMVFNlcnZsZXQ8L2xpbms+IGFwcGxpZXMgYSBwYXJ0aWN1bGFyIHN0eWxlc2hlZXQgdG8gYSBwYXJ0aWN1bGFyIAotICAgIFhNTCBkb2N1bWVudC48L3A+IAotICAgIDxwPjxsaW5rIGFuY2hvcj0idXNlc3R5bGVzaGVldHBhcmFtc2VydmxldCI+c2VydmxldC5Vc2VTdHlsZXNoZWV0UGFyYW1TZXJ2bGV0PC9saW5rPiBzZXRzIGEgc3R5bGVzaGVldCBwYXJhbWV0ZXIgCi0gICAgKHRoZSBwYXJhbWV0ZXIgbmFtZSBpcyBoYXJkd2lyZWQgaW50byB0aGUgc2VydmxldCksIGFuZCByZXF1aXJlcyB0aGUgdXNlciB0byBzdXBwbHkgcGFyYW1ldGVycyBmb3IgdGhlIAotICAgIFhNTCBkb2N1bWVudCBhbmQgWFNMIHN0eWxlc2hlZXQuPC9wPgotICAgIDxwPjxsaW5rIGFuY2hvcj0ieHNsdHNlcnZsZXR3aXRocGFyYW1zIj5zZXJ2bGV0LlhTTFRTZXJ2bGV0V2l0aFBhcmFtczwvbGluaz4gYWNjZXB0cyBwYXJhbWV0ZXJzIGZvciB0aGUgWE1MIGRvY3VtZW50LCAKLSAgICB0aGUgWFNMIHN0eWxlc2hlZXQsIGFuZCBhbnkgbnVtYmVyIG9mIHN0eWxlc2hlZXQgcGFyYW1ldGVycy48L3A+Ci0gICAgPHA+PGxpbmsgYW5jaG9yPSJhcHBseXhzbHQiPnNlcnZsZXQuQXBwbHlYU0xUPC9saW5rPiAoYW5kIGFzc29jaWF0ZWQgY2xhc3NlcykgaXMgY2xvc2VyIHRvIGEgcHJvZHVjdGlvbiBsZXZlbCBzZXJ2bGV0LiBJdCBhY2NlcHRzIHBhcmFtZXRlcnMsIHByb3ZpZGVzIGEgCi0gICAgbGlzdGVuZXIgZm9yIGNhcHR1cmluZyBhbmQgcmVwb3J0aW5nIGRlYnVnZ2VyIG1lc3NhZ2VzLCBhbmQgc3VwcG9ydHMgIHVzZSBvZiBhIHByb3BlcnR5IGZpbGUgdG8gZGV0ZXJtaW5lIHdoaWNoIAotICAgIHN0eWxlc2hlZXQgdG8gYXBwbHkgYmFzZWQgb24gdGhlIGlkZW50aXR5IG9mIHRoZSBjbGllbnQgYnJvd3Nlci9kZXZpY2UuPC9wPgotICAgIDxhbmNob3IgbmFtZT0ic2ltcGxleHNsdHNlcnZsZXQiLz4KLSAgICA8czMgdGl0bGU9InNlcnZsZXQuU2ltcGxlWFNMVFNlcnZsZXQiPgotICAgIDxwPldoYXQgaXQgZG9lczogc2VydmxldC5TaW1wbGVYU0xUU2VydmxldCBhcHBsaWVzIHRoZSB0b2RvLnhzbCBzdHlsZXNoZWV0IHRvIHRvZG8ueG1sIGFuZCByZXR1cm5zIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQgdG8gdGhlCi0gICAgSFRUUCBjbGllbnQuPC9wPgotICAgIDxwPlRvIHJ1biB0aGlzIHNlcnZsZXQ6IHBsYWNlIHRvZG8ueHNsIGFuZCB0b2RvLnhtbCAoZnJvbSB0aGUgZGlzdHJpYnV0aW9uIHJvb3QgZGlyZWN0b3J5KSBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdXIgc2VydmxldCBlbmdpbmUKLSAgICBsb29rcyBmb3IgSFRUUCBkb2N1bWVudHMsIHBsYWNlIHhhbGFuc2VydmxldC5qYXIgb24gdGhlIHNlcnZsZXQgZW5naW5lIGNsYXNzcGF0aCwgYW5kIHNldCB1cCBhbiBIVE1MIHBhZ2UgdG8gY2FsbCB0aGUgc2VydmxldCBhcwotICAgIGZvbGxvd3M6PC9wPgotPGdsb3NzPjxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXRob21lL3NlcnZsZXQuU2ltcGxlWFNMVFNlcnZsZXQ8L2xhYmVsPjwvZ2xvc3M+Ci0gICAgIDwvczM+PGFuY2hvciBuYW1lPSJ1c2VzdHlsZXNoZWV0cGFyYW1zZXJ2bGV0Ii8+Ci0gICAgIDxzMyB0aXRsZT0ic2VydmxldC5Vc2VTdHlsZXNoZWV0UGFyYW1TZXJ2bGV0Ij4KLSAgICAgPG5vdGU+UGF1bCBDYW1wYmVsbCAmbHQ7c2VhcHdjQGhhbGN5b24uY29tJmd0OyB3cm90ZSB0aGlzIHNlcnZsZXQgYW5kIHRoZSBmb2xsb3dpbmcgZXhwbGFuYXRvcnkgdGV4dC4KLSAgICAgVGhhbmsgeW91LCBQYXVsITwvbm90ZT4KLSAgICAgPHA+V2hhdCBpdCBkb2VzOiBUaGUgY2xpZW50IChwZXJoYXBzIGFuIEhUTUwgZm9ybSApIHNwZWNpZmllcyBhbiBYTUwgZG9jdW1lbnQsIGEgc3R5bGVzaGVldCwgYW5kIGEgdmFsdWUgdG8gYmUgcGFzc2VkCi0gICAgICB0byB0aGUgc3R5bGVzaGVldCBmb3IgYSBzdHlsZXNoZWV0IHBhcmFtZXRlciBuYW1lZCAicGFyYW0xIi4gVGhlIHNlcnZsZXQgcGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9uIGFuZCByZXR1cm5zCi0gICAgICB0aGUgb3V0cHV0IHRvIHRoZSBjbGllbnQuIFRoZSBjbGllbnQgbXVzdCBzcGVjaWZ5IHdoaWNoIHN0eWxlc2hlZXQgKGNvbnRhaW5pbmcgYSAicGFyYW0xIiBzdHlsZXNoZWV0IHBhcmFtZXRlciIpIAotICAgICAgYW5kIFhNTCBmaWxlIGFyZSB0byBiZSB1c2VkLjwvcD4KLSAgICAgPHA+SG93IHRvIHJ1biBpdDogQ29uZmlndXJlIHlvdXIgYXBwbGljYXRpb24gc2VydmVyIChUb21jYXQsIFdlYnNwaGVyZSBvciBKU2VydiwgZm9yIGV4YW1wbGUpCi0gICAgIHNvIGl0IGNhbiBmaW5kIHNlcnZsZXQuVXNlU3R5bGVzaGVldFBhcmFtU2VydmxldCAoaW4geGFsYW5zZXJ2bGV0LmphcikgYXMgd2VsbCBhcyB0aGUgWE1MIGRvY3VtZW50IAotICAgICBhbmQgWFNMIHN0eWxlc2hlZXQuIEZvciBleGFtcGxlLCB5b3UgY2FuIGNvcHkgZm9vcGFyYW0ueG1sIGFuZCBmb29wYXJhbS54c2wgZnJvbSBzYW1wbGVzL3NlcnZsZXQgdG8gdGhlIGFwcGxpY2F0aW9uIAotICAgICBzZXJ2ZXIgcm9vdCBkaXJlY3RvcnkgZm9yIGRvY3VtZW50cy48L3A+Ci0gICAgIDxwPlRoZW4geW91IGNhbiBzZXQgdXAgYW4gSFRNTCBjbGllbnQgdG8gY2FsbCB0aGUgc2VydmxldCB3aXRoIGFyZ3VtZW50cyBhbG9uZyB0aGUgbGluZXMgb2Y8L3A+Ci0gICAgPGdsb3NzPjxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXRob21lL3NlcnZsZXQuVXNlU3R5bGVzaGVldFBhcmFtU2VydmxldD8KLSAgICBYTUw9Zm9vcGFyYW0ueG1sJmFtcDtYU0w9Zm9vcGFyYW0ueHNsJmFtcDtQVkFMPUdvb2RCeWU8L2xhYmVsPjwvZ2xvc3M+Ci0gICAgIDxwPkluIHRoZSBkb0dldCgpIG1ldGhvZCwgdGhlIHNlcnZsZXQgb2J0YWlucyB0aGUgUFZBTCB2YWx1ZSAiR29vZEJ5ZSIpIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdCBhbmQgcGFzc2VzIGl0IHRvIHRoZSAKLSAgICAgc3R5bGVzaGVldCBhcyB0aGUgcGFyYW1WYWx1ZSBhcmd1bWVudCBpbiBhIFRyYW5zZm9ybWVyIHNldFBhcmFtZXRlcigpIGNhbGw6PC9wPgotICAgICAgPHA+PGNvZGU+U3RyaW5nIHBhcmFtVmFsdWUgPSBodHRwU2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJQVkFMIik7PC9jb2RlPjxici8+Ci0gICAgICA8Y29kZT4uLi48L2NvZGU+PGJyLz4KLSAgICAgPGNvZGU+dHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCJwYXJhbTEiLCBwYXJhbVZhbHVlKTs8L2NvZGU+PC9wPgotIDxwPlRoZSByZXN1bHQgaXMgcmV0dXJuZWQgdG8gdGhlIGNsaWVudDo8L3A+Ci08cD48Y29kZT4mbHQ7aHRtbCZndDsmbHQ7Ym9keSZndDsmbHQ7cCZndDtHb29kQnllJmx0Oy9wJmd0OyZsdDsvYm9keSZndDsmbHQ7L2h0bWwmZ3Q7PC9jb2RlPjwvcD4KLSAgICAgPC9zMz48YW5jaG9yIG5hbWU9InhzbHRzZXJ2bGV0d2l0aHBhcmFtcyIvPgotICAgICA8czMgdGl0bGU9InNlcnZsZXQuWFNMVFNlcnZsZXRXaXRoUGFyYW1zIj4KLSAgICAgPHA+V2hhdCBpdCBkb2VzOiBzZXJ2bGV0LlhTTFRTZXJ2bGV0V2l0aFBhcmFtcyB0YWtlcyBwYXJhbWV0ZXJzIGluIHRoZSByZXF1ZXN0IC0tIGEgVVJMIHBhcmFtZXRlciBmb3IKLSAgICAgdGhlIFhNTCBpbnB1dCBkb2N1bWVudCBVUkwgYW5kIGFuIHhzbFVSTCBwYXJhbWV0ZXIgZm9yIHRoZSBzdHlsZXNoZWV0IFVSTC48L3A+Ci0gICAgIDxwPlRvIHVzZSBYU0xUU2VydmxldFdpdGhQYXJhbXMgdG8gcGVyZm9ybSB0aGUgc2FtZSB0cmFuc2Zvcm1hdGlvbiBhcyBTaW1wbGVzdFNlcnZsZXQ6IAotICAgICBwbGFjZSB0b2RvLnhzbCBhbmQgdG9kby54bWwgaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3VyIHNlcnZsZXQgZW5naW5lIGxvb2tzIGZvciBIVFRQIGRvY3VtZW50cywgcGxhY2UKLSAgICAgeGFsYW5zZXJ2bGV0LmphciBvbiB0aGUgc2VydmxldCBlbmdpbmUgY2xhc3NwYXRoLCBhbmQgc2V0IHVwIGFuIEhUTUwgcGFnZSB0byBjYWxsIHRoZSBzZXJ2bGV0IGFzIGZvbGxvd3M6PC9wPgotPGdsb3NzPjxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXRob21lL3NlcnZsZXQuWFNMVFNlcnZsZXRXaXRoUGFyYW1zP1VSTD1maWxlOnRvZG8ueG1sJmFtcDsKLXhzbFVSTD1maWxlOnRvZG8ueHNsPC9sYWJlbD48L2dsb3NzPgotICAgICA8cD5JZiB0aGUgWE1MIGRvY3VtZW50IGNvbnRhaW5zIGFuIGFzc29jaWF0ZWQgc3R5bGVzaGVldCAoYSBzdHlsZXNoZWV0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24pIHRoYXQgeW91IHdhbnQgdG8gdXNlLCBzaW1wbHkgb21pdCB0aGUKLSAgICAgeHNsVVJMIHBhcmFtZXRlci48L3A+Ci0gICAgIDxwPklmIHRoZSBzdHlsZXNoZWV0IHRha2VzIHN0eWxlc2hlZXQgcGFyYW1ldGVycywgeW91IGNhbiBpbmNsdWRlIHRoZW0gaW4gdGhlIFVSTC4gRm9yIGV4YW1wbGUgdG8gc2V0IHNldCB0aGUgcGFyYW0xCi0gICAgIHN0eWxlc2hlZXQgcGFyYW1ldGVyIHRvIGZvbywgaW5jbHVkZSBwYXJhbTE9Zm9vIGluIHRoZSBVUkwuPC9wPgotICAgICA8L3MzPjxhbmNob3IgbmFtZT0iYXBwbHl4c2x0Ii8+Ci0gICAgIDxzMyB0aXRsZT0ic2VydmxldC5BcHBseVhTTFQiPgotICAgIDxwPldoYXQgaXQgZG9lczogVGhlIGNsaWVudCAod2hpY2ggeW91IG11c3Qgc2V0IHVwKSBzcGVjaWZpZXMgYW4gWE1MIGRvY3VtZW50IGFuZCBhIHN0eWxlc2hlZXQuIFRoZSBzZXJ2bGV0Ci0gICAgIHBlcmZvcm1zIHRoZSB0cmFuc2Zvcm1hdGlvbiBhbmQgcmV0dXJucyB0aGUgb3V0cHV0IHRvIHRoZSBjbGllbnQuIFlvdSBjYW4gdXNlIG1lZGlhLnByb3BlcnRpZXMgdG8gc3BlY2lmeSAKLSAgICB3aGljaCBzdHlsZXNoZWV0IGlzIHRvIGJlIHVzZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGllbnQgYnJvd3Nlci9kZXZpY2UuPC9wPgotICAgIDxub3RlPlRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoaXMgc2VydmxldCBpbmNsdWRlIEFwcGx5WFNMVC5qYXZhLCBBcHBseVhTTFRQcm9wZXJ0aWVzLmphdmEsIERlZmF1bHRBcHBseVhTTFRQcm9wZXJ0aWVzLmphdmEsCi0gICAgQXBwbHlYU0xUTGlzdGVuZXIuamF2YSwgYW5kIEFwcGx5WFNMVEV4Y2VwdGlvbi5qYXZhLjwvbm90ZT4KLSAgICA8cD5UbyBydW4gdGhlIHNlcnZsZXQ6IHB1dCB4YWxhbnNlcnZsZXQuamFyIG9uIHRoZSBzZXJ2bGV0IGVuZ2luZSBjbGFzc3BhdGgsIGNvbmZpZ3VyZSB5b3VyIHNlcnZsZXQgZW5naW5lIHNvIGl0IGNhbiBmaW5kIHRoZSAKLSAgICAgc3R5bGVzaGVldHMgYW5kIHByb3BlcnRpZXMgZmlsZSBpbiB0aGUgc2VydmxldCBzdWJkaXJlY3RvcnkgKGFuZCBpbiB4YWxhbnNlcnZsZXQuamFyKSwgYW5kIHNldCB1cCBhbiBIVE1MIHBhZ2UgdG8gY2FsbAotICAgICBzZXJ2bGV0LkFwcGx5WFNMVCB3aXRoIGFyZ3VtZW50cyBhcyBpbGx1c3RyYXRlZCBiZWxvdy48L3A+Ci0gICAgIDxwPkV4YW1wbGVzOjwvcD4KLTxnbG9zcz4KLTxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXRob21lL3NlcnZsZXQuQXBwbHlYU0xUP1VSTD0vZGF0YS54bWwmYW1wO3hzbFVSTD0KLS9zdHlsZS54c2w8L2xhYmVsPgotPGl0ZW0+Li4uYXBwbGllcyB0aGUgc3R5bGUueHNsIHN0eWxlc2hlZXQgdG8gdGhlIGRhdGEueG1sIGRhdGEuIEJvdGggZmlsZXMgYXJlPGJyLz4KLXNlcnZlZCBmcm9tIHRoZSBXZWIgc2VydmVyJ3MgSFRUUCBkb2N1bWVudCByb290Ljxici8+PGJyLz48L2l0ZW0+Ci08bGFiZWw+aHR0cDovL2xvY2FsaG9zdC9zZXJ2bGV0aG9tZS9zZXJ2bGV0LkFwcGx5WFNMVD9VUkw9L2RhdGEueG1sJmFtcDt4c2xVUkw9Ci0vc3R5bGUueHNsJmFtcDtkZWJ1Zz10cnVlPC9sYWJlbD4KLTxpdGVtPi4uLmVuc3VyZXMgdGhhdCBYTUwgYW5kIFhTTCBwcm9jZXNzb3IgbWVzc2FnZXMgYXJlIHJldHVybmVkIGluIHRoZSBldmVudCBvZiBwcm9ibGVtcwotYXBwbHlpbmcgc3R5bGUueHNsIHRvIGRhdGEueG1sPGJyLz48YnIvPjwvaXRlbT4KLTxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXRob21lL3NlcnZsZXQuQXBwbHlYU0xUL2RhdGEueG1sP3hzbFVSTD0vc3R5bGUueHNsPC9sYWJlbD4KLTxpdGVtPi4uLmFwcGxpZXMgdGhlIHN0eWxlLnhzbCBzdHlsZXNoZWV0IHRvIHRoZSBkYXRhLnhtbCBkYXRhLCBqdXN0IGxpa2UgdGhlIGZpcnN0IGV4YW1wbGUuCi1UaGlzIGlzIGFuIGFsdGVybmF0aXZlIHdheSBvZiBzcGVjaWZ5aW5nIHRoZSBYTUwgWFNMVElucHV0U291cmNlIGJ5IHV0aWxpemluZyB0aGUgSFRUUCByZXF1ZXN0J3MgcGF0aAotaW5mb3JtYXRpb24uPGJyLz48YnIvPjwvaXRlbT4KLTxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXRob21lL3NlcnZsZXQuQXBwbHlYU0xUL2RhdGEueG1sPC9sYWJlbD4KLTxpdGVtPi4uLmV4YW1pbmVzIGRhdGEueG1sIGZvciBhbiBhc3NvY2lhdGVkIFhTTCBzdHlsZXNoZWV0IChhIHN0eWxlc2hlZXQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbikuIElmIG11bHRpcGxlIFhTTHMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSwgdGhlIHN0eWxlc2hlZXQgd2hvc2UgbWVkaWEgYXR0cmlidXRlIG1hcHMgdG8geW91ciBicm93c2VyIHR5cGUgd2lsbCBiZSBjaG9zZW4uICBJZiBubyBtYXBwaW5nIGlzIHN1Y2Nlc3NmdWwsIHRoZSBwcmltYXJ5IGFzc29jaWF0ZWQgc3R5bGVzaGVldCBpcyB1c2VkLjxici8+PGJyLz48L2l0ZW0+Ci08bGFiZWw+aHR0cDovL2xvY2FsaG9zdC9zZXJ2bGV0L2RhdGEueG1sPC9sYWJlbD4KLTxpdGVtPi4uLnByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZSBwcmV2aW91cyBleGFtcGxlLCBidXQgdGhpcyBleGFtcGxlIGFzc3VtZXMKLXRoYXQgL3NlcnZsZXQvZGF0YS54bWwgaGFzIGJlZW4gbWFwcGVkIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoaXMgc2VydmxldC4gIFRoZSBzZXJ2bGV0IGVuZ2luZSBtYXkgYmUgY29uZmlndXJlZAotdG8gbWFwIGFsbCBvciBzb21lICoueG1sIGZpbGVzIHRvIHRoaXMgc2VydmxldCB0aHJvdWdoIHRoZSB1c2Ugb2Ygc2VydmxldCBhbGlhc2VzIG9yIGZpbHRlcnMuPGJyLz48YnIvPjwvaXRlbT4KLTxsYWJlbD5odHRwOi8vbG9jYWxob3N0L3NlcnZsZXQvZGF0YS54bWw/Y2F0YWxvZz1odHRwOi8vd3d3LnhtbC5vcmcvZHRkcy9vYWcueG1sPC9sYWJlbD4KLTxpdGVtPi4uLnN1cHBsZW1lbnRzIGFueSBzZXJ2bGV0LWNvbmZpZ3VyZWQgWENhdGFsb2cKLXdpdGggYSBjYXRhbG9nIG9mIHN1cHBseSBjaGFpbiBEVERzIHJlc2lkaW5nIGF0IHRoZSBYTUwuT1JHIERURCByZXBvc2l0b3J5LjwvaXRlbT4KLTwvZ2xvc3M+ICAgICAKLSAgIDwvczM+Ci0gICAgIDwvczI+PGFuY2hvciBuYW1lPSJleHRlbnNpb25zIi8+Ci0gICAgPHMyIHRpdGxlPSJFeHRlbnNpb25zIj4KLSAgICA8cD5Gb3IgYW4gaW50cm9kdWN0aW9uIHRvIHRoZSBjcmVhdGlvbiBhbmQgdXNlIG9mIGV4dGVuc2lvbiBlbGVtZW50cyBhbmQgZXh0ZW5zaW9uIGZ1bmN0aW9ucywgYW5kCi0gICAgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleHRlbnNpb25zIGxpYnJhcnkgZGlzdHJpYnV0ZWQgd2l0aCAmeHNsdDRqOywgc2VlCi0gICAgPGxpbmsgaWRyZWY9ImV4dGVuc2lvbnMiPkV4dGVuc2lvbnM8L2xpbms+LjwvcD4KLSAgICA8dWw+Ci0gICAgICA8bGk+PGxpbmsgYW5jaG9yPSJleHQxIj4xLXJlZGlyPC9saW5rPjwvbGk+Ci0gICAgICA8bGk+PGxpbmsgYW5jaG9yPSJleHQyIj4yLWJhc2ljSnNjcmlwdDwvbGluaz48L2xpPgotICAgICAgPGxpPjxsaW5rIGFuY2hvcj0iZXh0MyI+My1qYXZhLW5hbWVzcGFjZTwvbGluaz48L2xpPgotICAgICAgPGxpPjxsaW5rIGFuY2hvcj0iZXh0NCI+NC1udW1saXN0SmF2YTwvbGluaz48L2xpPgotICAgICAgPGxpPjxsaW5rIGFuY2hvcj0iZXh0NSI+NS1udW1saXN0SlNjcmlwdDwvbGluaz48L2xpPgotICAgICAgPGxpPjxsaW5rIGFuY2hvcj0iZXh0NiI+Ni1zcWxsaWItaW5zdGFudGRiPC9saW5rPjwvbGk+Ci0gICAgPC91bD4KLSAgICA8cD5UaGUgZXh0ZW5zaW9ucyBzdWJkaXJlY3RvcnkgY29udGFpbnMgc2l4IHNhbXBsZXMgd2l0aCAmeHNsdDRqOyBleHRlbnNpb25zLiBUd28gb2YgdGhlIHNhbXBsZXMgdXNlCi0gICAgIGV4dGVuc2lvbnMgaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCwgYW5kIGZvdXIgb2YgdGhlIHNhbXBsZXMgdXNlIGV4dGVuc2lvbnMgaW1wbGVtZW50ZWQgaW4gSmF2YS48L3A+Ci0gICAgIDxwPlRvIHJ1biB0aGVzZSBleGFtcGxlcywgeW91IG11c3QgcGxhY2UgYnNmLmphciAoZGlzdHJpYnV0ZWQgd2l0aCAmeHNsdDRqOyksIGFuZCBqcy5qYXIKLSAgICAgICh2ZXJzaW9uIDEuNSwgYXZhaWxhYmxlIGZyb20gCi0gICAgICA8anVtcCBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL3JoaW5vIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL3JoaW5vPC9qdW1wPikgb24gdGhlIGNsYXNzcGF0aC4gCi0gICAgIFlvdSBkbyBub3QgbmVlZCBqcy5qYXIgb24gdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHNhbXBsZXMgdGhhdCB1c2UgSmF2YSBleHRlbnNpb25zLiA8L3A+Ci0gICAgIDxwPlVzZSBqYXZhLm9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzLCB0aGUgJnhzbHQ0ajsgY29tbWFuZC1saW5lIHV0aWxpdHksIHRvIHJ1biBtb3N0IG9mIHRoZXNlIHNhbXBsZXMgZnJvbQotICAgICAgdGhlIDxsaW5rIGlkcmVmPSJjb21tYW5kbGluZSI+Y29tbWFuZCBsaW5lPC9saW5rPi4gVGhlIGNvbW1hbmQgbGluZSBtdXN0IGluY2x1ZGUgYW4gLWluIGZsYWcgd2l0aCB0aGUgCi0gICAgICBYTUwgc291cmNlIGFuZCBhbiAteHNsIGZsYWcgd2l0aCB0aGUgWFNMIHN0eWxlc2hlZXQuIElmIHlvdSB3YW50IHRoZSBvdXRwdXQgdG8gYmUgd3JpdHRlbiB0byBhIGZpbGUsIHJhdGhlcgotICAgICAgdGhhbiB0byB0aGUgc2NyZWVuLCBhZGQgYW4gLW91dCBmbGFnIHdpdGggdGhlIG91dHB1dCBmaWxlIG5hbWUuPC9wPgotICAgICAgPHA+UnVuIHRoZXNlIHNhbXBsZXMgZnJvbSB0aGUgZXh0ZW5zaW9ucyBkaXJlY3RvcnkgYXMgZm9sbG93cyAoZWFjaCBvZiB0aGUgZm9sbG93aW5nIGlzIGEgc2luZ2xlIGNvbW1hbmQKLSAgICAgICBsaW5lKTo8L3A+IAotCi0gICAgICA8YW5jaG9yIG5hbWU9ImV4dDEiLz4KLSAgICAgIDxzMyB0aXRsZT0iMS1yZWRpciI+Ci0gICAgICA8cD5XaGF0IGl0IGRvZXM6IFVzZXMgdGhlIFJlZGlyZWN0IGV4dGVuc2lvbiBlbGVtZW50cyBzaGlwcGVkIHdpdGggJnhzbHQ0ajsgdG8gZGlyZWN0IG91dHB1dCB0byB0d28gb3V0cHV0Ci0gICAgICAgIGZpbGVzLjwvcD4KLSAgICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBleHRlbnNpb25zIHN1YmRpcmVjdG9yeSB3aXRoPC9wPiAKLSAgICAgICA8cD48Y29kZT5qYXZhIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIC1pbiAxLXJlZGlyLnhtbDwvY29kZT48YnIvPgotICAgICAgICZuYnNwOyZuYnNwOzxjb2RlPi14c2wgMS1yZWRpci54c2w8L2NvZGU+PC9wPgotICAgICAgPHA+VGhlIHN0YW5kYXJkIChub24tcmVkaXJlY3RlZCkgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gdGhlIHNjcmVlbi4gVGhlIHJlZGlyZWN0ZWQgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gMS1yZWRpci1vdXQsIG9yCi0gICAgICB3aGF0ZXZlciBmaWxlbmFtZSB5b3UgYXNzaWduIHRvIHRoZSBkb2MvZm9vIEBmaWxlIGF0dHJpYnV0ZSBpbiAxLXJlZGlyLnhtbC4gVGhlIHN0eWxlc2hlZXQgZ2V0cyB0aGUgZmlsZSBuYW1lIGZvcgotICAgICAgcmVkaXJlY3RlZCBvdXRwdXQgZnJvbSB0aGUgWE1MIGlucHV0IGZpbGUuPC9wPgotICAgICAgPC9zMz48YW5jaG9yIG5hbWU9ImV4dDIiLz4KLSAgICAgIDxzMyB0aXRsZT0iMi1iYXNpY0pzY3JpcHQiPgotICAgICAgPHA+V2hhdCBpdCBkb2VzOiBVc2VzIGFuIGV4dGVuc2lvbiBlbGVtZW50IGFuZCBleHRlbnNpb24gZnVuY3Rpb24gaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCB0byBjb21wdXRlIGEKLSAgICAgIGRlYWRsaW5lIGZvciByZXNwb25kaW5nIHRvIGEgY3VzdG9tZXIgaW5xdWlyeS48L3A+Ci0gICAgICA8bm90ZT5qcy5qYXIgbXVzdCBiZSBvbiB0aGUgY2xhc3NwYXRoLjwvbm90ZT4KLSAgICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBleHRlbnNpb25zIHN1YmRpcmVjdG9yeSB3aXRoPC9wPgotICAgICAgPHA+PGNvZGU+amF2YSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuUHJvY2VzcyAtaW4gMi1iYXNpY0pzY3JpcHQueG1sPC9jb2RlPgotICAgICAgICAgPGJyLz4mbmJzcDsmbmJzcDs8Y29kZT4teHNsIDItamJhc2ljSnNjcmlwdC54c2w8L2NvZGU+PC9wPiAgICAgCi0gICAgICA8L3MzPjxhbmNob3IgbmFtZT0iZXh0MyIvPgotICAgICAgPHMzIHRpdGxlPSIzLWphdmEtbmFtZXNwYWNlIj4KLSAgICAgIDxwPldoYXQgaXQgZG9lczogVXNlcyBleHRlbnNpb24gZnVuY3Rpb25zIHRvIGZvcm1hdCBkYXRlcy4gVGhpcyBzYW1wbGUgaWxsdXN0cmF0ZXMgdXNlIG9mIHRoZSBwcmVkZWZpbmVkIGphdmEKLSAgICAgICAgZXh0ZW5zaW9uIG5hbWVzcGFjZSB0byBwcm92aWRlIHJlYWR5IGFjY2VzcyB0byBleHRlbnNpb25zIGltcGxlbWVudGVkIGluIEphdmEuPC9wPgotICAgICAgPHA+UnVuIHRoaXMgc2FtcGxlIGZyb20gdGhlIGV4dGVuc2lvbnMgc3ViZGlyZWN0b3J5IHdpdGg8L3A+IAotICAgICAgPHA+PGNvZGU+amF2YSBvcmcuYXBhY2hlLnhhbGFuLnhzbHQuUHJvY2VzcyAtaW4gMy1qYXZhLW5hbWVzcGFjZS54bWw8L2NvZGU+Ci0gICAgICAgICA8YnIvPiZuYnNwOyZuYnNwOzxjb2RlPi14c2wgMy1qYXZhLW5hbWVzcGFjZS54c2w8L2NvZGU+PC9wPiAgICAKLSAgICAgIDwvczM+PGFuY2hvciBuYW1lPSJleHQ0Ii8+Ci0gICAgICA8czMgdGl0bGU9IjQtbnVtbGlzdEphdmEiPgotICAgICAgPHA+V2hhdCBpdCBkb2VzOiBVc2VzIGEgSmF2YSBleHRlbnNpb24gdG8gdHJhbnNmb3JtIGEgc2V0IG9mIG5hbWUgZWxlbWVudHMgaW50byBhIG51bWJlcmVkIGFuZCBhbHBoYWJldGl6ZWQKLSAgICAgICBsaXN0LjwvcD4KLSAgICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBleHRlbnNpb25zIHN1YmRpcmVjdG9yeSB3aXRoPC9wPiAKLSAgICAgIDxwPjxjb2RlPmphdmEgb3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MgLWluIG51bWxpc3QueG1sPC9jb2RlPiAKLSAgICAgICAgPGJyLz4mbmJzcDsmbmJzcDs8Y29kZT4teHNsIDQtbnVtbGlzdEphdmEueHNsPC9jb2RlPjwvcD4gICAgCi0gICAgICA8L3MzPjxhbmNob3IgbmFtZT0iZXh0NSIvPgotICAgICAgPHMzIHRpdGxlPSI1LW51bWxpc3RKc2NyaXB0Ij4KLSAgICAgIDxwPldoYXQgaXQgZG9lczogVXNlcyBhIEphdmFTY3JpcHQgIGV4dGVuc2lvbiB0byB0cmFuc2Zvcm0gYSBzZXQgb2YgbmFtZSBlbGVtZW50cyBpbnRvIGEgbnVtYmVyZWQgYW5kCi0gICAgICBhbHBoYWJldGl6ZWQgbGlzdC4gVGhpcyBzYW1wbGUgcGVyZm9ybXMgdGhlIHNhbWUgb3BlcmF0aW9ucyBhcyB0aGUgcHJlY2VkaW5nIEphdmEgZXh0ZW5zaW9uLjwvcD4KLSAgICAgIDxub3RlPmpzLmphciBtdXN0IGJlIG9uIHRoZSBjbGFzc3BhdGguPC9ub3RlPgotICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBleHRlbnNpb25zIHN1YmRpcmVjdG9yeSB3aXRoPC9wPgotICAgICAgPHA+PGNvZGU+IGphdmEgb3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3MgLWluIG51bWxpc3QueG1sPC9jb2RlPgotICAgICAgICA8YnIvPiZuYnNwOyZuYnNwOzxjb2RlPi14c2wgNS1udW1saXN0SnNjcmlwdC54c2w8L2NvZGU+PC9wPgotICAgICAgPC9zMz48YW5jaG9yIG5hbWU9ImV4dDYiLz4KLSAgICAgIDxzMyB0aXRsZT0iNi1zcWxsaWItaW5zdGFudGRiIj4KLSAgICAgIDxwPldoYXQgaXQgZG9lczogVXNlcyA8bGluayBpZHJlZj0iZXh0ZW5zaW9uc2xpYiIgYW5jaG9yPSJzcWwiPlNRTCBsaWJyYXJ5IFhDb25uZWN0aW9uCi0gICAgICBleHRlbnNpb248L2xpbms+IHRvIGNvbm5lY3QgdG8gYW4gSW5zdGFudERCIHNhbXBsZSBkYXRhYmFzZSwgcGVyZm9ybSBhIHF1ZXJ5LCBhbmQgZGlzcGxheSB0aGUKLSAgICAgIHF1ZXJ5IHJlc3VsdCBpbiBhbiBIVE1MIHRhYmxlLjwvcD4KLSAgICAgIDxub3RlPllvdSBtdXN0IGluY2x1ZGUgaWRiLmphciBvbiB0aGUgY2xhc3NwYXRoLiBXZSBoYXZlIHBsYWNlZCBhIGNvcHkgb2YgaWRiLmphciBmcm9tCi0gICAgICBJbnN0YW50REIgdmVyc2lvbiAzLjI1IGluIHNhbXBsZXMvZXh0ZW5zaW9ucy9pbnN0YW50ZGIuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBJbnN0YW50REIsIHNlZQotICAgICAgPGp1bXAgaHJlZj0iaHR0cDovL2luc3RhbnRkYi5lbmh5ZHJhLm9yZy9zb2Z0d2FyZS9kb2N1bWVudGF0aW9uL2luZGV4Lmh0bWwiPkluc3RhbnREQjwvanVtcD4KLSAgICAgIGFuZCB0aGUgPGp1bXAgaHJlZj0iaHR0cDovL2luc3RhbnRkYi5lbmh5ZHJhLm9yZy9zb2Z0d2FyZS9saWNlbnNlL2luZGV4Lmh0bWwiPkVueWRyYSBQdWJsaWMKLSAgICAgIExpY2Vuc2U8L2p1bXA+Ljwvbm90ZT4KLSAgICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBleHRlbnNpb25zIHN1YmRpcmVjdG9yeSB3aXRoIChhZGp1c3QgdGhlIFdpbmRvd3MgY2xhc3NwYXRoIHNldHRpbmcgCi0gICAgICBiZWxvdyBmb3IgeW91ciBvcGVyYXRpbmcgZW52aXJvbm1lbnQpOjwvcD4KLSAgICAgIDxwPjxjb2RlPmphdmEgLWNwIGluc3RhbnRkYi9pZGIuamFyOyVjbGFzc3BhdGglPC9jb2RlPiAKLSAgICAgIDxici8+Jm5ic3A7Jm5ic3A7b3JnLmFwYWNoZS54YWxhbi54c2x0LlByb2Nlc3M8Y29kZT48L2NvZGU+Ci0gICAgICA8YnIvPiZuYnNwOyZuYnNwOzxjb2RlPi14c2wgNi1zcWxsaWItaW5zdGFudGRiLnhzbCAtb3V0IGltcG9ydDEuaHRtbDwvY29kZT48L3A+Ci0gICAgICA8L3MzPgotICAgIDwvczI+PGFuY2hvciBuYW1lPSJ0cmFjZSIvPgotICAgIDxzMiB0aXRsZT0iVHJhY2UiPgotICAgICAgPHA+V2hhdCBpdCBkb2VzOiBUcmFjZSB1c2VzIHRoZSBUcmFjZUxpc3RlbmVyIGFuZCBUcmFjZU1hbmFnZXIgY2xhc3NlcyB0byBsb2cgdHJhbnNmb3JtYXRpb24gZXZlbnRzLjwvcD4KLSAgICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSBUcmFjZSBzdWJkaXJlY3Rvcnkgd2l0aDwvcD4KLSAgICAgIDxwPjxjb2RlPmphdmEgVHJhY2U8L2NvZGU+PC9wPgotICAgICAgPHA+YW5kIGV4YW1pbmUgdGhlIHJlc3VsdCBpbiBldmVudHMubG9nLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIiBhbmNob3I9ImRlYnVnZ2luZyI+RGVidWdnZXIKLSAgICAgIEludGVyZmFjZTwvbGluaz48L3A+Ci0gICAgIDwvczI+PGFuY2hvciBuYW1lPSJ0cmF4Ii8+Ci0gICAgIDxzMiB0aXRsZT0idHJheCI+Ci0gICAgIDxub3RlPiZ0cmF4c2FtcGxlbm90ZTs8L25vdGU+Ci0gICAgIDxwPldoYXQgaXQgZG9lczogcnVuIGEgbnVtYmVyIG9mIHNhbXBsZXMgaWxsdXN0cmF0aW5nIHVzZXMgb2YgdGhlIDxyZXNvdXJjZS1yZWYgaWRyZWY9InRyYXgiLz4gaW50ZXJmYWNlcy48L3A+Ci0gICAgIDxwPlJ1biB0aGlzIHNhbXBsZSBmcm9tIHRoZSB0cmF4IHN1YmRpcmVjdG9yeSB3aXRoPC9wPgotICAgICA8cD48Y29kZT5qYXZhIEV4YW1wbGVzPC9jb2RlPjwvcD4KLSAgICAgPHA+YW5kIGV4YW1pbmUgdGhlIHNvdXJjZSBpbiBFeGFtcGxlcy5qYXZhIGFuZCBFeGFtcGxlQ29udGVudEhhbmRsZXIuamF2YS48L3A+Ci0gICAgIDwvczI+Ci08L3MxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vdXNhZ2VwYXR0ZXJucy54bWwgYi94ZG9jcy9zb3VyY2VzL3hhbGFuL3VzYWdlcGF0dGVybnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmM5MzEyLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW4vdXNhZ2VwYXR0ZXJucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PiAKLTwhRE9DVFlQRSBzMSBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9kb2N1bWVudC5kdGQiPgotPCEtLQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLTxzMSB0aXRsZT0iQmFzaWMgdXNhZ2UgcGF0dGVybnMiPgotPHVsPgotPGxpPjxsaW5rIGFuY2hvcj0iYmFzaWMiPkJhc2ljIHN0ZXBzPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJwbHVnIj5QbHVnZ2luZyBpbiB0aGUgVHJhbnNmb3JtZXIgYW5kIFhNTCBwYXJzZXI8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9Im91dHB1dHByb3BzIj5TZXR0aW5nIG91dHB1dCBwcm9wZXJ0aWVzIGluIHlvdXIgc3R5bGVzaGVldHM8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImVtYmVkIj5Xb3JraW5nIHdpdGggZW1iZWRkZWQgc3R5bGVzaGVldHM8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InBhcmFtcyI+U2V0dGluZyBzdHlsZXNoZWV0IHBhcmFtZXRlcnM8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InNlcmlhbGl6ZSI+U2VyaWFsaXppbmcgb3V0cHV0PC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJzYXgiPkV4cGxpY2l0bHkgd29ya2luZyB3aXRoIFNBWDwvbGluaz48L2xpPgotPGxpPjxsaW5rIGFuY2hvcj0ib3V0YXNpbiI+VXNpbmcgdHJhbnNmb3JtYXRpb24gb3V0cHV0IGFzIGlucHV0IGZvciBhbm90aGVyIHRyYW5zZm9ybWF0aW9uPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJkb20iPlByb2Nlc3NpbmcgYW5kIHByb2R1Y2luZyBET00gdHJlZXM8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9InhwYXRoIj5Xb3JraW5nIHdpdGggWFBhdGggZXhwcmVzc2lvbnM8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImFwcGxldCI+VXNpbmcgdGhlICZ4c2x0NGo7IGFwcGxldCB3cmFwcGVyPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJzZXJ2bGV0Ij5Vc2luZyAmeHNsdDRqOyBpbiBhIHNlcnZsZXQ8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImV4dGVuc2lvbnMiPkNyZWF0aW5nIGFuZCB1c2luZyBleHRlbnNpb25zPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJtdWx0aXRocmVhZGluZyI+TXVsdGl0aHJlYWRpbmc8L2xpbms+PC9saT4KLTxsaT48bGluayBhbmNob3I9ImRlYnVnZ2luZyI+RGVidWdnZXIgaW50ZXJmYWNlPC9saW5rPjwvbGk+Ci08bGk+PGxpbmsgYW5jaG9yPSJjb21wYXQiPlVzaW5nIHRoZSAmeHNsdDRqOyB2ZXJzaW9uIDEgQVBJPC9saW5rPjwvbGk+Ci08L3VsPgotPGFuY2hvciBuYW1lPSJiYXNpYyIvPgotICA8czIgdGl0bGU9IkJhc2ljIHN0ZXBzIj4KLSAgICA8b2w+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0idHJhbnNmb3JtZXJmYWN0b3J5Ij5JbnN0YW50aWF0ZSBhIFRyYW5zZm9ybWVyRmFjdG9yeTwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9InRyYW5zZm9ybWVyIj5Qcm9jZXNzIHRoZSBzdHlsZXNoZWV0IGFuZCBnZW5lcmF0ZSBhIFRyYW5zZm9ybWVyPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0idHJhbnNmb3JtYXRpb24iPlBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uPC9saW5rPjwvbGk+Ci0gIDwvb2w+Ci0gICAgPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIHRoZSB0aHJlZSBiYXNpYyBzdGVwcyBpbnZvbHZlZCBpbiBwZXJmb3JtaW5nIGEgdHJhbnNmb3JtYXRpb24uPC9wPgotICAgIDxzb3VyY2U+Ly8gMS4gSW5zdGFudGlhdGUgYSBUcmFuc2Zvcm1lckZhY3RvcnkuCi1qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IAotICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybWVyVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLS8vIDIuIFVzZSB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IHRvIHByb2Nlc3MgdGhlIHN0eWxlc2hlZXQgU291cmNlIGFuZAotLy8gICAgZ2VuZXJhdGUgYSBUcmFuc2Zvcm1lci4KLWphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0RmFjdG9yeS5uZXdUcmFuc2Zvcm1lcgotICAgICAgICAgICAgICAgIChuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlKCJmb28ueHNsIik7Ci0KLS8vIDMuIFVzZSB0aGUgVHJhbnNmb3JtZXIgdG8gdHJhbnNmb3JtIGFuIFhNTCBTb3VyY2UgYW5kIHNlbmQgdGhlCi0vLyAgICBvdXRwdXQgdG8gYSBSZXN1bHQgb2JqZWN0LgotdHJhbnNmb3JtZXIudHJhbnNmb3JtCi0gICAgKG5ldyBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2UoImZvby54bWwiKSwgCi0gICAgIG5ldyBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQoIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSgiZm9vLm91dCIpKSk7PC9zb3VyY2U+Ci0gIDxub3RlPkZvciBhIHdvcmtpbmcgZXhhbXBsZSBvZiB0aGlzIG1vZGVsIGF0IGl0cyBzaW1wbGVzdCwgc2VlIFNpbXBsZVRyYW5zZm9ybS5qYXZhIGluIHRoZSBqYXZhL3NhbXBsZXMvU2ltcGxlVHJhbnNmb3JtIHN1YmRpcmVjdG9yeS48L25vdGU+Ci0gIDwvczI+PGFuY2hvciBuYW1lPSJ0cmFuc2Zvcm1lcmZhY3RvcnkiLz4KLSAgPHMyIHRpdGxlPSIxLiBJbnN0YW50aWF0ZSBhIFRyYW5zZm9ybWVyRmFjdG9yeSI+Ci0gIDxwPjxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lckZhY3RvcnkjaHRtbCI+VHJhbnNmb3JtZXJGYWN0b3J5PC9qdW1wPiBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aXRoIGEgc3RhdGljIG5ld0luc3RhbmNlKCkgbWV0aG9kIHRoYXQgaW5zdGFudGlhdGVzIHRoZSBjb25jcmV0ZSBzdWJjbGFzcyBkZXNpZ25hdGVkIGJ5IHRoZSBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSBzeXN0ZW0gcHJvcGVydHkuPC9wPgotICA8cD5UaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGlzIHN5c3RlbSBwcm9wZXJ0eSBpcyA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vcHJvY2Vzc29yL1RyYW5zZm9ybWVyRmFjdG9yeUltcGwuaHRtbCI+b3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbDwvanVtcD4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9InRyYW5zZm9ybWVyIi8+Ci0gIDxzMiB0aXRsZT0iMi4gVXNlIHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgdG8gcHJvY2VzcyB0aGUgc3R5bGVzaGVldCBTb3VyY2UgYW5kIHByb2R1Y2UgYSBUcmFuc2Zvcm1lciI+Ci08cD5UaGUgVHJhbnNmb3JtZXJGYWN0b3J5IDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lckZhY3RvcnkuaHRtbCNuZXdUcmFuc2Zvcm1lcihqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSkiPm5ld1RyYW5zZm9ybWVyKFNvdXJjZSB4c2xTb3VyY2UpPC9qdW1wPiBtZXRob2QgcHJvY2Vzc2VzIHRoZSBzdHlsZXNoZWV0IFNvdXJjZSBpbnRvIGEgVGVtcGxhdGVzIG9iamVjdCBhbmQgcmV0dXJucyBhIFRyYW5zZm9ybWVyIHRoYXQgeW91IGNhbiB1c2UgdG8gcGVyZm9ybSBhIHRyYW5zZm9ybWF0aW9uIChhcHBseSB0aGUgVGVtcGxhdGVzIG9iamVjdCB0byBhbiBYTUwgU291cmNlKS48L3A+Ci08cD5Zb3UgbWF5IHByb3ZpZGUgdGhlIHN0eWxlc2hlZXQgU291cmNlIGluIHRoZSBmb3JtIG9mIGEgc3RyZWFtIG9mIFhNTCBtYXJrdXAgKDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9zdHJlYW0vU3RyZWFtU291cmNlLmh0bWwiPlN0cmVhbVNvdXJjZTwvanVtcD4pLCBhIERPTSBOb2RlICg8anVtcCBocmVmPSJhcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vZG9tL0RPTVNvdXJjZS5odG1sIj5ET01Tb3VyY2U8L2p1bXA+KSwgb3IgYSBTQVggSW5wdXRTb3VyY2UgKDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9zYXgvU0FYU291cmNlLmh0bWwiPlNBWFNvdXJjZTwvanVtcD4pLiBUbyBzcGVjaWZ5IGEgU3RyZWFtU291cmNlLCB5b3UgbWF5IHVzZSBhIHN5c3RlbSBJRCBvciBmaWxlIG5hbWUgKHVzaW5nIFVSSSBzeW50YXgpLCBhIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yIGEgamF2YS5pby5SZWFkZXIuIFRoZSB1c2Ugb2YgRE9NU291cmNlIGFuZCBTQVhTb3VyY2UgYXJlIGlsbHVzdHJhdGVkIGluIHN1YnNlcXVlbnQgc2VjdGlvbnMuPC9wPgotPG5vdGU+SWYgeW91IHBsYW4gdG8gdXNlIHRoZSBzdHlsZXNoZWV0IFNvdXJjZSB0byB0cmFuc2Zvcm0gbXVsdGlwbGUgWE1MIFNvdXJjZXMsIHlvdSBzaG91bGQgdXNlIHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgPGp1bXAgaHJlZj0iYXBpZG9jcy9qYXZheC94bWwvaW1wb3J0L1RyYW5zZm9ybWVyRmFjdG9yeS5odG1sI25ld1RlbXBsYXRlcyhqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSkiPm5ld1RlbXBsYXRlcyhTb3VyY2UgeHNsU291cmNlKTwvanVtcD4gbWV0aG9kIHRvIGV4cGxpY2l0bHkgZ2VuZXJhdGUgYSBUZW1wbGF0ZXMgb2JqZWN0LiBGb3IgZWFjaCB0cmFuc2Zvcm1hdGlvbiwgdXNlIHRoZSBUZW1wbGF0ZXMgb2JqZWN0IHRvIGdlbmVyYXRlIGEgbmV3IFRyYW5zZm9ybWVyLiBGb3IgdGhlIGRldGFpbHMsIHNlZSA8bGluayBhbmNob3I9Im11bHRpdGhyZWFkaW5nIj5NdWx0aXRocmVhZGluZzwvbGluaz4uPC9ub3RlPgotPC9zMj48YW5jaG9yIG5hbWU9InRyYW5zZm9ybWF0aW9uIi8+Ci08czIgdGl0bGU9IjMuIFVzZSB0aGUgVHJhbnNmb3JtZXIgdG8gcGVyZm9ybSBhIHRyYW5zZm9ybWF0aW9uIj4KLTxwPlVzZSB0aGUgVHJhbnNmb3JtZXIgPGp1bXAgaHJlZj0iYXBpZG9jcy9qYXZheC94bWwvaW1wb3J0L1RyYW5zZm9ybWVyLmh0bWwjdHJhbnNmb3JtKGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlLCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdCI+dHJhbnNmb3JtKFNvdXJjZSB4bWxTb3VyY2UsIFJlc3VsdCB0cmFuc2Zvcm1SZXN1bHQpPC9qdW1wPiBtZXRob2QgdG8gdHJhbnNmb3JtICB0aGUgWE1MIFNvdXJjZSBhbmQgcGxhY2UgdGhlIHRyYW5zZm9ybWF0aW9uIG91dHB1dCBpbiBhIFJlc3VsdCBvYmplY3QuPC9wPgotPHA+SnVzdCBhcyB3aXRoIHRoZSBzdHlsZXNoZWV0LCB5b3UgY2FuIHN1cHBseSB0aGUgWE1MIFNvdXJjZSBpbiB0aGUgZm9ybSBvZiBhIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9zdHJlYW0vU3RyZWFtU291cmNlLmh0bWwiPlN0cmVhbVNvdXJjZTwvanVtcD4sIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9kb20vRE9NU291cmNlLmh0bWwiPkRPTVNvdXJjZTwvanVtcD4sIG9yIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9zYXgvU0FYU291cmNlLmh0bWwiPlNBWFNvdXJjZTwvanVtcD4uIExpa2V3aXNlLCB0aGUgUmVzdWx0IG1heSBiZSBhIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9zdHJlYW0vU3RyZWFtUmVzdWx0Lmh0bWwiPlN0cmVhbVJlc3VsdDwvanVtcD4sIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9kb20vRE9NUmVzdWx0Lmh0bWwiPkRPTVJlc3VsdDwvanVtcD4sIG9yIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9zYXgvU0FYUmVzdWx0Lmh0bWwiPlNBWFJlc3VsdDwvanVtcD4uPC9wPgotPHA+Rm9yIGVhY2ggbm9kZSBpbiB0aGUgWE1MIHNvdXJjZSwgdGhlIFRyYW5zZm9ybWVyIHVzZXMgdGhlIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucyBpbiB0aGUgVGVtcGxhdGVzIG9iamVjdCB0byBkZXRlcm1pbmUgd2hpY2ggdGVtcGxhdGUgdG8gYXBwbHk6IG9uZSBvZiB0aGUgdGVtcGxhdGVzIGluIHRoZSBUZW1wbGF0ZXMgb2JqZWN0LCBhIGRlZmF1bHQgdGVtcGxhdGUgcnVsZSBhcyBzcGVjaWZpZWQgaW4gdGhlIFhTTFQgc3BlYywgb3Igbm9uZS48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0icGx1ZyIvPgotPHMyIHRpdGxlPSJQbHVnZ2luZyBpbiBhIFRyYW5zZm9ybWVyIGFuZCBYTUwgcGFyc2VyIj4KLTxwPlRoZSBKYXZhIEFQSSBmb3IgWE1MIFByb2Nlc3NpbmcgaW50ZXJmYWNlcyBlbmFibGUgeW91IHRvIGlzb2xhdGUgeW91ciBhcHBsaWNhdGlvbiBmcm9tIHRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIGEgZ2l2ZW4gVHJhbnNmb3JtZXIsIFNBWCBwYXJzZXIsIG9yIERPTSBwYXJzZXIuIEZvciBlYWNoIG9mIHRoZXNlIG9iamVjdHMsIHRoZXJlIGlzIGFuIGFic3RyYWN0IEZhY3RvcnkgY2xhc3Mgd2l0aCBhIHN0YXRpYyBuZXdJbnN0YW5jZSgpIG1ldGhvZCB0aGF0IGluc3RhbnRpYXRlcyBhIGNvbmNyZXRlIEZhY3Rvcnkgd2hpY2ggd3JhcHMgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uIFRoZXNlIG5ld0luc3RhbmNlKCkgbWV0aG9kcyB1c2Ugc3lzdGVtIHByb3BlcnR5IHNldHRpbmdzIHRvIGRldGVybWluZSB3aGljaCBpbXBsZW1lbnRhdGlvbiB0byBpbnN0YW50aWF0ZS48L3A+Ci08cD4meHNsdDRqOyBpcyBkaXN0cmlidXRlZCB3aXRoIHN5c3RlbSBwcm9wZXJ0eSBzZXR0aW5ncyBmb3IgdGhlIFhhbGFuIFhTTFQgVHJhbnNmb3JtZXIgYW5kIHRoZSBYZXJjZXMgRE9NIGFuZCBTQVggcGFyc2Vycy4gVGhlc2Ugc2V0dGluZ3MgYXJlIGluIHhhbGFuLmphciBpbiBNRVRBLUlORi9zZXJ2aWNlcyAoc2VlIHNyYy9NRVRBLUlORi9zZXJ2aWNlcykuPC9wPgotPGdsb3NzPgotICA8bGFiZWw+U3lzdGVtIHByb3BlcnR5PC9sYWJlbD4KLSAgICA8aXRlbT5TZXR0aW5nPC9pdGVtPgotICA8bGFiZWw+PGNvZGU+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk8L2NvZGU+PC9sYWJlbD4KLSAgIDxpdGVtPjxjb2RlPm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGw8L2NvZGU+PC9pdGVtPiAgICAKLSAgPGxhYmVsPjxjb2RlPmphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk8L2NvZGU+PC9sYWJlbD4KLSAgIDxpdGVtPjxjb2RlPm9yZy5hcGFjaGUueGVyY2VzLmpheHAuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUltcGw8L2NvZGU+PC9pdGVtPiAgICAKLSAgPGxhYmVsPjxjb2RlPmphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk8L2NvZGU+PC9sYWJlbD4KLSAgIDxpdGVtPjxjb2RlPm9yZy5hcGFjaGUueGVyY2VzLmpheHAuU0FYUGFyc2VyRmFjdG9yeUltcGw8L2NvZGU+PC9pdGVtPgotIDwvZ2xvc3M+Ci08cD5Zb3UgY2FuIGNoYW5nZSBhbnkgb2YgdGhlc2Ugc2V0dGluZ3MgYXMgZm9sbG93cyAoaW4gb3JkZXIgb2YgcHJlY2VkZW5jZSk6PC9wPgotPG9sPgotICA8bGk+U2V0IHRoZSBzeXN0ZW0gcHJvcGVydHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHdoZW4geW91IGxhdW5jaCBKYXZhIG9yIGZyb20gd2l0aGluIHlvdXIgYXBwbGljYXRpb24uPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5TZXQgdGhlIHN5c3RlbSBwcm9wZXJ0eSBpbiBqYXhwLnByb3BlcnRpZXMgaW4gdGhlIEpBVkFfSE9NRS9saWIgZGlyZWN0b3J5LCB3aGVyZSBKQVZBX0hPTUUgaXMgdGhlIHJvb3Qgb2YgdGhlIEpESy48YnIvPjxici8+PC9saT4KLSAgPGxpPlJldmlzZSB0aGUgZW50cnkgaW4gc3JjL01FVEEtSU5GL3NlcnZpY2VzIGFuZCByZWJ1aWxkIHhhbGFuLmphci48YnIvPjxici8+PC9saT4KLTwvb2w+Ci08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gZGV0ZXJtaW5lIHN5c3RlbSBwcm9wZXJ0eSB2YWx1ZXMgYW5kIGhvdyB5b3UgY2FuIHBsdWcgb3RoZXIgaW1wbGVtZW50YXRpb25zIGludG8geW91ciBhcHBsaWNhdGlvbnMsIHNlZSAiU2VjdGlvbiAzOiBQbHVnYWJpbGl0eSBMYXllciIgaW4gdGhlIDxyZWY+SmF2YSBBUEkgZm9yIFhNTCBQcm9jZXNzaW5nPC9yZWY+IGF0IAotPGp1bXAgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9hYm91dEphdmEvY29tbXVuaXR5cHJvY2Vzcy9yZXZpZXcvanNyMDYzL2luZGV4Lmh0bWwiPkpTUi0wMDAwNjMgMS4xPC9qdW1wPi48L3A+IAotPC9zMj48YW5jaG9yIG5hbWU9Im91dHB1dHByb3BzIi8+Ci08czIgdGl0bGU9IlNldHRpbmcgb3V0cHV0IHByb3BlcnRpZXMgaW4geW91ciBzdHlsZXNoZWV0cyI+Ci08cD5PdXRwdXQgcHJvcGVydGllcyBmb3IgWE1MLCBIVE1MLCBhbmQgVGV4dCB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQgYXJlIGRlZmluZWQgaW4gcHJvcGVydHkgZmlsZXMgaW4gdGhlIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzIHBhY2thZ2UuPC9wPgotPHA+WW91IGNhbiBjaGFuZ2UgdGhlc2Ugc2V0dGluZ3MgYXMgZm9sbG93czo8L3A+Ci08b2w+Ci0gIDxsaT5EZWNsYXJlIHRoZSB4YWxhbiBuYW1lc3BhY2UgaW4geW91ciBzdHlsZXNoZWV0IGVsZW1lbnQgKHhtbG5zOnhhbGFuPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIpLjxici8+PGJyLz48L2xpPgotICA8bGk+VXNlIHRoZSBuYW1lc3BhY2UgcHJlZml4IHlvdSBhc3NpZ24gKHdlIHVzZSAieGFsYW4iIGhlcmUgaW4gdGhlIHRleHQpIHRvIHJlZGVmaW5lIHByb3BlcnRpZXMgb2YgaW50ZXJlc3QgaW4gdGhlIHN0eWxlc2hlZXQgeHNsOm91dHB1dAotICAgICAgZWxlbWVudCAoZm9yIGV4YW1wbGUsIHhhbGFuOmluZGVudC1hbW91bnQ9IjUiKS48L2xpPgotPC9vbD4KLSAgPHA+SWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBwcm9wZXJ0eSBzZXR0aW5ncyBnbG9iYWxseSwgZWRpdCB0aGUgdmFsdWVzIGluIHRoZSBwcm9wZXJ0eSBmaWxlcyBpbiBzcmMvb3JnL2FwYWNoZS94YWxhbi90ZW1wbGF0ZXMsIAotICBhbmQgdXNlIEFudCB0byA8bGluayBpZHJlZj0icmVhZG1lIiBhbmNob3I9ImphciI+cmVidWlsZCB4YWxhbi5qYXI8L2xpbms+LjwvcD4KLTxwPlRoZSBwcm9wZXJ0aWVzIGZpbGVzIGRlZmluZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6PC9wPgotPHA+PHJlZj5vdXRwdXRfeG1sLnByb3BlcnRpZXM8L3JlZj46PC9wPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRoPlByb3BlcnR5PC90aD4KLSAgICA8dGg+RGVmYXVsdCB2YWx1ZTwvdGg+Ci0gIDwvdHI+ICAKLSAgPHRyPgotICAgIDx0ZD54YWxhbjppbmRlbnQtYW1vdW50PC90ZD4KLSAgICA8dGQ+MDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+eGFsYW46Y29udGVudC1oYW5kbGVyPC90ZD4KLSAgICA8dGQ+b3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplclRvWE1MPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08cD48cmVmPm91dHB1dF9odG1sLnByb3BlcnRpZXM8L3JlZj46PC9wPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRoPlByb3BlcnR5PC90aD4KLSAgICA8dGg+RGVmYXVsdCB2YWx1ZTwvdGg+Ci0gIDwvdHI+ICAKLSAgPHRyPgotICAgIDx0ZD54YWxhbjppbmRlbnQtYW1vdW50PC90ZD4KLSAgICA8dGQ+MDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+eGFsYW46Y29udGVudC1oYW5kbGVyPC90ZD4KLSAgICA8dGQ+b3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplclRvSFRNTDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+ZW50aXRpZXM8L3RkPgotICAgIDx0ZD5IVE1MRW50aXRpZXMucmVzPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD54YWxhbjp1c2UtdXJsLWVzY2FwaW5nPC90ZD4KLSAgICA8dGQ+eWVzPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08bm90ZT5Zb3UgY2FuIGFsc28gY3JlYXRlIHlvdXIgb3duIEhUTUwgZW50aXR5IGZpbGUgKG1hcHBpbmcgY2hhcmFjdGVycyB0byBlbnRpdGllcykgCi1vciBlZGl0IHNyYy9vcmcvYXBhY2hlL3hhbGFuL3NlcmlhbGl6ZS9IVE1MRW50aXRpZXMucmVzIGFuZCByZWJ1aWxkIHhhbGFuLmphci48L25vdGU+Ci08cD48cmVmPm91dHB1dF90ZXh0LnByb3BlcnRpZXM8L3JlZj46PC9wPgotPHRhYmxlPiAgCi0gIDx0cj4KLSAgICA8dGg+UHJvcGVydHk8L3RoPgotICAgIDx0aD5EZWZhdWx0IHZhbHVlPC90aD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD54YWxhbjpjb250ZW50LWhhbmRsZXI8L3RkPgotICAgIDx0ZD5vcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZS5TZXJpYWxpemVyVG9UZXh0PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08cD5TZWUgYWxzbyA8bGluayBpZHJlZj0icmVhZG1lIiBhbmNob3I9Im91dHB1dHByb3BzIj5SZWxlYXNlIE5vdGVzOiBPdXRwdXQgUHJvcGVydGllczwvbGluaz4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImVtYmVkIi8+Ci08czIgdGl0bGU9Ildvcmtpbmcgd2l0aCBlbWJlZGRlZCBzdHlsZXNoZWV0cyI+Ci08cD5BbiBYTUwgU291cmNlIG1heSBpbmNsdWRlIGFuIDxqdW1wIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0LyI+eG1sLXN0eWxlc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjwvanVtcD4gd2hpY2ggaWRlbnRpZmllcyB0aGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHRvIHByb2Nlc3MgdGhlIGRvY3VtZW50LiBBcyBpbmRpY2F0ZWQgYnkgdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gPHJlZj5ocmVmPC9yZWY+IGF0dHJpYnV0ZSwgdGhlIHN0eWxlc2hlZXQgaXRzZWxmIG1heSBiZSBlbWJlZGRlZCBpbiB0aGUgWE1MIGRvY3VtZW50IG9yIGxvY2F0ZWQgZWxzZXdoZXJlLjwvcD4KLTxwPlN1cHBvc2UgeW91IGhhdmUgYW4gWE1MIGRvY3VtZW50IChmb28ueG1sKSB3aXRoIHRoZSBmb2xsb3dpbmcgeG1sLXN0eWxlc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjo8L3A+Ci08cD48Y29kZT4mbHQ7P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveG1sIiBocmVmPSJmb28ueHNsIj8mZ3Q7PC9jb2RlPjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgZnJhZ21lbnQsIHVzZXMgdGhpcyBpbnN0cnVjdGlvbiB0byBsb2NhdGUgdGhlIHN0eWxlc2hlZXQgKGZvby54c2wgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGZvby54bWwpIGFuZCBjcmVhdGUgYSBUZW1wbGF0ZXMgb2JqZWN0LiBOb3RlIHRoZSB1c2Ugb2YgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSBnZXRBc3NvY2lhdGVkU3R5bGVzaGVldCgpIGluIHN0ZXAgMmEuPC9wPgotPG5vdGU+QW4gWE1MIGRvY3VtZW50IG1heSBpbmNsdWRlIG1vcmUgdGhhbiBvbmUgeG1sLXN0eWxlc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgaGVuY2UgdGhlIHN1cHBvcnQgZm9yIHdvcmtpbmcgd2l0aCBtdWx0aXBsZSBzdHlsZXNoZWV0cy4gSWYgbW9yZSB0aGFuIG9uZSBzdHlsZXNoZWV0IGlzIHJldHVybmVkLCB0aGUgb3RoZXIgc3R5bGVzaGVldHMgYXJlIGltcG9ydGVkIGludG8gdGhlIGZpcnN0IHN0eWxlc2hlZXQuPC9ub3RlPgotPHNvdXJjZT4vLyAxLiBJbnN0YW50aWF0ZSB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5LgotamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSAKLSAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLS8vIDJhLiBHZXQgdGhlIHN0eWxlc2hlZXQgZnJvbSB0aGUgWE1MIHNvdXJjZS4KLVN0cmluZyBtZWRpYSA9IG51bGwgLCB0aXRsZSA9IG51bGwsIGNoYXJzZXQgPSBudWxsOwotamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2Ugc3R5bGVzaGVldCA9IHRGYWN0b3J5LmdldEFzc29jaWF0ZWRTdHlsZXNoZWV0Ci0gICAgICAgICAgICAgICAgICAgKG5ldyBTdHJlYW1Tb3VyY2UoImZvby54bWwiKSxtZWRpYSwgdGl0bGUsIGNoYXJzZXQpOwotCi0vLyAyYi4gUHJvY2VzcyB0aGUgc3R5bGVzaGVldCBhbmQgZ2VuZXJhdGUgYSBUcmFuc2Zvcm1lci4KLVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIoc3R5bGVzaGVldCk7Ci0KLS8vIDMuIFVzZSB0aGUgVHJhbnNmb3JtZXIgdG8gcGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24gYW5kIHNlbmQgdGhlCi0vLyAgICB0aGUgb3V0cHV0IHRvIGEgUmVzdWx0IG9iamVjdC4KLXRyYW5zZm9ybWVyLnRyYW5zZm9ybQotICAgICAgICAgICAgIChuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlKCJmb28ueG1sIiksCi0gICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQgKG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oImZvby5vdXQiKSkpOzwvc291cmNlPgotPHA+Rm9yIGEgc2FtcGxlIHRoYXQgdXNlcyB0aGlzIHRlY2huaXF1ZSwgc2VlIDxsaW5rIGlkcmVmPSJzYW1wbGVzIiBhbmNob3I9InVzZXN0eWxlc2hlZXRwaSI+VXNlU3R5bGVzaGVldFBJPC9saW5rPi48L3A+Ci08cD5Zb3UgY2FuIGFsc28gaW5zdHJ1Y3QgdGhlIDxsaW5rIGlkcmVmPSJjb21tYW5kbGluZSI+Y29tbWFuZC1saW5lIHV0aWxpdHk8L2xpbms+IHRvIHVzZSBzdHlsZXNoZWV0IHByb2Nlc3NpbmcKLWluc3RydWN0aW9uczo8L3A+Ci08b2w+Ci0gIDxsaT5JbmNsdWRlIHRoZSA8Y29kZT4taW48L2NvZGU+IGZsYWcgd2l0aCBhbiBYTUwgc291cmNlIHRoYXQgY29udGFpbnMgYSBzdHlsZXNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uPGJyLz48YnIvPjwvbGk+Ci0gIDxsaT5EbyBub3QgaW5jbHVkZSB0aGUgPGNvZGU+LXhzbDwvY29kZT4gZmxhZy48L2xpPgotPC9vbD4KLTwvczI+PGFuY2hvciBuYW1lPSJzZXJpYWxpemUiLz4KLTxzMiB0aXRsZT0iU2VyaWFsaXppbmcgb3V0cHV0Ij4KLTxwPkluIHNvbWUgY2FzZXMsIHlvdSBtYXkgd2FudCB0byAidHJhbnNmb3JtIiBhIERPTSB0cmVlIGludG8gYSBzdHJlYW0sIHdoaWNoIHRoZSBYTUwgY29tbXVuaXR5IGNhbGxzIHNlcmlhbGl6YXRpb24uIDxyZXNvdXJjZS1yZWYgaWRyZWY9InRyYXgiLz4gYW5kIHRoZSAmeHNsdDRqOyBUcmFuc2Zvcm1lciBpbXBsZW1lbnRhdGlvbiBwcm92aWRlIGRpcmVjdCBzdXBwb3J0IGZvciB0aGlzIG9wZXJhdGlvbi4gU2ltcGx5IHVzZSB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IG5ld1RyYW5zZm9ybWVyKCkgbWV0aG9kIChubyBhcmd1bWVudHMpIHRvIGNyZWF0ZSBhIFRyYW5zZm9ybWVyIHRoYXQgeW91IGNhbiB1c2UgdG8gImNvcHkiIGEgRE9NU291cmNlIHRvIGEgU3RyZWFtUmVzdWx0LiBGb3IgZXhhbXBsZXMsIHNlZSBFeGFtcGxlcy5leGFtcGxlRE9NMkRPTSgpLCBFeGFtcGxlcy5leGFtcGxlU2VyaWFsaXplTm9kZSgpLCBhbmQgRXhhbXBsZXMuZXhhbXBsZUFzU2VyaWFsaXplcigpIGluIHRoZSA8bGluayBpZHJlZj0ic2FtcGxlcyIgYW5jaG9yPSJ0cmF4Ij50cmF4IHNhbXBsZTwvbGluaz4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9InBhcmFtcyIvPgotPHMyIHRpdGxlPSJTZXR0aW5nIHN0eWxlc2hlZXQgcGFyYW1ldGVycyI+Ci08cD5BbiBYU0xUIHN0eWxlc2hlZXQgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyB0aGF0IGFyZSBzZXQgYXQgcnVuIHRpbWUgZWFjaCB0aW1lIGEgdHJhbnNmb3JtYXRpb24gaXMgcGVyZm9ybWVkLiBUbyBzZXQgYSBzdHlsZXNoZWV0IHBhcmFtZXRlciwgdXNlIHRoZSBUcmFuc2Zvcm1lciAKLTxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lci5odG1sI3NldFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5PYmplY3QpIj5zZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSk8L2p1bXA+IG1ldGhvZC4gRm9yIGEgd29ya2luZyBleGFtcGxlLCBzZWUgVXNlU3R5bGVzaGVldFBhcmFtLmphdmEgaW4gdGhlIHNhbXBsZXMvVXNlU3R5bGVzaGVldFBhcmFtIHN1YmRpcmVjdG9yeS48L3A+Ci08cD5Zb3UgY2FuIGFsc28gc2V0IGEgcGFyYW1ldGVyIHdpdGggdGhlIGNvbW1hbmQtbGluZSB1dGlsaXR5IGJ5IGluY2x1ZGluZyB0aGUgPGNvZGU+LXBhcmFtPC9jb2RlPiBmbGFnLiBGb3IgZXhhbXBsZTo8L3A+Ci08cD48Y29kZT5qYXZhIG9yZy5hcGFjaGUueGFsYW4ueHNsdC5Qcm9jZXNzIC1pbiBmb28ueG1sIC14c2wgZm9vLnhzbCAtcGFyYW0gcGFyYW0xIGZvb2JhcjwvY29kZT48L3A+Ci08cD53aGVyZSA8Y29kZT5wYXJhbTwvY29kZT4gaXMgdGhlIHBhcmFtZXRlciBuYW1lIGFuZCA8Y29kZT5mb29iYXI8L2NvZGU+IGlzIHRoZSBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBwYXJhbWV0ZXIgbmFtZXNwYWNlIGlzIG51bGwuPC9wPgotPG5vdGU+JnhzbHQ0ajI7IHByb2Nlc3NlcyBzdHJpbmcgcGFyYW1ldGVycy4gWW91IGFyZSBubyBsb25nZXIgcmVxdWlyZWQgKGFzIHlvdSB3ZXJlIHdpdGggJnhzbHQ0ajsgdmVyc2lvbiAxKSB0byBlbmNsb3NlIHN0cmluZ3MgaW4gc2luZ2xlIAotcXVvdGVzICgnKSBhcyBzdHJpbmcgZXhwcmVzc2lvbnMuPC9ub3RlPgotPC9zMj48YW5jaG9yIG5hbWU9InNheCIvPgotPHMyIHRpdGxlPSJFeHBsaWNpdGx5IHdvcmtpbmcgd2l0aCBTQVgiPgotICA8cD4meHNsdDRqOyB1c2VzIHRoZSBTQVggZXZlbnQgbW9kZWwgdG8gcHJvY2VzcyBzdHlsZXNoZWV0cywgdG8gcGFyc2UgWE1MIGlucHV0IGRvY3VtZW50cywgYW5kIHRvIHByb2R1Y2Ugb3V0cHV0LiBGb3IgZWFjaCBvZiB0aGVzZSBvcGVyYXRpb25zLCBhbiBYTUxSZWFkZXIgcmVhZHMgaW5wdXQsIGZpcmluZyBwYXJzZSBldmVudHMsIGFuZCBhIENvbnRlbnRIYW5kbGVyIGxpc3RlbnMgdG8gdGhlIFhNTFJlYWRlciBhbmQgZXhlY3V0ZXMgcGFyc2UgZXZlbnQgbWV0aG9kcy48L3A+Ci08cD5XaGVuIHlvdSB1c2UgdGhlIGJhc2ljIHByb2NlZHVyZSBkZXNjcmliZWQgYWJvdmUgZm9yIHBlcmZvcm1pbmcgdHJhbnNmb3JtYXRpb25zLCAmeHNsdDRqOyB0YWtlcyBjYXJlIG9mIG1hbnkgb2YgdGhlIFNBWCBkZXRhaWxzIHVuZGVyIHRoZSBjb3ZlcnMuIFlvdSBhcmUgZnJlZSB0byBtYWtlIHRoZXNlIGRldGFpbHMgZXhwbGljaXQsIHdoaWNoIHNpbXBseSBtZWFucyB0aGF0IHlvdSBjYW4gaW50ZXJ2ZW5lIGluIHRoZSBwcm9jZWR1cmUgdG8gYWNjb21tb2RhdGUgdGhlIHByZWNpc2UgZW52aXJvbm1lbnQgaW4gd2hpY2ggeW91ciBhcHBsaWNhdGlvbiBvcGVyYXRlcy48L3A+Ci08cD5TdXBwb3NlLCBmb3IgZXhhbXBsZSwgeW91IGFyZSB1c2luZyBhIGN1c3RvbSBYTUxSZWFkZXIsIHBlcmhhcHMgZG9pbmcgbW9yZSB0aGFuIGp1c3QgcGFyc2luZyBzdGF0aWMgWE1MIGRvY3VtZW50cykgdG8gZ2VuZXJhdGUgJnhzbHQ0ajsgU0FYIHBhcnNlIGV2ZW50cy4gWW91IG1pZ2h0IGV2ZW4gaGF2ZSBhIGN1c3RvbSByZWFkZXIgZm9yIHByb2R1Y2luZy9wcm9jZXNzaW5nIHN0eWxlc2hlZXRzLiBZb3UgY2FuIGNhc3QgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSB0byBhIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSwgd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvIGEgVHJhbnNmb3JtZXJIYW5kbGVyLCB3aGljaCB5b3UgY2FuIHNldCBhcyB0aGUgQ29udGVudEhhbmRsZXIgZm9yIHRoaXMgcmVhZGVyLjwvcD4KLSAgPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIGV4cGxpY2l0bHkgc2V0cyB1cCB0aGUgWE1MUmVhZGVyIGFuZCBDb250ZW50SGFuZGxlcnMsIGFuZCByZXBsaWNhdGVzIHRoZSA8bGluayBhbmNob3I9ImJhc2ljIj5iYXNpYyBzdGVwczwvbGluaz4gZGVzY3JpYmVkIGFib3ZlLjwvcD4KLSAgPHNvdXJjZT4vLyBJbnN0YW50aWF0ZSBhIFRyYW5zZm9ybWVyRmFjdG9yeS4KLWphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gCi0gICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0vLyBWZXJpZnkgdGhhdCB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IGltcGxlbWVudGF0aW9uIHlvdSBhcmUgdXNpbmcKLS8vIHN1cHBvcnRzIFNBWCBpbnB1dCBhbmQgb3V0cHV0ICgmeHNsdDRqOyBkb2VzISkuCi1pZiAodEZhY3RvcnkuZ2V0RmVhdHVyZShqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2UuRkVBVFVSRSkgJmFtcDsmYW1wOyAKLSAgICB0RmFjdG9yeS5nZXRGZWF0dXJlKGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFJlc3VsdC5GRUFUVVJFKSkKLSAgeyAKLSAgICAvLyBDYXN0IHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgdG8gU0FYVHJhbnNmb3JtZXJGYWN0b3J5LgotICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeSBzYXhURmFjdG9yeSA9IAotICAgICAgICAgICAgICAgICAgICgoamF2YXgueG1sLnRyYW5zZm9ybS5TQVhUcmFuc2Zvcm1lckZhY3RvcnkpIHRGYWN0b3J5KTsKLSAgICAvLyBDcmVhdGUgYSBUZW1wbGF0ZXMgQ29udGVudEhhbmRsZXIgdG8gaGFuZGxlIHBhcnNpbmcgb2YgdGhlIAotICAgIC8vIHN0eWxlc2hlZXQuCi0gICAgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVGVtcGxhdGVzSGFuZGxlciB0ZW1wbGF0ZXNIYW5kbGVyID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F4VEZhY3RvcnkubmV3VGVtcGxhdGVzSGFuZGxlcigpOwotCi0gICAgLy8gQ3JlYXRlIGFuIFhNTFJlYWRlciBhbmQgc2V0IGl0cyBDb250ZW50SGFuZGxlci4KLSAgICBvcmcueG1sLnNheC5YTUxSZWFkZXIgcmVhZGVyID0gCi0gICAgICAgICAgICAgICAgICAgb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOwotICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0ZW1wbGF0ZXNIYW5kbGVyKTsKLSAgICAKLSAgICAvLyBQYXJzZSB0aGUgc3R5bGVzaGVldC4gICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJlYWRlci5wYXJzZSgiZm9vLnhzbCIpOwotCi0gICAgLy8gR2V0IHRoZSBUZW1wbGF0ZXMgb2JqZWN0IChnZW5lcmF0ZWQgZHVyaW5nIHRoZSBwYXJzaW5nIG9mIHRoZSBzdHlsZXNoZWV0KQotICAgIC8vIGZyb20gdGhlIFRlbXBsYXRlc0hhbmRsZXIuCi0gICAgamF2YXgueG1sLnRyYW5zZm9ybS5UZW1wbGF0ZXMgdGVtcGxhdGVzID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXNIYW5kbGVyLmdldFRlbXBsYXRlcygpOwotICAgIC8vIENyZWF0ZSBhIFRyYW5zZm9ybWVyIENvbnRlbnRIYW5kbGVyIHRvIGhhbmRsZSBwYXJzaW5nIG9mIAotICAgIC8vIHRoZSBYTUwgU291cmNlLiAgCi0gICAgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyIHRyYW5zZm9ybWVySGFuZGxlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc2F4VEZhY3RvcnkubmV3VHJhbnNmb3JtZXJIYW5kbGVyKHRlbXBsYXRlcyk7Ci0gICAgLy8gUmVzZXQgdGhlIFhNTFJlYWRlcidzIENvbnRlbnRIYW5kbGVyIHRvIHRoZSBUcmFuc2Zvcm1lckhhbmRsZXIuCi0gICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRyYW5zZm9ybWVySGFuZGxlcik7Ci0KLSAgICAvLyBTZXQgdGhlIENvbnRlbnRIYW5kbGVyIHRvIGFsc28gZnVuY3Rpb24gYXMgYSBMZXhpY2FsSGFuZGxlciwgd2hpY2gKLSAgICAvLyBjYW4gcHJvY2VzcyAibGV4aWNhbCIgZXZlbnRzIChzdWNoIGFzIGNvbW1lbnRzIGFuZCBDREFUQSkuIAotICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lckhhbmRsZXIpOwotCi0gICAgLy8gU2V0IHVwIGEgU2VyaWFsaXplciB0byBzZXJpYWxpemUgdGhlIFJlc3VsdCB0byBhIGZpbGUuCi0gICAgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplciBzZXJpYWxpemVyID0gCi0gICAgb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUuU2VyaWFsaXplckZhY3RvcnkuZ2V0U2VyaWFsaXplcgotICAgIChvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5PdXRwdXRQcm9wZXJ0aWVzLmdldERlZmF1bHRNZXRob2RQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ4bWwiKSk7Ci0gICAgc2VyaWFsaXplci5zZXRPdXRwdXRTdHJlYW0obmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSgiZm9vLm91dCIpKTsKLSAgICAvLyBUaGUgU2VyaWFsaXplciBmdW5jdGlvbnMgYXMgYSBTQVggQ29udGVudEhhbmRsZXIuCi0gICAgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQgcmVzdWx0ID0KLSAgICAgIG5ldyBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQoc2VyaWFsaXplci5hc0NvbnRlbnRIYW5kbGVyKCkpOwotICAgIHRyYW5zZm9ybWVySGFuZGxlci5zZXRSZXN1bHQocmVzdWx0KTsKLSAgICAgIAotICAgIC8vIFBhcnNlIHRoZSBYTUwgaW5wdXQgZG9jdW1lbnQuCi0gICAgcmVhZGVyLnBhcnNlKCJmb28ueG1sIik7PC9zb3VyY2U+Ci08L3MyPjxhbmNob3IgbmFtZT0ib3V0YXNpbiIvPgotPHMyIHRpdGxlPSJVc2luZyB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQgYXMgaW5wdXQgZm9yIGFub3RoZXIgdHJhbnNmb3JtYXRpb24iPgotCi08cD5Zb3UgY2FuIGNoYWluIHRvZ2V0aGVyIGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9ucyBzdWNoIHRoYXQgdGhlIG91dHB1dCBvZiBlYWNoIHRyYW5zZm9ybWF0aW9uIHByb3ZpZGVzIGlucHV0IGZvciB0aGUgbmV4dCB0cmFuc2Zvcm1hdGlvbi4gJnhzbHQ0ajsgc3VwcG9ydHMgdHdvIGJhc2ljIHN0cmF0ZWdpZXMgZm9yIGNoYWluaW5nIGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9uczo8L3A+Ci08dWw+Ci0gIDxsaT5Vc2UgdGhlIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSB0byBwcm9jZXNzIHRoZSBzdHlsZXNoZWV0IGFuZCBjcmVhdGUgYSBUcmFuc2Zvcm1lckhhbmRsZXIgZm9yIGVhY2ggdHJhbnNmb3JtYXRpb24uIFRoZW4geW91IGNhbiBzZXQKLXRoZSBmaXJzdCBUcmFuc2Zvcm1lckhhbmRsZXIgYXMgdGhlIENvbnRlbnRIYW5kbGVyIGZvciB0aGUgWE1MUmVhZGVyIHRoYXQgcGFyc2VzIHRoZSBpbnB1dCwgbWFrZSB0aGUgc2Vjb25kIFRyYW5zZm9ybWVySGFuZGxlciB0aGUgQ29udGVudEhhbmRsZXIgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIGZpcnN0IFRyYW5zZm9ybWVySGFuZGxlciwgYW5kIHNvIG9uLiBGb3IgbW9yZSBkZXRhaWwgYW5kIGFuIGV4YW1wbGUsIHNlZSB0aGUgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0icGlwZSI+UGlwZTwvbGluaz4gc2FtcGxlLjxici8+PGJyLz48L2xpPgotICA8bGk+VXNlIHRoZSBTQVhUcmFuc2Zvcm1lckZhY3RvcnkgdG8gcHJvY2VzcyB0aGUgc3R5bGVzaGVldCBhbmQgY3JlYXRlIGEgU0FYIFhNTEZpbHRlciBmb3IgZWFjaCB0cmFuc2Zvcm1hdGlvbi4gU2V0IGFuIFhNTFJlYWRlciBhcyB0aGUgcGFyZW50IG9mIHRoZSBmaXJzdCBYTUxGaWx0ZXIsIHRoZSBmaXJzdCBYTUxGaWx0ZXIgYXMgdGhlIHBhcmVudCBvZiB0aGUgc2Vjb25kIFhNTEZpbHRlciwgYW5kIHNvIG9uLiBZb3UgbGF1bmNoIHRoZSBzZXJpZXMgb2YgdHJhbnNmb3JtYXRpb25zIGJ5IGluc3RydWN0aW5nIHRoZSBsYXN0IFhNTEZpbHRlciB0byBwYXJzZSB0aGUgWE1MIFNvdXJjZSBmb3IgdGhlIGZpcnN0IHRyYW5zZm9ybWF0aW9uLiBGb3IgbW9yZSBkZXRhaWwgYW5kIGFuIGV4YW1wbGUsIHNlZSB0aGUgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0idXNleG1sZmlsdGVycyI+VXNlWE1MRmlsdGVyczwvbGluaz4gc2FtcGxlLjwvbGk+Ci08L3VsPgotPC9zMj48YW5jaG9yIG5hbWU9ImRvbSIvPgotPHMyIHRpdGxlPSJQcm9jZXNzaW5nIGFuZCBwcm9kdWNpbmcgRE9NIHRyZWVzIj4KLSAgPHA+SW4gc29tZSBjYXNlcywgdGhlIGlucHV0IGFuZC9vciBkZXNpcmVkIG91dHB1dCBmb3IgYSB0cmFuc2Zvcm1hdGlvbiBtYXkgYmUgYSBET00gdHJlZSBvYmplY3QuIFRoZSBqYXZheC54bWwudHJhbnNmb3JtLkRPTSBwYWNrYWdlIHByb3ZpZGVzIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9kb20vRE9NU291cmNlLmh0bWwiPkRPTVNvdXJjZTwvanVtcD4gYW5kIGEgPGp1bXAgaHJlZj0iYXBpZG9jcy9qYXZheC94bWwvdHJhbnNmb3JtL2RvbS9ET01SZXN1bHQuaHRtbCI+RE9NUmVzdWx0PC9qdW1wPiwgZWl0aGVyIG9yIGJvdGggb2Ygd2hpY2ggeW91IGNhbiB1c2Ugd2hlbiB5b3UgcGVyZm9ybSBhIHRyYW5zZm9ybWF0aW9uLjwvcD4KLTxwPkluIHNvbWUgY2FzZXMsIHlvdXIgYXBwbGljYXRpb24gcHJvdmlkZXMgaW5wdXQgaW4gdGhlIGZvcm0gb2YgYSBET00gdHJlZSwgd2hpY2ggYWNjZWxlcmF0ZXMgdGhlIHRyYW5zZm9ybWF0aW9uIHByb2Nlc3MsIHNpbmNlIHRoZSBpbnB1dCBoYXMgaW4gZWZmZWN0IGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuIFRvIHByb2R1Y2UgRE9NIGlucHV0IGZyb20gYSBzdHJlYW0sIHlvdSBjYW4gdXNlIGEgPGp1bXAgaHJlZj0iYXBpZG9jcy9qYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lmh0bWwiPkRvY3VtZW50QnVpbGRlckZhY3Rvcnk8L2p1bXA+IHRvIHByb2R1Y2UgYSA8anVtcCBocmVmPSJhcGlkb2NzL2phdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlci5odG1sIj5Eb2N1bWVudEJ1aWxkZXI8L2p1bXA+IHdpdGggd2hpY2ggeW91IGNhbiBwYXJzZSB0aGUgWE1MIGlucHV0IGludG8gYSBET00gRG9jdW1lbnQsIGFzIGlsbHVzdHJhdGVkIGJlbG93LjwvcD4KLTxzb3VyY2U+Ly8gSW5zdGFudGlhdGUgYSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5LgotamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLS8vIFVzZSB0aGUgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSB0byBwcm92aWRlIGFjY2VzcyB0byBhIERvY3VtZW50QnVpbGRlci4KLWphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkQnVpbGRlciA9IGRmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotLy8gVXNlIHRoZSBEb2N1bWVudEJ1aWxkZXIgdG8gcGFyc2UgdGhlIFhNTCBpbnB1dC4KLW9yZy53M2MuZG9tLkRvY3VtZW50IGluRG9jID0gZEJ1aWxkZXIuUGFyc2UoImZvby54bWwiKTs8L3NvdXJjZT4KLTxwPlRvIHByb2R1Y2UgRE9NIG91dHB1dCwgc2ltcGx5IHVzZSBhIFRyYW5zZm9ybWVyIHRvIHRyYW5zZm9ybSB0byBhIERPTVJlc3VsdCBvYmplY3QuPC9wPgotPHNvdXJjZT4vLyBHZW5lcmF0ZSBhIFRyYW5zZm9ybWVyLgotamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyCi0gICAgICAgICAgICAgICAgICAobmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uU3RyZWFtLlN0cmVhbVNvdXJjZSgiZm9vLnhzbCIpKTsKLS8vIENyZWF0ZSBhbiBlbXB5IERPTVJlc3VsdCBvYmplY3QgZm9yIHRoZSBvdXRwdXQuCi1qYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01SZXN1bHQgZG9tUmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdCgpOwotLy8gUGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24uCi10cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZShpbkRvYykKLSAgICAgICAgICAgICAgICAgICAgICBkb21SZXN1bHQ7Ci0vLyBOb3cgeW91IGNhbiBnZXQgdGhlIG91dHB1dCBOb2RlIGZyb20gdGhlIERPTVJlc3VsdC4KLW9yZy53M2MuZG9tLk5vZGUgbm9kZSA9IGRvbVJlc3VsdC5nZXROb2RlKCk7PC9zb3VyY2U+Ci08bm90ZT5DcmVhdGUgYSBuZXcgRE9NUmVzdWx0IG9iamVjdCBvciB1c2UgRE9NUmVzdWx0LnNldE5vZGUoKSB0byBhc3NpZ24gYSBuZXcgY29udGFpbmVyIGVhY2ggdGltZSB5b3Ugd2FudCB0byBwZXJmb3JtIGEgdHJhbnNmb3JtYXRpb24gCi1hbmQgcGxhY2UgdGhlIG91dHB1dCBpbiBhIERPTVJlc3VsdCBvYmplY3QuPC9ub3RlPgotPHA+VGhlIDxsaW5rIGlkcmVmPSJzYW1wbGVzIiBhbmNob3I9ImRvbTJkb20iPkRPTTJET008L2xpbms+IGlsbHVzdHJhdGVzIGJvdGggcHJvY2VkdXJlcywgYW5kIHNlcmlhbGl6ZXMgdGhlIERPTVJlc3VsdCB0byBTeXN0ZW0ub3V0LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJ4cGF0aCIvPgotPHMyIHRpdGxlPSJXb3JraW5nIHdpdGggWFBhdGggZXhwcmVzc2lvbnMiPgotPHA+WFNMVCBzdHlsZXNoZWV0cyB1c2UgWFBhdGggZXhwcmVzc2lvbnMgdG8gc2VsZWN0IG5vZGVzLCBzcGVjaWZ5IGNvbmRpdGlvbnMsIGFuZCBnZW5lcmF0ZSB0ZXh0IGZvciB0aGUgcmVzdWx0IHRyZWUuIFhQYXRoIHByb3ZpZGVzIGFuIEFQSSB0aGF0IHlvdSBjYW4gY2FsbCBkaXJlY3RseS4gRm9yIGV4YW1wbGUsIHlvdSBtYXkgd2FudCB0byBzZWxlY3Qgbm9kZXMgcHJvZ3JhbW1hdGljYWxseSBhbmQgZG8geW91ciBvd24gcHJvY2Vzc2luZyB3aXRob3V0IGEgc3R5bGVzaGVldC48L3A+Ci08cD5YUGF0aCBpcyBhbiBpbmRlcGVuZGVudCBlbnRpdHksIHdpdGggY2xpZW50cyBvdGhlciB0aGFuIFhTTFQgcHJvY2Vzc29ycyAoc3VjaCBhcyBYUG9pbnRlcikuIEFjY29yZGluZ2x5LCAmeHNsdDRqMjsgaGFzIHBhY2thZ2VkIFhQYXRoIGFzIGEgc2VwYXJhdGUgbW9kdWxlIChvcmcuYXBhY2hlLnhwYXRoIGFuZCBpdHMgc3VicGFja2FnZXMpLCBhbHRob3VnaCBjb25jdXJyZW50bHkgdGhpcyBtb2R1bGUgZG9lcyB1c2Ugc29tZSB1dGlsaXR5IGNsYXNzZXMgcGFja2FnZWQgaW4gb3JnLmFwYWNoZS54YWxhbi51dGlscy4gVGhlIG9yZy5hcGFjaGUueHBhdGguWFBhdGhBUEkgY2xhc3MgY29udGFpbnMgY29udmVuaWVuY2UgbWV0aG9kcyB0aGF0IHlvdSBjYW4gdXNlIHRvIHJldHVybiBzaW5nbGUgRE9NIE5vZGVzLCBOb2RlSXRlcmF0b3JzLCBhbmQgWE9iamVjdHMuIEFwYXJ0IGZyb20gdGhlaXIgb3duIGZ1bmN0aW9uYWxpdHksIHRoZXNlIG1ldGhvZHMgYWxzbyBwcm92aWRlIGEgcGF0aCBpbnRvIHRoZSBsb3dlci1sZXZlbCBYUGF0aCBBUEkgdGhhdCB5b3UgbWF5IGZpbmQgdXNlZnVsLjwvcD4KLTxwPkZvciBhbiBleGFtcGxlIHRoYXQgdXNlcyB0aGUgWFBhdGhBUEkgY29udmVuaWVuY2UgbWV0aG9kcyB0byBleGVjdXRlIFhQYXRoIGV4cHJlc3Npb25zIGFnYWluc3QgWE1MIHNvdXJjZSBmaWxlcywgc2VlIDxsaW5rIGlkcmVmPSJzYW1wbGVzIiBhbmNob3I9ImFwcGx5eHBhdGgiPkFwcGx5WFBhdGg8L2xpbms+LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJhcHBsZXQiLz4KLTxzMiB0aXRsZT0iVXNpbmcgdGhlICZ4c2x0NGo7IGFwcGxldCB3cmFwcGVyIj4KLTxvbD4gCi08bGk+SW5jbHVkZSA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vY2xpZW50L1hTTFRQcm9jZXNzb3JBcHBsZXQuaHRtbCI+WFNMVFByb2Nlc3NvckFwcGxldDwvanVtcD4gaW4gYW4gSFRNTCBjbGllbnQuPGJyLz48YnIvPjwvbGk+Ci08bGk+U3BlY2lmeSB0aGUgWE1MIHNvdXJjZSBkb2N1bWVudCBhbmQgWFNMIHN0eWxlc2hlZXQuPGJyLz48YnIvPgotWW91IGNhbiB1c2UgdGhlIERvY3VtZW50VVJMIGFuZCBTdHlsZVVSTCBQQVJBTSB0YWdzIG9yIHRoZSA8anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vY2xpZW50L1hTTFRQcm9jZXNzb3JBcHBsZXQuaHRtbCNzZXREb2N1bWVudFVSTChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0ZG9jdW1lbnRVUkwoKTwvanVtcD4gYW5kIDxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9jbGllbnQvWFNMVFByb2Nlc3NvckFwcGxldC5odG1sI3NldFN0eWxlVVJMKGphdmEubGFuZy5TdHJpbmcpIj5zZXRTdHlsZVVSTCgpPC9qdW1wPiBtZXRob2RzLiBJZiB0aGUgWE1MIGRvY3VtZW50IGNvbnRhaW5zIGEgc3R5bGVzaGVldCBQcm9jZXNzaW5nIEluc3RydWN0aW9uIChQSSksIHlvdSBkbyBub3QgbmVlZCB0byBzcGVjaWZ5IGFuIFhTTCBzdHlsZXNoZWV0Ljxici8+PGJyLz48L2xpPgotPGxpPkNhbGwgdGhlIDxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi9jbGllbnQvWFNMVFByb2Nlc3NvckFwcGxldC5odG1sI3RyYW5zZm9ybVRvSHRtbChqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5TdHJpbmcpIj50cmFuc2Zvcm1Ub0h0bWwoKTwvanVtcD4gb3IgPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL2NsaWVudC9YU0xUUHJvY2Vzc29yQXBwbGV0Lmh0bWwjZ2V0SHRtbFRleHQoKSI+Z2V0SHRtbFRleHQoKTwvanVtcD4gbWV0aG9kLCB3aGljaCBwZXJmb3JtcyB0aGUgdHJhbnNmb3JtYXRpb24gYW5kIHJldHVybnMgdGhlIG5ldyBkb2N1bWVudCBhcyBhIFN0cmluZy48L2xpPjwvb2w+Ci08bm90ZT5UaGUgdHJhbnNmb3JtVG9IVE1MKCkgbWV0aG9kIHRha2VzIGFyZ3VtZW50cyBmb3IgdGhlIFhNTCBzb3VyY2UgZG9jdW1lbnQgYW5kIFhTTCBzdHlsZXNoZWV0LiBUaGUgZ2V0SHRtbFRleHQoKSBtZXRob2QgdGFrZXMgbm8gYXJndW1lbnRzOiBpdCB1c2VzIHByb3BlcnR5IG9yIHBhcmFtZXRlciBzZXR0aW5ncywgYXMgaW4gdGhlIGV4YW1wbGUgYmVsb3cuPC9ub3RlPgotPHA+Rm9yIGFuIGV4YW1wbGUsIHNlZSB0aGUgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0iYXBwbGV0eG1sdG9odG1sIj5BcHBsZXRYTUx0b0hUTUw8L2xpbms+IHNhbXBsZSBhcHBsZXQuIFRoZSAmbHQ7YXBwbGV0Jmd0OyB0YWcgaXMgaW4gc2FtcGxlcy9BcHBsZXRYTUx0b0hUTUwvY2xpZW50Lmh0bWw6PC9wPgotPHNvdXJjZT4mbHQ7YXBwbGV0ICAKLSAgICBuYW1lPSJ4c2xDb250cm9sIgotICAgIGNvZGU9Im9yZy5hcGFjaGUueGFsYW4uY2xpZW50LlhTTFRQcm9jZXNzb3JBcHBsZXQuY2xhc3MiCi0gICAgYXJjaGl2ZT0iLi4vLi4vYmluL3hhbGFuLmphciwuLi8uLi9iaW4veGVyY2VzLmphciIKLSAgICBoZWlnaHQ9IjAiCi0gICAgd2lkdGgiMCI+Ci0gICAgJmx0O3BhcmFtIG5hbWU9ImRvY3VtZW50VVJMIiB2YWx1ZT0ieGFsYW5BcHBsZXRzLnhtbCIvJmd0OwotICAgICZsdDtwYXJhbSBuYW1lPSJzdHlsZVVSTCIgdmFsdWU9InMxVG9IVE1MLnhzbCIvJmd0OwotJmx0Oy9hcHBsZXQmZ3Q7PC9zb3VyY2U+Ci08cD5XaGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgVHJhbnNmb3JtIGJ1dHRvbiwgdGhlIEhUTUwgY2xpZW50IGNhbGxzIHRoZSBnZXRIdG1sVGV4dCgpIG1ldGhvZCwgYW5kIHB1dHMgdGhlIHJldHVybmVkIEhUTUwgdGV4dCBpbiBhIGZyYW1lIGZvciB0aGUgdXNlciB0byB2aWV3LjwvcD4KLQotPC9zMj48YW5jaG9yIG5hbWU9InNlcnZsZXQiLz4KLTxzMiB0aXRsZT0iVXNpbmcgJnhzbHQ0ajsgaW4gYSBzZXJ2bGV0Ij4KLTxwPllvdSBjYW4gc2V0IHVwIGEgc2VydmxldCB0byB1c2UgJnhzbHQ0ajsgdG8gcmVzcG9uZCB0byByZXF1ZXN0cyBmb3IgWE1MIGRvY3VtZW50cyBieSB0cmFuc2Zvcm1pbmcgdGhvc2UgZG9jdW1lbnRzIGludG8gSFRNTCBhbmQgc2VydmluZyB0aGVtIHRvIHdlYiBicm93c2Vycy4gVG8gcmVzcG9uZCB0byBIVFRQIEdFVCByZXF1ZXN0cywgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIG92ZXJ3cml0ZSB0aGUgSHR0cFNlcnZsZXQgZG9HZXQoKSBtZXRob2Qgd2l0aCBhIHByb2NlZHVyZSB0aGF0IGluc3RhbnRpYXRlcyBhIFRyYW5zZm9ybWVyIGFuZCB1c2VzIGl0IHRvIHBlcmZvcm0gYSB0cmFuc2Zvcm1hdGlvbi4gQXMgdGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzLCB5b3UgY2FuIGdlbmVyYXRlIGEgUmVzdWx0U3RyZWFtIHRoYXQgYSBQcmludFdyaXRlciB3cml0ZXMgdG8gdGhlIEh0dHBSZXNwb25zZSBPdXRwdXRTdHJlYW0sIHJldHVybmluZyB0aGUgdHJhbnNmb3JtYXRpb24gb3V0cHV0IHRvIHRoZSB3ZWIgYnJvd3Nlci48L3A+Ci08c291cmNlPgotcHVibGljIGNsYXNzIFNhbXBsZVhTTFRTZXJ2bGV0IGV4dGVuZHMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0IHsKLSAgCi0gIC8vIFJlc3BvbmQgdG8gSFRUUCBHRVQgcmVxdWVzdHMgZnJvbSBicm93c2Vycy4KLSAgcHVibGljIHZvaWQgZG9HZXQgKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgIHRocm93cyBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotICAgIC8vIE91dHB1dCBnb2VzIGluIHRoZSByZXNwb25zZSBzdHJlYW0uCi0gICAgamF2YS5pby5QcmludFdyaXRlciBvdXQgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YS5pby5QcmludFdyaXRlcihyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgLy8gU2V0IGNvbnRlbnQgdHlwZSBmb3IgSFRNTC4KLSAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7ICAgIAotICAgIHRyeQotICAgIHsJCi0gICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IAotICAgICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAvLyBHZXQgdGhlIFhNTCBpbnB1dCBkb2N1bWVudCBhbmQgdGhlIHN0eWxlc2hlZXQsIGJvdGggaW4gdGhlIHNlcnZsZXQKLSAgICAgIC8vIGVuZ2luZSBkb2N1bWVudCBkaXJlY3RvcnkuCi0gICAgICBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSB4bWxTb3VyY2UgPSAKLSAgICAgICAgICAgICAgICBuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgamF2YS5uZXQuVVJMKCJmaWxlOmZvby54bWwiKS5vcGVuU3RyZWFtKCkpOwotICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UgeHNsU291cmNlID0gCi0gICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IGphdmEubmV0LlVSTCgiZmlsZTpmb28ueHNsIikub3BlblN0cmVhbSgpKTsKLSAgICAgIC8vIEdlbmVyYXRlIHRoZSB0cmFuc2Zvcm1lci4KLSAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsU291cmNlKTsKLSAgICAgIC8vIFBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uLCBzZW5kaW5nIHRoZSBvdXRwdXQgdG8gdGhlIHJlc3BvbnNlLgotICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHhtbFNvdXJjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0KG91dCkpOwotICAgIH0KLSAgICAvLyBJZiBhbiBFeGNlcHRpb24gb2NjdXJzLCByZXR1cm4gdGhlIGVycm9yIHRvIHRoZSBjbGllbnQuCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG91dC53cml0ZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZShvdXQpOyAgICAKLSAgICB9Ci0gICAgLy8gQ2xvc2UgdGhlIFByaW50V3JpdGVyLgotICAgIG91dC5jbG9zZSgpOwotICB9ICAKLX08L3NvdXJjZT4KLTxwPkZvciBhIHdvcmtpbmcgc2FtcGxlLCBzZWUgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0ic2ltcGxleHNsdHNlcnZsZXQiPlNpbXBsZVhTTFRTZXJ2bGV0PC9saW5rPi48L3A+Ci08cD5JbiB0aGUgcHJlY2VkaW5nIGV4YW1wbGUsIHRoZSBVUkxzIGZvciB0aGUgWE1MIGRvY3VtZW50IGFuZCBYU0wgc3R5bGVzaGVldCBhcmUgaGFyZGNvZGVkIGluIHRoZSBzZXJ2bGV0LiBZb3UgY2FuIGFsc28gY3JlYXRlIGEgc2VydmxldCB0aGF0IHBhcnNlcyB0aGUgcmVxdWVzdCBVUkwgZm9yIGlucHV0IHBhcmFtZXRlcnMgc3BlY2lmeWluZyB0aGUgWE1MIGRvY3VtZW50LCBYU0wgc3R5bGVzaGVldCwgYW5kIGFueSByZWxldmFudCBzdHlsZXNoZWV0IHBhcmFtZXRlcnMuIEZvciBzYW1wbGVzLCBzZWUgPGxpbmsgaWRyZWY9InNhbXBsZXMiCi1hbmNob3I9InVzZXN0eWxlc2hlZXRwYXJhbXNlcnZsZXQiPlVzZVN0eWxlc2hlZXRQYXJhbVNlcnZsZXQ8L2xpbms+IGFuZCA8bGluayBpZHJlZj0ic2FtcGxlcyIgYW5jaG9yPSJ4c2x0c2VydmxldHdpdGhwYXJhbXMiPlhTTFRTZXJ2bGV0V2l0aFBhcmFtczwvbGluaz4uIEZvciBhIG1vcmUgcm9idXN0IGFuZCBjb21wbGV4IHNhbXBsZSB0aGF0IGFsc28gZW1wbG95cyBhIHByb3BlcnRpZXMgZmlsZSB0byBkZXRlcm1pbmUgd2hpY2ggc3R5bGVzaGVldCB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBjbGllbnQgYnJvd3Nlci9kZXZpY2UsIHNlZSA8bGluayBpZHJlZj0ic2FtcGxlcyIgYW5jaG9yPSJhcHBseXhzbHQiPkFwcGx5WFNMVDwvbGluaz4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImV4dGVuc2lvbnMiLz4KLTxzMiB0aXRsZT0iQ3JlYXRpbmcgYW5kIHVzaW5nIGV4dGVuc2lvbnMiPgotPHA+Rm9yIHRob3NlIGNhc2VzIHdoZXJlIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gY2FsbCBwcm9jZWR1cmFsIGNvZGUgZnJvbSB3aXRoaW4gYSBzdHlsZXNoZWV0LCB0aGUgJnhzbHQ0ajsgRXh0ZW5zaW9ucyBmYWNpbGl0eSBzdXBwb3J0cyB0aGUgY3JlYXRpb24gb2YgZXh0ZW5zaW9uIGVsZW1lbnRzIGFuZCBleHRlbnNpb24gZnVuY3Rpb25zLiBTZWUgPGxpbmsgaWRyZWY9ImV4dGVuc2lvbnMiPkV4dGVuc2lvbnM8L2xpbms+IGFuZCA8bGluayBpZHJlZj0ic2FtcGxlcyIgYW5jaG9yPSJleHRlbnNpb25zIj5FeHRlbnNpb25zIHNhbXBsZXM8L2xpbms+LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJtdWx0aXRocmVhZGluZyIvPgotPHMyIHRpdGxlPSJNdWx0aXRocmVhZGluZyI+Ci08cD5BIGdpdmVuIFRlbXBsYXRlcyBvYmplY3QgbWF5IGJlIHVzZWQgcmVwZWF0ZWRseSBhbmQgZXZlbiBpbiBtdWx0aXBsZSB0aHJlYWRzIHJ1bm5pbmcgY29uY3VycmVudGx5IGZvciB0aGUgdHJhbnNmb3JtYXRpb24gb2YgWE1MIGlucHV0LCBidXQgeW91IHNob3VsZCB1c2UgdGhlIFRlbXBsYXRlcyBvYmplY3QgdG8gaW5zdGFudGlhdGUgYSBzZXBhcmF0ZSBUcmFuc2Zvcm1lciBmb3IgZWFjaCB0cmFuc2Zvcm1hdGlvbiB5b3UgcGVyZm9ybS4gVGhlIFRlbXBsYXRlcyBvYmplY3QgaXMgYW4gaW1tdXRhYmxlIHJ1bnRpbWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgY29udGVudCBvZiBhIHN0eWxlc2hlZXQgKHdoaWNoIG1heSBpbmNsdWRlIGFuZCBpbXBvcnQgbXVsdGlwbGUgc3R5bGVzaGVldCBzb3VyY2VzKS4gQSBUcmFuc2Zvcm1lciwgb24gdGhlIG90aGVyIGhhbmQsIGlzIGEgbGlnaHR3ZWlnaHQgb2JqZWN0IHRoYXQgdHJhY2tzIHN0YXRlIGluZm9ybWF0aW9uIGR1cmluZyB0aGUgdHJhbnNmb3JtYXRpb24sIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIHRvIHBlcmZvcm0gYSBzaW5nbGUgdHJhbnNmb3JtYXRpb24uPC9wPgotCi08cD5JZiB5b3Ugd2FudCB0byBwZXJmb3JtIG11bHRpcGxlIHRyYW5zZm9ybWF0aW9ucyAoc2VxdWVudGlhbGx5IG9yIGNvbmN1cnJlbnRseSkgd2l0aCB0aGUgc2FtZSBzdHlsZXNoZWV0IGluc3RydWN0aW9ucywgZG8gdGhlIGZvbGxvd2luZzo8L3A+Ci08b2w+Ci0gIDxsaT5Vc2UgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSA8anVtcCBocmVmPSJhcGlkb2NzL2phdmF4L3htbC90cmFuc2Zvcm0vVHJhbnNmb3JtZXJGYWN0b3J5Lmh0bWwjbmV3VGVtcGxhdGVzKGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlKSI+bmV3VGVtcGxhdGVzKFNvdXJjZSB4c2xTb3VyY2UpPC9qdW1wPiBtZXRob2QgdG8gY3JlYXRlIGEgVGVtcGxhdGVzIG9iamVjdC48YnIvPjxici8+PC9saT4KLTxsaT5Gb3IgZWFjaCB0cmFuc2Zvcm1hdGlvbiwgdXNlIHRoZSBUZW1wbGF0ZXMgb2JqZWN0IDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UZW1wbGF0ZXMuaHRtbCNuZXdUcmFuc2Zvcm1lcigpIj5uZXdUcmFuc2Zvcm1lcigpPC9qdW1wPiBtZXRob2QgdG8gY3JlYXRlIGEgVHJhbnNmb3JtZXIsIGFuZCB1c2UgdGhhdCBUcmFuc2Zvcm1lcidzIDxqdW1wIGhyZWY9ImFwaWRvY3MvamF2YXgveG1sL3RyYW5zZm9ybS9UcmFuc2Zvcm1lci5odG1sI3RyYW5zZm9ybShqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSwgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQpIj50cmFuc2Zvcm0oU291cmNlIHhtbFNvdXJjZSwgUmVzdWx0IHRyYW5zZm9ybVJlc3VsdCk8L2p1bXA+IG1ldGhvZCB0byBwZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbi48L2xpPgotPC9vbD4KLTxwPkZvciBhbiBleGFtcGxlLCBzZWUgRXhhbXBsZXMuZXhhbXBsZVVzZVRlbXBsYXRlc09iaigpIGluIHRoZSA8bGluayBpZHJlZj0ic2FtcGxlcyIgYW5jaG9yPSJ0cmF4Ij50cmF4IHNhbXBsZTwvbGluaz4uPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImRlYnVnZ2luZyIvPgotPHMyIHRpdGxlPSJEZWJ1Z2dlciBJbnRlcmZhY2UiPgotCQk8cD4meHNsdDRqOyBjb250YWlucyBhIGRlYnVnZ2VyIGludGVyZmFjZSBpbiB0aGUgb3JnLmFwYWNoZS54YWxhbi54c2x0LnRyYWNlIHBhY2thZ2U6PC9wPiAKLQkJPHVsPgotCQkgIDxsaT48anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdHJhY2UvVHJhY2VMaXN0ZW5lci5odG1sIj5UcmFjZUxpc3RlbmVyPC9qdW1wPiBpcyBhbiBpbnRlcmZhY2UgdGhhdCBkZWJ1Z2dlcnMgCi0JCSAgY2FuIGltcGxlbWVudC4gT3IsIGxpa2UgdGhlIDxsaW5rIGlkcmVmPSJjb21tYW5kbGluZSI+Y29tbWFuZC1saW5lIHV0aWxpdHk8L2xpbms+LCB5b3UgY2FuIHVzZSB0aGUgPGp1bXAKLSAgICAgIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90cmFjZS9QcmludFRyYWNlTGlzdGVuZXIuaHRtbCI+UHJpbnRUcmFjZUxpc3RlbmVyPC9qdW1wPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGF0IGludGVyZmFjZS4KLSAgICAgIDxici8+PGJyLz48L2xpPgotICAgICAgPGxpPllvdSBjYW4gcmVnaXN0ZXIgYSBUcmFjZUxpc3RlbmVyIHdpdGggdGhlIAotICAgICAgPGp1bXAgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL3hhbGFuL3RyYWNlL1RyYWNlTWFuYWdlci5odG1sIj5UcmFjZU1hbmFnZXI8L2p1bXA+IGFzc29jaWF0ZWQKLSAgICAgIHdpdGggdGhlIFRyYW5zZm9ybWVyIHRoYXQgd2lsbCBwZXJmb3JtIGEgZ2l2ZW4gdHJhbnNmb3JtYXRpb24uPGJyLz48YnIvPjwvbGk+Ci0JCSAgPGxpPjxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90cmFjZS9UcmFjZXJFdmVudC5odG1sIj5UcmFjZXJFdmVudDwvanVtcD4gaXMgYW4gZXZlbnQgdGhhdCBpcyAKLQkJICBwYXNzZWQgdG8gdGhlIFRyYWNlTGlzdGVuZXIudHJhY2UgZnVuY3Rpb24uIEl0IGlzIGNhbGxlZCBiZWZvcmUgYSBub2RlIGlzICdleGVjdXRlZCcgaW4gdGhlIHN0eWxlc2hlZXQuPGJyLz48YnIvPjwvbGk+Ci0JCSAgPGxpPjxqdW1wIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS94YWxhbi90cmFjZS9HZW5lcmF0ZUV2ZW50Lmh0bWwiPkdlbmVyYXRlRXZlbnQ8L2p1bXA+IGlzIGFuIGV2ZW50IHRoYXQgaXMgCi0JCSAgcGFzc2VkIHRvIHRoZSBUcmFjZUxpc3RlbmVyLmdlbmVyYXRlZCgpIGZ1bmN0aW9uLiBJdCBpcyBjYWxsZWQgYWZ0ZXIgYW4gZXZlbnQgb2NjdXJzIHRvIGNyZWF0ZSBzb21ldGhpbmcgaW4gdGhlIHJlc3VsdAotICAgICAgdHJlZS48YnIvPjxici8+PC9saT4KLSAgICAgIDxsaT48anVtcCBocmVmPSJhcGlkb2NzL29yZy9hcGFjaGUveGFsYW4vdHJhY2UvU2RlbGVjdGlvbkV2ZW50Lmh0bWwiPlNlbGVjdGlvbkV2ZW50PC9qdW1wPiBpcyBhbiBldmVudCB0cmlnZ2VyZWQgYnkgdGhlCi0gICAgICAgc2VsZWN0aW9uIG9mIGEgc3R5bGVzaGVldCBub2RlLjwvbGk+Ci0JCTwvdWw+Ci0gICAgPHA+VGhlIDxsaW5rIGlkcmVmPSJjb21tYW5kbGluZSI+Y29tbWFuZC1saW5lIHV0aWxpdHk8L2xpbms+IHVzZXMgdGhlIGRlYnVnZ2VyIGludGVyZmFjZSB3aGVuIHlvdSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZQotICAgICBmb2xsb3dpbmcgc3dpdGNoZXM6IDxjb2RlPi1UVDwvY29kZT4sIDxjb2RlPi1URzwvY29kZT4sIDxjb2RlPi1UUzwvY29kZT4sIDxjb2RlPi1UVEM8L2NvZGU+LjwvcD4KLSAgICA8cD5FeGFtcGxlOjwvcD4KLTxzb3VyY2U+aW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuVHJhbnNmb3JtZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuVHJhY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuUHJpbnRUcmFjZUxpc3RlbmVyOwotLi4uCi0vLyBTZXQgdXAgYSBQcmludFRyYWNlTGlzdGVuZXIgb2JqZWN0IHRvIHByaW50IHRvIGEgZmlsZS4KLWphdmEuaW8uRmlsZVdyaXRlciBmdyA9IG5ldyBqYXZhLmlvLkZpbGVXcml0ZXIoImV2ZW50cy5sb2ciKTsKLWphdmEuaW8uUHJpbnRXcml0ZXIgcHcgPSBuZXcgamF2YS5pby5QcmludFdyaXRlcihmdyk7Ci1QcmludFRyYWNlTGlzdGVuZXIgcHRsID0gbmV3IFByaW50VHJhY2VMaXN0ZW5lcihwdyk7Ci0KLS8vIFByaW50IGluZm9ybWF0aW9uIGFzIGVhY2ggbm9kZSBpcyAnZXhlY3V0ZWQnIGluIHRoZSBzdHlsZXNoZWV0LgotcHRsLm1fdHJhY2VFbGVtZW50cyA9IHRydWU7Ci0vLyBQcmludCBpbmZvcm1hdGlvbiBhZnRlciBlYWNoIHJlc3VsdC10cmVlIGdlbmVyYXRpb24gZXZlbnQuCi1wdGwubV90cmFjZUdlbmVyYXRpb24gPSB0cnVlOwotLy8gUHJpbnQgaW5mb3JtYXRpb24gYWZ0ZXIgZWFjaCBzZWxlY3Rpb24gZXZlbnQuCi1wdGwubV90cmFjZVNlbGVjdGlvbiA9IHRydWU7Ci0vLyBQcmludCBpbmZvcm1hdGlvbiB3aGVuZXZlciBhIHRlbXBsYXRlIGlzIGludm9rZWQuCi1wdGwubV90cmFjZVRlbXBsYXRlcyA9IHRydWU7Ci0KLS8vIFNldCB1cCB0aGUgdHJhbnNmb3JtYXRpb24gICAgCi1qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IAotICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnRybmFzZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLWphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSAKLSAgdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIobmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZm9vLnhzbCIpKTsKLQotLy8gQ2FzdCB0aGUgVHJhbnNmb3JtZXIgb2JqZWN0IHRvIFRyYW5zZm9ybWVySW1wbC4KLWlmICh0cmFuc2Zvcm1lciBpbnN0YW5jZW9mIFRyYW5zZm9ybWVySW1wbCkgewotICBUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXJJbXBsID0gKFRyYW5zZm9ybWVySW1wbCl0cmFuc2Zvcm1lcjsKLSAgCi0gIC8vIFJlZ2lzdGVyIHRoZSBUcmFjZUxpc3RlbmVyIHdpdGggdGhlIFRyYWNlTWFuYWdlciBhc3NvY2lhdGVkIAotICAvLyB3aXRoIHRoZSBUcmFuc2Zvcm1lckltcGwuCi0gIFRyYWNlTWFuYWdlciB0ck1nciA9IHRyYW5zZm9ybWVySW1wbC5nZXRUcmFjZU1hbmFnZXIoKTsKLSAgdHJNZ3IuYWRkVHJhY2VMaXN0ZW5lcihwdGwpOwotICAKLSAgLy8gUGVyZm9ybSB0aGUgdHJhbnNmb3JtYXRpb24gLS1wcmludGluZyBpbmZvcm1hdGlvbiB0bwotICAvLyB0aGUgZXZlbnRzIGxvZyBkdXJpbmcgdGhlIHByb2Nlc3MuCi0gIHRyYW5zZm9ybWVyLnRyYW5zZm9ybQotICAgICAgKCBuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlKCJmb28ueG1sIiksIAotICAgICAgICBuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IGphdmEuaW8uRmlsZVdyaXRlcigiZm9vLm91dCIpKSApOwotfQotLy8gQ2xvc2UgdGhlIFByaW50V3JpdGVyIGFuZCBGaWxlV3JpdGVyLgotcHcuY2xvc2UoKTsKLWZ3LmNsb3NlKCk7PC9zb3VyY2U+Ci08cD5Gb3IgYSBzYW1wbGUgYXBwbGljYXRpb24gdGhhdCB1c2VzIHRoaXMgdGVjaG5pcXVlLCBzZWUgPGxpbmsgaWRyZWY9InNhbXBsZXMiIGFuY2hvcj0idHJhY2UiPlRyYWNlPC9saW5rPi48L3A+Ci08L3MyPjxhbmNob3IgbmFtZT0iY29tcGF0Ii8+Ci08czIgdGl0bGU9IlVzaW5nIHRoZSAmeHNsdDRqOyB2ZXJzaW9uIDEgQVBJIj4KLTxwPlRoZSBiaW4gZGlyZWN0b3J5IGluY2x1ZGVzIGEgY29tcGF0aWJpbGl0eSBqYXIsIHhhbGFuajFjb21wYXQuamFyLCB0aGF0IGxldHMgeW91IHJlYnVpbGQgeW91ciBYYWxhbi1KYXZhIDEueCBhcHBsaWNhdGlvbnMgdG8gcnVuIHdpdGggWGFsYW4tSmF2YSAyLiBBcyBhIHBvaW50IG9mIHJlZmVyZW5jZSwgdGhpcyBKQVIgaW5jbHVkZXMgdGhlIEFQSSByZXF1aXJlZCB0byByZWNvbXBpbGUgdGhlIFhhbGFuLUphdmEgMS54IGNvcmUgc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIHRoZSBzYW1wbGUgZXh0ZW5zaW9ucykgYW5kIHJ1biB0aGVtIHdpdGggWGFsYW4tSmF2YSAyLiBUbyB1c2UgdGhpcyBjb21wYXRpYmlsaXR5IGxheWVyIHdpdGggYW4gZXhpc3RpbmcgWGFsYW4tSmF2YSAxLnggYXBwbGljYXRpb24sIGRvIHRoZSBmb2xsb3dpbmc6PC9wPgotPG9sPgotPGxpPlBsYWNlIHhhbGFuajFjb21wYXQuamFyIG9uIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIGluIGZyb250IG9mIHRoZSBYYWxhbi1KYXZhIDIgeGFsYW4uamFyIChib3RoIGFyZSBpbiB0aGUgYmluIGRpcmVjdG9yeSkuPGJyLz48YnIvPjwvbGk+Ci08bGk+UmVjb21waWxlIHlvdXIgYXBwbGljYXRpb24uIEl0IGl0IGRvZXMgbm90IGNvbXBpbGUsIHlvdSBtYXkgYmUgdXNpbmcgWGFsYW4tSmF2YSAxLnggQVBJIHRoYXQgdGhlIGNvbXBhdGliaWxpdHkgbGF5ZXIgZG9lcyBub3Qgc3VwcG9ydC4gPGJyLz48YnIvPjwvbGk+Ci08bGk+UnVuIHRoZSByZWNvbXBpbGVkIGFwcGxpY2F0aW9uIHdpdGggeGFsYW5qMWNvbXBhdC5qYXIgb24gdGhlIHN5c3RlbSBjbGFzc3BhdGggaW4gZnJvbnQgb2YgdGhlIFhhbGFuLUphdmEgMiB4YWxhbi5qYXIuPC9saT4KLTwvb2w+Ci08cD5XZSB1cmdlIG91ciBYYWxhbi1KYXZhIDEueCB1c2VycyB0byBzdGFydCB1c2luZyBYYWxhbi1KYXZhIDIuIFRoYXQgaXMgd2hlcmUgd2UgYXJlIGNvbmNlbnRyYXRpbmcgb3VyIGVmZm9ydHMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgZml4IGFueSBvdXRzdGFuZGluZyBidWdzLiBUbyBzZWUgd2hhdCBwb3J0aW9uIG9mIHRoZSBYYWxhbi1KYXZhIDEueCBBUEkgd2UgaGF2ZSBpbmNsdWRlZCBpbiB4YWxhbmoxY29tcGF0Lmphciwgc2VlIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImNvbXBhdGFwaSIvPi4gRm9yIGV4YW1wbGUsIHRoZSBjb21wYXRpYmlsaXR5IGxheWVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHVzZSBvZiBYYWxhbi1KYXZhIDEueCBleHRlbnNpb25zLiBJZiB5b3UgZmVlbCB0aGF0IHdlIHNob3VsZCBleHRlbmQgb3VyIGNvbXBhdGliaWxpdHkgSkFSIHRvIHN1cHBvcnQgYWRkaXRpb25hbCBYYWxhbi1KYXZhIDEueCBBUEkgY2FsbHMsIHBsZWFzZSBsZXQgdXMga25vdyBleGFjdGx5IHdoYXQgeW91IHdvdWxkIGxpa2UgdG8gc2VlLjwvcD4KLTwvczI+Ci08L3MxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveGFsYW4vd2hhdHNuZXcueG1sIGIveGRvY3Mvc291cmNlcy94YWxhbi93aGF0c25ldy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGViNDYuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94YWxhbi93aGF0c25ldy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IURPQ1RZUEUgczEgU1lTVEVNICIuLi8uLi9zdHlsZS9kdGQvZG9jdW1lbnQuZHRkIj4KLTwhLS0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgTG90dXMKLSAqIERldmVsb3BtZW50IENvcnBvcmF0aW9uLiwgaHR0cDovL3d3dy5sb3R1cy5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci08czEgdGl0bGU9IldoYXQncyBuZXcgaW4gJnhzbHQ0ajI7Ij4KLQotICA8czIgdGl0bGU9Ik5ldyBEZXNpZ24iPgotICA8cD4meHNsdDRqMjsgcmVwcmVzZW50cyBhIGZ1bmRhbWVudGFsIHJlZGVzaWduIG9mIFhhbGFuLiBUaGUgcHJpbWFyeSBvYmplY3RpdmUgb2YgdGhpcyByZWRlc2lnbiBpcyBhbiBlYXNpZXItdG8tdXNlLCBtb3JlIHVuZGVyc3RhbmRhYmxlLCBhbmQgbW9yZSBtb2R1bGFyIEFQSSB0aGF0IGVuY291cmFnZXMgd2lkZXIgcGFydGljaXBhdGlvbiBpbiBpdHMgb25nb2luZyBkZXZlbG9wbWVudCBieSB0aGUgb3Blbi1zb3VyY2UgWE1MIGRldmVsb3BlciBjb21tdW5pdHksIGFuZCB0aGF0IGxlbmRzIGl0c2VsZiB0byAic3RyZWFtaW5nLCIgdGhlIHByb2R1Y3Rpb24gb2YgdHJhbnNmb3JtYXRpb24gb3V0cHV0IHdoaWxlIHRoZSBpbnB1dCBpcyBzdGlsbCBiZWluZyBwYXJzZWQuPC9wPgotPHA+JnhzbHQ0ajI7IGJ1aWxkcyBvbiA8cmVzb3VyY2UtcmVmIGlkcmVmPSJzYXgyIi8+LCA8cmVzb3VyY2UtcmVmIGlkcmVmPSJkb20yIi8+LCBhbmQgdGhlIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImpheHAiLz4uIEZvciBleGFtcGxlLCAmeHNsdDRqMjsgaW5jb3Jwb3JhdGVzIHRoZSBTQVggcGFyc2luZyBldmVudCBtb2RlbCBpbiBpdHMgc3VwcG9ydCBmb3IgdGhlIGluY3JlbWVudGFsIHByb2R1Y3Rpb24gb2YgdHJhbnNmb3JtYXRpb24gb3V0cHV0LiAmeHNsdDRqMjsgYWxzbyBpbXBsZW1lbnRzIHRoZSAgc3RhbmRhcmQgVHJBWCBBUEkgKHNlZSBiZWxvdykgdGhhdCBlbmFibGVzIHlvdSB0byBjb2RlIHlvdXIgWE1MIGFwcGxpY2F0aW9ucyB3aXRob3V0IHJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWwgZGV0YWlscyBvZiBhIHBhcnRpY3VsYXIgVHJhbnNmb3JtZXIgb3IgWE1MIHBhcnNlci48L3A+Ci08cD5HaXZlbiB0aGUgc2NvcGUgb2YgdGhlIHJlZGVzaWduLCB0aGUgY2hhbmdlcyB3aXRoIHJlc3BlY3QgdG8gPGp1bXAgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuL2luZGV4Lmh0bWwiPiZ4c2x0NGo7IDEueDwvanVtcD4gYXJlIGdsb2JhbCBpbiBuYXR1cmUuIEZvciBhbiBpbnRyb2R1Y3Rpb24gdG8gdGhlICZ4c2x0NGoyOyB1c2FnZSBwYXR0ZXJucywgc2VlIDxsaW5rIGlkcmVmPSJ1c2FnZXBhdHRlcm5zIj5CYXNpYyBVc2FnZSBQYXR0ZXJuczwvbGluaz4uPC9wPgotPHA+JnhzbHQ0ajI7IGltcGxlbWVudHMgdGhlIDxyZXNvdXJjZS1yZWYgaWRyZWY9InRyYXgiLz4gaW50ZXJmYWNlcy4gVGhlIHByb2R1Y3Qgb2YgZXh0ZW5zaXZlIG9wZW4tc291cmNlIGNvbGxhYm9yYXRpb24gYnkgbWVtYmVycyBvZiB0aGUgWE1MIGRldmVsb3BlciBjb21tdW5pdHksIFRyQVggcHJvdmlkZXMgYSBjb25jZXB0dWFsIGZyYW1ld29yayBhbmQgYSBzdGFuZGFyZCBBUEkgZm9yIHBlcmZvcm1pbmcgWE1MIHRyYW5zZm9ybWF0aW9ucy4gRHVyaW5nIGl0cyBldm9sdXRpb24sIHRoZSBUckFYIEFQSSBoYXMgdW5kZXJnb25lIHNldmVyYWwgcmV2aXNpb25zLiBXZSBiZWxpZXZlIHRoaXMgQVBJIGhhcyBub3cgcmVhY2hlZCBvciBpcyB2ZXJ5IGNsb3NlIHRvIGZpbmFsIGZvcm0uIEluIE5vdmVtYmVyIDIwMDAsIFRyQVggd2FzIGluY29ycG9yYXRlZCBpbnRvIDxyZXNvdXJjZS1yZWYgaWRyZWY9ImpzcjA2MyIvPiwgdGhlIEphdmEgQVBJIGZvciBYTUwgUHJvY2Vzc2luZyAxLjEgLCB3aGljaCBoYXMgYmVlbiBwdWJsaXNoZWQgZm9yIHB1YmxpYyByZXZpZXcgKHNlZSA8cmVzb3VyY2UtcmVmIGlkcmVmPSJqYXhwMTEiLz4pLiBXZSBzdHJvbmdseSBlbmNvdXJhZ2UgeW91IHRvIHV0aWxpemUgdGhlIFRyQVggZnJhbWV3b3JrIHdoZW4geW91IHVzZSAmeHNsdDRqMjsgdG8gcGVyZm9ybSBYTUwgdHJhbnNmb3JtYXRpb25zLjwvcD4KLTxwPlRoZSBiYXNpYyBvcmdhbml6YXRpb24gb2YgVHJBWCBpcyBxdWl0ZSBzaW1wbGU6IHVzZSBhIFRyYW5zZm9ybWVyRmFjdG9yeSB0byBwcm9jZXNzIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucyBhbmQgZ2VuZXJhdGUgYSBUcmFuc2Zvcm1lciwgd2l0aCB3aGljaCB5b3UgY2FuIGFwcGx5IHRoZSBwcm9jZXNzZWQgdHJhbnNmb3JtYXRpb24gaW5zdHJ1Y3Rpb25zIHRvIHlvdXIgWE1MIFNvdXJjZSwgcHJvZHVjaW5nIGEgdHJhbnNmb3JtYXRpb24gUmVzdWx0LiBGb3IgbW9yZSBkZXRhaWwsIHNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJiYXNpYyI+QmFzaWMgc3RlcHM8L2xpbms+LjwvcD4KLTxwPkFzIHBhcnQgb2YgdGhlIEphdmEgQVBJIGZvciBYTUwgUHJvY2Vzc2luZywgVHJhWCBwcm92aWRlcyBhIHN0YWJsZSBmcmFtZXdvcmsgZm9yIHBsdWdnaW5nIFRyYW5zZm9ybWVycyAobGlrZSAmeHNsdDRqOykgYW5kIFhNTCBwYXJzZXJzIChsaWtlICZ4bWw0ajspIGludG8geW91ciBhcHBsaWNhdGlvbnMgd2l0aG91dCB0eWluZyB5b3Vyc2VsZiB0byB0aGUgaW50ZXJuYWwgZGV0YWlscyBvZiB0aG9zZSBpbXBsZW1lbnRhdGlvbnMuIFNlZSA8bGluayBpZHJlZj0idXNhZ2VwYXR0ZXJucyIgYW5jaG9yPSJwbHVnIj5QbHVnZ2luZyBpbiBhIFRyYW5zZm9ybWVyIGFuZCBYTUwgcGFyc2VyPC9saW5rPi48L3A+Ci08L3MyPgotPC9zMT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hhbGFuZGVzaWduLnhtbCBiL3hkb2NzL3NvdXJjZXMveGFsYW5kZXNpZ24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDJkYTI4Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveGFsYW5kZXNpZ24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgYm9vayBTWVNURU0gInNiazovc3R5bGUvZHRkL2Jvb2suZHRkIj4KLQotPCEtLQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLQotPGJvb2sgdGl0bGU9IlhhbGFuIDIuMC4wIERlc2lnbiIgY29weXJpZ2h0PSIyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiI+Ci0gCi0gIDxkb2N1bWVudCBpZD0iZGVzaWduMl8wXzAiCi0gICAgICAgICAgICBsYWJlbD0iWGFsYW4tSiAyLjAuMCBEZXNpZ24iCi0gICAgICAgICAgICBzb3VyY2U9ImRlc2lnbi9kZXNpZ24yXzBfMC54bWwiLz4gICAgCi08L2Jvb2s+Ci0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3N0eWxlL2R0ZC9zcGVjLmR0ZCBiL3hkb2NzL3N0eWxlL2R0ZC9zcGVjLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyMDI4OS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zdHlsZS9kdGQvc3BlYy5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gIE1PRFVMRTogICAgc3BlYyBEVEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIFZFUlNJT046ICAgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIERBVEU6ICAgICAgT2N0b2JlciAxOCwgMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgIElTTyBTVEFOREFSRCBTUEVDSUFMIENIQVJBQ1RFUiBTRVRTICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tCi08IUVOVElUWSAlIGlzb2xhdDEgICAgICBQVUJMSUMKLSJJU08gODg3OS0xOTg2Ly9FTlRJVElFUyBBZGRlZCBMYXRpbiAxLy9FTiIKLSJlbnRpdGllcy9JU09sYXQxLnBlbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi08IUVOVElUWSAlIGlzb251bSAgICAgICBQVUJMSUMKLSJJU08gODg3OS0xOTg2Ly9FTlRJVElFUyBOdW1lcmljIGFuZCBTcGVjaWFsIEdyYXBoaWMvL0VOIgotImVudGl0aWVzL0lTT251bS5wZW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotPCFFTlRJVFkgJSBpc29wdWIgICAgICAgUFVCTElDCi0iSVNPIDg4NzktMTk4Ni8vRU5USVRJRVMgUHVibGlzaGluZy8vRU4iCi0iZW50aXRpZXMvSVNPcHViLnBlbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi08IUVOVElUWSAlIGlzb3RlY2ggICAgICBQVUJMSUMKLSJJU08gODg3OS0xOTg2Ly9FTlRJVElFUyBHZW5lcmFsIFRlY2huaWNhbC8vRU4iCi0iZW50aXRpZXMvSVNPdGVjaC5wZW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotJWlzb2xhdDE7ICVpc29udW07ICVpc29wdWI7ICVpc290ZWNoOwotLS0+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBlbnRpdGllcyBmb3IgY29udGVudCBtb2RlbHMgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBsaXN0IGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVOVElUWSAlIGxpc3RzICAgICAgICJpdGVtaXplZGxpc3QgfCBvcmRlcmVkbGlzdCB8IHZhcmlhYmxlbGlzdCIgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgbGluZXNwZWNpZmljIGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgd2hlcmUgbGluZSBlbmRpbmdzIGFuZCB3aGl0ZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmUgc2lnbmlmaWNhbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVOVElUWSAlIGxpbmVzcGVjaWZpYwotICAgICAgICAgICAgICAgICAgICAgICAibGl0ZXJhbGxheW91dCB8IHByb2dyYW1saXN0aW5nIiAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIHBocmFzZS1sZXZlbCBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFsbG93ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGV4dCAtLT4KLTwhRU5USVRZICUgcGhyYXNlbGV2ZWwgImNpdGF0aW9uIHwgZW1waGFzaXMgfCBpbmxpbmVncmFwaGljIHwgbGluayB8IHBsaW5rIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdCB8IHN1cGVyc2NyaXB0IHwgdWxpbmsgfCB0ZXJtcmVmIiAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGgtbGV2ZWwgZWxlbWVudHMgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyAoaW5jbHVkaW5nIHBhcmFncmFwaHMpIGFsbG93ZWQgYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsZXZlbCBvZiBwYXJhZ3JhcGhzICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRU5USVRZICUgcGFyYWxldmVsICAgIiVsaW5lc3BlY2lmaWM7IHwgJWxpc3RzOyB8IG5vdGUgfCBwYXJhIHwgaXNzdWUgfAotICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgfCBmaWd1cmUgfCBncmFwaGljIiAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBlbnRpdGllcyBmb3IgYXR0cmlidXRlcyAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBjb21tb24gYXR0cmlidXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVOVElUWSAlIGNvbW1vbi5hdHRzCi0gICAgICAgICAgICAgImlkICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgICAgICAgICBsaW5rLXVybCAgIENEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQiID4KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYy1yZWxhdGVkIGF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgIC0tPgotPCFFTlRJVFkgJSBncmFwaGljLmF0dHMKLSAgICAgICAgICAgICJmaWxlcmVmICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICBhbHQgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICBzcmNjcmVkaXQgIENEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICB3aWR0aCAgICAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICBkZXB0aCAgICAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICBzY2FsZSAgICAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICBzY2FsZWZpdCAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQiID4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgbW9kdWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08IS0tCi08IUVOVElUWSAlIHRhYmxlLmVudCBTWVNURU0gInRhYmxlLmVudCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0ldGFibGUuZW50OwotLS0+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHNwZWMgICAgICAgICAodGl0bGUsIGZyb250bWF0dGVyLCBpbnRyb2R1Y3Rpb24sIHJlcXVpcmVtZW50cywgbW9kZWwsIHNlY3QxKywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRpeCosIGJpYmxpb2dyYXBoeT8pICAgICAgICAgICAgICAgICAgID4KLQotPCFBVFRMSVNUICBzcGVjCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLTwhRUxFTUVOVCAgZnJvbnRtYXR0ZXIgICAocHViZGF0ZSwgY29weXJpZ2h0LCBhdXRob3IqLCBhYnN0cmFjdD8pICAgID4KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgdGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICB0aXRsZSAgICAgICAgKCNQQ0RBVEEgfCAlcGhyYXNlbGV2ZWw7KSogICAgICAgICAgICAgICAgICAgPgotPCFBVFRMSVNUICB0aXRsZQotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGlzc3VlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgaXNzdWUgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqICAgICAgICAgICAgICAgICAgID4KLTwhQVRUTElTVCAgaXNzdWUKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBwdWJsaWNhdGlvbiBkYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICBwdWJsaWNhdGlvbiBkYXRlIGFuZCwgcG9zc2libHksIHRpbWUgICAgICAgLS0+Ci08IUVMRU1FTlQgIHB1YmRhdGUgICAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IUFUVExJU1QgIHB1YmRhdGUKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBjb3B5cmlnaHQgc3RhdGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIGNvcHlyaWdodCAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGNvcHlyaWdodAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGF1dGhvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgYXV0aG9yICAgICAgIChmaXJzdG5hbWUsIHN1cm5hbWUsIGpvYnRpdGxlPywgb3JnbmFtZT8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcz8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGF1dGhvcgotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgYWJzdHJhY3QgICAgIChwYXJhKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgYWJzdHJhY3QKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotPCFFTEVNRU5UICBpbnRyb2R1Y3Rpb24gICAgICAgICh0aXRsZSwgKCgoJXBhcmFsZXZlbDspKywgc2VjdDIqKSB8IHNlY3QyKykpID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgaW50cm9kdWN0aW9uCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLTwhRUxFTUVOVCAgcmVxdWlyZW1lbnRzICAgICAgICAodGl0bGUsICgoKCVwYXJhbGV2ZWw7KSssIHNlY3QyKikgfCBzZWN0MispKSA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHJlcXVpcmVtZW50cwotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyA+ICAgIAotCi08IUVMRU1FTlQgIG1vZGVsICAgICAgICAodGl0bGUsICgoKCVwYXJhbGV2ZWw7KSssIHBhdHRlcm5zKSB8IHNlY3QyKykpID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgbW9kZWwKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotPCFFTEVNRU5UICBwYXR0ZXJucyAgICAgICAgKHBhdHRlcm4rKSA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHBhdHRlcm5zCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7IAotCQkJbW9kdWxlICBDREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICAgICAgICA+IAotICAgICAgICAgICAgICAgICAgICAgICAgCi08IUVMRU1FTlQgIHBhdHRlcm4gICAgICAgIChwYXR0ZXJuLW5hbWUsIHBvdGVudGlhbC1hbHRlcm5hdGUtbmFtZT8sIGludGVudCwgcmVzcG9uc2liaWxpdGllcywgdGhyZWFkLXNhZmV0eSwgbm90ZXM/KSA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHBhdHRlcm4KLSAgICAgICAgICAgICVjb21tb24uYXR0czsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCFFTEVNRU5UICBwYXR0ZXJuLW5hbWUgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgcGF0dGVybi1uYW1lCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ID4KLSAgICAgICAgICAgIAotPCFFTEVNRU5UICBwb3RlbnRpYWwtYWx0ZXJuYXRlLW5hbWUgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgcG90ZW50aWFsLWFsdGVybmF0ZS1uYW1lCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ID4gIAotCi08IUVMRU1FTlQgIGludGVudCAgICAgICAgKCNQQ0RBVEEgfCAlcGhyYXNlbGV2ZWw7KSogPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBpbnRlbnQKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgPiAgCi0KLTwhRUxFTUVOVCAgcmVzcG9uc2liaWxpdGllcyAgICAgICAgKCNQQ0RBVEEgfCAlcGhyYXNlbGV2ZWw7KSogPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICByZXNwb25zaWJpbGl0aWVzCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ID4gIAotCi08IUVMRU1FTlQgIHRocmVhZC1zYWZldHkgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgdGhyZWFkLXNhZmV0eQotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyA+Ci0KLTwhRUxFTUVOVCAgbm90ZXMgICAgICAgICAoI1BDREFUQSB8ICVwaHJhc2VsZXZlbDspKiAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIG5vdGVzCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgc2VjdDEKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBzZWN0MSAgICAgICAgKHRpdGxlLCAoKCglcGFyYWxldmVsOykrLCBzZWN0MiopIHwgc2VjdDIrKSkgPgkJCQkJCSAgIAotPCEtLSAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBzZWN0MiAgICAgICAgKHRpdGxlLCAoKCglcGFyYWxldmVsOykrLCBzZWN0MyopIHwgc2VjdDMrKSkgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBzZWN0MgotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgc2VjdDMgICAgICAgICh0aXRsZSwgKCgoJXBhcmFsZXZlbDspKywgc2VjdDQqKSB8IHNlY3Q0KykpID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgc2VjdDMKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHNlY3Q0ICAgICAgICAodGl0bGUsICglcGFyYWxldmVsOykrKSAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHNlY3Q0Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBhcHBlbmRpeCAgICAgKHRpdGxlLCAoKCglcGFyYWxldmVsOykrLCBzZWN0MSopIHwgc2VjdDErKSkgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBhcHBlbmRpeAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGJpYmxpb2dyYXBoeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgYmlibGlvZ3JhcGh5ICh0aXRsZSwgYmlibGlvaXRlbSspICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgYmlibGlvZ3JhcGh5Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgYmlibGlvZ3JhcGh5IGl0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBiaWJsaW9pdGVtICAgKGRlc2lnbmF0b3IsIGJpYmxpb2VudHJ5KSAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBiaWJsaW9pdGVtCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgYmlibGlvZ3JhcGh5IGl0ZW0gZGVzaWduYXRvciAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgZGVzaWduYXRvciBjb250YWlucyB3aGF0ZXZlciBkZXNpZ25hdG9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yIHVzZXMgdG8gaWRlbnRpZnkgcHVibGljYXRpb25zIGxpc3RlZCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpYmxpb2dyYXBoeSAoZS5nLiwgW2xhYiA4N10pLiAgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXNoZWV0IGdlbmVyYXRlcyB0aGUgc3F1YXJlICJbXSIgYnJhY2tldHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmUgJiBhZnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgZGVzaWduYXRvciAgICgjUENEQVRBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgZGVzaWduYXRvcgotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGJpYmxpb2dyYXBoeSBlbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgYmlibGlvZW50cnkgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgYmlibGlvZW50cnkKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICBhdXRob3ItcmVsYXRlZCBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBmaXJzdG5hbWUgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBmaXJzdG5hbWUKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBzdXJuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHN1cm5hbWUgICAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHN1cm5hbWUKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBqb2IgdGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIGpvYnRpdGxlICAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGpvYnRpdGxlCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBvcmduYW1lICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBvcmduYW1lCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBhZGRyZXNzICAgICAgKHN0cmVldD8sIHBvYj8sIGNpdHk/LCBzdGF0ZT8sIHBvc3Rjb2RlPywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeT8sIHBob25lPywgZmF4PywgZW1haWw/KSAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGFkZHJlc3MKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgc3RyZWV0IGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBzdHJlZXQgICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBzdHJlZXQKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBwb3N0IG9mZmljZSBib3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHBvYiAgICAgICAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHBvYgotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIHBvc3Rjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgcG9zdGNvZGUgICAgICgjUENEQVRBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgcG9zdGNvZGUKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBjaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIGNpdHkgICAgICAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGNpdHkKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHN0YXRlICAgICAgICAoI1BDREFUQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHN0YXRlCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgY291bnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBjb3VudHJ5ICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBjb3VudHJ5Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgcGhvbmUgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBwaG9uZSAgICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBwaG9uZQotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGZheCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgZmF4ICAgICAgICAgICgjUENEQVRBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgZmF4Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgZW1haWwgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBlbWFpbCAgICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGlkICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFBVFRMSVNUICBlbWFpbAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaC1sZXZlbCBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHBhcmEgICAgICAgICAoI1BDREFUQSB8ICVwaHJhc2VsZXZlbDspKiAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHBhcmEKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBub3RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIG5vdGUgICAgICAgICAoJXBhcmFsZXZlbDspKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIG5vdGUKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBpdGVtaXplZCBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIGl0ZW1pemVkbGlzdCAobGlzdGl0ZW0rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGl0ZW1pemVkbGlzdAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIG9yZGVyZWQgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgb3JkZXJlZGxpc3QgIChsaXN0aXRlbSspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgb3JkZXJlZGxpc3QKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHZhcmlhYmxlbGlzdCAodmFybGlzdGVudHJ5KykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHZhcmlhYmxlbGlzdAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGxpc3QgaXRlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgbGlzdGl0ZW0gICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOyB8ICVwYXJhbGV2ZWw7KSogICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgbGlzdGl0ZW0KLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBsaXN0IGVudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHZhcmxpc3RlbnRyeSAodGVybSssIGxpc3RpdGVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHZhcmxpc3RlbnRyeQotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIHRlcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgdGVybSAgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgdGVybQotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi08IS0tICAgICAgICAgICAgICAgICAgICB0ZXJtcmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHRlcm1yZWYgICAgICAgICAoI1BDREFUQSB8ICVwaHJhc2VsZXZlbDspKiAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHRlcm1yZWYKLSAgICAgICAgICAgICVjb21tb24uYXR0czsJICAgPgotCi08IS0tICAgICAgICAgICAgICAgICAgICBsaXRlcmFsIGxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIGxpdGVyYWxsYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICB4bWw6c3BhY2UgIHdoaXRlc3BhY2UgaGFuZGxpbmcKLSAgICAgICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgbGl0ZXJhbGxheW91dAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIHByb2dyYW0gbGlzdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgcHJvZ3JhbWxpc3RpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICB4bWw6c3BhY2UgIHdoaXRlc3BhY2UgaGFuZGxpbmcKLSAgICAgICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgcHJvZ3JhbWxpc3RpbmcKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBmaWd1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIGZpZ3VyZSAgICAgICAodGl0bGUsIGdyYXBoaWMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGZpZ3VyZQotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgZ3JhcGhpYyAgICAgIEVNUFRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBhbGlnbiAgICAgIGFsaWdubWVudCBvZiBncmFwaGljIGltYWdlLiAgdmFsdWVzIGFyZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICBsZWZ0IGFsaWduZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgICAgICAgICByaWdodCBhbGlnbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciAgICAgICAgY2VudGVyZWQKLSAgICAgICAgICAgICBmaWxlcmVmICAgIHBhdGggdG8gZXh0ZXJuYWwgZmlsZQotICAgICAgICAgICAgIGFsdCAgICAgICAgYWx0ZXJuYXRlIHRleHQKLSAgICAgICAgICAgICBzcmNjcmVkaXQgIHNvdXJjZSBvZiBncmFwaGljCi0gICAgICAgICAgICAgd2lkdGggICAgICB3aWR0aCBvZiBhcmVhIGluIHdoaWNoIHRvIGZpdCBncmFwaGljCi0gICAgICAgICAgICAgZGVwdGggICAgICBkZXB0aCBvZiBhcmVhIGluIHdoaWNoIHRvIGZpdCBncmFwaGljCi0gICAgICAgICAgICAgc2NhbGUgICAgICBwZXJjZW50YWdlIHNjYWxpbmcgZmFjdG9yCi0gICAgICAgICAgICAgc2NhbGVmaXQgICBzY2FsZSB0byBmaXQgd2lkdGggYW5kL29yIGRlcHRoCi0gICAgICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGdyYXBoaWMKLSAgICAgICAgICAgICBhbGlnbiAgICAgIChsZWZ0IHxyaWdodCB8Y2VudGVyKSAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICAgICAgICVncmFwaGljLmF0dHM7Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGlubGluZSBncmFwaGljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgaW5saW5lZ3JhcGhpYwotICAgICAgICAgICAgICAgICAgICAgICAgRU1QVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGZpbGVyZWYgICAgcGF0aCB0byBleHRlcm5hbCBmaWxlCi0gICAgICAgICAgICAgYWx0ICAgICAgICBhbHRlcm5hdGUgdGV4dAotICAgICAgICAgICAgIHNyY2NyZWRpdCAgc291cmNlIG9mIGdyYXBoaWMKLSAgICAgICAgICAgICB3aWR0aCAgICAgIHdpZHRoIG9mIGFyZWEgaW4gd2hpY2ggdG8gZml0IGdyYXBoaWMKLSAgICAgICAgICAgICBkZXB0aCAgICAgIGRlcHRoIG9mIGFyZWEgaW4gd2hpY2ggdG8gZml0IGdyYXBoaWMKLSAgICAgICAgICAgICBzY2FsZSAgICAgIHBlcmNlbnRhZ2Ugc2NhbGluZyBmYWN0b3IKLSAgICAgICAgICAgICBzY2FsZWZpdCAgIHNjYWxlIHRvIGZpdCB3aWR0aCBhbmQvb3IgZGVwdGgKLSAgICAgICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgaW5saW5lZ3JhcGhpYwotICAgICAgICAgICAgJWdyYXBoaWMuYXR0czsKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgdGV4dC1sZXZlbCBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGJpYmxpb2dyYXBoaWMgY2l0YXRpb24gICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgIGEgPGNpdGF0aW9uPiBhcHBlYXJzIGluIHRoZSBib2R5IG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWNsZSwgYW5kIGl0IHJlZmVycyB0aHJvdWdoIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgImxpbmtlbmQiIGF0dHJpYnV0ZSB0byB0aGUgaWQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICByZWxldmFudCBiaWJsaW9ncmFwaHkgaXRlbS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIDxjaXRhdGlvbj4gcmVjZWl2ZXMgdGhlIHNhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRpbmcgYXMgdGhlIDxkZXNpZ25hdG9yPiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIDxiaWJsaW9pdGVtPiBiZWluZyByZWZlcmVuY2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUsIHdoZW4gZm9yIHRoZSBiaWJpdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICA8YmlibGlvaXRlbSBpZD0iYmliMSI+PGRlc2lnbmF0b3I+bGFiCi0gICAgICAgICAgICAgICAgICAgICAgICA4NzwvZGVzaWduYXRvcj4uLi48L2JpYmxpb2l0ZW0+IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgYXMgIltsYWIgODddIiwgdGhlIGJpYmxpb2dyYXBoaWMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNpdGF0aW9uIDxjaXRhdGlvbiBsaW5rZW5kPSJiaWIxIj5sYWIKLSAgICAgICAgICAgICAgICAgICAgICAgIDg3PC9jaXRhdGlvbj4gYWxzbyBmb3JtYXRzIGFzICJbbGFiIDg3XSIuICAtLT4KLTwhRUxFTUVOVCAgY2l0YXRpb24gICAgICgjUENEQVRBIHwgZW1waGFzaXMgfCBpbmxpbmVncmFwaGljIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHQgfCBzdXBlcnNjcmlwdCkqICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBsaW5rZW5kICAgIGlkIG9mIHJlZmVyZW5jZWQgYmlibGlvZ3JhcGh5IGVudHJ5Ci0gICAgICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGNpdGF0aW9uCi0gICAgICAgICAgICAgbGlua2VuZCAgICBJRFJFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KLTwhLS0gICAgICAgICAgICAgICAgICAgIGVtcGhhc2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgZW1waGFzaXMgICAgICgjUENEQVRBIHwgJXBocmFzZWxldmVsOykqICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgZW1waGFzaXMKLSAgICAgICAgICAgICVjb21tb24uYXR0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLQotCi08IS0tICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHN1YnNjcmlwdCAgICAoI1BDREFUQSB8IGVtcGhhc2lzIHwgc3Vic2NyaXB0IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcnNjcmlwdCkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICBpZCAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhQVRUTElTVCAgc3Vic2NyaXB0Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgc3VwZXJzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBzdXBlcnNjcmlwdCAgKCNQQ0RBVEEgfCBlbXBoYXNpcyB8IHN1YnNjcmlwdCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJzY3JpcHQpKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IS0tICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHN1cGVyc2NyaXB0Ci0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLQotPCEtLSAgICAgICAgICAgICAgICAgICAgbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCFFTEVNRU5UICBsaW5rICAgICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotPCEtLSAgICAgICAgIGxpbmtlbmQgICAgaWQgb2YgcmVmZXJlbmNlZCBlbGVtZW50Ci0gICAgICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIGxpbmsKLSAgICAgICAgICAgICBsaW5rZW5kICAgIElEUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLTwhLS0gIHBhY2thZ2UgbGluayAoZm9yIHtAbGluayBvcmcueG1sLnRyYXguUHJvY2Vzc29yfSB0eXBlIGxpbmtzLCBmb3IgamF2YWRvY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUVMRU1FTlQgIHBsaW5rICAgICAgICAgKCNQQ0RBVEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci08IUFUVExJU1QgIHBsaW5rCi0gICAgICAgICAgICAlY29tbW9uLmF0dHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ci0KLTwhLS0gICAgICAgICAgICAgICAgICAgIHVsaW5rIChleHRlcm5hbCBsaW5rKSAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhRUxFTUVOVCAgdWxpbmsgICAgICAgICgjUENEQVRBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KLTwhLS0gICAgICAgICB1cmwgICAgICAgIHVuaWZvcm0gcmVzb3VyY2UgbG9jYXRvcjsgdGhlIHRhcmdldCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVsaW5rCi0gICAgICAgICAgICAgaWQgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IUFUVExJU1QgIHVsaW5rCi0gICAgICAgICAgICAgdXJsICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgICAgICAgJWNvbW1vbi5hdHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotCi0KZGlmZiAtLWdpdCBhL3hkb2NzL3N0eWxlL2R0ZC94c2wtaHRtbDQwcy5kdGQgYi94ZG9jcy9zdHlsZS9kdGQveHNsLWh0bWw0MHMuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODg0OGJkLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3N0eWxlL2R0ZC94c2wtaHRtbDQwcy5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwxNTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0gCi0gICAgIFhTTFQgKFdELTE5OTkwODEzKSBEVEQgYW5kIEhUTUwgNC4wIFN0cmljdCAoUkVDLUhUTUw0MC0xOTk4MDQyNCkgRFRECi0gICAgIFRoaXMgRFREIGRlZmluZXMgYSBYU0xUIHN0eWxlc2hlZXQgd2l0aCBhIHJlc3VsdC1ucyBvZiBodG1sCi0KLSAgICAgQ3JlZGl0czoKLSAgICAgICBPcmlnaW5hbCBYU0xUIERURCBmcm9tIFczQyBYU0xUIFdELTE5OTkwODEzCi0gICAgICAgT3JpZ2luYWwgWE1MICBEVEQgZm9yIEhUTUwgNC4wIFN0cmljdCBieQotICAgICAgICAgVEFNVVJBLCBLZW50IDxrZW50QHRybC5pYm0uY28uanA+LCBmb3IgSUJNJ3MgWE1MNEogcGFja2FnZQotICAgICAgIE1pbm9yIGZpeGVzIHRvIFhTTFQgJiBIVE1MIERURHMgYnkgCi0gICAgICAgICBTY290dCBCb2FnIDxzY290dF9ib2FnQGxvdHVzLmNvbT4KLSAgICAgICAgIEhlbnJpcXVlIE0uIEhvbHNjaHVoIDxoZW5yaXFtaEBkY2EuZmVlLnVuaWNhbXAuYnI+Ci0gICAgICAgSFRNTC9YU0xUIGNvbXBvc2l0ZSBEVEQgYnkKLSAgICAgICAgIEhlbnJpcXVlIE0uIEhvbHNjaHVoIDxoZW5yaXFtaEBkY2EuZmVlLnVuaWNhbXAuYnI+Ci0KLSAgICAgQ2F2ZWF0czogSXQgaXMgcG9zc2libGUgdG8gZ2VuZXJhdGUgaW52YWxpZCBYU0xUIGFuZCBIVE1MIGRvY3VtZW50cyAKLSAgICAgICB1c2luZyB0aGlzIERURCwgYXMgdGhlIHJlc3VsdC1ucyBlbGVtZW50cyAoSFRNTCkgbXVzdCBhbGxvdyBhbGwgCi0gICAgICAgcG9zc2libGUgeHNsIGVsZW1lbnRzIGFzIGNvbnRlbnQsIGFuZCBhbGwgcmVzdWx0LW5zIGVsZW1lbnRzIGhhZCAKLSAgICAgICB0byBiZSByZWxheGVkIG9uIHRoZWlyIGVsZW1lbnQgY29udGVudCBydWxlcy4KLQotICAgICBUT0RPOgotICAgICAgIC0gQSBYU0xUL1hIVE1MMS4wIFN0cmljdCBEVEQgdG8gdXNlIGluc3RlYWQgb2YgdGhpcyBvbmUuIExvd2VyY2FzZQotICAgICAgICAgZWxlbWVudCBuYW1lcyBhbGxvdyBmb3IgYmV0dGVyIGNvbXByZXNzaW9uIHJhdGlvcywgYXQgbGVhc3QgaW4KLSAgICAgICAgIEVuZ2xpc2ggZG9jdW1lbnRzLgotICAgICAgIC0gVXBkYXRlIHRvIEhUTUwgNC4wMQotCi0gICAgICRJZCQKLS0tPgotCi08IS0tIFByZWRlZmluZWQgWE1MIChSRUMtWE1MLTE5OTgwMjEwKSBlbnRpdGllcyAtLT4KLTwhRU5USVRZIGx0ICAgICAiJiMzODsjNjA7Ij4KLTwhRU5USVRZIGd0ICAgICAiJiM2MjsiPgotPCFFTlRJVFkgYW1wICAgICImIzM4OyMzODsiPgotPCFFTlRJVFkgYXBvcyAgICImIzM5OyI+Ci08IUVOVElUWSBxdW90ICAgIiYjMzQ7Ij4KLQotPCEtLSAKLSAgUmVzdWx0IGVsZW1lbnRzIGFsbG93ZWQgKGluc2lkZSB4c2wgZWxlbWVudHMpLiBUaGVzZSBhcmUgYWN0dWFsbHkKLSAgYWxsIG9mIHRoZSBIVE1MNDAgU3RyaWN0IGVsZW1lbnRzLiAKLS0tPgotCi08IUVOVElUWSAlIHJlc3VsdC1lbGVtZW50cyAiCi0gIHwgVFQKLSAgfCBJCi0gIHwgQgotICB8IEJJRwotICB8IFNNQUxMCi0gIHwgRU0KLSAgfCBTVFJPTkcKLSAgfCBERk4KLSAgfCBDT0RFCi0gIHwgU0FNUAotICB8IEtCRAotICB8IFZBUgotICB8IENJVEUKLSAgfCBBQkJSCi0gIHwgQUNST05ZTQotICB8IFNVUAotICB8IFNVQgotICB8IFNQQU4KLSAgfCBCRE8KLSAgfCBCUgotICB8IEJPRFkKLSAgfCBBRERSRVNTCi0gIHwgRElWCi0gIHwgQQotICB8IE1BUAotICB8IEFSRUEKLSAgfCBMSU5LCi0gIHwgSU1HCi0gIHwgT0JKRUNUCi0gIHwgUEFSQU0KLSAgfCBIUgotICB8IFAKLSAgfCBIMQotICB8IEgyCi0gIHwgSDMKLSAgfCBINAotICB8IEg1Ci0gIHwgSDYKLSAgfCBQUkUKLSAgfCBRCi0gIHwgQkxPQ0tRVU9URQotICB8IElOUwotICB8IERFTAotICB8IERMCi0gIHwgRFQKLSAgfCBERAotICB8IE9MCi0gIHwgVUwKLSAgfCBMSQotICB8IEZPUk0KLSAgfCBMQUJFTAotICB8IElOUFVUCi0gIHwgU0VMRUNUCi0gIHwgT1BUR1JPVVAKLSAgfCBPUFRJT04KLSAgfCBURVhUQVJFQQotICB8IEZJRUxEU0VUCi0gIHwgTEVHRU5ECi0gIHwgQlVUVE9OCi0gIHwgVEFCTEUKLSAgfCBDQVBUSU9OCi0gIHwgVEhFQUQKLSAgfCBURk9PVAotICB8IFRCT0RZCi0gIHwgQ09MR1JPVVAKLSAgfCBDT0wKLSAgfCBUUgotICB8IFRICi0gIHwgVEQKLSAgfCBIRUFECi0gIHwgVElUTEUKLSAgfCBCQVNFCi0gIHwgTUVUQQotICB8IFNUWUxFCi0gIHwgU0NSSVBUCi0gIHwgTk9TQ1JJUFQKLSAgfCBIVE1MCi0iPgotCi08IS0tIGJlZ2luIFhTTFQgRFRELCBwYXRjaGVkIC0tPgotCi08IUVOVElUWSAlIGNoYXItaW5zdHJ1Y3Rpb25zICIKLSB8IHhzbDphcHBseS10ZW1wbGF0ZXMKLSB8IHhzbDpjYWxsLXRlbXBsYXRlCi0gfCB4c2w6YXBwbHktaW1wb3J0cwotIHwgeHNsOmZvci1lYWNoCi0gfCB4c2w6dmFsdWUtb2YKLSB8IHhzbDpjb3B5LW9mCi0gfCB4c2w6bnVtYmVyCi0gfCB4c2w6Y2hvb3NlCi0gfCB4c2w6aWYKLSB8IHhzbDp0ZXh0Ci0gfCB4c2w6Y29weQotIHwgeHNsOnZhcmlhYmxlCi0gfCB4c2w6bWVzc2FnZQotIj4KLQotPCFFTlRJVFkgJSBpbnN0cnVjdGlvbnMgIgotICVjaGFyLWluc3RydWN0aW9uczsKLSB8IHhzbDpwcm9jZXNzaW5nLWluc3RydWN0aW9uCi0gfCB4c2w6Y29tbWVudAotIHwgeHNsOmVsZW1lbnQKLSB8IHhzbDphdHRyaWJ1dGUKLSI+Ci0KLTwhRU5USVRZICUgY2hhci10ZW1wbGF0ZSAiCi0oI1BDREFUQQotICVjaGFyLWluc3RydWN0aW9uczspKgotIj4KLQotPCFFTlRJVFkgJSB0ZW1wbGF0ZSAiCi0oI1BDREFUQQotICVpbnN0cnVjdGlvbnM7Ci0gJXJlc3VsdC1lbGVtZW50czspKgotIj4KLQotPCEtLSBVc2VkIGZvciB0aGUgdHlwZSBvZiBhbiBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBpcyBhIFVSSSByZWZlcmVuY2UuLS0+Ci08IUVOVElUWSAlIFVSSSAiQ0RBVEEiPgotCi08IS0tIFVzZWQgZm9yIHRoZSB0eXBlIG9mIGFuIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIGEgcGF0dGVybi4tLT4KLTwhRU5USVRZICUgcGF0dGVybiAiQ0RBVEEiPgotCi08IS0tIFVzZWQgZm9yIHRoZSB0eXBlIG9mIGFuIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIGFuCi0gICAgYXR0cmlidXRlIHZhbHVlIHRlbXBsYXRlLi0tPgotPCFFTlRJVFkgJSBhdnQgIkNEQVRBIj4KLQotPCEtLSBVc2VkIGZvciB0aGUgdHlwZSBvZiBhbiBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBpcyBhIFFOYW1lOyB0aGUgcHJlZml4Ci0gICAgZ2V0cyBleHBhbmRlZCBieSB0aGUgWFNMVCBwcm9jZXNzb3IuIC0tPgotPCFFTlRJVFkgJSBxbmFtZSAiTk1UT0tFTiI+Ci0KLTwhLS0gTGlrZSBxbmFtZSBidXQgYSB3aGl0ZXNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFFOYW1lcy4gLS0+Ci08IUVOVElUWSAlIHFuYW1lcyAiTk1UT0tFTlMiPgotCi08IS0tIFVzZWQgZm9yIHRoZSB0eXBlIG9mIGFuIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIGFuIGV4cHJlc3Npb24uLS0+Ci08IUVOVElUWSAlIGV4cHIgIkNEQVRBIj4KLQotPCEtLSBVc2VkIGZvciB0aGUgdHlwZSBvZiBhbiBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBjb25zaXN0cwotICAgIG9mIGEgc2luZ2xlIGNoYXJhY3Rlci4tLT4KLTwhRU5USVRZICUgY2hhciAiQ0RBVEEiPgotCi08IS0tIFVzZWQgZm9yIHRoZSB0eXBlIG9mIGFuIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIGEgcHJpb3JpdHkuIC0tPgotPCFFTlRJVFkgJSBwcmlvcml0eSAiTk1UT0tFTiI+Ci0KLTwhRU5USVRZICUgc3BhY2UtYXR0ICJ4bWw6c3BhY2UgKGRlZmF1bHR8cHJlc2VydmUpICNJTVBMSUVEIj4KLQotPCEtLSBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSB0aGUgc2V0IG9mIGVsZW1lbnRzIGFsbG93ZWQKLWF0IHRoZSB0b3AtbGV2ZWwuIC0tPgotCi08IUVOVElUWSAlIG5vbi14c2wtdG9wLWxldmVsICIiPgotCi08IUVOVElUWSAlIHRvcC1sZXZlbCAiCi0oeHNsOmltcG9ydCosCi0gKHhzbDppbmNsdWRlCi0gfCB4c2w6c3RyaXAtc3BhY2UKLSB8IHhzbDpwcmVzZXJ2ZS1zcGFjZQotIHwgeHNsOm91dHB1dAotIHwgeHNsOmtleQotIHwgeHNsOmxvY2FsZQotIHwgeHNsOmF0dHJpYnV0ZS1zZXQKLSB8IHhzbDp2YXJpYWJsZQotIHwgeHNsOnBhcmFtCi0gfCB4c2w6dGVtcGxhdGUKLSAlbm9uLXhzbC10b3AtbGV2ZWw7KSopCi0iPgotCi08IS0tIGFkZGVkIHhtbG5zIGF0dHJpYnV0ZSBzdWl0YWJsZSBmb3IgdGhpcyBEVEQgLS0+Ci08IUVOVElUWSAlIHRvcC1sZXZlbC1hdHRzICcKLSBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcyBDREFUQSAjSU1QTElFRAotIGlkIElEICNJTVBMSUVECi0geG1sbnM6eHNsIENEQVRBICNGSVhFRCAiaHR0cDovL3d3dy53My5vcmcvWFNMLzE5OTkvVHJhbnNmb3JtIgotIHhtbG5zIENEQVRBICNGSVhFRCAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCIKLSAlc3BhY2UtYXR0OwotJz4KLQotPCEtLSBUaGlzIGVudGl0eSBpcyBkZWZpbmVkIGZvciB1c2UgaW4gdGhlIEFUVExJU1QgZGVjbGFyYXRpb24KLWZvciByZXN1bHQgZWxlbWVudHMuIC0tPgotCi08IUVOVElUWSAlIHJlc3VsdC1lbGVtZW50LWF0dHMgJwotIHhzbDpleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcyBDREFUQSAjSU1QTElFRAotIHhzbDp1c2UtYXR0cmlidXRlLXNldHMgJXFuYW1lczsgI0lNUExJRUQKLSc+Ci0KLTwhRUxFTUVOVCB4c2w6c3R5bGVzaGVldCAldG9wLWxldmVsOz4KLTwhQVRUTElTVCB4c2w6c3R5bGVzaGVldCAldG9wLWxldmVsLWF0dHM7PgotCi08IUVMRU1FTlQgeHNsOnRyYW5zZm9ybSAldG9wLWxldmVsOz4KLTwhQVRUTElTVCB4c2w6dHJhbnNmb3JtICV0b3AtbGV2ZWwtYXR0czs+Ci0KLTwhRUxFTUVOVCB4c2w6aW1wb3J0IEVNUFRZPgotPCFBVFRMSVNUIHhzbDppbXBvcnQgaHJlZiAlVVJJOyAjUkVRVUlSRUQ+Ci0KLTwhRUxFTUVOVCB4c2w6aW5jbHVkZSBFTVBUWT4KLTwhQVRUTElTVCB4c2w6aW5jbHVkZSBocmVmICVVUkk7ICNSRVFVSVJFRD4KLQotPCFFTEVNRU5UIHhzbDpzdHJpcC1zcGFjZSBFTVBUWT4KLTwhQVRUTElTVCB4c2w6c3RyaXAtc3BhY2UgZWxlbWVudHMgQ0RBVEEgI1JFUVVJUkVEPgotCi08IUVMRU1FTlQgeHNsOnByZXNlcnZlLXNwYWNlIEVNUFRZPgotPCFBVFRMSVNUIHhzbDpwcmVzZXJ2ZS1zcGFjZSBlbGVtZW50cyBDREFUQSAjUkVRVUlSRUQ+Ci0KLTwhRUxFTUVOVCB4c2w6b3V0cHV0IEVNUFRZPgotPCFBVFRMSVNUIHhzbDpvdXRwdXQKLSBtZXRob2QgJXFuYW1lOyAjSU1QTElFRAotIHZlcnNpb24gTk1UT0tFTiAjSU1QTElFRAotIGVuY29kaW5nIE5NVE9LRU4gI0lNUExJRUQKLSB4bWwtZGVjbGFyYXRpb24gKHllc3xubykgI0lNUExJRUQKLSBzdGFuZGFsb25lICh5ZXN8bm8pICNJTVBMSUVECi0gZG9jdHlwZS1wdWJsaWMgQ0RBVEEgI0lNUExJRUQKLSBkb2N0eXBlLXN5c3RlbSBDREFUQSAjSU1QTElFRAotIGNkYXRhLXNlY3Rpb24tZWxlbWVudHMgJXFuYW1lczsgI0lNUExJRUQKLSBpbmRlbnQgKHllc3xubykgI0lNUExJRUQKLSBtZWRpYS10eXBlIENEQVRBICNJTVBMSUVECi0+Ci0KLTwhRUxFTUVOVCB4c2w6a2V5IEVNUFRZPgotPCFBVFRMSVNUIHhzbDprZXkKLSBuYW1lICVxbmFtZTsgI1JFUVVJUkVECi0gbWF0Y2ggJXBhdHRlcm47ICNSRVFVSVJFRAotIHVzZSAlZXhwcjsgI1JFUVVJUkVECi0+Ci0KLTwhRUxFTUVOVCB4c2w6bG9jYWxlIEVNUFRZPgotPCFBVFRMSVNUIHhzbDpsb2NhbGUKLSBuYW1lICVxbmFtZTsgI0lNUExJRUQKLSBkZWNpbWFsLXNlcGFyYXRvciAlY2hhcjsgIi4iCi0gZ3JvdXBpbmctc2VwYXJhdG9yICVjaGFyOyAiLCIKLSBpbmZpbml0eSBDREFUQSAiJiN4MjIxRTsiCi0gbWludXMtc2lnbiAlY2hhcjsgIi0iCi0gTmFOIENEQVRBICImI3hGRkZEOyIKLSBwZXJjZW50ICVjaGFyOyAiJSIKLSBwZXItbWlsbGUgJWNoYXI7ICImI3gyMDMwOyIKLSB6ZXJvLWRpZ2l0ICVjaGFyOyAiMCIKLSBkaWdpdCAlY2hhcjsgIiMiCi0gcGF0dGVybi1zZXBhcmF0b3IgJWNoYXI7ICI7IgotPgotCi08IUVMRU1FTlQgeHNsOnRlbXBsYXRlCi0oI1BDREFUQQotICVpbnN0cnVjdGlvbnM7Ci0gJXJlc3VsdC1lbGVtZW50czsKLSB8IHhzbDpwYXJhbSkqCi0+Ci0KLTwhQVRUTElTVCB4c2w6dGVtcGxhdGUKLSBtYXRjaCAlcGF0dGVybjsgI0lNUExJRUQKLSBuYW1lICVxbmFtZTsgI0lNUExJRUQKLSBwcmlvcml0eSAlcHJpb3JpdHk7ICNJTVBMSUVECi0gbW9kZSAlcW5hbWU7ICNJTVBMSUVECi0gJXNwYWNlLWF0dDsKLT4KLQotPCFFTEVNRU5UIHhzbDp2YWx1ZS1vZiBFTVBUWT4KLTwhQVRUTElTVCB4c2w6dmFsdWUtb2YKLSBzZWxlY3QgJWV4cHI7ICNSRVFVSVJFRAotIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nICh5ZXN8bm8pICJubyIKLT4KLQotPCFFTEVNRU5UIHhzbDpjb3B5LW9mIEVNUFRZPgotPCFBVFRMSVNUIHhzbDpjb3B5LW9mIHNlbGVjdCAlZXhwcjsgI1JFUVVJUkVEPgotCi08IUVMRU1FTlQgeHNsOm51bWJlciBFTVBUWT4KLTwhQVRUTElTVCB4c2w6bnVtYmVyCi0gIGxldmVsIChzaW5nbGV8bXVsdGlwbGV8YW55KSAic2luZ2xlIgotICBjb3VudCAlcGF0dGVybjsgI0lNUExJRUQKLSAgZnJvbSAlcGF0dGVybjsgI0lNUExJRUQKLSAgdmFsdWUgJWV4cHI7ICNJTVBMSUVECi0gIGZvcm1hdCAlYXZ0OyAnMScKLSAgbGFuZyAlYXZ0OyAjSU1QTElFRAotICBsZXR0ZXItdmFsdWUgJWF2dDsgI0lNUExJRUQKLSAgZ3JvdXBpbmctc2VwYXJhdG9yJWF2dDsgI0lNUExJRUQKLSAgZ3JvdXBpbmctc2l6ZSAlYXZ0OyAjSU1QTElFRAotPgotCi08IUVMRU1FTlQgeHNsOmFwcGx5LXRlbXBsYXRlcyAoeHNsOnNvcnR8eHNsOndpdGgtcGFyYW0pKj4KLTwhQVRUTElTVCB4c2w6YXBwbHktdGVtcGxhdGVzCi0gc2VsZWN0ICVleHByOyAibm9kZSgpIgotIG1vZGUgJXFuYW1lOyAjSU1QTElFRAotPgotCi08IUVMRU1FTlQgeHNsOmFwcGx5LWltcG9ydHMgRU1QVFk+Ci0KLTwhLS0geHNsOnNvcnQgY2Fubm90IG9jY3VyIGFmdGVyIGFueSBvdGhlciBlbGVtZW50cyBvcgotYW55IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciAtLT4KLQotPCFFTEVNRU5UIHhzbDpmb3ItZWFjaAotKCNQQ0RBVEEKLSAlaW5zdHJ1Y3Rpb25zOwotICVyZXN1bHQtZWxlbWVudHM7Ci0gfCB4c2w6c29ydCkqCi0+Ci0KLTwhQVRUTElTVCB4c2w6Zm9yLWVhY2gKLSBzZWxlY3QgJWV4cHI7ICNSRVFVSVJFRAotICVzcGFjZS1hdHQ7Ci0+Ci0KLTwhRUxFTUVOVCB4c2w6c29ydCBFTVBUWT4KLTwhQVRUTElTVCB4c2w6c29ydAotIHNlbGVjdCAlZXhwcjsgIi4iCi0gbGFuZyAlYXZ0OyAjSU1QTElFRAotIGRhdGEtdHlwZSAlYXZ0OyAidGV4dCIKLSBvcmRlciAlYXZ0OyAiYXNjZW5kaW5nIgotIGNhc2Utb3JkZXIgJWF2dDsgI0lNUExJRUQKLT4KLQotPCFFTEVNRU5UIHhzbDppZiAldGVtcGxhdGU7PgotPCFBVFRMSVNUIHhzbDppZgotIHRlc3QgJWV4cHI7ICNSRVFVSVJFRAotICVzcGFjZS1hdHQ7Ci0+Ci0KLTwhRUxFTUVOVCB4c2w6Y2hvb3NlICh4c2w6d2hlbissIHhzbDpvdGhlcndpc2U/KT4KLTwhQVRUTElTVCB4c2w6Y2hvb3NlICVzcGFjZS1hdHQ7PgotCi08IUVMRU1FTlQgeHNsOndoZW4gJXRlbXBsYXRlOz4KLTwhQVRUTElTVCB4c2w6d2hlbgotIHRlc3QgJWV4cHI7ICNSRVFVSVJFRAotICVzcGFjZS1hdHQ7Ci0+Ci0KLTwhRUxFTUVOVCB4c2w6b3RoZXJ3aXNlICV0ZW1wbGF0ZTs+Ci08IUFUVExJU1QgeHNsOm90aGVyd2lzZSAlc3BhY2UtYXR0Oz4KLQotPCFFTEVNRU5UIHhzbDphdHRyaWJ1dGUtc2V0ICh4c2w6YXR0cmlidXRlKSo+Ci08IUFUVExJU1QgeHNsOmF0dHJpYnV0ZS1zZXQKLSBuYW1lICVxbmFtZTsgI1JFUVVJUkVECi0gdXNlLWF0dHJpYnV0ZS1zZXRzICVxbmFtZXM7ICNJTVBMSUVECi0+Ci0KLTwhRUxFTUVOVCB4c2w6Y2FsbC10ZW1wbGF0ZSAoeHNsOndpdGgtcGFyYW0pKj4KLTwhQVRUTElTVCB4c2w6Y2FsbC10ZW1wbGF0ZQotIG5hbWUgJXFuYW1lOyAjUkVRVUlSRUQKLT4KLQotPCFFTEVNRU5UIHhzbDp3aXRoLXBhcmFtICV0ZW1wbGF0ZTs+Ci08IUFUVExJU1QgeHNsOndpdGgtcGFyYW0KLSBuYW1lICVxbmFtZTsgI1JFUVVJUkVECi0gc2VsZWN0ICVleHByOyAjSU1QTElFRAotPgotCi08IUVMRU1FTlQgeHNsOnZhcmlhYmxlICV0ZW1wbGF0ZTs+Ci08IUFUVExJU1QgeHNsOnZhcmlhYmxlIAotIG5hbWUgJXFuYW1lOyAjUkVRVUlSRUQKLSBzZWxlY3QgJWV4cHI7ICNJTVBMSUVECi0+Ci0KLTwhRUxFTUVOVCB4c2w6cGFyYW0gJXRlbXBsYXRlOz4KLTwhQVRUTElTVCB4c2w6cGFyYW0gCi0gbmFtZSAlcW5hbWU7ICNSRVFVSVJFRAotIHNlbGVjdCAlZXhwcjsgI0lNUExJRUQKLT4KLQotPCFFTEVNRU5UIHhzbDp0ZXh0ICgjUENEQVRBKT4KLTwhQVRUTElTVCB4c2w6dGV4dAotIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nICh5ZXN8bm8pICJubyIKLT4KLQotPCFFTEVNRU5UIHhzbDpwcm9jZXNzaW5nLWluc3RydWN0aW9uICVjaGFyLXRlbXBsYXRlOz4KLTwhQVRUTElTVCB4c2w6cHJvY2Vzc2luZy1pbnN0cnVjdGlvbiAKLSBuYW1lICVhdnQ7ICNSRVFVSVJFRAotICVzcGFjZS1hdHQ7Ci0+Ci0KLTwhRUxFTUVOVCB4c2w6ZWxlbWVudCAldGVtcGxhdGU7PgotPCFBVFRMSVNUIHhzbDplbGVtZW50IAotIG5hbWUgJWF2dDsgI1JFUVVJUkVECi0gbmFtZXNwYWNlICVhdnQ7ICNJTVBMSUVECi0gdXNlLWF0dHJpYnV0ZS1zZXRzICVxbmFtZXM7ICNJTVBMSUVECi0gJXNwYWNlLWF0dDsKLT4KLQotPCFFTEVNRU5UIHhzbDphdHRyaWJ1dGUgJWNoYXItdGVtcGxhdGU7PgotPCFBVFRMSVNUIHhzbDphdHRyaWJ1dGUgCi0gbmFtZSAlYXZ0OyAjUkVRVUlSRUQKLSBuYW1lc3BhY2UgJWF2dDsgI0lNUExJRUQKLSAlc3BhY2UtYXR0OwotPgotCi08IUVMRU1FTlQgeHNsOmNvbW1lbnQgJWNoYXItdGVtcGxhdGU7PgotPCFBVFRMSVNUIHhzbDpjb21tZW50ICVzcGFjZS1hdHQ7PgotCi08IUVMRU1FTlQgeHNsOmNvcHkgJXRlbXBsYXRlOz4KLTwhQVRUTElTVCB4c2w6Y29weQotICVzcGFjZS1hdHQ7Ci0gdXNlLWF0dHJpYnV0ZS1zZXRzICVxbmFtZXM7ICNJTVBMSUVECi0+Ci0KLTwhRUxFTUVOVCB4c2w6bWVzc2FnZSAldGVtcGxhdGU7PgotPCFBVFRMSVNUIHhzbDptZXNzYWdlICVzcGFjZS1hdHQ7PgotCi08IUVMRU1FTlQgeHNsOmZhbGxiYWNrICV0ZW1wbGF0ZTs+Ci08IUFUVExJU1QgeHNsOmZhbGxiYWNrICVzcGFjZS1hdHQ7PgotCi0KLQotPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci08IS0tICAgSFRNTCA0LjAgU3RyaWN0IERURCAgIChyZXZpc2VkIHRvIGFsbG93IGZvciB4c2wgY29udGVudCkgICAgICAgICAgICAgICAtLT4KLTwhLS0gICBPcmlnaW5hbCBEVEQgZnJvbSBYTUw0SiBwYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgIE9yaWdpbmFsIFNHTUwgdG8gWE1MIGNvbnZlcnNpb24gYnkgVEFNVVJBLCBLZW50IGZvciBJQk0ncyBYTUw0SiAgICAgICAgLS0+Ci0KLTwhLS0gCi0gICAgIENvbnRhaW5lciBmb3IgYWxsIHhzbCBlbGVtZW50cyBhbGxvd2VkIGluc2lkZSByZXN1bHQtZWxlbWVudHMgZWxlbWVudHMsCi0gICAgIGkuZS46IGFsbCB4c2wgZWxlbWVudHMgd2hpY2ggYXJlIHZhbGlkIHdoZXJlIGEgcmVzdWx0LWVsZW1lbnQgaXMgdmFsaWQsCi0gICAgIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSB2YWxpZCBpbnNpZGUgQUxMIG5vbi1lbXB0eSBIVE1MIGVsZW1lbnRzLgotCi0gICAgIFlvdSdsbCBub3RpY2UgdGhpcyBkb2VzIGFsbG93IHRoZSB1c2VyIHRvIGNyZWF0ZSBpbnZhbGlkIFhTTCBkb2N1bWVudHMuCi0KLSAgeHNsOnNvcnQsIHhzbDpwYXJhbSwgeHNsOnBhcmFtLXZhcmlhYmxlIHdlcmUgbm90IGlubHVkZWQgYmVjYXVzZQotICBJTUhPIGl0IGlzIGJhZCBwcmFjdGljZSAoYW5kIGFuIGVycm9yPykgbm90IHRvIGluY2x1ZGUgdGhlbSBiZWZvcmUgCi0gIG90aGVyIHNpYmxpbmdzLCBlc3BlY2lhbGx5IHJlc3VsdC1ucyBvbmVzLgotLS0+Ci0KLTwhLS0gV2hpbGUgdGhlIGNvbnRlbnQgc2hvdWxkIGJlIHNpbXBseSAlaW5zdHJ1Y3Rpb25zOyB3ZSBjYW5ub3QgZG8gdGhhdAotICAgICBkdWUgdG8gdGhlIGZpcnN0ICd8JyBpbiAlaW5zdHJ1Y3Rpb25zIC0tPgotPCFFTlRJVFkgJSB4c2wtdmFsaWQtaW4tcmVzdWx0bnMgIgotICB4c2w6cHJvY2Vzc2luZy1pbnN0cnVjdGlvbgotICB8IHhzbDpjb21tZW50Ci0gIHwgeHNsOmVsZW1lbnQKLSAgfCB4c2w6YXR0cmlidXRlCi0gICVjaGFyLWluc3RydWN0aW9uczsKLSI+Ci0KLTwhLS0gQWxzbywgJXJlc3VsdC1lbGVtZW50LWF0dHM7IHdhcyBhZGRlZCB0byB0aGUgQVRUTElTVCBvZiBhbGwgaHRtbAotICAgICBlbG1lbnRzIC0tPgotCi08IS0tIFJldmlzaW9uOiAyMyAxLjMgZG9jcy9kYXRhL0hUTUw0MHN0cmljdC54bWwuZHRkLCB4bWw0amRvY3MsIHhtbDRqLWp0Y3N2LCB4bWw0al8xXzFfOSAgLS0+Ci0KLTwhLS0KLSAgICBUaGlzIGlzIEhUTUwgNC4wIFN0cmljdCBEVEQsIHdoaWNoIGV4Y2x1ZGVzIHRoZSBwcmVzZW50YXRpb24gCi0gICAgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgdGhhdCBXM0MgZXhwZWN0cyB0byBwaGFzZSBvdXQgYXMgCi0gICAgc3VwcG9ydCBmb3Igc3R5bGUgc2hlZXRzIG1hdHVyZXMuIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0Ci0gICAgRFREIHdoZW4gcG9zc2libGUsIGJ1dCBtYXkgdXNlIHRoZSBUcmFuc2l0aW9uYWwgRFREIHdoZW4gc3VwcG9ydAotICAgIGZvciBwcmVzZW50YXRpb24gYXR0cmlidXRlIGFuZCBlbGVtZW50cyBpcyByZXF1aXJlZC4KLSAgICAKLSAgICBIVE1MIDQuMCBpbmNsdWRlcyBtZWNoYW5pc21zIGZvciBzdHlsZSBzaGVldHMsIHNjcmlwdGluZywKLSAgICBlbWJlZGRpbmcgb2JqZWN0cywgaW1wcm92ZWQgc3VwcG9ydCBmb3IgcmlnaHQgdG8gbGVmdCBhbmQgbWl4ZWQKLSAgICBkaXJlY3Rpb24gdGV4dCwgYW5kIGVuaGFuY2VtZW50cyB0byBmb3JtcyBmb3IgaW1wcm92ZWQKLSAgICBhY2Nlc3NpYmlsaXR5IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMuCi0KLSAgICAgICAgICBEcmFmdDogRGF0ZTogMTk5OC8wNy8wNiAxNzo1MDozMgotCi0gICAgICAgICAgQXV0aG9yczoKLSAgICAgICAgICAgICAgRGF2ZSBSYWdnZXR0IDxkc3JAdzMub3JnPgotICAgICAgICAgICAgICBBcm5hdWQgTGUgSG9ycyA8bGVob3JzQHczLm9yZz4KLSAgICAgICAgICAgICAgSWFuIEphY29icyA8aWpAdzMub3JnPgotCi0gICAgRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBIVE1MIDQuMCBpcyBhdmFpbGFibGUgYXQ6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MAotLS0+Ci0KLTwhLS0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgTW9kaWZpZWQgZm9yIFhNTCAxLjAgYnk6Ci0JIlRBTVVSQSwgS2VudCIgPGtlbnRAdHJsLmlibS5jby5qcD4KLQotICAgIG8gSFRNTHNwZWNpYWwsIEhUTUxzeW1ib2wsIEhUTUxsYXQxIGFyZW4ndCBpbmNsdWRlZCBpbiB0aGlzIERURC4KLSAgICBvIFRoZSBgbGFuZycgYXR0cmlidXRlIHdhcyByZW5hbWVkIHRvIGB4bWw6bGFuZycuCi0KLQotICAgIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIuLi4iPz4KLSAgICA8IURPQ1RZUEUgSFRNTCBTWVNURU0gIi4uLi9IVE1MNDBzdHJpY3QueG1sLmR0ZCI+Ci0gICAgPEhUTUw+Ci0gICAgICA8SEVBRD4KLSAgICAgICAgLi4uCi0gICAgICAgIDxUSVRMRT4uLi48L1RJVExFPgotICAgICAgICAuLi4KLSAgICAgIDwvSEVBRD4KLSAgICAgIDxCT0RZPgotICAgICAgICAuLi4KLSAgICAgIDwvQk9EWT4KLSAgICA8L0hUTUw+Ci0KLSAgICBOb3RlOiBYTUwgaXMgY2FzZS1zZW5zaXRpdmUuICBTbyBlbGVtZW50IG5hbWVzIG11c3QgYmUgd3JpdHRlbgotICAgIGluIHVwcGVyY2FzZSBhbmQgYXR0cmlidXRlIG5hbWVzIG11c3QgYmUgd3JpdHRlbiBpbiBsb3dlcmNhc2UuCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0+Ci0KLTwhLS0KLSAgICBUeXBpY2FsIHVzYWdlOgotCi0gICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9zdHJpY3QuZHRkIj4KLSAgICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAuLi4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgLi4uCi0gICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLQotICAgIFRoZSBVUkkgdXNlZCBhcyBhIHN5c3RlbSBpZGVudGlmaWVyIHdpdGggdGhlIHB1YmxpYyBpZGVudGlmaWVyIGFsbG93cwotICAgIHRoZSB1c2VyIGFnZW50IHRvIGRvd25sb2FkIHRoZSBEVEQgYW5kIGVudGl0eSBzZXRzIGFzIG5lZWRlZC4KLQotICAgIFRoZSBGUEkgZm9yIHRoZSBUcmFuc2l0aW9uYWwgSFRNTCA0LjAgRFREIGlzOgotCi0gICAgICAgICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIgotCi0gICAgYW5kIGl0cyBVUkkgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQKLQotICAgIElmIHlvdSBhcmUgd3JpdGluZyBhIGRvY3VtZW50IHRoYXQgaW5jbHVkZXMgZnJhbWVzLCB1c2UgCi0gICAgdGhlIGZvbGxvd2luZyBGUEk6Ci0KLSAgICAgICAgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiIKLQotICAgIHdpdGggdGhlIFVSSToKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2ZyYW1lc2V0LmR0ZAotCi0gICAgVGhlIGZvbGxvd2luZyBVUklzIGFyZSBzdXBwb3J0ZWQgaW4gcmVsYXRpb24gdG8gSFRNTCA0LjAKLQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL3N0cmljdC5kdGQiIChTdHJpY3QgRFREKQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2xvb3NlLmR0ZCIgKExvb3NlIERURCkKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9mcmFtZXNldC5kdGQiIChGcmFtZXNldCBEVEQpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvSFRNTGxhdDEuZW50IiAoTGF0aW4tMSBlbnRpdGllcykKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9IVE1Mc3ltYm9sLmVudCIgKFN5bWJvbCBlbnRpdGllcykKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9IVE1Mc3BlY2lhbC5lbnQiIChTcGVjaWFsIGVudGl0aWVzKQotCi0gICAgVGhlc2UgVVJJcyBwb2ludCB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWFjaCBmaWxlLiBUbyByZWZlcmVuY2UKLSAgICB0aGlzIHNwZWNpZmljIHJldmlzaW9uIHVzZSB0aGUgZm9sbG93aW5nIFVSSXM6Ci0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC05NzEyMTgvc3RyaWN0LmR0ZCIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC05NzEyMTgvbG9vc2UuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwLTk3MTIxOC9mcmFtZXNldC5kdGQiCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAtOTcxMjE4L0hUTUxsYXQxLmVudCIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC05NzEyMTgvSFRNTHN5bWJvbC5lbnQiCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAtOTcxMjE4L0hUTUxzcGVjaWFsLmVudCIKLQotLS0+Ci0KLTwhLS09PT0gZm9yIFhNTCA9PT0tLT4KLTwhRU5USVRZICUgTnVtYmVyICJDREFUQSI+Ci08IUVOVElUWSAlIE5hbWUgIk5NVE9LRU4iPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT0gSW1wb3J0ZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGUgIkNEQVRBIgotPiA8IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMgIkNEQVRBIgotPiA8IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldCAiQ0RBVEEiCi0+IDwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0cyAiQ0RBVEEiCi0+IDwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlICJOTVRPS0VOIgotPiA8IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMxNzY2XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJhY3RlciAiQ0RBVEEiCi0+IDwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBMaW5rVHlwZXMgIkNEQVRBIgotPiA8IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBNZWRpYURlc2MgIkNEQVRBIgotPiA8IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycwotICAgIC0tPgotCi08IS0tIERlZmluZWQgZWxzZXdoZXJlIGluIHRoaXMgRFRECi08IUVOVElUWSAlIFVSSSAiQ0RBVEEiCi0+IDwhIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLAotICAgICAgIHNlZSBbVVJJXQotICAgIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSI+PCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci0KLQotPCFFTlRJVFkgJSBTY3JpcHQgIkNEQVRBIj48IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotCi08IUVOVElUWSAlIFN0eWxlU2hlZXQgIkNEQVRBIj48IS0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLQotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLQotCi08IS0tIFBhcmFtZXRlciBFbnRpdGllcyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIj48IS0tIHJlcGVhdGFibGUgaGVhZCBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgaGVhZGluZyAiSDF8SDJ8SDN8SDR8SDV8SDYiPgotPCFFTlRJVFkgJSBsaXN0ICJVTCB8IE9MIj4KLTwhRU5USVRZICUgcHJlZm9ybWF0dGVkICJQUkUiPgotCi0KLTwhLS09PT09PT09PT09PT09PT09IENoYXJhY3RlciBtbmVtb25pYyBlbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS1FTlRJVFkgJSBIVE1MbGF0MSBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIExhdGluMS8vRU4vL0hUTUwiCi0gICAiSFRNTGxhdDEuZW50Ii0tPgotPCEtLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwLTk3MTIxOC9IVE1MbGF0MS5lbnQiLS0+Ci08IS0tJUhUTUxsYXQxOy0tPgotCi08IS0tRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMvL0VOLy9IVE1MIgotICAgIkhUTUxzeW1ib2wuZW50Ii0tPgotPCEtLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwLTk3MTIxOC9IVE1Mc3ltYm9sLmVudCItLT4KLTwhLS0lSFRNTHN5bWJvbDstLT4KLQotPCEtLUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiCi0gICAiSFRNTHNwZWNpYWwuZW50Ii0tPgotPCEtLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwLTk3MTIxOC9IVE1Mc3BlY2lhbC5lbnQiLS0+Ci08IS0tJUhUTUxzcGVjaWFsOy0tPgotCi08IS0tIFdlIGRlZmluZSB0aGVzZSBlbHNld2hlcmUgaW4gdGhpcyBtaXhlZCBEVEQKLTwhRU5USVRZIHF1b3QgIiYjMzQ7Ij4KLTwhRU5USVRZIGFtcCAgIiYjMzg7Ij4KLTwhRU5USVRZIGx0ICAgIiYjNjA7Ij4KLTwhRU5USVRZIGd0ICAgIiYjNjI7Ij4KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICAlcmVzdWx0LWVsZW1lbnQtYXR0czsiCi0+Ci0KLTwhRU5USVRZICUgaTE4bgotICJ4bWw6bGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjSU1QTElFRCIKLSAgPgotCi08IUVOVElUWSAlIGV2ZW50cwotICJvbmNsaWNrICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmRibGNsaWNrICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlZG93biAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlb3ZlciAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlb3V0ICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleWRvd24gICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleXVwICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIFJlc2VydmVkIEZlYXR1cmUgU3dpdGNoIC0tPgotPCFFTlRJVFkgJSBIVE1MLlJlc2VydmVkICJJR05PUkUiPgotCi08IS0tIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0+Ci08IVsgJUhUTUwuUmVzZXJ2ZWQ7IFsKLTwhRU5USVRZICUgcmVzZXJ2ZWQKLSAiZGF0YXNyYyAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0YWZsZCAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgZGF0YWZvcm1hdGFzIChwbGFpbnRleHR8aHRtbCkgcGxhaW50ZXh0IgotICA+Ci1dXT4KLQotPCFFTlRJVFkgJSByZXNlcnZlZCAiIj4KLQotPCFFTlRJVFkgJSBhdHRycyAiJWNvcmVhdHRyczsgJWkxOG47ICVldmVudHM7Ij4KLQotCi08IS0tPT09PT09PT09PT09PT09PT09PSBUZXh0IE1hcmt1cCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGZvbnRzdHlsZQotICJUVCB8IEkgfCBCIHwgQklHIHwgU01BTEwiPgotCi08IUVOVElUWSAlIHBocmFzZSAiRU0gfCBTVFJPTkcgfCBERk4gfCBDT0RFIHwKLSAgICAgICAgICAgICAgICAgICBTQU1QIHwgS0JEIHwgVkFSIHwgQ0lURSB8IEFCQlIgfCBBQ1JPTllNIiA+Ci0KLTwhRU5USVRZICUgc3BlY2lhbAotICAgIkEgfCBJTUcgfCBPQkpFQ1QgfCBCUiB8IFNDUklQVCB8IE1BUCB8IFEgfCBTVUIgfCBTVVAgfCBTUEFOIHwgQkRPIj4KLTwhRU5USVRZICUgc3BlY2lhbC1BCi0gICAiSU1HIHwgT0JKRUNUIHwgQlIgfCBTQ1JJUFQgfCBNQVAgfCBRIHwgU1VCIHwgU1VQIHwgU1BBTiB8IEJETyI+Ci0KLTwhRU5USVRZICUgZm9ybWN0cmwgIklOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEgfCBMQUJFTCB8IEJVVFRPTiI+Ci0KLTwhLS0gJWlubGluZTsgY292ZXJzIGlubGluZSBvciAidGV4dC1sZXZlbCIgZWxlbWVudHMgLS0+Ci08IUVOVElUWSAlIGlubGluZSAiI1BDREFUQSB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlc3BlY2lhbDsgfCAlZm9ybWN0cmw7Ij4KLTwhRU5USVRZICUgaW5saW5lLUEgIiNQQ0RBVEEgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJXNwZWNpYWwtQTsgfCAlZm9ybWN0cmw7Ij4KLTwhRU5USVRZICUgaW5saW5lLUxBQkVMICIjUENEQVRBIHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVzcGVjaWFsOyB8IElOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEgfCBCVVRUT04iPgotCi08IS0tCi08IUVMRU1FTlQgKCVmb250c3R5bGU7fCVwaHJhc2U7KSAgICAgKCVpbmxpbmU7KSo+Ci08IUFUVExJU1QgKCVmb250c3R5bGU7fCVwaHJhc2U7KQotICAlYXR0cnM7Ci0gID4tLT4KLTwhRUxFTUVOVCBUVCAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIFRUICVhdHRyczs+Ci08IUVMRU1FTlQgSSAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEkgJWF0dHJzOz4KLTwhRUxFTUVOVCBCICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgQiAlYXR0cnM7PgotPCFFTEVNRU5UIEJJRyAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEJJRyAlYXR0cnM7PgotPCFFTEVNRU5UIFNNQUxMICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgU01BTEwgJWF0dHJzOz4KLTwhRUxFTUVOVCBFTSAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEVNICVhdHRyczs+Ci08IUVMRU1FTlQgU1RST05HICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgU1RST05HICVhdHRyczs+Ci08IUVMRU1FTlQgREZOICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgREZOICVhdHRyczs+Ci08IUVMRU1FTlQgQ09ERSAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIENPREUgJWF0dHJzOz4KLTwhRUxFTUVOVCBTQU1QICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgU0FNUCAlYXR0cnM7PgotPCFFTEVNRU5UIEtCRCAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEtCRCAlYXR0cnM7PgotPCFFTEVNRU5UIFZBUiAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIFZBUiAlYXR0cnM7PgotPCFFTEVNRU5UIENJVEUgKCVpbmxpbmU7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj4KLTwhQVRUTElTVCBDSVRFICVhdHRyczs+Ci08IUVMRU1FTlQgQUJCUiAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEFCQlIgJWF0dHJzOz4KLTwhRUxFTUVOVCBBQ1JPTllNICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgQUNST05ZTSAlYXR0cnM7PgotCi0KLTwhRUxFTUVOVCBTVVAgKCVpbmxpbmU7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj48IS0tIHN1YnNjcmlwdCwgc3VwZXJzY3JpcHQgLS0+Ci08IUFUVExJU1QgU1VQCi0gICVhdHRyczsKLSAgPgotPCFFTEVNRU5UIFNVQiAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gc3Vic2NyaXB0LCBzdXBlcnNjcmlwdCAtLT4KLTwhQVRUTElTVCBTVUIKLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBTUEFOICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBTUEFOCi0gICVhdHRyczsKLSAgJXJlc2VydmVkOwkJCQotICA+Ci0KLTwhRUxFTUVOVCBCRE8gKCVpbmxpbmU7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj48IS0tIEkxOE4gQmlEaSBvdmVyLXJpZGUgLS0+Ci08IUFUVExJU1QgQkRPCi0gICVjb3JlYXR0cnM7Ci0gIGxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNSRVFVSVJFRAotICA+Ci0KLQotPCFFTEVNRU5UIEJSICAgICBFTVBUWT48IS0tIGZvcmNlZCBsaW5lIGJyZWFrIC0tPgotPCFBVFRMSVNUIEJSCi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBIVE1MIGNvbnRlbnQgbW9kZWxzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICAgIEhUTUwgaGFzIHR3byBiYXNpYyBjb250ZW50IG1vZGVsczoKLQotICAgICAgICAlaW5saW5lOyAgICAgY2hhcmFjdGVyIGxldmVsIGVsZW1lbnRzIGFuZCB0ZXh0IHN0cmluZ3MKLSAgICAgICAgJWJsb2NrOyAgICAgIGJsb2NrLWxpa2UgZWxlbWVudHMgZS5nLiBwYXJhZ3JhcGhzIGFuZCBsaXN0cwotLS0+Ci0KLTwhRU5USVRZICUgYmxvY2sKLSAgICAgIlAgfCAlaGVhZGluZzsgfCAlbGlzdDsgfCAlcHJlZm9ybWF0dGVkOyB8IERMIHwgRElWIHwgTk9TQ1JJUFQgfAotICAgICAgQkxPQ0tRVU9URSB8IEZPUk0gfCBIUiB8IFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTIj4KLTwhRU5USVRZICUgYmxvY2stRk9STQotICAgICAiUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBOT1NDUklQVCB8Ci0gICAgICBCTE9DS1FVT1RFIHwgSFIgfCBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUyI+Ci08IUVOVElUWSAlIGJsb2NrLUZPUk0tRklFTERTRVQKLSAgICAgIlAgfCAlaGVhZGluZzsgfCAlbGlzdDsgfCAlcHJlZm9ybWF0dGVkOyB8IERMIHwgRElWIHwgTk9TQ1JJUFQgfAotICAgICAgQkxPQ0tRVU9URSB8IEhSIHwgVEFCTEUgfCBBRERSRVNTIj4KLQotPCEtLTwhRU5USVRZICUgZmxvdyAiJWJsb2NrOyB8ICVpbmxpbmU7Ij4tLT4KLTwhRU5USVRZICUgZmxvdyAiJWlubGluZTsgfCAlYmxvY2s7Ij4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLUVMRU1FTlQgQk9EWSAgICAgKCVibG9jazt8U0NSSVBUKSsgKyhJTlN8REVMKSAgZG9jdW1lbnQgYm9keSAtLT4KLTwhRUxFTUVOVCBCT0RZICgoSU5TfERFTCkqLCAoJXhzbC12YWxpZC1pbi1yZXN1bHRuczt8JWJsb2NrO3xTQ1JJUFQpLCAoSU5TfERFTCkqKSsgPjwhLS0gZG9jdW1lbnQgYm9keSAtLT4KLTwhQVRUTElTVCBCT0RZCi0gICVhdHRyczsKLSAgb25sb2FkICAgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQKLSAgb251bmxvYWQgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgQUREUkVTUyAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gaW5mb3JtYXRpb24gb24gYXV0aG9yIC0tPgotPCFBVFRMSVNUIEFERFJFU1MKLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBESVYgKCVmbG93OyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBESVYKLSAgJWF0dHJzOwotICAlcmVzZXJ2ZWQ7Ci0gID4KLQotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBBbmNob3IgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIFNoYXBlICIocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KSI+Ci08IUVOVElUWSAlIENvb3JkcyAiQ0RBVEEiPjwhLS0gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCFFTEVNRU5UIEEgKCVpbmxpbmUtQTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gYW5jaG9yIC0tPgotPCFBVFRMSVNUIEEKLSAgJWF0dHJzOwotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICAicmVjdCIKLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENsaWVudC1zaWRlIGltYWdlIG1hcHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50IGFsdGhvdWdoIHRoaXMgaXNuJ3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBNQVAgICgoJXhzbC12YWxpZC1pbi1yZXN1bHRuczt8JWJsb2NrOykrIHwgKCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7fEFSRUErKSk+PCEtLSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0+Ci08IUFUVExJU1QgTUFQCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVECi0gID4KLQotPCFFTEVNRU5UIEFSRUEgICAgIEVNUFRZPjwhLS0gY2xpZW50LXNpZGUgaW1hZ2UgbWFwIGFyZWEgLS0+Ci08IUFUVExJU1QgQVJFQQotICAlYXR0cnM7Ci0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgICJyZWN0IgotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBub2hyZWYgICAgICAobm9ocmVmKSAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBMSU5LIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFJlbGF0aW9uc2hpcCB2YWx1ZXMgY2FuIGJlIHVzZWQgaW4gcHJpbmNpcGxlOgotCi0gICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMgd2hlbiB1c2VkCi0gICAgICB3aXRoIHRoZSBMSU5LIGVsZW1lbnQgaW4gZG9jdW1lbnQgaGVhZCBlLmcuCi0gICAgICAgIHN0YXJ0LCBjb250ZW50cywgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgIGIpIHRvIGxpbmsgdG8gYSBzZXBhcmF0ZSBzdHlsZSBzaGVldCAocmVsPXN0eWxlc2hlZXQpCi0gICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPXNjcmlwdCkKLSAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mCi0gICAgICBodG1sIG5vZGVzIGFyZSByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIGUuZy4gYSBwb3N0c2NyaXB0IG9yIHBkZiB2ZXJzaW9uIChyZWw9YWx0ZXJuYXRlIG1lZGlhPXByaW50KQotLS0+Ci0KLTwhRUxFTUVOVCBMSU5LICAgICBFTVBUWT48IS0tIGEgbWVkaWEtaW5kZXBlbmRlbnQgbGluayAtLT4KLTwhQVRUTElTVCBMSU5LCi0gICVhdHRyczsKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGluIHN0cmljdCBEVEQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIj48IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhRU5USVRZICUgTXVsdGlMZW5ndGggIkNEQVRBIj48IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLQotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aHMgIkNEQVRBIj48IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE11bHRpTGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiPjwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLQotCi08IS0tIFRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGV4dC1vbmx5IFVBcyBhcyB3ZWxsIGFzIAotICAgdG8gbWFrZSBpbWFnZSBjb250ZW50IHVuZGVyc3RhbmRhYmxlIGFuZCBuYXZpZ2FibGUgCi0gICB0byB1c2VycyBvZiBub24tdmlzdWFsIFVBcywgeW91IG5lZWQgdG8gcHJvdmlkZQotICAgYSBkZXNjcmlwdGlvbiB3aXRoIEFMVCwgYW5kIGF2b2lkIHNlcnZlci1zaWRlIGltYWdlIG1hcHMgLS0+Ci08IUVMRU1FTlQgSU1HICAgICBFTVBUWT48IS0tIEVtYmVkZGVkIGltYWdlIC0tPgotPCFBVFRMSVNUIElNRwotICAlYXR0cnM7Ci0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIFVTRU1BUCBwb2ludHMgdG8gYSBNQVAgZWxlbWVudCB3aGljaCBtYXkgYmUgaW4gdGhpcyBkb2N1bWVudAotICBvciBhbiBleHRlcm5hbCBkb2N1bWVudCwgYWx0aG91Z2ggdGhlIGxhdHRlciBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09IE9CSkVDVCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBPQkpFQ1QgaXMgdXNlZCB0byBlbWJlZCBvYmplY3RzIGFzIHBhcnQgb2YgSFRNTCBwYWdlcyAKLSAgUEFSQU0gZWxlbWVudHMgc2hvdWxkIHByZWNlZGUgb3RoZXIgY29udGVudC4gU0dNTCBtaXhlZCBjb250ZW50Ci0gIG1vZGVsIHRlY2huaWNhbGl0eSBwcmVjbHVkZXMgc3BlY2lmeWluZyB0aGlzIGZvcm1hbGx5IC4uLgotLS0+Ci0KLTwhRUxFTUVOVCBPQkpFQ1QgKCVmbG93OyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7IHwgUEFSQU0pKgotPjwhLS0gZ2VuZXJpYyBlbWJlZGRlZCBvYmplY3QgLS0+Ci08IUFUVExJU1QgT0JKRUNUCi0gICVhdHRyczsKLSAgZGVjbGFyZSAgICAgKGRlY2xhcmUpICAgICAgI0lNUExJRUQKLSAgY2xhc3NpZCAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0YSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgY29kZXR5cGUgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgYXJjaGl2ZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgJXJlc2VydmVkOwotICA+Ci0KLTwhRUxFTUVOVCBQQVJBTSAgICAgRU1QVFk+PCEtLSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZSAtLT4KLTwhQVRUTElTVCBQQVJBTQotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWV0eXBlICAgKERBVEF8UkVGfE9CSkVDVCkgIkRBVEEiCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gID4KLQotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIb3Jpem9udGFsIFJ1bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgSFIgICAgIEVNUFRZPjwhLS0gaG9yaXpvbnRhbCBydWxlIC0tPgotPCFBVFRMSVNUIEhSCi0gICVjb3JlYXR0cnM7Ci0gICVldmVudHM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFAgKCVpbmxpbmU7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj48IS0tIHBhcmFncmFwaCAtLT4KLTwhQVRUTElTVCBQCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIZWFkaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZXJlIGFyZSBzaXggbGV2ZWxzIG9mIGhlYWRpbmdzIGZyb20gSDEgKHRoZSBtb3N0IGltcG9ydGFudCkKLSAgdG8gSDYgKHRoZSBsZWFzdCBpbXBvcnRhbnQpLgotLS0+Ci0KLTwhLS0KLTwhRUxFTUVOVCAoJWhlYWRpbmc7KSAgICAgICglaW5saW5lOykqPgotPCFBVFRMSVNUICglaGVhZGluZzspCi0gICVhdHRyczsKLSAgPi0tPgotPCFFTEVNRU5UIEgxICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgSDEgJWF0dHJzOz4KLTwhRUxFTUVOVCBIMiAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEgyICVhdHRyczs+Ci08IUVMRU1FTlQgSDMgKCVpbmxpbmU7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj4KLTwhQVRUTElTVCBIMyAlYXR0cnM7PgotPCFFTEVNRU5UIEg0ICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+Ci08IUFUVExJU1QgSDQgJWF0dHJzOz4KLTwhRUxFTUVOVCBINSAoJWlubGluZTsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPgotPCFBVFRMSVNUIEg1ICVhdHRyczs+Ci08IUVMRU1FTlQgSDYgKCVpbmxpbmU7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj4KLTwhQVRUTElTVCBINiAlYXR0cnM7PgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZXhjbHVkZXMgbWFya3VwIGZvciBpbWFnZXMgYW5kIGNoYW5nZXMgaW4gZm9udCBzaXplIC0tPgotPCEtLQotPCFFTlRJVFkgJSBwcmUuZXhjbHVzaW9uICJJTUd8T0JKRUNUfEJJR3xTTUFMTHxTVUJ8U1VQIj4KLQotPCFFTEVNRU5UIFBSRSAgKCVpbmxpbmU7KSogLSglcHJlLmV4Y2x1c2lvbjspPjwhIHByZWZvcm1hdHRlZCB0ZXh0IC0tPgotCi08IUVMRU1FTlQgUFJFICgjUENEQVRBIHwleHNsLXZhbGlkLWluLXJlc3VsdG5zO3wgVFR8SXxCfCVwaHJhc2U7fEF8QlJ8U0NSSVBUfE1BUHxRfFNQQU58QkRPfCVmb3JtY3RybDspKj4KLQkJCTwhLS0gcHJlZm9ybWF0dGVkIHRleHQgLS0+Ci08IUFUVExJU1QgUFJFCi0gICVhdHRyczs+Ci08IS0tIFNob3VsZCB0aGUgYXR0cmlidXRlIGJlbG93IGJlIGluY3VkZWQgaW4gUFJFPwotICB4bWw6c3BhY2UgKGRlZmF1bHR8cHJlc2VydmUpICNGSVhFRCAicHJlc2VydmUiCi0tLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PSBJbmxpbmUgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFEgICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBzaG9ydCBpbmxpbmUgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIFEKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEJsb2NrLWxpa2UgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBCTE9DS1FVT1RFICAoJWJsb2NrO3wleHNsLXZhbGlkLWluLXJlc3VsdG5zO3xTQ1JJUFQpKz48IS0tIGxvbmcgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIEJMT0NLUVVPVEUKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEluc2VydGVkL0RlbGV0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLQotPCEtLSBJTlMvREVMIGFyZSBoYW5kbGVkIGJ5IGluY2x1c2lvbiBvbiBCT0RZIC0tPgotPCFFTEVNRU5UIElOUyAoJWZsb3c7fCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBpbnNlcnRlZCB0ZXh0LCBkZWxldGVkIHRleHQgLS0+Ci08IUFUVExJU1QgSU5TCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotPCFFTEVNRU5UIERFTCAoJWZsb3c7fCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBpbnNlcnRlZCB0ZXh0LCBkZWxldGVkIHRleHQgLS0+Ci08IUFUVExJU1QgREVMCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGRlZmluaXRpb24gbGlzdHMgLSBEVCBmb3IgdGVybSwgREQgZm9yIGl0cyBkZWZpbml0aW9uIC0tPgotCi08IUVMRU1FTlQgREwgICgleHNsLXZhbGlkLWluLXJlc3VsdG5zO3wgRFR8REQpKz48IS0tIGRlZmluaXRpb24gbGlzdCAtLT4KLTwhQVRUTElTVCBETAotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIERUICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBkZWZpbml0aW9uIHRlcm0gLS0+Ci08IUVMRU1FTlQgREQgKCVmbG93OyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBkZWZpbml0aW9uIGRlc2NyaXB0aW9uIC0tPgotPCFBVFRMSVNUIERUCi0gICVhdHRyczsKLSAgPgotPCFBVFRMSVNUIERECi0gICVhdHRyczsKLSAgPgotCi0KLTwhRUxFTUVOVCBPTCAoJXhzbC12YWxpZC1pbi1yZXN1bHRuczsgfCBMSSkrPjwhLS0gb3JkZXJlZCBsaXN0IC0tPgotPCFBVFRMSVNUIE9MCi0gICVhdHRyczsKLSAgPgotCi08IS0tIFVub3JkZXJlZCBMaXN0cyAoVUwpIGJ1bGxldCBzdHlsZXMgLS0+Ci08IUVMRU1FTlQgVUwgKCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7IHwgTEkpKz48IS0tIHVub3JkZXJlZCBsaXN0IC0tPgotPCFBVFRMSVNUIFVMCi0gICVhdHRyczsKLSAgPgotCi0KLQotPCFFTEVNRU5UIExJICglZmxvdzsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gbGlzdCBpdGVtIC0tPgotPCFBVFRMSVNUIExJCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBGb3JtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCFFTEVNRU5UIEZPUk0gKCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7fCVibG9jay1GT1JNO3xTQ1JJUFQpKz4KLQotPCEtLSBpbnRlcmFjdGl2ZSBmb3JtIC0tPgotPCFBVFRMSVNUIEZPUk0KLSAgJWF0dHJzOwotICBhY3Rpb24gICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQKLSAgbWV0aG9kICAgICAgKEdFVHxQT1NUKSAgICAgIkdFVCIKLSAgZW5jdHlwZSAgICAgJUNvbnRlbnRUeXBlOyAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgb25zdWJtaXQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25yZXNldCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAgI0lNUExJRUQKLSAgPgotCi08IS0tIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkIC0tPgotPCFFTEVNRU5UIExBQkVMICAoJWlubGluZS1MQUJFTDsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gZm9ybSBmaWVsZCBsYWJlbCB0ZXh0IC0tPgotPCFBVFRMSVNUIExBQkVMCi0gICVhdHRyczsKLSAgZm9yICAgICAgICAgSURSRUYgICAgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVOVElUWSAlIElucHV0VHlwZQotICAiKFRFWFQgfCBQQVNTV09SRCB8IENIRUNLQk9YIHwKLSAgICBSQURJTyB8IFNVQk1JVCB8IFJFU0VUIHwKLSAgICBGSUxFIHwgSElEREVOIHwgSU1BR0UgfCBCVVRUT04pIgotICAgPgotCi08IS0tIGF0dHJpYnV0ZSBuYW1lIHJlcXVpcmVkIGZvciBhbGwgYnV0IHN1Ym1pdCAmIHJlc2V0IC0tPgotPCFFTEVNRU5UIElOUFVUICAgICBFTVBUWT48IS0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBJTlBVVAotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVJbnB1dFR5cGU7ICAgICJURVhUIgotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjaGVja2VkICAgICAoY2hlY2tlZCkgICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBtYXhsZW5ndGggICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRAotICAlcmVzZXJ2ZWQ7Ci0gID4KLQotPCFFTEVNRU5UIFNFTEVDVCAoKCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7fE9QVEdST1VQKXwoJXhzbC12YWxpZC1pbi1yZXN1bHRuczt8T1BUSU9OKSkrID48IS0tIG9wdGlvbiBzZWxlY3RvciAtLT4KLTwhQVRUTElTVCBTRUxFQ1QKLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBtdWx0aXBsZSAgICAobXVsdGlwbGUpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICAlcmVzZXJ2ZWQ7Ci0gID4KLQotPCFFTEVNRU5UIE9QVEdST1VQICgleHNsLXZhbGlkLWluLXJlc3VsdG5zO3xPUFRJT04pKz4gIDwhLS0gb3B0aW9uIGdyb3VwIC0tPgotPCFBVFRMSVNUIE9QVEdST1VQCi0gICVhdHRyczsKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gID4KLQotPCFFTEVNRU5UIE9QVElPTiAgKCNQQ0RBVEEgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gc2VsZWN0YWJsZSBjaG9pY2UgLS0+Ci08IUFUVExJU1QgT1BUSU9OCi0gICVhdHRyczsKLSAgc2VsZWN0ZWQgICAgKHNlbGVjdGVkKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgVEVYVEFSRUEgKCNQQ0RBVEEgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gbXVsdGktbGluZSB0ZXh0IGZpZWxkIC0tPgotPCFBVFRMSVNUIFRFWFRBUkVBCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgcm93cyAgICAgICAgJU51bWJlcjsgICAgICAgI1JFUVVJUkVECi0gIGNvbHMgICAgICAgICVOdW1iZXI7ICAgICAgICNSRVFVSVJFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICAlcmVzZXJ2ZWQ7Ci0gID4KLQotPCEtLQotICAjUENEQVRBIGlzIHRvIHNvbHZlIHRoZSBtaXhlZCBjb250ZW50IHByb2JsZW0sCi0gIHBlciBzcGVjaWZpY2F0aW9uIG9ubHkgd2hpdGVzcGFjZSBpcyBhbGxvd2VkIHRoZXJlIQotCi0gIFdlIGRvIGFsbG93IFhTTCBpbnNpZGUgYXMgd2VsbAotIC0tPgotPCEtLUVMRU1FTlQgRklFTERTRVQgICAgICgjUENEQVRBLExFR0VORCwoJWZsb3c7KSopICAgIGZvcm0gY29udHJvbCBncm91cCAtLT4KLTwhRUxFTUVOVCBGSUVMRFNFVCAgKCVmbG93O3wleHNsLXZhbGlkLWluLXJlc3VsdG5zO3xMRUdFTkQpKj48IS0tIGZvcm0gY29udHJvbCBncm91cCAtLT4KLTwhQVRUTElTVCBGSUVMRFNFVAotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIExFR0VORCAoJWlubGluZTt8JXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj48IS0tIGZpZWxkc2V0IGxlZ2VuZCAtLT4KLTwhRU5USVRZICUgTEFsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBMRUdFTkQKLSAgJWF0dHJzOwotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBCVVRUT04KLSAgICAgKCNQQ0RBVEEgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOyB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlc3BlY2lhbC1BOyB8ICVibG9jazspKgotPjwhLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgQlVUVE9OCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpICJzdWJtaXQiCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gICVyZXNlcnZlZDsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gVGFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIElFVEYgSFRNTCB0YWJsZSBzdGFuZGFyZCwgc2VlIFtSRkMxOTQyXSAtLT4KLQotPCEtLQotIFRoZSBCT1JERVIgYXR0cmlidXRlIHNldHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgZnJhbWUgYXJvdW5kIHRoZQotIHRhYmxlLiBUaGUgZGVmYXVsdCB1bml0cyBhcmUgc2NyZWVuIHBpeGVscy4KLQotIFRoZSBGUkFNRSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZSBmcmFtZSBhcm91bmQKLSB0aGUgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGUgdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgYXMKLSBDQUxTIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHRoZSBWQUxJR04gYXR0cmlidXRlLgotCi0gVGhlIHZhbHVlICJib3JkZXIiIGlzIGluY2x1ZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCi0gPFRBQkxFIEJPUkRFUj4gd2hpY2ggeWllbGRzIGZyYW1lPWJvcmRlciBhbmQgYm9yZGVyPWltcGxpZWQKLSBGb3IgPFRBQkxFIEJPUkRFUj0xPiB5b3UgZ2V0IGJvcmRlcj0xIGFuZCBmcmFtZT1pbXBsaWVkLiBJbiB0aGlzCi0gY2FzZSwgaXQgaXMgYXBwcm9wcmlhdGUgdG8gdHJlYXQgdGhpcyBhcyBmcmFtZT1ib3JkZXIgZm9yIGJhY2t3YXJkcwotIGNvbXBhdGliaWxpdHkgd2l0aCBkZXBsb3llZCBicm93c2Vycy4KLS0tPgotPCFFTlRJVFkgJSBURnJhbWUgIih2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKSI+Ci0KLTwhLS0KLSBUaGUgUlVMRVMgYXR0cmlidXRlIGRlZmluZXMgd2hpY2ggcnVsZXMgdG8gZHJhdyBiZXR3ZWVuIGNlbGxzOgotCi0gSWYgUlVMRVMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotICAgICAibm9uZSIgaWYgQk9SREVSIGlzIGFic2VudCBvciBCT1JERVI9MCBvdGhlcndpc2UgImFsbCIKLS0tPgotCi08IUVOVElUWSAlIFRSdWxlcyAiKG5vbmUgfCBncm91cHMgfCByb3dzIHwgY29scyB8IGFsbCkiPgotICAKLTwhLS0gaG9yaXpvbnRhbCBwbGFjZW1lbnQgb2YgdGFibGUgcmVsYXRpdmUgdG8gZG9jdW1lbnQgLS0+Ci08IUVOVElUWSAlIFRBbGlnbiAiKGxlZnR8Y2VudGVyfHJpZ2h0KSI+Ci0KLTwhLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbGhhbGlnbgotICAiYWxpZ24gICAgICAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRAotICAgY2hhciAgICAgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICAgY2hhcm9mZiAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIHZlcnRpY2FsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzIC0tPgotPCFFTlRJVFkgJSBjZWxsdmFsaWduCi0gICJ2YWxpZ24gICAgICh0b3B8bWlkZGxlfGJvdHRvbXxiYXNlbGluZSkgI0lNUExJRUQiCi0gID4KLQotPCFFTEVNRU5UIFRBQkxFIAotICAoKCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSosIENBUFRJT04/LCAoJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKiwKLSAgICgoQ09MIHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKnwoQ09MR1JPVVAgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqKSwKLSAgICgoVEhFQUQ/LCgleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqLFRGT09UPywoJXhzbC12YWxpZC1pbi1yZXN1bHRuczt8VEJPRFkpKykKLSAgICB8ICgleHNsLXZhbGlkLWluLXJlc3VsdG5zO3xUUikrKSApPgotCi08IUVMRU1FTlQgQ0FQVElPTiAgICglaW5saW5lOyB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSB0YWJsZSBjYXB0aW9uIC0tPgotPCFFTEVNRU5UIFRIRUFEICAgICAoVFJ8JXhzbC12YWxpZC1pbi1yZXN1bHRuczspKz48IS0tIHRhYmxlIGhlYWRlciAtLT4KLTwhRUxFTUVOVCBURk9PVCAgICAgKFRSfCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSs+PCEtLSB0YWJsZSBmb290ZXIgLS0+Ci08IUVMRU1FTlQgVEJPRFkgICAgIChUUnwleHNsLXZhbGlkLWluLXJlc3VsdG5zOykrPjwhLS0gdGFibGUgYm9keSAtLT4KLTwhRUxFTUVOVCBDT0xHUk9VUCAgKCV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7IHwgQ09MKSo+PCEtLSB0YWJsZSBjb2x1bW4gZ3JvdXAgLS0+Ci08IUVMRU1FTlQgQ09MICAgICAgIEVNUFRZPjwhLS0gdGFibGUgY29sdW1uIC0tPgotPCFFTEVNRU5UIFRSICAgICAgICAoVEh8VER8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSs+PCEtLSB0YWJsZSByb3cgLS0+Ci08IUVMRU1FTlQgVEggICAgICAgICglZmxvdzsgfCAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gdGFibGUgaGVhZGVyIGNlbGwsIHRhYmxlIGRhdGEgY2VsbC0tPgotPCFFTEVNRU5UIFREICAgICAgICAoJWZsb3c7IHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj48IS0tIHRhYmxlIGhlYWRlciBjZWxsLCB0YWJsZSBkYXRhIGNlbGwtLT4KLQotPCFBVFRMSVNUIFRBQkxFCi0gICVhdHRyczsKLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQKLSAgcnVsZXMgICAgICAgJVRSdWxlczsgICAgICAgI0lNUExJRUQKLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgY2VsbHBhZGRpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgJXJlc2VydmVkOwotICBkYXRhcGFnZXNpemUgQ0RBVEEgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRU5USVRZICUgQ0FsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBDQVBUSU9OCi0gICVhdHRyczsKLSAgPgotCi08IS0tCi1DT0xHUk9VUCBncm91cHMgYSBzZXQgb2YgQ09MIGVsZW1lbnRzLiBJdCBhbGxvd3MgeW91IHRvIGdyb3VwCi1zZXZlcmFsIHNlbWFudGljYWxseSByZWxhdGVkIGNvbHVtbnMgdG9nZXRoZXIuCi0tLT4KLTwhQVRUTElTVCBDT0xHUk9VUAotICAlYXR0cnM7Ci0gIHNwYW4gICAgICAgICVOdW1iZXI7ICAgICAgICIxIgotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRAotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCEtLQotIENPTCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvciBjZWxscyBpbgotIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0KLSBUaGUgV0lEVEggYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbnMsIGUuZy4KLQotICAgICB3aWR0aD02NCAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICB3aWR0aD0wLjUqICAgICAgcmVsYXRpdmUgd2lkdGggb2YgMC41Ci0KLSBUaGUgU1BBTiBhdHRyaWJ1dGUgY2F1c2VzIHRoZSBhdHRyaWJ1dGVzIG9mIG9uZQotIENPTCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci08IUFUVExJU1QgQ09MCi0gICVhdHRyczsKLSAgc3BhbiAgICAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVECi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IS0tCi0gICAgVXNlIFRIRUFEIHRvIGR1cGxpY2F0ZSBoZWFkZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgIFRCT0RZIHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgVEZPT1QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgZm9vdGVycyB3aGVuCi0gICAgVEJPRFkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBtdWx0aXBsZSBUQk9EWSBzZWN0aW9ucyB3aGVuIHJ1bGVzIGFyZSBuZWVkZWQKLSAgICBiZXR3ZWVuIGdyb3VwcyBvZiB0YWJsZSByb3dzLgotLS0+Ci08IUFUVExJU1QgVEhFQUQKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLTwhQVRUTElTVCBUQk9EWQotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotPCFBVFRMSVNUIFRGT09UCi0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCBUUgotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi0KLTwhLS0gU2NvcGUgaXMgc2ltcGxlciB0aGFuIGF4ZXMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzIC0tPgotPCFFTlRJVFkgJSBTY29wZSAiKFJPV3xDT0x8Uk9XR1JPVVB8Q09MR1JPVVApIj4KLQotPCEtLSBUSCBpcyBmb3IgaGVhZGVycywgVEQgZm9yIGRhdGEsIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIFREIC0tPgotPCFBVFRMSVNUIFRICi0gICVhdHRyczsKLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgaGVhZGVycyAgICAgSURSRUZTICAgICAgICAgI0lNUExJRUQKLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQKLSAgcm93c3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIGNvbHNwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLTwhQVRUTElTVCBURAotICAlYXR0cnM7Ci0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVECi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVECi0gIHJvd3NwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICBjb2xzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gJWhlYWQubWlzYzsgZGVmaW5lZCBlYXJsaWVyIG9uIGFzICJTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCIsCi0gICAgIGV4dGVuZGVkIG5vdyB0byBhbGxvdyB4c2wgLS0+Ci08IUVOVElUWSAlIGhlYWQubWlzYy1IRUFEICIlaGVhZC5taXNjO3wleHNsLXZhbGlkLWluLXJlc3VsdG5zOyI+Ci0KLTwhRU5USVRZICUgaGVhZC5jb250ZW50ICJUSVRMRSAmYW1wOyBCQVNFPyI+Ci0KLTwhLS1FTEVNRU5UIEhFQUQgICAgICglaGVhZC5jb250ZW50OykgKyglaGVhZC5taXNjOykgICBkb2N1bWVudCBoZWFkIC0tPgotPCFFTEVNRU5UIEhFQUQKLSAgICgoJWhlYWQubWlzYy1IRUFEOykqLCAoKEJBU0U/LCglaGVhZC5taXNjLUhFQUQ7KSosVElUTEU/KSB8IChUSVRMRT8sKCVoZWFkLm1pc2MtSEVBRDspKixCQVNFPyl8KCVoZWFkLm1pc2MtSEVBRDspKikrLCAoJWhlYWQubWlzYy1IRUFEOykqKT4KLTwhQVRUTElTVCBIRUFECi0gICVpMThuOwotICBwcm9maWxlICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICAlcmVzdWx0LWVsZW1lbnQtYXR0czsKLSAgPgotCi08IS0tIFRoZSBUSVRMRSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLSAgICAtLT4KLTwhLS1FTEVNRU5UIFRJVExFICAgICAoI1BDREFUQSkgLSglaGVhZC5taXNjOykgIGRvY3VtZW50IHRpdGxlIC0tPgotPCFFTEVNRU5UIFRJVExFICAoI1BDREFUQSB8ICAleHNsLXZhbGlkLWluLXJlc3VsdG5zOykqPjwhLS0gZG9jdW1lbnQgdGl0bGUgLS0+Ci08IUFUVExJU1QgVElUTEUgJWkxOG47ICVyZXN1bHQtZWxlbWVudC1hdHRzOz4KLQotCi08IUVMRU1FTlQgQkFTRSAgICAgRU1QVFk+PCEtLSBkb2N1bWVudCBiYXNlIFVSSSAtLT4KLTwhQVRUTElTVCBCQVNFCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICA+Ci0KLTwhRUxFTUVOVCBNRVRBICAgICBFTVBUWT48IS0tIGdlbmVyaWMgbWV0YWluZm9ybWF0aW9uIC0tPgotPCFBVFRMSVNUIE1FVEEKLSAgJWkxOG47Ci0gIGh0dHAtZXF1aXYgICVOYW1lOyAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgICVOYW1lOyAgICAgICAgICNJTVBMSUVECi0gIGNvbnRlbnQgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRAotICBzY2hlbWUgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICAlcmVzdWx0LWVsZW1lbnQtYXR0czsKLSAgPgotCi08IS0tRUxFTUVOVCBTVFlMRSAgICAgJVN0eWxlU2hlZXQ7ICBzdHlsZSBpbmZvIC0tPgotPCFFTEVNRU5UIFNUWUxFICgjUENEQVRBIHwgJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKj48IS0tIHN0eWxlIGluZm8gLS0+Ci08IUFUVExJU1QgU1RZTEUKLSAgJWkxOG47Ci0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRAotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICAlcmVzdWx0LWVsZW1lbnQtYXR0czsKLSAgPgotCi08IS0tRUxFTUVOVCBTQ1JJUFQgICAgICVTY3JpcHQ7IHNjcmlwdCBzdGF0ZW1lbnRzIC0tPgotPCFFTEVNRU5UIFNDUklQVCAoI1BDREFUQSB8ICV4c2wtdmFsaWQtaW4tcmVzdWx0bnM7KSo+PCEtLSBzY3JpcHQgc3RhdGVtZW50cyAtLT4KLTwhQVRUTElTVCBTQ1JJUFQKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVECi0gIGxhbmd1YWdlICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRlZmVyICAgICAgIChkZWZlcikgICAgICAgICNJTVBMSUVECi0gIGV2ZW50ICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGZvciAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gICVyZXN1bHQtZWxlbWVudC1hdHRzOwotICA+Ci0KLTwhRUxFTUVOVCBOT1NDUklQVCAoJXhzbC12YWxpZC1pbi1yZXN1bHRuczt8JWJsb2NrOykrCi0+PCEtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBzY3JpcHQtYmFzZWQgcmVuZGVyaW5nIC0tPgotPCFBVFRMSVNUIE5PU0NSSVBUCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFkiPgotCi08IS0tPCFFTEVNRU5UIEhUTUwgICAgICglaHRtbC5jb250ZW50Oyk+IC0tPjwhLS0gZG9jdW1lbnQgcm9vdCBlbGVtZW50IC0tPgotPCFFTEVNRU5UIEhUTUwgKCgoJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKixIRUFEPywoJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKixCT0RZPywKLSAgICAgICAgICAgICAgICAoJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKikgfCAoJXhzbC12YWxpZC1pbi1yZXN1bHRuczspKik+Ci08IS0tIGRvY3VtZW50IHJvb3QgZWxlbWVudCAtLT4KLTwhQVRUTElTVCBIVE1MCi0gICVpMThuOwotICAlcmVzdWx0LWVsZW1lbnQtYXR0czsKLSAgPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc3R5bGUvbG9hZGVyZGVzaWduLnhtbCBiL3hkb2NzL3N0eWxlL2xvYWRlcmRlc2lnbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NTA1NWIuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc3R5bGUvbG9hZGVyZGVzaWduLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxsb2FkZXI+Ci0gIDxwcm9jZXNzb3IgbmFtZT0ieHNsdCI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzdHlsZXNoZWV0IiB2YWx1ZT0ic2JrOi9zdHlsZS9zdHlsZXNoZWV0cy9kZXNpZ24ycHJvamVjdC54c2wiLz4KLSAgPC9wcm9jZXNzb3I+Ci08L2xvYWRlcj4KZGlmZiAtLWdpdCBhL3hkb2NzL3N0eWxlL3N0eWxlc2hlZXRzL2Rlc2lnbjJwcm9qZWN0LnhzbCBiL3hkb2NzL3N0eWxlL3N0eWxlc2hlZXRzL2Rlc2lnbjJwcm9qZWN0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyMzk0MC4uMDAwMDAwMAotLS0gYS94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy9kZXNpZ24ycHJvamVjdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPCEtLSBtYXRjaCB0aGUgcm9vdCBib29rIGVsZW1lbnQgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImJvb2siPgotICAgIDxwcm9qZWN0PgotICAgICAgPHBhcmFtZXRlciBuYW1lPSJjb3B5cmlnaHQiIHZhbHVlPSJ7QGNvcHlyaWdodH0iLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3Byb2plY3Q+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jdW1lbnQiPgotCi0gICAgPHByb2Nlc3Mgc291cmNlPSJ7QHNvdXJjZX0iIHByb2R1Y2VyPSJwYXJzZXIiPgotICAgICAgPHByb2Nlc3NvciBuYW1lPSJ4c2x0Ij4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJzdHlsZXNoZWV0IiB2YWx1ZT0ic2JrOi9zdHlsZS9zdHlsZXNoZWV0cy9hbnkycHJvamVjdC54c2wiLz4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgIDwvcHJvY2Vzcz4KLQotICAgIDxjcmVhdGUgc291cmNlPSJ7QHNvdXJjZX0iIHRhcmdldD0ie0BpZH0uaHRtbCIgcHJvZHVjZXI9InBhcnNlciIgcHJpbnRlcj0iaHRtbCI+Ci0gICAgICA8cHJvY2Vzc29yIG5hbWU9InhzbHQiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImlkIiB2YWx1ZT0ie0BpZH0iLz4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJzdHlsZXNoZWV0IiB2YWx1ZT0ic2JrOi9zdHlsZS9zdHlsZXNoZWV0cy9kZXNpZ25kb2MyaHRtbC54c2wiLz4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgIDwvY3JlYXRlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3N0eWxlL3N0eWxlc2hlZXRzL2Rlc2lnbmRvYzJodG1sLnhzbCBiL3hkb2NzL3N0eWxlL3N0eWxlc2hlZXRzL2Rlc2lnbmRvYzJodG1sLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2M2U0MS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy9kZXNpZ25kb2MyaHRtbC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLQotICA8eHNsOnBhcmFtIG5hbWU9InN0eWxlYm9vay5wcm9qZWN0Ii8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iY29weXJpZ2h0Ii8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iaWQiLz4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InMxIj4KLSAgICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPjwvdGl0bGU+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keSB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMDAwMGZmIiB2bGluaz0iIzAwMDBhYSIgYWxpbms9IiNmZjAwMDAiCi0gICAgICAgICAgICB0b3BtYXJnaW49IjQiIGxlZnRtYXJnaW49IjQiIG1hcmdpbndpZHRoPSI0IiBtYXJnaW5oZWlnaHQ9IjQiCi0gICAgICAgICAgICBiZ2NvbG9yPSIjZmZmZmZmIj4KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idG9waW1hZ2UiIHNlbGVjdD0ic3RyaW5nKC4vcC9pbWcvQHNyYykiLz4KLSAgICAgICAgIDxoMT48YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmciPjxpbWcgc3JjPSJpbWFnZXMveyR0b3BpbWFnZX0iLz48L2E+JiMxNjA7JiMxNjA7Ci0gICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRpdGxlIi8+PC9oMT48aHIvPgotICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgICAgIDxoci8+Ci0gICAgICAgICAgICA8Zm9udCBzaXplPSItMSIgY29sb3I9IiMwMDg2YjIiPjxpPgotICAgICAgICAgICAgICBDb3B5cmlnaHQgJiMxNjk7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0gICAgICAgICAgICA8L2k+PC9mb250PgotICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iczIiPgotICAgICAgCi0gICAgICA8aDI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPjwvaDI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InMzIj4KLSAgICAgIDxoMz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRpdGxlIi8+PC9oMz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iczQiPgotICAgICAgPGg0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGl0bGUiLz48L2g0PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgotPCEtLSBibG9ja3MgLS0+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icCI+Ci0gICAgPHA+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvcD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibm90ZSI+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB3aWR0aD0iMjAiIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICA8aW1nIHNyYz0icmVzb3VyY2VzL25vdGUuZ2lmIiB3aWR0aD0iMjAiIGhlaWdodD0iMjQiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiIGFsdD0iTm90ZSIvPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgIDxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiIGNvbG9yPSIjMDAwMDAwIj4KLSAgICAgICAgICAgIDxpPgotICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICAgICAgICA8L2k+Ci0gICAgICAgICAgPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4gIAotICAgIDwvdGFibGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InVsIj4KLSAgICA8dWw+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im9sIj4KLSAgICA8b2w+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvb2w+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxpIj4KLSAgICA8bGk+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvbGk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgICA8IS0tRGVmaW5pdGlvbiBsaXN0czogZ2xvc3MsIHRlcm0sIGxhYmVsLCBpdGVtIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJnbG9zcyI+Ci0gICAgPGRsPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2RsPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgIDwhLS0gPHRlcm0+IGNvbnRhaW5zIGEgc2luZ2xlLXdvcmQsIG11bHRpLXdvcmQgb3Igc3ltYm9saWMgCi0gICAgICAgZGVzaWduYXRpb24gd2hpY2ggaXMgcmVnYXJkZWQgYXMgYSB0ZWNobmljYWwgdGVybS4gLS0+IAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXJtIj4KLSAgICA8ZGZuPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2Rmbj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxhYmVsIiBwcmlvcml0eT0iMSI+Ci0gICAgPGR0Pjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2R0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaXRlbSIgcHJpb3JpdHk9IjIiPgotICAgIDxkZD4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L2RkPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzb3VyY2UiPgotICAgIDxwPjxmb250IHNpemU9Ii0xIj48cHJlPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L3ByZT48L2ZvbnQ+PC9wPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0YWJsZSI+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMiI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC90YWJsZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idHIiPgotICAgIDx0cj48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC90cj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGgiPgotICAgIDx0ZCBiZ2NvbG9yPSIjMDM5YWNjIiBjb2xzcGFuPSJ7QGNvbHNwYW59IiByb3dzcGFuPSJ7QHJvd3NwYW59IiB2YWxpZ249ImNlbnRlciIgYWxpZ249ImNlbnRlciI+Ci0gICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci0gICAgICAgIDxiPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2I+JiMxNjA7Ci0gICAgICA8L2ZvbnQ+Ci0gICAgPC90ZD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGQiPgotICAgIDx0ZCBiZ2NvbG9yPSIjYTBkZGYwIiBjb2xzcGFuPSJ7QGNvbHNwYW59IiByb3dzcGFuPSJ7QHJvd3NwYW59IiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+JiMxNjA7Ci0gICAgICA8L2ZvbnQ+Ci0gICAgPC90ZD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idG4iPgotICAgIDx0ZCBiZ2NvbG9yPSIjZmZmZmZmIiBjb2xzcGFuPSJ7QGNvbHNwYW59IiByb3dzcGFuPSJ7QHJvd3NwYW59Ij4KLSAgICAgICYjMTYwOwotICAgIDwvdGQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci08IS0tIG1hcmt1cCAtLT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJlbSI+Ci0gICAgPGI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvYj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icmVmIj4KLSAgICA8aT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9pPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvZGUiPgotICAgIDxjb2RlPjxmb250IGZhY2U9ImNvdXJpZXIsIG1vbm9zcGFjZWQiPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2ZvbnQ+PC9jb2RlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImJyIj4KLSAgICA8YnIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi08IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci08IS0tIGxpbmtzIC0tPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxpbmsiPgotICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAYW5jaG9yKT0wIj4KLSAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAaWRyZWYpPTAiPgotICAgICAgICA8IS0teHNsOmFwcGx5LXRlbXBsYXRlcy8tLT4KLSAgICAgIDwveHNsOmlmPgotICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKEBpZHJlZik+MCI+Ci0gICAgICAgIDxhIGhyZWY9IntAaWRyZWZ9Lmh0bWwiPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+Ci0gICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDppZj4KLQotICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAYW5jaG9yKT4wIj4KLSAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAaWRyZWYpPTAiPgotICAgICAgICA8YSBocmVmPSIje0BhbmNob3J9Ij48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9hPgotICAgICAgPC94c2w6aWY+Ci0gICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoQGlkcmVmKT4wIj4KLSAgICAgICAgPGEgaHJlZj0ie0BpZHJlZn0uaHRtbCN7QGFuY2hvcn0iPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+Ci0gICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDppZj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYW5jaG9yIj4KLSAgICA8YSBuYW1lPSJ7QG5hbWV9Ij48eHNsOmNvbW1lbnQ+YW5jaG9yPC94c2w6Y29tbWVudD48L2E+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Imp1bXAiPgotICAgIDxhIGhyZWY9IntAaHJlZn0iPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9zMS9zMi8vaW1nIj4KLSAgICA8aW1nIHNyYz0iaW1hZ2VzL3tAc3JjfSIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJyZXNvdXJjZS1yZWYiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmVzb3VyY2VGaWxlIiAKLSAgICAgICAgICBzZWxlY3Q9ImRvY3VtZW50KCRzdHlsZWJvb2sucHJvamVjdCkvYm9vay9yZXNvdXJjZXMvQHNvdXJjZSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ieHJlZiIgc2VsZWN0PSJAaWRyZWYiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhyZWYiCi0gICAgICAgICAgc2VsZWN0PSJkb2N1bWVudCgkcmVzb3VyY2VGaWxlKS9yZXNvdXJjZXMvcmVzb3VyY2VbQGlkPSR4cmVmXS9AbG9jYXRpb24iLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImxhYmVsIgotICAgICAgICAgIHNlbGVjdD0iZG9jdW1lbnQoJHJlc291cmNlRmlsZSkvcmVzb3VyY2VzL3Jlc291cmNlW0BpZD0keHJlZl0vQHRpdGxlIi8+Ci0gICAgPEEgaHJlZj0ieyRocmVmfSIgdGFyZ2V0PSJfdG9wIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxhYmVsIi8+PC9BPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJodW1hbi1yZXNvdXJjZS1yZWYiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmVzb3VyY2VGaWxlIiAKLSAgICAgICAgICBzZWxlY3Q9ImRvY3VtZW50KCRzdHlsZWJvb2sucHJvamVjdCkvYm9vay9yZXNvdXJjZXMvQHNvdXJjZSIvPiAgCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWYiICBzZWxlY3Q9IkBpZHJlZiIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbHRvIgotICAgICAgICAgIHNlbGVjdD0iZG9jdW1lbnQoJHJlc291cmNlRmlsZSkvcmVzb3VyY2VzL2h1bWFuLXJlc291cmNlW0BpZD0kcmVmXS9AbWFpbHRvIi8+Ci0gICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiCi0gICAgICAgICAgc2VsZWN0PSJkb2N1bWVudCgkcmVzb3VyY2VGaWxlKS9yZXNvdXJjZXMvaHVtYW4tcmVzb3VyY2VbQGlkPSRyZWZdL0BuYW1lIi8+ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICA8QSBocmVmPSJtYWlsdG86eyRtYWlsdG99Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48L0E+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3Mvc3R5bGUvc3R5bGVzaGVldHMvZG9uZS54c2wgYi94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy9kb25lLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4OGVkOC4uMDAwMDAwMAotLS0gYS94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy9kb25lLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci0KLTwhRE9DVFlQRSB4c2w6c3R5bGVzaGVldD4KLQotPCEtLSBYU0wgU3R5bGUgc2hlZXQsIERURCBvbWl0dGVkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gIDx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIi8+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJDb21taXRzIj4KLSAgPHhzbDpjb21tZW50PlRoaXMgWE1MIGZyYWdtZW50IGNvbnRhaW5zIGEgbGlzdCBvZiBzb3VyY2UgY29kZSB1cGRhdGVzIHRvIHBsYWNlIGluIGFuICZsdDtzMyZndDsgc2VjdGlvbiBvZiByZWFkbWUueG1sPC94c2w6Y29tbWVudD4KLSAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KENvbW1pdFtAY2F0ZWdvcnk9J2NvcmUnXSk+MCI+Ci0gICAgICA8cD5Db3JlIHNvdXJjZSBjb2RlIHVwZGF0ZXM6PC9wPgotICAgICAgPHVsPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkNvbW1pdFtAY2F0ZWdvcnk9J2NvcmUnXSI+Ci0gICAgICAgIDxsaT48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ildob3xEYXRlQ29tbWl0dGVkfE1vZGlmaWVkfEFkZGVkfFJlbW92ZWR8TG9nIi8+PC9saT4KLSAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgPC91bD4KLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KENvbW1pdFtAY2F0ZWdvcnk9J2NvcmUnXSk9MCI+Ci0gICAgICA8bm90ZT5UaGlzIHJlbGVhc2UgaW5jbHVkZXMgbm8gdXBkYXRlcyBvZiB0aGUgY29yZSBzb3VyY2UgY29kZS48L25vdGU+Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDppZiB0ZXN0PSJjb3VudChDb21taXRbQGNhdGVnb3J5PSdjb21wYXQnXSk+MCI+Ci0gICAgICA8cD5Db21wYXRpYmlsaXR5IHNvdXJjZSBjb2RlIHVwZGF0ZXM6PC9wPgotICAgICAgPHVsPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkNvbW1pdFtAY2F0ZWdvcnk9J2NvbXBhdCddIj4KLSAgICAgICAgPGxpPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iV2hvfERhdGVDb21taXR0ZWR8TW9kaWZpZWR8QWRkZWR8UmVtb3ZlZHxMb2ciLz48L2xpPgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICA8L3VsPgotICAgIDwveHNsOmlmPgotICAgIDx4c2w6aWYgdGVzdD0iY291bnQoQ29tbWl0W0BjYXRlZ29yeT0nY29tcGF0J10pPTAiPgotICAgICAgPG5vdGU+VGhpcyByZWxlYXNlIGluY2x1ZGVzIG5vIHVwZGF0ZXMgb2YgdGhlIGNvbXBhdGliaWxpdHkgc291cmNlIGNvZGUuPC9ub3RlPgotICAgIDwveHNsOmlmPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IldobyI+Ci0gICAgPHJlZj5Db21taXR0ZWQgYnkgPC9yZWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkRhdGVDb21taXR0ZWQiPgotICAgIDxyZWY+IG9uIDwvcmVmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PGJyLz4KLSAgPC94c2w6dGVtcGxhdGU+ICAgIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJNb2RpZmllZCI+ICAgIAotICAgIDxyZWY+TW9kaWZpZWQ6IDwvcmVmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PGJyLz4KLSAgPC94c2w6dGVtcGxhdGU+ICAgIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJBZGRlZCI+ICAgIAotICAgIDxyZWY+QWRkZWQ6IDwvcmVmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PGJyLz4KLSAgPC94c2w6dGVtcGxhdGU+ICAgIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJSZW1vdmVkIj4gICAgCi0gICAgPHJlZj5SZW1vdmVkOiA8L3JlZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjxici8+Ci0gIDwveHNsOnRlbXBsYXRlPiAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJMb2ciPiAgICAKLSAgICA8cmVmPkNvbW1pdHRlcidzIGxvZyBlbnRyeTogPC9yZWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48YnIvPjxici8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3Mvc3R5bGUvc3R5bGVzaGVldHMvc3BlYy54c2wgYi94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy9zcGVjLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkNzNiZC4uMDAwMDAwMAotLS0gYS94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy9zcGVjLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotCi08IURPQ1RZUEUgeHNsOnN0eWxlc2hlZXQgWwotPCFFTlRJVFkgY29weSAgICImIzE2OTsiPgotPCFFTlRJVFkgbmJzcCAgICImIzE2MDsiPgotXT4KLQotPCEtLSBYU0wgU3R5bGUgc2hlZXQsIERURCBvbWl0dGVkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICAgICAgICAgICAgICB4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi5saWIuUmVkaXJlY3QiCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KLSAgPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiIvPgotICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdlLXJvb3QiIHNlbGVjdD0iJy4uLy4uLy4uL3NyYy8nIi8+ICA8IS0tIHJvb3Qgb2YgZGVzdGluYXRpb24gZm9yIHBhY2thZ2UuaHRtbCBmaWxlcyAtLT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzcGVjIj4KLSAgICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+Ci0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImhlYWRlci90aXRsZSIvPgotICAgICAgICA8L3RpdGxlPgotICAgICAgPC9oZWFkPgotICAgICAgPGJvZHk+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic3BlYy90aXRsZVsxXSI+Ci0gICAgPGgxPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2gxPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmcm9udG1hdHRlci9wdWJkYXRlIj4KLSAgICA8cD48Yj5FZGl0IERhdGU6IDwvYj48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9wPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmcm9udG1hdHRlci9jb3B5cmlnaHQiPgotICAgIDwhLS0gcD4mY29weTs8eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9wIC0tPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmcm9udG1hdHRlci9hdXRob3IiPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InNwZWMvdGl0bGUiPgotICAgIDxoMj4KLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlkIj4KLSAgICAgICAgICA8YSBuYW1lPSJAaWQiPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgICAgIDwvYT4KLSAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC9oMj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImFwcGx5LWlkLXRlbXBsYXRlcyI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGlkIj4KLSAgICAgICAgPGEgbmFtZT0ie0BpZH0iPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgICAgPC9hPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InNlY3QyL3RpdGxlIHwgc3BlYy8qL3RpdGxlIj4KLSAgICA8aDM+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktaWQtdGVtcGxhdGVzIi8+Ci0gICAgPC9oMz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzZWN0My90aXRsZSI+Ci0gICAgPGg0PgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LWlkLXRlbXBsYXRlcyIvPgotICAgIDwvaDQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InNlY3Q0L3RpdGxlIj4KLSAgICA8aDU+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktaWQtdGVtcGxhdGVzIi8+Ci0gICAgPC9oNT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYXJhIj4KLSAgICA8cD48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9wPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ2YXJpYWJsZWxpc3QiPgotICAgIDx1bD4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0idmFybGlzdGVudHJ5Ij4KLSAgICAgIDxsaT4KLSAgICAgICAgPHA+PGI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0ZXJtIi8+PC9iPjxici8+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibGlzdGl0ZW0iLz48L3A+Ci0gICAgICA8L2xpPgotICAgIDwveHNsOmZvci1lYWNoPgotICAgIDwvdWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im9yZGVyZWRsaXN0Ij4KLSAgICA8b2w+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Imxpc3RpdGVtIj4KLSAgICAgIDxsaT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9saT4KLSAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8L29sPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYXR0ZXJucyI+Ci0gICAgPEgzPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbW9kdWxlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PlBhdHRlcm5zPC9IMz4KLSAgICA8dWw+Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icGF0dGVybiI+Ci0gICAgICAgIDxwPgotICAgICAgICAgIDxiPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhdHRlcm4tbmFtZSI+Ci0gICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1pZC10ZW1wbGF0ZXMiLz4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgIDwvYj4KLSAgICAgICAgICA8YnIvPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IipbbmFtZSgpICE9ICdwYXR0ZXJuLW5hbWUnXSIvPjwvcD4KLSAgICAgIDwveHNsOmZvci1lYWNoPgotICAgIDwvdWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGF0dGVybi9pbnRlbnQiPgotICAgIDxici8+PGk+SW50ZW50OiA8L2k+PHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhdHRlcm4vcmVzcG9uc2liaWxpdGllcyI+Ci0gICAgPGJyLz48aT5SZXNwb25zaWJpbGl0aWVzOiA8L2k+PHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYXR0ZXJuL3BvdGVudGlhbC1hbHRlcm5hdGUtbmFtZSI+Ci0gICAgPGJyLz48aT5Qb3RlbnRpYWwgYWx0ZXJuYXRlIG5hbWU6IDwvaT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGF0dGVybi90aHJlYWQtc2FmZXR5Ij4KLSAgICA8YnIvPjxpPlRocmVhZCBzYWZldHk6IDwvaT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhdHRlcm4vbm90ZXMiPgotICAgIDxici8+PGk+Tm90ZXM6IDwvaT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb2dyYW1saXN0aW5nIj4KLSAgICA8Y29kZT4KLSAgICA8cHJlPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwvcHJlPgotICAgIDwvY29kZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJsaW5rIj4KLSAgICA8QSBocmVmPSIje0BsaW5rZW5kfSI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC9BPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idWxpbmsiPgotICAgIDxBIGhyZWY9IntAdXJsfSI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC9BPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXJtcmVmIj4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbGluay11cmwiPgotICAgICAgICA8QSBocmVmPSIje0BsaW5rLXVybH0iPgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+Ci0gICAgICAgIDwvQT4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPFU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L1U+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBsaW5rIj4KLSAgICA8eHNsOnRleHQ+e0BsaW5rIDwveHNsOnRleHQ+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotICAgIDx4c2w6dGV4dD59PC94c2w6dGV4dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzZWN0MVtAaWQ9J3BhY2thZ2UnXSI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWxlbmFtZSIgc2VsZWN0PSJjb25jYXQoJHBhY2thZ2Utcm9vdCx0cmFuc2xhdGUodGl0bGUsJy4nLCAnLycpLCcvcGFja2FnZS5odG1sJykiLz4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRmaWxlbmFtZX0iPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN1Yi1wYWNrYWdlIi8+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzZWN0MltAaWQ9J3NwZWNpYWxpemVkLXBhY2thZ2VzJ10iPgotICAgIDx4c2w6bWVzc2FnZT5Gb3VuZCBzcGVjaWFsaXplZC1wYWNrYWdlczwveHNsOm1lc3NhZ2U+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InNlY3QzIj4KLQkgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlsZW5hbWUiIHNlbGVjdD0iY29uY2F0KCRwYWNrYWdlLXJvb3QsdHJhbnNsYXRlKHRpdGxlLCcuJywgJy8nKSwnL3BhY2thZ2UuaHRtbCcpIi8+Ci0gICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRmaWxlbmFtZX0iPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3ViLXBhY2thZ2UiLz4KLSAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdWItcGFja2FnZSI+Ci0gICAgPGh0bWw+Ci0gICAgICAgPGhlYWQ+Ci0gICAgICAgICA8dGl0bGU+Ci0gICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0aXRsZSIvPgotICAgICAgICAgPC90aXRsZT4KLSAgICAgICA8L2hlYWQ+Ci0gICAgICAgPGJvZHk+Ci0gICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Iipbbm90IChuYW1lKCk9J3RpdGxlJyldIi8+Ci0gICAgICAgPC9ib2R5PgotICAgICA8L2h0bWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLTwveHNsOnN0eWxlc2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL3hkb2NzL3N0eWxlL3N0eWxlc2hlZXRzL3htbDJmby54c2wgYi94ZG9jcy9zdHlsZS9zdHlsZXNoZWV0cy94bWwyZm8ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDU5MzBkLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3N0eWxlL3N0eWxlc2hlZXRzL3htbDJmby54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0ODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0gICAgWFNMVCBzdHlsZXNoZWV0IHRvIGNvbnZlcnQgdGhlIFhhbGFuIGRvY3VtZW50YXRpb24gY29sbGVjdGVkIGluIG9uZSB4bWwgZmlsZSBpbnRvIGEgZm8gZmlsZQotICAgICAgICBmb3IgdXNlIGluIEZPUCAKLQotVEJEOiAtIFRoZSBmYXEgZG9lc24ndCBzaG93IGluIHRoZSBjb250ZW50Ci0gICAgIC0gY2hlY2sgd2h5IG1hcmdpbi1ib3R0b20gb24gdGhlIHBhZ2Ugd2l0aCBwcm9wZXJ0aWVzIGlzIHRvbyBsYXJnZQotICAgICAtIGNoZWNrIHdoeSBrZWVwLW5leHQgbm90IG9ubHkgZG9lc24ndCB3b3JrLCBidXQgbGVhZHMgdG8gcmVwZWF0aW5nIGFscmVhZHkgcHJpbnRlZCBsaW5lcwotICAgICAtIG1ha2UgbGluZXMgY29udGFpbmluZyBvbmx5IGNvZGUgbG9vayBuaWNlciAoc21hbGxlciBsaW5lIGhlaWdodCkKLSAgICAgLSByZXBsYWNlIGJ1bGxldHMgaW4gb3JkZXJlZCBsaXN0cyB3aXRoIG51bWJlcnMKLSAgICAgLSBjb3JyZWN0IHRoZSBoYWNrIHJlcGxhY2luZyBuYnNwIHdpdGggJy0nCi0gICAgIC0gaGFuZGxlIHRoZSBsaW5rcyBjb3JyZWN0bHkgd2hpY2ggaGF2ZSBiZWVuIGV4dGVybmFsIGluIHRoZSBodG1sIGRvYyBhbmQgYXJlIG5vdyBpbnRlcm5hbAotCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0Ci0gICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0gICAgIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotICAgICAKLSAgICAgPCEtLSB0byB1c2Ugd2l0aCBkb2N1bWVudCgpIHRvIGdldCByZXNvdXJjZXMueG1sIC0tPgotICAgIDx4c2w6cGFyYW0gbmFtZT0icmVzb3VyY2VGaWxlIiBzZWxlY3Q9IicuLi8uLi9zb3VyY2VzL3hhbGFuL3Jlc291cmNlcy54bWwnIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJwcm9qZWN0IiBzZWxlY3Q9IlhhbGFuIi8+Ci0gICAgICAgICAgICAgIAotPHhzbDp0ZW1wbGF0ZSBtYXRjaCA9Ii8iPgotCTxmbzpyb290IHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotCi0JICA8IS0tIGRlZmluZXMgcGFnZSBsYXlvdXQgLS0+Ci0JICA8Zm86bGF5b3V0LW1hc3Rlci1zZXQ+Ci0JCTxmbzpzaW1wbGUtcGFnZS1tYXN0ZXIgbWFzdGVyLW5hbWU9InNpbXBsZSIKLQkJCQkJCQkgICBwYWdlLWhlaWdodD0iMjkuN2NtIiAKLQkJCQkJCQkgICBwYWdlLXdpZHRoPSIyMWNtIgotCQkJCQkJCSAgIG1hcmdpbi10b3A9IjEuNWNtIiAKLQkJCQkJCQkgICBtYXJnaW4tYm90dG9tPSIyY20iIAotCQkJCQkJCSAgIG1hcmdpbi1sZWZ0PSIyLjVjbSIgCi0JCQkJCQkJICAgbWFyZ2luLXJpZ2h0PSIyLjVjbSI+Ci0JCSAgPGZvOnJlZ2lvbi1ib2R5IG1hcmdpbi10b3A9IjNjbSIvPgotCQkgIDxmbzpyZWdpb24tYmVmb3JlIGV4dGVudD0iMS41Y20iLz4KLQkJICA8Zm86cmVnaW9uLWFmdGVyIGV4dGVudD0iMS41Y20iLz4KLQkJPC9mbzpzaW1wbGUtcGFnZS1tYXN0ZXI+Ci0JICA8L2ZvOmxheW91dC1tYXN0ZXItc2V0PgotCi0JICA8Zm86cGFnZS1zZXF1ZW5jZSBtYXN0ZXItbmFtZT0ic2ltcGxlIj4KLQkJPGZvOnN0YXRpYy1jb250ZW50IGZsb3ctbmFtZT0ieHNsLXJlZ2lvbi1iZWZvcmUiPgotCQkJPGZvOmJsb2NrIHRleHQtYWxpZ249ImVuZCIgCi0JCQkgICAgCSAgZm9udC1zaXplPSIxMHB0IiAKLQkJCQkJICBmb250LWZhbWlseT0ic2VyaWYiIAotCQkJCQkgIGxpbmUtaGVpZ2h0PSIxNHB0IiA+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9qZWN0Ii8+IGRvY3VtZW50YXRpb24gLSBwLiA8Zm86cGFnZS1udW1iZXIvPgotCQkJPC9mbzpibG9jaz4KLQkJPC9mbzpzdGF0aWMtY29udGVudD4gCi0KLQkJPGZvOmZsb3cgZmxvdy1uYW1lPSJ4c2wtcmVnaW9uLWJvZHkiPgotCi0gICAgICAgICAgPGZvOmJsb2NrIGZvbnQtc2l6ZT0iMThwdCIgCi0gICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiAKLSAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ9IjI0cHQiCi0gICAgICAgICAgICAgICAgICAgIHNwYWNlLWFmdGVyLm9wdGltdW09IjE1cHQiCi0gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I9ImJsdWUiCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yPSJ3aGl0ZSIKLSAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbj0iY2VudGVyIj4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvamVjdCIvPiAtIGFuIFhTTCBUcmFuc2Zvcm1lcgotICAgICAgICAgIDwvZm86YmxvY2s+Ci0KLQotICAgICAgICA8IS0tIGdlbmVyYXRlcyB0YWJsZSBvZiBjb250ZW50cyBhbmQgcHV0cyBpdCBpbnRvIGEgdGFibGUgLS0+Ci0KLSAgICAgICAgIDxmbzpibG9jayBmb250LXNpemU9IjE0cHQiIAotICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIAotICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ9IjE4cHQiCi0gICAgICAgICAgICAgICAgICBzcGFjZS1hZnRlci5vcHRpbXVtPSIxMHB0IgotICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ9ImJvbGQiCi0gICAgICAgICAgICAgICAgICBzdGFydC1pbmRlbnQ9IjE1cHQiPgotICAgICAgICAgICAgQ29udGVudAotICAgICAgICAgPC9mbzpibG9jaz4KLQotICAgICAgICAgPGZvOnRhYmxlPgotICAgICAgICAgICAgPGZvOnRhYmxlLWNvbHVtbiBjb2x1bW4td2lkdGg9IjFjbSIvPgotICAgICAgICAgICAgPGZvOnRhYmxlLWNvbHVtbiBjb2x1bW4td2lkdGg9IjEwY20iLz4KLSAgICAgICAgICAgIDxmbzp0YWJsZS1jb2x1bW4gY29sdW1uLXdpZHRoPSI1Y20iLz4KLSAgICAgICAgICAgIDxmbzp0YWJsZS1ib2R5IGZvbnQtc2l6ZT0iMTJwdCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodD0iMTZwdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIj4KLSAgICAgICAgICAgICAgPGZvOnRhYmxlLXJvdz4KLSAgICAgICAgICAgICAgICAgIDxmbzp0YWJsZS1jZWxsPgotICAgICAgICAgICAgICAgICAgICAgPGZvOmJsb2NrIHRleHQtYWxpZ249ImVuZCIgPgotICAgICAgICAgICAgICAgICAgICAgPC9mbzpibG9jaz4KLSAgICAgICAgICAgICAgICAgIDwvZm86dGFibGUtY2VsbD4KLSAgICAgICAgICAgICAgICAgIDxmbzp0YWJsZS1jZWxsPgotICAgICAgICAgICAgICAgICAgICAgPGZvOmJsb2NrIHRleHQtYWxpZ249ImVuZCIgPgotICAgICAgICAgICAgICAgICAgICAgPC9mbzpibG9jaz4KLSAgICAgICAgICAgICAgICAgIDwvZm86dGFibGUtY2VsbD4KLSAgICAgICAgICAgICAgICAgIDxmbzp0YWJsZS1jZWxsPgotICAgICAgICAgICAgICAgICAgICAgPGZvOmJsb2NrIHRleHQtYWxpZ249ImVuZCIgPgotICAgICAgICAgICAgICAgICAgICAgcGFnZQotICAgICAgICAgICAgICAgICAgICAgPC9mbzpibG9jaz4KLSAgICAgICAgICAgICAgICAgIDwvZm86dGFibGUtY2VsbD4KLSAgICAgICAgICAgICAgPC9mbzp0YWJsZS1yb3c+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJkb2N1bWVudGF0aW9uL2NoYXB0ZXIiPiAKLSAgICAgICAgICAgICAgICA8Zm86dGFibGUtcm93PgotICAgICAgICAgICAgICAgICAgPGZvOnRhYmxlLWNlbGw+Ci0gICAgICAgICAgICAgICAgICAgICA8Zm86YmxvY2sgdGV4dC1hbGlnbj0iZW5kIiA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm51bWJlciB2YWx1ZT0icG9zaXRpb24oKSIgZm9ybWF0PSJJIi8+LiAgCi0gICAgICAgICAgICAgICAgICAgICA8L2ZvOmJsb2NrPgotICAgICAgICAgICAgICAgICAgPC9mbzp0YWJsZS1jZWxsPgotICAgICAgICAgICAgICAgICAgPGZvOnRhYmxlLWNlbGw+Ci0gICAgICAgICAgICAgICAgICAgICA8Zm86YmxvY2sgIHRleHQtYWxpZ249InN0YXJ0IiA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Zm86YmFzaWMtbGluayBjb2xvcj0iYmx1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpbnRlcm5hbC1kZXN0aW5hdGlvbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzMS9AdGl0bGV8ZmFxcy9AdGl0bGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZm86YmFzaWMtbGluaz4KLSAgICAgICAgICAgICAgICAgICAgIDwvZm86YmxvY2s+Ci0gICAgICAgICAgICAgICAgICA8L2ZvOnRhYmxlLWNlbGw+Ci0gICAgICAgICAgICAgICAgICA8Zm86dGFibGUtY2VsbD4KLSAgICAgICAgICAgICAgICAgICAgIDxmbzpibG9jayB0ZXh0LWFsaWduPSJlbmQiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIDxmbzpwYWdlLW51bWJlci1jaXRhdGlvbiByZWYtaWQ9IntAaWR9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICA8L2ZvOmJsb2NrPgotICAgICAgICAgICAgICAgICAgPC9mbzp0YWJsZS1jZWxsPgotICAgICAgICAgICAgICAgPC9mbzp0YWJsZS1yb3c+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDwvZm86dGFibGUtYm9keT4KLSAgICAgICAgIDwvZm86dGFibGU+Ci0JCSA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IAotCSAgIDwvZm86Zmxvdz4KLQkgICA8L2ZvOnBhZ2Utc2VxdWVuY2U+Ci0JPC9mbzpyb290PgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS1jaGFwdGVyLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGFwdGVyIj4KLSAgPGZvOmJsb2NrIGlkPSJ7QGlkfSIgYnJlYWstYmVmb3JlPSJwYWdlIi8+Ci0JPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAgIAotPC94c2w6dGVtcGxhdGU+ICAKLQotPCEtLSBzMSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2ggPSJzMSI+Ci0gICA8Zm86YmxvY2sgZm9udC1zaXplPSIxOHB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiAKLSAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIyNHB0IgotICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm9wdGltdW09IjE1cHQiCi0gICAgICAgICAgICBzcGFjZS1hZnRlci5vcHRpbXVtPSIxNXB0IgotICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcj0iYmx1ZSIKLSAgICAgICAgICAgIGNvbG9yPSJ3aGl0ZSIKLSAgICAgICAgICAgIGtlZXAtd2l0aC1uZXh0LndpdGhpbi1wYWdlPSJhbHdheXMiCi0gICAgICAgICAgICB0ZXh0LWFsaWduPSJjZW50ZXIiPgotICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZCI+Ci0gICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoQHRpdGxlLCcgKSwtLignLCdfX19fJykiLz4KLSAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRpdGxlIi8+Ci0gICA8L2ZvOmJsb2NrPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4gCi08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBzMiAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2ggPSJzMiI+Ci0gICA8Zm86YmxvY2sgZm9udC1zaXplPSIxNnB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiAKLSAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIyMHB0IgotICAgICAgICAgICAga2VlcC13aXRoLW5leHQud2l0aGluLXBhZ2U9ImFsd2F5cyIgICAgICAgICAgICAKLSAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5vcHRpbXVtPSIxNXB0IgotICAgICAgICAgICAgc3BhY2UtYWZ0ZXIub3B0aW11bT0iMTJwdCIKLSAgICAgICAgICAgIHRleHQtYWxpZ249InN0YXJ0IgotICAgICAgICAgICAgcGFkZGluZy10b3A9IjNwdCIKLSAgICAgICAgICAgID4KLSAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPgotICAgPC9mbzpibG9jaz4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IAotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gczMgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoID0iczMiPgotICAgPGZvOmJsb2NrIGZvbnQtc2l6ZT0iMTRwdCIgCi0gICAgICAgICAgICBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgCi0gICAgICAgICAgICBsaW5lLWhlaWdodD0iMThwdCIKLSAgICAgICAgICAgIGtlZXAtd2l0aC1uZXh0LndpdGhpbi1wYWdlPSJhbHdheXMiCi0gICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iMTBwdCIKLSAgICAgICAgICAgIHNwYWNlLWFmdGVyLm9wdGltdW09IjlwdCIKLSAgICAgICAgICAgIHRleHQtYWxpZ249InN0YXJ0IgotICAgICAgICAgICAgcGFkZGluZy10b3A9IjNwdCI+Ci0gICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGl0bGUiLz4KLSAgIDwvZm86YmxvY2s+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIHAgIFtub3QoY29kZSldIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaCA9InAiPiAKLSAgIDxmbzpibG9jayBmb250LXNpemU9IjExcHQiIAotICAgICAgICAgICAgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIAotICAgICAgICAgICAgbGluZS1oZWlnaHQ9IjEzcHQiCi0gICAgICAgICAgICBzcGFjZS1hZnRlci5vcHRpbXVtPSIzcHQiCi0gICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iM3B0IgotICAgICAgICAgICAgdGV4dC1hbGlnbj0ic3RhcnQiPgotICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IAotICAgPC9mbzpibG9jaz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoID0ibm90ZSI+IAotICAgPGZvOmJsb2NrIGZvbnQtc2l6ZT0iMTFwdCIgCi0gICAgICAgICAgICBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgCi0gICAgICAgICAgICBmb250LXdlaWdodD0iaXRhbGljIgotICAgICAgICAgICAgbGluZS1oZWlnaHQ9IjEzcHQiCi0gICAgICAgICAgICBzcGFjZS1hZnRlci5vcHRpbXVtPSIzcHQiCi0gICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iM3B0IgotICAgICAgICAgICAgdGV4dC1hbGlnbj0ic3RhcnQiPgotICAgICAgICBOb3RlOiAgICAgCi0gICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4gCi0gICA8L2ZvOmJsb2NrPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImFuY2hvciI+Ci0gIDxmbzpibG9jaz4gPCEtLWlkPSJjb25jYXQobG9jYWwtbmFtZShhbmNlc3Rvcjo6bm9kZSgpPSJjaGFwdGVyIi9AaWQuLCdfJyx7Li9AbmFtZX0iLy0tPgotICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlkIj4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoYW5jZXN0b3I6OmNoYXB0ZXIvQGlkLCdfJywuL0BuYW1lKSIvPgotICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgPC9mbzpibG9jaz4gICAgCi08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGFibGUiPgotICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbHdpZHRoIiBzZWxlY3Q9IjE0LjUgZGl2IGNvdW50KHRyWzFdL3RkKSIvPgotICA8Zm86dGFibGU+Ci0gIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJ0clsxXS90ZCI+Ci0gICAgPGZvOnRhYmxlLWNvbHVtbiBjb2x1bW4td2lkdGg9InskY29sd2lkdGh9Y20iLz4KLSAgPC94c2w6Zm9yLWVhY2g+Ci0gIDxmbzp0YWJsZS1ib2R5IGZvbnQtc2l6ZT0iMTBwdCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiPgotICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwvZm86dGFibGUtYm9keT4KLSAgPC9mbzp0YWJsZT4gIAotPC94c2w6dGVtcGxhdGU+ICAKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRyIj4KLSAgPGZvOnRhYmxlLXJvdz4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwvZm86dGFibGUtcm93PgotPC94c2w6dGVtcGxhdGU+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZCI+Ci0gIDxmbzp0YWJsZS1jZWxsPgotICAgIDxmbzpibG9jaz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L2ZvOmJsb2NrPgotICAgPC9mbzp0YWJsZS1jZWxsPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gcCArIGNvZGUgCi08eHNsOnRlbXBsYXRlIG1hdGNoID0icFtjb2RlXSI+Ci0gICA8Zm86YmxvY2sgZm9udC1zaXplPSIxMXB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiAKLSAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIxMXB0IgotICAgICAgICAgICAgc3BhY2UtYWZ0ZXIub3B0aW11bT0iMHB0IgotICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm9wdGltdW09IjBwdCIKLSAgICAgICAgICAgIHRleHQtYWxpZ249InN0YXJ0Ij4KLSAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgIDwvZm86YmxvY2s+Ci08L3hzbDp0ZW1wbGF0ZT4KLS0tPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJpbWciPgotICA8Zm86YmxvY2s+Ci0gICAgPGZvOmV4dGVybmFsLWdyYXBoaWMgc3JjPSJmaWxlOmJ1aWxkL2RvY3MvaW1hZ2VzL3tAc3JjfSIvPgotICA8L2ZvOmJsb2NrPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gZmFxcyAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2ggPSJmYXFzIj4KLSAgIDxmbzpibG9jayBmb250LXNpemU9IjE4cHQiIAotICAgICAgICAgICAgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIAotICAgICAgICAgICAgbGluZS1oZWlnaHQ9IjI0cHQiCi0gICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iMTVwdCIKLSAgICAgICAgICAgIHNwYWNlLWFmdGVyLm9wdGltdW09IjE1cHQiCi0gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yPSJibHVlIgotICAgICAgICAgICAgY29sb3I9IndoaXRlIgotICAgICAgICAgICAgdGV4dC1hbGlnbj0iY2VudGVyIgotICAgICAgICAgICAgPgotICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZCI+Ci0gICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoLiwnICksLS4oJywnX19fXycpIi8+Ci0gICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPgotICAgPC9mbzpibG9jaz4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IAotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gZmFxIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaCA9ImZhcSI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIHEgaW4gZmFxIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icSI+Ci0gICA8Zm86YmxvY2sgZm9udC1zaXplPSIxNHB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiAKLSAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIxOHB0IgotICAgICAgICAgICAga2VlcC13aXRoLW5leHQud2l0aGluLXBhZ2U9ImFsd2F5cyIKLSAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5vcHRpbXVtPSIxMHB0IgotICAgICAgICAgICAgc3BhY2UtYWZ0ZXIub3B0aW11bT0iOXB0IgotICAgICAgICAgICAgdGV4dC1hbGlnbj0ic3RhcnQiCi0gICAgICAgICAgICBwYWRkaW5nLXRvcD0iM3B0Ij4gICAgIAotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgICA8L2ZvOmJsb2NrPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gYSBpbiBmYXEgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoID0iYSI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IAotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSBqdW1wIChsaW5rcykgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoID0ianVtcCI+Ci0gIDxmbzpiYXNpYy1saW5rIGNvbG9yPSJibHVlIj4KLSAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWwtZGVzdGluYXRpb24iPgotICAgICAgIDx4c2w6aWYgdGVzdD0ic3RhcnRzLXdpdGgoQGhyZWYsJ2FwaWRvY3MnKSI+Ci0gICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KCdodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai8nLEBocmVmKSIvPgotICAgICAgIDwveHNsOmlmPgotICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KHN0YXJ0cy13aXRoKEBocmVmLCdhcGlkb2NzJykpIj4KLSAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaHJlZiIvPgotICAgICAgIDwveHNsOmlmPiAgICAKLSAgICAgPC94c2w6YXR0cmlidXRlPiAgCi0gICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi90ZXh0KCkiLz4KLSAgICAgPCEtLXhzbDphcHBseS10ZW1wbGF0ZXMvLS0+IAotICAgPC9mbzpiYXNpYy1saW5rPgotPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibGluayI+Ci0gICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKEBhbmNob3IpPTAiPgotICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKEBpZHJlZik9MCI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgIDwveHNsOmlmPgotICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKEBpZHJlZik+MCI+Ci0gICAgICAgIDxmbzpiYXNpYy1saW5rIGNvbG9yPSJibHVlIiBpbnRlcm5hbC1kZXN0aW5hdGlvbj0ie0BpZHJlZn0iPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi90ZXh0KCkiLz48L2ZvOmJhc2ljLWxpbms+Ci0gICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDppZj4KLQotICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAYW5jaG9yKT4wIj4KLSAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAaWRyZWYpPTAiPgotICAgICAgICA8Zm86YmFzaWMtbGluayBjb2xvcj0iYmx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC1kZXN0aW5hdGlvbj0ie2NvbmNhdChhbmNlc3Rvcjo6Y2hhcHRlci9AaWQsJ18nLEBhbmNob3IpfSI+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuL3RleHQoKSIvPjwvZm86YmFzaWMtbGluaz4KLSAgICAgIDwveHNsOmlmPgotICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKEBpZHJlZik+MCI+Ci0gICAgICAgIDxmbzpiYXNpYy1saW5rIGNvbG9yPSJibHVlIiBpbnRlcm5hbC1kZXN0aW5hdGlvbj0ie0BpZHJlZn1fe0BhbmNob3J9Ij4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4vdGV4dCgpIi8+PC9mbzpiYXNpYy1saW5rPgotICAgICAgPC94c2w6aWY+Ci0gICAgPC94c2w6aWY+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InJlc291cmNlLXJlZiI+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0ieHJlZiIgc2VsZWN0PSJAaWRyZWYiLz4KLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJocmVmIgotICAgICAgICAgIHNlbGVjdD0iZG9jdW1lbnQoJHJlc291cmNlRmlsZSkvcmVzb3VyY2VzL3Jlc291cmNlW0BpZD0keHJlZl0vQGxvY2F0aW9uIi8+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0ibGFiZWwiCi0gICAgICAgICAgc2VsZWN0PSJkb2N1bWVudCgkcmVzb3VyY2VGaWxlKS9yZXNvdXJjZXMvcmVzb3VyY2VbQGlkPSR4cmVmXS9AdGl0bGUiLz4KLSAgPGZvOmJhc2ljLWxpbmsgY29sb3I9ImJsdWUiPgotICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbC1kZXN0aW5hdGlvbiI+Ci0gICAgICAgPHhzbDppZiB0ZXN0PSJzdGFydHMtd2l0aCgkaHJlZiwnYXBpZG9jcycpIj4KLSAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJ2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi1qLycsJGhyZWYpIi8+Ci0gICAgICAgPC94c2w6aWY+Ci0gICAgICAgPHhzbDppZiB0ZXN0PSJub3Qoc3RhcnRzLXdpdGgoJGhyZWYsJ2FwaWRvY3MnKSkiPgotICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRocmVmIi8+Ci0gICAgICAgPC94c2w6aWY+ICAgIAotICAgICA8L3hzbDphdHRyaWJ1dGU+ICAKLSAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsYWJlbCIvPgotICAgICA8IS0teHNsOmFwcGx5LXRlbXBsYXRlcy8tLT4gCi0gICA8L2ZvOmJhc2ljLWxpbms+ICAgICAgICAKLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaHVtYW4tcmVzb3VyY2UtcmVmIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJlc291cmNlRmlsZSIgCi0gICAgICAgICAgc2VsZWN0PSIuL3hhbGFuL3Jlc291cmNlcy54bWwiLz4gIAotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmVmIiAgc2VsZWN0PSJAaWRyZWYiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1haWx0byIKLSAgICAgICAgICBzZWxlY3Q9ImRvY3VtZW50KCRyZXNvdXJjZUZpbGUpL3Jlc291cmNlcy9odW1hbi1yZXNvdXJjZVtAaWQ9JHJlZl0vQG1haWx0byIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSIKLSAgICAgICAgICBzZWxlY3Q9ImRvY3VtZW50KCRyZXNvdXJjZUZpbGUpL3Jlc291cmNlcy9odW1hbi1yZXNvdXJjZVtAaWQ9JHJlZl0vQG5hbWUiLz4KLSAgPGZvOmJhc2ljLWxpbmsgY29sb3I9ImJsdWUiIGV4dGVybmFsLWRlc3RpbmF0aW9uPSJtYWlsdG86eyRtYWlsdG99Ij4KLSAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+Ci0gICAgIDwhLS14c2w6YXBwbHktdGVtcGxhdGVzLy0tPiAKLSAgIDwvZm86YmFzaWMtbGluaz4gICAgICAgICAgCi0gIDwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoID0ic291cmNlIj4gCi0gICA8Zm86YmxvY2sgZm9udC1zaXplPSIxMHB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJDb3VyaWVyIiAKLSAgICAgICAgICAgIHRleHQtYWxpZ249InN0YXJ0IgotICAgICAgICAgICAgd2hpdGUtc3BhY2UtY29sbGFwc2U9ImZhbHNlIj4KLSAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgIDwvZm86YmxvY2s+Ci0KLTwveHNsOnRlbXBsYXRlPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoID0iYnIiPgotICA8Zm86YmxvY2s+PC9mbzpibG9jaz4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIGNvZGUgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoID0iKi9jb2RlIj4KLSAgIDxmbzppbmxpbmUgZm9udC1zaXplPSIxMHB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJDb3VyaWVyIj4KLSAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgIDwvZm86aW5saW5lPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gdWwgKHVub3JkZXJlZCBsaXN0KSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2ggPSJ1bCI+Ci0gIDxmbzpsaXN0LWJsb2NrIHN0YXJ0LWluZGVudD0iMWNtIiAKLSAgICAgICAgICAgICAgICAgcHJvdmlzaW9uYWwtZGlzdGFuY2UtYmV0d2Vlbi1zdGFydHM9IjEycHQiIAotICAgICAgICAgICAgICAgICBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgCi0gICAgICAgICAgICAgICAgIGZvbnQtc2l6ZT0iMTFwdCIgCi0gICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIxMXB0Ij4KLSAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgIDwvZm86bGlzdC1ibG9jaz4KLTwveHNsOnRlbXBsYXRlPiAgICAgICAgIAotICAgICAgICAgIAotPCEtLSBvbCAob3JkZXJlZCBsaXN0KSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2ggPSJvbCI+Ci0gIDxmbzpsaXN0LWJsb2NrIHN0YXJ0LWluZGVudD0iMWNtIiAKLSAgICAgICAgICAgICAgICAgcHJvdmlzaW9uYWwtZGlzdGFuY2UtYmV0d2Vlbi1zdGFydHM9IjEycHQiIAotICAgICAgICAgICAgICAgICBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgCi0gICAgICAgICAgICAgICAgIGZvbnQtc2l6ZT0iMTFwdCIgCi0gICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIxMXB0Ij4KLSAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgIDwvZm86bGlzdC1ibG9jaz4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gbGkgKGxpc3QgaXRlbSkgaW4gdW5vcmRlcmVkIGxpc3QgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoID0idWwvbGkiPgotICAgIDxmbzpsaXN0LWl0ZW0+Ci0gICAgICA8Zm86bGlzdC1pdGVtLWxhYmVsPgotICAgICAgICA8Zm86YmxvY2s+PGZvOmlubGluZSBmb250LWZhbWlseT0iU3ltYm9sIj4mIzE4Mzs8L2ZvOmlubGluZT48L2ZvOmJsb2NrPgotICAgICAgPC9mbzpsaXN0LWl0ZW0tbGFiZWw+Ci0gICAgICA8Zm86bGlzdC1pdGVtLWJvZHk+Ci0gICAgICAgIDxmbzpibG9jayBzcGFjZS1hZnRlci5vcHRpbXVtPSI0cHQiCi0gICAgICAgICAgICAgIHRleHQtYWxpZ249InN0YXJ0IgotICAgICAgICAgICAgICBwYWRkaW5nLXRvcD0iM3B0Ij4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IAotICAgICAgIDwvZm86YmxvY2s+Ci0gICAgICA8L2ZvOmxpc3QtaXRlbS1ib2R5PgotICAgIDwvZm86bGlzdC1pdGVtPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gbGkgKGxpc3QgaXRlbSkgaW4gb3JkZXJlZCBsaXN0IC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaCA9Im9sL2xpIj4KLSAgICA8Zm86bGlzdC1pdGVtPgotICAgICAgPGZvOmxpc3QtaXRlbS1sYWJlbD4KLSAgICAgICAgPGZvOmJsb2NrPgotICAgICAgICAgIDx4c2w6bnVtYmVyIGxldmVsPSJtdWx0aXBsZSIgY291bnQ9ImxpIiBmb3JtYXQ9IjEiLz4pCi0gICAgICAgIDwvZm86YmxvY2s+Ci0gICAgICA8L2ZvOmxpc3QtaXRlbS1sYWJlbD4KLSAgICAgIDxmbzpsaXN0LWl0ZW0tYm9keT4KLSAgICAgICAgPGZvOmJsb2NrIHNwYWNlLWFmdGVyLm9wdGltdW09IjRwdCIKLSAgICAgICAgICAgICAgdGV4dC1hbGlnbj0ic3RhcnQiCi0gICAgICAgICAgICAgIHBhZGRpbmctdG9wPSIzcHQiPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4gCi0gICAgICAgPC9mbzpibG9jaz4KLSAgICAgIDwvZm86bGlzdC1pdGVtLWJvZHk+Ci0gICAgPC9mbzpsaXN0LWl0ZW0+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSB0ZW1wb3Jhcnkga2x1ZGdlIGZvciBkZWZpbml0aW9uIGxpc3QgZ2xvc3Mgd2l0aCBsYWJlbC1pdGVtIHBhaXJzICkgLS0+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Imdsb3NzIj4KLSAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotPC94c2w6dGVtcGxhdGU+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJsYWJlbCI+Ci0gICA8Zm86YmxvY2sgZm9udC1zaXplPSIxMXB0IiAKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiAKLSAgICAgICAgICAgIGxpbmUtaGVpZ2h0PSIxM3B0IgotICAgICAgICAgICAgc3BhY2UtYWZ0ZXIub3B0aW11bT0iM3B0IgotICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm9wdGltdW09IjZwdCIKLSAgICAgICAgICAgIHRleHQtYWxpZ249InN0YXJ0Ij4KLSAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLSAgIDwvZm86YmxvY2s+Ci08L3hzbDp0ZW1wbGF0ZT4gCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJpdGVtIj4KLSAgIDxmbzpibG9jayBmb250LXNpemU9IjExcHQiIAotICAgICAgICAgICAgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIAotICAgICAgICAgICAgbGluZS1oZWlnaHQ9IjEzcHQiCi0gICAgICAgICAgICBzcGFjZS1hZnRlci5vcHRpbXVtPSI2cHQiCi0gICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iMHB0IgotICAgICAgICAgICAgbWFyZ2luLWxlZnQ9IjI0cHQiCi0gICAgICAgICAgICB0ZXh0LWFsaWduPSJzdGFydCI+Ci0gICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgPGZvOmJsb2NrPjwvZm86YmxvY2s+IAotICAgPC9mbzpibG9jaz4KLTwveHNsOnRlbXBsYXRlPiAKLQotPCEtLSBlbmQgYm9keSAtLT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3hkb2NzL3htbC1zaXRlLXN0eWxlLnRhci5neiBiL3hkb2NzL3htbC1zaXRlLXN0eWxlLnRhci5negpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjNGRlMy4uMDAwMDAwMAotLS0gYS94ZG9jcy94bWwtc2l0ZS1zdHlsZS50YXIuZ3oKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCg==